From 8997c1309b1ac0bd64c76fae58e50d1f71665809 Mon Sep 17 00:00:00 2001 From: Snowyegret <79635537+snowyegret23@users.noreply.github.com> Date: Sun, 1 Oct 2023 04:40:38 +0900 Subject: [PATCH 001/403] Update README.md (#202) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 18149b6b..e58e9131 100644 --- a/README.md +++ b/README.md @@ -208,7 +208,7 @@ from PIL import Image for obj in env.objects: if obj.type.name == "Texture2D": # export texture - data = image.read() + data = obj.read() data.image.save(path) # edit texture fp = os.path.join(replace_dir, data.name) From 5d98090a792e36178d23464ed2ae4d768f005252 Mon Sep 17 00:00:00 2001 From: Elioty Date: Sat, 30 Sep 2023 21:43:36 +0200 Subject: [PATCH 002/403] Update SpriteHelper.py: issue #206 (#207) Fixing the flip transpose operation when extracting a packed sprite image from a texture. --- UnityPy/export/SpriteHelper.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/UnityPy/export/SpriteHelper.py b/UnityPy/export/SpriteHelper.py index ffcbf98e..9602e9a3 100644 --- a/UnityPy/export/SpriteHelper.py +++ b/UnityPy/export/SpriteHelper.py @@ -66,10 +66,10 @@ def get_image_from_sprite(m_Sprite) -> Image.Image: if settings_raw.packed == 1: rotation = settings_raw.packingRotation if rotation == SpritePackingRotation.kSPRFlipHorizontal: - sprite_image = sprite_image.transpose(Image.FLIP_TOP_BOTTOM) + sprite_image = sprite_image.transpose(Image.FLIP_LEFT_RIGHT) # spriteImage = RotateFlip(RotateFlipType.RotateNoneFlipX) elif rotation == SpritePackingRotation.kSPRFlipVertical: - sprite_image = sprite_image.transpose(Image.FLIP_LEFT_RIGHT) + sprite_image = sprite_image.transpose(Image.FLIP_TOP_BOTTOM) # spriteImage.RotateFlip(RotateFlipType.RotateNoneFlipY) elif rotation == SpritePackingRotation.kSPRRotate180: sprite_image = sprite_image.transpose(Image.ROTATE_180) From 657a0f66cef5f44785c1f92827406eead0e4c6f2 Mon Sep 17 00:00:00 2001 From: Nattsu39 Date: Sun, 1 Oct 2023 03:44:57 +0800 Subject: [PATCH 003/403] fix: TypeError: 'ABCMeta' object is not subscriptable (#209) collections.abc.Callable cannot be used for type hints when python<3.9 --- UnityPy/tools/extractor.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/UnityPy/tools/extractor.py b/UnityPy/tools/extractor.py index 86f6d98b..4d9ecb6b 100644 --- a/UnityPy/tools/extractor.py +++ b/UnityPy/tools/extractor.py @@ -16,9 +16,8 @@ GameObject, ) from UnityPy.enums.ClassIDType import ClassIDType -from typing import Union, List, Dict +from typing import Union, List, Dict, Callable from pathlib import Path -from collections.abc import Callable def export_obj( From 52ff053be88e00ee5c8aee8c0b78c121087e29e6 Mon Sep 17 00:00:00 2001 From: TWY <24794414+t-wy@users.noreply.github.com> Date: Sun, 1 Oct 2023 04:50:17 +0900 Subject: [PATCH 004/403] Fix ContainerHelper for .container retrieval (#200) This commit is aware of the difference between _container and container_ in old versions of SerializedFile.py for compatibility. --- UnityPy/files/ObjectReader.py | 6 +----- UnityPy/files/SerializedFile.py | 2 +- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/UnityPy/files/ObjectReader.py b/UnityPy/files/ObjectReader.py index 2ebee31a..a0894340 100644 --- a/UnityPy/files/ObjectReader.py +++ b/UnityPy/files/ObjectReader.py @@ -139,11 +139,7 @@ def set_raw_data(self, data): @property def container(self): - return ( - self.assets_file._container[self.path_id] - if self.path_id in self.assets_file._container - else None - ) + return self.assets_file._container.path_dict.get(self.path_id) @property def Position(self): diff --git a/UnityPy/files/SerializedFile.py b/UnityPy/files/SerializedFile.py index 8f039f47..d26efbba 100644 --- a/UnityPy/files/SerializedFile.py +++ b/UnityPy/files/SerializedFile.py @@ -653,7 +653,7 @@ def __init__(self, container) -> None: self.container = container # support for getitem self.container_dict = {key: value.asset for key, value in container} - self.path_dict = {value.asset.path_id: value.asset for key, value in container} + self.path_dict = {value.asset.path_id: key for key, value in container} def items(self): return ((key, value.asset) for key, value in self.container) From 910b7c173338c0a7ee037e11e3ceb81514e7147c Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Sat, 30 Sep 2023 22:36:18 +0200 Subject: [PATCH 005/403] WebFile - accept and pass kwargs to super fixes #205 --- UnityPy/files/WebFile.py | 46 +++++++++++++++++++--------------------- 1 file changed, 22 insertions(+), 24 deletions(-) diff --git a/UnityPy/files/WebFile.py b/UnityPy/files/WebFile.py index d0d48386..da7946aa 100644 --- a/UnityPy/files/WebFile.py +++ b/UnityPy/files/WebFile.py @@ -9,16 +9,15 @@ class WebFile(File.File): files -- list of all files in the WebFile """ - - def __init__(self, reader: EndianBinaryReader, parent: File, name=None): - """Constructor Method - """ - super().__init__(parent=parent, name=name) - + + def __init__(self, reader: EndianBinaryReader, parent: File, name=None, **kwargs): + """Constructor Method""" + super().__init__(parent=parent, name=name, **kwargs) + # check compression magic = reader.read_bytes(2) reader.Position = 0 - + if magic == CompressionHelper.GZIP_MAGIC: self.packer = "gzip" data = CompressionHelper.decompress_gzip(reader.bytes) @@ -34,16 +33,16 @@ def __init__(self, reader: EndianBinaryReader, parent: File, name=None): else: self.packer = "none" reader.endian = "<" - + # signature check signature = reader.read_string_to_null() if signature != "UnityWebData1.0": return self.signature = signature - + # read header -> contains file headers head_length = reader.read_int() - + files = [] while reader.Position < head_length: offset = reader.read_int() @@ -51,32 +50,32 @@ def __init__(self, reader: EndianBinaryReader, parent: File, name=None): path_length = reader.read_int() name = bytes(reader.read_bytes(path_length)).decode("utf-8") files.append(File.DirectoryInfo(name, offset, length)) - + self.read_files(reader, files) - + def save( - self, - files: dict = None, - packer: str = "none", - signature: str = "UnityWebData1.0", + self, + files: dict = None, + packer: str = "none", + signature: str = "UnityWebData1.0", ) -> bytes: # solve defaults if not files: files = self.files if not packer: packer = self.packer - + # get raw data files = { name: f.bytes if isinstance(f, EndianBinaryReader) else f.save() for name, f in files.items() } - + # create writer writer = EndianBinaryWriter(endian="<") # signature writer.write_string_to_null(signature) - + # data offset offset = sum( [ @@ -88,9 +87,9 @@ def save( 4, # offset int ] ) - + writer.write_int(offset) - + # 1. file headers for name, data in files.items(): # offset @@ -103,15 +102,14 @@ def save( enc_path = name.encode("utf-8") writer.write_int(len(enc_path)) writer.write(enc_path) - + # 2. file data for data in files.values(): writer.write(data) - + if packer == "gzip": return CompressionHelper.compress_gzip(writer.bytes) elif packer == "brotli": return CompressionHelper.compress_brotli(writer.bytes) else: return writer.bytes - From 63bfcc35bd47b8e165fdb66031e170d19a779c2d Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Sat, 30 Sep 2023 22:59:02 +0200 Subject: [PATCH 006/403] Texture2D - 2022 fix fixes #203 --- UnityPy/classes/Texture2D.py | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/UnityPy/classes/Texture2D.py b/UnityPy/classes/Texture2D.py index 705aeaba..b9b4a882 100644 --- a/UnityPy/classes/Texture2D.py +++ b/UnityPy/classes/Texture2D.py @@ -130,20 +130,23 @@ def __init__(self, reader): self.m_Width = reader.read_int() self.m_Height = reader.read_int() self.m_CompleteImageSize = reader.read_int() - if version >= (2020,): # 2020.1 and up + if version >= (2020, 1): # 2020.1 and up self.m_MipsStripped = reader.read_int() self.m_TextureFormat = TextureFormat(reader.read_int()) - if version[:2] < (5, 2): # 5.2 down + if version < (5, 2): # 3.4.0 - 5.1.5f1 self.m_MipMap = reader.read_boolean() - else: + else: # 5.2.0f2 and up self.m_MipCount = reader.read_int() if version >= (2, 6): # 2.6 and up self.m_IsReadable = reader.read_boolean() # 2.6 and up if version >= (2020,): # 2020.1 and up self.m_IsPreProcessed = reader.read_boolean() - if version >= (2019, 3): # 2019.3 and up + if (2019, 3) <= version < (2022, 2, 0): # 2019.3.0f6 - 2022.2.0a18 self.m_IgnoreMasterTextureLimit = reader.read_boolean() + if version >= (2022, 2, 0): # 2022.2.0f1 and up + self.m_IgnoreMipmapLimit = reader.read_boolean() + self.m_MipmapLimitGroupName = reader.read_aligned_string() if (3,) <= version[:2] <= (5, 4): # 3.0 - 5.4 self.m_ReadAllowed = reader.read_boolean() if version >= (2018, 2): # 2018.2 and up @@ -188,7 +191,7 @@ def save(self, writer: EndianBinaryWriter = None): if version >= (2020,): # 2020.1 and up writer.write_int(self.m_MipsStripped) writer.write_int(self.m_TextureFormat.value) - if version[:2] < (5, 2): # 5.2 down + if version < (5, 2): # 5.2 down writer.write_boolean(self.m_MipMap) else: writer.write_int(self.m_MipCount) @@ -197,8 +200,11 @@ def save(self, writer: EndianBinaryWriter = None): writer.write_boolean(self.m_IsReadable) # 2.6 and up if version >= (2020,): # 2020.1 and up writer.write_boolean(self.m_IsPreProcessed) - if version >= (2019, 3): # 2019.3 and up + if (2019, 3) <= version < (2022, 2, 0): # 2019.3.0f6 - 2022.2.0a18 writer.write_boolean(self.m_IgnoreMasterTextureLimit) + if version >= (2022, 2, 0): # 2022.2.0f1 and up + writer.write_boolean(self.m_IgnoreMipmapLimit) + writer.write_aligned_string(self.m_MipmapLimitGroupName) if (3,) <= version[:2] <= (5, 4): # 3.0 - 5.4 writer.write_boolean(self.m_ReadAllowed) # 3.0 - 5.4 if version >= (2018, 2): # 2018.2 and up From 289ec62f3387797c28fa38e58c9ff1dd266e2a65 Mon Sep 17 00:00:00 2001 From: "Clarence \"Sparr\" Risher" Date: Sat, 30 Sep 2023 17:15:50 -0400 Subject: [PATCH 007/403] Handle relative and case insensitive file paths (#191) * Handle relative and case insensitive file paths * improve find_sensitive_path (no recursion) * environment.py - look in self.path instead of cwd * fix files.File import error for type hinting * Update environment.py --------- Co-authored-by: Rudolf Kolbe --- UnityPy/environment.py | 12 +++++++++++- UnityPy/helpers/ImportHelper.py | 22 ++++++++++++++++++++-- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/UnityPy/environment.py b/UnityPy/environment.py index bfec2fbc..ff790d33 100644 --- a/UnityPy/environment.py +++ b/UnityPy/environment.py @@ -107,6 +107,16 @@ def load_file( file = b"".join(file) else: name = file + if not os.path.exists(file): + # relative paths are in the asset directory, not the cwd + if not os.path.isabs(file): + file = os.path.join(self.path, file) + # Unity paths are case insensitive, so we need to find "Resources/Foo.asset" when the record says "resources/foo.asset" + if not os.path.exists(file): + file = ImportHelper.find_sensitive_path(self.path, file) + # nonexistent files might be packaging errors or references to Unity's global Library/ + if file is None: + return file = self.fs.open(file, "rb") typ, reader = ImportHelper.check_file_type(file) @@ -155,7 +165,7 @@ def save(self, pack="none", out_path="output"): for fname, fitem in self.files.items(): if getattr(fitem, "is_changed", False): with open( - self.fs.sep.join([out_path, ntpath.basename(f)]), "wb" + self.fs.sep.join([out_path, ntpath.basename(fname)]), "wb" ) as out: out.write(fitem.save(packer=pack)) diff --git a/UnityPy/helpers/ImportHelper.py b/UnityPy/helpers/ImportHelper.py index 53599ef5..e931daae 100644 --- a/UnityPy/helpers/ImportHelper.py +++ b/UnityPy/helpers/ImportHelper.py @@ -1,4 +1,5 @@ -import os +from __future__ import annotations +import os from typing import Union, List from .CompressionHelper import BROTLI_MAGIC, GZIP_MAGIC from ..enums import FileType @@ -127,7 +128,7 @@ def parse_file( name: str, typ: FileType = None, is_dependency=False, -): +) -> Union[files.File, EndianBinaryReader]: if typ is None: typ, _ = check_file_type(reader) if typ == FileType.AssetsFile and not name.endswith( @@ -141,3 +142,20 @@ def parse_file( else: f = reader return f + + +def find_sensitive_path(dir: str, insensitive_path: str) -> Union[str, None]: + parts = os.path.split(insensitive_path.strip(os.path.sep)) + + senstive_path = dir + for part in parts: + part_lower = part.lower() + part = next( + (name for name in os.listdir(senstive_path) if name.lower() == part_lower), + None, + ) + if next is None: + return None + senstive_path = os.path.join(senstive_path, part) + + return senstive_path From 37fef64adeccbf2fd1a491427f6b841b005b90ea Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Sat, 30 Sep 2023 23:17:26 +0200 Subject: [PATCH 008/403] 1.10.3 version bump --- UnityPy/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UnityPy/__init__.py b/UnityPy/__init__.py index 5355553f..30b0ea25 100644 --- a/UnityPy/__init__.py +++ b/UnityPy/__init__.py @@ -1,4 +1,4 @@ -__version__ = "1.10.2" +__version__ = "1.10.3" from .environment import Environment from .helpers.ArchiveStorageManager import set_assetbundle_decrypt_key From 903bdad2069886383cb5c06f166822d1425d13c5 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Sat, 14 Oct 2023 20:51:25 +0200 Subject: [PATCH 009/403] ImportHelper - fix find_sensite_path (#212) * ImportHelper - fix find_sensite_path * bump version fixes #212 --- UnityPy/__init__.py | 2 +- UnityPy/helpers/ImportHelper.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/UnityPy/__init__.py b/UnityPy/__init__.py index 30b0ea25..e9ab419f 100644 --- a/UnityPy/__init__.py +++ b/UnityPy/__init__.py @@ -1,4 +1,4 @@ -__version__ = "1.10.3" +__version__ = "1.10.4" from .environment import Environment from .helpers.ArchiveStorageManager import set_assetbundle_decrypt_key diff --git a/UnityPy/helpers/ImportHelper.py b/UnityPy/helpers/ImportHelper.py index e931daae..089a0a03 100644 --- a/UnityPy/helpers/ImportHelper.py +++ b/UnityPy/helpers/ImportHelper.py @@ -154,7 +154,7 @@ def find_sensitive_path(dir: str, insensitive_path: str) -> Union[str, None]: (name for name in os.listdir(senstive_path) if name.lower() == part_lower), None, ) - if next is None: + if part is None: return None senstive_path = os.path.join(senstive_path, part) From b7f7a28fa8f766bcfd8027a6871587af8afbdd62 Mon Sep 17 00:00:00 2001 From: Nattsu39 Date: Mon, 16 Oct 2023 03:50:59 +0800 Subject: [PATCH 010/403] fix: Read SpriteBone correctly (#213) Should read rotaion in SpriteBone via read_quaternion. (Only tested in version 2020.3.38) --- UnityPy/classes/Sprite.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/UnityPy/classes/Sprite.py b/UnityPy/classes/Sprite.py index 3f65e84e..291b2e73 100644 --- a/UnityPy/classes/Sprite.py +++ b/UnityPy/classes/Sprite.py @@ -55,7 +55,7 @@ def __init__(self, reader): 2020, 3, ): - self.m_Bones = [SpriteBone() for _ in range(m_BonesSize)] + self.m_Bones = [SpriteBone(self.reader) for _ in range(m_BonesSize)] else: self.m_Bones = [reader.read_vector2_array() for _ in range(m_BonesSize)] @@ -242,13 +242,13 @@ class SpriteBone: def __init__(self, reader: EndianBinaryReader) -> None: self.name = reader.read_aligned_string() self.position = reader.read_vector3() - self.rotation = reader.read_vector3() + self.rotation = reader.read_quaternion() self.length = reader.read_float() self.parentId = reader.read_int() def save(self, writer: EndianBinaryWriter): writer.write_aligned_string(self.name) writer.write_vector3(self.position) - writer.write_vector3(self.rotation) + writer.write_quaternion(self.rotation) writer.write_float(self.length) writer.write_int(self.parentId) From 99c240c88c4d35113dc7674a08904a9b21cf980c Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Sun, 15 Oct 2023 21:51:39 +0200 Subject: [PATCH 011/403] bump version to 1.10.5 --- UnityPy/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UnityPy/__init__.py b/UnityPy/__init__.py index e9ab419f..7ee0297f 100644 --- a/UnityPy/__init__.py +++ b/UnityPy/__init__.py @@ -1,4 +1,4 @@ -__version__ = "1.10.4" +__version__ = "1.10.5" from .environment import Environment from .helpers.ArchiveStorageManager import set_assetbundle_decrypt_key From f3113147cf8febe90c1d684304bde795fa9f0252 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Sun, 22 Oct 2023 15:17:34 +0200 Subject: [PATCH 012/403] 1.10.6 - fix Sprite bones for good fixes #182 --- UnityPy/__init__.py | 2 +- UnityPy/classes/Sprite.py | 33 +++++++++++++++------------ UnityPy/streams/EndianBinaryReader.py | 8 +++++++ UnityPy/streams/EndianBinaryWriter.py | 6 +++++ 4 files changed, 33 insertions(+), 16 deletions(-) diff --git a/UnityPy/__init__.py b/UnityPy/__init__.py index 7ee0297f..78dc97a3 100644 --- a/UnityPy/__init__.py +++ b/UnityPy/__init__.py @@ -1,4 +1,4 @@ -__version__ = "1.10.5" +__version__ = "1.10.6" from .environment import Environment from .helpers.ArchiveStorageManager import set_assetbundle_decrypt_key diff --git a/UnityPy/classes/Sprite.py b/UnityPy/classes/Sprite.py index 291b2e73..a5a1761b 100644 --- a/UnityPy/classes/Sprite.py +++ b/UnityPy/classes/Sprite.py @@ -50,14 +50,7 @@ def __init__(self, reader): if version >= (2018,): # 2018 and up m_BonesSize = reader.read_int() - # TODO: might occur in earlier 2020 versions - 2020.3.13 reported - if version >= ( - 2020, - 3, - ): - self.m_Bones = [SpriteBone(self.reader) for _ in range(m_BonesSize)] - else: - self.m_Bones = [reader.read_vector2_array() for _ in range(m_BonesSize)] + self.m_Bones = [SpriteBone(self.reader) for _ in range(m_BonesSize)] def save(self, writer: EndianBinaryWriter = None): if writer is None: @@ -96,12 +89,8 @@ def save(self, writer: EndianBinaryWriter = None): if version >= (2018,): # 2018 and up writer.write_int(len(self.m_Bones)) - if version >= (2020, 3): - for bone in self.m_Bones: - bone.save(writer) - else: - for bone in self.m_Bones: - writer.write_vector2_array(bone) + for bone in self.m_Bones: + bone.save(writer, version) self.set_raw_data(writer.bytes) @@ -241,14 +230,28 @@ class SpriteBone: def __init__(self, reader: EndianBinaryReader) -> None: self.name = reader.read_aligned_string() + + if reader.version >= (2021,): + self.guid = reader.read_aligned_string() + self.position = reader.read_vector3() self.rotation = reader.read_quaternion() self.length = reader.read_float() self.parentId = reader.read_int() - def save(self, writer: EndianBinaryWriter): + if reader.version >= (2021,): + self.color = reader.read_color_uint() + + def save(self, writer: EndianBinaryWriter, version): writer.write_aligned_string(self.name) + + if version >= (2021,): + writer.write_aligned_string(self.guid) + writer.write_vector3(self.position) writer.write_quaternion(self.rotation) writer.write_float(self.length) writer.write_int(self.parentId) + + if version >= (2021,): + writer.write_color_uint(self.color) diff --git a/UnityPy/streams/EndianBinaryReader.py b/UnityPy/streams/EndianBinaryReader.py index 0fe7f7db..2435846c 100644 --- a/UnityPy/streams/EndianBinaryReader.py +++ b/UnityPy/streams/EndianBinaryReader.py @@ -178,6 +178,14 @@ def read_rectangle_f(self) -> Rectangle: self.read_float(), self.read_float(), self.read_float(), self.read_float() ) + def read_color_uint(self): + r = self.read_u_byte() + g = self.read_u_byte() + b = self.read_u_byte() + a = self.read_u_byte() + + return Color(r / 255.0, g / 255.0, b / 255.0, a / 255.0) + def read_color4(self) -> Color: return Color( self.read_float(), self.read_float(), self.read_float(), self.read_float() diff --git a/UnityPy/streams/EndianBinaryWriter.py b/UnityPy/streams/EndianBinaryWriter.py index d9861401..6bb92969 100644 --- a/UnityPy/streams/EndianBinaryWriter.py +++ b/UnityPy/streams/EndianBinaryWriter.py @@ -123,6 +123,12 @@ def write_rectangle_f(self, value: Rectangle): self.write_float(value.width) self.write_float(value.height) + def write_color_uint(self, value: Color): + self.write_u_byte(value.R * 255) + self.write_u_byte(value.G * 255) + self.write_u_byte(value.B * 255) + self.write_u_byte(value.A * 255) + def write_color4(self, value: Color): self.write_float(value.R) self.write_float(value.G) From 3aa6906cf5f852e0d22d8b5f72ba4765dfaa4fc4 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Thu, 2 Nov 2023 12:23:05 +0100 Subject: [PATCH 013/403] Add Python 3.12 wheel --- .github/workflows/python-package.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/python-package.yml b/.github/workflows/python-package.yml index f5130430..99cbc89b 100644 --- a/.github/workflows/python-package.yml +++ b/.github/workflows/python-package.yml @@ -38,7 +38,7 @@ jobs: fail-fast: false matrix: os: ["ubuntu-20.04", "windows-2019", "macos-11"] - cp: ["cp37", "cp38", "cp39", "cp310", "cp311"] + cp: ["cp37", "cp38", "cp39", "cp310", "cp311", "cp312"] timeout-minutes: 30 From cc87a54da0d8e15687b52cfd443dba396cf4c9dc Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Thu, 2 Nov 2023 12:26:38 +0100 Subject: [PATCH 014/403] Update cibuildwheel version --- .github/workflows/python-package.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/python-package.yml b/.github/workflows/python-package.yml index 99cbc89b..f7c0ac12 100644 --- a/.github/workflows/python-package.yml +++ b/.github/workflows/python-package.yml @@ -65,7 +65,7 @@ jobs: platforms: all - name: Build wheels - uses: pypa/cibuildwheel@v2.11.2 + uses: pypa/cibuildwheel@v2.16.2 env: CIBW_ARCHS_LINUX: auto aarch64 CIBW_ARCHS_MACOS: x86_64 arm64 universal2 From 664e9b52e1c85a8248822fac899bf9889b91f93f Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Thu, 21 Dec 2023 21:47:29 +0100 Subject: [PATCH 015/403] EndianBinaryReader - fix string reading regex --- UnityPy/streams/EndianBinaryReader.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UnityPy/streams/EndianBinaryReader.py b/UnityPy/streams/EndianBinaryReader.py index 2435846c..4fea9761 100644 --- a/UnityPy/streams/EndianBinaryReader.py +++ b/UnityPy/streams/EndianBinaryReader.py @@ -4,7 +4,7 @@ from typing import List, Union from io import BytesIO, BufferedIOBase, IOBase, BufferedReader -reNot0 = re.compile(b"(.*?)\x00") +reNot0 = re.compile(b"(.*?)\x00", re.S) SYS_ENDIAN = "<" if sys.byteorder == "little" else ">" From 83d736cfc5ad417480787a09ba91060d8a514cfa Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Thu, 21 Dec 2023 21:53:28 +0100 Subject: [PATCH 016/403] SerializedFile - hotfix version parsing for custom versions --- UnityPy/files/SerializedFile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UnityPy/files/SerializedFile.py b/UnityPy/files/SerializedFile.py index d26efbba..050c22d3 100644 --- a/UnityPy/files/SerializedFile.py +++ b/UnityPy/files/SerializedFile.py @@ -328,7 +328,7 @@ def set_version(self, string_version): build_type = re.findall(r"([^\d.])", string_version) self.build_type = BuildType(build_type[0] if build_type else "") version_split = re.split(r"\D", string_version) - self.version = tuple(int(x) for x in version_split) + self.version = tuple(int(x) for x in version_split[:4]) def read_type_tree(self): type_tree = [] From 46e05c557cf695cb63d23bc8f1ba24328729f112 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Thu, 21 Dec 2023 21:55:01 +0100 Subject: [PATCH 017/403] Tpk - UnityVersion - set default values for fromList --- UnityPy/helpers/Tpk.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UnityPy/helpers/Tpk.py b/UnityPy/helpers/Tpk.py index 84b65d42..f523a794 100644 --- a/UnityPy/helpers/Tpk.py +++ b/UnityPy/helpers/Tpk.py @@ -292,7 +292,7 @@ def fromString(version: str) -> UnityVersion: return UnityVersion(version.split(".")) @staticmethod - def fromList(major: int, minor: int, patch: int, build: int) -> UnityVersion: + def fromList(major: int = 0, minor: int = 0, patch: int = 0, build: int = 0) -> UnityVersion: return UnityVersion(major << 48 | minor << 32 | patch << 16 | build) @property From cb7ae496abbb9dff67967a8b9691928863335787 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Thu, 21 Dec 2023 22:08:56 +0100 Subject: [PATCH 018/403] AudioClipConverter - hotfix pyfmodex --- UnityPy/export/AudioClipConverter.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/UnityPy/export/AudioClipConverter.py b/UnityPy/export/AudioClipConverter.py index 16d2a02d..85ee15bd 100644 --- a/UnityPy/export/AudioClipConverter.py +++ b/UnityPy/export/AudioClipConverter.py @@ -73,6 +73,9 @@ def cdll_hook(name, *args, **kwargs): return CDLL(name, *args, **kwargs) ctypes.CDLL = cdll_hook + + # hotfix ctypes for pyfmodex for non windows + ctypes.windll = getattr(ctypes, "windll", None) import pyfmodex ctypes.CDLL = CDLL From 50fcaf1ee64773fcc63ed10c95b98480e478fdbf Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Thu, 21 Dec 2023 22:36:20 +0100 Subject: [PATCH 019/403] AudioClipConverter - pyfmodex 0.7.1 --- UnityPy/export/AudioClipConverter.py | 29 ++++++++-------------------- 1 file changed, 8 insertions(+), 21 deletions(-) diff --git a/UnityPy/export/AudioClipConverter.py b/UnityPy/export/AudioClipConverter.py index 85ee15bd..8709fe28 100644 --- a/UnityPy/export/AudioClipConverter.py +++ b/UnityPy/export/AudioClipConverter.py @@ -57,28 +57,15 @@ def import_pyfmodex(): # prepare the environment for pyfmodex if system == "Windows": - # register fmod.dll, so that windll.fmod in pyfmodex can find it - ctypes.WinDLL(os.path.join(LIB_PATH, "fmod.dll")) - import pyfmodex + os.environ["PYFMODEX_DLL_PATH"] = os.path.join(LIB_PATH, "fmod.dll") else: - # It's a bit more complicated on Linux and Mac - # as CDLL doesn't cache the loaded libraries. - # So our only option is to hook into the ctypes loader - # and add the path to the library there. - CDLL = ctypes.CDLL - - def cdll_hook(name, *args, **kwargs): - if name.startswith("libfmod"): - name = os.path.join(LIB_PATH, name) - return CDLL(name, *args, **kwargs) - - ctypes.CDLL = cdll_hook - + ext = "dylib" if system == "Darwin" else "so" + os.environ["PYFMODEX_DLL_PATH"] = os.path.join(LIB_PATH, f"libfmod.{ext}") + # hotfix ctypes for pyfmodex for non windows ctypes.windll = getattr(ctypes, "windll", None) - import pyfmodex - - ctypes.CDLL = CDLL + + import pyfmodex def extract_audioclip_samples(audio) -> dict: @@ -112,7 +99,7 @@ def dump_samples(clip): sound = system.create_sound( bytes(clip.m_AudioData), pyfmodex.flags.MODE.OPENMEMORY, - exinfo=pyfmodex.system.CREATESOUNDEXINFO( + exinfo=pyfmodex.structure_declarations.CREATESOUNDEXINFO( length=clip.m_Size, numchannels=clip.m_Channels, defaultfrequency=clip.m_Frequency, @@ -137,7 +124,7 @@ def dump_samples(clip): def subsound_to_wav(subsound): # get sound settings - length = subsound.get_length(0x00000004) # TIMEUNIT.PCMBYTES + length = subsound.get_length(pyfmodex.enums.TIMEUNIT.PCMBYTES) channels = subsound.format.channels bits = subsound.format.bits sample_rate = int(subsound.default_frequency) From eff8260047bda1a0dbb243c07337f6e1f7ff0110 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Thu, 21 Dec 2023 22:37:04 +0100 Subject: [PATCH 020/403] pyproject.toml - enforce pyfmodex >= 0.7.1 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 6e27f3a5..d38992e2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -46,7 +46,7 @@ dependencies = [ # raw typetree dumping "tabulate", # audio extraction - "pyfmodex", + "pyfmodex >= 0.7.1", # filesystem handling "fsspec", ] From 765b84cb7f57ca8e4c23b3c32a60538668d48c9f Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Thu, 21 Dec 2023 22:45:40 +0100 Subject: [PATCH 021/403] bump version to 1.10.7 --- UnityPy/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UnityPy/__init__.py b/UnityPy/__init__.py index 78dc97a3..fe5f4fc5 100644 --- a/UnityPy/__init__.py +++ b/UnityPy/__init__.py @@ -1,4 +1,4 @@ -__version__ = "1.10.6" +__version__ = "1.10.7" from .environment import Environment from .helpers.ArchiveStorageManager import set_assetbundle_decrypt_key From 1890ff3f12f6ec1968baf1a684adc4d7e8866a42 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Thu, 21 Dec 2023 22:50:03 +0100 Subject: [PATCH 022/403] python-package.yml - restrict release job to master branch --- .github/workflows/python-package.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/python-package.yml b/.github/workflows/python-package.yml index f7c0ac12..531590a7 100644 --- a/.github/workflows/python-package.yml +++ b/.github/workflows/python-package.yml @@ -33,6 +33,7 @@ jobs: pytest -v -s release: + if: github.ref == 'refs/heads/master' needs: [test] strategy: fail-fast: false From c07f26fee62e2a79fe9cd635277fd8e282adc005 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Thu, 21 Dec 2023 23:02:05 +0100 Subject: [PATCH 023/403] replace python-package.yml with test.yml -> publish.yml (#218) --- .github/workflows/publish.yml | 74 +++++++++++++++++++++ .github/workflows/python-package.yml | 97 ---------------------------- .github/workflows/test.yml | 40 ++++++++++++ 3 files changed, 114 insertions(+), 97 deletions(-) create mode 100644 .github/workflows/publish.yml delete mode 100644 .github/workflows/python-package.yml create mode 100644 .github/workflows/test.yml diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml new file mode 100644 index 00000000..9dea9b06 --- /dev/null +++ b/.github/workflows/publish.yml @@ -0,0 +1,74 @@ +name: Publish + +on: + workflow_run: + workflows: Test + branches: master + types: completed + +jobs: + publish: + # `if` required because a workflow run is triggered regardless of + # the result of the previous workflow (see the documentation page) + if: ${{ github.event.workflow_run.conclusion == 'success' }} + needs: [test] + strategy: + fail-fast: false + matrix: + os: ["ubuntu-20.04", "windows-2019", "macos-11"] + cp: ["cp37", "cp38", "cp39", "cp310", "cp311", "cp312"] + + + name: ${{ matrix.os }} - ${{ matrix.cp }} + runs-on: ${{ matrix.os }} + timeout-minutes: 60 + + steps: + - uses: actions/checkout@v3 + + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: "3.10" + + - name: Install dependencies + run: | + python -m pip install --upgrade pip wheel setuptools + python -m pip install --upgrade twine build + + - name: Set up QEMU + if: runner.os == 'Linux' + uses: docker/setup-qemu-action@v2 + with: + platforms: all + + - name: Build wheels + uses: pypa/cibuildwheel@v2.16.2 + env: + CIBW_ARCHS_LINUX: auto aarch64 + CIBW_ARCHS_MACOS: x86_64 arm64 universal2 + CIBW_BUILD: | + ${{ matrix.cp }}-manylinux_x86_64 + ${{ matrix.cp }}-manylinux_i686 + ${{ matrix.cp }}-manylinux_aarch64 + ${{ matrix.cp }}-win_amd64 + ${{ matrix.cp }}-win32 + ${{ matrix.cp }}-macosx_x86_64 + ${{ matrix.cp }}-macosx_arm64 + ${{ matrix.cp }}-macosx_universal2 + # Disabled repair wheel since the fmob lib is not compatible + CIBW_REPAIR_WHEEL_COMMAND: "" + CIBW_REPAIR_WHEEL_COMMAND_LINUX: 'mv {wheel} {dest_dir}/"$(basename {wheel} | sed "s/-linux_/-manylinux_2_17_/")"' + CIBW_TEST_REQUIRES: pytest + CIBW_TEST_COMMAND: pytest -v -s {package}/tests + CIBW_TEST_SKIP: "*-macosx_arm64 *-macosx_universal2:arm64 *-manylinux_i686 *-win32" + + - name: Publish to PyPI + if: success() && github.event_name == 'push' && env.TWINE_PASSWORD != '' && github.ref == 'refs/heads/master' + env: + TWINE_USERNAME: __token__ + TWINE_PASSWORD: ${{ secrets.PYPI_TOKEN }} + run: | + twine upload ./wheelhouse/*.whl --skip-existing + python -m build --sdist + twine upload ./dist/*.tar.gz --skip-existing diff --git a/.github/workflows/python-package.yml b/.github/workflows/python-package.yml deleted file mode 100644 index 531590a7..00000000 --- a/.github/workflows/python-package.yml +++ /dev/null @@ -1,97 +0,0 @@ -name: Test and Publish - -on: [push, pull_request, workflow_dispatch] - -jobs: - test: - strategy: - fail-fast: false - matrix: - os: ["ubuntu-latest", "macOS-latest", "windows-latest"] - - runs-on: ${{ matrix.os }} - name: ${{ matrix.os }} - - steps: - - uses: actions/checkout@v3 - - - name: Set up Python - uses: actions/setup-python@v4 - with: - python-version: "3.7" - - - name: Install Dependencies - run: | - python -m pip install --upgrade pip pytest - - - name: Install UnityPy - run: | - pip install . - - - name: Run tests - run: | - pytest -v -s - - release: - if: github.ref == 'refs/heads/master' - needs: [test] - strategy: - fail-fast: false - matrix: - os: ["ubuntu-20.04", "windows-2019", "macos-11"] - cp: ["cp37", "cp38", "cp39", "cp310", "cp311", "cp312"] - - timeout-minutes: 30 - - runs-on: ${{ matrix.os }} - name: ${{ matrix.os }} - ${{ matrix.cp }} - - steps: - - uses: actions/checkout@v3 - - - name: Set up Python - uses: actions/setup-python@v4 - with: - python-version: "3.10" - - - name: Install dependencies - run: | - python -m pip install --upgrade pip wheel setuptools - python -m pip install --upgrade twine build - - - name: Set up QEMU - if: runner.os == 'Linux' - uses: docker/setup-qemu-action@v2 - with: - platforms: all - - - name: Build wheels - uses: pypa/cibuildwheel@v2.16.2 - env: - CIBW_ARCHS_LINUX: auto aarch64 - CIBW_ARCHS_MACOS: x86_64 arm64 universal2 - CIBW_BUILD: | - ${{ matrix.cp }}-manylinux_x86_64 - ${{ matrix.cp }}-manylinux_i686 - ${{ matrix.cp }}-manylinux_aarch64 - ${{ matrix.cp }}-win_amd64 - ${{ matrix.cp }}-win32 - ${{ matrix.cp }}-macosx_x86_64 - ${{ matrix.cp }}-macosx_arm64 - ${{ matrix.cp }}-macosx_universal2 - # Disabled repair wheel since the fmob lib is not compatible - CIBW_REPAIR_WHEEL_COMMAND: "" - CIBW_REPAIR_WHEEL_COMMAND_LINUX: 'mv {wheel} {dest_dir}/"$(basename {wheel} | sed "s/-linux_/-manylinux_2_17_/")"' - CIBW_TEST_REQUIRES: pytest - CIBW_TEST_COMMAND: pytest -v -s {package}/tests - CIBW_TEST_SKIP: "*-macosx_arm64 *-macosx_universal2:arm64 *-manylinux_i686 *-win32" - - - name: Publish to PyPI - if: success() && github.event_name == 'push' && env.TWINE_PASSWORD != '' && github.ref == 'refs/heads/master' - env: - TWINE_USERNAME: __token__ - TWINE_PASSWORD: ${{ secrets.PYPI_TOKEN }} - run: | - twine upload ./wheelhouse/*.whl --skip-existing - python -m build --sdist - twine upload ./dist/*.tar.gz --skip-existing diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 00000000..c56b5df2 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,40 @@ +name: Test + +on: + push: + branches: + - master + pull_request: {} + + + +jobs: + test: + strategy: + fail-fast: false + matrix: + os: ["ubuntu-latest", "macOS-latest", "windows-latest"] + + runs-on: ${{ matrix.os }} + name: ${{ matrix.os }} + timeout-minutes: 10 + + steps: + - uses: actions/checkout@v3 + + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: "3.7" + + - name: Install Dependencies + run: | + python -m pip install --upgrade pip pytest + + - name: Install UnityPy + run: | + pip install . + + - name: Run tests + run: | + pytest -v -s From 1704fac694892e9f7fd4bac6bfe8661e8e315c09 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Thu, 21 Dec 2023 23:03:52 +0100 Subject: [PATCH 024/403] Fix publish.yml --- .github/workflows/publish.yml | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 9dea9b06..34fa3371 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -11,7 +11,6 @@ jobs: # `if` required because a workflow run is triggered regardless of # the result of the previous workflow (see the documentation page) if: ${{ github.event.workflow_run.conclusion == 'success' }} - needs: [test] strategy: fail-fast: false matrix: @@ -48,15 +47,15 @@ jobs: CIBW_ARCHS_LINUX: auto aarch64 CIBW_ARCHS_MACOS: x86_64 arm64 universal2 CIBW_BUILD: | - ${{ matrix.cp }}-manylinux_x86_64 - ${{ matrix.cp }}-manylinux_i686 - ${{ matrix.cp }}-manylinux_aarch64 - ${{ matrix.cp }}-win_amd64 - ${{ matrix.cp }}-win32 - ${{ matrix.cp }}-macosx_x86_64 - ${{ matrix.cp }}-macosx_arm64 - ${{ matrix.cp }}-macosx_universal2 - # Disabled repair wheel since the fmob lib is not compatible + ${{ matrix.cp }}-manylinux_x86_64 + ${{ matrix.cp }}-manylinux_i686 + ${{ matrix.cp }}-manylinux_aarch64 + ${{ matrix.cp }}-win_amd64 + ${{ matrix.cp }}-win32 + ${{ matrix.cp }}-macosx_x86_64 + ${{ matrix.cp }}-macosx_arm64 + ${{ matrix.cp }}-macosx_universal2 + # Disabled repair wheel since the fmob lib is not compatible CIBW_REPAIR_WHEEL_COMMAND: "" CIBW_REPAIR_WHEEL_COMMAND_LINUX: 'mv {wheel} {dest_dir}/"$(basename {wheel} | sed "s/-linux_/-manylinux_2_17_/")"' CIBW_TEST_REQUIRES: pytest From c731cb0d7685851ac18ec695c757308bd2f92c99 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Tue, 2 Jan 2024 00:47:44 +0100 Subject: [PATCH 025/403] Switch Swizzle Support (#219) * Add integer texture formats, rg decoder and rgb9e5float decoder * Create SwitchDeswizzle.py * Texture2DDecoder - fix typo * implement Switch Texture Deswizzling * hotfix TextureSwizzler.c --- UnityPy/enums/TextureFormat.py | 19 ++- UnityPy/export/Texture2DConverter.py | 81 +++++++++++- UnityPy/helpers/TextureSwizzler.py | 180 +++++++++++++++++++++++++++ UnityPyBoost/TextureSwizzler.c | 96 ++++++++++++++ UnityPyBoost/TextureSwizzler.h | 5 + UnityPyBoost/UnityPyBoost.c | 9 +- UnityPyBoost/setup.py | 8 +- 7 files changed, 382 insertions(+), 16 deletions(-) create mode 100644 UnityPy/helpers/TextureSwizzler.py create mode 100644 UnityPyBoost/TextureSwizzler.c create mode 100644 UnityPyBoost/TextureSwizzler.h diff --git a/UnityPy/enums/TextureFormat.py b/UnityPy/enums/TextureFormat.py index 1e3085ae..68d5dc99 100644 --- a/UnityPy/enums/TextureFormat.py +++ b/UnityPy/enums/TextureFormat.py @@ -7,9 +7,12 @@ class TextureFormat(IntEnum): RGB24 = 3 RGBA32 = 4 ARGB32 = 5 + ARGBFloat = 6 RGB565 = 7 + BGR24 = 8 R16 = 9 DXT1 = 10 + DXT3 = 11 DXT5 = 12 RGBA4444 = 13 BGRA32 = 14 @@ -21,10 +24,11 @@ class TextureFormat(IntEnum): RGBAFloat = 20 YUY2 = 21 RGB9e5Float = 22 - BC4 = 26 - BC5 = 27 + RGBFloat = 23 BC6H = 24 BC7 = 25 + BC4 = 26 + BC5 = 27 DXT1Crunched = 28 DXT5Crunched = 29 PVRTC_RGB2 = 30 @@ -65,3 +69,14 @@ class TextureFormat(IntEnum): ASTC_HDR_8x8 = 69 ASTC_HDR_10x10 = 70 ASTC_HDR_12x12 = 71 + RG32 = 72 + RGB48 = 73 + RGBA64 = 74 + R8_SIGNED = 75 + RG16_SIGNED = 76 + RGB24_SIGNED = 77 + RGBA32_SIGNED = 78 + R16_SIGNED = 79 + RG32_SIGNED = 80 + RGB48_SIGNED = 81 + RGBA64_SIGNED = 82 diff --git a/UnityPy/export/Texture2DConverter.py b/UnityPy/export/Texture2DConverter.py index b757a3c7..331cc23d 100644 --- a/UnityPy/export/Texture2DConverter.py +++ b/UnityPy/export/Texture2DConverter.py @@ -5,6 +5,7 @@ from io import BytesIO import struct from ..enums import TextureFormat, BuildTarget +from ..helpers import TextureSwizzler TF = TextureFormat @@ -133,8 +134,20 @@ def get_image_from_texture2d(texture_2d, flip=True) -> Image.Image: image_data, texture_2d.m_Width, texture_2d.m_Height, *selection[1:] ) + if texture_2d.platform == BuildTarget.Switch and getattr( + texture_2d, "m_PlatformBlob", None + ): + gobsPerBlock = TextureSwizzler.get_switch_gobs_per_block( + texture_2d.m_PlatformBlob + ) + blockSize = TextureSwizzler.TEXTUREFORMAT_BLOCK_SIZE_MAP[ + texture_2d.m_TextureFormat + ] + img = TextureSwizzler.switch_deswizzle(img, blockSize, gobsPerBlock) + if img and flip: return img.transpose(Image.FLIP_TOP_BOTTOM) + return img @@ -241,6 +254,48 @@ def half( return pillow(image_data, width, height, mode, codec, args, swap) +RG_PADDING_MAP = { + "RGE": 16, + "RGF": 32, + "RG;16": 16, + "RG;16s": 16, + "RG;8s": 8, +} + + +def rg( + image_data: bytes, width: int, height: int, mode: str, codec: str, args +) -> Image.Image: + # convert rg to rgb by adding in zeroes + padding_size = RG_PADDING_MAP[codec] + stream = BytesIO(image_data) + padding = bytes(padding_size) + rgb_data = b"".join( + stream.read(padding_size * 2) + padding + for _ in range(image_data / (2 * padding_size)) + ) + if codec == "RGE": + return half(rgb_data, width, height, mode, "RGB", args) + else: + return pillow(rgb_data, width, height, mode, codec.replace("RG", "RGB"), args) + + +def rgb9e5float(image_data: bytes, width: int, height: int): + rgb = bytearray(width * height * 3) + for i, (n,) in enumerate(struct.iter_unpack("> 27 & 0x1F + scalef = 2 ** (scale - 24) + scaleb = scalef * 255.0 + b = (n >> 18 & 0x1FF) * scaleb + g = (n >> 9 & 0x1FF) * scaleb + r = (n & 0x1FF) * scaleb + + offset = i * 3 + rgb[offset : offset + 3] = [r, g, b] + + return Image.frombytes("RGB", (width, height), rgb, "raw", "RGB") + + CONV_TABLE = { # FORMAT FUNC #ARGS..... #----------------------- -------- -------- ------------ ----------------- ------------ ---------- @@ -249,32 +304,35 @@ def half( ( TF.RGB24, pillow, "RGB", "raw", "RGB" ), ( TF.RGBA32, pillow, "RGBA", "raw", "RGBA" ), ( TF.ARGB32, pillow, "RGBA", "raw", "ARGB" ), +( TF.ARGBFloat, pillow, "RGBA", "raw", "RGBAF", (2,1,0,3) ), ( TF.RGB565, pillow, "RGB", "raw", "BGR;16" ), +( TF.BGR24, pillow, "RGB", "raw", "BGR" ), ( TF.R8, pillow, "RGB", "raw", "R" ), ( TF.R16, pillow, "RGB", "raw", "R;16" ), -( TF.RG16, ), +( TF.RG16, rg, "RGB", "raw", "RG" ), ( TF.DXT1, pillow, "RGBA", "bcn", 1 ), +( TF.DXT3, pillow, "RGBA", "bcn", 2 ), ( TF.DXT5, pillow, "RGBA", "bcn", 3 ), ( TF.RGBA4444, pillow, "RGBA", "raw", 'RGBA;4B', (3,2,1,0) ), ( TF.BGRA32, pillow, "RGBA", "raw", "BGRA" ), ( TF.RHalf, half, "R", "raw", "R" ), -( TF.RGHalf, ), +( TF.RGHalf, rg, "RGB", "raw", "RGE" ), ( TF.RGBAHalf, half, "RGB", "raw", "RGB" ), ( TF.RFloat, pillow, "RGB", "raw", "RF" ), -( TF.RGFloat, ), +( TF.RGFloat, rg, "RGB", "raw", "RGF" ), ( TF.RGBAFloat, pillow, "RGBA", "raw", "RGBAF" ), ( TF.YUY2, ), -( TF.RGB9e5Float, ), +( TF.RGB9e5Float, rgb9e5float ), ( TF.BC4, pillow, "L", "bcn", 4 ), ( TF.BC5, pillow, "RGB", "bcn", 5 ), ( TF.BC6H, pillow, "RGBA", "bcn", 6 ), ( TF.BC7, pillow, "RGBA", "bcn", 7 ), ( TF.DXT1Crunched, pillow, "RGBA", "bcn", 1 ), ( TF.DXT5Crunched, pillow, "RGBA", "bcn", 3 ), -( TF.PVRTC_RGB2, pvrtc, True ), +( TF.PVRTC_RGB2, pvrtc, True ), ( TF.PVRTC_RGBA2, pvrtc, True ), ( TF.PVRTC_RGB4, pvrtc, False ), -( TF.PVRTC_RGBA4, pvrtc, False ), +( TF.PVRTC_RGBA4, pvrtc, False ), ( TF.ETC_RGB4, etc, (1,) ), ( TF.ATC_RGB4, atc, False ), ( TF.ATC_RGBA8, atc, True ), @@ -307,6 +365,17 @@ def half( ( TF.ASTC_HDR_8x8, astc, (8,8) ), ( TF.ASTC_HDR_10x10, astc, (10,10) ), ( TF.ASTC_HDR_12x12, astc, (12,12) ), +( TF.RG32, rg, "RGB", "raw", "RG;16" ), +( TF.RGB48, pillow, "RGB", "raw", "RGB;16" ), +( TF.RGBA64, pillow, "RGBA", "raw", "RGBA;16" ), +( TF.R8_SIGNED, pillow, "R", "raw", "R;8s" ), +( TF.RG16_SIGNED, rg, "RGB", "raw", "RG;8s" ), +( TF.RGB24_SIGNED, pillow, "RGB", "raw", "RGB;8s" ), +( TF.RGBA32_SIGNED, pillow, "RGBA", "raw", "RGBA;8s" ), +( TF.R16_SIGNED, pillow, "R", "raw", "R;16s" ), +( TF.RG32_SIGNED, rg, "RGB", "raw", "RG;16s" ), +( TF.RGB48_SIGNED, pillow, "RGB", "raw", "RGB;16s" ), +( TF.RGBA64_SIGNED, pillow, "RGBA", "raw", "RGBA;16s" ), } # format conv_table to a dict diff --git a/UnityPy/helpers/TextureSwizzler.py b/UnityPy/helpers/TextureSwizzler.py new file mode 100644 index 00000000..9f9dafaf --- /dev/null +++ b/UnityPy/helpers/TextureSwizzler.py @@ -0,0 +1,180 @@ +# based on https://github.com/nesrak1/UABEA/blob/master/TexturePlugin/Texture2DSwitchDeswizzler.cs +from typing import Dict, Tuple + +from PIL import Image + +from ..enums import TextureFormat + +try: + from ..UnityPyBoost import switch_deswizzle as switch_deswizzle_c +except: + switch_deswizzle_c = None + + +GOB_X_BLOCK_COUNT = 4 +GOB_Y_BLOCK_COUNT = 8 +BLOCKS_IN_GOB = GOB_X_BLOCK_COUNT * GOB_Y_BLOCK_COUNT + + +def ceil_divide(a: int, b: int) -> int: + return (a + b - 1) / b + + +def switch_deswizzle( + src_image: Image.Image, block_size: Tuple[int, int], gobs_per_block: int +) -> Image.Image: + src_bytes = src_image.tobytes() + pixel_width = len(src_image.mode) + + if switch_deswizzle_c: + dst_bytes = switch_deswizzle_c( + src_bytes, pixel_width, *src_image.size, *block_size, gobs_per_block + ) + return Image.frombytes(src_image.mode, src_image.size, dst_bytes) + + dst_bytes = bytearray(len(src_bytes)) + + width, height = src_image.size + block_width, block_height = block_size + block_count_x = width // block_width + block_count_y = height // block_height + + gob_count_x = block_count_x // GOB_X_BLOCK_COUNT + gob_count_y = block_count_y // GOB_Y_BLOCK_COUNT + + src_x = 0 + src_y = 0 + + block_pixel_width = block_width * pixel_width + row_pixel_width = width * pixel_width + data_size = len(src_bytes) + + GOB_MAP = [ + (((l >> 3) & 0b10) | ((l >> 1) & 0b1), ((l >> 1) & 0b110) | (l & 0b1)) + for l in range(BLOCKS_IN_GOB) + ] + + for y in range(gob_count_y): + for x in range(gob_count_x): + for k in range(gobs_per_block): + for gob_x, gob_y in GOB_MAP: + gob_dst_x = x * GOB_X_BLOCK_COUNT + gob_x + gob_dst_y = (y * gobs_per_block + k) * GOB_Y_BLOCK_COUNT + gob_y + + src_offset = ( + src_x * block_width + (src_y * block_height) * width + ) * pixel_width + dst_offset = ( + gob_dst_x * block_width + (gob_dst_y * block_height) * width + ) * pixel_width + + for by in range(block_height): + if dst_offset > data_size or src_offset > data_size: + break + copy_width = block_pixel_width + if (data_size - src_offset) < block_pixel_width: + copy_width = data_size - src_offset + elif (data_size - dst_offset) < block_pixel_width: + copy_width = data_size - dst_offset + + dst_bytes[dst_offset : dst_offset + copy_width] = src_bytes[ + src_offset : src_offset + copy_width + ] + src_offset += row_pixel_width + dst_offset += row_pixel_width + + src_x += 1 + if src_x >= block_count_x: + src_x = 0 + src_y += 1 + + return Image.frombytes(src_image.mode, src_image.size, dst_bytes) + + +def switch_swizzle( + src_image: Image.Image, block_size: Tuple[int, int], gobs_per_block: int +) -> Image.Image: + dstImage = Image.new(src_image.mode, src_image.size) + + blockCountX, blockCountY = map(ceil_divide, zip(src_image.size, block_size)) + + gob_count_x = blockCountX / GOB_X_BLOCK_COUNT + gob_count_y = blockCountY / GOB_Y_BLOCK_COUNT + + dstX = 0 + dstY = 0 + + for i in range(gob_count_y): + for j in range(gob_count_x): + for k in range(gobs_per_block): + for l in range(BLOCKS_IN_GOB): + # todo: use table for speedy boi + gobX = ((l >> 3) & 0b10) | ((l >> 1) & 0b1) + gobY = ((l >> 1) & 0b110) | (l & 0b1) + gobSrcX = j * GOB_X_BLOCK_COUNT + gobX + gobSrcY = (i * gobs_per_block + k) * GOB_Y_BLOCK_COUNT + gobY + CopyBlock( + src_image, dstImage, gobSrcX, gobSrcY, dstX, dstY, *block_size + ) + + dstX += 1 + if dstX >= blockCountX: + dstX = 0 + dstY += 1 + + return dstImage + + +# this should be the amount of pixels that can fit 16 bytes +TEXTUREFORMAT_BLOCK_SIZE_MAP: Dict[TextureFormat, Tuple[int, int]] = { + TextureFormat.Alpha8: [16, 1], # 1 byte per pixel + TextureFormat.ARGB4444: [8, 1], # 2 bytes per pixel + TextureFormat.RGBA32: [4, 1], # 4 bytes per pixel + TextureFormat.ARGB32: [4, 1], # 4 bytes per pixel + TextureFormat.ARGBFloat: [1, 1], # 16 bytes per pixel (?) + TextureFormat.RGB565: [8, 1], # 2 bytes per pixel + TextureFormat.R16: [8, 1], # 2 bytes per pixel + TextureFormat.DXT1: [8, 4], # 8 bytes per 4x4=16 pixels + TextureFormat.DXT5: [4, 4], # 16 bytes per 4x4=16 pixels + TextureFormat.RGBA4444: [8, 1], # 2 bytes per pixel + TextureFormat.BGRA32: [4, 1], # 4 bytes per pixel + TextureFormat.BC6H: [4, 4], # 16 bytes per 4x4=16 pixels + TextureFormat.BC7: [4, 4], # 16 bytes per 4x4=16 pixels + TextureFormat.BC4: [8, 4], # 8 bytes per 4x4=16 pixels + TextureFormat.BC5: [4, 4], # 16 bytes per 4x4=16 pixels + TextureFormat.ASTC_RGB_4x4: [4, 4], # 16 bytes per 4x4=16 pixels + TextureFormat.ASTC_RGB_5x5: [5, 5], # 16 bytes per 5x5=25 pixels + TextureFormat.ASTC_RGB_6x6: [6, 6], # 16 bytes per 6x6=36 pixels + TextureFormat.ASTC_RGB_8x8: [8, 8], # 16 bytes per 8x8=64 pixels + TextureFormat.ASTC_RGB_10x10: [10, 10], # 16 bytes per 10x10=100 pixels + TextureFormat.ASTC_RGB_12x12: [12, 12], # 16 bytes per 12x12=144 pixels + TextureFormat.ASTC_RGBA_4x4: [4, 4], # 16 bytes per 4x4=16 pixels + TextureFormat.ASTC_RGBA_5x5: [5, 5], # 16 bytes per 5x5=25 pixels + TextureFormat.ASTC_RGBA_6x6: [6, 6], # 16 bytes per 6x6=36 pixels + TextureFormat.ASTC_RGBA_8x8: [8, 8], # 16 bytes per 8x8=64 pixels + TextureFormat.ASTC_RGBA_10x10: [10, 10], # 16 bytes per 10x10=100 pixels + TextureFormat.ASTC_RGBA_12x12: [12, 12], # 16 bytes per 12x12=144 pixels + TextureFormat.RG16: [8, 1], # 2 bytes per pixel + TextureFormat.R8: [16, 1], # 1 byte per pixel +} + + +def get_padded_texture_size( + width: int, height: int, block_width: int, block_height: int, gobs_per_block: int +): + width = ( + ceil_divide(width, block_width * GOB_X_BLOCK_COUNT) + * block_width + * GOB_X_BLOCK_COUNT + ) + height = ( + ceil_divide(height, block_height * GOB_Y_BLOCK_COUNT * gobs_per_block) + * block_height + * GOB_Y_BLOCK_COUNT + * gobs_per_block + ) + return width, height + + +def get_switch_gobs_per_block(platform_blob: bytes) -> int: + return 1 << int.from_bytes(platform_blob[8:12], "little") diff --git a/UnityPyBoost/TextureSwizzler.c b/UnityPyBoost/TextureSwizzler.c new file mode 100644 index 00000000..c75656fc --- /dev/null +++ b/UnityPyBoost/TextureSwizzler.c @@ -0,0 +1,96 @@ +#include + +const uint32_t GOB_X_BLOCK_COUNT = 4; +const uint32_t GOB_Y_BLOCK_COUNT = 8; +const uint32_t BLOCKS_IN_GOB = 32; // GOB_X_BLOCK_COUNT * GOB_Y_BLOCK_COUNT; + +const uint32_t GOB_MAP[32][2] = {{0, 0}, {0, 1}, {1, 0}, {1, 1}, {0, 2}, {0, 3}, {1, 2}, {1, 3}, {0, 4}, {0, 5}, {1, 4}, {1, 5}, {0, 6}, {0, 7}, {1, 6}, {1, 7}, {2, 0}, {2, 1}, {3, 0}, {3, 1}, {2, 2}, {2, 3}, {3, 2}, {3, 3}, {2, 4}, {2, 5}, {3, 4}, {3, 5}, {2, 6}, {2, 7}, {3, 6}, {3, 7}}; + +PyObject *switch_deswizzle(PyObject *self, PyObject *args) +{ + // define vars + uint8_t *src_data; + Py_ssize_t data_size; + uint32_t pixel_width; + + uint32_t width; + uint32_t height; + uint32_t block_width; + uint32_t block_height; + uint32_t gobs_per_block; + + if (!PyArg_ParseTuple(args, "y#IIIIII", &src_data, &data_size, &pixel_width, &width, &height, &block_width, &block_height, &gobs_per_block)) + return NULL; + + char *dst_data = (char *)malloc(data_size); + + uint32_t block_count_x = width / block_width; + uint32_t block_count_y = height / block_height; + + uint32_t gob_count_x = block_count_x / GOB_X_BLOCK_COUNT; + uint32_t gob_count_y = block_count_y / GOB_Y_BLOCK_COUNT; + + uint32_t src_x = 0; + uint32_t src_y = 0; + + uint32_t block_pixel_width = block_width * pixel_width; + uint32_t row_pixel_width = width * pixel_width; + + uint32_t gob_x, gob_y, gob_dst_x, gob_dst_y, src_offset, dst_offset; + + for (uint32_t y = 0; y < gob_count_y; y++) + { + for (uint32_t x = 0; x < gob_count_x; x++) + { + for (uint32_t k = 0; k < gobs_per_block; k++) + { + for (uint32_t l = 0; l < BLOCKS_IN_GOB; l++) + { + // printf("%d/%d, %d/%d, %d/%d, %d/%d\n", y, gob_count_y, x, gob_count_x, k, gobs_per_block, l, gobs_per_block); + gob_x = ((l >> 3) & 0b10) | ((l >> 1) & 0b1); + gob_y = ((l >> 1) & 0b110) | (l & 0b1); + gob_dst_x = x * GOB_X_BLOCK_COUNT + gob_x; + gob_dst_y = (y * gobs_per_block + k) * GOB_Y_BLOCK_COUNT + gob_y; + + src_offset = (src_x * block_width + (src_y * block_height) * width) * pixel_width; + dst_offset = (gob_dst_x * block_width + (gob_dst_y * block_height) * width) * pixel_width; + + for (uint32_t by = 0; by < block_height; by++) + { + if ((dst_offset > data_size) || (src_offset > data_size)) + { + break; + } + uint32_t copy_width = block_pixel_width; + if ((data_size - src_offset) < block_pixel_width) + { + copy_width = data_size - src_offset; + } + else if ((data_size - dst_offset) < block_pixel_width) + { + copy_width = data_size - dst_offset; + } + + memcpy( + dst_data + dst_offset, + src_data + src_offset, + copy_width); + src_offset += row_pixel_width; + dst_offset += row_pixel_width; + } + src_x += 1; + if (src_x >= block_count_x) + { + src_x = 0; + src_y += 1; + } + } + } + } + } + + PyObject *ret = PyBytes_FromStringAndSize(dst_data, data_size); + free(dst_data); + + return ret; +} diff --git a/UnityPyBoost/TextureSwizzler.h b/UnityPyBoost/TextureSwizzler.h new file mode 100644 index 00000000..0df0aa7c --- /dev/null +++ b/UnityPyBoost/TextureSwizzler.h @@ -0,0 +1,5 @@ +#define PY_SSIZE_T_CLEAN +#pragma once +#include + +PyObject *switch_deswizzle(PyObject *self, PyObject *args); diff --git a/UnityPyBoost/UnityPyBoost.c b/UnityPyBoost/UnityPyBoost.c index 48745d35..84ced41f 100644 --- a/UnityPyBoost/UnityPyBoost.c +++ b/UnityPyBoost/UnityPyBoost.c @@ -3,6 +3,7 @@ #include #include "AnimationClip.h" #include "Mesh.h" +#include "TextureSwizzler.h" #include "TypeTreeHelper.h" /* Mesh.py */ @@ -23,7 +24,11 @@ static struct PyMethodDef method_table[] = { {"read_typetree", (PyCFunction)read_typetree, METH_VARARGS, - "replacement for TypeTreeHelper.read_typetree"}, + "replacement for TypeTreeHelper.read_typetree"}, + {"switch_deswizzle", + (PyCFunction)switch_deswizzle, + METH_VARARGS, + "replacement for TextureSwizzler.switch_deswizzle"}, {NULL, NULL, 0, @@ -46,7 +51,7 @@ static PyModuleDef UnityPyBoost_module = { // The module init function PyMODINIT_FUNC PyInit_UnityPyBoost(void) { - PyObject* module = PyModule_Create(&UnityPyBoost_module); + PyObject *module = PyModule_Create(&UnityPyBoost_module); add_typetreenode_to_module(module); return module; } \ No newline at end of file diff --git a/UnityPyBoost/setup.py b/UnityPyBoost/setup.py index fc197c1f..d5986429 100644 --- a/UnityPyBoost/setup.py +++ b/UnityPyBoost/setup.py @@ -1,6 +1,5 @@ -from setuptools import setup, Extension, find_packages +from setuptools import setup, Extension import os -import platform local = os.path.dirname(os.path.abspath(__file__)) @@ -12,10 +11,7 @@ ext_modules=[ Extension( "UnityPyBoost", - [ - os.path.join(local, f) - for f in os.listdir(local) if f.endswith(".c") - ], + [os.path.join(local, f) for f in os.listdir(local) if f.endswith(".c")], language="c", include_dirs=[local], ) From afd24bacd1a610b7b1b3cf91fb4a24ac4f15ba87 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Tue, 2 Jan 2024 10:43:44 +0100 Subject: [PATCH 026/403] add direct m4a export (#221) --- UnityPy/export/AudioClipConverter.py | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/UnityPy/export/AudioClipConverter.py b/UnityPy/export/AudioClipConverter.py index 8709fe28..56a50ca4 100644 --- a/UnityPy/export/AudioClipConverter.py +++ b/UnityPy/export/AudioClipConverter.py @@ -61,10 +61,10 @@ def import_pyfmodex(): else: ext = "dylib" if system == "Darwin" else "so" os.environ["PYFMODEX_DLL_PATH"] = os.path.join(LIB_PATH, f"libfmod.{ext}") - + # hotfix ctypes for pyfmodex for non windows ctypes.windll = getattr(ctypes, "windll", None) - + import pyfmodex @@ -79,11 +79,13 @@ def extract_audioclip_samples(audio) -> dict: # eg. StreamedResource not available return {} - magic = memoryview(audio.m_AudioData)[:4] - if magic == b"OggS": - return {"%s.ogg" % audio.name: audio.m_AudioData} - elif magic == b"RIFF": - return {"%s.wav" % audio.name: audio.m_AudioData} + magic = memoryview(audio.m_AudioData)[:8] + if magic[:4] == b"OggS": + return {f"{audio.m_Name}.ogg": audio.m_AudioData} + elif magic[:4] == b"RIFF": + return {f"{audio.m_Name}.wav": audio.m_AudioData} + elif magic[4:8] == b"ftyp": + return {f"{audio.m_Name}.m4a": audio.m_AudioData} return dump_samples(audio) From 04bf4694145684b7092c9c6cfa139d8565a60686 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Tue, 2 Jan 2024 10:58:48 +0100 Subject: [PATCH 027/403] 1.10.8 bump --- UnityPy/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UnityPy/__init__.py b/UnityPy/__init__.py index fe5f4fc5..ba0b3fd3 100644 --- a/UnityPy/__init__.py +++ b/UnityPy/__init__.py @@ -1,4 +1,4 @@ -__version__ = "1.10.7" +__version__ = "1.10.8" from .environment import Environment from .helpers.ArchiveStorageManager import set_assetbundle_decrypt_key From ae96f2c903fa7935dd8c8c0e2421bacb47e0e802 Mon Sep 17 00:00:00 2001 From: ysmu Date: Mon, 8 Jan 2024 01:36:52 -0800 Subject: [PATCH 028/403] support reading of AnimationEvent from AnimationClip (#222) --- UnityPy/classes/AnimationClip.py | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/UnityPy/classes/AnimationClip.py b/UnityPy/classes/AnimationClip.py index 9176ab1d..531f87f3 100644 --- a/UnityPy/classes/AnimationClip.py +++ b/UnityPy/classes/AnimationClip.py @@ -552,6 +552,21 @@ def FindBinding(self, index): return None +class AnimationEvent: + def __init__(self, reader): + version = reader.version + self.time = reader.read_float() + self.functionName = reader.read_aligned_string() + self.data = reader.read_aligned_string() + self.objectReferenceParameter = PPtr(reader) + self.floatParameter = reader.read_float() + + if version > (3, ): + self.intParameter = reader.read_int() + + self.messageOptions = reader.read_int() + + class AnimationType(IntEnum): kLegacy = (1,) kGeneric = (2,) @@ -609,11 +624,12 @@ def __init__(self, reader): if version >= (4, 3): # 4.3 and up self.m_ClipBindingConstant = AnimationClipBindingConstant(reader) + if version >= (2018, 3): + self.m_HasGenericRootTransform = reader.read_boolean() + self.m_HasMotionFloatCurves = reader.read_boolean() + reader.align_stream() -# m_HasGenericRootTransform 2018.3 -# m_HasMotionFloatCurves 2018.3 -# numEvents = reader.read_int() -# self.m_Events = [ -# AnimationEvent(reader) -# for _ in range(numEvents) -# ] + numEvents = self.reader.read_int() + self.m_Events = [AnimationEvent(self.reader) for _ in range(numEvents)] + if version >= (2017, ): + reader.align_stream() From a9031e97483dd0a1c209c1036c81a5f86d9800a1 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Mon, 8 Jan 2024 10:37:36 +0100 Subject: [PATCH 029/403] bump to 1.10.9 --- UnityPy/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UnityPy/__init__.py b/UnityPy/__init__.py index ba0b3fd3..ff472109 100644 --- a/UnityPy/__init__.py +++ b/UnityPy/__init__.py @@ -1,4 +1,4 @@ -__version__ = "1.10.8" +__version__ = "1.10.9" from .environment import Environment from .helpers.ArchiveStorageManager import set_assetbundle_decrypt_key From 2bd6efbeab99da604cd1e8b3a684eda7bcbd58bb Mon Sep 17 00:00:00 2001 From: "Clarence \"Sparr\" Risher" Date: Mon, 8 Jan 2024 04:47:58 -0500 Subject: [PATCH 030/403] Handle case where shader platforms and shader programs counts don't match. Hacky. (#137) --- UnityPy/export/ShaderConverter.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/UnityPy/export/ShaderConverter.py b/UnityPy/export/ShaderConverter.py index fb59ba61..5ac6b4b9 100644 --- a/UnityPy/export/ShaderConverter.py +++ b/UnityPy/export/ShaderConverter.py @@ -35,6 +35,9 @@ def ConvertSerializedShader(m_Shader): platformNumber = len(m_Shader.platforms) for i in range(platformNumber): + if i >= len(m_Shader.compressedLengths) or i >= len(m_Shader.decompressedLengths): + # m_Shader.platforms shouldn't be longer than m_shader.[de]compressedLengths, but it is + break compressedSize = m_Shader.compressedLengths[i] decompressedSize = m_Shader.decompressedLengths[i] @@ -145,6 +148,10 @@ def ConvertSerializedSubPrograms(m_SubPrograms, platforms, shaderPrograms): subPrograms = list(_programList) isTier = len(subPrograms) > 1 for i in range(len(platforms)): + if i >= len(shaderPrograms): + # platforms shouldn't be longer than shaderPrograms, but it is + break + platform = platforms[i] if CheckGpuProgramUsable(platform, programKey): From 5b055bd2ee43c16ae87cc7cd3ef7dbbd484a8a34 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Mon, 8 Jan 2024 10:48:30 +0100 Subject: [PATCH 031/403] bump to 1.10.10 --- UnityPy/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UnityPy/__init__.py b/UnityPy/__init__.py index ff472109..94f8644a 100644 --- a/UnityPy/__init__.py +++ b/UnityPy/__init__.py @@ -1,4 +1,4 @@ -__version__ = "1.10.9" +__version__ = "1.10.10" from .environment import Environment from .helpers.ArchiveStorageManager import set_assetbundle_decrypt_key From 4a379303e28d932c3d9dd2c8b7b895ca6d68e1dc Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Mon, 8 Jan 2024 21:18:45 +0100 Subject: [PATCH 032/403] README.md - Windows dev --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index e58e9131..90d8646a 100644 --- a/README.md +++ b/README.md @@ -63,6 +63,9 @@ python -m pip install . #### Windows Visual C++ Redistributable is required for the brotli dependency. +In case a new(ish) Python version is used, it can happen that the C-dependencies of UnityPy might not be precompiled for this version. +In such cases the user either has to report this as issue or follow the steps of [this issue](https://github.com/K0lb3/UnityPy/issues/223) to compile it oneself. +Another option for the user is downgrading Python to the latest version supported by UnityPy. For this see the python version badge at the top of the README. ### Crash without warning/error From 006883bf735e8d9f32032a433226db9610414426 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Mon, 8 Jan 2024 21:19:13 +0100 Subject: [PATCH 033/403] pyproject.toml - update supported python versions --- pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/pyproject.toml b/pyproject.toml index d38992e2..19b9a6a6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -31,6 +31,7 @@ classifiers = [ "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: Games/Entertainment", "Topic :: Multimedia :: Graphics", From a090a09d81e835bd18bbf6b7e73b6fce22ad461d Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Sat, 13 Jan 2024 16:28:49 +0100 Subject: [PATCH 034/403] 1.10.11 - add texture2darray support (#225) * 1.10.11 - add texture2darray support resolves #224 * fix get_image_from_texture2d * return images for Texture2DArray instead of image * Update README.md * fix get_image_from_texture2d --- README.md | 23 +++ UnityPy/__init__.py | 2 +- UnityPy/classes/Texture2DArray.py | 84 ++++++++ UnityPy/classes/__init__.py | 1 + UnityPy/enums/GraphicsFormat.py | 277 +++++++++++++++++++++++++++ UnityPy/enums/__init__.py | 1 + UnityPy/export/Texture2DConverter.py | 212 ++++++++++---------- 7 files changed, 499 insertions(+), 101 deletions(-) create mode 100644 UnityPy/classes/Texture2DArray.py create mode 100644 UnityPy/enums/GraphicsFormat.py diff --git a/README.md b/README.md index 90d8646a..854177ce 100644 --- a/README.md +++ b/README.md @@ -368,6 +368,29 @@ if mesh_renderer.m_GameObject: mesh_renderer.export(export_dir) ``` +### [Texture2DArray](UnityPy/classes/Texture2DArray.py) + +WARNING - not well tested + +- `.name` +- `.image` converts the texture2darray into a `PIL.Image` +- `.m_Width` - texture width (int) +- `.m_Height` - texture height (int) + +**Export** + +```python +import os +from PIL import Image +for obj in env.objects: + if obj.type.name == "Texture2DArray": + # export texture + data = obj.read() + for i, image in enumerate(data.images): + image.save(os.path.join(path, f"{data.m_Name}_{i}.png")) + # editing isn't supported yet! +``` + ## Custom-Filesystem UnityPy uses [fsspec](https://github.com/fsspec/filesystem_spec) under the hood to manage all filesystem interactions. diff --git a/UnityPy/__init__.py b/UnityPy/__init__.py index 94f8644a..901a6a0e 100644 --- a/UnityPy/__init__.py +++ b/UnityPy/__init__.py @@ -1,4 +1,4 @@ -__version__ = "1.10.10" +__version__ = "1.10.11" from .environment import Environment from .helpers.ArchiveStorageManager import set_assetbundle_decrypt_key diff --git a/UnityPy/classes/Texture2DArray.py b/UnityPy/classes/Texture2DArray.py new file mode 100644 index 00000000..5ba6f0b2 --- /dev/null +++ b/UnityPy/classes/Texture2DArray.py @@ -0,0 +1,84 @@ +from typing import Optional, List + +from .Texture import Texture +from .Texture2D import StreamingInfo +from ..enums.GraphicsFormat import GraphicsFormat, GRAPHICS_TO_TEXTURE_MAP +from ..export import Texture2DConverter +from ..helpers.ResourceReader import get_resource_data +from PIL import Image + + +class GLTextureSettings: + m_Aniso: int + m_FilterMode: int + m_MipBias: float + m_WrapMode: Optional[int] = None + m_WrapU: Optional[int] = None + m_WrapV: Optional[int] = None + m_WrapW: Optional[int] = None + + def __init__(self, reader): + self.__dict__.update(**self.read_typetree(wrap=True).__dict__) + + +class Texture2DArray(Texture): + image_data: bytes + m_ColorSpace: int + m_DataSize: int + m_Depth: int + m_Format: GraphicsFormat + m_Height: int + m_IsReadable: bool + m_MipCount: int + m_Name: str + m_TextureSettings: GLTextureSettings + m_Width: int + m_DownscaleFallback: Optional[bool] = None + m_ForcedFallbackFormat: Optional[int] = None + m_IgnoreMipmapLimit: Optional[bool] = None + m_IsAlphaChannelOptional: Optional[bool] = None + m_MipmapLimitGroupName: Optional[str] = None + m_MipsStripped: Optional[int] = None + m_StreamData: Optional[StreamingInfo] = None + m_UsageMode: Optional[int] = None + + def __init__(self, reader): + super().__init__(reader=reader) + self.__dict__.update(**reader.read_typetree(wrap=True).__dict__) + self.m_TextureSettings.__class__ = GLTextureSettings + self.m_Format = GraphicsFormat(self.m_Format) + + @property + def image_data(self): + data = getattr(self, "image data", None) + if data is None: + data = get_resource_data( + self.m_StreamData.path, + self.assets_file, + self.m_StreamData.offset, + self.m_StreamData.size, + ) + return data + + @property + def images(self) -> List[Image.Image]: + texture_format = GRAPHICS_TO_TEXTURE_MAP.get(self.m_Format) + if not texture_format: + raise NotImplementedError( + f"GraphicsFormat {self.m_Format} not supported yet" + ) + + # calculate the number of textures in the array + texture_size = self.m_DataSize // self.m_Depth + return [ + Texture2DConverter.parse_image_data( + self.image_data[offset : offset + texture_size], + self.m_Width, + self.m_Height, + texture_format, + self.version, + 0, + None, + ) + for offset in range(0, self.m_DataSize, texture_size) + ] diff --git a/UnityPy/classes/__init__.py b/UnityPy/classes/__init__.py index 301aac1f..5cae3aac 100644 --- a/UnityPy/classes/__init__.py +++ b/UnityPy/classes/__init__.py @@ -34,5 +34,6 @@ from .TextAsset import TextAsset from .Texture import Texture from .Texture2D import Texture2D +from .Texture2DArray import Texture2DArray from .Transform import Transform from .VideoClip import VideoClip diff --git a/UnityPy/enums/GraphicsFormat.py b/UnityPy/enums/GraphicsFormat.py new file mode 100644 index 00000000..07bb568c --- /dev/null +++ b/UnityPy/enums/GraphicsFormat.py @@ -0,0 +1,277 @@ +from enum import IntEnum + +from .TextureFormat import TextureFormat + + +class GraphicsFormat(IntEnum): + NONE = 0 + R8_SRGB = 1 + R8G8_SRGB = 2 + R8G8B8_SRGB = 3 + R8G8B8A8_SRGB = 4 + + R8_UNorm = 5 + R8G8_UNorm = 6 + R8G8B8_UNorm = 7 + R8G8B8A8_UNorm = 8 + + R8_SNorm = 9 + R8G8_SNorm = 10 + R8G8B8_SNorm = 11 + R8G8B8A8_SNorm = 12 + + R8_UInt = 13 + R8G8_UInt = 14 + R8G8B8_UInt = 15 + R8G8B8A8_UInt = 16 + + R8_SInt = 17 + R8G8_SInt = 18 + R8G8B8_SInt = 19 + R8G8B8A8_SInt = 20 + + R16_UNorm = 21 + R16G16_UNorm = 22 + R16G16B16_UNorm = 23 + R16G16B16A16_UNorm = 24 + + R16_SNorm = 25 + R16G16_SNorm = 26 + R16G16B16_SNorm = 27 + R16G16B16A16_SNorm = 28 + + R16_UInt = 29 + R16G16_UInt = 30 + R16G16B16_UInt = 31 + R16G16B16A16_UInt = 32 + + R16_SInt = 33 + R16G16_SInt = 34 + R16G16B16_SInt = 35 + R16G16B16A16_SInt = 36 + + R32_UInt = 37 + R32G32_UInt = 38 + R32G32B32_UInt = 39 + R32G32B32A32_UInt = 40 + + R32_SInt = 41 + R32G32_SInt = 42 + R32G32B32_SInt = 43 + R32G32B32A32_SInt = 44 + + R16_SFloat = 45 + R16G16_SFloat = 46 + R16G16B16_SFloat = 47 + R16G16B16A16_SFloat = 48 + R32_SFloat = 49 + R32G32_SFloat = 50 + R32G32B32_SFloat = 51 + R32G32B32A32_SFloat = 52 + + B8G8R8_SRGB = 56 + B8G8R8A8_SRGB = 57 + B8G8R8_UNorm = 58 + B8G8R8A8_UNorm = 59 + B8G8R8_SNorm = 60 + B8G8R8A8_SNorm = 61 + B8G8R8_UInt = 62 + B8G8R8A8_UInt = 63 + B8G8R8_SInt = 64 + B8G8R8A8_SInt = 65 + + R4G4B4A4_UNormPack16 = 66 + B4G4R4A4_UNormPack16 = 67 + R5G6B5_UNormPack16 = 68 + B5G6R5_UNormPack16 = 69 + R5G5B5A1_UNormPack16 = 70 + B5G5R5A1_UNormPack16 = 71 + A1R5G5B5_UNormPack16 = 72 + + E5B9G9R9_UFloatPack32 = 73 + B10G11R11_UFloatPack32 = 74 + + A2B10G10R10_UNormPack32 = 75 + A2B10G10R10_UIntPack32 = 76 + A2B10G10R10_SIntPack32 = 77 + A2R10G10B10_UNormPack32 = 78 + A2R10G10B10_UIntPack32 = 79 + A2R10G10B10_SIntPack32 = 80 + A2R10G10B10_XRSRGBPack32 = 81 + A2R10G10B10_XRUNormPack32 = 82 + R10G10B10_XRSRGBPack32 = 83 + R10G10B10_XRUNormPack32 = 84 + A10R10G10B10_XRSRGBPack32 = 85 + A10R10G10B10_XRUNormPack32 = 86 + + D16_UNorm = 90 + D24_UNorm = 91 + D24_UNorm_S8_UInt = 92 + D32_SFloat = 93 + D32_SFloat_S8_UInt = 94 + S8_UInt = 95 + + RGB_DXT1_SRGB = 96 + RGBA_DXT1_SRGB = 96 + RGB_DXT1_UNorm = 97 + RGBA_DXT1_UNorm = 97 + RGBA_DXT3_SRGB = 98 + RGBA_DXT3_UNorm = 99 + RGBA_DXT5_SRGB = 100 + RGBA_DXT5_UNorm = 101 + R_BC4_UNorm = 102 + R_BC4_SNorm = 103 + RG_BC5_UNorm = 104 + RG_BC5_SNorm = 105 + RGB_BC6H_UFloat = 106 + RGB_BC6H_SFloat = 107 + RGBA_BC7_SRGB = 108 + RGBA_BC7_UNorm = 109 + + RGB_PVRTC_2Bpp_SRGB = 110 + RGB_PVRTC_2Bpp_UNorm = 111 + RGB_PVRTC_4Bpp_SRGB = 112 + RGB_PVRTC_4Bpp_UNorm = 113 + RGBA_PVRTC_2Bpp_SRGB = 114 + RGBA_PVRTC_2Bpp_UNorm = 115 + RGBA_PVRTC_4Bpp_SRGB = 116 + RGBA_PVRTC_4Bpp_UNorm = 117 + + RGB_ETC_UNorm = 118 + RGB_ETC2_SRGB = 119 + RGB_ETC2_UNorm = 120 + RGB_A1_ETC2_SRGB = 121 + RGB_A1_ETC2_UNorm = 122 + RGBA_ETC2_SRGB = 123 + RGBA_ETC2_UNorm = 124 + + R_EAC_UNorm = 125 + R_EAC_SNorm = 126 + RG_EAC_UNorm = 127 + RG_EAC_SNorm = 128 + + RGBA_ASTC4X4_SRGB = 129 + RGBA_ASTC4X4_UNorm = 130 + RGBA_ASTC5X5_SRGB = 131 + RGBA_ASTC5X5_UNorm = 132 + RGBA_ASTC6X6_SRGB = 133 + RGBA_ASTC6X6_UNorm = 134 + RGBA_ASTC8X8_SRGB = 135 + RGBA_ASTC8X8_UNorm = 136 + RGBA_ASTC10X10_SRGB = 137 + RGBA_ASTC10X10_UNorm = 138 + RGBA_ASTC12X12_SRGB = 139 + RGBA_ASTC12X12_UNorm = 140 + + YUV2 = 141 + + RGBA_ASTC4X4_UFloat = 145 + RGBA_ASTC5X5_UFloat = 146 + RGBA_ASTC6X6_UFloat = 147 + RGBA_ASTC8X8_UFloat = 148 + RGBA_ASTC10X10_UFloat = 149 + RGBA_ASTC12X12_UFloat = 150 + + D16_UNorm_S8_UInt = 151 + + +# very experimental & untested +GRAPHICS_TO_TEXTURE_MAP = { + GraphicsFormat.R8_SRGB: TextureFormat.R8, + GraphicsFormat.R8G8_SRGB: TextureFormat.RG16, + GraphicsFormat.R8G8B8_SRGB: TextureFormat.RGB24, + GraphicsFormat.R8G8B8A8_SRGB: TextureFormat.RGBA32, + GraphicsFormat.R8_UNorm: TextureFormat.R8, + GraphicsFormat.R8G8_UNorm: TextureFormat.RG16, + GraphicsFormat.R8G8B8_UNorm: TextureFormat.RGB24, + GraphicsFormat.R8G8B8A8_UNorm: TextureFormat.RGBA32, + GraphicsFormat.R8_SNorm: TextureFormat.R8_SIGNED, + GraphicsFormat.R8G8_SNorm: TextureFormat.RG16_SIGNED, + GraphicsFormat.R8G8B8_SNorm: TextureFormat.RGB24_SIGNED, + GraphicsFormat.R8G8B8A8_SNorm: TextureFormat.RGBA32_SIGNED, + GraphicsFormat.R8_UInt: TextureFormat.R16, + GraphicsFormat.R8G8_UInt: TextureFormat.RG32, + GraphicsFormat.R8G8B8_UInt: TextureFormat.RGB48, + GraphicsFormat.R8G8B8A8_UInt: TextureFormat.RGBA64, + GraphicsFormat.R8_SInt: TextureFormat.R16_SIGNED, + GraphicsFormat.R8G8_SInt: TextureFormat.RG32_SIGNED, + GraphicsFormat.R8G8B8_SInt: TextureFormat.RGB48_SIGNED, + GraphicsFormat.R8G8B8A8_SInt: TextureFormat.RGBA64_SIGNED, + GraphicsFormat.R16_UNorm: TextureFormat.R16, + GraphicsFormat.R16G16_UNorm: TextureFormat.RG32, + GraphicsFormat.R16G16B16_UNorm: TextureFormat.RGB48, + GraphicsFormat.R16G16B16A16_UNorm: TextureFormat.RGBA64, + GraphicsFormat.R16_SNorm: TextureFormat.R16_SIGNED, + GraphicsFormat.R16G16_SNorm: TextureFormat.RG32_SIGNED, + GraphicsFormat.R16G16B16_SNorm: TextureFormat.RGB48_SIGNED, + GraphicsFormat.R16G16B16A16_SNorm: TextureFormat.RGBA64_SIGNED, + GraphicsFormat.R16_UInt: TextureFormat.R16, + GraphicsFormat.R16G16_UInt: TextureFormat.RG32, + GraphicsFormat.R16G16B16_UInt: TextureFormat.RGB48, + GraphicsFormat.R16G16B16A16_UInt: TextureFormat.RGBA64, + GraphicsFormat.R16_SInt: TextureFormat.R16_SIGNED, + GraphicsFormat.R16G16_SInt: TextureFormat.RG32_SIGNED, + GraphicsFormat.R16G16B16_SInt: TextureFormat.RGB48_SIGNED, + GraphicsFormat.R16G16B16A16_SInt: TextureFormat.RGBA64_SIGNED, + GraphicsFormat.B8G8R8_SRGB: TextureFormat.BGR24, + GraphicsFormat.B8G8R8A8_SRGB: TextureFormat.BGRA32, + GraphicsFormat.B8G8R8_UNorm: TextureFormat.BGR24, + GraphicsFormat.B8G8R8A8_UNorm: TextureFormat.BGRA32, + # GraphicsFormat.B8G8R8_SNorm: TextureFormat.BGR24_SIGNED, + # GraphicsFormat.B8G8R8A8_SNorm: TextureFormat.BGRA32_SIGNED, + # GraphicsFormat.B8G8R8_UInt: TextureFormat.BGR48, + GraphicsFormat.RGB_DXT1_SRGB: TextureFormat.DXT1, + GraphicsFormat.RGBA_DXT1_SRGB: TextureFormat.DXT1, + GraphicsFormat.RGB_DXT1_UNorm: TextureFormat.DXT1, + GraphicsFormat.RGBA_DXT1_UNorm: TextureFormat.DXT1, + GraphicsFormat.RGBA_DXT3_SRGB: TextureFormat.DXT3, + GraphicsFormat.RGBA_DXT3_UNorm: TextureFormat.DXT3, + GraphicsFormat.RGBA_DXT5_SRGB: TextureFormat.DXT5, + GraphicsFormat.RGBA_DXT5_UNorm: TextureFormat.DXT5, + GraphicsFormat.R_BC4_UNorm: TextureFormat.BC4, + # GraphicsFormat.R_BC4_SNorm: TextureFormat.BC4_SIGNED, + GraphicsFormat.RG_BC5_UNorm: TextureFormat.BC5, + # GraphicsFormat.RG_BC5_SNorm: TextureFormat.BC5_SIGNED, + GraphicsFormat.RGB_BC6H_UFloat: TextureFormat.BC6H, + # GraphicsFormat.RGB_BC6H_SFloat: TextureFormat.BC6H_SIGNED, + GraphicsFormat.RGBA_BC7_SRGB: TextureFormat.BC7, + GraphicsFormat.RGBA_BC7_UNorm: TextureFormat.BC7, + GraphicsFormat.RGB_PVRTC_2Bpp_SRGB: TextureFormat.PVRTC_RGB2, + GraphicsFormat.RGB_PVRTC_2Bpp_UNorm: TextureFormat.PVRTC_RGB2, + GraphicsFormat.RGB_PVRTC_4Bpp_SRGB: TextureFormat.PVRTC_RGB4, + GraphicsFormat.RGB_PVRTC_4Bpp_UNorm: TextureFormat.PVRTC_RGB4, + GraphicsFormat.RGBA_PVRTC_2Bpp_SRGB: TextureFormat.PVRTC_RGBA2, + GraphicsFormat.RGBA_PVRTC_2Bpp_UNorm: TextureFormat.PVRTC_RGBA2, + GraphicsFormat.RGBA_PVRTC_4Bpp_SRGB: TextureFormat.PVRTC_RGBA4, + GraphicsFormat.RGBA_PVRTC_4Bpp_UNorm: TextureFormat.PVRTC_RGBA4, + GraphicsFormat.RGB_ETC_UNorm: TextureFormat.ETC_RGB4, + GraphicsFormat.RGB_ETC2_SRGB: TextureFormat.ETC2_RGB, + GraphicsFormat.RGB_ETC2_UNorm: TextureFormat.ETC2_RGB, + GraphicsFormat.RGB_A1_ETC2_SRGB: TextureFormat.ETC2_RGBA1, + GraphicsFormat.RGB_A1_ETC2_UNorm: TextureFormat.ETC2_RGBA1, + GraphicsFormat.RGBA_ETC2_SRGB: TextureFormat.ETC2_RGBA8, + GraphicsFormat.RGBA_ETC2_UNorm: TextureFormat.ETC2_RGBA8, + GraphicsFormat.R_EAC_UNorm: TextureFormat.EAC_R, + GraphicsFormat.R_EAC_SNorm: TextureFormat.EAC_R_SIGNED, + GraphicsFormat.RG_EAC_UNorm: TextureFormat.EAC_RG, + GraphicsFormat.RG_EAC_SNorm: TextureFormat.EAC_RG_SIGNED, + GraphicsFormat.RGBA_ASTC4X4_SRGB: TextureFormat.ASTC_RGBA_4x4, + GraphicsFormat.RGBA_ASTC4X4_UNorm: TextureFormat.ASTC_RGBA_4x4, + GraphicsFormat.RGBA_ASTC5X5_SRGB: TextureFormat.ASTC_RGBA_5x5, + GraphicsFormat.RGBA_ASTC5X5_UNorm: TextureFormat.ASTC_RGBA_5x5, + GraphicsFormat.RGBA_ASTC6X6_SRGB: TextureFormat.ASTC_RGBA_6x6, + GraphicsFormat.RGBA_ASTC6X6_UNorm: TextureFormat.ASTC_RGBA_6x6, + GraphicsFormat.RGBA_ASTC8X8_SRGB: TextureFormat.ASTC_RGBA_8x8, + GraphicsFormat.RGBA_ASTC8X8_UNorm: TextureFormat.ASTC_RGBA_8x8, + GraphicsFormat.RGBA_ASTC10X10_SRGB: TextureFormat.ASTC_RGBA_10x10, + GraphicsFormat.RGBA_ASTC10X10_UNorm: TextureFormat.ASTC_RGBA_10x10, + GraphicsFormat.RGBA_ASTC12X12_SRGB: TextureFormat.ASTC_RGBA_12x12, + GraphicsFormat.RGBA_ASTC12X12_UNorm: TextureFormat.ASTC_RGBA_12x12, + GraphicsFormat.YUV2: TextureFormat.YUY2, + # GraphicsFormat.RGBA_ASTC4X4_UFloat: TextureFormat.ASTC_RGBA_4x4, + # GraphicsFormat.RGBA_ASTC5X5_UFloat: TextureFormat.ASTC_RGBA_5x5, + # GraphicsFormat.RGBA_ASTC6X6_UFloat: TextureFormat.ASTC_RGBA_6x6, + # GraphicsFormat.RGBA_ASTC8X8_UFloat: TextureFormat.ASTC_RGBA_8x8, + # GraphicsFormat.RGBA_ASTC10X10_UFloat: TextureFormat.ASTC_RGBA_10x10, + # GraphicsFormat.RGBA_ASTC12X12_UFloat: TextureFormat.ASTC_RGBA_12x12, +} diff --git a/UnityPy/enums/__init__.py b/UnityPy/enums/__init__.py index 85706721..de6e5190 100644 --- a/UnityPy/enums/__init__.py +++ b/UnityPy/enums/__init__.py @@ -14,3 +14,4 @@ from .SpritePackingRotation import SpritePackingRotation from .TextureDimension import TextureDimension from .PassType import PassType +from .GraphicsFormat import GraphicsFormat diff --git a/UnityPy/export/Texture2DConverter.py b/UnityPy/export/Texture2DConverter.py index 331cc23d..fc54f3f2 100644 --- a/UnityPy/export/Texture2DConverter.py +++ b/UnityPy/export/Texture2DConverter.py @@ -89,7 +89,10 @@ def assert_rgba(img: Image.Image, target_texture_format: TextureFormat): return img -def get_image_from_texture2d(texture_2d, flip=True) -> Image.Image: +def get_image_from_texture2d( + texture_2d: "Texture2D", + flip=True, +) -> Image.Image: """converts the given texture into PIL.Image :param texture_2d: texture to be converterd @@ -99,15 +102,32 @@ def get_image_from_texture2d(texture_2d, flip=True) -> Image.Image: :return: PIL.Image object :rtype: Image """ - image_data = copy(bytes(texture_2d.image_data)) + return parse_image_data( + texture_2d.image_data, + texture_2d.m_Width, + texture_2d.m_Height, + texture_2d.m_TextureFormat, + texture_2d.version, + texture_2d.platform, + getattr(texture_2d, "m_PlatformBlob", None), + flip, + ) + + +def parse_image_data( + image_data: bytes, + width: int, + height: int, + texture_format: TextureFormat, + version: tuple, + platform: int, + platform_blob: bytes = None, + flip=True, +) -> Image.Image: + image_data = copy(bytes(image_data)) if not image_data: raise ValueError("Texture2D has no image data") - texture_format = ( - texture_2d.m_TextureFormat - if isinstance(texture_2d.m_TextureFormat, TF) - else TF(texture_2d.m_TextureFormat) - ) selection = CONV_TABLE[texture_format] if len(selection) == 0: @@ -116,10 +136,10 @@ def get_image_from_texture2d(texture_2d, flip=True) -> Image.Image: ) if texture_format in XBOX_SWAP_FORMATS: - image_data = swap_bytes_for_xbox(image_data, texture_2d.platform) + image_data = swap_bytes_for_xbox(image_data, platform) if "Crunched" in texture_format.name: - version = texture_2d.version + version = version if ( version[0] > 2017 or (version[0] == 2017 and version[1] >= 3) # 2017.3 and up @@ -130,19 +150,11 @@ def get_image_from_texture2d(texture_2d, flip=True) -> Image.Image: else: image_data = texture2ddecoder.unpack_crunch(image_data) - img = selection[0]( - image_data, texture_2d.m_Width, texture_2d.m_Height, *selection[1:] - ) + img = selection[0](image_data, width, height, *selection[1:]) - if texture_2d.platform == BuildTarget.Switch and getattr( - texture_2d, "m_PlatformBlob", None - ): - gobsPerBlock = TextureSwizzler.get_switch_gobs_per_block( - texture_2d.m_PlatformBlob - ) - blockSize = TextureSwizzler.TEXTUREFORMAT_BLOCK_SIZE_MAP[ - texture_2d.m_TextureFormat - ] + if platform == BuildTarget.Switch and platform_blob is not None: + gobsPerBlock = TextureSwizzler.get_switch_gobs_per_block(platform_blob) + blockSize = TextureSwizzler.TEXTUREFORMAT_BLOCK_SIZE_MAP[texture_format] img = TextureSwizzler.switch_deswizzle(img, blockSize, gobsPerBlock) if img and flip: @@ -297,85 +309,85 @@ def rgb9e5float(image_data: bytes, width: int, height: int): CONV_TABLE = { -# FORMAT FUNC #ARGS..... -#----------------------- -------- -------- ------------ ----------------- ------------ ---------- -( TF.Alpha8, pillow, "RGBA", "raw", "A" ), -( TF.ARGB4444, pillow, "RGBA", "raw", "RGBA;4B", (2,1,0,3) ), -( TF.RGB24, pillow, "RGB", "raw", "RGB" ), -( TF.RGBA32, pillow, "RGBA", "raw", "RGBA" ), -( TF.ARGB32, pillow, "RGBA", "raw", "ARGB" ), -( TF.ARGBFloat, pillow, "RGBA", "raw", "RGBAF", (2,1,0,3) ), -( TF.RGB565, pillow, "RGB", "raw", "BGR;16" ), -( TF.BGR24, pillow, "RGB", "raw", "BGR" ), -( TF.R8, pillow, "RGB", "raw", "R" ), -( TF.R16, pillow, "RGB", "raw", "R;16" ), -( TF.RG16, rg, "RGB", "raw", "RG" ), -( TF.DXT1, pillow, "RGBA", "bcn", 1 ), -( TF.DXT3, pillow, "RGBA", "bcn", 2 ), -( TF.DXT5, pillow, "RGBA", "bcn", 3 ), -( TF.RGBA4444, pillow, "RGBA", "raw", 'RGBA;4B', (3,2,1,0) ), -( TF.BGRA32, pillow, "RGBA", "raw", "BGRA" ), -( TF.RHalf, half, "R", "raw", "R" ), -( TF.RGHalf, rg, "RGB", "raw", "RGE" ), -( TF.RGBAHalf, half, "RGB", "raw", "RGB" ), -( TF.RFloat, pillow, "RGB", "raw", "RF" ), -( TF.RGFloat, rg, "RGB", "raw", "RGF" ), -( TF.RGBAFloat, pillow, "RGBA", "raw", "RGBAF" ), -( TF.YUY2, ), -( TF.RGB9e5Float, rgb9e5float ), -( TF.BC4, pillow, "L", "bcn", 4 ), -( TF.BC5, pillow, "RGB", "bcn", 5 ), -( TF.BC6H, pillow, "RGBA", "bcn", 6 ), -( TF.BC7, pillow, "RGBA", "bcn", 7 ), -( TF.DXT1Crunched, pillow, "RGBA", "bcn", 1 ), -( TF.DXT5Crunched, pillow, "RGBA", "bcn", 3 ), -( TF.PVRTC_RGB2, pvrtc, True ), -( TF.PVRTC_RGBA2, pvrtc, True ), -( TF.PVRTC_RGB4, pvrtc, False ), -( TF.PVRTC_RGBA4, pvrtc, False ), -( TF.ETC_RGB4, etc, (1,) ), -( TF.ATC_RGB4, atc, False ), -( TF.ATC_RGBA8, atc, True ), -( TF.EAC_R, eac, "EAC_R" ), -( TF.EAC_R_SIGNED, eac, "EAC_R:SIGNED" ), -( TF.EAC_RG, eac, "EAC_RG" ), -( TF.EAC_RG_SIGNED, eac, "EAC_RG_SIGNED" ), -( TF.ETC2_RGB, etc, (2,"RGB") ), -( TF.ETC2_RGBA1, etc, (2, "A1") ), -( TF.ETC2_RGBA8, etc, (2, "A8") ), -( TF.ASTC_RGB_4x4, astc, (4,4) ), -( TF.ASTC_RGB_5x5, astc, (5,5) ), -( TF.ASTC_RGB_6x6, astc, (6,6) ), -( TF.ASTC_RGB_8x8, astc, (8,8) ), -( TF.ASTC_RGB_10x10, astc, (10,10) ), -( TF.ASTC_RGB_12x12, astc, (12,12) ), -( TF.ASTC_RGBA_4x4, astc, (4,4) ), -( TF.ASTC_RGBA_5x5, astc, (5,5) ), -( TF.ASTC_RGBA_6x6, astc, (6,6) ), -( TF.ASTC_RGBA_8x8, astc, (8,8) ), -( TF.ASTC_RGBA_10x10, astc, (10,10) ), -( TF.ASTC_RGBA_12x12, astc, (12,12) ), -( TF.ETC_RGB4_3DS, etc, (1,) ), -( TF.ETC_RGBA8_3DS, etc, (1,) ), -( TF.ETC_RGB4Crunched, etc, (1,) ), -( TF.ETC2_RGBA8Crunched, etc, (2, "A8") ), -( TF.ASTC_HDR_4x4, astc, (4,4) ), -( TF.ASTC_HDR_5x5, astc, (5,5) ), -( TF.ASTC_HDR_6x6, astc, (6,6) ), -( TF.ASTC_HDR_8x8, astc, (8,8) ), -( TF.ASTC_HDR_10x10, astc, (10,10) ), -( TF.ASTC_HDR_12x12, astc, (12,12) ), -( TF.RG32, rg, "RGB", "raw", "RG;16" ), -( TF.RGB48, pillow, "RGB", "raw", "RGB;16" ), -( TF.RGBA64, pillow, "RGBA", "raw", "RGBA;16" ), -( TF.R8_SIGNED, pillow, "R", "raw", "R;8s" ), -( TF.RG16_SIGNED, rg, "RGB", "raw", "RG;8s" ), -( TF.RGB24_SIGNED, pillow, "RGB", "raw", "RGB;8s" ), -( TF.RGBA32_SIGNED, pillow, "RGBA", "raw", "RGBA;8s" ), -( TF.R16_SIGNED, pillow, "R", "raw", "R;16s" ), -( TF.RG32_SIGNED, rg, "RGB", "raw", "RG;16s" ), -( TF.RGB48_SIGNED, pillow, "RGB", "raw", "RGB;16s" ), -( TF.RGBA64_SIGNED, pillow, "RGBA", "raw", "RGBA;16s" ), + # FORMAT FUNC #ARGS..... + # ----------------------- -------- -------- ------------ ----------------- ------------ ---------- + (TF.Alpha8, pillow, "RGBA", "raw", "A"), + (TF.ARGB4444, pillow, "RGBA", "raw", "RGBA;4B", (2, 1, 0, 3)), + (TF.RGB24, pillow, "RGB", "raw", "RGB"), + (TF.RGBA32, pillow, "RGBA", "raw", "RGBA"), + (TF.ARGB32, pillow, "RGBA", "raw", "ARGB"), + (TF.ARGBFloat, pillow, "RGBA", "raw", "RGBAF", (2, 1, 0, 3)), + (TF.RGB565, pillow, "RGB", "raw", "BGR;16"), + (TF.BGR24, pillow, "RGB", "raw", "BGR"), + (TF.R8, pillow, "RGB", "raw", "R"), + (TF.R16, pillow, "RGB", "raw", "R;16"), + (TF.RG16, rg, "RGB", "raw", "RG"), + (TF.DXT1, pillow, "RGBA", "bcn", 1), + (TF.DXT3, pillow, "RGBA", "bcn", 2), + (TF.DXT5, pillow, "RGBA", "bcn", 3), + (TF.RGBA4444, pillow, "RGBA", "raw", "RGBA;4B", (3, 2, 1, 0)), + (TF.BGRA32, pillow, "RGBA", "raw", "BGRA"), + (TF.RHalf, half, "R", "raw", "R"), + (TF.RGHalf, rg, "RGB", "raw", "RGE"), + (TF.RGBAHalf, half, "RGB", "raw", "RGB"), + (TF.RFloat, pillow, "RGB", "raw", "RF"), + (TF.RGFloat, rg, "RGB", "raw", "RGF"), + (TF.RGBAFloat, pillow, "RGBA", "raw", "RGBAF"), + (TF.YUY2,), + (TF.RGB9e5Float, rgb9e5float), + (TF.BC4, pillow, "L", "bcn", 4), + (TF.BC5, pillow, "RGB", "bcn", 5), + (TF.BC6H, pillow, "RGBA", "bcn", 6), + (TF.BC7, pillow, "RGBA", "bcn", 7), + (TF.DXT1Crunched, pillow, "RGBA", "bcn", 1), + (TF.DXT5Crunched, pillow, "RGBA", "bcn", 3), + (TF.PVRTC_RGB2, pvrtc, True), + (TF.PVRTC_RGBA2, pvrtc, True), + (TF.PVRTC_RGB4, pvrtc, False), + (TF.PVRTC_RGBA4, pvrtc, False), + (TF.ETC_RGB4, etc, (1,)), + (TF.ATC_RGB4, atc, False), + (TF.ATC_RGBA8, atc, True), + (TF.EAC_R, eac, "EAC_R"), + (TF.EAC_R_SIGNED, eac, "EAC_R:SIGNED"), + (TF.EAC_RG, eac, "EAC_RG"), + (TF.EAC_RG_SIGNED, eac, "EAC_RG_SIGNED"), + (TF.ETC2_RGB, etc, (2, "RGB")), + (TF.ETC2_RGBA1, etc, (2, "A1")), + (TF.ETC2_RGBA8, etc, (2, "A8")), + (TF.ASTC_RGB_4x4, astc, (4, 4)), + (TF.ASTC_RGB_5x5, astc, (5, 5)), + (TF.ASTC_RGB_6x6, astc, (6, 6)), + (TF.ASTC_RGB_8x8, astc, (8, 8)), + (TF.ASTC_RGB_10x10, astc, (10, 10)), + (TF.ASTC_RGB_12x12, astc, (12, 12)), + (TF.ASTC_RGBA_4x4, astc, (4, 4)), + (TF.ASTC_RGBA_5x5, astc, (5, 5)), + (TF.ASTC_RGBA_6x6, astc, (6, 6)), + (TF.ASTC_RGBA_8x8, astc, (8, 8)), + (TF.ASTC_RGBA_10x10, astc, (10, 10)), + (TF.ASTC_RGBA_12x12, astc, (12, 12)), + (TF.ETC_RGB4_3DS, etc, (1,)), + (TF.ETC_RGBA8_3DS, etc, (1,)), + (TF.ETC_RGB4Crunched, etc, (1,)), + (TF.ETC2_RGBA8Crunched, etc, (2, "A8")), + (TF.ASTC_HDR_4x4, astc, (4, 4)), + (TF.ASTC_HDR_5x5, astc, (5, 5)), + (TF.ASTC_HDR_6x6, astc, (6, 6)), + (TF.ASTC_HDR_8x8, astc, (8, 8)), + (TF.ASTC_HDR_10x10, astc, (10, 10)), + (TF.ASTC_HDR_12x12, astc, (12, 12)), + (TF.RG32, rg, "RGB", "raw", "RG;16"), + (TF.RGB48, pillow, "RGB", "raw", "RGB;16"), + (TF.RGBA64, pillow, "RGBA", "raw", "RGBA;16"), + (TF.R8_SIGNED, pillow, "R", "raw", "R;8s"), + (TF.RG16_SIGNED, rg, "RGB", "raw", "RG;8s"), + (TF.RGB24_SIGNED, pillow, "RGB", "raw", "RGB;8s"), + (TF.RGBA32_SIGNED, pillow, "RGBA", "raw", "RGBA;8s"), + (TF.R16_SIGNED, pillow, "R", "raw", "R;16s"), + (TF.RG32_SIGNED, rg, "RGB", "raw", "RG;16s"), + (TF.RGB48_SIGNED, pillow, "RGB", "raw", "RGB;16s"), + (TF.RGBA64_SIGNED, pillow, "RGBA", "raw", "RGBA;16s"), } # format conv_table to a dict From 0364b00007cbe3200cee39876e6edfb867624e1f Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Fri, 26 Jan 2024 10:58:25 +0100 Subject: [PATCH 035/403] Texture2D - 2022 fix (#227) * Texture2D - 2022 fix * 1.10.12 version bump --- UnityPy/__init__.py | 2 +- UnityPy/classes/Texture2D.py | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/UnityPy/__init__.py b/UnityPy/__init__.py index 901a6a0e..bce3802c 100644 --- a/UnityPy/__init__.py +++ b/UnityPy/__init__.py @@ -1,4 +1,4 @@ -__version__ = "1.10.11" +__version__ = "1.10.12" from .environment import Environment from .helpers.ArchiveStorageManager import set_assetbundle_decrypt_key diff --git a/UnityPy/classes/Texture2D.py b/UnityPy/classes/Texture2D.py index b9b4a882..cc53956d 100644 --- a/UnityPy/classes/Texture2D.py +++ b/UnityPy/classes/Texture2D.py @@ -146,6 +146,7 @@ def __init__(self, reader): self.m_IgnoreMasterTextureLimit = reader.read_boolean() if version >= (2022, 2, 0): # 2022.2.0f1 and up self.m_IgnoreMipmapLimit = reader.read_boolean() + self.align_stream() self.m_MipmapLimitGroupName = reader.read_aligned_string() if (3,) <= version[:2] <= (5, 4): # 3.0 - 5.4 self.m_ReadAllowed = reader.read_boolean() @@ -204,6 +205,7 @@ def save(self, writer: EndianBinaryWriter = None): writer.write_boolean(self.m_IgnoreMasterTextureLimit) if version >= (2022, 2, 0): # 2022.2.0f1 and up writer.write_boolean(self.m_IgnoreMipmapLimit) + writer.align_stream() writer.write_aligned_string(self.m_MipmapLimitGroupName) if (3,) <= version[:2] <= (5, 4): # 3.0 - 5.4 writer.write_boolean(self.m_ReadAllowed) # 3.0 - 5.4 From 2301b1b0628415f29b97f87a34d2b35b138a4ae5 Mon Sep 17 00:00:00 2001 From: StarHeart Date: Mon, 25 Mar 2024 21:40:55 +0800 Subject: [PATCH 036/403] Fix typos (#232) --- UnityPy/helpers/ImportHelper.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/UnityPy/helpers/ImportHelper.py b/UnityPy/helpers/ImportHelper.py index 089a0a03..7e7e2a4b 100644 --- a/UnityPy/helpers/ImportHelper.py +++ b/UnityPy/helpers/ImportHelper.py @@ -147,15 +147,15 @@ def parse_file( def find_sensitive_path(dir: str, insensitive_path: str) -> Union[str, None]: parts = os.path.split(insensitive_path.strip(os.path.sep)) - senstive_path = dir + sensitive_path = dir for part in parts: part_lower = part.lower() part = next( - (name for name in os.listdir(senstive_path) if name.lower() == part_lower), + (name for name in os.listdir(sensitive_path) if name.lower() == part_lower), None, ) if part is None: return None - senstive_path = os.path.join(senstive_path, part) + sensitive_path = os.path.join(sensitive_path, part) - return senstive_path + return sensitive_path From 460641aa21d71ff3f3b6f72e4bc064e4b9225949 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Wed, 3 Apr 2024 17:00:46 +0200 Subject: [PATCH 037/403] fix publish.yml --- .github/workflows/publish.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 34fa3371..99df41fc 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -42,7 +42,7 @@ jobs: platforms: all - name: Build wheels - uses: pypa/cibuildwheel@v2.16.2 + uses: pypa/cibuildwheel@v2.17.0 env: CIBW_ARCHS_LINUX: auto aarch64 CIBW_ARCHS_MACOS: x86_64 arm64 universal2 @@ -56,7 +56,7 @@ jobs: ${{ matrix.cp }}-macosx_arm64 ${{ matrix.cp }}-macosx_universal2 # Disabled repair wheel since the fmob lib is not compatible - CIBW_REPAIR_WHEEL_COMMAND: "" + CIBW_REPAIR_WHEEL_COMMAND: '""' CIBW_REPAIR_WHEEL_COMMAND_LINUX: 'mv {wheel} {dest_dir}/"$(basename {wheel} | sed "s/-linux_/-manylinux_2_17_/")"' CIBW_TEST_REQUIRES: pytest CIBW_TEST_COMMAND: pytest -v -s {package}/tests From 4111479fdbebce38d17c6811690e44b52c857351 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Wed, 3 Apr 2024 17:05:29 +0200 Subject: [PATCH 038/403] Update publish.yml --- .github/workflows/publish.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 99df41fc..a7c4041b 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -56,7 +56,7 @@ jobs: ${{ matrix.cp }}-macosx_arm64 ${{ matrix.cp }}-macosx_universal2 # Disabled repair wheel since the fmob lib is not compatible - CIBW_REPAIR_WHEEL_COMMAND: '""' + CIBW_REPAIR_WHEEL_COMMAND: '' CIBW_REPAIR_WHEEL_COMMAND_LINUX: 'mv {wheel} {dest_dir}/"$(basename {wheel} | sed "s/-linux_/-manylinux_2_17_/")"' CIBW_TEST_REQUIRES: pytest CIBW_TEST_COMMAND: pytest -v -s {package}/tests From c62eb02f36f0a7052149f31376970ad5bf74ec7a Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Wed, 3 Apr 2024 17:31:24 +0200 Subject: [PATCH 039/403] Update publish.yml --- .github/workflows/publish.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index a7c4041b..34797a32 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -63,7 +63,7 @@ jobs: CIBW_TEST_SKIP: "*-macosx_arm64 *-macosx_universal2:arm64 *-manylinux_i686 *-win32" - name: Publish to PyPI - if: success() && github.event_name == 'push' && env.TWINE_PASSWORD != '' && github.ref == 'refs/heads/master' + if: success() && github.event_name == 'push' && env.TWINE_PASSWORD != '' env: TWINE_USERNAME: __token__ TWINE_PASSWORD: ${{ secrets.PYPI_TOKEN }} From 02b7d179c0cd07008fe2c1c53a66ec2a9fc4becd Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Wed, 3 Apr 2024 17:43:49 +0200 Subject: [PATCH 040/403] Update publish.yml --- .github/workflows/publish.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 34797a32..20d382db 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -12,7 +12,7 @@ jobs: # the result of the previous workflow (see the documentation page) if: ${{ github.event.workflow_run.conclusion == 'success' }} strategy: - fail-fast: false + fail-fast: true matrix: os: ["ubuntu-20.04", "windows-2019", "macos-11"] cp: ["cp37", "cp38", "cp39", "cp310", "cp311", "cp312"] @@ -63,7 +63,6 @@ jobs: CIBW_TEST_SKIP: "*-macosx_arm64 *-macosx_universal2:arm64 *-manylinux_i686 *-win32" - name: Publish to PyPI - if: success() && github.event_name == 'push' && env.TWINE_PASSWORD != '' env: TWINE_USERNAME: __token__ TWINE_PASSWORD: ${{ secrets.PYPI_TOKEN }} From 3a97bf2626352fd310a0add13f5636ec8bbe9c51 Mon Sep 17 00:00:00 2001 From: VaDiM Date: Wed, 3 Apr 2024 18:37:10 +0300 Subject: [PATCH 041/403] Texture2D - 2022 bugfix --- UnityPy/classes/Texture2D.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UnityPy/classes/Texture2D.py b/UnityPy/classes/Texture2D.py index cc53956d..dbcee08e 100644 --- a/UnityPy/classes/Texture2D.py +++ b/UnityPy/classes/Texture2D.py @@ -146,7 +146,7 @@ def __init__(self, reader): self.m_IgnoreMasterTextureLimit = reader.read_boolean() if version >= (2022, 2, 0): # 2022.2.0f1 and up self.m_IgnoreMipmapLimit = reader.read_boolean() - self.align_stream() + reader.align_stream() self.m_MipmapLimitGroupName = reader.read_aligned_string() if (3,) <= version[:2] <= (5, 4): # 3.0 - 5.4 self.m_ReadAllowed = reader.read_boolean() From 2dfd6b02f67341e7548616acc14cfaabd7e558e3 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Wed, 3 Apr 2024 21:24:40 +0200 Subject: [PATCH 042/403] bump to 1.10.13 --- UnityPy/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UnityPy/__init__.py b/UnityPy/__init__.py index bce3802c..9b632629 100644 --- a/UnityPy/__init__.py +++ b/UnityPy/__init__.py @@ -1,4 +1,4 @@ -__version__ = "1.10.12" +__version__ = "1.10.13" from .environment import Environment from .helpers.ArchiveStorageManager import set_assetbundle_decrypt_key From e7f948e6e793f82b6497b522920e3741b2685894 Mon Sep 17 00:00:00 2001 From: mos9527 Date: Wed, 5 Jun 2024 13:39:50 +0800 Subject: [PATCH 043/403] Mesh - Read m_CookingOptions when Unity version is 2022.1 or higher --- UnityPy/classes/Mesh.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/UnityPy/classes/Mesh.py b/UnityPy/classes/Mesh.py index 1985bdd6..6a500421 100644 --- a/UnityPy/classes/Mesh.py +++ b/UnityPy/classes/Mesh.py @@ -494,6 +494,10 @@ def __init__(self, reader): m_CollisionVertexCount = reader.read_int() self.m_MeshUsageFlags = reader.read_int() + + if version >= (2022, 1): # 2022.1 and up + self.m_CookingOptions = reader.read_int() + if version >= (5,): # 5.0 and up self.m_BakedConvexCollisionMesh = reader.read_bytes(reader.read_int()) reader.align_stream() From 5aba049193fca8eee644d5b51670049c9550b367 Mon Sep 17 00:00:00 2001 From: mos9527 Date: Wed, 5 Jun 2024 13:46:31 +0800 Subject: [PATCH 044/403] AnimationClip - Read isIntCurve when Unity version is 2022.1 or higher --- UnityPy/classes/AnimationClip.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/UnityPy/classes/AnimationClip.py b/UnityPy/classes/AnimationClip.py index 531f87f3..ba5e330e 100644 --- a/UnityPy/classes/AnimationClip.py +++ b/UnityPy/classes/AnimationClip.py @@ -519,6 +519,8 @@ def __init__(self, reader): self.typeID = ClassIDType(reader.read_u_short()) self.customType = reader.read_byte() self.isPPtrCurve = reader.read_byte() + if version >= (2022, 1): # 2022.1 and up + self.isIntCurve = reader.read_byte() reader.align_stream() From bb197d98ebe54b7e35113b3be6ea1eb391638242 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Thu, 6 Jun 2024 22:04:22 +0200 Subject: [PATCH 045/403] test.yml - upgrade python version to 3.10 --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index c56b5df2..76fe8eb5 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -25,7 +25,7 @@ jobs: - name: Set up Python uses: actions/setup-python@v4 with: - python-version: "3.7" + python-version: "3.10" - name: Install Dependencies run: | From e4ae7b382c78c3be92bb69f730702b13a204076c Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Tue, 11 Jun 2024 17:24:24 +0200 Subject: [PATCH 046/403] Skip MacOS workflow tests (#242) --- .github/workflows/publish.yml | 2 +- .github/workflows/test.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 20d382db..83b0b723 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -60,7 +60,7 @@ jobs: CIBW_REPAIR_WHEEL_COMMAND_LINUX: 'mv {wheel} {dest_dir}/"$(basename {wheel} | sed "s/-linux_/-manylinux_2_17_/")"' CIBW_TEST_REQUIRES: pytest CIBW_TEST_COMMAND: pytest -v -s {package}/tests - CIBW_TEST_SKIP: "*-macosx_arm64 *-macosx_universal2:arm64 *-manylinux_i686 *-win32" + CIBW_TEST_SKIP: "*-macosx* *-manylinux_i686 *-win32" - name: Publish to PyPI env: diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 76fe8eb5..f72bb70e 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -13,7 +13,7 @@ jobs: strategy: fail-fast: false matrix: - os: ["ubuntu-latest", "macOS-latest", "windows-latest"] + os: ["ubuntu-latest", "windows-latest"] runs-on: ${{ matrix.os }} name: ${{ matrix.os }} From aa83c2e2cc38ea5fb9eb2e23f8234f49c340254a Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Tue, 11 Jun 2024 17:24:52 +0200 Subject: [PATCH 047/403] 1.10.14 version bump --- UnityPy/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UnityPy/__init__.py b/UnityPy/__init__.py index 9b632629..7f446a28 100644 --- a/UnityPy/__init__.py +++ b/UnityPy/__init__.py @@ -1,4 +1,4 @@ -__version__ = "1.10.13" +__version__ = "1.10.14" from .environment import Environment from .helpers.ArchiveStorageManager import set_assetbundle_decrypt_key From 549b404be57a1d8e4d95c5e146b6ed9b5714608a Mon Sep 17 00:00:00 2001 From: 0x07E5 <120720697+0x07E5@users.noreply.github.com> Date: Sat, 27 Jul 2024 07:41:36 +0800 Subject: [PATCH 048/403] Fix a bug when read UnityRaw (#248) --- UnityPy/files/BundleFile.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/UnityPy/files/BundleFile.py b/UnityPy/files/BundleFile.py index 4c2d8498..bb2060cc 100644 --- a/UnityPy/files/BundleFile.py +++ b/UnityPy/files/BundleFile.py @@ -37,7 +37,7 @@ def __init__( if signature == "UnityArchive": raise NotImplementedError("BundleFile - UnityArchive") elif signature in ["UnityWeb", "UnityRaw"]: - m_DirectoryInfo, blocksReader = self.read_web_raw(reader) + m_DirectoryInfo, blocksReader = self.read_web_raw(reader, signature == "UnityWeb") elif signature == "UnityFS": m_DirectoryInfo, blocksReader = self.read_fs(reader) else: @@ -45,7 +45,7 @@ def __init__( self.read_files(blocksReader, m_DirectoryInfo) - def read_web_raw(self, reader: EndianBinaryReader): + def read_web_raw(self, reader: EndianBinaryReader, is_compressed = True): # def read_header_and_blocks_info(self, reader:EndianBinaryReader): version = self.version if version >= 4: @@ -71,7 +71,7 @@ def read_web_raw(self, reader: EndianBinaryReader): uncompressedBytes = CompressionHelper.decompress_lzma( reader.read_bytes(compressedSize) - ) + ) if is_compressed else reader.read_bytes(uncompressedSize) blocksReader = EndianBinaryReader(uncompressedBytes, offset=headerSize) nodesCount = blocksReader.read_int() From f0a921258b58be0f5b371cd233bf6f142c625f10 Mon Sep 17 00:00:00 2001 From: EndOfFile <61620805+EoF-1141@users.noreply.github.com> Date: Sat, 27 Jul 2024 07:47:21 +0800 Subject: [PATCH 049/403] Add split file reading (#243) When loading split files it's possible the required dependency without containing info about being split. This will search for split files and load them accordingly --- UnityPy/environment.py | 39 +++++++++++++++++++-------------------- 1 file changed, 19 insertions(+), 20 deletions(-) diff --git a/UnityPy/environment.py b/UnityPy/environment.py index ff790d33..6b210aca 100644 --- a/UnityPy/environment.py +++ b/UnityPy/environment.py @@ -81,6 +81,17 @@ def load(self, files: list): } ) + def _load_split_file(self, basename): + file = [] + for i in range(0, 999): + item = f"{basename}.split{i}" + if self.fs.exists(item): + with self.fs.open(item, "rb") as f: + file.append(f.read()) + elif i: + break + return b"".join(file) + def load_file( self, file: Union[io.IOBase, str], @@ -95,29 +106,25 @@ def load_file( split_match = reSplit.match(file) if split_match: basepath, basename = split_match.groups() - file = [] - for i in range(0, 999): - item = f"{basepath}.split{i}" - if self.fs.exists(item): - with self.fs.open(item, "rb") as f: - file.append(f.read()) - elif i: - break name = basepath - file = b"".join(file) + file = self._load_split_file(name) else: name = file if not os.path.exists(file): # relative paths are in the asset directory, not the cwd if not os.path.isabs(file): file = os.path.join(self.path, file) + # for dependency loading of split files + if os.path.exists(f"{file}.split0"): + file = self._load_split_file(file) # Unity paths are case insensitive, so we need to find "Resources/Foo.asset" when the record says "resources/foo.asset" - if not os.path.exists(file): + elif not os.path.exists(file): file = ImportHelper.find_sensitive_path(self.path, file) # nonexistent files might be packaging errors or references to Unity's global Library/ if file is None: return - file = self.fs.open(file, "rb") + if type(file) == str: + file = self.fs.open(file, "rb") typ, reader = ImportHelper.check_file_type(file) @@ -273,15 +280,7 @@ def load_assets(self, assets: List[str], open_f: Callable[[str], io.IOBase]): continue split_files.append(basepath) - data = [] - for i in range(0, 999): - item = f"{basepath}.split{i}" - if item in assets: - with open_f(item) as f: - data.append(f.read()) - elif i: - break - data = b"".join(data) + data = self._load_split_file(basepath) path = basepath else: data = open_f(path).read() From 7f4f29a0656a979cb160c5bca642df69db208ba5 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Sun, 28 Jul 2024 00:56:35 +0200 Subject: [PATCH 050/403] Texture, Texture2D, Sprite - 2023 (#249) * Sprite.py - 2023 * Texture-23 * Update Texture2D.py * Update Texture.py --- UnityPy/classes/Sprite.py | 8 ++++++++ UnityPy/classes/Texture.py | 16 ++++++++-------- UnityPy/classes/Texture2D.py | 30 ++++++++++++++++++++++++++---- 3 files changed, 42 insertions(+), 12 deletions(-) diff --git a/UnityPy/classes/Sprite.py b/UnityPy/classes/Sprite.py index a5a1761b..06bc8bb0 100644 --- a/UnityPy/classes/Sprite.py +++ b/UnityPy/classes/Sprite.py @@ -52,6 +52,9 @@ def __init__(self, reader): m_BonesSize = reader.read_int() self.m_Bones = [SpriteBone(self.reader) for _ in range(m_BonesSize)] + if version >= (2023, 1, 0, 14): + self.m_ScriptableObjects = [PPtr(reader) for _ in range(reader.read_int())] + def save(self, writer: EndianBinaryWriter = None): if writer is None: writer = EndianBinaryWriter(endian=self.reader.endian) @@ -92,6 +95,11 @@ def save(self, writer: EndianBinaryWriter = None): for bone in self.m_Bones: bone.save(writer, version) + if version >= (2023, 1, 0, 14): + writer.write_int(len(self.m_ScriptableObjects)) + for obj in self.m_ScriptableObjects: + obj.save(writer) + self.set_raw_data(writer.bytes) diff --git a/UnityPy/classes/Texture.py b/UnityPy/classes/Texture.py index 652ea1b6..2b6bfe03 100644 --- a/UnityPy/classes/Texture.py +++ b/UnityPy/classes/Texture.py @@ -5,18 +5,18 @@ class Texture(NamedObject): def __init__(self, reader): super().__init__(reader=reader) - if self.version >= (2017, 3): # 2017.3 and up + if (2017, 3) <= self.version < (2023, 2, 0, 18): # 2017.3 - 2023.2.0.18 self.m_ForcedFallbackFormat = reader.read_int() self.m_DownscaleFallback = reader.read_boolean() - if self.version >= (2020,2): # 2020.2 and up - self.m_IsAlphaChannelOptional = reader.read_boolean() - reader.align_stream() + if self.version >= (2020, 2): # 2020.2 and up + self.m_IsAlphaChannelOptional = reader.read_boolean() + reader.align_stream() def save(self, writer: EndianBinaryWriter): super().save(writer) - if self.version >= (2017, 3): # 2017.3 and up + if (2017, 3) <= self.version < (2023, 2, 0, 18): # 2017.3 - 2023.2.0.18 writer.write_int(self.m_ForcedFallbackFormat) writer.write_boolean(self.m_DownscaleFallback) - if self.version >= (2020,2): # 2020.2 and up - writer.write_boolean(self.m_IsAlphaChannelOptional) - writer.align_stream() + if self.version >= (2020, 2): # 2020.2 and up + writer.write_boolean(self.m_IsAlphaChannelOptional) + writer.align_stream() diff --git a/UnityPy/classes/Texture2D.py b/UnityPy/classes/Texture2D.py index dbcee08e..47a09c69 100644 --- a/UnityPy/classes/Texture2D.py +++ b/UnityPy/classes/Texture2D.py @@ -142,12 +142,23 @@ def __init__(self, reader): self.m_IsReadable = reader.read_boolean() # 2.6 and up if version >= (2020,): # 2020.1 and up self.m_IsPreProcessed = reader.read_boolean() - if (2019, 3) <= version < (2022, 2, 0): # 2019.3.0f6 - 2022.2.0a18 + if (2019, 3) <= version < (2022, 2, 0, 3) or (2023, 1, 0, 1) <= version < ( + 2023, + 1, + 0, + 8, + ): # 2019.3.0f6 - 2022.2.0a18 self.m_IgnoreMasterTextureLimit = reader.read_boolean() - if version >= (2022, 2, 0): # 2022.2.0f1 and up + if (2022, 2, 0, 3) <= version < (2023, 1, 0, 1) or version >= ( + 2023, + 1, + 0, + 8, + ): # 2022.2.0f1 and up self.m_IgnoreMipmapLimit = reader.read_boolean() reader.align_stream() self.m_MipmapLimitGroupName = reader.read_aligned_string() + if (3,) <= version[:2] <= (5, 4): # 3.0 - 5.4 self.m_ReadAllowed = reader.read_boolean() if version >= (2018, 2): # 2018.2 and up @@ -201,12 +212,23 @@ def save(self, writer: EndianBinaryWriter = None): writer.write_boolean(self.m_IsReadable) # 2.6 and up if version >= (2020,): # 2020.1 and up writer.write_boolean(self.m_IsPreProcessed) - if (2019, 3) <= version < (2022, 2, 0): # 2019.3.0f6 - 2022.2.0a18 + if (2019, 3) <= version < (2022, 2, 0, 3) or (2023, 1, 0, 1) <= version < ( + 2023, + 1, + 0, + 8, + ): # 2019.3.0f6 - 2022.2.0a18 writer.write_boolean(self.m_IgnoreMasterTextureLimit) - if version >= (2022, 2, 0): # 2022.2.0f1 and up + if (2022, 2, 0, 3) <= version < (2023, 1, 0, 1) or version >= ( + 2023, + 1, + 0, + 8, + ): # 2022.2.0f1 and up writer.write_boolean(self.m_IgnoreMipmapLimit) writer.align_stream() writer.write_aligned_string(self.m_MipmapLimitGroupName) + if (3,) <= version[:2] <= (5, 4): # 3.0 - 5.4 writer.write_boolean(self.m_ReadAllowed) # 3.0 - 5.4 if version >= (2018, 2): # 2018.2 and up From 1a6d5dcc536696ecfd5a141cccdb8686abc5ab0e Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Wed, 31 Jul 2024 00:48:11 +0200 Subject: [PATCH 051/403] Sprite - fix SecondarySpriteTexture - read_aligned_string instead of read_string_to_null --- UnityPy/classes/Sprite.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/UnityPy/classes/Sprite.py b/UnityPy/classes/Sprite.py index 06bc8bb0..4eb17a60 100644 --- a/UnityPy/classes/Sprite.py +++ b/UnityPy/classes/Sprite.py @@ -106,11 +106,11 @@ def save(self, writer: EndianBinaryWriter = None): class SecondarySpriteTexture: def __init__(self, reader): self.texture = PPtr(reader) # Texture2D - self.name = reader.read_string_to_null() + self.name = reader.read_aligned_string() def save(self, writer): self.texture.save(writer) - writer.write_string_to_null(self.name) + writer.write_aligned_string(self.name) class SpriteSettings: From df73acbd416bde000e3b30fa548349bcc38bce3b Mon Sep 17 00:00:00 2001 From: 0x07E5 <120720697+0x07E5@users.noreply.github.com> Date: Sat, 31 Aug 2024 06:38:02 +0800 Subject: [PATCH 052/403] Fix LZMA Compression (unity specific) (#246) --- UnityPy/helpers/CompressionHelper.py | 31 +++++++++++++++++++++------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/UnityPy/helpers/CompressionHelper.py b/UnityPy/helpers/CompressionHelper.py index f6233b5a..48b1a127 100644 --- a/UnityPy/helpers/CompressionHelper.py +++ b/UnityPy/helpers/CompressionHelper.py @@ -49,14 +49,29 @@ def compress_lzma(data: bytes) -> bytes: :return: compressed data :rtype: bytes """ - ec = lzma.LZMACompressor( - format=lzma.FORMAT_RAW, - filters=[ - {"id": lzma.FILTER_LZMA1, "dict_size": 524288, "lc": 3, "lp": 0, "pb": 2, } - ], - ) - ec.compress(data) - return b"]\x00\x00\x08\x00" + ec.flush() + compressor = lzma.LZMACompressor(format=lzma.FORMAT_ALONE, filters=[{ + "id": lzma.FILTER_LZMA1, + "dict_size": 524288, + "lc": 3, + "lp": 0, + "pb": 2, + }]) + compressed_data = compressor.compress(data) + compressor.flush() + + # Extract the header + header = bytearray(compressed_data[:13]) + compressed_body = compressed_data[13:] + + # Decompressed size (adjust this value according to your data) + decompressed_size = len(data) + + # Manually set the decompressed size in the header + header[5:13] = decompressed_size.to_bytes(8, 'little') + + # Combine the header and the compressed body + final_compressed_data = header + compressed_body + + return final_compressed_data # LZ4 From e6a775955b47a106437caceeaa7702aed173e181 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Wed, 4 Sep 2024 11:28:27 +0200 Subject: [PATCH 053/403] fix importlib.resource not finding UnityPy/resources/uncompressed.tpk --- UnityPy/resources/__init__.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 UnityPy/resources/__init__.py diff --git a/UnityPy/resources/__init__.py b/UnityPy/resources/__init__.py new file mode 100644 index 00000000..e69de29b From df701bf27db5d6691c7ecbc05a8ab3552fca5170 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Wed, 4 Sep 2024 13:05:07 +0200 Subject: [PATCH 054/403] Fix LZMA issues related to BundleFile-Web and compression (#257) * CompressionHelper - lzma - add option to read/save length and use better params for compression * BundleFile - web - decompress lzma with decompressed size * CompresseionHelper - lzma - use the size of the compressed_data for the struct string formating closes #250 closes #253 solves #237 --- UnityPy/files/BundleFile.py | 12 ++++-- UnityPy/helpers/CompressionHelper.py | 57 ++++++++++++++-------------- 2 files changed, 37 insertions(+), 32 deletions(-) diff --git a/UnityPy/files/BundleFile.py b/UnityPy/files/BundleFile.py index bb2060cc..054c623c 100644 --- a/UnityPy/files/BundleFile.py +++ b/UnityPy/files/BundleFile.py @@ -37,7 +37,9 @@ def __init__( if signature == "UnityArchive": raise NotImplementedError("BundleFile - UnityArchive") elif signature in ["UnityWeb", "UnityRaw"]: - m_DirectoryInfo, blocksReader = self.read_web_raw(reader, signature == "UnityWeb") + m_DirectoryInfo, blocksReader = self.read_web_raw( + reader, signature == "UnityWeb" + ) elif signature == "UnityFS": m_DirectoryInfo, blocksReader = self.read_fs(reader) else: @@ -69,9 +71,11 @@ def read_web_raw(self, reader: EndianBinaryReader, is_compressed = True): reader.Position = headerSize - uncompressedBytes = CompressionHelper.decompress_lzma( - reader.read_bytes(compressedSize) - ) if is_compressed else reader.read_bytes(uncompressedSize) + uncompressedBytes = reader.read_bytes(compressedSize) + if is_compressed: + uncompressedBytes = CompressionHelper.decompress_lzma( + uncompressedBytes, True + ) blocksReader = EndianBinaryReader(uncompressedBytes, offset=headerSize) nodesCount = blocksReader.read_int() diff --git a/UnityPy/helpers/CompressionHelper.py b/UnityPy/helpers/CompressionHelper.py index 48b1a127..28d496ed 100644 --- a/UnityPy/helpers/CompressionHelper.py +++ b/UnityPy/helpers/CompressionHelper.py @@ -10,7 +10,7 @@ # LZMA -def decompress_lzma(data: bytes) -> bytes: +def decompress_lzma(data: bytes, read_decompressed_size: bool = False) -> bytes: """decompresses lzma-compressed data :param data: compressed data @@ -21,9 +21,9 @@ def decompress_lzma(data: bytes) -> bytes: """ props, dict_size = struct.unpack(" bytes: } ], ) - return dec.decompress(data[5:]) + data_offset = 13 if read_decompressed_size else 5 + return dec.decompress(data[data_offset:]) -def compress_lzma(data: bytes) -> bytes: +def compress_lzma(data: bytes, write_decompressed_size: bool = False) -> bytes: """compresses data via lzma (unity specific) The current static settings may not be the best solution, but they are the most commonly used values and should therefore be enough for the time being. @@ -49,29 +50,29 @@ def compress_lzma(data: bytes) -> bytes: :return: compressed data :rtype: bytes """ - compressor = lzma.LZMACompressor(format=lzma.FORMAT_ALONE, filters=[{ - "id": lzma.FILTER_LZMA1, - "dict_size": 524288, - "lc": 3, - "lp": 0, - "pb": 2, - }]) - compressed_data = compressor.compress(data) + compressor.flush() - - # Extract the header - header = bytearray(compressed_data[:13]) - compressed_body = compressed_data[13:] - - # Decompressed size (adjust this value according to your data) - decompressed_size = len(data) - - # Manually set the decompressed size in the header - header[5:13] = decompressed_size.to_bytes(8, 'little') - - # Combine the header and the compressed body - final_compressed_data = header + compressed_body + dict_size = 0x800000 # 1 << 23 + compressor = lzma.LZMACompressor( + format=lzma.FORMAT_RAW, + filters=[ + { + "id": lzma.FILTER_LZMA1, + "dict_size": dict_size, + "lc": 3, + "lp": 0, + "pb": 2, + "mode": lzma.MODE_NORMAL, + "mf": lzma.MF_BT4, + "nice_len": 123, + } + ], + ) - return final_compressed_data + compressed_data = compressor.compress(data) + compressor.flush() + cdl = len(compressed_data) + if write_decompressed_size: + return struct.pack(f" Date: Wed, 4 Sep 2024 19:40:58 +0800 Subject: [PATCH 055/403] Implement saving Unity Web and Raw bundles (#247) * Implement saving Unity Web and Raw bundles * Check signature before compression * BundleFile - save_web_raw - small cleanup, better header length, version>=4 support --------- Co-authored-by: Rudolf Kolbe --- UnityPy/files/BundleFile.py | 117 +++++++++++++++++++++++++++++++----- 1 file changed, 103 insertions(+), 14 deletions(-) diff --git a/UnityPy/files/BundleFile.py b/UnityPy/files/BundleFile.py index 054c623c..6b88b2d2 100644 --- a/UnityPy/files/BundleFile.py +++ b/UnityPy/files/BundleFile.py @@ -37,9 +37,7 @@ def __init__( if signature == "UnityArchive": raise NotImplementedError("BundleFile - UnityArchive") elif signature in ["UnityWeb", "UnityRaw"]: - m_DirectoryInfo, blocksReader = self.read_web_raw( - reader, signature == "UnityWeb" - ) + m_DirectoryInfo, blocksReader = self.read_web_raw(reader) elif signature == "UnityFS": m_DirectoryInfo, blocksReader = self.read_fs(reader) else: @@ -47,12 +45,12 @@ def __init__( self.read_files(blocksReader, m_DirectoryInfo) - def read_web_raw(self, reader: EndianBinaryReader, is_compressed = True): + def read_web_raw(self, reader: EndianBinaryReader): # def read_header_and_blocks_info(self, reader:EndianBinaryReader): version = self.version if version >= 4: - _hash = reader.read_bytes(16) - crc = reader.read_u_int() + self._hash = reader.read_bytes(16) + self.crc = reader.read_u_int() minimumStreamedBytes = reader.read_u_int() headerSize = reader.read_u_int() @@ -72,10 +70,8 @@ def read_web_raw(self, reader: EndianBinaryReader, is_compressed = True): reader.Position = headerSize uncompressedBytes = reader.read_bytes(compressedSize) - if is_compressed: - uncompressedBytes = CompressionHelper.decompress_lzma( - uncompressedBytes, True - ) + if self.signature == "UnityWeb": + uncompressedBytes = CompressionHelper.decompress_lzma(uncompressedBytes, True) blocksReader = EndianBinaryReader(uncompressedBytes, offset=headerSize) nodesCount = blocksReader.read_int() @@ -219,10 +215,7 @@ def save(self, packer=None): if self.signature == "UnityArchive": raise NotImplementedError("BundleFile - UnityArchive") elif self.signature in ["UnityWeb", "UnityRaw"]: - raise NotImplementedError( - "Saving Unity Web and Raw bundles isn't supported yet" - ) - # self.save_web_raw(writer) + self.save_web_raw(writer) elif self.signature == "UnityFS": if not packer or packer == "none": self.save_fs(writer, 64, 64) @@ -403,6 +396,102 @@ def save_fs(self, writer: EndianBinaryWriter, data_flag: int, block_info_flag: i writer.write_long(writer_end_pos) writer.Position = writer_end_pos + + def save_web_raw(self, writer: EndianBinaryWriter): + # (version >= 4) hash + # (version >= 4) crc + # minimumStreamedBytes + # headerSize + # numberOfLevelsToDownloadBeforeStreaming + # levelCount + # compressedSize * levelCount + # uncompressedSize * levelCount + # (version >= 2) completeFileSize + # (version >= 3) file_info_header_size + # compressed assets + + if self.version > 3: + raise NotImplementedError("Saving Unity Web bundles with version > 3 is not supported") + + # Calculate fileInfoHeaderSize for set offsets + file_info_header_size = 4 # for nodesCount + + for file_name in self.files.keys(): + file_info_header_size += len(file_name.encode()) + 1 # +1 for null terminator + file_info_header_size += 4 * 2 # 4 bytes each for offset and size + + file_info_header_padding_size = 4 - (file_info_header_size % 4) if file_info_header_size % 4 != 0 else 0 + file_info_header_size += file_info_header_padding_size + + # Prepare directory info + directory_info_writer = EndianBinaryWriter() + directory_info_writer.write_int(len(self.files)) # nodesCount + + file_content_writer = EndianBinaryWriter() + current_offset = file_info_header_size + + for file_name, f in self.files.items(): + directory_info_writer.write_string_to_null(file_name) + directory_info_writer.write_u_int(current_offset) + + # Get file content + if isinstance(f, (EndianBinaryReader, EndianBinaryWriter)): + file_data = f.bytes + else: + file_data = f.save() + + file_size = len(file_data) + directory_info_writer.write_u_int(file_size) + + file_content_writer.write_bytes(file_data) + current_offset += file_size + + directory_info_writer.write(b'\x00' * file_info_header_padding_size) + uncompressed_directory_info = directory_info_writer.bytes + uncompressed_file_content = file_content_writer.bytes + + # Combine directory info and file content + uncompressed_content = uncompressed_directory_info + uncompressed_file_content + compressed_content = uncompressed_content + if self.signature == "UnityWeb": + compressed_content = CompressionHelper.compress_lzma(uncompressed_content, True) + + # Write header + header_size = writer.Position + 24 # assuming levelCount = 1 + if self.version >= 2: + header_size += 4 + if self.version >= 3: + header_size += 4 + if self.version >= 4: + header_size += 20 + # pad to multiple of 4 + header_size = (header_size + 3) & ~3 + + if self.version >= 4: + writer.write_bytes(self._hash) + writer.write_u_int(self.crc) + + writer.write_u_int(header_size + len(compressed_content)) # minimumStreamedBytes (same as completeFileSize) + writer.write_u_int(header_size) # headerSize + writer.write_u_int(1) # numberOfLevelsToDownloadBeforeStreaming (always 1) + writer.write_int(1) # levelCount (always 1) + + writer.write_u_int(len(compressed_content)) # compressedSize + writer.write_u_int(len(uncompressed_content)) # uncompressedSize + + if self.version >= 2: + writer.write_u_int(header_size + len(compressed_content)) # completeFileSize + + if self.version >= 3: + writer.write_u_int(file_info_header_size) # file_info_header_size + + # align header + writer.align_stream(4) + + # Write compressed content + writer.write(compressed_content) + + def decompress_data( self, compressed_data: bytes, From f16fca94dfe1a2de033e5cef566a1de427eeb741 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Wed, 4 Sep 2024 13:51:51 +0200 Subject: [PATCH 056/403] MeshRendererExporter - fix typo fixes #228 --- UnityPy/export/MeshRendererExporter.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/UnityPy/export/MeshRendererExporter.py b/UnityPy/export/MeshRendererExporter.py index 233b5878..604c30c5 100644 --- a/UnityPy/export/MeshRendererExporter.py +++ b/UnityPy/export/MeshRendererExporter.py @@ -1,4 +1,3 @@ -import os from ..classes import Renderer, SkinnedMeshRenderer, Material from .MeshExporter import export_mesh_obj @@ -17,7 +16,7 @@ def get_mesh(meshR: Renderer): def export_mesh_renderer(obj: Renderer, export_dir: str) -> None: - env = mesh.assets_file.enviroment + env = obj.assets_file.enviroment env.fs.makedirs(export_dir, exist_ok=True) meshR = obj.read() mesh = get_mesh(meshR) From 4d003ba78942bf89f1510791082cff57ae851e58 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Wed, 4 Sep 2024 14:01:35 +0200 Subject: [PATCH 057/403] publish.yml - add cp313 wheels --- .github/workflows/publish.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 83b0b723..30413011 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -15,7 +15,7 @@ jobs: fail-fast: true matrix: os: ["ubuntu-20.04", "windows-2019", "macos-11"] - cp: ["cp37", "cp38", "cp39", "cp310", "cp311", "cp312"] + cp: ["cp37", "cp38", "cp39", "cp310", "cp311", "cp312", "cp313"] name: ${{ matrix.os }} - ${{ matrix.cp }} From 739615e717c2cca5a326ed129e617c184e6f49b2 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Wed, 4 Sep 2024 19:48:00 +0200 Subject: [PATCH 058/403] bump version to 1.10.15 --- UnityPy/__init__.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/UnityPy/__init__.py b/UnityPy/__init__.py index 7f446a28..b6107549 100644 --- a/UnityPy/__init__.py +++ b/UnityPy/__init__.py @@ -1,7 +1,9 @@ -__version__ = "1.10.14" +__version__ = "1.10.15" -from .environment import Environment -from .helpers.ArchiveStorageManager import set_assetbundle_decrypt_key +from .environment import Environment as Environment +from .helpers.ArchiveStorageManager import ( + set_assetbundle_decrypt_key as set_assetbundle_decrypt_key, +) def load(*args, fs=None, **kwargs): From 5f403517c3b1dd08b5f49662f938a529bdc33e21 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Wed, 4 Sep 2024 20:48:53 +0200 Subject: [PATCH 059/403] publish.yml - use cibuildwheel 2.20 --- .github/workflows/publish.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 30413011..9ac69133 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -42,7 +42,7 @@ jobs: platforms: all - name: Build wheels - uses: pypa/cibuildwheel@v2.17.0 + uses: pypa/cibuildwheel@v2.20.0 env: CIBW_ARCHS_LINUX: auto aarch64 CIBW_ARCHS_MACOS: x86_64 arm64 universal2 From 9bd7266cd32cdb2e15115e40803228c5fff29a62 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Thu, 5 Sep 2024 10:45:06 +0200 Subject: [PATCH 060/403] Mesh export float accuracy fix (#258) * MeshExporter - use 9 significant float digits instead of 7 * Test: MeshExporter - obj precision fix --- UnityPy/export/MeshExporter.py | 6 +- tests/samples/xinzexi_2_n_tex_mesh | 1448 ++++++++++++++-------------- 2 files changed, 727 insertions(+), 727 deletions(-) diff --git a/UnityPy/export/MeshExporter.py b/UnityPy/export/MeshExporter.py index db68c8a9..d55814af 100644 --- a/UnityPy/export/MeshExporter.py +++ b/UnityPy/export/MeshExporter.py @@ -24,7 +24,7 @@ def export_mesh_obj(m_Mesh, material_names: list = None): for v in range(int(m_Mesh.m_VertexCount)): sb.append( - "v {0:.7G} {1:.7G} {2:.7G}\r\n".format( + "v {0:.9G} {1:.9G} {2:.9G}\r\n".format( -m_Mesh.m_Vertices[v * c], m_Mesh.m_Vertices[v * c + 1], m_Mesh.m_Vertices[v * c + 2], @@ -41,7 +41,7 @@ def export_mesh_obj(m_Mesh, material_names: list = None): for v in range(int(m_Mesh.m_VertexCount)): sb.append( - "vt {0:.7G} {1:.7G}\r\n".format( + "vt {0:.9G} {1:.9G}\r\n".format( m_Mesh.m_UV0[v * c], m_Mesh.m_UV0[v * c + 1] ).replace("nan", "0") ) @@ -56,7 +56,7 @@ def export_mesh_obj(m_Mesh, material_names: list = None): for v in range(int(m_Mesh.m_VertexCount)): sb.append( - "vn {0:.7G} {1:.7G} {2:.7G}\r\n".format( + "vn {0:.9G} {1:.9G} {2:.9G}\r\n".format( -m_Mesh.m_Normals[v * c], m_Mesh.m_Normals[v * c + 1], m_Mesh.m_Normals[v * c + 2], diff --git a/tests/samples/xinzexi_2_n_tex_mesh b/tests/samples/xinzexi_2_n_tex_mesh index 0a57a2ec..b0231623 100644 --- a/tests/samples/xinzexi_2_n_tex_mesh +++ b/tests/samples/xinzexi_2_n_tex_mesh @@ -723,730 +723,730 @@ v -896 1439 0 v -896 1471 0 v -928 1471 0 v -928 1439 0 -vt 0.0004882812 0.001024604 -vt 0.0004882812 0.6895492 -vt 0.1411133 0.6895492 -vt 0.1411133 0.001024604 -vt 0.1420898 0.001024604 -vt 0.1420898 0.6567623 -vt 0.2827148 0.6567623 -vt 0.2827148 0.001024604 -vt 0.2836914 0.001024604 -vt 0.2836914 0.3288934 -vt 0.4399414 0.3288934 -vt 0.4399414 0.001024604 -vt 0.440918 0.001024604 -vt 0.440918 0.3288934 -vt 0.597168 0.3288934 -vt 0.597168 0.001024604 -vt 0.5981445 0.001024604 -vt 0.5981445 0.2961066 -vt 0.7543945 0.2961066 -vt 0.7543945 0.001024604 -vt 0.7553711 0.001024604 -vt 0.7553711 0.2961066 -vt 0.8959961 0.2961066 -vt 0.8959961 0.001024604 -vt 0.8969727 0.001024604 -vt 0.8969727 0.2961066 -vt 0.9907227 0.2961066 -vt 0.9907227 0.001024604 -vt 0.5981445 0.2981557 -vt 0.5981445 0.5932377 -vt 0.6918945 0.5932377 -vt 0.6918945 0.2981557 -vt 0.6928711 0.2981557 -vt 0.6928711 0.5604508 -vt 0.7866211 0.5604508 -vt 0.7866211 0.2981557 -vt 0.7875977 0.2981557 -vt 0.7875977 0.5604508 -vt 0.8813477 0.5604508 -vt 0.8813477 0.2981557 -vt 0.8823242 0.2981557 -vt 0.8823242 0.5604508 -vt 0.9448242 0.5604508 -vt 0.9448242 0.2981557 -vt 0.2836914 0.3309426 -vt 0.2836914 0.494877 -vt 0.3774414 0.494877 -vt 0.3774414 0.3309426 -vt 0.378418 0.3309426 -vt 0.378418 0.494877 -vt 0.456543 0.494877 -vt 0.456543 0.3309426 -vt 0.9458008 0.2981557 -vt 0.9458008 0.6915984 -vt 0.9770508 0.6915984 -vt 0.9770508 0.2981557 -vt 0.4575195 0.3309426 -vt 0.4575195 0.6915984 -vt 0.4887695 0.6915984 -vt 0.4887695 0.3309426 -vt 0.2836914 0.4969262 -vt 0.2836914 0.5952868 -vt 0.3930664 0.5952868 -vt 0.3930664 0.4969262 -vt 0.4897461 0.3309426 -vt 0.4897461 0.5604508 -vt 0.5366211 0.5604508 -vt 0.5366211 0.3309426 -vt 0.4897461 0.5625 -vt 0.4897461 0.6936475 -vt 0.5678711 0.6936475 -vt 0.5678711 0.5625 -vt 0.6928711 0.5625 -vt 0.6928711 0.6936475 -vt 0.7709961 0.6936475 -vt 0.7709961 0.5625 -vt 0.394043 0.4969262 -vt 0.394043 0.6608607 -vt 0.456543 0.6608607 -vt 0.456543 0.4969262 -vt 0.7719727 0.5625 -vt 0.7719727 0.7592213 -vt 0.8188477 0.7592213 -vt 0.8188477 0.5625 -vt 0.8198242 0.5625 -vt 0.8198242 0.6280738 -vt 0.9448242 0.6280738 -vt 0.9448242 0.5625 -vt 0.8198242 0.630123 -vt 0.8198242 0.6956967 -vt 0.9448242 0.6956967 -vt 0.9448242 0.630123 -vt 0.5981445 0.5952868 -vt 0.5981445 0.7264345 -vt 0.6450195 0.7264345 -vt 0.6450195 0.5952868 -vt 0.2836914 0.5973361 -vt 0.2836914 0.7284836 -vt 0.3305664 0.7284836 -vt 0.3305664 0.5973361 -vt 0.331543 0.5973361 -vt 0.331543 0.7284836 -vt 0.378418 0.7284836 -vt 0.378418 0.5973361 -vt 0.1420898 0.6588115 -vt 0.1420898 0.7571721 -vt 0.2045898 0.7571721 -vt 0.2045898 0.6588115 -vt 0.2055664 0.6588115 -vt 0.2055664 0.789959 -vt 0.2524414 0.789959 -vt 0.2524414 0.6588115 -vt 0.394043 0.6629099 -vt 0.394043 0.7612705 -vt 0.456543 0.7612705 -vt 0.456543 0.6629099 -vt 0.0004882812 0.6915984 -vt 0.0004882812 0.8227459 -vt 0.04736328 0.8227459 -vt 0.04736328 0.6915984 -vt 0.04833984 0.6915984 -vt 0.04833984 0.8227459 -vt 0.09521484 0.8227459 -vt 0.09521484 0.6915984 -vt 0.5688477 0.3309426 -vt 0.5688477 0.494877 -vt 0.5932617 0.494877 -vt 0.5932617 0.3309426 -vt 0.9458008 0.6936475 -vt 0.9458008 0.7920082 -vt 0.9926758 0.7920082 -vt 0.9926758 0.6936475 -vt 0.4897461 0.6956967 -vt 0.4897461 0.7940574 -vt 0.5366211 0.7940574 -vt 0.5366211 0.6956967 -vt 0.5981445 0.7284836 -vt 0.5981445 0.7612705 -vt 0.7387695 0.7612705 -vt 0.7387695 0.7284836 -vt 0.7719727 0.7612705 -vt 0.7719727 0.7940574 -vt 0.9125977 0.7940574 -vt 0.9125977 0.7612705 -vt 0.5688477 0.4969262 -vt 0.5688477 0.6280738 -vt 0.5932617 0.6280738 -vt 0.5932617 0.4969262 -vt 0.2836914 0.7305328 -vt 0.2836914 0.7961066 -vt 0.3461914 0.7961066 -vt 0.3461914 0.7305328 -vt 0.09619141 0.6915984 -vt 0.09619141 0.8227459 -vt 0.1274414 0.8227459 -vt 0.1274414 0.6915984 -vt 0.4575195 0.6936475 -vt 0.4575195 0.8247951 -vt 0.4887695 0.8247951 -vt 0.4887695 0.6936475 -vt 0.5375977 0.6956967 -vt 0.5375977 0.8268443 -vt 0.5688477 0.8268443 -vt 0.5688477 0.6956967 -vt 0.5698242 0.630123 -vt 0.5698242 0.8268443 -vt 0.5854492 0.8268443 -vt 0.5854492 0.630123 -vt 0.1420898 0.7592213 -vt 0.1420898 0.8247951 -vt 0.1889648 0.8247951 -vt 0.1889648 0.7592213 -vt 0.253418 0.6588115 -vt 0.253418 0.8555328 -vt 0.269043 0.8555328 -vt 0.269043 0.6588115 -vt 0.7397461 0.6956967 -vt 0.7397461 0.7940574 -vt 0.7709961 0.7940574 -vt 0.7709961 0.6956967 -vt 0.9135742 0.6977459 -vt 0.9135742 0.7633197 -vt 0.9448242 0.7633197 -vt 0.9448242 0.6977459 -vt 0.347168 0.7305328 -vt 0.347168 0.7961066 -vt 0.378418 0.7961066 -vt 0.378418 0.7305328 -vt 0.394043 0.7633197 -vt 0.394043 0.7961066 -vt 0.456543 0.7961066 -vt 0.456543 0.7633197 -vt 0.5981445 0.7633197 -vt 0.5981445 0.8288934 -vt 0.6293945 0.8288934 -vt 0.6293945 0.7633197 -vt 0.6303711 0.7633197 -vt 0.6303711 0.8288934 -vt 0.6616211 0.8288934 -vt 0.6616211 0.7633197 -vt 0.6625977 0.7633197 -vt 0.6625977 0.8288934 -vt 0.6938477 0.8288934 -vt 0.6938477 0.7633197 -vt 0.6948242 0.7633197 -vt 0.6948242 0.8288934 -vt 0.7260742 0.8288934 -vt 0.7260742 0.7633197 -vt 0.9135742 0.7653688 -vt 0.9135742 0.8309426 -vt 0.9448242 0.8309426 -vt 0.9448242 0.7653688 -vt 0.2055664 0.7920082 -vt 0.2055664 0.9231557 -vt 0.2211914 0.9231557 -vt 0.2211914 0.7920082 -vt 0.222168 0.7920082 -vt 0.222168 0.9231557 -vt 0.237793 0.9231557 -vt 0.237793 0.7920082 -vt 0.9458008 0.7940574 -vt 0.9458008 0.8596312 -vt 0.9770508 0.8596312 -vt 0.9770508 0.7940574 -vt 0.9780273 0.7940574 -vt 0.9780273 0.9252049 -vt 0.9936523 0.9252049 -vt 0.9936523 0.7940574 -vt 0.7397461 0.7961066 -vt 0.7397461 0.8288934 -vt 0.8022461 0.8288934 -vt 0.8022461 0.7961066 -vt 0.4897461 0.7961066 -vt 0.4897461 0.9272541 -vt 0.5053711 0.9272541 -vt 0.5053711 0.7961066 -vt 0.8032227 0.7961066 -vt 0.8032227 0.8288934 -vt 0.8657227 0.8288934 -vt 0.8657227 0.7961066 -vt 0.5063477 0.7961066 -vt 0.5063477 0.8944672 -vt 0.5219727 0.8944672 -vt 0.5219727 0.7961066 -vt 0.8666992 0.7961066 -vt 0.8666992 0.8944672 -vt 0.8823242 0.8944672 -vt 0.8823242 0.7961066 -vt 0.8833008 0.7961066 -vt 0.8833008 0.8944672 -vt 0.8989258 0.8944672 -vt 0.8989258 0.7961066 -vt 0.2836914 0.7981557 -vt 0.2836914 0.8965164 -vt 0.2993164 0.8965164 -vt 0.2993164 0.7981557 -vt 0.300293 0.7981557 -vt 0.300293 0.8965164 -vt 0.315918 0.8965164 -vt 0.315918 0.7981557 -vt 0.3168945 0.7981557 -vt 0.3168945 0.8965164 -vt 0.3325195 0.8965164 -vt 0.3325195 0.7981557 -vt 0.3334961 0.7981557 -vt 0.3334961 0.8309426 -vt 0.3803711 0.8309426 -vt 0.3803711 0.7981557 -vt 0.394043 0.7981557 -vt 0.394043 0.8309426 -vt 0.440918 0.8309426 -vt 0.440918 0.7981557 -vt 0.0004882812 0.8247951 -vt 0.0004882812 0.857582 -vt 0.04736328 0.857582 -vt 0.04736328 0.8247951 -vt 0.04833984 0.8247951 -vt 0.04833984 0.857582 -vt 0.09521484 0.857582 -vt 0.09521484 0.8247951 -vt 0.1420898 0.8268443 -vt 0.1420898 0.8596312 -vt 0.1889648 0.8596312 -vt 0.1889648 0.8268443 -vt 0.5375977 0.8288934 -vt 0.5375977 0.8616803 -vt 0.5844727 0.8616803 -vt 0.5844727 0.8288934 -vt 0.09619141 0.8247951 -vt 0.09619141 0.9231557 -vt 0.1118164 0.9231557 -vt 0.1118164 0.8247951 -vt 0.112793 0.8247951 -vt 0.112793 0.9231557 -vt 0.128418 0.9231557 -vt 0.128418 0.8247951 -vt 0.5981445 0.8309426 -vt 0.5981445 0.8637295 -vt 0.6450195 0.8637295 -vt 0.6450195 0.8309426 -vt 0.4575195 0.8268443 -vt 0.4575195 0.9252049 -vt 0.4731445 0.9252049 -vt 0.4731445 0.8268443 -vt 0.6459961 0.8309426 -vt 0.6459961 0.8965164 -vt 0.6616211 0.8965164 -vt 0.6616211 0.8309426 -vt 0.6625977 0.8309426 -vt 0.6625977 0.8965164 -vt 0.6782227 0.8965164 -vt 0.6782227 0.8309426 -vt 0.6791992 0.8309426 -vt 0.6791992 0.8637295 -vt 0.7104492 0.8637295 -vt 0.7104492 0.8309426 -vt 0.7114258 0.8309426 -vt 0.7114258 0.8637295 -vt 0.7426758 0.8637295 -vt 0.7426758 0.8309426 -vt 0.7436523 0.8309426 -vt 0.7436523 0.8637295 -vt 0.7749023 0.8637295 -vt 0.7749023 0.8309426 -vt 0.7758789 0.8309426 -vt 0.7758789 0.8965164 -vt 0.7915039 0.8965164 -vt 0.7915039 0.8309426 -vt 0.7924805 0.8309426 -vt 0.7924805 0.8965164 -vt 0.8081055 0.8965164 -vt 0.8081055 0.8309426 -vt 0.809082 0.8309426 -vt 0.809082 0.8965164 -vt 0.824707 0.8965164 -vt 0.824707 0.8309426 -vt 0.8256836 0.8309426 -vt 0.8256836 0.8965164 -vt 0.8413086 0.8965164 -vt 0.8413086 0.8309426 -vt 0.3334961 0.8329918 -vt 0.3334961 0.8657787 -vt 0.3647461 0.8657787 -vt 0.3647461 0.8329918 -vt 0.8422852 0.8309426 -vt 0.8422852 0.8965164 -vt 0.8579102 0.8965164 -vt 0.8579102 0.8309426 -vt 0.3657227 0.8329918 -vt 0.3657227 0.8985656 -vt 0.3813477 0.8985656 -vt 0.3813477 0.8329918 -vt 0.394043 0.8329918 -vt 0.394043 0.8985656 -vt 0.409668 0.8985656 -vt 0.409668 0.8329918 -vt 0.4106445 0.8329918 -vt 0.4106445 0.8985656 -vt 0.4262695 0.8985656 -vt 0.4262695 0.8329918 -vt 0.4272461 0.8329918 -vt 0.4272461 0.8985656 -vt 0.4428711 0.8985656 -vt 0.4428711 0.8329918 -vt 0.9135742 0.8329918 -vt 0.9135742 0.8985656 -vt 0.9291992 0.8985656 -vt 0.9291992 0.8329918 -vt 0.253418 0.857582 -vt 0.253418 0.9231557 -vt 0.269043 0.9231557 -vt 0.269043 0.857582 -vt 0.0004882812 0.8596312 -vt 0.0004882812 0.9252049 -vt 0.01611328 0.9252049 -vt 0.01611328 0.8596312 -vt 0.01708984 0.8596312 -vt 0.01708984 0.892418 -vt 0.04833984 0.892418 -vt 0.04833984 0.8596312 -vt 0.04931641 0.8596312 -vt 0.04931641 0.892418 -vt 0.08056641 0.892418 -vt 0.08056641 0.8596312 -vt 0.1420898 0.8616803 -vt 0.1420898 0.9272541 -vt 0.1577148 0.9272541 -vt 0.1577148 0.8616803 -vt 0.1586914 0.8616803 -vt 0.1586914 0.8944672 -vt 0.1899414 0.8944672 -vt 0.1899414 0.8616803 -vt 0.9458008 0.8616803 -vt 0.9458008 0.9272541 -vt 0.9614258 0.9272541 -vt 0.9614258 0.8616803 -vt 0.5375977 0.8637295 -vt 0.5375977 0.9293033 -vt 0.5532227 0.9293033 -vt 0.5532227 0.8637295 -vt 0.5541992 0.8637295 -vt 0.5541992 0.9293033 -vt 0.5698242 0.9293033 -vt 0.5698242 0.8637295 -vt 0.5708008 0.8637295 -vt 0.5708008 0.9293033 -vt 0.5864258 0.9293033 -vt 0.5864258 0.8637295 -vt 0.5981445 0.8657787 -vt 0.5981445 0.9313524 -vt 0.6137695 0.9313524 -vt 0.6137695 0.8657787 -vt 0.6147461 0.8657787 -vt 0.6147461 0.9313524 -vt 0.6303711 0.9313524 -vt 0.6303711 0.8657787 -vt 0.6791992 0.8657787 -vt 0.6791992 0.9313524 -vt 0.6948242 0.9313524 -vt 0.6948242 0.8657787 -vt 0.6958008 0.8657787 -vt 0.6958008 0.9313524 -vt 0.7114258 0.9313524 -vt 0.7114258 0.8657787 -vt 0.7124023 0.8657787 -vt 0.7124023 0.9313524 -vt 0.7280273 0.9313524 -vt 0.7280273 0.8657787 -vt 0.7290039 0.8657787 -vt 0.7290039 0.9313524 -vt 0.7446289 0.9313524 -vt 0.7446289 0.8657787 -vt 0.7456055 0.8657787 -vt 0.7456055 0.9313524 -vt 0.7612305 0.9313524 -vt 0.7612305 0.8657787 -vt 0.3334961 0.8678279 -vt 0.3334961 0.9006147 -vt 0.3647461 0.9006147 -vt 0.3647461 0.8678279 -vt 0.01708984 0.8944672 -vt 0.01708984 0.960041 -vt 0.03271484 0.960041 -vt 0.03271484 0.8944672 -vt 0.03369141 0.8944672 -vt 0.03369141 0.960041 -vt 0.04931641 0.960041 -vt 0.04931641 0.8944672 -vt 0.05029297 0.8944672 -vt 0.05029297 0.960041 -vt 0.06591797 0.960041 -vt 0.06591797 0.8944672 -vt 0.1586914 0.8965164 -vt 0.1586914 0.9293033 -vt 0.1899414 0.9293033 -vt 0.1899414 0.8965164 -vt 0.06689453 0.8944672 -vt 0.06689453 0.960041 -vt 0.08251953 0.960041 -vt 0.08251953 0.8944672 -vt 0.5063477 0.8965164 -vt 0.5063477 0.9620901 -vt 0.5219727 0.9620901 -vt 0.5219727 0.8965164 -vt 0.8666992 0.8965164 -vt 0.8666992 0.9293033 -vt 0.8979492 0.9293033 -vt 0.8979492 0.8965164 -vt 0.2836914 0.8985656 -vt 0.2836914 0.9641393 -vt 0.2993164 0.9641393 -vt 0.2993164 0.8985656 -vt 0.300293 0.8985656 -vt 0.300293 0.9641393 -vt 0.315918 0.9641393 -vt 0.315918 0.8985656 -vt 0.3168945 0.8985656 -vt 0.3168945 0.9641393 -vt 0.3325195 0.9641393 -vt 0.3325195 0.8985656 -vt 0.6459961 0.8985656 -vt 0.6459961 0.9641393 -vt 0.6616211 0.9641393 -vt 0.6616211 0.8985656 -vt 0.6625977 0.8985656 -vt 0.6625977 0.9641393 -vt 0.6782227 0.9641393 -vt 0.6782227 0.8985656 -vt 0.7758789 0.8985656 -vt 0.7758789 0.9641393 -vt 0.7915039 0.9641393 -vt 0.7915039 0.8985656 -vt 0.7924805 0.8985656 -vt 0.7924805 0.9313524 -vt 0.8237305 0.9313524 -vt 0.8237305 0.8985656 -vt 0.824707 0.8985656 -vt 0.824707 0.9313524 -vt 0.855957 0.9313524 -vt 0.855957 0.8985656 -vt 0.3657227 0.9006147 -vt 0.3657227 0.9661885 -vt 0.3813477 0.9661885 -vt 0.3813477 0.9006147 -vt 0.394043 0.9006147 -vt 0.394043 0.9661885 -vt 0.409668 0.9661885 -vt 0.409668 0.9006147 -vt 0.4106445 0.9006147 -vt 0.4106445 0.9661885 -vt 0.4262695 0.9661885 -vt 0.4262695 0.9006147 -vt 0.4272461 0.9006147 -vt 0.4272461 0.9661885 -vt 0.4428711 0.9661885 -vt 0.4428711 0.9006147 -vt 0.9135742 0.9006147 -vt 0.9135742 0.9334016 -vt 0.9448242 0.9334016 -vt 0.9448242 0.9006147 -vt 0.3334961 0.9026639 -vt 0.3334961 0.9682377 -vt 0.3491211 0.9682377 -vt 0.3491211 0.9026639 -vt 0.09619141 0.9252049 -vt 0.09619141 0.9579918 -vt 0.1274414 0.9579918 -vt 0.1274414 0.9252049 -vt 0.2055664 0.9252049 -vt 0.2055664 0.9907787 -vt 0.2211914 0.9907787 -vt 0.2211914 0.9252049 -vt 0.222168 0.9252049 -vt 0.222168 0.9907787 -vt 0.237793 0.9907787 -vt 0.237793 0.9252049 -vt 0.4575195 0.9272541 -vt 0.4575195 0.960041 -vt 0.4887695 0.960041 -vt 0.4887695 0.9272541 -vt 0.253418 0.9252049 -vt 0.253418 0.9907787 -vt 0.269043 0.9907787 -vt 0.269043 0.9252049 -vt 0.0004882812 0.9272541 -vt 0.0004882812 0.9928279 -vt 0.01611328 0.9928279 -vt 0.01611328 0.9272541 -vt 0.9458008 0.9293033 -vt 0.9458008 0.9620901 -vt 0.9770508 0.9620901 -vt 0.9770508 0.9293033 -vt 0.9780273 0.9272541 -vt 0.9780273 0.960041 -vt 0.9936523 0.960041 -vt 0.9936523 0.9272541 -vt 0.1420898 0.9293033 -vt 0.1420898 0.9620901 -vt 0.1577148 0.9620901 -vt 0.1577148 0.9293033 -vt 0.4897461 0.9293033 -vt 0.4897461 0.9620901 -vt 0.5053711 0.9620901 -vt 0.5053711 0.9293033 -vt 0.1586914 0.9313524 -vt 0.1586914 0.9641393 -vt 0.1743164 0.9641393 -vt 0.1743164 0.9313524 -vt 0.175293 0.9313524 -vt 0.175293 0.9641393 -vt 0.190918 0.9641393 -vt 0.190918 0.9313524 -vt 0.5375977 0.9313524 -vt 0.5375977 0.9641393 -vt 0.5532227 0.9641393 -vt 0.5532227 0.9313524 -vt 0.5541992 0.9313524 -vt 0.5541992 0.9641393 -vt 0.5698242 0.9641393 -vt 0.5698242 0.9313524 -vt 0.5708008 0.9313524 -vt 0.5708008 0.9641393 -vt 0.5864258 0.9641393 -vt 0.5864258 0.9313524 -vt 0.8666992 0.9313524 -vt 0.8666992 0.9641393 -vt 0.8823242 0.9641393 -vt 0.8823242 0.9313524 -vt 0.8833008 0.9313524 -vt 0.8833008 0.9641393 -vt 0.8989258 0.9641393 -vt 0.8989258 0.9313524 -vt 0.5981445 0.9334016 -vt 0.5981445 0.9661885 -vt 0.6137695 0.9661885 -vt 0.6137695 0.9334016 -vt 0.6147461 0.9334016 -vt 0.6147461 0.9661885 -vt 0.6303711 0.9661885 -vt 0.6303711 0.9334016 -vt 0.6791992 0.9334016 -vt 0.6791992 0.9661885 -vt 0.6948242 0.9661885 -vt 0.6948242 0.9334016 -vt 0.6958008 0.9334016 -vt 0.6958008 0.9661885 -vt 0.7114258 0.9661885 -vt 0.7114258 0.9334016 -vt 0.7124023 0.9334016 -vt 0.7124023 0.9661885 -vt 0.7280273 0.9661885 -vt 0.7280273 0.9334016 -vt 0.7290039 0.9334016 -vt 0.7290039 0.9661885 -vt 0.7446289 0.9661885 -vt 0.7446289 0.9334016 -vt 0.7456055 0.9334016 -vt 0.7456055 0.9661885 -vt 0.7612305 0.9661885 -vt 0.7612305 0.9334016 -vt 0.7924805 0.9334016 -vt 0.7924805 0.9661885 -vt 0.8081055 0.9661885 -vt 0.8081055 0.9334016 -vt 0.809082 0.9334016 -vt 0.809082 0.9661885 -vt 0.824707 0.9661885 -vt 0.824707 0.9334016 -vt 0.8256836 0.9334016 -vt 0.8256836 0.9661885 -vt 0.8413086 0.9661885 -vt 0.8413086 0.9334016 -vt 0.8422852 0.9334016 -vt 0.8422852 0.9661885 -vt 0.8579102 0.9661885 -vt 0.8579102 0.9334016 -vt 0.9135742 0.9354508 -vt 0.9135742 0.9682377 -vt 0.9291992 0.9682377 -vt 0.9291992 0.9354508 -vt 0.09619141 0.960041 -vt 0.09619141 0.9928279 -vt 0.1118164 0.9928279 -vt 0.1118164 0.960041 -vt 0.112793 0.960041 -vt 0.112793 0.9928279 -vt 0.128418 0.9928279 -vt 0.128418 0.960041 -vt 0.01708984 0.9620901 -vt 0.01708984 0.994877 -vt 0.03271484 0.994877 -vt 0.03271484 0.9620901 -vt 0.03369141 0.9620901 -vt 0.03369141 0.994877 -vt 0.04931641 0.994877 -vt 0.04931641 0.9620901 -vt 0.05029297 0.9620901 -vt 0.05029297 0.994877 -vt 0.06591797 0.994877 -vt 0.06591797 0.9620901 -vt 0.06689453 0.9620901 -vt 0.06689453 0.994877 -vt 0.08251953 0.994877 -vt 0.08251953 0.9620901 -vt 0.4575195 0.9620901 -vt 0.4575195 0.994877 -vt 0.4731445 0.994877 -vt 0.4731445 0.9620901 -vt 0.9780273 0.9620901 -vt 0.9780273 0.994877 -vt 0.9936523 0.994877 -vt 0.9936523 0.9620901 -vt 0.1420898 0.9641393 -vt 0.1420898 0.9969262 -vt 0.1577148 0.9969262 -vt 0.1577148 0.9641393 -vt 0.4897461 0.9641393 -vt 0.4897461 0.9969262 -vt 0.5053711 0.9969262 -vt 0.5053711 0.9641393 -vt 0.5063477 0.9641393 -vt 0.5063477 0.9969262 -vt 0.5219727 0.9969262 -vt 0.5219727 0.9641393 -vt 0.9458008 0.9641393 -vt 0.9458008 0.9969262 -vt 0.9614258 0.9969262 -vt 0.9614258 0.9641393 -vt 0.1586914 0.9661885 -vt 0.1586914 0.9989754 -vt 0.1743164 0.9989754 -vt 0.1743164 0.9661885 -vt 0.175293 0.9661885 -vt 0.175293 0.9989754 -vt 0.190918 0.9989754 -vt 0.190918 0.9661885 -vt 0.2836914 0.9661885 -vt 0.2836914 0.9989754 -vt 0.2993164 0.9989754 -vt 0.2993164 0.9661885 -vt 0.300293 0.9661885 -vt 0.300293 0.9989754 -vt 0.315918 0.9989754 -vt 0.315918 0.9661885 -vt 0.3168945 0.9661885 -vt 0.3168945 0.9989754 -vt 0.3325195 0.9989754 -vt 0.3325195 0.9661885 -vt 0.5375977 0.9661885 -vt 0.5375977 0.9989754 -vt 0.5532227 0.9989754 -vt 0.5532227 0.9661885 -vt 0.5541992 0.9661885 -vt 0.5541992 0.9989754 -vt 0.5698242 0.9989754 -vt 0.5698242 0.9661885 -vt 0.5708008 0.9661885 -vt 0.5708008 0.9989754 -vt 0.5864258 0.9989754 -vt 0.5864258 0.9661885 -vt 0.6459961 0.9661885 -vt 0.6459961 0.9989754 -vt 0.6616211 0.9989754 -vt 0.6616211 0.9661885 +vt 0.00048828125 0.00102460384 +vt 0.00048828125 0.689549208 +vt 0.141113281 0.689549208 +vt 0.141113281 0.00102460384 +vt 0.142089844 0.00102460384 +vt 0.142089844 0.656762302 +vt 0.282714844 0.656762302 +vt 0.282714844 0.00102460384 +vt 0.283691406 0.00102460384 +vt 0.283691406 0.328893423 +vt 0.439941406 0.328893423 +vt 0.439941406 0.00102460384 +vt 0.440917969 0.00102460384 +vt 0.440917969 0.328893423 +vt 0.597167969 0.328893423 +vt 0.597167969 0.00102460384 +vt 0.598144531 0.00102460384 +vt 0.598144531 0.296106577 +vt 0.754394531 0.296106577 +vt 0.754394531 0.00102460384 +vt 0.755371094 0.00102460384 +vt 0.755371094 0.296106577 +vt 0.895996094 0.296106577 +vt 0.895996094 0.00102460384 +vt 0.896972656 0.00102460384 +vt 0.896972656 0.296106577 +vt 0.990722656 0.296106577 +vt 0.990722656 0.00102460384 +vt 0.598144531 0.298155725 +vt 0.598144531 0.593237698 +vt 0.691894531 0.593237698 +vt 0.691894531 0.298155725 +vt 0.692871094 0.298155725 +vt 0.692871094 0.560450792 +vt 0.786621094 0.560450792 +vt 0.786621094 0.298155725 +vt 0.787597656 0.298155725 +vt 0.787597656 0.560450792 +vt 0.881347656 0.560450792 +vt 0.881347656 0.298155725 +vt 0.882324219 0.298155725 +vt 0.882324219 0.560450792 +vt 0.944824219 0.560450792 +vt 0.944824219 0.298155725 +vt 0.283691406 0.330942631 +vt 0.283691406 0.49487704 +vt 0.377441406 0.49487704 +vt 0.377441406 0.330942631 +vt 0.378417969 0.330942631 +vt 0.378417969 0.49487704 +vt 0.456542969 0.49487704 +vt 0.456542969 0.330942631 +vt 0.945800781 0.298155725 +vt 0.945800781 0.691598356 +vt 0.977050781 0.691598356 +vt 0.977050781 0.298155725 +vt 0.457519531 0.330942631 +vt 0.457519531 0.691598356 +vt 0.488769531 0.691598356 +vt 0.488769531 0.330942631 +vt 0.283691406 0.496926248 +vt 0.283691406 0.595286846 +vt 0.393066406 0.595286846 +vt 0.393066406 0.496926248 +vt 0.489746094 0.330942631 +vt 0.489746094 0.560450792 +vt 0.536621094 0.560450792 +vt 0.536621094 0.330942631 +vt 0.489746094 0.5625 +vt 0.489746094 0.693647504 +vt 0.567871094 0.693647504 +vt 0.567871094 0.5625 +vt 0.692871094 0.5625 +vt 0.692871094 0.693647504 +vt 0.770996094 0.693647504 +vt 0.770996094 0.5625 +vt 0.394042969 0.496926248 +vt 0.394042969 0.660860658 +vt 0.456542969 0.660860658 +vt 0.456542969 0.496926248 +vt 0.771972656 0.5625 +vt 0.771972656 0.759221315 +vt 0.818847656 0.759221315 +vt 0.818847656 0.5625 +vt 0.819824219 0.5625 +vt 0.819824219 0.628073812 +vt 0.944824219 0.628073812 +vt 0.944824219 0.5625 +vt 0.819824219 0.63012296 +vt 0.819824219 0.695696712 +vt 0.944824219 0.695696712 +vt 0.944824219 0.63012296 +vt 0.598144531 0.595286846 +vt 0.598144531 0.726434469 +vt 0.645019531 0.726434469 +vt 0.645019531 0.595286846 +vt 0.283691406 0.597336054 +vt 0.283691406 0.728483617 +vt 0.330566406 0.728483617 +vt 0.330566406 0.597336054 +vt 0.331542969 0.597336054 +vt 0.331542969 0.728483617 +vt 0.378417969 0.728483617 +vt 0.378417969 0.597336054 +vt 0.142089844 0.65881145 +vt 0.142089844 0.757172108 +vt 0.204589844 0.757172108 +vt 0.204589844 0.65881145 +vt 0.205566406 0.65881145 +vt 0.205566406 0.789959013 +vt 0.252441406 0.789959013 +vt 0.252441406 0.65881145 +vt 0.394042969 0.662909865 +vt 0.394042969 0.761270523 +vt 0.456542969 0.761270523 +vt 0.456542969 0.662909865 +vt 0.00048828125 0.691598356 +vt 0.00048828125 0.822745919 +vt 0.0473632812 0.822745919 +vt 0.0473632812 0.691598356 +vt 0.0483398438 0.691598356 +vt 0.0483398438 0.822745919 +vt 0.0952148438 0.822745919 +vt 0.0952148438 0.691598356 +vt 0.568847656 0.330942631 +vt 0.568847656 0.49487704 +vt 0.593261719 0.49487704 +vt 0.593261719 0.330942631 +vt 0.945800781 0.693647504 +vt 0.945800781 0.792008162 +vt 0.992675781 0.792008162 +vt 0.992675781 0.693647504 +vt 0.489746094 0.695696712 +vt 0.489746094 0.794057369 +vt 0.536621094 0.794057369 +vt 0.536621094 0.695696712 +vt 0.598144531 0.728483617 +vt 0.598144531 0.761270523 +vt 0.738769531 0.761270523 +vt 0.738769531 0.728483617 +vt 0.771972656 0.761270523 +vt 0.771972656 0.794057369 +vt 0.912597656 0.794057369 +vt 0.912597656 0.761270523 +vt 0.568847656 0.496926248 +vt 0.568847656 0.628073812 +vt 0.593261719 0.628073812 +vt 0.593261719 0.496926248 +vt 0.283691406 0.730532765 +vt 0.283691406 0.796106577 +vt 0.346191406 0.796106577 +vt 0.346191406 0.730532765 +vt 0.0961914062 0.691598356 +vt 0.0961914062 0.822745919 +vt 0.127441406 0.822745919 +vt 0.127441406 0.691598356 +vt 0.457519531 0.693647504 +vt 0.457519531 0.824795067 +vt 0.488769531 0.824795067 +vt 0.488769531 0.693647504 +vt 0.537597656 0.695696712 +vt 0.537597656 0.826844275 +vt 0.568847656 0.826844275 +vt 0.568847656 0.695696712 +vt 0.569824219 0.63012296 +vt 0.569824219 0.826844275 +vt 0.585449219 0.826844275 +vt 0.585449219 0.63012296 +vt 0.142089844 0.759221315 +vt 0.142089844 0.824795067 +vt 0.188964844 0.824795067 +vt 0.188964844 0.759221315 +vt 0.253417969 0.65881145 +vt 0.253417969 0.855532765 +vt 0.269042969 0.855532765 +vt 0.269042969 0.65881145 +vt 0.739746094 0.695696712 +vt 0.739746094 0.794057369 +vt 0.770996094 0.794057369 +vt 0.770996094 0.695696712 +vt 0.913574219 0.697745919 +vt 0.913574219 0.763319671 +vt 0.944824219 0.763319671 +vt 0.944824219 0.697745919 +vt 0.347167969 0.730532765 +vt 0.347167969 0.796106577 +vt 0.378417969 0.796106577 +vt 0.378417969 0.730532765 +vt 0.394042969 0.763319671 +vt 0.394042969 0.796106577 +vt 0.456542969 0.796106577 +vt 0.456542969 0.763319671 +vt 0.598144531 0.763319671 +vt 0.598144531 0.828893423 +vt 0.629394531 0.828893423 +vt 0.629394531 0.763319671 +vt 0.630371094 0.763319671 +vt 0.630371094 0.828893423 +vt 0.661621094 0.828893423 +vt 0.661621094 0.763319671 +vt 0.662597656 0.763319671 +vt 0.662597656 0.828893423 +vt 0.693847656 0.828893423 +vt 0.693847656 0.763319671 +vt 0.694824219 0.763319671 +vt 0.694824219 0.828893423 +vt 0.726074219 0.828893423 +vt 0.726074219 0.763319671 +vt 0.913574219 0.765368819 +vt 0.913574219 0.830942631 +vt 0.944824219 0.830942631 +vt 0.944824219 0.765368819 +vt 0.205566406 0.792008162 +vt 0.205566406 0.923155725 +vt 0.221191406 0.923155725 +vt 0.221191406 0.792008162 +vt 0.222167969 0.792008162 +vt 0.222167969 0.923155725 +vt 0.237792969 0.923155725 +vt 0.237792969 0.792008162 +vt 0.945800781 0.794057369 +vt 0.945800781 0.859631181 +vt 0.977050781 0.859631181 +vt 0.977050781 0.794057369 +vt 0.978027344 0.794057369 +vt 0.978027344 0.925204933 +vt 0.993652344 0.925204933 +vt 0.993652344 0.794057369 +vt 0.739746094 0.796106577 +vt 0.739746094 0.828893423 +vt 0.802246094 0.828893423 +vt 0.802246094 0.796106577 +vt 0.489746094 0.796106577 +vt 0.489746094 0.927254081 +vt 0.505371094 0.927254081 +vt 0.505371094 0.796106577 +vt 0.803222656 0.796106577 +vt 0.803222656 0.828893423 +vt 0.865722656 0.828893423 +vt 0.865722656 0.796106577 +vt 0.506347656 0.796106577 +vt 0.506347656 0.894467235 +vt 0.521972656 0.894467235 +vt 0.521972656 0.796106577 +vt 0.866699219 0.796106577 +vt 0.866699219 0.894467235 +vt 0.882324219 0.894467235 +vt 0.882324219 0.796106577 +vt 0.883300781 0.796106577 +vt 0.883300781 0.894467235 +vt 0.898925781 0.894467235 +vt 0.898925781 0.796106577 +vt 0.283691406 0.798155725 +vt 0.283691406 0.896516383 +vt 0.299316406 0.896516383 +vt 0.299316406 0.798155725 +vt 0.300292969 0.798155725 +vt 0.300292969 0.896516383 +vt 0.315917969 0.896516383 +vt 0.315917969 0.798155725 +vt 0.316894531 0.798155725 +vt 0.316894531 0.896516383 +vt 0.332519531 0.896516383 +vt 0.332519531 0.798155725 +vt 0.333496094 0.798155725 +vt 0.333496094 0.830942631 +vt 0.380371094 0.830942631 +vt 0.380371094 0.798155725 +vt 0.394042969 0.798155725 +vt 0.394042969 0.830942631 +vt 0.440917969 0.830942631 +vt 0.440917969 0.798155725 +vt 0.00048828125 0.824795067 +vt 0.00048828125 0.857581973 +vt 0.0473632812 0.857581973 +vt 0.0473632812 0.824795067 +vt 0.0483398438 0.824795067 +vt 0.0483398438 0.857581973 +vt 0.0952148438 0.857581973 +vt 0.0952148438 0.824795067 +vt 0.142089844 0.826844275 +vt 0.142089844 0.859631181 +vt 0.188964844 0.859631181 +vt 0.188964844 0.826844275 +vt 0.537597656 0.828893423 +vt 0.537597656 0.861680329 +vt 0.584472656 0.861680329 +vt 0.584472656 0.828893423 +vt 0.0961914062 0.824795067 +vt 0.0961914062 0.923155725 +vt 0.111816406 0.923155725 +vt 0.111816406 0.824795067 +vt 0.112792969 0.824795067 +vt 0.112792969 0.923155725 +vt 0.128417969 0.923155725 +vt 0.128417969 0.824795067 +vt 0.598144531 0.830942631 +vt 0.598144531 0.863729477 +vt 0.645019531 0.863729477 +vt 0.645019531 0.830942631 +vt 0.457519531 0.826844275 +vt 0.457519531 0.925204933 +vt 0.473144531 0.925204933 +vt 0.473144531 0.826844275 +vt 0.645996094 0.830942631 +vt 0.645996094 0.896516383 +vt 0.661621094 0.896516383 +vt 0.661621094 0.830942631 +vt 0.662597656 0.830942631 +vt 0.662597656 0.896516383 +vt 0.678222656 0.896516383 +vt 0.678222656 0.830942631 +vt 0.679199219 0.830942631 +vt 0.679199219 0.863729477 +vt 0.710449219 0.863729477 +vt 0.710449219 0.830942631 +vt 0.711425781 0.830942631 +vt 0.711425781 0.863729477 +vt 0.742675781 0.863729477 +vt 0.742675781 0.830942631 +vt 0.743652344 0.830942631 +vt 0.743652344 0.863729477 +vt 0.774902344 0.863729477 +vt 0.774902344 0.830942631 +vt 0.775878906 0.830942631 +vt 0.775878906 0.896516383 +vt 0.791503906 0.896516383 +vt 0.791503906 0.830942631 +vt 0.792480469 0.830942631 +vt 0.792480469 0.896516383 +vt 0.808105469 0.896516383 +vt 0.808105469 0.830942631 +vt 0.809082031 0.830942631 +vt 0.809082031 0.896516383 +vt 0.824707031 0.896516383 +vt 0.824707031 0.830942631 +vt 0.825683594 0.830942631 +vt 0.825683594 0.896516383 +vt 0.841308594 0.896516383 +vt 0.841308594 0.830942631 +vt 0.333496094 0.832991838 +vt 0.333496094 0.865778685 +vt 0.364746094 0.865778685 +vt 0.364746094 0.832991838 +vt 0.842285156 0.830942631 +vt 0.842285156 0.896516383 +vt 0.857910156 0.896516383 +vt 0.857910156 0.830942631 +vt 0.365722656 0.832991838 +vt 0.365722656 0.89856559 +vt 0.381347656 0.89856559 +vt 0.381347656 0.832991838 +vt 0.394042969 0.832991838 +vt 0.394042969 0.89856559 +vt 0.409667969 0.89856559 +vt 0.409667969 0.832991838 +vt 0.410644531 0.832991838 +vt 0.410644531 0.89856559 +vt 0.426269531 0.89856559 +vt 0.426269531 0.832991838 +vt 0.427246094 0.832991838 +vt 0.427246094 0.89856559 +vt 0.442871094 0.89856559 +vt 0.442871094 0.832991838 +vt 0.913574219 0.832991838 +vt 0.913574219 0.89856559 +vt 0.929199219 0.89856559 +vt 0.929199219 0.832991838 +vt 0.253417969 0.857581973 +vt 0.253417969 0.923155725 +vt 0.269042969 0.923155725 +vt 0.269042969 0.857581973 +vt 0.00048828125 0.859631181 +vt 0.00048828125 0.925204933 +vt 0.0161132812 0.925204933 +vt 0.0161132812 0.859631181 +vt 0.0170898438 0.859631181 +vt 0.0170898438 0.892418027 +vt 0.0483398438 0.892418027 +vt 0.0483398438 0.859631181 +vt 0.0493164062 0.859631181 +vt 0.0493164062 0.892418027 +vt 0.0805664062 0.892418027 +vt 0.0805664062 0.859631181 +vt 0.142089844 0.861680329 +vt 0.142089844 0.927254081 +vt 0.157714844 0.927254081 +vt 0.157714844 0.861680329 +vt 0.158691406 0.861680329 +vt 0.158691406 0.894467235 +vt 0.189941406 0.894467235 +vt 0.189941406 0.861680329 +vt 0.945800781 0.861680329 +vt 0.945800781 0.927254081 +vt 0.961425781 0.927254081 +vt 0.961425781 0.861680329 +vt 0.537597656 0.863729477 +vt 0.537597656 0.929303288 +vt 0.553222656 0.929303288 +vt 0.553222656 0.863729477 +vt 0.554199219 0.863729477 +vt 0.554199219 0.929303288 +vt 0.569824219 0.929303288 +vt 0.569824219 0.863729477 +vt 0.570800781 0.863729477 +vt 0.570800781 0.929303288 +vt 0.586425781 0.929303288 +vt 0.586425781 0.863729477 +vt 0.598144531 0.865778685 +vt 0.598144531 0.931352437 +vt 0.613769531 0.931352437 +vt 0.613769531 0.865778685 +vt 0.614746094 0.865778685 +vt 0.614746094 0.931352437 +vt 0.630371094 0.931352437 +vt 0.630371094 0.865778685 +vt 0.679199219 0.865778685 +vt 0.679199219 0.931352437 +vt 0.694824219 0.931352437 +vt 0.694824219 0.865778685 +vt 0.695800781 0.865778685 +vt 0.695800781 0.931352437 +vt 0.711425781 0.931352437 +vt 0.711425781 0.865778685 +vt 0.712402344 0.865778685 +vt 0.712402344 0.931352437 +vt 0.728027344 0.931352437 +vt 0.728027344 0.865778685 +vt 0.729003906 0.865778685 +vt 0.729003906 0.931352437 +vt 0.744628906 0.931352437 +vt 0.744628906 0.865778685 +vt 0.745605469 0.865778685 +vt 0.745605469 0.931352437 +vt 0.761230469 0.931352437 +vt 0.761230469 0.865778685 +vt 0.333496094 0.867827892 +vt 0.333496094 0.900614738 +vt 0.364746094 0.900614738 +vt 0.364746094 0.867827892 +vt 0.0170898438 0.894467235 +vt 0.0170898438 0.960040987 +vt 0.0327148438 0.960040987 +vt 0.0327148438 0.894467235 +vt 0.0336914062 0.894467235 +vt 0.0336914062 0.960040987 +vt 0.0493164062 0.960040987 +vt 0.0493164062 0.894467235 +vt 0.0502929688 0.894467235 +vt 0.0502929688 0.960040987 +vt 0.0659179688 0.960040987 +vt 0.0659179688 0.894467235 +vt 0.158691406 0.896516383 +vt 0.158691406 0.929303288 +vt 0.189941406 0.929303288 +vt 0.189941406 0.896516383 +vt 0.0668945312 0.894467235 +vt 0.0668945312 0.960040987 +vt 0.0825195312 0.960040987 +vt 0.0825195312 0.894467235 +vt 0.506347656 0.896516383 +vt 0.506347656 0.962090135 +vt 0.521972656 0.962090135 +vt 0.521972656 0.896516383 +vt 0.866699219 0.896516383 +vt 0.866699219 0.929303288 +vt 0.897949219 0.929303288 +vt 0.897949219 0.896516383 +vt 0.283691406 0.89856559 +vt 0.283691406 0.964139342 +vt 0.299316406 0.964139342 +vt 0.299316406 0.89856559 +vt 0.300292969 0.89856559 +vt 0.300292969 0.964139342 +vt 0.315917969 0.964139342 +vt 0.315917969 0.89856559 +vt 0.316894531 0.89856559 +vt 0.316894531 0.964139342 +vt 0.332519531 0.964139342 +vt 0.332519531 0.89856559 +vt 0.645996094 0.89856559 +vt 0.645996094 0.964139342 +vt 0.661621094 0.964139342 +vt 0.661621094 0.89856559 +vt 0.662597656 0.89856559 +vt 0.662597656 0.964139342 +vt 0.678222656 0.964139342 +vt 0.678222656 0.89856559 +vt 0.775878906 0.89856559 +vt 0.775878906 0.964139342 +vt 0.791503906 0.964139342 +vt 0.791503906 0.89856559 +vt 0.792480469 0.89856559 +vt 0.792480469 0.931352437 +vt 0.823730469 0.931352437 +vt 0.823730469 0.89856559 +vt 0.824707031 0.89856559 +vt 0.824707031 0.931352437 +vt 0.855957031 0.931352437 +vt 0.855957031 0.89856559 +vt 0.365722656 0.900614738 +vt 0.365722656 0.96618855 +vt 0.381347656 0.96618855 +vt 0.381347656 0.900614738 +vt 0.394042969 0.900614738 +vt 0.394042969 0.96618855 +vt 0.409667969 0.96618855 +vt 0.409667969 0.900614738 +vt 0.410644531 0.900614738 +vt 0.410644531 0.96618855 +vt 0.426269531 0.96618855 +vt 0.426269531 0.900614738 +vt 0.427246094 0.900614738 +vt 0.427246094 0.96618855 +vt 0.442871094 0.96618855 +vt 0.442871094 0.900614738 +vt 0.913574219 0.900614738 +vt 0.913574219 0.933401644 +vt 0.944824219 0.933401644 +vt 0.944824219 0.900614738 +vt 0.333496094 0.902663946 +vt 0.333496094 0.968237698 +vt 0.349121094 0.968237698 +vt 0.349121094 0.902663946 +vt 0.0961914062 0.925204933 +vt 0.0961914062 0.957991779 +vt 0.127441406 0.957991779 +vt 0.127441406 0.925204933 +vt 0.205566406 0.925204933 +vt 0.205566406 0.990778685 +vt 0.221191406 0.990778685 +vt 0.221191406 0.925204933 +vt 0.222167969 0.925204933 +vt 0.222167969 0.990778685 +vt 0.237792969 0.990778685 +vt 0.237792969 0.925204933 +vt 0.457519531 0.927254081 +vt 0.457519531 0.960040987 +vt 0.488769531 0.960040987 +vt 0.488769531 0.927254081 +vt 0.253417969 0.925204933 +vt 0.253417969 0.990778685 +vt 0.269042969 0.990778685 +vt 0.269042969 0.925204933 +vt 0.00048828125 0.927254081 +vt 0.00048828125 0.992827892 +vt 0.0161132812 0.992827892 +vt 0.0161132812 0.927254081 +vt 0.945800781 0.929303288 +vt 0.945800781 0.962090135 +vt 0.977050781 0.962090135 +vt 0.977050781 0.929303288 +vt 0.978027344 0.927254081 +vt 0.978027344 0.960040987 +vt 0.993652344 0.960040987 +vt 0.993652344 0.927254081 +vt 0.142089844 0.929303288 +vt 0.142089844 0.962090135 +vt 0.157714844 0.962090135 +vt 0.157714844 0.929303288 +vt 0.489746094 0.929303288 +vt 0.489746094 0.962090135 +vt 0.505371094 0.962090135 +vt 0.505371094 0.929303288 +vt 0.158691406 0.931352437 +vt 0.158691406 0.964139342 +vt 0.174316406 0.964139342 +vt 0.174316406 0.931352437 +vt 0.175292969 0.931352437 +vt 0.175292969 0.964139342 +vt 0.190917969 0.964139342 +vt 0.190917969 0.931352437 +vt 0.537597656 0.931352437 +vt 0.537597656 0.964139342 +vt 0.553222656 0.964139342 +vt 0.553222656 0.931352437 +vt 0.554199219 0.931352437 +vt 0.554199219 0.964139342 +vt 0.569824219 0.964139342 +vt 0.569824219 0.931352437 +vt 0.570800781 0.931352437 +vt 0.570800781 0.964139342 +vt 0.586425781 0.964139342 +vt 0.586425781 0.931352437 +vt 0.866699219 0.931352437 +vt 0.866699219 0.964139342 +vt 0.882324219 0.964139342 +vt 0.882324219 0.931352437 +vt 0.883300781 0.931352437 +vt 0.883300781 0.964139342 +vt 0.898925781 0.964139342 +vt 0.898925781 0.931352437 +vt 0.598144531 0.933401644 +vt 0.598144531 0.96618855 +vt 0.613769531 0.96618855 +vt 0.613769531 0.933401644 +vt 0.614746094 0.933401644 +vt 0.614746094 0.96618855 +vt 0.630371094 0.96618855 +vt 0.630371094 0.933401644 +vt 0.679199219 0.933401644 +vt 0.679199219 0.96618855 +vt 0.694824219 0.96618855 +vt 0.694824219 0.933401644 +vt 0.695800781 0.933401644 +vt 0.695800781 0.96618855 +vt 0.711425781 0.96618855 +vt 0.711425781 0.933401644 +vt 0.712402344 0.933401644 +vt 0.712402344 0.96618855 +vt 0.728027344 0.96618855 +vt 0.728027344 0.933401644 +vt 0.729003906 0.933401644 +vt 0.729003906 0.96618855 +vt 0.744628906 0.96618855 +vt 0.744628906 0.933401644 +vt 0.745605469 0.933401644 +vt 0.745605469 0.96618855 +vt 0.761230469 0.96618855 +vt 0.761230469 0.933401644 +vt 0.792480469 0.933401644 +vt 0.792480469 0.96618855 +vt 0.808105469 0.96618855 +vt 0.808105469 0.933401644 +vt 0.809082031 0.933401644 +vt 0.809082031 0.96618855 +vt 0.824707031 0.96618855 +vt 0.824707031 0.933401644 +vt 0.825683594 0.933401644 +vt 0.825683594 0.96618855 +vt 0.841308594 0.96618855 +vt 0.841308594 0.933401644 +vt 0.842285156 0.933401644 +vt 0.842285156 0.96618855 +vt 0.857910156 0.96618855 +vt 0.857910156 0.933401644 +vt 0.913574219 0.935450792 +vt 0.913574219 0.968237698 +vt 0.929199219 0.968237698 +vt 0.929199219 0.935450792 +vt 0.0961914062 0.960040987 +vt 0.0961914062 0.992827892 +vt 0.111816406 0.992827892 +vt 0.111816406 0.960040987 +vt 0.112792969 0.960040987 +vt 0.112792969 0.992827892 +vt 0.128417969 0.992827892 +vt 0.128417969 0.960040987 +vt 0.0170898438 0.962090135 +vt 0.0170898438 0.99487704 +vt 0.0327148438 0.99487704 +vt 0.0327148438 0.962090135 +vt 0.0336914062 0.962090135 +vt 0.0336914062 0.99487704 +vt 0.0493164062 0.99487704 +vt 0.0493164062 0.962090135 +vt 0.0502929688 0.962090135 +vt 0.0502929688 0.99487704 +vt 0.0659179688 0.99487704 +vt 0.0659179688 0.962090135 +vt 0.0668945312 0.962090135 +vt 0.0668945312 0.99487704 +vt 0.0825195312 0.99487704 +vt 0.0825195312 0.962090135 +vt 0.457519531 0.962090135 +vt 0.457519531 0.99487704 +vt 0.473144531 0.99487704 +vt 0.473144531 0.962090135 +vt 0.978027344 0.962090135 +vt 0.978027344 0.99487704 +vt 0.993652344 0.99487704 +vt 0.993652344 0.962090135 +vt 0.142089844 0.964139342 +vt 0.142089844 0.996926248 +vt 0.157714844 0.996926248 +vt 0.157714844 0.964139342 +vt 0.489746094 0.964139342 +vt 0.489746094 0.996926248 +vt 0.505371094 0.996926248 +vt 0.505371094 0.964139342 +vt 0.506347656 0.964139342 +vt 0.506347656 0.996926248 +vt 0.521972656 0.996926248 +vt 0.521972656 0.964139342 +vt 0.945800781 0.964139342 +vt 0.945800781 0.996926248 +vt 0.961425781 0.996926248 +vt 0.961425781 0.964139342 +vt 0.158691406 0.96618855 +vt 0.158691406 0.998975396 +vt 0.174316406 0.998975396 +vt 0.174316406 0.96618855 +vt 0.175292969 0.96618855 +vt 0.175292969 0.998975396 +vt 0.190917969 0.998975396 +vt 0.190917969 0.96618855 +vt 0.283691406 0.96618855 +vt 0.283691406 0.998975396 +vt 0.299316406 0.998975396 +vt 0.299316406 0.96618855 +vt 0.300292969 0.96618855 +vt 0.300292969 0.998975396 +vt 0.315917969 0.998975396 +vt 0.315917969 0.96618855 +vt 0.316894531 0.96618855 +vt 0.316894531 0.998975396 +vt 0.332519531 0.998975396 +vt 0.332519531 0.96618855 +vt 0.537597656 0.96618855 +vt 0.537597656 0.998975396 +vt 0.553222656 0.998975396 +vt 0.553222656 0.96618855 +vt 0.554199219 0.96618855 +vt 0.554199219 0.998975396 +vt 0.569824219 0.998975396 +vt 0.569824219 0.96618855 +vt 0.570800781 0.96618855 +vt 0.570800781 0.998975396 +vt 0.586425781 0.998975396 +vt 0.586425781 0.96618855 +vt 0.645996094 0.96618855 +vt 0.645996094 0.998975396 +vt 0.661621094 0.998975396 +vt 0.661621094 0.96618855 g xinzexi_2_n-mesh_0 f 3/3/3 2/2/2 1/1/1 f 1/1/1 4/4/4 3/3/3 From 4b57580d5ef519a41e131fe738f049ed5e310b33 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Thu, 5 Sep 2024 10:45:47 +0200 Subject: [PATCH 061/403] 1.10.16 version bump --- UnityPy/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UnityPy/__init__.py b/UnityPy/__init__.py index b6107549..14506fe9 100644 --- a/UnityPy/__init__.py +++ b/UnityPy/__init__.py @@ -1,4 +1,4 @@ -__version__ = "1.10.15" +__version__ = "1.10.16" from .environment import Environment as Environment from .helpers.ArchiveStorageManager import ( From 06a8063359ff21788ba0b62c4ca826f339a58194 Mon Sep 17 00:00:00 2001 From: AXiX-official <2879710747@qq.com> Date: Tue, 10 Sep 2024 21:02:56 +0800 Subject: [PATCH 062/403] Implement saving BundleFile with lzma packer --- UnityPy/files/BundleFile.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/UnityPy/files/BundleFile.py b/UnityPy/files/BundleFile.py index 6b88b2d2..c37f4d8d 100644 --- a/UnityPy/files/BundleFile.py +++ b/UnityPy/files/BundleFile.py @@ -227,6 +227,8 @@ def save(self, packer=None): ) elif packer == "lz4": self.save_fs(writer, data_flag=194, block_info_flag=2) + elif packer == "lzma": + self.save_fs(writer, data_flag=65, block_info_flag=1) elif isinstance(packer, tuple): self.save_fs(writer, *packer) else: From 1ed817c0a87c51f73a9aa25975a94c6bdc7751fb Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Tue, 10 Sep 2024 21:52:04 +0200 Subject: [PATCH 063/403] bump to 1.10.17 --- UnityPy/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UnityPy/__init__.py b/UnityPy/__init__.py index 14506fe9..34b07f4a 100644 --- a/UnityPy/__init__.py +++ b/UnityPy/__init__.py @@ -1,4 +1,4 @@ -__version__ = "1.10.16" +__version__ = "1.10.17" from .environment import Environment as Environment from .helpers.ArchiveStorageManager import ( From 4ac84d641537e014ad69941a84281848378ddd18 Mon Sep 17 00:00:00 2001 From: AXiX <2879710747@qq.com> Date: Thu, 12 Sep 2024 18:24:04 +0800 Subject: [PATCH 064/403] Implement chunk-based lz4 compression (#263) Implement chunk-based lz4 compression --- UnityPy/files/BundleFile.py | 48 ++++++++----------- UnityPy/helpers/CompressionHelper.py | 71 ++++++++++++++++++++++++++++ 2 files changed, 91 insertions(+), 28 deletions(-) diff --git a/UnityPy/files/BundleFile.py b/UnityPy/files/BundleFile.py index c37f4d8d..c35a0483 100644 --- a/UnityPy/files/BundleFile.py +++ b/UnityPy/files/BundleFile.py @@ -301,31 +301,23 @@ def save_fs(self, writer: EndianBinaryWriter, data_flag: int, block_info_flag: i file_data = data_writer.bytes data_writer.dispose() - uncompressed_data_size = len(file_data) - # compress the data - switch = block_info_flag & 0x3F - if switch == 1: # LZMA - file_data = CompressionHelper.compress_lzma(file_data) - elif switch in [2, 3]: # LZ4, LZ4HC - file_data = CompressionHelper.compress_lz4(file_data) - elif switch == 4: # LZHAM - raise NotImplementedError - # else no compression - data stays the same - compressed_data_size = len(file_data) + file_data, block_info = CompressionHelper.chunk_based_compress( + file_data, block_info_flag + ) # write the block_info # uncompressedDataHash block_writer = EndianBinaryWriter(b"\x00" * 0x10) # data block info - # block count - block_writer.write_int(1) - # uncompressed size - block_writer.write_u_int(uncompressed_data_size) - # compressed size - block_writer.write_u_int(compressed_data_size) - # flag - block_writer.write_u_short(block_info_flag) + block_writer.write_int(len(block_info)) + for block_uncompressed_size, block_compressed_size, block_flag in block_info: + # uncompressed size + block_writer.write_u_int(block_uncompressed_size) + # compressed size + block_writer.write_u_int(block_compressed_size) + # flag + block_writer.write_u_short(block_flag) # file block info if not data_flag & 0x40: @@ -411,17 +403,17 @@ def save_web_raw(self, writer: EndianBinaryWriter): # (version >= 2) completeFileSize # (version >= 3) file_info_header_size # compressed assets - + if self.version > 3: raise NotImplementedError("Saving Unity Web bundles with version > 3 is not supported") # Calculate fileInfoHeaderSize for set offsets file_info_header_size = 4 # for nodesCount - + for file_name in self.files.keys(): file_info_header_size += len(file_name.encode()) + 1 # +1 for null terminator file_info_header_size += 4 * 2 # 4 bytes each for offset and size - + file_info_header_padding_size = 4 - (file_info_header_size % 4) if file_info_header_size % 4 != 0 else 0 file_info_header_size += file_info_header_padding_size @@ -431,20 +423,20 @@ def save_web_raw(self, writer: EndianBinaryWriter): file_content_writer = EndianBinaryWriter() current_offset = file_info_header_size - + for file_name, f in self.files.items(): directory_info_writer.write_string_to_null(file_name) directory_info_writer.write_u_int(current_offset) - + # Get file content if isinstance(f, (EndianBinaryReader, EndianBinaryWriter)): file_data = f.bytes else: file_data = f.save() - + file_size = len(file_data) directory_info_writer.write_u_int(file_size) - + file_content_writer.write_bytes(file_data) current_offset += file_size @@ -457,7 +449,7 @@ def save_web_raw(self, writer: EndianBinaryWriter): compressed_content = uncompressed_content if self.signature == "UnityWeb": compressed_content = CompressionHelper.compress_lzma(uncompressed_content, True) - + # Write header header_size = writer.Position + 24 # assuming levelCount = 1 if self.version >= 2: @@ -493,7 +485,7 @@ def save_web_raw(self, writer: EndianBinaryWriter): # Write compressed content writer.write(compressed_content) - + def decompress_data( self, compressed_data: bytes, diff --git a/UnityPy/helpers/CompressionHelper.py b/UnityPy/helpers/CompressionHelper.py index 28d496ed..e3d51d64 100644 --- a/UnityPy/helpers/CompressionHelper.py +++ b/UnityPy/helpers/CompressionHelper.py @@ -151,3 +151,74 @@ def compress_gzip(data: bytes) -> bytes: :rtype: bytes """ return gzip.compress(data) + + +def chunk_based_compress(data: bytes, block_info_flag: int) -> (bytes, list): + """compresses AssetBundle data based on the block_info_flag + LZ4/LZ4HC will be chunk-based compression + + :param data: uncompressed data + :type data: bytes + :param block_info_flag: block info flag + :type block_info_flag: int + :return: compressed data and block info + :rtype: tuple + """ + switch = block_info_flag & 0x3F + if switch == 0: # NONE + return data, [(len(data), len(data), block_info_flag)] + elif switch == 1: # LZMA + chunk_size = 0xFFFFFFFF + compress_func = compress_lzma + elif switch in [2, 3]: # LZ4 + chunk_size = 0x00020000 + compress_func = compress_lz4 + elif switch == 4: # LZHAM + raise NotImplementedError + block_info = [] + uncompressed_data_size = len(data) + compressed_file_data = bytearray() + p = 0 + while uncompressed_data_size > chunk_size: + compressed_data = compress_func(data[p: p + chunk_size]) + if len(compressed_data) > chunk_size: + compressed_file_data.extend(data[p: p + chunk_size]) + block_info.append( + ( + chunk_size, + chunk_size, + block_info_flag ^ switch, + ) + ) + else: + compressed_file_data.extend(compressed_data) + block_info.append( + ( + chunk_size, + len(compressed_data), + block_info_flag, + ) + ) + p += chunk_size + uncompressed_data_size -= chunk_size + if uncompressed_data_size > 0: + compressed_data = compress_func(data[p:]) + if len(compressed_data) > uncompressed_data_size: + compressed_file_data.extend(data[p:]) + block_info.append( + ( + uncompressed_data_size, + uncompressed_data_size, + block_info_flag ^ switch, + ) + ) + else: + compressed_file_data.extend(compressed_data) + block_info.append( + ( + uncompressed_data_size, + len(compressed_data), + block_info_flag, + ) + ) + return bytes(compressed_file_data), block_info From 41d74a15c7090472546c5dc94769932392ec9abb Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Thu, 12 Sep 2024 12:24:29 +0200 Subject: [PATCH 065/403] 1.10.18 - version bump --- UnityPy/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UnityPy/__init__.py b/UnityPy/__init__.py index 34b07f4a..d54dac2c 100644 --- a/UnityPy/__init__.py +++ b/UnityPy/__init__.py @@ -1,4 +1,4 @@ -__version__ = "1.10.17" +__version__ = "1.10.18" from .environment import Environment as Environment from .helpers.ArchiveStorageManager import ( From 47b1bde027fd79d78af3de4d5e3bebd05f8ceeb8 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Tue, 17 Sep 2024 15:38:03 +0200 Subject: [PATCH 066/403] ObjectReader - fix dump_typetree --- UnityPy/files/ObjectReader.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UnityPy/files/ObjectReader.py b/UnityPy/files/ObjectReader.py index a0894340..565e6d05 100644 --- a/UnityPy/files/ObjectReader.py +++ b/UnityPy/files/ObjectReader.py @@ -190,7 +190,7 @@ def __repr__(self): def dump_typetree(self, nodes: list = None) -> str: self.reset() sb = [] - nodes = self.get_typetree(nodes) + nodes = self.get_typetree_nodes(nodes) TypeTreeHelper.read_typetree_str(sb, nodes, self) return "".join(sb) From 8393ec370c1374e0e1cbd7f8001b431ebc730649 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Thu, 12 Sep 2024 16:45:30 +0200 Subject: [PATCH 067/403] use generated classes and patch compatiblity --- UnityPy/classes/Animation.py | 10 - UnityPy/classes/AnimationClip.py | 637 - UnityPy/classes/Animator.py | 39 - UnityPy/classes/AnimatorController.py | 324 - UnityPy/classes/AnimatorOverrideController.py | 17 - UnityPy/classes/AssetBundle.py | 22 - UnityPy/classes/AudioClip.py | 60 - UnityPy/classes/Avatar.py | 156 - UnityPy/classes/Behaviour.py | 16 - UnityPy/classes/BuildSettings.py | 12 - UnityPy/classes/Component.py | 16 - UnityPy/classes/EditorExtension.py | 20 - UnityPy/classes/Font.py | 85 - UnityPy/classes/GameObject.py | 50 - UnityPy/classes/Material.py | 70 - UnityPy/classes/Mesh.py | 1061 -- UnityPy/classes/MeshFilter.py | 8 - UnityPy/classes/MeshRenderer.py | 6 - UnityPy/classes/MonoBehaviour.py | 42 - UnityPy/classes/MonoScript.py | 23 - UnityPy/classes/MovieTexture.py | 11 - UnityPy/classes/NamedObject.py | 28 - UnityPy/classes/Object.py | 194 +- UnityPy/classes/PPtr.py | 157 +- UnityPy/classes/PlayerSettings.py | 29 - UnityPy/classes/RectTransform.py | 6 - UnityPy/classes/Renderer.py | 93 - UnityPy/classes/ResourceManager.py | 23 - UnityPy/classes/RuntimeAnimatorController.py | 6 - UnityPy/classes/Shader.py | 464 - UnityPy/classes/SkinnedMeshRenderer.py | 23 - UnityPy/classes/Sprite.py | 265 - UnityPy/classes/SpriteAtlas.py | 40 - UnityPy/classes/TextAsset.py | 35 - UnityPy/classes/Texture.py | 22 - UnityPy/classes/Texture2D.py | 308 - UnityPy/classes/Texture2DArray.py | 84 - UnityPy/classes/Transform.py | 14 - UnityPy/classes/VideoClip.py | 44 - UnityPy/classes/__init__.py | 43 +- UnityPy/classes/generated.py | 10660 ++++++++++++++++ UnityPy/classes/legacy_patch/AudioClip.py | 18 + UnityPy/classes/legacy_patch/Mesh.py | 13 + UnityPy/classes/legacy_patch/Renderer.py | 12 + UnityPy/classes/legacy_patch/Shader.py | 12 + UnityPy/classes/legacy_patch/Sprite.py | 12 + UnityPy/classes/legacy_patch/Texture2D.py | 84 + UnityPy/classes/legacy_patch/__init__.py | 6 + UnityPy/classes/math.py | 117 + UnityPy/enums/MeshTopology.py | 10 + UnityPy/enums/VertexFormat.py | 80 + UnityPy/export/AudioClipConverter.py | 40 +- UnityPy/export/MeshExporter.py | 89 +- UnityPy/export/MeshRendererExporter.py | 8 +- UnityPy/export/Texture2DConverter.py | 21 +- UnityPy/files/ObjectReader.py | 53 +- UnityPy/files/SerializedFile.py | 86 +- UnityPy/helpers/MeshHelper.py | 719 ++ UnityPy/helpers/PackedBitVector.py | 145 + UnityPy/helpers/TypeTreeHelper.py | 819 +- UnityPy/helpers/TypeTreeNode.py | 227 + UnityPy/resources/uncompressed.tpk | Bin 1029887 -> 1293843 bytes UnityPy/streams/EndianBinaryReader.py | 12 + generators/ClassesGenerator.py | 346 + 64 files changed, 13024 insertions(+), 5128 deletions(-) delete mode 100644 UnityPy/classes/Animation.py delete mode 100644 UnityPy/classes/AnimationClip.py delete mode 100644 UnityPy/classes/Animator.py delete mode 100644 UnityPy/classes/AnimatorController.py delete mode 100644 UnityPy/classes/AnimatorOverrideController.py delete mode 100644 UnityPy/classes/AssetBundle.py delete mode 100644 UnityPy/classes/AudioClip.py delete mode 100644 UnityPy/classes/Avatar.py delete mode 100644 UnityPy/classes/Behaviour.py delete mode 100644 UnityPy/classes/BuildSettings.py delete mode 100644 UnityPy/classes/Component.py delete mode 100644 UnityPy/classes/EditorExtension.py delete mode 100644 UnityPy/classes/Font.py delete mode 100644 UnityPy/classes/GameObject.py delete mode 100644 UnityPy/classes/Material.py delete mode 100644 UnityPy/classes/Mesh.py delete mode 100644 UnityPy/classes/MeshFilter.py delete mode 100644 UnityPy/classes/MeshRenderer.py delete mode 100644 UnityPy/classes/MonoBehaviour.py delete mode 100644 UnityPy/classes/MonoScript.py delete mode 100644 UnityPy/classes/MovieTexture.py delete mode 100644 UnityPy/classes/NamedObject.py delete mode 100644 UnityPy/classes/PlayerSettings.py delete mode 100644 UnityPy/classes/RectTransform.py delete mode 100644 UnityPy/classes/Renderer.py delete mode 100644 UnityPy/classes/ResourceManager.py delete mode 100644 UnityPy/classes/RuntimeAnimatorController.py delete mode 100644 UnityPy/classes/Shader.py delete mode 100644 UnityPy/classes/SkinnedMeshRenderer.py delete mode 100644 UnityPy/classes/Sprite.py delete mode 100644 UnityPy/classes/SpriteAtlas.py delete mode 100644 UnityPy/classes/TextAsset.py delete mode 100644 UnityPy/classes/Texture.py delete mode 100644 UnityPy/classes/Texture2D.py delete mode 100644 UnityPy/classes/Texture2DArray.py delete mode 100644 UnityPy/classes/Transform.py delete mode 100644 UnityPy/classes/VideoClip.py create mode 100644 UnityPy/classes/generated.py create mode 100644 UnityPy/classes/legacy_patch/AudioClip.py create mode 100644 UnityPy/classes/legacy_patch/Mesh.py create mode 100644 UnityPy/classes/legacy_patch/Renderer.py create mode 100644 UnityPy/classes/legacy_patch/Shader.py create mode 100644 UnityPy/classes/legacy_patch/Sprite.py create mode 100644 UnityPy/classes/legacy_patch/Texture2D.py create mode 100644 UnityPy/classes/legacy_patch/__init__.py create mode 100644 UnityPy/classes/math.py create mode 100644 UnityPy/enums/MeshTopology.py create mode 100644 UnityPy/enums/VertexFormat.py create mode 100644 UnityPy/helpers/MeshHelper.py create mode 100644 UnityPy/helpers/PackedBitVector.py create mode 100644 UnityPy/helpers/TypeTreeNode.py create mode 100644 generators/ClassesGenerator.py diff --git a/UnityPy/classes/Animation.py b/UnityPy/classes/Animation.py deleted file mode 100644 index 3006fcee..00000000 --- a/UnityPy/classes/Animation.py +++ /dev/null @@ -1,10 +0,0 @@ -from .Behaviour import Behaviour -from .PPtr import PPtr - - -class Animation(Behaviour): - def __init__(self, reader): - super().__init__(reader=reader) - self.m_Animation = PPtr(reader) - num_animations = reader.read_int() - self.m_Animations = [PPtr(reader) for _ in range(num_animations)] diff --git a/UnityPy/classes/AnimationClip.py b/UnityPy/classes/AnimationClip.py deleted file mode 100644 index ba5e330e..00000000 --- a/UnityPy/classes/AnimationClip.py +++ /dev/null @@ -1,637 +0,0 @@ -import math -from enum import IntEnum - -from .NamedObject import NamedObject -from .PPtr import PPtr -from ..enums import ClassIDType -from ..math import Quaternion, Vector3 -from ..streams import EndianBinaryReader - -try: - from UnityPy import UnityPyBoost -except ImportError: - UnityPyBoost = None - - -def uint(num): - if num < 0 or num > 4294967295: - return num % 4294967296 - return num - - -class Keyframe: - def __init__(self, reader, readerFunc): - self.time = reader.read_float() - self.value = readerFunc() - self.inSlope = readerFunc() - self.outSlope = readerFunc() - if reader.version >= (2018,): # 2018 and up - self.weightedMode = reader.read_int() - self.inWeight = readerFunc() - self.outWeight = readerFunc() - - -class AnimationCurve: - def __init__(self, reader, readerFunc): - version = reader.version - numCurves = reader.read_int() - self.m_Curve = [Keyframe(reader, readerFunc) for _ in range(numCurves)] - - self.m_PreInfinity = reader.read_int() - self.m_PostInfinity = reader.read_int() - if version >= (5, 3): # 5.3 and up - self.m_RotationOrder = reader.read_int() - - -class QuaternionCurve: - def __init__(self, reader): - self.curve = AnimationCurve(reader, reader.read_quaternion) # - self.path = reader.read_aligned_string() - - -class PackedFloatVector: - def __init__(self, reader): - self.m_NumItems = reader.read_u_int() - self.m_Range = reader.read_float() - self.m_Start = reader.read_float() - - numData = reader.read_int() - self.m_Data = reader.read_bytes(numData) - reader.align_stream() - - self.m_BitSize = reader.read_byte() - reader.align_stream() - - def save(self, writer): - writer.write_u_int(self.m_NumItems) - writer.write_float(self.m_Range) - writer.write_float(self.m_Start) - - writer.write_int(len(self.m_Data)) - writer.write_bytes(self.m_Data) - writer.align_stream() - - writer.write_byte(self.m_BitSize) - writer.align_stream() - - def UnpackFloats( - self, - itemCountInChunk: int, - chunkStride: int, - start: int = 0, - numChunks: int = -1, - ): - if UnityPyBoost: - return UnityPyBoost.unpack_floats( - self.m_NumItems, - self.m_Range, - self.m_Start, - bytes(self.m_Data), - self.m_BitSize, - itemCountInChunk, - chunkStride, - start, - numChunks, - ) - - bitPos: int = self.m_BitSize * start - indexPos: int = bitPos // 8 - bitPos %= 8 - - scale: float = (1.0 / self.m_Range) if self.m_Range else float("inf") - if numChunks == -1: - numChunks = self.m_NumItems // itemCountInChunk - end = int(chunkStride * numChunks / 4) - data = [] - for index in range(0, end, chunkStride // 4): - for i in range(itemCountInChunk): - x = 0 # uint - bits = 0 - while bits < self.m_BitSize: - x |= uint( - (self.m_Data[indexPos] >> bitPos) << bits - ) # (uint)((m_Data[indexPos] >> bitPos) << bits) - num = min(self.m_BitSize - bits, 8 - bitPos) - bitPos += num - bits += num - if bitPos == 8: # - indexPos += 1 - bitPos = 0 - - x &= uint((1 << self.m_BitSize) - 1) # (uint)(1 << m_BitSize) - 1u - denomi = scale * ((1 << self.m_BitSize) - 1) - data.append((x / denomi if denomi else float("inf")) + self.m_Start) - return data - - -class PackedIntVector: - def __init__(self, reader): - self.m_NumItems = reader.read_u_int() - - numData = reader.read_int() - self.m_Data = reader.read_bytes(numData) - reader.align_stream() - - self.m_BitSize = reader.read_byte() - reader.align_stream() - - def save(self, writer): - writer.write_u_int(self.m_NumItems) - - writer.write_int(len(self.m_Data)) - writer.write_bytes(self.m_Data) - writer.align_stream() - - writer.write_byte(self.m_BitSize) - writer.align_stream() - - def UnpackInts(self): - if UnityPyBoost: - return UnityPyBoost.unpack_ints( - self.m_NumItems, bytes(self.m_Data), self.m_BitSize - ) - - data = [0] * self.m_NumItems - indexPos = 0 - bitPos = 0 - for i in range(self.m_NumItems): - bits = 0 - data[i] = 0 - while bits < self.m_BitSize: - data[i] |= (self.m_Data[indexPos] >> bitPos) << bits - num = min(self.m_BitSize - bits, 8 - bitPos) - bitPos += num - bits += num - if bitPos == 8: - indexPos += 1 - bitPos = 0 - data[i] &= (1 << self.m_BitSize) - 1 - return data - - -class PackedQuatVector: - def __init__(self, reader): - self.m_NumItems = reader.read_u_int() - numData = reader.read_int() - self.m_Data = reader.read_bytes(numData) - reader.align_stream() - - def UnpackQuats(self): - m_Data = self.m_Data - data = [None] * self.m_NumItems - indexPos = 0 - bitPos = 0 - - for i in range(self.m_NumItems): - flags = 0 - bits = 0 - while bits < 3: - flags |= (m_Data[indexPos] >> bitPos) << bits # unit - num = min(3 - bits, 8 - bitPos) - bitPos += num - bits += num - if bitPos == 8: # - indexPos += 1 - bitPos = 0 - flags &= 7 - - q = Quaternion() - sum = 0 - for j in range(4): - if (flags & 3) != j: # - bitSize = 9 if ((flags & 3) + 1) % 4 == j else 10 - x = 0 - - bits = 0 - while bits < bitSize: - x |= (m_Data[indexPos] >> bitPos) << bits # uint - num = min(bitSize - bits, 8 - bitPos) - bitPos += num - bits += num - if bitPos == 8: # - indexPos += 1 - bitPos = 0 - x &= (1 << bitSize) - 1 # unit - q[j] = x / (0.5 * ((1 << bitSize) - 1)) - 1 - sum += q[j] * q[j] - - lastComponent = flags & 3 # int - q[lastComponent] = math.sqrt(1 - sum) # float - if (flags & 4) != 0: # 0u - q[lastComponent] = -q[lastComponent] - data.append(q) - - return data - - -class CompressedAnimationCurve: - def __init__(self, reader): - self.m_Path = reader.read_aligned_string() - self.m_Times = PackedIntVector(reader) - self.m_Values = PackedQuatVector(reader) - self.m_Slopes = PackedFloatVector(reader) - self.m_PreInfinity = reader.read_int() - self.m_PostInfinity = reader.read_int() - - -class Vector3Curve: - def __init__(self, reader): - self.curve = AnimationCurve(reader, reader.read_vector3) # Vector3 - self.path = reader.read_aligned_string() - - -class FloatCurve: - def __init__(self, reader): - self.curve = AnimationCurve(reader, reader.read_float) # Float - self.attribute = reader.read_aligned_string() - self.path = reader.read_aligned_string() - self.classID = ClassIDType(reader.read_int()) - self.script = PPtr(reader) # MonoScript - - -class PPtrKeyframe: - def __init__(self, reader): - self.time = reader.read_float() - self.value = PPtr(reader) # Object - - -class PPtrCurve: - def __init__(self, reader): - numCurves = reader.read_int() - self.curve = [PPtrKeyframe(reader) for _ in range(numCurves)] - - self.attribute = reader.read_aligned_string() - self.path = reader.read_aligned_string() - self.classID = reader.read_int() - self.script = PPtr(reader) # MonoScript - - -class AABB: - def __init__(self, reader): - self.m_Center = reader.read_vector3() - self.m_Extent = reader.read_vector3() - - def save(self, writer): - writer.write_vector3(self.m_Center) - writer.write_vector3(self.m_Extent) - - -class xform: - def __init__(self, reader): - version = reader.version - self.t = ( - reader.read_vector3() - if version >= (5, 4) - else Vector3(reader.read_vector4()) - ) # 5.4 and up - self.q = reader.read_quaternion() - self.s = ( - reader.read_vector3() - if version >= (5, 4) - else Vector3(reader.read_vector4()) - ) # 5.4 and up - - -class HandPose: - def __init__(self, reader): - self.m_GrabX = xform(reader) - self.m_DoFArray = reader.read_float_array() - self.m_Override = reader.read_float() - self.m_CloseOpen = reader.read_float() - self.m_InOut = reader.read_float() - self.m_Grab = reader.read_float() - - -class HumanGoal: - def __init__(self, reader): - version = reader.version - self.m_X = xform(reader) - self.m_WeightT = reader.read_float() - self.m_WeightR = reader.read_float() - if version >= (5,): # 5.0 and up - self.m_HintT = ( - reader.read_vector3() - if version >= (5, 4) - else Vector3(reader.read_vector4()) - ) # 5.4 and up - self.m_HintWeightT = reader.read_float() - - -class HumanPose: - def __init__(self, reader): - version = reader.version - self.m_RootX = xform(reader) - self.m_LookAtPosition = ( - reader.read_vector3() - if version >= (5, 4) - else Vector3(reader.read_vector4()) - ) # 5.4 and up - self.m_LookAtWeight = reader.read_vector4() - - numGoals = reader.read_int() - self.m_GoalArray = [HumanGoal(reader) for _ in range(numGoals)] - - self.m_LeftHandPose = HandPose(reader) - self.m_RightHandPose = HandPose(reader) - - self.m_DoFArray = reader.read_float_array() - - if version >= (5, 2): # 5.2 and up - numTDof = reader.read_int() - self.m_TDoFArray = [ - reader.read_vector3() - if version >= (5, 4) - else Vector3(reader.read_vector4()) # 5.4 and up - for _ in range(numTDof) - ] - - -class StreamedCurveKey: - def __init__(self, reader): - self.index = reader.read_int() - self.coeff = reader.read_float_array(4) - - self.outSlope = self.coeff[2] - self.value = self.coeff[3] - - def CalculateNextInSlope(self, dx: float, rhs): - """ - :param dx: float - :param rhs: StreamedCurvedKey - :return: - """ - # Stepped - if self.coeff[0] == 0 and self.coeff[1] == 0 and self.coeff[2] == 0: - return float("inf") - - dx = max(dx, 0.0001) - dy = rhs.value - self.value - length = 1.0 / (dx * dx) - d1 = self.outSlope * dx - d2 = dy + dy + dy - d1 - d1 - self.coeff[1] / length - return d2 / dx - - -class StreamedFrame: - def __init__(self, reader): - self.time = reader.read_float() - numKeys = reader.read_int() - self.keyList = [StreamedCurveKey(reader) for _ in range(numKeys)] - - -class StreamedClip: - def __init__(self, reader): - self.data = reader.read_u_int_array() - self.curveCount = reader.read_u_int() - - def ReadData(self): - frameList = [] - buffer = b"".join(val.to_bytes(4, "big") for val in self.data) - reader = EndianBinaryReader(buffer) - while reader.Position < reader.Length: - frameList.append(StreamedFrame(reader)) - - for frameIndex in range(2, len(frameList) - 1): - frame = frameList[frameIndex] - for curveKey in frame.keyList: - i = frameIndex - 1 - while i >= 0: - preFrame = frameList[i] - try: - preCurveKey = [ - x for x in preFrame.keyList if x.index == curveKey.index - ][0] - curveKey.inSlope = preCurveKey.CalculateNextInSlope( - frame.time - preFrame.time, curveKey - ) - break - except IndexError: - pass - i -= 1 - return frameList - - -class DenseClip: - def __init__(self, reader): - self.m_FrameCount = reader.read_int() - self.m_CurveCount = reader.read_u_int() - self.m_SampleRate = reader.read_float() - self.m_BeginTime = reader.read_float() - self.m_SampleArray = reader.read_float_array() - - -class ConstantClip: - def __init__(self, reader): - self.data = reader.read_float_array() - - -class ValueConstant: - def __init__(self, reader): - version = reader.version - self.m_ID = reader.read_u_int() - if version < (5, 5): # 5.5 down - self.m_TypeID = reader.read_u_int() - self.m_Type = reader.read_u_int() - self.m_Index = reader.read_u_int() - - -class ValueArrayConstant: - def __init__(self, reader): - numVals = reader.read_int() - self.m_ValueArray = [ValueConstant(reader) for _ in range(numVals)] - - -class Clip: - def __init__(self, reader): - version = reader.version - self.m_StreamedClip = StreamedClip(reader) - self.m_DenseClip = DenseClip(reader) - if version >= (4, 3): # 4.3 and up - self.m_ConstantClip = ConstantClip(reader) - if version < (2018, 3): # 2018.3 down - self.m_Binding = ValueArrayConstant(reader) - - -class ValueDelta: - def __init__(self, reader): - self.m_Start = reader.read_float() - self.m_Stop = reader.read_float() - - -class ClipMuscleConstant: - def __init__(self, reader): - version = reader.version - self.m_DeltaPose = HumanPose(reader) - self.m_StartX = xform(reader) - if version >= (5, 5): # 5.5 and up - self.m_StopX = xform(reader) - self.m_LeftFootStartX = xform(reader) - self.m_RightFootStartX = xform(reader) - if version < (5,): # 5.0 down - self.m_MotionStartX = xform(reader) - self.m_MotionStopX = xform(reader) - self.m_AverageSpeed = ( - reader.read_vector3() - if version >= (5, 4) - else Vector3(reader.read_vector4()) - ) # 5.4 and up - self.m_Clip = Clip(reader) - self.m_StartTime = reader.read_float() - self.m_StopTime = reader.read_float() - self.m_OrientationOffsetY = reader.read_float() - self.m_Level = reader.read_float() - self.m_CycleOffset = reader.read_float() - self.m_AverageAngularSpeed = reader.read_float() - - self.m_IndexArray = reader.read_int_array() - if version < (4, 3): # 4.3 down - self.m_AdditionalCurveIndexArray = reader.read_int_array() - numDeltas = reader.read_int() - self.m_ValueArrayDelta = [ValueDelta(reader) for _ in range(numDeltas)] - if version >= (5, 3): # 5.3 and up - self.m_ValueArrayReferencePose = reader.read_float_array() - - self.m_Mirror = reader.read_boolean() - if version >= (4, 3): # 4.3 and up - self.m_LoopTime = reader.read_boolean() - self.m_LoopBlend = reader.read_boolean() - self.m_LoopBlendOrientation = reader.read_boolean() - self.m_LoopBlendPositionY = reader.read_boolean() - self.m_LoopBlendPositionXZ = reader.read_boolean() - if version >= (5, 5): # 5.5 and up - self.m_StartAtOrigin = reader.read_boolean() - self.m_KeepOriginalOrientation = reader.read_boolean() - self.m_KeepOriginalPositionY = reader.read_boolean() - self.m_KeepOriginalPositionXZ = reader.read_boolean() - self.m_HeightFromFeet = reader.read_boolean() - reader.align_stream() - - -class GenericBinding: - def __init__(self, reader): - version = reader.version - self.path = reader.read_u_int() - self.attribute = reader.read_u_int() - self.script = PPtr(reader) # Object - if version >= (5, 6): # 5.6 and up - self.typeID = ClassIDType(reader.read_int()) - else: - self.typeID = ClassIDType(reader.read_u_short()) - self.customType = reader.read_byte() - self.isPPtrCurve = reader.read_byte() - if version >= (2022, 1): # 2022.1 and up - self.isIntCurve = reader.read_byte() - reader.align_stream() - - -class AnimationClipBindingConstant: - def __init__(self, reader): - numBindings = reader.read_int() - self.genericBindings = [GenericBinding(reader) for _ in range(numBindings)] - - numMappings = reader.read_int() - self.pptrCurveMapping = [PPtr(reader) for _ in range(numMappings)] # Object - - def FindBinding(self, index): - curves = 0 - for b in self.genericBindings: - if b.typeID == ClassIDType.Transform: # - switch = b.attribute - - if switch in [1, 3, 4]: - # case 1: #kBindTransformPosition - # case 3: #kBindTransformScale - # case 4: #kBindTransformEuler - curves += 3 - elif switch == 2: # kBindTransformRotation - curves += 4 - else: - curves += 1 - else: - curves += 1 - if curves > index: - return b - return None - - -class AnimationEvent: - def __init__(self, reader): - version = reader.version - self.time = reader.read_float() - self.functionName = reader.read_aligned_string() - self.data = reader.read_aligned_string() - self.objectReferenceParameter = PPtr(reader) - self.floatParameter = reader.read_float() - - if version > (3, ): - self.intParameter = reader.read_int() - - self.messageOptions = reader.read_int() - - -class AnimationType(IntEnum): - kLegacy = (1,) - kGeneric = (2,) - kHumanoid = 3 - - -class AnimationClip(NamedObject): - def __init__(self, reader): - super().__init__(reader=reader) - version = reader.version - if version >= (5,): # 5.0 and up - self.m_Legacy = reader.read_boolean() - elif version >= (4,): # 4.0 and up - self.m_AnimationType = AnimationType(reader.read_int()) - if self.m_AnimationType == AnimationType.kLegacy: # - self.m_Legacy = True - else: - self.m_Legacy = True - - self.m_Compressed = reader.read_boolean() - if version >= (4, 3): # 4.3 and up - self.m_UseHighQualityCurve = reader.read_boolean() - reader.align_stream() - numRCurves = reader.read_int() - self.m_RotationCurves = [QuaternionCurve(reader) for _ in range(numRCurves)] - - numCRCurves = reader.read_int() - self.m_CompressedRotationCurves = [ - CompressedAnimationCurve(reader) for _ in range(numCRCurves) - ] - - if version >= (5, 3): # 5.3 and up - numEulerCurves = reader.read_int() - self.m_EulerCurves = [Vector3Curve(reader) for _ in range(numEulerCurves)] - - numPCurves = reader.read_int() - self.m_PositionCurves = [Vector3Curve(reader) for _ in range(numPCurves)] - - numSCurves = reader.read_int() - self.m_ScaleCurves = [Vector3Curve(reader) for _ in range(numSCurves)] - - numFCurves = reader.read_int() - self.m_FloatCurves = [FloatCurve(reader) for _ in range(numFCurves)] - if version >= (4, 3): # 4.3 and up - numPtrCurves = reader.read_int() - self.m_PPtrCurves = [PPtrCurve(reader) for _ in range(numPtrCurves)] - - self.m_SampleRate = reader.read_float() - self.m_WrapMode = reader.read_int() - if version >= (3, 4): # 3.4 and up - self.m_Bounds = AABB(reader) - if version >= (4,): # 4.0 and up - self.m_MuscleClipSize = reader.read_u_int() - self.m_MuscleClip = ClipMuscleConstant(reader) - if version >= (4, 3): # 4.3 and up - self.m_ClipBindingConstant = AnimationClipBindingConstant(reader) - - if version >= (2018, 3): - self.m_HasGenericRootTransform = reader.read_boolean() - self.m_HasMotionFloatCurves = reader.read_boolean() - reader.align_stream() - - numEvents = self.reader.read_int() - self.m_Events = [AnimationEvent(self.reader) for _ in range(numEvents)] - if version >= (2017, ): - reader.align_stream() diff --git a/UnityPy/classes/Animator.py b/UnityPy/classes/Animator.py deleted file mode 100644 index a134cb86..00000000 --- a/UnityPy/classes/Animator.py +++ /dev/null @@ -1,39 +0,0 @@ -from .Behaviour import Behaviour -from .PPtr import PPtr - - -class Animator(Behaviour): - def __init__(self, reader): - super().__init__(reader=reader) - - self.m_Avatar = PPtr(reader) # Avatar - self.m_Controller = PPtr(reader) # RuntimeAnimatorController - self.m_CullingMode = reader.read_int() - version = self.version - - if version >= (4, 5): # 4.5 and up - self.m_UpdateMode = reader.read_int() - - self.m_ApplyRootMotion = reader.read_boolean() - if (4, 5) < version[2:] <= (5, 0): # 4.5 and up - 5.0 down - reader.align_stream() - - if version >= (5,): # 5.0 and up - self.m_LinearVelocityBlending = reader.read_boolean() - reader.align_stream() - - if version[2:] < (4, 5): # 4.5 down - self.m_AnimatePhysics = reader.read_boolean() - - if version >= (4, 3): # 4.3 and up - self.m_HasTransformHierarchy = reader.read_boolean() - - if version >= (4, 5): # 4.5 and up - self.m_AllowConstantClipSamplingOptimization = reader.read_boolean() - - if (4,) < version[:1] < (2018,): # 5.0 and up - 2018 down - reader.align_stream() - - if version >= (2018,): # 2018 and up - self.m_KeepAnimatorControllerStateOnDisable = reader.read_boolean() - reader.align_stream() diff --git a/UnityPy/classes/AnimatorController.py b/UnityPy/classes/AnimatorController.py deleted file mode 100644 index 0b8999e3..00000000 --- a/UnityPy/classes/AnimatorController.py +++ /dev/null @@ -1,324 +0,0 @@ -from .AnimationClip import ValueArrayConstant -from .PPtr import PPtr -from .RuntimeAnimatorController import RuntimeAnimatorController -from ..math import Vector3 - - -class AnimatorController(RuntimeAnimatorController): - def __init__(self, reader): - super().__init__(reader=reader) - self.m_ControllerSize = reader.read_u_int() - self.m_Controller = ControllerConstant(reader) - tosSize = reader.read_int() - self.m_TOS = {} - for _ in range(tosSize): - key = reader.read_u_int() - self.m_TOS[key] = reader.read_aligned_string() - - numClips = reader.read_int() - self.m_AnimationClips = [PPtr(reader) for _ in range(numClips)] - - -class HumanPoseMask: - def __init__(self, reader): - version = reader.version - self.word0 = reader.read_u_int() - self.word1 = reader.read_u_int() - if version >= (5, 2): # 5.2 and up - self.word2 = reader.read_u_int() - - -class SkeletonMaskElement: - def __init__(self, reader): - self.m_PathHash = reader.read_u_int() - self.m_Weight = reader.read_float() - - -class SkeletonMask: - def __init__(self, reader): - numElements = reader.read_int() - self.m_Data = [SkeletonMaskElement(reader) for _ in range(numElements)] - - -class LayerConstant: - def __init__(self, reader): - version = reader.version - self.m_StateMachineIndex = reader.read_u_int() - self.m_StateMachineMotionSetIndex = reader.read_u_int() - self.m_BodyMask = HumanPoseMask(reader) - self.m_SkeletonMask = SkeletonMask(reader) - self.m_Binding = reader.read_u_int() - self.m_LayerBlendingMode = reader.read_int() - if version >= (4, 2): # 4.2 and up - self.m_DefaultWeight = reader.read_float() - self.m_IKPass = reader.read_boolean() - if version >= (4, 2): # 4.2 and up - self.m_SyncedLayerAffectsTiming = reader.read_boolean() - reader.align_stream() - - -class ConditionConstant: - def __init__(self, reader): - self.m_ConditionMode = reader.read_u_int() - self.m_EventID = reader.read_u_int() - self.m_EventThreshold = reader.read_float() - self.m_ExitTime = reader.read_float() - - -class TransitionConstant: - def __init__(self, reader): - version = reader.version - - numConditions = reader.read_int() - self.m_ConditionConstantArray = [ - ConditionConstant(reader) for _ in range(numConditions) - ] - - self.m_DestinationState = reader.read_u_int() - if version >= (5,): # 5.0 and up - self.m_FullPathID = reader.read_u_int() - - self.m_ID = reader.read_u_int() - self.m_UserID = reader.read_u_int() - self.m_TransitionDuration = reader.read_float() - self.m_TransitionOffset = reader.read_float() - if version >= (5,): # 5.0 and up - self.m_ExitTime = reader.read_float() - self.m_HasExitTime = reader.read_boolean() - self.m_HasFixedDuration = reader.read_boolean() - reader.align_stream() - self.m_InterruptionSource = reader.read_int() - self.m_OrderedInterruption = reader.read_boolean() - else: - self.m_Atomic = reader.read_boolean() - - if version >= (4, 5): # 4.5 and up - self.m_CanTransitionToSelf = reader.read_boolean() - - reader.align_stream() - - -class LeafInfoConstant: - def __init__(self, reader): - self.m_IDArray = reader.read_u_int_array() - self.m_IndexOffset = reader.read_u_int() - - -class MotionNeighborList: - def __init__(self, reader): - self.m_NeighborArray = reader.read_u_int_array() - - -class Blend2dDataConstant: - def __init__(self, reader): - self.m_ChildPositionArray = reader.read_vector2_array() - self.m_ChildMagnitudeArray = reader.read_float_array() - self.m_ChildPairVectorArray = reader.read_vector2_array() - self.m_ChildPairAvgMagInvArray = reader.read_float_array() - - numNeighbours = reader.read_int() - self.m_ChildNeighborListArray = [ - MotionNeighborList(reader) for _ in range(numNeighbours) - ] - - -class Blend1dDataConstant: # wrong labeled: - def __init__(self, reader): - self.m_ChildThresholdArray = reader.read_float_array() - - -class BlendDirectDataConstant: - def __init__(self, reader): - self.m_ChildBlendEventIDArray = reader.read_u_int_array() - self.m_NormalizedBlendValues = reader.read_boolean() - reader.align_stream() - - -class BlendTreeNodeConstant: - def __init__(self, reader): - version = reader.version - - if version >= (4, 1): # 4.1 and up - self.m_BlendType = reader.read_u_int() - self.m_BlendEventID = reader.read_u_int() - if version >= (4, 1): # 4.1 and up - self.m_BlendEventYID = reader.read_u_int() - self.m_ChildIndices = reader.read_u_int_array() - if version < (4, 1): # 4.1 down - self.m_ChildThresholdArray = reader.read_float_array() - - if version >= (4, 1): # 4.1 and up - self.m_Blend1dData = Blend1dDataConstant(reader) - self.m_Blend2dData = Blend2dDataConstant(reader) - - if version >= (5,): # 5.0 and up - self.m_BlendDirectData = BlendDirectDataConstant(reader) - - self.m_ClipID = reader.read_u_int() - if (4, 5) <= version[:2] < (5, 0): # 4.5 - 5.0 - self.m_ClipIndex = reader.read_u_int() - - self.m_Duration = reader.read_float() - - if version >= (4, 1, 3): # 4.1.3 and up - self.m_CycleOffset = reader.read_float() - self.m_Mirror = reader.read_boolean() - reader.align_stream() - - -class BlendTreeConstant: - def __init__(self, reader): - version = reader.version - - numNodes = reader.read_int() - self.m_NodeArray = [BlendTreeNodeConstant( - reader) for _ in range(numNodes)] - - if version < (4, 5): # 4.5 down - self.m_BlendEventArrayConstant = ValueArrayConstant(reader) - - -class StateConstant: - def __init__(self, reader): - version = reader.version - - numTransistions = reader.read_int() - self.m_TransitionConstantArray = [ - TransitionConstant(reader) for _ in range(numTransistions) - ] - - self.m_BlendTreeConstantIndexArray = reader.read_int_array() - - if version < (5, 2): # 5.2 down - numInfos = reader.read_int() - self.m_LeafInfoArray = [LeafInfoConstant( - reader) for _ in range(numInfos)] - - numBlends = reader.read_int() - self.m_BlendTreeConstantArray = [ - BlendTreeConstant(reader) for _ in range(numBlends) - ] - - self.m_NameID = reader.read_u_int() - if version >= (4, 3): # 4.3 and up - self.m_PathID = reader.read_u_int() - if version >= (5,): # 5.0 and up - self.m_FullPathID = reader.read_u_int() - - self.m_TagID = reader.read_u_int() - if version >= (5, 1): # 5.1 and up - self.m_SpeedParamID = reader.read_u_int() - self.m_MirrorParamID = reader.read_u_int() - self.m_CycleOffsetParamID = reader.read_u_int() - - if version >= (2017, 2): # 2017.2 and up - self.m_TimeParamID = reader.read_u_int() - - self.m_Speed = reader.read_float() - if version >= (4, 1): # 4.1 and up - self.m_CycleOffset = reader.read_float() - self.m_IKOnFeet = reader.read_boolean() - if version >= (5,): # 5.0 and up - self.m_WriteDefaultValues = reader.read_boolean() - - self.m_Loop = reader.read_boolean() - if version >= (4, 1): # 4.1 and up - self.m_Mirror = reader.read_boolean() - - reader.align_stream() - - -class SelectorTransitionConstant: - def __init__(self, reader): - self.m_Destination = reader.read_u_int() - - numConditions = reader.read_int() - self.m_ConditionConstantArray = [ - ConditionConstant(reader) for _ in range(numConditions) - ] - - -class SelectorStateConstant: - def __init__(self, reader): - numTransitions = reader.read_int() - self.m_TransitionConstantArray = [ - SelectorTransitionConstant(reader) for _ in range(numTransitions) - ] - self.m_FullPathID = reader.read_u_int() - self.m_isEntry = reader.read_boolean() - reader.align_stream() - - -class StateMachineConstant: - def __init__(self, reader): - version = reader.version - - numStates = reader.read_int() - self.m_StateConstantArray = [ - StateConstant(reader) for _ in range(numStates)] - - numAnyStates = reader.read_int() - self.m_AnyStateTransitionConstantArray = [ - TransitionConstant(reader) for _ in range(numAnyStates) - ] - - if version >= (5,): # 5.0 and up - numSelectors = reader.read_int() - self.m_SelectorStateConstantArray = [ - SelectorStateConstant(reader) for _ in range(numSelectors) - ] - - self.m_DefaultState = reader.read_u_int() - self.m_MotionSetCount = reader.read_u_int() - - -class ValueArray: - def __init__(self, reader): - version = reader.version - - if version < (5, 5): # 5.5 down - self.m_BoolValues = reader.read_boolean_array() - reader.align_stream() - self.m_IntValues = reader.read_int_array() - self.m_FloatValues = reader.read_float_array() - - if version < (4, 3): # 4.3 down - self.m_VectorValues = reader.read_vector4_array() - else: - numPosValues = reader.read_int() - self.m_PositionValues = [ - reader.read_vector3() - if version >= (5, 4) - else Vector3(reader.read_vector4()) # 5.4 and up - for _ in range(numPosValues) - ] - - self.m_QuaternionValues = reader.read_vector4_array() - - numScaleValues = reader.read_int() - self.m_ScaleValues = [ - reader.read_vector3() - if version >= (5, 4) - else Vector3(reader.read_vector4()) # 5.4 and up - for _ in range(numScaleValues) - ] - - if version >= (5, 5): # 5.5 and up - self.m_FloatValues = reader.read_float_array() - self.m_IntValues = reader.read_int_array() - self.m_BoolValues = reader.read_boolean_array() - reader.align_stream() - - -class ControllerConstant: - def __init__(self, reader): - numLayers = reader.read_int() - self.m_LayerArray = [LayerConstant(reader) for _ in range(numLayers)] - - numStates = reader.read_int() - self.m_StateMachineArray = [ - StateMachineConstant(reader) for _ in range(numStates) - ] - - self.m_Values = ValueArrayConstant(reader) - self.m_DefaultValues = ValueArray(reader) diff --git a/UnityPy/classes/AnimatorOverrideController.py b/UnityPy/classes/AnimatorOverrideController.py deleted file mode 100644 index 0544d314..00000000 --- a/UnityPy/classes/AnimatorOverrideController.py +++ /dev/null @@ -1,17 +0,0 @@ -from .PPtr import PPtr -from .RuntimeAnimatorController import RuntimeAnimatorController - - -class AnimationClipOverride: - def __init__(self, reader): - self.m_OriginalClip = PPtr(reader) - self.m_OverrideClip = PPtr(reader) - - -class AnimatorOverrideController(RuntimeAnimatorController): - def __init__(self, reader): - super().__init__(reader=reader) - self.m_Controller = PPtr(reader) - num_overrides = reader.read_int() - self.m_Clips = [AnimationClipOverride( - reader) for _ in range(num_overrides)] diff --git a/UnityPy/classes/AssetBundle.py b/UnityPy/classes/AssetBundle.py deleted file mode 100644 index d4fd87c8..00000000 --- a/UnityPy/classes/AssetBundle.py +++ /dev/null @@ -1,22 +0,0 @@ -from .NamedObject import NamedObject -from .PPtr import PPtr - - -class AssetInfo: - def __init__(self, reader): - self.preload_index = reader.read_int() - self.preload_size = reader.read_int() - self.asset = PPtr(reader) - - -class AssetBundle(NamedObject): - def __init__(self, reader): - super().__init__(reader=reader) - preload_table_size = reader.read_int() - self.m_PreloadTable = [PPtr(reader) for _ in range(preload_table_size)] - container_size = reader.read_int() - self.m_Container = {} - # TODO - m_Container is a multi-dict, multiple values can have the same key - for i in range(container_size): - key = reader.read_aligned_string() - self.m_Container[key] = AssetInfo(reader) diff --git a/UnityPy/classes/AudioClip.py b/UnityPy/classes/AudioClip.py deleted file mode 100644 index 3f8bb012..00000000 --- a/UnityPy/classes/AudioClip.py +++ /dev/null @@ -1,60 +0,0 @@ -from .NamedObject import NamedObject -from ..enums import AudioType, AudioCompressionFormat, AUDIO_TYPE_EXTEMSION -from ..export import AudioClipConverter -from ..helpers.ResourceReader import get_resource_data - - -class AudioClip(NamedObject): - def __init__(self, reader): - super().__init__(reader=reader) - self.m_Source = "" - version = self.version - if version < (5,): # 5.0 down - self.m_Format = reader.read_int() - self.m_Type = AudioType(reader.read_int()) - self.m_3D = reader.read_boolean() - self.m_UseHardware = reader.read_boolean() - reader.align_stream() - - if version >= (3, 2): # and version <= (5,): # 3.2.0 to 5 - self.m_Stream = reader.read_int() - self.m_Size = reader.read_int() - tsize = self.m_Size + 4 - self.m_Size % 4 if (self.m_Size % 4 != 0) else self.m_Size - if reader.byte_size + reader.byte_start - reader.Position != tsize: - self.m_Offset = reader.read_u_int() - self.m_Source = self.assets_file.full_name + ".resS" - else: - self.m_Size = reader.read_int() - - else: - self.m_LoadType = reader.read_int() - self.m_Channels = reader.read_int() - self.m_Frequency = reader.read_int() - self.m_BitsPerSample = reader.read_int() - self.m_Length = reader.read_float() - self.m_IsTrackerFormat = reader.read_boolean() - reader.align_stream() - self.m_SubsoundIndex = reader.read_int() - self.m_PreloadAudioData = reader.read_boolean() - self.m_LoadInBackground = reader.read_boolean() - self.m_Legacy3D = reader.read_boolean() - reader.align_stream() - self.m_Source = reader.read_aligned_string() - self.m_Offset = reader.read_u_long() - self.m_Size = reader.read_long() - self.m_CompressionFormat = AudioCompressionFormat(reader.read_int()) - - if self.m_Source: - self.m_AudioData = get_resource_data( - self.m_Source, self.assets_file, self.m_Offset, self.m_Size - ) - else: - self.m_AudioData = reader.read_bytes(self.m_Size) - - @property - def extension(self): - return AUDIO_TYPE_EXTEMSION.get(self.m_CompressionFormat, ".audioclip") - - @property - def samples(self) -> dict: - return AudioClipConverter.extract_audioclip_samples(self) diff --git a/UnityPy/classes/Avatar.py b/UnityPy/classes/Avatar.py deleted file mode 100644 index 973770b6..00000000 --- a/UnityPy/classes/Avatar.py +++ /dev/null @@ -1,156 +0,0 @@ -from .AnimationClip import xform -from .NamedObject import NamedObject - - -class Avatar(NamedObject): - def __init__(self, reader): - super().__init__(reader=reader) - self.m_AvatarSize = reader.read_u_int() - self.m_Avatar = AvatarConstant(reader) - - numTOS = reader.read_int() - self.m_TOS = {} - for _ in range(numTOS): - key = reader.read_u_int() - self.m_TOS[key] = reader.read_aligned_string() - - # HumanDescription m_HumanDescription 2019 and up - - def FindBonePath(self, hash): - return self.m_TOS[hash] - - -class Node: - def __init__(self, reader): - self.m_ParentId = reader.read_int() - self.m_AxesId = reader.read_int() - - -class Limit: - def __init__(self, reader): - version = reader.version - if version >= (5, 4): # 5.4 and up - self.m_Min = reader.read_vector3() - self.m_Max = reader.read_vector3() - else: - self.m_Min = reader.read_vector4() - self.m_Max = reader.read_vector4() - - -class Axes: - def __init__(self, reader): - version = reader.version - self.m_PreQ = reader.read_vector4() - self.m_PostQ = reader.read_vector4() - if version >= (5, 4): # 5.4 and up - self.m_Sgn = reader.read_vector3() - else: - self.m_Sgn = reader.read_vector4() - self.m_Limit = Limit(reader) - self.m_Length = reader.read_float() - self.m_Type = reader.read_u_int() - - -class Skeleton: - def __init__(self, reader): - numNodes = reader.read_int() - self.m_Node = [Node(reader) for _ in range(numNodes)] - - self.m_ID = reader.read_u_int_array() - - numAxes = reader.read_int() - self.m_AxesArray = [Axes(reader) for _ in range(numAxes)] - - -class SkeletonPose: - def __init__(self, reader): - numXforms = reader.read_int() - self.m_X = [xform(reader) for _ in range(numXforms)] - - -class Hand: - def __init__(self, reader): - self.m_HandBoneIndex = reader.read_int_array() - - -class Handle: - def __init__(self, reader): - self.m_X = xform(reader) - self.m_ParentHumanIndex = reader.read_u_int() - self.m_ID = reader.read_u_int() - - -class Collider: - def __init__(self, reader): - self.m_X = xform(reader) - self.m_Type = reader.read_u_int() - self.m_XMotionType = reader.read_u_int() - self.m_YMotionType = reader.read_u_int() - self.m_ZMotionType = reader.read_u_int() - self.m_MinLimitX = reader.read_float() - self.m_MaxLimitX = reader.read_float() - self.m_MaxLimitY = reader.read_float() - self.m_MaxLimitZ = reader.read_float() - - -class Human: - def __init__(self, reader): - version = reader.version - self.m_RootX = xform(reader) - self.m_Skeleton = Skeleton(reader) - self.m_SkeletonPose = SkeletonPose(reader) - self.m_LeftHand = Hand(reader) - self.m_RightHand = Hand(reader) - - if version < (2018, 2): # 2018.2 down - numHandles = reader.read_int() - self.m_Handles = [Handle(reader) for _ in range(numHandles)] - numColliders = reader.read_int() - self.m_ColliderArray = [Collider(reader) - for _ in range(numColliders)] - self.m_HumanBoneIndex = reader.read_int_array() - self.m_HumanBoneMass = reader.read_float_array() - - if version < (2018, 2): # 2018.2 down - self.m_ColliderIndex = reader.read_int_array() - - self.m_Scale = reader.read_float() - self.m_ArmTwist = reader.read_float() - self.m_ForeArmTwist = reader.read_float() - self.m_UpperLegTwist = reader.read_float() - self.m_LegTwist = reader.read_float() - self.m_ArmStretch = reader.read_float() - self.m_LegStretch = reader.read_float() - self.m_FeetSpacing = reader.read_float() - self.m_HasLeftHand = reader.read_boolean() - self.m_HasRightHand = reader.read_boolean() - if version >= (5, 2): # 5.2 and up - self.m_HasTDoF = reader.read_boolean() - reader.align_stream() - - -class AvatarConstant: - def __init__(self, reader): - version = reader.version - self.m_AvatarSkeleton = Skeleton(reader) - self.m_AvatarSkeletonPose = SkeletonPose(reader) - - if version >= (4, 3): # 4.3 and up - self.m_DefaultPose = SkeletonPose(reader) - self.m_SkeletonNameIDArray = reader.read_u_int_array() - - self.m_Human = Human(reader) - - self.m_HumanSkeletonIndexArray = reader.read_int_array() - - if version >= (4, 3): # 4.3 and up - self.m_HumanSkeletonReverseIndexArray = reader.read_int_array() - - self.m_RootMotionBoneIndex = reader.read_int() - self.m_RootMotionBoneX = xform(reader) - - if version >= (4, 3): # 4.3 and up - self.m_RootMotionSkeleton = Skeleton(reader) - self.m_RootMotionSkeletonPose = SkeletonPose(reader) - - self.m_RootMotionSkeletonIndexArray = reader.read_int_array() diff --git a/UnityPy/classes/Behaviour.py b/UnityPy/classes/Behaviour.py deleted file mode 100644 index 0e0bb4ba..00000000 --- a/UnityPy/classes/Behaviour.py +++ /dev/null @@ -1,16 +0,0 @@ -from .Component import Component -from ..streams import EndianBinaryReader, EndianBinaryWriter - -class Behaviour(Component): - def __init__(self, reader : EndianBinaryReader): - super().__init__(reader=reader) - self.m_Enabled = reader.read_byte() - reader.align_stream() - - def save(self, writer: EndianBinaryWriter = None): - if writer is None: - writer = EndianBinaryWriter(endian=self.reader.endian) - version = self.version - super().save(writer) - writer.write_byte(self.m_Enabled) - writer.align_stream() \ No newline at end of file diff --git a/UnityPy/classes/BuildSettings.py b/UnityPy/classes/BuildSettings.py deleted file mode 100644 index 41d7545b..00000000 --- a/UnityPy/classes/BuildSettings.py +++ /dev/null @@ -1,12 +0,0 @@ -from .Object import Object - - -class BuildSettings(Object): - def __init__(self, reader): - super().__init__(reader=reader) - self.levels = reader.read_string_array() - self.has_render_texture = reader.read_boolean() - self.has_pro_version = reader.read_boolean() - self.has_publishing_rights = reader.read_boolean() - self.has_shadows = reader.read_boolean() - self.version = reader.read_aligned_string() diff --git a/UnityPy/classes/Component.py b/UnityPy/classes/Component.py deleted file mode 100644 index f36abfe8..00000000 --- a/UnityPy/classes/Component.py +++ /dev/null @@ -1,16 +0,0 @@ -from .EditorExtension import EditorExtension -from .PPtr import PPtr, save_ptr -from ..streams import EndianBinaryReader, EndianBinaryWriter - - -class Component(EditorExtension): - def __init__(self, reader: EndianBinaryReader): - super().__init__(reader=reader) - self.m_GameObject = PPtr(reader) # GameObject - - def save(self, writer: EndianBinaryWriter = None): - if writer is None: - writer = EndianBinaryWriter(endian=self.reader.endian) - version = self.version - super().save(writer) - save_ptr(self.m_GameObject, writer) diff --git a/UnityPy/classes/EditorExtension.py b/UnityPy/classes/EditorExtension.py deleted file mode 100644 index 4d01b55b..00000000 --- a/UnityPy/classes/EditorExtension.py +++ /dev/null @@ -1,20 +0,0 @@ -from .Object import Object -from .PPtr import PPtr, save_ptr -from ..enums import BuildTarget -from ..streams import EndianBinaryWriter - - -class EditorExtension(Object): - def __init__(self, reader): - super().__init__(reader=reader) - if self.platform == BuildTarget.NoTarget: - self.m_PrefabParentObject = PPtr(reader) - self.m_PrefabInternal = PPtr(reader) - - def save(self, writer: EndianBinaryWriter = None): - if not writer: - writer = EndianBinaryWriter(endian = self.reader.endian) - super().save(writer, intern_call=True) - if self.platform == BuildTarget.NoTarget: - save_ptr(self.m_PrefabParentObject, writer) - save_ptr(self.m_PrefabInternal, writer) diff --git a/UnityPy/classes/Font.py b/UnityPy/classes/Font.py deleted file mode 100644 index 0241b478..00000000 --- a/UnityPy/classes/Font.py +++ /dev/null @@ -1,85 +0,0 @@ -from .NamedObject import NamedObject -from .PPtr import PPtr - - -class Font(NamedObject): - def __init__(self, reader): - super().__init__(reader=reader) - version = self.version - if version >= (5, 5): # 5.5 and up: - self.m_LineSpacing = reader.read_float() - self.m_DefaultMaterial = PPtr(reader) - self.m_FontSize = reader.read_float() - self.m_Texture = PPtr(reader) - self.m_AsciiStartOffset = reader.read_int() - self.m_Tracking = reader.read_float() - self.m_CharacterSpacing = reader.read_int() - self.m_CharacterPadding = reader.read_int() - self.m_ConvertCase = reader.read_int() - CharacterRects_size = reader.read_int() - for i in range(CharacterRects_size): - reader.Position += 44 # CharacterInfo data 41 - KerningValues_size = reader.read_int() - for i in range(KerningValues_size): - reader.Position += 8 - self.m_PixelScale = reader.read_float() - FontData_size = reader.read_int() - if FontData_size > 0: - self.m_FontData = reader.read_bytes(FontData_size) - else: - self.m_AsciiStartOffset = reader.read_int() - - if version[:1] <= (3,): - self.m_FontCountX = reader.read_int() - self.m_FontCountY = reader.read_int() - - self.m_Kerning = reader.read_float() - self.m_LineSpacing = reader.read_float() - - if version[:1] <= (3,): - PerCharacterKerning_size = reader.read_int() - for i in range(PerCharacterKerning_size): - first = reader.read_int() - second = reader.read_float() - else: - self.m_CharacterSpacing = reader.read_int() - self.m_CharacterPadding = reader.read_int() - - self.m_ConvertCase = reader.read_int() - self.m_DefaultMaterial = PPtr(reader) - - CharacterRects_size = reader.read_int() - for i in range(CharacterRects_size): - index = reader.read_int() - # Rectf uv - uvx = reader.read_float() - uvy = reader.read_float() - uvwidth = reader.read_float() - uvheight = reader.read_float() - # Rectf vert - vertx = reader.read_float() - verty = reader.read_float() - vertwidth = reader.read_float() - vertheight = reader.read_float() - width = reader.read_float() - - if version >= (4,): - flipped = reader.read_boolean() - reader.align_stream() - - self.m_Texture = PPtr(reader) - - KerningValues_size = reader.read_int() - for i in range(KerningValues_size): - pairfirst = reader.read_short() - pairsecond = reader.read_short() - second = reader.read_float() - - if version[:1] <= (3,): - self.m_GridFont = reader.read_boolean() - reader.align_stream() - else: - self.m_PixelScale = reader.read_float() - FontData_size = reader.read_int() - if FontData_size > 0: - self.m_FontData = reader.read_bytes(FontData_size) diff --git a/UnityPy/classes/GameObject.py b/UnityPy/classes/GameObject.py deleted file mode 100644 index 7517fc40..00000000 --- a/UnityPy/classes/GameObject.py +++ /dev/null @@ -1,50 +0,0 @@ -from .EditorExtension import EditorExtension -from .PPtr import PPtr -from ..enums import ClassIDType - - -class GameObject(EditorExtension): - m_Components: list - m_Layer: int - name: str - m_Animator: PPtr - m_Animation: PPtr - m_Transform: PPtr - m_MeshRenderer: PPtr - m_SkinnedMeshRender: PPtr - m_MeshFilter: PPtr - - def __init__(self, reader): - super().__init__(reader=reader) - - self.m_Animator = None - self.m_Animation = None - self.m_Transform = None - self.m_MeshRenderer = None - self.m_SkinnedMeshRenderer = None - self.m_MeshFilter = None - - component_size = reader.read_int() - - self.m_Components = [None] * component_size - for i in range(component_size): - if self.version < (5, 5): - first = reader.read_int() - component = PPtr(reader) - self.m_Components[i] = component - - if component.type == ClassIDType.Animator: - self.m_Animator = component - elif component.type == ClassIDType.Animation: - self.m_Animation = component - elif component.type in [ClassIDType.Transform, ClassIDType.RectTransform]: - self.m_Transform = component - elif component.type == ClassIDType.MeshRenderer: - self.m_MeshRenderer = component - elif component.type == ClassIDType.SkinnedMeshRenderer: - self.m_SkinnedMeshRenderer = component - elif component.type == ClassIDType.MeshFilter: - self.m_MeshFilter = component - - self.m_Layer = reader.read_int() - self.name = reader.read_aligned_string() diff --git a/UnityPy/classes/Material.py b/UnityPy/classes/Material.py deleted file mode 100644 index f8697512..00000000 --- a/UnityPy/classes/Material.py +++ /dev/null @@ -1,70 +0,0 @@ -from .NamedObject import NamedObject -from .PPtr import PPtr - - -class Material(NamedObject): - def __init__(self, reader): - super().__init__(reader=reader) - version = self.version - self.m_Shader = PPtr(reader) # Shader - - if version >= (2021, 3): # 2021.3 and up - self.m_ValidKeywords = reader.read_string_array() - self.m_InvalidKeywords = reader.read_string_array() - elif version >= (5,): # 5.0 and up - self.m_ShaderKeywords = reader.read_aligned_string() - elif version >= (4, 1): # 4.x - self.m_ShaderKeywords = reader.read_string_array() - - if version >= (5,): - self.m_LightmapFlags = reader.read_u_int() - - if version >= (5, 6): # 5.6 and up - self.m_EnableInstancingVariants = reader.read_boolean() - # var m_DoubleSidedGI = a_Stream.read_boolean() //2017 and up - reader.align_stream() - - if version >= (4, 3): # 4.3 and up - self.m_CustomRenderQueue = reader.read_int() - - if version >= (5, 1): # 5.1 and up - self.stringTagMap = { - reader.read_aligned_string(): reader.read_aligned_string() - for _ in range(reader.read_int()) - } - - if version >= (5, 6): # 5.6 and up - self.disabledShaderPasses = reader.read_string_array() - - self.m_SavedProperties = UnityPropertySheet(reader) - - -class UnityTexEnv: - def __init__(self, reader): - self.m_Texture = PPtr(reader) # Texture - self.m_Scale = reader.read_vector2() - self.m_Offset = reader.read_vector2() - - -class UnityPropertySheet: - def __init__(self, reader): - self.m_TexEnvs = { - reader.read_aligned_string(): UnityTexEnv(reader) - for _ in range(reader.read_int()) - } - - if reader.version >= (2021,): # 2021.1 and up - self.m_Ints = { - reader.read_aligned_string(): reader.read_int() - for _ in range(reader.read_int()) - } - - self.m_Floats = { - reader.read_aligned_string(): reader.read_float() - for _ in range(reader.read_int()) - } - - self.m_Colors = { - reader.read_aligned_string(): reader.read_color4() - for _ in range(reader.read_int()) - } diff --git a/UnityPy/classes/Mesh.py b/UnityPy/classes/Mesh.py deleted file mode 100644 index 6a500421..00000000 --- a/UnityPy/classes/Mesh.py +++ /dev/null @@ -1,1061 +0,0 @@ -import math -from typing import List - -from .AnimationClip import AABB, PackedFloatVector, PackedIntVector -from .NamedObject import NamedObject -from .Texture2D import StreamingInfo -from ..helpers.ResourceReader import get_resource_data -from ..math import Matrix4x4, Vector3 -from ..streams import EndianBinaryWriter -from ..enums import GfxPrimitiveType -import struct -from enum import IntEnum -from ..export import MeshExporter - -try: - from UnityPy import UnityPyBoost -except: - UnityPyBoost = None - - -class MinMaxAABB: - def __init__(self, reader): - self.m_Min = reader.read_vector3() - self.m_Max = reader.read_vector3() - - def save(self, writer): - writer.write_vector3(self.m_Min) - writer.write_vector3(self.m_Max) - - -class CompressedMesh: - def __init__(self, reader): - version = reader.version - self.m_Vertices = PackedFloatVector(reader) - self.m_UV = PackedFloatVector(reader) - if version[0] < 5: # 5 down - self.m_BindPoses = PackedFloatVector(reader) - self.m_Normals = PackedFloatVector(reader) - self.m_Tangents = PackedFloatVector(reader) - self.m_Weights = PackedIntVector(reader) - self.m_NormalSigns = PackedIntVector(reader) - self.m_TangentSigns = PackedIntVector(reader) - if version >= (5,): # 5 and up - self.m_FloatColors = PackedFloatVector(reader) - self.m_BoneIndices = PackedIntVector(reader) - self.m_Triangles = PackedIntVector(reader) - if version >= (3, 5): # 3.5 and up - if version[0] < 5: # 5 down - self.m_Colors = PackedIntVector(reader) - else: - self.m_UVInfo = reader.read_u_int() - - def save(self, writer, version): - self.m_Vertices.save(writer) - self.m_UV.save(writer) - if version < (5,): # 5 down - self.m_BindPoses.save(writer) - self.m_Normals.save(writer) - self.m_Tangents.save(writer) - self.m_Weights.save(writer) - self.m_NormalSigns.save(writer) - self.m_TangentSigns.save(writer) - if version >= (5,): # 5 and up - self.m_FloatColors.save(writer) - self.m_BoneIndices.save(writer) - self.m_Triangles.save(writer) - if version >= (3, 5): # 3.5 and up - if version < (5,): # 5 down - self.m_Colors.save(writer) - else: - writer.write_u_int(self.m_UVInfo) - - -class StreamInfo: - def __init__(self, **kwargs): - if "reader" in kwargs: - reader = kwargs["reader"] - version = reader.version - self.channelMask = reader.read_u_int() - self.offset = reader.read_u_int() - - if version < (4,): # 4.0 down - self.stride = reader.read_u_int() - self.align = reader.read_u_int() - else: - self.stride = reader.read_byte() - self.dividerOp = reader.read_byte() - self.frequency = reader.read_u_short() - else: - self.__dict__ = kwargs - - def save(self, writer: EndianBinaryWriter, version: tuple): - writer.write_u_int(self.channelMask) - writer.write_u_int(self.offset) - - if version < (4,): # 4.0 down - writer.write_u_int(self.stride) - writer.write_u_int(self.align) - else: - writer.write_byte(self.stride) - writer.write_byte(self.dividerOp) - writer.write_u_short(self.frequency) - - -class ChannelInfo: - def __init__(self, reader): - self.stream = reader.read_byte() - self.offset = reader.read_byte() - self.format = reader.read_byte() - self.dimension = reader.read_byte() & 0xF - - def save(self, writer): - writer.write_byte(self.stream) - writer.write_byte(self.offset) - writer.write_byte(self.format) - writer.write_byte(self.dimension) - - -class VertexData: - def __init__(self, reader): - self.reader = reader - version = reader.version - - if version < (2018,): # 2018 down - self.m_CurrentChannels = reader.read_u_int() - - self.m_VertexCount = reader.read_u_int() - - if version >= (4,): # 4.0 and up - m_ChannelsSize = reader.read_int() - self.m_Channels = [ChannelInfo(reader) for _ in range(m_ChannelsSize)] - - if version < (5,): # 5.0 down - if version < (4,): # 4.0 down - m_StreamsSize = 4 - else: - m_StreamsSize = reader.read_int() - - self.m_Streams = [StreamInfo(reader=reader) for _ in range(m_StreamsSize)] - - if version < (4,): # 4.0 down - self.GetChannels() - else: # 5.0 and up - self.GetStreams() - - self.m_DataSize = reader.read_bytes(reader.read_int()) - reader.align_stream() - - def save(self, writer: EndianBinaryWriter, version): - if version < (2018,): # 2018 down - writer.write_u_int(self.m_CurrentChannels) - - writer.write_u_int(self.m_VertexCount) - - if version >= (4,): # 4.0 and up - writer.write_int(len(self.m_Channels)) - for ch in self.m_Channels: - ch.save(writer) - - if (4,) <= version[:2] < (5,): # 4.0 and up to 5.0 - writer.write_int(len(self.m_Streams)) - - for stream in self.m_Streams: - stream.save(writer=writer, version=version) - - if version < (4,): # 4.0 down - raise Exception("Unsupported version") - else: # 5.0 and up - # for stream in self.m_Streams: - # stream.save(writer) - pass - - writer.write_int(len(self.m_DataSize)) - writer.write_bytes(self.m_DataSize) - writer.align_stream() - - def GetStreams(self): - streamCount = 1 - if self.m_Channels: - streamCount += max(x.stream for x in self.m_Channels) - - self.m_Streams = {} - offset = 0 - for s in range(streamCount): - chnMask = 0 - stride = 0 - for chn, m_Channel in enumerate(self.m_Channels): - if m_Channel.stream == s: - if m_Channel.dimension > 0: - chnMask |= 1 << chn # Shift 1UInt << chn - stride += m_Channel.dimension * MeshHelper.GetFormatSize( - MeshHelper.ToVertexFormat( - m_Channel.format, self.reader.version - ) - ) - self.m_Streams[s] = StreamInfo( - channelMask=chnMask, - offset=offset, - stride=stride, - dividerOp=0, - frequency=0, - ) - offset += self.m_VertexCount * stride - # static size_t align_streamSize (size_t size) { return (size + (kVertexStreamAlign-1)) & ~(kVertexStreamAlign-1) - offset = (offset + (16 - 1)) & ~( - 16 - 1 - ) # (offset + (16u - 1u)) & ~(16u - 1u); - - def GetChannels(self): - self.m_Channels = [] # ChannelInfo[6] - for i in range(6): - self.m_Channels.append(ChannelInfo(self.reader)) - for s, m_Stream in enumerate(self.m_Streams): - channelMask = bytearray(m_Stream.channelMask) # BitArray - offset = 0 - for i in range(6): - if channelMask[i]: - m_Channel = self.m_Channels[i] - m_Channel.stream = s - m_Channel.offset = offset - if i in [0, 1]: - # 0 - kShaderChannelVertex - # 1 - kShaderChannelNormal - m_Channel.format = 0 # kChannelFormatFloat - m_Channel.dimension = 3 - elif i == 2: # kShaderChannelColor - m_Channel.format = 2 # kChannelFormatColor - m_Channel.dimension = 4 - elif i in [3, 4]: - # 3 - kShaderChannelTexCoord0 - # 4 - kShaderChannelTexCoord1 - m_Channel.format = 0 # kChannelFormatFloat - m_Channel.dimension = 2 - elif i == 5: # kShaderChannelTangent - m_Channel.format = 0 # kChannelFormatFloat - m_Channel.dimension = 4 - offset += m_Channel.dimension * MeshHelper.GetFormatSize( - MeshHelper.ToVertexFormat(m_Channel.format, self.reader.version) - ) - - -class BoneWeights4: - def __init__(self, reader=None): - if reader: - self.weight = reader.read_float_array(4) - self.boneIndex = reader.read_int_array(4) - else: - self.weight = [0.0] * 4 - self.boneIndex = [0] * 4 - - def save(self, writer): - writer.write_float_array(self.weight) - writer.write_int_array(self.boneIndex) - - -class BlendShapeVertex: - def __init__(self, reader): - self.vertex = reader.read_vector3() - self.normal = reader.read_vector3() - self.tangent = reader.read_vector3() - self.index = reader.read_u_int() - - -class MeshBlendShape: - def __init__(self, reader): - version = reader.version - - if version < (4, 3): # 4.3 down - self.name = reader.read_aligned_string() - self.firstVertex = reader.read_u_int() - self.vertexCount = reader.read_u_int() - if version < (4, 3): # 4.3 down - self.aabbMinDelta = reader.read_vector3() - self.aabbMaxDelta = reader.read_vector3() - self.hasNormals = reader.read_boolean() - self.hasTangents = reader.read_boolean() - if version >= (4, 3): # 4.3 and up - reader.align_stream() - - -class MeshBlendShapeChannel: - def __init__(self, reader): - self.name = reader.read_aligned_string() - self.nameHash = reader.read_u_int() - self.frameIndex = reader.read_int() - self.frameCount = reader.read_int() - - -class BlendShapeData: - def __init__(self, reader): - version = reader.version - - if version >= (4, 3): # 4.3 and up - numVerts = reader.read_int() - self.vertices = [BlendShapeVertex(reader) for _ in range(numVerts)] - - numShapes = reader.read_int() - self.shapes = [MeshBlendShape(reader) for _ in range(numShapes)] - - numChannels = reader.read_int() - self.channels = [MeshBlendShapeChannel(reader) for _ in range(numChannels)] - self.fullWeights = reader.read_float_array() - else: - m_ShapesSize = reader.read_int() - self.m_Shapes = [MeshBlendShape(reader) for _ in range(m_ShapesSize)] - reader.align_stream() - m_ShapeVerticesSize = reader.read_int() - self.m_ShapeVertices = [ - BlendShapeVertex(reader) for _ in range(m_ShapeVerticesSize) - ] - - -class SubMesh: - def __init__(self, reader): - version = reader.version - self.firstByte = reader.read_u_int() - self.indexCount = reader.read_u_int() - self.topology = GfxPrimitiveType(reader.read_int()) - - if version < (4,): # 4.0 down - self.triangleCount = reader.read_u_int() - - if version >= (2017, 3): # 2017.3 and up - self.baseVertex = reader.read_u_int() - - if version >= (3,): # 3.0 and up - self.firstVertex = reader.read_u_int() - self.vertexCount = reader.read_u_int() - self.localAABB = AABB(reader) - - def save(self, writer, version): - writer.write_u_int(self.firstByte) - writer.write_u_int(self.indexCount) - writer.write_int(self.topology.value) - - if version < (4,): # 4.0 down - writer.write_u_int(self.triangleCount) - - if version >= (2017, 3): # 2017.3 and up - writer.write_u_int(self.baseVertex) - - if version >= (3,): # 3.0 and up - writer.write_u_int(self.firstVertex) - writer.write_u_int(self.vertexCount) - self.localAABB.save(writer) - - -class Mesh(NamedObject): - def export(self): - return MeshExporter.export_mesh(self) - - def __init__(self, reader): - super().__init__(reader=reader) - version = reader.version - - self.m_Use16BitIndices = True - self.m_Indices = [] - self.m_BindPose = [] - self.m_BoneNameHashes = [] - self.m_Vertices = [] - self.m_Skin = [] - self.m_Normals = [] - self.m_Colors = [] - self.m_UV0 = [] - self.m_UV1 = [] - self.m_UV2 = [] - self.m_UV3 = [] - self.m_UV4 = [] - self.m_UV5 = [] - self.m_UV6 = [] - self.m_UV7 = [] - self.m_Tangents = [] - - if version < (3, 5): # 3.5 down - self.m_Use16BitIndices = reader.read_int() > 0 - - if version[:2] <= (2, 5): # 2.5 and down - m_IndexBuffer_size = reader.read_int() - - if self.m_Use16BitIndices: - self.m_IndexBuffer = [ - reader.read_u_short() - for _ in range(math.ceil(m_IndexBuffer_size / 2)) - ] - reader.align_stream() - else: - self.m_IndexBuffer = reader.read_u_int_array( - math.ceil(m_IndexBuffer_size / 4) - ) - - m_SubMeshesSize = reader.read_int() - self.m_SubMeshes = [SubMesh(reader) for _ in range(m_SubMeshesSize)] - - if version >= (4, 1): # 4.1 and up - self.m_Shapes = BlendShapeData(reader) - - if version >= (4, 3): # 4.3 and up - self.m_BindPose = reader.read_matrix_array() - self.m_BoneNameHashes = reader.read_u_int_array() - self.m_RootBoneNameHash = reader.read_u_int() - - if version >= (2, 6): # 2.6.0 and up - if version >= (2019,): # 2019 and up - m_BonesAABBSize = reader.read_int() - self.m_BonesAABB = [MinMaxAABB(reader) for _ in range(m_BonesAABBSize)] - self.m_VariableBoneCountWeights = reader.read_u_int_array() - - self.m_MeshCompression = reader.read_byte() - if version >= (4,): # - if version < (5,): # - self.m_StreamCompression = reader.read_byte() - self.m_IsReadable = reader.read_boolean() - self.m_KeepVertices = reader.read_boolean() - self.m_KeepIndices = reader.read_boolean() - reader.align_stream() - - # Unity fixed it in 2017.3.1p1 and later versions - if ( - version >= (2017, 4) # 2017.4 - # fixed after 2017.3.1px - or version[:3] == (2017, 3, 1) - and self.build_type.IsPatch - # 2017.3.xfx with no compression - or version[:2] == (2017, 3) - and self.m_MeshCompression == 0 - ): - self.m_IndexFormat = reader.read_int() - self.m_Use16BitIndices = self.m_IndexFormat == 0 - - m_IndexBuffer_size = reader.read_int() - if self.m_Use16BitIndices: - self.m_IndexBuffer = [ - reader.read_u_short() - for _ in range(math.ceil(m_IndexBuffer_size / 2)) - ] - reader.align_stream() - else: - self.m_IndexBuffer = reader.read_u_int_array( - math.ceil(m_IndexBuffer_size / 4) - ) - - if version < (3, 5): # 3.4.2 and earlier - self.m_VertexCount = reader.read_int() - self.m_Vertices = reader.read_float_array(self.m_VertexCount * 3) # Vector3 - - self.m_SkinSize = reader.read_int() - self.m_Skin = [BoneWeights4(reader) for _ in range(self.m_SkinSize)] - - self.m_BindPose = reader.read_matrix_array() - self.m_UV0 = reader.read_float_array(reader.read_int() * 2) # Vector2 - self.m_UV1 = reader.read_float_array(reader.read_int() * 2) # Vector2 - - if version[:2] <= (2, 5): # 2.5 and down - m_TangentSpace_size = reader.read_int() - self.m_Normals = [0] * (m_TangentSpace_size * 3) - self.m_Tangets = [0] * (m_TangentSpace_size * 4) - for v in range(m_TangentSpace_size): - self.m_Normals[v * 3] = reader.read_float() - self.m_Normals[v * 3 + 1] = reader.read_float() - self.m_Normals[v * 3 + 2] = reader.read_float() - self.m_Tangents[v * 3] = reader.read_float() - self.m_Tangents[v * 3 + 1] = reader.read_float() - self.m_Tangents[v * 3 + 2] = reader.read_float() - # handedness - self.m_Tangents[v * 3 + 3] = reader.read_float() - else: # 2.6.0 and later - self.m_Tangents = reader.read_float_array( - reader.read_int() * 4 - ) # Vector4 - self.m_Normals = reader.read_float_array( - reader.read_int() * 3 - ) # Vector3 - else: - if version[:2] < (2018, 2): # 2018.2 down - m_SkinSize = reader.read_int() - self.m_Skin = [BoneWeights4(reader) for _ in range(m_SkinSize)] - - if version[:2] <= (4, 2): # 4.2 and down - self.m_BindPose = reader.read_matrix_array() - - self.m_VertexData = VertexData(reader) - - if version >= (2, 6): # 2.6.0 and later - self.m_CompressedMesh = CompressedMesh(reader) - - self.m_LocalAABB = AABB(reader) - - if version[:2] <= (3, 4): # 3.4.2 and earlier - m_Colors_size = reader.read_int() - self.mColors = [reader.read_byte() / 0xFF for _ in range(m_Colors_size * 4)] - - m_CollisionTriangles_size = reader.read_int() - reader.Position += m_CollisionTriangles_size * 4 # UInt32 indices - m_CollisionVertexCount = reader.read_int() - - self.m_MeshUsageFlags = reader.read_int() - - if version >= (2022, 1): # 2022.1 and up - self.m_CookingOptions = reader.read_int() - - if version >= (5,): # 5.0 and up - self.m_BakedConvexCollisionMesh = reader.read_bytes(reader.read_int()) - reader.align_stream() - self.m_BakedTriangleCollisionMesh = reader.read_bytes(reader.read_int()) - reader.align_stream() - - if version >= (2018, 2): # 2018.2 and up - self.m_MeshMetrics = [reader.read_float(), reader.read_float()] - - if version >= (2018, 3): # 2018.3 and up - reader.align_stream() - self.m_StreamData = StreamingInfo(reader, version) - - if self.m_StreamData.path and self.m_VertexData.m_VertexCount > 0: - self.m_VertexData.m_DataSize = get_resource_data( - self.m_StreamData.path, - self.assets_file, - self.m_StreamData.offset, - self.m_StreamData.size, - ) - - # Fix channel after 2018.3 - version = self.version - if version >= (3, 5): # 3.5 and up - self.ReadVertexData() - - if version >= (2, 6): # 2.6.0 and later - self.DecompressCompressedMesh() - - self.GetTriangles() - - def ReadVertexData(self): - version = self.version - m_VertexData = self.m_VertexData - m_VertexCount = self.m_VertexCount = m_VertexData.m_VertexCount - - for chn, m_Channel in enumerate(m_VertexData.m_Channels): - if m_Channel.dimension > 0: - m_Stream = m_VertexData.m_Streams[m_Channel.stream] - channelMask = bin(m_Stream.channelMask)[::-1] - if channelMask[chn] == "1": - if version[0] < 2018 and chn == 2 and m_Channel.format == 2: - m_Channel.dimension = 4 - - componentByteSize = MeshHelper.GetFormatSize( - MeshHelper.ToVertexFormat(m_Channel.format, self.reader.version) - ) - swap = self.reader.endian == "<" and componentByteSize > 1 - - if UnityPyBoost: - componentBytes = UnityPyBoost.unpack_vertexdata( - bytes(m_VertexData.m_DataSize), - componentByteSize, - m_VertexCount, - m_Stream.offset, - m_Stream.stride, - m_Channel.offset, - m_Channel.dimension, - swap, - ) - else: - componentBytes = bytearray( - m_VertexCount * m_Channel.dimension * componentByteSize - ) - - vertexBaseOffset = m_Stream.offset + m_Channel.offset - for v in range(m_VertexCount): - vertexOffset = vertexBaseOffset + m_Stream.stride * v - for d in range(m_Channel.dimension): - componentOffset = vertexOffset + componentByteSize * d - vertexDataSrc = componentOffset - componentDataSrc = componentByteSize * ( - v * m_Channel.dimension + d - ) - buff = m_VertexData.m_DataSize[ - vertexDataSrc : vertexDataSrc + componentByteSize - ] - if swap: # swap bytes - buff = buff[::-1] - componentBytes[ - componentDataSrc : componentDataSrc - + componentByteSize - ] = buff - - if MeshHelper.IsIntFormat(version, m_Channel.format): - componentsIntArray = MeshHelper.BytesToIntArray( - componentBytes, componentByteSize - ) - else: - componentsFloatArray = MeshHelper.BytesToFloatArray( - componentBytes, - componentByteSize, - MeshHelper.ToVertexFormat(m_Channel.format, version), - ) - - if version[0] >= 2018: - if chn == 0: # kShaderChannelVertex - self.m_Vertices = componentsFloatArray - elif chn == 1: # kShaderChannelNormal - self.m_Normals = componentsFloatArray - elif chn == 2: # kShaderChannelTangent - self.m_Tangents = componentsFloatArray - elif chn == 3: # kShaderChannelColor - self.m_Colors = componentsFloatArray - elif chn == 4: # kShaderChannelTexCoord0 - self.m_UV0 = componentsFloatArray - elif chn == 5: # kShaderChannelTexCoord1 - self.m_UV1 = componentsFloatArray - elif chn == 6: # kShaderChannelTexCoord2 - self.m_UV2 = componentsFloatArray - elif chn == 7: # kShaderChannelTexCoord3 - self.m_UV3 = componentsFloatArray - elif chn == 8: # kShaderChannelTexCoord4 - self.m_UV4 = componentsFloatArray - elif chn == 9: # kShaderChannelTexCoord5 - self.m_UV5 = componentsFloatArray - elif chn == 10: # kShaderChannelTexCoord6 - self.m_UV6 = componentsFloatArray - elif chn == 11: # kShaderChannelTexCoord7 - self.m_UV7 = componentsFloatArray - # 2018.2 and up - elif chn == 12: # kShaderChannelBlendWeight - if not self.m_Skin: - self.InitMSkin() - for i in range(m_VertexCount): - for j in range(m_Channel.dimension): - self.m_Skin[i].weight[j] = componentsFloatArray[ - i * m_Channel.dimension + j - ] - elif chn == 13: # kShaderChannelBlendIndices - if not self.m_Skin: - self.InitMSkin() - for i in range(m_VertexCount): - for j in range(m_Channel.dimension): - self.m_Skin[i].boneIndex[j] = componentsIntArray[ - i * m_Channel.dimension + j - ] - else: - if chn == 0: # kShaderChannelVertex - self.m_Vertices = componentsFloatArray - elif chn == 1: # kShaderChannelNormal - self.m_Normals = componentsFloatArray - elif chn == 2: # kShaderChannelColor - self.m_Colors = componentsFloatArray - elif chn == 3: # kShaderChannelTexCoord0 - self.m_UV0 = componentsFloatArray - elif chn == 4: # kShaderChannelTexCoord1 - self.m_UV1 = componentsFloatArray - elif chn == 5: - if version[0] >= 5: # kShaderChannelTexCoord2 - self.m_UV2 = componentsFloatArray - else: # kShaderChannelTangent - self.m_Tangents = componentsFloatArray - elif chn == 6: # kShaderChannelTexCoord3 - self.m_UV3 = componentsFloatArray - elif chn == 7: # kShaderChannelTangent - self.m_Tangents = componentsFloatArray - - def DecompressCompressedMesh(self): - # Vertex - version = self.version - m_CompressedMesh = self.m_CompressedMesh - if m_CompressedMesh.m_Vertices.m_NumItems > 0: - self.m_VertexCount = int(m_CompressedMesh.m_Vertices.m_NumItems / 3) - self.m_Vertices = m_CompressedMesh.m_Vertices.UnpackFloats(3, 3 * 4) - m_VertexCount = self.m_VertexCount - # UV - if m_CompressedMesh.m_UV.m_NumItems > 0: # - - m_UVInfo = m_CompressedMesh.m_UVInfo - if m_UVInfo != 0: - kInfoBitsPerUV = 4 - kUVDimensionMask = 3 - kUVChannelExists = 4 - kMaxTexCoordShaderChannels = 8 - - uvSrcOffset = 0 - - for uv in range(kMaxTexCoordShaderChannels): - texCoordBits = m_UVInfo >> (uv * kInfoBitsPerUV) - texCoordBits &= (1 << kInfoBitsPerUV) - 1 - if (texCoordBits & kUVChannelExists) != 0: - uvDim = 1 + int(texCoordBits & kUVDimensionMask) - m_UV = m_CompressedMesh.m_UV.UnpackFloats( - uvDim, uvDim * 4, uvSrcOffset, self.m_VertexCount - ) - self.SetUV(uv, m_UV) - else: - self.m_UV0 = m_CompressedMesh.m_UV.UnpackFloats( - 2, 2 * 4, 0, m_VertexCount - ) - if m_CompressedMesh.m_UV.m_NumItems >= m_VertexCount * 4: # - self.m_UV1 = m_CompressedMesh.m_UV.UnpackFloats( - 2, 2 * 4, m_VertexCount * 2, m_VertexCount - ) - - # BindPose - if version < (5,): # 5.0 down - if m_CompressedMesh.m_BindPoses.m_NumItems > 0: # - m_BindPoses_Unpacked = m_CompressedMesh.m_BindPoses.UnpackFloats( - 16, 4 * 16 - ) - self.m_BindPose = [ - Matrix4x4(m_BindPoses_Unpacked[i : i + 16]) - for i in range(0, m_CompressedMesh.m_BindPoses.m_NumItems, 16) - ] - # Normal - if m_CompressedMesh.m_Normals.m_NumItems > 0: - normalData = m_CompressedMesh.m_Normals.UnpackFloats(2, 4 * 2) - signs = m_CompressedMesh.m_NormalSigns.UnpackInts() - self.m_Normals = [] # float[m_CompressedMesh.m_Normals.m_NumItems / 2 * 3] - for i in range(0, math.ceil(m_CompressedMesh.m_Normals.m_NumItems / 2)): - x = normalData[i * 2 + 0] - y = normalData[i * 2 + 1] - zsqr = 1 - x * x - y * y - if zsqr >= 0: - z = math.sqrt(zsqr) - else: - z = 0 - normal = Vector3(x, y, z) - normal.normalize() - x = normal.X - y = normal.Y - z = normal.Z - if signs[i] == 0: - z = -z - self.m_Normals.extend([x, y, z]) - # Tangent - if m_CompressedMesh.m_Tangents.m_NumItems > 0: - tangentData = m_CompressedMesh.m_Tangents.UnpackFloats(2, 4 * 2) - signs = m_CompressedMesh.m_TangentSigns.UnpackInts() - self.m_Tangents = ( - [] - ) # float[m_CompressedMesh.m_Tangents.m_NumItems / 2 * 4] - for i in range(0, math.ceil(m_CompressedMesh.m_Tangents.m_NumItems / 2)): - x = tangentData[i * 2 + 0] - y = tangentData[i * 2 + 1] - zsqr = 1 - x * x - y * y - if zsqr >= 0: - z = math.sqrt(zsqr) - else: - z = 0 - vector3f = Vector3(x, y, z) - vector3f.normalize() - x = vector3f.X - y = vector3f.Y - z = vector3f.Z - if signs[i * 2 + 0] == 0: # - z = -z - w = 1.0 if signs[i * 2 + 1] > 0 else -1.0 - self.m_Tangents.extend([x, y, z, w]) - - # FloatColor - if version >= (5,): # 5.0 and up - if m_CompressedMesh.m_FloatColors.m_NumItems > 0: # - self.m_Colors = m_CompressedMesh.m_FloatColors.UnpackFloats(1, 4) - - # Skin - if m_CompressedMesh.m_Weights.m_NumItems > 0: - weights = m_CompressedMesh.m_Weights.UnpackInts() - boneIndices = m_CompressedMesh.m_BoneIndices.UnpackInts() - self.InitMSkin() - bonePos = 0 - boneIndexPos = 0 - j = 0 - sum = 0 - - for i in range(m_CompressedMesh.m_Weights.m_NumItems): - # read bone index and weight. - self.m_Skin[bonePos].weight[j] = weights[i] / 31.0 - self.m_Skin[bonePos].boneIndex[j] = boneIndices[boneIndexPos] - boneIndexPos += 1 - j += 1 - sum += weights[i] - - # the weights add up to one. fill the rest for this vertex with zero, and continue with next one. - if sum >= 31: # - while j < 4: - self.m_Skin[bonePos].weight[j] = 0 - self.m_Skin[bonePos].boneIndex[j] = 0 - j += 1 - - bonePos += 1 - j = 0 - sum = 0 - # we read three weights, but they don't add up to one. calculate the fourth one, and read - # missing bone index. continue with next vertex. - elif j == 3: # - self.m_Skin[bonePos].weight[j] = (31 - sum) / 31.0 - self.m_Skin[bonePos].boneIndex[j] = boneIndices[boneIndexPos] - boneIndexPos += 1 - bonePos += 1 - j = 0 - sum = 0 - # IndexBuffer - if m_CompressedMesh.m_Triangles.m_NumItems > 0: # - self.m_IndexBuffer = m_CompressedMesh.m_Triangles.UnpackInts() - # Color - if ( - hasattr(m_CompressedMesh, "m_Colors") - and m_CompressedMesh.m_Colors.m_NumItems > 0 - ): - m_CompressedMesh.m_Colors.m_NumItems *= 4 - m_CompressedMesh.m_Colors.m_BitSize /= 4 - tempColors = m_CompressedMesh.m_Colors.UnpackInts() - self.m_Colors = [color / 255 for color in tempColors] - - def GetTriangles(self): - m_IndexBuffer = self.m_IndexBuffer - m_Indices = self.m_Indices - - for m_SubMesh in self.m_SubMeshes: - firstIndex = m_SubMesh.firstByte // 2 - if not self.m_Use16BitIndices: - firstIndex //= 2 - - indexCount = m_SubMesh.indexCount - topology = m_SubMesh.topology - if topology == GfxPrimitiveType.kPrimitiveTriangles: - m_Indices.extend( - m_IndexBuffer[firstIndex : firstIndex + indexCount - indexCount % 3] - ) - - elif ( - self.version[0] < 4 - or topology == GfxPrimitiveType.kPrimitiveTriangleStrip - ): - # de-stripify : - triIndex = 0 - for i in range(indexCount - 2): - a, b, c = m_IndexBuffer[firstIndex + i : firstIndex + i + 3] - - # skip degenerates - if a == b or a == c or b == c: - continue - - # do the winding flip-flop of strips : - m_Indices.extend([b, a, c] if ((i & 1) == 1) else [a, b, c]) - triIndex += 3 - # fix indexCount - m_SubMesh.indexCount = triIndex - - elif topology == GfxPrimitiveType.kPrimitiveQuads: - for q in range(0, indexCount, 4): - m_Indices.extend( - [ - m_IndexBuffer[firstIndex + q], - m_IndexBuffer[firstIndex + q + 1], - m_IndexBuffer[firstIndex + q + 2], - m_IndexBuffer[firstIndex + q], - m_IndexBuffer[firstIndex + q + 2], - m_IndexBuffer[firstIndex + q + 3], - ] - ) - # fix indexCount - m_SubMesh.indexCount = indexCount // 2 * 3 - - else: - raise NotImplementedError( - "Failed getting triangles. Submesh topology is lines or points." - ) - - def InitMSkin(self): - self.m_Skin = [BoneWeights4() for _ in range(self.m_VertexCount)] - - def SetUV(self, uv: int, m_UV): - if uv == 0: - self.m_UV0 = m_UV - elif uv == 1: - self.m_UV1 = m_UV - elif uv == 2: - self.m_UV2 = m_UV - elif uv == 3: - self.m_UV3 == m_UV - elif uv == 4: - self.m_UV4 == m_UV - elif uv == 5: - self.m_UV5 == m_UV - elif uv == 6: - self.m_UV6 == m_UV - elif uv == 7: - self.m_UV7 == m_UV - else: - raise IndexError("Out of Range") - - def GetUV(self, uv: int): - if uv == 0: - return self.m_UV0 - elif uv == 1: - return self.m_UV1 - elif uv == 2: - return self.m_UV2 - elif uv == 3: - return self.m_UV3 - elif uv == 4: - return self.m_UV4 - elif uv == 5: - return self.m_UV5 - elif uv == 6: - return self.m_UV6 - elif uv == 7: - return self.m_UV7 - else: - raise IndexError("Out of Range") - - -class MeshHelper: - @staticmethod - def GetFormatSize(format: int) -> int: - if format in [ - VertexFormat.kVertexFormatFloat, - VertexFormat.kVertexFormatUInt32, - VertexFormat.kVertexFormatSInt32, - ]: - return 4 - elif format in [ - VertexFormat.kVertexFormatFloat16, - VertexFormat.kVertexFormatUNorm16, - VertexFormat.kVertexFormatSNorm16, - VertexFormat.kVertexFormatUInt16, - VertexFormat.kVertexFormatSInt16, - ]: - return 2 - elif format in [ - VertexFormat.kVertexFormatUNorm8, - VertexFormat.kVertexFormatSNorm8, - VertexFormat.kVertexFormatUInt8, - VertexFormat.kVertexFormatSInt8, - ]: - return 1 - raise ValueError(format) - - @staticmethod - def IsIntFormat(version, format: int) -> bool: - if version[0] < 2017: - return format == 4 - elif version[0] < 2019: - return format >= 7 - else: - return format >= 6 - - @staticmethod - def BytesToFloatArray(inputBytes, size, vformat: "VertexFormat") -> List[float]: - if vformat == VertexFormat.kVertexFormatFloat: - return struct.unpack(f">{'f'*(len(inputBytes)//4)}", inputBytes) - elif vformat == VertexFormat.kVertexFormatFloat16: - return struct.unpack(f">{'e'*(len(inputBytes)//2)}", inputBytes) - elif vformat == VertexFormat.kVertexFormatUNorm8: - return [byte / 255.0 for byte in inputBytes] - elif vformat == VertexFormat.kVertexFormatSNorm8: - return [max(((byte - 128) / 127.0), -1.0) for byte in inputBytes] - elif vformat == VertexFormat.kVertexFormatUNorm16: - return [ - x / 65535.0 - for x in struct.unpack(f">{'H'*(len(inputBytes)//2)}", inputBytes) - ] - elif vformat == VertexFormat.kVertexFormatSNorm16: - return [ - max(((x - 32768) / 32767.0), -1.0) - for x in struct.unpack(f">{'h'*(len(inputBytes)//2)}", inputBytes) - ] - - @staticmethod - def BytesToIntArray(inputBytes, size): - if size == 1: - return [x for x in inputBytes] - elif size == 2: - return [ - x for x in struct.unpack(f">{'h'*(len(inputBytes)//2)}", inputBytes) - ] - elif size == 4: - return [ - x for x in struct.unpack(f">{'i'*(len(inputBytes)//4)}", inputBytes) - ] - - @staticmethod - def ToVertexFormat(format: int, version: List[int]) -> "VertexFormat": - if version[0] < 2017: - if format == VertexChannelFormat.kChannelFormatFloat: - return VertexFormat.kVertexFormatFloat - elif format == VertexChannelFormat.kChannelFormatFloat16: - return VertexFormat.kVertexFormatFloat16 - elif format == VertexChannelFormat.kChannelFormatColor: # in 4.x is size 4 - return VertexFormat.kVertexFormatUNorm8 - elif format == VertexChannelFormat.kChannelFormatByte: - return VertexFormat.kVertexFormatUInt8 - elif format == VertexChannelFormat.kChannelFormatUInt32: # in 5.x - return VertexFormat.kVertexFormatUInt32 - else: - raise ValueError(f"Failed to convert {format.name} to VertexFormat") - elif version[0] < 2019: - if format == VertexFormat2017.kVertexFormatFloat: - return VertexFormat.kVertexFormatFloat - elif format == VertexFormat2017.kVertexFormatFloat16: - return VertexFormat.kVertexFormatFloat16 - elif ( - format == VertexFormat2017.kVertexFormatColor - or format == VertexFormat2017.kVertexFormatUNorm8 - ): - return VertexFormat.kVertexFormatUNorm8 - elif format == VertexFormat2017.kVertexFormatSNorm8: - return VertexFormat.kVertexFormatSNorm8 - elif format == VertexFormat2017.kVertexFormatUNorm16: - return VertexFormat.kVertexFormatUNorm16 - elif format == VertexFormat2017.kVertexFormatSNorm16: - return VertexFormat.kVertexFormatSNorm16 - elif format == VertexFormat2017.kVertexFormatUInt8: - return VertexFormat.kVertexFormatUInt8 - elif format == VertexFormat2017.kVertexFormatSInt8: - return VertexFormat.kVertexFormatSInt8 - elif format == VertexFormat2017.kVertexFormatUInt16: - return VertexFormat.kVertexFormatUInt16 - elif format == VertexFormat2017.kVertexFormatSInt16: - return VertexFormat.kVertexFormatSInt16 - elif format == VertexFormat2017.kVertexFormatUInt32: - return VertexFormat.kVertexFormatUInt32 - elif format == VertexFormat2017.kVertexFormatSInt32: - return VertexFormat.kVertexFormatSInt32 - else: - raise ValueError(f"Failed to convert {format.name} to VertexFormat") - else: - return VertexFormat(format) - - -class VertexChannelFormat(IntEnum): - kChannelFormatFloat = 0 - kChannelFormatFloat16 = 1 - kChannelFormatColor = 2 - kChannelFormatByte = 3 - kChannelFormatUInt32 = 4 - - -class VertexFormat2017(IntEnum): - kVertexFormatFloat = 0 - kVertexFormatFloat16 = 1 - kVertexFormatColor = 2 - kVertexFormatUNorm8 = 3 - kVertexFormatSNorm8 = 4 - kVertexFormatUNorm16 = 5 - kVertexFormatSNorm16 = 6 - kVertexFormatUInt8 = 7 - kVertexFormatSInt8 = 8 - kVertexFormatUInt16 = 9 - kVertexFormatSInt16 = 10 - kVertexFormatUInt32 = 11 - kVertexFormatSInt32 = 12 - - -class VertexFormat(IntEnum): - kVertexFormatFloat = 0 - kVertexFormatFloat16 = 1 - kVertexFormatUNorm8 = 2 - kVertexFormatSNorm8 = 3 - kVertexFormatUNorm16 = 4 - kVertexFormatSNorm16 = 5 - kVertexFormatUInt8 = 6 - kVertexFormatSInt8 = 7 - kVertexFormatUInt16 = 8 - kVertexFormatSInt16 = 9 - kVertexFormatUInt32 = 10 - kVertexFormatSInt32 = 11 diff --git a/UnityPy/classes/MeshFilter.py b/UnityPy/classes/MeshFilter.py deleted file mode 100644 index 0a2da5e1..00000000 --- a/UnityPy/classes/MeshFilter.py +++ /dev/null @@ -1,8 +0,0 @@ -from .Component import Component -from .PPtr import PPtr - - -class MeshFilter(Component): - def __init__(self, reader): - super().__init__(reader=reader) - self.m_Mesh = PPtr(reader) diff --git a/UnityPy/classes/MeshRenderer.py b/UnityPy/classes/MeshRenderer.py deleted file mode 100644 index ada714ac..00000000 --- a/UnityPy/classes/MeshRenderer.py +++ /dev/null @@ -1,6 +0,0 @@ -from .Renderer import Renderer - - -class MeshRenderer(Renderer): - def __init__(self, reader): - super().__init__(reader=reader) diff --git a/UnityPy/classes/MonoBehaviour.py b/UnityPy/classes/MonoBehaviour.py deleted file mode 100644 index 956cc8f2..00000000 --- a/UnityPy/classes/MonoBehaviour.py +++ /dev/null @@ -1,42 +0,0 @@ -from .Behaviour import Behaviour -from .PPtr import PPtr, save_ptr -from ..streams import EndianBinaryReader, EndianBinaryWriter -from ..exceptions import TypeTreeError as TypeTreeError - -class MonoBehaviour(Behaviour): - def __init__(self, reader: EndianBinaryReader): - super().__init__(reader=reader) - self.m_Script = PPtr(reader) - self.name = reader.read_aligned_string() - - self._raw_offset = reader.Position - if self.assets_file._enable_type_tree: - try: - self.read_typetree() - except TypeTreeError as e: - print("Failed to read TypeTree:\n", e) - self.assets_file._enable_type_tree = False - - def save(self, writer: EndianBinaryWriter = None, raw_data: bytes = None): - if writer is None: - writer = EndianBinaryWriter(endian=self.reader.endian) - if not raw_data: - ValueError("No raw data given") - - super().save(writer) - save_ptr(self.m_Script, writer) - writer.write_aligned_string(self.name) - writer.write(raw_data) - - self.set_raw_data(writer.bytes) - - @property - def raw_data(self) -> bytes: - """ - Reads the undocumentated data following the default init. - This is usefull for classes that are stored via MonoBehaviours. - """ - reader = self.reader - reader.Position = self._raw_offset - return reader.read_bytes(reader.byte_size - (self._raw_offset - reader.byte_start)) - diff --git a/UnityPy/classes/MonoScript.py b/UnityPy/classes/MonoScript.py deleted file mode 100644 index 6635100a..00000000 --- a/UnityPy/classes/MonoScript.py +++ /dev/null @@ -1,23 +0,0 @@ -from .NamedObject import NamedObject - - -class MonoScript(NamedObject): - def __init__(self, reader): - super().__init__(reader=reader) - version = self.version - if version >= (3, 4): # 3.4 and up - self.m_ExecutionOrder = reader.read_int() - if version < (5,): # 5.0 down - self.m_PropertiesHash = reader.read_u_int() - else: - self.m_PropertiesHash = reader.read_bytes(16) - if version < (3,): # 3.0 down - self.m_PathName = reader.read_aligned_string() - - self.m_ClassName = reader.read_aligned_string() - if version >= (3,): # 3.0 and up - self.m_Namespace = reader.read_aligned_string() - - self.m_AssemblyName = reader.read_aligned_string() - if version < (2018, 2): # 2018.2 down - self.m_IsEditorScript = reader.read_boolean() diff --git a/UnityPy/classes/MovieTexture.py b/UnityPy/classes/MovieTexture.py deleted file mode 100644 index e27af18d..00000000 --- a/UnityPy/classes/MovieTexture.py +++ /dev/null @@ -1,11 +0,0 @@ -from .PPtr import PPtr -from .Texture import Texture - - -class MovieTexture(Texture): - def __init__(self, reader): - super().__init__(reader=reader) - self.m_Loop = reader.read_boolean() - reader.align_stream() - self.m_AudioClip = PPtr(reader) # AudioClip - self.m_MovieData = reader.read_bytes(reader.read_int()) diff --git a/UnityPy/classes/NamedObject.py b/UnityPy/classes/NamedObject.py deleted file mode 100644 index 4275a115..00000000 --- a/UnityPy/classes/NamedObject.py +++ /dev/null @@ -1,28 +0,0 @@ -from .EditorExtension import EditorExtension -from ..streams import EndianBinaryWriter - - -class NamedObject(EditorExtension): - m_Name: str - - def __init__(self, reader): - super().__init__(reader=reader) - self.reader.reset() - self.m_Name = self.reader.read_aligned_string() - - def save(self, writer: EndianBinaryWriter = None): - if not writer: - writer = EndianBinaryWriter(endian=self.reader.endian) - super().save(writer) - writer.write_aligned_string(self.m_Name) - - @property - def name(self): - return self.m_Name - - @name.setter - def name(self, value): - self.m_Name = value - - def __repr__(self): - return f"<{self.__class__.__name__} path_id={self.path_id} name={self.m_Name}>" diff --git a/UnityPy/classes/Object.py b/UnityPy/classes/Object.py index 2c8381ee..c369594c 100644 --- a/UnityPy/classes/Object.py +++ b/UnityPy/classes/Object.py @@ -1,180 +1,32 @@ -from .PPtr import PPtr -from ..enums import BuildTarget -from ..helpers import TypeTreeHelper -from ..streams import EndianBinaryWriter -from ..files import ObjectReader -import types -from ..exceptions import TypeTreeError as TypeTreeError +from __future__ import annotations +from abc import ABC, ABCMeta +from typing import TYPE_CHECKING, Dict, Any, Optional, Self +if TYPE_CHECKING: + from ..files.ObjectReader import ObjectReader + from ..files.SerializedFile import SerializedFile -class Object(object): - type_tree: dict - def __init__(self, reader: ObjectReader): - self.reader = reader - self.assets_file = reader.assets_file - self.type = reader.type - self.path_id = reader.path_id - self.version = reader.version - self.build_type = reader.build_type - self.platform = reader.platform - self.serialized_type = reader.serialized_type - self.byte_size = reader.byte_size - self.assets_file = reader.assets_file +class Object(ABC, metaclass=ABCMeta): + object_reader: Optional[ObjectReader[Self]] = None - if self.platform == BuildTarget.NoTarget: - self._object_hide_flags = reader.read_u_int() + def __init__(self, **kwargs: Dict[str, Any]) -> None: + self.__dict__.update(**kwargs) - self.container = self.assets_file.container.path_dict.get(self.path_id) + def set_object_reader(self, object_info: ObjectReader[Any]): + self.object_reader = object_info - self.reader.reset() - if type(self) == Object: - self.read_typetree() + def __repr__(self) -> str: + return f"<{self.__class__.__name__}>" - def has_struct_member(self, name: str) -> bool: - nodes = self.reader.get_typetree_nodes() - return any(node.m_Name == name for node in nodes) + @property + def assets_file(self) -> Optional[SerializedFile]: + if self.object_reader: + return self.object_reader.assets_file + return None - def dump_typetree(self, nodes: list = None) -> str: - return self.reader.dump_typetree(nodes=nodes) + def save(self) -> None: + if self.object_reader is None: + raise ValueError("ObjectReader not set") - def dump_typetree_structure(self) -> str: - return self.reader.dump_typetree_structure() - - def read_typetree(self, nodes: list = None, wrap: bool = False) -> dict: - tree = self.reader.read_typetree(nodes) - self.type_tree = NodeHelper(tree, self.assets_file) - return self.type_tree if wrap else tree - - def save_typetree(self, nodes: list = None, writer: EndianBinaryWriter = None): - def class_to_dict(value): - if isinstance(value, list): - return [class_to_dict(val) for val in value] - elif isinstance(value, dict): - return {key: class_to_dict(val) for key, val in value.items()} - elif hasattr(value, "__dict__"): - if isinstance(value, PPtr): - return {"m_PathID": value.path_id, "m_FileID": value.file_id} - return { - key: class_to_dict(val) - for key, val in value.__dict__.items() - if not isinstance(value, (types.FunctionType, types.MethodType)) - and not key in ["type_tree", "assets_file"] - } - else: - return value - - obj = class_to_dict(self if not self.type_tree else self.type_tree) - return self.reader.save_typetree(obj, nodes, writer) - - def get_raw_data(self) -> bytes: - return self.reader.get_raw_data() - - def set_raw_data(self, data): - self.reader.set_raw_data(data) - - def save(self, writer: EndianBinaryWriter = None, intern_call=False): - if not writer: - writer = EndianBinaryWriter(endian=self.reader.endian) - if intern_call: - if self.platform == BuildTarget.NoTarget: - writer.write_u_int(self._object_hide_flags) - else: - # save for objects WITHOUT specific save function - # so we have to use the typetree if it exists - self.save_typetree() - - def _save(self, writer): - # the reader is actually an ObjectReader, - # the data value is written back into the asset - self.reader.data = writer.bytes - - def __getattr__(self, name): - """ - If item not found in __dict__, read type_tree and check if it is in there. - """ - if name == "type_tree" or self.type_tree == None: - old_pos = self.reader.Position - self.read_typetree() - self.reader.Position = old_pos - if name == "type_tree": - return self.type_tree - elif name == "read": - return lambda: self - return getattr(self.type_tree, name) - - def get(self, key, default=None): - return getattr(self, key, default) - - def __repr__(self): - return f"<{self.__class__.__name__} path_id={self.path_id}>" - - def __hash__(self): - return hash(self.path_id) - - def __eq__(self, other): - if isinstance(other, Object): - return self.path_id == other.path_id - elif isinstance(other, int): - return self.path_id == other - return False - - -class NodeHelper: - def __init__(self, data, assets_file): - if "m_PathID" in data and "m_FileID" in data: - # used to make pointers directly useable - self.path_id = data["m_PathID"] - self.file_id = data["m_FileID"] - self.index = data.get("m_Index", -2) - self.assets_file = assets_file - self._obj = None - self.__class__ = PPtr - else: - self.__dict__ = { - key: NodeHelper(val, assets_file) for key, val in data.items() - } - - def __new__(cls, data, assets_file): - if isinstance(data, dict): - return super(NodeHelper, cls).__new__(cls) - elif isinstance(data, list): - return [NodeHelper(x, assets_file) for x in data] - elif isinstance(data, tuple): - return tuple(NodeHelper(x, assets_file) for x in data) - return data - - def __getitem__(self, item): - return getattr(self, item) - - def to_dict(self): - def dump(val): - return ( - val.to_dict() - if isinstance(val, NodeHelper) - else [dump(item) for item in val] - if isinstance(val, list) - else {"m_PathID": val.path_id, "m_FileID": val.file_id} - if isinstance(val, PPtr) - else [x for x in val] - if isinstance(val, (bytearray, bytes)) - else val - ) - - return {key: dump(val) for key, val in self.__dict__.items()} - - def items(self): - return self.__dict__.items() - - def values(self): - return self.__dict__.values() - - def keys(self): - return self.__dict__.keys() - - def __repr__(self): - name = getattr(self, "m_Name", None) - if name: - return f"" - else: - return "" + self.object_reader.save_typetree(self) diff --git a/UnityPy/classes/PPtr.py b/UnityPy/classes/PPtr.py index 96ae6d64..2694f4f8 100644 --- a/UnityPy/classes/PPtr.py +++ b/UnityPy/classes/PPtr.py @@ -1,90 +1,81 @@ -from ..files import ObjectReader -from ..streams import EndianBinaryWriter -from ..enums import ClassIDType - - -def save_ptr(obj, writer: EndianBinaryWriter): - if isinstance(obj, PPtr): - writer.write_int(obj.file_id) - else: - writer.write_int(0) # it's usually 0...... - if obj._version < 14: - writer.write_int(obj.path_id) - else: - writer.write_long(obj.path_id) - - -class PPtr: - def __init__(self, reader: ObjectReader): - self._version = reader.version2 - self.index = -2 - self.file_id = reader.read_int() - self.path_id = reader.read_int() if self._version < 14 else reader.read_long() - self.assets_file = reader.assets_file - self._obj = None - - def save(self, writer: EndianBinaryWriter): - save_ptr(self, writer) - - def get_obj(self): - if self._obj != None: - return self._obj - - manager = None - - if self.file_id == 0: - manager = self.assets_file - - elif self.file_id > 0 and self.file_id - 1 < len(self.assets_file.externals): - if self.index == -2: - environment = self.assets_file.environment - external_name = self.external_name - # try to find it in the already registered cabs - manager = environment.get_cab(external_name) - # not found, load all dependencies and try again - if not manager: - self.assets_file.load_dependencies([external_name]) - manager = environment.get_cab(external_name) - - if manager is not None: - self._obj = manager.objects.get(self.path_id) - else: - self._obj = None - if self.external_name: - print(f"Couldn't find dependency {self.external_name}") - print("You can try to load it manually to the environment in advance") - print("for Web-&BundleFiles: env.load_file(dependency)") - print( - "for SerializedFiles: env.register_cab(depdency_basename, env.load_file(dependency)" - ) - elif self.path_id: - print(f"Couldn't find referenced object with path_id {self.path_id}") +from __future__ import annotations +from typing import TypeVar, Generic, TYPE_CHECKING, Optional, Any, cast + +from attr import define + +if TYPE_CHECKING: + from ..files.ObjectReader import ObjectReader + from ..files.SerializedFile import SerializedFile + +T = TypeVar("T") - return self._obj + +@define +class PPtr(Generic[T]): + m_FileID: int + m_PathID: int + assetsfile: Optional[SerializedFile] = None + type: Optional[str] = None @property - def type(self): - obj = self.get_obj() - if obj is None: - return ClassIDType.UnknownType - return obj.type + def file_id(self) -> int: + # backwards compatibility + return self.m_FileID @property - def external_name(self): - if self.file_id > 0 and self.file_id - 1 < len(self.assets_file.externals): - return self.assets_file.externals[self.file_id - 1].name - - def __getattr__(self, key): - obj = self.get_obj() - return getattr(obj, key) - - def __repr__(self): - return "<%s %s>" % ( - self.__class__.__name__, - self._obj.__class__.__repr__(self.get_obj()) - if self.get_obj() - else "Not Found", - ) + def path_id(self) -> int: + # backwards compatibility + return self.m_PathID + + def read(self): + # backwards compatibility + return self.deref_parse_as_object() + + def deref(self, assetsfile: Optional[SerializedFile] = None) -> ObjectReader[T]: + assetsfile = assetsfile or self.assetsfile + if assetsfile is None: + raise ValueError("PPtr can't deref without an assetsfile!") + + if self.m_PathID == 0: + raise ValueError("PPtr can't deref with m_PathID == 0!") + + if self.m_FileID == 0: + pass + else: + # resolve file id to external name + external_id = self.m_FileID - 1 + if external_id >= len(assetsfile.m_Externals): + raise FileNotFoundError("Failed to resolve pointer - invalid m_FileID!") + external = assetsfile.m_Externals[external_id] + + # resolve external name to assetsfile + container = assetsfile.parent + if container is None: + # TODO - use default fs + raise FileNotFoundError( + f"PPtr points to {external.path} but no container is set!" + ) + + for child in container.childs: + if isinstance(child, SerializedFile) and child.name == external.path: + assetsfile = child + break + else: + raise FileNotFoundError( + f"Failed to resolve pointer - {external.path} not found!" + ) + + return cast("ObjectReader[T]", assetsfile.objects[self.m_PathID]) + + def deref_parse_as_object(self, assetsfile: Optional[SerializedFile] = None) -> T: + return self.deref(assetsfile).read() + + def deref_parse_as_dict( + self, assetsfile: Optional[SerializedFile] = None + ) -> dict[str, Any]: + ret = self.deref(assetsfile).parse_as_dict() + assert isinstance(ret, dict) + return ret def __bool__(self): - return True if self.get_obj() else False + return self.m_PathID != 0 diff --git a/UnityPy/classes/PlayerSettings.py b/UnityPy/classes/PlayerSettings.py deleted file mode 100644 index e291d7ea..00000000 --- a/UnityPy/classes/PlayerSettings.py +++ /dev/null @@ -1,29 +0,0 @@ -from .Object import Object - - -class PlayerSettings(Object): - def __init__(self, reader): - super().__init__(reader=reader) - version = self.version - if version >= (5, 4): # 5.4.0 nad up - self.productGUID = reader.read_bytes(16) - - self.AndroidProfiler = reader.read_boolean() - # bool AndroidFilterTouchesWhenObscured 2017.2 and up - # bool AndroidEnableSustainedPerformanceMode 2018 and up - reader.align_stream() - self.defaultScreenOrientation = reader.read_int() - self.targetDevice = reader.read_int() - if version < (5, 3): # 5.3 down - if version < (5,): # 5.0 down - self.targetPlatform = reader.read_int() # 4.0 and up targetGlesGraphics - if version >= (4, 6): # 4.6 and up - self.targetIOSGraphics = reader.read_int() - self.targetResolution = reader.read_int() - else: - self.useOnDemandResources = reader.read_boolean() - reader.align_stream() - if version >= (3, 5): # 3.5 and up - self.accelerometerFrequency = reader.read_int() - self.companyName = reader.read_aligned_string() - self.productName = reader.read_aligned_string() diff --git a/UnityPy/classes/RectTransform.py b/UnityPy/classes/RectTransform.py deleted file mode 100644 index 73514920..00000000 --- a/UnityPy/classes/RectTransform.py +++ /dev/null @@ -1,6 +0,0 @@ -from .Transform import Transform - - -class RectTransform(Transform): - def __init__(self, reader): - super().__init__(reader=reader) diff --git a/UnityPy/classes/Renderer.py b/UnityPy/classes/Renderer.py deleted file mode 100644 index dc5334ba..00000000 --- a/UnityPy/classes/Renderer.py +++ /dev/null @@ -1,93 +0,0 @@ -from .Component import Component -from .PPtr import PPtr -from ..export import MeshRendererExporter - - -class StaticBatchInfo: - def __init__(self, reader): - self.firstSubMesh = reader.read_u_short() - self.subMeshCount = reader.read_u_short() - - -class Renderer(Component): - def __init__(self, reader): - super().__init__(reader=reader) - version = self.version - if version < (5,): # 5.0 down - self.m_Enabled = reader.read_boolean() - self.m_CastShadows = reader.read_boolean() - self.m_ReceiveShadows = reader.read_boolean() - self.m_LightmapIndex = reader.read_byte() - else: # 5.0 and up - if version >= (5, 4): # 5.4 and up - self.m_Enabled = reader.read_boolean() - self.m_CastShadows = reader.read_byte() - self.m_ReceiveShadows = reader.read_byte() - if version[:2] > (2017, 2): # 2017.2 and up - self.m_DynamicOccludee = reader.read_byte() - self.m_MotionVectors = reader.read_byte() - self.m_LightProbeUsage = reader.read_byte() - self.m_ReflectionProbeUsage = reader.read_byte() - if version >= (2019, 3): # 2019.3 and up - self.m_RayTracingMode = reader.read_byte() - if version >= (2020,): # 2020.1 and up - self.m_RayTraceProcedural = reader.read_byte() - reader.align_stream() - else: - self.m_Enabled = reader.read_boolean() - reader.align_stream() - self.m_CastShadows = reader.read_byte() - self.m_ReceiveShadows = reader.read_boolean() - reader.align_stream() - - if version >= (2018,): # 2018 and up - self.m_RenderingLayerMask = reader.read_u_int() - - if version >= (2018, 3): # 2018.3 and up - self.m_RendererPriority = reader.read_int() - - self.m_LightmapIndex = reader.read_u_short() - self.m_LightmapIndexDynamic = reader.read_u_short() - - if version >= (3,): # 3.0 and up - self.m_LightmapTilingOffset = reader.read_vector4() - - if version >= (5,): # 5.0 and up - self.m_LightmapTilingOffsetDynamic = reader.read_vector4() - - m_MaterialsSize = reader.read_int() - self.m_Materials = [PPtr(reader) for _ in range(m_MaterialsSize)] # Material - - if version < (3,): # 3.0 down - self.m_LightmapTilingOffset = reader.read_vector4() - else: # 3.0 and up - if version >= (5, 5): # 5.5 and up - self.m_StaticBatchInfo = StaticBatchInfo(reader) - else: - self.m_SubsetIndices = reader.read_u_int_array() - - self.m_StaticBatchRoot = PPtr(reader) # Transform - - if version >= (5, 4): # 5.4 and up - self.m_ProbeAnchor = PPtr(reader) # Transform - self.m_LightProbeVolumeOverride = PPtr(reader) # GameObject - elif version >= (3, 5): # 3.5 - 5.3 - self.m_UseLightProbes = reader.read_boolean() - reader.align_stream() - - if version >= (5,): # 5.0 and up - self.m_ReflectionProbeUsage = reader.read_int() - - # Transform #5.0 and up m_ProbeAnchor - self.m_LightProbeAnchor = PPtr(reader) - - if version >= (4, 3): # 4.3 and up - if version[:2] == (4, 3): # 4.3 - self.m_SortingLayer = reader.read_short() - else: - self.m_SortingLayerID = reader.read_u_int() - self.m_SortingOrder = reader.read_short() - reader.align_stream() - - def export(self, export_dir: str) -> None: - MeshRendererExporter.export_mesh_renderer(self, export_dir) diff --git a/UnityPy/classes/ResourceManager.py b/UnityPy/classes/ResourceManager.py deleted file mode 100644 index 2f490caf..00000000 --- a/UnityPy/classes/ResourceManager.py +++ /dev/null @@ -1,23 +0,0 @@ -from .Object import Object -from .PPtr import PPtr, save_ptr -from ..streams import EndianBinaryReader, EndianBinaryWriter - - -class ResourceManager(Object): - def __init__(self, reader): - super().__init__(reader) - m_ContainerSize = reader.read_int() - self.m_Container = { - reader.read_aligned_string(): PPtr(reader) - for _ in range(m_ContainerSize) - } - - def save(self, writer: EndianBinaryWriter = None): - if not writer: - writer = EndianBinaryWriter(endian=self.reader.endian) - super().save(writer, intern_call=True) - writer.write_int(len(self.m_Container)) - for key, val in self.m_Container.items(): - writer.write_aligned_string(key) - save_ptr(val, writer) - return writer diff --git a/UnityPy/classes/RuntimeAnimatorController.py b/UnityPy/classes/RuntimeAnimatorController.py deleted file mode 100644 index 8b44885c..00000000 --- a/UnityPy/classes/RuntimeAnimatorController.py +++ /dev/null @@ -1,6 +0,0 @@ -from .NamedObject import NamedObject - - -class RuntimeAnimatorController(NamedObject): - def __init__(self, reader): - super().__init__(reader=reader) diff --git a/UnityPy/classes/Shader.py b/UnityPy/classes/Shader.py deleted file mode 100644 index c2be9a08..00000000 --- a/UnityPy/classes/Shader.py +++ /dev/null @@ -1,464 +0,0 @@ -from enum import IntEnum - -from .NamedObject import NamedObject -from ..export.ShaderConverter import export_shader -from ..enums import ShaderCompilerPlatform, ShaderGpuProgramType, SerializedPropertyType -from ..enums import TextureDimension, PassType - - -class Shader(NamedObject): - def export(self): - return export_shader(self) - - def __init__(self, reader): - super().__init__(reader=reader) - version = reader.version - if version >= (5, 5): # 5.5 and up - self.m_ParsedForm = SerializedShader(reader) - self.platforms = [ - ShaderCompilerPlatform(x) for x in reader.read_u_int_array() - ] - - if version >= (2019, 3): # 2019.3 and up - self.offsets = reader.read_u_int_array_array()[0] - self.compressedLengths = reader.read_u_int_array_array()[0] - self.decompressedLengths = reader.read_u_int_array_array()[0] - else: - self.offsets = reader.read_u_int_array() - self.compressedLengths = reader.read_u_int_array() - self.decompressedLengths = reader.read_u_int_array() - self.compressedBlob = reader.read_bytes(reader.read_int()) - else: - self.m_Script = reader.read_bytes(reader.read_int()) - reader.align_stream() - self.m_PathName = reader.read_aligned_string() - if version >= (5, 3): # 5.3 - 5.4 - self.decompressedSize = reader.read_u_int() - self.m_SubProgramBlob = reader.read_bytes(reader.read_int()) - - -class StructParameter: - def __init__(self, reader): - self.m_NameIndex = reader.read_int() - self.m_Index = reader.read_int() - self.m_ArraySize = reader.read_int() - self.m_StructSize = reader.read_int() - - numVectorParams = reader.read_int() - self.m_VectorParams = [VectorParameter(reader) for _ in range(numVectorParams)] - - numMatrixParams = reader.read_int() - self.m_MatrixParams = [MatrixParameter(reader) for _ in range(numMatrixParams)] - - -class SamplerParameter: - def __init__(self, reader): - self.sampler = reader.read_u_int() - self.bindPoint = reader.read_int() - - -class SerializedTextureProperty: - def __init__(self, reader): - self.m_DefaultName = reader.read_aligned_string() - self.m_TexDim = TextureDimension(reader.read_int()) - - -class SerializedProperty: - def __init__(self, reader): - self.m_Name = reader.read_aligned_string() - self.m_Description = reader.read_aligned_string() - self.m_Attributes = reader.read_string_array() - self.m_Type = SerializedPropertyType(reader.read_int()) - self.m_Flags = reader.read_u_int() - self.m_DefValue = reader.read_float_array(4) - self.m_DefTexture = SerializedTextureProperty(reader) - - -class SerializedProperties: - def __init__(self, reader): - numProps = reader.read_int() - self.m_Props = [SerializedProperty(reader) for _ in range(numProps)] - - -class SerializedShaderFloatValue: - def __init__(self, reader): - self.val = reader.read_float() - self.name = reader.read_aligned_string() - - -class SerializedShaderRTBlendState: - def __init__(self, reader): - self.srcBlend = SerializedShaderFloatValue(reader) - self.destBlend = SerializedShaderFloatValue(reader) - self.srcBlendAlpha = SerializedShaderFloatValue(reader) - self.destBlendAlpha = SerializedShaderFloatValue(reader) - self.blendOp = SerializedShaderFloatValue(reader) - self.blendOpAlpha = SerializedShaderFloatValue(reader) - self.colMask = SerializedShaderFloatValue(reader) - - -class SerializedStencilOp: - def __init__(self, reader): - self.pass_ = SerializedShaderFloatValue(reader) - self.fail = SerializedShaderFloatValue(reader) - self.zFail = SerializedShaderFloatValue(reader) - self.comp = SerializedShaderFloatValue(reader) - - -class SerializedShaderVectorValue: - def __init__(self, reader): - self.x = SerializedShaderFloatValue(reader) - self.y = SerializedShaderFloatValue(reader) - self.z = SerializedShaderFloatValue(reader) - self.w = SerializedShaderFloatValue(reader) - self.name = reader.read_aligned_string() - - -class FogMode(IntEnum): - kFogUnknown = (-1,) - kFogDisabled = (0,) - kFogLinear = (1,) - kFogExp = (2,) - kFogExp2 = (3,) - - -class SerializedShaderState: - def __init__(self, reader): - version = reader.version - - self.m_Name = reader.read_aligned_string() - self.rtBlend = [SerializedShaderRTBlendState(reader) for _ in range(8)] - self.rtSeparateBlend = reader.read_boolean() - reader.align_stream() - if version >= (2017, 2): # 2017.2 and up - self.zClip = SerializedShaderFloatValue(reader) - self.zTest = SerializedShaderFloatValue(reader) - self.zWrite = SerializedShaderFloatValue(reader) - self.culling = SerializedShaderFloatValue(reader) - if version >= (2020,): # 2020.1 and up - self.conservative = SerializedShaderFloatValue(reader) - self.offsetFactor = SerializedShaderFloatValue(reader) - self.offsetUnits = SerializedShaderFloatValue(reader) - self.alphaToMask = SerializedShaderFloatValue(reader) - self.stencilOp = SerializedStencilOp(reader) - self.stencilOpFront = SerializedStencilOp(reader) - self.stencilOpBack = SerializedStencilOp(reader) - self.stencilReadMask = SerializedShaderFloatValue(reader) - self.stencilWriteMask = SerializedShaderFloatValue(reader) - self.stencilRef = SerializedShaderFloatValue(reader) - self.fogStart = SerializedShaderFloatValue(reader) - self.fogEnd = SerializedShaderFloatValue(reader) - self.fogDensity = SerializedShaderFloatValue(reader) - self.fogColor = SerializedShaderVectorValue(reader) - self.fogMode = FogMode(reader.read_int()) - self.gpuProgramID = reader.read_int() - self.m_Tags = SerializedTagMap(reader) - self.m_LOD = reader.read_int() - self.lighting = reader.read_boolean() - reader.align_stream() - - -class ShaderBindChannel: - def __init__(self, reader): - self.source = reader.read_byte() - self.target = reader.read_byte() - - -class ParserBindChannels: - def __init__(self, reader): - numChannels = reader.read_int() - self.m_Channels = [ShaderBindChannel(reader) for _ in range(numChannels)] - reader.align_stream() - self.m_SourceMap = reader.read_u_int() - - -class VectorParameter: - def __init__(self, reader): - self.m_NameIndex = reader.read_int() - self.m_Index = reader.read_int() - self.m_ArraySize = reader.read_int() - self.m_Type = reader.read_byte() - self.m_Dim = reader.read_byte() - reader.align_stream() - - -class MatrixParameter: - def __init__(self, reader): - self.m_NameIndex = reader.read_int() - self.m_Index = reader.read_int() - self.m_ArraySize = reader.read_int() - self.m_Type = reader.read_byte() - self.m_RowCount = reader.read_byte() - reader.align_stream() - - -class TextureParameter: - def __init__(self, reader): - version = reader.version - self.m_NameIndex = reader.read_int() - self.m_Index = reader.read_int() - self.m_SamplerIndex = reader.read_int() - if version >= (2017, 3): # 2017.3 and up - self.m_MultiSampled = reader.read_boolean() - self.m_Dim = reader.read_byte() - reader.align_stream() - - -class BufferBinding: - def __init__(self, reader): - self.m_NameIndex = reader.read_int() - self.m_Index = reader.read_int() - if reader.version >= (2020,): # 2020.1 and up - m_ArraySize = reader.read_int() - - -class ConstantBuffer: - def __init__(self, reader): - version = reader.version - - self.m_NameIndex = reader.read_int() - - numMatrixParams = reader.read_int() - self.m_MatrixParams = [MatrixParameter(reader) for _ in range(numMatrixParams)] - - numVectorParams = reader.read_int() - self.m_VectorParams = [VectorParameter(reader) for _ in range(numVectorParams)] - if version >= (2017, 3): # 2017.3 and up - numStructParams = reader.read_int() - self.m_StructParams = [ - StructParameter(reader) for _ in range(numStructParams) - ] - self.m_Size = reader.read_int() - - if version >= (2021, 1, 4) or (version[0] == 2020 and version >= (2020, 3, 2)): - self.m_IsPartialCB = reader.read_boolean() - reader.align_stream() - - -class UAVParameter: - def __init__(self, reader): - self.m_NameIndex = reader.read_int() - self.m_Index = reader.read_int() - self.m_OriginalIndex = reader.read_int() - - -class SerializedProgramParameters: - def __init__(self, reader): - numVectorParams = reader.read_int() - self.m_VectorParams = [VectorParameter(reader) for _ in range(numVectorParams)] - - numMatrixParams = reader.read_int() - self.m_MatrixParams = [MatrixParameter(reader) for _ in range(numMatrixParams)] - - numTextureParams = reader.read_int() - self.m_TextureParams = [ - TextureParameter(reader) for _ in range(numTextureParams) - ] - - numBufferParams = reader.read_int() - self.m_BufferParams = [BufferBinding(reader) for _ in range(numBufferParams)] - - numConstantBuffers = reader.read_int() - self.m_ConstantBuffers = [ - ConstantBuffer(reader) for _ in range(numConstantBuffers) - ] - - numConstantBufferBindings = reader.read_int() - self.m_ConstantBufferBindings = [ - BufferBinding(reader) for _ in range(numConstantBufferBindings) - ] - - numUAVParams = reader.read_int() - self.m_UAVParams = [UAVParameter(reader) for _ in range(numUAVParams)] - - numSamplers = reader.read_int() - self.m_Samplers = [SamplerParameter(reader) for _ in range(numSamplers)] - - -class SerializedSubProgram: - def __init__(self, reader): - version = reader.version - - self.m_BlobIndex = reader.read_u_int() - self.m_Channels = ParserBindChannels(reader) - - if (2019,) <= version < (2021, 2): # 2019 ~2021.1 - self.m_GlobalKeywordIndices = reader.read_u_short_array() - reader.align_stream() - self.m_LocalKeywordIndices = reader.read_u_short_array() - reader.align_stream() - else: - self.m_KeywordIndices = reader.read_u_short_array() - if version >= (2017,): # 2017 and up - reader.align_stream() - - self.m_ShaderHardwareTier = reader.read_byte() - self.m_GpuProgramType = ShaderGpuProgramType(reader.read_byte()) - reader.align_stream() - - if version >= (2021, 1, 4) or (version[0] == 2020 and version >= (2020, 3, 2)): - self.m_Parameters = SerializedProgramParameters(reader) - else: - numVectorParams = reader.read_int() - self.m_VectorParams = [ - VectorParameter(reader) for _ in range(numVectorParams) - ] - - numMatrixParams = reader.read_int() - self.m_MatrixParams = [ - MatrixParameter(reader) for _ in range(numMatrixParams) - ] - - numTextureParams = reader.read_int() - self.m_TextureParams = [ - TextureParameter(reader) for _ in range(numTextureParams) - ] - - numBufferParams = reader.read_int() - self.m_BufferParams = [ - BufferBinding(reader) for _ in range(numBufferParams) - ] - - numConstantBuffers = reader.read_int() - self.m_ConstantBuffers = [ - ConstantBuffer(reader) for _ in range(numConstantBuffers) - ] - - numConstantBufferBindings = reader.read_int() - self.m_ConstantBufferBindings = [ - BufferBinding(reader) for _ in range(numConstantBufferBindings) - ] - - numUAVParams = reader.read_int() - self.m_UAVParams = [UAVParameter(reader) for _ in range(numUAVParams)] - - if version >= (2017,): # 2017 and up - numSamplers = reader.read_int() - self.m_Samples = [SamplerParameter(reader) for _ in range(numSamplers)] - - if version >= (2017, 2): # 2017.2 and up - if version >= (2021,): - self.m_ShaderRequirements = reader.read_long() - else: - self.m_ShaderRequirements = reader.read_int() - - -class SerializedProgram: - def __init__(self, reader): - version = reader.version - - numSubPrograms = reader.read_int() - self.m_SubPrograms = [ - SerializedSubProgram(reader) for _ in range(numSubPrograms) - ] - - if version >= (2021, 1, 4) or (version[0] == 2020 and version >= (2020, 3, 2)): - self.m_CommonParameters = SerializedProgramParameters(reader) - - -class SerializedPass: - def __init__(self, reader): - version = reader.version - - if version >= (2020, 2): # 2020.2 and up - numEditorDataHash = reader.read_int() - m_EditorDataHash = [ - reader.read_bytes(16) # Hash128(reader) - for _ in range(numEditorDataHash) - ] - reader.align_stream() - m_Platforms = reader.read_byte_array() - reader.align_stream() - if version < (2021, 2): - m_LocalKeywordMask = reader.read_u_short_array() - reader.align_stream() - m_GlobalKeywordMask = reader.read_u_short_array() - reader.align_stream() - - numIndices = reader.read_int() - self.m_NameIndices = {} - for _ in range(numIndices): - key = reader.read_aligned_string() - self.m_NameIndices[key] = reader.read_int() - self.m_Type = PassType(reader.read_int()) - self.m_State = SerializedShaderState(reader) - self.m_ProgramMask = reader.read_u_int() - self.progVertex = SerializedProgram(reader) - self.progFragment = SerializedProgram(reader) - self.progGeometry = SerializedProgram(reader) - self.progHull = SerializedProgram(reader) - self.progDomain = SerializedProgram(reader) - if version >= (2019, 3): # 2019.3 and up - self.progRayTracing = SerializedProgram(reader) - self.m_HasInstancingVariant = reader.read_boolean() - if version >= (2018,): # 2018 and up - self.m_HasProceduralInstancingVariant = reader.read_boolean() - reader.align_stream() - self.m_UseName = reader.read_aligned_string() - self.m_Name = reader.read_aligned_string() - self.m_TextureName = reader.read_aligned_string() - self.m_Tags = SerializedTagMap(reader) - if version >= (2021, 2): - m_SerializedKeywordStateMask = reader.read_u_short_array() - reader.align_stream() - - -class SerializedTagMap: - def __init__(self, reader): - numTags = reader.read_int() - self.tags = {} - for _ in range(numTags): - key = reader.read_aligned_string() - self.tags[key] = reader.read_aligned_string() - - -class SerializedSubShader: - def __init__(self, reader): - numPasses = reader.read_int() - self.m_Passes = [SerializedPass(reader) for _ in range(numPasses)] - self.m_Tags = SerializedTagMap(reader) - self.m_LOD = reader.read_int() - - -class SerializedShaderDependency: - def __init__(self, reader): - self.from_ = reader.read_aligned_string() - self.to = reader.read_aligned_string() - - -class SerializedCustomEditorForRenderPipeline: - def __init__(self, reader): - self.customEditorName = reader.read_aligned_string() - self.renderPipelineType = reader.read_aligned_string() - - -class SerializedShader: - def __init__(self, reader): - version = reader.version - - self.m_PropInfo = SerializedProperties(reader) - numSubShaders = reader.read_int() - self.m_SubShaders = [SerializedSubShader(reader) for _ in range(numSubShaders)] - - if version >= (2021, 2): - self.m_KeywordNames = reader.read_string_array() - self.m_KeywordFlags = reader.read_bytes(reader.read_int()) - reader.align_stream() - - self.m_Name = reader.read_aligned_string() - self.m_CustomEditorName = reader.read_aligned_string() - self.m_FallbackName = reader.read_aligned_string() - numDependencies = reader.read_int() - self.m_Dependencies = [ - SerializedShaderDependency(reader) for _ in range(numDependencies) - ] - - if version >= (2021,): - m_CustomEditorForRenderPipelinesSize = reader.read_int() - self.m_CustomEditorForRenderPipelines = [ - SerializedCustomEditorForRenderPipeline(reader) - for _ in range(m_CustomEditorForRenderPipelinesSize) - ] - - self.m_DisableNoSubshadersMessage = reader.read_boolean() - reader.align_stream() diff --git a/UnityPy/classes/SkinnedMeshRenderer.py b/UnityPy/classes/SkinnedMeshRenderer.py deleted file mode 100644 index 0594213e..00000000 --- a/UnityPy/classes/SkinnedMeshRenderer.py +++ /dev/null @@ -1,23 +0,0 @@ -from .PPtr import PPtr -from .Renderer import Renderer - - -class SkinnedMeshRenderer(Renderer): - def __init__(self, reader): - super().__init__(reader=reader) - version = self.version - self.m_Quality = reader.read_int() - self.m_UpdateWhenOffscreen = reader.read_boolean() - self.m_SkinNormals = reader.read_boolean() # 3.1.0 and below - reader.align_stream() - - if version < (2, 6): # 2.6 down - self.m_DisableAnimationWhenOffscreen = PPtr(reader) # Animation - - self.m_Mesh = PPtr(reader) # Mesh - - m_BonesSize = reader.read_int() - self.m_Bones = [PPtr(reader) for _ in range(m_BonesSize)] - - if version >= (4, 3): # 4.3 and up - self.m_BlendShapeWeights = reader.read_float_array() diff --git a/UnityPy/classes/Sprite.py b/UnityPy/classes/Sprite.py deleted file mode 100644 index 4eb17a60..00000000 --- a/UnityPy/classes/Sprite.py +++ /dev/null @@ -1,265 +0,0 @@ -from enum import IntEnum - -from .Mesh import BoneWeights4, SubMesh, VertexData -from .NamedObject import NamedObject -from .PPtr import PPtr -from ..export import SpriteHelper -from ..enums import SpriteMeshType, SpritePackingMode, SpritePackingRotation -from ..streams import EndianBinaryWriter, EndianBinaryReader - - -class Sprite(NamedObject): - @property - def image(self): - return SpriteHelper.get_image_from_sprite(self) - - def __init__(self, reader): - super().__init__(reader=reader) - version = self.version - - self.m_Rect = reader.read_rectangle_f() - self.m_Offset = reader.read_vector2() - if version >= (4, 5): # 4.5 and up - self.m_Border = reader.read_vector4() - - self.m_PixelsToUnits = reader.read_float() - if version >= (5, 4, 2) or ( - version >= (5, 4, 1, 3) and self.build_type.IsPatch - ): # 5.4.1p3 and up - self.m_Pivot = reader.read_vector2() - - self.m_Extrude = reader.read_u_int() - if version >= (5, 3): # 5.3 and up - self.m_IsPolygon = reader.read_boolean() - reader.align_stream() - - if version >= (2017,): # 2017 and up - first = reader.read_bytes(16) # GUID - second = reader.read_long() - self.m_RenderDataKey = (first, second) - self.m_AtlasTags = reader.read_string_array() - self.m_SpriteAtlas = PPtr(reader) # SpriteAtlas - - self.m_RD = SpriteRenderData(reader) - - if version >= (2017,): # 2017 and up - m_PhysicsShapeSize = reader.read_int() - self.m_PhysicsShape = [ - reader.read_vector2_array() for _ in range(m_PhysicsShapeSize) - ] - - if version >= (2018,): # 2018 and up - m_BonesSize = reader.read_int() - self.m_Bones = [SpriteBone(self.reader) for _ in range(m_BonesSize)] - - if version >= (2023, 1, 0, 14): - self.m_ScriptableObjects = [PPtr(reader) for _ in range(reader.read_int())] - - def save(self, writer: EndianBinaryWriter = None): - if writer is None: - writer = EndianBinaryWriter(endian=self.reader.endian) - version = self.version - - super().save(writer) - writer.write_rectangle_f(self.m_Rect) - writer.write_vector2(self.m_Offset) - if version >= (4, 5): # 4.5 and up - writer.write_vector4(self.m_Border) - - writer.write_float(self.m_PixelsToUnits) - if version >= (5, 4, 2) or ( - version >= (5, 4, 1, 3) and self.build_type.IsPatch - ): # 5.4.1p3 and up - writer.write_vector2(self.m_Pivot) - - writer.write_u_int(self.m_Extrude) - if version >= (5, 3): # 5.3 and up - writer.write_boolean(self.m_IsPolygon) - writer.align_stream() - - if version >= (2017,): # 2017 and up - writer.write_bytes(self.m_RenderDataKey[0]) # GUID - writer.write_long(self.m_RenderDataKey[1]) - writer.write_string_array(self.m_AtlasTags) - self.m_SpriteAtlas.save(writer) # SpriteAtlas - - self.m_RD.save(writer, version) - - if version >= (2017,): # 2017 and up - writer.write_int(len(self.m_PhysicsShape)) - for phys in self.m_PhysicsShape: - writer.write_vector2_array(phys) - - if version >= (2018,): # 2018 and up - writer.write_int(len(self.m_Bones)) - for bone in self.m_Bones: - bone.save(writer, version) - - if version >= (2023, 1, 0, 14): - writer.write_int(len(self.m_ScriptableObjects)) - for obj in self.m_ScriptableObjects: - obj.save(writer) - - self.set_raw_data(writer.bytes) - - -class SecondarySpriteTexture: - def __init__(self, reader): - self.texture = PPtr(reader) # Texture2D - self.name = reader.read_aligned_string() - - def save(self, writer): - self.texture.save(writer) - writer.write_aligned_string(self.name) - - -class SpriteSettings: - def __init__(self, reader): - self.settingsRaw = reader.read_u_int() - self.packed = self.settingsRaw & 1 # 1 - self.packingMode = SpritePackingMode((self.settingsRaw >> 1) & 1) # 1 - self.packingRotation = SpritePackingRotation((self.settingsRaw >> 2) & 0xF) # 4 - self.meshType = SpriteMeshType((self.settingsRaw >> 6) & 1) # 1 - # rest of the bits are reserved - - def save(self, writer): - writer.write_u_int(self.settingsRaw) - - -class SpriteVertex: - def __init__(self, reader): - version = reader.version - - self.pos = reader.read_vector3() - if version[:2] <= (4, 3): # 4.3 and down - self.uv = reader.read_vector2() - - def save(self, writer, version): - writer.write_vector3(self.pos) - if version[:2] <= (4, 3): # 4.3 and down - writer.write__vector2(self.uv) - - -class SpriteRenderData: - def __init__(self, reader): - version = reader.version - - self.texture = PPtr(reader) # Texture2D - if version >= (5, 2): # 5.2 and up - self.alphaTexture = PPtr(reader) # Texture2D - - if version >= (2019,): # 2019 and up - secondaryTexturesSize = reader.read_int() - self.secondaryTextures = [ - SecondarySpriteTexture(reader) for _ in range(secondaryTexturesSize) - ] - - if version >= (5, 6): # 5.6 and up - SubMeshesSize = reader.read_int() - self.m_SubMeshes = [SubMesh(reader) for _ in range(SubMeshesSize)] - IndexBufferSize = reader.read_int() - self.m_IndexBuffer = reader.read_bytes(IndexBufferSize) - reader.align_stream() - self.m_VertexData = VertexData(reader) - else: - verticesSize = reader.read_int() - self.vertices = [SpriteVertex(reader) for _ in range(verticesSize)] - self.indices = reader.read_u_short_array() - reader.align_stream() - - if version >= (2018,): # 2018 and up - self.m_Bindpose = reader.read_matrix_array() - if version < (2018, 2): # 2018.2 down - self.m_SourceSkinSize = reader.read_int() - self.m_SourceSkin = [BoneWeights4(reader)] - - self.textureRect = reader.read_rectangle_f() - self.textureRectOffset = reader.read_vector2() - if version >= (5, 6): # 5.6 and up - self.atlasRectOffset = reader.read_vector2() - - self.settingsRaw = SpriteSettings(reader) - if version >= (4, 5): # 4.5 and up - self.uvTransform = reader.read_vector4() - - if version >= (2017,): # 2017 and up - self.downscaleMultiplier = reader.read_float() - - def save(self, writer, version): - self.texture.save(writer) # Texture2D - if version >= (5, 2): # 5.2 and up - self.alphaTexture.save(writer) # Texture2D - - if version >= (2019,): # 2019 and up - writer.write_int(len(self.secondaryTextures)) - for tex in self.secondaryTextures: - tex.save(writer) - - if version >= (5, 6): # 5.6 and up - writer.write_int(len(self.m_SubMeshes)) - for mesh in self.m_SubMeshes: - mesh.save(writer, version) - writer.write_int(len(self.m_IndexBuffer)) - writer.write_bytes(self.m_IndexBuffer) - writer.align_stream() - self.m_VertexData.save(writer, version) - else: - writer.write_int(len(self.vertices)) - for vertex in self.vertices: - vertex.save(writer, version) - writer.write_u_short_array(self.indices) - writer.align_stream() - - if version >= (2018,): # 2018 and up - writer.write_matrix_array(self.m_Bindpose) - if version < (2018, 2): # 2018.2 down - writer.write_int(self.m_SourceSkinSize) - self.m_SourceSkin[0].save(writer) - - writer.write_rectangle_f(self.textureRect) - writer.write_vector2(self.textureRectOffset) - if version >= (5, 6): # 5.6 and up - writer.write_vector2(self.atlasRectOffset) - - self.settingsRaw.save(writer) - if version >= (4, 5): # 4.5 and up - writer.write_vector4(self.uvTransform) - - if version >= (2017,): # 2017 and up - writer.write_float(self.downscaleMultiplier) - - -class SpriteBone: - name: str - position: tuple - rotation: tuple - length: float - parentId: int - - def __init__(self, reader: EndianBinaryReader) -> None: - self.name = reader.read_aligned_string() - - if reader.version >= (2021,): - self.guid = reader.read_aligned_string() - - self.position = reader.read_vector3() - self.rotation = reader.read_quaternion() - self.length = reader.read_float() - self.parentId = reader.read_int() - - if reader.version >= (2021,): - self.color = reader.read_color_uint() - - def save(self, writer: EndianBinaryWriter, version): - writer.write_aligned_string(self.name) - - if version >= (2021,): - writer.write_aligned_string(self.guid) - - writer.write_vector3(self.position) - writer.write_quaternion(self.rotation) - writer.write_float(self.length) - writer.write_int(self.parentId) - - if version >= (2021,): - writer.write_color_uint(self.color) diff --git a/UnityPy/classes/SpriteAtlas.py b/UnityPy/classes/SpriteAtlas.py deleted file mode 100644 index 8bf65c45..00000000 --- a/UnityPy/classes/SpriteAtlas.py +++ /dev/null @@ -1,40 +0,0 @@ -from .NamedObject import NamedObject -from .PPtr import PPtr -from .Sprite import SpriteSettings, SecondarySpriteTexture - - -class SpriteAtlas(NamedObject): - def __init__(self, reader): - super().__init__(reader=reader) - packed_sprites_size = reader.read_int() - self.m_PackedSprites = [PPtr(reader) for _ in range(packed_sprites_size)] - - self.m_PackedSpriteNamesToIndex = reader.read_string_array() - m_render_data_map_size = reader.read_int() - self.m_RenderDataMap = {} - for _ in range(m_render_data_map_size): - first = reader.read_bytes(16) # GUID - second = reader.read_long() - value = SpriteAtlasData(reader) - self.m_RenderDataMap[(first, second)] = value - - -class SpriteAtlasData: - def __init__(self, reader): - self.version = version = reader.version - self.texture = PPtr(reader) # Texture2D - self.alphaTexture = PPtr(reader) # Texture2D - self.textureRect = reader.read_rectangle_f() - self.textureRectOffset = reader.read_vector2() - if version >= (2017, 2): # 2017.2 and up - self.atlasRectOffset = reader.read_vector2() - self.uvTransform = reader.read_vector4() - self.downscaleMultiplier = reader.read_float() - self.settingsRaw = SpriteSettings(reader) - - if version >= (2020, 2): - secondaryTexturesSize = reader.read_int() - self.secondaryTextures = [ - SecondarySpriteTexture(reader) for _ in range(secondaryTexturesSize) - ] - reader.align_stream() diff --git a/UnityPy/classes/TextAsset.py b/UnityPy/classes/TextAsset.py deleted file mode 100644 index 8c1a0165..00000000 --- a/UnityPy/classes/TextAsset.py +++ /dev/null @@ -1,35 +0,0 @@ -from .NamedObject import NamedObject -from ..streams import EndianBinaryWriter - - -class TextAsset(NamedObject): - def __init__(self, reader): - super().__init__(reader=reader) - self.m_Script = reader.read_bytes(reader.read_int()) - - @property - def script(self): - # required for backward compatibility - return self.m_Script - - @script.setter - def script(self, value): - self.m_Script = value - - @property - def text(self): - return bytes(self.script).decode("utf8") - - @text.setter - def text(self, val): - self.script = val.encode("utf8") - - def save(self, writer: EndianBinaryWriter = None): - if writer is None: - writer = EndianBinaryWriter(endian=self.reader.endian) - super().save(writer) - writer.write_int(len(self.m_Script)) - writer.write_bytes(self.m_Script) - writer.align_stream() - - self.set_raw_data(writer.bytes) diff --git a/UnityPy/classes/Texture.py b/UnityPy/classes/Texture.py deleted file mode 100644 index 2b6bfe03..00000000 --- a/UnityPy/classes/Texture.py +++ /dev/null @@ -1,22 +0,0 @@ -from .NamedObject import NamedObject -from ..streams import EndianBinaryWriter - - -class Texture(NamedObject): - def __init__(self, reader): - super().__init__(reader=reader) - if (2017, 3) <= self.version < (2023, 2, 0, 18): # 2017.3 - 2023.2.0.18 - self.m_ForcedFallbackFormat = reader.read_int() - self.m_DownscaleFallback = reader.read_boolean() - if self.version >= (2020, 2): # 2020.2 and up - self.m_IsAlphaChannelOptional = reader.read_boolean() - reader.align_stream() - - def save(self, writer: EndianBinaryWriter): - super().save(writer) - if (2017, 3) <= self.version < (2023, 2, 0, 18): # 2017.3 - 2023.2.0.18 - writer.write_int(self.m_ForcedFallbackFormat) - writer.write_boolean(self.m_DownscaleFallback) - if self.version >= (2020, 2): # 2020.2 and up - writer.write_boolean(self.m_IsAlphaChannelOptional) - writer.align_stream() diff --git a/UnityPy/classes/Texture2D.py b/UnityPy/classes/Texture2D.py deleted file mode 100644 index 47a09c69..00000000 --- a/UnityPy/classes/Texture2D.py +++ /dev/null @@ -1,308 +0,0 @@ -from .Texture import Texture -from ..enums import TextureFormat -from ..export import Texture2DConverter -from ..helpers.ResourceReader import get_resource_data -from ..streams import EndianBinaryWriter -from PIL import Image -from io import BufferedIOBase, RawIOBase, IOBase - - -class Texture2D(Texture): - @property - def image(self): - return Texture2DConverter.get_image_from_texture2d(self) - - @image.setter - def image(self, img): - # img is PIL.Image / image path / opened file - # overwrite original image data with the RGB(A) image data and sets the correct new format - if img is None: - raise Exception("No image provided") - - if ( - isinstance(img, str) - or isinstance(img, BufferedIOBase) - or isinstance(img, RawIOBase) - or isinstance(img, IOBase) - ): - img = Image.open(img) - - img_data, tex_format = Texture2DConverter.image_to_texture2d( - img, self.m_TextureFormat - ) - - # disable mipmaps as we don't store them ourselves by default - if self.version[:2] < (5, 2): # 5.2 down - self.m_MipMap = False - else: - self.m_MipCount = 1 - - self.image_data = img_data - self.m_MipCount = 1 - # width * height * channel count - self.m_CompleteImageSize = len( - img_data - ) # img.width * img.height * len(img.getbands()) - self.m_TextureFormat = tex_format - - @property - def image_data(self): - if not self._image_data and self.m_StreamData is not None: - self._image_data = get_resource_data( - self.m_StreamData.path, - self.assets_file, - self.m_StreamData.offset, - self.m_StreamData.size, - ) - return self._image_data - - def reset_streamdata(self): - if not self.m_StreamData: - return - self.m_StreamData.offset = 0 - self.m_StreamData.size = 0 - self.m_StreamData.path = "" - - @image_data.setter - def image_data(self, data: bytes): - self._image_data = data - # ignore writing to cab for now until it's more stable - # if self.version >= (5, 3) and self.m_StreamData.path: - # cab = self.assets_file.get_writeable_cab() - # if cab: - # self.m_StreamData.offset = cab.Position - # cab.write(data) - # self.m_StreamData.size = len(data) - # self.m_StreamData.path = cab.path - # else: - # self.reset_streamdata() - self.reset_streamdata() - - def set_image( - self, - img, - target_format: TextureFormat = None, - in_cab: bool = False, - mipmap_count: int = 1, - ): - if img is None: - raise Exception("No image provided") - if not target_format: - target_format = self.m_TextureFormat - - img_data, tex_format = Texture2DConverter.image_to_texture2d(img, target_format) - if mipmap_count > 1: - width = self.m_Width - height = self.m_Height - re_img = img - for i in range(mipmap_count - 1): - width //= 2 - height //= 2 - if width < 4 or height < 4: - mipmap_count = i + 1 - break - re_img = re_img.resize((width, height), Image.BICUBIC) - img_data += Texture2DConverter.image_to_texture2d( - re_img, target_format - )[0] - - if self.version[:2] < (5, 2): # 5.2 down - self.m_MipMap = mipmap_count > 1 - else: - self.m_MipCount = mipmap_count - - if in_cab: - self.image_data = img_data - else: - self._image_data = img_data - self.reset_streamdata() - - # width * height * channel count - self.m_CompleteImageSize = len( - img_data - ) # img.width * img.height * len(img.getbands()) - self.m_TextureFormat = tex_format - - def __init__(self, reader): - super().__init__(reader=reader) - version = self.version - - self.m_Width = reader.read_int() - self.m_Height = reader.read_int() - self.m_CompleteImageSize = reader.read_int() - if version >= (2020, 1): # 2020.1 and up - self.m_MipsStripped = reader.read_int() - self.m_TextureFormat = TextureFormat(reader.read_int()) - if version < (5, 2): # 3.4.0 - 5.1.5f1 - self.m_MipMap = reader.read_boolean() - else: # 5.2.0f2 and up - self.m_MipCount = reader.read_int() - - if version >= (2, 6): # 2.6 and up - self.m_IsReadable = reader.read_boolean() # 2.6 and up - if version >= (2020,): # 2020.1 and up - self.m_IsPreProcessed = reader.read_boolean() - if (2019, 3) <= version < (2022, 2, 0, 3) or (2023, 1, 0, 1) <= version < ( - 2023, - 1, - 0, - 8, - ): # 2019.3.0f6 - 2022.2.0a18 - self.m_IgnoreMasterTextureLimit = reader.read_boolean() - if (2022, 2, 0, 3) <= version < (2023, 1, 0, 1) or version >= ( - 2023, - 1, - 0, - 8, - ): # 2022.2.0f1 and up - self.m_IgnoreMipmapLimit = reader.read_boolean() - reader.align_stream() - self.m_MipmapLimitGroupName = reader.read_aligned_string() - - if (3,) <= version[:2] <= (5, 4): # 3.0 - 5.4 - self.m_ReadAllowed = reader.read_boolean() - if version >= (2018, 2): # 2018.2 and up - self.m_StreamingMipmaps = reader.read_boolean() - - reader.align_stream() - if version >= (2018, 2): # 2018.2 and up - self.m_StreamingMipmapsPriority = reader.read_int() - self.m_ImageCount = reader.read_int() - self.m_TextureDimension = reader.read_int() - self.m_TextureSettings = GLTextureSettings(reader, version) - if version >= (3,): # 3.0 and up - self.m_LightmapFormat = reader.read_int() - if version >= (3, 5): # 3.5 and up - self.m_ColorSpace = reader.read_int() - if version >= (2020, 2): # 2020.2 and up - self.m_PlatformBlob = reader.read_byte_array() - reader.align_stream() - - image_data_size = reader.read_int() - self._image_data = b"" - - if image_data_size != 0: - self._image_data = reader.read_bytes(image_data_size) - - self.m_StreamData = None - if version >= (5, 3): # 5.3 and up - # always read the StreamingInfo for resaving - self.m_StreamData = StreamingInfo(reader, version) - # don't read the data directly, - # as we don't want the parser break if the file is missing - - def save(self, writer: EndianBinaryWriter = None): - if writer is None: - writer = EndianBinaryWriter(endian=self.reader.endian) - version = self.version - - super().save(writer) - writer.write_int(self.m_Width) - writer.write_int(self.m_Height) - writer.write_int(self.m_CompleteImageSize) - if version >= (2020,): # 2020.1 and up - writer.write_int(self.m_MipsStripped) - writer.write_int(self.m_TextureFormat.value) - if version < (5, 2): # 5.2 down - writer.write_boolean(self.m_MipMap) - else: - writer.write_int(self.m_MipCount) - - if version >= (2, 6): # 2.6 and up - writer.write_boolean(self.m_IsReadable) # 2.6 and up - if version >= (2020,): # 2020.1 and up - writer.write_boolean(self.m_IsPreProcessed) - if (2019, 3) <= version < (2022, 2, 0, 3) or (2023, 1, 0, 1) <= version < ( - 2023, - 1, - 0, - 8, - ): # 2019.3.0f6 - 2022.2.0a18 - writer.write_boolean(self.m_IgnoreMasterTextureLimit) - if (2022, 2, 0, 3) <= version < (2023, 1, 0, 1) or version >= ( - 2023, - 1, - 0, - 8, - ): # 2022.2.0f1 and up - writer.write_boolean(self.m_IgnoreMipmapLimit) - writer.align_stream() - writer.write_aligned_string(self.m_MipmapLimitGroupName) - - if (3,) <= version[:2] <= (5, 4): # 3.0 - 5.4 - writer.write_boolean(self.m_ReadAllowed) # 3.0 - 5.4 - if version >= (2018, 2): # 2018.2 and up - writer.write_boolean(self.m_StreamingMipmaps) - - writer.align_stream() - if version >= (2018, 2): # 2018.2 and up - writer.write_int(self.m_StreamingMipmapsPriority) - writer.write_int(self.m_ImageCount) - writer.write_int(self.m_TextureDimension) - self.m_TextureSettings.save(writer, version) - if version >= (3,): # 3.0 and up - writer.write_int(self.m_LightmapFormat) - if version >= (3, 5): # 3.5 and up - writer.write_int(self.m_ColorSpace) - if version >= (2020, 2): # 2020.2 and up - writer.write_byte_array(self.m_PlatformBlob) - writer.align_stream() - - if version[:2] < (5, 3): - # version without m_StreamData - writer.write_int(len(self.image_data)) - writer.write_bytes(self.image_data) - else: - # decide if m_StreamData is used - if self.m_StreamData.path: - # used -> don't save the image_data - writer.write_int(0) - else: - writer.write_int(len(self.image_data)) - writer.write_bytes(self.image_data) - - self.m_StreamData.save(writer, version) - - self.set_raw_data(writer.bytes) - - -class StreamingInfo: - offset: int - size: int - path: str - - def __init__(self, reader, version): - if version >= (2020,): # 2020.1 and up - self.offset = reader.read_u_long() - else: - self.offset = reader.read_u_int() - self.size = reader.read_u_int() - self.path = reader.read_aligned_string() - - def save(self, writer, version): - if version >= (2020,): # 2020.1 and up - writer.write_u_long(self.offset) - else: - writer.write_u_int(self.offset) - writer.write_int(self.size) - writer.write_aligned_string(self.path) - - -class GLTextureSettings: - def __init__(self, reader, version): - self.m_FilterMode = reader.read_int() - self.m_Aniso = reader.read_int() - self.m_MipBias = reader.read_float() - self.m_WrapMode = reader.read_int() # m_WrapU - if version >= (2017,): # 2017.x and up - self.m_WrapV = reader.read_int() - self.m_WrapW = reader.read_int() - - def save(self, writer, version): - writer.write_int(self.m_FilterMode) - writer.write_int(self.m_Aniso) - writer.write_float(self.m_MipBias) - writer.write_int(self.m_WrapMode) # m_WrapU - if version >= (2017,): # 2017.x and up - writer.write_int(self.m_WrapV) - writer.write_int(self.m_WrapW) diff --git a/UnityPy/classes/Texture2DArray.py b/UnityPy/classes/Texture2DArray.py deleted file mode 100644 index 5ba6f0b2..00000000 --- a/UnityPy/classes/Texture2DArray.py +++ /dev/null @@ -1,84 +0,0 @@ -from typing import Optional, List - -from .Texture import Texture -from .Texture2D import StreamingInfo -from ..enums.GraphicsFormat import GraphicsFormat, GRAPHICS_TO_TEXTURE_MAP -from ..export import Texture2DConverter -from ..helpers.ResourceReader import get_resource_data -from PIL import Image - - -class GLTextureSettings: - m_Aniso: int - m_FilterMode: int - m_MipBias: float - m_WrapMode: Optional[int] = None - m_WrapU: Optional[int] = None - m_WrapV: Optional[int] = None - m_WrapW: Optional[int] = None - - def __init__(self, reader): - self.__dict__.update(**self.read_typetree(wrap=True).__dict__) - - -class Texture2DArray(Texture): - image_data: bytes - m_ColorSpace: int - m_DataSize: int - m_Depth: int - m_Format: GraphicsFormat - m_Height: int - m_IsReadable: bool - m_MipCount: int - m_Name: str - m_TextureSettings: GLTextureSettings - m_Width: int - m_DownscaleFallback: Optional[bool] = None - m_ForcedFallbackFormat: Optional[int] = None - m_IgnoreMipmapLimit: Optional[bool] = None - m_IsAlphaChannelOptional: Optional[bool] = None - m_MipmapLimitGroupName: Optional[str] = None - m_MipsStripped: Optional[int] = None - m_StreamData: Optional[StreamingInfo] = None - m_UsageMode: Optional[int] = None - - def __init__(self, reader): - super().__init__(reader=reader) - self.__dict__.update(**reader.read_typetree(wrap=True).__dict__) - self.m_TextureSettings.__class__ = GLTextureSettings - self.m_Format = GraphicsFormat(self.m_Format) - - @property - def image_data(self): - data = getattr(self, "image data", None) - if data is None: - data = get_resource_data( - self.m_StreamData.path, - self.assets_file, - self.m_StreamData.offset, - self.m_StreamData.size, - ) - return data - - @property - def images(self) -> List[Image.Image]: - texture_format = GRAPHICS_TO_TEXTURE_MAP.get(self.m_Format) - if not texture_format: - raise NotImplementedError( - f"GraphicsFormat {self.m_Format} not supported yet" - ) - - # calculate the number of textures in the array - texture_size = self.m_DataSize // self.m_Depth - return [ - Texture2DConverter.parse_image_data( - self.image_data[offset : offset + texture_size], - self.m_Width, - self.m_Height, - texture_format, - self.version, - 0, - None, - ) - for offset in range(0, self.m_DataSize, texture_size) - ] diff --git a/UnityPy/classes/Transform.py b/UnityPy/classes/Transform.py deleted file mode 100644 index df8419d2..00000000 --- a/UnityPy/classes/Transform.py +++ /dev/null @@ -1,14 +0,0 @@ -from .Component import Component -from .PPtr import PPtr - - -class Transform(Component): - def __init__(self, reader): - super().__init__(reader=reader) - self.m_LocalRotation = reader.read_quaternion() - self.m_LocalPosition = reader.read_vector3() - self.m_LocalScale = reader.read_vector3() - - children_count = reader.read_int() - self.m_Children = [PPtr(reader) for _ in range(children_count)] - self.m_Father = PPtr(reader) diff --git a/UnityPy/classes/VideoClip.py b/UnityPy/classes/VideoClip.py deleted file mode 100644 index 66ceb03d..00000000 --- a/UnityPy/classes/VideoClip.py +++ /dev/null @@ -1,44 +0,0 @@ -from .NamedObject import NamedObject -from ..helpers.ResourceReader import get_resource_data -from .PPtr import PPtr - - -class VideoClip(NamedObject): - def __init__(self, reader): - super().__init__(reader=reader) - self.m_OriginalPath = reader.read_aligned_string() - self.m_ProxyWidth = reader.read_u_int() - self.m_ProxyHeight = reader.read_u_int() - self.Width = reader.read_u_int() - self.Height = reader.read_u_int() - if self.version >= (2017, 2): # 2017.2 and up - self.m_PixelAspecRatioNum = reader.read_u_int() - self.m_PixelAspecRatioDen = reader.read_u_int() - self.m_FrameRate = reader.read_double() - self.m_FrameCount = reader.read_u_long() - self.m_Format = reader.read_int() - self.m_AudioChannelCount = reader.read_u_short_array() - reader.align_stream() - self.m_AudioSampleRate = reader.read_u_int_array() - self.m_AudioLanguage = reader.read_string_array() - if self.version >= (2020,): # 2020.1 and up - m_VideoShadersSize = reader.read_int() - self.m_VideoShaders = [ - PPtr(reader) for _ in range(m_VideoShadersSize) - ] - - # m_ExternalResources = new StreamedResource(reader) - self.source = reader.read_aligned_string() - self.offset = reader.read_u_long() - self.size = reader.read_u_long() - - self.m_HasSplitAlpha = reader.read_boolean() - if self.version >= (2020,): # 2020.1 and up - self.m_sRGB = reader.read_boolean() - - if self.source: - self.m_VideoData = get_resource_data( - self.source, self.assets_file, self.offset, self.size) - else: - self.reader.Position = self.data_offset - self.m_VideoData = self.reader.read_bytes(self.size) diff --git a/UnityPy/classes/__init__.py b/UnityPy/classes/__init__.py index 5cae3aac..f1e0246c 100644 --- a/UnityPy/classes/__init__.py +++ b/UnityPy/classes/__init__.py @@ -1,39 +1,4 @@ -from .Animation import Animation -from .AnimationClip import AnimationClip -from .Animator import Animator -from .AnimatorController import AnimatorController -from .AnimatorOverrideController import AnimatorOverrideController -from .AssetBundle import AssetBundle -from .AudioClip import AudioClip -from .Avatar import Avatar -from .Behaviour import Behaviour -from .BuildSettings import BuildSettings -from .Component import Component -from .EditorExtension import EditorExtension -from .Font import Font -from .GameObject import GameObject -from .Material import Material -from .Mesh import Mesh -from .MeshFilter import MeshFilter -from .MeshRenderer import MeshRenderer -from .MonoBehaviour import MonoBehaviour -from .MonoScript import MonoScript -from .MovieTexture import MovieTexture -from .NamedObject import NamedObject -from .Object import Object -from .PPtr import PPtr -from .PlayerSettings import PlayerSettings -from .RectTransform import RectTransform -from .Renderer import Renderer -from .RuntimeAnimatorController import RuntimeAnimatorController -from .ResourceManager import ResourceManager -from .Shader import Shader -from .SkinnedMeshRenderer import SkinnedMeshRenderer -from .Sprite import Sprite -from .SpriteAtlas import SpriteAtlas -from .TextAsset import TextAsset -from .Texture import Texture -from .Texture2D import Texture2D -from .Texture2DArray import Texture2DArray -from .Transform import Transform -from .VideoClip import VideoClip +from .Object import Object as Object +from .PPtr import PPtr as PPtr +from .generated import * +from .legacy_patch import * diff --git a/UnityPy/classes/generated.py b/UnityPy/classes/generated.py new file mode 100644 index 00000000..a3fc3022 --- /dev/null +++ b/UnityPy/classes/generated.py @@ -0,0 +1,10660 @@ +#type: ignore +from __future__ import annotations +from abc import ABC +from attrs import define +from typing import List, Optional, Tuple, Union + +from .math import float3, Matrix3x4f, Vector3f, Vector4f, ColorRGBA, Vector2f, Quaternionf, Matrix4x4f, float4 +from .Object import Object +from .PPtr import PPtr + + +@define(kw_only=True, slots=False) +class AnnotationManager(Object): + m_CurrentPreset_m_AnnotationList: List[Annotation] + m_RecentlyChanged: List[Annotation] + m_FadeGizmoSize: Optional[float] = None + m_FadeGizmos: Optional[bool] = None + m_IconSize: Optional[float] = None + m_ShowGrid: Optional[bool] = None + m_ShowSelectionOutline: Optional[bool] = None + m_ShowSelectionWire: Optional[bool] = None + m_Use3dGizmos: Optional[bool] = None + m_WorldIconSize: Optional[float] = None + +@define(kw_only=True, slots=False) +class AssetDatabaseV1(Object): + m_AssetBundleNames: List[Tuple[int, AssetBundleFullName]] + m_AssetTimeStamps: List[Tuple[str, AssetTimeStamp]] + m_Assets: List[Tuple[GUID, Asset]] + m_Metrics: AssetDatabaseMetrics + m_UnityShadersVersion: int + m_lastValidVersionHashes: Optional[List[Tuple[int, int]]] = None + m_lastValidVersions: Optional[List[Tuple[AssetImporterHashKey, int]]] = None + +@define(kw_only=True, slots=False) +class AssetMetaData(Object): + assetStoreRef: int + guid: GUID + labels: List[str] + originalName: str + pathName: str + licenseType: Optional[int] = None + originalChangeset: Optional[int] = None + originalDigest: Optional[Union[Hash128, MdFour]] = None + originalParent: Optional[GUID] = None + timeCreated: Optional[int] = None + +@define(kw_only=True, slots=False) +class AssetServerCache(Object): + m_CachesInitialized: int + m_CommitItemSelection: List[GUID] + m_DeletedItems: List[Tuple[GUID, DeletedItem]] + m_Items: List[Tuple[GUID, Item]] + m_LastCommitMessage: str + m_LatestServerChangeset: int + m_ModifiedItems: List[Tuple[GUID, Item]] + m_WorkingItemMetaData: List[Tuple[GUID, CachedAssetMetaData]] + +@define(kw_only=True, slots=False) +class AudioBuildInfo(Object): + m_AudioClipCount: int + m_AudioMixerCount: int + m_IsAudioDisabled: bool + +@define(kw_only=True, slots=False) +class BuiltAssetBundleInfoSet(Object): + bundleInfos: List[BuiltAssetBundleInfo] + +@define(kw_only=True, slots=False) +class Derived(Object): + pass + +@define(kw_only=True, slots=False) +class SubDerived(Derived): + pass + +@define(kw_only=True, slots=False) +class DifferentMarshallingTestObject(Object): + pass + +@define(kw_only=True, slots=False) +class EditorBuildSettings(Object): + m_Scenes: List[Scene] + m_UseUCBPForAssetBundles: Optional[bool] = None + m_configObjects: Optional[List[Tuple[str, PPtr[Object]]]] = None + +@define(kw_only=True, slots=False) +class EditorExtension(Object, ABC): + pass + +@define(kw_only=True, slots=False) +class Component(EditorExtension): + m_GameObject: PPtr[GameObject] + +@define(kw_only=True, slots=False) +class Behaviour(Component): + m_GameObject: PPtr[GameObject] + +@define(kw_only=True, slots=False) +class Animation(Behaviour): + m_AnimatePhysics: bool + m_Animation: PPtr[AnimationClip] + m_Animations: List[PPtr[AnimationClip]] + m_CullingType: int + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_PlayAutomatically: bool + m_WrapMode: int + m_UpdateMode: Optional[int] = None + m_UserAABB: Optional[AABB] = None + +@define(kw_only=True, slots=False) +class Animator(Behaviour): + m_ApplyRootMotion: bool + m_Avatar: PPtr[Avatar] + m_Controller: Union[PPtr[AnimatorController], PPtr[RuntimeAnimatorController]] + m_CullingMode: int + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_AllowConstantClipSamplingOptimization: Optional[bool] = None + m_AnimatePhysics: Optional[bool] = None + m_HasTransformHierarchy: Optional[bool] = None + m_KeepAnimatorControllerStateOnDisable: Optional[bool] = None + m_KeepAnimatorStateOnDisable: Optional[bool] = None + m_LinearVelocityBlending: Optional[bool] = None + m_StabilizeFeet: Optional[bool] = None + m_UpdateMode: Optional[int] = None + m_WriteDefaultValuesOnDisable: Optional[bool] = None + +@define(kw_only=True, slots=False) +class ArticulationBody(Behaviour): + m_AnchorPosition: Vector3f + m_AnchorRotation: Quaternionf + m_AngularDamping: float + m_ArticulationJointType: int + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_Immovable: bool + m_JointFriction: float + m_LinearDamping: float + m_LinearX: int + m_LinearY: int + m_LinearZ: int + m_Mass: float + m_ParentAnchorPosition: Vector3f + m_ParentAnchorRotation: Quaternionf + m_SwingY: int + m_SwingZ: int + m_Twist: int + m_XDrive: ArticulationDrive + m_YDrive: ArticulationDrive + m_ZDrive: ArticulationDrive + m_CenterOfMass: Optional[Vector3f] = None + m_CollisionDetectionMode: Optional[int] = None + m_ComputeParentAnchor: Optional[bool] = None + m_ExcludeLayers: Optional[BitField] = None + m_ImplicitCom: Optional[bool] = None + m_ImplicitTensor: Optional[bool] = None + m_IncludeLayers: Optional[BitField] = None + m_InertiaRotation: Optional[Quaternionf] = None + m_InertiaTensor: Optional[Vector3f] = None + m_MatchAnchors: Optional[bool] = None + m_UseGravity: Optional[bool] = None + +@define(kw_only=True, slots=False) +class AudioBehaviour(Behaviour): + m_GameObject: PPtr[GameObject] + +@define(kw_only=True, slots=False) +class AudioListener(AudioBehaviour): + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_ExtensionPropertyValues: Optional[List[ExtensionPropertyValue]] = None + +@define(kw_only=True, slots=False) +class AudioSource(AudioBehaviour): + BypassEffects: bool + DopplerLevel: float + Loop: bool + MaxDistance: float + MinDistance: float + Mute: bool + Pan2D: float + Priority: int + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_Pitch: float + m_PlayOnAwake: bool + m_Volume: float + m_audioClip: PPtr[AudioClip] + panLevelCustomCurve: AnimationCurve + rolloffCustomCurve: AnimationCurve + rolloffMode: int + spreadCustomCurve: AnimationCurve + BypassListenerEffects: Optional[bool] = None + BypassReverbZones: Optional[bool] = None + OutputAudioMixerGroup: Optional[PPtr[AudioMixerGroup]] = None + Spatialize: Optional[bool] = None + SpatializePostEffects: Optional[bool] = None + m_ExtensionPropertyValues: Optional[List[ExtensionPropertyValue]] = None + m_Resource: Optional[PPtr[AudioResource]] = None + reverbZoneMixCustomCurve: Optional[AnimationCurve] = None + +@define(kw_only=True, slots=False) +class AudioFilter(Behaviour): + m_GameObject: PPtr[GameObject] + +@define(kw_only=True, slots=False) +class AudioChorusFilter(AudioFilter): + m_Delay: float + m_Depth: float + m_DryMix: float + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_Rate: float + m_WetMix1: float + m_WetMix2: float + m_WetMix3: float + m_FeedBack: Optional[float] = None + +@define(kw_only=True, slots=False) +class AudioDistortionFilter(AudioFilter): + m_DistortionLevel: float + m_Enabled: int + m_GameObject: PPtr[GameObject] + +@define(kw_only=True, slots=False) +class AudioEchoFilter(AudioFilter): + m_DecayRatio: float + m_Delay: Union[int, float] + m_DryMix: float + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_WetMix: float + +@define(kw_only=True, slots=False) +class AudioHighPassFilter(AudioFilter): + m_CutoffFrequency: float + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_HighpassResonanceQ: float + +@define(kw_only=True, slots=False) +class AudioLowPassFilter(AudioFilter): + lowpassLevelCustomCurve: AnimationCurve + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_LowpassResonanceQ: float + m_CutoffFrequency: Optional[float] = None + +@define(kw_only=True, slots=False) +class AudioReverbFilter(AudioFilter): + m_DecayHFRatio: float + m_DecayTime: float + m_Density: float + m_Diffusion: float + m_DryLevel: float + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_HFReference: float + m_LFReference: float + m_ReflectionsDelay: float + m_ReflectionsLevel: float + m_ReverbDelay: float + m_ReverbLevel: float + m_ReverbPreset: int + m_Room: float + m_RoomHF: float + m_RoomLF: float + m_RoomRolloff: Optional[float] = None + +@define(kw_only=True, slots=False) +class AudioReverbZone(Behaviour): + m_DecayHFRatio: float + m_DecayTime: float + m_Density: float + m_Diffusion: float + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_HFReference: float + m_LFReference: float + m_MaxDistance: float + m_MinDistance: float + m_Reflections: int + m_ReflectionsDelay: float + m_Reverb: int + m_ReverbDelay: float + m_ReverbPreset: int + m_Room: int + m_RoomHF: int + m_RoomLF: int + m_RoomRolloffFactor: Optional[float] = None + +@define(kw_only=True, slots=False) +class Camera(Behaviour): + far_clip_plane: float + field_of_view: float + m_BackGroundColor: ColorRGBA + m_ClearFlags: int + m_CullingMask: BitField + m_Depth: float + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_NormalizedViewPortRect: Rectf + m_RenderingPath: int + m_TargetTexture: PPtr[RenderTexture] + near_clip_plane: float + orthographic: bool + orthographic_size: float + m_AllowDynamicResolution: Optional[bool] = None + m_AllowMSAA: Optional[bool] = None + m_Anamorphism: Optional[float] = None + m_Aperture: Optional[float] = None + m_BarrelClipping: Optional[float] = None + m_BladeCount: Optional[int] = None + m_Curvature: Optional[Vector2f] = None + m_FocalLength: Optional[float] = None + m_FocusDistance: Optional[float] = None + m_ForceIntoRT: Optional[bool] = None + m_GateFitMode: Optional[int] = None + m_HDR: Optional[bool] = None + m_Iso: Optional[int] = None + m_LensShift: Optional[Vector2f] = None + m_OcclusionCulling: Optional[bool] = None + m_SensorSize: Optional[Vector2f] = None + m_ShutterSpeed: Optional[float] = None + m_StereoConvergence: Optional[float] = None + m_StereoMirrorMode: Optional[bool] = None + m_StereoSeparation: Optional[float] = None + m_TargetDisplay: Optional[int] = None + m_TargetEye: Optional[int] = None + m_projectionMatrixMode: Optional[int] = None + +@define(kw_only=True, slots=False) +class ScriptableCamera(Camera): + far_clip_plane: float + field_of_view: float + m_AllowDynamicResolution: bool + m_AllowMSAA: bool + m_BackGroundColor: ColorRGBA + m_ClearFlags: int + m_CullingMask: BitField + m_Depth: float + m_Enabled: int + m_FocalLength: float + m_ForceIntoRT: bool + m_GameObject: PPtr[GameObject] + m_GateFitMode: int + m_HDR: bool + m_LensShift: Vector2f + m_NormalizedViewPortRect: Rectf + m_OcclusionCulling: bool + m_RenderingPath: int + m_Script: PPtr[MonoScript] + m_SensorSize: Vector2f + m_StereoConvergence: float + m_StereoSeparation: float + m_TargetDisplay: int + m_TargetEye: int + m_TargetTexture: PPtr[RenderTexture] + m_projectionMatrixMode: int + near_clip_plane: float + orthographic: bool + orthographic_size: float + +@define(kw_only=True, slots=False) +class Canvas(Behaviour): + m_Camera: PPtr[Camera] + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_PixelPerfect: bool + m_RenderMode: int + m_AdditionalShaderChannelsFlag: Optional[int] = None + m_Alpha: Optional[float] = None + m_Normals: Optional[bool] = None + m_OverridePixelPerfect: Optional[bool] = None + m_OverrideSorting: Optional[bool] = None + m_PlaneDistance: Optional[float] = None + m_PositionUVs: Optional[bool] = None + m_ReceivesEvents: Optional[bool] = None + m_SortingBucketNormalizedSize: Optional[float] = None + m_SortingLayerID: Optional[int] = None + m_SortingOrder: Optional[int] = None + m_TargetDisplay: Optional[int] = None + m_UpdateRectTransformForStandalone: Optional[int] = None + m_VertexColorAlwaysGammaSpace: Optional[bool] = None + +@define(kw_only=True, slots=False) +class CanvasGroup(Behaviour): + m_Alpha: float + m_BlocksRaycasts: bool + m_GameObject: PPtr[GameObject] + m_IgnoreParentGroups: bool + m_Interactable: bool + m_Enabled: Optional[int] = None + +@define(kw_only=True, slots=False) +class Cloth(Behaviour): + m_GameObject: PPtr[GameObject] + m_BendingStiffness: Optional[float] = None + m_CapsuleColliders: Optional[List[PPtr[CapsuleCollider]]] = None + m_Coefficients: Optional[List[ClothConstrainCoefficients]] = None + m_CollisionMassScale: Optional[float] = None + m_Damping: Optional[float] = None + m_Enabled: Optional[int] = None + m_ExternalAcceleration: Optional[Vector3f] = None + m_Friction: Optional[float] = None + m_RandomAcceleration: Optional[Vector3f] = None + m_SelfAndInterCollisionIndices: Optional[List[int]] = None + m_SelfCollisionDistance: Optional[float] = None + m_SelfCollisionStiffness: Optional[float] = None + m_SleepThreshold: Optional[float] = None + m_SolverFrequency: Optional[Union[int, float]] = None + m_SphereColliders: Optional[Union[List[ClothSphereColliderPair], List[Tuple[PPtr[SphereCollider], PPtr[SphereCollider]]]]] = None + m_StretchingStiffness: Optional[float] = None + m_UseContinuousCollision: Optional[bool] = None + m_UseGravity: Optional[bool] = None + m_UseTethers: Optional[bool] = None + m_UseVirtualParticles: Optional[bool] = None + m_VirtualParticleIndices: Optional[List[int]] = None + m_VirtualParticleWeights: Optional[List[Vector3f]] = None + m_WorldAccelerationScale: Optional[float] = None + m_WorldVelocityScale: Optional[float] = None + +@define(kw_only=True, slots=False) +class InteractiveCloth(Cloth): + m_AttachedColliders: List[ClothAttachment] + m_AttachmentResponse: float + m_AttachmentTearFactor: float + m_BendingStiffness: float + m_CollisionResponse: float + m_Damping: float + m_Density: float + m_Enabled: int + m_ExternalAcceleration: Vector3f + m_Friction: float + m_GameObject: PPtr[GameObject] + m_Mesh: PPtr[Mesh] + m_Pressure: float + m_RandomAcceleration: Vector3f + m_SelfCollision: bool + m_StretchingStiffness: float + m_TearFactor: float + m_Thickness: float + m_UseGravity: bool + +@define(kw_only=True, slots=False) +class SkinnedCloth(Cloth): + m_BendingStiffness: float + m_Coefficients: List[ClothConstrainCoefficients] + m_Damping: float + m_Enabled: int + m_ExternalAcceleration: Vector3f + m_GameObject: PPtr[GameObject] + m_RandomAcceleration: Vector3f + m_SelfCollision: bool + m_StretchingStiffness: float + m_Thickness: float + m_UseGravity: bool + m_WorldAccelerationScale: float + m_WorldVelocityScale: float + +@define(kw_only=True, slots=False) +class CloudServiceHandlerBehaviour(Behaviour): + m_Enabled: int + m_GameObject: PPtr[GameObject] + +@define(kw_only=True, slots=False) +class Collider2D(Behaviour): + m_GameObject: PPtr[GameObject] + +@define(kw_only=True, slots=False) +class BoxCollider2D(Collider2D): + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_IsTrigger: bool + m_Material: PPtr[PhysicsMaterial2D] + m_Size: Vector2f + m_AutoTiling: Optional[bool] = None + m_CallbackLayers: Optional[BitField] = None + m_Center: Optional[Vector2f] = None + m_CompositeOperation: Optional[int] = None + m_CompositeOrder: Optional[int] = None + m_ContactCaptureLayers: Optional[BitField] = None + m_Density: Optional[float] = None + m_EdgeRadius: Optional[float] = None + m_ExcludeLayers: Optional[BitField] = None + m_ForceReceiveLayers: Optional[BitField] = None + m_ForceSendLayers: Optional[BitField] = None + m_IncludeLayers: Optional[BitField] = None + m_LayerOverridePriority: Optional[int] = None + m_Offset: Optional[Vector2f] = None + m_SpriteTilingProperty: Optional[SpriteTilingProperty] = None + m_UsedByComposite: Optional[bool] = None + m_UsedByEffector: Optional[bool] = None + +@define(kw_only=True, slots=False) +class CapsuleCollider2D(Collider2D): + m_Density: float + m_Direction: int + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_IsTrigger: bool + m_Material: PPtr[PhysicsMaterial2D] + m_Offset: Vector2f + m_Size: Vector2f + m_UsedByEffector: bool + m_CallbackLayers: Optional[BitField] = None + m_CompositeOperation: Optional[int] = None + m_CompositeOrder: Optional[int] = None + m_ContactCaptureLayers: Optional[BitField] = None + m_ExcludeLayers: Optional[BitField] = None + m_ForceReceiveLayers: Optional[BitField] = None + m_ForceSendLayers: Optional[BitField] = None + m_IncludeLayers: Optional[BitField] = None + m_LayerOverridePriority: Optional[int] = None + m_UsedByComposite: Optional[bool] = None + +@define(kw_only=True, slots=False) +class CircleCollider2D(Collider2D): + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_IsTrigger: bool + m_Material: PPtr[PhysicsMaterial2D] + m_Radius: float + m_CallbackLayers: Optional[BitField] = None + m_Center: Optional[Vector2f] = None + m_CompositeOperation: Optional[int] = None + m_CompositeOrder: Optional[int] = None + m_ContactCaptureLayers: Optional[BitField] = None + m_Density: Optional[float] = None + m_ExcludeLayers: Optional[BitField] = None + m_ForceReceiveLayers: Optional[BitField] = None + m_ForceSendLayers: Optional[BitField] = None + m_IncludeLayers: Optional[BitField] = None + m_LayerOverridePriority: Optional[int] = None + m_Offset: Optional[Vector2f] = None + m_UsedByComposite: Optional[bool] = None + m_UsedByEffector: Optional[bool] = None + +@define(kw_only=True, slots=False) +class CompositeCollider2D(Collider2D): + m_ColliderPaths: List[SubCollider] + m_CompositePaths: Polygon2D + m_Density: float + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_GenerationType: int + m_GeometryType: int + m_IsTrigger: bool + m_Material: PPtr[PhysicsMaterial2D] + m_Offset: Vector2f + m_UsedByEffector: bool + m_VertexDistance: float + m_CallbackLayers: Optional[BitField] = None + m_CompositeGameObject: Optional[PPtr[GameObject]] = None + m_CompositeOperation: Optional[int] = None + m_CompositeOrder: Optional[int] = None + m_ContactCaptureLayers: Optional[BitField] = None + m_EdgeRadius: Optional[float] = None + m_ExcludeLayers: Optional[BitField] = None + m_ForceReceiveLayers: Optional[BitField] = None + m_ForceSendLayers: Optional[BitField] = None + m_IncludeLayers: Optional[BitField] = None + m_LayerOverridePriority: Optional[int] = None + m_OffsetDistance: Optional[float] = None + m_UseDelaunayMesh: Optional[bool] = None + m_UsedByComposite: Optional[bool] = None + +@define(kw_only=True, slots=False) +class CustomCollider2D(Collider2D): + m_CustomShapes: PhysicsShapeGroup2D + m_Density: float + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_IsTrigger: bool + m_Material: PPtr[PhysicsMaterial2D] + m_Offset: Vector2f + m_UsedByEffector: bool + m_CallbackLayers: Optional[BitField] = None + m_CompositeOperation: Optional[int] = None + m_CompositeOrder: Optional[int] = None + m_ContactCaptureLayers: Optional[BitField] = None + m_ExcludeLayers: Optional[BitField] = None + m_ForceReceiveLayers: Optional[BitField] = None + m_ForceSendLayers: Optional[BitField] = None + m_IncludeLayers: Optional[BitField] = None + m_LayerOverridePriority: Optional[int] = None + m_UsedByComposite: Optional[bool] = None + +@define(kw_only=True, slots=False) +class EdgeCollider2D(Collider2D): + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_IsTrigger: bool + m_Material: PPtr[PhysicsMaterial2D] + m_Points: List[Vector2f] + m_AdjacentEndPoint: Optional[Vector2f] = None + m_AdjacentStartPoint: Optional[Vector2f] = None + m_CallbackLayers: Optional[BitField] = None + m_CompositeOperation: Optional[int] = None + m_CompositeOrder: Optional[int] = None + m_ContactCaptureLayers: Optional[BitField] = None + m_Density: Optional[float] = None + m_EdgeRadius: Optional[float] = None + m_ExcludeLayers: Optional[BitField] = None + m_ForceReceiveLayers: Optional[BitField] = None + m_ForceSendLayers: Optional[BitField] = None + m_IncludeLayers: Optional[BitField] = None + m_LayerOverridePriority: Optional[int] = None + m_Offset: Optional[Vector2f] = None + m_UseAdjacentEndPoint: Optional[bool] = None + m_UseAdjacentStartPoint: Optional[bool] = None + m_UsedByComposite: Optional[bool] = None + m_UsedByEffector: Optional[bool] = None + +@define(kw_only=True, slots=False) +class PolygonCollider2D(Collider2D): + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_IsTrigger: bool + m_Material: PPtr[PhysicsMaterial2D] + m_AutoTiling: Optional[bool] = None + m_CallbackLayers: Optional[BitField] = None + m_CompositeOperation: Optional[int] = None + m_CompositeOrder: Optional[int] = None + m_ContactCaptureLayers: Optional[BitField] = None + m_Density: Optional[float] = None + m_ExcludeLayers: Optional[BitField] = None + m_ForceReceiveLayers: Optional[BitField] = None + m_ForceSendLayers: Optional[BitField] = None + m_IncludeLayers: Optional[BitField] = None + m_LayerOverridePriority: Optional[int] = None + m_Offset: Optional[Vector2f] = None + m_Points: Optional[Polygon2D] = None + m_Poly: Optional[Polygon2D] = None + m_SpriteTilingProperty: Optional[SpriteTilingProperty] = None + m_UseDelaunayMesh: Optional[bool] = None + m_UsedByComposite: Optional[bool] = None + m_UsedByEffector: Optional[bool] = None + +@define(kw_only=True, slots=False) +class PolygonColliderBase2D(Collider2D): + m_GameObject: PPtr[GameObject] + +@define(kw_only=True, slots=False) +class TilemapCollider2D(Collider2D): + m_Density: float + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_IsTrigger: bool + m_Material: PPtr[PhysicsMaterial2D] + m_Offset: Vector2f + m_UsedByEffector: bool + m_CallbackLayers: Optional[BitField] = None + m_CompositeOperation: Optional[int] = None + m_CompositeOrder: Optional[int] = None + m_ContactCaptureLayers: Optional[BitField] = None + m_ExcludeLayers: Optional[BitField] = None + m_ExtrusionFactor: Optional[float] = None + m_ForceReceiveLayers: Optional[BitField] = None + m_ForceSendLayers: Optional[BitField] = None + m_IncludeLayers: Optional[BitField] = None + m_LayerOverridePriority: Optional[int] = None + m_MaximumTileChangeCount: Optional[int] = None + m_UseDelaunayMesh: Optional[bool] = None + m_UsedByComposite: Optional[bool] = None + +@define(kw_only=True, slots=False) +class ConstantForce(Behaviour): + m_Enabled: int + m_Force: Vector3f + m_GameObject: PPtr[GameObject] + m_RelativeForce: Vector3f + m_RelativeTorque: Vector3f + m_Torque: Vector3f + +@define(kw_only=True, slots=False) +class Effector2D(Behaviour): + m_GameObject: PPtr[GameObject] + +@define(kw_only=True, slots=False) +class AreaEffector2D(Effector2D): + m_AngularDrag: float + m_ColliderMask: BitField + m_Drag: float + m_Enabled: int + m_ForceMagnitude: float + m_ForceTarget: int + m_ForceVariation: float + m_GameObject: PPtr[GameObject] + m_ForceAngle: Optional[float] = None + m_ForceDirection: Optional[float] = None + m_UseColliderMask: Optional[bool] = None + m_UseGlobalAngle: Optional[bool] = None + +@define(kw_only=True, slots=False) +class BuoyancyEffector2D(Effector2D): + m_AngularDrag: float + m_ColliderMask: BitField + m_Density: float + m_Enabled: int + m_FlowAngle: float + m_FlowMagnitude: float + m_FlowVariation: float + m_GameObject: PPtr[GameObject] + m_LinearDrag: float + m_SurfaceLevel: float + m_UseColliderMask: bool + +@define(kw_only=True, slots=False) +class PlatformEffector2D(Effector2D): + m_ColliderMask: BitField + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_OneWay: Optional[bool] = None + m_RotationalOffset: Optional[float] = None + m_SideAngleVariance: Optional[float] = None + m_SideArc: Optional[float] = None + m_SideBounce: Optional[bool] = None + m_SideFriction: Optional[bool] = None + m_SurfaceArc: Optional[float] = None + m_UseColliderMask: Optional[bool] = None + m_UseOneWay: Optional[bool] = None + m_UseOneWayGrouping: Optional[bool] = None + m_UseSideBounce: Optional[bool] = None + m_UseSideFriction: Optional[bool] = None + +@define(kw_only=True, slots=False) +class PointEffector2D(Effector2D): + m_AngularDrag: float + m_ColliderMask: BitField + m_DistanceScale: float + m_Drag: float + m_Enabled: int + m_ForceMagnitude: float + m_ForceMode: int + m_ForceSource: int + m_ForceTarget: int + m_ForceVariation: float + m_GameObject: PPtr[GameObject] + m_UseColliderMask: Optional[bool] = None + +@define(kw_only=True, slots=False) +class SurfaceEffector2D(Effector2D): + m_ColliderMask: BitField + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_Speed: float + m_SpeedVariation: float + m_ForceScale: Optional[float] = None + m_UseBounce: Optional[bool] = None + m_UseColliderMask: Optional[bool] = None + m_UseContactForce: Optional[bool] = None + m_UseFriction: Optional[bool] = None + +@define(kw_only=True, slots=False) +class FlareLayer(Behaviour): + m_Enabled: int + m_GameObject: PPtr[GameObject] + +@define(kw_only=True, slots=False) +class GUIElement(Behaviour): + m_GameObject: PPtr[GameObject] + +@define(kw_only=True, slots=False) +class GUIText(GUIElement): + m_Alignment: int + m_Anchor: int + m_Enabled: int + m_Font: PPtr[Font] + m_FontSize: int + m_FontStyle: int + m_GameObject: PPtr[GameObject] + m_LineSpacing: float + m_Material: PPtr[Material] + m_PixelCorrect: bool + m_PixelOffset: Vector2f + m_TabSize: float + m_Text: str + m_Color: Optional[ColorRGBA] = None + m_RichText: Optional[bool] = None + +@define(kw_only=True, slots=False) +class GUITexture(GUIElement): + m_BottomBorder: int + m_Color: ColorRGBA + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_LeftBorder: int + m_PixelInset: Rectf + m_RightBorder: int + m_Texture: PPtr[Texture] + m_TopBorder: int + +@define(kw_only=True, slots=False) +class GUILayer(Behaviour): + m_Enabled: int + m_GameObject: PPtr[GameObject] + +@define(kw_only=True, slots=False) +class GridLayout(Behaviour): + m_GameObject: PPtr[GameObject] + +@define(kw_only=True, slots=False) +class Grid(GridLayout): + m_CellGap: Vector3f + m_CellLayout: int + m_CellSize: Vector3f + m_CellSwizzle: int + m_Enabled: int + m_GameObject: PPtr[GameObject] + +@define(kw_only=True, slots=False) +class Tilemap(GridLayout): + m_AnimatedTiles: List[Tuple[int3_storage, TileAnimationData]] + m_AnimationFrameRate: float + m_Color: ColorRGBA + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_Origin: int3_storage + m_Size: int3_storage + m_TileAnchor: Vector3f + m_TileAssetArray: List[TilemapRefCountedData] + m_TileColorArray: List[TilemapRefCountedData] + m_TileMatrixArray: List[TilemapRefCountedData] + m_TileOrientation: int + m_TileOrientationMatrix: Matrix4x4f + m_TileSpriteArray: List[TilemapRefCountedData] + m_Tiles: List[Tuple[int3_storage, Tile]] + m_TileObjectToInstantiateArray: Optional[List[TilemapRefCountedData]] = None + +@define(kw_only=True, slots=False) +class Halo(Behaviour): + m_Color: ColorRGBA + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_Size: float + +@define(kw_only=True, slots=False) +class HaloLayer(Behaviour): + m_Enabled: int + m_GameObject: PPtr[GameObject] + +@define(kw_only=True, slots=False) +class IConstraint(Behaviour): + m_GameObject: PPtr[GameObject] + +@define(kw_only=True, slots=False) +class AimConstraint(IConstraint): + m_AffectRotationX: bool + m_AffectRotationY: bool + m_AffectRotationZ: bool + m_AimVector: Vector3f + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_RotationAtRest: Vector3f + m_RotationOffset: Vector3f + m_Sources: List[ConstraintSource] + m_UpType: int + m_UpVector: Vector3f + m_Weight: float + m_WorldUpObject: PPtr[Transform] + m_WorldUpVector: Vector3f + m_Active: Optional[bool] = None + m_IsContraintActive: Optional[bool] = None + +@define(kw_only=True, slots=False) +class LookAtConstraint(IConstraint): + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_Roll: float + m_RotationAtRest: Vector3f + m_RotationOffset: Vector3f + m_Sources: List[ConstraintSource] + m_UseUpObject: bool + m_Weight: float + m_WorldUpObject: PPtr[Transform] + m_Active: Optional[bool] = None + m_IsContraintActive: Optional[bool] = None + +@define(kw_only=True, slots=False) +class ParentConstraint(IConstraint): + m_AffectRotationX: bool + m_AffectRotationY: bool + m_AffectRotationZ: bool + m_AffectTranslationX: bool + m_AffectTranslationY: bool + m_AffectTranslationZ: bool + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_RotationAtRest: Vector3f + m_RotationOffsets: List[Vector3f] + m_Sources: List[ConstraintSource] + m_TranslationAtRest: Vector3f + m_TranslationOffsets: List[Vector3f] + m_Weight: float + m_Active: Optional[bool] = None + m_IsContraintActive: Optional[bool] = None + +@define(kw_only=True, slots=False) +class PositionConstraint(IConstraint): + m_AffectTranslationX: bool + m_AffectTranslationY: bool + m_AffectTranslationZ: bool + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_Sources: List[ConstraintSource] + m_TranslationAtRest: Vector3f + m_TranslationOffset: Vector3f + m_Weight: float + m_Active: Optional[bool] = None + m_IsContraintActive: Optional[bool] = None + +@define(kw_only=True, slots=False) +class RotationConstraint(IConstraint): + m_AffectRotationX: bool + m_AffectRotationY: bool + m_AffectRotationZ: bool + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_RotationAtRest: Vector3f + m_RotationOffset: Vector3f + m_Sources: List[ConstraintSource] + m_Weight: float + m_Active: Optional[bool] = None + m_IsContraintActive: Optional[bool] = None + +@define(kw_only=True, slots=False) +class ScaleConstraint(IConstraint): + m_AffectScalingX: bool + m_AffectScalingY: bool + m_AffectScalingZ: bool + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_ScaleAtRest: Vector3f + m_ScaleOffset: Vector3f + m_Sources: List[ConstraintSource] + m_Weight: float + m_Active: Optional[bool] = None + m_IsContraintActive: Optional[bool] = None + +@define(kw_only=True, slots=False) +class Joint2D(Behaviour): + m_GameObject: PPtr[GameObject] + +@define(kw_only=True, slots=False) +class AnchoredJoint2D(Joint2D): + m_GameObject: PPtr[GameObject] + +@define(kw_only=True, slots=False) +class DistanceJoint2D(AnchoredJoint2D): + m_Anchor: Vector2f + m_ConnectedAnchor: Vector2f + m_ConnectedRigidBody: PPtr[Rigidbody2D] + m_Distance: float + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_AutoConfigureConnectedAnchor: Optional[bool] = None + m_AutoConfigureDistance: Optional[bool] = None + m_BreakAction: Optional[int] = None + m_BreakForce: Optional[float] = None + m_BreakTorque: Optional[float] = None + m_CollideConnected: Optional[bool] = None + m_EnableCollision: Optional[bool] = None + m_MaxDistanceOnly: Optional[bool] = None + +@define(kw_only=True, slots=False) +class FixedJoint2D(AnchoredJoint2D): + m_Anchor: Vector2f + m_AutoConfigureConnectedAnchor: bool + m_BreakForce: float + m_BreakTorque: float + m_ConnectedAnchor: Vector2f + m_ConnectedRigidBody: PPtr[Rigidbody2D] + m_DampingRatio: float + m_EnableCollision: bool + m_Enabled: int + m_Frequency: float + m_GameObject: PPtr[GameObject] + m_BreakAction: Optional[int] = None + +@define(kw_only=True, slots=False) +class FrictionJoint2D(AnchoredJoint2D): + m_Anchor: Vector2f + m_AutoConfigureConnectedAnchor: bool + m_BreakForce: float + m_BreakTorque: float + m_ConnectedAnchor: Vector2f + m_ConnectedRigidBody: PPtr[Rigidbody2D] + m_EnableCollision: bool + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_MaxForce: float + m_MaxTorque: float + m_BreakAction: Optional[int] = None + +@define(kw_only=True, slots=False) +class HingeJoint2D(AnchoredJoint2D): + m_Anchor: Vector2f + m_AngleLimits: Union[JointAngleLimit2D, JointAngleLimits2D] + m_ConnectedAnchor: Vector2f + m_ConnectedRigidBody: PPtr[Rigidbody2D] + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_Motor: JointMotor2D + m_UseLimits: bool + m_UseMotor: bool + m_AutoConfigureConnectedAnchor: Optional[bool] = None + m_BreakAction: Optional[int] = None + m_BreakForce: Optional[float] = None + m_BreakTorque: Optional[float] = None + m_CollideConnected: Optional[bool] = None + m_EnableCollision: Optional[bool] = None + m_UseConnectedAnchor: Optional[bool] = None + +@define(kw_only=True, slots=False) +class SliderJoint2D(AnchoredJoint2D): + m_Anchor: Vector2f + m_Angle: float + m_ConnectedAnchor: Vector2f + m_ConnectedRigidBody: PPtr[Rigidbody2D] + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_Motor: JointMotor2D + m_TranslationLimits: JointTranslationLimits2D + m_UseLimits: bool + m_UseMotor: bool + m_AutoConfigureAngle: Optional[bool] = None + m_AutoConfigureConnectedAnchor: Optional[bool] = None + m_BreakAction: Optional[int] = None + m_BreakForce: Optional[float] = None + m_BreakTorque: Optional[float] = None + m_CollideConnected: Optional[bool] = None + m_EnableCollision: Optional[bool] = None + +@define(kw_only=True, slots=False) +class SpringJoint2D(AnchoredJoint2D): + m_Anchor: Vector2f + m_ConnectedAnchor: Vector2f + m_ConnectedRigidBody: PPtr[Rigidbody2D] + m_DampingRatio: float + m_Distance: float + m_Enabled: int + m_Frequency: float + m_GameObject: PPtr[GameObject] + m_AutoConfigureConnectedAnchor: Optional[bool] = None + m_AutoConfigureDistance: Optional[bool] = None + m_BreakAction: Optional[int] = None + m_BreakForce: Optional[float] = None + m_BreakTorque: Optional[float] = None + m_CollideConnected: Optional[bool] = None + m_EnableCollision: Optional[bool] = None + +@define(kw_only=True, slots=False) +class WheelJoint2D(AnchoredJoint2D): + m_Anchor: Vector2f + m_ConnectedAnchor: Vector2f + m_ConnectedRigidBody: PPtr[Rigidbody2D] + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_Motor: JointMotor2D + m_Suspension: JointSuspension2D + m_UseMotor: bool + m_AutoConfigureConnectedAnchor: Optional[bool] = None + m_BreakAction: Optional[int] = None + m_BreakForce: Optional[float] = None + m_BreakTorque: Optional[float] = None + m_CollideConnected: Optional[bool] = None + m_EnableCollision: Optional[bool] = None + +@define(kw_only=True, slots=False) +class RelativeJoint2D(Joint2D): + m_AngularOffset: float + m_AutoConfigureOffset: bool + m_BreakForce: float + m_BreakTorque: float + m_ConnectedRigidBody: PPtr[Rigidbody2D] + m_CorrectionScale: float + m_EnableCollision: bool + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_LinearOffset: Vector2f + m_MaxForce: float + m_MaxTorque: float + m_BreakAction: Optional[int] = None + +@define(kw_only=True, slots=False) +class TargetJoint2D(Joint2D): + m_Anchor: Vector2f + m_AutoConfigureTarget: bool + m_BreakForce: float + m_BreakTorque: float + m_ConnectedRigidBody: PPtr[Rigidbody2D] + m_DampingRatio: float + m_EnableCollision: bool + m_Enabled: int + m_Frequency: float + m_GameObject: PPtr[GameObject] + m_MaxForce: float + m_Target: Vector2f + m_BreakAction: Optional[int] = None + +@define(kw_only=True, slots=False) +class LensFlare(Behaviour): + m_Brightness: float + m_Color: ColorRGBA + m_Directional: bool + m_Enabled: int + m_Flare: PPtr[Flare] + m_GameObject: PPtr[GameObject] + m_IgnoreLayers: BitField + m_FadeSpeed: Optional[float] = None + +@define(kw_only=True, slots=False) +class Light(Behaviour): + m_Color: ColorRGBA + m_Cookie: PPtr[Texture] + m_CookieSize: float + m_CullingMask: BitField + m_DrawHalo: bool + m_Enabled: int + m_Flare: PPtr[Flare] + m_GameObject: PPtr[GameObject] + m_Intensity: float + m_Lightmapping: int + m_Range: float + m_RenderMode: int + m_Shadows: ShadowSettings + m_SpotAngle: float + m_Type: int + m_ActuallyLightmapped: Optional[bool] = None + m_AreaSize: Optional[Vector2f] = None + m_BakedIndex: Optional[int] = None + m_BakingOutput: Optional[LightBakingOutput] = None + m_BounceIntensity: Optional[float] = None + m_BoundingSphereOverride: Optional[Vector4f] = None + m_CCT: Optional[float] = None + m_ColorTemperature: Optional[float] = None + m_EnableSpotReflector: Optional[bool] = None + m_FalloffTable: Optional[FalloffTable] = None + m_ForceVisible: Optional[bool] = None + m_InnerSpotAngle: Optional[float] = None + m_LightShadowCasterMode: Optional[int] = None + m_LightUnit: Optional[int] = None + m_LuxAtDistance: Optional[float] = None + m_RenderingLayerMask: Optional[int] = None + m_Shape: Optional[int] = None + m_UseBoundingSphereOverride: Optional[bool] = None + m_UseColorTemperature: Optional[bool] = None + m_UseViewFrustumForShadowCasterCull: Optional[bool] = None + +@define(kw_only=True, slots=False) +class LightProbeGroup(Behaviour): + m_GameObject: PPtr[GameObject] + m_Enabled: Optional[int] = None + +@define(kw_only=True, slots=False) +class LightProbeProxyVolume(Behaviour): + m_BoundingBoxMode: int + m_BoundingBoxOrigin: Vector3f + m_BoundingBoxSize: Vector3f + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_ProbePositionMode: int + m_RefreshMode: int + m_ResolutionMode: int + m_ResolutionProbesPerUnit: float + m_ResolutionX: int + m_ResolutionY: int + m_ResolutionZ: int + m_DataFormat: Optional[int] = None + m_QualityMode: Optional[int] = None + +@define(kw_only=True, slots=False) +class MonoBehaviour(Behaviour): + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_Name: str + m_Script: PPtr[MonoScript] + +@define(kw_only=True, slots=False) +class NavMeshAgent(Behaviour): + m_Acceleration: float + m_AngularSpeed: float + m_AutoRepath: bool + m_AutoTraverseOffMeshLink: bool + m_BaseOffset: float + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_Height: float + m_ObstacleAvoidanceType: int + m_Radius: float + m_Speed: float + m_StoppingDistance: float + m_WalkableMask: int + avoidancePriority: Optional[int] = None + m_AgentTypeID: Optional[int] = None + m_AutoBraking: Optional[bool] = None + +@define(kw_only=True, slots=False) +class NavMeshObstacle(Behaviour): + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_Carve: Optional[bool] = None + m_CarveOnlyStationary: Optional[bool] = None + m_Center: Optional[Vector3f] = None + m_Extents: Optional[Vector3f] = None + m_Height: Optional[float] = None + m_MoveThreshold: Optional[float] = None + m_Radius: Optional[float] = None + m_Shape: Optional[int] = None + m_TimeToStationary: Optional[float] = None + +@define(kw_only=True, slots=False) +class NetworkView(Behaviour): + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_Observed: PPtr[Component] + m_StateSynchronization: int + m_ViewID: NetworkViewID + +@define(kw_only=True, slots=False) +class OffMeshLink(Behaviour): + m_Activated: bool + m_BiDirectional: bool + m_CostOverride: float + m_End: PPtr[Transform] + m_GameObject: PPtr[GameObject] + m_Start: PPtr[Transform] + m_AgentTypeID: Optional[int] = None + m_AreaIndex: Optional[int] = None + m_AutoUpdatePositions: Optional[bool] = None + m_DtPolyRef: Optional[int] = None + m_Enabled: Optional[int] = None + m_NavMeshLayer: Optional[int] = None + +@define(kw_only=True, slots=False) +class ParticleSystemForceField(Behaviour): + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_Parameters: ParticleSystemForceFieldParameters + +@define(kw_only=True, slots=False) +class PhysicsUpdateBehaviour2D(Behaviour): + m_GameObject: PPtr[GameObject] + +@define(kw_only=True, slots=False) +class ConstantForce2D(PhysicsUpdateBehaviour2D): + m_Enabled: int + m_Force: Vector2f + m_GameObject: PPtr[GameObject] + m_RelativeForce: Vector2f + m_Torque: float + +@define(kw_only=True, slots=False) +class PlayableDirector(Behaviour): + m_DirectorUpdateMode: int + m_Enabled: int + m_ExposedReferences: ExposedReferenceTable + m_GameObject: PPtr[GameObject] + m_InitialState: int + m_InitialTime: float + m_PlayableAsset: PPtr[Object] + m_SceneBindings: List[DirectorGenericBinding] + m_WrapMode: int + +@define(kw_only=True, slots=False) +class Projector(Behaviour): + m_AspectRatio: float + m_Enabled: int + m_FarClipPlane: float + m_FieldOfView: float + m_GameObject: PPtr[GameObject] + m_IgnoreLayers: BitField + m_Material: PPtr[Material] + m_NearClipPlane: float + m_Orthographic: bool + m_OrthographicSize: float + +@define(kw_only=True, slots=False) +class ReflectionProbe(Behaviour): + m_BackGroundColor: ColorRGBA + m_BakedTexture: PPtr[Texture] + m_BoxOffset: Vector3f + m_BoxProjection: bool + m_BoxSize: Vector3f + m_ClearFlags: int + m_CullingMask: BitField + m_CustomBakedTexture: PPtr[Texture] + m_Enabled: int + m_FarClip: float + m_GameObject: PPtr[GameObject] + m_HDR: bool + m_Importance: int + m_IntensityMultiplier: float + m_Mode: int + m_NearClip: float + m_RefreshMode: int + m_RenderDynamicObjects: bool + m_Resolution: int + m_ShadowDistance: float + m_TimeSlicingMode: int + m_Type: int + m_UpdateFrequency: int + m_UseOcclusionCulling: bool + m_BlendDistance: Optional[float] = None + +@define(kw_only=True, slots=False) +class Skybox(Behaviour): + m_CustomSkybox: PPtr[Material] + m_Enabled: int + m_GameObject: PPtr[GameObject] + +@define(kw_only=True, slots=False) +class SortingGroup(Behaviour): + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_SortingLayer: int + m_SortingOrder: int + m_SortAtRoot: Optional[bool] = None + m_SortingLayerID: Optional[int] = None + +@define(kw_only=True, slots=False) +class StreamingController(Behaviour): + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_StreamingMipmapBias: float + +@define(kw_only=True, slots=False) +class Terrain(Behaviour): + m_BakeLightProbesForTrees: bool + m_ChunkDynamicUVST: Vector4f + m_DetailObjectDensity: float + m_DetailObjectDistance: float + m_DrawHeightmap: bool + m_DrawTreesAndFoliage: bool + m_DynamicUVST: Vector4f + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_HeightmapMaximumLOD: int + m_HeightmapPixelError: float + m_LightmapIndex: int + m_LightmapIndexDynamic: int + m_LightmapTilingOffset: Vector4f + m_LightmapTilingOffsetDynamic: Vector4f + m_MaterialTemplate: PPtr[Material] + m_ReflectionProbeUsage: int + m_SplatMapDistance: float + m_TerrainData: PPtr[TerrainData] + m_TreeBillboardDistance: float + m_TreeCrossFadeLength: float + m_TreeDistance: float + m_TreeMaximumFullLODCount: int + m_AllowAutoConnect: Optional[bool] = None + m_CastShadows: Optional[bool] = None + m_DefaultSmoothness: Optional[float] = None + m_DrawInstanced: Optional[bool] = None + m_EnableHeightmapRayTracing: Optional[bool] = None + m_EnableTreesAndDetailsRayTracing: Optional[bool] = None + m_ExplicitProbeSetHash: Optional[Hash128] = None + m_GroupingID: Optional[int] = None + m_HeightmapMinimumLODSimplification: Optional[int] = None + m_IgnoreQualitySettings: Optional[bool] = None + m_LegacyShininess: Optional[float] = None + m_LegacySpecular: Optional[ColorRGBA] = None + m_MaterialType: Optional[int] = None + m_PreserveTreePrototypeLayers: Optional[bool] = None + m_RenderingLayerMask: Optional[int] = None + m_ShadowCastingMode: Optional[int] = None + m_StaticShadowCaster: Optional[bool] = None + m_TreeMotionVectorModeOverride: Optional[int] = None + m_UseDefaultSmoothness: Optional[bool] = None + +@define(kw_only=True, slots=False) +class VideoPlayer(Behaviour): + m_AspectRatio: int + m_AudioOutputMode: int + m_ControlledAudioTrackCount: int + m_DataSource: int + m_DirectAudioMutes: List[bool] + m_DirectAudioVolumes: List[float] + m_Enabled: int + m_EnabledAudioTracks: List[bool] + m_FrameReadyEventEnabled: bool + m_GameObject: PPtr[GameObject] + m_Looping: bool + m_PlayOnAwake: bool + m_PlaybackSpeed: float + m_RenderMode: int + m_SkipOnDrop: bool + m_TargetAudioSources: List[PPtr[AudioSource]] + m_TargetCamera: PPtr[Camera] + m_TargetCameraAlpha: float + m_TargetMaterialProperty: str + m_TargetMaterialRenderer: PPtr[Renderer] + m_TargetTexture: PPtr[RenderTexture] + m_Url: str + m_VideoClip: PPtr[VideoClip] + m_WaitForFirstFrame: bool + m_TargetCamera3DLayout: Optional[int] = None + m_TargetMaterialName: Optional[str] = None + m_TimeReference: Optional[int] = None + m_TimeUpdateMode: Optional[int] = None + m_VideoShaders: Optional[List[PPtr[Shader]]] = None + +@define(kw_only=True, slots=False) +class VisualEffect(Behaviour): + m_Asset: PPtr[VisualEffectAsset] + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_PropertySheet: VFXPropertySheetSerializedBase + m_ResetSeedOnPlay: Union[bool, int] + m_StartSeed: int + m_AllowInstancing: Optional[int] = None + m_InitialEventName: Optional[str] = None + m_InitialEventNameOverriden: Optional[int] = None + +@define(kw_only=True, slots=False) +class WindZone(Behaviour): + m_Enabled: int + m_GameObject: PPtr[GameObject] + m_Mode: int + m_Radius: float + m_WindMain: float + m_WindPulseFrequency: float + m_WindPulseMagnitude: float + m_WindTurbulence: float + +@define(kw_only=True, slots=False) +class CanvasRenderer(Component): + m_GameObject: PPtr[GameObject] + m_CullTransparentMesh: Optional[bool] = None + +@define(kw_only=True, slots=False) +class Collider(Component): + m_GameObject: Optional[PPtr[GameObject]] = None + m_MaxLimitX: Optional[float] = None + m_MaxLimitY: Optional[float] = None + m_MaxLimitZ: Optional[float] = None + m_MinLimitX: Optional[float] = None + m_Type: Optional[int] = None + m_X: Optional[xform] = None + m_XMotionType: Optional[int] = None + m_YMotionType: Optional[int] = None + m_ZMotionType: Optional[int] = None + +@define(kw_only=True, slots=False) +class BoxCollider(Collider): + m_Center: Vector3f + m_Enabled: bool + m_GameObject: PPtr[GameObject] + m_IsTrigger: bool + m_Material: Union[PPtr[PhysicMaterial], PPtr[PhysicsMaterial]] + m_Size: Vector3f + m_ExcludeLayers: Optional[BitField] = None + m_IncludeLayers: Optional[BitField] = None + m_LayerOverridePriority: Optional[int] = None + m_ProvidesContacts: Optional[bool] = None + +@define(kw_only=True, slots=False) +class CapsuleCollider(Collider): + m_Center: Vector3f + m_Direction: int + m_Enabled: bool + m_GameObject: PPtr[GameObject] + m_Height: float + m_IsTrigger: bool + m_Material: Union[PPtr[PhysicMaterial], PPtr[PhysicsMaterial]] + m_Radius: float + m_ExcludeLayers: Optional[BitField] = None + m_IncludeLayers: Optional[BitField] = None + m_LayerOverridePriority: Optional[int] = None + m_ProvidesContacts: Optional[bool] = None + +@define(kw_only=True, slots=False) +class CharacterController(Collider): + m_Center: Vector3f + m_GameObject: PPtr[GameObject] + m_Height: float + m_MinMoveDistance: float + m_Radius: float + m_SkinWidth: float + m_SlopeLimit: float + m_StepOffset: float + m_Enabled: Optional[bool] = None + m_ExcludeLayers: Optional[BitField] = None + m_IncludeLayers: Optional[BitField] = None + m_IsTrigger: Optional[bool] = None + m_LayerOverridePriority: Optional[int] = None + m_Material: Optional[Union[PPtr[PhysicMaterial], PPtr[PhysicsMaterial]]] = None + m_ProvidesContacts: Optional[bool] = None + +@define(kw_only=True, slots=False) +class MeshCollider(Collider): + m_Convex: bool + m_Enabled: bool + m_GameObject: PPtr[GameObject] + m_IsTrigger: bool + m_Material: Union[PPtr[PhysicMaterial], PPtr[PhysicsMaterial]] + m_Mesh: PPtr[Mesh] + m_CookingOptions: Optional[int] = None + m_ExcludeLayers: Optional[BitField] = None + m_IncludeLayers: Optional[BitField] = None + m_InflateMesh: Optional[bool] = None + m_LayerOverridePriority: Optional[int] = None + m_ProvidesContacts: Optional[bool] = None + m_SkinWidth: Optional[float] = None + m_SmoothSphereCollisions: Optional[bool] = None + +@define(kw_only=True, slots=False) +class RaycastCollider(Collider): + m_Center: Vector3f + m_Enabled: bool + m_GameObject: PPtr[GameObject] + m_IsTrigger: bool + m_Length: float + m_Material: PPtr[PhysicMaterial] + +@define(kw_only=True, slots=False) +class SphereCollider(Collider): + m_Center: Vector3f + m_Enabled: bool + m_GameObject: PPtr[GameObject] + m_IsTrigger: bool + m_Material: Union[PPtr[PhysicMaterial], PPtr[PhysicsMaterial]] + m_Radius: float + m_ExcludeLayers: Optional[BitField] = None + m_IncludeLayers: Optional[BitField] = None + m_LayerOverridePriority: Optional[int] = None + m_ProvidesContacts: Optional[bool] = None + +@define(kw_only=True, slots=False) +class TerrainCollider(Collider): + m_Enabled: bool + m_GameObject: PPtr[GameObject] + m_TerrainData: PPtr[TerrainData] + m_CreateTreeColliders: Optional[bool] = None + m_EnableTreeColliders: Optional[bool] = None + m_ExcludeLayers: Optional[BitField] = None + m_IncludeLayers: Optional[BitField] = None + m_IsTrigger: Optional[bool] = None + m_LayerOverridePriority: Optional[int] = None + m_Material: Optional[Union[PPtr[PhysicMaterial], PPtr[PhysicsMaterial]]] = None + m_ProvidesContacts: Optional[bool] = None + +@define(kw_only=True, slots=False) +class WheelCollider(Collider): + m_Center: Vector3f + m_ForwardFriction: WheelFrictionCurve + m_GameObject: PPtr[GameObject] + m_Mass: float + m_Radius: float + m_SidewaysFriction: WheelFrictionCurve + m_SuspensionDistance: float + m_SuspensionSpring: JointSpring + m_Enabled: Optional[bool] = None + m_ExcludeLayers: Optional[BitField] = None + m_ForceAppPointDistance: Optional[float] = None + m_IncludeLayers: Optional[BitField] = None + m_LayerOverridePriority: Optional[int] = None + m_ProvidesContacts: Optional[bool] = None + m_WheelDampingRate: Optional[float] = None + +@define(kw_only=True, slots=False) +class FakeComponent(Component): + m_GameObject: PPtr[GameObject] + +@define(kw_only=True, slots=False) +class Joint(Component): + m_GameObject: PPtr[GameObject] + +@define(kw_only=True, slots=False) +class CharacterJoint(Joint): + m_Anchor: Vector3f + m_Axis: Vector3f + m_BreakForce: float + m_BreakTorque: float + m_ConnectedBody: PPtr[Rigidbody] + m_GameObject: PPtr[GameObject] + m_HighTwistLimit: SoftJointLimit + m_LowTwistLimit: SoftJointLimit + m_Swing1Limit: SoftJointLimit + m_Swing2Limit: SoftJointLimit + m_SwingAxis: Vector3f + m_AutoConfigureConnectedAnchor: Optional[bool] = None + m_ConnectedAnchor: Optional[Vector3f] = None + m_ConnectedArticulationBody: Optional[PPtr[ArticulationBody]] = None + m_ConnectedMassScale: Optional[float] = None + m_EnableCollision: Optional[bool] = None + m_EnablePreprocessing: Optional[bool] = None + m_EnableProjection: Optional[bool] = None + m_Enabled: Optional[bool] = None + m_MassScale: Optional[float] = None + m_ProjectionAngle: Optional[float] = None + m_ProjectionDistance: Optional[float] = None + m_SwingLimitSpring: Optional[SoftJointLimitSpring] = None + m_TwistLimitSpring: Optional[SoftJointLimitSpring] = None + +@define(kw_only=True, slots=False) +class ConfigurableJoint(Joint): + m_Anchor: Vector3f + m_AngularXDrive: JointDrive + m_AngularXMotion: int + m_AngularYLimit: SoftJointLimit + m_AngularYMotion: int + m_AngularYZDrive: JointDrive + m_AngularZLimit: SoftJointLimit + m_AngularZMotion: int + m_Axis: Vector3f + m_BreakForce: float + m_BreakTorque: float + m_ConfiguredInWorldSpace: bool + m_ConnectedBody: PPtr[Rigidbody] + m_GameObject: PPtr[GameObject] + m_HighAngularXLimit: SoftJointLimit + m_LinearLimit: SoftJointLimit + m_LowAngularXLimit: SoftJointLimit + m_ProjectionAngle: float + m_ProjectionDistance: float + m_ProjectionMode: int + m_RotationDriveMode: int + m_SecondaryAxis: Vector3f + m_SlerpDrive: JointDrive + m_TargetAngularVelocity: Vector3f + m_TargetPosition: Vector3f + m_TargetRotation: Quaternionf + m_TargetVelocity: Vector3f + m_XDrive: JointDrive + m_XMotion: int + m_YDrive: JointDrive + m_YMotion: int + m_ZDrive: JointDrive + m_ZMotion: int + m_AngularXLimitSpring: Optional[SoftJointLimitSpring] = None + m_AngularYZLimitSpring: Optional[SoftJointLimitSpring] = None + m_AutoConfigureConnectedAnchor: Optional[bool] = None + m_ConnectedAnchor: Optional[Vector3f] = None + m_ConnectedArticulationBody: Optional[PPtr[ArticulationBody]] = None + m_ConnectedMassScale: Optional[float] = None + m_EnableCollision: Optional[bool] = None + m_EnablePreprocessing: Optional[bool] = None + m_Enabled: Optional[bool] = None + m_LinearLimitSpring: Optional[SoftJointLimitSpring] = None + m_MassScale: Optional[float] = None + m_SwapBodies: Optional[bool] = None + +@define(kw_only=True, slots=False) +class FixedJoint(Joint): + m_BreakForce: float + m_BreakTorque: float + m_ConnectedBody: PPtr[Rigidbody] + m_GameObject: PPtr[GameObject] + m_ConnectedArticulationBody: Optional[PPtr[ArticulationBody]] = None + m_ConnectedMassScale: Optional[float] = None + m_EnableCollision: Optional[bool] = None + m_EnablePreprocessing: Optional[bool] = None + m_Enabled: Optional[bool] = None + m_MassScale: Optional[float] = None + +@define(kw_only=True, slots=False) +class HingeJoint(Joint): + m_Anchor: Vector3f + m_Axis: Vector3f + m_BreakForce: float + m_BreakTorque: float + m_ConnectedBody: PPtr[Rigidbody] + m_GameObject: PPtr[GameObject] + m_Limits: JointLimits + m_Motor: JointMotor + m_Spring: JointSpring + m_UseLimits: bool + m_UseMotor: bool + m_UseSpring: bool + m_AutoConfigureConnectedAnchor: Optional[bool] = None + m_ConnectedAnchor: Optional[Vector3f] = None + m_ConnectedArticulationBody: Optional[PPtr[ArticulationBody]] = None + m_ConnectedMassScale: Optional[float] = None + m_EnableCollision: Optional[bool] = None + m_EnablePreprocessing: Optional[bool] = None + m_Enabled: Optional[bool] = None + m_ExtendedLimits: Optional[bool] = None + m_MassScale: Optional[float] = None + m_UseAcceleration: Optional[bool] = None + +@define(kw_only=True, slots=False) +class SpringJoint(Joint): + m_Anchor: Vector3f + m_BreakForce: float + m_BreakTorque: float + m_ConnectedBody: PPtr[Rigidbody] + m_Damper: float + m_GameObject: PPtr[GameObject] + m_MaxDistance: float + m_MinDistance: float + m_Spring: float + m_AutoConfigureConnectedAnchor: Optional[bool] = None + m_Axis: Optional[Vector3f] = None + m_ConnectedAnchor: Optional[Vector3f] = None + m_ConnectedArticulationBody: Optional[PPtr[ArticulationBody]] = None + m_ConnectedMassScale: Optional[float] = None + m_EnableCollision: Optional[bool] = None + m_EnablePreprocessing: Optional[bool] = None + m_Enabled: Optional[bool] = None + m_MassScale: Optional[float] = None + m_Tolerance: Optional[float] = None + +@define(kw_only=True, slots=False) +class LODGroup(Component): + m_Enabled: bool + m_GameObject: PPtr[GameObject] + m_LODs: List[LOD] + m_LocalReferencePoint: Vector3f + m_Size: float + m_AnimateCrossFading: Optional[bool] = None + m_FadeMode: Optional[int] = None + m_LastLODIsBillboard: Optional[bool] = None + m_ScreenRelativeTransitionHeight: Optional[float] = None + +@define(kw_only=True, slots=False) +class MeshFilter(Component): + m_GameObject: PPtr[GameObject] + m_Mesh: PPtr[Mesh] + +@define(kw_only=True, slots=False) +class MultiplayerRolesData(Component): + m_ComponentsRolesMasks: List[ObjectRolePair] + m_GameObject: PPtr[GameObject] + m_GameObjectRolesMask: int + +@define(kw_only=True, slots=False) +class OcclusionArea(Component): + m_Center: Vector3f + m_GameObject: PPtr[GameObject] + m_IsViewVolume: bool + m_Size: Vector3f + m_IsTargetVolume: Optional[bool] = None + m_TargetResolution: Optional[int] = None + +@define(kw_only=True, slots=False) +class OcclusionPortal(Component): + m_Center: Vector3f + m_GameObject: PPtr[GameObject] + m_Open: bool + m_Size: Vector3f + +@define(kw_only=True, slots=False) +class ParticleAnimator(Component): + Does_Animate_Color: bool + autodestruct: bool + colorAnimation_0_: ColorRGBA + colorAnimation_1_: ColorRGBA + colorAnimation_2_: ColorRGBA + colorAnimation_3_: ColorRGBA + colorAnimation_4_: ColorRGBA + damping: float + force: Vector3f + localRotationAxis: Vector3f + m_GameObject: PPtr[GameObject] + rndForce: Vector3f + sizeGrow: float + stopSimulation: bool + worldRotationAxis: Vector3f + +@define(kw_only=True, slots=False) +class ParticleEmitter(Component): + m_GameObject: PPtr[GameObject] + +@define(kw_only=True, slots=False) +class EllipsoidParticleEmitter(ParticleEmitter): + Simulate_in_Worldspace: bool + angularVelocity: float + emitterVelocityScale: float + localVelocity: Vector3f + m_Ellipsoid: Vector3f + m_Emit: bool + m_Enabled: bool + m_GameObject: PPtr[GameObject] + m_MinEmitterRange: float + m_OneShot: bool + maxEmission: float + maxEnergy: float + maxSize: float + minEmission: float + minEnergy: float + minSize: float + rndAngularVelocity: float + rndRotation: bool + rndVelocity: Vector3f + tangentVelocity: Vector3f + worldVelocity: Vector3f + +@define(kw_only=True, slots=False) +class MeshParticleEmitter(ParticleEmitter): + Simulate_in_Worldspace: bool + angularVelocity: float + emitterVelocityScale: float + localVelocity: Vector3f + m_Emit: bool + m_Enabled: bool + m_GameObject: PPtr[GameObject] + m_InterpolateTriangles: bool + m_MaxNormalVelocity: float + m_Mesh: PPtr[Mesh] + m_MinNormalVelocity: float + m_OneShot: bool + m_Systematic: bool + maxEmission: float + maxEnergy: float + maxSize: float + minEmission: float + minEnergy: float + minSize: float + rndAngularVelocity: float + rndRotation: bool + rndVelocity: Vector3f + tangentVelocity: Vector3f + worldVelocity: Vector3f + +@define(kw_only=True, slots=False) +class ParticleSystem(Component): + ClampVelocityModule: ClampVelocityModule + CollisionModule: CollisionModule + ColorBySpeedModule: ColorBySpeedModule + ColorModule: ColorModule + EmissionModule: EmissionModule + ForceModule: ForceModule + InitialModule: InitialModule + RotationBySpeedModule: RotationBySpeedModule + RotationModule: RotationModule + ShapeModule: ShapeModule + SizeBySpeedModule: SizeBySpeedModule + SizeModule: SizeModule + SubModule: SubModule + UVModule: UVModule + VelocityModule: VelocityModule + lengthInSec: float + looping: bool + m_GameObject: PPtr[GameObject] + moveWithTransform: Union[bool, int] + playOnAwake: bool + prewarm: bool + randomSeed: int + startDelay: Union[MinMaxCurve, float] + CustomDataModule: Optional[CustomDataModule] = None + ExternalForcesModule: Optional[ExternalForcesModule] = None + InheritVelocityModule: Optional[InheritVelocityModule] = None + LifetimeByEmitterSpeedModule: Optional[LifetimeByEmitterSpeedModule] = None + LightsModule: Optional[LightsModule] = None + NoiseModule: Optional[NoiseModule] = None + TrailModule: Optional[TrailModule] = None + TriggerModule: Optional[TriggerModule] = None + autoRandomSeed: Optional[bool] = None + cullingMode: Optional[int] = None + emitterVelocityMode: Optional[int] = None + moveWithCustomTransform: Optional[PPtr[Transform]] = None + ringBufferLoopRange: Optional[Vector2f] = None + ringBufferMode: Optional[int] = None + scalingMode: Optional[int] = None + simulationSpeed: Optional[float] = None + speed: Optional[float] = None + stopAction: Optional[int] = None + useRigidbodyForVelocity: Optional[bool] = None + useUnscaledTime: Optional[bool] = None + +@define(kw_only=True, slots=False) +class Pipeline(Component): + m_GameObject: PPtr[GameObject] + +@define(kw_only=True, slots=False) +class Renderer(Component): + m_GameObject: PPtr[GameObject] + +@define(kw_only=True, slots=False) +class BillboardRenderer(Renderer): + m_Billboard: PPtr[BillboardAsset] + m_CastShadows: int + m_Enabled: bool + m_GameObject: PPtr[GameObject] + m_LightmapIndex: int + m_LightmapIndexDynamic: int + m_LightmapTilingOffset: Vector4f + m_LightmapTilingOffsetDynamic: Vector4f + m_Materials: List[PPtr[Material]] + m_ProbeAnchor: PPtr[Transform] + m_ReceiveShadows: Union[bool, int] + m_ReflectionProbeUsage: int + m_SortingOrder: int + m_StaticBatchRoot: PPtr[Transform] + m_DynamicOccludee: Optional[int] = None + m_LightProbeUsage: Optional[int] = None + m_LightProbeVolumeOverride: Optional[PPtr[GameObject]] = None + m_MotionVectors: Optional[int] = None + m_RayTraceProcedural: Optional[int] = None + m_RayTracingAccelStructBuildFlags: Optional[int] = None + m_RayTracingAccelStructBuildFlagsOverride: Optional[int] = None + m_RayTracingMode: Optional[int] = None + m_RendererPriority: Optional[int] = None + m_RenderingLayerMask: Optional[int] = None + m_SmallMeshCulling: Optional[int] = None + m_SortingLayer: Optional[int] = None + m_SortingLayerID: Optional[int] = None + m_StaticBatchInfo: Optional[StaticBatchInfo] = None + m_StaticShadowCaster: Optional[int] = None + m_SubsetIndices: Optional[List[int]] = None + m_UseLightProbes: Optional[bool] = None + +@define(kw_only=True, slots=False) +class ClothRenderer(Renderer): + m_CastShadows: bool + m_Enabled: bool + m_GameObject: PPtr[GameObject] + m_LightmapIndex: int + m_LightmapTilingOffset: Vector4f + m_Materials: List[PPtr[Material]] + m_PauseWhenNotVisible: bool + m_ReceiveShadows: bool + m_StaticBatchRoot: PPtr[Transform] + m_SubsetIndices: List[int] + m_LightProbeAnchor: Optional[PPtr[Transform]] = None + m_SortingLayer: Optional[int] = None + m_SortingLayerID: Optional[int] = None + m_SortingOrder: Optional[int] = None + m_UseLightProbes: Optional[bool] = None + +@define(kw_only=True, slots=False) +class LineRenderer(Renderer): + m_CastShadows: Union[bool, int] + m_Enabled: bool + m_GameObject: PPtr[GameObject] + m_LightmapIndex: int + m_LightmapTilingOffset: Vector4f + m_Materials: List[PPtr[Material]] + m_Parameters: LineParameters + m_Positions: List[Vector3f] + m_ReceiveShadows: Union[bool, int] + m_StaticBatchRoot: PPtr[Transform] + m_UseWorldSpace: bool + m_ApplyActiveColorSpace: Optional[bool] = None + m_DynamicOccludee: Optional[int] = None + m_LightProbeAnchor: Optional[PPtr[Transform]] = None + m_LightProbeUsage: Optional[int] = None + m_LightProbeVolumeOverride: Optional[PPtr[GameObject]] = None + m_LightmapIndexDynamic: Optional[int] = None + m_LightmapTilingOffsetDynamic: Optional[Vector4f] = None + m_Loop: Optional[bool] = None + m_MaskInteraction: Optional[int] = None + m_MotionVectors: Optional[int] = None + m_ProbeAnchor: Optional[PPtr[Transform]] = None + m_RayTraceProcedural: Optional[int] = None + m_RayTracingAccelStructBuildFlags: Optional[int] = None + m_RayTracingAccelStructBuildFlagsOverride: Optional[int] = None + m_RayTracingMode: Optional[int] = None + m_ReflectionProbeUsage: Optional[int] = None + m_RendererPriority: Optional[int] = None + m_RenderingLayerMask: Optional[int] = None + m_SmallMeshCulling: Optional[int] = None + m_SortingLayer: Optional[int] = None + m_SortingLayerID: Optional[int] = None + m_SortingOrder: Optional[int] = None + m_StaticBatchInfo: Optional[StaticBatchInfo] = None + m_StaticShadowCaster: Optional[int] = None + m_SubsetIndices: Optional[List[int]] = None + m_UseLightProbes: Optional[bool] = None + +@define(kw_only=True, slots=False) +class RendererFake(LineRenderer): + m_CastShadows: int + m_DynamicOccludee: int + m_Enabled: bool + m_GameObject: PPtr[GameObject] + m_LightProbeUsage: int + m_LightProbeVolumeOverride: PPtr[GameObject] + m_LightmapIndex: int + m_LightmapIndexDynamic: int + m_LightmapTilingOffset: Vector4f + m_LightmapTilingOffsetDynamic: Vector4f + m_Loop: bool + m_Materials: List[PPtr[Material]] + m_MotionVectors: int + m_Parameters: LineParameters + m_Positions: List[Vector3f] + m_ProbeAnchor: PPtr[Transform] + m_ReceiveShadows: int + m_ReflectionProbeUsage: int + m_RendererPriority: int + m_RenderingLayerMask: int + m_SortingLayer: int + m_SortingLayerID: int + m_SortingOrder: int + m_StaticBatchInfo: StaticBatchInfo + m_StaticBatchRoot: PPtr[Transform] + m_UseWorldSpace: bool + m_RayTraceProcedural: Optional[int] = None + m_RayTracingMode: Optional[int] = None + +@define(kw_only=True, slots=False) +class MeshRenderer(Renderer): + m_CastShadows: Union[bool, int] + m_Enabled: bool + m_GameObject: PPtr[GameObject] + m_LightmapIndex: int + m_LightmapTilingOffset: Vector4f + m_Materials: List[PPtr[Material]] + m_ReceiveShadows: Union[bool, int] + m_StaticBatchRoot: PPtr[Transform] + m_AdditionalVertexStreams: Optional[PPtr[Mesh]] = None + m_DynamicOccludee: Optional[int] = None + m_EnlightenVertexStream: Optional[PPtr[Mesh]] = None + m_LightProbeAnchor: Optional[PPtr[Transform]] = None + m_LightProbeUsage: Optional[int] = None + m_LightProbeVolumeOverride: Optional[PPtr[GameObject]] = None + m_LightmapIndexDynamic: Optional[int] = None + m_LightmapTilingOffsetDynamic: Optional[Vector4f] = None + m_MotionVectors: Optional[int] = None + m_ProbeAnchor: Optional[PPtr[Transform]] = None + m_RayTraceProcedural: Optional[int] = None + m_RayTracingAccelStructBuildFlags: Optional[int] = None + m_RayTracingAccelStructBuildFlagsOverride: Optional[int] = None + m_RayTracingMode: Optional[int] = None + m_ReflectionProbeUsage: Optional[int] = None + m_RendererPriority: Optional[int] = None + m_RenderingLayerMask: Optional[int] = None + m_SmallMeshCulling: Optional[int] = None + m_SortingLayer: Optional[int] = None + m_SortingLayerID: Optional[int] = None + m_SortingOrder: Optional[int] = None + m_StaticBatchInfo: Optional[StaticBatchInfo] = None + m_StaticShadowCaster: Optional[int] = None + m_SubsetIndices: Optional[List[int]] = None + m_UseLightProbes: Optional[bool] = None + +@define(kw_only=True, slots=False) +class ParticleRenderer(Renderer): + UV_Animation: UVAnimation + m_CameraVelocityScale: float + m_CastShadows: Union[bool, int] + m_Enabled: bool + m_GameObject: PPtr[GameObject] + m_LengthScale: float + m_LightmapIndex: int + m_LightmapTilingOffset: Vector4f + m_Materials: List[PPtr[Material]] + m_MaxParticleSize: float + m_ReceiveShadows: Union[bool, int] + m_StaticBatchRoot: PPtr[Transform] + m_StretchParticles: int + m_VelocityScale: float + m_DynamicOccludee: Optional[int] = None + m_LightProbeAnchor: Optional[PPtr[Transform]] = None + m_LightProbeUsage: Optional[int] = None + m_LightProbeVolumeOverride: Optional[PPtr[GameObject]] = None + m_LightmapIndexDynamic: Optional[int] = None + m_LightmapTilingOffsetDynamic: Optional[Vector4f] = None + m_MotionVectors: Optional[int] = None + m_ProbeAnchor: Optional[PPtr[Transform]] = None + m_ReflectionProbeUsage: Optional[int] = None + m_RenderingLayerMask: Optional[int] = None + m_SortingLayer: Optional[int] = None + m_SortingLayerID: Optional[int] = None + m_SortingOrder: Optional[int] = None + m_StaticBatchInfo: Optional[StaticBatchInfo] = None + m_SubsetIndices: Optional[List[int]] = None + m_UseLightProbes: Optional[bool] = None + +@define(kw_only=True, slots=False) +class ParticleSystemRenderer(Renderer): + m_CameraVelocityScale: float + m_CastShadows: Union[bool, int] + m_Enabled: bool + m_GameObject: PPtr[GameObject] + m_LengthScale: float + m_LightmapIndex: int + m_LightmapTilingOffset: Vector4f + m_Materials: List[PPtr[Material]] + m_MaxParticleSize: float + m_Mesh: PPtr[Mesh] + m_ReceiveShadows: Union[bool, int] + m_RenderMode: int + m_SortMode: int + m_SortingFudge: float + m_StaticBatchRoot: PPtr[Transform] + m_VelocityScale: float + m_AllowRoll: Optional[bool] = None + m_ApplyActiveColorSpace: Optional[bool] = None + m_DynamicOccludee: Optional[int] = None + m_EnableGPUInstancing: Optional[bool] = None + m_Flip: Optional[Vector3f] = None + m_FreeformStretching: Optional[bool] = None + m_LightProbeAnchor: Optional[PPtr[Transform]] = None + m_LightProbeUsage: Optional[int] = None + m_LightProbeVolumeOverride: Optional[PPtr[GameObject]] = None + m_LightmapIndexDynamic: Optional[int] = None + m_LightmapTilingOffsetDynamic: Optional[Vector4f] = None + m_MaskInteraction: Optional[int] = None + m_Mesh1: Optional[PPtr[Mesh]] = None + m_Mesh2: Optional[PPtr[Mesh]] = None + m_Mesh3: Optional[PPtr[Mesh]] = None + m_MeshDistribution: Optional[int] = None + m_MeshWeighting: Optional[float] = None + m_MeshWeighting1: Optional[float] = None + m_MeshWeighting2: Optional[float] = None + m_MeshWeighting3: Optional[float] = None + m_MinParticleSize: Optional[float] = None + m_MotionVectors: Optional[int] = None + m_NormalDirection: Optional[float] = None + m_Pivot: Optional[Vector3f] = None + m_ProbeAnchor: Optional[PPtr[Transform]] = None + m_RayTraceProcedural: Optional[int] = None + m_RayTracingAccelStructBuildFlags: Optional[int] = None + m_RayTracingAccelStructBuildFlagsOverride: Optional[int] = None + m_RayTracingMode: Optional[int] = None + m_ReflectionProbeUsage: Optional[int] = None + m_RenderAlignment: Optional[int] = None + m_RendererPriority: Optional[int] = None + m_RenderingLayerMask: Optional[int] = None + m_RotateWithStretchDirection: Optional[bool] = None + m_ShadowBias: Optional[float] = None + m_SmallMeshCulling: Optional[int] = None + m_SortingLayer: Optional[int] = None + m_SortingLayerID: Optional[int] = None + m_SortingOrder: Optional[int] = None + m_StaticBatchInfo: Optional[StaticBatchInfo] = None + m_StaticShadowCaster: Optional[int] = None + m_SubsetIndices: Optional[List[int]] = None + m_TrailVertexStreams: Optional[List[int]] = None + m_UseCustomTrailVertexStreams: Optional[bool] = None + m_UseCustomVertexStreams: Optional[bool] = None + m_UseLightProbes: Optional[bool] = None + m_VertexStreamMask: Optional[int] = None + m_VertexStreams: Optional[List[int]] = None + +@define(kw_only=True, slots=False) +class SkinnedMeshRenderer(Renderer): + m_AABB: AABB + m_Bones: List[PPtr[Transform]] + m_CastShadows: Union[bool, int] + m_DirtyAABB: bool + m_Enabled: bool + m_GameObject: PPtr[GameObject] + m_LightmapIndex: int + m_LightmapTilingOffset: Vector4f + m_Materials: List[PPtr[Material]] + m_Mesh: PPtr[Mesh] + m_Quality: int + m_ReceiveShadows: Union[bool, int] + m_StaticBatchRoot: PPtr[Transform] + m_UpdateWhenOffscreen: bool + m_BlendShapeWeights: Optional[List[float]] = None + m_DynamicOccludee: Optional[int] = None + m_LightProbeAnchor: Optional[PPtr[Transform]] = None + m_LightProbeUsage: Optional[int] = None + m_LightProbeVolumeOverride: Optional[PPtr[GameObject]] = None + m_LightmapIndexDynamic: Optional[int] = None + m_LightmapTilingOffsetDynamic: Optional[Vector4f] = None + m_MotionVectors: Optional[int] = None + m_ProbeAnchor: Optional[PPtr[Transform]] = None + m_RayTraceProcedural: Optional[int] = None + m_RayTracingAccelStructBuildFlags: Optional[int] = None + m_RayTracingAccelStructBuildFlagsOverride: Optional[int] = None + m_RayTracingMode: Optional[int] = None + m_ReflectionProbeUsage: Optional[int] = None + m_RendererPriority: Optional[int] = None + m_RenderingLayerMask: Optional[int] = None + m_RootBone: Optional[PPtr[Transform]] = None + m_SkinnedMotionVectors: Optional[bool] = None + m_SmallMeshCulling: Optional[int] = None + m_SortingLayer: Optional[int] = None + m_SortingLayerID: Optional[int] = None + m_SortingOrder: Optional[int] = None + m_StaticBatchInfo: Optional[StaticBatchInfo] = None + m_StaticShadowCaster: Optional[int] = None + m_SubsetIndices: Optional[List[int]] = None + m_UseLightProbes: Optional[bool] = None + +@define(kw_only=True, slots=False) +class SpriteMask(Renderer): + m_BackSortingLayer: int + m_BackSortingOrder: int + m_CastShadows: int + m_Enabled: bool + m_FrontSortingLayer: int + m_FrontSortingOrder: int + m_GameObject: PPtr[GameObject] + m_IsCustomRangeActive: bool + m_LightProbeUsage: int + m_LightProbeVolumeOverride: PPtr[GameObject] + m_LightmapIndex: int + m_LightmapIndexDynamic: int + m_LightmapTilingOffset: Vector4f + m_LightmapTilingOffsetDynamic: Vector4f + m_MaskAlphaCutoff: float + m_Materials: List[PPtr[Material]] + m_MotionVectors: int + m_ProbeAnchor: PPtr[Transform] + m_ReceiveShadows: int + m_ReflectionProbeUsage: int + m_SortingLayer: int + m_SortingLayerID: int + m_SortingOrder: int + m_Sprite: PPtr[Sprite] + m_StaticBatchInfo: StaticBatchInfo + m_StaticBatchRoot: PPtr[Transform] + m_BackSortingLayerID: Optional[int] = None + m_DynamicOccludee: Optional[int] = None + m_FrontSortingLayerID: Optional[int] = None + m_MaskSource: Optional[int] = None + m_RayTraceProcedural: Optional[int] = None + m_RayTracingAccelStructBuildFlags: Optional[int] = None + m_RayTracingAccelStructBuildFlagsOverride: Optional[int] = None + m_RayTracingMode: Optional[int] = None + m_RendererPriority: Optional[int] = None + m_RenderingLayerMask: Optional[int] = None + m_SmallMeshCulling: Optional[int] = None + m_SpriteSortPoint: Optional[int] = None + m_StaticShadowCaster: Optional[int] = None + +@define(kw_only=True, slots=False) +class SpriteRenderer(Renderer): + m_CastShadows: Union[bool, int] + m_Color: ColorRGBA + m_Enabled: bool + m_GameObject: PPtr[GameObject] + m_LightmapIndex: int + m_LightmapTilingOffset: Vector4f + m_Materials: List[PPtr[Material]] + m_ReceiveShadows: Union[bool, int] + m_SortingOrder: int + m_Sprite: PPtr[Sprite] + m_StaticBatchRoot: PPtr[Transform] + m_AdaptiveModeThreshold: Optional[float] = None + m_DrawMode: Optional[int] = None + m_DynamicOccludee: Optional[int] = None + m_FlipX: Optional[bool] = None + m_FlipY: Optional[bool] = None + m_LightProbeAnchor: Optional[PPtr[Transform]] = None + m_LightProbeUsage: Optional[int] = None + m_LightProbeVolumeOverride: Optional[PPtr[GameObject]] = None + m_LightmapIndexDynamic: Optional[int] = None + m_LightmapTilingOffsetDynamic: Optional[Vector4f] = None + m_MaskInteraction: Optional[int] = None + m_MotionVectors: Optional[int] = None + m_ProbeAnchor: Optional[PPtr[Transform]] = None + m_RayTraceProcedural: Optional[int] = None + m_RayTracingAccelStructBuildFlags: Optional[int] = None + m_RayTracingAccelStructBuildFlagsOverride: Optional[int] = None + m_RayTracingMode: Optional[int] = None + m_ReflectionProbeUsage: Optional[int] = None + m_RendererPriority: Optional[int] = None + m_RenderingLayerMask: Optional[int] = None + m_Size: Optional[Vector2f] = None + m_SmallMeshCulling: Optional[int] = None + m_SortingLayer: Optional[int] = None + m_SortingLayerID: Optional[int] = None + m_SpriteSortPoint: Optional[int] = None + m_SpriteTileMode: Optional[int] = None + m_StaticBatchInfo: Optional[StaticBatchInfo] = None + m_StaticShadowCaster: Optional[int] = None + m_SubsetIndices: Optional[List[int]] = None + m_UseLightProbes: Optional[bool] = None + m_WasSpriteAssigned: Optional[bool] = None + +@define(kw_only=True, slots=False) +class SpriteShapeRenderer(Renderer): + m_CastShadows: int + m_Color: ColorRGBA + m_DynamicOccludee: int + m_Enabled: bool + m_GameObject: PPtr[GameObject] + m_LightProbeUsage: int + m_LightProbeVolumeOverride: PPtr[GameObject] + m_LightmapIndex: int + m_LightmapIndexDynamic: int + m_LightmapTilingOffset: Vector4f + m_LightmapTilingOffsetDynamic: Vector4f + m_LocalAABB: AABB + m_MaskInteraction: int + m_Materials: List[PPtr[Material]] + m_MotionVectors: int + m_ProbeAnchor: PPtr[Transform] + m_ReceiveShadows: int + m_ReflectionProbeUsage: int + m_RenderingLayerMask: int + m_ShapeTexture: PPtr[Texture2D] + m_SortingLayer: int + m_SortingLayerID: int + m_SortingOrder: int + m_Sprites: List[PPtr[Sprite]] + m_StaticBatchInfo: StaticBatchInfo + m_StaticBatchRoot: PPtr[Transform] + m_RayTraceProcedural: Optional[int] = None + m_RayTracingAccelStructBuildFlags: Optional[int] = None + m_RayTracingAccelStructBuildFlagsOverride: Optional[int] = None + m_RayTracingMode: Optional[int] = None + m_RendererPriority: Optional[int] = None + m_SmallMeshCulling: Optional[int] = None + m_SpriteSortPoint: Optional[int] = None + m_StaticShadowCaster: Optional[int] = None + +@define(kw_only=True, slots=False) +class TilemapRenderer(Renderer): + m_CastShadows: int + m_ChunkSize: int3_storage + m_DynamicOccludee: int + m_Enabled: bool + m_GameObject: PPtr[GameObject] + m_LightProbeUsage: int + m_LightProbeVolumeOverride: PPtr[GameObject] + m_LightmapIndex: int + m_LightmapIndexDynamic: int + m_LightmapTilingOffset: Vector4f + m_LightmapTilingOffsetDynamic: Vector4f + m_MaskInteraction: int + m_Materials: List[PPtr[Material]] + m_MaxChunkCount: int + m_MaxFrameAge: int + m_MotionVectors: int + m_ProbeAnchor: PPtr[Transform] + m_ReceiveShadows: int + m_ReflectionProbeUsage: int + m_SortOrder: int + m_SortingLayer: int + m_SortingLayerID: int + m_SortingOrder: int + m_StaticBatchInfo: StaticBatchInfo + m_StaticBatchRoot: PPtr[Transform] + m_ChunkCullingBounds: Optional[Vector3f] = None + m_DetectChunkCullingBounds: Optional[int] = None + m_Mode: Optional[int] = None + m_RayTraceProcedural: Optional[int] = None + m_RayTracingAccelStructBuildFlags: Optional[int] = None + m_RayTracingAccelStructBuildFlagsOverride: Optional[int] = None + m_RayTracingMode: Optional[int] = None + m_RendererPriority: Optional[int] = None + m_RenderingLayerMask: Optional[int] = None + m_SmallMeshCulling: Optional[int] = None + m_StaticShadowCaster: Optional[int] = None + +@define(kw_only=True, slots=False) +class TrailRenderer(Renderer): + m_Autodestruct: bool + m_CastShadows: Union[bool, int] + m_Enabled: bool + m_GameObject: PPtr[GameObject] + m_LightmapIndex: int + m_LightmapTilingOffset: Vector4f + m_Materials: List[PPtr[Material]] + m_MinVertexDistance: float + m_ReceiveShadows: Union[bool, int] + m_StaticBatchRoot: PPtr[Transform] + m_Time: float + m_ApplyActiveColorSpace: Optional[bool] = None + m_Colors: Optional[Gradient] = None + m_DynamicOccludee: Optional[int] = None + m_Emitting: Optional[bool] = None + m_EndWidth: Optional[float] = None + m_LightProbeAnchor: Optional[PPtr[Transform]] = None + m_LightProbeUsage: Optional[int] = None + m_LightProbeVolumeOverride: Optional[PPtr[GameObject]] = None + m_LightmapIndexDynamic: Optional[int] = None + m_LightmapTilingOffsetDynamic: Optional[Vector4f] = None + m_MaskInteraction: Optional[int] = None + m_MotionVectors: Optional[int] = None + m_Parameters: Optional[LineParameters] = None + m_ProbeAnchor: Optional[PPtr[Transform]] = None + m_RayTraceProcedural: Optional[int] = None + m_RayTracingAccelStructBuildFlags: Optional[int] = None + m_RayTracingAccelStructBuildFlagsOverride: Optional[int] = None + m_RayTracingMode: Optional[int] = None + m_ReflectionProbeUsage: Optional[int] = None + m_RendererPriority: Optional[int] = None + m_RenderingLayerMask: Optional[int] = None + m_SmallMeshCulling: Optional[int] = None + m_SortingLayer: Optional[int] = None + m_SortingLayerID: Optional[int] = None + m_SortingOrder: Optional[int] = None + m_StartWidth: Optional[float] = None + m_StaticBatchInfo: Optional[StaticBatchInfo] = None + m_StaticShadowCaster: Optional[int] = None + m_SubsetIndices: Optional[List[int]] = None + m_UseLightProbes: Optional[bool] = None + +@define(kw_only=True, slots=False) +class UIRenderer(Renderer): + m_GameObject: PPtr[GameObject] + m_CastShadows: Optional[int] = None + m_DynamicOccludee: Optional[int] = None + m_Enabled: Optional[bool] = None + m_LightProbeUsage: Optional[int] = None + m_LightProbeVolumeOverride: Optional[PPtr[GameObject]] = None + m_LightmapIndex: Optional[int] = None + m_LightmapIndexDynamic: Optional[int] = None + m_LightmapTilingOffset: Optional[Vector4f] = None + m_LightmapTilingOffsetDynamic: Optional[Vector4f] = None + m_Materials: Optional[List[PPtr[Material]]] = None + m_MotionVectors: Optional[int] = None + m_ProbeAnchor: Optional[PPtr[Transform]] = None + m_RayTraceProcedural: Optional[int] = None + m_RayTracingAccelStructBuildFlags: Optional[int] = None + m_RayTracingAccelStructBuildFlagsOverride: Optional[int] = None + m_RayTracingMode: Optional[int] = None + m_ReceiveShadows: Optional[int] = None + m_ReflectionProbeUsage: Optional[int] = None + m_RendererPriority: Optional[int] = None + m_RenderingLayerMask: Optional[int] = None + m_SmallMeshCulling: Optional[int] = None + m_SortingLayer: Optional[int] = None + m_SortingLayerID: Optional[int] = None + m_SortingOrder: Optional[int] = None + m_StaticBatchInfo: Optional[StaticBatchInfo] = None + m_StaticBatchRoot: Optional[PPtr[Transform]] = None + m_StaticShadowCaster: Optional[int] = None + +@define(kw_only=True, slots=False) +class VFXRenderer(Renderer): + m_CastShadows: int + m_DynamicOccludee: int + m_Enabled: bool + m_GameObject: PPtr[GameObject] + m_LightProbeUsage: int + m_LightProbeVolumeOverride: PPtr[GameObject] + m_LightmapIndex: int + m_LightmapIndexDynamic: int + m_LightmapTilingOffset: Vector4f + m_LightmapTilingOffsetDynamic: Vector4f + m_MotionVectors: int + m_ProbeAnchor: PPtr[Transform] + m_ReceiveShadows: int + m_ReflectionProbeUsage: int + m_RendererPriority: int + m_RenderingLayerMask: int + m_SortingLayer: int + m_SortingLayerID: int + m_SortingOrder: int + m_StaticBatchInfo: StaticBatchInfo + m_StaticBatchRoot: PPtr[Transform] + m_Materials: Optional[List[PPtr[Material]]] = None + m_RayTraceProcedural: Optional[int] = None + m_RayTracingAccelStructBuildFlags: Optional[int] = None + m_RayTracingAccelStructBuildFlagsOverride: Optional[int] = None + m_RayTracingMode: Optional[int] = None + m_SmallMeshCulling: Optional[int] = None + m_StaticShadowCaster: Optional[int] = None + +@define(kw_only=True, slots=False) +class Rigidbody(Component): + m_AngularDrag: float + m_CollisionDetection: int + m_Constraints: int + m_Drag: float + m_GameObject: PPtr[GameObject] + m_Interpolate: int + m_IsKinematic: bool + m_Mass: float + m_UseGravity: bool + m_CenterOfMass: Optional[Vector3f] = None + m_ExcludeLayers: Optional[BitField] = None + m_ImplicitCom: Optional[bool] = None + m_ImplicitTensor: Optional[bool] = None + m_IncludeLayers: Optional[BitField] = None + m_InertiaRotation: Optional[Quaternionf] = None + m_InertiaTensor: Optional[Vector3f] = None + +@define(kw_only=True, slots=False) +class Rigidbody2D(Component): + m_CollisionDetection: int + m_GameObject: PPtr[GameObject] + m_GravityScale: float + m_Interpolate: int + m_Mass: float + m_SleepingMode: int + m_AngularDamping: Optional[float] = None + m_AngularDrag: Optional[float] = None + m_BodyType: Optional[int] = None + m_Constraints: Optional[int] = None + m_ExcludeLayers: Optional[BitField] = None + m_FixedAngle: Optional[bool] = None + m_IncludeLayers: Optional[BitField] = None + m_IsKinematic: Optional[bool] = None + m_LinearDamping: Optional[float] = None + m_LinearDrag: Optional[float] = None + m_Material: Optional[PPtr[PhysicsMaterial2D]] = None + m_Simulated: Optional[bool] = None + m_UseAutoMass: Optional[bool] = None + m_UseFullKinematicContacts: Optional[bool] = None + +@define(kw_only=True, slots=False) +class TextMesh(Component): + m_Alignment: int + m_Anchor: int + m_CharacterSize: float + m_Font: PPtr[Font] + m_FontSize: int + m_FontStyle: int + m_GameObject: PPtr[GameObject] + m_LineSpacing: float + m_OffsetZ: float + m_TabSize: float + m_Text: str + m_Color: Optional[ColorRGBA] = None + m_RichText: Optional[bool] = None + +@define(kw_only=True, slots=False) +class Transform(Component): + m_Children: List[PPtr[Transform]] + m_Father: PPtr[Transform] + m_GameObject: PPtr[GameObject] + m_LocalPosition: Vector3f + m_LocalRotation: Quaternionf + m_LocalScale: Vector3f + +@define(kw_only=True, slots=False) +class RectTransform(Transform): + m_AnchorMax: Vector2f + m_AnchorMin: Vector2f + m_GameObject: PPtr[GameObject] + m_Pivot: Vector2f + m_SizeDelta: Vector2f + m_AnchoredPosition: Optional[Vector2f] = None + m_Children: Optional[List[PPtr[Transform]]] = None + m_Father: Optional[PPtr[Transform]] = None + m_LocalPosition: Optional[Vector3f] = None + m_LocalRotation: Optional[Quaternionf] = None + m_LocalScale: Optional[Vector3f] = None + m_Position: Optional[Vector2f] = None + +@define(kw_only=True, slots=False) +class Tree(Component): + m_GameObject: PPtr[GameObject] + m_SpeedTreeWindAsset: Optional[PPtr[SpeedTreeWindAsset]] = None + +@define(kw_only=True, slots=False) +class WorldAnchor(Component): + m_GameObject: PPtr[GameObject] + +@define(kw_only=True, slots=False) +class WorldParticleCollider(Component): + m_BounceFactor: float + m_CollidesWith: BitField + m_CollisionEnergyLoss: float + m_GameObject: PPtr[GameObject] + m_MinKillVelocity: float + m_SendCollisionMessage: bool + +@define(kw_only=True, slots=False) +class GameObject(EditorExtension): + m_Component: Union[List[ComponentPair], List[Tuple[int, PPtr[Component]]]] + m_IsActive: Union[bool, int] + m_Layer: int + m_Name: str + m_Tag: int + +@define(kw_only=True, slots=False) +class NamedObject(EditorExtension, ABC): + pass + +@define(kw_only=True, slots=False) +class AnimatorState(NamedObject): + m_CycleOffset: float + m_IKOnFeet: bool + m_Mirror: bool + m_Motion: PPtr[Motion] + m_Name: str + m_Position: Vector3f + m_Speed: float + m_StateMachineBehaviours: List[PPtr[MonoBehaviour]] + m_Tag: str + m_Transitions: List[PPtr[AnimatorStateTransition]] + m_WriteDefaultValues: bool + m_CycleOffsetParameter: Optional[str] = None + m_CycleOffsetParameterActive: Optional[bool] = None + m_MirrorParameter: Optional[str] = None + m_MirrorParameterActive: Optional[bool] = None + m_SpeedParameter: Optional[str] = None + m_SpeedParameterActive: Optional[bool] = None + m_TimeParameter: Optional[str] = None + m_TimeParameterActive: Optional[bool] = None + +@define(kw_only=True, slots=False) +class AnimatorStateMachine(NamedObject): + m_AnyStatePosition: Vector3f + m_AnyStateTransitions: List[PPtr[AnimatorStateTransition]] + m_ChildStateMachines: List[ChildAnimatorStateMachine] + m_ChildStates: List[ChildAnimatorState] + m_DefaultState: PPtr[AnimatorState] + m_EntryPosition: Vector3f + m_EntryTransitions: List[PPtr[AnimatorTransition]] + m_ExitPosition: Vector3f + m_Name: str + m_ParentStateMachinePosition: Vector3f + m_StateMachineBehaviours: List[PPtr[MonoBehaviour]] + m_StateMachineTransitions: List[Tuple[PPtr[AnimatorStateMachine], List[PPtr[AnimatorTransition]]]] + +@define(kw_only=True, slots=False) +class AnimatorTransitionBase(NamedObject): + m_Conditions: List[AnimatorCondition] + m_DstState: PPtr[AnimatorState] + m_DstStateMachine: PPtr[AnimatorStateMachine] + m_IsExit: bool + m_Mute: bool + m_Name: str + m_Solo: bool + +@define(kw_only=True, slots=False) +class AnimatorStateTransition(AnimatorTransitionBase): + m_CanTransitionToSelf: bool + m_Conditions: List[AnimatorCondition] + m_DstState: PPtr[AnimatorState] + m_DstStateMachine: PPtr[AnimatorStateMachine] + m_ExitTime: float + m_HasExitTime: bool + m_InterruptionSource: int + m_IsExit: bool + m_Mute: bool + m_Name: str + m_OrderedInterruption: bool + m_Solo: bool + m_TransitionDuration: float + m_TransitionOffset: float + m_HasFixedDuration: Optional[bool] = None + +@define(kw_only=True, slots=False) +class AnimatorTransition(AnimatorTransitionBase): + m_Conditions: List[AnimatorCondition] + m_DstState: PPtr[AnimatorState] + m_DstStateMachine: PPtr[AnimatorStateMachine] + m_IsExit: bool + m_Mute: bool + m_Name: str + m_Solo: bool + +@define(kw_only=True, slots=False) +class AssetBundle(NamedObject): + m_Container: List[Tuple[str, AssetInfo]] + m_MainAsset: AssetInfo + m_Name: str + m_PreloadTable: List[PPtr[Object]] + m_AssetBundleName: Optional[str] = None + m_ClassCompatibility: Optional[List[Tuple[int, int]]] = None + m_ClassVersionMap: Optional[List[Tuple[int, int]]] = None + m_Dependencies: Optional[List[str]] = None + m_ExplicitDataLayout: Optional[int] = None + m_IsStreamedSceneAssetBundle: Optional[bool] = None + m_PathFlags: Optional[int] = None + m_RuntimeCompatibility: Optional[int] = None + m_SceneHashes: Optional[List[Tuple[str, str]]] = None + m_ScriptCompatibility: Optional[List[AssetBundleScriptInfo]] = None + +@define(kw_only=True, slots=False) +class AssetBundleManifest(NamedObject): + AssetBundleInfos: List[Tuple[int, AssetBundleInfo]] + AssetBundleNames: List[Tuple[int, str]] + AssetBundlesWithVariant: List[int] + m_Name: str + +@define(kw_only=True, slots=False) +class AssetImportInProgressProxy(NamedObject): + m_Name: str + +@define(kw_only=True, slots=False) +class AssetImporter(NamedObject, ABC): + pass + +@define(kw_only=True, slots=False) +class ASTCImporter(AssetImporter): + m_AssetBundleName: str + m_AssetBundleVariant: str + m_Name: str + m_UserData: str + +@define(kw_only=True, slots=False) +class AndroidAssetPackImporter(AssetImporter): + m_AssetBundleName: str + m_AssetBundleVariant: str + m_ExternalObjects: List[Tuple[SourceAssetIdentifier, PPtr[Object]]] + m_Name: str + m_UsedFileIDs: List[int] + m_UserData: str + +@define(kw_only=True, slots=False) +class AssemblyDefinitionImporter(AssetImporter): + m_AssetBundleName: str + m_AssetBundleVariant: str + m_ExternalObjects: List[Tuple[SourceAssetIdentifier, PPtr[Object]]] + m_Name: str + m_UserData: str + m_UsedFileIDs: Optional[List[int]] = None + +@define(kw_only=True, slots=False) +class AssemblyDefinitionReferenceImporter(AssetImporter): + m_AssetBundleName: str + m_AssetBundleVariant: str + m_ExternalObjects: List[Tuple[SourceAssetIdentifier, PPtr[Object]]] + m_Name: str + m_UsedFileIDs: List[int] + m_UserData: str + +@define(kw_only=True, slots=False) +class AudioImporter(AssetImporter): + m_3D: bool + m_ForceToMono: bool + m_Name: str + audio_preview_data: Optional[bytes] = None + m_Ambisonic: Optional[bool] = None + m_AssetBundleName: Optional[str] = None + m_AssetBundleVariant: Optional[str] = None + m_DefaultSettings: Optional[SampleSettings] = None + m_ExternalObjects: Optional[List[Tuple[SourceAssetIdentifier, PPtr[Object]]]] = None + m_FileIDToRecycleName: Optional[List[Tuple[int, str]]] = None + m_Format: Optional[int] = None + m_LoadInBackground: Optional[bool] = None + m_Loopable: Optional[bool] = None + m_NewHashIdentity: Optional[MdFour] = None + m_Normalize: Optional[bool] = None + m_OldHashIdentity: Optional[MdFour] = None + m_Output: Optional[Union[AudioImporterOutput, Output]] = None + m_PlatformSettingOverrides: Optional[Union[List[Tuple[str, SampleSettings]], List[Tuple[int, SampleSettings]]]] = None + m_PreloadAudioData: Optional[bool] = None + m_PreviewData: Optional[PreviewData] = None + m_PreviewDataLength: Optional[int] = None + m_Quality: Optional[float] = None + m_Stream: Optional[int] = None + m_UseHardware: Optional[bool] = None + m_UsedFileIDs: Optional[List[int]] = None + m_UserData: Optional[str] = None + +@define(kw_only=True, slots=False) +class BuildArchiveImporter(AssetImporter): + m_AssetBundleName: str + m_AssetBundleVariant: str + m_ExternalObjects: List[Tuple[SourceAssetIdentifier, PPtr[Object]]] + m_Name: str + m_UsedFileIDs: List[int] + m_UserData: str + +@define(kw_only=True, slots=False) +class BuildInstructionImporter(AssetImporter): + m_AssetBundleName: str + m_AssetBundleVariant: str + m_ExternalObjects: List[Tuple[SourceAssetIdentifier, PPtr[Object]]] + m_Name: str + m_UsedFileIDs: List[int] + m_UserData: str + +@define(kw_only=True, slots=False) +class BuildMetaDataImporter(AssetImporter): + m_AssetBundleName: str + m_AssetBundleVariant: str + m_ExternalObjects: List[Tuple[SourceAssetIdentifier, PPtr[Object]]] + m_Name: str + m_UsedFileIDs: List[int] + m_UserData: str + +@define(kw_only=True, slots=False) +class C4DImporter(AssetImporter): + m_AssetBundleName: str + m_AssetBundleVariant: str + m_ExternalObjects: List[Tuple[SourceAssetIdentifier, PPtr[Object]]] + m_Name: str + m_UsedFileIDs: List[int] + m_UserData: str + +@define(kw_only=True, slots=False) +class ComputeShaderImporter(AssetImporter): + m_Name: str + m_UserData: str + m_AssetBundleName: Optional[str] = None + m_AssetBundleVariant: Optional[str] = None + m_CurrentAPIMask: Optional[int] = None + m_CurrentBuildTarget: Optional[int] = None + m_ExternalObjects: Optional[List[Tuple[SourceAssetIdentifier, PPtr[Object]]]] = None + m_PreprocessorOverride: Optional[int] = None + m_UsedFileIDs: Optional[List[int]] = None + +@define(kw_only=True, slots=False) +class DDSImporter(AssetImporter): + m_Name: str + m_AssetBundleName: Optional[str] = None + m_AssetBundleVariant: Optional[str] = None + m_FileIDToRecycleName: Optional[List[Tuple[int, str]]] = None + m_IsReadable: Optional[bool] = None + m_NewHashIdentity: Optional[MdFour] = None + m_OldHashIdentity: Optional[MdFour] = None + m_UserData: Optional[str] = None + +@define(kw_only=True, slots=False) +class DefaultImporter(AssetImporter): + m_Name: str + m_AssetBundleName: Optional[str] = None + m_AssetBundleVariant: Optional[str] = None + m_ExternalObjects: Optional[List[Tuple[SourceAssetIdentifier, PPtr[Object]]]] = None + m_FileIDToRecycleName: Optional[List[Tuple[int, str]]] = None + m_NewHashIdentity: Optional[MdFour] = None + m_OldHashIdentity: Optional[MdFour] = None + m_UsedFileIDs: Optional[List[int]] = None + m_UserData: Optional[str] = None + +@define(kw_only=True, slots=False) +class IHVImageFormatImporter(AssetImporter): + m_AssetBundleName: str + m_AssetBundleVariant: str + m_IsReadable: bool + m_Name: str + m_TextureSettings: GLTextureSettings + m_UserData: str + m_ExternalObjects: Optional[List[Tuple[SourceAssetIdentifier, PPtr[Object]]]] = None + m_IgnoreMipmapLimit: Optional[bool] = None + m_MipmapLimitGroupName: Optional[str] = None + m_StreamingMipmaps: Optional[bool] = None + m_StreamingMipmapsPriority: Optional[int] = None + m_UsedFileIDs: Optional[List[int]] = None + m_sRGBTexture: Optional[bool] = None + +@define(kw_only=True, slots=False) +class KTXImporter(AssetImporter): + m_AssetBundleName: str + m_AssetBundleVariant: str + m_Name: str + m_UserData: str + +@define(kw_only=True, slots=False) +class LibraryAssetImporter(AssetImporter): + m_Name: str + m_AssetBundleName: Optional[str] = None + m_AssetBundleVariant: Optional[str] = None + m_ExternalObjects: Optional[List[Tuple[SourceAssetIdentifier, PPtr[Object]]]] = None + m_FileIDToRecycleName: Optional[List[Tuple[int, str]]] = None + m_NewHashIdentity: Optional[MdFour] = None + m_OldHashIdentity: Optional[MdFour] = None + m_UsedFileIDs: Optional[List[int]] = None + m_UserData: Optional[str] = None + +@define(kw_only=True, slots=False) +class LocalizationImporter(AssetImporter): + m_AssetBundleName: str + m_AssetBundleVariant: str + m_ExternalObjects: List[Tuple[SourceAssetIdentifier, PPtr[Object]]] + m_Name: str + m_UserData: str + m_UsedFileIDs: Optional[List[int]] = None + +@define(kw_only=True, slots=False) +class ModelImporter(AssetImporter, ABC): + pass + +@define(kw_only=True, slots=False) +class FBXImporter(ModelImporter): + m_AddColliders: bool + m_AnimationCompression: int + m_AnimationPositionError: float + m_AnimationRotationError: float + m_AnimationScaleError: float + m_AnimationWrapMode: int + m_BakeSimulation: bool + m_ClipAnimations: List[ClipAnimationInfo] + m_GlobalScale: float + m_HasExtraRoot: bool + m_ImportedRoots: List[PPtr[GameObject]] + m_MeshCompression: int + m_Name: str + m_UseFileUnits: bool + normalSmoothAngle: float + bakeAxisConversion: Optional[bool] = None + blendShapeNormalImportMode: Optional[int] = None + generateSecondaryUV: Optional[bool] = None + indexFormat: Optional[int] = None + keepQuads: Optional[bool] = None + legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: Optional[bool] = None + m_AddHumanoidExtraRootOnlyWhenUsingAvatar: Optional[bool] = None + m_AdditionalBone: Optional[bool] = None + m_AnimationDoRetargetingWarnings: Optional[bool] = None + m_AnimationImportErrors: Optional[str] = None + m_AnimationImportWarnings: Optional[str] = None + m_AnimationRetargetingWarnings: Optional[str] = None + m_AnimationType: Optional[int] = None + m_AssetBundleName: Optional[str] = None + m_AssetBundleVariant: Optional[str] = None + m_AutoGenerateAvatarMappingIfUnspecified: Optional[bool] = None + m_AutoMapExternalMaterials: Optional[bool] = None + m_AvatarSetup: Optional[int] = None + m_ContainsAnimation: Optional[bool] = None + m_CopyAvatar: Optional[bool] = None + m_ExternalObjects: Optional[List[Tuple[SourceAssetIdentifier, PPtr[Object]]]] = None + m_ExtraExposedTransformPaths: Optional[List[str]] = None + m_ExtraUserProperties: Optional[List[str]] = None + m_FileIDToRecycleName: Optional[List[Tuple[int, str]]] = None + m_FileIdsGeneration: Optional[int] = None + m_FileScale: Optional[float] = None + m_FileScaleFactor: Optional[float] = None + m_FileScaleUnit: Optional[str] = None + m_FirstImportVersion: Optional[int] = None + m_GenerateAnimations: Optional[int] = None + m_GenerateMaterials: Optional[int] = None + m_HasEmbeddedTextures: Optional[bool] = None + m_HasPreviousCalculatedGlobalScale: Optional[bool] = None + m_HumanDescription: Optional[HumanDescription] = None + m_HumanoidOversampling: Optional[int] = None + m_ImportAnimatedCustomProperties: Optional[bool] = None + m_ImportAnimation: Optional[bool] = None + m_ImportBlendShapeDeformPercent: Optional[bool] = None + m_ImportBlendShapes: Optional[bool] = None + m_ImportCameras: Optional[bool] = None + m_ImportConstraints: Optional[bool] = None + m_ImportLights: Optional[bool] = None + m_ImportMaterials: Optional[bool] = None + m_ImportPhysicalCameras: Optional[bool] = None + m_ImportVisibility: Optional[bool] = None + m_ImportedTakeInfos: Optional[List[TakeInfo]] = None + m_InternalIDToNameTable: Optional[List[Tuple[Tuple[int, int], str]]] = None + m_IsReadable: Optional[bool] = None + m_LODScreenPercentages: Optional[List[float]] = None + m_LastHumanDescriptionAvatarSource: Optional[PPtr[Avatar]] = None + m_LegacyGenerateAnimations: Optional[int] = None + m_MaterialImportMode: Optional[int] = None + m_MaterialLocation: Optional[int] = None + m_MaterialName: Optional[int] = None + m_MaterialSearch: Optional[int] = None + m_Materials: Optional[List[SourceAssetIdentifier]] = None + m_MeshSettings_generateSecondaryUV: Optional[bool] = None + m_MeshSettings_normalImportMode: Optional[int] = None + m_MeshSettings_secondaryUVAngleDistortion: Optional[float] = None + m_MeshSettings_secondaryUVAreaDistortion: Optional[float] = None + m_MeshSettings_secondaryUVHardAngle: Optional[float] = None + m_MeshSettings_secondaryUVPackMargin: Optional[float] = None + m_MeshSettings_swapUVChannels: Optional[bool] = None + m_MeshSettings_tangentImportMode: Optional[int] = None + m_MotionNodeName: Optional[str] = None + m_NewHashIdentity: Optional[MdFour] = None + m_NodeNameCollisionStrategy: Optional[int] = None + m_OldHashIdentity: Optional[MdFour] = None + m_OptimizeGameObjects: Optional[bool] = None + m_PreserveHierarchy: Optional[bool] = None + m_PreviousCalculatedGlobalScale: Optional[float] = None + m_ReferencedClips: Optional[List[GUID]] = None + m_RemapMaterialsIfMaterialImportModeIsNone: Optional[bool] = None + m_RemoveConstantScaleCurves: Optional[bool] = None + m_ResampleCurves: Optional[bool] = None + m_ResampleRotations: Optional[bool] = None + m_RigImportErrors: Optional[str] = None + m_RigImportWarnings: Optional[str] = None + m_SortHierarchyByName: Optional[bool] = None + m_SplitAnimations: Optional[bool] = None + m_StrictVertexDataChecks: Optional[bool] = None + m_SupportsEmbeddedMaterials: Optional[bool] = None + m_UseFileScale: Optional[bool] = None + m_UseSRGBMaterialColor: Optional[bool] = None + m_UsedFileIDs: Optional[List[int]] = None + m_UserData: Optional[str] = None + maxBonesPerVertex: Optional[int] = None + meshOptimizationFlags: Optional[int] = None + minBoneWeight: Optional[float] = None + normalCalculationMode: Optional[int] = None + normalImportMode: Optional[int] = None + normalSmoothingSource: Optional[int] = None + optimizeBones: Optional[bool] = None + optimizeMesh: Optional[bool] = None + optimizeMeshForGPU: Optional[bool] = None + secondaryUVAngleDistortion: Optional[float] = None + secondaryUVAreaDistortion: Optional[float] = None + secondaryUVHardAngle: Optional[float] = None + secondaryUVMarginMethod: Optional[int] = None + secondaryUVMinLightmapResolution: Optional[float] = None + secondaryUVMinObjectScale: Optional[float] = None + secondaryUVPackMargin: Optional[float] = None + skinWeightsMode: Optional[int] = None + splitTangentsAcrossUV: Optional[bool] = None + swapUVChannels: Optional[bool] = None + tangentImportMode: Optional[int] = None + weldVertices: Optional[bool] = None + +@define(kw_only=True, slots=False) +class Mesh3DSImporter(ModelImporter): + m_AddColliders: bool + m_AnimationCompression: int + m_AnimationPositionError: float + m_AnimationRotationError: float + m_AnimationScaleError: float + m_AnimationWrapMode: int + m_BakeSimulation: bool + m_ClipAnimations: List[ClipAnimationInfo] + m_GlobalScale: float + m_HasExtraRoot: bool + m_ImportedRoots: List[PPtr[GameObject]] + m_MeshCompression: int + m_Name: str + m_UseFileUnits: bool + normalSmoothAngle: float + bakeAxisConversion: Optional[bool] = None + blendShapeNormalImportMode: Optional[int] = None + generateSecondaryUV: Optional[bool] = None + indexFormat: Optional[int] = None + keepQuads: Optional[bool] = None + legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: Optional[bool] = None + m_AddHumanoidExtraRootOnlyWhenUsingAvatar: Optional[bool] = None + m_AdditionalBone: Optional[bool] = None + m_AnimationDoRetargetingWarnings: Optional[bool] = None + m_AnimationImportErrors: Optional[str] = None + m_AnimationImportWarnings: Optional[str] = None + m_AnimationRetargetingWarnings: Optional[str] = None + m_AnimationType: Optional[int] = None + m_AssetBundleName: Optional[str] = None + m_AssetBundleVariant: Optional[str] = None + m_AutoGenerateAvatarMappingIfUnspecified: Optional[bool] = None + m_AutoMapExternalMaterials: Optional[bool] = None + m_AvatarSetup: Optional[int] = None + m_ContainsAnimation: Optional[bool] = None + m_CopyAvatar: Optional[bool] = None + m_ExternalObjects: Optional[List[Tuple[SourceAssetIdentifier, PPtr[Object]]]] = None + m_ExtraExposedTransformPaths: Optional[List[str]] = None + m_ExtraUserProperties: Optional[List[str]] = None + m_FileIDToRecycleName: Optional[List[Tuple[int, str]]] = None + m_FileIdsGeneration: Optional[int] = None + m_FileScale: Optional[float] = None + m_FileScaleFactor: Optional[float] = None + m_FileScaleUnit: Optional[str] = None + m_FirstImportVersion: Optional[int] = None + m_GenerateAnimations: Optional[int] = None + m_GenerateMaterials: Optional[int] = None + m_HasEmbeddedTextures: Optional[bool] = None + m_HasPreviousCalculatedGlobalScale: Optional[bool] = None + m_HumanDescription: Optional[HumanDescription] = None + m_HumanoidOversampling: Optional[int] = None + m_ImportAnimatedCustomProperties: Optional[bool] = None + m_ImportAnimation: Optional[bool] = None + m_ImportBlendShapeDeformPercent: Optional[bool] = None + m_ImportBlendShapes: Optional[bool] = None + m_ImportCameras: Optional[bool] = None + m_ImportConstraints: Optional[bool] = None + m_ImportLights: Optional[bool] = None + m_ImportMaterials: Optional[bool] = None + m_ImportPhysicalCameras: Optional[bool] = None + m_ImportVisibility: Optional[bool] = None + m_ImportedTakeInfos: Optional[List[TakeInfo]] = None + m_InternalIDToNameTable: Optional[List[Tuple[Tuple[int, int], str]]] = None + m_IsReadable: Optional[bool] = None + m_LODScreenPercentages: Optional[List[float]] = None + m_LastHumanDescriptionAvatarSource: Optional[PPtr[Avatar]] = None + m_LegacyGenerateAnimations: Optional[int] = None + m_MaterialImportMode: Optional[int] = None + m_MaterialLocation: Optional[int] = None + m_MaterialName: Optional[int] = None + m_MaterialSearch: Optional[int] = None + m_Materials: Optional[List[SourceAssetIdentifier]] = None + m_MeshSettings_generateSecondaryUV: Optional[bool] = None + m_MeshSettings_normalImportMode: Optional[int] = None + m_MeshSettings_secondaryUVAngleDistortion: Optional[float] = None + m_MeshSettings_secondaryUVAreaDistortion: Optional[float] = None + m_MeshSettings_secondaryUVHardAngle: Optional[float] = None + m_MeshSettings_secondaryUVPackMargin: Optional[float] = None + m_MeshSettings_swapUVChannels: Optional[bool] = None + m_MeshSettings_tangentImportMode: Optional[int] = None + m_MotionNodeName: Optional[str] = None + m_NewHashIdentity: Optional[MdFour] = None + m_NodeNameCollisionStrategy: Optional[int] = None + m_OldHashIdentity: Optional[MdFour] = None + m_OptimizeGameObjects: Optional[bool] = None + m_PreserveHierarchy: Optional[bool] = None + m_PreviousCalculatedGlobalScale: Optional[float] = None + m_ReferencedClips: Optional[List[GUID]] = None + m_RemapMaterialsIfMaterialImportModeIsNone: Optional[bool] = None + m_RemoveConstantScaleCurves: Optional[bool] = None + m_ResampleCurves: Optional[bool] = None + m_ResampleRotations: Optional[bool] = None + m_RigImportErrors: Optional[str] = None + m_RigImportWarnings: Optional[str] = None + m_SortHierarchyByName: Optional[bool] = None + m_SplitAnimations: Optional[bool] = None + m_StrictVertexDataChecks: Optional[bool] = None + m_SupportsEmbeddedMaterials: Optional[bool] = None + m_UseFileScale: Optional[bool] = None + m_UseSRGBMaterialColor: Optional[bool] = None + m_UsedFileIDs: Optional[List[int]] = None + m_UserData: Optional[str] = None + maxBonesPerVertex: Optional[int] = None + meshOptimizationFlags: Optional[int] = None + minBoneWeight: Optional[float] = None + normalCalculationMode: Optional[int] = None + normalImportMode: Optional[int] = None + normalSmoothingSource: Optional[int] = None + optimizeBones: Optional[bool] = None + optimizeMesh: Optional[bool] = None + optimizeMeshForGPU: Optional[bool] = None + secondaryUVAngleDistortion: Optional[float] = None + secondaryUVAreaDistortion: Optional[float] = None + secondaryUVHardAngle: Optional[float] = None + secondaryUVMarginMethod: Optional[int] = None + secondaryUVMinLightmapResolution: Optional[float] = None + secondaryUVMinObjectScale: Optional[float] = None + secondaryUVPackMargin: Optional[float] = None + skinWeightsMode: Optional[int] = None + splitTangentsAcrossUV: Optional[bool] = None + swapUVChannels: Optional[bool] = None + tangentImportMode: Optional[int] = None + weldVertices: Optional[bool] = None + +@define(kw_only=True, slots=False) +class SketchUpImporter(ModelImporter): + generateSecondaryUV: bool + keepQuads: bool + m_AddColliders: bool + m_AdditionalBone: bool + m_AnimationCompression: int + m_AnimationDoRetargetingWarnings: bool + m_AnimationImportErrors: str + m_AnimationImportWarnings: str + m_AnimationPositionError: float + m_AnimationRetargetingWarnings: str + m_AnimationRotationError: float + m_AnimationScaleError: float + m_AnimationType: int + m_AnimationWrapMode: int + m_AssetBundleName: str + m_AssetBundleVariant: str + m_AssetHash: Hash128 + m_BakeSimulation: bool + m_ClipAnimations: List[ClipAnimationInfo] + m_ExtraExposedTransformPaths: List[str] + m_FileScale: float + m_FileUnit: int + m_GenerateBackFace: bool + m_GlobalScale: float + m_HasExtraRoot: bool + m_HumanDescription: HumanDescription + m_ImportAnimation: bool + m_ImportBlendShapes: bool + m_ImportedRoots: List[PPtr[GameObject]] + m_ImportedTakeInfos: List[TakeInfo] + m_IsReadable: bool + m_LODScreenPercentages: List[float] + m_LastHumanDescriptionAvatarSource: PPtr[Avatar] + m_Latitude: float + m_LegacyGenerateAnimations: int + m_Longitude: float + m_MaterialName: int + m_MaterialSearch: int + m_MergeCoplanarFaces: bool + m_MeshCompression: int + m_MotionNodeName: str + m_Name: str + m_NorthCorrection: float + m_OptimizeGameObjects: bool + m_ReferencedClips: List[GUID] + m_SelectedNodes: List[int] + m_SketchUpImportData: SketchUpImportData + m_UseFileScale: bool + m_UseFileUnits: bool + m_UserData: str + normalImportMode: int + normalSmoothAngle: float + secondaryUVAngleDistortion: float + secondaryUVAreaDistortion: float + secondaryUVHardAngle: float + secondaryUVPackMargin: float + swapUVChannels: bool + tangentImportMode: int + weldVertices: bool + bakeAxisConversion: Optional[bool] = None + blendShapeNormalImportMode: Optional[int] = None + indexFormat: Optional[int] = None + legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: Optional[bool] = None + m_AddHumanoidExtraRootOnlyWhenUsingAvatar: Optional[bool] = None + m_AutoGenerateAvatarMappingIfUnspecified: Optional[bool] = None + m_AutoMapExternalMaterials: Optional[bool] = None + m_AvatarSetup: Optional[int] = None + m_ContainsAnimation: Optional[bool] = None + m_CopyAvatar: Optional[bool] = None + m_ExternalObjects: Optional[List[Tuple[SourceAssetIdentifier, PPtr[Object]]]] = None + m_ExtraUserProperties: Optional[List[str]] = None + m_FileIDToRecycleName: Optional[List[Tuple[int, str]]] = None + m_FileIdsGeneration: Optional[int] = None + m_FileScaleFactor: Optional[float] = None + m_FileScaleUnit: Optional[str] = None + m_HasEmbeddedTextures: Optional[bool] = None + m_HasPreviousCalculatedGlobalScale: Optional[bool] = None + m_HumanoidOversampling: Optional[int] = None + m_ImportAnimatedCustomProperties: Optional[bool] = None + m_ImportBlendShapeDeformPercent: Optional[bool] = None + m_ImportCameras: Optional[bool] = None + m_ImportConstraints: Optional[bool] = None + m_ImportLights: Optional[bool] = None + m_ImportMaterials: Optional[bool] = None + m_ImportPhysicalCameras: Optional[bool] = None + m_ImportVisibility: Optional[bool] = None + m_InternalIDToNameTable: Optional[List[Tuple[Tuple[int, int], str]]] = None + m_MaterialImportMode: Optional[int] = None + m_MaterialLocation: Optional[int] = None + m_Materials: Optional[List[SourceAssetIdentifier]] = None + m_NodeNameCollisionStrategy: Optional[int] = None + m_PreserveHierarchy: Optional[bool] = None + m_PreviousCalculatedGlobalScale: Optional[float] = None + m_RemapMaterialsIfMaterialImportModeIsNone: Optional[bool] = None + m_RemoveConstantScaleCurves: Optional[bool] = None + m_ResampleCurves: Optional[bool] = None + m_ResampleRotations: Optional[bool] = None + m_RigImportErrors: Optional[str] = None + m_RigImportWarnings: Optional[str] = None + m_SortHierarchyByName: Optional[bool] = None + m_StrictVertexDataChecks: Optional[bool] = None + m_SupportsEmbeddedMaterials: Optional[bool] = None + m_UseSRGBMaterialColor: Optional[bool] = None + m_UsedFileIDs: Optional[List[int]] = None + maxBonesPerVertex: Optional[int] = None + meshOptimizationFlags: Optional[int] = None + minBoneWeight: Optional[float] = None + normalCalculationMode: Optional[int] = None + normalSmoothingSource: Optional[int] = None + optimizeBones: Optional[bool] = None + optimizeMeshForGPU: Optional[bool] = None + secondaryUVMarginMethod: Optional[int] = None + secondaryUVMinLightmapResolution: Optional[float] = None + secondaryUVMinObjectScale: Optional[float] = None + skinWeightsMode: Optional[int] = None + splitTangentsAcrossUV: Optional[bool] = None + +@define(kw_only=True, slots=False) +class MonoImporter(AssetImporter): + executionOrder: int + icon: PPtr[Texture2D] + m_DefaultReferences: List[Tuple[str, PPtr[Object]]] + m_Name: str + m_AssetBundleName: Optional[str] = None + m_AssetBundleVariant: Optional[str] = None + m_ExternalObjects: Optional[List[Tuple[SourceAssetIdentifier, PPtr[Object]]]] = None + m_FileIDToRecycleName: Optional[List[Tuple[int, str]]] = None + m_NewHashIdentity: Optional[MdFour] = None + m_OldHashIdentity: Optional[MdFour] = None + m_UsedFileIDs: Optional[List[int]] = None + m_UserData: Optional[str] = None + +@define(kw_only=True, slots=False) +class MovieImporter(AssetImporter): + m_Name: str + m_Quality: float + m_AssetBundleName: Optional[str] = None + m_AssetBundleVariant: Optional[str] = None + m_ExternalObjects: Optional[List[Tuple[SourceAssetIdentifier, PPtr[Object]]]] = None + m_FileIDToRecycleName: Optional[List[Tuple[int, str]]] = None + m_LinearTexture: Optional[bool] = None + m_NewHashIdentity: Optional[MdFour] = None + m_OldHashIdentity: Optional[MdFour] = None + m_UsedFileIDs: Optional[List[int]] = None + m_UserData: Optional[str] = None + +@define(kw_only=True, slots=False) +class MultiArtifactTestImporter(AssetImporter): + m_AssetBundleName: str + m_AssetBundleVariant: str + m_ExternalObjects: List[Tuple[SourceAssetIdentifier, PPtr[Object]]] + m_Name: str + m_UsedFileIDs: List[int] + m_UserData: str + +@define(kw_only=True, slots=False) +class NativeFormatImporter(AssetImporter): + m_Name: str + m_AssetBundleName: Optional[str] = None + m_AssetBundleVariant: Optional[str] = None + m_ExternalObjects: Optional[List[Tuple[SourceAssetIdentifier, PPtr[Object]]]] = None + m_FileIDToRecycleName: Optional[List[Tuple[int, str]]] = None + m_MainObjectFileID: Optional[int] = None + m_NewHashIdentity: Optional[MdFour] = None + m_OldHashIdentity: Optional[MdFour] = None + m_UsedFileIDs: Optional[List[int]] = None + m_UserData: Optional[str] = None + +@define(kw_only=True, slots=False) +class PVRImporter(AssetImporter): + m_Name: str + m_AssetBundleName: Optional[str] = None + m_AssetBundleVariant: Optional[str] = None + m_FileIDToRecycleName: Optional[List[Tuple[int, str]]] = None + m_NewHashIdentity: Optional[MdFour] = None + m_OldHashIdentity: Optional[MdFour] = None + m_UserData: Optional[str] = None + +@define(kw_only=True, slots=False) +class PackageManifestImporter(AssetImporter): + m_AssetBundleName: str + m_AssetBundleVariant: str + m_ExternalObjects: List[Tuple[SourceAssetIdentifier, PPtr[Object]]] + m_Name: str + m_UsedFileIDs: List[int] + m_UserData: str + +@define(kw_only=True, slots=False) +class PluginImporter(AssetImporter): + m_AssetBundleName: str + m_AssetBundleVariant: str + m_ExecutionOrder: List[Tuple[str, int]] + m_IconMap: List[Tuple[str, PPtr[Texture2D]]] + m_IsPreloaded: bool + m_Name: str + m_Output: PluginImportOutput + m_PlatformData: Union[List[Tuple[str, PlatformSettingsData]], List[Tuple[Tuple[str, str], PlatformSettingsData]]] + m_UserData: str + m_DefineConstraints: Optional[List[str]] = None + m_ExternalObjects: Optional[List[Tuple[SourceAssetIdentifier, PPtr[Object]]]] = None + m_IsExplicitlyReferenced: Optional[bool] = None + m_IsOverridable: Optional[bool] = None + m_UsedFileIDs: Optional[List[int]] = None + m_ValidateReferences: Optional[bool] = None + +@define(kw_only=True, slots=False) +class PrefabImporter(AssetImporter): + m_AddedObjectFileIDs: List[int] + m_AssetBundleName: str + m_AssetBundleVariant: str + m_ExternalObjects: List[Tuple[SourceAssetIdentifier, PPtr[Object]]] + m_IsPrefabVariant: bool + m_Name: str + m_UserData: str + m_UnableToImportOnPreviousDomainReload: Optional[bool] = None + m_UsedFileIDs: Optional[List[int]] = None + m_VariantParentGUID: Optional[GUID] = None + +@define(kw_only=True, slots=False) +class PreviewImporter(AssetImporter): + m_AssetBundleName: str + m_AssetBundleVariant: str + m_ExternalObjects: List[Tuple[SourceAssetIdentifier, PPtr[Object]]] + m_Name: str + m_UsedFileIDs: List[int] + m_UserData: str + +@define(kw_only=True, slots=False) +class RayTracingShaderImporter(AssetImporter): + m_AssetBundleName: str + m_AssetBundleVariant: str + m_ExternalObjects: List[Tuple[SourceAssetIdentifier, PPtr[Object]]] + m_Name: str + m_UsedFileIDs: List[int] + m_UserData: str + m_CurrentAPIMask: Optional[int] = None + +@define(kw_only=True, slots=False) +class ReferencesArtifactGenerator(AssetImporter): + m_AssetBundleName: str + m_AssetBundleVariant: str + m_ExternalObjects: List[Tuple[SourceAssetIdentifier, PPtr[Object]]] + m_Name: str + m_UsedFileIDs: List[int] + m_UserData: str + +@define(kw_only=True, slots=False) +class RoslynAdditionalFileImporter(AssetImporter): + m_AssetBundleName: str + m_AssetBundleVariant: str + m_ExternalObjects: List[Tuple[SourceAssetIdentifier, PPtr[Object]]] + m_Name: str + m_UsedFileIDs: List[int] + m_UserData: str + +@define(kw_only=True, slots=False) +class RoslynAnalyzerConfigImporter(AssetImporter): + m_AssetBundleName: str + m_AssetBundleVariant: str + m_ExternalObjects: List[Tuple[SourceAssetIdentifier, PPtr[Object]]] + m_Name: str + m_UsedFileIDs: List[int] + m_UserData: str + +@define(kw_only=True, slots=False) +class RuleSetFileImporter(AssetImporter): + m_AssetBundleName: str + m_AssetBundleVariant: str + m_ExternalObjects: List[Tuple[SourceAssetIdentifier, PPtr[Object]]] + m_Name: str + m_UsedFileIDs: List[int] + m_UserData: str + +@define(kw_only=True, slots=False) +class ScriptedImporter(AssetImporter): + m_AssetBundleName: str + m_AssetBundleVariant: str + m_Name: str + m_Script: PPtr[MonoScript] + m_UserData: str + m_ExternalObjects: Optional[List[Tuple[SourceAssetIdentifier, PPtr[Object]]]] = None + m_FileIDToRecycleName: Optional[List[Tuple[int, str]]] = None + m_InternalIDToNameTable: Optional[List[Tuple[Tuple[int, int], str]]] = None + m_UsedFileIDs: Optional[List[int]] = None + +@define(kw_only=True, slots=False) +class ShaderImporter(AssetImporter): + m_Name: str + m_AssetBundleName: Optional[str] = None + m_AssetBundleVariant: Optional[str] = None + m_DefaultTextures: Optional[List[Tuple[str, PPtr[Texture]]]] = None + m_ExternalObjects: Optional[List[Tuple[SourceAssetIdentifier, PPtr[Object]]]] = None + m_FileIDToRecycleName: Optional[List[Tuple[int, str]]] = None + m_NewHashIdentity: Optional[MdFour] = None + m_NonModifiableTextures: Optional[List[Tuple[str, PPtr[Texture]]]] = None + m_OldHashIdentity: Optional[MdFour] = None + m_PreprocessorOverride: Optional[int] = None + m_UsedFileIDs: Optional[List[int]] = None + m_UserData: Optional[str] = None + +@define(kw_only=True, slots=False) +class ShaderIncludeImporter(AssetImporter): + m_AssetBundleName: str + m_AssetBundleVariant: str + m_ExternalObjects: List[Tuple[SourceAssetIdentifier, PPtr[Object]]] + m_Name: str + m_UsedFileIDs: List[int] + m_UserData: str + +@define(kw_only=True, slots=False) +class SpeedTreeImporter(AssetImporter): + m_AlphaTestRef: float + m_AssetBundleName: str + m_AssetBundleVariant: str + m_BestWindQuality: int + m_BillboardTransitionCrossFadeWidth: float + m_EnableSmoothLODTransition: bool + m_FadeOutWidth: float + m_HasBillboard: bool + m_HueVariation: ColorRGBA + m_LODSettings: List[PerLODSettings] + m_MainColor: ColorRGBA + m_Name: str + m_ScaleFactor: float + m_UserData: str + m_AnimateCrossFading: Optional[bool] = None + m_EnableBumpMapping: Optional[bool] = None + m_EnableHueVariation: Optional[bool] = None + m_EnableLightProbes: Optional[bool] = None + m_EnableShadowCasting: Optional[bool] = None + m_EnableShadowReceiving: Optional[bool] = None + m_EnableSubsurfaceScattering: Optional[bool] = None + m_ExternalObjects: Optional[List[Tuple[SourceAssetIdentifier, PPtr[Object]]]] = None + m_FileIDType: Optional[int] = None + m_GenerateColliders: Optional[bool] = None + m_GenerateRigidbody: Optional[bool] = None + m_MaterialLocation: Optional[int] = None + m_MaterialVersion: Optional[int] = None + m_Materials: Optional[List[SourceAssetIdentifier]] = None + m_MotionVectorModeEnumValue: Optional[int] = None + m_ReflectionProbeEnumValue: Optional[int] = None + m_SelectedWindQuality: Optional[int] = None + m_Shininess: Optional[float] = None + m_SpecColor: Optional[ColorRGBA] = None + m_SupportsEmbeddedMaterials: Optional[bool] = None + m_UnitConversionEnumValue: Optional[int] = None + m_UsedFileIDs: Optional[List[int]] = None + +@define(kw_only=True, slots=False) +class SpriteAtlasImporter(AssetImporter): + m_AssetBundleName: str + m_AssetBundleVariant: str + m_ExternalObjects: List[Tuple[SourceAssetIdentifier, PPtr[Object]]] + m_Name: str + m_UsedFileIDs: List[int] + m_UserData: str + m_BindAsDefault: Optional[bool] = None + m_PackingSettings: Optional[PackingSettings] = None + m_PlatformSettings: Optional[List[TextureImporterPlatformSettings]] = None + m_SecondaryTextureSettings: Optional[List[Tuple[str, SecondaryTextureSettings]]] = None + m_TextureSettings: Optional[TextureSettings] = None + m_VariantMultiplier: Optional[float] = None + +@define(kw_only=True, slots=False) +class StyleSheetImporter(AssetImporter): + m_AssetBundleName: str + m_AssetBundleVariant: str + m_Name: str + m_UserData: str + +@define(kw_only=True, slots=False) +class SubstanceImporter(AssetImporter): + m_Name: str + m_AssetBundleName: Optional[str] = None + m_AssetBundleVariant: Optional[str] = None + m_DeletedPrototypes: Optional[List[str]] = None + m_ExternalObjects: Optional[List[Tuple[SourceAssetIdentifier, PPtr[Object]]]] = None + m_FileIDToRecycleName: Optional[List[Tuple[int, str]]] = None + m_IsFirstImport: Optional[int] = None + m_MaterialImportOutputs: Optional[List[MaterialImportOutput]] = None + m_MaterialInstances: Optional[List[MaterialInstanceSettings]] = None + m_NewHashIdentity: Optional[MdFour] = None + m_OldHashIdentity: Optional[MdFour] = None + m_UsedFileIDs: Optional[List[int]] = None + m_UserData: Optional[str] = None + +@define(kw_only=True, slots=False) +class TextScriptImporter(AssetImporter): + m_Name: str + m_AssetBundleName: Optional[str] = None + m_AssetBundleVariant: Optional[str] = None + m_ExternalObjects: Optional[List[Tuple[SourceAssetIdentifier, PPtr[Object]]]] = None + m_FileIDToRecycleName: Optional[List[Tuple[int, str]]] = None + m_NewHashIdentity: Optional[MdFour] = None + m_OldHashIdentity: Optional[MdFour] = None + m_UsedFileIDs: Optional[List[int]] = None + m_UserData: Optional[str] = None + +@define(kw_only=True, slots=False) +class TextureImporter(AssetImporter): + m_BorderMipMap: int + m_ConvertToNormalMap: int + m_EnableMipMap: int + m_ExternalNormalMap: int + m_FadeOut: int + m_GenerateCubemap: int + m_GrayScaleToAlpha: int + m_HeightScale: float + m_IsReadable: int + m_Lightmap: int + m_MaxTextureSize: int + m_MipMapFadeDistanceEnd: int + m_MipMapFadeDistanceStart: int + m_MipMapMode: int + m_NPOTScale: int + m_Name: str + m_NormalMapFilter: int + m_TextureFormat: int + m_TextureSettings: GLTextureSettings + m_TextureType: int + correctGamma: Optional[int] = None + m_Alignment: Optional[int] = None + m_AllowsAlphaSplitting: Optional[int] = None + m_AlphaIsTransparency: Optional[int] = None + m_AlphaTestReferenceValue: Optional[float] = None + m_AlphaUsage: Optional[int] = None + m_ApplyGammaDecoding: Optional[int] = None + m_AssetBundleName: Optional[str] = None + m_AssetBundleVariant: Optional[str] = None + m_BuildTargetSettings: Optional[List[BuildTargetSettings]] = None + m_CompressionQuality: Optional[int] = None + m_CompressionQualitySet: Optional[int] = None + m_CookieLightType: Optional[int] = None + m_CorrectGamma: Optional[int] = None + m_CubemapConvolution: Optional[int] = None + m_CubemapConvolutionExponent: Optional[float] = None + m_CubemapConvolutionSteps: Optional[int] = None + m_ExternalObjects: Optional[List[Tuple[SourceAssetIdentifier, PPtr[Object]]]] = None + m_FileIDToRecycleName: Optional[List[Tuple[int, str]]] = None + m_FlipGreenChannel: Optional[int] = None + m_FlipbookColumns: Optional[int] = None + m_FlipbookRows: Optional[int] = None + m_IgnoreMasterTextureLimit: Optional[int] = None + m_IgnoreMipmapLimit: Optional[int] = None + m_IgnorePngGamma: Optional[Union[bool, int]] = None + m_InternalIDToNameTable: Optional[List[Tuple[Tuple[int, int], str]]] = None + m_LinearTexture: Optional[int] = None + m_MaxTextureSizeSet: Optional[int] = None + m_MipMapsPreserveCoverage: Optional[int] = None + m_MipmapLimitGroupName: Optional[str] = None + m_NewHashIdentity: Optional[MdFour] = None + m_OldHashIdentity: Optional[MdFour] = None + m_Output: Optional[TextureImportOutput] = None + m_PSDRemoveMatte: Optional[bool] = None + m_PSDShowRemoveMatteOption: Optional[bool] = None + m_PlatformSettings: Optional[Union[List[TextureImporterPlatformSettings], List[PlatformSettings]]] = None + m_PushPullDilation: Optional[int] = None + m_RGBM: Optional[int] = None + m_RecommendedTextureFormat: Optional[int] = None + m_SeamlessCubemap: Optional[int] = None + m_SingleChannelComponent: Optional[int] = None + m_SourceTextureInformation: Optional[SourceTextureInformation] = None + m_SpriteBorder: Optional[Vector4f] = None + m_SpriteExtrude: Optional[int] = None + m_SpriteGenerateFallbackPhysicsShape: Optional[int] = None + m_SpriteMeshType: Optional[int] = None + m_SpriteMode: Optional[int] = None + m_SpritePackingTag: Optional[str] = None + m_SpritePivot: Optional[Vector2f] = None + m_SpritePixelsToUnits: Optional[float] = None + m_SpriteSheet: Optional[SpriteSheetMetaData] = None + m_SpriteTessellationDetail: Optional[float] = None + m_StreamingMipmaps: Optional[int] = None + m_StreamingMipmapsPriority: Optional[int] = None + m_Swizzle: Optional[int] = None + m_TextureFormatSet: Optional[int] = None + m_TextureShape: Optional[int] = None + m_UsedFileIDs: Optional[List[int]] = None + m_UserData: Optional[str] = None + m_VTOnly: Optional[int] = None + m_sRGBTexture: Optional[int] = None + +@define(kw_only=True, slots=False) +class TrueTypeFontImporter(AssetImporter): + m_FontNames: List[str] + m_FontSize: int + m_ForceTextureCase: int + m_IncludeFontData: bool + m_Name: str + m_AscentCalculationMode: Optional[int] = None + m_AssetBundleName: Optional[str] = None + m_AssetBundleVariant: Optional[str] = None + m_CharacterPadding: Optional[int] = None + m_CharacterSpacing: Optional[int] = None + m_CustomCharacters: Optional[str] = None + m_ExternalObjects: Optional[List[Tuple[SourceAssetIdentifier, PPtr[Object]]]] = None + m_FallbackFontReferences: Optional[List[PPtr[Font]]] = None + m_FileIDToRecycleName: Optional[List[Tuple[int, str]]] = None + m_FontColor: Optional[ColorRGBA] = None + m_FontName: Optional[str] = None + m_FontRenderingMode: Optional[int] = None + m_NewHashIdentity: Optional[MdFour] = None + m_OldHashIdentity: Optional[MdFour] = None + m_Output: Optional[Output] = None + m_RenderMode: Optional[int] = None + m_ShouldRoundAdvanceValue: Optional[bool] = None + m_Style: Optional[int] = None + m_Use2xBehaviour: Optional[bool] = None + m_UseLegacyBoundsCalculation: Optional[bool] = None + m_UsedFileIDs: Optional[List[int]] = None + m_UserData: Optional[str] = None + +@define(kw_only=True, slots=False) +class VideoClipImporter(AssetImporter): + m_AssetBundleName: str + m_AssetBundleVariant: str + m_ColorSpace: int + m_Deinterlace: int + m_EncodeAlpha: bool + m_EndFrame: int + m_FlipHorizontal: bool + m_FlipVertical: bool + m_FrameRange: int + m_Name: str + m_Output: VideoClipImporterOutput + m_StartFrame: int + m_TargetSettings: Union[List[Tuple[int, VideoClipImporterTargetSettings]], List[Tuple[str, VideoClipImporterTargetSettings]]] + m_UserData: str + m_AudioImportMode: Optional[int] = None + m_ExternalObjects: Optional[List[Tuple[SourceAssetIdentifier, PPtr[Object]]]] = None + m_FrameCount: Optional[int] = None + m_FrameRate: Optional[float] = None + m_ImportAudio: Optional[bool] = None + m_IsColorLinear: Optional[bool] = None + m_OriginalHeight: Optional[int] = None + m_OriginalWidth: Optional[int] = None + m_PixelAspectRatioDenominator: Optional[int] = None + m_PixelAspectRatioNumerator: Optional[int] = None + m_Quality: Optional[float] = None + m_SourceAudioChannelCount: Optional[List[int]] = None + m_SourceAudioSampleRate: Optional[List[int]] = None + m_SourceFileSize: Optional[int] = None + m_SourceHasAlpha: Optional[bool] = None + m_UseLegacyImporter: Optional[bool] = None + m_UsedFileIDs: Optional[List[int]] = None + +@define(kw_only=True, slots=False) +class VisualEffectImporter(AssetImporter): + m_AssetBundleName: str + m_AssetBundleVariant: str + m_ExternalObjects: List[Tuple[SourceAssetIdentifier, PPtr[Object]]] + m_Name: str + m_UserData: str + m_Template: Optional[VFXTemplate] = None + m_UsedFileIDs: Optional[List[int]] = None + +@define(kw_only=True, slots=False) +class AudioContainerElement(NamedObject): + m_AudioClip: PPtr[AudioClip] + m_Enabled: bool + m_Name: str + m_Volume: float + +@define(kw_only=True, slots=False) +class AudioMixer(NamedObject): + m_EnableSuspend: bool + m_MasterGroup: PPtr[AudioMixerGroup] + m_MixerConstant: AudioMixerConstant + m_Name: str + m_OutputGroup: PPtr[AudioMixerGroup] + m_Snapshots: List[PPtr[AudioMixerSnapshot]] + m_StartSnapshot: PPtr[AudioMixerSnapshot] + m_SuspendThreshold: float + m_UpdateMode: Optional[int] = None + +@define(kw_only=True, slots=False) +class AudioMixerController(AudioMixer): + m_EnableSuspend: bool + m_MasterGroup: PPtr[AudioMixerGroup] + m_MixerConstant: AudioMixerConstant + m_Name: str + m_OutputGroup: PPtr[AudioMixerGroup] + m_Snapshots: List[PPtr[AudioMixerSnapshot]] + m_StartSnapshot: PPtr[AudioMixerSnapshot] + m_SuspendThreshold: float + m_UpdateMode: Optional[int] = None + +@define(kw_only=True, slots=False) +class AudioMixerEffectController(NamedObject): + m_Bypass: bool + m_EffectID: GUID + m_EffectName: str + m_EnableWetMix: bool + m_MixLevel: GUID + m_Name: str + m_Parameters: List[Parameter] + m_SendTarget: PPtr[AudioMixerEffectController] + +@define(kw_only=True, slots=False) +class AudioMixerGroup(NamedObject): + m_AudioMixer: PPtr[AudioMixer] + m_Children: List[PPtr[AudioMixerGroup]] + m_GroupID: GUID + m_Name: str + +@define(kw_only=True, slots=False) +class AudioMixerGroupController(AudioMixerGroup): + m_AudioMixer: PPtr[AudioMixer] + m_Children: List[PPtr[AudioMixerGroup]] + m_GroupID: GUID + m_Name: str + +@define(kw_only=True, slots=False) +class AudioMixerSnapshot(NamedObject): + m_AudioMixer: PPtr[AudioMixer] + m_Name: str + m_SnapshotID: GUID + +@define(kw_only=True, slots=False) +class AudioMixerSnapshotController(AudioMixerSnapshot): + m_AudioMixer: PPtr[AudioMixer] + m_Name: str + m_SnapshotID: GUID + +@define(kw_only=True, slots=False) +class AudioResource(NamedObject): + m_Name: str + +@define(kw_only=True, slots=False) +class AudioRandomContainer(AudioResource): + m_AutomaticTriggerMode: int + m_AutomaticTriggerTime: float + m_AutomaticTriggerTimeRandomizationEnabled: bool + m_AutomaticTriggerTimeRandomizationRange: Vector2f + m_AvoidRepeatingLast: int + m_Elements: List[PPtr[AudioContainerElement]] + m_LoopCount: int + m_LoopCountRandomizationEnabled: bool + m_LoopCountRandomizationRange: Vector2f + m_LoopMode: int + m_Name: str + m_Pitch: float + m_PitchRandomizationEnabled: bool + m_PitchRandomizationRange: Vector2f + m_PlaybackMode: int + m_TriggerMode: int + m_Volume: float + m_VolumeRandomizationEnabled: bool + m_VolumeRandomizationRange: Vector2f + +@define(kw_only=True, slots=False) +class SampleClip(AudioResource): + m_Name: str + +@define(kw_only=True, slots=False) +class AudioClip(SampleClip): + m_Name: str + m_3D: Optional[bool] = None + m_Ambisonic: Optional[bool] = None + m_AudioData: Optional[List[int]] = None + m_BitsPerSample: Optional[int] = None + m_Channels: Optional[int] = None + m_CompressionFormat: Optional[int] = None + m_Format: Optional[int] = None + m_Frequency: Optional[int] = None + m_IsTrackerFormat: Optional[bool] = None + m_Legacy3D: Optional[bool] = None + m_Length: Optional[float] = None + m_LoadInBackground: Optional[bool] = None + m_LoadType: Optional[int] = None + m_PreloadAudioData: Optional[bool] = None + m_Resource: Optional[StreamedResource] = None + m_Stream: Optional[int] = None + m_SubsoundIndex: Optional[int] = None + m_Type: Optional[int] = None + m_UseHardware: Optional[bool] = None + +@define(kw_only=True, slots=False) +class Avatar(NamedObject): + m_Avatar: AvatarConstant + m_AvatarSize: int + m_Name: str + m_TOS: List[Tuple[int, str]] + m_HumanDescription: Optional[HumanDescription] = None + +@define(kw_only=True, slots=False) +class AvatarMask(NamedObject): + m_Elements: List[TransformMaskElement] + m_Mask: List[int] + m_Name: str + +@define(kw_only=True, slots=False) +class AvatarSkeletonMask(NamedObject): + elements: List[AvatarSkeletonMaskElement] + m_Name: str + +@define(kw_only=True, slots=False) +class BaseAnimationTrack(NamedObject, ABC): + pass + +@define(kw_only=True, slots=False) +class NewAnimationTrack(BaseAnimationTrack): + m_ClassID: int + m_Curves: List[Channel] + m_Name: str + +@define(kw_only=True, slots=False) +class BillboardAsset(NamedObject): + bottom: float + height: float + imageTexCoords: List[Vector4f] + indices: List[int] + m_Name: str + material: PPtr[Material] + vertices: List[Vector2f] + width: float + rotated: Optional[List[int]] = None + +@define(kw_only=True, slots=False) +class BuildReport(NamedObject): + m_Appendices: List[PPtr[Object]] + m_BuildSteps: List[BuildStepInfo] + m_Files: List[BuildReportFile] + m_Name: str + m_Summary: BuildSummary + +@define(kw_only=True, slots=False) +class CachedSpriteAtlas(NamedObject): + frames: List[Tuple[Tuple[GUID, int], SpriteRenderData]] + textures: List[PPtr[Texture2D]] + alphaTextures: Optional[List[PPtr[Texture2D]]] = None + +@define(kw_only=True, slots=False) +class CachedSpriteAtlasRuntimeData(NamedObject): + alphaTextures: List[PPtr[Texture2D]] + frames: List[Tuple[Tuple[GUID, int], SpriteAtlasData]] + textures: List[PPtr[Texture2D]] + currentPackingHash: Optional[Hash128] = None + +@define(kw_only=True, slots=False) +class ComputeShader(NamedObject): + m_Name: str + constantBuffers: Optional[List[ComputeShaderCB]] = None + kernels: Optional[List[ComputeShaderKernel]] = None + variants: Optional[Union[List[ComputeShaderVariant], List[ComputeShaderPlatformVariant]]] = None + +@define(kw_only=True, slots=False) +class DefaultAsset(NamedObject): + m_Name: str + m_IsWarning: Optional[bool] = None + m_Message: Optional[str] = None + +@define(kw_only=True, slots=False) +class BrokenPrefabAsset(DefaultAsset): + m_BrokenParentPrefab: PPtr[BrokenPrefabAsset] + m_IsPrefabFileValid: bool + m_IsVariant: bool + m_IsWarning: bool + m_Message: str + m_Name: str + +@define(kw_only=True, slots=False) +class SceneAsset(DefaultAsset): + m_Name: str + m_IsWarning: Optional[bool] = None + m_Message: Optional[str] = None + +@define(kw_only=True, slots=False) +class EditorProjectAccess(NamedObject): + m_Name: str + +@define(kw_only=True, slots=False) +class Flare(NamedObject): + m_Elements: List[FlareElement] + m_FlareTexture: PPtr[Texture] + m_Name: str + m_TextureLayout: int + m_UseFog: bool + +@define(kw_only=True, slots=False) +class Font(NamedObject): + m_Ascent: float + m_AsciiStartOffset: int + m_CharacterRects: List[CharacterInfo] + m_ConvertCase: int + m_DefaultMaterial: PPtr[Material] + m_DefaultStyle: int + m_FontData: List[str] + m_FontNames: List[str] + m_FontSize: float + m_KerningValues: List[Tuple[Tuple[int, int], float]] + m_LineSpacing: float + m_Name: str + m_Texture: PPtr[Texture] + m_CharacterPadding: Optional[int] = None + m_CharacterSpacing: Optional[int] = None + m_Descent: Optional[float] = None + m_FallbackFonts: Optional[List[PPtr[Font]]] = None + m_FontCountX: Optional[int] = None + m_FontCountY: Optional[int] = None + m_FontRenderingMode: Optional[int] = None + m_GridFont: Optional[bool] = None + m_Kerning: Optional[float] = None + m_PerCharacterKerning: Optional[List[Tuple[int, float]]] = None + m_PixelScale: Optional[float] = None + m_ShouldRoundAdvanceValue: Optional[bool] = None + m_Tracking: Optional[float] = None + m_UseLegacyBoundsCalculation: Optional[bool] = None + +@define(kw_only=True, slots=False) +class GameObjectRecorder(NamedObject): + m_Name: str + +@define(kw_only=True, slots=False) +class GraphicsStateCollection(NamedObject): + m_DeviceRenderer: int + m_Name: str + m_QualityLevelName: str + m_RenderPassInfoMap: List[Tuple[int, RenderPassInfo]] + m_RenderStateMap: List[Tuple[int, RenderStateInfo]] + m_RuntimePlatform: int + m_VariantInfoMap: List[Tuple[Hash128, VariantInfo]] + m_Version: int + m_VertexLayoutInfoMap: List[Tuple[int, VertexLayoutInfo]] + +@define(kw_only=True, slots=False) +class HumanTemplate(NamedObject): + m_BoneTemplate: List[Tuple[str, str]] + m_Name: str + +@define(kw_only=True, slots=False) +class ImportLog(NamedObject): + m_Logs: List[ImportLog_ImportLogEntry] + m_Name: str + +@define(kw_only=True, slots=False) +class LightProbes(NamedObject): + m_Name: str + bakedCoefficients: Optional[List[LightmapData]] = None + bakedPositions: Optional[List[Vector3f]] = None + hullRays: Optional[List[Vector3f]] = None + m_BakedCoefficients: Optional[List[SphericalHarmonicsL2]] = None + m_BakedLightOcclusion: Optional[List[LightProbeOcclusion]] = None + m_Data: Optional[LightProbeData] = None + m_HasBeenEdited: Optional[bool] = None + tetrahedra: Optional[List[Tetrahedron]] = None + +@define(kw_only=True, slots=False) +class LightingDataAsset(NamedObject): + m_BakedAmbientProbeInLinear: SphericalHarmonicsL2 + m_BakedReflectionProbeCubemaps: List[PPtr[Texture]] + m_BakedReflectionProbes: List[SceneObjectIdentifier] + m_EnlightenData: List[int] + m_EnlightenSceneMapping: EnlightenSceneMapping + m_EnlightenSceneMappingRendererIDs: List[SceneObjectIdentifier] + m_LightProbes: PPtr[LightProbes] + m_LightmappedRendererData: List[RendererData] + m_LightmappedRendererDataIDs: List[SceneObjectIdentifier] + m_Lightmaps: List[LightmapData] + m_Lights: List[SceneObjectIdentifier] + m_Name: str + m_AOTextures: Optional[List[PPtr[Texture2D]]] = None + m_BakedLightIndices: Optional[List[int]] = None + m_BakedReflectionProbeCubemapCacheFiles: Optional[List[str]] = None + m_EnlightenDataVersion: Optional[int] = None + m_LightBakingOutputs: Optional[List[LightBakingOutput]] = None + m_LightmapsCacheFiles: Optional[List[str]] = None + m_LightmapsMode: Optional[int] = None + m_Scene: Optional[PPtr[SceneAsset]] = None + m_SceneGUID: Optional[GUID] = None + +@define(kw_only=True, slots=False) +class LightingDataAssetParent(NamedObject): + m_Name: str + +@define(kw_only=True, slots=False) +class LightingSettings(NamedObject): + m_AlbedoBoost: float + m_BounceScale: float + m_EnableBakedLightmaps: bool + m_EnableRealtimeLightmaps: bool + m_Name: str + m_RealtimeEnvironmentLighting: bool + m_UsingShadowmask: bool + m_AO: Optional[bool] = None + m_AOMaxDistance: Optional[float] = None + m_BakeBackend: Optional[int] = None + m_BakeResolution: Optional[float] = None + m_CompAOExponent: Optional[float] = None + m_CompAOExponentDirect: Optional[float] = None + m_ExportTrainingData: Optional[bool] = None + m_ExtractAO: Optional[bool] = None + m_FilterMode: Optional[int] = None + m_FinalGather: Optional[bool] = None + m_FinalGatherFiltering: Optional[bool] = None + m_FinalGatherRayCount: Optional[int] = None + m_ForceUpdates: Optional[bool] = None + m_ForceWhiteAlbedo: Optional[bool] = None + m_GIWorkflowMode: Optional[int] = None + m_IndirectOutputScale: Optional[float] = None + m_LightmapMaxSize: Optional[int] = None + m_LightmapParameters: Optional[PPtr[LightmapParameters]] = None + m_LightmapsBakeMode: Optional[int] = None + m_MixedBakeMode: Optional[int] = None + m_PVRBounces: Optional[int] = None + m_PVRCulling: Optional[bool] = None + m_PVRDenoiserTypeAO: Optional[int] = None + m_PVRDenoiserTypeDirect: Optional[int] = None + m_PVRDenoiserTypeIndirect: Optional[int] = None + m_PVRDirectSampleCount: Optional[int] = None + m_PVREnvironmentMIS: Optional[int] = None + m_PVREnvironmentReferencePointCount: Optional[int] = None + m_PVREnvironmentSampleCount: Optional[int] = None + m_PVRFilterTypeAO: Optional[int] = None + m_PVRFilterTypeDirect: Optional[int] = None + m_PVRFilterTypeIndirect: Optional[int] = None + m_PVRFilteringAtrousPositionSigmaAO: Optional[float] = None + m_PVRFilteringAtrousPositionSigmaDirect: Optional[float] = None + m_PVRFilteringAtrousPositionSigmaIndirect: Optional[float] = None + m_PVRFilteringGaussRadiusAO: Optional[int] = None + m_PVRFilteringGaussRadiusDirect: Optional[int] = None + m_PVRFilteringGaussRadiusIndirect: Optional[int] = None + m_PVRFilteringMode: Optional[int] = None + m_PVRSampleCount: Optional[int] = None + m_PVRSampling: Optional[int] = None + m_Padding: Optional[int] = None + m_RealtimeResolution: Optional[float] = None + m_TextureCompression: Optional[bool] = None + m_TrainingDataDestination: Optional[str] = None + +@define(kw_only=True, slots=False) +class LightmapParameters(NamedObject): + AOAntiAliasingSamples: int + AOQuality: int + antiAliasingSamples: int + backFaceTolerance: float + bakedLightmapTag: int + blurRadius: int + clusterResolution: float + directLightQuality: int + edgeStitching: int + irradianceBudget: int + irradianceQuality: int + isTransparent: int + m_Name: str + modellingTolerance: float + resolution: float + systemTag: int + limitLightmapCount: Optional[bool] = None + maxLightmapCount: Optional[int] = None + pushoff: Optional[float] = None + +@define(kw_only=True, slots=False) +class LocalizationAsset(NamedObject): + Editor_Asset: bool + Locale_ISO_Code: str + String_Table: List[Tuple[str, str]] + m_Name: str + +@define(kw_only=True, slots=False) +class Material(NamedObject): + m_Name: str + m_SavedProperties: UnityPropertySheet + m_Shader: PPtr[Shader] + disabledShaderPasses: Optional[List[str]] = None + m_BuildTextureStacks: Optional[List[BuildTextureStackReference]] = None + m_CustomRenderQueue: Optional[int] = None + m_DoubleSidedGI: Optional[bool] = None + m_EnableInstancingVariants: Optional[bool] = None + m_InvalidKeywords: Optional[List[str]] = None + m_LightmapFlags: Optional[int] = None + m_ShaderKeywords: Optional[Union[str, List[str]]] = None + m_ValidKeywords: Optional[List[str]] = None + stringTagMap: Optional[List[Tuple[str, str]]] = None + +@define(kw_only=True, slots=False) +class ProceduralMaterial(Material): + m_Name: str + m_SavedProperties: UnityPropertySheet + m_Shader: PPtr[Shader] + disabledShaderPasses: Optional[List[str]] = None + m_AnimationUpdateRate: Optional[int] = None + m_BuildTextureStacks: Optional[List[BuildTextureStackReference]] = None + m_CacheSize: Optional[int] = None + m_CustomRenderQueue: Optional[int] = None + m_DoubleSidedGI: Optional[bool] = None + m_EnableInstancingVariants: Optional[bool] = None + m_Flags: Optional[int] = None + m_GenerateMipmaps: Optional[bool] = None + m_Hash: Optional[Hash128] = None + m_Height: Optional[int] = None + m_Inputs: Optional[List[SubstanceInput]] = None + m_InvalidKeywords: Optional[List[str]] = None + m_LightmapFlags: Optional[int] = None + m_LoadingBehavior: Optional[int] = None + m_MaximumSize: Optional[int] = None + m_PrototypeName: Optional[str] = None + m_ShaderKeywords: Optional[Union[str, List[str]]] = None + m_SubstancePackage: Optional[PPtr[SubstanceArchive]] = None + m_Textures: Optional[List[PPtr[ProceduralTexture]]] = None + m_ValidKeywords: Optional[List[str]] = None + m_Width: Optional[int] = None + stringTagMap: Optional[List[Tuple[str, str]]] = None + +@define(kw_only=True, slots=False) +class Mesh(NamedObject): + m_BindPose: List[Matrix4x4f] + m_CompressedMesh: CompressedMesh + m_IndexBuffer: List[int] + m_LocalAABB: AABB + m_MeshCompression: int + m_MeshUsageFlags: int + m_Name: str + m_SubMeshes: List[SubMesh] + m_BakedConvexCollisionMesh: Optional[List[int]] = None + m_BakedTriangleCollisionMesh: Optional[List[int]] = None + m_BoneNameHashes: Optional[List[int]] = None + m_BonesAABB: Optional[List[MinMaxAABB]] = None + m_CollisionTriangles: Optional[List[int]] = None + m_CollisionVertexCount: Optional[int] = None + m_Colors: Optional[List[ColorRGBA]] = None + m_CookingOptions: Optional[int] = None + m_IndexFormat: Optional[int] = None + m_IsReadable: Optional[bool] = None + m_KeepIndices: Optional[bool] = None + m_KeepVertices: Optional[bool] = None + m_MeshMetrics_0_: Optional[float] = None + m_MeshMetrics_1_: Optional[float] = None + m_Normals: Optional[List[Vector3f]] = None + m_RootBoneNameHash: Optional[int] = None + m_ShapeVertices: Optional[List[MeshBlendShapeVertex]] = None + m_Shapes: Optional[Union[BlendShapeData, List[MeshBlendShape]]] = None + m_Skin: Optional[Union[List[BoneInfluence], List[BoneWeights4]]] = None + m_StreamCompression: Optional[int] = None + m_StreamData: Optional[StreamingInfo] = None + m_Tangents: Optional[List[Vector4f]] = None + m_UV: Optional[List[Vector2f]] = None + m_UV1: Optional[List[Vector2f]] = None + m_Use16BitIndices: Optional[int] = None + m_VariableBoneCountWeights: Optional[VariableBoneCountWeights] = None + m_VertexData: Optional[VertexData] = None + m_Vertices: Optional[List[Vector3f]] = None + +@define(kw_only=True, slots=False) +class Motion(NamedObject, ABC): + pass + +@define(kw_only=True, slots=False) +class AnimationClip(Motion): + m_Bounds: AABB + m_Compressed: bool + m_CompressedRotationCurves: List[CompressedAnimationCurve] + m_Events: List[AnimationEvent] + m_FloatCurves: List[FloatCurve] + m_Name: str + m_PositionCurves: List[Vector3Curve] + m_RotationCurves: List[QuaternionCurve] + m_SampleRate: float + m_ScaleCurves: List[Vector3Curve] + m_WrapMode: int + m_AnimationType: Optional[int] = None + m_ClipBindingConstant: Optional[AnimationClipBindingConstant] = None + m_EulerCurves: Optional[List[Vector3Curve]] = None + m_HasGenericRootTransform: Optional[bool] = None + m_HasMotionFloatCurves: Optional[bool] = None + m_Legacy: Optional[bool] = None + m_MuscleClip: Optional[ClipMuscleConstant] = None + m_MuscleClipSize: Optional[int] = None + m_PPtrCurves: Optional[List[PPtrCurve]] = None + m_UseHighQualityCurve: Optional[bool] = None + +@define(kw_only=True, slots=False) +class PreviewAnimationClip(AnimationClip): + m_Bounds: AABB + m_ClipBindingConstant: AnimationClipBindingConstant + m_Compressed: bool + m_CompressedRotationCurves: List[CompressedAnimationCurve] + m_EulerCurves: List[Vector3Curve] + m_Events: List[AnimationEvent] + m_FloatCurves: List[FloatCurve] + m_Legacy: bool + m_MuscleClip: ClipMuscleConstant + m_MuscleClipSize: int + m_Name: str + m_PPtrCurves: List[PPtrCurve] + m_PositionCurves: List[Vector3Curve] + m_RotationCurves: List[QuaternionCurve] + m_SampleRate: float + m_ScaleCurves: List[Vector3Curve] + m_UseHighQualityCurve: bool + m_WrapMode: int + m_HasGenericRootTransform: Optional[bool] = None + m_HasMotionFloatCurves: Optional[bool] = None + +@define(kw_only=True, slots=False) +class BlendTree(Motion): + m_Childs: Union[List[Child], List[ChildMotion]] + m_MaxThreshold: float + m_MinThreshold: float + m_Name: str + m_UseAutomaticThresholds: bool + m_BlendEvent: Optional[str] = None + m_BlendEventY: Optional[str] = None + m_BlendParameter: Optional[str] = None + m_BlendParameterY: Optional[str] = None + m_BlendType: Optional[int] = None + m_NormalizedBlendValues: Optional[bool] = None + +@define(kw_only=True, slots=False) +class NavMeshData(NamedObject): + m_HeightMeshes: List[HeightMeshData] + m_Heightmaps: List[HeightmapData] + m_Name: str + m_NavMeshTiles: List[NavMeshTileData] + m_OffMeshLinks: List[AutoOffMeshLinkData] + m_AgentTypeID: Optional[int] = None + m_NavMeshBuildSettings: Optional[NavMeshBuildSettings] = None + m_NavMeshParams: Optional[NavMeshParams] = None + m_Position: Optional[Vector3f] = None + m_Rotation: Optional[Quaternionf] = None + m_SourceBounds: Optional[AABB] = None + +@define(kw_only=True, slots=False) +class NavMeshObsolete(NamedObject): + m_Name: str + +@define(kw_only=True, slots=False) +class OcclusionCullingData(NamedObject): + m_Name: str + m_PVSData: List[int] + m_Scenes: List[OcclusionScene] + +@define(kw_only=True, slots=False) +class PhysicsMaterial(NamedObject): + m_Name: str + bounceCombine: Optional[int] = None + bounciness: Optional[float] = None + dynamicFriction: Optional[float] = None + frictionCombine: Optional[int] = None + m_BounceCombine: Optional[int] = None + m_Bounciness: Optional[float] = None + m_DynamicFriction: Optional[float] = None + m_FrictionCombine: Optional[int] = None + m_StaticFriction: Optional[float] = None + staticFriction: Optional[float] = None + +@define(kw_only=True, slots=False) +class PhysicsMaterial2D(NamedObject): + bounciness: float + friction: float + m_Name: str + m_BounceCombine: Optional[int] = None + m_FrictionCombine: Optional[int] = None + +@define(kw_only=True, slots=False) +class PreloadData(NamedObject): + m_Assets: List[PPtr[Object]] + m_Name: str + m_Dependencies: Optional[List[str]] = None + m_ExplicitDataLayout: Optional[bool] = None + +@define(kw_only=True, slots=False) +class Preset(NamedObject): + m_Name: str + m_Properties: List[PropertyModification] + m_TargetType: PresetType + m_CoupledProperties: Optional[List[PropertyModification]] = None + m_CoupledType: Optional[PresetType] = None + m_ExcludedProperties: Optional[List[str]] = None + +@define(kw_only=True, slots=False) +class RayTracingShader(NamedObject): + m_MaxRecursionDepth: int + m_Name: str + variants: List[RayTracingShaderVariant] + m_EnableRayPayloadSizeChecks: Optional[bool] = None + +@define(kw_only=True, slots=False) +class RoslynAdditionalFileAsset(NamedObject): + m_Name: str + +@define(kw_only=True, slots=False) +class RoslynAnalyzerConfigAsset(NamedObject): + m_Name: str + +@define(kw_only=True, slots=False) +class RuntimeAnimatorController(NamedObject): + m_AnimationClips: List[PPtr[AnimationClip]] + m_Controller: ControllerConstant + m_ControllerSize: int + m_Name: str + m_TOS: List[Tuple[int, str]] + +@define(kw_only=True, slots=False) +class AnimatorController(RuntimeAnimatorController): + m_AnimationClips: List[PPtr[AnimationClip]] + m_Controller: ControllerConstant + m_ControllerSize: int + m_Name: str + m_TOS: List[Tuple[int, str]] + m_MultiThreadedStateMachine: Optional[bool] = None + m_StateMachineBehaviourVectorDescription: Optional[StateMachineBehaviourVectorDescription] = None + m_StateMachineBehaviours: Optional[List[PPtr[MonoBehaviour]]] = None + +@define(kw_only=True, slots=False) +class AnimatorOverrideController(RuntimeAnimatorController): + m_Clips: List[AnimationClipOverride] + m_Controller: PPtr[RuntimeAnimatorController] + m_Name: str + +@define(kw_only=True, slots=False) +class Shader(NamedObject): + m_Name: str + compressedBlob: Optional[List[int]] = None + compressedLengths: Optional[Union[List[int], List[List[int]]]] = None + decompressedLengths: Optional[Union[List[int], List[List[int]]]] = None + decompressedSize: Optional[int] = None + m_AssetGUID: Optional[GUID] = None + m_Dependencies: Optional[List[PPtr[Shader]]] = None + m_NonModifiableTextures: Optional[List[Tuple[str, PPtr[Texture]]]] = None + m_ParsedForm: Optional[SerializedShader] = None + m_PathName: Optional[str] = None + m_Script: Optional[str] = None + m_ShaderIsBaked: Optional[bool] = None + m_SubProgramBlob: Optional[List[int]] = None + offsets: Optional[Union[List[int], List[List[int]]]] = None + platforms: Optional[List[int]] = None + stageCounts: Optional[List[int]] = None + +@define(kw_only=True, slots=False) +class ShaderVariantCollection(NamedObject): + m_Name: str + m_Shaders: List[Tuple[PPtr[Shader], ShaderInfo]] + +@define(kw_only=True, slots=False) +class SpeedTreeWindAsset(NamedObject): + m_Name: str + m_Config8: Optional[SpeedTreeWindConfig8] = None + m_Config9: Optional[SpeedTreeWindConfig9] = None + m_Wind: Optional[SpeedTreeWind] = None + m_eVersion: Optional[int] = None + +@define(kw_only=True, slots=False) +class Sprite(NamedObject): + m_Extrude: int + m_Name: str + m_Offset: Vector2f + m_PixelsToUnits: float + m_RD: SpriteRenderData + m_Rect: Rectf + m_AtlasTags: Optional[List[str]] = None + m_Bones: Optional[List[SpriteBone]] = None + m_Border: Optional[Vector4f] = None + m_IsPolygon: Optional[bool] = None + m_PhysicsShape: Optional[List[List[Vector2f]]] = None + m_Pivot: Optional[Vector2f] = None + m_RenderDataKey: Optional[Tuple[GUID, int]] = None + m_ScriptableObjects: Optional[List[PPtr[MonoBehaviour]]] = None + m_SpriteAtlas: Optional[PPtr[SpriteAtlas]] = None + +@define(kw_only=True, slots=False) +class SpriteAtlas(NamedObject): + m_IsVariant: bool + m_Name: str + m_PackedSpriteNamesToIndex: List[str] + m_PackedSprites: List[PPtr[Sprite]] + m_RenderDataMap: List[Tuple[Tuple[GUID, int], SpriteAtlasData]] + m_Tag: str + +@define(kw_only=True, slots=False) +class SpriteAtlasAsset(NamedObject): + m_ImporterData: Union[SpriteAtlasEditorData, SpriteAtlasAssetData] + m_IsVariant: bool + m_MasterAtlas: PPtr[SpriteAtlas] + m_Name: str + m_ScriptablePacker: Optional[PPtr[Object]] = None + +@define(kw_only=True, slots=False) +class SubstanceArchive(NamedObject): + m_Name: str + m_PackageData: Optional[List[int]] = None + +@define(kw_only=True, slots=False) +class TerrainData(NamedObject): + m_DetailDatabase: DetailDatabase + m_Heightmap: Heightmap + m_Name: str + m_SplatDatabase: SplatDatabase + m_PreloadShaders: Optional[List[PPtr[Shader]]] = None + +@define(kw_only=True, slots=False) +class TerrainLayer(NamedObject): + m_DiffuseRemapMax: Vector4f + m_DiffuseRemapMin: Vector4f + m_DiffuseTexture: PPtr[Texture2D] + m_MaskMapRemapMax: Vector4f + m_MaskMapRemapMin: Vector4f + m_MaskMapTexture: PPtr[Texture2D] + m_Metallic: float + m_Name: str + m_NormalMapTexture: PPtr[Texture2D] + m_NormalScale: float + m_Smoothness: float + m_Specular: ColorRGBA + m_TileOffset: Vector2f + m_TileSize: Vector2f + m_SmoothnessSource: Optional[int] = None + +@define(kw_only=True, slots=False) +class TextAsset(NamedObject): + m_Name: str + m_Script: str + m_PathName: Optional[str] = None + +@define(kw_only=True, slots=False) +class AssemblyDefinitionAsset(TextAsset): + m_Name: str + m_Script: str + +@define(kw_only=True, slots=False) +class AssemblyDefinitionReferenceAsset(TextAsset): + m_Name: str + m_Script: str + +@define(kw_only=True, slots=False) +class MonoScript(TextAsset): + m_AssemblyName: str + m_ClassName: str + m_ExecutionOrder: int + m_Name: str + m_Namespace: str + m_PropertiesHash: Union[Hash128, int] + m_IsEditorScript: Optional[bool] = None + +@define(kw_only=True, slots=False) +class PackageManifest(TextAsset): + m_Name: str + m_Script: str + +@define(kw_only=True, slots=False) +class RuleSetFileAsset(TextAsset): + m_Name: str + m_Script: str + +@define(kw_only=True, slots=False) +class ShaderInclude(TextAsset): + m_Name: str + m_Script: Optional[str] = None + +@define(kw_only=True, slots=False) +class Texture(NamedObject, ABC): + pass + +@define(kw_only=True, slots=False) +class BaseVideoTexture(Texture, ABC): + pass + +@define(kw_only=True, slots=False) +class WebCamTexture(BaseVideoTexture): + m_Name: str + m_DownscaleFallback: Optional[bool] = None + m_ForcedFallbackFormat: Optional[int] = None + m_IsAlphaChannelOptional: Optional[bool] = None + +@define(kw_only=True, slots=False) +class CubemapArray(Texture): + image_data: bytes + m_ColorSpace: int + m_CubemapCount: int + m_DataSize: int + m_Format: int + m_IsReadable: bool + m_MipCount: int + m_Name: str + m_TextureSettings: GLTextureSettings + m_Width: int + m_DownscaleFallback: Optional[bool] = None + m_ForcedFallbackFormat: Optional[int] = None + m_IsAlphaChannelOptional: Optional[bool] = None + m_StreamData: Optional[StreamingInfo] = None + m_UsageMode: Optional[int] = None + +@define(kw_only=True, slots=False) +class LowerResBlitTexture(Texture): + m_Name: str + m_DownscaleFallback: Optional[bool] = None + m_ForcedFallbackFormat: Optional[int] = None + m_IsAlphaChannelOptional: Optional[bool] = None + +@define(kw_only=True, slots=False) +class MovieTexture(Texture): + m_Name: str + m_AudioClip: Optional[PPtr[AudioClip]] = None + m_ColorSpace: Optional[int] = None + m_DownscaleFallback: Optional[bool] = None + m_ForcedFallbackFormat: Optional[int] = None + m_IsAlphaChannelOptional: Optional[bool] = None + m_Loop: Optional[bool] = None + m_MovieData: Optional[List[int]] = None + +@define(kw_only=True, slots=False) +class ProceduralTexture(Texture): + m_Name: str + AlphaSource: Optional[int] = None + AlphaSourceIsGrayscale: Optional[bool] = None + Format: Optional[int] = None + Type: Optional[int] = None + m_AlphaSourceIsInverted: Optional[bool] = None + m_AlphaSourceUID: Optional[int] = None + m_BakedData: Optional[List[int]] = None + m_BakedParameters: Optional[TextureParameters] = None + m_ColorSpace: Optional[int] = None + m_DownscaleFallback: Optional[bool] = None + m_ForcedFallbackFormat: Optional[int] = None + m_IsAlphaChannelOptional: Optional[bool] = None + m_LightmapFormat: Optional[int] = None + m_Mipmaps: Optional[int] = None + m_SubstanceMaterial: Optional[PPtr[ProceduralMaterial]] = None + m_SubstanceTextureUID: Optional[int] = None + m_TextureParameters: Optional[TextureParameters] = None + m_TextureSettings: Optional[GLTextureSettings] = None + +@define(kw_only=True, slots=False) +class RenderTexture(Texture): + m_ColorFormat: int + m_Height: int + m_MipMap: bool + m_Name: str + m_TextureSettings: GLTextureSettings + m_Width: int + m_AntiAliasing: Optional[int] = None + m_BindMS: Optional[bool] = None + m_DepthFormat: Optional[int] = None + m_DepthStencilFormat: Optional[int] = None + m_Dimension: Optional[int] = None + m_DownscaleFallback: Optional[bool] = None + m_EnableCompatibleFormat: Optional[bool] = None + m_EnableRandomWrite: Optional[bool] = None + m_ForcedFallbackFormat: Optional[int] = None + m_GenerateMips: Optional[bool] = None + m_IsAlphaChannelOptional: Optional[bool] = None + m_IsCubemap: Optional[bool] = None + m_IsPowerOfTwo: Optional[bool] = None + m_MipCount: Optional[int] = None + m_SRGB: Optional[bool] = None + m_ShadowSamplingMode: Optional[int] = None + m_UseDynamicScale: Optional[bool] = None + m_UseDynamicScaleExplicit: Optional[bool] = None + m_VolumeDepth: Optional[int] = None + +@define(kw_only=True, slots=False) +class CustomRenderTexture(RenderTexture): + m_AntiAliasing: int + m_ColorFormat: int + m_CubemapFaceMask: int + m_CurrentUpdateZoneSpace: int + m_Dimension: int + m_DoubleBuffered: bool + m_GenerateMips: bool + m_Height: int + m_InitColor: ColorRGBA + m_InitMaterial: PPtr[Material] + m_InitTexture: PPtr[Texture] + m_InitializationMode: int + m_Material: PPtr[Material] + m_MipMap: bool + m_Name: str + m_SRGB: bool + m_ShaderPass: int + m_TextureSettings: GLTextureSettings + m_UpdateMode: int + m_UpdatePeriod: float + m_UpdateZoneSpace: int + m_UpdateZones: List[UpdateZoneInfo] + m_VolumeDepth: int + m_Width: int + m_WrapUpdateZones: bool + m_BindMS: Optional[bool] = None + m_DepthFormat: Optional[int] = None + m_DepthStencilFormat: Optional[int] = None + m_DownscaleFallback: Optional[bool] = None + m_EnableCompatibleFormat: Optional[bool] = None + m_EnableRandomWrite: Optional[bool] = None + m_ForcedFallbackFormat: Optional[int] = None + m_InitSource: Optional[int] = None + m_IsAlphaChannelOptional: Optional[bool] = None + m_MipCount: Optional[int] = None + m_ShadowSamplingMode: Optional[int] = None + m_UseDynamicScale: Optional[bool] = None + m_UseDynamicScaleExplicit: Optional[bool] = None + +@define(kw_only=True, slots=False) +class SparseTexture(Texture): + m_ColorSpace: int + m_Format: int + m_Height: int + m_MipCount: int + m_Name: str + m_TextureSettings: GLTextureSettings + m_Width: int + m_DownscaleFallback: Optional[bool] = None + m_ForcedFallbackFormat: Optional[int] = None + m_IsAlphaChannelOptional: Optional[bool] = None + +@define(kw_only=True, slots=False) +class Texture2D(Texture): + image_data: bytes + m_CompleteImageSize: int + m_Height: int + m_ImageCount: int + m_IsReadable: bool + m_LightmapFormat: int + m_Name: str + m_TextureDimension: int + m_TextureFormat: int + m_TextureSettings: GLTextureSettings + m_Width: int + m_ColorSpace: Optional[int] = None + m_DownscaleFallback: Optional[bool] = None + m_ForcedFallbackFormat: Optional[int] = None + m_IgnoreMasterTextureLimit: Optional[bool] = None + m_IgnoreMipmapLimit: Optional[bool] = None + m_IsAlphaChannelOptional: Optional[bool] = None + m_IsPreProcessed: Optional[bool] = None + m_MipCount: Optional[int] = None + m_MipMap: Optional[bool] = None + m_MipmapLimitGroupName: Optional[str] = None + m_MipsStripped: Optional[int] = None + m_PlatformBlob: Optional[List[int]] = None + m_ReadAllowed: Optional[bool] = None + m_StreamData: Optional[StreamingInfo] = None + m_StreamingMipmaps: Optional[bool] = None + m_StreamingMipmapsPriority: Optional[int] = None + +@define(kw_only=True, slots=False) +class Cubemap(Texture2D): + image_data: bytes + m_CompleteImageSize: int + m_Height: int + m_ImageCount: int + m_IsReadable: bool + m_LightmapFormat: int + m_Name: str + m_TextureDimension: int + m_TextureFormat: int + m_TextureSettings: GLTextureSettings + m_Width: int + m_ColorSpace: Optional[int] = None + m_DownscaleFallback: Optional[bool] = None + m_ForcedFallbackFormat: Optional[int] = None + m_IgnoreMasterTextureLimit: Optional[bool] = None + m_IgnoreMipmapLimit: Optional[bool] = None + m_IsAlphaChannelOptional: Optional[bool] = None + m_IsPreProcessed: Optional[bool] = None + m_MipCount: Optional[int] = None + m_MipMap: Optional[bool] = None + m_MipmapLimitGroupName: Optional[str] = None + m_MipsStripped: Optional[int] = None + m_PlatformBlob: Optional[List[int]] = None + m_ReadAllowed: Optional[bool] = None + m_SourceTextures: Optional[List[PPtr[Texture2D]]] = None + m_StreamData: Optional[StreamingInfo] = None + m_StreamingMipmaps: Optional[bool] = None + m_StreamingMipmapsPriority: Optional[int] = None + +@define(kw_only=True, slots=False) +class Texture2DArray(Texture): + image_data: bytes + m_ColorSpace: int + m_DataSize: int + m_Depth: int + m_Format: int + m_Height: int + m_IsReadable: bool + m_MipCount: int + m_Name: str + m_TextureSettings: GLTextureSettings + m_Width: int + m_DownscaleFallback: Optional[bool] = None + m_ForcedFallbackFormat: Optional[int] = None + m_IgnoreMipmapLimit: Optional[bool] = None + m_IsAlphaChannelOptional: Optional[bool] = None + m_MipmapLimitGroupName: Optional[str] = None + m_MipsStripped: Optional[int] = None + m_StreamData: Optional[StreamingInfo] = None + m_UsageMode: Optional[int] = None + +@define(kw_only=True, slots=False) +class Texture3D(Texture): + image_data: bytes + m_Height: int + m_Name: str + m_TextureSettings: GLTextureSettings + m_Width: int + m_ColorSpace: Optional[int] = None + m_CompleteImageSize: Optional[int] = None + m_DataSize: Optional[int] = None + m_Depth: Optional[int] = None + m_DownscaleFallback: Optional[bool] = None + m_ForcedFallbackFormat: Optional[int] = None + m_Format: Optional[int] = None + m_ImageCount: Optional[int] = None + m_IsAlphaChannelOptional: Optional[bool] = None + m_IsReadable: Optional[bool] = None + m_LightmapFormat: Optional[int] = None + m_MipCount: Optional[int] = None + m_MipMap: Optional[bool] = None + m_ReadAllowed: Optional[bool] = None + m_StreamData: Optional[StreamingInfo] = None + m_TextureDimension: Optional[int] = None + m_TextureFormat: Optional[int] = None + m_UsageMode: Optional[int] = None + +@define(kw_only=True, slots=False) +class VideoClip(NamedObject): + Height: int + Width: int + m_AudioChannelCount: List[int] + m_AudioLanguage: List[str] + m_AudioSampleRate: List[int] + m_ExternalResources: StreamedResource + m_Format: int + m_FrameCount: int + m_FrameRate: float + m_HasSplitAlpha: bool + m_Name: str + m_OriginalPath: str + m_ProxyHeight: int + m_ProxyWidth: int + m_PixelAspecRatioDen: Optional[int] = None + m_PixelAspecRatioNum: Optional[int] = None + m_VideoShaders: Optional[List[PPtr[Shader]]] = None + m_sRGB: Optional[bool] = None + +@define(kw_only=True, slots=False) +class VisualEffectObject(NamedObject, ABC): + pass + +@define(kw_only=True, slots=False) +class VisualEffectAsset(VisualEffectObject): + m_Infos: VisualEffectInfo + m_Name: str + m_Systems: List[VFXSystemDesc] + +@define(kw_only=True, slots=False) +class VisualEffectSubgraph(VisualEffectObject, ABC): + pass + +@define(kw_only=True, slots=False) +class VisualEffectSubgraphBlock(VisualEffectSubgraph): + m_Name: str + +@define(kw_only=True, slots=False) +class VisualEffectSubgraphOperator(VisualEffectSubgraph): + m_Name: str + +@define(kw_only=True, slots=False) +class VisualEffectResource(NamedObject): + m_Graph: PPtr[MonoBehaviour] + m_Infos: Union[VisualEffectSettings, VisualEffectInfo] + m_Name: str + m_ShaderSources: Optional[List[VFXShaderSourceDesc]] = None + m_Systems: Optional[List[VFXEditorSystemDesc]] = None + +@define(kw_only=True, slots=False) +class EditorExtensionImpl(Object): + gFlattenedTypeTree: Optional[List[int]] = None + m_DataTemplate: Optional[PPtr[DataTemplate]] = None + m_Object: Optional[PPtr[EditorExtension]] = None + m_OverrideVariable: Optional[bitset] = None + m_TemplateFather: Optional[PPtr[EditorExtensionImpl]] = None + +@define(kw_only=True, slots=False) +class EditorSettings(Object): + m_AssetNamingUsesSpace: Optional[bool] = None + m_AssetPipelineMode: Optional[int] = None + m_AsyncShaderCompilation: Optional[bool] = None + m_Bc7TextureCompressor: Optional[int] = None + m_CacheServerDownloadBatchSize: Optional[int] = None + m_CacheServerEnableAuth: Optional[bool] = None + m_CacheServerEnableDownload: Optional[bool] = None + m_CacheServerEnableTls: Optional[bool] = None + m_CacheServerEnableUpload: Optional[bool] = None + m_CacheServerEndpoint: Optional[str] = None + m_CacheServerMode: Optional[int] = None + m_CacheServerNamespacePrefix: Optional[str] = None + m_CacheServerValidationMode: Optional[int] = None + m_CachingShaderPreprocessor: Optional[bool] = None + m_CollabEditorSettings: Optional[CollabEditorSettings] = None + m_DefaultBehaviorMode: Optional[int] = None + m_DisableCookiesInLightmapper: Optional[bool] = None + m_EnableEditorAsyncCPUTextureLoading: Optional[bool] = None + m_EnableEnlightenBakedGI: Optional[bool] = None + m_EnableRoslynAnalyzers: Optional[bool] = None + m_EnableTextureStreamingInEditMode: Optional[bool] = None + m_EnableTextureStreamingInPlayMode: Optional[bool] = None + m_EnterPlayModeOptions: Optional[int] = None + m_EnterPlayModeOptionsEnabled: Optional[bool] = None + m_EtcTextureBestCompressor: Optional[int] = None + m_EtcTextureCompressorBehavior: Optional[int] = None + m_EtcTextureFastCompressor: Optional[int] = None + m_EtcTextureNormalCompressor: Optional[int] = None + m_ExternalVersionControlSupport: Optional[Union[str, int]] = None + m_GameObjectNamingDigits: Optional[int] = None + m_GameObjectNamingScheme: Optional[int] = None + m_InspectorUseIMGUIDefaultInspector: Optional[bool] = None + m_LineEndingsForNewScripts: Optional[int] = None + m_PrefabModeAllowAutoSave: Optional[bool] = None + m_PrefabRegularEnvironment: Optional[PPtr[SceneAsset]] = None + m_PrefabUIEnvironment: Optional[PPtr[SceneAsset]] = None + m_ProjectGenerationIncludedExtensions: Optional[str] = None + m_ProjectGenerationRootNamespace: Optional[str] = None + m_RecalculateEnvironmentLighting: Optional[bool] = None + m_ReferencedClipsExactNaming: Optional[bool] = None + m_RefreshImportMode: Optional[int] = None + m_SerializationMode: Optional[int] = None + m_SerializeInlineMappingsOnOneLine: Optional[bool] = None + m_ShowLightmapResolutionOverlay: Optional[bool] = None + m_SpritePackerCacheSize: Optional[int] = None + m_SpritePackerMode: Optional[int] = None + m_SpritePackerPaddingPower: Optional[int] = None + m_UseLegacyProbeSampleCount: Optional[bool] = None + m_UserGeneratedProjectSuffix: Optional[str] = None + m_WebSecurityEmulationEnabled: Optional[int] = None + m_WebSecurityEmulationHostUrl: Optional[str] = None + +@define(kw_only=True, slots=False) +class EditorUserBuildSettings(Object): + m_ActiveBuildTarget: int + m_AllowDebugging: bool + m_ArchitectureFlags: int + m_BuildLocation: List[str] + m_ConnectProfiler: bool + m_Development: bool + m_InstallInBuildFolder: bool + m_SelectedAndroidSubtarget: int + m_SelectedBuildTargetGroup: int + m_SelectedStandaloneTarget: int + m_ActiveBuildPlatformGroupName: Optional[str] = None + m_ActiveBuildTargetGroup: Optional[int] = None + m_ActivePlatformGuid: Optional[GUID] = None + m_ActiveProfilePath: Optional[str] = None + m_ActiveStandaloneBuildSubtarget: Optional[int] = None + m_AndroidBuildSystem: Optional[int] = None + m_AndroidBuildType: Optional[int] = None + m_AndroidCreateSymbols: Optional[int] = None + m_AndroidCreateSymbolsZip: Optional[bool] = None + m_AndroidCurrentDeploymentTargetId: Optional[str] = None + m_AndroidDebugMinification: Optional[int] = None + m_AndroidDeviceSocketAddress: Optional[str] = None + m_AndroidReleaseMinification: Optional[int] = None + m_AndroidUseLegacySdkTools: Optional[bool] = None + m_BuildAppBundle: Optional[bool] = None + m_BuildScriptsOnly: Optional[bool] = None + m_BuildWithDeepProfilingSupport: Optional[bool] = None + m_CompressFilesInPackage: Optional[bool] = None + m_CompressWithPsArc: Optional[bool] = None + m_CreateRomFileForSwitch: Optional[bool] = None + m_CreateSolutionFileForSwitch: Optional[bool] = None + m_DatalessPlayer: Optional[bool] = None + m_EnableDebugPadForSwitch: Optional[bool] = None + m_EnableHeadlessMode: Optional[bool] = None + m_EnableHeapInspectorForSwitch: Optional[bool] = None + m_EnableHostIOForSwitch: Optional[bool] = None + m_EnableMemoryTrackerForSwitch: Optional[bool] = None + m_EnableRomCompressionForSwitch: Optional[bool] = None + m_ExplicitArrayBoundsChecks: Optional[bool] = None + m_ExplicitDivideByZeroChecks: Optional[bool] = None + m_ExplicitNullChecks: Optional[bool] = None + m_ExportAsGoogleAndroidProject: Optional[bool] = None + m_FacebookAccessToken: Optional[str] = None + m_FacebookCreatePackageForSubmission: Optional[bool] = None + m_ForceInstallation: Optional[bool] = None + m_ForceOptimizeScriptCompilation: Optional[bool] = None + m_GenerateMetroReferenceProjects: Optional[bool] = None + m_GenerateNintendoSwitchShaderInfo: Optional[bool] = None + m_GenerateWSAReferenceProjects: Optional[bool] = None + m_HTCSScriptDebuggingForSwitch: Optional[bool] = None + m_Il2CppCodeGeneration: Optional[int] = None + m_MovePackageToDiscOuterEdge: Optional[bool] = None + m_NVNAftermath: Optional[bool] = None + m_NVNDrawValidation: Optional[bool] = None + m_NVNDrawValidationHeavy: Optional[bool] = None + m_NVNDrawValidationLight: Optional[bool] = None + m_NVNGraphicsDebuggerForSwitch: Optional[bool] = None + m_NVNShaderDebugging: Optional[bool] = None + m_NeedSubmissionMaterials: Optional[bool] = None + m_OverrideMaxTextureSize: Optional[int] = None + m_OverrideTextureCompression: Optional[int] = None + m_PS4HardwareTarget: Optional[int] = None + m_PS5KeepPackageFiles: Optional[bool] = None + m_PS5WorkspaceName: Optional[str] = None + m_PathOnRemoteDevice: Optional[str] = None + m_PlatformSettings: Optional[List[Tuple[str, PlatformSettingsData]]] = None + m_RedirectWritesToHostMountForSwitch: Optional[bool] = None + m_RemoteDeviceAddress: Optional[str] = None + m_RemoteDeviceExports: Optional[str] = None + m_RemoteDeviceInfo: Optional[bool] = None + m_RemoteDeviceUsername: Optional[str] = None + m_RomCompressionConfigForSwitch: Optional[str] = None + m_RomCompressionLevelForSwitch: Optional[int] = None + m_RomCompressionTypeForSwitch: Optional[int] = None + m_SaveADFForSwitch: Optional[bool] = None + m_SelectedAndroidETC2Fallback: Optional[int] = None + m_SelectedBlackBerryBuildType: Optional[int] = None + m_SelectedBlackBerrySubtarget: Optional[int] = None + m_SelectedBuildPlatformGroupName: Optional[str] = None + m_SelectedBuildTarget: Optional[int] = None + m_SelectedCompressionType: Optional[List[Tuple[str, int]]] = None + m_SelectedEmbeddedLinuxArchitecture: Optional[int] = None + m_SelectedFacebookTarget: Optional[int] = None + m_SelectedIOSBuildType: Optional[int] = None + m_SelectedMetroBuildAndRunDeployTarget: Optional[int] = None + m_SelectedMetroBuildType: Optional[int] = None + m_SelectedMetroSDK: Optional[int] = None + m_SelectedMetroTarget: Optional[int] = None + m_SelectedPS3Subtarget: Optional[int] = None + m_SelectedPS4Subtarget: Optional[int] = None + m_SelectedPS5CompressionLevel: Optional[int] = None + m_SelectedPS5CompressionType: Optional[int] = None + m_SelectedPS5Subtarget: Optional[int] = None + m_SelectedPSMSubtarget: Optional[int] = None + m_SelectedPSP2Subtarget: Optional[int] = None + m_SelectedQNXArchitecture: Optional[int] = None + m_SelectedQNXOsVersion: Optional[int] = None + m_SelectedStandaloneBuildSubtarget: Optional[int] = None + m_SelectedTizenSubtarget: Optional[int] = None + m_SelectedWSAArchitecture: Optional[str] = None + m_SelectedWSABuildAndRunDeployTarget: Optional[int] = None + m_SelectedWSAMinUWPSDK: Optional[str] = None + m_SelectedWSASDK: Optional[int] = None + m_SelectedWSASubtarget: Optional[int] = None + m_SelectedWSAUWPBuildType: Optional[int] = None + m_SelectedWSAUWPSDK: Optional[str] = None + m_SelectedWSAUWPVSVersion: Optional[str] = None + m_SelectedWebGLSubtarget: Optional[int] = None + m_SelectedWiiDebugLevel: Optional[int] = None + m_SelectedWiiSubtarget: Optional[int] = None + m_SelectedWiiUBootMode: Optional[int] = None + m_SelectedWiiUBuildOutput: Optional[int] = None + m_SelectedWiiUDebugLevel: Optional[int] = None + m_SelectedWindowsBuildAndRunDeployTarget: Optional[int] = None + m_SelectedXboxOneDeployDrive: Optional[int] = None + m_SelectedXboxOneDeployMethod: Optional[int] = None + m_SelectedXboxRunMethod: Optional[int] = None + m_SelectedXboxSubtarget: Optional[int] = None + m_SymlinkLibraries: Optional[bool] = None + m_SymlinkSources: Optional[bool] = None + m_SymlinkTrampoline: Optional[bool] = None + m_UseLegacyNvnPoolAllocatorForSwitch: Optional[bool] = None + m_WSADotNetNativeEnabled: Optional[List[bool]] = None + m_WaitForPlayerConnection: Optional[bool] = None + m_WaitForSwitchMemoryTrackerOnStartup: Optional[bool] = None + m_WebGLClientBrowserPath: Optional[str] = None + m_WebGLClientBrowserType: Optional[int] = None + m_WebGLClientPlatform: Optional[int] = None + m_WebGLOptimizationLevel: Optional[int] = None + m_WebGLUsePreBuiltUnityEngine: Optional[bool] = None + m_WebPlayerDeployOnline: Optional[bool] = None + m_WebPlayerNaClSupport: Optional[bool] = None + m_WebPlayerOfflineDeployment: Optional[bool] = None + m_WebPlayerStreamed: Optional[bool] = None + m_WiiUEnableNetAPI: Optional[bool] = None + m_WindowsDevicePortalAddress: Optional[str] = None + m_WindowsDevicePortalUsername: Optional[str] = None + m_WsaHolographicRemoting: Optional[bool] = None + m_XboxCompressedXex: Optional[bool] = None + m_XboxOneNetworkSharePath: Optional[str] = None + m_XboxOneStreamingInstallLaunchChunkRange: Optional[int] = None + m_XboxOneUsername: Optional[str] = None + m_macosXcodeBuildConfig: Optional[int] = None + +@define(kw_only=True, slots=False) +class EditorUserSettings(Object): + m_VCAutomaticAdd: bool + m_VCDebugCmd: bool + m_VCDebugCom: bool + m_VCDebugOut: bool + m_ArtifactGarbageCollection: Optional[bool] = None + m_AssetPipelineMode: Optional[int] = None + m_AssetPipelineMode2: Optional[int] = None + m_CacheServerMode: Optional[int] = None + m_CacheServers: Optional[List[str]] = None + m_CompressAssetsOnImport: Optional[bool] = None + m_ConfigSettings: Optional[List[Tuple[str, ConfigSetting]]] = None + m_ConfigValues: Optional[List[Tuple[str, str]]] = None + m_DesiredImportWorkerCount: Optional[int] = None + m_IdleImportWorkerShutdownDelay: Optional[int] = None + m_SemanticMergeMode: Optional[int] = None + m_StandbyImportWorkerCount: Optional[int] = None + m_VCAllowAsyncUpdate: Optional[bool] = None + m_VCHierarchyOverlayIcons: Optional[bool] = None + m_VCOtherOverlayIcons: Optional[bool] = None + m_VCOverlayIcons: Optional[bool] = None + m_VCOverwriteFailedCheckoutAssets: Optional[bool] = None + m_VCPassword: Optional[str] = None + m_VCProjectOverlayIcons: Optional[bool] = None + m_VCScanLocalPackagesOnConnect: Optional[bool] = None + m_VCServer: Optional[str] = None + m_VCShowFailedCheckout: Optional[bool] = None + m_VCUserName: Optional[str] = None + m_VCWorkspace: Optional[str] = None + +@define(kw_only=True, slots=False) +class EmptyObject(Object): + pass + +@define(kw_only=True, slots=False) +class GUIDSerializer(Object): + guidToPath: List[Tuple[GUID, str]] + +@define(kw_only=True, slots=False) +class GameManager(Object, ABC): + pass + +@define(kw_only=True, slots=False) +class GlobalGameManager(GameManager, ABC): + pass + +@define(kw_only=True, slots=False) +class AnimationManager(GlobalGameManager): + pass + +@define(kw_only=True, slots=False) +class AudioManager(GlobalGameManager): + Default_Speaker_Mode: int + Doppler_Factor: float + Rolloff_Scale: float + m_DSPBufferSize: int + m_Volume: float + m_AmbisonicDecoderPlugin: Optional[str] = None + m_DisableAudio: Optional[bool] = None + m_RealVoiceCount: Optional[int] = None + m_RequestedDSPBufferSize: Optional[int] = None + m_SampleRate: Optional[int] = None + m_SpatializerPlugin: Optional[str] = None + m_SpeedOfSound: Optional[float] = None + m_VirtualVoiceCount: Optional[int] = None + m_VirtualizeEffects: Optional[bool] = None + +@define(kw_only=True, slots=False) +class BuildSettings(GlobalGameManager): + enableDynamicBatching: bool + hasAdvancedVersion: bool + hasPROVersion: bool + hasPublishingRights: bool + hasShadows: bool + isEducationalBuild: bool + m_Version: str + buildGUID: Optional[Union[str, GUID]] = None + buildTags: Optional[List[str]] = None + enableMultipleDisplays: Optional[bool] = None + enabledVRDevices: Optional[List[str]] = None + hasClusterRendering: Optional[bool] = None + hasLocalLightShadows: Optional[bool] = None + hasOculusPlugin: Optional[bool] = None + hasRenderTexture: Optional[bool] = None + hasSoftShadows: Optional[bool] = None + isDebugBuild: Optional[bool] = None + isEmbedded: Optional[bool] = None + isNoWatermarkBuild: Optional[bool] = None + isPrototypingBuild: Optional[bool] = None + isTrial: Optional[bool] = None + isWsaHolographicRemotingEnabled: Optional[bool] = None + levels: Optional[List[str]] = None + m_AuthToken: Optional[str] = None + m_GraphicsAPIs: Optional[List[int]] = None + preloadedPlugins: Optional[List[str]] = None + runtimeClassHashes: Optional[Union[List[Tuple[int, int]], List[Tuple[int, Hash128]]]] = None + scenes: Optional[List[str]] = None + scriptHashes: Optional[List[Tuple[Hash128, Hash128]]] = None + usesOnMouseEvents: Optional[bool] = None + +@define(kw_only=True, slots=False) +class CloudWebServicesManager(GlobalGameManager): + pass + +@define(kw_only=True, slots=False) +class ClusterInputManager(GlobalGameManager): + m_Inputs: List[ClusterInput] + +@define(kw_only=True, slots=False) +class CrashReportManager(GlobalGameManager): + pass + +@define(kw_only=True, slots=False) +class DelayedCallManager(GlobalGameManager): + pass + +@define(kw_only=True, slots=False) +class GraphicsSettings(GlobalGameManager): + m_AlwaysIncludedShaders: List[PPtr[Shader]] + m_AllowEnlightenSupportForUpgradedProject: Optional[bool] = None + m_CameraRelativeLightCulling: Optional[bool] = None + m_CameraRelativeShadowCulling: Optional[bool] = None + m_CurrentRenderPipelineGlobalSettings: Optional[PPtr[Object]] = None + m_CustomRenderPipeline: Optional[PPtr[MonoBehaviour]] = None + m_DefaultRenderingLayerMask: Optional[int] = None + m_Deferred: Optional[BuiltinShaderSettings] = None + m_DeferredReflections: Optional[BuiltinShaderSettings] = None + m_DepthNormals: Optional[BuiltinShaderSettings] = None + m_LegacyDeferred: Optional[BuiltinShaderSettings] = None + m_LensFlare: Optional[BuiltinShaderSettings] = None + m_LightHalo: Optional[BuiltinShaderSettings] = None + m_LightProbeOutsideHullStrategy: Optional[int] = None + m_LightsUseCCT: Optional[bool] = None + m_LightsUseColorTemperature: Optional[bool] = None + m_LightsUseLinearIntensity: Optional[bool] = None + m_LogWhenShaderIsCompiled: Optional[bool] = None + m_MotionVectors: Optional[BuiltinShaderSettings] = None + m_PreloadShadersBatchTimeLimit: Optional[int] = None + m_PreloadedShaders: Optional[List[PPtr[ShaderVariantCollection]]] = None + m_SRPDefaultSettings: Optional[List[Tuple[str, PPtr[Object]]]] = None + m_ScreenSpaceShadows: Optional[BuiltinShaderSettings] = None + m_ShaderDefinesPerShaderCompiler: Optional[List[PlatformShaderDefines]] = None + m_ShaderSettings: Optional[PlatformShaderSettings] = None + m_ShaderSettings_Tier1: Optional[PlatformShaderSettings] = None + m_ShaderSettings_Tier2: Optional[PlatformShaderSettings] = None + m_ShaderSettings_Tier3: Optional[PlatformShaderSettings] = None + m_SpritesDefaultMaterial: Optional[PPtr[Material]] = None + m_TierSettings_Tier1: Optional[TierGraphicsSettings] = None + m_TierSettings_Tier2: Optional[TierGraphicsSettings] = None + m_TierSettings_Tier3: Optional[TierGraphicsSettings] = None + m_TransparencySortAxis: Optional[Vector3f] = None + m_TransparencySortMode: Optional[int] = None + m_VideoShadersIncludeMode: Optional[int] = None + +@define(kw_only=True, slots=False) +class InputManager(GlobalGameManager): + m_Axes: List[InputAxis] + m_UsePhysicalKeys: Optional[bool] = None + +@define(kw_only=True, slots=False) +class MasterServerInterface(GlobalGameManager): + pass + +@define(kw_only=True, slots=False) +class MonoManager(GlobalGameManager): + m_Scripts: List[PPtr[MonoScript]] + m_AssemblyNames: Optional[List[str]] = None + m_AssemblyTypes: Optional[List[int]] = None + m_RuntimeClassHashes: Optional[List[Tuple[int, Hash128]]] = None + m_ScriptHashes: Optional[List[Tuple[Hash128, Hash128]]] = None + +@define(kw_only=True, slots=False) +class MultiplayerManager(GlobalGameManager): + m_ActiveMultiplayerRole: Optional[int] = None + m_ActiveMultiplayerRoles: Optional[int] = None + +@define(kw_only=True, slots=False) +class NavMeshProjectSettings(GlobalGameManager): + areas: List[NavMeshAreaData] + m_LastAgentTypeID: Optional[int] = None + m_SettingNames: Optional[List[str]] = None + m_Settings: Optional[List[NavMeshBuildSettings]] = None + +@define(kw_only=True, slots=False) +class NetworkManager(GlobalGameManager): + m_AssetToPrefab: List[Tuple[GUID, PPtr[GameObject]]] + m_DebugLevel: int + m_Sendrate: float + +@define(kw_only=True, slots=False) +class NotificationManager(GlobalGameManager): + pass + +@define(kw_only=True, slots=False) +class PerformanceReportingManager(GlobalGameManager): + pass + +@define(kw_only=True, slots=False) +class Physics2DSettings(GlobalGameManager): + m_DefaultMaterial: PPtr[PhysicsMaterial2D] + m_Gravity: Vector2f + m_LayerCollisionMatrix: List[int] + m_PositionIterations: int + m_VelocityIterations: int + m_AngularSleepTolerance: Optional[float] = None + m_AutoSimulation: Optional[bool] = None + m_AutoSyncTransforms: Optional[bool] = None + m_BaumgarteScale: Optional[float] = None + m_BaumgarteTimeOfImpactScale: Optional[float] = None + m_BounceThreshold: Optional[float] = None + m_CallbacksOnDisable: Optional[bool] = None + m_ChangeStopsCallbacks: Optional[bool] = None + m_ContactThreshold: Optional[float] = None + m_DefaultContactOffset: Optional[float] = None + m_DeleteStopsCallbacks: Optional[bool] = None + m_JobOptions: Optional[PhysicsJobOptions2D] = None + m_LinearSleepTolerance: Optional[float] = None + m_MaxAngularCorrection: Optional[float] = None + m_MaxLinearCorrection: Optional[float] = None + m_MaxRotationSpeed: Optional[float] = None + m_MaxSubStepCount: Optional[int] = None + m_MaxTranslationSpeed: Optional[float] = None + m_MinPenetrationForPenalty: Optional[float] = None + m_MinSubStepFPS: Optional[float] = None + m_QueriesHitTriggers: Optional[bool] = None + m_QueriesStartInColliders: Optional[bool] = None + m_RaycastsHitTriggers: Optional[bool] = None + m_RaycastsStartInColliders: Optional[bool] = None + m_ReuseCollisionCallbacks: Optional[bool] = None + m_SimulationLayers: Optional[BitField] = None + m_SimulationMode: Optional[int] = None + m_TimeToSleep: Optional[float] = None + m_UseSubStepContacts: Optional[bool] = None + m_UseSubStepping: Optional[bool] = None + m_VelocityThreshold: Optional[float] = None + +@define(kw_only=True, slots=False) +class PhysicsManager(GlobalGameManager): + m_BounceThreshold: float + m_DefaultMaterial: Union[PPtr[PhysicMaterial], PPtr[PhysicsMaterial]] + m_Gravity: Vector3f + m_LayerCollisionMatrix: List[int] + m_AutoSimulation: Optional[bool] = None + m_AutoSyncTransforms: Optional[bool] = None + m_BroadphaseType: Optional[int] = None + m_ClothGravity: Optional[Vector3f] = None + m_ClothInterCollisionDistance: Optional[float] = None + m_ClothInterCollisionSettingsToggle: Optional[bool] = None + m_ClothInterCollisionStiffness: Optional[float] = None + m_ContactPairsMode: Optional[int] = None + m_ContactsGeneration: Optional[int] = None + m_CurrentBackendId: Optional[int] = None + m_DefaultContactOffset: Optional[float] = None + m_DefaultMaxAngluarSpeed: Optional[float] = None + m_DefaultMaxAngularSpeed: Optional[float] = None + m_DefaultMaxDepenetrationVelocity: Optional[float] = None + m_DefaultSolverIterations: Optional[int] = None + m_DefaultSolverVelocityIterations: Optional[int] = None + m_EnableAdaptiveForce: Optional[bool] = None + m_EnableEnhancedDeterminism: Optional[bool] = None + m_EnablePCM: Optional[bool] = None + m_EnableUnifiedHeightmaps: Optional[bool] = None + m_FastMotionThreshold: Optional[float] = None + m_FrictionType: Optional[int] = None + m_ImprovedPatchFriction: Optional[bool] = None + m_InvokeCollisionCallbacks: Optional[bool] = None + m_MaxAngularVelocity: Optional[float] = None + m_MinPenetrationForPenalty: Optional[float] = None + m_QueriesHitBackfaces: Optional[bool] = None + m_QueriesHitTriggers: Optional[bool] = None + m_RaycastsHitTriggers: Optional[bool] = None + m_ReuseCollisionCallbacks: Optional[bool] = None + m_ScratchBufferChunkCount: Optional[int] = None + m_SimulationMode: Optional[int] = None + m_SleepAngularVelocity: Optional[float] = None + m_SleepThreshold: Optional[float] = None + m_SleepVelocity: Optional[float] = None + m_SolverIterationCount: Optional[int] = None + m_SolverType: Optional[int] = None + m_SolverVelocityIterations: Optional[int] = None + m_WorldBounds: Optional[AABB] = None + m_WorldSubdivisions: Optional[int] = None + +@define(kw_only=True, slots=False) +class PlayerSettings(GlobalGameManager): + AndroidProfiler: bool + allowedAutorotateToLandscapeLeft: bool + allowedAutorotateToLandscapeRight: bool + allowedAutorotateToPortrait: bool + allowedAutorotateToPortraitUpsideDown: bool + companyName: str + defaultScreenHeight: int + defaultScreenHeightWeb: int + defaultScreenOrientation: int + defaultScreenWidth: int + defaultScreenWidthWeb: int + productName: str + runInBackground: bool + targetDevice: int + use32BitDisplayBuffer: bool + useMacAppStoreValidation: bool + useOSAutorotation: bool + usePlayerLog: bool + AID: Optional[Hash128] = None + AndroidEnableSustainedPerformanceMode: Optional[bool] = None + AndroidFilterTouchesWhenObscured: Optional[bool] = None + AndroidLicensePublicKey: Optional[str] = None + D3DHDRBitDepth: Optional[int] = None + Force_IOS_Speakers_When_Recording: Optional[bool] = None + Override_IPod_Music: Optional[bool] = None + Prepare_IOS_For_Recording: Optional[bool] = None + accelerometerFrequency: Optional[int] = None + activeInputHandler: Optional[int] = None + allowFullscreenSwitch: Optional[bool] = None + allowHDRDisplaySupport: Optional[bool] = None + androidApplicationEntry: Optional[int] = None + androidAutoRotationBehavior: Optional[int] = None + androidBlitType: Optional[int] = None + androidDefaultWindowHeight: Optional[int] = None + androidDefaultWindowWidth: Optional[int] = None + androidFullscreenMode: Optional[int] = None + androidMaxAspectRatio: Optional[float] = None + androidMinAspectRatio: Optional[float] = None + androidMinimumWindowHeight: Optional[int] = None + androidMinimumWindowWidth: Optional[int] = None + androidPredictiveBackSupport: Optional[bool] = None + androidRenderOutsideSafeArea: Optional[bool] = None + androidResizableWindow: Optional[bool] = None + androidResizeableActivity: Optional[bool] = None + androidShowActivityIndicatorOnLoading: Optional[int] = None + androidStartInFullscreen: Optional[bool] = None + androidSupportedAspectRatio: Optional[int] = None + androidUseSwappy: Optional[bool] = None + androidVulkanAllowFilterList: Optional[List[AndroidDeviceFilterData]] = None + androidVulkanDenyFilterList: Optional[List[AndroidDeviceFilterData]] = None + bakeCollisionMeshes: Optional[bool] = None + bundleIdentifier: Optional[str] = None + bundleVersion: Optional[str] = None + captureSingleScreen: Optional[bool] = None + cloudEnabled: Optional[bool] = None + cloudProjectId: Optional[str] = None + cpuConfiguration: Optional[List[int]] = None + cursorHotspot: Optional[Vector2f] = None + d3d11ForceExclusiveMode: Optional[bool] = None + d3d11FullscreenMode: Optional[int] = None + d3d9FullscreenMode: Optional[int] = None + debugUnloadMode: Optional[int] = None + dedicatedServerOptimizations: Optional[bool] = None + defaultCursor: Optional[PPtr[Texture2D]] = None + defaultIsFullScreen: Optional[bool] = None + defaultIsNativeResolution: Optional[bool] = None + deferSystemGesturesMode: Optional[int] = None + disableDepthAndStencilBuffers: Optional[bool] = None + disableOldInputManagerSupport: Optional[bool] = None + displayResolutionDialog: Optional[int] = None + enableFrameTimingStats: Optional[bool] = None + enableGamepadInput: Optional[bool] = None + enableHWStatistics: Optional[bool] = None + enableNativePlatformBackendsForNewInputSystem: Optional[bool] = None + enableNewInputSystem: Optional[bool] = None + enableOpenGLProfilerGPURecorders: Optional[bool] = None + forceSRGBBlit: Optional[bool] = None + forceSingleInstance: Optional[bool] = None + framebufferDepthMemorylessMode: Optional[int] = None + fullscreenMode: Optional[int] = None + gpuSkinning: Optional[bool] = None + graphicsJobMode: Optional[int] = None + graphicsJobs: Optional[bool] = None + hdrBitDepth: Optional[int] = None + hideHomeButton: Optional[bool] = None + hmiLoadingImage: Optional[PPtr[Texture2D]] = None + iPhoneBundleIdentifier: Optional[str] = None + ignoreAlphaClear: Optional[bool] = None + insecureHttpOption: Optional[int] = None + invalidatedPatternTexture: Optional[PPtr[Texture2D]] = None + iosAllowHTTPDownload: Optional[bool] = None + iosAppInBackgroundBehavior: Optional[int] = None + iosShowActivityIndicatorOnLoading: Optional[int] = None + iosUseCustomAppBackgroundBehavior: Optional[bool] = None + isWsaHolographicRemotingEnabled: Optional[bool] = None + legacyClampBlendShapeWeights: Optional[bool] = None + loadStoreDebugModeEnabled: Optional[bool] = None + m_ActiveColorSpace: Optional[int] = None + m_ColorGamuts: Optional[List[int]] = None + m_HolographicPauseOnTrackingLoss: Optional[bool] = None + m_HolographicTrackingLossScreen: Optional[PPtr[Texture2D]] = None + m_MTRendering: Optional[bool] = None + m_MobileMTRendering: Optional[bool] = None + m_MobileRenderingPath: Optional[int] = None + m_RenderingPath: Optional[int] = None + m_ShowUnitySplashLogo: Optional[bool] = None + m_ShowUnitySplashScreen: Optional[bool] = None + m_SplashScreenAnimation: Optional[int] = None + m_SplashScreenBackgroundAnimationZoom: Optional[float] = None + m_SplashScreenBackgroundColor: Optional[ColorRGBA] = None + m_SplashScreenBackgroundLandscape: Optional[PPtr[Texture2D]] = None + m_SplashScreenBackgroundLandscapeAspect: Optional[float] = None + m_SplashScreenBackgroundLandscapeUvs: Optional[Rectf] = None + m_SplashScreenBackgroundPortrait: Optional[PPtr[Texture2D]] = None + m_SplashScreenBackgroundPortraitAspect: Optional[float] = None + m_SplashScreenBackgroundPortraitUvs: Optional[Rectf] = None + m_SplashScreenDrawMode: Optional[int] = None + m_SplashScreenLogoAnimationZoom: Optional[float] = None + m_SplashScreenLogoStyle: Optional[int] = None + m_SplashScreenLogos: Optional[List[SplashScreenLogo]] = None + m_SplashScreenOverlayOpacity: Optional[float] = None + m_SplashScreenStyle: Optional[int] = None + m_SpriteBatchVertexThreshold: Optional[int] = None + m_StackTraceTypes: Optional[List[int]] = None + m_StereoRenderingPath: Optional[int] = None + m_Stereoscopic3D: Optional[bool] = None + m_SupportedAspectRatios: Optional[AspectRatios] = None + m_UnitySplashLogo: Optional[PPtr[Sprite]] = None + m_UseDX11: Optional[bool] = None + m_VirtualRealitySplashScreen: Optional[PPtr[Texture2D]] = None + macAppStoreCategory: Optional[str] = None + macFullscreenMode: Optional[int] = None + macRetinaSupport: Optional[bool] = None + meshDeformation: Optional[int] = None + metalFramebufferOnly: Optional[bool] = None + metroEnableIndependentInputSource: Optional[bool] = None + metroEnableLowLatencyPresentationAPI: Optional[bool] = None + metroInputSource: Optional[int] = None + mipStripping: Optional[bool] = None + mobileMTRenderingBaked: Optional[bool] = None + muteOtherAudioSources: Optional[bool] = None + n3dsDisableStereoscopicView: Optional[bool] = None + n3dsEnableSharedListOpt: Optional[bool] = None + n3dsEnableVSync: Optional[bool] = None + numberOfMipsStripped: Optional[int] = None + numberOfMipsStrippedPerMipmapLimitGroup: Optional[List[Tuple[str, int]]] = None + organizationId: Optional[str] = None + platformRequiresReadableAssets: Optional[bool] = None + playerDataPath: Optional[str] = None + playerMinOpenGLESVersion: Optional[int] = None + preloadedAssets: Optional[List[PPtr[Object]]] = None + preserveFramebufferAlpha: Optional[bool] = None + productGUID: Optional[GUID] = None + projectId: Optional[str] = None + projectName: Optional[str] = None + protectGraphicsMemory: Optional[bool] = None + ps3SplashScreen: Optional[PPtr[Texture2D]] = None + psp2AcquireBGM: Optional[bool] = None + psp2PowerMode: Optional[int] = None + qualitySettingsNames: Optional[List[str]] = None + resetResolutionOnWindowResize: Optional[bool] = None + resizableWindow: Optional[bool] = None + resolutionScalingMode: Optional[int] = None + singlePassStereoRendering: Optional[bool] = None + stadiaPresentMode: Optional[int] = None + stadiaTargetFramerate: Optional[int] = None + stripPhysics: Optional[bool] = None + submitAnalytics: Optional[bool] = None + switchAllowGpuScratchShrinking: Optional[bool] = None + switchGpuScratchPoolGranularity: Optional[int] = None + switchMaxWorkerMultiple: Optional[int] = None + switchNVNDefaultPoolsGranularity: Optional[int] = None + switchNVNGraphicsFirmwareMemory: Optional[int] = None + switchNVNMaxPublicSamplerIDCount: Optional[int] = None + switchNVNMaxPublicTextureIDCount: Optional[int] = None + switchNVNOtherPoolsGranularity: Optional[int] = None + switchNVNShaderPoolsGranularity: Optional[int] = None + switchQueueCommandMemory: Optional[int] = None + switchQueueComputeMemory: Optional[int] = None + switchQueueControlMemory: Optional[int] = None + targetGlesGraphics: Optional[int] = None + targetIOSGraphics: Optional[int] = None + targetPixelDensity: Optional[int] = None + targetPlatform: Optional[int] = None + targetResolution: Optional[int] = None + tizenShowActivityIndicatorOnLoading: Optional[int] = None + tvOSBundleVersion: Optional[str] = None + uiUse16BitDepthBuffer: Optional[bool] = None + unsupportedMSAAFallback: Optional[int] = None + uploadClearedTextureDataAfterCreationFromScript: Optional[bool] = None + use24BitDepthBuffer: Optional[bool] = None + useAlphaInDashboard: Optional[bool] = None + useFlipModelSwapchain: Optional[bool] = None + useHDRDisplay: Optional[bool] = None + useOnDemandResources: Optional[bool] = None + videoMemoryForVertexBuffers: Optional[int] = None + virtualRealitySupported: Optional[bool] = None + virtualTexturingSupportEnabled: Optional[bool] = None + visibleInBackground: Optional[bool] = None + visionOSBundleVersion: Optional[str] = None + vrSettings: Optional[VRSettings] = None + vulkanEnableCommandBufferRecycling: Optional[bool] = None + vulkanEnableLateAcquireNextImage: Optional[bool] = None + vulkanEnablePreTransform: Optional[bool] = None + vulkanEnableSetSRGBWrite: Optional[bool] = None + vulkanNumSwapchainBuffers: Optional[int] = None + vulkanUseSWCommandBuffers: Optional[bool] = None + wiiHio2Usage: Optional[int] = None + wiiLoadingScreenBackground: Optional[ColorRGBA] = None + wiiLoadingScreenFileName: Optional[str] = None + wiiLoadingScreenPeriod: Optional[int] = None + wiiLoadingScreenRect: Optional[Rectf] = None + wiiLoadingScreenRectPlacement: Optional[int] = None + wiiUAllowScreenCapture: Optional[bool] = None + wiiUControllerCount: Optional[int] = None + wiiUGamePadMSAA: Optional[int] = None + wiiUSupportsBalanceBoard: Optional[bool] = None + wiiUSupportsClassicController: Optional[bool] = None + wiiUSupportsMotionPlus: Optional[bool] = None + wiiUSupportsNunchuk: Optional[bool] = None + wiiUSupportsProController: Optional[bool] = None + wiiUTVResolution: Optional[int] = None + windowsGamepadBackendHint: Optional[int] = None + wsaTransparentSwapchain: Optional[bool] = None + xboxEnableAvatar: Optional[bool] = None + xboxEnableEnableRenderThreadRunsJobs: Optional[bool] = None + xboxEnableFitness: Optional[bool] = None + xboxEnableGuest: Optional[bool] = None + xboxEnableHeadOrientation: Optional[bool] = None + xboxEnableKinect: Optional[bool] = None + xboxEnableKinectAutoTracking: Optional[bool] = None + xboxEnablePIXSampling: Optional[bool] = None + xboxEnableSpeech: Optional[bool] = None + xboxOneDisableEsram: Optional[bool] = None + xboxOneDisableKinectGpuReservation: Optional[bool] = None + xboxOneEnable7thCore: Optional[bool] = None + xboxOneEnableTypeOptimization: Optional[bool] = None + xboxOneLoggingLevel: Optional[int] = None + xboxOneMonoLoggingLevel: Optional[int] = None + xboxOnePresentImmediateThreshold: Optional[int] = None + xboxOneResolution: Optional[int] = None + xboxOneSResolution: Optional[int] = None + xboxOneXResolution: Optional[int] = None + xboxPIXTextureCapture: Optional[bool] = None + xboxSkinOnGPU: Optional[bool] = None + xboxSpeechDB: Optional[int] = None + +@define(kw_only=True, slots=False) +class QualitySettings(GlobalGameManager): + Beautiful: Optional[QualitySetting] = None + Fantastic: Optional[QualitySetting] = None + Fast: Optional[QualitySetting] = None + Fastest: Optional[QualitySetting] = None + Good: Optional[QualitySetting] = None + Simple: Optional[QualitySetting] = None + m_CurrentQuality: Optional[int] = None + m_DefaultMobileQuality: Optional[int] = None + m_DefaultStandaloneQuality: Optional[int] = None + m_DefaultWebPlayerQuality: Optional[int] = None + m_EditorQuality: Optional[int] = None + m_QualitySettings: Optional[List[QualitySetting]] = None + m_StrippedMaximumLODLevel: Optional[int] = None + m_TextureMipmapLimitGroupNames: Optional[List[str]] = None + +@define(kw_only=True, slots=False) +class ResourceManager(GlobalGameManager): + m_Container: List[Tuple[str, PPtr[Object]]] + m_DependentAssets: Optional[List[ResourceManager_Dependency]] = None + +@define(kw_only=True, slots=False) +class RuntimeInitializeOnLoadManager(GlobalGameManager): + m_AfterAssembliesLoadedMethodExecutionOrders: Optional[List[int]] = None + m_AfterAssembliesLoadedUnityMethodExecutionOrders: Optional[List[int]] = None + m_AfterMethodExecutionOrders: Optional[List[int]] = None + m_AfterUnityMethodExecutionOrders: Optional[List[int]] = None + m_AssemblyNames: Optional[List[str]] = None + m_BeforeMethodExecutionOrders: Optional[List[int]] = None + m_BeforeSplashScreenMethodExecutionOrders: Optional[List[int]] = None + m_BeforeSplashScreenUnityMethodExecutionOrders: Optional[List[int]] = None + m_BeforeUnityMethodExecutionOrders: Optional[List[int]] = None + m_ClassInfos: Optional[List[ClassInfo]] = None + m_ClassMethodInfos: Optional[List[ClassMethodInfo]] = None + m_MethodExecutionOrders: Optional[List[int]] = None + m_NamespaceNames: Optional[List[str]] = None + m_SubsystemRegistrationMethodExecutionOrders: Optional[List[int]] = None + m_SubsystemRegistrationUnityMethodExecutionOrders: Optional[List[int]] = None + m_UnityMethodExecutionOrders: Optional[List[int]] = None + +@define(kw_only=True, slots=False) +class ShaderNameRegistry(GlobalGameManager): + m_PreloadShaders: bool + m_Shaders: NameToObjectMap + +@define(kw_only=True, slots=False) +class StreamingManager(GlobalGameManager): + pass + +@define(kw_only=True, slots=False) +class TagManager(GlobalGameManager): + tags: List[str] + Builtin_Layer_0: Optional[str] = None + Builtin_Layer_1: Optional[str] = None + Builtin_Layer_2: Optional[str] = None + Builtin_Layer_3: Optional[str] = None + Builtin_Layer_4: Optional[str] = None + Builtin_Layer_5: Optional[str] = None + Builtin_Layer_6: Optional[str] = None + Builtin_Layer_7: Optional[str] = None + User_Layer_10: Optional[str] = None + User_Layer_11: Optional[str] = None + User_Layer_12: Optional[str] = None + User_Layer_13: Optional[str] = None + User_Layer_14: Optional[str] = None + User_Layer_15: Optional[str] = None + User_Layer_16: Optional[str] = None + User_Layer_17: Optional[str] = None + User_Layer_18: Optional[str] = None + User_Layer_19: Optional[str] = None + User_Layer_20: Optional[str] = None + User_Layer_21: Optional[str] = None + User_Layer_22: Optional[str] = None + User_Layer_23: Optional[str] = None + User_Layer_24: Optional[str] = None + User_Layer_25: Optional[str] = None + User_Layer_26: Optional[str] = None + User_Layer_27: Optional[str] = None + User_Layer_28: Optional[str] = None + User_Layer_29: Optional[str] = None + User_Layer_30: Optional[str] = None + User_Layer_31: Optional[str] = None + User_Layer_8: Optional[str] = None + User_Layer_9: Optional[str] = None + layers: Optional[List[str]] = None + m_RenderingLayers: Optional[List[str]] = None + m_SortingLayers: Optional[List[SortingLayerEntry]] = None + +@define(kw_only=True, slots=False) +class TimeManager(GlobalGameManager): + Fixed_Timestep: Union[RationalTime, float] + Maximum_Allowed_Timestep: float + m_TimeScale: float + Maximum_Particle_Timestep: Optional[float] = None + +@define(kw_only=True, slots=False) +class UnityAdsManager(GlobalGameManager): + pass + +@define(kw_only=True, slots=False) +class UnityAnalyticsManager(GlobalGameManager): + m_Enabled: Optional[bool] = None + m_InitializeOnStartup: Optional[bool] = None + m_TestConfigUrl: Optional[str] = None + m_TestEventUrl: Optional[str] = None + m_TestMode: Optional[bool] = None + +@define(kw_only=True, slots=False) +class UnityConnectSettings(GlobalGameManager): + UnityAnalyticsSettings: UnityAnalyticsSettings + UnityPurchasingSettings: UnityPurchasingSettings + CrashReportingSettings: Optional[CrashReportingSettings] = None + PerformanceReportingSettings: Optional[PerformanceReportingSettings] = None + UnityAdsSettings: Optional[UnityAdsSettings] = None + m_ConfigUrl: Optional[str] = None + m_DashboardUrl: Optional[str] = None + m_Enabled: Optional[bool] = None + m_EventOldUrl: Optional[str] = None + m_EventUrl: Optional[str] = None + m_TestConfigUrl: Optional[str] = None + m_TestEventUrl: Optional[str] = None + m_TestInitMode: Optional[int] = None + m_TestMode: Optional[bool] = None + +@define(kw_only=True, slots=False) +class VFXManager(GlobalGameManager): + m_CopyBufferShader: PPtr[ComputeShader] + m_FixedTimeStep: float + m_IndirectShader: PPtr[ComputeShader] + m_MaxDeltaTime: float + m_RenderPipeSettingsPath: str + m_SortShader: PPtr[ComputeShader] + m_BatchEmptyLifetime: Optional[int] = None + m_CompiledVersion: Optional[int] = None + m_EmptyShader: Optional[PPtr[Shader]] = None + m_MaxCapacity: Optional[int] = None + m_MaxScrubTime: Optional[float] = None + m_RuntimeResources: Optional[PPtr[MonoBehaviour]] = None + m_RuntimeVersion: Optional[int] = None + m_StripUpdateShader: Optional[PPtr[ComputeShader]] = None + +@define(kw_only=True, slots=False) +class LevelGameManager(GameManager, ABC): + pass + +@define(kw_only=True, slots=False) +class HaloManager(LevelGameManager): + pass + +@define(kw_only=True, slots=False) +class LightmapSettings(LevelGameManager): + m_Lightmaps: List[LightmapData] + m_LightmapsMode: int + m_BakedColorSpace: Optional[int] = None + m_EnlightenSceneMapping: Optional[EnlightenSceneMapping] = None + m_GISettings: Optional[GISettings] = None + m_LightProbes: Optional[PPtr[LightProbes]] = None + m_LightingSettings: Optional[PPtr[LightingSettings]] = None + m_RuntimeCPUUsage: Optional[int] = None + m_ShadowMaskMode: Optional[int] = None + m_UseDualLightmapsInForward: Optional[bool] = None + m_UseShadowmask: Optional[bool] = None + +@define(kw_only=True, slots=False) +class NavMeshSettings(LevelGameManager): + m_NavMesh: Optional[PPtr[NavMesh]] = None + m_NavMeshData: Optional[PPtr[NavMeshData]] = None + +@define(kw_only=True, slots=False) +class OcclusionCullingSettings(LevelGameManager): + m_OcclusionCullingData: PPtr[OcclusionCullingData] + m_Portals: List[PPtr[OcclusionPortal]] + m_SceneGUID: GUID + m_StaticRenderers: List[PPtr[Renderer]] + +@define(kw_only=True, slots=False) +class RenderSettings(LevelGameManager): + m_FlareStrength: float + m_Fog: bool + m_FogColor: ColorRGBA + m_FogDensity: float + m_FogMode: int + m_HaloStrength: float + m_HaloTexture: PPtr[Texture2D] + m_LinearFogEnd: float + m_LinearFogStart: float + m_SkyboxMaterial: PPtr[Material] + m_SpotCookie: PPtr[Texture2D] + m_AmbientEquatorColor: Optional[ColorRGBA] = None + m_AmbientGroundColor: Optional[ColorRGBA] = None + m_AmbientIntensity: Optional[float] = None + m_AmbientLight: Optional[ColorRGBA] = None + m_AmbientMode: Optional[int] = None + m_AmbientProbe: Optional[SphericalHarmonicsL2] = None + m_AmbientProbeInGamma: Optional[SphericalHarmonicsL2] = None + m_AmbientSkyColor: Optional[ColorRGBA] = None + m_CustomReflection: Optional[Union[PPtr[Cubemap], PPtr[Texture]]] = None + m_DefaultReflectionMode: Optional[int] = None + m_DefaultReflectionResolution: Optional[int] = None + m_FlareFadeSpeed: Optional[float] = None + m_GeneratedSkyboxReflection: Optional[PPtr[Cubemap]] = None + m_IndirectSpecularColor: Optional[ColorRGBA] = None + m_ReflectionBounces: Optional[int] = None + m_ReflectionIntensity: Optional[float] = None + m_SubtractiveShadowColor: Optional[ColorRGBA] = None + m_Sun: Optional[PPtr[Light]] = None + m_UseRadianceAmbientProbe: Optional[bool] = None + +@define(kw_only=True, slots=False) +class HierarchyState(Object): + expanded: List[PPtr[Object]] + selection: List[PPtr[Object]] + scrollposition_x: Optional[float] = None + scrollposition_x: Optional[float] = None + scrollposition_y: Optional[float] = None + scrollposition_y: Optional[float] = None + +@define(kw_only=True, slots=False) +class InspectorExpandedState(Object): + m_ExpandedData: List[ExpandedData] + +@define(kw_only=True, slots=False) +class MarshallingTestObject(Object): + m_Prop: int + +@define(kw_only=True, slots=False) +class MemorySettings(Object): + pass + +@define(kw_only=True, slots=False) +class NScreenBridge(Object): + pass + +@define(kw_only=True, slots=False) +class NativeObjectType(Object): + m_Inner: NativeType + +@define(kw_only=True, slots=False) +class PackedAssets(Object): + m_Contents: List[BuildReportPackedAssetInfo] + m_Overhead: int + m_ShortPath: str + m_File: Optional[int] = None + +@define(kw_only=True, slots=False) +class PlatformModuleSetup(Object): + modules: List[Module] + +@define(kw_only=True, slots=False) +class PluginBuildInfo(Object): + m_EditorPlugins: List[str] + m_RuntimePlugins: List[str] + +@define(kw_only=True, slots=False) +class Prefab(Object): + m_RootGameObject: PPtr[GameObject] + m_ContainsMissingSerializeReferenceTypes: Optional[bool] = None + m_HideFlagsBehaviour: Optional[int] = None + m_IsExploded: Optional[bool] = None + m_IsPrefabAsset: Optional[bool] = None + m_IsPrefabParent: Optional[bool] = None + m_Modification: Optional[PrefabModification] = None + m_ParentPrefab: Optional[PPtr[Prefab]] = None + m_SourcePrefab: Optional[PPtr[Prefab]] = None + +@define(kw_only=True, slots=False) +class PrefabInstance(Object): + m_Modification: PrefabModification + m_RootGameObject: PPtr[GameObject] + m_SourcePrefab: PPtr[Prefab] + +@define(kw_only=True, slots=False) +class PresetManager(Object): + m_DefaultList: Optional[List[DefaultPresetList]] = None + m_DefaultPresets: Optional[List[Tuple[PresetType, List[DefaultPreset]]]] = None + +@define(kw_only=True, slots=False) +class PropertyModificationsTargetTestObject(Object): + m_Array: List[PropertyModificationsTargetTestNativeObject] + m_Data: PropertyModificationsTargetTestNativeObject + m_FloatTestValue: float + byte_data: Optional[bytes] = None + m_Bytes: Optional[List[int]] = None + m_BytesSize: Optional[int] = None + m_Floats: Optional[List[float]] = None + +@define(kw_only=True, slots=False) +class RenderPassAttachment(Object): + pass + +@define(kw_only=True, slots=False) +class SceneRoots(Object): + m_Roots: List[PPtr[Object]] + +@define(kw_only=True, slots=False) +class SceneVisibilityState(Object): + m_IsolationMode: Optional[bool] = None + m_MainStageIsolated: Optional[bool] = None + m_PrefabStageIsolated: Optional[bool] = None + m_SceneData: Optional[List[Tuple[SceneIdentifier, SceneVisibilityData]]] = None + m_ScenePickingData: Optional[SceneDataContainer] = None + m_SceneVisibilityData: Optional[SceneDataContainer] = None + m_SceneVisibilityDataIsolated: Optional[SceneDataContainer] = None + +@define(kw_only=True, slots=False) +class ScenesUsingAssets(Object): + m_ListOfScenesUsingEachAsset: List[Tuple[str, List[str]]] + m_ScenesUsingAssets: List[BuildReportScenesUsingAsset] + +@define(kw_only=True, slots=False) +class SerializableManagedHost(Object): + m_Script: PPtr[MonoScript] + +@define(kw_only=True, slots=False) +class SerializableManagedRefTestClass(Object): + m_Script: PPtr[MonoScript] + +@define(kw_only=True, slots=False) +class ShaderContainer(Object): + pass + +@define(kw_only=True, slots=False) +class SiblingDerived(Object): + pass + +@define(kw_only=True, slots=False) +class SpriteAtlasDatabase(Object): + pass + +@define(kw_only=True, slots=False) +class TestObjectVectorPairStringBool(Object): + m_Map: List[Tuple[str, bool]] + m_String: str + +@define(kw_only=True, slots=False) +class TestObjectWithSerializedAnimationCurve(Object): + m_Curve: AnimationCurve + +@define(kw_only=True, slots=False) +class TestObjectWithSerializedArray(Object): + m_ClampTestValue: float + m_IntegerArray: List[int] + +@define(kw_only=True, slots=False) +class TestObjectWithSerializedMapStringBool(Object): + m_Map: List[Tuple[str, bool]] + m_String: str + +@define(kw_only=True, slots=False) +class TestObjectWithSerializedMapStringNonAlignedStruct(Object): + m_Map: List[Tuple[str, NonAlignedStruct]] + m_String: str + +@define(kw_only=True, slots=False) +class TestObjectWithSpecialLayoutOne(Object): + differentLayout: LayoutDataOne + sameLayout: LayoutDataOne + +@define(kw_only=True, slots=False) +class TestObjectWithSpecialLayoutTwo(Object): + differentLayout: LayoutDataTwo + sameLayout: LayoutDataThree + +@define(kw_only=True, slots=False) +class TilemapEditorUserSettings(Object): + m_FocusMode: int + m_LastUsedPalette: PPtr[GameObject] + +@define(kw_only=True, slots=False) +class VersionControlSettings(Object): + m_Mode: str + m_CollabEditorSettings: Optional[CollabEditorSettings] = None + m_TrackPackagesOutsideProject: Optional[bool] = None + +@define(kw_only=True, slots=False) +class VideoBuildInfo(Object): + m_IsVideoModuleDisabled: bool + m_VideoClipCount: int + +@define(kw_only=True, slots=False) +class AABB: + m_Center: Vector3f + m_Extent: Vector3f + +@define(kw_only=True, slots=False) +class AddedComponent: + addedObject: PPtr[Component] + insertIndex: int + targetCorrespondingSourceObject: PPtr[GameObject] + +@define(kw_only=True, slots=False) +class AddedGameObject: + addedObject: PPtr[Transform] + insertIndex: int + targetCorrespondingSourceObject: PPtr[Transform] + +@define(kw_only=True, slots=False) +class AndroidDeviceFilterData: + androidOsVersionString: str + brandName: str + deviceName: str + driverVersionString: str + productName: str + vendorName: str + vulkanApiVersionString: str + +@define(kw_only=True, slots=False) +class AnimationClipBindingConstant: + genericBindings: List[GenericBinding] + pptrCurveMapping: List[PPtr[Object]] + +@define(kw_only=True, slots=False) +class AnimationClipOverride: + m_OriginalClip: PPtr[AnimationClip] + m_OverrideClip: PPtr[AnimationClip] + +@define(kw_only=True, slots=False) +class AnimationCurve: + m_Curve: List[Keyframe] + m_PostInfinity: int + m_PreInfinity: int + m_RotationOrder: Optional[int] = None + +@define(kw_only=True, slots=False) +class AnimationEvent: + data: str + floatParameter: float + functionName: str + intParameter: int + messageOptions: int + objectReferenceParameter: PPtr[Object] + time: float + +@define(kw_only=True, slots=False) +class AnimatorCondition: + m_ConditionEvent: str + m_ConditionMode: int + m_EventTreshold: float + +@define(kw_only=True, slots=False) +class Annotation: + m_ClassID: int + m_Flags: int + m_GizmoEnabled: bool + m_IconEnabled: bool + m_ScriptClass: str + +@define(kw_only=True, slots=False) +class ArticulationDrive: + damping: float + forceLimit: float + lowerLimit: float + stiffness: float + target: float + targetVelocity: float + upperLimit: float + driveType: Optional[int] = None + +@define(kw_only=True, slots=False) +class AspectRatios: + Others: bool + x16_10: bool + x16_9: bool + x4_3: bool + x5_4: bool + +@define(kw_only=True, slots=False) +class AssemblyJsonAsset(TextAsset): + m_Name: str + m_Script: str + m_PathName: Optional[str] = None + +@define(kw_only=True, slots=False) +class AssemblyJsonImporter(AssetImporter): + m_AssetBundleName: str + m_AssetBundleVariant: str + m_Name: str + m_UserData: str + m_ExternalObjects: Optional[List[Tuple[SourceAssetIdentifier, PPtr[Object]]]] = None + +@define(kw_only=True, slots=False) +class Asset: + children: List[GUID] + labels: AssetLabels + mainRepresentation: LibraryRepresentation + parent: GUID + representations: List[LibraryRepresentation] + type: int + assetBundleIndex: Optional[int] = None + digest: Optional[MdFour] = None + guidOfPathLocationDependencies: Optional[Union[List[Tuple[str, GUID]], List[Tuple[GUID, str]]]] = None + hash: Optional[Union[Hash128, MdFour]] = None + hashOfImportedAssetDependencies: Optional[List[GUID]] = None + hashOfSourceAssetDependencies: Optional[List[GUID]] = None + importerClassId: Optional[int] = None + importerVersionHash: Optional[int] = None + metaModificationDate_0_: Optional[int] = None + metaModificationDate_1_: Optional[int] = None + modificationDate_0_: Optional[int] = None + modificationDate_1_: Optional[int] = None + scriptedImporterClassID: Optional[str] = None + +@define(kw_only=True, slots=False) +class AssetBundleFullName: + m_AssetBundleName: str + m_AssetBundleVariant: str + +@define(kw_only=True, slots=False) +class AssetBundleInfo: + AssetBundleDependencies: List[int] + AssetBundleHash: Hash128 + +@define(kw_only=True, slots=False) +class AssetBundleScriptInfo: + assemblyName: str + className: str + hash: int + nameSpace: str + +@define(kw_only=True, slots=False) +class AssetDatabase(Object): + m_Assets: List[Tuple[GUID, Asset]] + m_AssetBundleNames: Optional[List[Tuple[int, AssetBundleFullName]]] = None + m_AssetTimeStamps: Optional[List[Tuple[str, AssetTimeStamp]]] = None + m_Metrics: Optional[AssetDatabaseMetrics] = None + m_UnityShadersVersion: Optional[int] = None + m_lastValidVersionHashes: Optional[List[Tuple[int, int]]] = None + +@define(kw_only=True, slots=False) +class AssetDatabaseMetrics: + totalAssetCount: int + nonProAssetCount: Optional[int] = None + nonProAssetsCreatedAfterProLicense: Optional[int] = None + +@define(kw_only=True, slots=False) +class AssetImporterHashKey: + ScriptClass: str + type: int + +@define(kw_only=True, slots=False) +class AssetImporterLog(NamedObject): + m_Logs: List[AssetImporter_ImportError] + m_Name: str + +@define(kw_only=True, slots=False) +class AssetImporter_ImportError: + error: str + file: str + line: int + mode: int + object: PPtr[Object] + +@define(kw_only=True, slots=False) +class AssetInfo: + asset: PPtr[Object] + preloadIndex: int + preloadSize: int + +@define(kw_only=True, slots=False) +class AssetLabels: + m_Labels: List[str] + +@define(kw_only=True, slots=False) +class AssetTimeStamp: + metaModificationDate_0_: int + metaModificationDate_1_: int + modificationDate_0_: int + modificationDate_1_: int + +@define(kw_only=True, slots=False) +class AttachmentIndexArray: + activeAttachments: int + attachments: List[int] + +@define(kw_only=True, slots=False) +class AttachmentInfo: + format: int + needsResolve: bool + +@define(kw_only=True, slots=False) +class AudioImporterOutput: + editorOutputContainerFormat: int + editorOutputSettings: SampleSettings + outputContainerFormat: int + outputSettings: SampleSettings + playerResource: Optional[StreamedResource] = None + +@define(kw_only=True, slots=False) +class AudioMixerConstant: + effectGUIDs: List[GUID] + effects: List[EffectConstant] + exposedParameterIndices: List[int] + exposedParameterNames: List[int] + groupGUIDs: List[GUID] + groupNameBuffer: List[str] + groups: List[GroupConstant] + numSideChainBuffers: int + pluginEffectNameBuffer: List[str] + snapshotGUIDs: List[GUID] + snapshotNameBuffer: List[str] + snapshots: List[SnapshotConstant] + groupConnections: Optional[List[GroupConnection]] = None + +@define(kw_only=True, slots=False) +class AudioMixerLiveUpdateBool(ABC): + pass + +@define(kw_only=True, slots=False) +class AudioMixerLiveUpdateFloat(ABC): + pass + +@define(kw_only=True, slots=False) +class AutoOffMeshLinkData: + m_Area: int + m_End: Vector3f + m_LinkDirection: int + m_LinkType: int + m_Radius: float + m_Start: Vector3f + +@define(kw_only=True, slots=False) +class AvatarBodyMask(NamedObject): + m_Mask: List[int] + m_Name: str + +@define(kw_only=True, slots=False) +class AvatarConstant: + m_Human: OffsetPtr + m_HumanSkeletonIndexArray: List[int] + m_RootMotionBoneIndex: int + m_RootMotionBoneX: xform + m_AvatarSkeleton: Optional[OffsetPtr] = None + m_AvatarSkeletonPose: Optional[OffsetPtr] = None + m_DefaultPose: Optional[OffsetPtr] = None + m_HumanSkeletonReverseIndexArray: Optional[List[int]] = None + m_RootMotionSkeleton: Optional[OffsetPtr] = None + m_RootMotionSkeletonIndexArray: Optional[List[int]] = None + m_RootMotionSkeletonPose: Optional[OffsetPtr] = None + m_Skeleton: Optional[OffsetPtr] = None + m_SkeletonNameIDArray: Optional[List[int]] = None + m_SkeletonPose: Optional[OffsetPtr] = None + +@define(kw_only=True, slots=False) +class AvatarSkeletonMaskElement: + path: str + weight: float + +@define(kw_only=True, slots=False) +class Axes: + m_Length: float + m_Limit: Limit + m_PostQ: float4 + m_PreQ: float4 + m_Sgn: Union[float3, float4] + m_Type: int + +@define(kw_only=True, slots=False) +class BitField: + m_Bits: int + +@define(kw_only=True, slots=False) +class Blend1dDataConstant: + m_ChildThresholdArray: List[float] + +@define(kw_only=True, slots=False) +class Blend2dDataConstant: + m_ChildMagnitudeArray: Optional[List[float]] = None + m_ChildNeighborListArray: Optional[List[MotionNeighborList]] = None + m_ChildPairAvgMagInvArray: Optional[List[float]] = None + m_ChildPairVectorArray: Optional[List[Vector2f]] = None + m_ChildPositionArray: Optional[List[Vector2f]] = None + m_ChildThresholdArray: Optional[List[float]] = None + +@define(kw_only=True, slots=False) +class BlendDirectDataConstant: + m_ChildBlendEventIDArray: List[int] + m_NormalizedBlendValues: bool + +@define(kw_only=True, slots=False) +class BlendShapeData: + channels: List[MeshBlendShapeChannel] + fullWeights: List[float] + shapes: List[MeshBlendShape] + vertices: List[BlendShapeVertex] + +@define(kw_only=True, slots=False) +class BlendShapeVertex: + index: int + normal: Vector3f + tangent: Vector3f + vertex: Vector3f + +@define(kw_only=True, slots=False) +class BlendTreeConstant: + m_NodeArray: List[OffsetPtr] + m_BlendEventArrayConstant: Optional[OffsetPtr] = None + +@define(kw_only=True, slots=False) +class BlendTreeNodeConstant: + m_BlendEventID: int + m_ChildIndices: List[int] + m_ClipID: int + m_Duration: float + m_Blend1dData: Optional[OffsetPtr] = None + m_Blend2dData: Optional[OffsetPtr] = None + m_BlendDirectData: Optional[OffsetPtr] = None + m_BlendEventYID: Optional[int] = None + m_BlendType: Optional[int] = None + m_ChildThresholdArray: Optional[List[float]] = None + m_ClipIndex: Optional[int] = None + m_CycleOffset: Optional[float] = None + m_Mirror: Optional[bool] = None + +@define(kw_only=True, slots=False) +class BoneInfluence: + boneIndex_0_: int + boneIndex_1_: int + boneIndex_2_: int + boneIndex_3_: int + weight_0_: float + weight_1_: float + weight_2_: float + weight_3_: float + +@define(kw_only=True, slots=False) +class BoneWeights4: + boneIndex_0_: int + boneIndex_1_: int + boneIndex_2_: int + boneIndex_3_: int + weight_0_: float + weight_1_: float + weight_2_: float + weight_3_: float + +@define(kw_only=True, slots=False) +class BranchWindLevel: + m_afBend_0: float + m_afBend_1: float + m_afBend_10: float + m_afBend_11: float + m_afBend_12: float + m_afBend_13: float + m_afBend_14: float + m_afBend_15: float + m_afBend_16: float + m_afBend_17: float + m_afBend_18: float + m_afBend_19: float + m_afBend_2: float + m_afBend_3: float + m_afBend_4: float + m_afBend_5: float + m_afBend_6: float + m_afBend_7: float + m_afBend_8: float + m_afBend_9: float + m_afFlexibility_0: float + m_afFlexibility_1: float + m_afFlexibility_10: float + m_afFlexibility_11: float + m_afFlexibility_12: float + m_afFlexibility_13: float + m_afFlexibility_14: float + m_afFlexibility_15: float + m_afFlexibility_16: float + m_afFlexibility_17: float + m_afFlexibility_18: float + m_afFlexibility_19: float + m_afFlexibility_2: float + m_afFlexibility_3: float + m_afFlexibility_4: float + m_afFlexibility_5: float + m_afFlexibility_6: float + m_afFlexibility_7: float + m_afFlexibility_8: float + m_afFlexibility_9: float + m_afOscillation_0: float + m_afOscillation_1: float + m_afOscillation_10: float + m_afOscillation_11: float + m_afOscillation_12: float + m_afOscillation_13: float + m_afOscillation_14: float + m_afOscillation_15: float + m_afOscillation_16: float + m_afOscillation_17: float + m_afOscillation_18: float + m_afOscillation_19: float + m_afOscillation_2: float + m_afOscillation_3: float + m_afOscillation_4: float + m_afOscillation_5: float + m_afOscillation_6: float + m_afOscillation_7: float + m_afOscillation_8: float + m_afOscillation_9: float + m_afSpeed_0: float + m_afSpeed_1: float + m_afSpeed_10: float + m_afSpeed_11: float + m_afSpeed_12: float + m_afSpeed_13: float + m_afSpeed_14: float + m_afSpeed_15: float + m_afSpeed_16: float + m_afSpeed_17: float + m_afSpeed_18: float + m_afSpeed_19: float + m_afSpeed_2: float + m_afSpeed_3: float + m_afSpeed_4: float + m_afSpeed_5: float + m_afSpeed_6: float + m_afSpeed_7: float + m_afSpeed_8: float + m_afSpeed_9: float + m_afTurbulence_0: float + m_afTurbulence_1: float + m_afTurbulence_10: float + m_afTurbulence_11: float + m_afTurbulence_12: float + m_afTurbulence_13: float + m_afTurbulence_14: float + m_afTurbulence_15: float + m_afTurbulence_16: float + m_afTurbulence_17: float + m_afTurbulence_18: float + m_afTurbulence_19: float + m_afTurbulence_2: float + m_afTurbulence_3: float + m_afTurbulence_4: float + m_afTurbulence_5: float + m_afTurbulence_6: float + m_afTurbulence_7: float + m_afTurbulence_8: float + m_afTurbulence_9: float + m_fIndependence: float + +@define(kw_only=True, slots=False) +class BufferBinding: + m_Index: int + m_NameIndex: int + m_ArraySize: Optional[int] = None + +@define(kw_only=True, slots=False) +class BuildReportFile: + id: int + path: str + role: str + totalSize: int + +@define(kw_only=True, slots=False) +class BuildReportPackedAssetInfo: + classID: int + fileID: int + packedSize: int + sourceAssetGUID: GUID + buildTimeAssetPath: Optional[str] = None + offset: Optional[int] = None + +@define(kw_only=True, slots=False) +class BuildReportScenesUsingAsset: + assetPath: str + scenePaths: List[str] + +@define(kw_only=True, slots=False) +class BuildStepInfo: + messages: List[BuildStepMessage] + stepName: str + depth: Optional[int] = None + duration: Optional[int] = None + durationTicks: Optional[int] = None + +@define(kw_only=True, slots=False) +class BuildStepMessage: + content: str + type: int + +@define(kw_only=True, slots=False) +class BuildSummary: + assetBundleOptions: int + crc: int + options: int + outputPath: str + platformName: str + totalErrors: int + totalSize: int + totalWarnings: int + buildGUID: Optional[GUID] = None + buildResult: Optional[int] = None + buildStartTime: Optional[DateTime] = None + buildType: Optional[int] = None + multiProcessEnabled: Optional[bool] = None + name: Optional[str] = None + platformGroupName: Optional[str] = None + subtarget: Optional[int] = None + success: Optional[bool] = None + totalTimeMS: Optional[int] = None + totalTimeTicks: Optional[int] = None + +@define(kw_only=True, slots=False) +class BuildTargetSettings: + m_BuildTarget: str + m_TextureFormat: int + m_AllowsAlphaSplitting: Optional[bool] = None + m_CompressionQuality: Optional[int] = None + m_LoadingBehavior: Optional[int] = None + m_MaxTextureSize: Optional[int] = None + m_TextureHeight: Optional[int] = None + m_TextureWidth: Optional[int] = None + +@define(kw_only=True, slots=False) +class BuildTextureStackReference: + groupName: str + itemName: str + +@define(kw_only=True, slots=False) +class BuiltAssetBundleInfo: + bundleArchiveFile: int + bundleName: str + packagedFileIndices: List[int] + +@define(kw_only=True, slots=False) +class BuiltinShaderSettings: + m_Mode: int + m_Shader: PPtr[Shader] + +@define(kw_only=True, slots=False) +class CGProgram(TextAsset): + m_Name: str + m_Script: str + m_PathName: Optional[str] = None + +@define(kw_only=True, slots=False) +class CachedAssetMetaData: + guid: GUID + originalChangeset: int + originalDigest: Union[Hash128, MdFour] + originalName: str + originalParent: GUID + pathName: str + +@define(kw_only=True, slots=False) +class Channel: + attributeName: str + byteOffset: int + curve: AnimationCurve + +@define(kw_only=True, slots=False) +class ChannelInfo: + dimension: int + format: int + offset: int + stream: int + +@define(kw_only=True, slots=False) +class CharacterInfo: + index: int + uv: Rectf + vert: Rectf + advance: Optional[float] = None + flipped: Optional[bool] = None + width: Optional[float] = None + +@define(kw_only=True, slots=False) +class Child: + m_IsAnim: bool + m_Motion: PPtr[Motion] + m_Threshold: float + m_TimeScale: float + m_CycleOffset: Optional[float] = None + m_Mirror: Optional[bool] = None + m_Position: Optional[Vector2f] = None + +@define(kw_only=True, slots=False) +class ChildAnimatorState: + m_Position: Vector3f + m_State: PPtr[AnimatorState] + +@define(kw_only=True, slots=False) +class ChildAnimatorStateMachine: + m_Position: Vector3f + m_StateMachine: PPtr[AnimatorStateMachine] + +@define(kw_only=True, slots=False) +class ChildMotion: + m_CycleOffset: float + m_DirectBlendParameter: str + m_Mirror: bool + m_Motion: PPtr[Motion] + m_Position: Vector2f + m_Threshold: float + m_TimeScale: float + +@define(kw_only=True, slots=False) +class ClampVelocityModule: + dampen: float + enabled: bool + magnitude: MinMaxCurve + separateAxis: bool + x: MinMaxCurve + y: MinMaxCurve + z: MinMaxCurve + drag: Optional[MinMaxCurve] = None + inWorldSpace: Optional[bool] = None + multiplyDragByParticleSize: Optional[bool] = None + multiplyDragByParticleVelocity: Optional[bool] = None + +@define(kw_only=True, slots=False) +class ClassInfo: + m_AssemblyNameIndex: int + m_ClassName: str + m_IsUnityClass: bool + m_MethodIndex: int + m_NamespaceIndex: int + m_NumOfMethods: int + m_NamespaceName: Optional[str] = None + +@define(kw_only=True, slots=False) +class ClassMethodInfo: + m_ClassIndex: int + m_MethodName: str + m_OrderNumber: int + +@define(kw_only=True, slots=False) +class Clip: + m_DenseClip: DenseClip + m_StreamedClip: StreamedClip + m_Binding: Optional[OffsetPtr] = None + m_ConstantClip: Optional[ConstantClip] = None + +@define(kw_only=True, slots=False) +class ClipAnimationInfo: + firstFrame: Union[int, float] + lastFrame: Union[int, float] + loop: bool + name: str + wrapMode: int + additiveReferencePoseFrame: Optional[float] = None + bodyMask: Optional[List[int]] = None + curves: Optional[List[ClipAnimationInfoCurve]] = None + cycleOffset: Optional[float] = None + events: Optional[List[AnimationEvent]] = None + hasAdditiveReferencePose: Optional[bool] = None + heightFromFeet: Optional[bool] = None + internalID: Optional[int] = None + keepAdditionalBonesAnimation: Optional[bool] = None + keepOriginalOrientation: Optional[bool] = None + keepOriginalPositionXZ: Optional[bool] = None + keepOriginalPositionY: Optional[bool] = None + level: Optional[float] = None + loopBlend: Optional[bool] = None + loopBlendOrientation: Optional[bool] = None + loopBlendPositionXZ: Optional[bool] = None + loopBlendPositionY: Optional[bool] = None + loopTime: Optional[bool] = None + maskSource: Optional[PPtr[AvatarMask]] = None + maskType: Optional[int] = None + mirror: Optional[bool] = None + orientationOffsetY: Optional[float] = None + skeletonMaskElements: Optional[List[AvatarSkeletonMaskElement]] = None + takeName: Optional[str] = None + transformMask: Optional[List[TransformMaskElement]] = None + +@define(kw_only=True, slots=False) +class ClipAnimationInfoCurve: + curve: AnimationCurve + name: str + +@define(kw_only=True, slots=False) +class ClipMuscleConstant: + m_AverageAngularSpeed: float + m_AverageSpeed: Union[float3, float4] + m_Clip: OffsetPtr + m_CycleOffset: float + m_DeltaPose: HumanPose + m_HeightFromFeet: bool + m_IndexArray: List[int] + m_KeepOriginalOrientation: bool + m_KeepOriginalPositionXZ: bool + m_KeepOriginalPositionY: bool + m_LeftFootStartX: xform + m_Level: float + m_LoopBlend: bool + m_LoopBlendOrientation: bool + m_LoopBlendPositionXZ: bool + m_LoopBlendPositionY: bool + m_Mirror: bool + m_OrientationOffsetY: float + m_RightFootStartX: xform + m_StartTime: float + m_StartX: xform + m_StopTime: float + m_ValueArrayDelta: List[ValueDelta] + m_AdditionalCurveIndexArray: Optional[List[int]] = None + m_LoopTime: Optional[bool] = None + m_MotionStartX: Optional[xform] = None + m_MotionStopX: Optional[xform] = None + m_StartAtOrigin: Optional[bool] = None + m_StopX: Optional[xform] = None + m_ValueArrayReferencePose: Optional[List[float]] = None + +@define(kw_only=True, slots=False) +class ClothAttachment: + m_Collider: PPtr[Collider] + m_Tearable: bool + m_TwoWayInteraction: bool + +@define(kw_only=True, slots=False) +class ClothConstrainCoefficients: + collisionSphereDistance: float + maxDistance: float + collisionSphereRadius: Optional[float] = None + maxDistanceBias: Optional[float] = None + +@define(kw_only=True, slots=False) +class ClothSphereColliderPair: + first: PPtr[SphereCollider] + second: PPtr[SphereCollider] + +@define(kw_only=True, slots=False) +class ClusterInput: + m_DeviceName: str + m_Index: int + m_Name: str + m_ServerUrl: str + m_Type: int + +@define(kw_only=True, slots=False) +class CollabEditorSettings: + inProgressEnabled: bool + +@define(kw_only=True, slots=False) +class Collision(ABC): + pass + +@define(kw_only=True, slots=False) +class Collision2D(ABC): + pass + +@define(kw_only=True, slots=False) +class CollisionModule: + enabled: bool + minKillSpeed: float + type: int + bounce: Optional[float] = None + colliderForce: Optional[float] = None + collidesWith: Optional[BitField] = None + collidesWithDynamic: Optional[bool] = None + collisionMessages: Optional[bool] = None + collisionMode: Optional[int] = None + dampen: Optional[float] = None + energyLossOnCollision: Optional[float] = None + interiorCollisions: Optional[bool] = None + m_Bounce: Optional[MinMaxCurve] = None + m_Dampen: Optional[MinMaxCurve] = None + m_EnergyLossOnCollision: Optional[MinMaxCurve] = None + m_Planes: Optional[List[PPtr[Transform]]] = None + maxCollisionShapes: Optional[int] = None + maxKillSpeed: Optional[float] = None + multiplyColliderForceByCollisionAngle: Optional[bool] = None + multiplyColliderForceByParticleSize: Optional[bool] = None + multiplyColliderForceByParticleSpeed: Optional[bool] = None + particleRadius: Optional[float] = None + plane0: Optional[PPtr[Transform]] = None + plane1: Optional[PPtr[Transform]] = None + plane2: Optional[PPtr[Transform]] = None + plane3: Optional[PPtr[Transform]] = None + plane4: Optional[PPtr[Transform]] = None + plane5: Optional[PPtr[Transform]] = None + quality: Optional[int] = None + radiusScale: Optional[float] = None + voxelSize: Optional[float] = None + +@define(kw_only=True, slots=False) +class ColorBySpeedModule: + enabled: bool + gradient: MinMaxGradient + range: Vector2f + +@define(kw_only=True, slots=False) +class ColorModule: + enabled: bool + gradient: MinMaxGradient + +@define(kw_only=True, slots=False) +class ComponentPair: + component: PPtr[Component] + +@define(kw_only=True, slots=False) +class CompressedAnimationCurve: + m_Path: str + m_PostInfinity: int + m_PreInfinity: int + m_Slopes: PackedBitVector + m_Times: PackedBitVector + m_Values: PackedBitVector + +@define(kw_only=True, slots=False) +class CompressedMesh: + m_BoneIndices: PackedBitVector + m_NormalSigns: PackedBitVector + m_Normals: PackedBitVector + m_TangentSigns: PackedBitVector + m_Tangents: PackedBitVector + m_Triangles: PackedBitVector + m_UV: PackedBitVector + m_Vertices: PackedBitVector + m_Weights: PackedBitVector + m_BindPoses: Optional[PackedBitVector] = None + m_Colors: Optional[PackedBitVector] = None + m_FloatColors: Optional[PackedBitVector] = None + m_UVInfo: Optional[int] = None + +@define(kw_only=True, slots=False) +class ComputeBufferCounter: + bindpoint: int + offset: int + +@define(kw_only=True, slots=False) +class ComputeShaderBuiltinSampler: + bindPoint: int + sampler: int + +@define(kw_only=True, slots=False) +class ComputeShaderCB: + byteSize: int + name: Union[FastPropertyName, str] + params: List[ComputeShaderParam] + +@define(kw_only=True, slots=False) +class ComputeShaderKernel: + builtinSamplers: List[ComputeShaderBuiltinSampler] + cbs: List[ComputeShaderResource] + code: List[int] + inBuffers: List[ComputeShaderResource] + outBuffers: List[ComputeShaderResource] + textures: List[ComputeShaderResource] + cbVariantIndices: Optional[List[int]] = None + name: Optional[Union[FastPropertyName, str]] = None + requirements: Optional[int] = None + threadGroupSize: Optional[List[int]] = None + +@define(kw_only=True, slots=False) +class ComputeShaderKernelParent: + name: str + dynamicKeywords: Optional[List[str]] = None + globalKeywords: Optional[List[str]] = None + localKeywords: Optional[List[str]] = None + uniqueVariants: Optional[List[ComputeShaderKernel]] = None + validKeywords: Optional[List[str]] = None + variantIndices: Optional[List[Tuple[str, int]]] = None + variantMap: Optional[List[Tuple[str, ComputeShaderKernel]]] = None + +@define(kw_only=True, slots=False) +class ComputeShaderParam: + arraySize: int + colCount: int + name: Union[FastPropertyName, str] + offset: int + rowCount: int + type: int + +@define(kw_only=True, slots=False) +class ComputeShaderPlatformVariant: + constantBuffers: List[ComputeShaderCB] + kernels: List[ComputeShaderKernelParent] + resourcesResolved: bool + targetLevel: int + targetRenderer: int + +@define(kw_only=True, slots=False) +class ComputeShaderResource: + bindPoint: int + name: Union[FastPropertyName, str] + counter: Optional[ComputeBufferCounter] = None + generatedName: Optional[Union[FastPropertyName, str]] = None + samplerBindPoint: Optional[int] = None + secondaryBindPoint: Optional[int] = None + texDimension: Optional[int] = None + +@define(kw_only=True, slots=False) +class ComputeShaderVariant: + constantBuffers: List[ComputeShaderCB] + kernels: List[ComputeShaderKernel] + targetLevel: int + targetRenderer: int + resourcesResolved: Optional[bool] = None + +@define(kw_only=True, slots=False) +class Condition: + m_ConditionEvent: str + m_ConditionMode: int + m_EventTreshold: float + m_ExitTime: float + +@define(kw_only=True, slots=False) +class ConditionConstant: + m_ConditionMode: int + m_EventID: int + m_EventThreshold: float + m_ExitTime: float + +@define(kw_only=True, slots=False) +class ConfigSetting: + flags: int + value: str + +@define(kw_only=True, slots=False) +class ConstantBuffer: + m_MatrixParams: List[MatrixParameter] + m_NameIndex: int + m_Size: int + m_VectorParams: List[VectorParameter] + m_IsPartialCB: Optional[bool] = None + m_StructParams: Optional[List[StructParameter]] = None + +@define(kw_only=True, slots=False) +class ConstantClip: + data: List[float] + +@define(kw_only=True, slots=False) +class ConstraintSource: + sourceTransform: PPtr[Transform] + weight: float + +@define(kw_only=True, slots=False) +class ControllerConstant: + m_DefaultValues: OffsetPtr + m_StateMachineArray: List[OffsetPtr] + m_Values: OffsetPtr + m_HumanLayerArray: Optional[List[OffsetPtr]] = None + m_LayerArray: Optional[List[OffsetPtr]] = None + +@define(kw_only=True, slots=False) +class CrashReportingSettings: + m_Enabled: bool + m_EventUrl: str + m_LogBufferSize: Optional[int] = None + m_NativeEventUrl: Optional[str] = None + +@define(kw_only=True, slots=False) +class CustomDataModule: + color0: MinMaxGradient + color1: MinMaxGradient + enabled: bool + mode0: int + mode1: int + vector0_0: MinMaxCurve + vector0_1: MinMaxCurve + vector0_2: MinMaxCurve + vector0_3: MinMaxCurve + vector1_0: MinMaxCurve + vector1_1: MinMaxCurve + vector1_2: MinMaxCurve + vector1_3: MinMaxCurve + vectorComponentCount0: int + vectorComponentCount1: int + +@define(kw_only=True, slots=False) +class DataTemplate(NamedObject): + m_Father: PPtr[DataTemplate] + m_IsDataTemplate: bool + m_LastMergeIdentifier: GUID + m_Name: str + m_Objects: List[PPtr[EditorExtension]] + +@define(kw_only=True, slots=False) +class DateTime: + ticks: int + +@define(kw_only=True, slots=False) +class DefaultPreset: + m_Preset: PPtr[Preset] + m_Disabled: Optional[bool] = None + m_Filter: Optional[str] = None + +@define(kw_only=True, slots=False) +class DefaultPresetList: + defaultPresets: List[DefaultPreset] + type: PresetType + +@define(kw_only=True, slots=False) +class DeletedItem: + changeset: int + digest: Union[Hash128, MdFour] + fullPath: str + guid: GUID + parent: GUID + type: int + +@define(kw_only=True, slots=False) +class DenseClip: + m_BeginTime: float + m_CurveCount: int + m_FrameCount: int + m_SampleArray: List[float] + m_SampleRate: float + +@define(kw_only=True, slots=False) +class DetailDatabase: + WavingGrassTint: ColorRGBA + m_DetailPrototypes: List[DetailPrototype] + m_PatchCount: int + m_PatchSamples: int + m_Patches: List[DetailPatch] + m_PreloadTextureAtlasData: List[PPtr[Texture2D]] + m_TreeInstances: List[TreeInstance] + m_TreePrototypes: List[TreePrototype] + m_WavingGrassAmount: float + m_WavingGrassSpeed: float + m_WavingGrassStrength: float + m_DefaultShaders_0_: Optional[PPtr[Shader]] = None + m_DefaultShaders_1_: Optional[PPtr[Shader]] = None + m_DefaultShaders_2_: Optional[PPtr[Shader]] = None + m_DetailBillboardShader: Optional[PPtr[Shader]] = None + m_DetailMeshGrassShader: Optional[PPtr[Shader]] = None + m_DetailMeshLitShader: Optional[PPtr[Shader]] = None + m_DetailScatterMode: Optional[int] = None + m_RandomRotations: Optional[List[Vector3f]] = None + +@define(kw_only=True, slots=False) +class DetailPatch: + layerIndices: List[int] + bounds: Optional[AABB] = None + coverage: Optional[List[int]] = None + numberOfObjects: Optional[List[int]] = None + +@define(kw_only=True, slots=False) +class DetailPrototype: + dryColor: ColorRGBA + healthyColor: ColorRGBA + maxHeight: float + maxWidth: float + minHeight: float + minWidth: float + noiseSpread: float + prototype: PPtr[GameObject] + prototypeTexture: PPtr[Texture2D] + renderMode: int + usePrototypeMesh: int + alignToGround: Optional[float] = None + bendFactor: Optional[float] = None + density: Optional[float] = None + holeTestRadius: Optional[float] = None + lightmapFactor: Optional[float] = None + noiseSeed: Optional[int] = None + positionJitter: Optional[float] = None + positionOrderliness: Optional[float] = None + targetCoverage: Optional[float] = None + useDensityScaling: Optional[int] = None + useInstancing: Optional[int] = None + +@define(kw_only=True, slots=False) +class DeviceNone: + pass + +@define(kw_only=True, slots=False) +class DirectorGenericBinding: + key: PPtr[Object] + value: PPtr[Object] + +@define(kw_only=True, slots=False) +class DirectorPlayer(Behaviour): + m_GameObject: PPtr[GameObject] + +@define(kw_only=True, slots=False) +class EffectConstant: + bypass: bool + groupConstantIndex: int + parameterIndices: List[int] + prevEffectIndex: int + sendTargetEffectIndex: int + type: int + wetMixLevelIndex: int + +@define(kw_only=True, slots=False) +class EmbeddedNativeType: + m_FloatArray: List[float] + m_String: str + +@define(kw_only=True, slots=False) +class EmissionModule: + enabled: bool + m_BurstCount: int + cnt0: Optional[int] = None + cnt1: Optional[int] = None + cnt2: Optional[int] = None + cnt3: Optional[int] = None + cntmax0: Optional[int] = None + cntmax1: Optional[int] = None + cntmax2: Optional[int] = None + cntmax3: Optional[int] = None + m_Bursts: Optional[List[ParticleSystemEmissionBurst]] = None + m_Type: Optional[int] = None + rate: Optional[MinMaxCurve] = None + rateOverDistance: Optional[MinMaxCurve] = None + rateOverTime: Optional[MinMaxCurve] = None + time0: Optional[float] = None + time1: Optional[float] = None + time2: Optional[float] = None + time3: Optional[float] = None + +@define(kw_only=True, slots=False) +class EnlightenRendererInformation: + dynamicLightmapSTInSystem: Vector4f + instanceHash: Hash128 + renderer: PPtr[Object] + systemId: int + +@define(kw_only=True, slots=False) +class EnlightenSceneMapping: + m_Renderers: List[EnlightenRendererInformation] + m_SystemAtlases: List[EnlightenSystemAtlasInformation] + m_Systems: List[EnlightenSystemInformation] + m_TerrainChunks: List[EnlightenTerrainChunksInformation] + m_Probesets: Optional[List[Hash128]] = None + +@define(kw_only=True, slots=False) +class EnlightenSystemAtlasInformation: + atlasHash: Hash128 + atlasSize: int + firstSystemId: int + +@define(kw_only=True, slots=False) +class EnlightenSystemInformation: + atlasIndex: int + atlasOffsetX: int + atlasOffsetY: int + inputSystemHash: Hash128 + radiositySystemHash: Hash128 + rendererIndex: int + rendererSize: int + +@define(kw_only=True, slots=False) +class EnlightenTerrainChunksInformation: + firstSystemId: int + numChunksInX: int + numChunksInY: int + +@define(kw_only=True, slots=False) +class ExpandedData: + m_ClassID: int + m_ExpandedProperties: List[str] + m_InspectorExpanded: bool + m_ScriptClass: str + +@define(kw_only=True, slots=False) +class ExposedReferenceTable: + m_References: List[Tuple[str, PPtr[Object]]] + +@define(kw_only=True, slots=False) +class Expression: + data_0_: int + data_1_: int + data_2_: int + data_3_: int + op: int + valueIndex: int + +@define(kw_only=True, slots=False) +class ExtensionPropertyValue: + extensionName: str + pluginName: str + propertyName: str + propertyValue: float + +@define(kw_only=True, slots=False) +class ExternalForcesModule: + enabled: bool + influenceFilter: Optional[int] = None + influenceList: Optional[List[PPtr[ParticleSystemForceField]]] = None + influenceMask: Optional[BitField] = None + multiplier: Optional[float] = None + multiplierCurve: Optional[MinMaxCurve] = None + +@define(kw_only=True, slots=False) +class FalloffTable: + m_Table_0_: float + m_Table_10_: float + m_Table_11_: float + m_Table_12_: float + m_Table_1_: float + m_Table_2_: float + m_Table_3_: float + m_Table_4_: float + m_Table_5_: float + m_Table_6_: float + m_Table_7_: float + m_Table_8_: float + m_Table_9_: float + +@define(kw_only=True, slots=False) +class FastPropertyName: + name: str + +@define(kw_only=True, slots=False) +class FlareElement: + m_Color: ColorRGBA + m_Fade: bool + m_ImageIndex: int + m_Position: float + m_Rotate: bool + m_Size: float + m_UseLightColor: bool + m_Zoom: bool + +@define(kw_only=True, slots=False) +class FloatCurve: + attribute: str + classID: int + curve: AnimationCurve + path: str + script: PPtr[MonoScript] + flags: Optional[int] = None + +@define(kw_only=True, slots=False) +class ForceModule: + enabled: bool + inWorldSpace: bool + randomizePerFrame: bool + x: MinMaxCurve + y: MinMaxCurve + z: MinMaxCurve + +@define(kw_only=True, slots=False) +class GISettings: + m_AlbedoBoost: float + m_BounceScale: float + m_EnableBakedLightmaps: bool + m_EnableRealtimeLightmaps: bool + m_EnvironmentLightingMode: int + m_IndirectOutputScale: float + m_TemporalCoherenceThreshold: Optional[float] = None + +@define(kw_only=True, slots=False) +class GLTextureSettings: + m_Aniso: int + m_FilterMode: int + m_MipBias: float + m_WrapMode: Optional[int] = None + m_WrapU: Optional[int] = None + m_WrapV: Optional[int] = None + m_WrapW: Optional[int] = None + +@define(kw_only=True, slots=False) +class GUID: + data_0_: int + data_1_: int + data_2_: int + data_3_: int + +@define(kw_only=True, slots=False) +class GenericBinding: + attribute: int + customType: int + isPPtrCurve: int + path: int + script: PPtr[Object] + classID: Optional[int] = None + isIntCurve: Optional[int] = None + isSerializeReferenceCurve: Optional[int] = None + typeID: Optional[int] = None + +@define(kw_only=True, slots=False) +class GfxBlendState: + alphaToMask: int + rt: List[GfxRenderTargetBlendState] + separateMRTBlend: int + +@define(kw_only=True, slots=False) +class GfxDepthState: + depthFunc: int + depthWrite: int + +@define(kw_only=True, slots=False) +class GfxRasterState: + conservative: int + cullMode: int + depthBias: int + depthClip: int + slopeScaledDepthBias: float + +@define(kw_only=True, slots=False) +class GfxRenderTargetBlendState: + blendOp: int + blendOpAlpha: int + dstBlend: int + dstBlendAlpha: int + srcBlend: int + srcBlendAlpha: int + writeMask: int + +@define(kw_only=True, slots=False) +class GfxStencilState: + padding: int + readMask: int + stencilEnable: int + stencilFailOpBack: int + stencilFailOpFront: int + stencilFuncBack: int + stencilFuncFront: int + stencilPassOpBack: int + stencilPassOpFront: int + stencilZFailOpBack: int + stencilZFailOpFront: int + writeMask: int + +@define(kw_only=True, slots=False) +class Google: + depthFormat: int + enableTransitionView: Optional[bool] = None + enableVideoLayer: Optional[bool] = None + maximumSupportedHeadTracking: Optional[int] = None + minimumSupportedHeadTracking: Optional[int] = None + useProtectedVideoMemory: Optional[bool] = None + useSustainedPerformanceMode: Optional[bool] = None + +@define(kw_only=True, slots=False) +class Gradient: + atime0: Optional[int] = None + atime1: Optional[int] = None + atime2: Optional[int] = None + atime3: Optional[int] = None + atime4: Optional[int] = None + atime5: Optional[int] = None + atime6: Optional[int] = None + atime7: Optional[int] = None + ctime0: Optional[int] = None + ctime1: Optional[int] = None + ctime2: Optional[int] = None + ctime3: Optional[int] = None + ctime4: Optional[int] = None + ctime5: Optional[int] = None + ctime6: Optional[int] = None + ctime7: Optional[int] = None + key0: Optional[ColorRGBA] = None + key1: Optional[ColorRGBA] = None + key2: Optional[ColorRGBA] = None + key3: Optional[ColorRGBA] = None + key4: Optional[ColorRGBA] = None + key5: Optional[ColorRGBA] = None + key6: Optional[ColorRGBA] = None + key7: Optional[ColorRGBA] = None + m_ColorSpace: Optional[int] = None + m_Color_0_: Optional[ColorRGBA] = None + m_Color_1_: Optional[ColorRGBA] = None + m_Color_2_: Optional[ColorRGBA] = None + m_Color_3_: Optional[ColorRGBA] = None + m_Color_4_: Optional[ColorRGBA] = None + m_Mode: Optional[int] = None + m_NumAlphaKeys: Optional[int] = None + m_NumColorKeys: Optional[int] = None + +@define(kw_only=True, slots=False) +class GradientNEW: + atime0: int + atime1: int + atime2: int + atime3: int + atime4: int + atime5: int + atime6: int + atime7: int + ctime0: int + ctime1: int + ctime2: int + ctime3: int + ctime4: int + ctime5: int + ctime6: int + ctime7: int + key0: ColorRGBA + key1: ColorRGBA + key2: ColorRGBA + key3: ColorRGBA + key4: ColorRGBA + key5: ColorRGBA + key6: ColorRGBA + key7: ColorRGBA + m_NumAlphaKeys: int + m_NumColorKeys: int + +@define(kw_only=True, slots=False) +class GraphicsStateInfo: + appBackface: bool + depthBias: float + forceCullMode: int + invertProjectionMatrix: bool + renderPass: int + renderState: int + slopeDepthBias: float + subPassIndex: int + topology: int + userBackface: bool + vertexLayout: int + wireframe: bool + +@define(kw_only=True, slots=False) +class GroupConnection: + sendEffectIndex: int + sourceGroupIndex: int + targetGroupIndex: int + +@define(kw_only=True, slots=False) +class GroupConstant: + bypassEffects: bool + mute: bool + parentConstantIndex: int + pitchIndex: int + solo: bool + volumeIndex: int + sendIndex: Optional[int] = None + +@define(kw_only=True, slots=False) +class Hand: + m_HandBoneIndex: List[int] + +@define(kw_only=True, slots=False) +class HandPose: + m_CloseOpen: float + m_DoFArray: List[float] + m_Grab: float + m_GrabX: xform + m_InOut: float + m_Override: float + +@define(kw_only=True, slots=False) +class Handle: + m_ID: int + m_ParentHumanIndex: int + m_X: xform + +@define(kw_only=True, slots=False) +class Hash128: + bytes_0_: int + bytes_10_: int + bytes_11_: int + bytes_12_: int + bytes_13_: int + bytes_14_: int + bytes_15_: int + bytes_1_: int + bytes_2_: int + bytes_3_: int + bytes_4_: int + bytes_5_: int + bytes_6_: int + bytes_7_: int + bytes_8_: int + bytes_9_: int + +@define(kw_only=True, slots=False) +class HeightMeshBVNode: + i: int + max: Vector3f + min: Vector3f + n: int + +@define(kw_only=True, slots=False) +class HeightMeshData: + m_Bounds: AABB + m_Indices: List[int] + m_Nodes: List[HeightMeshBVNode] + m_Vertices: List[Vector3f] + +@define(kw_only=True, slots=False) +class Heightmap: + m_Heights: List[int] + m_Levels: int + m_MinMaxPatchHeights: List[float] + m_PrecomputedError: List[float] + m_Scale: Vector3f + m_DefaultPhysicMaterial: Optional[PPtr[PhysicMaterial]] = None + m_EnableHolesTextureCompression: Optional[bool] = None + m_EnableSurfaceMaskTextureCompression: Optional[bool] = None + m_Height: Optional[int] = None + m_Holes: Optional[List[int]] = None + m_HolesLOD: Optional[List[int]] = None + m_Resolution: Optional[int] = None + m_SurfaceMask: Optional[List[int]] = None + m_SurfaceMaskLOD: Optional[List[int]] = None + m_Thickness: Optional[float] = None + m_Width: Optional[int] = None + +@define(kw_only=True, slots=False) +class HeightmapData: + terrainData: PPtr[Object] + isRotated: Optional[bool] = None + position: Optional[Vector3f] = None + surfaceToTerrain: Optional[Matrix4x4f] = None + +@define(kw_only=True, slots=False) +class HierarchicalSceneData: + m_SceneGUID: GUID + +@define(kw_only=True, slots=False) +class HoloLens: + depthFormat: int + depthBufferSharingEnabled: Optional[bool] = None + +@define(kw_only=True, slots=False) +class Human: + m_ArmStretch: float + m_ArmTwist: float + m_FeetSpacing: float + m_ForeArmTwist: float + m_HasLeftHand: bool + m_HasRightHand: bool + m_HumanBoneIndex: List[int] + m_HumanBoneMass: List[float] + m_LeftHand: OffsetPtr + m_LegStretch: float + m_LegTwist: float + m_RightHand: OffsetPtr + m_RootX: xform + m_Scale: float + m_Skeleton: OffsetPtr + m_SkeletonPose: OffsetPtr + m_UpperLegTwist: float + m_ColliderArray: Optional[List[Collider]] = None + m_ColliderIndex: Optional[List[int]] = None + m_Handles: Optional[List[Handle]] = None + m_HasTDoF: Optional[bool] = None + +@define(kw_only=True, slots=False) +class HumanBone: + m_BoneName: str + m_HumanName: str + m_Limit: SkeletonBoneLimit + +@define(kw_only=True, slots=False) +class HumanDescription: + m_ArmStretch: float + m_ArmTwist: float + m_FeetSpacing: float + m_ForeArmTwist: float + m_Human: List[HumanBone] + m_LegStretch: float + m_LegTwist: float + m_RootMotionBoneName: str + m_Skeleton: List[SkeletonBone] + m_UpperLegTwist: float + m_GlobalScale: Optional[float] = None + m_Handles: Optional[List[HumanHandle]] = None + m_HasExtraRoot: Optional[bool] = None + m_HasTranslationDoF: Optional[bool] = None + m_RootMotionBoneRotation: Optional[Quaternionf] = None + m_SkeletonHasParents: Optional[bool] = None + +@define(kw_only=True, slots=False) +class HumanGoal: + m_WeightR: float + m_WeightT: float + m_X: xform + m_HintT: Optional[Union[float3, float4]] = None + m_HintWeightT: Optional[float] = None + +@define(kw_only=True, slots=False) +class HumanHandle: + m_BoneName: str + m_LookAt: bool + m_Name: str + m_Position: Vector3f + m_Rotation: Quaternionf + m_Scale: Vector3f + +@define(kw_only=True, slots=False) +class HumanLayerConstant: + m_Binding: int + m_BodyMask: HumanPoseMask + m_IKPass: bool + m_LayerBlendingMode: int + m_SkeletonMask: OffsetPtr + m_StateMachineIndex: int + m_StateMachineMotionSetIndex: int + m_DefaultWeight: Optional[float] = None + m_SyncedLayerAffectsTiming: Optional[bool] = None + +@define(kw_only=True, slots=False) +class HumanPose: + m_DoFArray: List[float] + m_GoalArray: List[HumanGoal] + m_LeftHandPose: HandPose + m_LookAtPosition: Union[float3, float4] + m_LookAtWeight: float4 + m_RightHandPose: HandPose + m_RootX: xform + m_TDoFArray: Optional[Union[List[float4], List[float3]]] = None + +@define(kw_only=True, slots=False) +class HumanPoseMask: + word0: int + word1: int + word2: Optional[int] = None + +@define(kw_only=True, slots=False) +class Image: + image_data: bytes + m_Format: int + m_Height: int + m_RowBytes: int + m_Width: int + +@define(kw_only=True, slots=False) +class ImportLog_ImportLogEntry: + file: str + line: int + message: str + mode: int + object: PPtr[Object] + +@define(kw_only=True, slots=False) +class InheritVelocityModule: + enabled: bool + m_Curve: MinMaxCurve + m_Mode: int + +@define(kw_only=True, slots=False) +class InitialModule: + enabled: bool + gravityModifier: Union[MinMaxCurve, float] + maxNumParticles: int + startColor: MinMaxGradient + startLifetime: MinMaxCurve + startRotation: MinMaxCurve + startSize: MinMaxCurve + startSpeed: MinMaxCurve + customEmitterVelocity: Optional[Vector3f] = None + gravitySource: Optional[int] = None + inheritVelocity: Optional[float] = None + randomizeRotationDirection: Optional[float] = None + rotation3D: Optional[bool] = None + size3D: Optional[bool] = None + startRotationX: Optional[MinMaxCurve] = None + startRotationY: Optional[MinMaxCurve] = None + startSizeY: Optional[MinMaxCurve] = None + startSizeZ: Optional[MinMaxCurve] = None + +@define(kw_only=True, slots=False) +class InputAxis: + altNegativeButton: str + altPositiveButton: str + axis: int + dead: float + descriptiveName: str + descriptiveNegativeName: str + gravity: float + invert: bool + joyNum: int + m_Name: str + negativeButton: str + positiveButton: str + sensitivity: float + snap: bool + type: int + +@define(kw_only=True, slots=False) +class InputImportSettings: + name: str + alphaSource: Optional[int] = None + aniso: Optional[int] = None + filterMode: Optional[int] = None + value: Optional[SubstanceValue] = None + wrapMode: Optional[int] = None + +@define(kw_only=True, slots=False) +class IntPoint: + X: int + Y: int + +@define(kw_only=True, slots=False) +class Item: + changeFlags: Optional[int] = None + changeset: Optional[int] = None + digest: Optional[Union[Hash128, MdFour]] = None + downloadResolution: Optional[int] = None + guid: Optional[GUID] = None + markedForRemoval: Optional[bool] = None + name: Optional[str] = None + nameConflictResolution: Optional[int] = None + oldVersion: Optional[int] = None + origin: Optional[int] = None + parent: Optional[GUID] = None + parentFolderID: Optional[int] = None + type: Optional[int] = None + +@define(kw_only=True, slots=False) +class JointAngleLimit2D: + m_LowerAngle: float + m_UpperAngle: float + +@define(kw_only=True, slots=False) +class JointAngleLimits2D: + m_LowerAngle: float + m_UpperAngle: float + +@define(kw_only=True, slots=False) +class JointDrive: + maximumForce: float + positionDamper: float + positionSpring: float + mode: Optional[int] = None + useAcceleration: Optional[int] = None + +@define(kw_only=True, slots=False) +class JointLimits: + max: float + min: float + bounceMinVelocity: Optional[float] = None + bounciness: Optional[float] = None + contactDistance: Optional[float] = None + maxBounce: Optional[float] = None + minBounce: Optional[float] = None + +@define(kw_only=True, slots=False) +class JointMotor: + force: float + freeSpin: int + targetVelocity: float + +@define(kw_only=True, slots=False) +class JointMotor2D: + m_MaximumMotorForce: float + m_MotorSpeed: float + +@define(kw_only=True, slots=False) +class JointSpring: + damper: float + spring: float + targetPosition: float + +@define(kw_only=True, slots=False) +class JointSuspension2D: + m_Angle: float + m_DampingRatio: float + m_Frequency: float + +@define(kw_only=True, slots=False) +class JointTranslationLimits2D: + m_LowerTranslation: float + m_UpperTranslation: float + +@define(kw_only=True, slots=False) +class Keyframe: + inSlope: Union[Quaternionf, float, Vector3f] + outSlope: Union[Quaternionf, float, Vector3f] + time: float + value: Union[Quaternionf, float, Vector3f] + inWeight: Optional[Union[Quaternionf, float, Vector3f]] = None + outWeight: Optional[Union[Quaternionf, float, Vector3f]] = None + weightedMode: Optional[int] = None + +@define(kw_only=True, slots=False) +class LOD: + renderers: List[LODRenderer] + screenRelativeHeight: float + fadeMode: Optional[int] = None + fadeTransitionWidth: Optional[float] = None + +@define(kw_only=True, slots=False) +class LODRenderer: + renderer: PPtr[Renderer] + +@define(kw_only=True, slots=False) +class LayerConstant: + m_Binding: int + m_BodyMask: HumanPoseMask + m_DefaultWeight: float + m_IKPass: bool + m_LayerBlendingMode: int + m_SkeletonMask: OffsetPtr + m_StateMachineIndex: int + m_SyncedLayerAffectsTiming: bool + m_StateMachineMotionSetIndex: Optional[int] = None + m_StateMachineSynchronizedLayerIndex: Optional[int] = None + +@define(kw_only=True, slots=False) +class LayoutDataOne: + m_FloatArray: List[float] + +@define(kw_only=True, slots=False) +class LayoutDataThree: + m_AnotherFloatArray: List[float] + +@define(kw_only=True, slots=False) +class LayoutDataTwo: + m_FloatValue: float + m_IntegerValue: int + +@define(kw_only=True, slots=False) +class LeafInfoConstant: + m_IDArray: List[int] + m_IndexOffset: int + +@define(kw_only=True, slots=False) +class LibraryRepresentation: + name: str + scriptClassName: str + thumbnail: Image + thumbnailClassID: int + flags: Optional[int] = None + guid: Optional[GUID] = None + localIdentifier: Optional[int] = None + object: Optional[Union[PPtr[EditorExtension], PPtr[Object]]] = None + path: Optional[str] = None + +@define(kw_only=True, slots=False) +class LifetimeByEmitterSpeedModule: + enabled: bool + m_Curve: MinMaxCurve + m_Range: Vector2f + +@define(kw_only=True, slots=False) +class LightBakingOutput: + probeOcclusionLightIndex: int + isBaked: Optional[bool] = None + lightmapBakeMode: Optional[LightmapBakeMode] = None + lightmappingMask: Optional[int] = None + occlusionMaskChannel: Optional[int] = None + shadowMaskChannel: Optional[int] = None + +@define(kw_only=True, slots=False) +class LightProbeData: + m_NonTetrahedralizedProbeSetIndexMap: List[Tuple[Hash128, int]] + m_Positions: List[Vector3f] + m_ProbeSets: List[ProbeSetIndex] + m_Tetrahedralization: ProbeSetTetrahedralization + +@define(kw_only=True, slots=False) +class LightProbeOcclusion: + m_Occlusion: List[float] + m_BakedLightIndex: Optional[List[int]] = None + m_OcclusionMaskChannel: Optional[List[int]] = None + m_ProbeOcclusionLightIndex: Optional[List[int]] = None + m_ShadowMaskChannel: Optional[List[int]] = None + +@define(kw_only=True, slots=False) +class LightmapBakeMode: + lightmapBakeType: int + mixedLightingMode: int + +@define(kw_only=True, slots=False) +class LightmapData: + m_DirLightmap: Optional[PPtr[Texture2D]] = None + m_IndirectLightmap: Optional[PPtr[Texture2D]] = None + m_Lightmap: Optional[PPtr[Texture2D]] = None + m_ShadowMask: Optional[PPtr[Texture2D]] = None + sh_0_: Optional[float] = None + sh_10_: Optional[float] = None + sh_11_: Optional[float] = None + sh_12_: Optional[float] = None + sh_13_: Optional[float] = None + sh_14_: Optional[float] = None + sh_15_: Optional[float] = None + sh_16_: Optional[float] = None + sh_17_: Optional[float] = None + sh_18_: Optional[float] = None + sh_19_: Optional[float] = None + sh_1_: Optional[float] = None + sh_20_: Optional[float] = None + sh_21_: Optional[float] = None + sh_22_: Optional[float] = None + sh_23_: Optional[float] = None + sh_24_: Optional[float] = None + sh_25_: Optional[float] = None + sh_26_: Optional[float] = None + sh_2_: Optional[float] = None + sh_3_: Optional[float] = None + sh_4_: Optional[float] = None + sh_5_: Optional[float] = None + sh_6_: Optional[float] = None + sh_7_: Optional[float] = None + sh_8_: Optional[float] = None + sh_9_: Optional[float] = None + +@define(kw_only=True, slots=False) +class LightmapSnapshot(NamedObject): + m_BakedReflectionProbeCubemaps: List[PPtr[Texture]] + m_BakedReflectionProbes: List[SceneObjectIdentifier] + m_EnlightenData: List[int] + m_EnlightenSceneMapping: EnlightenSceneMapping + m_EnlightenSceneMappingRendererIDs: List[SceneObjectIdentifier] + m_LightProbes: PPtr[LightProbes] + m_LightmappedRendererData: List[RendererData] + m_LightmappedRendererDataIDs: List[SceneObjectIdentifier] + m_Lightmaps: List[LightmapData] + m_Lights: List[SceneObjectIdentifier] + m_Name: str + m_BakedAmbientProbeInGamma: Optional[SphericalHarmonicsL2] = None + m_BakedAmbientProbeInLinear: Optional[SphericalHarmonicsL2] = None + m_BakedAmbientProbesInGamma: Optional[List[SphericalHarmonicsL2]] = None + m_BakedAmbientProbesInLinear: Optional[List[SphericalHarmonicsL2]] = None + m_BakedSkyboxProbeCubemaps: Optional[List[PPtr[Texture]]] = None + m_SceneGUID: Optional[GUID] = None + +@define(kw_only=True, slots=False) +class LightsModule: + color: bool + enabled: bool + intensity: bool + intensityCurve: MinMaxCurve + light: PPtr[Light] + maxLights: int + randomDistribution: bool + range: bool + rangeCurve: MinMaxCurve + ratio: float + +@define(kw_only=True, slots=False) +class Limit: + m_Max: Union[float3, float4] + m_Min: Union[float3, float4] + +@define(kw_only=True, slots=False) +class LineParameters: + alignment: Optional[int] = None + colorGradient: Optional[Gradient] = None + endWidth: Optional[float] = None + generateLightingData: Optional[bool] = None + m_EndColor: Optional[ColorRGBA] = None + m_StartColor: Optional[ColorRGBA] = None + numCapVertices: Optional[int] = None + numCornerVertices: Optional[int] = None + shadowBias: Optional[float] = None + startWidth: Optional[float] = None + textureMode: Optional[int] = None + textureScale: Optional[Vector2f] = None + widthCurve: Optional[AnimationCurve] = None + widthMultiplier: Optional[float] = None + +@define(kw_only=True, slots=False) +class Lumin: + depthFormat: int + enableGLCache: bool + frameTiming: int + glCacheMaxBlobSize: int + glCacheMaxFileSize: int + +@define(kw_only=True, slots=False) +class MaterialImportOutput: + baked: int + currentSettings: BuildTargetSettings + +@define(kw_only=True, slots=False) +class MaterialInstanceSettings: + buildTargetSettings: List[BuildTargetSettings] + inputs: List[InputImportSettings] + materialInformation: ProceduralMaterialInformation + materialProperties: UnityPropertySheet + name: str + prototypeName: str + textureParameters: List[InputImportSettings] + lightmapFlags: Optional[int] = None + renderQueue: Optional[int] = None + shader: Optional[PPtr[Shader]] = None + shaderKeywords: Optional[str] = None + shaderName: Optional[str] = None + textureAssignments: Optional[List[ProceduralTextureAssignment]] = None + +@define(kw_only=True, slots=False) +class MatrixParameter: + m_ArraySize: int + m_Index: int + m_NameIndex: int + m_RowCount: int + m_Type: int + +@define(kw_only=True, slots=False) +class MdFour: + md4_hash: bytes + +@define(kw_only=True, slots=False) +class MeshBlendShape: + firstVertex: int + hasNormals: bool + hasTangents: bool + vertexCount: int + aabbMaxDelta: Optional[Vector3f] = None + aabbMinDelta: Optional[Vector3f] = None + name: Optional[str] = None + +@define(kw_only=True, slots=False) +class MeshBlendShapeChannel: + frameCount: int + frameIndex: int + name: str + nameHash: int + +@define(kw_only=True, slots=False) +class MeshBlendShapeVertex: + index: int + normal: Vector3f + tangent: Vector3f + vertex: Vector3f + +@define(kw_only=True, slots=False) +class MinMaxAABB: + m_Max: Vector3f + m_Min: Vector3f + +@define(kw_only=True, slots=False) +class MinMaxCurve: + maxCurve: AnimationCurve + minCurve: AnimationCurve + minMaxState: int + scalar: float + minScalar: Optional[float] = None + +@define(kw_only=True, slots=False) +class MinMaxGradient: + maxColor: ColorRGBA + maxGradient: Union[GradientNEW, Gradient] + minColor: ColorRGBA + minGradient: Union[GradientNEW, Gradient] + minMaxState: int + +@define(kw_only=True, slots=False) +class MipmapLimitSettings: + limitBias: int + limitBiasMode: int + +@define(kw_only=True, slots=False) +class Module: + dependencies: List[str] + name: str + strippable: bool + controlledByBuiltinPackage: Optional[bool] = None + +@define(kw_only=True, slots=False) +class MonoAssemblyImporter(AssetImporter): + m_ExecutionOrder: List[Tuple[str, int]] + m_IconMap: List[Tuple[str, PPtr[Texture2D]]] + m_Name: str + m_FileIDToRecycleName: Optional[List[Tuple[int, str]]] = None + m_NewHashIdentity: Optional[MdFour] = None + m_OldHashIdentity: Optional[MdFour] = None + m_UserData: Optional[str] = None + +@define(kw_only=True, slots=False) +class MonoObject(ABC): + pass + +@define(kw_only=True, slots=False) +class MotionNeighborList: + m_NeighborArray: List[int] + +@define(kw_only=True, slots=False) +class MultiModeParameter: + mode: int + speed: MinMaxCurve + spread: float + value: Optional[float] = None + +@define(kw_only=True, slots=False) +class NameToObjectMap: + m_ObjectToName: List[Tuple[PPtr[Shader], str]] + +@define(kw_only=True, slots=False) +class NativeType: + a: int + b: float + embedded: EmbeddedNativeType + +@define(kw_only=True, slots=False) +class NavMesh(NamedObject): + m_Heightmaps: List[HeightmapData] + m_MeshData: List[int] + m_Name: str + +@define(kw_only=True, slots=False) +class NavMeshAreaData: + cost: float + name: str + +@define(kw_only=True, slots=False) +class NavMeshAreas(GlobalGameManager): + areas: List[NavMeshAreaData] + +@define(kw_only=True, slots=False) +class NavMeshBuildDebugSettings: + m_Flags: int + +@define(kw_only=True, slots=False) +class NavMeshBuildSettings: + agentClimb: float + agentHeight: float + agentRadius: float + agentSlope: float + agentTypeID: int + cellSize: float + ledgeDropHeight: float + manualCellSize: Union[bool, int] + manualTileSize: Union[bool, int] + maxJumpAcrossDistance: float + minRegionArea: float + tileSize: int + accuratePlacement: Optional[Union[bool, int]] = None + buildHeightMesh: Optional[int] = None + debug: Optional[NavMeshBuildDebugSettings] = None + keepTiles: Optional[int] = None + maxJobWorkers: Optional[int] = None + preserveTilesOutsideBounds: Optional[int] = None + +@define(kw_only=True, slots=False) +class NavMeshLayerData: + cost: float + editType: int + name: str + +@define(kw_only=True, slots=False) +class NavMeshLayers(GlobalGameManager): + Built_in_Layer_0: NavMeshLayerData + Built_in_Layer_1: NavMeshLayerData + Built_in_Layer_2: NavMeshLayerData + User_Layer_0: NavMeshLayerData + User_Layer_1: NavMeshLayerData + User_Layer_10: NavMeshLayerData + User_Layer_11: NavMeshLayerData + User_Layer_12: NavMeshLayerData + User_Layer_13: NavMeshLayerData + User_Layer_14: NavMeshLayerData + User_Layer_15: NavMeshLayerData + User_Layer_16: NavMeshLayerData + User_Layer_17: NavMeshLayerData + User_Layer_18: NavMeshLayerData + User_Layer_19: NavMeshLayerData + User_Layer_2: NavMeshLayerData + User_Layer_20: NavMeshLayerData + User_Layer_21: NavMeshLayerData + User_Layer_22: NavMeshLayerData + User_Layer_23: NavMeshLayerData + User_Layer_24: NavMeshLayerData + User_Layer_25: NavMeshLayerData + User_Layer_26: NavMeshLayerData + User_Layer_27: NavMeshLayerData + User_Layer_28: NavMeshLayerData + User_Layer_3: NavMeshLayerData + User_Layer_4: NavMeshLayerData + User_Layer_5: NavMeshLayerData + User_Layer_6: NavMeshLayerData + User_Layer_7: NavMeshLayerData + User_Layer_8: NavMeshLayerData + User_Layer_9: NavMeshLayerData + +@define(kw_only=True, slots=False) +class NavMeshParams: + cellSize: float + tileSize: float + walkableClimb: float + walkableHeight: float + walkableRadius: float + +@define(kw_only=True, slots=False) +class NavMeshTileData: + m_MeshData: List[int] + m_Hash: Optional[Hash128] = None + +@define(kw_only=True, slots=False) +class NetworkViewID: + m_ID: int + m_Type: int + +@define(kw_only=True, slots=False) +class Node: + m_AxesId: int + m_ParentId: int + +@define(kw_only=True, slots=False) +class NoiseModule: + damping: bool + enabled: bool + frequency: float + octaveMultiplier: float + octaveScale: float + octaves: int + quality: int + remap: MinMaxCurve + remapEnabled: bool + remapY: MinMaxCurve + remapZ: MinMaxCurve + scrollSpeed: MinMaxCurve + separateAxes: bool + strength: MinMaxCurve + strengthY: MinMaxCurve + strengthZ: MinMaxCurve + positionAmount: Optional[MinMaxCurve] = None + rotationAmount: Optional[MinMaxCurve] = None + sizeAmount: Optional[MinMaxCurve] = None + +@define(kw_only=True, slots=False) +class NonAlignedStruct: + m_Bool: bool + +@define(kw_only=True, slots=False) +class ObjectRolePair: + m_Object: PPtr[Object] + m_RolesMask: int + +@define(kw_only=True, slots=False) +class OcclusionScene: + indexPortals: int + indexRenderers: int + scene: GUID + sizePortals: int + sizeRenderers: int + +@define(kw_only=True, slots=False) +class Oculus: + dashSupport: bool + sharedDepthBuffer: bool + lowOverheadMode: Optional[bool] = None + protectedContext: Optional[bool] = None + v2Signing: Optional[bool] = None + +@define(kw_only=True, slots=False) +class OffsetPtr: + data: Union[SkeletonMask, SkeletonPose, Blend2dDataConstant, Blend1dDataConstant, BlendTreeConstant, Skeleton, Clip, SelectorTransitionConstant, LayerConstant, ValueArray, SelectorStateConstant, ConditionConstant, Human, HumanLayerConstant, Hand, StateConstant, StateMachineConstant, BlendTreeNodeConstant, BlendDirectDataConstant, ValueArrayConstant, TransitionConstant] + +@define(kw_only=True, slots=False) +class Output: + hasEmptyFontData: Optional[bool] = None + importedType: Optional[int] = None + previewData: Optional[List[float]] = None + +@define(kw_only=True, slots=False) +class PPtrCurve: + attribute: str + classID: int + curve: List[PPtrKeyframe] + path: str + script: PPtr[MonoScript] + flags: Optional[int] = None + +@define(kw_only=True, slots=False) +class PPtrKeyframe: + time: float + value: PPtr[Object] + +@define(kw_only=True, slots=False) +class PackedBitVector: + m_Data: List[int] + m_NumItems: int + m_BitSize: Optional[int] = None + m_Range: Optional[float] = None + m_Start: Optional[float] = None + +@define(kw_only=True, slots=False) +class PackingSettings: + allowAlphaSplitting: bool + blockOffset: int + enableRotation: bool + enableTightPacking: bool + padding: int + enableAlphaDilation: Optional[bool] = None + +@define(kw_only=True, slots=False) +class Parameter: + m_GUID: GUID + m_ParameterName: str + +@define(kw_only=True, slots=False) +class ParserBindChannels: + m_Channels: List[ShaderBindChannel] + m_SourceMap: int + +@define(kw_only=True, slots=False) +class ParticleSystemEmissionBurst: + cycleCount: int + repeatInterval: float + time: float + countCurve: Optional[MinMaxCurve] = None + maxCount: Optional[int] = None + minCount: Optional[int] = None + probability: Optional[float] = None + +@define(kw_only=True, slots=False) +class ParticleSystemForceFieldParameters: + m_DirectionCurveX: MinMaxCurve + m_DirectionCurveY: MinMaxCurve + m_DirectionCurveZ: MinMaxCurve + m_DragCurve: MinMaxCurve + m_EndRange: float + m_GravityCurve: MinMaxCurve + m_GravityFocus: float + m_Length: float + m_MultiplyDragByParticleSize: bool + m_MultiplyDragByParticleVelocity: bool + m_RotationAttractionCurve: MinMaxCurve + m_RotationRandomness: Vector2f + m_RotationSpeedCurve: MinMaxCurve + m_Shape: int + m_StartRange: float + m_VectorField: PPtr[Texture3D] + m_VectorFieldAttractionCurve: MinMaxCurve + m_VectorFieldSpeedCurve: MinMaxCurve + +@define(kw_only=True, slots=False) +class PerLODSettings: + castShadows: bool + enableBump: bool + enableHue: bool + height: float + receiveShadows: bool + reflectionProbeUsage: int + useLightProbes: bool + windQuality: int + enableSettingOverride: Optional[bool] = None + enableSubsurface: Optional[bool] = None + +@define(kw_only=True, slots=False) +class PerformanceReportingSettings: + m_Enabled: bool + +@define(kw_only=True, slots=False) +class PhysicMaterial(NamedObject): + bounceCombine: int + bounciness: float + dynamicFriction: float + frictionCombine: int + m_Name: str + staticFriction: float + dynamicFriction2: Optional[float] = None + frictionDirection2: Optional[Vector3f] = None + staticFriction2: Optional[float] = None + +@define(kw_only=True, slots=False) +class PhysicsJobOptions2D: + m_ClearBodyForcesPerJob: int + m_ClearFlagsPerJob: int + m_CollideContactsPerJob: int + m_FindNearestContactsPerJob: int + m_InterpolationPosesPerJob: int + m_IslandSolverBodiesPerJob: int + m_IslandSolverBodyCostScale: int + m_IslandSolverContactCostScale: int + m_IslandSolverContactsPerJob: int + m_IslandSolverCostThreshold: int + m_IslandSolverJointCostScale: int + m_NewContactsPerJob: int + m_SyncContinuousFixturesPerJob: int + m_SyncDiscreteFixturesPerJob: int + m_UpdateTriggerContactsPerJob: int + m_UseConsistencySorting: Optional[bool] = None + m_UseMultithreading: Optional[bool] = None + useConsistencySorting: Optional[bool] = None + useMultithreading: Optional[bool] = None + +@define(kw_only=True, slots=False) +class PhysicsShape: + m_AdjacentEnd: Vector2f + m_AdjacentStart: Vector2f + m_Radius: float + m_ShapeType: int + m_UseAdjacentEnd: int + m_UseAdjacentStart: int + m_VertexCount: int + m_VertexStartIndex: int + +@define(kw_only=True, slots=False) +class PhysicsShapeGroup2D: + m_Shapes: List[PhysicsShape] + m_Vertices: List[Vector2f] + +@define(kw_only=True, slots=False) +class PlatformSettings: + m_AllowsAlphaSplitting: bool + m_BuildTarget: str + m_CompressionQuality: int + m_CrunchedCompression: bool + m_MaxTextureSize: int + m_Overridden: bool + m_TextureCompression: int + m_TextureFormat: int + m_ResizeAlgorithm: Optional[int] = None + +@define(kw_only=True, slots=False) +class PlatformSettingsData: + settings: List[Tuple[str, str]] + enabled: Optional[bool] = None + +@define(kw_only=True, slots=False) +class PlatformShaderDefines: + defines_Tier1: List[int] + defines_Tier2: List[int] + defines_Tier3: List[int] + shaderPlatform: int + +@define(kw_only=True, slots=False) +class PlatformShaderSettings: + useCascadedShadowMaps: Optional[bool] = None + useScreenSpaceShadows: Optional[bool] = None + +@define(kw_only=True, slots=False) +class PluginImportOutput: + dllType: Optional[int] = None + pluginType: Optional[int] = None + scriptingRuntimeVersion: Optional[int] = None + +@define(kw_only=True, slots=False) +class Polygon2D(ABC): + m_Paths: Optional[List[List[Vector2f]]] = None + +@define(kw_only=True, slots=False) +class PrefabModification: + m_Modifications: List[PropertyModification] + m_RemovedComponents: Union[List[PPtr[Object]], List[PPtr[Component]]] + m_TransformParent: PPtr[Transform] + m_AddedComponents: Optional[List[AddedComponent]] = None + m_AddedGameObjects: Optional[List[AddedGameObject]] = None + m_RemovedGameObjects: Optional[List[PPtr[GameObject]]] = None + +@define(kw_only=True, slots=False) +class PresetType: + m_ManagedTypeFallback: str + m_ManagedTypePPtr: PPtr[MonoScript] + m_NativeTypeID: int + +@define(kw_only=True, slots=False) +class PreviewData: + m_CompSize: int + m_OrigSize: int + m_PreviewData: List[float] + +@define(kw_only=True, slots=False) +class ProbeSetIndex: + m_Hash: Hash128 + m_Offset: int + m_Size: int + +@define(kw_only=True, slots=False) +class ProbeSetTetrahedralization: + m_HullRays: List[Vector3f] + m_Tetrahedra: List[Tetrahedron] + +@define(kw_only=True, slots=False) +class ProceduralMaterialInformation: + m_Offset: Vector2f + m_Scale: Vector2f + m_AnimationUpdateRate: Optional[int] = None + m_GenerateAllOutputs: Optional[int] = None + m_GenerateMipmaps: Optional[bool] = None + m_GeneratedAtLoading: Optional[int] = None + +@define(kw_only=True, slots=False) +class ProceduralTextureAssignment: + baseUID: int + material: PPtr[ProceduralMaterial] + shaderProp: Union[FastPropertyName, str] + +@define(kw_only=True, slots=False) +class PropertyModification: + objectReference: PPtr[Object] + propertyPath: str + target: PPtr[Object] + value: str + +@define(kw_only=True, slots=False) +class PropertyModificationsTargetTestNativeObject: + m_FloatValue: float + m_IntegerValue: int + +@define(kw_only=True, slots=False) +class QualitySetting: + anisotropicTextures: int + antiAliasing: int + pixelLightCount: int + shadowCascades: int + shadowDistance: float + shadowProjection: int + shadowResolution: int + shadows: int + softParticles: bool + softVegetation: bool + vSyncCount: int + adaptiveVsync: Optional[bool] = None + adaptiveVsyncExtraA: Optional[int] = None + adaptiveVsyncExtraB: Optional[int] = None + asyncUploadBufferSize: Optional[int] = None + asyncUploadPersistentBuffer: Optional[bool] = None + asyncUploadTimeSlice: Optional[int] = None + billboardsFaceCameraPosition: Optional[bool] = None + blendWeights: Optional[int] = None + customRenderPipeline: Optional[PPtr[MonoBehaviour]] = None + enableLODCrossFade: Optional[bool] = None + globalTextureMipmapLimit: Optional[int] = None + lodBias: Optional[float] = None + maximumLODLevel: Optional[int] = None + name: Optional[str] = None + particleRaycastBudget: Optional[int] = None + realtimeGICPUUsage: Optional[int] = None + realtimeReflectionProbes: Optional[bool] = None + resolutionScalingFixedDPIFactor: Optional[float] = None + shadowCascade2Split: Optional[float] = None + shadowCascade4Split: Optional[Vector3f] = None + shadowNearPlaneOffset: Optional[float] = None + shadowmaskMode: Optional[int] = None + skinWeights: Optional[int] = None + streamingMipmapsActive: Optional[bool] = None + streamingMipmapsAddAllCameras: Optional[bool] = None + streamingMipmapsMaxFileIORequests: Optional[int] = None + streamingMipmapsMaxLevelReduction: Optional[int] = None + streamingMipmapsMemoryBudget: Optional[float] = None + streamingMipmapsRenderersPerFrame: Optional[int] = None + terrainBasemapDistance: Optional[float] = None + terrainBillboardStart: Optional[float] = None + terrainDetailDensityScale: Optional[float] = None + terrainDetailDistance: Optional[float] = None + terrainFadeLength: Optional[float] = None + terrainMaxTrees: Optional[int] = None + terrainPixelError: Optional[float] = None + terrainQualityOverrides: Optional[int] = None + terrainTreeDistance: Optional[float] = None + textureMipmapLimitSettings: Optional[List[MipmapLimitSettings]] = None + textureQuality: Optional[int] = None + useLegacyDetailDistribution: Optional[bool] = None + +@define(kw_only=True, slots=False) +class QuaternionCurve: + curve: AnimationCurve + path: str + +@define(kw_only=True, slots=False) +class RationalTime: + m_Count: int + m_Rate: TicksPerSecond + +@define(kw_only=True, slots=False) +class RayTracingShaderBuiltinSampler: + bindPoint: int + sampler: int + +@define(kw_only=True, slots=False) +class RayTracingShaderConstantBuffer: + byteSize: int + name: str + params: List[RayTracingShaderParam] + hash: Optional[int] = None + +@define(kw_only=True, slots=False) +class RayTracingShaderFunctionDesc: + attributeSizeInBytes: int + identifier: RayTracingShaderID + payloadSizeInBytes: int + +@define(kw_only=True, slots=False) +class RayTracingShaderID: + name: str + type: int + +@define(kw_only=True, slots=False) +class RayTracingShaderParam: + arraySize: int + colCount: int + name: str + offset: int + rowCount: int + dataSize: Optional[int] = None + dataType: Optional[int] = None + propertySheetType: Optional[int] = None + type: Optional[int] = None + +@define(kw_only=True, slots=False) +class RayTracingShaderReflectionData: + code: List[int] + functions: List[RayTracingShaderFunctionDesc] + globalResources: RayTracingShaderResources + hasErrors: bool + localResources: RayTracingShaderResources + precompiled: Optional[List[int]] = None + requirements: Optional[int] = None + +@define(kw_only=True, slots=False) +class RayTracingShaderResource: + bindPoint: int + name: str + rayGenMask: int + samplerBindPoint: int + texDimension: int + arraySize: Optional[int] = None + multisampled: Optional[bool] = None + +@define(kw_only=True, slots=False) +class RayTracingShaderResources: + builtinSamplers: List[RayTracingShaderBuiltinSampler] + constantBuffers: List[RayTracingShaderResource] + constantBuffersDesc: List[RayTracingShaderConstantBuffer] + inputBuffers: List[RayTracingShaderResource] + outputBuffers: List[RayTracingShaderResource] + textures: List[RayTracingShaderResource] + +@define(kw_only=True, slots=False) +class RayTracingShaderVariant: + resourceReflectionData: RayTracingShaderReflectionData + targetRenderer: int + +@define(kw_only=True, slots=False) +class Rectf: + height: float + width: float + x: float + y: float + +@define(kw_only=True, slots=False) +class RenderManager(GlobalGameManager): + pass + +@define(kw_only=True, slots=False) +class RenderPassInfo: + attachmentCount: int + attachments: List[AttachmentInfo] + depthAttachmentIndex: int + multiviewCount: int + sampleCount: int + shadingRateIndex: int + subPassCount: int + subPasses: List[SubPassDescriptor] + +@define(kw_only=True, slots=False) +class RenderStateBlock: + blendState: GfxBlendState + depthState: GfxDepthState + mask: int + rasterState: GfxRasterState + stencilRef: int + stencilState: GfxStencilState + +@define(kw_only=True, slots=False) +class RenderStateInfo: + renderState: RenderStateBlock + +@define(kw_only=True, slots=False) +class RendererData: + lightmapIndex: int + lightmapIndexDynamic: int + lightmapST: Vector4f + lightmapSTDynamic: Vector4f + terrainChunkDynamicUVST: Vector4f + terrainDynamicUVST: Vector4f + uvMesh: PPtr[Mesh] + explicitProbeSetHash: Optional[Hash128] = None + +@define(kw_only=True, slots=False) +class ResourceManager_Dependency: + m_Dependencies: List[PPtr[Object]] + m_Object: PPtr[Object] + +@define(kw_only=True, slots=False) +class RippleGroup: + m_afDirectional_0: float + m_afDirectional_1: float + m_afDirectional_10: float + m_afDirectional_11: float + m_afDirectional_12: float + m_afDirectional_13: float + m_afDirectional_14: float + m_afDirectional_15: float + m_afDirectional_16: float + m_afDirectional_17: float + m_afDirectional_18: float + m_afDirectional_19: float + m_afDirectional_2: float + m_afDirectional_3: float + m_afDirectional_4: float + m_afDirectional_5: float + m_afDirectional_6: float + m_afDirectional_7: float + m_afDirectional_8: float + m_afDirectional_9: float + m_afFlexibility_0: float + m_afFlexibility_1: float + m_afFlexibility_10: float + m_afFlexibility_11: float + m_afFlexibility_12: float + m_afFlexibility_13: float + m_afFlexibility_14: float + m_afFlexibility_15: float + m_afFlexibility_16: float + m_afFlexibility_17: float + m_afFlexibility_18: float + m_afFlexibility_19: float + m_afFlexibility_2: float + m_afFlexibility_3: float + m_afFlexibility_4: float + m_afFlexibility_5: float + m_afFlexibility_6: float + m_afFlexibility_7: float + m_afFlexibility_8: float + m_afFlexibility_9: float + m_afPlanar_0: float + m_afPlanar_1: float + m_afPlanar_10: float + m_afPlanar_11: float + m_afPlanar_12: float + m_afPlanar_13: float + m_afPlanar_14: float + m_afPlanar_15: float + m_afPlanar_16: float + m_afPlanar_17: float + m_afPlanar_18: float + m_afPlanar_19: float + m_afPlanar_2: float + m_afPlanar_3: float + m_afPlanar_4: float + m_afPlanar_5: float + m_afPlanar_6: float + m_afPlanar_7: float + m_afPlanar_8: float + m_afPlanar_9: float + m_afSpeed_0: float + m_afSpeed_1: float + m_afSpeed_10: float + m_afSpeed_11: float + m_afSpeed_12: float + m_afSpeed_13: float + m_afSpeed_14: float + m_afSpeed_15: float + m_afSpeed_16: float + m_afSpeed_17: float + m_afSpeed_18: float + m_afSpeed_19: float + m_afSpeed_2: float + m_afSpeed_3: float + m_afSpeed_4: float + m_afSpeed_5: float + m_afSpeed_6: float + m_afSpeed_7: float + m_afSpeed_8: float + m_afSpeed_9: float + m_fIndependence: float + m_fShimmer: float + +@define(kw_only=True, slots=False) +class RootMotionData(ABC): + pass + +@define(kw_only=True, slots=False) +class RotationBySpeedModule: + curve: MinMaxCurve + enabled: bool + range: Vector2f + separateAxes: Optional[bool] = None + x: Optional[MinMaxCurve] = None + y: Optional[MinMaxCurve] = None + +@define(kw_only=True, slots=False) +class RotationModule: + curve: MinMaxCurve + enabled: bool + separateAxes: Optional[bool] = None + x: Optional[MinMaxCurve] = None + y: Optional[MinMaxCurve] = None + +@define(kw_only=True, slots=False) +class SBranchWindLevel: + m_afDirectionAdherence_0: float + m_afDirectionAdherence_1: float + m_afDirectionAdherence_2: float + m_afDirectionAdherence_3: float + m_afDirectionAdherence_4: float + m_afDirectionAdherence_5: float + m_afDirectionAdherence_6: float + m_afDirectionAdherence_7: float + m_afDirectionAdherence_8: float + m_afDirectionAdherence_9: float + m_afDistance_0: float + m_afDistance_1: float + m_afDistance_2: float + m_afDistance_3: float + m_afDistance_4: float + m_afDistance_5: float + m_afDistance_6: float + m_afDistance_7: float + m_afDistance_8: float + m_afDistance_9: float + m_afWhip_0: float + m_afWhip_1: float + m_afWhip_2: float + m_afWhip_3: float + m_afWhip_4: float + m_afWhip_5: float + m_afWhip_6: float + m_afWhip_7: float + m_afWhip_8: float + m_afWhip_9: float + m_fTurbulence: float + m_fTwitch: float + m_fTwitchFreqScale: float + +@define(kw_only=True, slots=False) +class SParams: + BranchLevel1: SBranchWindLevel + BranchLevel2: SBranchWindLevel + LeafGroup1: SWindGroup + LeafGroup2: SWindGroup + Oscillation0_0: float + Oscillation0_1: float + Oscillation0_2: float + Oscillation0_3: float + Oscillation0_4: float + Oscillation0_5: float + Oscillation0_6: float + Oscillation0_7: float + Oscillation0_8: float + Oscillation0_9: float + Oscillation1_0: float + Oscillation1_1: float + Oscillation1_2: float + Oscillation1_3: float + Oscillation1_4: float + Oscillation1_5: float + Oscillation1_6: float + Oscillation1_7: float + Oscillation1_8: float + Oscillation1_9: float + Oscillation2_0: float + Oscillation2_1: float + Oscillation2_2: float + Oscillation2_3: float + Oscillation2_4: float + Oscillation2_5: float + Oscillation2_6: float + Oscillation2_7: float + Oscillation2_8: float + Oscillation2_9: float + Oscillation3_0: float + Oscillation3_1: float + Oscillation3_2: float + Oscillation3_3: float + Oscillation3_4: float + Oscillation3_5: float + Oscillation3_6: float + Oscillation3_7: float + Oscillation3_8: float + Oscillation3_9: float + Oscillation4_0: float + Oscillation4_1: float + Oscillation4_2: float + Oscillation4_3: float + Oscillation4_4: float + Oscillation4_5: float + Oscillation4_6: float + Oscillation4_7: float + Oscillation4_8: float + Oscillation4_9: float + Oscillation5_0: float + Oscillation5_1: float + Oscillation5_2: float + Oscillation5_3: float + Oscillation5_4: float + Oscillation5_5: float + Oscillation5_6: float + Oscillation5_7: float + Oscillation5_8: float + Oscillation5_9: float + Oscillation6_0: float + Oscillation6_1: float + Oscillation6_2: float + Oscillation6_3: float + Oscillation6_4: float + Oscillation6_5: float + Oscillation6_6: float + Oscillation6_7: float + Oscillation6_8: float + Oscillation6_9: float + Oscillation7_0: float + Oscillation7_1: float + Oscillation7_2: float + Oscillation7_3: float + Oscillation7_4: float + Oscillation7_5: float + Oscillation7_6: float + Oscillation7_7: float + Oscillation7_8: float + Oscillation7_9: float + Oscillation8_0: float + Oscillation8_1: float + Oscillation8_2: float + Oscillation8_3: float + Oscillation8_4: float + Oscillation8_5: float + Oscillation8_6: float + Oscillation8_7: float + Oscillation8_8: float + Oscillation8_9: float + Oscillation9_0: float + Oscillation9_1: float + Oscillation9_2: float + Oscillation9_3: float + Oscillation9_4: float + Oscillation9_5: float + Oscillation9_6: float + Oscillation9_7: float + Oscillation9_8: float + Oscillation9_9: float + m_afFrondRippleDistance_0: float + m_afFrondRippleDistance_1: float + m_afFrondRippleDistance_2: float + m_afFrondRippleDistance_3: float + m_afFrondRippleDistance_4: float + m_afFrondRippleDistance_5: float + m_afFrondRippleDistance_6: float + m_afFrondRippleDistance_7: float + m_afFrondRippleDistance_8: float + m_afFrondRippleDistance_9: float + m_afGlobalDirectionAdherence_0: float + m_afGlobalDirectionAdherence_1: float + m_afGlobalDirectionAdherence_2: float + m_afGlobalDirectionAdherence_3: float + m_afGlobalDirectionAdherence_4: float + m_afGlobalDirectionAdherence_5: float + m_afGlobalDirectionAdherence_6: float + m_afGlobalDirectionAdherence_7: float + m_afGlobalDirectionAdherence_8: float + m_afGlobalDirectionAdherence_9: float + m_afGlobalDistance_0: float + m_afGlobalDistance_1: float + m_afGlobalDistance_2: float + m_afGlobalDistance_3: float + m_afGlobalDistance_4: float + m_afGlobalDistance_5: float + m_afGlobalDistance_6: float + m_afGlobalDistance_7: float + m_afGlobalDistance_8: float + m_afGlobalDistance_9: float + m_fAnchorDistanceScale: float + m_fAnchorOffset: float + m_fDirectionResponse: float + m_fFrondRippleLightingScalar: float + m_fFrondRippleTile: float + m_fGlobalHeight: float + m_fGlobalHeightExponent: float + m_fGustDurationMax: float + m_fGustDurationMin: float + m_fGustFallScalar: float + m_fGustFrequency: float + m_fGustRiseScalar: float + m_fGustStrengthMax: float + m_fGustStrengthMin: float + m_fRollingBranchFieldMin: float + m_fRollingBranchLightingAdjust: float + m_fRollingBranchVerticalOffset: float + m_fRollingLeafRippleMin: float + m_fRollingLeafTumbleMin: float + m_fRollingNoisePeriod: float + m_fRollingNoiseSize: float + m_fRollingNoiseSpeed: float + m_fRollingNoiseTurbulence: float + m_fRollingNoiseTwist: float + m_fStrengthResponse: float + +@define(kw_only=True, slots=False) +class SWindGroup: + m_afRippleDistance_0: float + m_afRippleDistance_1: float + m_afRippleDistance_2: float + m_afRippleDistance_3: float + m_afRippleDistance_4: float + m_afRippleDistance_5: float + m_afRippleDistance_6: float + m_afRippleDistance_7: float + m_afRippleDistance_8: float + m_afRippleDistance_9: float + m_afTumbleDirectionAdherence_0: float + m_afTumbleDirectionAdherence_1: float + m_afTumbleDirectionAdherence_2: float + m_afTumbleDirectionAdherence_3: float + m_afTumbleDirectionAdherence_4: float + m_afTumbleDirectionAdherence_5: float + m_afTumbleDirectionAdherence_6: float + m_afTumbleDirectionAdherence_7: float + m_afTumbleDirectionAdherence_8: float + m_afTumbleDirectionAdherence_9: float + m_afTumbleFlip_0: float + m_afTumbleFlip_1: float + m_afTumbleFlip_2: float + m_afTumbleFlip_3: float + m_afTumbleFlip_4: float + m_afTumbleFlip_5: float + m_afTumbleFlip_6: float + m_afTumbleFlip_7: float + m_afTumbleFlip_8: float + m_afTumbleFlip_9: float + m_afTumbleTwist_0: float + m_afTumbleTwist_1: float + m_afTumbleTwist_2: float + m_afTumbleTwist_3: float + m_afTumbleTwist_4: float + m_afTumbleTwist_5: float + m_afTumbleTwist_6: float + m_afTumbleTwist_7: float + m_afTumbleTwist_8: float + m_afTumbleTwist_9: float + m_afTwitchThrow_0: float + m_afTwitchThrow_1: float + m_afTwitchThrow_2: float + m_afTwitchThrow_3: float + m_afTwitchThrow_4: float + m_afTwitchThrow_5: float + m_afTwitchThrow_6: float + m_afTwitchThrow_7: float + m_afTwitchThrow_8: float + m_afTwitchThrow_9: float + m_fLeewardScalar: float + m_fRollMaxScale: float + m_fRollMinScale: float + m_fRollSeparation: float + m_fRollSpeed: float + m_fTwitchSharpness: float + +@define(kw_only=True, slots=False) +class SampleSettings: + compressionFormat: int + conversionMode: int + loadType: int + quality: float + sampleRateOverride: int + sampleRateSetting: int + preloadAudioData: Optional[bool] = None + +@define(kw_only=True, slots=False) +class SamplerParameter: + bindPoint: int + sampler: int + +@define(kw_only=True, slots=False) +class Scene(LevelGameManager): + enabled: Optional[bool] = None + guid: Optional[GUID] = None + m_PVSData: Optional[List[int]] = None + m_PVSObjectsArray: Optional[List[PPtr[Renderer]]] = None + m_PVSPortalsArray: Optional[List[PPtr[OcclusionPortal]]] = None + m_QueryMode: Optional[int] = None + path: Optional[str] = None + +@define(kw_only=True, slots=False) +class SceneDataContainer: + m_SceneData: List[Tuple[SceneIdentifier, HierarchicalSceneData]] + +@define(kw_only=True, slots=False) +class SceneIdentifier: + guid: GUID + handle: int + +@define(kw_only=True, slots=False) +class SceneObjectIdentifier: + targetObject: int + targetPrefab: int + +@define(kw_only=True, slots=False) +class SceneSettings(LevelGameManager): + m_PVSData: List[int] + m_PVSObjectsArray: List[PPtr[Renderer]] + m_PVSPortalsArray: List[PPtr[OcclusionPortal]] + m_QueryMode: Optional[int] = None + +@define(kw_only=True, slots=False) +class SceneVisibilityData: + m_SceneGUID: GUID + +@define(kw_only=True, slots=False) +class ScriptMapper(GlobalGameManager): + m_Shaders: NameToObjectMap + m_PreloadShaders: Optional[bool] = None + +@define(kw_only=True, slots=False) +class SecondarySpriteTexture: + name: str + texture: PPtr[Texture2D] + +@define(kw_only=True, slots=False) +class SecondaryTextureSettings: + platformSettings: List[TextureImporterPlatformSettings] + sRGB: Optional[bool] = None + +@define(kw_only=True, slots=False) +class SelectorStateConstant: + m_FullPathID: int + m_IsEntry: bool + m_TransitionConstantArray: List[OffsetPtr] + +@define(kw_only=True, slots=False) +class SelectorTransitionConstant: + m_ConditionConstantArray: List[OffsetPtr] + m_Destination: int + +@define(kw_only=True, slots=False) +class SerializedCustomEditorForRenderPipeline: + customEditorName: str + renderPipelineType: str + +@define(kw_only=True, slots=False) +class SerializedPass: + m_HasInstancingVariant: bool + m_Name: str + m_NameIndices: List[Tuple[str, int]] + m_ProgramMask: int + m_State: SerializedShaderState + m_Tags: SerializedTagMap + m_TextureName: str + m_Type: int + m_UseName: str + progDomain: SerializedProgram + progFragment: SerializedProgram + progGeometry: SerializedProgram + progHull: SerializedProgram + progVertex: SerializedProgram + m_EditorDataHash: Optional[List[Hash128]] = None + m_GlobalKeywordMask: Optional[List[int]] = None + m_HasProceduralInstancingVariant: Optional[bool] = None + m_LocalKeywordMask: Optional[List[int]] = None + m_Platforms: Optional[List[int]] = None + m_SerializedKeywordStateMask: Optional[List[int]] = None + progRayTracing: Optional[SerializedProgram] = None + +@define(kw_only=True, slots=False) +class SerializedPlayerSubProgram: + m_BlobIndex: int + m_GpuProgramType: int + m_KeywordIndices: List[int] + m_ShaderRequirements: int + +@define(kw_only=True, slots=False) +class SerializedProgram: + m_SubPrograms: List[SerializedSubProgram] + m_CommonParameters: Optional[SerializedProgramParameters] = None + m_ParameterBlobIndices: Optional[List[List[int]]] = None + m_PlayerSubPrograms: Optional[List[List[SerializedPlayerSubProgram]]] = None + m_SerializedKeywordStateMask: Optional[List[int]] = None + +@define(kw_only=True, slots=False) +class SerializedProgramParameters: + m_BufferParams: List[BufferBinding] + m_ConstantBufferBindings: List[BufferBinding] + m_ConstantBuffers: List[ConstantBuffer] + m_MatrixParams: List[MatrixParameter] + m_Samplers: List[SamplerParameter] + m_TextureParams: List[TextureParameter] + m_UAVParams: List[UAVParameter] + m_VectorParams: List[VectorParameter] + +@define(kw_only=True, slots=False) +class SerializedProperties: + m_Props: List[SerializedProperty] + +@define(kw_only=True, slots=False) +class SerializedProperty: + m_Attributes: List[str] + m_DefTexture: SerializedTextureProperty + m_DefValue_0_: float + m_DefValue_1_: float + m_DefValue_2_: float + m_DefValue_3_: float + m_Description: str + m_Flags: int + m_Name: str + m_Type: int + +@define(kw_only=True, slots=False) +class SerializedShader: + m_CustomEditorName: str + m_Dependencies: List[SerializedShaderDependency] + m_DisableNoSubshadersMessage: bool + m_FallbackName: str + m_Name: str + m_PropInfo: SerializedProperties + m_SubShaders: List[SerializedSubShader] + m_CustomEditorForRenderPipelines: Optional[List[SerializedCustomEditorForRenderPipeline]] = None + m_KeywordFlags: Optional[List[int]] = None + m_KeywordNames: Optional[List[str]] = None + +@define(kw_only=True, slots=False) +class SerializedShaderDependency: + from_: str + to: str + +@define(kw_only=True, slots=False) +class SerializedShaderFloatValue: + name: Union[FastPropertyName, str] + val: float + +@define(kw_only=True, slots=False) +class SerializedShaderRTBlendState: + blendOp: SerializedShaderFloatValue + blendOpAlpha: SerializedShaderFloatValue + colMask: SerializedShaderFloatValue + destBlend: SerializedShaderFloatValue + destBlendAlpha: SerializedShaderFloatValue + srcBlend: SerializedShaderFloatValue + srcBlendAlpha: SerializedShaderFloatValue + +@define(kw_only=True, slots=False) +class SerializedShaderState: + alphaToMask: SerializedShaderFloatValue + culling: SerializedShaderFloatValue + fogColor: SerializedShaderVectorValue + fogDensity: SerializedShaderFloatValue + fogEnd: SerializedShaderFloatValue + fogMode: int + fogStart: SerializedShaderFloatValue + gpuProgramID: int + lighting: bool + m_LOD: int + m_Name: str + m_Tags: SerializedTagMap + offsetFactor: SerializedShaderFloatValue + offsetUnits: SerializedShaderFloatValue + rtBlend0: SerializedShaderRTBlendState + rtBlend1: SerializedShaderRTBlendState + rtBlend2: SerializedShaderRTBlendState + rtBlend3: SerializedShaderRTBlendState + rtBlend4: SerializedShaderRTBlendState + rtBlend5: SerializedShaderRTBlendState + rtBlend6: SerializedShaderRTBlendState + rtBlend7: SerializedShaderRTBlendState + rtSeparateBlend: bool + stencilOp: SerializedStencilOp + stencilOpBack: SerializedStencilOp + stencilOpFront: SerializedStencilOp + stencilReadMask: SerializedShaderFloatValue + stencilRef: SerializedShaderFloatValue + stencilWriteMask: SerializedShaderFloatValue + zTest: SerializedShaderFloatValue + zWrite: SerializedShaderFloatValue + conservative: Optional[SerializedShaderFloatValue] = None + zClip: Optional[SerializedShaderFloatValue] = None + +@define(kw_only=True, slots=False) +class SerializedShaderVectorValue: + name: Union[FastPropertyName, str] + w: SerializedShaderFloatValue + x: SerializedShaderFloatValue + y: SerializedShaderFloatValue + z: SerializedShaderFloatValue + +@define(kw_only=True, slots=False) +class SerializedStencilOp: + comp: SerializedShaderFloatValue + fail: SerializedShaderFloatValue + pass_: SerializedShaderFloatValue + zFail: SerializedShaderFloatValue + +@define(kw_only=True, slots=False) +class SerializedSubProgram: + m_BlobIndex: int + m_Channels: ParserBindChannels + m_GpuProgramType: int + m_ShaderHardwareTier: int + m_BufferParams: Optional[List[BufferBinding]] = None + m_ConstantBufferBindings: Optional[List[BufferBinding]] = None + m_ConstantBuffers: Optional[List[ConstantBuffer]] = None + m_GlobalKeywordIndices: Optional[List[int]] = None + m_KeywordIndices: Optional[List[int]] = None + m_LocalKeywordIndices: Optional[List[int]] = None + m_MatrixParams: Optional[List[MatrixParameter]] = None + m_Parameters: Optional[SerializedProgramParameters] = None + m_Samplers: Optional[List[SamplerParameter]] = None + m_ShaderRequirements: Optional[int] = None + m_TextureParams: Optional[List[TextureParameter]] = None + m_UAVParams: Optional[List[UAVParameter]] = None + m_VectorParams: Optional[List[VectorParameter]] = None + +@define(kw_only=True, slots=False) +class SerializedSubShader: + m_LOD: int + m_Passes: List[SerializedPass] + m_Tags: SerializedTagMap + +@define(kw_only=True, slots=False) +class SerializedTagMap: + tags: List[Tuple[str, str]] + +@define(kw_only=True, slots=False) +class SerializedTextureProperty: + m_DefaultName: str + m_TexDim: int + +@define(kw_only=True, slots=False) +class ShaderBindChannel: + source: int + target: int + +@define(kw_only=True, slots=False) +class ShaderInfo: + variants: List[VariantInfo] + +@define(kw_only=True, slots=False) +class ShadowSettings: + m_Bias: float + m_Resolution: int + m_Strength: float + m_Type: int + m_CullingMatrixOverride: Optional[Matrix4x4f] = None + m_CustomResolution: Optional[int] = None + m_NearPlane: Optional[float] = None + m_NormalBias: Optional[float] = None + m_Softness: Optional[float] = None + m_SoftnessFade: Optional[float] = None + m_UseCullingMatrixOverride: Optional[bool] = None + +@define(kw_only=True, slots=False) +class ShapeModule: + angle: float + enabled: bool + m_Mesh: PPtr[Mesh] + placementMode: int + radius: Union[MultiModeParameter, float] + type: int + alignToDirection: Optional[bool] = None + arc: Optional[Union[MultiModeParameter, float]] = None + boxThickness: Optional[Vector3f] = None + boxX: Optional[float] = None + boxY: Optional[float] = None + boxZ: Optional[float] = None + donutRadius: Optional[float] = None + length: Optional[float] = None + m_MeshMaterialIndex: Optional[int] = None + m_MeshNormalOffset: Optional[float] = None + m_MeshRenderer: Optional[PPtr[MeshRenderer]] = None + m_MeshScale: Optional[float] = None + m_MeshSpawn: Optional[MultiModeParameter] = None + m_Position: Optional[Vector3f] = None + m_Rotation: Optional[Vector3f] = None + m_Scale: Optional[Vector3f] = None + m_SkinnedMeshRenderer: Optional[PPtr[SkinnedMeshRenderer]] = None + m_Sprite: Optional[PPtr[Sprite]] = None + m_SpriteRenderer: Optional[PPtr[SpriteRenderer]] = None + m_Texture: Optional[PPtr[Texture2D]] = None + m_TextureAlphaAffectsParticles: Optional[bool] = None + m_TextureBilinearFiltering: Optional[bool] = None + m_TextureClipChannel: Optional[int] = None + m_TextureClipThreshold: Optional[float] = None + m_TextureColorAffectsParticles: Optional[bool] = None + m_TextureUVChannel: Optional[int] = None + m_UseMeshColors: Optional[bool] = None + m_UseMeshMaterialIndex: Optional[bool] = None + radiusThickness: Optional[float] = None + randomDirection: Optional[bool] = None + randomDirectionAmount: Optional[float] = None + randomPositionAmount: Optional[float] = None + sphericalDirectionAmount: Optional[float] = None + +@define(kw_only=True, slots=False) +class SizeBySpeedModule: + curve: MinMaxCurve + enabled: bool + range: Vector2f + separateAxes: Optional[bool] = None + y: Optional[MinMaxCurve] = None + z: Optional[MinMaxCurve] = None + +@define(kw_only=True, slots=False) +class SizeModule: + curve: MinMaxCurve + enabled: bool + separateAxes: Optional[bool] = None + y: Optional[MinMaxCurve] = None + z: Optional[MinMaxCurve] = None + +@define(kw_only=True, slots=False) +class Skeleton: + m_AxesArray: List[Axes] + m_ID: List[int] + m_Node: List[Node] + +@define(kw_only=True, slots=False) +class SkeletonBone: + m_Name: str + m_Position: Vector3f + m_Rotation: Quaternionf + m_Scale: Vector3f + m_ParentName: Optional[str] = None + m_TransformModified: Optional[bool] = None + +@define(kw_only=True, slots=False) +class SkeletonBoneLimit: + m_Length: float + m_Max: Vector3f + m_Min: Vector3f + m_Modified: bool + m_Value: Vector3f + m_PostQ: Optional[Quaternionf] = None + m_PreQ: Optional[Quaternionf] = None + +@define(kw_only=True, slots=False) +class SkeletonMask: + m_Data: List[SkeletonMaskElement] + +@define(kw_only=True, slots=False) +class SkeletonMaskElement: + m_Weight: float + m_Index: Optional[int] = None + m_PathHash: Optional[int] = None + +@define(kw_only=True, slots=False) +class SkeletonPose: + m_X: List[xform] + +@define(kw_only=True, slots=False) +class SketchUpImportCamera: + aspectRatio: float + fov: float + isPerspective: int + lookAt: Vector3f + orthoSize: float + position: Vector3f + up: Vector3f + farPlane: Optional[float] = None + nearPlane: Optional[float] = None + +@define(kw_only=True, slots=False) +class SketchUpImportData: + defaultCamera: SketchUpImportCamera + scenes: List[SketchUpImportScene] + +@define(kw_only=True, slots=False) +class SketchUpImportScene: + camera: SketchUpImportCamera + name: str + +@define(kw_only=True, slots=False) +class SnapshotConstant: + nameHash: int + transitionIndices: List[int] + transitionTypes: List[int] + values: List[float] + +@define(kw_only=True, slots=False) +class SoftJointLimit: + bounciness: float + limit: float + contactDistance: Optional[float] = None + damper: Optional[float] = None + spring: Optional[float] = None + +@define(kw_only=True, slots=False) +class SoftJointLimitSpring: + damper: float + spring: float + +@define(kw_only=True, slots=False) +class SortingLayerEntry: + name: str + uniqueID: int + userID: Optional[int] = None + +@define(kw_only=True, slots=False) +class SourceAssetIdentifier: + assembly: str + name: str + type: str + +@define(kw_only=True, slots=False) +class SourceTextureInformation: + doesTextureContainAlpha: bool + height: int + width: int + doesTextureContainColor: Optional[bool] = None + sourceWasHDR: Optional[bool] = None + +@define(kw_only=True, slots=False) +class SpeedTreeWind: + BRANCH_DIRECTIONAL_1: bool + BRANCH_DIRECTIONAL_2: bool + BRANCH_DIRECTIONAL_FROND_1: bool + BRANCH_DIRECTIONAL_FROND_2: bool + BRANCH_OSC_COMPLEX_1: bool + BRANCH_OSC_COMPLEX_2: bool + BRANCH_SIMPLE_1: bool + BRANCH_SIMPLE_2: bool + BRANCH_TURBULENCE_1: bool + BRANCH_TURBULENCE_2: bool + BRANCH_WHIP_1: bool + BRANCH_WHIP_2: bool + BranchWindAnchor0: float + BranchWindAnchor1: float + BranchWindAnchor2: float + FROND_RIPPLE_ADJUST_LIGHTING: bool + FROND_RIPPLE_ONE_SIDED: bool + FROND_RIPPLE_TWO_SIDED: bool + GLOBAL_PRESERVE_SHAPE: bool + GLOBAL_WIND: bool + LEAF_OCCLUSION_1: bool + LEAF_OCCLUSION_2: bool + LEAF_RIPPLE_COMPUTED_1: bool + LEAF_RIPPLE_COMPUTED_2: bool + LEAF_RIPPLE_VERTEX_NORMAL_1: bool + LEAF_RIPPLE_VERTEX_NORMAL_2: bool + LEAF_TUMBLE_1: bool + LEAF_TUMBLE_2: bool + LEAF_TWITCH_1: bool + LEAF_TWITCH_2: bool + ROLLING: bool + m_fMaxBranchLevel1Length: float + m_sParams: SParams + +@define(kw_only=True, slots=False) +class SpeedTreeWindConfig8: + BRANCH_DIRECTIONAL_1: bool + BRANCH_DIRECTIONAL_2: bool + BRANCH_DIRECTIONAL_FROND_1: bool + BRANCH_DIRECTIONAL_FROND_2: bool + BRANCH_OSC_COMPLEX_1: bool + BRANCH_OSC_COMPLEX_2: bool + BRANCH_SIMPLE_1: bool + BRANCH_SIMPLE_2: bool + BRANCH_TURBULENCE_1: bool + BRANCH_TURBULENCE_2: bool + BRANCH_WHIP_1: bool + BRANCH_WHIP_2: bool + BranchLevel1: SBranchWindLevel + BranchLevel2: SBranchWindLevel + BranchWindAnchor0: float + BranchWindAnchor1: float + BranchWindAnchor2: float + FROND_RIPPLE_ADJUST_LIGHTING: bool + FROND_RIPPLE_ONE_SIDED: bool + FROND_RIPPLE_TWO_SIDED: bool + GLOBAL_PRESERVE_SHAPE: bool + GLOBAL_WIND: bool + LEAF_OCCLUSION_1: bool + LEAF_OCCLUSION_2: bool + LEAF_RIPPLE_COMPUTED_1: bool + LEAF_RIPPLE_COMPUTED_2: bool + LEAF_RIPPLE_VERTEX_NORMAL_1: bool + LEAF_RIPPLE_VERTEX_NORMAL_2: bool + LEAF_TUMBLE_1: bool + LEAF_TUMBLE_2: bool + LEAF_TWITCH_1: bool + LEAF_TWITCH_2: bool + LeafGroup1: SWindGroup + LeafGroup2: SWindGroup + Oscillation0_0: float + Oscillation0_1: float + Oscillation0_2: float + Oscillation0_3: float + Oscillation0_4: float + Oscillation0_5: float + Oscillation0_6: float + Oscillation0_7: float + Oscillation0_8: float + Oscillation0_9: float + Oscillation1_0: float + Oscillation1_1: float + Oscillation1_2: float + Oscillation1_3: float + Oscillation1_4: float + Oscillation1_5: float + Oscillation1_6: float + Oscillation1_7: float + Oscillation1_8: float + Oscillation1_9: float + Oscillation2_0: float + Oscillation2_1: float + Oscillation2_2: float + Oscillation2_3: float + Oscillation2_4: float + Oscillation2_5: float + Oscillation2_6: float + Oscillation2_7: float + Oscillation2_8: float + Oscillation2_9: float + Oscillation3_0: float + Oscillation3_1: float + Oscillation3_2: float + Oscillation3_3: float + Oscillation3_4: float + Oscillation3_5: float + Oscillation3_6: float + Oscillation3_7: float + Oscillation3_8: float + Oscillation3_9: float + Oscillation4_0: float + Oscillation4_1: float + Oscillation4_2: float + Oscillation4_3: float + Oscillation4_4: float + Oscillation4_5: float + Oscillation4_6: float + Oscillation4_7: float + Oscillation4_8: float + Oscillation4_9: float + Oscillation5_0: float + Oscillation5_1: float + Oscillation5_2: float + Oscillation5_3: float + Oscillation5_4: float + Oscillation5_5: float + Oscillation5_6: float + Oscillation5_7: float + Oscillation5_8: float + Oscillation5_9: float + Oscillation6_0: float + Oscillation6_1: float + Oscillation6_2: float + Oscillation6_3: float + Oscillation6_4: float + Oscillation6_5: float + Oscillation6_6: float + Oscillation6_7: float + Oscillation6_8: float + Oscillation6_9: float + Oscillation7_0: float + Oscillation7_1: float + Oscillation7_2: float + Oscillation7_3: float + Oscillation7_4: float + Oscillation7_5: float + Oscillation7_6: float + Oscillation7_7: float + Oscillation7_8: float + Oscillation7_9: float + Oscillation8_0: float + Oscillation8_1: float + Oscillation8_2: float + Oscillation8_3: float + Oscillation8_4: float + Oscillation8_5: float + Oscillation8_6: float + Oscillation8_7: float + Oscillation8_8: float + Oscillation8_9: float + Oscillation9_0: float + Oscillation9_1: float + Oscillation9_2: float + Oscillation9_3: float + Oscillation9_4: float + Oscillation9_5: float + Oscillation9_6: float + Oscillation9_7: float + Oscillation9_8: float + Oscillation9_9: float + ROLLING: bool + m_afFrondRippleDistance_0: float + m_afFrondRippleDistance_1: float + m_afFrondRippleDistance_2: float + m_afFrondRippleDistance_3: float + m_afFrondRippleDistance_4: float + m_afFrondRippleDistance_5: float + m_afFrondRippleDistance_6: float + m_afFrondRippleDistance_7: float + m_afFrondRippleDistance_8: float + m_afFrondRippleDistance_9: float + m_afGlobalDirectionAdherence_0: float + m_afGlobalDirectionAdherence_1: float + m_afGlobalDirectionAdherence_2: float + m_afGlobalDirectionAdherence_3: float + m_afGlobalDirectionAdherence_4: float + m_afGlobalDirectionAdherence_5: float + m_afGlobalDirectionAdherence_6: float + m_afGlobalDirectionAdherence_7: float + m_afGlobalDirectionAdherence_8: float + m_afGlobalDirectionAdherence_9: float + m_afGlobalDistance_0: float + m_afGlobalDistance_1: float + m_afGlobalDistance_2: float + m_afGlobalDistance_3: float + m_afGlobalDistance_4: float + m_afGlobalDistance_5: float + m_afGlobalDistance_6: float + m_afGlobalDistance_7: float + m_afGlobalDistance_8: float + m_afGlobalDistance_9: float + m_fAnchorDistanceScale: float + m_fAnchorOffset: float + m_fDirectionResponse: float + m_fFrondRippleLightingScalar: float + m_fFrondRippleTile: float + m_fGlobalHeight: float + m_fGlobalHeightExponent: float + m_fGustDurationMax: float + m_fGustDurationMin: float + m_fGustFallScalar: float + m_fGustFrequency: float + m_fGustRiseScalar: float + m_fGustStrengthMax: float + m_fGustStrengthMin: float + m_fMaxBranchLevel1Length: float + m_fRollingBranchFieldMin: float + m_fRollingBranchLightingAdjust: float + m_fRollingBranchVerticalOffset: float + m_fRollingLeafRippleMin: float + m_fRollingLeafTumbleMin: float + m_fRollingNoisePeriod: float + m_fRollingNoiseSize: float + m_fRollingNoiseSpeed: float + m_fRollingNoiseTurbulence: float + m_fRollingNoiseTwist: float + m_fStrengthResponse: float + +@define(kw_only=True, slots=False) +class SpeedTreeWindConfig9: + m_bDoBranch1: int + m_bDoBranch2: int + m_bDoRipple: int + m_bDoShared: int + m_bDoShimmer: int + m_bLodFade: int + m_fBranch1StretchLimit: float + m_fBranch2StretchLimit: float + m_fDirectionResponse: float + m_fGustDurationMax: float + m_fGustDurationMin: float + m_fGustFallScalar: float + m_fGustFrequency: float + m_fGustRiseScalar: float + m_fGustStrengthMax: float + m_fGustStrengthMin: float + m_fSharedHeightStart: float + m_fStrengthResponse: float + m_fWindIndependence: float + m_sBranch1: BranchWindLevel + m_sBranch2: BranchWindLevel + m_sRipple: RippleGroup + m_sShared: BranchWindLevel + m_vTreeExtents: Vector3f + m_fImportScaling: Optional[float] = None + pad: Optional[int] = None + +@define(kw_only=True, slots=False) +class SphericalHarmonicsL2: + sh_10_: float + sh_11_: float + sh_12_: float + sh_13_: float + sh_14_: float + sh_15_: float + sh_16_: float + sh_17_: float + sh_18_: float + sh_19_: float + sh_20_: float + sh_21_: float + sh_22_: float + sh_23_: float + sh_24_: float + sh_25_: float + sh_26_: float + sh__0_: float + sh__1_: float + sh__2_: float + sh__3_: float + sh__4_: float + sh__5_: float + sh__6_: float + sh__7_: float + sh__8_: float + sh__9_: float + +@define(kw_only=True, slots=False) +class SplashScreenLogo: + duration: float + logo: PPtr[Sprite] + +@define(kw_only=True, slots=False) +class SplatDatabase: + m_AlphaTextures: List[PPtr[Texture2D]] + m_AlphamapResolution: int + m_BaseMapResolution: int + m_ColorSpace: Optional[int] = None + m_MaterialRequiresMetallic: Optional[bool] = None + m_MaterialRequiresSmoothness: Optional[bool] = None + m_Splats: Optional[List[SplatPrototype]] = None + m_TerrainLayers: Optional[List[PPtr[TerrainLayer]]] = None + +@define(kw_only=True, slots=False) +class SplatPrototype: + texture: PPtr[Texture2D] + tileOffset: Vector2f + tileSize: Vector2f + normalMap: Optional[PPtr[Texture2D]] = None + smoothness: Optional[float] = None + specularMetallic: Optional[Vector4f] = None + +@define(kw_only=True, slots=False) +class SpriteAtlasAssetData: + packables: List[PPtr[Object]] + +@define(kw_only=True, slots=False) +class SpriteAtlasData: + alphaTexture: PPtr[Texture2D] + downscaleMultiplier: float + settingsRaw: int + texture: PPtr[Texture2D] + textureRect: Rectf + textureRectOffset: Vector2f + uvTransform: Vector4f + atlasRectOffset: Optional[Vector2f] = None + secondaryTextures: Optional[List[SecondarySpriteTexture]] = None + +@define(kw_only=True, slots=False) +class SpriteAtlasEditorData: + bindAsDefault: bool + cachedData: PPtr[CachedSpriteAtlasRuntimeData] + isAtlasV2: bool + packables: List[PPtr[Object]] + packingSettings: PackingSettings + platformSettings: List[TextureImporterPlatformSettings] + textureSettings: TextureSettings + variantMultiplier: float + secondaryTextureSettings: Optional[List[Tuple[str, SecondaryTextureSettings]]] = None + storedHash: Optional[Hash128] = None + totalSpriteSurfaceArea: Optional[int] = None + +@define(kw_only=True, slots=False) +class SpriteBone: + length: float + name: str + parentId: int + position: Vector3f + rotation: Quaternionf + color: Optional[ColorRGBA] = None + guid: Optional[str] = None + +@define(kw_only=True, slots=False) +class SpriteCustomDataEntry: + m_Key: str + m_Value: str + +@define(kw_only=True, slots=False) +class SpriteCustomMetadata: + m_Entries: List[SpriteCustomDataEntry] + +@define(kw_only=True, slots=False) +class SpriteData: + sprite: PPtr[Object] + +@define(kw_only=True, slots=False) +class SpriteMetaData: + m_Alignment: int + m_Name: str + m_Pivot: Vector2f + m_Rect: Rectf + m_Bones: Optional[List[SpriteBone]] = None + m_Border: Optional[Vector4f] = None + m_CustomData: Optional[str] = None + m_Edges: Optional[List[int2_storage]] = None + m_Indices: Optional[List[int]] = None + m_InternalID: Optional[int] = None + m_Outline: Optional[List[List[Vector2f]]] = None + m_PhysicsShape: Optional[List[List[Vector2f]]] = None + m_SpriteID: Optional[str] = None + m_TessellationDetail: Optional[float] = None + m_Vertices: Optional[List[Vector2f]] = None + m_Weights: Optional[List[BoneWeights4]] = None + +@define(kw_only=True, slots=False) +class SpriteRenderData: + settingsRaw: int + texture: PPtr[Texture2D] + textureRect: Rectf + textureRectOffset: Vector2f + alphaTexture: Optional[PPtr[Texture2D]] = None + atlasRectOffset: Optional[Vector2f] = None + downscaleMultiplier: Optional[float] = None + indices: Optional[List[int]] = None + m_Bindpose: Optional[List[Matrix4x4f]] = None + m_IndexBuffer: Optional[List[int]] = None + m_SourceSkin: Optional[List[BoneWeights4]] = None + m_SubMeshes: Optional[List[SubMesh]] = None + m_VertexData: Optional[VertexData] = None + secondaryTextures: Optional[List[SecondarySpriteTexture]] = None + uvTransform: Optional[Vector4f] = None + vertices: Optional[List[SpriteVertex]] = None + +@define(kw_only=True, slots=False) +class SpriteSheetMetaData: + m_Sprites: List[SpriteMetaData] + m_Bones: Optional[List[SpriteBone]] = None + m_CustomData: Optional[str] = None + m_Edges: Optional[List[int2_storage]] = None + m_Indices: Optional[List[int]] = None + m_InternalID: Optional[int] = None + m_NameFileIdTable: Optional[List[Tuple[str, int]]] = None + m_Outline: Optional[List[List[Vector2f]]] = None + m_PhysicsShape: Optional[List[List[Vector2f]]] = None + m_SecondaryTextures: Optional[List[SecondarySpriteTexture]] = None + m_SpriteCustomMetadata: Optional[SpriteCustomMetadata] = None + m_SpriteID: Optional[str] = None + m_Vertices: Optional[List[Vector2f]] = None + m_Weights: Optional[List[BoneWeights4]] = None + +@define(kw_only=True, slots=False) +class SpriteTilingProperty: + adaptiveTiling: bool + adaptiveTilingThreshold: float + border: Vector4f + drawMode: int + newSize: Vector2f + oldSize: Vector2f + pivot: Vector2f + +@define(kw_only=True, slots=False) +class SpriteVertex: + pos: Vector3f + uv: Optional[Vector2f] = None + +@define(kw_only=True, slots=False) +class State(NamedObject): + m_IKOnFeet: bool + m_Motions: List[PPtr[Motion]] + m_Name: str + m_ParentStateMachine: PPtr[StateMachine] + m_Position: Vector3f + m_Speed: float + m_Tag: str + m_CycleOffset: Optional[float] = None + m_Mirror: Optional[bool] = None + +@define(kw_only=True, slots=False) +class StateConstant: + m_BlendTreeConstantArray: List[OffsetPtr] + m_BlendTreeConstantIndexArray: List[int] + m_IKOnFeet: bool + m_Loop: bool + m_Speed: float + m_TagID: int + m_TransitionConstantArray: List[OffsetPtr] + m_CycleOffset: Optional[float] = None + m_CycleOffsetParamID: Optional[int] = None + m_FullPathID: Optional[int] = None + m_ID: Optional[int] = None + m_LeafInfoArray: Optional[List[LeafInfoConstant]] = None + m_Mirror: Optional[bool] = None + m_MirrorParamID: Optional[int] = None + m_NameID: Optional[int] = None + m_PathID: Optional[int] = None + m_SpeedParamID: Optional[int] = None + m_TimeParamID: Optional[int] = None + m_WriteDefaultValues: Optional[bool] = None + +@define(kw_only=True, slots=False) +class StateKey: + m_LayerIndex: int + m_StateID: int + +@define(kw_only=True, slots=False) +class StateMachine(NamedObject): + m_AnyStatePosition: Vector3f + m_ChildStateMachine: List[PPtr[StateMachine]] + m_ChildStateMachinePosition: List[Vector3f] + m_DefaultState: PPtr[State] + m_MotionSetCount: int + m_Name: str + m_OrderedTransitions: List[Tuple[PPtr[State], List[PPtr[Transition]]]] + m_ParentStateMachinePosition: Vector3f + m_States: List[PPtr[State]] + m_LocalTransitions: Optional[List[Tuple[PPtr[State], List[PPtr[Transition]]]]] = None + +@define(kw_only=True, slots=False) +class StateMachineBehaviourVectorDescription: + m_StateMachineBehaviourIndices: List[int] + m_StateMachineBehaviourRanges: List[Tuple[StateKey, StateRange]] + +@define(kw_only=True, slots=False) +class StateMachineConstant: + m_AnyStateTransitionConstantArray: List[OffsetPtr] + m_DefaultState: int + m_StateConstantArray: List[OffsetPtr] + m_MotionSetCount: Optional[int] = None + m_SelectorStateConstantArray: Optional[List[OffsetPtr]] = None + m_SynchronizedLayerCount: Optional[int] = None + +@define(kw_only=True, slots=False) +class StateRange: + m_Count: int + m_StartIndex: int + +@define(kw_only=True, slots=False) +class StaticBatchInfo: + firstSubMesh: int + subMeshCount: int + +@define(kw_only=True, slots=False) +class StreamInfo: + channelMask: int + offset: int + stride: int + align: Optional[int] = None + dividerOp: Optional[int] = None + frequency: Optional[int] = None + +@define(kw_only=True, slots=False) +class StreamedClip: + curveCount: int + data: List[int] + discreteCurveCount: Optional[int] = None + +@define(kw_only=True, slots=False) +class StreamedResource: + m_Offset: int + m_Size: int + m_Source: str + +@define(kw_only=True, slots=False) +class StreamingInfo: + offset: int + path: str + size: int + +@define(kw_only=True, slots=False) +class StructParameter: + m_ArraySize: int + m_Index: int + m_MatrixMembers: List[MatrixParameter] + m_NameIndex: int + m_StructSize: int + m_VectorMembers: List[VectorParameter] + +@define(kw_only=True, slots=False) +class SubCollider: + m_Collider: PPtr[Collider2D] + m_ColliderPaths: List[List[IntPoint]] + +@define(kw_only=True, slots=False) +class SubEmitterData: + emitter: PPtr[ParticleSystem] + properties: int + type: int + emitProbability: Optional[float] = None + +@define(kw_only=True, slots=False) +class SubMesh: + firstByte: int + firstVertex: int + indexCount: int + localAABB: AABB + vertexCount: int + baseVertex: Optional[int] = None + isTriStrip: Optional[int] = None + topology: Optional[int] = None + triangleCount: Optional[int] = None + +@define(kw_only=True, slots=False) +class SubModule: + enabled: bool + subEmitterBirth: Optional[PPtr[ParticleSystem]] = None + subEmitterBirth1: Optional[PPtr[ParticleSystem]] = None + subEmitterCollision: Optional[PPtr[ParticleSystem]] = None + subEmitterCollision1: Optional[PPtr[ParticleSystem]] = None + subEmitterDeath: Optional[PPtr[ParticleSystem]] = None + subEmitterDeath1: Optional[PPtr[ParticleSystem]] = None + subEmitters: Optional[List[SubEmitterData]] = None + +@define(kw_only=True, slots=False) +class SubPassDescriptor: + colorOutputs: AttachmentIndexArray + flags: int + inputs: AttachmentIndexArray + +@define(kw_only=True, slots=False) +class SubstanceEnumItem: + text: str + value: int + +@define(kw_only=True, slots=False) +class SubstanceInput: + alteredTexturesUID: List[int] + enumValues: List[SubstanceEnumItem] + flags: int + internalIndex: int + internalType: int + maximum: float + minimum: float + name: str + step: float + type: int + value: SubstanceValue + componentLabels: Optional[List[str]] = None + group: Optional[str] = None + internalIdentifier: Optional[int] = None + label: Optional[str] = None + visibleIf: Optional[str] = None + +@define(kw_only=True, slots=False) +class SubstanceValue: + scalar_0_: float + scalar_1_: float + scalar_2_: float + scalar_3_: float + texture: PPtr[Texture2D] + stringvalue: Optional[str] = None + +@define(kw_only=True, slots=False) +class TakeInfo: + bakeStartTime: float + bakeStopTime: float + clip: PPtr[AnimationClip] + defaultClipName: str + name: str + sampleRate: float + startTime: float + stopTime: float + internalID: Optional[int] = None + +@define(kw_only=True, slots=False) +class Tetrahedron: + indices_0_: int + indices_1_: int + indices_2_: int + indices_3_: int + matrix: Matrix3x4f + neighbors_0_: int + neighbors_1_: int + neighbors_2_: int + neighbors_3_: int + +@define(kw_only=True, slots=False) +class TextureImportInstructions: + colorSpace: int + compressedFormat: int + compressionQuality: int + height: int + uncompressedFormat: int + usageMode: int + width: int + androidETC2FallbackDownscale: Optional[bool] = None + androidETC2FallbackFormat: Optional[int] = None + cubeIntermediateSize: Optional[int] = None + cubeLayout: Optional[int] = None + cubeMode: Optional[int] = None + depth: Optional[int] = None + desiredFormat: Optional[int] = None + recommendedFormat: Optional[int] = None + vtOnly: Optional[bool] = None + +@define(kw_only=True, slots=False) +class TextureImportOutput: + sourceTextureInformation: SourceTextureInformation + textureImportInstructions: TextureImportInstructions + importInspectorWarnings: Optional[str] = None + +@define(kw_only=True, slots=False) +class TextureImporterPlatformSettings: + m_AllowsAlphaSplitting: bool + m_AndroidETC2FallbackOverride: int + m_BuildTarget: str + m_CompressionQuality: int + m_CrunchedCompression: bool + m_MaxTextureSize: int + m_Overridden: bool + m_ResizeAlgorithm: int + m_TextureCompression: int + m_TextureFormat: int + m_ForceMaximumCompressionQuality_BC6H_BC7: Optional[bool] = None + m_IgnorePlatformSupport: Optional[bool] = None + +@define(kw_only=True, slots=False) +class TextureParameter: + m_Dim: int + m_Index: int + m_NameIndex: int + m_SamplerIndex: int + m_MultiSampled: Optional[bool] = None + +@define(kw_only=True, slots=False) +class TextureParameters: + height: int + mipLevels: int + textureFormat: int + width: int + +@define(kw_only=True, slots=False) +class TextureSettings: + anisoLevel: int + compressionQuality: int + crunchedCompression: bool + filterMode: int + generateMipMaps: bool + maxTextureSize: int + readable: bool + sRGB: bool + textureCompression: int + +@define(kw_only=True, slots=False) +class TicksPerSecond: + m_Denominator: int + m_Numerator: int + +@define(kw_only=True, slots=False) +class TierGraphicsSettings: + renderingPath: int + useCascadedShadowMaps: bool + enableLPPV: Optional[bool] = None + hdrMode: Optional[int] = None + prefer32BitShadowMaps: Optional[bool] = None + realtimeGICPUUsage: Optional[int] = None + useHDR: Optional[bool] = None + +@define(kw_only=True, slots=False) +class Tile: + m_TileColorIndex: int + m_TileIndex: int + m_TileMatrixIndex: int + m_TileSpriteIndex: int + dummyAlignment: Optional[int] = None + m_AllTileFlags: Optional[int] = None + m_ColliderType: Optional[int] = None + m_ObjectToInstantiate: Optional[PPtr[GameObject]] = None + m_TileFlags: Optional[int] = None + m_TileObjectToInstantiateIndex: Optional[int] = None + +@define(kw_only=True, slots=False) +class TileAnimationData: + m_AnimatedSprites: List[PPtr[Sprite]] + m_AnimationSpeed: float + m_AnimationTimeOffset: float + m_Flags: Optional[int] = None + m_IsLooping: Optional[bool] = None + +@define(kw_only=True, slots=False) +class TilemapRefCountedData: + m_Data: Union[PPtr[GameObject], ColorRGBA, PPtr[Object], Matrix4x4f, PPtr[Sprite]] + m_RefCount: int + +@define(kw_only=True, slots=False) +class TrailModule: + colorOverLifetime: MinMaxGradient + colorOverTrail: MinMaxGradient + dieWithParticles: bool + enabled: bool + inheritParticleColor: bool + lifetime: MinMaxCurve + minVertexDistance: float + ratio: float + sizeAffectsLifetime: bool + sizeAffectsWidth: bool + textureMode: int + widthOverTrail: MinMaxCurve + worldSpace: bool + attachRibbonsToTransform: Optional[bool] = None + generateLightingData: Optional[bool] = None + mode: Optional[int] = None + ribbonCount: Optional[int] = None + shadowBias: Optional[float] = None + splitSubEmitterRibbons: Optional[bool] = None + textureScale: Optional[Vector2f] = None + +@define(kw_only=True, slots=False) +class TransformMaskElement: + m_Path: str + m_Weight: float + +@define(kw_only=True, slots=False) +class Transition(NamedObject): + m_Atomic: bool + m_Conditions: List[Condition] + m_DstState: PPtr[State] + m_Mute: bool + m_Name: str + m_Solo: bool + m_SrcState: PPtr[State] + m_TransitionDuration: float + m_TransitionOffset: float + m_CanTransitionToSelf: Optional[bool] = None + +@define(kw_only=True, slots=False) +class TransitionConstant: + m_ConditionConstantArray: List[OffsetPtr] + m_DestinationState: int + m_ID: int + m_TransitionDuration: float + m_TransitionOffset: float + m_UserID: int + m_Atomic: Optional[bool] = None + m_CanTransitionToSelf: Optional[bool] = None + m_ExitTime: Optional[float] = None + m_FullPathID: Optional[int] = None + m_HasExitTime: Optional[bool] = None + m_HasFixedDuration: Optional[bool] = None + m_InterruptionSource: Optional[int] = None + m_OrderedInterruption: Optional[bool] = None + +@define(kw_only=True, slots=False) +class TreeInstance: + color: ColorRGBA + heightScale: float + index: int + lightmapColor: ColorRGBA + position: Vector3f + widthScale: float + rotation: Optional[float] = None + +@define(kw_only=True, slots=False) +class TreePrototype: + bendFactor: float + prefab: PPtr[GameObject] + navMeshLod: Optional[int] = None + +@define(kw_only=True, slots=False) +class TriggerModule: + enabled: bool + enter: int + exit: int + inside: int + outside: int + radiusScale: float + colliderQueryMode: Optional[int] = None + collisionShape0: Optional[PPtr[Component]] = None + collisionShape1: Optional[PPtr[Component]] = None + collisionShape2: Optional[PPtr[Component]] = None + collisionShape3: Optional[PPtr[Component]] = None + collisionShape4: Optional[PPtr[Component]] = None + collisionShape5: Optional[PPtr[Component]] = None + primitives: Optional[List[PPtr[Component]]] = None + +@define(kw_only=True, slots=False) +class UAVParameter: + m_Index: int + m_NameIndex: int + m_OriginalIndex: int + +@define(kw_only=True, slots=False) +class UVAnimation: + cycles: float + x_Tile: int + y_Tile: int + +@define(kw_only=True, slots=False) +class UVModule: + animationType: int + cycles: float + enabled: bool + frameOverTime: MinMaxCurve + rowIndex: int + tilesX: int + tilesY: int + flipU: Optional[float] = None + flipV: Optional[float] = None + fps: Optional[float] = None + mode: Optional[int] = None + randomRow: Optional[bool] = None + rowMode: Optional[int] = None + speedRange: Optional[Vector2f] = None + sprites: Optional[List[SpriteData]] = None + startFrame: Optional[MinMaxCurve] = None + timeMode: Optional[int] = None + uvChannelMask: Optional[int] = None + +@define(kw_only=True, slots=False) +class UnityAdsSettings(GlobalGameManager): + m_Enabled: bool + m_InitializeOnStartup: bool + m_TestMode: bool + m_AndroidGameId: Optional[str] = None + m_EnabledPlatforms: Optional[int] = None + m_GameId: Optional[str] = None + m_IosGameId: Optional[str] = None + +@define(kw_only=True, slots=False) +class UnityAnalyticsSettings: + m_Enabled: bool + m_InitializeOnStartup: bool + m_TestMode: bool + m_PackageRequiringCoreStatsPresent: Optional[bool] = None + m_TestConfigUrl: Optional[str] = None + m_TestEventUrl: Optional[str] = None + +@define(kw_only=True, slots=False) +class UnityPropertySheet: + m_Colors: Union[List[Tuple[FastPropertyName, ColorRGBA]], List[Tuple[str, ColorRGBA]]] + m_Floats: Union[List[Tuple[FastPropertyName, float]], List[Tuple[str, float]]] + m_TexEnvs: Union[List[Tuple[FastPropertyName, UnityTexEnv]], List[Tuple[str, UnityTexEnv]]] + m_Ints: Optional[List[Tuple[str, int]]] = None + +@define(kw_only=True, slots=False) +class UnityPurchasingSettings: + m_Enabled: bool + m_TestMode: bool + +@define(kw_only=True, slots=False) +class UnityTexEnv: + m_Offset: Vector2f + m_Scale: Vector2f + m_Texture: PPtr[Texture] + +@define(kw_only=True, slots=False) +class UpdateZoneInfo: + needSwap: bool + passIndex: int + rotation: float + updateZoneCenter: Vector3f + updateZoneSize: Vector3f + +@define(kw_only=True, slots=False) +class VFXCPUBufferData: + data: List[int] + +@define(kw_only=True, slots=False) +class VFXCPUBufferDesc: + capacity: int + initialData: VFXCPUBufferData + layout: List[VFXLayoutElementDesc] + stride: int + +@define(kw_only=True, slots=False) +class VFXEditorSystemDesc: + buffers: List[VFXMapping] + capacity: int + flags: int + layer: int + tasks: List[VFXEditorTaskDesc] + type: int + values: List[VFXMapping] + name: Optional[str] = None + +@define(kw_only=True, slots=False) +class VFXEditorTaskDesc: + buffers: List[VFXMapping] + params: List[VFXMapping] + processor: PPtr[NamedObject] + shaderSourceIndex: int + type: int + values: List[VFXMapping] + temporaryBuffers: Optional[List[VFXMappingTemporary]] = None + +@define(kw_only=True, slots=False) +class VFXEntryExposed: + m_Name: str + m_Overridden: bool + m_Value: Union[Gradient, Vector3f, float, PPtr[NamedObject], Vector4f, AnimationCurve, PPtr[Object], int, Vector2f, bool, Matrix4x4f] + +@define(kw_only=True, slots=False) +class VFXEntryExpressionValue: + m_ExpressionIndex: int + m_Value: Union[Gradient, Vector3f, float, PPtr[NamedObject], Vector4f, AnimationCurve, PPtr[Object], int, Vector2f, bool, Matrix4x4f] + +@define(kw_only=True, slots=False) +class VFXEventDesc: + name: str + playSystems: List[int] + stopSystems: List[int] + initSystems: Optional[List[int]] = None + +@define(kw_only=True, slots=False) +class VFXExposedMapping: + mapping: VFXMapping + space: int + +@define(kw_only=True, slots=False) +class VFXExpressionContainer: + m_Expressions: List[Expression] + m_NeedsLocalToWorld: bool + m_NeedsWorldToLocal: bool + m_ConstantBakeCurveCount: Optional[int] = None + m_ConstantBakeGradientCount: Optional[int] = None + m_DynamicBakeCurveCount: Optional[int] = None + m_DynamicBakeGradientCount: Optional[int] = None + m_MaxCommonExpressionsIndex: Optional[int] = None + m_NeededMainCameraBuffers: Optional[int] = None + m_NeedsMainCamera: Optional[bool] = None + +@define(kw_only=True, slots=False) +class VFXField: + m_Array: Union[List[VFXEntryExpressionValue], List[VFXEntryExposed]] + +@define(kw_only=True, slots=False) +class VFXGPUBufferDesc: + capacity: int + layout: List[VFXLayoutElementDesc] + size: int + stride: int + mode: Optional[int] = None + target: Optional[int] = None + type: Optional[int] = None + +@define(kw_only=True, slots=False) +class VFXInstanceSplitDesc: + values: List[int] + +@define(kw_only=True, slots=False) +class VFXLayoutElementDesc: + name: str + offset: VFXLayoutOffset + type: int + +@define(kw_only=True, slots=False) +class VFXLayoutOffset: + bucket: int + element: int + structure: int + +@define(kw_only=True, slots=False) +class VFXMapping: + index: int + nameId: str + +@define(kw_only=True, slots=False) +class VFXMappingTemporary: + mapping: VFXMapping + pastFrameIndex: int + perCameraBuffer: bool + +@define(kw_only=True, slots=False) +class VFXPropertySheetSerializedBase: + m_AnimationCurve: VFXField + m_Bool: VFXField + m_Float: VFXField + m_Gradient: VFXField + m_Int: VFXField + m_Matrix4x4f: VFXField + m_NamedObject: VFXField + m_Uint: VFXField + m_Vector2f: VFXField + m_Vector3f: VFXField + m_Vector4f: VFXField + +@define(kw_only=True, slots=False) +class VFXRendererSettings: + lightProbeUsage: int + motionVectorGenerationMode: int + receiveShadows: bool + reflectionProbeUsage: int + shadowCastingMode: int + rayTracingMode: Optional[int] = None + +@define(kw_only=True, slots=False) +class VFXShaderSourceDesc: + compute: bool + name: str + source: str + +@define(kw_only=True, slots=False) +class VFXSystemDesc: + buffers: List[VFXMapping] + capacity: int + flags: int + layer: int + tasks: List[VFXTaskDesc] + type: int + values: List[VFXMapping] + instanceSplitDescs: Optional[List[VFXInstanceSplitDesc]] = None + name: Optional[str] = None + +@define(kw_only=True, slots=False) +class VFXTaskDesc: + buffers: List[VFXMapping] + params: List[VFXMapping] + processor: PPtr[NamedObject] + type: int + values: List[VFXMapping] + instanceSplitIndex: Optional[int] = None + temporaryBuffers: Optional[List[VFXMappingTemporary]] = None + +@define(kw_only=True, slots=False) +class VFXTemplate: + category: str + description: str + icon: PPtr[Texture2D] + name: str + thumbnail: PPtr[Texture2D] + +@define(kw_only=True, slots=False) +class VFXTemporaryGPUBufferDesc: + desc: VFXGPUBufferDesc + frameCount: int + +@define(kw_only=True, slots=False) +class VRSettings: + cardboard: Optional[Google] = None + daydream: Optional[Google] = None + enable360StereoCapture: Optional[bool] = None + hololens: Optional[HoloLens] = None + lumin: Optional[Lumin] = None + none: Optional[DeviceNone] = None + oculus: Optional[Oculus] = None + +@define(kw_only=True, slots=False) +class ValueArray: + m_BoolValues: List[bool] + m_FloatValues: List[float] + m_IntValues: List[int] + m_PositionValues: Optional[Union[List[float4], List[float3]]] = None + m_QuaternionValues: Optional[List[float4]] = None + m_ScaleValues: Optional[Union[List[float4], List[float3]]] = None + m_VectorValues: Optional[List[float4]] = None + +@define(kw_only=True, slots=False) +class ValueArrayConstant: + m_ValueArray: List[ValueConstant] + +@define(kw_only=True, slots=False) +class ValueConstant: + m_ID: int + m_Index: int + m_Type: int + m_TypeID: Optional[int] = None + +@define(kw_only=True, slots=False) +class ValueDelta: + m_Start: float + m_Stop: float + +@define(kw_only=True, slots=False) +class VariableBoneCountWeights: + m_Data: List[int] + +@define(kw_only=True, slots=False) +class VariantInfo: + graphicsStateInfoSet: Optional[List[GraphicsStateInfo]] = None + keywordNames: Optional[str] = None + keywords: Optional[str] = None + passIndex: Optional[int] = None + passType: Optional[int] = None + shader: Optional[PPtr[Shader]] = None + shaderAssetGUID: Optional[str] = None + shaderName: Optional[str] = None + subShaderIndex: Optional[int] = None + +@define(kw_only=True, slots=False) +class Vector3Curve: + curve: AnimationCurve + path: str + +@define(kw_only=True, slots=False) +class VectorParameter: + m_ArraySize: int + m_Dim: int + m_Index: int + m_NameIndex: int + m_Type: int + +@define(kw_only=True, slots=False) +class VelocityModule: + enabled: bool + inWorldSpace: bool + x: MinMaxCurve + y: MinMaxCurve + z: MinMaxCurve + orbitalOffsetX: Optional[MinMaxCurve] = None + orbitalOffsetY: Optional[MinMaxCurve] = None + orbitalOffsetZ: Optional[MinMaxCurve] = None + orbitalX: Optional[MinMaxCurve] = None + orbitalY: Optional[MinMaxCurve] = None + orbitalZ: Optional[MinMaxCurve] = None + radial: Optional[MinMaxCurve] = None + speedModifier: Optional[MinMaxCurve] = None + +@define(kw_only=True, slots=False) +class VertexData: + m_DataSize: bytes + m_VertexCount: int + m_Channels: Optional[List[ChannelInfo]] = None + m_CurrentChannels: Optional[int] = None + m_Streams: Optional[List[StreamInfo]] = None + m_Streams_0_: Optional[StreamInfo] = None + m_Streams_1_: Optional[StreamInfo] = None + m_Streams_2_: Optional[StreamInfo] = None + m_Streams_3_: Optional[StreamInfo] = None + +@define(kw_only=True, slots=False) +class VertexLayoutInfo: + vertexChannelsInfo: List[ChannelInfo] + vertexStreamCount: int + vertexStrides: List[int] + +@define(kw_only=True, slots=False) +class VideoClipImporterOutput: + encodedEndFrame: Optional[int] = None + encodedHeight: Optional[int] = None + encodedSettings: Optional[VideoClipImporterTargetSettings] = None + encodedStartFrame: Optional[int] = None + encodedWidth: Optional[int] = None + format: Optional[int] = None + originalFrameCount: Optional[int] = None + originalHeight: Optional[int] = None + originalWidth: Optional[int] = None + settings: Optional[VideoClipImporterTargetSettings] = None + sourceAudioChannelCount: Optional[List[int]] = None + sourceAudioSampleRate: Optional[List[int]] = None + sourceFileSize: Optional[int] = None + sourceFrameRate: Optional[float] = None + sourceHasAlpha: Optional[bool] = None + sourcePixelAspectRatioDenominator: Optional[int] = None + sourcePixelAspectRatioNumerator: Optional[int] = None + streamedResource: Optional[StreamedResource] = None + transcodeSkipped: Optional[bool] = None + +@define(kw_only=True, slots=False) +class VideoClipImporterTargetSettings: + aspectRatio: int + bitrateMode: int + codec: int + customHeight: int + customWidth: int + enableTranscoding: bool + resizeFormat: int + spatialQuality: int + +@define(kw_only=True, slots=False) +class VisualEffectInfo: + m_Buffers: List[VFXGPUBufferDesc] + m_CPUBuffers: List[VFXCPUBufferDesc] + m_CullingFlags: int + m_Events: List[VFXEventDesc] + m_ExposedExpressions: Union[List[VFXMapping], List[VFXExposedMapping]] + m_Expressions: VFXExpressionContainer + m_PropertySheet: VFXPropertySheetSerializedBase + m_RendererSettings: VFXRendererSettings + m_UpdateMode: int + m_CompilationVersion: Optional[int] = None + m_InitialEventName: Optional[str] = None + m_InstancingCapacity: Optional[int] = None + m_InstancingDisabledReason: Optional[int] = None + m_InstancingMode: Optional[int] = None + m_PreWarmDeltaTime: Optional[float] = None + m_PreWarmStepCount: Optional[int] = None + m_RuntimeVersion: Optional[int] = None + m_TemporaryBuffers: Optional[List[VFXTemporaryGPUBufferDesc]] = None + +@define(kw_only=True, slots=False) +class VisualEffectSettings: + m_CullingFlags: int + m_InitialEventName: str + m_PreWarmDeltaTime: float + m_PreWarmStepCount: int + m_RendererSettings: VFXRendererSettings + m_UpdateMode: int + m_InstancingCapacity: Optional[int] = None + m_InstancingDisabledReason: Optional[int] = None + m_InstancingMode: Optional[int] = None + +@define(kw_only=True, slots=False) +class WheelFrictionCurve: + asymptoteSlip: Optional[float] = None + asymptoteValue: Optional[float] = None + extremumSlip: Optional[float] = None + extremumValue: Optional[float] = None + m_AsymptoteSlip: Optional[float] = None + m_AsymptoteValue: Optional[float] = None + m_ExtremumSlip: Optional[float] = None + m_ExtremumValue: Optional[float] = None + m_Stiffness: Optional[float] = None + stiffnessFactor: Optional[float] = None + +@define(kw_only=True, slots=False) +class bitset: + bitCount: int + bitblocks: bytes + +@define(kw_only=True, slots=False) +class int2_storage: + x: int + y: int + +@define(kw_only=True, slots=False) +class int3_storage: + x: int + y: int + z: int + +@define(kw_only=True, slots=False) +class xform: + q: float4 + s: Union[float3, float4] + t: Union[float3, float4] diff --git a/UnityPy/classes/legacy_patch/AudioClip.py b/UnityPy/classes/legacy_patch/AudioClip.py new file mode 100644 index 00000000..37a0052f --- /dev/null +++ b/UnityPy/classes/legacy_patch/AudioClip.py @@ -0,0 +1,18 @@ +from ..generated import AudioClip +from ...enums import AUDIO_TYPE_EXTEMSION + + +def _AudioClip_extension(self: AudioClip) -> str: + return AUDIO_TYPE_EXTEMSION.get(self.m_CompressionFormat, ".audioclip") + + +def _AudioClip_samples(self: AudioClip) -> dict: + from ...export import AudioClipConverter + + return AudioClipConverter.extract_audioclip_samples(self) + + +AudioClip.extension = property(_AudioClip_extension) +AudioClip.samples = property(_AudioClip_samples) + +__all__ = ("AudioClip",) diff --git a/UnityPy/classes/legacy_patch/Mesh.py b/UnityPy/classes/legacy_patch/Mesh.py new file mode 100644 index 00000000..37512d37 --- /dev/null +++ b/UnityPy/classes/legacy_patch/Mesh.py @@ -0,0 +1,13 @@ +from ..generated import Mesh + + +def _Mesh_export(self: Mesh, format: str = "obj"): + from ...export.MeshExporter import export_mesh + + return export_mesh(self, format) + + +Mesh.export = _Mesh_export + + +__all__ = ("Mesh",) diff --git a/UnityPy/classes/legacy_patch/Renderer.py b/UnityPy/classes/legacy_patch/Renderer.py new file mode 100644 index 00000000..3f6e9320 --- /dev/null +++ b/UnityPy/classes/legacy_patch/Renderer.py @@ -0,0 +1,12 @@ +from ..generated import Renderer + + +def export(self, export_dir: str) -> None: + from ...export import MeshRendererExporter + + MeshRendererExporter.export_mesh_renderer(self, export_dir) + + +Renderer.export = export + +__all__ = ("Renderer",) diff --git a/UnityPy/classes/legacy_patch/Shader.py b/UnityPy/classes/legacy_patch/Shader.py new file mode 100644 index 00000000..23b051b7 --- /dev/null +++ b/UnityPy/classes/legacy_patch/Shader.py @@ -0,0 +1,12 @@ +from ..generated import Shader + + +def _Shader_export(self: Shader) -> str: + from ...export.ShaderConverter import export_shader + + return export_shader(self) + + +Shader.export = _Shader_export + +__all__ = ("Shader",) diff --git a/UnityPy/classes/legacy_patch/Sprite.py b/UnityPy/classes/legacy_patch/Sprite.py new file mode 100644 index 00000000..e12f8477 --- /dev/null +++ b/UnityPy/classes/legacy_patch/Sprite.py @@ -0,0 +1,12 @@ +from ..generated import Sprite + + +def _Sprite_image(self: Sprite): + from ...export import SpriteHelper + + return SpriteHelper.get_image_from_sprite(self) + + +Sprite.image = property(_Sprite_image) + +__all__ = ("Sprite",) diff --git a/UnityPy/classes/legacy_patch/Texture2D.py b/UnityPy/classes/legacy_patch/Texture2D.py new file mode 100644 index 00000000..66545416 --- /dev/null +++ b/UnityPy/classes/legacy_patch/Texture2D.py @@ -0,0 +1,84 @@ +from typing import Union, BinaryIO, Optional + +from PIL import Image + +from ..generated import Texture2D + + +def _Texture2d_get_image(self: Texture2D): + from ...export import Texture2DConverter + + return Texture2DConverter.get_image_from_texture2d(self) + + +def _Texture2d_set_image( + self: Texture2D, + img: Union["Image.Image", str, BinaryIO], + target_format: Optional[int] = None, + mipmap_count: int = 1, +): + from ...export import Texture2DConverter + + if not target_format: + target_format = self.m_TextureFormat + + if not isinstance(img, Image.Image): + img = Image.open(img) + + img_data, tex_format = Texture2DConverter.image_to_texture2d(img, target_format) + self.m_Width = img.width + self.m_Height = img.height + + if mipmap_count > 1: + width = self.m_Width + height = self.m_Height + re_img = img + for i in range(mipmap_count - 1): + width //= 2 + height //= 2 + if width < 4 or height < 4: + mipmap_count = i + 1 + break + re_img = re_img.resize((width, height), Image.BICUBIC) + img_data += Texture2DConverter.image_to_texture2d(re_img, target_format)[0] + + # disable mipmaps as we don't store them ourselves by default + if self.m_MipMap is not None: + self.m_MipMap = mipmap_count > 1 + if self.m_MipCount is not None: + self.m_MipCount = mipmap_count + + self.image_data = img_data + # width * height * channel count + self.m_CompleteImageSize = len( + img_data + ) # img.width * img.height * len(img.getbands()) + self.m_TextureFormat = tex_format + + if self.m_StreamData is not None: + self.m_StreamData.m_Path = "" + self.m_StreamData.offset = 0 + self.m_StreamData.size = 0 + + +def _Texture2D_get_image_data(self: Texture2D): + if self.image_data: + return self.image_data + if self.m_StreamData: + from ...helpers.ResourceReader import get_resource_data + + return get_resource_data( + self.m_StreamData.path, + self.object_reader.assets_file, + self.m_StreamData.offset, + self.m_StreamData.size, + ) + raise ValueError("No image data found") + + +Texture2D.image = property(_Texture2d_get_image, _Texture2d_set_image) +Texture2D.set_image = _Texture2d_set_image +Texture2D.get_image_data = _Texture2D_get_image_data + + +__all__ = ("Texture2D",) diff --git a/UnityPy/classes/legacy_patch/__init__.py b/UnityPy/classes/legacy_patch/__init__.py new file mode 100644 index 00000000..3c958cc5 --- /dev/null +++ b/UnityPy/classes/legacy_patch/__init__.py @@ -0,0 +1,6 @@ +from .AudioClip import AudioClip +from .Mesh import Mesh +from .Renderer import Renderer +from .Shader import Shader +from .Texture2D import Texture2D +from .Sprite import Sprite diff --git a/UnityPy/classes/math.py b/UnityPy/classes/math.py new file mode 100644 index 00000000..0db9f7be --- /dev/null +++ b/UnityPy/classes/math.py @@ -0,0 +1,117 @@ +""" +Definitions for math related classes. +As most calculations involving them are done in numpy, +we define them here as subtypes of np.ndarray, so that casting won't be necessary. +""" + +from attrs import define +from typing import Self, TypeAlias + + +@define(slots=True) +class Vector2f: + x: float = 0 + y: float = 0 + + def __repr__(self) -> str: + return f"Vector2f({self.x}, {self.y})" + + +@define(slots=True) +class Vector3f: + x: float = 0 + y: float = 0 + z: float = 0 + + def __repr__(self) -> str: + return f"Vector3f({self.x}, {self.y}, {self.z})" + + +@define(slots=True) +class Vector4f: + x: float = 0 + y: float = 0 + z: float = 0 + w: float = 0 + + def __repr__(self) -> str: + return f"Vector4f({self.x}, {self.y}, {self.z}, {self.w})" + + +float3: TypeAlias = Vector3f +float4: TypeAlias = Vector4f + + +class Quaternionf(Vector4f): + # TODO: Implement quaternion operations + def __repr__(self) -> str: + return f"Quaternion({self.x}, {self.y}, {self.z}, {self.w})" + + +@define(slots=True) +class Matrix3x4f: + e00: float + e01: float + e02: float + e03: float + e10: float + e11: float + e12: float + e13: float + e20: float + e21: float + e22: float + e23: float + + +@define(slots=True) +class Matrix4x4f: + e00: float + e01: float + e02: float + e03: float + e10: float + e11: float + e12: float + e13: float + e20: float + e21: float + e22: float + e23: float + e30: float + e31: float + e32: float + e33: float + + +@define(slots=True) +class ColorRGBA: + r: float = 0 + g: float = 0 + b: float = 0 + a: float = 1 + + def __new__( + cls, r: float = 0, g: float = 0, b: float = 0, a: float = 1, rgba: int = -1 + ) -> Self: + obj = super().__new__(cls) + if rgba != -1: + r = ((rgba >> 24) & 0xFF) / 255 + g = ((rgba >> 16) & 0xFF) / 255 + b = ((rgba >> 8) & 0xFF) / 255 + a = (rgba & 0xFF) / 255 + obj.__init__(r, g, b, a) + return obj + + @property + def rgba(self) -> int: + return ( + self.r * 255 << 24 | self.g * 255 << 16 | self.b * 255 << 8 | self.a * 255 + ) + + @rgba.setter + def rgba(self, value: int): + self.r = ((value >> 24) & 0xFF) / 255 + self.g = ((value >> 16) & 0xFF) / 255 + self.b = ((value >> 8) & 0xFF) / 255 + self.a = (value & 0xFF) / 255 diff --git a/UnityPy/enums/MeshTopology.py b/UnityPy/enums/MeshTopology.py new file mode 100644 index 00000000..0baaedd8 --- /dev/null +++ b/UnityPy/enums/MeshTopology.py @@ -0,0 +1,10 @@ +from enum import IntEnum + + +class MeshTopology(IntEnum): + Triangles = 0 + TriangleStrip = 1 # deprecated + Quads = 2 + Lines = 3 + LineStrip = 4 + Points = 5 diff --git a/UnityPy/enums/VertexFormat.py b/UnityPy/enums/VertexFormat.py new file mode 100644 index 00000000..88e1295c --- /dev/null +++ b/UnityPy/enums/VertexFormat.py @@ -0,0 +1,80 @@ +from enum import IntEnum + + +class VertexChannelFormat(IntEnum): + kChannelFormatFloat = 0 + kChannelFormatFloat16 = 1 + kChannelFormatColor = 2 + kChannelFormatByte = 3 + kChannelFormatUInt32 = 4 + + +class VertexFormat2017(IntEnum): + kVertexFormatFloat = 0 + kVertexFormatFloat16 = 1 + kVertexFormatColor = 2 + kVertexFormatUNorm8 = 3 + kVertexFormatSNorm8 = 4 + kVertexFormatUNorm16 = 5 + kVertexFormatSNorm16 = 6 + kVertexFormatUInt8 = 7 + kVertexFormatSInt8 = 8 + kVertexFormatUInt16 = 9 + kVertexFormatSInt16 = 10 + kVertexFormatUInt32 = 11 + kVertexFormatSInt32 = 12 + + +class VertexFormat(IntEnum): + kVertexFormatFloat = 0 + kVertexFormatFloat16 = 1 + kVertexFormatUNorm8 = 2 + kVertexFormatSNorm8 = 3 + kVertexFormatUNorm16 = 4 + kVertexFormatSNorm16 = 5 + kVertexFormatUInt8 = 6 + kVertexFormatSInt8 = 7 + kVertexFormatUInt16 = 8 + kVertexFormatSInt16 = 9 + kVertexFormatUInt32 = 10 + kVertexFormatSInt32 = 11 + + +VERTEX_CHANNEL_FORMAT_STRUCT_TYPE_MAP = { + VertexChannelFormat.kChannelFormatFloat: "f", + VertexChannelFormat.kChannelFormatFloat16: "e", + VertexChannelFormat.kChannelFormatColor: "B", + VertexChannelFormat.kChannelFormatByte: "B", + VertexChannelFormat.kChannelFormatUInt32: "I", +} + +VERTEX_FORMAT_2017_STRUCT_TYPE_MAP = { + VertexFormat2017.kVertexFormatFloat: "f", + VertexFormat2017.kVertexFormatFloat16: "h", + VertexFormat2017.kVertexFormatColor: "B", + VertexFormat2017.kVertexFormatUNorm8: "B", + VertexFormat2017.kVertexFormatSNorm8: "b", + VertexFormat2017.kVertexFormatUNorm16: "H", + VertexFormat2017.kVertexFormatSNorm16: "h", + VertexFormat2017.kVertexFormatUInt8: "B", + VertexFormat2017.kVertexFormatSInt8: "b", + VertexFormat2017.kVertexFormatUInt16: "H", + VertexFormat2017.kVertexFormatSInt16: "h", + VertexFormat2017.kVertexFormatUInt32: "I", + VertexFormat2017.kVertexFormatSInt32: "i", +} + +VERTEX_FORMAT_STRUCT_TYPE_MAP = { + VertexFormat.kVertexFormatFloat: "f", + VertexFormat.kVertexFormatFloat16: "h", + VertexFormat.kVertexFormatUNorm8: "B", + VertexFormat.kVertexFormatSNorm8: "b", + VertexFormat.kVertexFormatUNorm16: "H", + VertexFormat.kVertexFormatSNorm16: "h", + VertexFormat.kVertexFormatUInt8: "B", + VertexFormat.kVertexFormatSInt8: "b", + VertexFormat.kVertexFormatUInt16: "H", + VertexFormat.kVertexFormatSInt16: "h", + VertexFormat.kVertexFormatUInt32: "I", + VertexFormat.kVertexFormatSInt32: "i", +} diff --git a/UnityPy/export/AudioClipConverter.py b/UnityPy/export/AudioClipConverter.py index 56a50ca4..fddceeda 100644 --- a/UnityPy/export/AudioClipConverter.py +++ b/UnityPy/export/AudioClipConverter.py @@ -1,7 +1,12 @@ import ctypes import os import platform +from typing import TYPE_CHECKING from UnityPy.streams import EndianBinaryWriter +from ..helpers.ResourceReader import get_resource_data + +if TYPE_CHECKING: + from ..classes import AudioClip # pyfmodex loads the dll/so/dylib on import # so we have to adjust the environment vars @@ -68,28 +73,35 @@ def import_pyfmodex(): import pyfmodex -def extract_audioclip_samples(audio) -> dict: +def extract_audioclip_samples(audio: "AudioClip") -> dict: """extracts all the samples from an AudioClip :param audio: AudioClip :type audio: AudioClip :return: {filename : sample(bytes)} :rtype: dict """ - if not audio.m_AudioData: - # eg. StreamedResource not available - return {} + if audio.m_AudioData: + audio_data = audio.m_AudioData + else: + resource = audio.m_Resource + audio_data = get_resource_data( + resource.m_Source, + audio.object_reader.assets_file, + resource.m_Offset, + resource.m_Size, + ) - magic = memoryview(audio.m_AudioData)[:8] + magic = memoryview(audio_data)[:8] if magic[:4] == b"OggS": - return {f"{audio.m_Name}.ogg": audio.m_AudioData} + return {f"{audio.m_Name}.ogg": audio_data} elif magic[:4] == b"RIFF": - return {f"{audio.m_Name}.wav": audio.m_AudioData} + return {f"{audio.m_Name}.wav": audio_data} elif magic[4:8] == b"ftyp": - return {f"{audio.m_Name}.m4a": audio.m_AudioData} - return dump_samples(audio) + return {f"{audio.m_Name}.m4a": audio_data} + return dump_samples(audio, audio_data) -def dump_samples(clip): +def dump_samples(clip: "AudioClip", audio_data: bytes) -> dict: if pyfmodex is None: import_pyfmodex() if not pyfmodex: @@ -99,10 +111,10 @@ def dump_samples(clip): system.init(clip.m_Channels, pyfmodex.flags.INIT_FLAGS.NORMAL, None) sound = system.create_sound( - bytes(clip.m_AudioData), + bytes(audio_data), pyfmodex.flags.MODE.OPENMEMORY, exinfo=pyfmodex.structure_declarations.CREATESOUNDEXINFO( - length=clip.m_Size, + length=len(audio_data), numchannels=clip.m_Channels, defaultfrequency=clip.m_Frequency, ), @@ -112,9 +124,9 @@ def dump_samples(clip): samples = {} for i in range(sound.num_subsounds): if i > 0: - filename = "%s-%i.wav" % (clip.name, i) + filename = "%s-%i.wav" % (clip.m_Name, i) else: - filename = "%s.wav" % clip.name + filename = "%s.wav" % clip.m_Name subsound = sound.get_subsound(i) samples[filename] = subsound_to_wav(subsound) subsound.release() diff --git a/UnityPy/export/MeshExporter.py b/UnityPy/export/MeshExporter.py index d55814af..8c11e475 100644 --- a/UnityPy/export/MeshExporter.py +++ b/UnityPy/export/MeshExporter.py @@ -1,85 +1,64 @@ -from UnityPy.classes import Mesh +from typing import TYPE_CHECKING +from ..helpers.MeshHelper import MeshHandler -def export_mesh(m_Mesh: Mesh, format="obj") -> str: +if TYPE_CHECKING: + from ..classes.generated import Mesh + + +def export_mesh(m_Mesh: "Mesh", format="obj") -> str: if format == "obj": return export_mesh_obj(m_Mesh) raise NotImplementedError(f"Export format {format} not implemented") -def export_mesh_obj(m_Mesh, material_names: list = None): +def export_mesh_obj(mesh: "Mesh", material_names: list = None): + handler = MeshHandler(mesh) + handler.process() + + m_Mesh = handler if m_Mesh.m_VertexCount <= 0: return False - sb = [f"g {m_Mesh.name}\r\n"] + sb = [f"g {mesh.m_Name}\n"] if material_names: - sb.append(f"mtllib {m_Mesh.name}.mtl\r\n") + sb.append(f"mtllib {mesh.m_Name}.mtl\n") # region Vertices if not m_Mesh.m_Vertices: return False - c = 3 - if len(m_Mesh.m_Vertices) == m_Mesh.m_VertexCount * 4: - c = 4 - - for v in range(int(m_Mesh.m_VertexCount)): - sb.append( - "v {0:.9G} {1:.9G} {2:.9G}\r\n".format( - -m_Mesh.m_Vertices[v * c], - m_Mesh.m_Vertices[v * c + 1], - m_Mesh.m_Vertices[v * c + 2], - ).replace("nan", "0") + sb.extend( + "v {0:.9G} {1:.9G} {2:.9G}\n".format(-pos[0], pos[1], pos[2]).replace( + "nan", "0" ) + for pos in m_Mesh.m_Vertices + ) # endregion # region UV if m_Mesh.m_UV0: - if len(m_Mesh.m_UV0) == m_Mesh.m_VertexCount * 2: - c = 2 - elif len(m_Mesh.m_UV0) == m_Mesh.m_VertexCount * 3: - c = 3 - - for v in range(int(m_Mesh.m_VertexCount)): - sb.append( - "vt {0:.9G} {1:.9G}\r\n".format( - m_Mesh.m_UV0[v * c], m_Mesh.m_UV0[v * c + 1] - ).replace("nan", "0") - ) + sb.extend( + "vt {0:.9G} {1:.9G}\n".format(uv[0], uv[1]).replace("nan", "0") + for uv in m_Mesh.m_UV0 + ) # endregion # region Normals if m_Mesh.m_Normals: - if len(m_Mesh.m_Normals) == m_Mesh.m_VertexCount * 3: - c = 3 - elif len(m_Mesh.m_Normals) == m_Mesh.m_VertexCount * 4: - c = 4 - - for v in range(int(m_Mesh.m_VertexCount)): - sb.append( - "vn {0:.9G} {1:.9G} {2:.9G}\r\n".format( - -m_Mesh.m_Normals[v * c], - m_Mesh.m_Normals[v * c + 1], - m_Mesh.m_Normals[v * c + 2], - ).replace("nan", "0") - ) + sb.extend( + "vn {0:.9G} {1:.9G} {2:.9G}\n".format(-n[0], n[1], n[2]).replace("nan", "0") + for n in m_Mesh.m_Normals + ) # endregion # region Face - sum = 0 - for i in range(len(m_Mesh.m_SubMeshes)): - sb.append(f"g {m_Mesh.name}_{i}\r\n") + for i, triangles in enumerate(m_Mesh.get_triangles()): + sb.append(f"g {mesh.m_Name}_{i}\n") if material_names and i < len(material_names) and material_names[i]: - sb.append(f"usemtl {material_names[i]}\r\n") - indexCount = m_Mesh.m_SubMeshes[i].indexCount - end = sum + indexCount // 3 - for f in range(sum, end): - sb.append( - "f {0}/{0}/{0} {1}/{1}/{1} {2}/{2}/{2}\r\n".format( - m_Mesh.m_Indices[f * 3 + 2] + 1, - m_Mesh.m_Indices[f * 3 + 1] + 1, - m_Mesh.m_Indices[f * 3] + 1, - ) - ) - sum = end + sb.append(f"usemtl {material_names[i]}\n") + sb.extend( + "f {0}/{0}/{0} {1}/{1}/{1} {2}/{2}/{2}\n".format(c + 1, b + 1, a + 1) + for a, b, c in triangles + ) # endregion return "".join(sb) diff --git a/UnityPy/export/MeshRendererExporter.py b/UnityPy/export/MeshRendererExporter.py index 604c30c5..aff0875e 100644 --- a/UnityPy/export/MeshRendererExporter.py +++ b/UnityPy/export/MeshRendererExporter.py @@ -42,7 +42,7 @@ def export_mesh_renderer(obj: Renderer, export_dir: str) -> None: material_names.append(None) continue materials.append(export_material(mat)) - material_names.append(mat.name) + material_names.append(mat.m_Name) # save material textures for key, texEnv in mat.m_SavedProperties.m_TexEnvs.items(): if not texEnv.m_Texture: @@ -85,14 +85,14 @@ def clt(color): # color to tuple diffuse = clt(colors.get("_Color", (0.8, 0.8, 0.8, 1))) ambient = clt(colors.get("_SColor", (0.2, 0.2, 0.2, 1))) - emissive = clt(colors.get("_EmissionColor", (0, 0, 0, 1))) + # emissive = clt(colors.get("_EmissionColor", (0, 0, 0, 1))) specular = clt(colors.get("_SpecularColor", (0.2, 0.2, 0.2, 1))) - reflection = clt(colors.get("_ReflectColor", (0, 0, 0, 1))) + # reflection = clt(colors.get("_ReflectColor", (0, 0, 0, 1))) shininess = floats.get("_Shininess", 20.0) transparency = floats.get("_Transparency", 0.0) sb = [] - sb.append(f"newmtl {mat.name}") + sb.append(f"newmtl {mat.m_Name}") # Ka r g b # defines the ambient color of the material to be (r,g,b). The default is (0.2,0.2,0.2); sb.append(f"Ka {ambient[0]:.4f} {ambient[1]:.4f} {ambient[2]:.4f}") diff --git a/UnityPy/export/Texture2DConverter.py b/UnityPy/export/Texture2DConverter.py index fc54f3f2..06a25305 100644 --- a/UnityPy/export/Texture2DConverter.py +++ b/UnityPy/export/Texture2DConverter.py @@ -1,23 +1,30 @@ import texture2ddecoder -import etcpak from PIL import Image from copy import copy from io import BytesIO import struct from ..enums import TextureFormat, BuildTarget from ..helpers import TextureSwizzler +from typing import Union TF = TextureFormat -def image_to_texture2d(img: Image.Image, target_texture_format: TF, flip: bool = True): +def image_to_texture2d( + img: Image.Image, target_texture_format: Union[TF, int], flip: bool = True +): + if isinstance(target_texture_format, int): + target_texture_format = TextureFormat(target_texture_format) + + import etcpak + if flip: img = img.transpose(Image.FLIP_TOP_BOTTOM) # DXT if target_texture_format in [TF.DXT1, TF.DXT1Crunched]: raw_img = img.convert("RGBA").tobytes() - enc_img = etcpak.compress_to_dxt1(raw_img, img.width, img.height) + enc_img = etcpak.compress_bc1(raw_img, img.width, img.height) tex_format = TF.DXT1 elif target_texture_format in [TF.DXT5, TF.DXT5Crunched]: raw_img = img.convert("RGBA").tobytes() @@ -103,12 +110,12 @@ def get_image_from_texture2d( :rtype: Image """ return parse_image_data( - texture_2d.image_data, + texture_2d.get_image_data(), texture_2d.m_Width, texture_2d.m_Height, texture_2d.m_TextureFormat, - texture_2d.version, - texture_2d.platform, + texture_2d.object_reader.version, + texture_2d.object_reader.platform, getattr(texture_2d, "m_PlatformBlob", None), flip, ) @@ -138,6 +145,8 @@ def parse_image_data( if texture_format in XBOX_SWAP_FORMATS: image_data = swap_bytes_for_xbox(image_data, platform) + if not isinstance(texture_format, TextureFormat): + texture_format = TextureFormat(texture_format) if "Crunched" in texture_format.name: version = version if ( diff --git a/UnityPy/files/ObjectReader.py b/UnityPy/files/ObjectReader.py index 565e6d05..ed058f22 100644 --- a/UnityPy/files/ObjectReader.py +++ b/UnityPy/files/ObjectReader.py @@ -1,29 +1,32 @@ +from typing import TYPE_CHECKING, Generic, TypeVar, Union from ..enums import ClassIDType -from . import SerializedFile -from .. import classes -from ..classes.Object import NodeHelper from ..streams import EndianBinaryReader, EndianBinaryWriter from ..helpers import TypeTreeHelper from ..helpers.Tpk import get_typetree_nodes from ..exceptions import TypeTreeError +if TYPE_CHECKING: + from ..files import SerializedFile -class ObjectReader: +T = TypeVar("T") + + +class ObjectReader(Generic[T]): byte_start: int byte_size: int type_id: int class_id: int type: ClassIDType path_id: int - # serialized_type: SerializedType + assets_file: "SerializedFile" _read_until: int # saves where the parser stopped # in case that not all data is read # and the obj.data is changed, the unknown data can be added again - def __init__(self, assets_file, reader: EndianBinaryReader): + def __init__(self, assets_file: "SerializedFile", reader: EndianBinaryReader): self.assets_file = assets_file self.reader = reader self.data = b"" @@ -135,7 +138,8 @@ def write( def set_raw_data(self, data): self.data = data - self.assets_file.mark_changed() + if self.assets_file: + self.assets_file.mark_changed() @property def container(self): @@ -152,22 +156,8 @@ def Position(self, pos): def reset(self): self.reader.Position = self.byte_start - def read(self, return_typetree_on_error: bool = True): - cls = getattr(classes, self.type.name, None) - - obj = None - if cls: - try: - obj = cls(self) - except Exception as e: - if return_typetree_on_error: - print(f"Error during the parsing of object {self.path_id}") - print(e) - print("Returning the typetree") - else: - raise e - if not obj: - obj = self.read_typetree(wrap=True) + def read(self) -> T: + obj = self.read_typetree(wrap=True) self._read_until = self.reader.Position return obj @@ -209,11 +199,15 @@ def get_typetree_nodes(self, nodes: list = None) -> list: raise TypeTreeError("There are no TypeTree nodes for this object.") return nodes - def read_typetree(self, nodes: list = None, wrap: bool = False) -> dict: + def read_typetree(self, nodes: list = None, wrap: bool = False) -> Union[dict, T]: self.reset() nodes = self.get_typetree_nodes(nodes) - res = TypeTreeHelper.read_typetree(nodes, self) - return NodeHelper(res, self.assets_file) if wrap else res + ret = TypeTreeHelper.read_typetree( + nodes, self, as_dict=not wrap, assetsfile=self.assets_file + ) + if wrap: + ret.set_object_reader(self) + return ret def save_typetree( self, tree: dict, nodes: list = None, writer: EndianBinaryWriter = None @@ -221,7 +215,7 @@ def save_typetree( nodes = self.get_typetree_nodes(nodes) if not writer: writer = EndianBinaryWriter(endian=self.reader.endian) - writer = TypeTreeHelper.write_typetree(tree, nodes, writer) + TypeTreeHelper.write_typetree(tree, nodes, writer) data = writer.bytes self.set_raw_data(data) return data @@ -232,8 +226,3 @@ def get_raw_data(self) -> bytes: ret = self.reader.read_bytes(self.byte_size) self.Position = pos return ret - - def set_raw_data(self, data): - self.data = data - if self.assets_file: - self.assets_file.mark_changed() diff --git a/UnityPy/files/SerializedFile.py b/UnityPy/files/SerializedFile.py index 050c22d3..87ee69d5 100644 --- a/UnityPy/files/SerializedFile.py +++ b/UnityPy/files/SerializedFile.py @@ -123,9 +123,9 @@ def __init__(self, reader, serialized_file, is_ref_type: bool): if serialized_file._enable_type_tree: if version >= 12 or version == 10: - self.nodes, self.string_data = serialized_file.read_type_tree_blob() + self.nodes = TypeTreeNode.parse_blob(reader, version) else: - self.nodes = serialized_file.read_type_tree() + self.nodes = TypeTreeNode.parse(reader, version) if version >= 21: if is_ref_type: @@ -156,9 +156,9 @@ def write(self, serialized_file, writer, is_ref_type): if serialized_file._enable_type_tree: if version >= 12 or version == 10: - serialized_file.save_type_tree5(self.nodes, writer, self.string_data) + self.nodes.dump_blob(writer, version) else: - serialized_file.save_type_tree(self.nodes, writer) + serialized_file.dump(writer, version) if version >= 21: if is_ref_type: @@ -166,7 +166,7 @@ def write(self, serialized_file, writer, is_ref_type): writer.write_string_to_null(self.m_NameSpace) writer.write_string_to_null(self.m_AssemblyName) else: - writer.write_int_array(self.type_dependencies) + writer.write_int_array(self.type_dependencies, True) class SerializedFile(File.File): @@ -330,80 +330,6 @@ def set_version(self, string_version): version_split = re.split(r"\D", string_version) self.version = tuple(int(x) for x in version_split[:4]) - def read_type_tree(self): - type_tree = [] - level_stack = [[0, 1]] - while level_stack: - level, count = level_stack[-1] - if count == 1: - level_stack.pop() - else: - level_stack[-1][1] -= 1 - - type_tree_node = TypeTreeNode( - m_Level=level, - m_Type=self.reader.read_string_to_null(), - m_Name=self.reader.read_string_to_null(), - m_ByteSize=self.reader.read_int(), - ) - - type_tree.append(type_tree_node) - if self.header.version == 2: - type_tree_node.m_VariableCount = self.reader.read_int() - - if self.header.version != 3: - type_tree_node.m_Index = self.reader.read_int() - - type_tree_node.m_TypeFlags = self.reader.read_int() - type_tree_node.m_Version = self.reader.read_int() - if self.header.version != 3: - type_tree_node.m_MetaFlag = self.reader.read_int() - - children_count = self.reader.read_int() - if children_count: - level_stack.append([level + 1, children_count]) - return type_tree - - def read_type_tree_blob(self): - reader = self.reader - number_of_nodes = self.reader.read_int() - string_buffer_size = self.reader.read_int() - - type = f"{reader.endian}hBBIIiii" - keys = [ - "m_Version", - "m_Level", - "m_TypeFlags", - "m_TypeStrOffset", - "m_NameStrOffset", - "m_ByteSize", - "m_Index", - "m_MetaFlag", - ] - if self.header.version >= 19: - type += "Q" - keys.append("m_RefTypeHash") - - node_struct = Struct(type) - struct_data = reader.read(node_struct.size * number_of_nodes) - string_buffer_reader = EndianBinaryReader( - reader.read(string_buffer_size), reader.endian - ) - - if not config.SERIALIZED_FILE_PARSE_TYPETREE: - return [], string_buffer_reader.bytes - - type_tree = [ - TypeTreeNode( - **dict(zip(keys, raw_node)), - m_Type=read_string(string_buffer_reader, raw_node[3]), - m_Name=read_string(string_buffer_reader, raw_node[4]), - ) - for i, raw_node in enumerate(node_struct.iter_unpack(struct_data)) - ] - - return type_tree, string_buffer_reader.bytes - def get_writeable_cab(self, name: str = "CAB-UnityPy_Mod.resS"): """ Creates a new cab file in the bundle that contains the given data. @@ -653,7 +579,7 @@ def __init__(self, container) -> None: self.container = container # support for getitem self.container_dict = {key: value.asset for key, value in container} - self.path_dict = {value.asset.path_id: key for key, value in container} + self.path_dict = {value.asset.m_PathID: key for key, value in container} def items(self): return ((key, value.asset) for key, value in self.container) diff --git a/UnityPy/helpers/MeshHelper.py b/UnityPy/helpers/MeshHelper.py new file mode 100644 index 00000000..d0edf788 --- /dev/null +++ b/UnityPy/helpers/MeshHelper.py @@ -0,0 +1,719 @@ +from __future__ import annotations +import math +import struct +from typing import Optional, List, Tuple, Union, TypeVar + +from ..enums.MeshTopology import MeshTopology +from ..classes.generated import ( + ChannelInfo, + StreamInfo, + Mesh, + SpriteRenderData, + Vector2f, + Vector3f, + Vector4f, +) +from .PackedBitVector import unpack_floats, unpack_ints + +from ..enums.VertexFormat import ( + VertexChannelFormat, + VertexFormat2017, + VertexFormat, + VERTEX_CHANNEL_FORMAT_STRUCT_TYPE_MAP, + VERTEX_FORMAT_2017_STRUCT_TYPE_MAP, + VERTEX_FORMAT_STRUCT_TYPE_MAP, +) + +try: + from UnityPy import UnityPyBoost +except ImportError: + UnityPyBoost = None + +Tuple2f = Tuple[float, float] +Tuple3f = Tuple[float, float, float] +Tuple4f = Tuple[float, float, float, float] + +T = TypeVar("T") + + +def flat_list_to_tuples(data: List[T], item_size: int) -> List[tuple[T]]: + return [tuple(data[i : i + item_size]) for i in range(0, len(data), item_size)] + + +def vector_list_to_tuples(data: List[Vector2f, Vector3f, Vector4f]) -> List[tuple]: + if isinstance(data[0], Vector2f): + return [(v.x, v.y) for v in data] + elif isinstance(data[0], Vector3f): + return [(v.x, v.y, v.z) for v in data] + elif isinstance(data[0], Vector4f): + return [(v.x, v.y, v.z, v.w) for v in data] + else: + raise ValueError("Unknown vector type") + + +def zeros(shape: Tuple[int, ...]) -> list: + if len(shape) == 1: + return [0] * shape[0] + elif len(shape) == 2: + m, n = shape + return [[0] * n for _ in range(m)] + else: + raise ValueError("Invalid shape") + + +def normalize(*vector: float) -> Tuple[float, ...]: + length = math.sqrt(sum(v**2 for v in vector)) + if length > 0.00001: + inv_norm = 1.0 / length + return tuple(v * inv_norm for v in vector) + return (0,) * len(vector) + + +class MeshHandler: + src: Union[Mesh, SpriteRenderData] + endianess: str = "<" + version: Tuple[int, int, int, int] + m_VertexCount: int = 0 + m_Vertices: Optional[List[Tuple3f]] = None + m_Normals: Optional[List[Tuple3f]] = None + m_Colors: Optional[List[Tuple4f]] = None + m_UV0: Optional[List[Tuple2f]] = None + m_UV1: Optional[List[Tuple2f]] = None + m_UV2: Optional[List[Tuple2f]] = None + m_UV3: Optional[List[Tuple2f]] = None + m_UV4: Optional[List[Tuple2f]] = None + m_UV5: Optional[List[Tuple2f]] = None + m_UV6: Optional[List[Tuple2f]] = None + m_UV7: Optional[List[Tuple2f]] = None + m_Tangents: Optional[List[float]] = None + m_BoneIndices: Optional[List[int]] = None + m_BoneWeights: Optional[List[float]] = None + m_IndexBuffer: Optional[List[int]] = None + m_Use16BitIndices: bool = True + + def __init__( + self, + src: Union[Mesh, SpriteRenderData], + version: Optional[Tuple[int, int, int, int]] = None, + endianess: str = "<", + ) -> None: + self.src = src + self.endianess = endianess + if version is not None: + self.version = version + elif getattr(src, "object_reader", None): + self.version = src.object_reader.version + else: + raise ValueError("No version provided and no object reader found") + + def process(self): + mesh = self.src + vertex_data = mesh.m_VertexData + assert vertex_data is not None + + m_Channels: list[ChannelInfo] + m_Streams: list[StreamInfo] + + if self.version[0] < 4: + assert ( + vertex_data.m_Streams_0_ is not None + and vertex_data.m_Streams_1_ is not None + and vertex_data.m_Streams_2_ is not None + and vertex_data.m_Streams_3_ is not None + ) + m_Streams = [ + vertex_data.m_Streams_0_, + vertex_data.m_Streams_1_, + vertex_data.m_Streams_2_, + vertex_data.m_Streams_3_, + ] + assert all(stream is not None for stream in m_Streams) + m_Channels = self.get_channels(m_Streams) + elif self.version[0] == 4: + assert ( + vertex_data.m_Streams is not None and vertex_data.m_Channels is not None + ) + m_Streams = vertex_data.m_Streams + m_Channels = vertex_data.m_Channels + else: + assert vertex_data.m_Channels is not None + m_Channels = vertex_data.m_Channels + m_Streams = self.get_streams(m_Channels, vertex_data.m_VertexCount) + + stream_data = getattr(mesh, "m_StreamData", None) + if stream_data and stream_data.path: + vertex_data = self.src.m_VertexData + if vertex_data and vertex_data.m_VertexCount > 0: + raise NotImplementedError("External data is not yet supported") + # resourceReader = new ResourceReader(m_StreamData.path, assetsFile, m_StreamData.offset, m_StreamData.size) + # m_VertexData.m_DataSize = resourceReader.GetData() + + # try to copy data directly from mesh + if isinstance(mesh, Mesh): + if self.src.m_Use16BitIndices is False: + self.m_Use16BitIndices = False + self.copy_from_mesh() + elif isinstance(mesh, SpriteRenderData): + self.copy_from_spriterenderdata() + else: + raise ValueError(f"Unknown mesh type {type(mesh)}") + + if self.m_IndexBuffer: + raw_indices = bytes(self.m_IndexBuffer) + if self.m_Use16BitIndices: + char = "H" + index_size = 2 + else: + char = "I" + index_size = 4 + + self.m_IndexBuffer = struct.unpack( + f"<{len(raw_indices) // index_size}{char}", raw_indices + ) + + if self.version >= (3, 5): + self.read_vertex_data(m_Channels, m_Streams) + + if isinstance(mesh, Mesh) and self.version >= (2, 6): + self.decompress_compressed_mesh() + + if self.m_VertexCount == 0 and self.m_Vertices: + self.m_VertexCount = len(self.m_Vertices) + + def copy_from_mesh(self): + """Copy data from mesh to handler if it's not already set.""" + mesh = self.src + + if self.m_IndexBuffer is None and mesh.m_IndexBuffer: + self.m_IndexBuffer = mesh.m_IndexBuffer + + if self.m_Vertices is None and mesh.m_Vertices: + self.m_Vertices = vector_list_to_tuples(mesh.m_Vertices) + + if self.m_Normals is None and mesh.m_Normals: + self.m_Normals = vector_list_to_tuples(mesh.m_Normals) + + if self.m_Tangents is None and mesh.m_Tangents: + self.m_Tangents = vector_list_to_tuples(mesh.m_Tangents) + + if self.m_UV0 is None and mesh.m_UV: + self.m_UV0 = vector_list_to_tuples(mesh.m_UV) + + if self.m_UV1 is None and mesh.m_UV1: + self.m_UV1 = vector_list_to_tuples(mesh.m_UV1) + + if self.m_Colors is None and mesh.m_Colors: + self.m_Colors = vector_list_to_tuples(mesh.m_Colors) + + if self.m_BoneWeights is None and mesh.m_Skin: + # BoneInfluence == BoneWeight in terms of usage in UnityPy due to int simplification + self.m_BoneWeights = zeros((len(mesh.m_Skin), 4)) + self.m_BoneIndices = zeros((len(mesh.m_Skin), 4)) + for skin, indices, weights in zip( + mesh.m_Skin, self.m_BoneIndices, self.m_BoneWeights + ): + indices[:] = [ + skin.boneIndex_0_, + skin.boneIndex_1_, + skin.boneIndex_2_, + skin.boneIndex_3_, + ] + weights[:] = [ + skin.weight_0_, + skin.weight_1_, + skin.weight_2_, + skin.weight_3_, + ] + + def copy_from_spriterenderdata(self): + rd = self.src + + if self.m_IndexBuffer is None: + if rd.m_IndexBuffer: + self.m_IndexBuffer = rd.m_IndexBuffer + elif rd.indices: + self.m_IndexBuffer = rd.indices + + if self.m_Vertices is None and rd.vertices: + vertices = [rd.vertices] + self.m_Vertices = [(v.pos.x, v.pos.y, v.pos.z) for v in vertices] + + if vertices[0].uv is not None: + self.m_UV0 = [(v.uv.x, v.uv.y) for v in vertices] + + # if self.m_BindPose is None and rd.m_BindPose: + # self.m_BindPose = rd.m_BindPose + + def get_streams( + self, m_Channels: list[ChannelInfo], m_VertexCount: int + ) -> list[StreamInfo]: + streamCount = 1 + if m_Channels: + streamCount += max(x.stream for x in m_Channels) + + m_Streams: list[StreamInfo] = [] + offset = 0 + for s in range(streamCount): + chnMask = 0 + stride = 0 + for chn, m_Channel in enumerate(m_Channels): + if m_Channel.stream == s: + if m_Channel.dimension > 0: + chnMask |= 1 << chn + component_size = self.get_channel_component_size(m_Channel) + stride += m_Channel.dimension * component_size + + m_Streams.append( + StreamInfo( + channelMask=chnMask, + offset=offset, + stride=stride, + dividerOp=0, + frequency=0, + ) + ) + offset += m_VertexCount * stride + offset = (offset + (16 - 1)) & ~(16 - 1) + return m_Streams + + def get_channels(self, m_Streams: list[StreamInfo]) -> list[ChannelInfo]: + m_Channels = [ + ChannelInfo( + dimension=0, + format=0, + offset=0, + stream=0, + ) + for _ in range(6) + ] + for s, m_Stream in enumerate(m_Streams): + channelMask = bytearray(m_Stream.channelMask) # BitArray + offset = 0 + for i in range(6): + if channelMask[i]: + m_Channel = m_Channels[i] + m_Channel.stream = s + m_Channel.offset = offset + if i in [0, 1]: + # 0 - kShaderChannelVertex + # 1 - kShaderChannelNormal + m_Channel.format = 0 # kChannelFormatFloat + m_Channel.dimension = 3 + elif i == 2: # kShaderChannelColor + m_Channel.format = 2 # kChannelFormatColor + m_Channel.dimension = 4 + elif i in [3, 4]: + # 3 - kShaderChannelTexCoord0 + # 4 - kShaderChannelTexCoord1 + m_Channel.format = 0 # kChannelFormatFloat + m_Channel.dimension = 2 + elif i == 5: # kShaderChannelTangent + m_Channel.format = 0 # kChannelFormatFloat + m_Channel.dimension = 4 + + component_size = self.get_channel_component_size(m_Channel) + offset += m_Channel.dimension * component_size + + return m_Channels + + def read_vertex_data( + self, m_Channels: list[ChannelInfo], m_Streams: list[StreamInfo] + ) -> None: + m_VertexData = self.src.m_VertexData + if m_VertexData is None: + return + + self.m_VertexCount = m_VertexCount = m_VertexData.m_VertexCount + # m_VertexDataRaw = m_VertexData.m_DataSize + + for chn, m_Channel in enumerate(m_Channels): + if m_Channel.dimension == 0: + continue + + m_Stream = m_Streams[m_Channel.stream] + # m_StreamData = m_VertexDataRaw[ + # m_Stream.offset : m_Stream.offset + m_VertexCount * m_Stream.stride + # ] + + channelMask = bin(m_Stream.channelMask)[::-1] + if channelMask[chn] == "1": + if ( + self.version[0] < 2018 and chn == 2 and m_Channel.format == 2 + ): # kShaderChannelColor && kChannelFormatColor + # new instance to not modify the original + m_Channel = ChannelInfo( + dimension=4, + format=2, + offset=m_Channel.offset, + stream=m_Channel.stream, + ) + + component_dtype = self.get_channel_dtype(m_Channel) + component_byte_size = self.get_channel_component_size(m_Channel) + # channel_byte_size = m_Channel.dimension * component_byte_size + + swap = self.endianess == "<" and component_byte_size > 1 + + if UnityPyBoost: + componentBytes = UnityPyBoost.unpack_vertexdata( + m_VertexData.m_DataSize, + component_byte_size, + m_VertexCount, + m_Stream.offset, + m_Stream.stride, + m_Channel.offset, + m_Channel.dimension, + swap, + ) + else: + componentBytes = bytearray( + m_VertexCount * m_Channel.dimension * component_byte_size + ) + + vertexBaseOffset = m_Stream.offset + m_Channel.offset + for v in range(m_VertexCount): + vertexOffset = vertexBaseOffset + m_Stream.stride * v + for d in range(m_Channel.dimension): + componentOffset = vertexOffset + component_byte_size * d + vertexDataSrc = componentOffset + componentDataSrc = component_byte_size * ( + v * m_Channel.dimension + d + ) + buff = m_VertexData.m_DataSize[ + vertexDataSrc : vertexDataSrc + component_byte_size + ] + if swap: # swap bytes + buff = buff[::-1] + componentBytes[ + componentDataSrc : componentDataSrc + + component_byte_size + ] = buff + + count = len(componentBytes) // component_byte_size + component_data = struct.unpack( + f">{count}{component_dtype}", componentBytes + ) + component_data = flat_list_to_tuples( + component_data, m_Channel.dimension + ) + + self.assign_channel_vertex_data(chn, component_data) + + def assign_channel_vertex_data(self, channel: int, component_data: list): + if self.version[0] >= 2018: + match channel: + case 0: # kShaderChannelVertex + self.m_Vertices = component_data + case 1: # kShaderChannelNormal + self.m_Normals = component_data + case 2: # kShaderChannelTangent + self.m_Tangents = component_data + case 3: # kShaderChannelColor + self.m_Colors = component_data + case 4: # kShaderChannelTexCoord0 + self.m_UV0 = component_data + case 5: # kShaderChannelTexCoord1 + self.m_UV1 = component_data + case 6: # kShaderChannelTexCoord2 + self.m_UV2 = component_data + case 7: # kShaderChannelTexCoord3 + self.m_UV3 = component_data + case 8: # kShaderChannelTexCoord4 + self.m_UV4 = component_data + case 9: # kShaderChannelTexCoord5 + self.m_UV5 = component_data + case 10: # kShaderChannelTexCoord6 + self.m_UV6 = component_data + case 11: # kShaderChannelTexCoord7 + self.m_UV7 = component_data + # 2018.2 and up + case 12: # kShaderChannelBlendWeight + self.m_BoneWeights = component_data + case 13: # kShaderChannelBlendIndices + self.m_BoneIndices = component_data + case _: + raise ValueError(f"Unknown channel {channel}") + else: + match channel: + case 0: # kShaderChannelVertex + self.m_Vertices = component_data + case 1: # kShaderChannelNormal + self.m_Normals = component_data + case 2: # kShaderChannelColor + self.m_Colors = component_data + case 3: # kShaderChannelTexCoord0 + self.m_UV0 = component_data + case 4: # kShaderChannelTexCoord1 + self.m_UV1 = component_data + case 5: + if self.version[0] >= 5: # kShaderChannelTexCoord2 + self.m_UV2 = component_data + else: # kShaderChannelTangent + self.m_Tangents = component_data + case 6: # kShaderChannelTexCoord3 + self.m_UV3 = component_data + case 7: # kShaderChannelTangent + self.m_Tangents = component_data + case _: + raise ValueError(f"Unknown channel {channel}") + + def get_channel_dtype(self, m_Channel: ChannelInfo): + if self.version[0] < 2017: + format = VertexChannelFormat(m_Channel.format) + component_dtype = VERTEX_CHANNEL_FORMAT_STRUCT_TYPE_MAP[format] + elif self.version[0] < 2019: + format = VertexFormat2017(m_Channel.format) + component_dtype = VERTEX_FORMAT_2017_STRUCT_TYPE_MAP[format] + else: + format = VertexFormat(m_Channel.format) + component_dtype = VERTEX_FORMAT_STRUCT_TYPE_MAP[format] + + return component_dtype + + def get_channel_component_size(self, m_Channel: ChannelInfo): + dtype = self.get_channel_dtype(m_Channel) + return struct.Struct(dtype).size + + def decompress_compressed_mesh(self): + # TODO: m_Triangles???? + + # Vertex + version = self.version + m_CompressedMesh = self.src.m_CompressedMesh + + self.m_VertexCount = m_VertexCount = int( + m_CompressedMesh.m_Vertices.m_NumItems / 3 + ) + + if m_CompressedMesh.m_Vertices.m_NumItems > 0: + self.m_Vertices = unpack_floats(m_CompressedMesh.m_Vertices, shape=(3,)) + + # UV + if m_CompressedMesh.m_UV.m_NumItems > 0: + m_UVInfo = m_CompressedMesh.m_UVInfo + if m_UVInfo is not None and m_UVInfo != 0: + kInfoBitsPerUV = 4 + kUVDimensionMask = 3 + kUVChannelExists = 4 + kMaxTexCoordShaderChannels = 8 + + uvSrcOffset = 0 + + for uv_channel in range(kMaxTexCoordShaderChannels): + texCoordBits = m_UVInfo >> (uv_channel * kInfoBitsPerUV) + texCoordBits &= (1 << kInfoBitsPerUV) - 1 + if (texCoordBits & kUVChannelExists) != 0: + uvDim = 1 + int(texCoordBits & kUVDimensionMask) + m_UV = unpack_floats( + m_CompressedMesh.m_UV, + uvSrcOffset, + m_VertexCount * uvDim, + shape=(uvDim,), + ) + setattr(self, f"m_UV{uv_channel}", m_UV) + uvSrcOffset = uvDim * m_VertexCount + else: + self.m_UV0 = unpack_floats( + m_CompressedMesh.m_UV, 0, m_VertexCount * 2, shape=(2,) + ) + if m_CompressedMesh.m_UV.m_NumItems >= m_VertexCount * 4: + self.m_UV1 = unpack_floats( + m_CompressedMesh.m_UV, + m_VertexCount * 2, + m_VertexCount * 2, + shape=(2,), + ) + + # BindPose + if version[0] < 5: # 5.0 down + m_BindPoses = m_CompressedMesh.m_BindPoses + if m_BindPoses and m_BindPoses.m_NumItems > 0: + self.m_BindPose = unpack_floats( + m_BindPoses, + shape=( + 4, + 4, + ), + ) + + # Normal + if m_CompressedMesh.m_Normals.m_NumItems > 0: + normalData = unpack_floats(m_CompressedMesh.m_Normals, shape=(2,)) + signs = unpack_ints(m_CompressedMesh.m_NormalSigns) + + self.m_Normals = zeros((m_CompressedMesh.m_Normals.m_NumItems // 2, 3)) + for srcNrm, sign, dstNrm in zip(normalData, signs, self.m_Normals): + x, y = srcNrm + zsqr = 1 - x * x - y * y + if zsqr >= 0: + z = math.sqrt(zsqr) + dstNrm[:] = x, y, z + else: + z = 0 + dstNrm[:] = normalize(x, y, z) + if sign == 0: + dstNrm[2] *= -1 + + # Tangent + if m_CompressedMesh.m_Tangents.m_NumItems > 0: + tangentData = unpack_floats(m_CompressedMesh.m_Tangents, shape=(2,)) + signs = unpack_ints(m_CompressedMesh.m_TangentSigns) + self.m_Tangents = zeros((m_CompressedMesh.m_Tangents.m_NumItems // 2, 4)) + for srcTan, (sign_z, sign_w), dstTan in zip( + tangentData, signs, self.m_Tangents + ): + x, y = srcTan + zsqr = 1 - x * x - y * y + z = 0 + w = 0 + if zsqr >= 0: + z = math.sqrt(zsqr) + else: + x, y, z = normalize(x, y, z) + if sign_z == 0: + z = -z + w = 1.0 if sign_w > 0 else -1.0 + dstTan[:] = x, y, z, w + + # FloatColor + if version[0] >= 5: # 5.0 and up + m_FloatColors = m_CompressedMesh.m_FloatColors + if m_FloatColors and m_FloatColors.m_NumItems > 0: + self.m_Colors = unpack_floats(m_FloatColors, shape=(4,)) + # Skin + if m_CompressedMesh.m_Weights.m_NumItems > 0: + weightsData = unpack_ints(m_CompressedMesh.m_Weights) + weightsData = [weight / 31 for weight in weightsData] + boneIndicesData = unpack_ints(m_CompressedMesh.m_BoneIndices) + + vertexIndex = 0 + boneIndecesIndex = 0 + j = 0 + sum = 0 + + self.m_BoneWeights = zeros((m_CompressedMesh.m_Weights.m_NumItems // 4, 4)) + self.m_BoneIndices = zeros((m_CompressedMesh.m_Weights.m_NumItems // 4, 4)) + + for weight in weightsData: + # read bone index and weight + self.m_BoneWeights[vertexIndex][j] = weight + self.m_BoneIndices[vertexIndex][j] = boneIndicesData[boneIndecesIndex] + + boneIndecesIndex += 1 + j += 1 + sum += weight + + # the weights add up to one, continue with the next vertex. + if sum >= 1.0: + j = 4 + + vertexIndex += 1 + j = 0 + sum = 0 + # we read three weights, but they don't add up to one. calculate the fourth one, and read + # missing bone index. continue with next vertex. + elif j == 3: # + self.m_BoneWeights[vertexIndex][j] = 1 - sum + self.m_BoneIndices[vertexIndex][j] = boneIndicesData[ + boneIndecesIndex + ] + + boneIndecesIndex += 1 + vertexIndex += 1 + j = 0 + sum = 0 + + # IndexBuffer + if m_CompressedMesh.m_Triangles.m_NumItems > 0: # + self.m_IndexBuffer = unpack_ints(m_CompressedMesh.m_Triangles) + # Color + if m_CompressedMesh.m_Colors and m_CompressedMesh.m_Colors.m_NumItems > 0: + rgba_colors = unpack_ints(m_CompressedMesh.m_Colors) + self.m_Colors = [ + ( + ((rgba >> 24) & 0xFF) / 255, + ((rgba >> 16) & 0xFF) / 255, + ((rgba >> 8) & 0xFF) / 255, + (rgba & 0xFF) / 255, + ) + for rgba in rgba_colors + ] + + def get_triangles(self) -> List[List[Tuple[int, ...]]]: + assert self.m_IndexBuffer is not None + + submeshes: List[List[Tuple[int, ...]]] = [] + + for m_SubMesh in self.src.m_SubMeshes: + firstIndex = m_SubMesh.firstByte // 2 + if not self.m_Use16BitIndices: + firstIndex //= 2 + + indexCount = m_SubMesh.indexCount + topology = m_SubMesh.topology + + triangles: List[int] + + if topology == MeshTopology.Triangles: + triangles = self.m_IndexBuffer[firstIndex : firstIndex + indexCount] + elif ( + self.version[0] < 4 or topology == MeshTopology.TriangleStrip + ): # TriangleStrip + # todo: use as_strided, then fix winding, finally remove degenerates + triIndex = 0 + triangles = list((indexCount - 2) * 3) + + for i in range(indexCount - 2): + a, b, c = self.m_IndexBuffer[firstIndex + i : firstIndex + i + 3] + # skip degenerates + if a == b or a == c or b == c: + continue + + # do the winding flip-flop of strips + if i & 1: + triangles[triIndex] = b, a, c + else: + triangles[triIndex] = a, b, c + triIndex += 1 + + triangles = triangles[:triIndex] + + elif topology == MeshTopology.Quads: + # one quad is two triangles, so // 4 * 2 = // 2 + # TODO: use as_strided + triangles = list(indexCount // 2, 3) + triIndex = 0 + for a, b, c, d in self.m_IndexBuffer[ + firstIndex : firstIndex + indexCount : 4 + ]: + triangles[triIndex] = a, b, c + triangles[triIndex + 1] = a, c, d + triIndex += 2 + else: + raise ValueError( + "Failed getting triangles. Submesh topology is lines or points." + ) + + triangles = [triangles[i : i + 3] for i in range(0, len(triangles), 3)] + submeshes.append(triangles) + + return submeshes + + +# COMPRESSION_BIT_SIZES = { +# "high": { +# "vertex": 10, +# "uv": 8, +# "normal": 6, +# }, +# "medium": { +# "vertex": 16, +# "uv": 10, +# "normal": 8 +# }, +# "low": { +# "vertex": 20, +# "uv": 16, +# "normal": 8 +# }, +# } diff --git a/UnityPy/helpers/PackedBitVector.py b/UnityPy/helpers/PackedBitVector.py new file mode 100644 index 00000000..8ad9ac16 --- /dev/null +++ b/UnityPy/helpers/PackedBitVector.py @@ -0,0 +1,145 @@ +from typing import Optional, List, TYPE_CHECKING, Tuple + +# from ..objects.math import Quaternionf +if TYPE_CHECKING: + from ..classes.generated import PackedBitVector + + +def reshape(data: list, shape: Optional[Tuple[int, ...]] = None) -> list: + if shape is None: + return data + if len(shape) == 1: + m = shape[0] + return [data[i : i + m] for i in range(0, len(data), m)] + elif len(shape) == 2: + m, n = shape + return [ + [[data[i + j : i + j + n] for j in range(0, m * n, n)]] + for i in range(0, len(data), m * n) + ] + else: + raise ValueError("Invalid shape") + + +def unpack_ints( + packed: "PackedBitVector", + start: int = 0, + count: Optional[int] = None, + shape: Optional[Tuple[int, ...]] = None, +) -> List[int]: + assert packed.m_BitSize is not None + + m_BitSize = packed.m_BitSize + m_Data = packed.m_Data + + bitPos = m_BitSize * start + indexPos = bitPos // 8 + bitPos %= 8 + + if count is None: + count = packed.m_NumItems + + # if m_BitSize <= 8: + # dtype = np.uint8 + # elif m_BitSize <= 16: + # dtype = np.uint16 + # elif m_BitSize <= 32: + # dtype = np.uint32 + # elif m_BitSize <= 64: + # dtype = np.uint64 + # else: + # raise ValueError("Invalid bit size") + + # data = np.zeros(packed.m_NumItems, dtype=dtype) + data = [0] * packed.m_NumItems + + for i in range(packed.m_NumItems): + bits = 0 + value = 0 + while bits < m_BitSize: + value |= (m_Data[indexPos] >> bitPos) << bits + num = min(m_BitSize - bits, 8 - bitPos) + bitPos += num + bits += num + if bitPos == 8: + indexPos += 1 + bitPos = 0 + data[i] = value & ((1 << m_BitSize) - 1) + + return reshape(data, shape) + + +def unpack_floats( + packed: "PackedBitVector", + start: int = 0, + count: Optional[int] = None, + shape: Optional[Tuple[int, ...]] = None, +) -> List[float]: + assert ( + packed.m_BitSize is not None + and packed.m_Range is not None + and packed.m_Start is not None + ) + + # read as int and cast up to double to prevent loss of precision + quantized_f64 = unpack_ints(packed, start, count) + quantized = [x * packed.m_Range + packed.m_Start for x in quantized_f64] + return reshape(quantized, shape) + + +# def pack_ints( +# data: npt.NDArray[np.uint], bitsize: Optional[int] = 0 +# ) -> PackedBitVector: +# # ensure that the data type is unsigned +# assert "uint" in data.dtype.name + +# m_NumItems = data.size + +# maxi = data.max() +# # Prevent overflow +# if bitsize: +# m_BitSize = bitsize +# else: +# m_BitSize = (32 if maxi == 0xFFFFFFFF else np.ceil(np.log2(maxi + 1))) % 256 +# m_Data = np.zeros((m_NumItems * m_BitSize + 7) // 8, dtype=np.uint8) + +# indexPos = 0 +# bitPos = 0 +# for x in data: +# bits = 0 +# while bits < m_BitSize: +# m_Data[indexPos] |= (x >> bits) << bitPos +# num = min(m_BitSize - bits, 8 - bitPos) +# bitPos += num +# bits += num +# if bitPos == 8: +# indexPos += 1 +# bitPos = 0 + +# return PackedBitVector(m_NumItems=m_NumItems, m_BitSize=m_BitSize, m_Data=m_Data) + + +# def pack_floats( +# data: npt.NDArray[np.floating[Any]], +# bitsize: Optional[int] = None, +# ) -> PackedBitVector: +# min = data.min() +# max = data.max() +# range = max - min +# data_f64 = data.astype(np.float64) +# # rebase to 0 +# data_f64 -= min +# # scale to [0, 1] +# data_f64 /= range +# # quantize to [0, 2^bit_size - 1] +# bitsize = bitsize or max(data.itemsize, 32) +# assert bitsize is not None + +# data_f64 *= (1 << bitsize) - 1 +# # pack the data +# packed = pack_ints(data_f64.astype(np.uint32), bitsize) +# packed.m_Start = min +# packed.m_Range = range +# return packed + +__all__ = ("unpack_ints", "unpack_floats") diff --git a/UnityPy/helpers/TypeTreeHelper.py b/UnityPy/helpers/TypeTreeHelper.py index 9fa88e8d..5a092db6 100644 --- a/UnityPy/helpers/TypeTreeHelper.py +++ b/UnityPy/helpers/TypeTreeHelper.py @@ -1,139 +1,29 @@ -from typing import Any, Dict, List, Union, Iterable, Tuple -from ..streams import EndianBinaryReader, EndianBinaryWriter -from ctypes import c_uint32 -import tabulate -from ..exceptions import TypeTreeError as TypeTreeError +from __future__ import annotations +import re +from typing import Optional, Any, Union, TYPE_CHECKING -kAlignBytes = 0x4000 - - -class TypeTreeNode(object): - __slots__ = ( - "m_Version", - "m_Level", - "m_TypeFlags", - "m_ByteSize", - "m_Index", - "m_MetaFlag", - "m_Type", - "m_Name", - "m_TypeStrOffset", - "m_NameStrOffset", - "m_RefTypeHash", - "m_VariableCount", - ) - m_Type: str - m_Name: str - m_ByteSize: int - m_Index: int - m_Version: int - m_MetaFlag: int - m_Level: int - m_TypeStrOffset: int - m_NameStrOffset: int - m_RefTypeHash: str - m_TypeFlags: int - m_VariableCount: int - - def __init__(self, data: Union[dict, Iterable[Tuple]] = None, **kwargs): - if isinstance(data, dict): - items = data.items() - elif kwargs: - items = kwargs.items() - else: - items = data - - for key, val in items: - setattr(self, key, val) - - def __repr__(self): - return f"" - - -try: - from ..UnityPyBoost import TypeTreeNode, read_typetree as read_typetree_c -except: - read_typetree_c = None - - -def node_dict_to_node_cls(nodes: List[dict]) -> List[TypeTreeNode]: - """Converts all dict-type nodes into TypeTreeNodes - - Parameters - ---------- - nodes : List[dict] - nodes/nodes of the typetree as dict - - Returns - ------- - List[TypeTreeNode] - a list of TypeTreeNode-type nodes - """ - # legacy support - if not next(iter(nodes[0])).startswith("m_"): - return [ - TypeTreeNode( - m_Name=x["name"], - m_Type=x["type"], - m_Level=x["level"], - m_MetaFlag=x["meta_flag"], - ) - for x in nodes - ] +from .TypeTreeNode import TypeTreeNode +from ..streams.EndianBinaryReader import EndianBinaryReader +from ..streams.EndianBinaryWriter import EndianBinaryWriter - return [TypeTreeNode(**node) for node in nodes] +from .. import classes +Object = classes.Object +PPtr = classes.PPtr -def check_nodes(nodes: List[Union[dict, TypeTreeNode]]) -> List[TypeTreeNode]: - """Checks the type of the nodes and converts them if necessary. +if TYPE_CHECKING: + from ..files.SerializedFile import SerializedFile - Parameters - ---------- - nodes : List[Union[dict, TypeTreeNode]] - nodes/nodes of the typetree as dict or TypeTreeNode - - Returns - ------- - List[TypeTreeNode] - a list of TypeTreeNode-type nodes - """ - if isinstance(nodes, list): - if len(nodes) == 0: - raise ValueError("not enough nodes") - if isinstance(nodes[0], TypeTreeNode): - return nodes - elif isinstance(nodes[0], dict): - return node_dict_to_node_cls(nodes) - raise ValueError( - f"nodes must be a list of dict or TypeTreeNode elements, but received {type(nodes)} - {type(nodes[0]) if isinstance(nodes, list) else ''}" - ) - - -def get_nodes(nodes: List[TypeTreeNode], index: int) -> list: - """Copies all nodes above the level of the node at the set index. - - Parameters - ---------- - nodes : list - nodes/nodes of the typetree - index : int - index of the node - - Returns - ------- - list - A list of nodes - """ - level = nodes[index].m_Level - for i, node in enumerate(nodes[index + 1 :], index + 1): - if node.m_Level <= level: - return nodes[index:i] - return nodes[index:] +kAlignBytes = 0x4000 def read_typetree( - nodes: List[Union[dict, TypeTreeNode]], reader: EndianBinaryReader -) -> dict: + root_node: TypeTreeNode, + reader: EndianBinaryReader, + as_dict: bool = True, + expected_read: Optional[int] = None, + assetsfile: Optional[SerializedFile] = None, +) -> Union[dict[str, Any], Object]: """Reads the typetree of the object contained in the reader via the node list. Parameters @@ -145,380 +35,359 @@ def read_typetree( Returns ------- - dict + dict | objects.Object The parsed typtree """ - reader.reset() - - nodes = check_nodes(nodes) + pos = reader.Position + obj = read_value(root_node, reader, as_dict, assetsfile) - if read_typetree_c: - return read_typetree_c( - nodes, reader.read_bytes(reader.byte_size), reader.endian - ) - - obj = read_value(nodes, reader, c_uint32(0)) - - read = reader.Position - reader.byte_start - if read != reader.byte_size: - raise TypeTreeError( - f"Error while read type, read {read} bytes but expected {reader.byte_size} bytes", - nodes, + read = reader.Position - pos + if expected_read is not None and read != expected_read: + raise ValueError( + f"Expected to read {expected_read} bytes, but read {read} bytes" ) return obj -def read_value(nodes: List[TypeTreeNode], reader: EndianBinaryReader, i: c_uint32): - node = nodes[i.value] - typ = node.m_Type - align = (node.m_MetaFlag & kAlignBytes) != 0 - - if typ == "SInt8": - value = reader.read_byte() - elif typ in ["UInt8", "char"]: - value = reader.read_u_byte() - elif typ in ["short", "SInt16"]: - value = reader.read_short() - elif typ in ["UInt16", "unsigned short"]: - value = reader.read_u_short() - elif typ in ["int", "SInt32"]: - value = reader.read_int() - elif typ in ["UInt32", "unsigned int", "Type*"]: - value = reader.read_u_int() - elif typ in ["long long", "SInt64"]: - value = reader.read_long() - elif typ in ["UInt64", "unsigned long long", "FileSize"]: - value = reader.read_u_long() - elif typ == "float": - value = reader.read_float() - elif typ == "double": - value = reader.read_double() - elif typ == "bool": - value = reader.read_boolean() - elif typ == "string": - value = reader.read_aligned_string() - i.value += 3 # Array, Size, Data(typ) - elif typ == "map": # map == MultiDict - if (nodes[i.value + 1].m_MetaFlag & kAlignBytes) != 0: - align = True - map_ = get_nodes(nodes, i.value) - i.value += len(map_) - 1 - first = get_nodes(map_, 4) - second = get_nodes(map_, 4 + len(first)) - size = reader.read_int() - value = [None] * size - for j in range(size): - key = read_value(first, reader, c_uint32(0)) - value[j] = (key, read_value(second, reader, c_uint32(0))) - elif typ == "TypelessData": - size = reader.read_int() - value = reader.read_bytes(size) - i.value += 2 # Size == int, Data(typ) == char/uint8 - else: - # Vector - if i.value < len(nodes) - 1 and nodes[i.value + 1].m_Type == "Array": - if (nodes[i.value + 1].m_MetaFlag & kAlignBytes) != 0: - align = True - vector = get_nodes(nodes, i.value) - i.value += len(vector) - 1 - size = reader.read_int() - value = [read_value(vector, reader, c_uint32(3)) for _ in range(size)] - else: # Class - clz = get_nodes(nodes, i.value) - i.value += len(clz) - 1 - value = {} - j = c_uint32(1) - while j.value < len(clz): - clz_node = clz[j.value] - value[clz_node.m_Name] = read_value(clz, reader, j) - j.value += 1 - - if align: - reader.align_stream() - return value - - -def read_typetree_str( - sb: List[str], nodes: List[Union[dict, TypeTreeNode]], reader: EndianBinaryReader -) -> list: - """Reads the typetree of the object contained in the reader via the node list and dumps it as string. +def write_typetree( + value: Union[dict[str, Any], Object], + root_node: TypeTreeNode, + writer: EndianBinaryWriter, +) -> None: + """Writes the typetree of the object contained in the reader via the node list. Parameters ---------- - sb : list - StringBuilder - a list used to build the string dump, should be empty + value: dict | objects.Object + The object to be written nodes : list List of nodes/nodes - reader : EndianBinaryReader - Reader of the object to be parsed - - Returns - ------- - list - The sb given as input + writer : EndianBinaryWriter + Writer of the object to be parsed """ - # reader.reset() - nodes = check_nodes(nodes) - - i = c_uint32(0) - while i.value < len(nodes): - read_value_str(sb, nodes, reader, i) - i.value += 1 - - readed = reader.Position - reader.byte_start - if readed != reader.byte_size: - raise TypeTreeError( - f"Error while read type, read {readed} bytes but expected {reader.byte_size} bytes", - nodes, - ) - - return sb - - -def read_value_str( - sb: List[str], nodes: List[TypeTreeNode], reader: EndianBinaryReader, i: c_uint32 -) -> list: - node = nodes[i.value] - typ = node.m_Type - align = (node.m_MetaFlag & kAlignBytes) != 0 - append = True - - if typ == "SInt8": - value = reader.read_byte() - elif typ in ["UInt8", "char"]: - value = reader.read_u_byte() - elif typ in ["short", "SInt16"]: - value = reader.read_short() - elif typ in ["UInt16", "unsigned short"]: - value = reader.read_u_short() - elif typ in ["int", "SInt32"]: - value = reader.read_int() - elif typ in ["UInt32", "unsigned int", "Type*"]: - value = reader.read_u_int() - elif typ in ["long long", "SInt64"]: - value = reader.read_long() - elif typ in ["UInt64", "unsigned long long", "FileSize"]: - value = reader.read_u_long() - elif typ == "float": - value = reader.read_float() - elif typ == "double": - value = reader.read_double() - elif typ == "bool": - value = reader.read_boolean() - elif typ == "string": - value = reader.read_aligned_string() - i.value += 3 # Array, Size, Data(typ) - append = False - sb.append( - '{0}{1} {2} = "{3}"\r\n'.format( - "\t" * node.m_Level, node.m_Type, node.m_Name, value - ) - ) - elif typ == "map": - if (nodes[i.value + 1].m_MetaFlag & kAlignBytes) != 0: - align = True - map_ = get_nodes(nodes, i.value) - i.value += len(map_) - 1 - first = get_nodes(map_, 4) - second = get_nodes(map_, 4 + len(first)) - size = reader.read_int() - append = False - sb.append( - "{0}{1} {2}\r\n".format("\t" * node.m_Level, node.m_Type, node.m_Name) - ) - sb.append("{0}{1} {2}\r\n".format("\t" * (node.m_Level + 1), "Array", "Array")) - sb.append( - "{0}{1} {2} = {3}\r\n".format( - "\t" * (node.m_Level + 1), "int", "size", size - ) - ) - for j in range(size): - sb.append("{0}[{1}]\r\n".format("\t" * (node.m_Level + 2), j)) - sb.append( - "{0}{1} {2}\r\n".format("\t" * (node.m_Level + 2), "pair", "data") - ) - read_value_str(sb, first, reader, c_uint32(0)) - read_value_str(sb, second, reader, c_uint32(0)) - elif typ == "TypelessData": - size = reader.read_int() - value = reader.read_bytes(size) - i.value += 2 # Size == int, Data(typ) == char/uint8 - append = False - sb.append( - "{0}{1} {2}\r\n".format("\t" * node.m_Level, node.m_Type, node.m_Name) - ) - sb.append( - "{0}{1} {2} = {3}\r\n".format("\t" * node.m_Level, "int", "size", size) - ) - # sb.append("{0}{1} {2} = {3}\r\n".format( - # "\t" * node.level, "UInt8", "data", base64.b64encode(value))) - else: - # Vector - if i.value < len(nodes) - 1 and nodes[i.value + 1].m_Type == "Array": - if (nodes[i.value + 1].m_MetaFlag & kAlignBytes) != 0: - align = True - vector = get_nodes(nodes, i.value) - i.value += len(vector) - 1 - size = reader.read_int() - append = False - sb.append( - "{0}{1} {2}\r\n".format("\t" * node.m_Level, node.m_Type, node.m_Name) - ) - sb.append( - "{0}{1} {2}\r\n".format("\t" * (node.m_Level + 1), "Array", "Array") - ) - sb.append( - "{0}{1} {2} = {3}\r\n".format( - "\t" * (node.m_Level + 1), "int", "size", size - ) - ) - for j in range(size): - sb.append("{0}[{1}]\r\n".format("\t" * (node.m_Level + 2), j)) - read_value_str(sb, vector, reader, c_uint32(3)) - - else: # Class - clz = get_nodes(nodes, i.value) - i.value += len(clz) - 1 - j = c_uint32(1) - append = False - sb.append( - "{0}{1} {2}\r\n".format("\t" * node.m_Level, node.m_Type, node.m_Name) - ) - while j.value < len(clz): - read_value_str(sb, clz, reader, j) - j.value += 1 - - if append: - sb.append( - "{0}{1} {2} = {3}\r\n".format( - "\t" * node.m_Level, node.m_Type, node.m_Name, value - ) - ) + return write_value(value, root_node, writer) + + +def read_value( + node: TypeTreeNode, + reader: EndianBinaryReader, + as_dict: bool, + assetsfile: Optional[SerializedFile], +) -> Any: + # print(reader.Position, node.m_Name, node.m_Type, node.m_MetaFlag) + align = metaflag_is_aligned(node.m_MetaFlag) + + match node.m_Type: + case "SInt8": + value = reader.read_byte() + case "UInt8" | "char": + value = reader.read_u_byte() + case "short" | "SInt16": + value = reader.read_short() + case "UInt16" | "unsigned short": + value = reader.read_u_short() + case "int" | "SInt32": + value = reader.read_int() + case "UInt32" | "unsigned int" | "Type*": + value = reader.read_u_int() + case "long long" | "SInt64": + value = reader.read_long() + case "UInt64" | "unsigned long long" | "FileSize": + value = reader.read_u_long() + case "float": + value = reader.read_float() + case "double": + value = reader.read_double() + case "bool": + value = reader.read_boolean() + case "string": + value = reader.read_aligned_string() + case "TypelessData": + value = reader.read_byte_array() + case "pair": + first = read_value(node.m_Children[0], reader, as_dict, assetsfile) + second = read_value(node.m_Children[1], reader, as_dict, assetsfile) + value = (first, second) + case _: + if not node.m_Children: + value = None + # raise NotImplementedError(f"Reference type {node.m_Type} not implemented") + # Vector + elif node.m_Children and node.m_Children[0].m_Type == "Array": + if metaflag_is_aligned(node.m_Children[0].m_MetaFlag): + align = True + + size = ( + reader.read_int() + ) # read_value(node.m_Children[0].m_Children[0], reader, as_dict) + subtype = node.m_Children[0].m_Children[1] + if metaflag_is_aligned(subtype.m_MetaFlag): + value = read_value_array(subtype, reader, as_dict, size, assetsfile) + else: + value = [ + read_value(subtype, reader, as_dict, assetsfile) + for _ in range(size) + ] + + else: # Class + value = { + child.m_Name: read_value(child, reader, as_dict, assetsfile) + for child in node.m_Children + } + + if not as_dict: + if node.m_Type.startswith("PPtr<"): + value = PPtr[Any]( + assetsfile=assetsfile, + m_FileID=value["m_FileID"], + m_PathID=value["m_PathID"], + type=node.m_Type[6:-1], + ) + else: + clz = getattr(classes, node.m_Type, Object) + clz_kwargs = { + clean_name(key): value for key, value in value.items() + } + try: + value = clz(**clz_kwargs) + except TypeError: + extra_keys = set(clz_kwargs.keys()) - set( + clz.__annotations__ + ) + value = clz( + **{ + key: value + for key, value in clz_kwargs.items() + if key in clz.__annotations__ + } + ) + for key in extra_keys: + setattr(value, key, clz_kwargs[key]) if align: reader.align_stream() - return sb - - -def dump_typetree(nodes: List[TypeTreeNode]) -> str: - """Dumps the structure of the given nodes. - - Parameters - ---------- - nodes : list - List of nodes/nodes - Returns - ------- - str - The dumped structure - """ - field_names = ["m_Level", "m_Type", "m_Name", "m_MetaFlag"] - rows = [[getattr(x, key) for key in field_names] for x in nodes] - return tabulate.tabulate(rows, headers=field_names) + return value -def write_typetree( - obj: dict, nodes: List[Union[dict, TypeTreeNode]], writer: EndianBinaryWriter = None -) -> EndianBinaryWriter: - """Writes the data of the object via the given typetree of the object into the writer. +def read_value_array( + node: TypeTreeNode, + reader: EndianBinaryReader, + as_dict: bool, + size: int, + assetsfile: Optional[SerializedFile], +) -> Any: + align = metaflag_is_aligned(node.m_MetaFlag) + + match node.m_Type: + case "SInt8": + value = reader.read_byte_array(size) + case "UInt8" | "char": + value = reader.read_u_byte_array(size) + case "short" | "SInt16": + value = reader.read_short_array(size) + case "UInt16" | "unsigned short": + value = reader.read_u_short_array(size) + case "int" | "SInt32": + value = reader.read_int_array(size) + case "UInt32" | "unsigned int" | "Type*": + value = reader.read_u_int_array(size) + case "long long" | "SInt64": + value = reader.read_long_array(size) + case "UInt64" | "unsigned long long" | "FileSize": + value = reader.read_u_long_array(size) + case "float": + value = reader.read_float_array(size) + case "double": + value = reader.read_double_array(size) + case "bool": + value = reader.read_boolean_array(size) + case "string": + value = [reader.read_aligned_string() for _ in range(size)] + case "TypelessData": + value = [reader.read_bytes() for _ in range(size)] + case "pair": + value = [ + ( + read_value(node.m_Children[0], reader, as_dict, assetsfile), + read_value(node.m_Children[1], reader, as_dict, assetsfile), + ) + for _ in range(size) + ] + case _: + if not node.m_Children: + value = None + # raise NotImplementedError(f"Reference type {node.m_Type} not implemented") + # Vector + elif node.m_Children[0].m_Type == "Array": + if metaflag_is_aligned(node.m_Children[0].m_MetaFlag): + align = True + subtype = node.m_Children[0].m_Children[1] + if metaflag_is_aligned(subtype.m_MetaFlag): + value = [ + read_value_array( + subtype, reader, as_dict, reader.read_int(), assetsfile + ) + for _ in range(size) + ] + else: + value = [ + [ + read_value(subtype, reader, as_dict, assetsfile) + for _ in range(reader.read_int()) + ] + for _ in range(size) + ] + else: # Class + if as_dict: + value = [ + { + child.m_Name: read_value(child, reader, as_dict, assetsfile) + for child in node.m_Children + } + for _ in range(size) + ] + else: + if node.m_Type.startswith("PPtr<"): + value = [ + PPtr[Any]( + assetsfile=assetsfile, + type=node.m_Type[6:-1], + **{ + child.m_Name: read_value( + child, reader, as_dict, assetsfile + ) + for child in node.m_Children + }, + ) + for _ in range(size) + ] + else: + clz = getattr( + classes, + node.m_Type, + Object, + ) + clean_names = [ + clean_name(child.m_Name) for child in node.m_Children + ] + if all(name in clz.__annotations__ for name in clean_names): + value = [ + clz( + **{ + name: read_value( + child, reader, as_dict, assetsfile + ) + for name, child in zip( + clean_names, node.m_Children + ) + } + ) + for _ in range(size) + ] + else: + extra_keys = set(clean_names) - set(clz.__annotations__) + value = [None] * size + for i in range(size): + value_i_d = { + clean_name(child.m_Name): read_value( + child, reader, as_dict, assetsfile + ) + for child in node.m_Children + } + value_i = clz( + **{ + key: value + for key, value in value_i_d.items() + if key in clz.__annotations__ + } + ) + for key in extra_keys: + setattr(value_i, key, value_i_d[key]) + value[i] = value_i + if align: + reader.align_stream() + return value - Parameters - ---------- - obj : dict - Object to be saved - nodes : list - List of nodes/nodes - writer : EndianBinaryWriter - Writer of the object to be saved - Returns - ------- - EndianBinaryWriter - The writer that was used to save the data of the given object. - """ - if not writer: - writer = EndianBinaryWriter() +def metaflag_is_aligned(meta_flag: int | None) -> bool: + return ((meta_flag or 0) & kAlignBytes) != 0 - nodes = check_nodes(nodes) - i = c_uint32(1) - while i.value < len(nodes): - value = obj[nodes[i.value].m_Name] - write_value(value, nodes, writer, i) - i.value += 1 - return writer +def clean_name(name: str) -> str: + if name.startswith("(int&)"): + name = name[6:] + if name.endswith("?"): + name = name[:-1] + name = re.sub(r"[ \.:\-\[\]]", "_", name) + if name in ["pass", "from"]: + name += "_" + if name[0].isdigit(): + name = f"x{name}" + return name def write_value( - value: Any, nodes: List[TypeTreeNode], writer: EndianBinaryWriter, i: c_uint32 -): - node = nodes[i.value] - typ = node.m_Type - align = (node.m_MetaFlag & kAlignBytes) != 0 - - if typ == "SInt8": - writer.write_byte(value) - elif typ in ["UInt8", "char"]: - writer.write_u_byte(value) - elif typ in ["short", "SInt16"]: - writer.write_short(value) - elif typ in ["UInt16", "unsigned short"]: - writer.write_u_short(value) - elif typ in ["int", "SInt32"]: - writer.write_int(value) - elif typ in ["UInt32", "unsigned int", "Type*"]: - writer.write_u_int(value) - elif typ in ["long long", "SInt64"]: - writer.write_long(value) - elif typ in ["UInt64", "unsigned long long", "FileSize"]: - writer.write_u_long(value) - elif typ == "float": - writer.write_float(value) - elif typ == "double": - writer.write_double(value) - elif typ == "bool": - writer.write_boolean(value) - elif typ == "string": - writer.write_aligned_string(value) - i.value += 3 # Array, Size, Data(typ) - elif typ == "map": - if (nodes[i.value + 1].m_MetaFlag & kAlignBytes) != 0: - align = True - map_ = get_nodes(nodes, i.value) - i.value += len(map_) - 1 - first = get_nodes(map_, 4) - second = get_nodes(map_, 4 + len(first)) - # size - writer.write_int(len(value)) - # data - for key, val in value: - write_value(key, first, writer, c_uint32(0)) - write_value(val, second, writer, c_uint32(0)) - - elif typ == "TypelessData": - writer.write_int(len(value)) - writer.write_bytes(value) - i.value += 2 # Size == int, Data(typ) == char/uint8 - else: - # Vector - if i.value < len(nodes) - 1 and nodes[i.value + 1].m_Type == "Array": - if (nodes[i.value + 1].m_MetaFlag & kAlignBytes) != 0: - align = True - vector = get_nodes(nodes, i.value) - i.value += len(vector) - 1 - writer.write_int(len(value)) - for val in value: - write_value(val, vector, writer, c_uint32(3)) - else: # Class - clz = get_nodes(nodes, i.value) - i.value += len(clz) - 1 - j = c_uint32(1) - while j.value < len(clz): - val = value[clz[j.value].m_Name] - write_value(val, clz, writer, j) - j.value += 1 + value: Any, + node: TypeTreeNode, + writer: EndianBinaryWriter, +) -> None: + # print(reader.Position, node.m_Name, node.m_Type, node.m_MetaFlag) + align = metaflag_is_aligned(node.m_MetaFlag) + + match node.m_Type: + case "SInt8": + writer.write_byte(value) + case "UInt8" | "char": + writer.write_u_byte(value) + case "short" | "SInt16": + writer.write_short(value) + case "UInt16" | "unsigned short": + writer.write_u_short(value) + case "int" | "SInt32": + writer.write_int(value) + case "UInt32" | "unsigned int" | "Type*": + writer.write_u_int(value) + case "long long" | "SInt64": + writer.write_long(value) + case "UInt64" | "unsigned long long" | "FileSize": + writer.write_u_long(value) + case "float": + writer.write_float(value) + case "double": + writer.write_double(value) + case "bool": + writer.write_boolean(value) + case "string": + writer.write_aligned_string(value) + case "TypelessData": + writer.write_byte_array(value) + case "pair": + write_value(value[0], node.m_Children[0], writer) + write_value(value[1], node.m_Children[1], writer) + case _: + if not node.m_Children: + value = None + # raise NotImplementedError(f"Reference type {node.m_Type} not implemented") + # Vector + elif node.m_Children and node.m_Children[0].m_Type == "Array": + if metaflag_is_aligned(node.m_Children[0].m_MetaFlag): + align = True + + writer.write_int(len(value)) + subtype = node.m_Children[0].m_Children[1] + [write_value(sub_value, subtype, writer) for sub_value in value] + + else: # Class + if isinstance(value, dict): + for child in node.m_Children: + write_value(value[child.m_Name], child, writer) + else: + for child in node.m_Children: + write_value( + getattr(value, clean_name(child.m_Name)), child, writer + ) if align: writer.align_stream() diff --git a/UnityPy/helpers/TypeTreeNode.py b/UnityPy/helpers/TypeTreeNode.py new file mode 100644 index 00000000..d76ee3d3 --- /dev/null +++ b/UnityPy/helpers/TypeTreeNode.py @@ -0,0 +1,227 @@ +from __future__ import annotations +from struct import Struct +from typing import Optional, List, Tuple, TYPE_CHECKING, Dict, Iterator + +from attrs import define, field + +from ..streams.EndianBinaryReader import EndianBinaryReader +from ..streams.EndianBinaryWriter import EndianBinaryWriter + +if TYPE_CHECKING: + from .Tpk import UnityVersion + + +@define +class TypeTreeNode: + m_Level: int + m_Type: str + m_Name: str + m_ByteSize: int + m_TypeFlags: int + m_Version: int + m_Children: List[TypeTreeNode] = field(factory=list) + m_VariableCount: Optional[int] = None + m_Index: Optional[int] = None + m_MetaFlag: Optional[int] = None + m_RefTypeHash: Optional[int] = None + + def traverse(self) -> Iterator[TypeTreeNode]: + stack: list[TypeTreeNode] = [self] + while stack: + node = stack.pop() + stack.extend(reversed(node.m_Children)) + yield node + + @classmethod + def parse(cls, reader: EndianBinaryReader, version: int) -> TypeTreeNode: + # stack approach is way faster than recursion + # using a fake root node to avoid special case for root node + dummy_node = TypeTreeNode(-1, "", "", 0, 0, 0, []) + dummy_root = TypeTreeNode(-1, "", "", 0, 0, 0, [dummy_node]) + + stack: List[Tuple[TypeTreeNode, int]] = [(dummy_root, 1)] + while stack: + parent, count = stack[-1] + if count == 1: + stack.pop() + else: + stack[-1] = (parent, count - 1) + + node = TypeTreeNode( + m_Level=parent.m_Level + 1, + m_Type=reader.read_string_to_null(), + m_Name=reader.read_string_to_null(), + m_ByteSize=reader.read_int(), + m_VariableCount=reader.read_int() if version == 2 else None, + m_Index=reader.read_int() if version != 3 else None, + m_TypeFlags=reader.read_int(), + m_Version=reader.read_int(), + m_MetaFlag=reader.read_int() if version != 3 else None, + ) + parent.m_Children[-count] = node + children_count = reader.read_int() + if children_count > 0: + node.m_Children = [dummy_node] * children_count + stack.append((node, children_count)) + return dummy_root.m_Children[0] + + @classmethod + def parse_blob(cls, reader: EndianBinaryReader, version: int) -> TypeTreeNode: + node_count = reader.read_int() + stringbuffer_size = reader.read_int() + + node_struct, keys = _get_blob_node_struct(reader.endian, version) + struct_data = reader.read(node_struct.size * node_count) + stringbuffer_reader = EndianBinaryReader( + reader.read(stringbuffer_size), reader.endian + ) + + CommonString = get_common_strings() + + def read_string(reader: EndianBinaryReader, value: int) -> str: + is_offset = (value & 0x80000000) == 0 + if is_offset: + reader.Position = value + return reader.read_string_to_null() + + offset = value & 0x7FFFFFFF + return CommonString.get(offset, str(offset)) + + fake_root: TypeTreeNode = TypeTreeNode(-1, "", "", 0, 0, 0, []) + stack: List[TypeTreeNode] = [fake_root] + parent = fake_root + prev = fake_root + + for raw_node in node_struct.iter_unpack(struct_data): + node = TypeTreeNode( + **dict(zip(keys[:3], raw_node[:3])), + **dict(zip(keys[5:], raw_node[5:])), + m_Type=read_string(stringbuffer_reader, raw_node[3]), + m_Name=read_string(stringbuffer_reader, raw_node[4]), + ) + + if node.m_Level > prev.m_Level: + stack.append(parent) + parent = prev + elif node.m_Level < prev.m_Level: + while node.m_Level <= parent.m_Level: + parent = stack.pop() + + parent.m_Children.append(node) + prev = node + + return fake_root.m_Children[0] + + def dump(self, writer: EndianBinaryWriter, version: int): + stack: list[TypeTreeNode] = [self] + while stack: + node = stack.pop() + + writer.write_string_to_null(self.m_Type) + writer.write_string_to_null(self.m_Name) + writer.write_int(self.m_ByteSize) + if version == 2: + assert self.m_VariableCount is not None + writer.write_int(self.m_VariableCount) + if version != 3: + assert self.m_Index is not None + writer.write_int(self.m_Index) + writer.write_int(self.m_TypeFlags) + writer.write_int(self.m_Version) + if version != 3: + assert self.m_MetaFlag is not None + writer.write_int(self.m_MetaFlag) + + writer.write_int(len(self.m_Children)) + + stack.extend(reversed(node.m_Children)) + + def dump_blob(self, writer: EndianBinaryWriter, version: int): + node_writer = EndianBinaryWriter(endian=writer.endian) + string_writer = EndianBinaryWriter() + + # string buffer setup + CommonStringOffsetMap = { + string: offset for offset, string in get_common_strings().items() + } + + string_offsets: dict[str, int] = {} + + def write_string(string: str) -> int: + offset = string_offsets.get(string) + if offset is None: + common_offset = CommonStringOffsetMap.get(string) + if common_offset: + offset = common_offset | 0x80000000 + else: + offset = string_writer.Position + string_writer.write_string_to_null(string) + string_offsets[string] = offset + return offset + + # node buffer setup + node_struct, keys = _get_blob_node_struct(writer.endian, version) + + def write_node(node: TypeTreeNode): + node_writer.write( + node_struct.pack( + *[getattr(node, key) for key in keys[:3]], + write_string(node.m_Type), + write_string(node.m_Name), + *[getattr(node, key) for key in keys[5:]], + ) + ) + + # write nodes + node_count = len([write_node(node) for node in self.traverse()]) + + # write blob + writer.write_int(node_count) + writer.write_int(string_writer.Position) + writer.write(node_writer.bytes) + writer.write(string_writer.bytes) + + +COMMONSTRING_CACHE: Dict[Optional[UnityVersion], Dict[int, str]] = {} + + +def get_common_strings(version: Optional[UnityVersion] = None) -> Dict[int, str]: + if version in COMMONSTRING_CACHE: + return COMMONSTRING_CACHE[version] + + from .Tpk import TPKTYPETREE + + tree = TPKTYPETREE + common_string = tree.CommonString + strings = common_string.GetStrings(tree.StringBuffer) + if version: + count = common_string.GetCount(version) + strings = strings[:count] + + ret: Dict[int, str] = {} + offset = 0 + for string in strings: + ret[offset] = string + offset += len(string) + 1 + + COMMONSTRING_CACHE[version] = ret + return ret + + +def _get_blob_node_struct(endian: str, version: int) -> tuple[Struct, list[str]]: + struct_type = f"{endian}hBBIIiii" + keys = [ + "m_Version", + "m_Level", + "m_TypeFlags", + "m_TypeStrOffset", + "m_NameStrOffset", + "m_ByteSize", + "m_Index", + "m_MetaFlag", + ] + if version >= 19: + struct_type += "Q" + keys.append("m_RefTypeHash") + + return Struct(struct_type), keys diff --git a/UnityPy/resources/uncompressed.tpk b/UnityPy/resources/uncompressed.tpk index 5128be38c63ae9f67cdcf2d2e55e5fb69babd169..e939fa13c923616b7378aa132b908921a3752f2b 100644 GIT binary patch literal 1293843 zcmZUc1$Y)$_Qt<2PDlbIL`Y~zh!O|^;)Hw h7w>ZL|)x3-n7ZC$o5K%Kg7-DTUR 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 z

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


og?q1tPbr*7Rd?C}Q zkR#zjE;0WiTL$XE{(hl(X%rg->9E)IgCm=R!lxMpRu~kidH~$o-8roC8v*s>QGZz;DtIcc78Rkq>P8hInSJLE-)9Gi_GiI8_XMNRvQv+@-Jcq zs=YS*P|A+lKgsmBNy#PT0x_LsY7JR2vQ%;ubclkKFep-~b!YyR>Zof=nftr?opf?8 zkV;GogJjiNC!^aJc)bq^~ZxB}oNjj5QH@T}WI15!pQNA(JWn97KP-cfLT z6!ZxLp3McW`qo$Xm=Bl_nybx+%!keURA#&(3lx6w0EUF31q#0m0N}8qJR9UEUUzUC z#Zd#oB|GYbD98?j7)^8hc*gls^AC)I6T_e@{mG-3*FX5<67D4Q9`j!FKJ$KarMb#{ z#C+6z%zWH@!hF(PqMkCJHlHz{HP_G_*L~T?OWcBb%uKS!zbABP=H*wE{@Zn0$J94c zxMf`!9Ap4Ts26FuI9LZCf`T-1`hq8WymOd)eyf0+2HPtu{@Fq z#0htj!PR-ee97Fd{%gK$zGA*glgE%4pTb2&>ZzfAd2V|K?i8f4LNpvVp(ugocENJG zfx*g?d?)%ZlRn}0Ce2ITqBxT(_p=9X%e-OMn9Ee;u?7vsh>?4-jbP zmJa9hf%zdV+{^s(T2!%BJ|Z+S9+gK?fg0tvy=(ds&xUMm%89pX+~ePODaZHB_sx&Z zPs~rv&&+zNBCL8OB~OLlH#cbcN|NSGDfsa}E^RsO5XPA#P(POABkxV-iNg!m8iyr z^J}h7q3-DU59ep89p+ARSI{%uVwS7jq|V9VFxjQQoA^hLrY}o7HIq0*8IBXL2z4-u%J*(cEwTWF9aNnm^OhCUof682vmd z6u587vr_+{G3Y{6W!`i9jVyMqZZm?0`khQOMc2YJ&3R!^L{og5>dQ5t0^Diu)F_%{ zPS&G2kl;pty1Vc3SL$ojALc*iVKXAmC&ba)_pac5 z>LMMNNCR(xQ5T16GgDm}2J|Xk6kM%Wd9X-rs#JAMpe%(y&((2wY}!uivn1HYa8IVc2|*@KU}ke_i4yfXN|81X+3De9}U z!+JQh0th5xiMe4w2Z&)1*qC-V>l_+rbsqdbLT_v_;31Zs1$x-zjUB9%P$N@%Qzcue z)X4L7BNH@KN6S$Q!U{a4W;ZH)%CuVTU$Ek^tJMVekaidbJY##rPP-h*th}Q z)#_%=RX5iCU=cZPcNFQR=wfxZVpi8+T{tT~{OUnnK@ZF3M-p zJcu1@wYQS2Qrl-HQqYSI-NfE_hPga6KQ1@m_u^&JL;uy zqd2sv;vnhv9{L}N>gD)EuY_eB^=cHn76t|Cb*(vN%FXgd6jVpSn;JNr#8EZjOda)B z7|^SDItizsQr1Sn+flGC3>@`NIMZbHuAaP5mj2$%dv(G0>w+J|Lwb2HTnN3R7X=@O zL8AI3+75~8(6%5yGO z_$ms%4g*Jh6V5b|R#cJxov6NxN8d*g9aM#La@3Dukf`=Y6D6vj;?aS4bTA(M97T@$ zC0w4Pe)WMHi5yxZc^34+?@{na7~D#KvN=pLZYQk)-~1)Yp%7(y573My3tx} z-DKTtEwOH~mRh%3w^_@q+pRmSJFVr`3hOTGZtEWFUh6*Veru(*%6hsf1!^&Cz17SYkf^A;abykJGd6R;Gj zTQsI!!q@f^lN!&>ox0j>kTU+#%H)uk(g?#vqrs|(4YQ`LXs7e1J0l7BK4`YENY-H!CW;%aLKyMz=pMe#s`{8lPf35X4Wy3;&HEP3v z0u`q+vjs_TF-DBhOJ=d!=Cm@Z@51Z0*$TJ+L zHfZ>#(>&isl#2cpsH7-3E((&PphFa-L_um4bkxA%Vvixc15LwTw%OWZZMC*p+pRCG z9o9~37tJp^h4trIL0S|=vT9OCMqgTctX2Qxe)T>wTNhmh=|!K2Cr$JrgKJ5i;CI(; z#Wf-j3xicgk8qsiU4U-%acTebloDC$TkAXPd-|$)XcyX4-&jA?H4pod7WG}Vc2%t1 ze%i|DNg23K5Xdu8WrQW!e7)n*@ljMy^$FLc7k&Rf;7GPQX#H&cV*Of|hQE>h(!)9a zPOJA&bMt2ld5QnE^^)ti#q3igPTKEfUqUiyG_>t{c72;) zL1NJvBFbm~b&18)nR+qf+1Ux#E2i?JU~m}Z(VtGRD7KPYTqC=&-NbGRjabaPa8AOs zF&ZxtQ-$HICmKcC_@tiy-dRiy4a>z;NfeYu!LTS89tJ$6<((;aWT6d#mUb(qU5#uZ#Gb6uUBSmqf1g@wA^E zh^)sFrs`y;*&``Y%!RD18x(l6JJs%JcgEwuzI;70i~opTyz~pC^z<*LP6`9wu(9a@ z73j8DJvA;0#z(1n^=iWp+^Gw)LoyMS~*UyF12RWUDT!4wg2{@s_qAl zx-Oh|OwEphIbl$s=7#&l+4Ou2byM!CRf;AfGJM@&`Y=`VsNin&-(JD&Lb7~3!=7lfK#~Z^ih>^|tDF5YI0HBGtyD|GkiTWI zQr!{{Z=!i*AVym1Z2KJh+`6LVB#JDHb!34$lc{ulz9^*!hCCN0(C-D%DN{J{`81T> zN;N~pSx%8--WCSDljO%TdTy&J_Eh@<`$BuKS{}dJY^qjh=_=0FptG&JqUcVUIdgop z)W!BR`;t(N3G+eXrKI#7;pCUmNON!4ioAqKR`#$p0i}k$Sl92Ql?XI15KT8U>Gq!98R%o)6Kigj*^>U13kRue7hSuePtT zXV^3CS@yMdm3^H(J7hhyFt zag6q_LcT@smxV!wdftzIMk@P(`#N$=y%3g*sTaebNc{(ZjX??d`$I*vNyMcE5WN@f zZxOoA{T$hl#Myuh>Z`@}P4><968jc=XQC)Kk>U z-t}wAh&Pws)1!~WfTjz+pYop!J`5+J^SUVbI1FOylPLH!42slee#cd*!6+3|>%)@4 zZA$3ls0~qxjbRW|pGU!_FmPxG%JVnmNtN6Z1zV$FTNo6m?b>q4q(FTU2Jc%RSQYfh z^*CCXt+Ai8pSNGIU$p;YzhwW{e%XG-e${@>e%*e+uEKtAes&GxHZhwTqFVu5+f5GzyOKrEmuy@qecXv|X{aH5{lI*g-BqaiV!S7b_ zyl|%a(EiB&*#5-+)c(v~Z*Q-87oO2F{5fh3LQB0^9F=O_tnwjqD?wJEz z@B4nw_x%5RA1?Ci>gww1>Nwq1@0OO7K2ozbTf=Ns_)V_CuYw3zJUhQqZ$8e4WhI4_ zZi%X7%W&NPL)L6P{HX%}Fd$YN9!HdN&i{;tMqs2pAzVlaR^dV3)Sdh8TEtJWx@+`a`E+0Cj-s#pTdEb!R0CHC7lv8 z7fmUl9$Lw4>Y=p?v{8Y!DzKIcv{Qk#WuPVgvv;Zk8Z~3(nYyLhx}&?gr(XzVod|_f zy!gVlN+cc=BPX)Nty#~D{*6l}#We9_tSnK8=YrC-8bU`IsK;YPg+j5S_LxrB6_S=s zN4bjL1Y_4V)tl*L6wUR2N-gx?(Io10GL64WEp^H&d~}aTxz%TDfQ;%p$wJmcXBk)* z|JgYel5No&ppD*EUrRT2B2au$q>1%-L?|htrfpE7k)77g_+w8Y)K#M*ZZRoq0FEG2FL&o z1}achfq^p60E1M3Z}LbgX?IBfq)#CO_5Rv6vW^C!c-(Uq(b2ukA)Ka0dJJGNHUd*E zLIv1XAFPXw5P{QS2sXmDa^~&y&E(831_kM(Z=r9gZ>5L&0DWt{s&AujpT}+oWY>OE6L&rSGBdiAozOD{UDJ z$K%&r+8vOm(6aHGb1Lkr57&3och^VgqxJV;FMV%)DIStbq~tm&k4$ue*ntLs_yD{L zdzNUZpg+;C3Zpp?5)#5*as~ImfA+wH0{*F`mp}H?Z_@VH575WxM6g~;Ku5J{;`W7o z#Ab@S>E4(_2p<@aP#AYgrv#xwt7fqJ)^U&>Lc~42NTP+n==r zff^j4k16rsj%ns99LRK`g-8hdqBugcm~fbWq<)lsG|nM3qAJNcPo4?~ln%~T+k`{1 z;F!{(ScA%s6kl}9JJLfh&vQ9n~ZOFvsbM?U}$cm*qr zEh~i6WUh74ATpo#w?>9fd&Ccb4z>wQ`n?91={D>y zs~R6r@j`0U1WO8M;<>4y0}U?Mk1a_qPFy%$ujv!?GxYQIi}XwMOZBPxH2n%abCqDc zK0R+fnxW4SzB@<7&eV^=#u20?p|4ay4Iw*y+=L|f%anSJp6hI77M6OhT(jBw1UwoR zN+lglz_Vfn3gLX&bV57_mrS-EE|h^PT*QW=Sj;M1tO8S1;1UjmlnFmI$xQ3vG8LGr z0@Gvw@1V;qUWLnfDUoDVxPk*wvGp)r=1~tbRA8nGT*-lm2R=XIKvYVIN6?bSLbyf+ z=BU726}VOgs&Jhw`s{2ceOP})e^h@g&ki5QJ~m6Xh$nCzcfDLlJ=`Dz7%)vPb)EEk zBGolBk;UM2cpA&QiI<0{2G8hKxS4Y!LYRc5k^PzY-!+If4>VWJ(dX*d>euPl>o@2( z>Nn{(>$m8)>bL2)>v!mP>UZgP>-XsQ>i6mQ>ksG;>JRDj^e6TC`cwL|`g6L%vi*O_ z4nKOy8VT_nUuoRiRp1U4xKjo0Qh~cw;2ssYR|THt#vY>jaG!FYN^!pmJivh{3qH8w z0I|ScIA3OpFR)aKhgIM?^;F^!mEutuz~@%78PI{djm6XICZy#GElZc8d8X1}3c!=H z$*h`iuHY`pfz&`a=Cx{WX1&{<{8# z{-*wx{hu9RtTX ze#HsDmpu5kPUab))QjX=)xqm3&8XrV`TQo7-i&BTl1RqOu)8QLp(TZ3c#0>i zEYW6?dL-GX$NsJVql2Lt1*2$`4Bb#jtPH_a9ABspCKgZoZR&#xtRdi~E@fgN*TT=) z@0F3*4-pQD%cQ)2D z);BhYnpGg8X06Yw*oIiKZ{><@WGux3h0J6%EsVCtT1Gpgqp^;$uCcL7Vr2+ISSgDg z!ml!bp9;ARV+r*2^LGw}1PE>g;tsZ?@Jk|E(!<%&PTV)nD|9t(D|9ou8$FDkhC)h5 zJ9%V($d#pqUfLPIz%K=oF6b3Q%;gJQEdDLaD+FkWzp`c5$m0&AlSs^qAoUBLRGM3`KsW^K&YO7TC!{y!Oa*PNjD@jV0 z<8FBzcSnxCT)`1WS*{OFj;S#ZH%6)i1~+F)^q?X$Tv7<3iL5bn7^4EsRG_&Ew2*-+ z)bZx0iet}jsRFH3ptTCLQGvE9u$Bt6<3LEohOo9QSb+Z&`VB2a_cTTudl`Eh`xyHg z`x*Ni2N+|F1C4`>gN;LsLk%TEuo`lF=q4+e9&dG0q4i|jFW}+U7I|BUqp-m`%bAZh zLa3MPMBl%Jhb%=5>3$U)Yg_>vMp=`AltnDZk9Bf(^gpQrU1UHJm(JqG8YdXzj7Rf? zJ`si9NEZ4egu2Sm$N1?{8k{WTdW3PLag1@CalCP|aY|m7I29Rn(oL4P z1O8KJWVw$t7~>6vAnhZRs5o+tzcZ#@nsePaTiDB(8|Rn+m!xbQp+TD-W;iK8klNU|g+c?L#2n(pd#mIAtafv}!IocvaVO&@8=@92=1(zAZ+rwC1s#!-YNBV>kmoqI& zNED3xv5;v7eiCO*1y%?CaWW>%)LJGcbjN!wBt|cM=1$4N18oBZP7}pgu+*^V`FI~cOuW=um#?X9t7>6Z`*(nd+8s$42Ypda(8r_0o ztUD^uIyOP>;qNHYc4N~RxK_Nbs#p5QjK_^9jALM)aU43Z9}6eI zIC#=H32z^k;MkNw3#|8=W<3?N<_;*7kQq>F2*zC!#is#ff(o3W0uyCm5IR6+eFb@x z;9282<9TC&p~JF16m6<6x2X^@9G&~I zr3(EsZtokC3TTMb=q#2EN9^M7C&p*SJa`g5H;(Ym_y=d8&-g3>wDMuoY8u~EfU8(# z;i@dHF=*vE&G_5+2fbBLaz|uJ+-rd4vjm|OaeXBOEEM5os0QKfWC4n1$$TICUALGw zu{Yr-_!)kImGCS42D&LUEG5(R0>kv+J=OyW)W9@xrNf$yAo`9lSOvCMfgMy}s0!>T z14H!f@Dw*v1eH<(*YwP?>6=6FK3XFQJ2jTDbAG}?*d?)A;Zx8cykM8CGPHT5CEIk& zz^s@}%%)~Dv#jw!RI8DVcG0?PJv3MISf~|(UFfOx(t2x~YJD&$cRzGtzc~i;ZecEi z*6ikEtYd1IDqanXm5UXn-@8~{5`n&o)#!3!Y$H>_GBGHNR?*hgnwxcIOLLIc%2bFQ z?BZFncKF$>GjgM1kRuz=X(ruHqeS60c@b@n;1GthCW(3t9w}VKYyl<_ubr?1q><@q zq`)P{?sBFOMsQ#-QQ(C;rr(%L(?TcownO!$aTOUifwj%X0@}AXJD45Kbwp#OEabg= zT{PC+WY(R`88C`NHIjK(gJQx{X*!mM5H0`PnVrq`Oht^!YQ+$G3=?95tPu4kI-KV^ zz(UcPuPg$3bTT(IH!{)Tyew>>#*5c6Ui>CzqY>k~nElm=@m)OeF$5 zGmSV|iqIaS0-Pcu{!F(kXNyjFslyI91g=J?geJkKK% z!L2>L1YShy=BVU=Is&Z-OBvO$VA3wj43e_8GE83hPeiD-6n>)Rua-M*HS`GRO_la z&>UpuMz!7s`;HP4d0VrVhC!faDZ*frVpeBD!wxZX15|H^JjaV8vj*FnVz_6Nmz`B~ z!6?W%M;Kio4fiZi=Y)G6YVK$b%dgu`*}CnVt=le9-7?{xcg?TcaO9~(nB5H_CBp1( zSlu+Jaa4hLfszSo{EsoxR6@R15__W9zdM-EXuF#u%sBS%DDxw&k=Va+6AObQH5@G` z_RK0_bXEy_j29%{w`c1M|VfL);h#Q?h!oCesH;55Ll0N;QE$k13- zG#jP^NCO;h9$_A79%T|qzm$Xy)6&FD0Noc2ihe6RnMqkv4BTVQ+yJ@Lj5JXUSBoOW zA#T!ewH!*r)p95eSIeO^TrG#vaJ3vt!_{&q4Oh#dG+b>2(N~rVbG&)FSu-b?XP6VsGtINiv(0nNN#?ocdFEvEeDebHLh~Z?VsnaliFv6> zQE7$On&~F80Wtw=srOK*dJE#w3IB=@Em(xqxoZs~ikz)fJD<4x2^_^RPmUZ6WWi;rUWG@ zT{3*+J$O}vKI}CJSObBSZO58S5lC&r%WQ< z5R2ivzdRx_NSUy`6V|KLf$5mzSzJgeLCT&p#Smn?qo*Or66oN(5M&F?7fdmPSWWzT zmw#OTy!oOj#~s5=J~nY4c}(0$c(40Sz47o~uV77;@Lmf|C0rLXkg3=;wBoB~qw%~b zNsQ-}sDwgx2?t~BaD9ga;M4lFow;o zbf5_k!hsB+^Ed!{xhagbMZB!?j=9*}Uq2`xJ~$sfBp*IBA3iJ}K0F^jA|F07A3iD{ zJ~|(kmfLCNr6qR?OUv#QmX_WrEG@rNSXzRou(S+MVQDFz!qRd)g{38V3QNoK6qc6e zDJ(6|Q&?J}r?9k4Phn}Pp2E^{J%yzudkRa-_7s+u?kOxS-x<6gn!8}%9dRIj*IZ)0 zXTEPPH9s&vG(R#wHa{_!nV*`UnV*}>%`eO^&9BU_&2P+a%@yW%=J)0g=8xu2=FjFY z=1TKd^EXpr*#Z7rh7>Q4CJXB6(O(md3E25bY-ORoCIQ7lNP~ez{6aW}^?B_7_zU4! z4n!1Hdx;L8ipON8+GB+vqd#MJf%H1uBb9b#qD`$CFhMS+nN@`|c(tN}s`%)b=_({7gfr#x@HVSxBf0)0T3PtggqMX}G-z$L zgR|4M9@UK2KsuZwv#-NP$U--Xj}*>TA$02~XA5Dn3@CAIj=}D>RT7HlZ}T5>pc0G+ zEX^udMN16IQ?hhx7a=H*VVRa?*_LCumS>eM-wLdXl?Li*VvYHip?aEIEKpAxrl*Bf zXSKB2SZTPPw$@r!8nUOIwYJsX>R`=ILiZ>Y-k1mO`Jb*XMb8m72;#c?izifWS=Q0kwVA_%PsmQ6n`~m`Jcf^ zGcg%0wW+rv4@=+?6ZC-dv;9qo4}UfEHYux$h%Q6lM)79!`Wx~SH zaZFw|Ia3QPabql>gvVdH6m29t41H~)@C?Gu0P$*P9kLTb^QbECZRNy+VJfG@D!Mly zQ4(=zhPY4$TFELR1Bt`3^tJj~VrUk;+b<7~I*xO~oEksx=QdAGu({RW5;s362;DT< z0tf7i_`nxQx22`X;U_U&R4G2jxGr1aAbhc!zmr@Krl~Zn$N)i+K;n;$+gQcYDq?l8Z;~<@ z1<)9r@??EGCSGNvjVwtOc^#VYs?qm-R{ehrF>u8kjR=K7lFkHFk{yvmnCa+>XS>oI zEyqiXhY!;jWmNcQ#Y=>%{RkCcM{8J~5$%LVFh$P1vy~~iU1=9<7>d(9ts2{G(ootV zKkP)Bw3|>BWI@*q){mkzC?OWuSusUl5Uza1t*t~rU;?l>2qP_pfS!@XAreMfVvq#E zoWuwM5}Za55Mbd}A0RBd>_?!K+;-XlxvhmnwgF{r4$H9lx} z=JpfY_ny{Pr7*{B{%C72D|VZ|kF~EQyUpLv+TWs~kyvk+vR(%*?!RYBKJUAt+{l+E z88%$7u`|~#zL+R^!0&)&N;l;t5BLns@qmA@b%f)rj-?qp&c=`TWt=Ai>!?h%0;1*}IgmTF>prTE|(n#yqzlk3uM(+sC2} z3hu^f1SQqZ5pTmXg^k1PiVyb_u@0#ZcS%&yAv-28zT%yKYzVsZpZZ_Ne`;_l@_Z2O zg<2^x7=kkH)=#m>-TG-(gO%%UeLTvlxLZHn%6LLQ#yY_|8$F?)WSwlqp3rL+c|sSR zhYPZ=#(DS|mf}2|Ek~xp5!M82qMA%T8sY@<5+qIKw518rzmPQHi(a=SRoBB6GGz$U zWq^EH?-6Mi|BpUEh`y{RS$V#!&$Z68a{O6Gb+X8#^*PpErODRQ*ivjxsnNa0vw5QO zOrJ(`T7XW)n$48OQ+!s_@cw-1B5Og`oplM_S;q;YtLdnX*cH;$)wBRB-j~y*sq6*# z66;cH4g4?Dj3s&m&d(BVoL`y(SCI%0jbM z2t$|ixdrG~g}EwltqNSnfsnFXh0Q4#0S)h0SktW;)=cY4>niJN>l#ZTu|OqIyfmlU z%Bs2%Kh1fq5|iR;5B5SiHT+W(zrU^C>o8>Oq%C z1V0z?l;1b=Iq4R0Jku?i8Ec0zLf#drV)pz+xP$!QQ*<64BUhngq?i)t?6;=32UD9q&44q z$|9n5Fn=PyiESz-llRZfFu8z#YT}|5@DgYv4nn8ldjyt9E{tan*|gU`3|G%V;Tg@q!}hUa{^# zMF`_J>o-&31#6+2NN<-2Mh{}VQHVLV()}v%fC@Y)166oPZni2s%z-dwIuG|taTC$M zv6M$-9y&ZK10g&n1NY)Ts|k;qI1e|#2KplFb?Xi5P3tY|ZR;ItvGuOC#G(wsZlxUc z^?cHLcv3E`9_FjSQ!4PZ3Ou6%&&og*o>SHGyi8FK3sm3*8F&I6-wAV)152$BtPib^ ztdFfvtYy}x)@Rn|7I`(xEJPniM#7H1h_m~0>kErufmVYr(6nA*rbT^9gA>tAUX|sj zhu2hKkqW%70&l3mn=0^@3cRfX@2J3H6?j(#mZ-pcD)7DvELDLIRNzAu_(%mlR)J4c zV3`Vhssf*>z~?HkTm`;RfiGo%LKhv8^dtPMEqr5rYpt-pv%a@}uzs|DvVOLHu~u5Y zTEAJpTYp%8T7Ox8TmM*KYj(jd+9g}J4coMHjwmhLgN4j;kTqJ4ZKDS#R(?DUgz&8j ztWbgPRN#9R_(27JRDqvlfLy)NO9T{xLbzHP>2bby`cUmDXBoqqWu6(!Rza zc&C&Qy++ucUABEYuq$>GyQ$qwtUK|dV~FNh_peyp3DlqkLMvtHMC)agN*JTrx@anV zZ8>(G-O^SF=va#-)x&SBPFMi`>e11hGOYd~13LUE16BBok3kU+bh)Gg|EK_ZdqZ0K z6aDG|!z1H=aiFH@233ltSp2cj2{p~ggPRsigD5F`h<|__$q72a+1y^&?qqki3x<`S zFbK+#1WAGMX@j4If-F?YLQS$z(=6013pH1v_UN>WRgG!}?a`H(0<=_tRw~e11=^@U zTNPMK1=^{=+A7dq1v;oeM-^B{1=dx8PBPF2I?JZh2G-+1ND3m)d|Tt+WDGSxw<8S5!EKkrC*<}3ptbddoK z9WM%f#fHAddiMJEHukpmV0(zYoxQzX58dQE_0U}fdZ<8873d`cA@r7kDr_pZWLKjr zIv?RJ>7ZnN^r7~S_Aq-VduMwW`#Nn`oDF!yYb3>A!RRa2C++*~p`UC^?O`(&*jxqr z%K%30kcF;?EmdGE6$oXZ4GfU$*~jQ3O6*}hce8i5N7y6nQT878p7v;aFMDr$9~`|V zh|eL?s%>p-EpjLzhyCoTQO$z3F{m+X8)ytP=vr*jafrznEOJ|sNm^tGgXL<4Fhm8m zQ-SSepdKET7x7he;YP*NpAi4RHpVt$@fON-kbSUyh<&Jin0>f?1j@IeIQymYVHasE zVdMOSD(om1J`}yo2|WWts~AVwN888P$J!z-$%*@jo#f2JjA3GCgJ(Y89*a`%A||F% z{IL!#)v$4 zBzl><9IKSr0a1@Z>K?F1%9)lZbQawMovHESQgC!0xK|#ycOJM;7OaPTWj)lxek!oP z42&{H8H3V#P`B!%kGD^^YxV^D40|GK>rDGB`)r$>#bqin2K~q7fCp#61B?R<;nb>x zGE#f6ff_Vk%V8@sK&mfg-?+iq`nushm2*u(98?fvZo>;vs1?c?kd?33+N z?bGZA`y6|+ommUT0iiN$p%~6t`dnaNn7{O437J`jC1hrqI3Z`sxX8X3r;I7~CCQYL zGYZFfa|gT2)@-ngIphp>)A9zpX?cTJ%pzx4nZCMVCC-^MtgwX4uo5Taj3P7bEA6Xr z6v-JQ;-p5#h?rr{2oUF*6^#Hnoqbwfsc8%@mJz_!n(~j+Di%hht>m4LCkK3LIxh{#`ICuehlr z#&pVd2kzjG<%2GQ8r*3gjaivKBD&k`yYe#MjhT;+Fl?C0$T_6zolwvwnrnsgAJJJXL`p+vv448ac;X^KUu$+`2p zP*fikOXmElJp)}_GTTK^gV#`fIkALt;{?5KHyS4>P7;*PihL85uEYs?%eLWcxr^ep zUl~vW@>uYO{kDAx`Z%XBJnz_x?M#)&>+j}Oc?ni|9~McLgwo(W+=NV$i(|2Ql8;sN ziF=X#zP;2|5{eMRRXCTmalG)w3&=7@ynrkNVtAYo@F%zw)go6*t?&j1nGpVo0YRNw zSiu(j)c(vCJ<-%ENcp*)2@12^UPVxtFR(?FpfF$JmT~pBxWC4X=X2|c1pNkA))#P1 zP_5AXFI0gv>Q6#(5vK?VsYkb?Wa@GMiGV38aES_BDgz<9A(eQ9FqH!#@)Y$Q$B2{s z!_ojE`G+MyihE;W1N?6PAsHEtI|ca7{u4DL#J#bwCV!!3gt#}vjRmP8|F$)Nb(49N zoS%PWe{6qZUypHbmf0-k%|rTE_P6#882jdCeTDs<{k{Ez{iFSp{j>dxO>u8l+P~U= z+yB@K+YWeM_}?)MapYH2dASOtVQ8>2fPLT!l|l&rLX{8UY#gwXHjV)ykRbt5fS4GV z&g~=`;3;AZDUa+Vw2+IXdT6H3&W5_k?pjnN&UQ&B6>uvm67abtWZ z6E}w4dZA!11*hnUQDZ1(Ov#a>#^}y_y5YD^pt5R1U*7&>CP&L3Y13OcN&-dEcq*YK zg<~Dl55(E{DhermAkGqDd@Q+n>tUu0C^1xMT|wbh>YSF2k`#wmp#&BoC7BoL!fP5K zB>^cy%EF{J2}Db#zm*6iEVM^Ll3v)7BYz~xbYUw_$V6qBXsA&c2Emo+XEHHd@p2yy z#C$MBCDW2e36GHK{k%d4M~tJ;(NRcA?^&WM_QYgHKnd`tL{3OQ@P46pa+E~+z)Nr@ z;=x3tzZy}1bUzT?7G5p4Y89^G<%d+h;=-SrnSA@#I~zJmQYrH8PYGptTb;^0(ipD# z&L^1(4)OLP884p^LYS=rb7Y_jsV9086~~jgT=)dIRt2u(Ku9Et>v_6oBl@cE>U49u zJF>_69!^iEm($zH_^odt`K@1dRt(7|SB4zS3$AW4?vL@BajenTdDzN0nUCF;vhj|a zcti2t(tV}eI9Z$Hc&9jr@9#9~9KN5knRBwSMc%-7EddlSvyeL;rRa#Yhj3!K9TFM-7JsbOA5>! zlZ}9AtJ`y1O%h{U-QH0guBTi2)a`l|Zjnct{|7Wa%sHZXWbvrt(Zyqm#}&jts(ZLE|-Zg1ypE z5>x-!A>7MGlvpxy4^8h+afw2J5xIxn-)Yo2^Z~f=QJh1MaoS)cV#rDXMV4O7Q>(Lga<_As*%c{TqQD*zFuv$|EYpqcZRip0FmXY084pDx4#nBb}qf zB^@Qu3G2~Vvj>?m6R5#4ShJyOnUBjww1+3ym-kqzA$W-@Ild=Ak9=4k=N#{h%`5c; zEcG$D)NzjDjarYqQ6KA^=rrSwpJ{nnOP%&ig#(>~oP(W1oI{<%oY-6RNlxr7dZ5FW zkVz(T2;Vrl=)0LR;4Czc*-Z3&6cm@qO;_VG`BdjLC)am#1J+&f-8|k=yd=|Zznyuy zlX29%I)Bkrs(9itiCTFmOvsjbhFT_hW}fJ5WKP4rK^lnL6|>WaWRWMP(J9JV$WwWj zdN%guCz+w32JxqOWM+${*yZv$&LpRs>a>|Iz#XI=tWn~Xf*bA{i8KSbKF8aI3cx5G z>E{`wDZpgsd`Slph!N~j-e;K2kriP?C4`<=p%9~aB)tc@|Ewdb*4F&=T-0uEbJ-9Ca&Og zC&Z8*Qf)#UPZZz{mEuhmcuNLemt`|hwm$lm&Q;FU&NX?G%|gi*$&$@>UX_^?k;zPF zPG0u8n0=v~{aR-}iX_Yg=@HNj=Q=bhC7IUlln}x@a#iYKi3+@@0`IH9QWf|>2CDEO z?*(WFbT;vk3Vf^rpQykx75G#IK2w3uRbaUae8GW`1Y3+zRo2G8sk7H8c*sr8&CV^( ztcO~CiY59uKs&0ysI<`L&n=X>MF#u9$YPgr4mXC&8viE|Mia~^k|Kt@03(|?aq zIQaRWSo8|x_dG`R@P}HvKV{%IH1xh$bTXh8;VI{7=NZY+F_lJ;XPuSCuiVh1EYCSB z&~rde1y<6F75pV!HTVWU>S(6awdQumMJHGV|**-G-00eq%+@n-dX6piab^rhM7~16^5A)Tluh^4?B7A_l9fcHl@A> zU%%eLK_{J9BAqREFr%z43YHr2yLI&!gP6j+^De|G#qzD`WYaQNq zmO4wd51bECjN#Ek>!j^zxwV$ePgk#9>NvYgE#KB`5`BeCc$DB{=M!g{^J$)4eulbe zBMO6GA)VI9K#)&^<&I~zlBvFMe3_~U?>QeiUm|5$ru@pO#|4!np}hvJ^ey(7_A;jx zC~OB6s>fGs67zbDp&)tm-uVVdq!pD^2kW%r;x8 z1L0iv!D3j=n4sMnF8}^SJ#^xFz)IscQ0G@vGP4P+b~-;a9*OC1HB*4qTot(v>&Y!= z!zL=wMFuuj+qU2q-JB(D$;H5`yiVAR8t4cO=l2OBXfaM6-SY>Q?~NXfCG>18VbjJE z`s63{GJBgHB0=!~Xx?yL&#i}+@`%t4t2{ELGQe_e*Ky0P?=H(T>j3N7Rjzu)-B9hk zIH0;sT+ghRDVw@0aE{9v-E(x@91HrL_l-!x7H&VeAPwrUkiK#uE!~yImNK-$*+R|O z8Z-8nsoEff@jvj#=gKxN-s6{TWB_tfX6bhB$9bw+8*32C{MsYGfigcG2C2X{GEfiO zs=#0s7@`8($-pSQ3$;_)%r>qqmN^~Wb=-B`PHty+J$L;)JKq3nP?c*?kJ{Z{hF0L% zx`PaTW3M!Z%FqfNxaX+LxgBLG>tUD*?4$xatH3TQu&W9Tmw_tmW>O3DS+NScb0EY7 z*j%ud8sNrup3}^2<+gR#ayz&ix*NG0yPLRO+^%jnx4YZJ?dkS%d%K&ueb9h5XfGojAuw83&mMXF&==lA*+#v9hEg#tBIl4Y8yl93cZ$I8v_50ZCoxq!H^v z?)nG1JG#T%o!p(>UEE#W;d!;$4QsPMuMOtYV0U*FO1e zH8?~P86gt+P!#!CE=)vs7z%TyT(%Bp$v{1vtpexBz(g!w+L|2U9_b$C9v#UgB;aYR zBp1YT9gA|E!R10wgX2)HNpc}NoGSzMaGnZGmVqjq&+Io=;{;hxCLHgM#cA;bcbt2o zds0@7CrjccYCHwSt#NT9HJ*yl1ssZMKnwSaWr%iMQ)CG*5(L6*1sLz1E|nR9)1ih1 zTqtv!fGV0Mb3^Z5GR5Fc|}}^MO-5Dy9hOMrCgILT*WN_#RWKBD6vK( z*lBKqdxm>4TEP@|k#&jNr!$jKF0K4FM)zmuf|*#OPg%h?G<3hiw!uk0Lc#%Wa?zw1uWmtgR?q&u}Sv7dU4dEWfjd%et|Myh$ z8sH-rb}hJdajoLng(uv3?z+WJ#pm2jioJ@@yM2m%i~Wk575f)obYF6n%*{~mYmyB= zSIa`QgZr{QWH#KNf*nwW^psR|pikoCmxl*rl~>_G4kQ#0sldY=2#F+wM`U@b@F=H< zc%bhdnIf}k+1$$Aw7iR(md9Bmkb*T>;$jRr8KTEU^Rm#BS!jM1dMXP&orRuJp=ZtK zQuR_L>)?5nrVbWlp%=2yi&^L;6$;^HS%o3IA_Ie9VR|Ce0s9*ZC{PEls@w*_Yx%TQ zSj3wyq-rS_SEitW$2TGux_>8*@?UjdbGI!HE)FSfSDb?Tu|@9d?y8;Tzu~^=jw~99 z!~D10x81eY&}sfVZr;5r@nX-vyC3OTi(T1yetNCvJ@C5; z%>CS5?tbBZ>3-#Y?SA8a>#lGcakbwgxqtP)t1xk9qILttO@5PPWTN@(&f;CgyNjxu z{2yE;3xzRioVbcnfoQCxKhduW9g7O^2B!##B;%c2_LBay`(E+=;?m*=#b4Z&u0mXq zT$#(HA4l%Y+rgWxN5*3~Egr~ka0e_J5dupvru4hpi09xxaKu+U2mk42JO}^f#-4*4 zbqf2p+lW)xIH3+c;OE6Pk}3e^CzVfg6AjIi{iG&IC143N;4QgRH{-rI6Iwa|D0!-* zPF_Zu6vEr`NTPTNOfOfzioOD4cY?!o)9Zmw1v4%MDR65Z*%~+%d>kf8_a3aP7xFa-bJJPxJstWaOD7(FHkulnL+}fUFU6 z9k(s!ARDStxIXsgnfaOvygYAn!g4e2OtH7QEV1Cfh>B4B7o`yQUz9@Je^Cl?|3xXp z{THQBv*

L7)htB~Noh^RpHU&H|JzlZ_ce-Q(?{~`u(|3wVo{)-sE{TDHS`!8Yu z_g};S?!Slu+GY$?NQ`=dJH;;MIE@dK-Be|3&|XNyanL#@;4g z?3pOX1H^jhG^mRwIt^MZcL8$eLjgsSPUA-YILMt(H&1lvlkrfKmYUVoe3SI^HuE<3`g>!H582#A4C0gKF~&!E z;Kx~ze3S^T8p&(SBzsHmJbNqeTs!m>FA!_-(Mk0M(benj#hyxfda}2^T5xtpyF~O_2iQ0cw#>HOphrSa#uk@qoyR zg!jcUKmpy7la4U5k{!IE*g?LQl~Ir1AxoGX4?y@IRrp3;XMKSOKTQ&f8ZCNu^oDsm zc{_W;HaG5D(_t6SgXQu{Vpp#YzLlW>x8W;PF}{<5Dts@C@j0doA0*Pdox{D|yxqMK z-bha&pmN4&sCmeo`C#q7rG1{)G4k zx4}R2f@*}5>CC|=yMlJ>VXg}NBD1ZBl`8P73{>GdUNDu5z2G-)ehKiq3jCo0f2zP= zD)6@o{G$RG8xG6krc(t?1qvJpNiq+Enlbx~a^hzUOR}H>n%4(~9LuSp<&=2l8WlSM zM+nQ3^lPfz`WX}REagn(X2{&m@)Yk8b+Ft%$~)RS#(Pvh);rES-W%(k;EnT6^iJ|l z_D=Cm^-l8|yz$=Y-WlH6d4-&Vg(&_dCgFU}Up~ZUQw3XAlH?A921Uso1_6S4w2&Mx zobO$LBiB`F-zUcl7b4`Pb&R2UD5n}DUiILsK%fE@6=)&@VWFv&jNbH7I`$6XicMi5 ze35stH^sZeyVSePo9a!IH5R*%xEwX+$Rc0i>99w7gNKUIVNVqptpa<=z$n}d(}`?k ztK=|YhBwo@(z{9$A`<;K`)U-T85aUU4X(jvYtCB<`B0~8!GVx~I*jC)*fxF7jvfEB zQK2q)TOj8yKo{tf53hwTs3Wn(n*-|uzhy;mDT#3Nv9UhzTUK&{a0@E#uJ}lti65`t z+giQNAxTjvz6sZP*Lyd3H+naDH+#2ut15;nCpW$1o109v1WxUJq+MidKkd3^e}*5>0toB(!&6Lr6&gJU|rR; zC@Q94fG*tO-RC{zJ?uT=J?cH?J?=f>&GVl0ZZbQios})ftI(P0CLWc<=Kvw#uMXB@ z+-U(t=FR-A1elD_#>wJ4^}2F|cchm(aXHsJ&y(G_O!ibaF4MhP9=URv?alG#drx^! zd(U{!dO35%XL)nP^VmSj9I@cvkLoYvkLoXCA2oK0h zhY;3Jhhc02Y`8}_MHmAcs}!54Ko=G0ssi0qpt}rgXl-P5z~W-V#PM>G_qz9n_onxj zH&P#^zl|MFa9=}mJyz;rG50n2&k_*bQhl+vfmLtOPMcVTWSj4J?|O>=nYFo@HSRiQ zq4&1_s`sJ37>~@})t8{No7cR+S%RjdFl&nq^>5hJK}$B-##gEWn2)+=YnvKPQt?6A zQY=(SDgc2!QHzbxD@ifE2fcX*j8wGP>6Oo7DtzK8Nd>IuCuq2RI13a}gR{I%8)NaA znnWxZ%8#f{S|NiqGqjngYhF?~CDzr@x+QKjh&Uh&40y0|B&J3nDn6#|;p zSkh083!o&$0#uRLMmVJ!oxPPAWhJxh7-!X4+v71j z>r*v(bWxIGrG(Z1Hp_?D76qUKmC)Kc2UIWZ)xjX%eX*!`AG?jLhJoqQiKhM%l*@iO zC?B17IiXU20~SCct1B*a}4uRFGckaLZnqF5NXPH!C+UwYsjRc?)y*^X6)Kn>cI$C%qQy&{5{sqYI*UVzj; zsd$Tw^5ep)gIFz6_Yk?J?7q%aSY)*=uT^eWUc21BtPq)4OEDRH1rsw~uQjuFklC^s zYAUQ#R+4C}U#A>e*RVsm0a3Nch6K$K28lR#VoDsW7{)p@dzLV{_IPv4q{q!hMaHW0!LGa!&PnlxM&$ zOq@7#PlSf6P?%oX(@1@2C%fhC@w&k7dGL-&8x}BUO>}72xm;h~xV%ZZSGjk2({i73 z-?BnV(`c56{A;yBUON84AD(xie=YK^rMS`3fw|E##jO#^KsOlsqv{k#T3eKvBQ0{< zigXqp?HpkoX&hs0UM5FcTZ(FAjJ85XiX*MC{A6iVq{gJuqAVfoff^xWN`51gktr#( z09%)l7|S zebR_kjM=5r(5uFf@&|^JOw&-DAROhy+spv1WbZt4=mPuX!ByCojh(S#@Fjr^?3E7S zRD=mTl*z}((DIJuVdb4fg;6r?>vu+ljb=5B7rncbyTF*d@-gakK73Ffd;rR_0jdZ^ zC231Ayu4d^_i}C++z}|n{#=SE)5x;o&!RbRwga7A%cIH%t*Il73bw$ivs58{Hy&c? z(KGROkr=I+d^z{-``A25PC!YN zyYJ)5nTzfxmUAw;pOnY%WaOt@bUy``V*AOrmy~<$ZgQ{v)N*{U{Wj+k_q6h8thRJ= zuR()UWG!yf@mQpCxBc{T=9+q~+{iWc33)uvK%UAq^@-)2d)#N1=^nRY;_+4Nv&wW8 z``~0YrH+O2rmkeg8{L?u!7VCn%4Sk|j<$Ac->i$y(RL_sqi5id zD4bWGTz;{zu<&Z(wZfu8Clp8Md>RgF1ksPgjeb=)feq^n7{`H-pejZzByu6kNgRkM z>fmHFd3zKwXO`=7c?d3o`Q;`HK-;>==Oi|$cQDPL0lH+Ly7EsM7) zFE2N8pR(6~eV=ko6^9nU#)SCuK!D#F&3Hc(UNIn}s za`6$rL$b^fuc#m^0J@?gI2JOaD=H6_ck*s?9>!T!To%=6sGSavp!q2mRUR$Z!9}W> zD_2U`9nh)pSa~<^@p63cWK3BhqqU<f*C-BU@}!Gnpd ziXyGi!NXgqLgnD$?J_$|NEkJGn6MZ#D~Ad1Hh!4!4jv{f$v;eBNy?h3_y4ttf8V0G zbwTAhnXSuhPR`o@gS?*kA*v{h@I#phSnxk2Ffkyyn2cX@7{ho0_&Czj0#KPi zr^3(W#(fegnSA{4**GyiFXs~lN~FQr&gH^Df)G8G{k5!s8vI(m1~)9p%uDjcXC%U= zB|gJ?rtpW@KI~xYPu#RjXC=qyB7cZWM0pHtiUg%%gqOfIQt3p^9P}sUqEetFSDuA!~1%KPZ;KGoClD&Df zB3X6D?F%~;h89A&Qa-s+yke!}Ev>tBe^g~~)vrz$Ce)VnS!7`19>wupUsztT_V;`buHx-KkD9aW*TXEPuef!q zFq^ex+#!@BI67WW58wiSxLe6Dt_c=*4KEHw)S#))&M1V<4n-E63clY=lm()n=+Ywr zxNr~>qWJi*B_AIx{5rp-pEqm7?AYH91sgI7|Gc!XNZ&pB#I zlO~l1!TQnrY08B^dIF@p7H4~d#@>v#_mvD~>=^ma%iH^PFh^E@0Ncv%#o2vr+8sPm zc+A9)VLk>?VeKD_S%qs=;5rq!UIs=LZxFXgB{)StRXc~7WT9KL&}~`h_AGQq7P>PF-IayzR-r1~BUii%_o~2sDsaCFJfH#(av-E8 z2;m{FA^JDYcMr3Za{6aH3$%kr^1w&4pt9z=9Y?W$e@@lOA70$8xO=g)A0N4_=hM62 z^?lQ_EZd6T{boDm#qa8O^Sk>!{GNU< zzqh}s-^cIk_wzUNH~0JdTlkHfZ1w#w7P$XT)yj)s=8%!PeBLAB_Wpgv%roKmK%jB* zDm=zbmMjwYoR7;u=BaPqyWp+;s^7@l;HEimgGKWAeXtHs$UUV~a+;T{LekaE=fxGp z?}{sn1FUU)g@|TSF}WpP)9HtGqUo_lSNqe4p{8!>w(jVz?&%i-5q3@q?P$#+lb{m= zbqrBXhuFK*{3D<3{hae5@(P-FJ`@w9KX$n(=w;jPshH^Vu#u?S>}A`IzVhJf-@QH? z<_}PxvHhnn$B0E8%vV)d2T!R`sD9B?4uixqqh0)6{rJpixUZ1KXGS6chDwx8Ou1;; zp05f2lk1iv{6_9=u7z#;?-&VN1#Il>Rv}*aEHCbnw;I|LS3`WO5MLS??JKuC)6xmU-W=g{rCu15B5okH#*mwZBeT_Rg`2+zpv62h}8@Eiw1Qi*a)tqr!E z82hcUdusdpbjj@i-zbmq5A+o#t)&=nYsNykzrqHX^cG7a7hPzF!Y;Zn5_Td)@84=` zcp`KdHnwsibhyt>gc3%Lo(LU@nUxcvqkQG|NP4~G2!DI$Xfz9jfELLtsR6xVmQZ>e zZsQF}h(|LVASeV^1`a57*ZHnkLsLKAAM5wfduG897n}*N0TKH!^|i?WUK#^=JiB>z;gW5wW!{%NSLGCN-&5Wgn-4S0(#kqWC9)sTxB>po%1YGjBX3QBRsV`>ED-<(thsX5%IG>oG>7Ru%amNcWRRi?KPYX$- zpbSVCACwSS18kGy{1g0f{&@d%{|tYkf3|;)Kgl2MC}cXs1g&6iXB~`)n-m=Dhcwv{ z*$ROWO9|V_QGy_*29y0B>3xfofuO4xJkh@pwced6hCmH2!puEc=>)`9lZosWS8B2! zM|Qi|pW-Vd82Um;?1j?v_gD0x{WyPP*aUAi;RRd#7qe;nkIccKbY>% z@Mrp0`d9h)8xI(RFq+Uq#$Xr%+W}=7k!A`|SF0iyx@XihsI{~sM3od8R~t+fo9z#i zI>IE9a1M5a5v;v|LnE`$s4TQc7TPlljaH%E(H804kd~TQVgPgfYyIo|>-`)28~vO7 zkuVDOfIVR}>;-$nKH}3xA}_!!|7Nt(-DI}6_`^|y!f|8))qblAYH+K6Akv+MMN?DP z=qV*@o&(_^I2aCrL*X!Nzauc{(&NSx#xWS%=r}kY#=;3O4kPxQ1jOLjltBw@sx{4e zDrU{?vXo#U&v*pEzb5;$VaLc^Bd7z4OIM^8SUaU4)qzH!5MJQ(HSz#7h8Ja^0aebr zKtv&02Ld!qK7dLc$v)~)p&C5sKaYF_rJAU$d;EL-`~3U;v$TiQWCO&+2DmsaG(?6M z!bK54n#Z38kNTIurDDC~`c&a1dC77bW;+CPBu&^sUnyrFLU3CUwo}i;ZnkS~g%3uVqq8Dl zBNgBQc+g#GM6roXaSPnaW-_8E!Mpwv|2_YG|Mqm!#e8T2)LBKlh`^`)56~`djC}P>J703L`RQY#;}HP)50qj=`pG}{*Ayw8EAl4nH>^y zfE$p5(D3Or7GKm^>@W2{@;~-J@jo|~`Jeiq`JemCajB3>6EbNOPUUF8yc_NTk;j)2 zhr5$PlQtIzXEj4w=riyvJO|Ii0(cn|2F+GcmY8iJI{Az%tI=6LjfWqA@~w(#V7}k@ zM~rWAK2_cUPVf~zK78jl_RZ^C$vz@Up7uY%1@j`YEj0MSe`5`e>nF6N*Lh}aR}Fsl zx4;O5!gSN9Wv;}`{dHyqQRZLqi&Wrs8Q43L3l%)v2`+xX<`brQ= z9lP?6{xAM-{$FZR5#oeQz`aJg6a<-XhgzU~CZrWYK?QMn8;BbL(h`XKs0erm7IXa} zPyjtJg16CjJ4HI8JotWsEiB9^Nm%TnCu-jes<=z&ozU0lyA-3xs8SfPijq5~$tBDa zCp5rPEJ^6g4e)^qe5?YW$Ur8jrx%oi{T)9D0^JmbsCb;I`4!Zs64bLv@D_ep+aMK$ z-O}$|%wf(fbLWmg98-(N;FipTEAc2OJ>jIG@CQ$!ui5%bN91+x@ zRUk~B#DFHx26&elV?3~hutWvklYzzZ7sC>?3EBp01?}?0SR2K7M;4>KLg*L!o84ydvOw?LAu~WMsr|sp84Qar|m~|#p zYPXB$5ygl_Xps-s<-;xW;a2%D zU#F2WSdp&giPSFi3pNWj5BdjN1X~7M1z|8C*gB{N%Cnpn$&feSZyKx{bPm=F)(_IB zIrYIt!KT5$prtuT%S5Pcf~&gKWx5^K=9?uxO1Hzt?TkiAZHpB!_^69!9Z;g+MhoL? zVt3kB997sJS=<6x$Oq>LVFONp=%Xj15PQYo8up4Ef}zMdeKIkrhEnY)_Cr9Z0NV${ z(6C4Hc{rlmDaZub-7eT!+eO<|8?No9?XHc`Mrxz9J+wWw(OP@6gGu3Tcb1t`*PP|= zg3Og5ySw5X$g30SNvau^QQDtS#!bALq9-hX;G9>S+S2SC3EwcGR#>Ryq5sWl}WY{eq3m zI@nC?1T^{7!R9KIi3F^nlD1-0q>wn{o@q^EXiJP=#g<}7rNcqN!NH;0VcOxEC^#n3 zX7iAszqWRvQ9fs|c3o>9^mEvQW z0`G3g#|~{^JNYtK8(5}N?7%5PD(6FF*&Y8*Mwc=lUB(6{1ml7egOh?2wUdKWf>Q$` zW%u!FbgOc*pCuZIGLz%nWIu$j(4wQ`$^P-$SnULDoOYsilGf8aMI%Cr)sPU{$W0{~ zrln^`d^jA6`2=Ot+4QDnEjV4PX%n1)zQFif~FCZCMSTc*irm180di)avu;P;oRoF;nkgWN0^1mDY*R-0v( zN{}|otRNH5eSx0|-#$0U3E%#-e=S;#62AR9gp}~@*X0>pPGI&MF{=`oowzB1*$Gkt zvu_Y&0<+Hzt`BYqZVGM=ZV7Ic%CE%+e;cw<0<+&9WMZh#4OS6D{b~PBWTM1SzbkkZ zLkJ071pUjD>2mX4U{11Y_~q&zazLWI803@3#NoBG_cW+_WyL>=SMas z#gS@+!GX-2_Db8JoU4+k_JllW-71Qp?t-~sJHtqvx0${Hn2@J~fABJfBbS%i2XE6)bHJQLMSR1DUP6!R=fe7?v`gXg50p<;+`r>p`OWEJ>ARLrHa3G zUt2F>*_X&=zl_jjDkO@Xi1P;SqLuc1H7m|*Nqb%{bDZE$*JiL$Ft!kyR;S5g>#!(z z9R**ky&)+iQQVs-=~S8TTfrQh*^|*V<@*aBeRwE0A~AS}_Kw6csncTQ7#n0lslmI! z&+@s64og-g)O*O{CpKcn#`ZpTm|t1{z>@H{*jQ=Nw4V&xf#6QzgWz`O4(CqiF6VCN z9_L=?K6-`%SE=>HuxTn(2eV~}R_c6sV1`fgMn*xiWW}3shxSRZEci6|O#570F0RDm zE>QD7!+KsL7x#I<96!(;S)=f(Y>|AU^I-5$FfVvMcqLdEyd5kJmTK?8DD%VMqu}FU zd0t!WnKkz>v-b5>WM7%V;p=>J{|1Ft28VC+%HBU)_IKH`zt8V#KjfGFBbKdnwVx1D zy4p{9;{2KIYAdti{2Gaq=|aD)%36O%36w7M2c8vu8AXYpt`hx(-cSFgrQWj`8u(W^ zi1Xi~=#1`bj28^d83%#LwDOmMXTJDL3NT=Sqg7sXUUFV`UUB|1bdg?8{KoiJ%xPl$ z-Y1>;&Obq+Qmkl|96<--5k2n%u>g7nzZ}cHrUSDg7FqzKVj@)wnaYEfA{AAoso6|~ zba>yfD@(Nx9H){g7b?G5zq6qs7RAFthNmuk32cD1Uh&LUGF6L;FH_;S{fb*DSL%?qEYr5k zE4h`m(r7Q!wa%ma2}31zlF=A^R{X*ynpw}&e%;oVUTKn3T#X z{>C|@c?uY?cBOr#L#1P7oyxj-b?$_%@|SEHohx&2P-YtiE=-PzuaB8ETj)@@YN`BT z{VDP*z=|og=G2SGkjJ+x^7wX_%ma$SJnR{32 z;Jz$$e-?Tm3q6>H9?C)wXQ4;3(4!2Z=`}u4dn^k*o`s&sLi4iFlUZnf7J4cRJ)MP~ z$wJR&q35#D^I2#?7J4BIy_khw%0e$^p;xld!YuS^7J4lUEy_Z#t55@!Y-JqMWuOWM zA5cPUYAD+2B!>Sk;bocKDbmS5oG0fHLrQMns?6dNKCS_gVoHm&rj z^sV%(Y*yL4(!a7rWy{J|m9R3PvUR0e8CV%q*`~5>WpHIkWxLAul^rTWD?3((Rd%ZE zT-l|vYh`$4x5}P4d8KlPfImgdVkG8Xc|z`;6>^{d4I%ffyn!_rjwI7B*bP8QbiL3v0CzuN8v$6d$4CJa}US>6LECZ)Eh}_sg&e-}4C81owm1{ExHM6}8wMJ+M83Kfc%24ad=7RoebYe2kxvVm^az$l& z<*Lfu%C(j2D%V%KxLw_DZg;nb+tcmk_I5XQ`=I+t9(;s`5RCASa*a^gd*I1U-5Lkd zk+K?a_a@U&+xs$vb_4;3LMpFyWqoslsJ!HLC5Be5OsQN_xwLX)<)+Hbm0K$P-CHZS zRc^<&X$mwd^X*X`R+QO8B>aTzrP@0ycS((pbfo^fD>GmZUd<@;J(bQ_BY|IfjD1Gs zj{n2ndw@w%bo;~A(>=2@v$H+Z-P7IEqeu>m5lnz6BP(XbEGVE71O-u15!BTI1yM18 zB0-U0CaI_>h>9y9n8g5?bHIQ(hwq%}uI{SpUgUj!@4essKX;!8*ZtM0Q>RXyI#pfa zRPF&WSplEyCWIm@;7~6_R!9K#e$@w7A5@)IA7UkAb^tGWg%rTKFP0O3@4ZWPl;D$vtl zpr`pZP=TI-G7G$98b4)Dk%rupxz)L6bI;{Yt!^YX#Pe(eW4}U^djW*X`Nj{RL|%mA zF5`=G zSs-c^S)bbgZggV~Bgc=bl+E-MSl{N#_GU+TL8lKzx!0j}D!xiXo?dwLKeZ3f}Hv<7?XbmBQL|}9y z(|CyFgfO=f`4ntQ2|uq!PmPB9#!PH=YZH>D?Tqn6DwL z5T^GVQT{mjJoiQJ%iLGFZ=oJSnBMO|jnjFpg@RvwnENRAaqg4crrh_rA99yhM+U$8 zkrS`%+UZXqo)G-%XOQ70UgKtt4d+|Q`b+LtpyNJkCGuNT5x+wbLOiTLpiTzwW9ox@ zq0sK|Q%`Q@Yb}J(f}^Xsw{sul{>=RaM}s5{!>ctC@;9cj-zjCc=CT$FqNM{Vba45c_;^S1kD{?nre}=oMze#@`pbTR;t`w`%U_thgxXA zdf&X*oOHm2Vg|g^)EMa^(%cscwCP?JsU;5YlbeuMJ{8F5ir$2@4ucLf zL2n>IRg`gA=-Sxgs!6fQvFl?u#O|-^s!feei|wuLqjl3ps7TDb&Rw$w;#s6)xUf31 zn{U%4D2?nM+apX>BAqKXfoa=n_}x;jQXR%=j?(*zQ{ zj#N)DX|5zhS`@su`|&q4+nXJa=@;P%;Jpu~>OfE;Cu*VK`N%O8JRiXlJoM#x1$Q0Q zB8O9M!G2WFFm!|ng~IUD&%puNK3ZR`pLUXVvUZBrUt1TeCr9yx3VCsj^dxPdPk%H} zqmbyV;RjvU^sU^l9ISPfj-jHunTLP@9qU77t^%^n|1Y}x!x!M;1=3psZ6UPqpdF+eWm$9#6n`2+cF4Qj4kd!%Kiig6(L=kRf zH5|h^)z?(Ttz4q@AVYmoDiFrG7$!o4V?$!};~S_H@^kE$*cffBHV7!us66YSmvwOE zyz!yFtX-=85fieaPYq{sZ~VF$W|1?)J~g7A&qF!U9Ju11*NBK8`SZdBu~&X zvOs`yRhq=k1w0*H0PI>r3wrgYOJvv*S80lj$;=%g*AZd@J2C<*I?fmQasEQc-aX*X z`uc0MB~^xeEto-GMzWm(GS}C$1hr%!?aV+1KmFqaf}J4jfNRys+QzE>@l!>3Llwe< zqhRL#B=w*D<3o7L8#R}~X(H?vce)6>)I+1;VbSmzBJA=WF2XMFGoxYd2!Kqe+}tsM z0OpPY1Tc3TAW$lIBp{&Xjs*nN+|hu5nmZm4P;*BF0&4D5S5Ww6~f&k`@69fWsM+zwQDbNEL57it-*6Xz!v?jZqa6Gv$Z+eTRNYWHc2 zwfi-JWi#?m8R82)-V_CUDUSY&NN^DcAa|StPAtA$g3jVda!NpBs|I;BjeSJ*~kVi2+=vfwqNrz11gaZwO9B#E<9)0kx#UZd}bLkkCVr9Wqa8_gX|ml?3bDG`r23Ug*Jva$<1*7?;Ys8UXy|>V7BiDWtO29z2GLvdtvB(5vn5}`s)j*6zD`B ziNMDq@CgsV@fu#5Ix;ryx;$X$GQHFXN(flwvp^D8Ar{#bhCUaeCS-iD20_ifL>>*6 zt=;mNH`ZK$d1K8L;H!W&RoLb*^mQ2eCJcQWh9(4UM%gnF#VK@!NL3;WgA?tppo{$D z6lFJCiQL1})RB7=RNtO@oBFHPekNvT+hxq`Y`cs(n=C^I$?2NT4U7mLo7MFhi8-|_^L(hbvXTuQl zR3B}f=Xhf*k>`1!mY};Q=#Xhht1%)lRs=5Pfga?AD*Dw(WhZwJlrq9|k! z@=`Qy9a-nEpqEfv+%tm+ge;1-*a<9xd1eqbv9rzv%tvlqzHFzijQs#)V(e4UBF#ltVUZSLsAU*x z6^2@ikPyOuDNHii5dN#Rr?fTNOVtO+2g(P@2g{SlTG$g?SN*j1a&;^zCl8Sil@F5- zmwU=b$VxJvJW6gXw)`_%5Xk>o?K$mvjXpg2f`$)IzNo#by{7e-2gq7-y*5ZbRURx4 zkx!FPm&2j_H)tER*R?maH?_C4x3%--(egXmyV`r&r`qS*7uwg_H`=$_ciQ*b5898~ zPukDgFWRr#Z`$wLAKIT9K0W!DmQE5~(qp=;D|%c{=v8`BPw8pBTF>Y;x~exzX7#*o z>XvTn1>Mn$`ZoHudJ}y+y{XQB=GFbO(vhoo8+@~Zd!t}eW{J$1TMP* zp92E7@e2Y_BIoLDVylmE>DZ>#8aZ~b`C?kh)_N00PX6wD*Pg3N15ATQONoF zD1EekL6n3Sf+}|4IbH=7Or`URd~Pav2H1fE?7yZ1p%mi?2mq9}1C zpTQ1}mZ75ejA1E;kt>i_**$ajw;`<4Uf8E7eJ0WRrL!n;b6rYW;fMAV-G#C36=T zyAm#d`B#5k;3)ZMnhk*%xly00_k^l3;hE@85sswIlqveO3ITU?DM(`0+|bUrH8%?Q zYi<bK}Ez$JR>#e|?0Jy-97v-H`lE?uy!&Vg3!Mf)&< zF!9ijWm>UP)Cje$(oVTmOpu8SXUIvE1&{-acDa5Gi*gXqv_ZW?7n0zyUjUi7sqU3g z=3Bu9)=T~QM!8#`2Zk_!mh7GYXqP>iFPXMegSw|OUtgg2N(uzHqeqhlLf)aE1ylq` z-InXHZZxM8liie(vaixzsZ;h-dMNuV2Pg+B2Pu7$eUnEhM=D1tCnZl#9;Y0y^ip~& zCnzT>eUwv@{gdcAkp1xi`&OLm_$Q3V%a>E#faIPDjDynJ!e3rxs3IUbyfjz3Pd`OL z0wW;6075jW3AvUs#O$t3H6gFk1&RQ?1_q2~E)xV5@__!JJ~%lf$*jG&)Ma%EwAa;s zdsQ+$1fP5UNy30@MCPTCc`~1QnSPZ#k%biUu>OdChB6!irq1va$`zA@JqY-^fgdP^ z+RC(Gv_nWHXCxohALIH7z%kgucpOTf%4c5zJ@1w%EzJspGohekpu#W=VI^xwgZ`vG zN*S$Opj@b2q|_^CCr2d9${1y=5>fS)Q25P$;gDYw=8Jk3^zlfz>dSz$w-)ZU@AGp=J6M`9>cq<4a*r=&SYd%H_%$eRT3l)UkzW$8CC^pNrNXTYRIn;20x$4DEqPG{UgCisWL+?mWfuW! z$;&)tiR47!6%lxq2WrV{BCwtZO7PU3Kk>yn)sl@O@VW@RAp+BaEjm{((|MqdyeXsB ze9hI7w|L+g`C0jdfWjp2>mTSJ>L2MJ>!0YK>YwSG^w0G#^e^?V^v(L$`ZxNw`gi*G z`Vab#`bv;Su&p=s_w;*}%aivhKZ(h45+qImH_havum3ctLV^VLXpwh(1A#ian~LxG z&XNk1qfww(ry>p7#6MomPO|Dh`(Err`(uL#%VH3ZXe+b+7cVOdQyl>DS z`0kkTmhv|1SrEogKiPordcMQ}N<=Z<=e0+7ka5oTobtT#g7TvBlCn;joV-4HQ}$Km zHD$fBLD{IhuDqed#msmRd26!$%$FIwMG`*X6f6&Xs0i6GU}QLhyCCqPGK0Jptf6C7 zH)}V0M;-7RsO*L-E7L6xG=@zKs#e=N`Hg^0~1sF-H@l7Fae9v_sEu zq8eMpF|j5{bc1lWif<3_?g1Pu7Sxlr@pkdrc>DPF@f|8;3~Tq`97~WP9V@j&Yg~aw z`K{W)t06*V_Cu$oAtd34PD`Vc;!k%Whc}2bJjOHOBp9I3xaXdDc(8WCB9dD2cxUBKVNzrqVpW& zLmt-yp*Bp}F$nL!v%%H|=+Fi40<}4S&)mW2!e>_D)M0yLdt=Y|js`yZu_RfF?;GzP zuZ!XmDjkhK8 z!<56rEdwWzdGWqg59Q5;E(tZLosDDS$HtF~A0K~kh5z%$3iiD5-o`#gH)BQeiDX0a$z;hu(slu< zd)`VXqfn~1pmkhURU%A2plZLuS?V!nA{x5ykuOWb`uVXofIgz4C%O4*bk^% z0X1@mpCIVW{sty7i%$3|T87-q_lj@fX2AVnr7VVZs64RqxI$RZ7jegLQ&(oH~mV@B1QQu3+6h!x>bU+4l{aMSvthic`2fEKG zoy%_^6!8-eJ*7Vff-vrr4v!7$DaHU}ka4OZ5a3!BO{yoq2WmoD%2M19-UoluA-F6h zqTpCU4$kJ_x=oAJ>Bdl_bt;xfMkn+jHI<_~&^6sE;X;BMhO%KO7lyPjq=z9R4CO_r zI+00qhYF)mWkQN%xN)X&mT|T*!Z^n`*Er88X12*}n`x5SF4HvAEYm#GBGWR{D$_dC zCet?4E>oLnpV>ZBooM^dne-s-sBj<)2!tA{6`@ojow%lwT#+|UMjGcEqm0oN-M5d{ zeJrtkbb^$S*n||kGd|2X!??h>(74DrD0Oh^kkrnJofFKxkm|})))hE?A)h~4taPXu0VnYNR zx+l7`9Ady>j8T`U3xladkH&PfUt+%mUe@!P8JS#W#1aRvOoAf!PwdYoB!POoF*r3O zbz185)X>y05Vk$r^@5zB>c$dwh)y^xaTr?`%%Tz#j4O;Qjk8ld6Fu3agr9Uy>Rb@v zC^j(=;mE|1Yyt}JGQ8T@BXf3YRO;Bou`GcM1Y?W~QpYEbkAiz8dL^a?nnUW#fVv|& zA$$(DBRs9mxJGy3w!#&>x~w$@P={hyCcIz-OF*u6y zy(r34qbT1GQw~TBNHD`o6$m`TxXHNLm}%T%%rbuFz5BNQZbC7&O={cJX~uS`rm1GB z=Baw)Vxw$~H7+&A8J8PZ8551&GuIf`8rK<ALUQxNBIYrMTCD? z^mqQj%^BezXhO(8xCs&d;a=lDV{x>9aFZJG4=%$9|KR3&uyOw|KiWSaEZC_76GzcP z?*a>*XDl!lf`#5=+;2Pp7P`cE$avVZ&<*6naQE0iK8gZA4ueBrjAZ6P+xa~uyv`LY zj4h0&IuBkt<`-|O2TZdy1=HY&uN>KAU#Ib7;BBsAXEqj&-cdLD)O|^Gqbejh|I$D zvYI|M5g+-_fb^g8i;vI3_jp5ib>c}8`UJ)T#sKI7O@sQJ@x1YZaa`v3Os~u_sz8>6 z=`c?KZ}RfX&UIva{sZ@0D2X{J7HAW{l{O^T87~`1Vg)rvZ3c-urglm(R^SdUcoWp$ zZ)pZIpY@3iiH(WZ6FY!3OucBR{wRwK4Er@>y&+`8kGaN-7|AaqyQJKs3LrO5y)J`y z%Ev?W%UaTbS4chS$O9JHm7Z;Lw?*;n&~75M6X^usG_Ey}X7F)=FE2fqm_x1#F2png z%RzWg2noi0KfhzV8)fb9fxY#H~?K(nj-u!aTzet3Tf89P%6!JL8k zBTzw?Xcf#Mdj%~9gLFg`FoHa;;vH9j+T=9@7v&)1E0i8qWl zjkk=qjZGpM#1@{@-KtrBaBbVLtIS1_E0By_BY>+uRRs4L2awa zVj`~kAY4cG_gzy7_>coq2ZqI(L;3}4dCfp9>|t}@F*4r?QLvUA#G7<2IamY^;ej6T zXZK1K2!62zhso+mB43qH=2Q7}zB-@DBO!C8+&#d|lN<^pT>@V8P#^lvfDnn=1Vs3Z z7Mom4dIABe)cdI=NASSmsUd+nu$8pDp06cG^HjCu7#_fnTwh_BEuS~@hXKujfiUb^ zCzW`TWaMv@tO_Z!w&t#NibS>KIKI?c(pv;h-~s%I=Hx2ox5*z1G=~Oq(KTXLRZiZO zY}*Pk4d`0NbCA(w9m!}qqe11m{a~(iQ5dvHJ?(bEcrcEJ#G=q#>EdwK3xjD6(m^1q zeDi#Zd`q?)VFE6ZwSsPR0bfw-Jo6SqASKfWU9haSh0K@unV~*#O8cU{_zVD)NOxdRRv3pL zFvyVcK5ZFkSF4vP<9Mh?zC^}@y>P95IS;%*F7+}ouSbtjI#l-0JtLFILHV;4Zct8< zz4N7fU4Fm(p7H(j2jmaT9~`!VZ;eButl&_vg5WG>Mfk%2`p%z~R|GyoKMSk?TiDx| z#f_6a@`vZ&PW8+SNpLa1O9)xwUdhO)dPhNlSMb_88V0))`N0l?&-;U@r)1{Y5UDa0 zGc75Va?p~;=RZy{VMa(f2d&d9Z;>DT3RZZHfu}?J`sG2LacqqaQ309eXWj)vZrBN!N5Fs*qBtH{auQ}V0S{`mph7qU{I6)J|C5ElBj~y@_fW#C=NT&>A>$g zUIjy;2b{!@W$kUukXR%Utp?97PFIhk`aC+5$~jLe*$ z8I>8Gxgc|4=Az6KHGT3Y<%i^l<73i zBlG9yCuJsQuFu?%nUcAHuP^30Cx0PSF3p#J5x93Ilmkv9xbFuSV7?z*fcbtvfODfs z7_%?VUy?89$8bV`j3~rd5W?_<08k>A=34~kcTvM`6&adZnZJsy4V{5Z z1cChM?rvdM=eOgt3Chf6+<58|$nv9NG4 zCw~{)Z7A2ff$I={XqlHkH8q%r=0i6a%0pw+5*fx3r&b*RY zlz%nzTBcXLcYJ-OU9vVwzdTD=uY2;ZXXbldz?($1^}E2+@n_<(w48n}{(Ss}_>1wE z;_KqC#9xgo=@&BV<1c33jcg1-j#n@nx2~ZS`8(|;MtfdQ0(r0u~3W~>ph612gOQcX#NJCYp?|JNPfAPh>{=- z%XmCzlIsNRO}{-#sG`U7n=(&&wN#*ZD2{%qH>jV+KZ|dQe;NNOzB&GNd<9faAjOw~ z!bDxAwSK<A)D`E~htLLf;JkzfO(YtRO3lR}bflN%eS7m{51 z*Bhr7lBmu5p=HtH;He(CsPvZq>06?m_YJ=8!3mx>^3{nq!5#$yoKVmtv=!z+ZH#Ju%MYSHDnE>JJRd>% zAM%BL4CQ~yLu1sg(q}#d#)jY6pNr+Q?HtyTBS zw@Q4FZ=GlZ=Xu&CB1-rws)Wr@!dH9=U+3TEO$N>Sz5FNnPxGJUzs$Etv`l;>k|c>p z@IB9iHESV>nw=jf&o#T%uo*Mc|EQ_deT@1eZ**CZ>^ya(+Mr$;+c|-;?>ZzpCVtHS zlz+DRSD3*GxX{uFA*k%o1jleifvtUli3(07lZUVe2#LKZ7=Apy+d1#jBjV}dmWA;h(P4r8g zlsGvNuh}`hOS(h)lth0x@q=fM1}8eEcTM+KcTb;|7@#I&HH9ZVq!?}v0SOUYUEEXKYSvGFVhqZtH29nfx` zW&$ckGcLHhxd&*bClv`niR=lQ*}BY~A@dP@<}LsoNg=7i?*cv6uh|pr==}t0*cyh~Ol=+{EC)da9 zYyNMJDR;8@AB-xu&;M9dIcx^HZt3lh>;hKdPUah5z5I8VbMH#8glW7`;ErhijjkO3 zy9=dmQ6(~hPP8QKJaG0SI1dMZ28TpuCT>a0N?fN-QU{r}9H4*SRORIRD$2+PNwb41ilaH z73uK7Mm!7osXE#evfxGWF!81e>0*z&SH<9w_izTveHB?vo+4|=TJjvcO5z%(m%Xv4 z#ZV|Vn?=fjm&dx|BKH_x`TM|wJe?pQ4~WZmzm?t@#f{`G;_K+!@SA7 z#hhi%Hs_dg&0E=dx-0Xg=56ehkXGb&n5SRHmvo0&Pi_#^HpSNxDv69uUCL&X$(`n1 z=G|r|I32-ssNgj2fb78RpzMV7So6&6JhP76NZD1mkrN?bJ^U}WNtwM>8^rIMC|xH_ zlBP&EN;gRuv1@^enV5Kcco2I_b&zde~ z+Xlx}!Rw!;G648!=brG}JB~#y8jo_iPj{{|SDWtJo-G41H$DYRAUu${HG?4g zP^OT5OM@VrjeB0N3`T`l^M!})f-O7uQM_l&;88r`#jn4+B!Oe_zw}gCkRjrotH=kf z=yOk@XR2Ik;f1NSstXG*Oi@^P1&Zl9PeT1(myOT*BzF!V?m zS{{ZT6`?xvm~X(OT(RiKMPP*wl#rrCo(N1F0l1$hvbD&QB2-6K`h2{SR{21Mu|-yk zndo|#H>zy_r?7SFUGJLjng8?!h4)Q-H{n0K&h@XnlJJ4~q4|;dvH6Mlsri|?$^6{> z!u- zBUtbVJ|Ote;%=5JgDe>8uW@3G7|z5?pvM5*EMna71tyYr4|r!h-eE!vQ#{Q3`YjWP z@kAGD0#W`+u;K+K7SJmwpfy*^f5uvfl^8@$YJ3@Js{<^eeSE0UfQeqG!0q%PWTKGB zMpG=2HG$`aW*|?&pUh`0T?=hc@vco%YtQ_biMK=|jDpW5*O9e>8%CxX@^s*a(ezfU zLYTEI?BVcX)>>MB6KJiK6$-T0+7hCw(O{N*n6wrajjPtiij1q4g9@>6)xsHiD$fKn zE36`{fAV!Mk>_~LLNF&@38A=a)GmU6YPD8-YkSL$zP5uE8GlU$S!w(=mfR&4!VWa? zdrjk(*I4)gfmLG>4A34MW5M1?FExXO!$xkT(`JiWSf%TvuNfVzt-OzpA|d&F@&a8$ zBLs_guZ#Cf;@$8JG$O9E!jDAW;WkPE!ZnHA!Qh0O;d=nj7o&L!SGTL+>h_-2$KKWL zPL^)u_A6yce7ps ztKPPvBvchBk@{gw@OJ+(0b|=i)MUO7ypnp=?>0c|K3G&o(h~Sx$l?9ek=OjbRDtTq zdLCE@YdapN~ z?`a_!7et@EUW)|uvaYvruyvPpJ>teL>%NnEw-Ri@>m)M4E7%U)&Qr)CfymU5S&5FZ z@Ln(y;&PH#H~zM^O9C%!@-A|WD(nk(@LF2j9X#IpPuwht+=|=@dK|wM$rtv|HY4Yg z_oMxXaQh+d-+tIFs{ft{zDcfgOeaDqi|DfF`Up=vTpUxKpfn&EK7<>u(KI2Ur6w zfzdY1sk(oK4ZD7h@)3F>&FhT83Z-~1ZLlSf;-!Kx(T(Kez;B_)#RF#;Js3X^;_$DG zzt$yQO0=*#rI#gdCZF+LaIJcnvMJ1>o_y|W7Pt`dDSul>Cc~^Vtl?3%dM4QFCww7i zS@cW~4#Q=1rFf?2bn9SqsD)>G&bA^?^^5>k!l|BfEa4;#{W@w;&$SvoYD1Ii$rpUJ zrogc@oDciX@x$ClxsP+7xYYwUVOQf~tC3xeORT@$)hI`mF$T&Ib~VOYp)HI{twy#mE{ozh4tNS%7~`#o zEsV>pMz=5~Sh$5DII~)2Z1_+49HEFdm9gMI#k>yQ-NDfi|5bkK$d|lB6V7Ge2f~(4 zW=yoMwnB$Fv@IUyaI@5rul#~5lHlGC2JrB{C)rV*-P*a%Lc&%7p*yPcBqg$$?^71} zI_Umos6MVhe-nnj4MX3Bq3^@c4`JxXF!WOx`Z)~!5{7;aL%)Tg-^0)!Vd&2=^j8=n zY5$v?>Preku`ncuAtemO!%!j&RfVBs7)phqbQr1*LzysC6Nc0{0W_pRRlT`SEuSo~V^6zfK7sx{4;Zq2Z6vTn9!TDMrU ztl8EaYp!*xb(?j&b%%AQb(eLwHP4!FEwC0^i>!OBd#(Gd#n%1S1J;Aq66+!BVQZ{A>)?9DC<$Wb4$P-ph(=^zVLi)fwoXvq}`+8zVKqLk$vHR!my4k6ZeG+X*yW|1rj1S zm`(o;4rYzD)>>a3w!r_~q3!>=&8+_?T+G%!HU95!b~V<-p+hS4_=a%oq|uWX&ssNV zY=?Nx`iDL2pE9f?4&R}gkRrS?k8Y*%<9;ePA=^ZO+lE1*KYsP!*dJf~$AkV$);jBD z>kaKq?JezX?RF%fKTE$1whC_#TUFzp}>PAP7pRHf4U#+RyG;O-} zn{|_Rvo=%v-I}HSVa?I#=hhwCo!Xz)-P$~DqxqNRer^%Fkz=_3lwpRn=R565aNB8n zA6kJewOSRXc;EbAKi1o3{@{0H!z5_qL6yV$#GylQ^b%XVd^6PS^ zWas1?@(V#co3t0^EcNtF8PuGX*C9)$wWwFRkzKMcIa4-7p z%+oX>y9DzIoT}gkU=z|I4E7)$D_L=@g&%w#CpD{`q%ncz%qF6V-Nqd4Q}X*K331Q{}<( z5cxFuba_K{&-5_)40*VGrhJxswmd@Kpl#G%*Z7a2j9p`^cGk|>nyuU6Pow`E{|?dJ z@sI5{f)NC_+5aa@pqA_rSZx_>8y|1qIzH1m{vhG{S3eP!Ij-EkQ1Y%^gx{Zyew!GPa3yxB^ zwV4%E7d&5WVrL-ipf}S;P$JveOc6M{AfySrnBz%@f1(FyX2-m*MqD^9yC;ntyJ$DH zFHy&;m#WR}%hd^LpR_<0CoVyO^h>vZdB4Zjl?Nqn4s6>2OSk087Z|c_RY_okkVq@L zBh)g)AflFSp_U!^TDF7CyVA^9ZCB+H7x~@N-LIcoyS+Wg6o?WaNswG3H^F5{Uw%SL zWY55KAOV0*JWxlb(5t$T2tQq*+O6R?>Y(g~6X*bDv@4mS?r85pcCvT2cd?PEc|eqc z8j2*{f#m#v1UG-(+H@w<)fwtd>dop*bxGo(L=W29qIh%k*?Ilnf(}CLT*Xo;ZuFNQ@xoz_tDJ$Vl=;ViZ9J z=LHN*C~s@Cu1y{xF(%>KW#re|o;Dx6AnLPA$cSHSTa#@vxt`h))B^N?odbglTozOc zBNMoquP4zV2D;dMWP%|`HQ8cbY!xhjWL040A-;I@(vT> z*A6PHLEYQl$L?mYQG3_|2|hs-B-VkQVON2FQVD*;Td8+Z0RO~K`n!FggutS}bKswD zqcNVt1>r4Z@Ei;MY5*#cL&0<0OZA1tx|vI)3$N9VWUq9{IBUs$P+3=0)Cx$}l}-jF z57^rWN=Q*l_Mwbjidxc*2RMI?SxV`B{i1;f-dsJ-E|C}M(KeKtkUKoJ<6mX>(za`( z2igbO2iu3)@2iK~pCo$PN7zT&N7+Z)$Joc($J@Q^(PmRJ54bYbXiB<+r)Plqq%Q3Z zKoXdjLS9$jP~TMFQdzZ>sPZxP63Hw&0>Sqh#E->KT z)>erPe<84e&{%&{GMkx+J5kXqSfd|zf&zZr2@3deCn(^@ouGgpcY*?b+zAT!aVIF? z$DN>nA9sQRe%uKP_;DvF;K!YyfFE~)0)E^H3ixp+T;QT)4{8Yr?P2yA_Hg@5`z-rxyAGZ|L@R)QXhDQLMuN4=G9h@j-}Mh8>=(&PWF2{# zyh2_j=h#2gtS1}DTLd4O|4J3I;WY=A{58T7zp|AMVI(+&mwAV9zP&eu6AN|q2yZeP zGI#YCPoQQJxxl`k53PWa^uAL^*%#V>s6vuV+=Ttp2Lu|$F4Q)@x4nP*z%Y2@R@SNv zf=%MBs1{=;;F`%v2&r zh)j?4DJop+$WbD2v=3Bx(ESSUTpF&pUu<7ukG03yd@bw? ze<4`L2T>^fpNYQ`qzaRnX(22T+HOLR`2N(Yq!lRU4%r>EJ7;&#)=0EJ|?&46xtVn*VoL>=is&t6uZZUYNH!8f&vO~B(oK5!r?g0%8NCgDgq0kv{)_DJa{ z>1gQ~=~(GFX|8>%eZ165>MflhohaRA-)`SwH?3+`bz%CV^pRXRKFAy+v(-DHHIAh% zj~pd(m)#Vq#muH~3#&=h-FDxsP`ddql+OAxuk88ZvKNSD%cM!wLVNovCeA0=nu1>m zTE)oWFBf16fGL~;&mq|N+7{`;SR_2Cavzj=yc_JgvJ~r zL$eRC(^MBMs}I67)qi{dL5VDZa@hz}Ub%gE6UTr>eZx?{FmzHFIynrT5{CMRp#foN zU>F({hE5GbgTv4e9(r8Mkki7@>0xMS7#bFa&JZDs4Cf&X^>wBQ389;|B@f#)bQ1<{ zT52z|AF-F)kJ^vfkJ~HkC+r6MNqeO|-CSj_wx6=s*lX>l?Pu&~D~lr7GtlZPMscb6 zT$E8f4@Mz`b$Y=L1#NoKZX{@vJ2zQu56s?gW6-9D?3ZjIwiCwYqy(M4{))y6Qc)k} z5(tU-zy#)d7iRK%1HG3A?|8U=?cD5n*^$}vv!k--OQW+FWG}3cHV;VC;N`+Z`+*GI zfCwE^8E@NCe&j8_z1EZ(E)b^8tbP5UkTGHIgqw!Ksph*Bg>vNn01 zKT-f&*J0F=k<^=GSvX%ghcEtP(0LsscvZ*Z=~(if{l5Kyy)Mx%jzoB`&LgU-j445K zAE~cjG^3ky{hC*FGfX-|VxG8-lc~})X}UB+`UK|2=lN2hl$GFLli{~#33P7U%Kq5y zT-ButZ@~w_zdp6y;9sBF82)QykSzytZaD+v!re(ZJV}k791G5oX7E3?WP2W%15O_6 z<59rVx%O9VcSAlg@`b$_yt*GY&i!WmI*RTap!*ObNxxM{7^}kt$slnwaPTnbPPy>{Fs;_ zf`-4gzu{{Zr5#cbhtsaUdq(nyZK!&{F$5vi}X7oVzeE1|`npPolK`Gpm zjTe~t1GYJ?KqU$pGLnuZ2uh@?(7=Ce1#OZnj5UQs3|yWp)R7DL9)}$<5&U9ssKXBV31 zTI5>h*p{f|Sg96(^Boa?1$M_g^#6Aq)*xKr?k~u zgE+HzaoQAUd4pPAU?V4H3s%96oVZ=#-E7lBvqJMii$cpn+d|0le%X@c z)q)Iy<+U$-lem~&I>43dapaNo@-zh8<-6oB@DlQ&ASv1+{KUzV>6PhK=^Y9?vPOwX z*aLSe{FM0F@4^5|Wak2`%&<@uS&@Ds-H_g;5X;FqDffBei%POLfEGxH!n*X!=~vS0 z(}mpK>3Qk-=>_S9=`Yj8+_t$T>36b=()XnAP2ZPZoW4K(K>DY&pim7uv8&3>5QOrF z?2p;)eO3OE?O50jRCp)2zupz`Ds2#W$a*rgYFO17Rl}>0gqd)mhYS)IKw{^p{OMSA zY^PjJOpPH)lYj*C2Z<1<()UvnP)i+ivUnGEt$KW}7uUJUu97=Li^lx^0iZ;>6c$5q z=qEib%4FAEr@~$Zfhz{|?;FK)?=a7OqIq^JyaGk}8=>qPM?Jx$nxN9S#!*kkq{sSS z(~#zRl=adE+QR_zz_N5{MJ-qf_>sv=*@vWurPsW=DS(yn;niRsR#(`suve^WZ131U zv2L+aY~NV-SY2$t*q|IyB{im=nj4%OlIu|jasD}qGcNl=G>E_9d3tVWZdmRB7|+J> zeWe6@YAB=ER|pJn!ZY>o)H0u?j$BSX4^YETiA)eFuJ9?40KC_gB5;)tl#l|R$EDWg zdi61CPvurRGjpZusa!yxpLc8oibRI*HtDjZ!n1}b?iFAvAO40Y|5<(NZW!ZAl+ zV*0v(c^Q}=U+7in4a_I`%u7i3iPzF768ufKFB{Z@3I`VsDI8i*s}Cz2Ug%jkqHtv4 z*ursz6ACACB9XeZbfUQ0J9a{BR@JE7?5elOcR)N9 z_@jB22?_QZ{(krJhEfwA9gWOHG_rT|9wuQ6z{m215Hp;Nc=FF%#gFb5QV z=4*^cTWO8iwQ_N3eV~{z3tD9}@QdpM3$5XjFEeqYE1M1K*xWt22XgbO&Z-KHu($Bj z7u@sPulm61gR0Z&5O%nsbG?gL54d zv(CFOfcSRL=ae4;_;$~kh3jEj>P?8;tiuauaS~Q2%j(%6q5q%{Qc7e*;gFa=5ppx* z6pNWfxnNm67cx(y{l?9FUSX;?AqFFK>4q0ZMwNU%WWJHlJgP9jyD1lk%w=5hZBU05 z&M2Hy7+pBB`l#xxdQ5dLTGbZ-yIH=fA+JO(gqiYm>UmHW_%`(#9r$Ap2^xK9;i5u) zp`Og}`#X|@FT05{pziNxkz%G#QOP0%i_TPnMPE`-a~pH`O4FIu<-(Z4*g{0m=u25O zp?ElBxeV$h1dSe7xP|%XfI=nmDFlrkN^6f|NaS+JIEU)jh2pt7GS`>3gy3w3QyELV zqHtv)Q#H%a2q4@nC^Q-}VnX5j+{D5Uxkf@pTpd-XYd|z1WW=?FP{@euKo0KPN+Oe@ zxJ?FbLdb~gq2+J&D~k0bG=_xd8&xvCfRV9pC}0eUOA3;PFHB9Yo>I7|CL;31jZp

~wQ(-+9^&3Em+{~3(pdOpSjx!_859&o+WA3*?>$b8WELSEk`vWN#3r2Tia zTuuuMiy+&*JXJlpj|c8a=jkNH&313$z5;Wu%?0l%EansdD5~}T!VEIsS1W+9dH~Wd z=An4yi-L|zm8=gImarb#Eky9hF1S*C7&!VK89kOnmKFr3mjtK!MDFgw1Gxo-hYHKU z?R6%NPM9$%G-19GCO+O^6-dMEZ@9keu|ni~ypMw({-EESNC`Kj3%^Of^UxDu)c5;F zjir!Z`H2A@Tx=*jSrA}YA_4I3s&;ft#H_CU*eQQV55PL|fL~0h47f!e^qZty2I+di zg8)G!krHOb03p~$GW>rTpKb^y{HqI374EBEWwz7S6xJ5nYfl%DxC0P+#JJpDPgpV} z5(2^pQ@6iA`N9T>7ufv$F%dSi9V^5_%~}J`sWVm0`BmLRyDT;?Ha>QFY(ngc*p;!X zVoR!DD0J3@3^h>Q#z=dRCBavIGq5xoI8iP)i=;fydJ;=zI?Sh`SGgOAR5d zJD~Lkp%7*b=Gxfes!6fQvFl?u#MTvFF1%8BweVVDePL>BT5NA^Lt$g#^}-v4Hw$kS z-Y&dTs3oiTvTMm|5qL@j)`-Ab5qMezo)Lj(Mc_FRc%BDvy=GXT*loyrh4%{|6h16` zRQR~?N#WDNXN66LpOQZ(e@XtD#8tLGl7A*)7e6JXVktSLq~fVWsw(wl`i1`lo5#~H z`mNzN5w^w@Xn3zRisWBui_Z&R6uzvq$V+_1w~y@*7P~#RxiE`#3|n9w z*)@jNhyM?j4i2}6`LKK6Pp|Ry6{cm+roE+g|SD~ zMX`sJ{j~$ML$o@w8!bYrI78%iX21;(yoLG9i~YcGD#02DwP#<0?0D{j?08-QXRANM z_|@Hij}}0952erzgkW3{2F9e@Tt5|lExbvV#+Jn%f#nsBELoA2C73RC2`}j!;N?QC zmfdidl=(5*AB6_>I87kILoW3Mljg#nm{(QI?s^Yq9CSYehh~YxRMiE`s^rWd{>$eG z!hvsRt`u>sU3lPwZiP0e1G2KCIKlHC%sD@IA(=VnM*;tw9|in#eiZP}`BA_>=SKnm zoF4`JbAA-?&-qcnKj%jQ|C}EM{BwR3@Xz^Cz(40l0sovI1^jbQ{$*k*2y`VqdSI^cT7jnG{&VpNwb`jwNteI+Pc{Et=u3eI9;V< zd@HU9;5bKnhUR^Mzy^VHx^^6IeRS8nL3Pg&F0KAF{z&y1+FRr+RUpMTRB?HOB{`nw z7HlP*t9=+-L?X8L`a%w7Cythn2L5^Mi`bX3uVR~HU&op{7imb!?8v#(7?DVLV217; z(8H=*I=~zG&fJY!`(glzgCvBcv zpbG`4n5#5J#$+={c3lD{us+#$bQc2kQ2{mUz-pZ(Rfc@6c9E8sk!+8E%ynQaK`j{w z=j~jffH@(rFyDC-&;cEs-GTKrcmNAeW$oy|5mA3u3!p@Ha@N6cgl^S0$Pwz!A_&_f z&LR?=o`5o4FUK6v4_u!ee6-s9$%j#|*&SLu2CY4Z}-JLN|dlUyNSZ2@XIr6sh z_}JssE2>+{9i64xuFi68P4#11C%LoSMP8xp;XGR{WHz8Bw#{XWmSw|r;PbD)^6kgtr*#@EI- zMjiRUr^FQ4Nm}c7K=_kRq@Rug?}H6|l%VoMDU0E%W0;x<%59^-XQB$aGpe9xqbTo+ zqTD5_pblZMBwi@3BOmhGsUshWz{fsNLOnDgpM@EJ3f-HTAY z<}mbi82Tm*eJesG@)chdi%jqjftFplEOM8>AnQX{gsB$!d(R#fgcjwQ*O9M%EkF%X zPv3~Zw<7SJ50o%ViG0s9wa5>?y_BiMKZ;O^{3K@kIZX45Nb{>mW0BuPs6>7jv;7gK z`IDz9k-vDrf=vR(BGH3eL<&Q(FeHZ|B@D&GP$CRfiBO3otLadU`iBNci9lKeszo3p z0yR8f5mhX>j%2H`dwT8_jU^`nnh5A3VE8}@g||rFFJ}eqb~jZb=W}kHdxp)Wt0N}Q zt3)iZ63jzw)DmsKyfTHDx7#Shyxm42=Iu5L6~ernFjNdf+k~NQ!%&kjv|Sit9+0DQ zH5I8!q#3W85@{|1EqK5p%rkV9G4l)^g_vjPD8xKNMJf(a4?_op zp#w#zL=F;VKUk!xBZu&#I$Rs(0gLn$Gr_fBo^gg8>C-?X!Ey7PMUL{JvfC~ta{N_!4V|MpX%}z}hxxo$An(13O~|p~2@71W z_30{du7-FW$MbS_m3oOZb)+}1rmoTnK24>(AoiTMS#^pOyeANZRO;+>akdm!YcJ;z z`B3>V`Ea?Xe1xndyE;e7t<+=WW98%I*6QBQ@$x=S8}-%dUUFOY8LcXrOs0}F@@zN9 zeOaL7?CZR5c6aKWljQxJ9?t$wAM*g`K<6MQI>y$)ju>U@5a&?mFz0Zmr*njJq;r&W zv~!G;v5$3*bF%jFP7q_Om($xh!RhCmVir zW|(t^Gu%1TImKOeQbK9bG|dm8SPx)T(Km9yG;%30&Ab@KYt&NI%l&U4Q5&I`_q&P&cZ z=Vj*==T+x5XT7t*+339Pyy3j*yyd*@yyLvj_}|8)LxNKq<&Uj0S&SJj)V zK^KzYA4k!TE#A^T`UxxVzIbQaob{(;&#QR z#b(9k#TLbu#a6}E#WuyZ#dgKoV*BFu#T|+}7I!M{T->GDq1dt5wYYb2pJKP7VwZ~h z7P}Yc$TUWnXVM4wL6rahVbILFeQ*TfXIOe4M9>9PmfqSXk50Z4&9+bbW z7BXSfr!A4kypV-LB^uO+<)!j6`4M@!+%EZ;{J2~Vg!@-S6Lx&v3u+DWUkM~>ACLsM z&oHqD5^>MWD=65_q4`(It35K@FZ0N7H-{%+LWLoXt0`s@=YnPR2$)XkvNr>CcT0{e zb|e$StDeH^%lJlyyO;gcg+# z2Fu6(jZY+L5s;vkgTxFu(H||!sKwQ49qHqbD3A@OI(>bhgg__;C5El+RoqhG%HG8j ziWepG?3#Fv+*)&6&FwXJ)ZAHfSIylu^J?bTET~ynv#92tntN;Rt65xwgDkT!A0vAu z`*4FS$byULePNKj)?e}kP$K=HH2q&Mtyv{A{0AAIT#PL36ez8que3^r{zXA07KG*e zdxcO&@<$(!U;qvj%mIW?7CH4Op5 z+xP_mD3Q~OZRPEOEB=4whw`+@Nq!Y8lw(vj0z(BtQ#qNpj8I zy8xc-lD!-yCGmS9&+S0KTP+_?PcTdbc?K(t^}5Bd{j?(KwuQ+M zrix~+h;vQxTCU^@xKh0iT+t-nkxmMiJh3>rXpkdW>vl`-2{P_mDYDXQ=}8crP&89+ zC{ELnpmjhH2kp_M7U0>us-Q&%8uLOCy5KB*Dl4}OmepyXv0l`(At;gQ#bX(b0fgaj z+A8go8DfG=TsT8cqAY+MSZrJ9$FL}~5jtjq8xs;SLI=Xk#UTy(ko8i3sw&(Oj*+|d z*~OE2&UDxF1@sslX;9sg=- z{YVedkYJf&>+YvL44EhMnU@x?k|(l|LLMqEE1sbYS6Yx;qUts)49Hl`+a#C1O7R7)W(9D}qEGFV>O~bjZM35^_J3(F%Th zYN{d^B(G7fRh}rW)t}ZUNAYa{zKeOjPZnE{N5b+i1KxhyU@NXF)<^3mY;xa`IRE%QTeg|kG=1J zbE0VfpVUioxm-!z>~1#M&;keu(oq*8pwgum!GcOh0RfSdfQ=$3RYXuhK>@KhtcZx9 zAc)eds5Co@9sNI(tuxs>z(4x>zCZ6H!hPp?o_VG{GdnZSGe%Aq+FG)$WP8aY_Qm%1 zqD$-(T$6!boghH8dJk{4@0IAg(G5{5*$$>iPLR-WwLT#~_>s_hHEZ}c{G`xGk|Kph z(ZFaLxQPTx(HIhdP!8l^gHR3{kj-{P{*C!?X+gC&dFX@amgtAkkD^B63UQl@7XrkYCuAE0h|HP%7Z04qo0<1R`PAh_a(cc zyQ3#c_C)ta$LCMbb^tZ$61r6v1~SkZsLCtgZwLIz$gQ#|x;eTdx-YsvdH`ns;koyz zmZOQPK|lx_glC=4IiGj-c1dUwDSfPKvQCMw?Vjp$>`pkCs0FIXBL_qujD8aRH2Rs* zpg=Oz)f(R+=)iYqUl3WQ!_iVSl~kb=O(OwtGpB)jXka=CjCIX8vto>O%{()PyP(|X z>E+HtN2AB0pGUulei{8L`n6f;;Z%;qPeKSzHt%iveY;65^g-=eqW-)@BL=t%T< z^rz^_=xoQF+1=oUQHI&;5PWTqqFbBx&YkXGLi{4f(9|kSR z#^O0JCQNbX17BOby<4G7^b-t9k+jH|K5JW{)7ET z`%m_t?Z4Q6wQsZkWn;&*5^o9Ue!%!|RxaFrgu0h`g^!k_bRDSeIq=t0{66JCLKq;dkIt2ONLcgN|RI z%pnIZ`|tL!12cEfndR{5r)En6n`so6QWSNt4$hJ1z$8=@7d^2OBpTXSU+I-1n?rE0 zeu_Z;?7>OAKLxz!=qjte1o*qCf&(YwZwTDIGI&mr;dcx#x&f?jvdF6<&6Ys^nf-ef;hZgc(E2x zPr^V7J*W)|{5w!QM6)c^00~o+qD3Uj?=a$(%^O@BR&><WH_1EDNg0 zK0;bCc{y!jE-C}_!$yMzF>cu<`6gbtOW<_SU>EhTRl+J&WviK4rRtE)Vlta^*iXn6 zn7$2Eir%+xw8vP1-DIEPn&~=hKVsi%kFyC@WRvWka3way)}Yz(HqhxYo(t`3YVeZ& z26n>umsxGKp*;2Nst{-$3#!B7%?@l~71L-%PZiB7Fsbvp>^$_SRvFm_tH+*aubaEC zVfZKlxzGjh^w8LTyT$NWfde&gG;}m_GH!7M5qmA3^22&iE_=9%f?bJhndD z&XMPBz@E?6^S|tRwt!;A5vugJ3{)nPrH#F9ZcRWS0&=*tCL7Th%tc~5IXXMKI8vdi zp{8uLP*=xZ)W}~w)Z2k$rBjSJn2R}sOkRqXlEbn#D$4cstBscBPVP%#B5V!Krc8v! zN#Y{5IopDL)3w_5mP_(uLcGdU2<1tFBfFL@2#iH_NTq)+|mW#(9NsEB0}y7(;KvyG^ne z6qSIN4bMRlJ1NpLdUzu|WUDx~xIT0hdOvb)b!~IKP_W&#!?n}Z-oM+0nHuO!@;P1E zcYaS7rGW0tm&-jG_ZP61803l8+TiGEpIz_dv^zS zclI*(ui=jF+NekF$4zb2(+uoo23~Fk_BI3ipYZ7R#)5is5-p%=&z@Ej~g3{7E0*RwYes{~-glg}`=iG_+{I-Gr$ zyp?1@BeD}MA@B9bjb`#j!bD3&{}{zSLs~8Ub7wT2gkz$PW+n6@S(+4ji3C1ECYut& zAbO->xnx15gofFXvBq}`Ot&{^ZaM&3&^UG|u&Tua$c|RHZ)V4`88ZRnLBJ4Fzyx+6 z*yekXZdslew zWP1_Io{ZeO6G7D@{*e;038?-X`&q?3;##9qrZ z2}IT)TdD?nRX6Q%m~Z8sqBMFxT~c z5Brb!kNO*gYLY7HEwRhL#d%(6w||d+uYaHaUX~)nUtK!Mz0m6G$PRjSWNjW1?g;P1 zm5}R;@U&2ifzyr>mxInk=CiQ++Dw)? zg+8ExEhHeJ4@n?}KB9rGG_Z{Zwv&K_c8~ygZEH1)D;Da0mj*}}0IzM5r8(M@1+>K_ zeqnYmNdrFHq?8oePf|RA4&>Hz8huQ%Z33ogpoC)J^wm-+dLsHf`vUtS`x3j7eVKiQ zeU*KUeFnYGzQMK&uVUY1SF>-iYuLBhwQL7?F>N_IsP6Du&_mE0)wj@=qfg8eaMnxo ztRZj`wE5{~sy>glmR-lLXGf3|pZ*O~ihlFs#GHU*lC@c`F_x_9T(BubDJDLFHnQ&% z<_3y@7crZ_;7OXf0nmarvlo))MpbOJ@14j8bRs@g$1o56s8zE3@ISl^P)}2F0$G~lFxJQ{G(fSU$9G>}gNUK%K%0Ur$%(m)Xn z6w^Qn4ftswKm$P<2+=^81|l@T&_I+1SQ_AHfTw{N4G1(4r-1|wh%}I-feJKGkp?Q! zKxG=JLIWups7eFXXrMX`oI?XOXrLwy)S`iNX`nU@)S-d%XrL|))T4p=G|+$s8qz=` z8fZ)dO=#eJ8n}Q4E~Ej82Aa}9Ga5+Kz(q9BoCaFZKua39mpr(Xka`IOrU{VY2Y>*xSa;>pn*GSU?L4nqJhaY zFog#0qJgP2FpUQ8rh$7%V2F39_cmB(33~26BVA!Q2pTD0e+~12>Et z&W+%1I-NKFIGTeA>0(UES8+SW*2X`ko#5?_Li%g+eq}nMo zn+E34z`Zmumj>>mfq67=KMl;Mfdw@101Z4y0}s)_LK;{^0}s={BQ&s>2A0skqcrds z4J@UBWi+sy1|Fw@6*TY!4LnH$Ptm~BH1G@!JWB)5(ZKUG@B$6INCPj?z)Bi;nFd~= zfmdnZH5z!G2Hv27RW$G>4Xmbtw`gDu4ZKYQYiZye8dygI>uKO!8hDQcW_V|M59rpV z0h-KB;qKz5a?`lGxqG5T0q#NWA#NeJhul;U484cxZqJgb6u#E<`)4&cI*hvGs zXka%D?4g0ZG_a2b_S3)t8u*w74${CUH1H`6d`1I@Xy7mn9HD`uB!FGn&x3nC%4GT= zI?5hnKWD#Szhu8+zh=K-zh#fJ-?87bC)gj@AK9PSpV?p7U)kT-lkD&8A1vZ5oRzb2 zcFw^$xjfFrxj7G)&w055&c_vUMO-mg!uh!X7vw@*n2T@>7v)%v<9IH{30#~@a3YuF zDsUCKN?c{G3YX%la@Dx%+&Nqgt|nKDJD01?)#1+L>T>nC`dkC9A=ij&%r)W8=Puwb zs*NjVZ7jezG7F|Qmz%(nrp+g<=S!WxenZATt}`G*O}|Wb>+Ho-MJoI zPp%htIoF%(!(G8$$z8==&GqH3;jZN-a+A2#+*{ll?rm-@_YSv?ThG1Ay~l0fHgfNC zo4C!~2iz9!L+&GPE4Pi?&h6lKa=W$G~lFxJQ{G(fSUxq$p13`3VpaG(8t_C?i21)?lbNXcbGfE z9p#R3pL1VuUvgh@UvuAZ-*U&f@3`-|6WkBnkK9k(&)hHEuiS6kN$z*<4-WAb{&U!z zG;BBP_Zh5o628x1K%_Wa;d^z)GZK}Q3CI$;04A0|qH^vjpONH}?E|u&dd6mz z*(ro&VnX~9Iqtg|eC%PY0-23h+Tb#E1C^zsT}z?j6Wyzzvr;HG9t$0&e9yQQVGgv|qvfL74NFWUD z5YNhn|KY>91TXSQzJi&K6+xj8sZb?8U}(s!0D+J5-SaA&38(@B{G@;sU&DCs)L0_J z%~Kr~5LbY^sWyp35l@<;D2kB)OBT_Is`1tNDvopb8hlMNEo*_6QBuou`FyB0LqF7= zeEmGb^L$mlHcf(`I@A-#d*TI#vrYN-;CN3W7fgb>Ig}^KlLZxWC8khC zveDD1l2%0$R3;M0(y4EOulCjD>+ucwMtozw2@f$sNin6UIt`pd0%=r3%LwNKQ+`bv zsHFiCrl<rJngevM24!V63zVYs zNZm?NT^guI1NBKDjT(^3!kuz5A4gFg!*~E~@=$%p#r!4wrF<*CHQ&ap1Z_dx+M1Yb z3EBbFNQ1NzG$z$4MZ4e)cf(llq622fKHY8HsVQ8jKvZKRs?;hwf`%#= zRMDVS_{_Qm-;!_7ci=DMyYoHx%lY1XAN~sdN}d`4IE;z0?_b4tw{5m7C-1mKc65Kq z{E`JF50qS@*PSJUtEev@Ei{x>1~a~EpkNoP%3#oft_7*uc|IxCC;+mvqKvN}2xzSd z01#rn@U7_F2bkwR5STC3n6tSLf)U+D?NM?oB@5cB=EEZ4T=BVoOQ12BK6NQUR?v0) zV15Wcl&6Su>#;+@Woi~s1SN~^wvG@XNb4*5s|n*Fp8x3>!x2!tb2Tlql5T{`ZLD9G z$Uu{QP`su1!{U#MyW4hIwCs!touM|h>@uJnb|5e`1%l;_6?HDW39{>?)+PomXbjY5 z7qvDqgpJ+BdQ?mqXh{QIb%TN_+Lcw;!}#I+NPZMQn!lMJ%a`)E@Z*RgOStlG;$7iRGo7D76dx)D_oSKpJhWK5JPe=(&Eid% zdl*fM+70Ib^EFzFWSQ^fuOcf!y(Eo0!ae+KelAUbuVvw+h3GN$`EZ2dpd7whv=A-L z1yg7lJS?dc7XC)pL6+w$K*ks!qZHlG&*vBLm>{7O$X=6j(lj&x5^)E~{#ekfz7!gm zg=Cuqa0(5gfx$G;f>bGrhLC-uKQJ@{Sy*UBzrBRNOdjGF@{9O~`A7JXg^PJiXo%$@ zf4q<+DRe!VeH7iG_7`dx|p zzkYxyPtiwBPNADfp`+o~x{#YvShY{erP$(nj>iOyP9S%Xhj^SMp)bMX#n9W}DG?g@ zng+h1fp2NxI1PM91K*QC3jL@LanJ{*7U(dhGe*vGl?R7#odXayLU&+7B zzrw%DzsA4LzegH1JdW4+Hh@hp)$I~)yNv+dLP9bA=7O-_$DWawFI2L+IvL5|3Ven!ZULi% zA^f9F0`t)AS`}n4-Z9X`a)$C4R}@R#v?n=8y1S(aE@87RE5M&`k_iNCq3_yK?Q$P*1g){OhWBU#j%nYm1IY10*(h}XaEN~;=rEt4FU}Vi!3+mp51EgjWeZ4wwsh72GR4fTSx!*f;y>g5)rIOrv@v95D%+K1xl#8rZ*J6dOkk|T73UAHBW zlLv)k(O5cgQJ}t~MWAKi;s6`tVmTgP$Njvq;Z+@Dv3Z8Th9J&@gjfhYsP*J5G~V}s z!GHl|MT4S=+)Ns~M6*nikjVm4VuhH57LnzGS(*kOA%TYq78<|dY^YMKa;!@1dhoc% zjciBRj)A9$dVzRspSxY4Vk|``JCQMQZC;5QIRv=jC#T}7$DS@SY20(5Oq0mQtpOwE zVSUeB?NblIFf#PPJak3i%D~&cTCuAGeFN77Ok|%69jCYE7n8w_Qajeqbw%!B)Iz08 z;vNNb4C)@}5g6*d-utTK2JbNMaPJ6j&%lk|k={|>(cYW9W4t$e$9mr^=oRP_s1q9$ z7#ujyti9?&{tuC5s~3Z4Mw&T?+^~ILq5%>HQs_~&y^17!9AyZ0Y01{IWG&Gj;&4GP z8XagH%Xb;-#|3mF1ET`dz4&&?EbnY@6H-IWH9T-WXz0;gOfoL0p$lRnY!7-NTWmEz zj4a()y;*R0Kmz8aTJZq1pr)~c=K~hXo#WJmpyCSYPn9`y2PS?sp3s#NI3T&i%dng!>0~ z!&sx(YR6lSAKgE>FO1z5Xcn6oSm<5kof$~S9`mg6&JN(w^{3nRzVh0(d2ZXbh*9ON z1FMDdO4#x&l~6*DsT~G48G<#$QWAiD0TPhVauP_R$H`v!n!UEm1F~>0$lz%Yzt_3X z(FUyA3epCR_f>JFv`(}NPf||?+Q!<&mMhJ!%rrF(&Hk?AJ%`m}^K5jy@7Uzn?D)X3 z#qp72tHbWul)A9)iZF@*3saM3k-Yk+#VdhV z0}^^#%L!)${p=YMD1|RTJbh$MhfMJt38c_I@K+}&o+l}ATzbPtr4wBq>mBP8yCQaF z?5fz4Fn^Yrh?~F=rU*x}?@KfR5dC^NG4Jwk*N>Wz| zy-Wfx77$D})IT;LHW1W)wd^uU=rvNvlLfDrNBss#eV1pIre_8ZzRMyVBb_3z6cA(5 zfdPMkKGV^OX+P+C^~Sc9+mK68M`j_m7`sxeWYJ(P;8jeT_|!dbQg2NCYJU3 zbby(3iwBV!>?*h3}Rk($uX{$_#UVg^EEU0c;NACLj7jZ=ly zl+bFj+BT8K3GYa62y6`86nj6gDX=*(CblKuaNZoF$UMl5D1_cJHUZwLho`JGdx|wg z+YQCe7^7U@5*rtz67fenhIf!W>PP!GKH1<=$#$eB>@1&;O4j*ymCr{d>wIv4rG3{z z*(_)Zgf-r)eHKWnjohusS0)5?2XnP=Vl3Y|N$GAB5svL(Ob(<91N#ehYd!Jk~Yg z%sRto= z4!%h7abSAvNZ@E-c1(08o%hisE<_W2Uw#jwlJy?+1DSWRwp5sGt?7Ite^vgu&f3l& z0zU>enIi<^pmoQe0kup7;mJPme?@SuYoVnoEU8%vxzN zw31J|p_Cn1OJJT_s~Hv;SolfB^`!Cnx_BM^mD#|#G`C-WS-i|F*X5AwJEX+N;Vbh! z(tN%P(~CNfgBlj}MC@&#FswV&OK7WokH#Xw$6_mDPbwpvBE(+kG>L>ZkoieyBMGF@ z`&vEVYJl&kO*F8X1SIqUDMLbAXy8KIhwLQT;+QqR@d`ltiSW6*vi<; zvA({mLw!T9#9ob2VnuW|gbJjtbhoCG^=`c#ifm|VnvY7>`F51gM2l?wM<2Gdz2Y8y@n4eU_(L?w4vB?IqiLr=qbEr9?MO@5I){*2e+` z!Gd>VBlAb)56#a+#z!VZt_x8t*f5n%d;m(Od~D>*3SNpcOR(LkWHplpa8Tqp#y$U{v)d*6= z`JlcTS!?o3LB9liZg7@ownr&b)2t4-OeuJTOfeWuQ5@hD1plCb>LgGDjj(ER;;^#a z7TX@%5&HzHO!)?o#cz%6G#WA)tQ*_~^>a|IG7MVKZs-cvsL}3ZI;`7gw8XvU68C|` zPf3aUV}=&gB^p{#Rp(=1K14Dfj2+RNzg*@|f%!1W{27!*3!1Aldtt^=h9(9r=rg0` zm+212j+j;0QLy|+$xM#LYM^84*s&no2=dz(HPGi~@GQ@Rxz+nI+5PnIjXkjgu}@-$ zVxL17tY7d&?8{h#g0Er}IsV=-C;Wo6Ci-&HINT^Ayqq*9H%DLTr&4j~e`+YJ=IHCP z6237{fEXp95Uz6NCxwoafP}syfi(J_G&gDVqXuN9q|r|_@UsR;m_$Oq&_aLJC=?mL zX@J6Vl4SV-x}hNkwhP^feu@1W`z>}d_IvD)7!nNq8Cwv%{2P-DmudM~Yi+vwE5&I$bW9+Bc&oP@|7aW39$P?tR zA&RXC8oGRjT}nQM$*MLRBTvRm+Dc?~xbWwPVZ>z73-6S^95eOn>P{xJ^h5W*hkV%6E zAgjaVc6m?`6+Q9AUr;F@^lTCI3I&2sC>92WN`$t-kkBD$A}$Q#5}M|#aQ}!1ab>}w z%tU&fGeYNJ_n_R86cMg-V{!^P$hu4+CkaR>j|N;MkV0+}kdQ|MvI97U@-+a;j>nmo z1`0GF%OWA41}H3rG*CnX#WYYt1AY>)!>^{pgA;fmCI~`YNC={k6e5%=l_TkI){9z@P=y5)6-2=n_-t zZMYASHKiEDi-ol`@D2^Eqk;7_@GcF!M*|yZU?UB@PXoK4OB0&zrhz>)u$Kn*(ZGHh zI6wm*)4)L*_=E;NrGd|A;1CTQrhy|gaFhm)k$~au4Q@&n)e+7U>I(IQ`a%Ptq0mTZ zEHn|$7cLMk6eOXk&`d}R7YWUU7D7wmV&M|uQlXX5T4-a|o!UZo3aW-y?oRCh3enIG z#6To9t%>B0yc|V+%K0%~*62@qEk~?*0{FN1u)&3#aAx3|fp`*Fj$-Dl%V7dF%`D>6 zE^%R*dFV2sqtHp{EOZgN3f;^K-5p98CQH~uSeqyMlHEFp&l( z(ZFOHm_h@0(ZEy^80)H_cb^PY;5EXv!gWGFp}#Od7$^)91`9)kp~CgT4Z<*CxG+M% zZ%9c{Z&2O1#vSNN;VR*3p|5bGS(}f9HrHN}!t@q2N-(@4g(3V{i1vz<3>aRKQUUE1 zDHYIOk&*$!D^eIZbx$z7B6WHUhF7F8Lms+G7$e*)j1@|STZD0DrO!a=wO6Dt4=mRN z!z)r4!siXzD^jPYh~X6}S%TpeDGb=qt-@`>?PeO?0UBwqNMTwFx)U_IUkwQ;%QL(p zB?E?6q~r{47bXdl%`%t*8ECIa$r;=w7+#UWkR6Q{CI}OSsX$wiHV9r+iH083FAZRJ z*+v*vg)*4&O$T|EN#+>VZ>I9jymCs{*D}m^p-r+iwQb7xgn!TbBX4c-JH-u|M$8BK3xt-o zi*1+KF11ZZ>){EXE&1;j9|(RNw7P7r#!M?)Yj~Hpt*xD{z0K}w!dzyn;Ok`TZ0lmH z=sTb3YP*1`UU8nw<#M~$h1Q3*=g$mX$ZROySp0sm#583N2AeTyrjP9+ zra9As=@o3rT+Cd;TxGl3R_xkde2wi|+jX{nw*IyOwjKGGGVMHrY=hyQ)1mNC=?%7F zwpL7QrVZ1UX~(o@Ixv?p9hpvyH{6-&!W4#!!o}f|@F?3&w*AEiin}r0nI24U<^iD( za}D!(@fXG46kp3+$Mj?RGXt34icc2*UOdlszilAnaqY~XUNECz5Hpw=!VG1uXKrAI zF~gY=%w?V%nNFV0o{`KbW;AmXGlsdD8OxM1w=mWEL?GGmkKf znI+7l%wx<_W*M`bd7N3nJi$E4JjFcCJi|Q8JjXoGyuiH3yu_?zUS?ilUS(cmUT5B5 zRxxiftC_c$HO$-0TIL;Q9kZSZl)THl$82CWGVe2+n9a-w%ogTD<|Ae+vyIu#>|k~> zyO`a~9%e7IkJ-;0U_NFJGM_M?GM_Prn8VBw<|uQF`JDNJ`I7mH`I`BL`Ib4(e8+sx zoM3)neq?@PerA4Qer0}RPBO>xe`o$+P}CCrJpYS)9E!scbw=}}-e^@{LDUy5j21QmFbK0qVSTiQYh0GNli|nI_faP zB5}6oX}KssT^gvT0TL#`-bu>H#9s>PnWOH$^s4Zh@VfAZfC=NkfIA)#s=i~`jY%a* zq57mg)Ru|<;8$52Csl>j+1(b35kEn8DwbAO?Hs5nsF-sOB!hK>Z-Z&k4t+2P=Uc+P z;NOC`gkTvY(`}8tW3)>u^EzOjqn;Sa%%(p@7Cr(hP42h z>d758ub9}(8P@RhtT($zFeAj%hr#Pqbq81Fsxt&8Gx(m$0h_Qql>l3HgL|_vHWMZ@ zT6avE(2F9+W}=A?i9T2F4bF~4~i4*$*8kXwE>JL zq8|&Vd30(dEJYWPy+=Lg!JC8`Jdx_>Jcmwo(sLMUgF5LsQuayD(eh7vjLFl`g;_0e zFNGgG4ydW1-+$Ru@P+Wd`d$3*WN;?m#^p^0l4j_$y?!jRqub$MimBG$X~WNQz3ZF^ z-*%JH6m%Dw3ePFM=9`Whg@*?>I!6R=42}$bC1CdcI=lR4@#!$mLruw*+SkRiKo(wS zDqB+e>8<*}?zckoFhzt!X|O5rsDvjw~EiILdNU;h4gk3+v=z(h52$ zHrcsEDb!4}WcUmO4YCZj5b@&fwam4=Z2Lht9PSCe_A`J)naIRBI3pxpq{>YsMZOEnCNJDGLobw>(--SPfrG+SN zi9b$6Gg0!l#=Yn*Qj9I0M$NU3Dk1n8rF?}bwd+8(h&^JDKVRsG8}?S!GC4se_3~z3 ze6{&&TC07o_=F&ph+|8-;?(Dc?y!PCH`3^S57q|%$^N8K3sUFt%EynQa{=03w4-QT z#8qjgg|Gq zxDFJFGx0|vdBv{coQ$Go8L=RBEGdai|vTlvJni`r--4?yfso9F-L8Bo$E zdNr_1sJmu@Kox}cDT*lP0@zRVx01VE>+L5?elPi>q;8xd$U|hZgchhr(ph=1f7?Sd zO%jIY!&M+$R6`CP|9sa1*8?sW+aTUBP7&lGGP#c8b)&2|)n^CE1tktdA%@Ol>$B|~ zdEN%>`D{J^%dTe&DCQDs9jdaCOcLrzR#F=EBFjWQm2HEkvdefVTY}kxdMLYTTzv;y zX?=AGEx(3+LHxpav$+0PwnBu1c;Uyg)#S@TMLSflvaG=|c`$^3w3SY801R6(>h*lQ z!-A7?UL{?d*GIiElof=i5FV~<2#*bc-vXD!O~ZKP5|}LdT0xaip*&j0a{_T(8gCOn zjX)f2&8F;j@ti;$?c=7AEjq-@iEN=KhR_w-2+rUN9`6gGD|4Z%Xef=YCVLJQ9iWkR zubGY!&?(+I-X-2O{#Qgppp>W&qvCY3KU<*+(x|UiDcOD|p=+{TSL?WxpHoGsrPJ|r z>Jjf5KSLL)3a8~lbvlA6kDn5)WsRN&=V8^wR(dS8fRP zr#oc`4akKC(h#+isULjFjzH=bk9A$IUdO`}r}jO+ z!8eSwtvC3F)4&K4kkF0Vu#j*rHP9ISYX`gG$j=McKsTGgDKu7N$J{U#l+wU0Bp{)2 z8X#eo(Y~8}h9llQ^qy;Yd_?@l_{jLE_~`g(-}v&9Lui5ak+n)Tn;G)E%ZkRtZ#FaG zV_}k@7E-10k-kw{J7nlO}`1SD{;=|(O;$=me z`73QKrIuu(*57M&skQSz=@YR^{A^z$`@jB?`0pp8vJ-OYKjss$is3spXJ6|ZYG12~ zrJ8z01Mla^ktHXPwwW5xgZ@E#KK~BrvTld|U%3$R=k|PVkKYlOZ-^RqebnoL$_|3@ zewTWOjeI3aA(ZcTktFK%K!wD3=|CscuLmk*@}&bKfqFeqA<$2-N|8!NUk_ABlSz!%10@7MDRir5j_~i< z+koX<=a>B^5~Lwo0sauwJ_f1KQ$^Z`l^lR-PW%+HstVv6pe#}e-A9K~;9meIYyvuMW4N+!)=zopb|8v(K z{s}9&`SAsD(kj zyGS5}rk-MO-S|H|xE_o@6kix$6n{AWNF4j!{5#P8`@C?@<|-?MrqQFJ5ln`7YXwim z8GI`oPO0F^W*s!!cTTt-su8XkUJ|brrpP?-)Ke}|8r@A!>uGck39M6s2`N)A-t&9b zS3mr`?*-p=!G6L1!2!X6!CNhZf`fxYf}Ma9f<2gz-~nk`Cfz#z0O)B z5CARcrMLihv2X`d`~>iW7ku8z_~nIE{-HC<-+1PvqF6Hcme%I*W5K1tH{uNx^$p{L2}i@Leb0pZ7CsxE=$R0FF}y0?Mj=!B z6+Z5(m$xgtJG>{nH+-9AX?$OJrH>+Vqg;|7o%d=Z6xszITP=qEr(MYc$c0vU-t?^Y z)QVV(Y(CIWNm6~ zW=&f!vR+e!d={V8cWu#iMg5AJM<^lT>`MF8>;sAh77Z$D8TpB975#{z{L$W*X2fSU zWsmp1P#azHsM@%Xtc}LxEvq0j;;f?CMRSYpD_T(WaM2@0i;I>N)yS`zUn~FI{Mz|- z^3Th!n_n;g{rIN17j7&XEVKn}j#tjBl7+OdzNtmii)IwfEczh6v}jq;@}egBj~A^d zdZMVJ;-sVWUfoG&LeUnuVnrq6S5M@GnQ+AqhhBp&g;}j=NaT9LGbjsYd|P46U8;Eo z0cb(n;;NSta5l}-mEond1DGi=W%DXnW7q08g(@Y{L ziqMF>8`Y?0_*WZRQ}lMx{&+DNS_$G<7QIz;Aikk!W6`zwL0`xh_T^la``GNn;~=P5 zq}my5(=F(eICTRMuKmFcz%#o4_nBEx;%YH}7zU+6@OzJU^N?rE*JomES zr|~bcm;IY{ktE5=gY)KM1zEAx*yj>iWV??qqvC{i50 z6dM5}NgB=9#yOS_W^e%wJfHy*rjXEsWT%s0=2RzUOaL+#YAgz{hz1^}fk$XyF%2xy z00~Q#(4%y=kC7B1v{ajmGPtke8xhNNC<9Qp!Vp?cLlSyi7Y&?{*9sB{p(kjj5PC8f zdMX!snuZ`aJtbO4Un*qGTWK8#e=t;*F`Y{)V=8i0CDO=W5Z^}3MK{kz39!7Rna@_ciPvL+~k^UpJKnuz9zaZx;|P?%#L#s8|Y-b(0)|F z2@-l=x1x{(de64ORvZ4#E`c(Tzd!l=zwGwNfXnlcD z`L4!G`%Tf!(H+rq6Z@kFq9L@2wvi#UnTDvFzxcD2y!%@xabAKVa#PoXF-axm0_OuMbx-*8E*UpT{E17(DpMM5(AKxmQV6vsUl%Zb zk4kJOM`uSDM=Eq-qA6P~)D<2?YUHmT>g~WgP!uEn9yMo>$$7LzUzOl0!NI}ny6b75 z9;@&^LPNG$qJHR*|FHjv|ERw~s3vTcsdH!scXoBK?DB7Mo)_Bf-{arw-{(&!C_?P{ zr<0_i?myHT6$))ZS4Zl)wP4kF9OmYo^Pt6iwq?SkWiL+5LlNTHAPu?32tH{crkeegGoW~>FP6cBgD&hE;NMeM`u!`4UG#q1LHQT8!*DZ7ka z&OXk*=3BwGPHc2O!9K}8#XikqF^2O)Cfl3OM8LCb6n68J1r`p+jJ^1MO5IzEC9L6j zMeU#>pHg?ziZi&V?GptMz*%V{8R}rHB@AKK%YfCZhHRGUIzn~a111BDfvb%8Cxwc@ zSDpZhX`qA#R;aE3vJ78AA-qAM$#9^~i7tt*iEfGRke?Rjy$HpDrUrV>ro`vOfDL^a z{wmxvvB>hQLxZvYOG_S#J_F&1mDuk%BZy;}xZGG$8T=yL8%p}LT1gm$XG9Y<^cZ!< zj0|B|PsKn^RO=fD30kxx~+BYZip&kv!P+vK8O7uuvkrY&NoJ(p=EZ9X^>yAm6B84Y5|a}-5BR#Y z2YgkM5IUd<*2?@b4eck(jJ<*7Vogm94~3H;*a%!K;pC8b6K z=z@Q(mj|tYgg(_OCR?Ft0Mve;1>Pjra}M-KV5j4N!{NEtI2Q4Ij8|@RVJxm9S8n$u zs0SZw87lkFJo`8&k^92ryhJ%KOrDdi*1smJupSQ#n=^U#GnsG}K*fBf4g-0@c_2YO zjivjekPl=%m?-BxExeX2k6c2Bv=#;h5o`z@rhy|QkVZ$zJ|LlEBn9RClY$n_b^ckD zcsTJ$BKHL)(o<(~LViVQNuu0$l&Y9G0sa4FkV5)<7D~l@u9Z^4i0a{j7ZVwTf?B^V z%Uxw@Vp)QGTdf&J$S}L(2njenP0M?SWF`O?B=1Z~Q^LLV14Z4eoDYuM^Ox!ZmFPqabmS@je zQ;Ib;QS9%w-)ZzUIaJedMx)wq=qh+i_B++=;7*JeA@g8?Y*=wv(AUKVi-oDMDSr_x z*7qdqONryOZ_o>gm1gt6%fS3C$@~gHCp2gkRwZYX_c6mJ?{f(`bn>agB0Qh?{|%gc z<~vkIZQ(QCZy^=jf&*S-Ep+rH}E%hTKXeeK`PUn)?ud`0YU+5GLQZT|kVhnKnm ztRAi_bIqSPTwi5op56poL>;cLPUJ+=c`H$7B%L*8Qr`xt)ZzNtL{21~Pvh?-a3mem z!}WCuIdIO)k?pXs#5*(i;~9QzC=te?5R8TzU~H)0g>1KJ@A?90LGL9#0(OIqw?goo z4Q4uT1m+Jl<_uab%@Ll}K{ftS&D`0)n#hY&_pbaJTSH!Dke9Y?(nmuY49( z2%jGN+h{F%2dzWv(MC}1cU3hI20y>~P8tIYSkd0Zd`}r62=|%U^Zj7YsStz*0HQ(= zVu%Vsh#@Kj;emun2*QsO2NO#RKS_L=FbzTY8Hk}m5FSdHMjSkxC?n$F5fDK|96Xv> zT~@@wV+qrUgU1p`xhbaf=QC}lk=9Yx(bn3<haOTxNpGc_jZ81wboy7+S*EqhdIdMPIVB+WPvE#$(&QdF^ z>(SdVOD%RUakub3>i#u6kR8MhW~-BD^~@QHoyDFTIs!+~hUr)L-#tBRdWcOUn`Raz zsE@2)b0hd$G4<-DV0B&eqVQ`%_H33{MlqdK4=-;dl2EDYc7(;lvvM%y8?FrKDwpkY z{Cnb0yBw3OrKq*~Qm3p;Da7|DrU`qYqtH;HHe?a4;%@=U>B)Fo#pnz{`%2kFim`m} z37eQkF0whCg?So~!L8yHJ%z;QD30ZtCz{4`b%|c&HWtT%+>nLtTa~Q@)lo{hJ%#XXId}sX!q6-l%E|i!CGR<8-VRh({IKw~ z!krc`;ewSdY{pj)WX~pL*B2#gNuhF$2r3II1z!M6A-`Iu7{vGf1L|0ift}7DU54f@ zK@G)5qV7T1SfqUipZ7pGaR>%5ana2&iksTVGVIzVQsOFc%IlmRDBI&ktX8# z;ss(NB1V$nbC^?MpO@7IB=g2<3ROjQfo8c~;M=mgz(wX#n}bxU3$y@;>H-*|xkOprG0>apOX#FQObpnQ|RP+lr^*DvHmgWmnNOG+;~dV(}8O zjn;rC3)_j zi5obcYJ21;swYs2>IsyhY67L`>AJLb5xa`r#O@;H(yHGnDBq>kCgwP`7D3w? z*Kwp1J7!>D+ad)WNAU}0(B0N&@}^s7SZ7*iS+_(!jC>T?8rc@v9=X>#*Lr^Oj>yi) zuE_4lp2*(FzR2g1FC+USDHI}YPBm+Ft8(iR_XQ_fV1+xk*2UJZBfZ5+kl_Pa6rl`0 zde&#f1=bhx9<)AWU1(io?IV60IUe~gvcmeB?+NRR_7=r0i(3_A=HWVXarRm+&9=;X z!oX;-D8OjwnBB?K4;$KNy-K{n?3DXz7--$d^N+q_S8~5cf2`sf@l$I~rfSbH$@Dt& zO#9_#+MmwU2F*JFvP+>b*#apPA%RIySR6uHS@1Z}oB6Br-^w2>uE{qp?J}5Rjc*9# zJ&`Q%P;tCcV7!n5IBv*p;bQK4(E4i+f96`l2=PYI z_#!mE*f3HYCH^%&Y~}6MjTXswqyN`;>uwUqh#w@rP24Pw6-!0c&+YFzFe6{1zC}D+ zZ%Cj09X9o3pBf_Fm5T}g4Fg0i0`<@XzP^c{dMNvS2$R<#g4x$0%45-Ah8S)ek#)ep zmm%QChT7QM+S}QOLu4rYv5*6gF^6w4hsT-288f&qd=2-9m4!0pRM#eY{k^T8t_$sw zy{WyKJ#D|p{z!CjbV>Bl=ws2P(Ph!)(O$00UAKz2iMNY=Tvxcd*zXYU6eo&3>^<$h z>{q(3a;aOMIHNXtMk!^>Q+@;N>|~KB6!qyM14T-gbP228dCJns=$$u3JP;l0D$Y9L zfM)pT)S<CQ{$>G(LyJ}e8X7+aoaPBu z=P#;<51tI|NOaE;?-eV$B~*c2$yl8>EmRIcX?42FN~l^^LPf1^DN&WmN~mToDupVO zYNk;YZN(uW_^~)GSyp8@cu@oAJn?>UjDNnkKzu-aP<%+d#NEohP)rq8)%zOm2Kc+a zT4D8EP(tUBnWj(;5`bsvH7&3bun?+60yUjAot+>-QL6;hs_$syZtJe)ZRc+9?%?ju zUIrWc4~vh8i^V14qvB&?N4M44z`Pm+bZ#M*r1W`&1XP;_>d?S>Bv9X3-&j#apiyV{ zGO??>o4dQahkLpBxVS=mLhR}8<-XkA+uaAWk++R-rWs@3Y36KZRMQHQo)WFjs>YKA zy{B27)yxypsIFFL66Ar>&a_dk1LQsxoZD047TFn6LL>8p6lzS$mQWKK*awki4E;2X&ez%)H!%#93p7B&KzC>NY-yB% z5`;q5cf2X~WP7ofv%T3q>=o>4@hx$Uc!&FKajt)@_>S1b+t#;ETrd8l+?r8XW7wR5(LtG_J_rELlV{>e) zYK=1%%C@QrCbo5hxDjlti78bRa!je3kYh^Kgd9_H6h28$_XZha+A0j4CM#n z7V$&zBh65nSRq-0sRh|~W)?)2WMV;fm{}05Nc0ev6HE-oE^)WG!`xuVJSGNX@2L!i z%-JT_VBp;Ln;Q(7$JAhaY-TWIQDqnmS(u5zkhwlB+hFW4HyCO)je*XZV;|()OzeZ2 zkYgX@gwq(xN5rGzu~QFa7S@_k_xsc!-U@?wySP)_1A};Ari_HOqv9dxr;~bAgr7vy&iLSxU_nz0 zKUFSPC|Rk8fUA9XpuOy!=m7h>c*y?=OOfF+kOUB2Q!PVQb=1;*vDO`7OUsHJh120U zY8ZL&nnJ@#AdL>Ya3$bB68wQ~(44G!{A@rkNWk-T27gEC8^)HTHEB!Qla8b-;0`#G z`tt#j&QOr89&=Lsj6i3d)L8Mk4DxdV_-?JDid^w#g!oy3D|N!Mbv8aO&|GIQ(^(~j zcaO;m!fy^-tMjTJqPSC#x)mhJw+AlOnF>uR$w1@5m zp|0@El0scbw)XIASD;cF(`@V{l43HMtdOjjtdzv$jdgNz>=+5Vl5&l;LUw1|1u?Nf zs$46%WZh0zCRPL!pF$=kGgv_RmWjav;+m5`+!vxL?wq=W$5qK1?+#h^)GNnWm**sF zWNn-)P%~L8nMmSNWAY1ia=9+e2yvJM!wA8zi(&}>XoIF#VK40iJcHF92XQ4rNRP*` z3KNg_U0!&(aRBNe7wRQ@f%;~H1_#cIU6?e*~;K7Ib%Ee=6Q-73{)K_Z0_TNVn{|#h zP_TYv5UaMyYu(owAuDQ^Y@PgDB44ymt_ZY`$#Dm$49|At3u9JZbd^?-60S&JaR^x|MbyfI$oDo-`Z? zV90?+3loGM$%(>L;Tpv<<8z;kzIfI{E8r*$J(G6}_Xslu99SVo*1WQ0;rE!-01a5m zZSoo;xBvPbsWGJ}+2rw-3hwn}Hq*uZ1J+WaR$GiiRac-fFaX!3vLV!%BG z?-yU0{P$|W4a_iRI5UE|%yT2t$f^o?hgGf3F5qiKe1eqt&9-qvu3xL~BOPL)NP2>eSVM9{+)> z0e^mosD+@m)G8@!Lv@qtR8FSlZ?I8&UwR}=^Nm2-gH_!Lqh=8G(`2qKZ^5^QT$F8e;|8yB z$9`CHcv9c9ucb4{8@%SE5Ou*WFYS@MB`%@CWbSHAKxI|0?)d6K{zfK$2&fSOM=9l{ zn2a$2&B#TF&Wm?plzo!|*oA2kY#H|1*3-|^-!s6IDy&v`Z+KofoY&lP ze|UcQw&ZEM0MKgmjfCKtH)Z?GlF2}IbSsq5QT@~fmokO=s5|GfvJ$$21k&hA^|>p# zVwUAyufCgvS>!8l59nKUI4>uW5jd~Z_H-D~AM4Vvj$w1P|bin=;z_^6k``;zxV7IW2i z;xTAJ^OM92TUft&$puFJROSbO+3>;^W_}R#8$dRvga(p83Oxh{GFxjF$PsVD4%Ql6 z0Tz-&gLt+p14HW0>-+=gd!m@pF>F?jjq>Mof)7=qZ>2; za{y4AevW6DMj>GeYQ~)TKf1hpJh>t{#5UCSpI%}q&KZNS2o8RiZ6hi0G&}rSXcsBW5GM(4~GroFG1jABagOOAG zrJ+`#&qA$3j|ECm54ay~uz97ZCk^zXfy+styKS>w4$TZkDFYMFi^-RgE0ZsS#af_h zqZaQHJ+8hy0lt!a)o8-iS@AV6j~A=K>1F2Elih9F^>H#I!vum8@U*%L1hm!!0BAvP zCR@?DuQt#9EnvP>W6ogaHDF2GsE-WD(?hbLEqDRTbtmCm@eTNvWB`5jsCKolE?|A(J68l}llfYBNtVT7{&bN_?Ze}lF^i@%vRp7jle|LZfr`$_tl zvQy6io06N8A0+?U?S}vEd4L)~m;c8$9RB?9Q8yhVG*|uVl)uyk(jcl|ouonhC`pmw zS4WK&^P}WdJY`z-ZC8>|HLeu7nMCyjTiLQW|NRkwj#uecK=-`*n9rI z6KrEvA@r6$H{$7Uyf2N`sE^U$xdWl?#ek1v&3D>Afy~CJnPn9QKjxdYP4kRgst_8R3zgE4gl-`vNoX7iq)|qj zFteGZ(RdP&&;*+0R+54;5exr8bL^pi>@0gYX&w*$^urq(zqF1d2QWvIzZIV>{=Imf z?S9)p#^c(VKfPc^!60TZGlUt+T+f{8+32z4=gG29N6VjWzes+Wl)t*ZO6o4uUngZJ z>VIe5GdwTt{g0V-&tyR9^X_e=1);7B)qqb4^19IRq@&>3*rGr2+Dz^}9xAhQs0%}9 zGpjVZowST0bO&vcL+DN#lF&r5ekg;w_$(XL6UmCc^O>%;3z$m2t@+(-m3{9O=eb-i zw`*O<7;Qp6F{jsEXVL>s?@5ib_2F_j`9t!@O4mOEs<3 z<=icS@|w!7IxJ%Unv70y9w?s%j)OgW7(QIPOSQf-OLOqM()J7=f<42EC6!7lmsBZfj;58BaJPBFI^|Sb`ToL}dY<*w z4?pjF!FOG-U$B30KyYC2R?DE^;NXzp(BSpKrSWC)-;;kNQ3Xo{YXw^cdj&^@mA-Of z)#BH1Cqf|G$!H3?3r$7S&}+Wws8N^c z=Tx!%KdGDSX0yq*BpY^AIA5fl_`$cnvpL_|ff00MR?iWC9C zhN4ul_ovvqqW^Pp>rC!0i_iD_`F?-*efHsg&zUo4+L^gi&e292op@&oS%U>I0;8?c z!z!R(=`DKC!-{qi(X&^iU+JxO;0<=*WIOP-VlYo`*BggGH4^y0srs=E0QBHDk zO_sABZ4|(!;BMSha*26Jge7guP4ZuCg}`4eH>+lL&C;aq7+5n)<||#Rd*Dem3nJ|~ zhL!apoFn(>Wru>p&p{6Lv`G_T`Zxx~?lo1J_svM9)~l@dFq7CZxQ zbnnD7u$AF6-#7XxIjZOYL&|so)^{NBl-x|&jbqqU=e$;i7Mul}Y|S_ewlXkYfbI2} z&iWK)^_gDrqj!e!l~X9HC&UCE@sXJo*1#h@t=$O+8s1CF!GL5!kM!bfLyz?4nh8CU z2N6u@kv`lC+LOMy1=yFf4L#DAn_2OVS36L{wsVn7$fe||(wPocklHOrs9;erKL$2dG6Igndfx~lXbZa1qhVoZTGcrf>) z_b0=z3xE#NpZn7Lhh2s{yuVvHz2s2N5qhEY#nP8bUoPF@^^{nSZ)xI8c*$#1I~D_> z>vII?bDI$|vY^iZZoBsjYsNmZKX(APqVy2%Fz#?rVIU~%EwQQ3FTEx9u+I*jSy86n zD?)AbCM1la;XdlZK*cxP60vQuYfMHhRxs~x<1 zN#_!a?^Y){mOGAXUlK0dcGP-^m-x#3Wyf&CxL{c*WYZ?YVTiP|HZI)V<}x6}(%vp| zdFYDJ30$DWr`vL@LR z31uSXkrg;`)QtgAd0Nz1Zcj@=n=tn9{@m%@C~ivV_RyK!S=_y$`$G4J+LpB|YhTu( ztYcZHvfax%mvt$7Ik_$wDA~i121y;{Y^e1icAY#>Qcl+sR!WeDPUXZBsUT0gks2T; zai?)3xtl}dxY?mOp$9|bxpTO4x%nX;uA%9@05aBn&8-Md3Z2J2&XV2mJ*W}_q?*oi z0Mtk=3(cTw#7mafhQi_S1g<)KA*g*1UFL~gGl3VIIOcMi4r^7emi<8 zha$Q|hc}k2yCOjK5`8JBdw$l0=oeyfX~Md2ws?LnQGGw>$bI^HO#PNaX&0KMsw{kg z7R$MkGki#cq=DKULTwReURY5*YcDGM#Pdz^^zfVHs=yaPhPf2_BKp#%nV7I&W&|j41r3whFQThE$Wv+uk>EcP5IREZ@xC!a02|-=47pT&;Jqd@I+|#<%{Ovh}xh_Ki*E zZsY!EH@&BD|L!^B|IU5Qmd_9EZ)~pnTi?~GtBcqD_0E-V=k&c^W_Z}03I6>DhhCUG z3A=DfhQB`e1tT)wuo<}EB22V4GuoNe%I?fmuXRo1?&Pdd+ZeIv63!~n-fS0(36O^j z^VOu9FUEH?2Czck(bKt>TtRnCGRbNS-lJPiWcrWBeHpAiZFTD;d-@Lb+N`{1!oJMI zhQfse_i`NEmBq!Ku?o~@ofGR$tvjvmK5k;=$hy<(M%6KlcwLEQ$&s<(s!UZR2meBQ zK4P?It_c8{JZjE02;|6PG>|8c8%b~)1Q`>}%l#_wguzh|`hx34*IvMhSvNI7WxQ9p zrS5~u4=ZPLUsrCeo5Ouq`9|G?-1n7pxp~}t?#;UPsg+Rb(|}!D*WkDREN*k%LmYa6 zMj}>;L9}{gmdOmGj39uJ_cd;;{U&qT#wF6r?w8yR@kD%``zGJbzK`9XxHq_y@l?Dq z{wTLCBE;o*+c=XP-QBe=;ge8rsHK*#dE3lf7tJfIi?(}lWyG+TSyo0?w!TF2YUdt= zSXZQdiEK~sdrQ6dL)o?UnTL$48eg@5Tgaia(gj9$gQ~Imhh1n-$dg4z+k#B!O0)~+ z3UJ|yE|?c_(;63ZPjOZ^%ujRoH0DTmBi0)xhyJw(3+%}PJy@WF*(FsO9a*3g3+&DU zy$qo_lws@NbWY(l=hjCz93dx^re1S849>2(qWL*cNk6=}^^ZbuD z4)zZAJ_NEf1<79A0<_hrFP&lJ8-!j zxWW#6wiwKjm2_EhWEBgnW`XBuU+-5}Tj#rCDq)M9jp*hOI zFIftc_iga6Hd~nbP_jY$Lw z?jW(ykKPw(h=kT!ym=O?=R59u>P)8qt_=PFJArHH#6NN`d8ieQxzD(zep~%dEE)G1 zRYH!uL|a!_K(W9&7I=jQWC(soO@(dAdeihL;h;cu)!df6W(ViU>vZxQ*+2s?!k@zm z6<1g$>dQ4;?fuIA#_iyK=l&>Mqibv6gHy>ahvi1uwgwT?fE&%t`tQqY!v5fyu zdrf52U_B8wufSjB984x#=%$y+RvKWQb(Bz!2`hN(ryDdWo+X6%qK6$}UUyBX*)k`o zR_O}vBD z@~h}4J@`sdbz1R2L$qdA!@PzFuR5+^81b8yWyzCmbT`kFH(B6k<3S=QK**Z%YU`Jo zgUoKQT%Ev=L?_uEuD5IF27W4e%Q{vaB*7P5US@Af)Ayu@CWm?J_~G8;y(f52^q%bP zSbAjg@rEZFI+e!x;lU>x?n{mEE^N3zwWwin1KgB0+$y%=lWbNkJ68O6GRl#)@ZDUP zn9)q(>>P#ZCzsmg8lK1r{!mf@JQjUB;kJ%jgkOpeWM{J@A zF@rO26E(IbdntTj0WDVc+Z+oDR{_H_$Hhc7<;HIW4gpWbzFST@>u^{+2FJ zE%|}v`JT?#NxFJ^*yXtwG$M4S{z#m9e2+(l?J_t(xo1tAH z(ZT#rbm`rsAHNU3FW;Y^PaGl3RT%ZYDRYYt*Y9?B2oL33zD3B03EEx;Jd{_j12V@2 zc$&6ftfwpI>gBRVWc>Rd84PzF?+W`ig->)jQYX1ib~#h0xJI~6b!{%&Ki0qW^TbHk z>8`)(3CTaFX)|IoWB11Hi`^f4AT}#DJ2ofwU~Fz|UhI{`{MbXWhhvY#9*sQ~dp!0; z?8(@I*uvPN*y7kzv8Q88V$Z~u#+JpF$5zCijjfEWimi_QJ5NRahfmXvCI6j+LqAW` z-Nm6jY=X@XW8Hg|vz-@%J=-~rV-oGm$6Ss$LzKP6$l+}Y1`+-bPgDl@XF3P-*4W`Q z3V1=M=5CM-;i=f++6@xCFfz$ZTzp|fO-5fBVQk(N|Jc07ojVo%|I6n6z5RXsr>)+0 z?ekbO6L?0gejb0@@O{IN4L>#f+~7)_lI)rEB)o~)sW~b2W0^@7f~8!`339|`n2H>X zV%87O)qk^**}6xq>iwR7)+0OjoxW?gd;VMe0+^%oSiU~hkV>SIsZ^>ll}>RfJ|(2Y zRI)Br*I1XX@*C{+TRz(K zBQ?z=nOAewV@^HT>Tv${#^d?c9CR`Q>y0xyT2yOJ>GH&5YTpD}GYgDc{y#8dC-HxU zTgfTh|80jS+tZ)_7dt%p&l|Q{a;Y`;HE!^fgs8o8Cpm@Bdu(>gM^KwGFbZ)~=2X}% z_l7L{PY!Y#KTSJD)JzF(NsZ*E`R?@H<@3e6CA%jXh7v-P8E=;6eRDk^=&b5(RX;VV z{wx`0JV2n?@~NHf-hY#}dO7)bHr1J|*xmcTE~8rFqpSU*Aa15vTEb&&rj500xwEM4 zG-ytE&C=X<+BiN({Ki5O>@Qv=FE#RqKQYV%W0Y_EQ%3n5zU8~)#l9VO<@WflOr5P= zU$)*bpUbxtRN^1g{CD;M`JXq<%t^KI#Q>7vR$E%xUdA)b#Vgy(_|B$l5z=IzWzkB0TKr18_25;olHc3VAA~u`)%;!-XYl~J z$kceh)HVF^?hYR9a1}Qd)Wg+|o=(MJ6&(C(oV^O1YpO;^D?)~w0tCSUhgBh!uXD|f zus|)>7qlwhO}rBhk8zEwJ+VZ`7}xRF^EdMogOh?62UC&DgI5HPDrML_L}iGQV@exI zTKAD)YLo)8Qb85?KRlpT#ZKmtU^zy1kjcCVoW@~x66or+#AAGINjsC*dS9`<9o!La z+Z5G|AAqOJJ74mBp#@{8T?HCkifk>l8matYSjshZ+g5Q*28J% zot|MVBlc{4Nxy=YPE~6M=@#w_{sOQh6trJ4w0|*l01L_F-~wdSN?X!juYW?UO?`+R z4AJH3|D<<;cRv3R|1kduzaK=r$3z(I9F>4X z70_-ivDZSFdCS)ze(Bee!Nt&!V(7?XXlOBX6bs4ZXu6m(Ifey}rGY#-u23GMVj+N% z0py^duo^s`PLd-h(7-?#NLWzq9ZLmV<$Roff`5`uS41Z?25@Z|$q920RItJXxZ{l^=fSdV6K^c7ixgjs3E8BPr zR0sJ4V!Hg>%I|`=z{z}TlimWVVCVIMLQnx1GY<1!5!@@Xccf=zP4MeP--y+NAn*~A zAhjWEKq!J*iUf(!Ky|1_H~z@sByaQYz}`^Q1e*Y6-1?!bHnrsHGl{o&)nVYf{J{~^ zVc_AB_js$rKt@Pap+lg*K{dJgKv)%{`v%OB$LVIsk;N?V6b&pSi_9*Ki=2=6kNMO5 zj8i~75ZU!otRf%s_xab5wd50?5g2V%iL3&cD0_HnthTE9-gG^Ajm%4KAZ&0uCRq?x z?&y(2Wxpyw2jm;#`aDQY+4@zzx=>tS$w3oC(_a!yMq<$L*}`9lLA8zv?g(z@zW{^U zhTa|=9|@3p8al6#T(_}>~&3;`?q`@*APnCfsMsr zj-+XMIl{5P2Ds^>cYOE{tEWZylMpc^h05SxO$85$bKmm6@aQ;EfCVisfi&yqCO`8j z?pNN{x#4e6H@s01O(<^%uiq&2gAjnw4%uH!{Eq*g|AGIJ|B3&dw|8;Kh-&U~qAF+; zG}-Qur#jrhiJ9KVe~loCa%nZ0|22|_o&8=KKj?|?gVZqr9?QI>1j)Qfc0&(W30pxJ zHZ*=SK{~vGr1sp_M0K1`8XT52xZ3mT;mT=eGb?;Pu4*!Ycm*WJOri_)KsZN^pwB#W zL||{OiYy?pfXo6J8jy*?0=EXKt|gPfbj;?qWQgfv&RkCBNS2nABfGIcTNY?X19{Tk zfvu~xF!t*XI-p{Ca-{A67Wm*NPlg&m4uKr$NDGz8K(-M1-gi z6Y7Mx&_<{i8ia(96jFlaiwb)lF83M*SniowVcn#K1e6f7(mpKFlKBNrIJ$z-A-c;t z*k~XWYap^3xQJhn1f`^ww4<%XMZo}RPeZF=_0fU0XEN!?0-ac3cN(ZAU1_oSY@i#> z(>c_|%Ht&Mg$_bnFn?Hg*q@+|OJN0`5fov7zrQCd>?X7o+6f))8ln?a!){h_4zjzT zgt9c$S(r-pqM=BQO!Bm1y+XaMJn-yZm|4*))W;6&YX|nT1NX55_q7A}D+YUpa#pZ} zbQksz_7r*udkK3BJ%yg3{aYp<&@%bJmdOXTOg^|}a{rdehqOe_lSB38Hw=6D=@mN6 z%CEQ0;dbB=cHjUzaG)JH$PPTx4jgI+9%Tm}T?`Hm4Y7i5(qA}4I8-=H7#upLIl{5_ zgkGWJtOUJshS`C`?ZD&hz!U7i6Yao^b?EB3D|TSk4&1F6JSlXtH6sr>N;q0LMmQD* zWR9Fd58E6WK?76CWAp`uFT5p!r{UZ!T@2QFi03I3=xhLh6=|C!-V0&3BrlO zNx}p&iq3EX8A}6wD#jTaV5cX2DlYI+Gw<18CQ%)2Dt3}nh0`dr2sE6ZMuJ&fXt?Lh zVS>{^f$?;HXN63jCQLX=7!3)}F{-MN(}z`kD$Zr~I?n(=IDs)bfffzns%W53#i#n3 z0TW=^Ceku4fU*UFpiKcDa+Xk&K3fX0mjZhmIe!Io#H__HsZyQ z_%b7LA;(LED!tn_6-+&4U}Cx3EwTx+#LBE38*e z7ETdv6mAl37H$!46($R}36p|TzyjDb&+SmuJ!zp+g*|AYE^BaE9LY_>e>r@V9tQnM$F2Y?4?{}G|c$^N4P?POoGka+Z`egZ!r%o1h` zbA$(lxx!p%n3se}7>T}4EBm2`|eej0Zc;=4`z;S@dkptizpyLsR8-AMz?91yPB}g$dd=y>KtQyL}Lo5 z@L2{&4go#pfp%_zQ5RMS&k7SA7#d-vuu51h%uYThtP#xc2pVgEG{c-i)*1RImQId8f#0AwTD0P8Pkx-EtBKTK7-XDlM`6rL>d_8 z7;a`jV1M>iVZHF00Ou?;-^q?sXub`?&5m0fG8skl$z(JOcyvz)s1fSao87TFi{7yr z={Vg%9eQpOHVa#Xt->3^P!N6-2+;*SSNVWuL##TUKeh3Y!oItwh7Z5 zcRJ?Qd>X-Ir^INREW>hQ~xbLizKxIU)Gl1w_&EqE5x=DtvyS`RlX=Of|0 z$PCBF!Y9I~!mklz%bILB5NL*Tf#G12!EabJm5r4A;YF5?CJUaYn?##H9>tYw6Uc+E z-02l_z})nQOtemg2j<0cZmC%9LdH%eBU(Ode?XQzd62HXy|ryNO?U}8sp8~{3u`9U zjBuRl_{KW*p;gC~ zhh=$$B%E4*geAo!T|R;i@{`cyxTpX@n<50e?7{-aLPw@?qN%?+H~%6msjy0IQl50_Y&W6%^CDfUejPLzzf@RT#6^kl% z2x}_bqDS^dSI=6Lq|X=(*vU-s)d)2ENZDe&_=DgVzuJMYPD&u|JB>8)c{hN{+9rV z>3;|@{V!2a9^1^KyxRY4lus8c&lM}rH`n`wmU^EEvYFl|iBz;8a}Dyf_gmVLu6~1y z3L|9l7ljeZh>Dm6>6S1;CimCgAMB-n>1E;z>0&JLg-kI;@rBxp7+4E36E51AUnILfyrp_(HphZN+xt?qV0Q zE2yvsD9pqcQWgHvJ1>L-1PvVgxQGrjVTW{>2|J|1RM;U?_c+8pF_x()I~WRu!gg_K zdO;7XGeV(&9uCr5j9Egb6rj8qD2dWseZ(Nm<%YLAWufv=U*IjLdHadrfL%9zSXe@s zz({ejr`SW>OWa%RDdxm|#Fj%N?JGW7`dI1Xr9YN37PJx;T&nGiiEAp7VoGcjWy5yv zsMt@$;7AXE*&PBpV9ht-{Zez;aazg9lG95@l^_ec{?=G<`7?p&#JNE1ZW7J(rOq;E z+fcbP=tP!!lLgb8!~nY+yc!O_nhG1cT7DSA;!zNRlLOcw)Y3)zi-(ANMs4Aq(bs`n zHZwHOyeAMOS#}4Vg|g(y7Gw39gLE)CO)V z5a*H3yGzaqO)q(qd<)EsQ(Cn)cYX=&IOj0uaOd&P6P&+BP|W$zAX-mUulVfj0-ROA zPny!2fNG;wYNiwam^sC6bznp*2cani6-m^f+U z#G*K9W5n^|IpWQsNunAj?PBo~@lw$?PMT^cCWS5&n~9T#1SW8qxm9s}dR976a)bWC z0z(@nx;{`{OkB0@;@8lvY)6z$$GQdt)EI9q3No(+hzZQrT`UUBcC~n&c)b`7hr-Ki zivqLVAle3IyGp!KWXh)oX1fUrt_No84knVwYVE7#Cr>wmP4yy z0ky^r871fvzQlQ{^D^h<&MTZ(IIqU9@|cNl*^CHOHDKbxv$i{LR5HT;z^B zsX?Yk>&uZgZ11UOfd&>x(7=3>a#}tG)V;^0rOV8#c{s5buDwFSRiI7@{5IjeG>Baz z&KBp04~lcedE)x$Yth%E8=@Pd^TpeoQ=EH+H%GTbw?^NHZi~JdeMrREfJ;kXv6o8) z4BQo|pG6-jNR~+jEF#oOgMV;0Tc!(|C!OeOMJI1FfKw}vemxUM^8o**s=J+!iI0mj zoapN93DFuEuwQteaFK^N`((6-xEw4y6>IsLHVINHn=G8=h*&Gqx5nU0SlV(`(HtPg}r2VwCSj&)B z-;7-mJifvebH|Pi9~T}L9v)urWMU!eR&qtq3=m`nPPA;pfm|@U`bWbMCv|JUMc#5Q z7tah^=M~Tbzq(hzBr@2jLIB}`ia3ZasX4c;6h8oyVeF}@nd&CPCezjSnLbyX=^8du z+}>Xc*};n-(1z-p$Fjh2G;lQhY1x6tV=~o3P9QIcFN!aTUpT*Xe&yV^?t(C~T6W^q zd4^?T;zis`0F8|v>7cQ_eQ>YJ6F+0700_d?RU$>`$#pCf0`Wrs^fGyo5FXdq9{ zrpE_7*kOV3EN~7DjDh}@G#kZ7UKclr55l>!kA_Ev^x?wC2t738Z`YK|hjfOtLx_k#If` z4l@Z>d+=>^Q&pAg`tSweY8SF~G1*jmU}bo{lp17CxaND4-4J^p3jP|s0r7#j0Oouw zxHgMBq2M2~po4rU-c6?Kn@x_KKAG4A9aU@XGH1tFH`ga3#t=o#NXVZyR2iMcrh+O2oa0y=`SuH}7Y7u-=fV@g4_e**5x{(Fu z09$1n3?PTVZvKtMb+DU%Q!$t$n`!-XWD5=C$yP%+%7)zDFn}BawPYKuBG%NK#n4+U zlqYW+l28zceuo9#HGmv)(# z>m_jFZ$M25Vfj90p&a>y)+|6irFn3h^BS>?rIsE1l}cq&K>9rVRoIns zr#vZdswCx0`BSB-vQ!{do(iTaQlV5hRhgQfHX{;$l0G%|Y5KSDj_~i{sjfR*r^QNr zTgq-Mzp4EE*afi(u?u4pV@dHDPE;UFA=|-|P z{CsR(?3LK7vGuXnVz0+G#4c?7Ew&@}ud?4`f5b?gqwce^&&$3j`?Aba=dCNN3)E$T zrl*&rl#>1(FQ$!BTH>S*bsg(^)a_NbcU{jqK@uh1{Sq_KM%nt5`fnd*dSQQpHQtF} zQM4tb{#k}!ZMn#%s@bkNt_NLnUGrSXxSz?W-jShM{s0zS(P_IH`iTR|>Jr8s4c>Pd z>}srw?pudD8{NZCxV|Z45}}8Nme^(DqAxAU#7zTE_!G6zN~9m3tq8W2+DTi4r(93F z7#1%qsZC-Tq{n?QZC$FT*DokZo{Wjcod6Al`qOz-+v*CfqK{*w8R3! zk6Di|8Q1rar4eWv3)Z7a{5n(#i&KM0U~#G5+R?b3q=$4=opq82X8g?B3ue#jjoaA; z342R_GE#L<>G-;iNhXH0-lTdYX+6}mOgceyXcN*vje;!#-voMG2dmDP++U%1& zy`{YLsqj1W5M;&*)H-4r)Q;MPXtrTx!^^106?oHACVSF3cX#dKvg{qX$UZO@-VnOG zdf36k%8oCV+1<659dCEn-ga!9XHdC+|V)PQEc%&z>0SMnSo4Uh&(XH^W6j+Ty*W;l>} zn8}P?*^aG0u=O(8^t}+A5t8m(>ZVj818*{TK#op221pjOZ|>OL31Q%mqlvmL!ac>V z?tALyRu1+JD?8n;%a5d6P8~JF%0}7oo^Hq6-8IS%9#%HmPQ++C-tMk5>|mLUgJMzU zW;_d=Ljz-7XB8yj3=Kana=J818ZC`=oof%DXAfU!4^Om*o9y5dK(P_fceDYNwJ{Gv zeLdYdcQ1Euci!E{eWG-dbh31cG(tL6I!ziW9pyXPcZPJPG)6kscbspad#rSpbhdP) z8;!^?-*BHkQZb{0%#38pko+}STnbtAhU$b|@XO5XwjT*I9P{fQszV0BWWa8#la{!i zabdTGdTh5<>@?8aKE&W>GtjU{8o9P^n2wWm7SBFQoE-nN(_sS zunaCZU>pJBwR%CviR$`f0{O=Mt@}Io_wFCuKe~T%|Lp$7{i}PU`#1Lv_wVjM+ytH$ zK&zQaD+>dCXNjsIQ8U}2E|1%TvM?9MOk$Hma%+7MGKYSnAEF453JF>#(EA>0mGE366{XY9L6~&v z#&g1Rog{<6-OK{&Mj8cj9wdfMqUwNz^E^kpQ#2P}>XoEK?I)h?-ZzN?se75Jbv6_& zdL)nR$#@h`)`M)88ARRFwlc_MhB-Ypfx!3a0cb8{AY8NiC3izS5nt!N$#=8wWA`WS z4en$-6>p5+Ds77haXH>L&Lqc$OzRSM08MQNaJs6KM$#^J>z$1DRE77o8f$ltca8V= zlmxoPd!)KlE%rTD&iEv?-j=fWO^WVJ(V6L!uxhd>grT6-J$Lh9ZeH^A@SDJTRp5(Y zj(n$Ym=$)n$hYvPCB434P!IN|NuPMEsTt-{uxqanmT5Mau>+xrwEk%wxP9V%E&;jwsL75|fRWpm$&t%E7-uIfXBJjFzgKwkn$?{FU&Au(ZL#p2JVIq7Aq9sy4 zlbdJHk?-}&FU(0~sb`r7r=WuVO{9!GARS(HMAd+*fmMU523H+fbwvE|_>ih+AR9dL z(TeGUHl8I7j5j$vg}3zx!;fhpnjBtxg46qp@d>sJQ#AVLNDoT9KL>TBuUg>02^>ED zP`q#L^tz14{7u&6POs0N;C2SQ_}Q*iP@Md^>nm=j_*aPWdrQ6ZK^v_eJ>(JTQE36U zkmLPMZ^pg^PVWN!ISVc$%qnww7dA)Wn~A0F??1$UsDDWOF#oTSnT_{0-q(14q^F2 zhrihqx_Y}>%NK&omP;$7XSk)@GHyAyf_s)*$*tms`j7G-?LWr9nsa*9(|@g_S+k%# zfLIBX7Z8)s+uPe(=^n^?rL;;~Ej``{y~JuP%`|y$o=vj`(yW9uesACAI$a-cAMZm@ zrJB;=?!U{^rrNd^jzcH(mT?-(tFbT(g5!OYc*rzsD1oA|Kp8=yn|Sx-kHzy5B3iB zE`Ut6tgyA8m(GJ`>1OQ&)@JG69AOW8!VvF}LiU=Wsf8T6dX_g1jUN?1I(|(2*!Xer zPoz(!e@U15U*T3YPN`bm_*`R;z`?;ajcXfE@Ro-yJ8J4Bw;T!5jT8t|o0cx}xzyFO zojMDKBI35?7jPC_X0$?~++Rw^dyg+@sLdldZodK>8=^B=UK%b|1suB4O_wJNTvS`; z$w1oKPM%cJNu1tlL!%~oN~*CZ8TSd6S%2^5}_(u9x`cC>@`a$|p`bqj(`UNae z)XHSGsZ3(DIJn(NtC%No7HGo)^(@d}06C~=;`b)P&Cb?Id(HgbRC8$};fOU&d7;R^ zNjs$J;_uQQ5|JIUQ+CO2*(2-m-aMd16Cs@OiCpJz<5y$84d>@d^Q8F_hLC$oS|&X! zJtwV|UXWgqUX@;xUY9xtHcB5zA4(rdA4{J}+qkc#UnQ?xv|`i0&5BlRI>Bbe=9B$0 zE?A1zVmhH{Ev6HSmN+`0Xo;f}ik3J!p=gPt6N;8NI-zKZqZ5jjI4Z$riBl#AJ=ou8PF;s%h8ly(8m3L{4p=VLF#?T2xYYdfOv&M+ZF}Y5* zU1O+eY}OcUAWgK8rfAKeD^Rp%Pzg3Gf(AJuw`xUzxz@?HD*{!x?TVmLwpkIVqMBI| zsKRVk1ZpZ?ZgxeW7rtmkpc9H#1UjK;^41AOlebPNn!I&F(d4ZXZ02fFmSh>4(K=UW zWJS)(yUDh5wc1yjnXC0qVLK`7$`wt@I-zJ%Rtc?`lsm{BDd)cSSn#B z^HXQJi)=eT>0*nf2bEwu2XvF!IiP#-9FT&o1*`Qhm38Z1EiaQIa$K&LUyzb=N>0n1 z+&Lh~ZRK`yd--E&cNwjJS9uRPPa5eN4tzP&^XMs>-wADDp%@d7^%29)-cW3B{G##8 z#38+*um$-hQUi;s+-9%r&iL)oku*uRq4x!6Zxi_WqNH8;1< ziJwLnO!wkGnV;i-(7!iChwh!+H^MNLfLd1a$J#?3ZRM%&E3F7#6@R&EUDd$ApupAf ztD;8)zX3)(2DI6Lx-Ncwe0|kxRX4={@ZK0lM)WYEF{&F-G)tD==lpZ8T5gGVsQs?- zUmPQ>b+1$O#7qnwbEA%q5vhifTnbHL`v?@DL5Q9i@tN_N&U@qc#~+B#iqDSEiK8F? zCBb>|15+<~=f@w4Z|A%P-{wR4SzBJxHvMjzlz9POVzB+zrWKaZ!++zxf7xZXNa=k0Bj<1QY zji06ULahgxyMhzQZ&gSvdK}i1Zhk$*ir{n6SL5~INXhb;-wd^b1j|PVhT3`Ezrk;T z)bEn@ARTu~wdyq=98DneoQKJ8*X~pMPVKw3W71>OgCidYe{IABxMQj%zz0Xov2M0# z4k=98W`rCJp|gMO0kt329#}i8nn{4C!6vK8mM5I<-~`0NPoD5BAQ(UnInq!asI^w@ z`Z+J^p06Dw50;0>$fBQiH{pJ*mG}X)KH3$n)cPU9ir{7B&G_Zyo%rvKA62~{|3qWc zvN4~LTW#CUjORzJnASyW_$dAvox5rLob`R7DUO2j<4yt;&TNVaWNyM!?@GJVp0uyp zU+qnoR+m)=sxd*%OrSQiJ?nwMI>2PrxBs#FiWBs&MRq)t(o_i)>e-I*AYdG3GB&UC zjgG47$&S)`OwiX%V5hUrIsjNtGFh!#?X)W8=~%Uzs7*B{+TTp1ZnZbh{uZ#GU}ZN? zIq5{9H0FTp`hyEz{xrL3{>RjhtshrEzW$v0^Xo6DpHP2c{lxmgG_$F~ z#r2oeUs``v{nho?)L&aaoMzLH$l>g#{)YNn>!;M83=9^J7&-&?t~=_d)!$iQNI|`6 zV@|#Lp_1}sPvh-H4p^W^j{v<618gN*^Onuiuc^n3z#Nvwp0M9ubk* z;^+^}lO0=*oJnVrBV%Y_H2i6~38>e*E)H{?RX|_9XhMtv_S~s0t#LG`i-6C%YZU|CEnV4!yU6h)Xx;S-7YADo{g@`79A`q`lbxGeUcTRUr zPnH=LAJG|nyviVfX1G*DQwKkKB~Ip%fa^kyfJ?<3Q3~ZSN&!v*SYS66XiEb_T>za>(FKJJz+EeA!oX)tz{@BbLEHRe087duAY9?56k;j#~a!- z6up@Grs@%@;9k6#zQBt5J^_iprG0fhDW3s% zBCv{4XOM^EwM+Hm@>~7|GT$IKFk~;W51igNob4e20H$@geAj=dE! zj*}tPM^=vxoDq21b7o*nU~J&5z@F)$)n^CB1;z)?37i`^FK~X~g23|fqpF{lJ2i}~ zKD~PPhMtt)dJu!Lme2`pM{j9t=@KoUGz>>f-fu(_Eft#vV%B$qn@^kVPTC-I_LSWugTVt#U zwrhCT|DOMS|H!~BPZ>X;dQj~V$pOiM$wA4vo_U`6o`*b(JOitj%2x%(R6pQ(*fYno zw){)~SN^a4&zE;=c%l4T|9AfH{Xh7-H|)`nPyguu$=|c#lIq?KS5)5aF{9`G_-W!<2;TUS}@{-VmtkxsO+ z&XL_&pfd|}VS%nJ(9HmH&>6tqZG$UvdM|_j$df(vj)rsuKG6H74(w@gfI5H6I>$Q5HaX){d`S?fc6qQ;>jSR^=2veBYzz$c z4DoCVNIuyx49jps?k)M?hW-tD;B72O6JAQvFSn_Iw_lZ=r7wA2_N?=~;(67x-t)R= zgU4OEF0je7U&AYbcRX7l@b^~F8y-(79S3{8JSZ6Cw|QQZUzaz?8|63UDt=z|+p^l3 znM~UiI>_^$7d-!&>{e()80!YgXijbe8&rKd(axt$hS6!2;TD>~T!=kY{dD!Snt1J2 zqW&Qd%eRJ;8@}*NPNJ*1QyNA#jM1{&MC)TpdprG3dNWPbmvvtSRZX_EOy1fu`3;SX zQ#RCuzDc|yctt~*_exE@?^>2oOM2+`9c7?>|3ORPR>kUG%wgZy+0KjJ2*#y9mw%|f zJN0Ari)FtA#%s08B*Q52EhqSu*38@*_|&sQvy*?&EM`+)WzT?fkxt5!yV-jIr~9$f zXoCs|^j^mJ1ss9B4Iqbrm;Qvn{L5>CHFD`U^0)GL^7k^sP(o;Oo~$lsvg}Fcu!>&T z>mR6a|Ggnv^OO9uJg*_btDS{m#ml6{OgWM>>>8E;%JeB~wR+JiGgJ4b+LsPZ{w5Fe*73vPj>ie!6TK&UJC+`qe7xa_ zhEAn%et7W7h8^8G#?}jxEYa6P|Ys#N*7*{qPUd;rO<;jbplcFcrzNIDd zKw~u#*wxi-_IlsE(sd2*ChE&?D!VoMWa)9qVaegiR~y>a9G^TPd1CTF+Kibys2ytF zrDf{hwkv|$8s2Gmzu}{X&p>Y1^3NN#H*_oiqTzG8Sf(Md>b+fKDl!Y-HhkakW5Z7k zKR37%r@+yaC*e)ZPR&WFy>@GBWGA&&(dxid;DYpknjtl+BsT(VH6GB2vWD+Y9QbJCgsC|$YHA{y?$3&W+pBkDtE-^HHed30Mz~7v> zH8DByetM*qo3>KyLrzPMOrD+`l^mTsBY9?WOmbpUZ>ZKShyJRyBcoU^8^!+TS7>?K zg5*gb+Qz(F@t$>!6Mzp%h0pT4@oo8be0#nF-;wXchclI#cj(On)8bcUy7RsHJkKzo z#n(w+ho;bvCU;a&>oE`6kFU)fz#qtuwTlHG$ppx6RxKSQn)!*=2Od@P`|$hnu}qE} zNS8TB4x$0(1^(mzxVmtSc72&T!}V2ajO&2dfw6;P2gmxy4v8HaJ1lm1?1a=^xWSrN_ggzf|(=@H^qbu_3V|W5>kqN*o(om-;L$B>$%zUc@uI;_{+R z=GNFl>B+I%VpC$b$0DhnJH5DopTJ+pPvn=R?ubo`-5I+pc6V%DVtVYJ*o@fB*uAm) zV)w@$h|P-4j?IZZ7@HfL7kec!KlV`U;n*XwM`Mr09*;c{dos2lwlKCRwm9}w?CIE& z*fX)Ev1PI4u@$jrV=H5;Vyj~hryohLiTz)2eZjm9(qHTq9u3Bi@C@(_^vJb6Q@!F! z?I8H#*`o^I1|3y+9VC;3=|SAW)y72T-?`ez2v+aQm?Hn&eVP7-)y1VBVOCb{|Kvih zG4m&va_#=qQm*yc<;Wp)YcVGGiNBr6F<+2B*!(5Z#*SE zBK=bOqx9e1ztBHM_aCF%Dt|+x|7QM%{;GkedmO4IhqC)7jJ56Xms(pX(~3{$_J5(h zwa;)DF4bMe=gDEle3Zlah%wJk{+~6^+06fz1Gs+-^gjl=RR;Qu|Dy&vn=wuFK-NT0 zAcN=yBRI`Ac)&n8h$l3FKE!d6cA55>4jIeQCT`Q=foVtBFgU_U4xoc{${Y?ESk8bP zWOvvq7((ZoBS+EzV;C3yR~g1GnXZ{#S-bvY9RHR6XUpJk?JaZ6f01$A_2H)*$UGTp ztk1ys;aSm9G;jfNldFNCoiJJ-Bj5vwE8wNVRb(rF4Y`(FN0tO{Bzr`DPu-q;$-75p z&&*jhXV;9Y`67WrMw>z+g`23YPhND#XM4C;#Ks!$otaARpiOVjj7{R1a784j@i}x; z-U|}nODFDam-r2@P2xU~_&z#u-^>(pdjZl89b6=r$!GdyZh^|c=|MYQHcvYCitHWf z8CetjIBO^^HK2J8b-{{Z}MZJ zVq#8`ErSJ-dJxw-yqjSC{=y%hX$Ym7BQ)9*7*#7t z^NOC3IWcomL7^Pk2Tm;25s3PbzMg)%qaepJysvsnX19uV6`d=#YJ&qW8aAPiI{nbF zvLao%{t+$;7OsAtr>a9b(!lkH)L+itPSoRy48r~3T7ZdCI!c4&dQvf8J8KKIVW>& z=Df_l!ugpCG7~ZvW+rBuGM8p9%UqthB6DTts?61yYckhnZpsW3h6^VMCkiJCIWnGh zSaeosq16SAlZ+B>$&Aq=cxV%IfQ%4s&73KW5ylGV2^R{JgiD1hge!$>1)E7{G8q0d zt)+30+cKj=XVB0TfUYZst}ljeD28rip&oR^ks#?R4DjEaIYqcVGc|KZW?JUX%w*v< zVN!4kRD+GqcY)4((n9af>_H24k?9$%L!0FHK=ST%@);R9l(9l3q>C^!GbwntFkQG$ zxE~tg7I+C~nFuENFV>?w;%#I%c~rPBGrMMKvKw4Yu4IWm$4Mu)#Ic;NIOU?}AjI4q9Bx4K>oB@j@V||6m z9?v{MEszSb22?x=oyNRm0-%E|u;W_@e5V@=sRG}k%qYuBtRU~P%woI5PZcMAI&+Wp z`NDM2aKG^WRM;v_!)J;$TxyreGT_^8Tq-VTxIFWjZ!E3!iVOrIqigt7_|wv}^&7Kn z-*_bRXl6;~+04oelR$m?YVB_(>({O8chf5v#^Sy*yRUjohR9S)^43RCcy)F)M1r+c1um^$$XrwUR?5cQya@HZ%4)P7iZZdd2rMA7$QhY$HQTKF{=M+@AR&lZrM*Ltz_GuDK_H?S}zo`;znYr%{AhKkV-&=NEJ5$OW{vIWmC- zE~J6B{7fL1836tbz~wZMCs)vFQcWrAsuMBPGN!&o6i7DU*~2JVpk)>UIu;o74j-s zRQ8F-%Jy~WC@77^B(xA_IH52^H5_n4VFKvtgK<|kjW^WSDt{sxFSgZ&`Y0sLk*kfC zf-<3fv-liG00LH(p((@P9Q*=s4Q*I*U*P{@XA}hw|(#U-u1obd*An= zPf()uq9Q3DSYOQQ7EuO^C|N%`9V7$LwX~639b`h!;`@&eMNUzatiq7o5P()C!24SE ztMNLzFgJ#oxQ_6NYt)cd{#%VCSRdr3@XZhtLam`?XazbdofK;_WP)nD%}AC*;HL0o zI$39>i*kMVhOoY~yA1coJ1Dy=U6nkUVkE}2AnkSo$f>|o8mJ|Am^Ib}%{Lgn7N;3S z!PkEW>a(^+1b*a1P&mreN%DxIlhR zl4JGGq6@^_Pu>8B-TlgynrCDeuVx;MAx^<50^o3w?ut!EPx=pl-)SV;hXW3y6 z*Ac~H0%SIAU{?p3z>WBJu|slj-E{6SWvi>3ueTTB#W!}h< z5VVm=7$L1mHlp&>N;T$VD`M>Ilfkc3yBIr6V*H@CUPI86(SdoG_&V0lWqmPejgaGN zWD?-#vOOacOov|0vO#rRjSRcGnk{C_kva6Vj8S%Qn@~HNw{8>mi4RrSfIPTOsIjWs zge()rycrBk+UKzToF2DFhbmHwp>led$wGx&Gc6^cmZeRQl3JD`fYEadmvBw60csaL z=Qw4UqDIg`*IiEdg`^lkXSgyjUgTY!_p1?cioC0v1jf6%PQXYvf5A5+M!NY6#9*YG zQP4tKc|C;ppRAmsV62;>NH=;3iXz>Z1jY@#NnqT-n*_!Uyh&i(z?%fd4ZKdUaRYy% za*{GaIaN7L8L6DEj8aA`x*Pa2lp;6qx*VsMaRaXtY}~+)QN}8};09ioo}7t)*!X)x4GGp&xHW=2DY&_*pB@OsaO%3|Ec z>vlC8;@F!S8UwI>%wi_#$Tk^xQ$mu*}9F_h1s}`S5sZ0G~+g2 zPgxX5#w0Lq<4pqNHr^yKZsSb?<2K$TFmB^@f{okw%aqHNE1=n}ZsV_1u2Qa6u2F2= z#;bj+8MpCzCsISaj5qrVhIlz&vGFFatLF4F-sDXJ<4s;Cw8ESGjmk~R%}T4h$?H;` zUdEfePS}Yz`CFCAij6mUJvGK5X=YS8y^N!IGfk?wG`2qIrzo@!`rDPM${n!hFqfXo zb7US3_`UO+%g5<`$hvAXjgHg%aC3x5nj<`FPsowSXnk_zaT@S@pJ-meC+(%eMARH% zVRM8<_Jjw+4_XNrC+$w|1*_k(pkzm%6ZBK%0#6}nWS8-bPimqT&rBCT(8`q+@hfC|J#&l%7b8Qnb3RK zRWK@n?NUP}*eo?v0u#u^6vYH`F$p#^xGKtK23H9-Gq_5ynZZ?p%?yqNn;Cq*@(|46 z4=ax-k1CHTk1J0YGx(GCGq{?8%?yqNn;CqevS?Rla5W2?8C)gU%-~3{nZch@o>rDL zH-lpun;Cp5qQ}1SF zOLJ4ND%NIxMS|@l`bN`An1LZ?@DrWMr1yXf~e3AB`-bdUE=RaVGwBmd*7 zPpUqx>Q=i8Z{NRC7-qb|NynY}O6lyUJRI9)S@e8qTKrqPOBCNJQ_0?j{;*-=Am1x{ z!Oc|5eFqnr8t<3-L1DsvwE2@A@J|H(z&8IVUPmtU;a4^M7EZh1?$SgSXkvkjSYQ$h zT+9NOu)w7(a2X3+&H`7kz?Cd;6$@O=0@tv>wKQ;nZ-P&|1cLPuBEKlVD!(Z^l;4#< z6q0phomp4bo%LkB*^;a;>(7>#8~4(}(9}+HXsR@8xmlxvyNAlM0TL+JdH{kB63AMP zw=q+U(7IfI%Ax}+Sm0R}SjhsbSYR~^tf2wRsd^}fdRVqERlu@+sVbHy&v~?tqjD_u zJRR2dGeb>yp);7R$cD1vY-P48Tb-@R)@FyKBH3s*mes?MX#0DnuhH^sT~-Z4!mxN@ z#G1q#pzttmym?OiC^WK8?IkJkDC6m=OkR#90z*@NGg`W7e z?A62>Wdq7#!XOlQ z9SbGMD`9MXqqg#7iv$0#0IwSD2RL@g^(^oj3%pJPOQDV|HrF(+6G&q=o#nE7MELAH zr;ru1QdZ7pv%6*6X4_@kXFFs&W;sCW`Qj%u$2bR48EaXl~-l-cUPBam+4g?M?TU0FseWTEWK9uDq!g*2sq*X zY##c=HbdVW>e~mPH)&{L5WHm@P@z;y!`GC)twZWz#bMFIqen#Zp zz7@eevpuqVW%thZ%;vJavc0o?v;DIBWcSVPmt~R!!6-D(Tua`y>Y?`F_gIK=LBE%w zMX?*v1G5KZ|C4U$8CCXx(zRZRzskM46D~_xS_Oi;coT}d##3YIB-pHIOAdh^;m{vi zBIqE8W(mwJ76DGE(8E~JK@Q9M=!`sMAMd_}toE~e)I9*QDxtF)2v8XdF&?0C`8y~( zINO4YXqp@%m9+NT!;gfD)_p^>a~f>wqcF?}bWj!si0|i{o9nj?V~b-Cg=ABvTk2+83wp@}QP{N`IPM6#T?bjd>Rt zovliYs@InWK0n*6w`iS|C);U*lP6!$K#qJ#+qoS1iUq!Afp1vgTNh(w7_)Y=94;1cvw(*Neh*iZdQE5(UZcN0 zdqeid>`mF5v$te#%}&nZjF~bSoMcbmZPt%sv=g|3m;y8A4x^L+I>_ztQT!AgeCqe` z+HyU+Wp>%+NC~ZAj`&!>&jO`1a7}4hrDfgXBI>f$TSDIs@cr)BTV-j%&OJ3V_( z_H$@POr=fP^@e%BF#D-zVzw!JQFc=H;_M~aH%l+gZuef6y*ztG_R8#4*{ieHWUtL$ zmz|oOkyRb)GotVf%dQK_lRzbQ2BSmdNjVKL9yWHx83?)pxi5Qv*6Iu-M}m4is(IFu zuwIYqqdC0KTuJkUDvb#Td7NZ+c8;}ss9;m@L6{pVXlZk^mueezQ02%MBMT#!)?8Mj zaPx%AYo^rPQ8Qmy6j>a3D)Mw>N#vQx(#W#N^2mzFvyqjNS=o8n7a}i4EDJg{tBY&q z+vWcdbk9rl=?*y^(LF-jnT)m^TpeoQ=EH+H%GTbw?^NHZi~JdeMo#edMSrO_5;zH zkT}^j5uZgLDTv9DTD{>wBlyXY2n$4Mpt`cA(y|ZXA`7w$vx~C$;^sOKpefYclbOZY zZ=>^^OM>&A3rZHa>(~pmEC0FY&by^if1%_4|2y~G|63gS|KGUjo+B}H+&96%e!=yk zD+m7;zH^#j`hTx-OWg;RA6CxhzOLL_H|PJc_Z)yx6;1E8)Z@}~c^66Ua>?B#x!11H zk;9;LMI{um0!k4J*ib=ER7Ay&h>B7aMG*^NZxKc% zeg5S8FfcPaJ6qn)?C$JL{r9DBdREqNDP2{6Oa0p(#rFW{c~6E16h-Ud-PSbtoezJK zB#YyU`qw-UhR>_}kLRIqXH;!mTF4P+XSACc_?WE()dLf(mEi|=K-CY2*BMuM48{h? zBcNd(O{by+parcDV>z%=Ps?#p-8Rpo;paWCd9WNm=5*F|5@usTLUBJxZGuC5S0IdZ*9d0+N?lUaf4kiW8 zw)>2+E3wF?uFL=pU5SAMT(+j;3*3%0yg^Hk~ zjN}KUvJqv-TaY(xR3)Gi#Kc+A4|&+28*hhAAz949EHDv{wK5d=;t34=v-2ZiS@4Cg zM#|$izsOfwm;TfexS!&wr+qFchx@G!hsGgK``!z;AV1x>N>s0RG8Tp$q&ApA0W&CQ z28GO^Ml-0%3~Dxm!e)?Y21#a+Yz8T2kZJ}+%%G?l6f=Y3W>6P1sH+*&%?#>p2K6w5 zdYVDK%%I+8(C%hXA2TRn2K8k@ozWiV#kn)Y{4rRF`r6Zv2i%hf+=~b7&jSwN0SEGc zgLuHfJm3%>a3~MBHxIZE4>*hm+?NO3j|beJ2OQ1=w(@`@c)*c7;3yt&G!J+H4>*Pg zJdg)GhzC5F2Ry_KtVD-qCSnrSt5HRj=rA*AEDK7Yap_eOuXGR}a=e-5aGEB8j-UaR zXo9)WM4BdnCb59YEZ|5QP>H6P*&apHB+$_;;20KgEDM;*0;aKm<1zr~6j0&Evw#y= zz=hE?6l5J%{+*o!UE1o0}^;{GH*?rtkYZrg+8`~t*>pZZ(HtTC6AZ%5MC(!Jh(ad zMexhuSHZ7?-vqx6ei!^cxFz^Q@WhgU8iv3--4Sunn{gvY`;l+gNyM{rq}s zo-J>BLr-C_?GE1%+fduywtZ~FZ1%if!hW`T*Kk{_ZHvFb)ms>8+g%8_UM?JE3%V|= zf2t%mFE1}YZ$strbtlyEUYqVnVkP_l{QdC%hX>#vgz*#b55pgYKMsEq{xtkq`1A1Q z@E74P!(WBJ4u2E=HvC=q`|y_V58)rfKZSn|{}TQ+{9E|<@Ye9QFcK}IRkVqA(IMuD zxniD}FBXV}qEqZ7y2K)}SS%4s#WJy6tPm?jw^$_#qDQP2cN05{HDayk6@6lz=ojn7 z1~DK8#gN!2Hi^w*SQJG`lto2U#fTUcV`5zFB6bzKiQUB>Vo$M`*jwCP>?0<`zTzHY zi`Y-xQ`}4JFAfj~ii5EW&*!W2`F-`i24BDz z^m#o#Po2l_srNK^0-m5J_@Q-jBbrA866pLiAOS5#j4QEU+tSnF0JiU>tveU*FU~I-F1CscTTh4L3$RQQ z=z_GcSXQtZFJ$Kr<2%s}|bRD~X2jqM#hWJT9%I%ow` zyv)?CdO^C_W4V`>YMzgS$vv?;4R|ZSqFO3kYjRAyNfJg&YqJ{b=fO*)_3F3+3N#b;I zDY`ClD80NCAI9S5B$Fr? zoh+Uro+{1|XNsqZvqa{YSdTi+9up@;&OvcuD&&YU>M;%$F7GL8_19GGg*QE4>~Mh7Y7hi3f)3Yc>jBoqxzmf6*zHRVmzhYos-yN$Ke2O3at!XTdEjC@7vMk z;zIEX@k;U9(%TEMKZ2%cGYC0HPL;4j#lWfp;)8T`?47ST_sJiYzi<9k;v#Xs{9oPI z)?HV(yzctC`$IR>t*Cn-^kC?r&`fj#E!Ir5f(6`20~*myG~jx;sV|4Bv0U)uK!=uJ zBQ6$~h)YF||HCrTiI%5LU7)w1YehZyh1LQGv;c>%daV9BafhRsTrDmaI~vV|GX(gR zdX^!$A=?n#AZ}*}R){xd9Rg0%!c&@HY4`>1q zXd}E)9tOX)Cj+{Lge|&N*8LjasqA0*pUQVDr}kcq$#YeQAU&>txA>Bw`=NeZtq2^1+0`ERm z6Kkf_OsgRqMTQ*PfqX)PfknERe~VeU zr?8h`30Xs#o3Dq(bt2APZ!|3bZQ+l1nU%ZD%6~rnbbGg7+A?$OzvA}GyvStkz7puR zv_XIkO0W=aX925Oz#0~?mId5F16t6X`l%U8kXr7dDH7;z7H|&@Xhiq2fcsd${WJi3 zC{Kkp<-(t264i9TL-|qhG4XM6gZPB_r1+HhwD^qptoWSxy!e8MU4*X%Mrjvec%=cZ z${R)Es+>R%q$^JV8DgSJ;0py3dg21#OJdgG69roE2~3pN5chZWFKDa{Z_u)^X;vD( zJz3-G>b}Eur)xsR#EMB3lPiv_m{M_6#nBbVR2*CJw);l!P2R2kZGKe$O2exS)_PmL zz1~s(TEjgqhE*BbKBI3c?|}zB52l-kTbIhQTnWFm9ZG?gWBGNF&9YnzMA!yR;$Jw+ z@*5&I%krCG3^7@j-xBpRX6!u(3_5ab{kDiR8D~GX#;J>SFIZsdNTn`*UDT5oXGPUz zE5*pz{yF$N;(x?<#X}*dGM-P1p;_8|%7HP}=hH*1KY9+z_@h4*W^AGGf87yVL(?C- zrZ+ECyR4yIzCgPU*>XIE9;c_t=XH|j>W zzszeSn*c4SEo~@5rz6BD*FSFnY-VkWj_K>oB9q-xfZ@T}@AMp(+sm@)uL@Q{sJG1I z!mVpT>(b3lU;utJdjtH|9?j~<+W0umoNdl{6Zf_Fji@K8yD-C`Jaye_E=phH;lc^@ zNJh3KaKOg%2|A}FWK7@Q^FA{1zwem&teZPqQd8dsXLE-`U79h8v$K%Qf-}*#_V4W9 z+kdeCX#dInv;7zQul85$zuAAcZ?$i;BL^-xFjKH3)!g=r)IyO-nIhP=Pp_-k0r}7z zrH(QOuCLs&4Wc0Z0=3~fx7ytfTok|2(!?xH)waDtOkm3bCa~pM4Lcax@>g-Yp)G$E znb4N}N)2z~v2krhi>kL$$FM2jde=756x>2KFq|ynQ2f7@KV5FT9MHJh zB*=nmH_$@fQRz46VGPnd8E_~m2Me?yhs1=(`6C}AqulCtS<(I@{)eBM|NG7qPZeee zGlkQHSwd1cU6?JLA)G0kC4A=Jv1D+&uBHD@i z_&jHG>Y7+PFsep9gS~>igS!X&1QWsj!5a&1Dp*-?bHS>DFA6-xyA|(UcW1#nMYj~( zT5wyz?F9pZs|(f?tS$JlfU$YD7lq6zk&NEAuoADs8nJyuXbtI!`J2nHZ zhm$^oV$Xa99SgBO(*1ce4pq&t!M3cCfjJu>DR!`XwN^hKlq5Md+>u1pdi{^04;z-} zZ$M9=PZ}7OI2>$8WHGWp+NG-|)s9}e>Qd?Hvl({o4oakF$Y$9do$rCWjjlVZcPywHe zw!Lvc%`*`}F%M^U^gWK=diE&|!*=`mKFJr(viXw{^>yh?5%oK|;(S!yg4U-u^3a0_ zG1n|Oz54bqTDJOQ67SB&$UVW~UfzLAoUQ&Y(mk%8xnz5$tw9w?44xc3CAhHoisG5U zWbnG;<;B+*ONDZwQm7V23ZsRw!gyhq!e_nDd7ZgEat({R1$C2xxuFzDvohe-Lhz*E z^x&n%-K86gZz^6{d`9rh;90?2iW_n%g^;V6MeAI%i+f0GSv2<9A&3@mLc+5V|4B8x z58=)($vX~Y_)z7s^jIVa;PDI~2@q!M*YJ;S{d!BgOXjE4JMV1spSwco zBPFDrpHaK7bc8TLm?%sVKJiZ$KK1K4wRdd*cljlMUbwmN%fhb;9iIP^E0cdRANXIr zuw*VxYEfSWhO1soL4kTARK{`=7Nop^zF^8|7 z*_eacPJ+dgrBkF#Zevb)Q+DIbcc*7J=9co&X?-)LxTzUuNOXSVnbK*}EXkC;IKxHH z+Q_L}&tJ?%k<5);6v^GlL78$C8^s`r9XX}+EX7!DI#=q@>z=)&RiRr#SJaJb*jH+mMo9-s2TO-a&kIx>TAkU6!^X7G$#_FsCdw#KLSg z#KP^_5LZZ7?x+nx8cQ-MbNZZPLoAZ6ZqJ4w47oN0L2+#ejN;f3i=`#f((E<_F2%7S zu7y&IQ>C~z0TF}bPv$h4V-qZwuJ4#lfNNfw-6p^_b8Uhfc{TxI){aep*>P+FQtsyV zZ35B>B#$zu6ZA~VTol(PAPl)S0YPzX0)pb&1Q^A!32u>Ym2P8fg4?Cl(i&+k-zFe) zD2q*?PnE37p9n~@Dswx7tNd}P4k-V-rF*1%cSQLUX-IBmjx^g*{`X4{WLN%#HOa5c zVa-+J51G_>8>sOtx|&o#ax8Nyu;y@eH7Ui_)da;=$OJ`lEpzMQDr8cMtB^4&t3qBU zJtD1_9@P}`W76Z&2I&b_A+t|T&rhr3%cZNNYouk;b)brGkXA@HNh?7WuafSN?v(BV zReWDc6+b9FEIlcGfSxF=0yT`!0^rArw&je<4We2-#VSHxxSd;*vo`0BoP+b2>q$M} z2hRMd-#|VsJtKAQG^Uv$#i`QFM8>dAsrp;clbN$$3}GVeWNIW~be@-9kZ`0YPOKeV zqnRjyp2{3`B%y)?dYT11LjzjSvl*F4k>_X%$nneqUSI(mS-^`d;3XFDG7Vsk!Tr0A z!9zFy1wK%J?=kpGQu_zt*`kVOizk{bl4$!eL|>NvNDR?eq*tZaq}Qc4q&KCvq_?F_ z(k>sU@={NzI#d&?4Yf31jGicYQg}{yUU)&+D7+~AcfO%yLUUw%GtG;q9${lU!8t0p zE3aOd4$ol>B?+rBz7BjvUu`W3yxKCC&VSU`fWCx&PkLWs7;Fh%h;i7sH_A5V#46t`TT%X2*-v#JNxI9hW{vPG<+u!gO1We~ z2VPbI#TzLLI{ z^c1DpUMnzS^w`PIB|0Vqq|r`yPO7_t#i3$1{0&=RNrVbHFEhWBTAKpJC18p%Z!^D_ zxNkGJfQKFPHuDGR4?NBIQEKmP=4KJU%`5_$G|_X?Z!^D>#x>Ox``Sa+Wk)iSw*TVe zXXzK|SLx8E&0-6BBh$0clQ0k8WC3rb0jafxF{uK(OsZWbl_^B~KWkF`E^U>z?J}%F z|9gg23wk@f+Q4dLQiHwzv>LR?(SquRv93F7es3gsx;v(W7)99gPb$JcDnU8tpR2i`*eQ(JNNn!wsk{C`Wz?80erR=JQ@jE>$=MT<^+* z!Y`%^1JHu<G_F7^0=6wn_*G{q7{vl;hAb(yG@D_v$L(b6VlCMi_KD*E1 z%kky<@_hNe0$-ue>FeZk`HFnSz7k)l?-qZVFPod$ziWTJOBuLBRUzSjQW?CXD+6pT zBXqj+-M^_)h}Tjuf#3rU0qy^N03bXJ#&=u&ggv}@B=f@i9Sp_ z0s}V-8dv2+ADKZPn?awjpceFLMz$nyV;1h+|8^_BNG_I3=q9d+gF($ux-8UIKA z_bT=fT7;jxKYM@i{_6eB`@46mcbgaa4zc|;p;k)eGI?KNKVg4ixG=r0T%PQ&kdO3N z%2WJq`Q(Nw+39W-MhHdjVz{g+buacV@h|02V^l#NB$^LWcP;e)s|!7|7@hbxhot)_mZFSjaRPmo(Ia?iPN2_Oz-AiIh`wL} zU$TI&XaEj%F%y_;Fj}?UtnrQ z@rsKZobZfZJL&10#2X4xw!(oC25CDgJtdeV&vMOno#FDi&vwmq9azASIS?VJLI)Rc zYFY#}sdP=M9MEdQZHLPBnie!%(QswMRSgk&aYNES%g>PIzysY3K_&Voy|GC(;B;3H znl1Kq>1Bh3aohTcjp-K2|5?}T`3{7g)n}p?ux1sWI zt!^tyH3>)Z>COTzsJrnn&62?UlCHa4PBbd@`UCpIlH%7(W**f3@eruJSymkjf!f3 z`!bsCe-*ukhRU1J7dcWUwMBXgCsCmm`7FA%A-32=mr*0bR*>!v?aY%tNOG&U2dRzm8Ls_M^^)MuhDc9DY^t%lNZ~a=xv&AviwrsfkqI-@RKLVljI|L415+R z+Cn$*DA|cN85vkmFZl<^Fylp7hv5IimMq7TYss_ZTM8_N7N@0?#qfdXopLNN`kdxH zl_$e71x|Fgo^XeB-f{Atj=l8cJeD?mM>MfXEIM9}7rmi&AMeZ~GOko^1XZytx=tp`rN+2h_QEWs%r7057 zJ;=}-s4WTVv$g2p3Q(VVlTb1V{dlTeZ=nJ|R6}yhfP`9pG0jV3F@>1HWrvr^ble&7tbIoF94dX-Gb5;(&cmWu*3+tm~}OK#2I z#}N*Q0VyB{A^}ddbD&z0W_GsRTpXrBbE$rVal=;Alz?F};?A_7bLHcU)AJKA^j379 zJfCL-d{E{@)9Fgirz!z{xRU8m$*DBmg*>_$K$oQHF6PlCf$j{N?ox_QYup(?H;1OX zOg@M1WIH-OaEW}8e435Zv6n-~&ZQYF1kkxO=rUg2=Rw`)(R5eIGtpByc0|?`_=V6f zu+HEw8!s~OV?|fX^NjX7K8L|Qcn#G0Gi_KemZxbg(UfW@G$}AozCfN9I4*FJe2F|? zULao~Unwt=mrw$>5td7VGbfFn^kr{L`3+hGpy$f{>wB}#h zG%;|Uyj;FszCm6gF9=*7nC)5^7|)yNH-gMPX{I;HJ!qyjv{D`)IGk7fW+>jBF20J_ zHP^z}T}m$|x5|yhO~#_R=p6YLdA4hDU`gOM`Fg54ZP5BToaicJ84Fqs5-c)*Yt~$K(~^4f0d&r`-mhRLsJP&Zu~T z>i85e>3UMW5}lc^t@5P)r{vlBXBa_t^t8OZ>BfqOyxr*3u^IQ;+vPR#TKNw7PWk4* zUGm(5yWG#n3^8`EWyywW{A?(-AI5v}b%93$vn+49-*&GLJQ{c`aHIF}z=l9?nIVPL zV_66dovbfc6FV7ZAyy$4w9(iZy4HRXrra00?M3Kbl0VP;mIl2n??C?IS6E_x{^D0C zaS}-wu-2kG!C*IN;3SCsIz`t;=-vRakIESKnC?ya=n|@^6|HG{i&ywAC!-CdB6$a}q z4~)vs<<0U}^4Ib=^36qk>Wv>t8xj9oVDt#h=sR9BUxsFGr0KTE&(js!pu(#Pe&7}V z5vqBPF8-5zQUN8e1KFzVRo}}$%MLF`(qDkZiTe6VI{H_69auAlCgX7GIK<^T*KhKc z0E4u`a`c-~IDOyrBWT;%^g-J;IcZ5pUcrl`9U?#50`JTKVMP|@fg*#v z`Z{k_oai)~t4-n1JyzsI^JqE;MVG*pBwbt0QsycqDf2WbFJ-07=Sx`tQkE1^+Mp0X zm(T)X(0mqTY>OsiZqU?|MP?a`H5nJsGCEL+@?y~gMgM7XRvCG>k@lB@442U|l=1qh z1Uz8K&}k!NK^4lDy!2GVgXTb$?N#N5s=n7%08x=u#;SDf@hN;1zw2~lN_r@|RJW{m zRf9+tUB42#-IQPRelr%eqH3ix)O$7CL?^n21#x<(0jgL`)A#|o3nieVSeo*)Xsbc5`dV`0E3v%K;p^hH_I3?%NWh}8N}L~n{kkV z`3$haamn`l|7Ue zrJq?;eSA%#W)O_183ZG$j$lM30ns}mkJX+dWf;H|#4-N!eJzow6?VYNc& zW7^=)9PSUS8dNp7YDkra8T8kbRETM ztvxN}m+o+lwjN+zoIAaEN$ybj`=%{TOaYvQ7(1|=2@NZwKHY51PBbfHi{iHLt4xO& zzXrQO5Bt2%l}&;Hp7X_@ntpEjrRmX%Uz>hw`n_pCC8s&JIj=dtxuBV0SDjV9_SqPv zhrz(+eB&d+pzSl%1`vSmT`+|{{m(NTd)Y^%zgzk!uau8+L9p8h@$iTprUlW zg@G0{nxab(x&=TtC{35dbYqNkeN%K-_^$%Gh5DM)H$``la(Tuu#2_oW(tj{jxD5lZ z@E-ze*aEunp~^Tdwyy*F3JMpZv;7zOFZLg(9HuPwFY{mPzs|qhKhJOIYrSn_f!$(S z=5fjxEoLvULrH`(7UluUc%w}E&hsW1up80?1|=-$2;jR~7ZWqV$1phefMEt&(H&J2 zdHn7Me(4S(g(tH@<)N=#4;Nn&Tw6RrnWP-4)OwSa+f&Ckrp0c8bzW)~w{7B`BBv5KOt;%zv!ZO2mXF+on%*`N`4S9sKm2;F48d&>O ziVRu`FPirhe&YDndsN9#`CKQy-e$-PwY8NcGwj&#*PO9vM$>PsY-p49d}V5hVV%-7 z+6AzljG`NRp)yjF7EcS{n^~tWQfiw`mFnLir_xLKm0oJDbUs_D4cdGeRA-b~>-f9! zo#+T!=F621C121#@^)4mx@neyAH1!%G6YGj?`~}AwQLt`YPpUx~KEf^I~K0 z#o!{vX=4Z+&?`F1SVtR~lJ7$uFB(;W1uf<&0y@1546y|*g)upwHf<6zC*#W!rM`KY za;?Ik>_|s%eTZl36-Uk}w?sDtn^2aY=ro1`=-B@}(ypTLbwx?%#TKwT@6qBkkb zOB;8(BhBw^Zcy-3ofQgss&k{VQhB<%8o3 z7q!UUqkQX1pMc=TSkaxndwGTL15v)A3*Qf*n`u$Fi|c_f$RE?a@eox-g2?wI$d`Fy z3c^^>!wTn#={l;g*0@JN80LxTdLG@UCE(Ga&rC9Wk3rF)bkpW4L+F07!PC|a3fJrA z2`E08F8(AIh8~fGypg>QgvYWCPxEAa28zEx7k?H&YcrK3p>IxwZTXfo2)e<765wVu zt%#b42~?DxWYEtD?9t*h0RNlzksu?H?{T6oh15)W83g#0mIZl}<^DX5{G?eE3HdHqv z4FWpcD~u0+Xor3HZ&iK|ZVet+w=LM;Ho!K}HpqrTC~srorS-Qd);wF@^oE|oVA~zO zA-18my>0v0hS}_Sy@dU2^{(NzR@)YTgX?xB^ImO~ZD(e*Sglw>){xw+G`}CdyguBt zMp>)u+^iOND0eD%DR(Q`-={sGJgAWOX+4{><+Ny1uBkmlcvN{@c}jUsY45S|^Ge4a z8@C_I>z{p_rigze#MeI^(CY=|Dq)duwQ!BFSa_~>iLg{yCR{6ACoC7P7j6(%2sa8h z2`h!0g;m1ywYLbj3bzS6=9Rxuc~R-OU;azVjtBL6McKKjz+Y8fQ|d#iC*s+p^!B`? z^zrm-9@HER4Q?LNYR^VKAcfi-BRFO-gN=HX%md z`_yU4F-wb$1gt4lRG>3RrW{a-2bu0q6>xa?|p<^tl6V%a`1_470nhbX8 z!z}0l+k?hx^N>p|Qj68=?91&>d9Jt5&O4W$6`7=LNOh_uDuc#J*$6^U44-=1`sWkF zx1bVwXNjNAEBSMvwzlsUCGVwMO;wSUdu*bC2o+Octs- z755WfI@0~*Q@45i>hqr0JQZrv5=!M(*A~^xXmXYJ3}YpQFjpR-?*cWK_o_D}3D+r8Dk>bmO7 zLT|als-!Axar|JaV+9TE)#q^pDleED=A3(H`Pe1{8@cwksE@}@u zrCN%?NvWx;)1n5pP?yfQcUNezq zNPyQvL>xdHzh2WKw5ob|*B)w@vU~H^bYd9b1FURCNpM%a;1F%{Y8`}41>*HI&7G(o z?r3$4a5Pr-@%624t{mwYD)%T0S03y*(19OfF-41^PJR)+z@6~&!l0RrceVN{_^Q+? z_!l|k9GoeD?`rvk-)T>>v{umP>x)94IB32MIXPc9lO-*Vl%JXDi%(i|_y|2~3YG)L z+m0IY>+)OFeyX05O%u?FAQ@9Q2$C;_gCN;bI0%v}g@YiOQaA{bCxwF`SyDI%k|V{0 z;ABYIOYN^tY962tR0pYp)gkIoRnM}vH}uD^M$;?PA6fFF3{$h@SR1BpC&${p>VE3> za;%wJqi0w%AvlZ7G7%O*-3gm$k`XE=hstoZReh{}Bs4wkQiiEBO}FNd3@WBd^&D&_ z1SfmSX!QVfjGD>7W-7zUopKPA8J#Laa;KQe=-Jdvh-H>?SSPW;l=`uvGhJSHSy>5~ zWNDxU9Y(E#39`VBg>|r$zCIhLGI>~Bs9VlL@euV;)tsGeygD>zsL>770mQf^W7JH3 zHj}{IOe_;rUUs$=D`O@W6EjX879zl8mCns(Dye5?;~+?0HV%ShVBsK0{uK^_WMAPR zNbVIAf|Ge=ih7iKG)xU+HnwBbW7VnZG?kx?E!AyVGOy?p?UejRR6(C8x1dVeW^F-k z7EqN2z#M{El+(>+J)N@swb?y4*^VE6j`RWB~hqA8isp?tR_EGm& zN2v#@2dguh4_A*+C#sXwxbsN$IQ4k-1ofiknd)2hN%ahMj(Q>N6&Q;{-z%6b4jsX@ zI4)K%;aeO8!Lc|9f@5(I1jpha2#&=;5FCqxAUGBWL2xV%g5X#j7{ReP=Bt;1#j!xW zTwSPMpJ8Z}3CxURN!$o!mS?jhhyWx9n@Iq!=3lAa+)>SsYrY|y z=EpU2HUF(V%}-cm)%=(lNAr_XtJ~B3qytF)HB$%Z+1EG-j^-z%h#k<{52_ETZCtI* zRlKBHj^f3L?I_-L>Lb|{FJVjat(n@-RlJXy6z^l%6fa@UQM?2}GOd|vwdQaXFDb!M zyad5fyad5fyad5fycm&H@orF`P@hzv(iHF0>ND!I>T|5(WwWbYnpU}2t4r1E)D`MY zpmJBKx2U(Nw}Z-Equ!_9uRZ`O_u-VvU9Uc_KCdQ_KwF{{wRd3Jah|B1i0r7}>KAoi z)_qm?1bP&0K+E&5&)>`Wb=^00!^BUTe{~;OJ*E1n>WwN>RRf%L9gYUN^XoS?6xKWI z4{(ohZ*m>zX77_a!kS}@o(893Q;j<&3wl{ShJAOpDt|`xE7XRqjcnLng$>)$bn(~J zBel-bjz|j9opn?G%KY8EeY~%$1KbQzE;Q4KHj1j%H5WwvMECI`d+N8;k2UvcZ4PIm zK)tO#TlQSp21v z>sI-p+8JGF)3)vw=yoe=DIMYNj5dO6UTQy|0nS95;OHU^L}(^@hXy3jT0K4lE`}-I zqbX*h_i2EHKGIJPEO23ALvOg=biL)0(8oOR2k668U@2%5k?TwKEA?%7^c;rDU_xSG z4*FF6O#NKltbU<>ZJgDX1a97lqHkbU8=?dyq13mk2bkcV(l}H8PI|%bq2Q z)`%@)k2oSrQO|rWXb2v1Yih`sB3H2qI1}}PdlAE+tVGYJc&0{a3Dies%iAu)>?boX zo?okfHu!-?A^KSTMEy?vLA6A3BDs;gNPeUsQW$X}uTF-NxT2S2Cd*gm2@{>`3#SBo zPkmqgK>bK{Mmj}|pIaNgcjJF<4EIj3P|OVAfK)sa5544Lcq$E$W@k@)%@gI}Y|=(i8XfR8vL z{mnsdSD%gQBK}By53D$-p%fV z!Atmd{l1|%MJMy<4gps9M- zySjFEqB^}^GOKrw)OMn-`7%>D-nmQXK9L@sdv@;C`6WL?hOIQ3U~FeYjrzm72Ve>f z&}$_6Y!73P==!V;=!VdA{UU=iU5|@e(Vmg}d9U~Of^Hu~7w#YFPd6)b$4E=v5*ZMA z%>THbA>U5(^c(Brp+i-D29gdPY-}D%V6j_^P6oQ+x`ZSm-O$KBw1k-eJJUKJ*Lg_f zq|Vbj?;V-Zd1mL+I?tl&f!St3gW2-fKLwW@MhTFbnd@D1fdP5`r>!s+v|nTtEkI`E z&**$+=d(KRA33k{yw2x$X2|g3MH3jtUGJEup}v`!24jIoz$l$YgDzK2?KHy(vZ9fZ zQI!1J%-sn5W*I3h=zz#6ol1<)*zIU^WK3kC@|tlX>H@t13}({|4&qg`8mnx`|N5o3u58o%r7}gWfiSHl;x+*>J(DGVGHu)Thel(JjXt&9jxm zBNHN%B9kLWMy5oLiX0tbi1H9iQi)zq*98lJ1&u1I1hX+c6a++>NBDaiT~tzPoRg`w zqqXQbFpqp0ixC$-K2nM5G9Uz?(_Jsa|I$_9CzP{%N#E(d*}kcfX^|5mCq~B5DiD7+ zvw+}y-vz#x#LF7v{;vL$BDGfMz??iF^NitblR`WtKOfEM) zRGSf*pGQsDjKOtkWG0Km1{Ve|v(%?|rU>gZyfaOp26|_jKmi&s)fFr=gb_q&nWf3h zXPMik+;z7$QhBjk#i#n^c9RME`;!sflwtX)%QfC_vc0MM8mrx zZ3(ra^CRbYsEJ18y}&Hog%Oi*7qP<9xxH(C<78n%0jYy`yf&@}@0NKMPkV*qe zt&uV-nLK#@AXI9NvVfQlND%-Z&HKjES%8qn|K{Wl@_bTX()97Bi+bEjeyL~|y z%%bV;gbYJ4y1DV5$bFH1QL~d&wP+ncLTMeaYac_KE z_8=t(^cr5UAA$vt@xgD4bk*i6US)v}8$(^nAC7FwzpJsKrm==W=O7~z0*0n{-cS}l z_;Vr~s~sJgP+zzPEBJe!Z*HT&Xb(eohLg_ah~d&;e5E$qmd1f zCnHZqjw+AU^fB&ibV;9v>Xy($^$dXK>2nQNXF(sr^;CExD zeVE_tMmqi5oCo}R=obv++kBHp_b_}YjWpfck;*)GN)#*fRT4Mrt;nXxz0Uib_d6eO zKInYN+2*{Ye0}4ijgK`x-Z)otuq}rU0OG!B%^}ykoBv+^`}tFxD;$Llt>q&thlGcQ zhkIMSBfKNMH#=52ZgJe|xW}=W~%89Je`cay%b-qSFhJjghbNzs~ zYM$!!UH^9BCkYVi@Xt;TfWq}%=u2FrDjFJrM~q}lF^DY ztuNtC>vzr5`n^9hH{Wl6Zhl~%n;%A)?%N%f+m3hKM?1OW5~x>tM#FI8lkna&fV0-V z2~%hjy#f3TT6!1_dP$y?PtJv4R^f?~2k)ETC|g>-qC8f)84iGp8aTYa07et(1?9`g z5&08RAdQg?eHFnBR%#Q`PWZ)-+YhT~0#qu`qI#pO%NmzFOpKcMp3@{NrnU9N_=94|J$)cA7a zD~+E=zK*Oaf2Wa5H>P4WHH3d{m7J~`4lBbI=@q06FLU2T*3sVY8EyZ4gvibi;P@Ll z${6kpx)eV{x;wpVO_F8wu1*xlhJK1nt~s*i5v|%BC)Cm|^Xa=q*q7RvH-9;?Wf{G}9ZG>Md?38k8 zex*=FAq&c(tH9q+S+qRbSnzG*ca7gSZfRr)auJPoqGFn5LQbIF=_NIR`p^I;8k=4_ zL0-HMEu!V<0dlyb2j(0WJ}BqloU!3Uat^CpUGuGfP0cdjwZ7|oO2HWKZ;hkGs;Ceh zEgqKRX&4JWx#M#V&zX=DDLBBpw&sqSx~6DBb;DTKoi)EVjth?uA09p;JSk^e?tgs``P5u!W#`$hPa-o4;lZe*K^BTJE~&XDB5RL>xd zQ%jo)kHWgyl3q7qzFAOh^mXktPCErDP1oa%Zm4;pro2-{rzdMpEIg_3m_nzwllSzh z*;NxNnL;>XV0+{SSrQ36EgLJI0a@PB*Vsf#7Qb=&>U8hGv)Xi^J3`kG-K5FvK&eHy zJT3Fayj2DD(Ll6wr%MVitGct`Q14;hvECPIq>6Fg@!rF|OhKFgbbCb%viD8N9CkPMx*RH-6o*>fTnBa(Y*_FAJKFokM0AY`-)UXx9AS?Q~ zMy2?rfboh*^h)$8%`X~#m+srl-AGe39F?L?b)Zc}(541@ z5$|i9H+tKLKn|s5ny!UMcPyx$k7<*3PafSqz)z<6^^ewRI#b&?cY+Q3UKRZ-oVA^5 zU9}(8?h!q*^5}5C=w8tQJeC9DyYQu1w&A625RYyoR6R1iB&O(wM7^2{(w3Ku;WIee zS}`+lzrmzyBXmdlow6l~Wg2FbNv9hP!{FAfAwstwkM3Zg^U`#~ zd2}ZNUHS<);WvUumjt@>6L3N|ibppJ?qkzWzzN*}Ji0l+FZ~3Z&>hI5I}hm6PrwP? z!BN8#a13&wk|+#IMmum zgN8>B*Y0|>&po3$_l-ts{SCMH_K&tk4~-rc9UC1VJt8_Gx}f%b<4KM_;0vKXW`HJ{ zJ799U1DJZT_BGacBvYdk9ivN57OJ_t6M`9DQzVn4qbIsfG8VO>lfB18r?|+yiFOP! z2p#F2;yo&QwD%bAvEHfPY2IU_x~)`C z@^GAScItG!f$n>n?u6(!MQKkIJjOQEqoHTRiM-+`!A$;|Eg8dnVJ3c z6!G}z$nKj^+>jLEH@c3Q(Vyr#>}aos{tW{fP6K&<)vs-Ev#~c76sJL} z<;|K&p>2e5)?1?5PYZwQm=#WjPY=%ypAkMY{C2@v;V*LLgwGDo4WAP}H+)|BKrtCT zJ$hw$S(vQm3@Z;bX2+Q%U~^-*9M-S&zjl#27_=S2GZVyanOC;N`xU$D8v0OogqZ{V zvWI?)X-OubU(Sx=yGX540vc6hEDEy$`^L_R_OhhyL|h5v(=*zMxTqDK6Ftv3We9LY z(LAsdTj+YvkB+vL>KC4vpB>%hzuSM0|6c!Nx#e);g$E7(4|5TyO7*K;(!2|!7lGL6 z3Cj~ZCC-SVODM4c2=|$0u`iC!=ZSq8h~1ACdqK1>Jw|qzGjpRCL@!SvKv*m``Pr+i z91X|-a#N0<*uxroSASZDjqF1+Xe(M&eWg(f%mnY}uL3D{Pa8q00*j)1(ozt|%d4X^ z(U8pkI0>{fkqWo{|}GtqDwkU*_0U<3;oNdxvR+Yh=t-B<@&5xp^b zQ*>qY=ID&PQPAOOR52Rs9_JqKKHPnTdxCqSdy;#y`$+c`_fhVn-N(3(bx#Ga`O!3U zNS>a#PEqA~j1K*=ODbyU$zbRb=58Kj~~dnVuyg!wRa7p^t%VID+tTN^ce2dUiv zdCT;Vh`d1oWZLrqc>h1N8`qvsv$=54T z$C!1Idc$GcWM~xbTkYq_vMK34Ph$9L`N*=P%%G#wpf*A^3Dl8cMD6IA=(Ex1qR&%v z6=?Cac>(6g#599cH5;Q$;^%U7n)^0yMg1&yWxcz;s$Qr!Cw_i0iZe!cw@`BlUx||; zT(kQxuK|vu0Zd@f#(y{zac^mN>E9cS zxQ~>Oc7-FBL|Oc&!x1kKE*BOGR|sz3X8#xdD&NUS@6@^(bu;U}@(VtX zuiE#V|9St6hM5hgHOy-GYl9I#E_@XI_k|+*Mh0Tuo z!_up1-HcD~GmM7Cgv}X3>|e{0B+&609gmlDCWNidoDF3AMU)}L4@T%%w_ilNLj4Z| zPwni&!!Zx`%G)b6AT%&EC^R@UBy_T8jQv16Z6;tQ%QH-{HqDp`+b`Y+iXWdTu3w`O zCfGpPCp0Wn>?m>U8=~vQ1xIBHmT2|1S7baCnFgbxwO8h}cT8R%d&1t=zK6ZV-p_t` z=!npS(8SQB(B#mOp(&vQ^A5^8HZ(OfEp$lUp?M?h$Ayj$oe(;}j(g>>ys>$-gt)p9 znd-t+&+N>Kz*M9)yo657?83Zo61OI2ZO$Dzjp!tLGBu*3jG$v zk@Z?oK?(F&>eETUZwShDiqWz+#<4mz8)60@!2~5K1L4{WN47P(EsA26SPQC2i-aXY zOkfQhRPNgl9ns1bdnZa_S~0<$0_iE|$**my$*;}#=Kl~K+h7du^m~*S-pLxH!#mky z7p4OT{h{v0VTHK8OG0dLdY2$Ly^9f?-fb`B%hqUaEH9QH<8~$;rG#`Qj#I*PrXM~i zx*LrlJ91*YkR1gvI%G#-?D=%q47_tqBJ_7e=+LU#nGre?XeRwJGEW{dPj+V_{ozAV z><_%15TM(4l*Kp2W8rjGTUX#WY(mnC`NzeIFT*Zg7VsoHF+of zbuLmJbdc)ympMpf6F|S;)8@#3_a&qzVW_aTu#YfI z*jLz3*k2efOt0IKEKGmz!N*I|zb_NhE7H!(#kA}2qt@dM`9g;@boSNwYJFax&sXR3 z`|5oSzJM?2^Ll)qI*;E|?`iM^JV8&$)97jPG<(7x(Ia_e&kMDRrz3fo@czFAotfT_ zCBS?@v&+s%1HhKBpoZ8c*c;+y3>!rN!Z%jGm7W&bTDq+??v46lzFDCFOO%hyBznA7 zyrpf!E=v8Ry8JyQV~luhw@af)%vLUnL~Z4wNZeK~ibQVZqDbskE{a5N<)TRZRxXM} zaOI#lFg4LYD|wBABpKv<2jtNL~)J9vc!###s1XZHy-PPrAcKn z;W?%B*zjBwiRsEgaiY5RjP;83j%DJ*b4qdIy7qxmJyWGf zgm_LVJw`kS#f|OSH?~KtgHhda?Y(1}sP3F9xY1qrjB(<+6K2Nft{irp_^zbffEXRw zol{ni?aoD!=1$6 zi;azqi;a)r=mQ3d z2gZiST4N(($4dvqaD4ZJVu!{ify($Lq}cRq+MhI;#B%2hB}e<85<9g$?N1nzc{bc7z^or~gXf5MQf{RxVz{RxVz{RxVz{RxVz{RxVz{V|H8{pZEbk6plM z{|jRm#V(Fr0^0x5*!Q*4JPw^;6Wiz(8Ur`KRH6 zJo5wyfEM&jj2nCXSs1}l>1S>!%GGkKaVp@qeR7l1^gLA&G&|*u55~D zE_zy~Xes6Xm8}qV3EV4FNDq0;ItF60rVLqLinr1G4149Z0f9Dq^hgIrxwq$=hgn>g zVNprRzrDiPJMXwmVf{1Oo?9O-HZoJJSgSL;Qy=!Rn+mI#)=nusi!wflJI~V&SJs-T zteNVOomWi)y?FFxQn5@d7c0a{(JfYqg6I*e#offtqED<7{bIe? zAO^&s7!n)BCb3xzi=v2K^Iw)!F(O9Am>3tkh+V~QVt28J*i-B!_7-;+`-lm#uegWU zBK8ya6!#MQivz@g;vn%A=~d}9>2>K1=}qY^>22xV*sl9(PpCRn6RHipq_i|&jGicY zQg}{yUU)&+D7+}VB)lw~R`;9myYN}zR$-ffJQmOAg_{e%Ec~j_;mPs5qBuQGE{~_$ z)99`7{C)S;%m$<$WwVKN`K1=z132SiUIlu6Rj+r7KHkNbJ)1!;rpo7%o||0agC05<1l zq84;c+I1lTJXu{7`XAIqpU2*-*h6R$e)9h8{l)vM_c!nF-mTtkUgSH(wx_UKv4pH4 zxmjs`KYV$8xM_{DR(V)lCyup^vt25dDW&4o??vMlm6$Pj_v63LO&jhY7suQ1zg{_@z&;%)=}2F%9z@N~+6?=8*kZAa z|JafFd1do5PonUC5yzllf>`OhR0zr&GX}F_!)GzYaI8GK02}@4GEFPvZcXAGUHWNi zusBq#XBYtl%QH)+Pge_ zeR!VxeD?+JLu4E&fnnKxh=re}U!-3p5@JFB#PLfrX!R}|VwVlEYe&25`T5TCz-AVh z|8F)#O>u3p9;ph}*IYz&3ehFwnre!D?W613L+{Y4kK&fNHO^i2{}*51?5JtCYv=ey z_{;ED;jhF0OXrxIq~E2j(zac%Z%Y3Kr#tlM( zY!Dm}$n=$rj{)B9<;GvK8ZP@W-Fqc@abw{&QaC>jiNfi^1#w26@OF^;=3;)!$P8wny=OEIukeCVnqIE^ZKalRL{b@{{6I;?v?Y z;SUl()7NgUS>_+C}TGrm`*n5rdl#%D{9sp^U27_6sT z$@Nq^VvT+fHpdzfy4gMn3brYA4;8i*`fWET_m^xaT%mNgU0C14cB8UVdAiUkGYs(A zW=D&*ASZp43HhG%K>WDRET|Q7(tczHeQXAO!h#qD*zylti`B%7hJ5Q^Nz;D%o6 zUhG}sUFu!tz1Dl3_W|WW#SzL0^=RIH$br98Eq)XJHvC=IjSmtnqE*c1#!(~|izQi| zIcmgO(fb#;bO^H9sbkk>$Q`N*38C`;$;}Y6ES>tdU#9(2ixPdQ#^mGEgA8WN%2zKp z$RsNQQxNCs;wSRU6k*hB4kGIHRtS%N8yj#u4Kw+gojw+pL;O+AGw8u1I$Uh;7Q+;DwE6#}X~Xq%Lt@-Uee02~G`_9Zcj9le)!w z%N}%PTHe(5w*_6L11za+>Gg<;#HMFH(%)M2h;M2rtasM$DZksWw|khoQ~kc~{oJqn zT=hNU?=`&P8}4p(k92?D{E_SA3Wik$czuuu8#BOd!nx;3M+;mFQfIuRCYSWCSnN6oP&1yFlPtP3JV7+jL&jyr%P;E@?U} zFg7qgaCqQ|KmuJ&e;(7oSHw_*3rz~llP{2`1&#|`Bwr%Wmlw!a$XCjXA@g#PnzkFcn_MX4GoRsF5?v68;W>yp@3^`=*&YDW3OS}bLqkp`xzQWHscpPXDUQa%=&h?wTB`_jhiIy5?E)LIH ziI$l`*Rr5SbR9hzm#~RkM#V?R4~UQ9O}qnP6c*DQ4~oA;cQZbqBOmxobZ|;eJ2Xcd z0}GlL!E%~F*Rmiimf?!rjt-3<79YzOYn)lE@vK-jSRiJi!{e`L(qajc2pNO!wp8`2 zY7O?X_O|YB-QXP&92rbl`&##~wpjaF4=+Y8i_7ZjtL&k)DE*X!Sw%v=LEEc}DzNg+bYoj%Y#it-7!v4|Z5xkrp;V0I#O=DB*uYn{G^h76}Y!K{us~ z;C};PB@LK~ZcZ1`C@xPwmDT{O=prrXmNX!NNiHc_P?8J3v9xX22Q=P1Cw_K(Zv4WM zi%RsRD1}g)W6kHp--ArOx6+H@TqS{SqXlV1x6^T1yLXFZK!Q;+dj5oHhbRb@!9eHZ1t`);=^sNwk`e!*Z;Bi9Dq$#UEj<$ZJIXSX=sx) zO_R1s)22<{d&vWW1w^)kof*bb&5eJBiAt;Cl0x|>y7kfEzF_ftcH~+bL z@8!)vLH!+H`+W#K_uO;Oz4zR6&pY?tbLP~XuG{FE5B?M1hCC2_FnFP5SLEIB5;7uuD zkr==QR%TC_aXLmmYVxGulfkEgPY0y|mRaNsL4ai`s>mvefzXMpq8RLiQ@|=(rb}2w zF=Rq7dCt$dAg5bS_naO%J##M1$*(@&T2S4ms<8Um;9HOow++x?Cq)B{P7QXqM$uw% zht&Ed@f|l|74Z?CU(6PL=)*@$?hC;wzGr<3yZMW-o4+7FwSFn65I&Fz9y|@c7~e`P zGT;*15la(*C|6h8uwVV0VE_8L zK_(>VYrz5a^MaSxzaAV|KR-CA{*9pIwUZ~YF!7tG=Yw2+Ao+8u=|O3L&{;uwfY1fO zB*KFunJEa*o5_S{kz9BdD+v!1dvXaht0)?{Sq0JHgCTOFu~a%TI8ly#OvEq2-U>>C zr!5OA1y38qx<1%XbUq81*yY$5kKz8(1EmK`*P>Nu4SK=wqM@zvQ0d{)uD(50zZ49$ z4zpfi-6+j2RNm-s#KsVp1kvGN!(zR#~C>qvX(F|H2jb<0UZk=y^!@9t_ z(E6rzk#(_kiFGb|%evIsrC^zLxpjqgm6h`ruMV!ZuCcDQ?g2sq=R`?jnVtS9?UE8} zysvtfRj`L-#Z{!o4_Rzx_Ye#MP43O~W_iutY;TS?*PG|HR`+r=t1k2w zSHBlb&k$|w{A>T}!27|P02PP?-mm_kx;W#aDhVon?Jq~lNAL4m4)ZhCv^8^UreN%} zNbgz~9OHPbVvA{uNl=i2#yDb*v5sp3!vog^t`A(4DH?Me$Y=}{-|u+9vDvpi7<3ZO z4MCe%LS7RmpW>1bheX72;xe*nP{0x06eqeFh>k`daC<2J+QymTKNJJDh~rW54?iPb z+S}aQ!rRijHMlJp^|tb!<$W^nRN(1AJMTGONj3cN^W+sI!6N>M<@K0#O5oYR)WCCr z=L3oXBdn*fI;RN8UMT zbFfZKb0^psDj|3Iv}=3IOIfpb-3;EKvp^;Km$H z1#Wf)cZ2DX=yX;r6)NljP@>a3=xJ_fIM90DdxAk4v^V%|@H?T83xn0@o8Z16t(qmS zz8|{Wj}N+syVQU-i@V%_w(tPlLrD-6C8T=~vrQs{X*TDn9Va92?bXT|B z9{C-;oxB&=yV<+j4+akfU)Igi&DOo5Tc}$Z_#-hsPZ$mdpEXW3ejaEjnU?mbW2KQf z50x<3237?`i97?=&OF{{GS;GKt5|+SAr0|G;xElRbVq_ab=xX*Y1=DyRD4t+kQeNz z!_s>c?4QqsYEXra1!uA^^;tV2D4Lgdb?@mmRH)NF(0!=e6WAMAr(3Vvpxdb1tlOf~ zrmZt>)16bY-ndh@L)Xdwk?v!iF727z$+=TrzEKg0TKo zPNu#Dg{jXKzAcW7kS%DxU&+9d1G)+JE`?nSj|T>o{1g~o!cde{%8YZA99^iSVD43D zXK=f?+g!r26($s7nvfvqpb4&M$EoT{5QKF<64wGek7iRv8K=1>1W+R`HAVrC!%F_ z<&eM_pNq~u2w8A7HnHB$abO92!$?Kiej|iwKv<4<$!Sj+gvc z@>2<2H^|=7uCwWF(;YJ$jQB|^GE3y-RqWt$!X`W0KcPzKP}eQ5QyoKDg2t!>A%Y|h z^SKIfn7M^>W`@9-2aZl=2uN7&tibX=$!hsHVYNiDtbURCrO^5?p|z&|zAD#EUa!mN zs&@HZHLhA$z*XlmSC)o$iod*gh3yQDsJpT5raB1%R@huo1NupPt~nZgl3)dM0-sW! zCIC?kkX)q0_t-d{$=r&IdB=L0n{l6}-QmSo>h6L|b>rY#U3thI@`Nt-#p=e^P4Z6l zGU6v8SRB`@XGZEXV6`>y$eJviz+*qcR_zxBUlvTSoKd+^kI_6l8jhwbMyN(#@WF$o zfYE=BxxM+PoNDx?5;%&!;)V!2I`B8j*Bl^jI-$?u*K_y=xxF1X>kCzf{Gpl{-yD&N4b0#86GD*vg+mge`2LI7Tf;edI6s}ajJZq5lMosIF_qMo5%p$kJ7#d{$rz`eLw z)C<7Ij9db}I3{M~Qkb0IxpvJ6PtH`8S(TVXu3NwH7vGpMxh&L2)I^kNqA&FIS8)^l z@IW<+;s7OzmjlHUVu}M{^p10~kJ-Uzxj#w)KS=>UO98(~0l!KCzexeVO93aO0Ho3a zKM7Hh$B;fZ%1ko`WTA1PdqVey?hD-? zdLZ;*=%LWVp+`cGh8_!z4^0R?9-0U`#=woJDn7NTxn`tgC}4mJO;Qq*CqYb7#A5PP zXdh@Rf!VIKQt&bDijNi4Q25(GYp{FG2BO6O&bBN#px~A6&WV0$o$U|Nrh=K8eElU%wv5onPfM`nO%egYi#s zUP%~i10InxW9`pBVB`F1?AZOAT!Adh|7=&FWU1CQU9SJz6E8H`292=|n&QU%o3GgC zqYUnI4S$m0J3$fc9V)@+njVolN*C5ebd+^=D6AC)kIaGtiprd-9LhoHUJ13(wbac| z4c10=t#oJU8g$h;M6JNP#$B>_6+RLvt)K}NniG=bGB}-d2y;VcoDPAjDmj%somisD z4@A!-h^K^+NTYKj{kd$E!?QoZ1gT+~UlD%qb5r>SOr=XFz*M0Hp;ERo{{97-%7Dsk z^UlsQ+A?e=+b-L}(9rxVy{+ro*0rlskd8Njq$5Fc8J5XKA<0Q4cfNzq>lcSkaiA$g zXh5c1>>a?)z9{g9BmoH;AKPGQNE+Kf5=o%(0Se@#gs}xAPfr{Fa#T*1d(Aq44bF#0 z0tVp^kz^mEN*;$a{{Ew!OZjsVBjhB-J{C3nfgcUp=OJ|aJwoA$;?k9-RUka+;+&+b zL;c{k1Qt_+~Y&?WVk)i3xfF1D`;O^#;;KjVw-^1=Q~@1Dz>Q@SpG z#+SC`9YLS z-7RUv2j%H9`{$3ZdT7 z++fG)o*N{u(13P{!v-{*{FBh9p{AGbC(qQ|^l|=g{y3K? zo+h8*KjFNPS36vc>85}i(gfj6YUkgqc4Su`^McXPY2*#qDY)`D3Te?j@TJ6ldvk6* zeD`Cf^=0ebXdD!Otj~+lvOb?@Q!S9YI>>udEm66I3dDrD#pNC0Y$&<*B-veoE zM-3=Dq0pmPq2p9Rx4_?Q zs-V(8Ayv@s5Ka~}9f(Sj1?>spWI>WQi+n`sWG@%_oB@)mIHL5aD@pcaoM-^=$EQd% zuurfHOJu1-)25fY&8%`%|LN#p=uqgCG5`7Zyu7lrWI6d=lQz&Q8Vz;hN-n(iQMecEy}yoM!>rNT|r7;iwe2nF%fmO?S<3&2+u&n&q0W ze?vdp^@{6N*BsY5s6840l^%|Bitz9iCMpd;t6lH7*0|QX-gUj_df)Yd>qFN%*VSm5 ze!XjhYoqHrbUoVSx&f_C?aIAs05WWk*RTOL*mzk?Mu}A7b<=#)z`Q|ugY$;u4b2;t zcSYWnc~|9Ko%d28b=N%kcdJLwZI!57~Dzp2zpdLOHnl1 zAi`=u`3XZVUJZZe-wV}QS3yx?tdv~^>4cHUAQ)GHi4ZyquHuOlBy|=jSD%0$m$N<@ z-X$fTC~QdAQw?ixCw>(LT5S@t56xiBsB3z$tF)|BJHe@NE8)_H{J$R zm{_ea*a*D^eZ)e^u2%dJ#0cf^f-1sGtVbKrMzjgdvTs4RI=7+isFVLQv|oR~q$!nD z#lh9YRqip0D->l}vt*KFfgti;U<5M&KUkmtX4>!a6Pp_;-nAg!&BUSU14MJUyC!Q& zVQthyaXD~8BZn>uy`Pv!ycENIXhpP7YuwN^K;?7dnQ`z6jaP0>%tk8t6n9XM z&z4Qb!5&tAEnNUFmZKzOJ&}>Cwx*q{^SbFirCcr6R z`GEX2#4!Jr{;T}%%*)dTr43FSl6D?ZkvZIdoqtk6K}s9dlLb!|-0qZA$7XY5D$YhF zas#Ir-b&-xn7Dty3O0V3A%Pd81TM7jg-k-0ZbSpJCNvb3B6K?>1v2q?Iy9m@&pD>N zCoxhfF;FiUquay_`a&3^5^jv*Bw?~`V(a=rzY*ERpojg%@KzR&WP*L%@^$4G6PFN| zij09}cz#xzdPCdI#6&J5#))$pVfG*KKjiO2+@cXoF?SKSFOaxf%zi)O6#1bpA}09z z6DP?JH2{c8@@6b4E1Lt&64KNJQ@@(5x@&lW3kv~b zB?)Xpya?53Xy$c7abSQk)Ae8*KEY{MX1R_eBzdK9#4={Ty_VpUP>mq&PP>6nOhP3^ zqhJ*YWR%lVD@=0>)}~%3Uy@PO0ctQy5(^#L33~V<_!|RbIL8pTM&Br3P`IgYQj{(#h3~8iuE(Uy!+_|Dn;e@_tN)&m-SX>q`oLMG@gPP%_VYd@wRG$=lTClQwRr%`j z>GsbG?jY_Y?joA|->nM;?OhwSzWggNy?wjUu?nN**0X z^zw*!kfkUWt1giXRyEp_n%Ly0fOX7;bQqGDZM+81K-C~&WewU={;29v;v&GB1jVeb z@em-BYieN^{x9j=N`4%n*M!11Xo z?S*a%)(y7~rJarWKJ{+(OOVrLW5S>v0GhV~BkUOCgmBz;Cmdsp{8;8~K8$`jk8V_? ziV+WrdF8gz6{fGsca(QgDX#L0gxJN!cLa=42WX4^B;}nWPr=krRXwkIn%G<3p1^2+ z9t{W95+mFQ2%UMJaUd+Fiwqh{IibfW0UiYh!r}{uh(iVP+D0s6b1LUn-s$_?|FwT* zrKAehHp!6>i-(H)#+FvO&9~bxK~0m<#Yi*YQ=lt!hLx>k^d8Gxt-+|Ay%>Xl5;A%i zX@xwEAEW-6G=5L0CUJ{{-)|0V0GS;XnG#@B8?h|GKR8|=T zYCwe+62GMWDx{}IZxC-1QFXT539>_fJQc4NcD-k##YDJtdfJS%nQ1Sl%}R@uex5ly z?Ul4w)8?ejO?xeEUfSzvkf0AeEgs96z{E3B&{WlP@(G(F7K9Y^it4M(uQQhsyHvYX zdsKqaQ7vPpZaL7NET+AJ7zGOy_gN3D!+_ztJd6yc7cR(Ln5nJN*BEOuYD_gR6R#1U zsXjryQWgX+>GhvO1T}PvghCotqi)<7txK z;-gxopB2zge@#tIZOuE0e*TuZmRLl*O}qp{)C;&`mp!lMMx&uA!&0tDxiaNtK%taS z($wkd>Z}a4NsTjMR`4jCZHAT6*tA_mzYS|S_b;YEcF zsJ9MR!GGdE4X83j7zGAx~E!a>ZQI=JvrrutWCsbVhhp9 zf28tgrKBR~kV;-*Hd5F-XQLa<2}6dPn#t&9Iq(MYW`W%8|zm~-i?!!`vHdYaTr!sOYs79>a&Z>)P2-_)&11{ z)$IvP=4PG@lcw@ihaW-$#f@}IeGb~9ERiyF85W(L#E+~@u${nWvv8x* z_d?}~V(;6xgoG_VrRpAHaLspw%}$}D8fgMbM3978W;K%FQx|U)YIJ~@lO@<^7~o3N zLHN}DjoW9KUHB03i|SV~=rHlKcxmG(Ti+9J7fQftgn`pjJSnnuSYWtX4xGkL7Q0gj zZTX|bF=9^osyvT*P2t+YO7lTGMy`bpvdD~?CPc$X3XgTMxJg5ra<2E29dB@tbtNQ| zr+MXwa)%dO>e(pDhxfj$CWXmB1?obzY=AP@H^FT8ve<<(!4)#!uD(Nkr}{4S-Rg1b zd(^)W^V5GND6^zO25bz;P-i2Dyuo5rrUZ1!flJet$@jeFX)EMF3v^-&^pJI7;v>Xq z?&q3pW*RF5FVMwQ!#I1o60fqPn>mkt*_|!jB6-Dg3lhO=`$H%9f_B zSEhUpENYgr6`da4?+SHs+LKX0-oKzaBnOs5S6KhW8<#k<1`5hmS!4J0!Vr%RtVXiIj2|g>2X|`7@%k)FOj=H_=io zlKi*lXp}{o$xqOm?l;wo)Dko%sIw435E&5IWi`~(W(+sBsMH}xR zE}E)poOiE)6sSD>wWEgbtU_`UYR`3*`OdPCQ&kEV8_r=_#ETaybN;Orrhb`4q?PP# zzRcXm+}FHO{luw0TjIT5X(}dZ)dgJB0E3w?AstfuQ2iF zdkfR|=)SjKVaCDu@wuL)N`_#&l%n=vsk5Wc?}HE3*s3mpLV>S9`0f0j`+fHZ?gQ$B z>O<=7#3(aH75EGor7T5K2zPMCO8IniZ_AW2n|pgQx=OwVt`v_7j#kMSD;{!_`>7hE zMuLE2KXXMlL0!B(u_MYE9@tu^%rgx)L-Bchv2ZP=lG}1}G!L3bnR7K5EySZSYe|SO z8!7ln1s5b#QEq`1@CFIyiTO$wu7@~g%v3`f(Ok}&!QY=MR7;L!M?wcRW5TnjJJr=B zsqvE*&9Ks?>C4icnwM%8o7bdItD!UxmW4IbYXao^>5}TXFiwrDSd3nmn+ZO{YWdmZ zDmb3u4r+lzH42eGxdq+BE^BKlp1Z$9c>nYrr7H_Y3&ZA~k_O zJhgt|nusz~F9E7s6Z=pMGjb`p83+gr0GzG9w}_=>Oy$d<@+NWRK4cV8Vu>fkN3fV$ zKP77Yff^wm;sMaXv*h;89hHEc zlz`_d0nbwcp05PFKnd7Q3D{i;*h2}}Qwi8h33#Cr@FFGP#Y(^@4GL3Sm(Bs>@{6yT z`3zg-y4q*hCI=RyZu08I=moh~s2IH{2V%|5Dd%|Wx082}`?B_DaX?r-8q}t$ZPlG5 z_sRobdH`^(;wz6Jxgq^K_dfT2_W}1o_aXOT_xJ7}+(+C;-N)R=-4q!nBjnkdcA9fE z?KN;;HdU4S=O;pMX?frLP{xPmK2GjY<6!3p&Rx#$>QDZhktS81=A_!=ud1nPMLu5U zt-Lq*TFtzg`-1lem-|-u`fB=V9`%_|>utwbWCPinY(uss&nDZE=aB8m4rE8N6WN*U zLUtvM1?Q6Ik(mWq1?Gb6g30#t$!G0T?a$etw_iYZBbU^?RipFhJ>jaB)zRwR&STEw z&L5rK$&s2HH9g4B%{$FKExjx_j3j=_coF%G?P9Vo`A*GyHS22lN8^{18i&@QbLbr@ zj#P)ik>*Hu7#-_tOpZ)Pmc#7GcFcC>I9gR-ZW(A9WEpJP;~Zky>!hoiSGA~WS+%+P zYj3owRn<4%UEbZ^J>I?EZ@u4n_j&hw4|orH4|$Jxk9v=Jk9&Xg{^b4H`-}Hi?{D7U zy(hc_$wA~`atJw;97bM2UP)d>UQJ#@4kxcAN08T%*OMd38^{~Uo5-8VQRHay7SiD> z^*McIK9{fD=k|Gg6~0PemCx(*`Ko<>-q(%X-^v%PW>wEpse$Ew5STSzfoyx4dCl zU|DE+)3V62*s{d(mSw4BnPs_Uh2?F_O3NzCY6}iF9V5q*x03&a*Bj+U?jlc7MNwr@ zRgt&IS5#f(FWO+MDcV-Ey{61lTNEhztmZcI^O}}Lt*h=L-JT9r9jhpd*Y2}d+jrOP zsVheBD5<j59C?pSJ#9=MAN)5cDDfl4AK~+60BC9UV~zW=#~*9i z#I~I2ni-mznwK@RG#F8oKT3{rg8fut9e4b@gwZHu#!fp|>Yd=Y`<2*EVCNlWeqHl@ zx}*}5TOm2R8lFQ6Y%|VT0-2>fe$S5bMViH$bU&!9OzKSL_8~$B6%8WiADHblX!OB~R!v8ukFNX#C9s4k5rFA7GrM-=P!0 z63phFwJ_hIkCOp(ANL9c>avv;VjZ5TKjGW#kcaTJCnl1+YMvl#QYU3dh!=y?NqjY) zONS-(EXYaa!O-9-k&WQPgzy>+M#Ix07(p=tg!tsf1=|()tb3}eQo|WViE(jja>bt& zdo|x`CX=$Wfc@qvB2ye_;xFZA!7)}YZfGj$)>HvihB^2PvM|SKMp0O7?@vMzu@!&N zTn7EZLdz};&bzFUYSnRVxSgl*z#J@{%_ zY@5j|G(d&XP=S>*e(X-@J-Q1#-8|hrBQkq6)IhNh$Tu3}3jfeX>IbYQBGDe2q044IU_%i4MdCRYn3*n2k zD=@?gb`1WJgU*#NsV;!iip2sX&LfC-fkotEa$+_{aPbH_m<6t=G}#?g_Sq7i2Q`|U zy;Rr{1{gCfgCXq6Ek+Dfq2**Z!4LunKe=#gJ=zu00u5roM(I1jg~X)-5;6W}_X^W0 z@^Fo$Py>q)gQIXKiXAE@-`VPv^!TX*@WlYOsrqtbhg~CTw1!+uUM6me+dw!EHlcl& zd^x*ksss(^m&J#?TyYd#4s-W)JsyY_FUr`?&+O+S?VV8 zTF(g2b)L;6)+K#X`=$!lHg2pN-&mDMpZs~v+^M;Xn>H9>c9Gu!ZJ)&scuXkrPrhRQ5OR-(8UC@vIJ{1!lq#h{(!c+G@32qYRGgBg*! zb~kya_Aafy_QuqEwD)T7)27ybNA4ruN`3t$eXnRp!?Gos|pm+ShGG}~}Vyup_W{e_QY|oq+=k^X#-Gn(R#J4SI)g4vm##DF9)Jnb1FE1CQIsMER3L*CkR}F1kzEX^K-pqI z6gk9z3X~xQWJ&=hDPSK=rhwB5WENvYQI;5BgI@>pqrhLlhf{hm8r4(^l}Z_?G%B4k zQW=zq%A~R=GnGx{P`GL*zACNcIL zwgQTMe6!r)GcGREy#ue*1#5ykeCDhMe5PT`-=o{F@8p-D8rbzAM5%(NTJcSBHVAIY zt@G$Abd|a)omba@rleyD$A6;m2R#p3N@kZTXsBY!h@KOwBRJ8gUQAcGk@aGF;?4qY zfKfx(pynLOaiE=YPzueILNhOjn{iSVs5!3(Vo<#TwGac0sHOO$Y%aW(i;6*y*BDVN zF=(#;E3wAsuO7nHQ|$-Z606O+PWwpeqp7>Kd$e1$c55?gyyuewZ>^0gqg+%u<)%DT z1tlTF-d#Nn0=29l;dy}`au;zSjd~6ViBK9dLp~TfLY(ZRnyS|Z<)0k_;{}>yXDDeh zmRjnh$yfqZBa^Yz0e_NYEcKK^G8X0{f;^Z2miE$oKSfx(=u(U|RFF!Vj3s$xan(-R z&hpXeD4q)bbt?sQr*Qm{O(**9pC20dzo@I zuG0KWkuKm|Yn(2?mq+o%mRa#TF#Gk)Ef`596Wfw9@(=8baaO?Ow``vBNa;(e@V9K_ zs8KWnZW;@;c>ra}FNz1y47t@Z9Udijg{rIy<*uf7m8HZ z1Xmks9wc;$&iJ|Rm%8%|FO9*3n=j9aB1M7ke%8bNINaio+{K`Y1`=mO=WY5#4%kJ>PfZL zw~aT&&anxan&@j)e^&iK!yv<8!w|zz!~10)de(V{8G2D_{aNw7h3%LQwXQBTw5e{W zZC%?*-$_UZ(p>3V*3o20NF$Bz}|9TFMY2#YwU_D zicj$J((7wS*4|KiW9=o>rBrX~GO7>Nm+Dd9v%XjTord*gt4b&4tS)`0ls0xYttnkw znuFewi%t$&ssvo71YE8JT%iPfTMk?T56v!t>1Joi2wmt;4WKTk22z8l!PNG$9c3St zeGE+Z*JsF2y=4i1hEhoq{tN>VktF=Nf>KEMb0xJr%`9&y)0`>H7L*2Te($-OI^sF% zIp#U;xv2i)`ky^f)WF*{ScV(WH95Fr_)q+&0ksz2+kxX^Azip-3_|+7=hFJ$JX74m zsoy;(Jg7odp{c)?8bOV&?p;5oS|K43bE;5euvI=EEHT&&cEho{L-mL2E9z%?I#ExQ z_H)(Mccr>fE$XB7msMX#T}-vDKf69?oE5yFzFU3w`VrOrs3Fu<)HT#~)Pmq2QX3=d zZ>U$$5^pBc5;w@T#EnW?;->nWK}+1EysB@jzx{Mp^~1G~D6Q(T^|#cIsUHoi`ZU(n z6ZMnopHy5|rx2N^>z@IUNizRalFa|J^7(hcCM2Kvp^2Hlu6`tSGZm}96=r@EbqjTO z{WzHUWx)yckJnFxnI99M`4}~pnhE+o3YH8juQB+?cJwvp62tP#Y`5FdH%h==a-c%~ zsWUwQljonhjXGS~)widrJ#jmA2X!a4u~yPtIgCu>j>H;6Ty~~#fVj>o-1cC+@U}OO znuH|JQtqMVri%fVWy#ly`}vzs$GEuDFsGfSp03u zcbtGkVJw}-n0%xv{fP`kyC zskmeE6{bnlhdJwVx*K~K@3r1jc!5cRh`+?8DBlCEF2EqWr*gEgrT2jKLF>kxO*s!) zPv{@EE&`KT;Peq5xiCS&FhU+sVz)Nt$b~8L8LH(M$h=~Yf;%zFVjvihs)jkOZ;C5>JkO2nGw6eo)_zy}BDJq}f9)Y*x=>X# z1}m?7=1U+Ng6Kst82D*a&|r%jhS0ofSqx%Y?ylWaJDoaKs|x4?DS_00A&?eG5BSAn z&wUWAFnyG>QD2|`an7{dPjY@Nea$(~`DN`_wa-y6P&25EfUtARaKudI&Pk}_PcboF zhUUva(TLWFS0BD)yvZb3y!hU6(7;6MJjI~ObkhTnbnr224gD$iI`80*>Ol($VO3YCiP_ zwSam~y^wm*`jT~;b-Hzi73X?bVwz>`==eZC+xm)if7yYuH>t_!LuJ}`0gvneT3|7p z9@WLvY_wBOcOCFN4(KKh*VZ;Qkz%81cQSb$Nn7_FjOip7ZIVTI`!v07S)PYy7+I4wyC*3E`3a`rYt z3j!Ae=NrLeK1=;B^?Cl;`8)H!$RF;U<(uvMu4=dGmr`6s;EG^Eek4QQF75&U;!zy; zwS9hv{BQC*=1=uZhEdU7gvb# z74Rd}(MTD!BcOKUQH4Qvj@luGF5d#N6!@b1p>x4AA=v(UXmNmJ_#t(cAIp zO5?&HPF20exfSuLF>@zlF5IJGy><-nV#k+4m6H|4nEML80+lm|yGN51!)xwqDjni$ z3)T_mlZ0D{f%k*oP*flic)$9C>f(%xswAj54z3(&Y?>XSs<0axZWrI|ADiZo1DzQn z6P>{nTCs7qSDL;Bwo5ZaoBDT@GowsS(Z=?LT`s&%*hB55_EGz(NHJZ!*(pK8hOHQ( zZ}Hh;N}OCv5gP*S0;`?xI3?&x6wl2#PtNezMn?Di0fwM9K22=bROkrRMa(02^=pOc zd+OTaqtwXa8;UyzMiq}PzNL6fv9SI!JUg=b_=q3ZJWh4X=q+cpr?@qKY;P;Rz4(se z^8-Io_Z8n?EJ4HiR*cYBOo#gtz->QNJid5hu>=8cbGT?A)N9VlRZMt;Wi)!S_^INj ziw6V3*?_=WDco@2Wj(xNO7RxkR@>C#=Zdebz+vpJ0%XBGSZ;nfWQ;hi`1*=#D@MlA zuLX2`>5v_LDeapo-mv}Rc+|eYw$Qf8af6ssZbfmlH>S=jUTj-pd&{=e)&V>SSgRzV zYjtkb;&6Y>oW;%(XIDVRcLP}!C*+w^L=I=E)9Ea8x}4>4^azhG)+s{79%8z}&T({^ z{Q>U{7+FA-3BD#r>)BYEm=TP83Yr*Au;bzJV)R8XsCyCLOW~mSoM~aaxuxd%oi$E} z6SI%e1;G-TK~X~d01g-gDu+AmUSYa8aB1MOKoordlvphngMUQPW+`Bc81O#)+J~(I zHH4g+!oQaNR`z?@i8AC;xiZ69;WsFZF1iPSoN^)f;Xymdp`d^_Ch>BT z6mqMqtGEu|ZAPa^iaC{Wl)61xz1_uoiVqY&CJqG0vvPA_bYQBgEb(~^vaqaSm$YFf{G+hR^6)bAa=8aS zirR>s>zfU4%ds}2m2%)(bK`bpFAV1zp*voMeBq_w#Sw^HvB1>ygq_}saAnv?WY$-O zYrM16++CA_3pLJCJ*AB|3z$QCg_yr&}KrM=C) zExawgTZ7wzQEw~nS>7iDPX(S1wDX?hRmgXLrsn??YD(bQz|_EVf#(C?)bFZ)DIg(k zg^r1RR@{dv=ey!U&tOtK84q;L6JG@IAG|4W7G{OG&-@1agK1`9R$z7@fNtbY$9O$D zRW(Wpc#9l(Gw&W%#c;z!*pXYBOA6Ni)RXDpuQUp5%Td+DM zo4Xo~ImUrv6UkqgUX6vI^9ipp2B}f&a2wH(#DOtWTUh$zxT`Bn<+I~@L$Get=(C`r z-Z%#;uM=yh_As7_=!BRzMt=&T6C!9i1rDG4c=1omrng5kbY z?2zaj9+Y~S!dE8T(!tzfO$W5Cs8{ZVxmOvlHZIm(V;pY0);Pi#abA>ro$-3(NaGF0 z8;v&^Z#IrHF3(sMSQF?HelKuEZr5;2rveY>0uNKT!NIgu=)7XzFhzoWO4_X2x2 zdw2W6;Gy8lx>>r}x>s}ybt?n2>dz0~V_X+_N%yL5hHiaeZN`Sc#=t?tA;V$AyBTE3 z1>tVt?%^K{M+`>|#|%_SxTL{(+^{LIIdE}!d!TptgyC@TS>sgW=Yh+@)6yPwtTc|# z9aiKhdG^c&J6xacvV!UR;9W?T=2R9kx4@vjhl?K zbGI0`8i#~&aEfilpI#r?J;T7x%vZK%WHCLEAgs)|LDnZdhPx-<+vB@l~f0dINDG3Tw zpDTQuZC?-F0p>X`7jB|o$-t5Wx(Rk18}xW!P{~h$;Ux@3Nu|sTx8a+^qr&-V1!sb}>G03B}k6kRag5Ph8QCQ`MCq2IO_)C{WKlIcZbvUDG8VM#Vu?kxi5?;f>ZkKVPT4^Ev?x zIuqxTW#;wq@GACWTH?vV%}xv#=KWalQ^lp;0v97m5@h_wRtXLAJczf8eAG#NL42$! zQ|$9-4r{WY?qYo(?Imh#knzW1TzgG1071mkmo(!8q z*`Z#(KKde8UwuFQKz$(XLi@au*Goz(RsOm(tE;bRe#vhY{k;9X1H1>S4^|(l9;`o6 z@uI_1`BZpe$(tobb^Y@fl`Jl~z}d}dcS%^G(ci^L1FAD~#wV;Xg!YO*uY~KXlYa}E z%&sp98neEH2#=(FB6qSrmUfoh^xMIT1M7X@HMzZRYWTTuZbn|lyCv7Bk4(QR-DuCS zk1f2laA3Zq64vA=L*L2!;&Ct42wyl6tk@_()uh91y^05VRrd^#&%f;kQkGf1Al<8Fl|hol{PIrGhCeUNc#A~`DvHg``8OY zg`tKY;H%*s zC4wPq6~(;?=FNd#f5{D5E9eb4nZl2x4d5>L@D#t1Qk1&9ifv9Dx*37PSBSb}Z@!B9s0mR;kl z?ZgES;9}J`CMLgxMB@V8?_>L;0wIGD;pQWK?Xb88@A4-mv954B? z5dr=W+RbQWVX+fSNW(h{7R6d{7yi-Ohe&igQ&VKdow**1iS=5GwQuG<=JSEoR78<2D)xL<}f!}hS9-Gp__ z{0aA$9pP?yo$8p`lAtmBix5F;VjKqSDDZO7%vNkGvDs{Po5NOWbK1&mE?c?HZL74c zuz741wtI8#lY8C;?``o=F-8uAo#dX@3W16DwmeYq-WCHj=(F(W;hn<8uZm)-G1C_? zCW-g9su&)VFT;W-z&y?E$iiKqB*k2L@ zD`5%ep%63ktAv?h?8;$XZRew*_F?ub>aMh3Wxv{fjeWTN>bifT^G(8bR|U5JS^hC2 zIxcoGw2|td zKUfp24F-aeWc7T0iw@!BneKHFMl(w)WAn2y)joqW#@5hnw(FeU$ERMxbY&O~ANwRm zNQ&?|AP8RMbIu2h<_lGa{GpoAuAJSxhMxl3_}0*Eq1!{>u&10X=~C9`Cq16xj-^g^ zr8+%AgvbyT3QLLNyQ7Ue?czza&B^6-I&>U_0^b{Eu0!L?(0g;RpKcI4Ch(UUJ!LgT z1eyca!XMk25#i0bKeCCz%;iPe<(wk~rK7xHexx8cyY7{`SL@!cpHnxt?)AEb zbw038WOu2A9g8v@D}**K;|XHvutd%lcZ@eC3nGi^iXuzvs`HlBO+x(=_1FQC)WfbR zjNL4P@w9zU+Lm)i=+4kxp}Rv*gq{xNqrMz3%qBS2l#e!WSdo)Z=%#)O2^5ycDz9uU67(H%Y?RiTQAAc+EAb&OdxR@@7I;@X8P zSshaqksx8KT3B3);I>PALg7Cg;WQZ9ToxF^R@iV;b>#UF28%8&U|<6}H=#T+1tbYI z8TiZN;MPWH%dNrlG-amSf){AIX^uKwra3juEj=_XEaj#x>CLNKRJ%>%%ic4mq^71C zQrF~fphwWz{gQe-Q#dmNtLu3|@t!{)F%9F9_l(^2MdIm#Vw#~+P^D^WUQ z{$JwT{*x4sIKpi{I#24e&qwD=L6SkMYtq!3L7KsuA)4*!R8^O>eYRm5jpt?Ot@U`}}@wN4x?Q7@zqk6hN5{%qy$#vXkx!>}X z{b~CHmIp0)jt`v=Ssu1LVtLf^m?hugwl}LBZ<%0u+%nPfgr&f-&$-`O=(w@;rqTn> z4UWT(n@dNPjxIguv^a_!R>wN$dgmzDXxA;SF|G|YPgk;tEum7z()HEFp2 zZeE7Yat&9Ex+np=DgiH10$!>F>@5dM)L+{s_1C2S1Sx3_d%ySokTfw3@~M1kU$XQx z%_A)$EhEX2)I=k#B4{oDMGf2X1n`yM5FyW_u5Z-*+0%6~#e z#3tR{WQsQVA^)GwjBfjv>h3?Tti<}e0bL+I(062)X6wLFi!UBTvA;H0)jopLmRnfh zGJFw_Nn73_@;|EnJ4XKegt$%Wze)W!ssASRf71I(XQKYa%1W&M$Fd1+vBr<#^ak7& z<~!BZB&qR}7R|6y{I=4md8uZxc}@DX8cOqESy(f@CP2QQZuCnCaV@gs#aCscz1bsd-r(vdcXC4*K~2E>DKc9^9z&Sk=9jr zk#0|is*Y8Z#cTK3tL?k%_Q1pY3&omC5`Zq0aFyWTf`23o-E$EAu21B&qTkiU-}U|V z%{HKM+1UAl|6uVM) zr`4ZT|5p8b^@-}6Eu$=>Ew@<4SYnp3mRl{iS#G!7Vfof+t^Ce;m*sBDILkejrmKkm z|5p){YxIl78lBT!nV`o&mo@3Gf7XZhz{ri79^~ido#vjFUX}-ff8QIDf9HpHlkOTz z-b${u{F~l8C(~ULRn_D$W{mU(w4Jw4L5qWZdI@izVt^!KXbZ5~|GJo=Ln1>XrxCui z`Ck~m^i-@!T;C}I*Z16$Ilr$IIKPGGwRo&y^e^Q{KL!ANfQuu|u?M&sIKaI+a!vdQ zw;2!Sk8p=4j&T3S_T+2--;Qwqm@~X-Pxkq$eSY7T>RMmGSLdtu1$`kO;Uj&NFYJr> zXkT+*3tvlL)F*%Mi61sK?aBYyJ^9c6eCVKwSYCH@)O6Bx)^yQy)o4?dB9Q#CmjGvS zov2Aw{cpIkn^e_*R#p8KpAY|3btOJ|6W=$fM!orPcsSxE&Wrq0&S#gYKr{w*B~de->}i2C%w^-EW{!;95Vf*Vwq3Jdr45{Yvx? zcuhF*S);r2pX|i{r;0|?PWIp0$!>`>ncZ($mRgosmRtV)!B&#F!WvMYgp&a)uY~r> zhJVKp`t!9{EYf6$pLr;#CYM3uTn0_rYl-E*ue~@&KC7($8cY12sjyCFi8rAByix}x z4zA<@2|(PSj-tzXqZMOB(LgC+kQ6Xj3K${<43z?gNdZ?#0ar=^S4ja^O99tN0mG$$ zYo&k@VnE;Aez`56*KtpJ41$Z_7P&ogN94}PU6H#Z<0AJ&?v30Rxj*ti`T-VKY}@2Rsaz9X>%`Go=!*o93Ga<_*dloHrzIXx^~AEAp<)yDIPMyiW@ri@aMm z-9E!!UmXgbaH6uUu5B)LnWjuzrYqa-YVMa1%twtSM+TewN2BZb9sx(_MI;LKUXtVs z>G4QozL6xv@@3yek4KW_&n_kAvYgcn$Jpj_?OFKVsQVW!NrY*1(tnlToq2iMptQkhL(C`f6eda~fDg4>;v>Np`qV=6YFN3yUG;y>}921tj@0iqZ}XC*@4ocT;4r-_vYP~cYodkc@O42l=pDnBYBVJJ(f21$tG}H-b`Uu2?iK5y$sm|Zs)R5VW0}liri|rO$gGW*^w72r{^uTlPb{) z+A|776FOt(?pWGIMRS_6t9RCY;t)lG0@SJ#7bQfIa>Z!L{f}X zWGsP9BR6sSl38kQbTcn`c3AsU^v~+2>c7;x(J1AD+f-(BF*FGq049-&UQsoqv`%T0 z@|tRSWJTm{kpxAt(8o+Gp+mQ-*bXrgv?>x)jg5m?8P=lJkvCKeRF$P;palW08od)) zk|`J_tgbNCH9++iG1aw^YUmJ~j6#L%z$Me6YUqvv7_Y#Am8cP_L9l#1i83$j*qPu(Z%w_%?w@ zqbENaDG3QqD!*UK$KosbSbUvKe!o$k@?AhxBEP#Mn7P(s<`{`w9!VmPd*#f1D`)Pz zWb(LAnYsNyRU(fE03?w|43fy>fp{12MGRI$;PGXoEvc-1FYm$+@-7@nCTmAeCTqul zwnWyBM!`dM5|~u-GB}lu)>NfE$A$K zo{i?WI1HGU!q^h*#|CFh;D(M8$A~%UtMWYNHHB*nE6rM3M`QE=RAbT8;~WVQ8MK&c zPTXjd4gNs&AT{22*n(8_ggceat9sh~jC-~I6Dz)t$f*pcTuOa3J=(QS-3-hggN3^|M(LKf)aR`}Zhe`1UPPIFIp&v4IlzwDmn z-dMP)aC707!mWk#yeEjq)f3gt&4^Ty9~FLF_(|cXg=$hm-ce?vF`4!-u`HQp==6wu zSEyqN39JOn55MSosS{QLE`T(jYBPO}S+Lu1*;KP>BkCESSS)FPt3o++4|Xb9kUn8O z<QNaIqNgPsHO4rJ1~i5f zj`$iylDI5N=XDny>Fn|Vhs~7`E9V-G% z+@obUEh-mv%t=R4OGwAbDkS(DDBKN6A{jsw0~*k632OLv0NkDcL@^*A-68(E!};Cr zl!A-W+MV(tTp+bS0GYWi+52{roC>{qH> z1C{R*w_ghi`W^lvYz#WrfbQjc%K+|60H7RW>`Z*fM=>CZzRVI0VHDk;m?4aSCZPw! z4Hx8b{!I4hm|%~N?X-iAYFcULIZmXkHos#Ik{i;$bMJHScOP&cbRTjbc7N~w!F|Mi z)P2l-+)a^TGD4oMX{R|y(_RCKEK^mfuhytjHK{kaB9;ysrQ;W2{|#@hCTNmo z^1xB_zbO+OtA1{bNA)~iuvzvAorwpkoNR6W<}?i$RUE zbid6Gc?eH?Vj{V#<_WSUby9|ee938e*5$;a=s|u*0cO#An)fv~!QW}{Cl*5v$QQ7q zs0BT}>~Qu+MKj8dWPe;Vv+QX0tg_i+l`tMJ0J(Hb5+Q6ZPAl79)RMlpG_N+M^2B#@cCdIGwOlLue&Jkn z`1{4CYemcIab~8Zo;Lm=W79RzwJbr_YUMN8N(xk9R@Je%tfwR+Vd0vI76mN})>m(+ zUSm3JYvnH>B&gU4D@W=mZky}O3e)g{D#A-him`2r!7-IC?hKWUO-!X%E>P=#<_;zp z1Fdy+si94E2f8Dz)@y`ybVyi~n!KnodC?njpBu}anBaosMXuyU<;jbxlC$AWR;1Fa z;zfy1U{c?i?n0ka-IYFpPc8iYvP?qi0$LPiM}U%z3Jz&=cEhl zU@hVb{Ca=9h7Je=F&iTFgs!up#(2E$$GV^DiZgz$`=#zY!waP^mbNE4Q(dT+N~e`B z@${s7(HGJe(HGN~(3jG0d6s&9t-Flw1A_C5@RMK2n_B;C@}ed2#LNoP@nSY(nkU5i zvfKgmxzw{h1;hMuu&rMZCzu;Z6M7=vK`qlk9dxiC-Jf1vHVBwaIL2|`#mrX4UE>NI zsrBAuMQ7>H5)MCZYY07*9!AeARqHF0)oRc;NNZgQwT8rNogFVyWaG_b3!tsOt&pGz z*qG?Mn!bh}Xc%M|Y#3q~YIwiwL(e+TFheg&t)CG8Do||V@#IAllNUXayl7JLq9>CV zJ(axZtYk%<^qqu*kO6~$M|Bu|Ej@z1j=r8AN#8)*&womx*NFA66s>ZR`$Z;jn{ihvbDx4iWF+L5(4)ZSQo33Vyeo4SnZL-nN|q#vRm zrtdVYFI!bQF=ut@JEgR-vuRD~T2L;z$%i~ISy84rGhW0FUK%w0z2|D`i07#1nCH0X zQTj3ZXOCK6n5@29Z%zmklaTK{VDqB+Tn<|Z$ipSF1%~43s%NUkR?iMT zLBA55M86t*lAaTMik=&MzUqalJF8y{K26UHK107AoJ`LTPNClj{-|TDTXv83B)$=f z47SSWgCz!=!EQKKcc}hweJ6UBrxW!=X+KvFx-UJLzJk7rzN~sUeKS3pzJ(4N$I|!F z_tOv1BdQ;vhfr5h17+GDV8EBU7YkJ2FLzwj(Z5upM8dUjo~48aULre`H=$Jy9OQZnE$ zr6dO2tH}(wSLr{|fSW_l#k?t5Y0Lm98gNXJq5+4C6b!ie$qcwRZon~YC>n6MNYQ{>POmr} z1CD7z(ST!$6b(40NYQ{}iWChvrby9%V~P|FIHpL^fWt)!1{@yMCG<*q6}_5%hh9Uk zrQfCBOK!knDvAc&2TBGUL;Tw01{}k$q5+4C6bv|q| z6e${TOp&4i#}p|Va7>Y+0ml?68gNXJq5;PgDH?FNNWp;HL~o|INDR2G^fr1sy#oxm zkLZu-Pm~NeW}PN6;JD?O)PQ5yR5ak2B1HoZ7oCOyx0C*Y{_=DTIHqYu0}dCR!hrjl z{wBEr$BXRzpZ z^!xOO^g1xpHqxKcpV6O#nf6uOOxs28rN4(`!csFfBk>>Xuz*9rr+L>91`J}aDzcVh zZNgGK6L0eV(gURjOV^@RXbpP7@S>ru@iyvk=@I%Uy{D=@aXWPfb?5)FcOCFeRp0+6 zZPKPm)0NS*v`L#LP1>Ys(~;4<t|=;bO?%Q=t&Rf#4o!5tZRUhWc|W4n)L- zqKGn7+&^%zl;HsR-<$Vd-n%zRDY*T&pAVnX^Ugi@+;#4`>wA2g>WD0DC$PiZz6=}+ z*8AlgXu#O{1DdH;ri;+cd6eeA9%c ziA|H5CO1uK5^bbO=qSAK*(>K5^ut8jMp2KW>|i%Y7X+it%{?SxFG<*k6KJrXBz#X2 zejo`4aKa(DBWM!z$OKXq(E5|R@bONN~%#|i)X|NdI&s~Jy1CW8K zrZ+RyRIMsUtQUV{CKu|JpC;PDkbpc&2bRRUMHH!eevS(t143wp?FF0U4Z05tmT5jJ z__6#k^W)~v>%OR4>N^_9rn24nQ~@ld(4*D>SjyBripWI`PZn_btZZ#ea-(oF9z@%g zn+v<7sEksuuvm}P2278x>=#lCK#;%ej)Y2pfuiuDr-6rj5BrL!T}sR<7=M$c+vFp} zoyZH6O}-ik9v~{;Z#%|Wwt>b}?gRm1-p9&i)lJDreyS|k#r0!#Uh#n$e# zZWXwfBrO2<;iT6zW7FAJ5YP;;ZN1X|jC-}av&JKP-u;OEbWL$-r&1GDMwL?uZT)?L zIaym*z_z{!@A($W!&M|VeW8=DCXJQaq0l#2N)I#>1fQ_o{|kYOZRd`vKV_vgNXO+^=W9>)zzvtJtU5uXrQdTiV0l)8EVggW`bVpyH6i zSL!ci%!d{4xi`D}`M0_+@*h*|Z(OWeqWZ*rv42_CEoJLeY}}S4RjNx?rS8Nkt^X}m z+R%2DHYQeS6IrFFL+f_3mFf9IDw75e;B(38++4yr16lA+**4jM#!qEi?6Rz__HFj< z_DlUqdXyg)e~0+kLIRq_vkE)-XR1};8?oJzfKAXP(Pm>ke@^X#Pz&@(4Gn%c_env0 zQ-j!PK;8zj-Zad0S=@50K?%ZQrvW9$oCcl{cN%y?+-YD5BBy~T#GMA75O*4QLfmO! z2_mNf5i$Wob*4_CPNhzxPN&YG&csX<%@*h^SRf7mECP*I3Ftx%Rbc0lYA_4Vk&89U zG!44%+}Z9NOFl(WK`KN=sIHh$m>$*A*-+>Ze2(izU8)!?_WBf{JB5UaMe+FcoN4_1 z@ay~NmTCm_dLOmf{=WSKdw@EJTBRB3XNNhF`R{>W-=1t$pcOa6 zuS*C)oX+z1pn6hl2?!<>#7X>lb+$dz3)ntRqsz}DOGlNCE*(?)GJdy%51WEg4=5d6 zx<@wO)UB|4;bHfX(x2StbD0r|a$=dKW@o@B!tGC}1YFj|uLH+ic|e56(#2h{WinXnT?^0L$ZpIf`oLQSTA1GB|sb2Gvm1UqlgPDL_OWSb-;>sb;{+_=Jp# z3Cp<(C-88uTn5cBgJf{8wOM^lN9^Z23+oN_clz_1`cwH$y`7iHi!A-+1LT9{?yNqh z$4j3m9YB>=NnG_=#g>6ofAy240~`Y#gB*Km_SWpHX%EmVr-nZ%(CZ(q#5Z}YQz?fP z6@||Q;%%-hd^+cuoc6rGB1E+B@r{W)Y~p;q%y_<0&KM93GT5K^Pb1*1ZZvyvUP})! z+%&>8vVN3lv}ufKtZAHSOg$f=^kk>rKgN$C6h9}4;(s@9VSUCUn)tMgM$W9OoZ15V`e<&tpFO(@ST^4paW5U^5qjPkxWgGzgR_+G?U*;|D>>t zM|?6cg}RKooSI5a6Hn^=1KAc>wkL39rc;l@x)PO579U76$WQ3W@C=FutMS@xl|08k zrG-V{6w`s{`HXls?itOqVp1BIMa`zJpq5Cc$+>cgledU3H%P!t^%BYSM82u`gY0y0 z6?HW=#4<-*dVT?O4J`c&Vhtoh(giDvi2XyI@fYM8a z(AU0uv&v>qlefv&=!!r$3)3Xh$8=h-;zTt(27aI!1 zFM+|DC~V!HIXAca-*}uTm$y-?>x-IStgq3osfQ2s z@z$YT3|NoPyz7Mij=B|k_FE(Yoh51PHabo#Cgyj>N z9q2b=y@)H_W3Y7F@zOm`ZNodE6#SQZ0!zGxt(qrc;;ne%r>HG>)u1l;G)a_zr(qZT zL{M7jf-3MSF7ftS75I!KG2ruf6Qg>BF6VB};%>s0REmS*gClGgo8%Wi|COmoeK*2<9xVQwVG*qn&L@L_JX4?+9jIqQJ(g z{&h0dYrr?j$PD-vuU`gyM-q19gk5c^{2KK-^#=7OwSgNd1T(L)z=l*V0egAf&>0Ks zGKkjok|?s>=QVu^43a|FOQ1Pt`S#T9t=ogE^V?>wEd`tEHd60U?^1-=6PdXLA?VGf zD71rI^k(y1GPuLP@v-1$s^hU>M@Y}#767i}v0zDAX_>LiR9042US=+tjLO z1mTYbX|NAY9Xo>?dy1le#CLq@vGyQ12`p4sdKP* zhYe6o@lN;B z&Ee)qbD6W;X?9jPEl#Vm(rI(romI|ir^DGkXx~(@p-f^ju zXG~10z7E5i)nRx$3~!~WQ`K#T`G(sKcNkg?`mzqgdy(b0diALyLeSuQ!KqE+4Eq1k zHtAF9b8W=H7)V&64tFqI-Lcc~|8J+^@8%AsvPy(wbooCXny7t-2;XmDzz^|tI^5?* z#~laa1R4?ezy|2j!5S3U;0x+Y>UR!o@D=sD1~w4Hp}+>j)n+xouQvbGbezl0yRZW) zSS9G}?(4+M&EF)y-281@mz#x;G&qRQku*4j6NvsA=$JICyZuG3{2ppA)q&^N{;0|w z`zW)#uN!h~xwc4ko-N;2VAI&NHk}Q}^ZTbvoHRHrSSB<@5SEGRuuL76$?=opXU8v& zf5Jw?erik2)|zcK+iO0o`KadOnjJMqYksXcRx`B&Yc!5E`cJV<1JZvK?rk7f4PEt= z!t4I%o+fwES_!v)f1o6u8rKZe`vKVu-s{JyY8_>%`?mq$Tpcv4=pBoWPmi7Z}EW#Ez2z{EGsRm zEKkaxl0Rg5*z$jFEN z3)K-FOiqJ;E`<;nK6 zn%}o+63dD6XVs3?EL=BB_I+0GvAUKJDWP!Bty=~! z?Pgh(R+Tl|sbFF#SeCrfffmLJGT6I>vwa{v?7Fmm}ovbC+++bcXKUfgd1hv6Z ztI>Ly>vGpLm-r&;8Z>;@sdYgW=o!PSLZykKLg|A>Sb8*;xaVld zSPOaa27k)>wDlS5v(^bY6LTizOwO6+S#5pJdby;<(-}$&L3XZzRPiJea_%jel=E)- zWXTjs)HBobKPVf8$4X#q0UxAK^L(y=47fM_J89DtB5CGfjZt}cs-Ds7W zZ}wa(*=)T@a;s;)p!gjnhPk&B}I2Z`3@`2BkKIv@qud(WS%7` z#8(?Kyd?9jIkTO6aoPM}SgZcRy3INP>UDJv$z7hWt!H{JgKTFD zSt{cCv1}mYn0y%bCWMG|at}k8ds`lfW@kXC4$ZY3M*K!y?p}SDG zsaS8#S)WFO416dOf%DQ~w?~2V9Kj^r*9p5X5jw91l8DfGh(v_WLnI<}UQIAb=sZ`j zHn`VS7jy?xgwCsnf{4(04Z)5k%-bPjGEwq&#-8d4nk;<#~fdgedgR zjZM@3cWw{Bp3_@sIHBjXfZ-VM%2)|me92g{q)KT`Znjh{-3(da{K5|{e(1+~ z3jBnu9XIq*uqb}$oJg>!otzl1`=YDhY*EiBJhSku!Y+ks{-~W zuuoy%!aaC0O*|PpiK9p*GIeihAL%_AQ*z()Z1%kG>FPRAb+Bp*K3vdEV>Z9zCEV({ z&biI=Q`L6QE81VGj#M43`cJLAI-@$XT2Y-<{R7nJc34rIu@Y+I_@3v*(o3ZMr30h` zrDuA66u71e_YI%&^5soLPg$y>fEpl*(IjPYXVnyF7PA z?(E7dDzB`3DA&RT*W%J5R13BlX62q9e4PB84vWEl=*y+!=2*d~_Ng6M+X6Ci3zWw_ zOy_b@fVH_@f}ff;X&kR z!P?v98Cv_T$7u4wc{#=CO%mLUAHCw3Wqfcm24uxuHQ3AH4;M9x>!|!Nnr}H7|D6v; z)+b1aJ&_Chd{D7I!E8=9t`p{ReQUm@DensDmC~!ES4-zeuaVA`{^EI3dBo$(qk$4{ zNGp`E0u~azC5^K0jQQH>sn}9*kMyz1$19geds{NRPgG`lS4p2&KP0^{_*BMI>HD1f zou}rVmWM>#A&Ah%)@O-{)!xM9AzXi9h1>#iy?Ne`z_XRlN>@uygDD$I2LZSAQ%94lnux!@)mn9%DXu4l01S*4#(O>c{&67)IYBmCxL5c-n-!AE}%uu zGs<1E?@c4~y1M47&;lt*a5FYj6x{3rC{N_ji2aE-D>qcWRk=sHSGrHS)iW(`5MI9W zcr%_<7vlnxjlzYZ$F;0-Ht&0t3u{$rmqUg+*lvVjLNlH(Z-rti{QMu`v$$|M{RsEh{Ecd7}NocKteS-Q%&r9 z|K4|+|IEl*{Mqry;HV&Zk!5u7pYUWxIFlO_B%^GN4W4i4ZMeSiqo$9W`g-p+_Vf1l zCX2H*DcBKdt7G^3WKQP3QT}Q;W&lN!qHmSoDfcM%DrH6Tq7Q0SMOEtdUaOlNO!Zu* zomW_<{sC85{+>n%zr^w*oW=%03(w7R!X``$$oFh1cra~w+KRN5X{*wXaq}hTO9|WX zEubk6`B9e4tDrA+#Ix0d{3&1F6KUTorCj_j!ZTT`uCcjn+pMe8o=a0gmQ$euoL?a< zPuYzPo9vi88?qo*fs-OkwLHt#%v-$2C5~u?V$3bw2#wf1|w=ly(8_Dv_nd{ zzE9EaS|YIlv^VL{{9*Ya+W;t{g3F(4IDThqt@>{7Qt!Rq8TliM_ScRoy3f12{(i3; zGWUT>bIS6}^DS&uZ_TvHA~weMwe{DuV{#8KywY~5|SvOL*2HgPfrCToGoxV8|~JO+0Gd)Ru~ zdf6uAoM*ehcA;&FgaQ8eK>$nxz=be%+(Qxe)z_+D@$Rp^CP;inOHTH~#dtctAM!4+ zC;biY%KY;)2ST>7P&2L$YvTP-sFuE&Z+YMLZuGw6eb>9mJIHpaZLn>KZK!RSZMbcO ztzYH^nPY5YZR2bgWnP^5o_D-$f^DL0vlms~C7Jy*#Wisy%q$|*1nCY*?cl^^!2d@9#A+C)K9WD(cFg;0{;~W< z(}Ko38y7a-)mUHFP&UJ6ZMZ2&B*+16v!_86Es;Iqw{wu!{eAim=?Bser5{fJG5x3X zpVNOy{~-NH`qA`X(~qS~eHxfBg}a_6OPA^4=To50T#pgkxeQsROd-pXDP=0z^}q-j zhYF0s9x_~W!G0+9W%x3E3SX8_=~MZ#eQIBhFV~mn%l8%d%rI%vZL}6pBrBG6l4Zz< zka~P;pyHuWe0C_oDP+!XYM{>*vR84eSANCBcR#e#Wz_AG?Ur|SRYN&pK@Q(jk(^4I zO=g!>$*N@z*%x@<5caBI1oiZ{(o2ht#T(Oa&b%daXZo)6_tQq6Tu8J^@pc;tq5xjAFW*D z3*l#)YXbO7Xv$N3U5X!v*__XPi~=B-y%rGi*<_nC-^L zT(LqCG=)sJ`cBvH#5Z?&tGiac!1s2+#)4j|^HlSS=N9%*e-9bE!HVR@9nXly-Sx#c z6mKecui(bwWAdAdSHoR%FLxj-?% z{2DZAjf`X8$7@JHDt|gCM!v_=M$v>9$8v{hC2*fcCBkxlHYi4NCosk%HwOF;jvK3(^(x5{4g;WC{Ggt1 zc`b-OWkVYBlHiXNcI4NBo1k>joXAh3Xl$;MzTx{scbe`~-DkRS=2gyzoZnXORR2=G z6<0{uc*n1HovAxZ_m!@TZkfgmGp>a>a_*V13Ty$4?mYYX_TKg{Ia|aT9Nwo{tG)_+ zTzoYscbnZ6?u{f?J%YYJ`BmU1-?ynOptR%^Sjc`*=XCfl%DTdAPAy=i@dIC)Io&KX zXKJ?i7lJako6lms4vPycw1eXd4cqa)p z6fQs8Y|yZYI%#&mL<5CHsg=q#qa?~~)~DiHfp?JLir&4U@hhLt-R#~_^HxnscHe3v z$I7*-&|tfKU;DoE?e;a71WGoWPs7=G1=gx@HpYFrd%gKpb2prwU;3?8fA1S#a?m%q zWJ<}|?r9}0CDTi0l$?(<3o6VmxuWFCl5^cZ`K~RwuB1QC#!o6p=8Yw{mE2J>7&1_> zlDMMq45()BELm7`SIJPwa2jObs)g4IF^sb>DtX`dfpJO6(vtCZbhBkNWESmb@FnJ% z5#zFwN%ryf$uaivkUc15PRhRA{*>{TvRh0~8=o=0S2hLLly4ti_NL6oOP(`6Z+yY{ zqVX)~Q=geyZn61;baZ8>lexrPYVHo1&x6cdXBX?t_pLH>x!G*4Fk8%4^LaSCSZAJ{ z9UEv|oZnt%ltXXGEV^hUR>Wz}@}p6gsd1TW&1GgJ`z`2ci`D?Vm%dir&wZi$V)q6p z4UI9bVa3wa{v#DfD}JpwRsk#$OO8L+|CH|vXr@Hcgq6+!SnZ+@f(1rBs5|~q(1Go; zSETy9vt(Dvo|0SfJ34~ssqPlHnTrV#pC5T^2bY}wneLCkEca};(O>3&5x?zF5;u!2 zz~(nQ?EWgh%9GPj?XPvLl3E>=4x7X7sPW(Cu5rwF-|nt=G&mX^O%9L4>v$g*#V=mg zs+%1F2jvJlLXHm_w=~j@up{EQ)4kArm-}?b84j^yMn_?t6OlWFRR-zB^4_b_bB_K$ z`fX+EiWi$cw`?!#q3;Q2M%L|13=Fa_NMulQLT;HjG|0Z74VD>QVn*W|{_qVy-(trr zgSQN8)jz0LxL3I!a=T@n_%$2qWbB%a0VVvLETNIWNw_zS=H!t7U@+`I6eK>uJ9FFz zJ17-AT_l77MqVnQ5rL1Bp@;vE0??If^pgi`K2dz>pMpOJ+ZQW?Q1wi>>2|Up*e4o) zqWwzJ@JcZQH72Gy3%29Zuc%y2I?2OWPRG-SW$-26>%RZFJvhLR0 zqgkX`tXZO2s_CPJ>f#A*+9vTA?Gv2e4#;9i{NpW|1`ui-G^ z58#p#bs>Tfpd$iy^Q%3f2!6q(i`(F9*-F!c* z_RD@E`T~D;v{v2zi>=>rIdZ<6(DB8^-_0>`ek*^TfU5I{(u1XkOMfi=sWebO1a4T# zjB?|HWy{Oh7TDe%=|r@L#F3rO#eCqJNXWjEvBX$vG#X9DGGn>XY^*R^j8pKI)4>}l*}JkNN((HIh4zn0L*H;JlEAr;W8IkU>< zTn0%NQkg-}aYkHRy$U-;AN#-XmxjLdn=KEOm4|xP@Ah9(-@pEV-yAyZA6!4*_=TBB zik``kiH;;B;$u*7u1v2aF(`PWd9r@PALrZ<%AcD=`M;yPLxh(QdN&_r;yccuakGkG zOV097cYH0I;h5!^?YP3RTYi;ej$^K4o}-_0fkW2J4zL|?>C&0)oggZH{)azTND?T5 zof}b1h%cZF&K-jyz$fs}GdKeLo1e1L;@8 z+zoySuvSgPUl2YJ;Swy|w4S(4-<|~y4jW2?E_l&tPzPbUbo!#V(V zJY(_R3ajsFp{3O6Ar`itVCE6q5y(8th7j8a!3GkkBlKVg%qrfiQ0E$_MkMqTUjx}e z4X&^g{)r7SVNc@h5c-(MC6A&#aa7G`hq~hxl31Ap;y>O<$#DOZqW0r;C1Cfn%mg4m z&Md(4v&;k(KF%xv;-XC9&9Upe|WS8}qg!+e)hZW=&_MSg zd?*OcAh8z-)}Xmzo%&MfG7@2M28WV_!5KmlC16O10iP+6b%|RT1~kQ0q2ULBPSobY z-<(%1zPHkz6Sd)?5g~M@hQvH7h(Y^+ESz1o1k%C6w}Y_ViGS*V)rUwoJP?1aBG`;Xk{yTPeJ7 z9G?tO6~hHibDTgU0`FjOw`iOH1P6nUT0Ao}D>OUAF2M;kynm>RkxT*cW%*de5YNJX zZ=lA%%Pe_SsN-Q+usT$|x#mj;UHxywI_{V!XL^4h;KsjZo+J#>w14sQFwz*|55$Oy z_`LxtJ1p{lygB+@eV#sFe~;;0?_$#u(^AvDrXJp&-sfvysFm5|Hh*=fhOXIZK4d;@ z?pV2;%*th8^PuJrYC3H4KiekjGW9Wc8*cTZlgVuGk$Z>xS=DOQbE@Z6FQ{Hrtx?^q zdBwio{;Hk0PV{%W`7}3lv42_CEoJMts~Lo{u5=HL7H^*GA^U5{T$wF6oz z@#dgg7EB}(=&S7OnHxekhDexJgvFWwHi;M$&{zc-^DX$L{nxlVAZQC6jzSY$yFRAQ z^gN+{QaxBZL_1VFOgmgVLOW7BN;_IRM*Fc|2r1Cic+3ncKCo=DNGsAR(ko;YTP>7} z5U2y~6^9}e&>)2GXCOG#$DnGl^FUU;A1JnnVp!Dqp%cMZohJxHp&n08kPhhi6BJ1_ z6K-!$)DWPn>>(0Twl$RaM3P|60?C+YK;!j6fVHCL;_HLFXS*=eo`YyYpdQvoq9A^U zoEOMHJS+DQpsOsf8C&G`L7Nc*@?kX`AJ`0`tkSR%xiba!5;fZ^Se(_a+{Y-wdJ?LL zMOtORxiaoVLPA3h5?Gae(!&;_efX$LLuuu95nL+`g_2UWuw?C#b{~|5@K(c61ky6f zKWS&n$0DwV@eL>fh_w7S0+B8YrGQ6$5N@>*@Tki}N#Rjfgc9IUe=B4w(n@s2i9eiL zm8jE0q)rGR_2EzgKq`9<$u@Lyh*Sbm6%EovMgm7w=#8zRNA<)3%Nbqv z0GVyywgFZVv?yl^+53iUA`)Vi1`*tBFo22o7$^emVRps|T{(opEch|XLZhvw4>hrXBh#Jy&_I_E4@j>YEzpc&_ox_002J>v<~lbm*B7A)*kRr~rfv z+XLpGq=fh_A{HC=e#pv=5caMTTNwf_Lp#x7*~^V=Vmu!KANG1dEuq(-siPeTvFzbG zlHVFa7_kI^Y#QtmJap{2FdOa|l)Zk;YQ@5JAn@2TJqTg8T42k723!0YA8$#d8zmua26!Amr*F1qr zsxnv^s-!F53O$&$JZnYP%B)pcyR(XNJLR5T{$$oCIS*w$ob^c7f3r@nd^GE^tjDts zXAwGUU|(Q$-PJ6w-P^pcd4Kbd&5wC@NIn9+GmhrG9a`-vD@2+i99Yqn3UNCNNU#Xz zH37Gq?F_J;;YU;g&Iol9&65x?!n4uSvoav1q(SLxre2ljRnpS1G$LiBouz|vfm))L zs()_&rTIwn(PjebmAw_q)_dDvuS7yMEPSd27m&!X>=jiu7uM5AjSWkH%I3m+kdKi% z0Rbjk5wDuo(DCwW8%~xGY&@>JvfllK{)M$N&1wL*TrMhinR@ z*Va%{q*t+VL|Ct4w|WihRwv-0?g%B~p{DHS1R^SKy^~?0+QBLKxt_&X}U;&LMJRoR!}Y#~x1tRghjr=UgT096Ig8O;fasHlmUs0dP(z(p0WRog^H z#cdwKMr{o(Hxuxw>9GYK`b6NN3iE4gs7=_^)=)~=RAJ)e4FeBdBL+?-uvW9VL7$A3 zz*rRz4urBwd`6ywfdgL^&H4CbdmQ*x!L}vqH0|oDwO@peN~dKLxUR`Ceiw#P_QKk) zVnPTUSN6^~YteWlSAs3Bdo~bd?xfAahy&HJtI!w zIL?d{Xhc~6&cbh#>a`45qaeg~!4tvz>$p)}0M5px?9J1GZa8VCS_l4OG zn=bE9xUx92@t4q%(5%J^_3XwTX+6^pnl0+m##~pPi!z*-7BpDZ?<=XAU`?g^wu(3N zGBPtW6`8N;CX`Psw^Wq}Hssxy{dV3Z=A)sZ=B6r7)m!HOnZIqgvhml@u@H&Oi%vZO zEukG%^BNzkeZ2PC#=rk%#SUy&#KnYT3Scz=|b8-cd7OnifD()X{s^ptlw2%OcS>S z{)oWP$!-k%m1YB7m%u9lVd{>B_7hETQFKlz>?a=wRhNC%!uucX#?=-4+SZVOtV@9J z%AqqMd_=Ij2)>@%ITIxCn?pSCE^-sOf{2};HlcUzq7o;rE862CCc^I$=)T4iTCyaH zLukGt_AC>p+5*x`Tmdy{kuV67rfmQ1^=BP2obh{+5`WK5Y@PTDONTa05AdQE8coYf%w}R zN{aX^^b&sc#$)~x(7+k6meGb0{~197w?J*V(dH734`K89_XPzO0Za*NA^{e7FpTKH zL5ZSTWMOGUhb8=b@FrRXF6I4E_C2_Vo|krQ8rt80#X+QW;H5wFj!Ykw{(RaCu@7*M z6Me`8>bjh|+`4GIsnFJcKxG8+}Zm*vv7}8-yvL7ZWCo1z}n#PQ(9K2h! zsp!3;_lrI#+ETO**6(8Y5xo(G`Jw}rWfkxhXkcEswhnzn+QvT~@E-L3;(e!xqO~Oc zu~;E??lu!_%E+J~NeijY`5Bc;So7Mcqc zlt)k&VK58(A&4OXLs{7P;0LrAMVSCxhTC}YU0^ZLvgqhoFc2s^G1M{x7RMj8(NS1T z0(+SS=<#6%Df&g_F^b{B>CB!RV1&q2<}VL4z~#I=}s zZGm7;er=%(4q_v;E8i{z13wH2Txh|6;?wbaW;o0D*`* z&$(@5Pt#x+zFk0r;W%M27@FEoFmhG(CnMPusyHJa1KA9^f$`U`FX+xX&Zo zZJUTyDVNzKn3*yUtJ2Bz0QrDe1#n$h3M*g=+&}A#2WeoyCR zRG1Wp>i0G5ZxCae52A}gi5+`pvX1?D;0f5VXVEEp=u3gMDSBv%#@X3M zqbfmODyzSi;qmWKl~=-KoOfiU?Ju809|)`rUPI5N+W>oap3w65#Ihnl-^I6+=J|+^=yuXP2r=DHjm%lh^26V- z_NEH8hX@2(yx31-@#1fwZ=?}oJi(X=%ZW1(kn(~%+8QE3N0Ot%6WNrVP+v$ck^p5FJonbn_JU3F2Hl4R%QPPq z{8*k0`khFOyeT}<=XGDyE%mX8?g&(UDXekM`s0^KP6SpR-sXw-G1SH21lNL(bp}kw zIS}B(LdeOrHj53;``oFJBNozPGl+V*b zJ}4eQYG4UmK7ZWFLrW~8QBDk)A(SKvB@=M)VmA;0!Y`o-NO-{wYz-k$c;Yj1rx6+9 zzw`GZU@pSY=W*ageyZRHqtdk#30{0f0KZm_W5EYt?wo^!F9cJd!3zcjo|s~I@C0mp zCM+q=unRVp$U`an&4YFmi9vs2SELg#=Y>{i4M|G~Kzd|=St$A;u*x_uRb0y?_PZF2 z{t_Vxe#-^N=tfCcIQo%7g0}Jy1JaKZk_f9a)MM~GNJ#oILbA40OA1Oatf1hIcLFRu zfnbl;qlruecD=ZJ;jr`sBbsAyhW;f4z`al$l9h+JClVx+Nub~hJD{zhWH|T)JK9x4 zY=?aWK)$$~I7B|dh=vi)Kw#(#(<91?MbRf%kkLV(5V*bwx=BchdWit9k8ZkhlZH@S z#F89fUvzFE)Hu(c3}Rmdg`X%t5oBMavC!Xm`6SGKFQ_|b&JtxO0__htUgsyF_C*PB z`S>8?!S>t9&cp4CE}r96*$%*cVP&OMlkS$>!6PS_7|sQq5TO4l#>0R15td5jxM6iBuOn` z7VhwTkn=%~Xevtwa!ZC~D}Ae-0b581{ew7xhP@43kaIx}a*McLng(W+ZKpq^`*JX^ z92wb%8D%reKA`26E%avRHoDRL5&dqX(IM6)CXmo2EvCy3QlJv%BZ&JXCT=qnM+7|( zHx&wdKzv3`l_VMh?#;Iu51~{v>;LA62*RdXYpCs*2t+6abkDf$1a@#G-sE<06-l@n zCoG0I!3o=PQu#Hp-ozPH8R%S7t~jOUtU#B5R6aNLr+KMAU7PyTb*VpHpZe1csXif` z`EXUZlio$Em0#1}(BIPE z(YxtA^j>-&y`TP`{((L~AEXb_vtbj62BOe?(FAdrPEq?y1NWw?efCq*+Gjr{t$p@W z(%NS~C9Qq-Q_|XJKP9bb_EXY|MxWZO#-He)>0jt0^ild(`WUQ65SE0KR3i%(Dh(5H zJ*q@w_vE%>+7UdY^aK~#iQz-gyIVBe;Eym*B?J%=yr0$(A3}tPF@mfe`cwdcRNHfe zs|c&W41UWQ9m`5UR(P^}ikOrJn*7avWq3Zcxza_=+^1R`gr z4frb^>?zn=u&-c$K|(yX-FZ1-@uoY}18utJh8KYQG@`L00eRuE>6+N^;j~bLmG)=c ztKFS79@+EmN9;c}ovtY^?Nn-_%BcKsLQdZo6eP<@19Q444a-Rz_HgK=GN?S%2o2OG zjV`=Hp>MF19%v#y%YpbK18$F-3YZ)M^MVJUD;ukf+}H(o9k?TAc%bdbjiRRsyBh7F zl{e41G&0LHXofn(YYWwtbPiaFLQLt3bLZ zn;;R`13ls+sWtR_pr{+d@3>#je%HOpy;reMv0w2a%2)bMHHy*0y{PY(}o9x6X(zrV~@bw>Ei z@IwDHrO%cY)wdCWC_+Ra`fHRTA_@t6R;VF`@I!2C6U=CjG?9r2KO{Dw;s`us03sq8 zGN5g-6Y+|~gSb5ri-_cC5Vt285$H&~1z)EnKB6u7g!o6oMp5SKhFv^d09Q5#d7l>f?-Fofm zk1s}?5eI>~C@chlx;Xr0-_;|7MhAW3W`{`tkpuMxzdq5ilv z0s*qtJ4sPaz6gKLGKUBmCGM+y&?tfh^;P~85l>2N>)Vbf#g0=VIqR^s6^M#Wh5}J_ z7i^EP~1^3dO$aDHK%j>`_7a z09ix~Eb)Q`MZqFIqXkQn;8?;2S8Irfn}rTyh=^HYZsHT-UJoHwco!CGkM0|*x!qOh z1G6(h3!Dj-;qKw|FasWp&oZ%u3|Jl~z=QxifLEu`^vJ@`2uH&+Iro=fWLGL;1|rs% zExy(`*+=q1yssyHTd1kcLA}Rbe4;7Qu!V zfkn+P)^}>I(XOc{qG}0eBB-;q6<2Gec2(l;{z~mb$%qdp5_RAaydTU|+rfY1`(?3y zU2*gU7>9gr5vQ6@EJW40f_Yvy<<$aPoZxH@d6g2Q%R>o}+B|*@MgG&1BhZ zNX+Ifn9X~5HgAVlz-)MVFdK-48@u0rVJ6B*1K398GI}RjM(-wOv-ghmusvA@A0}q-5zOENJcEzJc8~@E?c&`Wo!_OC1Q|(? z2 zw(owCtPo!&7UC;dh%I;_{uho)I`Nq3Xj2&8L2iCZ^0cI?9AzXjmuQgeN|w>ri5YzZ zGun!0^ldm@+9~sXsJImVgBcZr>}qv&PIYc|UUhzTLA9p3NL8%rq$*LBs*Ea=s!Ua` zGOH?77L`?1sj{i;syi#IRMje^)^aEU*_J3<{@uyc+LNf(UZ~bKT&;cK54ECUh2$~$ zz4Ry(eh_e(e4i|n9}+V;05jQ+XL1nQvQC*uVf2rN{{YGWZ6}FJaX489KPG1I6U^Wv zJcFOZZ)!J)NlNfa_>J(!@aFKg@Q(1#@OR<;;X~nH!aDGYm<{cU(_k({n-F#49b~&7 z4gZ=X8Pdk+ev9~chG!rH9+|W}GopxOCCfw!Gx-$HLpXl9Mc(TqyHvTtFTq?ZHWpx>R5HYrltD#k;u-7$QZH z;>gj`P7xX$!g<$fUltcB3%nRU5|%`=Bl!`1q%cwvDUH0MrNJrip|7YFTfmRF7!~+Q zECvoRSlS@I$BRgt_}eSUiXg5JwMP=Y;a~7dMV+KPVvbZqEXgX?3g!Nc=Uy2(jEl&C zB22KCl|_&sTQV_rC}tji`GQri3f7mXIiSjTb07lN94yDr{B@F;t%ONL?SnY5_K8A^ zO`{yJ59F$1zuhTWC?W~ zg>|gNbx#8?g=eX^+mp;9-4nasIk4*yzW#qA2@=<*lGr0rVoxZMaO`^}N_;bw#Pbs+ z_J$G(AHGkb#CK9j?3XC<0w|Gi)-Ozy_R z#0iNKCqjvYvpOkJ;^9;hrzA?e3`!)t)5{ah^|_JrB7GwlMFvC$M}|j6N5)4cN2W&P za4?H38h*UcHF9>OTVz_Ib`6mfBYJwGb~6&&BzipUW+vB89($9?YBeiDM6VaW)JPHD zzBQCIyuEm<90j;%Pna~`nfQ)6I^q?7<}nq}3k>+vCZ@t1ST6*o!Znd3mn8P zya)?@KxFj$J>#DjVW06sSlal+5UU{~W)OO`+1{u@*GJkFhDhJ;Fhti!P#_{AmIXpY zJ6<%4>m$brh+#NxK#W8Y{QXV^tfwddfBi*MPLV(VqA3lsarc4-YLbvc5^_mGUYtOq zo=1cHI04l!36iV-$AaX3O5GNjAGtkpN2E2<0hiklxYRJ%FvKv_u**Em@U=NmO;!JU zBNijL+y#-pDne!lVD7PFInb0qb28&kiZlGj0Op>k2}y*`Wx(t>3=|Ek1n!Cy#Ap5( zfj}58?69|K!_u}YebwEvEP)YeX||Q-OD*ZPQE8*o_LhxF+gCO&E#hUooxP`cPxYSW z?c97y^Xc9*yk~mP@^JP@{M0?>9BNzR!N$d~bwc&IYMj8K8@o4dnwC!c!EKQ9As8 z6achHA7NRTc~|D$nVH32lil?|q{>AwDL^6%@dg(`93{TJ<-v@2#BV+dXtMXV4AA46 z-p<9DMcal@({iY(*W>f}JtnKu80sqwV*ALpi$B&ZG5kuP0D~mTtSE#M-nc? zC$FBGUK;+Ga1DC)drtG1=7%B=M;?jXkauIA5ta;XC&N#2P*>ehO?%I3{%^z__}*&crTEKM{E{LfnNG?*l&-5w1-0mL0uyf{Og!tCzFVqRmf~bxG@* zc6M5~wC-u?nRU&7%~FqSl)rayr4Gy9VcGv#0hTxe@<&+qzpoKVX4#wKmx`fDMT@!O zxKj=-I{*la^)C1u9j(E?#ZR!>i^)1Xv^w%!C~zwe;x zn3@0Q*y-5i_}cM}<6Fmfj@^zuj=he3j{T1B9X~h@I1V}vISxC1bo}J_+3}0xh~uc^ zSI032a7vs~=V0#;?@;eB?{M!3??~?`?`ZEB?^y3RFV!4u4mFSWPVi3jPV!FnPVrvm zz1%z1JI&kTo$jTZ!_ATAGH1Ed?5uEFoK|P0)8@20tDMzNhtuh-ak`xE*VH-P&U$Bq zGx^Lsy}7N>haEeMf5pz?{B{Dey#a4$gRgNa8PnSP|%nf#?dNghrY5%J~pB z>jeezW<_#8iVzD&;ic`zk>k9y-62{wGQfgQbHr>_^beh_K8;-2c)UZyj+NxU;pRcd zeD(L;CFItU(Ldns!Jp;!o{S+$Tuti0-Z*~t8ni+{sAKu!Rfhz85lH|X{W9{1S2Q2M z83oP<>(pPtdB(}l2k4MT0{$1NE^x$2kWT`3M$FvQ!>v#iv74!4wCY_E8sva-(kkJD`cbN`Ft~cCZ(3ZVzzR_@#;by}vhFcA~vPx5@s@n|n4YwQaFti%M%5 zMs}JHnGc)yPAX&tSn3uy!0rP^mGq8%ousm8Rk zeph`ltpg6yIn)6sNh$#~iEmF!fGd$mxQP`V2CBnAiOvF!McO_M08HEG0TQO|69Fmn zPdgLnFjVa`R1Bz%yF#%QDse=7${%(_oX&``%iD7rOQ_cQ4>}}1am5%=hgTwDt}Pwr zy2D&|nCm}zeV@Vn8&~)=_({WUxW?=?+^KX684rqojfte2NK$~)nroRH;IZ~pgd2xgEsT|^WNeI`xuN~6htx2@5f?7A@VyhWHE;bD~n1R+o$&x!^avz?&hOy^XiAfpY8kdWirM}0y$oh!u zek;t7uYGoWJ_{QpkVv8uNx?)?D3L@blER6kNFs?zBy~jJxz z2|TU8QhSxQx?+{}YV94`<;{0$AF|dlZl<1TU>cbw#>03SALD15nE>;WYpv^L*E-iL zuJx{Ej@Mjo>Nn^`hj>V!6wKCAjHo?XVpJVu7Jw@hs3*fd!B%gGnWdO5CZz+Kxv%O$ z?TaQaH;lRdBMt&n%RJ_K-1UU(N!Lp21kZ!bbF!v*!VHlB1=>kuWI*TmC0822A3Hb= zw_QB=h!TE`B5=+V2OsIooWc-dicT1Q1PR&0)d6Qm#Q{gg>8m{s&w0}Gr80GIX&>o5 z8B=oK^KACK@9F9~P<611NQ%PYww+)~9&0wayeeS1f1udVILFIttLHlBHqTF0+dZ#n zf2lfBb+qa~wesqW>db0IbyhVY*mzt`+7_n+20lO|YctWoauG?Y0Zq`lq6q>12oS+F zz>}OTAfJl38Bl^_l@@0sdilI`B18vtQZD-9*IRf9Wgn(5^Qx>LW68ko5sNRq z&B{GJ_;~IGBn!G|$A7Ye)A6Bah48DZp#~hx4H|lE7ep}cJr!FD?vXxL`FQ2U%o1sD zONRG}%1rMn>GSG`q!$LC%6KY$pL4(S)V$O3keG#n7!=qed2+QkQNR+(8T@7@>N_mD z-f2*xsC9%FNl0>!ya9~H+ZtMKrh%UaRz)wO0O-Y~gQgZWw18XR8e+%PAZAqVJK$aL zjPiTa$h@wuxvD+tv~nUDdjE{ZZgOTZG!G5)0W|1>S1SX$#uxiBjuvn>&d~z8#R)Nv zGj(S{H&$81&lKDSXO^zqTF8oZD;;lz{Gh{Xr(K{z||($%y|+ zMm#r>$bek(nLrP`L=1SJyvNWJ=b%BacoC6eu-~5 z9|tF0gKBH0x{vN0G3;p?9JN`rl2(Df{5*_CEDAWtZ@F-AC7pifEth7)S!sXP`?VoV zBFfPy=Bm&i{UUiZGlm(0J-u_;9;MLkUYd6;3+^Doo zWF|5D@@{Fo)H^9yANc==c=YGt9ZhCV?gGVhOM5O)Okpl#H2FogVw?C4+vUtu=44+e zPh+e_l|{B9dr?(Ub&;dUSyWRrIp`{S*H~M$rFLs=g{`j0U9_Wiw)d0TP|-!rovRh} z)!s^53&ZY*PiKyIbVnGHseix~ioc&RNp@+XpJ1J%&^o`FwjpgQ{2kjKi9*zi&-1qx z1p^OO?9bm`w7lX#{)a^?Dh}qas(7g4zxOjuR33Ic5;=tN?mU_-*j$p zzU6$|X>^%fWv-n~GnsWTzQ+PJJYQy6u?v*Zc_0(8ux{O$!?DY+TrQS7UuyLz%VV3g)IDkth!wKgp{K%y}0_ zBo!PDv{*3ey1EEvg~+|&S)R2~5sp*J!c0&fR4LY+1R zJ`U^%d;)d)BBm3I6nZg^7%c^LzNw}pOOKo3(&M7IcLTe*1l)q{VL}qWhuNrTiY@m! zk2o93yw`Uta}L~?yp4G}xU*na!IhS;3%t6o>U8j}Dd%)c)gJIXG590>J~5$`VQ6I$vhjB zyEELGZiPF`t#rG%QHB-bHfj*76f7)WB(6S|xK6zoZqx+% zT^U4_fF%rt7d{O<yc?^e<3AFp0AQF#k@zu41+=Jai-NW3& z-6Pz~m@WwfuO}HHnL_oW44>O_`W_R5lVNUUj zhAcWxkix@>|H1)sDX%!Y756BE1&2gIoJ0u$%v=h_YaV9;lEHjJKxe`dKLHaC(eXi_ zU@`y}r?Z}%e zO;f#;{fgU3b@RXJ9;xZ>51GXptU;=;Q$Gz=Uz9GYU9RSVXzHM9ommnH1Fpc;CKnFB+0 zAeGU<5v-8&mj;@X#rkChG&_%s*UakWRJ*}%g9K&-qIfap8nO$bIkM13rsKn4~hed zgNj26UujXeINT}xQ}E{?V?L~S&s`EO4I9Iz@LFc8`y&4_#s0>{swJwqp^N>?vTi9` zr($8Ze^ZM#wB4fX5?k~Yvc`Hq8+h_Hwf;}6sr4Bn@xd@ufgOhBz#W0@1&cMyG!44% z+}Z9NOFl(WuQ5R?L`A5sRFW?LI;@}}xIKOYl19bHA?#9U&b?GIIL5^}I7;v)gL1&- zZ(w*>Yt+YKN-CiatmTF#GNQ0HgvU6oAv7?1P(3MDSAr46t;HGYIg~w4 zlCVq2GLAO0atJnrUytPQpI_$mk+b>;5j$D70i}aW_sHg(x)pXWJnSA)`jh*7PCp_c z+VMwnQzzJpms|)kz$Rq1C74iPS|pYIxUD@B2qs*@c3c8kXG5KAMg$vQXZ+_6IVoJn z&ldG)r0g8OQhtq}l|-0Qm>c_PuAwa`vdHjUG;JTB&`D@ux&Y%;Fd~X&Q+Cc6^6?TU|7!HMh zwA0~mxJ~5F)XWSRjjxtz@LoJh6Ai15M1P@SJ)Q{6N`LtP`Tv;g&|tYctB>jN(kDs> zP~}w;SAABoWgyjG{bcC?$3Vv*$DSJDV&Cv)9QkD@v%2)TQgx_@xu@A=AujZVPUu44 z@2}3++?gF`afC3sY^Uz(dLQJ4(t{a6w(k?{O0HLtY&00ddq$F2GwkL(TFxY)cnti} zAZpzoN)MJEF8#6er_zhULrfu)%qTZLSaxw3`7#@uzT<2KAwnxei;9e}^NOcmhG%<-lPrirFWrpc!L%=gR> z%oO#^|ou?QC3#6gH2pbCl%f;}a6x5>VLLhL=0J@g>^5juA>M6vTTr*D5J*yB>}at z@r_fPNumUpJJaA=Tsu3s4kyfm<4Uv%A_dmYm7P`KhIo!qr1e*|*OP@zncmv;z=Y~#2 zcn{%GJ@HWrXZ}a^|Hs~Sz&BNO@tdS6=}LFg6uR4xrWxHyo3we&OY)K^;s9~uLJ_wj zf>H<|LqOaNMZp0MaG|)6p@QOM$X-r{B1>_7f_(Qj?&ICLZAUSAs8wf*Bz zZ*N|wRYq=K>MIh*HbmPSynz-x;Y&2}C5Ulpd*~g(pCU@B4yE*1KkL2vsrqU9>H4?K zZ=3n~e=MWkA?5%1v*FHmxkzdxNhIvjERiIU&ID6z2}&`NBqFAwsa}*npkn7GiLi>~ zzndiTq&Mb7K?M&eFwbXfJ%srr;VGPe@=B(_uFWYRZlECYO3t;mlv(nr<~-{F>p-g~ z!z6Hi$txUlRLsPaUvj<`<(E9|yL$wiK$keLHound5mFwH@B-*~F7Re1x{+^jq4j$< z7X`V_kdzHM`?71ljQS!fr+04ebx{vV9+vEnIuNxvDzA5b@3W~#mAho>^4!{sti`p8 z+P<~Q+LBs=mApB_Har$wB#li3=sKZ2R-k`7v`2$yd><-&WAH^V37#xR6U7D7&}8vwo_yX(HMyULnl{-Lh0_~rZp^T5hObyrkgS$Vv!(ELZ;wUsk- zzb_=ZBSHMTo$%{MgN5D&LdyXYdY{7y#NG~F1S_;&W4)H#--+P<4v{JFJifxK)7S8G zd85F4jmsNXG!C;8PINrD-g=@@U`eo~SY(z=77;dp8_iFUzaf}Ie!bO)3Y%@ov8+iC zzzI3zH$e`qxYIWTcc*WHj|lHFzZ-j(j|MHb+FcWoTf-2Fq$1NAtH!3WYZ#3~~^yO=z05*_}bWU-;y@gSAUX!02SQC2RaNe&sg zyJ|+0C!gsqYoLrKVgg+&!Kfv{xwA5M<-5!AUl>#B>c@XAP36M$i@ZMLD)jqFrcx+E zDYiFSV`tvZ2uC5de>s$nh~-86tl*_lT8id%W?_{7mY+4&+S-+`Ca~D&Hb4suR0+xO zda>sa$qhg+(2#A;rn1Lb8?!ChbT-ebBWsQFsK>(?QAq;t*iQf^SoN4+B>sHW>2x6RWUldDSJ%z*lZ%4WQKeF z@H55QKTnK}%`~(jPptifX#y|%J{I`)!5)Z`KLGyAMgo0_4CrRXmZ;JC?_@8iUQ}(2 zo^C}=)xM@4Kz+Q)s~O1xzk_c`EY;D7SIR20d%-};dCVJq=K1UzIKl#&<5mw01CaAW{DcntOh@vrg(L%W!1on^(b zHQ3I{@Z%4Rt>Np!fncy*ih04h*2ilZ5QAWy7lJe`GvojuSXre303eiTAqBfC_EfwZzbyW}_~r2{;#bD6il1kFC~Zy2Ma}Kbk@AF>eGwXHlaQ(vJzXX?j6FO83|%X@H8SpZ23=d|Hx0tJ0@A8_01Kb zQaYk8bmvBF!ci;!L2T}h9*fG=6|M`iqWl}z1rfN|N@!785qy}d!9d155M#59fl$ik z`xwbuMJdBs{0`p8pkQ~8!G}4~E3;Q+zn}d<_J`T4v)5#Ql>Kq`+U!rVKh6HS@tekP z8^3F$!BWmAfX5K zqu+>L8hx3B25;fa(6S&HId)lcyso(avMjawpxf{{y=i^R$^p3j0wrUadD2U8{5KC1 z4#3TyO$m4#-$HVUoe7XHoNZeZJKwbujM|pi`L2})@8ByqAblWzA1nk3)bfaTbCu{} zO|oQbvLOGO(*$IXgpND6s&*uF{2=%w`BQngwMyHb3cA9YM78eS%mnXpiSNjEcmOVE zf@Oh-@A(rS70nc(P#g>np&ec#5SH&ZOp2Nu6u7xlZUYQet4$7R1=JXPC}3?dY|m8QsUOH#L8`v61_r4LBHlBmX9J11F0goQ$EjLx4UAL8IjAfQephf%SyBEC2ekyO z^m#t;7Yc^qm&ARaE*b5AO|?WdN%OVt2i3o$NkqBxpWd;GHKRf)ET(+hOJ56A37UzO$3eRUzZV zyR4m!z7tN2GDw`bZ9;ceM6#8il0x`pHKw!t< za4Ea29EJ?h%mbI=drTn3;1Dyrticguh>jkJnU*>b=rQWjjCg$Ju9R)16fs3n|pib!s$ zxpb5E2Q^jNSh`oePrYA#K>efoC-p(~&+0?!!@Sy!Ef?Btxy)|MMRrfG#BL-&*fj%$ zgi>*LnHxNvqgeb8Kq>G67upb@PzG2CPr`WVi2Qn$Lx58jQ&d;Ir#P-CzG#+luDOr? z+v03}jy_j^jx5P`u55e0v}k3`cf~vM2gnA>2FVVV?vsv62k`t1v1G%03U8crW^r3t z&hGoYd92Vayr^La%bX3x_>vD#gL&Ea=99wF2{d5HDD8({8%4pjg4c3a;{*z<;g%CU z_p@T{T`E4R0kj^3C!w1t&TzktejHu7A;zbp_?(Z^;r_2oToFsM^8G{FG9o z)GJ;3*@k^(a|~sY#}YEYM;t-~SmlNR_zM!zrB-C!I_OgCIJ&nD)#X7$5SLo}*gSQ4 zKE`bjaRwO5(cyy)IX0qO>qm#E69v}d_KpId;DmVasdvTP=){E5&1C^^qo93+Bot)3 zp?I$33CWWZNpC}5iB6@sV=b*UD554*1BlnSsHInrR^}M`L**ao~n4d;+cwPEB03H zt9q{DXafyC=VsYFNx+>wWx@Y+12D)tt|u$LZE-X_9H_CaulOWkL&e65BQZx~j>WWA zxS}mbXRP?=!Ief=EZQbE9{%e{v1#xH{u&%<9tdgnLQWj`E_u87c=b2pttH~vZ6(`F zc9dLGS7zfKhk{j}>s948SnMW|_vr{gg^fEAW7F%%^YV^68LPAftN*}?((#9L{vr^E z5d1P^=u`0>LbQr=AFOc(_!3v|sABOtlGFumFdA&NHV@jp59yx$<~sidBVU+XrMF4h zD~3tUC;zufZzl=EaY6}D!CiWD`au#F&B%Qab-l?judADj=)q7RTt5#I4tV%Ur#Q))-t&k85OuQKWa3(hw9Bg(_(f;TX zn@Zp)I&S1TEOP52oMm)Vw8W*JvjYSUL$Zo=m!_AcEV zGw}$PLo{y=-kNxXT5rKy2Y#_cBmBi~4TS^I2N$MFks#zy(RHF>qHS@trTx1EhkS+1$jM4(!_PJQn1f{?6Y>CEG_t{H^nf@sK( zg_;&+ABK{)?~A^%9aBR}+|RLno4$j;*AfH0SXdyj#8_f2O<)(S+1Kpx!~cbUwv#1~ zZ?xTnTXE06`etawxAD0Oz%4cc6*j?(3VW-K#D(3HzMJ1$2u?Qs)7S*|KpV-Eh6Z1I z0|68gZx=3}2;6QPZo4CpfFq!QJNZKhz@4_g)3H)i(QqXSEF*1&mLf~BB|!9G6lC&0 z{-rblxXbnj&ZHM)k_Q(v-%?;HwA>v?meG*SG#rh($<{)tirZ{sY~_{;3$dOEW!Hm@ z>sikhv2opyM-;wVNK)T)t$`*y-haXqY$AU)z6swGXu=cyCp^j43R3TFw#j4@1eDTX zp)GFsh`_7iV=VLWV{$Vt6ka5p*K1_bSNctQAN&l_Jq2?1A=U)zL;%b9{H;0WP{wQ- zWQJg#ACg2Zv!uZ{_|Jv#>54lkJ*q3H-JX>m6**Y${xHWgY@f&zl}SoVX|gg!nW{`v zrYkd)H732uU>ZqxH?IyArAIKmV))lh7E@@sIDMe{_Nd~6mle7o)f$VymF>T6_8%}0 zA`@4M1Jlk=Lm^!hd{~7_jh$n>#rUx8{^SRewLWq$P+nS9N*T^D-bg=UD>VIQ6zQY3 zNoGI^D79)@_3LGClufUWDAM}UhSEr`=@|J~xm!L?K3+aSevf>j{HMa+s)L1-&}+b;eM0G^-+2iXA`l-?&vo+sKc1d# zo8pvr(2v<3w;fG>xcVByh=xj2mFXJ!weq3z>*NOthsl2|G?hkd(`b2&^yU)`r}&tgU6+%8HcbSru7($|e}TE;DBhHd;$#sL6)D$|kx^p<6{4i63;t zJ&1^Mi71yH+MU{6+TGec+LPLUw5POp%OlD~nN^b2DavJBCtkB^EkM~h3dY~{jR!;U zBa10z@!)%Z(hpwJDiq0>QZ~)MT)^bAAr;qFTvsuy;`)jkDxRlbpkJgH(erHcZBN;5 zsvtT@K}*ev6l-)X8c(u*&JrXWJD$kK_BG_Z))eT$x&df!({hH$ZCsjvrl_CjEKz^a z*`g>(xp7?e-{!9I<|BS<#BYt5mX0?qta9lH)6%sSjK66?0d5Xp3>po7fcrIzFTnjD zP{+^z$3onZFv1XHcPrJ^Geg|}5q0dZVEolFk?<_R5}ub@-n6uk^1O(b@=RQsXkUiwWW%Ddx}GBGy1l31gk4~0sfy|WSh|w zwi#oLJqakNXIVA^ygP<>G}5;Vh;KhToE*`kOWKU=f~ zZXzht8<0yY8JbIiXK20wA91R-$6p}%uN@UURE@R}Bk0IElufYcdE?xw+BJX3-K`|$e(#7zuT z1T~bK7|U$$+5B!}q=$4H!_$=l`*A^t2zwy3la-;Nop_oNUU&nXSm@P&uZ+GbdLJE* z7k<4lj4eTZ7`1@gTNDBrmXBJ3unxwnC#dgHABvu&o}!+ro~FJ;^O#y}^ni2|T@h+Y zYh4J7*i|xfI_GpNviax?5>^#DkS07MVi; ze-8qXP#zC{^e1z4bBiA;_9g( zxjmKFiUgiJxkA{+4L~9IL>jAzQ^YG06jDW^B1w^~NKuT`$>=mix*|g%Q)DXSiY!HM zMIS}BBB>#{A*CU;A*~_3AxDv`7^QpOyxq3LHd+_pHt$Y&D|Milht47ZyKK1v4`7Sf zGkg^Elw%aTZI>nzauu|TTmhu|+Fz<~NU201M)9q!v=;%A+}9g!3jAugSJE=_vJWPi zVBaUqH$J=X-oSXvzKgS`B`1rxOn^D}4p+*uz0JVQ1Qcj6NI~v14{a^|!9a;&^1_tX zpCPeT44jM=aI+XF8Ozg<0LQFtm+vY(cuYbBZJ6s6-e3e4r>0%z8yJm~7^)!5c?D)l zKztUqi~JjF3AW*C{Ef8)OlL5R)9`*%fq*)Rf%3y%Re$VH0t~F3Y$%Q}hH6}gV?zln zuwZb-;jJf$21X2$8>WmTI|8JteQcBurix%6u8s0B$^eHsPY?MW0x(WWoX1F8z%Ti$ zCH#*6g?1w2JKgc)hC-MpT0fEbU+@!|6YxE`i-^@$ND9 zk|Y(M)C=6Ji?xrJ&Qr`+ysBHMhzG~GnRs>u@9N^gFaD%oNz%lawC2Tx*UM4IBJj3s zV)~@?(xR6XlhbFXzi3=wU1)t-QBGITm2?$dP1n%zc0FyNYw0@LNSo*c`}?{NbRX(g z>(=N#(n;;ltJms2lYK5r0^Ws0jD=uAdZL}TSRSHVnq+?r+!KRsa+2-iV zK=nfU$~*(>`J$}_H zjzjeE4C4=>ysjq0{$0%XF+WrvuD&7ud2w9vz_dXbXR7Ad&gKM@-I=GDRQCjr1Lh`@z@vk9Ib2y*5O`dWRR-l#X}>-7zKv)-b&>Fs(( z-(PjM>W|_-i~p{gB%3C?QZrdLMfO_WlDq}#h3e_D`(!g@gLRjye%36q^tKahGeApB zLA9V-Sp8Kc*O>ypmeYgg$42BZ@FZU_3Bj*J==g{&eQ78Zj8;z7a- zgod=*v=LEvHa|izPHvPB@`+Ss|2*wPnlo>zcu|Q7Ht_h%K^yRVXRc6$8txRvG_z&> zVFA$CZ;kSJ^sEq4P-@rOmsMEP^y1|eua^8(<4EhB({l&v4r54R2|<- z_YhZ0%b=G&m^+Fsf?rv1d-b;4;>vRoM5$$f}BSj@J;6qXGY6|EN=m2oe+t z-u$P3)R|(8a5B-mfj|RB17~rDs@h&-KePDu;sA@Ghl_CnubN@7|CxyG6{CQ?m??G? z*V-xYx7S&qkO2MIodxUBWW&jPptwgrRj^TRz?bVWP=Lzu~06#P$u6_cVNtn-dj`W z319E~M&HZnr-e(cy$nnHN(?UvmrG|EUlv~0@K&$4qK;~gY2LKHWwj?W$%x(WaH=f3 ztmgf2U^Y@iFh-o->!3?l5vS@bL#?sDq0V@=!Dx(^ontuHkSI%%CCgG|^YYF!JeBu! z-ZOd6<_$0mG%PP$Q6^SKE9*+lT1vaW@b|*gt^F5qsv=HRS8%FWhg5?I#l(~W)D*L&u;hB{X6M(*C;3v;4)s>dQ%8SIrNNIhn?u25k}6d!;T8&S(k9SL76s+>I%iElf)k=-m~$oq{q1Ml&%r#$ zRUXjwbD>)%;twGJ=h^#5#mg{fFAnD?hVJq7Sari~=7E8Do)3Ahjpm6h0E6rakOhyY z5Imuq9?SO=DUU!G!p@)IoiBnUDK6t6NJ=D0DY%r;P)facZtN4WPsYx}hGOS_8Dz2% zA8N2Y8D}DbOdgNDJkT_+fZdaD8Lot+bvVaC_83_#zg0B2z<#m)68ok0tL#_9hpE9I z!i+o_ddcW7Tpsv;WI}K2RS4a7fPIMl8vC{O#fboyTL?s%Ljy^D9TagyEcSAS*_%K* z{sEZ;^#ZO997q6;D^B4bG(XwsdixFb8|_2`bl!v>WXjUuL4fyb6@Wv2g6YB4&&j8up;oL~hanhY^fk9RQ2*Hy2yRk{G z@=S6xd?B7KA=^>_n(TfXzq{;Xu+DH0v_fOy3iZK9cH6hIHGSAErV!3+97%){+KIhF zb~|5WHOjjlT8=L|((`i3uQXJcJ}&#LY+YGopAgw6bmTta%+gwU7NyS9WgT_g&?KY64Z^Ih`2nBiOHF?>^@)y%~W-!!j5ONETw zuz)~28?@7ffBP)Cmqa3ok*v)aUT{Z2v8urIdGZ4ZUnXBsc+z}bVU0?!`l4`O;lZkj z)!)=VYME)7WtnZ6V>x9WEV9W>27$8PAXMr~%SwHhg?qj^n{JO7v>$4&HbxBEzhlr? zRnid<`dwL__?t80_>PYjf$o}E>_K5E(4)oa1v0kYGt|v+>q4iTFI$9XvZ5X3)W&Iz z(;FYO-`6;!@%~1lK`($m&IQL((H;lxn*`0lv0QjQMi2^R9D#xs0W^UkZlmkzayT^& zpl~K^C2+f89O;ajGix5PKWd+8pVhnz%V7tA4~4*0Gn;RWP!AzEKXDG+g&pGR&my7# zJZ3Kd$pUuDXeiH=Po^ewn_&;}@|w9AN6N$T325GmIrHY>_@w=3ykspZ^5;8mdfYy^ z=IWZEHKS|XHS_G_YPP0MteI3Zxn@euoEoBIQuE1DOC9)enNQ@0=M*Q@Cq-&>h{2_+;4rz`mpsy`y%^d`%8ABK`($mra&n-3K|0d zmH+neRlfb?Qg2>^rl|y<#uD%LFby(t1JJcCMq4+B{;#;FMmne4Uyp1Kb&<{Cn1U1X ze`j;ZDv~i>-eR<$GV!+;O+bz7XwETbSEp-7;X+%PH|_pWxQL>S6c3Al_O)kDe{k2F zRV7{DHE&OK;;(9HputZ|2vwWYrDGuNxi%4>Hd3dt>y%P^$Nso{oMF77YXec^XmI|@ zHUnt!9rHM82GEft8kBi;5ZaN$;<4pk0)+@fLMOVa5l%j6J_IFQW`EDV+`fX$4eb+F zZYZA-ais`lV+OiXL^O*Hc$tU>75IcXTsih0@de(v{2cS^G|J{|%YEXGycqqV{rT93 z^Vj+T?geC z-%8&`pJ~t=`xy+z&c21@$t~nZ+#=ZR$LhNSc6-n8O^Dn%9DKaJQ`W+)N5lso?`%;x z*W>ClnvXQPuj|21p!>NVtl&M#^jp{#kuUeOP@&eN=r+{fqin z^>OuY>fhCWsQ*;|rT(A#Z}kcFN%cSKQ)-|QXoQ+;4MPpr8HO3IH{4*j(QuRDX2UIp zTMf4v>WvLXv+;JraKjyj5r#VrBMqYrcNy+Bj5ahG#uzALqtRl_*A!?9HAR|YjY88` zqtujWRGLzaTBFfuH9E~^ZMmjGQ>m%aRBLK9dW}I-tEtl%H6~5Hra@!Y^pyHsJ;V8E z1;deF1TrQr>2;#U9llZWv#<6>J0jbbG*|=)+P` z0l^{_4u>k{kR5w9;NAWdU?XR>VdQW11e3H7$NpANY*BN&WdQvf3w~oDa$3pV8R+?& z)QF|Hi@uxwcM7WbhtLUi()Di*1Ur*!n@aINv7|tiH#vkthGtQeN8QK4|L+C>ZR9;U z>|DtCQ}Jiw4JE?ZFT`Jp4^;eEu}-{Ryg|HCyh*%S92I*K8lH9WTgA?t_3__`w~PDf zc8GV1#j#JO%}bk~_Eg%_Y0soxlyQY|W62t;fZ^9rVzuS0Xz?`MwDkod_WO1i|6XUlRYhXR`7)0rAN(5ea(8o z9De>|8dT#Jo%j^-)hkvBtr zzdSwv%fbib56T~sKP-Plo{`@-uaD|Z`ce5z`7HTt`5d_{zuF|Eel9#zn3+GS;5++W z1&0eakCI0Hx-X59$UPjtY_?kGC&P^7EI`v{D_W; z=oocG$3%3@hTO8Ot!3NFij?J96p}aGn4>Yr zVhlM0>IT*=qu-;K(<|un>wb+n9`jqw?=iJGS&h9L`!v#pf5d!Mk=>ZnnA@1w_yIk* z?o`aN>btC-x<+IgDKUkC-Z)@eL=Tq#+A*SY>7wlFU)c>;-#>AbnABz6=zaK4h5~)z zEqHX1p8Z3EI&Y|!LNr3pWb_F4i= zi;f>T{%Q$Vf%v;BgkF_L^r~cQvLOE&(Y2zXk*LytJmK$mOZy*p{bBjj@|UGM9eK4D zTcUxH^VK~58 zwG(yf3Cl@KTkA;u7jJNNesWwytA=vO*8~e*uv=n;f{GwPlOd^jkBkUHaDV0Bd{{RR z@%+RS5NOrJWg#G<0GzZp;;^XEP$^ESoKZQea=YapyCc=v49wb`*o^R9>&%zhDDx|o zyDhI)GI&p4>eU=GV3t*88COanMlP3l z6RZB4T2aV|nDCMxXwcx*D@d)7dZl|JR-W$0zU^2)rxzKFcw1fl(puNmD`KW2FD0}^ zvzUFF#SJyf&*Efo4*Zw(X=1@!*>7jRll^Y?vh4S=muIiY{w%u}!-s*VJTUMQCLS~; zaHZiOCjp3I?oJrZCka6;b3w&j3CZ3Pa3IG}!KHwLUi)SvY zxV$0*P@Ip48lYlo6lmm59bqr{hXNLoK;wiAU?sU^0GmI_?oVR;Ne+LK)1Tz>C!OI> zI@6!j&!2P_Nuoi2-#bKWK!dZr1PT!-a1Oo(6gU?rWPtPh*$(h>K};aqfnEZI2=U;2 zZ>Lr0eNZ~W;jN4~yb*^t;_!Bw!z*PHnItBeNnui%G$x(NU}Q`tBWJRh-b^1Ro5^8v znLH++DPRhjBBt%&bY0Jk_3_poMw$ugszJD}qQC{X#-qT6B;g{QkO40CsyDaC+z@ax zGz=+pT&cDd76sFnQ8FcriYaBTi#}DdFkh*1Ho6+;*6pVawp!b=ocD61=DcD;EK3KL zZ3|r}8eHOg1#ta99klhxL1+%S0FVe5&m^n{mEcjSMpgqs26ZwmvoNn(_e;Vjh0j`G zwq|S;?1tO{3jQVgCjh*68LuzjGPymLDIQ#kzfDRP4=(ePRt2P}8Y6$t z%bhxy7=C#-$VdR{8KR~dUW~1Q39}emOC4yiD+L)x^tX9hG`Pb1#LPX?5{;r+uAYb6L*YO)!a3}~Igo31 zoyIc|(TrO&?(t5R3mYp=AZ9Y9E-w1sIu9qJX$(6bev{+4Oo7*hXoSz|ca}qx=N)De z@=O)#qF2VPiW^b*bBU<(fx17^K9Bofe39O^2Q&k4_B|N`I+{NMKH-= z#|o`;9-dPW_{|fI@HbD~ImIv1qFJ=%E^x3SJ{@D-{O_I;lk!}oZR=z@*WUS0=4bZX zWpzb5@$HURPf*{ZJ`_DkJw-iLJxzUy<}tO{==rvYuF34T)l!%Bc@|Dv8t z$9`+1ZX4U^ZXCz{iixJ2ZsRxk2bYJ`x113onsNG;d#uD|3Op;K5k9LexEz5w5RGsS zTSMVMG{QNYorbM!U>S%;IERNrk%4H0b2u5wN)nB54n&Z)KC-coZ0sW&`%c~1_oBJ$ zik)#1*>$(}8Q?4-meYw!KVFR|O^lPyNJwr@>|i%sy}&Qozh;kN#xlQU|DOFvHa}Z* zl_y)&4YNh>^QMMEBFyDvrs1A$613x!%Z5~pXRfOlR&jmB4HeJRFVHX2i|Bc_`L?HQ zH&qZFq@bndL*PjmZz_Rp1JMZA%QUzKkHAvkTHo;++!(;~wxJ~9I+8GqBwSAtZommN zxY0W-8iWk|+B(rbOlGDq_cBwNY0Pw{NIIc}{eDmx`&$UKIO2Df+>81lK{ zg@RkX1PT!-aGOt~c?h@TgbXm;yHj#EZ*inVc8LqB;P$;gFo$`Jd7PQcJi#2+wl&j) z5YpMsDKPCJA_Yd^YfXbYy{`wo3~&d0E{6X$Cr6@9=X~ZVh5{q;ZiK($h*+VB74js5fR8-Sz0C|qOh5qZK`F;KU;0my+CvYpwl1^1XUnlU?D@6=+cNum_T}~!_5}>VEE}|)6$S3X z1zpSLP9P-=1DQ;CRg=r^%c~W)KyeYOm0kG%1|#mpGf7uIp6>8ATkGfcy^51EG5PP05} z8cjWA3LwE3{t}eHx^BTnUf>=171LO10=2@l3Xc2${kiE&)62{{(|YSh({9rq)7Nn1 z@0&;7XPQX;Vxqxa>1Z*U7X-c|=;Vy{Sy2z6$xCS7#|@44e17b@7TsPsbx zhYOArd;->hwO~Qa!Wet}WNJd~v4Sboans_4d#P8M*O(>Dfl`Qzaipt!CbjTEl$Ae9Ww6K4G?lPnpk{&zUcnFPU}BdS(N&k@}K{bUo+n@-!k7Z-!nfjdzpRAeufyn5-Nkv81^YJRp#ezJ_V-v6KOD= z{E+YS5}LotV|XHRigyKP7B_({QKMl!;1^Ucsy0SX(CpX!#2jRPW)3k#Cng)7Iy-8oMZ_u0dzcLoRO>fsT`u?i3Reu!!S^Rg^B-u3Cm72-2DYDn{mgFr^ zFH}#L-6xwN8?3ur^|NM?rMI16ECVgG1=WITVf9y)Tz48gfWJy2=uah4r947y<&{SGq+E8jP-K70NO_es5?p5zo z?^hpC|Jbc+qf(kijYUIitQwofu34 zXm@INX?JV)XisYY(Vo(_^`S!;@-cGPp%uR0RIkF1K? za!phkY)ZyFxOng&KbRo^jrx^%Vt+1AuQvf@U7@<9PE{ALPpm4fD^tHDRH*x^mFg0; zw(ijit$Jp~tcpr?mAYD8qt>hcWd33ZcDm zH>l0(E!A7ADRraTqJF$$Zp9N7Cm4s?sV=b*ol~HRZ@p6ncobi)ang7&6DLu+M`T!X zn-H90fFnRko4^qd9>zNh9VS5<-}4cGkE96Fn&%7&!J*_Rj32aKLaGps_ z(TAm?0)hcr&QiTvzaDG=zHVd<0>V%t529sL8JYzq*k*)ffBzJCyc+gufSmVHg|-rY zH4#vxuC(fr#)5i|ck z_223f>XYh!)Th)yBhUynEdxun3@dedpi(`<%)evr35Gr%JdRs}CA!to9?QaNHVH^} z++iMJKBBwRJkq>4(OeY3&ZGpgGpW$dJce^mgQjdQPNH;ka62dhpGeak85qY^9?K5LI=p+nV>UZ$cA3RMlo^#NcN93pc>#QYLdar7EH?8Z#|P|@3G&q3 zIIMB8<2S_$Bhf$zEljb42)tj+vs`Ttzz4f_*nR={U=>u^`0^k)x3-Jl@#hDm_(UA} z>TdcL{3FW5#4hh<@5O&Yk+4eGd86IO-x@(jf-2o1sM0gMEeakRbFK;njrPBHY^-r~ zfn(!9LSz6_GVA6fxg{`ubD)|4xZnpJ(8;~?~0Wd=|-o9zKhqboGN=KE$gEzOrveFU?TsJFDLpvwfh9^u0cnWv*(G}09Nz#1W z`xgSe!w|@cu7w`(JiK$A;}IC1LSGA;G{grNN!B;W%(C^`4cfKRW4Vnwnche?N8loX zn$h4H{4EnMKqTaHT@MPmL|lOGajw!cT!01#p-kMJe3S9tJ*xG;vDo0KWD&4JRN_SQ zU`qUtbS%ar0eW$sCB~9(`9xY^DYV>e3lL?Yp^cdqhecVej`wlcl^EVm{eL!_quf$q zA)1JwT{!_Ci85Lg;hsPuIQ&I$I{pbRLW702{Lkhhn~0$Z=+O!IXmV0AgsSrf$V6bc zBE9eq1%LjOC%)DX4n8RfoBvsmG?gUX205ZuB9GUT2(D91*X7aq^lggU6%Xhh(p{|Y z@3>ljwqvetzRpt3A8D0mq;nwKTXDAMI&Mz71t*;cNi+OO_xqC`@FzX!PdbXHf}Q6u zu@hktaV8 z&R7I4aa^q!5~%y7uzM}u{W3>Ml8R621@6@ic8r(KQ_NSqs#~Zq;D=BA`?i-mUe`Ti zf7ZUhzF09_|AKK!>_~m8o#+q?zYhO~`H2OI+;>8`*^HWJWed188~CzW;%fG)0BY?9 zu*B_c(&vlnDZBkD$JLJEad*U}G&coc6?(WKYa`6T+T5Iv<=6AL;WxwIhV@z3z@9W% z==HlO$N_M-2-rl{aIYi`b?`4G5X{26l7O?~La6tg)ja?19ztcO(cMC*G<{XD_iqQep^jLMnZRUaY zCt?Gb)7zjCS&N@A-401oe7}rHiT)(wXzF%Hj4YPlDjE!TTx`F?F~V_`{Z9BWHTXk; zOz3^M3czc!1MDLmqa4@T7bgOIN-)7B^R7Vq{JWu$#7Wm^$0?YP%yUcl1w5M^H`s5q z6Ah3Dh91CcN8Y^cW))EaPT;A{L<+Bg=iQ-HUbo})GKhCD;~Xf9IOH5+1Qm=AOr*@T zoN4l#J%p^AK$#|}Bbj&8nDo5&ZMu=|Hz+=lHY7dTd=AN;TjqoD(%V(TRd=XHsP0sa zRE<*IrE(~!>bq5=RZXf%jxnmSDz|E)YLaTQYKrP!)l}6q)pXT;s)tlpD6WJK)eyxs zihy3&WJg$D*cABL5MJ25{$AMBU|!fX*q!jgrU&xE?hDNen-QuP=HHM=EaD^E`X?3z ze%*elMFi&uKC|HvXx4xhyy)BF<^fUj?d_$}eZe9b%6dhy0gwj|8qlTg zrO}s3v|w@I_Ado)PlK1e`xLmZ27m&uc#i=Qb4YlVB)movmXL(kNx~Z>VJS{10dJ9n zw@Jb~B;j3>Fd9##dQ&!B)CW$Xd6fVxc=wFsS;qp$YsCv4&p9?L-jt1M`SD#XJuU&u z$l>233CnQ;4OVy;8^tET3-I|7RzUdQK6{GpEX{Pxa?EzjaXjXD+%ebjgyTuaJjZ;; zQ;w${&pTdlyy#fuSnPPo@v;Lk`Pj!Kqd7S})Xwo>CEtxg#mwKv;iUQg?8N$M^{+XI z22s#}dmi*j9h}MqX`n!!Yflt7Gu8V^Ln{2B`jLdQZ~`pto{HWX``*ye=Gi1+l9xas zrZkv=6I`ihq-MegtScA;mO8e^zv+0(aYyvqj&~gII+j7NYH}*iaTkCJ8@ynJi$Z|` zI02S}_YQ;xh9jR(5(aq*6l$SJ@0%V6|7ArHgB6aIj#ZBL9UnMKz=b$_Sg)6pN#I5+ zP+!*sF2UQ-;3Dq;h(8!D$;$9*0|1i1GYQWoEJ#?G@La<42`?nPn6M~eal%UpFDJZ` z@M^+q2}=@a@PYS3q!5P>Wve;0ffn8K<{YW-H-8(f+_B(2$8yJqj@6Dej*lE4JJvcr zaeV4n1;0MtBJ#hMHyociR#g%W(AVO5Fj}(4r;|dF+6I?_H&hgOx%QRXWaF0(Z2oRI z|0`uz$*z_SkzFIZRyI_2ootxwdf5%K8)Y}iZkF95yA|HV<;~ws&fo2wzq9#WG|%4+ zVnLnxQX6G{rE<4rN##<@ddCLGMhAln#RsDQ%CW36%eb;qo4%^D34Da>f<<`P90BuA zZJgFPz41Z&eT_33?{D1fSZ5&`#Q^^%6!@59?D@HjfI1LW`DA}QBFMP0Zkq#|H%=l%yE9H%s)8xI`%mNBsA~GLKE=wMHgod_$M^~=m?O# z{8QlU<%4jNME3H}j_XrD$Bn}h9Sy#~r$M9&OPW)K4>hL>k4-=9ID*N#$|LJhI2aK| zIp(0iM(#s~UoZSafv-ryCY-Qdwt>@HsDlXn>NxKB&5;2%<6@)Sjx8j~Z@!c+K=A5t zay))>NdW#AXi9&>DQ(4vI02`$4HvixY$pjjNWxB%u!|(@CJB3RLOl2ymxR)NDO<-U zNx|=qKOB_hPsd-5la7BJryRg3a0;CwXOvUyBr>!4Khs|v(az@N?a+Vr>stEROPm3J z_M{r&|Lpzvp$}r{86SWM_ciZi+MD&4W~@-?yCR4EVcDccK*jpufuu$cXq| z%3AswGM%2Ufd~ur=4sW?7y4U04GO)e6wNP?2H$z#CM1cNt5uo1AKF;oY zi#!qox{K~gF(4Y0do>KyFK9RSJxTb%OQ28-BG!`)m0fTkLLUqv9_h((<~sA71gk!v zt&AvW`mjAVSCNuUPC%)@UeNPqAhXsXzY3k};-{Wu{D-q%ArDfE|ue_@Pf3r6>l73yomq|&rwTLpt2_q36dGFM z&Ys$tj5G4w+0z8-u7%x`IIjd*N&(P0gC2~QIa@dwMGpfUjFvkqoIwsoD+5VXL}hu z7-4z+2xq|~p`EzNsi-2zLV$=F;3wY;b;B2WK_ZchnICa>{v*zg+3ADKiMTss`F3VW*#7EYE=30NAfV_-5|q{0 zvQyINv^WvWatQuSb}Rl(ORTcM&$#4};FY`)iB7<)At*GD%R_?X+MIT0=qSAfdV+D5 zA8s4RFc|JGLT-yn6el8Ez}gQHsIdzRPNWebiq>|{TbeUy$RLH&Nw5i=Qh_?-Su{@P z4)%@`>nHZ{F4`RPIr}{g_PF%O-eSHdhwc z5Z{nS`!SM14=+>(3(QXEA=xv4MGf@Ct*6J{$43+pfpas@at_GE+PUFdpC0>wubmr) z00(8B?YuB^KbwS%n89ZJ;^WRtSLPX+XJ$&{&L}&x?5s>wfc%`y{?79=&v9N%c9g<- z1nY2VCK31GuU??IN3gf&mlBf>NA*vM3H1KH)dQi&$zVS$rS}b<-e*6%@Au}hLbvdu z24aBhus{FVefP4g&Szz1Q}g*ny*=wSguW>W!7aTL_eM`-Hz5WqX?$C9-Mi?0ZwUlbk=L)F|~zmwvWkU)dZ( zndGqqVxau6CH80eCIq|XDYKT|<4e5vNObdmkNn2JCShavus^xrt>^X6RkqM60sB($ zrUaI{sh!sUv_aj=!+t;E52=p9HYVD3n*03P@{HpJKNX#)c_eXw<~!~8+KuH)8;HRQ z!=7JYwg(`@F>iC#UgmydEy36yrnNP5zp-|D?AP2qab$fs<3+&rg^Kkz)Y%5CKTjtu zemKpq=YYf8a&rm|;C6oP{EDY4p00SN;@OJ5Rr{)*t2o*~3{}vE*X+-f28X>)9<<~D z5SLpn@qW2nK&fM@3*6`&ShtLRk6uo%pwF-SHRgECZ!zK37a$>ah>2VPHC0C<1hxMJ zi2E8ty6v0r2h|~_c15>)H~v#vh-aGw$GHwq5fE%M!~W6l#T8Vk_bWO*?={YNr*Wil zl<_X(o3&f(?=}*{?T1|`^;S7=(g&sIkvAm-gBJZe`tfNs*U)IrK zJe9A#HV0c%HFf zbZcfBGGb z7qwHgcw^jn=LF}gWkQKa;x;bLKU36Cbe5>U=xkAxq}({J`fqcZE!{T0y8UkMe`ATj ztcPDFJrXnSYEbJvCuaN>o^4E=OHF7;jF5@W?xAf0A%&EHUvQ1wkBvdHwK-5I{R724 z`mut^&Rw$Ivek+;ijNd8h$3l;8_hUyPPnh{{GB56vJ$Y8V3z) z{gyf*PJ3dQg)a-8{1rBs0|0>G0?3c2X6w$@n6R3^fmmXaWQzW@j>VE z#ubgjtVI4do(TGolb=uSmk7#FRDC#<#L|bHttOT}3i&jF-*EXU@HDy zV)%;Zmlc&h?tG?VVXNspqE-O1&WU zqSOrSdA()YD@rr9Pdev0pQ>H~>w@-!9ohMzOosVRS1oTOkIT**$wOEvelM9FDG838 z1f=Rjb&@(+ouW=vr>WD`y|owS_t9pmv$an^D}43uoM2!1IOWs0x!c{<37Gr z6SOX`IJdIbaRcm-Qby;AW`X02Y zJjQJ>p(|Q5p({f%p=2W(oRQ`=p-8dP;D5OBQb|fB3iyCMb&mrZ)dVkfO7LCA1A+z=9AV2}Q)vM+|+ptTNdh z?gxEm52ey%YvIrCW9n(}x7XM;>tO?qaGK21!~T$22;uZ|C!wJFMif*;K}8f)2W9m4 zGzIm8z2$y)#+AURjhy*e^Gm!D$Qy*M1;zSQ*_@z9DrtL|I!KyAE zwEOBVwtre8F_jCwThg{9h6by=*s)XK(hu3UaZNXV8~%xi#N@8*hVRFJQiOLe?;+;* zSId6;0sEWwQ|7@Uo7`j&DC-SErLMHB^m*GPvw%{oa_rNpUoU&3Ye)hFc7`8g4Vx8yk#fV@FoFj)WL;m7B^s7ltHk4}M|~N~#J+jRZ=p zqQML4-01^_0x-|v$?Wkw1BrkM$2M+pdII@GLj>A@H=w}@JhVg9Ht2=bHrS4xr?2vy zr|*EL*F<%LosdLSH$Wt!y1`Bo@FS|ZNcUYS0Urw_@DE8i zg%b!n+$Um(lLh(Lbm6V=LFdoTL(WLHvqeK|tQwofu3`D7U$n`=T2BoTJ{(IUie4h;rb)>3eyvoCoM|T`Gyjc%5<%9 zlxUFQ>*Q~eZ*90hexZCu^{$%R>EZOnh9`3)nm3|(yOHMYDR-bFisj+zYYZbADos_U zYvk9;hsv*$A1E9q|FJNVEZp{F;jXw-WSFk%)Da+v5*`TR$F0|fJsAuF5j`Lv5G6ba z#HE&201$!82Y^U{DE!=(sBOrvcea(m?DzBSojb@V;|2N$721g>(LHC0a*18hE|rdG8V`asj0bn7@oq~Cz-@K>`A~2u z@Ie#?gN(-I?gXP$rvddbu2`2R8;WR(kb1}_P2hS6?ae#)u9RTx$yBQZFLRUs>s zWO8q66ng>yy85J)^C7Fv{s3SZy|2CKnlup1bI)o3$13{Hc~aE9S#`WE_D`ZhX} z<{e4%o+Fp#SDS>?&xMByGxJ9kbZm}9H^`80LojO(w)BSwwV2#SH)-(wkFNM3X45Qd$n9fxIwQpuR*CU*C_}l6Y)*GBJR_= zI-)s3p7tnYexoz-*lZwqh$cRHh+2s)t89J=M51FLmCbKXlvyN8IU+OV(e-%sM53Fg zlw+{Q6p;FY@bIOA&tZ`H4)`zol6|!uQTSF`ccSQI(LY6}ia@cTII%9N?ycI(%!~_l zLKx(1Cuy^{6|6A@5`9C$PJpmv=|SEvzxb%j6|nqh685eGbs)@O?;f(3jzdz`MIv24O4@=DYevjE{pwh3(-Uj%?9^~2FczHK9m&z;+`)GO|*P@_!c+5;h^7EKiGA->k3y8JoGDFd^~g(SKGpKRyq#o z`%>3su1zJIORg~cFt)F9`J*bDRfzIo%;VS^Np+F^2uEo!x z(c2mt?7aTE(9i3K1v{@t4={nzarmXST62Jd^BZx2QOkjeH{k-ip};o>J2<~3)PwU| zc?ah*_!aYZPSLy%Zi$R|D1XNhO|)6QU71eD^(sE;`(=HUCud;6DKV z{$e>oK6+K)qh4`90{?|SCJ*6dkPPBIggp3<5R7z<;;&a8g@|{$?t&WrC2m4_Zp7hk z*Ft=E*m}Y6(XMZcv-LUpT>Uw+B-^>N?fKH8l{McL@5mn@8z>tjJ6O6;Ix4+DPcY7c z8Ko5u>>!iyS+0a~xr z$_>CtIlJ#(mK7xo?KO;pufZZ@zbnsc81FK(6J=w$zKkNY_e(NNaP0!`_I+2lOh`18 zH1GHL4Ti9sSY7Lj3I|(%Zbq#vS=smIlfuyn1p7W=zt-7hdz%^2K#p5`8f1}#-Xx(9 zNysJ%IV2(1OMpKEl(UwH69|8@=Unab+|2K;+tMkndtFmq(_GVC_qk@cTDocwiP!$O zx{wbwKsaLx6vkm*o<`~K(k0lTT<%g}1{aFr;_E_C$ zs4v|BnA%D9Lj{KmjudQ`=5+pI=*^alGKCqVqJ5Bo5Ggr~O{Lv3zL*F<4>P z^9#)OKpf_`wwF)0v6f&g4_n@iwc1onHch*&@BE6VDxR)*rsCO(y;b|Fo~t<8Knzt7 zwzTtW{h2PrQ8o+PNq&NDX4tas#n-j8o#cu$-f0|Z9A&)A_-5_a`n!$9FnM9iNisal z*4Si!Z|&vbZ%y4;zOH_K{f2sCfbczhAFFtf@6Bh2dJ!g4m&bzwob-z{9u(rF`*iW3 zh$NYku)3yc;3?PBu4i1&y7Y>HF_Rrb6$2at9p^g+IWBNq=$L1mZ=9tVFP*KpTEWk> zUxhYytECIzj>3r7$X)2F!v_$7=Ui7Sh6L*VJnUYJcYncElBD93dVza&FS^D{=PBkZ zUezsBv{3A4k?VEcGxlfg3+#&(!}Tv1r^I@S{SaNy;h=xh;!H&*yO)K=2hNU8IbU`$ zOt4u3|BL-bWV~Ip4+C&z29CHxIISmk+7ufv7@Fq#)p5P&ya zvvCFz2t*i_xzttQ5a*3eKkPW-2=Kz+gp3G8*|%IR+~IlK747^@f$s1G5H~%TxbOOl zyNnc9+$`>U&Ef_Sbh*EvD@Z|6I)*eAwiYN`^C87r}1{x2ly%@ z;=sfY;g}`9*W`wu&1x67%S(rhAhVuwg~4}X@V={i!gqwe&kOBJ`5IT`?&mG$t=etc z?b;pMo!VX6-P%3cw%`41e~h3p#ixf4)HU~eqb2H0RGAjpDEKD{Jd^Nj!h(c_3C|@w zpYTG$iwTPo7AL%v@N&W{39lx+mars&&`9lz{qeDDymNx{)iR+(Byk&;=AS9*Cpt^i zUv#!8N>XkdSN*p+&6aK(UtJ`fP(462Q1n}2u{5VTNtdjvmk$y($Q9BA+vd1>ZG*P2 z^t0q%5{V>6vNmIQ!5sw!rq7cfNcb}Oio%oT>k4aBdes+&`w9rUYxRA1I6dZ@Z{bl>-uY4tYvK7#^svb`$c?qr{POmEXTUD8 zD;-Lw(xp5@d8Tqy*2PhmM3HP>^|3+a?ZfGAhEh!Pb@!bZa%_+v(_eYEGD(~)K1azP z8FjtN*EQKYa_}x!!!Gy2D)_j-6n~as5;_^h^NsI&vvaM))(T<{>MO$5K3U;{uWUqSnf+M*B z;BV}+Vscf_R$oC~NnJ(d#N@{0#r$4*wCY$@KhsOfezkK7t|}g68bS@DZZzF&x?DSh zzT4DfTFi_wePJDEnr^z!G{ZDpyT!HBHO=y-1MdCWoDgey>+8$w`q^*Ybf3BX6g2sCQ`qcnn0Ov-Qh}r z=nO36!B=EWpr7S08?c{c5!k zW6;!U>NG};NmH+B(3mxy4=EM#{s$Xls2}VKWnX0zy~3JAjkTUxS}V_@)OngbZQlOM z1C_lgU!_?#yzpOg=Ka-7AZMNimEL1_sI2{R`_LIhC?4ETE|lHZlDkFtaD^fHaILeY zK$Xv`qX~?cd8|5{u~Emfh3m4mWVszHnGIQAWo^t_#k|jaza7?$+7Jp4eRF#oT#vo57YjNu5w zoraNyQHHw=cN<08nv{N;DB;n5axrT1u0ZDaur3 znlfFPp{y~hRgBtNuf4*hg+Yswv^ZMUw23AU|m z&qHHM>>&i8&_rm+(jKEBeI*2LYzU+!k4Lr)5wOS}cwo>qwIrctrnc)%rhoqgAbe#L zXyZ@=y>8x#dEktCq7j}^PXoQr0e1U4!0L#4@9_HM5hu9oIl+z0U#`35qvcKVG4io; zw|ty@ynKTE9{EK1Pldfz2MZ_5r^xS>PnB00tBup-Y585Z=wDZLg9(&P-=&T@X6~91 zhq$>ag^OcTP(y(xV8EjdvslF01o+Sm01B5F^tJjry-{z{*XtYfX8o^>MQ_vF^^Cs1 z>TJ~?#eWw6T{THIO?IVbvTTa%wY(*H3)BnM(`EO`X2=HXE?1p!opdd-5R7G@WwxMN zP%W(fs*>ye82CSX&jH_5@&Bb6G;Qf_)3i`JXqvW3TU*+sP13yNwS7sGmjq;}s0fHm zMFEwm1qU1Tr?O;ffn#5YEgk%#$5 z_~*k#lG~C8#tw=-Sva+=03HV}7ZvCEF)R{+&_Cq0;`~Pft@i?tAlO-O(+z(XgjxCo zPlMoT(BLb4@H9AF_?Y@gp*}f~c^7AM1kiCW{8z;$i#w7%-qf#yx2F!KG<@U3lfXhUCvc6v}LH9eXmpPfx(^j zfCue+t{5>aRVv%{L27X)O`Q!ByfQ2hWoU&dA7eMhviKcu69U#ordT4tEIz9x545x7 z0HgaBhs=)v%!k-+hrglj6#?3U@6|u3M+!y>MhnIW#tKp`4}=a2trd(HOc1cgAY5Z~ zfMd+#j*(`;QpiSv_Lg)DN+H{T1hV*)Gb{m9$hsc68F(Tjz7~KW1HTqpncyw7Wq3Ka z{#$74Vc;0!391dImH5-okbvZx@+L9GKz^|~8TOs5C>mE9zO^db@=1g% zu`f26+h8)^QC9Gsf0`Q0F zoas-K((;vLyTqfg10WLQTP~Og<6ow~O&3l7nJ$@tnP(0$^UVUY&|GIiy8??Vp&iEf z%7ctA$oLw>_%0dGDgIQPS6op1rTAO%e~Nz;|0*sj{!?6103}Zuq6B1r^#Jui^&s_N z^$@jh?I|8PTs=blpgNFae+YT);#;q8$*<)xKoV4Q#hS@X@>M4DmI#cH{jcEZg5Ih} z_(dFR#3rOU`y{d$YR)FH^R4ngCree*0C$-Pq|6EhPZ#{Jpr^`iDzP|B^9mLf3}Z$S zK$h!lFiK=tOz)mXF^ou$H}w-APZvC_AE{pzrSJHI z=_h~He`+{85N;f_11-=VHkW-i^MKXjCtECS36R{@23H14Zfm#rO>XP3)S2A2Gem?X zx9wu7<1TQs#eEmR_U_IT=<1>XHH1im%^`v zzZCsiv|YGExKp@GxJUT4P!M*pLRgV$-X5_}XinV`aa6cpNEaLsek&A)Er?$jzbJlj z{EP8R;%`grt=W~+BQi4Upm29inXXACyRH>6A91VUdXvM=(Ib+&>cll+H7@lM))Xas z!J8B_VPeR513zqb#2ISZ)`JUc7|P)CHaO4F#hfkdqV@>Wl#l|^2jQE-AIdB=@r$1> zzYxDI{Qn|47WCBJu5(d~A&6&2sJ~+rlSq&mnScr?N%8HX-ikX!cZzz6-c0>HvoNe@ z+P^usD3gk%#V?e{l=jiZmi89)5j|PmSM(FvUsM!!TiV*xw^IA+GIDtZ#bGH~ckB8@ zzMa}v(NA$IzsgW->SUq}r}GDC?lqNC8;u_r2Z}D`yqqr2H5+OS^U8lF)m3Fx>r&UJ zM(WeDFoN{p+LD85u(%33^ln-cm-E$RVbgOd=$bmMYsL3`r}YZAZUp{iK5E!&c6~Qk zL-&{IZGZ*4vu&hknOs<~MkpfQ`*16hx{Bcv{xM*UxEQb!cK$J7jkp*Rfr)+P{l`Yd6}0oqM0vcjVB0GMC*dgI>@Yp%(?|K>o(-y#>Q44 zsml?m<*B0+fepV~S4P=A8ftj61b}8&Qv!ew>sCE%8OhNMZgOb`M?rm@m5Xn*B@sBd zpz)EFQJuL%)FfHhZTMh}WvpeK1=Hpx_*6a%q|JTAA9asH>M(t7Ew0ZMfbmX!u3rQb zAOcLI`o2O}AX!FtmM)5oTPHJ_L^n?5ytX8PQ;iEH@@ z^%y(m=+~N_wrncK8VI1>$o0S!XO2V087J~uAO_|7JE{o%{WY%@A2PmW+-cfnsw3U$ zvzB$m$(j#}UFlBUvJg``}A22tZ>AyjsKK0FQ?<4=ZXJ!WS017?Z1V|mHptniLs zS5=v-&9gM~^xtK*SEZ^ts5(octGY<`r$=`Dp!8VQf%LADZjv67<9R77E{#K7rG1pRG2EC@Jk}x}V zbu-(s=TLL07pQsEeCkww;|<6daaGM~(Y`#=NYJfL^^qmW?Va3yfhBlL4f6XSzuzw1 zA>Aq6CEYFEBmG)>?f5+=NU()Z*$F<1>7YLZ=gQ|A{)fF2&VdICY*kzWz;?^^Ul z4vYLl_muu=y?d)(>Bz6;mKB!bsxQga@qKG1=pWO&;vz7z^qx0zZOCySP!iWF1@F<` zgDI%(4QhLX+TNCRk7n3Z@E-kSgYMBJxP^NSy(8)l7~|$KHws|b+5w_A{WS{~&*ne$ z?R857L*HJvxI*7<^^EQeCnLaZo--N};dKIHUMn5c;&{ZO;OP@Qeely~P0-qSmGt&& z16IFbSk-euO^)9a$ampLur|!&3R(-9J_&kyjs?O6xSb1F*2WcwErhLMgBXwKh60-Z zRGnA75xzM=9`lanUCU=lxiJFmdluBC7&d3RL^xxgxlLUSv2u}#jVKp+vXBIKcqoN~ zp}E}21z^>TWsvl`>lrt+O!5ZHMhk{q+Q?GL2nCkLM(kPIIeJ$bo3I)ZcwdL}*d{?Q z&m^5M40}JZ9wdR@&qtPzoo}d<_YJiT@P<&+x!^93b-xx}RwN0t!5n93KI3R50EwzC z7BaUw_c`F&DkK|;d*L~t!ap_R)z{gox<|g!cn^YwcM!P9$Oizv(%P0^W#Dx zrHDf3KX-C2X33%eJ2{s-lh@rUS0=A7{e?Dt1tXKNR9)L)(k)IVE*{u{=izdJI9a${ zAWjZ07l@OA%LU@(-$EcPUMt=wUTddimu0tQkL7F2-ukj{?emS+`Ua2I;)DHxvTq&m zjn(?rU#!+aR;<>RHj%N+i*dc1Ep1}CfaqAPgu-&g5%&9VmrytgM~{kSGE|^#$phb6 zo)Ei|aKYD%Kpnxmk|z?LOvvlFS~f9ZcESqH(#n@BUzOcN7LmndC$fYrB_pa;q?#-v z%SjEXCEHeiSnyH7#|57hY%bVR5LtcLa?J9DWE;$%iBa`f!uK4i;Ap6@!w>L#eO%0; z>PO22@ndX|0Q_WGn!7yVgETeI^}RAaqF&xUM}Npq|HD^U2>3~Yq)W~f_LH6vSbf%(XT?s<5V!+FtaroJ zWp+K96(1f6zpFk@!oVQ_0YM07*XK0b@i9C5d;Oy!wIR1vU_+!f;TV~n{Ud{{A44y5 z+{v4d-oo$o7emIj#Rh2K6lx29bfO|aKkq(=FTxXAlmP#R{~t_6-tvQq0*8+_J$Mw? zAB0(hWwfrpGFn$Q`9b5W%ob$KXQn^ZAqnfS$sc??EFm!HPY^aPT@K9f* z$?(>PxIX;h!HmBsMS3K2%<*_cD7*=ch>wJ4}RZd}Qu*(k_Q5a)LF{DuI~Zf-i+N zr5x}!4j2~BX)z8^Uest6s=zzWF7VolmIc->vsQt3aS#Efz=M-D(i&LKtfLpu1|(Uf z)?{mnwY@df+JUnc%-W{GwRn@ekm**R5@zvMe_}gs;wxhk!7HID3Nw=hhn@UjjG610v7G z8MQ054uxGkAas{rEgqYq;&k8SlET!m`+eT-XtXlxVCHo&LZvsi<;<)V;+5ixw5N!t ziE^t+f;9|`N%`3-RSW8I%Is6}Xu z)&lOLC3+TZj{ZR0E>Wk%Z{wE5AB_7eV@>AT%wsowf76n(ndCgOZ4qgW(_x(>;kV1} zgN3y^1=b76P_IMm`7rX1>f09$JuYa-aIGl($pfNqINry_EM; z)}^dZ*^si7+?Xmut8NnKR7sAzG~ zi$zO{UMl*r(@&jVDLPYu4VKviiv6J-D0XdXh8aYG36Tfl7RN7(@056=sBKYH7HQS# zwvrV(z0Rnkb*$qHY;y4!8{Fgr-0CaWCbwJf5%+h37_{NQVMXY;$hMJg|1Q4?$7{>4 zPQvldR{u_C3{e&E8*|l#yV6c)hpLOKaAL5`-{GD;Hb;-v$DM2(Yt{zR%zm5$?(s_f z@B@XMpub0DkNzKsm^9vqU(^DCQUu2p#~0^>b+`7g{+{zk&bgdFbFfBY;M)X6Q?tHV zVA!EBs zb|l0Acd074O+&yYLmz)9Z(qoiwkNPQA`jec{W9SI7u3)CMZz{VC>(4yd~Voo*kjml zIBfXYaKdobaF6vL!$%1pvzx)H$i`IT<^)5fvGVV#|C#$+dB(QJ2dZL?661E`hulwq zZ8aQVtuozYEHc(JtlHS1VF%SUEFZr7!Em_nM9!^+5BgXki_h`H$nW)Cv-^D4Y^d*= z-E8b(>}l*}>}%|A9BdqF9B#bdI>spC?pSZB1av8&jel2xYMYT)eWd1r`Y?|7j}hHR z*_eh~V5ybQTH*_30>HT#+MgK*ZnxL4$dtT7BCh8qeXq8GwO$3Ef)Xk6cN6{mYBFy6PsPz)}b+B`Z)LMsB-&>6}K>G(haQi$nSB1LKmCXR5}HlOzW;T&AbtA zF`L%*MttL>+yP+B^sbj`(JjaimE*P3 zw9~aSv?KEO)_hwt)%d)2EU{SYhqjlsuRz+CX_sqPXjf`iX;-sodljcG2j0{J(X`Y< z(;Vxg#AC!p?IuXm)8sboSK3#p?b;ocyR?V2hqXr_O^2K`{iJ<@_+3kY!Q6FqC**+U z5wsq9DBWMl%3p&uFIXE=hKwPnqFM8U;8oG;BPJ2t$Mq2%ADIY-;-GuEN#;Yq0_#G5 z^2H)3Uku@PUTnpxYKDTz1zx|t7p*VLFvm2uFWVBUZ(Yp*zHGitF##p$z!G#|LAlR^ z0!mOoITe07T$mh6h?4gfjwP=|imLWN8s$FB3Ad86nK;rbR*jnCoA_pa4Ijus=&tYy z=Euyh7lwrLLu)l}rCa$l-^RD|9ehFPO`7o~|LEhZ5~?PY1XU(MmB}deX!RKNSoJvd zBWglp&=@tr^7do1#${bF{$*^AdO}x6Wzv+Sc^LDV+T_qXU-t8ax#9H}S`riTmoy1; z#1Hr5h##OH`wGsL7)lx_++n5Frylz%tDk!8tE~a*vA+uM)L6K~YgWJY*k8BSS&#h< zU*-RsxJy3Udbq~wmQ=BwQ{F^Pzwf>Y9$OKT&gw4eC`q&=MiMJon0B*zaoUS%OVVCS z>!$v>W<%k|LZMtFZ@tIXCF428pNjK}3yQxKe=Gh^@sHwP#YM$`ic1QhY{>Ic;isUKF4RQn!YA!P9Qx-pI~ zOp9~n%gNWLI>89K(&gmqBgY-5DsXAJLOF4&r53-Dsqexg0gFt1&x%E+hJg32<#=qW z8_0=Hbptu^scs-ALe&lA#HhM}^+u_#v#z&pux_+|VBKV0s9B_$C7TdATXwh1j|Klj zI6bVU;78W-Xw2>5W9!|re*U_D0=r`s1vmTCW^I9f6ANXFWUm+0qs{uX;o2$mJ^t1)y`T&Jw4VFgB8O9IrElDZ^#bDSidES)0lq$$x%mByz}lTMe;OPil|-Z(@0 zlr$mztIVgR&q)6#eOCIMG%-CptzGWJm4l_3IbGAz$V1VSmcsBMnvl9u1)U#V*c7@U&94 zd_TqMRN(V!26c6lZ3R!P;E9!+oR_RfRwm~sKU`6eyt6}L^1i}v3OmZ1!B2>~$_!~D zHHn%`O`)bz)2OTEE7Y)4tF>IEuM~6gtq9o=SLz^p3bLmw$e#XpjV{zJmreP*TrUKh z!rb2I&_BeLGD8ZJ?CpjBCw6&^q(HUyvh3yAE3#K+ugYGXy(?*V(w?NRllCU9Ra{cd z3Yi_Eiven$`asgRNe7b-CH-jStDoo?sYPgNU=$&PrX6S;lH*B2wF?me?so@np`b(n z2=D+GFdyatybC^n(TJ!;B=}zagLhd|Cv-*l~t`vU7s4MPs_rH(KXse)_kP6 zU09gydo3!YHs^cy_4dFfcr`1eUfGGE>|zVx-bU=a7Jy8+qw7ms){uH72<X_q-b@g_sJ;{+lyWizAjuLlp2&(JBmJQyR&Fl(edij z;xpp2Vs&cQ@_WtQ%GZ(W$qi(4-d?Z?-3}A=ts(t;5;tTbjq@dL&WZS`bo4?BJHVqB z-55TJjHc&;vD{lv42@+NjtG!pIF`m-<&8e?|7!T}$I%VQF^t~fwIIfQt7pEDfj%qL z+P;v$f(tXney#SK@txW@r~_gpx@BvuyiWF5Ba|7~`;Y*SaP>$8c+>-M@=#31Zc0>M zKfv%?`$G} zMR5)nKA^HpS!JH2(2R!UdiA|MTiuIaCDp2Va-BLvUXWLqcdq71P9^VYC9TC>Ah3p{ z;hs!E9@P*nNic3pNQj6w#MRQ2i~|!qw^exc0syPl5LIWjhAg^{dJQt#Rj;8QjNC#D zJ{VCdeL2KLfXBFmV%KUUnl?6NX4-7(~!AgL)P?`(YRG>(yEJdOF^k z#~aSy0T=X#^ECtnkGQLQ#F5}kET-jt!pjlSnKzHg29C54wa8~`Smcnbd7<+|7lekU zsMB%^UNH)4gf*g?BD$Ey8n*?3nkEmIbRb1Wo4>OcY>g-o-G@dl&jLTeoU`698>Nb$hD4qkZT0 zUE1H;{DJRgf|3Cn^!>c^s#4R3xLP5CailJUp14pQ!6AC4qs*T!`F&mCtbm61LNG_~Z-YEU zqY@fe3gI@eW}qO+okIAuiDQy-al(;s|65zg3PpKs@wY9L*h$4OL}5mDzSX%gI>z-(OC0Eu9xw+*6dd?X2GapeI_S7N>a;s{%& z-ef%8v>ehw%}I_jSDB|&D3!{5Wr6bR{F{_T%3@_FWr?y>sZy$yWy>xlL_== zbeue1o*++@mujW*_snYTNb)@OI6aY0mZ!+ev;yLQj-tNRoin%0#2l08$@CPu!i2G? zXK$cb!iKOa+^y2RYy_CiJuI`9RaqoQRfabvz+CQNZdc7+F5lDMtgFc7 zxNHXUJ$;tGdfunZlI z;;KB7)wL(h?PkjCoI%&Y$KdOYiB0mJR{VMRPL2c%xR?Kjpjemy#XFba3yreFA`Ru= znC8>yL5%kSAGp8~U?KPOdb8kUf=4(;QlbES78z%ZH!fm}#bA?5G+hiu(}ixa7`5hs z7wLLz^Zl(nV_V|`Rk6k;^me0vIs|x;3vhqvA{REwhYPKwSJ6%7MD9pj|K|F}@F9l0 zYK#wETjB`tigz*Ls{lD5f-iu-o%^8^L#4HA@e1R`RHMQK`vKEAb*XY;jH|RI%HS}8gE&6TFw?Mcg_;=v9aC<06{C^jM ze)IZ**TRvH7QB?S)ceVyuJ6(B(@P+wo~}r-?G1Mw2lfias*XvP=dQ@zC0d6!6+?>> z-XsF7_6~vO`+Fp&?+k-x0;KQUSeK!It$Fe+s1L6egz{jF1C2qjtPRJe<1HSK5dEn-uX-bVbAmkP9m~6x&ysRu1X`gMbt#5p zqFY-nfNlW3OdbPcZ7J8A!sZ^(G+74kiIf3E)F%3rSQCT~ld zx4d^;xb$F4o40YmJ2>E79Pl0vcpnF>!vX7Yzy=(!5eIyL12*A+4{^XpIN)O(@Cgps zj03jdfKPG2Rvhpd4)`1ge1QYD;eao3z*jh6I}X^v1*}P0n{*VuQbtm02lmik(|hTC z^f&Z=`T+eceULsxAEuAcN9phAWAyj*5A=`pPxR09FZ8eUZ}f5c1bvb|MW3eEB*lYf zL4-`6KX@q$0nxE%IRX>>`jN@=cWCn5>5)?)kO%&t-((3w5C@XU&(P^@n=p3W)@W>i%m!0dH(E?& zp@Skz$(q8oh1Vj6EGV+H4w2<~Y9_1!Hmg-s0lR(-##^BNbvKvaPk=XAq%jk~!=M&` zau(0sp1e1?*7O0jGkJINuH;SBhtx;Z$JCV2i}WYdhl0)27V1-KEA<(*AAC-IL2aYH zq`soIQ#+`g)Glf_wTJqe+Dq-D4p8Gw-%uxO_EXbMl zMEy)*L?9F&pR(@7NR$J&i!Gf!$mbb8zrYeSXQI@-K~5j!^evXt&kSlf zF;0)zRv=!F#ipX%Sj`okx|G6@XEj^k>r(1FXl!IzeuXRv3wy+avedD_t+7X__4nM? z{)-M^jkrYzerN~=tPvLjb_P3wXK?Tg=A_RLp24l<3~oaPN~3@Eor%|d*-%PW zzX;3_0hW}t#^xsg+G49G0Gb_IZMFI4V0DF7V{_*wqYXTFKYPIDJ99feb3Sl5XYQwa zXWw~u@i*_A>zg+U{O;;AUs$aR3LmWK4onC`83UV7!s~9s(94=p#_JAO>R0ZU^=5%P zQ6%HJ8OP#(?3aJ5ZG>vMW>VNlmFx9m-NLc8b2lFce&ep*IB=W`Ai)W)RV*xu!#D)s zSj_FVJ8XCQV;{ZXjKpk@WgfW8HV&NR4lxd#;sP*X@aCW}cmoK7y=~K~*HnK|xV^BC zt*`4FjwXfF7?R9;27DItxpceq+E|^|TFRu!gutRm zQ>Nvoxn1rs<~1v5cM4#4YS8la2=e|Q?+^0+(uNh`T+<>Qts8%>ZN1zdD=LNZR5V{v zsSTEm7Hoi&CKQ%JXh?9@qpv^;V^40qB=|S{{~+IWd+}b+-d)$TGNJja8w|1S%l{_d z-<>V3KGv$>~r@0I_VC?T#pn zvdm_p%nw~7eCc`+r;887vWIMWZAkEDBFbgx%x4IH!;rq;J;DHi09cy7WR^9x?o59p zZKG_iLUum6{t}>VwXR%$?51AHpssGjB>2O#m}o8G>Yn2Q-0`h# z;KNz~ZicgK?wkz%B3vJ_J!(6hKS*=0sgxS5Nv7Q;4H_Gk%aGmWs)XfUF3|+|(_>pg zFXP6Mb0^q-uKuO^?dp3gKCB6pmYEy+6_j-QOIu^yYVfXe zSDsF^wKIoVi9AEzkBXlZKP!Gw{Hpj(aa?giaZ+(gaawUkaaQrW;t$0o<2l8jit~yK zioXZWJ> z4IU~t&Y?npzqprVHj5+tu(;;34o$Z03ZGzp%=~&`NGLzFR`XW6l~40+d^_L47lhuV z8DH{`KE5iUYC_3GY7#Y>nnF#brcoUuA1mp~@5cW#Gb=K+B)TA`Kqu|NuaL?j+g5!Y zuFJ2;&yM^ercG#Qs5o?M;)sj~GcvT>VxDgMRZQ>9i~50?rMaryFEfA2Jl^T3@rjb7 zy625EjkAoijei)=8P8M)ncPWpVwI$-kGe?vY2oEFxhb|Aoy85aT<`XwmaZYhZq0L= z?beJK*c0X`OSI+sU}J&r%`?H@NhpSkQ5uE-GPb*9Wdi3i9RW32Qw&oL(+tm4Pq$4s z%rHD<_}aAHD5SB5;lO`068xX%YE8hwz%H=>+yQ_4gms|8Myo?UFFTS*B_2)uE^%1q zYUR_mSCz-}evbSn19dC$c8hY>K?>Y_9Qen5{<)?%4*bgnJRy#EN)3<>UM&DJ@UG;E zgeMd7I8^*isN#eb{o$@`YrZ1XXikL=uEN1U#1TJUdLp1+0ynX`2fk7qeROz%1JY z@ndX|0L->6&0U`GK^hj?(vXOlIks(P0$g-Y9WEgJhkZNECEYab=zqZ$Jp5aegcCgc zgNJ_$a}Al>A`btS$;bj9|0MX2dop7=5c;xAbeEG0;eB#S#P*_Bgs%%%2&D#P)sCXi z+U_jcRrD-w<-19`!^k?danhxnZMPw`vS+tfSMd2v~4 zvLVIL&al8nW?m5QE^2Q`HFPkf89pL=m0uE{Eg4<;Y1N|2yUIVVUKaLj`qnCTHUw;1 zy`Wj}a;DRqsU4a!9W3j?kn7|v`Q|^sCOV*%zc=3rl3-UG%xHg!`$b|GwOgA>4IR9w z-3Y4a;6*KXQ44fYTVi|3CQJ?`M9F&#$CAyHE6TrdP8uQrTcFG-hCj6cAitw!*~_z6 zWUtI#mAyK9SJLjJJxO0D?M+&%xTKmDGCM>U1JpeAfuwJf4kjH+`q9c)M`}p`q#RC( z)j30nLF%q^_KK~T#yZ8+Q|SzK!5DB*QoerOOHP=BN^-TbOj)kfD78wRvO=j>KB6I% z2BlF+Dl3&$%4#L0G%3wWX#t**!G9PC zIz%{)N&XrRis4|6_b6L%%x~nrnfs*jNWl*UpXBbTTy4WTM*EC_cUTPgQdC69X{}0w z7Na$ywW9tZ1458-h_RKyJaE~e+JwCM*$c84W-rQq({@aMq?iEGIDxw-ykbLhlZ$Ak zS00P#e!wgdcPuaY+;TW8yyMqZRpx5*EX_Rq*qZOM+N)Ak9aNnq(N$d}`_m&keo%TW z>p*%}NjFIk$??3OB1a|6&R%1CG-R!5)4o#uD@NEw|0tlp@H-ugg308_Y z@(c-t-YxBFu|(o-K_CDDL|h#1gIoe1)&g*4@`hh~-<|gx;PcKS8dsrdoo&6XHM%Fd z)5HZ+#MLK|1d8fziA4(=@0932k5W?)?$hC3P0*DoTDZZs(YD2-OJNw+m95^<8X1@W z${nu7BS0H2`}fJl%1!qAp{*qCoON!=3nlYP=9d(wcS?Vp+)`;U8_mDftgBjIb=rK! zeAaBL9$=bcPOq9yXH>1LUSGYTI@R34oMy(5bIW;L9%=%FawozQ@kFdU4%GgMY+Ae4 zobS+f)^^d}tnI4prd^criOnLOXlfc?<-qGopy@32 zOlPa@QQ|RTqjnRV&eP;J?N{1YsqNYwmAkZuw1>4v;B*c-r}LBcGu!Xl0V3DRiCni0 zBWvXX-RIo*xVrC@Co@WE6@5D6Gq4$K1xv**i>o6h5|5Rg&6q@-)2@Q|%-5+ms5hx! z@@iC%mpxJTWSN>SqswUxz1D^irE0=8?Q(`Ez{*(8wT=K{&)z2BLOFfi?t;IWo4D6u z%b%~?m$t8LUSBu0x0`=oH*a&dfxBCG=S{G;=iOYMp}RTl_6@VzXZw_6V5W3O3$pz- zb}DW&HZzq$*TLKIHDzOyyr&hvFW<=>hT`?D@N-1+SS%gQ7obev`L( zIOIxPErhEX0m3}Y0=D*gWit1p&dp@(--iWcw8ooJ{qbf&k*+00n&m2+Kh`WL(lsqH z?o|}&nlD8cVp_gI7_E_Y)g{z@#9XSGgC*2+u*}hqro(ObR{O|d4HNR3AmVl8RPzWV z;xz;@b{lPp<-r>2b{X(K+LFqHHGVS1Tyu&4czLW5H(nmQ?zO}MV~t-H--{nM&6ZSP ztU0Dff^d(~!FdDyG~OlTGqx43wX0Y70^LI0BHd!$i@GJcmvl>YFY8{>eQ#T?TdiYb zA`mJJlS_j2kKsq#YF!Q!bjA$Ky?sMH2x^2uW#hSZudYd7fi6BDCQpEAV_(;qw)g>s!Fv;E=Tg~ossc#bg#QX7yO-649d z>gU{y=*;Lp*pa+o6KeHI80l};px;?5l7-(9au{{4Tpe{3i*NYJ^!n--*T&ILgp?k{P4 z(7oV4=_RR<5D{$%Uh?tq6XB=AuaSE}^CbjniMpt!GqAe!QNJHsy~^bK{g2H3x)4pN7x!_*P# zDD@q6jQXDXf%=j9iTarm*f280@TkRyKgCE^j2f@`ToU)i?Ye2ZZijBC?yU-JkfyjK zveDhnyMxE%enDira=&CH$=nHHyuhCDy7DG$!pu(Mc@HzQgm#hrE7^9LF!O(^X}mqM zXL!%4X7Uco=JDq9Rwe8&K2ZE^G3q|W+dU4->J90Zz!!i!z1`Ykqq0XpO-sE^#moro zCMwwE8`y-o&ZS`3+;gZ7t(KeQW_gX=BDcy%CHEBEF2K>e?nNWP=2BmGJ)~l)w|jyQ z6=)spa)&%x7$fW~XOE1!_Vsp+@r)d}%iXZcWcbpUIT!kj=6Y{EL%&pirQWXIq28(9 zrS2!cN8VpPKt51DNIqCTM1Fhd9ijKjACM1|_X@o$bhmoAe1!Z#`5rY|ncks&LfJH; z0egD~RCs7??tusp!@b0g1F;?e0apq7*On)s{fd4F_ybl7T+AdK{#^?|rDrkRE)sQ> zu8*+`!Y)<_D>BV@(c2^T3C*cHB90383+aLb!f%Dbum$l8;}^v*j(;(JN&Ibzy*0aX zdPGKM9Te`)Dbw9ib7#$-oUe0w>$jShTVn0SRdMv{_`Wr9_H;vrA=7{nMtBV8*NPw# zeC}B~v~qAQRuei#MX8&i#&6AYEc%D=0U z?ES4gV_V|`Rk6k;^mbzw{UJBol$iBir1mP)O~xW)Js1bojgb!*GzDTJK)h#*IH!db z-9p9E8&lP*y?vr&lH`rFH`A6XURF$#Oqa}%^eVV3_ura}H9R_mCO{566np{i-N^$KNbJn0_*`h;xhgIra#U=w39$LUt!8#Qm%6tGv!O;jO7^0Cu-5-~a_Q8(FV zGf0>@wgLPkK~j-D!z4_5G~u+rxfMe+4~4NlX&&fgufsN3Vn?<~Y%Rrp*3!>XsNh)G zI;!n{=3Q3Tyvu#(t-wSKP)}mlv3_{k|ba{l5RmANiYCI z+ev$mlv`{ds3W-%bR-75fHQ1U@ZXX9`uO( zlKQ_`BS8|EV*Pu9kak0Z;s};f7675P;uSBX#2yWku4_bK-foL|~63W}>Y#Cth6> z%#eO4;YcEzO`8}+FeA{gy(HI~ZnbYJ#u^CVwcYiA0GV#Sjrbq{m@-$(5*l%(?v>Oj z-)^so`wXCZKg^uO;4Ra>h__Aem>v|pYkJT0zGBTN>9+|sIfjr_t^W}2iOPN2iXVPy`k}~NiM_KSo4*DyHRY{uYv-vKvoNnRaDAi z94Pdh7U-0OQr}JZG4&jymS;@fY&CL>>OT8WdxbDgx$R*n5uxc2T!&e_+)#~{!qo{ z8vo_n18Et9XWLAQq-IfLq+_Myq>o4+mDWnfOD9MllRhqeLi$@~O78K@iPA~Z$opCC2XZqRnF&Ses#$}w&l%^-Ar=)Ms+>tppYh2a^ z<6p+cr+T@5&NhaT1<$sEyu!S5HBaifS*rs3Wfe2N3ynIWuug%Fs2tGAdqg6E3ajeG zDgWdw{xsTNU->6av!T)VN3+gAKB%J0EmnGH^bG&tr~HGT_78r>Kln_dpCPr;9NTXk zSX}dBjY`%{Jkc~jHqQQt{ZV_ZeY|~weW7NNW|nM19#d(i0*V$`;99FL=@Vvdmop zict!%uPc-7fvn!x%wrogb3gN*>O1dg_`LaGx^v!sy3g>P^;7<4{d9e^hG`J>&-l!? zPJ?v}G+1Ldsyl)=s^E=^E)Hr7e6o38-)Ek)}+`Pn$$frl-&- z9~@?kv0edN(Hv?n^#V1InonJhVFn}A((G2F<{{H9&@*}Aym`8iV2`u_?QN+xUp;{P zlGVs=*g@E~FxL<=l8TA*xDxDQ-dB6t)vheOeoJc=-877V-cC*C8b7FfV%JM17C z+~cs*!{xAZH_J?YIh6~WGofQc^N%dCykLLHC#@qhvAdukcR3TfHl-NZ6LLGAFcZ4> zx_MK9T~C;)4s7-B&UcEKvPuY*RTVb9&5y#0`-r2o;y&UiuDFjl$}8?8jslDQ2vg;7 zl~{}Hi|sGkm)KvjFRfpR^|G%r=M`L;BLK?+E3uaQs&iKOQ|GL#Po2Y7Vy*H~>x@)A zM5E9RZ01}gR-l>t(L%lIJMY)Rfs|Np_|E!Gf3sdw->i`mYpu_0*^z9{qre>> z#<=HJ`7oHP6DRhzeT5}Z=o&+s!NU-)9ZA?_q*qX~3QAT%v#H;beL>0U9$QP7t+3z; zIb{CL8Jp4Fh7FM2tkD_WZ5g1%*DD9BjKz+E=cdWVD`c&=V_i`ce0^Q86XCAli4Z&y zf+xZaej>0-A9CG9TmG5g_5fgF#M!0_w(xYTjT`xnbwmCjZ0W<@9AlSv2ifHf!!CQ< z+!^5d*!tSoCFX(#ipCo#)>y8OTySh_d242y1Ss`7y46C}%2p-`IumY*vT&}63{|}q z`F3RggaHWy69y#=P8gDKZ^C^ELlf>#I3)Q|w~Shzwj!-l{tTnKoc$05uLM!vW=700A^yz+#~FEhC!)blg@spn?k+3*F$qg(NV3WjP)-6S`rq zOj(s8CTHry$Sw9y?OW}i*)Qrow|`;ZX8+RukM3XHBrqAK`1(&b4NM0!z=p_hRfMXo zYEIghqVn8Gl_qyY!h;D9C7>Z*^A6F`d3krCj<_tu1kiIQ<4)}p1xKrOg|xd;`)E}< zRfS5g`hzm6s#FABt)f)+Tu1JOtiQ7U>GY&zs-%yyzQjH|>==3}s2e#b;gy7x>@N1^ z2HIgK0pSVFgG2(*k;idP>;ADrIe#Rp>90efDXao}l4qchN-hqB?o zeP?iP0M%&d20@5cq?7f=ab+=K7|b0737(`ROlhozEkip zZzQi)HC}}}(cVsxa5{k-6JRt99CZ;#z~6vo_DUrDyB2^Ba1}q2J+69`H_?1ha!B%t zY_n{OYVB{PhZRCMKJ)fClK)il*R`gis3=|845)$dng=u*Mu zAR~au%M2iKaATP9T`&XG_<}6HAS({~3GRaXAx?%%vbT>*4}rGKar+7TN&6}LX}i1X zxLk-jn!Fvo)xZOFAi-cB+6>MO0e{2yPJ7-vQ40Ymui_f`o1rC%wUzzlSNz@nhut?Z zBP$zWJlq2f>xdOkXD5WLYZU_2UPlQb8`A9*T*4LJ`8HV|2Y z*ohNs_RI!R$D66&FV-E~E@0E~o7 zhxTGE0KN)4|C{)^s4aZd)#2^xRoDgYLVzk5@8BHGwfSdyk4BUiMFhUp?2g(Hbu@Rm z3OHED2yYYm7-}PVjtKBPk6A8Pa+MIrpD>?00>Q7vh2(Wrok#=_$vJoGb{7(%gPkQF zQV2jYuz5d91VCxyQ3@F5qYUMwjc?-!Wz*|U;wFYeVTt3z96pKT!yWIdBEWonUJ+mc z4r)YtdA>vBaHW@zaBNVubwoN`S>k<`{Li|VJlc23V;mSA{xSi_dd5dN>LZxZbAa8+ zc%84m7OrM8Pzccfz#rF^sEjHXasYymH=|$ju6sMsHZL+SDla-OCNDNGE-yYWIU*&Z zT}1nc)QAodX%XoW84;Ng9V41V^GHHzF^hf5?Ckv`?7R6dGx>L$wme z{OkqU3$sye;bZzE#URA>IWmnDEY^E@wQy%=$2*c7kA|$Z)rQ;#E8qH|CcHjs(%_dJ zh>F`JJtc=DZ zdw3wj@eX8+3_n6VRS4I3QDMitOvjQ!?2!PtACRCkm)nq_s|SFng_neG9sq#=H*+J9 z`7i=G+adSIg>oR3UAQsGxeiPlcw?EU%2f2ZF6LUQ68LrEeq9`^zi7auK2)23?)zJb3s z{ZgAPF`veisCR}R&pwfTGW%5a>FhJvXS09L{v-Qb_Mh43voBMhnIWezA@fq*{s{4}=a29WR(5_|@9UQQ|0ds5mqeE+In=X`bh$8R08)5a15( zc+c}^I@>^b2FVaG%ZH=f@uXm)U{vT7!BoLCfyR+x?NW0>Jq4!DXBGfm2fTSJ=jf%D zGD7Q6TDKW7Y*7KRowlB_p0#2)h46M(MpQU4k>F15JpuCrX_})6;V@MXFikP1S52og zs@7Gnuij9dYVKf8Gy9|gZHl8wUFb8R$XEs6D0A8Lt{)PR!-XlrcEUD7)Tq6;kt^?~ z`yuD*2VVia`fU<=u70&38oVOEIj(D5x47qVOyDcs;|K=1)e($_0#{%;@^Wu_? zLYGdBp@9#tbk&ZUGC@d$s98i4K}dGHm{ol7k#x4!_gzveCpC!tR)*bvVSLR|DY`i{1+KXl2Yw_Ha=1FPfjXAg_z#)si{d z*GlGUUoUw<`$ow;?VBYpi=!Vgh`3ifR7*Q%kYlvt zw5zB`v|m<^*G|(;*Ur$|9D8fNt(j_kUfbEx)!)l}S^Elnnai}xwJWqMwX3wNIWO~7 zZGiRsxz6?c1+FKyGEttD`AvIVdqR6s>spUf+SA%I+Ot}06>^}=8ff-QJ+trbc$9dI z*r?qEXa6+0P5YJhRcgC-N98WN z*%MJ0#AO(w+6KgLPo!bf2fR(|rvDjUT>MO4SbNmT?Cs>Aes|+;u<=9Q#$5F_zCvv? zrSYzg?cz~Ko42D&y|K7h?!~Ey;9McXdKkV>h0oxrCd!}yc`)-5HDXJ!|?Lx zS^#-@q#{ZYt%y;?D&iFJiUdVU{;lcl@{<((950$Tn!hN?0T-OKK|bZekOTh00e|Cw z|HA?Q;DCQ|z(pMJ9}c*L0|36z(BCn@ zG0-u{G1xK0aj)Y($56-pjt3mW9K#(W91l7ka*&|6`-b77^G&EpK^7-?=pX_n3#qLeD>W_aQMuR%A za7XxM1gPOHjlqmaLLKVGj2hkw8xHnPkNZ(7GsDVV3^FvnAhR$tJrfawx{%&3t`+g$ zGy}xI3$SzNqWgeL_+qKccmx90Mm`B&e;=DVfA@L~<76h* z`olQgQC3WOFp|YyT=A(_C#1<$9xPySFg;{s*ODA8nMY^1O3j_2zIoDl#M$C)3ARL= z1W%OWXrcK>yafN&@DiMXtaliSh8y18!OYBOeIo=jGgG}DgP9M}Z11F_X{c`H_w)Ez z!Mlb4oQgXgcP8#^+$-D~gx*r4u59;@8upqOI$R}3u%@UOEJ}#aZV~~$a#v(S9tk`k zkBR{IaPJxND4rz5Q|17+5`nJOW2|GX{i|PeEP+hQr8s34KLl1Xdx?F6aa$Ib!W#@$ zx9w%er9_S@kzFm}6~~b3d#kYqs6Zlmuq27ok1PBIe)H>StYdw?P3!3XP%dX=82D!4 z3Jr@yAlKi{U&xZ#Ck{;?{-9q7FwiYfpbH!TgQSDq%6!zqb)Osn@v!tkUOnI({gKS0 znXfutbG+`r8X>c__u)8D<8ePBY9Znaaq(_TEw8o~5`IhRt);h>u5qx6|DgvVpr&*! z`z^VE-J{-e%mwG;7^)DE2i|s^fZrF3Q0{71Q13YIE*(%hwzRf%VfFaZeQ{5eK3O`k zbW-V@QmmtEwd?922x%Akl5>Fo+BZ#ijo6V81C~KVXtit6f^Ras&z`S)SFVG*ayz>Q zC=aZ6e3`JH3)@n;&95(!HIAPf6xX1dBp`P-eA2=FZP;`^S zRZz5^fz`$a4g68v1EbICV>n=VBIjG?gZCX1A`j%S1RwXhZT4NaExzmasqeboZ0up| zY3ya}YwT|vY#eIb>bT!J#wg$03KWpX@X*3gkK2(5@sH>LsTZ;urznQ&wYPaV9NJ&AQLq_OWidO~s~p3dgEp5$s4-FpF^$7~aH2*exZguK zY>O850WJVDoA*_f&4-IZ^Fy+ z*4ftEvb00^eEF)(d$I)b`}jlor_=A}pGhCax2jbdTCLXD)MXmGx?JN>Ycvs(&gw4e zC`mN5)5J;^rroSwoc3bclC+o7x~YGz*-*H#a6B!Pi{#~b`uu;57mYt>p3l6Hc}jO$ zC)3V1E-=cqv6k-Y9Br<4QqAO=DK%4TrqxWZnNibUGo2d6@1Z^tb2R2h#{(6&NN<(S zC^=X_EZR=^hjgoiKWNIb&cpDi>Z7p~fn2V_!Ck8nuOu5MyRe zAGQ^M%g5!yZ$h6{yE-7|%yd9j0RIh(Am-uT;k{Adc!zI7aLGkAF#ox>>y4 zqI~dko0E`w=0fL;Mgb)3KhsMed)P}Nxv;Ceo4mVxL{ty?9r8QnE+79>j-w9L?LKce zG;CeX2{6oUx^-&d!EpWvKC&92E0FWoz4H6yL*-{3!}+5EJs2J6!6ShlJR0aht^Wsi z!&xnc%fp+0R^-lFJbwBw%^8WGx@`3U}^1<>U^4ml22>sph zhvS^1SLj`#yVZX>&O0tR_NaRbZWr_p?GrkWH=nmEVSn*~;%|%5fTO$vD&R6+nSq{w z1NDRp&1^%q?BL#x=#sKe{aP|=TI_8qX6-0PI{W@KeK@;4t{`K#MbrIg9F*mIL z9GIUJ^18az6t64LIe^!de{6MlU4=L?kzfS(4uyGLAs6|^r}wGLEvmas&>0&frwJ*3 z>KlRt4|*q73pWD^9^wMFhYP?9@PP>azy@5+;6C+RDQ~B|lk#rLdnxaytV>y+vLR(D zxiMuPQEjEHcFD%F!TNQ^^~TPU9+LUQEX@L^6GZ&ZjF{`-JY#-nXp3jmUTT#*oHEO~jRBBwmJJVF)KDX+Xxu{uPi$X0}R zmMd};`Q^_S@$EY&cHA*3or~gGrXC3+ODXm7>j?zQqx4O+^xR)G|S4gMN8XU z%Cs`Ivdw+THM1|xT~o7C^M5b%W_g!IPz=!L?^nQi_nv$1z3-jvo_h{hDr2ej%ya^)R+ru^kWob6^|*#DV&Ud+5c6iyTSdEK z`Q$48m>V@1+j0Zsj!%PM18u)X+o?qFar18ZP*Ok&NoNng&0FE{@*~d?jTT+wxfOKC zGmENCL5v*u-MWCM)1OIq-UuZE_Vw=pH{v0tXEvNH>aJ@5HORht7>b*n_h7*@eMS_& zmwr&aQoXHcdr<_bWx8*juSki=HR(e6=jlC*lY`f#+X@cTjIZMg4r7F%lMB4!u@a1D zzEI=A<4k}OOke^q=WI97LmjUEGFX+b&i|{RCmBP=lA*>nxM<@@tBbZ(cw6CtO@R2m z;csyEGkY~b<3G$3AP@U%Jufd;okU`fk!u%$g}^%mzGCP#Yxob|Q>?d(Jykt~Vm?@B zi^Ac9O(s)F)p;l88OzUG=M!6fF_kpL#+fG2RklQ`fh954k3 zOvM4ym;fc1ZU-pgjB&4fa=UrmbICkXNvcRSsUh>p0$FeUqm+Phu4vf z{P2?7NUig0xemRn8+j#-Y3+m4iahgrGRXt;f!`pah{64yL}}vcgeH zIxKfw1i z$-HQnWlFQMwIBHa=}0uznp5sp>H-fomah*%&~r>ml_{8dfD$Bl#r7u$G*%FrS7+K| z5>2QG0~=3a5UwJ)K^0*zq&CUpPk7$y^vXGWNb~Y;=9T+diXjxV`K9|=ssYb4KNXlU zhq(b$Q(>r`Exro9YE5329>kvd-XRGgnm+YqH6B*uQ77H08qYAYf*ekwa;lgi_X?W> zqJ@k%P3M4cET$6bVQx@jAO}#xKkRZ%zLV0`mfI{<3eE zjS@=IjwQ%hV_j#}SdTN0pd6R-tiC9H$}SL?hxAi3If8auVO{)aw^dV3$Ah`pUNJqP z=;U|0YKCg2>e<3ss@bZiRb!32inge^`jO;2%%;AexrXDx3(P^rgLydMMI7)F6R3XG4hSW^Ka-i9!om=qGQP|>KOeO%xQQzy`7J>)*C&R zboNCzi5EGI$2ayydp7b$W6ox#FM2}LzUT>L0{EyKOd=L zTFbd?gftr={jjmQ24oGLmW1+FIrJR;~7?NYa4$cK3CIhXFHX6i&;B2RVJAU9a7s zo$h%}zft>z+n3s}v|npCX}{6#1>b7F(|)i0LAzPIMY~nIO}kyYL%UPEOS@aUN4rlu zvFJzb>0)5quRWkWs6C|pNqboPvlcgHW{_B>f5J`*3ejo)8Z}-ppi!;M(1tUzwjc-r zFEf4m6L}i&3UlE!;8i<7iI&nAEMRt;nrhQxP|Qy~0IU{srzC-9eg27(B#Brekt9n} zB)gJ(Nzx?gk_-v!^S@P}f9KF*o+h6mpC$i8_DS+B!No7r?@zNfHurN&neLI_zg5dP zjJ0#`B0IO`vZ1WC%UZjg-P&!loEXY7IF`X>4w0d{$Si|n8C-J=u8XR{tp0X4S@^8} z#@=SQQ9hUE3cq(z23NuAZ>;{t>TfrBU2A#Cop@oZtFySdbctwx>nTkFJa>{wv!vP5 z9H~N@E6tN$(5j^cQl-97s+AfOOA{~0{26m4<0<|O{y<3&;}rf>{s*EDMQ@1T6wl<( z;?L&yPZ^MSwfI^wNAIHFYW%e1vl48GFwpV%X7c$C7(Fu0oQ}BYMzF7$n_^zcm93C)2WR*wx(M}x6`RFg4dXbTKr(_ zP-}QQON5un_fuUwT|MjNeO&df23MnNsjHi3FZsmGD|tZ$!3C2tr)Z~Yr)j5aXJ}_? zd-5h{T3jjDOVKgB@XUaez!Zg`pKGolmgiTn%SVx%n;ggcF3`i%)6>gyQ%GIZsHmu% z?*pIl+Z9@rUT6(I+zwtDnp~toW~bj(V>81@#5>--auOi|TWQpBRo6 z{#LlEuqyY9;+ZA0O78ZkLssc+U!|9o30no*1lt8W1Um)01dm5u6`b(-M{r%hRk|xZ zlpNtnpHn_(e9roCg`P@x;qKINnp>}PdSka`53taFg-?lJ;iJ#IUcPOSJDr~gzDl;H z!gKTIUe3`IQ0$_-XN#EO6quNKm=!a5tZ(Hx*7RUa593hdFk^*rxbb0Q=QllGBNw(R zjzS1|U_AgVn|q37bAfjjn`{3-u}Z_9- z+H@P)9IHBW;uW%63mKy&MkT8lcVUU~j-fRrB$&xW?gkGGD>FPaf2k+LY)f5T_>y3v zY?5qt!8Zc`_<;D<1{imJ)mRB$XJ#_6xdd3whuxTZi=2_UJat9tDN{@Vd_jC&eNlW#{D=6m z_)qa);=jdL#8<`F#Q%t|i-CkAaghMcP}wk9g>1O&VOgcDN>(kak&Tf3pR87=D_cveB|JvazzqWaDJxWsl30a+RDFSL373MhhZ^kztWrqPIqmiy0qt zS^cN_?pD;7GO_^Dn)&U^0@#&LMxEJS(*n!7m>TdVQ;vhiSyq7H8l3k^vve#(VYChFm z?(>-}TG-h>t8N^(ecYC#h@u~)&I*oXX4SRY;Yg#$h!J5g4XkIC-( zPL|aKCyB8^^>9BJ8-xIi4XTH^IzG-=ouTOcNyeItwHcpge3r3>TuXMB-^bjbdYHSL z^8XZW&=gy(D^On#)3bg?dWQxzgkm=A8EW@AnU#kM_}DiR0q^x+$4D>_J0px=zydyA zp|+Om5XSXQRnPjIe5TI^vX#}dHZrPbF-S)FP(Nal3?Lz2k!y+=BqQMIz^|DkBj85f zCP;D&GZge2aucj+W}5|EWk-=#YlhW_j31Nzjo*@G#(_pFyT>~C()m>zH&lYfcHf^8 z?jHyNOPHfikSYmH81iDKlf0S@^E;?78n{K^3Lw0&P%_7sdkE|+;1=a>MK1ZRl4r5kXvBd&9drsQ!Fg{8iyG_cKNc=+MY9QAY~LMxBY?7I{AMv8ZuTtg^yPh&!CLDl0$2Gd3rY z>8Q|wi@4&Dl8|3R`h+YF!n*h{gq@?Atrj|6w$=ir>%URL{c*zt!`bBF@~WcV+K1&r zeVG2GJ{9iU^lwJSC+bwis`=T+G_r!Mf;Hi5!+Cj$dQr>^dS*RzjBxY6QpEk%$@T@y znc{7=^g}4zoSXwLa0||o7?1%X0goN&NJ2+C#FNd7Qom7~}^s7I>XA5CGq47;vm&gM_@GLtATNR&wJrH)j8 z!;4Z!t1pp%HHGSLh-!w9(<*Sl6|%*$DObr}>NGXh#99I6Dyab<+5L`9X$-ZU(7kb; zY~S0slUjWrm(>~`(VS!N65Qaz6dN67jgIO%E)L90TF|Ml;og4scPkN6O`hJ5WTi;b z#bVa>9B3G1xcS;rQw(g_(%pC`t?S4U4fxouO)HT)jR_W(52o7rpsPuo$m-KKr%$t- z5Z%tb+wSIe9X^P$z1LWMT96}ad_Nawfh~n_`hrga8D5{?VF97l4rx;lr44LjcQUO* z&Zysc!{{?X`ef5l?s-m3IneRFdS+*STXHDIr{}JM0$rhQu6%ypxZxz`}v1> z5Abb-MM~R;1ne!XYbPURnqiM&yU!%uWLFDDE{&lqMiIknalof`fD*M( zg3p-eR2uNPy#;Cjaje4uU)TXk)Itf?<2W`jTm0b{2)e_TbS$_x2sTXte}`WQzZ!lm z{GagqRS&2@L=zD!AtqmNiFw||Hz~nJ=5V%{C;C{_5&PvFI^}2Lnfy(Eh6k7eP2Ei0 zO+lu=!b44tP%43``Cuv?KXs#_u9ZL`PdsFBzIn+|Alg z+<5o+?4-QptLkg&W6^&^UyknVL53{jW1X8_#(G-RX{@J?V}b2qKZSrV?as@3WUZj< zcwgZlOxb>8oVx8DUG_ zy9f~Ifv&~b@7_g#uLTT%zej+F?PdXN=nC8eVob3no`)l}ya60%@(J(@@b&O(Xieke zfOykM_fzf&0iDqy3~Z9-#3|x(6#2prlz;Xw@|8)X|gog8o4G%<5&1a%KDTIDH~J1O!+E>R~ThH zRC1)`JO1~4r+fhjy$hHeEHOFxBdx%CUb5*$@PrqA28w_jkYbwTHQ5>D22xFLBrXa5 zTqL8HiC*pQPM0B<8keUmDtx{0jl!j|_ZsS?OXO3%M@t{k_cDF2O8}dg{!KlNhX*$o zju{E@tdD&{I)O7qcYuG8zcKd9*so%jhz{|els+Y$B2}dPX6&6gTfMh*s#KppO*&mV zLpoFXQQpUStMfMK<%OT*r<*X8B5;O z@VcSBt7_diL4hr^k)M@C7dWx{<(fqKf&6c|-*LAkxOo4--OT+h?ReT2?pE$L?so1@ z?k;Yi(arl>E;lz?S4D2|-NV&|Z}mOQ-OJUd?Bnj|a=l*(dNpW4&}%^pgBAtd7g8qQ zp3slSi#fpEk&vZ$u=t_koe8@V%JMepmXxeAzFmT+5yD7QL1Ep|Bx%4m_VYowV2xr_ zN3+tS3rLSF6YI|HO36mqbF9{!V|9%D2m#;P+>BPUVj>SSdEy&P9=YkZ8a+8p89j=| zMo(^IqbKj?jUFX5dVIll+r4V*0>t|#(8eMiG~(qXQ`M$-(w3#Yn}#((H;U0CCHRhM zL80tGi=mvMLr`PvsG80WRABlv>nQjSn+Xa<`UJyS1ho&Pg4! z9?s0d<%Qp+Zb`lQyK0^Jrdr}{s0h(q^|U*&I{g#+DSBaiSbSEF%IK!tr?B33K3Cis z?q~E#@-1OzMwzCct{+BLki#3&YL5rsGr6zjgnX&hFo$QQoS5OJ~x6UEPr& zYH+5a3~3thgUyBsP$B@9^ts$FV{G=;%_V=v^I5llHtRkny{SX+Oi~H9Fxkpx_@`4YLzJq=WI{kU+jopUXA}Ii?+>+q+Vu^ecD{=Z zphSSh9@b+EF8m$--Oc`KBlYo;^bhF=K3@jM2YysSnfjW(2~7-i%i-prP8qNR-N~;( zF~l2No94M#@gu?@em@5O0NLc?1K^XmPh7qXUgLr_^=iP%Y@!5P?F-RBesXs!dNe19 zKE(-rbN8KW_ncb3fVCiNLE39+3)2>*y`J`K#?g$o(pKi)Z^DK{8gX;O*fe0vV5)ca9kv_aoE;5*#_uu-N}|-&|N>MxI3Ky8Y4{EMi*QA6Lb?V?CO$Mzp$%I zassR;j_7m}zEOcd8cTUiDH;~L!1$VRp>dJ%b>kbxSLF-jb7Lp*UWgqW`*?}dX&P8( zO>i|3M)%7D=+iWWhXV$gvT4-x%jyOOn+C_0H;teiBFJJQ7-C8YNOT5ygJ~&4O=kUP z`boT3V;97}pR%yeo3XZ|IeG$)FM3|yFq7kG&T%joXZ&7=%{t(Qvu`ho>EHw4-w4w#y1GeZTSVXMnoGt|)2AWjS~ z?0UrsTVsZ@Mrfv_w?rzDNwOr_61gNtqLAcD@+6PTl@gUiEz#T{@fK@@o-6J=B?+G; zYfZ=;U4a>-RznnHZ9`br#;_ zXj%K5M3)((gQyjDuiU)6EyCTx`l8RZ+k`uW+lA}2Uuf5BH)yAOUej;Xe&P0|_ABkz z+D+PTw0ps~+V8aAYk$yg)^5>m)o#;n*Y42n)b7&m*6z{n(@rew`BqCob;>#+$;`Uk0o4)%kxF^dw`*vE=8a9JQbN{|dUP7wKck zE$SFOV~Bcuh7 z+VuUgyT!l4N;=ld(mg&XJ~%!kzITowezi`PGg|Y9c8GDPahS2fINbQKvFn>67?Ydd zj(5gTG*kO#dg^#~*Yq8+PYs_LV33^MJr4yW2b_?m(8XqGG0b-oJNvqCch3mf-+gh= zf$o1sEstIieWcefy%uH7(ahKQrD^(1Gj&&B-Tk3hVs^83d4=wPWm<}M8Vv=xTdU07 zI5ARlMeAr)C<0P(E9l099ZX#X%cR6eyF@2lnr*sq+NDNKzw-FN+v$WEfbn2AbL8=0 z4->FU(8JBCiwpRV={eI*L2p=Q)~ZXvA1>fo)AObb;08nvASxyIU(=$PQs38O&?Ca} z$PL&YU@<6zoc6~W^WR(yO6%*Xcf?^oHm&~f{kYlb;I-5{Vmcb|qb+m@ZX*15)y;Z9 zPoGA*!EN(O@2_~#ggtNtRxlRNQF(`K^9=)6hIR3cZ#==hkUKaXfO|XbB;tV9nx0rA zcbYv~AMR@n2CNYi!$Qt}0Sc)=B1DO}kEUB+{yN$^rC&*B^J+!Wy~cIvi%eJ(E+otL z=s;_T!WuD&Qi6jH##s+3O8|$M01f!b@fD#K8gQ5i*yL$lT-x8*11|1zo~LvrZxwH7 z@UY;D;Nig!2UiAH1y={x1dj+l$p2NbSi9J?#Pqi59n%ug+oFu**=kwl2BRVcLlp*Y z29YAgrU?llxsYVm+_TjqxjT;2S#z&_&AsI%chlKZS36dxnH+2GDP%73DM^m9BTVmB z^XA^_pr4)1Jy$SEFfWr@JoYu zMe-hsCJs1Y#AIH$llYv#X-<5uFttj65_SRFHdKlf4fvm3$}17EO7N>gF+c!J$X2mF z)x7At;`Hz%Q~PG(V$Ton#!_F-V)kRxv!EkS5K-cZmLk|R;HaG$B7*|xp*ye^{&a)? z!M`0ThfrL`(umzzuF-DM_my&^J%jdSePVi+(>-Vo$GZpWR_y5J-*Bs-`Q}P+jLCAB zGY`KU!_LcFqzr>eqZnovu#xu#jG8{^d?3jI>rJgXqugL(o>5|_gU)90#|7secS)emKiE$xX^pO?LnZ1aQ`1?NJKk~M_JmH=t~IV_BS*NNi>!71_pT$qV`xhx zcb1jM$QnyP{A-kh2Xd7;ezAQ(@M@8@^m>#ilp46yriAUVLDc-vQo8kOI6H( zc%_q^S9T2JYc8*HYmHbX*blEC(h>_vEe$wj*IASZ@U#CBf4jf|@F1*OF<6omGgb@? z;uuLxa!g80YD|qHEharCFman{yXmk$!`gKg!aGcL>7x`tjx|BPY1^X&5CyGeD?tt8 zD?uz1V7rfwj^yeAK!$H~=@ECE@NA2FOwO4W9XHWwWIdYAw0L7wN^sht4M4)6>3fC= zI0`-9kHQCZ&~LE)I031DyWPe~4;l{{Pa01dPaDq|&l->Lf8p;l?Kf?AkLRMUMn~7c z1{JX7F2`yAIz3uwt4FJs92Dtq34Xw6fP*9&U+^BMl1Y5;)jV(Nq$QCU&_YBo%zcQYmFEx!3}5M7{z(!4hUOK z&1A{3loQ&M+Ed!oS`10Z4e4<1{C0pFnBZ8*kXBRhy#H6OsB=F@=WaI~8Fj+AGpmfY zS571uR-4S3U& zu?9+T)}ctFMZvzh5uM)Sb-{Ge^j)Bbr>Ccv=cbUls8LZ-Io}6999BP>d06pZ^&ItF^$Y3?>c0(F3>Ves3O_NlHa7n)vg_qOV0~UHxmxa` ziIhZ1q9r{gF_KtGoFrb7AYs)E56xfd2{GGJR~Nn{m?)bhn_cjYz&}19UY&Hbbdr9u z{$?ZeyV6M##_(S4LO!qC!TOr_dO0({mK2S1b|)8-C#*ne>9Uvenznq1a@mxXw8pU3 z5R+5s>KbpY&db`Ztlc_S`V6xx|!IOd$(P4=vqo)X_3Z@CB z3o_)H@)?4l$eDs!g88DCMSrMg3!WAPM{bUOM)0iQKZ553&kI5#<3vQ_qniH;<_P8r zUJ%R^@FO#GT$HDxPe+GFj)^)_I5z4`^tQqHL`FnKL`U?Dh>3`eh>KVskr>fG ze?WeGL_!4Cy*qT^x279r%w+xR#>@=zMR4AJ_`VLAn*3l)xc(n&O(fln(~@QW>_G zq*)&8*l8}~j5GUd-m#+uZuXM`C6pp|#}2)|oj)Am*4sngXXV_9+1 zzD}JxM4Y^QSDh0u8Q-m+5nQmFNJx@^<8;mibTnO$?(o#|a&)m7Tr>8-6AW z9LKF26hMGi8nKooSzofDq0U1l9D?q~YX}^`o1?-cs4=RX_d0A$=TPWrcc`H;_Q+O- ztqS`n?BlT2VV{Jp30oW1RGGVn^VX=>ssjp0em}mgz?~&-h9d!yaLmEWJe^8!6r5UIz-zm2TsRK2uos9b;s;f<18=OR4cmt-Zh@$ zMW_|K!Ot1-u7)4AJOr}--teQ5s$6{+xWSncqcx@nt17dq^8b1dmY2(4RPRncuc*lz zk;i&oY!xmY^)0(f+-|4#3tT6iZ_TovftS^$_F?p#+zhhm`(YYcMA5@};1!ji3I2dztt__c{8x`iI=#(J$5a zcmFW__vlpb`$bn1?vaG13({Z84(vTp(XDrx`#|@n3J19#)eLq2yU%^172$&vQHh+C zbnmd3!HQMkgT&?HdD<7XFKOp%U)G*UcGDE7(u*>R9yd%doJ}4suPW-TeONBkhv{GH zQ{lc%|7K)-qE1z;nxDNooNtyDWEHFlUmMQLOVo>EUeNPMf3mwF$PjD@G4Kr-=@!sc z2*=*(&Ur9=yWeEi<8|Ylzih0LAfR6#o5aEZnhw7N3p+KSDmo}r~c5tKV3CL zHBtp zljLq+x!v)>U9sjbB;4O{)pOEWQs2Kc`@^) z%=wuwXQoGHL_VSUDqmw%=}r`{DOg)@R(DQ!UZ*TADjZfcT_-U|7R=H|6|5;-Tli^V zxGq8`(!HVWYj7j6VG_aZ7=*)j;oHhQtV6fYEQOEt8P{iM;lk2Ir6)=N-&&xEzWn9_ zTtidM&ee@zA5_b!m)RFQ;%!4zk8Yf#nXiXf;~VJCo_0-RUS7JnvaqTUYk)Kq^gsiy zFc%!lA0>A}v_-gESYPzHcAIdAaJz7w7A3>|$JE>WFXSm1)hV@$_VxO!YEe1=-9GLH_|VbHfR`_LUFept1+42t*I2&1-&Ym<&E;s(>F6+fTmkt{%#H< zJ0r7<&1UHqX||b)%W+Y-=M4Zmy!LN*pHOHQ*xjw5^~BY9Y(rSGd0hT$=*AH3j502D%FaL8D1Ht2;`ox>E$z zo&R%jS{x40nU%nUNud&W;s7rk;Ee-(m;ep%6{2^9eos)LEI4Au? zFO%A=G3T2L%!OvHx!7D{?qk-Q4Q8Xc)J&R9X0sXVj*@=1rW?%O56cHIC=X!Lr2&C< z09@EcX3L|jf>rz!T_u{Cw}(}*SOu$fu}XKcg4NgD&wP*h34PNsOI^u{W7P>((G?V3 zASio zyq|T<0w*DFO=R*d_dD*k1Q+igxSP4Zr5#V(!rjW<#@)`{$=$^bG`e|T%jM=q>#E2t zzI(X3@U6awxqG?#lzrU&T(0*kL9Yfa2zo7OVbG$W`$Ed(+Y|cncrgdKI})-K4;DXE zyfa}}LRsD>-I9`3#{Wjn1iTP*x8vv3L;OMzWCth_;7yp%!%6Rm zv+viOm~x=wd-crD{I=v!j8D&91qHe?^FZ?;^IZA-ym7@p$MlefOCzKtKcK+G-y6y6 z`FZanG5aDddj#Lmw%%Av&)G@L&j0N*51GZdXcQ zhzlwWEuG-9!cgyWU+y#|Hdxe6()~i5&ruhHEb4{H7_ffg*2~ z`c$DEr9bVXq-jrSSK3c>>m4tRFP6R_JDNIAmg@PUA2wXio18&o#KYXJZxNm8D!*Ol zaXPBEUaCJE^$qwEYyxk1z3ElxJ4HD;>wMHy<;9$(@V$Cp`+@dD?QcoN(kHT>%z7$I zrq9x6>*e|t28^(*o1F2jkRbMA@Pc0Lx;6{4dWBq!I?>ZCdEVb5Ig~ zZ*ta6BmWI1AG>Y5ZF?4mp14Wcw`V288gEW?w)eU(NP8`9VcMd!*VBH@IGXWR+REJf zP1uk(zwS*Te>2z(EP%2FiJ*D_Vp{ngwML>K)O8NjC_11u^2CbTCQW{2u6O%N5+C`a z^3n1!^0D$&S$hxs&`gmBp|NJ#xLXL|3+XjO$`A)k1C%vFmOADk*eW6q{2Ba#k{-q>{Hgp8L?4RY5Wgv&$)Cla&F`Nw**qZeYVoyVj()50(~{3h7IK8b zMouei+%VAcs34P*>5{o4-G=!|vlTby_Z`c6WZKOm^8>k=ygfy-wvZ?ob}QL=!(rK@ zuRHtbt7Xqj=ebSRy2Gz+Og%f+E*x4`4Qwhw%QiQLJnSa*4GpNY$4o#eh|USZ9G(LN zPy&K^w4ek%n1G%fYp{nKY+VmPI{1d?9qSY88|xR#i}jBUhz*SG7CSnHujxlVKnBN# z#PVZ9V+FB4lukF#Fo(tNmCQ8HG83^qVs{t=aszX_<#x{v$_>s9kBx{Old?E(Z^6ET zTr!VTk}6V7YRG)DfGi}(r8u9jth1i4%!cPH6xT^0bHLN)2>Nu4Yb6hzM|s6QV;(?0 z=#NpJ_ODRh1l|8>O!sp*-EP1u_IXHklE)c(LbPoww7*vly{ezfJuX~cM94V(eJ-zh zj1Jf#-6@@uKiV+HpijA&cq#F+9zzmr*R5{cb#$Or>7mC*y2%B_(|OP2wPpMtrL!b^ zrGF*vlYSX|CGl$FwM0{@dy+?zXOdTvcM>*4&o)rkGGYw~x4+)-eQ0!c^cbtD+_9R< zi{}5!y+?4bV0Pw#-Xk@2n)_w1M9kKn(y@8EZeKZ}J2y<{&eByh;K@*A1~(ihAik&p z5q3tYM1cA9kp(T~yFspB88hGWWzSbUJ;P+8XY}p{4?{xATWYsrZn1lDnts0dWi!?( z5Zt(n5{Q`UMF@zrTgU6H<~){0sxPFaBNIt2Fu!JYWWhS7X;Tg?szY;NwT*P=$P4sN zz_%od`IcaY|2S5hvf{LGdEs}dTT%xa1{r+fM`<3>oC|y|ldaBIASsk+B}EdQq_r8d z?)0FH*UfJ<846#|W+<`8(~;+-)&kLiR@DZa6_hao^t_||m8EI3ENfpz{j z9=ByX4nrT+N~&5$`X_Bz(|Z=qFl?J!@}~FfXDNn^-=Wrk%q%2QeQ(-C0wI~`y&-50&PST|n7Dm2#^Qy#{% z$^)%DG|m{*_DIgoc5c90vynA^C#eq@D{RlS8YnA4XHTlp zx{EW7*<#bTajjvp1L)8;lKO+>yb`ACo9pdA+$41uNquVa~PIrkB4x$>rPT zpTbCQU3&S>K)41(+x%!8C1g(Ed7AN{n`-dyAg7NiP+D!QG4?Qo8}j&DleZ;r;+>CB zrHn9sT_P{~8XhFR>U=Su1G0-ST)yyI3zXvhzb^U4Y%?_J(ChZFS!q;lvsrDX6WzIe z>@XTxTkSBL0pn)fh_>22bhno69wkV|(-`%%y$(PL2gVa~JkDB1tYu`F$vRdgITD2= zSCS`rT&|R;Bx;F9k}qK$t3!-Kjl+x;#^J_o=I!P?%{JP|%%g(>dKAi&rWsL#i?B!T z;G*o3?27DtH-&O=kxkpCB|&QxbGm6`#XOx>%-bxVv5w6PW1A*UlW=otJl(l1YCPSg zZE8H-sUNj9A`yWbe*A34(gN`=9!r0-$cFf(}6`agCV{9%zQ)AZHlABoywbLIR z;t3txTHT>cF;(bU7+(~xi!Y8ZiSH9XMtHy518&Yz4xxG9frgJsxf^xQgWcykx;wN- zCKbl`()a*wAeW4H9vgM8adhs6jooyo!LZY7P|nl(U1~G)zTfi)*=E@m*;d&$*>+iZ z{E+ye@x$UP;)lmS9A6p#faimrzn5Mpy;$1cbAaa#*`?AyN-vl0l%drr^Bm~uOeGp{ zjAKACMrHdAgsEOx_L<=-*zHOpIfJy3K${z#fP}^hs0K*vDmQ$20Kg(g9J*ffAs|=G zE#6WHYB(lnDs}|#h{cD*JM9??ziADMmSaV*0is(?S<7fK4|Z!KTmKCocAKlawl1=@ zbC8aS!n?!4iVMKjmaAed1J*KVYwYTsdJ*INlVpVS!UQaX2_PbLM5$OcKDb^ zlk~BvD)5ikmubSv8Q1uw(L-X~;_vQj zLemZ2eUwS6q;li0;-lhY;@`x_#V5ok#izul#b?B4#plH5#lMR$h_9d}5}+9>8z!re4VOJEtCUsAs%15@5wic2)yfp|TzQ_H zqZuiylZ}!+B70OeS~f;DR`!@|oNT=8ahX!ClB?w|nn+2MBwEr_5+nJyuL-eIrprp1 zj#j&0GIUhcUDkDdd$Jg@43YKKjMa2mhWL7?QM)^iHMUP!i=NJnKqn+d<-ga*J|UgJ znW8(uKgi!0`(^A`u}egU_)kiAn-nR(8GC2WR_`sHD%IytlkPEnl=pGo>bwnldEqDd zI#ap{Ll+Ki1sP@(OzdFiQ^##JD+O68c)N1>v1UQrrQjmN>jqdZQ0Xq*ojOkQVo9tp zP8cst5GD$fgkqsYm@IrWH$}KDB2~C2^~cnn@h)0dZJO{<>SWnZsd>Wwaxdlo3S;Br z;>T+~%MVaa$bXuAhHPE#VGT%T24jVQc!4c`e_cHc$iK%QW1HPNm~Cz{@hm-glQS)@ zl_q9$)dUZr7A@{h@TllLX> zPd<=*F!@k2dlztRR#ZuH<=4kE%d4E&Q#=vGnokfJ> zCKR(d@VM@d8s|A0dpE*~8u@}Wrl3=%dJLm#Lx_jfQjo*e_uJmb07-BDwyqj6(yh#L99Mu@-CtS_Jij6ZrlC$n}yJeKa@ z+la@;bFB?qun26NyHyrJ^NpW`wBPR_#gU7}u^MQEJ+k+NsA;;Rsh1PgwkAy|3z=jS z%0h3bEUfZlC<{`{24*T3=L}y+@@J4T%Ngz*QEBMqv|-_YrO8RFqJVYtrxk_fnrnbB zUSK1`?x9n{>48|7VYxdr%Y5MP^#F*RwsSn7y!Lc|)n$3yinsxqg)S@eJ!C86JY~yV zKIP4ozw7c)?nfRUxt)`om#oT9ES6hxEQNvEK!orjL`EY-CBm9U#FMpzN)}|bL+Q81 z1sn++By(Qeb=I^Yc@|$F4Pq>=(lRmB+POg!tA}si#~I(57@ZN2@>j#o^`Z98$U&*W zB{gd{vXc5E(?D5TPVifHY82)>7s`ve(s|oi=LemB5o#R?KMtAa(sLYl;{oBjD-4dzd66;6~oPkmMNqsVQV9 z9B`jy6QAK(cWB*KN6|yZB1?bc{gyK0K%-Sr#5$mie@L%v+z@k2u(y{8+9gnTjcr3$D+nXjgLATEr=9GhDC0P z-WokFW_-+L^{rNwxsy|S&BQLLlA0yuiNX#3pL!M0DCg;`9a&H23gb*S~z zcJgKP(I9;a?CjVbW?G)IsPOf|Hwu@=-fO6nE|E|59xZ)D-^=v9E&)iH`M+3AI)%pCO+%m*6)H2LcVZj=q^8?4jFa4}`M-#I_=EMuxxvD(Xp9xCU z0`+U^W#MX-)%w7?+1%94H5Y;)yH^@HP=FBR*a0f|H+T~U6WQ%T0OPhCr@Boio~X9e zSmw&-=Z!1=Ii`m+TpA%I`2htc{@zGl&(C`wiP;xv;Zyv6{F6yXd1Hd3q}TxA&~4o^ z;`{jb^AGVJ;M)d>l-f|8*8=DRN7T}*meS7Dz7Q8w8d^HRWrd;M<-Xi$N^H33o2LDR zIH42Ta(Wi@+aqc3S)_)Rt}tA48Rs`mi47HX^D{^l+L1b!iAL`btQ)Pczg0>Ez!cez zwtZPeHh>?7GY1Y^nHI`yZ+s+LBR>Zj z$i=7=J79k(yK#pQC zT4qi*W!8$^rpo@xT=(`?V}0b0%16t`$j8c8W$jTsCdY>B*=nk7tkp(0j(8jM`*l=> zztOVT5Vy>;G4#Yu(|sn0@lCe3!o8>a_Fh{QTNT?BD|4}-ZeHPbMydq4O#3rWs1y!> z;l1c3hyOkY$HPv9?IZRR2Z)2jA>t?EFmW>MRM_dTGht`L&V`*1`#tPJ*u}6*VSj{O z4*N6gudu(vu7q6;yB79O*!3_#a0nN|m2e}tggfCucoJTOH{nD05`F}a@FxO@K%yJb zod_a=i4cNMgc1TmNQ4mt(SrylA_x%?NkkFRL{B1yh$Z5Pcp`yFB$5a*At9296e5-A zMWhkwLCTB(y{kp(Bck5~2^GCk%v< zC?!b3M3@N+K@ok4e#AY*y~KUQ{lo*rgTzBbe_{YpMhqkd5rc_xVhAynm`1E8HV_+$ zFNv>+uZc~>H^jHZcf|L^55#6-3$c~hMr98iPWai;eZMpFdPRw zi~}lhKot(C#sM`rU<3~MKO9ht14iP2Ivg+x2RwoU9>oEpaljZHFct?qh6Bdofblrs zaU3uK2h`($i8x>q4w#Gsp1=W5;((`cz!V%X6$ebi0n>573>+{M2h73&vvI)FIN%u^ z@GK7a4-R+^2Rx4h{)+?V;DEU}-~}8o4+p%6175-b^Krn-IN%i=@G1^ifCFB`0Sj@! zA{_8K4tN6xyom$e!U2nMz!DtrHV$|P2P|a*3WZwX^HArY)sAxTjOAI&e=N^gp11th zGRHF4@`7ca1>?^u>vmRa7l zyk~je@`2?;%W}&K%Sy{C%SV=vEvqe`Sk_q9T0XUWX8GK*&hmw2y=8-CqvcD>SC+3W zn=Id0zO{U3`QGw_WwT|AWvgYIWxHjEWv6AAWw&LIWxqJGFQ3)Tt$a z514Og0{9RIEXM&WaKK6&unGr!gabat0jqJqCpcgY4p@r=KE(l_;egL^z&af81rAt` z12*7*jX2;-9Pkwm_!gqDjste!fSovC z7Y^8s1NPv6A9285Cg45c`@$jzCpCdTEq_`5wp_7XwOq6OW4Uet6o+!5Tq!q-OSw}X zlqcmyc~d@=FXcz^D1Rz|3Z%MG-Kiidm}O6+2@c?ZgE-(24)_TN9L51ZBzX^vDO&6Va!FKE@$0;y78DAh`hiKU5`WB!b}lJOLO27jQW zhj9vjD*pq~hoU#cZ;EH~XYptA`=?Ac4@kUP%+YT(ep>Qb2{wQbw2U5Paxz^qccfcU zJZZKf2?4(_Z`@AgRd_M(0|kIdynWqY3tAkM5t2%sO7lzekJ0o|C^l(w6?qD^La%TR z23}{4tnEelf?;0Bdyh1Odb9;;)DW+s4ItW~?+4N$x>U+9jfw7iO*eg~iptNREaZA~ zcRJh`BTWT2e7Odl(0|MQj=L?v#rp^DX6|ok$J4fOw{o{}w{v%LcX0!aZr;~&xw+B0 zDsqeO9-|d5t3eBbUJF_nv?%DlkTUu9gnm3;%mMC>ge=8_ z#SazlOxTrBmbXc_q-2%x?UEu3lOzrJpZ&BIE;j&JSo^*3-MigU`BEyqD5L0c!vw?G z9-N}2I&>U-@E z+RfUtrXAXy+Fjb++CAER+KEL!YEKsf<9_V{?LqA!?N8dn+Ml(P$jRgr?WSMVZ*h?2rO}!AGVdioLtq{;}D2Qb-HNINoBTvrA%2 zUnSeZL|Q5y69d__lg;4@B|J)rHy)f~@^4$Zr9dcP>jALly1v}Q$<>{I zpRl6a@NTD5HQ+Q;xzT_#c7PJ@1vpK|KzqR7>tV(WyNYJLQh6c#QuyU?KNHX7Z~8Ml zz!YfeX6kMVGW``EY8ocW6LBNlBbG!8OuI=FWu^wG{+D?sb4%}28f&C9hCGVCr+I5g zHQ=m$3TOu45WPOgEm99a5}d;0@z-VlbW}Fl34@_IWY$rOf%6FK4DlW<)-r z`6^#yROwC>uPInta8`FtcV4F~Eh-#VG+h^2FiRg*u%>Wr;irY+x(J;}_lCBw!Hw)o zVZ$VX+c8KEr@JTpJs~rm11fqlZJy_LaVixjr$z zdOv-?5Q~Ts^%b4XOi&~$mU5SI-{ro?UCrH?wk+cl&2--_X>W1g=f2Gqs3ZmNkz3Qg z@!OWRJ?%OD$-=W<=e*8)$-*t!RXQqrjb^RpQ_bZ*pK1DLU+}u$;uW%vPnFQImqps&wr0x!)|MJ(t)w0kj1#ceVYUgj3w8*03U&z|kGd*2;q#B+x`3;6S9&Np!jnFye9ris z_35aJA6NKREgS$PWR&1u*YiSjxQKx8pBp&S{cQJh-OqQ&?!^WpEmwPrZW#=jM85o{IQn2mQ_ z>822H5f8b*Z1wvf$No3Z>)YdyY!rn};@*Gt#J+u|pafCSePu?qN1X11T2pGQS57@WcULc7PIf`9~NCQsGa8ryiy0oIur66RAnmWa~7r|dl+|N)(w{C#3&a2%6p*m&X2{-VtccpigceS@OweUHj_BraZyKk7yVpgI~ z&of4*+x-GAyZbTQ&4GFpkGb|fVT@_Ig8x!;sTUeg??2Q$#vt`pVqS#P^R^EHfgJD> zr2*ZUo6{{Uu%QwJy*V!6CGpEmVS5EmEs%-rRY-CWlVs;M4bv9{C_yN*4L>Y~Yg?iQ zQWsK-D1Mm08MzBUzz|5AQ%hIyI`sx6Qadj^J=ZrOb-~UEIN&Wvosc=Q5`^IZ0tfWK z0pUzQ0CQ73!2;?vYB9BhdYgKOT1qWzYJ1*oYC+$F+vCq9`F%C>t)sr6)>9iGp}m-$^ZnE8043_25|$c0=` zr#B9G8fA62jfq-F@fI>1kc9)Xaey2L@~v?KC{4%-kN}j-&EG@^GQ&V> zv?}Pdd^yikx{|kwH-R%OxFUFX@Wa8C!BxT4!8O4nf)DbKP`@e`Ygd>So0gc~Hoaq7 zB6?etkvv;1%iLg8q+sZJfSX08ND;u$yRRTs-d4(lkg~;bOXA*+dnayb+_Jdsp*uo% zhVBa89lAn%T{_q01s6pika1-DLidLr2t643Yadq`FGmAZ_U}ds5#b)_j&NNZrKW19 zX{T#vXlH6WGF4Gq0yARGUr5$Vyh{eU4sv}?66m=nkP|t?b*Sqw*9zC+u9r<&Nox#i z4KX>DuB_|ATA6_LK(ij`n<)+3ajpx@tJ|^hYn_EjwqN|(y{_u8CO!I?Yvq30KXjbB zouvw#FGRGDdj*@ueGML>t~Lqh%IgjKLI@~es<0DzA)v4^NZS}x)EJ~|3@WyR)*&-v zA}^n5Bzu6<)EVk5^>yGm>OA#3L(zskknMH>#s_HZXzCG~ix5LN(UU4 z)FxBM6pd$fANJTLO_DCjkYq}FOW0$ZwwGbJ9g+JTr~6!@{-7}SxTHhl_d5%tY(M=6 zE%AJ=)%$}SQczBzq~4V=^F3eoe8tl>@O$Z>PHm%_J!SkWAmzEoT65>wAL?09?F*Edv0z?_uaTs{!_^+YT4p zoS2VdKaO1;`$=q_|2suXiyrkKCq-4b*Tk-k9m^RnMIE({jsfsWY0DkX(k?pWzJ_m^ zbI|55v3p}t?s=>U7rIJqk1($GR3}pUE=9-i!ZQO>0#g)%ey-QaTtO_)uV9ytA~`qt zg6X2^yFd?5Pfst;O(AtrqoSg6z7KrHZ*yQ-^tHT-=-!Fa#2=!MMxV?$tbQ`{u;Rb! zIqJFU7t|Nje;ckCE~?KJPBOTdR~1&}eo;KLWEQ-M#HxI(%EzjF6J?WRvkSfv+)U-I zJ6`2m+$mMQf0s?RufnGRCj0pd6kh;b4`H1DISaFNb7f&wA+Imi1c_Yqh}X9~3;=iI zz~SYC>VUVltg77lyMMvpin^NGg3)#5)gvovs@>FOBg@?>U3Fc0T3}UwYonry!R3XO zWkW{_N=xf%bFePDsu7jBysG|o9I%bMxdDS`RsX_@%5q&k{H3(4ZkR6L{Sin&O|4H= ze@#u*h??s1>N>8fwzh1H+sKNsv95 z8N(UNdDOFS!y={Io0Zm#tU%4+unpbJuq&F4W>`h#;M($PdN#I^a?!fO<%X14D(qAR zYAb67mO0bOE36n@K3Ig>jI1jk5vng6T~RfvN~Ef+ta;Sw0a{epreRbsb@{NeM=EMY z)%vPN4X&u6rwm8zTT?lzsvN!u<`L!PgN;MXHKVEr^YUv(jHoQH6&04DeGkenA5u1| zvQ7lslsyc=`kKMzex@2Y;E*Arh5=kFs_WqLBA~Ra7H(Q)xvILN zstn?B8(33Q**(9ee5A+*LDr;)<;GV%BCaqc(I0*e_eF~TE{?rHEYKIOi!@<2C z#35;oAnA=D84m_NT2os&*tUPF(G?>DE1h=~K|Ikrt*xzj)U&pFaA8gDpmHvJ5eAie z3@)o00bg9+$hw*lX1L^)4KIOj*{C|W9Pp(cHK@*4S3P1>9lg5n?Np5}AL-QqLzw+x zvq7~LBhXuo-hICF-{nIgIxC!4P5+@DRaaM2%^T71B0W-W{WGwvvd+M0fFRbF&DO?a zXf53Cx-o8p%gYA)j6_@lB1eFc)ny~xE2d8#AKZ4Zb}i-G|qVF^sATEvT%l z7%{S@Vz6!J3aTpV;M?zy{p|($Ms?Z1%JRW*j;M`CRYf)0a*wLA(defa{JWsKymsgq zF9@;z=7V5W6(bSD@01sr0ut!guphR+eBc(?eh(_Q5@Y+j;l1;(E2|y~ z*^v$C5C4Q4Q)~OX8$_UDf)GyI8^EXcv0PM9E$WBfjgceD29@W*2^y=*&BJQy;8$c{ z706ok4Rb(iVnPFZmR5`?udJvpch|uEtS$2$1y_1#HT(+U_W-|pO=WpmZ37dAebr@y z9)|A~{Jt7qcTO#5C}$w2jBA2?V@N1uhmhTrRl?O9+_$3q(bAgQI`oA5XvN^VVeZ4q zD~1lM^RI^ZM1$ZiiAGeGRhRRIF#hx#Qc+$xSX47a^a#Y@3o#6HI1-fx`KHfEmj)ZM$i&#<3!Ufd^)z|(%=2te4@ zZZI5#hwg|DhmaPaYawZCN!XlEe}DhXsx=7c`vSBot5&TVva)ijtU1~{0t32d`;GJ~ zGfPIwqCQHxtwbbSo56|^RR;w^{F*Yyjlo$m41mdfk<50ZGb1c-`F1pGFV@c+)Fo2q zPs<;=O#0!V*9Rf5>gP!^WTfhi%cK>6?Iiu-qS0qYsC~D4nJ&I*q{H}zZ6RI0GGi5a zkvaQRY@NTU9V1Za$|+qp?4cP4r>AK$6zLT$PkFG(NoV(y^xV6d3?}1)hKR4L?Y(d5 zqQ<6~uxbN98-%8b_SP7)@8N@+r}y)W`YfzkdIV(?38LwG47;DQ^!^UZY)D5# z1ywdel%A$Nu!xUuw;L%t_$StsGC_bi_TI$V zV@N7JPOET3(`~ini7`g?X3~W!emVSDR~8@T$rnayoRm+0oH%i2A_6-}r=y{m^Ng^u zOba)?iPMfXq{R#genVB_zRzg?2rt~(+S=ZpGP12Ftsn?8izYCaLR5WM^E+T@z!K)n z)`#;745(@qmeYs&*LHVq8y>UPJ?)H=ZZnzsW+(zL5TDkwr%Lv;@yG0my+ubTT1c!H z6P03O;}5>QP2br)lWEr8p#6RG`{wBn$g<^Spc^EP1L_$o%Fu*;hhou(}gD&V6HpR z|F{+(YfCa#lfHFZjSdqUiag4)J|!oI9SIU4hbDxV_IoGLo&bh=xX2UI^Wisq>z;NI zxVD8p+;qoQv9ds-Tj)pknLo5?JssoM&p zKhIjx1{9jG(hx-%vgx&(f%c@cjqb3$)q%c1l;+aj=`hk;Y9{qDVShD-bNaG=)oog1 z@2C?K@Gub0J8yfv7JNSJX!~^3nR-Ko`_C@jpnv7w-qwsh^GKLDRd z27}%po$>O!O5D3(!7_(;#N*ui)<6#Gp3U|L;wmnz#LD{~-)lFmX@NdX9ktKet&?8s zN;IjFYFSqYjWh5p@M20qW}#7UolzA+Lij~gLa zX6ev@2&Oe`jblL27(Ve3icgz`Dr^p<;L@*DO|Jv>WHEc5O(YxjQRAw~e5LQ&Lsr)r z0%=NNlbEv=<`inu(y&o?|IuSarr$9qi9NbRnT@`f2u7~U7(q;!4rYF<+dS_Lm=Fmh zEN`Zu-WPK>V>S4*FvNfpssBjyNe1%}9I!CTwV)4g@Ar`GrtM{WgfQ7}C>#fB@^p~! zr8ca;-r8%!%%}cMf99M1@B?xJ9N%}z5I!kWr2Gk-*&ZN+GN4W2g(Z%AgMW?^W7y)z z(6l()e6OY*O(P1EUB7^JI5xeTxa zBTkcY;w_FaCZ% z&3>=jbMl1Z$jB5UTnGO;$q_?IBZLYq?O{&ey=EB5-4QB_B8;-Tm)d#rQMdH$DN9}J zQk2i-5@*F;KkS*V?I=NoA=U#LOc5q<-c&tVa+YJV3CAPR$vyg8CYgGK%)g zQanneF}O@DP1_uAg)$+-0c$3QM(Q7tk?#5uaFvWW`-r_RUhnl%jY%kE~nV7qd`^LHPK~V&c_YA!q$*DYafoRZ6LiQfjl5dR9t3FQs0TQZGxXQd=sewp2=O zsg&AMDYd0iYD=ZmmP)BDl~P+OrM6T`ZP_TbWn+ELRDOFfChSOqc}r#bz!^)T^@E`L z_F(`~w%3r(hO~uBu#Uxb9dx(8p#lV}58DWkclLU{{+)dm@#Nv4-5WrKW`pj~)T=Wf zTI7gk*eK)k-NQz=Qk@xq!l)39lx<)2p#r-o51YeuIpjFAXe)fB-{@MM1=teX6S7|c zGL^NS1;#>yoq(K4DuXBAsL~4%=v`ybf|n63ks#c-priJlIO!m21-^_IOiAKZkzz6R z2A*QI)zU+Bu7iWq<8M9NXm&;?urU1|XfJpAq`?M{?RHIi&hYOzEQli=BDcj0qQn1|>Y)U`=YKG~8+(k95|RE5D2T!MK15J28DU zv$qF_Sx3VMzhlOZ_2-)U4l)t?0lj+MIMJR@v)}Z(QJ%8L;T6hz<0h4qw5{KHADbXl zq{w`4dS~|bnRSaQ0SLhvHJ+-bioIgs)f9AtJ3*jHkMNaiXy_$wc#H@>67L z$bW})BA7%XiGhO#j}dR%XZXQ zFRsCu7moD4#XbgXLjOgnTt1@H@$-yLP?Xe>T)ON!v^PG!L0DqpdG)-6DDX{>M`blfXM_iqIt*ulK_F1VUHLNypu5y!do{B&xs?-=rxSX4+d?56xaIF-JQ)K=ODA7C}xJ&GO_ROqM^i%DA=V9;5&H%N>K zr?XnakyBFk8}pKFa}X%EV*k7 zLS53r2}gRUCz4YyBg(2<@Yczex@W>-zUz??R-{ z7cp&tfZfsZokD+{#^t$7f0)sPdbYTB!rj6BF$;zLLiQky=UnO64&mbU&$snWn0jg!yGjkV;8f|!40U1|d*5eL=*wnj= zDlqx}ucOO5Na(U>hDu!iVTj%i+L#1whtrQ%4x>YB8C+%|Q(m!GF#RfG3uj)-pG_#J zoENsbt%0m;gWf3$tHHxoPU)!UOZkim9PCD%-lIC*htA=(fC6H_8*Ge!eh6e6_3F;*Q zKWMenK7GwwRmBX{JNprmC*!n8;6MU0?1>Cqa2Lb>{FA&7{S-;O+WXf1>kXy$&=I11 z>nCVD&WBI_ti)b&I$Rp1$w5790vNdlWTS%O6m~<+c71dlgT-nG z>zzF$vEOKJ_4{>(CIQphEt~tf@90aV3_s|;J^V0RAWP{3sKcn=XZ#q^oLr?pZ2o=Y zhi8A^yu1GV@9R(R@c-4sfgB3b`|ZPXbgA12&KQhZ;1@c(WUx{M!+1%x`!Jx3mkq!j zcG}gD0fSm^eGM7YjovWGy=#qrTPg)wj~W(+!npNS{{*Z-yRQw}fIkJGiTC2=RK-R6 zf34#W;I5k}HKaB{*^~@|op{aQ_392opFK3>wTV?gAkfnf%uk^J13eqY6WnJ!f@a*8 z__ns@0km7XgO;~IQC#o#zWjRdx!wT+K1JF2(HXJw#M{i$#5_EB=i%9!CvK0;ay^Wiz5jgp4@ z-7DoTlcY+c62VbIps;Au_o$!FM_+#`fQ)Tvqt)+X7U-}iJSb#tH(*?v$+n2jS^u;xINT*U(~bh^`8^$xWjYHgoDuYf->JqHNeOKd!#f%Z>M)9 zg*?0vGcEN%y4+7UtVTX{+BSE9ML^ZPoigC~d~|WrMQ~L0OO(iIq#(0E%*{xNU(Bi~ z$$^n=8Fdg6WZ!%|l4|oPIT2RvwND0(!BrUapDhcjfGiJte$1CG6bmiK;5UPIFf|#9$K>>hY!%E+nl7A%BJ}?R$ed+? zqLx~Yxfu^uSsbgnvXGYQuFMy7D6kab9!z23( zV;0O^Eane=Hnrr_Iou8Y7Do73_cA)lHY6#>s~cYFdD=YO+@cZ8BJry<#~l^sj21+W zYN8`&zI5@tfnR`VcbLjK0Eb5hVcwV9h$opS;ftQFYNt%y zZsHPT($pcztZIxh-5ol8zLGJt>I7S= zX1StBK@+J|u8W)lEt5_}Ft!HYy~PW~4zR1`K(Bw<-ij;IwGGtY+EMw+QY76t7T zOqHP*jQjxc<>U@@u8NQ3uz}jof7iorCH!vuF%z&p6P!eqXTg0= zt`d4_$#>DFbzhzIq`xB@XjJ2Uq4hUs)KzIdgan+om z7gGU-#ySjy)gAgX=cq*@(dFanJ~+rym;u^#>4 zSL}$GB^}dev6adl*qCKr{4Lh-yFFx|iMBvw32#VfZu~r*ibd>2>Duy6cysch`ps)M z0)g2+ekv$oSV?-FrIiEX(qhr%K-$nrFw(|Jh6C^B%8rF&L@6ju#1YTzV1hFwWM4398MVx^ki$`5Az)f@r;NU znsymXc(W*ZIW|Qs254seG(J~bsfNH!#B%4uKdRNcI0|<7bm0@O(A_g6pENygcZZ-w z0TOlAjD7*Sb-@Tq5mkWIY3Y*{u&C4g9Ev6>p%AEctC7#JsGw0@jWzTn;>hWCc zsP$h9k_xl_rI=g_$qBZ7h%4StfpUfk*cu{23N5C5s2MlNWcCbR__OAjH=A(B80lK( zvIF+98L|V~xP@}ifvRhv%B(2pZj?V=j9U4~bMd_hlH$`RPfcQzh)KRK{1b~CL5yI0 zOf|bdno6^Z;y(k|RKX z4eQ%IoF_mZPh|!H%42)6@7aWbC^4OtVYvM*q2HS}n$EX~Hu4d_O8-)V7&Ao^Ge4tp zHb`m~v@H8c>1`ud<`gBlPtHH`M%_Aabfu+R2TW@utt^wRgZM#)CUjdY;sDlyDl~QlD-69)@tf?f)M+&TnkUwc}Ft(?#9y)LE60~_Z=hrVbEE$eqfhl zZ`;Tb$W1QQ+nkYosq;tw7xsM`TQ0&20 zvzZ`Mn|g_XZ~{>TGK!J0Qsr(C1IW@zQ;0f~p4AIxaRe$&sDEoXY&6fMSwEI7&kxHK z!Lck;k(Zz{e-S%o5T?=v8-ct&cL$EyuW3qr=5374pBh)$AojXst9o;Xwu+(<#`qmJ zAfJ-FaMb&V^Co=LY!KJ1DC1#UY~1*bQnA7eSR5nEfZFc#l2aW1q@+$CTNPkNDpf8! zbDpIm9uX543eU0(t~KK%xv=RH=7TY4e0#|_!6PKR!HIi4yVFAOfM&i1u4{yM#4-K? zlBJ(_Z&=!T2nUtGm1@##T*-t@H|+V{8#DBPc^J$(P$?EgYV=O;+84_yvp=gQ_;Yl* z=E_VZ(O)QhdQYF;%faRPtqxk?^$W$4;fnQ9Y~&%^l=lo;vV*?-^z_XD1tjiBSIm`) z$Wa2!!lHs)`aeEAJ9zbt!i%(mA=z)^LdPN<^01ygRkEiIByekrh7E>ZYk(b2x|)T; zi2sg|ZiA7Hk2+~X11c8A*U{f!-Nnh!I|1g~NZUB`rnhI=J^&+~_m;{?m%H|$;}DyJ zf|tjdy)OJfJ<23x$YeOHgiqrnME4aQOH0Knm>BOdGw ztrHFrMPN1yi#nKL+yB;}c@7O@c;v8+Yn8UYW%hE^1&AoPC_q6mfZR7ub^Nv0phX4? z6;KrvTnxOikXqNab)^riioEIo*GU>XUj{oGTV?4yX%gjBiWhfdARqehgb#gq!iPRQ z;X}`!Vnkm?=((7v$tO^kob!&!_P@y9vh1!IGw<7x(0PAYuPR^ zd9mLa(knOTpUDYz2P$ej^U}2rJ{;?J9Mad|OIB|L+Ck9go7y$vV1y>oqC4u+jPc#> z?lb|HanTqqg(A5{RwUMkJ%_>H_6?`fIW?X=!QZC!+c-qEH1lE}^qjvnchJPKMs#8e z1t)91mP*q0Lzkc+o~dSkZ~*w=NiA*{3hsy-6nW=IpP1FZsHUc$Vt4jAXIC)lu)qV4 zzh-0S`}%G?EBt!dpv8J#TT6X;~s_fQ1hdH&Y50;Ps+eG@RaJ81a#N(RxWz2%;}u0 z1iZcuTmRz$zMBme{&?A&;p=~_1qJg_A`U59VV5tU7iG|0Q>IT1qoSJ`I_iDXNt$$` zXD+0RSzho+SU~M51ziW?E#=$7p!AV+5>jHvf+zae$h*UdeJstR!9=Tl#xaG-i`M27 z>E&FDxYsyA-8s>*A121r3lfets`YH>MDsc^1-3vZIo5sLJ4)A<^4Oo7_$NwHH;^*AaL+NxJnv8rm`maAJ31P?!{`>6(<+W(l{>SZQ zw2SORQQBSj_fqF@QsHo^yLp8?(ZBH~G^X1b zHa!KZ5AA94TR1Rxr-N<})On*g0sgHZT`YM6-96vBxt0o7j=f#P0vO=n{NW=)PC#f5 z@%C`-h9zpGP`5!tX>>$JoI{xb?1!HjRG%s9@`-~;2J;J6y$cU-ENB>!V|-<4)L?Jfk&&ufQkr9qRL<_7?(l~E4A`sX=iDm zp@@W6mV4Z@y^BI|;RPp9))_oQ=(yMh_N4cR2gmjnUkEuOuN((p?e{JaSz6h4?Hk!c z-xTBcF_qdJS){ykTh@aXXZgb$5)Yx1)<)Kw8A5zFiwmr1zKt;REkqBO5qtR?#}p$5 zcZ}xuo5;W0eU=+4@dWxTxE-#fi*$jrJ3YCYL5ih7)^;=h4j+dGJlYkrg^P0X9sd~m zJ(VI28n3?yQAQMrdYk|IeH?H#FSRzxLby0ab})T5YPV2%Bi{SQw9gKs*4Ofr^ndZ9F@UdOl#h~& z-esfn@V{UU|MuT_g?44c%K4R_Jflk|L5Nd4jm&)P%na)afrH}|Evp)pWtNy~#(|pT z@R}Kpnf*No2!tOK5VT517eFjes{*8bpGBZZtJt5;1dcPZV*PN-Z-lX6_rQd77Vd|o{sj1sL>`Hn>(RKOA3X`39`m>%;eff@wg?dXpNHDC{|e9t^a@gHTW z#JU1!SF)bMK-6_UIlbq$&DKmcXCm&S>y$^N!p->dvBe}>8qz}l*ViW|TU&vxW!(mq^n5s#Vr4Bbr&=BUxrWb1ZBu|nP_8(jW={0UX zScd!3LeWiDoqRSJ)l=B00obr5*E=)eL6Od=8@=73`y--SW1+TwD!?#UbTC7^|A*@2 z!`Tb(8#__|2iTP0oenN=>Y5`xs9L|epoXuG=}c>(qg(Fxn6-Z9@Z(V&@LWoa5Skj< z%}n1;v>UciR%nF8jbyGLEd(O4)2W?#)g!@9P<^K>CKY?t@tvP@X)~`j+xJ$WpW#y( ztibiQwuXCYJ{e-~a^ql%n5KTXvEZ1`Ew(Z(#1oFdqLiN>Dw)Y=Mh}IFSEZqvIhC zTpZ0LV$XWLmH|vy2r7OE^^NdZ?fNk)!sH3!g}ya&!L|h3tu109d(S_B>gNDwylF@@ zlVY^W;|+L1OU6lz2m{XL5@NipNvhNCnq>YM8b7U=6mfG#RGs2j6TeQNqhrUmz*a51 zGdi3nVO(Ni;t%8r;t%8rJN}|3i41AKVXA^FWYS{vL(7664NVPC5l8NIdISk*;7#u; znZ1Lm=_no~-|ajP-X(Tm7YSP^oMLOihmpl^$-qm5I^l9@Fix7d@sw+e=NsKTC=-Vx zkSpP6{p0_tgK`^{zabEL7I=;(0Og;(o&|4m}hQ z$sp4lvVMGv$d?S*wtwvEdPvD%+dW*5@GsCtf?Wm0n~v7^1_#|hZ2pt2LcZgFUTS3o z3$Q82W<~gMx8}v~`1SdIxOK^34hjHw^!q6<;Q;wc+Yt6OU zKnmIE#H|_Hc^ouWu0`g&YpO=sab!AYwzS>vO-4&b=!{tL8i?&fetzdhjsj{vAH!;JDZb8jbkaA zgzOR=w^`xfjYP!m&^Xofu{eDBfCk1a%Wvw`c`S@gNJm@h=uwC^Adb#djro?5%0r`& z|X5hnYiQ^tG; z!WY%6;zZk-GbUlT0-2$n*1bSO>5%FR`=2Wva2iPGvPWgj&^j6NtXOz+OL`&68}fhP z%SD@@lJ4eYx#Io^j#r#Cwv|9d7)s7x&7qZht`WO89zeac3P)EXP@KcEJ#jf#l51hvQ9Gt{XLCwOz%O5AB&JKKV}gVefSta-I~ZayJ7 zzyp?r=D!Bd!{bb0t;~zr;XHuHluVZ_Sv0ubP0!&=^ncy{SM2|W{ol0z&+Pwm`~SlJ zzqJ3a{+Q5PPyJ`ze=7d7;Xj-H^UQyq`_BvidFel1OT}xccr6vLrQ)?zyq1dBQhENz z^iUB}&J!F8ali_Xn6t6N$!Ce~WRIL5j!@1I$43lSU5(`lacd}DNWgUEIWS#$0;X%< zB0X&o>1l#xOwgyvbCeG9)|iL8W?kdKWoNQyFb#6Pw${bb!O!WL#q@5fwJ<$kFD8@` zk1%2c^XZ=5>kshKBx)#|Ks+nIgvKP1PdhuQ#}u6lS_TLewnv?jhvS0R!;%P^4{((^ zO+=@Oe<7ote5@>2URU;@P>Q@FZXQubulVBhnxYel=NN6BiLm#(pJbSi$va<@tEc+6 zu74H%+t9yF{d=Z=&-L%c1pLTF^3;FU{iotT8~(HDKhONlIni!fsKhdl4+FmFy#XxZqlBjiD2Q(Ljp1C zcKB(b-Ni*mA+|6?!E1?$=A#h-EDlm%;stXwA-|kainNAWpD?E1KkMIb`uF=BbM32M z8_$9xMMjP1IsI?GHeS&kk%>Fa?(nJpt?OS!|2FR0K-vFw`(LsD8zPJ&guoz-h#9aJ z&Btzea>lyu&y#f2yoe@0e00d1MU~NZaV)fwV`BQ*e}0=o0@YqdP%mieBymq+I+O2H z-Vdx=^KpQ@E-b|68sY*Uj6D0awP?xTpoOq-ruJWfwYbP4D0wNo1A}dSHihzQIJWTG zov;W)-6aVD+gFCoUj8n%qW6ovE#)m+r%Rv(K<@tIuTL;JT@cWI*8QjAKO6qD=|9iR zX|kE%-mkEwil%blo~E+i&Vq3Ym|_i^LVw}4hv-rzlJR;W9i4=b58G{y4;Ru^j;fun zAmhdoyAmVh>l6Zzq#*Nv1}EeJ}wYt^f->JEO6(D9$1q zj8s^u6~b1Fl=xS?VX$*D8|heAX51#Ihc(*Eu>fn>mpBfE<$%T-L#$;4^+hb0 zFQ*sUK@D$Qb*;4$)2I}LNHVK3WioFP?G$^`APqTG?b<0eC*x+-)c7p^l%~dH9cQnm z!uv2cKF=&UsW)L_2p3nfW3IsOj2kXzdw$+B5li^^cC+Q9Vit@{Zl_!=SBpF z@5w+Yl){T{_#Vz<=RCm`0(8~Ov9n2w!+KPZXagIk6uwqjJhR*Bgl-nQ zr{jsc)vaS#1ZfLI5$4RU5qbYfWD_`qvnxrArpb$A&B|o8{c7?4#Q!DI0xHQ~s1%ep zst0GngEWHD_@NJ+kaDdtoN7T8EXph#yw{%syX54~;GjQ606h2NTkD4nBb;s97Ht>R zbAnLgKrx&?VZ_X5+ky88yDsJAN(rj)1WD(I=1IC%f=6i`Hygz^Md+Li3h8t~s%CZ+ zcb6ZeKbBsU=#*#POQCQW5vB;lXHnhLX~Ic_M^tZcJD5mdvbqt-_FHK5&i14tb!e*P z)Pmxa9lMYZfo)t&HFS}H%82(cHfOTg<2)9+iU~io!_Z_d2Vzp@_eUu#x_l2b3nGjq z081R=jPafM(4NV(>yb5ckjGYVQS&zhTT_`b-#ZFc>|kn;5qTT-za=sop9}9(TLzB1 z-fy-Whxa1z^Y6&O!X;idn{c5LmUl5HzVaKMEH}YF|4v_hgMKsUUEr?iL6H@z6Gw8r zf=0r&dCoVY7fQ2nD-DuHds)L5#w|=DTU|boQ}0F>4V=tVxf4JDh7CR6{VrT*(6noQ zp0KERoBuNWmw*0?q5?7?IFrX-u%aB`QBY?=6qZ(YmBiZ~ab-34{v{=UfC931y!>(Y zbTs)6NlTwsl^ns1N!o!NaPpZ+uJ+zoWjsc;2<^r_8KnZMEK1h8kV*I+y#YqqSY`Zw#u z0k(t$ZxoZ$XcF*>7xqud58bfbW*|H>Nyc1T5fUa4T7pvB98~WL*J+ina35hQh|IHo z*<3OWh^3Gju`u;HaLyiM7Q>?T#<@NXA5wvoRo=a#+D9ysa;;i4csUMQ7TQPu!fDl_1$WZ(tT3D;Kh5q}W!&iiAboet1y|H=l}^QJm|& z0ZLHbmeF1N&(|aN5;LbO4+H&#*vkYTEnp?cuRH{`3IByx@upiEyI0wAvi-cqId>$6GezGrd<^ERiIG6 zQk*J)qm6|U?noV$P(V>Dq>2h@lD6$J&SJTw(&ZR2p&4XCw!y?*p!nrL{p_X!t~`Ji z{3hP z`8phSfFi!Jm&)ombQx?5F~Br`&=JE`!s~{o>}(k$rEoRcE|}#iUQu|gNfBfXWjtgV zsa5Gr-lD4X+!W!39O#=IFKl5JX*cn!wNX394j5aTuRiXVws9>#{`j@++lrr3Qbg(b70vYP0iHf+u| zFj`?8m`1DL>akMs3y^-Sj8?ez>p@rK>#w38?u(cYUMz1f(~dwRYz~;RY<1ZdUm!6S zlG(RUdzG~$Qeyk5&QxHL_h->gob*D9FF1Ab%#5Tlr|Mif87YvvmN>n59f-#@;v{=s zyfcQ;WeF3=3KLaEP#LPDcJo|&IVgkZ6vA;jAuoc0Y40BHNAf|SI~E|toLK4h8_c;U zcsEOSm!zy;S4%}gr{FthaJ5 z$YSQ?*4+ENs!O1-Y$k;2#?)|e(j#~Yz5)Y0OYI<$D|`w7LWT8KiY0>DXw_gl@}RRQ z{3iB3ybg4;rVc&~dWF(xDs-K}{c(7WV~<2YmtV*8&1=sZ$(8x&F*Ef?-#*i@BRC=0wBy-87@oN%vs+pVy0q=_}>M7YdG^D5J(MQcbpIYbR3j9czq z(;D3EBsg8p*eM#{owxue$o;F?Q$f&Q&VcYKCZPYeat-wP_Xl5Z))TB1;aLs$Z-RdQ zecsK>QA03s(UyMTCl$_VQdv7Nc@kL035X=u7Tnif;5z{rp}pE9xz+SK-;_SO&Qk`K zYT}#OxtELDX7HGBh7fSq2XhF4QPv02$@sJo$u@1!_`5+*Y|3OBR5^39ezQfoj%U_W zuH~6_rPUEk;+-ZnfV`POzyxkNu=&Tc4jLcYzw(YO8ar8_Wb9JoAXiyv42|9F8lFUM zTWwy79Hz=d(a}~vFR+Sbfox?wX{aa~xfmVe4^CNhvFwaB!9_uq%ARRjV9oNaR+Z?} z99-H1*T?le>`c$_ZB_xNHk z4Lo#DrPwY|OP?UWtRoHhM?8FUhKn)-!oP%qA1n+CxG#3^L>eD%+=%KKUFH}5$`k-mg zJXSf+Akom!IPm`I6g!TK2F!N$Y(y1y%6?(cQ{8nV%?l%{t`j8WuGIy94ZM%EMI&yXJ?(5WAip+k=Eo zyDR0Kc%l&G?k^#)}%cu_78cB#a`2vr$)>yn#E&T8FD z%VC{Z&iml>qcb3uvFylNgwv0h^df$^<=rPCAnzd{Jj%KIcf=?v?AO02#|>`o3Okl> zuCn9#vB!a5#>*28o(!8?gENI@Kt3||yTR!+1?a;=@~$1>y(ea5z4DS3s3)_U$e$@Z ztjC8+eAtK&oAKdUe0UxoUc`r&@!{1UQ?kdTa`lQ&gaHUJ!T^M)jqGVNdwTWW!VhL@9YuUi;xR#(MY_$-L^v4LwmsggVN!PuB>-WIP&=l7->1<4{UEA`@PvCSI zV0z;|tih82Vj!kr@F;LcHBOPsvqQE%KVJ6;t+mGHN$sHiggx^KuF=pU>RMqB#XBXSW(~ivC~};CDl(hNuAd}#}hhv4OuzpuQ4eY;fgqhhZ?Z#XlT}M-SVTJj23c%3QlP217kX9pg~25b?0^L3`h!wbpW8 zM+6lr*h#;}1{9#OI3s|n36HM7u0A5P{+Q>0SU8#Ea}j*I(n6kJxLU|7jKJH&dLiTI zyh0zcTD6e-OP;&m=9Fq*0lW+OOL@L=3$<3^jT^1|f63pt$vfbuJiCtMNE~yVrlKeN zJX?}Nb!tg*^T#Sl+nmi0C;*}6VaEY``k;r00SD(Z#{pxFO-7ZZ$yO$oPO4%f3fa10 z#g+lTvGn}tg6Ob#Q}Kb&g%a0vY%W2lA0u>IIJqsH%s8zZb2D~pDX4)e9QpO@VME-N zc)g&r30yr-gQ8y?hfZB7YOGQa?{XmQNOmMC=*q+jjgVz7T!Y1#sgX>Z!Pm=3MV>SU zM+}C0g1H{Px|m99g3i|J#sV}O0q=TjG*Xqxg+3FB=X0_vE`L%SgH)Z1Ib4JoULrNV zg>V#p9BQr1a0Ks%$u8tid)2hL7Mgn3AKetGL%dGnY<7caq8IEGnWUB|uLwAU`NnUI ztW@D*-5H3RVa^x^$h?lim?Droiw%tRk>lNriLPjbfSFWa8Vp9FQeE6>59A==$`Ak; z$F+AsqKRA0kxCwPN|NyTc8Cpp8;8i#{tTUHR>j&FMDFSp?iulNl`4C;p3#JejHFy) zn_VPWsYbkt9A%}-eTX5p^Df>W`Db94J+K?djYuXpmmt@e1kM2HOoctCQ`w`bSKvKu zGPDmyEr#Uyh{{L`h>hk7F-v!ibyGg$SWNy@dO6sQV*&ATyfOw|Fds7_uA?($Hqv?1 zretYs+Cp|SJaQ@}wtunT4?PJ7J)jgtBu|%$sa=@YtBH}BBqrIK@TI9$Cve@xS4LP8 zyrGE4AdD-EZ`!y`%8ODtoSN*TVJ}unv?M4uM5KZR0zXQVqhprw1}S@Jw02W-E`i5V zaH-dU`Uq%vJtMD7m@g}vv8!|T7{{Ht6IyAlfFa&Ox*0i6*DFG4z!j*GuA6iaowSAH zsbB0o&aGm>YcPi|WZYX8K7lWBT9lK>I4qi91M))l%*gr0yO}y(ErrB6v~ap@O-%J+ z?Q>wm2q>=O%?mjb{+3%Nhs!Bp<6%FIq-{DWEesnG9r&ZU^* zd*XyiuH#&OPM@J0Tx@a4Wn1>Tk0n&yX3SyIoBGp4_yL`uV%lI8q&_|FS=bzz{D_A_ z_%f!+Vmk_7L^&8zmM3PZ#o|}A9}xNZs5&ukJL3$myx`r1>d-<~j>!P*>(G>RtweZYIo39EnK@1cVij|gyk{|> zD^+6l4(M7)F$;mB@)alaeiW^+&1eVDat$sOkhCdC1!9o-aELOAF0rla{jzhM3$aZ2 z-YjRP!xg;jUj{@T?XmGN>h@%-Mr*>4)*1{Jy_qaoY1_|CO-NTnzS-U^sq=J%#e*gY zM8bS0EHOvmaCW=U1P0Nd4=rs=*g15src&kO*Px7(RbI#dWS=O2!1Q=1Iro!JQK<;a z8d$!dY_5Nis?B!4N$Iwwv7JcFQGz2Z=~vTd>B0Sb=!~O@7Kuo|A%4JI@jI3l_n{X> z$P94UzU(Q6Z%h>sf5l;S;<*zr#N)DL?-`V(;bqdW&SEib+p4&k z>q8gkc2*yw%N-xA0GV~Qe;7x|d`1Q|WAa3b<;o*h>JZw9odCWZDA+NAhUZ`}T$pFW zQ94E8sEIZZbFtkRU7Vq9=T;*EdolGHK$CoMiZYepr>1 zi4jlOs`ixOpn)^-EHI=Gchuz=f;cxgR@jWDky!S)q*wRzBlPgjDasYoD)T!y1o4H5 zYm!U25iFNhWoMv$4q+E3TorTJmBE>-z`S@!!p`X?7g10qfXjY|=MaQgwX_^$2{BVW zlNGPf3|q8!1BzWs-|p4-jC%Ag>^3IYgP1?0N7O+MrtL`fl)h+u3?m!xWEAd@*2@R5 zYF*pprA-dZH8-k1%00U0#&HOu?>)iAm=n|eic6t*MV%!$hxfVU;SzmX(jdZevQ`Ah zG;7viyx9Ad_lL)lnK>8IMB>L2+<|oOf~%(O#rKDn%C#Hwg);7o-mjQUT0ga0b5@kE z3TaE!B5=J;zf!sZ#~`IEaBxiTS8~g7)*L7TZml%VI_B+FlWHw%U)}-x9=eIb_gm8Y z*sVOOpyU}KQ~LVm)9bL8PZx~(M5Fx6r|xqQ)4VhWco}L@iDXl$UB)AwFJB^ZTBt%P3zT%(#Lsb?G#>)4ZWpjbx+@Het#R!0tb z`P3=$K9MFy7pf$BBe-)xRx*OUGa9jCVIQKvHChJTtE<$Cx)yU!pcS{}Fe%2MmbFQb z4R)idXfYjLmXvaEOAQWV2REsuqQ^Ij{`VYvv&JS%(mb9C}p=788oghPcmY`I05|=C(dT! zOo(@!y)d#7s0S;VrV80Jn+xH5X2nL_k#?*foeWhi>jE<|>oS=!n}kQI##7Q9}1EZ|!s^_+_R4M>9mEDR$~i zvtTaha8ZGMG>!3cYoqn5>_BymQdJ^3;S*eI%6bz`d->EIgi1hPX(dobOv=!gPu(t) zL34r@T!iAsVn$eitVD>b?x_m_MGZlZ&Kn*A~me7oNg zPc)s|b2?ju(5~x1uq!1?aryTurgI&OqhiQ~1Ek9&sW zbqPcTH$Zva$JWYT8$TbsoAapf&$6lcZ#jwC7Y#B+`Bt}u3dxP1&gQOM`o#jp+fW~{ z&ezu=_|1gCItqe)X&hjsI!_M)c5^;S$%%rL@3Z*YGs8(VqjusIz6v^MCU#)`Tf<#U^` zctnvIiZ!E@V%SMQ=KMWAkRN*}v5dblJSYM{6fctOdX0KE_sq0Xaq5XOt+knH>gYZ?c zEIXujSqq*Ma`BRW2RxO|wU2s3i z2w+{Hw7{<%*ViBr{_MI+tHL6_+bQcXmWtOOn@dCdGT;L2R}4AE8q)AsPB2_f5s8qJ zlh*Z|paGEbzVwdYp2^zecJl0FOf^Z>=^6>-(vU`l#U$p5ic)f!H{=wH`r)IL1*}`+ zWK9|2)}3I+JU5jHOsRX0w%%494w9WD~xt3A3kKfQhI$XT^UPnjHNfn($ARbSbxA0_N#Hw`gKs{ zI%wlMX!APg8N}K5mH1uu_%VollFMZ(*B~3$Ae+}9&p@j8I`QI>4>f?%g^RMGzY)SB zaCKGmKQ>m_PH|~5u?P4P1RX=1y%r`8HXYjqd7J86+gI*x(i`aTv|fsvRQ8(uI9&6` zs-C>mBJG< zy?+amhn;kFb0adC=;|@6L%(hZIi5gGhZ~Fs_cV7M?wd&lw$l;Z(;^d$fx&Z>c_(tQ zp{!GI`^2=LS(T`PP%0mJ?KU7JkqmYFwr4Xj+?&Cci+zZZMOL8%!Vmh8u1@eI-@&Os zoU#~|fK*?RL(wP9_j{wd=(N$V4U<-dyr^Jd99`IjT4@SU)oRuImzh-e(ut)R?BKRD zUi7h%$7lv&$jiq*_ZB0G^ukXnFNmWd=Go|1I{&KTQ+-PuY6=iRJ!3YiZ`wp_wa&P@0o z87&Mp=nx~&{Zj+;G9DMK0@RYs?iRZ(wL1jsI4L`by;WvT*HgrQ479@swC zWB>|@nymr>pCW`!sThH@5a*kn-l#?GQYY0~kK4Ue5_C7`&I6_ler~xtCPLqki*8%!@VS7TE41-g z9HfeH#o_oZLQY@Ft#(B|(IpNjNmpDPEFYYc<^P~taA8!8)S^^qTKhxUKQ-;9pWkZ! zbA&l=`|bYX35cZY?ZG~Cjhu4;+^z`p0+ibMQ?uZt{}#T+b}LcM-Fn~lM<5PyK25rs z53ht}aG#zk*6#5~(S1s|L)%;cqwPeSx6<%JzTw5vsULn|)BA97 zGH57Jke8MdLv+Rf7zVf6>zrKea;QV@Kr~>p&;X1bB<)OOJt6ei5VMK^C3B4mxya1D zpl}Nv;s9+zlqIpCj#L7QcSg`}mBa+cCKTo!oY@48Lu%Sn#z*jIvQ{wXFcOAak3+K+7O;%*ml2SKoBJ_i z_%jl+-{_(h(74fwvPDrqGqXiAqvp_dEafm0d2s=(EwQL%KdTj-ke!eq7Ou;Y?5NUA zMSw?-mS9Y@dYQG939?yc9I+}M?FY2Q3d%;xcB{167o}@#;6Oz@3~uaF>4-u9GvW>n zgOt{fbsY1QPRxNfMp(1;#B}s4aY1?g#T8}m=1aqZQ-ZXJING=V!} zZBooiKtbLSDzBnl^J9*zE?v z(ZiCm4+fxd7}R{>`$<~{}hl~R2{2+j8X=ra)D?bLfZ$F$RHA&ca z=GdXSyh4X*tiqFUj9g$T+%Z?(!4MfQPMB0Y=86s{7f-Qi5)t_V0XrgiTYI4Me-v?J zs=u)k+EZj(9tN19I^H{u2DMiD*N}lMo7&+M?ht{M469q3%cT>7IPgNQyPXT~{Qd7- zshO^%s456pUo64(?19q>enNq9FlmnfZY)5N({u$b@D4g)7M?2%sA$#?>?7~tnJsQ! z-Y%{H)&L+))zT;&=jR%|z^YCJnDNt`%w*K;avKWw6VtacsQ!(tGRP;8j)?nYR$%to zfSU=pV;<17+WhdS(5$VwGoCD{@)JvRO)9zq#Q&Hy8Ibf=dd0Cz_Cw_(wPa~4AY*U5 zVtP@I+{Ok3i>N6jnY|_QPk5%CYI*QG+Iur^F{vuLmu;9Dp|uG)Op+Qv$Giuo?u@F{)LsyUJ_>ru zEQc9fEhikjU#e^Bg46duJa4pce0C4I?I0)b?fQk7jD-l83LBg5gM=jSSXAL;6bv;J! zWNHz@Ypq!v^9)h7h9saHJbj#1>wrR~bIgM|H<*w<8&g{T(~Tj3YjC=xe>& z*Lumyd3>!hP%*eNhZisoY%4j#aB5XYYAnJWBDc+|N76CBN|6UenK6+u@Ze$NO-SzD93+16&kD>_Nd7>);0G?%2F0;D=5%-3;hMLZkg4a% zukk2zpYeBQ2d$xIYUPxNTvvw4dU#G)RHA*jDp_iAqf4eXGQmPeC8fdC*&@~mTnsXD2# zXVGLJ;DTbB)CJyB_!2@qkAjU@HZG_%%EQK4fHi2wm7C(HfAM>iwv;t^88-82LM3P6+ zzL+`ncNzMqPFQz#)eXSU*0VQ^1B_#xkViTp9(QKS)vgG0D98^vlz7 za=o0al#?6fUp_U&&#cPUT)R%a;u(~TlKu$s^{fay(qWpMY&Zk%B^})Zq>Q%W_uga}@Rc_U*a;si_d8IAjZKrpFWy`{L!CI8kQIcc-XoQToH+;dn@;Y$+ zCSc_z;KohB&6|MFZUR2P3HahB;LDqUuP~41J(4`l?zYtm;_?@KB>yaX{m-*2f1bVZ z=h>Top8f34v!DNY_KQEye);FwuNLcsg263NoQIoeJZ;bGux}0643~_-@ltXuSN79F z;f-=~vz&ZZPChRub#qjqs+Z;DD zwv3mzWxPVTX`FsKZ}-1E%^%nE$4dUVkw0$ckI(YQ=lSD{{PAV}_zIT!^msHlLDEL! z1V4Hzg@5xL<~ck`Ff*2NwtzL2>AJAVe21nL7ucShjvV1KXsS%pwFHVY2E4JPQ=GAq zPI1P7PI1P7PI1P7PI1P7PI1P7PI1P7uaIUM3=kKNbGx_ZWE`+Q4ycR+HpT&)tGs+Aj>xa8r<O| zTXSx&ZR6H=HgC<5AM4F+dwy%qi(7ME-kM`0UKj$M&BDk~92L``pojC}lLkW50pNYF zjS~qc6T{x?{jx?Hvq7kAP=>d|nX0FwFx-<@1zXlOYbIP(QY{=`bH=KF9cd)&+_vKUV zeRVB7A0F-2caJ{qeyP9PI^12@KH7S}^X^N%wtu*{`(=GKq^q@~-JRpw!F%3be|!V* z&C$X8>X-GEkahgwX#2z7?)x3;mx-6mu(PxGq0Uf!S^tyzD>v6)Db*iSUVml0{>ptH_0WNX_e^4~x?3%Sk3Sta z_@`3ot?EBM)Q`XH)!x24uDySI@91D}kKbjp17i-2flDgYnSucVK0KsEF)~j?C1kFc z3z@F9gk+b}^WVa4&@Px}NsoCx7jseEU!3qEFQtPQL~zU#`VO3E&3#@mM(93>bTKcm z{ZWvAY5$Avf@9&U26}VX0H`LIUFAtNjrLU@m9$!rjN_Qjz20Gm-9-BqS0bG? zafdZa$rc?fooTpcVT3i$oakf5YwE^6!Zp94B$UDr7`HNOE=AmC8#0#j&tox@940q; zt2U-5&eWWA&e{=yD}6l8baKbvVYs-M=n~gjf@0};x-UlF9`9Um9N`X@sovblm8?V| zkmj`2t6-Apy~JZ$&U;p@b=gY9lvTEdV;I4}bu7)x8g%g+pVvY<2jkH2)z#9(awt;~ zec5KEpHZloI1uStfLQqqjAlQtz-InqJNYIYk64!h@1Bj?trT42aE5R~1#J@8-+ZRx z&^;P^o1qL1TNuj;p@*}Ny@nsli?BZJ>$NIRK1}HoKMaw*;o$rWuW1c-ANMo2=7HxP z$~DyRIRC)-%PeCDnMb`pYV?6ew42I?j(W3a6=LCQ=IKE_!(B*+FT+oUxHuMhQ+~?Z z5C<*qLSe1OOjQ~%lyD`o+eKuI{#H;6k4ov5&djO5QeB9cZ2mNr>a_Pu@u=oSsR~KC zY1oYs1BJ0+B<+=qhDAUYwmAaKP^_f^F|$`39~R7WC$FCoi#i}NCbHXFX+J~)>9dq9 zw#$dXH7|devBSabQ{##;)$+w%)KqgC8j|h`1L7-T8;@JBiK!I=)#O#tY~v5JX3yt# zK2h_>X7R)6CcA~6n^$|!Dav-?!4pS;#EDF#RYf9(hli}olXus*^ zFHw^@hMgpQ)kg z1QN{p#ey>NrwfIG0u0g5LO}NLNt{ilAx{4NIxt067wFB=| z3wWU*W*)^@ADzk`>8?J27Q{{|N79nLYXBynTiFlTjdgLZPTTrZ%&et$nX*+XQic0W z8cV2)V}QIV>}4dps6I)}cBF}~5ylvy#_IL_-R~Hkh3-~D*8txL*XjTh?331uMH&;` z>8!!DurQ`prZ}Z~TR?=HLa{J?s|FIfDk=vJU_Hpz8=e+$cjHD)ebCQ3cY9q>FbDiw z0g&!M2NeHQ*Z5Fsk3AFH@RTkIA%G10##$`$L~2f0h>>dZ$vtm8F+?d|-&6C!kWZS?cw<$H+wc&c7`*MQf}Vjnx@Vb!Y(&!Bh2D}d=Y59v6LAnb7s|Pogu@D$&5aPKk-oiP_oh?~f7OUsK{cdmeGk2y1S1k}b9yk_T z!CXp?8XWf1Nx<;=;P~s2Hk{zhZq<)>;#AE1di*&)XE#U6kE-CD#Th32P{5X)fsn)N zQUrr3eoKf}juaHU9gYdI|JLjjD5saa4$B1r^14z#^j|8F=e}MoWyHHfm>@ZeS#4Yi zt>;oX5tyt%cqx5!yWWfbTjN z8ypuo!HWOOkWCv5|bkxs=#g5c$IW@P!2p` zp0(47okH6lUG%5?kyg)q%iF?{#2|TIa3tiMFXyB2@3cI+G3C&m=$2-#gY-o%Y7hiV z(ihuuh;#tj&Zibng7XY^ugVN^2yUAeF@4!uE+4c^plkuA%*+Z*rRHW!P~EwNO7Sa4JZ5=M zpL9k8*HA3C%;IRx4IkpvV1BQJZ(-@w)WisBoeqolxAYy4yJ zFe=W(s3q`gWSVZuv{R)lfLIrIFCN(#`*l#W#l*zuQc4j5i&Y>ndiShkoJFSbOcrBaPqL%wogr`w%la%paF6F^K&XhB@L$x7{KwY z+%*!C1C!@M7Bq(EqMQZo3lJBz;Feu@lO*TGjn8OuT{_Gg>z3kCNb{=w#e4k`j{K*m zc8n_={iM@65oAZ@{HQ4`p+sD+gg*~i9YS3d6!EG7-c z=2{}dLyPkBlhpe-X8IKekz3HG5rWw`;9H3=yKndAsWo;*s0GeONaKVKhd_y3(T%6$ z=gva#`IdP1<&38AR1SWYD$_qh>XE$$A4q zTASh(ZtZT72*7ywxQH^WIDK#nTnbFGnKCIl;TGCW&fsmnZ46)zIf!T6 z>H|)SD45a_XFqh(zz=06Ef2v?xKu?20QYqwPQ&nvA0EK@lmxakhDhv~2Ef9WPW9ut zbKO28CP{D2_XcN;ZeYhaTVW^EeRpY1q^d-cNwHJlzDHBk`7mUe1{d4W5S&NAKxcGx|odH2DNj>W?q);Sk0U1AVxe=>LgzGGpc zcgwUc3yRRy$*B+v+G_@@oDnc5X`P`NgGccOB9rADv3fsV%YQiAIJZ!&Tq@i`0p+BKbhsqAG1SX5qiQ9qi={bM z3-fT(`-|L{z+U-*lh8WfOTfyUht{!M?ZZrv9T3^+K@>S0Aee|}WRXpWFT|DDE3!V( z>W%QK0JPWZp0$TW!Dqhrz-c|wHX zR=8^zBpx&-h=2ZdYxu9D{tu_U%bA8rvKB^uN}umZ{DZU5F+j<WTFARpQmx-oT z_9Li>T!jGl_rJRU16pW+*rp+JLD_|rL#MMiDLlJMZuctD5pdbZ6N#!+RMT15a3GmO z?d?n5f69$Ntt?|az+0PTB^hlzz?;{rf6XTZfh7Cqa6>;e_UUOOP zy|D;3(|Lap*LguXcEx>V-qp4iVi#ojvAfYq(Z1@yo^NOz%O~cxwD=E{7npV-23#d4 zb^F7G9R5)klP!L0w?7Y#H87=8?C zCDe!1N8A#r#dl4qH8^WG(a}C+#=ut*=oT zb}b+UjFS#zf}#rdQ0;x|N`WMDs^}?XXZtyR5USiap`* zLiiE5%K+S{hW8225I{!$0(4nOPK6voi$N3C1d4nheT4&pDK%)Jlw-=A%4VZ%l{uwl zEn9GbX%#q1&RD=!)?ziNmzGi_n;!%pRJ3>xl>mcT!>*qL+U z6x&J8f115P%u`T4sdN{~m#B<(#!mcn3PGawaw)}u6T_8CNk0|ix1P>66lFUcL7OWk zwCmb=zG%={G+||nu?XrtC~46k5Kx8%+9ptOdYEy;46ks;H1+_)tvBk>^Al z5LA^f074JJ{TJ(~Z+-Z5 zm@$ju=THhNxCvsD5Q<4N{zS&lo3sj1;}GTIqBmCAtR z)LRmq)5x9v$P{@ZvV_859=${mtHfQzds)C=zRPW<) zq4UDG<>^>5s{o2{i$`IcU8zzgC1VdoK^5(ixwzM8U5a6XZUt zNL_#mn+z%~%30FJv`g}Q>RakTtWv)@(^zF%E_5*=Eeix(1kzn*<%Hl+!*nJ^kS0@v zYCaXW9w+5?O{1~98cr6N@{)uvW2FkjrRqk;G`;@3)oWdUqrQF^c0MM3)gY4}|azm@R2F`K$` zanQT61cYpy9Lj;K3BZK+r(NtXv#z`;K3Vm&;&+Jm(`kR`%P&qyCW z^56=~v?0r2G2-#GV%6d#C&f)r$Sy-~NMYk6n;{iV5pL?dl@P|pF4hVg^K20Ynet6T zWS@^oYXh4w=qzuKdRHu=EDA3^F`^2CQwWporj#ZY?l=1mbEW6Z{UxL`n+@0^8dbcU1r3}o&KYDl0Hx&_=0_6@FBqbQrt63V3Kz#HX4T6X`# z$0MntTJdW4VecKTTfX%`EHiVA_KG+T;k(6euG*f(@+RmNVX}@&lGLDMS%_ ze39LqJ)R}uGKPN)a*Np?iG-QKi!!MkM;;H@0Of{;=ZqW@txhhFJm)qZUSq(;fV#Oc zGVvNBm>;;oYpw|yYx1$RYvb&LbyuGMC+sg|4|RO5 zc$W-EJlaeNU#tF2IQ9Qu>_;0v_2#(Bo>#+9g5 zVtR>5lML3y`i8*&E#+%7;i^;k8kvX;By%<#&+zIO%0eiMCdN`wna4NebHGyej+?(; zxf#5H!AFfV&NLt!$sjXf?nu9qRkzqlkFyMOD=bCgEu$|VKRjTQsvX?S3(xm%)yO^bO3Wblj2f{9kwMcx@t&$Ju~$eGgxwG?8Zp%E8< zMbzA&gsD_r?`xc}#{0MF?D6-B6u?H+A-1i~jV{HIcM}f4rC(=Z>V8GX&Wt3jxu6Vp zo^hcW88~D1o{pv0$I_Lt^u}0vb1eOAg0N^TwtE=d^m~^%PX>1qoM%|+h7mRfSuCWL zd`L1FfGK20I3Ci)8rcE1pwnMOvw3f3{|l)M^avHa!*twy{27FAP< z|A{M>FafqZkgV&#do6B9#9RX_Vm@x{OL#y?q$bKVgvJ%&2$9&_Q8FSCwlA5Z?W^At z6znpS%6*Ex-1M2Th3awUfugmJs(Z%dbdNPXYtQx3#Rax+X-52MmSt}Bh!wxrvv{BB zGK)Am#%fzcBQp)ApzM$k`9pKioHBP-jr5E?NtE8N`?H%;=L{b0qmnEzNMICTz)hN3vMOl^$%Sc-qO z)X$fQ%QY2eM25Lia{0s*IZTl?P;>b2_EE6}W<&<-3}xhs=+5Hc{*TvqYB;dKS4;6G zq=d>hiJwL3H+U=~7)o{D`ib18k7FGszIk5E{5LXP^@Z{CxW~UJOorBfJX)}Dhg2P| zY@s_Cq2-aRD>SC0HnP+sWH_nho<#BXiSSVP!Z;WCovp3yZ5BvmR+My3g&hsKcw71u z%`Aju3^MDE5~C9^?0h!$U(@xWRf^i%UGw<$4NvbU4>K~jgQBNENBo+R@m#Ugui0sC zf@e+g>f!HLyoaD}qm!-hSyl-8$Y|DL2_s-1j zilijlzxXXh>fj7zYDr2y-s|TF0w9GI2yjuLB>J!4&o?5nDhmMB{R@eT%&N-DjEp-X zUC@c5mW)KJKdFlfF^t`}$)Ey*OLndYK%5d{_m9~OwMIm;{6Ta1#pk*h9kEXzdoPW7 z34?%pjY9-uKeNPO7RvkCTGblz0^Vfq)`b=kTBD!E%2+=gV3DaGq7vr6LWo!D0-t0C zKMs4&uhwf<8?~#=zu&Fi5;8#y>XOIv#N@3hXUs^M_yT8^p3w)Jr;DbX7gK$90%9eS zNJU^x)hGZ1)PsW1b8=btJLqsrqUSNL`)Uvv+DE* zlJ2H4HTf;`32b`$LJ7Ca8+ed$7ua__Grj__f~^o%ER~4(82hR)+m>zPwZ<1ukrB#NbPw4Y^uzZ6gx^Auu|e zOr7Z5GYoRq`SG;Zn&ID$*KYh`bS+$i^2MN=5v?2ikf<_udVT?}A%vr0XIln$3No;? zh{kEbxhRDEPIV>GGC814+@e7(SFa1`%sCH4kRG-_(iPMUc#&72BW# zMb(9fTP!%bP|n_4O=VewwzbnFPUBVmBt|9VtJ&@ zF$Yx-z(52V6R25~-Qp=_(=Xv~I)C(M*51ByYv?F&vkE>!qlrB2f|wu*09UneXYATE z7da+4o@wizb{DE znA|Bni$2J>c^{3tSQ>?V)&&gy=I{w$fJ=OGkMuq!=>-S`|B(?WIYH&bax!;LFuBV>iH|)93%|3Q&(G~P_|(*J7M1LJ>N@;+2Q8;+8AW(>8rmK z6Ia&1yhNRvZLlrdbge1mAQFhCF@`#tHWs|7F|XdxA{?Q z&DPw5MPYJ5x6jY*OH8-*ygac%U&6Z+q2dLL;j~I@VmYoMeSQqhWr9fSR-7=7sy7GD z1QWI_y&u#8pOH}B{*0vF_L_ysBWhW=x>NtwHNE-Ypm@yNAmt{e)7}n|8af~6B2C4F z7Z`1srwdn@g`M$bJY#p~_F4bEMen<1fvwXkPMBL*jrfWg^_PrxAN74PCPo5`Z8!E@Y+XV3)|8prE6UkMGbTh-72T zuca>lO0gWN_|~HFaN-QZ&%ct{PXmMy#a7a`_8n3ZtYVgPRg_)Y#1ywS$@sBQ0xhJC z8Arx;V*_hEuQ@5N=B!b)63fV}n&S60xinN+j(K9!NKWOW6=Larg(vLM^jT6q-jU$T zQC~>LeuH%Ff;{+;gk?35B595+wq=0fCg-v!E3Ck!qeF%Od4RuUL@%64z?sbG=!6i^ z(yO3_iK@Utw-EyIk+iaBFaoV6-ZH#m2(=1C)K^L5L8@}A6ni{8_!0_o@K3mbkR5l^ z!BL9&#y3^>YhaZ#kqDlaqQ&>Fj_i^q-7t}C?tLk-GD)zOveP+Ca)^yo_8gt~R zYHV$*GCMP#mM&2GB&n~2BOWtxa&RZm&lL!UU;&&;4FIQ25F)sze{jT78rwM64ryL0 zLPDQ70lf9GQ`~sl8mRfYf9(qY{2U5*!lKmwNg%?K6c%0(C_AtnV>TNM<}PsGd=@kDGTUhA`;iLn6Q1&F^kS7l6pH$^{q6Miu+>5+oyK+ zXAN9weJirJa9-a#5?|PE+ElSVKdMk#c}7?8D{Q48dWJnqzURc8SRu)XXDrl%n;xlP z6hs~=GZQ|z-qgN(Fzt;TzEb{LFMn;6zc%er>k}Wf?vF~habil`#$hStuk21fbJmb!6eiH!@ZCF6<9H^T=Cy&7L z6Sp#m4)Ai7#(+**MK}mLEuWA^BFr5d9)iO;;`=4NL*1|^vDe)npFRDh{7JY6Wkoax zt%svoS3?((ymy^*QY?5V7KOb&seipwX6+|zLSXi@&Or5PeH`{*j)hALL5R0cmy^xJ zCL6HW3lC?kA1_Vh0j2H2>u6px*mb{Pz5K~A0r6r*%!TFN2AQVX&D#g`Vlk{&Qk1z% z{%B%9$vZDR_KiO5_Cux1*sAjsBJlDYYwju`DLjDL_GD&5Q(sR*U>cH;C5E8w?5)@r zy+#s-SyRzOYM8l0BZb`Ntq1+HS_2~Ok8gg&zgRf z*JIOFZ(q(>E<WG}whgoTW zi=F1oAt2Mc<=ZPR{ArBEnyR^93`kl4+=7w>DiaxqYN9Fvk20BEG?v)I)YTf$uAnpu z)<$oXa+Bv@11-m(pWup*|_zaCnX zU*0)aUP!5=TXz%omJ1W|^(8@5mb$4@jPaV{9fXvLlKi4#91)2pq$}^#st9E}Yyz)S zBg8J7(Ey-r6JO7SRQ+NAyl?DtRQpgtwTOs}YD#u!JW9pXTYhx;vF7p(+jINXYhHH3 zP8qB?(2_$nm&I=n#zE`jpp9|R<~Zo#IOx$h=QG8T{R3@b|YTe&zau zE8y!_z&EadZ(ad^IPdS35De8W&J_@ za=m`JQNP@*UnaaSlRc_!m4VW>%0OvbWuUaJGSGy_r)`z>O4}*}rEQgg(zeP#X>1xF#^db5ZSxw z=CM))p~NA+P~^MWHc4f-6{JHhM60F)eT>(URn>+8C7sHj8z!#+-f^HY!i#grC$(yt zaxlc;j`|l(923faG&5>aJX6`CBw=DzF5U&6Xe6@C{L!DC>7nKy--cOi!^%(bT7{OI zy*HH-keKslf53#+|3oA~m{q6Hsmu7Vm=5WpC?ZXD3Cfp1)E{cTTlQxoEi+#>`nWM5 z*o8`Nk%1CgXP|`E87QH321;n1ff8D0poG>LD4}%*N@$&d5?W`V60LLCdd&Eq$}FK8 zpI!9I>Im%PPqu#g-i=S*yZOo1ho5YH^vTx8pKSd$?HThZ=#x#;3+y%{YdFCR&PWe? zjI>&L$LUN^sqacRJ}6`uF+Ig7ARKSC@R%U%Nd!`^7mw+-Bpi95Ibw)f5CwCqy>+-KU=WXPw_F6e=o`n=;dNh3}fjORcfQ|FodFOq9c!Q7DPP@@-f6)Ki zjhGgf*UE{RYDIL%LcIgh-BYSQ9#|eN7czso+OgJessbf+F%wa#(%Mpii_kDiv(bwA zCN<$Wgb?`9pRN~pu^TPr@Lr&*7hlj~o;&xP;Dt07w>3^-zBY||3j4MFm}#nDm;GEA zP`Mi=Qc4*?mMSx5NttqKON1p|&l5(J$D~A}QrON0zPhJ^Y6tD&32Jv(eQzpntlWec zsyZjc(cyZao@A0f3|EAinz3D*j)m{aqx*aprNG!1+PQpERHg8IB8F?KhJxWukx~GK zd$9uy98%;yEJQ`JBa5KCrYP6p3eia@DeKy=|7zp-j2bwG7=s~*(@r0&)4#$#JOK+R)!(<6lO*RAvV&GDhY$L>l(4Pt>D zfC>a9sn-q;XkMbB5)|VU5Dy`Nb?p{9zkjdUrKsU0vy)8;cBzB5Zv~4eE{^&y2=RL< zk*e$zrGWQdy?PVO%V)B5{IxVQ%$hS(Kg*;f#mzA&j7j zC$hi>gtdz%Vvh->YHd|if1?Q8@%O@`rITc$IWOiEgYlCcY+O9FqSE~jXNdknh_6A6pe~|Je6Sa0eYK0A1HnUZ za`HGJ)X~!N1|^%u#$66?PJzlq6(5PBK-2R}o?&1zKgyr$)z6LU=VtZuVfFJ-_49G{ z^V{m@ch%4D|IVoVZR-!R-|N}$jlV;0Aq#f;hESyV#x~jg-TlM+=pXQzL2>`5x9#42 z$c`sqtqd*v;uVaj8|ef$$EHpbN(%k?hWpsYa^7zj=6hq3VGCk%q0liLSd=fA7Ul-> z503PLf`|Gq(N-c6KfT%scwhtm6EW7q&UqK#J8>Tg`sA_{m!RH%{zrY39{ZOoI@xn2 z$5}-X_KL(JBWbdh;u{s^l-FEC#3U+=7(zdk8{uA}puqzEfDn{jt`Z*FE5Nz734jPj zcq8Nf0~IETBYv0`JD$M{2&yo(|57;5rLfJnV_(tw38cjx@`%LGlr_ciKx=< zYKDX9<3Iz$Tf>_I@jS8*3~1g)zo~}oM}49BJ;ebNS76)I`p4eZvllb4u4l7r5(>1V z?G}$gP!F)Bx>yWtBe`o9hY|Z0p5~cG59VNwexfn*$hej0DMvbFN?Ul5&<#n+RPVOQ zpOT8D{j)4L9H>>&^=^%NVn7iD0WD`yXu8%q=M#U1*zJnWFwy z{PM`s{{6v`+^fiiWvffq8&*VM{+MmHm2!J$-bx&?i1b^Y7H!iORg1Rx2!db;+2TWr z&-E*Z6R1kPMF_Hg-MH}v{ zh&H(<@2sOeSj#&lBm~7wR4$|Aln-DEDVT>+uiSgT)(XlmaueF-Dd~B)I3gmokxz@F z^c#LR=-)gtpdJ-Ds`=GMt!DXK0Bk&ryEoh#ZJ_D)+yre42}*yq<0K zdly63ch@|$IH{K&biH6fX<}g(gS{|_!cBfTQ@|qqCyT4Mm2?N%3DZ)lW~UW=y0En@ zDT&ZmOfMp8=#7lzLH|^Sc4|WzL&Wyu2r`O&D@)D<@G?@kG7kC75dR^}rd}c)48pWS z1kh@8JZg36JfTOtW0tkIbPP;ks}YP9`s~vJJIifmnMi>SaaOHMRx71gd9jk#Z#RfIPA%IZ|5AQI9uiQBL^!(@ #-6%43Bf5M0Dn%?|!GQlwoMr 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

j@O6e-rn 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 list: def read_boolean_array(self, length: int = None) -> List[bool]: return self.read_array_struct("?", length) + def read_u_byte_array(self, length: int = None) -> List[int]: + return self.read_array_struct("B", length) + def read_u_short_array(self, length: int = None) -> List[int]: return self.read_array_struct("h", length) @@ -221,6 +224,12 @@ def read_int_array(self, length: int = None) -> List[int]: def read_u_int_array(self, length: int = None) -> List[int]: return self.read_array_struct("I", length) + def read_long_array(self, length: int = None) -> List[int]: + return self.read_array_struct("q", length) + + def read_u_long_array(self, length: int = None) -> List[int]: + return self.read_array_struct("Q", length) + def read_u_int_array_array(self, length: int = None) -> List[List[int]]: return self.read_array( self.read_u_int_array, length if length is not None else self.read_int() @@ -229,6 +238,9 @@ def read_u_int_array_array(self, length: int = None) -> List[List[int]]: def read_float_array(self, length: int = None) -> List[float]: return self.read_array_struct("f", length) + def read_double_array(self, length: int = None) -> List[float]: + return self.read_array_struct("d", length) + def read_string_array(self) -> List[str]: return self.read_array(self.read_aligned_string, self.read_int()) diff --git a/generators/ClassesGenerator.py b/generators/ClassesGenerator.py new file mode 100644 index 00000000..a58578a8 --- /dev/null +++ b/generators/ClassesGenerator.py @@ -0,0 +1,346 @@ +"""Generates the classes for the UnityPy objects from the TypeTree of the TPK files.""" + +from __future__ import annotations +from dataclasses import dataclass, field +import os +import sys +from typing import Dict, Set, Optional, Tuple, List + +# small hack to import UnityPy from the parent directory instead of the installed package +ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +sys.path.append(ROOT) +from UnityPy.helpers.Tpk import TPKTYPETREE, TpkUnityNode # noqa: E402 +from UnityPy.helpers.TypeTreeHelper import clean_name # noqa: E402 + +NODES = TPKTYPETREE.NodeBuffer.Nodes +STRINGS = TPKTYPETREE.StringBuffer.Strings + +BASE_TYPE_MAP = { + "char": "str", + "short": "int", + "int": "int", + "long long": "int", + "unsigned short": "int", + "unsigned int": "int", + "unsigned long long": "int", + "UInt8": "int", + "UInt16": "int", + "UInt32": "int", + "UInt64": "int", + "SInt8": "int", + "SInt16": "int", + "SInt32": "int", + "SInt64": "int", + "Type*": "int", + "FileSize": "int", + "float": "float", + "double": "float", + "bool": "bool", + "string": "str", + "TypelessData": "bytes", +} + +# LIST_BASE_TYPE_MAP = { +# "short": "np.int16", +# "int": "np.int32", +# "long long": "np.int64", +# "unsigned short": "np.uint16", +# "unsigned int": "np.uint32", +# "unsigned long long": "np.int64", +# "UInt8": "np.uint8", +# "UInt16": "np.uint16", +# "UInt32": "np.uint32", +# "UInt64": "np.uint64", +# "SInt8": "np.int8", +# "SInt16": "npt.int16", +# "SInt32": "np.int32", +# "SInt64": "np.int64", +# "Type*": "np.uint32", +# "FileSize": "np.uint64", +# "float": "np.float32", +# "double": "np.float64", +# "bool": "np.bool", +# } + +MATH_CLASSES = { + "ColorRGBA", + "Matrix3x4f", + "Matrix4x4f", + "Quaternionf", + "Vector2f", + "Vector3f", + "Vector4f", + "float3", + "float4", +} + +FORBIDDEN_CLASSES = {"bool", "float", "int", "void"} | MATH_CLASSES + +CLASS_CACHE_ID: Dict[Tuple[int, str], NodeClass] = {} +CLASS_CACHE_NAME: Dict[str, NodeClass] = {} +TYPE_CACHE: Dict[int, str] = {} + + +@dataclass +class NodeClassField: + ids: Set[int] + name: str + types: Set[str] = field(default_factory=set) + optional: bool = True + + def generate_str(self) -> str: + if len(self.types) == 1: + typ = next(iter(self.types)) + else: + typ = f"Union[{', '.join(self.types)}]" + + if self.optional: + return f" {self.clean_name}: Optional[{typ}] = None" + else: + return f" {self.clean_name}: {typ}" + + @property + def clean_name(self) -> str: + return clean_name(self.name) + + +@dataclass +class NodeClass: + ids: Set[int] + name: str + aliases: Set[str] = field(default_factory=set) + fields: Dict[str, NodeClassField] = field(default_factory=dict) + field_ids: Set[int] = field(default_factory=set) + key_fields: Set[str] = field(default_factory=set) + abstract: bool = False + base: Optional[str] = None + + @staticmethod + def sort_fields(field: NodeClassField) -> Tuple[bool, str]: + return (field.optional, field.clean_name) + + def generate_str(self) -> str: + # order fields by 1. non-optional>optional, 2. name + parents: List[str] = [] + + if self.base: + parents.append(self.base) + + if self.abstract: + parents.append("ABC") + + parentsString = f"({', '.join(parents)})" if parents else "" + + if len(self.fields) == 0: + field_strings = [" pass"] + else: + field_strings = map( + NodeClassField.generate_str, + sorted(self.fields.values(), key=NodeClass.sort_fields), + ) + return "\n".join( + [ + "@define(kw_only=True, slots=False)", + f"class {self.name}{parentsString}:", + *field_strings, + ] + ) + + +def implement_node_class( + node_id: int, + node: Optional[TpkUnityNode] = None, + override_name: Optional[str] = None, +) -> NodeClass: + if node is None: + node = NODES[node_id] + cls_name = override_name or STRINGS[node.TypeName] + + cls = CLASS_CACHE_ID.get((node_id, cls_name)) + if cls is not None: + return cls + + cls = CLASS_CACHE_NAME.get(cls_name) + first_impl = False + if cls is None: + first_impl = True + cls = NodeClass(ids={node_id}, name=cls_name) + CLASS_CACHE_NAME[cls_name] = cls + else: + cls.ids.add(node_id) + + CLASS_CACHE_ID[(node_id, cls_name)] = cls + if override_name and override_name != STRINGS[node.TypeName]: + cls.aliases.add(STRINGS[node.TypeName]) + + field_names: Set[str] = set() + for subnode_id in node.SubNodes: + subnode = NODES[subnode_id] + # TEST1 + # subname = clean_name(STRINGS[subnode.Name]) + subname = STRINGS[subnode.Name] + + field_names.add(subname) + + if subnode_id in cls.field_ids: + continue + + field = cls.fields.get(subname) + if field is None: + field = NodeClassField({subnode_id}, subname) + cls.fields[subname] = field + else: + field.ids.add(subnode_id) + + field_type = generate_field_type(subnode_id, subnode) + field.types.add(field_type) + + cls.field_ids |= set(node.SubNodes) + + if first_impl: + cls.key_fields = set(cls.fields.keys()) + for field in cls.fields.values(): + field.optional = False + else: + deprecated_field_names = cls.key_fields - field_names + cls.key_fields -= deprecated_field_names + for deprecated_name in deprecated_field_names: + cls.fields[deprecated_name].optional = True + + return cls + + +def generate_field_type(node_id: int, node: Optional[TpkUnityNode] = None) -> str: + res = TYPE_CACHE.get(node_id) + if res is not None: + return res + + if node is None: + node = NODES[node_id] + + typename = STRINGS[node.TypeName] + + py_typ = BASE_TYPE_MAP.get(typename) + if py_typ: + res = py_typ + + elif typename == "pair": + # Children: + # Typ1 first + # Typ2 second + typ1 = generate_field_type(node.SubNodes[0]) + typ2 = generate_field_type(node.SubNodes[1]) + res = f"Tuple[{typ1}, {typ2}]" + + elif typename.startswith("PPtr<"): + res = typename.replace("<", "[").replace(">", "]") + + else: + # map & vector + subnode0 = NODES[node.SubNodes[0]] if len(node.SubNodes) > 0 else None + if subnode0 and STRINGS[subnode0.TypeName] == "Array": + # Children: + # Array Array + # SInt32 size + # Typ data + subtype_node = NODES[subnode0.SubNodes[1]] + subtype_name = STRINGS[subtype_node.TypeName] + if subtype_name in BASE_TYPE_MAP: + res = f"List[{BASE_TYPE_MAP[subtype_name]}]" + else: + res = f"List[{generate_field_type(subnode0.SubNodes[1], subtype_node)}]" + else: + # custom class + implement_node_class(node_id, node) + res = typename + + TYPE_CACHE[node_id] = res + return res + + +def main(): + main_classes: Set[str] = set() + deps: Dict[str, List[str]] = {} + + for _class_id, class_info in TPKTYPETREE.ClassInformation.items(): + abstract = True + base = None + cls_name: Optional[str] = None + + for _version, unity_class in class_info.Classes: + if unity_class is None: + continue + cls_name = STRINGS[unity_class.Name] + base = STRINGS[unity_class.Base] + + if unity_class.ReleaseRootNode is not None: + abstract = False + cls = implement_node_class( + unity_class.ReleaseRootNode, override_name=cls_name + ) + cls.base = base + + if isinstance(cls_name, str): + if abstract: + CLASS_CACHE_NAME[cls_name] = NodeClass( + {0}, name=cls_name, base=base, abstract=True + ) + + main_classes.add(cls_name) + if base: + if base in deps: + deps[base].append(cls_name) + else: + deps[base] = [cls_name] + + CLASS_CACHE_NAME.pop("Object") + sorted_classes: List[str] = [] + + stack = [*sorted(deps.pop("Object"))] + while stack: + cls_name = stack.pop(0) + sorted_classes.append(cls_name) + if cls_name in deps: + stack = sorted(deps.pop(cls_name)) + stack + + sorted_classes += sorted( + set(CLASS_CACHE_NAME.keys()) - set(sorted_classes) - FORBIDDEN_CLASSES + ) + i = 0 + names = set() + while i < len(sorted_classes): + name = sorted_classes[i] + if name in names: + sorted_classes.pop(i) + else: + names.add(name) + i += 1 + + fp = os.path.join(ROOT, "UnityPy", "classes", "generated.py") + with open(fp, "wt", encoding="utf8") as f: + f.write("#type: ignore\n") + f.write("from __future__ import annotations\n") + f.write("from abc import ABC\n") + f.write("from attrs import define\n") + f.write("from typing import List, Optional, Tuple, Union\n\n") + f.write(f"from .math import {', '.join(MATH_CLASSES)}\n") + f.write("from .Object import Object\n") + f.write("from .PPtr import PPtr\n") + f.write("\n\n") + + f.write( + "\n\n".join( + cls.generate_str() + for cls in map(CLASS_CACHE_NAME.__getitem__, sorted_classes) + ) + ) + f.write("\n") + + +if __name__ == "__main__": + import time + + t1 = time.time_ns() + main() + t2 = time.time_ns() + print(t2 - t1 / 10**9) From f51a7f2acc465facb7ac2b04cbd32b172bef1602 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Thu, 12 Sep 2024 16:45:43 +0200 Subject: [PATCH 068/403] Mesh.c - use buffer interface --- UnityPyBoost/Mesh.c | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/UnityPyBoost/Mesh.c b/UnityPyBoost/Mesh.c index 0eb618fe..d2bd08dd 100644 --- a/UnityPyBoost/Mesh.c +++ b/UnityPyBoost/Mesh.c @@ -27,6 +27,8 @@ PyObject *unpack_vertexdata(PyObject *self, PyObject *args) uint32_t m_VertexCount; uint8_t swap; // char format; + PyObject *vertexDataPy; + Py_buffer vertexDataView; uint8_t *vertexData; // m_VertexData.m_DataSize uint32_t m_StreamOffset; uint32_t m_StreamStride; @@ -34,9 +36,24 @@ PyObject *unpack_vertexdata(PyObject *self, PyObject *args) uint32_t m_ChannelDimension; Py_ssize_t vertexDataSize; - if (!PyArg_ParseTuple(args, "y#iIIIIIb", &vertexData, &vertexDataSize, &componentByteSize, &m_VertexCount, &m_StreamOffset, &m_StreamStride, &m_ChannelOffset, &m_ChannelDimension, &swap)) + if (!PyArg_ParseTuple(args, "OiIIIIIb", &vertexDataPy, &componentByteSize, &m_VertexCount, &m_StreamOffset, &m_StreamStride, &m_ChannelOffset, &m_ChannelDimension, &swap)) return NULL; + // check type of src + if (!PyObject_CheckBuffer(vertexDataPy)) + { + PyErr_SetString(PyExc_TypeError, "src must be of a type that supports the buffer protocol"); + return NULL; + } + // get buffer from src + if (PyObject_GetBuffer(vertexDataPy, &vertexDataView, PyBUF_SIMPLE) == -1) + { + PyErr_SetString(PyExc_ValueError, "Failed to get buffer from src"); + return NULL; + } + vertexData = (uint8_t *)vertexDataView.buf; + vertexDataSize = vertexDataView.len; + Py_ssize_t componentBytesLength = m_VertexCount * m_ChannelDimension * componentByteSize; uint8_t *componentBytes = (uint8_t *)PyMem_Malloc(componentBytesLength + 1); componentBytes[componentBytesLength] = 0; @@ -45,6 +62,7 @@ PyObject *unpack_vertexdata(PyObject *self, PyObject *args) uint32_t maxVertexDataAccess = (m_VertexCount - 1) * m_StreamStride + m_ChannelOffset + m_StreamOffset + componentByteSize * (m_ChannelDimension - 1) + componentByteSize; if (maxVertexDataAccess > vertexDataSize) { + PyBuffer_Release(&vertexDataView); PyErr_SetString(PyExc_ValueError, "Vertex data access out of bounds"); return NULL; } @@ -83,6 +101,7 @@ PyObject *unpack_vertexdata(PyObject *self, PyObject *args) PyObject *res = PyByteArray_FromStringAndSize(componentBytes, componentBytesLength); PyMem_Free(componentBytes); + PyBuffer_Release(&vertexDataView); return res; // fast enough in Python From e54332311b58e55c0318e9e3f320a304678a7b62 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Thu, 12 Sep 2024 16:46:25 +0200 Subject: [PATCH 069/403] SpriterHelper - update and add support for tight with uv usage --- UnityPy/export/SpriteHelper.py | 308 ++++++++++++++++++++++++++------- 1 file changed, 244 insertions(+), 64 deletions(-) diff --git a/UnityPy/export/SpriteHelper.py b/UnityPy/export/SpriteHelper.py index 9602e9a3..a5f32709 100644 --- a/UnityPy/export/SpriteHelper.py +++ b/UnityPy/export/SpriteHelper.py @@ -1,10 +1,33 @@ -from enum import IntEnum, IntFlag - from PIL import Image, ImageDraw from .Texture2DConverter import get_image_from_texture2d -from ..enums import ClassIDType, SpritePackingMode, SpritePackingRotation -from ..streams import EndianBinaryReader +from ..enums import ( + ClassIDType, + SpritePackingMode, + SpritePackingRotation, + SpriteMeshType, +) + +from ..helpers.MeshHelper import MeshHandler +from typing import Tuple, TYPE_CHECKING + +if TYPE_CHECKING: + from ..classes.generated import Sprite + + +class SpriteSettings: + packed: bool + packingMode: SpritePackingMode + packingRotation: SpritePackingRotation + meshType: SpriteMeshType + + def __init__(self, settings_raw): + self.settingsRaw = settings_raw + self.packed = bool(self.settingsRaw & 1) # 1 + self.packingMode = SpritePackingMode((self.settingsRaw >> 1) & 1) # 1 + self.packingRotation = SpritePackingRotation((self.settingsRaw >> 2) & 0xF) # 4 + self.meshType = SpriteMeshType((self.settingsRaw >> 6) & 1) # 1 + # rest of the bits are reserved def get_image(sprite, texture, alpha_texture) -> Image.Image: @@ -29,7 +52,7 @@ def get_image(sprite, texture, alpha_texture) -> Image.Image: return sprite.assets_file._cache[cache_id] -def get_image_from_sprite(m_Sprite) -> Image.Image: +def get_image_from_sprite(m_Sprite: "Sprite") -> Image.Image: atlas = None if getattr(m_Sprite, "m_SpriteAtlas", None): atlas = m_Sprite.m_SpriteAtlas.read() @@ -38,12 +61,16 @@ def get_image_from_sprite(m_Sprite) -> Image.Image: for obj in m_Sprite.assets_file.objects.values(): if obj.type == ClassIDType.SpriteAtlas: atlas = obj.read() - if atlas.name == m_Sprite.m_AtlasTags[0]: + if atlas.m_Name == m_Sprite.m_AtlasTags[0]: break atlas = None if atlas: - sprite_atlas_data = atlas.m_RenderDataMap[m_Sprite.m_RenderDataKey] + sprite_atlas_data = next( + value + for key, value in atlas.m_RenderDataMap + if key == m_Sprite.m_RenderDataKey + ) else: sprite_atlas_data = m_Sprite.m_RD @@ -63,6 +90,7 @@ def get_image_from_sprite(m_Sprite) -> Image.Image: ) ) + settings_raw = SpriteSettings(settings_raw) if settings_raw.packed == 1: rotation = settings_raw.packingRotation if rotation == SpritePackingRotation.kSPRFlipHorizontal: @@ -76,74 +104,226 @@ def get_image_from_sprite(m_Sprite) -> Image.Image: # spriteImage.RotateFlip(RotateFlipType.Rotate180FlipNone) elif rotation == SpritePackingRotation.kSPRRotate90: sprite_image = sprite_image.transpose(Image.ROTATE_270) - # spriteImage.RotateFlip(RotateFlipType.Rotate270FlipNone) + # spriteImage.RotateFlip(RotateFlipType.Rotate270FlipNone) if settings_raw.packingMode == SpritePackingMode.kSPMTight: - # Tight - - # create mask to keep only the polygon - mask = Image.new("1", sprite_image.size, color=0) - draw = ImageDraw.ImageDraw(mask) - for triangle in get_triangles(m_Sprite): - draw.polygon(triangle, fill=1) - - # apply the mask - if sprite_image.mode == "RGBA": - # the image already has an alpha channel, - # so we have to use composite to keep it - empty_img = Image.new(sprite_image.mode, sprite_image.size, color=0) - sprite_image = Image.composite(sprite_image, empty_img, mask) + mesh = MeshHandler(m_Sprite.m_RD, m_Sprite.object_reader.version) + mesh.process() + + if any(u or v for u, v in mesh.m_UV0): + # copy triangles from mesh + sprite_image = render_sprite_mesh(m_Sprite, mesh, original_image) else: - # add mask as alpha-channel to keep the polygon clean - sprite_image.putalpha(mask) + # create mask to keep only the polygon + sprite_image = mask_sprite(m_Sprite, mesh, sprite_image) return sprite_image.transpose(Image.FLIP_TOP_BOTTOM) -def get_triangles(m_Sprite): - """ - returns the triangles of the sprite polygon - """ - m_RD = m_Sprite.m_RD - - # read the raw points - points = [] - if hasattr(m_RD, "vertices"): # 5.6 down - vertices = [v.pos for v in m_RD.vertices] - points = [vertices[index] for index in m_RD.indices] - else: # 5.6 and up - m_Channel = m_RD.m_VertexData.m_Channels[0] # kShaderChannelVertex - m_Stream = m_RD.m_VertexData.m_Streams[m_Channel.stream] - - vertexReader = EndianBinaryReader(m_RD.m_VertexData.m_DataSize, endian="<") - indexReader = EndianBinaryReader(m_RD.m_IndexBuffer, endian="<") - - for subMesh in m_RD.m_SubMeshes: - vertexReader.Position = ( - m_Stream.offset - + subMesh.firstVertex * m_Stream.stride - + m_Channel.offset - ) - - vertices = [] - for _ in range(subMesh.vertexCount): - vertices.append(vertexReader.read_vector3()) - vertexReader.Position = vertexReader.Position + m_Stream.stride - 12 - - indexReader.Position = subMesh.firstByte - - for _ in range(subMesh.indexCount): - points.append( - vertices[indexReader.read_u_short() - subMesh.firstVertex] - ) +def mask_sprite( + m_Sprite: "Sprite", mesh: MeshHandler, sprite_image: Image.Image +) -> Image.Image: + mask_img = Image.new("1", sprite_image.size, color=0) + draw = ImageDraw.ImageDraw(mask_img) # normalize the points # shift the whole point matrix into the positive space # multiply them with a factor to scale them to the image - min_x = min(p.X for p in points) - min_y = min(p.Y for p in points) + positions = mesh.m_Vertices + min_x = min(x for x, _y, _z in positions) + min_y = min(y for _x, y, _z in positions) factor = m_Sprite.m_PixelsToUnits - points = [((p.X - min_x) * factor, (p.Y - min_y) * factor) for p in points] + positions_2d = [ + ((x - min_x) * factor, (y - min_y) * factor) for x, y, _z in positions + ] # generate triangles from the given points - return [points[i : i + 3] for i in range(0, len(points), 3)] + triangles = [ + ( + positions_2d[a], + positions_2d[b], + positions_2d[c], + ) + for submesh in mesh.get_triangles() + for a, b, c in submesh + ] + + for triangle in triangles: + draw.polygon(triangle, fill=1) + + # apply the mask + if sprite_image.mode == "RGBA": + # the image already has an alpha channel, + # so we have to use composite to keep it + empty_img = Image.new(sprite_image.mode, sprite_image.size, color=0) + sprite_image = Image.composite(sprite_image, empty_img, mask_img) + else: + # add mask as alpha-channel to keep the polygon clean + sprite_image.putalpha(mask_img) + + return sprite_image + + +def render_sprite_mesh(m_Sprite: "Sprite", mesh: MeshHandler, texture: Image.Image): + for triangles in mesh.get_triangles(): + positions = mesh.m_Vertices + uv = mesh.m_UV0 + + # 2. patch position data + # 2.1 make positions 2d + # find the axis that has only one value - can be removed + # usually the z axis + axis_values = [[pos[i] for pos in positions] for i in range(3)] + for i in range(2, -1, -1): + if len(set(axis_values[i])) == 1: + break + else: + raise ValueError("Can't process 3d sprites!") + axis_values = axis_values[:i] + axis_values[i + 1 :] + x_min = min(axis_values[0]) + y_min = min(axis_values[1]) + x_max = max(axis_values[0]) + y_max = max(axis_values[1]) + + # 2.2 map positions from middle to top left + # 2.3 convert relative positions to absolute + pixels_to_units = m_Sprite.m_PixelsToUnits + positions_abs = [ + (round((x - x_min) * pixels_to_units), round((y - y_min) * pixels_to_units)) + for x, y in zip(*axis_values) + ] + width, height = texture.size + uv_abs = [(round(u * width), round(v * height)) for u, v in uv] + + # 2.4 generate final image size + size = ( + round((x_max - x_min) * pixels_to_units), + round((y_max - y_min) * pixels_to_units), + ) + sprite = Image.new(texture.mode, size) + + for tri in triangles: + copy_triangle( + texture, + [uv_abs[i] for i in tri], + sprite, + [positions_abs[i] for i in tri], + ) + + return sprite + + +def copy_triangle( + src_img: Image.Image, + src_tri: Tuple[float, float], + dst_img: Image.Image, + dst_tri: Tuple[float, float], +): + src_off = ( + (src_tri[1][0] - src_tri[0][0], src_tri[1][1] - src_tri[0][1]), + (src_tri[2][0] - src_tri[0][0], src_tri[2][1] - src_tri[0][1]), + ) + dst_off = ( + (dst_tri[1][0] - dst_tri[0][0], dst_tri[1][1] - dst_tri[0][1]), + (dst_tri[2][0] - dst_tri[0][0], dst_tri[2][1] - dst_tri[0][1]), + ) + + # check if transform is necessary by comparing the triangle sizes + if src_off[0] == dst_off[0] and src_off[1] == dst_off[1]: + # no transform necessary, just copy the triangle + + # make rectangle that contains the triangle + upper_left, _, lower_right = sorted(src_tri) + src_part = src_img.crop((*upper_left, *lower_right)) + + # create mask for triangle + mask_box = [(x - upper_left[0], y - upper_left[1]) for x, y in src_tri] + mask = Image.new("1", src_part.size) + maskdraw = ImageDraw.Draw(mask) + maskdraw.polygon(mask_box, fill=255) + + # paste triangle into destination image + dst_img.paste(src_part, min(dst_tri)) + else: + # transform is necessary, use affine transformation + # https://stackoverflow.com/a/6959111 + ((x11, x12), (x21, x22), (x31, x32)) = src_tri + ((y11, y12), (y21, y22), (y31, y32)) = dst_tri + + # Construct matrix M manually + M = [ + [y11, y12, 1, 0, 0, 0], + [y21, y22, 1, 0, 0, 0], + [y31, y32, 1, 0, 0, 0], + [0, 0, 0, y11, y12, 1], + [0, 0, 0, y21, y22, 1], + [0, 0, 0, y31, y32, 1], + ] + + # Vector y corresponds to the x coordinates in the source triangle + y = [x11, x21, x31, x12, x22, x32] + + # np.lingal.solve - obviously way faster, but numpy will only come with 2.0 + A = linalg_solve(M, y) + + transformed = src_img.transform(dst_img.size, Image.AFFINE, A) + + mask = Image.new("1", dst_img.size) + maskdraw = ImageDraw.Draw(mask) + maskdraw.polygon(dst_tri, fill=255) + + dst_img.paste(transformed, mask=mask) + + +def linalg_solve(M, y): + # M^-1 * y + M_i = get_matrix_inverse(M) + return [sum(M_i[i][j] * y[j] for j in range(len(y))) for i in range(len(M_i))] + + +def transpose_matrix(m): + # https://stackoverflow.com/a/39881366 + return map(list, zip(*m)) + + +def get_matrix_minor(m, i, j): + # https://stackoverflow.com/a/39881366 + return [row[:j] + row[j + 1 :] for row in (m[:i] + m[i + 1 :])] + + +def get_matrix_determinant(m): + # https://stackoverflow.com/a/39881366 + # base case for 2x2 matrix + if len(m) == 2: + return m[0][0] * m[1][1] - m[0][1] * m[1][0] + + return sum( + ((-1) ** c) * m[0][c] * get_matrix_determinant(get_matrix_minor(m, 0, c)) + for c in range(len(m)) + ) + + +def get_matrix_inverse(m): + # https://stackoverflow.com/a/39881366 + determinant = get_matrix_determinant(m) + # special case for 2x2 matrix: + if len(m) == 2: + return [ + [m[1][1] / determinant, -1 * m[0][1] / determinant], + [-1 * m[1][0] / determinant, m[0][0] / determinant], + ] + + # find matrix of cofactors + cofactors = [ + [ + ((-1) ** (r + c)) * get_matrix_determinant(get_matrix_minor(m, r, c)) + for c in range(len(m)) + ] + for r in range(len(m)) + ] + cofactors = list(transpose_matrix(cofactors)) + + return [[c / determinant for c in range(row)] for row in cofactors] + + +__all__ = ["get_image_from_sprite"] From 70ff68720df57c8f9632d04ec11769c259c3a288 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Thu, 12 Sep 2024 16:49:39 +0200 Subject: [PATCH 070/403] add attrs as dependency --- pyproject.toml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pyproject.toml b/pyproject.toml index 19b9a6a6..22bb1298 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -50,6 +50,8 @@ dependencies = [ "pyfmodex >= 0.7.1", # filesystem handling "fsspec", + # better classes + "attrs", ] dynamic = ["version"] From b46cdf59b44a020740931dacddfa05a5f7d70353 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Thu, 12 Sep 2024 16:52:30 +0200 Subject: [PATCH 071/403] remove typing.Self - compatiblity problem with <3.12 --- UnityPy/classes/Object.py | 4 ++-- UnityPy/classes/math.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/UnityPy/classes/Object.py b/UnityPy/classes/Object.py index c369594c..f00de2d0 100644 --- a/UnityPy/classes/Object.py +++ b/UnityPy/classes/Object.py @@ -1,6 +1,6 @@ from __future__ import annotations from abc import ABC, ABCMeta -from typing import TYPE_CHECKING, Dict, Any, Optional, Self +from typing import TYPE_CHECKING, Dict, Any, Optional if TYPE_CHECKING: from ..files.ObjectReader import ObjectReader @@ -8,7 +8,7 @@ class Object(ABC, metaclass=ABCMeta): - object_reader: Optional[ObjectReader[Self]] = None + object_reader: Optional[ObjectReader] = None def __init__(self, **kwargs: Dict[str, Any]) -> None: self.__dict__.update(**kwargs) diff --git a/UnityPy/classes/math.py b/UnityPy/classes/math.py index 0db9f7be..fe3b47e5 100644 --- a/UnityPy/classes/math.py +++ b/UnityPy/classes/math.py @@ -5,7 +5,7 @@ """ from attrs import define -from typing import Self, TypeAlias +from typing import TypeAlias @define(slots=True) @@ -93,7 +93,7 @@ class ColorRGBA: def __new__( cls, r: float = 0, g: float = 0, b: float = 0, a: float = 1, rgba: int = -1 - ) -> Self: + ) -> "ColorRGBA": obj = super().__new__(cls) if rgba != -1: r = ((rgba >> 24) & 0xFF) / 255 From dc5a2c9bf1d79a680f510c425e806d3f8aec6b3a Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Tue, 17 Sep 2024 22:12:15 +0200 Subject: [PATCH 072/403] vastly speedup typetree parsing --- UnityPy/files/ObjectReader.py | 2 +- UnityPy/helpers/TypeTreeHelper.py | 388 +++++++++++++++--------------- 2 files changed, 191 insertions(+), 199 deletions(-) diff --git a/UnityPy/files/ObjectReader.py b/UnityPy/files/ObjectReader.py index ed058f22..644ab82a 100644 --- a/UnityPy/files/ObjectReader.py +++ b/UnityPy/files/ObjectReader.py @@ -203,7 +203,7 @@ def read_typetree(self, nodes: list = None, wrap: bool = False) -> Union[dict, T self.reset() nodes = self.get_typetree_nodes(nodes) ret = TypeTreeHelper.read_typetree( - nodes, self, as_dict=not wrap, assetsfile=self.assets_file + nodes, self.reader, as_dict=not wrap, assetsfile=self.assets_file ) if wrap: ret.set_object_reader(self) diff --git a/UnityPy/helpers/TypeTreeHelper.py b/UnityPy/helpers/TypeTreeHelper.py index 5a092db6..3e00eb9b 100644 --- a/UnityPy/helpers/TypeTreeHelper.py +++ b/UnityPy/helpers/TypeTreeHelper.py @@ -16,6 +16,53 @@ kAlignBytes = 0x4000 +FUNCTION_MAP = { + "SInt8": EndianBinaryReader.read_byte, + "UInt8": EndianBinaryReader.read_u_byte, + "char": EndianBinaryReader.read_u_byte, + "short": EndianBinaryReader.read_short, + "SInt16": EndianBinaryReader.read_short, + "unsigned short": EndianBinaryReader.read_u_short, + "UInt16": EndianBinaryReader.read_u_short, + "int": EndianBinaryReader.read_int, + "SInt32": EndianBinaryReader.read_int, + "unsigned int": EndianBinaryReader.read_u_int, + "UInt32": EndianBinaryReader.read_u_int, + "Type*": EndianBinaryReader.read_u_int, + "long long": EndianBinaryReader.read_long, + "SInt64": EndianBinaryReader.read_long, + "unsigned long long": EndianBinaryReader.read_u_long, + "UInt64": EndianBinaryReader.read_u_long, + "FileSize": EndianBinaryReader.read_u_long, + "float": EndianBinaryReader.read_float, + "double": EndianBinaryReader.read_double, + "bool": EndianBinaryReader.read_boolean, + "string": EndianBinaryReader.read_aligned_string, + "TypelessData": EndianBinaryReader.read_byte_array, +} +FUNCTION_MAP_ARRAY = { + "SInt8": EndianBinaryReader.read_byte_array, + "UInt8": EndianBinaryReader.read_u_byte_array, + "char": EndianBinaryReader.read_u_byte_array, + "short": EndianBinaryReader.read_short_array, + "SInt16": EndianBinaryReader.read_short_array, + "unsigned short": EndianBinaryReader.read_u_short_array, + "UInt16": EndianBinaryReader.read_u_short_array, + "int": EndianBinaryReader.read_int_array, + "SInt32": EndianBinaryReader.read_int_array, + "unsigned int": EndianBinaryReader.read_u_int_array, + "UInt32": EndianBinaryReader.read_u_int_array, + "Type*": EndianBinaryReader.read_u_int_array, + "long long": EndianBinaryReader.read_long_array, + "SInt64": EndianBinaryReader.read_long_array, + "unsigned long long": EndianBinaryReader.read_u_long_array, + "UInt64": EndianBinaryReader.read_u_long_array, + "FileSize": EndianBinaryReader.read_u_long_array, + "float": EndianBinaryReader.read_float_array, + "double": EndianBinaryReader.read_double_array, + "bool": EndianBinaryReader.read_boolean_array, +} + def read_typetree( root_node: TypeTreeNode, @@ -78,92 +125,61 @@ def read_value( # print(reader.Position, node.m_Name, node.m_Type, node.m_MetaFlag) align = metaflag_is_aligned(node.m_MetaFlag) - match node.m_Type: - case "SInt8": - value = reader.read_byte() - case "UInt8" | "char": - value = reader.read_u_byte() - case "short" | "SInt16": - value = reader.read_short() - case "UInt16" | "unsigned short": - value = reader.read_u_short() - case "int" | "SInt32": - value = reader.read_int() - case "UInt32" | "unsigned int" | "Type*": - value = reader.read_u_int() - case "long long" | "SInt64": - value = reader.read_long() - case "UInt64" | "unsigned long long" | "FileSize": - value = reader.read_u_long() - case "float": - value = reader.read_float() - case "double": - value = reader.read_double() - case "bool": - value = reader.read_boolean() - case "string": - value = reader.read_aligned_string() - case "TypelessData": - value = reader.read_byte_array() - case "pair": - first = read_value(node.m_Children[0], reader, as_dict, assetsfile) - second = read_value(node.m_Children[1], reader, as_dict, assetsfile) - value = (first, second) - case _: - if not node.m_Children: - value = None - # raise NotImplementedError(f"Reference type {node.m_Type} not implemented") - # Vector - elif node.m_Children and node.m_Children[0].m_Type == "Array": - if metaflag_is_aligned(node.m_Children[0].m_MetaFlag): - align = True - - size = ( - reader.read_int() - ) # read_value(node.m_Children[0].m_Children[0], reader, as_dict) - subtype = node.m_Children[0].m_Children[1] - if metaflag_is_aligned(subtype.m_MetaFlag): - value = read_value_array(subtype, reader, as_dict, size, assetsfile) - else: - value = [ - read_value(subtype, reader, as_dict, assetsfile) - for _ in range(size) - ] - - else: # Class - value = { - child.m_Name: read_value(child, reader, as_dict, assetsfile) - for child in node.m_Children - } + func = FUNCTION_MAP.get(node.m_Type) + if func: + value = func(reader) + elif node.m_Type == "pair": + first = read_value(node.m_Children[0], reader, as_dict, assetsfile) + second = read_value(node.m_Children[1], reader, as_dict, assetsfile) + value = (first, second) + elif not node.m_Children: + value = None + # raise NotImplementedError(f"Reference type {node.m_Type} not implemented") + # Vector + elif node.m_Children[0].m_Type == "Array": + if metaflag_is_aligned(node.m_Children[0].m_MetaFlag): + align = True + + # size = read_value(node.m_Children[0].m_Children[0], reader, as_dict) + size = reader.read_int() + subtype = node.m_Children[0].m_Children[1] + if metaflag_is_aligned(subtype.m_MetaFlag): + value = read_value_array(subtype, reader, as_dict, size, assetsfile) + else: + value = [ + read_value(subtype, reader, as_dict, assetsfile) for _ in range(size) + ] - if not as_dict: - if node.m_Type.startswith("PPtr<"): - value = PPtr[Any]( - assetsfile=assetsfile, - m_FileID=value["m_FileID"], - m_PathID=value["m_PathID"], - type=node.m_Type[6:-1], - ) - else: - clz = getattr(classes, node.m_Type, Object) - clz_kwargs = { - clean_name(key): value for key, value in value.items() + else: # Class + value = { + child.m_Name: read_value(child, reader, as_dict, assetsfile) + for child in node.m_Children + } + + if not as_dict: + if node.m_Type.startswith("PPtr<"): + value = PPtr[Any]( + assetsfile=assetsfile, + m_FileID=value["m_FileID"], + m_PathID=value["m_PathID"], + type=node.m_Type[6:-1], + ) + else: + clz = getattr(classes, node.m_Type, Object) + clz_kwargs = {clean_name(key): value for key, value in value.items()} + try: + value = clz(**clz_kwargs) + except TypeError: + extra_keys = set(clz_kwargs.keys()) - set(clz.__annotations__) + value = clz( + **{ + key: value + for key, value in clz_kwargs.items() + if key in clz.__annotations__ } - try: - value = clz(**clz_kwargs) - except TypeError: - extra_keys = set(clz_kwargs.keys()) - set( - clz.__annotations__ - ) - value = clz( - **{ - key: value - for key, value in clz_kwargs.items() - if key in clz.__annotations__ - } - ) - for key in extra_keys: - setattr(value, key, clz_kwargs[key]) + ) + for key in extra_keys: + setattr(value, key, clz_kwargs[key]) if align: reader.align_stream() @@ -180,132 +196,108 @@ def read_value_array( ) -> Any: align = metaflag_is_aligned(node.m_MetaFlag) - match node.m_Type: - case "SInt8": - value = reader.read_byte_array(size) - case "UInt8" | "char": - value = reader.read_u_byte_array(size) - case "short" | "SInt16": - value = reader.read_short_array(size) - case "UInt16" | "unsigned short": - value = reader.read_u_short_array(size) - case "int" | "SInt32": - value = reader.read_int_array(size) - case "UInt32" | "unsigned int" | "Type*": - value = reader.read_u_int_array(size) - case "long long" | "SInt64": - value = reader.read_long_array(size) - case "UInt64" | "unsigned long long" | "FileSize": - value = reader.read_u_long_array(size) - case "float": - value = reader.read_float_array(size) - case "double": - value = reader.read_double_array(size) - case "bool": - value = reader.read_boolean_array(size) - case "string": - value = [reader.read_aligned_string() for _ in range(size)] - case "TypelessData": - value = [reader.read_bytes() for _ in range(size)] - case "pair": + func = FUNCTION_MAP_ARRAY.get(node.m_Type) + if func: + value = func(reader, size) + elif node.m_Type == "string": + value = [reader.read_aligned_string() for _ in range(size)] + elif node.m_Type == "TypelessData": + value = [reader.read_bytes() for _ in range(size)] + elif node.m_Type == "pair": + key_node = node.m_Children[0] + value_node = node.m_Children[1] + + key_func = FUNCTION_MAP.get( + key_node.m_Type, + lambda reader: read_value(key_node, reader, as_dict, assetsfile), + ) + value_func = FUNCTION_MAP.get( + value_node.m_Type, + lambda reader: read_value(value_node, reader, as_dict, assetsfile), + ) + value = [(key_func(reader), value_func(reader)) for _ in range(size)] + elif not node.m_Children: + value = None + # raise NotImplementedError(f"Reference type {node.m_Type} not implemented") + # Vector + elif node.m_Children[0].m_Type == "Array": + if metaflag_is_aligned(node.m_Children[0].m_MetaFlag): + align = True + subtype = node.m_Children[0].m_Children[1] + if metaflag_is_aligned(subtype.m_MetaFlag): value = [ - ( - read_value(node.m_Children[0], reader, as_dict, assetsfile), - read_value(node.m_Children[1], reader, as_dict, assetsfile), + read_value_array( + subtype, reader, as_dict, reader.read_int(), assetsfile ) for _ in range(size) ] - case _: - if not node.m_Children: - value = None - # raise NotImplementedError(f"Reference type {node.m_Type} not implemented") - # Vector - elif node.m_Children[0].m_Type == "Array": - if metaflag_is_aligned(node.m_Children[0].m_MetaFlag): - align = True - subtype = node.m_Children[0].m_Children[1] - if metaflag_is_aligned(subtype.m_MetaFlag): + else: + value = [ + [ + read_value(subtype, reader, as_dict, assetsfile) + for _ in range(reader.read_int()) + ] + for _ in range(size) + ] + else: # Class + if as_dict: + value = [ + { + child.m_Name: read_value(child, reader, as_dict, assetsfile) + for child in node.m_Children + } + for _ in range(size) + ] + else: + if node.m_Type.startswith("PPtr<"): + value = [ + PPtr[Any]( + assetsfile=assetsfile, + type=node.m_Type[6:-1], + **{ + child.m_Name: read_value(child, reader, as_dict, assetsfile) + for child in node.m_Children + }, + ) + for _ in range(size) + ] + else: + clz = getattr( + classes, + node.m_Type, + Object, + ) + clean_names = [clean_name(child.m_Name) for child in node.m_Children] + if all(name in clz.__annotations__ for name in clean_names): value = [ - read_value_array( - subtype, reader, as_dict, reader.read_int(), assetsfile + clz( + **{ + name: read_value(child, reader, as_dict, assetsfile) + for name, child in zip(clean_names, node.m_Children) + } ) for _ in range(size) ] else: - value = [ - [ - read_value(subtype, reader, as_dict, assetsfile) - for _ in range(reader.read_int()) - ] - for _ in range(size) - ] - else: # Class - if as_dict: - value = [ - { - child.m_Name: read_value(child, reader, as_dict, assetsfile) + extra_keys = set(clean_names) - set(clz.__annotations__) + value = [None] * size + for i in range(size): + value_i_d = { + clean_name(child.m_Name): read_value( + child, reader, as_dict, assetsfile + ) for child in node.m_Children } - for _ in range(size) - ] - else: - if node.m_Type.startswith("PPtr<"): - value = [ - PPtr[Any]( - assetsfile=assetsfile, - type=node.m_Type[6:-1], - **{ - child.m_Name: read_value( - child, reader, as_dict, assetsfile - ) - for child in node.m_Children - }, - ) - for _ in range(size) - ] - else: - clz = getattr( - classes, - node.m_Type, - Object, + value_i = clz( + **{ + key: value + for key, value in value_i_d.items() + if key in clz.__annotations__ + } ) - clean_names = [ - clean_name(child.m_Name) for child in node.m_Children - ] - if all(name in clz.__annotations__ for name in clean_names): - value = [ - clz( - **{ - name: read_value( - child, reader, as_dict, assetsfile - ) - for name, child in zip( - clean_names, node.m_Children - ) - } - ) - for _ in range(size) - ] - else: - extra_keys = set(clean_names) - set(clz.__annotations__) - value = [None] * size - for i in range(size): - value_i_d = { - clean_name(child.m_Name): read_value( - child, reader, as_dict, assetsfile - ) - for child in node.m_Children - } - value_i = clz( - **{ - key: value - for key, value in value_i_d.items() - if key in clz.__annotations__ - } - ) - for key in extra_keys: - setattr(value_i, key, value_i_d[key]) - value[i] = value_i + for key in extra_keys: + setattr(value_i, key, value_i_d[key]) + value[i] = value_i if align: reader.align_stream() return value From ff2d036b15b7989202caa42f036e7887a23bb788 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Wed, 18 Sep 2024 21:33:37 +0200 Subject: [PATCH 073/403] ObjectReader - cleanup & dump_structure reimplementation --- UnityPy/files/ObjectReader.py | 70 +++++++++++++++++++-------------- UnityPy/helpers/TypeTreeNode.py | 41 ++++++++++++++++--- 2 files changed, 77 insertions(+), 34 deletions(-) diff --git a/UnityPy/files/ObjectReader.py b/UnityPy/files/ObjectReader.py index 644ab82a..bbafd058 100644 --- a/UnityPy/files/ObjectReader.py +++ b/UnityPy/files/ObjectReader.py @@ -1,9 +1,10 @@ -from typing import TYPE_CHECKING, Generic, TypeVar, Union +from typing import TYPE_CHECKING, Generic, TypeVar, Union, List, Optional from ..enums import ClassIDType from ..streams import EndianBinaryReader, EndianBinaryWriter from ..helpers import TypeTreeHelper from ..helpers.Tpk import get_typetree_nodes +from ..helpers.TypeTreeNode import TypeTreeNode from ..exceptions import TypeTreeError if TYPE_CHECKING: @@ -177,45 +178,38 @@ def __repr__(self): # ################################################### - def dump_typetree(self, nodes: list = None) -> str: + def dump_typetree_structure( + self, + nodes: Optional[Union[TypeTreeNode, List[dict]]] = None, + indent: str = " ", + ) -> str: + node = self._get_typetree_node(nodes) + return node.dump_structure(indent=indent) + + def read_typetree( + self, + nodes: Optional[Union[TypeTreeNode, List[dict]]] = None, + wrap: bool = False, + ) -> Union[dict, T]: self.reset() - sb = [] - nodes = self.get_typetree_nodes(nodes) - TypeTreeHelper.read_typetree_str(sb, nodes, self) - return "".join(sb) - - def dump_typetree_structure(self) -> str: - return TypeTreeHelper.dump_typetree(self.get_typetree_nodes()) - - def get_typetree_nodes(self, nodes: list = None) -> list: - if nodes: - return nodes - - if self.serialized_type: - nodes = self.serialized_type.nodes - if not nodes: - nodes = get_typetree_nodes(self.class_id, self.version) - if not nodes: - raise TypeTreeError("There are no TypeTree nodes for this object.") - return nodes - - def read_typetree(self, nodes: list = None, wrap: bool = False) -> Union[dict, T]: - self.reset() - nodes = self.get_typetree_nodes(nodes) + node = self._get_typetree_node(nodes) ret = TypeTreeHelper.read_typetree( - nodes, self.reader, as_dict=not wrap, assetsfile=self.assets_file + node, self.reader, as_dict=not wrap, assetsfile=self.assets_file ) if wrap: ret.set_object_reader(self) return ret def save_typetree( - self, tree: dict, nodes: list = None, writer: EndianBinaryWriter = None + self, + tree: dict, + nodes: Optional[Union[TypeTreeNode, List[dict]]] = None, + writer: EndianBinaryWriter = None, ): - nodes = self.get_typetree_nodes(nodes) + node = self._get_typetree_node(nodes) if not writer: writer = EndianBinaryWriter(endian=self.reader.endian) - TypeTreeHelper.write_typetree(tree, nodes, writer) + TypeTreeHelper.write_typetree(tree, node, writer) data = writer.bytes self.set_raw_data(data) return data @@ -226,3 +220,21 @@ def get_raw_data(self) -> bytes: ret = self.reader.read_bytes(self.byte_size) self.Position = pos return ret + + def _get_typetree_node( + self, nodes: Optional[Union[TypeTreeNode, List[dict]]] = None + ) -> TypeTreeNode: + if isinstance(nodes, TypeTreeNode): + return nodes + elif isinstance(nodes, list): + return TypeTreeNode.from_list(nodes) + elif nodes is not None: + raise ValueError("nodes must be a list[dict] or TypeTreeNode") + + if self.serialized_type: + nodes = self.serialized_type.nodes + if not nodes: + nodes = get_typetree_nodes(self.class_id, self.version) + if not nodes: + raise TypeTreeError("There are no TypeTree nodes for this object.") + return nodes diff --git a/UnityPy/helpers/TypeTreeNode.py b/UnityPy/helpers/TypeTreeNode.py index d76ee3d3..c61f344d 100644 --- a/UnityPy/helpers/TypeTreeNode.py +++ b/UnityPy/helpers/TypeTreeNode.py @@ -36,8 +36,8 @@ def traverse(self) -> Iterator[TypeTreeNode]: def parse(cls, reader: EndianBinaryReader, version: int) -> TypeTreeNode: # stack approach is way faster than recursion # using a fake root node to avoid special case for root node - dummy_node = TypeTreeNode(-1, "", "", 0, 0, 0, []) - dummy_root = TypeTreeNode(-1, "", "", 0, 0, 0, [dummy_node]) + dummy_node = cls(-1, "", "", 0, 0, 0, []) + dummy_root = cls(-1, "", "", 0, 0, 0, [dummy_node]) stack: List[Tuple[TypeTreeNode, int]] = [(dummy_root, 1)] while stack: @@ -47,7 +47,7 @@ def parse(cls, reader: EndianBinaryReader, version: int) -> TypeTreeNode: else: stack[-1] = (parent, count - 1) - node = TypeTreeNode( + node = cls( m_Level=parent.m_Level + 1, m_Type=reader.read_string_to_null(), m_Name=reader.read_string_to_null(), @@ -87,13 +87,13 @@ def read_string(reader: EndianBinaryReader, value: int) -> str: offset = value & 0x7FFFFFFF return CommonString.get(offset, str(offset)) - fake_root: TypeTreeNode = TypeTreeNode(-1, "", "", 0, 0, 0, []) + fake_root: TypeTreeNode = cls(-1, "", "", 0, 0, 0, []) stack: List[TypeTreeNode] = [fake_root] parent = fake_root prev = fake_root for raw_node in node_struct.iter_unpack(struct_data): - node = TypeTreeNode( + node = cls( **dict(zip(keys[:3], raw_node[:3])), **dict(zip(keys[5:], raw_node[5:])), m_Type=read_string(stringbuffer_reader, raw_node[3]), @@ -112,6 +112,28 @@ def read_string(reader: EndianBinaryReader, value: int) -> str: return fake_root.m_Children[0] + @classmethod + def from_list(cls, nodes: List[dict]) -> TypeTreeNode: + fake_root: TypeTreeNode = cls(-1, "", "", 0, 0, 0, []) + stack: List[TypeTreeNode] = [fake_root] + parent = fake_root + prev = fake_root + + for dict_node in nodes: + node = cls(**dict_node) + + if node.m_Level > prev.m_Level: + stack.append(parent) + parent = prev + elif node.m_Level < prev.m_Level: + while node.m_Level <= parent.m_Level: + parent = stack.pop() + + parent.m_Children.append(node) + prev = node + + return fake_root.m_Children[0] + def dump(self, writer: EndianBinaryWriter, version: int): stack: list[TypeTreeNode] = [self] while stack: @@ -181,6 +203,15 @@ def write_node(node: TypeTreeNode): writer.write(node_writer.bytes) writer.write(string_writer.bytes) + def dump_structure(self, indent: str = " ") -> str: + # dump structure similar to https://github.com/AssetRipper/TypeTreeDumps/blob/main/StructsDump + sb = [ + f"{indent}{self.m_Type} {self.m_Name} // ByteSize{{{self.m_ByteSize:X}}}, Index{{{self.m_Index}}}, Version{{{self.m_Version}}}, TypeFlags{{{self.m_TypeFlags}}}, MetaFlag{{{self.m_MetaFlag}}}" + ] + for child in self.m_Children: + sb.append(child.dump_structure(indent + " ")) + return "\n".join(sb) + COMMONSTRING_CACHE: Dict[Optional[UnityVersion], Dict[int, str]] = {} From 229f23e67cbe9b339b2aec755727ea3735245244 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Thu, 19 Sep 2024 22:04:52 +0200 Subject: [PATCH 074/403] rewrite C TypeTreeHelper to match new version --- .gitignore | 1 + UnityPy/classes/PPtr.py | 2 +- UnityPy/files/ObjectReader.py | 6 +- UnityPy/helpers/TypeTreeHelper.py | 21 +- UnityPy/helpers/TypeTreeNode.py | 35 +- .../{AnimationClip.c => AnimationClip.cpp} | 2 +- .../{AnimationClip.h => AnimationClip.hpp} | 0 UnityPyBoost/{Mesh.c => Mesh.cpp} | 6 +- UnityPyBoost/{Mesh.h => Mesh.hpp} | 2 +- ...{TextureSwizzler.c => TextureSwizzler.cpp} | 2 +- ...{TextureSwizzler.h => TextureSwizzler.hpp} | 0 UnityPyBoost/TypeTreeHelper.c | 836 ------------------ UnityPyBoost/TypeTreeHelper.cpp | 746 ++++++++++++++++ UnityPyBoost/TypeTreeHelper.h | 31 - UnityPyBoost/TypeTreeHelper.hpp | 51 ++ .../{UnityPyBoost.c => UnityPyBoost.cpp} | 10 +- UnityPyBoost/swap.h | 35 - UnityPyBoost/swap.hpp | 77 ++ setup.py | 5 +- 19 files changed, 930 insertions(+), 938 deletions(-) rename UnityPyBoost/{AnimationClip.c => AnimationClip.cpp} (99%) rename UnityPyBoost/{AnimationClip.h => AnimationClip.hpp} (100%) rename UnityPyBoost/{Mesh.c => Mesh.cpp} (98%) rename UnityPyBoost/{Mesh.h => Mesh.hpp} (80%) rename UnityPyBoost/{TextureSwizzler.c => TextureSwizzler.cpp} (99%) rename UnityPyBoost/{TextureSwizzler.h => TextureSwizzler.hpp} (100%) delete mode 100644 UnityPyBoost/TypeTreeHelper.c create mode 100644 UnityPyBoost/TypeTreeHelper.cpp delete mode 100644 UnityPyBoost/TypeTreeHelper.h create mode 100644 UnityPyBoost/TypeTreeHelper.hpp rename UnityPyBoost/{UnityPyBoost.c => UnityPyBoost.cpp} (90%) delete mode 100644 UnityPyBoost/swap.h create mode 100644 UnityPyBoost/swap.hpp diff --git a/.gitignore b/.gitignore index 6fb3e554..2d53a172 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ __pycache__/ *$py.class test.py AssetStudio/ +.vscode/ # Distribution / packaging .Python diff --git a/UnityPy/classes/PPtr.py b/UnityPy/classes/PPtr.py index 2694f4f8..e5a2573f 100644 --- a/UnityPy/classes/PPtr.py +++ b/UnityPy/classes/PPtr.py @@ -10,7 +10,7 @@ T = TypeVar("T") -@define +@define(slots=True, kw_only=True) class PPtr(Generic[T]): m_FileID: int m_PathID: int diff --git a/UnityPy/files/ObjectReader.py b/UnityPy/files/ObjectReader.py index bbafd058..fde1d202 100644 --- a/UnityPy/files/ObjectReader.py +++ b/UnityPy/files/ObjectReader.py @@ -194,7 +194,11 @@ def read_typetree( self.reset() node = self._get_typetree_node(nodes) ret = TypeTreeHelper.read_typetree( - node, self.reader, as_dict=not wrap, assetsfile=self.assets_file + node, + self.reader, + as_dict=not wrap, + assetsfile=self.assets_file, + expected_read=self.byte_size, ) if wrap: ret.set_object_reader(self) diff --git a/UnityPy/helpers/TypeTreeHelper.py b/UnityPy/helpers/TypeTreeHelper.py index 3e00eb9b..0e8879e0 100644 --- a/UnityPy/helpers/TypeTreeHelper.py +++ b/UnityPy/helpers/TypeTreeHelper.py @@ -14,6 +14,12 @@ if TYPE_CHECKING: from ..files.SerializedFile import SerializedFile + +try: + from ..UnityPyBoost import read_typetree as read_typetree_boost +except ImportError: + read_typetree_boost = None + kAlignBytes = 0x4000 FUNCTION_MAP = { @@ -85,6 +91,12 @@ def read_typetree( dict | objects.Object The parsed typtree """ + if expected_read and read_typetree_boost: + data = reader.read_bytes(expected_read) + return read_typetree_boost( + data, root_node, reader.endian, as_dict, assetsfile, classes, clean_name + ) + pos = reader.Position obj = read_value(root_node, reader, as_dict, assetsfile) @@ -136,7 +148,7 @@ def read_value( value = None # raise NotImplementedError(f"Reference type {node.m_Type} not implemented") # Vector - elif node.m_Children[0].m_Type == "Array": + elif node.m_Children and node.m_Children[0].m_Type == "Array": if metaflag_is_aligned(node.m_Children[0].m_MetaFlag): align = True @@ -220,7 +232,7 @@ def read_value_array( value = None # raise NotImplementedError(f"Reference type {node.m_Type} not implemented") # Vector - elif node.m_Children[0].m_Type == "Array": + elif node.m_Children and node.m_Children[0].m_Type == "Array": if metaflag_is_aligned(node.m_Children[0].m_MetaFlag): align = True subtype = node.m_Children[0].m_Children[1] @@ -359,11 +371,8 @@ def write_value( write_value(value[0], node.m_Children[0], writer) write_value(value[1], node.m_Children[1], writer) case _: - if not node.m_Children: - value = None - # raise NotImplementedError(f"Reference type {node.m_Type} not implemented") # Vector - elif node.m_Children and node.m_Children[0].m_Type == "Array": + if node.m_Children and node.m_Children[0].m_Type == "Array": if metaflag_is_aligned(node.m_Children[0].m_MetaFlag): align = True diff --git a/UnityPy/helpers/TypeTreeNode.py b/UnityPy/helpers/TypeTreeNode.py index c61f344d..4d6256b5 100644 --- a/UnityPy/helpers/TypeTreeNode.py +++ b/UnityPy/helpers/TypeTreeNode.py @@ -10,21 +10,26 @@ if TYPE_CHECKING: from .Tpk import UnityVersion - -@define -class TypeTreeNode: - m_Level: int - m_Type: str - m_Name: str - m_ByteSize: int - m_TypeFlags: int - m_Version: int - m_Children: List[TypeTreeNode] = field(factory=list) - m_VariableCount: Optional[int] = None - m_Index: Optional[int] = None - m_MetaFlag: Optional[int] = None - m_RefTypeHash: Optional[int] = None - +try: + from ..UnityPyBoost import TypeTreeNode as TypeTreeNodeC +except ImportError: + + @define(slots=True) + class TypeTreeNodeC: + m_Level: int + m_Type: str + m_Name: str + m_ByteSize: int + m_TypeFlags: int + m_Version: int + m_Children: List[TypeTreeNode] = field(factory=list) + m_VariableCount: Optional[int] = None + m_Index: Optional[int] = None + m_MetaFlag: Optional[int] = None + m_RefTypeHash: Optional[int] = None + + +class TypeTreeNode(TypeTreeNodeC): def traverse(self) -> Iterator[TypeTreeNode]: stack: list[TypeTreeNode] = [self] while stack: diff --git a/UnityPyBoost/AnimationClip.c b/UnityPyBoost/AnimationClip.cpp similarity index 99% rename from UnityPyBoost/AnimationClip.c rename to UnityPyBoost/AnimationClip.cpp index 59ef7c98..0a447f4d 100644 --- a/UnityPyBoost/AnimationClip.c +++ b/UnityPyBoost/AnimationClip.cpp @@ -1,4 +1,4 @@ -#include "AnimationClip.h" +#include "AnimationClip.hpp" #include #define MIN(x, y) (((x) < (y)) ? (x) : (y)) diff --git a/UnityPyBoost/AnimationClip.h b/UnityPyBoost/AnimationClip.hpp similarity index 100% rename from UnityPyBoost/AnimationClip.h rename to UnityPyBoost/AnimationClip.hpp diff --git a/UnityPyBoost/Mesh.c b/UnityPyBoost/Mesh.cpp similarity index 98% rename from UnityPyBoost/Mesh.c rename to UnityPyBoost/Mesh.cpp index d2bd08dd..97220a3d 100644 --- a/UnityPyBoost/Mesh.c +++ b/UnityPyBoost/Mesh.cpp @@ -1,6 +1,6 @@ -#include "Mesh.h" +#include "Mesh.hpp" #include -#include +#include #define MAX(x, y) (((x) > (y)) ? (x) : (y)) @@ -99,7 +99,7 @@ PyObject *unpack_vertexdata(PyObject *self, PyObject *args) } } - PyObject *res = PyByteArray_FromStringAndSize(componentBytes, componentBytesLength); + PyObject *res = PyByteArray_FromStringAndSize((const char*)componentBytes, componentBytesLength); PyMem_Free(componentBytes); PyBuffer_Release(&vertexDataView); return res; diff --git a/UnityPyBoost/Mesh.h b/UnityPyBoost/Mesh.hpp similarity index 80% rename from UnityPyBoost/Mesh.h rename to UnityPyBoost/Mesh.hpp index e74f9ba1..6f0d87ca 100644 --- a/UnityPyBoost/Mesh.h +++ b/UnityPyBoost/Mesh.hpp @@ -1,6 +1,6 @@ #define PY_SSIZE_T_CLEAN #pragma once -#include "AnimationClip.h" +#include "AnimationClip.hpp" #include PyObject *unpack_vertexdata(PyObject *self, PyObject *args); \ No newline at end of file diff --git a/UnityPyBoost/TextureSwizzler.c b/UnityPyBoost/TextureSwizzler.cpp similarity index 99% rename from UnityPyBoost/TextureSwizzler.c rename to UnityPyBoost/TextureSwizzler.cpp index c75656fc..35dff5a9 100644 --- a/UnityPyBoost/TextureSwizzler.c +++ b/UnityPyBoost/TextureSwizzler.cpp @@ -1,4 +1,4 @@ -#include +#include const uint32_t GOB_X_BLOCK_COUNT = 4; const uint32_t GOB_Y_BLOCK_COUNT = 8; diff --git a/UnityPyBoost/TextureSwizzler.h b/UnityPyBoost/TextureSwizzler.hpp similarity index 100% rename from UnityPyBoost/TextureSwizzler.h rename to UnityPyBoost/TextureSwizzler.hpp diff --git a/UnityPyBoost/TypeTreeHelper.c b/UnityPyBoost/TypeTreeHelper.c deleted file mode 100644 index 4b017926..00000000 --- a/UnityPyBoost/TypeTreeHelper.c +++ /dev/null @@ -1,836 +0,0 @@ -#define PY_SSIZE_T_CLEAN -#pragma once -#include -#include "structmember.h" -#include "TypeTreeHelper.h" -#include -#include -#include "swap.h" - -typedef struct -{ - char *data; - char *dataStart; - char *dataEnd; - char swap; - PyObject *obj; -} Reader; -typedef PyObject *(*read_type)(Reader *); - -#define kAlignBytesFlag 1 << 14 -#define kAnyChildUsesAlignBytesFlag 1 << 15 - -#define HASH_SInt8 235330747 -#define HASH_UInt8 237702589 -#define HASH_char 2090147939 -#define HASH_SInt16 3470947178 -#define HASH_short 274395349 -#define HASH_UInt16 3549217964 -#define HASH_unsigned_short 878862258 -#define HASH_SInt32 3470947240 -#define HASH_int 193495088 -#define HASH_UInt32 3549218026 -#define HASH_unsigned_int 2990314445 -#define HASH_TypePtr 238243313 -#define HASH_SInt64 3470947341 -#define HASH_long_long 2373003301 -#define HASH_UInt64 3549218127 -#define HASH_unsigned_long_long 857652610 -#define HASH_FileSize 2878770112 -#define HASH_float 259121563 -#define HASH_double 4181547808 -#define HASH_bool 2090120081 -#define HASH_string 479440892 -#define HASH_TypelessData 1242572536 -#define HASH_map 193499011 - -#define CHECK_LENGTH(reader, length) \ - if (reader->data + length > reader->dataEnd) \ - { \ - PyErr_Format(PyExc_ValueError, "Can't read %d bytes at position %d of %d\nError occured at %s:%d:%s", length, (int)(reader->data - reader->dataStart), (int)(reader->dataEnd - reader->dataStart), __FILE__, __LINE__, __func__); \ - return NULL; \ - } - -static char SURROGATEESCAPE[] = "surrogateescape"; - -/* function signatures */ -static int read_length(Reader *reader); -static PyObject *read_SInt8(Reader *reader); -static PyObject *read_UInt8(Reader *reader); -static PyObject *read_SInt16(Reader *reader); -static PyObject *read_UInt16(Reader *reader); -static PyObject *read_SInt32(Reader *reader); -static PyObject *read_UInt32(Reader *reader); -static PyObject *read_SInt64(Reader *reader); -static PyObject *read_UInt64(Reader *reader); -static PyObject *read_float(Reader *reader); -static PyObject *read_double(Reader *reader); -static PyObject *read_bool(Reader *reader); -static PyObject *read_string(Reader *reader); -static PyObject *read_TypelessData(Reader *reader); - -static read_type getReadFunction(int hash_value, int *index); -static PyObject *getSubNodes(PyObject *nodes, int *index); - -static PyObject *TypeTreeHelper_ReadValue(PyObject *nodes, Reader *reader, int *index); -static PyObject *TypeTreeHelper_ReadValueVector(PyObject *nodes, Reader *reader, int *index); - -PyObject *read_typetree(PyObject *self, PyObject *args); - -/* implementation */ -static inline uint32_t hash_str(const char *str) -{ - unsigned int hash = 5381; - int c; - while ((c = *str++)) - hash = ((hash << 5) + hash) + c; - return hash; -} - -static inline void initReadFuncOrNodes(PyObject *nodes, int *index, PyObject **subnodes, read_type *func, char *subalign) -{ - TypeTreeNodeObject *node = (TypeTreeNodeObject *)PyList_GetItem(nodes, *index); - *func = getReadFunction(node->typehash, index); - if (*func == NULL) - { - *subnodes = getSubNodes(nodes, index); - } - else - { - *subalign = (node->m_MetaFlag & kAlignBytesFlag) ? 1 : 0; - } -} - -static inline void align4(Reader *reader) -{ - char mod = (reader->data - reader->dataStart) % 4; - if (mod != 0) - { - reader->data += 4 - mod; - } -} - -static inline PyObject *read_bool(Reader *reader) -{ - CHECK_LENGTH(reader, 1); - return PyBool_FromLong(*(char *)reader->data++); -} - -static inline PyObject *read_SInt8(Reader *reader) -{ - CHECK_LENGTH(reader, 1); - return PyLong_FromLong(*(signed char *)reader->data++); -} - -static inline PyObject *read_UInt8(Reader *reader) -{ - CHECK_LENGTH(reader, 1); - return PyLong_FromUnsignedLong(*(unsigned char *)reader->data++); -} - -static inline PyObject *read_SInt16(Reader *reader) -{ - CHECK_LENGTH(reader, 2); - PyObject *ret = NULL; - if (reader->swap) - { - ret = PyLong_FromLong((signed short)bswap16(*(unsigned short *)reader->data)); - } - else - { - ret = PyLong_FromLong(*(signed short *)(reader->data)); - } - reader->data += 2; - return ret; -} - -static inline PyObject *read_UInt16(Reader *reader) -{ - CHECK_LENGTH(reader, 2); - PyObject *ret = NULL; - if (reader->swap) - { - ret = PyLong_FromUnsignedLong((unsigned short)bswap16(*(unsigned short *)reader->data)); - } - else - { - ret = PyLong_FromUnsignedLong(*(unsigned short *)(reader->data)); - } - reader->data += 2; - return ret; -} - -static inline PyObject *read_SInt32(Reader *reader) -{ - CHECK_LENGTH(reader, 4); - PyObject *ret = NULL; - if (reader->swap) - { - ret = PyLong_FromLong((signed int)bswap32(*(unsigned int *)reader->data)); - } - else - { - ret = PyLong_FromLong(*(signed int *)(reader->data)); - } - reader->data += 4; - return ret; -} - -static inline PyObject *read_UInt32(Reader *reader) -{ - CHECK_LENGTH(reader, 4); - PyObject *ret = NULL; - if (reader->swap) - { - ret = PyLong_FromUnsignedLong((unsigned int)bswap32(*(unsigned int *)reader->data)); - } - else - { - ret = PyLong_FromUnsignedLong(*(unsigned int *)(reader->data)); - } - reader->data += 4; - return ret; -} - -static inline PyObject *read_SInt64(Reader *reader) -{ - CHECK_LENGTH(reader, 8); - PyObject *ret = NULL; - if (reader->swap) - { - ret = PyLong_FromLongLong((signed long long)bswap64(*(unsigned long long *)reader->data)); - } - else - { - ret = PyLong_FromLongLong(*(signed long long *)(reader->data)); - } - reader->data += 8; - return ret; -} - -static inline PyObject *read_UInt64(Reader *reader) -{ - CHECK_LENGTH(reader, 8); - PyObject *ret = NULL; - if (reader->swap) - { - ret = PyLong_FromUnsignedLongLong((unsigned long long)bswap64(*(unsigned long long *)reader->data)); - } - else - { - ret = PyLong_FromUnsignedLongLong(*(unsigned long long *)(reader->data)); - } - reader->data += 8; - return ret; -} - -static inline PyObject *read_float(Reader *reader) -{ - CHECK_LENGTH(reader, 4); - PyObject *ret = NULL; - if (reader->swap) - { - ret = PyFloat_FromDouble((float)bswap32(*(unsigned int *)reader->data)); - } - else - { - ret = PyFloat_FromDouble(*(float *)(reader->data)); - } - reader->data += 4; - return ret; -} - -static inline PyObject *read_double(Reader *reader) -{ - CHECK_LENGTH(reader, 8); - PyObject *ret = NULL; - if (reader->swap) - { - ret = PyFloat_FromDouble((double)bswap64(*(unsigned long long *)reader->data)); - } - else - { - ret = PyFloat_FromDouble(*(double *)(reader->data)); - } - reader->data += 8; - return ret; -} - -static inline int read_length(Reader *reader) -{ - int length = *(int *)reader->data; - reader->data += 4; - if (reader->swap) - { - length = bswap32(length); - } - return length; -} - -static inline PyObject *read_string(Reader *reader) -{ - CHECK_LENGTH(reader, 4); - int length = read_length(reader); - CHECK_LENGTH(reader, length); - PyObject *str = PyUnicode_DecodeUTF8(reader->data, length, SURROGATEESCAPE); - reader->data += length; - // align - align4(reader); - return str; -} - -static inline PyObject *read_TypelessData(Reader *reader) -{ - CHECK_LENGTH(reader, 4); - int length = read_length(reader); - CHECK_LENGTH(reader, length); - PyObject *value = PyMemoryView_FromMemory(reader->data, length, PyBUF_READ); - reader->data += length; - return value; -} - -static inline read_type getReadFunction(int hash_value, int *index) -{ - switch (hash_value) - { - case HASH_SInt8: - return read_SInt8; - case HASH_UInt8: - case HASH_char: - return read_UInt8; - case HASH_SInt16: - case HASH_short: - return read_SInt16; - case HASH_UInt16: - case HASH_unsigned_short: - return read_UInt16; - case HASH_SInt32: - case HASH_int: - return read_SInt32; - case HASH_UInt32: - case HASH_unsigned_int: - case HASH_TypePtr: // Type* - return read_UInt32; - case HASH_SInt64: - case HASH_long_long: - return read_SInt64; - case HASH_UInt64: - case HASH_unsigned_long_long: - case HASH_FileSize: - return read_UInt64; - case HASH_float: - return read_float; - case HASH_double: - return read_double; - case HASH_bool: - return read_bool; - case HASH_string: - *index += 3; - return read_string; - case HASH_TypelessData: - *index += 2; - return read_TypelessData; - default: - return NULL; - } -} - -static PyObject *getSubNodes(PyObject *nodes, int *index) -{ - PyObject *result = NULL; - TypeTreeNodeObject *node = (TypeTreeNodeObject *)PyList_GetItem(nodes, *index); - unsigned short level = node->m_Level; - for (int i = *index + 1; i < PyList_Size(nodes); i++) - { - if (((TypeTreeNodeObject *)PyList_GetItem(nodes, i))->m_Level <= level) - { - result = PyList_GetSlice(nodes, *index, i); - *index = i - 1; - return result; - } - } - result = PyList_GetSlice(nodes, *index, PyList_Size(nodes)); - *index = PyList_Size(nodes) - 1; - return result; -} - -static inline int PyDict_SetItemString_Safe(PyObject *dict, const char *key, PyObject *value) -{ - int ret = PyDict_SetItemString(dict, key, value); - // SetItemString increases the ref count - // so we have to decrease it here again - // so that the value will be destroyed with the dict - Py_XDECREF(value); - return ret; -} - -static inline int PyList_SetItem_Safe(PyObject *list, int i, PyObject *value) -{ - int ret = PyList_SetItem(list, i, value); - // SetItem increases the ref count - // so we have to decrease it here again - // so that the value will be destroyed with the list - // Py_XDECREF(value); - return ret; -} - -static PyObject *TypeTreeHelper_ReadValue(PyObject *nodes, Reader *reader, int *index) -{ - if (*index >= PyList_Size(nodes)) - { - PyErr_SetString(PyExc_RuntimeError, "index out of range"); - return NULL; - } - TypeTreeNodeObject *node = (TypeTreeNodeObject *)PyList_GetItem(nodes, *index); - PyObject *value = NULL; - int sub_index = 0; - - char align = (node->m_MetaFlag & kAlignBytesFlag) ? 1 : 0; - // printf("RVa: %d\t%lld\t%s\t%s\t%d\t%d\n", *index, (reader->data - reader->dataStart), node->m_Name, node->m_Type, align, node->m_MetaFlag); - - int hash_value = node->typehash; - read_type func = getReadFunction(hash_value, index); - if (func) - { - value = func(reader); - } - else - { - if (hash_value == HASH_map) - { - TypeTreeNodeObject *node2 = (TypeTreeNodeObject *)PyList_GetItem(nodes, *index + 1); - if (node2->m_MetaFlag & kAlignBytesFlag) - align = 1; - - CHECK_LENGTH(reader, 4); - int size = read_length(reader); - - *index += 4; // skip self, Array, size, pair - PyObject *first_nodes = NULL; - read_type first_func = NULL; - char firstalign = 0; - initReadFuncOrNodes(nodes, index, &first_nodes, &first_func, &firstalign); - *index += 1; // move to start of second - PyObject *second_nodes = NULL; - read_type second_func = NULL; - char secondalign = 0; - initReadFuncOrNodes(nodes, index, &second_nodes, &second_func, &secondalign); - - value = PyList_New(size); - PyObject *first; - PyObject *second; - for (int i = 0; i < size; i++) - { - sub_index = 0; - first = (first_func) ? first_func(reader) : TypeTreeHelper_ReadValue(first_nodes, reader, &sub_index); - if (first == NULL) - { - Py_XDECREF(value); - return NULL; - } - if (firstalign) - align4(reader); - sub_index = 0; - second = (second_func) ? second_func(reader) : TypeTreeHelper_ReadValue(second_nodes, reader, &sub_index); - if (second == NULL) - { - Py_XDECREF(first); - Py_XDECREF(second); - return NULL; - } - if (secondalign) - align4(reader); - PyList_SetItem(value, i, PyTuple_Pack(2, first, second)); - Py_XDECREF(first); - Py_XDECREF(second); - } - Py_XDECREF(first_nodes); - Py_XDECREF(second_nodes); - } - else - { - if (*index+1 >= PyList_Size(nodes)) - { - // end of nodes reached, - // so an empty class is returned - return PyDict_New(); - } - TypeTreeNodeObject *node2 = (TypeTreeNodeObject *)PyList_GetItem(nodes, *index + 1); - if (strcmp(node2->m_Type, "Array") == 0) - { - if (node2->m_MetaFlag & kAlignBytesFlag) - align = 1; - *index += 3; // skip self, Array, size - PyObject *vector_nodes = NULL; - read_type vector_func = NULL; - char subalign = 0; - initReadFuncOrNodes(nodes, index, &vector_nodes, &vector_func, &subalign); - - int size = read_length(reader); - value = PyList_New(size); - for (int i = 0; i < size; i++) - { - int sub_index = 0; - PyObject *vector_value = (vector_func) ? vector_func(reader) : TypeTreeHelper_ReadValue(vector_nodes, reader, &sub_index); - if (vector_value == NULL) - { - Py_XDECREF(value); - return NULL; - } - if (subalign) - align4(reader); - PyList_SetItem_Safe(value, i, vector_value); - } - Py_XDECREF(vector_nodes); - } - else // Class - { - PyObject *cls_nodes = getSubNodes(nodes, index); - int j = 1; - value = PyDict_New(); - char *j_name = NULL; - while (j < PyList_Size(cls_nodes)) - { - j_name = ((TypeTreeNodeObject *)PyList_GetItem(cls_nodes, j))->m_Name; - PyObject *j_value = TypeTreeHelper_ReadValue(cls_nodes, reader, &j); - if (j_value == NULL) - { - Py_XDECREF(value); - return NULL; - } - PyDict_SetItemString_Safe(value, j_name, j_value); - j++; - } - Py_XDECREF(cls_nodes); - } - } - } - - if (align) - align4(reader); - return value; -} - -static PyObject *TypeTreeHelper_ReadTypeTree(PyObject *nodes, PyObject *buf, char swap) -{ - Py_buffer view; - if (Py_TYPE(buf)->tp_as_buffer && Py_TYPE(buf)->tp_as_buffer->bf_releasebuffer) - { - buf = PyMemoryView_FromObject(buf); - if (buf == NULL) - { - return NULL; - } - } - else - { - Py_INCREF(buf); - } - - if (PyObject_GetBuffer(buf, &view, PyBUF_WRITABLE | PyBUF_SIMPLE) < 0) - { - PyErr_Clear(); - if (PyObject_GetBuffer(buf, &view, PyBUF_SIMPLE) < 0) - { - Py_DECREF(buf); - return NULL; - } - } - - Reader reader = { - .data = (char *)view.buf, - .dataStart = (char *)view.buf, - .dataEnd = (char *)view.buf + view.len, - .swap = swap, - .obj = buf}; - - PyBuffer_Release(&view); - - int index = 0; - PyObject *result = TypeTreeHelper_ReadValue(nodes, &reader, &index); - - Py_DECREF(buf); - - return result; -} - -PyObject *read_typetree(PyObject *self, PyObject *args) -{ - PyObject *nodes = PyTuple_GetItem(args, 0); - PyObject *buf = PyTuple_GetItem(args, 1); - PyObject *swap_obj = PyTuple_GetItem(args, 2); - char swap = 0; - - if (!PyUnicode_Check(swap_obj)) - { - PyErr_SetString(PyExc_TypeError, - "The endian attribute value must be a string"); - return NULL; - } - if (PyUnicode_GET_LENGTH(swap_obj) != 1) - { - PyErr_SetString(PyExc_TypeError, - "The endian attribute value must be a string of size 1"); - return NULL; - } - char endian = *(char *)PyUnicode_DATA(swap_obj); - switch (endian) - { - case '<': - if (IS_LITTLE_ENDIAN == 0) - swap = 1; - break; - case '>': - if (IS_LITTLE_ENDIAN == 1) - swap = 1; - break; - case '=': - case '|': - break; - default: - { - PyErr_SetString(PyExc_TypeError, - "The endian attribute value must be one of '>', '<', '=', '|'"); - return NULL; - } - } - return TypeTreeHelper_ReadTypeTree(nodes, buf, swap); -} - -static void -TypeTreeNode_dealloc(TypeTreeNodeObject *self) -{ - PyMem_Free(self->m_Name); - PyMem_Free(self->m_Type); - // for (unsigned short i = 0; i < self->children_count; i++) - // { - // Py_DECREF((PyObject*)self->children[i]); - // } - // PyMem_Free(self->children); - Py_TYPE(self)->tp_free((PyObject *)self); -} - -PyObject * -TypeTreeNode_new(PyTypeObject *type, PyObject *args, PyObject *kwds) -{ - TypeTreeNodeObject *self; - self = (TypeTreeNodeObject *)type->tp_alloc(type, 0); - if (self != NULL) - { - self->m_Version = 0; - self->m_Level = 0; - self->m_TypeFlags = 0; - self->m_ByteSize = 0; - self->m_Index = 0; - self->m_MetaFlag = 0; - self->m_Type = PyMem_Malloc(sizeof(char)); - self->m_Name = PyMem_Malloc(sizeof(char)); - self->m_Type[0] = '\0'; - self->m_Name[0] = '\0'; - // self->children_count = 0; - // self->children = NULL; - self->m_TypeStrOffset = 0; - self->m_NameStrOffset = 0; - self->m_RefTypeHash = 0; - self->m_VariableCount = 0; - } - return (PyObject *)self; -} - -static int -TypeTreeNode_init(TypeTreeNodeObject *self, PyObject *args, PyObject *kwds) -{ - static char *kwlist[] = { - "m_Name", // char* - "m_Type", // char* - "m_Level", // uint8 - "m_MetaFlag", // int32 - "m_Version", // int16 - "m_TypeFlags", // int32 - "m_ByteSize", // int - "m_Index", // int - "m_TypeStrOffset", // unsigned int - "m_NameStrOffset", // unsigned int - "m_RefTypeHash", // unsigned long long - "m_VariableCount", // int - NULL}; - const char *type = NULL; - const char *name = NULL; - if (!PyArg_ParseTupleAndKeywords( - args, - kwds, - "|zzbihiiiIIKi", - kwlist, - &name, - &type, - &self->m_Level, - &self->m_MetaFlag, - &self->m_Version, - &self->m_TypeFlags, - &self->m_ByteSize, - &self->m_Index, - &self->m_TypeStrOffset, - &self->m_NameStrOffset, - &self->m_RefTypeHash, - &self->m_VariableCount)) - return -1; - if (type != NULL) - { - PyMem_Free(self->m_Type); - self->m_Type = PyMem_Malloc(strlen(type) + 1); - strcpy(self->m_Type, type); - self->typehash = hash_str(type); - } - if (name != NULL) - { - PyMem_Free(self->m_Name); - self->m_Name = PyMem_Malloc(strlen(name) + 1); - strcpy(self->m_Name, name); - } - return 0; -}; - -static PyObject * -TypeTreeNode_getType(TypeTreeNodeObject *self, void *closure) -{ - return PyUnicode_DecodeUTF8(self->m_Type, strlen(self->m_Type), SURROGATEESCAPE); -} - -static int -TypeTreeNode_setType(TypeTreeNodeObject *self, PyObject *value, void *closure) -{ - if (!PyUnicode_Check(value)) - { - PyErr_SetString(PyExc_TypeError, "The type attribute value must be a string"); - return -1; - } - PyMem_Free(self->m_Type); - char *type = PyUnicode_AsUTF8(value); - self->m_Type = PyMem_Malloc(strlen(type) + 1); - strcpy(self->m_Type, type); - self->typehash = hash_str(type); - return 0; -} - -static PyObject * -TypeTreeNode_getName(TypeTreeNodeObject *self, void *closure) -{ - return PyUnicode_DecodeUTF8(self->m_Name, strlen(self->m_Name), SURROGATEESCAPE); -} - -static int -TypeTreeNode_setName(TypeTreeNodeObject *self, PyObject *value, void *closure) -{ - if (!PyUnicode_Check(value)) - { - PyErr_SetString(PyExc_TypeError, "The name attribute value must be a string"); - return -1; - } - PyMem_Free(self->m_Name); - char *name = PyUnicode_AsUTF8(value); - self->m_Name = PyMem_Malloc(strlen(name) + 1); - strcpy(self->m_Name, name); - return 0; -} - -static PyMemberDef TypeTreeNode_members[] = { - //{"m_Type", T_STRING, offsetof(TypeTreeNodeObject, m_Type), 0, ""}, - //{"m_Name", T_STRING, offsetof(TypeTreeNodeObject, m_Name), 0, ""}, - {"m_ByteSize", T_INT, offsetof(TypeTreeNodeObject, m_ByteSize), 0, ""}, - {"m_Index", T_INT, offsetof(TypeTreeNodeObject, m_Index), 0, ""}, - {"m_TypeFlags", T_INT, offsetof(TypeTreeNodeObject, m_TypeFlags), 0, ""}, - {"m_Version", T_SHORT, offsetof(TypeTreeNodeObject, m_Version), 0, ""}, - {"m_MetaFlag", T_INT, offsetof(TypeTreeNodeObject, m_MetaFlag), 0, ""}, - {"m_Level", T_UBYTE, offsetof(TypeTreeNodeObject, m_Level), 0, ""}, - {"m_TypeStrOffset", T_UINT, offsetof(TypeTreeNodeObject, m_TypeStrOffset), 0, ""}, - {"m_NameStrOffset", T_UINT, offsetof(TypeTreeNodeObject, m_NameStrOffset), 0, ""}, - {"m_RefTypeHash", T_ULONGLONG, offsetof(TypeTreeNodeObject, m_RefTypeHash), 0, ""}, - {"m_VariableCount", T_INT, offsetof(TypeTreeNodeObject, m_VariableCount), 0, ""}, - {NULL} /* Sentinel */ -}; - -static PyGetSetDef TypeTreeNode_getsetters[] = { - {"m_Type", (getter)TypeTreeNode_getType, (setter)TypeTreeNode_setType, - "", NULL}, - {"m_Name", (getter)TypeTreeNode_getName, (setter)TypeTreeNode_setName, - "", NULL}, - {NULL} /* Sentinel */ -}; - -static PyObject * -TypeTreeNode_repr(PyObject *self) -{ - TypeTreeNodeObject *node = (TypeTreeNodeObject *)self; - return PyUnicode_FromFormat( - "", - node->m_Level, - node->m_Type, - node->m_Name); -} - -// PyTypeObject TypeTreeNodeType; - -// static int -// TypeTreeNode_set_children(TypeTreeNodeObject *self, PyObject *value, void *closure) -// { -// PyObject *tmp; -// if (value == NULL) -// { -// PyErr_SetString(PyExc_TypeError, "Cannot delete the children attribute"); -// return -1; -// } -// if (!PyList_Check(value)) -// { -// PyErr_SetString(PyExc_TypeError, "The children attribute value must be a list"); -// return -1; -// } -// for (unsigned short i = 0; i < self->children_count; i++) -// { -// Py_DECREF((PyObject*)self->children[i]); -// } -// PyMem_Free(self->children); -// self->children_count = PyList_Size(value); -// self->children = PyMem_Malloc(sizeof(TypeTreeNodeObject *) * self->children_count); -// for (unsigned short i = 0; i < self->children_count; i++) -// { -// tmp = PyList_GetItem(value, i); -// if (!PyObject_TypeCheck(tmp, &TypeTreeNodeType)) -// { -// PyErr_SetString(PyExc_TypeError, "The children attribute value must be a list of TypeTreeNode objects"); -// return -1; -// } -// self->children[i] = (TypeTreeNodeObject *)tmp; -// Py_INCREF(tmp); -// } -// return 0; -// } - -// static PyGetSetDef TypeTreeNode_getsetters[] = { -// {"children", (getter) TypeTreeNode_get_children, (setter) TypeTreeNode_set_children, -// "", NULL}, -// {NULL} /* Sentinel */ -// }; - -PyTypeObject TypeTreeNodeType = { - PyVarObject_HEAD_INIT(NULL, 0) - .tp_name = "UnityPyBoost.TypeTreeNode", - .tp_doc = PyDoc_STR("TypeTreeNode objects"), - .tp_basicsize = sizeof(TypeTreeNodeObject), - .tp_itemsize = 0, - .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, - .tp_new = TypeTreeNode_new, - .tp_init = (initproc)TypeTreeNode_init, - .tp_dealloc = (destructor)TypeTreeNode_dealloc, - .tp_members = TypeTreeNode_members, - .tp_getset = TypeTreeNode_getsetters, - .tp_repr = (reprfunc)TypeTreeNode_repr, -}; - -int add_typetreenode_to_module(PyObject *m) -{ - if (PyType_Ready(&TypeTreeNodeType) < 0) - return -1; - Py_INCREF(&TypeTreeNodeType); - PyModule_AddObject(m, "TypeTreeNode", (PyObject *)&TypeTreeNodeType); - return 0; -} diff --git a/UnityPyBoost/TypeTreeHelper.cpp b/UnityPyBoost/TypeTreeHelper.cpp new file mode 100644 index 00000000..1b49208f --- /dev/null +++ b/UnityPyBoost/TypeTreeHelper.cpp @@ -0,0 +1,746 @@ +#include +#include +#include +#include +#include + +// TypeTreeReader - impl + +typedef struct Reader +{ + uint8_t *ptr; + uint8_t *end; + uint8_t *start; +} ReaderT; + +typedef struct TypeTreeReaderConfig +{ + bool as_dict; + PyObject *classes; + PyObject *assetfile; + PyObject *clean_name; +} TypeTreeReaderConfigT; + +inline void align4(ReaderT *reader) +{ + size_t offset = (size_t)reader->ptr - (size_t)reader->start; + size_t aligned_offset = (offset + 4 - 1) & ~(4 - 1); + reader->ptr = reader->start + aligned_offset; +} + +inline PyObject *read_bool(ReaderT *reader) +{ + if (reader->ptr + 1 > reader->end) + { + PyErr_SetString(PyExc_ValueError, "read_bool out of bounds"); + return NULL; + } + return *reader->ptr++ ? Py_True : Py_False; +} + +inline PyObject *read_u8(ReaderT *reader) +{ + if (reader->ptr + 1 > reader->end) + { + PyErr_SetString(PyExc_ValueError, "read_u8 out of bounds"); + return NULL; + } + return PyLong_FromUnsignedLong(*reader->ptr++); +} + +inline PyObject *read_s8(ReaderT *reader) +{ + if (reader->ptr + 1 > reader->end) + { + PyErr_SetString(PyExc_ValueError, "read_s8 out of bounds"); + return NULL; + } + return PyLong_FromLong((int8_t)*reader->ptr++); +} + +template +inline PyObject *read_int(ReaderT *reader) +{ + static_assert(std::is_integral::value, "Unsupported type for read_int"); + + if (reader->ptr + sizeof(T) > reader->end) + { + PyErr_SetString(PyExc_ValueError, "read_int out of bounds"); + return NULL; + } + T value = *(T *)reader->ptr; + if constexpr (swap) + { + swap_any_inplace(&value); + } + reader->ptr += sizeof(T); + if constexpr (std::is_signed::value) + { + if constexpr (std::is_same::value) + { + return PyLong_FromLongLong(value); + } + else + { + return PyLong_FromLong((int32_t)value); + } + } + else + { + if constexpr (std::is_same::value) + { + return PyLong_FromUnsignedLongLong(value); + } + else + { + return PyLong_FromUnsignedLong((uint32_t)value); + } + } +} + +template +inline PyObject *read_float(ReaderT *reader) +{ + static_assert(std::is_floating_point::value, "Unsupported type for read_float"); + + if (reader->ptr + sizeof(T) > reader->end) + { + PyErr_SetString(PyExc_ValueError, "read_float out of bounds"); + return NULL; + } + T value = *(T *)reader->ptr; + if constexpr (swap) + { + swap_any_inplace(&value); + } + reader->ptr += sizeof(T); + return PyFloat_FromDouble(value); +} + +template +inline bool _read_length(ReaderT *reader, int32_t *length) +{ + if (reader->ptr + sizeof(int32_t) > reader->end) + { + PyErr_SetString(PyExc_ValueError, "read_length out of bounds"); + return false; + } + *length = *(int32_t *)reader->ptr; + if constexpr (swap) + { + swap_any_inplace(length); + } + reader->ptr += sizeof(int32_t); + return true; +} + +template +inline PyObject *read_str(ReaderT *reader) +{ + int32_t length; + if (!_read_length(reader, &length)) + { + return NULL; + } + if (reader->ptr + length > reader->end) + { + PyErr_SetString(PyExc_ValueError, "read_str out of bounds"); + return NULL; + } + PyObject *str = PyUnicode_DecodeUTF8((char *)reader->ptr, length, "surrogateescape"); + reader->ptr += length; + align4(reader); + return str; +} + +template +inline PyObject *read_bytes(ReaderT *reader) +{ + int32_t length; + if (!_read_length(reader, &length)) + { + return NULL; + } + if (reader->ptr + length > reader->end) + { + PyErr_SetString(PyExc_ValueError, "read_bytes out of bounds"); + return NULL; + } + PyObject *bytes = PyBytes_FromStringAndSize((char *)reader->ptr, length); + reader->ptr += length; + return bytes; +} + +template +inline PyObject *read_pair(ReaderT *reader, TypeTreeNodeObject *node, TypeTreeReaderConfigT *config) +{ + if (PyList_GET_SIZE(node->m_Children) != 2) + { + PyErr_SetString(PyExc_ValueError, "Pair node must have 2 children"); + return NULL; + } + + PyObject *first = read_typetree_value(reader, (TypeTreeNodeObject *)PyList_GetItem(node->m_Children, 0), config); + if (!first) + { + return NULL; + } + PyObject *second = read_typetree_value(reader, (TypeTreeNodeObject *)PyList_GetItem(node->m_Children, 1), config); + if (!second) + { + Py_DECREF(first); + return NULL; + } + PyObject *pair = PyTuple_Pack(2, first, second); + Py_DECREF(first); + Py_DECREF(second); + return pair; +} + +inline PyObject *class_from_dict(PyObject *dict, TypeTreeNodeObject *node, TypeTreeReaderConfigT *config) +{ + PyObject *clz = NULL; + PyObject *args = NULL; + PyObject *instance = NULL; + PyObject *keys = NULL; + PyObject *clean_args = NULL; + PyObject *annotations = NULL; + PyObject *extra = NULL; + + // Determine the class based on node's _data_type + if (node->_data_type == NodeDataType::pptr) + { + // Add 'assetsfile' key for PPtr objects + if (PyDict_SetItemString(dict, "assetsfile", config->assetfile) != 0) + { + PyErr_SetString(PyExc_RuntimeError, "Failed to set 'assetsfile'"); + goto error_cleanup; + } + clz = PyObject_GetAttrString(config->classes, "PPtr"); + } + else + { + clz = PyObject_GetAttr(config->classes, node->m_Type); + if (clz == NULL) + { + clz = PyObject_GetAttrString(config->classes, "Object"); + } + } + + // If class lookup fails, raise an error + if (clz == NULL) + { + PyErr_SetString(PyExc_ValueError, "Failed to get class"); + goto error_cleanup; + } + + // Prepare arguments (empty tuple) + args = PyTuple_New(0); + if (args == NULL) + { + goto error_cleanup; + } + + // Attempt to create the instance from the class and dict + instance = PyObject_Call(clz, args, dict); + if (instance != NULL) + { + goto success; + } + PyErr_Clear(); + + // If calling the class failed, check for callable clean_name function + if (!PyCallable_Check(config->clean_name)) + { + PyErr_SetString(PyExc_ValueError, "clean_name is not callable"); + goto error_cleanup; + } + + // Clean the dictionary keys + keys = PyDict_Keys(dict); + clean_args = PyTuple_New(1); // For passing to the clean_name function + if (keys == NULL || clean_args == NULL) + { + goto error_cleanup; + } + + // Iterate through dict keys, clean them, and update if necessary + for (Py_ssize_t i = 0; i < PyList_Size(keys); i++) + { + PyObject *key = PyList_GetItem(keys, i); + Py_INCREF(key); // Protect reference count + + PyTuple_SetItem(clean_args, 0, key); + PyObject *clean_key = PyObject_CallFunctionObjArgs(config->clean_name, clean_args, NULL); + if (clean_key == NULL) + { + Py_DECREF(key); + goto error_cleanup; + } + + if (PyUnicode_Compare(key, clean_key) != 0) + { + // Replace the key in the dict with the cleaned key + PyObject *value = PyDict_GetItem(dict, key); + if (value != NULL) + { + PyDict_DelItem(dict, key); + PyDict_SetItem(dict, clean_key, value); + } + } + Py_DECREF(clean_key); + Py_DECREF(key); + } + + // Retry creating the class instance with cleaned dictionary + instance = PyObject_Call(clz, args, dict); + if (instance != NULL) + { + goto success; + } + + // Handle extra attributes not present in class annotations + annotations = PyObject_GetAttrString(clz, "__annotations__"); + if (annotations == NULL) + { + PyErr_SetString(PyExc_ValueError, "Failed to get annotations"); + goto error_cleanup; + } + + extra = PyDict_New(); + for (Py_ssize_t i = 0; i < PyList_Size(keys); i++) + { + PyObject *key = PyList_GetItem(keys, i); + if (PyDict_Contains(annotations, key) == 0) + { + PyObject *value = PyDict_GetItem(dict, key); + PyDict_SetItem(extra, key, value); + PyDict_DelItem(dict, key); + } + } + + instance = PyObject_Call(clz, args, dict); + if (instance != NULL) + { + // Set extra attributes on the instance + keys = PyDict_Keys(extra); + for (Py_ssize_t i = 0; i < PyList_Size(keys); i++) + { + PyObject *key = PyList_GetItem(keys, i); + PyObject *value = PyDict_GetItem(extra, key); + PyObject_SetAttr(instance, key, value); + } + goto success; + } + + PyErr_SetString(PyExc_ValueError, "Failed to create instance"); + goto error_cleanup; + +success: + // Cleanup and return the instance + Py_DECREF(args); + Py_DECREF(clz); + Py_DECREF(dict); + Py_XDECREF(keys); + Py_XDECREF(clean_args); + Py_XDECREF(annotations); + Py_XDECREF(extra); + return instance; + +error_cleanup: + // Cleanup in case of an error + Py_XDECREF(args); + Py_XDECREF(clz); + Py_XDECREF(dict); + Py_XDECREF(keys); + Py_XDECREF(clean_args); + Py_XDECREF(annotations); + Py_XDECREF(extra); + return NULL; +} + +template +PyObject *read_typetree_value(ReaderT *reader, TypeTreeNodeObject *node, TypeTreeReaderConfigT *config) +{ + bool align = node->_align; + PyObject *value = nullptr; + + switch (node->_data_type) + { + case NodeDataType::u8: + value = read_u8(reader); + break; + case NodeDataType::u16: + value = read_int(reader); + break; + case NodeDataType::u32: + value = read_int(reader); + break; + case NodeDataType::u64: + value = read_int(reader); + break; + case NodeDataType::s8: + value = read_s8(reader); + break; + case NodeDataType::s16: + value = read_int(reader); + break; + case NodeDataType::s32: + value = read_int(reader); + break; + case NodeDataType::s64: + value = read_int(reader); + break; + case NodeDataType::f32: + value = read_float(reader); + break; + case NodeDataType::f64: + value = read_float(reader); + break; + case NodeDataType::boolean: + value = read_bool(reader); + break; + case NodeDataType::str: + value = read_str(reader); + break; + case NodeDataType::bytes: + value = read_bytes(reader); + break; + case NodeDataType::pair: + value = read_pair(reader, node, config); + break; + default: + TypeTreeNodeObject *child = nullptr; + if (PyList_GET_SIZE(node->m_Children) > 0) + { + child = (TypeTreeNodeObject *)PyList_GetItem(node->m_Children, 0); + } + + if (child && child->_data_type == NodeDataType::array) + { + // array + if (child->_align) + { + align = true; + } + int32_t length; + if (!_read_length(reader, &length)) + { + return NULL; + } + value = PyList_New(length); + child = (TypeTreeNodeObject *)PyList_GetItem(child->m_Children, 1); + for (int i = 0; i < length; i++) + { + PyObject *item = read_typetree_value(reader, child, config); + if (!item) + { + Py_DECREF(value); + return NULL; + } + PyList_SET_ITEM(value, i, item); + } + } + else + { + // class + value = PyDict_New(); + for (int i = 0; i < PyList_GET_SIZE(node->m_Children); i++) + { + child = (TypeTreeNodeObject *)PyList_GetItem(node->m_Children, i); + PyObject *child_value = read_typetree_value(reader, child, config); + if (!child_value) + { + Py_DECREF(value); + return NULL; + } + if (PyDict_SetItem(value, child->m_Name, child_value)) + { + Py_DECREF(value); + Py_DECREF(child_value); + return NULL; + } + // dict increases ref count, so we need to decref here + Py_DECREF(child_value); + } + if (!config->as_dict) + { + value = class_from_dict(value, node, config); + } + } + } + + if (align) + { + align4(reader); + } + + return value; +} + +PyObject *read_typetree(PyObject *self, PyObject *args, PyObject *kwargs) +{ + const char *kwlist[] = {"data", "node", "endian", "as_dict", "assetsfile", "classes", "clean_name", NULL}; + PyObject *data; + PyObject *node; + PyObject *as_dict = Py_True; + + TypeTreeReaderConfigT config = { + false, + Py_None, + Py_None, + Py_None}; + + char endian; + bool swap; + + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OOC|OOOO", (char **)kwlist, &data, &node, &endian, &as_dict, &config.assetfile, &config.classes, &config.clean_name)) + { + return NULL; + } + + volatile uint16_t bint = 0x0100; + volatile bool is_big_endian = ((uint8_t *)&bint)[0] == 1; + + switch (endian) + { + case '<': + if (is_big_endian) + { + swap = true; + } + else + { + swap = false; + } + break; + case '>': + if (is_big_endian) + { + swap = false; + } + else + { + swap = true; + } + break; + default: + PyErr_SetString(PyExc_ValueError, "Invalid endian"); + break; + } + Py_buffer view; + + if (PyObject_GetBuffer(data, &view, PyBUF_SIMPLE) == -1) + { + PyErr_SetString(PyExc_ValueError, "Failed to get buffer"); + return NULL; + } + ReaderT reader = {static_cast(view.buf), static_cast(view.buf) + view.len, static_cast(view.buf)}; + config.as_dict = Py_IsTrue(as_dict) == 1; + + PyObject *value; + if (swap) + { + value = read_typetree_value(&reader, (TypeTreeNodeObject *)node, &config); + } + else + { + value = read_typetree_value(&reader, (TypeTreeNodeObject *)node, &config); + } + + PyBuffer_Release(&view); + + return value; +} + +// TypeTreeNode impl +static void TypeTreeNode_dealloc(TypeTreeNodeObject *self) +{ + Py_XDECREF(self->m_Level); + Py_XDECREF(self->m_Type); + Py_XDECREF(self->m_Name); + Py_XDECREF(self->m_ByteSize); + Py_XDECREF(self->m_TypeFlags); + Py_XDECREF(self->m_Version); + Py_XDECREF(self->m_VariableCount); + Py_XDECREF(self->m_Index); + Py_XDECREF(self->m_MetaFlag); + Py_XDECREF(self->m_RefTypeHash); + Py_XDECREF(self->m_Children); + Py_TYPE(self)->tp_free((PyObject *)self); +} + +static const std::map typeToNodeDataType = { + {"SInt8", NodeDataType::s8}, + {"UInt8", NodeDataType::u8}, + {"char", NodeDataType::u8}, + {"short", NodeDataType::s16}, + {"SInt16", NodeDataType::s16}, + {"unsigned short", NodeDataType::u16}, + {"UInt16", NodeDataType::u16}, + {"int", NodeDataType::s32}, + {"SInt32", NodeDataType::s32}, + {"unsigned int", NodeDataType::u32}, + {"UInt32", NodeDataType::u32}, + {"Type*", NodeDataType::u32}, + {"long long", NodeDataType::s64}, + {"SInt64", NodeDataType::s64}, + {"unsigned long long", NodeDataType::u64}, + {"UInt64", NodeDataType::u64}, + {"FileSignature", NodeDataType::u64}, + {"float", NodeDataType::f32}, + {"double", NodeDataType::f64}, + {"bool", NodeDataType::boolean}, + {"string", NodeDataType::str}, + {"TypelessData", NodeDataType::bytes}, + {"pair", NodeDataType::pair}, + {"Array", NodeDataType::array}, +}; + +static int TypeTreeNode_init(TypeTreeNodeObject *self, PyObject *args, PyObject *kwargs) +{ + const char *kwlist[] = { + "m_Level", + "m_Type", + "m_Name", + "m_ByteSize", + "m_TypeFlags", + "m_Version", + "m_Children", + "m_VariableCount", + "m_Index", + "m_MetaFlag", + "m_RefTypeHash", + NULL}; + + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OOOOOO|OOOOO", (char **)kwlist, + &self->m_Level, + &self->m_Type, + &self->m_Name, + &self->m_ByteSize, + &self->m_TypeFlags, + &self->m_Version, + &self->m_Children, + &self->m_VariableCount, + &self->m_Index, + &self->m_MetaFlag, + &self->m_RefTypeHash)) + { + return -1; + } + + Py_INCREF(self->m_Level); + Py_INCREF(self->m_Type); + Py_INCREF(self->m_Name); + Py_INCREF(self->m_ByteSize); + Py_INCREF(self->m_TypeFlags); + Py_INCREF(self->m_Version); + // optional fields + if (self->m_Children == nullptr) + { + self->m_Children = PyList_New(0); + } + else + { + Py_XINCREF(self->m_Children); + } + if (self->m_VariableCount == nullptr) + { + self->m_VariableCount = Py_None; + } + else + { + Py_INCREF(self->m_VariableCount); + } + if (self->m_Index == nullptr) + { + self->m_Index = Py_None; + } + else + { + Py_INCREF(self->m_Index); + } + if (self->m_MetaFlag == nullptr) + { + self->m_MetaFlag = Py_None; + } + else + { + Py_INCREF(self->m_MetaFlag); + } + if (self->m_RefTypeHash == nullptr) + { + self->m_RefTypeHash = Py_None; + } + else + { + Py_INCREF(self->m_RefTypeHash); + } + + if (self->m_MetaFlag != Py_None && PyLong_AsLong(self->m_MetaFlag) & 0x4000) + { + self->_align = true; + } + + if (self->m_Type != Py_None) + { + const char *type = PyUnicode_AsUTF8(self->m_Type); + self->_data_type = NodeDataType::unk; + if (type[0] == 'P' && type[1] == 'P' && type[2] == 't' && type[3] == 'r' && type[4] == '<') + { + self->_data_type = NodeDataType::pptr; + } + else + { + for (auto it = typeToNodeDataType.begin(); it != typeToNodeDataType.end(); ++it) + { + if (strcmp(it->first, type) == 0) + { + self->_data_type = it->second; + break; + } + } + } + } + + return 0; +} + +static PyMemberDef TypeTreeNode_members[] = { + {"m_Level", T_OBJECT_EX, offsetof(TypeTreeNodeObject, m_Level), 0, ""}, + {"m_Type", T_OBJECT_EX, offsetof(TypeTreeNodeObject, m_Type), 0, ""}, + {"m_Name", T_OBJECT_EX, offsetof(TypeTreeNodeObject, m_Name), 0, ""}, + {"m_ByteSize", T_OBJECT_EX, offsetof(TypeTreeNodeObject, m_ByteSize), 0, ""}, + {"m_TypeFlags", T_OBJECT_EX, offsetof(TypeTreeNodeObject, m_TypeFlags), 0, ""}, + {"m_Version", T_OBJECT_EX, offsetof(TypeTreeNodeObject, m_Version), 0, ""}, + {"m_Children", T_OBJECT_EX, offsetof(TypeTreeNodeObject, m_Children), 0, ""}, + {"m_VariableCount", T_OBJECT_EX, offsetof(TypeTreeNodeObject, m_VariableCount), 0, ""}, + {"m_Index", T_OBJECT_EX, offsetof(TypeTreeNodeObject, m_Index), 0, ""}, + {"m_MetaFlag", T_OBJECT_EX, offsetof(TypeTreeNodeObject, m_MetaFlag), 0, ""}, + {"m_RefTypeHash", T_OBJECT_EX, offsetof(TypeTreeNodeObject, m_RefTypeHash), 0, ""}, + {NULL} /* Sentinel */ +}; + +static PyTypeObject TypeTreeNodeType = []() -> PyTypeObject +{ + PyTypeObject type = {PyObject_HEAD_INIT(NULL) 0}; + type.tp_name = "TypeTreeHelper.TypeTreeNode"; + type.tp_doc = "TypeTreeNode objects"; + type.tp_basicsize = sizeof(TypeTreeNodeObject); + type.tp_itemsize = 0; + type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE; + type.tp_new = PyType_GenericNew; + type.tp_init = (initproc)TypeTreeNode_init; + type.tp_dealloc = (destructor)TypeTreeNode_dealloc; + type.tp_members = TypeTreeNode_members; + return type; +}(); + +int add_typetreenode_to_module(PyObject *m) +{ + if (PyType_Ready(&TypeTreeNodeType) < 0) + return -1; + Py_INCREF(&TypeTreeNodeType); + PyModule_AddObject(m, "TypeTreeNode", (PyObject *)&TypeTreeNodeType); + return 0; +} diff --git a/UnityPyBoost/TypeTreeHelper.h b/UnityPyBoost/TypeTreeHelper.h deleted file mode 100644 index 8de8fea6..00000000 --- a/UnityPyBoost/TypeTreeHelper.h +++ /dev/null @@ -1,31 +0,0 @@ -#define PY_SSIZE_T_CLEAN -#pragma once -#include -#include "structmember.h" - -typedef struct TypeTreeNodeObject{ - PyObject_HEAD - short m_Version; - unsigned char m_Level; - int m_TypeFlags; - int m_ByteSize; - int m_Index; - int m_MetaFlag; - char *m_Type; - char *m_Name; - //unsigned short children_count; - //struct TypeTreeNodeObject **children; - // UnityFS - unsigned int m_TypeStrOffset; - unsigned int m_NameStrOffset; - // UnityFS - version >= 19 - unsigned long long m_RefTypeHash; - // UnityRaw - versin = 2 - int m_VariableCount; - // helper fields - unsigned int typehash; -} TypeTreeNodeObject; - -int add_typetreenode_to_module(PyObject *m); - -PyObject* read_typetree(PyObject *self, PyObject *args); \ No newline at end of file diff --git a/UnityPyBoost/TypeTreeHelper.hpp b/UnityPyBoost/TypeTreeHelper.hpp new file mode 100644 index 00000000..eb226d8c --- /dev/null +++ b/UnityPyBoost/TypeTreeHelper.hpp @@ -0,0 +1,51 @@ +#define PY_SSIZE_T_CLEAN +#pragma once +#include +#include "structmember.h" +#include + +enum NodeDataType +{ + u8 = 0, + u16 = 1, + u32 = 2, + u64 = 3, + s8 = 4, + s16 = 5, + s32 = 6, + s64 = 7, + f32 = 8, + f64 = 9, + boolean = 10, + str = 11, + bytes = 12, + pair = 13, + array = 14, + pptr = 15, + unk = 255 +}; + +typedef struct TypeTreeNodeObject +{ + PyObject_HEAD + // helper field - simple hash of type for faster comparison + unsigned int _data_type; + bool _align; + // used filds for fast access + PyObject* m_Children; + PyObject *m_Name; + // fields not used in C + PyObject *m_Level; + PyObject *m_Type; + PyObject *m_ByteSize; + PyObject *m_TypeFlags; + PyObject *m_Version; + PyObject *m_VariableCount; + PyObject *m_Index; + PyObject *m_MetaFlag; + PyObject *m_RefTypeHash; +} TypeTreeNodeObject; + +int add_typetreenode_to_module(PyObject *m); + +PyObject *read_typetree(PyObject *self, PyObject *args, PyObject *kwargs); diff --git a/UnityPyBoost/UnityPyBoost.c b/UnityPyBoost/UnityPyBoost.cpp similarity index 90% rename from UnityPyBoost/UnityPyBoost.c rename to UnityPyBoost/UnityPyBoost.cpp index 84ced41f..fab8de5f 100644 --- a/UnityPyBoost/UnityPyBoost.c +++ b/UnityPyBoost/UnityPyBoost.cpp @@ -1,10 +1,10 @@ #define PY_SSIZE_T_CLEAN #pragma once #include -#include "AnimationClip.h" -#include "Mesh.h" -#include "TextureSwizzler.h" -#include "TypeTreeHelper.h" +#include "AnimationClip.hpp" +#include "Mesh.hpp" +#include "TextureSwizzler.hpp" +#include "TypeTreeHelper.hpp" /* Mesh.py */ @@ -23,7 +23,7 @@ static struct PyMethodDef method_table[] = { "replacement for VertexData to ComponentData in Mesh.ReadVertexData"}, {"read_typetree", (PyCFunction)read_typetree, - METH_VARARGS, + METH_VARARGS | METH_KEYWORDS, "replacement for TypeTreeHelper.read_typetree"}, {"switch_deswizzle", (PyCFunction)switch_deswizzle, diff --git a/UnityPyBoost/swap.h b/UnityPyBoost/swap.h deleted file mode 100644 index 5597a232..00000000 --- a/UnityPyBoost/swap.h +++ /dev/null @@ -1,35 +0,0 @@ -// check if the system is little endian -#define IS_LITTLE_ENDIAN (*(unsigned char *)&(unsigned short){1}) - -// set swap funcions (source: old version of nodejs/src/node_buffer.cc) -#if defined(__GNUC__) || defined(__clang__) -#define bswap16(x) __builtin_bswap16(x) -#define bswap32(x) __builtin_bswap32(x) -#define bswap64(x) __builtin_bswap64(x) -#elif defined(__linux__) -#include -#define bswap16(x) bswap_16(x) -#define bswap32(x) bswap_32(x) -#define bswap64(x) bswap_64(x) -#elif defined(_MSC_VER) -#include -#define bswap16(x) _byteswap_ushort(x) -#define bswap32(x) _byteswap_ulong(x) -#define bswap64(x) _byteswap_uint64(x) -#else -#define bswap16 ((x) << 8) | ((x) >> 8) -#define bswap32 \ - (((x)&0xFF) << 24) | \ - (((x)&0xFF00) << 8) | \ - (((x) >> 8) & 0xFF00) | \ - (((x) >> 24) & 0xFF) -#define bswap64 \ - (((x)&0xFF00000000000000ull) >> 56) | \ - (((x)&0x00FF000000000000ull) >> 40) | \ - (((x)&0x0000FF0000000000ull) >> 24) | \ - (((x)&0x000000FF00000000ull) >> 8) | \ - (((x)&0x00000000FF000000ull) << 8) | \ - (((x)&0x0000000000FF0000ull) << 24) | \ - (((x)&0x000000000000FF00ull) << 40) | \ - (((x)&0x00000000000000FFull) << 56) -#endif \ No newline at end of file diff --git a/UnityPyBoost/swap.hpp b/UnityPyBoost/swap.hpp new file mode 100644 index 00000000..904d467d --- /dev/null +++ b/UnityPyBoost/swap.hpp @@ -0,0 +1,77 @@ +#if __cplusplus >= 202101L // "C++23"; +#include +#define bswap16(x) std::byteswap(x) +#define bswap32(x) std::byteswap(x) +#define bswap64(x) std::byteswap(x) +#else +// set swap funcions (source: old version of nodejs/src/node_buffer.cc) +#if defined(__GNUC__) || defined(__clang__) +#define bswap16(x) __builtin_bswap16(x) +#define bswap32(x) __builtin_bswap32(x) +#define bswap64(x) __builtin_bswap64(x) +#elif defined(__linux__) +#include +#define bswap16(x) bswap_16(x) +#define bswap32(x) bswap_32(x) +#define bswap64(x) bswap_64(x) +#elif defined(_MSC_VER) +#include +#define bswap16(x) _byteswap_ushort(x) +#define bswap32(x) _byteswap_ulong(x) +#define bswap64(x) _byteswap_uint64(x) +#else +#ifdef __builtin_bswap16 +#define bswap16(x) __builtin_bswap16(x) +#else +#define bswap16 ((x) << 8) | ((x) >> 8) +#endif +#ifdef __builtin_bswap32 +#define bswap32(x) __builtin_bswap32(x) +#else +#define bswap32 \ + (((x) & 0xFF) << 24) | \ + (((x) & 0xFF00) << 8) | \ + (((x) >> 8) & 0xFF00) | \ + (((x) >> 24) & 0xFF) +#endif +#ifdef __builtin_bswap64 +#define bswap64 __builtin_bswap64(x) +#else +#define bswap64 \ + (((x) & 0xFF00000000000000ull) >> 56) | \ + (((x) & 0x00FF000000000000ull) >> 40) | \ + (((x) & 0x0000FF0000000000ull) >> 24) | \ + (((x) & 0x000000FF00000000ull) >> 8) | \ + (((x) & 0x00000000FF000000ull) << 8) | \ + (((x) & 0x0000000000FF0000ull) << 24) | \ + (((x) & 0x000000000000FF00ull) << 40) | \ + (((x) & 0x00000000000000FFull) << 56) +#endif +#endif +#endif + +template +inline void swap_any_inplace(T *x) +{ + if constexpr (sizeof(T) == 1) + { + // do nothing + } + else if constexpr (sizeof(T) == 2) + { + + *(uint16_t *)x = bswap16(*(uint16_t *)x); + } + else if constexpr (sizeof(T) == 4) + { + *(uint32_t *)x = bswap32(*(uint32_t *)x); + } + else if constexpr (sizeof(T) == 8) + { + *(uint64_t *)x = bswap64(*(uint64_t *)x); + } + else + { + static_assert(false, "Swap not implemented for this size"); + } +} diff --git a/setup.py b/setup.py index 23d54c66..c8c682d9 100644 --- a/setup.py +++ b/setup.py @@ -65,9 +65,10 @@ def get_fmod_library(): [ f"UnityPyBoost/{f}" for f in os.listdir(UNITYPYBOOST_DIR) - if f.endswith(".c") + if f.endswith(".cpp") ], - language="c", + language="c++", + extra_compile_args=["/std:c++20"], include_dirs=[UNITYPYBOOST_DIR], ) ], From 59c0abf5e89060eae7d40b290858a42fd067c764 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Fri, 20 Sep 2024 00:28:34 +0200 Subject: [PATCH 075/403] TypeTreeHelper.cpp - fix class reading --- UnityPyBoost/TypeTreeHelper.cpp | 202 +++++++++++++++----------------- 1 file changed, 92 insertions(+), 110 deletions(-) diff --git a/UnityPyBoost/TypeTreeHelper.cpp b/UnityPyBoost/TypeTreeHelper.cpp index 1b49208f..73511b1d 100644 --- a/UnityPyBoost/TypeTreeHelper.cpp +++ b/UnityPyBoost/TypeTreeHelper.cpp @@ -197,24 +197,20 @@ inline PyObject *read_pair(ReaderT *reader, TypeTreeNodeObject *node, TypeTreeRe return pair; } -inline PyObject *class_from_dict(PyObject *dict, TypeTreeNodeObject *node, TypeTreeReaderConfigT *config) +template +inline PyObject *read_class(ReaderT *reader, TypeTreeNodeObject *node, TypeTreeReaderConfigT *config) { PyObject *clz = NULL; - PyObject *args = NULL; - PyObject *instance = NULL; - PyObject *keys = NULL; - PyObject *clean_args = NULL; - PyObject *annotations = NULL; - PyObject *extra = NULL; + PyObject *dict = PyDict_New(); // Determine the class based on node's _data_type if (node->_data_type == NodeDataType::pptr) { - // Add 'assetsfile' key for PPtr objects if (PyDict_SetItemString(dict, "assetsfile", config->assetfile) != 0) { PyErr_SetString(PyExc_RuntimeError, "Failed to set 'assetsfile'"); - goto error_cleanup; + Py_DECREF(dict); + return NULL; } clz = PyObject_GetAttrString(config->classes, "PPtr"); } @@ -227,136 +223,100 @@ inline PyObject *class_from_dict(PyObject *dict, TypeTreeNodeObject *node, TypeT } } - // If class lookup fails, raise an error if (clz == NULL) { PyErr_SetString(PyExc_ValueError, "Failed to get class"); - goto error_cleanup; + Py_DECREF(dict); + return NULL; } - // Prepare arguments (empty tuple) - args = PyTuple_New(0); - if (args == NULL) + for (int i = 0; i < PyList_GET_SIZE(node->m_Children); i++) { - goto error_cleanup; + TypeTreeNodeObject *child = (TypeTreeNodeObject *)PyList_GetItem(node->m_Children, i); + PyObject *child_value = read_typetree_value(reader, child, config); + if (!child_value) + { + Py_DECREF(dict); + return NULL; + } + if (PyDict_SetItem(dict, child->m_Name, child_value)) + { + Py_DECREF(dict); + Py_DECREF(child_value); + return NULL; + } + // dict increases ref count, so we need to decref here + Py_DECREF(child_value); } - // Attempt to create the instance from the class and dict - instance = PyObject_Call(clz, args, dict); + PyObject *args = PyTuple_New(0); + PyObject *instance = PyObject_Call(clz, args, dict); if (instance != NULL) { - goto success; + Py_DECREF(args); + Py_DECREF(dict); + return instance; } PyErr_Clear(); - // If calling the class failed, check for callable clean_name function - if (!PyCallable_Check(config->clean_name)) - { - PyErr_SetString(PyExc_ValueError, "clean_name is not callable"); - goto error_cleanup; - } - - // Clean the dictionary keys - keys = PyDict_Keys(dict); - clean_args = PyTuple_New(1); // For passing to the clean_name function - if (keys == NULL || clean_args == NULL) - { - goto error_cleanup; - } - - // Iterate through dict keys, clean them, and update if necessary + PyObject *keys = PyDict_Keys(dict); + PyObject *clean_args = PyTuple_New(1); for (Py_ssize_t i = 0; i < PyList_Size(keys); i++) { PyObject *key = PyList_GetItem(keys, i); - Py_INCREF(key); // Protect reference count - - PyTuple_SetItem(clean_args, 0, key); - PyObject *clean_key = PyObject_CallFunctionObjArgs(config->clean_name, clean_args, NULL); - if (clean_key == NULL) - { - Py_DECREF(key); - goto error_cleanup; - } - - if (PyUnicode_Compare(key, clean_key) != 0) + PyTuple_SET_ITEM(clean_args, 0, key); + PyObject *clean_key = PyObject_Call(config->clean_name, clean_args, NULL); + if (PyUnicode_Compare(key, clean_key)) { - // Replace the key in the dict with the cleaned key PyObject *value = PyDict_GetItem(dict, key); - if (value != NULL) - { - PyDict_DelItem(dict, key); - PyDict_SetItem(dict, clean_key, value); - } + PyDict_SetItem(dict, clean_key, value); + PyDict_DelItem(dict, key); } Py_DECREF(clean_key); - Py_DECREF(key); } + PyTuple_SET_ITEM(clean_args, 0, Py_None); + Py_DECREF(clean_args); + Py_DECREF(keys); - // Retry creating the class instance with cleaned dictionary instance = PyObject_Call(clz, args, dict); if (instance != NULL) { - goto success; - } - - // Handle extra attributes not present in class annotations - annotations = PyObject_GetAttrString(clz, "__annotations__"); - if (annotations == NULL) - { - PyErr_SetString(PyExc_ValueError, "Failed to get annotations"); - goto error_cleanup; + Py_DECREF(args); + Py_DECREF(dict); + return instance; } + PyErr_Clear(); - extra = PyDict_New(); + PyObject *annonations = PyObject_GetAttrString(clz, "__annotations__"); + PyObject *extras = PyDict_New(); + keys = PyDict_Keys(dict); for (Py_ssize_t i = 0; i < PyList_Size(keys); i++) { PyObject *key = PyList_GetItem(keys, i); - if (PyDict_Contains(annotations, key) == 0) + if (PyDict_Contains(annonations, key) == 0) { PyObject *value = PyDict_GetItem(dict, key); - PyDict_SetItem(extra, key, value); + PyDict_SetItem(extras, key, value); PyDict_DelItem(dict, key); } } + Py_DECREF(keys); instance = PyObject_Call(clz, args, dict); if (instance != NULL) { - // Set extra attributes on the instance - keys = PyDict_Keys(extra); - for (Py_ssize_t i = 0; i < PyList_Size(keys); i++) + PyObject *items = PyDict_Items(extras); + for (Py_ssize_t i = 0; i < PyList_Size(items); i++) { - PyObject *key = PyList_GetItem(keys, i); - PyObject *value = PyDict_GetItem(extra, key); + PyObject *item = PyList_GetItem(items, i); + PyObject *key = PyTuple_GetItem(item, 0); + PyObject *value = PyTuple_GetItem(item, 1); PyObject_SetAttr(instance, key, value); } - goto success; + Py_DECREF(items); } - PyErr_SetString(PyExc_ValueError, "Failed to create instance"); - goto error_cleanup; - -success: - // Cleanup and return the instance - Py_DECREF(args); - Py_DECREF(clz); - Py_DECREF(dict); - Py_XDECREF(keys); - Py_XDECREF(clean_args); - Py_XDECREF(annotations); - Py_XDECREF(extra); return instance; - -error_cleanup: - // Cleanup in case of an error - Py_XDECREF(args); - Py_XDECREF(clz); - Py_XDECREF(dict); - Py_XDECREF(keys); - Py_XDECREF(clean_args); - Py_XDECREF(annotations); - Py_XDECREF(extra); - return NULL; } template @@ -445,27 +405,30 @@ PyObject *read_typetree_value(ReaderT *reader, TypeTreeNodeObject *node, TypeTre { // class value = PyDict_New(); - for (int i = 0; i < PyList_GET_SIZE(node->m_Children); i++) + if (config->as_dict) { - child = (TypeTreeNodeObject *)PyList_GetItem(node->m_Children, i); - PyObject *child_value = read_typetree_value(reader, child, config); - if (!child_value) + for (int i = 0; i < PyList_GET_SIZE(node->m_Children); i++) { - Py_DECREF(value); - return NULL; - } - if (PyDict_SetItem(value, child->m_Name, child_value)) - { - Py_DECREF(value); + child = (TypeTreeNodeObject *)PyList_GetItem(node->m_Children, i); + PyObject *child_value = read_typetree_value(reader, child, config); + if (!child_value) + { + Py_DECREF(value); + return NULL; + } + if (PyDict_SetItem(value, child->m_Name, child_value)) + { + Py_DECREF(value); + Py_DECREF(child_value); + return NULL; + } + // dict increases ref count, so we need to decref here Py_DECREF(child_value); - return NULL; } - // dict increases ref count, so we need to decref here - Py_DECREF(child_value); } - if (!config->as_dict) + else { - value = class_from_dict(value, node, config); + value = read_class(reader, node, config); } } } @@ -499,6 +462,26 @@ PyObject *read_typetree(PyObject *self, PyObject *args, PyObject *kwargs) return NULL; } + config.as_dict = Py_IsTrue(as_dict) == 1; + if (!config.as_dict) + { + if (PyCallable_Check(config.clean_name) == 0) + { + PyErr_SetString(PyExc_ValueError, "clean_name must be callable if not as dict"); + return NULL; + } + if (Py_IsNone(config.assetfile) == 1) + { + PyErr_SetString(PyExc_ValueError, "assetsfile must be set if not as dict"); + return NULL; + } + if (Py_IsNone(config.classes) == 1) + { + PyErr_SetString(PyExc_ValueError, "classes must be set if not as dict"); + return NULL; + } + } + volatile uint16_t bint = 0x0100; volatile bool is_big_endian = ((uint8_t *)&bint)[0] == 1; @@ -536,7 +519,6 @@ PyObject *read_typetree(PyObject *self, PyObject *args, PyObject *kwargs) return NULL; } ReaderT reader = {static_cast(view.buf), static_cast(view.buf) + view.len, static_cast(view.buf)}; - config.as_dict = Py_IsTrue(as_dict) == 1; PyObject *value; if (swap) From 3f7a8fe634f99f2986d910a702198cd5150b0730 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Fri, 20 Sep 2024 00:28:51 +0200 Subject: [PATCH 076/403] test_main.py - don't save images to disk --- tests/test_main.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/tests/test_main.py b/tests/test_main.py index ec8cbea9..8a531c8f 100644 --- a/tests/test_main.py +++ b/tests/test_main.py @@ -1,3 +1,4 @@ +import io import os import UnityPy @@ -25,7 +26,7 @@ def test_texture2d(): for obj in env.objects: if obj.type.name == "Texture2D": data = obj.read() - data.image.save("test.png") + data.image.save(io.BytesIO(), format="PNG") data.image = data.image.transpose(Image.ROTATE_90) data.save() @@ -35,14 +36,16 @@ def test_sprite(): env = UnityPy.load(os.path.join(SAMPLES, f)) for obj in env.objects: if obj.type.name == "Sprite": - obj.read().image.save("test.png") + obj.read().image.save(io.BytesIO(), format="PNG") def test_audioclip(): # as not platforms are supported by FMOD # we have to check if the platform is supported first try: - UnityPy.export.AudioClipConverter.import_pyfmodex() + from UnityPy.export import AudioClipConverter + + AudioClipConverter.import_pyfmodex() except NotImplementedError: return except OSError: @@ -51,7 +54,7 @@ def test_audioclip(): print("Failed to load the fmod lib for your system.") print("Skipping the audioclip test.") return - if UnityPy.export.AudioClipConverter.pyfmodex is False: + if AudioClipConverter.pyfmodex is False: return env = UnityPy.load(os.path.join(SAMPLES, "char_118_yuki.ab")) for obj in env.objects: From 6d19d9cd5344620c428fe53543f60b96021ed5f4 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Fri, 20 Sep 2024 00:29:54 +0200 Subject: [PATCH 077/403] setup.py - fix extra_compile_args for non-windows --- setup.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/setup.py b/setup.py index c8c682d9..247ecef9 100644 --- a/setup.py +++ b/setup.py @@ -68,7 +68,9 @@ def get_fmod_library(): if f.endswith(".cpp") ], language="c++", - extra_compile_args=["/std:c++20"], + extra_compile_args=[ + "/std:c++20" if platform.system() == "Windows" else "-std=c++20" + ], include_dirs=[UNITYPYBOOST_DIR], ) ], From 85f79e13e494f9ff86fa595792b31541c56ee497 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Fri, 20 Sep 2024 00:35:10 +0200 Subject: [PATCH 078/403] Mesh.cpp - swap inplace --- UnityPyBoost/Mesh.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/UnityPyBoost/Mesh.cpp b/UnityPyBoost/Mesh.cpp index 97220a3d..65d77877 100644 --- a/UnityPyBoost/Mesh.cpp +++ b/UnityPyBoost/Mesh.cpp @@ -85,7 +85,7 @@ PyObject *unpack_vertexdata(PyObject *self, PyObject *args) uint16_t *componentUints = (uint16_t *)componentBytes; for (uint32_t i = 0; i < componentBytesLength; i += 2) { - *componentUints++ = bswap16(*componentUints); + swap_any_inplace(componentUints++); } } else if (componentByteSize == 4) @@ -94,12 +94,12 @@ PyObject *unpack_vertexdata(PyObject *self, PyObject *args) uint32_t *componentUints = (uint32_t *)componentBytes; for (uint32_t i = 0; i < componentBytesLength; i += 4) { - *componentUints++ = bswap32(*componentUints); + swap_any_inplace(componentUints++); } } } - PyObject *res = PyByteArray_FromStringAndSize((const char*)componentBytes, componentBytesLength); + PyObject *res = PyByteArray_FromStringAndSize((const char *)componentBytes, componentBytesLength); PyMem_Free(componentBytes); PyBuffer_Release(&vertexDataView); return res; From 5e455b0f7a35006c0516983351e6c67563c2c3fe Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Fri, 20 Sep 2024 00:36:28 +0200 Subject: [PATCH 079/403] swap.hpp - gcc fix --- UnityPyBoost/swap.hpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/UnityPyBoost/swap.hpp b/UnityPyBoost/swap.hpp index 904d467d..5e2cbc46 100644 --- a/UnityPyBoost/swap.hpp +++ b/UnityPyBoost/swap.hpp @@ -72,6 +72,7 @@ inline void swap_any_inplace(T *x) } else { - static_assert(false, "Swap not implemented for this size"); + // gcc is tripping and somehow reaching this at compile time + // static_assert(false, "Swap not implemented for this size"); } } From c694e6036ad5520194afdac28d047af077c4daa5 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Fri, 20 Sep 2024 12:39:27 +0200 Subject: [PATCH 080/403] TypeTreeNode fix - m_Typeflags optional and TPK flat to hierachy --- UnityPy/files/ObjectReader.py | 4 +-- UnityPy/helpers/Tpk.py | 21 ++++++++----- UnityPy/helpers/TypeTreeNode.py | 11 +++---- UnityPyBoost/TypeTreeHelper.cpp | 53 +++++++++++---------------------- UnityPyBoost/TypeTreeHelper.hpp | 2 +- 5 files changed, 40 insertions(+), 51 deletions(-) diff --git a/UnityPy/files/ObjectReader.py b/UnityPy/files/ObjectReader.py index fde1d202..6f3f1f71 100644 --- a/UnityPy/files/ObjectReader.py +++ b/UnityPy/files/ObjectReader.py @@ -3,7 +3,7 @@ from ..streams import EndianBinaryReader, EndianBinaryWriter from ..helpers import TypeTreeHelper -from ..helpers.Tpk import get_typetree_nodes +from ..helpers.Tpk import get_typetree_node from ..helpers.TypeTreeNode import TypeTreeNode from ..exceptions import TypeTreeError @@ -238,7 +238,7 @@ def _get_typetree_node( if self.serialized_type: nodes = self.serialized_type.nodes if not nodes: - nodes = get_typetree_nodes(self.class_id, self.version) + nodes = get_typetree_node(self.class_id, self.version) if not nodes: raise TypeTreeError("There are no TypeTree nodes for this object.") return nodes diff --git a/UnityPy/helpers/Tpk.py b/UnityPy/helpers/Tpk.py index f523a794..87611d1b 100644 --- a/UnityPy/helpers/Tpk.py +++ b/UnityPy/helpers/Tpk.py @@ -13,13 +13,16 @@ def init(): import os with open( - os.path.join(os.path.dirname(os.path.dirname(__file__)), "resources", "uncompressed.tpk"), "rb" + os.path.join( + os.path.dirname(os.path.dirname(__file__)), "resources", "uncompressed.tpk" + ), + "rb", ) as f: global TPKTYPETREE TPKTYPETREE = TpkFile(f).GetDataBlob() -def get_typetree_nodes(class_id: int, version: tuple): +def get_typetree_node(class_id: int, version: tuple): global NODES_CACHE key = (class_id, version) if key in NODES_CACHE: @@ -31,12 +34,12 @@ def get_typetree_nodes(class_id: int, version: tuple): if class_info is None: raise ValueError("Could not find class info for class id {}".format(class_id)) - nodes = generate_flat_nodes(class_info) - NODES_CACHE[key] = nodes - return nodes + node = generate_node(class_info) + NODES_CACHE[key] = node + return node -def generate_flat_nodes(class_info: TpkUnityClass) -> List[TypeTreeNode]: +def generate_node(class_info: TpkUnityClass) -> TypeTreeNode: nodes = [] NODES = TPKTYPETREE.NodeBuffer.Nodes stack = [(class_info.ReleaseRootNode, 0)] @@ -57,7 +60,7 @@ def generate_flat_nodes(class_info: TpkUnityClass) -> List[TypeTreeNode]: ) stack = [(node_id, level + 1) for node_id in node.SubNodes] + stack index += 1 - return nodes + return TypeTreeNode.from_list(nodes) ###################################################################################### @@ -292,7 +295,9 @@ def fromString(version: str) -> UnityVersion: return UnityVersion(version.split(".")) @staticmethod - def fromList(major: int = 0, minor: int = 0, patch: int = 0, build: int = 0) -> UnityVersion: + def fromList( + major: int = 0, minor: int = 0, patch: int = 0, build: int = 0 + ) -> UnityVersion: return UnityVersion(major << 48 | minor << 32 | patch << 16 | build) @property diff --git a/UnityPy/helpers/TypeTreeNode.py b/UnityPy/helpers/TypeTreeNode.py index 4d6256b5..aa02ef4f 100644 --- a/UnityPy/helpers/TypeTreeNode.py +++ b/UnityPy/helpers/TypeTreeNode.py @@ -20,9 +20,9 @@ class TypeTreeNodeC: m_Type: str m_Name: str m_ByteSize: int - m_TypeFlags: int m_Version: int m_Children: List[TypeTreeNode] = field(factory=list) + m_TypeFlags: Optional[int] = None m_VariableCount: Optional[int] = None m_Index: Optional[int] = None m_MetaFlag: Optional[int] = None @@ -92,7 +92,7 @@ def read_string(reader: EndianBinaryReader, value: int) -> str: offset = value & 0x7FFFFFFF return CommonString.get(offset, str(offset)) - fake_root: TypeTreeNode = cls(-1, "", "", 0, 0, 0, []) + fake_root: TypeTreeNode = cls(-1, "", "", 0, 0, []) stack: List[TypeTreeNode] = [fake_root] parent = fake_root prev = fake_root @@ -119,13 +119,14 @@ def read_string(reader: EndianBinaryReader, value: int) -> str: @classmethod def from_list(cls, nodes: List[dict]) -> TypeTreeNode: - fake_root: TypeTreeNode = cls(-1, "", "", 0, 0, 0, []) + fake_root: TypeTreeNode = cls(-1, "", "", 0, 0, []) stack: List[TypeTreeNode] = [fake_root] parent = fake_root prev = fake_root - for dict_node in nodes: - node = cls(**dict_node) + for node in nodes: + if isinstance(node, dict): + node = cls(node) if node.m_Level > prev.m_Level: stack.append(parent) diff --git a/UnityPyBoost/TypeTreeHelper.cpp b/UnityPyBoost/TypeTreeHelper.cpp index 73511b1d..ce497402 100644 --- a/UnityPyBoost/TypeTreeHelper.cpp +++ b/UnityPyBoost/TypeTreeHelper.cpp @@ -586,23 +586,23 @@ static int TypeTreeNode_init(TypeTreeNodeObject *self, PyObject *args, PyObject "m_Type", "m_Name", "m_ByteSize", - "m_TypeFlags", "m_Version", "m_Children", + "m_TypeFlags", "m_VariableCount", "m_Index", "m_MetaFlag", "m_RefTypeHash", NULL}; - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OOOOOO|OOOOO", (char **)kwlist, + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OOOOO|OOOOOO", (char **)kwlist, &self->m_Level, &self->m_Type, &self->m_Name, &self->m_ByteSize, - &self->m_TypeFlags, &self->m_Version, &self->m_Children, + &self->m_TypeFlags, &self->m_VariableCount, &self->m_Index, &self->m_MetaFlag, @@ -615,7 +615,6 @@ static int TypeTreeNode_init(TypeTreeNodeObject *self, PyObject *args, PyObject Py_INCREF(self->m_Type); Py_INCREF(self->m_Name); Py_INCREF(self->m_ByteSize); - Py_INCREF(self->m_TypeFlags); Py_INCREF(self->m_Version); // optional fields if (self->m_Children == nullptr) @@ -626,39 +625,23 @@ static int TypeTreeNode_init(TypeTreeNodeObject *self, PyObject *args, PyObject { Py_XINCREF(self->m_Children); } - if (self->m_VariableCount == nullptr) - { - self->m_VariableCount = Py_None; - } - else - { - Py_INCREF(self->m_VariableCount); - } - if (self->m_Index == nullptr) - { - self->m_Index = Py_None; - } - else - { - Py_INCREF(self->m_Index); - } - if (self->m_MetaFlag == nullptr) - { - self->m_MetaFlag = Py_None; - } - else - { - Py_INCREF(self->m_MetaFlag); - } - if (self->m_RefTypeHash == nullptr) - { - self->m_RefTypeHash = Py_None; - } - else - { - Py_INCREF(self->m_RefTypeHash); + +#define SET_NONE_IF_NULL(field) \ + if (self->field == nullptr) \ + { \ + self->field = Py_None; \ + } \ + else \ + { \ + Py_INCREF(self->field); \ } + SET_NONE_IF_NULL(m_TypeFlags); + SET_NONE_IF_NULL(m_VariableCount); + SET_NONE_IF_NULL(m_Index); + SET_NONE_IF_NULL(m_MetaFlag); + SET_NONE_IF_NULL(m_RefTypeHash); + if (self->m_MetaFlag != Py_None && PyLong_AsLong(self->m_MetaFlag) & 0x4000) { self->_align = true; diff --git a/UnityPyBoost/TypeTreeHelper.hpp b/UnityPyBoost/TypeTreeHelper.hpp index eb226d8c..5140910c 100644 --- a/UnityPyBoost/TypeTreeHelper.hpp +++ b/UnityPyBoost/TypeTreeHelper.hpp @@ -38,8 +38,8 @@ typedef struct TypeTreeNodeObject PyObject *m_Level; PyObject *m_Type; PyObject *m_ByteSize; - PyObject *m_TypeFlags; PyObject *m_Version; + PyObject *m_TypeFlags; PyObject *m_VariableCount; PyObject *m_Index; PyObject *m_MetaFlag; From 3022db136edf3e37c385c92c4afbefc405c40744 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Fri, 20 Sep 2024 23:51:53 +0200 Subject: [PATCH 081/403] ShaderConverter - fixes, format, add type hints --- UnityPy/export/ShaderConverter.py | 488 +++++++++++++++++++----------- 1 file changed, 313 insertions(+), 175 deletions(-) diff --git a/UnityPy/export/ShaderConverter.py b/UnityPy/export/ShaderConverter.py index 5ac6b4b9..66f27983 100644 --- a/UnityPy/export/ShaderConverter.py +++ b/UnityPy/export/ShaderConverter.py @@ -1,88 +1,139 @@ -import traceback -from ..streams import EndianBinaryReader -from ..helpers import CompressionHelper +from __future__ import annotations + import re from itertools import groupby -from ..enums import ShaderCompilerPlatform, ShaderGpuProgramType, SerializedPropertyType -from ..enums import TextureDimension, PassType +from typing import TYPE_CHECKING, List, Optional, Tuple + +from ..enums import ( + PassType, + SerializedPropertyType, + ShaderCompilerPlatform, + ShaderGpuProgramType, + TextureDimension, +) +from ..helpers import CompressionHelper +from ..streams import EndianBinaryReader -HEADER = ''' +if TYPE_CHECKING: + from ..classes import ( + SerializedPass, + SerializedProperties, + SerializedProperty, + SerializedShader, + SerializedShaderState, + SerializedSubProgram, + SerializedSubShader, + SerializedTagMap, + Shader, + ) + +HEADER = """ ////////////////////////////////////////// // // NOTE: This is *not* a valid shader file // /////////////////////////////////////////// -'''[1:] +"""[1:] -def export_shader(m_Shader): - if hasattr(m_Shader, "m_SubProgramBlob"): # 5.3 - 5.4 +def export_shader(m_Shader: Shader) -> str: + if m_Shader.m_SubProgramBlob: # 5.3 - 5.4 decompressedBytes = CompressionHelper.decompress_lz4( - m_Shader.m_SubProgramBlob, m_Shader.decompressedSize) + bytes(m_Shader.m_SubProgramBlob), m_Shader.decompressedSize + ) blobReader = EndianBinaryReader(decompressedBytes) - program = ShaderProgram(blobReader, m_Shader.version) + program = ShaderProgram(blobReader, m_Shader.object_reader.version) return HEADER + program.Export(bytes(m_Shader.m_Script).decode("utf8")) - if hasattr(m_Shader, "compressedBlob"): # 5.5 and up + if m_Shader.compressedBlob: # 5.5 and up return HEADER + ConvertSerializedShader(m_Shader) return HEADER + bytes(m_Shader.m_Script).decode("utf8") -def ConvertSerializedShader(m_Shader): + +def ConvertSerializedShader(m_Shader: Shader) -> str: shaderPrograms = [] platformNumber = len(m_Shader.platforms) + compressed_blob = bytes(m_Shader.compressedBlob) for i in range(platformNumber): - if i >= len(m_Shader.compressedLengths) or i >= len(m_Shader.decompressedLengths): + if i >= len(m_Shader.compressedLengths) or i >= len( + m_Shader.decompressedLengths + ): # m_Shader.platforms shouldn't be longer than m_shader.[de]compressedLengths, but it is break compressedSize = m_Shader.compressedLengths[i] decompressedSize = m_Shader.decompressedLengths[i] - compressedBytes = m_Shader.compressedBlob[int(m_Shader.offsets[i]):int(m_Shader.offsets[i]) + compressedSize] - decompressedBytes = CompressionHelper.decompress_lz4(compressedBytes, decompressedSize) - - shaderPrograms.append(ShaderProgram(EndianBinaryReader(decompressedBytes, endian="<"), m_Shader.version)) - - return ConvertSerializedShaderParsedForm(m_Shader.m_ParsedForm, m_Shader.platforms, shaderPrograms) - -def ConvertSerializedShaderParsedForm(m_ParsedForm, platforms, shaderPrograms): - sb = [] - - sb.append("Shader \"{0}\" {{\n".format(m_ParsedForm.m_Name)) - - sb.append(ConvertSerializedProperties(m_ParsedForm.m_PropInfo)) - - for m_SubShader in m_ParsedForm.m_SubShaders: - sb.append(ConvertSerializedSubShader(m_SubShader, platforms, shaderPrograms)) + compressedBytes = compressed_blob[ + int(m_Shader.offsets[i][0]) : int(m_Shader.offsets[i][0]) + + compressedSize[0] + ] + decompressedBytes = CompressionHelper.decompress_lz4( + compressedBytes, decompressedSize[0] + ) + + shaderPrograms.append( + ShaderProgram( + EndianBinaryReader(decompressedBytes, endian="<"), + m_Shader.object_reader.version, + ) + ) + + return ConvertSerializedShaderParsedForm( + m_Shader.m_ParsedForm, m_Shader.platforms, shaderPrograms + ) + + +def ConvertSerializedShaderParsedForm( + m_ParsedForm: SerializedShader, + platforms: List[int], + shaderPrograms: List[ShaderProgram], +) -> str: + sb: List[str] = [ + 'Shader "{0}" {{\n'.format(m_ParsedForm.m_Name), + ConvertSerializedProperties(m_ParsedForm.m_PropInfo), + *[ + ConvertSerializedSubShader(m_SubShader, platforms, shaderPrograms) + for m_SubShader in m_ParsedForm.m_SubShaders + ], + ] if m_ParsedForm.m_FallbackName: - sb.append("Fall back \"{0}\"\n".format(m_ParsedForm.m_FallbackName)) + sb.append('Fall back "{0}"\n'.format(m_ParsedForm.m_FallbackName)) if m_ParsedForm.m_CustomEditorName: - sb.append("CustomEditor \"{0}\"\n".format(m_ParsedForm.m_CustomEditorName)) + sb.append('CustomEditor "{0}"\n'.format(m_ParsedForm.m_CustomEditorName)) sb.append("}") return "".join(sb) -def ConvertSerializedSubShader(m_SubShader, platforms, shaderPrograms): - sb = [] - sb.append("SubShader {\n") +def ConvertSerializedSubShader( + m_SubShader: SerializedSubShader, + platforms: List[int], + shaderPrograms: List[ShaderProgram], +) -> str: + sb = ["SubShader {\n"] + if m_SubShader.m_LOD != 0: sb.append(" LOD {0}\n".format(m_SubShader.m_LOD)) sb.append(ConvertSerializedTagMap(m_SubShader.m_Tags, 1)) - for m_Passe in m_SubShader.m_Passes: - sb.append(ConvertSerializedPass(m_Passe, platforms, shaderPrograms)) - + sb.extend( + ConvertSerializedPass(m_Passe, platforms, shaderPrograms) + for m_Passe in m_SubShader.m_Passes + ) sb.append("}\n") return "".join(sb) -def ConvertSerializedPass(m_Passe, platforms, shaderPrograms): + +def ConvertSerializedPass( + m_Passe: SerializedPass, platforms: List[int], shaderPrograms: List[ShaderProgram] +) -> str: sb = [] if m_Passe.m_Type == PassType.kPassTypeNormal: sb.append(" Pass ") @@ -92,51 +143,79 @@ def ConvertSerializedPass(m_Passe, platforms, shaderPrograms): sb.append(" GrabPass ") if m_Passe.m_Type == PassType.kPassTypeUse: - sb.append("\"{0}\"\n".format(m_Passe.m_UseName)) + sb.append('"{0}"\n'.format(m_Passe.m_UseName)) else: sb.append("{\n") if m_Passe.m_Type == PassType.kPassTypeGrab: if m_Passe.m_TextureName: - sb.append(" \"{0}\"\n".format(m_Passe.m_TextureName)) + sb.append(' "{0}"\n'.format(m_Passe.m_TextureName)) else: sb.append(ConvertSerializedShaderState(m_Passe.m_State)) if len(m_Passe.progVertex.m_SubPrograms) > 0: - sb.append("Program \"vp\" {\n") - sb.append(ConvertSerializedSubPrograms(m_Passe.progVertex.m_SubPrograms, platforms, shaderPrograms)) + sb.append('Program "vp" {\n') + sb.append( + ConvertSerializedSubPrograms( + m_Passe.progVertex.m_SubPrograms, platforms, shaderPrograms + ) + ) sb.append("}\n") if len(m_Passe.progFragment.m_SubPrograms) > 0: - sb.append("Program \"fp\" {\n") - sb.append(ConvertSerializedSubPrograms(m_Passe.progFragment.m_SubPrograms, platforms, shaderPrograms)) + sb.append('Program "fp" {\n') + sb.append( + ConvertSerializedSubPrograms( + m_Passe.progFragment.m_SubPrograms, platforms, shaderPrograms + ) + ) sb.append("}\n") if len(m_Passe.progGeometry.m_SubPrograms) > 0: - sb.append("Program \"gp\" {\n") - sb.append(ConvertSerializedSubPrograms(m_Passe.progGeometry.m_SubPrograms, platforms, shaderPrograms)) + sb.append('Program "gp" {\n') + sb.append( + ConvertSerializedSubPrograms( + m_Passe.progGeometry.m_SubPrograms, platforms, shaderPrograms + ) + ) sb.append("}\n") if len(m_Passe.progHull.m_SubPrograms) > 0: - sb.append("Program \"hp\" {\n") - sb.append(ConvertSerializedSubPrograms(m_Passe.progHull.m_SubPrograms, platforms, shaderPrograms)) + sb.append('Program "hp" {\n') + sb.append( + ConvertSerializedSubPrograms( + m_Passe.progHull.m_SubPrograms, platforms, shaderPrograms + ) + ) sb.append("}\n") if len(m_Passe.progDomain.m_SubPrograms) > 0: - sb.append("Program \"dp\" {\n") - sb.append(ConvertSerializedSubPrograms(m_Passe.progDomain.m_SubPrograms, platforms, shaderPrograms)) + sb.append('Program "dp" {\n') + sb.append( + ConvertSerializedSubPrograms( + m_Passe.progDomain.m_SubPrograms, platforms, shaderPrograms + ) + ) sb.append("}\n") sb.append("}\n") return "".join(sb) -def ConvertSerializedSubPrograms(m_SubPrograms, platforms, shaderPrograms): + +def ConvertSerializedSubPrograms( + m_SubPrograms: List[SerializedSubProgram], + platforms: List[int], + shaderPrograms: List[ShaderProgram], +) -> str: sb = [] - indexFunc = lambda x: x.m_BlobIndex - typeFunc = lambda x: x.m_GpuProgramType + def indexFunc(x: SerializedSubProgram): + return x.m_BlobIndex + + def typeFunc(x: SerializedSubProgram): + return x.m_GpuProgramType groups = groupby(sorted(m_SubPrograms, key=indexFunc), indexFunc) @@ -156,13 +235,21 @@ def ConvertSerializedSubPrograms(m_SubPrograms, platforms, shaderPrograms): if CheckGpuProgramUsable(platform, programKey): for subProgram in subPrograms: - sb.append("SubProgram \"{0} ".format(GetPlatformString(platform))) + sb.append( + 'SubProgram "{0} '.format(GetPlatformString(platform)) + ) if isTier: - sb.append("hw_tier{0:02} ".format(subProgram.m_ShaderHardwareTier)) + sb.append( + "hw_tier{0:02} ".format(subProgram.m_ShaderHardwareTier) + ) - sb.append("\" {\n") - sb.append(shaderPrograms[i].m_SubPrograms[subProgram.m_BlobIndex].Export()) + sb.append('" {\n') + sb.append( + shaderPrograms[i] + .m_SubPrograms[subProgram.m_BlobIndex] + .Export() + ) sb.append("\n}\n") @@ -171,17 +258,17 @@ def ConvertSerializedSubPrograms(m_SubPrograms, platforms, shaderPrograms): return "".join(sb) -def ConvertSerializedShaderState(m_State): +def ConvertSerializedShaderState(m_State: SerializedShaderState) -> str: sb = [] if m_State.m_Name: - sb.append(" Name \"{0}\"\n".format(m_State.m_Name)) + sb.append(' Name "{0}"\n'.format(m_State.m_Name)) if m_State.m_LOD != 0: sb.append(" LOD {0}\n".format(m_State.m_LOD)) sb.append(ConvertSerializedTagMap(m_State.m_Tags, 2)) - sb.append(ConvertSerializedShaderRTBlendState(m_State.rtBlend)) + # sb.append(ConvertSerializedShaderRTBlendState(m_State.rtBlend)) if m_State.alphaToMask.val > 0: sb.append(" AlphaToMask On\n") @@ -191,39 +278,43 @@ def ConvertSerializedShaderState(m_State): if m_State.zTest.val != 4: sb.append(" ZTest ") - if m_State.zTest.val == 0: # kFuncDisabled + if m_State.zTest.val == 0: # kFuncDisabled sb.append("Off") - elif m_State.zTest.val == 1: # kFuncNever + elif m_State.zTest.val == 1: # kFuncNever sb.append("Never") - elif m_State.zTest.val == 2: # kFuncLess + elif m_State.zTest.val == 2: # kFuncLess sb.append("Less") - elif m_State.zTest.val == 3: # kFuncEqual + elif m_State.zTest.val == 3: # kFuncEqual sb.append("Equal") - elif m_State.zTest.val == 5: # kFuncGreater + elif m_State.zTest.val == 5: # kFuncGreater sb.append("Greater") - elif m_State.zTest.val == 6: # kFuncNotEqual + elif m_State.zTest.val == 6: # kFuncNotEqual sb.append("NotEqual") - elif m_State.zTest.val == 7: # kFuncGEqual + elif m_State.zTest.val == 7: # kFuncGEqual sb.append("GEqual") - elif m_State.zTest.val == 8: # kFuncAlways + elif m_State.zTest.val == 8: # kFuncAlways sb.append("Always") sb.append("\n") - if m_State.zWrite.val != 1: # ZWrite On + if m_State.zWrite.val != 1: # ZWrite On sb.append(" ZWrite Off\n") - if m_State.culling.val != 2: # Cull Back + if m_State.culling.val != 2: # Cull Back sb.append(" Cull ") - if m_State.culling.val == 0: # kCullOff + if m_State.culling.val == 0: # kCullOff sb.append("Off") - elif m_State.culling.val == 1: # kCullFront + elif m_State.culling.val == 1: # kCullFront sb.append("Front") sb.append("\n") if m_State.offsetFactor.val != 0 or m_State.offsetUnits.val != 0: - sb.append(" Offset {0}, {1}\n".format(m_State.offsetFactor.val, m_State.offsetUnits.val)) + sb.append( + " Offset {0}, {1}\n".format( + m_State.offsetFactor.val, m_State.offsetUnits.val + ) + ) # TODO Stencil @@ -241,33 +332,33 @@ def ConvertSerializedShaderRTBlendState(rbBlend): sb = [] return "".join(sb) -def ConvertSerializedTagMap(m_Tags, intent: int): - sb = [] - if len(m_Tags.tags) > 0: - sb.append(" "*intent) - sb.append("Tags { ") - for key, value in m_Tags.tags.items(): - sb.append("\"{0}\" = \"{1}\" ".format(key, value)) - sb.append("}\n") - return "".join(sb) +def ConvertSerializedTagMap(m_Tags: SerializedTagMap, intent: int) -> str: + if m_Tags.tags: + return "".join( + [ + " " * intent, + "Tags { ", + *[f'"{key}" = "{value}" ' for key, value in m_Tags.tags], + "}\n", + ] + ) + return "" -def ConvertSerializedProperties(m_PropInfo): - sb = [] - - sb.append("Properties {\n") - for m_Prop in m_PropInfo.m_Props: - sb.append(ConvertSerializedProperty(m_Prop)) - sb.append("}\n") - return "".join(sb) +def ConvertSerializedProperties(m_PropInfo: SerializedProperties) -> str: + return "\n".join( + [ + "Properties {\n", + *[ConvertSerializedProperty(m_Prop) for m_Prop in m_PropInfo.m_Props], + "}\n", + ] + ) -def ConvertSerializedProperty(m_Prop): - sb = [] - for m_Attribute in m_Prop.m_Attributes: - sb.append("[{0}] ".format(m_Attribute)) - sb.append("{0} (\"{1}\", ".format(m_Prop.m_Name, m_Prop.m_Description)) +def ConvertSerializedProperty(m_Prop: SerializedProperty) -> str: + sb = ["[{0}] ".format(m_Attribute) for m_Attribute in m_Prop.m_Attributes] + sb.append('{0} ("{1}", '.format(m_Prop.m_Name, m_Prop.m_Description)) if m_Prop.m_Type == SerializedPropertyType.kColor: sb.append("Color") @@ -276,7 +367,9 @@ def ConvertSerializedProperty(m_Prop): elif m_Prop.m_Type == SerializedPropertyType.kFloat: sb.append("Float") elif m_Prop.m_Type == SerializedPropertyType.kRange: - sb.append("Range({0:g}, {1:g})".format(m_Prop.m_DefValue[1], m_Prop.m_DefValue[2])) + sb.append( + "Range({0:g}, {1:g})".format(m_Prop.m_DefValue_1_, m_Prop.m_DefValue_2_) + ) elif m_Prop.m_Type == SerializedPropertyType.kTexture: if m_Prop.m_DefTexture.m_TexDim == TextureDimension.kTexDimAny: sb.append("any") @@ -293,47 +386,58 @@ def ConvertSerializedProperty(m_Prop): sb.append(") = ") - if m_Prop.m_Type in [ - SerializedPropertyType.kColor, - SerializedPropertyType.kVector - ]: - sb.append("({0:g},{1:g},{2:g},{3:g})".format(m_Prop.m_DefValue[0], m_Prop.m_DefValue[1], m_Prop.m_DefValue[2],m_Prop.m_DefValue[3])) + if m_Prop.m_Type in [SerializedPropertyType.kColor, SerializedPropertyType.kVector]: + sb.append( + "({0:g},{1:g},{2:g},{3:g})".format( + m_Prop.m_DefValue_0_, + m_Prop.m_DefValue_1_, + m_Prop.m_DefValue_2_, + m_Prop.m_DefValue_3_, + ) + ) elif m_Prop.m_Type in [ SerializedPropertyType.kFloat, - SerializedPropertyType.kRange + SerializedPropertyType.kRange, ]: - sb.append(m_Prop.m_DefValue[0]) + sb.append(m_Prop.m_DefValue_0_) elif m_Prop.m_Type == SerializedPropertyType.kTexture: - sb.append("\"{0}\" {{ }}".format(m_Prop.m_DefTexture.m_DefaultName)) + sb.append('"{0}" {{ }}'.format(m_Prop.m_DefTexture.m_DefaultName)) else: raise ValueError(m_Prop.m_Type) sb.append("\n") - return "".join(map(str,sb)) + return "".join(map(str, sb)) + -def CheckGpuProgramUsable(platform, programType): +def CheckGpuProgramUsable(platform: int, programType: int) -> bool: if platform == ShaderCompilerPlatform.kShaderCompPlatformGL: return programType == ShaderGpuProgramType.kShaderGpuProgramGLLegacy elif platform == ShaderCompilerPlatform.kShaderCompPlatformD3D9: - return ( programType == ShaderGpuProgramType.kShaderGpuProgramDX9VertexSM20 + return ( + programType == ShaderGpuProgramType.kShaderGpuProgramDX9VertexSM20 or programType == ShaderGpuProgramType.kShaderGpuProgramDX9VertexSM30 or programType == ShaderGpuProgramType.kShaderGpuProgramDX9PixelSM20 - or programType == ShaderGpuProgramType.kShaderGpuProgramDX9PixelSM30 ) + or programType == ShaderGpuProgramType.kShaderGpuProgramDX9PixelSM30 + ) elif platform == ShaderCompilerPlatform.kShaderCompPlatformXbox360: - return ( programType == ShaderGpuProgramType.kShaderGpuProgramConsoleVS + return ( + programType == ShaderGpuProgramType.kShaderGpuProgramConsoleVS or programType == ShaderGpuProgramType.kShaderGpuProgramConsoleFS or programType == ShaderGpuProgramType.kShaderGpuProgramConsoleHS or programType == ShaderGpuProgramType.kShaderGpuProgramConsoleDS - or programType == ShaderGpuProgramType.kShaderGpuProgramConsoleGS ) + or programType == ShaderGpuProgramType.kShaderGpuProgramConsoleGS + ) elif platform == ShaderCompilerPlatform.kShaderCompPlatformD3D11: - return ( programType == ShaderGpuProgramType.kShaderGpuProgramDX11VertexSM40 + return ( + programType == ShaderGpuProgramType.kShaderGpuProgramDX11VertexSM40 or programType == ShaderGpuProgramType.kShaderGpuProgramDX11VertexSM50 or programType == ShaderGpuProgramType.kShaderGpuProgramDX11PixelSM40 or programType == ShaderGpuProgramType.kShaderGpuProgramDX11PixelSM50 or programType == ShaderGpuProgramType.kShaderGpuProgramDX11GeometrySM40 or programType == ShaderGpuProgramType.kShaderGpuProgramDX11GeometrySM50 or programType == ShaderGpuProgramType.kShaderGpuProgramDX11HullSM50 - or programType == ShaderGpuProgramType.kShaderGpuProgramDX11DomainSM50 ) + or programType == ShaderGpuProgramType.kShaderGpuProgramDX11DomainSM50 + ) elif platform == ShaderCompilerPlatform.kShaderCompPlatformGLES20: return programType == ShaderGpuProgramType.kShaderGpuProgramGLES elif platform == ShaderCompilerPlatform.kShaderCompPlatformNaCl: @@ -341,70 +445,92 @@ def CheckGpuProgramUsable(platform, programType): elif platform == ShaderCompilerPlatform.kShaderCompPlatformFlash: raise NotImplementedError elif platform == ShaderCompilerPlatform.kShaderCompPlatformD3D11_9x: - return ( programType == ShaderGpuProgramType.kShaderGpuProgramDX10Level9Vertex - or programType == ShaderGpuProgramType.kShaderGpuProgramDX10Level9Pixel ) + return ( + programType == ShaderGpuProgramType.kShaderGpuProgramDX10Level9Vertex + or programType == ShaderGpuProgramType.kShaderGpuProgramDX10Level9Pixel + ) elif platform == ShaderCompilerPlatform.kShaderCompPlatformGLES3Plus: - return ( programType == ShaderGpuProgramType.kShaderGpuProgramGLES31AEP + return ( + programType == ShaderGpuProgramType.kShaderGpuProgramGLES31AEP or programType == ShaderGpuProgramType.kShaderGpuProgramGLES31 - or programType == ShaderGpuProgramType.kShaderGpuProgramGLES3 ) + or programType == ShaderGpuProgramType.kShaderGpuProgramGLES3 + ) elif platform == ShaderCompilerPlatform.kShaderCompPlatformPSP2: - return ( programType == ShaderGpuProgramType.kShaderGpuProgramConsoleVS + return ( + programType == ShaderGpuProgramType.kShaderGpuProgramConsoleVS or programType == ShaderGpuProgramType.kShaderGpuProgramConsoleFS or programType == ShaderGpuProgramType.kShaderGpuProgramConsoleHS or programType == ShaderGpuProgramType.kShaderGpuProgramConsoleDS - or programType == ShaderGpuProgramType.kShaderGpuProgramConsoleGS ) + or programType == ShaderGpuProgramType.kShaderGpuProgramConsoleGS + ) elif platform == ShaderCompilerPlatform.kShaderCompPlatformPS4: - return ( programType == ShaderGpuProgramType.kShaderGpuProgramConsoleVS + return ( + programType == ShaderGpuProgramType.kShaderGpuProgramConsoleVS or programType == ShaderGpuProgramType.kShaderGpuProgramConsoleFS or programType == ShaderGpuProgramType.kShaderGpuProgramConsoleHS or programType == ShaderGpuProgramType.kShaderGpuProgramConsoleDS - or programType == ShaderGpuProgramType.kShaderGpuProgramConsoleGS ) + or programType == ShaderGpuProgramType.kShaderGpuProgramConsoleGS + ) elif platform == ShaderCompilerPlatform.kShaderCompPlatformXboxOne: - return ( programType == ShaderGpuProgramType.kShaderGpuProgramConsoleVS + return ( + programType == ShaderGpuProgramType.kShaderGpuProgramConsoleVS or programType == ShaderGpuProgramType.kShaderGpuProgramConsoleFS or programType == ShaderGpuProgramType.kShaderGpuProgramConsoleHS or programType == ShaderGpuProgramType.kShaderGpuProgramConsoleDS - or programType == ShaderGpuProgramType.kShaderGpuProgramConsoleGS ) + or programType == ShaderGpuProgramType.kShaderGpuProgramConsoleGS + ) elif platform == ShaderCompilerPlatform.kShaderCompPlatformPSM: raise NotImplementedError elif platform == ShaderCompilerPlatform.kShaderCompPlatformMetal: - return ( programType == ShaderGpuProgramType.kShaderGpuProgramMetalVS - or programType == ShaderGpuProgramType.kShaderGpuProgramMetalVS ) + return ( + programType == ShaderGpuProgramType.kShaderGpuProgramMetalVS + or programType == ShaderGpuProgramType.kShaderGpuProgramMetalVS + ) elif platform == ShaderCompilerPlatform.kShaderCompPlatformOpenGLCore: - return ( programType == ShaderGpuProgramType.kShaderGpuProgramGLCore32 + return ( + programType == ShaderGpuProgramType.kShaderGpuProgramGLCore32 or programType == ShaderGpuProgramType.kShaderGpuProgramGLCore41 - or programType == ShaderGpuProgramType.kShaderGpuProgramGLCore43 ) + or programType == ShaderGpuProgramType.kShaderGpuProgramGLCore43 + ) elif platform == ShaderCompilerPlatform.kShaderCompPlatformN3DS: - return ( programType == ShaderGpuProgramType.kShaderGpuProgramConsoleVS + return ( + programType == ShaderGpuProgramType.kShaderGpuProgramConsoleVS or programType == ShaderGpuProgramType.kShaderGpuProgramConsoleFS or programType == ShaderGpuProgramType.kShaderGpuProgramConsoleHS or programType == ShaderGpuProgramType.kShaderGpuProgramConsoleDS - or programType == ShaderGpuProgramType.kShaderGpuProgramConsoleGS ) + or programType == ShaderGpuProgramType.kShaderGpuProgramConsoleGS + ) elif platform == ShaderCompilerPlatform.kShaderCompPlatformWiiU: - return ( programType == ShaderGpuProgramType.kShaderGpuProgramConsoleVS + return ( + programType == ShaderGpuProgramType.kShaderGpuProgramConsoleVS or programType == ShaderGpuProgramType.kShaderGpuProgramConsoleFS or programType == ShaderGpuProgramType.kShaderGpuProgramConsoleHS or programType == ShaderGpuProgramType.kShaderGpuProgramConsoleDS - or programType == ShaderGpuProgramType.kShaderGpuProgramConsoleGS ) + or programType == ShaderGpuProgramType.kShaderGpuProgramConsoleGS + ) elif platform == ShaderCompilerPlatform.kShaderCompPlatformVulkan: return programType == ShaderGpuProgramType.kShaderGpuProgramSPIRV elif platform == ShaderCompilerPlatform.kShaderCompPlatformSwitch: - return ( programType == ShaderGpuProgramType.kShaderGpuProgramConsoleVS + return ( + programType == ShaderGpuProgramType.kShaderGpuProgramConsoleVS or programType == ShaderGpuProgramType.kShaderGpuProgramConsoleFS or programType == ShaderGpuProgramType.kShaderGpuProgramConsoleHS or programType == ShaderGpuProgramType.kShaderGpuProgramConsoleDS - or programType == ShaderGpuProgramType.kShaderGpuProgramConsoleGS ) + or programType == ShaderGpuProgramType.kShaderGpuProgramConsoleGS + ) elif platform == ShaderCompilerPlatform.kShaderCompPlatformXboxOneD3D12: - return ( programType == ShaderGpuProgramType.kShaderGpuProgramConsoleVS + return ( + programType == ShaderGpuProgramType.kShaderGpuProgramConsoleVS or programType == ShaderGpuProgramType.kShaderGpuProgramConsoleFS or programType == ShaderGpuProgramType.kShaderGpuProgramConsoleHS or programType == ShaderGpuProgramType.kShaderGpuProgramConsoleDS - or programType == ShaderGpuProgramType.kShaderGpuProgramConsoleGS ) + or programType == ShaderGpuProgramType.kShaderGpuProgramConsoleGS + ) else: raise NotImplementedError -def GetPlatformString(platform): +def GetPlatformString(platform: int): if platform == ShaderCompilerPlatform.kShaderCompPlatformGL: return "openGL" elif platform == ShaderCompilerPlatform.kShaderCompPlatformD3D9: @@ -452,11 +578,13 @@ def GetPlatformString(platform): class ShaderProgram: - def __init__(self, reader: EndianBinaryReader, version): + m_SubPrograms: List[ShaderSubProgram] + + def __init__(self, reader: EndianBinaryReader, version: Tuple[int, int, int, int]): subProgramCapacity = reader.read_int() - self.m_SubPrograms = [] + self.m_SubPrograms = [None] * subProgramCapacity - if version >=(2019, 3): # 2019.3 and up + if version >= (2019, 3): # 2019.3 and up entrySize = 12 else: entrySize = 8 @@ -465,27 +593,35 @@ def __init__(self, reader: EndianBinaryReader, version): reader.Position = 4 + i * entrySize offset = reader.read_int() reader.Position = offset - self.m_SubPrograms.append(ShaderSubProgram(reader)) + self.m_SubPrograms[i] = ShaderSubProgram(reader) - def Export(self, shader): - shader = re.sub(r"GpuProgramIndex (.+)", - lambda math: self.m_SubPrograms[int(math.group(1))].Export(), - shader) + def Export(self, shader: str) -> str: + shader = re.sub( + r"GpuProgramIndex (.+)", + lambda math: self.m_SubPrograms[int(math.group(1))].Export(), + shader, + ) return shader class ShaderSubProgram: + m_Version: int + m_ProgramCode: ShaderGpuProgramType + m_Keywords: List[str] + m_ProgramCode: List[bytes] + m_LocalKeywords: Optional[List[str]] + def __init__(self, reader: EndianBinaryReader): - #LoadGpuProgramFromData - #201509030 - Unity 5.3 - #201510240 - Unity 5.4 - #201608170 - Unity 5.5 - #201609010 - Unity 5.6, 2017.1 & 2017.2 - #201708220 - Unity 2017.3, Unity 2017.4 & Unity 2018.1 - #201802150 - Unity 2018.2 & Unity 2018.3 - #201806140 - Unity 2019.1~2020.1 - #202012090 - Unity 2021.2 + # LoadGpuProgramFromData + # 201509030 - Unity 5.3 + # 201510240 - Unity 5.4 + # 201608170 - Unity 5.5 + # 201609010 - Unity 5.6, 2017.1 & 2017.2 + # 201708220 - Unity 2017.3, Unity 2017.4 & Unity 2018.1 + # 201802150 - Unity 2018.2 & Unity 2018.3 + # 201806140 - Unity 2019.1~2020.1 + # 202012090 - Unity 2021.2 self.m_Version = reader.read_int() self.m_ProgramType = ShaderGpuProgramType(reader.read_int()) @@ -495,39 +631,37 @@ def __init__(self, reader: EndianBinaryReader): reader.Position += 4 m_KeywordSize = reader.read_int() - self.m_Keywords = [] - - for i in range(m_KeywordSize): - self.m_Keywords.append(reader.read_aligned_string()) + self.m_Keywords = [reader.read_aligned_string() for _ in range(m_KeywordSize)] if 201806140 <= self.m_Version < 202012090: m_LocalKeywordsSize = reader.read_int() - self.m_LocalKeywords = [] - - for i in range(m_LocalKeywordsSize): - self.m_LocalKeywords.append(reader.read_aligned_string()) + self.m_LocalKeywords = [ + reader.read_aligned_string() for _ in range(m_LocalKeywordsSize) + ] + else: + self.m_LocalKeywords = None self.m_ProgramCode = reader.read_byte_array() reader.align_stream() - def Export(self): + def Export(self) -> str: sb = [] if len(self.m_Keywords) > 0: sb.append("Keywords { ") for keyword in self.m_Keywords: - sb.append("\"{0}\" ".format(keyword)) + sb.append('"{0}" '.format(keyword)) sb.append("}\n") - if hasattr(self, 'm_LocalKeywords') and len(self.m_LocalKeywords) > 0: + if hasattr(self, "m_LocalKeywords") and len(self.m_LocalKeywords) > 0: sb.append("Local Keywords { ") for keyword in self.m_LocalKeywords: - sb.append("\"{0}\" ".format(keyword)) + sb.append('"{0}" '.format(keyword)) sb.append("}\n") - sb.append("\"") + sb.append('"') if len(self.m_ProgramCode) > 0: if self.m_ProgramType in [ @@ -538,14 +672,14 @@ def Export(self): ShaderGpuProgramType.kShaderGpuProgramGLES, ShaderGpuProgramType.kShaderGpuProgramGLCore32, ShaderGpuProgramType.kShaderGpuProgramGLCore41, - ShaderGpuProgramType.kShaderGpuProgramGLCore43 + ShaderGpuProgramType.kShaderGpuProgramGLCore43, ]: sb.append(bytes(self.m_ProgramCode).decode("utf8")) elif self.m_ProgramType in [ ShaderGpuProgramType.kShaderGpuProgramDX9VertexSM20, ShaderGpuProgramType.kShaderGpuProgramDX9VertexSM30, ShaderGpuProgramType.kShaderGpuProgramDX9PixelSM20, - ShaderGpuProgramType.kShaderGpuProgramDX9PixelSM30 + ShaderGpuProgramType.kShaderGpuProgramDX9PixelSM30, ]: sb.append("// shader disassembly not supported on DXBC") elif self.m_ProgramType in [ @@ -558,20 +692,20 @@ def Export(self): ShaderGpuProgramType.kShaderGpuProgramDX11GeometrySM40, ShaderGpuProgramType.kShaderGpuProgramDX11GeometrySM50, ShaderGpuProgramType.kShaderGpuProgramDX11HullSM50, - ShaderGpuProgramType.kShaderGpuProgramDX11DomainSM50 + ShaderGpuProgramType.kShaderGpuProgramDX11DomainSM50, ]: sb.append("// shader disassembly not supported on DXBC") elif self.m_ProgramType in [ ShaderGpuProgramType.kShaderGpuProgramMetalVS, - ShaderGpuProgramType.kShaderGpuProgramMetalFS + ShaderGpuProgramType.kShaderGpuProgramMetalFS, ]: - reader = EndianBinaryReader(self.m_ProgramCode, endian = "<") + reader = EndianBinaryReader(self.m_ProgramCode, endian="<") fourCC = reader.read_u_int() - if fourCC == 0xf00dcafe: + if fourCC == 0xF00DCAFE: offset = reader.read_int() reader.Position = offset - entryName = reader.read_string_to_null() + _entryName = reader.read_string_to_null() buff = reader.read_bytes(int(reader.Length - reader.Position)) sb.append(bytes(buff).decode("utf8")) elif self.m_ProgramType == ShaderGpuProgramType.kShaderGpuProgramSPIRV: @@ -582,11 +716,15 @@ def Export(self): ShaderGpuProgramType.kShaderGpuProgramConsoleFS, ShaderGpuProgramType.kShaderGpuProgramConsoleHS, ShaderGpuProgramType.kShaderGpuProgramConsoleDS, - ShaderGpuProgramType.kShaderGpuProgramConsoleGS + ShaderGpuProgramType.kShaderGpuProgramConsoleGS, ]: sb.append(bytes(self.m_ProgramCode).decode("utf8")) else: - sb.append("//shader disassembly not supported on {0}".format(self.m_ProgramType)) + sb.append( + "//shader disassembly not supported on {0}".format( + self.m_ProgramType + ) + ) sb.append('"') return "".join(sb) From 3845d624e9f4ec9c1a8e295d3a2306b96618de69 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Sat, 21 Sep 2024 00:01:27 +0200 Subject: [PATCH 082/403] SpriteHelper - breaking typo fix, format, type completition --- UnityPy/export/SpriteHelper.py | 50 ++++++++++++++++++---------------- 1 file changed, 27 insertions(+), 23 deletions(-) diff --git a/UnityPy/export/SpriteHelper.py b/UnityPy/export/SpriteHelper.py index a5f32709..3a4bee35 100644 --- a/UnityPy/export/SpriteHelper.py +++ b/UnityPy/export/SpriteHelper.py @@ -1,18 +1,22 @@ +from __future__ import annotations + +from typing import TYPE_CHECKING + from PIL import Image, ImageDraw -from .Texture2DConverter import get_image_from_texture2d from ..enums import ( ClassIDType, + SpriteMeshType, SpritePackingMode, SpritePackingRotation, - SpriteMeshType, ) - from ..helpers.MeshHelper import MeshHandler -from typing import Tuple, TYPE_CHECKING +from .Texture2DConverter import get_image_from_texture2d if TYPE_CHECKING: - from ..classes.generated import Sprite + from typing import List, Optional, Tuple + + from ..classes import PPtr, Sprite, Texture2D class SpriteSettings: @@ -30,12 +34,10 @@ def __init__(self, settings_raw): # rest of the bits are reserved -def get_image(sprite, texture, alpha_texture) -> Image.Image: - if ( - alpha_texture - and getattr(alpha_texture, "type", ClassIDType.UnknownType) - == ClassIDType.Texture2D - ): +def get_image( + sprite: Sprite, texture: PPtr[Texture2D], alpha_texture: Optional[PPtr[Texture2D]] +) -> Image.Image: + if alpha_texture: cache_id = (texture.path_id, alpha_texture.path_id) if cache_id not in sprite.assets_file._cache: original_image = get_image_from_texture2d(texture.read(), False) @@ -52,11 +54,11 @@ def get_image(sprite, texture, alpha_texture) -> Image.Image: return sprite.assets_file._cache[cache_id] -def get_image_from_sprite(m_Sprite: "Sprite") -> Image.Image: +def get_image_from_sprite(m_Sprite: Sprite) -> Image.Image: atlas = None - if getattr(m_Sprite, "m_SpriteAtlas", None): + if m_Sprite.m_SpriteAtlas: atlas = m_Sprite.m_SpriteAtlas.read() - elif getattr(m_Sprite, "m_AtlasTags", None): + elif m_Sprite.m_AtlasTags: # looks like the direct pointer is empty, let's try to find the Atlas via its name for obj in m_Sprite.assets_file.objects.values(): if obj.type == ClassIDType.SpriteAtlas: @@ -121,7 +123,7 @@ def get_image_from_sprite(m_Sprite: "Sprite") -> Image.Image: def mask_sprite( - m_Sprite: "Sprite", mesh: MeshHandler, sprite_image: Image.Image + m_Sprite: Sprite, mesh: MeshHandler, sprite_image: Image.Image ) -> Image.Image: mask_img = Image.new("1", sprite_image.size, color=0) draw = ImageDraw.ImageDraw(mask_img) @@ -164,7 +166,9 @@ def mask_sprite( return sprite_image -def render_sprite_mesh(m_Sprite: "Sprite", mesh: MeshHandler, texture: Image.Image): +def render_sprite_mesh( + m_Sprite: Sprite, mesh: MeshHandler, texture: Image.Image +) -> Image.Image: for triangles in mesh.get_triangles(): positions = mesh.m_Vertices uv = mesh.m_UV0 @@ -218,7 +222,7 @@ def copy_triangle( src_tri: Tuple[float, float], dst_img: Image.Image, dst_tri: Tuple[float, float], -): +) -> None: src_off = ( (src_tri[1][0] - src_tri[0][0], src_tri[1][1] - src_tri[0][1]), (src_tri[2][0] - src_tri[0][0], src_tri[2][1] - src_tri[0][1]), @@ -275,23 +279,23 @@ def copy_triangle( dst_img.paste(transformed, mask=mask) -def linalg_solve(M, y): +def linalg_solve(M: List[List[float]], y: List[float]) -> List[float]: # M^-1 * y M_i = get_matrix_inverse(M) return [sum(M_i[i][j] * y[j] for j in range(len(y))) for i in range(len(M_i))] -def transpose_matrix(m): +def transpose_matrix(m: List[List[float]]) -> List[List[float]]: # https://stackoverflow.com/a/39881366 return map(list, zip(*m)) -def get_matrix_minor(m, i, j): +def get_matrix_minor(m: List[List[float]], i: int, j: int) -> List[float]: # https://stackoverflow.com/a/39881366 return [row[:j] + row[j + 1 :] for row in (m[:i] + m[i + 1 :])] -def get_matrix_determinant(m): +def get_matrix_determinant(m: List[List[float]]) -> float: # https://stackoverflow.com/a/39881366 # base case for 2x2 matrix if len(m) == 2: @@ -303,7 +307,7 @@ def get_matrix_determinant(m): ) -def get_matrix_inverse(m): +def get_matrix_inverse(m: List[List[float]]) -> List[List[float]]: # https://stackoverflow.com/a/39881366 determinant = get_matrix_determinant(m) # special case for 2x2 matrix: @@ -323,7 +327,7 @@ def get_matrix_inverse(m): ] cofactors = list(transpose_matrix(cofactors)) - return [[c / determinant for c in range(row)] for row in cofactors] + return [[c / determinant for c in row] for row in cofactors] __all__ = ["get_image_from_sprite"] From 5da7d0b617afde3516d9458a45df62349557f5d1 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Sat, 21 Sep 2024 00:06:53 +0200 Subject: [PATCH 083/403] Texture2DConverter - format import, add missing type hints --- UnityPy/export/Texture2DConverter.py | 38 +++++++++++++++++----------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/UnityPy/export/Texture2DConverter.py b/UnityPy/export/Texture2DConverter.py index 06a25305..3e731c4e 100644 --- a/UnityPy/export/Texture2DConverter.py +++ b/UnityPy/export/Texture2DConverter.py @@ -1,18 +1,26 @@ -import texture2ddecoder -from PIL import Image +from __future__ import annotations + +import struct from copy import copy from io import BytesIO -import struct -from ..enums import TextureFormat, BuildTarget +from typing import TYPE_CHECKING, Tuple, Union + +import texture2ddecoder +from PIL import Image + +from ..enums import BuildTarget, TextureFormat from ..helpers import TextureSwizzler -from typing import Union + +if TYPE_CHECKING: + from ..classes import Texture2D + TF = TextureFormat def image_to_texture2d( img: Image.Image, target_texture_format: Union[TF, int], flip: bool = True -): +) -> Tuple[bytes, TextureFormat]: if isinstance(target_texture_format, int): target_texture_format = TextureFormat(target_texture_format) @@ -87,7 +95,7 @@ def image_to_texture2d( return enc_img, tex_format -def assert_rgba(img: Image.Image, target_texture_format: TextureFormat): +def assert_rgba(img: Image.Image, target_texture_format: TextureFormat) -> Image.Image: if img.mode == "RGB": img = img.convert("RGBA") assert ( @@ -97,8 +105,8 @@ def assert_rgba(img: Image.Image, target_texture_format: TextureFormat): def get_image_from_texture2d( - texture_2d: "Texture2D", - flip=True, + texture_2d: Texture2D, + flip: bool = True, ) -> Image.Image: """converts the given texture into PIL.Image @@ -125,11 +133,11 @@ def parse_image_data( image_data: bytes, width: int, height: int, - texture_format: TextureFormat, + texture_format: Union[int, TextureFormat], version: tuple, platform: int, platform_blob: bytes = None, - flip=True, + flip: bool = True, ) -> Image.Image: image_data = copy(bytes(image_data)) if not image_data: @@ -225,12 +233,12 @@ def astc(image_data: bytes, width: int, height: int, block_size: tuple) -> Image return Image.frombytes("RGBA", (width, height), image_data, "raw", "BGRA") -def pvrtc(image_data: bytes, width: int, height: int, fmt: bool): +def pvrtc(image_data: bytes, width: int, height: int, fmt: bool) -> Image.Image: image_data = texture2ddecoder.decode_pvrtc(image_data, width, height, fmt) return Image.frombytes("RGBA", (width, height), image_data, "raw", "BGRA") -def etc(image_data: bytes, width: int, height: int, fmt: list): +def etc(image_data: bytes, width: int, height: int, fmt: list) -> Image.Image: if fmt[0] == 1: image_data = texture2ddecoder.decode_etc1(image_data, width, height) elif fmt[0] == 2: @@ -245,7 +253,7 @@ def etc(image_data: bytes, width: int, height: int, fmt: list): return Image.frombytes("RGBA", (width, height), image_data, "raw", "BGRA") -def eac(image_data: bytes, width: int, height: int, fmt: list): +def eac(image_data: bytes, width: int, height: int, fmt: list) -> Image.Image: if fmt == "EAC_R": image_data = texture2ddecoder.decode_eacr(image_data, width, height) elif fmt == "EAC_R_SIGNED": @@ -301,7 +309,7 @@ def rg( return pillow(rgb_data, width, height, mode, codec.replace("RG", "RGB"), args) -def rgb9e5float(image_data: bytes, width: int, height: int): +def rgb9e5float(image_data: bytes, width: int, height: int) -> Image.Image: rgb = bytearray(width * height * 3) for i, (n,) in enumerate(struct.iter_unpack("> 27 & 0x1F From 8ade10ee2a9cc7737a0e7168d7e79eaa4eb6ae51 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Sat, 21 Sep 2024 00:10:23 +0200 Subject: [PATCH 084/403] AudioClipConverter - format --- UnityPy/export/AudioClipConverter.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/UnityPy/export/AudioClipConverter.py b/UnityPy/export/AudioClipConverter.py index fddceeda..e8a1662b 100644 --- a/UnityPy/export/AudioClipConverter.py +++ b/UnityPy/export/AudioClipConverter.py @@ -1,8 +1,12 @@ +from __future__ import annotations + import ctypes import os import platform -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, Dict + from UnityPy.streams import EndianBinaryWriter + from ..helpers.ResourceReader import get_resource_data if TYPE_CHECKING: @@ -73,7 +77,7 @@ def import_pyfmodex(): import pyfmodex -def extract_audioclip_samples(audio: "AudioClip") -> dict: +def extract_audioclip_samples(audio: AudioClip) -> Dict[str, bytes]: """extracts all the samples from an AudioClip :param audio: AudioClip :type audio: AudioClip @@ -101,7 +105,7 @@ def extract_audioclip_samples(audio: "AudioClip") -> dict: return dump_samples(audio, audio_data) -def dump_samples(clip: "AudioClip", audio_data: bytes) -> dict: +def dump_samples(clip: AudioClip, audio_data: bytes) -> Dict[str, bytes]: if pyfmodex is None: import_pyfmodex() if not pyfmodex: @@ -136,7 +140,7 @@ def dump_samples(clip: "AudioClip", audio_data: bytes) -> dict: return samples -def subsound_to_wav(subsound): +def subsound_to_wav(subsound) -> bytes: # get sound settings length = subsound.get_length(pyfmodex.enums.TIMEUNIT.PCMBYTES) channels = subsound.format.channels From 301b32524b995f342c0ef3f7eef0bbd616551762 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Sat, 21 Sep 2024 00:12:09 +0200 Subject: [PATCH 085/403] MeshExporter - improve type hints --- UnityPy/export/MeshExporter.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/UnityPy/export/MeshExporter.py b/UnityPy/export/MeshExporter.py index 8c11e475..33503c5a 100644 --- a/UnityPy/export/MeshExporter.py +++ b/UnityPy/export/MeshExporter.py @@ -1,18 +1,22 @@ -from typing import TYPE_CHECKING +from __future__ import annotations + +from typing import TYPE_CHECKING, List, Literal, Optional from ..helpers.MeshHelper import MeshHandler if TYPE_CHECKING: from ..classes.generated import Mesh +MESH_EXPORT_FORMATS = Literal["obj"] + -def export_mesh(m_Mesh: "Mesh", format="obj") -> str: +def export_mesh(m_Mesh: Mesh, format: MESH_EXPORT_FORMATS = "obj") -> str: if format == "obj": return export_mesh_obj(m_Mesh) raise NotImplementedError(f"Export format {format} not implemented") -def export_mesh_obj(mesh: "Mesh", material_names: list = None): +def export_mesh_obj(mesh: Mesh, material_names: Optional[List[str]] = None) -> str: handler = MeshHandler(mesh) handler.process() From cbd067121931352e02b5bbde8e3ee7b8ce1f0b32 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Sat, 21 Sep 2024 00:31:38 +0200 Subject: [PATCH 086/403] MeshRendererExporter - fixes, improved type hints --- UnityPy/export/MeshRendererExporter.py | 98 +++++++++++++++++++------- 1 file changed, 72 insertions(+), 26 deletions(-) diff --git a/UnityPy/export/MeshRendererExporter.py b/UnityPy/export/MeshRendererExporter.py index aff0875e..55a52dc7 100644 --- a/UnityPy/export/MeshRendererExporter.py +++ b/UnityPy/export/MeshRendererExporter.py @@ -1,53 +1,88 @@ -from ..classes import Renderer, SkinnedMeshRenderer, Material +from __future__ import annotations + +from typing import TYPE_CHECKING, List, Optional + from .MeshExporter import export_mesh_obj +if TYPE_CHECKING: + from ..classes import ( + Material, + Mesh, + MeshFilter, + PPtr, + Renderer, + SkinnedMeshRenderer, + StaticBatchInfo, + Texture2D, + ) + + class Renderer(Renderer): + m_Materials: Optional[list[PPtr[Material]]] = None + m_StaticBatchInfo: Optional[StaticBatchInfo] = None + m_SubsetIndices: Optional[List[int]] = None + -def get_mesh(meshR: Renderer): - if isinstance(meshR, SkinnedMeshRenderer.SkinnedMeshRenderer): +def get_mesh(meshR: Renderer) -> Optional[Mesh]: + if isinstance(meshR, SkinnedMeshRenderer): if meshR.m_Mesh: return meshR.m_Mesh.read() else: m_GameObject = meshR.m_GameObject.read() - if m_GameObject.m_MeshFilter: - filter = m_GameObject.m_MeshFilter.read() - if filter.m_Mesh: - return filter.m_Mesh.read() + for comp in m_GameObject.m_Component: + if isinstance(comp, tuple): + pptr = comp[1] + else: + pptr = comp.component + if not pptr: + continue + obj = pptr.deref() + if not obj: + continue + if obj.type.name == "MeshFilter": + filter: MeshFilter = pptr.read() + if filter.m_Mesh: + return filter.m_Mesh.read() return None -def export_mesh_renderer(obj: Renderer, export_dir: str) -> None: - env = obj.assets_file.enviroment +def export_mesh_renderer(renderer: Renderer, export_dir: str) -> None: + env = renderer.object_reader.assets_file.enviroment env.fs.makedirs(export_dir, exist_ok=True) - meshR = obj.read() - mesh = get_mesh(meshR) + mesh = get_mesh(renderer) if not mesh: return firstSubMesh = 0 - if hasattr(meshR, "m_StaticBatchInfo") and meshR.m_StaticBatchInfo.subMeshCount > 0: - firstSubMesh = meshR.m_StaticBatchInfo.firstSubMesh - elif hasattr(meshR, "m_SubsetIndices"): - firstSubMesh = min(meshR.m_SubsetIndices) + if ( + hasattr(renderer, "m_StaticBatchInfo") + and renderer.m_StaticBatchInfo.subMeshCount > 0 + ): + firstSubMesh = renderer.m_StaticBatchInfo.firstSubMesh + elif hasattr(renderer, "m_SubsetIndices"): + firstSubMesh = min(renderer.m_SubsetIndices) materials = [] material_names = [] for i, submesh in enumerate(mesh.m_SubMeshes): mat_index = i - firstSubMesh - if mat_index < 0 or mat_index >= len(meshR.m_Materials): + if mat_index < 0 or mat_index >= len(renderer.m_Materials): continue - matPtr = meshR.m_Materials[i - firstSubMesh] + matPtr: Optional[PPtr[Material]] = renderer.m_Materials[i - firstSubMesh] if matPtr: - mat = matPtr.read() + mat: Material = matPtr.read() else: material_names.append(None) continue materials.append(export_material(mat)) material_names.append(mat.m_Name) # save material textures - for key, texEnv in mat.m_SavedProperties.m_TexEnvs.items(): + for key, texEnv in mat.m_SavedProperties.m_TexEnvs: if not texEnv.m_Texture: continue - tex = texEnv.m_Texture.read() + if not isinstance(key, str): + # FastPropertyName + key = key.name + tex: Texture2D = texEnv.m_Texture.read() texName = f"{tex.m_Name if tex.m_Name else key}.png" with env.fs.open(env.fs.sep.join([export_dir, texName]), "wb") as f: tex.read().image.save(f) @@ -79,9 +114,16 @@ def clt(color): # color to tuple color if isinstance(color, tuple) else (color.R, color.G, color.B, color.A) ) - colors = mat.m_SavedProperties.m_Colors - floats = mat.m_SavedProperties.m_Floats - texEnvs = mat.m_SavedProperties.m_TexEnvs + def properties_to_dict(properties): + return { + k if isinstance(k, str) else k.name: v + for k, v in properties + if v is not None + } + + colors = properties_to_dict(mat.m_SavedProperties.m_Colors) + floats = properties_to_dict(mat.m_SavedProperties.m_Floats) + texEnvs = properties_to_dict(mat.m_SavedProperties.m_TexEnvs) diffuse = clt(colors.get("_Color", (0.8, 0.8, 0.8, 1))) ambient = clt(colors.get("_SColor", (0.2, 0.2, 0.2, 1))) @@ -91,7 +133,7 @@ def clt(color): # color to tuple shininess = floats.get("_Shininess", 20.0) transparency = floats.get("_Transparency", 0.0) - sb = [] + sb: List[str] = [] sb.append(f"newmtl {mat.m_Name}") # Ka r g b # defines the ambient color of the material to be (r,g,b). The default is (0.2,0.2,0.2); @@ -116,10 +158,14 @@ def clt(color): # color to tuple # names a file containing a texture map, which should just be an ASCII dump of RGB values; texName = None tex = None - for key, texEnv in texEnvs.items(): + for key, texEnv in texEnvs: if not texEnv.m_Texture: continue - tex = texEnv.m_Texture.read() + if not isinstance(key, str): + # FastPropertyName + key = key.name + + tex: Texture2D = texEnv.m_Texture.read() texName = f"{tex.m_Name if tex.m_Name else key}.png" if key == "_MainTex": sb.append(f"map_Kd {texName}") From 1155a1ef4cfbc8e6a888d7d7e56c063af0eb7406 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Sat, 21 Sep 2024 20:53:22 +0200 Subject: [PATCH 087/403] CompressionHelper - type hint compatiblity fix --- UnityPy/helpers/CompressionHelper.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/UnityPy/helpers/CompressionHelper.py b/UnityPy/helpers/CompressionHelper.py index e3d51d64..9572d40a 100644 --- a/UnityPy/helpers/CompressionHelper.py +++ b/UnityPy/helpers/CompressionHelper.py @@ -1,6 +1,7 @@ import gzip import lzma import struct +from typing import Tuple import brotli import lz4.block @@ -153,7 +154,7 @@ def compress_gzip(data: bytes) -> bytes: return gzip.compress(data) -def chunk_based_compress(data: bytes, block_info_flag: int) -> (bytes, list): +def chunk_based_compress(data: bytes, block_info_flag: int) -> Tuple[bytes, list]: """compresses AssetBundle data based on the block_info_flag LZ4/LZ4HC will be chunk-based compression @@ -180,9 +181,9 @@ def chunk_based_compress(data: bytes, block_info_flag: int) -> (bytes, list): compressed_file_data = bytearray() p = 0 while uncompressed_data_size > chunk_size: - compressed_data = compress_func(data[p: p + chunk_size]) + compressed_data = compress_func(data[p : p + chunk_size]) if len(compressed_data) > chunk_size: - compressed_file_data.extend(data[p: p + chunk_size]) + compressed_file_data.extend(data[p : p + chunk_size]) block_info.append( ( chunk_size, From 41d044a82a5892644877b62d7786cdf073983c5b Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Sat, 21 Sep 2024 20:53:39 +0200 Subject: [PATCH 088/403] tests - test saving --- tests/test_main.py | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/tests/test_main.py b/tests/test_main.py index 8a531c8f..5407f03b 100644 --- a/tests/test_main.py +++ b/tests/test_main.py @@ -1,9 +1,10 @@ import io import os -import UnityPy from PIL import Image +import UnityPy + SAMPLES = os.path.join(os.path.dirname(os.path.abspath(__file__)), "samples") @@ -20,6 +21,24 @@ def test_read_batch(): obj.read() +def test_save_dict(): + env = UnityPy.load(SAMPLES) + for obj in env.objects: + data = obj.get_raw_data() + item = obj.read_typetree(wrap=False) + re_data = obj.save_typetree(item) + assert data == re_data + + +def test_save_wrap(): + env = UnityPy.load(SAMPLES) + for obj in env.objects: + data = obj.get_raw_data() + item = obj.read_typetree(wrap=True) + re_data = obj.save_typetree(item) + assert data == re_data + + def test_texture2d(): for f in os.listdir(SAMPLES): env = UnityPy.load(os.path.join(SAMPLES, f)) From ecb9d5eead6fe5e3696f2d84c15cec91664a1214 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Sat, 21 Sep 2024 20:55:03 +0200 Subject: [PATCH 089/403] use importlib instead of manual os.path --- UnityPy/export/AudioClipConverter.py | 19 ++++++++------- UnityPy/helpers/Tpk.py | 29 +++++++++++------------ UnityPy/lib/FMOD/Darwin/x64/__init__.py | 0 UnityPy/lib/FMOD/Linux/arm/__init__.py | 0 UnityPy/lib/FMOD/Linux/armhf/__init__.py | 0 UnityPy/lib/FMOD/Linux/x86/__init__.py | 0 UnityPy/lib/FMOD/Linux/x86_64/__init__.py | 0 UnityPy/lib/FMOD/Windows/x64/__init__.py | 0 UnityPy/lib/FMOD/Windows/x86/__init__.py | 0 UnityPy/lib/FMOD/__init__.py | 0 UnityPy/lib/__init__.py | 0 pyproject.toml | 2 +- 12 files changed, 26 insertions(+), 24 deletions(-) create mode 100644 UnityPy/lib/FMOD/Darwin/x64/__init__.py create mode 100644 UnityPy/lib/FMOD/Linux/arm/__init__.py create mode 100644 UnityPy/lib/FMOD/Linux/armhf/__init__.py create mode 100644 UnityPy/lib/FMOD/Linux/x86/__init__.py create mode 100644 UnityPy/lib/FMOD/Linux/x86_64/__init__.py create mode 100644 UnityPy/lib/FMOD/Windows/x64/__init__.py create mode 100644 UnityPy/lib/FMOD/Windows/x86/__init__.py create mode 100644 UnityPy/lib/FMOD/__init__.py create mode 100644 UnityPy/lib/__init__.py diff --git a/UnityPy/export/AudioClipConverter.py b/UnityPy/export/AudioClipConverter.py index e8a1662b..0c5fc447 100644 --- a/UnityPy/export/AudioClipConverter.py +++ b/UnityPy/export/AudioClipConverter.py @@ -3,6 +3,7 @@ import ctypes import os import platform +from importlib.resources import path from typing import TYPE_CHECKING, Dict from UnityPy.streams import EndianBinaryWriter @@ -25,8 +26,6 @@ def import_pyfmodex(): if pyfmodex is not None: return - ROOT = os.path.dirname(os.path.dirname(os.path.realpath(__file__))) - # determine system - Windows, Darwin, Linux, Android system = platform.system() if system == "Linux" and "ANDROID_BOOTLOGO" in os.environ: @@ -62,17 +61,21 @@ def import_pyfmodex(): ) # build path and load library - LIB_PATH = os.path.join(ROOT, "lib", "FMOD", system, arch) - # prepare the environment for pyfmodex if system == "Windows": - os.environ["PYFMODEX_DLL_PATH"] = os.path.join(LIB_PATH, "fmod.dll") + libname = "fmod.dll" else: ext = "dylib" if system == "Darwin" else "so" - os.environ["PYFMODEX_DLL_PATH"] = os.path.join(LIB_PATH, f"libfmod.{ext}") + libname = f"libfmod.{ext}" + # hotfix ctypes for pyfmodex for non windows systems + ctypes.windll = None + + fp = path(f"UnityPy.lib.FMOD.{system}.{arch}", libname) + if hasattr(fp, "args"): + # some newer version doesn't directly return a path, but instead a generator + fp = fp.args[0] - # hotfix ctypes for pyfmodex for non windows - ctypes.windll = getattr(ctypes, "windll", None) + os.environ["PYFMODEX_DLL_PATH"] = str(fp.absolute()) import pyfmodex diff --git a/UnityPy/helpers/Tpk.py b/UnityPy/helpers/Tpk.py index 87611d1b..121a9444 100644 --- a/UnityPy/helpers/Tpk.py +++ b/UnityPy/helpers/Tpk.py @@ -1,8 +1,11 @@ from __future__ import annotations + from enum import IntEnum, IntFlag -from struct import Struct +from importlib.resources import open_binary from io import BytesIO -from typing import List, Tuple, Any, Dict +from struct import Struct +from typing import Any, Dict, List, Tuple + from .TypeTreeHelper import TypeTreeNode TPKTYPETREE: TpkTypeTreeBlob = None @@ -10,16 +13,12 @@ def init(): - import os + with open_binary("UnityPy.resources", "uncompressed.tpk") as f: + data = f.read() - with open( - os.path.join( - os.path.dirname(os.path.dirname(__file__)), "resources", "uncompressed.tpk" - ), - "rb", - ) as f: - global TPKTYPETREE - TPKTYPETREE = TpkFile(f).GetDataBlob() + global TPKTYPETREE + with BytesIO(data) as stream: + TPKTYPETREE = TpkFile(stream).GetDataBlob() def get_typetree_node(class_id: int, version: tuple): @@ -172,12 +171,12 @@ def GetDataBlob(self) -> TpkDataBlob: elif self.CompressionType == TpkCompressionType.Lzma: import lzma - raise Exception("LZMA compression not implemented") + decompressed = lzma.decompress(self.CompressedBytes) elif self.CompressionType == TpkCompressionType.Brotli: import brotli - decompressed = brotli.decompress(self.CompressedBytes) + decompressed: bytes = brotli.decompress(self.CompressedBytes) else: raise Exception("Invalid compression type") @@ -193,7 +192,7 @@ def GetDataBlob(self) -> TpkDataBlob: class TpkDataBlob: - __slots__ = "DataType" + __slots__ = ("DataType",) DataType: TpkDataType def __init__(self, stream: BytesIO) -> None: @@ -247,7 +246,7 @@ def __init__(self, stream: BytesIO) -> None: class TpkFileSystemBlob(TpkDataBlob): - __slots__ = "Files" + __slots__ = ("Files",) # TODO: check if dict might be better Files: List[Tuple[str, bytes]] diff --git a/UnityPy/lib/FMOD/Darwin/x64/__init__.py b/UnityPy/lib/FMOD/Darwin/x64/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/UnityPy/lib/FMOD/Linux/arm/__init__.py b/UnityPy/lib/FMOD/Linux/arm/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/UnityPy/lib/FMOD/Linux/armhf/__init__.py b/UnityPy/lib/FMOD/Linux/armhf/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/UnityPy/lib/FMOD/Linux/x86/__init__.py b/UnityPy/lib/FMOD/Linux/x86/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/UnityPy/lib/FMOD/Linux/x86_64/__init__.py b/UnityPy/lib/FMOD/Linux/x86_64/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/UnityPy/lib/FMOD/Windows/x64/__init__.py b/UnityPy/lib/FMOD/Windows/x64/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/UnityPy/lib/FMOD/Windows/x86/__init__.py b/UnityPy/lib/FMOD/Windows/x86/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/UnityPy/lib/FMOD/__init__.py b/UnityPy/lib/FMOD/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/UnityPy/lib/__init__.py b/UnityPy/lib/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/pyproject.toml b/pyproject.toml index 22bb1298..96bc4f86 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -8,7 +8,7 @@ authors = [{ name = "Rudolf Kolbe", email = "rkolbe96@gmail.com" }] description = "A Unity extraction and patching package" readme = "README.md" license = { file = "LICENSE" } -requires-python = ">=3.6" +requires-python = ">=3.7" keywords = [ "python", "unity", From 5ac0a62c59102ee0c53ad265d7d589d6ad6e7ccd Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Sat, 21 Sep 2024 20:56:52 +0200 Subject: [PATCH 090/403] SerializedFile - cleanup and ContainerHelper improvement --- UnityPy/files/SerializedFile.py | 214 ++++++++++++-------------------- 1 file changed, 76 insertions(+), 138 deletions(-) diff --git a/UnityPy/files/SerializedFile.py b/UnityPy/files/SerializedFile.py index 87ee69d5..7b3594ed 100644 --- a/UnityPy/files/SerializedFile.py +++ b/UnityPy/files/SerializedFile.py @@ -1,16 +1,24 @@ -from ntpath import basename +from __future__ import annotations + import re +from ntpath import basename +from typing import TYPE_CHECKING, Dict, Generator, List, Optional, Tuple + +from attrs import define -from . import File, ObjectReader, BundleFile +from .. import config from ..enums import BuildTarget, ClassIDType, CommonString -from ..streams import EndianBinaryReader, EndianBinaryWriter from ..helpers.TypeTreeHelper import TypeTreeNode +from ..streams import EndianBinaryWriter +from . import BundleFile, File, ObjectReader -from struct import Struct - -from .. import config +if TYPE_CHECKING: + from ..classes import AssetBundle, AssetInfo + from ..files import ObjectReader + from ..streams.EndianBinaryReader import EndianBinaryReader +@define(slots=True) class SerializedFileHeader: metadata_size: int file_size: int @@ -28,6 +36,7 @@ def __init__(self, reader: EndianBinaryReader): ) = reader.read_u_int_array(4) +@define(slots=True) class LocalSerializedObjectIdentifier: # script type local_serialized_file_index: int local_identifier_in_file: int @@ -49,11 +58,13 @@ def write(self, header: SerializedFileHeader, writer: EndianBinaryWriter): writer.write_long(self.local_identifier_in_file) +@define(slots=True) class FileIdentifier: # external - guid: bytes - type: int - # enum { kNonAssetType = 0, kDeprecatedCachedAssetType = 1, kSerializedAssetType = 2, kMetaAssetType = 3 }; path: str + temp_empty: Optional[str] = None + guid: Optional[bytes] = None + type: Optional[int] = None + # enum { kNonAssetType = 0, kDeprecatedCachedAssetType = 1, kSerializedAssetType = 2, kMetaAssetType = 3 }; @property def name(self): @@ -79,6 +90,7 @@ def write(self, header: SerializedFileHeader, writer: EndianBinaryWriter): writer.write_string_to_null(self.path) +@define(slots=True) class BuildType: build_type: str @@ -94,15 +106,27 @@ def IsPatch(self): return self.build_type == "p" +@define(slots=True) class SerializedType: class_id: int - is_stripped_type: bool - script_type_index = -1 - nodes: list = [] # TypeTreeNode - script_id: bytes # Hash128 - old_type_hash: bytes # Hash128} - - def __init__(self, reader, serialized_file, is_ref_type: bool): + is_stripped_type: Optional[bool] = None + script_type_index: Optional[int] = -1 + script_id: Optional[bytes] = None # Hash128 + old_type_hash: Optional[bytes] = None # Hash128 + node: Optional[TypeTreeNode] = None + # ref type + m_ClassName: Optional[str] = None + m_NameSpace: Optional[str] = None + m_AssemblyName: Optional[str] = None + # 21+ + type_dependencies: Optional[List[int]] = None + + def __init__( + self, + reader: EndianBinaryReader, + serialized_file: SerializedFile, + is_ref_type: bool, + ): version = serialized_file.header.version self.class_id = reader.read_int() @@ -123,9 +147,9 @@ def __init__(self, reader, serialized_file, is_ref_type: bool): if serialized_file._enable_type_tree: if version >= 12 or version == 10: - self.nodes = TypeTreeNode.parse_blob(reader, version) + self.node = TypeTreeNode.parse_blob(reader, version) else: - self.nodes = TypeTreeNode.parse(reader, version) + self.node = TypeTreeNode.parse(reader, version) if version >= 21: if is_ref_type: @@ -135,7 +159,12 @@ def __init__(self, reader, serialized_file, is_ref_type: bool): else: self.type_dependencies = reader.read_int_array() - def write(self, serialized_file, writer, is_ref_type): + def write( + self, + serialized_file: SerializedFile, + writer: EndianBinaryWriter, + is_ref_type: bool, + ): version = serialized_file.header.version writer.write_int(self.class_id) @@ -155,8 +184,9 @@ def write(self, serialized_file, writer, is_ref_type): writer.write_bytes(self.old_type_hash) # Hash128 if serialized_file._enable_type_tree: + assert self.node is not None if version >= 12 or version == 10: - self.nodes.dump_blob(writer, version) + self.node.dump_blob(writer, version) else: serialized_file.dump(writer, version) @@ -181,8 +211,8 @@ class SerializedFile(File.File): externals: list objects: dict _cache: dict - assetbundle: "AssetBundle" - container: "ContainerHelper" + assetbundle: AssetBundle + container: ContainerHelper header: SerializedFileHeader @property @@ -288,8 +318,8 @@ def __init__(self, reader: EndianBinaryReader, parent=None, name=None, **kwargs) # read the asset_bundles to get the containers for obj in self.objects.values(): if obj.type == ClassIDType.AssetBundle: - self.assetbundle = obj.read_typetree(wrap=True) - self._container = ContainerHelper(self.assetbundle.m_Container) + self.assetbundle = obj.read() + self._container = ContainerHelper(self.assetbundle) break else: self.assetbundle = None @@ -316,7 +346,7 @@ def load_dependencies(self, possible_dependencies: list = []): except FileNotFoundError: pass - def set_version(self, string_version): + def set_version(self, string_version: str): self.unity_version = string_version if not string_version or string_version == "0.0.0": # weird case, but apparently can happen? @@ -463,103 +493,6 @@ def save(self, packer: str = None) -> bytes: return writer.bytes - def save_serialized_type( - self, - typ: SerializedType, - header: SerializedFileHeader, - writer: EndianBinaryWriter, - ): - writer.write_int(typ.class_id) - - if header.version >= 16: - writer.write_boolean(typ.is_stripped_type) - - if header.version >= 17: - writer.write_short(typ.script_type_index) - - if header.version >= 13: - if (header.version < 16 and typ.class_id < 0) or ( - header.version >= 16 and typ.class_id == 114 - ): - writer.write_bytes(typ.script_id) # Hash128 - writer.write_bytes(typ.old_type_hash) # Hash128 - - if self._enable_type_tree: - if header.version >= 12 or header.version == 10: - self.save_type_tree5(typ.nodes, writer, typ.string_data) - else: - self.save_type_tree(typ.nodes, writer) - - def save_type_tree(self, nodes: list, writer: EndianBinaryWriter): - for i, node in nodes: - writer.write_string_to_null(node.m_Type) - writer.write_string_to_null(node.m_Name) - writer.write_int(node.byte_size) - if self.header.version == 2: - writer.write_int(node.m_VariableCount) - - if self.header.version != 3: - writer.write_int(node.m_Index) - - writer.write_int(node.m_TypeFlags) - writer.write_int(node.m_Version) - if self.header.version != 3: - writer.write_int(node.m_MetaFlag) - - # calc children count - children_count = 0 - for node2 in nodes[i + 1 :]: - if node2.m_Level == node.m_Level: - break - if node2.m_Level == node.m_Level - 1: - children_count += 1 - writer.write_int(children_count) - - def save_type_tree5(self, nodes: list, writer: EndianBinaryWriter, str_data=b""): - # node count - # stream buffer size - # node data - # string buffer - - string_buffer = EndianBinaryWriter() - string_buffer.write(str_data) - strings_values = [ - (node.m_TypeStrOffset, node.m_NameStrOffset) for node in nodes - ] - - # number of nodes - writer.write_int(len(nodes)) - # string buffer size - writer.write_int(string_buffer.Length) - - # nodes - for i, node in enumerate(nodes): - # version - writer.write_u_short(node.m_Version) - # level - writer.write_byte(node.m_Level) - # is array - writer.write_u_byte(node.m_TypeFlags) - # type str offfset - writer.write_u_int(strings_values[i][0]) - # name str offset - writer.write_u_int(strings_values[i][1]) - # byte size - writer.write_int(node.m_ByteSize) - # index - writer.write_int(node.m_Index) - # meta flag - writer.write_int(node.m_MetaFlag) - # ref hash - if self.header.version > 19: - writer.write_u_long(node.m_RefTypeHash) - - # string buffer - writer.write(string_buffer.bytes) - - if self.header.version >= 21: - writer.write_bytes(b"\x00" * 4) - def read_string(string_buffer_reader: EndianBinaryReader, value: int) -> str: is_offset = (value & 0x80000000) == 0 @@ -571,48 +504,53 @@ def read_string(string_buffer_reader: EndianBinaryReader, value: int) -> str: return CommonString.get(offset, str(offset)) +@define(slots=True) class ContainerHelper: """Helper class to allow multidict containers without breaking compatibility with old versions""" - def __init__(self, container) -> None: - self.container = container + container: Tuple[str, AssetInfo] + container_dict: Dict[str, ObjectReader] + path_dict: Dict[int, str] + + def __init__(self, assetbundle: AssetBundle) -> None: + self.container = assetbundle.m_Container # support for getitem - self.container_dict = {key: value.asset for key, value in container} - self.path_dict = {value.asset.m_PathID: key for key, value in container} + self.container_dict = {key: value.asset for key, value in self.container} + self.path_dict = {value.asset.m_PathID: key for key, value in self.container} - def items(self): + def items(self) -> Generator[Tuple[str, ObjectReader], None, None]: return ((key, value.asset) for key, value in self.container) - def keys(self): + def keys(self) -> list[str]: return list({key for key, value in self.container}) - def values(self): + def values(self) -> list[ObjectReader]: return list({value.asset for key, value in self.container}) - def __getitem__(self, key): + def __getitem__(self, key) -> ObjectReader: return self.container_dict[key] - def __setitem__(self, key, value): + def __setitem__(self, key, value) -> None: raise NotImplementedError("Assigning to container is not allowed!") - def __delitem__(self, key): + def __delitem__(self, key) -> None: raise NotImplementedError("Deleting from the container is not allowed!") - def __iter__(self): + def __iter__(self) -> Generator[str, None, None]: return iter(self.keys()) - def __len__(self): + def __len__(self) -> int: return len(self.container) - def __getattr__(self, name: str): + def __getattr__(self, name: str) -> ObjectReader: return self.container_dict[name] - def __or__(self, other: "ContainerHelper"): + def __or__(self, other: ContainerHelper): return ContainerHelper(list(set(self.container + other.container))) - def __str__(self): + def __str__(self) -> str: return f'{{{", ".join(f"{key}: {value}" for key, value in self.items())}}}' - def __dict__(self): + def __dict__(self) -> Dict[str, ObjectReader]: return self.container_dict From 1ed0defa0441d94aa3c6ffd9efcac6d8447482a1 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Sat, 21 Sep 2024 20:57:36 +0200 Subject: [PATCH 091/403] nodes -> node --- README.md | 4 +-- UnityPy/files/ObjectReader.py | 36 ++++++++++--------- UnityPy/tools/extractor.py | 2 +- .../monobehaviour_from_assembly.py | 2 +- 4 files changed, 23 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index 854177ce..6be45037 100644 --- a/README.md +++ b/README.md @@ -284,7 +284,7 @@ import json for obj in env.objects: if obj.type.name == "MonoBehaviour": # export - if obj.serialized_type.nodes: + if obj.serialized_type.node: # save decoded data tree = obj.read_typetree() fp = os.path.join(extract_dir, f"{tree['m_Name']}.json") @@ -298,7 +298,7 @@ for obj in env.objects: f.write(data.raw_data) # edit - if obj.serialized_type.nodes: + if obj.serialized_type.node: tree = obj.read_typetree() # apply modifications to the data within the tree obj.save_typetree(tree) diff --git a/UnityPy/files/ObjectReader.py b/UnityPy/files/ObjectReader.py index 6f3f1f71..aae32b35 100644 --- a/UnityPy/files/ObjectReader.py +++ b/UnityPy/files/ObjectReader.py @@ -1,11 +1,13 @@ -from typing import TYPE_CHECKING, Generic, TypeVar, Union, List, Optional -from ..enums import ClassIDType +from __future__ import annotations -from ..streams import EndianBinaryReader, EndianBinaryWriter +from typing import TYPE_CHECKING, Generic, List, Optional, TypeVar, Union + +from ..enums import ClassIDType +from ..exceptions import TypeTreeError from ..helpers import TypeTreeHelper from ..helpers.Tpk import get_typetree_node from ..helpers.TypeTreeNode import TypeTreeNode -from ..exceptions import TypeTreeError +from ..streams import EndianBinaryReader, EndianBinaryWriter if TYPE_CHECKING: from ..files import SerializedFile @@ -20,14 +22,14 @@ class ObjectReader(Generic[T]): class_id: int type: ClassIDType path_id: int - assets_file: "SerializedFile" + assets_file: SerializedFile _read_until: int # saves where the parser stopped # in case that not all data is read # and the obj.data is changed, the unknown data can be added again - def __init__(self, assets_file: "SerializedFile", reader: EndianBinaryReader): + def __init__(self, assets_file: SerializedFile, reader: EndianBinaryReader): self.assets_file = assets_file self.reader = reader self.data = b"" @@ -226,19 +228,19 @@ def get_raw_data(self) -> bytes: return ret def _get_typetree_node( - self, nodes: Optional[Union[TypeTreeNode, List[dict]]] = None + self, node: Optional[Union[TypeTreeNode, List[dict]]] = None ) -> TypeTreeNode: - if isinstance(nodes, TypeTreeNode): - return nodes - elif isinstance(nodes, list): - return TypeTreeNode.from_list(nodes) - elif nodes is not None: + if isinstance(node, TypeTreeNode): + return node + elif isinstance(node, list): + return TypeTreeNode.from_list(node) + elif node is not None: raise ValueError("nodes must be a list[dict] or TypeTreeNode") if self.serialized_type: - nodes = self.serialized_type.nodes - if not nodes: - nodes = get_typetree_node(self.class_id, self.version) - if not nodes: + node = self.serialized_type.node + if not node: + node = get_typetree_node(self.class_id, self.version) + if not node: raise TypeTreeError("There are no TypeTree nodes for this object.") - return nodes + return node diff --git a/UnityPy/tools/extractor.py b/UnityPy/tools/extractor.py index 4d9ecb6b..762e6bac 100644 --- a/UnityPy/tools/extractor.py +++ b/UnityPy/tools/extractor.py @@ -192,7 +192,7 @@ def exportMonoBehaviour( ) -> List[int]: export = None # TODO - add generic way to add external typetrees - if obj.serialized_type and obj.serialized_type.nodes: + if obj.serialized_type and obj.serialized_type.node: extension = ".json" export = json.dumps(obj.read_typetree(), indent=4, ensure_ascii=False).encode( "utf8", errors="surrogateescape" diff --git a/examples/MonoBehaviourFromAssembly/monobehaviour_from_assembly.py b/examples/MonoBehaviourFromAssembly/monobehaviour_from_assembly.py index 93c98753..17411b87 100644 --- a/examples/MonoBehaviourFromAssembly/monobehaviour_from_assembly.py +++ b/examples/MonoBehaviourFromAssembly/monobehaviour_from_assembly.py @@ -47,7 +47,7 @@ def export_monobehaviours(asset_path: str, trees: dict): for obj in env.objects: if obj.type == "MonoBehaviour": d = obj.read() - if obj.serialized_type and obj.serialized_type.nodes: + if obj.serialized_type and obj.serialized_type.node: tree = obj.read_typetree() else: if not d.m_Script: From 00e9768185ec30b96863d3768dd3512ea1967e0c Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Sat, 21 Sep 2024 20:57:47 +0200 Subject: [PATCH 092/403] File - typeint improvement --- UnityPy/files/File.py | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/UnityPy/files/File.py b/UnityPy/files/File.py index 9c2c2f8a..34cd3f0d 100644 --- a/UnityPy/files/File.py +++ b/UnityPy/files/File.py @@ -1,27 +1,35 @@ -from ..enums import FileType -from ..helpers import ImportHelper -from ..streams import EndianBinaryReader, EndianBinaryWriter +from __future__ import annotations from collections import namedtuple from os.path import basename +from typing import TYPE_CHECKING, Dict, Optional + +from ..helpers import ImportHelper +from ..streams import EndianBinaryReader, EndianBinaryWriter + +if TYPE_CHECKING: + from ..environment import Environment DirectoryInfo = namedtuple("DirectoryInfo", "path offset size") class File(object): name: str - files: dict - environment: "Environment" + files: Dict[str, File] + environment: Environment cab_file: str is_changed: bool signature: str packer: str is_dependency: bool - - # parent: File - # environment: Environment - - def __init__(self, parent=None, name: str = None, is_dependency: bool = False): + parent: Optional[File] + + def __init__( + self, + parent: Optional[File] = None, + name: Optional[str] = None, + is_dependency: bool = False, + ): self.files = {} self.is_changed = False self.cab_file = "CAB-UnityPy_Mod.resS" @@ -154,4 +162,4 @@ def mark_changed(self): # recursive import requires the import down here -from . import BundleFile, SerializedFile, WebFile, ObjectReader +from . import BundleFile, ObjectReader, SerializedFile, WebFile From b30da31177c24b9c807d04802b20878ecbc55bdc Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Sat, 21 Sep 2024 21:28:04 +0200 Subject: [PATCH 093/403] add legacy_patch/Texture2DArray --- .../classes/legacy_patch/Texture2DArray.py | 46 +++++++++++++++++++ UnityPy/classes/legacy_patch/__init__.py | 3 +- 2 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 UnityPy/classes/legacy_patch/Texture2DArray.py diff --git a/UnityPy/classes/legacy_patch/Texture2DArray.py b/UnityPy/classes/legacy_patch/Texture2DArray.py new file mode 100644 index 00000000..95e5c2fe --- /dev/null +++ b/UnityPy/classes/legacy_patch/Texture2DArray.py @@ -0,0 +1,46 @@ +from typing import TYPE_CHECKING, List + +from ...enums.GraphicsFormat import GRAPHICS_TO_TEXTURE_MAP, GraphicsFormat +from ..generated import Texture2DArray + +if TYPE_CHECKING: + from PIL import Image + + +def _Texture2DArray_get_images(self: Texture2DArray) -> List[Image.Image]: + from ...export import Texture2DConverter + from ...helpers.ResourceReader import get_resource_data + + texture_format = GRAPHICS_TO_TEXTURE_MAP.get(GraphicsFormat(self.m_Format)) + if not texture_format: + raise NotImplementedError(f"GraphicsFormat {self.m_Format} not supported yet") + + image_data = self.image_data + if image_data is None: + image_data = get_resource_data( + self.m_StreamData.path, + self.object_reader.assets_file, + self.m_StreamData.offset, + self.m_StreamData.size, + ) + + # calculate the number of textures in the array + texture_size = self.m_DataSize // self.m_Depth + + return [ + Texture2DConverter.parse_image_data( + image_data[offset : offset + texture_size], + self.m_Width, + self.m_Height, + texture_format, + self.object_reader.version, + 0, + None, + ) + for offset in range(0, self.m_DataSize, texture_size) + ] + + +Texture2DArray.images = property(_Texture2DArray_get_images) + +__all__ = ("Texture2DArray",) diff --git a/UnityPy/classes/legacy_patch/__init__.py b/UnityPy/classes/legacy_patch/__init__.py index 3c958cc5..489eb28b 100644 --- a/UnityPy/classes/legacy_patch/__init__.py +++ b/UnityPy/classes/legacy_patch/__init__.py @@ -2,5 +2,6 @@ from .Mesh import Mesh from .Renderer import Renderer from .Shader import Shader -from .Texture2D import Texture2D from .Sprite import Sprite +from .Texture2D import Texture2D +from .Texture2DArray import Texture2DArray From f5c99349d37e6ca4eff4f09ec0b7c4819d7b62b6 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Sat, 21 Sep 2024 21:28:33 +0200 Subject: [PATCH 094/403] update readme --- README.md | 41 ++++++++++++++++++----------------------- 1 file changed, 18 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index 6be45037..b3e5fdf5 100644 --- a/README.md +++ b/README.md @@ -199,7 +199,7 @@ All object types can be found in [UnityPy/classes](UnityPy/classes/). ### [Texture2D](UnityPy/classes/Texture2D.py) -- `.name` +- `.m_Name` - `.image` converts the texture into a `PIL.Image` - `.m_Width` - texture width (int) - `.m_Height` - texture height (int) @@ -212,9 +212,10 @@ for obj in env.objects: if obj.type.name == "Texture2D": # export texture data = obj.read() + path = os.path.join(export_dir, f"{data.m_Name}.png") data.image.save(path) # edit texture - fp = os.path.join(replace_dir, data.name) + fp = os.path.join(replace_dir, f"{data.m_Name}.png") pil_img = Image.open(fp) data.image = pil_img data.save() @@ -225,7 +226,7 @@ for obj in env.objects: Sprites are part of a texture and can have a separate alpha-image as well. Unlike most other extractors (including AssetStudio), UnityPy merges those two images by itself. -- `.name` +- `.m_Name` - `.image` - converts the merged texture part into a `PIL.Image` - `.m_Width` - sprite width (int) - `.m_Height` - sprite height (int) @@ -236,6 +237,7 @@ Unlike most other extractors (including AssetStudio), UnityPy merges those two i for obj in env.objects: if obj.type.name == "Sprite": data = obj.read() + path = os.path.join(export_dir, f"{data.m_Name}.png") data.image.save(path) ``` @@ -243,9 +245,8 @@ for obj in env.objects: TextAssets are usually normal text files. -- `.name` -- `.script` - binary data (bytes) -- `.text` - script decoded via UTF8 (str) +- `.m_Name` +- `.m_Script` - str Some games save binary data as TextFile, so it's usually better to use `.script`. @@ -256,12 +257,13 @@ for obj in env.objects: if obj.type.name == "TextAsset": # export asset data = obj.read() + path = os.path.join(export_dir, f"{data.m_Name}.txt") with open(path, "wb") as f: - f.write(bytes(data.script)) + f.write(data.m_Script.encode("utf-8", "surrogateescape")) # edit asset - fp = os.path.join(replace_dir, data.name) + fp = os.path.join(replace_dir, f"{data.m_Name}.txt") with open(fp, "rb") as f: - data.script = f.read() + data.m_Script = f.read().decode("utf-8", "surrogateescape")) data.save() ``` @@ -272,9 +274,8 @@ If a type tree exists, it can be used to read the whole data, but if it doesn't exist, then it is usually necessary to investigate the class that loads the specific MonoBehaviour to extract the data. ([example](examples/CustomMonoBehaviour/get_scriptable_texture.py)) -- `.name` -- `.script` -- `.raw_data` - data after the basic initialisation +- `.m_Name` +- `.m_Script` **Export** @@ -290,12 +291,6 @@ for obj in env.objects: fp = os.path.join(extract_dir, f"{tree['m_Name']}.json") with open(fp, "wt", encoding = "utf8") as f: json.dump(tree, f, ensure_ascii = False, indent = 4) - else: - # save raw relevant data (without Unity MonoBehaviour header) - data = obj.read() - fp = os.path.join(extract_dir, f"{data.name}.bin") - with open(fp, "wb") as f: - f.write(data.raw_data) # edit if obj.serialized_type.node: @@ -304,7 +299,7 @@ for obj in env.objects: obj.save_typetree(tree) else: data = obj.read() - with open(os.path.join(replace_dir, data.name)) as f: + with open(os.path.join(replace_dir, data.m_Name)) as f: data.save(raw_data = f.read()) ``` @@ -332,7 +327,7 @@ if obj.type.name == "Font": if font.m_FontData[0:4] == b"OTTO": extension = ".otf" - with open(os.path.join(path, font.name+extension), "wb") as f: + with open(os.path.join(path, font.m_Name+extension), "wb") as f: f.write(font.m_FontData) ``` @@ -344,7 +339,7 @@ The mesh will be converted to the Wavefront .obj file format. ```python mesh : Mesh -with open(f"{mesh.name}.obj", "wt", newline = "") as f: +with open(f"{mesh.m_Name}.obj", "wt", newline = "") as f: # newline = "" is important f.write(mesh.export()) ``` @@ -364,7 +359,7 @@ export_dir: str if mesh_renderer.m_GameObject: # get the name of the model game_object = mesh_renderer.m_GameObject.read() - export_dir = os.path.join(export_dir, game_object.name) + export_dir = os.path.join(export_dir, game_object.m_Name) mesh_renderer.export(export_dir) ``` @@ -372,7 +367,7 @@ mesh_renderer.export(export_dir) WARNING - not well tested -- `.name` +- `.m_Name` - `.image` converts the texture2darray into a `PIL.Image` - `.m_Width` - texture width (int) - `.m_Height` - texture height (int) From 1ed225310e9392989687eb749f955af60e2cc683 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Sat, 21 Sep 2024 21:29:09 +0200 Subject: [PATCH 095/403] Texture2DArray - fix import --- UnityPy/classes/legacy_patch/Texture2DArray.py | 1 + 1 file changed, 1 insertion(+) diff --git a/UnityPy/classes/legacy_patch/Texture2DArray.py b/UnityPy/classes/legacy_patch/Texture2DArray.py index 95e5c2fe..e5591bca 100644 --- a/UnityPy/classes/legacy_patch/Texture2DArray.py +++ b/UnityPy/classes/legacy_patch/Texture2DArray.py @@ -1,3 +1,4 @@ +from __future__ import annotations from typing import TYPE_CHECKING, List from ...enums.GraphicsFormat import GRAPHICS_TO_TEXTURE_MAP, GraphicsFormat From f00076acdf6cdfbb4d5670ac00b6497a865db171 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Sat, 21 Sep 2024 21:29:47 +0200 Subject: [PATCH 096/403] test.yml - run tests on lowest supported python version - 3.7 --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index f72bb70e..da20ef0d 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -25,7 +25,7 @@ jobs: - name: Set up Python uses: actions/setup-python@v4 with: - python-version: "3.10" + python-version: "3.7" - name: Install Dependencies run: | From acfba600a5853f1dc103b0696522055760a927ae Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Sat, 21 Sep 2024 21:34:45 +0200 Subject: [PATCH 097/403] 3.7 api fixes --- UnityPyBoost/TypeTreeHelper.cpp | 6 +++--- tests/test_main.py | 2 ++ 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/UnityPyBoost/TypeTreeHelper.cpp b/UnityPyBoost/TypeTreeHelper.cpp index ce497402..e0e43f92 100644 --- a/UnityPyBoost/TypeTreeHelper.cpp +++ b/UnityPyBoost/TypeTreeHelper.cpp @@ -462,7 +462,7 @@ PyObject *read_typetree(PyObject *self, PyObject *args, PyObject *kwargs) return NULL; } - config.as_dict = Py_IsTrue(as_dict) == 1; + config.as_dict = as_dict == Py_True; if (!config.as_dict) { if (PyCallable_Check(config.clean_name) == 0) @@ -470,12 +470,12 @@ PyObject *read_typetree(PyObject *self, PyObject *args, PyObject *kwargs) PyErr_SetString(PyExc_ValueError, "clean_name must be callable if not as dict"); return NULL; } - if (Py_IsNone(config.assetfile) == 1) + if (config.assetfile == Py_None) { PyErr_SetString(PyExc_ValueError, "assetsfile must be set if not as dict"); return NULL; } - if (Py_IsNone(config.classes) == 1) + if (config.classes == Py_None) { PyErr_SetString(PyExc_ValueError, "classes must be set if not as dict"); return NULL; diff --git a/tests/test_main.py b/tests/test_main.py index 5407f03b..acd41bbd 100644 --- a/tests/test_main.py +++ b/tests/test_main.py @@ -26,6 +26,7 @@ def test_save_dict(): for obj in env.objects: data = obj.get_raw_data() item = obj.read_typetree(wrap=False) + assert isinstance(item, dict) re_data = obj.save_typetree(item) assert data == re_data @@ -35,6 +36,7 @@ def test_save_wrap(): for obj in env.objects: data = obj.get_raw_data() item = obj.read_typetree(wrap=True) + assert not isinstance(item, dict) re_data = obj.save_typetree(item) assert data == re_data From fd1bd66c8408244494a61794a02ec21b29c8b93f Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Sat, 21 Sep 2024 21:40:56 +0200 Subject: [PATCH 098/403] convert match/case to if/elif-chan for old versions --- UnityPy/helpers/MeshHelper.py | 104 +++++++++++++-------------- UnityPy/helpers/TypeTreeHelper.py | 114 ++++++++++++++---------------- 2 files changed, 104 insertions(+), 114 deletions(-) diff --git a/UnityPy/helpers/MeshHelper.py b/UnityPy/helpers/MeshHelper.py index d0edf788..ab5bd70a 100644 --- a/UnityPy/helpers/MeshHelper.py +++ b/UnityPy/helpers/MeshHelper.py @@ -401,61 +401,59 @@ def read_vertex_data( def assign_channel_vertex_data(self, channel: int, component_data: list): if self.version[0] >= 2018: - match channel: - case 0: # kShaderChannelVertex - self.m_Vertices = component_data - case 1: # kShaderChannelNormal - self.m_Normals = component_data - case 2: # kShaderChannelTangent - self.m_Tangents = component_data - case 3: # kShaderChannelColor - self.m_Colors = component_data - case 4: # kShaderChannelTexCoord0 - self.m_UV0 = component_data - case 5: # kShaderChannelTexCoord1 - self.m_UV1 = component_data - case 6: # kShaderChannelTexCoord2 - self.m_UV2 = component_data - case 7: # kShaderChannelTexCoord3 - self.m_UV3 = component_data - case 8: # kShaderChannelTexCoord4 - self.m_UV4 = component_data - case 9: # kShaderChannelTexCoord5 - self.m_UV5 = component_data - case 10: # kShaderChannelTexCoord6 - self.m_UV6 = component_data - case 11: # kShaderChannelTexCoord7 - self.m_UV7 = component_data - # 2018.2 and up - case 12: # kShaderChannelBlendWeight - self.m_BoneWeights = component_data - case 13: # kShaderChannelBlendIndices - self.m_BoneIndices = component_data - case _: - raise ValueError(f"Unknown channel {channel}") + if channel == 0: # kShaderChannelVertex + self.m_Vertices = component_data + elif channel == 1: # kShaderChannelNormal + self.m_Normals = component_data + elif channel == 2: # kShaderChannelTangent + self.m_Tangents = component_data + elif channel == 3: # kShaderChannelColor + self.m_Colors = component_data + elif channel == 4: # kShaderChannelTexCoord0 + self.m_UV0 = component_data + elif channel == 5: # kShaderChannelTexCoord1 + self.m_UV1 = component_data + elif channel == 6: # kShaderChannelTexCoord2 + self.m_UV2 = component_data + elif channel == 7: # kShaderChannelTexCoord3 + self.m_UV3 = component_data + elif channel == 8: # kShaderChannelTexCoord4 + self.m_UV4 = component_data + elif channel == 9: # kShaderChannelTexCoord5 + self.m_UV5 = component_data + elif channel == 10: # kShaderChannelTexCoord6 + self.m_UV6 = component_data + elif channel == 11: # kShaderChannelTexCoord7 + self.m_UV7 = component_data + # 2018.2 and up + elif channel == 12: # kShaderChannelBlendWeight + self.m_BoneWeights = component_data + elif channel == 13: # kShaderChannelBlendIndices + self.m_BoneIndices = component_data + else: + raise ValueError(f"Unknown channel {channel}") else: - match channel: - case 0: # kShaderChannelVertex - self.m_Vertices = component_data - case 1: # kShaderChannelNormal - self.m_Normals = component_data - case 2: # kShaderChannelColor - self.m_Colors = component_data - case 3: # kShaderChannelTexCoord0 - self.m_UV0 = component_data - case 4: # kShaderChannelTexCoord1 - self.m_UV1 = component_data - case 5: - if self.version[0] >= 5: # kShaderChannelTexCoord2 - self.m_UV2 = component_data - else: # kShaderChannelTangent - self.m_Tangents = component_data - case 6: # kShaderChannelTexCoord3 - self.m_UV3 = component_data - case 7: # kShaderChannelTangent + if channel == 0: # kShaderChannelVertex + self.m_Vertices = component_data + elif channel == 1: # kShaderChannelNormal + self.m_Normals = component_data + elif channel == 2: # kShaderChannelColor + self.m_Colors = component_data + elif channel == 3: # kShaderChannelTexCoord0 + self.m_UV0 = component_data + elif channel == 4: # kShaderChannelTexCoord1 + self.m_UV1 = component_data + elif channel == 5: + if self.version[0] >= 5: # kShaderChannelTexCoord2 + self.m_UV2 = component_data + else: # kShaderChannelTangent self.m_Tangents = component_data - case _: - raise ValueError(f"Unknown channel {channel}") + elif channel == 6: # kShaderChannelTexCoord3 + self.m_UV3 = component_data + elif channel == 7: # kShaderChannelTangent + self.m_Tangents = component_data + else: + raise ValueError(f"Unknown channel {channel}") def get_channel_dtype(self, m_Channel: ChannelInfo): if self.version[0] < 2017: diff --git a/UnityPy/helpers/TypeTreeHelper.py b/UnityPy/helpers/TypeTreeHelper.py index 0e8879e0..be03a8ee 100644 --- a/UnityPy/helpers/TypeTreeHelper.py +++ b/UnityPy/helpers/TypeTreeHelper.py @@ -22,7 +22,7 @@ kAlignBytes = 0x4000 -FUNCTION_MAP = { +FUNCTION_READ_MAP = { "SInt8": EndianBinaryReader.read_byte, "UInt8": EndianBinaryReader.read_u_byte, "char": EndianBinaryReader.read_u_byte, @@ -46,7 +46,7 @@ "string": EndianBinaryReader.read_aligned_string, "TypelessData": EndianBinaryReader.read_byte_array, } -FUNCTION_MAP_ARRAY = { +FUNCTION_READ_MAP_ARRAY = { "SInt8": EndianBinaryReader.read_byte_array, "UInt8": EndianBinaryReader.read_u_byte_array, "char": EndianBinaryReader.read_u_byte_array, @@ -137,16 +137,13 @@ def read_value( # print(reader.Position, node.m_Name, node.m_Type, node.m_MetaFlag) align = metaflag_is_aligned(node.m_MetaFlag) - func = FUNCTION_MAP.get(node.m_Type) + func = FUNCTION_READ_MAP.get(node.m_Type) if func: value = func(reader) elif node.m_Type == "pair": first = read_value(node.m_Children[0], reader, as_dict, assetsfile) second = read_value(node.m_Children[1], reader, as_dict, assetsfile) value = (first, second) - elif not node.m_Children: - value = None - # raise NotImplementedError(f"Reference type {node.m_Type} not implemented") # Vector elif node.m_Children and node.m_Children[0].m_Type == "Array": if metaflag_is_aligned(node.m_Children[0].m_MetaFlag): @@ -208,7 +205,7 @@ def read_value_array( ) -> Any: align = metaflag_is_aligned(node.m_MetaFlag) - func = FUNCTION_MAP_ARRAY.get(node.m_Type) + func = FUNCTION_READ_MAP_ARRAY.get(node.m_Type) if func: value = func(reader, size) elif node.m_Type == "string": @@ -219,18 +216,15 @@ def read_value_array( key_node = node.m_Children[0] value_node = node.m_Children[1] - key_func = FUNCTION_MAP.get( + key_func = FUNCTION_READ_MAP.get( key_node.m_Type, lambda reader: read_value(key_node, reader, as_dict, assetsfile), ) - value_func = FUNCTION_MAP.get( + value_func = FUNCTION_READ_MAP.get( value_node.m_Type, lambda reader: read_value(value_node, reader, as_dict, assetsfile), ) value = [(key_func(reader), value_func(reader)) for _ in range(size)] - elif not node.m_Children: - value = None - # raise NotImplementedError(f"Reference type {node.m_Type} not implemented") # Vector elif node.m_Children and node.m_Children[0].m_Type == "Array": if metaflag_is_aligned(node.m_Children[0].m_MetaFlag): @@ -332,6 +326,32 @@ def clean_name(name: str) -> str: return name +FUNCTION_WRITE_MAP = { + "SInt8": EndianBinaryWriter.write_byte, + "UInt8": EndianBinaryWriter.write_u_byte, + "char": EndianBinaryWriter.write_u_byte, + "short": EndianBinaryWriter.write_short, + "SInt16": EndianBinaryWriter.write_short, + "unsigned short": EndianBinaryWriter.write_u_short, + "UInt16": EndianBinaryWriter.write_u_short, + "int": EndianBinaryWriter.write_int, + "SInt32": EndianBinaryWriter.write_int, + "unsigned int": EndianBinaryWriter.write_u_int, + "UInt32": EndianBinaryWriter.write_u_int, + "Type*": EndianBinaryWriter.write_u_int, + "long long": EndianBinaryWriter.write_long, + "SInt64": EndianBinaryWriter.write_long, + "unsigned long long": EndianBinaryWriter.write_u_long, + "UInt64": EndianBinaryWriter.write_u_long, + "FileSize": EndianBinaryWriter.write_u_long, + "float": EndianBinaryWriter.write_float, + "double": EndianBinaryWriter.write_double, + "bool": EndianBinaryWriter.write_boolean, + "string": EndianBinaryWriter.write_aligned_string, + "TypelessData": EndianBinaryWriter.write_byte_array, +} + + def write_value( value: Any, node: TypeTreeNode, @@ -340,55 +360,27 @@ def write_value( # print(reader.Position, node.m_Name, node.m_Type, node.m_MetaFlag) align = metaflag_is_aligned(node.m_MetaFlag) - match node.m_Type: - case "SInt8": - writer.write_byte(value) - case "UInt8" | "char": - writer.write_u_byte(value) - case "short" | "SInt16": - writer.write_short(value) - case "UInt16" | "unsigned short": - writer.write_u_short(value) - case "int" | "SInt32": - writer.write_int(value) - case "UInt32" | "unsigned int" | "Type*": - writer.write_u_int(value) - case "long long" | "SInt64": - writer.write_long(value) - case "UInt64" | "unsigned long long" | "FileSize": - writer.write_u_long(value) - case "float": - writer.write_float(value) - case "double": - writer.write_double(value) - case "bool": - writer.write_boolean(value) - case "string": - writer.write_aligned_string(value) - case "TypelessData": - writer.write_byte_array(value) - case "pair": - write_value(value[0], node.m_Children[0], writer) - write_value(value[1], node.m_Children[1], writer) - case _: - # Vector - if node.m_Children and node.m_Children[0].m_Type == "Array": - if metaflag_is_aligned(node.m_Children[0].m_MetaFlag): - align = True - - writer.write_int(len(value)) - subtype = node.m_Children[0].m_Children[1] - [write_value(sub_value, subtype, writer) for sub_value in value] - - else: # Class - if isinstance(value, dict): - for child in node.m_Children: - write_value(value[child.m_Name], child, writer) - else: - for child in node.m_Children: - write_value( - getattr(value, clean_name(child.m_Name)), child, writer - ) + func = FUNCTION_WRITE_MAP.get(node.m_Type) + if func: + value = func(writer, value) + elif node.m_Type == "pair": + write_value(value[0], node.m_Children[0], writer) + write_value(value[1], node.m_Children[1], writer) + elif node.m_Children and node.m_Children[0].m_Type == "Array": + if metaflag_is_aligned(node.m_Children[0].m_MetaFlag): + align = True + + writer.write_int(len(value)) + subtype = node.m_Children[0].m_Children[1] + [write_value(sub_value, subtype, writer) for sub_value in value] + + else: # Class + if isinstance(value, dict): + for child in node.m_Children: + write_value(value[child.m_Name], child, writer) + else: + for child in node.m_Children: + write_value(getattr(value, clean_name(child.m_Name)), child, writer) if align: writer.align_stream() From ef3c4244f157ae2f8ce8cbefe8d2c9b264c95517 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Sat, 21 Sep 2024 21:44:15 +0200 Subject: [PATCH 099/403] math.py - remove TypeAlias for old python versions --- UnityPy/classes/math.py | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/UnityPy/classes/math.py b/UnityPy/classes/math.py index fe3b47e5..8ba1d71a 100644 --- a/UnityPy/classes/math.py +++ b/UnityPy/classes/math.py @@ -5,7 +5,6 @@ """ from attrs import define -from typing import TypeAlias @define(slots=True) @@ -38,8 +37,8 @@ def __repr__(self) -> str: return f"Vector4f({self.x}, {self.y}, {self.z}, {self.w})" -float3: TypeAlias = Vector3f -float4: TypeAlias = Vector4f +float3 = Vector3f +float4 = Vector4f class Quaternionf(Vector4f): @@ -115,3 +114,16 @@ def rgba(self, value: int): self.g = ((value >> 16) & 0xFF) / 255 self.b = ((value >> 8) & 0xFF) / 255 self.a = (value & 0xFF) / 255 + + +__all__ = ( + "Vector2f", + "Vector3f", + "Vector4f", + "Quaternionf", + "Matrix3x4f", + "Matrix4x4f", + "ColorRGBA", + "float3", + "float4", +) From cfc2f6a0ba3ad8c90798bb4d419f1584435c4398 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Sat, 21 Sep 2024 21:45:59 +0200 Subject: [PATCH 100/403] MeshExporter - remove Literal - old python patch --- UnityPy/export/MeshExporter.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/UnityPy/export/MeshExporter.py b/UnityPy/export/MeshExporter.py index 33503c5a..2aba0f7d 100644 --- a/UnityPy/export/MeshExporter.py +++ b/UnityPy/export/MeshExporter.py @@ -1,16 +1,14 @@ from __future__ import annotations -from typing import TYPE_CHECKING, List, Literal, Optional +from typing import TYPE_CHECKING, List, Optional from ..helpers.MeshHelper import MeshHandler if TYPE_CHECKING: from ..classes.generated import Mesh -MESH_EXPORT_FORMATS = Literal["obj"] - -def export_mesh(m_Mesh: Mesh, format: MESH_EXPORT_FORMATS = "obj") -> str: +def export_mesh(m_Mesh: Mesh, format: str = "obj") -> str: if format == "obj": return export_mesh_obj(m_Mesh) raise NotImplementedError(f"Export format {format} not implemented") From d160f38199708d54698673e890f15ffa0ae891eb Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Sat, 21 Sep 2024 22:02:36 +0200 Subject: [PATCH 101/403] AudioClipConverter - pre 3.12 patch --- UnityPy/export/AudioClipConverter.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/UnityPy/export/AudioClipConverter.py b/UnityPy/export/AudioClipConverter.py index 0c5fc447..e7a16ad5 100644 --- a/UnityPy/export/AudioClipConverter.py +++ b/UnityPy/export/AudioClipConverter.py @@ -70,12 +70,15 @@ def import_pyfmodex(): # hotfix ctypes for pyfmodex for non windows systems ctypes.windll = None + # behavior changed in python 3.12 fp = path(f"UnityPy.lib.FMOD.{system}.{arch}", libname) if hasattr(fp, "args"): # some newer version doesn't directly return a path, but instead a generator fp = fp.args[0] + if not isinstance(fp, str): + fp = fp.absolute() - os.environ["PYFMODEX_DLL_PATH"] = str(fp.absolute()) + os.environ["PYFMODEX_DLL_PATH"] = str(fp) import pyfmodex From d5f36eb11b2545bf21821d4e20da59c085f7a841 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Sun, 22 Sep 2024 20:32:00 +0200 Subject: [PATCH 102/403] ObjectReader - type hint improvement --- UnityPy/files/ObjectReader.py | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/UnityPy/files/ObjectReader.py b/UnityPy/files/ObjectReader.py index aae32b35..b909a5fa 100644 --- a/UnityPy/files/ObjectReader.py +++ b/UnityPy/files/ObjectReader.py @@ -1,6 +1,6 @@ from __future__ import annotations -from typing import TYPE_CHECKING, Generic, List, Optional, TypeVar, Union +from typing import TYPE_CHECKING, Generic, List, Optional, Tuple, TypeVar, Union from ..enums import ClassIDType from ..exceptions import TypeTreeError @@ -10,20 +10,31 @@ from ..streams import EndianBinaryReader, EndianBinaryWriter if TYPE_CHECKING: - from ..files import SerializedFile + from ..enums import BuildTarget + from ..files.SerializedFile import BuildType, SerializedFile, SerializedType T = TypeVar("T") class ObjectReader(Generic[T]): + assets_file: SerializedFile + reader: EndianBinaryReader + data: bytes + version: Tuple[int, int, int, int] + version2: int + platform: BuildTarget + build_type: BuildType + path_id: int + byte_start_offset: Tuple[int, int] byte_start: int + byte_size_offset: Tuple[int, int] byte_size: int type_id: int + serialized_type: Optional[SerializedType] class_id: int type: ClassIDType - path_id: int - assets_file: SerializedFile - _read_until: int + is_destroyed: Optional[int] + is_stripped: Optional[int] # saves where the parser stopped # in case that not all data is read From d5120ae8444636adcc082a9c7f10b7f638ef451f Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Sun, 22 Sep 2024 20:32:24 +0200 Subject: [PATCH 103/403] SerializedFile - typehint improvement, backwards compatiblity SerializedType.nodes --- UnityPy/files/SerializedFile.py | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/UnityPy/files/SerializedFile.py b/UnityPy/files/SerializedFile.py index 7b3594ed..3d88e35c 100644 --- a/UnityPy/files/SerializedFile.py +++ b/UnityPy/files/SerializedFile.py @@ -2,7 +2,7 @@ import re from ntpath import basename -from typing import TYPE_CHECKING, Dict, Generator, List, Optional, Tuple +from typing import TYPE_CHECKING, Dict, Generator, List, Optional, Tuple, Union from attrs import define @@ -13,7 +13,7 @@ from . import BundleFile, File, ObjectReader if TYPE_CHECKING: - from ..classes import AssetBundle, AssetInfo + from ..classes import AssetBundle, AssetInfo, Object from ..files import ObjectReader from ..streams.EndianBinaryReader import EndianBinaryReader @@ -198,22 +198,30 @@ def write( else: writer.write_int_array(self.type_dependencies, True) + @property + def nodes(self) -> Union[TypeTreeNode, None]: + # for compatibility with old versions + return self.node + class SerializedFile(File.File): reader: EndianBinaryReader - is_changed: bool unity_version: str - version: tuple build_type: BuildType target_platform: BuildTarget - types: list - script_types: list - externals: list - objects: dict - _cache: dict + _enable_type_tree: bool + types: List[SerializedType] + script_types: List[LocalSerializedObjectIdentifier] + externals: List[FileIdentifier] + objects: Dict[int, ObjectReader] + unknown: int + header: SerializedFileHeader + _m_target_platform: int + big_id_enabled: int + userInformation: Optional[str] assetbundle: AssetBundle container: ContainerHelper - header: SerializedFileHeader + _cache: Dict[str, Object] @property def files(self): From ab6b7d518c92bba38e38a2b8f021e4dcca4ae594 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Sun, 22 Sep 2024 20:40:19 +0200 Subject: [PATCH 104/403] add changelog --- CHANGELOG.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000..e55066ae --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,16 @@ +# Change Log + +## 1.20 + +- overall type-hint improvements +- **UnityPy.classes** +  - replace hard-coded UnityPy.classes with generated class stubs +    - UnityPy.classes.legacy_patch to provide backward compatibility +    - classes are all parsed and dumped/stored using typetrees now +- **TypeTree** +  - use a hierarchical instead of a flat structure +    - list to Node.m_Children +  - rewrite the typetree read and write functions to reflect this +  - **remove map typetree type type due to its multi-dict nature** +- **Exporter** +  - extended Sprite-mesh support (solves some dicings automatically) From b9b36c0cbb413a912effe51fbfb09a509e166d65 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Sun, 22 Sep 2024 20:40:44 +0200 Subject: [PATCH 105/403] 1.20 version bump --- UnityPy/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UnityPy/__init__.py b/UnityPy/__init__.py index d54dac2c..ad6f0455 100644 --- a/UnityPy/__init__.py +++ b/UnityPy/__init__.py @@ -1,4 +1,4 @@ -__version__ = "1.10.18" +__version__ = "1.20.0" from .environment import Environment as Environment from .helpers.ArchiveStorageManager import ( From 8ac495f5d7251ffd1650d4473f897f0b8337ad6e Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Sun, 22 Sep 2024 21:00:23 +0200 Subject: [PATCH 106/403] AudioClipConverter.py - importlib path fix --- UnityPy/export/AudioClipConverter.py | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/UnityPy/export/AudioClipConverter.py b/UnityPy/export/AudioClipConverter.py index e7a16ad5..12fc3a7b 100644 --- a/UnityPy/export/AudioClipConverter.py +++ b/UnityPy/export/AudioClipConverter.py @@ -3,6 +3,7 @@ import ctypes import os import platform +import sys from importlib.resources import path from typing import TYPE_CHECKING, Dict @@ -70,15 +71,15 @@ def import_pyfmodex(): # hotfix ctypes for pyfmodex for non windows systems ctypes.windll = None - # behavior changed in python 3.12 - fp = path(f"UnityPy.lib.FMOD.{system}.{arch}", libname) - if hasattr(fp, "args"): - # some newer version doesn't directly return a path, but instead a generator - fp = fp.args[0] - if not isinstance(fp, str): - fp = fp.absolute() - - os.environ["PYFMODEX_DLL_PATH"] = str(fp) + lib_path = os.path.join( + os.path.dirname(os.path.dirname(os.path.realpath(__file__))), + "lib", + "FMOD", + system, + arch, + libname + ) + os.environ["PYFMODEX_DLL_PATH"] = lib_path import pyfmodex From 916fea207ab39c1960231917869592af2aeef686 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Mon, 23 Sep 2024 11:11:32 +0200 Subject: [PATCH 107/403] PPtr - re-add .type property --- UnityPy/classes/PPtr.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/UnityPy/classes/PPtr.py b/UnityPy/classes/PPtr.py index e5a2573f..c07baac2 100644 --- a/UnityPy/classes/PPtr.py +++ b/UnityPy/classes/PPtr.py @@ -6,6 +6,7 @@ if TYPE_CHECKING: from ..files.ObjectReader import ObjectReader from ..files.SerializedFile import SerializedFile + from ..enums.ClassIDType import ClassIDType T = TypeVar("T") @@ -15,7 +16,6 @@ class PPtr(Generic[T]): m_FileID: int m_PathID: int assetsfile: Optional[SerializedFile] = None - type: Optional[str] = None @property def file_id(self) -> int: @@ -27,6 +27,10 @@ def path_id(self) -> int: # backwards compatibility return self.m_PathID + @property + def type(self) -> ClassIDType: + return self.deref().type + def read(self): # backwards compatibility return self.deref_parse_as_object() From b4bc2ce500d702db16fd5c34309adde0fa651762 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Mon, 23 Sep 2024 11:11:59 +0200 Subject: [PATCH 108/403] 1.20.1 version bump --- UnityPy/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UnityPy/__init__.py b/UnityPy/__init__.py index ad6f0455..e63e3745 100644 --- a/UnityPy/__init__.py +++ b/UnityPy/__init__.py @@ -1,4 +1,4 @@ -__version__ = "1.20.0" +__version__ = "1.20.1" from .environment import Environment as Environment from .helpers.ArchiveStorageManager import ( From f448fde420e3a206d4061a5aeff3648c411984a1 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Wed, 25 Sep 2024 15:08:01 +0200 Subject: [PATCH 109/403] TypeTreeHelper.py - PPtr fix - remove type kwarg (#270) * Update TypeTreeHelper.py --- UnityPy/__init__.py | 2 +- UnityPy/helpers/TypeTreeHelper.py | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/UnityPy/__init__.py b/UnityPy/__init__.py index e63e3745..bd88b8a9 100644 --- a/UnityPy/__init__.py +++ b/UnityPy/__init__.py @@ -1,4 +1,4 @@ -__version__ = "1.20.1" +__version__ = "1.20.2" from .environment import Environment as Environment from .helpers.ArchiveStorageManager import ( diff --git a/UnityPy/helpers/TypeTreeHelper.py b/UnityPy/helpers/TypeTreeHelper.py index be03a8ee..07a63321 100644 --- a/UnityPy/helpers/TypeTreeHelper.py +++ b/UnityPy/helpers/TypeTreeHelper.py @@ -171,7 +171,6 @@ def read_value( assetsfile=assetsfile, m_FileID=value["m_FileID"], m_PathID=value["m_PathID"], - type=node.m_Type[6:-1], ) else: clz = getattr(classes, node.m_Type, Object) @@ -259,7 +258,6 @@ def read_value_array( value = [ PPtr[Any]( assetsfile=assetsfile, - type=node.m_Type[6:-1], **{ child.m_Name: read_value(child, reader, as_dict, assetsfile) for child in node.m_Children From 4859a477b523b4fa21bca92401e16b57db164d0d Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Wed, 25 Sep 2024 15:10:41 +0200 Subject: [PATCH 110/403] README - update TextAsset description --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b3e5fdf5..a2c358cd 100644 --- a/README.md +++ b/README.md @@ -248,7 +248,7 @@ TextAssets are usually normal text files. - `.m_Name` - `.m_Script` - str -Some games save binary data as TextFile, so it's usually better to use `.script`. +Some games save binary data as TextFile, so to convert the ``str`` back to bytes correctly ``m_Script.encode("utf-8", "surrogateescape")`` has to be used. **Export** From 5b7e94bc4fe3df3fe6f8456807b46ce0620eb27b Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Mon, 30 Sep 2024 15:47:15 +0200 Subject: [PATCH 111/403] PPtr - eq, hash, fix external resolving --- UnityPy/classes/PPtr.py | 41 +++++++++++++++++++++++++++++++---------- 1 file changed, 31 insertions(+), 10 deletions(-) diff --git a/UnityPy/classes/PPtr.py b/UnityPy/classes/PPtr.py index c07baac2..8b1294be 100644 --- a/UnityPy/classes/PPtr.py +++ b/UnityPy/classes/PPtr.py @@ -1,12 +1,13 @@ from __future__ import annotations -from typing import TypeVar, Generic, TYPE_CHECKING, Optional, Any, cast + +from typing import TYPE_CHECKING, Any, Generic, Optional, TypeVar, cast from attr import define if TYPE_CHECKING: + from ..enums.ClassIDType import ClassIDType from ..files.ObjectReader import ObjectReader from ..files.SerializedFile import SerializedFile - from ..enums.ClassIDType import ClassIDType T = TypeVar("T") @@ -48,9 +49,9 @@ def deref(self, assetsfile: Optional[SerializedFile] = None) -> ObjectReader[T]: else: # resolve file id to external name external_id = self.m_FileID - 1 - if external_id >= len(assetsfile.m_Externals): + if external_id >= len(assetsfile.externals): raise FileNotFoundError("Failed to resolve pointer - invalid m_FileID!") - external = assetsfile.m_Externals[external_id] + external = assetsfile.externals[external_id] # resolve external name to assetsfile container = assetsfile.parent @@ -60,14 +61,26 @@ def deref(self, assetsfile: Optional[SerializedFile] = None) -> ObjectReader[T]: f"PPtr points to {external.path} but no container is set!" ) - for child in container.childs: - if isinstance(child, SerializedFile) and child.name == external.path: - assetsfile = child + external_clean_path = external.path + if external_clean_path.startswith("archive:/"): + external_clean_path = external_clean_path[9:] + if external_clean_path.startswith("assets/"): + external_clean_path = external_clean_path[7:] + external_clean_path = external_clean_path.rsplit("/")[-1].lower() + + for key, file in container.files.items(): + if key.lower() == external_clean_path: + assetsfile = file break else: - raise FileNotFoundError( - f"Failed to resolve pointer - {external.path} not found!" - ) + env = assetsfile.environment + cab = env.find_file(external_clean_path) + if cab: + assetsfile = cab + else: + raise FileNotFoundError( + f"Failed to resolve pointer - {external.path} not found!" + ) return cast("ObjectReader[T]", assetsfile.objects[self.m_PathID]) @@ -83,3 +96,11 @@ def deref_parse_as_dict( def __bool__(self): return self.m_PathID != 0 + + def __hash__(self) -> int: + return hash((self.m_FileID, self.m_PathID)) + + def __eq__(self, other: object) -> bool: + if not isinstance(other, PPtr): + return False + return self.m_FileID == other.m_FileID and self.m_PathID == other.m_PathID From e544bf3f67a1c6e72e0c12eb64b1eed4d3a52d21 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Mon, 30 Sep 2024 15:47:42 +0200 Subject: [PATCH 112/403] GameObject - legacy patch for m_Components, and property fields --- UnityPy/classes/legacy_patch/GameObject.py | 43 ++++++++++++++++++++++ UnityPy/classes/legacy_patch/__init__.py | 15 ++++---- 2 files changed, 51 insertions(+), 7 deletions(-) create mode 100644 UnityPy/classes/legacy_patch/GameObject.py diff --git a/UnityPy/classes/legacy_patch/GameObject.py b/UnityPy/classes/legacy_patch/GameObject.py new file mode 100644 index 00000000..5392b1d2 --- /dev/null +++ b/UnityPy/classes/legacy_patch/GameObject.py @@ -0,0 +1,43 @@ +from __future__ import annotations + +from typing import List, Union + +from ...enums import ClassIDType +from ..generated import Component, GameObject, PPtr + + +def _GameObject_Components(self) -> List[PPtr[Component]]: + if self.m_Component is None: + return [] + if isinstance(self.m_Component[0], tuple): + return [c.m_GameObject for i, c in self.m_Component] + else: + return [c.component for c in self.m_Component] + + +def _GameObject_GetComponent(self, type: ClassIDType) -> Union[PPtr[Component], None]: + for component in self.m_Components: + if component.type == type: + return component + return None + + +GameObject.m_Components = property(_GameObject_Components) +GameObject.m_Animator = property( + lambda self: _GameObject_GetComponent(self, ClassIDType.Animator) +) +GameObject.m_Animation = property( + lambda self: _GameObject_GetComponent(self, ClassIDType.Animation) +) +GameObject.m_Transform = property( + lambda self: _GameObject_GetComponent(self, ClassIDType.Transform) +) +GameObject.m_MeshRenderer = property( + lambda self: _GameObject_GetComponent(self, ClassIDType.MeshRenderer) +) +GameObject.m_SkinnedMeshRenderer = property( + lambda self: _GameObject_GetComponent(self, ClassIDType.SkinnedMeshRenderer) +) +GameObject.m_MeshFilter = property( + lambda self: _GameObject_GetComponent(self, ClassIDType.MeshFilter) +) diff --git a/UnityPy/classes/legacy_patch/__init__.py b/UnityPy/classes/legacy_patch/__init__.py index 489eb28b..e761a061 100644 --- a/UnityPy/classes/legacy_patch/__init__.py +++ b/UnityPy/classes/legacy_patch/__init__.py @@ -1,7 +1,8 @@ -from .AudioClip import AudioClip -from .Mesh import Mesh -from .Renderer import Renderer -from .Shader import Shader -from .Sprite import Sprite -from .Texture2D import Texture2D -from .Texture2DArray import Texture2DArray +from .AudioClip import AudioClip as AudioClip +from .GameObject import GameObject as GameObject +from .Mesh import Mesh as Mesh +from .Renderer import Renderer as Renderer +from .Shader import Shader as Shader +from .Sprite import Sprite as Sprite +from .Texture2D import Texture2D as Texture2D +from .Texture2DArray import Texture2DArray as Texture2DArray From ee8643e5bac90306a5ab933b899f2d371dddf507 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Mon, 30 Sep 2024 15:48:14 +0200 Subject: [PATCH 113/403] SerializedFile - ContainerHelper typing fix and if no assetbundle --- UnityPy/files/SerializedFile.py | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/UnityPy/files/SerializedFile.py b/UnityPy/files/SerializedFile.py index 3d88e35c..f22e5124 100644 --- a/UnityPy/files/SerializedFile.py +++ b/UnityPy/files/SerializedFile.py @@ -13,7 +13,7 @@ from . import BundleFile, File, ObjectReader if TYPE_CHECKING: - from ..classes import AssetBundle, AssetInfo, Object + from ..classes import AssetBundle, AssetInfo, Object, PPtr from ..files import ObjectReader from ..streams.EndianBinaryReader import EndianBinaryReader @@ -331,7 +331,7 @@ def __init__(self, reader: EndianBinaryReader, parent=None, name=None, **kwargs) break else: self.assetbundle = None - self._container = ContainerHelper({}) + self._container = ContainerHelper() @property def container(self): @@ -517,26 +517,29 @@ class ContainerHelper: """Helper class to allow multidict containers without breaking compatibility with old versions""" - container: Tuple[str, AssetInfo] - container_dict: Dict[str, ObjectReader] + container: List[Tuple[str, AssetInfo]] + container_dict: Dict[str, PPtr[Object]] path_dict: Dict[int, str] - def __init__(self, assetbundle: AssetBundle) -> None: - self.container = assetbundle.m_Container + def __init__(self, assetbundle: Optional[AssetBundle] = None) -> None: + if assetbundle is None: + self.container = [] + else: + self.container = assetbundle.m_Container # support for getitem self.container_dict = {key: value.asset for key, value in self.container} self.path_dict = {value.asset.m_PathID: key for key, value in self.container} - def items(self) -> Generator[Tuple[str, ObjectReader], None, None]: + def items(self) -> Generator[Tuple[str, PPtr[Object]], None, None]: return ((key, value.asset) for key, value in self.container) def keys(self) -> list[str]: return list({key for key, value in self.container}) - def values(self) -> list[ObjectReader]: + def values(self) -> list[PPtr[Object]]: return list({value.asset for key, value in self.container}) - def __getitem__(self, key) -> ObjectReader: + def __getitem__(self, key) -> PPtr[Object]: return self.container_dict[key] def __setitem__(self, key, value) -> None: @@ -551,7 +554,7 @@ def __iter__(self) -> Generator[str, None, None]: def __len__(self) -> int: return len(self.container) - def __getattr__(self, name: str) -> ObjectReader: + def __getattr__(self, name: str) -> PPtr[Object]: return self.container_dict[name] def __or__(self, other: ContainerHelper): @@ -560,5 +563,5 @@ def __or__(self, other: ContainerHelper): def __str__(self) -> str: return f'{{{", ".join(f"{key}: {value}" for key, value in self.items())}}}' - def __dict__(self) -> Dict[str, ObjectReader]: + def __dict__(self) -> Dict[str, PPtr[Object]]: return self.container_dict From 0690aab0604db62fde257f8091e3ce96c406c325 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Mon, 30 Sep 2024 15:49:06 +0200 Subject: [PATCH 114/403] setup.py - configure c++ version dynamically based on compiler version --- setup.py | 41 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 37 insertions(+), 4 deletions(-) diff --git a/setup.py b/setup.py index 247ecef9..fa37320d 100644 --- a/setup.py +++ b/setup.py @@ -1,12 +1,47 @@ import os import platform -from setuptools import setup, Extension, find_packages +import re +import subprocess +from setuptools import Extension, find_packages, setup +from setuptools.command.build_ext import build_ext INSTALL_DIR = os.path.dirname(os.path.realpath(__file__)) UNITYPYBOOST_DIR = os.path.join(INSTALL_DIR, "UnityPyBoost") +class BuildExt(build_ext): + def build_extensions(self): + cpp_version_flag: str + compiler = self.compiler + # msvc - only ever used c++20, never c++2a + if compiler.compiler_type == "msvc": + cpp_version_flag = "/std:c++20" + # gnu & clang + elif compiler.compiler_type == "unix": + res = subprocess.run( + [compiler.compiler[0], "-v"], + capture_output=True, + ) + # for some reason g++ and clang++ return this as error + text = (res.stdout or res.stderr).decode("utf-8") + version = re.search(r"version\s+(\d+)\.", text) + if version is None: + raise Exception("Failed to determine compiler version") + version = int(version.group(1)) + if version < 10: + cpp_version_flag = "-std=c++2a" + else: + cpp_version_flag = "-std=c++20" + else: + cpp_version_flag = "-std=c++20" + + for ext in self.extensions: + ext.extra_compile_args = [cpp_version_flag] + + build_ext.build_extensions(self) + + def get_fmod_library(): # determine system - Windows, Darwin, Linux, Android system = platform.system() @@ -68,10 +103,8 @@ def get_fmod_library(): if f.endswith(".cpp") ], language="c++", - extra_compile_args=[ - "/std:c++20" if platform.system() == "Windows" else "-std=c++20" - ], include_dirs=[UNITYPYBOOST_DIR], ) ], + cmdclass={"build_ext": BuildExt}, ) From e3a5934f15a1726f1fb8ad5267fb7bf903b8100b Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Mon, 30 Sep 2024 16:13:53 +0200 Subject: [PATCH 115/403] README - update Crash without warning/error --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a2c358cd..74c13144 100644 --- a/README.md +++ b/README.md @@ -74,7 +74,7 @@ In case this happens, the usage of the C-typetree reader can be disabled by addi ```python from UnityPy.helpers import TypeTreeHelper -TypeTreeHelper.read_typetree_c = False +TypeTreeHelper.read_typetree_boost = False ``` ## Example From e4e1229cd845fabae4a2feeb9b0502a5bfedb004 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Mon, 30 Sep 2024 16:15:00 +0200 Subject: [PATCH 116/403] TypeTreeHelper.cpp - use macro functions for better speed, add missing incref and decref --- UnityPyBoost/TypeTreeHelper.cpp | 119 +++++++++++++++++--------------- 1 file changed, 62 insertions(+), 57 deletions(-) diff --git a/UnityPyBoost/TypeTreeHelper.cpp b/UnityPyBoost/TypeTreeHelper.cpp index e0e43f92..4d420a65 100644 --- a/UnityPyBoost/TypeTreeHelper.cpp +++ b/UnityPyBoost/TypeTreeHelper.cpp @@ -180,12 +180,12 @@ inline PyObject *read_pair(ReaderT *reader, TypeTreeNodeObject *node, TypeTreeRe return NULL; } - PyObject *first = read_typetree_value(reader, (TypeTreeNodeObject *)PyList_GetItem(node->m_Children, 0), config); + PyObject *first = read_typetree_value(reader, (TypeTreeNodeObject *)PyList_GET_ITEM(node->m_Children, 0), config); if (!first) { return NULL; } - PyObject *second = read_typetree_value(reader, (TypeTreeNodeObject *)PyList_GetItem(node->m_Children, 1), config); + PyObject *second = read_typetree_value(reader, (TypeTreeNodeObject *)PyList_GET_ITEM(node->m_Children, 1), config); if (!second) { Py_DECREF(first); @@ -198,10 +198,9 @@ inline PyObject *read_pair(ReaderT *reader, TypeTreeNodeObject *node, TypeTreeRe } template -inline PyObject *read_class(ReaderT *reader, TypeTreeNodeObject *node, TypeTreeReaderConfigT *config) +inline PyObject *parse_class(ReaderT *reader, PyObject *dict, TypeTreeNodeObject *node, TypeTreeReaderConfigT *config) { PyObject *clz = NULL; - PyObject *dict = PyDict_New(); // Determine the class based on node's _data_type if (node->_data_type == NodeDataType::pptr) @@ -223,47 +222,38 @@ inline PyObject *read_class(ReaderT *reader, TypeTreeNodeObject *node, TypeTreeR } } + // check if class is found if (clz == NULL) { PyErr_SetString(PyExc_ValueError, "Failed to get class"); + Py_DECREF(clz); Py_DECREF(dict); return NULL; } - for (int i = 0; i < PyList_GET_SIZE(node->m_Children); i++) - { - TypeTreeNodeObject *child = (TypeTreeNodeObject *)PyList_GetItem(node->m_Children, i); - PyObject *child_value = read_typetree_value(reader, child, config); - if (!child_value) - { - Py_DECREF(dict); - return NULL; - } - if (PyDict_SetItem(dict, child->m_Name, child_value)) - { - Py_DECREF(dict); - Py_DECREF(child_value); - return NULL; - } - // dict increases ref count, so we need to decref here - Py_DECREF(child_value); - } - + // try to create class instance PyObject *args = PyTuple_New(0); PyObject *instance = PyObject_Call(clz, args, dict); if (instance != NULL) { + // success + // cleanup + Py_DECREF(clz); Py_DECREF(args); Py_DECREF(dict); + // return instance return instance; } + // failed, clear error PyErr_Clear(); + // clean key names + PyObject *key = NULL; PyObject *keys = PyDict_Keys(dict); PyObject *clean_args = PyTuple_New(1); - for (Py_ssize_t i = 0; i < PyList_Size(keys); i++) + for (Py_ssize_t i = 0; i < PyList_GET_SIZE(keys); i++) { - PyObject *key = PyList_GetItem(keys, i); + key = PyList_GET_ITEM(keys, i); PyTuple_SET_ITEM(clean_args, 0, key); PyObject *clean_key = PyObject_Call(config->clean_name, clean_args, NULL); if (PyUnicode_Compare(key, clean_key)) @@ -274,25 +264,33 @@ inline PyObject *read_class(ReaderT *reader, TypeTreeNodeObject *node, TypeTreeR } Py_DECREF(clean_key); } - PyTuple_SET_ITEM(clean_args, 0, Py_None); + // increase ref count for key, as PyTuple_SET_ITEM steals reference, so decref there will decref key + Py_INCREF(key); Py_DECREF(clean_args); Py_DECREF(keys); + // try to create class instance again with cleaned keys instance = PyObject_Call(clz, args, dict); if (instance != NULL) { + // success + // cleanup + Py_DECREF(clz); Py_DECREF(args); Py_DECREF(dict); + // return instance return instance; } + // failed, clear error PyErr_Clear(); + // some keys might be extra, check against __annotations__ PyObject *annonations = PyObject_GetAttrString(clz, "__annotations__"); PyObject *extras = PyDict_New(); keys = PyDict_Keys(dict); for (Py_ssize_t i = 0; i < PyList_Size(keys); i++) { - PyObject *key = PyList_GetItem(keys, i); + PyObject *key = PyList_GET_ITEM(keys, i); if (PyDict_Contains(annonations, key) == 0) { PyObject *value = PyDict_GetItem(dict, key); @@ -301,21 +299,29 @@ inline PyObject *read_class(ReaderT *reader, TypeTreeNodeObject *node, TypeTreeR } } Py_DECREF(keys); + Py_DECREF(annonations); + // try to create class instance again with cleaned keys instance = PyObject_Call(clz, args, dict); if (instance != NULL) { + // success, manually set extra keys PyObject *items = PyDict_Items(extras); for (Py_ssize_t i = 0; i < PyList_Size(items); i++) { - PyObject *item = PyList_GetItem(items, i); + PyObject *item = PyList_GET_ITEM(items, i); PyObject *key = PyTuple_GetItem(item, 0); PyObject *value = PyTuple_GetItem(item, 1); PyObject_SetAttr(instance, key, value); } Py_DECREF(items); } - + // cleanup + Py_DECREF(clz); + Py_DECREF(args); + Py_DECREF(dict); + Py_DECREF(extras); + // return instance or NULL if failed return instance; } @@ -373,7 +379,7 @@ PyObject *read_typetree_value(ReaderT *reader, TypeTreeNodeObject *node, TypeTre TypeTreeNodeObject *child = nullptr; if (PyList_GET_SIZE(node->m_Children) > 0) { - child = (TypeTreeNodeObject *)PyList_GetItem(node->m_Children, 0); + child = (TypeTreeNodeObject *)PyList_GET_ITEM(node->m_Children, 0); } if (child && child->_data_type == NodeDataType::array) @@ -389,7 +395,7 @@ PyObject *read_typetree_value(ReaderT *reader, TypeTreeNodeObject *node, TypeTre return NULL; } value = PyList_New(length); - child = (TypeTreeNodeObject *)PyList_GetItem(child->m_Children, 1); + child = (TypeTreeNodeObject *)PyList_GET_ITEM(child->m_Children, 1); for (int i = 0; i < length; i++) { PyObject *item = read_typetree_value(reader, child, config); @@ -405,30 +411,27 @@ PyObject *read_typetree_value(ReaderT *reader, TypeTreeNodeObject *node, TypeTre { // class value = PyDict_New(); - if (config->as_dict) + for (int i = 0; i < PyList_GET_SIZE(node->m_Children); i++) { - for (int i = 0; i < PyList_GET_SIZE(node->m_Children); i++) + child = (TypeTreeNodeObject *)PyList_GET_ITEM(node->m_Children, i); + PyObject *child_value = read_typetree_value(reader, child, config); + if (!child_value) { - child = (TypeTreeNodeObject *)PyList_GetItem(node->m_Children, i); - PyObject *child_value = read_typetree_value(reader, child, config); - if (!child_value) - { - Py_DECREF(value); - return NULL; - } - if (PyDict_SetItem(value, child->m_Name, child_value)) - { - Py_DECREF(value); - Py_DECREF(child_value); - return NULL; - } - // dict increases ref count, so we need to decref here + Py_DECREF(value); + return NULL; + } + if (PyDict_SetItem(value, child->m_Name, child_value)) + { + Py_DECREF(value); Py_DECREF(child_value); + return NULL; } + // dict increases ref count, so we need to decref here + Py_DECREF(child_value); } - else + if (!config->as_dict) { - value = read_class(reader, node, config); + value = parse_class(reader, value, node, config); } } } @@ -481,6 +484,9 @@ PyObject *read_typetree(PyObject *self, PyObject *args, PyObject *kwargs) return NULL; } } + Py_INCREF(config.assetfile); + Py_INCREF(config.classes); + Py_INCREF(config.clean_name); volatile uint16_t bint = 0x0100; volatile bool is_big_endian = ((uint8_t *)&bint)[0] == 1; @@ -626,14 +632,13 @@ static int TypeTreeNode_init(TypeTreeNodeObject *self, PyObject *args, PyObject Py_XINCREF(self->m_Children); } -#define SET_NONE_IF_NULL(field) \ - if (self->field == nullptr) \ - { \ - self->field = Py_None; \ - } \ - else \ - { \ - Py_INCREF(self->field); \ +#define SET_NONE_IF_NULL(field) \ + { \ + if (self->field == nullptr) \ + { \ + self->field = Py_None; \ + } \ + Py_INCREF(self->field); \ } SET_NONE_IF_NULL(m_TypeFlags); From 9849b864b9ae367c47245a1d708f3ccdd9a0d9eb Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Mon, 30 Sep 2024 16:16:48 +0200 Subject: [PATCH 117/403] gitignore - restructure, ignore .so in UnityPy top level (c-extension) --- .gitignore | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index 2d53a172..b1405525 100644 --- a/.gitignore +++ b/.gitignore @@ -1,12 +1,19 @@ +# test files and others +test.py +AssetStudio/ +.vscode/ + + # Byte-compiled / optimized / DLL files __pycache__/ .dump .idea/ *.py[cod] *$py.class -test.py -AssetStudio/ -.vscode/ + +# precompiled C extensions +UnityPy/*.so +UnityPy/*.pyd # Distribution / packaging .Python From b8e8d049dca4b538ca8cb0e434f8a4fa5eccc136 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Mon, 30 Sep 2024 17:05:11 +0200 Subject: [PATCH 118/403] Texture2D - legacy - fix image setter - .m_Path -> .path --- UnityPy/classes/legacy_patch/Texture2D.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UnityPy/classes/legacy_patch/Texture2D.py b/UnityPy/classes/legacy_patch/Texture2D.py index 66545416..93ae68de 100644 --- a/UnityPy/classes/legacy_patch/Texture2D.py +++ b/UnityPy/classes/legacy_patch/Texture2D.py @@ -56,7 +56,7 @@ def _Texture2d_set_image( self.m_TextureFormat = tex_format if self.m_StreamData is not None: - self.m_StreamData.m_Path = "" + self.m_StreamData.path = "" self.m_StreamData.offset = 0 self.m_StreamData.size = 0 From dde90590db21f6c86b4223dabbf694ae74b04602 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Mon, 30 Sep 2024 17:05:45 +0200 Subject: [PATCH 119/403] classes.generated - use custom define function --- UnityPy/classes/generated.py | 2715 ++++++++++++++++++++++---------- generators/ClassesGenerator.py | 58 +- 2 files changed, 1890 insertions(+), 883 deletions(-) diff --git a/UnityPy/classes/generated.py b/UnityPy/classes/generated.py index a3fc3022..5a8d209b 100644 --- a/UnityPy/classes/generated.py +++ b/UnityPy/classes/generated.py @@ -1,15 +1,50 @@ -#type: ignore +# type: ignore from __future__ import annotations -from abc import ABC -from attrs import define -from typing import List, Optional, Tuple, Union -from .math import float3, Matrix3x4f, Vector3f, Vector4f, ColorRGBA, Vector2f, Quaternionf, Matrix4x4f, float4 +from abc import ABC +from typing import List, Optional, Tuple, TypeVar, Union + +from attrs import define as attrs_define + +from .math import ( + ColorRGBA, + Matrix3x4f, + Matrix4x4f, + Quaternionf, + Vector2f, + Vector3f, + Vector4f, + float3, + float4, +) from .Object import Object from .PPtr import PPtr +T = TypeVar("T") + + +def unitypy_define(cls: T) -> T: + """ + A hacky solution to bypass multiple problems related to attrs and inheritance. -@define(kw_only=True, slots=False) + The class inheritance is very lax and based on the typetrees. + Some of the child classes might not have the same attributes as the parent class, + which would make type-hinting more tricky, and breaks attrs.define. + + Therefore this function bypasses the issue + by redifining the bases for problematic classes for the attrs.define call. + """ + bases = cls.__bases__ + if bases[0] in (object, Object, ABC): + cls = attrs_define(cls, slots=True, unsafe_hash=True) + else: + cls.__bases__ = (Object,) + cls = attrs_define(cls, slots=False, unsafe_hash=True) + cls.__bases__ = bases + return cls + + +@unitypy_define class AnnotationManager(Object): m_CurrentPreset_m_AnnotationList: List[Annotation] m_RecentlyChanged: List[Annotation] @@ -22,7 +57,8 @@ class AnnotationManager(Object): m_Use3dGizmos: Optional[bool] = None m_WorldIconSize: Optional[float] = None -@define(kw_only=True, slots=False) + +@unitypy_define class AssetDatabaseV1(Object): m_AssetBundleNames: List[Tuple[int, AssetBundleFullName]] m_AssetTimeStamps: List[Tuple[str, AssetTimeStamp]] @@ -32,7 +68,8 @@ class AssetDatabaseV1(Object): m_lastValidVersionHashes: Optional[List[Tuple[int, int]]] = None m_lastValidVersions: Optional[List[Tuple[AssetImporterHashKey, int]]] = None -@define(kw_only=True, slots=False) + +@unitypy_define class AssetMetaData(Object): assetStoreRef: int guid: GUID @@ -45,7 +82,8 @@ class AssetMetaData(Object): originalParent: Optional[GUID] = None timeCreated: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class AssetServerCache(Object): m_CachesInitialized: int m_CommitItemSelection: List[GUID] @@ -56,47 +94,57 @@ class AssetServerCache(Object): m_ModifiedItems: List[Tuple[GUID, Item]] m_WorkingItemMetaData: List[Tuple[GUID, CachedAssetMetaData]] -@define(kw_only=True, slots=False) + +@unitypy_define class AudioBuildInfo(Object): m_AudioClipCount: int m_AudioMixerCount: int m_IsAudioDisabled: bool -@define(kw_only=True, slots=False) + +@unitypy_define class BuiltAssetBundleInfoSet(Object): bundleInfos: List[BuiltAssetBundleInfo] -@define(kw_only=True, slots=False) + +@unitypy_define class Derived(Object): pass -@define(kw_only=True, slots=False) + +@unitypy_define class SubDerived(Derived): pass -@define(kw_only=True, slots=False) + +@unitypy_define class DifferentMarshallingTestObject(Object): pass -@define(kw_only=True, slots=False) + +@unitypy_define class EditorBuildSettings(Object): m_Scenes: List[Scene] m_UseUCBPForAssetBundles: Optional[bool] = None m_configObjects: Optional[List[Tuple[str, PPtr[Object]]]] = None -@define(kw_only=True, slots=False) + +@unitypy_define class EditorExtension(Object, ABC): pass -@define(kw_only=True, slots=False) + +@unitypy_define class Component(EditorExtension): m_GameObject: PPtr[GameObject] -@define(kw_only=True, slots=False) + +@unitypy_define class Behaviour(Component): m_GameObject: PPtr[GameObject] -@define(kw_only=True, slots=False) + +@unitypy_define class Animation(Behaviour): m_AnimatePhysics: bool m_Animation: PPtr[AnimationClip] @@ -109,7 +157,8 @@ class Animation(Behaviour): m_UpdateMode: Optional[int] = None m_UserAABB: Optional[AABB] = None -@define(kw_only=True, slots=False) + +@unitypy_define class Animator(Behaviour): m_ApplyRootMotion: bool m_Avatar: PPtr[Avatar] @@ -127,7 +176,8 @@ class Animator(Behaviour): m_UpdateMode: Optional[int] = None m_WriteDefaultValuesOnDisable: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class ArticulationBody(Behaviour): m_AnchorPosition: Vector3f m_AnchorRotation: Quaternionf @@ -162,17 +212,20 @@ class ArticulationBody(Behaviour): m_MatchAnchors: Optional[bool] = None m_UseGravity: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class AudioBehaviour(Behaviour): m_GameObject: PPtr[GameObject] -@define(kw_only=True, slots=False) + +@unitypy_define class AudioListener(AudioBehaviour): m_Enabled: int m_GameObject: PPtr[GameObject] m_ExtensionPropertyValues: Optional[List[ExtensionPropertyValue]] = None -@define(kw_only=True, slots=False) + +@unitypy_define class AudioSource(AudioBehaviour): BypassEffects: bool DopplerLevel: float @@ -201,11 +254,13 @@ class AudioSource(AudioBehaviour): m_Resource: Optional[PPtr[AudioResource]] = None reverbZoneMixCustomCurve: Optional[AnimationCurve] = None -@define(kw_only=True, slots=False) + +@unitypy_define class AudioFilter(Behaviour): m_GameObject: PPtr[GameObject] -@define(kw_only=True, slots=False) + +@unitypy_define class AudioChorusFilter(AudioFilter): m_Delay: float m_Depth: float @@ -218,13 +273,15 @@ class AudioChorusFilter(AudioFilter): m_WetMix3: float m_FeedBack: Optional[float] = None -@define(kw_only=True, slots=False) + +@unitypy_define class AudioDistortionFilter(AudioFilter): m_DistortionLevel: float m_Enabled: int m_GameObject: PPtr[GameObject] -@define(kw_only=True, slots=False) + +@unitypy_define class AudioEchoFilter(AudioFilter): m_DecayRatio: float m_Delay: Union[int, float] @@ -233,14 +290,16 @@ class AudioEchoFilter(AudioFilter): m_GameObject: PPtr[GameObject] m_WetMix: float -@define(kw_only=True, slots=False) + +@unitypy_define class AudioHighPassFilter(AudioFilter): m_CutoffFrequency: float m_Enabled: int m_GameObject: PPtr[GameObject] m_HighpassResonanceQ: float -@define(kw_only=True, slots=False) + +@unitypy_define class AudioLowPassFilter(AudioFilter): lowpassLevelCustomCurve: AnimationCurve m_Enabled: int @@ -248,7 +307,8 @@ class AudioLowPassFilter(AudioFilter): m_LowpassResonanceQ: float m_CutoffFrequency: Optional[float] = None -@define(kw_only=True, slots=False) + +@unitypy_define class AudioReverbFilter(AudioFilter): m_DecayHFRatio: float m_DecayTime: float @@ -269,7 +329,8 @@ class AudioReverbFilter(AudioFilter): m_RoomLF: float m_RoomRolloff: Optional[float] = None -@define(kw_only=True, slots=False) + +@unitypy_define class AudioReverbZone(Behaviour): m_DecayHFRatio: float m_DecayTime: float @@ -291,7 +352,8 @@ class AudioReverbZone(Behaviour): m_RoomLF: int m_RoomRolloffFactor: Optional[float] = None -@define(kw_only=True, slots=False) + +@unitypy_define class Camera(Behaviour): far_clip_plane: float field_of_view: float @@ -331,7 +393,8 @@ class Camera(Behaviour): m_TargetEye: Optional[int] = None m_projectionMatrixMode: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class ScriptableCamera(Camera): far_clip_plane: float field_of_view: float @@ -363,7 +426,8 @@ class ScriptableCamera(Camera): orthographic: bool orthographic_size: float -@define(kw_only=True, slots=False) + +@unitypy_define class Canvas(Behaviour): m_Camera: PPtr[Camera] m_Enabled: int @@ -385,7 +449,8 @@ class Canvas(Behaviour): m_UpdateRectTransformForStandalone: Optional[int] = None m_VertexColorAlwaysGammaSpace: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class CanvasGroup(Behaviour): m_Alpha: float m_BlocksRaycasts: bool @@ -394,7 +459,8 @@ class CanvasGroup(Behaviour): m_Interactable: bool m_Enabled: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class Cloth(Behaviour): m_GameObject: PPtr[GameObject] m_BendingStiffness: Optional[float] = None @@ -411,7 +477,12 @@ class Cloth(Behaviour): m_SelfCollisionStiffness: Optional[float] = None m_SleepThreshold: Optional[float] = None m_SolverFrequency: Optional[Union[int, float]] = None - m_SphereColliders: Optional[Union[List[ClothSphereColliderPair], List[Tuple[PPtr[SphereCollider], PPtr[SphereCollider]]]]] = None + m_SphereColliders: Optional[ + Union[ + List[ClothSphereColliderPair], + List[Tuple[PPtr[SphereCollider], PPtr[SphereCollider]]], + ] + ] = None m_StretchingStiffness: Optional[float] = None m_UseContinuousCollision: Optional[bool] = None m_UseGravity: Optional[bool] = None @@ -422,7 +493,8 @@ class Cloth(Behaviour): m_WorldAccelerationScale: Optional[float] = None m_WorldVelocityScale: Optional[float] = None -@define(kw_only=True, slots=False) + +@unitypy_define class InteractiveCloth(Cloth): m_AttachedColliders: List[ClothAttachment] m_AttachmentResponse: float @@ -444,7 +516,8 @@ class InteractiveCloth(Cloth): m_Thickness: float m_UseGravity: bool -@define(kw_only=True, slots=False) + +@unitypy_define class SkinnedCloth(Cloth): m_BendingStiffness: float m_Coefficients: List[ClothConstrainCoefficients] @@ -460,16 +533,19 @@ class SkinnedCloth(Cloth): m_WorldAccelerationScale: float m_WorldVelocityScale: float -@define(kw_only=True, slots=False) + +@unitypy_define class CloudServiceHandlerBehaviour(Behaviour): m_Enabled: int m_GameObject: PPtr[GameObject] -@define(kw_only=True, slots=False) + +@unitypy_define class Collider2D(Behaviour): m_GameObject: PPtr[GameObject] -@define(kw_only=True, slots=False) + +@unitypy_define class BoxCollider2D(Collider2D): m_Enabled: int m_GameObject: PPtr[GameObject] @@ -494,7 +570,8 @@ class BoxCollider2D(Collider2D): m_UsedByComposite: Optional[bool] = None m_UsedByEffector: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class CapsuleCollider2D(Collider2D): m_Density: float m_Direction: int @@ -516,7 +593,8 @@ class CapsuleCollider2D(Collider2D): m_LayerOverridePriority: Optional[int] = None m_UsedByComposite: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class CircleCollider2D(Collider2D): m_Enabled: int m_GameObject: PPtr[GameObject] @@ -538,7 +616,8 @@ class CircleCollider2D(Collider2D): m_UsedByComposite: Optional[bool] = None m_UsedByEffector: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class CompositeCollider2D(Collider2D): m_ColliderPaths: List[SubCollider] m_CompositePaths: Polygon2D @@ -567,7 +646,8 @@ class CompositeCollider2D(Collider2D): m_UseDelaunayMesh: Optional[bool] = None m_UsedByComposite: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class CustomCollider2D(Collider2D): m_CustomShapes: PhysicsShapeGroup2D m_Density: float @@ -588,7 +668,8 @@ class CustomCollider2D(Collider2D): m_LayerOverridePriority: Optional[int] = None m_UsedByComposite: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class EdgeCollider2D(Collider2D): m_Enabled: int m_GameObject: PPtr[GameObject] @@ -614,7 +695,8 @@ class EdgeCollider2D(Collider2D): m_UsedByComposite: Optional[bool] = None m_UsedByEffector: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class PolygonCollider2D(Collider2D): m_Enabled: int m_GameObject: PPtr[GameObject] @@ -639,11 +721,13 @@ class PolygonCollider2D(Collider2D): m_UsedByComposite: Optional[bool] = None m_UsedByEffector: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class PolygonColliderBase2D(Collider2D): m_GameObject: PPtr[GameObject] -@define(kw_only=True, slots=False) + +@unitypy_define class TilemapCollider2D(Collider2D): m_Density: float m_Enabled: int @@ -666,7 +750,8 @@ class TilemapCollider2D(Collider2D): m_UseDelaunayMesh: Optional[bool] = None m_UsedByComposite: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class ConstantForce(Behaviour): m_Enabled: int m_Force: Vector3f @@ -675,11 +760,13 @@ class ConstantForce(Behaviour): m_RelativeTorque: Vector3f m_Torque: Vector3f -@define(kw_only=True, slots=False) + +@unitypy_define class Effector2D(Behaviour): m_GameObject: PPtr[GameObject] -@define(kw_only=True, slots=False) + +@unitypy_define class AreaEffector2D(Effector2D): m_AngularDrag: float m_ColliderMask: BitField @@ -694,7 +781,8 @@ class AreaEffector2D(Effector2D): m_UseColliderMask: Optional[bool] = None m_UseGlobalAngle: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class BuoyancyEffector2D(Effector2D): m_AngularDrag: float m_ColliderMask: BitField @@ -708,7 +796,8 @@ class BuoyancyEffector2D(Effector2D): m_SurfaceLevel: float m_UseColliderMask: bool -@define(kw_only=True, slots=False) + +@unitypy_define class PlatformEffector2D(Effector2D): m_ColliderMask: BitField m_Enabled: int @@ -726,7 +815,8 @@ class PlatformEffector2D(Effector2D): m_UseSideBounce: Optional[bool] = None m_UseSideFriction: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class PointEffector2D(Effector2D): m_AngularDrag: float m_ColliderMask: BitField @@ -741,7 +831,8 @@ class PointEffector2D(Effector2D): m_GameObject: PPtr[GameObject] m_UseColliderMask: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class SurfaceEffector2D(Effector2D): m_ColliderMask: BitField m_Enabled: int @@ -754,16 +845,19 @@ class SurfaceEffector2D(Effector2D): m_UseContactForce: Optional[bool] = None m_UseFriction: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class FlareLayer(Behaviour): m_Enabled: int m_GameObject: PPtr[GameObject] -@define(kw_only=True, slots=False) + +@unitypy_define class GUIElement(Behaviour): m_GameObject: PPtr[GameObject] -@define(kw_only=True, slots=False) + +@unitypy_define class GUIText(GUIElement): m_Alignment: int m_Anchor: int @@ -781,7 +875,8 @@ class GUIText(GUIElement): m_Color: Optional[ColorRGBA] = None m_RichText: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class GUITexture(GUIElement): m_BottomBorder: int m_Color: ColorRGBA @@ -793,16 +888,19 @@ class GUITexture(GUIElement): m_Texture: PPtr[Texture] m_TopBorder: int -@define(kw_only=True, slots=False) + +@unitypy_define class GUILayer(Behaviour): m_Enabled: int m_GameObject: PPtr[GameObject] -@define(kw_only=True, slots=False) + +@unitypy_define class GridLayout(Behaviour): m_GameObject: PPtr[GameObject] -@define(kw_only=True, slots=False) + +@unitypy_define class Grid(GridLayout): m_CellGap: Vector3f m_CellLayout: int @@ -811,7 +909,8 @@ class Grid(GridLayout): m_Enabled: int m_GameObject: PPtr[GameObject] -@define(kw_only=True, slots=False) + +@unitypy_define class Tilemap(GridLayout): m_AnimatedTiles: List[Tuple[int3_storage, TileAnimationData]] m_AnimationFrameRate: float @@ -830,23 +929,27 @@ class Tilemap(GridLayout): m_Tiles: List[Tuple[int3_storage, Tile]] m_TileObjectToInstantiateArray: Optional[List[TilemapRefCountedData]] = None -@define(kw_only=True, slots=False) + +@unitypy_define class Halo(Behaviour): m_Color: ColorRGBA m_Enabled: int m_GameObject: PPtr[GameObject] m_Size: float -@define(kw_only=True, slots=False) + +@unitypy_define class HaloLayer(Behaviour): m_Enabled: int m_GameObject: PPtr[GameObject] -@define(kw_only=True, slots=False) + +@unitypy_define class IConstraint(Behaviour): m_GameObject: PPtr[GameObject] -@define(kw_only=True, slots=False) + +@unitypy_define class AimConstraint(IConstraint): m_AffectRotationX: bool m_AffectRotationY: bool @@ -865,7 +968,8 @@ class AimConstraint(IConstraint): m_Active: Optional[bool] = None m_IsContraintActive: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class LookAtConstraint(IConstraint): m_Enabled: int m_GameObject: PPtr[GameObject] @@ -879,7 +983,8 @@ class LookAtConstraint(IConstraint): m_Active: Optional[bool] = None m_IsContraintActive: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class ParentConstraint(IConstraint): m_AffectRotationX: bool m_AffectRotationY: bool @@ -898,7 +1003,8 @@ class ParentConstraint(IConstraint): m_Active: Optional[bool] = None m_IsContraintActive: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class PositionConstraint(IConstraint): m_AffectTranslationX: bool m_AffectTranslationY: bool @@ -912,7 +1018,8 @@ class PositionConstraint(IConstraint): m_Active: Optional[bool] = None m_IsContraintActive: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class RotationConstraint(IConstraint): m_AffectRotationX: bool m_AffectRotationY: bool @@ -926,7 +1033,8 @@ class RotationConstraint(IConstraint): m_Active: Optional[bool] = None m_IsContraintActive: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class ScaleConstraint(IConstraint): m_AffectScalingX: bool m_AffectScalingY: bool @@ -940,15 +1048,18 @@ class ScaleConstraint(IConstraint): m_Active: Optional[bool] = None m_IsContraintActive: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class Joint2D(Behaviour): m_GameObject: PPtr[GameObject] -@define(kw_only=True, slots=False) + +@unitypy_define class AnchoredJoint2D(Joint2D): m_GameObject: PPtr[GameObject] -@define(kw_only=True, slots=False) + +@unitypy_define class DistanceJoint2D(AnchoredJoint2D): m_Anchor: Vector2f m_ConnectedAnchor: Vector2f @@ -965,7 +1076,8 @@ class DistanceJoint2D(AnchoredJoint2D): m_EnableCollision: Optional[bool] = None m_MaxDistanceOnly: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class FixedJoint2D(AnchoredJoint2D): m_Anchor: Vector2f m_AutoConfigureConnectedAnchor: bool @@ -980,7 +1092,8 @@ class FixedJoint2D(AnchoredJoint2D): m_GameObject: PPtr[GameObject] m_BreakAction: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class FrictionJoint2D(AnchoredJoint2D): m_Anchor: Vector2f m_AutoConfigureConnectedAnchor: bool @@ -995,7 +1108,8 @@ class FrictionJoint2D(AnchoredJoint2D): m_MaxTorque: float m_BreakAction: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class HingeJoint2D(AnchoredJoint2D): m_Anchor: Vector2f m_AngleLimits: Union[JointAngleLimit2D, JointAngleLimits2D] @@ -1014,7 +1128,8 @@ class HingeJoint2D(AnchoredJoint2D): m_EnableCollision: Optional[bool] = None m_UseConnectedAnchor: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class SliderJoint2D(AnchoredJoint2D): m_Anchor: Vector2f m_Angle: float @@ -1034,7 +1149,8 @@ class SliderJoint2D(AnchoredJoint2D): m_CollideConnected: Optional[bool] = None m_EnableCollision: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class SpringJoint2D(AnchoredJoint2D): m_Anchor: Vector2f m_ConnectedAnchor: Vector2f @@ -1052,7 +1168,8 @@ class SpringJoint2D(AnchoredJoint2D): m_CollideConnected: Optional[bool] = None m_EnableCollision: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class WheelJoint2D(AnchoredJoint2D): m_Anchor: Vector2f m_ConnectedAnchor: Vector2f @@ -1069,7 +1186,8 @@ class WheelJoint2D(AnchoredJoint2D): m_CollideConnected: Optional[bool] = None m_EnableCollision: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class RelativeJoint2D(Joint2D): m_AngularOffset: float m_AutoConfigureOffset: bool @@ -1085,7 +1203,8 @@ class RelativeJoint2D(Joint2D): m_MaxTorque: float m_BreakAction: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class TargetJoint2D(Joint2D): m_Anchor: Vector2f m_AutoConfigureTarget: bool @@ -1101,7 +1220,8 @@ class TargetJoint2D(Joint2D): m_Target: Vector2f m_BreakAction: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class LensFlare(Behaviour): m_Brightness: float m_Color: ColorRGBA @@ -1112,7 +1232,8 @@ class LensFlare(Behaviour): m_IgnoreLayers: BitField m_FadeSpeed: Optional[float] = None -@define(kw_only=True, slots=False) + +@unitypy_define class Light(Behaviour): m_Color: ColorRGBA m_Cookie: PPtr[Texture] @@ -1150,12 +1271,14 @@ class Light(Behaviour): m_UseColorTemperature: Optional[bool] = None m_UseViewFrustumForShadowCasterCull: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class LightProbeGroup(Behaviour): m_GameObject: PPtr[GameObject] m_Enabled: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class LightProbeProxyVolume(Behaviour): m_BoundingBoxMode: int m_BoundingBoxOrigin: Vector3f @@ -1172,14 +1295,16 @@ class LightProbeProxyVolume(Behaviour): m_DataFormat: Optional[int] = None m_QualityMode: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class MonoBehaviour(Behaviour): m_Enabled: int m_GameObject: PPtr[GameObject] m_Name: str m_Script: PPtr[MonoScript] -@define(kw_only=True, slots=False) + +@unitypy_define class NavMeshAgent(Behaviour): m_Acceleration: float m_AngularSpeed: float @@ -1198,7 +1323,8 @@ class NavMeshAgent(Behaviour): m_AgentTypeID: Optional[int] = None m_AutoBraking: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class NavMeshObstacle(Behaviour): m_Enabled: int m_GameObject: PPtr[GameObject] @@ -1212,7 +1338,8 @@ class NavMeshObstacle(Behaviour): m_Shape: Optional[int] = None m_TimeToStationary: Optional[float] = None -@define(kw_only=True, slots=False) + +@unitypy_define class NetworkView(Behaviour): m_Enabled: int m_GameObject: PPtr[GameObject] @@ -1220,7 +1347,8 @@ class NetworkView(Behaviour): m_StateSynchronization: int m_ViewID: NetworkViewID -@define(kw_only=True, slots=False) + +@unitypy_define class OffMeshLink(Behaviour): m_Activated: bool m_BiDirectional: bool @@ -1235,17 +1363,20 @@ class OffMeshLink(Behaviour): m_Enabled: Optional[int] = None m_NavMeshLayer: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class ParticleSystemForceField(Behaviour): m_Enabled: int m_GameObject: PPtr[GameObject] m_Parameters: ParticleSystemForceFieldParameters -@define(kw_only=True, slots=False) + +@unitypy_define class PhysicsUpdateBehaviour2D(Behaviour): m_GameObject: PPtr[GameObject] -@define(kw_only=True, slots=False) + +@unitypy_define class ConstantForce2D(PhysicsUpdateBehaviour2D): m_Enabled: int m_Force: Vector2f @@ -1253,7 +1384,8 @@ class ConstantForce2D(PhysicsUpdateBehaviour2D): m_RelativeForce: Vector2f m_Torque: float -@define(kw_only=True, slots=False) + +@unitypy_define class PlayableDirector(Behaviour): m_DirectorUpdateMode: int m_Enabled: int @@ -1265,7 +1397,8 @@ class PlayableDirector(Behaviour): m_SceneBindings: List[DirectorGenericBinding] m_WrapMode: int -@define(kw_only=True, slots=False) + +@unitypy_define class Projector(Behaviour): m_AspectRatio: float m_Enabled: int @@ -1278,7 +1411,8 @@ class Projector(Behaviour): m_Orthographic: bool m_OrthographicSize: float -@define(kw_only=True, slots=False) + +@unitypy_define class ReflectionProbe(Behaviour): m_BackGroundColor: ColorRGBA m_BakedTexture: PPtr[Texture] @@ -1306,13 +1440,15 @@ class ReflectionProbe(Behaviour): m_UseOcclusionCulling: bool m_BlendDistance: Optional[float] = None -@define(kw_only=True, slots=False) + +@unitypy_define class Skybox(Behaviour): m_CustomSkybox: PPtr[Material] m_Enabled: int m_GameObject: PPtr[GameObject] -@define(kw_only=True, slots=False) + +@unitypy_define class SortingGroup(Behaviour): m_Enabled: int m_GameObject: PPtr[GameObject] @@ -1321,13 +1457,15 @@ class SortingGroup(Behaviour): m_SortAtRoot: Optional[bool] = None m_SortingLayerID: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class StreamingController(Behaviour): m_Enabled: int m_GameObject: PPtr[GameObject] m_StreamingMipmapBias: float -@define(kw_only=True, slots=False) + +@unitypy_define class Terrain(Behaviour): m_BakeLightProbesForTrees: bool m_ChunkDynamicUVST: Vector4f @@ -1372,7 +1510,8 @@ class Terrain(Behaviour): m_TreeMotionVectorModeOverride: Optional[int] = None m_UseDefaultSmoothness: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class VideoPlayer(Behaviour): m_AspectRatio: int m_AudioOutputMode: int @@ -1404,7 +1543,8 @@ class VideoPlayer(Behaviour): m_TimeUpdateMode: Optional[int] = None m_VideoShaders: Optional[List[PPtr[Shader]]] = None -@define(kw_only=True, slots=False) + +@unitypy_define class VisualEffect(Behaviour): m_Asset: PPtr[VisualEffectAsset] m_Enabled: int @@ -1416,7 +1556,8 @@ class VisualEffect(Behaviour): m_InitialEventName: Optional[str] = None m_InitialEventNameOverriden: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class WindZone(Behaviour): m_Enabled: int m_GameObject: PPtr[GameObject] @@ -1427,12 +1568,14 @@ class WindZone(Behaviour): m_WindPulseMagnitude: float m_WindTurbulence: float -@define(kw_only=True, slots=False) + +@unitypy_define class CanvasRenderer(Component): m_GameObject: PPtr[GameObject] m_CullTransparentMesh: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class Collider(Component): m_GameObject: Optional[PPtr[GameObject]] = None m_MaxLimitX: Optional[float] = None @@ -1445,7 +1588,8 @@ class Collider(Component): m_YMotionType: Optional[int] = None m_ZMotionType: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class BoxCollider(Collider): m_Center: Vector3f m_Enabled: bool @@ -1458,7 +1602,8 @@ class BoxCollider(Collider): m_LayerOverridePriority: Optional[int] = None m_ProvidesContacts: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class CapsuleCollider(Collider): m_Center: Vector3f m_Direction: int @@ -1473,7 +1618,8 @@ class CapsuleCollider(Collider): m_LayerOverridePriority: Optional[int] = None m_ProvidesContacts: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class CharacterController(Collider): m_Center: Vector3f m_GameObject: PPtr[GameObject] @@ -1491,7 +1637,8 @@ class CharacterController(Collider): m_Material: Optional[Union[PPtr[PhysicMaterial], PPtr[PhysicsMaterial]]] = None m_ProvidesContacts: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class MeshCollider(Collider): m_Convex: bool m_Enabled: bool @@ -1508,7 +1655,8 @@ class MeshCollider(Collider): m_SkinWidth: Optional[float] = None m_SmoothSphereCollisions: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class RaycastCollider(Collider): m_Center: Vector3f m_Enabled: bool @@ -1517,7 +1665,8 @@ class RaycastCollider(Collider): m_Length: float m_Material: PPtr[PhysicMaterial] -@define(kw_only=True, slots=False) + +@unitypy_define class SphereCollider(Collider): m_Center: Vector3f m_Enabled: bool @@ -1530,7 +1679,8 @@ class SphereCollider(Collider): m_LayerOverridePriority: Optional[int] = None m_ProvidesContacts: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class TerrainCollider(Collider): m_Enabled: bool m_GameObject: PPtr[GameObject] @@ -1544,7 +1694,8 @@ class TerrainCollider(Collider): m_Material: Optional[Union[PPtr[PhysicMaterial], PPtr[PhysicsMaterial]]] = None m_ProvidesContacts: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class WheelCollider(Collider): m_Center: Vector3f m_ForwardFriction: WheelFrictionCurve @@ -1562,15 +1713,18 @@ class WheelCollider(Collider): m_ProvidesContacts: Optional[bool] = None m_WheelDampingRate: Optional[float] = None -@define(kw_only=True, slots=False) + +@unitypy_define class FakeComponent(Component): m_GameObject: PPtr[GameObject] -@define(kw_only=True, slots=False) + +@unitypy_define class Joint(Component): m_GameObject: PPtr[GameObject] -@define(kw_only=True, slots=False) + +@unitypy_define class CharacterJoint(Joint): m_Anchor: Vector3f m_Axis: Vector3f @@ -1597,7 +1751,8 @@ class CharacterJoint(Joint): m_SwingLimitSpring: Optional[SoftJointLimitSpring] = None m_TwistLimitSpring: Optional[SoftJointLimitSpring] = None -@define(kw_only=True, slots=False) + +@unitypy_define class ConfigurableJoint(Joint): m_Anchor: Vector3f m_AngularXDrive: JointDrive @@ -1645,7 +1800,8 @@ class ConfigurableJoint(Joint): m_MassScale: Optional[float] = None m_SwapBodies: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class FixedJoint(Joint): m_BreakForce: float m_BreakTorque: float @@ -1658,7 +1814,8 @@ class FixedJoint(Joint): m_Enabled: Optional[bool] = None m_MassScale: Optional[float] = None -@define(kw_only=True, slots=False) + +@unitypy_define class HingeJoint(Joint): m_Anchor: Vector3f m_Axis: Vector3f @@ -1683,7 +1840,8 @@ class HingeJoint(Joint): m_MassScale: Optional[float] = None m_UseAcceleration: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class SpringJoint(Joint): m_Anchor: Vector3f m_BreakForce: float @@ -1705,7 +1863,8 @@ class SpringJoint(Joint): m_MassScale: Optional[float] = None m_Tolerance: Optional[float] = None -@define(kw_only=True, slots=False) + +@unitypy_define class LODGroup(Component): m_Enabled: bool m_GameObject: PPtr[GameObject] @@ -1717,18 +1876,21 @@ class LODGroup(Component): m_LastLODIsBillboard: Optional[bool] = None m_ScreenRelativeTransitionHeight: Optional[float] = None -@define(kw_only=True, slots=False) + +@unitypy_define class MeshFilter(Component): m_GameObject: PPtr[GameObject] m_Mesh: PPtr[Mesh] -@define(kw_only=True, slots=False) + +@unitypy_define class MultiplayerRolesData(Component): m_ComponentsRolesMasks: List[ObjectRolePair] m_GameObject: PPtr[GameObject] m_GameObjectRolesMask: int -@define(kw_only=True, slots=False) + +@unitypy_define class OcclusionArea(Component): m_Center: Vector3f m_GameObject: PPtr[GameObject] @@ -1737,14 +1899,16 @@ class OcclusionArea(Component): m_IsTargetVolume: Optional[bool] = None m_TargetResolution: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class OcclusionPortal(Component): m_Center: Vector3f m_GameObject: PPtr[GameObject] m_Open: bool m_Size: Vector3f -@define(kw_only=True, slots=False) + +@unitypy_define class ParticleAnimator(Component): Does_Animate_Color: bool autodestruct: bool @@ -1762,11 +1926,13 @@ class ParticleAnimator(Component): stopSimulation: bool worldRotationAxis: Vector3f -@define(kw_only=True, slots=False) + +@unitypy_define class ParticleEmitter(Component): m_GameObject: PPtr[GameObject] -@define(kw_only=True, slots=False) + +@unitypy_define class EllipsoidParticleEmitter(ParticleEmitter): Simulate_in_Worldspace: bool angularVelocity: float @@ -1790,7 +1956,8 @@ class EllipsoidParticleEmitter(ParticleEmitter): tangentVelocity: Vector3f worldVelocity: Vector3f -@define(kw_only=True, slots=False) + +@unitypy_define class MeshParticleEmitter(ParticleEmitter): Simulate_in_Worldspace: bool angularVelocity: float @@ -1817,7 +1984,8 @@ class MeshParticleEmitter(ParticleEmitter): tangentVelocity: Vector3f worldVelocity: Vector3f -@define(kw_only=True, slots=False) + +@unitypy_define class ParticleSystem(Component): ClampVelocityModule: ClampVelocityModule CollisionModule: CollisionModule @@ -1863,15 +2031,18 @@ class ParticleSystem(Component): useRigidbodyForVelocity: Optional[bool] = None useUnscaledTime: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class Pipeline(Component): m_GameObject: PPtr[GameObject] -@define(kw_only=True, slots=False) + +@unitypy_define class Renderer(Component): m_GameObject: PPtr[GameObject] -@define(kw_only=True, slots=False) + +@unitypy_define class BillboardRenderer(Renderer): m_Billboard: PPtr[BillboardAsset] m_CastShadows: int @@ -1905,7 +2076,8 @@ class BillboardRenderer(Renderer): m_SubsetIndices: Optional[List[int]] = None m_UseLightProbes: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class ClothRenderer(Renderer): m_CastShadows: bool m_Enabled: bool @@ -1923,7 +2095,8 @@ class ClothRenderer(Renderer): m_SortingOrder: Optional[int] = None m_UseLightProbes: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class LineRenderer(Renderer): m_CastShadows: Union[bool, int] m_Enabled: bool @@ -1963,7 +2136,8 @@ class LineRenderer(Renderer): m_SubsetIndices: Optional[List[int]] = None m_UseLightProbes: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class RendererFake(LineRenderer): m_CastShadows: int m_DynamicOccludee: int @@ -1994,7 +2168,8 @@ class RendererFake(LineRenderer): m_RayTraceProcedural: Optional[int] = None m_RayTracingMode: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class MeshRenderer(Renderer): m_CastShadows: Union[bool, int] m_Enabled: bool @@ -2030,7 +2205,8 @@ class MeshRenderer(Renderer): m_SubsetIndices: Optional[List[int]] = None m_UseLightProbes: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class ParticleRenderer(Renderer): UV_Animation: UVAnimation m_CameraVelocityScale: float @@ -2063,7 +2239,8 @@ class ParticleRenderer(Renderer): m_SubsetIndices: Optional[List[int]] = None m_UseLightProbes: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class ParticleSystemRenderer(Renderer): m_CameraVelocityScale: float m_CastShadows: Union[bool, int] @@ -2130,7 +2307,8 @@ class ParticleSystemRenderer(Renderer): m_VertexStreamMask: Optional[int] = None m_VertexStreams: Optional[List[int]] = None -@define(kw_only=True, slots=False) + +@unitypy_define class SkinnedMeshRenderer(Renderer): m_AABB: AABB m_Bones: List[PPtr[Transform]] @@ -2173,7 +2351,8 @@ class SkinnedMeshRenderer(Renderer): m_SubsetIndices: Optional[List[int]] = None m_UseLightProbes: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class SpriteMask(Renderer): m_BackSortingLayer: int m_BackSortingOrder: int @@ -2215,7 +2394,8 @@ class SpriteMask(Renderer): m_SpriteSortPoint: Optional[int] = None m_StaticShadowCaster: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class SpriteRenderer(Renderer): m_CastShadows: Union[bool, int] m_Color: ColorRGBA @@ -2260,7 +2440,8 @@ class SpriteRenderer(Renderer): m_UseLightProbes: Optional[bool] = None m_WasSpriteAssigned: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class SpriteShapeRenderer(Renderer): m_CastShadows: int m_Color: ColorRGBA @@ -2297,7 +2478,8 @@ class SpriteShapeRenderer(Renderer): m_SpriteSortPoint: Optional[int] = None m_StaticShadowCaster: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class TilemapRenderer(Renderer): m_CastShadows: int m_ChunkSize: int3_storage @@ -2336,7 +2518,8 @@ class TilemapRenderer(Renderer): m_SmallMeshCulling: Optional[int] = None m_StaticShadowCaster: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class TrailRenderer(Renderer): m_Autodestruct: bool m_CastShadows: Union[bool, int] @@ -2380,7 +2563,8 @@ class TrailRenderer(Renderer): m_SubsetIndices: Optional[List[int]] = None m_UseLightProbes: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class UIRenderer(Renderer): m_GameObject: PPtr[GameObject] m_CastShadows: Optional[int] = None @@ -2411,7 +2595,8 @@ class UIRenderer(Renderer): m_StaticBatchRoot: Optional[PPtr[Transform]] = None m_StaticShadowCaster: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class VFXRenderer(Renderer): m_CastShadows: int m_DynamicOccludee: int @@ -2442,7 +2627,8 @@ class VFXRenderer(Renderer): m_SmallMeshCulling: Optional[int] = None m_StaticShadowCaster: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class Rigidbody(Component): m_AngularDrag: float m_CollisionDetection: int @@ -2461,7 +2647,8 @@ class Rigidbody(Component): m_InertiaRotation: Optional[Quaternionf] = None m_InertiaTensor: Optional[Vector3f] = None -@define(kw_only=True, slots=False) + +@unitypy_define class Rigidbody2D(Component): m_CollisionDetection: int m_GameObject: PPtr[GameObject] @@ -2484,7 +2671,8 @@ class Rigidbody2D(Component): m_UseAutoMass: Optional[bool] = None m_UseFullKinematicContacts: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class TextMesh(Component): m_Alignment: int m_Anchor: int @@ -2500,7 +2688,8 @@ class TextMesh(Component): m_Color: Optional[ColorRGBA] = None m_RichText: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class Transform(Component): m_Children: List[PPtr[Transform]] m_Father: PPtr[Transform] @@ -2509,7 +2698,8 @@ class Transform(Component): m_LocalRotation: Quaternionf m_LocalScale: Vector3f -@define(kw_only=True, slots=False) + +@unitypy_define class RectTransform(Transform): m_AnchorMax: Vector2f m_AnchorMin: Vector2f @@ -2524,16 +2714,19 @@ class RectTransform(Transform): m_LocalScale: Optional[Vector3f] = None m_Position: Optional[Vector2f] = None -@define(kw_only=True, slots=False) + +@unitypy_define class Tree(Component): m_GameObject: PPtr[GameObject] m_SpeedTreeWindAsset: Optional[PPtr[SpeedTreeWindAsset]] = None -@define(kw_only=True, slots=False) + +@unitypy_define class WorldAnchor(Component): m_GameObject: PPtr[GameObject] -@define(kw_only=True, slots=False) + +@unitypy_define class WorldParticleCollider(Component): m_BounceFactor: float m_CollidesWith: BitField @@ -2542,7 +2735,8 @@ class WorldParticleCollider(Component): m_MinKillVelocity: float m_SendCollisionMessage: bool -@define(kw_only=True, slots=False) + +@unitypy_define class GameObject(EditorExtension): m_Component: Union[List[ComponentPair], List[Tuple[int, PPtr[Component]]]] m_IsActive: Union[bool, int] @@ -2550,11 +2744,13 @@ class GameObject(EditorExtension): m_Name: str m_Tag: int -@define(kw_only=True, slots=False) + +@unitypy_define class NamedObject(EditorExtension, ABC): pass -@define(kw_only=True, slots=False) + +@unitypy_define class AnimatorState(NamedObject): m_CycleOffset: float m_IKOnFeet: bool @@ -2576,7 +2772,8 @@ class AnimatorState(NamedObject): m_TimeParameter: Optional[str] = None m_TimeParameterActive: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class AnimatorStateMachine(NamedObject): m_AnyStatePosition: Vector3f m_AnyStateTransitions: List[PPtr[AnimatorStateTransition]] @@ -2589,9 +2786,12 @@ class AnimatorStateMachine(NamedObject): m_Name: str m_ParentStateMachinePosition: Vector3f m_StateMachineBehaviours: List[PPtr[MonoBehaviour]] - m_StateMachineTransitions: List[Tuple[PPtr[AnimatorStateMachine], List[PPtr[AnimatorTransition]]]] + m_StateMachineTransitions: List[ + Tuple[PPtr[AnimatorStateMachine], List[PPtr[AnimatorTransition]]] + ] -@define(kw_only=True, slots=False) + +@unitypy_define class AnimatorTransitionBase(NamedObject): m_Conditions: List[AnimatorCondition] m_DstState: PPtr[AnimatorState] @@ -2601,7 +2801,8 @@ class AnimatorTransitionBase(NamedObject): m_Name: str m_Solo: bool -@define(kw_only=True, slots=False) + +@unitypy_define class AnimatorStateTransition(AnimatorTransitionBase): m_CanTransitionToSelf: bool m_Conditions: List[AnimatorCondition] @@ -2619,7 +2820,8 @@ class AnimatorStateTransition(AnimatorTransitionBase): m_TransitionOffset: float m_HasFixedDuration: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class AnimatorTransition(AnimatorTransitionBase): m_Conditions: List[AnimatorCondition] m_DstState: PPtr[AnimatorState] @@ -2629,7 +2831,8 @@ class AnimatorTransition(AnimatorTransitionBase): m_Name: str m_Solo: bool -@define(kw_only=True, slots=False) + +@unitypy_define class AssetBundle(NamedObject): m_Container: List[Tuple[str, AssetInfo]] m_MainAsset: AssetInfo @@ -2646,29 +2849,34 @@ class AssetBundle(NamedObject): m_SceneHashes: Optional[List[Tuple[str, str]]] = None m_ScriptCompatibility: Optional[List[AssetBundleScriptInfo]] = None -@define(kw_only=True, slots=False) + +@unitypy_define class AssetBundleManifest(NamedObject): AssetBundleInfos: List[Tuple[int, AssetBundleInfo]] AssetBundleNames: List[Tuple[int, str]] AssetBundlesWithVariant: List[int] m_Name: str -@define(kw_only=True, slots=False) + +@unitypy_define class AssetImportInProgressProxy(NamedObject): m_Name: str -@define(kw_only=True, slots=False) + +@unitypy_define class AssetImporter(NamedObject, ABC): pass -@define(kw_only=True, slots=False) + +@unitypy_define class ASTCImporter(AssetImporter): m_AssetBundleName: str m_AssetBundleVariant: str m_Name: str m_UserData: str -@define(kw_only=True, slots=False) + +@unitypy_define class AndroidAssetPackImporter(AssetImporter): m_AssetBundleName: str m_AssetBundleVariant: str @@ -2677,7 +2885,8 @@ class AndroidAssetPackImporter(AssetImporter): m_UsedFileIDs: List[int] m_UserData: str -@define(kw_only=True, slots=False) + +@unitypy_define class AssemblyDefinitionImporter(AssetImporter): m_AssetBundleName: str m_AssetBundleVariant: str @@ -2686,7 +2895,8 @@ class AssemblyDefinitionImporter(AssetImporter): m_UserData: str m_UsedFileIDs: Optional[List[int]] = None -@define(kw_only=True, slots=False) + +@unitypy_define class AssemblyDefinitionReferenceImporter(AssetImporter): m_AssetBundleName: str m_AssetBundleVariant: str @@ -2695,7 +2905,8 @@ class AssemblyDefinitionReferenceImporter(AssetImporter): m_UsedFileIDs: List[int] m_UserData: str -@define(kw_only=True, slots=False) + +@unitypy_define class AudioImporter(AssetImporter): m_3D: bool m_ForceToMono: bool @@ -2714,7 +2925,9 @@ class AudioImporter(AssetImporter): m_Normalize: Optional[bool] = None m_OldHashIdentity: Optional[MdFour] = None m_Output: Optional[Union[AudioImporterOutput, Output]] = None - m_PlatformSettingOverrides: Optional[Union[List[Tuple[str, SampleSettings]], List[Tuple[int, SampleSettings]]]] = None + m_PlatformSettingOverrides: Optional[ + Union[List[Tuple[str, SampleSettings]], List[Tuple[int, SampleSettings]]] + ] = None m_PreloadAudioData: Optional[bool] = None m_PreviewData: Optional[PreviewData] = None m_PreviewDataLength: Optional[int] = None @@ -2724,7 +2937,8 @@ class AudioImporter(AssetImporter): m_UsedFileIDs: Optional[List[int]] = None m_UserData: Optional[str] = None -@define(kw_only=True, slots=False) + +@unitypy_define class BuildArchiveImporter(AssetImporter): m_AssetBundleName: str m_AssetBundleVariant: str @@ -2733,7 +2947,8 @@ class BuildArchiveImporter(AssetImporter): m_UsedFileIDs: List[int] m_UserData: str -@define(kw_only=True, slots=False) + +@unitypy_define class BuildInstructionImporter(AssetImporter): m_AssetBundleName: str m_AssetBundleVariant: str @@ -2742,7 +2957,8 @@ class BuildInstructionImporter(AssetImporter): m_UsedFileIDs: List[int] m_UserData: str -@define(kw_only=True, slots=False) + +@unitypy_define class BuildMetaDataImporter(AssetImporter): m_AssetBundleName: str m_AssetBundleVariant: str @@ -2751,7 +2967,8 @@ class BuildMetaDataImporter(AssetImporter): m_UsedFileIDs: List[int] m_UserData: str -@define(kw_only=True, slots=False) + +@unitypy_define class C4DImporter(AssetImporter): m_AssetBundleName: str m_AssetBundleVariant: str @@ -2760,7 +2977,8 @@ class C4DImporter(AssetImporter): m_UsedFileIDs: List[int] m_UserData: str -@define(kw_only=True, slots=False) + +@unitypy_define class ComputeShaderImporter(AssetImporter): m_Name: str m_UserData: str @@ -2772,7 +2990,8 @@ class ComputeShaderImporter(AssetImporter): m_PreprocessorOverride: Optional[int] = None m_UsedFileIDs: Optional[List[int]] = None -@define(kw_only=True, slots=False) + +@unitypy_define class DDSImporter(AssetImporter): m_Name: str m_AssetBundleName: Optional[str] = None @@ -2783,7 +3002,8 @@ class DDSImporter(AssetImporter): m_OldHashIdentity: Optional[MdFour] = None m_UserData: Optional[str] = None -@define(kw_only=True, slots=False) + +@unitypy_define class DefaultImporter(AssetImporter): m_Name: str m_AssetBundleName: Optional[str] = None @@ -2795,7 +3015,8 @@ class DefaultImporter(AssetImporter): m_UsedFileIDs: Optional[List[int]] = None m_UserData: Optional[str] = None -@define(kw_only=True, slots=False) + +@unitypy_define class IHVImageFormatImporter(AssetImporter): m_AssetBundleName: str m_AssetBundleVariant: str @@ -2811,14 +3032,16 @@ class IHVImageFormatImporter(AssetImporter): m_UsedFileIDs: Optional[List[int]] = None m_sRGBTexture: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class KTXImporter(AssetImporter): m_AssetBundleName: str m_AssetBundleVariant: str m_Name: str m_UserData: str -@define(kw_only=True, slots=False) + +@unitypy_define class LibraryAssetImporter(AssetImporter): m_Name: str m_AssetBundleName: Optional[str] = None @@ -2830,7 +3053,8 @@ class LibraryAssetImporter(AssetImporter): m_UsedFileIDs: Optional[List[int]] = None m_UserData: Optional[str] = None -@define(kw_only=True, slots=False) + +@unitypy_define class LocalizationImporter(AssetImporter): m_AssetBundleName: str m_AssetBundleVariant: str @@ -2839,11 +3063,13 @@ class LocalizationImporter(AssetImporter): m_UserData: str m_UsedFileIDs: Optional[List[int]] = None -@define(kw_only=True, slots=False) + +@unitypy_define class ModelImporter(AssetImporter, ABC): pass -@define(kw_only=True, slots=False) + +@unitypy_define class FBXImporter(ModelImporter): m_AddColliders: bool m_AnimationCompression: int @@ -2865,7 +3091,9 @@ class FBXImporter(ModelImporter): generateSecondaryUV: Optional[bool] = None indexFormat: Optional[int] = None keepQuads: Optional[bool] = None - legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: Optional[bool] = None + legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: Optional[bool] = ( + None + ) m_AddHumanoidExtraRootOnlyWhenUsingAvatar: Optional[bool] = None m_AdditionalBone: Optional[bool] = None m_AnimationDoRetargetingWarnings: Optional[bool] = None @@ -2968,7 +3196,8 @@ class FBXImporter(ModelImporter): tangentImportMode: Optional[int] = None weldVertices: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class Mesh3DSImporter(ModelImporter): m_AddColliders: bool m_AnimationCompression: int @@ -2990,7 +3219,9 @@ class Mesh3DSImporter(ModelImporter): generateSecondaryUV: Optional[bool] = None indexFormat: Optional[int] = None keepQuads: Optional[bool] = None - legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: Optional[bool] = None + legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: Optional[bool] = ( + None + ) m_AddHumanoidExtraRootOnlyWhenUsingAvatar: Optional[bool] = None m_AdditionalBone: Optional[bool] = None m_AnimationDoRetargetingWarnings: Optional[bool] = None @@ -3093,7 +3324,8 @@ class Mesh3DSImporter(ModelImporter): tangentImportMode: Optional[int] = None weldVertices: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class SketchUpImporter(ModelImporter): generateSecondaryUV: bool keepQuads: bool @@ -3157,7 +3389,9 @@ class SketchUpImporter(ModelImporter): bakeAxisConversion: Optional[bool] = None blendShapeNormalImportMode: Optional[int] = None indexFormat: Optional[int] = None - legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: Optional[bool] = None + legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: Optional[bool] = ( + None + ) m_AddHumanoidExtraRootOnlyWhenUsingAvatar: Optional[bool] = None m_AutoGenerateAvatarMappingIfUnspecified: Optional[bool] = None m_AutoMapExternalMaterials: Optional[bool] = None @@ -3212,7 +3446,8 @@ class SketchUpImporter(ModelImporter): skinWeightsMode: Optional[int] = None splitTangentsAcrossUV: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class MonoImporter(AssetImporter): executionOrder: int icon: PPtr[Texture2D] @@ -3227,7 +3462,8 @@ class MonoImporter(AssetImporter): m_UsedFileIDs: Optional[List[int]] = None m_UserData: Optional[str] = None -@define(kw_only=True, slots=False) + +@unitypy_define class MovieImporter(AssetImporter): m_Name: str m_Quality: float @@ -3241,7 +3477,8 @@ class MovieImporter(AssetImporter): m_UsedFileIDs: Optional[List[int]] = None m_UserData: Optional[str] = None -@define(kw_only=True, slots=False) + +@unitypy_define class MultiArtifactTestImporter(AssetImporter): m_AssetBundleName: str m_AssetBundleVariant: str @@ -3250,7 +3487,8 @@ class MultiArtifactTestImporter(AssetImporter): m_UsedFileIDs: List[int] m_UserData: str -@define(kw_only=True, slots=False) + +@unitypy_define class NativeFormatImporter(AssetImporter): m_Name: str m_AssetBundleName: Optional[str] = None @@ -3263,7 +3501,8 @@ class NativeFormatImporter(AssetImporter): m_UsedFileIDs: Optional[List[int]] = None m_UserData: Optional[str] = None -@define(kw_only=True, slots=False) + +@unitypy_define class PVRImporter(AssetImporter): m_Name: str m_AssetBundleName: Optional[str] = None @@ -3273,7 +3512,8 @@ class PVRImporter(AssetImporter): m_OldHashIdentity: Optional[MdFour] = None m_UserData: Optional[str] = None -@define(kw_only=True, slots=False) + +@unitypy_define class PackageManifestImporter(AssetImporter): m_AssetBundleName: str m_AssetBundleVariant: str @@ -3282,7 +3522,8 @@ class PackageManifestImporter(AssetImporter): m_UsedFileIDs: List[int] m_UserData: str -@define(kw_only=True, slots=False) + +@unitypy_define class PluginImporter(AssetImporter): m_AssetBundleName: str m_AssetBundleVariant: str @@ -3291,7 +3532,10 @@ class PluginImporter(AssetImporter): m_IsPreloaded: bool m_Name: str m_Output: PluginImportOutput - m_PlatformData: Union[List[Tuple[str, PlatformSettingsData]], List[Tuple[Tuple[str, str], PlatformSettingsData]]] + m_PlatformData: Union[ + List[Tuple[str, PlatformSettingsData]], + List[Tuple[Tuple[str, str], PlatformSettingsData]], + ] m_UserData: str m_DefineConstraints: Optional[List[str]] = None m_ExternalObjects: Optional[List[Tuple[SourceAssetIdentifier, PPtr[Object]]]] = None @@ -3300,7 +3544,8 @@ class PluginImporter(AssetImporter): m_UsedFileIDs: Optional[List[int]] = None m_ValidateReferences: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class PrefabImporter(AssetImporter): m_AddedObjectFileIDs: List[int] m_AssetBundleName: str @@ -3313,7 +3558,8 @@ class PrefabImporter(AssetImporter): m_UsedFileIDs: Optional[List[int]] = None m_VariantParentGUID: Optional[GUID] = None -@define(kw_only=True, slots=False) + +@unitypy_define class PreviewImporter(AssetImporter): m_AssetBundleName: str m_AssetBundleVariant: str @@ -3322,7 +3568,8 @@ class PreviewImporter(AssetImporter): m_UsedFileIDs: List[int] m_UserData: str -@define(kw_only=True, slots=False) + +@unitypy_define class RayTracingShaderImporter(AssetImporter): m_AssetBundleName: str m_AssetBundleVariant: str @@ -3332,7 +3579,8 @@ class RayTracingShaderImporter(AssetImporter): m_UserData: str m_CurrentAPIMask: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class ReferencesArtifactGenerator(AssetImporter): m_AssetBundleName: str m_AssetBundleVariant: str @@ -3341,7 +3589,8 @@ class ReferencesArtifactGenerator(AssetImporter): m_UsedFileIDs: List[int] m_UserData: str -@define(kw_only=True, slots=False) + +@unitypy_define class RoslynAdditionalFileImporter(AssetImporter): m_AssetBundleName: str m_AssetBundleVariant: str @@ -3350,7 +3599,8 @@ class RoslynAdditionalFileImporter(AssetImporter): m_UsedFileIDs: List[int] m_UserData: str -@define(kw_only=True, slots=False) + +@unitypy_define class RoslynAnalyzerConfigImporter(AssetImporter): m_AssetBundleName: str m_AssetBundleVariant: str @@ -3359,7 +3609,8 @@ class RoslynAnalyzerConfigImporter(AssetImporter): m_UsedFileIDs: List[int] m_UserData: str -@define(kw_only=True, slots=False) + +@unitypy_define class RuleSetFileImporter(AssetImporter): m_AssetBundleName: str m_AssetBundleVariant: str @@ -3368,7 +3619,8 @@ class RuleSetFileImporter(AssetImporter): m_UsedFileIDs: List[int] m_UserData: str -@define(kw_only=True, slots=False) + +@unitypy_define class ScriptedImporter(AssetImporter): m_AssetBundleName: str m_AssetBundleVariant: str @@ -3380,7 +3632,8 @@ class ScriptedImporter(AssetImporter): m_InternalIDToNameTable: Optional[List[Tuple[Tuple[int, int], str]]] = None m_UsedFileIDs: Optional[List[int]] = None -@define(kw_only=True, slots=False) + +@unitypy_define class ShaderImporter(AssetImporter): m_Name: str m_AssetBundleName: Optional[str] = None @@ -3395,7 +3648,8 @@ class ShaderImporter(AssetImporter): m_UsedFileIDs: Optional[List[int]] = None m_UserData: Optional[str] = None -@define(kw_only=True, slots=False) + +@unitypy_define class ShaderIncludeImporter(AssetImporter): m_AssetBundleName: str m_AssetBundleVariant: str @@ -3404,7 +3658,8 @@ class ShaderIncludeImporter(AssetImporter): m_UsedFileIDs: List[int] m_UserData: str -@define(kw_only=True, slots=False) + +@unitypy_define class SpeedTreeImporter(AssetImporter): m_AlphaTestRef: float m_AssetBundleName: str @@ -3443,7 +3698,8 @@ class SpeedTreeImporter(AssetImporter): m_UnitConversionEnumValue: Optional[int] = None m_UsedFileIDs: Optional[List[int]] = None -@define(kw_only=True, slots=False) + +@unitypy_define class SpriteAtlasImporter(AssetImporter): m_AssetBundleName: str m_AssetBundleVariant: str @@ -3454,18 +3710,22 @@ class SpriteAtlasImporter(AssetImporter): m_BindAsDefault: Optional[bool] = None m_PackingSettings: Optional[PackingSettings] = None m_PlatformSettings: Optional[List[TextureImporterPlatformSettings]] = None - m_SecondaryTextureSettings: Optional[List[Tuple[str, SecondaryTextureSettings]]] = None + m_SecondaryTextureSettings: Optional[List[Tuple[str, SecondaryTextureSettings]]] = ( + None + ) m_TextureSettings: Optional[TextureSettings] = None m_VariantMultiplier: Optional[float] = None -@define(kw_only=True, slots=False) + +@unitypy_define class StyleSheetImporter(AssetImporter): m_AssetBundleName: str m_AssetBundleVariant: str m_Name: str m_UserData: str -@define(kw_only=True, slots=False) + +@unitypy_define class SubstanceImporter(AssetImporter): m_Name: str m_AssetBundleName: Optional[str] = None @@ -3481,7 +3741,8 @@ class SubstanceImporter(AssetImporter): m_UsedFileIDs: Optional[List[int]] = None m_UserData: Optional[str] = None -@define(kw_only=True, slots=False) + +@unitypy_define class TextScriptImporter(AssetImporter): m_Name: str m_AssetBundleName: Optional[str] = None @@ -3493,7 +3754,8 @@ class TextScriptImporter(AssetImporter): m_UsedFileIDs: Optional[List[int]] = None m_UserData: Optional[str] = None -@define(kw_only=True, slots=False) + +@unitypy_define class TextureImporter(AssetImporter): m_BorderMipMap: int m_ConvertToNormalMap: int @@ -3550,7 +3812,9 @@ class TextureImporter(AssetImporter): m_Output: Optional[TextureImportOutput] = None m_PSDRemoveMatte: Optional[bool] = None m_PSDShowRemoveMatteOption: Optional[bool] = None - m_PlatformSettings: Optional[Union[List[TextureImporterPlatformSettings], List[PlatformSettings]]] = None + m_PlatformSettings: Optional[ + Union[List[TextureImporterPlatformSettings], List[PlatformSettings]] + ] = None m_PushPullDilation: Optional[int] = None m_RGBM: Optional[int] = None m_RecommendedTextureFormat: Optional[int] = None @@ -3577,7 +3841,8 @@ class TextureImporter(AssetImporter): m_VTOnly: Optional[int] = None m_sRGBTexture: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class TrueTypeFontImporter(AssetImporter): m_FontNames: List[str] m_FontSize: int @@ -3607,7 +3872,8 @@ class TrueTypeFontImporter(AssetImporter): m_UsedFileIDs: Optional[List[int]] = None m_UserData: Optional[str] = None -@define(kw_only=True, slots=False) + +@unitypy_define class VideoClipImporter(AssetImporter): m_AssetBundleName: str m_AssetBundleVariant: str @@ -3621,7 +3887,10 @@ class VideoClipImporter(AssetImporter): m_Name: str m_Output: VideoClipImporterOutput m_StartFrame: int - m_TargetSettings: Union[List[Tuple[int, VideoClipImporterTargetSettings]], List[Tuple[str, VideoClipImporterTargetSettings]]] + m_TargetSettings: Union[ + List[Tuple[int, VideoClipImporterTargetSettings]], + List[Tuple[str, VideoClipImporterTargetSettings]], + ] m_UserData: str m_AudioImportMode: Optional[int] = None m_ExternalObjects: Optional[List[Tuple[SourceAssetIdentifier, PPtr[Object]]]] = None @@ -3641,7 +3910,8 @@ class VideoClipImporter(AssetImporter): m_UseLegacyImporter: Optional[bool] = None m_UsedFileIDs: Optional[List[int]] = None -@define(kw_only=True, slots=False) + +@unitypy_define class VisualEffectImporter(AssetImporter): m_AssetBundleName: str m_AssetBundleVariant: str @@ -3651,14 +3921,16 @@ class VisualEffectImporter(AssetImporter): m_Template: Optional[VFXTemplate] = None m_UsedFileIDs: Optional[List[int]] = None -@define(kw_only=True, slots=False) + +@unitypy_define class AudioContainerElement(NamedObject): m_AudioClip: PPtr[AudioClip] m_Enabled: bool m_Name: str m_Volume: float -@define(kw_only=True, slots=False) + +@unitypy_define class AudioMixer(NamedObject): m_EnableSuspend: bool m_MasterGroup: PPtr[AudioMixerGroup] @@ -3670,7 +3942,8 @@ class AudioMixer(NamedObject): m_SuspendThreshold: float m_UpdateMode: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class AudioMixerController(AudioMixer): m_EnableSuspend: bool m_MasterGroup: PPtr[AudioMixerGroup] @@ -3682,7 +3955,8 @@ class AudioMixerController(AudioMixer): m_SuspendThreshold: float m_UpdateMode: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class AudioMixerEffectController(NamedObject): m_Bypass: bool m_EffectID: GUID @@ -3693,37 +3967,43 @@ class AudioMixerEffectController(NamedObject): m_Parameters: List[Parameter] m_SendTarget: PPtr[AudioMixerEffectController] -@define(kw_only=True, slots=False) + +@unitypy_define class AudioMixerGroup(NamedObject): m_AudioMixer: PPtr[AudioMixer] m_Children: List[PPtr[AudioMixerGroup]] m_GroupID: GUID m_Name: str -@define(kw_only=True, slots=False) + +@unitypy_define class AudioMixerGroupController(AudioMixerGroup): m_AudioMixer: PPtr[AudioMixer] m_Children: List[PPtr[AudioMixerGroup]] m_GroupID: GUID m_Name: str -@define(kw_only=True, slots=False) + +@unitypy_define class AudioMixerSnapshot(NamedObject): m_AudioMixer: PPtr[AudioMixer] m_Name: str m_SnapshotID: GUID -@define(kw_only=True, slots=False) + +@unitypy_define class AudioMixerSnapshotController(AudioMixerSnapshot): m_AudioMixer: PPtr[AudioMixer] m_Name: str m_SnapshotID: GUID -@define(kw_only=True, slots=False) + +@unitypy_define class AudioResource(NamedObject): m_Name: str -@define(kw_only=True, slots=False) + +@unitypy_define class AudioRandomContainer(AudioResource): m_AutomaticTriggerMode: int m_AutomaticTriggerTime: float @@ -3745,11 +4025,13 @@ class AudioRandomContainer(AudioResource): m_VolumeRandomizationEnabled: bool m_VolumeRandomizationRange: Vector2f -@define(kw_only=True, slots=False) + +@unitypy_define class SampleClip(AudioResource): m_Name: str -@define(kw_only=True, slots=False) + +@unitypy_define class AudioClip(SampleClip): m_Name: str m_3D: Optional[bool] = None @@ -3772,7 +4054,8 @@ class AudioClip(SampleClip): m_Type: Optional[int] = None m_UseHardware: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class Avatar(NamedObject): m_Avatar: AvatarConstant m_AvatarSize: int @@ -3780,28 +4063,33 @@ class Avatar(NamedObject): m_TOS: List[Tuple[int, str]] m_HumanDescription: Optional[HumanDescription] = None -@define(kw_only=True, slots=False) + +@unitypy_define class AvatarMask(NamedObject): m_Elements: List[TransformMaskElement] m_Mask: List[int] m_Name: str -@define(kw_only=True, slots=False) + +@unitypy_define class AvatarSkeletonMask(NamedObject): elements: List[AvatarSkeletonMaskElement] m_Name: str -@define(kw_only=True, slots=False) + +@unitypy_define class BaseAnimationTrack(NamedObject, ABC): pass -@define(kw_only=True, slots=False) + +@unitypy_define class NewAnimationTrack(BaseAnimationTrack): m_ClassID: int m_Curves: List[Channel] m_Name: str -@define(kw_only=True, slots=False) + +@unitypy_define class BillboardAsset(NamedObject): bottom: float height: float @@ -3813,7 +4101,8 @@ class BillboardAsset(NamedObject): width: float rotated: Optional[List[int]] = None -@define(kw_only=True, slots=False) + +@unitypy_define class BuildReport(NamedObject): m_Appendices: List[PPtr[Object]] m_BuildSteps: List[BuildStepInfo] @@ -3821,33 +4110,40 @@ class BuildReport(NamedObject): m_Name: str m_Summary: BuildSummary -@define(kw_only=True, slots=False) + +@unitypy_define class CachedSpriteAtlas(NamedObject): frames: List[Tuple[Tuple[GUID, int], SpriteRenderData]] textures: List[PPtr[Texture2D]] alphaTextures: Optional[List[PPtr[Texture2D]]] = None -@define(kw_only=True, slots=False) + +@unitypy_define class CachedSpriteAtlasRuntimeData(NamedObject): alphaTextures: List[PPtr[Texture2D]] frames: List[Tuple[Tuple[GUID, int], SpriteAtlasData]] textures: List[PPtr[Texture2D]] currentPackingHash: Optional[Hash128] = None -@define(kw_only=True, slots=False) + +@unitypy_define class ComputeShader(NamedObject): m_Name: str constantBuffers: Optional[List[ComputeShaderCB]] = None kernels: Optional[List[ComputeShaderKernel]] = None - variants: Optional[Union[List[ComputeShaderVariant], List[ComputeShaderPlatformVariant]]] = None + variants: Optional[ + Union[List[ComputeShaderVariant], List[ComputeShaderPlatformVariant]] + ] = None + -@define(kw_only=True, slots=False) +@unitypy_define class DefaultAsset(NamedObject): m_Name: str m_IsWarning: Optional[bool] = None m_Message: Optional[str] = None -@define(kw_only=True, slots=False) + +@unitypy_define class BrokenPrefabAsset(DefaultAsset): m_BrokenParentPrefab: PPtr[BrokenPrefabAsset] m_IsPrefabFileValid: bool @@ -3856,17 +4152,20 @@ class BrokenPrefabAsset(DefaultAsset): m_Message: str m_Name: str -@define(kw_only=True, slots=False) + +@unitypy_define class SceneAsset(DefaultAsset): m_Name: str m_IsWarning: Optional[bool] = None m_Message: Optional[str] = None -@define(kw_only=True, slots=False) + +@unitypy_define class EditorProjectAccess(NamedObject): m_Name: str -@define(kw_only=True, slots=False) + +@unitypy_define class Flare(NamedObject): m_Elements: List[FlareElement] m_FlareTexture: PPtr[Texture] @@ -3874,7 +4173,8 @@ class Flare(NamedObject): m_TextureLayout: int m_UseFog: bool -@define(kw_only=True, slots=False) + +@unitypy_define class Font(NamedObject): m_Ascent: float m_AsciiStartOffset: int @@ -3904,11 +4204,13 @@ class Font(NamedObject): m_Tracking: Optional[float] = None m_UseLegacyBoundsCalculation: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class GameObjectRecorder(NamedObject): m_Name: str -@define(kw_only=True, slots=False) + +@unitypy_define class GraphicsStateCollection(NamedObject): m_DeviceRenderer: int m_Name: str @@ -3920,17 +4222,20 @@ class GraphicsStateCollection(NamedObject): m_Version: int m_VertexLayoutInfoMap: List[Tuple[int, VertexLayoutInfo]] -@define(kw_only=True, slots=False) + +@unitypy_define class HumanTemplate(NamedObject): m_BoneTemplate: List[Tuple[str, str]] m_Name: str -@define(kw_only=True, slots=False) + +@unitypy_define class ImportLog(NamedObject): m_Logs: List[ImportLog_ImportLogEntry] m_Name: str -@define(kw_only=True, slots=False) + +@unitypy_define class LightProbes(NamedObject): m_Name: str bakedCoefficients: Optional[List[LightmapData]] = None @@ -3942,7 +4247,8 @@ class LightProbes(NamedObject): m_HasBeenEdited: Optional[bool] = None tetrahedra: Optional[List[Tetrahedron]] = None -@define(kw_only=True, slots=False) + +@unitypy_define class LightingDataAsset(NamedObject): m_BakedAmbientProbeInLinear: SphericalHarmonicsL2 m_BakedReflectionProbeCubemaps: List[PPtr[Texture]] @@ -3966,11 +4272,13 @@ class LightingDataAsset(NamedObject): m_Scene: Optional[PPtr[SceneAsset]] = None m_SceneGUID: Optional[GUID] = None -@define(kw_only=True, slots=False) + +@unitypy_define class LightingDataAssetParent(NamedObject): m_Name: str -@define(kw_only=True, slots=False) + +@unitypy_define class LightingSettings(NamedObject): m_AlbedoBoost: float m_BounceScale: float @@ -4025,7 +4333,8 @@ class LightingSettings(NamedObject): m_TextureCompression: Optional[bool] = None m_TrainingDataDestination: Optional[str] = None -@define(kw_only=True, slots=False) + +@unitypy_define class LightmapParameters(NamedObject): AOAntiAliasingSamples: int AOQuality: int @@ -4047,14 +4356,16 @@ class LightmapParameters(NamedObject): maxLightmapCount: Optional[int] = None pushoff: Optional[float] = None -@define(kw_only=True, slots=False) + +@unitypy_define class LocalizationAsset(NamedObject): Editor_Asset: bool Locale_ISO_Code: str String_Table: List[Tuple[str, str]] m_Name: str -@define(kw_only=True, slots=False) + +@unitypy_define class Material(NamedObject): m_Name: str m_SavedProperties: UnityPropertySheet @@ -4070,7 +4381,8 @@ class Material(NamedObject): m_ValidKeywords: Optional[List[str]] = None stringTagMap: Optional[List[Tuple[str, str]]] = None -@define(kw_only=True, slots=False) + +@unitypy_define class ProceduralMaterial(Material): m_Name: str m_SavedProperties: UnityPropertySheet @@ -4099,7 +4411,8 @@ class ProceduralMaterial(Material): m_Width: Optional[int] = None stringTagMap: Optional[List[Tuple[str, str]]] = None -@define(kw_only=True, slots=False) + +@unitypy_define class Mesh(NamedObject): m_BindPose: List[Matrix4x4f] m_CompressedMesh: CompressedMesh @@ -4138,11 +4451,13 @@ class Mesh(NamedObject): m_VertexData: Optional[VertexData] = None m_Vertices: Optional[List[Vector3f]] = None -@define(kw_only=True, slots=False) + +@unitypy_define class Motion(NamedObject, ABC): pass -@define(kw_only=True, slots=False) + +@unitypy_define class AnimationClip(Motion): m_Bounds: AABB m_Compressed: bool @@ -4166,7 +4481,8 @@ class AnimationClip(Motion): m_PPtrCurves: Optional[List[PPtrCurve]] = None m_UseHighQualityCurve: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class PreviewAnimationClip(AnimationClip): m_Bounds: AABB m_ClipBindingConstant: AnimationClipBindingConstant @@ -4189,7 +4505,8 @@ class PreviewAnimationClip(AnimationClip): m_HasGenericRootTransform: Optional[bool] = None m_HasMotionFloatCurves: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class BlendTree(Motion): m_Childs: Union[List[Child], List[ChildMotion]] m_MaxThreshold: float @@ -4203,7 +4520,8 @@ class BlendTree(Motion): m_BlendType: Optional[int] = None m_NormalizedBlendValues: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class NavMeshData(NamedObject): m_HeightMeshes: List[HeightMeshData] m_Heightmaps: List[HeightmapData] @@ -4217,17 +4535,20 @@ class NavMeshData(NamedObject): m_Rotation: Optional[Quaternionf] = None m_SourceBounds: Optional[AABB] = None -@define(kw_only=True, slots=False) + +@unitypy_define class NavMeshObsolete(NamedObject): m_Name: str -@define(kw_only=True, slots=False) + +@unitypy_define class OcclusionCullingData(NamedObject): m_Name: str m_PVSData: List[int] m_Scenes: List[OcclusionScene] -@define(kw_only=True, slots=False) + +@unitypy_define class PhysicsMaterial(NamedObject): m_Name: str bounceCombine: Optional[int] = None @@ -4241,7 +4562,8 @@ class PhysicsMaterial(NamedObject): m_StaticFriction: Optional[float] = None staticFriction: Optional[float] = None -@define(kw_only=True, slots=False) + +@unitypy_define class PhysicsMaterial2D(NamedObject): bounciness: float friction: float @@ -4249,14 +4571,16 @@ class PhysicsMaterial2D(NamedObject): m_BounceCombine: Optional[int] = None m_FrictionCombine: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class PreloadData(NamedObject): m_Assets: List[PPtr[Object]] m_Name: str m_Dependencies: Optional[List[str]] = None m_ExplicitDataLayout: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class Preset(NamedObject): m_Name: str m_Properties: List[PropertyModification] @@ -4265,22 +4589,26 @@ class Preset(NamedObject): m_CoupledType: Optional[PresetType] = None m_ExcludedProperties: Optional[List[str]] = None -@define(kw_only=True, slots=False) + +@unitypy_define class RayTracingShader(NamedObject): m_MaxRecursionDepth: int m_Name: str variants: List[RayTracingShaderVariant] m_EnableRayPayloadSizeChecks: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class RoslynAdditionalFileAsset(NamedObject): m_Name: str -@define(kw_only=True, slots=False) + +@unitypy_define class RoslynAnalyzerConfigAsset(NamedObject): m_Name: str -@define(kw_only=True, slots=False) + +@unitypy_define class RuntimeAnimatorController(NamedObject): m_AnimationClips: List[PPtr[AnimationClip]] m_Controller: ControllerConstant @@ -4288,7 +4616,8 @@ class RuntimeAnimatorController(NamedObject): m_Name: str m_TOS: List[Tuple[int, str]] -@define(kw_only=True, slots=False) + +@unitypy_define class AnimatorController(RuntimeAnimatorController): m_AnimationClips: List[PPtr[AnimationClip]] m_Controller: ControllerConstant @@ -4296,16 +4625,20 @@ class AnimatorController(RuntimeAnimatorController): m_Name: str m_TOS: List[Tuple[int, str]] m_MultiThreadedStateMachine: Optional[bool] = None - m_StateMachineBehaviourVectorDescription: Optional[StateMachineBehaviourVectorDescription] = None + m_StateMachineBehaviourVectorDescription: Optional[ + StateMachineBehaviourVectorDescription + ] = None m_StateMachineBehaviours: Optional[List[PPtr[MonoBehaviour]]] = None -@define(kw_only=True, slots=False) + +@unitypy_define class AnimatorOverrideController(RuntimeAnimatorController): m_Clips: List[AnimationClipOverride] m_Controller: PPtr[RuntimeAnimatorController] m_Name: str -@define(kw_only=True, slots=False) + +@unitypy_define class Shader(NamedObject): m_Name: str compressedBlob: Optional[List[int]] = None @@ -4324,12 +4657,14 @@ class Shader(NamedObject): platforms: Optional[List[int]] = None stageCounts: Optional[List[int]] = None -@define(kw_only=True, slots=False) + +@unitypy_define class ShaderVariantCollection(NamedObject): m_Name: str m_Shaders: List[Tuple[PPtr[Shader], ShaderInfo]] -@define(kw_only=True, slots=False) + +@unitypy_define class SpeedTreeWindAsset(NamedObject): m_Name: str m_Config8: Optional[SpeedTreeWindConfig8] = None @@ -4337,7 +4672,8 @@ class SpeedTreeWindAsset(NamedObject): m_Wind: Optional[SpeedTreeWind] = None m_eVersion: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class Sprite(NamedObject): m_Extrude: int m_Name: str @@ -4355,7 +4691,8 @@ class Sprite(NamedObject): m_ScriptableObjects: Optional[List[PPtr[MonoBehaviour]]] = None m_SpriteAtlas: Optional[PPtr[SpriteAtlas]] = None -@define(kw_only=True, slots=False) + +@unitypy_define class SpriteAtlas(NamedObject): m_IsVariant: bool m_Name: str @@ -4364,7 +4701,8 @@ class SpriteAtlas(NamedObject): m_RenderDataMap: List[Tuple[Tuple[GUID, int], SpriteAtlasData]] m_Tag: str -@define(kw_only=True, slots=False) + +@unitypy_define class SpriteAtlasAsset(NamedObject): m_ImporterData: Union[SpriteAtlasEditorData, SpriteAtlasAssetData] m_IsVariant: bool @@ -4372,12 +4710,14 @@ class SpriteAtlasAsset(NamedObject): m_Name: str m_ScriptablePacker: Optional[PPtr[Object]] = None -@define(kw_only=True, slots=False) + +@unitypy_define class SubstanceArchive(NamedObject): m_Name: str m_PackageData: Optional[List[int]] = None -@define(kw_only=True, slots=False) + +@unitypy_define class TerrainData(NamedObject): m_DetailDatabase: DetailDatabase m_Heightmap: Heightmap @@ -4385,7 +4725,8 @@ class TerrainData(NamedObject): m_SplatDatabase: SplatDatabase m_PreloadShaders: Optional[List[PPtr[Shader]]] = None -@define(kw_only=True, slots=False) + +@unitypy_define class TerrainLayer(NamedObject): m_DiffuseRemapMax: Vector4f m_DiffuseRemapMin: Vector4f @@ -4403,23 +4744,27 @@ class TerrainLayer(NamedObject): m_TileSize: Vector2f m_SmoothnessSource: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class TextAsset(NamedObject): m_Name: str m_Script: str m_PathName: Optional[str] = None -@define(kw_only=True, slots=False) + +@unitypy_define class AssemblyDefinitionAsset(TextAsset): m_Name: str m_Script: str -@define(kw_only=True, slots=False) + +@unitypy_define class AssemblyDefinitionReferenceAsset(TextAsset): m_Name: str m_Script: str -@define(kw_only=True, slots=False) + +@unitypy_define class MonoScript(TextAsset): m_AssemblyName: str m_ClassName: str @@ -4429,37 +4774,44 @@ class MonoScript(TextAsset): m_PropertiesHash: Union[Hash128, int] m_IsEditorScript: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class PackageManifest(TextAsset): m_Name: str m_Script: str -@define(kw_only=True, slots=False) + +@unitypy_define class RuleSetFileAsset(TextAsset): m_Name: str m_Script: str -@define(kw_only=True, slots=False) + +@unitypy_define class ShaderInclude(TextAsset): m_Name: str m_Script: Optional[str] = None -@define(kw_only=True, slots=False) + +@unitypy_define class Texture(NamedObject, ABC): pass -@define(kw_only=True, slots=False) + +@unitypy_define class BaseVideoTexture(Texture, ABC): pass -@define(kw_only=True, slots=False) + +@unitypy_define class WebCamTexture(BaseVideoTexture): m_Name: str m_DownscaleFallback: Optional[bool] = None m_ForcedFallbackFormat: Optional[int] = None m_IsAlphaChannelOptional: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class CubemapArray(Texture): image_data: bytes m_ColorSpace: int @@ -4477,14 +4829,16 @@ class CubemapArray(Texture): m_StreamData: Optional[StreamingInfo] = None m_UsageMode: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class LowerResBlitTexture(Texture): m_Name: str m_DownscaleFallback: Optional[bool] = None m_ForcedFallbackFormat: Optional[int] = None m_IsAlphaChannelOptional: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class MovieTexture(Texture): m_Name: str m_AudioClip: Optional[PPtr[AudioClip]] = None @@ -4495,7 +4849,8 @@ class MovieTexture(Texture): m_Loop: Optional[bool] = None m_MovieData: Optional[List[int]] = None -@define(kw_only=True, slots=False) + +@unitypy_define class ProceduralTexture(Texture): m_Name: str AlphaSource: Optional[int] = None @@ -4517,7 +4872,8 @@ class ProceduralTexture(Texture): m_TextureParameters: Optional[TextureParameters] = None m_TextureSettings: Optional[GLTextureSettings] = None -@define(kw_only=True, slots=False) + +@unitypy_define class RenderTexture(Texture): m_ColorFormat: int m_Height: int @@ -4545,7 +4901,8 @@ class RenderTexture(Texture): m_UseDynamicScaleExplicit: Optional[bool] = None m_VolumeDepth: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class CustomRenderTexture(RenderTexture): m_AntiAliasing: int m_ColorFormat: int @@ -4586,7 +4943,8 @@ class CustomRenderTexture(RenderTexture): m_UseDynamicScale: Optional[bool] = None m_UseDynamicScaleExplicit: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class SparseTexture(Texture): m_ColorSpace: int m_Format: int @@ -4599,7 +4957,8 @@ class SparseTexture(Texture): m_ForcedFallbackFormat: Optional[int] = None m_IsAlphaChannelOptional: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class Texture2D(Texture): image_data: bytes m_CompleteImageSize: int @@ -4629,7 +4988,8 @@ class Texture2D(Texture): m_StreamingMipmaps: Optional[bool] = None m_StreamingMipmapsPriority: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class Cubemap(Texture2D): image_data: bytes m_CompleteImageSize: int @@ -4660,7 +5020,8 @@ class Cubemap(Texture2D): m_StreamingMipmaps: Optional[bool] = None m_StreamingMipmapsPriority: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class Texture2DArray(Texture): image_data: bytes m_ColorSpace: int @@ -4682,7 +5043,8 @@ class Texture2DArray(Texture): m_StreamData: Optional[StreamingInfo] = None m_UsageMode: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class Texture3D(Texture): image_data: bytes m_Height: int @@ -4708,7 +5070,8 @@ class Texture3D(Texture): m_TextureFormat: Optional[int] = None m_UsageMode: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class VideoClip(NamedObject): Height: int Width: int @@ -4729,29 +5092,35 @@ class VideoClip(NamedObject): m_VideoShaders: Optional[List[PPtr[Shader]]] = None m_sRGB: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class VisualEffectObject(NamedObject, ABC): pass -@define(kw_only=True, slots=False) + +@unitypy_define class VisualEffectAsset(VisualEffectObject): m_Infos: VisualEffectInfo m_Name: str m_Systems: List[VFXSystemDesc] -@define(kw_only=True, slots=False) + +@unitypy_define class VisualEffectSubgraph(VisualEffectObject, ABC): pass -@define(kw_only=True, slots=False) + +@unitypy_define class VisualEffectSubgraphBlock(VisualEffectSubgraph): m_Name: str -@define(kw_only=True, slots=False) + +@unitypy_define class VisualEffectSubgraphOperator(VisualEffectSubgraph): m_Name: str -@define(kw_only=True, slots=False) + +@unitypy_define class VisualEffectResource(NamedObject): m_Graph: PPtr[MonoBehaviour] m_Infos: Union[VisualEffectSettings, VisualEffectInfo] @@ -4759,7 +5128,8 @@ class VisualEffectResource(NamedObject): m_ShaderSources: Optional[List[VFXShaderSourceDesc]] = None m_Systems: Optional[List[VFXEditorSystemDesc]] = None -@define(kw_only=True, slots=False) + +@unitypy_define class EditorExtensionImpl(Object): gFlattenedTypeTree: Optional[List[int]] = None m_DataTemplate: Optional[PPtr[DataTemplate]] = None @@ -4767,7 +5137,8 @@ class EditorExtensionImpl(Object): m_OverrideVariable: Optional[bitset] = None m_TemplateFather: Optional[PPtr[EditorExtensionImpl]] = None -@define(kw_only=True, slots=False) + +@unitypy_define class EditorSettings(Object): m_AssetNamingUsesSpace: Optional[bool] = None m_AssetPipelineMode: Optional[int] = None @@ -4821,7 +5192,8 @@ class EditorSettings(Object): m_WebSecurityEmulationEnabled: Optional[int] = None m_WebSecurityEmulationHostUrl: Optional[str] = None -@define(kw_only=True, slots=False) + +@unitypy_define class EditorUserBuildSettings(Object): m_ActiveBuildTarget: int m_AllowDebugging: bool @@ -4967,7 +5339,8 @@ class EditorUserBuildSettings(Object): m_XboxOneUsername: Optional[str] = None m_macosXcodeBuildConfig: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class EditorUserSettings(Object): m_VCAutomaticAdd: bool m_VCDebugCmd: bool @@ -4998,27 +5371,33 @@ class EditorUserSettings(Object): m_VCUserName: Optional[str] = None m_VCWorkspace: Optional[str] = None -@define(kw_only=True, slots=False) + +@unitypy_define class EmptyObject(Object): pass -@define(kw_only=True, slots=False) + +@unitypy_define class GUIDSerializer(Object): guidToPath: List[Tuple[GUID, str]] -@define(kw_only=True, slots=False) + +@unitypy_define class GameManager(Object, ABC): pass -@define(kw_only=True, slots=False) + +@unitypy_define class GlobalGameManager(GameManager, ABC): pass -@define(kw_only=True, slots=False) + +@unitypy_define class AnimationManager(GlobalGameManager): pass -@define(kw_only=True, slots=False) + +@unitypy_define class AudioManager(GlobalGameManager): Default_Speaker_Mode: int Doppler_Factor: float @@ -5035,7 +5414,8 @@ class AudioManager(GlobalGameManager): m_VirtualVoiceCount: Optional[int] = None m_VirtualizeEffects: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class BuildSettings(GlobalGameManager): enableDynamicBatching: bool hasAdvancedVersion: bool @@ -5063,28 +5443,35 @@ class BuildSettings(GlobalGameManager): m_AuthToken: Optional[str] = None m_GraphicsAPIs: Optional[List[int]] = None preloadedPlugins: Optional[List[str]] = None - runtimeClassHashes: Optional[Union[List[Tuple[int, int]], List[Tuple[int, Hash128]]]] = None + runtimeClassHashes: Optional[ + Union[List[Tuple[int, int]], List[Tuple[int, Hash128]]] + ] = None scenes: Optional[List[str]] = None scriptHashes: Optional[List[Tuple[Hash128, Hash128]]] = None usesOnMouseEvents: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class CloudWebServicesManager(GlobalGameManager): pass -@define(kw_only=True, slots=False) + +@unitypy_define class ClusterInputManager(GlobalGameManager): m_Inputs: List[ClusterInput] -@define(kw_only=True, slots=False) + +@unitypy_define class CrashReportManager(GlobalGameManager): pass -@define(kw_only=True, slots=False) + +@unitypy_define class DelayedCallManager(GlobalGameManager): pass -@define(kw_only=True, slots=False) + +@unitypy_define class GraphicsSettings(GlobalGameManager): m_AlwaysIncludedShaders: List[PPtr[Shader]] m_AllowEnlightenSupportForUpgradedProject: Optional[bool] = None @@ -5122,16 +5509,19 @@ class GraphicsSettings(GlobalGameManager): m_TransparencySortMode: Optional[int] = None m_VideoShadersIncludeMode: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class InputManager(GlobalGameManager): m_Axes: List[InputAxis] m_UsePhysicalKeys: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class MasterServerInterface(GlobalGameManager): pass -@define(kw_only=True, slots=False) + +@unitypy_define class MonoManager(GlobalGameManager): m_Scripts: List[PPtr[MonoScript]] m_AssemblyNames: Optional[List[str]] = None @@ -5139,33 +5529,39 @@ class MonoManager(GlobalGameManager): m_RuntimeClassHashes: Optional[List[Tuple[int, Hash128]]] = None m_ScriptHashes: Optional[List[Tuple[Hash128, Hash128]]] = None -@define(kw_only=True, slots=False) + +@unitypy_define class MultiplayerManager(GlobalGameManager): m_ActiveMultiplayerRole: Optional[int] = None m_ActiveMultiplayerRoles: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class NavMeshProjectSettings(GlobalGameManager): areas: List[NavMeshAreaData] m_LastAgentTypeID: Optional[int] = None m_SettingNames: Optional[List[str]] = None m_Settings: Optional[List[NavMeshBuildSettings]] = None -@define(kw_only=True, slots=False) + +@unitypy_define class NetworkManager(GlobalGameManager): m_AssetToPrefab: List[Tuple[GUID, PPtr[GameObject]]] m_DebugLevel: int m_Sendrate: float -@define(kw_only=True, slots=False) + +@unitypy_define class NotificationManager(GlobalGameManager): pass -@define(kw_only=True, slots=False) + +@unitypy_define class PerformanceReportingManager(GlobalGameManager): pass -@define(kw_only=True, slots=False) + +@unitypy_define class Physics2DSettings(GlobalGameManager): m_DefaultMaterial: PPtr[PhysicsMaterial2D] m_Gravity: Vector2f @@ -5204,7 +5600,8 @@ class Physics2DSettings(GlobalGameManager): m_UseSubStepping: Optional[bool] = None m_VelocityThreshold: Optional[float] = None -@define(kw_only=True, slots=False) + +@unitypy_define class PhysicsManager(GlobalGameManager): m_BounceThreshold: float m_DefaultMaterial: Union[PPtr[PhysicMaterial], PPtr[PhysicsMaterial]] @@ -5251,7 +5648,8 @@ class PhysicsManager(GlobalGameManager): m_WorldBounds: Optional[AABB] = None m_WorldSubdivisions: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class PlayerSettings(GlobalGameManager): AndroidProfiler: bool allowedAutorotateToLandscapeLeft: bool @@ -5500,7 +5898,8 @@ class PlayerSettings(GlobalGameManager): xboxSkinOnGPU: Optional[bool] = None xboxSpeechDB: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class QualitySettings(GlobalGameManager): Beautiful: Optional[QualitySetting] = None Fantastic: Optional[QualitySetting] = None @@ -5517,12 +5916,14 @@ class QualitySettings(GlobalGameManager): m_StrippedMaximumLODLevel: Optional[int] = None m_TextureMipmapLimitGroupNames: Optional[List[str]] = None -@define(kw_only=True, slots=False) + +@unitypy_define class ResourceManager(GlobalGameManager): m_Container: List[Tuple[str, PPtr[Object]]] m_DependentAssets: Optional[List[ResourceManager_Dependency]] = None -@define(kw_only=True, slots=False) + +@unitypy_define class RuntimeInitializeOnLoadManager(GlobalGameManager): m_AfterAssembliesLoadedMethodExecutionOrders: Optional[List[int]] = None m_AfterAssembliesLoadedUnityMethodExecutionOrders: Optional[List[int]] = None @@ -5541,16 +5942,19 @@ class RuntimeInitializeOnLoadManager(GlobalGameManager): m_SubsystemRegistrationUnityMethodExecutionOrders: Optional[List[int]] = None m_UnityMethodExecutionOrders: Optional[List[int]] = None -@define(kw_only=True, slots=False) + +@unitypy_define class ShaderNameRegistry(GlobalGameManager): m_PreloadShaders: bool m_Shaders: NameToObjectMap -@define(kw_only=True, slots=False) + +@unitypy_define class StreamingManager(GlobalGameManager): pass -@define(kw_only=True, slots=False) + +@unitypy_define class TagManager(GlobalGameManager): tags: List[str] Builtin_Layer_0: Optional[str] = None @@ -5589,18 +5993,21 @@ class TagManager(GlobalGameManager): m_RenderingLayers: Optional[List[str]] = None m_SortingLayers: Optional[List[SortingLayerEntry]] = None -@define(kw_only=True, slots=False) + +@unitypy_define class TimeManager(GlobalGameManager): Fixed_Timestep: Union[RationalTime, float] Maximum_Allowed_Timestep: float m_TimeScale: float Maximum_Particle_Timestep: Optional[float] = None -@define(kw_only=True, slots=False) + +@unitypy_define class UnityAdsManager(GlobalGameManager): pass -@define(kw_only=True, slots=False) + +@unitypy_define class UnityAnalyticsManager(GlobalGameManager): m_Enabled: Optional[bool] = None m_InitializeOnStartup: Optional[bool] = None @@ -5608,7 +6015,8 @@ class UnityAnalyticsManager(GlobalGameManager): m_TestEventUrl: Optional[str] = None m_TestMode: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class UnityConnectSettings(GlobalGameManager): UnityAnalyticsSettings: UnityAnalyticsSettings UnityPurchasingSettings: UnityPurchasingSettings @@ -5625,7 +6033,8 @@ class UnityConnectSettings(GlobalGameManager): m_TestInitMode: Optional[int] = None m_TestMode: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class VFXManager(GlobalGameManager): m_CopyBufferShader: PPtr[ComputeShader] m_FixedTimeStep: float @@ -5642,15 +6051,18 @@ class VFXManager(GlobalGameManager): m_RuntimeVersion: Optional[int] = None m_StripUpdateShader: Optional[PPtr[ComputeShader]] = None -@define(kw_only=True, slots=False) + +@unitypy_define class LevelGameManager(GameManager, ABC): pass -@define(kw_only=True, slots=False) + +@unitypy_define class HaloManager(LevelGameManager): pass -@define(kw_only=True, slots=False) + +@unitypy_define class LightmapSettings(LevelGameManager): m_Lightmaps: List[LightmapData] m_LightmapsMode: int @@ -5664,19 +6076,22 @@ class LightmapSettings(LevelGameManager): m_UseDualLightmapsInForward: Optional[bool] = None m_UseShadowmask: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class NavMeshSettings(LevelGameManager): m_NavMesh: Optional[PPtr[NavMesh]] = None m_NavMeshData: Optional[PPtr[NavMeshData]] = None -@define(kw_only=True, slots=False) + +@unitypy_define class OcclusionCullingSettings(LevelGameManager): m_OcclusionCullingData: PPtr[OcclusionCullingData] m_Portals: List[PPtr[OcclusionPortal]] m_SceneGUID: GUID m_StaticRenderers: List[PPtr[Renderer]] -@define(kw_only=True, slots=False) + +@unitypy_define class RenderSettings(LevelGameManager): m_FlareStrength: float m_Fog: bool @@ -5709,7 +6124,8 @@ class RenderSettings(LevelGameManager): m_Sun: Optional[PPtr[Light]] = None m_UseRadianceAmbientProbe: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class HierarchyState(Object): expanded: List[PPtr[Object]] selection: List[PPtr[Object]] @@ -5718,43 +6134,52 @@ class HierarchyState(Object): scrollposition_y: Optional[float] = None scrollposition_y: Optional[float] = None -@define(kw_only=True, slots=False) + +@unitypy_define class InspectorExpandedState(Object): m_ExpandedData: List[ExpandedData] -@define(kw_only=True, slots=False) + +@unitypy_define class MarshallingTestObject(Object): m_Prop: int -@define(kw_only=True, slots=False) + +@unitypy_define class MemorySettings(Object): pass -@define(kw_only=True, slots=False) + +@unitypy_define class NScreenBridge(Object): pass -@define(kw_only=True, slots=False) + +@unitypy_define class NativeObjectType(Object): m_Inner: NativeType -@define(kw_only=True, slots=False) + +@unitypy_define class PackedAssets(Object): m_Contents: List[BuildReportPackedAssetInfo] m_Overhead: int m_ShortPath: str m_File: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class PlatformModuleSetup(Object): modules: List[Module] -@define(kw_only=True, slots=False) + +@unitypy_define class PluginBuildInfo(Object): m_EditorPlugins: List[str] m_RuntimePlugins: List[str] -@define(kw_only=True, slots=False) + +@unitypy_define class Prefab(Object): m_RootGameObject: PPtr[GameObject] m_ContainsMissingSerializeReferenceTypes: Optional[bool] = None @@ -5766,18 +6191,21 @@ class Prefab(Object): m_ParentPrefab: Optional[PPtr[Prefab]] = None m_SourcePrefab: Optional[PPtr[Prefab]] = None -@define(kw_only=True, slots=False) + +@unitypy_define class PrefabInstance(Object): m_Modification: PrefabModification m_RootGameObject: PPtr[GameObject] m_SourcePrefab: PPtr[Prefab] -@define(kw_only=True, slots=False) + +@unitypy_define class PresetManager(Object): m_DefaultList: Optional[List[DefaultPresetList]] = None m_DefaultPresets: Optional[List[Tuple[PresetType, List[DefaultPreset]]]] = None -@define(kw_only=True, slots=False) + +@unitypy_define class PropertyModificationsTargetTestObject(Object): m_Array: List[PropertyModificationsTargetTestNativeObject] m_Data: PropertyModificationsTargetTestNativeObject @@ -5787,15 +6215,18 @@ class PropertyModificationsTargetTestObject(Object): m_BytesSize: Optional[int] = None m_Floats: Optional[List[float]] = None -@define(kw_only=True, slots=False) + +@unitypy_define class RenderPassAttachment(Object): pass -@define(kw_only=True, slots=False) + +@unitypy_define class SceneRoots(Object): m_Roots: List[PPtr[Object]] -@define(kw_only=True, slots=False) + +@unitypy_define class SceneVisibilityState(Object): m_IsolationMode: Optional[bool] = None m_MainStageIsolated: Optional[bool] = None @@ -5805,99 +6236,119 @@ class SceneVisibilityState(Object): m_SceneVisibilityData: Optional[SceneDataContainer] = None m_SceneVisibilityDataIsolated: Optional[SceneDataContainer] = None -@define(kw_only=True, slots=False) + +@unitypy_define class ScenesUsingAssets(Object): m_ListOfScenesUsingEachAsset: List[Tuple[str, List[str]]] m_ScenesUsingAssets: List[BuildReportScenesUsingAsset] -@define(kw_only=True, slots=False) + +@unitypy_define class SerializableManagedHost(Object): m_Script: PPtr[MonoScript] -@define(kw_only=True, slots=False) + +@unitypy_define class SerializableManagedRefTestClass(Object): m_Script: PPtr[MonoScript] -@define(kw_only=True, slots=False) + +@unitypy_define class ShaderContainer(Object): pass -@define(kw_only=True, slots=False) + +@unitypy_define class SiblingDerived(Object): pass -@define(kw_only=True, slots=False) + +@unitypy_define class SpriteAtlasDatabase(Object): pass -@define(kw_only=True, slots=False) + +@unitypy_define class TestObjectVectorPairStringBool(Object): m_Map: List[Tuple[str, bool]] m_String: str -@define(kw_only=True, slots=False) + +@unitypy_define class TestObjectWithSerializedAnimationCurve(Object): m_Curve: AnimationCurve -@define(kw_only=True, slots=False) + +@unitypy_define class TestObjectWithSerializedArray(Object): m_ClampTestValue: float m_IntegerArray: List[int] -@define(kw_only=True, slots=False) + +@unitypy_define class TestObjectWithSerializedMapStringBool(Object): m_Map: List[Tuple[str, bool]] m_String: str -@define(kw_only=True, slots=False) + +@unitypy_define class TestObjectWithSerializedMapStringNonAlignedStruct(Object): m_Map: List[Tuple[str, NonAlignedStruct]] m_String: str -@define(kw_only=True, slots=False) + +@unitypy_define class TestObjectWithSpecialLayoutOne(Object): differentLayout: LayoutDataOne sameLayout: LayoutDataOne -@define(kw_only=True, slots=False) + +@unitypy_define class TestObjectWithSpecialLayoutTwo(Object): differentLayout: LayoutDataTwo sameLayout: LayoutDataThree -@define(kw_only=True, slots=False) + +@unitypy_define class TilemapEditorUserSettings(Object): m_FocusMode: int m_LastUsedPalette: PPtr[GameObject] -@define(kw_only=True, slots=False) + +@unitypy_define class VersionControlSettings(Object): m_Mode: str m_CollabEditorSettings: Optional[CollabEditorSettings] = None m_TrackPackagesOutsideProject: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class VideoBuildInfo(Object): m_IsVideoModuleDisabled: bool m_VideoClipCount: int -@define(kw_only=True, slots=False) + +@unitypy_define class AABB: m_Center: Vector3f m_Extent: Vector3f -@define(kw_only=True, slots=False) + +@unitypy_define class AddedComponent: addedObject: PPtr[Component] insertIndex: int targetCorrespondingSourceObject: PPtr[GameObject] -@define(kw_only=True, slots=False) + +@unitypy_define class AddedGameObject: addedObject: PPtr[Transform] insertIndex: int targetCorrespondingSourceObject: PPtr[Transform] -@define(kw_only=True, slots=False) + +@unitypy_define class AndroidDeviceFilterData: androidOsVersionString: str brandName: str @@ -5907,24 +6358,28 @@ class AndroidDeviceFilterData: vendorName: str vulkanApiVersionString: str -@define(kw_only=True, slots=False) + +@unitypy_define class AnimationClipBindingConstant: genericBindings: List[GenericBinding] pptrCurveMapping: List[PPtr[Object]] -@define(kw_only=True, slots=False) + +@unitypy_define class AnimationClipOverride: m_OriginalClip: PPtr[AnimationClip] m_OverrideClip: PPtr[AnimationClip] -@define(kw_only=True, slots=False) + +@unitypy_define class AnimationCurve: m_Curve: List[Keyframe] m_PostInfinity: int m_PreInfinity: int m_RotationOrder: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class AnimationEvent: data: str floatParameter: float @@ -5934,13 +6389,15 @@ class AnimationEvent: objectReferenceParameter: PPtr[Object] time: float -@define(kw_only=True, slots=False) + +@unitypy_define class AnimatorCondition: m_ConditionEvent: str m_ConditionMode: int m_EventTreshold: float -@define(kw_only=True, slots=False) + +@unitypy_define class Annotation: m_ClassID: int m_Flags: int @@ -5948,7 +6405,8 @@ class Annotation: m_IconEnabled: bool m_ScriptClass: str -@define(kw_only=True, slots=False) + +@unitypy_define class ArticulationDrive: damping: float forceLimit: float @@ -5959,7 +6417,8 @@ class ArticulationDrive: upperLimit: float driveType: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class AspectRatios: Others: bool x16_10: bool @@ -5967,13 +6426,15 @@ class AspectRatios: x4_3: bool x5_4: bool -@define(kw_only=True, slots=False) + +@unitypy_define class AssemblyJsonAsset(TextAsset): m_Name: str m_Script: str m_PathName: Optional[str] = None -@define(kw_only=True, slots=False) + +@unitypy_define class AssemblyJsonImporter(AssetImporter): m_AssetBundleName: str m_AssetBundleVariant: str @@ -5981,7 +6442,8 @@ class AssemblyJsonImporter(AssetImporter): m_UserData: str m_ExternalObjects: Optional[List[Tuple[SourceAssetIdentifier, PPtr[Object]]]] = None -@define(kw_only=True, slots=False) + +@unitypy_define class Asset: children: List[GUID] labels: AssetLabels @@ -5991,7 +6453,9 @@ class Asset: type: int assetBundleIndex: Optional[int] = None digest: Optional[MdFour] = None - guidOfPathLocationDependencies: Optional[Union[List[Tuple[str, GUID]], List[Tuple[GUID, str]]]] = None + guidOfPathLocationDependencies: Optional[ + Union[List[Tuple[str, GUID]], List[Tuple[GUID, str]]] + ] = None hash: Optional[Union[Hash128, MdFour]] = None hashOfImportedAssetDependencies: Optional[List[GUID]] = None hashOfSourceAssetDependencies: Optional[List[GUID]] = None @@ -6003,24 +6467,28 @@ class Asset: modificationDate_1_: Optional[int] = None scriptedImporterClassID: Optional[str] = None -@define(kw_only=True, slots=False) + +@unitypy_define class AssetBundleFullName: m_AssetBundleName: str m_AssetBundleVariant: str -@define(kw_only=True, slots=False) + +@unitypy_define class AssetBundleInfo: AssetBundleDependencies: List[int] AssetBundleHash: Hash128 -@define(kw_only=True, slots=False) + +@unitypy_define class AssetBundleScriptInfo: assemblyName: str className: str hash: int nameSpace: str -@define(kw_only=True, slots=False) + +@unitypy_define class AssetDatabase(Object): m_Assets: List[Tuple[GUID, Asset]] m_AssetBundleNames: Optional[List[Tuple[int, AssetBundleFullName]]] = None @@ -6029,23 +6497,27 @@ class AssetDatabase(Object): m_UnityShadersVersion: Optional[int] = None m_lastValidVersionHashes: Optional[List[Tuple[int, int]]] = None -@define(kw_only=True, slots=False) + +@unitypy_define class AssetDatabaseMetrics: totalAssetCount: int nonProAssetCount: Optional[int] = None nonProAssetsCreatedAfterProLicense: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class AssetImporterHashKey: ScriptClass: str type: int -@define(kw_only=True, slots=False) + +@unitypy_define class AssetImporterLog(NamedObject): m_Logs: List[AssetImporter_ImportError] m_Name: str -@define(kw_only=True, slots=False) + +@unitypy_define class AssetImporter_ImportError: error: str file: str @@ -6053,34 +6525,40 @@ class AssetImporter_ImportError: mode: int object: PPtr[Object] -@define(kw_only=True, slots=False) + +@unitypy_define class AssetInfo: asset: PPtr[Object] preloadIndex: int preloadSize: int -@define(kw_only=True, slots=False) + +@unitypy_define class AssetLabels: m_Labels: List[str] -@define(kw_only=True, slots=False) + +@unitypy_define class AssetTimeStamp: metaModificationDate_0_: int metaModificationDate_1_: int modificationDate_0_: int modificationDate_1_: int -@define(kw_only=True, slots=False) + +@unitypy_define class AttachmentIndexArray: activeAttachments: int attachments: List[int] -@define(kw_only=True, slots=False) + +@unitypy_define class AttachmentInfo: format: int needsResolve: bool -@define(kw_only=True, slots=False) + +@unitypy_define class AudioImporterOutput: editorOutputContainerFormat: int editorOutputSettings: SampleSettings @@ -6088,7 +6566,8 @@ class AudioImporterOutput: outputSettings: SampleSettings playerResource: Optional[StreamedResource] = None -@define(kw_only=True, slots=False) + +@unitypy_define class AudioMixerConstant: effectGUIDs: List[GUID] effects: List[EffectConstant] @@ -6104,15 +6583,18 @@ class AudioMixerConstant: snapshots: List[SnapshotConstant] groupConnections: Optional[List[GroupConnection]] = None -@define(kw_only=True, slots=False) + +@unitypy_define class AudioMixerLiveUpdateBool(ABC): pass -@define(kw_only=True, slots=False) + +@unitypy_define class AudioMixerLiveUpdateFloat(ABC): pass -@define(kw_only=True, slots=False) + +@unitypy_define class AutoOffMeshLinkData: m_Area: int m_End: Vector3f @@ -6121,12 +6603,14 @@ class AutoOffMeshLinkData: m_Radius: float m_Start: Vector3f -@define(kw_only=True, slots=False) + +@unitypy_define class AvatarBodyMask(NamedObject): m_Mask: List[int] m_Name: str -@define(kw_only=True, slots=False) + +@unitypy_define class AvatarConstant: m_Human: OffsetPtr m_HumanSkeletonIndexArray: List[int] @@ -6143,12 +6627,14 @@ class AvatarConstant: m_SkeletonNameIDArray: Optional[List[int]] = None m_SkeletonPose: Optional[OffsetPtr] = None -@define(kw_only=True, slots=False) + +@unitypy_define class AvatarSkeletonMaskElement: path: str weight: float -@define(kw_only=True, slots=False) + +@unitypy_define class Axes: m_Length: float m_Limit: Limit @@ -6157,15 +6643,18 @@ class Axes: m_Sgn: Union[float3, float4] m_Type: int -@define(kw_only=True, slots=False) + +@unitypy_define class BitField: m_Bits: int -@define(kw_only=True, slots=False) + +@unitypy_define class Blend1dDataConstant: m_ChildThresholdArray: List[float] -@define(kw_only=True, slots=False) + +@unitypy_define class Blend2dDataConstant: m_ChildMagnitudeArray: Optional[List[float]] = None m_ChildNeighborListArray: Optional[List[MotionNeighborList]] = None @@ -6174,31 +6663,36 @@ class Blend2dDataConstant: m_ChildPositionArray: Optional[List[Vector2f]] = None m_ChildThresholdArray: Optional[List[float]] = None -@define(kw_only=True, slots=False) + +@unitypy_define class BlendDirectDataConstant: m_ChildBlendEventIDArray: List[int] m_NormalizedBlendValues: bool -@define(kw_only=True, slots=False) + +@unitypy_define class BlendShapeData: channels: List[MeshBlendShapeChannel] fullWeights: List[float] shapes: List[MeshBlendShape] vertices: List[BlendShapeVertex] -@define(kw_only=True, slots=False) + +@unitypy_define class BlendShapeVertex: index: int normal: Vector3f tangent: Vector3f vertex: Vector3f -@define(kw_only=True, slots=False) + +@unitypy_define class BlendTreeConstant: m_NodeArray: List[OffsetPtr] m_BlendEventArrayConstant: Optional[OffsetPtr] = None -@define(kw_only=True, slots=False) + +@unitypy_define class BlendTreeNodeConstant: m_BlendEventID: int m_ChildIndices: List[int] @@ -6214,7 +6708,8 @@ class BlendTreeNodeConstant: m_CycleOffset: Optional[float] = None m_Mirror: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class BoneInfluence: boneIndex_0_: int boneIndex_1_: int @@ -6225,7 +6720,8 @@ class BoneInfluence: weight_2_: float weight_3_: float -@define(kw_only=True, slots=False) + +@unitypy_define class BoneWeights4: boneIndex_0_: int boneIndex_1_: int @@ -6236,7 +6732,8 @@ class BoneWeights4: weight_2_: float weight_3_: float -@define(kw_only=True, slots=False) + +@unitypy_define class BranchWindLevel: m_afBend_0: float m_afBend_1: float @@ -6340,20 +6837,23 @@ class BranchWindLevel: m_afTurbulence_9: float m_fIndependence: float -@define(kw_only=True, slots=False) + +@unitypy_define class BufferBinding: m_Index: int m_NameIndex: int m_ArraySize: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class BuildReportFile: id: int path: str role: str totalSize: int -@define(kw_only=True, slots=False) + +@unitypy_define class BuildReportPackedAssetInfo: classID: int fileID: int @@ -6362,12 +6862,14 @@ class BuildReportPackedAssetInfo: buildTimeAssetPath: Optional[str] = None offset: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class BuildReportScenesUsingAsset: assetPath: str scenePaths: List[str] -@define(kw_only=True, slots=False) + +@unitypy_define class BuildStepInfo: messages: List[BuildStepMessage] stepName: str @@ -6375,12 +6877,14 @@ class BuildStepInfo: duration: Optional[int] = None durationTicks: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class BuildStepMessage: content: str type: int -@define(kw_only=True, slots=False) + +@unitypy_define class BuildSummary: assetBundleOptions: int crc: int @@ -6402,7 +6906,8 @@ class BuildSummary: totalTimeMS: Optional[int] = None totalTimeTicks: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class BuildTargetSettings: m_BuildTarget: str m_TextureFormat: int @@ -6413,29 +6918,34 @@ class BuildTargetSettings: m_TextureHeight: Optional[int] = None m_TextureWidth: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class BuildTextureStackReference: groupName: str itemName: str -@define(kw_only=True, slots=False) + +@unitypy_define class BuiltAssetBundleInfo: bundleArchiveFile: int bundleName: str packagedFileIndices: List[int] -@define(kw_only=True, slots=False) + +@unitypy_define class BuiltinShaderSettings: m_Mode: int m_Shader: PPtr[Shader] -@define(kw_only=True, slots=False) + +@unitypy_define class CGProgram(TextAsset): m_Name: str m_Script: str m_PathName: Optional[str] = None -@define(kw_only=True, slots=False) + +@unitypy_define class CachedAssetMetaData: guid: GUID originalChangeset: int @@ -6444,20 +6954,23 @@ class CachedAssetMetaData: originalParent: GUID pathName: str -@define(kw_only=True, slots=False) + +@unitypy_define class Channel: attributeName: str byteOffset: int curve: AnimationCurve -@define(kw_only=True, slots=False) + +@unitypy_define class ChannelInfo: dimension: int format: int offset: int stream: int -@define(kw_only=True, slots=False) + +@unitypy_define class CharacterInfo: index: int uv: Rectf @@ -6466,7 +6979,8 @@ class CharacterInfo: flipped: Optional[bool] = None width: Optional[float] = None -@define(kw_only=True, slots=False) + +@unitypy_define class Child: m_IsAnim: bool m_Motion: PPtr[Motion] @@ -6476,17 +6990,20 @@ class Child: m_Mirror: Optional[bool] = None m_Position: Optional[Vector2f] = None -@define(kw_only=True, slots=False) + +@unitypy_define class ChildAnimatorState: m_Position: Vector3f m_State: PPtr[AnimatorState] -@define(kw_only=True, slots=False) + +@unitypy_define class ChildAnimatorStateMachine: m_Position: Vector3f m_StateMachine: PPtr[AnimatorStateMachine] -@define(kw_only=True, slots=False) + +@unitypy_define class ChildMotion: m_CycleOffset: float m_DirectBlendParameter: str @@ -6496,7 +7013,8 @@ class ChildMotion: m_Threshold: float m_TimeScale: float -@define(kw_only=True, slots=False) + +@unitypy_define class ClampVelocityModule: dampen: float enabled: bool @@ -6510,7 +7028,8 @@ class ClampVelocityModule: multiplyDragByParticleSize: Optional[bool] = None multiplyDragByParticleVelocity: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class ClassInfo: m_AssemblyNameIndex: int m_ClassName: str @@ -6520,20 +7039,23 @@ class ClassInfo: m_NumOfMethods: int m_NamespaceName: Optional[str] = None -@define(kw_only=True, slots=False) + +@unitypy_define class ClassMethodInfo: m_ClassIndex: int m_MethodName: str m_OrderNumber: int -@define(kw_only=True, slots=False) + +@unitypy_define class Clip: m_DenseClip: DenseClip m_StreamedClip: StreamedClip m_Binding: Optional[OffsetPtr] = None m_ConstantClip: Optional[ConstantClip] = None -@define(kw_only=True, slots=False) + +@unitypy_define class ClipAnimationInfo: firstFrame: Union[int, float] lastFrame: Union[int, float] @@ -6566,12 +7088,14 @@ class ClipAnimationInfo: takeName: Optional[str] = None transformMask: Optional[List[TransformMaskElement]] = None -@define(kw_only=True, slots=False) + +@unitypy_define class ClipAnimationInfoCurve: curve: AnimationCurve name: str -@define(kw_only=True, slots=False) + +@unitypy_define class ClipMuscleConstant: m_AverageAngularSpeed: float m_AverageSpeed: Union[float3, float4] @@ -6604,25 +7128,29 @@ class ClipMuscleConstant: m_StopX: Optional[xform] = None m_ValueArrayReferencePose: Optional[List[float]] = None -@define(kw_only=True, slots=False) + +@unitypy_define class ClothAttachment: m_Collider: PPtr[Collider] m_Tearable: bool m_TwoWayInteraction: bool -@define(kw_only=True, slots=False) + +@unitypy_define class ClothConstrainCoefficients: collisionSphereDistance: float maxDistance: float collisionSphereRadius: Optional[float] = None maxDistanceBias: Optional[float] = None -@define(kw_only=True, slots=False) + +@unitypy_define class ClothSphereColliderPair: first: PPtr[SphereCollider] second: PPtr[SphereCollider] -@define(kw_only=True, slots=False) + +@unitypy_define class ClusterInput: m_DeviceName: str m_Index: int @@ -6630,19 +7158,23 @@ class ClusterInput: m_ServerUrl: str m_Type: int -@define(kw_only=True, slots=False) + +@unitypy_define class CollabEditorSettings: inProgressEnabled: bool -@define(kw_only=True, slots=False) + +@unitypy_define class Collision(ABC): pass -@define(kw_only=True, slots=False) + +@unitypy_define class Collision2D(ABC): pass -@define(kw_only=True, slots=False) + +@unitypy_define class CollisionModule: enabled: bool minKillSpeed: float @@ -6676,22 +7208,26 @@ class CollisionModule: radiusScale: Optional[float] = None voxelSize: Optional[float] = None -@define(kw_only=True, slots=False) + +@unitypy_define class ColorBySpeedModule: enabled: bool gradient: MinMaxGradient range: Vector2f -@define(kw_only=True, slots=False) + +@unitypy_define class ColorModule: enabled: bool gradient: MinMaxGradient -@define(kw_only=True, slots=False) + +@unitypy_define class ComponentPair: component: PPtr[Component] -@define(kw_only=True, slots=False) + +@unitypy_define class CompressedAnimationCurve: m_Path: str m_PostInfinity: int @@ -6700,7 +7236,8 @@ class CompressedAnimationCurve: m_Times: PackedBitVector m_Values: PackedBitVector -@define(kw_only=True, slots=False) + +@unitypy_define class CompressedMesh: m_BoneIndices: PackedBitVector m_NormalSigns: PackedBitVector @@ -6716,23 +7253,27 @@ class CompressedMesh: m_FloatColors: Optional[PackedBitVector] = None m_UVInfo: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class ComputeBufferCounter: bindpoint: int offset: int -@define(kw_only=True, slots=False) + +@unitypy_define class ComputeShaderBuiltinSampler: bindPoint: int sampler: int -@define(kw_only=True, slots=False) + +@unitypy_define class ComputeShaderCB: byteSize: int name: Union[FastPropertyName, str] params: List[ComputeShaderParam] -@define(kw_only=True, slots=False) + +@unitypy_define class ComputeShaderKernel: builtinSamplers: List[ComputeShaderBuiltinSampler] cbs: List[ComputeShaderResource] @@ -6745,7 +7286,8 @@ class ComputeShaderKernel: requirements: Optional[int] = None threadGroupSize: Optional[List[int]] = None -@define(kw_only=True, slots=False) + +@unitypy_define class ComputeShaderKernelParent: name: str dynamicKeywords: Optional[List[str]] = None @@ -6756,7 +7298,8 @@ class ComputeShaderKernelParent: variantIndices: Optional[List[Tuple[str, int]]] = None variantMap: Optional[List[Tuple[str, ComputeShaderKernel]]] = None -@define(kw_only=True, slots=False) + +@unitypy_define class ComputeShaderParam: arraySize: int colCount: int @@ -6765,7 +7308,8 @@ class ComputeShaderParam: rowCount: int type: int -@define(kw_only=True, slots=False) + +@unitypy_define class ComputeShaderPlatformVariant: constantBuffers: List[ComputeShaderCB] kernels: List[ComputeShaderKernelParent] @@ -6773,7 +7317,8 @@ class ComputeShaderPlatformVariant: targetLevel: int targetRenderer: int -@define(kw_only=True, slots=False) + +@unitypy_define class ComputeShaderResource: bindPoint: int name: Union[FastPropertyName, str] @@ -6783,7 +7328,8 @@ class ComputeShaderResource: secondaryBindPoint: Optional[int] = None texDimension: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class ComputeShaderVariant: constantBuffers: List[ComputeShaderCB] kernels: List[ComputeShaderKernel] @@ -6791,26 +7337,30 @@ class ComputeShaderVariant: targetRenderer: int resourcesResolved: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class Condition: m_ConditionEvent: str m_ConditionMode: int m_EventTreshold: float m_ExitTime: float -@define(kw_only=True, slots=False) + +@unitypy_define class ConditionConstant: m_ConditionMode: int m_EventID: int m_EventThreshold: float m_ExitTime: float -@define(kw_only=True, slots=False) + +@unitypy_define class ConfigSetting: flags: int value: str -@define(kw_only=True, slots=False) + +@unitypy_define class ConstantBuffer: m_MatrixParams: List[MatrixParameter] m_NameIndex: int @@ -6819,16 +7369,19 @@ class ConstantBuffer: m_IsPartialCB: Optional[bool] = None m_StructParams: Optional[List[StructParameter]] = None -@define(kw_only=True, slots=False) + +@unitypy_define class ConstantClip: data: List[float] -@define(kw_only=True, slots=False) + +@unitypy_define class ConstraintSource: sourceTransform: PPtr[Transform] weight: float -@define(kw_only=True, slots=False) + +@unitypy_define class ControllerConstant: m_DefaultValues: OffsetPtr m_StateMachineArray: List[OffsetPtr] @@ -6836,14 +7389,16 @@ class ControllerConstant: m_HumanLayerArray: Optional[List[OffsetPtr]] = None m_LayerArray: Optional[List[OffsetPtr]] = None -@define(kw_only=True, slots=False) + +@unitypy_define class CrashReportingSettings: m_Enabled: bool m_EventUrl: str m_LogBufferSize: Optional[int] = None m_NativeEventUrl: Optional[str] = None -@define(kw_only=True, slots=False) + +@unitypy_define class CustomDataModule: color0: MinMaxGradient color1: MinMaxGradient @@ -6861,7 +7416,8 @@ class CustomDataModule: vectorComponentCount0: int vectorComponentCount1: int -@define(kw_only=True, slots=False) + +@unitypy_define class DataTemplate(NamedObject): m_Father: PPtr[DataTemplate] m_IsDataTemplate: bool @@ -6869,22 +7425,26 @@ class DataTemplate(NamedObject): m_Name: str m_Objects: List[PPtr[EditorExtension]] -@define(kw_only=True, slots=False) + +@unitypy_define class DateTime: ticks: int -@define(kw_only=True, slots=False) + +@unitypy_define class DefaultPreset: m_Preset: PPtr[Preset] m_Disabled: Optional[bool] = None m_Filter: Optional[str] = None -@define(kw_only=True, slots=False) + +@unitypy_define class DefaultPresetList: defaultPresets: List[DefaultPreset] type: PresetType -@define(kw_only=True, slots=False) + +@unitypy_define class DeletedItem: changeset: int digest: Union[Hash128, MdFour] @@ -6893,7 +7453,8 @@ class DeletedItem: parent: GUID type: int -@define(kw_only=True, slots=False) + +@unitypy_define class DenseClip: m_BeginTime: float m_CurveCount: int @@ -6901,7 +7462,8 @@ class DenseClip: m_SampleArray: List[float] m_SampleRate: float -@define(kw_only=True, slots=False) + +@unitypy_define class DetailDatabase: WavingGrassTint: ColorRGBA m_DetailPrototypes: List[DetailPrototype] @@ -6923,14 +7485,16 @@ class DetailDatabase: m_DetailScatterMode: Optional[int] = None m_RandomRotations: Optional[List[Vector3f]] = None -@define(kw_only=True, slots=False) + +@unitypy_define class DetailPatch: layerIndices: List[int] bounds: Optional[AABB] = None coverage: Optional[List[int]] = None numberOfObjects: Optional[List[int]] = None -@define(kw_only=True, slots=False) + +@unitypy_define class DetailPrototype: dryColor: ColorRGBA healthyColor: ColorRGBA @@ -6955,20 +7519,24 @@ class DetailPrototype: useDensityScaling: Optional[int] = None useInstancing: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class DeviceNone: pass -@define(kw_only=True, slots=False) + +@unitypy_define class DirectorGenericBinding: key: PPtr[Object] value: PPtr[Object] -@define(kw_only=True, slots=False) + +@unitypy_define class DirectorPlayer(Behaviour): m_GameObject: PPtr[GameObject] -@define(kw_only=True, slots=False) + +@unitypy_define class EffectConstant: bypass: bool groupConstantIndex: int @@ -6978,12 +7546,14 @@ class EffectConstant: type: int wetMixLevelIndex: int -@define(kw_only=True, slots=False) + +@unitypy_define class EmbeddedNativeType: m_FloatArray: List[float] m_String: str -@define(kw_only=True, slots=False) + +@unitypy_define class EmissionModule: enabled: bool m_BurstCount: int @@ -7005,14 +7575,16 @@ class EmissionModule: time2: Optional[float] = None time3: Optional[float] = None -@define(kw_only=True, slots=False) + +@unitypy_define class EnlightenRendererInformation: dynamicLightmapSTInSystem: Vector4f instanceHash: Hash128 renderer: PPtr[Object] systemId: int -@define(kw_only=True, slots=False) + +@unitypy_define class EnlightenSceneMapping: m_Renderers: List[EnlightenRendererInformation] m_SystemAtlases: List[EnlightenSystemAtlasInformation] @@ -7020,13 +7592,15 @@ class EnlightenSceneMapping: m_TerrainChunks: List[EnlightenTerrainChunksInformation] m_Probesets: Optional[List[Hash128]] = None -@define(kw_only=True, slots=False) + +@unitypy_define class EnlightenSystemAtlasInformation: atlasHash: Hash128 atlasSize: int firstSystemId: int -@define(kw_only=True, slots=False) + +@unitypy_define class EnlightenSystemInformation: atlasIndex: int atlasOffsetX: int @@ -7036,24 +7610,28 @@ class EnlightenSystemInformation: rendererIndex: int rendererSize: int -@define(kw_only=True, slots=False) + +@unitypy_define class EnlightenTerrainChunksInformation: firstSystemId: int numChunksInX: int numChunksInY: int -@define(kw_only=True, slots=False) + +@unitypy_define class ExpandedData: m_ClassID: int m_ExpandedProperties: List[str] m_InspectorExpanded: bool m_ScriptClass: str -@define(kw_only=True, slots=False) + +@unitypy_define class ExposedReferenceTable: m_References: List[Tuple[str, PPtr[Object]]] -@define(kw_only=True, slots=False) + +@unitypy_define class Expression: data_0_: int data_1_: int @@ -7062,14 +7640,16 @@ class Expression: op: int valueIndex: int -@define(kw_only=True, slots=False) + +@unitypy_define class ExtensionPropertyValue: extensionName: str pluginName: str propertyName: str propertyValue: float -@define(kw_only=True, slots=False) + +@unitypy_define class ExternalForcesModule: enabled: bool influenceFilter: Optional[int] = None @@ -7078,7 +7658,8 @@ class ExternalForcesModule: multiplier: Optional[float] = None multiplierCurve: Optional[MinMaxCurve] = None -@define(kw_only=True, slots=False) + +@unitypy_define class FalloffTable: m_Table_0_: float m_Table_10_: float @@ -7094,11 +7675,13 @@ class FalloffTable: m_Table_8_: float m_Table_9_: float -@define(kw_only=True, slots=False) + +@unitypy_define class FastPropertyName: name: str -@define(kw_only=True, slots=False) + +@unitypy_define class FlareElement: m_Color: ColorRGBA m_Fade: bool @@ -7109,7 +7692,8 @@ class FlareElement: m_UseLightColor: bool m_Zoom: bool -@define(kw_only=True, slots=False) + +@unitypy_define class FloatCurve: attribute: str classID: int @@ -7118,7 +7702,8 @@ class FloatCurve: script: PPtr[MonoScript] flags: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class ForceModule: enabled: bool inWorldSpace: bool @@ -7127,7 +7712,8 @@ class ForceModule: y: MinMaxCurve z: MinMaxCurve -@define(kw_only=True, slots=False) + +@unitypy_define class GISettings: m_AlbedoBoost: float m_BounceScale: float @@ -7137,7 +7723,8 @@ class GISettings: m_IndirectOutputScale: float m_TemporalCoherenceThreshold: Optional[float] = None -@define(kw_only=True, slots=False) + +@unitypy_define class GLTextureSettings: m_Aniso: int m_FilterMode: int @@ -7147,14 +7734,16 @@ class GLTextureSettings: m_WrapV: Optional[int] = None m_WrapW: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class GUID: data_0_: int data_1_: int data_2_: int data_3_: int -@define(kw_only=True, slots=False) + +@unitypy_define class GenericBinding: attribute: int customType: int @@ -7166,18 +7755,21 @@ class GenericBinding: isSerializeReferenceCurve: Optional[int] = None typeID: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class GfxBlendState: alphaToMask: int rt: List[GfxRenderTargetBlendState] separateMRTBlend: int -@define(kw_only=True, slots=False) + +@unitypy_define class GfxDepthState: depthFunc: int depthWrite: int -@define(kw_only=True, slots=False) + +@unitypy_define class GfxRasterState: conservative: int cullMode: int @@ -7185,7 +7777,8 @@ class GfxRasterState: depthClip: int slopeScaledDepthBias: float -@define(kw_only=True, slots=False) + +@unitypy_define class GfxRenderTargetBlendState: blendOp: int blendOpAlpha: int @@ -7195,7 +7788,8 @@ class GfxRenderTargetBlendState: srcBlendAlpha: int writeMask: int -@define(kw_only=True, slots=False) + +@unitypy_define class GfxStencilState: padding: int readMask: int @@ -7210,7 +7804,8 @@ class GfxStencilState: stencilZFailOpFront: int writeMask: int -@define(kw_only=True, slots=False) + +@unitypy_define class Google: depthFormat: int enableTransitionView: Optional[bool] = None @@ -7220,7 +7815,8 @@ class Google: useProtectedVideoMemory: Optional[bool] = None useSustainedPerformanceMode: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class Gradient: atime0: Optional[int] = None atime1: Optional[int] = None @@ -7256,7 +7852,8 @@ class Gradient: m_NumAlphaKeys: Optional[int] = None m_NumColorKeys: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class GradientNEW: atime0: int atime1: int @@ -7285,7 +7882,8 @@ class GradientNEW: m_NumAlphaKeys: int m_NumColorKeys: int -@define(kw_only=True, slots=False) + +@unitypy_define class GraphicsStateInfo: appBackface: bool depthBias: float @@ -7300,13 +7898,15 @@ class GraphicsStateInfo: vertexLayout: int wireframe: bool -@define(kw_only=True, slots=False) + +@unitypy_define class GroupConnection: sendEffectIndex: int sourceGroupIndex: int targetGroupIndex: int -@define(kw_only=True, slots=False) + +@unitypy_define class GroupConstant: bypassEffects: bool mute: bool @@ -7316,11 +7916,13 @@ class GroupConstant: volumeIndex: int sendIndex: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class Hand: m_HandBoneIndex: List[int] -@define(kw_only=True, slots=False) + +@unitypy_define class HandPose: m_CloseOpen: float m_DoFArray: List[float] @@ -7329,13 +7931,15 @@ class HandPose: m_InOut: float m_Override: float -@define(kw_only=True, slots=False) + +@unitypy_define class Handle: m_ID: int m_ParentHumanIndex: int m_X: xform -@define(kw_only=True, slots=False) + +@unitypy_define class Hash128: bytes_0_: int bytes_10_: int @@ -7354,21 +7958,24 @@ class Hash128: bytes_8_: int bytes_9_: int -@define(kw_only=True, slots=False) + +@unitypy_define class HeightMeshBVNode: i: int max: Vector3f min: Vector3f n: int -@define(kw_only=True, slots=False) + +@unitypy_define class HeightMeshData: m_Bounds: AABB m_Indices: List[int] m_Nodes: List[HeightMeshBVNode] m_Vertices: List[Vector3f] -@define(kw_only=True, slots=False) + +@unitypy_define class Heightmap: m_Heights: List[int] m_Levels: int @@ -7387,23 +7994,27 @@ class Heightmap: m_Thickness: Optional[float] = None m_Width: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class HeightmapData: terrainData: PPtr[Object] isRotated: Optional[bool] = None position: Optional[Vector3f] = None surfaceToTerrain: Optional[Matrix4x4f] = None -@define(kw_only=True, slots=False) + +@unitypy_define class HierarchicalSceneData: m_SceneGUID: GUID -@define(kw_only=True, slots=False) + +@unitypy_define class HoloLens: depthFormat: int depthBufferSharingEnabled: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class Human: m_ArmStretch: float m_ArmTwist: float @@ -7427,13 +8038,15 @@ class Human: m_Handles: Optional[List[Handle]] = None m_HasTDoF: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class HumanBone: m_BoneName: str m_HumanName: str m_Limit: SkeletonBoneLimit -@define(kw_only=True, slots=False) + +@unitypy_define class HumanDescription: m_ArmStretch: float m_ArmTwist: float @@ -7452,7 +8065,8 @@ class HumanDescription: m_RootMotionBoneRotation: Optional[Quaternionf] = None m_SkeletonHasParents: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class HumanGoal: m_WeightR: float m_WeightT: float @@ -7460,7 +8074,8 @@ class HumanGoal: m_HintT: Optional[Union[float3, float4]] = None m_HintWeightT: Optional[float] = None -@define(kw_only=True, slots=False) + +@unitypy_define class HumanHandle: m_BoneName: str m_LookAt: bool @@ -7469,7 +8084,8 @@ class HumanHandle: m_Rotation: Quaternionf m_Scale: Vector3f -@define(kw_only=True, slots=False) + +@unitypy_define class HumanLayerConstant: m_Binding: int m_BodyMask: HumanPoseMask @@ -7481,7 +8097,8 @@ class HumanLayerConstant: m_DefaultWeight: Optional[float] = None m_SyncedLayerAffectsTiming: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class HumanPose: m_DoFArray: List[float] m_GoalArray: List[HumanGoal] @@ -7492,13 +8109,15 @@ class HumanPose: m_RootX: xform m_TDoFArray: Optional[Union[List[float4], List[float3]]] = None -@define(kw_only=True, slots=False) + +@unitypy_define class HumanPoseMask: word0: int word1: int word2: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class Image: image_data: bytes m_Format: int @@ -7506,7 +8125,8 @@ class Image: m_RowBytes: int m_Width: int -@define(kw_only=True, slots=False) + +@unitypy_define class ImportLog_ImportLogEntry: file: str line: int @@ -7514,13 +8134,15 @@ class ImportLog_ImportLogEntry: mode: int object: PPtr[Object] -@define(kw_only=True, slots=False) + +@unitypy_define class InheritVelocityModule: enabled: bool m_Curve: MinMaxCurve m_Mode: int -@define(kw_only=True, slots=False) + +@unitypy_define class InitialModule: enabled: bool gravityModifier: Union[MinMaxCurve, float] @@ -7541,7 +8163,8 @@ class InitialModule: startSizeY: Optional[MinMaxCurve] = None startSizeZ: Optional[MinMaxCurve] = None -@define(kw_only=True, slots=False) + +@unitypy_define class InputAxis: altNegativeButton: str altPositiveButton: str @@ -7559,7 +8182,8 @@ class InputAxis: snap: bool type: int -@define(kw_only=True, slots=False) + +@unitypy_define class InputImportSettings: name: str alphaSource: Optional[int] = None @@ -7568,12 +8192,14 @@ class InputImportSettings: value: Optional[SubstanceValue] = None wrapMode: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class IntPoint: X: int Y: int -@define(kw_only=True, slots=False) + +@unitypy_define class Item: changeFlags: Optional[int] = None changeset: Optional[int] = None @@ -7589,17 +8215,20 @@ class Item: parentFolderID: Optional[int] = None type: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class JointAngleLimit2D: m_LowerAngle: float m_UpperAngle: float -@define(kw_only=True, slots=False) + +@unitypy_define class JointAngleLimits2D: m_LowerAngle: float m_UpperAngle: float -@define(kw_only=True, slots=False) + +@unitypy_define class JointDrive: maximumForce: float positionDamper: float @@ -7607,7 +8236,8 @@ class JointDrive: mode: Optional[int] = None useAcceleration: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class JointLimits: max: float min: float @@ -7617,35 +8247,41 @@ class JointLimits: maxBounce: Optional[float] = None minBounce: Optional[float] = None -@define(kw_only=True, slots=False) + +@unitypy_define class JointMotor: force: float freeSpin: int targetVelocity: float -@define(kw_only=True, slots=False) + +@unitypy_define class JointMotor2D: m_MaximumMotorForce: float m_MotorSpeed: float -@define(kw_only=True, slots=False) + +@unitypy_define class JointSpring: damper: float spring: float targetPosition: float -@define(kw_only=True, slots=False) + +@unitypy_define class JointSuspension2D: m_Angle: float m_DampingRatio: float m_Frequency: float -@define(kw_only=True, slots=False) + +@unitypy_define class JointTranslationLimits2D: m_LowerTranslation: float m_UpperTranslation: float -@define(kw_only=True, slots=False) + +@unitypy_define class Keyframe: inSlope: Union[Quaternionf, float, Vector3f] outSlope: Union[Quaternionf, float, Vector3f] @@ -7655,18 +8291,21 @@ class Keyframe: outWeight: Optional[Union[Quaternionf, float, Vector3f]] = None weightedMode: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class LOD: renderers: List[LODRenderer] screenRelativeHeight: float fadeMode: Optional[int] = None fadeTransitionWidth: Optional[float] = None -@define(kw_only=True, slots=False) + +@unitypy_define class LODRenderer: renderer: PPtr[Renderer] -@define(kw_only=True, slots=False) + +@unitypy_define class LayerConstant: m_Binding: int m_BodyMask: HumanPoseMask @@ -7679,25 +8318,30 @@ class LayerConstant: m_StateMachineMotionSetIndex: Optional[int] = None m_StateMachineSynchronizedLayerIndex: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class LayoutDataOne: m_FloatArray: List[float] -@define(kw_only=True, slots=False) + +@unitypy_define class LayoutDataThree: m_AnotherFloatArray: List[float] -@define(kw_only=True, slots=False) + +@unitypy_define class LayoutDataTwo: m_FloatValue: float m_IntegerValue: int -@define(kw_only=True, slots=False) + +@unitypy_define class LeafInfoConstant: m_IDArray: List[int] m_IndexOffset: int -@define(kw_only=True, slots=False) + +@unitypy_define class LibraryRepresentation: name: str scriptClassName: str @@ -7709,13 +8353,15 @@ class LibraryRepresentation: object: Optional[Union[PPtr[EditorExtension], PPtr[Object]]] = None path: Optional[str] = None -@define(kw_only=True, slots=False) + +@unitypy_define class LifetimeByEmitterSpeedModule: enabled: bool m_Curve: MinMaxCurve m_Range: Vector2f -@define(kw_only=True, slots=False) + +@unitypy_define class LightBakingOutput: probeOcclusionLightIndex: int isBaked: Optional[bool] = None @@ -7724,14 +8370,16 @@ class LightBakingOutput: occlusionMaskChannel: Optional[int] = None shadowMaskChannel: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class LightProbeData: m_NonTetrahedralizedProbeSetIndexMap: List[Tuple[Hash128, int]] m_Positions: List[Vector3f] m_ProbeSets: List[ProbeSetIndex] m_Tetrahedralization: ProbeSetTetrahedralization -@define(kw_only=True, slots=False) + +@unitypy_define class LightProbeOcclusion: m_Occlusion: List[float] m_BakedLightIndex: Optional[List[int]] = None @@ -7739,12 +8387,14 @@ class LightProbeOcclusion: m_ProbeOcclusionLightIndex: Optional[List[int]] = None m_ShadowMaskChannel: Optional[List[int]] = None -@define(kw_only=True, slots=False) + +@unitypy_define class LightmapBakeMode: lightmapBakeType: int mixedLightingMode: int -@define(kw_only=True, slots=False) + +@unitypy_define class LightmapData: m_DirLightmap: Optional[PPtr[Texture2D]] = None m_IndirectLightmap: Optional[PPtr[Texture2D]] = None @@ -7778,7 +8428,8 @@ class LightmapData: sh_8_: Optional[float] = None sh_9_: Optional[float] = None -@define(kw_only=True, slots=False) + +@unitypy_define class LightmapSnapshot(NamedObject): m_BakedReflectionProbeCubemaps: List[PPtr[Texture]] m_BakedReflectionProbes: List[SceneObjectIdentifier] @@ -7798,7 +8449,8 @@ class LightmapSnapshot(NamedObject): m_BakedSkyboxProbeCubemaps: Optional[List[PPtr[Texture]]] = None m_SceneGUID: Optional[GUID] = None -@define(kw_only=True, slots=False) + +@unitypy_define class LightsModule: color: bool enabled: bool @@ -7811,12 +8463,14 @@ class LightsModule: rangeCurve: MinMaxCurve ratio: float -@define(kw_only=True, slots=False) + +@unitypy_define class Limit: m_Max: Union[float3, float4] m_Min: Union[float3, float4] -@define(kw_only=True, slots=False) + +@unitypy_define class LineParameters: alignment: Optional[int] = None colorGradient: Optional[Gradient] = None @@ -7833,7 +8487,8 @@ class LineParameters: widthCurve: Optional[AnimationCurve] = None widthMultiplier: Optional[float] = None -@define(kw_only=True, slots=False) + +@unitypy_define class Lumin: depthFormat: int enableGLCache: bool @@ -7841,12 +8496,14 @@ class Lumin: glCacheMaxBlobSize: int glCacheMaxFileSize: int -@define(kw_only=True, slots=False) + +@unitypy_define class MaterialImportOutput: baked: int currentSettings: BuildTargetSettings -@define(kw_only=True, slots=False) + +@unitypy_define class MaterialInstanceSettings: buildTargetSettings: List[BuildTargetSettings] inputs: List[InputImportSettings] @@ -7862,7 +8519,8 @@ class MaterialInstanceSettings: shaderName: Optional[str] = None textureAssignments: Optional[List[ProceduralTextureAssignment]] = None -@define(kw_only=True, slots=False) + +@unitypy_define class MatrixParameter: m_ArraySize: int m_Index: int @@ -7870,11 +8528,13 @@ class MatrixParameter: m_RowCount: int m_Type: int -@define(kw_only=True, slots=False) + +@unitypy_define class MdFour: md4_hash: bytes -@define(kw_only=True, slots=False) + +@unitypy_define class MeshBlendShape: firstVertex: int hasNormals: bool @@ -7884,26 +8544,30 @@ class MeshBlendShape: aabbMinDelta: Optional[Vector3f] = None name: Optional[str] = None -@define(kw_only=True, slots=False) + +@unitypy_define class MeshBlendShapeChannel: frameCount: int frameIndex: int name: str nameHash: int -@define(kw_only=True, slots=False) + +@unitypy_define class MeshBlendShapeVertex: index: int normal: Vector3f tangent: Vector3f vertex: Vector3f -@define(kw_only=True, slots=False) + +@unitypy_define class MinMaxAABB: m_Max: Vector3f m_Min: Vector3f -@define(kw_only=True, slots=False) + +@unitypy_define class MinMaxCurve: maxCurve: AnimationCurve minCurve: AnimationCurve @@ -7911,7 +8575,8 @@ class MinMaxCurve: scalar: float minScalar: Optional[float] = None -@define(kw_only=True, slots=False) + +@unitypy_define class MinMaxGradient: maxColor: ColorRGBA maxGradient: Union[GradientNEW, Gradient] @@ -7919,19 +8584,22 @@ class MinMaxGradient: minGradient: Union[GradientNEW, Gradient] minMaxState: int -@define(kw_only=True, slots=False) + +@unitypy_define class MipmapLimitSettings: limitBias: int limitBiasMode: int -@define(kw_only=True, slots=False) + +@unitypy_define class Module: dependencies: List[str] name: str strippable: bool controlledByBuiltinPackage: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class MonoAssemblyImporter(AssetImporter): m_ExecutionOrder: List[Tuple[str, int]] m_IconMap: List[Tuple[str, PPtr[Texture2D]]] @@ -7941,51 +8609,61 @@ class MonoAssemblyImporter(AssetImporter): m_OldHashIdentity: Optional[MdFour] = None m_UserData: Optional[str] = None -@define(kw_only=True, slots=False) + +@unitypy_define class MonoObject(ABC): pass -@define(kw_only=True, slots=False) + +@unitypy_define class MotionNeighborList: m_NeighborArray: List[int] -@define(kw_only=True, slots=False) + +@unitypy_define class MultiModeParameter: mode: int speed: MinMaxCurve spread: float value: Optional[float] = None -@define(kw_only=True, slots=False) + +@unitypy_define class NameToObjectMap: m_ObjectToName: List[Tuple[PPtr[Shader], str]] -@define(kw_only=True, slots=False) + +@unitypy_define class NativeType: a: int b: float embedded: EmbeddedNativeType -@define(kw_only=True, slots=False) + +@unitypy_define class NavMesh(NamedObject): m_Heightmaps: List[HeightmapData] m_MeshData: List[int] m_Name: str -@define(kw_only=True, slots=False) + +@unitypy_define class NavMeshAreaData: cost: float name: str -@define(kw_only=True, slots=False) + +@unitypy_define class NavMeshAreas(GlobalGameManager): areas: List[NavMeshAreaData] -@define(kw_only=True, slots=False) + +@unitypy_define class NavMeshBuildDebugSettings: m_Flags: int -@define(kw_only=True, slots=False) + +@unitypy_define class NavMeshBuildSettings: agentClimb: float agentHeight: float @@ -8006,13 +8684,15 @@ class NavMeshBuildSettings: maxJobWorkers: Optional[int] = None preserveTilesOutsideBounds: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class NavMeshLayerData: cost: float editType: int name: str -@define(kw_only=True, slots=False) + +@unitypy_define class NavMeshLayers(GlobalGameManager): Built_in_Layer_0: NavMeshLayerData Built_in_Layer_1: NavMeshLayerData @@ -8047,7 +8727,8 @@ class NavMeshLayers(GlobalGameManager): User_Layer_8: NavMeshLayerData User_Layer_9: NavMeshLayerData -@define(kw_only=True, slots=False) + +@unitypy_define class NavMeshParams: cellSize: float tileSize: float @@ -8055,22 +8736,26 @@ class NavMeshParams: walkableHeight: float walkableRadius: float -@define(kw_only=True, slots=False) + +@unitypy_define class NavMeshTileData: m_MeshData: List[int] m_Hash: Optional[Hash128] = None -@define(kw_only=True, slots=False) + +@unitypy_define class NetworkViewID: m_ID: int m_Type: int -@define(kw_only=True, slots=False) + +@unitypy_define class Node: m_AxesId: int m_ParentId: int -@define(kw_only=True, slots=False) + +@unitypy_define class NoiseModule: damping: bool enabled: bool @@ -8092,16 +8777,19 @@ class NoiseModule: rotationAmount: Optional[MinMaxCurve] = None sizeAmount: Optional[MinMaxCurve] = None -@define(kw_only=True, slots=False) + +@unitypy_define class NonAlignedStruct: m_Bool: bool -@define(kw_only=True, slots=False) + +@unitypy_define class ObjectRolePair: m_Object: PPtr[Object] m_RolesMask: int -@define(kw_only=True, slots=False) + +@unitypy_define class OcclusionScene: indexPortals: int indexRenderers: int @@ -8109,7 +8797,8 @@ class OcclusionScene: sizePortals: int sizeRenderers: int -@define(kw_only=True, slots=False) + +@unitypy_define class Oculus: dashSupport: bool sharedDepthBuffer: bool @@ -8117,17 +8806,42 @@ class Oculus: protectedContext: Optional[bool] = None v2Signing: Optional[bool] = None -@define(kw_only=True, slots=False) -class OffsetPtr: - data: Union[SkeletonMask, SkeletonPose, Blend2dDataConstant, Blend1dDataConstant, BlendTreeConstant, Skeleton, Clip, SelectorTransitionConstant, LayerConstant, ValueArray, SelectorStateConstant, ConditionConstant, Human, HumanLayerConstant, Hand, StateConstant, StateMachineConstant, BlendTreeNodeConstant, BlendDirectDataConstant, ValueArrayConstant, TransitionConstant] -@define(kw_only=True, slots=False) +@unitypy_define +class OffsetPtr: + data: Union[ + SkeletonMask, + SkeletonPose, + Blend2dDataConstant, + Blend1dDataConstant, + BlendTreeConstant, + Skeleton, + Clip, + SelectorTransitionConstant, + LayerConstant, + ValueArray, + SelectorStateConstant, + ConditionConstant, + Human, + HumanLayerConstant, + Hand, + StateConstant, + StateMachineConstant, + BlendTreeNodeConstant, + BlendDirectDataConstant, + ValueArrayConstant, + TransitionConstant, + ] + + +@unitypy_define class Output: hasEmptyFontData: Optional[bool] = None importedType: Optional[int] = None previewData: Optional[List[float]] = None -@define(kw_only=True, slots=False) + +@unitypy_define class PPtrCurve: attribute: str classID: int @@ -8136,12 +8850,14 @@ class PPtrCurve: script: PPtr[MonoScript] flags: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class PPtrKeyframe: time: float value: PPtr[Object] -@define(kw_only=True, slots=False) + +@unitypy_define class PackedBitVector: m_Data: List[int] m_NumItems: int @@ -8149,7 +8865,8 @@ class PackedBitVector: m_Range: Optional[float] = None m_Start: Optional[float] = None -@define(kw_only=True, slots=False) + +@unitypy_define class PackingSettings: allowAlphaSplitting: bool blockOffset: int @@ -8158,17 +8875,20 @@ class PackingSettings: padding: int enableAlphaDilation: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class Parameter: m_GUID: GUID m_ParameterName: str -@define(kw_only=True, slots=False) + +@unitypy_define class ParserBindChannels: m_Channels: List[ShaderBindChannel] m_SourceMap: int -@define(kw_only=True, slots=False) + +@unitypy_define class ParticleSystemEmissionBurst: cycleCount: int repeatInterval: float @@ -8178,7 +8898,8 @@ class ParticleSystemEmissionBurst: minCount: Optional[int] = None probability: Optional[float] = None -@define(kw_only=True, slots=False) + +@unitypy_define class ParticleSystemForceFieldParameters: m_DirectionCurveX: MinMaxCurve m_DirectionCurveY: MinMaxCurve @@ -8199,7 +8920,8 @@ class ParticleSystemForceFieldParameters: m_VectorFieldAttractionCurve: MinMaxCurve m_VectorFieldSpeedCurve: MinMaxCurve -@define(kw_only=True, slots=False) + +@unitypy_define class PerLODSettings: castShadows: bool enableBump: bool @@ -8212,11 +8934,13 @@ class PerLODSettings: enableSettingOverride: Optional[bool] = None enableSubsurface: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class PerformanceReportingSettings: m_Enabled: bool -@define(kw_only=True, slots=False) + +@unitypy_define class PhysicMaterial(NamedObject): bounceCombine: int bounciness: float @@ -8228,7 +8952,8 @@ class PhysicMaterial(NamedObject): frictionDirection2: Optional[Vector3f] = None staticFriction2: Optional[float] = None -@define(kw_only=True, slots=False) + +@unitypy_define class PhysicsJobOptions2D: m_ClearBodyForcesPerJob: int m_ClearFlagsPerJob: int @@ -8250,7 +8975,8 @@ class PhysicsJobOptions2D: useConsistencySorting: Optional[bool] = None useMultithreading: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class PhysicsShape: m_AdjacentEnd: Vector2f m_AdjacentStart: Vector2f @@ -8261,12 +8987,14 @@ class PhysicsShape: m_VertexCount: int m_VertexStartIndex: int -@define(kw_only=True, slots=False) + +@unitypy_define class PhysicsShapeGroup2D: m_Shapes: List[PhysicsShape] m_Vertices: List[Vector2f] -@define(kw_only=True, slots=False) + +@unitypy_define class PlatformSettings: m_AllowsAlphaSplitting: bool m_BuildTarget: str @@ -8278,34 +9006,40 @@ class PlatformSettings: m_TextureFormat: int m_ResizeAlgorithm: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class PlatformSettingsData: settings: List[Tuple[str, str]] enabled: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class PlatformShaderDefines: defines_Tier1: List[int] defines_Tier2: List[int] defines_Tier3: List[int] shaderPlatform: int -@define(kw_only=True, slots=False) + +@unitypy_define class PlatformShaderSettings: useCascadedShadowMaps: Optional[bool] = None useScreenSpaceShadows: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class PluginImportOutput: dllType: Optional[int] = None pluginType: Optional[int] = None scriptingRuntimeVersion: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class Polygon2D(ABC): m_Paths: Optional[List[List[Vector2f]]] = None -@define(kw_only=True, slots=False) + +@unitypy_define class PrefabModification: m_Modifications: List[PropertyModification] m_RemovedComponents: Union[List[PPtr[Object]], List[PPtr[Component]]] @@ -8314,30 +9048,35 @@ class PrefabModification: m_AddedGameObjects: Optional[List[AddedGameObject]] = None m_RemovedGameObjects: Optional[List[PPtr[GameObject]]] = None -@define(kw_only=True, slots=False) + +@unitypy_define class PresetType: m_ManagedTypeFallback: str m_ManagedTypePPtr: PPtr[MonoScript] m_NativeTypeID: int -@define(kw_only=True, slots=False) + +@unitypy_define class PreviewData: m_CompSize: int m_OrigSize: int m_PreviewData: List[float] -@define(kw_only=True, slots=False) + +@unitypy_define class ProbeSetIndex: m_Hash: Hash128 m_Offset: int m_Size: int -@define(kw_only=True, slots=False) + +@unitypy_define class ProbeSetTetrahedralization: m_HullRays: List[Vector3f] m_Tetrahedra: List[Tetrahedron] -@define(kw_only=True, slots=False) + +@unitypy_define class ProceduralMaterialInformation: m_Offset: Vector2f m_Scale: Vector2f @@ -8346,25 +9085,29 @@ class ProceduralMaterialInformation: m_GenerateMipmaps: Optional[bool] = None m_GeneratedAtLoading: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class ProceduralTextureAssignment: baseUID: int material: PPtr[ProceduralMaterial] shaderProp: Union[FastPropertyName, str] -@define(kw_only=True, slots=False) + +@unitypy_define class PropertyModification: objectReference: PPtr[Object] propertyPath: str target: PPtr[Object] value: str -@define(kw_only=True, slots=False) + +@unitypy_define class PropertyModificationsTargetTestNativeObject: m_FloatValue: float m_IntegerValue: int -@define(kw_only=True, slots=False) + +@unitypy_define class QualitySetting: anisotropicTextures: int antiAliasing: int @@ -8419,40 +9162,47 @@ class QualitySetting: textureQuality: Optional[int] = None useLegacyDetailDistribution: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class QuaternionCurve: curve: AnimationCurve path: str -@define(kw_only=True, slots=False) + +@unitypy_define class RationalTime: m_Count: int m_Rate: TicksPerSecond -@define(kw_only=True, slots=False) + +@unitypy_define class RayTracingShaderBuiltinSampler: bindPoint: int sampler: int -@define(kw_only=True, slots=False) + +@unitypy_define class RayTracingShaderConstantBuffer: byteSize: int name: str params: List[RayTracingShaderParam] hash: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class RayTracingShaderFunctionDesc: attributeSizeInBytes: int identifier: RayTracingShaderID payloadSizeInBytes: int -@define(kw_only=True, slots=False) + +@unitypy_define class RayTracingShaderID: name: str type: int -@define(kw_only=True, slots=False) + +@unitypy_define class RayTracingShaderParam: arraySize: int colCount: int @@ -8464,7 +9214,8 @@ class RayTracingShaderParam: propertySheetType: Optional[int] = None type: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class RayTracingShaderReflectionData: code: List[int] functions: List[RayTracingShaderFunctionDesc] @@ -8474,7 +9225,8 @@ class RayTracingShaderReflectionData: precompiled: Optional[List[int]] = None requirements: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class RayTracingShaderResource: bindPoint: int name: str @@ -8484,7 +9236,8 @@ class RayTracingShaderResource: arraySize: Optional[int] = None multisampled: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class RayTracingShaderResources: builtinSamplers: List[RayTracingShaderBuiltinSampler] constantBuffers: List[RayTracingShaderResource] @@ -8493,23 +9246,27 @@ class RayTracingShaderResources: outputBuffers: List[RayTracingShaderResource] textures: List[RayTracingShaderResource] -@define(kw_only=True, slots=False) + +@unitypy_define class RayTracingShaderVariant: resourceReflectionData: RayTracingShaderReflectionData targetRenderer: int -@define(kw_only=True, slots=False) + +@unitypy_define class Rectf: height: float width: float x: float y: float -@define(kw_only=True, slots=False) + +@unitypy_define class RenderManager(GlobalGameManager): pass -@define(kw_only=True, slots=False) + +@unitypy_define class RenderPassInfo: attachmentCount: int attachments: List[AttachmentInfo] @@ -8520,7 +9277,8 @@ class RenderPassInfo: subPassCount: int subPasses: List[SubPassDescriptor] -@define(kw_only=True, slots=False) + +@unitypy_define class RenderStateBlock: blendState: GfxBlendState depthState: GfxDepthState @@ -8529,11 +9287,13 @@ class RenderStateBlock: stencilRef: int stencilState: GfxStencilState -@define(kw_only=True, slots=False) + +@unitypy_define class RenderStateInfo: renderState: RenderStateBlock -@define(kw_only=True, slots=False) + +@unitypy_define class RendererData: lightmapIndex: int lightmapIndexDynamic: int @@ -8544,12 +9304,14 @@ class RendererData: uvMesh: PPtr[Mesh] explicitProbeSetHash: Optional[Hash128] = None -@define(kw_only=True, slots=False) + +@unitypy_define class ResourceManager_Dependency: m_Dependencies: List[PPtr[Object]] m_Object: PPtr[Object] -@define(kw_only=True, slots=False) + +@unitypy_define class RippleGroup: m_afDirectional_0: float m_afDirectional_1: float @@ -8634,11 +9396,13 @@ class RippleGroup: m_fIndependence: float m_fShimmer: float -@define(kw_only=True, slots=False) + +@unitypy_define class RootMotionData(ABC): pass -@define(kw_only=True, slots=False) + +@unitypy_define class RotationBySpeedModule: curve: MinMaxCurve enabled: bool @@ -8647,7 +9411,8 @@ class RotationBySpeedModule: x: Optional[MinMaxCurve] = None y: Optional[MinMaxCurve] = None -@define(kw_only=True, slots=False) + +@unitypy_define class RotationModule: curve: MinMaxCurve enabled: bool @@ -8655,7 +9420,8 @@ class RotationModule: x: Optional[MinMaxCurve] = None y: Optional[MinMaxCurve] = None -@define(kw_only=True, slots=False) + +@unitypy_define class SBranchWindLevel: m_afDirectionAdherence_0: float m_afDirectionAdherence_1: float @@ -8691,7 +9457,8 @@ class SBranchWindLevel: m_fTwitch: float m_fTwitchFreqScale: float -@define(kw_only=True, slots=False) + +@unitypy_define class SParams: BranchLevel1: SBranchWindLevel BranchLevel2: SBranchWindLevel @@ -8853,7 +9620,8 @@ class SParams: m_fRollingNoiseTwist: float m_fStrengthResponse: float -@define(kw_only=True, slots=False) + +@unitypy_define class SWindGroup: m_afRippleDistance_0: float m_afRippleDistance_1: float @@ -8912,7 +9680,8 @@ class SWindGroup: m_fRollSpeed: float m_fTwitchSharpness: float -@define(kw_only=True, slots=False) + +@unitypy_define class SampleSettings: compressionFormat: int conversionMode: int @@ -8922,12 +9691,14 @@ class SampleSettings: sampleRateSetting: int preloadAudioData: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class SamplerParameter: bindPoint: int sampler: int -@define(kw_only=True, slots=False) + +@unitypy_define class Scene(LevelGameManager): enabled: Optional[bool] = None guid: Optional[GUID] = None @@ -8937,63 +9708,75 @@ class Scene(LevelGameManager): m_QueryMode: Optional[int] = None path: Optional[str] = None -@define(kw_only=True, slots=False) + +@unitypy_define class SceneDataContainer: m_SceneData: List[Tuple[SceneIdentifier, HierarchicalSceneData]] -@define(kw_only=True, slots=False) + +@unitypy_define class SceneIdentifier: guid: GUID handle: int -@define(kw_only=True, slots=False) + +@unitypy_define class SceneObjectIdentifier: targetObject: int targetPrefab: int -@define(kw_only=True, slots=False) + +@unitypy_define class SceneSettings(LevelGameManager): m_PVSData: List[int] m_PVSObjectsArray: List[PPtr[Renderer]] m_PVSPortalsArray: List[PPtr[OcclusionPortal]] m_QueryMode: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class SceneVisibilityData: m_SceneGUID: GUID -@define(kw_only=True, slots=False) + +@unitypy_define class ScriptMapper(GlobalGameManager): m_Shaders: NameToObjectMap m_PreloadShaders: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class SecondarySpriteTexture: name: str texture: PPtr[Texture2D] -@define(kw_only=True, slots=False) + +@unitypy_define class SecondaryTextureSettings: platformSettings: List[TextureImporterPlatformSettings] sRGB: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class SelectorStateConstant: m_FullPathID: int m_IsEntry: bool m_TransitionConstantArray: List[OffsetPtr] -@define(kw_only=True, slots=False) + +@unitypy_define class SelectorTransitionConstant: m_ConditionConstantArray: List[OffsetPtr] m_Destination: int -@define(kw_only=True, slots=False) + +@unitypy_define class SerializedCustomEditorForRenderPipeline: customEditorName: str renderPipelineType: str -@define(kw_only=True, slots=False) + +@unitypy_define class SerializedPass: m_HasInstancingVariant: bool m_Name: str @@ -9017,14 +9800,16 @@ class SerializedPass: m_SerializedKeywordStateMask: Optional[List[int]] = None progRayTracing: Optional[SerializedProgram] = None -@define(kw_only=True, slots=False) + +@unitypy_define class SerializedPlayerSubProgram: m_BlobIndex: int m_GpuProgramType: int m_KeywordIndices: List[int] m_ShaderRequirements: int -@define(kw_only=True, slots=False) + +@unitypy_define class SerializedProgram: m_SubPrograms: List[SerializedSubProgram] m_CommonParameters: Optional[SerializedProgramParameters] = None @@ -9032,7 +9817,8 @@ class SerializedProgram: m_PlayerSubPrograms: Optional[List[List[SerializedPlayerSubProgram]]] = None m_SerializedKeywordStateMask: Optional[List[int]] = None -@define(kw_only=True, slots=False) + +@unitypy_define class SerializedProgramParameters: m_BufferParams: List[BufferBinding] m_ConstantBufferBindings: List[BufferBinding] @@ -9043,11 +9829,13 @@ class SerializedProgramParameters: m_UAVParams: List[UAVParameter] m_VectorParams: List[VectorParameter] -@define(kw_only=True, slots=False) + +@unitypy_define class SerializedProperties: m_Props: List[SerializedProperty] -@define(kw_only=True, slots=False) + +@unitypy_define class SerializedProperty: m_Attributes: List[str] m_DefTexture: SerializedTextureProperty @@ -9060,7 +9848,8 @@ class SerializedProperty: m_Name: str m_Type: int -@define(kw_only=True, slots=False) + +@unitypy_define class SerializedShader: m_CustomEditorName: str m_Dependencies: List[SerializedShaderDependency] @@ -9069,21 +9858,26 @@ class SerializedShader: m_Name: str m_PropInfo: SerializedProperties m_SubShaders: List[SerializedSubShader] - m_CustomEditorForRenderPipelines: Optional[List[SerializedCustomEditorForRenderPipeline]] = None + m_CustomEditorForRenderPipelines: Optional[ + List[SerializedCustomEditorForRenderPipeline] + ] = None m_KeywordFlags: Optional[List[int]] = None m_KeywordNames: Optional[List[str]] = None -@define(kw_only=True, slots=False) + +@unitypy_define class SerializedShaderDependency: from_: str to: str -@define(kw_only=True, slots=False) + +@unitypy_define class SerializedShaderFloatValue: name: Union[FastPropertyName, str] val: float -@define(kw_only=True, slots=False) + +@unitypy_define class SerializedShaderRTBlendState: blendOp: SerializedShaderFloatValue blendOpAlpha: SerializedShaderFloatValue @@ -9093,7 +9887,8 @@ class SerializedShaderRTBlendState: srcBlend: SerializedShaderFloatValue srcBlendAlpha: SerializedShaderFloatValue -@define(kw_only=True, slots=False) + +@unitypy_define class SerializedShaderState: alphaToMask: SerializedShaderFloatValue culling: SerializedShaderFloatValue @@ -9129,7 +9924,8 @@ class SerializedShaderState: conservative: Optional[SerializedShaderFloatValue] = None zClip: Optional[SerializedShaderFloatValue] = None -@define(kw_only=True, slots=False) + +@unitypy_define class SerializedShaderVectorValue: name: Union[FastPropertyName, str] w: SerializedShaderFloatValue @@ -9137,14 +9933,16 @@ class SerializedShaderVectorValue: y: SerializedShaderFloatValue z: SerializedShaderFloatValue -@define(kw_only=True, slots=False) + +@unitypy_define class SerializedStencilOp: comp: SerializedShaderFloatValue fail: SerializedShaderFloatValue pass_: SerializedShaderFloatValue zFail: SerializedShaderFloatValue -@define(kw_only=True, slots=False) + +@unitypy_define class SerializedSubProgram: m_BlobIndex: int m_Channels: ParserBindChannels @@ -9164,31 +9962,37 @@ class SerializedSubProgram: m_UAVParams: Optional[List[UAVParameter]] = None m_VectorParams: Optional[List[VectorParameter]] = None -@define(kw_only=True, slots=False) + +@unitypy_define class SerializedSubShader: m_LOD: int m_Passes: List[SerializedPass] m_Tags: SerializedTagMap -@define(kw_only=True, slots=False) + +@unitypy_define class SerializedTagMap: tags: List[Tuple[str, str]] -@define(kw_only=True, slots=False) + +@unitypy_define class SerializedTextureProperty: m_DefaultName: str m_TexDim: int -@define(kw_only=True, slots=False) + +@unitypy_define class ShaderBindChannel: source: int target: int -@define(kw_only=True, slots=False) + +@unitypy_define class ShaderInfo: variants: List[VariantInfo] -@define(kw_only=True, slots=False) + +@unitypy_define class ShadowSettings: m_Bias: float m_Resolution: int @@ -9202,7 +10006,8 @@ class ShadowSettings: m_SoftnessFade: Optional[float] = None m_UseCullingMatrixOverride: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class ShapeModule: angle: float enabled: bool @@ -9244,7 +10049,8 @@ class ShapeModule: randomPositionAmount: Optional[float] = None sphericalDirectionAmount: Optional[float] = None -@define(kw_only=True, slots=False) + +@unitypy_define class SizeBySpeedModule: curve: MinMaxCurve enabled: bool @@ -9253,7 +10059,8 @@ class SizeBySpeedModule: y: Optional[MinMaxCurve] = None z: Optional[MinMaxCurve] = None -@define(kw_only=True, slots=False) + +@unitypy_define class SizeModule: curve: MinMaxCurve enabled: bool @@ -9261,13 +10068,15 @@ class SizeModule: y: Optional[MinMaxCurve] = None z: Optional[MinMaxCurve] = None -@define(kw_only=True, slots=False) + +@unitypy_define class Skeleton: m_AxesArray: List[Axes] m_ID: List[int] m_Node: List[Node] -@define(kw_only=True, slots=False) + +@unitypy_define class SkeletonBone: m_Name: str m_Position: Vector3f @@ -9276,7 +10085,8 @@ class SkeletonBone: m_ParentName: Optional[str] = None m_TransformModified: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class SkeletonBoneLimit: m_Length: float m_Max: Vector3f @@ -9286,21 +10096,25 @@ class SkeletonBoneLimit: m_PostQ: Optional[Quaternionf] = None m_PreQ: Optional[Quaternionf] = None -@define(kw_only=True, slots=False) + +@unitypy_define class SkeletonMask: m_Data: List[SkeletonMaskElement] -@define(kw_only=True, slots=False) + +@unitypy_define class SkeletonMaskElement: m_Weight: float m_Index: Optional[int] = None m_PathHash: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class SkeletonPose: m_X: List[xform] -@define(kw_only=True, slots=False) + +@unitypy_define class SketchUpImportCamera: aspectRatio: float fov: float @@ -9312,24 +10126,28 @@ class SketchUpImportCamera: farPlane: Optional[float] = None nearPlane: Optional[float] = None -@define(kw_only=True, slots=False) + +@unitypy_define class SketchUpImportData: defaultCamera: SketchUpImportCamera scenes: List[SketchUpImportScene] -@define(kw_only=True, slots=False) + +@unitypy_define class SketchUpImportScene: camera: SketchUpImportCamera name: str -@define(kw_only=True, slots=False) + +@unitypy_define class SnapshotConstant: nameHash: int transitionIndices: List[int] transitionTypes: List[int] values: List[float] -@define(kw_only=True, slots=False) + +@unitypy_define class SoftJointLimit: bounciness: float limit: float @@ -9337,24 +10155,28 @@ class SoftJointLimit: damper: Optional[float] = None spring: Optional[float] = None -@define(kw_only=True, slots=False) + +@unitypy_define class SoftJointLimitSpring: damper: float spring: float -@define(kw_only=True, slots=False) + +@unitypy_define class SortingLayerEntry: name: str uniqueID: int userID: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class SourceAssetIdentifier: assembly: str name: str type: str -@define(kw_only=True, slots=False) + +@unitypy_define class SourceTextureInformation: doesTextureContainAlpha: bool height: int @@ -9362,7 +10184,8 @@ class SourceTextureInformation: doesTextureContainColor: Optional[bool] = None sourceWasHDR: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class SpeedTreeWind: BRANCH_DIRECTIONAL_1: bool BRANCH_DIRECTIONAL_2: bool @@ -9398,7 +10221,8 @@ class SpeedTreeWind: m_fMaxBranchLevel1Length: float m_sParams: SParams -@define(kw_only=True, slots=False) + +@unitypy_define class SpeedTreeWindConfig8: BRANCH_DIRECTIONAL_1: bool BRANCH_DIRECTIONAL_2: bool @@ -9592,7 +10416,8 @@ class SpeedTreeWindConfig8: m_fRollingNoiseTwist: float m_fStrengthResponse: float -@define(kw_only=True, slots=False) + +@unitypy_define class SpeedTreeWindConfig9: m_bDoBranch1: int m_bDoBranch2: int @@ -9621,7 +10446,8 @@ class SpeedTreeWindConfig9: m_fImportScaling: Optional[float] = None pad: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class SphericalHarmonicsL2: sh_10_: float sh_11_: float @@ -9651,12 +10477,14 @@ class SphericalHarmonicsL2: sh__8_: float sh__9_: float -@define(kw_only=True, slots=False) + +@unitypy_define class SplashScreenLogo: duration: float logo: PPtr[Sprite] -@define(kw_only=True, slots=False) + +@unitypy_define class SplatDatabase: m_AlphaTextures: List[PPtr[Texture2D]] m_AlphamapResolution: int @@ -9667,7 +10495,8 @@ class SplatDatabase: m_Splats: Optional[List[SplatPrototype]] = None m_TerrainLayers: Optional[List[PPtr[TerrainLayer]]] = None -@define(kw_only=True, slots=False) + +@unitypy_define class SplatPrototype: texture: PPtr[Texture2D] tileOffset: Vector2f @@ -9676,11 +10505,13 @@ class SplatPrototype: smoothness: Optional[float] = None specularMetallic: Optional[Vector4f] = None -@define(kw_only=True, slots=False) + +@unitypy_define class SpriteAtlasAssetData: packables: List[PPtr[Object]] -@define(kw_only=True, slots=False) + +@unitypy_define class SpriteAtlasData: alphaTexture: PPtr[Texture2D] downscaleMultiplier: float @@ -9692,7 +10523,8 @@ class SpriteAtlasData: atlasRectOffset: Optional[Vector2f] = None secondaryTextures: Optional[List[SecondarySpriteTexture]] = None -@define(kw_only=True, slots=False) + +@unitypy_define class SpriteAtlasEditorData: bindAsDefault: bool cachedData: PPtr[CachedSpriteAtlasRuntimeData] @@ -9702,11 +10534,14 @@ class SpriteAtlasEditorData: platformSettings: List[TextureImporterPlatformSettings] textureSettings: TextureSettings variantMultiplier: float - secondaryTextureSettings: Optional[List[Tuple[str, SecondaryTextureSettings]]] = None + secondaryTextureSettings: Optional[List[Tuple[str, SecondaryTextureSettings]]] = ( + None + ) storedHash: Optional[Hash128] = None totalSpriteSurfaceArea: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class SpriteBone: length: float name: str @@ -9716,20 +10551,24 @@ class SpriteBone: color: Optional[ColorRGBA] = None guid: Optional[str] = None -@define(kw_only=True, slots=False) + +@unitypy_define class SpriteCustomDataEntry: m_Key: str m_Value: str -@define(kw_only=True, slots=False) + +@unitypy_define class SpriteCustomMetadata: m_Entries: List[SpriteCustomDataEntry] -@define(kw_only=True, slots=False) + +@unitypy_define class SpriteData: sprite: PPtr[Object] -@define(kw_only=True, slots=False) + +@unitypy_define class SpriteMetaData: m_Alignment: int m_Name: str @@ -9748,7 +10587,8 @@ class SpriteMetaData: m_Vertices: Optional[List[Vector2f]] = None m_Weights: Optional[List[BoneWeights4]] = None -@define(kw_only=True, slots=False) + +@unitypy_define class SpriteRenderData: settingsRaw: int texture: PPtr[Texture2D] @@ -9767,7 +10607,8 @@ class SpriteRenderData: uvTransform: Optional[Vector4f] = None vertices: Optional[List[SpriteVertex]] = None -@define(kw_only=True, slots=False) + +@unitypy_define class SpriteSheetMetaData: m_Sprites: List[SpriteMetaData] m_Bones: Optional[List[SpriteBone]] = None @@ -9784,7 +10625,8 @@ class SpriteSheetMetaData: m_Vertices: Optional[List[Vector2f]] = None m_Weights: Optional[List[BoneWeights4]] = None -@define(kw_only=True, slots=False) + +@unitypy_define class SpriteTilingProperty: adaptiveTiling: bool adaptiveTilingThreshold: float @@ -9794,12 +10636,14 @@ class SpriteTilingProperty: oldSize: Vector2f pivot: Vector2f -@define(kw_only=True, slots=False) + +@unitypy_define class SpriteVertex: pos: Vector3f uv: Optional[Vector2f] = None -@define(kw_only=True, slots=False) + +@unitypy_define class State(NamedObject): m_IKOnFeet: bool m_Motions: List[PPtr[Motion]] @@ -9811,7 +10655,8 @@ class State(NamedObject): m_CycleOffset: Optional[float] = None m_Mirror: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class StateConstant: m_BlendTreeConstantArray: List[OffsetPtr] m_BlendTreeConstantIndexArray: List[int] @@ -9833,12 +10678,14 @@ class StateConstant: m_TimeParamID: Optional[int] = None m_WriteDefaultValues: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class StateKey: m_LayerIndex: int m_StateID: int -@define(kw_only=True, slots=False) + +@unitypy_define class StateMachine(NamedObject): m_AnyStatePosition: Vector3f m_ChildStateMachine: List[PPtr[StateMachine]] @@ -9849,14 +10696,18 @@ class StateMachine(NamedObject): m_OrderedTransitions: List[Tuple[PPtr[State], List[PPtr[Transition]]]] m_ParentStateMachinePosition: Vector3f m_States: List[PPtr[State]] - m_LocalTransitions: Optional[List[Tuple[PPtr[State], List[PPtr[Transition]]]]] = None + m_LocalTransitions: Optional[List[Tuple[PPtr[State], List[PPtr[Transition]]]]] = ( + None + ) + -@define(kw_only=True, slots=False) +@unitypy_define class StateMachineBehaviourVectorDescription: m_StateMachineBehaviourIndices: List[int] m_StateMachineBehaviourRanges: List[Tuple[StateKey, StateRange]] -@define(kw_only=True, slots=False) + +@unitypy_define class StateMachineConstant: m_AnyStateTransitionConstantArray: List[OffsetPtr] m_DefaultState: int @@ -9865,17 +10716,20 @@ class StateMachineConstant: m_SelectorStateConstantArray: Optional[List[OffsetPtr]] = None m_SynchronizedLayerCount: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class StateRange: m_Count: int m_StartIndex: int -@define(kw_only=True, slots=False) + +@unitypy_define class StaticBatchInfo: firstSubMesh: int subMeshCount: int -@define(kw_only=True, slots=False) + +@unitypy_define class StreamInfo: channelMask: int offset: int @@ -9884,25 +10738,29 @@ class StreamInfo: dividerOp: Optional[int] = None frequency: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class StreamedClip: curveCount: int data: List[int] discreteCurveCount: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class StreamedResource: m_Offset: int m_Size: int m_Source: str -@define(kw_only=True, slots=False) + +@unitypy_define class StreamingInfo: offset: int path: str size: int -@define(kw_only=True, slots=False) + +@unitypy_define class StructParameter: m_ArraySize: int m_Index: int @@ -9911,19 +10769,22 @@ class StructParameter: m_StructSize: int m_VectorMembers: List[VectorParameter] -@define(kw_only=True, slots=False) + +@unitypy_define class SubCollider: m_Collider: PPtr[Collider2D] m_ColliderPaths: List[List[IntPoint]] -@define(kw_only=True, slots=False) + +@unitypy_define class SubEmitterData: emitter: PPtr[ParticleSystem] properties: int type: int emitProbability: Optional[float] = None -@define(kw_only=True, slots=False) + +@unitypy_define class SubMesh: firstByte: int firstVertex: int @@ -9935,7 +10796,8 @@ class SubMesh: topology: Optional[int] = None triangleCount: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class SubModule: enabled: bool subEmitterBirth: Optional[PPtr[ParticleSystem]] = None @@ -9946,18 +10808,21 @@ class SubModule: subEmitterDeath1: Optional[PPtr[ParticleSystem]] = None subEmitters: Optional[List[SubEmitterData]] = None -@define(kw_only=True, slots=False) + +@unitypy_define class SubPassDescriptor: colorOutputs: AttachmentIndexArray flags: int inputs: AttachmentIndexArray -@define(kw_only=True, slots=False) + +@unitypy_define class SubstanceEnumItem: text: str value: int -@define(kw_only=True, slots=False) + +@unitypy_define class SubstanceInput: alteredTexturesUID: List[int] enumValues: List[SubstanceEnumItem] @@ -9976,7 +10841,8 @@ class SubstanceInput: label: Optional[str] = None visibleIf: Optional[str] = None -@define(kw_only=True, slots=False) + +@unitypy_define class SubstanceValue: scalar_0_: float scalar_1_: float @@ -9985,7 +10851,8 @@ class SubstanceValue: texture: PPtr[Texture2D] stringvalue: Optional[str] = None -@define(kw_only=True, slots=False) + +@unitypy_define class TakeInfo: bakeStartTime: float bakeStopTime: float @@ -9997,7 +10864,8 @@ class TakeInfo: stopTime: float internalID: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class Tetrahedron: indices_0_: int indices_1_: int @@ -10009,7 +10877,8 @@ class Tetrahedron: neighbors_2_: int neighbors_3_: int -@define(kw_only=True, slots=False) + +@unitypy_define class TextureImportInstructions: colorSpace: int compressedFormat: int @@ -10028,13 +10897,15 @@ class TextureImportInstructions: recommendedFormat: Optional[int] = None vtOnly: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class TextureImportOutput: sourceTextureInformation: SourceTextureInformation textureImportInstructions: TextureImportInstructions importInspectorWarnings: Optional[str] = None -@define(kw_only=True, slots=False) + +@unitypy_define class TextureImporterPlatformSettings: m_AllowsAlphaSplitting: bool m_AndroidETC2FallbackOverride: int @@ -10049,7 +10920,8 @@ class TextureImporterPlatformSettings: m_ForceMaximumCompressionQuality_BC6H_BC7: Optional[bool] = None m_IgnorePlatformSupport: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class TextureParameter: m_Dim: int m_Index: int @@ -10057,14 +10929,16 @@ class TextureParameter: m_SamplerIndex: int m_MultiSampled: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class TextureParameters: height: int mipLevels: int textureFormat: int width: int -@define(kw_only=True, slots=False) + +@unitypy_define class TextureSettings: anisoLevel: int compressionQuality: int @@ -10076,12 +10950,14 @@ class TextureSettings: sRGB: bool textureCompression: int -@define(kw_only=True, slots=False) + +@unitypy_define class TicksPerSecond: m_Denominator: int m_Numerator: int -@define(kw_only=True, slots=False) + +@unitypy_define class TierGraphicsSettings: renderingPath: int useCascadedShadowMaps: bool @@ -10091,7 +10967,8 @@ class TierGraphicsSettings: realtimeGICPUUsage: Optional[int] = None useHDR: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class Tile: m_TileColorIndex: int m_TileIndex: int @@ -10104,7 +10981,8 @@ class Tile: m_TileFlags: Optional[int] = None m_TileObjectToInstantiateIndex: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class TileAnimationData: m_AnimatedSprites: List[PPtr[Sprite]] m_AnimationSpeed: float @@ -10112,12 +10990,14 @@ class TileAnimationData: m_Flags: Optional[int] = None m_IsLooping: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class TilemapRefCountedData: m_Data: Union[PPtr[GameObject], ColorRGBA, PPtr[Object], Matrix4x4f, PPtr[Sprite]] m_RefCount: int -@define(kw_only=True, slots=False) + +@unitypy_define class TrailModule: colorOverLifetime: MinMaxGradient colorOverTrail: MinMaxGradient @@ -10140,12 +11020,14 @@ class TrailModule: splitSubEmitterRibbons: Optional[bool] = None textureScale: Optional[Vector2f] = None -@define(kw_only=True, slots=False) + +@unitypy_define class TransformMaskElement: m_Path: str m_Weight: float -@define(kw_only=True, slots=False) + +@unitypy_define class Transition(NamedObject): m_Atomic: bool m_Conditions: List[Condition] @@ -10158,7 +11040,8 @@ class Transition(NamedObject): m_TransitionOffset: float m_CanTransitionToSelf: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class TransitionConstant: m_ConditionConstantArray: List[OffsetPtr] m_DestinationState: int @@ -10175,7 +11058,8 @@ class TransitionConstant: m_InterruptionSource: Optional[int] = None m_OrderedInterruption: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class TreeInstance: color: ColorRGBA heightScale: float @@ -10185,13 +11069,15 @@ class TreeInstance: widthScale: float rotation: Optional[float] = None -@define(kw_only=True, slots=False) + +@unitypy_define class TreePrototype: bendFactor: float prefab: PPtr[GameObject] navMeshLod: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class TriggerModule: enabled: bool enter: int @@ -10208,19 +11094,22 @@ class TriggerModule: collisionShape5: Optional[PPtr[Component]] = None primitives: Optional[List[PPtr[Component]]] = None -@define(kw_only=True, slots=False) + +@unitypy_define class UAVParameter: m_Index: int m_NameIndex: int m_OriginalIndex: int -@define(kw_only=True, slots=False) + +@unitypy_define class UVAnimation: cycles: float x_Tile: int y_Tile: int -@define(kw_only=True, slots=False) + +@unitypy_define class UVModule: animationType: int cycles: float @@ -10241,7 +11130,8 @@ class UVModule: timeMode: Optional[int] = None uvChannelMask: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class UnityAdsSettings(GlobalGameManager): m_Enabled: bool m_InitializeOnStartup: bool @@ -10251,7 +11141,8 @@ class UnityAdsSettings(GlobalGameManager): m_GameId: Optional[str] = None m_IosGameId: Optional[str] = None -@define(kw_only=True, slots=False) + +@unitypy_define class UnityAnalyticsSettings: m_Enabled: bool m_InitializeOnStartup: bool @@ -10260,25 +11151,33 @@ class UnityAnalyticsSettings: m_TestConfigUrl: Optional[str] = None m_TestEventUrl: Optional[str] = None -@define(kw_only=True, slots=False) + +@unitypy_define class UnityPropertySheet: - m_Colors: Union[List[Tuple[FastPropertyName, ColorRGBA]], List[Tuple[str, ColorRGBA]]] + m_Colors: Union[ + List[Tuple[FastPropertyName, ColorRGBA]], List[Tuple[str, ColorRGBA]] + ] m_Floats: Union[List[Tuple[FastPropertyName, float]], List[Tuple[str, float]]] - m_TexEnvs: Union[List[Tuple[FastPropertyName, UnityTexEnv]], List[Tuple[str, UnityTexEnv]]] + m_TexEnvs: Union[ + List[Tuple[FastPropertyName, UnityTexEnv]], List[Tuple[str, UnityTexEnv]] + ] m_Ints: Optional[List[Tuple[str, int]]] = None -@define(kw_only=True, slots=False) + +@unitypy_define class UnityPurchasingSettings: m_Enabled: bool m_TestMode: bool -@define(kw_only=True, slots=False) + +@unitypy_define class UnityTexEnv: m_Offset: Vector2f m_Scale: Vector2f m_Texture: PPtr[Texture] -@define(kw_only=True, slots=False) + +@unitypy_define class UpdateZoneInfo: needSwap: bool passIndex: int @@ -10286,18 +11185,21 @@ class UpdateZoneInfo: updateZoneCenter: Vector3f updateZoneSize: Vector3f -@define(kw_only=True, slots=False) + +@unitypy_define class VFXCPUBufferData: data: List[int] -@define(kw_only=True, slots=False) + +@unitypy_define class VFXCPUBufferDesc: capacity: int initialData: VFXCPUBufferData layout: List[VFXLayoutElementDesc] stride: int -@define(kw_only=True, slots=False) + +@unitypy_define class VFXEditorSystemDesc: buffers: List[VFXMapping] capacity: int @@ -10308,7 +11210,8 @@ class VFXEditorSystemDesc: values: List[VFXMapping] name: Optional[str] = None -@define(kw_only=True, slots=False) + +@unitypy_define class VFXEditorTaskDesc: buffers: List[VFXMapping] params: List[VFXMapping] @@ -10318,30 +11221,59 @@ class VFXEditorTaskDesc: values: List[VFXMapping] temporaryBuffers: Optional[List[VFXMappingTemporary]] = None -@define(kw_only=True, slots=False) + +@unitypy_define class VFXEntryExposed: m_Name: str m_Overridden: bool - m_Value: Union[Gradient, Vector3f, float, PPtr[NamedObject], Vector4f, AnimationCurve, PPtr[Object], int, Vector2f, bool, Matrix4x4f] - -@define(kw_only=True, slots=False) + m_Value: Union[ + Gradient, + Vector3f, + float, + PPtr[NamedObject], + Vector4f, + AnimationCurve, + PPtr[Object], + int, + Vector2f, + bool, + Matrix4x4f, + ] + + +@unitypy_define class VFXEntryExpressionValue: m_ExpressionIndex: int - m_Value: Union[Gradient, Vector3f, float, PPtr[NamedObject], Vector4f, AnimationCurve, PPtr[Object], int, Vector2f, bool, Matrix4x4f] - -@define(kw_only=True, slots=False) + m_Value: Union[ + Gradient, + Vector3f, + float, + PPtr[NamedObject], + Vector4f, + AnimationCurve, + PPtr[Object], + int, + Vector2f, + bool, + Matrix4x4f, + ] + + +@unitypy_define class VFXEventDesc: name: str playSystems: List[int] stopSystems: List[int] initSystems: Optional[List[int]] = None -@define(kw_only=True, slots=False) + +@unitypy_define class VFXExposedMapping: mapping: VFXMapping space: int -@define(kw_only=True, slots=False) + +@unitypy_define class VFXExpressionContainer: m_Expressions: List[Expression] m_NeedsLocalToWorld: bool @@ -10354,11 +11286,13 @@ class VFXExpressionContainer: m_NeededMainCameraBuffers: Optional[int] = None m_NeedsMainCamera: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class VFXField: m_Array: Union[List[VFXEntryExpressionValue], List[VFXEntryExposed]] -@define(kw_only=True, slots=False) + +@unitypy_define class VFXGPUBufferDesc: capacity: int layout: List[VFXLayoutElementDesc] @@ -10368,34 +11302,40 @@ class VFXGPUBufferDesc: target: Optional[int] = None type: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class VFXInstanceSplitDesc: values: List[int] -@define(kw_only=True, slots=False) + +@unitypy_define class VFXLayoutElementDesc: name: str offset: VFXLayoutOffset type: int -@define(kw_only=True, slots=False) + +@unitypy_define class VFXLayoutOffset: bucket: int element: int structure: int -@define(kw_only=True, slots=False) + +@unitypy_define class VFXMapping: index: int nameId: str -@define(kw_only=True, slots=False) + +@unitypy_define class VFXMappingTemporary: mapping: VFXMapping pastFrameIndex: int perCameraBuffer: bool -@define(kw_only=True, slots=False) + +@unitypy_define class VFXPropertySheetSerializedBase: m_AnimationCurve: VFXField m_Bool: VFXField @@ -10409,7 +11349,8 @@ class VFXPropertySheetSerializedBase: m_Vector3f: VFXField m_Vector4f: VFXField -@define(kw_only=True, slots=False) + +@unitypy_define class VFXRendererSettings: lightProbeUsage: int motionVectorGenerationMode: int @@ -10418,13 +11359,15 @@ class VFXRendererSettings: shadowCastingMode: int rayTracingMode: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class VFXShaderSourceDesc: compute: bool name: str source: str -@define(kw_only=True, slots=False) + +@unitypy_define class VFXSystemDesc: buffers: List[VFXMapping] capacity: int @@ -10436,7 +11379,8 @@ class VFXSystemDesc: instanceSplitDescs: Optional[List[VFXInstanceSplitDesc]] = None name: Optional[str] = None -@define(kw_only=True, slots=False) + +@unitypy_define class VFXTaskDesc: buffers: List[VFXMapping] params: List[VFXMapping] @@ -10446,7 +11390,8 @@ class VFXTaskDesc: instanceSplitIndex: Optional[int] = None temporaryBuffers: Optional[List[VFXMappingTemporary]] = None -@define(kw_only=True, slots=False) + +@unitypy_define class VFXTemplate: category: str description: str @@ -10454,12 +11399,14 @@ class VFXTemplate: name: str thumbnail: PPtr[Texture2D] -@define(kw_only=True, slots=False) + +@unitypy_define class VFXTemporaryGPUBufferDesc: desc: VFXGPUBufferDesc frameCount: int -@define(kw_only=True, slots=False) + +@unitypy_define class VRSettings: cardboard: Optional[Google] = None daydream: Optional[Google] = None @@ -10469,7 +11416,8 @@ class VRSettings: none: Optional[DeviceNone] = None oculus: Optional[Oculus] = None -@define(kw_only=True, slots=False) + +@unitypy_define class ValueArray: m_BoolValues: List[bool] m_FloatValues: List[float] @@ -10479,27 +11427,32 @@ class ValueArray: m_ScaleValues: Optional[Union[List[float4], List[float3]]] = None m_VectorValues: Optional[List[float4]] = None -@define(kw_only=True, slots=False) + +@unitypy_define class ValueArrayConstant: m_ValueArray: List[ValueConstant] -@define(kw_only=True, slots=False) + +@unitypy_define class ValueConstant: m_ID: int m_Index: int m_Type: int m_TypeID: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class ValueDelta: m_Start: float m_Stop: float -@define(kw_only=True, slots=False) + +@unitypy_define class VariableBoneCountWeights: m_Data: List[int] -@define(kw_only=True, slots=False) + +@unitypy_define class VariantInfo: graphicsStateInfoSet: Optional[List[GraphicsStateInfo]] = None keywordNames: Optional[str] = None @@ -10511,12 +11464,14 @@ class VariantInfo: shaderName: Optional[str] = None subShaderIndex: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class Vector3Curve: curve: AnimationCurve path: str -@define(kw_only=True, slots=False) + +@unitypy_define class VectorParameter: m_ArraySize: int m_Dim: int @@ -10524,7 +11479,8 @@ class VectorParameter: m_NameIndex: int m_Type: int -@define(kw_only=True, slots=False) + +@unitypy_define class VelocityModule: enabled: bool inWorldSpace: bool @@ -10540,7 +11496,8 @@ class VelocityModule: radial: Optional[MinMaxCurve] = None speedModifier: Optional[MinMaxCurve] = None -@define(kw_only=True, slots=False) + +@unitypy_define class VertexData: m_DataSize: bytes m_VertexCount: int @@ -10552,13 +11509,15 @@ class VertexData: m_Streams_2_: Optional[StreamInfo] = None m_Streams_3_: Optional[StreamInfo] = None -@define(kw_only=True, slots=False) + +@unitypy_define class VertexLayoutInfo: vertexChannelsInfo: List[ChannelInfo] vertexStreamCount: int vertexStrides: List[int] -@define(kw_only=True, slots=False) + +@unitypy_define class VideoClipImporterOutput: encodedEndFrame: Optional[int] = None encodedHeight: Optional[int] = None @@ -10580,7 +11539,8 @@ class VideoClipImporterOutput: streamedResource: Optional[StreamedResource] = None transcodeSkipped: Optional[bool] = None -@define(kw_only=True, slots=False) + +@unitypy_define class VideoClipImporterTargetSettings: aspectRatio: int bitrateMode: int @@ -10591,7 +11551,8 @@ class VideoClipImporterTargetSettings: resizeFormat: int spatialQuality: int -@define(kw_only=True, slots=False) + +@unitypy_define class VisualEffectInfo: m_Buffers: List[VFXGPUBufferDesc] m_CPUBuffers: List[VFXCPUBufferDesc] @@ -10612,7 +11573,8 @@ class VisualEffectInfo: m_RuntimeVersion: Optional[int] = None m_TemporaryBuffers: Optional[List[VFXTemporaryGPUBufferDesc]] = None -@define(kw_only=True, slots=False) + +@unitypy_define class VisualEffectSettings: m_CullingFlags: int m_InitialEventName: str @@ -10624,7 +11586,8 @@ class VisualEffectSettings: m_InstancingDisabledReason: Optional[int] = None m_InstancingMode: Optional[int] = None -@define(kw_only=True, slots=False) + +@unitypy_define class WheelFrictionCurve: asymptoteSlip: Optional[float] = None asymptoteValue: Optional[float] = None @@ -10637,23 +11600,27 @@ class WheelFrictionCurve: m_Stiffness: Optional[float] = None stiffnessFactor: Optional[float] = None -@define(kw_only=True, slots=False) + +@unitypy_define class bitset: bitCount: int bitblocks: bytes -@define(kw_only=True, slots=False) + +@unitypy_define class int2_storage: x: int y: int -@define(kw_only=True, slots=False) + +@unitypy_define class int3_storage: x: int y: int z: int -@define(kw_only=True, slots=False) + +@unitypy_define class xform: q: float4 s: Union[float3, float4] diff --git a/generators/ClassesGenerator.py b/generators/ClassesGenerator.py index a58578a8..1c9ea09d 100644 --- a/generators/ClassesGenerator.py +++ b/generators/ClassesGenerator.py @@ -40,6 +40,53 @@ "TypelessData": "bytes", } +GENERATED_HEADER = """ +# type: ignore +from __future__ import annotations + +from abc import ABC +from typing import List, Optional, Tuple, TypeVar, Union + +from attrs import define as attrs_define + +from .math import ( + ColorRGBA, + Matrix3x4f, + Matrix4x4f, + Quaternionf, + Vector2f, + Vector3f, + Vector4f, + float3, + float4, +) +from .Object import Object +from .PPtr import PPtr + +T = TypeVar("T") + + +def unitypy_define(cls: T) -> T: + \"\"\" + A hacky solution to bypass multiple problems related to attrs and inheritance. + + The class inheritance is very lax and based on the typetrees. + Some of the child classes might not have the same attributes as the parent class, + which would make type-hinting more tricky, and breaks attrs.define. + + Therefore this function bypasses the issue + by redifining the bases for problematic classes for the attrs.define call. + \"\"\" + bases = cls.__bases__ + if bases[0] in (object, Object, ABC): + cls = attrs_define(cls, slots=True, unsafe_hash=True) + else: + cls.__bases__ = (Object,) + cls = attrs_define(cls, slots=False, unsafe_hash=True) + cls.__bases__ = bases + return cls +"""[0:] + # LIST_BASE_TYPE_MAP = { # "short": "np.int16", # "int": "np.int32", @@ -140,7 +187,7 @@ def generate_str(self) -> str: ) return "\n".join( [ - "@define(kw_only=True, slots=False)", + "@unitypy_define", f"class {self.name}{parentsString}:", *field_strings, ] @@ -318,14 +365,7 @@ def main(): fp = os.path.join(ROOT, "UnityPy", "classes", "generated.py") with open(fp, "wt", encoding="utf8") as f: - f.write("#type: ignore\n") - f.write("from __future__ import annotations\n") - f.write("from abc import ABC\n") - f.write("from attrs import define\n") - f.write("from typing import List, Optional, Tuple, Union\n\n") - f.write(f"from .math import {', '.join(MATH_CLASSES)}\n") - f.write("from .Object import Object\n") - f.write("from .PPtr import PPtr\n") + f.write(GENERATED_HEADER) f.write("\n\n") f.write( From 7e0da84124a13154ce86cfdb7e805dd2264ce320 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Mon, 30 Sep 2024 17:05:59 +0200 Subject: [PATCH 120/403] 1.20.3 version bump --- UnityPy/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UnityPy/__init__.py b/UnityPy/__init__.py index bd88b8a9..fff18d2a 100644 --- a/UnityPy/__init__.py +++ b/UnityPy/__init__.py @@ -1,4 +1,4 @@ -__version__ = "1.20.2" +__version__ = "1.20.3" from .environment import Environment as Environment from .helpers.ArchiveStorageManager import ( From 8fcc664d1f5d24d8d5ab8b96e3db50728c0a8bb1 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Mon, 30 Sep 2024 17:07:15 +0200 Subject: [PATCH 121/403] publish.yml - use macos-13 instead of 11, remove redundant universal2 wheels --- .github/workflows/publish.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 9ac69133..67a99c1c 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -14,7 +14,7 @@ jobs: strategy: fail-fast: true matrix: - os: ["ubuntu-20.04", "windows-2019", "macos-11"] + os: ["ubuntu-20.04", "windows-2019", "macos-13"] cp: ["cp37", "cp38", "cp39", "cp310", "cp311", "cp312", "cp313"] @@ -45,7 +45,7 @@ jobs: uses: pypa/cibuildwheel@v2.20.0 env: CIBW_ARCHS_LINUX: auto aarch64 - CIBW_ARCHS_MACOS: x86_64 arm64 universal2 + CIBW_ARCHS_MACOS: x86_64 arm64 CIBW_BUILD: | ${{ matrix.cp }}-manylinux_x86_64 ${{ matrix.cp }}-manylinux_i686 @@ -54,7 +54,6 @@ jobs: ${{ matrix.cp }}-win32 ${{ matrix.cp }}-macosx_x86_64 ${{ matrix.cp }}-macosx_arm64 - ${{ matrix.cp }}-macosx_universal2 # Disabled repair wheel since the fmob lib is not compatible CIBW_REPAIR_WHEEL_COMMAND: '' CIBW_REPAIR_WHEEL_COMMAND_LINUX: 'mv {wheel} {dest_dir}/"$(basename {wheel} | sed "s/-linux_/-manylinux_2_17_/")"' From 023f3dfd0e0472c485cb9f2d3720db962738a639 Mon Sep 17 00:00:00 2001 From: mos9527 <31397301+mos9527@users.noreply.github.com> Date: Sun, 6 Oct 2024 05:33:14 +0800 Subject: [PATCH 122/403] SerializedType - fix `attrs` accidentally removing default class attributes (#272) --- UnityPy/files/SerializedFile.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/UnityPy/files/SerializedFile.py b/UnityPy/files/SerializedFile.py index f22e5124..e5ef1d63 100644 --- a/UnityPy/files/SerializedFile.py +++ b/UnityPy/files/SerializedFile.py @@ -106,7 +106,7 @@ def IsPatch(self): return self.build_type == "p" -@define(slots=True) +@define(slots=True, init=False) class SerializedType: class_id: int is_stripped_type: Optional[bool] = None @@ -129,6 +129,7 @@ def __init__( ): version = serialized_file.header.version self.class_id = reader.read_int() + self.__attrs_init__(self.class_id) if version >= 16: self.is_stripped_type = reader.read_boolean() From 4f14a3882a7a6f0cbb7a904a824f3b19bdd7ecce Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Sun, 6 Oct 2024 00:05:39 +0200 Subject: [PATCH 123/403] 1.20.4 version bump --- UnityPy/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UnityPy/__init__.py b/UnityPy/__init__.py index fff18d2a..2f91fef7 100644 --- a/UnityPy/__init__.py +++ b/UnityPy/__init__.py @@ -1,4 +1,4 @@ -__version__ = "1.20.3" +__version__ = "1.20.4" from .environment import Environment as Environment from .helpers.ArchiveStorageManager import ( From edd1df4479f406b216904e74f06b2a506e541824 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Sun, 13 Oct 2024 21:59:17 +0200 Subject: [PATCH 124/403] remove legacy C AnimationClip --- UnityPyBoost/AnimationClip.cpp | 150 --------------------------------- UnityPyBoost/AnimationClip.hpp | 5 -- UnityPyBoost/Mesh.hpp | 1 - UnityPyBoost/UnityPyBoost.cpp | 9 -- 4 files changed, 165 deletions(-) delete mode 100644 UnityPyBoost/AnimationClip.cpp delete mode 100644 UnityPyBoost/AnimationClip.hpp diff --git a/UnityPyBoost/AnimationClip.cpp b/UnityPyBoost/AnimationClip.cpp deleted file mode 100644 index 0a447f4d..00000000 --- a/UnityPyBoost/AnimationClip.cpp +++ /dev/null @@ -1,150 +0,0 @@ -#include "AnimationClip.hpp" -#include - -#define MIN(x, y) (((x) < (y)) ? (x) : (y)) - -/* AnimationClip.py */ -static float *UnpackFloats(uint32_t m_NumItems, float m_Range, float m_Start, uint8_t *m_Data, char m_BitSize, int itemCountInChunk, int chunkStride, int start, int numChunks) -{ - int bitPos = m_BitSize * start; - int indexPos = bitPos / 8; - bitPos %= 8; - - float scale = 1.0f / m_Range; - if (numChunks == -1) - numChunks = (int)m_NumItems / itemCountInChunk; - - // TODO: might be better to use ulong instead of uint - uint32_t end = chunkStride * numChunks / 4; - // TODO: check if this is correct - float *data = (float *)malloc(sizeof(float) * numChunks * itemCountInChunk); - float *dataStart = data; - for (uint32_t index = 0; index != end; index += chunkStride / 4) - { - for (int i = 0; i < itemCountInChunk; ++i) - { - uint32_t x = 0; - int bits = 0; - while (bits < m_BitSize) - { - x |= (uint32_t)((m_Data[indexPos] >> bitPos) << bits); - int num = MIN(m_BitSize - bits, 8 - bitPos); - bitPos += num; - bits += num; - if (bitPos == 8) - { - indexPos++; - bitPos = 0; - } - } - x &= (uint32_t)(1 << m_BitSize) - 1u; - *data++ = (x / (scale * ((1 << m_BitSize) - 1)) + m_Start); - } - } - return dataStart; -} - -// TODO: check if bitPos, bits, and num can be reduced to chars -static int *UnpackInts(uint32_t m_NumItems, uint8_t *m_Data, char m_BitSize) -{ - int *data = (int *)malloc(m_NumItems * sizeof(int)); - - int indexPos = 0; - int bitPos = 0; - for (uint32_t i = 0; i < m_NumItems; i++) - { - int bits = 0; - data[i] = 0; - while (bits < m_BitSize) - { - data[i] |= (m_Data[indexPos] >> bitPos) << bits; - int num = MIN(m_BitSize - bits, 8 - bitPos); - bitPos += num; - bits += num; - if (bitPos == 8) - { - indexPos++; - bitPos = 0; - } - } - data[i] &= (1 << m_BitSize) - 1; - } - return data; -} - -// TODO: implement unpack quaternions - -PyObject *unpack_floats(PyObject *self, PyObject *args) -{ - // define vars - uint32_t m_NumItems; - float m_Range; - float m_Start; - uint8_t *m_Data; - char m_BitSize; - int itemCountInChunk; - int chunkStride; - int start; - int numChunks; - Py_ssize_t data_size; - - start = 0; - numChunks = -1; - if (!PyArg_ParseTuple(args, "Iffy#bii|ii", &m_NumItems, &m_Range, &m_Start, &m_Data, &data_size, &m_BitSize, &itemCountInChunk, &chunkStride, &start, &numChunks)) - return NULL; - - // decode - float *array = UnpackFloats(m_NumItems, m_Range, m_Start, m_Data, m_BitSize, itemCountInChunk, chunkStride, start, numChunks); - - if (numChunks == -1) - numChunks = (int)m_NumItems / itemCountInChunk; - Py_ssize_t array_len = numChunks * itemCountInChunk; - // return - PyObject *lst = PyList_New(array_len); - if (!lst) - return NULL; - for (Py_ssize_t i = 0; i < array_len; i++) - { - PyObject *num = PyFloat_FromDouble(array[i]); - if (!num) - { - Py_DECREF(lst); - return NULL; - } - PyList_SET_ITEM(lst, i, num); // reference to num stolen - } - free(array); - return lst; -} - -PyObject *unpack_ints(PyObject *self, PyObject *args) -{ - // define vars - uint32_t m_NumItems; - uint8_t *m_Data; - char m_BitSize; - Py_ssize_t data_size; - - if (!PyArg_ParseTuple(args, "Iy#b", &m_NumItems, &m_Data, &data_size, &m_BitSize)) - return NULL; - - // decode - int *array = UnpackInts(m_NumItems, m_Data, m_BitSize); - - // return - PyObject *lst = PyList_New(m_NumItems); - if (!lst) - return NULL; - for (uint32_t i = 0; i < m_NumItems; i++) - { - PyObject *num = PyLong_FromLong(array[i]); - if (!num) - { - Py_DECREF(lst); - return NULL; - } - PyList_SET_ITEM(lst, i, num); // reference to num stolen - } - free(array); - return lst; -} \ No newline at end of file diff --git a/UnityPyBoost/AnimationClip.hpp b/UnityPyBoost/AnimationClip.hpp deleted file mode 100644 index f231d55f..00000000 --- a/UnityPyBoost/AnimationClip.hpp +++ /dev/null @@ -1,5 +0,0 @@ -#define PY_SSIZE_T_CLEAN -#pragma once -#include -PyObject *unpack_floats(PyObject *self, PyObject *args); -PyObject *unpack_ints(PyObject *self, PyObject *args); \ No newline at end of file diff --git a/UnityPyBoost/Mesh.hpp b/UnityPyBoost/Mesh.hpp index 6f0d87ca..db18f107 100644 --- a/UnityPyBoost/Mesh.hpp +++ b/UnityPyBoost/Mesh.hpp @@ -1,6 +1,5 @@ #define PY_SSIZE_T_CLEAN #pragma once -#include "AnimationClip.hpp" #include PyObject *unpack_vertexdata(PyObject *self, PyObject *args); \ No newline at end of file diff --git a/UnityPyBoost/UnityPyBoost.cpp b/UnityPyBoost/UnityPyBoost.cpp index fab8de5f..366f971a 100644 --- a/UnityPyBoost/UnityPyBoost.cpp +++ b/UnityPyBoost/UnityPyBoost.cpp @@ -1,7 +1,6 @@ #define PY_SSIZE_T_CLEAN #pragma once #include -#include "AnimationClip.hpp" #include "Mesh.hpp" #include "TextureSwizzler.hpp" #include "TypeTreeHelper.hpp" @@ -9,14 +8,6 @@ /* Mesh.py */ static struct PyMethodDef method_table[] = { - {"unpack_floats", - (PyCFunction)unpack_floats, - METH_VARARGS, - "replacement for PackedFloatVector.unpack_floats"}, - {"unpack_ints", - (PyCFunction)unpack_ints, - METH_VARARGS, - "replacement for PackedIntVector.unpack_ints"}, {"unpack_vertexdata", (PyCFunction)unpack_vertexdata, METH_VARARGS, From fa26e22c131305b376586d545d21cdb6502e673c Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Mon, 14 Oct 2024 20:36:58 +0200 Subject: [PATCH 125/403] fix Switch texture deswizzling --- README.md | 1 + UnityPy/export/Texture2DConverter.py | 34 ++-- UnityPy/helpers/TextureSwizzler.py | 258 +++++++++++---------------- UnityPyBoost/TextureSwizzler.cpp | 96 ---------- UnityPyBoost/TextureSwizzler.hpp | 5 - UnityPyBoost/UnityPyBoost.cpp | 5 - 6 files changed, 123 insertions(+), 276 deletions(-) delete mode 100644 UnityPyBoost/TextureSwizzler.cpp delete mode 100644 UnityPyBoost/TextureSwizzler.hpp diff --git a/README.md b/README.md index 74c13144..ea0b67b9 100644 --- a/README.md +++ b/README.md @@ -413,3 +413,4 @@ many thanks to: - [Perfare](https://github.com/Perfare) for creating and maintaining and every contributor of [AssetStudio](https://github.com/Perfare/AssetStudio) - [ds5678](https://github.com/ds5678) for the [TypeTreeDumps](https://github.com/AssetRipper/TypeTreeDumps) and the [custom minimal Tpk format](https://github.com/AssetRipper/Tpk) - [Razmoth](https://github.com/Razmoth) for figuring out and sharing Unity CN's AssetBundle decryption ([src](https://github.com/Razmoth/PGRStudio)). +- [nesrak1](https://github.com/nesrak1) for figuring out the [Switch texture swizzling](https://github.com/nesrak1/UABEA/blob/master/TexturePlugin/Texture2DSwitchDeswizzler.cs) \ No newline at end of file diff --git a/UnityPy/export/Texture2DConverter.py b/UnityPy/export/Texture2DConverter.py index 3e731c4e..2fbbbb1e 100644 --- a/UnityPy/export/Texture2DConverter.py +++ b/UnityPy/export/Texture2DConverter.py @@ -150,8 +150,17 @@ def parse_image_data( f"Not implemented texture format: {texture_format.name}" ) - if texture_format in XBOX_SWAP_FORMATS: - image_data = swap_bytes_for_xbox(image_data, platform) + if platform == BuildTarget.XBOX360 and texture_format in XBOX_SWAP_FORMATS: + image_data = swap_bytes_for_xbox(image_data) + elif platform == BuildTarget.Switch and platform_blob is not None: + gobsPerBlock = TextureSwizzler.get_switch_gobs_per_block(platform_blob) + block_size = TextureSwizzler.TEXTUREFORMAT_BLOCK_SIZE_MAP[texture_format] + padded_size = TextureSwizzler.get_padded_texture_size( + width, height, *block_size, gobsPerBlock + ) + image_data = TextureSwizzler.deswizzle( + image_data, *padded_size, *block_size, gobsPerBlock + ) if not isinstance(texture_format, TextureFormat): texture_format = TextureFormat(texture_format) @@ -169,33 +178,18 @@ def parse_image_data( img = selection[0](image_data, width, height, *selection[1:]) - if platform == BuildTarget.Switch and platform_blob is not None: - gobsPerBlock = TextureSwizzler.get_switch_gobs_per_block(platform_blob) - blockSize = TextureSwizzler.TEXTUREFORMAT_BLOCK_SIZE_MAP[texture_format] - img = TextureSwizzler.switch_deswizzle(img, blockSize, gobsPerBlock) - if img and flip: return img.transpose(Image.FLIP_TOP_BOTTOM) return img -def swap_bytes_for_xbox(image_data: bytes, build_target: BuildTarget) -> bytes: +def swap_bytes_for_xbox(image_data: bytes) -> bytes: """swaps the texture bytes This is required for textures deployed on XBOX360. - - :param image_data: texture data - :type image_data: bytes - :param build_target: platform of the asset - :type build_target: BuildTarget - :return: swapped data if platform = XBOX360 else data - :rtype: bytes """ - if ( - build_target == BuildTarget.XBOX360 - ): # swap bytes for Xbox confirmed,PS3 not encountered - for i in range(0, len(image_data), 2): - image_data[i : i + 2] = image_data[i : i + 2][::-1] + for i in range(0, len(image_data), 2): + image_data[i : i + 2] = image_data[i : i + 2][::-1] return image_data diff --git a/UnityPy/helpers/TextureSwizzler.py b/UnityPy/helpers/TextureSwizzler.py index 9f9dafaf..33f64c94 100644 --- a/UnityPy/helpers/TextureSwizzler.py +++ b/UnityPy/helpers/TextureSwizzler.py @@ -1,177 +1,135 @@ # based on https://github.com/nesrak1/UABEA/blob/master/TexturePlugin/Texture2DSwitchDeswizzler.cs from typing import Dict, Tuple -from PIL import Image - from ..enums import TextureFormat -try: - from ..UnityPyBoost import switch_deswizzle as switch_deswizzle_c -except: - switch_deswizzle_c = None - - -GOB_X_BLOCK_COUNT = 4 -GOB_Y_BLOCK_COUNT = 8 -BLOCKS_IN_GOB = GOB_X_BLOCK_COUNT * GOB_Y_BLOCK_COUNT +GOB_X_TEXEL_COUNT = 4 +GOB_Y_TEXEL_COUNT = 8 +TEXEL_BYTE_SIZE = 16 +TEXELS_IN_GOB = GOB_X_TEXEL_COUNT * GOB_Y_TEXEL_COUNT +GOB_MAP = [ + (((l >> 3) & 0b10) | ((l >> 1) & 0b1), ((l >> 1) & 0b110) | (l & 0b1)) + for l in range(TEXELS_IN_GOB) +] def ceil_divide(a: int, b: int) -> int: - return (a + b - 1) / b - - -def switch_deswizzle( - src_image: Image.Image, block_size: Tuple[int, int], gobs_per_block: int -) -> Image.Image: - src_bytes = src_image.tobytes() - pixel_width = len(src_image.mode) - - if switch_deswizzle_c: - dst_bytes = switch_deswizzle_c( - src_bytes, pixel_width, *src_image.size, *block_size, gobs_per_block - ) - return Image.frombytes(src_image.mode, src_image.size, dst_bytes) - - dst_bytes = bytearray(len(src_bytes)) - - width, height = src_image.size - block_width, block_height = block_size - block_count_x = width // block_width - block_count_y = height // block_height - - gob_count_x = block_count_x // GOB_X_BLOCK_COUNT - gob_count_y = block_count_y // GOB_Y_BLOCK_COUNT - - src_x = 0 - src_y = 0 - - block_pixel_width = block_width * pixel_width - row_pixel_width = width * pixel_width - data_size = len(src_bytes) - - GOB_MAP = [ - (((l >> 3) & 0b10) | ((l >> 1) & 0b1), ((l >> 1) & 0b110) | (l & 0b1)) - for l in range(BLOCKS_IN_GOB) - ] - - for y in range(gob_count_y): - for x in range(gob_count_x): - for k in range(gobs_per_block): + return (a + b - 1) // b + + +def deswizzle( + data: bytes, + width: int, + height: int, + block_width: int, + block_height: int, + texels_per_block: int, +) -> bytearray: + block_count_x = ceil_divide(width, block_width) + block_count_y = ceil_divide(height, block_height) + gob_count_x = block_count_x // GOB_X_TEXEL_COUNT + gob_count_y = block_count_y // GOB_Y_TEXEL_COUNT + new_data = bytearray(len(data)) + data_view = memoryview(data) + + for i in range(gob_count_y // texels_per_block): + for j in range(gob_count_x): + base_gob_dst_x = j * 4 + for k in range(texels_per_block): + base_gob_dst_y = (i * texels_per_block + k) * GOB_Y_TEXEL_COUNT for gob_x, gob_y in GOB_MAP: - gob_dst_x = x * GOB_X_BLOCK_COUNT + gob_x - gob_dst_y = (y * gobs_per_block + k) * GOB_Y_BLOCK_COUNT + gob_y - - src_offset = ( - src_x * block_width + (src_y * block_height) * width - ) * pixel_width dst_offset = ( - gob_dst_x * block_width + (gob_dst_y * block_height) * width - ) * pixel_width - - for by in range(block_height): - if dst_offset > data_size or src_offset > data_size: - break - copy_width = block_pixel_width - if (data_size - src_offset) < block_pixel_width: - copy_width = data_size - src_offset - elif (data_size - dst_offset) < block_pixel_width: - copy_width = data_size - dst_offset - - dst_bytes[dst_offset : dst_offset + copy_width] = src_bytes[ - src_offset : src_offset + copy_width - ] - src_offset += row_pixel_width - dst_offset += row_pixel_width - - src_x += 1 - if src_x >= block_count_x: - src_x = 0 - src_y += 1 - - return Image.frombytes(src_image.mode, src_image.size, dst_bytes) - - -def switch_swizzle( - src_image: Image.Image, block_size: Tuple[int, int], gobs_per_block: int -) -> Image.Image: - dstImage = Image.new(src_image.mode, src_image.size) - - blockCountX, blockCountY = map(ceil_divide, zip(src_image.size, block_size)) - - gob_count_x = blockCountX / GOB_X_BLOCK_COUNT - gob_count_y = blockCountY / GOB_Y_BLOCK_COUNT - - dstX = 0 - dstY = 0 - - for i in range(gob_count_y): - for j in range(gob_count_x): - for k in range(gobs_per_block): - for l in range(BLOCKS_IN_GOB): - # todo: use table for speedy boi - gobX = ((l >> 3) & 0b10) | ((l >> 1) & 0b1) - gobY = ((l >> 1) & 0b110) | (l & 0b1) - gobSrcX = j * GOB_X_BLOCK_COUNT + gobX - gobSrcY = (i * gobs_per_block + k) * GOB_Y_BLOCK_COUNT + gobY - CopyBlock( - src_image, dstImage, gobSrcX, gobSrcY, dstX, dstY, *block_size - ) - - dstX += 1 - if dstX >= blockCountX: - dstX = 0 - dstY += 1 - - return dstImage + (base_gob_dst_y + gob_y) * block_count_x + + (base_gob_dst_x + gob_x) + ) * TEXEL_BYTE_SIZE + new_data[dst_offset : dst_offset + TEXEL_BYTE_SIZE] = data_view[ + :TEXEL_BYTE_SIZE + ] + data_view = data_view[TEXEL_BYTE_SIZE:] + return new_data + + +# def switch_swizzle( +# src_image: Image.Image, block_size: Tuple[int, int], texels_per_block: int +# ) -> Image.Image: +# dstImage = Image.new(src_image.mode, src_image.size) + +# blockCountX, blockCountY = map(ceil_divide, zip(src_image.size, block_size)) + +# gob_count_x = blockCountX / GOB_X_BLOCK_COUNT +# gob_count_y = blockCountY / GOB_Y_BLOCK_COUNT + +# dstX = 0 +# dstY = 0 + +# for i in range(gob_count_y): +# for j in range(gob_count_x): +# for k in range(texels_per_block): +# for l in range(BLOCKS_IN_GOB): +# # todo: use table for speedy boi +# gobX = ((l >> 3) & 0b10) | ((l >> 1) & 0b1) +# gobY = ((l >> 1) & 0b110) | (l & 0b1) +# gobSrcX = j * GOB_X_BLOCK_COUNT + gobX +# gobSrcY = (i * texels_per_block + k) * GOB_Y_BLOCK_COUNT + gobY +# CopyBlock( +# src_image, dstImage, gobSrcX, gobSrcY, dstX, dstY, *block_size +# ) + +# dstX += 1 +# if dstX >= blockCountX: +# dstX = 0 +# dstY += 1 + +# return dstImage # this should be the amount of pixels that can fit 16 bytes TEXTUREFORMAT_BLOCK_SIZE_MAP: Dict[TextureFormat, Tuple[int, int]] = { - TextureFormat.Alpha8: [16, 1], # 1 byte per pixel - TextureFormat.ARGB4444: [8, 1], # 2 bytes per pixel - TextureFormat.RGBA32: [4, 1], # 4 bytes per pixel - TextureFormat.ARGB32: [4, 1], # 4 bytes per pixel - TextureFormat.ARGBFloat: [1, 1], # 16 bytes per pixel (?) - TextureFormat.RGB565: [8, 1], # 2 bytes per pixel - TextureFormat.R16: [8, 1], # 2 bytes per pixel - TextureFormat.DXT1: [8, 4], # 8 bytes per 4x4=16 pixels - TextureFormat.DXT5: [4, 4], # 16 bytes per 4x4=16 pixels - TextureFormat.RGBA4444: [8, 1], # 2 bytes per pixel - TextureFormat.BGRA32: [4, 1], # 4 bytes per pixel - TextureFormat.BC6H: [4, 4], # 16 bytes per 4x4=16 pixels - TextureFormat.BC7: [4, 4], # 16 bytes per 4x4=16 pixels - TextureFormat.BC4: [8, 4], # 8 bytes per 4x4=16 pixels - TextureFormat.BC5: [4, 4], # 16 bytes per 4x4=16 pixels - TextureFormat.ASTC_RGB_4x4: [4, 4], # 16 bytes per 4x4=16 pixels - TextureFormat.ASTC_RGB_5x5: [5, 5], # 16 bytes per 5x5=25 pixels - TextureFormat.ASTC_RGB_6x6: [6, 6], # 16 bytes per 6x6=36 pixels - TextureFormat.ASTC_RGB_8x8: [8, 8], # 16 bytes per 8x8=64 pixels - TextureFormat.ASTC_RGB_10x10: [10, 10], # 16 bytes per 10x10=100 pixels - TextureFormat.ASTC_RGB_12x12: [12, 12], # 16 bytes per 12x12=144 pixels - TextureFormat.ASTC_RGBA_4x4: [4, 4], # 16 bytes per 4x4=16 pixels - TextureFormat.ASTC_RGBA_5x5: [5, 5], # 16 bytes per 5x5=25 pixels - TextureFormat.ASTC_RGBA_6x6: [6, 6], # 16 bytes per 6x6=36 pixels - TextureFormat.ASTC_RGBA_8x8: [8, 8], # 16 bytes per 8x8=64 pixels - TextureFormat.ASTC_RGBA_10x10: [10, 10], # 16 bytes per 10x10=100 pixels - TextureFormat.ASTC_RGBA_12x12: [12, 12], # 16 bytes per 12x12=144 pixels - TextureFormat.RG16: [8, 1], # 2 bytes per pixel - TextureFormat.R8: [16, 1], # 1 byte per pixel + TextureFormat.Alpha8: (16, 1), # 1 byte per pixel + TextureFormat.ARGB4444: (8, 1), # 2 bytes per pixel + TextureFormat.RGBA32: (4, 1), # 4 bytes per pixel + TextureFormat.ARGB32: (4, 1), # 4 bytes per pixel + TextureFormat.ARGBFloat: (1, 1), # 16 bytes per pixel (?) + TextureFormat.RGB565: (8, 1), # 2 bytes per pixel + TextureFormat.R16: (8, 1), # 2 bytes per pixel + TextureFormat.DXT1: (8, 4), # 8 bytes per 4x4=16 pixels + TextureFormat.DXT5: (4, 4), # 16 bytes per 4x4=16 pixels + TextureFormat.RGBA4444: (8, 1), # 2 bytes per pixel + TextureFormat.BGRA32: (4, 1), # 4 bytes per pixel + TextureFormat.BC6H: (4, 4), # 16 bytes per 4x4=16 pixels + TextureFormat.BC7: (4, 4), # 16 bytes per 4x4=16 pixels + TextureFormat.BC4: (8, 4), # 8 bytes per 4x4=16 pixels + TextureFormat.BC5: (4, 4), # 16 bytes per 4x4=16 pixels + TextureFormat.ASTC_RGB_4x4: (4, 4), # 16 bytes per 4x4=16 pixels + TextureFormat.ASTC_RGB_5x5: (5, 5), # 16 bytes per 5x5=25 pixels + TextureFormat.ASTC_RGB_6x6: (6, 6), # 16 bytes per 6x6=36 pixels + TextureFormat.ASTC_RGB_8x8: (8, 8), # 16 bytes per 8x8=64 pixels + TextureFormat.ASTC_RGB_10x10: (10, 10), # 16 bytes per 10x10=100 pixels + TextureFormat.ASTC_RGB_12x12: (12, 12), # 16 bytes per 12x12=144 pixels + TextureFormat.ASTC_RGBA_4x4: (4, 4), # 16 bytes per 4x4=16 pixels + TextureFormat.ASTC_RGBA_5x5: (5, 5), # 16 bytes per 5x5=25 pixels + TextureFormat.ASTC_RGBA_6x6: (6, 6), # 16 bytes per 6x6=36 pixels + TextureFormat.ASTC_RGBA_8x8: (8, 8), # 16 bytes per 8x8=64 pixels + TextureFormat.ASTC_RGBA_10x10: (10, 10), # 16 bytes per 10x10=100 pixels + TextureFormat.ASTC_RGBA_12x12: (12, 12), # 16 bytes per 12x12=144 pixels + TextureFormat.RG16: (8, 1), # 2 bytes per pixel + TextureFormat.R8: (16, 1), # 1 byte per pixel } def get_padded_texture_size( - width: int, height: int, block_width: int, block_height: int, gobs_per_block: int + width: int, height: int, block_width: int, block_height: int, texels_per_block: int ): width = ( - ceil_divide(width, block_width * GOB_X_BLOCK_COUNT) + ceil_divide(width, block_width * GOB_X_TEXEL_COUNT) * block_width - * GOB_X_BLOCK_COUNT + * GOB_X_TEXEL_COUNT ) height = ( - ceil_divide(height, block_height * GOB_Y_BLOCK_COUNT * gobs_per_block) + ceil_divide(height, block_height * GOB_Y_TEXEL_COUNT * texels_per_block) * block_height - * GOB_Y_BLOCK_COUNT - * gobs_per_block + * GOB_Y_TEXEL_COUNT + * texels_per_block ) return width, height diff --git a/UnityPyBoost/TextureSwizzler.cpp b/UnityPyBoost/TextureSwizzler.cpp deleted file mode 100644 index 35dff5a9..00000000 --- a/UnityPyBoost/TextureSwizzler.cpp +++ /dev/null @@ -1,96 +0,0 @@ -#include - -const uint32_t GOB_X_BLOCK_COUNT = 4; -const uint32_t GOB_Y_BLOCK_COUNT = 8; -const uint32_t BLOCKS_IN_GOB = 32; // GOB_X_BLOCK_COUNT * GOB_Y_BLOCK_COUNT; - -const uint32_t GOB_MAP[32][2] = {{0, 0}, {0, 1}, {1, 0}, {1, 1}, {0, 2}, {0, 3}, {1, 2}, {1, 3}, {0, 4}, {0, 5}, {1, 4}, {1, 5}, {0, 6}, {0, 7}, {1, 6}, {1, 7}, {2, 0}, {2, 1}, {3, 0}, {3, 1}, {2, 2}, {2, 3}, {3, 2}, {3, 3}, {2, 4}, {2, 5}, {3, 4}, {3, 5}, {2, 6}, {2, 7}, {3, 6}, {3, 7}}; - -PyObject *switch_deswizzle(PyObject *self, PyObject *args) -{ - // define vars - uint8_t *src_data; - Py_ssize_t data_size; - uint32_t pixel_width; - - uint32_t width; - uint32_t height; - uint32_t block_width; - uint32_t block_height; - uint32_t gobs_per_block; - - if (!PyArg_ParseTuple(args, "y#IIIIII", &src_data, &data_size, &pixel_width, &width, &height, &block_width, &block_height, &gobs_per_block)) - return NULL; - - char *dst_data = (char *)malloc(data_size); - - uint32_t block_count_x = width / block_width; - uint32_t block_count_y = height / block_height; - - uint32_t gob_count_x = block_count_x / GOB_X_BLOCK_COUNT; - uint32_t gob_count_y = block_count_y / GOB_Y_BLOCK_COUNT; - - uint32_t src_x = 0; - uint32_t src_y = 0; - - uint32_t block_pixel_width = block_width * pixel_width; - uint32_t row_pixel_width = width * pixel_width; - - uint32_t gob_x, gob_y, gob_dst_x, gob_dst_y, src_offset, dst_offset; - - for (uint32_t y = 0; y < gob_count_y; y++) - { - for (uint32_t x = 0; x < gob_count_x; x++) - { - for (uint32_t k = 0; k < gobs_per_block; k++) - { - for (uint32_t l = 0; l < BLOCKS_IN_GOB; l++) - { - // printf("%d/%d, %d/%d, %d/%d, %d/%d\n", y, gob_count_y, x, gob_count_x, k, gobs_per_block, l, gobs_per_block); - gob_x = ((l >> 3) & 0b10) | ((l >> 1) & 0b1); - gob_y = ((l >> 1) & 0b110) | (l & 0b1); - gob_dst_x = x * GOB_X_BLOCK_COUNT + gob_x; - gob_dst_y = (y * gobs_per_block + k) * GOB_Y_BLOCK_COUNT + gob_y; - - src_offset = (src_x * block_width + (src_y * block_height) * width) * pixel_width; - dst_offset = (gob_dst_x * block_width + (gob_dst_y * block_height) * width) * pixel_width; - - for (uint32_t by = 0; by < block_height; by++) - { - if ((dst_offset > data_size) || (src_offset > data_size)) - { - break; - } - uint32_t copy_width = block_pixel_width; - if ((data_size - src_offset) < block_pixel_width) - { - copy_width = data_size - src_offset; - } - else if ((data_size - dst_offset) < block_pixel_width) - { - copy_width = data_size - dst_offset; - } - - memcpy( - dst_data + dst_offset, - src_data + src_offset, - copy_width); - src_offset += row_pixel_width; - dst_offset += row_pixel_width; - } - src_x += 1; - if (src_x >= block_count_x) - { - src_x = 0; - src_y += 1; - } - } - } - } - } - - PyObject *ret = PyBytes_FromStringAndSize(dst_data, data_size); - free(dst_data); - - return ret; -} diff --git a/UnityPyBoost/TextureSwizzler.hpp b/UnityPyBoost/TextureSwizzler.hpp deleted file mode 100644 index 0df0aa7c..00000000 --- a/UnityPyBoost/TextureSwizzler.hpp +++ /dev/null @@ -1,5 +0,0 @@ -#define PY_SSIZE_T_CLEAN -#pragma once -#include - -PyObject *switch_deswizzle(PyObject *self, PyObject *args); diff --git a/UnityPyBoost/UnityPyBoost.cpp b/UnityPyBoost/UnityPyBoost.cpp index 366f971a..e2dedbca 100644 --- a/UnityPyBoost/UnityPyBoost.cpp +++ b/UnityPyBoost/UnityPyBoost.cpp @@ -2,7 +2,6 @@ #pragma once #include #include "Mesh.hpp" -#include "TextureSwizzler.hpp" #include "TypeTreeHelper.hpp" /* Mesh.py */ @@ -16,10 +15,6 @@ static struct PyMethodDef method_table[] = { (PyCFunction)read_typetree, METH_VARARGS | METH_KEYWORDS, "replacement for TypeTreeHelper.read_typetree"}, - {"switch_deswizzle", - (PyCFunction)switch_deswizzle, - METH_VARARGS, - "replacement for TextureSwizzler.switch_deswizzle"}, {NULL, NULL, 0, From 10fa6415ceeac40b2142830161c2d47cbdea627c Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Mon, 14 Oct 2024 20:37:55 +0200 Subject: [PATCH 126/403] SpriteHelper - use Mask for triangle copy and numpy as speedup if available --- UnityPy/export/SpriteHelper.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/UnityPy/export/SpriteHelper.py b/UnityPy/export/SpriteHelper.py index 3a4bee35..8a9d5c84 100644 --- a/UnityPy/export/SpriteHelper.py +++ b/UnityPy/export/SpriteHelper.py @@ -18,6 +18,11 @@ from ..classes import PPtr, Sprite, Texture2D +try: + import numpy as np +except ImportError: + np = None + class SpriteSettings: packed: bool @@ -247,7 +252,7 @@ def copy_triangle( maskdraw.polygon(mask_box, fill=255) # paste triangle into destination image - dst_img.paste(src_part, min(dst_tri)) + dst_img.paste(src_part, min(dst_tri), mask=mask) else: # transform is necessary, use affine transformation # https://stackoverflow.com/a/6959111 @@ -267,8 +272,11 @@ def copy_triangle( # Vector y corresponds to the x coordinates in the source triangle y = [x11, x21, x31, x12, x22, x32] - # np.lingal.solve - obviously way faster, but numpy will only come with 2.0 - A = linalg_solve(M, y) + if np: + A = np.linalg.solve(M, y) + else: + # np.lingal.solve - obviously way faster, but numpy will only come with 2.0 + A = linalg_solve(M, y) transformed = src_img.transform(dst_img.size, Image.AFFINE, A) From 40487fc99f8bdc41e23a6b32cf513da27fb3028b Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Mon, 14 Oct 2024 20:53:27 +0200 Subject: [PATCH 127/403] Texture2DConverter - extend compression with BC4, BC5, BC7 and LDR ASTC --- UnityPy/export/Texture2DConverter.py | 61 +++++++++++++++++++++------- pyproject.toml | 1 + 2 files changed, 47 insertions(+), 15 deletions(-) diff --git a/UnityPy/export/Texture2DConverter.py b/UnityPy/export/Texture2DConverter.py index 2fbbbb1e..cf58af23 100644 --- a/UnityPy/export/Texture2DConverter.py +++ b/UnityPy/export/Texture2DConverter.py @@ -31,35 +31,66 @@ def image_to_texture2d( # DXT if target_texture_format in [TF.DXT1, TF.DXT1Crunched]: - raw_img = img.convert("RGBA").tobytes() + raw_img = img.tobytes("raw", "RGBA") enc_img = etcpak.compress_bc1(raw_img, img.width, img.height) tex_format = TF.DXT1 elif target_texture_format in [TF.DXT5, TF.DXT5Crunched]: - raw_img = img.convert("RGBA").tobytes() - enc_img = etcpak.compress_to_dxt5(raw_img, img.width, img.height) + raw_img = img.tobytes("raw", "RGBA") + enc_img = etcpak.compress_bc3(raw_img, img.width, img.height) tex_format = TF.DXT5 + elif target_texture_format in [TF.BC4]: + raw_img = img.tobytes("raw", "RGBA") + enc_img = etcpak.compress_bc4(raw_img, img.width, img.height) + tex_format = TF.BC4 + elif target_texture_format in [TF.BC5]: + raw_img = img.tobytes("raw", "RGBA") + enc_img = etcpak.compress_bc5(raw_img, img.width, img.height) + tex_format = TF.BC5 + elif target_texture_format in [TF.BC7]: + raw_img = img.tobytes("raw", "RGBA") + enc_img = etcpak.compress_bc7(raw_img, img.width, img.height) + tex_format = TF.BC7 # ETC elif target_texture_format in [TF.ETC_RGB4, TF.ETC_RGB4Crunched, TF.ETC_RGB4_3DS]: - img = assert_rgba(img, target_texture_format) - r, g, b, a = img.split() - raw_img = Image.merge("RGBA", (b, g, r, a)).tobytes() - enc_img = etcpak.compress_to_etc1(raw_img, img.width, img.height) + raw_img = img.tobytes("raw", "RGBA") + enc_img = etcpak.compress_etc1_rgb(raw_img, img.width, img.height) tex_format = TF.ETC_RGB4 elif target_texture_format == TF.ETC2_RGB: - img = assert_rgba(img, target_texture_format) - r, g, b, a = img.split() - raw_img = Image.merge("RGBA", (b, g, r, a)).tobytes() - enc_img = etcpak.compress_to_etc2_rgb(raw_img, img.width, img.height) + raw_img = img.tobytes("raw", "RGBA") + enc_img = etcpak.compress_etc2_rgb(raw_img, img.width, img.height) tex_format = TF.ETC2_RGB elif ( target_texture_format in [TF.ETC2_RGBA8, TF.ETC2_RGBA8Crunched, TF.ETC2_RGBA1] or "_RGB_" in target_texture_format.name ): - img = assert_rgba(img, target_texture_format) - r, g, b, a = img.split() - raw_img = Image.merge("RGBA", (b, g, r, a)).tobytes() - enc_img = etcpak.compress_to_etc2_rgba(raw_img, img.width, img.height) + raw_img = img.tobytes("raw", "RGBA") + enc_img = etcpak.compress_etc2_rgba(raw_img, img.width, img.height) tex_format = TF.ETC2_RGBA8 + # ASTC + elif target_texture_format.name.startswith("ASTC"): + import astc_encoder + + raw_img = img.tobytes("raw", "RGBA") + + block_size = tuple( + map(int, target_texture_format.name.rsplit("_", 1)[1].split("x")) + ) + + config = astc_encoder.ASTCConfig( + astc_encoder.ASTCProfile.LDR, *block_size, 1, 100 + ) + context = astc_encoder.ASTCContext(config) + raw_img = astc_encoder.ASTCImage( + astc_encoder.ASTCType.U8, img.width, img.height, 1, raw_img + ) + if img.mode == "RGB": + tex_format = getattr(TF, f"ASTC_RGB_{block_size[0]}x{block_size[1]}") + else: + tex_format = getattr(TF, f"ASTC_RGBA_{block_size[0]}x{block_size[1]}") + + swizzle = astc_encoder.ASTCSwizzle.from_str("RGBA") + enc_img = context.compress(raw_img, swizzle) + tex_format = target_texture_format # A elif target_texture_format == TF.Alpha8: enc_img = img.tobytes("raw", "A") diff --git a/pyproject.toml b/pyproject.toml index 96bc4f86..47868934 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -44,6 +44,7 @@ dependencies = [ "Pillow", "texture2ddecoder", # texture decompression "etcpak", # ETC & DXT compression + "astc-encoder-py", # ASTC compression # raw typetree dumping "tabulate", # audio extraction From 52ce553ca97c5af2799f375aafaa5a244595b3ec Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Mon, 14 Oct 2024 10:00:47 +0200 Subject: [PATCH 128/403] TypeTree - implement ManagedReferencesRegistry reading --- UnityPy/files/SerializedFile.py | 1 + UnityPy/helpers/TypeTreeHelper.py | 125 ++++++++++++++------- UnityPyBoost/TypeTreeHelper.cpp | 174 +++++++++++++++++++++++++++++- UnityPyBoost/TypeTreeHelper.hpp | 7 +- 4 files changed, 262 insertions(+), 45 deletions(-) diff --git a/UnityPy/files/SerializedFile.py b/UnityPy/files/SerializedFile.py index e5ef1d63..7ee9fc93 100644 --- a/UnityPy/files/SerializedFile.py +++ b/UnityPy/files/SerializedFile.py @@ -214,6 +214,7 @@ class SerializedFile(File.File): types: List[SerializedType] script_types: List[LocalSerializedObjectIdentifier] externals: List[FileIdentifier] + ref_types: Optional[List[SerializedType]] objects: Dict[int, ObjectReader] unknown: int header: SerializedFileHeader diff --git a/UnityPy/helpers/TypeTreeHelper.py b/UnityPy/helpers/TypeTreeHelper.py index 07a63321..9136a46d 100644 --- a/UnityPy/helpers/TypeTreeHelper.py +++ b/UnityPy/helpers/TypeTreeHelper.py @@ -1,12 +1,15 @@ from __future__ import annotations + import re -from typing import Optional, Any, Union, TYPE_CHECKING +from copy import copy +from typing import TYPE_CHECKING, Any, Optional, Union -from .TypeTreeNode import TypeTreeNode -from ..streams.EndianBinaryReader import EndianBinaryReader -from ..streams.EndianBinaryWriter import EndianBinaryWriter +from attrs import define from .. import classes +from ..streams.EndianBinaryReader import EndianBinaryReader +from ..streams.EndianBinaryWriter import EndianBinaryWriter +from .TypeTreeNode import TypeTreeNode Object = classes.Object PPtr = classes.PPtr @@ -70,6 +73,38 @@ } +@define(slots=True) +class TypeTreeConfig: + as_dict: bool + assetsfile: "Optional[SerializedFile]" = None + has_registry: bool = False + + +def get_ref_type_node(ref_object: dict, assetfile: SerializedFile) -> TypeTreeNode: + typ = ref_object["type"] + if isinstance(typ, dict): + cls = typ["class"] + ns = typ["ns"] + asm = typ["asm"] + else: + cls = getattr(typ, "class") + ns = typ.ns + asm = typ.asm + + if not assetfile or not assetfile.ref_types: + raise ValueError("SerializedFile has no ref_types") + + for ref_type in assetfile.ref_types: + if ( + cls == ref_type.m_ClassName + and ns == ref_type.m_NameSpace + and asm == ref_type.m_AssemblyName + ): + return ref_type.node + else: + raise ValueError(f"Referenced type not found: {cls} {ns} {asm}") + + def read_typetree( root_node: TypeTreeNode, reader: EndianBinaryReader, @@ -98,7 +133,8 @@ def read_typetree( ) pos = reader.Position - obj = read_value(root_node, reader, as_dict, assetsfile) + config = TypeTreeConfig(as_dict, assetsfile, False) + obj = read_value(root_node, reader, config) read = reader.Position - pos if expected_read is not None and read != expected_read: @@ -131,8 +167,7 @@ def write_typetree( def read_value( node: TypeTreeNode, reader: EndianBinaryReader, - as_dict: bool, - assetsfile: Optional[SerializedFile], + config: TypeTreeConfig, ) -> Any: # print(reader.Position, node.m_Name, node.m_Type, node.m_MetaFlag) align = metaflag_is_aligned(node.m_MetaFlag) @@ -141,9 +176,17 @@ def read_value( if func: value = func(reader) elif node.m_Type == "pair": - first = read_value(node.m_Children[0], reader, as_dict, assetsfile) - second = read_value(node.m_Children[1], reader, as_dict, assetsfile) + first = read_value(node.m_Children[0], reader, config) + second = read_value(node.m_Children[1], reader, config) value = (first, second) + elif node.m_Type == "ReferencedObject": + value = {} + for child in node.m_Children: + if child.m_Type == "ReferencedObjectData": + ref_type_nodes = get_ref_type_node(value, config.assetsfile) + value[child.m_Name] = read_value(ref_type_nodes, reader, config) + else: + value[child.m_Name] = read_value(child, reader, config) # Vector elif node.m_Children and node.m_Children[0].m_Type == "Array": if metaflag_is_aligned(node.m_Children[0].m_MetaFlag): @@ -153,22 +196,25 @@ def read_value( size = reader.read_int() subtype = node.m_Children[0].m_Children[1] if metaflag_is_aligned(subtype.m_MetaFlag): - value = read_value_array(subtype, reader, as_dict, size, assetsfile) + value = read_value_array(subtype, reader, config) else: - value = [ - read_value(subtype, reader, as_dict, assetsfile) for _ in range(size) - ] + value = [read_value(subtype, reader, config) for _ in range(size)] else: # Class - value = { - child.m_Name: read_value(child, reader, as_dict, assetsfile) - for child in node.m_Children - } + value = {} + for child in node.m_Children: + if child.m_Type == "ManagedReferencesRegistry": + if config.has_registry: + continue + else: + config = copy(config) + config.has_registry = True + value[child.m_Name] = read_value(child, reader, config) - if not as_dict: + if not config.as_dict: if node.m_Type.startswith("PPtr<"): value = PPtr[Any]( - assetsfile=assetsfile, + assetsfile=config.assetsfile, m_FileID=value["m_FileID"], m_PathID=value["m_PathID"], ) @@ -198,9 +244,8 @@ def read_value( def read_value_array( node: TypeTreeNode, reader: EndianBinaryReader, - as_dict: bool, + config: TypeTreeConfig, size: int, - assetsfile: Optional[SerializedFile], ) -> Any: align = metaflag_is_aligned(node.m_MetaFlag) @@ -217,13 +262,24 @@ def read_value_array( key_func = FUNCTION_READ_MAP.get( key_node.m_Type, - lambda reader: read_value(key_node, reader, as_dict, assetsfile), + lambda reader: read_value(key_node, reader, config), ) value_func = FUNCTION_READ_MAP.get( value_node.m_Type, - lambda reader: read_value(value_node, reader, as_dict, assetsfile), + lambda reader: read_value(value_node, reader, config), ) value = [(key_func(reader), value_func(reader)) for _ in range(size)] + elif node.m_Type == "ReferencedObject": + value = [None] * size + for i in range(size): + item = {} + for child in node.m_Children: + if child.m_Type == "ReferencedObjectData": + ref_type_nodes = get_ref_type_node(item, config.assetsfile) + item[child.m_Name] = read_value(ref_type_nodes, reader, config) + else: + item[child.m_Name] = read_value(child, reader, config) + value[i] = item # Vector elif node.m_Children and node.m_Children[0].m_Type == "Array": if metaflag_is_aligned(node.m_Children[0].m_MetaFlag): @@ -231,24 +287,19 @@ def read_value_array( subtype = node.m_Children[0].m_Children[1] if metaflag_is_aligned(subtype.m_MetaFlag): value = [ - read_value_array( - subtype, reader, as_dict, reader.read_int(), assetsfile - ) + read_value_array(subtype, reader, config, reader.read_int()) for _ in range(size) ] else: value = [ - [ - read_value(subtype, reader, as_dict, assetsfile) - for _ in range(reader.read_int()) - ] + [read_value(subtype, reader, config) for _ in range(reader.read_int())] for _ in range(size) ] else: # Class - if as_dict: + if config.as_dict: value = [ { - child.m_Name: read_value(child, reader, as_dict, assetsfile) + child.m_Name: read_value(child, reader, config) for child in node.m_Children } for _ in range(size) @@ -257,9 +308,9 @@ def read_value_array( if node.m_Type.startswith("PPtr<"): value = [ PPtr[Any]( - assetsfile=assetsfile, + assetsfile=config.assetsfile, **{ - child.m_Name: read_value(child, reader, as_dict, assetsfile) + child.m_Name: read_value(child, reader, config) for child in node.m_Children }, ) @@ -276,7 +327,7 @@ def read_value_array( value = [ clz( **{ - name: read_value(child, reader, as_dict, assetsfile) + name: read_value(child, reader, config) for name, child in zip(clean_names, node.m_Children) } ) @@ -287,9 +338,7 @@ def read_value_array( value = [None] * size for i in range(size): value_i_d = { - clean_name(child.m_Name): read_value( - child, reader, as_dict, assetsfile - ) + clean_name(child.m_Name): read_value(child, reader, config) for child in node.m_Children } value_i = clz( diff --git a/UnityPyBoost/TypeTreeHelper.cpp b/UnityPyBoost/TypeTreeHelper.cpp index 4d420a65..29f6165d 100644 --- a/UnityPyBoost/TypeTreeHelper.cpp +++ b/UnityPyBoost/TypeTreeHelper.cpp @@ -19,6 +19,7 @@ typedef struct TypeTreeReaderConfig PyObject *classes; PyObject *assetfile; PyObject *clean_name; + bool has_registry; } TypeTreeReaderConfigT; inline void align4(ReaderT *reader) @@ -203,7 +204,7 @@ inline PyObject *parse_class(ReaderT *reader, PyObject *dict, TypeTreeNodeObject PyObject *clz = NULL; // Determine the class based on node's _data_type - if (node->_data_type == NodeDataType::pptr) + if (node->_data_type == NodeDataType::PPtr) { if (PyDict_SetItemString(dict, "assetsfile", config->assetfile) != 0) { @@ -325,6 +326,95 @@ inline PyObject *parse_class(ReaderT *reader, PyObject *dict, TypeTreeNodeObject return instance; } +TypeTreeNodeObject *get_ref_type_node(PyObject *ref_object, PyObject *assetsfile) +{ + if (assetsfile == Py_None) + { + PyErr_SetString(PyExc_ValueError, "No serialized file given!"); + return NULL; + } + PyObject *ref_types = PyObject_GetAttrString(assetsfile, "ref_types"); + if (!ref_types || !PyList_Check(ref_types)) + { + Py_XDECREF(ref_types); + PyErr_SetString(PyExc_ValueError, "No SerializedFile.ref_types"); + return NULL; + } + + PyObject *type = PyDict_GetItemString(ref_object, "type"); + if (!type) + { + Py_DECREF(ref_types); + PyErr_SetString(PyExc_ValueError, "Failed to get 'type'"); + return NULL; + } + + PyObject *cls = NULL; + PyObject *ns = NULL; + PyObject *asm_ = NULL; + if (PyDict_Check(type)) + { + cls = PyDict_GetItemString(type, "class"); + ns = PyDict_GetItemString(type, "ns"); + asm_ = PyDict_GetItemString(type, "asm"); + Py_XINCREF(cls); + Py_XINCREF(ns); + Py_XINCREF(asm_); + } + else + { + cls = PyObject_GetAttrString(type, "class"); + ns = PyObject_GetAttrString(type, "ns"); + asm_ = PyObject_GetAttrString(type, "asm"); + } + + if (!cls || !ns || !asm_) + { + Py_DECREF(ref_types); + Py_XDECREF(cls); + Py_XDECREF(ns); + Py_XDECREF(asm_); + PyErr_SetString(PyExc_ValueError, "Failed to get 'class', 'ns' or 'asm'"); + return NULL; + } + + Py_ssize_t ref_types_len = PyList_Size(ref_types); + TypeTreeNodeObject *ref_type_node = NULL; + for (Py_ssize_t i = 0; i < ref_types_len; i++) + { + PyObject *ref_type = PyList_GetItem(ref_types, i); + PyObject *m_ClassName = PyObject_GetAttrString(ref_type, "m_ClassName"); + PyObject *m_NameSpace = PyObject_GetAttrString(ref_type, "m_NameSpace"); + PyObject *m_AssemblyName = PyObject_GetAttrString(ref_type, "m_AssemblyName"); + if (!m_ClassName || !m_NameSpace || !m_AssemblyName) + { + Py_XDECREF(m_ClassName); + Py_XDECREF(m_NameSpace); + Py_XDECREF(m_AssemblyName); + PyErr_SetString(PyExc_ValueError, "Failed to get 'm_ClassName', 'm_NameSpace' or 'm_AssemblyName'"); + break; + } + + bool compare_cls = PyObject_RichCompareBool(cls, m_ClassName, Py_EQ) && PyObject_RichCompareBool(ns, m_NameSpace, Py_EQ) && PyObject_RichCompareBool(asm_, m_AssemblyName, Py_EQ); + Py_DECREF(m_ClassName); + Py_DECREF(m_NameSpace); + Py_DECREF(m_AssemblyName); + + if (compare_cls) + { + ref_type_node = (TypeTreeNodeObject *)PyObject_GetAttrString(ref_type, "node"); + break; + } + } + + Py_DECREF(ref_types); + Py_XDECREF(cls); + Py_XDECREF(ns); + Py_XDECREF(asm_); + + return ref_type_node; +} + template PyObject *read_typetree_value(ReaderT *reader, TypeTreeNodeObject *node, TypeTreeReaderConfigT *config) { @@ -375,6 +465,58 @@ PyObject *read_typetree_value(ReaderT *reader, TypeTreeNodeObject *node, TypeTre case NodeDataType::pair: value = read_pair(reader, node, config); break; + case NodeDataType::ReferencedObject: + { + value = PyDict_New(); + PyObject *child_value; + for (int i = 0; i < PyList_GET_SIZE(node->m_Children); i++) + { + TypeTreeNodeObject *child = (TypeTreeNodeObject *)PyList_GET_ITEM(node->m_Children, i); + if (child->_data_type == NodeDataType::ReferencedObjectData) + { + TypeTreeNodeObject *ref_node = get_ref_type_node(value, config->assetfile); + if (!ref_node) + { + PyErr_SetString(PyExc_ValueError, "Failed to get ref type node"); + Py_DECREF(value); + return NULL; + } + child_value = read_typetree_value(reader, ref_node, config); + Py_DECREF(ref_node); + } + else + { + child_value = read_typetree_value(reader, child, config); + } + if (!child_value) + { + Py_DECREF(value); + return NULL; + } + if (PyDict_SetItem(value, child->m_Name, child_value)) + { + Py_DECREF(value); + Py_DECREF(child_value); + return NULL; + } + // dict increases ref count, so we need to decref here + Py_DECREF(child_value); + } + PyObject *clz = PyObject_GetAttrString(config->classes, "Object"); + if (clz == NULL) + { + PyErr_SetString(PyExc_ValueError, "Failed to get class"); + Py_DECREF(value); + return NULL; + } + PyObject *args = PyTuple_New(0); + PyObject *instance = PyObject_Call(clz, args, value); + Py_DECREF(clz); + Py_DECREF(args); + Py_DECREF(value); + value = instance; + break; + } default: TypeTreeNodeObject *child = nullptr; if (PyList_GET_SIZE(node->m_Children) > 0) @@ -382,7 +524,7 @@ PyObject *read_typetree_value(ReaderT *reader, TypeTreeNodeObject *node, TypeTre child = (TypeTreeNodeObject *)PyList_GET_ITEM(node->m_Children, 0); } - if (child && child->_data_type == NodeDataType::array) + if (child && child->_data_type == NodeDataType::Array) { // array if (child->_align) @@ -410,10 +552,23 @@ PyObject *read_typetree_value(ReaderT *reader, TypeTreeNodeObject *node, TypeTre else { // class + bool changed_registry = false; value = PyDict_New(); for (int i = 0; i < PyList_GET_SIZE(node->m_Children); i++) { child = (TypeTreeNodeObject *)PyList_GET_ITEM(node->m_Children, i); + if (child->_data_type == NodeDataType::ManagedReferencesRegistry) + { + if (config->has_registry) + { + continue; + } + else + { + changed_registry = true; + config->has_registry = true; + } + } PyObject *child_value = read_typetree_value(reader, child, config); if (!child_value) { @@ -433,6 +588,10 @@ PyObject *read_typetree_value(ReaderT *reader, TypeTreeNodeObject *node, TypeTre { value = parse_class(reader, value, node, config); } + if (changed_registry) + { + config->has_registry = false; + } } } @@ -455,7 +614,9 @@ PyObject *read_typetree(PyObject *self, PyObject *args, PyObject *kwargs) false, Py_None, Py_None, - Py_None}; + Py_None, + false, + }; char endian; bool swap; @@ -582,7 +743,10 @@ static const std::map typeToNodeDataType = { {"string", NodeDataType::str}, {"TypelessData", NodeDataType::bytes}, {"pair", NodeDataType::pair}, - {"Array", NodeDataType::array}, + {"Array", NodeDataType::Array}, + {"ReferencedObject", NodeDataType::ReferencedObject}, + {"ReferencedObjectData", NodeDataType::ReferencedObjectData}, + {"ManagedReferencesRegistry", NodeDataType::ManagedReferencesRegistry}, }; static int TypeTreeNode_init(TypeTreeNodeObject *self, PyObject *args, PyObject *kwargs) @@ -658,7 +822,7 @@ static int TypeTreeNode_init(TypeTreeNodeObject *self, PyObject *args, PyObject self->_data_type = NodeDataType::unk; if (type[0] == 'P' && type[1] == 'P' && type[2] == 't' && type[3] == 'r' && type[4] == '<') { - self->_data_type = NodeDataType::pptr; + self->_data_type = NodeDataType::PPtr; } else { diff --git a/UnityPyBoost/TypeTreeHelper.hpp b/UnityPyBoost/TypeTreeHelper.hpp index 5140910c..15cf0d80 100644 --- a/UnityPyBoost/TypeTreeHelper.hpp +++ b/UnityPyBoost/TypeTreeHelper.hpp @@ -20,8 +20,11 @@ enum NodeDataType str = 11, bytes = 12, pair = 13, - array = 14, - pptr = 15, + Array = 14, + PPtr = 15, + ReferencedObject = 16, + ReferencedObjectData = 17, + ManagedReferencesRegistry = 18, unk = 255 }; From bb6fca1407e21fa5e4597550f930f2829f69f18d Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Mon, 14 Oct 2024 10:08:07 +0200 Subject: [PATCH 129/403] TypeTree - implement writing ManagedReferencesRegistry --- UnityPy/files/ObjectReader.py | 2 +- UnityPy/helpers/TypeTreeHelper.py | 32 +++++++++++++++++++++++++++---- 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/UnityPy/files/ObjectReader.py b/UnityPy/files/ObjectReader.py index b909a5fa..b3c72a12 100644 --- a/UnityPy/files/ObjectReader.py +++ b/UnityPy/files/ObjectReader.py @@ -226,7 +226,7 @@ def save_typetree( node = self._get_typetree_node(nodes) if not writer: writer = EndianBinaryWriter(endian=self.reader.endian) - TypeTreeHelper.write_typetree(tree, node, writer) + TypeTreeHelper.write_typetree(tree, node, writer, self.assets_file) data = writer.bytes self.set_raw_data(data) return data diff --git a/UnityPy/helpers/TypeTreeHelper.py b/UnityPy/helpers/TypeTreeHelper.py index 9136a46d..5e833816 100644 --- a/UnityPy/helpers/TypeTreeHelper.py +++ b/UnityPy/helpers/TypeTreeHelper.py @@ -149,6 +149,7 @@ def write_typetree( value: Union[dict[str, Any], Object], root_node: TypeTreeNode, writer: EndianBinaryWriter, + assetsfile: Optional[SerializedFile] = None, ) -> None: """Writes the typetree of the object contained in the reader via the node list. @@ -161,7 +162,8 @@ def write_typetree( writer : EndianBinaryWriter Writer of the object to be parsed """ - return write_value(value, root_node, writer) + config = TypeTreeConfig(isinstance(value, dict), assetsfile, False) + return write_value(value, root_node, writer, config) def read_value( @@ -403,6 +405,7 @@ def write_value( value: Any, node: TypeTreeNode, writer: EndianBinaryWriter, + config: TypeTreeConfig, ) -> None: # print(reader.Position, node.m_Name, node.m_Type, node.m_MetaFlag) align = metaflag_is_aligned(node.m_MetaFlag) @@ -413,21 +416,42 @@ def write_value( elif node.m_Type == "pair": write_value(value[0], node.m_Children[0], writer) write_value(value[1], node.m_Children[1], writer) + elif node.m_Type == "ReferencedObject": + for child in node.m_Children: + if child.m_Type == "ReferencedObjectData": + ref_type_nodes = get_ref_type_node(value, config.assetsfile) + write_value(value[child.m_Name], ref_type_nodes, writer, config) + else: + write_value(value[child.m_Name], child, writer, config) elif node.m_Children and node.m_Children[0].m_Type == "Array": if metaflag_is_aligned(node.m_Children[0].m_MetaFlag): align = True writer.write_int(len(value)) subtype = node.m_Children[0].m_Children[1] - [write_value(sub_value, subtype, writer) for sub_value in value] + [write_value(sub_value, subtype, writer, config) for sub_value in value] else: # Class if isinstance(value, dict): for child in node.m_Children: - write_value(value[child.m_Name], child, writer) + if child.m_Type == "ManagedReferencesRegistry": + if config.has_registry: + continue + else: + config = copy(config) + config.has_registry = True + write_value(value[child.m_Name], child, writer, config) else: for child in node.m_Children: - write_value(getattr(value, clean_name(child.m_Name)), child, writer) + if child.m_Type == "ManagedReferencesRegistry": + if config.has_registry: + continue + else: + config = copy(config) + config.has_registry = True + write_value( + getattr(value, clean_name(child.m_Name)), child, writer, config + ) if align: writer.align_stream() From 7095f8664e5c5fc94bda29b030ad6505d0316893 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Mon, 14 Oct 2024 11:07:57 +0200 Subject: [PATCH 130/403] C TypeTreeReader - implement faster read_array function --- UnityPyBoost/TypeTreeHelper.cpp | 253 ++++++++++++++++++++++++++++++-- 1 file changed, 244 insertions(+), 9 deletions(-) diff --git a/UnityPyBoost/TypeTreeHelper.cpp b/UnityPyBoost/TypeTreeHelper.cpp index 29f6165d..886daa20 100644 --- a/UnityPyBoost/TypeTreeHelper.cpp +++ b/UnityPyBoost/TypeTreeHelper.cpp @@ -39,6 +39,21 @@ inline PyObject *read_bool(ReaderT *reader) return *reader->ptr++ ? Py_True : Py_False; } +inline PyObject *read_bool_array(ReaderT *reader, int32_t count) +{ + if (reader->ptr + count > reader->end) + { + PyErr_SetString(PyExc_ValueError, "read_bool out of bounds"); + return NULL; + } + PyObject *list = PyList_New(count); + for (auto i = 0; i < count; i++) + { + PyList_SET_ITEM(list, i, *reader->ptr++ ? Py_True : Py_False); + } + return list; +} + inline PyObject *read_u8(ReaderT *reader) { if (reader->ptr + 1 > reader->end) @@ -49,6 +64,21 @@ inline PyObject *read_u8(ReaderT *reader) return PyLong_FromUnsignedLong(*reader->ptr++); } +inline PyObject *read_u8_array(ReaderT *reader, int32_t count) +{ + if (reader->ptr + count > reader->end) + { + PyErr_SetString(PyExc_ValueError, "read_u8 out of bounds"); + return NULL; + } + PyObject *list = PyList_New(count); + for (auto i = 0; i < count; i++) + { + PyList_SET_ITEM(list, i, PyLong_FromUnsignedLong(*reader->ptr++)); + } + return list; +} + inline PyObject *read_s8(ReaderT *reader) { if (reader->ptr + 1 > reader->end) @@ -59,6 +89,23 @@ inline PyObject *read_s8(ReaderT *reader) return PyLong_FromLong((int8_t)*reader->ptr++); } +inline PyObject *read_s8_array(ReaderT *reader, int32_t count) +{ + if (reader->ptr + count > reader->end) + { + PyErr_SetString(PyExc_ValueError, "read_s8 out of bounds"); + return NULL; + } + PyObject *list = PyList_New(count); + int8_t *ptr = (int8_t *)reader->ptr; + for (auto i = 0; i < count; i++) + { + PyList_SET_ITEM(list, i, PyLong_FromLong(*ptr++)); + } + reader->ptr = (uint8_t *)ptr; + return list; +} + template inline PyObject *read_int(ReaderT *reader) { @@ -99,6 +146,52 @@ inline PyObject *read_int(ReaderT *reader) } } +template +inline PyObject *read_int_array(ReaderT *reader, int32_t count) +{ + static_assert(std::is_integral::value, "Unsupported type for read_int_array"); + + if (reader->ptr + sizeof(T) * count > reader->end) + { + PyErr_SetString(PyExc_ValueError, "read_int_array out of bounds"); + return NULL; + } + PyObject *list = PyList_New(count); + T *ptr = (T *)reader->ptr; + for (auto i = 0; i < count; i++) + { + T value = *ptr++; + if constexpr (swap) + { + swap_any_inplace(&value); + } + if constexpr (std::is_signed::value) + { + if constexpr (std::is_same::value) + { + PyList_SET_ITEM(list, i, PyLong_FromLongLong(value)); + } + else + { + PyList_SET_ITEM(list, i, PyLong_FromLong((int32_t)value)); + } + } + else + { + if constexpr (std::is_same::value) + { + PyList_SET_ITEM(list, i, PyLong_FromUnsignedLongLong(value)); + } + else + { + PyList_SET_ITEM(list, i, PyLong_FromUnsignedLong((uint32_t)value)); + } + } + } + reader->ptr = (uint8_t *)ptr; + return list; +} + template inline PyObject *read_float(ReaderT *reader) { @@ -118,6 +211,31 @@ inline PyObject *read_float(ReaderT *reader) return PyFloat_FromDouble(value); } +template +inline PyObject *read_float_array(ReaderT *reader, int32_t count) +{ + static_assert(std::is_floating_point::value, "Unsupported type for read_float_array"); + + if (reader->ptr + sizeof(T) * count > reader->end) + { + PyErr_SetString(PyExc_ValueError, "read_float_array out of bounds"); + return NULL; + } + T *ptr = (T *)reader->ptr; + PyObject *list = PyList_New(count); + for (auto i = 0; i < count; i++) + { + T value = *ptr++; + if constexpr (swap) + { + swap_any_inplace(&value); + } + PyList_SET_ITEM(list, i, PyFloat_FromDouble(value)); + } + reader->ptr = (uint8_t *)ptr; + return list; +} + template inline bool _read_length(ReaderT *reader, int32_t *length) { @@ -148,10 +266,10 @@ inline PyObject *read_str(ReaderT *reader) PyErr_SetString(PyExc_ValueError, "read_str out of bounds"); return NULL; } - PyObject *str = PyUnicode_DecodeUTF8((char *)reader->ptr, length, "surrogateescape"); + PyObject *py_str = PyUnicode_DecodeUTF8((char *)reader->ptr, length, "surrogateescape"); reader->ptr += length; align4(reader); - return str; + return py_str; } template @@ -198,6 +316,42 @@ inline PyObject *read_pair(ReaderT *reader, TypeTreeNodeObject *node, TypeTreeRe return pair; } +template +inline PyObject *read_pair_array(ReaderT *reader, TypeTreeNodeObject *node, TypeTreeReaderConfigT *config, int32_t count) +{ + if (PyList_GET_SIZE(node->m_Children) != 2) + { + PyErr_SetString(PyExc_ValueError, "Pair node must have 2 children"); + return NULL; + } + + TypeTreeNodeObject *first_child = (TypeTreeNodeObject *)PyList_GET_ITEM(node->m_Children, 0); + TypeTreeNodeObject *second_child = (TypeTreeNodeObject *)PyList_GET_ITEM(node->m_Children, 1); + + PyObject *list = PyList_New(count); + for (auto i = 0; i < count; i++) + { + PyObject *first = read_typetree_value(reader, first_child, config); + if (!first) + { + Py_DECREF(list); + return NULL; + } + PyObject *second = read_typetree_value(reader, second_child, config); + if (!second) + { + Py_DECREF(first); + Py_DECREF(list); + return NULL; + } + PyList_SET_ITEM(list, i, PyTuple_Pack(2, first, second)); + Py_DECREF(first); + Py_DECREF(second); + } + + return list; +} + template inline PyObject *parse_class(ReaderT *reader, PyObject *dict, TypeTreeNodeObject *node, TypeTreeReaderConfigT *config) { @@ -415,6 +569,24 @@ TypeTreeNodeObject *get_ref_type_node(PyObject *ref_object, PyObject *assetsfile return ref_type_node; } +template +PyObject *read_typetree_value_array(ReaderT *reader, TypeTreeNodeObject *node, TypeTreeReaderConfigT *config, uint32_t size); + +const NodeDataType SUPPORTED_VALUE_ARRAY_READ_TYPES[] = { + NodeDataType::u8, + NodeDataType::u16, + NodeDataType::u32, + NodeDataType::u64, + NodeDataType::s8, + NodeDataType::s16, + NodeDataType::s32, + NodeDataType::s64, + NodeDataType::f32, + NodeDataType::f64, + NodeDataType::boolean, + NodeDataType::pair, +}; + template PyObject *read_typetree_value(ReaderT *reader, TypeTreeNodeObject *node, TypeTreeReaderConfigT *config) { @@ -536,17 +708,25 @@ PyObject *read_typetree_value(ReaderT *reader, TypeTreeNodeObject *node, TypeTre { return NULL; } - value = PyList_New(length); + child = (TypeTreeNodeObject *)PyList_GET_ITEM(child->m_Children, 1); - for (int i = 0; i < length; i++) + if (std::find(std::begin(SUPPORTED_VALUE_ARRAY_READ_TYPES), std::end(SUPPORTED_VALUE_ARRAY_READ_TYPES), child->_data_type) == std::end(SUPPORTED_VALUE_ARRAY_READ_TYPES)) { - PyObject *item = read_typetree_value(reader, child, config); - if (!item) + value = PyList_New(length); + for (int i = 0; i < length; i++) { - Py_DECREF(value); - return NULL; + PyObject *item = read_typetree_value(reader, child, config); + if (!item) + { + Py_DECREF(value); + return NULL; + } + PyList_SET_ITEM(value, i, item); } - PyList_SET_ITEM(value, i, item); + } + else + { + value = read_typetree_value_array(reader, child, config, length); } } else @@ -603,6 +783,61 @@ PyObject *read_typetree_value(ReaderT *reader, TypeTreeNodeObject *node, TypeTre return value; } +template +PyObject *read_typetree_value_array(ReaderT *reader, TypeTreeNodeObject *node, TypeTreeReaderConfigT *config, int32_t count) +{ + bool align = node->_align; + PyObject *value = nullptr; + + switch (node->_data_type) + { + case NodeDataType::u8: + value = read_u8_array(reader, count); + break; + case NodeDataType::u16: + value = read_int_array(reader, count); + break; + case NodeDataType::u32: + value = read_int_array(reader, count); + break; + case NodeDataType::u64: + value = read_int_array(reader, count); + break; + case NodeDataType::s8: + value = read_s8_array(reader, count); + break; + case NodeDataType::s16: + value = read_int_array(reader, count); + break; + case NodeDataType::s32: + value = read_int_array(reader, count); + break; + case NodeDataType::s64: + value = read_int_array(reader, count); + break; + case NodeDataType::f32: + value = read_float_array(reader, count); + break; + case NodeDataType::f64: + value = read_float_array(reader, count); + break; + case NodeDataType::boolean: + value = read_bool_array(reader, count); + break; + case NodeDataType::pair: + value = read_pair_array(reader, node, config, count); + break; + default: + value = PyErr_Format(PyExc_ValueError, "Unsupported type for read_typetree_value_array: %d", node->_data_type); + } + if (align) + { + align4(reader); + } + + return value; +} + PyObject *read_typetree(PyObject *self, PyObject *args, PyObject *kwargs) { const char *kwlist[] = {"data", "node", "endian", "as_dict", "assetsfile", "classes", "clean_name", NULL}; From 90b762dd4396b218530c795deca53727c65adbfa Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Mon, 14 Oct 2024 11:17:19 +0200 Subject: [PATCH 131/403] TypeTreeHelper - write_value - fix missed config passing for "pair" --- UnityPy/helpers/TypeTreeHelper.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/UnityPy/helpers/TypeTreeHelper.py b/UnityPy/helpers/TypeTreeHelper.py index 5e833816..306319c2 100644 --- a/UnityPy/helpers/TypeTreeHelper.py +++ b/UnityPy/helpers/TypeTreeHelper.py @@ -414,8 +414,8 @@ def write_value( if func: value = func(writer, value) elif node.m_Type == "pair": - write_value(value[0], node.m_Children[0], writer) - write_value(value[1], node.m_Children[1], writer) + write_value(value[0], node.m_Children[0], writer, config) + write_value(value[1], node.m_Children[1], writer, config) elif node.m_Type == "ReferencedObject": for child in node.m_Children: if child.m_Type == "ReferencedObjectData": From 35bb1fd5f12176fc7942119c9e029d61674cdf03 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Mon, 14 Oct 2024 11:46:22 +0200 Subject: [PATCH 132/403] C TypeTreeHelper - fix find not found - include algorithm --- UnityPyBoost/TypeTreeHelper.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/UnityPyBoost/TypeTreeHelper.cpp b/UnityPyBoost/TypeTreeHelper.cpp index 886daa20..f9523a2f 100644 --- a/UnityPyBoost/TypeTreeHelper.cpp +++ b/UnityPyBoost/TypeTreeHelper.cpp @@ -1,8 +1,10 @@ -#include +#include #include -#include -#include #include +#include + +#include "swap.hpp" +#include "TypeTreeHelper.hpp" // TypeTreeReader - impl From 17551ba807aa8d7b365d2c245dc64a4b04569199 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Tue, 15 Oct 2024 12:12:10 +0200 Subject: [PATCH 133/403] TypeTreeHelper Py - fix config copy and skip ref type if cls is empty --- UnityPy/helpers/TypeTreeHelper.py | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/UnityPy/helpers/TypeTreeHelper.py b/UnityPy/helpers/TypeTreeHelper.py index 306319c2..80da9f72 100644 --- a/UnityPy/helpers/TypeTreeHelper.py +++ b/UnityPy/helpers/TypeTreeHelper.py @@ -1,7 +1,6 @@ from __future__ import annotations import re -from copy import copy from typing import TYPE_CHECKING, Any, Optional, Union from attrs import define @@ -79,6 +78,9 @@ class TypeTreeConfig: assetsfile: "Optional[SerializedFile]" = None has_registry: bool = False + def copy(self) -> TypeTreeConfig: + return TypeTreeConfig(self.as_dict, self.assetsfile, self.has_registry) + def get_ref_type_node(ref_object: dict, assetfile: SerializedFile) -> TypeTreeNode: typ = ref_object["type"] @@ -94,6 +96,9 @@ def get_ref_type_node(ref_object: dict, assetfile: SerializedFile) -> TypeTreeNo if not assetfile or not assetfile.ref_types: raise ValueError("SerializedFile has no ref_types") + if cls == "": + return None + for ref_type in assetfile.ref_types: if ( cls == ref_type.m_ClassName @@ -186,6 +191,8 @@ def read_value( for child in node.m_Children: if child.m_Type == "ReferencedObjectData": ref_type_nodes = get_ref_type_node(value, config.assetsfile) + if ref_type_nodes is None: + continue value[child.m_Name] = read_value(ref_type_nodes, reader, config) else: value[child.m_Name] = read_value(child, reader, config) @@ -209,7 +216,7 @@ def read_value( if config.has_registry: continue else: - config = copy(config) + config = config.copy() config.has_registry = True value[child.m_Name] = read_value(child, reader, config) @@ -438,7 +445,7 @@ def write_value( if config.has_registry: continue else: - config = copy(config) + config = config.copy() config.has_registry = True write_value(value[child.m_Name], child, writer, config) else: @@ -447,7 +454,7 @@ def write_value( if config.has_registry: continue else: - config = copy(config) + config = config.copy() config.has_registry = True write_value( getattr(value, clean_name(child.m_Name)), child, writer, config From 838bf05d92481637a01f2dfd02e55cb4aded7528 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Tue, 15 Oct 2024 12:13:28 +0200 Subject: [PATCH 134/403] TypeTreeHelper C - check as_dict for RefObj, check read length, skip reftype if cls is empty --- UnityPyBoost/TypeTreeHelper.cpp | 42 +++++++++++++++++++++++++-------- 1 file changed, 32 insertions(+), 10 deletions(-) diff --git a/UnityPyBoost/TypeTreeHelper.cpp b/UnityPyBoost/TypeTreeHelper.cpp index f9523a2f..08e7262a 100644 --- a/UnityPyBoost/TypeTreeHelper.cpp +++ b/UnityPyBoost/TypeTreeHelper.cpp @@ -534,6 +534,15 @@ TypeTreeNodeObject *get_ref_type_node(PyObject *ref_object, PyObject *assetsfile return NULL; } + if (PyUnicode_GET_LENGTH(cls) == 0) + { + Py_DECREF(ref_types); + Py_DECREF(cls); + Py_DECREF(ns); + Py_DECREF(asm_); + return (TypeTreeNodeObject *)Py_None; + } + Py_ssize_t ref_types_len = PyList_Size(ref_types); TypeTreeNodeObject *ref_type_node = NULL; for (Py_ssize_t i = 0; i < ref_types_len; i++) @@ -655,6 +664,10 @@ PyObject *read_typetree_value(ReaderT *reader, TypeTreeNodeObject *node, TypeTre Py_DECREF(value); return NULL; } + else if (ref_node == (TypeTreeNodeObject *)Py_None) + { + continue; + } child_value = read_typetree_value(reader, ref_node, config); Py_DECREF(ref_node); } @@ -676,19 +689,22 @@ PyObject *read_typetree_value(ReaderT *reader, TypeTreeNodeObject *node, TypeTre // dict increases ref count, so we need to decref here Py_DECREF(child_value); } - PyObject *clz = PyObject_GetAttrString(config->classes, "Object"); - if (clz == NULL) + if (!config->as_dict) { - PyErr_SetString(PyExc_ValueError, "Failed to get class"); + PyObject *clz = PyObject_GetAttrString(config->classes, "Object"); + if (clz == NULL) + { + PyErr_SetString(PyExc_ValueError, "Failed to get class"); + Py_DECREF(value); + return NULL; + } + PyObject *args = PyTuple_New(0); + PyObject *instance = PyObject_Call(clz, args, value); + Py_DECREF(clz); + Py_DECREF(args); Py_DECREF(value); - return NULL; + value = instance; } - PyObject *args = PyTuple_New(0); - PyObject *instance = PyObject_Call(clz, args, value); - Py_DECREF(clz); - Py_DECREF(args); - Py_DECREF(value); - value = instance; break; } default: @@ -936,6 +952,12 @@ PyObject *read_typetree(PyObject *self, PyObject *args, PyObject *kwargs) PyBuffer_Release(&view); + if (reader.ptr != reader.end) + { + Py_DecRef(value); + return PyErr_Format(PyExc_ValueError, "Read %ld bytes, %ld remaining", reader.ptr - reader.start, reader.end - reader.ptr); + } + return value; } From 3071c1b802ad548f7a2ea183038c5be7bc0987d7 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Tue, 15 Oct 2024 16:58:57 +0200 Subject: [PATCH 135/403] README - add credits for ManagedReferencedObjects --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index ea0b67b9..b1fcd123 100644 --- a/README.md +++ b/README.md @@ -413,4 +413,5 @@ many thanks to: - [Perfare](https://github.com/Perfare) for creating and maintaining and every contributor of [AssetStudio](https://github.com/Perfare/AssetStudio) - [ds5678](https://github.com/ds5678) for the [TypeTreeDumps](https://github.com/AssetRipper/TypeTreeDumps) and the [custom minimal Tpk format](https://github.com/AssetRipper/Tpk) - [Razmoth](https://github.com/Razmoth) for figuring out and sharing Unity CN's AssetBundle decryption ([src](https://github.com/Razmoth/PGRStudio)). -- [nesrak1](https://github.com/nesrak1) for figuring out the [Switch texture swizzling](https://github.com/nesrak1/UABEA/blob/master/TexturePlugin/Texture2DSwitchDeswizzler.cs) \ No newline at end of file +- [nesrak1](https://github.com/nesrak1) for figuring out the [Switch texture swizzling](https://github.com/nesrak1/UABEA/blob/master/TexturePlugin/Texture2DSwitchDeswizzler.cs) +- xiop_13690 (discord) for figuring out unsolved issues of the ManagedReferencesRegistry \ No newline at end of file From d38b5f660d1c1f048413cb5dfa0464400f1038be Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Sun, 20 Oct 2024 22:40:29 +0200 Subject: [PATCH 136/403] Texture2DConverter - use astc_encoder for astc decoding --- UnityPy/export/Texture2DConverter.py | 25 ++++++++++++++++++++----- pyproject.toml | 2 +- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/UnityPy/export/Texture2DConverter.py b/UnityPy/export/Texture2DConverter.py index cf58af23..8b41ea0c 100644 --- a/UnityPy/export/Texture2DConverter.py +++ b/UnityPy/export/Texture2DConverter.py @@ -3,8 +3,9 @@ import struct from copy import copy from io import BytesIO -from typing import TYPE_CHECKING, Tuple, Union +from typing import TYPE_CHECKING, Dict, Tuple, Union +import astc_encoder import texture2ddecoder from PIL import Image @@ -68,8 +69,6 @@ def image_to_texture2d( tex_format = TF.ETC2_RGBA8 # ASTC elif target_texture_format.name.startswith("ASTC"): - import astc_encoder - raw_img = img.tobytes("raw", "RGBA") block_size = tuple( @@ -253,9 +252,25 @@ def atc(image_data: bytes, width: int, height: int, alpha: bool) -> Image.Image: return Image.frombytes("RGBA", (width, height), image_data, "raw", "BGRA") +ASTC_CONTEXTS: Dict[Tuple[int, int], astc_encoder.ASTCContext] = {} + + def astc(image_data: bytes, width: int, height: int, block_size: tuple) -> Image.Image: - image_data = texture2ddecoder.decode_astc(image_data, width, height, *block_size) - return Image.frombytes("RGBA", (width, height), image_data, "raw", "BGRA") + context = ASTC_CONTEXTS.get(block_size) + if context is None: + config = astc_encoder.ASTCConfig( + astc_encoder.ASTCProfile.LDR, + *block_size, + 1, + 100, + astc_encoder.ASTCConfigFlags.USE_DECODE_UNORM8, + ) + context = ASTC_CONTEXTS[block_size] = astc_encoder.ASTCContext(config) + + image = astc_encoder.ASTCImage(astc_encoder.ASTCType.U8, width, height, 1) + context.decompress(image_data, image, astc_encoder.ASTCSwizzle.from_str("RGBA")) + + return Image.frombytes("RGBA", (width, height), image.data, "raw", "RGBA") def pvrtc(image_data: bytes, width: int, height: int, fmt: bool) -> Image.Image: diff --git a/pyproject.toml b/pyproject.toml index 47868934..0a903794 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -44,7 +44,7 @@ dependencies = [ "Pillow", "texture2ddecoder", # texture decompression "etcpak", # ETC & DXT compression - "astc-encoder-py", # ASTC compression + "astc-encoder-py >= 0.1.8", # ASTC compression # raw typetree dumping "tabulate", # audio extraction From e7b1bd9723ad9e24abb034eab90d28106841f6b0 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Sun, 20 Oct 2024 23:00:51 +0200 Subject: [PATCH 137/403] 1.20.5 version bump --- UnityPy/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UnityPy/__init__.py b/UnityPy/__init__.py index 2f91fef7..e8f8a5f2 100644 --- a/UnityPy/__init__.py +++ b/UnityPy/__init__.py @@ -1,4 +1,4 @@ -__version__ = "1.20.4" +__version__ = "1.20.5" from .environment import Environment as Environment from .helpers.ArchiveStorageManager import ( From 8bdaaa0e9eaac8c5e41429fa941d503fbd14607f Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Mon, 21 Oct 2024 18:16:17 +0200 Subject: [PATCH 138/403] Tpk - cache sub node values --- UnityPy/helpers/Tpk.py | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/UnityPy/helpers/Tpk.py b/UnityPy/helpers/Tpk.py index 121a9444..547ca09c 100644 --- a/UnityPy/helpers/Tpk.py +++ b/UnityPy/helpers/Tpk.py @@ -9,7 +9,8 @@ from .TypeTreeHelper import TypeTreeNode TPKTYPETREE: TpkTypeTreeBlob = None -NODES_CACHE: dict = {} +CLASSES_CACHE: Dict[Tuple[int, tuple], TypeTreeNode] = {} +NODES_CACHE: Dict[TpkUnityClass, TypeTreeNode] = {} def init(): @@ -22,10 +23,11 @@ def init(): def get_typetree_node(class_id: int, version: tuple): - global NODES_CACHE + global CLASSES_CACHE key = (class_id, version) - if key in NODES_CACHE: - return NODES_CACHE[key] + cached = CLASSES_CACHE.get(key) + if cached: + return cached class_info = TPKTYPETREE.ClassInformation[class_id].getVersionedClass( UnityVersion.fromList(*version) @@ -34,11 +36,16 @@ def get_typetree_node(class_id: int, version: tuple): raise ValueError("Could not find class info for class id {}".format(class_id)) node = generate_node(class_info) - NODES_CACHE[key] = node + CLASSES_CACHE[key] = node return node def generate_node(class_info: TpkUnityClass) -> TypeTreeNode: + global NODES_CACHE + cached = NODES_CACHE.get(class_info) + if cached: + return cached + nodes = [] NODES = TPKTYPETREE.NodeBuffer.Nodes stack = [(class_info.ReleaseRootNode, 0)] @@ -59,7 +66,9 @@ def generate_node(class_info: TpkUnityClass) -> TypeTreeNode: ) stack = [(node_id, level + 1) for node_id in node.SubNodes] + stack index += 1 - return TypeTreeNode.from_list(nodes) + result = TypeTreeNode.from_list(nodes) + NODES_CACHE[class_info] = result + return result ###################################################################################### From 42e13202ff5b5bc265ae52e543fdb6cb65bade11 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Mon, 21 Oct 2024 18:20:27 +0200 Subject: [PATCH 139/403] TypeTree - use UnknownObject, move clean_name to TypeTreeNode, cache cleaned type name --- UnityPy/classes/UnknownObject.py | 28 ++ UnityPy/classes/__init__.py | 5 +- UnityPy/helpers/TypeTreeHelper.py | 132 +++++---- UnityPy/helpers/TypeTreeNode.py | 26 +- UnityPyBoost/TypeTreeHelper.cpp | 460 ++++++++++++++++++------------ UnityPyBoost/TypeTreeHelper.hpp | 5 +- generators/ClassesGenerator.py | 2 +- 7 files changed, 406 insertions(+), 252 deletions(-) create mode 100644 UnityPy/classes/UnknownObject.py diff --git a/UnityPy/classes/UnknownObject.py b/UnityPy/classes/UnknownObject.py new file mode 100644 index 00000000..533af2d4 --- /dev/null +++ b/UnityPy/classes/UnknownObject.py @@ -0,0 +1,28 @@ +from typing import Optional + +from ..helpers.TypeTreeNode import TypeTreeNode +from .Object import Object + + +class UnknownObject(Object): + """An object of unknown type that showed up during typetree parsing.""" + + __node__: Optional[TypeTreeNode] + + def __init__(self, __node__: TypeTreeNode = None, **kwargs): + self.__node__ = __node__ + self.__dict__.update(**kwargs) + + def get_type(self): + return self.__node__.m_Type if self.__node__ else None + + def __repr__(self) -> str: + def format_value(v): + vstr = repr(v) + if len(vstr) > 100: + return vstr[:97] + "..." + return vstr + + return f" {', '.join( + f'{k}={format_value(v)}' for k, v in self.__dict__.items() if k != '__node__' + )}>" diff --git a/UnityPy/classes/__init__.py b/UnityPy/classes/__init__.py index f1e0246c..ec2efb29 100644 --- a/UnityPy/classes/__init__.py +++ b/UnityPy/classes/__init__.py @@ -1,4 +1,5 @@ -from .Object import Object as Object -from .PPtr import PPtr as PPtr from .generated import * from .legacy_patch import * +from .Object import Object as Object +from .PPtr import PPtr as PPtr +from .UnknownObject import UnknownObject as UnknownObject diff --git a/UnityPy/helpers/TypeTreeHelper.py b/UnityPy/helpers/TypeTreeHelper.py index 80da9f72..dd55c112 100644 --- a/UnityPy/helpers/TypeTreeHelper.py +++ b/UnityPy/helpers/TypeTreeHelper.py @@ -11,6 +11,7 @@ from .TypeTreeNode import TypeTreeNode Object = classes.Object +UnknownObject = classes.UnknownObject PPtr = classes.PPtr if TYPE_CHECKING: @@ -134,7 +135,7 @@ def read_typetree( if expected_read and read_typetree_boost: data = reader.read_bytes(expected_read) return read_typetree_boost( - data, root_node, reader.endian, as_dict, assetsfile, classes, clean_name + data, root_node, reader.endian, as_dict, assetsfile, classes ) pos = reader.Position @@ -218,7 +219,9 @@ def read_value( else: config = config.copy() config.has_registry = True - value[child.m_Name] = read_value(child, reader, config) + value[child.m_Name if config.as_dict else child._clean_name] = read_value( + child, reader, config + ) if not config.as_dict: if node.m_Type.startswith("PPtr<"): @@ -228,21 +231,29 @@ def read_value( m_PathID=value["m_PathID"], ) else: - clz = getattr(classes, node.m_Type, Object) - clz_kwargs = {clean_name(key): value for key, value in value.items()} + clz = getattr(classes, node.m_Type, UnknownObject) try: - value = clz(**clz_kwargs) + value = clz(**value) except TypeError: - extra_keys = set(clz_kwargs.keys()) - set(clz.__annotations__) - value = clz( - **{ - key: value - for key, value in clz_kwargs.items() - if key in clz.__annotations__ - } - ) - for key in extra_keys: - setattr(value, key, clz_kwargs[key]) + keys = set(value.keys()) + annotation_keys = set(clz.__annotations__) + missing_keys = annotation_keys - keys + if clz is UnknownObject or missing_keys: + value = UnknownObject(node, **value) + else: + extra_keys = keys - annotation_keys + if extra_keys: + value = clz( + **{ + key: value + for key, value in value.items() + if key in clz.__annotations__ + } + ) + for key in extra_keys: + setattr(value, key, value[key]) + else: + value = UnknownObject(**value) if align: reader.align_stream() @@ -313,53 +324,66 @@ def read_value_array( } for _ in range(size) ] + elif node.m_Type.startswith("PPtr<"): + value = [ + PPtr[Any]( + assetsfile=config.assetsfile, + **{ + child.m_Name: read_value(child, reader, config) + for child in node.m_Children + }, + ) + for _ in range(size) + ] else: - if node.m_Type.startswith("PPtr<"): + clz = getattr( + classes, + node.m_Type, + UnknownObject, + ) + keys = set(child._clean_name for child in node.m_Children) + annotation_keys = set(clz.__annotations__) + missing_keys = annotation_keys - keys + extra_keys = keys - annotation_keys + if missing_keys or clz is UnknownObject: value = [ - PPtr[Any]( - assetsfile=config.assetsfile, + UnknownObject( + node, **{ - child.m_Name: read_value(child, reader, config) + child._clean_name: read_value(child, reader, config) for child in node.m_Children }, ) for _ in range(size) ] + elif extra_keys: + value = [None] * size + for i in range(size): + value_i_d = { + child._clean_name: read_value(child, reader, config) + for child in node.m_Children + } + value_i = clz( + **{ + key: value + for key, value in value_i_d.items() + if key in annotation_keys + } + ) + for key in extra_keys: + setattr(value_i, key, value_i_d[key]) + value[i] = value_i else: - clz = getattr( - classes, - node.m_Type, - Object, - ) - clean_names = [clean_name(child.m_Name) for child in node.m_Children] - if all(name in clz.__annotations__ for name in clean_names): - value = [ - clz( - **{ - name: read_value(child, reader, config) - for name, child in zip(clean_names, node.m_Children) - } - ) - for _ in range(size) - ] - else: - extra_keys = set(clean_names) - set(clz.__annotations__) - value = [None] * size - for i in range(size): - value_i_d = { - clean_name(child.m_Name): read_value(child, reader, config) + value = [ + clz( + **{ + child._clean_name: read_value(child, reader, config) for child in node.m_Children } - value_i = clz( - **{ - key: value - for key, value in value_i_d.items() - if key in clz.__annotations__ - } - ) - for key in extra_keys: - setattr(value_i, key, value_i_d[key]) - value[i] = value_i + ) + for _ in range(size) + ] + if align: reader.align_stream() return value @@ -409,7 +433,7 @@ def clean_name(name: str) -> str: def write_value( - value: Any, + value: Union[dict[str, Any], Object], node: TypeTreeNode, writer: EndianBinaryWriter, config: TypeTreeConfig, @@ -456,9 +480,7 @@ def write_value( else: config = config.copy() config.has_registry = True - write_value( - getattr(value, clean_name(child.m_Name)), child, writer, config - ) + write_value(getattr(value, child._clean_name), child, writer, config) if align: writer.align_stream() diff --git a/UnityPy/helpers/TypeTreeNode.py b/UnityPy/helpers/TypeTreeNode.py index aa02ef4f..89cd8fed 100644 --- a/UnityPy/helpers/TypeTreeNode.py +++ b/UnityPy/helpers/TypeTreeNode.py @@ -1,6 +1,8 @@ from __future__ import annotations + +import re from struct import Struct -from typing import Optional, List, Tuple, TYPE_CHECKING, Dict, Iterator +from typing import TYPE_CHECKING, Dict, Iterator, List, Optional, Tuple from attrs import define, field @@ -27,6 +29,10 @@ class TypeTreeNodeC: m_Index: Optional[int] = None m_MetaFlag: Optional[int] = None m_RefTypeHash: Optional[int] = None + _clean_name: str = field(init=False) + + def __attrs_post_init__(self): + self._clean_name = clean_name(self.m_Name) class TypeTreeNode(TypeTreeNodeC): @@ -41,8 +47,8 @@ def traverse(self) -> Iterator[TypeTreeNode]: def parse(cls, reader: EndianBinaryReader, version: int) -> TypeTreeNode: # stack approach is way faster than recursion # using a fake root node to avoid special case for root node - dummy_node = cls(-1, "", "", 0, 0, 0, []) - dummy_root = cls(-1, "", "", 0, 0, 0, [dummy_node]) + dummy_node = cls(-1, "", "", 0, 0, []) + dummy_root = cls(-1, "", "", 0, 0, [dummy_node]) stack: List[Tuple[TypeTreeNode, int]] = [(dummy_root, 1)] while stack: @@ -262,3 +268,17 @@ def _get_blob_node_struct(endian: str, version: int) -> tuple[Struct, list[str]] keys.append("m_RefTypeHash") return Struct(struct_type), keys + + +def clean_name(name: str) -> str: + # keep in sync with TypeTreeHelper.cpp + if name.startswith("(int&)"): + name = name[6:] + if name.endswith("?"): + name = name[:-1] + name = re.sub(r"[ \.:\-\[\]]", "_", name) + if name in ["pass", "from"]: + name += "_" + if name[0].isdigit(): + name = f"x{name}" + return name diff --git a/UnityPyBoost/TypeTreeHelper.cpp b/UnityPyBoost/TypeTreeHelper.cpp index 08e7262a..c4facc7b 100644 --- a/UnityPyBoost/TypeTreeHelper.cpp +++ b/UnityPyBoost/TypeTreeHelper.cpp @@ -2,6 +2,8 @@ #include #include #include +#include +#include #include "swap.hpp" #include "TypeTreeHelper.hpp" @@ -20,10 +22,44 @@ typedef struct TypeTreeReaderConfig bool as_dict; PyObject *classes; PyObject *assetfile; - PyObject *clean_name; bool has_registry; } TypeTreeReaderConfigT; +std::string clean_name(const std::string &name) +{ + // # keep in sync with TypeTreeNode.py + std::string cleaned_name = name; + + // Remove "(int&)" prefix + if (cleaned_name.substr(0, 6) == "(int&)") + { + cleaned_name = cleaned_name.substr(6); + } + + // Remove trailing "?" + if (!cleaned_name.empty() && cleaned_name.back() == '?') + { + cleaned_name.pop_back(); + } + + // Replace certain characters with "_" + cleaned_name = std::regex_replace(cleaned_name, std::regex("[ \\.:\\-\\[\\]]"), "_"); + + // Append "_" if the name is "pass" or "from" + if (cleaned_name == "pass" || cleaned_name == "from") + { + cleaned_name += "_"; + } + + // Prefix with "x" if the name starts with a digit + if (!cleaned_name.empty() && isdigit(cleaned_name[0])) + { + cleaned_name = "x" + cleaned_name; + } + + return cleaned_name; +} + inline void align4(ReaderT *reader) { size_t offset = (size_t)reader->ptr - (size_t)reader->start; @@ -312,7 +348,9 @@ inline PyObject *read_pair(ReaderT *reader, TypeTreeNodeObject *node, TypeTreeRe Py_DECREF(first); return NULL; } + // PyTuple_Pack creates two strong references PyObject *pair = PyTuple_Pack(2, first, second); + // so we need to decref both values here to bring their ref count back to 1 Py_DECREF(first); Py_DECREF(second); return pair; @@ -354,131 +392,179 @@ inline PyObject *read_pair_array(ReaderT *reader, TypeTreeNodeObject *node, Type return list; } -template -inline PyObject *parse_class(ReaderT *reader, PyObject *dict, TypeTreeNodeObject *node, TypeTreeReaderConfigT *config) +template +inline PyObject *read_class(ReaderT *reader, TypeTreeNodeObject *node, TypeTreeReaderConfigT *config) { - PyObject *clz = NULL; - - // Determine the class based on node's _data_type - if (node->_data_type == NodeDataType::PPtr) + bool changed_registry = false; + PyObject *value = PyDict_New(); + for (int i = 0; i < PyList_GET_SIZE(node->m_Children); i++) { - if (PyDict_SetItemString(dict, "assetsfile", config->assetfile) != 0) + TypeTreeNodeObject *child = (TypeTreeNodeObject *)PyList_GET_ITEM(node->m_Children, i); + if (child->_data_type == NodeDataType::ManagedReferencesRegistry) + { + if (config->has_registry) + { + continue; + } + else + { + changed_registry = true; + config->has_registry = true; + } + } + PyObject *child_value = read_typetree_value(reader, child, config); + if (!child_value) + { + Py_DECREF(value); + return NULL; + } + int set_item_result; + if constexpr (as_dict == true) + { + set_item_result = PyDict_SetItem(value, child->m_Name, child_value); + } + else + { + set_item_result = PyDict_SetItem(value, child->_clean_name, child_value); + } + if (set_item_result != 0) { - PyErr_SetString(PyExc_RuntimeError, "Failed to set 'assetsfile'"); - Py_DECREF(dict); + Py_DECREF(value); + Py_DECREF(child_value); return NULL; } + // PyDict_SetItem increases ref count, so we need to decref here + Py_DECREF(child_value); + } + + if (changed_registry) + { + config->has_registry = false; + } + + return value; +} + +#if PY_VERSION_HEX >= 0x030e0000 +PyObject *get_annotations = nullptr; +#endif + +inline PyObject *get_annotations(PyObject *clz) +{ +#if PY_VERSION_HEX >= 0x030e0000 + if (get_annotations == nullptr) + { + // from annotationlib import get_annotations + PyObject *annotationlib = PyImport_ImportModule("annotationlib"); + get_annotations = PyObject_GetAttrString(annotationlib, "get_annotations"); + Py_DECREF(annotationlib); + } + return PyObject_CallFunctionObjArgs(get_annotations, clz, NULL); +#else + return PyObject_GetAttrString(clz, "__annotations__"); +#endif +} + +inline PyObject *parse_class(PyObject *kwargs, TypeTreeNodeObject *node, TypeTreeReaderConfigT *config) +{ + PyObject *instance = nullptr; + PyObject *clz = nullptr; + PyObject *args = PyTuple_New(0); + PyObject *annotations = nullptr; + PyObject *extras = nullptr; + // dict iterator values + PyObject *key, *value = nullptr; + Py_ssize_t pos; + + if (node->_data_type == NodeDataType::PPtr) + { clz = PyObject_GetAttrString(config->classes, "PPtr"); + if (clz == nullptr) + { + PyErr_SetString(PyExc_ValueError, "Failed to get PPtr class"); + goto PARSE_CLASS_CLEANUP; + } + PyDict_SetItemString(kwargs, "assetsfile", config->assetfile); } else { clz = PyObject_GetAttr(config->classes, node->m_Type); - if (clz == NULL) + if (clz == nullptr) { - clz = PyObject_GetAttrString(config->classes, "Object"); + clz = PyObject_GetAttrString(config->classes, "UnknownObject"); + if (clz == nullptr) + { + PyErr_SetString(PyExc_ValueError, "Failed to get UnknownObject class"); + goto PARSE_CLASS_CLEANUP; + } + PyDict_SetItemString(kwargs, "__node__", node->m_Type); } } - // check if class is found - if (clz == NULL) + instance = PyObject_Call(clz, args, kwargs); + if (instance != nullptr) { - PyErr_SetString(PyExc_ValueError, "Failed to get class"); - Py_DECREF(clz); - Py_DECREF(dict); - return NULL; + goto PARSE_CLASS_CLEANUP; } + PyErr_Clear(); - // try to create class instance - PyObject *args = PyTuple_New(0); - PyObject *instance = PyObject_Call(clz, args, dict); - if (instance != NULL) + // possibly extra fields + annotations = get_annotations(clz); + if (annotations == nullptr) { - // success - // cleanup - Py_DECREF(clz); - Py_DECREF(args); - Py_DECREF(dict); - // return instance - return instance; + PyErr_SetString(PyExc_ValueError, "Failed to get annotations"); + goto PARSE_CLASS_CLEANUP; } - // failed, clear error - PyErr_Clear(); - - // clean key names - PyObject *key = NULL; - PyObject *keys = PyDict_Keys(dict); - PyObject *clean_args = PyTuple_New(1); - for (Py_ssize_t i = 0; i < PyList_GET_SIZE(keys); i++) + extras = PyDict_New(); + for (int i = 0; i < PyList_GET_SIZE(node->m_Children); i++) { - key = PyList_GET_ITEM(keys, i); - PyTuple_SET_ITEM(clean_args, 0, key); - PyObject *clean_key = PyObject_Call(config->clean_name, clean_args, NULL); - if (PyUnicode_Compare(key, clean_key)) + TypeTreeNodeObject *child = (TypeTreeNodeObject *)PyList_GET_ITEM(node->m_Children, i); + if (PyDict_Contains(annotations, child->_clean_name) == 1) { - PyObject *value = PyDict_GetItem(dict, key); - PyDict_SetItem(dict, clean_key, value); - PyDict_DelItem(dict, key); + continue; } - Py_DECREF(clean_key); + PyObject *extra_value = PyDict_GetItem(kwargs, child->_clean_name); // +1 + PyDict_SetItem(extras, child->_clean_name, extra_value); // +1 + PyDict_DelItem(kwargs, child->_clean_name); // -1 + Py_DECREF(extra_value); // -1 } - // increase ref count for key, as PyTuple_SET_ITEM steals reference, so decref there will decref key - Py_INCREF(key); - Py_DECREF(clean_args); - Py_DECREF(keys); - // try to create class instance again with cleaned keys - instance = PyObject_Call(clz, args, dict); - if (instance != NULL) + if (PyDict_Size(extras) == 0) { - // success - // cleanup Py_DECREF(clz); - Py_DECREF(args); - Py_DECREF(dict); - // return instance - return instance; + clz = PyObject_GetAttrString(config->classes, "UnknownObject"); + PyDict_SetItemString(kwargs, "__node__", node->m_Type); } - // failed, clear error - PyErr_Clear(); - // some keys might be extra, check against __annotations__ - PyObject *annonations = PyObject_GetAttrString(clz, "__annotations__"); - PyObject *extras = PyDict_New(); - keys = PyDict_Keys(dict); - for (Py_ssize_t i = 0; i < PyList_Size(keys); i++) + instance = PyObject_Call(clz, args, kwargs); + if (instance != nullptr) { - PyObject *key = PyList_GET_ITEM(keys, i); - if (PyDict_Contains(annonations, key) == 0) + pos = 0; + while (PyDict_Next(extras, &pos, &key, &value)) { - PyObject *value = PyDict_GetItem(dict, key); - PyDict_SetItem(extras, key, value); - PyDict_DelItem(dict, key); + PyObject_SetItem(instance, key, value); } } - Py_DECREF(keys); - Py_DECREF(annonations); + PyErr_Clear(); - // try to create class instance again with cleaned keys - instance = PyObject_Call(clz, args, dict); - if (instance != NULL) + // if we still failed to create an instance, fallback to UnknownObject + Py_DECREF(clz); + clz = PyObject_GetAttrString(config->classes, "UnknownObject"); + PyDict_SetItemString(kwargs, "__node__", node->m_Type); + // merge extras back into kwargs + pos = 0; + while (PyDict_Next(extras, &pos, &key, &value)) { - // success, manually set extra keys - PyObject *items = PyDict_Items(extras); - for (Py_ssize_t i = 0; i < PyList_Size(items); i++) - { - PyObject *item = PyList_GET_ITEM(items, i); - PyObject *key = PyTuple_GetItem(item, 0); - PyObject *value = PyTuple_GetItem(item, 1); - PyObject_SetAttr(instance, key, value); - } - Py_DECREF(items); + PyObject_SetItem(kwargs, key, value); } - // cleanup - Py_DECREF(clz); + instance = PyObject_Call(clz, args, kwargs); + +PARSE_CLASS_CLEANUP: Py_DECREF(args); - Py_DECREF(dict); - Py_DECREF(extras); - // return instance or NULL if failed + Py_DECREF(kwargs); + Py_XDECREF(clz); + Py_XDECREF(annotations); + Py_XDECREF(extras); return instance; } @@ -750,45 +836,14 @@ PyObject *read_typetree_value(ReaderT *reader, TypeTreeNodeObject *node, TypeTre else { // class - bool changed_registry = false; - value = PyDict_New(); - for (int i = 0; i < PyList_GET_SIZE(node->m_Children); i++) + if (config->as_dict) { - child = (TypeTreeNodeObject *)PyList_GET_ITEM(node->m_Children, i); - if (child->_data_type == NodeDataType::ManagedReferencesRegistry) - { - if (config->has_registry) - { - continue; - } - else - { - changed_registry = true; - config->has_registry = true; - } - } - PyObject *child_value = read_typetree_value(reader, child, config); - if (!child_value) - { - Py_DECREF(value); - return NULL; - } - if (PyDict_SetItem(value, child->m_Name, child_value)) - { - Py_DECREF(value); - Py_DECREF(child_value); - return NULL; - } - // dict increases ref count, so we need to decref here - Py_DECREF(child_value); + value = read_class(reader, node, config); } if (!config->as_dict) { - value = parse_class(reader, value, node, config); - } - if (changed_registry) - { - config->has_registry = false; + value = read_class(reader, node, config); + value = parse_class(value, node, config); } } } @@ -858,7 +913,7 @@ PyObject *read_typetree_value_array(ReaderT *reader, TypeTreeNodeObject *node, T PyObject *read_typetree(PyObject *self, PyObject *args, PyObject *kwargs) { - const char *kwlist[] = {"data", "node", "endian", "as_dict", "assetsfile", "classes", "clean_name", NULL}; + const char *kwlist[] = {"data", "node", "endian", "as_dict", "assetsfile", "classes", NULL}; PyObject *data; PyObject *node; PyObject *as_dict = Py_True; @@ -867,14 +922,13 @@ PyObject *read_typetree(PyObject *self, PyObject *args, PyObject *kwargs) false, Py_None, Py_None, - Py_None, false, }; char endian; bool swap; - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OOC|OOOO", (char **)kwlist, &data, &node, &endian, &as_dict, &config.assetfile, &config.classes, &config.clean_name)) + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OOC|OOO", (char **)kwlist, &data, &node, &endian, &as_dict, &config.assetfile, &config.classes)) { return NULL; } @@ -882,11 +936,6 @@ PyObject *read_typetree(PyObject *self, PyObject *args, PyObject *kwargs) config.as_dict = as_dict == Py_True; if (!config.as_dict) { - if (PyCallable_Check(config.clean_name) == 0) - { - PyErr_SetString(PyExc_ValueError, "clean_name must be callable if not as dict"); - return NULL; - } if (config.assetfile == Py_None) { PyErr_SetString(PyExc_ValueError, "assetsfile must be set if not as dict"); @@ -900,7 +949,6 @@ PyObject *read_typetree(PyObject *self, PyObject *args, PyObject *kwargs) } Py_INCREF(config.assetfile); Py_INCREF(config.classes); - Py_INCREF(config.clean_name); volatile uint16_t bint = 0x0100; volatile bool is_big_endian = ((uint8_t *)&bint)[0] == 1; @@ -928,16 +976,24 @@ PyObject *read_typetree(PyObject *self, PyObject *args, PyObject *kwargs) } break; default: + { + Py_DECREF(config.assetfile); + Py_DECREF(config.classes); PyErr_SetString(PyExc_ValueError, "Invalid endian"); - break; + return NULL; + } } + Py_buffer view; if (PyObject_GetBuffer(data, &view, PyBUF_SIMPLE) == -1) { + Py_DECREF(config.assetfile); + Py_DECREF(config.classes); PyErr_SetString(PyExc_ValueError, "Failed to get buffer"); return NULL; } + ReaderT reader = {static_cast(view.buf), static_cast(view.buf) + view.len, static_cast(view.buf)}; PyObject *value; @@ -951,6 +1007,8 @@ PyObject *read_typetree(PyObject *self, PyObject *args, PyObject *kwargs) } PyBuffer_Release(&view); + Py_DECREF(config.assetfile); + Py_DECREF(config.classes); if (reader.ptr != reader.end) { @@ -1008,6 +1066,40 @@ static const std::map typeToNodeDataType = { {"ManagedReferencesRegistry", NodeDataType::ManagedReferencesRegistry}, }; +static inline NodeDataType get_node_data_type(PyObject *py_type) +{ + if (py_type == Py_None) + { + return NodeDataType::unk; + } + + const char *type = PyUnicode_AsUTF8(py_type); + if (type[0] == 'P' && type[1] == 'P' && type[2] == 't' && type[3] == 'r' && type[4] == '<') + { + return NodeDataType::PPtr; + } + else + { + for (auto it = typeToNodeDataType.begin(); it != typeToNodeDataType.end(); ++it) + { + if (strcmp(it->first, type) == 0) + { + return it->second; + } + } + } + return NodeDataType::unk; +} + +static inline void set_none_if_null_n_incref(PyObject **field) +{ + if (*field == nullptr) + { + *field = Py_None; + } + Py_INCREF(*field); +} + static int TypeTreeNode_init(TypeTreeNodeObject *self, PyObject *args, PyObject *kwargs) { const char *kwlist[] = { @@ -1024,78 +1116,67 @@ static int TypeTreeNode_init(TypeTreeNodeObject *self, PyObject *args, PyObject "m_RefTypeHash", NULL}; - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OOOOO|OOOOOO", (char **)kwlist, - &self->m_Level, - &self->m_Type, - &self->m_Name, - &self->m_ByteSize, - &self->m_Version, - &self->m_Children, - &self->m_TypeFlags, - &self->m_VariableCount, - &self->m_Index, - &self->m_MetaFlag, - &self->m_RefTypeHash)) + // ensure all fields are set to 0 + // in case init fails, so that dealloc doesn't segfault + self->m_Level = nullptr; + self->m_Type = nullptr; + self->m_Name = nullptr; + self->m_ByteSize = nullptr; + self->m_TypeFlags = nullptr; + self->m_Version = nullptr; + self->m_Children = nullptr; + self->m_VariableCount = nullptr; + self->m_Index = nullptr; + self->m_MetaFlag = nullptr; + self->m_RefTypeHash = nullptr; + + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!O!O!O!O!|O!O!O!O!O!O!", (char **)kwlist, + // required fields + &PyLong_Type, &self->m_Level, + &PyUnicode_Type, &self->m_Type, + &PyUnicode_Type, &self->m_Name, + &PyLong_Type, &self->m_ByteSize, + &PyLong_Type, &self->m_Version, + // optional fields + &PyList_Type, &self->m_Children, + &PyLong_Type, &self->m_TypeFlags, + &PyLong_Type, &self->m_VariableCount, + &PyLong_Type, &self->m_Index, + &PyLong_Type, &self->m_MetaFlag, + &PyLong_Type, &self->m_RefTypeHash)) { return -1; } + // incref to keep values alive Py_INCREF(self->m_Level); Py_INCREF(self->m_Type); Py_INCREF(self->m_Name); Py_INCREF(self->m_ByteSize); Py_INCREF(self->m_Version); - // optional fields + + // optional values - can still be nullptr if (self->m_Children == nullptr) { self->m_Children = PyList_New(0); } else { - Py_XINCREF(self->m_Children); + Py_INCREF(self->m_Children); } + set_none_if_null_n_incref(&self->m_TypeFlags); + set_none_if_null_n_incref(&self->m_VariableCount); + set_none_if_null_n_incref(&self->m_Index); + set_none_if_null_n_incref(&self->m_MetaFlag); + set_none_if_null_n_incref(&self->m_RefTypeHash); -#define SET_NONE_IF_NULL(field) \ - { \ - if (self->field == nullptr) \ - { \ - self->field = Py_None; \ - } \ - Py_INCREF(self->field); \ - } - - SET_NONE_IF_NULL(m_TypeFlags); - SET_NONE_IF_NULL(m_VariableCount); - SET_NONE_IF_NULL(m_Index); - SET_NONE_IF_NULL(m_MetaFlag); - SET_NONE_IF_NULL(m_RefTypeHash); - - if (self->m_MetaFlag != Py_None && PyLong_AsLong(self->m_MetaFlag) & 0x4000) - { - self->_align = true; - } - - if (self->m_Type != Py_None) - { - const char *type = PyUnicode_AsUTF8(self->m_Type); - self->_data_type = NodeDataType::unk; - if (type[0] == 'P' && type[1] == 'P' && type[2] == 't' && type[3] == 'r' && type[4] == '<') - { - self->_data_type = NodeDataType::PPtr; - } - else - { - for (auto it = typeToNodeDataType.begin(); it != typeToNodeDataType.end(); ++it) - { - if (strcmp(it->first, type) == 0) - { - self->_data_type = it->second; - break; - } - } - } - } + // set private fields required for fast access + self->_data_type = get_node_data_type(self->m_Type); + self->_align = (self->m_MetaFlag != Py_None && PyLong_AsLong(self->m_MetaFlag) & 0x4000); + std::string sname = PyUnicode_AsUTF8(self->m_Name); + std::string sclean_name = clean_name(sname); + self->_clean_name = PyUnicode_FromString(sclean_name.c_str()); return 0; } @@ -1111,6 +1192,7 @@ static PyMemberDef TypeTreeNode_members[] = { {"m_Index", T_OBJECT_EX, offsetof(TypeTreeNodeObject, m_Index), 0, ""}, {"m_MetaFlag", T_OBJECT_EX, offsetof(TypeTreeNodeObject, m_MetaFlag), 0, ""}, {"m_RefTypeHash", T_OBJECT_EX, offsetof(TypeTreeNodeObject, m_RefTypeHash), 0, ""}, + {"_clean_name", T_OBJECT_EX, offsetof(TypeTreeNodeObject, _clean_name), 0, ""}, {NULL} /* Sentinel */ }; diff --git a/UnityPyBoost/TypeTreeHelper.hpp b/UnityPyBoost/TypeTreeHelper.hpp index 15cf0d80..f13578b0 100644 --- a/UnityPyBoost/TypeTreeHelper.hpp +++ b/UnityPyBoost/TypeTreeHelper.hpp @@ -33,9 +33,10 @@ typedef struct TypeTreeNodeObject PyObject_HEAD // helper field - simple hash of type for faster comparison unsigned int _data_type; - bool _align; + bool _align; + PyObject *_clean_name; // used filds for fast access - PyObject* m_Children; + PyObject *m_Children; PyObject *m_Name; // fields not used in C PyObject *m_Level; diff --git a/generators/ClassesGenerator.py b/generators/ClassesGenerator.py index 1c9ea09d..b1c6cf0a 100644 --- a/generators/ClassesGenerator.py +++ b/generators/ClassesGenerator.py @@ -10,7 +10,7 @@ ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) sys.path.append(ROOT) from UnityPy.helpers.Tpk import TPKTYPETREE, TpkUnityNode # noqa: E402 -from UnityPy.helpers.TypeTreeHelper import clean_name # noqa: E402 +from UnityPy.helpers.TypeTreeNode import clean_name # noqa: E402 NODES = TPKTYPETREE.NodeBuffer.Nodes STRINGS = TPKTYPETREE.StringBuffer.Strings From 6a0c75323fdcbba607fc42c7af1fa66d886a01cd Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Mon, 21 Oct 2024 18:20:45 +0200 Subject: [PATCH 140/403] add UnityPyBoost type stubs --- UnityPy/UnityPyBoost.pyi | 38 ++++++++++++++++++++++++++++++++++++++ UnityPy/py.typed | 0 2 files changed, 38 insertions(+) create mode 100644 UnityPy/UnityPyBoost.pyi create mode 100644 UnityPy/py.typed diff --git a/UnityPy/UnityPyBoost.pyi b/UnityPy/UnityPyBoost.pyi new file mode 100644 index 00000000..da72c632 --- /dev/null +++ b/UnityPy/UnityPyBoost.pyi @@ -0,0 +1,38 @@ +from __future__ import annotations +from typing import Union, TYPE_CHECKING, Literal, Optional, List, Any + +if TYPE_CHECKING: + from .files.SerializedFile import SerializedFile + from .classes import Object + +def unpack_vertexdata( + data: Union[bytes, bytearray], + vertex_count: int, + stream_offset: int, + stream_stride: int, + channel_offset: int, + channel_dimension: int, + swap: bool, +) -> bytes: ... +def read_typetree( + data: Union[bytes, bytearray], + node: TypeTreeNode, + endian: Literal["<", ">"], + as_dict: bool, + assetsfile: SerializedFile, + classes: dict, +) -> Union[dict[str, Any], Object]: ... + +class TypeTreeNode: + m_Level: int + m_Type: str + m_Name: str + m_ByteSize: int + m_Version: int + m_Children: List[TypeTreeNode] + m_TypeFlags: Optional[int] = None + m_VariableCount: Optional[int] = None + m_Index: Optional[int] = None + m_MetaFlag: Optional[int] = None + m_RefTypeHash: Optional[int] = None + _clean_name: str diff --git a/UnityPy/py.typed b/UnityPy/py.typed new file mode 100644 index 00000000..e69de29b From 825f6b63389bb2f11ea35029106cbc7c8c1890b6 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Mon, 21 Oct 2024 21:45:50 +0200 Subject: [PATCH 141/403] TypeTreeHelper - Node clear clean_name | add ref count comments --- UnityPyBoost/TypeTreeHelper.cpp | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/UnityPyBoost/TypeTreeHelper.cpp b/UnityPyBoost/TypeTreeHelper.cpp index c4facc7b..5ae008dc 100644 --- a/UnityPyBoost/TypeTreeHelper.cpp +++ b/UnityPyBoost/TypeTreeHelper.cpp @@ -384,7 +384,8 @@ inline PyObject *read_pair_array(ReaderT *reader, TypeTreeNodeObject *node, Type Py_DECREF(list); return NULL; } - PyList_SET_ITEM(list, i, PyTuple_Pack(2, first, second)); + PyList_SET_ITEM(list, i, PyTuple_Pack(2, first, second)); // pack creates two strong references + // so we need to decref both values here to bring their ref count back to 1 Py_DECREF(first); Py_DECREF(second); } @@ -396,10 +397,10 @@ template inline PyObject *read_class(ReaderT *reader, TypeTreeNodeObject *node, TypeTreeReaderConfigT *config) { bool changed_registry = false; - PyObject *value = PyDict_New(); + PyObject *value = PyDict_New(); // value: 1 refcount for (int i = 0; i < PyList_GET_SIZE(node->m_Children); i++) { - TypeTreeNodeObject *child = (TypeTreeNodeObject *)PyList_GET_ITEM(node->m_Children, i); + TypeTreeNodeObject *child = (TypeTreeNodeObject *)PyList_GET_ITEM(node->m_Children, i); // no refcount change if (child->_data_type == NodeDataType::ManagedReferencesRegistry) { if (config->has_registry) @@ -412,29 +413,29 @@ inline PyObject *read_class(ReaderT *reader, TypeTreeNodeObject *node, TypeTreeR config->has_registry = true; } } - PyObject *child_value = read_typetree_value(reader, child, config); + PyObject *child_value = read_typetree_value(reader, child, config); // child_value: 1 refcount if (!child_value) { - Py_DECREF(value); + Py_DECREF(value); // value: 0 refcount return NULL; } int set_item_result; if constexpr (as_dict == true) { - set_item_result = PyDict_SetItem(value, child->m_Name, child_value); + set_item_result = PyDict_SetItem(value, child->m_Name, child_value); // child_value: 2 refcount } else { - set_item_result = PyDict_SetItem(value, child->_clean_name, child_value); + set_item_result = PyDict_SetItem(value, child->_clean_name, child_value); // child_value: 2 refcount } if (set_item_result != 0) { - Py_DECREF(value); - Py_DECREF(child_value); + Py_DECREF(value); // value: 0 refcount + Py_DECREF(child_value); // child_value: 0 refcount return NULL; } // PyDict_SetItem increases ref count, so we need to decref here - Py_DECREF(child_value); + Py_DECREF(child_value); // child_value: 1 refcount } if (changed_registry) @@ -1033,6 +1034,7 @@ static void TypeTreeNode_dealloc(TypeTreeNodeObject *self) Py_XDECREF(self->m_MetaFlag); Py_XDECREF(self->m_RefTypeHash); Py_XDECREF(self->m_Children); + Py_XDECREF(self->_clean_name); Py_TYPE(self)->tp_free((PyObject *)self); } @@ -1129,6 +1131,7 @@ static int TypeTreeNode_init(TypeTreeNodeObject *self, PyObject *args, PyObject self->m_Index = nullptr; self->m_MetaFlag = nullptr; self->m_RefTypeHash = nullptr; + self->_clean_name = nullptr; if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!O!O!O!O!|O!O!O!O!O!O!", (char **)kwlist, // required fields @@ -1176,7 +1179,7 @@ static int TypeTreeNode_init(TypeTreeNodeObject *self, PyObject *args, PyObject std::string sname = PyUnicode_AsUTF8(self->m_Name); std::string sclean_name = clean_name(sname); - self->_clean_name = PyUnicode_FromString(sclean_name.c_str()); + self->_clean_name = PyUnicode_FromString(sclean_name.c_str()); // comes with strong ref return 0; } From 422db659716a852d74a6bff5cd402323168cf488 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Mon, 21 Oct 2024 21:46:08 +0200 Subject: [PATCH 142/403] TypeTreeHelper C - FileSignature -> FileSize --- UnityPyBoost/TypeTreeHelper.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UnityPyBoost/TypeTreeHelper.cpp b/UnityPyBoost/TypeTreeHelper.cpp index 5ae008dc..d1ab3300 100644 --- a/UnityPyBoost/TypeTreeHelper.cpp +++ b/UnityPyBoost/TypeTreeHelper.cpp @@ -1055,7 +1055,7 @@ static const std::map typeToNodeDataType = { {"SInt64", NodeDataType::s64}, {"unsigned long long", NodeDataType::u64}, {"UInt64", NodeDataType::u64}, - {"FileSignature", NodeDataType::u64}, + {"FileSize", NodeDataType::u64}, {"float", NodeDataType::f32}, {"double", NodeDataType::f64}, {"bool", NodeDataType::boolean}, From 75ca7add796f6b86c6d4b9bb4ed54d9ed8726178 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Mon, 21 Oct 2024 22:09:53 +0200 Subject: [PATCH 143/403] TPK - impl TpkUnityClass.to_dict --- UnityPy/helpers/Tpk.py | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/UnityPy/helpers/Tpk.py b/UnityPy/helpers/Tpk.py index 547ca09c..a636d7d1 100644 --- a/UnityPy/helpers/Tpk.py +++ b/UnityPy/helpers/Tpk.py @@ -352,12 +352,28 @@ def __init__(self, stream: BytesIO) -> None: if self.Flags & TpkUnityClassFlags.HasReleaseRootNode: (self.ReleaseRootNode,) = UINT16.unpack(stream.read(UINT16.size)) + def to_dict(self) -> Dict[str, Any]: + return { + "Name": self.Name, + "Base": self.Base, + "Flags": self.Flags, + "EditorRootNode": self.EditorRootNode, + "ReleaseRootNode": self.ReleaseRootNode, + } + def __eq__(self, other: TpkUnityClass) -> bool: - return self.__dict__ == other.__dict__ + return self.to_dict() == other.to_dict() def __hash__(self) -> int: - # TODO - return hash(self.__dict__) + return hash( + ( + self.Name, + self.Base, + self.Flags, + self.EditorRootNode, + self.ReleaseRootNode, + ) + ) class TpkClassInformation: From 23fb7dce326d45dd6acff7255278d45f4febb9e4 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Mon, 21 Oct 2024 22:15:11 +0200 Subject: [PATCH 144/403] add simple typetree test set --- .github/workflows/publish.yml | 2 +- .github/workflows/test.yml | 2 +- tests/test_typetree.py | 199 ++++++++++++++++++++++++++++++++++ 3 files changed, 201 insertions(+), 2 deletions(-) create mode 100644 tests/test_typetree.py diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 67a99c1c..e8919b0b 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -57,7 +57,7 @@ jobs: # Disabled repair wheel since the fmob lib is not compatible CIBW_REPAIR_WHEEL_COMMAND: '' CIBW_REPAIR_WHEEL_COMMAND_LINUX: 'mv {wheel} {dest_dir}/"$(basename {wheel} | sed "s/-linux_/-manylinux_2_17_/")"' - CIBW_TEST_REQUIRES: pytest + CIBW_TEST_REQUIRES: pytest psutil CIBW_TEST_COMMAND: pytest -v -s {package}/tests CIBW_TEST_SKIP: "*-macosx* *-manylinux_i686 *-win32" diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index da20ef0d..e8af0ff6 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -29,7 +29,7 @@ jobs: - name: Install Dependencies run: | - python -m pip install --upgrade pip pytest + python -m pip install --upgrade pip pytest psutil - name: Install UnityPy run: | diff --git a/tests/test_typetree.py b/tests/test_typetree.py new file mode 100644 index 00000000..da3653b3 --- /dev/null +++ b/tests/test_typetree.py @@ -0,0 +1,199 @@ +import gc +import math +import os +import random +from typing import List, Literal, Tuple, TypeVar + +import psutil + +from UnityPy.classes.generated import GameObject +from UnityPy.helpers.Tpk import get_typetree_node +from UnityPy.helpers.TypeTreeHelper import read_typetree, write_typetree +from UnityPy.helpers.TypeTreeNode import TypeTreeNode +from UnityPy.streams import EndianBinaryReader, EndianBinaryWriter + +PROCESS = psutil.Process(os.getpid()) + + +def get_memory(): + gc.collect() + return PROCESS.memory_info().rss + + +def check_leak(func): + def wrapper(*args, **kwargs): + mem_0 = get_memory() + func(*args, **kwargs) + mem_1 = get_memory() + diff = mem_1 - mem_0 + if diff != 0: + diff %= 4096 + assert diff == 0, f"Memory leak in {func.__name__}" + + return wrapper + + +TEST_NODE_STR = "TestNode" + + +@check_leak +def test_typetreenode(): + TypeTreeNode( + m_Level=0, m_Type=TEST_NODE_STR, m_Name=TEST_NODE_STR, m_ByteSize=0, m_Version=0 + ) + + +def generate_dummy_node(typ: str, name: str = ""): + return TypeTreeNode(m_Level=0, m_Type=typ, m_Name=name, m_ByteSize=0, m_Version=0) + + +SIMPLE_NODE_SAMPLES = [ + (["SInt8"], int, (-(2**7), 2**7)), + (["SInt16", "short"], int, (-(2**15), 2**15)), + (["SInt32", "int"], int, (-(2**31), 2**31)), + (["SInt64", "long long"], int, (-(2**63), 2**63)), + (["UInt8", "char"], int, (0, 2**8)), + (["UInt16", "unsigned short"], int, (0, 2**16)), + (["UInt32", "unsigned int", "Type*"], int, (0, 2**32)), + (["UInt64", "unsigned long long", "FileSize"], int, (0, 2**64)), + (["float"], float, (-1, 1)), + (["double"], float, (-1, 1)), + (["bool"], bool, (False, True)), +] + +T = TypeVar("T") + +INT_BYTESIZE_MAP = { + 1: "b", + 2: "h", + 4: "i", + 8: "q", +} + + +def generate_sample_data( + u_type: List[str], + py_typ: Literal[int, float, str], + bounds: Tuple[T, T], + count: int = 10, +) -> List[T]: + if py_typ is int: + if bounds[0] < 0: + # signed + byte_size = math.log2(bounds[1]) + 1 + signed = True + elif bounds[0] == 0: + # unsigned + byte_size = math.log2(bounds[1]) + signed = False + + byte_size = round(byte_size / 8) + char = INT_BYTESIZE_MAP[byte_size] + if not signed: + char = char.upper() + + sample_values = [ + bounds[0], + *[random.randint(bounds[0], bounds[1] - 1) for _ in range(count)], + bounds[1] - 1, + ] + # sample_data = pack(f"<{count+2}{char}", *sample_values) + + elif py_typ is float: + sample_values = [ + bounds[0], + *[random.uniform(bounds[0], bounds[1]) for _ in range(count)], + bounds[1], + ] + char = "f" if u_type == "float" else "d" + # sample_data = pack(f"<{count+2}f", *sample_values) + + elif py_typ is bool: + sample_values = [ + bounds[0], + *[random.choice([True, False]) for _ in range(count)], + bounds[1], + ] + # sample_data = pack(f"<{count+2}?", *sample_values) + + elif py_typ is str: + raise NotImplementedError("String generation not implemented") + + elif py_typ is bytes: + raise NotImplementedError("Bytes generation not implemented") + + return sample_values + + +@check_leak +def test_simple_nodes(): + for typs, py_typ, bounds in SIMPLE_NODE_SAMPLES: + values = generate_sample_data(typs, py_typ, bounds) + for typ in typs: + node = generate_dummy_node(typ) + for value in values: + writer = EndianBinaryWriter(b"", "<") + write_typetree(value, node, writer) + raw = writer.bytes + re_value = read_typetree(node, EndianBinaryReader(raw, "<")) + assert ( + abs(value - re_value) < 1e-5 + ), f"Failed on {typ}: {value} != {re_value}" + + +@check_leak +def test_simple_nodes_array(): + def generate_list_node(item_node: TypeTreeNode): + root = generate_dummy_node("root", "root") + array = generate_dummy_node("Array", "Array") + array.m_Children = [None, item_node] + root.m_Children = [array] + return root + + for typs, py_typ, bounds in SIMPLE_NODE_SAMPLES: + values = generate_sample_data(typs, py_typ, bounds) + for typ in typs: + node = generate_dummy_node(typ) + array_node = generate_list_node(node) + writer = EndianBinaryWriter(b"", "<") + write_typetree(values, array_node, writer) + raw = writer.bytes + re_values = read_typetree(array_node, EndianBinaryReader(raw, "<")) + assert all( + (abs(value - re_value) < 1e-5) + for value, re_value in zip(values, re_values) + ), f"Failed on {typ}: {values} != {re_values}" + + +TEST_CLASS_NODE = get_typetree_node(1, (5, 0, 0, 0)) +TEST_CLASS_NODE_OBJ = GameObject( + m_Component=[], m_IsActive=True, m_Layer=0, m_Name="TestObject", m_Tag=0 +) +TEST_CLASS_NODE_DICT = TEST_CLASS_NODE_OBJ.__dict__ + + +def test_class_node_dict(): + writer = EndianBinaryWriter(b"", "<") + write_typetree(TEST_CLASS_NODE_DICT, TEST_CLASS_NODE, writer) + raw = writer.bytes + re_value = read_typetree( + TEST_CLASS_NODE, EndianBinaryReader(raw, "<"), as_dict=True + ) + assert re_value == TEST_CLASS_NODE_DICT + + +def test_class_node_clz(): + writer = EndianBinaryWriter(b"", "<") + write_typetree(TEST_CLASS_NODE_OBJ, TEST_CLASS_NODE, writer) + raw = writer.bytes + re_value = read_typetree( + TEST_CLASS_NODE, EndianBinaryReader(raw, "<"), as_dict=False + ) + assert re_value == TEST_CLASS_NODE_OBJ + + +if __name__ == "__main__": + for x in list(locals()): + if str(x)[:4] == "test": + locals()[x]() + input("All Tests Passed") From 6b8f99df496d3991bb8d3d9ef1238e1df7cf27b3 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Mon, 21 Oct 2024 22:18:53 +0200 Subject: [PATCH 145/403] 1.20.6 version bump and minor fixes --- UnityPy/UnityPyBoost.pyi | 7 +-- UnityPy/__init__.py | 2 +- UnityPy/classes/UnknownObject.py | 10 ++-- UnityPyBoost/TypeTreeHelper.cpp | 78 ++++++++++++++------------------ tests/test_typetree.py | 4 +- 5 files changed, 49 insertions(+), 52 deletions(-) diff --git a/UnityPy/UnityPyBoost.pyi b/UnityPy/UnityPyBoost.pyi index da72c632..a87c99b3 100644 --- a/UnityPy/UnityPyBoost.pyi +++ b/UnityPy/UnityPyBoost.pyi @@ -1,9 +1,10 @@ from __future__ import annotations -from typing import Union, TYPE_CHECKING, Literal, Optional, List, Any + +from typing import TYPE_CHECKING, Any, List, Optional, Union if TYPE_CHECKING: - from .files.SerializedFile import SerializedFile from .classes import Object + from .files.SerializedFile import SerializedFile def unpack_vertexdata( data: Union[bytes, bytearray], @@ -17,7 +18,7 @@ def unpack_vertexdata( def read_typetree( data: Union[bytes, bytearray], node: TypeTreeNode, - endian: Literal["<", ">"], + endian: Union["<", ">"], as_dict: bool, assetsfile: SerializedFile, classes: dict, diff --git a/UnityPy/__init__.py b/UnityPy/__init__.py index e8f8a5f2..7ca9f824 100644 --- a/UnityPy/__init__.py +++ b/UnityPy/__init__.py @@ -1,4 +1,4 @@ -__version__ = "1.20.5" +__version__ = "1.20.6" from .environment import Environment as Environment from .helpers.ArchiveStorageManager import ( diff --git a/UnityPy/classes/UnknownObject.py b/UnityPy/classes/UnknownObject.py index 533af2d4..b6a3caa4 100644 --- a/UnityPy/classes/UnknownObject.py +++ b/UnityPy/classes/UnknownObject.py @@ -23,6 +23,10 @@ def format_value(v): return vstr[:97] + "..." return vstr - return f" {', '.join( - f'{k}={format_value(v)}' for k, v in self.__dict__.items() if k != '__node__' - )}>" + inner_str = ", ".join( + f"{k}={format_value(v)}" + for k, v in self.__dict__.items() + if k != "__node__" + ) + + return f" {inner_str}>" diff --git a/UnityPyBoost/TypeTreeHelper.cpp b/UnityPyBoost/TypeTreeHelper.cpp index d1ab3300..34e7de73 100644 --- a/UnityPyBoost/TypeTreeHelper.cpp +++ b/UnityPyBoost/TypeTreeHelper.cpp @@ -912,47 +912,59 @@ PyObject *read_typetree_value_array(ReaderT *reader, TypeTreeNodeObject *node, T return value; } +static inline void set_none_if_null_n_incref(PyObject **field) +{ + if (*field == nullptr) + { + *field = Py_None; + } + Py_INCREF(*field); +} + PyObject *read_typetree(PyObject *self, PyObject *args, PyObject *kwargs) { const char *kwlist[] = {"data", "node", "endian", "as_dict", "assetsfile", "classes", NULL}; - PyObject *data; + Py_buffer view; PyObject *node; - PyObject *as_dict = Py_True; + int as_dict = 1; + PyObject *value = nullptr; + ReaderT reader; + + volatile uint16_t bint = 0x0100; + volatile bool is_big_endian = ((uint8_t *)&bint)[0] == 1; TypeTreeReaderConfigT config = { false, - Py_None, - Py_None, + nullptr, + nullptr, false, }; char endian; bool swap; - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OOC|OOO", (char **)kwlist, &data, &node, &endian, &as_dict, &config.assetfile, &config.classes)) + int parse_result = PyArg_ParseTupleAndKeywords(args, kwargs, "y*OC|pOO", (char **)kwlist, &view, &node, &endian, &as_dict, &config.assetfile, &config.classes); { - return NULL; + goto READ_TYPETREE_CLEANUP; } - config.as_dict = as_dict == Py_True; + set_none_if_null_n_incref(&config.assetfile); + set_none_if_null_n_incref(&config.classes); + + config.as_dict = as_dict == 1; if (!config.as_dict) { if (config.assetfile == Py_None) { PyErr_SetString(PyExc_ValueError, "assetsfile must be set if not as dict"); - return NULL; + goto READ_TYPETREE_CLEANUP; } if (config.classes == Py_None) { PyErr_SetString(PyExc_ValueError, "classes must be set if not as dict"); - return NULL; + goto READ_TYPETREE_CLEANUP; } } - Py_INCREF(config.assetfile); - Py_INCREF(config.classes); - - volatile uint16_t bint = 0x0100; - volatile bool is_big_endian = ((uint8_t *)&bint)[0] == 1; switch (endian) { @@ -985,19 +997,8 @@ PyObject *read_typetree(PyObject *self, PyObject *args, PyObject *kwargs) } } - Py_buffer view; - - if (PyObject_GetBuffer(data, &view, PyBUF_SIMPLE) == -1) - { - Py_DECREF(config.assetfile); - Py_DECREF(config.classes); - PyErr_SetString(PyExc_ValueError, "Failed to get buffer"); - return NULL; - } - - ReaderT reader = {static_cast(view.buf), static_cast(view.buf) + view.len, static_cast(view.buf)}; + reader = {static_cast(view.buf), static_cast(view.buf) + view.len, static_cast(view.buf)}; - PyObject *value; if (swap) { value = read_typetree_value(&reader, (TypeTreeNodeObject *)node, &config); @@ -1007,21 +1008,22 @@ PyObject *read_typetree(PyObject *self, PyObject *args, PyObject *kwargs) value = read_typetree_value(&reader, (TypeTreeNodeObject *)node, &config); } - PyBuffer_Release(&view); - Py_DECREF(config.assetfile); - Py_DECREF(config.classes); - if (reader.ptr != reader.end) { Py_DecRef(value); - return PyErr_Format(PyExc_ValueError, "Read %ld bytes, %ld remaining", reader.ptr - reader.start, reader.end - reader.ptr); + value = PyErr_Format(PyExc_ValueError, "Read %ld bytes, %ld remaining", reader.ptr - reader.start, reader.end - reader.ptr); } +READ_TYPETREE_CLEANUP: + PyBuffer_Release(&view); + Py_DECREF(config.assetfile); + Py_DECREF(config.classes); + return value; } // TypeTreeNode impl -static void TypeTreeNode_dealloc(TypeTreeNodeObject *self) +static void TypeTreeNode_finalize(TypeTreeNodeObject *self) { Py_XDECREF(self->m_Level); Py_XDECREF(self->m_Type); @@ -1035,7 +1037,6 @@ static void TypeTreeNode_dealloc(TypeTreeNodeObject *self) Py_XDECREF(self->m_RefTypeHash); Py_XDECREF(self->m_Children); Py_XDECREF(self->_clean_name); - Py_TYPE(self)->tp_free((PyObject *)self); } static const std::map typeToNodeDataType = { @@ -1093,15 +1094,6 @@ static inline NodeDataType get_node_data_type(PyObject *py_type) return NodeDataType::unk; } -static inline void set_none_if_null_n_incref(PyObject **field) -{ - if (*field == nullptr) - { - *field = Py_None; - } - Py_INCREF(*field); -} - static int TypeTreeNode_init(TypeTreeNodeObject *self, PyObject *args, PyObject *kwargs) { const char *kwlist[] = { @@ -1209,8 +1201,8 @@ static PyTypeObject TypeTreeNodeType = []() -> PyTypeObject type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE; type.tp_new = PyType_GenericNew; type.tp_init = (initproc)TypeTreeNode_init; - type.tp_dealloc = (destructor)TypeTreeNode_dealloc; type.tp_members = TypeTreeNode_members; + type.tp_finalize = (destructor)TypeTreeNode_finalize; return type; }(); diff --git a/tests/test_typetree.py b/tests/test_typetree.py index da3653b3..6e8a8e6f 100644 --- a/tests/test_typetree.py +++ b/tests/test_typetree.py @@ -2,7 +2,7 @@ import math import os import random -from typing import List, Literal, Tuple, TypeVar +from typing import List, Tuple, TypeVar, Union, Type import psutil @@ -73,7 +73,7 @@ def generate_dummy_node(typ: str, name: str = ""): def generate_sample_data( u_type: List[str], - py_typ: Literal[int, float, str], + py_typ: Type[Union[int, float, str]], bounds: Tuple[T, T], count: int = 10, ) -> List[T]: From 2798fa367cdea33426cfc6dc6b549c9b6c30cda4 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Mon, 21 Oct 2024 23:09:21 +0200 Subject: [PATCH 146/403] deprecate manifest.in -> moved into setup.ex_modules[].depends --- manifest.in | 2 -- setup.py | 5 +++++ 2 files changed, 5 insertions(+), 2 deletions(-) delete mode 100644 manifest.in diff --git a/manifest.in b/manifest.in deleted file mode 100644 index 04762de9..00000000 --- a/manifest.in +++ /dev/null @@ -1,2 +0,0 @@ -recursive-include UnityPyBoost *.c -recursive-include UnityPyBoost *.h diff --git a/setup.py b/setup.py index fa37320d..81f8de3f 100644 --- a/setup.py +++ b/setup.py @@ -102,6 +102,11 @@ def get_fmod_library(): for f in os.listdir(UNITYPYBOOST_DIR) if f.endswith(".cpp") ], + depends = [ + f"UnityPyBoost/{f}" + for f in os.listdir(UNITYPYBOOST_DIR) + if f.endswith(".hpp") + ], language="c++", include_dirs=[UNITYPYBOOST_DIR], ) From 0912dbbd602fe0e284d878c4758f9771b0cd2dec Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Mon, 21 Oct 2024 23:23:25 +0200 Subject: [PATCH 147/403] update workflows --- .github/workflows/publish.yml | 71 ---------------------------- .github/workflows/release.yml | 88 +++++++++++++++++++++++++++++++++++ .github/workflows/test.yml | 39 ++++++---------- README.md | 2 +- 4 files changed, 102 insertions(+), 98 deletions(-) delete mode 100644 .github/workflows/publish.yml create mode 100644 .github/workflows/release.yml diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml deleted file mode 100644 index e8919b0b..00000000 --- a/.github/workflows/publish.yml +++ /dev/null @@ -1,71 +0,0 @@ -name: Publish - -on: - workflow_run: - workflows: Test - branches: master - types: completed - -jobs: - publish: - # `if` required because a workflow run is triggered regardless of - # the result of the previous workflow (see the documentation page) - if: ${{ github.event.workflow_run.conclusion == 'success' }} - strategy: - fail-fast: true - matrix: - os: ["ubuntu-20.04", "windows-2019", "macos-13"] - cp: ["cp37", "cp38", "cp39", "cp310", "cp311", "cp312", "cp313"] - - - name: ${{ matrix.os }} - ${{ matrix.cp }} - runs-on: ${{ matrix.os }} - timeout-minutes: 60 - - steps: - - uses: actions/checkout@v3 - - - name: Set up Python - uses: actions/setup-python@v4 - with: - python-version: "3.10" - - - name: Install dependencies - run: | - python -m pip install --upgrade pip wheel setuptools - python -m pip install --upgrade twine build - - - name: Set up QEMU - if: runner.os == 'Linux' - uses: docker/setup-qemu-action@v2 - with: - platforms: all - - - name: Build wheels - uses: pypa/cibuildwheel@v2.20.0 - env: - CIBW_ARCHS_LINUX: auto aarch64 - CIBW_ARCHS_MACOS: x86_64 arm64 - CIBW_BUILD: | - ${{ matrix.cp }}-manylinux_x86_64 - ${{ matrix.cp }}-manylinux_i686 - ${{ matrix.cp }}-manylinux_aarch64 - ${{ matrix.cp }}-win_amd64 - ${{ matrix.cp }}-win32 - ${{ matrix.cp }}-macosx_x86_64 - ${{ matrix.cp }}-macosx_arm64 - # Disabled repair wheel since the fmob lib is not compatible - CIBW_REPAIR_WHEEL_COMMAND: '' - CIBW_REPAIR_WHEEL_COMMAND_LINUX: 'mv {wheel} {dest_dir}/"$(basename {wheel} | sed "s/-linux_/-manylinux_2_17_/")"' - CIBW_TEST_REQUIRES: pytest psutil - CIBW_TEST_COMMAND: pytest -v -s {package}/tests - CIBW_TEST_SKIP: "*-macosx* *-manylinux_i686 *-win32" - - - name: Publish to PyPI - env: - TWINE_USERNAME: __token__ - TWINE_PASSWORD: ${{ secrets.PYPI_TOKEN }} - run: | - twine upload ./wheelhouse/*.whl --skip-existing - python -m build --sdist - twine upload ./dist/*.tar.gz --skip-existing diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 00000000..a608d72d --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,88 @@ +name: Build & Publish wheels +on: + workflow_dispatch + + +jobs: + build_sdist: + name: Build source distribution + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + submodules: recursive + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '3.x' + + - name: Build sdist + run: pipx run build --sdist + + - name: Install sdist + run: pip install dist/*.tar.gz + + - uses: actions/upload-artifact@v3 + with: + path: dist/*.tar.gz + + build_wheels: + name: Build wheels on ${{ matrix.os }} + runs-on: ${{ matrix.os }} + needs: [build_sdist] + strategy: + fail-fast: true + matrix: + os: [windows-latest, macos-latest] + + steps: + - uses: actions/checkout@v4 + with: + submodules: recursive + + - name: Build wheels + uses: joerick/cibuildwheel@v2.21.2 + + - uses: actions/upload-artifact@v3 + with: + path: ./wheelhouse/*.whl + + build_wheels_ubuntu: + name: Build x86 manylinux wheels on ubuntu-latest + runs-on: ubuntu-latest + needs: [build_sdist] + + steps: + - uses: actions/checkout@v4 + with: + submodules: recursive + + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + with: + platforms: all + + - name: Build wheels + uses: joerick/cibuildwheel@v2.21.2 + + - uses: actions/upload-artifact@v3 + with: + path: ./wheelhouse/*.whl + + + upload_pypi: + name: Publish to PyPI + needs: [build_wheels, build_wheels_ubuntu, build_sdist] + runs-on: ubuntu-latest + + permissions: + id-token: write + steps: + - uses: actions/download-artifact@v3 + with: + name: artifact + path: dist + + - name: Publish package distributions to PyPI + uses: pypa/gh-action-pypi-publish@release/v1 \ No newline at end of file diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index e8af0ff6..fe4d0657 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -1,40 +1,27 @@ name: Test - on: - push: - branches: - - master - pull_request: {} - - + push jobs: - test: + build_wheels: + name: Build wheels on ${{ matrix.os }} + runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: - os: ["ubuntu-latest", "windows-latest"] - - runs-on: ${{ matrix.os }} - name: ${{ matrix.os }} - timeout-minutes: 10 + os: [ubuntu-latest, windows-latest, macos-latest] steps: - - uses: actions/checkout@v3 - + - uses: actions/checkout@v4 + - name: Set up Python - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 + if: matrix.os == 'ubuntu-latest' with: - python-version: "3.7" - - - name: Install Dependencies - run: | - python -m pip install --upgrade pip pytest psutil + python-version: '3.7' - - name: Install UnityPy - run: | - pip install . + - name: Install + run: pip install .[tests] - name: Run tests - run: | - pytest -v -s + run: pytest -vs ./tests diff --git a/README.md b/README.md index b1fcd123..cd755f01 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ [![PyPI supported Python versions](https://img.shields.io/pypi/pyversions/UnityPy.svg)](https://pypi.python.org/pypi/UnityPy) [![Win/Mac/Linux](https://img.shields.io/badge/platform-windows%20%7C%20macos%20%7C%20linux-informational)]() [![MIT](https://img.shields.io/github/license/K0lb3/UnityPy)](https://github.com/K0lb3/UnityPy/blob/master/LICENSE) -![Test and Publish](https://github.com/K0lb3/UnityPy/workflows/Test%20and%20Publish/badge.svg) +![Test](https://github.com/K0lb3/UnityPy/workflows/Test/badge.svg) A Unity asset extractor for Python based on [AssetStudio](https://github.com/Perfare/AssetStudio). From 9326839297329659a1cb847b9d44312be971694f Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Mon, 21 Oct 2024 23:28:59 +0200 Subject: [PATCH 148/403] pyproject.toml - add tests deps --- pyproject.toml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/pyproject.toml b/pyproject.toml index 0a903794..86fff0a7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -62,3 +62,13 @@ dynamic = ["version"] [tool.setuptools.dynamic] version = { attr = "UnityPy.__version__" } + +[project.optional-dependencies] +tests = [ + "pytest >= 8", + "pillow >= 9", + "psutil >= 6", +] + +[tool.pytest.ini_options] +testpaths = ["tests"] From ad91a0d7fff8d3a4d92c69add1f6a8feabaf11c2 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Mon, 21 Oct 2024 23:29:12 +0200 Subject: [PATCH 149/403] release.yml - skip all tests --- .github/workflows/release.yml | 4 ++++ pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index a608d72d..11117e68 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -43,6 +43,8 @@ jobs: - name: Build wheels uses: joerick/cibuildwheel@v2.21.2 + env: + CIBW_TEST_SKIP: "*" - uses: actions/upload-artifact@v3 with: @@ -65,6 +67,8 @@ jobs: - name: Build wheels uses: joerick/cibuildwheel@v2.21.2 + env: + CIBW_TEST_SKIP: "*" - uses: actions/upload-artifact@v3 with: diff --git a/pyproject.toml b/pyproject.toml index 86fff0a7..ac324817 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -66,7 +66,7 @@ version = { attr = "UnityPy.__version__" } [project.optional-dependencies] tests = [ "pytest >= 8", - "pillow >= 9", + "pillow >= 8", "psutil >= 6", ] From 3104b67f5472de6d6b0ce3258b4a338d5d3f00d3 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Mon, 21 Oct 2024 23:58:40 +0200 Subject: [PATCH 150/403] TypeTreeHelper Py - fix extras handling for clz --- UnityPy/helpers/TypeTreeHelper.py | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/UnityPy/helpers/TypeTreeHelper.py b/UnityPy/helpers/TypeTreeHelper.py index dd55c112..39203daf 100644 --- a/UnityPy/helpers/TypeTreeHelper.py +++ b/UnityPy/helpers/TypeTreeHelper.py @@ -243,15 +243,12 @@ def read_value( else: extra_keys = keys - annotation_keys if extra_keys: - value = clz( - **{ - key: value - for key, value in value.items() - if key in clz.__annotations__ - } + instance = clz( + **{key: value[key] for key in annotation_keys} ) for key in extra_keys: - setattr(value, key, value[key]) + setattr(instance, key, value[key]) + value = instance else: value = UnknownObject(**value) From 2471db9bcb7ffea58e9fb561a51aa610f2eb400d Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Tue, 22 Oct 2024 00:27:51 +0200 Subject: [PATCH 151/403] TypeTreeHelper CPP - fix some issues --- UnityPyBoost/TypeTreeHelper.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/UnityPyBoost/TypeTreeHelper.cpp b/UnityPyBoost/TypeTreeHelper.cpp index 34e7de73..0e819040 100644 --- a/UnityPyBoost/TypeTreeHelper.cpp +++ b/UnityPyBoost/TypeTreeHelper.cpp @@ -543,8 +543,9 @@ inline PyObject *parse_class(PyObject *kwargs, TypeTreeNodeObject *node, TypeTre pos = 0; while (PyDict_Next(extras, &pos, &key, &value)) { - PyObject_SetItem(instance, key, value); + PyObject_GenericSetAttr(instance, key, value); } + goto PARSE_CLASS_CLEANUP; } PyErr_Clear(); @@ -556,7 +557,7 @@ inline PyObject *parse_class(PyObject *kwargs, TypeTreeNodeObject *node, TypeTre pos = 0; while (PyDict_Next(extras, &pos, &key, &value)) { - PyObject_SetItem(kwargs, key, value); + PyDict_SetItem(kwargs, key, value); } instance = PyObject_Call(clz, args, kwargs); @@ -778,14 +779,14 @@ PyObject *read_typetree_value(ReaderT *reader, TypeTreeNodeObject *node, TypeTre } if (!config->as_dict) { - PyObject *clz = PyObject_GetAttrString(config->classes, "Object"); + PyObject *clz = PyObject_GetAttrString(config->classes, "UnknownObject"); if (clz == NULL) { PyErr_SetString(PyExc_ValueError, "Failed to get class"); Py_DECREF(value); return NULL; } - PyObject *args = PyTuple_New(0); + PyObject *args = PyTuple_Pack(1, (PyObject *)node); PyObject *instance = PyObject_Call(clz, args, value); Py_DECREF(clz); Py_DECREF(args); @@ -943,7 +944,7 @@ PyObject *read_typetree(PyObject *self, PyObject *args, PyObject *kwargs) char endian; bool swap; - int parse_result = PyArg_ParseTupleAndKeywords(args, kwargs, "y*OC|pOO", (char **)kwlist, &view, &node, &endian, &as_dict, &config.assetfile, &config.classes); + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "y*OC|pOO", (char **)kwlist, &view, &node, &endian, &as_dict, &config.assetfile, &config.classes)) { goto READ_TYPETREE_CLEANUP; } @@ -1018,7 +1019,6 @@ PyObject *read_typetree(PyObject *self, PyObject *args, PyObject *kwargs) PyBuffer_Release(&view); Py_DECREF(config.assetfile); Py_DECREF(config.classes); - return value; } From 9a87a4847d9e191135ee0a352d07840fdb56b35c Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Tue, 22 Oct 2024 01:11:37 +0200 Subject: [PATCH 152/403] UnityPyBoost.cpp - remove redundant pragma --- UnityPyBoost/UnityPyBoost.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/UnityPyBoost/UnityPyBoost.cpp b/UnityPyBoost/UnityPyBoost.cpp index e2dedbca..1cd2bc4c 100644 --- a/UnityPyBoost/UnityPyBoost.cpp +++ b/UnityPyBoost/UnityPyBoost.cpp @@ -1,5 +1,4 @@ #define PY_SSIZE_T_CLEAN -#pragma once #include #include "Mesh.hpp" #include "TypeTreeHelper.hpp" From 6b9e06aea8fb73649ca4eb0a0863dc0b339cb29a Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Tue, 22 Oct 2024 01:12:02 +0200 Subject: [PATCH 153/403] TypeTreeHelper - comment out problematic decref --- UnityPyBoost/TypeTreeHelper.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/UnityPyBoost/TypeTreeHelper.cpp b/UnityPyBoost/TypeTreeHelper.cpp index 0e819040..02b36325 100644 --- a/UnityPyBoost/TypeTreeHelper.cpp +++ b/UnityPyBoost/TypeTreeHelper.cpp @@ -527,7 +527,7 @@ inline PyObject *parse_class(PyObject *kwargs, TypeTreeNodeObject *node, TypeTre PyObject *extra_value = PyDict_GetItem(kwargs, child->_clean_name); // +1 PyDict_SetItem(extras, child->_clean_name, extra_value); // +1 PyDict_DelItem(kwargs, child->_clean_name); // -1 - Py_DECREF(extra_value); // -1 + //Py_DECREF(extra_value); // -1 } if (PyDict_Size(extras) == 0) @@ -926,7 +926,7 @@ PyObject *read_typetree(PyObject *self, PyObject *args, PyObject *kwargs) { const char *kwlist[] = {"data", "node", "endian", "as_dict", "assetsfile", "classes", NULL}; Py_buffer view; - PyObject *node; + PyObject *node = nullptr; int as_dict = 1; PyObject *value = nullptr; ReaderT reader; @@ -1011,14 +1011,14 @@ PyObject *read_typetree(PyObject *self, PyObject *args, PyObject *kwargs) if (reader.ptr != reader.end) { - Py_DecRef(value); + Py_DECREF(value); value = PyErr_Format(PyExc_ValueError, "Read %ld bytes, %ld remaining", reader.ptr - reader.start, reader.end - reader.ptr); } READ_TYPETREE_CLEANUP: PyBuffer_Release(&view); - Py_DECREF(config.assetfile); - Py_DECREF(config.classes); + Py_XDECREF(config.assetfile); + Py_XDECREF(config.classes); return value; } From f04b6323c320aa394245b197e20ff618e0c4ddc5 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Tue, 22 Oct 2024 01:12:47 +0200 Subject: [PATCH 154/403] disable AudioClip test --- tests/test_main.py | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/tests/test_main.py b/tests/test_main.py index acd41bbd..45bb5675 100644 --- a/tests/test_main.py +++ b/tests/test_main.py @@ -60,28 +60,28 @@ def test_sprite(): obj.read().image.save(io.BytesIO(), format="PNG") -def test_audioclip(): - # as not platforms are supported by FMOD - # we have to check if the platform is supported first - try: - from UnityPy.export import AudioClipConverter - - AudioClipConverter.import_pyfmodex() - except NotImplementedError: - return - except OSError: - # cibuildwheel doesn't copy the .so files - # so we have to skip the test on it - print("Failed to load the fmod lib for your system.") - print("Skipping the audioclip test.") - return - if AudioClipConverter.pyfmodex is False: - return - env = UnityPy.load(os.path.join(SAMPLES, "char_118_yuki.ab")) - for obj in env.objects: - if obj.type.name == "AudioClip": - clip = obj.read() - assert len(clip.samples) == 1 +# def test_audioclip(): +# # as not platforms are supported by FMOD +# # we have to check if the platform is supported first +# try: +# from UnityPy.export import AudioClipConverter + +# AudioClipConverter.import_pyfmodex() +# except NotImplementedError: +# return +# except OSError: +# # cibuildwheel doesn't copy the .so files +# # so we have to skip the test on it +# print("Failed to load the fmod lib for your system.") +# print("Skipping the audioclip test.") +# return +# if AudioClipConverter.pyfmodex is False: +# return +# env = UnityPy.load(os.path.join(SAMPLES, "char_118_yuki.ab")) +# for obj in env.objects: +# if obj.type.name == "AudioClip": +# clip = obj.read() +# assert len(clip.samples) == 1 def test_mesh(): From 5686079c9e7c92b0b3389ce0cc59979d709ed944 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Tue, 22 Oct 2024 01:15:20 +0200 Subject: [PATCH 155/403] pyproject.toml - downgrade pytest to 7 for tests --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index ac324817..43f4a69d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -65,7 +65,7 @@ version = { attr = "UnityPy.__version__" } [project.optional-dependencies] tests = [ - "pytest >= 8", + "pytest >= 7", "pillow >= 8", "psutil >= 6", ] From 3d3f6b73428f5d66730a8b9eca490853272467aa Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Tue, 22 Oct 2024 01:21:36 +0200 Subject: [PATCH 156/403] test_main - skip texture2d & sprite on Darwin --- tests/test_main.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tests/test_main.py b/tests/test_main.py index 45bb5675..d999ccee 100644 --- a/tests/test_main.py +++ b/tests/test_main.py @@ -1,5 +1,6 @@ import io import os +import platform from PIL import Image @@ -60,6 +61,11 @@ def test_sprite(): obj.read().image.save(io.BytesIO(), format="PNG") +if platform.system() == "Darwin": + # crunch issue on macos leading to segfault + del test_texture2d + del test_sprite + # def test_audioclip(): # # as not platforms are supported by FMOD # # we have to check if the platform is supported first From 4dd282701d6271c75df850878b914d8b386df4f7 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Tue, 22 Oct 2024 12:50:37 +0200 Subject: [PATCH 157/403] fix FMOD lib distribution --- UnityPy/lib/FMOD/Darwin/__init__.py | 0 UnityPy/lib/FMOD/Linux/__init__.py | 0 UnityPy/lib/FMOD/Windows/__init__.py | 0 UnityPy/tools/__init__.py | 0 setup.py | 27 +++++++++++++++------------ 5 files changed, 15 insertions(+), 12 deletions(-) create mode 100644 UnityPy/lib/FMOD/Darwin/__init__.py create mode 100644 UnityPy/lib/FMOD/Linux/__init__.py create mode 100644 UnityPy/lib/FMOD/Windows/__init__.py create mode 100644 UnityPy/tools/__init__.py diff --git a/UnityPy/lib/FMOD/Darwin/__init__.py b/UnityPy/lib/FMOD/Darwin/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/UnityPy/lib/FMOD/Linux/__init__.py b/UnityPy/lib/FMOD/Linux/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/UnityPy/lib/FMOD/Windows/__init__.py b/UnityPy/lib/FMOD/Windows/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/UnityPy/tools/__init__.py b/UnityPy/tools/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/setup.py b/setup.py index 81f8de3f..cab05d85 100644 --- a/setup.py +++ b/setup.py @@ -5,6 +5,7 @@ from setuptools import Extension, find_packages, setup from setuptools.command.build_ext import build_ext +from setuptools.command.sdist import sdist INSTALL_DIR = os.path.dirname(os.path.realpath(__file__)) UNITYPYBOOST_DIR = os.path.join(INSTALL_DIR, "UnityPyBoost") @@ -42,6 +43,17 @@ def build_extensions(self): build_ext.build_extensions(self) +class SDist(sdist): + def make_distribution(self) -> None: + # add all fmod libraries to the distribution + for root, dirs, files in os.walk("UnityPy/lib/FMOD"): + for file in files: + fp = f"{root}/{file}" + if fp not in self.filelist.files: + self.filelist.files.append(fp) + return super().make_distribution() + + def get_fmod_library(): # determine system - Windows, Darwin, Linux, Android system = platform.system() @@ -81,18 +93,9 @@ def get_fmod_library(): if fmod_lib is not None: unitypy_package_data.append(fmod_lib) - -# These packages are missing __init__.py so setuptools will warn about unspecified packages -extra_packages = [ - "UnityPy.resources", - "UnityPy.tools", - "UnityPy.tools.libil2cpp_helper", -] - - setup( name="UnityPy", - packages=find_packages() + extra_packages, + packages=find_packages(), package_data={"UnityPy": unitypy_package_data}, ext_modules=[ Extension( @@ -102,7 +105,7 @@ def get_fmod_library(): for f in os.listdir(UNITYPYBOOST_DIR) if f.endswith(".cpp") ], - depends = [ + depends=[ f"UnityPyBoost/{f}" for f in os.listdir(UNITYPYBOOST_DIR) if f.endswith(".hpp") @@ -111,5 +114,5 @@ def get_fmod_library(): include_dirs=[UNITYPYBOOST_DIR], ) ], - cmdclass={"build_ext": BuildExt}, + cmdclass={"build_ext": BuildExt, "sdist": SDist}, ) From 7601f879de3d62a5741d78be19cdbd312ab9068e Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Tue, 22 Oct 2024 12:51:12 +0200 Subject: [PATCH 158/403] TypeTreeHelper.cpp - add missing incref for CP314 --- UnityPyBoost/TypeTreeHelper.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/UnityPyBoost/TypeTreeHelper.cpp b/UnityPyBoost/TypeTreeHelper.cpp index 02b36325..a14d16f2 100644 --- a/UnityPyBoost/TypeTreeHelper.cpp +++ b/UnityPyBoost/TypeTreeHelper.cpp @@ -458,6 +458,7 @@ inline PyObject *get_annotations(PyObject *clz) // from annotationlib import get_annotations PyObject *annotationlib = PyImport_ImportModule("annotationlib"); get_annotations = PyObject_GetAttrString(annotationlib, "get_annotations"); + Py_INCREF(get_annotations); Py_DECREF(annotationlib); } return PyObject_CallFunctionObjArgs(get_annotations, clz, NULL); @@ -519,21 +520,20 @@ inline PyObject *parse_class(PyObject *kwargs, TypeTreeNodeObject *node, TypeTre extras = PyDict_New(); for (int i = 0; i < PyList_GET_SIZE(node->m_Children); i++) { - TypeTreeNodeObject *child = (TypeTreeNodeObject *)PyList_GET_ITEM(node->m_Children, i); + TypeTreeNodeObject *child = (TypeTreeNodeObject *)PyList_GET_ITEM(node->m_Children, i); // - borrowed ref +/- 0 if (PyDict_Contains(annotations, child->_clean_name) == 1) { continue; } - PyObject *extra_value = PyDict_GetItem(kwargs, child->_clean_name); // +1 + PyObject *extra_value = PyDict_GetItem(kwargs, child->_clean_name); // - borrowed ref +/- 0 PyDict_SetItem(extras, child->_clean_name, extra_value); // +1 PyDict_DelItem(kwargs, child->_clean_name); // -1 - //Py_DECREF(extra_value); // -1 } if (PyDict_Size(extras) == 0) { - Py_DECREF(clz); - clz = PyObject_GetAttrString(config->classes, "UnknownObject"); + Py_DECREF(clz); // 1->0 + clz = PyObject_GetAttrString(config->classes, "UnknownObject"); // 0->1 PyDict_SetItemString(kwargs, "__node__", node->m_Type); } @@ -754,6 +754,7 @@ PyObject *read_typetree_value(ReaderT *reader, TypeTreeNodeObject *node, TypeTre } else if (ref_node == (TypeTreeNodeObject *)Py_None) { + Py_DECREF(ref_node); continue; } child_value = read_typetree_value(reader, ref_node, config); @@ -763,6 +764,7 @@ PyObject *read_typetree_value(ReaderT *reader, TypeTreeNodeObject *node, TypeTre { child_value = read_typetree_value(reader, child, config); } + if (!child_value) { Py_DECREF(value); From c8fccd4f0de6fcfce2e8b948fda5bf3a62c25ec1 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Tue, 22 Oct 2024 12:52:13 +0200 Subject: [PATCH 159/403] pyproject.toml - remove tabulate dependency --- pyproject.toml | 2 -- 1 file changed, 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 43f4a69d..011cf226 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -45,8 +45,6 @@ dependencies = [ "texture2ddecoder", # texture decompression "etcpak", # ETC & DXT compression "astc-encoder-py >= 0.1.8", # ASTC compression - # raw typetree dumping - "tabulate", # audio extraction "pyfmodex >= 0.7.1", # filesystem handling From 412febd840973b3ffaf7571335eb40f185f1c466 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Tue, 22 Oct 2024 12:57:21 +0200 Subject: [PATCH 160/403] pyproject.toml - remove test dep version pinning --- pyproject.toml | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 011cf226..ccd8bcf8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -42,9 +42,9 @@ dependencies = [ "brotli", # WebFile compression # Texture & Sprite handling "Pillow", - "texture2ddecoder", # texture decompression - "etcpak", # ETC & DXT compression - "astc-encoder-py >= 0.1.8", # ASTC compression + "texture2ddecoder", # texture decompression + "etcpak", # ETC & DXT compression + "astc-encoder-py >= 0.1.8", # ASTC compression # audio extraction "pyfmodex >= 0.7.1", # filesystem handling @@ -62,11 +62,7 @@ dynamic = ["version"] version = { attr = "UnityPy.__version__" } [project.optional-dependencies] -tests = [ - "pytest >= 7", - "pillow >= 8", - "psutil >= 6", -] +tests = ["pytest", "pillow", "psutil"] [tool.pytest.ini_options] testpaths = ["tests"] From cd89eab5ab05e48aebbcf527be01336bd3c2ca56 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Tue, 22 Oct 2024 12:59:44 +0200 Subject: [PATCH 161/403] test.yml - use setup python everywhere and change pytest to python -m python --- .github/workflows/test.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index fe4d0657..57ac6fe9 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -16,7 +16,6 @@ jobs: - name: Set up Python uses: actions/setup-python@v5 - if: matrix.os == 'ubuntu-latest' with: python-version: '3.7' @@ -24,4 +23,4 @@ jobs: run: pip install .[tests] - name: Run tests - run: pytest -vs ./tests + run: python -m pytest -vs ./tests From 92dcd550961af8ce3d5efad19a32411b3314cee0 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Tue, 22 Oct 2024 13:03:40 +0200 Subject: [PATCH 162/403] update codeql-analysis.yml --- .github/workflows/codeql-analysis.yml | 85 ++++++++++++++++++--------- 1 file changed, 56 insertions(+), 29 deletions(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 88ad43f5..c06c9cc8 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -9,59 +9,86 @@ # the `language` matrix defined below to confirm you have the correct set of # supported CodeQL languages. # -name: "CodeQL" +name: "CodeQL Advanced" on: push: - branches: [ master ] + branches: [ "master" ] pull_request: - # The branches below must be a subset of the branches above - branches: [ master ] + branches: [ "master" ] schedule: - - cron: '37 5 * * 5' + - cron: '19 5 * * 0' jobs: analyze: - name: Analyze - runs-on: ubuntu-latest + name: Analyze (${{ matrix.language }}) + # Runner size impacts CodeQL analysis time. To learn more, please see: + # - https://gh.io/recommended-hardware-resources-for-running-codeql + # - https://gh.io/supported-runners-and-hardware-resources + # - https://gh.io/using-larger-runners (GitHub.com only) + # Consider using larger runners or machines with greater resources for possible analysis time improvements. + runs-on: ${{ (matrix.language == 'swift' && 'macos-latest') || 'ubuntu-latest' }} + permissions: + # required for all workflows + security-events: write + + # required to fetch internal or private CodeQL packs + packages: read + + # only required for workflows in private repositories + actions: read + contents: read strategy: fail-fast: false matrix: - language: [ 'python' ] - # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python' ] - # Learn more: - # https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#changing-the-languages-that-are-analyzed - + include: + - language: c-cpp + build-mode: autobuild + - language: python + build-mode: none + # CodeQL supports the following values keywords for 'language': 'c-cpp', 'csharp', 'go', 'java-kotlin', 'javascript-typescript', 'python', 'ruby', 'swift' + # Use `c-cpp` to analyze code written in C, C++ or both + # Use 'java-kotlin' to analyze code written in Java, Kotlin or both + # Use 'javascript-typescript' to analyze code written in JavaScript, TypeScript or both + # To learn more about changing the languages that are analyzed or customizing the build mode for your analysis, + # see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/customizing-your-advanced-setup-for-code-scanning. + # If you are analyzing a compiled language, you can modify the 'build-mode' for that language to customize how + # your codebase is analyzed, see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages steps: - name: Checkout repository - uses: actions/checkout@v2 + uses: actions/checkout@v4 # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@v1 + uses: github/codeql-action/init@v3 with: languages: ${{ matrix.language }} + build-mode: ${{ matrix.build-mode }} # If you wish to specify custom queries, you can do so here or in a config file. # By default, queries listed here will override any specified in a config file. # Prefix the list here with "+" to use these queries and those in the config file. - # queries: ./path/to/local/query, your-org/your-repo/queries@main - # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). - # If this step fails, then you should remove it and run the build manually (see below) - - name: Autobuild - uses: github/codeql-action/autobuild@v1 + # For more details on CodeQL's query packs, refer to: https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs + # queries: security-extended,security-and-quality + # If the analyze step fails for one of the languages you are analyzing with + # "We were unable to automatically build your code", modify the matrix above + # to set the build mode to "manual" for that language. Then modify this step + # to build your code. # ℹ️ Command-line programs to run using the OS shell. - # 📚 https://git.io/JvXDl - - # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines - # and modify them (or add more) to build your code if your project - # uses a compiled language - - #- run: | - # make bootstrap - # make release + # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun + - if: matrix.build-mode == 'manual' + shell: bash + run: | + echo 'If you are using a "manual" build mode for one or more of the' \ + 'languages you are analyzing, replace this with the commands to build' \ + 'your code, for example:' + echo ' make bootstrap' + echo ' make release' + exit 1 - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v1 + uses: github/codeql-action/analyze@v3 + with: + category: "/language:${{matrix.language}}" From c7ee74b691c44f3b08cac37a2b69b7cbba2e7f8f Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Tue, 22 Oct 2024 13:05:47 +0200 Subject: [PATCH 163/403] clean_name - check against len 0 --- UnityPy/helpers/TypeTreeNode.py | 2 ++ UnityPyBoost/TypeTreeHelper.cpp | 6 +++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/UnityPy/helpers/TypeTreeNode.py b/UnityPy/helpers/TypeTreeNode.py index 89cd8fed..f08432e3 100644 --- a/UnityPy/helpers/TypeTreeNode.py +++ b/UnityPy/helpers/TypeTreeNode.py @@ -272,6 +272,8 @@ def _get_blob_node_struct(endian: str, version: int) -> tuple[Struct, list[str]] def clean_name(name: str) -> str: # keep in sync with TypeTreeHelper.cpp + if len(name) == 0: + return name if name.startswith("(int&)"): name = name[6:] if name.endswith("?"): diff --git a/UnityPyBoost/TypeTreeHelper.cpp b/UnityPyBoost/TypeTreeHelper.cpp index a14d16f2..8b23de9e 100644 --- a/UnityPyBoost/TypeTreeHelper.cpp +++ b/UnityPyBoost/TypeTreeHelper.cpp @@ -29,6 +29,10 @@ std::string clean_name(const std::string &name) { // # keep in sync with TypeTreeNode.py std::string cleaned_name = name; + if (cleaned_name.empty()) + { + return cleaned_name; + } // Remove "(int&)" prefix if (cleaned_name.substr(0, 6) == "(int&)") @@ -764,7 +768,7 @@ PyObject *read_typetree_value(ReaderT *reader, TypeTreeNodeObject *node, TypeTre { child_value = read_typetree_value(reader, child, config); } - + if (!child_value) { Py_DECREF(value); From 13b801c9a5787946fc7e23e0a8c661dbe18e9771 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Tue, 22 Oct 2024 13:08:32 +0200 Subject: [PATCH 164/403] test.yml - use macos-13 instead of latest for 3.7 support --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 57ac6fe9..a47451c0 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -9,7 +9,7 @@ jobs: strategy: fail-fast: false matrix: - os: [ubuntu-latest, windows-latest, macos-latest] + os: [ubuntu-latest, windows-latest, macos-13] steps: - uses: actions/checkout@v4 From 12071b17a59f351177096067de24745432cd624c Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Tue, 22 Oct 2024 13:12:57 +0200 Subject: [PATCH 165/403] test_main - re-enable audioclip test --- tests/test_main.py | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/tests/test_main.py b/tests/test_main.py index d999ccee..71fc0aa0 100644 --- a/tests/test_main.py +++ b/tests/test_main.py @@ -66,28 +66,28 @@ def test_sprite(): del test_texture2d del test_sprite -# def test_audioclip(): -# # as not platforms are supported by FMOD -# # we have to check if the platform is supported first -# try: -# from UnityPy.export import AudioClipConverter - -# AudioClipConverter.import_pyfmodex() -# except NotImplementedError: -# return -# except OSError: -# # cibuildwheel doesn't copy the .so files -# # so we have to skip the test on it -# print("Failed to load the fmod lib for your system.") -# print("Skipping the audioclip test.") -# return -# if AudioClipConverter.pyfmodex is False: -# return -# env = UnityPy.load(os.path.join(SAMPLES, "char_118_yuki.ab")) -# for obj in env.objects: -# if obj.type.name == "AudioClip": -# clip = obj.read() -# assert len(clip.samples) == 1 +def test_audioclip(): + # as not platforms are supported by FMOD + # we have to check if the platform is supported first + try: + from UnityPy.export import AudioClipConverter + + AudioClipConverter.import_pyfmodex() + except NotImplementedError: + return + except OSError: + # cibuildwheel doesn't copy the .so files + # so we have to skip the test on it + print("Failed to load the fmod lib for your system.") + print("Skipping the audioclip test.") + return + if AudioClipConverter.pyfmodex is False: + return + env = UnityPy.load(os.path.join(SAMPLES, "char_118_yuki.ab")) + for obj in env.objects: + if obj.type.name == "AudioClip": + clip = obj.read() + assert len(clip.samples) == 1 def test_mesh(): From 1a2b5030d7a96e8447d5b2ad12051d31d7880078 Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Tue, 22 Oct 2024 14:07:52 +0200 Subject: [PATCH 166/403] FMOD - fix packaging issue and update to 2.0.22 --- UnityPy/export/AudioClipConverter.py | 80 +++++++---------- UnityPy/lib/FMOD/Darwin/libfmod.dylib | Bin 0 -> 2430928 bytes UnityPy/lib/FMOD/Darwin/x64/4.x64 | Bin 3263568 -> 0 bytes UnityPy/lib/FMOD/Darwin/x64/4.x86 | Bin 1875536 -> 0 bytes UnityPy/lib/FMOD/Darwin/x64/libfmod.dylib | Bin 2693392 -> 0 bytes UnityPy/lib/FMOD/Linux/arm/libfmod.so | Bin 1210480 -> 1214580 bytes UnityPy/lib/FMOD/Linux/armhf/__init__.py | 0 UnityPy/lib/FMOD/Linux/armhf/libfmod.so | Bin 1206388 -> 0 bytes UnityPy/lib/FMOD/Linux/x86/libfmod.so | Bin 1625248 -> 1625248 bytes UnityPy/lib/FMOD/Linux/x86_64/libfmod.so | Bin 1569064 -> 1569032 bytes .../{Darwin/x64 => Windows/arm}/__init__.py | 0 UnityPy/lib/FMOD/Windows/arm/fmod.dll | Bin 0 -> 1071104 bytes UnityPy/lib/FMOD/Windows/x64/fmod.dll | Bin 1720832 -> 1724416 bytes UnityPy/lib/FMOD/Windows/x86/fmod.dll | Bin 1489920 -> 1491968 bytes setup.py | 84 +++++++++--------- 15 files changed, 76 insertions(+), 88 deletions(-) create mode 100644 UnityPy/lib/FMOD/Darwin/libfmod.dylib delete mode 100644 UnityPy/lib/FMOD/Darwin/x64/4.x64 delete mode 100644 UnityPy/lib/FMOD/Darwin/x64/4.x86 delete mode 100644 UnityPy/lib/FMOD/Darwin/x64/libfmod.dylib delete mode 100644 UnityPy/lib/FMOD/Linux/armhf/__init__.py delete mode 100644 UnityPy/lib/FMOD/Linux/armhf/libfmod.so rename UnityPy/lib/FMOD/{Darwin/x64 => Windows/arm}/__init__.py (100%) create mode 100644 UnityPy/lib/FMOD/Windows/arm/fmod.dll diff --git a/UnityPy/export/AudioClipConverter.py b/UnityPy/export/AudioClipConverter.py index 12fc3a7b..19a788e7 100644 --- a/UnityPy/export/AudioClipConverter.py +++ b/UnityPy/export/AudioClipConverter.py @@ -3,9 +3,7 @@ import ctypes import os import platform -import sys -from importlib.resources import path -from typing import TYPE_CHECKING, Dict +from typing import TYPE_CHECKING, Dict, Union from UnityPy.streams import EndianBinaryWriter @@ -22,6 +20,24 @@ pyfmodex = None +def get_fmod_path( + system: Union["Windows", "Linux", "Darwin"], arch: ["x64", "x86", "arm"] +) -> str: + if system == "Darwin": + # universal dylib + return "lib/FMOD/Darwin/libfmod.dylib" + + if system == "Windows": + return f"lib/FMOD/Windows/{arch}/fmod.dll" + + if system == "Linux": + if arch == "x64": + arch = "x86_64" + return f"lib/FMOD/Linux/{arch}/libfmod.so" + + raise NotImplementedError(f"Unsupported system: {system}") + + def import_pyfmodex(): global pyfmodex if pyfmodex is not None: @@ -29,58 +45,28 @@ def import_pyfmodex(): # determine system - Windows, Darwin, Linux, Android system = platform.system() - if system == "Linux" and "ANDROID_BOOTLOGO" in os.environ: - system = "Android" - # determine architecture - machine = platform.machine() arch = platform.architecture()[0] + machine = platform.machine() - if system in ["Windows", "Darwin"]: - if arch == "32bit": - arch = "x86" - elif arch == "64bit": - arch = "x64" - elif system == "Linux": - # Raspberry Pi and Linux on arm projects - if "arm" in machine: - if arch == "32bit": - arch = "armhf" if machine.endswith("l") else "arm" - elif arch == "64bit": - # Raise an exception for now; Once it gets supported by FMOD we can just modify the code here - pyfmodex = False - raise NotImplementedError( - "ARM64 not supported by FMOD.\nUse a 32bit python version." - ) - elif arch == "32bit": - arch = "x86" - elif arch == "64bit": - arch = "x86_64" - else: - pyfmodex = False - raise NotImplementedError( - "Couldn't find a correct FMOD library for your system ({system} - {arch})." - ) + if "arm" in machine or "aarch64" in machine: + arch = "arm" + elif arch == "32bit": + arch = "x86" + elif arch == "64bit": + arch = "x64" + + fmod_rel_path = get_fmod_path(system, arch) + fmod_path = os.path.join( + os.path.dirname(os.path.dirname(os.path.realpath(__file__))), fmod_rel_path + ) + os.environ["PYFMODEX_DLL_PATH"] = fmod_path # build path and load library # prepare the environment for pyfmodex - if system == "Windows": - libname = "fmod.dll" - else: - ext = "dylib" if system == "Darwin" else "so" - libname = f"libfmod.{ext}" + if system != "Windows": # hotfix ctypes for pyfmodex for non windows systems ctypes.windll = None - lib_path = os.path.join( - os.path.dirname(os.path.dirname(os.path.realpath(__file__))), - "lib", - "FMOD", - system, - arch, - libname - ) - os.environ["PYFMODEX_DLL_PATH"] = lib_path - import pyfmodex diff --git a/UnityPy/lib/FMOD/Darwin/libfmod.dylib b/UnityPy/lib/FMOD/Darwin/libfmod.dylib new file mode 100644 index 0000000000000000000000000000000000000000..f94ced2dfec5560685e11f925d83c60bd544ffcb GIT binary patch literal 2430928 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

!;8`n(sB$Ihy9!=l5f}z*hF?+1Om|k5W7?__D&! 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 z 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®{6y63u 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%0AX@ zci=D#byHyxF}PGgT@kM&eB$23DOt7KxQ9UQq+x(5c3Qu~^j+AR(c1;@6V_d`Ni1bR zEa7G6?3Ti+UB-QIz9h%IsLf@`<<#^hVjdp-x9%(I>xz=Ql^pC!}^&pYUl z^bp9F^J$b-8>PlptwZbS0ycb62i~(vS1bvmWYe=4a&ZYnT20+NN?RjGg#+J_j-f*K zF-f~)&hH8LHb`j>yi@`29$>TO4D=dYj-8CVWx*LSj|17HOvU2T^wGOOBhq5yV;|>$ zT=g7-YY(T_5BE{qV#vYA_CRB`Ob$q1v3szeiB@2jUrdhDd+`d>=-vv`Zm16k7xo|) zM-2;mFl&x58slC(j}^VY0BzNtBdQ`rDWOQ&iV{&Mq$a;Ofg0@SPDx0~$`sjqD!s!w zGMklWCRQ!1CJ|Z5WC`;F*g6UIPobN$7A$gzBb%_Po7P@jN2W1d%$_03$ z2OdnGV+cusHvlTCCjT57!bfmEkU(^FA$`3Q2ObkAt_yu;gv8{6lg%6h3Gi80TsKZw zGzoqPRCP;QOMF4Ci(Sns2Uf<#&Bum38oY{$BWM7Z{JeJIZzXVKm$(yk3yZe}%h@1D z9!BEXC}=(aztVQ!b2l-kSI1>oqgqg({pV&HFofiJoi%%>m&P*)e|? zjpe~glxFh=&9A=1MzX6N@qNKjOyoyV`%ZiaQ<*nt#0Wy8q{VdLBNEX;_v4s_1$t9U zV4v}W!f4Jo)*L*WK0&HLdtP#*S6hZlPC&^hCdNz{Z_Ct}(cD5eYB_yrQ?8*6O4jIo z+EkjfJm^_t4iH$28CZz<8b4C_N*KOiW~W|HDe~A3WK1xI_}o2>E^AQ8S0F}QGQ+&g zwBD-k;C)*;^RCe_p|BOuMDA;{)bIup(|hPg@BaY-JN(LjxR@@8ql-aYP!jfYPkTgQ z_RFZqfX{Ymw@vy6m#o8&gecE7!$c7~omsBC!eC*iYeG)JtBp%`R0Q9e1bV=gwJ6Ut zD}Umt8gjqZ@Gzs@brD*TCr*Apt7qADdr2sNf$U96tPGxXyzQgVh z;KTshUk1o+$$$^(D;YAJhdpNzbN$nhOwQPCEuY;BcXgCpwOC7Lr%*>KpzG=J@QmtE zbu@Hm5R-Z~=GFX-R7ZG&9yDg9(eo4_8M_I8vWi5%gC^H7Hf+5NfL3$I(C~A${*$ZB z-c!neb*x5nh_SMYc!8rbF(tH6A;dLksjcLu1+5~W@&}@!0kUIsxb+X{?<4n<9_io^ z5pVZ^cZK34BS_ zydGeEAkyDAQ98ZGZ}c=8TXns`<>1(=j(1;Xd?pVPy_Mgm=hPU}g>`#MPMVsONJB+( zn!sEIP{x`;Vxq9P5ycf@5#F$Ef-t9~2qWcOX=kTWYpJJs5f*C=xhH7}#BF5Gs#xcK zhGg^5?#u%Nl@>>($%DE}5oPfxab*KxaY=gW1$PXk_Ez4a*7)Fze2@sV4k9lJaQ2dj z4OH+x5Uixq;wkHbL1KlHWSk#SBDD_Nv2*5j+Q-^u-REv!gk#L)+jD9Q$|O}IO>IBr;DRF_%glZpw?C#cRRy+FlLDp6WbU67R?kpp(s zMl1(Q1i<3H#`ruzcp3alGse-af5bcUv0HisW55qW)+w^Kk2nEk*|hTSnEDG@F#Nzu zWEX~&FeDGd@C@AKfFP=pPSZh}v)5pv3w5{{_@Xw2+7|Xp1K(H>^o~3@DE>Y5PwA3V zx(U<@dCl-@llDU3V8SKBDUDq!wh4B>E4$nw{e*3t&XSW2(rUI6B3$s^o*$gkHmz80 zpWEq%^#;F{2#$e8@J0YbzstD81xw&jr*BqLFQ@EIN=GGj@{tUuEbcU6Yh%0h>MW@4 zTkT1`?N(*>%&n`@0%yZnNwAE!zHd!KhzRKA%G8I+7afM_vE|_u4(oZlq}YTEKZKyP zO;}Y8rzyx*{W)bLH_GVUtL|s3F8l_T2{vg=Qm+XP>CZ{MosvB%-7Y&0y5zCIBsqzJ zLw108O|gz=9VLCpGpt#HD~X& zmBg!ikSM)RA6;;bg1|nXMRQSIN$U$-PJ6J{G#h;;=#Ixmh`m@xqU2J=&G9jd z29QcNfFPCQ9B&=KoW%r2oUxL3F6ki$Z4SI|?L{7NaJGaFzzel)_tO%w=6^rFk6 zln=VxMytr)oGf|Zc6`5(*BZ0|_fUVvBmu6852fwrrzK(Yf5<5h8jsrRJnK+hlij)TO(@VEFhIdGJqNQ0eVkKkKBgnSY=fwi{H#6DGI znzzZ%BuHZq2D%_U2#t{(x}&F@SIf8O~hwr%k5sw#_u8*!nz^Fn3~x zwB;&lpo=ztUVat#6yX{g&yyI{?Mblh#Sb)B+j57DG4Ld8DEJc32Bo7tl(@4~e#T4} z4y1s0SPJD|FW(IM9TiAt2z21JL0o|2lOuZLY9pPbMz6w~l>vh~#f=@r&zA%!#U~zF%jP7w-wV9~ak$2ktmecpX1u30!0R?0` z>4i!}l+RsSit;3jbfqL{v0j_o#)r*HMnf)iYs~IC9TJ<=iqa$tE&E|Q_zlpy9mv^2 zO;h@$GkqoRd$e$CvYEu?T(eCcl;G?B6&cO}*Y@cVp zn#A2!YX<6`%<5LY>P8a#84HTH$wL!@5aTt#VcZpdOp$ryr? zB$^84WMr#)3`J@ZLDR)W>ZPbQ?{ijOt=MPKL?Q1JR_Z0EJa7`a@M<<#zlS)ka3ZQ) z9xx`aSeXASp40LLvVHWUvLll064))?a6Bs`?wfZzahPn2y2&Zr+e` zts(4=FV9%->~g~#8>Zd9mx_VzP@TA8?I%qFLUr~Oi+wz+-Oc%TE`V77np+IhOPt;>RxIz4|4j=Nz~K<2I1qG-H#;!YTr6%EcFM z1_2-hjF3mmN}|up_)V61@D?$lC}Gs*5fXWL_VP%U5?zW*rA1sSmAHFGilkS#NU~XP z&1Nzw7_2LkUV%(%B3es8akzqoBhpzfs-1t18S)2)7c{B$U;Z5-e;(|l%AaC1&58Le z%h+I64~L`#(anGsbmxk6VX@!W{xPRK1a8maAS?E$Q;I$8b3bNe;-j}6?MkXo8J2tvPW9%XiQpV~<0H4UO)A{2LVQ9}hS>HnI-e~#B%x{}>%2&e z0)K~HNoI@$t3iyWi6DY>meNk5ZvTZ5IIo(BN2a}1Ek!=2`;ccUcAf(owK{T=(&WTc z9aGuyjN9n$u^Bk&fxTI9Ks%ATs!M)x5~(>p4BMpY@ILApPUEA^H_!;KnHrlR-4{q_ z^N&Cuo459syA6g9pDk#&R=b-aqSn(iLwYFC!6`i&NMJSDtrrOR0TyTW9#M`dcS?;R z9=zKl)z3nLRh^F|)Sr*l)hV(LYQkkTK|_Efu|o*AT%$Rxldo1B#p+$m)pL>t)(C+P;T5kQ~l1xm23euL$#gZcZXJa(0}Z4S>%KXi#O#Z3TaH~I!1zbULEfZpwhw-Ezr2JY^LNjrvOx^d2w zcHFk!sAggErr2EWY0B%Khq~F`st-t%@jkU$?NeeUF$uHvyH+xtm6o?&a=|>^7)tvn~eWIKMX&ty9OlTQH^`yA523 zLas!BTX1K9Qjb$%k!X^!hk=fXTCk`yq$kb4q)LfPsNu(h$vP`YA zNkh!_>Zkc-0t`wSmudP~t&tlONz&$s+~*L=8RvLQNm3kQGrhkpZ1Ds)dw{%Zv$yg11?+^Tlj4)dIW-DUQoRK@LyqeV4~nds@t} zAggx;f4>ad{y4lls?lVYh+Zz!3#GVHLL0t3%^{`%XA#?)=DweJf;5Ev7{#9XiFp}r zk8A@{`DB>+?}M~62N=0jq0TK%zd@a@Vd``w>NJsAn?N1Lc6gVmS)fD|tY@9mLA?@2 zJz+_$LjmGR4GAH>l-tX8a>Va+zf2zp>7|`^T6em~)9X3BhOBll*tr<)8Tts@Q~To4 z^miW_^v61|>WGyCGA^pvU8z<^WqLox3z{mgMo9R)4NLs$c}wUn=gS%+od`kW>7_z) z!s33AhP$S+m+G)dF-a=&sFq0NQEeP~FjS~69l3(1P#A3rNY$ zCcoX1F5#Bk#W|vtEK|{}Bg!(B?PSbRw?tSQ=C7ryNOTbokonj5F-k1MbOoc}(*dyL23pxi=Wd&mhJee$6EF zQ=17k;V*~mSeZomV1xGaus!D0REmX(ymV?8*vY4M!s0n?LUdxlUJQe5CAI2p1%Gpf z5?iQ9((Fp45s{gT(y3N2vs^&wxeb^!y{9t4VvaD&RBJ4gp(3!_;_e^f?+`S-c+RJ*p5^E{QQ%|Py?J6Nb%H%3{&=%r2>_JgE&Q1G8=L6IiNv4{XvE|c@bND_5 zevJp15t~y410q`IIL8*XOudjC-=|uUHI=faVg>Jf@ZJF;%*j|YYK1kU!L&}}P>6-E zs_i7$yf^W}_&HK;sGfWoSMTAc-*u#LZxwb(;fF{H$I1i55~Wp=(KcU`!&FzK9H#1Y z<*+DCO(tVC^>Tr_GVCkK=;jp1y5hD%CM83wB%zRxt7x6e$9$HH{sIwp1`=s5iNzr3 zg&2HDM?n9!8XDuh;YJ!1MBf@(kK=~Q&t9hM`pYncKLeXUxSWmTn%gC9q;h~P$x9{C zgdKt3y9|FJv>x|+-^CLYRMh27RwJvugU2L7XJEQIuSGx#ZLyafB@fAe&S!qMd`cz4 zB|J4wse+GTzxSV14gRGS`|}!(V&zj+c?~l|&)#B-=)Icm`5q0RwozO3+ULltara|@ zBp{V2LC28>Snx~053L=Lj-M!Ew6mZD3sMYDE*p?(nBX6f%F_2rE7s&PyroMwu#PKy zS=n^*3tO4xuHi;%wiMVk_Y!v-@O|PSxrMg zCl0us|X{8|V5uzXVS0spXnrOWu3WG2Ky&!finbMAy?O@OnuhfWFjs#k< zHH4}e5Ex?DYH1&RxIl(o$%Uw@$MNSj8xp%#<$dBSTFYoboXGg<_y|JuX(0LwBTmC+ z_?8mDPI(IjF6&`WT!wWi!7Su808*XuJVKl-CgtzozGGmx-2u~Df=fn9Q!ONB9et4mv}UCWzS> z!7gBjUyM`AYfiYqEZ>GlV(nmAARG0Jvhpbv9j8=mHxMgO1# zU<2mTK^A~c&1Wd^&982Z4VZG_RSKk$NQ^v1?2Q%D3*8KQ6xt0Ng7m$&Hbz+39R&qw zLS}j)Hw>LkT1V8i`R5fPpnvEKOG>Cw=o02~cQ<;((v>^QDK~Xl_j#JA7n~f|C5UNmLj{zhQ3rLnmG0moCE>log1lw?*`Z9N2|0H(7*b z4!C;4w=j(mw3O3ue)ntb@vIa1X3IY{qnu8{chk#L+0j_#;d9 zi}HIl1^<|YSY-mUin2^uY9@BlZ7EfchN*U zKh1_^H@|}>QwDY6fowcYAlA&XL2|4lWgl-g_VzJ-!;HBSlu4-~_Y3S;ID z`e3X7VTH|m&FFF2XJ)-X$4G{igk+7Fu)hnS6Jov7~3uKL3Yo4ING&$JwwTqcKDvQ9}5^* z)U?Tqn5f&~?jmNFy5w13t$Q13%Xqt|J8^(35p zFEL91CVx@R$dO-3%CBJ(4=aTX-Y~4k0qeNiU{%GWnZZgglDz|9-3GJB4Zx~45^a{Q z*?s+uHfy=y`;L&AT`kJ4Usr?n!hBc;aB}3jC=b828uuB9T@Q#QXR+b7t zc@AOJE)_56TtnS9VJJ=>#t)j-b)PhJ5|#_7v$HO0v+lMFgRZ@rf>nc110?LVJWfr( zCNdmmVrRf;>nuNP#Io6?(m<-1y^{olOk)QzvGLmE2GKZuDOo3x1aN7!`! z?2?|HpFu8-4q@|~%$U55v5Ow zn?Ml_W)1@xa015j;EV^jI8E|y%|i-<=Pt#&zn1nSs*Uvyon;OeSn63eV<|OcqADLo z?!bJ=fngO()L8w1MLI)ziGJA1a;B`w1z43Z_(Y0wuIvIv_$FR2h8&^8Rec}X;t zp?}z6(o7k8O+Dz`mFuQW9S0*+G!xJPeS}o+@ct>t5{4g_ypm}LrVu*vFF;e@*d9d( zK3`+3x*NP!XAHt>!9mzkurtObzfKsoeQwOa`0+a|<+pK3dl?B_(k|sM8K468wx#Xo zyGAmsXM}o)&d(CibPJCmnqqhXMj>hJW^9QG;Z*78 zA_YOIM@Tj|6=A@%iV0KUavobX~BKD<_8X)=zc2X7FiqZ^o0DtL2ruu=DLF{ju zh6x;2+N-*>DZY#zTGu`PCY$yr? zzvp~Sa@Ofv$a<4Vm~h~vFyv=X(Yi;-TZEED2}2OZcvvYQEe2XdtV&srOg>7A%PZI( zf-hC{;0Prs5%*PjE0LgF z9X>|kq&p2EmJahVsKYRhgE4fpbu>n|QLOX9zJwziKVWCtS?n$l{iVbm5D@2Zpp|c~ zx}SeSA&v@VBu>rpXzZ`Yx+0ysa2!<9c{H#FiZ*rZCW@-Kd+~`7MI%){ZfyvyiKD+^ zCnGkllhrgr+{J6+&V*7hS#Gcz{qVHAo0z+e`W4%Ng(FwcwCSAQQ4f~Qn`Pwx>}i3P zc;akQtE51Gw%{A+XOp`pSueiYh$5v!n2L9mE~eEWF)5GJ6P(hlUm4XK%hNH6^<7V! z7chCo-6O}-jx&){VlIi0IBz+1Bu+?*(0U{Kx@M9PRoj7GSa%((kCn{WK>J4>H*R3h zm?sTGWo4NGeacfwrUsXUtqa`TK=+}(&r>xEV3*yR1OQ%VHmddx)}6;zJ&q#>bz|25 zpv4qekQpRn1`v7Zn6&-EmnWMFZTfglk!{5GFTZ7Z$KJqYAq3M3N(V*P*5>3UvXXP@Z3E1lIRB*BA`%@BZ zB<>a4cuR{6h83j-L!wQTOmjbs0eC!=Ou2aToBa5Teirnb#(orIK;4+fo6aB-=|>_4 zZxZWTrg;7~pT9NZZ~qT*?*blWb?yHrkVsJUovC0^L8Ar*Zv}-)R9XfSozY3f7BsP- zXq4i$XcMo1p&^FXag-jV(sQJGPVK2ZwUwTF!77k=A$X|`f{K?S-Up)<)G8_^|Ic@= zcP4>)F759;&p*#IS?|8Bz4qE`uf6x$H`YlNv(#OWyQ`nO9&^{;?t0W+hq>!*cMWn^ zm%9#eSG`7)(C4lRfEgX77XpflqV3(8Z%*5^q04&~>{FTjF-3`Q)E%rnq_+XkO-lDo zGg;Uj!#?^f2d7R7*)^S&c@L17(jTq+g~l6RS!p?79-O zN-9^|fkK}gC!1b zba1VMSq{#2@NEYZ9gKD`%)wrO1ec3yW`0C5j%0S+_7Z_He|oKN(eE|r$rTOwoMG3v zPw?lN+@H+Xv#OtX&|AAHsB{H!5ttk?IE?LAI{3YVha5cYV7Y@84pus7bI|VK5dg$~&%l_cHs;y-%UzAF zXDL>8+@ub%b-T0mMhhyvhq#b9Gb)fno|ajI7tY?Vf7Bqb#R`8 z84i>;QD!HC&UOhV4#CR4)${JRR@C|?CoG52m3l0;$WzQ{Q%JWD5w#L zd$^L`8CmW0K4e)&^p0|Re?lb4yH`oVq4xn`>HP+dc);Qh>vXWj!Ltt5I#}o6IS0=> zc)`JX2QNB!$-&D2NNh4NW>kU1e=9SVUg`e7xiL@r_2yqX*vY(D!BJOohq{t;@qpm- z3>+~705h+3pgeHRbMQk4%?{=}XmN0zgH{I%9E1+82T)yy0ib)hfiZV%$kX?3KclNF+$yn;_J|lXsXp*wZ2o8{%M$gReU{#=%$zl@5+|aGZnV9gK7E4F}(J zFdhJjZ}kxvb7+CY6P?6A;a_N4M>~l_oy6yrBpmtzpriCT{udR^nn0oD4+lSRu-U;D z2Om24$ic@B{^H;h2cJ6F>fkd6p97%sb^~MD|CDFszwTm;ywzewGMY8N(%%pXMlMv6 zaOjT!RQW#{IO1lDKkRM?zjp8&2lqHw>fpBy{?ozl9Ng>RJ_q+ZcmP1@YXML?#lVGQ+fhHRQWqUwJINP5r?H5oa3P0!MP63b1=if_Z-Z0aK3{J z99-z&A_o@(?ApMvbXPv1wx5Ba+uFsl4c`1uaDulL_Y#1kbgChYj@{gd0w5JUWy{tEBzbY|awi8t7O>dQ7 zI8=Tx@e%BCbfXVhjA4&C_>+ST4qkPz(ZOpDUU%?@gEt+#<=|}x?>NW-ATMiR=!Ujl zoEzZe{m>#tRlT*Zkte^DhMh$h?sn$1bU5xRJUU9R;J@a<6#Gg`HS9+Y{>j134sLO< z$ia^t-0EPlgP%C~X9xe{;5GoXCJYRn(3{rjqANS@>lQJhHSM&z-?(E4>L?wR>kq103w`U=Ig@gP4Q3gReN))4@Oh znOdR|C&sr&wpo; zhTZGnJ_q+Zc)-Cj2M;>f*b;;=~$&UbKug9{y8i`r6I+YgW%cC@y=Gz{R% zP+_-?9h(!)--&DB~lK?0Gth(0C*F*+giP^~vd6g)@6uGP`65mW&mh zW@mXdH@~j9$kq(QiQ7`ypC-wfCD+9wAp7In0LkoqgGrD(Mx5|n0huNhk7%P|OJdb^ zvYgR;Kec0294P21=cWe<+R-M-e#%-IBr~ONZ9zP-IkOI}rQ``$@|(qPCco+YYWYp# zm*h8|-&lSl`3>h+&TlY3jJepU!zoS4uum16cCc#%Egg^}vvF00-NHDzqRgypx~`^9 z*4;G}9bv?|sAYA%<3lGUo=SX8Fnko!%o*;}UFK+4klu9f4=(qR{1 zcga*Y5oJ6VQ=F<>ZOLnhW38}tuD?Z9-y78h5vrHY??Htb-Eh_p5dBTx+;kdM#O=Dl zjWvA0q3nS1T9>rk1{g>WV4)PJ9|L9)N6j<+j@zYC7m7|5vL}z5 zSklnvKZ_SEI+sYQ*_K)O2S-jEoCyB8Bf$o!RQ)1Z_>RL=+%hi`?3M){X=LMNSI@Fk zH@L^>#dN@Th7$`sz`{o^P=aZyc7&E|>i< znf<|JF1;(sW#Iz%@TdUSTWJuXG8RKy#DnUx?WDca(xw}Os7TzMpfYJYTB7Wk->;M4 zp`ub?>Kb6zT0FBLtHLHS_l+bi$)rWNm}*xY+1_K5PQ`N3s=~NLC%a@Jaj{SFm*UAt zL-$f{@R6L!>Ps|R7s@Q3L~QoNH0+*R_6zCfpyfpNl0*rjoFZJT{^V{xVjD8BZ}T;= zqJ|m7ijp^ur?2R^*q4+u%hoHi?4T?E*tcj!8{ZH9D|>CCJ1t&*XDe0PkqTQpEn8VG zR2RhTPh$Wx_vcFf&1rdvW3f%kRp_FIY3v6OKQlW2HGoZSje9WAWWjX*6_kNfuTU$| zz|738GA$}_W~tQef5nR3DT}c}He+r6JVsTVorNp1AlG0gE?AJKPE(tUm2TwLk=&Ze zI9O?H8DeRXQgu1pge|5g{m57k6Gc|8_HcD(LCZTFFpNk|WR^<`a)0G@XD(G!+Uxf) zHmrS}bGDy8dq8I;_hvr_>Qs2&SfYY62~dp<%M+llq2SzCa;?F@9<2^$+T&?#F-`eIF3T~ zP&EzTQb~UZ-H`}|o0~Uo*X64%FXPFMicL$fkVEHqFAcY^@R1w+b4UJYPv9mADmSx= zIXxU5sbtwDv&3!0a@(O2%f8La7K6Pg2&+&T)Zr#UYqzQ+nl7E!Uzn<$kC){!L3QzBRRoU_F309jqLpH<3Ejx;^@q*zO_22exCd z1MqV0b+bf&+uSNhtH@J{O!<1_;37A=RQ3bK7nxqoEEl7ER5bwNwB6yiu=8(l=Xthz zgm}i?cQI2+%H}WhwAkEoYe~0h8}n{FOJ}nSMXc+ci%S3dd@d*dce$JsSVZ_iP?Ya}uJSgD1 z@Iu^!mNpn-g0>7FnzcFx(vbOD#P$Ng}3 zG9J#20oKGVXlWkpz0t>#E2EE}&(;Umd8@vNTX&!6jx-b49u&jT#YFkFT0`zl^!=tw zhyyo*5iL#l0VE}~;TxwAP?P<+Iyb^~>%o1K6+;&izbR6<1pmlRzl2iGs)_-BQ+z~J zid(@uvLU|2h>Y05G?wE3T-rYO6JBhFLURD~@miEO?%hwOS7hVB(<+6H5_FmVG+joO z1IOLQR~*`-w%%&F_VuW`bW>&h>J&S}7}WmnWqDiS$nO0b;L_< zkI=r`gZ6PTp+)G(f9PzwQ>q}it`!ej$s~YA-Tj-#a_8NmRk}TaO{e+Jsi6%2V9}%O zq(uyM*SEUweT8yS6G?TE*pct@oW<#bz9P)S-{mGqUDlcprV+2Xoc-KfhxrC#v@saI z4O%}7hJS=>3!fjGOl*eupG!m~8#+YWy9u5v+CiC}8GS6eDEip3ZmTmb4Fv4e0>S)i z)h(sBW{BHHi@7OUIo9>fF>@W4F5Fu9~>C!MW5rN(R!nJTQzOhCt}#1Xn$=Np72pC%eSukTQpbUh^^gdAl;gKkw>nuA!wI( zX7^)xnqC`sj;rZx{0j4XNqq0=(j}>ApXF)a!Fa+(78|H@ej=`oD)doBxqlg!-)WS} z-e^{j%#R)1FXKlt+$-fC$?&o=uJUnpb_vL^wRn%&-H^z&|BLsM z-DE}A+vl9#U2iILzs1ZBy8F?-MGqc`dd%HLx0~v?PX77>nM6$^(nPKyLZ;h)Kz85R zJ0Y`}*+FLs*Rm)39zf;Wbx|R-GRj0_QAyc2)FI1 z?Q;z~XgBXf|euHD_(zy2W6z! ztR1foTK2S%-7Vyi=2?W4bnQiH`UWjqF?Ly_e5850{5jY>cU7YK?cz-v2-(Rdz^w?j z#f~!?+LmTV9;%knY1-+AmJ_Jc{NXq(1TyB#|91j2cIu2SZoUd(L$7=ING#V(aFgyv zNM))j%BnJ4PjMn(cmij6$n8(Gfs7rm&x9&?n9<}JwyOG5?0)4$R4S9M0LBx|*J{go zyU^==4O_~q!yLQHPs?S0>$}RKpyl5zH*SS^qUyNe%d~fwZAzPN0IKOy0M0DrL=u@_ zwMl$VEGM&~u6?R9zfz@hk(2IH@cPKy<#Sc;OHm||X7v>QId|@U+q$*=bN5X3)79bk z%OSTcEQTiy$UuFc|B74PA7$z#O8wqIK6-G$w6g8Ycd89c=+biMEJ>g-6X!}!23Gk>-ypYfTt93oQLbu_u z>i^O+%;kwtXP9MIdq8<}zzgFz^=gL|kSLy~3Wjg!x*%cIr?V>zH->(3l1&Dutq+EC z;q+8ScV`|^&k&1F`r>t{!$QKU@DnD#csFW_dfqF!w|-_L`f84l)K9e z|E6IER1(x^xjIN~w%fFnL>%{3Lr7=OYfFc(=P_PPns^O2%*LmHF<$+2ZtFhk*^cKJ z*#^*6YigkIn8IVzl*M^u@gehK_3)o#?dqM?qel6kg5hs}2^m?)F#VOW-Rp3q;T))! z65x6Wje%}m01qh{&rN7-8C>^o?mzT`bHtoF-u7a2n{_U>;ei=fFZtA!{?;bLwWU`v z5CGBcYi0Y?GM=WmLRXn%ec%pYKSS=PWfLp*hsf?{nzs)OTE9-NC}%q0_r zz56u?$V{TW=w2QM#y_HcQ3cKN+BDT1vCQP2@Jpj`d2Q15#Y$h>6MkwGF0V~PqVTCb z;iIB(d2QmXfTf?_6CRJk<+bURD12s5_!jeuH_OYOcv1cr^@Oj9!sWH;wkZ9TJ>i-R zs(kY5x>kv2_XOS&1uOGUFnZ12Jd%VQ)#&7f zq*Zo6nS)jjnP;YXtir;vc@I0ZaI<-4=B+0IN18p#?<_(1BlFCsi;0S_=xm1VueTxQ zZje$K5BW*{XXu^&%x@0{0!Q-u7QZcYh?f9wjK1a8?>D%giu`n0J#Rg9?-PaP;~b4! z{gUki=A1$>U-cGA?T`56c^!4csru1N)5WX0-)3=P5(VwLfDg%G*V$Tb&_^vFlB}*% z_>c&7oxq1=rE44?5{jkzIvk7;8WNNn!c+<_E z@OksrJ+9y}(A`;WqtTYkv-b@Uh{~JKg|1-!1pGt$-n0lNF}7;?8eSG7X))B5hd1lH z>vHqH#k~8Qx4yg1GVccS{tzVL&HC<2ns<|V%hDU(tnaQ-RMDa~!p1f)v@lkyix${- z*C0!hHt)MEiN1G~^Sujle&gUBHmCR}AK%mMO60F?2^^4E8U&mwdI0PQTR=?Cj;YzSpE`Ww2J;U>VxrCZy9O<~;d$O?>-ZnENS15>Lie(05_n~J9>8t< z$@-fYLvMBFkgCepxdc4>yW4PTRV|sd2QP9XkF%FR=RZcSX}?W_<1h_F7%aImJby1v zM`aF4XMUxT1FH>PyRfRpY^f^znQ$kw4+&?gex0MePxt4P={PCGeH(gR*RHHEWw~LH-Ql>F{Q0uXOfTC6S3xJ(0e-zw=AZN$fNWj%L%G0$KZ~{LP9w z6Vm^K-mcfs>pd~Q|7ma6pwD}|c0&StVm^*FzsL1GI+z~U8k(ND^0$DjwX>_3SU8r4 zX)(dY{d@2`txs^znqcK_!O9=-wWadIhVP}ac40m%nCE>&oP+c0Jo7>&{4M z4CZTrttwbKsSiim8!Hl(&o=HKtQ=hVRO8^_o+q{c0cvxLj)ByRm+eQ~uJ6yN<~4@t z>0o79x_(PdeOtQz^Xir-meKr~HJ;L59X?yb3ocv?kZRwEJ(uWD%sq&g6Dq%$vpYvp z=agjz-WU$NsjFW{iLPklmDYAPTX36C_oM0JSLxl;m1`THV9ZnMqXFBkWGu;-hP(5k zfdU0+5ekhM4u=9A!#5q3*@rjAb_rIV)hA?j-X9to`%}!ID(s)xha>&LO@AdFH>TSa z)mSUagVrv5;1PEr!y^}}(}R_#^nn?tkW>shv5GgdQqC3Uf9|TU^F*PJIP3Iee~w_@ z=>#>9`-y!bE$s(0gOy(mg(K`+z<_i z1-3gevkdgC-L5>xhV_A`TdBFWhJ%o*Q~Kx~uf6#q##3DVsyZuvF*9HRFM0p8ix){t zek#ncHdXmbn&!NgI65O_@#sYaPTV!Mq@bi z*Y5g_Kz7`B42;>MKzQTxM)=A27q)7iZGNR6{>CV-vY=trfNfP(`a9OR(F!7v90J2=F_a0eqC94e3<_s16m#(cX#;V7rD z1Ai+2?%H0Jzn2p_+6jG-7^?j8MA61yoj~O;#iOJ2H~i=D7)P1L-NPqjuXgZ+gC`w4 z<=|-te{k@O1EVP%+Uc$}4xV+eRvN&{m);u!&F?A7axv9s_mFm{IdmHvrH2(ENVR2ekNf<3=#^5x;REAGX*O8+7`Klnfir z>1{tK#}c!9JtHp$L#6M~tL4^@Bv6Y|u|Z!Wp3+`-3u(EW=?;MY4Dp+J#CHlYr;!cS z;0V=iLX`!T@VtYuTd(JW>Zf-(s(X8*%H>fl6DqA$M`xR#WJDmsz9nqm6gE-wu%lQV zp}->f9-r7XpH@KTx{n3I>t2y(_PWJGH9&5w3ftFgN?!QHEH2*I!%X7Yd-vGPC@+t^9WLi}oZ7`a@ z1WdA7&euFc^?xn7q_bw|hg%u3fl0+!d@+q2Zy+)|2_0* zKU1#6i22puOAI&qIWg=}hz+`3m=+i&yV@^L2ryr)yC^Niy4yfzDIlF~zSlrz89-=0 zW(TPlG^@fGG@a6Z38n?&MfTTR_IWU$O`19u$co zPi1|Q`wgF)Gy?p`>heBzjEL075Bfi-%b6e(sVAu1A*O&&a)D9$4xc+tfi``j;_SGE z{{L9A)jq}cPM626;%xTjZ3Z$$G+NkQVjxonP{kd6v~%Nu1C1MM*?A1Wya=qv8%(bl z$ZQ0F=}o!jJ(`otEAH*1dL&!4peMj4l{?gk`PJV`43h1{m}Ebm0Ml;_(?jE- z@k@#|QzgjW%&tg4W|j()ZEi4-xe_1-?Ssu+;_~AIj6vn4Uy2F+CQNAqnMnXJO_pok zqqTB5gZ{uaA&JXZAuBK0uZl#M>~(zRCHo(!%a_>}B2v4`{}1Z&Mv#fri&Sox>@h~^ zmq_*y73a$&o7KX>x_`#%Pt?-O=+<)eBMP1F?};Z1 zg!5xW9xT@&gX36;90j-lh*5**iOT``@hvJii zMSODNrgb4(ANg$4Cyd~8HRA|&x)r+nJH5Man4+%!4ICPNwMablkyQojW09(g6Es|8 zqicmSQ=n!`b+|R1sae|1gKv#(-Hl{edf@!BB7bsu(?9(k$avi3OOQR+EM%SF>9QA_ z|2JfPIi`$ZvVHZzqdDHgMK8OZth*#ap$kI+K@UjNf2+bXBM_t7%@ZYA7>+ZESY^Yme8p zT+f|qeq3j#;w2RlzC`z`>dH?!oPgC;O;}rWT7HcqGA8z1dS{~@NV`ee+V>H$AFvWq zcE5q$9FXH7tR@e*nw#8WH!UWjU4wg**M99yw;BEM$Q`@sUZEmEpKFd6o~j6sd25E0 zN7Z_F9#yN0OKs~?M-{nat*eD9zmZE+m40%lQRN}rnCMiswiQr0H)~rTi%`j(Y1K{+ zX*V4@>s}q2JD9Kc?I}}hnoy9pPB$1g_#tJTgd2FPwn5r+x^esD4R9{)jNhbfS&F93 zAi&#gFIFul@8b4JH179|-!zM0Vb`n%cWZf+Ow${ZwQ6D$)EdSLi?SDcrQ^2_H*a=v z?A57Mhg(qGZV2o;DP!0|!^O-?sAeRCOIFVaX0^W+wh9l|DB88`1SZek3^krC^|*V+PYDopi*(s+Z;y{|UvH-|Ar1Q{};`_KIMHT@RLN z9Y{~ro3(QHu=a3VD*SkZaf9O7NZi0%s}x%=702x}&)TF1-!#_Y?P-f#QY74A=&w}E& zZU&0A!WJ4Xcqdf7St~qZt#A;m93s{VO@Xz-1#8z0`^Q+@N%BnVI*|8ft=v7VeGiwU zwy4w#FQ~$A#vgcV3GRrs`pmPoEQ+?(quoBhq8V%TnP+XxzH3`Gg%fMrJo-(V%Zasb z0wdNwW>K8AtIfN>+NUijerqRCtQEGdji=5o?8mVC4|8R%i;W6)sqNRmDHX z+NC7VwBCvA_GYczJ*<5gmss0rFm6z+ZNn|ru2XDR2>Q&kcD)DRwA$hAuUIr=tv>Ut z-Duyntul~^wF`m5E=!46D;r6~+FLA&vv#q07g&3n1;uZ@11Q!CTWGl8olx~=t?-Do z!a=Zdh*&E$1=b1|tlf`QcZmJF6+#oqGp+NH-QKK~yN9*6;Sy_?8jKrM;qSmL*50ew z&RTuuS-Z@GZ@SCj?GIZtW34{(tZlRJ+SUaI+HmqM6r zLGfFgfMTt%g@y~>2~}^_3XfPT90cDI1-FH*LQ`O^aKYL~5BSGeJDucg-avMHvsUgN z*3QNy)-E)NTme=1CWp7)0*qLz&pc}vN6{8Iy!|$dW~|j`p0#(_cWvuTgYni$Kw-bg zVQT|0V(ny$;;gMT?}F4$wV?Q|(}7~Gu!V*T-U(H2)(VeUD;xwXhe&FLrodX^g0(Z* zbOf<~x73a&Il~Y1U2oRP-NV|ckv5!V5V-=X@Y5aM+5n7LtIs@ZuZ*J2ba?x0i)O6V zXP&i9_Fda5YmgMeNT9IGECg(oK`3JFXp7>k9c$hN)*f#`@mt3O#adwt4Hvu z9<`sUGU@ZYkE)n(^;?KP6P13^jPEKYAF)%J zc*IgnI$})sh;>W9TZo18>~j9yqk()d;^NH&#c#_8-Q7rUb%*yBBLtH>A_3}g}-JAZI6@DF6hs|j^$gW4AW zPpU$RdrQBCY?w9jfz`pl4~c&&$r;LoIs>;Sio=pTZl53H;U7ft z4=ag?e?@pz5{P$)G9gFLxo>2P?fvuVp z2E(Uq4hF6#%8SA9YRV`sX)d1#_UbT~P4SUFmkl(E_E(W5f&w)VvKI=X_K~O+2E%jt zhG?Qk3){IJCQQt&A*M{s@6ES1nO$PP@P>Ha9b`kEAi(p^s2!fi{U5YywaJ01@w1WR zrv;JYSL_vuue=pZ)&B1r@@;SnWkbBFu{c;jR}~C@GZ=ARThutdtRJAOAXK>KoWdArXrz5g4op}eFAa@=Wg-P zGfam(oOfO-Surycq)Qx(^bKV7Bt%PA{s3GL@$@EebKwE-d_>JgBc5+ke?~wG;t_~g z3gTZRaR+p&Fc7Z<12EkdL~BNf3xDr?+8qECpy7^&Xa1Y^AvgVRq-_b4YB z{S-$|BAzcDDBXAIKxomW>X)Jfw?p)&(6JW6KcpHc2g~;G`yk6ldQYuRde5{Ys+bV8 z;@c#8ESS2LKxoI0N(t(o3Z_y@sqQ?zuIQ*t|2Ro)nd+S?(-vY8`Ih60EyH|IlERQZ z>>R1Sjr>gQA*8kIRFIW!_n}QiI*?8WG`&t#||aAJFnWmt;#`gtbDYYpibPh%2A!5^y@A_{8S{d z%e6Tr;lna?{G1@Bdl?q)fdFh*R;TwoLZUv&%nrW|#Z^o$RtiVizBl$-ena z{9^}pA&&YZxt@D7Y~@YPE}4zJWZ1$$M4Lpi7`7_Jk83R0g$$3+WK5U!p+4Q-?#`YHv< zd-6sDvaaC)ei4{f6&RAA3m^_Ot_n`<#Yfw`AS|1A#M1eU$;`Q_GMy`2BL z1{_rxt3;?{>pLe8xrR(*sMs8_O^cLxSi$>DdCS=~G1IE*^VlcKTh6Y-Gp%B(dyka2 zoLz(18CUS$Ti$X)!1*J!rBKf(ytS)8qrf?jD>&P5Bfp>X)48Ix{Co$mz0PnI=RACd z$9o3f;E+fD^##3eFqIAVd3T|mCNtB@)0t^J$JofbB`zMDcK==oszBEtK?hR(O>yicJfzB()BgV()H)HCF`fG_MP!l z+D^(2yos9(mjQplD|a&~pmtff_o7)iqmU~t60d>axPSD%y}y#m<8 zV<)7t?*%L~%lXlSAXf1WbX)9VHJd9mMEHxw6=k#+E%9AZPGH@Zyemfd$9P|>(FhBE zto5OGPoc+)59h1)kHn6jS0uEDe?xfsDqK%a#jeslh;h`Gf-g zT~wh?dizJ!L0peZcmy}cP-BdOnGP6gU)?SLJdSw>&_MTsovf-pz3`mlAE3y2>LscJTT+J^2(0j{28?62a^EAe z)Pq;HwT7r3B(Ee;UG&sL)RMe4Yy)W&2a=)Gsw7{ zg_(IoIY^GB_?moQrV5}@dIjJk#i1#@6)~v&2p{UMPV;%!b*7Ef2tM~Jp_P2brE=<0 zR1e30Bi(mSTX)UUpygF<;>uL7PV<~3{Y1KWJ6nksXVmHO0`atRy=L3|df#-WdN7?) zESUcy!$%S<)OMLvHeFnjDsJap)wXoz?2?*nLlN$_G*3U7p-cL#@yL9Ri6#V!=c)zwt#99NIz+D7313Nx)!M{&LRNawq< zr(vKSoX1lmm2Z1f;$IV+4KcPF%SiKQ+@5y>4u3vFpmp(!;+ z+=k`niOp08)rF|jg~Y!G+NF**i2Wd{z=%j`vulKu7G%PFjc}4f>_S6{nx<_Bbw3c+ zzqlF;;)md)&X`U}d@)^&zSt4vNJ+G2xYZ0q-*fJIn%>N}; ziEzzb}zH{7X%CVBb{u z8L#N}Mal;3gM=*v_N&RxMxwH#_hy`PS1LPtmzwO-7MXw)d&A4vh?4H0?8BHS95qFBTf>#ZYYZbM47 zGAW`s=po$rGG(!$CJ~CotpBxt2J;>Gjua|WEo!RRjJ&Hp&j_9)f*Gm7YzS@?!C*Jc zBKWR|V08c&3UL=mO^Jyz#uKp%joBXSbqXYbu7$qIwx9#F1A;I|C!DW?W`^k(UvFg=rd8l~ezH8$_0gA>^_*QaMx7 zhgcK~%{9;;4JEl}*M?&ebG}OkHn!Mc@eFr81@IByMsY?O60uR$F;Fc6KSEjiF`hQm z`;g4kQq;kXrU_)#GQ60Sgw8PbJ#i04vqA$ch`+|%K7!pK2aM|(a;sCN37{gCi)3`a zokX9WTC^Z2aH~i3HC!@*(HsczC#znfUl99fOrIBh3BAj|i9QV5RVk5uYNn0PI@QSn zC@cuSvCE1w*VuJ=fn8e^Uy^U^(y%N}mBbH)UNzH&U{T3p7g;yUI@?s9IGnN?Z)?-u z&1$3?$-SZXE>;TRW1+WZ5LZhQZ^}u(Sk-J)Oa5)ZTK5{+-2vW_%1#YH!f!1z=E6Ts zL~Gp2HT?XO^s9<$U+GP>8t7d{bP%goC9+O4l@|nfFFc6R`qTn^N2xUj)ni`x)e>j` zL0vtVRa+t%Wng*|ZwSmc0Vw>wNk3NPsedBNW#G{?D=+T!uf7A<*#{#_7b=hQRu9&t>Y(n|x{fuEI{@x7)@lntYt7 z^u={8LShaxf}yPDE+aUv{6UZ8+wFIt@}Z?_QO(u52++FpOM=u~P4Yo(J<2GP{61h& zp-uUhi5ZdJC%Rh1GH{sPz!aoVBOnM05z&&0F2Of>{0wKE3BCzsf92Cl@XPY-aKXnY zVnZ(Q9}C9+h2Yb*>>&8o2$B9>A;2VGoI?6FG|NkWR)a7rXt9RQ2&6_o(7Bl}j5H?u zl6!UIuJ^w$J*1YcQL~SIXa%%cvf2f2)krN`a(N{CnpgO417vLK8_bpKhQVn(HNd9f2mLC8a(USkK3sWTfd8s$-Hu#a0zNHM*25gu~y%^Dw{r&i9 z;G-dh20wP*lnIi_zT{rDxRdPX1|Cp{XE9m-k-xf_!y0eq`7qoo* zk>(xCH4sW`;?1nyCI;!^_KeNSG>uDUY-ZNAi^9V#%uy7dX+9H&TBXcP!7N_QZ2zUc z%!JzCV7jt7olWn@Ol$oLP1%y!<9Uf^&f>&FnxlX~$xh0a@FY+5U1{#|$WGpe$geWt zItH(0$$5Ke_WPoO4#!WFD|-REAkq=4blk z0woiM5m9Na&V$%=H8dL?B4P{hl!(oex~9e2v}hKpRfGQ6m1=2f%hQop8nX{9zD7kc zMr>3oFd?cH#z;NPxl6)fW(RO0>Zl^`B@L^FR0XuI9>&{Xy#u5|e6T47(-ERO(n8j( z?4VGjAuvOTaFCf{Kn=q>BeM*cO|UM~66gh}u!BPCaE{^Ub~-gU(qACrqoJW$U`$1r zDN6l8UbFS?(QW=>tKwn_(=uy$2g4F+Gs9XKy`jxa@tBUQ7niLB%DG-_mO3a5;+PLX zt64}itx$Uwt(|$SrX!;1Dv>D_Y*43RQVUayM-Zv_Msbs_2 zv&=Dd1Dv@7)W#VfjKEGGb=qvy2xshWqlTPu8te^b_R^Y8ydUWIg9sUU7%SYT#!X@3 zqmNAY{k58o%srp6CdR4PS^uTUhv$wk^##K}XDieb{Mu^5Kc>PhJ!YUOJDP!(H=%|w z1I+{k^ZRpGM!0A;-&kg*1HzUo&5<_)^-EzKi!N~y4Bc092+;<2I(cTM*2 zzQpRQSkiGPXD5$C*DP`?%)mYvlKK#ql`_N{ax9$I*QMY`Yh%k;eD(5S|(MI$__#GnX*JZ>57mg;$Jd5gkklP z@%k)YP150fEz=rtlt8*TpP;rUfhxiiB$c47C&6YT$#d9hBv}qc5bX(aMp91#X~%pH zQU*@av?h-&iCxCqixEB3u$>w1X;{F77$qvYs~0RQD@0lnGY&ZogO#zDvb;b;8DDyq zoYS`Fp|ZuAX-m`LuifJ28KCKH?vX5hgtg2zs${UJv)t~=8`^lstp14!*@2Ov?O9&| zT{PS>9oPzrk$h5Hn7mrXnr{h9qb=jzH{>(PC%p-ATPE>|Ax?2?`P7>r@i|Y^gDk+M z_K`X6_mE?!G*fy+> z)6PdN)S=fYsERd9S)oDdW-7Z^NJ^HLoy=WiXJ&+`STS<&yzcP4tTTPxMp~L}MI9*^ z%=pEiEH=H6iAYjLwbG9tN0}U|=idf0a<4@nwn)NAGu)ZD*>Y1g-R1sn7hew!iVzd~ zt^1q$JU%$4zJSN2%FmYC)N!ldGyRBajn5=b{3~R|5YVoFCuUSIQx7H)OAA?%ka*Gq z#A9UEv$(1*>>WIM@}fAJrD$>01`2Vgh#yFDX$8-wosbWdvDFv(E^70v&KW|&*TphI z)y9dBMEG(Lh<$BH#j?4DvZ45O=a7}M(YPc|_hqwE&}!m77|iJmG}GN7|BcFl!bFyi zs8?^4*ja~ZQ&j8eefi^JaSdjPb5;^0RTg2hg-4~qC4HREn4K!Wcx+ry&5-MVzjo{c z-5r*WgZL!XknC`(p;!;=a7k;YGh>C=>>H{ZDQ3tSF3-Y9-YZAZdPeeIJ@lT@1U4!a zD5R>R5|ORyr^t9WQaEkA5!Fm&rjW1rRv5+1uv~1Qp_;Mj&E@&3vEsn@J9?N_Zs;W@ z8Z5Y_7oCtdEJi~ZH}%r#`-tX3>e)v$X73^+Y+aaCCVEEE^m3H9CCVUOEXE)WiYAdL z$19yNV%>~`#?+xisXOSf#b1qWXiKyse0mu()oN|BsZG!(Z`PFJpk41WEV(1-ReaQ` zrZZ-2umj*|FIm~F?-WhKU05PFQv=NiKWnpMA=-mHs4Qzt8eXa~$;zhQw1<=GDw9Y= zFM&{hh#M-c(U?^Obh2SbJ_E@>12h}f=fztRhj^RWHEKa+lq;DTN!m+jJW}7%+|%yD z<7j@Gm)narG`^U|o3R;Smi0s}xlRIL=Niy?@jXR7I1oa+=bb45GrY}A&eUZnGewfAc8R`v zENR{N*$5;(7G{oEI_k2(9s~PA$D}SQU)WyVl=mIvC zTcXUNwsJ^paW{6QBqQpOtV560ic@q=Dw}f(xf7G)=d0Uy)PPIYY;DX5)_Rcbhf)|P$|9$UI47A-d4>ztvQ7PA;7?A+^U%40R1-w$Pt z$2vImIx2{*wUKdNTh}ZWda-F5i2b^ZLWd*Y9*X6%7EfnmT?{l+JL+^IqFKp@<|1#* zhSW9+6v$P_Lw3Ep8K)T3Q+sU?Gvm7KDN#3*r~6C08PR@LFWPKi+A>L@XA#~rdojDF3DQT&R~?D5+PdB|4XHX3TRSnbO^@WM)(}u#x-``t z;IR1L%~QD#5H(Hd7K30If6dpKS=P36MN4ErDb+7)wJ5^GHNPDhCt;_f+U> z$VJqT*dkKFQ1Bd@O1%j&FSNcRG8VYm3fU*KojQ*lEC%uKZX-V_o%Nm{V&tZDyP1TJ zeaUb~zc0M7dA#)(Ru&mJB0rlK>w=PkE|;c_I8^8>pz>Pr2sNc4rtKcU?=XHl8NF@9 zKy2}ePQ%2#FkTR9?A_BAkdALzJ*-yMd~D5Xq}OHaOtBso$L5MsiRE7vRY+;bc8`i` z)kfLG&^AaZCQaa%Ofr7NM@#FBjkLi)7!}Q3GWqF>U#vocNdJqWJvX^LN4_YaUb7bI z|Bw0EZ7z%*l`7hb* zEEG$P?N$`H9Wzl?MVM|jCLx3xyT@rauIp&azM^5exn-&2x^f8dB(SXFnjr!t;*wb@ zNgr*tz=N{5IZ@Rs?3%^d2u<~X7A;Ib@Md(I*ZwvHq@`t}`33`g8!=f^7V%eu*?m;Q zruC6yn-KKYLyL)O+GS2Jl6#hwqA5n6V0hZ-v4zx0M$<_18_mM3p-!avA;I;6ui%N? zNb{?wbuHj)*k)GsEgYsVqAeW0FEvm1sbYGh9(?5}>ahy?0e0^&rzj{0CVOrP{ol+f ze0PFyN96l70*P&cTO&bb+t8wE1UxZK;eMvmOzVqkhLY+L3w`Vzq_^(S_J`2gY>BW9 zUz>#4_A_xtBI2_P!Y@N zw7zH-i;kw^r1kmULF?z|0@Cq+ht~IAQcBF#J~<3W-H&v2A0Lg*S+dO4z;}iq@tyu{ zLwwu*(1j+7O@x}d@4|&x{XkMDJ#|c}r*$fVb>YuaLR2U6fOX8opTaCzsK`Y5F6dh# z4KK!gM~rz+At#F?CN&poaiVS&wSh1?>9wzb!}<+k_SN)qJs}+G45q%Me2OU1zC?*M ze!X%rO;7Z(;N@yzzUr05cdRnCkwV)Y$YZNMpHfCFST31V7zJppT+Gi~l{CGGA4Zf& z?<*5uwNT0vKL~7*!ar3^ z8tcVX38L{1q|5YZ{dO#6g?LkRs$tcFMjCy|)?Rs8F6aexBRP$9CS}_cL&yBdB+~Z; zsaqt2vy}nX44;3~u;9`A%H$bk@&_`g69w~oPfod{~ z*kC_b`}V9tZEr9bv@e)4d_p9%##kq6JxWvtn+qzRP0B--jHw#9944&aBcJ@h-^S>t zs~pcOCsX}(S6Detv2vKLr%(>m&!Skwssokzn;?ce&MG=s?6>4_n%LBoXA^b=P}_o) zt=eHlAmt@if{*n1H2-R!0rhm3j(w;E_(O@UX{#Y(m%XU0xp(g0oq~HgmrmYxHkDrCLiq*42=Yu<2lSt+b)UYqRnwGQI_| zQuiPR^_(4 zCoY#vN3n0gwip}vz^PH&X~s3FX+#$69}Bx}9$Bpz!mBMQb|A37 zfaN&$3uq@m@k@z^eKGL(16jk7#!Rf#S{&N~Sm9ePwU!QFW#9L{+F-!C-ytjnNCoiu zO+MAuYO)vY&HjQHPtFcF058cWtAhJ+K4Cwd%&Uyn@lwT4vtfKA7=4X!GhYw+GF}N= z&TX#9;vicV%wENU6#LF?>r-G1R5R^75{51w8- zBxVxWhpB&Ol3fzoa*_0164A<&T+oecv5?|oSr6A8!kL*!3hUfbnP#ybmpUZ5Jkc^- z>2OJr3W=wuZL=uVN~=cAJLgf_1-NQ5i(`-NW0Ta7X3|3SxTmfZbqiZ3 zVlAZ}fGN(~Pc#SH)g>__K|dPqLjOz&J*r`<#mR7e;k%U=y$ z)pRM0E%8H*X!mvxdexm$_9C2JC)$zqKT$1W-3UNth8t31CHujoy7dq#!NVgUle_%$ zRAoY{sgF=Zi2=b%qcVtoyEXxR>}4?ii$f|yybQWk2QWL|b&ETaFyb3`G#C?itl!k` zw1_+CP)4E=cQk!QquO}ctN^M2b%Oa4^tLr92T5&|gVpRNa!@IDB778ljckM`-O{2ne@rIR6h++inGLN*>jgBJ_Ex^Y%A!{C`7rQAG9E z;J9=l$wau?WrR6T`0}wH{Qp3E-m*}n#@ci51-zCbBtP5O!bL3_N{ZQvW)nn43f_?H zjIGYsswNBkUM#W|`(!mBnSR9SW%$~LCk<=Vhnx86M1ZC%{AZBwU831Fm8Z$aNYWwU zpob~aow&;s-xfu|Q;WT5xs(wBw)ZI-x&~7*1R>uN#xXM-n3-zN8}e;b`pJ+)7QV!V@QT$ya!nV~}` zk8J~Bp769Cm)6MEhdJbsc5C=#J2nSPY|IdymX>@&tt`JbAeHpIE3!^8%@S=-`f8rU zQ&f{rDx8t9H6C9)w&4*3*Q!WOKWwL>X?Tfr68N!}&hlFSYoXGgULT%RmnqZfVSO}eh2>tKD^l?0F+Z?anm zzM?O?cmM?yZ_-@@x)b1O@_U}&Mt<+|`xGGUn)KNU@sB)JTaNdQp} z2yXbJMHyd`_+-7Z+1S4`S-*ADgZL&p+Tcnz&&@4(2q%xV1@r%z54}J4AHa0x^s+>7 z|FONO`yt-VpYwdp^-2)je}>bUSo=nz{}-Zk_T|l=_i6Y($*#`RTGjtm5j*>Y=Fj^! zOi>~y*Au1czkuL|!$s`ugLx64;V2SMD3Dv#fBmMDp^}1i_2aF~zR7yNS0%H%59`b8 zfd?Jm&TiLfkAkKvr@HNXOt`suW52Lp`*xx}pUj*ROBSDAmK?Dr8J-fmmXY2mv9KR! z0Q-h*$;$RQWyy{c)gN{H`+`(REZM&Go4sEfvz6gQf7&Kq~y$UXvmo)O&BfF`;?x?<PYIZ0xtVm5&ke76Za;vN*9|!2UB5-BlGwrGgcc zE5;-%J7*6_EJ#<3=_*aED%szj!!l};m5vRUJmSS*`IhESHa4$10MDu|;K?0SAZRiKrMe?zP(62F9v)1FPbPz!wLDVT zFra$D;rsL4V6uC4;|J9XE)uOz&Hhza$}^_?bHCwbw~{`o9ST;`FJMYk(w;JwS{e0v zVWDu3sa%Yoi*h$AZMceS>Tg_!o9)rd6jrXV%Pfpd(vkZd+^O*K2fMrXFACQmu=>N` z(6*MBuPU1noL<`b=c1zau0hMXsnP=;UG^T^L5m;d4TUow(`}z;v`HhER4h}{ssnOd z!K1|0E$@5keR;?QIgjW8`PT(uUtd zNLhDFo3`HvEz(no1q~HnAN8!>>HIZL3vb?D+z@Zx&cj%Lz>8NzvQyf+X7TXp?23_z zU`0d4=-f*Lz?o$IGs$dKf2-zX_Q7>Bp5m6KVB^5rO3jdfp z213#ycfWjC6aINdSaOCv9{DP7dO(&@kY-dzLK+YM(-p@A_pDx8j3%DlZ)u%an+rT z@o;@Id*1q9y&DPz2x(bAUoRoryOc7)HZNrY{qo`sL}smJeGQ@=(P zUNnAw_uRn~Gedqns%_L0;fA$;ZhpHsTXI5od*x@BZKm$uZzv^7Ls@n9q~eKT$&Y!l zCtdkS<3rT{`%(RK@;w#4l^XGQI(!d3*l+>ER&fBkN{g}>^#sTN_ef+$?-4u`e%k&) z$-H+0{@ULznfLZ){`zm1Z=ZSZ9L?XnxB2%`cJu?`r)xf#_s$gl=Dp3o=dz=(NQ9$# zk9cwog>5g<)4IQ)>wlZu2!5}}fqA2fo$$&y_w_bZOt7+{;wTLd)F%uuVNEu_wmCWC zkI8Tw3Vy$EGn8c}|Dh;7;=^S7yM2=N&xQkTjb8128&MRl?p12tSy_ zK~15mg7MG;lPivz(ef-D)+}P~RlGTvu~Z7W5rm^}nh_411xoZhajEFpZ+1;?f4h&P zO81~b%N^Cit}n-QUhqKo4Aelv+A6{3Hk3UY<5BX6zdNFm8s_blhzpHZ8 z6T!;Qv!|CezrM9{O*(U5IT7ca5k4`aqXg@O=T8Pnq9lpqbR5g20@>3`nqS|RsO-!q z8dimV%^trr@o8rj8@#gv7pYHL(apcy4|t{5^zl*R$=A8I`YF6kV^;F2Z|<3D=S(@p z*Kk9M<3nOt+ijcJG@GjOca0hOO|BSClb-+V+%eU`im4UHJS2TK>XT74<<&p=^oyS) zK4on82$)JvV4&KO2<~~cdsS8Oi&d4+U-n8@AKq4ihRWi`y;GU0itGi zxYZ|QN+IU%$#AlperVv$Gr|FrJgNkTT1ZxYHk%tzRiC-#RZ^)Y5t5h~5j9kys~Smj zdp2=BJL>1ZJQqrtttIO}Xn=~8nrXXs|c(plrV8Hq9uf@7b zCS(TuvMPLO#3Rk0@88fEJP|(G{%*;<*R7GiRx+h^YE*2rJ8Mn2&B@X0mr z&U@V&`D<$ARoRl064_IWQyC7sjOq@*px=9=s{f<3qBFZYoS5*%5$z@{Yu~7Rb@nS> z1cq)2Yh`Vz%EyBns?|`Mw(rl|nj%|$`mqm|^Eslu2I>d%YE)ub_q7Nd;`ZU%*Tc?W zb-1ei&uAp0dSl5jBYLwu`pubzY*)|n;G)E?v7;ls>-#O zzu48cifKhCpe5Vgo%})DNG_hKupk}K8YBhBZeWP%nv;JwhuMRT$O0v&ivu=D5lzL z?sY=wn1cCPTfz>c%iE=JgI_Sn9?=S>uS?UM0Gw9m<~S@HmT>_cfm#lDbwTSSuW4dHfz8eIo^vL z7X5IG-jV2LS{L#AX~LCfw{Di)hnnuwa5Vpm8&74D%LsXOZrWdnaY&+hTRgapu|;EN zb#_MaZ~F{yPpo~jqk6S!t?T3@L)+k<>eVo7aJqi8W<=oxQ|Kkt7z3Lc=J zvwBopqPe?_u{F2(B!cA|nm^ju{OAFYlnAOefGT$`cv{+=9gW|BKbe}qThqkhrx+YHMMX5Jz`R{_Vq-zs-$o8#%;h|1go;M`}9pTzq8F>@g3Z27;X*b zwC|)kR;g*sXukHSqPbtye4p!hk?t#ZOJ+_U9=4@}m7^2L(svVQ?lg?%b!gcKs)7~Q zjtN#=ajd2TrGFO5S8_=5u*`<$2P{uH~{N3AMPUs~8D=y*(GB zU#dGQk)2YUsQgoqUYn}_OZSt|iV90sZkTgYGILc~@WAm`B)T7$R@?f6Oe2BNiYq^?3eu|*-K(pz7a$jpBr89hvyT!fLH3N|%92~TX7ln~S6L!_4zUa$XOSyb zQ~wtH8eN{K1B)+~HQL zRM?%Q;znx>vOO8T!N~DG4Rd|uh(X{LB>No9MF?m*JKDy#))rC7jrhKlyVOKQeZl=F zj-LPjG57BAQC8Q&e*vKO8cHx>^Um5RTC1Da1R$D0!kE=iSfckAzUQyckSny$t2dE z_x+qde!qM^dFI*s*_XA~UVH7e*Is+=<_0(HQ7^_+8J@Iy$L$cU^pDVp%5JPp#Az4_ zQd~SZ&?Xnxg>IPFS^F%bJUZ(4A%XI|zzyN9+T39b-cs20b;n=*&taS%B4ojfYKe33 znN_+BxS_u*eiO<9t{UfJ$#|ZoCXGQPcI;6`T|ZcvYI;_hJambQ@}icbm2VBj$VOJ) z4B3I2m%NMWJCx-Pu#J_(a20WJ}}3xP3}QTxHTX6|bbB9|b~&fdWN>e-L0@=j4MhwVHgVNruSvzKWZeQWK$URj)t zYwo>~pZJ!)48sF1&EVCw2!@$+rwr}yh6b;(g@H<6Pby~pDoYi!n?>0rYuRzlNNH7g zaHe(av0Wcl*WpuLraeCSQxCXeh zHtw};_Iuu|`}4TwzL8cBg8Ek`5BBq?Ch`-{eY#n04$-fnS&!JVw`DyW6Few*EZPW8fqV!BSR7#prnv@ck- zhbbfwb?xNnO2qz0In84KBWq00VW0B#s~99eB*K@{^@foRUS<{Lhze%9RB&9yHw$TfWhng(jF4@4D8znZTFqCwP? z8)^y@cs3?M4U@+6U&4Pt=Fv$gSSJ-lgIU{88PoCydHD<YPdep49fpHM7j|8rRYUX<>Z~>D{*tV0w#ts&U`)Yq8o+ArShis?9h5aDN?ML^p zOk7EOPwq{D^E)PXM%`q=X|QV4+x(Tk)L`a$WOUrVQU?mIXG7_K4(BElPP-Q^%TEAL zqwo<8+P<)DgXSyGalxhZ-dgi_^jZ_XOMCJ9ED+tbh<^N7%|4>+c|Z0?*e`ggLZbh#%``Q6p~@cw$1Blt^FNBg7=m|($dO* zuYt~>)*Xnl`&&}vi@KwcEWh!gcl&_1<&$)y8`q10#)WQ}|3bFt#8bySN6mfP&p_a6 zu^lOaLF6^|c?*xT3^q<090P;vn^BnQ3(3!dmeIBk2-ma#0Y9(uMcj0!gkwxS} zm(R1)r>5@o95IfnaHqF$qtDpmH9Wq;ey_pBs+xh1@BIyx__=kr@VM9Wu>pEQ`#MCz zOVc25jXEqE`XiBN&%&IEu?cRUhuemxon~(K8K+ffcOj)tC@@Zvzb?n`c@=QHYU-9G zJm`@DiR|WwZH1?ValERgZKMbl+UPaT^A*Oug&ZIZ=lYC78)gdOe8VP)>lGY$JM0Al z0ZS}@VIORoy%`OX7a{XvKg~1_2t=&)nz;8Sc*0kB(r>(>F|$KW?eY~KBM~Wfd5+M& zU4li2pePql;527DXxa{%T2yE&X!0Ao3Xg+cV+`xLLIEb%u=xt#kc9(^Bo;Qotv=5O zYASlbnfXS#w{RN>6l17)MFMl*Y=m12WaFgntp64@enDvAfM8Ee>-Phppu-P3pdEj{ zA%s!nH!edlRxn(Qo$Z~K*l7ALY(BammnrRpS`q+t>^eoK);a)0or4t75KkatU=H#+ocPb5|%fcXKE<@9%*aUd>~;-He50!(zJkTizL@>74E@ zk6+A$f&5hzY-}h>tKsh51}Hc-DtHRM9?P8A%a8K41ggTj`Ytp&d!?@=z_+jHB-u-- zc(u2&-kxSI&-}(&5_B;+^F`~B163Tvs0wdpiehG8qD8LS717!@LMx-Sf9L0EnZ{ar z5RtXTE4zEVh8G2+Wm&=KRLA6K_9?8~9zbH48nyR_GW?6o1pNB0ryH{KkmeR`mF z3&!pF>aVL!Kf%ffj zF+zLChESC~;vu?1QY+Q;?K{qzj#3#ee1XqeHQZ6VG}+y>%W0xj`$TNldAW}_5K z)Y1~sZ`1^7SwM7uhD4kisF`Y(IfF85q|7q%pCCUMn&YE4TK+0=KOk-gacHv7rHhfE z?MPp4preI`Kvz=`dy-{}3YD_==`on)+1#_C?kKQKb2*9g?BV~yn59t z+Jga8!SO?qLhM;f?C5*Tvd~KAdOdBj_>*0{Dt61+AKuvY*8{7tA#@PCbntCpn81TxUJhON;wh>{&csY*g|MOEjTgV77xfMy0f5v#?g;7u6No(rPZ0^s+G#f5}WQ{fxzXv*b%x zFEo2f^VKpjf6*B(uPJB$aSgMT2;64I#bi9!$$Zikh<*+bJb`HXMD;@U_=isoP;kw8 zo+%VDQ;K*z?g7tnTJAn;fp@G5ZtSmJ3`&ej9U{AsR3jdSn5}S?f z@%EtSNbTF`B+_GbU$DpjdX@BfnFCF9{LkilE_=|wF<;%ht~6isz0^bn^#q$|y(ZZ68Slgc zZ$S9kIyUI2HhdK4fO=T-lUn4hip8t1&me(&PW+7Vtfw8k#a8=^itrPE z;hpO>_L#;iwh6LslTp;=jZIUs#fBcHurpw^v1uu~D#-1TZ^+m%KGGUry(iy}3SLu{ z&vQmK_JVv?_uxfe!t(d@%|Fym>5%xMz#N9 zUO5VPLZKTaWDiw)S{rw#@kBAZvGIUds}$QG(U8UG+(=69wV`_x~8DWeV#0 zwM>Ya4_s(W$FUQ@1|S(y^PrCwF_# zYnSbdp-RNK`&T9%Mkf^yO2mnE3IvJ&IW3-=D`Qs2)4}}eK-J9%FqXu2Z?_1z2%b%P zA1IbNzK5=j-n9~F{0OJr=B5D?vacJ-4$R$14lgPe9VpU)Np_Jbi&$ugk!6QpE?^fH zY}7;A^XTfkS0XH|L8?XqWV;hOUBP6N?L;Ur_`ivFhY{Wd+i}=58#BV25$YHpHD6XQ z)H%`vEr&-0GUOP?iTH01%XpBX)7p53CH&*mxd`#H;UVwKGIXNh%}jRQlbDoXbrYS3 zNfOs>#Ku0%{AYCg#vDO%#>=qif^FL=Ju8D8JI@3j9?)VyL8309v-ovZWu=Dir8K0w z+6#Iwp}x`%g7U{~7xtX3{XLh5+2j&Z8io=&I`3(bmXV`)2MJITvcej*^c2iTa8;b4 zmWr`zIEtT*u=8Z2 zHrobIXT56`_Bz}9`|=;&n6^k({;ps3UG3S^kX_i-mp#zDz5ir)pZ#Q)t>4z=HSE6v z3LgNCaXlt)x%y3ui&%IeFRG=J!M)z}GOafQDf9gB`EER_V6Cs2T_if2sGSGTtzoIOQ|8s%MV~e!*v8x7TypXY4lWyVSIko;Mo4ig|39i6eGn+H0ob z%l=B3sWm!tSD=bBVHNhZqOx8ad&uTFS^uE7<=o}o#;rCn2B{i2xzlz$6mzWwdNI%& z^-?!e)$UgSFU@3tKF`*=5k3P&%QmmA)oVLLZ7AI+vy_q_@fDuq#c6*eIKUL#THDIK zbttM@g}Ma-NN-hNw%^#__xa=(5EBJ45G5-*zi}{#l1Tdx>B|XLvD|qF31eIQSJ)?@ zPaaQREtUB_UG-N6t3JYjJQpAZhQ9=>js&Y@|0Vl5+9{Uy+0W@2{#fn1h(u*Y|AckYUi0+=&`mcs!_ml)PY6_;4 zKK`F1<|aTu+t+&+8P+bOs@^+z6X_kfG%Y@vBygLieGgoQ5|>zQx>PK&Qq8rb9oW>g zZy`$}D@QKh#7-46+T7TL^|}q8j4`1t@kZ+ka^oLZ!SMooZdya7xoXlyzqUixM4^K5 zdWD8jS#Cy*k7K7+8YpX`SBk)diN`z(kNKh4 zy+y%{x`Kd}-bQ-%l|f~9?-=qVYdw!zEp)hIc8!kMghlbbd=n#Dd*MoJn8e~F1q(a3 zTL>0T83buXA=`&mReuEM0-DUSR!d!M__?LEFDL7Lf)cEH9kIH!^!S5Tjc%_nUP%X- zY4Puoj=hQR(mr9sOY9Z$Nq5Cm6NuXKWXuFBW}?LCp1pz?Go!D<##+?t@fEllz6f05 zDlT10R+COT*|dL(^$c@vP3GE%=nbRO)G$?g=l%ojw&=G~N5acpnigf5(sF17d-Wxd z=#+o`9re|GLBB6=ZlEdWc+?I;Z0U$jhi!M z;m}#KUXzlwkaQMJ9^ya<9kb*pcx`OfVvL3W+1;xB>^3c3#_T0fpf^@& zFOm)XFS1!}714wiNQ(F~MPLe&(RlDIyWzEOCQJCME}<=EUlglsy^_ypBOdswSd1ik zZ3-!@(#}CCvC3Stl+CsKlcm&{rTAhsrJ3HwcXS~>s}M~UBXl7a9h}-KC0c>^tbp$Q z0|dMSn`=8zm}mh+B(=u2tYHi=)piJV&Tb|tlo4_=!4!!n<+FX3%fEwvM5OwzfHBgv z=`r@0WV();gomOGv24UwON`M9UxW3d!8U4}<(mfo$7X7^_-*hg9N#3?dZHN@d*MAjMuGd&!CZ;OncFqwScx2@Ijou=jqsbcX}Ld)EJ z=GmlT!c#n*Dt0lyqL-n~fvS>RR5NO6CB%!2rJGNWr^SClv1T#Cq?emWKuIy4RWvi> znmYDk=XT=eJbpXAmzgucw>PWtA+)I0*#o^InMyHCnTU3iMPC+(PUKvXJvVy2r$a4U zK}Et0!4`mEMcZ1}j+c1Rg^b7i@%+Jp9gUu}hVKY-vu3mtn>B@+ebP%nLl6x*U_N@8 zHz~J4A3HJUztjZ6WMm;YDX-x|vv$ysCY3+K#*JyWk*Z}GB7MP6KEf`;)C(n-0pFGK zp{&o-A?8YK7BOO_#u|<&O;Dv)BABDK8XPAvEY4zgr7?uw7PjzBQ43-z&LS>B02>;Q zUT)i^A*WoZ1@n}q4q?i5v;2#@d{YZ1DHFJd`Wm*?gFFK^?P46p5D zsRS8Ca(#%8FH{C4p!_t_qR@l#fGZZ5tin7tcqOR!*b5SR2clN#Y z?){{qQ1pA2s+e2*0##mn5QR)Ed%cprXDuHr#4@feXdGf8W0^g?MI?ggA#KaQ8~cak zdVe+ReejHsx(2I*l~lY!E$ft$V)knTYgrx0-@?EcF~(bhc-#2R^t#Ul^yaV(3cI_A{^SgB?S`{gXSkKUL*ULQhOje0SyuxI8BheNps*rQ@o5NR?sWe z(rJM1kIv3zE4$%qz?na8hbA2LLf%c@#tFaVoL${bw%U=rznoTsF;ej_`G1)OQ_!=c z_BC(xBC-CS3s;=mY_cI%Y%CsEv3^?P)r)IXnke+c2(ZB{ZGJCC3FoO7ik(5v$=WZ8 z#oL6Rrm3GaV{Cwt=Tgq*1G~Lziec~c4z$QgeNoFD!9=RA4U{-o9{3)Rt%wq~BJ7}G zRUl(J^2`B2P{?Qr8$I#6oWgE8f>krqP;1sZC`G`OM)%I6&4K}Gw;6f&D%uY@)3I_z zbQlQ2-~zcN(DK1ILzoM1KZo{>qa8t^?rKbWd=H)rM)S}>@&+rkb9g}H>L?G_67JTX zf4;i9Ykm%!`y2btlh-d`kFZfB?j?O3$>oQz97AW@ugoj028&BU9*DG+VP7f zdC4p!$<3wntyt^Na#d9$4H2Y5%AHa&-v#CCdeuZNCehJybpBugeRYxCUNJ-BW zcgL>Nj*PpjY}WNR_AH4UuQ_qP8n4fcuo%xf&K za$H}++_T8a;*HPho;3s zzrd@8?-ysq8g_E5^5@yg{pD3Z(d(gf`f75Pa&K3&InG~!TPlZm6BG|B`1DfF=^qiu z;C~9Scxh42l77-m)=fbQ@Lo`TpaIc~xLW=J!#6LpCDq{vMK zoi`nkI(V3MkS(Phg4Ww4>ShvHb!1B&xirhrdc~hK((5P9% z+0+^^#;UkYVlGLRZ^2f`5s&$ka;V zorjHZTjQzA)#86a2!k=Mj)vR3J3m|_veeEVKl>}&KR{pIG@$hgYHB~7zhr8xfLq+n z3*(u*7*R4I7MBE!o#N~U{Yc1Y=15*g*ysz#LQQGYV&%{EFe@;V^$0HHUQ7oLkMJ%x z6c^$XUgLs~;Nn{ZaYjcDKUe`7ykQ2Jg73-Vm#Si(*f3ShC5?%3iji9AZ%05VXZkS8 zxh+9Ce3fd1a;Eo79^X%r6@`8>v?hV0;&vkWsgz_^U7CU>3Izq|cgOT$6m%OTV>U@s z(6#RE<7J3dI#Zg@T^`u<^QTx`-IaWuWB- zECibVgKcnGe;9o%FjiyY?5KKxM`;$1DY^KmaPu-_ycZil>e7sB&I7#Vi0`JHLqLxG zn6s*meBTvYy~=l$drP$%y+yfSSM9GKR_;^c^6Bfp!O~TLJ*V8-)!mIxSrOvb@Ek=v zR3x9b$pgoRIEqrvImO3S&K6u=PyvODBR8gBN9H8Ss+ps6hMTm#1Q>bFJI4Y=M7cM^ z$Tq<20b{#r-+*DK8>qA&3|&5crSv>Lqd=#PY*5ZA5rCY7;jg=!%=?tPm8v%>Hsz#SsIW=-i8frqLEOkR{c$Z3UOjc&)6wRjr&e#w)itEUeh3++FgUK*i@Z zu=41j#BM=89+M8lKM?+c`tBWmy^ZbpfyTZ?e$Pj0`3~rYJGoa(i`k#yGC-MJP_iz; zR2)QRjzew;aVSq@$f^m>KvktvjG-N&mxKr$l`q*rn1hL4e#(Dg7oq^pV{{t7V4Oq~ zE|jP5LOzN+9Z)a!r}T3KY--O&LOSBV8L9;EZXT6l#az*;yDzeydzxWG$~j4RI^GVQ z--e+e6hziZBpgP_$vF#ytx6{fQ=e0hQ-Mlg{Dlc)lL=!JU`Uq>eGkG|bD<1*N8N?U zC=^=JuH51z2(!va55G7P5#M#(%JP{&wh1WAe%dqPw_!p__~5f9eCUJAnA_JmP`YwF zOFi-jMlc9pDZ(>rBt*lRB6s{cFA%F)eRkXc^3nrK5vF66a^04r6i^&f7^;r)AA&wD zR8;B!q_JkqqjTk>(OmkVQ1?cER| z1Gn-Z427S2^Oc**sG7!#qhg~`Da4W~XSz@SLN%EW%Vx(J% z$6V(E8t7aI?VN;FomA}uhw+_79=CGi<5K)4n`Jnt1Rg2(W;z$Tj^PA$JmmmIpK5=1 zv1;D}AUkE`GrCn}Cw>e`18qmT$)M9V6VRkK0WL5*H-3T4{Vcykfi_nR8T7$B+98*# zI&kXZ-bIcsfDq!rv!FQaVq{NZ7(fsa46!R)l^Z!WA_MCda>?C8&e@W3woAS+R;XSs zuf+!sZKT1K@J$FSg2}l!B4W;>u`+_BrpO1%-O0~3BBy2ZwV#)T)W^Vztml0aC28N6 z_qv8}Xz0@;j0vsh)BZ@bnSB0GT^}y$_L%DC1Aj&9VT{B@j(Th!S{Kn5<${EGJ0F55 z2$K=dn-TfRh~E++s{KiBiP9SvPY@+8BqoiOD6L6qAc}~qP*aP>=>~7Uik+nbj&&{^ z8?QKz(TVy|hguG2!~CO_M|M|5;i1Q=y9lGtSGFW=iEoF*7~ElN~k$}>Nh?2dy)`uUW=cD7tjjK?7Crc ze*L$!2E^9uU1HCca;^?~+UhPsJzanUlu1|jWmAkJWQ*hR#EyW$F`%Nf}OAC-ja zlNX^ZHrumm-_hwmKwpOj?#mQsw6G<6%62itG|GRG;Ke*)b*Q=MpWSxL z&_Sk!SoZdlUFWgx8|u1aX2bAx{lo9ABD3Gv6f`yl#m43N`+$aS*qt-j4PxOittb$^ zkN>ji>V4j`6kxN&zJBuYTxQ@^w16A z6>9lhNPByKFdED!jR%AE7VnkbT(xXH#yn4+6rU*mr}dGD{~`jUtwGBjFtoRFM%2@> zP!?zBx-l|CdpBW4TFt0nw0H-*!H~UCd|LER98f!ic7c;Ai|?Zhv1O=Q7nJjHc1x`& z2d7Yu@An#ADATTx19bIk@U&FbB3nlZs<5231P#|FIT(Zwhd%G)-m4d**U1&ws<3h} z^qnO>vGI*gua2(y&Zo;O*YH#gQlO~b;SYS|4)S9)~p>@oaH zIl|6~r^TY8UsS&cb}*99z8l1rV(tnR`viW4-VOU(?UbakeicdngT!bZV7w4^te0DmngTUk5?jv_*#Ly)BUOz;xNA z4ja3sWE8*Kcmt-PmaRDuuZ{;cpcQtc#*}qHEm&>{jA7#~{CGS-kE6V64jZS`;t%O< zw!*`nxN52rQqZuoE@2tsU!!7fVZt|PB&wxfB0+DCX3H~yQoCUB**b&K^8+i}vDjQx zzXm6wwJYlK^g%EVFKARhUN-hbfpdw^$?43E3y+44&1}!F@}g-2j72!z6~n+fPq3;@ zucZAj#V=urys4jC0U@4ET$6vdGCja+=5=A86gL3TZnnQ^y+~Y z^>UXG7bhW>{yTBKi$q+fq+tUr8q6((+-~Em9%5)zA(mCKnvnyTVVoQ&#Fz)0^r3_= z*Cp;^Xn0TJ*?7z&C zNsD4XU~uRgeFIepuwq40#n{kS1v8kiE73Xu2O$e@Mhb*e_^iGr^! z@qG;f+Pd%&z98*_|9FTd5Z3QoT7w<5VSnDl%%d{haAG=rg;vzxJSz zfm+5QkD*<^Dr_86vELI2S8>kb?$u%S><3H&+>AOM5WIh<9`@#g=yLsHYvU_ot~N(> zi0FSdj6()nBk%f**YNQp)aiqHhK!x@O3sT*BZ9_WS;uLc`VdDWeK*WoQ=cD+8dsiq0AJjmOjW!Uk1Pm%xdY67y;6|GSdvKQ!jU74%CU(VW|v_Ks56yhdFm> z2U4HbE^k|qmS%Yz9R0J)G9e$%1Jv9Y9reEmaFq35#4AP2chP_^=DTj-UbDc$Kx|?L&f(5V8I2to9H>tz z#$^>FzsX_-E=|C7U3AoG0>E{ZdiG?pq>jQpjqMq1Y~x-fR(!n)(FPI8Ty?W`gb$*D>L+K zGxUsv*18Bt5oBFWL`UXdc~ZO-$;w9J(`Xx^-XXEW&=%Q8x9FIy$o*h zKm1+*YZ$Mw+c<8#bR@2+uHb^C#Dc}xvSk^JoROjEcO&AA;l2Bg31vQTCL=8r`||hY z$J0}Tt)g{R4mVQ%vtZ`gfqDc-+3;Zr=X(6^Yx*+vKY9E3+m?Yp!%i zuU#LCJ)hPqvajAR(w`(Pl?@A8k|2bdcyXY{>{IAR zAyw#i1UvjiK$(VXS@~#i9<8cLqu21Gb=eV!{et5QpzeTd-f^cgf%v_D65u}!UfH2}T0B;OPtI|fmtB%cKV5Y>KOEa=dcR?e^l6@)Yin$YFl0WtI1|;^`c))4 z%_|>*9J~f5e)}I*<35Pb?>3vV6<7lunZKeq z`D?uKY2KU`vO}@2?~P`pAqD|xFp8an9&>CDx@mA1PH%A8u=aa=jQ?;H?MkMATI9>W z@}&<8ibO^*@^dl?EnOj*{ABtYCKGABKji`G-9>G37$QmPcUj4OQc_hQnlbq4ChOBQ zDd|i$B?$%g1pxZX6f+2n1@0IN+*>96Cejb4u)zI}e0fev5||P=5Vt9J>ybL^b0%~$ zhkTti+rw=#;!~`C7|nk8I8QU=AFLx=X6ObPff8mvVl*FAG#GWoy3Y^Hk;5WCo&N=sUtPZeU7rEjzXT zB-*0)yJ0BfP?&~{x7IF|R_zl8A=u;4pMfb*M!*R0Hi!Q&q-Hg66Z6*EWs+qTSplc&vwC+aI5wV-s>HD;RxDK47HGnqort z%d(vufB0U>k@$e*BOhR^@$d3M6b+vJwe4cea^lm7(z8S;RyIAvF|JV6#>p|?*6HGm z7GDw#GlF=}B_>Nd;|#*CV@ssQDMoe{&VlhEWOM~G)AI4r2T)8COVauo!W_g68QJ*d zo=X4Ox62AMGc6YwS!Z(SN;fv}aED+$V0ms$59Q(q>!3dV<<2FUZR=b7^%B4ppU@BRuP|=I0Hsgv)I$e zn!5PGXiqI(Oyvl0RtJFc9q}mQER1f7j1((AT9VE9lf0}QIJgs&+SnoVauO>(hxD8a zvSB``lURAM176!ohQj?d!H%ZClL3@Trw3xsODHav6ll{2D$6pOHWSzP)lk)+(4STfI<<%6u=JxHCsenh=SVkGh!nW3++-vQ0Qf2^@=t;s&RBf*Y1q!%$Pg ziB*mf8v3)h5EYy*9@P92q%l<&(*TY_*Sc7YNKcVpN;0xge~pOhhNIZID^q&ZRP0n_^8AFzM^cT`nuMO7)I=`vwd#a0Ewj-Qi_Sxb$=zgoe?H^YC>~9CD%y^ zvPFCiRXwjM=;3oRY!}{X0R{$Sbb(`QL>`q9IrnAF+NK~BEz(7bG$&4ae)OAU(>W1f zw&uJ+P@)u1eCm+UZ|pEEb= z2_`l(9_WCkgtcrlw&GWI;0Xuh0}H;C1EpEf=?>I8ac?v$*w_r4KOks&RJcEj5A8Z_ z#R@&QtUv9r@o&g-tL@!%pgA75q3x~uT($me1%4^oqf|LbjHHHzmn`d@709vLusW>nZ(0 zo3ob-@XH38|9=tX=~9hH0nBKz+V+nj2ItExuqDSU|4%uFG&H58|F7bE$1vtJy?hAI z+0Xw5{$Jq#H~h<0MD_gtEB|Ntf0@Mp&i^w0=kxz<{>%8kntxgEuRrT>uCH@Ew@A9T z&Y?{PiF;B80Kd-&q4E0%Av1oT6C&ex?IM1K!qnmy$tfiCZE_@NUXwf959t(Xzo@P1 z#*&Rk+e&XN*{z=kj!Dcx{e17E^>u|uB>b_wosze6{cYZYSsU8Cd9!x3d0n#(tgmyQ zYV#J)+9Y2)_?kVdnYbfu-m$Zq`QYl}F}k^}s{Z0Gn><@=>sLjZ*RP3eSl?f0&*2fu zVYitvitT)p;Gp+e3vAKreH!eu0`|dr4R(D=J7CwBYy;r>lAZdw|08*STR%VOU;keM zt%jvw))pNiZ%6<7e*@0H^Izj?UjLB^AfO3YMRU!{wgPJ#^afq+E&BcJO;+o{+ABpYdjKJBg#a;1~a#+kI!u zlZ(x~yxGYCUy(R7FMM<{xT0j<>~uC?C5|`YM7itWTeZ2HOn!Mi9PoalYupAroe8^i z{Y;*fKeNL^cC7!XV&D4rB0FQQEffejIbFB`$3H*|2JknM)ANsVCQ~O1aQ#$DNzJ|~ zi6Tz>IiyOPJT&0z&$?P-6F(6>LUYY!Tn18iePHFd4Z_p533J#AuHoN!Rp=WdU-JgP zGU~SuNfIyIxc<~V{NJ}BZT->e(Yqf^PqS^{ZPb3=+78~GyMc;p$GVnFWh1C#UEc)~ zkp~~DShxOcq?ORs_GO=jH#YH962z=Q5KXpgl7j_e)*y(>Wm+*=Tq4PE5WmFSD*#SO z0%&w<5FZ;3;-f=Ad^8CnrUEwpjYaeszfYvm^ZaU7!LMc&{AyNVbm57{EDR-?~qQ8NGA{J>4^07(C&^%cRPpld1O9)?v#f~2DC3S zpN@CR!;GSlk@@t#Qyyj%Ese~F1f23PqiAkqK6K!eN0JyK^C1SOJj^JN8JS-!Q9R5j zT_a@SoS#Y?k@?VuQyyk2U1Nzv@i3!wjZlemK93}+MCL;(PI;J7x<=^5IiH6arE8on zQ9R5j-Ntf>;$cSV8X+I&d>&?$uCY?0h7eLwf{k{2!fljI4Rvm|1zOj+{s2br!}&)Z(* zI;3*=ara^v+SkkrW@fLCQRRnK`2pp=%2AV^ro^w~y4P*h>dyVus%l@g+S59LYffiS ziCBJ?ACRg>Ke3SIo4R_Zdh~iecvU%mhOgeE9u<8z6W&)jfALMR_ST2b4}hMTJv?d; z#d9kGmK){{@tE0z3pMzv(s$g5ZQ}?AIakX?FgtZ-NJJTEsSum2QeK=qB#!>jsY-Jt zE?39VA!a&8jI&hRc9(%$GhLCyiOH{{%#}!2EOEs;j$+Jo5T_W#N;--$%Y!KRg4j9yP*udZ@TR0SX>_9#gdSCl6@HIWO;+d?5ia!UojpuziNY2{Z+2Aw!V_j{3>R~07QntYLf+P`}S{3znIlZZzRC2(jBBf znmOfT5@6j^e5Bk&)>Me|rB?H^39d&?Jf?zpZtqjh^CdJw9i>Mi5vr94_4f2ZBBnH(FWl6+WqQvZ;!pxK9{D;{!bz5k$B0{F0&g7v(@{E{Vv$7CX#O8h?K zkm0~A^J9Kfq~QI07MV#_$$YkCCM_>%A(jc%oJ+O%$y{nqqgrrGN@oj%Lw_XScyTNM zz7$bdxbhMC#*1Tt@MB#jFOCKIgmjs_I2O>Y6}n7b91G|`vrJwb3+OAeOkNxdiU{d4 zd2uW#CZx;c#j#*KAzdafjs+74=`wk7EGQwQ;pD}!z(+_+k-Rt-1PJLed2uWV5z=My z;#e@9kS>!K$AWS~x=dai3nGMcnY=g_R1(r8G zbETtZq@AGDS2Kb)!dZl+#+nhl5zZzob=HjFjj)5T)LJuwH^MH$Qg6)&2%|Zd3(}tI zt+ja2t3&!WDKI7aH$@;$baIMBoapHkkvP%aDKc@Q&l3U@FfGUhBwCm%6w~R_%2c7) zB7sz)xPVl&HB~5f6Gd}Vh2pV9X@QX!ODHZPO4rDXB@`DErEBEH5{jVIoN5S3MTDe=(N#p#71S|=x`>6kh~+s*W5j0bSe}EF zMyx}}@*Jc$VqH4cqB_-dKT=hSj4Ymbv9!Tc3N}IHbn;&zKzv8){GL?teJSxlm(~kU zL*TsD5;)mUpy-)hJm&7=F|V7)-TQge_VB1b6#vmpnrYP^q5z3=$XAD?b4U)yOk6G< z(SoVi>l2XyijhJcQ-Hua$f-ECMxYIXXpt{KRKfkikxl}oK&B-@{e^~d)J(oG!z&(g z9KlhVOSCRCj~5Opm^t$aB+D!ykSxEubNMSReu7W0xUbv%J& zsS^k!OD!RgEY(L~uv8J4ozp1LA&11wQbW8XOPx+2S!y|fWT_DX$xMXMW7DsXTg;w_&8pbnRb5anA7HWmcW;(w zZI@8-E}`OXp<*c3Ik$($yhHKUsk**-hp1HI9P-s6=^W$$QZn<@1vzw~4qbsmSLV7qmSR)NPJ%psILH%HK`u#vY?hk}vViEE z4NK9iz%eBxFbq<~bO{atxm;qBAV(ymL9YBX$eJO{4h$_j3G(#eAPb*KVmXok*(^5| zWC77RJCw?2+*qp%pHYj&CN9BibW1oN3bWxAD%XryxD7#wS~FZ>Hv|WHktX!E3PONQTe+!`2;m0h@L?j#3t-2R#T>FO&5n6$yn_KVE(P^q zz>G`5J{U;mH9Mf3MS%u@juZM!=>pk%GrK@`-}sUQAWMgbVZe+V0)V+(9NGo0WZnb- zLMUJWLKy~t?Dd%d$j)6V085gEq+q~|8v?)zGj1pbl6eyV2w?(%mOhaQR8u;`!?HDLbZw8D6aGYyFYDx9O@VY>HxgOStdOsU*H8!QD^D^O>>GKQwQJ>&N7*zWK_YD3CYYd zi86IXW%-GauBspr(sj8LAzj(nL`c_GlnCkSg!St(b$!eu5=vA!f!&)Dc5kv|$$AmY z=)^koXy-K9ReTeWz5y_32(&_=;u>D=p_LV1<)xYyR$R`@w`pAk!hv%ZEvrzxOw9$I z6(f6BTNoU#%hQeSV2pvmR4hgWi$hQu5mXMrXGHKh1gQ~0>JZFE1hYfX8xiyl#c@P% zJQUFpL9}xSwj*U=+bItdb)Y;_2FjiCFr&bGqzt?}adN!Dx|kOHmLTk&C0!pW9nnr=GdYN|8xX2 zC>L+PaESh1xelltt|4}BRfWGxBSy7vmK~8ps{PF|%00?HhrN*UZdKmHg=OrByeT^( z2L)^=+aib97THDpT$)hcrPgiNi-jj;+EUX|5dasBWyii`(K)4l+_LC2J1Dmi#WjVZsM$M6b?}c_hcIdauBM4xhMBgh!WZ=m2tv@WDF21U8xW+4~f*Xi%u!z zTPh-egJF_LSt5}oI#SQ>I;Bq{eL7NvW?gsbtrB^wj?_}QPI z%I{#)L$*__k}}96Vw6MnQ;5?AnawaaRPtp*WmE4w&E|7DI0&+ubUAIjJS`@ch5Ej4 zeqSo0GJbzoB0XOC{B$#@5Bl=;J{>!Ekt&?GqUN5@#6AW5sRwe3Pw`4u&Rao8EK+Wr zo&GROb6bVGbzMYTb-OKC+`5P%eYicY7UyZ|*s5IH{5T`=)c!EsyzjJi@SD=k8$>MYW%h z*HhwQCUTZ#nTm8M$3qU5BzU2yDgxFnL>a2<|}+ryS=oz}F^p z1D0O>55x58Pl{fhbWh-bz?2{UjTbGe&-1Hiw{d&`_uU6V##Z5}{!WI%%*{OJ!abbx z;6cv2yLr^^=TYCoBYY_SU*FJ0h7VD$#5v@vL((}UhePr@CK$Y_1RrP4e=R*di__PO}(Z5?jRMi4%re%8QeSl&6>F8bFzJOPO?AOCWMh z;Lpjh)TByM_Wji077#mq?8WeK^5CPG7ewwCMDief5BQTU9tcgd;%ac0ve8!YZSWSE zBgo@H`dQ#CGD8r@gY85;`wG&a7cR}xxAP>WT7A$%)`i=&vI{S!XUugWw6;}fjl(w3 zTKxMHtaag^nNq~o7K+g;S^IM8jIc0-OK9*z%cVV?gf$&h_?An1=p#{y0$ymjv`2r} zlZbD*v`2r};D?q=d-Qibb@-M`d-Qir0ioq|Ki`qpv$-;_jb(2OhZ#?aJg%C=S0{MS z7jOATR8u*@;ZnQ}P_(F#vU|k|I+?eBeC!;B+%eo11%9RcoC*dqe_&;~@L0nQ<h3-S_!8%kua24B3B{*OzC^(L zWU!}d`=R-y=3YLxB|e)fZ$3|x(ct8%2ZB|AkbQ07;;XNUJ{;a!XYUJ%aBp!oFD4jE_Gb^#q}mO&q;lp!O}IgKuD z%}0R-#j2)5nxnO6)XWkUnyD&+OKL=gT50wmkl7uQohPe%Ng@q3lO&-Gb!c?)19^Kr z?YLzas+1>-EjeIo?qsk|B#L#R_Du&v#a)&a5E~7LpjCgG%8Nr>I+>w_UoI>QYhTu* zPE_y-vdorI*9mcCKWYxMzP@^@nmJfigsPmW)kUN_=a4!hQm1oB#gVB%;GCLT`~Q{! zary9?BiWCVFj4(GgS3zKPSf@67zQm{2h8EBEB8#+#NgIrb~8q= z+?~=4;JQuOjlx7}6P}c6aUbR!!5ZBz_qZW>hdl>sH;Wf=+a52sBE8U8jYFE-66Lq0 zlt0ldpHfF~-}qo1nm@Uuj*WwL2-E&lJ#B;a{P|Oy86RA#y)$jFpRWh`qm}z25#kDS zEQTpv*C)uU9FDvs-un7V$cf)Hoima%G;{p_9`hO$nwy+7s_|Wjq`0hr55fnbDCAoI+e3CNug@7+&d2Nw^-fOevlPlpK|pn z_i@#Je5P`rQSE2`D8BJVZ&L0122@24QcxVz0aek@TW5k=?xC&o^HpI(kt&>80`*KE zG=i>uMk7_G{6xdEACu*cP-6x6L{p42M}2-OR}wapP3)NW^~x;|fHwahfmYF@AS4ao zCJj%7`r9`F=otYGGYU1DH{AJ6EfTOv)2|{8B_{1n*R+>_m=uM484B^^(oNS5gVvFQ z^`1j7H{Vnd{Devco0Rh_LqXqac9cnutV;Cg6MAG7ru)lUJQ=chvii$fH$5o|XZj0- zvjpy>%cQ?#sH(+{CO)Qu4{Gi`%q;R#h4;`i z^R0H4C3@yo$o(%gQ7!JIXf926*hiuxAIYth70tr4oc0mw^W`HL9@>=VK=0Eg2=kPC zq)rnVq1?AHj$YFP+I!?h+l8bC)i=qLjn_kg9Tx2nQf_XQe1 zSR~At4vXobl$j!H+Zjq)cR^vD6xN~&FQ5QxEafwn_V&K2;Z=*pZN(tWCM>OJpOss{ zFuSpR<4ivE0IS)R@A74XIgsA{BVT9~3Y7UJMEBCc)2+7BK-8ZC%r&>KM zO==j{B-Qk*ou!uko{nad6E_r{ z{FI1KKz+~oL~hWav79>R$oe8aEz)mG0!B>KeldGchgWd7{d%3QswITqJRkni#9>%? zWoaz?+7MSz#Iom`F;A0JG_D-)#jl-Cw2H4UgsNIfV|l?))y|2rypMH)DlUnsUF|D8 z9;!MXw(aBCElQo4YkaXE;?eC89<91K`F4SvKg<3pUMVz0I+FDLEY^nAc z*Wige&?3I|!kyJd-ZV3qUp^!qcy0wpTh)-HO*vEpS zM%x%DX&NI@cs^T97Y;O#3mFq?>IL|MQ6=S9b0iCEe zTno%d2azvWF%x4hO;Wfj0@bs{F%VcSjk(B@5|i(@aWn7k!6ecf*|V#Sk(_QzIiX&? z;t0qu<^OB^U(SCv|L?Pu+r|Ii_~$C50lWnatmglh{4eLfo`3OKFvM4?*Lal++QU_y zp{ng_u`mmWoc7_3WbSHSOU&0bvApxd%_&2NF<`!RdZBmFEb65y8YIN;?+V+Rxe{>^ zda}Q#Ez(SeWfqGupBnqx@rle`%LsNunycYIE(vrISVJIN0-b)(!MYLNzsUuVlIJ*g z1}`KmWkIf&`#taQ`DOiCjos__oa5`u`fHg{JljX^Of$0@yMeoH7iQ|L^nNo#VUo}D zW?kl5$?fx;T9~<3GV+aKl06B(dtD)0$G}F_Bu9_&5S3ALgDB6!wjDYlFq&;qV_Q6( zb=-?cIX6mM7iO-}AaL2LZL6%mxCCu`N{6i&f^(Us2dIKevaf;*1B2n!0)Y9YqNHvo&)A11rc4g5~UA%G32z z;q4N90oX4Sc`9cw*soS|HnH!up*pAG8luFruWHMQMgzRTFpUKnhN7gd)T_Itf@ z=+xE$&3irD>wY25`efX5Aqem>vI^H#D;e_{3&t|u@eB(I z;Bw|8VQvC!`7qzxaxe?LG;?!MTdU0fbFQ0*BbI&HVv^8gv=o0IFq?Dvf z$Q)=LjPDvr+&yo|<1nRCM76qYGyi9*)m^8m)xF#Jw6Bv#--c@SgFOy;JB=6aGwl8l z(UXe=a#r`!58ldEb2cKup5ZQ<&tO#k|feor@2h6DCL_4zeVu&JY zi&ogtGYOUA;{V+;%^*fSdX4@aodar(W+>u#KwZ&obmMh4UClmpTwT#4OoRV7Y0b;_ zOVsT5iHsA`tK96&R$@CX#?lpi=q^5h;+NucO`=#%okuSeLAzdh9)W_!U=q={&r8-QLCdFJ|;1;tlKm#uq(@`(F zE-Z~zejy_iy_lE@mxMEN>0W2ZxL8on*t=~zFSm6GdUx@t?nsb(J=*EjE&i09X@nHV}K0`|w0)wWk_^tT9|ebGvs z+1SZ#m-ck1L&Q?9axBOo>m`s)_ec|&axp>0+w}24`gNZK-bcngqbg6U_G4)@fFGQF zT^x=&!nVEe6{@5papOag$BC-i}2wbn7*-D;Jw?FBGs7 z;gp;RqFg3%TMO^E$@u7NW4+36B`(Ultfp@@F|l462qw6}{B1B%n@-E)R?D$YykaMf zkTz|x#$2Xut%VX9Jlf9YRc_J-FLr8x)P)Wq zL#UmM>m&nvuRB4?K5l}LeaQALY5YfI4eEMN<*=v9MI)QS8Tj~e>Ydf=lye%3#*TbF z6n0{ZWDbQ6JrsP=n-XIIipzYx)Eo>Cj@7@J=UtgP7+|3n(qq9U;PNJ(59WQaWx6wa zVuqOlF3G6d2^HM4S3s9SgA7JpN~W16ll%vv#r*+>r@HMltPpm1?;bMk(<78iU=pkl zkMF__O&(1(Bf%A4-*l)s8_;;e9I4$taikCs>!d9ZkFZFKKW=A7liF2e9aSkOrt21$ z6!Fa@jYlC3U)0G2Gsq@ey(VRRlMC2jo1;H;lg8L-@yUHgt9m8x<^&f=@X2QNihbh$ z4WA4}ohHdL@T6T9pZw*Vlogt+&yIOpxX^p?a?^Dthuq0;P~VP7|4T2A z_D<5jmu}z-&GI2$#wycb6t5KD%u7aDH1Fn6bWAuSpQs5p(;0YoA0s^`6H^L<2;p`e zcEgv-w#I|!6713!yPr`Z9P5e$Wfb}YZknPUmkE~$G~i?EJOKYE{v1e z4d$Rnc4$ne^xVyveCw6B^pTC`r!64T!fuc5R+BA$qS`;EeRGZgIPd}-5s`2-H*7m7 zz+>6b7i@X&a$(r}3b9x2<+p9r{HxE5H*$fRa-&P`#5GC>^Vo*=Qm;taYdf7MJYqJgl(t){iZsLB6gvcuC~PGyJO18CB> zDI5T+=7ur_oAFvcAZRm#L---lx>^5Ib~r?^7-WaZUHL&~cu|5G+G&+$hUZ%^qc7w| znBgVn@0Y)5{$6!O0r9XwlLZRjl93_8{Dl7{&*G<&%&$|1t#CfZG5o>xh;j)7cetKP z;eN_>EQJB;&$^s~rzp1%;(Fa=e=V>-1o3-C2t*Q8Kj_jz;5tTKD^Y!Dz_^W|+pKar zH^jQPfc-Y=&7Wp)c6pbxF3DXR*DS+lI5eE({eY za+F=LAgpeOh=ej-b;0iRJ$>98Q<3-70LzIA*CWhXJE_#^TK*aA?5_!SHcPXz?WfgZ z@yMn7Lg7k~F37xyUnBm57!Bbc+<~@RBCqf+q6x`i2 z4y1|f)pwLf?(H8y>*`w)d>C|=4iv@`aoIr|YA zaC&CmBNzO%pIVGUQnhd6hOajZB*7&JUg%XzRKC9xx@z@vQun+C)tB|0=C%@v{R-KQSu=>vgEvH z<8jphHQ(3mgU+D0`}>jIcD1r3KF5++tR!VEOo9z0xc?{+m3=ZTmUrQlnEhKU4e#lZ zLXd^;LW112(?4#9blxSjfZx$OO7!ojck}68buUJ2$Cg0FyKQQY?h}gbN6c-2jo#OP znC@y|vcK=NMClhDbuO?{CZmZwZl8#bgFT~H@+5TE#B>xQ@RXa?E0s5+H#xzSll=o8 zH9trfYG9RgPdB6KfCNMqz2`$h{NL55=DZG3?3K6=NJVY8eIkMP<$>wxZNPBXVKwIv zsn~pchoRLA^&p*TQ@d-VA89ZM+qK=>xX$kPtW!%brcaF{ti)v%UafZ93fpTM^!nLa zV_i~Yj-+%JG<4qRzknBuabX~4iMWF^obFn4ouwoHAJ$ox;PC6=A|W$LLzdO$T|>Hj zopgD+TDpf}mh5hpyi>VOPDe z@QA!j1Dy@W(T1!9$;A_osrydcN{)BH-92>^?Suy;eAwZ)?W1RjbxEQf68RR1?m9+P zxlTA3cUsNattxh^IVZ(%l1Wuxzoj+(=aloCiLRkr(*1II!Az@L&Y4}J7QZS@MBUO# z%VdF>`H0ycqy80fe^6kehcX>BlQmVccVs5+9^@QCiG#x4o2uQU9aC`UwF z5#CM&eg6^_c|*0IeI019_^jYR@*xo9$i;yd79fGS&ru=U zQ|^M1;aK(vzFpX=+7H=%YIGa1?7Ow^lfZFZbw<$Eih@cl?Wc3O@Wf z2fDq&s6tda>H<>7-I5)Z5WmWkwjIw#xZmOV2a5Ry_(#y(L&5Gt_kG4aA{JEtw7?sm zcf3h$;)EL7VL}=`7gRsj=CxMsLXmjH75qv`4KjK7N?`IE;0C_^M(rrDpm-)P5cB~R zBc9IWk-+>ndOjDJQ=kRXi=f{TdXMKjEcGw&#m8q4QS*o=u)?3gGVbjPp+6EK0CQ;f z#Q)Q2L1tg{{!?Q(uORwQfJOw9>UzYDmp+0S^$0l(5sEp~opDKNH?qtVXr=kg zZThN1|cwFLH$6jJpi66q7hwRjiU@6zvAP47^n?`>f0Eo4+YhY*e~qP;}uK% zRt>P1Xb1~@oU@*Rtk*%SgJ-&r13ilEqeMPekpapr zEF%?p@b_mCW5yl&+G_O^jX8Fl`h%kxVl%p+>VMRW#b)? ze(<1HfoB#~6lEi=3NTarH*olt$M+Z0s6}3)MQD%x4freIFX@zCU9$imRK@2Ajk@Eq z72m5B7-0_Hz+}6QG|MPMcweEdARNLH6Mp5urMTTsXr60mG+Mk&&cov)JTRY3jtk5i z$?veh9OojtL&&X)UR_bYI6wkZUIjjBJH$&U1-=&>l?|GofJ3zbtIr{H&tb52G#Jie zxmgsR_^mtJ)X42!?E<(C1nFM?k@1xg6;)YL%gA2M_r6W?e3uc1(|t}=sxX$zJc!< z_#*AgK=0xUlyJ?&x@JeW`bSU!R1{}vbKH(UYI=_Xfj2?LXZnCjeSxMrlHw~|Po=nw zGDcuEvVin0{1%lJbC?tqB7CUOXpxgx=OTj6z;WUemeg%E{;^;wjSauWnlKaBIYE{J zQzx8EOnc&LXOp+U6cfhO6gbvOQ%D8Pp297}y8^X{fb-~4yDwOlKbMj@KcB!r{Jff= z08rLn7=)kE$M5l{;fB?RE@!dTO{FakUx=BA^zHftE)J)sC~)z2`Z|b@#oG%j&vK0e zp8;4rne;}Dh5_5E@rF(~yrQt?oWRR0Bhk=kt6$Nb=wypu)TxjyCyJoO>ooDav26-h z2dn96rKi>DT~O@XfI|;;UV34Ax#Q?!V#eFu-3ZTcr>RER5;wx|%ky+!j`2PK&3_ep z3VvV=U08!<1P=%|XcNU;xQ^k7P4q4eN1i1LC#i%*J(iZ+IM9={OSr$0$Ic_-p;yS> z&>h53th>|nQkD$dfIEgJM5rgRgj_@6X=ahP8+l>GUZY|!;R}h$op}KXqFnf>Y&{Ys zwIFC1q9iyRU8Ry#^NJBiFi?J>40HL2n3Z(3BwTIH*UaQ1GEgU}&KKGyc}=TCSH30O z8FUubTO`jo6+89slAX5mi$xvEVp<QMDsOrrpGZ7L;YhP97xvZhi}!9j`!KESHKm)W+VrM~)pv3Lj z>fP`QT$p!N9Rb(Ss|$fbL!=51lmzF=yahn%yOh{((6c)1XzUZ&e6O%nLUJmboG1c0 zx4-lim=v*1jQ~}mtYoBt_DG^F3X%h1d?7}?5gJ^uWCcV8-iv2q!@7klb$kziW)t?U zfb!dRD}ZzNPvTy*hjno#hf{ROjHv;9Pz1ztf@ z3}Kjp{OAi;PMb6Tek>?a^ZiXFEQD~En7{YfhVg@;_pky$gR}YrH8wik zE=%3CtNG4|s1bzMA<5sVY&g1*PV5UXTZM329Hp}S4$nutC!ZI2fxjg7#~hot33ej$ z4b#8z{Wz`dDHhR>##0V>#-CgiAQ0;60ZPrM24}$HBxIxuwK&6x* zr884Fy;L0jfO-id(&8r4Q@1~*w;e=u*Bg$g;Z)VEU?fG84v``t<;3^BBa#aFq(FrW zZnO+S&VdwMrv)A0!hfMwLz7~Y;2V=ZeqDWu+LBH_;a7Ops1C{!;91PR$FNmTNMeLC zX{7`&WJe#7p<0@{!;@BLknvLwY|&zVjRqCM_%(X8z!Vp9nHSV#{K)6YwyP6!1Q{*P z0#gHEv?QZmjh{UV)l~SXSQahCNLLFlbb{42?Fxn^UI|vLdv}3Z6!=H}fEQZGGiP&- z5(CzZKU04@BTM!PAC42u_atFqRvTk1*#WUSa{{$ae7cR__kUW7b1~`jThhI z*L(%|ktpz9;PZ@vjRYAM*ffy5f0mhovM}Vcc!myYsccGo*d@5Y=wqF15ZHAP*iADM z*vYJMgvJl+HVUF48L!7S&rd_Vj~@L%5P@b1$0CaJcnBc+F`X5{FQ7#IP@)}tiHbBO z%D}7a|D}R$Qmm+g<{wcWzJg$tP{A{TkW+%_)Bm7?)<{IK?InIIhW}k|2n|t#1BmV8 zSkLba-_jBlf_GG|!x?S%9nDbK^piSX_(_~>*v5w0ko|dnIs&Pc@WP?DT|8}$kgCPO z$CD{_BcZ@3f|?Gzgpt1yW#v!)cIIKoM_}g)b!fCqgCOKC-w3Y-;ng@y2tr;8qLI%h ze9j&6HMHALXiNOi*V)Gcb@cfiQCA4D`B!o+?$QV21<}}m_&Lg>m=A(J*C)3U^f^7H z4K~uJ`gkdS3PkMSelB2oVY7s=)*N?7c#*ie3X>=N2+b`*(j8uFC3g6N;I@{oe`Ald>< zE+Lak0%I+K=@_((G1O{IgN;ZwFUX*u7Qyd+V3fKdOWM#wNa_yta@ats)W3r+H%zy=$VcgJA#Q_P4>!X}>JsQr-*o$SA9pm=;>lchhxzo&Hu=D#)!~ z*r>kScvOjv18-*-_-8ryyrj)Mg{Hp${8yCVPe`y+Q-W#_N>JD4Ff`FyzCNUt)&X(q zf55jGvm}AhddwavGJo_QR@4!Mw7-nh?(>?1{^^pjBk>JXL0*;SOR$SuM!=`ZC1_1` z5w!kfo4Z1r`DB~V+sk>ofVWri_8Q(UZ*S%8?YzB{x666E zlDBvB_8#8e$J+;ZyNb6D^Y&5RuIB9%ynTwd&+zs+-oC)wmw3B|w`+O(DsNxs?Hj!P z6K~(}2pSN4_wjpn~%y!{PtPvh+wygiGz zmApL{Htp@5M&)ZWoPrVGyIF)?!qri7g%%$l&Hg!LtC4`C9*h)+uhBCMFONWxYTHkPm) z!ln{N>{-Hm!e$Xh+|%P!!qyW;Uu;UCU&wz<>~F$B!omnULs%eT^@Pa?dqkKUVXq16 zLzqrWVBHBbCaeQtJqR-*%!x2v!n_Fkh;=$aLD);eMiKUiur$JcB5VO+HH768c8V|+ zVRQ;gC?~9vuqwi~5O$uh^@QCZY&l_X2wO^+3FHcoGYGRGY#L$x2umi6BWyHbg9!VI zun~kQ2umW&pRjp^v4rIi=0w<9!t4p#N0>EXwS-v^_MR|9!a8B8e@wqzmf%U)TkKg0 zv4lM*Y#L$r30qDW?QjV{5O#sEbA(kB_LQ)FgtgKKwv({lgl!_sldv^}4JIs?uxP>- z5jKu6C1KMDn@reJ!p0G{k+2xT4iOek*mc4N5%vpV-h}-@m0@(T9H$j*n4!0esZB#wI^9{d`i>2FJxr822@~x=oJ%jFVeq zPojvDuwe*EMypXn(+jPkEQ z^*bSBx~B#(jP)UaC*!@vm;BD2IU`}DR=}ruBM#{Bd2_sz(HzK6Z73alp0LS7(LyVI;~q7=nLAmG5ovn|1O=TA2of%Y|-{LpX7+LN~umg0nm~E z=!s@I$S}zmH%jP4+>kL$ql}TRLf!o_cHV>58n_hjSMztvfmqPI$`4$)Kp%NANb?Wm zQFR#Uo@AIp%HI|3e1<8kI|e%BcLOxj0+Bz_0hlUAXNGUR;G`6^9sua&Fi_)AiWxEW zk^exrVJJ~(L%1>wXGcId;rgL+{g#Fx#E?-a$#*-O5Mwi zq_UBnq!+vPl5Vl`kS-rDmoBsXO1gO51Zi7`xzdF1vZN0`tdQ2$Mdgw;vc z`#h1BpZG)Sy||U9{uT>Q(XDQt;qLuCUtaR`JbOmrIg^X`d^>ciXWFv)p4%ra^Avtn z=s9}yR?zPE-0FAEQzz`U=fe-L;MS4t2{4i^{@F_QvBX|hSl}+}Rv#d9TrgagUNv4e zy=IQgp?{X_t8Z7x7HVyj9V@Ir*fH7L%eAtQ4Uc6;mVd~O_iE+U#mB-cIH{Z0mVJ(1 zivvBq!rc{K3)jVYjV}Ji>z?y`uPuhlyw3i-*6X`xWnPYU`@I}@pY@8{d&_Hr;+2;y zSjXF}LExP=+sZq0fW7y(9o)UQ4i50PX^iwP?l|6i!n8Tw-ahi4qG13>W-RvMn z`eL`YGO;LmkeGcGA>Q8NYw@>-)5Oe#IiOz%`tLwr0QwE$N7uH1ewTPokHg}OHD^J8 z4fGGiR~vr?y_O`<)j*PxU@SrUlA$fTNgiG6Es1F7DpBqClx%VilEluAki2soEwSm6 zDp}?+N0NMQf#my7*^+`4D!B4Op#YW$XgB zoqsm_N6m8f&HZ(3m(0y<_@)Z>MnV;P$9f#@0=P4? zEjibPHe7{yFYbk#GdJlS$8p03a(~1R<0QS~xJBD1Vx9jV?@LE$uKewF{f|$yCmhG# zAf5TN-8ExSI2%3>FT5x;`ns7~Ajhmid(*7g2hF%l@%cmy%Up+PP{uSLn z3vYpde+13x|GV;Q;{Gf8FVi6UjsQAf)A)jrmd7zh4{RqqD2cG9Yzb^6bGpPwOi=6Y}rz`rCy8HkZ$Vf=`p&xx-Ine zTQUZ`G1N6NL0X1}jG=*nuE5ZM(S^URfuXJd{_tRQ4Gna4O}?BF>U{r|{bherwFxxi zfu7|4|JuB7v4VY`uEV|3apvA;#&f?NSqi*@``Pym_tG{@YShyC^fli%2Op;E9E_>b zary}Q#wL2A`xW#QkK$80ZxJ3_mGQ$X&^IC;;ty;q%|10RJu8ZTt*{xsi z#du{nVPIEoO+x_umE1G%ns3LolbSQk>D$+~9#nn3_khFxy#um9zZ3L0M<9-pTMc@O zNAW40`3Ud3U-UyI=o=9a@dq{{oySP;k599C`W~Q1e^5SNREEF3UNcy0{|EGcKV8O+ z($zyr4476-YmDeNOj}F`W5$#*XWB9C87rm>)0MGhgp32zpK-;3K*j_x!Av+aib-T9 zGjo}5nbk}gbAY+XG%&w2?X(7H4be)`TCR0S>$#S-c9?dKc8#`Gi*YTEwCJw0R7bmI zdP^hS&AMTFCi=Jaj~MK4b)oeq!@#zC1cAnSrq9iE+l92h(NWd8(#G8Ol-;e~!yN~@ z{3zP#>Fqyj@Wf$#N1huKlS*&eH#g{$znJDzo7&xP6(K}a4A59oN)8DOU zn*#)rpPB>3YYtzIH>7`%`lorC)sH*5#y#%jc3ri@?bgFi?isr$yEE%|xT}u-;(p>z zCl9^zejXc3CVLdP<#{a6+2Jui=7L9uO}}_3ceD~sJlRRKtz&;tt4)5Q!0{tQ;_;J3 z7cS2ib!w9*x_5WINIP_gC^WW8RN3Z&NGs&FsI|*4qS^>8@mHf;iRV_Ciu)yW5)Y2* zDL%H=Q9P}$SR7*LCw6sFhz-i3#9NZbh;`kvjV z_kfPXL}VaobE=Kx>qHZYMVEFG!v`HD+89%;sgiRN zuXWy%H3o9Yk@UfmVnL|Htt?WK_|-_sfKH<&$`^?e@5>V<$tR{rUZ0yOiF-9i@DC#ia#D+za5E*Um&rKIAgHIgyhddav=DoI8A5{YQp7RhU~ z?UI{oevmxuw@YGpdXK~_>40QzyTg)0Cyz@@I5QBF}f&eakoaYYwuM_|J64n zY=_t8?1Fxl?D+8=*y?Ro?BZWLv%ADLtoMR$tV5kG zn*{*5uLtyHLzX$RKmRs>tsL&cZawP8p6e%K1%(ne(L~DLm@i|a7$5f0 zbU!xjeE|DudLXN02D2~c4`BzHgs@B3hOwLbMzDp4hqI%@N3d@iN3wxSV%cc>(X9RH z1XeXZkv(lTp3U8#%zj8nVc%IyX6GIMhFvplI_uVN7TYsb$tGQ#!#?So&aV76gPqZs z$u3sRXOC7aV7ql##1_q7%=$JgVOtDZ%3iDdmOWzq9b2_HhduRX8G9=(kNt2dpY14H z&U)-z!G?8P$tLElV$<~3uoGvjWrzP#$oBhsJ^S?L26j=XiZwV_%*Og{V)GA`uxrGd z*(tlXu$`Q@vP*YvV~_UR!S3I-lTGVe&OY2$!5Ta6Vqfgs&CYb*!&dIz%dQabXRQw% zVEuio*fwVlvEvj+*pb(cvJXdAvmYKEXA35tWUJnvViPjXu-R?TvHe$^X9K%mWUp_# z#MX&wSkDtzSkurtHsJ16_SS^!?4{r9+0ILDvIjfdVt1C@W`A+J%T7CSj|~Waz(zc3 zU^jj9i0x4P$9ousA@3rN6ZWeHblZ?1u+>N<*S|*&) z2@~$dQd4e9s2O*=qd8}G*PJumWWileYR7#&z>?ej){;B3zdcttw*xo8uOm0NwH23j z-iixe)`>e6)|q?Pz6*EbMi(x5tu&nRYVs z_2AZg-IM#VhaETZfgN{jgOJ-X%ARxX(u*5(qZjvad2db>>cF)!?!zUV>BA}J_vMaz z_T!Fy=*P(`9J$c({keNR25_%_8oYE`s~%RRlL}ZY1YoG@LVD zJ)CPT{ED+F|B6$vQQYd|QJhxr2ySNG2(ImjXs-NTG?$bxl5_icBxg2Z6vzBBihDmX zhSPo-!CaaFPL+{c^ooMhN&ZqE79+zH>WIivkwbK(6HxV6Oz z+`aZ=xb92FaHD=7!>vdf%bmP2mU}5rDN8IOlHx@5XU9`=Y7b+7nZ`7cHl8#&0Y|b@iHa943HrIRpZ0`K`aBrN=#Z}Da!Vb^o4A0Hx7F?ap9ltZ1 zJM(xpm)kg->-u^&m+~I|zt84ka29CdWgx>ZloC%scSOwrUc`$vhoNwP1|{(3fb@`7 zbC62G|1<;2r#bL^9`SlSe4BBIZ4PP6EV_u0R|r%_y=W{^3fk!=o;lYw_ug2!w;gzvq`7-q>~2onHSz;C0ijo|+g_*?j; z;;F<_3cp~)IRQ`(1~}9Gl{Pwo&Kp_)9RTsAB$6OE$vo((0b;+m9NXyn>+en&LsBjT zJaM>sJOv=AxglPYfH#oG5wHIbjFgf7#aBsZAZD{Q!`uW2Y#3$;AQNyJVA_>ooB?&6 zQO+*-aa6!~z-GW>fF0t515md?WNVHK5UKFypWUndZ_`nJl$UiAP#bFjsGT)!OnH7u z_jk+jzn$JcDhrDDf35u(rrZnJlLi29{#E~xRBiO=(cIZHOK@k`4QIN1#5Xz&e@>kO z-NoLPV!83e{Upv-xV!xf(J&Z9Pk3r2nYdfCBU9#te>+?p&!Rs2Z7JK0Kf47 zJ;YlHx+X(s>*m1Uyj?j`48;95_cV5r43Vr)?y3S*c) zkO`{etNTOkc0xFT#?XA@=UkHq^<(qCbV6PP|IF~|AzbeW0C8zwYQ%gZa|8L1Za{O> zJe>T$r1>(O>O*ayssESxspqN=Qqss(XzpqQn)|`|*=WLBz(+$v`yTCi)L$g+hPWIu z$-l1KaQ=@BmElW6c{hi@J3i`uh~lXK-hcXZ;MxyS2k~Tgew%#ItJAgvcoNTYkoXq# zeHGogLKoubi1cxs#fu}XIY3hmHI3T!CEgUDA3I0~Y4Jwc^rVLd|MIB`Q&JiLDhpp8 zDnoOi@&FDr0be#Mp9Y#}58_GCybPK=seA+!rpb$*Jg!MslaD4HO}dPDT1pIbOPruR zLWcUn8qmD2XdE;*U79&azDBh4)OgbvYHpgRMe?`A)+3^@=FQg7ko-=A)04_TW0CR| z04P5WKoN+LHYEB5pidz91cFZ>_yhuyMXPytEj(KQ^Z)`t7XSyC4fsT$1!w`#0|)?J z032X8fU@|D+12Tg&Un#WgKIs!+T56|W15(FtliF_c^z5?`*q&^OuvVq@nqN9+C_aw zogUaLZl$5~<#}fvTNN%9@83VzExFz}@ObqF|IW9U`IP*w@Z3^n9^G+!&G5td--o3w z4pW?PX+L&$udCyW+pLT=Hj4b(OxkJchNv4er%hj*e0KDR)Z3NamJi!}ch%CYb>F#X zkIWNS^<2F8X2Z9N530Ej8sg@K5ASv0h3}I+E+b2J&6%0-Lxw}&vH|^`mprj3D~f78 zt}r{Pe@)NiR~P;W+kP`(;KXZz9bJxp(0y~Ht9ALgJW1LqJEh0VwW~k8_T9Vt!!N~C zKmGcez2o)t(}RMu`yM%5nECUR57d!t4Ljz(S$A$vtBzjXj!Bq4ldKQf zpI^Py`fh}iV(APh8_N1ZS=I_7RUKuuHOt$&NpR#Jw z>TfPf99N~7P|;uW}Eg zebtYi%{=UQnms?S_S5O~dAqMTt(?WW=7IbD3y@;g}cUr^Ti)sj?)?Q@Rwo0z#Gdr?%M ztbq}4HtUB-D^CXdG%OwT^21JnV?hx|2MmV)c$+2^yghTB*^*U3?JUO8XE~_;O8h7b* zV&7XcCO@w~bb8&r$+aUNZforJ#PZqQ=biSe8cPe~eodLz^WD*v4Zj=wzI)+;+f%c? zuJ%w~sQ-|0W%0g(nEaV*_HJjF8J2zeeuvTaZMtnHZobv4e{q7#tMy5v%lBQMp0>M1 zluJdq^vw>o{Qdxg?_Ld9yi?0bY~9MKTL)98ktJ468|!*F4czAF6fBZBCC?9V>Q)%$ zv^yuxDKsg?X~Eh#P9Iw@a$2Ud%xO%{DyRMji=DW<9Zt)-?0339=A=`ZvewCE;(e#$ zfLBfnmS{Owy)kgsePQA}dAgNzRdEkz*XfSV*IP)OM+62qi$;Yx|2R0#`J-)$^P;J9 zoafzJ=se?Ej&o+*Drd#gV&?&)b~xKU+UIm;Qc^E~#h4E+dQsT;jWixtueMbJ_jVB$w}p&T+BYyU=CQ)*P2@ zE~{MTL>0R@JM3^dzI~s|{Z}Vkv|7}&A3VwJvfdoG#IXzA=7#6E+1IahGx(@-OE|XOO(fgrCY*J`tuXV7 z+qL+6ZjXAubbI_Oy=>}i$zito0&w`sl4eYDpJ_tt(_-1~RC=l<-$FYcYr zGafDb7f!Hkyl1FKgI27^H-{&Bi1sNx9=BiU zQLUZhQ9pa7$LRu<$JMCq9xpEM_4q;mgvSE?D;{fa-}TU2`-{g{C5-4oO9Rn}XT~DI zn2w^1xwfL;z50p1-YpW1dg><%dK@B(Iv68bHGQIJcD_=y=a&VdcXi*1{1huio?}&_ zp7z^CcUSEdnVdT=YImweWWDCD$T|EMQE@sW-gr}Ay!^1Sc&@0USW96m4l(K{9yLcK zKC#_T{Gc>M{AfmuxW;Ls_T#uDwe9VJ;dwvr!j^pzyZMH1;`KgoCFLL`|UF_Ny& zlO^^8m6F-(7DyJ%{Z8Wlra%&Ippv{iyiM}9&t6H3h~tu^pc=_n?e9u1o@$f~cVpNo zS^DgNBx5%Fb_cfSFWuQbC4JfXrXu!~$d3)`6T-T_9mQsBOlH5eRkA5l7qEASeaGH7 zS-`%#TEr%OyN&Jmb`P7^`8Yd3P{X#XyTeK{8rfXHmfEciZF=;zlXwhp8WbS)Q-ppseDcI^W{*vZgR){j*RHm`d+BQF3p#W% zGu>KJxN&F2zPb)VJ`y;cNeIRR__>NhjcQk%l-F&`YxcTghKW^+X0RW%(pOk-MR5uvVFrcZzv+BRlQd?j>fDS9I352WlSqaw|l2J6LA^$Jws9%$6Oo;`;!|(6c!-_d}!dhQbNg#8LZ_9a2T(QYxb}tma($-V3@ryP+QC zwbgG92RL}UPrR%t&Otn>YnzN(CiZ?-=>b5qdaC`?tLzT~n$fGHQTYiphT4QcWB4<- zWaY{xbbI@edMeY5$a=1o&SDh9AiW z$WU4NXHx5EmtU(D#o;r%_hufV1R9^iAT@Xu|~rK4%IGCTd^5hy&Gt5_t{Z$EU2 z@K~-wF4MD3ZR^osHFT-m&U5#wl+6|S`LT;jQgh@FyT=8}{Dql0ay`}1K{9{m{91*u zQ;I?{*7FgvlvP@1w3&M$JCw>vlWz=8KXt(EEj2K%-f<3rDjH_&~E8nyQSUS zb7BK5coJ+y;6uqNJGrC#z)QUcUiKamI`fK4Xz1&-s5<($c8aqlKB}r;tFl-{ z`wUA(=dMMT>1*0&TE>j*-(Z=t-Uh#Dv`RQH*YifqM9)lX{WcNCj5k`W+Pc~(_Jn&+ z+hr#1$BR-G9UfV!mMVNpio#>g*yUZ7FELJCs_+wTFpKH!FgjPh#I_i_nYI<6cLv&A zhZzE`14n;hky%WjLB@1%ao<=n^vVLJbLD( z50dv-4WD>UUC{z?i6Gu85$Bg*evwQOY!Aj1BZr6E{B8; z4UMV`2_04`KJP@%^G>0mPN8+qp;yu*p%w9$L({IMhSpDxuiF(>|6AJN(D?e0s0i24 zVYP^oR#%Y}{ZbriPQ*jgqOPQ+4Nr@zuMHVGIp|7W(&eKi6351MmAVQ|*Y49!owc_r=E_i4kgQYDAx&%Bu%e{)w_RQTwdwOJR_ zW=7{F-9a(lrrm6pAMvLBhNtiMj6HpL`>DzoPY-Of`eAG9(_`yTy}0gi@3*wrt7-R! zjgJb?zfzeMUz-#^b>>aW$)g_DAKq3Ia-}k;j!!$m(*ynYY<;o0^4W*d-X9J) ze3aK)&WlftLiHosjTjy_E21tlzTK=*5lO?}MMVvpcda(_!RyTUcWKe#VK-5uy1cDr zy-q*-uq5iotY{2bWeY~CG>9*3>SAVYc8b5FzWGoinZ9kNk)p(MS&m~*+mu0ap{giY zKGr-|(f?sl+|mF8Re6X!z&7`iLTFnYEKd|xSPYdr%u_`6vaJY{k9AO)#g28TUf?KP zkwP(Yb0d3|l;^wq2~&a+T{o&iW|Xn-*6T)-3S zqFhg3RZ&f3fNg%Ze4I*UIWWMX*dirJSZOIAyQ8QkCcw7RB6dres=!0&ke?gVyX5HA zn6niXVX=0|JaUPx>PF<^A1f_W3~ejIBNrm`n9UByYa_Ros5%TCTTyA5xJ0<|tHfvS z6&8t$N@{Ck&X!f)h}kNcf|{$!QQRE}SmO8)O=7FMDi3h1tR0)=(9l7?uq?M0nO9rH zmN`^*7@Fu@d3CHq*_Ft|XU>(^CygmU|g;lowS6z+O98M*x*T4!V{8muxDk*8Lr2g~K_a&r}l4!Jps z#4@~75_}tr*U0qZqj#Cid0TWCg%)GDbi@v#jeYL=*%dL&3GKTqPZVM)OPMgi$R+(kBwCJ$YggJqYVabqF zc1M?cE^<6(8N0}_S_dyRxnY4^9<19+v+|vDf4C~;3u}pEwPox-wX~VZU9AB8%BRiT zK|V75fB>Ni`@`}{ZRHrpxeAqKT!@0OuBuHNuw4jMX2O=Xc{~=VCXox{YliT||E9&~ z^VwpUWq6@$lTOF4!vj2eS+(gyn?g2Tn6o=-nPEg@CP!gkGO4XhxUL9AEGf!W9J9&@ zRs=Xu=}Pk2$_!K)NNruNLMF7y2$t)sicB!ra}^%?wz)=f1KT1BO$D7W)ktoyDzcD0 zDcq1FHz=Xn2~{l(3|tMjP%62DDqmqQ%nU&)2<=5BZCz3nBA45!!sJ3*m5E&L zkatNjwnPO#l?th-C{&oIK%#lUlt2xfh$}Baf$U3E3WXiABx2+XKa6>gWSrFct-mDu z+3DV?Zpq#@M|4O~qRnUrGIO-%&h49_w44JEQcP3|807|L!GeTyw;3DHQFGQEx`Vy* zvynQ9&0?2Knzt%u zfpCFi#voxv;p9`ocq30s*^}-mx)D!2_1cM!&*66t^vX!X7(>T-t73!u>wlLLDATo> zbS~g=QJg|HMpY3gPbew3aDNEqrN2;BksaAXRc;X}WU#`~DkrmZit}NNS~5z@j9i)A zrr0cHk$X|@q(Jw1xiRO2)w!`tJoVPaEcI-#_Ld8)m#3U^)U$~Vc6?|Zmkq@aeHta( zjrdjLr~zZyJ>YWhAX6W(U>67Ygqr&d33WI>APD@(71N+l+Ny&>)8bFR3cQTa-vWn( z!WjkTWmrh)aF;0Tw!*hUMlQwTntS^A`@t&Q%OSksgymiad(q8p@ z5SqBBwD-!b_NPmGKdtPwcTaC3-uW{^KkOOz^g!R!d!Db{y1Blzcl`nT(|h_p-P8BX zo@Y#52zN_-uQP}3%DQtU?cUYQn{ShDxh@R~O{!0g zigJyLsEZ%|X6Ep^tXMd~lhuU|dktr1^qZNZEY+M-=9T=J;AKW#O}l9sR&OyG99wLD z+Nj+#qupmkS(a8h7;f9zG3utvtl^gV2X?$_`NhV7F7BuAxydp;7%VI{KYbh3B1ir9 zDZ%|43b7)#T9+F}yltSYVR=TdY@jM5OeS>5R7AE?mFFuG9aXh4`YILnXH{;kV&D!{ ze#~ae^lWg~h=H-GkPln|K10_w%?PYb9`Q2ZesnwKo%592=H<)fWk{;Esys}w$RRIm zY@$OglCr^~DKAsyk4-GQ(gB&r8p^RvE3lU3)`I&j2KA4P_3_q$UP2YGbyn%e5F7P?8w}=dtTCn;k36Vi%WH=R{(=Ef`)}R$LQ_ zq#`3r9IL}qHVePUF+-P*8G&{!c;gxfb;~XVEVPbOcnGs{FGTta ze+W_Zb{t(RA7@+bD^GAJ&yVQkm~Sy)tZlW)P%UPpUR!{LY@JOnE&TQja~LH6AChhq zi{){h=K`!e8NrSXt5CO16rgXDdXCsJBaerx(!n}+LV@g5=x2Q!i~R$DHSeAdUk!*@{H-SR?dPHAXks>sYYO=%NY=aIEb> z0g)+fDWL4fVgxup{Anlx3R2FsgcR6~QFgj&x6}QQf3T(!+BPc7*fZ`$Sk&DgS}DMC ztx6f>h_*cEzL5eRuA%_&TNKd5bm?`SfsqdHal7MK4Tq#VKo?NAydIY804#kplzDRJpPMVQo10mWq7$o;Gj_+onnbQ`T>{?I!*0o z69+#GD~zZNoHj^ufuVMZ{1kGGJcS4EN0=Nx%|X)xm;rH&>i+ob*ED(fKGM*Egi==b zn+c8Nrd~Cm;mjvsr|D_A!Dmc}mD-9}cuUWo?L#d_Z7^upS&1dV2uBcYeM2L&88$jc z>9Z3s+RO}GbhVUvdpo7*>ggM_YHir2t-uJs@X^d*eIe7tuNnV`U*q{T>x)G(ZROp) zWBeWcJo(N|(CxixRr#v^MtL#Wlj5rsy6#W%v&OevmEq~9K|I3< z!Yy-cX@aiOa}pD9nf}#A`cf=?<&FO)ceYq?!P^)=W8dWdw;m^7G3TAM2Aef8fR5J=g0bHUrxC=~xVu>Si7c_E|0PMW+-eUOpV=`VSiH-;Gh`#Jq5h5xj`ziI&~ zMC81TEfbv0BF1_UQ+3;oert4T+?Wn{CnKk54317?3La`PO4XP(O*ex7D%F1;Zv9^+ zM^z*33Us&kR>o^NwJ99KoNuw9bCr{p65?HL67P0&vbE5|0nC;TU?YRg0xtDFpI(d- zd0uupYkFtunx2aq#pg|Z7Oa1`qKEgzSAnL*!bQaf-WTcDR?TR+zgj5V;U?v`*KGXy z!TRw0hYLZxeoU#o6TV9^#4KoNXlT2FhN`pP6`>(f0DTVZo)OU&z%!evYB z7jM6q(ON)t&{o+bws*7^XWInbKca#=^9T1vBWMOZ+tOlZuP$Rj1 zNp33{&Iw@au7a(*I*0lh0y`|5*4{#5mEdac|b`n?Z04cLvE8KZ^MZOoo=4ZM0pVf#beMz1@Y*xF$FyfibqEj zG>j?ev8ed;EA*OVuvyTuhv>s;>+MQ=?0mFvy8;yD7%=ytjiK+@uslV9{wfNI99xzNR=F@&p^)3EY86kdV%w6~4iZ|N zRB%Gb%|YkpU5b?3W?b?V+CpF(fMZ#t-8zgIl9DL~I#lGyTiGIp9f>B#3Q=IhMa@)s zJd>J@P|(RsDokYd>r_Zem37R*X?mTva(5d0n1D z-Ws8iy~=QOHn7dRBp*{!q=>XfG=+g}t~R4o&$3PBMxwL3U+P;8InhrGD~A$)rqYqh z!rQHFtbL^zN~Cmjy9Hw{WVE}kUopT<>K`0FG9mdJ+jg}m}NIG^$GgDOP8nD%92;7D`MtVP0|(iG}k_DlWrMjDBfhG zIOlFuGF0wpcc{Xoe}nQff0*+Hf9UjA{?G~hA^m^R8UIJlCZ6pxe`xAc^(s*66x5U$ z7}3T+ymMgsf0Xzak^XC5$f(M+SzgGfG4Ow-USDMWALoBs;ENWJ{#X9+j$4in_``eQ z7T^z;#ztWGi^wkqe;6N8Kq`O#ma+b~`9r^*;19uT*d2ZaJph{ma3B4Gz|n0g27efG z1^nUGUjIFR=$`|Qg!m9JAm^L-L+~IEHT+@gA-{?*JCRhrF4Jz>nlYfh2jPGVHB6@)GOZVDN`NorEf$ zlfqUGCtb+H*;56f&%;$%82>SU7#l&&nov;C9sJ?cH3_AqJpzakPbero^-4V0%x8#G zXdd;(BI4HTa985w0~UN|uW3Z`q|^u=)Dg>z`IaQkF!V}je7nk|f>QA3t-l(Edz1V* zPfLq8pW2Fdh;{UsLhX)Wes01Jt$Xu#n_Bp(%(>Z$RyN>z1{pg3eyEL{k4hc@vj)=NeBf){wfqa(T1^JG6VuZlEy;pldU+7fdi2&wGf&OQd>R% zPI(!I1}_RkBjzd~&P5EqIfW3vs}CS>D&(sv0EZGZc2T~J6rj}24&i(ae_A1DPUKje zOw1o@iNCDV{9fDOnhMMwmy55HtvoYEgVCX zRgCAMb~5P_CBJG)nJPU-s$g`yy$5`qtjsRlUUlJiBV&wXi#}FHwNW%)d|me5FR$xu7_+8s7(p=ll_#?E~~kMf2YDNEBwyC>KmYe-G*dZi&? zynO?1NU%n&OsRImKwmUzv||G3R;8Gvj~1%2HAfpf6HCdj+I?gCL|;qL6_hu4j&-Sp zpGA4G``A9mfOUP)5Rla83NU^}1*zld=iFIyBbpXEj>lBBY>obf^ zhMB_OCbP*}U^CA$1~=oY=C-mgDO$g%|Ebtf$+5IOp+mzoSN8hGpd@1A{8A zgyUA`;i|;8mmc9UQaNC#1~NkUAd%dwMo(WNw?n2Z1$hliLatRK1Jrgw8(!^k^j+ia+?{h##JD-9N_!s|uc!kVt{FcghRwuu+fSD|09RP)r?ne~8{ZgC)azh4IgalQD3^WfN3?AaYH_ky|Tr`@VO6%k0>D>)7 z3g_N$f7I$|QTt3_9=f*2?%QlEjJfZAa=GXIxtDy3yQ0zl)bvb&rl)F|8LuqSL4O@I zJ-;p~k0edc>x!~A8A}!Z4jV#Z9Lgrw$jfXiFrV%9&7*h&F*%1{gHb$AqRQ=?%OI z37s4S_UkhAG1KBndGoDvsM-mA%*pZ4ortJSf==cC!`|C~HFa)Vqd_fyB8`d|X>@~v z5QJ`mU=7uNfT$2aB@pGu)B<7^j9Y6vi(XCcM0TD$& zM61>cDpqYh70-4*&%I;52?+LY_uIYup67n>Ag*Msyz75ujycB|6J&|oZ)upGaY4tj zLStoJL{;z&GX1zSI|+Qu6*(Z@&Xs1#{1D#}4^-As<=m!}(a0d2g6Y{O0}aDh8qukY z=+ZJh6&j|e>@BR9NE#qFgkw9wSHQ@O=?M;LXpW+b=&W)68{=-rM#!$l-Q=y3O-#S2 zVR{BebUs(yo|p};!_64kie>Un-qOxl$v66Tgg%SA6R7CotqOUore+cEW zlZ*d*dB?=1L8i%V*-4?;pw6Vwl4~`N|5@`F{ugC4zWQ$Tj+@JpOXY7g9_l*d@S^Go zKF9yEVkSVt5M~_+6oHoKpV~E!o8MUJfrwATk@21B>-*Hlzm;Nde+AOBGVfL&|EEr^ zSLR$mJ}_3=>J;JcsI)k`h`E;{9<;(x7ckUQ3?*&N z!f3L_rvd&?Jz9Un$swY!zcgam(>eY>dMtLHi|eb^Iif8<8Z=AVn(gb4(=L^FVu5T~ zXO%Bjw(?v5*63WZx?R zt+6=mQvap%+m1#^!9sSD25pS!tiq)iL7&BD&yxCY1aqgl()Q54H4T*|rB!Pwsaz%R zE$@9$Rh(NHm0P+N?)6_*M)jVwYpk*>E$z((`=+S0p~|kY=FP^cBSh6HdeBfaqcIkb z$D7aOH4kd4zGx`_;>*glz2)CMs9e`|^6~B>yFI0XE_|%g?#n89W96UIitb-4I&`hF zq^9z_n(}hO9s6kuz~?C~vct<4m3CcK8290|%J04`x9h5ukN)zZ;a|U~sVw^v(}xaS zt9sb=PRKHa6c6$E0WvSLri_vW;?!!QVd(EbmPgNm!o8A}6f~-kjV@FvMS9?iA~r+} zi$D@2U8u=U5hY94cU!Fv7*z%w)d&uczp&M(6$y8qDXtluk*-@ z`=o*+c3DrdR?N2j5&U9d={Ze~UQp<98F4XtZ$p0>y+E@FGN0NQmVM%n`lG{{ z{<<+|iNUPqBbl*FXPYf&r3FYMm!yj7EKwuy1oK6FmzUV=WdKUFyJ1?jVq2gbhd)_Y2m#cyEkE+ zpfE4I86@w-CbzqJ2^n72oS{rfdi`x)n2|eJ!%IMzR4Q%3GFu{fkPp@{XznKAck`5s z+{JqnaT0}~xsMjK1qL^&j|PNq7xtKje_>G==pCufZjW3iY`-3MVQzG~#JW(uNE}r{ zEHm{+P~1wuf8SoA4vYch^btoDfXxo-%GGFJ`|jnzjn1`KV^S-6%%UEFec}`4e6T%w zk+6G8%tKN4^@MNvg&1ltSY}b`qV~uOs-sJT4+&N6VOV*4SkrE>%p!&0rTGZEuZJ}{ zAI*-!I`tTZ)$L(NPR5< zE6#K*}g5tb%2Kg{SPR^D9AlSVzk z4z4VlfA8zi=ouD5`SDWnc_6cmZT8{&8YC~QgLd9YFtQEMYm~4x_0H6 z!E4obuLd6$sROWsm{BggdnLSV?!op*U;8$i(cT_X=G=ozhW6Y`h@sXZwF1cmty}=6 zRC!tL)p<7d*_pwl*9cA%)n$iAmbGJsKphxWHn%=IWN`@?i-)UmgSUSLqr zW1taIIn?nInRw!|`CTZT2E-FwNkbm!U)~@qf>%f4iHamh!pds#tzt+;;}iLs}@LkPxR0r9dd1H{5^K2B_pxiXWeTN28-WJ)MOBe8w;dsQ3n^Lo-^ zQrzD!`KyW7gJQ)MGjU1XxbTA&ZC`)*=xE)$A&fiqdn~Gf;`p1CtL)m)HlmF|;hU6^OU(Z~+#g4;md{ww}#U(tPi*2f1 ziy&6SsreQ)WEb485PTpi(fk2(pg#i9#vKFs(&$Cv`z&zT31*`v={FFh&?wqe1mh0= z`X3y~N4k2Pl%Zl3E*N??wRs09$*nT6Eh;_$$~9`q?q_piGF=v0pj!MOp9Cy|Lc}L~ zV_Mw2EK~vRo`naDT`1&0q!eo`7FZ-9L2jkuN^B<=f(&d$3uE^rURH^j?$!bX2DXAM z6L;&$sunMU5>+N72NYva{o7zKA|IrZGeE;g9EbY%t^iV^aK)aW1W3HFu*B0UYYA*PRz7Fy)Z9Zyj-NW$a`o1|C&<9y$BgqFZB^chheoB_)!k!(r`TuF5=p?) zKuYcZn!rj@=`HAyIfn2E@Y{po^P0ae*7QKv#6!B(c%0 z*euajr2nTxmWe{jCZA|2Hij&Na}I~n)z74U17&f}SMW!(%o0u+j%7Z}EPabCQc$K9 z`|aLV3be$29off`f?DEdG=GDM9{b!%7;-PKSyiH&;xKZOE;|p{jQFvs4rfs>*Bs<{p4fQ5L7C`g z-ktm)<6LotXmXyXdUNKU)M|G3pYP5S(sN*cUXW2Pmg_;Q(jY_4ly$}CmRwtUZ$tC_ z_wvTpVQPBW=8W7OYD~RWwkAE-y8=_5)te=Iyy?A{kCX?s_xX9_Y2@M))!BPmYB9CA z?*7+#+@Vh$O}cLs$}!11Laz(-FZZlAUobYz%<;Zk-#rHdvxGeN2bb=xRw#f4l=lJ&*i!0&TKXy7YZ&}_}F<1Qnfv?ie|sN=;n ziSAh{x&6C|6Utd{vXEVGUX{>rTVA+qxA>{k;_-9+Kvr{-UYa2DdrR&&E27m|=08g& zT`FG&bX%q9`aGg*NES2>&j`9z@uYOgoF>SeD#*MuJKfUDb@e%0V(_|hIH}N&Q)bjF z(`rrT`RgB=%B&`!>n^HWUbdNAkEJ zELC{_=t09tD*m@qY?G8*7j0>T@Jsk`ZiHirIGk7e^-XrHqxpKcB4MEM!0KSn63Q+$W8VteZ*_*RoPw;*W}=tKUf?$^h0r12w^Uv6@`R*0+)GfEA=y!=UheJf3{~+u z;WINys#>))iYb0C*tcJw)?=fP1ox_rW(OZ~Rxgc0P@NIHy->{y+3tK0L5~VbIf$T5 z!?)Xa03%^2|1?BXTgoc{w~WsmT^bW<-(wQ~NLarwym_u?v)=>N(RQyj_81BwGLT!L z+H4-wK3KVZU7i=ffob>}0i=D+_EpR0MO7E^ViwtV^P|Ry>#l9VR$(YX6^1%}mA~bY z&E4SO-s+?6TP{@V2gUq(zdFzV(A;9)7KD=FF|PwW#gta`nS?*C?s;$R#nZ=v6aL~n zk+MuZ-|TsG8sO=5$BwDUH{HwM-g4Udj$dgtKCz~(FEHu}>ZBe~)!2{4_RrqkvhK{Y zDT%A?G1Tj}b+@9LPv6Vi?x)uM6NYLJPJDF2W^clh()KAU%iYc|$50awB)oYN4`3Yv z*5eyAyv^A<99@eZWf(+4=7bUF89^-z!~-c-WJ%qX;2m1Mc{-wwqf0R(8sI5kW$X?ms|jS~IM3(v4_tNw zcpB&LMNr5a2+vzw0d9cYzTJ#)*tifBj;~1M_I1mr)u{ji&!faoI$1p3kdTHTr%EaIAt)rS$jYQDb1rbS5}NjsT8Vfqh6=HB#w9bO$`VhhZpSJ*+K!tq7Q2UU4^9vR#d# z)>i+h3_fgMmy0XBefgHpobLwwYARAN2B}D>?U0HTL{Ru%*d#*s3aLnd2U3KYhJdQr z9&Cs2`BOtvk?aPx(I~?55?Xk`2}}{T$Q^bA&2H!U7!-mt$jq!r=t40eQck#GhhR8( zSx{~?ZA0_yPiY@7X*Gp`ji-O-Sx9?fH<)HJA z*Q2pP53xZHnOxP1lYvSyZ9%i>eG`IPc{4o;hvCt{%Iy;vse{y0xEP@ZB)C;T+eeHI zR-3;MsTiX1SW?9)C3sfZQhfRfFp3xIqa3782C4+KMdfA*#DWN~#qbn>2o^fANBMwT zM^1k*4#>5e?<2Nv&)f3))WY^iW0$^wkPCQ(B2k0)E}npI`)hifBO~7!g6>?QbfTS5 zh5@?f%>=yx1Qhyu#63QNNySKEM6x!Tp^<{gfry(#(5oI>Q_lnjTB!zrT+5P(Jtw_XA-!f?NREDSlf)~)BndkzJN762@gCXua$ z3Q0eFhq@RRsxok$d!&i1OJeX1prSyZuuq5#cL}OsCgI^rr0tFfjC!N>unxBZx)v8=8NKmqqMlH$y^NwgS~6AShzJ3$hp(L%~2$ z2%0m#J6(X>D8+$7IkAtiFdP9u`vtfwKo%KKP9z|aR)`--PwHv+EDtnHUF&rF%t*$P zM?tI=D(b)|Du;n%uiN>kl=L8rF z=FPwRwWPP!u@<#_rmIrmz;;r8uEw~xN(cpc<8ulCsKp+Pv_D17F=4Y3Z>t z(NZ%TfA#e#s$?hw(`*udwEU7812|%;4^N9DxOnItek*&+xf6(dJ}F*kvL%J4?i^m& z@?lCfrXHO@va=EI#q`JX@dEwa=v(d&PV`Ng)IHYE%(kAUlD0W0Cne3zx)$7PvFp0~ zgSkCZ`U71`gba%35e*gQgry3Ka>5YQ^JAKX_2vo2F85TR2p9-d&?S^mKEb{nUlS+v zZp1uxdro2WplkSLJg;xDlFgyvHRBD5=TVGrtl(d`#J|uV$zO7`ZkFPUFv50pi9qfFYR0Q1LdZr_| zUbQ*<{cX93ukV%YGh~b4wBoYC&#g_VJ)6?s-<-+*<{kvm@SpwFgz~^fz^9sDMA;gs zc@C!?93#v6Xrd1gb0gNHKGx^FGT^*=xfaEaAQX!q*YS4q{pZy0f>OizBFSxhiOu*= z{Q8?{;&kkY#okrfk@5O7GeX&6iN~8IdpEztWKZkq zZ2^0%t4nhBum|GW=1F(xd#ho0ZT{{S=!duQSGRYod0e_~n2AM^#jYu_pBeAU7oHQSrtC;xAT9w{VUl%W ztcKKLPTwkn*g2lW&PlP*ph#6_s%?W!KRc)K@K?<)y+^(RJ4bl*ve?eKZE5%pb@#rQ za*-#Z<90ar(4)Ojb4TH%!dAjfcM=1=$vGORYuJDH(209ud2ui-9Xt8r_k0FRt#CcF zi&+ZShoH|DUB{ASR~0uq;%;{ASTQkqC^;uPLbL1G6L{2U?@1++p7nVNi`)%{0I`J| zOzM#a*=gxrY3X~}?!pg*+AfVJcBVhLD-#s0rV+rTsH3+^Big9E9T9RY4s?q_*P5U_a5}ppR^Cu2I0SGWN zjJ)YlV(BLVCUquo8Zh@aP^nbfMz>?Fhmp7ez{xF(p#;lOtbbkninTs(8(yOpZ7q@ZvD zjt!BRLB3n4^OEn@8nTOEGmumvR|wcekR=6Xz{m<#4j4-7yTxp&;JZ}_+W>@%nUd|y zcZ)13?wg}nNHvylcw%KrV0{J1SpkPDtt$j(!2AJdU@Sac*vc6WVtyDHs+oMZ$X;s| z@GfcrZiIJ30A9$Fg3SQrl*8+ae76V)Ypt)|7L>tY0-JjkW(EMMHdb|-m4~M}ALB(C zlZ)0ia_R!!#mY<6%K?Os@nUueJKiPVEe2~bqoR%+6swpYN6V=Y^` zkgc4GNH13ohAjDR@nU?L@0O^}Yzq~U!Y|lYAv<-VgTKZ8r|kH62WCW}FF=_c)(kls zBMJ!_QBYY97Z3D(#_nDa-Xq+>+4T}kK<@DtGKPbEx7_i>Peg>xNEebsu75faca_20 zajJm^5HCed@Mn^KDmzIKaHDzyU>Lz_Hel+Os8RS}@4+&IVr`(v5_P)^rVwc2yi!N{_vsym`#rM+-iX)4(q0#n23VRS@{-|I$bR_`rK^_h<(5-k{RY&w&qA z-#Lynj8aLS8XzlcEH-emV3$TO)!9Pby?7Z}Mre%rY=ALA?i#>qbmY<|(@WT`c(cQt z237(VhWm;yEu5wXI>*919J61bt~iY10N4#B=h)&xGa`goKxS@qUTwk9Vb_EstNPHX zr|4N3+)MF13d2`{YN6oUUXg(6M_FxPI8k@#9MW|HaykGkdl~G_=9X1w)57ow!9`tg zns94!+t@{^bt5!#MIEqE$w{qQ;|kJ~fr}0(73ZHFZPFz4@R=(}Ogh80qI#MElaPVa z@bZMjK<1~x*e0EM?^!a|g+{g+-b{yAX;zevqirBK+G2xBJUh@vE&`N!P-&$dC3q2q zJ)_GJ2X%5HyF_{6-_g!{!zUw(?JW#%g6Gjm3Q1FU^XU$Nm!G;DqtGJdqR+9*2vnmk zz@87MraL$0F-{yUlDFm0za-lbL%(xe0L4W2O+t&V&72`#GCj;wJF8JPR?vQ1`ILq0FuPe?a_Jv+-BN-#CG zdnhOv*sy^i2W{*h`rd1f7 zlHW>jrQ{)bhbQEAVf%YA7g<@n1PeFUZsOuuuD%-iok;J%+r*QT;9|lhWEM;JJ|$C5 zPkh~7K$qXe(|Xg=kVxc39d_1RkvMh%jPd|R@Y-}Cx=9V$< z+4Z zMFfQ0UiC}tp(iOAL=Jc;n4dD-7?HhHZt|8Qb7CC#d1Ct2G^1)|>h3)K4^_#*hey4A zbn6@c$zf6+SMW$h$fqsco}3ZABzVkJM^BNLaN9YaD*xy$!AhgB%;@?YcTcy{$+12b zwZ+Lw_af!i+{pBTaHGg3uj2vkCHOYsj>21H6q$&E*;&*!nT!1G3kM%P~ zpfjuw87Php>qCb1A-{z{U+P2fG>zw7Hjgn09(gXT$tx8R9Ad9c;yL;yZBuQ>?oPOp zT67llZNq)zcM9&>UVb&KBW-lhf%9uPF8BK+f(uplI)Ra{5CY zk2FqBFmuv83SDRVx|+yN#Y#0VIW0cpxw7#N(uvyF|I&XyT^Cm5>Lh!)F06&5C0!<1Y8j}#FN0{Cr(ZgYe=aN(g{FaP__+X=ZK*Fngs8^a9qrPnu|D<&&$;t z?Buj*imQoEJc5*;b#ekB>ZOy@(|qy?YH@;6e-k-5L3#h1PEOwhW*2SVM;1*3PEL^8 zPsqNjRqB@-`a&KCatt{+VM(SUFYP_^6y{KHa)Q48Hc8EkpcLK5 zNU4v!s79$zzD*9y11c+`Q|si^1t%wHijdM|N`1SonlVhN-&v&~rGC|KIXN+K25_3ow^e3REZfFHbNo0i-!hQQXvAZq2Rez$?=a?e}M3Q@!>9HvcKv6dz zN_`EIorLU<#>okG>=IykxHgeqTHmTL0N%7p&=gC^$%)zi{ECwkN)JK%-p|cmi6aif zCUSD3iJr|x=b_YxyvfOT*F7BL4`H1!ec6wi z*2*9g>4Z1db~(w~)bclqVFg?%AIT(Davjbs17nWsYqJigua`KP1~OF%EJz(-NRWdx zKq4<3ph1aP+2IzYvD_#1`!jQfDr+^FfLHOwPqnJ?K z${z_AhCg>Bn?*%%u>dx{8gzI+=Vyzje>935!SR{G=j4xDn-^+z|L}UJFcqQcN(6rn$SAmEsD9o0u zDNBMb1=%$uZ;rOZ8i_f1Wr5~|3xixUxgZQ>5p@+_=>}GbCb;o}pKg&x1FM_b>&+CVFXDh`O%83T;kot!OU2hw?4R zvjzB=X93_Zl=$#`C!Z$_O1VKAuYk;>N`M-1&5ol@!<(>k5_?hi2LWWgrwB8qh(}kn zrp@^5)Yv4W@yuVA+M;-V@;(^<({zkIn*1J8)$;KP$0=TCRnK@IKFCS9I`huhnGJpq zmG2u{=n7+}xD@ivDnEqJ1vmVmFqtbhLT!%Aai7UC${gjHtBYUlvorIcPOi;}Tx(59 z76sSM@zXzypPs6n{V)CJxleb~e*M)04{NMwfANU@k^SqMo*I8JHGXyJzqAtVhdp!k zup+EZ`-r+I+e|-dS*}Xz*)UB@o#c4g<^N~B-Y3Yk6 zwQs8jqH8kK|Cf&i0K*_>z!B7wNO#^PC%97DjfN|w@5oJ4PL0IMn> zJu@RVPeJ|8V=SVF{rV(KPsI1*8h4Yq7o99p@zv=-)pNK2;W_mxb1ZQbhi6h-Nsc#{ zDB>ufV2D}V)Uc2UAA}g4zB~8hd$_dbO)QC0A>_g^CbHHV3zd&1<4U$M)1Oeg~p8rEH-_$5Yx!r{8aA4E!h+WTX%ex-OXO@{#LhFmLEWEV=#` zeeI6gyD}gsamV!Kn>ehs0oZSxI-9~ANwUzOP}$-z9nWrCJi8IofQf_0G#=Z6NqAyM zm1N>6E|Ag}2iR|~3Wi2mcoN48wkt?OLJ0OFl5MiZ#^HpVu}rqT6#U5a|!WafW6lbbKvWQqfY@P zGXnMSV+Irc(({#Y7lMyxZ)Jq`SSG;~6vy@RL$Tdg$7PD+JUJeJR z&UW;Tu!aT9gdv_j$bfF;A|L}*i7OFXsFd!WxU5+KZxDeR7L;7JxTq>pNh zVil?1^~ajS{ql^?d)8+L7hxzE0+i3I)so{4P>PEx+wCs)TFrv0NhpY*zyrsQoR}+A zn&X8>q1egHGec%r^#@vOD>TUi9>ksf@3Dp1pPzfLf39Yz0W;2D42Ir=;0(j;tEiTy#+dz1C2ZHx`2bU5^s0e5CM}2ZC^@*dBl(XhZ(0YHLc_L0luRST)TshxaBpgHL%QX# zs0y5uNQf~35^$8)!n_?(E14Vpd@zLUvp%e?bVljw8=mBj2s47-V(Lr}_s|J;4mJt8 zpKj*BZpdOR$8x&Ou<~l$L`nH{~Plm zrqJf=E&GW^!}_UV{nX3a^{{?wSU>esQ>p(+`YFRXU`z1~)|-c=hdpM%I_rDSsngZ< zE&lcVv->7}mgAQmc5qINzA&ZWX^WuNyy%Med8nnrKNBV{2?OOXiNnp+c`w7#^|BLw zwU7ObIb*27!<_!~x#fkCPM1bH`Ms=w_J2S8{{LNna5{y)3j?qLE8@WV!yOQ4*xfN1b*oVAY|j- zBKT$jb5mvr;xIcs0>X`HUX;>Gx1_cYt6|WO^gc{aoXA_KDG zO#~QQGXlsA;p3~Fx-2=T@@)nR0_CHBp&&qw1^}nq1_}bDy~tQ=!5#r`EdXqAWR`;r zDo;uojIe>kH6FiOgze)GD>kYe=n&?HV=wi0(BNqR$KD3uX+noV+448y@d_?l$m#x! z3I#nm43X$wAgEP3rXdNPm@K6Hs+Sjlv8@3^*MKA9^GHtzduO45ATG%yrY9aR8*!dD zvh$3FrZBG8M=#Sl==*HZsSKz&i&SAMC8O1WFvh^P6=TlD>ehbt@TWjl!Yj{W-I5e3>j{o-p>)!>ZUoNZ@e|3T}=k2jWiW#tMfz?Zo z9l>ej&%KHXSYI$fV{i?eMw?0MX~zq%%R4Xtr>j^6{%Wvb07O%vT?4lJ0kh`iFTU50 zq%}hgENseo?+08fS?}F3n&I_+(t*>=Z7dq-Kb)!Vi2rF&sA{MD3S9wcA0ZY-;Oa34 zlMgelNFIQoh`c}HVxU*@U;xOamt@UL1p&+ej-`4NqxoV6SqXU-BGHe`P&WFHp|yi8 zL)>WN0L24?;xs^o8vYwd`2!&X@2;&tzX(hLNej?(c`Z$OQ*~pzJrFWbJzkc;sR({v z8i|r}KHLEBd?g!j_03TESMBP4#y46c(rZ z)a9x2EH3jT86Os%Lj^0v!g7L3Ex#)FBfElxzy!wy$CY7tppMevi~t=Q?Z}#NLyb(l z=+#*99F+s(?=!{;^5HUqx(K_TV{OQhuiql%| z*;F<+o{`QnI67dRg|1w^cDb56y=S*O=OC<8-3@aD6?$CEc@xJ4ZjFNQbKI|N zs#=6AjWTm2hLha&gV$DMH49VJ?PmVAR=P+(G7m}J`8s^B5%^_a3q+yi=#a*SwVNFg z4;zb5@2obP^ZGtL^x1$wZ_SfAo2Gb--G6U(diUw4w>ERpimiKdk^Zuz2WPTFyATIX z513eL*p)0tK%x0L^>mIj>ChR4#g`co7oP@9C^hUzvYVHUHEDisZQF;rw@Wi3&QB8!D;b}?-H;J6Fn`nj)m@nDxN=fu@3#H&dD*n^ z@p44igB&?@sFNDi?TR)}0mSeaOE5v-7cRhwMW7UcCFCb9ShK&llmxRJ8)#(okGT1V zZHUK#8o{y9;TX@~X$cM!AO-4fFR4h=$+{bTLlD}IA3z?Zh8Iv@VpJq4qavX;hk}xO zD;4r!Sc8%ub+Xf7g;Vrl3WH$`I`qdCH6qrXcWi8?U&Pp1x$AH143J-tQt?llRA`BI zSqGFTOl(uZ!7*w#>_fH-50FvE(f~5hOcNuR$@YR-W;>9@+t{zSwd9v?5x*qbz^fw7 zuOA&S+dFNG1~Iy?lM9BD&_TMS0Vu-F6J3*0iUUarAz*Wmn7y)o9Z*)mn?_-A0 zk9tzL z>>-OoYSuvx9W5gIm^-y+G58sCj@z`4%q;_!eM(qzFyn=!jBu_CX_ay{MY58kSLU#& z9=p;Vj3O#2o}4Gm1L`ArmdILTzP$E=Xso++AqC*g=L0o@u9!u25(%7of+4F0*$2CP z4WKbg83s{Fw+crE$VI&Xp>=iP)yO6shFyAkoZ_KweHm}`o0Mn}6Q5mN*eiz5yaHvLalTO{$T7A6nUe_jIv(8rU^)ccyHJ>rPPxPLs& z>Ogd&3EY=1^t^G{f7$(^)18KC>pd*K8Wq5ZaF)Q19?WnNiw5*>C)PJud)2?i+Ku=h z@Y00C+k2bCn;SZmHekR}A(v1GG>j%To>oO>GYat>5#F;o8xXQ%C!Bb2aVo<~g*~?j zZKk`=5JDXPgt^r~M;rc~=s3_OA<(rIZC68jQU9lV6phE-Q@HLxc)aj0)VdZPdXuwo zE20H?0=FEVMbI7QMO}2$?-0LlQ576>;Y1&3k+x9ieplVIkFKQ&!P^8KUne{!B->op zmJ4?px~k5!FO6)le}0`>;aDU>TR8=;gY1e-z8d|IYzy((f`qc_J`zvS%QJP?w>)vv zAIXWH#^-P+rdg_*9S=KwQ#anh!yG7k1P72W8L633-~;%uub8c}-G$OOYJK;9JO59k z-YJ+iYudaw3&W;cZ=F(7U^?TpaoH{1KXaHy5^&SO$o*da*(sA$yqJ~`lel3<;>O+X zx&l3`jcFE%JY}}9h%504hEP&p;5j+5S&+of0;jYf!8EE_t?q}Lqui%+ZQ@6aoWw!P z8S~dTCZ;?Wj}(s3&?s%Y_ZysebB|Ri9%sWca+ZuSnb4|p>YEYs-r)cts$|PuKi7Hl z-Z$kVEk;@ByV)7%$B*LYt^aELUpAc?v#3R2t1xF@Ut9()*Z!QINrM~AS-0&Ot{zS^ zW0S}yT=akW=k7+^ej~1`~ ziPc*X-VE!bhWqCvQLCHb{yDM3{d0a*BK1-q#Tmsp6)cCrob6q6)itvMlLKZm&hk}e zZ-1-&>or8byRO-WrG@4?9#BS`!5XB$e@;D@`sb8T|D59305ko`n*KSt)ITRja(G8V zx@4jK0a(2WHeQjW75-ZPoP#`%G(kNt7X5Q3g9}c!0nPGiUJ+PJT)!5DxugW$3ck@xvTV|C~z!Xn+#Y3A3ZBITxMg`Ugla0*eGlJDsIc z^i^qtgNp)lZ=iop2m0rHj4m5DSpS@kb{TrnEX$5t@xvVHkLbrS7oAPo6!H*-tm|2T z|3+$wO-(vb^jIbfI_8YIm!uKsfkXXsK9_c?6|IUmEWBb_#IolRK^;j!9eZz6{~Xz} z4s_Sq(V4A~waagQK4-C%M!x7ITZWOB$~xMeTb0y5CkXGLe@=%K-EuG&Jz0WagPJYv zY*Q@TsKCpcSh&Nt<41YOu^s3Qb>l5r$1`crvpDHSIr`_^$x(D3n=Ab>&ObZpW~^+* zvA7$PR&|*sqpQz~Ecpub&*@XhMAvH8@elMG{>}EwGiY-1=EIYVsudxkce}b9tIGI) zeKh)S<)asN^<|aIU(_9LJR|I_TK}+4&i~t!@$UfLUtz?Q+MC15sV>Xlhcq zZsx|D??0?t#Cuf)Va<7Or=_3LuF=G*aU5z|GAUZ(WI0`Ma=tKAivBrmAdSxQm1fyf z51dvsy>UX_%WtV~n-cwV(1J)Bg1J@Hf(YfTE+^k*Xg-sT#H(;oEVPS~6nfE*e?d(H5}`9cZ#} z`0>)W?I^C1h^{Q@4K-S^yzI<_@>wgoASp0ZK->8F%i5eS#e(h{fj&PnWDlrOkMpG% zUyQs=;VYw_KhkAtH2J|6MudJK?P^1#9yzYQt^nVVYgVWN8{OV)*tu=%Hl*uuB^B@% z<3TmU2rXO*VVCx%TSC5r|Nnk+S`cy(z}!`3cqbQqgDU^Lma-G~YswGz_E$Z7PcoKl z<&4HN>r1gPy8pP`0boaetSb3!+_l;8MN_PJPQ6cIiYCJa4x_1w$^X%ETydlCe%+;o z9L}b#BRNYx8FOe_p2?2aOsU)EIS$%Lk{MBko2P|}yl@K<^bKm2FqVVwugZ!%=~-*`E&Rhs2AJkZ}W!0%ey|Emk5 zI63rC4ShL+qngU+sHXVXjO@RhP%@Mly4=f~M;VM=i(FE8$W{o@shwo7cC59U>IlugA@XBwn(awJqY!in2ct) z=b0a>h4M192t_?plVw0JA~YnTbOB2t;Ci#b!k`hOZw9k(C9PZ_yPv*#pl>}t{1bKv z;&J^(6eMTZ#b<F;l^w0^L8!uxU2ME&8P0KHrzg1YZ$4;MA#H_b2g2f8m2WsOEYuSFAf>c z78u4;^yJpK^9}n=4Es$C_apt^>qmMjY{%)l<`z~~cfaPI;qKZ8cXai;7Nd4%el66U zkg(5jzfttp?svEe$+`+Wg*wH;vIEL6JNu1F z$&QjbJP8NO%AoQ}6ndhoT38xdoXtxUz2ai zKxQ4Hhj`BD0_HWB$BB2#d<9R*fT!C2%g0|jm*FW2tb?)%Pobot!BYsGrP;t!@>Xgw zicnJC)h7!v-RLKk15b6mCGB`7>wFd$)UF7BiKikocuLmigJ=_R6;MwXBGC_kO$bl5 zBKXwyBb5Qyv?`KrW<>x`1@Sh@`jSFAvhK#pZUA1rwG?yF2=q3ZbnYI4r&gdJDd8#B z=@hLeVb#g{kzRD7ky$@d8W{-d1|SmkL6t6hhVV7(cDwvG@Khi0R1)UW$khrN?;XNZ z8|b3|u3A%6vS#0!;N15~7gj0A zEw@{fyC!(ws@&XzyNg!mmPh3l9fr`au_&^ka!qdK!!XUT^L3w0pQCV&&_4d40 zxrQ|Ym48|K@b8uK-WqI)ytK%EPiZ8L3`$|mpRrXma&FIV(DJa}(itK94(8Ix-P?*V zxE*M94cR@rODWvnwhw(oF>>U!(lxo%V$^<5k!>T8>`4$5*Oiv8#mK$1k!u@IK5i&| z#CDKvMx}jM<>SW6!!M{gDBFzEH=!7OEXZE%;>85ORr$;WGr+Ytptley!BfIcxG}2a zp-#S?xQp5WBIO`bhE_$~#`StEBIFsst71h*+?|ey8{KGK+E`ikqV&+;(arPB`rh&< zKu@o7QaNd%@FQbgNDI(64K4K$rdnhnIEDEo>p}`-h2j`<#T-qMY!vDiuL?o66v&?4 z`y;PahI7qAl_E_7X>u%A5~ye5mN#TT}C9?*0~%XRQbPdXMfj<{y$szH-ORq?hYAp zGE&!bGCp)DFakY$9LEzE87j>T&Br__!4Bf{ZCyV}A@?{wz=clfzLL zh5l~d%pMhtZZC*Fg>hg-cWxA#XDp2>ckT&B|CWxtmEdpLq zJxocr5@?_{tUQK48rMmBk7{JhLlWkj1XcW>;tNs(@y?>eH}WxV+x-7w9Va|^fCFE>n^O%2mt#ae`m z;^Q^&$dygwPyf#_UK++rj8inU&%tp0Y1p6dSBp=WIkf&XjF*P-(lA~c#!JI^>EDT$ ztT z)mx~HLIlZvPx=1criC>@Jd5*L=P;B^tbVaF@~Ks^a%N~ocuV-ajOZ&q30(h0u|+w% zuKCoOtTgtp-s_PZyrk;$CS>XU@X83RbvFG%WhDOhR7OrA^*8iK8_!Q=d@|SJ{>Q`p zj|ZLuz}3V49mD<||8xC2I69nD{KRJa;tVeX`X;-b}GoRY268JiG*}!pwX7 zWXMTUD_*IX;QQeduEbD~qzr2optVZ_N-k(LbTH4qS!AqQ{T2M z;uQIsNc}-inxN$}U1UtB8>UhzC5zD~TXA!yZ>OoWt=(6u1}{i)1N5ZNiRr|Kl6DX+ zO4?TC><6x#G$M#)r8~eHYFGH0$U6LeJ13x+1EN`kG+VI(3?)=iKtp>L2g;8Ol@K0{ z+|j0xZd9xw3Y$U}IGt^kOp2|7Q9u$T?F*`o%>2iK*cG$0+o}X#tQ-B+;oj$G z9@%~QWX9aqqYAM9P@Y=xxjbajI@v-tXwY-tWzSGu+Ht2n?)^!!&&xp9 zC7|D!K!0Z#;)+52#=_BW%u3sD%(htg4oXq1t}gZ!A!}M%dqP%;432 zV=*uLjqzrndsu(JF=~q4-}1{WB-I|Bz4}{zq2HLG-ZZ@Vm40Jo)L$E2g0=m|1n4*R zfclLsq@h^9F|_V#cI)SOxUwToW@p;zG*S?vi2#g-&mAa3F$2=>fZH_QdjY|EV6H3j^>$l{DjD| zZVV-;%8M#L(Q$n%{5F4)cZM5N7kB3_R7YSeO}w)V;+z57rv!GvA!Nn)#!r^d;@P`!lA zDWB{i0vZY=-;F+`ano4$##hjc*)>+ldmA=jp%*7B_zSDbU(`7Kqi((BFF8k`0XJ6y z@)@+Nf<&bRap(}|i2VrsrXGe_Lpa<4g16HYGa4Amih4EqufvgyH|9uQpS4FW+aYWP5pB-KF zAaJ=j7uP%*TwjmDOa2y!S$0Vdq3Kkjaj7~us#)~h+$XA{-3;k@9w)x_7KiiU5Rn{+ zfBMw$4J)0;G=9w@G&!S}F^kA)6Dj)wdP!;gZuZiGdPOq@mbQZw*M-eRe={u%U^#yV z7c{7#pdTPX!=dqI8D!`U)dpwlwP-uxOixj_-K8H;^8=;gY?zZHlTTk-GnNKYm5r1}6 z(sEAmk>j3U9*=)>Kkr@P%d{P{T>Rer}JQMan2 z$!2R_4_6qTQ!f$DGpfsWOH{swd z7d7AYD!p2L2;j6q76A!{++QINVc4N9d%nK{s3Z91(pMg zZ1cJs6ZiQ67$_MfY~s2VZ(TdNZq66-@UC|%znEsU5KJs^$7)Xc<|uC5dt=`1x00P& zkID&3fcf>g;>POUnk4~1O(2^QYQjd`einC=CnY+WX>wck-q60d!bhXCq*Y1Sf}R|? zEb!wy_x^FxF;)?R&sH>@ET8k`hS=nHh6Zfx3Trc| z18`u7j|dTY`am0H3?-37A@;*i5yo)Bs)fp4h^@j<#?+F7=P$-qh0PGO1)`ZShVmA+ zFQIP9JZ~{W78Q5f-B#PH#u0ik4KFWKo6QqwR^DbBUUq_3j!wqn9klWt)!@J{s<@jQ ze7L&yYLvYC$K05f5FzHGIrV2>|okX+pR5gZ*s(8kbMWDAB z4U41FouB0fAHs~NNH9)f9t*p#qLVSYC1V}I7^=HHT;~-F1~4y2S%~4e;FconQ8`hM zQzd1`RT8o~kZ9OeG=*Lv@B)h>oquE*@(8cA63Wonxx-uoGMkNd=QY+DRg)X(9o&6# zID1@zfK8#e!IqIi*3;+Vr!nX2n~P839ni^I1F#GHcOQDU+bm3E?em zqj%&XZ$ZKW?MhOp$mQ6&-WqVPzJI&^7uxE&;@m>Ql0Z%1$>JR$rAB73M@6xflqX(?sNAfg?q9 zHu9rQEf%1Jh$UsvPpPbeU z<#0Yo7|HS2x?|>H%e@oQbte*$N#B5D&JDu}W(Z=ZmPv$CfrPyW1Yw0vqr@&E#Rc_L z#{FslFNJ~ka7nNpy~IOf%RxmV5#Jwp5AqE52^>eOfvG~G9ch_sFPqbj)0#kF_?M;$ zlK$n$(oVy5Q%bzRzv7e8Aa03_20JFtx5QPiG{wfxWrv7 zNEXg(FfS7L8(Jh;#H3n`D5zcPU5k(&ZAJBQ2pn9OIE>^N8FSy!bF+3`e-zQJ`^scb zC%aLf>Sb}p3MY{7`nMxolWON*t9>nY(ygs;K62p#y>KDeGW0xk+Tg7@-zQsNzcp&_ zeu*A#DaxzC!JJe78h7j^{(|H>-G!gl>vyoc6enJwpBsJ4{lSU8DU-U#`kC3*(^S$n2j!%sxmnkOdo6ZdcYiRqhgjV> z+9NowxU86WRR14AVNO`8peQG-L2!^C(f7s6rryW18Ba&n1>c(I zw&Xs&ATrLqn_ptGr}gx*Q&$w<Zlrv7_n-lGc!^d8o${WI+6hBHQAOYC+W_H+9;`MKdqJI3X?*_QJ;XEV2~ zPIEW^8(PHXKx~c?!lUx4I?ggv016==$UFNYP-a-ju+B1I9fj|*Ho`iZI?1wZ;I#-;ZvabfFs#$2l=(r9oF%)t z5oiX=e=TUaeGJl+bvNH4(6Rz^0X!zIyD{tIuD+!A*;ZYGxI6%I8UiR??F5@35XU>6 zS#rqrJD*V@=n_y=tTbpTDP)44Dg2~yAq1OboqcksoKg9Kc>zJ1i6pk^g7&6ear=2c zl!6h!GsXM66|(2^JARAwsX}e^wEF(&{VVIyBBrQFI;*) zNN;{(G&EpkR^jh)qm6~HSxC^Kp23o_;asGtS2lUU1lUyUWglkb-kqZayed$l8;*U_ zI4VY%ir18(t`TY9&J`n!htR;js6EoBtj!GOXFxaz{3SF48Smm)V+m>}%}GgN9s>TH5Orr{UWciT~hIoKZQTXFYVSkv5Y z-pUKrdat`<2O({S=U${707tuW0rbty_U+d&gRQ*H4Exc36~_t{or@(z?>Swc6TaBK zogdybw>BH(pT69X4BYC21n~wO59Zrf%Y)Pz{@yL-XVE>&78>XbF`yb(+`xt@3hOq1L+;|S`e+ffjeSia%j%A znny2A{@JMhiO)#RsquW+2Cfa9d|S2J?g;CH1zY-1BdAxBjNCmflE~TH>eadw>M7=D zQHw!ACJeO`no1V4m%sK$6Xm~JuKD$1ju_7B_mwF4HqMvrcsA`h^rLljF_@1gr(VGz^{1# zY;fmx?g(aXW>GK{%cM?Q%cCAu6E0IzNoFog3CqC#ig`i{H>(kSFDa`HgtkNP_7)w^ zb%^7+2D6%vWX3L?ZMIzN9T)GKLggK**m$tI4~vIAsedf1;$&!i2O-*!IBMRrQZB(Q zO3W|3C+-)^eA z9L^S|^|C2j659V<%Q-xtKnG}srS}3l(8=e_&zdJ23TpGzMuG%>kq;_(us2Ok*<~6s zdIBhWu3V0*`N|QWjIeQlb()^OfrR54`bojOM1AgoQ>Ts}?}uX^cDmaP+FbpFlR4;S z_3cR44QD{30CFe1!eg;xR!#9^(jo z%xeem*n5@&<6W!BfUv-3bB@xJrfMCwnelj*W3aIY}YMXnH6=WXpDq0m; zzGhF=>O)m>_`0HH16u?a8Bhv-(1Zdi%2$3@Ayf3*zpks#*>YTgZRo-`=msr+E z+v%|*e2%0bt`fW2Xs3lSPW3T!@VhY9bgo_jn~^p(-m zTN0ZI9zF>>tlmmDA9JQ?x!2v<`a{ZHJm9DE`5w(egS|=^!WE((C9u!t%@kM_jSB~T z?y}c;6++C^y-4V9qqH|z#{-4~_&yBNl)EI&f^MSE-Q`Qf8v306~lHNXL`?k{{ez@c)68G9?sM#qJp z>od3*)m69Qh0C31iUVI58PtD9( zP-WsRwqM$W3;DohH_sB)IDf>g#Qjp4Qc=nzWSy{`DhsM{A)vdN_{;6u)-6TS?6rm)jk2MEdlQTxqkUjDE^Tttw^AdQf*!CU zeXBy?T6@s<$aXx+9&rb|ZFPOO)#|V|Gk|;Mb>?{P=t7vC(82@0=^tQsKu&V5A&i}*SyMQ%yrhDHDL{1`&h&E8_1O+7s)*yC-(b*&jl5h}1 zpolsZ0!jcC30NJc-xnoVM06tt2B|uT1O>${j!<=W=cQKgh~f$Dacotv)|qzN+0(vz z_I2&=e?M!5gK}s`XZH2JAB@ecQ`X_h%F6S5{{Q>FlaPzM>QXX7r#Gjx7gqDy@#Nxx@BqMzX36dEauzXukaA>q1Ri${CKxzhGHXyYqRlj*> z6`q;a+y>m@G8H9ZK>P~v)B#*DG_4#;)ZUuFvNI$-mf+UNn!Qeh+o~-o6gn432s#(C zKHtVo+=M`Q6=e-;KgDq$k7oJU!(N>xcJK{MWfx(Ppc#v0TU?n)6>5(hG8l8NrAYT~ z40_UdFsV|QMQv&<^Pm@`!S5X??wtadJarLu_|+blz=|ZlWY1S{3U}daCT9r+ohta* zK7IC{N>4*BTk;g+av}fA(T@9XyS^#sMX2E*ejj6qLAEa&w@4q>7zx@!RY5*1o0$~1 z55CbTh6Jaq+SeNug~`R5MD?7K?7UHpI0JMYY;Qhslj!;mGXE3L`r|8yG~0Jlif3;j zffmCjM`ShE)%bn_W$^`KWSi-ag!(DPO=y2SAyCeEc4yKU?(XVr&Jb~I?Uu5d-=4X4 zmwndo_}M5}YvX?KByo@gJ|0#n*8uJ%d<^_DB*gC$mcfh2-&(*&mXpBV(-f;oaLYRp?_rj_LN3qrdp*XGprVf13Xd+f5gcD%Zj9YYo;%zFU+kHV}T7+Ax_?Ag#c8ybKKHQU1ylCNG6oz{Lh$%tk zvvc$HoFh%^E@NOpV$aPKdCuAtV&y76j{_NPq+HdpmJZoc8=Lzs0gg_N=ZyO6x>2a! zaNcQWVWN}E`1(!NDZyOg(&gvv3{Km(pV&6$VL;31Wgq8Bj1n8q!d5HS5<~v@)$2bW zyYS?D4#8n&XFMP9XT`ySSUOe$H)PNb=YM^nL?qN~W@|ZXlsh(fjV>%KT(RT8`}an9 z%}+JfoV{;@0U6=X-kwJlLMCBygkRf1Y$N=N5ttEv9jOl`!IOcW<0E<^jr{x*`89N& zt=q3e&iSIqHS^LPWp)k!v0QFzzVBgd6@?ZnUvSUuP^yB`i-Yca+`lWc->u!ecDroB zbq5q_uOU0NE9r^t{rNSr zAHTw`N&LF(MGL<+zu6Q1b*m{4{7QMC`|@ip@hh`yTKE;JU#GyYLim@!uX%sSjb8#P zgz7i(|G{YFA3EPWaHzg{_35MkMwEGc^-I6|a6bEUtg_Wxe0Guxl24^rG+YzIq9kP|`79Z%WgWytpp;Ler|`lW)HKL1)?T|9t;% zZP%JseRk^2*L8n;wfl`N#^AJmbkq~{RV1}9OF@DtX`V=3&$}bF&MJh*h*TL9pf;ZK z0zEo-pFq%89TNO9YbI)1xyNP5)*+&hC)6g_B>=cWx`)*PT{T8^5ZzDN!mEm0>|& zP#Y=e3u+?^`XbmxC>lWY4m8l_I~mb9KLSxigL$JCX@h^WJB)W=TA*ur(qS1W4+jTU z0$rCNwu?WwdTRsX{LM%=VxrIxAYy(EM>q`>8j2uRKAEE2o2( z-BBp%;9zdc!4Yw`qyY>R2R5g(YE44Do2CzQpv+Fx;uwf(diR|B#sPx9Py$9uCQaC? z%{HE0dk$zY@MSFb?UEqg3xx;DQyx>~7cPLrDT-5S8X)Ma8vZdYYSbw5i`B*QbSLzI zVSp@#WtRH+HK{v-rg@st_pdU!!Wd{SN0%Htg8py6qRv7=WLw!5acGB3is3W)RPS9K zbL^yfrT~@stcx}rLUBrQmENRKxtU$GIvKnVPK|)wb$9V!Z$adc;zeXWoMkV20IqX0 zx)Ra>0tw`(QZi;Cd=bCW3JD5sG01qxOJyj7Oj!|vc}L^u0SY3|WyVYrUj<;r;c!XF z_W+A#(qX2`HsmpPrub*ftXYhxIY8iT_>jqtiH}mOZx2E_Tj+dCIqpx$mVRf`_Q`LL zFSeP$lBFYRQiR596Nfs=+A6eHJQ>8Yi@>R?uneaz04slCJ4oQW5_FDUy2&3;Ov{69 zH~Q>PRdoi88|)v>p{;^`>YPFfYi7gjoLGT5>zLMxmuR-)AOFIYtSJ~}`0xDw?oy;= zC{DgC2N*gl5KzZBQRH4LfuR;!qe(u^+pH#jyDXPVG0LQ>%cD9`1h5UekcFI~?8`w_TcjSHfZ%%K>I=|uEhCt^yOG%IVv{*aFxLk8stbYxRac#44K-L>0C zbJ;(g!-aU=ne)Et`r^;hvzbx11X>ei+(0Tlz$zPHV7CyB-LM-B_1^G#v1EBD>xO0M zCE-%`T9%>mn`N12uCN_8=~;$E9sD~0ru}p5u?9g#bGAQv@e!tAh2^I}zz+NAXau@G z`w55%bTK%f#%(-6%|UN2#FjIJY@hwtiJ7UUoD$U~Z-pvI+W2dg^nv7r`z+XuiZd?2 zwl3Rx%IGYusVVOWGM6kueP(Z?y&T()XZCju{6ZFONlV&eKnjP2PtIck`;Gn{3;E&|lkW$FA^Jn$yvne^7hm~kY z_;!SENAy|#2W6!GF(<*ZWQ1@32lUz0_o$4c^MRX+nez0@a@)H5RdS{IR%d>fXjXC1 zS7pXhrD|T{75UkcZzZ1RT(v6QbpN!Q;`c(jKVJJlWYf#HTLiwXfj&ze%%BB*^x0+? zE#upZq|YL~$q(0OYbm|S6Z-7m$+!LW*|4YdS-5GJu~Z?HIQun3%~|wWo^M}At)c#W z`-z~>TGE?^`jTJAXz)(+lxHkHn0A6)gOMUVtjj= z_%;*B`V`;#JqF*N?#s82{}b}+X@97rM8CDu|MvSo{q4^2KfQF2F~Qhz4ZRW`qL!;9&Ub&wB;{dTJv8go7>-c^Ea}OPA~j^`>$S4yx8o2qTn|< z2uF1KUptTf7k&}?#CuunvoW&K`(dADQGH5c%I+G?WjQIU3NWRU;z0#PCxWejjzC}w z&`u=r3OXtC)i#*RQ=*`6k*ph~YTE;iA`(gqcE#IgsT&J)Y^@;s>|Q9VWS=G2Oi&fU zSGxoOUc9)ekTx(g>@A`;-n&~Ycz5gKiao z0Fn}^!{6BXq@KzPyl6$BZONjGNG2~wcq5arYM9m1gmfBSH7K6#VKNcgUT4YV)zDM> z3%r)n7HuM}J!%=Fw8iuL4?IAFNsGH8$VO+@fXff~s0CnWsiDinAs zD{yNu=9QXpmVD%8Kh=~&`D@698F0QTd>g_X5zk2@D~OO)7eo40D(S8TJ0)cD%-aO@ zHmj*?DHCb+F-)YLcaTKd?vKZCEz3ZgKRec6`gKwOW5rrnR0+0fh>zQNrIa$2U|G;P zxW7TLSW9q)Ww_XGS^;S7r`aN}(0~^K^&E1Zj?aG|DCm3;1%Jd8sfqw5kt4VE-?O>D z?CyIJkbVs^$Dq-BjT(0|xw2K#*(w_AFsTnyOJz2)xM3EPiCH9dsnk#NCUnvd*RXf1+e9M`(27h2Nvhw!Iy9c66`w zJAv|5&a~m=K9xws;s6=gD&g4l-=4@gaI$XKzdy`xnU;HYMe2F8=JNgd9aCoCO!2<6 zf5OLiM=vL6yL!wRKA2-Zn_MmJs7*8|%@r%O#^YXOT+{XEoaClUE*HMU3+^If+3BP ziFUCe*3K~}Kim4#xu4lid+1sgY>^$2(ysJufURpD0`;Kr`9m37srkQg$vq(^Ul}7xxVF;g%o3QNKguELQ)8bxTc4IcW zvT3(av<7)Y-a$zl!LZKT*8ds9%~}=@-^HKQ_f#k?15{fJ_9kRMSm~(d?SyvQbnCm)6u%?}&U0?5me% z7K^5|trZ1m)zS;{?@KeJK|TIkPEiQHOSz09qw|p@;bmhXx@pMOVDDX^2|zC^7AZn7 zi!5*&1^T=QhD7J5pZ^y9h@Sj}yi`@xH<1TimgJc{$J8PwRW;;y^hi}naT$$$r7CSk zLnld9dL%d?scH-_RiU?rJ~Vm*P^6HbFxQfwkYuDjY7z4KkyMocwFoPU8j$* zc6CL_Pv~!vs$kd@@)I)8B-A2tW`DIvdlcePk5tu3QdL49sj8SVd>}cZaPVyuv_>-0 zl43|zdME|I$o$hhyaN}A705Q2*?|0nJxl|ss-aUbY|_E?PaGUl)lwKXu_C&mHA(-+ zpf>l7{I2|)mu5E1yX~9&#Pws zNF|23)jBECL#XNyJoaRMLS%UpBb*EU~LEi9%hvy7I}UNRckG7Ofh z8q%T0RxPMjnV$F zzxtR>nj~MO`=I7aP)X6ZhqrZ*#4QH;_S<_h+adMp;pXfE@-D0<6SPYxmNl*<;vhex zl)o!XNi5zHA2ffHBxSLnOa61m!82uBc(pHcES)$dT2W_6@wIC|1)&p6SxJ(gJ4!Tl zLqet5KaJ)jRFmoDel?jOEQ0AkI5H;pwTW?fw09JbLkDRE#6WssI7AG%ZGy% z_;6?i@;&1AXZlVbVG#&Hf?CkIs$C^2ARc5Q@3I8Y%Pt6NQZux4Z?gvBi?tXQAVDot zwhmtex^WLT?m`L~x*@kiP)jPJ)Rpk&!ZZp}!NY^y+lX+K(k2ZQ;aKF~Op;c`r06>}k|dG{C8KIS++qdh|}g*|;G8Lrar1gUB)dp&`fCASQ% z=qs%uw|(zBkoN`6!Zxw@Hn~9Gr;mR>Z~V0E3ip%(#!uR*;Qka2?#*zq&pRltk7q8#1Ys@NP$LmDvg%Vrmo2#LoS>NW>F^f7D5AKaO=9TtDG6+`&;@5Fcxs&^-? zI@MX3iJvAR5cWtD*f^4;)T2#*{S@wXdeTvbQ)k#UF!k4@jbF_}RkIA-NgLZizlc6) zL++1L-TO9Pfp;Ra_*B=&h>QL1dJ>NKDP=SIlzuUg7=||a>fNTq%s)|Tny>JJ5ijhS zrZ%o=?EFxFm8QOW_Z|04?2q4M40nEeHW#vVW@$-3_P)hT1Kb^aOIXM1u# zB)vHx)NAs@{IkZ4szVjd+{72f-&jdPwNw81x%FwMZ260Cyln4jFSk!w%Z>KBd)N5V zzV+{qU!A=Fm-2aZk7fWV{FQH6yoo^bqzd9w`++}%-}WUfO8VvD~TS+&rbS zAh~i89-P9TwKb35_<7>2tw(rzL@yoDOR1BDU*8cwumleU`VAfN1OJo#zz-QummVlj z68-+Qi$OlKzx#!3h3nZ*H<~NtJ956>or2h)rh`{x=E9vzmrUO|`E0UtaD0sPki5H7 zY46|T2Nrl5i7^>ZyYV~?E0TACiFle)ZX*8lg2ZT2DBVm0^Ymuq`^RqE8PZLst@@4fcpr`7@rz3Y`?zPjm|4v+Ln$!TO1J03OiCL|=lG zvJUt)0b9B{bWLIN!V2#)0F;c0RkW*ynwu%;oFh>pFVm6l6cLZeEQ3fXJI}H!aw*<{ zb4erXr|G)f2a-;bl5&Mc!UqYl3f-3|vVJPDt0X|d&7=mH%6OiJuveZ`B!jh&!8`~Y z2XAU-N|{DY2M3_E;ox<+z)VUTvt8Eap@kU`)=z00WGMe;5ABiJjHg-d9rA>d^)rK= zl|SBLQOelC(E~$DP`I%u_f8%9SeKic#Dp7k3|QTc%swZkV8a1<8XifIULT(3d)H)F z6R8+aW1z%^J{R<3ksxJ2o~Cs3uu34aJAKBkR(D zl<>-7&rO6bU@|Fsh3K-QewGp}!Q7YVPNVgx<4?;vQ&4~a+j*mdxeXmrihV3k*(RfI zJas>}$;vgrKy0_Iu?@J$ynnK`N@8pxYx2ipifn&>FHd{+=V^r34#v|QZ`j;oB7*Y> zRiTx&#l+JXJs_S&1LMU5KNa9Rv>uR+yqY_B#y&?YdQ6NkWCnGqcGPd#?zQ;I7RwuBPx7+MHz#T$YRe% zG{cYPX+nZB38CN6YiAp8ipuRzBxQD5>*nu#GS@ODCRxqB%!TGhwIoq>>c)Djr--JZi zcnF^U41E{N-ZQ)`JD!5?L+=UvgQf;N1b66?6C?GNiOS&V9%E} zzT20Nlmbij9q-X5@{{7st3lr(*gW|ANlrt-x}+EnAS3^oAeHPB-{Us;-ltNM-^BNh zUcO$x{qx$GZ>nFg{!PcYw|9E}S}of(UjDB)W4Dzpe=8w7|3w3<=Xf5}Ux*gb?+~F_ z;~!6HR6!Yy-6qe?drs_$yx=5{!SHPAd7o*>f)HSIJ@H}E7kHdwa4ff2h7tBqG63n7*RFZm!nw=#JCvU+@GAgg=4jJ()g^ z2x75TBMslJzOLHprZ>sLcc+x9wwjF-6%l*&u5op!JfC^wR1?O$-Q!}Vqj#%!sC91I z5}Fc4D!p@Ef~W1(ik2wf>#WG!CU5pIj;&NjNzdXJQep2FS1fJC$EdLL&UFs%@`&4^ z@{yn1qd(kKUas9%ms_gp_DYRXL`VxtRd(jM7)8YF@=mq%Wj&s)a#o(ESz;W^3zAmw zB#3A*Cl()N(SC7}HPg(L)OU^i@idhaI30f)K=Zt8SrFpm%pP<62C%S&6-;uu} zDBZWUD>r-ctuEzi-!A+xUkRG_w!V$xEsAnh$kMUh9=%Kc3MoIe?`)Smv!0f<1s%*^ z8!pCnl_$F78LxI?*~AmIK^ZezF*W%?mvYsNTbSY@lSs4v#e@3n7}|67U%Qf4D_+FZ z&)p7g)GPSt4$QKR`R2j(%Ehm4S$j|t@tXsi#9@WH^EGy#9C+U=-6_YhZoz>AJCPs2 zq-j%1_wrW`q8AvBPZp*gsb@Y?&wS{dWPR(IBY$m(;*$SgKb&O<+;wMTy6KIZ8~<(W zw;dT@d8fE1wFj+>jodc-oG9SIp{5UmQcDhWM%I< G6nWMk-X;_~ltrL|W0$3K${ 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

3NlI$_9;7n?3v{l-`>@msKCNWz+ zZIh#?578LxFtkmEcNA+0 znf;FF9$Zv7!8i!P?7P_O*FhTCg_h=Tb-@i-b9SW-Sbd$g8cL-+U9)o1M&o|ulv}%Ej z_!)P!YRFZ$HS1b+4KNuKA~xOGcqOOOYxxObCe-2(^B>wt2e1Sz;0nUR;G*3kwUu~{|a2nu#55O0o z=tGcJVZJSoef5Iqi-gs*hAmHh22lMQ*uU_iE59JjuTt~ZyJ6GGdNFuv$9quiYi3Yo zz?;t)o?VjOUXLof6>ki5?mzBboTOk|P#>7^7J+&FQ_BKG{pL0zgD-6x&V!pLm;~tE zZdtkfMrdRL=|dmC|8P2ouW0an5tPW=xELq=?knnveZ5u}h&hSZO7W!uX751<&3o8K zzj^KN4Et}EbHOpA3Skrr|K@kUd2Kd|&Bn|Bv`?iSsd$WIOlAIVEbLujFY=OPBS^eZ zYqoL2I7SYheZ+@h)@AA=I=nohzgmf3&P540f-yY%yE=M{r$)>))>&rw*x{u|Qh?p8 zAh-JcV&;fn3${#}P4;GdrpI@@?Yr;#GzYujc*C#elZi(+j#Zr(9-<5JyC0u##7(MPv%x3W~Cec%{niTfBP;A8* z0;r*SA~ZlZeUUjfBUnq;`!2Brlvp(Zmt@)bHQ&z~n+wH7h*ge8wmn8`@7dmOjV%H7 zMoNg>EQkzO<_b66Vl#oKs-jJ0RZ&n5U!xh=|L7`MB76le@TJ``)mKeJzDhebu{@&6 zU!?2&F}KF6EaO+w=yJeu^d5PYrTk)wNE!X`U7WCxc!@ts=(<5%%r7M}B~`kKUNt+v zm_(Nny#!Qc3DuKzZfm?%nY9|4&R6Yf(KfkilFpS}ScI=YDXuz&7ThnUFlE?x2YTom zFI9`*KeVVO4a$k^;8fA_2#qzWv5Ii7%%o!Sq!m3TEyyCKnq|)n+qflfg*2 zB<#P{A7Ry6V^IoDozPF=u6UUZ-+6>4URH!#2$77o+bS7x_A5<;U8ya=64dR>l)q|= zdg@DDw(JNC+;KUEg8f$1T4P2bN;YmR_U81;&Kvnre|AJcLLU)mHuTfKR|vPDTQR<=jK8Bs-}r)?i0?iMXZVo;?lAMT!_JNoyEj#R z(@{J9%~$%OSD;`tw`BSaK%>rrhb!*y_t@N$kH8PwcE^OdS!p-l=G{8H{{M#|@ z%+I}OEX}icYp@c6ggA>FktU=#@fcT>Bg0_O8K%|>(e~Qr`IV-}>s%bq`H!XhoGGC3 z2W5*Lz&{YVJ@F$pnSz{g_z|1i9C99ZNPgjv_zXW}vj@NR6%LVm9T-|0BBu_1ENo&N zxu@46YEp~DpKFuT6=hxvJRf)k@VaA29z2F<$+094AB(b&BWL+>B&OllxR%r-H~Uml zZ=XuCPJMEw)F+w={08v0`XqXsMKY-oQLje$X`OS(%{+%huV$nUG{bXqqU)QJSbH8h z@h!+56i>9ZH939Tkekw$P)Qk}% zlCLItd>;7BC)K8a1YRgqeTzs;8bxYkF^TdLlA%(f2g*piI-1;zuECFMUxW6JfsDrx zRg5JyZ9IvmZ@{l+-#~8SjU*S{NNUhT@HmlV=1oLvZX&1dBvPv;kyv*#%9>2h##=}X zm_l;q6cP*nhIajpo8M6+KYw{r#2mzq`>qr&70vWza;>fE+4c3!d zyPia|jpWvQ8*O=q#J-QoY5oa`TAz~p-ls&ze@<@27bL|l{Mgzqa&F#5@^#=%Uy`Wz z70UREoP}SJsMtePZ!bC9_maB>KO;8mTT%zUB~g5kDCb`!j>YV3YO3et}NkX76^B8u@I|n6jW!T5GhjyZJR1o-P?q?{yyPuzfaKaa^a*tASiQz5aZVh z)$V0MyIvNe{(7OD4Z@wjLD001ged(|P> z=s4RRM0la&PFd{8RgXBL%`%7HSmwwLk2|8vlMdBi?ugCLIh6Fg#I*Ge z9kam^4c>65$D58b>rF?V^p>L*;%AO$ZF0owcO5!?v*WJ(z!CF9QXU9NQCwT9=Eq3r z7%BRmAZ1b==`5)uMM7OEXVsM=`xHr|PLa;$Q>2QoFWmvBNoU*X(miyB6c?Q(>FKki z6KW)BWFx5(8%sB_iBt`mN>OpHRHZF|+exaODCOWpNwYdgwe$i>&s`wJy`81(^%qI& z{vyS!uF~DvP0C}tOY!3+(kbsHY0#z8S$L_Wq~6kP*H4PN10=N>EXDevQZBhlss+QO zcr{g0uQcf_O_S6$T{=_JrQDGzT_+nnW`oBOQf$bR)H`1~^YSGf$(N#Sp>#?MrJOWQ ziqLhE(ys#z_{Zyz_C`rtZj`dqMCsJINs5)XNZK?-%B_Esbm(u==`j^QvN%=BTDM8j zbb+L83#3^5kfh}crQEehItTwDMZpu2;-8dq{nL`_tdMf0P!Cy%?^o^9EeNrSJ>r&n0Trsq% z>n62yX;&9l9=O;Q%hOz1ljb_dr@PcU-E|hFyK+gUE2fNeY0pSkw8(eqP`)eY6}XgC z=sHshU7B6!${mHSYFFgaxFXjbI?AP@QLd;p7HP-2V*Cv*&70uLgd1JTz7cq$tM*QG z#lgw0dT$CQ=LuJ3 zKIw{r<*u`Bxl6U4a^>;QxMI-?myWD(MgQl(&vUMuyvn5st6aGe_{b_(l|S#&!RJxV zMpr(u(N&}0a%K2!S8ROOb>Dc;m2vO8ZqfU$$o{~U+dgpJ?OR+q;6qmo-s-wrx4P8f zBUjBi?9!H>T{+rw6_!4yo>1a|tLP-9#K;qsyZ1z;9ym#fBPT1j!zs#{e~J=w>nYlF zsuI&1D(ZBm5{<)(hJ}^*5jfOHIhz_Oa?Vy_Nn_<++eA_Fxk}b)u4q9^r5eX8%86HU z7VxTgr5dzSl-CONCMXIgDA6@pIV+M;W-sOR?WI)hOBJ=aRLMcWyDwEv|2~RV_EBP8 zU)0@CIpg~&TGUUugZnEnFGV@cFH>UnAVq5jDY@x#rBa6|`QDX^_Fbvml|z*rJY0#1 znaUZLt=t_W6b;T%YI8359jWB7tCc9oQ|{(GC2AKaHM3C3W<|#w2aHm3!zkq> z6)Rd^tkg**%IRF9@$mMXDlsgnI4Q#9i-^yO2E4nD2q^k~Ci-O~>V6CDdr#4h_t5_LF-A5k=fGw~ zhk@sQplHtrklz-Jfh|h@xJ5aOKU6S&l#{Ymxr??cx$Gn5)ZeDWgpZZ8^JDPwiE=7- zC_4R9KGD(Pbby&3=*@#q)vyyTOT&zhO>#%8fjzs%9lGu|(l-&jO zbc3zboty`{WBu+RgRlcf_JkeQo2YId*pGckcIZn^YG2qF1IRfr0CocGKG=TF zs{>(2q>xO64LCD}oI|h!XAFk@HyHK=Y`;ZUk~?`QspP9j94dgVQApyA64)oDDF0eg zu-nA6n@N>VB{2s!*BaPc6*I{_@OM%Vz|Pt|n`HC5h=$A|wexP+T=QX*%_n#8eI!Oc zOs)%?>g|7!(_k@)#HFyWmXfm+c;7M-jbKYneTrno(?mm`A$Qj^q?W*zTEBvzx5!=o z9BjzvNOpRjXu|U(cdjPdw1%9zFOf`riRhWNB-*`9?)@(ly$XB}Y^qe)Q@vg#br^Qk zjMqsudkbkkBt;*Q=(G(!!p9`$Z6`GmHdUi9VejrH@xXrc%K_k@NfmhTH>7aayFv~N z3Dr4Hh&Hu^I`SvjGEi_sP8FhA1EDtjS%|@B3UyIfh{cVByZ>w<7Bm-X>Ulz36ffL_ zRzlTF5F)j$P(9kgMrtqAx(9d5Mq9z zpp}I}yjmn^Ly3?VjSup_uq~3 z=0YBGQQtknDVir}<~*Tt?iF&)y@EcwSEv>9g`5uivs1YclkXR@)`Nn2J_wujK_MG2 zfDOAq$XT#Sr#>W{^$!U;{E%?lEfUU}e+YT(BWUX*LO%V7aGNdx-;WBh`&s0FUO1zl zhy4mXbG4v7tA*_Gf`Bc7{;hyKD}>nhx}cBV5KhiU;g-K8XyMyJzWtt1UwkgyIXi_? zUkKUn3ygu?g1+4kJ6SpIq*{(V_D`^Fk8$YLV;!;Kc!yS<;5fTZa75=59ol)KBN9(` z=*+r~daABNr_^)All5R11LxIuD0G@5Iy7*cq(3|2tg{?C)C%@&Yscx{#u4Rh9p{X8 z4xQi55v|%gZbf^CwzhYiW{HldNOI(wZjLzA+i{BfIO3ud$6c7>h=Re6YILPTKMr%; z^}`)?Fx3(7jdJ7zC5|{;;?R*&N2Fipxa%f3Ds;0Wl5clt;|xc9Hq&u?&vL}PdtfKe zbJURg9qBB9eY?<68yQj(Fe)N51!iLn((G)%0Hu&HR_+ z);a7rrH3809k|`k@E?A5oRvR2A`^D?%41+(A1md$Vt zp`@l4!uGyMQiF@6n+iPoA}Qu2Nm`O5<$^9!^hidY?$SBbT~e(c(rMR2QaSMM9#W2n zjXkZGbT?fp)r`JU9_lM;Htg)?1EhQUKuOI8N@vnQ@SGy4U5a$B2VM-^=rTzcT_&B0 zz_TxtYUbtA&4FFMdbp$w!=;>(D&4o!!9%W8Z;zBtbJ*X>`O@8%FU9Txsd^MjcWR*& z$BvRJXOwhTjgrpbVkx&2OZu!Ben5#7t4gIarwsJbu#HDc)%6qrTrL%Ijly&ctlz5j^wdX)CbELa^4t#;TB@LY`-K}$Bzt5A@W1dupfls;@ z`R7Y<%6-y(_dcxR4@xKTLGZj#I`toxwB{dDp0rp}mnG5}wM5b?;61>79+l2@k4idq zsdO%0Drq5oae|8eQO^|&PUq;%Rp37G@$0B*TlIvL9)tpz>=JnJdxtba;U{?pQV z5PnJXXQh++EXLd_>Fio1DeigcT=+c38vK+=@KertK{{8xAn9@VE22WuQ!h&As~6$N zt&vXB8cBbDNjk5+Bx(3MsY0(vIqVfl39m{g>s5@M*Ccg#O{$02OL5s7l3Kh8S#5+2 zHcB~eqjXPrONwQ0N%tV|&`oILCMl+FlN9<`iliMU%Hon zC#mE+#C<2lkng4Z>U)d@Ps)2eDQ;J;{6M*4Og&dVT+em0PKDoahU=_41O7-u*IC@q z6`zG&`Z4SZakeXOKHC-FH*uwVjw^b!aA{ZzSJZ9g%Gs@4@qRm(wzqRt@Aj^k(Gh-5 zM_0U@?7A77@L5V+(d$~*X*k}cA=kOivg_b`UFV9fx41Om7S|m& z)fIbhb!q5ruCwJKXD1{rM(+S+a(miU8=rCA$tzs7bfqh{J?A=&;GfNaU$*^u*O|E5g}vj_q8H&`y$l(y zbLEzGE@i&rip;lM+6#Ye#oMk*grC-Iv#XAWk49TuwG)2YGWcmbx4LS>NAM*-c2&I{ zXx|Rkefm?^Nx)|5n9p2s2srt3S2W)VneBAl>wy=4;i_kMx%B!j*J=KxtDgDNrE7P) z>YlG$8nnlix9oA%8DG2Nw0*Ao*|)A3`=d)6e{!8;4!LULAy=$BQPJloD)|(AzEA(G z+)fRZ7!X!+by&G&@ayhuq{OX_6`j&Vxf7ZwxuB^MdoNIG)P+hUUZ&h9;D5RBwO+hZ ziCtGIRWVG-PQ#URcsP8@ROJj!RbmT#uksN}ZX2Q0lpOdJ@V{2%DrYKuup=WCg|Aks zR-U5fc}g7tF3wl({(Sgih432+mFNp!Y-W*iXOB{%0>0Q5_+l+el&CXCsaa!`=sZ@b z&&I<4yjIcE*D87Jc=)U1m6Hd*YsGc&C9hYs@OmY;!~a?gKWpPuCC2?7e%75z9D;2ArR1J}DR;$T_?tf~vEqnQojfIqWk@}t zLewS{Qp0M6#OT@~xAeG>JpTBQXmdiyIebD$bv-de>rV_h;gdq{rjtX|ux`kGpl*m3 zo)U7>>xF3dsUdgfX(1{V(~z5YPDrIR3%R|| z4XJj`L+G>shJ5OactX=>$D50io}q+ejzbuNJ!-k4T++(kei(zQvEYRZja26O2`ViO|wI)&WMmm92r8Vhnz`y zA+cmqh?Y+di5^ozlrkmcz6V_UZy~wuZy|T$)R0&`Geqyr42i~fhG@c_;PtMMGj&eL z-7zQREW10T8qE#K4flj--#sBGb6!Y3F)!pay*DIF?+rP-fD`Wvsm1q&XvclvxjZB@ z?}yCq56N8*gxp>WLZatmA)5VINbGwY{5}z)RZoPRMo+>CT^@2SSstS2mWNcAr$RL7 zsgUTpHbni`hUC(hLt@suA=&8t5VdcNmK{~@Guehi7y!y%e}Qk>{@N*pED zixWRy7Dv+t$GOiBj-$5+$BF$z<0$Q_I8mAtCl}?!iIWQAsI(x?eX}S|JXsn?ZnFw0+(~g_?LBeMs(EpA^}TVT-NSLTW>K7T{6FF-^B-|y>SJ+K zXIY%nb6K32@>HDM`BWS|{$iZl?bSGXcSD?e+NL;l<@<58U`w3adPkf(>(e;;@Uu8~ z%g#7@|BE>F+^#sYIae~F2EKauAZ)#6l z{s4>HS$vVjLoLp>xX9vh7EiKxy2W!We!$`-7C&uqg~jVF-emDMi+5SP-{Qj-ht4zY ztYh)%7B{vy-r^1xceS{;#e*zPwRoh(r50ar@f3?^T0GCp&I%4q_9LKSwNfFE!!Jo(3~WS+3<85?u>mv{tU3V$l@^;Pq283#j`A4YVlT!cUeq0L*`E{i|bf? zysbCMhBNz`bd7C%g2g5_`rmJNo=snDaj8xJYwg};)A{W_-tzgs)$ZoDz5i~z$7dT^ zR9L*%w*Nps6F;}V!J*3xZh^CT{_GiSu;1>zHh%GyCVs_GgAb$`JSg2@zrWwJ;r$sV zesZS4t1YgZWx`u+{&rWH@G=|kxBGe<9&GtvWXtPm%Q3m4{|}5d&xb8`a4&#AvHhJr z!o>UId}gi*AF{a4NE3dwz~BZ&2K(cDp$)%k@ivQ(we=-gyr<0MOSJs><9x0SueNxH z#eTbsY`y+Cr%|Sy@wPk@ivAxo&pa33Yw&v(AH<$Gf9l+4FzzAfPw(4~)p(@ErHf2_ zdbznuL9*yQVJ^Us)T=soW-IMw2%_nL6+`38@^ z&)|a=*S+6_^DOT4fC(?LIPpOfo?`K!1t#48AEy2ai`Q6w###Dai#tDL(l4|4h{eSV zO?-uqA2#8xGfla}mKc0+mciR_|Aapm-D&VVi%lr{zv311JO+0>_%p@ghMP>dm&N-n zjvXiCx0`eg-Zi+oakBD5L-)tY@moze{R4w5EDr6k={_~M?k5J<|Hxo}oGh~S)p_5< z_uXu;KTZ;DzTZ1ej{Uol>*m=8|8I|z)GekRd#yZvwBgusa*>tiZyhJ=x0!NhTikrR z2^U#BbdhOqro|O+o}?3mHyT|2mcb@h^ncP?<9GNm38z*LC&h$|V#2Zc%VX%QKc1-xV zm~f=LW~P4S(``6Xz75C4&?EI(`k!Lx$Hasq_1pB8OdDHNmRFsYCOq(JBas;v`{|e2 z@Y+%%q2&bz@3VM9p$XS5GI+x%gZ=zIPMT^YFxui*8yE>J#Xc&3HZCwNnrrEuZG6av zpSIz-6HWRJfAb~k*I;nxc_u!`;_B+@j6GQXY_xcvP4CxZN{jv<|C32yrTP@yc@qUX};qC{28rX0fi<2#0Ycb*834b=&^g0muci7UM-X>jaJ#SljJBw2+ z9%}I_i+`=2#kT%s7VphA^~JVl3HDj}vm@2uAJYw9mu2u;o3Fa|;69AbKg{CT_V{u; zX!)pR)77!KtHr<8p7mFodNx{IT|HB6d5PE~=FcpP_gS26^A8zm=sHp0-%9JxRajhI zJ%KD$KiYn(PHsnTG4=Pq&ETfD8|>uP(d8Xuab1gJD~bQUYW~BAP5cV%{Z{qiJJ?ly z{uosUag%P74VT;SMvD`%cgmlI z7FRrN!rLtF@QewMvAFLF6W(R9`>YA~vUr@uh{Ev{|l+r#4V7EiNy-xVhR z^|rhz7HcK~|ElY!>6WkmU;AmBZGUzBwBOSIXg?jc<$^j95=16`yan`at&?0h=* zA12=KrzLjYtgv{k#r}K>+4#v*^i;@JM0`G}#B=0GcC@sI5rcf`;~M^ zqCdP}z%rd-)6cSaj>Yq0%Hi?C<(J3ABdW>|&t^`);5Vi}!KPpI8`JY>7V?K>5;tBXKgp5e>Pg&yNd~Lw&8s?yx)coS$u4=Nmtk61{OEAxP`^- zEbe4+t$R(rN=zUSo?_ygT3nqU+HA5(x6I;`ZZYB7Hs7!L)z{B6>8Dz}?QbSL(}w3; z?6N#frc)O3A*>H1<<1J3KxQE5r2K(*tao3TiTz~&Bd4vgvEl$rc z;Xk_nmso6eLj8HSc7zE}&M|nN#S2E6@b8^>U2XZ-TinZ*@3+&(4R18%&z)fK$eRpK zoMdo#oWYsb8r;j`f{7-)$6~*{aIUd0CSxJ_=<{@Y8t7B8FEJ`gU;dBO5q|niq-VXi z%+eQQ_|N_BvyRc6<|*}Blm7&C!}-r-{Uw%Ocyp9KzSp~%e)=y_9+zJfpkF@hf!ku~ z6D++y%K!U{ORk75f8*_@{3&&@#+-WV#8~>^1yTC=e|37nPd^yxx&A8x^qlKjoe)bO z5}+@?V}6@h`jr9t#s$4gW9dT!^kaMed`T?*ssR0luTLHuOHZ}*SFtd@keD(uwtWdt znD#BlLU>y)-4;vV_oAU!)FZn4relxlpJkh)^s-4?bNuwTAwA3I@c_Ncv?ViQ=}!dc zkKQ`|m00?d0s225i;t8)-Il*RKtE^Ek-r4j-k(vt%8vmP%y7)wtL&|iQ0q5EU$69RPau0{{X(#tJ< z1=##k>pSczXS5encNzY#0eb6(JEuh{=4t!EX!|}ZZ#Olze9zK({B%s{{JuY)?n0R5 zD}IRPA3C#7H$Ol3Khve9Gk+JR?&;(6I~idfA8vqtcZWrv#?tFpdSlc#YirSyhU@76 zb}n0RL`;A4jlP@x^dG@+#2`&S;5bY6HWQ6p&qYa z(XS{-CA5f6f`41uk%&O*jV~9OD{wDJ$4VA9;}<6nVcmt*Nkg@)cA=ueOC8Wc;PalN6h1NwM#^QU9!snZSpNz~uqzQ_I*(iPV&5vB` zr|*OG4N+Kmfd0tl<8ou^6#@FkC%*7jEPZ=`KKgQ(-1 ze>F`ROMjz0Utyl>U9_lT(BAFp3HX=nW3{xG$ET6rhW`@63#)r&{`tsPD_+ zdAXIj!~EK8>Sy}(Iq{GA=@%l*^-r+$7BH(r@2+H(Q0cR5m&t!4=;In*5w1i;An7MV z&p>&Pe>!n>EPYv=vDcY?IQ!s&SbDggp`U_coQ!Xd;y)?J$I>@i zI_sNRGf$i3>$lMe{~7uB1?U%CdU35Foy)J&-tf=*ZB+Z(`(yP}LV$kqag8>|(t8K! z6Q2%0v>0X9VcwNjtj4(w7D3?;iN;sj>8p zmd^Tdc9#QbzP{{?u$E7N-n!07*TvG0OEmJ~{CghV`jJn+9AVbKCs;b`*8$H@x!Tva zQxRr**wR_QjlH_xUwr+Pi7@MrqyYV`1>DvSJ)B&%I_USyIw0=3?$cNjP`}sxR#?r%<&ieJ;LDT2N z>bIl-{r>wphhyof0s1X+U$a>H1WRZA*z}}RUW(OE$NrfIj2n2Klk{q5yqwLuW=Tz1-4S|F?ShmOOtwXoYYX^;cLr>)*6x?e@p&*EIop z?bA9%>`!0+ZnSjPzvsVqTdP?8x-USVbo$i!vGh8fO#4~?J~aKfJA(R^^-Ds4zU0jF zGGgidEuHmmUfTLezW(&>$D#oJ_$ziSjit}9bk?uy?;OxRR{t#v&~I7t&ZJoS#sEG1 zbNe~5^nI4j`Y(CG{pb1m&)1)IE->w9`lsJte10rF!O~ejK78@J=lc5bYJ_?G{53#t zm3IDjKHb-!sg}`o!wD2?6?DwO?8vOD_-5XN;KjOf0=3K)*gzziTXgdw~AN z*zJ>I^&53I?PvaabXm~br~CRf9H93*c-22+=}DH(`mx*n-z3E9x6}arws%f^G?qTW z(pmrYYItC0tbQsF&>#G4U_mUsB0ztx=jYeO(zgfbFLoLKmsmPoXxh*E@7&rit&P z*VD)BkEPQ^rhS}0=b_sc#?li4^z*(ESI5#*1N6({&zv1gpJC~&-!k9oKRZ^xEep`U zd2Y=OKD{r}vwdl}!+R1xVF2ON_+^7X{MO*owFdj=!;gJu!v4AN;O|Yix^v;8)rS7p zmke(4g2D4%G}u2E-oM$L+cw`~aO}D86~|$K;B)y22FIQYUwER4f8k_q+$ukAPS|E~PrJ!ta#=jt#0Xu`4Q>i<{ex9^aVppUgs|NHM3B@hNR36Khy04N7k z0JZ~oQilOafKhhnaSzm46h zimMR5i0H)gz-K&UrJWjE5fEz${$@8xKYK3y_I`d|GMT|fS>%J0AWB|86O*N^`V{rh|M z%^ywg>nk3wzsJ__ZKgk(KRDj1s{cQo{zu#YNAv%u%jZ9xzo7hM=lid%cRUCFujl_y z@1H-)Ur;}?e)(@Wy1rE<517B&hi0E0M-IJ}8j8g$% zGT;HgTEJdF7<&l#3Twhoh)@y)&vT_J2qB(<>tw*y!=vivv+qWL=72VUL_lxAd;ou# zSLTuVO8|5QFkfQ;^8o7rhXEIX7knLcmHhZT`1SKnCf|~+2jI4M0Pu&~@JsUXdF+gI zJpqFOBLNct%*$%PPC#Ao(F-u48h(6PF<(B!%E#xg0n)I1ngOsaqUFOfssQk(D*2=! zz8EkYPyyHnXaQcvRl|?ZLr^}vFT~^HbO6hoKffj)9zV<*ryl^w23!wd*{lIDAI-o+ z9-soy)Tz3^V&xMno8Y)@iZWR)+=s~kZade@eDkL&`SAE*zLo-Z1Mt=EG#}8Q8h%(l z%mbGdluILoc}#FTe>fdKbKlhm@Yre$XaVr$(jU*MfKtFTz#_n_fW3eQ;GsWY8ek)! zw&jP*tqOv2IUZ?z-necaH(@|i0L!NxpfiAF)Cs`+@Q3;3^voy6^#r5>SU$|#HUN(u z=E>*BMVt>lUp_C)2e+T)9|o{|ILseT`&;ExjI>h#4*=Exb^+>vhu#4Eq>+}7-(Nlt zvDoK{>-6Qrywn5u{58ch%ZJ;35ugX4H-P2ApIG_yMO+?W24E#%AArXX>mHvUUp9=H zr&vCi2bOsl&;r19@Q2g#vrqrOIDV>=&rHaty75z;e7OD1tUQ4JD<8;!$8m6c{8v8J z&#&0=!*k2mbqRQ8eb^H)7?1~;1Skho0CoZDW6ZKXo&nejNQ6GdPoNQg_Kfh8XLJ#O z?H?|;DyT{ybANH&9RNvy-hd$h6mt|HO7qL;dctB%z>M zp!>jl#qzFd}W!L5{5y&kNp* z-pk%Q-Y2?UzEm!QJ<}chFel7W6a6#*dpc2`+EF(h+aDY?wmdOMU39Dqt~`%r`-5#I z^W%B=MFQ|+=Yf#- zsq_t6?|GvTPJ}IG_%vg}j0j))^(YN#QUMC*z$~@O?RP=(`y?qcI+!QZAKV)zN7du~ z7VmcNVT_P>z0WaXE4RK(w~gEGd8L5M=`zddAYvJq_WS+c9Wvn2G!Q?1>UqTgmVn>N zQy~lHDpAXc+rxd#@-}TZV=rB&X^IuOp3cc_=icX1{Mq4o-1n?U47c2R4`;Xjcr-0H zrJB)rmd?+b#>{r+!yk{gdG~tHV197xeZ9oJKN_hor^*t@(%cO~%ejOSNaGwU+hU9Z zZttm)_L{!u*0MI?^hQ3(NEgB=_q?W*9%*Ae*v6cOrDt@5-xsG4>jxeUrbRph8Y6~h zBIjtUThHU3%Zy>xC@ECoG|9kNBTE0XN(d+PH zJ?|^JPv`v!{*mWBPak3)80p+jKO$xWU@3fb?(gY%z5)Ki4?463p+{+z&izk1NQD>y zrvG=*aM13h4>aw2`U0UP^ql3YA05!~>)}Cv2g+Xnw_&CG%GTS8_G@|pR=^Xij9;T+ z^oWkVj^3xfks19ey$4&~^PUCVLyPhMO!}6-gw|kw_aVHJKG*p^gAe9;`ShvgeFvW7 zVPSb*L;57b_jbApG4IlNo#PdJ!LsMwN-OM$+C*~^{s-1(&s#?q(udGazBJ#VYpEsT z-^LAhuK5`}52crNId{`IdMVP|57S+ADZQmB$I(Wln+osCpEwDb6|~lUIkz|_9x89SV&{(0>nHCm;#H#q&^R!hbR~S z7XZf4Et=0+c)kWR>j|Xdy3U}-bzR5cCW+_G#@>+W(N6Rr!dK9p_}?6!+FRhljFQvo zex0K><-npc989K5=Uf^V9W)0wfgY>NODs31(H%PVpWuUe zUQbwUJo=3$>p_|D7(8zx?56jjD|{V)J~Y6oh-W>18MK|@zX)ER=Vf4B<5s3Xzw;_! zR)8DvT#F`XiqY*M%>Agv!K;H=`&dWt>^Ehy24Ef7Sm*4DHMy={4VXh;|8Z?*1>~pJ z)mS@Bi`ru+9_e=E-XlL9xdb!+NxcgAYoJHppvEJZ?Vh(6@H6JS;pH&AchCD8GvD+6 z1$cw@SjtEA7{Z4z*SVIjFzZ<(+!q=1(Rt5wf6mXhxxb_vkp2gHROjA;+3tCTfTft3 zyz+4#p8Jfa!;<#A;dHMKeGfh1d0)^H+w7SFqg@^$X_FyC1-JZp2uYaOuz z`!(E4pMZ8e?n-&yRrD^s13T51^muv&v3=-P{NDsvfw^xa9i9K4_YS=s(WfoxILv*| zyOy5OWxs{zp?ZG5OjDs#P3}eT0z7XmU9HpbEWcaN;LgwxW`>NThY`CFP(jDw{~ACG zXn@yXq51mtDd+*u`y0*CZF~{>Bsl*s!2EwwQ|`jPiszjd(E(2&^bnna|BnNfK^qvZ zc%HLf7^8FDf?cBrBOFKPJoiR)wwGhRo7_CxJ#Q9u)NT4Zp0B|!z2^<4o9Un6+L!6M z)`FV}+8uz?Fsn@oJhP)~dk6A$f}u8}iJ;b}8*S=Rcs!mr0d^mA6t#MM8MDP_R(_^m zhOYx>%&UK*ErIob(E?0Khh@WCe@?-3pE28g?QB`y?AqTJ z>3G)Hg*9M$lIK0A=C%K1{nT1p;=XkjwEj4qZ~yT6-}cD!NAC7MgkJOe{2Mxg(y`9# zlHSDX?|CoKzqHKF4ENXZAL(|>+YMN$dA=TmmEf;b!|8j>KhHaWwfCQ>mDk9>z(->r z%V<}&8Q4-_jlx#LZmi=*-+WD9>DpIAi!jGqVJ$4R>&phDd6c&3`0Fw2*Ml=o^BS)G z4Ws9=rauVX%`vT@JI+MvZ|O}v<9H^{M|c(eQ|C5%L3zKa07~Gv3VSe`v{Fi|{j;rJvfmqS}CS zM76+E+8*^s^4y3Gz^QnhKhEaowVda4Z_UZmSou3^`Ea@`_4;jA>p7UCo@cC(h7sNM zjJ zfnPQPb^-V0=_s!@YymF4BkTa92`aDuqoE;A)2Ue#%)p)pr=A3>!1H+ie-)`O8>{?8 zO}!X9>Gk!~jdr!J1s%YCAJ-4%UEg4~{|_)&gAD(K^7)c-8`@ z#DPf7p17I+#s@qFe!|DFef*J7l?}k$uqKH5KU|-`H(>l9j)~5H4n^1h3y<82RsW0M zH1iLkp2x77d)`m5*8MqtJ63If=5yIR=RJ?@?q}^f^cQV;v!%`4ehccESZ}|8=JUK0 zw0!nji{cGC`dA})-fF7>UMKb{mcnQ7^%Hvz>@CdKxxa+P;CXB>n9=!9nvU=;Ya4tJ zu?;*r#Tx}Hhu2=eB(@ZcM__u9=j3tl6-2ri0ftK;S_hAQcd)WqH z+!y=(7ezSChp*sypF$@vjkN*Kz=oE?PpYx~KZ)=awf{LkdjMNX2IF$fw;7NZKR*eb!kF!XCv4rmRgjCkv!M&3o_8-;1-BrU zZ34~}wFgYk-Vc4?d8`YVdI>awne{JXf6MPtwgfzn*MCkk8a@E8{&(2At6u$^MJy1u z@I8-bKabTL@yyn`=kbn*S+UsO=k>irm(LzRairJTPl#FpX0L<&e#1R`{GP{FzZqS| z1~BXX>sWtz-_l5pcY@dgFspy%9U*_`tF9f9m1n=1`@Y|9=Ko13=PUsG{w$N={@160 zU9V%XR(klp$K!P>zTx#J{S?xkL~V>7&h6;kGgt2f^M0;r+X>pgJWeSkTDI{>!=ZUT%4lmYSq*?{4I%K`lXmjJo~Is*~`34rqeO#zJnX9E5V zXkdY#!+^5^=K?r=2S7JKKfqOh0>F)c*?>m@uK>7B4rI&w_k12u2)G;YGT;E9DZ1)P zz#V{p0^*RkJK$!(D}ZAp&NBe`NnZLG(9Fem4FFaGq{3MQU>0Bt;7lAwrUM=Td<-}( z4&U(tz)%0tV!&H~eE|Mi&@%u{0OtV0fD-`xHL4o{<$x?eL%=^#P96XQj3xsxaOrB) zy&k-r4!80ZgJCBI!rd4M$p>JMVj$e| zE#?je!!vuKPcaxi{tB!AZj9|OJ@3IUAX^NIFF!*b2yx&J*drJm-+YXHoo$}?`bQWe zTQLSdL_Yv-$AA%lnIE8hz-fS!0IdOI0lNWHKp%*-eUNVq@^3;pncKbp$KH2GMX?0$ zEvwv%-u46tfsHW6oki5fxqy z+lyE3_2+$mymQ_==j}Pg*FD`m)77EAn(p4E!kq5ioSrj?o_B}_<1ng+71ha^>Nkz* zs!er2NxB>+{hpG}y{WAp(d<3xp{(qD5kwG8cg-eXur0C zuBoX=+G*1Nj<2mEvC>tM@b&5cveQQVi^eLF33OoLl(C9ruZfDpwYiF9atr#u>t-sF zcO=FwsU!dPF?g)_KNpD%3mHhEI#+Sv{`r&mMDe^T{ko5diH(eo9TO>Dss8z? zAMc^4@i~T98Qx)7y`-|0(>p4j_xd;as>;#-CI6p3|5ZPOr>s927BaMdR!#37e!-%h z`uERIy`Kju>h+mn&tOG-FT?8P$!t`9yloWEJN}z|%5sB{>kv5@I$|6K9> zr3_0MR`q+&o*v3F|HPmA_m?U3^0nUbG^&MB?2^@jTDp zRI9wxt^>Ob{Q z%~a?+o#AqZ%KAU87FSwZ=gx}feyWzPET_bp8-HzI<@NtvGO~&uXw)ZiC@br^C_|WAJQ{_^BiS)B`Wn(#tn*@{tT7r zfA8<#H^EQ+y)OP*{}2|RTJ5^>xmEf*D4xIcH~EzL`9Gxp*YR%fj_J#=kYSa+{Uf8p zeZs~h|Eo#+sc-+Q3Vpp8`ZG*tsI0dVm91m#sCfR|-{e!~&-g?7f7MslQ*jQaAwwgE zEf}_C*ok4{dqw>U8CJE+fEd3qVPQVx+bFB}H&pbdI2Q)pR%-gUItEDT)ft!=! zxlt_rakYHPTWn|7%YKut%=ce0@dMMBq5Vfiyh?93pJ<=(9s~dVem}=U?z><0zRcq9 zs$Ey!N15AMs(7B{z4D4O$FCUphxGqC9txR$_Ma5bUCOYO;ZMEC#QFuBxCf63j1Bll zm;cl|k=1K5!^;dG{-(Z4f5w_qJpaRQ@>Oa7;eT$I|EhPDUV{Q+e8Qu`{;8Ar#Gm8X zL#C*yFT<+(u)y};T(6$*|8%@cuOaRpCN7aNvH$wOpZ#^5{eQnp42u{liuhiD;OOKem2w;aAfofn55?#j z$4RA5PL2-t_MPoI+1hmMU~SdDUE4O67Oh*gG;3~ZV%)Tep+O`42KDuH>(Xpj{mo8p7f9~v=)A{+Q zPUhw1=AJll{P^)>$BrHS`JotHJ8>d6H!ttxsr>xYXU?8Gf8pY#g3DK~Ub}wd=B?Xz z?%gkX_~^;g=PzEqepCGJ!>5ujrDflKl+(5sEi6eS&Z7zG0PRunEz3LLg{|mXJ9>W*znEZ7Ij#*)~Ql#+=%N+Q0(3?nfoDWjo%i6oOG zoy3boJdbQh@|}pbh$N3Bi)0~58c8sTJBc$%dy=Lkbx6voitk7sl3XXDC85giFzqGW zLXttUgk%oM6cRZ}BFR`1*8Fs)OL2aAFd;QR?LkQB93uUO8VPIu%CpYY{Iv5;za2q-jSo2q&eHUj6HNV*Ol|s$`&ks{5 zou?#HD19?w1_>#YKAU7Rg_%Ome^coHkEj1Xp2YDqm9{%XQGPCc6-OP}fieZoWf(!% zD&PP6M#lL^1jNLc^b7c>WArzk&7;XrpUVs-ClzrchLwqb`$JQ{^5fQ1@myt6+iLmq ztHqWN5-rsn4+Q z3jK~UH2=ZcnPDkI?{dZUe1_JvOD2AnGE{!sEV$BAkga5BuR?~KJ{b%(RTc3lhJ_5B z)fCq^G1OI8#H;$bUtC!17+;?Vf0G_#<0@YWqbqM*`A4Pdz5nO6|2IO3OwU4w_B9lG zFJ)Mze~*axfUwA@0F$1PVPTO8zxvBR$GLt3BD}wSTCw=dYS)!nlwO#%tD--b|0dsK zcKzya(lr|@o-6%Ly7GC|(Y_|rmtiTxVH(x?zguKPd}LUhxR7r$C?Gx{+V^j_`q}>z z?G^Pfc2wXrhRVzrtHrDI@2$|^Qu=HAZD8?Z3=eU?ruT+l#@KOM)Zcfz;@ z2I$Zu0VBsvgwQte=x{v_HAWZ0=%q73sGAKb4IB)d}kms;Y<~Efr!|3cim_VC`>4=;(f&8A)oZEIeN@a;TB)^GZ>Q2;-D*PR^V20YYSl2& zG^^QC!$PyIMmyqt^;&edT9q}^YNg$}b~~;1wXJ5*r8*{c&FWgzZCBT}4mV3tdo!JO zI<~sp+$vqF;u6J2RjY2jdIsc=tJXC!Y1vZJR!g;gds|zHYS$jBs{Q&&+A>t_I^4%c zRh8nygM(F7=W13PS8lX9Wa1Lw%jM=`v_&{|t@eJ;ay4Bcw8@(gwBu<{Hq zF|@AB$}@b&&`pPxXQ->o$}_yg&{~g`XZVhxTRm2up>BOvp5Y~i)(u#BhVK}gu!d3@VuCjS*iVs(pTr?}`0?9hdW~#rbOS zF6>U}{S@O{bAY1!xoY{8542?IWxq*R=KB+tOjh_cKN!}WqKIoV)MeO+;apQi`@Cc5 z)||B~L){jNcvX9OMEgX<_yvq1hWTe*ezww zkfD7m#r35OOBq(Rk4<-z0lpytez7KQKH|k+K0p1Cy|KUQ|4TNC9IuwH%sqFYqJ1v0 z^w-t$CC4dp-ecE+#g+G;S}m@;{yVJFtGm0KNw-M<0Kb3BNiX^I5p8;@ueiWK@6qi4 z_Ekpy_UHeWbx38E4sKNRr@G+HYq4&9IbVRl9VH43CPY_p9IRGl*>>%BG2m zcBy(Uix*Y9u1r_F718++cSV1B?{kpp_m6!^wkc`iK1N*4S7vAUQ_r_I zf9>b*EN*z~*Xzm~h+|9q6b)ABY5ALcid^&?IDbh0ukYc?`-xa1oz}ZZ#2Pjsq@_x6 zNm8OmVH*-V3e$3@#DT)*gzX4hlQgHWA7LP27|9q4izJ*zm_QOuVK7p}?q!xt@2%8c%BB@7VYm!bBMiNH~ zw;^m#Xhvd6VQ<0!!bp-33a1c?M}J~T#!}dwWC(@5NQP6`g|HuCFOsel7T2NkD14FR z425qK-Xj#ZqYEhfk>oRlzmt5W@N>d9gwIGGQg}U~cyuF+WHW^i66O#dAlXgfxg?7y zyoN+P!ZL$!HsM5)aTFHUx+l>i;wUU9Nv3cpVFaN+i4TQM2wM_bkyujLiBSCg5L=QC6s}LAPhlgH#uU~htV5_l zLT`-{^SugtK9%8fhA#UQ*EccL+^>iSGt6gbet?x{_?)53K~|oj<{?&|VLn6i!;0%w ze9}E2%qNK^=D&V^+S#xZ+Lbwy8J=NilB>90y|}`&h%-?kYbn zBNcjH_)R`#{-=LP|F3#F3yOZsU?@4Nh0za$HPrc7IR_J|;;X{Ts z4S#J9r5;u5f1?z7>sQOyv0B`$THK>r{J-k0e7@uu)0bhDzJmf{Cru@%WM7;*kT7^$om`U~L{JrE9wqEl0YyTyz>!WC|D27%2)YHd5 zAo_QA_}Ndt%kh8P^&+O9vR*scL{Yw{DzExr%r?!y<;xd5Y^93?(NO zac_o48Je78HoWYvsEXtlfe}2&JRu>>m2%mvrqrB(*8*DOM3&Mg~K(8r-Qx9Oot~AwmS@4 zcg;a+DseRMY2>(LuC?RG9eo_H^1+U4?oDuR{{p1XVBQLrp= zTzH^{Q|e$nC*8=VPOj>fPR$y2cACDnyVJPMgPgv%^>KRNCdz48rrfFig(*&(YtD6g zk-F6Bob_6#0nN8Kg$&%|WXNYb4GBK!WaxIuX>{Bzr)GtZo!k?PojwgNbCMlYmG1J_ zl+LrND{b7kfwZTop|rk>iBvYLm2}+uw$jG2HqtH)9i^YII!in5=_UQRqrbG{*}>9R z>LaCwBmJd^uY^iZ2FFMpjZ&l<3FD-uk&~o>@zbPNXU>w2**#Bc`fQQ(o8@xp$F$Yb znnmlR9S3fd#uRLop7P!)ZBwyVx;*QUwEh@gI^Xt$w1G~(bW!O!Y5n&F(rKmFr6qOm zNZoB8NHc<;N^fj^CH?&4o%HLd&(b>=zDdt#O1Nd=YTQMqnq0VEEiU@4Hh1T8U2Y?< z$6eXgfE$(7i0i)HkehU%DQBE-!qqNn!S%0b#XV?g$>qAY<33Kc=EC!AIICKnxy~Mr z-1tn6(~)%HZh3d-9_IJrTG;pDR&MXlxwaj|neQ6Rb>@b1F_*l!n<3s@P;Gy%@xCDL zt$!%@s7WOE>1H%%ye6LW4o&9vgN&O~dmQKbV>~zg{X}lSi^<&L$5XjckEU}QpUmXK zU(M!re45LJt1RID(p$v2w_L&{N|$kZLsxLdajUo$i`Q^dkF4b$K3dOh*2&~=rI|V-|O-XgjyA=`Qa4$UWT9wfi`Det;X_@i1qSp3UhO@SJbUW1MQ*39jTu9_L_} z&z)UzhTHu89CyY4BG>&=0rwrQa$k2|=j>bE!&JdOR}CtRYQVsR zn$Yfw2F$ar1!;4%;BB!sJRVpFM(wK$!wq%edb%E5eqImy4Qc>AavH)xi$;*S!~p7O z7{cp>CeY=j5onJx2G=Xipv=`2jE*;lZBAy8wZA18*tCXsJI$e^wI$ry*#_QrYzG1R z+k>-{HOP*20Ap7hXnNTeQoQWI?s;eE8|MH=)SO_#0x7IB1JFN!aIbe4D81hmeB--= zQQe-*5Oa?)HW+NqwP(L4R0uU;y+UHW0d&4T7Xq9`LTq5Lo|gD9oQd91h!! z0K+0L*fo6=q}q8y@*^MEJkJj_x&*+2_kqx7eK52g5(0KwVGt;U!;!d1uxU3I&OM2S ziECoP(=#6W=qJM9D@l+zF9mkGrNIwfIkX>>4gtN#fmz$}FsAMVuzf!P#$TNX9tS7E z=9QB{K5hzJ3!DmD`%Z(3j?r&@)>E@w$tl?~lbW_vI4kR=5=WPA-Guz02Y0`W4V?!Aj7ZunM}xtcKfu zYv7hg21t9Z1vUG1(8h8->@)fcGITb;3)M`R_c;?5z1#>T_cp=KE1MxNe+zWvx5DQ= zS)jLN8;r}?4n3CafDyBILhhtpke0R^CdKW6JK=jFJ#ZgHjouGihaCW`K?mV`pF^P6 z^Du-t9|3KrY$)!O1Nt3!khK+{mHAPqV|EN|Ope21qZ44;I2UT`=YetklMt+X3SQL7 zhc()#VS24Iuvz0Qe64W~Qq<2wTeSIa^)BpHy9d|R?}J{=A_&lU0GBi$!a%J@@J#zL z%&qeT`szG|#(K}7q~3EVYVZPX>c51$2Cv|?;cKYT^bNFb_7(=17DHN#cd)bNdwAOV z12nVz2*cWbf_d#rAm92k{OI@v+I1?0VV%E1szVtpbNU8ZG$Z%n57^VC9M*TMfD_Fn zxNW@zXPc>D;06`!)Jhf0GF5SJYc=%Sq=q#t)N#dTbu_cAforzZz}jtU;+U;9@jx35 z{IpdAP1*J`U^^wzWfZrE1z!iE8 z(O^zPjIFJY+otK`iJFaY|Aa<3Nn(KQ(+qIWR|BjU-xzy;XpAEw46(;cL#!Ft1lK%h zf^|n4p+}(+M!Gk}(HEMcnX55opD;#qXoi6Yn_)sn6ZFh7!Md$XasC=pd}`1fwdOa+ zA6hMtpU?vPeQ$xAW6ki&YctIEZ;8|Iv_yT6Rv2-%70&6}8j}yTMk{M`%*r&!_eK_2 zKHmZ_Yg%HM%o5Lkw8W3WZSelxHaKTcTU0yM7M+~hq1}#l_^Ek&j9uIw_t&z*L#bAn zR&0eTzSh{|sx`Xw?0{MaJKzk9j(BEyM?9%*gYr}x{QTMm%}3gz{&`yzq@B<#s}pu@ zVuwwp+u`<7JNz2h8OyJB#v@(r(Q2nXj%ezDINbqnes(|$KS#8_=!mZ!op5BP6OPxD z;>c7fzIrOfwgWjdJ;LE>Gr$(J0j<9Pz8#G?Dj!j1?Tl_qow1<88P$Ti;N$aMFwV9s z?pxj!*Gsygb6_`|akd*yusaLrg3{Ohs{y4$#7)&f`D{?QeOyZ6RzyL;niy*}74st+!|&~vr_2G{gNr@@}MW4$Nl zz4ycv9D$c-j=@bhg(AY&~lp}_9^zmIvxBmGTI-b_xNMOPyXm>8-N%afO&fY@b!lP+}j}#n??m< z>+OMfSOlR?U=XfZ7lZ}(g77cHU^E;Oj2-3$*uV)zkl^lk5wuj-t zhhgZTACBIx;n+4c99L}*$9+ZN7*j6-uXl^U2eA=2e?tVmxE6uWYeeGgPLX)qKN1TT zL}JA8NZj)-5;KgW(5`P3#wA737>>f?%TZ`i5ruWzjK!5h#^SYcWAR|tSnPRYEXq}) z(XUN3e)NdO_OfVfxG@?xUyQ~VU!w7PvltxPD+Uin#Nf6?G3b^ZgX#bJtD9D2pX;oC)VXmcV@ao*@eY@b5$#fi9RS0Z|!OT=eS6VXB?30pNu!uz&KIJkcjP7O-J#PlR= zxhx6i?n=T#r;~8)gCunMnuObRlksZnWIP1P=sh?YPlhJr+i}TQxFi`TY)i)X$CJ^t zFc}-XNyalODcD^<1;<;a;3P=FeuGl*W#`KwtDTCqnx>+8`&87!RLmWaie0=@aavR=u1rtG)VZnHIwKWV??}amd@6oApNd!R zq+}8gQ6&=!WDyHFszG zGThr!hBj_8oH<;Eg0BqEhstnYtPB&=WY}o34Cl|5;fuvGG+HCWwi{(=xI>0d_RDZK zFGKy4GE6-$!{b+F`0Ta}Up^iGCOUu1aV2bEEmW4x9e*Xzo0kG>o?7|AiE zxg2fH<#@TBoNS#O58KPJ2FS5fH#zokk)umLIa&^q=a&&qoN6+VSjCdi(`(*K+iKL;AlZ-HYX@@=lHyNfy1AqsIq1 z*8V8RY?6Raa?~i1<2sVgpXGRxr2iK=7LfESrS>4P`%38~waVleMsk{@`8VnZl9MF$ zzEiu9tRlHfV)%plfn+Ml5t5fA`sH$TCJ7>$L9&hH9LY1q+$DKL@|@%~NioSsk`j_qlCLD+NWPQ&ASoxQ_?ys<9sW;J zqjsWw#|hew@rRE&K0M1gwYs>{X@<#5r;@-HQuH4#Jt&_cb!xO-S{!{<>OHeu+OEAm z7yYI^w?gj9-MJsYrKpeR)|AcTdR<({wUY1Uw$(hv>H6N{aMoMy(=in|lu;YfiyFax zSqsQaw1U{PPS8Bo1!hGKhS0;l;65-4_FBsz!g4Zv_nHN@wl9R~O;&>c`t=aiZ7U>v z-3@jp4#UXR$6>+LGY~Jo49nAR!R%=d;pUQ;pt|`3%s5;I-~3h3FQf)`39E&}$JD`C zZ#^94))1d{Zj8?wHbuu5CYZO=3}Zvh5e(X5i~UyErn?P>AG1TPcI4Ac=Fsq*Gt%$7 zVrY|IIJ-q}eA}=e>U&SNoael$+F7=!P>#Nv$F@mO3Z0gru8z^t2z=(iyW zS9m9*PVE#--IRjs?NYJVfmF0;lZJH`q~U>LvRhqbID9(Un$t4;CXwS}YZ}ADX)dME z{9P)?jXP;<<4lCDGZ z+WMPIPI#^i?Q-&SvK-TJqO(5FH%P(bdA;~j_e4B*F_G6Ui^Yx^3wh02WASQg7C&l2 z80r_F;0r^8aNP4-{E|E$eChd~H(WRZxs_@{hua=_%b~8Ix~3l+jt_hTe>W_N}lo!?3^b>A6)WwdsJp}1WHKcnAFFfDF(mWqQ z{`?luGld4lCt&o1FyTsS7Eql8>x_j!breotOa!X4AmsG|p+Sl;&RHKwC&4-=pCcUw zvu`dO=`6I*aoR)eAV^7fF)k(D#q=qpyO=+Zbf-2DE|Tuz{cK2gExP|T(p`LBBhsDP zKp0QD-=O-uBHgJC1R&kT`ranpsSSi> z5IJg@Oy^cv$#JIjdT!NA8Rj}>bEj9x@Gy6cYtfB3(EcsAt0)as7pXyPER9`FU5F`9 z#e4Bauv3f8yw`=p@#iY}m^M}EcIelXEE8J9YELjQ;)3``A#l)Z^K zaDO!DzE8jhPi4@^ECDZ0o&-z!#iPce8L%Wg4)3j+2hAtOVxzT70O!SE;_6jUx-c5^ z7OjV&bH-xs}-H@XZ1%7X(LS9-WOGlH%9rX-dMY<5$-8;!Ft)o zXz{Qoezh{il1JTf^QsnTajz?C)o6t`FF9k4Kyz%84LJU&C8}mfF{D8|{43QFH~3g# z!$J1gbW;ZmHL=6&XExaFbp`Cwa?K9!Uja2X>*tu&FNc`j$vNgu-(j8Zj+|AezCuH< zq8yFGpJBmlO}_fdC63ud-1JCrb12r9v^EH2=pxebjkqOSnDNk-rXLkF8t%=Cg9TGBR_w( zCQw~@J+C5e^{KCXhVBlIbm7ByCv&75U$IG_BVGArTCP&kotLqNb@59R&LpEqOh}AL zyh+6Me{mguM)7Q#xSf?sqTm2YIF zI-SkzLiQ5kn6@YMbC`V)?Ffpz!R$oN)`@bAYm<`0>_tv^fAW7eFV10hBWGA$IgZ;; z5$#EW{aYH3GK|?>mLu8~wMA!@};eKW_S4WSt)oi!ig8{Pv;d~s`!oBAzn2m z8C4s4@XQ|Zt4<|heJ^jG*(H8yy(COu9>z2KRLP6y$<8u6#plf+ZciJ}Gke8r9FE6@ zv#0XRZt*AY#bNX1vw3E}D*3bn*=uIU_`BM%I5}fEFWR%D)vIW}#o&|W89cLV{Gj^L zSbt6?&+JLQ*$CN~3vEOc<**lu25op={AkXX`zhHMb_HN4a%>GsJw`d0~uASs- z_X$OhL#KIW4{3gf;MtUmJhO|ulMswu?XL06K34L6I`NQbCzJWR{8XJl95BC#XZDip zflidw9Ae=8wkyk2jH#G4FzVOtNa>fr-jlZ zeK1e8iNNf&P_MuhFUy+>dlhzD2)Ne^&wg$uF#BEU4~aejv*Uu~VK;1f*-S7ed#+uh zl@L|f1&7$R7H%o*x)5{66o`c)!V zQlAJnKQ~0`BSGX)>NCMInAU&$4HR||x1O>YBv9X?tAV>PkvR86nR}Igd5O4~I9Z^v zfiy-0k)w&L1sXd@V@MFWo5qwdzE4f0F(ynPPNy+f>6ePW*-qm6Q$Ak8lV=j7F)D~Y z0F7Cp^~mo)V_0ZQz5$JC;dIewXx`IXs6jr%$C^IEGv?2Vz68w)f#wF#91&=)0L>X8 z*5)bkoxkvve2?0r0)&3^i-6{skU&1kc|K4epS#iz4kcfO=A_WY?ixsiU_q077@D)f z>6DAalOe)1@@;5N3vP!_1I=+k^m%B`3k}JC7X8R~(Z}l-FD#fnmH0efxIn%i z*;L_Z+IS!vE8HWWQ15+$kk9=5zT_*CO%}#24+FB%g6Kn%%@*o;c>~#SVG;S3WYdN6 z1|C2*UKl|>C)s?_H?Dj?a3EilI6)w80OAN?3HhkR8A67x6%dCAU&(hRP7!u(Z4SgS zLLvFI#5uww_Ff_Sy2MGsq>HtHI7*O^4@{gTgzYXPze6U3lW%O+O(rzYe!vmO2}j6h zCe9N&vG$|`{^Imv(FYK=5%-JbkGg&neE`9RxSxCgp?;B-=mQ8{*n5+#fv@NT z2(yX%#roAUnJ)SOLQUd+vHo+d*NZ-YFon2Z)bAW|zo>5)_P%wByOxtr?ICi%*gi?b z{p14(3B>&^sQqdZ_lxa0gSh`JwQshjuIK{@)7g6(y<>;(oEeGKu@e z{#)hTN%R4PYsCFx{{nHp*x%y2t@wWD^R^$~kj8^Lalbe|RycTyK7e3A+%Jxwu+%`& z2M{I`_b;LGMein}4gMd=+$^Z^8s z`=^k7qIV_H2N2?k`$hY8h`68Lodlk^e>mB<)P-+(9kO?CJQeTDwVQq7-;+JONZfBi z_OWBeSH2b5%T~nwHOYR8+%MWwk^4paO7B*JXm7NnBFTboU%p-e$hu*EN=^dN+KoI%h9C5$M5A-f3`T!z- zh(3VGC!!A^h}9=ZFo*a?`ChMjysf$o+xD zuM>`13WmhDeb_oeXoGfw3h{9falZrc^F|*lVLkD64spLT@i+0gAo4l!yCCvA@xAB+ zi2PqEVpzN;rippPyhc=}8d-Wk2Mz5iTiVCokZ*lu}{RlAs?W!uf#qR`%dgbk^9L9sO(#@ zkHx;8Kz*)UUs*_F;UbNRr!+Rk&=_e=Vd%WY^(i`<`2V_f8ZbsF=_Xg%jC%>g}{ z3$ZjOM$p{YPje)e=E`oGGveG4=a4v;#5pB$zc|OlxhBpzaqiJtSmj(4=cG6{k>==p znyVT#XGQKmMRQo>{;4#l#koCz=J;@$>n&-{dlUETk_|8xZ2{Q?(Kd)SLbMg4%@A#e zXhTF>@``MV$o+50#srbAu_v1&t~*^O8#Ih;(J`_~BKPZ%jS{*47}+e5`-{kiIg>4m zA)9uOY}+`paV^N!>5-eHPIG|Hc_;VmG4JnD@B_r+Rpi8Lq%J9o@}aUTY0jv zBKO}Wn=9JhJhH)}Ep{cFEOLK5+2{det4EN{UQM=JlWh1TvgI?#ri->+jcmNg{j}~> zxjuG`I6&kAJK_Y98_p3&h+MIdIHQs~h(km!`AnQ5a?5t&7?EqP5$A~OYRSYwal}Pg z#7QFeClg1BTvf7AjTgBqUgR*5%ZSrNZfi#zCvyKj;yiIZj@BeAx$p>aqR5SL#E~NR z%ZM{0h&xL*EzZd&E-h^~y^>q|5XUwqu5}{L71!~8l(|%L@umA#mE3Gi94&J7A>wS2 zyEBQyMJ``YoGxp#>zedHUh1K-kdb-YS=`>ejxB*HE3DNc0>H^1586h-TU z-W?t~ZKXYqR7WkTxR%_(tA%t6trMI}lS(6KeYx+N!BTD7KiP6LLYhwdDj(iWkX|UE zy_#`zrJraI=C$4`=|@_R?zwKW^bGCQOzOB_noN5)n~xuts?uK0jzJftezd={=;3YY zswZ+B7X4hhgZ6+*RZ67G?$cgYzJ&9-BS&9d4X%{-jlK-6!-ZX=b%r(dxkClCNAk2W zckjF$+qF00?$ExIe_ShWH|;}>&u+{49HZx{*>EqiRY+>^=Qwn<#tYu_6kjV?c$^=v?ma}m+Mz5!_m_YaGi@~=&|K6 z_w@+nwT41R47EJHsXIli~XC^PJmO8RpHp z#7Wi?Zo9%wrM=7z=dW`wX2>w$%}uVwI4W1?F4rkuhO)LroGI;p-stm)dor5#M?;@- z<2_{9Z2AlCiwng!zvg<!xt@(>IJm`E?n`YMPU-TU z8!wUJg3%S+laFbb4Ju&zEDcwjR|UIUX&C6G4rb@mu*s_$@JgWcBn_CpI}KemYk?Z= z^&rD74UfO74;o$5 zaCK5c=w*|Jej1IyoA!?DEi!kl)5qo-2Q`iUvz(_T%d=oYYfV=9_fn1Sz-RQxcb6_iX)#VrQr;1i#Ut{W^MGawbu zb!Y>*9;s-@w}m6!QgKr6_AsMkDjvFS1-7QCc-glD9MDO{OK&?uz48>?oooxeUZ-GU zO*#@k9kV_phw7dUX2(H?tmgv8Jk%)Le@ z35L<0l6P0=-y;PBUUh@=4k@S+-vg!^r{D}pFLcI8QUa@Li0hJKVBXwBY$b_vSRdM6@Z zI}x&bC1Sz+B(Shb#2kYZh}2KS@vBo|&W{8%F_Xd6#|gM}vmCt6CSdH6bf~pE0X03x z!Q7<@IMrx8yq6_l$-VK=CLjU(t(^eQeG+hv-$ZENApwP!li;&{0^WQ!36_43$D+-X zq2a@LEC`(fA*bSTTf3>SJS!e!i>Jb0^Ww49u4yneJ|0g*Plui(;<1nI47i8!m{T$X z+|1(9@W4!1p&5_#dz5hebsWxfm<`7-#o@NH*|2hN9PU0c2i%s%;o8)>a4#heleu}& zYjhk+%jdzgu5tLBpAVTW<1kge09I+n;Wu0ek*{LWSF#8UFT~=Wql+M8XDq%+Uks83 zv8dB!2{^{ZqM^!C7%(&z>l|AO;1G*1(wBiolUUs5yd1WCk3mn#3NXJHgKvcuFiwcU zQ29#OlM#a#VHF%37lTd8SHULV7#xtZ8bZ6pU`Xm3&@hX^aHkBAsmI{ZvJANNI2z3l zt%dKo(fA-?9nI@#l-sR`#}lKmM#*}}@QxFEBFKfo)lh&JIyKF43da@aCR`}3(ELs?6 zL4(pLOu9|yL9a()*3xb8VowyF9K0P?%!|UjdON^8GK$Xo?0~s+UTEyhop9A63Y)p^ zqJ5tz+*M;Yym}Ogt&i^p;beiG>mS z;ZWU3++=wGcD{_j5l;`m_>&R%VeLV%S{H#~BM-rWvjvc*+sbu}0ZZ(Rk~Ey1{c z-Zkiz9*hHAu0wM=b9Rf)%-(7fjNSI#fN+&yoEcgOcdrNG9@Cp(krjjoZ`_1|ZfPWU)vw8Ha>^hcm1%l z=L^`n!w;L*c?lcF`Qbg`C8W6fVM_EXuxjatAI)Ba@Yxr8-FOY{@_jL3+8an*=8NN; z-oly?UkrNl7XEVbMT<4XFuArb=DEFt9(R3^Q+*E)w)xp_ zzS%YcjmN4XB#*#hr_?Z_=Lk$|s*Wl3M&O(nbqu=aiL*|tV}~uC7~iZ0-i-6a-f=Z> zbQe$5I$HyCYkT58lbWbeI2`-L*F=l;!}0uC!ieGMXsUr44#RPNyawi~4aaL|HPHLQ zFjP0y#9K>;Vbgd`wDB8;CTBG=Uxwm~*jgBOjP{35*Fu*WLvfU`7M6Jo z#nNakoMAi^(@tsOw`W7}brWsuy=w^eiqgh}tL+El=()hQ!2{R%(Ru1A9@yeQU9=eB zfwQ%A@QuC)J{qZmbMLvM=`J0tm+6kZ)pao@+#S7!>f&BocO14w7q5LAgxn8Zyn1{P z)^XFrz0(F^-a0*uaT|m|C3>jWXb^tvRS)Of9f-lp>*1UA1M$@BdT1Fk5OuIV_Oc#` z&hzSH_s?!P;!%Ax&341lof_cXacuk#92!Q zpy7pvxW#J#E@-BY8%*i^Zj?Tbd)gnn9M?zK+8^WVH^N(y{c(YRBOGGeAD8ZHgnLT+ z;gp&N_%6F2jv8u!b;k9h{cr=+>d_DLN)7P2W^~DRz8e{jleX;$^#(2WL zFD5z~Vv9z7anp1|^t;sukKZ!HiL3hH3Ckup$-573OKyTeE&8DROcS(t+8Z4Vjqv=Y z-gs+_5e^LPjsAy>a9_LLculh@ek*px_QRT@>26ny+}IQ?VqJ0R=ccG<=Zc$p7~`!k zE|{^<7$+TaLD?f?)J<{09vz!us?-HPrZ>YgKYHP`i_P#W-wSIRo1kWTFANDY!LQD} zaQ|TwJg3qNUuc@5{CH1P8)}LTCiF!04W>AwTTeQ_Yl;umdg2l1=4h1L1EXg*N4tqV zQ0Go_wCUah=UcQuJ@p>=BfbR|oal}Na$8{Zgzh*+&kRetcE`+7W;k56J7#S)!;E9y zaA_%>X-}tfQ$1SZW$cD#^IIZc-W7B2wZxe@U9nG_R_K)46%Qn|!t;)FP9e7ycKOHeJx;Q)_(s-Wgjtn`7P%XS_GV94Ci6W9kiaIv3@P zk`@-Y<2hnTgatOrL_B=R0)71ui`6Z0jtQc+nVThO?eWEg z4rpybANS2^+uiX=bcTO0 zo$)`?%?>}Gu)&5uI$?^oExPaTgii+9Vq9b=v{`P8DdwFp;DIgfqJPJIQs?wxhaVL% z?Cjzry-O>g@4#cbUqEj&B> zQDz0`Oud%9Yi0TSMmes{D&RDL^htzp%a;C5O4m0yMyq47hbBXZXr8c&}2Bqw87* zb6VfX8TIii81}iF({069m=N|T=cw~nI5Oi!&hRb@-Ib5@>6r%Qv+xflkfp z^S;6-xMHHu_i_0I4b?>gorWYS5gI^7sI2>b2z86ugIK z+U9(6-}j)R+J;xjdk4}l?fA}4@8Il9Yre^jV%TuUhTmyY47um*_|iFVq1h1!{=@e- zuw$c?UmNrWBIhHoap^S-PU*^<*}aC5zCHM|Wv?K$mkU4R+e_GP*@wUB`4V1f_varU zcmbBL-1zPFUO-U3JMR$s9G0yg!cRH&3=XFb=a)5n2FKjJ__0AxVT<`_UiZKg2>s^6 zC#gSy^0WSY)_}(_YIzW!we%5;4-DZ`?mq;7>u|oY*+cmLC6b>W_yD@)MDrIji@-KL zj(_p^KIA(m^0!Uy)Ayi~`ApAykbO9f?>GN0)O1Ye3r^jEm__4w+i$laqj)@@)b=(^ zbD79zjJO4DGbZudrrw0fpC|Kc_Y}f{K2v%5of|M<%{0E3+6_4HemY;?`Z}EMI+Opa z_ca(de-`f)dKGRL&E`){qwid`o6EaoUWTxwdHnIC1+e_YeBSQnCGf7jkl$E*5e~X9 z;v1=7gf+_+^HcRNK>d45_#ds#gRbc^KB3b&Sm3*yFY9s^maSXCPw9IGnmt&_n+`q= zEsR(5XGY}1n&E5sN#3Vm!Ga9l-R~rPJG+*5@Xv!Qs_XgAez{<1{}(^d`vjZ~-M~*B zaU346%H$t-90Q*V8~G7^k3yFpoA~ct1W32s!sm73!Ene{{$T4I&`HnYZ#K#X&rRES zi<(EE^ul&N>%$><`f&&EfA=7?Xtay>IC%iJ+VAGmx9x}IVSD&z^Y_7=_`N&{JfFXh zPa3udD2?A@zZ(XhJis?^vJk=4r`X1$}&OmkNAFaxSX(NvFXF@js>Bcv<{|oH>a(U7j9R2fnY6I}_ zJIPa<0JRNIZ3JgWT{5WUggv0 z&jK0?JdFvUvBA?A0T;C!JdGKkvBS^rGZkno@smDJ1{zyDjWJj|;ub&EWg^hn<5w4t zhfd#a^J5o{gUhGx@H9q&#wvg0a2n9q<-e3C1C3?=lyf4`*ye50Vm(9B6Lv;{ro~<_bS@c@WUt;eVX<2bxQK@HZdOJMe_hG#?GoK~H&_b3k*C zKa@HgXfE;p5uz2wt+xd6>|-pjWK z(A?+A1_0RtK4Lz?x}Z1w_Ki{?TfrM0aR9O%{IPR(u*;;F&%9#;WLtQ$F+jG4Cz}JR zdGC0MY8xP1#5dJ8hm3;v{K|SQfov5&(V#hy?c$4!ngQ7|en&GSAlt_OFlh{A>-Yi_ zeIVP%+cc{WWD9vqBV8cd$mcYw11b8S`BFVCAlu2`($WC3r99bGAlu3dr4k@p%V*sF z#*yvihny(k$QJWin~FKI%{}1Gs!IQd*V@m+K_VhEVjMDa9CIAM4yc(m z=1&nw9i=Bga~u;vATb02G;OLuL`6hIMM6SFR76F^6A~igF;rAMA$iUt;`xMVitp#X z_kK=j^ZmWo^4Dk-M;SjA?D7qw&qqta40g56s17WuGkWfw>v;N^%d()nx-a1oyz) zUDmnoZ#^)Vm;K|DU;mD|z07A{#@{j5m$|>P=L5|BWsTa0Q0Ny&{q?Lo#6QLaO zo=7VP?F>R|#LpnDHE3rLS|ff2X{|vUj*x@+aHQpcHXI=b@!?3z0c`=o2*ej4Z3Jiw z5Jn)r0BIvYYlUzQ@m5GX2U;tHbBMP>+Bwi}BGB`lH<9KH+D!!d2HZ`gIfE97kcN09 z($YYqZ;7QL9*H#iR@!O=1LE|JI|FE|5e$g0Mw$V%P6$2+@eAA}ty; zCxqLGJ0a~hXif;X5qCn`ZP4gjarFFZJ<{k~XY~m9nORYfG<(p-AtWJA-_%P2Z5%=p z;^UB(1X>Y7U&M=$))zGT_FG@Xi;&hAv~CC$h<8I;1!&z6DiH66v#50gK3N#mlTEtzD zRtuU7LM`GhNUH_yG6FrHdl_l2pwYMKToJ#FH2St*7(yoEVMxmaEewIac^HPYOwj0C zdP5M;LmGXHE)QV{;(16L0$MwS8pP?FgEgSFL#RQ#9nxw*+l|m2@!d%44%%*n?uhS3 zT6fTV5Q-7^L0U0rJ_yB#`yj0tv?&PV5ubvz@t{pX7?1cAq>Ts77NG%gTckCBW{c2( zxGmBeKzod!NBl9;^q@UPpl=;MMw%Y9uMrXv{~BqDpwTz=5)uCzY4lCN5(F>A>06Ip zpp_taAzp$sFVH?f*opWDNZSe82M9Y6{{U$_K|6ua7V#5EYYW;5gtmyEKw4YSh9WFM zd??bEfHo9i3F1SMwgj{+gb>8DkQM@37D5Q(Sx5^3ttG-m#9JcmB4{lUE+XC%X%|7O zL!jrY>06X7K&wM&fp{I#T7X91XiP_ZG}7oBhoceb_k2bpEgiHK2my$%Kw1E3D-h^g zlq--H09prxqlkAv+ELKxn}bIY?|?M=X5(Iju88kNT368aB6LN3FVeb#)*oR5;{B1f z0kr-I8xZf0v<;voBg7$|jI=n=k`dw%PexiCXbuSX5qCh^eb5{b?j!DiwELjZ&$rR@ z<9Ctf2pWBZ(Gl^xNTY9D#vr619)q+L&|(ni+n+H=O973(894y)bx5OcGOj}yfcQG3 z4FIh(LM7t#ZOuy1IwMpf-Wh3?pdCi&i1=Zobp-7&LPx|8BdsH7eh3AK`ys6WG(Us_ z#Ql&~0NQMX2*hV2EdsRJ2oZ?SMp^`D%@M96-W+MyL2Hh19r5N!yAB$C6O*2gKaVu} z=Hqz;H^k2)%?-3*glxp=+o9Q@1tVl59*neX&~g!mA)br0VW8zA3`0B@X~RHkgK!G* zHb^@KS{sB@h_^x7DbThf^gw(&(t3cl9ia!}+mY4-G*5(5#66K#3YsTEDdL_;D+Mh9 z;TyygkoFB|2?*aHo`AG(KvNK&Ag&kmguAC7_=fZz@lJpL-j@ITy!`vb+qU=fif$j^8E?}*+I_?;&^F?g-h+Gl^^SHP z)H}d4+FlL+WP;~Edq=xQ+vA^Wv}?Rx{o`mKuXBxeRWBUy$4DT0ye*|eBHqrFZcph1 zoNntHzf9UkJCAs$_lUo^SA`66&$RdV3Fzb32Mn#F-HovTV_JKPLDbo=x1YC})9<5b zdp}KTkdHsg4-LI6Qr#`$t<7>ne2|Z`zo%bce;>03Q*H({XQ6~T)HphtN*o<8qcdM3 z1*oW>*Jr&)v~WKs15{zOwV!u@nmrmjx_xwm675cZI%j+{^y<10jH$`J;%Q(fMgI0B8EW0t1JJL>R`2Prl4iavGj# z|H(8E0!NMy3XC2b6B;-!JSGmmDlOvU+oa*Y*L#B)5)|`Qcx2$nQK2Kh2n-7ej17$o zjKWVXgyH9xMSSf^D^0O+LEsuW>Wje7#|FiO2v#2(7ZM&BP4O{7BS!_s1;u^=EfHaX zBHli&SIC42D2*E%92guPNk68L=F%(hi#|TR@%zprgW{rMyh6i*@T=Fz%c|5bu8uY$ zzZ}uLS77h4A>mQE=-*`W z4gHE3#=oZJq5cwN?~o8f41StACT_xj@YuM}NUDqYGG1D<5N${snTP6 z3nglHM7^z2`v%31qRR&L(l0b3G)V0r@d_8vKQ1Ob^7B5d_0#aUQGL_|l1Z}UKn511 zG?jz`nk9Y0BSQTrpzDk=1jTWtnISa_oac0s5*%-RWp^K6DxtOStbeYeW5!%QvgykWj7ZifeM4FWFWS zwSh0AKBsuR4ar4)?%}T1S-a$mG`iraBq%sGDq?J0Xkc9U7%o+&i9{*E7^s29y5^`P z(;er_&@m%NabGPoUXI~{78@_4Cs1k1wM(+MbX}ocV=ko2D)VJvbWj|ApDWU%8xd-V z5RG{f@pD?7t5C}qaii!~VSvWP1croSfJAX_x1S@DVI&<5&rwi<5Zr{3qcDA`HzwYe z^0ZV9o>)xZA<;pwi=-y$w^^bh!bfr;(q70zV>4EpjxsGdMw*Ojj%D%~+??^2b<2OA zYOGx0^CXN;wP!w08XIXOmOn@21~sa!crh7`5;q}Q?aG!Mv@qdYM~PqJ_kOwI&(RgC zXzV?;>h;KR#Cn@A!Xx8Yuz{|i1-7HDhx@zk#1U`DX=8$-M@3)hV;kHWe{q`%qCU;NNs*m(4goe()PfCsdP z*dse@KREwUOw`zDvBj2h=%dakG-E$$<}NO{b=8|k~8 z;B5#N7j3#DkA7GKj`uc%i`zCr?;+Oe-W9X-okfaG7m;8q6bwLv*ro%cfgVRuV#1>^ zw@mO3#{(i!u~=J1MS71OEhg*r;>1m^nZ^K(&rBQ!uuKO_IiBv*i=w-P*XcydpQu^S53JtUz~L74O-_@<#hP+w>wF~w$VObixYeEU@vwJUgwIvc&n ze57S9vTUGQl%Z4l#Dso1HZ*eN1n)3WY%?G#D!LE)P8=#)4~f)YNy5xy2oq;4m{8d# z;EI1r6{~OL>cuOFpTi?BdT}(7u!J6eqY9I9Llj18ESe52v(^@cut-E}`FjM87MpDK zqA-a>pG=3S?me;3w!64t>mgRzQ5WJRF1pnflJ~`8+S@QPT;$m6#l@MF6}qU_Mi?@| zYC~D~aBs294zenj)~RmT>BZ_#V) zK>pX~P^k~krBWDz=uQ}K7D^(r?4ecTXT5n4Ny;RVoAU^lWD_RSr2DGGwDZ_VxAd6VUHt-@t%> z8ob4!m(W~|j%c*o&yW>$vVq~_(Uap}f;2_ZVW)tpdg9Aqs-A@3X;V6jjF&vb@t2J3 z1B0+dBF^yeaIs4hG$k6s{W}MSi+xa1I+>KDPa`~+LaLD8pxDqD+9`YE^x_E#n-h?d z;HVe7Q%Rs84Fb0BiRF$SVuxdQk>>QiNObNjb~b-E2Aicg^yi${EPMABM<^4|TA&$A z@nD?&yCUV~t|8&EBUL-?6B9MY+cYOM?cPtFx`;`ybQWu0=_cm9`ku&p%|q;ey}L+v z5oBP+@|Te%dME}D)`R_MyoZZ(uL+%MI@Kcs^}cjdle|T;leK^$oQ7Rmi-Dv9d(3`V zw&P}XHr}kjf!+b$e*Jtu3hd|W^D$ac9COi&D*DY_8lwFoxl7Qj#-^-E6@L4sKXgJ3 zRB3hSzEEB?z5?^LwKJt?+CMeE(bht-1zQb6P^!|spAEtkAaqCr6*ASOqL!M`lgVBU(f`-xPFfWiTYi^d! zXo1ExU2+3o!2o#t3l*5mvf65zVfrs6;>_q)WWDAAF&dyIwd%|t4!eF2x*IN1lT=^j zCb1Y3J`qu;p;T;|<8ee0J5N;SZS|oy} z>K5_T-XW~GPk8PjHIT}02qs-8TWB(daVR_zerdr23LV5e6ao!6I_F^(=;iI-N8F$a zJSK%{jfC+DuK~*@5gwgPSU2@G6s(_^|GH{RJxsP#wV>Nx7YdKtk|mH*!()q zw5X^3^g8-dGU=I}O4u-yw4n=|jodhK`E@jqxDM7cvxsb_!2qVZ^f3$?6dUw8^wI1t zPQnIc&(YKvO^0_RotuTwsNCZMZB5e+!6bSRq9@X+9O>T^?wv;%pUrrSRQlsqhsS>5 zIW~5JnEb{^7FW~Xfb8+t!Jl38IvHZ~GGfacu*h$~R=U0~e*Hstar%#4V}oeajYAj7 zal=|<0bWedyTfJ~q9P`Ij+I|nSa7)EAKKz~FlMBW{lMGs1}_sD-{>YzxO#}ZmbeKd zN)|(t?oM7P_E(r+`ACUaPS{dN7V{!$*e3V$l&Uj=H*wwST}Z z$stDE42_SNu%r!dS~9Wp4`yX%Cacnml~A}F3iTpkk+s_1*#CzIW2cPVQEzd}LYpOx ztshw`XexsaENyZ%O(rvy)eV6%y(_TBN^&E?n^kA)37_ zmbLN_+unL#6tsR%B){EVTz#9C&gjVjL7&qYpf11tPo2eqKXnlqf9^)Aer%^skw;pE zV1*xtqvptwyj$=#c<{D4(Ep#leGDJ>^9>NG?_jL+QS=K}Dv56)C;zd*TyGw7rGJ8n z-1`SK)`5K}p`xD8V2Gn2*oka@3nf6&a0f?*8@luS7SQ`6Q30_NRV09Fii5-@?!6@x z&FK^C9TqNbyk)*E+S%-Bg9Yvdv-+{IaZzLZqHrD+ z7KYoW9ulZ_GF)tGgS@(U^|5BM=0b~YfzG3s>6Y!iN|<_`F!2`UV%qdwZo{3=Fj{1x zh8vhTAT;vxxKWsHMvKBf85bWO@2ZQIj|cgB@yuuNc+Vom=VQNty#vrMu`MdXP0zVY znWa1+tZ5)DdrVmH6xq|MfJkkN`M}&qF?{|p((rswO?n4C$8uMlgHiM`PUGS5qT?N{ zYkzF;_Vo|w9e`3}uIm~oF19u6#uDJU5%8p)St)fd)c$Tf-k-wuI4DHhkBmmMB>$Pt z&pBbVNc%I^ABindkJKdMrB1!%&s3Z1e-=8kl~7M3+$|Esu%LQ-;gJ>lLW!p364{LO@QrKFrr>iT)SFV?hYgC=gb z=Nn@*4%nOFz& z<9%oSb&Gs-7*g-hXs<=K+WdUd;OSGtkDK=Pu4rJo2PM za4+N@sU2ngUlim}AJxFCMcM8p6m7eunSqZ71sDbe@DalDzk0zf8yZ6gUjL&PM;D>U zMsCCN>^~dXG3cIvzhp7^9lD5V9p4uTo!%3xtQp z8;D0=ou(?*TWcB%E#czs2e6z=sTWRJMwnGV7{8jDl&YN8iF(1NzX`p+nDV#YA>-(o zh7fb6oz;n=x7Xm_zJ0vC{JjGLaD3n|7IjmPoV14t!g(S55ACGE&wH@9pJ$-K4>r^< zpr5zD__dGmxXPqDOq6+JsD;ISg=xz)F@}q^e}msQXpHCBu&~e=dXj+-b<=z5#pN|9 zw4J}W;r@SL%w^qhi+tfJ3k^{l9OsE_ZyXzG zqo0aKE0MW$04{#*9m8GEKQ1box;?~J9E5-k%~U3l(PI7kTxb8Wu~;OApwbtp(sUQK zQwqY6fQ`~)hVsD?YvH&p!ef!aCx2GOHa&rc*YCL2Cb2eih6t*Kby ziAls{T5%2uw(B3T>Cm#kq1h=Ee0wz&y!>av`jdqB&kz<|Ae?=Pu;H??T6h1BqGAyX zk7bO>EO@Ag*xC^%oq8noRBNxz9hzImI0CJgMPhOvZ2#cK#lf1{_!$hpvEmWG^!V@j zV=~6RJXoamG|pTGtc$1{n|f+VC0M!Tb4%6lVBVZ<@!{ ziPZXjvAJw=vo7?}thOaLJk=gdVz>|(1%w*UA&A_ zpVi5k^|6t92ur6hH+rESzae9_sYd@${}=aq(J3u8;JS1)AT7JPcxgLv3sVOKkugYXN>A4+!%Xr^(zHEy2elM@HZ@0VkeKjKKF z!!q1Q85S%fvDB4>H&+oRuO-aeKzOQ%aQ2Uc6`M)5(TAy?m322=ihZWVBb}sDDJ|?` zF>-3$LRv0vB`n-Q_+&TXx;=!q_YziD5}rRuSaFE*!ww_ZYWez`tJfkg8knL2`=`bu zq+mleVa;(;gT<41HBPfYy7&M44FN`f7Ao?jhV-sGN%;62Vc`YB)t3p=YYF$(5mwwF zEV)IPbBA!jeZsnjgjJ6Sr#vCN{*>_WGs3iqZ=%H3kFpq@iT}-gy}`#rl=wh?66AI7 ziv=HPYai7=O;e$I*Sd04JenlCYEu)={#7yzv(~^bUK6OIu&K``!Go=t_K0wtXyGP> zQ4Zt8g)(93VF6KHV6_eCqC7U&8qQ5QR-gMC+DFLA9el@uqf{rts- ze%iPY6@kW~7btT6W9*fIq78PFx&hY!-2Qkg>Hy&8Jv;@uSZZ|Dn!*VxgZp!-*e1 z)r%`sB}a846SD_+iTS?%V!JQh1N9(TOffXw>4_qP@wSWY2J?zmR2c9)#ZrH@9Oh9i z4h%My2MxrBtK!V3+A>JY9AY$D;@}XyxO1enG%gOrwNHeTRCn*Q~3!9neQS383omGEuA=q|SdLb1?4MQB%Rh#ZOJeIEG^UdZe{t zD#o2p)b*CA55N)m7*RGbRIK;}YZ>(bKwKPXwYwEdK2aMbR{ZpdUQ9lUCe|^lnC^?4 zcm8Ab-3ZgZS6qZ%S`~@!eMPCSUd$vBJX;0pD2gCr-e!qYAM3?Dko96Q>(w@#;*PKN zT20*XYqGT!^ZYS&sLx8pim4x~dsI;cg{!PoZNND!E&Ig7=Tt1TRI%5nq8chTahbL; z?qfVgN)?Nu$6KxZ#60xpv&?ywIW78Jp~13itBVe?eXw5KWB#X%Q;$(A%wqfjNKa3Q z(*{0h6ZbKC)SDpg8H~M8Ov0UA%BNI=;CW`UOm_d~JX(M4L+HDTVdNH4I8L=w#tnpbt^F~e_#^_$l44WBuF&<=Q zL zMJr#VXcNRH9;a$fXPnEpka0QVdLaB=>W)y<1gQIAaR!20nBgbJLyRXGFEQQ%8lM^z zvj%C7c(DxkBUal&h(&|MY;=J~EHJ5t$}t0|o=c0JgLrU>!?28qJjTVq zrb{Yub1<));?W&eG1n%>ZN#fHubafOPt7YPvFcM(7g-O%eJpZ}@hk}{^j6aDPx1Ou zCCFEqaF6jRb)@bveerj4bi)k1;KQPl$#x=~!8&~ezgag!~Tp>ow{Pj zP|X7@j-d$8xX#l~QiIO{3MEcl9IE=Z#Fo#5t*K=5sANn3Wzm^-pbYmvBM+8XU@l5& zAWRGETgLjVeXgSPUwy>cf5EuCi1;&ziNo|_GZQV`siN^;mX1xa989~OV_H1SifIj) z4uT0*iSYvCjgzgV>Sh%?!SIl^;E6qPd>AI@M@X7@irRtwo#MtYs@|sIup>y-i@8k0 zLHlRqa~Dg|wnmS*SooRArzQ@fZ5Oh{a>n(HTNr<0Jj8gC@e<=L#z&`GOP&JGL&c=i zl<5q{?}0ENA)#W@aB@bAWVG}mQ(~r?cnU>b$%*{Lu~<7?^$LnA5H?y6_8JM*AZ!Hz z>r}=g#6)A;G}|WzYEjikCsqXF)F3oO6rlj8Rh8<(K%+0w=!KwPVV!pve`TC}hVq)p zI1fmJ?RcOz*fPHmHZ;y22KtM;Bl^XP$srh9A}`dBpK%xGLxq#&GYaDR2!n_Z)-o;* zruRRC!z1uexi}O&P&^5KZaKMVB$m|WBfZ4s5Fhb0lxAyyQHp?lBy+%%%@hxZXn zM)Ol`V)hqUFL6n6%qX6XK=~#I!5~tSgF#dVY1ywtju)QK@dwIr*~mWP5^|jy>LbcS zkyk~SDX*L1LLVe<;H?fU`Hu%{PsNKVqqV1T#O%@NX0d4T$3c-|Q3%#cl(jyH)0PIa z+-Z|sib*bWv|eljD{SzY*3vHsuVU;9){A4ti+#8_%k-;^_ZXitPCZNA08c21`e5pG zKaUI_FP0(iSti2VkwiEPg6e@0=Rp1eWUP}I*AT1nl>v`feuVcdMG4-l5EUrYk4*?i zi0}&tJ6LW%<8fxvUW*XVMyh>GHEIjM`wP>JQ|=ET+S>?X3U1dm*6@Hi2850ajffSS zL$p$!2r>F1#R2t!S#cBvf5sxy&QbB_FwO^J1~Q2Icz6aouAESzurpRn3>Dd7da;Zd zn3fevN0WH_L6m~9mgP4y*(WF@l*gbb38guE1?an&VkGd5ITdPrXFxm-hvBl8jTH}B zxDdiWTM5UCj4+dAJeuVK$a-<(9GMX+&vuABCli0|j2*R8>t=RTrTuca&LGgHcstxT-1*s!E}1 zJ(q0@<4>ek!Bik7j}>btQgM(M>NliZKia@Q^8j#|l`gWO5T z>BS|+Ta1qwC!MGC8I0dEE@E8CxRG%y5M_;yjtGrWYg81jJ!^#R2^^5(JZiV+Ij&Pp zxN5<5gf*UKyux^g@mI#l7pOEd8Rs!BW?aR%iE$gyxK33E&Gyk2FS3Xf43mA#qs|m3 zM{6_1V|1cp7KHmoLOdkSvhJ&l_ZXitPQ6Gangvu1_~tMCMMXqE(~3AJitPBxXso1; zL^rYF+anC(%oxpx&WW_J;RTTc#qr4JZ1|JN0a0eFk`#r5pD5EXixtnJeZ|5rVPo@R zOg47vShWonj@9Nev1u%f6_r;Zt9}em$BB~>uw0Y`t6pX-&=i!R?D;a(Ta_Up%5-$-JnU_MAw)*l)bZ!^Lr?|H62U@d4vAplaF=MUn+ije=<}K*rN9840(U zkPd=oG%tZX2V^Yn7?&}wW!%iTi}4`i&x{usZvcg&8R7CMP2brllMy}=#ZUf=pOM8w z7MXaNGMdgf7sy8VQ4|~6rO`$sJSAF8{u0Y9W?2`>pqR9x) z`BLo;bI^=inC~Z6!*Bau!~mxE{b%4VnFM3SBbJ;8&4*axB;%#aMniiHlv|wkh;?B( zS@0#TELVrHpGBe`MSN z6gofkjXQBu%?3}~j2$R$jMGfwk6-zUU0<1u$K>%sv3N{Z%pS)l z0{6bch$nG+@nq>ZGHP4D61st6t5MH-vyNw9!2peCOB)d?PL0Dlk9xYgu3rXCzg)#h zYUrq-ad-n${9whM{FN2=DsW%3mU1n6cu;dne;OJ8q*V=Yjmd?#!$)l`h9#yvA0 zbB}6cYA4`iex&x9hno}p#r3a^Tl1RnvEW_v4U7<}eA#N7aee|e3S!#V{luoPwUe~! zuhnPn#l?TCZxM;x|2Dn0B%b`ck4XB)^oEPL_6D|(HZZaNT_2(D1^bOPS95|h5hPLxRtiKJ8CoDwUwqQR(qZOSQDtc0TF%)Oo! zMT#9?;~4>Q@LQqaZ81^xHO`KAfN2Xe{dBFh@g+s=_+j}s+@~i0yUEK;V#~L%RQxuT zIAd&tI*UfA|F<^TYKjsp8f4=)rb-_(Ra$#xMf`%&9OBZPWW2<9i}4ZTr0di&Gl0f5 zj+V#bZ;U5$Q@+FT8nZ28TuID&e%DAG`362H@$)zIvXD5-_eNa8t>4I;TN(E-9kKX8Rs!BW?aR%iE$g_ zKE`8=XMsX7Hp*koLAxGsKYBBz7=!_C%Go3aydxzv1_gv&K7{3GKI#{G=PfkJOI zaXbHm@u$5{BliA>idyv_e{m;X!p<=NHR89!5Hr5OBNoLYThseIVp+U2M2S`LQtNK< z3DWo`i%3b3{5ptOk|0fGFG_&&2dw-VDOdO%Be6YRs_&VLOgR7OlmosVehWxki14ckE$&X{M)-aTH$wSTy8YySJv3e7=w@z;93*z8$bMo;s#IOD z_`(|dU@y*+|HTPgf}iT3R|jy0Qao9*8+KbNinZ`yJNCowoq<=v7tAtRTXjWxc$Vo^ zaJ>450;!*%5QpZVzpCrfSyQCujjf*{HFs>`94J0pg_;`uv8$&_FL87lviNnHv~Z8@ zn=YSofIgirP5YN=DX1Gg*~}lLnwcWIc!^0fwL)3+g7Vp>!kG@~kI#`t&untKxoaFq zN8zqkwKMx>%VtQEb9QHv^cCllP}*!N?Y`va%QwkbCb3`!m8WVZja7OAMjTI*eZ++{ zuA%Cs&71|(LC^b&q}gL``!Syel;t9IuMskz}!r{UIN#=nsyL&c*M zG`-PXn=uVlH2d>n#XV!$VnyZ*Xqa*QP`q`Wxz$ZK&OoQA? zlGEI_w@A*y`MGd97`A}{OFUL@blk2=mQ6gj`%`68*X=`m$;0fs-IXl0sd5f!yR(fVkH|m*3dL|vF(#>OB!?+756pLEyn$9QNCeQe7YOa&adxv=~dg(*- zNQ(nM&5OHXHYBDVp`7M3u4mlCcovBDBusm<{V$g*5v zzNd_Hs!20>b~mR=3)k*Gs{C>gaqQ1{jPV+?n;ds{VCrx-pxuL5aVQN^$;U~moUs~c z;oaRkQ(`hTx^!bja+)+=Sj;0CX_zGW1vZnp$tA_tNtxNho0w*;EbWELvPm+bhKiKQ zxSDY%;|a#wK?5&~8^UU4An0k`rmoSzvRsm6V zR#T6826y`jNnK{@Yy#EqrvVsca?8Tg7;paq4N3o)3J^<9mKKPbuO) zNv>zUJ&b3G+tTN|V2-qK`YxG+6`HoTTEXLsrKX>uoE8Bwvf%dJI!9t-x{DY#F{zsI zI%DoxVlD<+93(W%k>&%6L>grWnC&9tV`f%ezd7mB==tz#HfC>Y!>a)&y_?pU;q*54bi1s|Rs21JjoI-9_<3 z7M2E9uiT17_~|yy54?A-)EvQA=b<#|zaUq5f^#z<#GgKm73JU4On2#fOpf<6DMg|?!@Rf}>x`2pIm zv)+XBq_@fG*4ghdpC@L5Df30-Mk22y@@ghqI*FHNN~`mz!^F1pIkw6sY&FDo0&IBD zlyS-hif3PFXLJS$;1D|mPwf=ci@6drEHLWYrl^mxa+Bj*m)-=|oDsLW)$<O`+`Tr_grCXOepcy=vilFwMic$BdY zNTYQgKBh!pUBiQw_{mK6AeUuhE&0=Y2_JG}4h>DQG8g8b4|uQTV)bctzO!w9t; zq*jI{3#Ek@qHH1h^7Vz!FM-o@Xn(LV2TRvWi=>Z8T1@j6EOo5dxtK<8{u1+m%wC3` zTe(d0%9ZD%a`9KG_;gZNJzrw`b!t8mGbj-bh*hT2WKjN9FUUWY^UunG;!{+JlTv zD!tb%y}>M9z6|X9z>epOuC`NM&FdB-ZC0IjRZLgQ>WE`EV?ATaHA=|^sve2U3nlf} zsvL>4h+HZ}v5A(H!?bFm8QloPah!Eby-u3u11(+7YakOX?o#pAHzDn1(hRy0dsy}? z;{#?hx}6(xq{T8+>?TFiZ%`h_!^w zi_jP70PYA?;tGpBWt?-9R4fN#9yEvti=^uMK)2N#(20mHUktIW%%plhaaxPW2gn3Nzu_9qHD<~rcRaOdO#p13ovD3cuGtMf1xO7f6X{GBEm??0z8ekn9=x73(z(wJ}5xPdgDCyg13y=O2(6ncNnKWp!E5S z>lybjo@IQ%IK7@qWI4#LFO!yz>JlDR%%#piQ}c~8P(G11S&(u~q}4>)4-$4=jE@*+ zKBSbbjK_fLWN|Yelf|?Zm@JH=`e^~r8M9Z@3Bs1uP3MbAD==TIS!tXvuCBD4FD4bh zUau{9e!lp*0P}^}aeb)(y{dARv>04BR%5xBx`r(HqC&F;pSxb$H>_H3oKMBB^{C)A zsshg-nJZ`pS+D|$6C03-8DzStd?#0;L~~zIq9fKNI$K~q2YN`QyJJy0_GE8bO=UZ{ z#$2|USRccgowZV(AEx0qYt?yV`AWO9EH1Ql;34@`1&{3?X8Wn*T z3&aL(+IYAUX$gX?KXG zO(MIA;{fYO{FO9iF%~lJW<14smoe!H@ho6G3N$&l7p^jz`SMk01kKEESf!cy63V8I z#p0imiVVgAAe;G9t5h?eg5IW?`D@T~Z#BfWGZUNnDXUFpe#aV+YFNudVz6*?uU*Yn zI$@30aTZbAu4<%gcL0UL3!$pjQaw`qfo`HjKfI!fCs77Jv(zod$ z0&&mBi1}+Ix$}O6GI~`rR&3F-j}^;I9XD2NrLz3QqNf?}kpj!dkbWp^YWVLJ!c0Fa zv@rZL*BK4}59>6;zib`4?D}=kJ}v$oYmGOa)A)!qZeDAlajr?@BBRDtr12zaTnLTu z4>9f|?QHln*IFC?N$b##Cd0oG+AR$K!?n=!i%Irq6WM82vUjXypOWlD&V9y2D#>ET z9~loaUSj-}aaIEHEMwflcm!x|_>Zk?V$dhieYyG^-_xdi(}?dGYn?lZ^4Y*x#~7bT zDH)6fjQbdWVSLCqV=~u(@kgN99dQwc4rZ)wJ?wGe24r)P$Z&|y+5ihSW24dFp4tdI zS-a6}g$jz$@RnZj6&uup{w(@t>Lt=b?whR}BrUhkZ$u9rC{ArK>Z`U;l}D<~&hcM2 zNGpH$-i=WB>*ROL?(s5cvk)lQXf04h0<)%A2<)VkWmBjTwlE%Hyvq2Daqd*2t^`6g z#?(V7h5MHTw{fE8Bu_75PXyju7CBVY<1BZBaZ(cLn8&yVNIRv9B5CO-uPeoN2{T-M z5x0BlCYtrsRq4`VY2hnhS&Tcf{zp_)H5f^oWGvcq;%4Nzi*#H2%NG{YPDoS~!)x-W z*my>n{iD%ww4nsP0Q&T%C@+y_uX$w&#$-(i?YmKFI>O(!S-!w=KBrVY99>#!?g5)h zrO9``qZGwD$rZoD6=&ypX|W{l`SxNEr%t1`nGZC%&uZ0bj!2Q@}V`f5|l zlvuXRZnTWLM$*(Bwrr)To6YU8*4z$8&+!&2*ZgFvaVg_n##z%T&4%(WAb6Gp0E_Ke1V|dwipM-^6C>Ap4m67siK-88gh1=Sfo3 zYJ$INf)gpT0%F6-(}T^_yfY|iJCZQzF{a{^b=bu)mM~T^US^y;lc+y1u4TN!_>^%@ z8mTt6P)#YyfGo~X7MnrBE^ij$BA`&nCOs}?Ct=YRj2LxY8?g#oTRBz7A?}9!APFFZb%LMlW~bHkeyWU;FW`Mqm5Ua!X(PxpHVa!#dF7*SE5- zJp1%(s z&C=JtZM(73`?s50{AZHQdtP?)c1zixOtMETWY3apDP-|VIb$tjBjfx`N9iS!bLJMPBu&hthj~s-BiHker z=S`WczPy01AmBp{bvuyB(MKInpsZh!6=^p6pXtLH>IX%h|5nwWos@wk?{Bgmq?*({ zrA%_4X_=_K%sW`rvmWgd@3lW6<`eOM1#?=$U)2&BpE#k<)-2ye`I=LZw1z$nS}}=4 z;wM7{A1lAR3r&@=TjJ}VYkopw{!$^k;?s`NXyMd7lD=!hbG!CA2jho!a_~bDc$k1^ zUvQ@FrmRe#Y)s#SY#KHo1DkhAfyGKl`*5k6gilfI#@)KGTXqw96;k^szq*#7kMd{j zLD>pO+4dr>f-nu*bAtH7&NI$dO#TTR`NhOxL5BSDpJ?9KHqoRok94J$Jg3X}Y@v5& z?K7nGeW8#1J|1KU^z`oAdvL#x{X|v;)zO@RNyhMBgmNm7;r-3j;3u{iv$b5nd54K( zs$#2DLzp;8qUBpjblo;hR6P)eOu`;2jCKj;B&t~E4q{H;MR8<9J*9M?>@M>6%lE|7{kVar56RB% zqT#p{4)`A4UfkDhmEhWSKz0>52dR@)fj|2&_|uQb&SLKo2*n?h?&9b%bS6|s+}umc zxc@d@X(Z0C2K#^MQ-%9*C}4K;Hu*RyKB6KPSEF)CC*4uG-KX4P@{p^zw~v}s%&Eja z#MEVi@q`1;1ZaDTEhK-UunR@R0V=a0Xe{1?!qA*isV&`cYc^IwdD#rs)x&3>u`9mAvChxe0b%2IxIdwXCL^YR&o`158NbPqCk49O2U^) z(ulUSdDm0TAIFWL0{y&e}E2smeW1VzDq*SGoiFu2Z`$xahwWSd zR9l>V(I6ytlV_Jc#(S;?q8SfK)RGmd6RWIv`9q50GO?#TqIRx-OnB~zG1t5*&Nb^O z93RFf4W9dI+zUU}qgfW~FZl4cZM&$SX=+00(|f=G&)$9hp?>~$oPRfbR_@RtI(y** zZ*%_*7qhBS3H7WR)xTb2n$BtJ$o?6X+1p6fD2n$$&qLod1mUCTBI7XCg@%Co?Yq8 zwwkT+@pQTqxrxSn^Nvu7(HC~YG?^9iqM3dXMC>G$BI7uus*|omF{H2osNKSftJHK;vCbBYkKWvHhsIxzUC0TDCVDJojgmjo;?; z=Fuf;k75e|ABFjrVfy->dUH`aX}+C7_+%d8?D<+JNGcH(Yvf_DhE&uS z5*Dr}tlLPqq?nXiJ5gw;RaevIos@G}ea9W{|b zk{h;=q}4aB(S<}Aq%2;FLxmEF`{vf?xH%X40Mp$jBB*9E$>i)H8T4)RNO=A&4%eE@ zIijLQ?Suad+X3#myQ!&CDhTWM5EfPv)*T=$KScQW2;uExgeQ&@R{cy^a+0v{G-1|R z!m{&(<(CNau6T%?_wDUpe%WEQeEk!*>2kV!t!1yLI{OXEXKnsGpi`SRnewFu-Jf56 z^OZlfOjX?5cXV}eX=P~d;^bzi)}`Ctv}@s5A|rZ^cj)0W6H%$D!_y)s*u`G-<{hF!3xKVR{!m*uj`>6F8{w^HniWteZF{a%@) zWXr~uw{7c{*~(3uyN-uthEm<)qFtqZuD(X8cU#?NiEXybdS!vb0ewlc3h6Mw0a*`k z(W+e6ZGkSsd7b@seehxVj{*JO`LMOyc!$;w1D-gnljrs09ngQy*`&+awiz~6Haqn@ zZR_PZW$2I$-2&88E7feJukU@_o%=HVwSt$E|JG=GQTjR@ko7hj>^3O%_R!*B-zXm_ z$I;&s9V@Bc4$e*v9UNK|ymUq`us?wg6FGE~oTb0b?bzJ6QAyW%ospGtg_5V#O5Ysa z?AP;~ujo9u(Y9C~)*aU0l@W<{A&2ElpI7UbC@H#ZWv9bvCxf$7H|NXfhVkfnHM&Y2 z#cO4yb1-!5);ZbRJGbbXW&84Zxkp~qeRII(Fw|dfmM`-qWQRLBIp4QAXVW7M_qkZt zVB=J)FVvq$msp}tkReXa_D)VtUOp%EIm#)StsHI^Lm75;-l+7>)7@9b^5@$ zhx1W8rxDe%PXEnLU6zuhI5`h+YTi6gS0@kX8rs$9icv3L$hGR>oTp2bsY-*huTv}M zcFrgCF;(*G(N6Ym&dwlRl;w6qoSb`hb8$MMPu1169u2Or=1v2got>OBY;*P3^*MHp zc6l%F)m_xZE7#lKlnKiDm#Sn%=Zh~_%R91M*@rGTEOKzzxUt`UeM26Vi{x6lNp6<+ ze?UoX7E-SN;Dc^$b7hZi_Kr@@eVqpQ`J9(68g*q7 zzh)NU)H&g$)*V}o9*{1(VU){sU5Qen+(s|Y&}E>8cjZOISL+&;CrYF8qq0=li}8`6 zWGd&BOdb8Z4NVzHDOPUt?J0wn5~T?Lij_)OfoRv}UWU6$mTqvKQlR*(mOTuea%IO3 zSvKe2>a`Q*?xIblY?SYZ*Xzb7C@^PNcRKMxz%G?C=bd#c9pWfSKHyk zV`eL!E-sEP&EsWrTL(uc`;M*cN4Rvbbyy)Cl5NkwRiuo|(H*d9lpRW?t)p{?=JuUk zY#m%33gqx%qf?X+TL;fJ4u!J9_K8fD*Og93Wsh^Z0$H!L+$$H@tZ?YuwR2|y#v22CTZRZT|sZ$GNyWv>o1|Th|^v`uA<$pB zV;kqhW+@6xmLH~(1!#>5y>CmWqjG`VD?@svC}prI4f-jHVKww+>8ow?b)5qGyY+A% z?mSQa&mV5ehss9%U!49pT_(!m9c>pVD{RtrE97BiXsgf(k;Nn)unZ0txS_c{SHuqYe0l+>v&8aDKc9Qcj*7v z#;4q7gRHVGRC=b_@WqLV1ursi%ZM4H+AP^yHb6k(s#U9qSCzi ztAD9PCtM+&dmMhXQ0bMe6zEE9AIq;ZZM?jCb@J`h*{`o}-!=(K+y>jrvPWC@59(z5 zDYi?L(GJd$?b^Au?o7tq!NJkqaa4xg=u@zD9qrGcn_h;sXwcnN)+vd)oytvJzOG)` zsnjd(*OluE8JnBRZe6u*w=NUC`LfK!?6gy#tj|R6r>o2Iv93|KLYbm#P&OzlliOSgDs?g+m*v8iu&(~GFwMOZ-??ospjEW0@@RVA`D*&#d_i-o+k)J7{+zzBek%t zbVUQ5=q36ReJ#@WVl36O?hFj?b4s=@oB4?MGL{A;g?5xF$cxgJ$R+q&p~NGdG!fnf zy^))fWGKzUi-)zI;v=%MQ1dPMsa|rM+LWT=24O#}2JAAX|3o@Li&;Q+m0z zb@NM?ZSO0?+Kur0AVCf=7!E6)-4bPw0%d^`u=fqORK>YLSs^>N8Rd4@-q|fpx(66q ze$Y8p>2}@0c}SV8gvI}$efudo&%-iZpQU$p&XI?kc_rYUkBc~u5#n}H4tH{PbZXVg z!L9qyHr29MvFzBr10qA)9F^5_@Zd@%R~dn2QhT>@={lrd_Uc>=`&}*LI>gK9L?y*0 zN1yI|z}C5wo3qd0fT5)0YtN&v<=Wnm({;tl6s5p^ZmYF&O#frHb#g?lj3}XLTrN{C z>X+Cox68DjrYuvI>#pgh*e1zTeT=h<0rO7V{)zf*8PM@4YFDMWcIxEP^X&}T3IF}A z*ZT|P8wX(jvk=bclhC?z^=c>o9shr5ftRv$U-+C<{_WNvXGymKmAZO;wPS*9s!c+( zeEs;0mx`286?PkJy84dt$<-%fSzdsZX0krb{*-;bL#1wLf^yM0-ZrG%{{Aa_(OsiI zNQYT`Y;#$ETZgrYvfcKmE=dkZz%a^|tCa(?s#&~rT`fmf_@#e2N@C{IKlUy7hM<5dp2bc0FU8qM!0oiLM$N z0vvk0f9Q>R<&w)TjLjL2*}9q7p2RtHYL%>;B0G&cs&lk&Y2O@cM|+HdzW>Mm^D)iN zNf$4dJiT*+%(W@SlFF&0Qzxf3{b$=bS16@6qqAkY&28y4Y_@FGzvFl}uNL3LW58r7 zrH)Rea<4ufOZ{}rnt4i%f<>5$h56c!u zl}des;&~I(XmEqXyu4a>O6L>NKhkYju5S1OD9e{gSR7zCkSGTnRq$#_1uojyx8I=a z4#RKXsjGd*4m6-KwCPXRczIp+?4|uFlGsh1Mdck_{`ddh>h_yFZ@mT5+eY$RF2BvG z@)(S)P5-{-?&3m01)|ag{^LY7`T}f9Wg#jrm)TTsB+!4RYxS}Tsv=DiEic>C#arFX zTB!2fIFbLhH&ER89}%tDRSJo>TqXT($vXx$Fu5Dl6H{+F- zUFTw{>vLH@Vx#@Mmp*%|#Ma}XGEHgJ?UHA0ckBQ5w;G#7z4IIMrJL7c-7LA&X{-Kk z%kB2)`#)@!|Hj|SYDMQ(R+U8hUL{&b~sQ=hME7O~TQ z*ed0wW0~y&`N+2AKYTXXx~;JSw zwaJws+jTyjJRMyfTUN_>~u&Z#zVqRSl5Yh}xVK3%mnv+#Zu%Sx%x}}S2 zf^==^dRe;m=+&`jPsf(6W-2Y(zCT00{z}*@ues(Zo25rOHaJ;WcVCqIbUAi+U{+r1 z6tB4a{j2M**SNk_CGWkw+5Xc^eZ(eR>w2B*haFz}Vu`X_PSQ{O^CaD_zkPGqVT)X* zuaRFT%kD1y8y$Dco-5>R{BuN>9pc*5N{mMui47Q#mnD{bE0mUgOJuoyB1ZM_{@;Cv zE#}~u!I`pMy9LrvqNLfBIJb*`WrY&2-z^L5n|H60gWa544SREnZcT@sFO}+?oD74V zIy&3uxg_aVw-}uM(gIzcysfK|$#&b7l9#X%SDfrSpu5@I*U5jbwK;?v)a}azY%RaR zYSn=ounb$*=GfQzwQ~v!tHf5K3QWcJ<@$K+CF3&njW$_w33fxfp{lL3lT(|)8+1+` znv)4?J)l&2eUL2scgxo~4d~j!se|)%GB`bZ)#!WWNT(i+`nd79@ofe;^=~n{4EKe0 zwG9aLw-)zGjqSvWs$SOdzw20s)yw(1@3BFv)>Q#hut7VZ9KedTls9d}N1HeLSB&{j;Xaji#W}ut`)ZbcM13Qy5JK{NHuy zbwHj_D(n~NPuQHWDOW0Ff-c#n{EaDgM_(?rDU(jl&IQfy{b_N(Fc)9v8_NH2@_0SR zKI;4{Yi+yE*VW1-oK8$pT>GEIuDU^KHSVhZtlbV>l1;O0n`b(=Ikty&jrtkNKD%45 zH^?>U*AJDcFMsmUfCbVKhbf&}6x(BKs!WmHv-Ekk!%JZ@HtH5Dg>tdHZ$JCx+0Ab2 zk2c$GyT|rYvwX~RCAw$2rx+d?*sore%XLq&nOG|uZ0}B;|2AlU(^{$5 zrM;zS0DnY+WO=vwQVhT~9&+cuUGaDX>ASD}t^G-g2wca(Wz_?JUGX#SL~lP^{p&VI z{o4`0ubz(di@AzO!ryPI6y}dOtBBUP&aYEM3;Z2&Tjg(iNBtXjPyOq4UlHv=cNaQQ zioac(>BKqwt^82O`StijC)yJIbM?AL`g$dd)czNLQTgt_2hDOG_qFoy{rY;-5R^IWy*(UtfY*(w z`r16PooVm&sruUQV(k7xUh>O!X8LO8>isajw?oPyeGSSIubuDK@UQnxHp;NKedW+( z)9%aJ$!56gBl`Nf(cTQ#kgTt-pWogrkGHodk9(_wso(GY4#p(def_%*W_`~6zJnRA z*FNPfc$N4cTM{x(!t334giPM}RLIBy*S{1p(>3=iz5n%rkl9XhTJ-g?=_zJBb7$!5 zM~n4!MY+D#{wl?^H~T-zo7Z+U_19n7(Y#-KmA>x0xucPe_;T*m*Vq51dON@GXy$)p zQYTZtp-U$-UB&=?eS1VF)83>>oy_n zcj|1mv$wl+HcAk#;kwRdJ2m!pHuAykKGWBaKG*x}ztGpq26Zvh^Y$c zJJ`hxzq7TAneMlb?P|ue^fm+c4P#<NYEHeKAjvUUz4u#i^&gB zzJ~lMc@z09@=o%9$@|F>+8d0xCH`sTZ1Pz0T=G_izn**q<-a2zO~#X4)84{Sn%-~7 zFHzntN#(_~cOrQ(c^dh4@@-5^n z^6zLbLT(~oL0(IH8_0E(zes+N{4sev?FUieQr@e{L&(1+PazK^<2wgU{Yu)qo_sdt zo5%&^*U2A}KO?VV`1WXZ68}o3{}}Q)ubK9Bqn`B?HH z^74^*gTJ0Bnx1U(2=bF;xN9@L{~=e9|3SWm986PtPm$-7-y`RdTgVg0Jv*xXS7>hx zxi97UYV!M(-$nk8yoLM{)Bg_nDB8!cW0v>3l&5r7zKcABypH;(k~1mKBVR*aNPe2} zUrm01yn*~X>c31rn*1U8QtJOio<(`zE}Fhlayt2Q^4a7=3_p*&hUs5TKA(Iaxsm(= z`D5}2Riw^QE# z2#x<%+Dj*=k*AYqlFP_fF?=ogujGy7z2xoWCdU6hIfeExnK1L;O8GEyPs-0A|C#bx zud+9tc|7^g$S05ok|&c#kW0vCldmPO%h2@PL%xsvd-AR1 zo#cOzKPLZ&{3H3$7`4~Er>3tj`DF61$ur2?$pz#`$W`R$X}^}dm-63`zawuaH&Xv^ zH;9 z9QjY=)5$H2e-`-x%9oP2rfPe+mi!iZ1Nl{Q6L}%q@7v@*kiR0YCU@zp>8mE6M1Gun z4*6R0a`HXoJIG&>Hzd?SDyr29bxi{l$B|pXT?9*S<_Yipm`E=^fBo~uQ$>)%-A+IDqKu#q;OCC-B z2l+zsKJuC5o&z*J<>V3M&pBV5Np2-CC--Fgx|941@@De+qL z`HhoRejE8iGJdtv9ABR$%TGYceEzrOugSe>uftI)??fI%-bx-vev6z(eu!K`{)W7c z{4esuvp z-zKl7{x{^&lqX|@L&~#1^D~HiE%ir|&!qljay8`_lFy-hDfthS-$ec!`7!e2*P}K57KR@|jxhWTath_;)OTLu)Q^{A67m{D1{cFit4F6m5dE{5f$<+Ul z+(b@3R^$IOc_{h6Y#-yv`zSx3{2%6jIr&}6Zzb;`KTiHD)BhIvPvm{%_sPAF)AT$- z9!nl;#ZR6_UP=B3({nHReDYTEBC>qhocNE0EFXO5hRGjO-s^bfH1hG}LrhO5`B;X( zi2NYaQ%!!F`tp%yiSHHKdyxD*c^i2?_1__1O#X_zmmC_d_P!$zCHJJg)5%AX&m$jC zt|EWR`n`^PALWmc*O7OUpCo@rUQRwDRnxPI`A;L)k*ASokr$Brldm9`lJ6yVXZda; zk0<||d^Y(f@;A&+pA$4apVQtL@?GRy@&hctD)Pyc-$u?P|DHUP`F)pMM8*e5&H621 zdU~Fy{5ys}g}j~dO(thE{DtJZwx$^JS4}>dd@K2+7ghc^dGI#nx5*EX50aOYhn}SA zd4qf=dGmG+znHw5d9(AP*tuQ~y+QU)Ilg$@fp?sko*JX_{6?hKd+IGB)>>| zXOJr>zmR+{xthF89u(lOjy#n8;dkV%EqLl%Guggglje z5A!#d{8z?zDfw*jZRC~YC&*KOujzk-oJ#wjk*g^;#%g-rWq$jR&tQ5-kpHwy-kap5)c=Cqo%Y*})AUUy4a9lng1N}aHhY6 zyp#FAhFnAWgXDIs{~hG_C~qc@q&#K3rl&L0dm?!^<`Nj`-P?_LiuszEv&!O$h#;%hx{erCpXZr6XKS|z9?m&C*kT0bCYw~|- zKXjU=?|9ljhI||4W64kN(Dt5BZXuVGk9}3;HpL`E_Dft@mb>!3jp!)Zc>&Q=#H!%JkDx)pX7~@t8MOZ``6%kQ4{LfW z$OFjVku%6WS$?_X<+Qhmd>grzJdM1OTtI$-{3+A_Hu)9C_c?hU*PG-u9-N+};mzKQZts zn5O4c@)+7bo4kPeDJE~D{xb62)L%zlPx*c1Cn(=cp2YOMNnS$!hTMEGkG}k^Dub_)AvVmKIQ)=zr*;yA#q{TWr)m1GX;jW2 zPk2aq3i-a@Dqlq2_=xgldD8kJv>j& zCI6FrE7P-|Je1-4&D8kMCXXhsrv6#v2PrQlf6x41O)jGR0rE=n3*=7B-}~f!%nuGx zo8#M1$_JC5q&!RxvOWsPBgi%69Zb(g@^x(QFO%OPe@wod5!UZ2@+79`esVwZcJdPPhvYA4?Up#P2a2JapY|Bx#aDPe-U{p z<+bE3%wHq98|&+jlS^suAo)h-e_+0*=Y85AL%xUQeIEHshF?MMPyO4;3z^@i z$=k^9kxQ7KZ^)e(f2UcDpYaVN&tmv7Wn*RG@az(T9TJn;Ql{b;Q{!95y^7Wr8 z|41JGPvxQKYWx%bp?og+2|1{Wzcu7-?<+q<{`!-6{Yd#z z@`}GJ-$g$66XhM`>poEaoP5U~_zxm{LnCHmf4dg-OSIO%! zPn5r;^VMF*8y@{VzasyW{LwWk|B3u)t@5cCXnb#8r(8%r zX-d$%aXoqRnaWR**H2RZnEc#C~K|Gb|1(pGTfES@{-n#|g^Y$X}DcBJV8g zY^JC0MQZ>0^OVEnzstd1{FRWuUZ8w4dCXbLTgi`|ulz0fHqsTYUP`;QvZ;J8_+DLB6wG`6==*FIN7PeB^lL{&Uq{XU0F9Jgi9Nx05HIqP&G%GE4a* z@+tYs-HX-UNtw#&F-c}jC|Vz%5PZVA65RIocpkHuM&;_qWhK8$yaYw&L#14`BYGrw0pjr`+d%2i}zyYlVi70)ZbK<>6xxtaU|^^aYk_AmdP$}b@Ad|G)G zxp|B7{p8PHQvM@($}`Gek?WsQ?y*qqum6+sspJb@Q;v||eo?uWyy6MvKatEzr6$`_Lx?onPv z?tH!SljKP^E5A*ys8Q}zuJ$jeRX&}3Ql0X}n`P^mS}v(U8OvO+~)@6HRRcsDL+W=R;>IsdEzz7E#w{7Dvw^O_8(rV93fx1T)CF~ zLb>wq$gfo?e@xD=RPJA)_AXhhJc&H)cI7hi4`s^h$#4Ezc`JGP9m;#je_?()S2Deq zt9%ssf)eF($dhkUE+cQY@b5QdZqFY|R5RlbtEiTnupvZFhg?fLKI=ejBXXz72d;RjW#{ZmG({B-hHeUz^v-`i993Gz*0 z<+sVb(v^Q859+GiXPMf6EKPYLdCq=~|5EaGA1l8|eshBAe`v|&gNgV%X}Q|Fp|^5A zxqh7THRSv*$_?b>_Nx6?$&a>E`M2b&-%|OhE7X4do5~lHw|${pN3Qyh@@wRe_9=H* zso{;F+CPze()%iZiv02?%6}uDm7)5bFVXNn4N^XxeA@xlzl?m*K$UMHPyAfv?~`|) zrt;)V)!zNxl}{x9@TKY(l0W-}%4^BZdsO}%dB;&IKj|{H_rt$bo=@KPPvuL{@_(=|B{g^Ka+fld~g+iSCUU^ukuag_O!Q?{O~ub{{#7n zzbTKnTy% zCNDWwIkiUZb^c7l=aHW{S>+FqFFQ&34f0Q^%H7sz_}Aal@Z-s^1yo*4e&IuvZzS&+ zqw?1+9c z_VFS4+~ZV!?3Eh+gX5Lwkza4o^sOPEBp+nP-<{+>te?%~^b=$+z;DUlH{=?$Q~B$4jmCc}%2EEtl5apikiYZE`KTxPyOewo`H;Vj z|pXV@&~h&?;9qjPFMB6Xd7JSKOrbKPOKn54&FNhiE^a`~u}ykb96H zBmbW9|Cv0J@qI?Vp7P$mQu~GEO!5lGS3u4o*N|&o>}ZzXM)HpB%CC^`->MwELG6F` zf^wLA=kv-d$ZtQV{3tn{{3miZ+W(w(kBj0V z=ivvHgO>guJiN!lftyVGw*E27c6_ILc&3MoJ$#9W*Liq@hqoxVx6=EThxd6nxz0?l zt$(D4kMZyb51-}XUwU|zhwn4Frk$0(->O_I3pXG0@C(Ye{#zby_V7WI!?wL6Z#MI1 z^RXVz@bF|0&-U;_4_AA5m4~nN@H!9Q;^AL=_&yK+*29l__-PM6@8Lgs_%9y*tB3#T z;SW6gnTNme@O}@sdN}zOcl~tsa8D2S_wex^KE=ahJbZ?SCwn;0!x3e>e^hzomwI@u zhu3-dCJ*1?;d?#&goj`9@Vg#<-@~7J_&*-r?_qqInD|G#zl1zIz{7(*e5{9m;o%t` zUg+U#JiO7vTRr@Shd=S~j~?!Nt2=+kc=$9ApXcFX50`nk+QXN6_zDl-=-~|>-t6H& zdiWg=|I@?G9{$$D`#pTf!^yX~%d4x0kM!^{9zMy#86G~v!)JQX5l&)*Lk>R<2oPL z1-LH6brCLn)tvE5Tyt<0;3~vbgbQCeXUxY{f~yqQ0$dAmmEl^1YcZ~JTuX2*#Z`f; z5?2+jYFx{3EyuM2*GgQM;JOsoWw=)1x*XSPTr!HT!F2_$wYaXtbv3SQaMj|v7T0yS z*5SGy*A2LC#B~#{I$Ss7x&_yIT({!74cG0s?!fhHTzBHS3m3jB&$tJdY{AO5Ydx+F zxbDaG04~`om+jZz;F4`s*-Dk|SJ^^+2-m~79>FDB@Ul()7_P^0$rkaGxHjXG?Pl2` ze;Su;RX5?1Eos?Se-4*yhrfUee_>oT-fIqI#kl6-x(e5?aLJZ=TYLEbe0wk=lh2+x zDI>yP=smNdyn0Clzr-p(LlsA4|2$MY1=EPH@J#m)_Qlun{Ps~|#k}IGD*TFcWdf~g z{7U7b-14%r@_F;(tGRzyDuJHkH=*KdnLl$CU+n&6tN42M@65$l(O+hZCpUirv$U+V zYGphPR(?EjytaVagvk6MvIIfRUnYwymmd*~C$t+{+?q|;(i}g;7cU0;H`?MV;0Fog z%JAES@nrJrrg3G}i&)@s^Tl6GOJKpwdED^$5%S{2RS8Q+e~vO<4Ce1V#uIvfLNT76 z^Jh2X=~%xb8c(jjVwqSfKVavpG1dBQPG4!R{vvH08Gpqyf%GuV6JE*r%c8!9Or4+O z>ukk@zD~6c>+4LlpW*9N?{L1()Qa!xO!3d~b*5foUuUW$@O6+|znB@XwBfJf`y+%m zf7CQyV7tQOHaJ)~oY#Sh{d<-ATkL+rtW!&W)iPe961y<56VHW-ES?L43_sx+FU|zM zLjuZgz{U&uvwR1PB=ifAC-4ilG=4SVC#yXP^q=#{UAxx3Aren!BBnTT-;U}a&3;oD zDkSL9s*$iWQzd>sRt3K%5URqtexX3%b5m~&5rk9s5$ttg2T;-D?k>!+^ zF0S&6EWX!~=;HYZQx@wU%-gY^L2mm`Ohn@A6HI}RJ23B;SC&?lmV2FyDXJ(fuZW$m zis&%@LsSw>J477EvxvyosYC@n{v;A_iUGm7r4?1x1!dl<%(Z?X++PsCO~FSbm{3Ga z@nQUptrO4Rs6rxtV`?P!H>#4r-GFf_BW^lLXFkLMsDi|Ys|^LGTMaCuHaW#yR#r7;}~(u6Y)NwclsJL#Z?{@As* z`ATRXUm~}CdkZ9SClVu6p|EbCW?2NGjDQp;>soH9v;oCoLRFf3+8)u z=@KTFS1c;9M`Vc>b|w{66=0Q(Wqwt0g=;vc!qmBCUVBp)&nx%D9FtX;K3hy;KP!82 zL19_(Tu%r~>SGLpvuV$pJ>1tu;3Kf};FZNR8_BiaOjItmy@}=JuBt+4TPB6)$(Ajf zTvi@a*tXCo(+-)pj{GJ9tQ}9Qm%RBkM%+FRbzQO2-OeMPtphQdTU=S}N&wn-YzxHA z*cOPJaf=i(tHyoW1EhBTy#?-+c?;Yriz#rYaB6faDw%}Hub6P#x0v!u%9q2@%`2Th zskET1e7;@h#f8=LBU2Y+{#Q^|dWqdnCYP2Ko1Lq)a^b}4N_*yP-bWc zchhr9aw^J~NP~#B2dC7VMqB2o9s54=l`t)k$4Lt$3DV+IUgnD1+*_6sKo>Gs@zGWm zPd>4@q+l5qc9s|L=%EA2j5%*fadgact2j5+JrZ2Dmp&kSH!t~7T;ToOfZR#%o5ame>6VY6F_3Ysmo+zr=Oi0v#Qis>ijO>}|kLNf`m z#-x8(b>}P1FNi)~wX-pEN%3NFnfCZ?OUyT}$4^la6X9+mNVSzZOlYvJ7b~{X7hmF> z9Y*6@Sy@%QXlCI8thQo;B3m){eEV}`dU?@8w`y*2!CdFON@Miv)|fUGFN{@1gC9L9 ze#=*J{FZOZ6SaIO__urrV)hp_^_2LvWr$+ivfMmOTeehunkqzQv_1_5BL8}rwYbb# z6K3T`FvBP)Dq&YKt>u^JlvhOS+o>j#N%iV>eX1A_vMZxanfEG+o$cFs(;1!Dk{JpU z=6LrfuFNT`o*&(!(ey;JtZ)-oIu|G|sWtuaHEm4?e1&FN$CtQk!I{&%Dx}L^T{AV4 zioInnOK_i3H$C|DQuM;b#TBu0L7FqQ;D#*4s29?dm~ylV_Yh&rGUqNUSX@**H@=2< zjUSDd73nD%L}>Y5@6^JM6*WAudfvR^iaf_6CTbXBaY=D18xgR3VsYu-C~=smz!pYy z#uSa&yzg>&woDqhYda%q&T2d{+o!QA@k{dT0@P(ig65B$sg6(Ywo^Hy7*^)`b_0Z; zQCzjWyka3HrYr1KU^I=C=9exiF0c0XatU3%Xp&h#KCK8cXVm^0nk*lgdsifyBE28K zrd2+rV6kIYC>mO$ODy%T>)hg^@`|~d*+d$NNXI>oik$*1Kr0^S5>*Ce9!1f)<_U{$S}1M z3>l`JXa2koewZUu1^@YtD!6@^Q3V?D?V=#!Hbex}F6${o+>bjufy`=KcpE3d3EU-bWzaX>C zI2~6fqOr|=){?pQj4}SH+8Bxbuuz*sjNCChbIUN?jh^J~BR(p!(3n|KilvofuP}}t zipjHaXYIRv2#Z$ zjxhRw+O6O@&Egii#%iy~bzIg@n7Adv;~dV5nJPcSi`jaKyqGE-&Wo8^hxcNtb{H>a zD#i6;ru6V$%v4M0#Y~O(UJPRQl*L_D5To343LZa?UjkrBkB8fMx5E*9_J_C{|jX45q*Ph>eLxT8EH7N1v_@*Sb&&zGQA$SH; zQ|3O~=1f+cNIW~z&Jf;{uWp&=yqi-PXL=$DjP7N-0>t!s(Ur}Um??z_{QA3jKenrz zw_PXIobkF3syQWzJ%d<{KVcB5zsnGbpSOtKk98E@qpo%;Jttl5`<{cYp8IiI4|;zB zKVnJ~`w?3ujvrBZ0zYCZB=jSy5#NuPaz8&}3KIGeQzM=qF@?T<1QP#&UC!(z@FI}< zkN6VKXRw#scGdYb5)sGg`w+$J}l*Q}h5ZY4#pZS8M)|UHC6{z4hOE5(- z69n^atd~GMG1CH3_4N>P-^WA9ZGR6T64y~yXW<;iLm+G%9{`E353uk1Rc~~jAR|e< zL#&Y)A!>p11wWCi{9_bc6&E9oJ}HZh)su5~SmZNas#KI9RZxhvEwdwMBSdtL6RP&n zRY|7fe)Qz3DS&5o9@Me!IZq8*_uP-P?7JleI9goh+$^(1@(kKOFX$YHB}IrhdS=xM z5q+i*y|cu6O8J$1;A~saBEt@#Noc3c8|#0KqN1EkDkx3Fl=Md zgOgSgY*F-~eT>L)Y%)d`n^)VSeW20`r-Yp%ZwWhP?qY<*r)Y53uW0-arQ(p1-m=&9aD1fJX04!w8+o_?g)vn8(txqpTsikD%Cd^3#uo(%gQK8?gVdx}oHthk~u-qBN+*i|IXaNY;Gu27!T z+2P#PVc$l6eCFy-v41iUE`Bm%3n_Yz0JR=-I5HAX>^>XmRl_7sCbEumNgfTyHncki z>4?tLrrvPw!=@go<5{d%Vm>r;?fkmq^;C{q=$gtoMDCh%2vE%4W2Vjoxy12HQq&Tc zWWwr%FkZr=CrmY2;#2KIiu9^xcKpwmG7#F!XrDuNE~(E_Pz{@beOGI?+YSuO5 zu(h2hOQX8pRZ&#k^O4_Z5Xbg~tsUCO{ zInt;tzs~A7MM}k7*CA5-W?6B8brg~J+($_5n~54X`WBjg+{SH+6EtqfeH%CK`!`q$ zT#I-uJxF32tlW!pbTpbfQzN!PB5a&C0f}$HJCBV8j>~VE)ZDcefQT4 zISfkOcn*lVrQ&G(D;L)NkB2%9I8KMg+;;jfyL3EfLmh#vmg3!dj242W5x0Ef9Sn8E z;(spGq2N558B^S`$D3Rs%_F0(L!nNw=S-+uuuIj8acu;SbDx&JC9sZtM(@X*`t*w6=G=YN@62a3kZX3M z#Sfn{I_`;2E2OCu-}#$j-}9a>1ODy{cM}f}Q1CopVY`PQftwepkC(>ncvA|95_?)G z#CL>Ip|2x^*w16xxBWd9#NIQWjv`I$77*6z_10+VZYvH2Ker&_L|tCw3A;QL{JVVY z;Z7@4p0l0yZ6586TreYDzBM&%WONpqmNq{cPj*huG9%)zR_RoWr!@-3(9liumDxF^ zag2?IT67JcSkD~8%#X+>&_m)J_TojGfoQey>t+SAJ0mYLMsH=uN$VI%t8=FyI|tvy z>RU!*BpEK%IGUrR(4z^qb}6!RMw#^!$(uQA#-uZIXU@urOw68=dG6Gix&Bd(N^|Ah zHuS&RNypdBF3FBlt7DN^Sx0B*6vZjou@(B2l<_Q#lY+#WgMS)r_7Ex5 znKNc&XXQ_wIU|yPevY$X-C?Ecn@>x%M~X1MvUGhN=KZzP+4NAORTbrBW^2dv3lA5{ z+&T19M9W3wo(3MHh_baTIt#?BCk`BWSt4#EanzzI1YS}xihD8z;WL+TgGT@ zG9F1*=Je?kGqa|dDmlyY#zdU0!Y|>m#o}!Bej%cz;vCq#nxo)0?1MqsD-#vVVLNJ! z?Swtmt1Yvl=$XpItx9z5RHIEV$XV%{miXD$5mOGwWakt*MuQk#q}rjINL5CJ(Ua`0 z7o<6H`xbr2N$SLTOgEcr)VO>DzCG{qCR&u8mJ{j9JaDw*vq#xE9Qn_MN1K@o@0%c^ zpFN56rZB_IPV^H`**VkP(T+|O?HHXBIO=>QK42WTIK-*jx@MIpY}w-BN4p+3X;mh! zO${~4ahx!5g^o2#Kn_9XajP?XUcyS%0ImoU)vKsuV04_qM|u)@2^pM_ZReu~3_Pw{ zN$7jWX@=b4UBMH^?o2L+J(P#}m!N88kQ_b9easUb8eK18yVYRs=O$Xohl$I(OvV%` zQ6kgQQMG1eCD_%NZTiwnKe@3NCe_|37A*uwI8Ev|zkbv@~i_Zrcu_4DROppes=EE8D~bO&X_#Y<*e z6NED;b?vy=T0dtGOO?%rP+@)9D@;1ZBU3}xhg?+YCZ-i%k*7 z?A#6~J9E}I$@&zbn6~9|k`fszjLncsO-@xpEoT{0;oNMpG?uY><4%aiHEffnMX)b z5c6V7L7c2t&)fRND_YHv-@Xd>65ET!FM9R7UB%q1l#JPt>gp7&(_O@)q+e@?I($K! ztt=)%85Qznw9YLxDLyF~IpOW{khZ|=Wkq5yZ*&Cz+=-H~x^Ws4mSLu;2507E&&bQq%ojIZ zn3wKo?T%p4)Sv|%J|)P1G$oEsO^dSCAaXq)g@|Q7;P7w`wdk=Y*L2LG5qO#_tP%?ytuU~<31X*)fU~O zA=B}5Hx8&S6eU|jCmi1T#t4Ecizzm7jE7zEGby5LWeuYMP9~!A;KO2# zqNqJaT~jmK`yZFxRwy<8^A_6-BYtx9B+tsyvq|MpHQNyio#U5pkso%ks`m5|U(7*4 z8PmPRrVsIaRAV&L%}r#u80?siieO^y9PTt;X%XWqa0IhejO#I zA<~y)T8C74%#u*;izxPCAZ0$IC?(QKJu5?%jFTO7bKaD*Y=LtHN^vE>g4DUDRFTxJ zHD^uB(D|x7H`OiWw6TsmlV|3hotckOCL^ZJiWNQGES@b|PGd}$F*Qx(miNb`ytra< z0iHEDhY?#7d5qO`j2C>+{PUjCIhA?92MKhh&pd#VHZuA}Pg3WeJW!{?{I)$gn4azM z?^YCPMW_RO&$0P{7B&`GiYJK!|3eUvS{&tcx&51QAJmcvJ-6oi%qu-?pA4e z%TrUGRvJC9gl^-Qe%KK%iXJ&~P8w~wm2Z4k94x@`Ys+!&JvemrxDci`D9BMG&E^9z z7ZbTtbL3H%Uj@h$`1sFC^oerb`FZ)-XD>i+OON26vn|{4J6ezHX`!VsinU~(8Ih{~ zKdmO2dDzD(vvXExCB@dzC}~;Ni5^6_43h~I;W+!2PY|<0c+|_UMn;L>vA&qhuNY*q zf$6ffJ#4yaBrrBAQH&lLMD4=e>4T{=XHA{tyM%R3m#ktHJMj2CS?HRGc~tZyQDruL zP0sXLXJTT9XP?fAsWXfQFh}JDIkBN+T=vOVh4ae_?fru+EWxwfP0=qf8j+*)Tw|}D zGU!B)aCuKXm@Y(ymy8HR(lj#UpY#0!X~d3O3v9?q(*Y+_CQ9%flgy0{sOC*|KF@Zh zBzincnsjV&q-(3U+g$148zF<}_VDOQI?o(uqfZ=Gk#pIE-mh!LnX~e9X63s}JvMlT zCK0YekF#fcR+?t7ktLvGrfC&{Id61)p=|a7-$tQo(QlS@pTuz*(=6x#U4OSKwzSl# z71J{PlYnO9JiX^%U1JK&Z?yh@zJ0|O`xwWl#bY0`@QOdXw~9$-NK#q$`F2@L`3#G) zv*XrV;G;FxQTtk~*_fUo6>(}@=iTr)_9p>+{f9Zt((e-HdC0hGTIJRONZ(03w;AZ`k@aDnD`$S?6>UdW#^Pvs^5vIY*zzRTXHU<^{5Y*N zPV+sj$8|8sr_ajj#abZnv0ZQ~N&bBHuMO*fReHETZg z^P3yV)?VVE^XBi)n7qf3;X?dVg(mfX zr)?m3OyxS3xONpmFZS6kI*m5`pObr7h{?TQ6^owd3^q3KVw#)z@YqUv^gK%J`3>|& z=aw9E#D~Y86aJV|&GSD?H80lb@W8P5`|H`{596`Sjd`DssQ7eDpN=p}r{vaf` zjT$pI?oU6MTi9uC3o*?gy%b-no?VJ%T#P8ANPdIEXT>w7+B|#jBN;1uIWjAZwKjH% zej~bLV_l{-?&RqKSD(|pEHJ+_*%Xbp=Pa1T#aZdbpTdaCP?zZEQABFZqdBwGX|(&4 zsFf1QDK{RFMJ~_%s?(fP#m}wm$}v%~9bJS>)6YnfZjE_r#){c|G;U9#T)Qo96@KlN ztB9f+NRVyB>2TZ{mJLUaYz1=_Z+&5zYq#B{65ZH$cI~JN5@LVtne)_xOCxH;FD2q1 z5M_OaMtG9%;ZT%WSQX%7B) zw(GH+b?QHjOH=vs9a$pD8p;~f{rB3^Rn6hdY+GFa=r^vYn)DkD;Yc_?agfGNpH(Jb zrH*OEJV}7V_t=J|w^%!!_QqDJ=hG3E>-X+#xyC=sr29!ByFTj2I#ZG0Vc|Gdk>_cn zRf|8vKX9tq4O1rmO8P_o{TF!2D>-%*)C&XNXqdSEE zUZ_LI=`uW{rf({sA5BHfC>t+GG#QSj5lw}h-^J&aScEYTZrzHQ=QZeD zLhKO%ds{8R=VBZ>u;JgptlhaZ8B82&9?Lr>nDj@@%lP69`!iMy(ZDk7Bsdd}nZ5H_ znjhR3C_4K#t!k~ zxigAa;5UTa_optdtdbur!w|N_{M9*s@r>f-45^>A%!J$3-;G^qtpZ%~GwqsNDbE5E z$@C}7%xKkiuK8KHc;>6CaOP$fChq*?xCV6Gm5+^^H$};j4#!>RPwCpKx%eR?`Gqt4 zMqV@zj=Qi5yVlP|XHA}nPeGOyXO%BmnZ2U8sJcpiDt%V&bR*&v;Y(AO;fdU2Ik_i4 zCsyg!Fdx@NLm<&-7nCkm%W`{4K_z|#G;4CMekxPmVwsEIeabRJo>y8`lBGAIA{cSp zLwr$PnOx{BLVqeJYcj;pkKWHM#s{G)(QNn=Es+c6mYJ)hNZ}>L75MG=NTg^*K?GS^ zAwNr{G{3r_Vs50MXlZq6MX~!PpCem0msD32N0yaVR8<$?r`aQsxdj!=OBY9qN{WjX zM&`|ppeaYnv0E~)tQ^fQ5-F~zkYDSKL@G-c7nN5=DzU~lqg9^gxPjjSTnIxjQ&4K! zM)T$!GkvC&s=1|$(Mk%6ii(%OP62FU-=YB4>;7FQu*^NP#mW?6Z8g}g2* zM=bL+^gL9mP(?9HQU1pq2bDb!#Xe7-p7TYpsu=0Q>+*_H`SH{FSP$E}fJ&@L%O!^k zvnJzPU(1UMs>&<4oo7VK<|1W$K^n@;)jVG1=h5+B+DN%sJ|F)t!jD=;3JNRB%W%*; zQiWf;TP#g^`7h@c!TTu z)pOS@10M_KeI%|5AMcC?kt#AGODoNvB1QAk){Lj=m=vOERY3?9{4nh?X(Ka63M?vE zQc{jyYUL<;$1eEjt;*8*I7Q(Mw!A><0UiVmS&GVPh?OPPRddUiqmQ7ong2=DkV@rO zF0s;rnmT6c3_KzolaAX}6==BTYnk*e@M5zSnQx>S;Z0R}H4=cX3wza-WyQs4Wy>lT z)8gEfW$-Fh)rDq%hL^7>m|Jn`h!GiM($X{1M;UE@Z6(lF0&OMGRswA$&{hKf@0GwC zKYsaBXTu0c3fkl9g===mFs?GX%PpfnuHi`rCh_^%v-8bcp8t;U_tk7 z%a&lW5}V)G*Qn-t+7ou#Gh)(*B}-*A!`}4Gxkl~nJVLDqw=+}f{~s27m~+Vw59^=T z-pJd#nu1S?Rc=ah5sb2s6Be(%zO?fY(R_3q54Av??;M zda)djbEj_{!pon;Eq}t29_uf~dc#-LgQs5I_NLHYPKE{$cG~lpGy7MqU2YC(nB}yM zt-@y2vC7P9Gm%JHK?G~y!tye#w`A!q>58@Yn3WjVv)+nU2VAQh>as=3Z)*fl3h&InEZa-NB!6A z-$z?*B74$)r{Ic2rca$QEql^bwqEs!5Nxwjpe<$R?aK1MCBa*x3$Bs4`r&eFge$PZ zE*Vi)S|~dYr(k(hS_l2Lg-9WsPcn+;i z{?EiaNA=mbZDD=C&pvrbR&GOZY2FZPu#@@TtoxMfl1_k3O9*f9CthwgF0rLGvC(`t zLbt<4OfN00D5zLDBDzsGBCDXHuzc|;^Q^7A5qJdFdfC2|#=c;YE(Y$}r9ak#Af zCeQ7Rk;tvDMS9A_XzS8^lsLi_FZ&N%t*3v zD!K=I4aMsgyiUON!+Fm)em^tNc<9ok#zSk3y6=O*P2UBRHce<}EUgb1`I$*ZM#0{S zZi9ye|9W!w;QE>*WAnbCu_<8Gyg3ne$LhWG`an%CJ`va}&|I-Zbcf;okbvsq^DDi2 zL%$C$Nz1KCM$57!qemiUqo zb|CK8A8gI|s7T7@Eng$!a7Zw->KHXK5i_g6E+6~!W+7BVEjfi7NK;m$x*-Fcv zVBiEv=T|>7O_CNVujV&b_1o9MxTzsvWK_Mm$}I2Q!Csq!QoilOCmZh-Ts{<+(XU{T z=x6@2@FIC%|4GuJ{fNsjitgR;$;3lLLUT;{nu`lBdI9%C#>zn@$d}~Dn`UqMSZN8p z5lzebzeLlr8}|ItQg8v&@>SBIx2?2%6-~>~^9wJ!>o94t$}hC4CfB$uG;k*Jt!dV} z{C?&OXrpMSSw@|tGfCP9+L7vHqW!#R*11z}5A=FX4>wAA$<}SpVX;t=h(qHtO~utse&aZdxJf z`){k6-XgpY<9&07a0|+()M+nJwGP3{BP znxACk>BBLB_2U0_2aV0Uk@gFaPI;BOmG^T{o;`!cSj%2$2Fquw+S>zPR&=KN$~_1t zzAY>^l8p4cKs4Nx=^F0-=cD0Xno^TnJ1($Z%Axs)aEruoZ7^D20r=}fmrg=iWTCz$ zHll3Ix)Oi;J<9EJl$*1E7^s`?Q7+P-jzk*ro$*g${7qK;JvTjYc1>;x;+H-rZBEM0 z*;TbX(U3;D3@(mqFAi+V-W%@IL|5|Gm?}_CfExk$esg4Ykw7e7SXyT5C2{gjg(;e!m{$!J13xO8ua z?z>m?9lrx{r(AX3_|ha}{NStlj+gdu=+bPYaT3y+1wVndw^rNUaLDlaQd39!YclfG z9eO>W-xGQ2g+7~%d54yH=*#M;|3rDGchtVSCk6ctY2FTd-yt31`-h|$PZ=K><-3C& z9@!mik1H8hJ6u6rNw@;Ij7KEzJ3gzP-5cd2{mt}4+iG%egB@#ru_xGP6WY$3(sty& z_^jQycOBkqn7*4XxApsOx)Sf-L7Nes3cOdJ(8tv2jr$*<>?GV!*b5G+$rXL!WoiR5 zqfYX&4J>)tmSj9tiuZ-M#Fm7&!dBy+gq?4`8g(ntZkm&8a(65kvO?@gewN~%W%D8E znKqFQsT<3;r+!dv`*wVc9=;+Ub&!X;$VHu<1Amch_63=feFuLb`EvRTnHNeM5ZmYv z-^hH+2;7IcP;|_+`u{c1({`cbx4f77w_e?LjZN^y>!shxSj>8`$Ks*01HHDvhc`nm z;in?rlz`DB_AGy5T&MGt!8Mo@piST#3m(C@i{MJe)ect>R}!uOF5{6}*m?EV3bS8e zTy08ehdiO3gnMHy6EY6T`yujvwsB|*`_bNH?N6bNfyPel_5F2xE$N`#$k$HwNsTED z!Nvyi)DXiCH(GXd)b|}b>1)c6E{((azLBpThjeW$>1@f5Xq3FV%Pg=dG{o2?_3(YL z_D<;=i%^DhFuvE0nj}81$yqO!F8tS>pNbz0hMQ6tes}QNJ5jbxcL$7KR{c5kS0)** zx^&7gDevXvuN~ZsxI!0CY#DCoJne9Ks7*S5d=JDd7J6(g@Mf0}1ojX6ndxcw4>cZnoIbK-pG&D5aBxw*9ofD3kl$yG# zzE%r3R9wy^1jK!7UAtl^7}0WS$m6nqR{G zt+?0BJc!)`k>}9=0_cZWe_e_>%u7aHYcQ}&+F!%VQC}DePaj``^hw^+V9y)_A8XfS zw)Np_PB)IhH3Zj@xccGhg{vE`&TCGWw%)LMTxzos_4AFvfd^!qXjnUN%LdG$HX_ak zzcY3XfiB0;HwSgW7>e~@L)JxGb|CK3QCBvdkZg2cFsfZsX~&dx!!z17?Px79#~2xV z8iNDW=IV^p4H&yN<^^2#y1?Ex)bE`3QJ-|}^HHA^2pRcXG1ectGz;Z15#^Ezzx1*> zuWxwif-SY}jr6_2kU2KzJd3dzbN0RPf1%THExqjK^g!rO_a$N8>l63KXh)xQ#(WrS zN3qrW(8RZTw=>e0z1Xd;_JHQ0FY?e2WwK@U=+vi!{SVY6g_}0KgnZl**kzT;KVif8 zQEZ&Q1#7kR9Z5A!gI5_#r=$L_h5ja#)r3IDg=nw&I}Ws_cVu~$bPTOaL3yq3Vbnd< z-uPzE!Pb1KOKImN6FZN84*s?e%IC-V&mzwOd&_>)$98F*kpYwPWEQjCl(n5RzYU@To2MA@$GcOV4c*$^DCWyiOUdRxnS z3l7}U@Y>jQM#iM34MoT|%JIPuqj|p*d9QD8WYn*nec*#&{}c8E`)!i3Eof}0_@l^h z{{_6Bi#T0z{pWv=Yc=eIgGR>w%fq*b-3P(j;M1)4;tND(=I5pUTS8w(JUMVz$Q%b^X&AZI638qRfH;w8!Y2`amSJ@yGdp zFx%u)Z+5Gz4_t#;mRWBhjRXH(kwNZ6gz(wb3=ICo%OF*q~4bUW(57Hv=3$(;8K z?oN6&e0BiiWC-)~quUuXuf$b6seW7PPkJ583kgjF55M zAdJzyq|H8sbY9yr+*FFP6Tf!dD5Gv#cIKAV$wpczxpqKmvhmFtgfso#=|&H!E76m% zGA=!c@E0PDtuM9Pb+Eh(%Cjrl{1IsL-O%s5!w>erUQ|2G2|J*jw?{kI_4W^F^FMOE z62kna0e)sHe9l(X|D!*(-o6cOvqZ)|_zB5p{d)y>*9Y%7Z7a%uLojI<;(zmBo!|qK zjm^~`^uWBS_ony3^;nNfKWunufYeiq_^pB;YjP*zp3DcY!u1{W=Ab=p_2>+P>}cwI z2Awec<(ywmY$HMzv|(T9P$2a5u`0_c-gTstAJp^ubu zt3lg5bZIWiH#S~v`JHrF|Gh}Oj`~+cZvK!YsM7LjhZnYN;!VC7V}%DF5ce+U1Pu6x(4s- ze`w9Pzh}5CHH z_t<;b;Rxqg7Y*Z_FCB4MYa|Ib6XC+&wq{geU33fDcq7J$y(n+1OwljSnb05W$bGH( zXT7Yp|MY!px9O#&;})iLUNh{6@xBr7@00!}_q)_r+%0zHe%Jbn zU*r9&c%OPieZ_5fpMo+^=~iDMaa;4a4=`422!&hD!`x8%pS3qC?H%(8$GR+bA4TRE zCEFZj;8PqUni!fdX z@b&wS!S$;#-&l+Q16an8?We0R!dSt?0W2BXw_nSdy+4q#Yguonl=z+! zDbpuWmRK(=9S)zO`xrXULfobwc@*u&nHMt+7fozwK)8C0Q!-9E(>&+Jo^=*~^-!Q! z3FgR>zLdIXyNWlz72D#YYZqB_mLm`J?$*C<>lNBx>XU+x)F&n33gFW9nmLDkDB7-m z&K!1;q}@4(oqV;1S9~C9{~uz%gUo%;KaeE0um@tj-x}<9pd-?~ z_YSo=9P5aNVBZ77W$t(42(_7&v}gHe|lI5q5UlZCdBSujV+~G@ef+ zng_4O7$zL;aQ!snU(uanVq;PQ3@n~RcCcXSQ6$R7W;_TiR~k2dPAhD})y)nKmn zD*XA5Vd18ZtNIQcvi*d09Roc(U3*-(DFT0wxoiILKxkTD$od8QPTLMU(q=}ZZnq7~ zYz%B4yDn*U_!ikSHf6znCrIBBdm-BCnDXj?DH~D-?ieQf6usfk{r5myUkYN+vlHfT zoiUH=g86M%%x{C3-|E_J|Me@)HFPuPPV#(eViKP{$h>K;K6_Y}7FZwdEqkHJTOXrk z%GJ(xawOOCM{cP_e{R59)0jHB>58{>eBKZY?2>W$cxf;2n2(Mq0ZjyjxaSpwQgR9I+gy^QyBfsoG)h$*s@LL%b0u0 zd|Bpm)?8TP3S<4b)uS^}+rBv$9t52sAtOUae7H1=CYppEp@{k?6=Fn{f99BN*U{V$on{kKW&EY9L(`+ z5w>}CAl1~vvk7UR+u@l7)#PoA6EU#Gm5>x2saH~6&m=#H%oKGPrg*9 z?cn>7m?w3`Gp%;UW~FD#ae#YL8 zKFdIVuYrF_dY<#mpgb?^x#=>*TZ4XI!`EN&bv|C#pzmi?Xura9vCR!gr}VADPnoxB ztYguq?nA!Tpzk|%CVrwiMbLRzbWq*}ecU?3K31Kz(0KqltI;RXUobz4?p;~)Dtz;3 zFL_Ssx344pS^S!@IovX`rS(o5C%alYU-<=dT?f3^(qDT*_l=KwnQtM!5_% z8u#JZ=$zk&TTVu}>LZQKn-^o;nb@u_<=VGB?kfz`HT?8`ZJ*kj+`)l93ktC35SBH`f!5obArt){;rE-7 zMtLvKzK3=-@_&Gh?JuIO!oNu0c)d*HoYMu*s&OxXd*U}%&er?&o%Mb$8Rs>6NxUT~ zBggK3A>1PNc3h46Ix4d%X=r9s$iNtax)+~e`iQ`UcVvus2j%s9%*V|*kj|IB4y^A7 z9kCHQ4P~~ndykaUuxERTvD85R@LVS&We)Z^5hl<(InT6vGTIgF;e1Q(`$@((&3*41 z5DN4=p|*oD*0TE)?Bcswdj(L3hb!;1S>95AQdbgY4cf2x0J&-}Txp(RD14i3bU5Y` zXn&UeV6>5^F!l+jAp8la+m1maUDB6&4(=5jExnNzk@rEF;DL;t|FuYG2zt_o#lK6K zy(o(lP7gPog|ax|bfZc18;oe)E=L&Av*OD*HqexEak!-vdMDui2}=Xx%{2jDwI?cQ;dXVYXcsP7zQ0WNqRjF~`AGTKVD4e2;c?x| zK!46pL4H#qm-@2WYbxR$j(Dx~n&pE%vee9Q%d047Y4`HnEeHA9jdC>8cO}vYx$GB7 zT%xm3h<{$q^kkGX--9Eli1oO zYct5xAb$!zY9HrE-aW^7Yu%pH)W?;Ge?wc`jXVs3tzH4#JtQ3cO=57|8lQw{nl^dv&3JuLzrdAV*&E`*U6fW2}YmK z4fvd@t=c}v4hc8*MVm}T9~_=+vdTLQ7 z*S-i}e4NpE>x)K91I8%$4y?bUdfT8UX_LOT4dbPC9>F>T7cYIc{zB7d<{9xl!1(sy zxyVqI@dP9EIod#eD)xLP1bTih`?tf72{#T${KFwn@zlYvCp3RqJ!^8mLB1@zcQAe4 zbm18>_H4b+?)6Na_@~f+s`&i=r~`o|fhMCqxlZb-kJ!Unrv&XD&l+1kcx~(h$ z=2}B)a{s#&z6bjp!?DkC^@5Tu;(wa4&mm)@>~nnZ2af&Fm$`+E|5rliSX{EtvF5j^ zYxw7q>(C$RD^o|UoV@_;Cbdh)b;Hqa8rEKH&Ug3jt(q-ScH>@lE zezMlvlwi1}m-JJ#{dAN`=!pKNKE5vA^gXBIp7_({NtolAYl`T8m-E?!*pd0nu#Ie= zqj2sjtnG8*DOfA;+|>w_ODLRN7aG#LF|<3mZt!J&8V93ZLiK$c2fu8EgWj92 z!}B6ZYd!ptnWjVc?f55r(O=EET(3>NkS<~G{?J?SDd>wCbLNGgH^M^)%~@bPZ|w<5 znR)eb;?tZ*I(_#x%z;b#z{ft1vtH=e=6EqQX}oifY&ZIe%%Qx`#jNv7e?~gO-BAB$ zV11T6u*cv)VCjY30^If#LKC8y%KNY?{nTUQ4fTPGOfdyj+;`bMZ4 zJ|6AsgDlK1Cm40&pX)IPX+A!)v11@*({(7*r;xr)gTgJ>;q@%EA?d#z;cKy`{Jaot z34Yf+uNO+jv-v>B&p*Ju<_Y2PQ(9ZoMP{aNW&a)}XBbU?g^h+khR4@R{w3YKzZv6o z3DRw(O?*D^P5AkwZl?^IIBw{m;HvQRLqkUo${ap)kP#X>D3B3;en@D@pipZ-x3_+iAgXrl!igFx0#Df|NkVPNg&S z9IlM}3sDC+*RZ)1R$q#J8cbgT_|}L*@Kw>nX(JQOZw5ToXd4eatb0j_q zw|Dz}aGqN$G;Dt}tl6hZ(T>rNBo6D@gXo7=4(KrfYsM7#m(=buXHGf68Q&h{3FCx$ z-Y4`;czg)+ZEsmy>Gr+`qzswI?M^$#Vh(~jkg~DrD+T`ORp_Lm4V`5KI!y=!7EW9< z^%Bfq^DP}K9f6cisS-ATy7RR^E8GP8?sG|=vK|UQZ`liBUY&yTyjbfkXvVzQo4++k zm&Ai|a<#DuA)}%mV|-{F%5mvYJwoG*CbY@1+tF9|7~RH%0)s}G&t3z@DDh9Bz~E7$ zv&Oh-Y#?w4r&_Mmz4S|NSLz5mGyCG@IScxML+&Lz+ zDD;0Z_x|xw)mQ%iy)yysOaS?jKnO@CiReuHQAHr6)pZhV8^E;{qSe+P3G~M#(JJ_( zVyj7@?FO-}*^RZ8Z3*gjGqJR_8@o=GC1Bf)+S-cNYIj=$^hW~PRqKz0f_$E@_q{hW znGEXgXbL_hzGp-@zWavig>=6C$wu&nE*^wpD8|TvgJoB7ITHs6ucfc-2dCWd>q3V|G zwo;*2{&iL8U%;;E7eMeEU7>eg(`H~Z~2Y)8>=*|N7S_UjBprhW2aV`CXSsTw*kgC- z9O%P?uJ7D|a(Ca(9(u3NKL=mn{1bnd*V&`Aqt7~puHI3~vod}`er9dT=Nf%Pdh;Dq zX`l0f1npZ7erTuleCd^~6@i`Y>+KHN5S+7y9?q2YkLS<{e#2S3&cV9aKh-nFAz)kI zR6PPLdJRv&H%k4sG}+n*jW1tM`As>>Z?Z>qyXcGcMdF|OC4XOEl=#l%Sj%Va5zQl0 z|Hy4?vU)^M1&iY&-`>P7m9iUEoLK&wdu>Ss(bg5tvA~%X}}$vjOlRJ;>g?JeCl?mJ44q&7RZZSti_N zk5U`^d0sa)(5bPsx??f8{m-}X1!N4FWqT-Vpq_M#hRIfM^oV8PrLl_^L^Jrf@4aUd zG{E_K1Mi!QCDZ|s+U;e;_X7#YcAM45n}$FtLK8vV>}!9EA4!!TK;jp zqMJ&#H}}gKqtzIm1TIZ;>r?2prcDht|j# zVp9sX#FCW3%aW9fcT0Xq{yJPO>I=`yGHCSGiLA36ymb&7@Y{?gtr6*OisQ+S;n@{D zadI}U7Nyx86KeDG|m zO7C!%5;Nmw9)p{#4O)Nl{kRX=r?H+y-IdR?7U6MS!7GOA;qQ_uZ%u~(i??OSlmzm? ziUoGIG+C)!ykeIFufSg@7q57jX9M^O-2{*D`GsdE9_7Q|*Zc4=l|T1q_#XYG*Yfyv zb_Mhl7ax0&kE*!wsi z4WyjQt4A8oU~N=e!`f?w@MQo2&E6whpK@M7N6(8^3Lo7b|1R~$b`oRJSS5@6vJ#cSKQhaTRp!Yo zzh0rr;F+2Arm3u$bDxa%@+r&I$$oL<*zEB(H01tpys8^Mnt)Fx;8O+grA64B3M<(A zi9Q=|81AE8(Mq84#$n-Ea(yoJq_UF6#lxLz@Zkl&yY@_YwE=r&%Pq(~#%QtTeOzh$ ztcf(Pcy4>}7!RRQiE!>~SNvxwx8v7n?WZpM2 z58(x!*4So6m;a)EDD&r9PaPLeX*+XcPF%V6*zMQ|+Odr!?Di$jhN&~!v75Am2dgSR z^1Hsk7#ZN(PW9Z#wbJUUL|&xw#(=e|9UVY=MY~6zt;|pMe2wu7jIq_DPrvMQD)Z>h zFI%rNkM8`kYgFdZv0s)@nMcQd*;>j3EAc~rKcMlR%iOgNowN9@v(35KV4!x1!@jhi z@jB;MoBh3WX3#uy^eo|(dG!-EWmk_a>u2BK6wxNQ@Z0USYAfM0#%AHK>yzpKcsjC$ z{C1EhQ7bwszr)Bxt%J}nO1H$SCv=3NH_6biW8++moR)nB+hg5BtOd#b#{;3Q;d{Qg zs)99EYKOOoj|l$@(M^1t3+Il+Si8dIT=qQDzcof@%B(FV=m1)u@;lL5t_B|JU;5Er$!uhm-c^0+GJ=bApBvG! zq^HC>q-Q%l)$mc-Nh8SNF7`*;(a$qu(A&@@^1)-{a@nFv*2}lrnp`?R3JeGFH$H7z zYbr5i@)id@C&7KgPhGoSHFmwVzmD%*wzPb{Y0-K_)IOn_tQ= zR8%_O*jDKCOyCk4iSLY-M&`fFJK}NMUU%1iBov!3K4c#S&v!1GUmA6BVBdMtd@G9W zmb%ZN+iMM!^1p-kPCYSsp?Ha45igC+{|T}SzV%Vy!@R5ukngmw_j~DkGvkYblXmDL2HiCR&lvR4Xh$l8 z)CoZ+o1qh9p90@DbRyfVPYW8m+EQKd=#o*oV2^cT_l5qN9xAWC=Fq7>x%wIoKt&7L zy2McVqt|5ngGirf4=k;8=5<}D^TtMWtO)0=lH2{PVfH$E3*jq^;VY8cj$N?DwhOmt zZL4qDce=3mN>*>%XurA-IW1cD$E4Vzq4J+xE!{?AI-Z@q6!=-6gtp*oKL-zig#MS! zkIdVCq4tXLdG}r@-kY$jhs2k=fuZ4`4ih*-q%!^3&r%Qu2M&i|upXI8)C^%M8J zNaHC$9z1n;to_KBZ%Jg?5HLu*UH?qa{&>|B*#3IZEpKN(l&n}8TaKYpc0buPr8~$r zzJ{?{;8Xh{zUSN9E&eFnTX!z$26v8q!oqH3YuBjEGjW*M1FV8BPo_(DiN^~6nKJB! z!}wnyS2f2j&e!5$**OcYox@q)NsLUzzw( zoV*1dx%R~A=9Rn{odugSFf{A-U9~@X>V1_{QGI65xNLn97u&Ot8vcArdC>*6nX3(|PT$D1k6TYGb84zv`t-#ll-}1K2_c-{bN3nei&Vq&DEIH!C z)`9j#7mFC{z}v^LiRRAhu{;X~+8+rH+9Mqg1`VDLB0izBg#`So@i1c~9;pw$+@052 z*(Bco6)g*Y3JxlL?;SW});6R*Wm4Q{*J#R^{ z_A=+Eeaax~+Snr)cZ_ih#!kqZZfyFD*%=Ouo`T^owbd1^g4R{3R= zcYhY1F%jLbEKt?5g6ln2s(TGKZ0Ru5haNWmaM*AgPj=;A2pv;4-R>*pcUaid4bDOh zc1M`{vFQhme|7XO>|~q|w!A$vR=wouDf6vb_w3vGB=q-bE7iLvKGKVB z(fuRNe(homURN~{c3o)5g5;$U;%4%JoI?I zGr~I>x6kii7>A1_b!h` zEhj&F{<~RA+4O4F<6|KHr8SEjHnIf%s56rS%GIXmSwUawCr~P1krK{e&yF9 zIjr_Hmiy^*HglGbqVy{HAu3(d8)rI48_$p85 zeM3ts6D_?KuS(cUD_fz7KH4&HxdL8R;^s>cd|L5=Q!Wh6nLJ&q@accmDY0hc&57UA zN+13>HyYT?0=FMxULRzB=QGb`%(sS^#AZ zvF_y8wZ8p3t7G_aG{cYUy1!aY9DvhYhJ5%abH;CSU1WOgEy<8o*TXZ#2H?NZT+V$- ziM3wmv&)0lDxFhzXY{v({)98ZxPQ{pO3h8UN$5ZAwB3Ua_ThM{0@^*5vt`MhL|c2Y z&Y9mjyS?~q=uz!=WxzN_n|jYZ-pi>IN?rfvF*82F)Oz#S zC>>ZHoF4#x@>k#d^>}I)ZG4J0qO0|PR{lG|ZSapS+vtgydQd;xs$c6>ipFo)aW$yecD5}Ih$J!v~j zworEqYXm)bWh~TR+=9Q$1GLM2w>fs!mf~j0x8Oe#O*(VidACgKMSMy60y=?@!}eg& z5|wW&3&li>;K*G&r=#Bs9;_RmzP09#S4Zo1IrZi5+WlqMPjnW3vi`g0NFO-a@EDY`rzZO@DH@EuFXI6Fr1A{MU)7Me6`FSpWIn|6){5)-c z^L=C`+n_~5^S<3*^3a?I@J#*L*mWYvy)kvqb<6y^it#%985=nuT_Sj(zVYzE^x2A{U+ z+plx4*Vcdscf~CTpR$3<&XU>QHm|(_@^ECwo*n)SvKW0sxH5d7bsh^Xt<+rmpkcv7 z`xXD$a%X8Jb58XvjE}51x7zIQ_EAqb=w`30aldfnA1bA9w;!ooQpJ7ukI`)%YsnJF zT}#qq)-xufliM>EYER?O>jrOLf{#z9J`e2z)`9c!GosB)u0VH(N0K*V#CixD=1a%! zPC^TVJd@vk68*f9Hhe#R)h#&DPR%a0Q-y`rNQn0;uuGr1BR&%Tiangqx{U6yM#2-| zyR6j+Z8p&6Xdic>N565b_a4f2z)OWk!M-gEhr`gPd>0JJ-jg5c zB|4w?c-NWUe9c_par-=f(t30twRIY>S6{i{;ji=k_{2ZD((Y9KhcwOEYUZ=RW$ymN=ebU#2DxCdUrWd0N0^)Vfqn-L2gdotEjm*F%!AA) z5kUUKcO-|zdjucx9$)Ua!tYC`VM~C=1=kU;%CmaP6dRD8*Y6DvP9@l?qo2M0QU}@D zz3IeZ?SJGuupe9Bho@Mb;{ScXVIW^{DeU=Jky{o~{uLk`tbnDi|6OW`~KlT=ey4DGwJzN)88&^ewp*s{&I4Txt8UaYwdS)&$WiRZi-%a zo#2r@*NTj}ely2hV{6{qTyM}^A9Le8hOe5*9Rw?1zB?|0{08(g~NEpS*ALEjn0@vNS2|G?Y-?1^l#gR@qa zRa|F$HJ_#2!H>wdW zjlquGYiSB=seD>)zVWe)dH!twc)s!YhtuG^ql!`O#>{wTijcD_5W z%((_~%(eaY+;iOvPB(>e^No2KbKR0-u8r~cHrG#UuA3%2Jybs9nj_cFWWA8v_4Duz z@`~ylPx4YUHF&N+U!o2(sHcm7ecA(eJCn?_qtuZ`@o>++HUAUg*sg zea^^uqXUh&vR?Y7tF&AInI%(?%R z^qezkxPW>T*LI`>@v$XxIH%eB|#;=}LDnCrK5%=PiI z_cqrJ?_sWqNbb455FR(zROVcF=9p{yr*hAAGIK2-%#GLA?@q7XwK?Y6IQPBH_3z%p zT%9?&=lX5tnysULcG`GcwqKchexLXrxZIa}tv;GDzf*I~ui(ASZ{mBI-;DJ9j>nhQ z=9udfCybwK^kcc_`c38<{IA@&Y|EJID+A-#XlTlNo9mNr!Iy#)O)T=^&&)(8D?m3Z zgkPhhettH2bfu@}k!LDMzNr8?B;Ea*kv}0H2E}9K&jN4W5sybHzp3`%2k;^O1N`=% zJQ%ck`6bns^AQ&YgAP@3wzbT7S z=IX+~q+aORlJS9|q4HU*q=IQFOoBu04&uqHLwBMZfE_9Ji6aCNoa~(?)%e=V`WZ5(d zz4>O+Lv;Q-)59g-9ZL@z?{i_Wjq+Ud&>(uaKll21AOlXtW8mb{!}7gpIK3Bo`0E?* zuJ?EU(udJldN_=4cebwdyGi5eAzGN59!?QGe0!|C^66n+#ykgpKb}v7o=ng4o#^2a z&F>xfL^eIt_WN@kOAouexn|SDQE$GP^w2%!o#~-8iyi|1(8J3)AZ#eLQ(_A^6Rd7aKRa z^l&%jx%k6n!0Eu3bFZ8GGT=0044gdv@L(EF?}Z)?y&f3zZ5Ylldn1-L(i*^@B`^LO zF`#wM^VO;3qj#;^yfP&p^5*U6kII!puHxPT&bnJU1G<4dvd$Z#zBVH#sl7Z z1N&y359vHZ=OP1K{qqNN{*2ymgma&g2qY*c9e7#C7mO4l1|q|%8JRuF^RIdl+8;z5vRj(Y~nwOv6^g;bTjUD#_c>$t{h_i zondkrDaSyOb<}#@I$Bao4Ck?Jfqql|N>1WkazT~!O&l({f&0D*!zJ;F z!`3;}ueV05VXo*!+lQ{a-2SNhzfJ!yu#UFh)V(S&C2wk=&Mgm69^l(E_T}7PN1KEA z*51s2%QpEX_Lws`ovY{eGt-{O&p$NtlOIYJE%nZwreJgVfa_n4UV|U*ct0-RhYP#( zt2YF`e$O$k(cstEcgYjgeJpZiVxQZ`p%8F zwVs2&eEQo3MR@`AQ`jFLQ4Tlgv#yIAZaU}tGjRqFLBGmtsD8804sB>R`)pFO z(R_O$QeCCk;C{|Y6EocSG>bT%hVaVM6~AH;Ghz=_@6FpGn!i*N zuTnODH{)4zko-UVZ{WYiaT4#Cc<_Vv&icRDCgw_Kc{9<`yEsesW5SgK?uMF)?3D|8 zG!MRNWM)s+&i|;fLF)Z@oeG_vEfCiEBjC4Wa1eAcC1(9X#7icDs+u} z&eQRJTEE%n#|Af?CpsN&tT*_dp*H)p7w7y=w4(iweBp#=>E!T@R03O@`ti?_jjs{s zDSm%CZ&rU=>%_F0bH3f+JoE?me}n$Ri^9L$Xkyf2#HdwFAXX_lFB!#mK=t5FBi10i zM0uoaa@(->)u-C^{hReHY!}Z6Sv9Fs?Rhg+*!dM<#u$b#<+sO2TF3>}2F&vBaQ`#@ zx(eE8GJa}(l?ILzTsX=vBg}eT@vR#C+N^cT!*q}{ZwDVvGmq%y#_ve;F}Xk^^O8Z{ zksq`_Hs6QZ_>X(>?D&rlvyKkcGY;Ts{7n7x;#_`7qSH3UC;CV{5ho{U!6A*ikn>Ut zKMSo9DxDR$n(@eqTnI39<1 zTgQ_J&SLstZD@V_{!EeShHg95)jq=-|f7Q94I{tfFABn?{ZIEwZD{#|zu13c9k%Kf5nAFi& z;o_okzvly1HZO^fn~70U+-1n~=T@1ykKpfsPj0>LMep<{_{7Pn+yZZHcr8A1!=pDD z`}RKU9vZ8~S^WN5SI=9vl(>p{c4tEwejI|8;CfS=i4U;It*~Z=EC0=T{ak!N-j9z; z8STQas{Q&C()DTgqmoIg|ElVTU0-e=rpkd3N4A$(GY?t#Dcv|q3x$V}^>wqL1)DjD z|7vYY*LyKgc&H25&IY!Xz*b|l8b3GuJagI2IQ+WJ)O`~hTS>6+km9ovpX{OXATefReX&K~ zaBUY4;yd@5ybCVhA=i67JlWt#&o-HFe41wiZkMPJEu_L%Ocn zrR!A>{chJPNAiri`^%A)%iM4E`8gf__D6JAb1pzU`MLo4hvLb`!<#n5?7|-Or9a!lH#ie|Chub@^%I9bthf2lQ{P9!7VC;#H6eCMIe}?~wKM&fM z4;EuIw54|k&|&r=^L86Jfq(2xTA!jD<>&d~8*U$6aZ?$05#X8gV_dGN0ljlPBAI6r^i{7#uJ~Nt=4A~d8#^y*<-bKarj?cXqz?SBI zKUU-W&i#Q-i+t{hKrO!hktHtgR*oWkh`Iuu5!O^f^Olbk`Ox)TxT|M9$%kBP=Tvx% z^cJlfQ&(%xz$h&T2FSBAz?|XVy^d3zD)|b!A-q{SlxV(|`B>;pHvVdd-8C~^?ThA{ zk3#dnCK{M#V!}e#xUp5siLH`8c!)K$CG5qC+4)<z(ihK3*59ZPVGj+-V#xI@H)dQFZaFITyd@Yh=*CWST(9Kk@o_f~{ zj*=hXOLbMx?f>2NES10ErM zxn#n;_455z{I-Q&>C1!A56Byajv6VA&WEOM5p4S=cQXBN%r)t$rxu^p-^Z`gxm!tHz|7>ldqImI=}Dxugz@NjrSYFht6V+ zT4Qr5ijK1L3;6Njli@vm+AA<-_A8wRuijolWtx-LiBGTM6Qz`WRu#WCvnVt&v3-S2Uaxd``7|Q$rP=_#c$C+ImDaS@@-A&6Izc3M~uP8appHg$I#pF zi22H*w~f&9RTg_d*^8c)E)z2Rw<6Dse_fvkGnKb74}bk@tq6t=Fs$W$@q`B23SmQV zfW^UJ$jp&>O}~nF1uwmm-M?&Bg55#l*aZ{8O))5{ufFc3O~sKlLPvtLaB!X#Zf;;) z`abPS`WBoOt6l2#p|NE8Glv2jS4sc>)wK2Id#cAK#h*U5jNHYPbyKD`yEn}r*7qNM z{)PR3ykY742=}!a_g&yJk#Qg4zCGiO*2q2uv>^i!-0+7M4UfQ`-9<;7c`XYKsU{{%X7uShDM73Q}&M zXl7nO_L=?Ab0R!zi-p`sOr5o*fH)52%W=rPQO}s1Ja^w9Ke-0-c3S9-bHsz`U-gyi z=Tz?7foFp8ru7wLPc-^iflXZ7D-78=cKqsy;cc2Hv8Sh+XB{z+ApNt z6Nt4=5R zh6}Rt4L8z;pKn-o7Lj|Wm;5t}$T!?ezG3xIkd<#(W!d?L$CkPIhR2q<`G&`qg%+yM zA@HGm!;So}vx_QU52W)A>$zudG`foLHU-?f`G`+6@3-thUsfLA@3?t~>;KL=>c1ns zNqeCO_hX+HT`=~|w-v2MpFLY`8ydpS=j)r$*2$oBF6_rK z;%h>7ZPjwFqEqGa%&xC;^Z|2jpgcFySyUEbUHuf^98hlgjJ!*EDv#Vs zc}q{4Kcd0w#A;+57(YL(ntV%{<;%zoWWQqXj4vgJ5V@@EXX87S@5|WsU$=M8M7|errm!tA z^ANOB*UI|!$L)CI)_U&@#7Ev5)dSOfmNE7^eXgFoM*n}}ey?7*6^wRg($e%C`}(XH zE}hM3Z+PqkEA=z@zW9ukcVsgYu2kQ=ypMv_b?Z{7eKyZRC z{P&cjMq?Mv9}nehuBquq2>zgvJcT$H?ZyocCEC9 ze3@O3-l1Gl%CEZSIr>45`Vnw3F!~+)3(iK51wzf>x-Rr#_5kIft+5#TY4xH*&}E(G zr*fw}xmED|Ep0`stDhk!!IRj5UhSu!M(RY!mGBJDbVjoo`7gewcf-{aJMz!EEJ>XI zNdDvTk*g;V;~ATiL=T=3PTHxGrzt<{6YldD+~@hbdFS-G$?)Sm-$(s@6FTxA{Fqy3 zr`N_#bco%B9jB#gMkeo=oxGiPo!y)d(NFXt;(ytTL?3d`V1+ZSvz+_Vmt3A9Jv0RW zcpTV;3f*hu8gj;6bYV<+f`ps1xGJ|$H}jM2OS*)gd)?vuAhF+0>AbLE;=~=28x{Wk zmNjkc%ar-HUh#{B*2MzpYHs;x+1UNCSu1g37x})O`M#OS5e*-zVGL{eIgCsA4sq4K zU9wQ;Op^&8>0G!zeCg>CWX;+cA3wbuStOaGw#t!P`d_wGISfyluRM`u z$gD=_Ec}pr?pfa0^r*_M((?HUU=)pE+nT_9fup|J7Ug>IKgktohbz!!!j1bCBkq3B z&E|U{g6VeA<)5lkHy*4`>3PL|@*CY6o?F6RvTy$t^DOcd>VKR5(^r^p)l}HwmHE_L zX6NUx{ga*2ocw3>wNl@ZZ9HhFS}dn|0NSia?@gS1nK>8GnPiCdSs%csgLR+iq26B0 znVGd_1FGY*T%V)@wHfm&DFFw7XNA9m}$FJo~*`-Pq^n&zje>0 z>H~9071KJS@d^6eZxNSmoBp1rKec&1W!Nca?}K*=uL-W=12L{)Y$$8Rb zdE@YPG|{4HX283K_rFD zd*#q0@v0=S)*6X%J{Fs^EY);IP3j=>bfs&zY5wH&<+p%eLqqw30b^-7Bal)X{eku+ zx>wF(oewD2gYFx7?%2*k+1bn(6a%#@JqBoD@#i##zzGZWp4uDSW$asv^nT{~oboRD z=W~g_Fdy>x6+T^)H1cElGWLS5ox^+&4F7?f;04kPv{s?DPF>q*a~=N&IZsLa#Tr=* zeX3l0?ET30a-Mtp)>ZR3FOn?4H_NM2Fs=@^o=(4y$EYt@I2)!I80`C}@%Hx5joiJ& z)Ul_T`TnQ$0E=}!M|oz0&F#R~!3L##W9Qj{L)F-^f<;!U7JXm{oJPN54a2`j;(6AH zbU8g!t_MA<;F-fS3my@r4Pa|*amU+Z7uHYekQ_4d#nk6)3YzVPRtoK4hpq|E$J@D* zvjBOOwnH}XU3A^o0Ixb=&-`rWfU z->oWSF*fT^m7UrRFEDb99Elb98pIl#9u8I8*eCF*g7&1>i=VFIs(F8wGtdFPOKs!@ z^2Vjl6AXQ-51&?L)9$s4mNfnt{PBM|xNN9!=L&qx*jN{Pbsk&$EzUA@w#oau0&b2V zecLG!IJ5Fi-tGHp&2XP+LG$(KDh?m1hqvgAa=|lp=dP*N$cwjGNxv*gnRG3`e39^k z{V#zJUPD=iFGq&&$Hw=6cGQ>Swwd^HlpWviqpT`j_j=Wp-v_cA-TN%T)LoNPXKW74 znIXNVpLLLn?poj(&sx(eJ(}8UeLK)O0Iz8|%sKbllMD~kx7Qk;NQF`r8D zN#D<<2>YM(KztDP8oHLQyw>HFqFd3Z{EyiGn(w^MJZiB%#V3pO%@#usE1*@2ZxFiW zF8};z(XZBu_@F)2@Ho>x`$*L*_1cb4wHD7pKH+P*PWBn;`;mFby5hjj`uPFlzxSsj z*gRP$-CB3hk^BZUt}gK?^5P^UBgs*zd1%aPzlJLcZf6`jp4Qwz*rUS}-F4TB-%J&hkBt{-1S3aEEU=(!C%c< ze8yXgHokN`3oo#ewLBLOk5b2Pr-gQOPGsf-y!WjZyxlnsu2!Cp$dY4xD@FTu=V%+} zBVFs8PL3x_ZD&jEcJSlLGQ&T7yRPSBCSNz5Whcl7H#!#^oP!4&y*42jp6=qnyw5(O z`xaNvNdAeObih79&^lth1hEjhpu+o76Y*OmJwJsJw%&9Qz6KyA@wk)Bkk0e}CS}uV%`zNvpo} z1-(D!8z}J3e)=@^r01BkcXtkL@X|kce!^Nm(lf+M-`EN-MF*-!=9zIdy5kb>N%(Sb z!?YQagSl)l$FrA69(F_fZ^9207pk+Ew>;mKacl(!KHfTJ z@4Waf{GVjIONd^;r@vnTVhUh*zH_^CI63 z>Ss-EZob0!e#Tz7X*hbTv(-7e>>20Q!nwf3)BDn}&fKGlzT4s3_4vP_H56W-nN1{S1Tv7_IbeE;+qNn+{4U$3h%0oQ^Ct=;N=c*vTeFM z|F5id=l|Uot{%Sq*6`L9%zwqL`E#*(rS4-~;nJ0{TH7)D^ESpOJZnDKf$Fv~zBXWJ zc!hV~q5m4AuEI$sKC;Iqyi8?m6^tv!xa50q9^)FM%_pyP$JO{k*20{6gO$yMJUsA&9$GLv@UMb zxQkF`z8QngFT7bE-YgGqZQxBflU?=ixJIn<`OCpmsqiHH2u~R_%BNM#zCHvjlJKN3 z@W7YgqN{*MEp4y7#Dz!G3r)j^f_6potG7PW6nf&G>d@oGzWyQn_;_J`7(DIfsx~*H z>!AA^duoZ=WSl*#-8O4qNDLng1}j$3W^Jhdo*-??R$BiqV-7Orgk_ujzP|hmB2(*u z{~+_$_W(o-KI{jCBVgan^*m%^4|o<|P#qsnTIT_Hsc@KEhP$>)3%JX6**{78XrSk+ zyxHsPX|EMKx$;nI|8;R7QYjoc@RSg`MQoHuJ4Sv);3MXIh5V8szSR(F-CSH^k(bzR zEw=2sTd;N2iTCf~JT?LjjI3u(M1f}ou#{bSIXJpF;4B&CZP$pmX`f!$lhoyx`dNZuHHv^$`r+? zTVvwC{CKb0)7Ke3DxVv3CeV$||Nf$6i1@EiA7%Y^Ds zcAb00<<=|2T7BWfWQl`3Qry>M`>4~}zN-C?-Rqq*11S>+MqHPP4ZB~lUi^+YCbzxX z==%U|^o5T2v0I84b507FZ$3x#>3c-NQbLxo673 z-P#jj-^$Da7WBXTjDv)Q5I6vKJ^yJz^f^P)`S4U4f;cWB$U*;xz^pfx3qnq`e zKj-ml%)W8(1Z=6$f%5jqPeyu=Y(JMgYIm|$%$Zu^-igV?LfTSn!c;f_ge#^DH_-iW@hl8FDW@8&AX0W$0;B+(vsz>A(rS;Q1(fvlIt}T?cI#%6j z__ax9oc7;#s)_xC>SL2*?_rNL2JDf<3~S{2ussrGEvmincFui%O)gQMHK`7Dn`n<~*m!I0NM%DA-}k(!Z^PR4eH%>OPq}q{8=UIv zd_(Vd^GyZGpG+Fb#iPWJ{JqASN!Frm>}jIB*Ivwb2HE#-n`MpM&fMF$}_{i;hLc`ncu~JPn{J#Xa-_Cbxe#ly3jg*#O@y~5FTh3`(!L#)|yN727 ztyJqR*3oSNJH(bd$50@1k%|e(z8Ne#TQQzSHP^`iFkB?=$bBqZv9tM{i`z?bMB(HTZBN zHh@N8Bbtbj+dE2GdS5!;*GTmgx0s7&q)+xwc4e7QJCP&s$1erUxku;d*(>wQ-B zgd-trSb{CKiIIEBjgyPMvT5s`Xeu9?dce?BzM(1cU(wUHJuV$=KjDhYML+j)-T39u zHMbKxTTSe&%9c^q_SNt;8?U53G_~zG^t361jv7u#)6qFO=qQsG)Q}l@0^5t`tovO0g@4xDN&8c#Sas?%LH!-b4!z%a7@H=s=LfiVI6L}d zRypITTSVLHLuc=*^9#y`OyAh9PS-g^xOou$MbGfl9QSPKlx@YE1EGq|@JeE4`Nq+t zC7PS+zl^?{ye)2ghg;Ec6)%^(#Qi2vs3E?gXHT3M&rov%?aJ0110D?($Pa8>fdH{=fEnC;djq zeeL)AEWFQeyUT;0&R*321n=6-oF)5ZKNF66fQu<3PRYl=U@RDYg*JRR!`lsK-hN*_%vnCt)%d4hdmP>-dFa!q`0UNhuMhgkMPHK5 z{oo`ac|L`8_`bA_q*ZyS-{+pqN$%I;!|2#yW8GZQ5_*=-qg#|Hi*RP8^x9kA(0Y)pwIM=6daq$j=|m zQ`|9al!_0zHj*xVE19uquMmp3-w4#6q!FKpp%-_pXY65}U#i{Rj9uSNJ^`3CNyo^F zxjL2iGGne*+VQF<(fu>yt+f8X0c;xbTUUK>WPJW{@t<1cmH3{{*@y6-K(9#EdNEEK zOALE(jM(f&)0S6+gLf`@oqX;3#5H`>dvYI`~`P^^t z6UGK8|MUdqit*HX^PfMZ=g6W_`Z_(0AB*xq6W^5XlW)PyXrEDAK|f>Kg!b!7y?LZ) zGs1W@4!^9IvR2;VP{G*G`>ltUh*o|4E(d0<`J^9zuQQuL;RZZ~_%D144yH`JKLd!%(yB;&x>6>O1hOF z0~LoBeI0KQelFX#;4MC^c&KZ>j$h<)=IZ+m*%@;kVhx$O=7?wV=PCW`cyUe7(Vxa= z=&2)p=Aki(E?IL%kMQG}KKU}ZVtoD{VH>&ceZFSwg_V;T37&CPX zKW602mg~mFj5w5uH~;@FW@Py-*Imk9g8iLys0};HabrfrN3ea$Zz{yq*h9f#DK?g} z8{_613i8#9LSLc@8{0{JMa^hjNte#L;q3{^YIx3fY1VbIzDl;Au&$nK0{*8sk^_o2 zkxXHK=kpoq`wKk0N{)!f+k7Ba6Fi5=TQd>Fb$g?#2Y%S#;$R#aR? z3?uuYy4ZANIlh|m$rylF+SbNZhxZ3MP0X3(I6BMY#Cja$na(tc0jscC!_rAs0E@O; z5|37Y(0PWAetFo#eAxIpaQ7xRcXMNN25#v$job8|=g74`>Go~a zitp?Kwy$taG2Y{y84Yt*^jGh!NIHY^=_qdJScz5j8P;W-bvcNf9Av!@K`%+JH|yMx zy}ZL-eo*+83@DKtneEDv67BO{{nnpHX3TKr`H6Xdbj{C}9c+fyyz~z39R|hICQLPQ zWCF3B8jIw-zQg+`WJ`9e(AU_5{*gJKhi|ghw-Jq>+NJmxE(jR^P5WZ(jaJEXk_Y0EK0h+N zazUC8X$|;z(^a%QNPWrpBv-+@AKy5K@B9d!{nYpEyuOcr(2RlaWM7K^V=d=0c}2tq zw65CCcSx)MY|(0xP3{Ey#v@#(&ge`aigFBb*l zFmuBe-5X?W6e~mR)TNSj`lcTLL`199v=J-V$4!SvK zz;(Wl;nnQZeW)X+`lVaz^E3`BCw%v2liiZ`AA!J%4Cu$oOH{7QU~x z`S#-9-{r<5x3g}J7i%VZ5T4`sd1UTM)qbeI)WjUiwqACb>}F0+92(2cHROI9MtLd% zCMVBYPo5Xi?mos9&9KkNSHIe~(XigN?)rdt1NssC-`Ht7|Ln&4yw3MtHFn>&Bi+G& z7g}L|F;*v1Tf`QQY0J0yR1rt7buPbn*40A}{%*dnit^l)fd}nfb{x)Hx2(&kb$okk z8#YmY?{l8w41imNGNb47%|fFWUE%7Hl5gTS1K7TpR~0hE_&CWg85vR;0xpgCP&Msk zpA2rB@Xc*r==$V0KjHe*H$8=|4Zqw*{BE1h_(ZZvHs0S7&pLs6zqdwY&u_x-R=#Ip{BH9X#7COWz#n%3 zHoV^({c_~`{TB9g_ncRIQ_+p~rfQd%zADj>{%6wAZtyzh?5<(#*`45}c0}86=4DjvdncvX#ZRq$1yn0tg?zJ27`??u>%uSNrE%7QpxBdYmTMBx< z@@wdYJ=6Ywh$jyqW8_D(g0ca0k$RJVtN7*KB~!4gV7^g%>}5 z#;L`wfRC+H>pmC0G`4TOjz6~ErJq6JnljNF?HIq%0S~v}nR^${B$>;tlOJU`}XJMehNm?!P`;3wUzL!CQt9hu30*&lU2 zWNB?>@HL+=)k}xrJ%_pm9=x02-6`JskY96qz~gB_=`m(MB-+a~E>6-;*)MMqtl3_JiL+`}Gq)e!6Mn7w$Qa zzdnSEU-Nt%{Z)<6i{aC%-Vq&*UZwX~)((|r`v*T37{(_!h<=;S6N!JtXx{GHOK-T; zx`y+J^(U_0IC!-=OAR7(C7+&|WOsH=wM;CX`eGxL`q5KXQu_z3A+sLQ*L`{CfB!jq z459;ja(v|VI`>=P`=CK!Ve$Yy3C!>@+Z(z0#^Ell7tsZ>O?06;_?dO=+7ms*`BYuQ zR5wqCuI=DMP40)!foouCH-ClsI?zYpveIE) zLzguSqd`|Tw1$CM@gvI6vod6w}D7&!0p%dOL_qgqdAgSV1A_$qDbezk2C z4Cz?(+2*pe1x5(e{yQT9p`QK3aPfQ-4W5G#$M`IS>ahT2b9Ez|r%)!o3jGbXFc7}-^ zTBm|z^p$H}n?kU7xa7;TPY%8TsV7I=l(#l z+y4)2t$yfunbjc~9Yl`6WA+|<(>?Rt{huxl2Y9}b=k?3&&U*9-`LTi5f_n7KedOWO zyE=2#yRY!>0BfW>_;Hgjr19XjqqZOWM62%T=Rd*xKF&NZW4@O%?~n0~r%RAolZ?!I zeRe!m`je|asyPqPw)(B1U-X$pZI4}jU1s??ly{*w$yZX zr|eLyZ{+;8a}pDgA&l4XGU!(8bpSo8nD@4Z`#yfd9 ?+a?y;sliQFN8xg8Je-$w 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

tU(|gyYna&y#E<3s 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

  • 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

    -HKnU6Wro^w?1B4W%AA81R z_hPaCae~7?eZ|n1AGdctJi68h7TIIK?k_X7Dni*6*V1>)>6(Lt!};Jp zo!?}BE3%1w;^O^N(E|F6N-M%2EUY~?I|j;D{3Z?4fe(~Q^ z;Dan6rqs!Cg*_VIE}h_3qxNjZjQZ5(O=N)j*=`rIPrTWG1?4cV?Q)aRD`;;KWoxXf zo!0(vtew~e%<)wQW27fv9)vFw`{EtW&o^Pt719C<0|?-!@y|E)fzO_B#s`0Qu+;pFq{ z6?ZU3SUYymcd`Sd(l3>T$kxi+JNJXDhvS-OvGEWSUFo%ce}-5mTlWU-^^x`V8hdQq zMjJJbW^qrNWNz@8zU6I1a*FxN9&6|@l2Ku3mFemp#lJt_);-pcZtW81-0smpq~t#r zb#30t{1w4&)Wo`TEA@DJ>R)p6@U8VLPM(Bp?gl20=tV!rMYAuOmv-+vtXbF zHV)StvA52^4v>RQBa{^4%tkDD6=z*87?{5eoXV+R?frNNvJ}3pqwfNoPb#OrrQrP| z(p*m($-(|Vm>2TotYU-c+_Pv~$DFEs_BYmCdS@K#=8NhVoIY+{;PkIKI#QC8=jfzU z7b2%P<5Zt_uC2#O2ek}z3u2X7pZcOnE!+uT&zm?P3U`fi%0jFhd#Ijo#`%Or>`^Zvk=}GOF>7HUQ@p>V@6WroR|f_ zT32yb2k#nkW`?5cG8zqk*JjfQqeG(`C!0HtuqRx<&N$RIg0_14{VyC^uAS}D@@i;F z98Kx>ttE^Z`mWQ$me-bV)6=GPBceR_`l-{uA4 z6x;m4*mKH&M^c$%!IiOP$4j=qGbif1)`SumK+hiy?6vC z?(p4*|J5ZXwC9d%#)AA$HBOG?FrS}8YzE}uZSb*2$F`q3bSymAr6cn5=nRLB--V9W zJI+`xT^8(Yk`A9-5L(CCKGC`4rmoG>sT@2Ux!kqSuyyU8cQzbF7CCkfqhU64x@;B& zlAm99XdYQs(J4Fm<~yAAWd-d`xyo6eOHTE?ud=UocB(O;)_Sxc?yZAAU>&S`bV`wJ ziq~JwI@tRr`-NyBy}xNLx&!N(Omjqsc-y8k3r0 z8lCo~Ra7)u@VfsW5zfWe-QusPYw8_&$)|j@0(UaS<)5iGkSYv-1$$9=1Vw?KT znRcoANOlIvGcO(rI(Es*%b*kd?fIxEUHvwvANNjj`w`w)H^k}34Ehm$f2Z}XqXXW7 zT&_QE){Z{1@`21noHbxgYrW%q6aViQzl}4ZP4tt6?4O{~Q& z=q-I%^5~f}ocbQx?A(F*>^O&pD@iY3Yw?55BB~GGfR+_~+`}q8SU%l$3=H~g-AHs_ z(!LLEx_qNMwxLTpJk&S-ed$4|4?6hNgNMp)&2;;gF|m)iLt{|<@ZqKCv&7(*J;QMC zA@=eVX1IBb^(E_w_pdyUz&|bMd(88P{ap@ER{H!kNylXasJmquHu_|AfPv6v>qIkp zKQ@qw=zbfg8qo>#*|!)YPx5QgZ<+qE?HfZ`B@t`|Nxn5F%E-g^wsDdXoiYsj6MD@Q z^7!dr54ZBs4sPP_qu^Ezy_(_M7W^W6>v?_of?MFLK1>Bq>VM#wD~#ywY%^;6C=M>{ zT1AEY|fE?uUF6IH#j1k-^_a95yP17rFoS!PW^qyqw(g0pc^MG54?kRSw{W`?z*vz=jSQM zPNVpp=}s&jZ)`{wv@v&B$DFZpH_y|)Ki;1AQjO}8ioNI6j9PPAt+nPW`I#3RHy7hS zy@7p#1IxP4(YAae96g#Hj{TW&Bt266r!&F5-;cB3W2aIK9`}3e;G)o* z-nYU>1(6G)IlNO@_W>{Fc5U8rB2PH}XYzR8f6ccx`nlLJo@pbm=22_dhmGG+dY+FI zhVxtJg!4W5nsg@VdGG%odqd1oNgHP8zhwlb8Ap7zCVRbV18EOSf9hFY+dS?q8p4|H zb9rYtd53;JuVG@VO?T=u*7U3W3IEl|dLE&g}TuP+Bx}PGUUiSL|JA z?CqCKcG4~)Eo(5Frr=ld3beYC=XP)j(vE8Eq`9K?+7uRl(yz^V^hd|uYSpXmQO^V^fOzjx;uoC6k@~c;hH*1@g5f zBsPeb-ha>7bY#5FWTiDs{W1U5F7$)#A5FFAV)4ilWG6Brc2`byvc}D7Vox1pPkt8b zkXa)bTdiGFq@Q`u>Z3C9bqqB&4MjKZOOExtSLiW&Y^K<9;1%)&u)RE&VGR55meYoN z^5Xl9!)9>so2kjO3c@$b=adjL#&-XUDw>3zuD%dQMW=fSA5p zhR+XmkMRVy{1iLr+^q=aK?s zqI0jp`_No*PStkpef6~67hmn@GUaX4ZMvH)*b}_S8SfpJpa(E6J2lreVauUEMzID{ zpUIBp#0+r!>msGdNNgT6`2OF}Uit$uVNSZw-RgmR3b;SW958}C8}-}1GVB`Y-1~VdzK>mT%&MPrbxr0H|3yV{oykn1&RipROY$S@ zOY)c}FUL1BMBDtlx32PU@o!mg>zrPn-OAnD#pngn^%mR;?Xdki`sb(y^!7~=;#>}( zeb3U)6JvS==AUwEjNv5Br;z!@^Fk0Oi(jmIqb%ay|=lLP0*~G zwElwrwW<5V@!dXuN0|I|%wx(oX~uEcMyEbQ8l|&HhaKIHdFb%o$u_dj<7(J*%rCKZ zcyqgKHNr2`OzjAxGbJ5Dw$g8!YxHaHgJn53A)-h5Qgw|8id z_xvQ!ec=V|Z5x_#m2);$V?=VMuQi@GhJ5hvhsce6jG_0r|4Q+}Wm6ZQNN;3b*(BPC zPkPIPU%k<_xu>l2_A38>;KAPQDe*{Y=^Kx}=7vJr*)yh6|_TE~x#_nj&*Rsb@z?w|2OM-Q9J4> z$M%zkP2-NAIsbM3t^UhtThj4OI`AX5Rb#|;c!8tpo7^>_A)E*<|#qK$r zm2zzWYFqui;RpPbsaTrL%PJZxm`5e|!?fX4^Ica_B5Q(VWXM3|`5@%^VAcfq-QP77 ze~?7%Gy~w}{>+2@m=hBlbQZJIo*RvZUud7gwUuz-q^2v+h`(WAT{jHwCNW|WWL)d5 zX6@FSZJX>=Js(+uAKGK)p>*DbXar^ih3H+%2ef z_%CA|O?38FLkS~?N7*~+%qvOgB}vww(B4zVpSQ@o^l=7;EbCvR`Ru>-I@y#Rn{@D^^(^2}7@mZqwg!uLU%7_i&TXjO=NoBsDYO;mH z`{a|~KQz)QL;3R)9NhP_Uo5`#vDP}mmr5B^? zQJ>UEdv~WYo$LmSBbY;TH&q7i$cu9RjGTvmp;o(tD3Rrp>)Ns_R4#MJ#+0% zT6JOMy7Asfqxuo6nV2dEz)QcfqXqfR<@cfoY6^<}bl3(6G6X{b2pharTAr!IOW=GtCR^-<|TguArXg1IVah zb{xHYo~P(J$lZB?71QkXoh{3$^GnoGN*#4~p8S3W@9U7EfgbOD;53={E%>|F-7(G9 zRaB1NPvCuk_u)IH4OJiM{a(r+uk!Jcsk^;9z1{~@zRtP3>%8K>I{mr!Znr;)NBG!W zhlgZ~dU!r_>M&;wx|;s9K6Ct`>l-qp7<-a@Kau2O7**B-V+~t(pl9r^PlYCdvEH- zV`*VG9_NUDv_*J~ri|iV{n8g6%|E#?dhqGu=z(YFMkPz%B^JOee*ebrZ_Ob|Zy>wN z7$5V&_icE4iN2w`{?;@~_@4W&X-sGDe5dtzW;A(#86TKz#*>Da@j)ZZcr){zGiLj? z`Frj0-P6sd`$l0yLtaFfFaJUQe-?Afe@(R=d+lc%W-K;*vtH>M5kAzlF8Pr9u9|n! z{p&fq+_l7vcU=waPRj3E$nREP>~Z?+n5%bw?CPDLx-#PvWJVl17Md;7@U7Zed?vPW zXdoX8=CQ-lqZN@@3+vbJxVXvdzmx{`-xc)V_w76*Z9CrMO~*H1 z-6LP|3r@bm9f9W3{U=dJ+Fc`to0$U^>izG|*S?z3P{&--vz+gfKYk861#+U9y4!cp z%ilm6t01wql5+f?ZLN;e=0CrFQ&GggDlD_$S2?Q_RQqkHUaC0 z(EHBZtF=Vu5+lYQ%+A8^ghR6#4_bE%U*V|vT09~;p9j9!r*B^2i=;R8!clnN0G`#$ zo$=C6z2|T@TwgeEaB(gzEa*J)SW@l5M^1q$B1@Nhjl7aXP)R!Pp^J`b7{^(fbL@PD zG2PGb2gYC96X@H>!zy$&y=$9}JT55cME|w(bb()sXz9K`vJbmHYulB)59s|mXI+VW zy;9z)Z!9G)x=&t)5REKQpdFZ#Q13PhTD|ogJXr7MTigis#c3o(?I`r@z)eX(| z+_2yMZF_upwBGx_l|G}tJLjA6p;7kwDa$Hj4VQSq4&PZ#=ld(br&2m_za75B@Q(7e z_suL@`;D2VRk$N@V8M>-)_!wl`Pz-V+c0zK+G^g<=6w;ru^Qgzo$Q_stjA>g%H_9#Q9uMb4T|?JCH0^l966K;PQyCU@Lwp3xlovc~QZ*2HTJdmqPpKZ1DTFX|h0`AeNW z`nTv4&f_fG2G0KL@!4WNGxp<4NL^X<>jro(Aiq}fbRr8hzC-3{#yN6xS1@Hkr z=CQWK$aJsm_1|&Y-a5{e`xB7+HBQ^VP1{@GuP{C*E%bd2ev9d}-!4CK#`LZt!=_~( zakNx!@yPCS+wOPD&Cc#FH|Ky;?h2JVgmpDKTg#Ae{C3J!JwK*w$-_4OOD?xlXK*<( zO}YSmX+Qs%d)EFBb?+WuRdwxsueCRqwG-|M2?V-x1KB$wk|j5+3*V`hi!y+3R$J?cyO@cwoKHBP&${jqlO z4fB4(Y4=*S%Q{?eYp0HC+7-;y_PMm};y^Mvwi#MR>a`s(t&D=Z%a~-jWHW|&Ut}uF5{m4M}MaC7k8d1?lF=e#gQvD~W zH~b}Nn(>;fVN6f`dY%8(Ui0WZ_MJ5^>yEP%$X6W4lDmLU@3bL}>emA5&Zq8x`ayZY z%C3Kst@GIY*eWQDc0EyO->qK$lbYpAN99pR<%_+HhW>!Y2`ydHA8fL4f>$z zO`p*|ycoL(@nK3@E^1#8xv1-L@V(LKc?@_heHM5#f4WYfUwpqX+WGH1e+f*n5%gwH z4oVIkIpVeX;-(?ScJZK6$t`e9gkGx!6yW3Tz+5&<#d&JY9*V?)(>rrgZ**z3O!Vxv;I$%sW3<61kHqmuJeZm8#knkBQ`W~Y^@yESJPTMW%4({ zndXb;hv;2vP5EB0%_QzNxOMEW;CyD}BJoz)U>%*p@#B>)bsM@=##D3&XemrAP|X?D zW#b3_gZ;*iYs6Z?woNRZi5(wZ1xF_Pe%HheYxnK+BpzeVufzt*omswP71;PS&coCr z`YMLLiq%)>OE5gaTxc+h=h%J6)+hM1!8=c|4(SBeZIlsC19|AQj6IMCpVc?Yrkg|7 zOULPg?{elP2Rq4Jdu%sAf7fA0lnsshG6iGlk%CDl|4&fXrem)sCf}2qUgYdnh&wae zi|~tVp>MQF9pD++01xs_VGdltdyEHJcQ`!AzPIBpqj@l|v7iy_(U8`2Pj@a9zo91Kjf(W^eK^Z4RcLV?TiZGY6J32axYQz9)^IrOYweWChO$dHTSQzNPcc zmpQ)C9{c5vT}XAx2BEgvQ;gYncv8n%wAV>{?=Yr@ddIH$40g@7&FJaCwrw*uOl*^F zv_!{-Tb*C9^`EjVH z6uhJd~DzZDtw!{hWDSE8B%Ny&!rE z_h_mu@kd7=Nox8-W$zBvoqorp^&Q2??tidW!?vt4$}8RKDaPEn%$W7YGH1-bMWStA zMPM28>T+8jsbI~$(z=}c0cijINPnG~#3mGMa?w|`P7ytXH_qy|=giaKhBLu|r=7hs zeLsQiM`tszEBEYVKfB-$PHYy@l;)H*Bs{lw4Ro$?0~>r-z#D51WL_d;QM&Y@^>ffy zk-z$N7CU-?zL|VG{Cmgt=f&Uk2JZ4xdio*5w(%E32m0T>Ce%~U|0>3QayWAj8c@3$ zOD$v7{DW3|Qh<-fr2n(%qs6=6DY>ILt^dxrCdNc{^NXFT`q?t2YGbhZo|4#%*^bua2Z_R|?3Z~D~b{_idZ{}Psm>vP< zqU$@c1z^{2A)>3iuayu6gjUyLKz~UDC>UYCSs>x$BPi1aZcD zKJHC*-v#6MdHEjz8dBBV=gYR!e_dE*E zUxr-Wir!fe(>ufGO_{9wgR0Ow#rv0$NBv5mu4B}-_KWyvUus0x7MOLRI%DL~Eu^s* zR19xTK#x0$9w(VDU3V!m&60c@O6&vVnBF^c3!>85I6sz?Zl1T_B65!qDQ6`L`9R3vYh$jmOVx60eg)&n)ySU__fTn z=a%~Sud)8IuGrGx^luUU3t_*Pee9MSdv`3vN4_G)FOsh`Y~8&2CZ5n*^#PvHm(E%5 zJOG{0|3EY8KZV|acQvpJOyzkF&wEM#8u`Jabg1e(`{jG&Zln2;uba^tVsNXy6588- zmC;iTTmuu0z3P7nHc;`Q9`D4QTQ|<>wq>yq;VxY3*j9YCdOv5xbTHyEa`xQOzdZeW zk`tMuMf3rm=SS#kXDxlm;rSrXwdk4KoO3Ucn~dhpr%1b(JO;t!z>Z6 zuiEVkwihk^*kJxd3Wt1L-A5D2185>%S8#lI99^M)yfNE`Q=IHzU$kx^e%S@Y`V~9{ zpFj%no!MLH9B=HsmY>$)jpB9ST)K`er^QoZ`i^)?`*(V0uhM!OJft@pwmtGa_=DS* zYUs|Eo1!!5R%Jrp?wyUDH@UCAI38tGu?|<>Pa$)}qcS4PlWTf+$Od<&{E^E3{2k=? zkpHdwobxrZ!?`^4@Pn5$zK!nCk$O$=9MT_UE&B?(K__}cwf0tHw(lGd`J$@ce@4&XaF<^VZy!9Cj16()U=C^=duUs>#qhUg+4952;Y7||(SPw{d+!zAV~-IT zO`rB!e`DR3D?QM6Onr0tw#wZ15A3|ueJ{_;XECnZdS`dXa2J+N3mp{y3>y$MJ6O(g zUqI@|tm{wknA&j#9JD3f%AS`eds9VQ`YyS8unPMGe9Yv#Z3lpkyufK>WABc5 z{dh0>aWy(|F?vuJJSAQy7T+&|?rpu5I`6S{T%!o2~w+wcJ9!I*D_MV(ES z19SOS9Q97lS%yE*Qs1G+E(GRwS>Vh1cX~T{eHrW<@IS(T8uO^J?P)eq23}7{?bG6Z5xV@+c13HhT~tyom{M?*I>JpA7$|bXB-*8 zQ~nY1U#!ky4UK*iG|ilx4U@+OH<>FG%PG-kj9X|K>nrfbUS=ldD7F*n%URFNICn$( zxcg22j8&$e@Asz#*QtCu@9FEy*~84aO+HG*9Q_7b<{i2Q*jG~LXZH~GbXkPhzvZ;x>HB8<$G+|D2- zVw>cr%~za#M)4J`4HeTR$n!VwIQd#vldlcg9npQ4=&LQr>FOE8FGNmP&*6!jegl1@ zZAmEl7BadfAryTRx&9Wq$&2uy7r!?o_!@dk4SQBWblAqV<@*kygJi_?&5qw@+jhoG4OR&kv=Q9PLxf=WI|LxsD=58=E)U%MYovqNAGmpnNRep~( z!f4La-o7L%|IXKm1F#=kR0;A*QP2ox{e=3D0+Y@?@{-^jJCY%(;(vhSybphjn&`6ZgyYW7oLkukNOQsF+iKVa>=m zdxx{%ln$6QFvXD40pIJ5YE!~bM0L`-X? z3no8^89VMYF%nho3zT!qC}yByCo27#Sb7!zmEUb=c`SVw>B?Uh zYbX51nftY5P`})ILZru!v4Hy2?tIeK-^lAuzr#G$KlQ^cJ3W@C{x#>D`tlX}VaKEa zC$Ejb71vb6+Q&rLW^jw}^*m+okD?`s(&&l*+{L zR2G+Rk>2SYUt$p7SZx*$k=;IE$L&^pZQU>Na+e#O($ zOR;jHHV1bBp32usKDR#yVtGn`?tJTr`}VJVi@-DMWp9e(XFHJ%VPX_$&S|d6-q?b^ zqdwZOZCc>?TNd@(2#$bnc*gQIh1i_X^TK2MeNrsL=&^{OVbyyZtynyb|41AScwLXi z6Mtqz@$}iNj*Gw0e~*+KYhQf~?>{r%?qbNgejQQ#LIV1IF3dZyMcvGjttbjeaT zeL-A$SzP*^thsas=0O^4=v;$tcBVo6Y$gV(P5>0cX-IWQ{Lzi>=$(=isR$2R+9a zbB_NQ^6Xs3cH=0kc8{4*`xo?qzp_3yiJSX3GZIZ7WvmM!BaZJ1<&Q;2JDlm<+xjH( z>gMvB=iQ9$_y%9J%JuoqLAqrxVTXf1ddh;sBe(hWFe!_`IMs%7IG~aM=#5 zEnxF7@zzy;*B`PcCydGTCq6XAKLWlta!j^A%=y~}^q;V2Rd@J6dUts9s(sw=7A)ny z43qU;7WeR!ah^6C{l1X9oOD-NF>z%Nsei<6^-j$4mwtU=p6+gv9#VN~VNm!m`IT`W zq($B;@_Kj=@LzgGR*3uS`Cmw!S1;I zMjziovlzzF1dwA@D08j`9mP z*yqp=ntgZu4nD*0(wX#xYIs;%vd*I!O}>>59r=jkVT{S*&JwFB2i&nfIzFEJZ(FlM z&Aa(!DE=*DC?d{nDgC~L|Jn11cT0Nd&ocZ!V;sRuqwWK5LK889pKcgoJpBM;Z7D4H zco#q8)m@`nxjTM0KgHAc{4V3Xq9G$j6~3B1%Ed_$I2rP`alT+2rVSs@8tT1%$dFM( zKAv)35P1Hq(ERw2-)N3>*Pr(`adzr?4{*0d18FTOp=PxqJV1{t1>ctcAfCL?(`x#q zvR>%Q#giBM61}J{FLbtsJcZX~`wwIp%@e_w?zzz27g{%pHWOZCZNVK*E$0}`N4%ju zVaoN<4YA?trDyZZ`bEI6Z)N{RJYZnx1D;vjD`3(O-QA~emy%}E7oA~MY+)zHdzN42 znTsn;`jbU}cGDN}sP`uf?2r0UPd|k3Vr*?LuEjHqF*EG`c04p?vIiNeaS{`y=@|HP z@jn9mUk`t{mtTZf%kA|2yYr^_?}gT@>ECxRnL;e)i~;YFj7?W z{R8)YD%5dj}KJI+LlfBj*@ncdamfeHeatq{yg~e*WFA-W|IReqrC?2SawO zuuD1Dhz>sc7LQkR>_^$~IahYNd@4RJ5VpLR-S#w(BA%q$3y$>eQ29#FgyU80&pZ7e zc$OOc&#r<0Yb|OL-`STL%0C3}ZD-xPTI;PLtUo{HoN-e5gbAz}GMgUvF*cRK#!_31 zPM|qnil3F9hbh;|{OzC~)fZ%6>z~#`+ge+xUDctstf!aAhaehX_iEOJwtn+j*8gYd zdn0Yew>7xG2L0{8c5%%SovC%&a{H}5E3F8fXQ{@$iG301%7W)uXKAk{u07UmE6>&* zeh5wHztfxQw&k|%w)r-GTjjAft0hN2q0MsaaPAn}=-+1GuoWCi&U(t%?qltG#VT;t zNq-W-*9dTRF5iNgKX^RD98v2dtvIu>4~Hf&QU8u`&gE@<*Y~~qUk{tFe*$d&U*Y3S zZ4N%4)CoNtvEu;^Y1$bv)>We$DNXBH*^O55Y{zaP`pMU$*Qp^Yu*efwGvt?i};ok+5 zEv~r}>g=ZvJLbbSCyznwg^<=C)~VD8ZD`(}>3d?__rdVCZBe^7+xn?&1@2jhg(TwA@10%3^aK2UFu`leVOjd92-d7Hf$hYk@@Dkbn1&h&7 zVDA8a4lnG7i~1VRPpw!Vq~nFDuK}2>rrq5k#jk<7n8S?Sxl>R2b~`fT=fm)uVVwHjW!r^($974l zpg+}|J8H-x<}puajQwjWS8ntUifd=pJMfMlYsW&)9xpKJUh8%2L!Aq#lRbe_?4Z&= zG){D`y$>+f&>(nHzby|nZrvkva^rsN##%Ev?HJ*3cPVsIGoWm1!)Z9!-rp~^M>~7h z3CGw7_5UXRJ7esZX#;Q=SKfN0zipLWt9oK}e)$abd{Vp+dtRf@yRnC@UpjS90C(2W zDw}o{Bh7ly-UHw3yKhl`moa9}+slf2G*8Wlea^wQ&B-ojH9O@MGgb6Dc3wKLUnZQ=|-gI!@&iT<#@$4Dx%>9Mdt8B08Cl0Lp zekE~bWk)K8E;Noz=y57zQQXTRpW}%?wbD(}(@966LeFq)ZXb5?o%k|t4BA}!slADb z*rA;mv>Up8)Ej&r{UlaSefUE?b|22NtDN?)^N$cK92>M^`#!8QP2iwdIs-VcJQ>{i zkkqu`$E@|=Hr7Ruk1d?v31?lKA3%;*W~JpTe;=NV%{q_Lho{c8MYi8!BIOzr9G)kA zb>Z>!JA$p)fLV|3LeEOyGCe<>RiOD|x3?t*mp1Uz3D4FVTfPkH3yzoD^*s6)#{YK* zmaV|2iL*tr?LITAxLY=8;jIn2mt9=(w94UczM4h(!QQ!Ze8k}jVt+n#>dSNW&5o}H z4&A?#HRycf2j(U)ZA~M#aWwv7rp0-wFNn%f7f< zx9C@M@K)IwioC4xhO=h2ZtPy=W3M5B{fI>D4kMWVx)TwbLM)bz=7(+f*us64Ns)`X z8JBD}>E6_1A$;Aelg>QSoUpES_6ihNMe8oDWwt(+Jvk*28h%T*?v$ps)vWQ~VjrFT z`@<)keIKREfACelwJ&tmUVDIJ2fRq%+%bHI@7gPR`=DcQR~hm2i#gxfLYyAA4C^$ z+I)dFeXPR_?hb4xPY3Da*BIO5%VdMcXZ}n%o+me60`5w{;WGA;mU1srG3)t@xev+f ztaY|%e{d+@hLLADdD$D>=p(kj$Hw#7V)xMYO2zCOyzjwTep}vISAx@Q2M_k1MRth0 zTEr)un3>>g`NQmcG>Bf#khj|Am+X%~!;5qJ_eZL@TPh5XES_TQ-G6Y>J|h!9jwJKf z@64vIgP+@1oo&qeD)($`;GT^M_?OK?2m45SE4|*v-nWeW+0fc;wjMa%@j>WuY0vR- zP~0fdp9RmU&f)BvY0a%>FK7ICeynfp{=#=P4vnjn7!nQaulSg^OU-NMT8t|ZoClx> zcR#3;{UEDjD0j(MKW3jdBX7EyX8S@n77nS);az%u3-qG-zmRwm@-GjVfrKzV()rZ2 z5ZbDrY^g|Ktavw^JtSW#cMe`P$(X&+n|93Lzi34LopA1{ z9rgGzcV#2b7*E(Rp3a%b9mZ+!<9zm@&EmNMcx=#|kkADm)fqwUhe_vUzlZa1`0P(- zKmU2?)5dL5(ee_GC0+fI`4PN;aaMEA+?@-b51!iL)H%NC z&6)hS+a2F@nE%3274WGcPqoHoCffIMbkJ@YZ3cfRnK^H+#$3&q?YjSB^oR}u&(RM5 zyJ*i>X7qG=*-szm(5d<>e+}^k?FZ=0>I}xCa`9;y%rm#2ztaD0@L|CR9mAz}yI&g; z?DmNVlq#GGZdHO0Z3kHYI(4KpW%Z3UrRh6;V@+xLzCBjT(2vW=qjJ8Bpuh4|`~@b? z@LlBSL84pniMgT|V6A(J1dA&4hXeN5QU;9aZ`3uCF*$v7VB}FBfdw{W8FlPnFEW>3Bb-=ohyxNkYz-S_o^w(7zOAKRZ0{9onY*czJ+@C( zI!|*#VY4y05L+(xYxc5N-!9vK(0@JhT4}OTd%0J#h&$H26SKMN6W^E#9y`D6y~>lv zGn+hxB^&?cJ`gL*E5xK#BKCRF=;ptcFaJQ>fR^WirU7pHUuBa zmrXwX&*c9E{x@V5itpL$MQdvRoOJV~#`3G|2(`f+`6DoSE3VE_ae2JT^Yy}R^`Ra7 z_|P>I=tl`Yw~5Gsip;|NmyiP`oDZ(xo}&_cH%gdCms}a@xdEQCm2~ltWv!9uTKqSl zg}uv2TSi`uMfFxe1MYbK%9&ZgLVD?IdtLox;M)C6@!kYmWaD1d(*Zwtje1;}H-~rY zkB*M1*lyB4(~%$2v$cjvo>&we4?Q<5E6%Tu(?5Ri2cC~zZl~2Rx6q@Ko8BPJ)#J)o zcW_qsw3uvaznS(OI_Y1NyD>rstXmH{G@$kPt@LXraki0_EAb_=W6)Z_QZZ;>WKF3U zwBm=ZE-T$)J7shynA2AO+PI9gK>e6HALEwoR{JVBLy2`Y!P65=_HgFG=m}0J?9n_> zS*^#FKbTxdogQndu)he};eh{F(l5N}; zoBlceC+AJ`4_h$DKW)KWe@gBg|J>ZU{t4Ln^8-`3OLr>uP4O=Z%)BQgW%<}(n-fVl%V*X3nlmBSV z_g^so0{_^YS^nucv;ET(=KEimH_QJ*V7C7SzKxkbi{EU2GX0tznC`zm#bA79-kJnY zo`<{!{mh&<-S1t%UQ}+Df69V${Hw=#fy0oz(qTh^!?3)J+;jYEJj3%Y=Uj#hvmx|r zD*YN3gH36|qP#W!#d%{$yMngH)Ay^WyEI`5=@;jXBmHX9lSvPezIs$~-j^?1ns*Ip z8-T&ZqzMMAFS{h~&YLdHyDl)_zbR*d{|ocx`)`@Qz`uHJVcy2Oi}H#C3;auS7y3Up zZ-M{X1q=OK=LP(`b>H#|qxl~8HXFI8_yA=Nf5vFeBJbg=jpkoa*ZJfxOIeoprL`q_ z3&7KU(#`=-yU3fkV1fT!>Y9+dz@JauhuPaZJlAO6NWPEQgSv@)Yf>(QMn02QN!l9T z8|b%id>`eiD6@M(z<+q5(Y!l1;D2kuRR8n2Q~lu__Q~dF`zJ#;erRR}v@#bu`P#e- z{qLq*dG`b^^q-SI!~gCAqj`F8hW~h~(Yz#ouK(QKi1 z^#7K-pLfxi)>i^Gx>S_PL?vH1@nIsB2RY zSd(vK;#B{}1-brXJV#L9o!nc0nD0YV@GDqIlT04J=-|}7PFUSe_|HRz7KRCsIKkw};Ld^%$e|lN^yifa& z=AP>>%kkuOOba#VSQkPcq2|v9a{T*p=lg@X^Zey$Msr7Qs5!{Dj;lk>bD^o*q5JoM z|4;MJ_y4sh)coh*Z2$Uaym`l2U*~~?8`)EQEq|u}?=LORyOgUv z{v&h!kIeBuQr}-nLe0MjPV*-*2gWeJ$1uOgfSPdImUrE}9RHV?caPKF#`#9` z0>=N71@ryo{5rN2<$VfzEdOA5UdNWgyoYIrc=~4Us+f-~O z6Yaf&TE02)q@4HrctGE^ZP%g6CfWW(E0V?cd$-S4}Sk&=meD(GG4wr$awUC6**&&=lm|= zCwX2~Q<>*w9GUd(dg(;S>^x-l@HcLJ?q+nKD;Vn-WXE*mvt-2;)-?Nl4e5*cz6ID6 z@=bbECf^FEOEUNJdk4yF$>3ecY{_8lE4)M;v6`#1ZJS{5(BXN@uFk$d^L`osD@WW}1mOKArmNSO2&?jO5>iD8*&!PA(YlUwJcJ`5+N!#R`v~?`?wPB+oj&o*S!X){=$WFXB(3@I_od}athhk+FY-NRckC!K>Ne9C z*=pK#uQPV0V$*n9c{S2L!vP*d$cj`ZS1x0WIM62xl?jS19>dIKZad-7=F?VDu=9?%IP?H>Vd zGv~VYJI7aLupf+AJmvmFl3 zlXO3{QFmW4d-2$5JBNp&)gEI*rjM(oE9sB`utw{W|V;V=qDbGd^%A{uWMP-w9fCVXHYTd#qr5a%2CQO!q8i z27Fa?=kk~Mc_2Kx^{9MlpC4Dh9oH=fo%N_6@pZZ1&h}K^n?{<+?)QOhGnb%O+2D6K z%(_5x!61ge#&7p!81xE%>|~y(d^uz0OpzV?Ui-*{=hfi74)Mce_@r<-)4m6gdgR9@ zT4Mje^Q6wSjEY2c z-^#&}_@i_7)8Koxcq2Tl%bS#=Soj`n7|Qb#^0;&FgR2iVxb2$Uopk!#_wW zdehEE*CtM_8MvOJ1c&8Agm&z99Ri9&&Jw$YP+Mm>^(Nao-2=Tcgm=);&oZq z^>|WhGvMvQRfgBICxd$`GB_8a_^WE`C$yCT@3do_@%{|&^Y9%AOfpU`T)?@iA|v|x zX0z@s&jrVKA#3e(*^K4c`<-#l&K(C8;a}4cHTcrKZ@zcRh7eo_|=VlntrUxHn>0Qg5zcMCDQ5i!TP*I zGolyE)xprmM32PA+Ymt3TB0NFO>^j||BR4(4_H_B3-%eIKD-;Do_FyrbZFyrzfgP6 z^k#f#RJZmF@3?1qdN?pI{b$+eY$NM34``S&t#N0 zTxb>OjF`vv*9+eX4=W4VF%A`vS-vs8+3>avw{~;hB)STJy#n^%vha1W_Y#@EUr&N| z-~)EqxV%S^-x>MXb%Cw$dOi6v@W)g>Y>sulvPg6%caS9l!_w7OUD>tpAl3#y+2V{h z{751G85nio(1^fB`$6xsgcFHr~W#{t{?;RR=XxnTjhW&72*cTbU zmaSMmO8OSyn|OS~mbC6=8Jxf7R}7C#W~^bJNj!JM=S$$9_$luFDtX1*S)%X$c9(GH)KQGd1jAw$L8g_>+aP9q`g4e9PTxMkDB;n{wa|-gX0RFbL{NZ z>fB*2Ypzbd8{F^N>KR$L`GdP(DFN@3=*LUst;7$h6P-MGJj;eB>yR;dNL znCZkHN^a`nY|$L@+vga;bsP0`QRh*#F?4o`Be`O=zZ@yr9BY4-WE8tTa8%%RRpzfB*^q9Xh)IqOHdQRHoY79A-}xrElj zsPEG2iJ#)D&^KSJC#rATk%>D!p5vL!IfthVyhEZZ`+4V#;uhoACpU86J8%fx!2)WFL)hrt{oKC97FwawwZ#7}HWg6?vFJ$_fS(DU&HM@Iw} z#gyHGkCXn(FD?MhcKyzw$F0y~E-|FsctEXd9Jw-{vb$pc6@R8`jU!)l=7IkB0?B`9Y;|=Ptcm{!?&QLW7Pn5Nm25UW+PO;B(x$trI9nVrHUFFf|Q-hqD zvCm&o78u+5Ch+c29mb*TW|b3s^`!s(c+*)M+6;KWKXnC`g1bX&Y}|2Y!d}S%;m$De z*=@;^FYL+Ioil7$3N}wbU+Sy)o$43gb>TBu&%EWwXVy20DIbpM8&y~L>tc^nx2ua4 zU)`@?RL)?16m;Zh*l+YaHK1N2rsJXOLC3pxIenFGcOUghf7$hYNB>aTX3_#z_SY@^ zx1XDJU1^$evT{CgndsZCg+_GSS=zWY)^BsALtm=%#<+f0uW-^`9WwOuEL(?^UUcH0 z)S0>5>6hxfCRS(X70&uv`l(xI#`9U)rjmKJjdO- z%OB0R?z+IwQMW3&0y^xhpcv{`y*u)Cdk=+5c2<2XM$ z692k8%eyP6=Y|Ad?fukKOFVRIX>M)tSoz-hYKbMg;Vt+=3wZiH&$Godk{rUG!g)N_ zvJ(oU)zZ<>v3xJ~pHUNUQoKU!J$>tRY%M*>Cs)2wde~DJUe9;@13P9)r{H|f5aWlw zA1%fY%XjPv;C&Q31u;Eq^$whDoRzOm%uoK&(4Mk)3!6**jvr$NJgCg?X}A& zWSxie*g8`UTvr;%z03(2egoNeUV@3Pz`EBtw_)E~_C<7t@ZrK}c^dkT{Di4bu%FfR zxoed7ypK-qu)iOTM7MtLb2blKx}m&#ZOZ0o;;6{-(A31o%XV9JI&b1JcV2s~Y#7uR zPV+=nKB)44p#Bu6{uXp!wY5X0hx#|h0oi=EroOV)aCnGcU@!M!e zYi8^o<3ehOymp>HY>w)?zDa)M^G$6h#M%z0c%tE>h0(QH^dm?8NT`rLLLa7M8(2x- zr`P{a(jhwP{s- zyY+Dg*8A-Gut)50`WGOUUO8|~uwk8G<5X~d7k>=Vx#0N>Wmd5E;2bz-I{WRNl8;54 zKPb*%j%Hw6N54moM$35y;1}XM;yF1(YwVcyo!+f!))Y_lyPPq0`xpV10nMXrPJa?Q zBlyp+?M_H`=&U3&@$rfqBg~1!mqd5=J2JMSt{}ex`_6#0Zx-agL_d{QOgUSR+GU@W znk7D?{%Q^3$n_!kJ}2TwID+-gNc=NK;ioYge+}+=-8dFKO?SQOj#n>tz4qVD7x=o< zPapkEV?IoxpYB)+pr2~!tT(|KcaU-SvWDpL+T)*|&piqjeY>l|dc69T{Mwpder=yM z(pQ^8Y`E~*erkF4|IgVDu33RV^N z|7=fV?<8WbWb?y5&|AW91^*xCIn8M7?H$^vyOpY9Yf5yRx+xK@L1bg#tN?vhyKm!n z@3uXS_s3{o_orywcQWqJJ!RJIpx@sj#+a*{hw0x^uk{js_O-!>3-Xt;)+-)uy=0A? zSUUk;$(=@ft5=txha0o1;D6$Ey1OF-zwBQykEPGY^S>JAtEO z#`eV(ckNU9;JyoH!^v|4{mxG`>b`|NW8oy@cnAJGJK@8Qyt)E9xg2`=40LlD^m8eG zJ(u9uQ*vYP7RQ$-em+Xijkg0NLi6@Ig|)qf9l*z&fhVmKPpW~Yjkq;_#b|gM@-hRw zdE#sY_mW=9ywSSfsoPomSFjEV<2x*vP~S=8i|k=BpTqF3_CF5)O6fTBWThXz_>Dwx zU;1Mo{v)!55!@ShJnVOrrds(_q3NRL*n|Z7FTvF5B-6wY}B&MZN0oVV7DE@yUM-;5Bxi2z?see)>F6m;$U9< z(U+gM*Rs+RTA@MaSl`;hc*k?rb%mXueoA*R-YIMj;rHc5k8#%!g}pN`(AczwFws$d zz1~@0ooOARI*5h2uAcT6j&SroYgZz=2xDEBNLV;v4sR9@JkuJ-E#E?a?DEJEtEkp%zQK4?XLO0v#xhXg4+1KllKU^9pmrW{Hgx+tNOnC6Z&2jTi2>@ z@v!rBcappo75e^XwEfC(Y)C&&tZRAC)7;=;ZXs`~(X-Y5Hu{JEettjR z2JSs5#>)p+oA8$Ycv{v4k?6zMIWnj5&hS3wk}b>dmmAx7XJDVs?%DciGH{5~E1CPV z!`l1!l(SEuIl)}B_l;Vp!;Say!PTrmIn!j*Lt-d;(LYYvb3^o|U*JMV$6wt!)7Ama zma63kZ*%nS_s;9xQ9dIQt-jLfpRpm>9l;LaQ#fy{a z=gvoGrR;vzM3K|SVB>S}8t|#1#;;1RUDBg*&0<_eZ}05NYlroG@CoY^jY+(u9@;fI zTP)b`Epha|`PA_UXI$nMJN;IFI_bMre*39XtqgX@y65Z}0 zb9BkC!2f0D=$GCi#@Zh4iP%5UIqwd?sappAxp(cj&cBH7j-!6|E119IPvgOE+)(WY zD(`Ue3T9`sE#5l6f9)S(%^zXyAHfE2JM}-pyp3q>|EhyacTZyt_mE-vtgDKpYro|S zq;10vP>rnRu7K#XarL%SUpw`-Q@{3$-lyJn>fQUY!`IzCnoFspoqBKi;q=P|Pq)2` zN&h=_E3JNE*0<`W0 z9izKlr}gQq>n!$TbY?FV-EVx65#9F*b-((Hfpw=3s(VtbZq;ecYFKW?>YT8kAJ*~x z9q)xd(&z0j4XoEUsNSJ*eQuwd^(|v`T?78dT3DH&%1qv z#;ln}^pUvwTA;BOXsiVqYk{_IJutAYXDHhOZMpdWG4HR&Xv%mX^STync)!7h*Pib5 zv0S&+P)2BbeKDl;&o!1|6cB_nUa-<)&N$f@o(?{V6@p^V0 z>Gi}2Ig>suSynp3JXy-xr);;6eGI2hDpoh2OjI$!R>#XFX>iH^K*&=I^Ck8}TkQ z_Q@dQlOr>_Ik^cZdoGm>_4 z<7MFEQr2#<_1Zxv=7g(TTJ@}*&Mj>A{mNHo-hsZyUeGRdVB>;cBEtW;ba1BQ-7xV z01XI7s$aIp0@@b5E}?wJ{4!Mbeg}T=inGG+ZRYjaVB5(z>HR_N|FBP1&A#o?VOh3bTgyJ# zCFSMwDtseqOU?Ax1w->1C$_0zU=Zun;to6O9#1qUrtfqN$(lSkk5TPu&T_wd&+z?z zPjedI%`q8guKyuVRQqu*&Q7cUQBSkhSw;h}jkUAOI72(z^&K0_^@X}WVyy3a*=4OJ z>G=m@Hgc{1`e1?1_~I$Yw_z|WjC+~yw59wiZ`Bl{%d_@+pwN!3Zq$L7H!|Yed zt%nQkyArK$7TWs@R->~f)EcNrYarr}sUF3_I=OKuwl?%T=67-3teEdWdUwEZ_Akny z!9Xa~U5pG0jKG%wAKpMqL3dd1Q?NVoo^cQ7rCj=l-ZMvV-VORU_;0{JBJ}Ha`lb1x zdG!PAbV2+&k3JzE>K~3Pg?5htn=H^B3QOZ?ycz6*sqVvGJUNeciYu z%O7mz925KV(n&qgr57HgIpig8DS6f?z9&B7nx|daPFreY344Pr8QK1!q(2E=KTn<~ zCrt5A<;=p9_+n3`jY9m&m$Cn^`m3m4ad}mbkG|?I2QRT=f#bwo3@jVZ18NJvDoxJDOsiPK=cZ#{{x$7CzVvE?Mw6n-Enx~k2C*K!i z`Plb4ImIU!Oz~e&zBK`z<04imV@4mh_qsFT1BK)-e5h)4A^8i*C!SD1zA`J6r`WcO zc)#8*8*2U{uu*&W0LN;0%OS>|$+!#om03n!8BZ_cgf@EY*u&H#yoGcYE)KT^c02vJ zWu4gEuw|9)cd)c_R-fO2%`>1k`5ZuJ_WE{}*WA8vGJbu;fHIMdm6s1+*9s5lJ!m4U zy~JW3f^2{uHxmDXGM&h3=_!Y|II&dweV47KE3nVYr!;)0CyI}AG<-MDY|dtKrqm)% z?Rbyzt68j3u~n=LFy0LDXk_Iw`Vb#Gcb9Am@XgZOJ(TClh=&j%LM8jVywC`*Tf5{U)xp81jS;p$D^<#5ct+iL&$ z(R#9jr|K+Uja*`{=tjM-_C#%6;C6>6%Ri&^JamIQo%db%Ae7GF{qERzz0cu&bL=~` z8lF#`Uvuir6J$RUz6Cq!3afapp`N8btVs)QYE1Cm>xs&Tg86Ho)$B{JbM|ThR!s$XyTANXhw}ST5F56~=*hr-avOSK`HtZgr^qPCxdM$gZt z$KXHy!uY8fvl|nz$#XCEi@^7p6xK!98ZKZjKEmGBIkeZbyC9frCX|FtD=`ef*xho?ltj*+N7p707m07OExGT9JiZd; zFZaXG(IXR}orX_`?77_VY55@#|C4^U$nKSfom%kdapEcp&x6OWvY=Y!!P z8+g)~P><%tkEyqMz9VyU>8oOy$WQ-$!3FrsPgCFD;@;U3&fv=avXk|qVDH#klA8X7 zypBy~pj~rtyP}c!wzpC4VPJ#LG`|83y76FeI1<5%%K3{JNABg`4trBnCMwm(6L)q<-FuS<9mu*_&`v6*kzQw~tSMfBJs`1)(zJYij-2PyiI(7Wy zj`yJ{;nt?9ahg-UiUQ{I&QoSk^!3X)`Z`H|r46R9!E#Y@!zwlMb@t{w`X(M!%Gh$9 z{{!q5qFYyX>}CE9u1ow;KdZ{&k!9e`GuxrlHRnZ^p9j5_f&=lvr|6&E7BujI^M62F z>VwXWa`uR{-oZZa z+{dANIlTOa@Egi+7{B5CEPg(I3H%cIjo>$u-za{g_mrQxm7#!ov?aFb=?f!&vU!|Ppm^-iB{g*TGvJcsRa^v)I$$LBriUDqNVqd-3G*6{*(|8{got+Quek(fX0%EbJ+Z+fB&e~+$$jj8@0y|#{G z?>oW&4l{SB84fqfg7kUd4QkrvWxbl3kiUla9Le3}tkW-Y1oT|7|ag z;d{04p#RK;Rs64q&z3U3L?6HT8?r&~(D69X=Po?t%k0++iBs&cj%R{P@vAWNT72Z{I%B(Jb%g$lPFiSFW&Q!L~Z;+iCmG{$aC3q>oDbALkC z+bNUbT@87g=|~rmRIZxv%cO*o($@_ojTM%`OmBs-@p#c z-H+%ZDHRWpUu_2q=G1C^syJ!Y{*bK`r*mE}(7N+6=~u5n(+1%hPM~buur~cS`w#!*>?9klM9g|u&M3{fF zzX)y?dI1eDpUJPCv$nu=?=o-|LN4iSFz{U0?%jdivwt1fy{f3OZyh+3dHq*to%q>; za~Escnqln6W`*)!f?wPK?d=3^yMRLl^mhL_q5Mj7LU2c)@UzLoK6tkP9Z z5OelL$$=sd@I3v#P|Tcg5;Fa)R^FtYiMyL-6@g*wz=K zmrQ3}HVXfYB5*O?xPlmp`A5&^K00$kMbzbrvu*-Yy&-ACHQt?s|grJkJ?V9AMlcu>TBi& z*cj;RVf<5`ps(%BW4o_rYDFtCkyJ+@Ba|P&H|i?4J@)n;-xg=?hnT;!>7P9=XxhBZ zKhB{g$EWZ)Vk@J&Obb13&~%BXC= zuBg4>{`0W9qtrbUt2n1;i*IVv4|9%~%*$Pz>a56Ndk#8r=Kl!XM2k^RBu#J^vWTXmH^3rj$spP5n`gQxEWU>Pc<-%Y#lm z>hBwU^`ur*L31B?QWD?ioRDxQzIQJ8i@^89OTudxi}xjl*A9)o6oYdcPtDJh8&8iz z>c$_nLhx~DP<$k4gz|HSgm9sAd5Eu%hg70dTt9Z%oh^fSh$~An=!0YmdeQ0rFtpLY zoO1Wj1kbp{O_l&Oi>u+|ZAq!^RZ;sCSH*-YJzrkOv zm`mS%Ac-*VDj?k9qzwA_~ z=Q-}Ktvuz}W>kN?PWDOnUsN(iyB&C(_-*{y(9;=Pzdo!sU!YBNxV^WsW|z$1%;55$ zy;l&;XFl&_u56j{%{0XbXr)iP3+L6o1HH)av&ZYi8a_ncDe#q_y=O)zm=h99q2KKu zt7H~;PY9=yYxT6_%3bM1YC~yvcyxC8^fPU)z1d=aBHc7Atm##07I<^%TX6mENhA48 z`o47J9b+7uMJF;vHi*M*Gi)CQGlhFINB7$kI;Nnja9_4~n8kiZ`p5Y4)*Fq7o^{Sg zVB72wPctH(JUT29H9ZcokSYne1*00f*k+El3^-OoxKUz&$;_&@2|2ro|?0oI;#V+K1(1-mEzAM~yQkUwn`*!#&ecSwh*|#PA zeJi6s8S?$2Z@2sh`&Nbx;^~j(I(UQ+G`RHpV~4JeK)*dxi5C+~FJrBh9Q&rd`Xcat zobTa5cy{xPc9d@m`Tj^g&8K*u6W8}E-p-==WDE)QG=f*n6L?|Y+O7EgxwdWk@E)gs z;*Va=$oz`BD0$3;>V%B8#- zug*Ajf8QNPQd1FkEq|vEM*VBh|3AioE)Y#%9&5jUAu_lPnBe1L+ZlCtL9rpevg&oo z2|Zn34C$GQ?}VZ4^o^=egSr04{f#(MP!}F3K;wio(p3R1h9rs4?KFR+O za@(OB#~1i)>oiA(8clrfw&<7UUU4SRB4Y0l*G78?ZT~B@uX7sbBk&({uiVX%k3GkTJ4o_K0A5?!SbKC956#8q& z%Q+uD6|+f(f9KGY=V6DY%qiTFac;jnD9k4I0J1&`_LWq z$CH8W?Mv*H5|5|L3xAmiAJbaKXJA(sY$n+H=gag_{i+8)8rwG+8y8xpz7E~!{bAn! zmG{9qk@P^xk|g-I=4^y~+>KgSHN&WTmpWU3O(Y?7(y;1B86opy@q!lexOp8~=+}ot zf07YrI)@%eCf1j+Yq{oYfIU#ri0D8(#=O@Udy$9zA@-0Sh7ay9G`cPN-hhr!T&8^( zW5fO&BflHGTE7hKYrytz6@|JRI6u0d{T|_hJkcFCZd02sqmL1AsIx$yQN8Sub<>V` zKJ7S}a;702w^=Cir zh*m;sgSBTL4FYGE2Bi-=dfUMB>@JV}XL#_(;o%I5sX~h=ScobzZk5)o>|8- zIX}`*Gbe!M`@s4UXhyUq9ppXwESTH!1DJmem}<|aGdABM>zS|2xy;ynbIZ*GR~jdD zXWQ5wjM>scylb5(x;re~(N4V1->;tx`}N0PN#aaVGG~j%V?RnkS4l-znSib`3|+<1 zf89My&DZL$&W!oZq;+>(HRE!n*>(YR)Th75eF~pOH)Q>qVm|Vi>=pZL8k^AcH2r8; z0<1?Gv!ctOkKxAH2K2ZdbPd&^U*I{14;;8P#s{WxUMH)c4}`Lim5Kd)KydB-y3w6} zm!~oP0_cqPunF{7zcT73BHQGHB>0LijHPd)!$$gnKHk*MUfi?H-H(dk9sC?SN@`On zeB1ucT-c_(_-+&@4Tzrw92*JC1D~x=%ukT(D4}))U#)3O;oW0n-c|-f| z*$SthcAT{y>3EOPUzPJsgzoXDe9DG>QqxtjbdxotU~qYCj5ghn|Cg-Cg|lMTWE0t| z6Wv(M1@X(}l>IE}vOx%+Z`wR^LenLryD>PrzBIGX7p4Q9L@_~5ZoCFsx*D3g3fj67 z8e7S^wH4S&hS@$LoYPy*9Z6BnH$=nOH2)00{l-V|<*S=1N9>A?oJ-k)KRkTT<-2#V zj;hCouKn_*tih_`Gw3^4_)K3y6M9_Hp8@=h*kCK!bFC*W zh`wAj)>m78Nob$)DaNxipH5$|e#PtZrGY$KYpphHV?Ok>Mr3S&Hr;+mUt2~$mf{nk z`r(@^&!x>o=Jf-AzU!46%WvGbpT4MnYsZeLU3#h0k9v5L@_h&#s^LxYgS3E=Y_ED& zkQaTf=LU2??um&eWQ3w?hoYlr@S{I=`%@g6w{=L;s%5jGk4w+c$EE0pE}RnRTRfbM z7@U>@ry%XQaFYB|-5IgxC*kV3|6*J{^$EE8BseSs4y$7H0<3yUz`-(TCWrfnSAnN? z@REbhy$m=gpXdcRyev2bNY}ixAFNM)^yR|7eSk*fGBS8};|%5x zvR7qRRT_<};EBgX|L_F2t0;j&{YEn6He_ALEsoByfPKYuBjuQQj_lgv_3qQn z>6FHmuoi5ht8_V!1q(JG=9MRzTr*oE(fkVRX==t zDZHKcE2MjcH#GLy%G%Y}ID3@tw-RhKKIok-n`{?4lI&xyE$wN(x3eD77=CV#A!3g~ zdz0dY@qN~uVO_CZ_0^x~o&7jt(*MWw{LD|$bDTI`nzyWPqZ5g*3D22b%D(zS%9TpD z$97se&NvxQ4TLFI>apMDPOpnMt_8$4$_K48#$Qq%8toNfaf+^%d5KFUOp7x8dV zdG~!Xupd~?Sua~7Bqxk@)|J)QN?u?LTB-5M#)og)_EK^fe)Wg|6Ms& zhJIUi)8rKa&X086l0HLgSY*q}^w?UdZMm~n+T1wZwt*hRXV8^hANaACuy`-tvCdIdjO&5z)Ty`#kUa$M27M&a89x zUVHDg*Is+=wbx$zQN65b9?sS?KMGC0kM4e7y3i$AM^5esrP(2Lrr(9vjDG+67wC5x z6Z1)Dj0xej&l(fvGXKBincL3%|Bq+9WqLmzyZ_TXQ}sDK(?omz8=h&K66eqDeLOSx zb9lxWPcrYzoDhZ=W&I+&FS@AQMIdp0>fk$-J?LV10ePU=So>^9aa*hP)BCx4JYRf- zSUc_OuM{_czi}P0$XF+eY`3H1SB+pj#hhYiZRJx~N3+(N$=nXyBX(cm;oH$)z4A@w zri&Hd48F_!*=bekze1gaSL0)&C3sPMZof#zNZ%fjvG1D5vtln7dElU4G9TFU^f_%k zZ4ZvnY0?mv6^U|4*2h6?RfY^QWSrDh_8FEVbHnIkK^fy`$-=XglRpAP2gv*?ujKH1o@7cpymIMNX8X6VU#{)zD7%6_&6jpZ#I)*dk=i)vR&1 zFwZ`&raG2_~Oa`)SlbY)t+~G zzo9yy>2fmX%Gzhwaqe2jz93^#_T5BJlW%cfXl>ufcsGLg3rH`rAedg(Bk>o5b1f~k zU$^kIYv(mvi#*!7eY2h+I!Z;6=OJc-DU#o;vvwgHk;~{G;lr2Nb-O?nbtrY33f)sz)Z@*Vr6 zcMra-dw$B#BYqUDK{isKLHX!OB721nyth@R)ia0bz7pb_j%*V=ogek?X~QRK1bUam zV|pWQckq(OvP`{9pW~8KF{9*5&Y5XqWC+(JWGynX$rVH9hZ#Vvv@8F-} z@5%o>`OmdaVd$N?icX_rv@dTEYj*0LQ?)9VLz~<1(`?i10XfYD|A3F+0a^POP<~rG z?To|6pEqm)In9@mZV!Br$66`>ChKX=vCYSzvRm+K^eCGqHj@_FulP3YKKp+9G_eb7 zdorTOiteG?7jl~2;M8pqeeYW7>s;5P->K3_xnlR(u)FwH;T`qxUAq5C zmaad)GEDQ$-YxU**bUm5g~MTV+$Qq*;hAz`JvpHT^Gbbw0cU3Ed+Be>uXTK~rg$Wq znEb#b4>6C6MV!3kH0B7|2h-=M-zPOHg8lrboBP|V1lQ9yAPjyzcm3C{5!z^2KXONcrWQbG{IwTOU84D3EpRd zyG(HA?S1*B+%Eh%@Z;%Oknmp0b*xNIXSDyz3GXG{&lBKt^S`B;JGSfP-jx4_{|DdE zSH6_9!~{QVf?qPhMXQqYf6oN}-UO%CB&QFU;M+{_!zS2$MRNYHnBec2VBhrQ^beTe z|Cr#iE0fdTZ-To`@Pez7)Bn~451x_yy~+eXV}k!|f-jnxoc~S}{4Wz+Fe^Fz9SN|R zZ#v>~Q|t<_!#i(GR_gyU3%v+?;%&mS$WPI2WWN86z>_~;o{lb0F8@9g{8tm~nVp>e zMicyF6a0<|zV+(l{I8qf3+E(%zr_SUY=Yk~!THxD=l`AwR==G5eTE5s!~}n0g0JG< zrbK;cn+g6O6TIXeeJ(Tfr-u??ku#;pw@&0+d%}Bjzbjh5v#y}eKjhql*0*0^uJnH| zx$K(~;KZ`;Pk4X6vj3N}8(*~S_Y-i6oElZ1T$gVoz=?JFVZ!_K)uoN|eqXdMXA*Eq zUCQoFu1mxOA27i^CV0$!$@#yT0H3eUKe+FU*SReLr_>pXlcp0HeDstFR==P8{T37a zTmmfgHs-BiKj_PM?z-!;=377b;&p!^0jJd6b$?$O0^e+ce`A94ewdtou?c?M1RpcO zc|S7cH^Gma;P*{%;DO})n@#XvOz@ZolhfCk;Qukf@0#GtA2Q`P!G}%oupcL@{>M%!W)K6`bNV0bMuBSlb-s?7v~N8j=r*l7p9otwlg0m$=6RzaOwNW z-@k2wn@#Y4Oz;#Fz7;0;&#`3uDLu*XWE1?81o(V38bDm_FDkDln(Aw^>fZ+yagbKUecnBIRkZ&S9vNMAI3!8O?S1iaFR&nLi%<*VnJ(-O-sW={KW%3qX# zSIYms34T5SPO4ABoOC{V6f@8LSM^E2EA?qI!S9&hLeqRyX@c)J!Otha=d1T8%!&U^ zy~mj5wOdTE+cXCSP4EjQ__BmKN$76OF&h)!pS%A09CKv*e^>vp33HmzJ#2y#=REm7 z#56ChGr?^pILkCI%`n01OmLeC&N9tQUp2vxn&7uh@Fdf`^nDZjmI=PVG%qbQ!9O*@ zZ<*i{)4a671pn3qziooOrg`e?Cin*lu<(a5&pey({@nbb%cnQ5MT*aSbA zAXlY6i{iGcwuJY>H(3cXUf?TD@HP|tj0xt>o}@YLaud9`v`>BuejIUPj`gWS&+?V?D%lE5I@S_QEI06613GdIxx1(PEo za$mj9hkw(5fnVD9+XTD<4|=7q9D%D%@O~4VcO*IeE))DW6YPGqFTJ$S=$Ef2yq9tt zOz>$FJm-Tz1~cXk5YO8v~^VP(R1b3HmVTZ4WELhKF4urWRPk5B#|*_i&5 zP@d3p($VDl{_=at@arZxw?6s%mrd|pCiu7so_%j}{;&z&ZG!*p=(F)i{~Gi=neblP z(a+hJPT&j^Jlq8PP4MIdSjsW@XjZ~|bN}div%Yt-!1={($BFHz_+0!tAAa+{z%T6& zCg2tLb`!k81aCFLKQzIQnBZTS;NO|xKbqjI3CZ)&WD^`R!M`)XT?ud^{RWlv;XQZ% z==7UZ^55wzixTh({k9~)TC4*_*`?m4G+FYL7O?}BhLsgn_zqz2%@Ww|3HThU>U84A zwIq``;KVW#zpB~9hYF=_DKAx>p~vwVW^;S&!He^?y?fscmC;nrp+wZc#L$Ipu0G=GDxDnJ&hmP)-=AccbE9B z3m@7=ck`XPY|ac!?6TU*XB4!#oZzhBES1z|zO>CwJLzn8CCio)r`28TQ-MQhBX|Ud)1wfw zD4bQIDA}BE^4Sw;w+ zLWeE*CvJrfq5VY~4Q8cnar$V#;{t_vka}!%+B)}R{4wx%^!dr>o2X%`PQv zlT+w#!?zIsnTd+3Xgt*i=bK>nSy-tI#EiU3XCNy7&3+O4xl7TAn(8$rzZ8DNS0uiNCro_Bu(Hdegs0d78|HfP(X|oF!0RQBF7V*WPqbLO zK|lU^x4Y+wuSSNvOD9f~yyIR~dFPaO#PtZ`TLE2nw~EXn4ptpc;lJA!tJ?jsl2-gG z#E)Lamaz~0{(=MA9cX3Z-xneh;NzUYvd!o1-_qStMN;nrP|A@@gtXZ8NR0~ zcX%DMI{aHt;=AV{<^^ZTt4J$xjq-^r>8JgT7Q1tBzd&XsJk%NQYl#E-Fm;pj+!ee> z_ON~vfB(VF%Xlww|Ag15caOw^7Mx0}5BF0e-Js@Y@bQEOht0eu{>TTpt4m@^IPf2x zg^XH+fAUgfnee92QE2B#)8(ARA9{a*l{2lxe~I5eAbzVeQeqPfKUV1jTVq+(IPT)j zQ623z`qzg4e-%ExwACr`xSm7KH!d!VHXaxr-M3hc${CoTE8HSySsIB0)in^9^qc`~ zk#i}FsDI;uuSJ{4BmUF);>{Phk-XxAbaWZATCek5k++SOKuh=WEpxkCeb!htg9` zosecN5<^(>Ri%eph~*lwDYo(;{Ykyb^Z52yHG88=l}w4#8~U(!egwY2ulVp1^3No_ zZ>du6uL_lHQ60`D#25(Sf7MK$TGi1#jj<7=jNQo6D*rTJ0Gff{Nt}G2v>`EWk`XUS zVsU)5T;*KyxzB70k4lV)8|a(s7-KimCldw*CYIy|CU(HXkK&g)Xo&bF5Z{7!HRNgk zd%pB~AnF}i7NtL0CWQhMZyO(O5jxpukFtoSK>)iKi*ItX+HG|MK2|gQGdq#Cb~cmj~DN_XQW1 zwe%8KENq>zdO!C_6Erb1c+qrXPiMnVc8#Az9+KW^Lq=OvOQ!hp{bkW7_jhD6HlUlx zN0HZB8o3KwP0`Y{lcqI;G$OnCKEq0^Okz?5{YuL)YkpSM&1Eg`5(|QRrM1{ap@*mY zLY%#F@DtvuX522J?4^vmx2%rlKXDiBJypv~cBuo)mqMEt=-Z>Jvs+?+OS?+r=ffDM z#CD<_-r2&;H#L6l$)kSq?o!UqT9xq{J&+-y+emuv4MF%nLyL|70eyh{JnUO8yc8_i zV{t^*SRLhyKDM6T??nDm?jozLyMS_sF^11rUCqD41~0rTu*9nyD&ulQ8G7ANr^p__~u>(z|$UeW~@sx4-k`l0D8HTP2g4c@58x;n}U-fYa(Ir_OO#)rtmbDabJXgT*l z9#AzOGL5eE-;Ec;?4Ufl!hxzCW;ZZC5Vyqc; zYG6*0`98=~e3~T=kWrr9bEQwtC%#GC_f*C~T56!Dxn@bUx!;#3FqiH*#u{Mea3!l; z&CM#Mza+L(6ZZp+B6jR?&R(Pi!gIGx4@Cb&nxks&w?gVxmrornF={iVf8~55d3MiI z^RoPpt3H|UC4ST_)fw?C=;^zW(HT5Bt2&FjRQ;*wSaA$XKU6gK-5u+gP5Y zm+@fROFxviD9i=L>W%isQW&G&qFa53k3syVAe zESg|7@^KPvN`eka%lUph@(O?}K;WIz{_0W4<2vJ>*1AZ||NU^%I}!O6pW~b3oD!&UY0Y@gPaPf~rN3kqGOjXN}rZWw0 zUP5`bQ{(!t1s#{W{VKTQ51F+~+F-`NGYdQ2Ex#k)fl7=IbBsG({~iwyt_1(f$Q7wC z^7HWR^uc??aA_p&KoAG5rIQo_9w2FG+e} zNk38kQ>Ls7h^w%>i!<=~%n1>6nywLdx5P>=)z;d!HQY(cJ+`9HNFJ zQQw|>v+KQUej9B9pOM~|=86<>j=3*SxMe2ycP|{EpIwTuE|v1-dydqF*mGy=LfoXj zy41DgjXO_WByCb%JbGQg_nCFcIY(VcFLin6Ypi*oX(uvI^XKoc*G23E(l-UG?uf0| z_#wNwi?nTgKZE|)`;50+bVbQ4@k!(<_>KxbXs+{6cJph%-;d`PK7SclcvD*=d}__q zcNRUis0=;q587Hzh89HN3*#`7|Be3pvJviF5S#jN?#Ar;iP^d==vw_`)GM-y zm;=Ytb0Q*GyqAR?n0ku6Hi_!xJa)Y}Gy`RcF@WUoufu8Om(k&dR z)(ih}mTD}v5Mth2S-;tl8xH0mCv#Bp-KPbN1v$eruwk077riUxVA-Vg&|22qHR$b^ z5W9L6bCKOYucc|DD^|riq6%Gk+$iEl!k4%E`}?XdLci#zJi+*xUyd%c8CcevJ2ja^ z4C9P&);N_rad^*K_1@43&Ik`xdb(NDgf3EgHd9XZF#I4c4}8pBW4k;V4e8D3>8Y!$ zqsz{dg7RJg)ZswZLNfzL9P9j;T>uxm7YcNBhU&r#;T zy-#UEZ$A70`JUug1WxpX6}F#p&kj6kTU&M?F(iAAvi@s(^am~{?@kV=E8m9R`4;gb z=k%*{cJaT_>Wa-^Ez-DgNDN)tf6AKU&mi8w+tyUyP}XE^{fU)PihW`KsEBR9Khm{N zZ92pI(^l-Y>(<@(+`1uiOJDcP~~{`S;41W4X())=D2S97f(wcM&nu(yB&9w~$uS8#c&A z1C$kojEBb_t7)>?9g!20B{qsPQpnoGIbDfLx}B^=9%4*;2ZUR8Fs3(yuj-}gKKt9f z;~rw{3U3ET1X|wS7ic=odb30N9A3A>>s828WLR;4vASXevh~sFRkqc^DE2h&)F4J3 z`wRBfRZ%~1Dez3}?7p>@L0)^EQ~KHFJLnpyW;(m9na#5PS`Lmb>%iva$Y}de*6WOC z=Cb+KznEU-U>wc{kCeR`o4a#$D7pl=7C7=m#1#T>wSBYG2k*Ssp>Nk^nvZ{~~b>ydwPjrx9&bl}7lzX$}Ua$^mwfXWuOEYVF zkr6)Mv##Te6}hJ^NM4E8u{mCThqQxtK4j8X{!6~cv^?z(K=ZL(gy!^y=BW)Bo@!sOtqH<*HEMoV~WX-PMUu^TRX0gO3*oOtQm^(}9 zD;1qm)|}<&WVOhta_S?z9Xh@C#njz_rY)Sc-D0;z9B$*jM*cPsea6%c0p>MeZ7D?FG7B;Is9*zWdo0<)I^BuMV(x5n%5^ z+CAeEh51ZvR?$sv?CHIKMzC&fo1@`d`NVOlq+Q0Eaz5W!3z3#JCTYJcFnURTilW6X zs=$6aW1t>awgTN`I{$4-jx)bfSs{JH9G@lgq0HeAXGpvpiMe}j9azc`-EsnDfPX~= z_MiaqDv_1({gmwHy$f}n$1_M@_e%Og(n}h6YlUJ%mT~v9=oSXPk$h(^8!PZm(&y{= zi#^y|Z7E8o^uLYwRmfy-&G@M37s39zF3^pgh~PrmM&1naihVS(PWQ*_6i&xR9Ir&_r|t!NJW}(zfEjncn$wN1L?sG3eCAT$ZckI;$ubJ7xC?ksZ`$e2rIP zIn^tqD}ZmLu4mBcwQ|(lP%8Dyka!PWtBel4gX?FAb-# zYsS}^B8#NI%6MWQ$JQ$SGpM;d&P&)SvW3nHI@Gsm7wyyRN>w8QzVT~qL-((g{k81o z5}`f1Wdq~zW#%%WC3goL?qW_K!kk@+9bM}3F!hkJRUvE0U`aG@5NlRzUbhNOS9bS~ zwY_pjl=>8hPjKfEWqpM*zk=Sy9kfX?IAjk)>fKHMXt7GPSS+y#LD3^`sEEd83HHCf zc;M$dcdlMP!zb+?L;VyrHldDqgti+RqBj0-auK_o`PyQbP$(V{@*@u z-X{LrCMsDa$PmFHaa4y(AKaNguS1QEKkCrw@mKU2{rlkN!SU~5MgRUjv`K{q$i(s4 z@Q@GOVxwv79WcRW%`F!mcnlt}+gca;*QU&y^}LehBQBxu`IIbdXMX=$%e-0t)nTUER;65sK4}kVoVw14E$%wLhg<`l+T&>V9O=f+gSfK zZX6mj`mvpRe-ihDQx)du)aP6|=!tgr8vIj~`m5i(^IpmS_LG-fuUJZ7I&M|!C#Y%d z>@(DBya3O=vMz9M59>kUHL()>Fz+Rqb9g_CpwwvehuheV#}8K zL}bLbvFo$X&|Lst1zu^~c%yb_bJG)-oQ+eff^#1+f<8+IpL#>telC7JOE2zhGU6jk z{7xC8HfTmnfE8EM)>;{Z=&-`8BI|_~fjBJ`-nT&qp;?4_9E2_oXyQBQk2F6!A>u)= zEQ_~I^h(yDnY2r5U$13QD1xk;1Aj^x5oEmF5prgtTeE2yWnCCAtAYEcrK}8e<9s*k z0rXquWn!txUbDoPmG}e_Z&vPy6YC|GuO8){U~IiFSeWH^h>n&TR-)FsrLRCpL)Mc zd;h0TyD2V9Mc#hI6Oz}0KX3!!Af2Ps+% zSK$GPYpnOdpyuCW8xh_|CZFx^Zc~3tU;ClsW3Sf4Dv#Wu(YE5qguRQ{2RxH=zpH1! zk6hCC`{89NuaLgi+i-5(;iKihMPE}{6I)mlC+|D=9lQM9W}jjHvS{E?YG@#(SSL>rLnw=+g`_>O2G zJvN~Yn~&&qCm6flHOzBs(Ua&KnI{Fe;CNLp^V;B=l4wI}U!K{FS@<3M>mAX$k!`O0 z176MMBJEqVQ6YY2phxUPG4>4A4|F|3>iWlc8-i1<+Wfnocl&wQYL89O^e2%6tQ)R| zzr;o&<5FZs2>PsnzB0b9FL=qd)$c>@H2rah>%>h;{fxU6Z0Jh8FTU>EiT?J; z<@!CQ@AJKbpV+>xL!LgxnqePv@eJ@cJyYlEV%_T?E?C+XxS>zB7eEu4BjNY@#J&I6qN$9HGS)JG)NIXC z*J%^=x*GK?q@EIkc=_wf_K%jIdw-*Mn(dIxl`@8GwS9AG0qwHfjs0(dK7Lx$xGTzG z>G?i1tD8kUoBk=py3zZ)h&qaXwTXV-Oh1=T4@V1YLeZ7ng(l;DJ?(uNy5C_*X+eJ} zPD78T4^})2U8H}67LtDfKS|R?f8xjImpS^~}dw zznr3-z4T`n{V8|OoPci5?*?Kab#Qy=M1c&HTAL0r^%k;wfSk>1x?-U7wYqrm)NX92W^u%4BofVmsMG*_0=P6 z_2snbBzh}z(qWmCWPZA}{}nAyIBXFQx?VBx&ehAJrOLq2G44t$Rg}={Ki}bcga3;Z zYxVP)TU}!^?%{n#=os%8DJj*5GV5KJWPHyhz6G^vdbf%!Dq>A>ZG2r3(%O^SUCI4w zhQ8ptHG!v)+ZscHP=U0uU}$MKY(u2!#vSu8Rj^iGbrLc$R2N58T-W8G!k(C9^3(|qOI`-_ch>N z1pJc!HP=GqDYEl)CvsD8_WV51Bzv<`caf=G%z0wZZtoF$IO}QUiWV6I-RNJ)_`_b0 zt^Ncu-T862(pdhW_-#7T2$^0Y8DB zbb3I2`94+oR)(eCb=q3wKZLEUA)apZ;jn98zk#8&UvF~}yV1GCuCz$~wosof)M3l& z!l+Z~m;j57ZHt_U=;V@ihS6C4(_D=vKC}b#T+Z^l~3R4_|bA=!&@zy zKZtox-IlKv}=!~10a6dhP} zCee4t@VkWHX={4(1*?7)owMp2(LbymIPY%mD0*RS>dqjcUSB-p&c3C{O!iha zSr?-1%-x5d+CY5P)ho}o-$~sijo96e(*8pFf;F?2r%=}y$dg)MGFFeND|uPR?(TBr z;G^=rsOA&Eo}ti1+b1NiflF*#jbd|x_IVJ62d2ppA;397luDBmVAFd1Pqocnd zF7hVf61|*ymB-sC>x1ZqQT6JYJ7Pw^hS-B{ymzMN8?LH35ozN}-iiL*=nA*IG(u%h zL*ED8Njf9nlk}UUmAT?K{KwZ)_eaq9dQ*LO`W;Zazz>a%lf3{ z;9Fbg&Ybi3x3JOAIzBW|<6pXME;jvHz~&k@nf*E zHr3~TX-6gPSR8N1HPpwb+e7@9J4j?LB=wg1_axMPJKsH_k`h@1B6nFW+_jRMV&kXz6d-&CA^+K;$DKtZuP%co$ zJ_)X`f=kkR3%Rq4ao^=9-T-;7!~fQ3OBH!+$lgY5vVp<+dQoYCWvg;%ERC6YThYX$~bs> zh3Lsf+N+FuU`JLm$)k<=?D{C}IFhZ86$8hYNZYY`d{lU-@K$=mmr#_mQTxPyerj7ZO^{ws3irD$e z>~O@(#K*{7W~xypKCBI_ZS}U=>R(AuF4Gb(Gt9kO?9HCHjTQLQXl+dI+k-IL`1XI| zee6(LJgjqdnW5DG0NS4IXZmK-e7&D5;`|}~-zj;KE!YmU@hm=re>2|o>wEXI@ebWa z>nFzfVdEYC{Sq&{l<_$VzQ$KWTgN|#Y_EXl;7!fe;25mT*LcaH+dvB0YY|*hkA2{h z{tn=uE%p8}^SAK!jO@5vf&ZT*O)LJeGJkXxV&^VkErksujdF~(ifqHyDZW?PIpDdE z=Xz|0LI?3fodFFR@aJy8uPGZHTJ+`ZVhg7pBD;PpW#lL&xApdp)80|;4|%72+^d!Q zKIO{$mw4BPzy1zKU1${Rq}}kfQI4$fM@u;t{3`q7W5j%+qHjta#K-1h`G${9n6oj) zJQQNxCwyX*xd!|dJ$jjPXSuv@;a!)MiT!&^j5&;YOGY2#eJ%euv= z^BjTUK?9y8Fk`@guM`+M8SqqrW$%dc)>Gc)z~gzgjc9c>BIk_vCA`<(QI_m)l*+u# zT4odbYVyAwp3AofR&3$f#2TtpRkeAYHF>BT-Vi*}o{PXE?J3iB4(&cMX_L$+!Uxhn zB3u4UTxi|CqQlPt>-;7Al%Lkw4Sl^1eiPr59M*nvhuit=k1`J#cUVf@EcNT>?wqIF zN;=TvUqOybeYjC`?gd9>ovg1%-#bmeVK+2veL}alc_%VH2+d>edjLLi}vnrkq?wt zMq8c&M}xK>sP7w3j@!J1M(49@1>=CL;T=)ATN_~W5}eAkjeP^xF)h*9~Ev{v8FLvJXUEb8W3)2#E(JjW0LRfe~dZ1|K(s` zY!3TkZ3j4va(?xi z{;kW39S{7C*1Q<{V14ZHCHmTyetCG~#HJ@U=Em4#(biKlGSCUSOPW5g4sE_MBcs0L z{n{7zTCa~aZoEEbtJxC`(x#bC;!PLa-O~JL9nZ{~s+f-$?akI3uo(t=rV``20lTXB zDtPcW46hj%lXXuQaS`iQkBh=9$lBZap4U8yevq`XW)nK?V=ej^yz(J-@ZUOXsM~_r zs^|4`X5V#1%MR)+@@a-AtKJ6>o`6$P6XER={2)y6RVH?{yiO_4|ZJwQ&|c+z-5))^P5J@g#C@6aGUoo{v-iN}3`MR^C!x{n z?C-sS{Z(is`tidXZ-~uM!Y%pOe>P(`68u7=m*H!nfzafY-|P5<9#7Ff<@BG>btZI~ zfO<{)s1nw-Q8ke18)t1UW}_UXnt(< zZ84EwLM!HG-A7EueO%78Q)j^|_*C!(M~CsNv1#{#DU8o!jNM-#2NUyZYukbmA)6d&py_4=aZMW{T-WsVRY&7k?PX(*-(wMt1@rSNX2iAdC&F423Oe~?yOg? z{Y0~iHaZ?~>SvyFnqTCdq;0g|qqu*ByOna3z+$(^5H(}?FeR_RtpqN1=W@@;9nA9q z=H=Ts8}Su>w=<8eJghWvfAWfQhtBJ=x45v@GN^H#I;g=C#}gXa)Jde8A z{TjASKd{HT*zK`bxF=9%0cEy1@*+~U62R7@Dn&N-+Z56VNHaQ~Cg{}D$oGkZl*~N+ zOoMhtY~Kj%XpFf=x01OJ-n2dOeODgm+y6RiT;wa%OWJhe=HXxMK_;|PHz_+0ylP6` zGEcBFUHO}Tbi;R)k6y}BGBvv?{cWS4kE4gOADuO`;GnD9!TbxZ@`85PDBc3> zFB9_sKi=w7*6+Enf%>uIXD;`>;JOB#^%ty@x2fsn1Ci0&s>ejPfg}C&+TU!gMs{d+ z{k(2D=O(7o{+>CYd>E)_Moh6@L|5ji(eUp4?%F|N5kNV7_ zUis9?BD%fif5BbY=q}C3j&^j7AhfPytUUW@ps5`HRV8DT`y})Go9M!$rv$3f?dg$$ z_JNUSsQVjffuajbM!K)`Uf{l^EKqdFcCq`{woBZ_{!86|*`~eZ zlzOoZ98b@W+Od@*<67+d7e$Y=PPDJ*$@)<8;mgzAh8#SXKT7X3%b`<~Elc0L%!({Z zVQ%WTG`6Te`+5V|*RwU*Q&{s2N9S>|wm>e-x>FtGZ}UfH!T-+n?7_5+h{(7M(+^YA zrWK{Y3nSqX#XG_srX7Ldfu}uQk2_2oD%CrSD&W`kHrfpR0z-t}3GZZV4OgBH!v|B- zrY7TpW`V(RT+pdfU6+h2Q*b4`6I_D@S1q{8l5xQ|0s2F$7kpQ#29j}Ue30-iKIX&V zp9|@4CwSyz6eBr|t~g_x7D-_myH3EM{-L;m$knd*se_ z_x<$Fwf8-GXYGA|XuUA8%~eodnSMHr|?n#PvN5-FI)P7ZyorO z`?A3TzW#B1Q_q2q`hN-^?GQS?WKkk}cGrKF_?VZ01Jz^g= zll`1KT7;d%>5;WMdWqHI_baM)_f+7;VZ%C{%G09bc;x>8{lDe#uwm0OuPT~8q_(IM z`5!L1$lYnR6jdVU!`_SB9RsX3deZkjaKUEv?=?ii>%eeKLE zisoH=XVHX7m$|R!eX;*C_gucc1D6PMn>5P(ecw3u5}(%{oalAm z#QZRAy?bx3bA&roQtH0RTk7r{7ORcz^!hnfr(D9be*e`@BB)PTv^!u8CvZ zTkIp;FYx=5Z0xXacL+uKPS zk4`FdzvM4;cNLCu&)7d~Z|~$$?m25qijMjV-1{eyu59?;GT%t|w233#;|nivUoiOs z_eAe_aE=Ej`oZLJ?v;$+MMoyXPlDIIx2$lSd*noq+XH=XNB_8PzkBaZ=oiz<+g1Z5k#Qy9@kN+y^FK>b}B% zxjPe`rPwjTT~Xq3zg{vKUYqQ`ck(6h+n3yXN+!Us6WlMAl)$qk?x!Y=cb_5c9{+gv z_{o>KFDtyveMA0l=UhK|tb2apSoaZl^f3JTzQ5RgdQ!1_a^ZOHQ6xQizBGBf`^iZj z_X6_H1rH9WPdE5I?ySip-PXd9?(4{N-D$PxTJkNJt`x0cZn|;0wMgnE^F@XKV)*}J z_s?nbPTJd#aWs7*^D^TqP>j5TCf_8_Eu;@my2LHCxhk!nMw{tsN>MAcTkpRFoy_B& zHbr^bBY4MY`eOYo)xsQZ?|!7ScmBKA%wUea3Lly)SqDsK?!AIJc-qoalcz3aPS$)B z_MgYcXZ^A8-1m-r+BUU)j&7S$v5kM$9=X@1udPF@TV-#&3VUb)c9!+=z3z>3*dNCh zZ0wIa*=wrQY^K@Gcgi<^poMd-J^9!a%Hud>e_i%JZ{xe<3;M%antiOfWq(<|E#+J7 z2xDKg@65m0HWK{+Zi=_zv;51=_T3H8!Ut~IcWl5HPT~M)Hbc(Ogiq@Jqy~Ja!01T^ zyb9PR_Fb{9qqpy8uKl+0PVDP(JLEFShkd=l!Px`Za}oOzJ~m?46~E}!b9H-XCI4?C zt#0$y?aGUQJ8ZED9?iz8pNUy0W!yS^p4hazepBZXyK|13*(=Qrv*75rj%ZoN{8$~su~ zfQjwX(iQhjt;Vh*c?+>+Rgw1uc?+?RiT}oCY(L%UoJ*{q-V@3s9v}P9zPN3y6FpMw zJO&;=`MX~5L~NuLAInA1#VPhN^wKKmggq@&^q9i6&Y^<)aco1pyLJ)&GS$>6(bw_{ ze92``TemwW`@R|H_CGJ4lEEAJgf$mXt_44Rg=3wj32H%V|HBmeE{=Zrzo|v-Yr>?;205slb$qhaA%>DE|u@c}j z+1t8Yj#5{#i&puS7V%#TQ6D?-tbxQixZRyqK0vv) zA}wW(m0v-Ma?OZgJLeQU^vE3efOCxYkofO-i8U$T^U+uCx@G7?Hx2vgoQkmx%L2nH zm#G0|nex!iIZC+UnhHPiPr1k~=jf$uvD4q7jjbWg7YI#V$OQZ!Rw7r#PqUr6Xg0q) z-1F{$&O(2o&k&&va!08d8Djq zmWI-vcZuJTj03UhtwcWUu;gg_08*zuzPplj&vaz-70Bjk_&H9+kGC(5&^~lG88gu8 zu#D3a)_(rTs;X#&@fuoH6$`zh(La;2>YTsoFixxemPR1o&WaMOd{q% zU%l2dP8zX|3+*Ced)&An+RNUVpZ~&#dp738o;r{lmGYg)&Bg;aM4JvQh+f9IxTh$0 z59LO!U(xo2Z8fXe|JbeDr3cG?>9Fb!c=I6R(~DhNVT@KVuLn6VZc_(2?f51X;1~KZ z^?d}qjqHtx{{?%g#T|@;Jm|9r`mtAbT4n7oy!#Yo17}K|cQDSMMWz~c-m~#5vB%gC z6P}j;5-Y~|7CmrXw4HUP^ubfqcQ5S}x(hFgoDl!~Le?shSKc+oZQVX+pRK!+wtSwQ zTkOlH*@K9_tZe_kJ6^uIpl`fP0GBad#9r~yax3F9h4I;saoV5pitq6nThqt*cD_!0 z!iDkiVO!g8=&a8eBkl0tJJx=Tixh2qe1)-bY>?6;<6|=8V_4ctuAtT6@z-1yc>K0E zwS7{F_0wDnFGQe)$mQeKLH=&`9sKMC`H6QV^0$=p)*>S@1`92-=J6DHA?fnfL7`T7 zGME5hs6rNGYqsc~iy=(Q@SU0*=5M8iV@WH#K)?uN|JVoz&$2!DMK#7(k>xK;NV!uT8 z?X*2Rjc@ZbzO7=e6uv!9nF{-N0eE)?ygPzed~XaWYkHkHbN|Hd`7C2iYn$*bGNKVa z%~yx&=W6jaMIL5OwB|V9L;f))LZZ9i8{IMyJi^mbuX5~WLKEq0DNkhRap+RI-`gGG zOqIcxAFr7~pI=4aUkMLPhZn9uMo()p^k!Q|>q0woFS=8?=vN*142Z1lwOWahX(z7( zesSWjZmE9{8EKqH6rD}vU*kKY4#IyHRNo+dDq6 z#I3UMQ~4>ocEA@Q`at+X&J@TV#&P`Wn3w$BR;7L!dxS@kGv$o!rTAb!e&GwQqu6%t zIucl|BJ)l{r=nNJL{H&wdz!tlTd@xpA=8Q(?;Mfi^p6M+kfwe8bi?cg!nQ(Kn${ z+UoqvWH07zXtG014^@Io_(Aq=cA!(8gvP||bSzPn2}Q5?*QHYr^r=nkKY8N1Qh|HuL$p0hXz>_);Ghl6E1A~R zlsVrZ%?R|Zi}?Lv*rRi<8usvR6MUFWpAc*(DvkuCC1)Dr+3^^?H1k z#JA&&Ir7a`w%G0CR~Pp^#&-(8C4AY@&+81|6#k3eCiKR4ZFdA8uMmFz=$m6B;I562 zOU|ku{vPMcw~h$3%wdcyU+WmU0)PLEXNw~;=GE0p_7=QS@b!XL_P}gD_G7$m6+6H_ zXiJj=>!pkC)rEQ6J z`r{*iuk8=Y`niJjk_(?*U#?T-~1;1S()H-UkQx=vhGK{Avp%N$a6DZZvx)ep_T5BEw%-H zZ}jR}pCs{gV*a!BVg9d-+d;~tKIm-*JVjt=X}}W&Mz1vBaRL)hz<`T^&GrtXE}yUa zi*3FyhPBK~UH@auORiX{N2iO2*p_mBU@H4Gi_p)-79hHEBXq>J-0UD;&LaBo%uDxc z>mSicgx4g^;(sWG_xU7!`M0Cb`Xt%# zHL|U}^WKT7tsR}bz7^ls-RSZn+u!_C%B64p+j8ltchpNict^SP!+$H6e)K2h((&v? z9A};2u-YQ!%o8Dd>%uLA${mkoIvo-21z6%NceLB}|FZ{_JG%Sn|7ll?KYj-EC_1l< zq1QdeIY51V{?cEG`$3$F!DwQU+2Zatc`LtKOXL5(BjnVb+{qASn42gHP9`Zkyne5McwqJl*4>A zw~4+ftO-U%Mm>hCe)iR!(E{cS+bVxl(ra_wet&m2bdmm*JVqVL1vlfURgZ_M*)5DU ztndN(duAaAwKBoo_Ucp75PW?Souj(STha*rGtBv#yb@h3UWViqJBZje9Ozrbr_k&h zUDi!5JM&Zig>n`%Jl9sd$tCd$?5z83#3>3+RXE=ho;wa*)~KVb??t9hkh;2c-`?6Q z(Ra`fb|K4Uo)=nFQ7=FLyWz{%;juU1v46s2qpG?}*mDk5Q~xF86L|U5K+BuF3n2$( z|IEWv@GN6YzW^;?fcNehG{>@a*FH5fB(yhljxc?<^vXcXtH?jS?*}!%L7&T7U>5x& z`4j7pET8Mp+eq6um#q#g7vGc!J}M_UQ!9GbF824{>b+;~DeJ)U4DOd0=xAM7Kj<3A z@{ECwF_wY;70zoM_t^CR*ABSG@yitbf9Cbeqo>iu%8>tyILm$d$;~eG$!o<92M=-W zSZX&mrTL4Y%hXks5?d=%-Y?=@t1m7uPM`KpXPKI7f!vJ=AqSet8$~a2aRH&SzgX z<^#=N6F<#7e8O^ByA3~qUDc_KTgjSyC$_|gHTzUf^AG+d^G!~30rh^J|FmUnD?ZC| zma{;MWth|acizhytpfd>IG!y%*iF3yr^ck7!O@&W)$GGMj>Ccj+nj;(1%WSBv@@bY zC-GO4dj~owV?0k88?~gbB~8PI{a>oc3Qr-HY)jSU;6<+vj>pc)+CbK^20ykQ2dCI* zu)WE*d}NEPEkq9qjwh{l9#{7X-b30T?Nw^V#pG#Yzn}}-o7nno1H>OwKNIDZvleOL zmgD#*_zE_(I5v#Y>|WygIg+(xSGp}?sV~#!8Qt#xX*+L)lK+y}5R5ZO?=P6jI$%Rr8EZJ{uUz^In)c*S-V@Y2%$dvE>96(FdxO?roLh&UqH9Ti-66D%_g4Y5>_i`x zZ!35&{pE@GSDV5oMH&xo}n{=|v8_aM&udExO9HmNJ;`&d`M_fKh)?vFn;p-nlItJ$k%?a261 zDZ7BV!%lo4IV;>n%$vISIG1mN+W#iXs~nH+L_EzPGQf*YF8o*?=ST4gXTCXHpbXZ| zY>lN8$xWja<1;3xD8kQ0b7EBriPT(DIM1E6zGxFNm;LI`f6S?eRo*S zsRXR0FNuw+7h4#T6#n3>1NAt5SlPY`{;Jum_N?BfLWkBV70-sJtkT+%*ZctO_yP7E zX_Icp9o*c=J2^A)FmsT^yDFnC9q2SNU%$*Zbfsd(jutC|J(LzN<;(moI12c0=@*_m z6I_lZNhpV$?GPjm;b;2VwZ01vfM->UDRn_R!%%U*tu1zjymt9!g&=pw@; z{Y8{do5z#?Y@PWwSibquvBg$Pzq58_kBG6a@cf{xW#xzrpV(EdLr(3%mt68n9eJnK zPhZD^s@DpJS&ANOjsA4%EW%z@k?a_C&~b-ZC+R`2J$xs0tD()KX4 zM;6SmD`SOE*rV+kEOQp|V$Z+_tEh7fURcc7ka~7N$KbZIo-X>N>IY>#O+3Z^C44M= zG!>k}!$H2uJNa+J*C;qbZ4#Ln5I=IphXo%rD|>x!&`9YjFr7;oAd{B#7cPns6`FE z$v9ch*&Jzy=)b;I`IluMsfvj_ou3iDSLl(r4=!aKMehrNk2!g+*n(v&%h>CLXR?*- z2=lLY_FvW{Z&No(^A^wZ?<)<^WQV{N$3ZWuP+d*z0{`!V0Z8d%4{+F!t1k(9Xc$ z%^bH%Xh+&z)GeQwR>-9J0{=wns_7XzjrM|9A2+$pJNa+WD6wrCUixx2c2>dhLvVZ` z3`}Nq>lKTwMcmn z!@nMAD)fGa^ML`zjMSevPAzrNLe8=?u8_Gpt@l#CjCTW$0!v?te#~aV*csL#&g1B} zK4SMCr>|xI1Ufv?@pkWg>Az~mW8s^3zF1xrLKkdFniq+q~hTyXJ0}erDYuX>Q`X=m_#&<`>ypDV05D z;eE>4N7|#%sERsy_j}vXFM3`BE*)hl7Jg+fa%|@Zz2j4*?a)0C`RTY~UI$H4Htnmi$oSufLdvh&A$H|QqvPm8xiKd+^qjd3S3^m_WDiE>5n zwjuKb-jf}BO50;n26vZdEAvB)$Evjv$7t5!LH1i}xr^dW+8$!hM0hfl_g5cT5_`## z*3N$QwZwSoK8cNC3+wnQ*356Q?JoQo|hc8voy7 zZ}E;J%VMS0-0q@uV$B~3#%9zki8Wbr+N)H18>WplnPd=az&J0p|yjEAc z+)>3Ex?9$V$C=Mh;Il&Ph<1-U;wLIU4}RTsRtIrjM*Kw18`+eSpKxDSr0Sx(?j^ni zaWY-qxqo=z0b?%UF17nx9m=>;tE>A>*|Vg-Mp|v{#}4T8g6Jr7Nh3DMe8uuam_5>0 zEU~9L`2LO8p*6D0RerPO)C{<^bu<{q8iD>KtgOqWA4r~61c1k=`?&az}gPlR>KZ?D0 z;ax2a^_O(ghW8i)lE$Fr+wh(ZUSxbZ z_qiI~XEwUer{i!Ro7UGSGKax~B9osAZpMF#c|OJ-w9FB#MHshgv$mFFJ{w5grT_j; zePzx{OQ^$tko!g*R&7RR(4Q*(8I*eU&+x6%)`fY^my)ip{JiE-$b`;EWKPX%uH~Bt z8Bl>wUe`!nrkAk~CEsKY9?y57l|d)DOV4wrcf#%T(>QFQ_e0|v`dVW09<}6lw>@+J z13Bst)|aBMk$k5nm`-Dukq_B%M%KHmv6N^ zA#tEzQJ@t#B)+8JaKf)5uO)^fI`0!6_QJbv)Me9qq>(#l^g84<*MPGDnKc;QJ4QV{ z#2Ma1n-a_2NISkuI?3xvVT@3x2ahpE=mQxaTEFn_KHe!Qu_xvGUHorAF5QlNj3E!- zJJY*I;y%aFLs#&uLY7oBH_l>S^bu2?F|5stHrCt1XVQ-6wEouTxhc%k`N%aUulaf4 zV6Q4y@P3`A=n*pCeUtx&&M#-A7LZ5i#T}Bly$8gvqaSa9xRCz;xot>;AMusmJ~B)eqp= zAEM{E(DS~^JDs06n*?tmKQz009lG5n+V3fFJt*HBJ`{SzCWs#uy4zT_ioYgfXndfL2Z z(TN{I@4ZChgItZ5H&VBkpwokt7p879Z{CbQicJ}!)gySoi;NxA?Lbb-+$sFOl03(# zyMgyo+R*WSFLVF|jWZZa>tDEU>X|Guis-s<^3(1_Es0*PdMdX|4L+jCpK17cF zg8J2o&W!FkN^}L<+0!ZVPHC=7&^@trAKuJ(FK5r8Rvn`0p5W2;LJi%MG;`TY33(Vl zn?ybU*Fh7(`35+{-_h4?os{dNod%sp$r|HSFLx;tgMqaA``l(XbA#L~Bf8QKc#(Sv z#1E&t`mNsis~E?I?)bXs_Xj-PxxWb$k3s0f9LPIKZzC3}v^oF41a0mx${ZnerCi}1 z(V--*W}AgK>4&V9#P<_jDJ*#@Q+!{f9`mV>c@3$p!&q}H1&^e;5FU_NPlgRm)??!W zw)zoci7_U3dD3Tg_}F5%Kd6r_V%ow#`Jy9gh2mUNr&+1Bloxy@Jc-zZC=o-(GMV@ydN8~rZjjG!FRnT>UwtRrP?Ri7PO zYN&#DiDOIVWU;ONE1}&fBPxNTMxy|S)QY=ItmiY%}*j(v_gPqHco6@;kh19(}P+bV0qft z;}^&OQe;B}d28FGk9+pA^mNene7Hr|wXrX9+^YJO!S;xT8~7}4{wLyQM@df;$1CyQ z&KI*llUwj;HRZ@!NBHBj&b=EkeR{0@nM?aMe-QUomUWfP@v;W~H*1w9ba>Y5J$unF z$0IL94(vomblxOmHm7+N{e~>V4j}qkcC*Ogzca^*9Jc-Hhpv2^QXIqgPv8i?D0Rq^ zQ}Cw1A?jJjSPIeyn|Lqty|iEWM&>~Wec&x{JgDnwO0)Q}NSZusmxF4D4(&>R(IvW7 z?*6c=S8Q~|jN*RW-5u0fx1F=k&l)L=EgoK7v6HcDgO>P7X#Rk{$|3VO5AAnWG!iRd ziTkA376)Q$5kF1Fteo>a1+G)X-{|BHg2gIluQ}r+{$&N;3U@)^oBS5L#}Lz@SG5$M z+P}rs`?0#>)Dv4>r||jvW%cM1{N?KNt?Av^mFMrVq!Zgh{NWtkoy=wTvT}Dw?>SoNlL+Ibc zdG|PcPz8Xw(n|f6w2<7jyOZF3cH-*^G_ zD7Fww0Go~Y!3gc79{(3BtQ}%aSL730O_QR%z7|3-Wx= zoqLl_SS-);{IQ>%J9qBPIcLtCIdkUBnMuHr2OQ4=2mYzVBGDU;7qPaj)*4coPsJug zzPVTTzvk@!FgA}`{?TG9vgdHwdpVOhqe}P5XnceH@TL^C|M4K{5_3LRy4ekXL*MPA zjlKiYlO*XkEN2m^|EEeJmy@>?BxcQzCiPg)G>n_Ne&Eil~8v&YGrnb>}YvnFB~#=4y5f!po5 ze+F}h)IFQJWe(lXTI@mQQ-xQy>8De_pLh8pYqA?TvuDbcb;t+NK~oQ_wP)DE_n=u$ zbo~sz?bkS(_nWX4sQP4&VnCy;)6PH#M|XKn_D{sFA^-bX6PR!ze?$jb#{4U=6(|~2 zhAg{V4$s`_I3}O5tL9v3udi8ePpOysHu1gGFLLrybhjT-wjJ4WIsYNn?El%N)z`xx zLcelz->`qecwdZshzPFjxS@qThw)} zJN{_E)UQN0y&Kp$)Aw8UuJ%3vje#j$^uYVU*(1D0`d6goE`~h#yOT#U8b203&sX#2 zm*6RD0COHhmr(hA8$aV-4SPK~si!uwmAUgjJBeWq&T^hZ>c3s;$Ho?b-ktULGj->y zfv@JjCtj4bj|Pn9**?CxnQypj>y7>2{dVo~Wm8$Bcb4%gPtI^gY(d-=1a^l=CNwl0OD&e@oZcBIDBHWLD#z%I^Fvfamwl# ze-B~jtJ_((LF{w=uuBThi0&{D*f;gm#tviY!J`jh=c(a;xs$a$*Mbpzhs%>GGg&J~CWr|9AT3G4>H3$Dfk<@7@N^t&M?qPtZ5gC!ED7XdS1Cj*bn* zf!$ip&14rOab{+|-lH;vJsLd424MR3e|nY{`34>E#0C8Blo2n^8v<}ZG)0A z6_NYlkemClo5=cf6Ebo?W#0I!tl6_0+vxK{5C3ArH}vB} z&YZ*7qHBuXwsj+ZP*2uy_W*MbymkzDk3wtC#-z1gu0@t&d;6OIPZsL+kL}XmvEe#E zn+Iuo;t6CKWyCg!y{&RHbNxUq>+pZi@<)U>6mD6KH-f`{)<6fS=iou?Bl(W{zxVCL zQ~V|pz5{=30Y64=-U1IvS-U;anPn_3B>%Gu*t5BlSTX|w4P)3dcnP1H*2>Pk`UCLP zC(!;=#uN6!2b+?)D*@S9m&BTme-4xNd)d*W68Td00=)3(eVk!jbuw;Z2N&GrES-(p zd#u+G9`&~bwMaSp7L1W?0^{F)fFCt}8sd**=lw(cHwW*@XzJX8)4tk zXW$R9%^Y7=%J`ejIGn|Jyohl*6IVDnZCJ?ed{V4bU%?E7TCkvT+f@Y3I5?pl2hnE!F^Z;4@`6F83TZ|Ku__k1&GSL5<)*!EofTsLOwJOqr0jTC zWW6IU<___*l>I+hD=nd41eRW`IZt&Kt}Q=Ee*}mrvBx|=VoV%v(oExApv<+gXCL~q z-yB}huReT*_=NRsy!;8qQM%JShZnn#EaO|g-T%-Wv#!=Y>dtTML+vFi@z2iGBF5wV zr)s8u46)&VA1Tax*TvXTmS&{8F4iJ7V(TeG9_-{S zC+h&&Q?BW&jj1EwET?CVTEsU~DQnaQB8HxxUQ(+^LJLyr%P+$>becc1`ZvUv1kW+= z6Gu8t8)Mda7w0WC?FADa(q7;xe?J%zScU-0fpfKb(Puwl-6Cz`$1p~G6vWq}6*(QE zZqc#C&*_RX@awIO5uK9vBLlpbIQZh*P?27QoOe|sQ@H=i87cos0RKj9ThmUhenF3d zSu!pJw!a>se}1C3%Qw(ww7f6p+hAg68Ekr`FMo;5p&V4+pFJHsne6Aess7$Z8-GT2V{R7N5KkTX(xE|IzVR{C*UtXy-2pqdDxWl&xBYHqf zTX4eHfuF#BkH9`wZx11}jfv<$oKX)?;FVpM;2}V}Y-&aDbJLqTWlQS*; z*d%sA%B#K~FiLntcsL9V);QJKk#Nwlv|^gxUN;3>&~F@(x=Z*kbwsMOb#?A&lzzPW zZbu}1MWB7n&f=r4fOd4vaQq63Lb(ug%lGlWNsBV(I{4oxgQq7#7wR_oo;6VH*p+c@KYzIA zJM=vreNSgzaWKC)8KVh|(L}~5cR8)n*>4m75T)lW)o8;XTDa?KTv$OqghEPICduSV*iJF)Ew_h`o0HKp_$c)2$FedzefB7^IM zA7%#%q3Jl*p6O!WuKP_ek^}G7?PQFyFMT_0pp%wn5Px6hfh0XEdA^=gNnK^*fN2nG zAd%g&&t5})2N};|la@8%vsbCussnG$S*)WYVq1!MS7hhBfKDg%3mkPj9pEycvS8$c z*>j1}Qs8t|wx7E;d+mgvd5%ZM+24Y!hZ)y0zGb}09C_>z$hP|nzsQ(`hNByjc4v>F59K>4Cvvoi|G?GXJt%d{+U^&W%d1xKy({oR zSNw`2Vz)cK>|~$U*!UTzniGWAgzvA|qT<_nSkM0UyU;%20h7I&G8wiHie$ zBV`1SHVcniz~gVX>5-=2_}j4yY-_$H5P1TacQ0bjGxetobDoekV)0D`Uy-l7t-8E_ zHF7Gh4q|sSlEYU!A~!<|(d$k%-cJN@WgAs6TNIYndOi z9tx?x5npeyvmIq^B(dvdEh6)BU+|T&TT34tc}DrQ$=tD{2XO(pqhtd4t#(Wec!)7z z#tV==4t%yM>o`kvjCFj9+>P?F-hLvTc)#G(2c2JdzW0;FkWKJ!b)*Eg9_W*>l~{6H zjfME^e$2ea8sXp)z5bIqI#;yT?3FPgywb$?vi^;2>nrMNov-FRFL3O4Fz4~D@Y&{4 z>;mk)eare!$_NihTI4}Fd@AdQ6Z5smU5n3{M&E@8Ufa1*z3Yy#5}WBZoMex8C%IQ*5s|M2V0Byhpw$Z?CC23CY~cF`s#(^ zPt=m{kKDei>)iXCz#?$4-j=yHo4HqPptmq*?|hVTfgQet_WcV}>OcO7XY3dyKhrsn z!a8G)Ga~%C>JQ{&W0Z2=o(2BG56mkE^A%4BZ8Cm|E|iL{#CrA^_KPrb|J$?t?Iv90 z?fiXLxYhxee--mGF=dQrnUiM0L)(}~U*X3bgI&s;vo$SgYnb{CzZR(&7By+M#rk(` zax~OgX(Lx_pMRd-KL1X=y<`>hOu1g4REe*9&&gXI=Qf?6wIDuX^++3Zat(oA&|!c_Z~vCHc6Ny)k}<;(!GDppn)3aS zy)NM$Q+89w93#~YCxyZ~}$ij<|i8GOn7a}8Pu(q8}{0_CY6&MOwQ;Ll7@*lfa zkvYPZ0$#H2w&dP)=2h`~_Yeh3*Yvh?hl(*M$z%q!cthY!7yGcS?`#uC!DzU?1B(d@grH;3LReQIc0 zyWwHaSKGAMFvL!&*0Eb0YMlTcW_jaLy#YFy>8W;JKgKVzq*b@d_!-O88CsG(Pdi&X zPCuw`L!7~8{Ve+mHXKt(zZ~HiTDGr2!L4U{#|1+J}BYsWSCAy*PRzrwX=gDZ=B zJYBD6C-X0~K;A^`^@-3Z-nfZflNbreNf)|-tWnW-z4#EXyChJ^{jTFC;fLU1A8``- z;)e$=5$6g=PR;B7_D?L`UgYP*zbYNiwZbvShfmEGhriI!vr6gn!Yw_lbPv)=Ryv7v zZ!6tfD|~@-&OX`*V3!qL5qZ9NKeXwnhdZF;z4*t;`?b(&DzG%L*FFu{?e%pS*rzX0 zG+M;^TJBdipp)TxeFMA}FnG?2b+jw*DjbYO>Jog+GgOp0%s4&3_thTFw7a?JQ(s=d2hB`AYlW6;FI8}{ z#_WP;5Iha|)iojz$_XKD59b zpAL9>^Kk6a#BW^xsc(dgVc8p!{Eg&qd2;A1$qOUr<$wRh+4G32aJ-tc+;Vn7USM0=ZPC-9`2FQmRZsc#eQJpW^*bs8m_S4Ro4}CW(e26ni{x#Ch7A5;yt#(5H z$eOob+8Mp2w3T+gp`HJ8chaqUJLMO3wll|SNBUptzli77$JKkg{!NFh`YSr?e=nx~ z?)2LHxPnjWJCFK=UUq+s6Zjuj^t9;|s?0L!^s+^xuVU)1fkrjZs0JE^>8m>Uum)Of zo-x$yXK7;)b=H_|sJ?LXY|KzF)Ip;Xu~CfDBBNtyA6qZ)JL+w@ytCevZuJ^Gw{BLn zk$NAX&WGIWFXfP+00GDZ3y%+}c&9Bt zfqjEh`+px`EmD4_w#|-fDK=y|OJmF`inQdgkHnf(*7U%Aq|Q;dp_RO*^kB64vZAQw z;XDfQxn!-m`(HDV@$6OIGuYjn?uh1PdfYj$;4_@zh-z6LcT=__+UyQSo31E|dbrCd z_M0ZRDx;_Vz`VaeXWv5ZI%yi@i0%m%MRqSL!Vbj#CGG5?ov8v-&>3kyvnbkhiK_2; zU3=E9Q)F?|na=3$%a|8_wxu)=KOi|fqdzw#nn!#osk{8%DNzqF-oJ}|0^)Nw6*!~K z!>MmUSNP1jhM!(tx7&4%az>lR7Dbz{Ry4BVsspa(vCgQ-N~3IhsROt?oJ&fB!^}x}E-yZB9(OCgn0xL`svo4!-QmCoE}y$G z26JynkXYM;^i1;d-GjJS+Q1jRg}L}|@FRPyvj?7`RWaX`P4%fcWUZ#94y_1}pT<2b zetqEkyXmu%6#O8NMVv@xt2JE7kEe%cDQ#-V5e8(`R1nFGAzyGlM3N*6q4) z!_GzF9lIXqnL9N6;2!eQ=a0j8#3Gkxk363Vk7lTEdeK&MHfic^9u$m*p{SR({lMw#NBj*r{Qn1=gV4S&>5zG^ zxyQZPF?WY419tt=r0*k=A46Z}oi6m<O#Ge)BH&8tzYD!ki*{p&73g zUq+$j*Vr^YJUm!?#Gu!1z8wZTZF5*=JT_{rD!OVt1E*#D}*nJw8txbKz;$ z47=E`*5(#PGoUT8B22rtF;Bfa$l6((R}>XnxlyL_iX^YBD4HaBA(h9SLff=ZQB-UM z#+541DS21IU+h)xcWTGWf96XSo{+oXJnISM}mm)WTL+GmDA@4^j&wPJzOu9TKeU+W|x35L_ozzdo?1ZNqIoY&l0o*D^LOq%3!dnRvJ=iXzNGkyT<7A-$$t=}U{sm2M() zd_Z5bVT;hCznpV)Hcs8C`cUX2?c4O}s2`Z^`i(%ZdU&mU4c}ML&T44~{bFi@s=pvX z={P61lhAmM)s9_%TmDPeeS3|LJ;;Gw$ccT3z2ar;M-}PyFZ}sDlgC6>n!2>9Q=?lm z&d$AD>1Ve7{M=BbCvIEiyHWVk))${7|9M-_ZC84tq1{s&esIfT(W%FQ!*9`dFYeM- zSN;9mxe6b^AO=X`|*Fs||E%sbA{8`FrYq{^G86S9hy>SxnuniCOcwbNskb z+*$Yi-&6PKIjTQwIKx)m|6ZiVu8q$E^0!$u+Vf@Byas7Qt1GR0UeQQ!xFn{XCUoj1 z`l1P)x{1EH*jjhkYk-;5*Ho(2_q)nor3gVPpvBqt3KgR?Nfz+$qiddcU!O)#?%Q;vf>}y- zsJegIt?r*&bxWO6*Cwm3R+n10JwzL_b~Dnj$ERvyb4iu@WWPbyh{l!L(y+Cz>mGOJ z+iL>c2lJZgvt!F#jX5dTVb85VMO|IUPjKYiLS-I$a>a$ zW5TR6!WnwI9+?u6d}7_N-^3cF$@E+3v{@V26vN*oupi8Sx?z?j2IG3Q_EYOh(a&So zm9gtcvBM1GJY?wji80;Rj1oKYrUjn*@{FD5hq8B`&$+&>A@|PnYm#ctx7V6W_|{JE ziAn!GCarT;%`TG`lSYT=$e$dOCg@p5{=%4aEoqs1o0yNg+qEZ+z^;hDmu+hmy=&?o z<@3;eEfFd;qF-Ux6FXgKfe~F#TF$qHRvOXKq|cW0?M76OSyO4OslcyHXHBKE?vpju ztxeozO047ZpBT}b*wc4g^KgNDe~A%&7hO9`(wFg`wCH!CD~xDA(&EDwy4r|tLmv|V zg3ux(3f`l|hb?qH@X^v|9Ude|ZB?V;`z=UMI=*8aC~xA=uclcT+jVeaNEpIc)+ z+K>M54^4>Hr2C_Jl#}&&Ep_Daovg9syG<_E!{dk3hw7W2d{fK4bPJ}HM1!p3Td+A} zLtW3=u&AFky#EG=3Ge&j)5jiECH}&Sm-{z9Vew-;zin9;93EN(ErZ+>6}Zm!o44hJ zCqdC|^L<_E7OtgrD#2)AAXTjI4PP+{gzJ99C&~PJamoJYhx|lS&L#6f90=GfG z2ycGyGBUO?Au8$bey^=BPcJd;M%PIGr{tUXsr|9G{9Rq<6i=ptDbS5(E%zuInlNQr zc#bflL%YpC9sQoG>e0L5wmFvexmG=+jp%#b_@}$fHR&~2)meUj*Z$P4XA`!;7QKF8 zMDr*gVyrnVzVZJmD_6$cT_Wchb2{VR!#!-FQP@#pXkyE#4qVPw?QVXsYr6sK*=+Z0 z3zuRex}zH|v2$`?c-df1R&#CN#%Gy>L)Kg?{t+_X|4g2Or*rPLVQFP8=9*CwnTq^& z$z0C3(7;b$U4s3@#rc2)?t(WO-=~gr>U)SYt;wwWT;Ny7-pC=!h%M5=JnfmgXoq|! zW6VFdV8=8)0sl9nk{CQ@yxvKALS-%Ua_o4B#buJARh6@kCVkTnxuIuL*Q^rLK8pTO zCi2&wi&wM8FL#$jLzl$7cXz&jPu>sW{be!l2X(%e*fQm3^8SjL_h)v#cQW3}3wXaE z=6ylu``+??IPb5HdC!=#;mefwqjkzCRVucsv&W-r9|S zt!I;eJr@6luzfRjMc(TpT=g_ZfZY_6!$$T9G*V^IC!ImDRnYLx-Po5hn7i(W0gG{R}pe%E@*r4+=vHi+C#dt2p z9(so{n7cZMxD!)7?ng57-3yzz_Y+%i0{Qv;i`>jxk(IleZ?61(LWhnplrceEgL;AC z5MyXCcF@&)V{kVpd$Oi&R^xjo`m-}D-yK3v+YfB2UE0YU>|Wp<as{xyg zuh7o;a<_{e551B#foaF{{W!~9$8^^x7l}Hf)_daa zYRsqNOJL@ERK8R4Jta}Uoj+LR7ZJ}@8(b2dVCQ>P{wmJOYTlCQXgmLGtA1i)X=j&2 z#W&Tge}q-P%`9W zb+l9V+P2EWLwBH`>dfDrcbtfSj_e&d=W>PvehGQJ?k4usD&P-|eV_vFOBFubG%_>S zgMD83Acwj=q7$O)>DcQ%CeMy?2f5o-ehzp?>I#-{hdaCzfR}^50+YYX(QCc%m96vo zugS`leW(lJvk>pp*e}997G#|mKp#~1gS6%Uj(fXLK5HR&Tz$n{A@>~F=O*RO6@ghR z>V)|pB)@54R;~v8M|Xe+`mN-(1ke$^j6L*1C-ew<^W6);HIKV#^SEbM-5Wp1 z-2#kxE}uIA+T^i6W5z7tyJqsG9=$v(cL?7MaSh?l*L?1@ALM?FcZtyMQOYN#j$jNA z;Wx;=ntYvaWn5{LHSdC_Tqhm6#tv`Gf7R4+V&^W~zslBknipGo6!l2G0#jZ~X0Ggm zNZQ{zAUDrTpF#6itT8WpUn0At5B%K6W76X?Xv8-)#FDB-_ZV#H9s%;@{UGb#$-moN zZ%TZfzKuJG1=L-B%lba$Sf@Q(Y|vW3sK+MXMc0;cpB+CjK;CagmvCKJg1?|PCd7K( zv_nrWiMrUYGxrf$H~j+{<3e_t&tCR2EN30x$i?T^bo~#3hgNvkhVWW@d$CCh`i7sKVP8&GU(LV4g zewz{_0}Xyh9qq3Ded=X=$bNvps?EyEt)ahMjQ0!=ev?lnL?qucD{G!s>^N?gxhN~Q zmNGtxnSfo}$9l!}tSVPKL-ol5{`+~->*a3V3jFu;>l302k^77Irr?Eyi14c1RW-0m z?IQ|&Qm$ZYairj#goydBUOQ5b-ekU8&<)P%s-2c;S-J9^r#vz0p#Eu6|BA$j&{%wa z3LZ;TbPfZxkEo4D7&)>9;Jx6J=mo}2@ayms<9w>c(s+hj|pX*&NL_`8X?LE)JR z<~f~e&iGX0HyBRR+rw}7P-k~~aCV1tA@3F``-y4y!|pT|852r(C_5m}qvZKsN4;*9 zbC5TTJfZj0mJOv9?>@0u?$K)a#V<B}efzW(*@e-(W4 z*}n=nqwVtjvUKVfPb{t&q(x}IcPK+UUV-06^}SkQ^~!{Xu*B~#1?K}v^%cKKQvG>e z)-RhJHRn&t(+c6q_G-@84VkZ71M`NaMkWgh$b+{tm($jgW+A5 zW~>_w?~1Oo_7uD;V^!)2!heaJsg!R#Bc0J6Jio?#_?q`B_v_lN?gI9jgfEA-7ey-J z%|-aWpZ!5mWSX9mRFIVrnG##J-Wdtfrj#+?UuumB=&9oiB5i)(K90;gDvqDlI2!!L z=k`g^v zzxMq>+?gwP+*z^N9Ox4JN8OHnple+4So>`E*li-y@;pixK2VUwJTk~V2%Ajac;*je zlMSoD|0CcRxux%7KEkGCzw?3rXzs-+|3R?*>lYOrTF?czI23M!>J&{5=GBybco3iC zA2{0WceUJoH0Vz2eLsc!@4-DpnI`HGS$&fuF;a(bM7T$yDd#ttI4T>#H$U8E?#rHT zAAW=^;5^b^@qH6q8g^vn{_r^k^Vhd4IJ~@TN5>A`cI!!fnA@!n|1yZXEiF7%ANFrN zI6&cX7kJe5&Roa7ZhJ`f8L4+oQs%k|Es2q7^kqR?Vr0^h#E9_EFOKybC%8%<*8G3y zLm3Zte@I{b>m}7!n_oCZUp*aczrW$+zS?=4qQN7cn$jDkub%GOS38%g_q(zcj&r21 zDAUnb8?3(iwd$*;IDHk52gNSmzbUzX6L)&DZrQdasoy%IS^1n-qQmIig>W@EnLhA? z)EpFcOg8PO?01)i;5{kxBg%v~#N>mguy;*qU!gg3k;vOjcvZ%fj3vA5&g)cJ8B2yWmZa>N zQWjie%PzRKvoA%SNMFYKuyyYTyAR&~xq@-YBK7^|MK>L728P`hya#CSku&gdq0W~V zjXt^_IrNZ2H}!(GTdDl!N9?iKppe7|a|-!-bOZy0ys-mY~6^a1rc{UPmc>1elK zW6{8x(${HM#?lGoqx9!3^iez?!|wQrZ~Z`G)|J!WGS>1KYqmW=XU|Le=j(e;9utEW zSacjrTmjm);i*G*>73~rRIc7Tho~_@T*A_i_A@SkPk6b*2SVw^c}By(SjJX3z3W(bB%=0)?EV}odqJGvYs*i^SQ7nLUw%TLMGp z;s?>bg%~Jnw0!p`H)xR-)?f!%gB|3Iff+ zq&QNN@8bDQ=J%$mqR8jO!ahN4u3Gx~p+KL)VbmpiM{<|iTAouKT5_r*E$L5%36Vcm zIU~}>&a7Z`XQ3my>(XG<@5y(|w*;qMcYO;UKYaT(df87|!^roaQ+^%a9_D}HQb%;B zu0WZBYI#bzo#ktI%W5&vYVxBdUByz zu2S8ndxC%Snf!xq^UYpJkZGReZKpc?>>$BZh-|S=O~3g@+ESw6`ib=^Mm{E&8TnPrE`5L zai3PMyl)lv#S4Fbf($=IU5A}X1)n0rKjW<8q1(uN#@UedNv65ieRw6$w@aR*;qXuR zC*J>|XY__c+-Y!#vx@)bo}>e;yIZ+mWKPKUU>FJs|G~yN~cZGHD1p@ksZX#+mN4@gv-y86({PdV9*SQAwlRpLzL>)uKI< z&T@}PI+thOPtc-YmSUS6gslL(`FziddIbw`-|NHflVV@c2y8pd*+OX7ubKN5g zM!VCgXJo-B_mNAq=#iQJXj;-p>fv`8^}3&(*~Zw1cW3{daqrU;liHFJBY*h7x1+7M z$~W_RCq@oc`Xh^k9V{F`f7*3LTX z@V0*vM*u(fq1@+Ay?c}S{bTR6!gIJop)DzS-S{*GW2Q4PX?&W{^wu3miJh4Fe{%}w zLYMJl)cZu<4;hmf`O^niL6@#H!N+#=m%kVK!YeN+UNP~Zzh&UkYab$af zHhTy%)oc@)`d`{xR&-I}5Lz5c^xW}no5 zc9E&`oDnwr)}Sn zK;atU0pJ_)s^7$8u13B2lj98DGm;+VtfhAe_{{zUY-{l@YjS< z?swQfy>~{@uqBMUQpVg~_Ab}+e3LQSy=1~@_f533-aFd8?@!KQH`B%o-ZAbg88@$t zAMAebo&*!FzmFf{zMA@a6adf96M^Mi_gT0V5I_cET}+1(Qu z&T{{T^b*S5=cVm84d58*ex9_n|Jr!k{kaQV$GATQS7|q40y6BLBxKnTcm9NY_pW)+ z^4nDr_V*h~m-=?>DIwHGkoEt?r{nMVWzXkq z?;FT9S>HLa#SyEm@eBOM6G-pSGS~h3^5V$H^m+Y|-XMIC8RFLWo(QSZa{g^pOY8K3?V`a$$z@oAE~@mkPLFZ?Y!5jcA} zhkrUaD?An6<%Ysn(WMh-g`2{=+~~x)+)(&Rd4-R{`;<5f4mElQ4tekaM&^F(D~vXn zPh>7h0-wX+^Eu}s=P&hbmwuIV4`NIH2lp5Mll4&f-0OG9845pRjQGfD=-Z|()YKa} zM>q-Dm4|ImY*{CqiNx?oW3Po6h|Bsm94Gdgtha>M>JAhr9e>psM~NR>zXqLN?gL_d zfelri(cfz4A$#Q;`IUIjnQH|6gAVN#W&QBKPpp@< zitO*$aaIJD@JBWdxh4*CEqGarn>dIssppJ_nQ|_tH@-I}elfVT=5@v8k#Cd_YIj`z za-7M+2vUma1NOM^G#=&IVP86>9W0Pc$LI0u;TrL9Bcf5SS- zvuiAQ8PlcgGV*qtd0z4i^02X!m;aCWJW*%T@iLQ+Yu@gpqsThN6PG}ni=j~&w3Kp)3v#C5flNq4LCoyFQAK!@tTpWzC-7ogNN>)4(Ad z>579t4i0C=!NGfidnu8T-Fay!{ZRCO@o{L5!J*-W)59V4G;k<+zAFxW;^1)H%8MNj zMtgi5rhvn)cjDu4PYe!go;f`n{r%y>a91 zX8aC+IDE8aiB|vQ31T=Bzk>6orfqvDej5@OD}!=liSt1`H15!0U!~%fqY}eWWSdjt z{J+E+vGQB`5KFR1t6wU0F}Js%Q+qS1??U3aA$R5eRjL1FVmhyrJuu>O#l{2!FLQ2| z`dqZ@qg|~+?tGOyZ~HYarM((rV}(oo4fiLlDjj3Kzj^yT#6dd%j`E$e;^yrl-z7d- z75O2FslYzJ_)gWLFFg3W?;bqJ`YN8ivj*F^#IKU}R`LC$mx%2I9%dcbXziFde)6h& z$lc?ezKF5)3B5&M^y51uJ{5V?C42o&;AtXmb`3Cv@QW50mjI8)&g;Sc7kSr{SJT5P zm*kHI$g3c4KXKm7Z+rWr<>XyS9&@qEOZP`>$(v8!ChlP~%VqeZo5{P3Jk8F__D7q^ zyO_KX{cV8Hf7>F}}m`GQzK@<9UXp(OGrY z@_Fo|iXJb%Q4apGAC&D`yrpyy-->^ZlpTbQ>%iAI&+wZ*R8mI#Up!_Rk6A|icr*{b zi1>`lxeNPz!AWfnrVPH|I%fx@j9r)QThjrXm-g`Q?hc!@dlGDCQx?B#!NIQYB-loX zpJXR&Qm!L5KrBs0Q;xl6SFqFH=TXY)sY6V7JK!5nIsBu)7uSiD@lpo58WwEgb7}WW zM_qo(;Ug`w$9`wFY0)ixAZaxCxNhkI-I3gms1H(cxuc?l_3$iLo%@7=Zj zsQBIqzq8(iZuA9x=7EmFe+A?v+~kke@f^;5WM+up8s;bu`zIPctKtXmg{FGyNVm=& zx12Yc_q?`VY%+FvHuJXCIJ77}rrh7FMeRK``}~0119f<40)CQ-_(>8gc3Dr>#l(li z*HrfZxRZXHj9HOcH4guA$33-uY6f95p}qahS&%60EL-^3tB>9i)_uNih*cFU96oc; zo_fqWdNiGXkUADnhr_I6(9BQ|>OlUBoGKV3K7a-8rr&7mTlzGeZ^DKwtz#|__`ZqB z7uX!YRl~d^<(QMV)-V^y_s>$!Zo52*Ht~;IkdSiyNo{ks&Atn(Eq^jTo1E`=T6bO` z>+QJdu`*w1D1EBcfG2#q313^GZ#n-qZ8d0%tUnHIOxQF-i`Mj3=@$IJ>VPlQn>=XO z0&G$q->u^{%$I^oD4Tc8lagK`W!+k|4jS#3viN^)BhPh@_%-8a107`C8zQUU^twZX z_!fGZ_4567^8K0QF?ZT|A@;<$=P~NXKXfzirJfSAkNAGL@Rsu5v}2XWn}hbHO)%Hi zLW>aRj6<9^4#}B8e0KD0XPJJ#a^CaYTot#e`T5Sg;pBPWJ8OjWdDuD&s^t$bV>a36 zn!}vclzBSLInI#PR%=l0TN{kyI_sRKaV2s9y)$;skDV*cIXWip&Kr!oQ=N|-8bO~y z|LA@;@=5GY;Zn|eNWV+G12b+;BL4~eB%Y4M)zSHZe|Aw6zd6$fkG;(GB8y^Sld&#% zFL-D`u7$!XGTFAcSRU0TpPu9DY~)f?%Bd)CLKC`>g*Uv zGOu<2R(x6H+ee;b{UPy0pufZ#3DE~SG0=WR{^#h`tyV0VI^sXC(Ucz6-Cw_)*d_~z zZ9+_<(X9^cPtGG3Mjv(fqpPuHuSUMhnFR5N9xSq$bPyZl?a0@VKhM2~wl!pTBRoy4 z*ZPIvTP$Z1C?ns>eu4e1>}#67*TlOKe`v9**8;b8q*t_@7)A@S9nqJ8`AXnf2s{gj zWmG;W7=6I4;7SB8+ME42u)T(@{Wbc#2YVT-y=S@~@8OR=&i`w`D0xBBKN+8Ire&{n z3b1J8=K}`L# z9{->>XA>W$e=zzMew)o%!RRg6lH|_21;FPG2Ka$9X9*27FZ(9IAT$tv z^V&tjcLZtwZT6?WfDYo*xd1w#$458w6MqN}N15?hh`W6_fN$Tez;zR}SpsbqLz^mS zb0hJ0t|cwHn*i;80PTXn)?d-CzeT$jq22ohW8Ckvuaseob+0cN z>wXd1y~zLj>_tglspKJ-Ro)0QFIDo8&noXsGw(God8~6(-e5Ctwd671sJuaDUXZ*8 zCY)=gmr&0o>_JI8BS~jWILl0bMw$27!;<{Rq&$5m>4l^(G5c<;`#$=uo_>=)yfaCQ z-ogB^DxJQ}(4sE{^W1H{V)}9c^yBvmG`kg={TQ0v0?lrQW;a2zCD3d!G^>JUH$t;( zpxM>X>?&w>C5N?NslC*O&>`5Grs)`eIV(_ zNN=DIB)yRIWo92ta6d>N+)p3e2mR}zzu6b`!5#F$D(2)`=HbGkJoi*&NyoUloxb4r z8~P#<9>0>YzL2rLfS6?E#2?#v z1HKD7qTBc`i|=mbyC3u2Eqr$~-`&J_OZaXv-&OJ5jeK_v-(AgjSMlAIQ>bSe^~|K6 zQb+V*>e0~i&*R?^y8`3;bmlR8u82KXu((^CpmNsRQm2;HIk&`~r>bS$F7I7gD&CC~ zonOo9j8PPrrtI@_?&m+x+H*wAU5MySWS%SO+i5%Fj*|8kY(a9r@LTMM z$eh0k*!E)+;;t|AxhZBX+&Wj;&&<7^h4}r9@tOL{Ckth-r*EU!EW}Uw-ixp^u&yO++A}$JLn(2Sm3{xCXT**s_WiE7$Q*0qvpXd|KEJTx zxA2kqbTns61xHVeoxh|s#wG|Jx<_#6-GAPvzUst-3w`nN8x(_IeLVd1)5GuD)4}gMU&p>G|d@(0B4zuRK)Ya>R-N%H0M)5Gr-!Ecr9FQ?-d+n2pY_Li5i7mNInvmLgK+0tg? zn0qvqM{By_C~NI-oIdoPb25%nHdXpCEq)&cVsL!63yx~v+4c8M9Cg+ZibpR7hcfoi z=dkZwN<0lEN7tT4Kh_1p<3_(L1VuKn1%8;;U9J>uZl>Ny!lDf{ayPdxZYLVRBRn^K~dQ(Lo z>OMCtjKO8^11HOtse4Y1ORVm)RdCs*^sxAT9_n5kTgKGAX5*IAW&B-Z;kLhHo{;;P z`!{a0aNLhhEqKVUHCf?U;v7HrKa90Zbea7fI!#7nU;2>seB=I|o^?7t8^QWBO&atf zUwk}_=CSMcih50^}HYVe^J3m|$habZK9cKC+oQfa(;2p~kJ8Kj_tRX)hKTH=nw?DoN zxIczY30>%<_+ia6opd@Ke)#KC|6BKHeafa$SAN)F(Wt3o%=B-}jKdG%e<}Kyeijdt*GlzdQ!d*YA%bAGUPj`F;HG*y-T+SbY50BRWZzAF;+jEWd{j$H(sj z@H@CKKELP3;CF94{5GE+e%GB2e!q^7UqKxFcErQ)llb^;2ERw%ijUvn>7C>GvUvDy zI6eHvfM54BWPaj!h%Z5a|F78(6WJbQ?fwAw&D5|L{vzou4q_G((^u}6bJISy?=der z)ZW`o{3l?OZlbLC;mbary=I?n-_WHWR%N;W9uD!~KL&t|>lBONjunCKN39#?g#=57VS21BYT!;5# z&*dyax|}Vaflu;<+&%PkbC3FG0+%=R0q$o$@V9@-Uj5UBISo(l(IYRnaQ9a){rJmm zdgQ`Ff5Ths=U>QoPg7=^Pir`Y|El;qZ^p;uE81Ceckt*Wz2D&)+VN1gX>;N1v&7S` z;Jza6%E1qs_sk{zfm!@Y^opC0eqUKRPvL6LtnZgq)GqP;H}NfdNA0fGK%@=Xpp9U^ z5j%^Kru zNJdTRrgzOdj!i#@u(StVmdw-|>PTzgyNpjLY z?W6>4Bxh?_8>l^CyR2TJMNZliuJE&Or1I_Z5+|!7=KE8}WKs4Q+N;vom#MqnZ~7-~ zrZ2z79@Nmgn7-|Q7}+GY^HKvI8VfH--wnWL*+|ikuUW)5x~p;>?U{X&sQRA$3+^n> zXq3Bx#U3s+xbJ$|w~8Mtr3+22I~gb0H@PYXCz~eP&6*hlyUX`CpZvY}vc!u^BfbV& z3H#dYA8B**+}O_=UxcSOm1UpmpH}9nzs1G;{PnFe-VqY9y5#F_ZscimT^Lu}L0d-F@ z>t4ITMSD_zfU)*I-v~S{_?s(!>Pkm@&$0_0mYz(9?y^K=-TmPEvZLQ&WSWWVW^f5H zZd>j?@!$)zEAJ%Mh-$a%*;d5+NPaEf+hap;5MQ$rP5C^vP=|bv426%i!yagWTrN$b%(TJ)XW){OeY~^l z3Rtjo@xe${^T0`ClRgG!)91==-&n5CG18hYa}iI(qZ`xZn|QHl?07+A`q76e{>Tfg ziMY!QIQmbAKe)q{n0`k8bw*-cw&P~^9PLTY$oE$7!@cpX%FrSeNphCam|nnp`F0xP z^bq!34W3@a_a#%k>vY|b z_fltwdDRbJ-SWPpp{9p_>+Set)MYas#^NV*`yCU@Z(ltzbo;7_3eT?NX&`kDq)vG! zykX$usc&-n>~t$OaF>VJ$HYx!-eWZKfo?a8_RND6btUAk-fTNkK%)~`P! zbIwIW-pu~u3@!a|-t=itURt^R4Ly09FHcKLe$?r^D~~&_sEZg$?7RDyn(c)Ag#%sO zA;$SVyIsSjrMvJuw0YKeG~i2mD#-oENz;vroH<4>SF)xjoBZ6JZsKE<58QG_Lg*%I zmqkwpd=(D|eKUadF1}yaD_QtzdbQr)j1?(*mdv4r?7MHmFSQ7MdB~wf=;MCKgvti^ zZVPoLF^;D3T_yZizO-Vy=v3Yz#9+~kq^Z=!-c^|~WKXulBo>~ZN}1h^CC-|qPoo^; zJ86rxP5ximE8xc0|jqr|BJQ30dzFz=e z_*NKmeC2^@u1hPnLx*XSH*{X=oQk}uX5LiYrSc{kC+FodRw-xjZHaD7Bc?d9u#_GW zJ2oXQfyCNbMnCRH&OqNto3r0^BX3W(;oD>0!=`ZR9Cz{Mq3Gp0@#D0{>eX7+LU?~+ zjW%2SrT1f3kvL8Zgjb-ol3gm#34hF!w(0XWe5k!ELi@suPmyJ$pBGxkmY+@88sL=o zQcl6v>BnKqqW=Y>+;J`SI>lF)I-8K8v9L=1Sn|=kMiW2JH#W~G_(r~o!AHsrvtZ}W zmdN|T_+Dg4 z$osNmVU#!$3AFEr?n@jQ(-*9C&e;hpcApRvc6|uiFG{43hZz~meVJX`5E_0&8%+WqejqK#If+wCT(GKx@K7D&a1HaO=&%oq&cK-E zF0=^u=ggMa3^pDEsACgwaxZIDm^y@SPQ@E@h+7_ur@-(#`Tn~T0>kX1tWV1|KUa82*E#Oqwfs@EY&IVB56M_?cCVdXP;{~_Pz~!-U!!M?63%E5{xDBEo8<0Cm z;MWL#-lgH~26J@X6m5GauB!fzh^HsxMR09J_goUE{X3<7=n>n#(Dqa`i8m+6Tp;6l zKKfM#@|g8vM06OLj~)j8Mc^*-*pyFsuV=U6XTJvdfvlSDtJTu*J&njWBCkbO{vMd* zOuxup7kE}6d+qvmfrrFf@xli(4@^UDxvI{X)9Q3h-%Y$HWLT24XV8veXk)yzv6i-& z-;(QSN6CAaDeo0e^liKsI)%PHF=hlbFIbT}CkdOtq~p%2R%m@_pOU{*r&f&jm1}7d zAHQHl=A1*6X>+;?e8*?)dws7}hI@T{%*VYbqu!P5JM>P>yMUG^XW`Ymx%-l0-U*E8 zb;)aiQQ$ZARl%KkWKykGg%3hmERAl4MzM2~>aVUkhznfM1IG-sa9Q(~g2g*EJl?Qy zae)hKoiXMeq2N;Srd5V}%?t|{^{!;!nm1zJS-7ZobN4m8-uX`Tt&wc@tMmnUnR6(( zyf0&BmyUmg&Ur!y=L(&iFHB(HjJtW3;s3izuiu6L*U^|5qcUH}`N)ZH27SIw0bhZh zJKdnq4ZZL5?EakjW^OR_gz4Pr70H5cTAh8TKjd^(2I0M9&fEgvY0q1_e7n!HFMAKX zm!)TMzh}S3!O&3F!`w4n`b)W^Y!$o+-}3F@g^U5om-lPnw>6BN0@{?ie3vfYF1DCT z=6jz$G|88@FS{*G8#71mo9uNO$yxB)FW+|f_Oo`D`RrR_bo%l6s#_fNN&N!*p?Q^dx7dxmJk9 zZ>QkbTN}Lw{OZ6j3H*G}%18ecf}eb|3VO=CAnzY?5=WfA>5JTxzRRXu9dy;9YYAni zvaYGf|8us|?e=9CXh}&W=xaH;t6+&EGr2(Op}awPDfcw7$;l%KgwRoWHNL9{Sa;C+yVH86VS)#LK7cW?XZ&s|s0PHo=)W z{eAohg%`@=^nJ;*|GV#f&&2d^x4xhHbj-VMeP6Nlg8UZAr+-xc8{;x{Ej>d1hmxN)(8|}w zWs>&+zxT+8&i6uROSeBYolQIZuQKLons(e=2lG99V52L3rN%;1KmT}h?Q@3zUN15+ z4?AkPX=^eXrMzt$n=khz63>IR88%Tz!J#| zFJ~^|jPl15fy|+tkpG z=-Jmu9%oVEt!?uByT`Qk_tB=3cU^U+uP%DIAv{{Ex}AQi9;{WZ>dXJxT2+1~|HRqP z^KcJ5^un*c?2*jdd=l@Z!Mn`&ahtp7F2rJ(p1Jo0B`)w{UsSoIj-W%{l1o z(fBF0&^C#EI^b(2-D0NwKD|fJoSw!0?Rh===Hz)_$nKMzB7Hj;$335mCD&;FZbL36h6Kl{@?2Ay>1h>g&E8Jkqh;C+n-vIl5^p$ z{>aS0yzOs}?3HujO{8nBH0R@HHd|@V&CS$*q{?unZf3wrUn%9SbV$luY2paY)UQzG z=Sq1iT_)wN^eicFrDsU_`KmnejAjO`bg`7T(tas#r6)>xf5e1&Jn2L$J({%3N{=8N z4fv$Y%+Zs5p9_A`pzo=Xy?HLSo{OyKBI~)>dJbC8ldb1~^*qIT_N(Xf{Sm3J7kzY> z@0IMQ7?(2wniuH}%)+#s>&>*^cQ@%Y z;Cq_qw}J6(JuUfZi-&aPwLc?otG)1ln#KRzIs077GK>G01Ir3vSqcAF`=-FdBUkD< z<;6X6j<60s_&<1mioeKrV?t`qh(M2=DG5Q}tbm?#qnQr)?jilGnfCksL|O;NFL_Qa zcqKd4p(j6U!C1~&jAsN!&iFr)3f+*^fm!tapwY zi;7+|y?)=?F-c}W75IAROoI;7^j^u0RvQ86{{U^6R{oC^|)d?P38IkP8AI_Rq+U2moXzUN54W2XJS zBcz2MX;XUUjD#K|p~rJ}pFxjGp$9RjYN3ZI<3Cq)5INQ0T}hu+`({lH`nIm+h zsX0m>b>*E|BN!X!r{tVHGBsz`M89vw$UZrJX!Ba0g_rLlX6RE^o3fWY)22_GYU|lo zmiZdCz#q@TAKT#%p^e8MNrgX(z%wtX=P23NwcS|xnAgLZQv{snB=*U<=zP)%0pAVh z>p4F&(|+GGq=gQD1FoM8rI$oR$aB=@u^kUx{p*{Pi=!2w!jP2H#5~A zxobu5oQuW>d`}~O)ljP4B0bJ)SFL zFTtF9B}Ug%qnG=hp18vIZ1GCp=9FsREBMoW>g?ILkN?j)%nO=%uUL7Xn0Wy+FM)G~ z^6g;$%Vzjhebn6-dPx34@9qr?9nR!OpdUKlkpOaaku_f@6Em(29A&<){Gpn!KL=Oh zZ(z=T+tp`X6La>3%WIhPe!2av6}>jjytO8BQQ()`|1qZb#+f&fuC>xP zl5V!r*OJzMrOJe*yp_IE%3JA>l(*9Jr2MZ{`MFZwN|#A_D?LlfTj?26{vlPqM9N#~ zVkvK>{ZigaPn7aC5fkR|q!X?5Xwoh#JwnO{Dx}Os<0n`28Vi2S!HT!W^x?VKdM>h_ zi>&8j>p5sWPqv-|*7FqW*{`0@uZc)~!slCkdp5kqJaC~kXA>{*NK3aldm*}&%-IK- zb7aomoNvio#+>l!v&Cx8R=m0rUaj`&@Px=dC;vxI!K1|!iz?1p-e=8 zSaHro=f*sE>>Tm}{1>ML%)DAFZ?l=_H}jfFJHbK9e&O4_;RdabDI0~?bY$ZnMK&_8 zZ)U8CjHx7+-y@kaugln4?o;rt0N$01t!iI6yes$7njX2e z7#JmQHUD#RgJ#~NR^BUSUck)z#L5%dG$+?@=81fgHH3VhhfHc=6Ij*|Lf2Yk(qy44 zy2NH=ukgvxRz**dxuQ!bKB@NoiMnO(dx!roy76>iG-GdNuZ_dT>Kni0Jvu03Ep6in z(!I!=W#-BFOWSx4Y0*a|e=GDJ=ICY4i2_dxe9N4n=EQ>vj_2+|&vY?%1U$ZaR3PlZqK(NaxaRrsYGK0U&GCpwAVTha5$zbZT$;Z0eiP2+p! z^$O+7{Kh59ap7BbJTLmmnL$@*b4GUl)Locp1w=b0wt%~LBZdLVD0#S!X} z^?|_lrN!^DYtfmRHId;fdv7c%4ps~wpSCd#+6|xJ+&J?8;qBbxqpGgOf6h!2=0PAK z?|_*}0x~lZl>$OgZze%#NC0(+FWUY{;P!TsfC?%a9wq^50|V$FLJe(+uQrLs`T%7t zmY~%OqFCToTYFmqw3-kQsXQ_W&hNXn?wfHm~Ko@Ze_W;LSyp{T_0I$Ys**OxnFAT=w$^^|D0< zZ$dtj@%;jI{F?kC*S^I4^ImP97FQEE4sLI~A-{a!cLs0%Q0gBYzxf*O$YkZmN5^fx zhi8$?q@)w8S^#ay7ztMdRlyu%Ji<}nh^Nt7V5-PF=I3xK8 z{=wNvtvA*XA4QLkL0kypV@PZ#Emp?5$z7$`P&QMB*ll|I*j%{hH`t0*Y{mv`$3|?( zQB79#DYHG_IZ$<3M&X}<-s{RjewnwcNq7vMW14!c<%Ak%X(8QJ=(5?Qo3F%L=MG)xF|K@e zVT)?Cw%oWj;TdG<6Kb|4%3!ptRbpK?q1SS^{_ZbNdY&D>ope#w7U$Z8XGtGx7;gEY z5@q=%=|&|MIDbt&C)F71r)O$CkNo<#3+4Ib4n_2jLOCVWQvN0pJ5-zx(w{C8bDZIaW7tS58u+_&mH#+YrSHCj*J z_-Mjub%6Cl+*yt)i5C95<{G4q!Pe}C^`5sIck1b!k0zW^6Rjteah4T^B+FdV4Zq!kI`>!h!7AZ;A6^839zceIU`0x6ZIwakvXMW*%#QU)g(oPO358`pJSi&%_V6E|llgyq_kd8dI#F0Owc0x!9QQ%2m>= zx%`_LRqLt0u4$n>=jJ?_kZVk}PBf-ihEnb<<51T}YO?hsL%Ma=3oAXJy#3pS^8C@= z8xuYP#!o2gdgBBwT?#Or<6pXWqbJ?8eW5&``(K+9&H>|jLz?B!v|Y-32s{W(6N`MF zPxd~m!&j`smri@XqHiSKU19iUo%yNflk48p;Tv-~e6P_@0@EAT<(~8Jyz!0jodbsg z)8f_3J@thR-w5A?2zPd?S2k!}$AT$CI9kH$3}| z@Vy?!-zVp5Jm>%IoAEax+`s2vs`b24|J!eb@5wO!-uU@)&#dPgzY)HVBKWia+_U(G zZQlsrCNnt32O( z?q%Q`YRwJz?<`|lQKVmIIey}q722u8wNR%!)(VSe8Iy}Ph5K~k?|GXEqkW8A?qJRcVy0u>YiRXecme1;*Z1q*9RVgFzB?kZj#3(p;4{LBii^h_*yvtM{3^z=sDBlPPV{o*GrjGs3eR(R6=4gJCs zq4S9Y>OJ)nf735Ko5D2y#tn~q7XNui|L}yzU;36uJ+n?f(=R+vhR5C;@2~dMKe7E1 zcqSUhyQEJGz)yjaZrxb8(sSL9f4fk7_byK;0Jpa*6I}4GqWgdczb@<9e{AvG{=>$F z@_gT{#}n=|7_5s7xuh`^ZKJ=0FQ2`CrDx;9Z90#h@&(B@;mz;ra67&V};)*-bx5 z_za!zOC^gm@kRU8XzM=wE=IiJ^ZfXwmlkU8qt+$tW3GEg9qoEf8Bnxb5qP4lf7|n@ zC+bWK@I-~-8Dzal8R=T73@RE;nWLF=)&KmNr}mwlz@u76hvCUIT~fE~s|k2i>pl&hIO{Ip$yDNs zT9AKQ_@4j!M?Gc7ev1sET3gE3CUEwW^(pmQ(hMqEpuvLlK3*a;o@&zkM3^YqO(A;V2VmMcJ}%V+)n9qk;y^FR6x-!4BB_`K2Rs$2T> z=Bd@YH;3?@K}OW}7_i`)7{rgK3;pXHJ^_)~T#3ulHzzktZnCkT=xO9v-A6dFdD#~B zbRp}uvEQKdYWzWX7k`UuxD($k$lj=}iw;CLg)I30kuT4RKFa+m)&UF7N$joU=24_2 z?)=!@7RBGh`k#w6Ov_~Dp;-galaRZuz$9^`$~d1v@@I1YBmQrVvX)5NJy-UmeE=AU zqZ=@*i8}K%A|_po(h^DQ)Y7W{ z4F>hrEnjoiH+m0oUhqXp(AGS^_yy-GvyRtyPtN%t>HQ`#$h5YyZYsDdV{LgtFf`VL z9dRmndyhTG&(r?Oa_{zHRjGO&ylKzTN|l^_g&$w1*uZy)&dvIM8$K*~gTXy(q*`CF zUbX#fPkGIhRYY0u8I;^&e3SRaD7i)WH@#<3a+@hz`!^{3Z%FuGvXU!xeUu)q5B;iv z`lPQifp`0t{gh8%Mc^x=Z#PJK+E+`TPWVSZ>4B%aeqhq-gH9stTS@+hz6gyqgO?Qi z1Mum_o^EQM_G5R~8hjJqpAxo*P!}{nzVyyr;AIi{wtxOD`G8Ziqx8w=4Y!Y2G9}xO z_YZGh{An-`(qWdm?+BN1m@(Jpm*I)a< z&szHH18}pJ{(7H!KA_LeqMr-=QlC6W+Ag;K@s#<;Prs$@__X%dc3G3@yUri+TgJb_ zWnxX=rm&waX-oYz(6_>RzWA8d&^9+Z==q;38=hdDAD{fN|Hq~4_w#v6!e2m`UTd9`62X;5pg%;a5DYEi0cZgkMj#sXtt=PwPxE$R3Y<5yK@ zPy!bCmhhf5+ABV?Tfl?x;h$^wgyzlM@ee#8{O6zT#Y~ZX4~%)`sRAt?)f)0@?>EBV zDZi9|iL{+6efQCBd6yV*TWGtC=^E0P(&rC{>yFqQ7XMsH?AymC1)o6H`#G<0K^Z() z`tfcG*7p4oYup^SoEYb3pV`RV%>9>N;X_M(=D*~_ZTZ1gXlrg5M%!(iH_d@NxDHSy2HKlY+&WhmwMciBlZ z?UMgDbpN-NkL{AWHe^ZLlR7gQTiADkO0GL7`GmfjULJX;)MZojId)_O&RivEG2aq! z(%uT%VTsKTTJsBo_zJyejn5AboLm^h7wA3Sn`g5pQT79gpPJyu79SU|jiVkdMreed z(xH)|T*J7o;L6~#aY1v@TxPCVu6V8_t~9PIxH7p$a5=d~agF90$Cb-4z4WmyO~LOO+ZKD*`qEYCZDs$(CG6{3q4*n!#oNePRiU9ufISjH z_T=5jezXmehjd}zIs-n&QOGaR$Sg6)GXtGsJtUy^?O#n9Gdt}_=xTLllw=zsCweinb^|NL6p@6(hL((V=fD;yEk zRK8LFUYHr(G{WvUvo8*7n*AqL^V_HFK%p5r z5qstRN#C!7_TA-<3o`zvgLmQ6UfQInThd>JuS;K=!~Iyw_ZRslW7Evo%wufUf^U_+ zw)0Qyol5wg*QGAljU3c_9OuisjNPf3K1pwfUSwaijBlZvzGWN+zlBS8A%~heOG!i7 z2c(XC)=&QaGx5y?XTZ_d&g!HN2YW^F!QL8~hqA^o=IJxBscQQtkrM^h2oI7n>ZI@J zhY{e`&3=){yNh?zQlqw?65A{Cp*~NY0vDIscbP}1+t#53ZQxkSI&~_vsa(bbcrBzp z3%D%AXW7BHD8(PsOP!Y3TLLcn(iR)XJ_{vaqpvLRF;|$6wSkAxKht?_Z$2jFI_Xcd z^ylA|pzuQBi9a~6^EO*qY|yqpUF(}T#(@R?BmKU2?Z`VT;XSieYbX4u#KQjYB52p3 z;V7Y51LnYWS(Kp(!Y%-4qw~F&^R;Sbe~rJ zdp6}f#=jbHBtEUXFNDTQ*`{839}UxU+W?(M>h0)f@6|uq!w_kcoDU-Bncv~j+t$Sy z$rE|c{ek{Il;?8#)3NI2KqK_!NUP43eP4NuL4hk1dWh`d6+i0D&_zT<( zsYi}-_OjsPHf8Kr*SiDNMrFZS=u+zLop$a`q&=wb^G=XHE7A66UYceSX&7tLUl!81 zXM*GL;F!Ip4fq+FGL&)W$LRaCY=_lA^54}!I-x)+*8Ds2*sti7M>TY}-#D(HJl80J*U3}EekG{~T`OM0 zLv&BRxnugtm!kxl1irLB`OH1}-X7hP&ya7@aXwNB}5y(Fy|3(wswI3F2+(?c}g8JeZ0=Adho2#kXFi83bHUnOnT@Q%(QI4&Oxj;BuwILGQZ?id4(^DTazw+(9+ zzE-a)iC;mBRg%|g@?B4#2(Rcu&Obvxh-}}sBBrHnMKo6wmyyfR(w0zjWBd0^&NIcx z4`$>t=8nuf?F>(UGG}{6@Y;AqQfkV@N!Ztf*ULGFDa{4I+X|n?hNbPdtuxX`VVN(L z{ufv#{;D8&9(k$@dY|x20qsm>&X)LjDb4PBWdrRW%UYdJY;&3DdR@?`tXFHW!{^uo zGFITx>rHAtC1WOsxIxfm1#Q;&R~maVkVnjReLh`{oRCxHeW-|Yhuz2tz4IR?zcNx8 z_XWKAfh)DW&8}47Xv;x|fUddXlJ`w;nl4f_a!p{;UmR-_y`AFho1E9vpa z_8Y)eGd*b{<*bNfo(R)-%}MzCY2bpk(PJ01(0O3Www2$1ZvWiu_}82?-Cq6i2uWh(AFUMj+A}W(!&RJI!J3i zIzS0@P)_T~&{*~xck_Zso(eO0xJ=-qJ;&&bd~Y`;rM9O)>)|=JPTmuG-W~GJ9@5DF z-2-?>7K^+)Vt9v^Bk#MTd50%Q-o5gk-GiS99*=UK+bH05W1kaTI#ZH;j!Z?9Aq0r084!g@paR-J`hP|CKzI5k~ql~7z^CuvGjA_DdcUk%be5^^|fNf6F zHyPZyCe=36S(PzF_Cq%I%A?^GdHA@L|M!0CMi#sHIq?5YhhOSG58W14s}mIVOeyeX zv8}cL6r0yNwX5M!XltR-oeRGlD}5P(t-Jpi=T+3zdN?!|`4?L&@?w~#y4%Yf)kd8S zZF-%K%JJ+~)#*+vCmS73+IJ{47FpLX^;M(u$$CN;V4ng^6ZqkL#29V=%pEvnFm)QRX$K$d$(u!6rM{yB+<|F=pHrc6ZRF`a_9mT6>>e|( z0<-dG9p?6#J+u&^5#!mOw2jifKfx=Y3E>lGz@PA(hCk?h;x_gSN7|sl0M7pg49Xvg zO8~DBT6!9O8G?U_{2C&!q?dW4Lu6p)b z1U`*-;!7Oioo&?NCjS=T`U)9hGyJ%20OjAg!ec;ZJZv1+d<}a9OQ}oh72Q$hfvLUZ z;zncmeA%J8?MiIzyVB$=Z9P`<**j(;D|?WcZ^gE93$_(KW^!8&bzcZ=I|7f5z_AQC z+UM$a8aWFm3A*VRj|@*7I$+rPK={9$gR>19*izu=G%~NWk)|ye()hdda~ z(ASatKa~9Z*YYp#m7g?i=R(`$9Fzzwvq;-EM#s+`@;u2MY&{#=_8Ms-{UBpon;&X* z+WR~GZGR8ipbfj3>y;Br4?ZM$$16eQ-OJ~OKM8&8)_EMd%Yk#WqrGC$c5De_73})u z0x$Mro`cHoF3o?GbV4(CLN7J%QYU#$YO>Fa-Y&XzUb$m}%(ar=Mt<}(zre-0lbuIS zgi1aJf09S!q)gf&d1aoHGKI#^GKbfE6&iO1W5EP$v%QY)@fo4@xBuEh>nBdYKi=x0 z^@$q(m|uUZ!~Fz((wEkqz~0a*F*tNu7u_!euD%P7`_`$=l~4D`EXF@4YV+KO)LZl0 z9-j8}E4|WuqNjP6G^KC$q|wTHt0&#jKkDgrkj}oNC*9KrdZqbTPxC5il;8BE(fa>z zPrA21($h7Ot~CHYmI%(#!IF{HHVGXu{;$3X~ReU>2eG&a%)-7uUM)ZGh z?Ky+pLhKmlumO~l?-F|jbLJ)Xiin+o@p%trG=%pM_tyWDdh7qa($6KmJsc0ExBj2h zkN$7Rmf!%U2frFHUSM*;_vHN;u{<1CFt5V*#72p23LQW1Bl-7xXh(3mif4%nqqU_U zeZKEnY9uaS=z*-Map4 zMF~XoeRF(u?tASyn$1h%S>+J7X<$-y?keIjIa&XjT3-H8rfMycKKtUht`kWf_8#XZ zlJ4{XL+(`C(Q%Iw5MFcSOMQJ=>_qY4u?9Y|DMp&~ zuXd7mRfTJUS5>Zy&|2?uLey&_za1N!$ld8t_>)=-a&wnO%?wtvX2iGmewV1V!H4WU zt-MN$QB{iU?Z{Scwb=DN<_;^*h1fAOcc)i?|H8YX0}@*jeNNk(FL$Zml8U`E{BJya z)X!1J)VK8Vb=m&GZrNUVlM7m3y;K>SLVlN85V)E?m1p^9iTAO`zt?-#Mvw52?*FYn z_Y@JwG_&`&_7xudXM588{wJQaUhhS}TkT2e^={ej^T;0R?lK!5^~CmiUtRZv$K31P za_=UM?z+>rt@F5m!S#daK-b`cTyu5Q%nsVTM@b!Tp&dD4n?g=mbYKwWNV|%pt-M=@ zM$L5bY=w7LqrWwvPgWB%F`scEX+$QdkhDLH4p;`OGmla3^}O%huH$nJ{WZV5V!|48 ztgnXt5?oq-M4S_IK|tatNZ*QGOYF}k-dA&%I0_bIJ;CE@?ox+^dDK-N9ry~~&_19b z7uj;WgR&aMo_PwJ^qGA02TP^+Y{*<9^mP<^{M)NKy^2myb1(Wf^vPT_x(z-h?aZ4W z9dIm&4&axp+d<#HG~Y|)YrUI%*CTsGD=*tw_m_Nv6PM%-7&Lh(7k<)rd`yL|+ve$Y zb}$xP;Q1J1;TUigqJQPt@XZ%nCFN;(pXnJ}6UnPol6T~EXWx7>#!Q)JS39^iQ>NrM zL(d=Ic{vOY%4zj}GYp~cu+C9}Zo3RS%rf)PR}IY9z$&sEJizaqD)Cz=AKvJs&1USQ zm)k$nn=|<*b^>JNZrMz;uR}9s(2UqGha2^nc`0{I4y2V$4w!f4v#yX*xq|=ZcjP&( z(g1!_S^G4rsh6#LCU0b|0a&m(^{jjHu9QF2g?)AFpiBOT*FE`fE1%G18{j@wLp_o| zHCsRH?KH9_LanABw4Z(WU@Ef54PP$929esFLs_lgWlfZL112|e5c! ztC@LzgK9)xNooF+b!GPyW$Y5l-eMfu$y}<{m9k3>q`kvMdoLi@Jc%8P_!8avG0nCpzd8`G$Sv4(Xrr$pOm`CkJfU zJ93g%rQ3|ksjKA9`zY?S8N1H-wdu3zmsKk7*k+e-?@PP&oy@5RLt};39BH;8LTer9 z8hd*4aOgwU@DrH_+y{{VR%mn+FLoL8j}kXK0x^Ll#HNvPEZpQ%Z^4_VqT2~Cw~VxGzKQ?N*i_#L+68Z2@F})L-5)Kz`A72svokdI z!chD-Xs6Kk8JphMCh{p^I#FqNkn~yjnN4{@=MiT9+bP#X->Yg`v4gb6sky!*#6xqYT;kwDC2@gk15Sk=QfcQXSxI4C|!OrmnHelBNI2f%JKs; z-wEBV!cHl5Iw>Ou-KT=F>{9V_;h&5(iLobhMklm?6|p>hnS0Z7s$8Z*e9gF%1&2|;(2&qiIseVQY3(j!H?1YUoa(=jpjin07Hg#S5L*{Zgk> zjekY>1nXGGsIQ>~`dpvv#~v3H-Xt{YdMep}%&G((O+ER>zMM?k(Ep$zBYhVcLw}-- zn&9wb#M&O|jZ)b(>E0BYu@h2Dhb4fH+h zz`-cWD`f0On~kjf=Y8~d$}&6udwB(JX{W^86TRwnaMuRjr5%wmTl2auAISeF_%E>s z1zw>O(dXnc-i2)=Of#>MM(o%!euxiWnaRHWGlRqP9`n8MY5NuU%rc+XpnC~!4zur5 zcvBPel+1}%XJOMcbinysvgd7Hl|DZXBu$<=P~$%p;7#C+th2n%JLgtvb3qEQiLCPz zVA1sW@OV4Sw{-#^wnQ0cySsGTM1OLk%(Ia(J(Xu{%Yiq-{Z@hfA%cS=y=37BDVz1< ze=ZA~O;%@>ZD!~?Wq}!)M(clc9&POP(p%?Jo;^+(d-}`#+{5=^1Ew7!!$^9Yl31xW z;TQJ-Yh&{#2b|b2%nK$5L|+pAZ9(R@?1Art`>CAeY)1b7V~R5VHz~?E!P_L-Ao|b8 z7s5VD(0pIMmLJB!nXo-dc=jru#a?KRP4wBJLv7wdK5#y+Y!F+a))vx9jQ^wX9!(B0 zDuG47ynA1MppY@O`#m)vW25zzf{XYGUf5kRIpBy@0`L8=$pKfq5_o&o7R4OB#{&G^#owsaVD_1=P~xLlpD_TF*qS=T7Zf}R&W2J(#BRK&{K`Aw zCqd0e+ah*j5B8Q@vAf)Y{pDutFf*_lPsi^sO7r`(pm(~kSy|9Kt>~T1-Icr0TO#zJ z^%dW*qmDzCxWI1CHhKFxcQBiG8IMlZrer)?M)izGE#6r_oPTA8u@uHmgl}>doDC{A7wefYc}{4nOFK&{Av{Vo%{ZfM!%6UxdFVE zgDa6=rjXAT)^i0GGh^eY?E^Ghj*RiX{JfgHeffD6-^$isex6Rmruf8o-CiKL(|Dx# zWg!EJ-ni-;{Ib{&u&D-{k;GS)IZAxBCZLCjUzXSm#FliKkLM)A{*G(|XF(e2*C_fo zntqO%}bwvC&93?SK_}je{-xAu74fv4!j)e z4#eWuH>lR)-^m*6=f-vQC&?Sn7`AieD2lamnL6`9WG?a78ysB_AolsVcx*U!?wV~# zjjP;6+dGN9Q%Rh#O2*xTsv0l4U#GlJPvJfNJI6+HM7v%74@!JVztWhcI;&B%E{{yWb{ zIoyjyo{Wo8_K%*U?6<`zr(S^OMc0-%1R_^Qo|AaCf-_l1$>9!;Q?6Y;yDJW!5l{M7 z>;S4VyDLx8>oE{hD34~;)aIYRiF#D(84XWXN)_-G-zl=-3E~PICuV}kGFP!LCl;93 z7ZGtS-A!aCMYHBO@qfkAA-Cnl*)#~8mI#yBljU$vUrxj4yJpZLSrU@`o)gIF(O zPk)B{8bj*d8g=e3%D8R-UQ=pW#!&2J#j1I4Dc=-xX@*sK=oeSzkKgN4t-fjCtr~r| z;^j58p(v*J@Q6FS6kw=CM{} z!()q?uUVV0V&{8MU7damSxjKgB1X)W;3*HhtU#ueu|>Hh=O%HMHJ6NaC-t94pTqVu zj&l?e_B6ih zk+V`{|DN#LE_kcPZ<%XcBi>HWQ4Ph__$d!m^*LfGbh28}pAYf9NL^E31Rptu-$haQ zduJ#?TQ8_kSL^@q!8i&p+hR=7VoP5xo9b&g!k49Qr-pGMZI+EAVyBcj^iVpw58rkz zuftZsnW^Y;GB(8LQ`Q$E{A>4D37VgW^ob^a-Y0xNwfQJM7H@xwJPYq@w-Ixny1pWQ zfa9)-+vU9@LD!87pwZd*SN+c7Uff6-wyNv5w;MO5Z^oXc_48=G+~q~NzQ2)AD;xWm zz~71tR7Ff}S!1}Yess8Jq<-ubk@7V-q%XsD*wkT_VylVNCGd-XiHt3&CjlPO0502y zvd%p#cRTTT!zpwSI zh?X^v8qe3jUz)Cnzu4Ax+Ad?sd@DM@FO5yr>{0EhyXPE~zV#|Ks-O7C8%nbb{_6Eg zARAji8RrU}zRRWIfjMlev`_H())XCvqr`Lha{Jets;N8j@5p5RpYT+p3HufQ1)kpf z6Z+N-UkSW;4RZsy!q3xR$GM!PJh%N_xu$f8aO3kE~tEJ}hLhc(a)^mf(9PU6uo9H3vk_wQW@v zM5VeH%bJAb5q$QBrz1OnZ1~OR281SA_e&o-Op*20v@U6b7r2<)J;U&+6BrV~|LKqE z!_NlX)AncOq8VE2_zgOxS70|))-b+~v6khd59a-e^EH5Z3+qzIQ|J-y$9ccC{Z;nH zpsR~5L+~T-?UaG7bTqgvX?rHd@8HbLRvYp9f0G|L&v=u*t}apnp@ZxpMDIAfBE~=5 zDRZIH+<^ae=tE#S7{-eqy=ra@vQEtq!HuM;xdQrzX4*ewPN`;3(+cAKa0#y~qAp2O zI!qb&XT!sVh8r0IZSA2~I z_@z&cT#OlHs+t39e+q3Hpfl}1eOIcMZ6 z>>y%yd4awe+L0d^Pd*u|@?G*KlQ(o<7zWNn-Uz%>r_?9)e#Lsk5&H1#c=nv#mmiR| zfTyINsqYUiec!s2C;o_^KyQWB*fh-sIn!ZCM|PA`{)H0gUxD?4*fW)2=vDl7G@M$% zotewTHGm6WT_Zl8MtnVu#un)d=-@#5lV5LY&zq9ljvXMBt%QBL5}MHkHVB?32%hkL z=%9{Zw$uR*vX!RmtV*!`!Tf+@j8b*|c%@4Gzfx4&nD&u3IT_yz>S&)S9^X!b$t5%) zbApq1@e_31r{uOjJ~`L%ppx4r@|^4wJkFVCM_1k;d*h+^1-sA>I-a?s$#k*gpp&cp zS4vYmGys1Ls_@~0>=F0MxJ&~F=YfNHXn~cOa-r(zCc(#%xzO4qiCvZ6EId}`iQm^U zPn@PL*^`^vM@BX2{%c9ikHI$;WSDyTqIVsJ=Hb^$9S4KZ88F(9E(gZi8`}52RV6SM z1EciK_$7)ztz^5_pXbfQ>0h#FhnyjAd6aTZ&J0tgJtNaNGDBIDnPE~UWZ0a@+Oq!r zGV65t>S)uh`tn3PEgL{`(iO*ms>xu9HVz+31NuCF|3*9st@6yiVZaO-m+lG;k zye#uHyvl!ZN&kCII6nI@G|16V+`(*@{wL9qkhx&O)8iCuWE0jExgJ zxgN{E_q-+N%4mCoDMtnVI>wO#FY>}G%Plp58bj-iN>$ShUW-;|yw~#Waq6Fml6~R& zIceQzoH1wqgmT-A%D5)Vk+mq9zbzL_4|3jJ5qP^5{$vsUJZX>9SAjk|8~l|r2a!Hl zOurN@Tl%=Gyn@ghChZK@Y;aSt#=TwAso+`H`NUpy>3-~`%y%*e_mzWWZgo(GX|y|c zH-5l!j#Y2GMC?AM;ZvO!@Pb}eIR_lC%5n#j!L0*3ZrzL?dC8He%S*M$Fm;@j>sV$Q zYJfhED!P2KGD{!RFK_!=?Bqe(w$*%#;;%tws)MGb4uNTP5%y4_?-9+Ly_d*w{mW7g z2R_Y7_^~p+>ljy#;hcAfjlC54+y<|2lRN*OV(d#lkG)p$mxYGkB78#TwVS$t2OTuC z*S9>r*_o%RJ&NXcVsCYK5qmFJ_~c>y-%X3Y-ed*`eZQ}H;Ok97?+)7GC9kxnx9no) zy|3IPFxCD0m72_FT50MM`G7fRL+NtWkI)3oNPqU9%{xgxb8oHLc9HY>e{z;w8L*mc00iH0nH*CH04F?bX(i3A;@MyZNZkC+mfbb0M zM)qdXZt%W}ahIniRK5rOdkyAd>Ay;zS2I53tf{H-W}kC3egll}ynI`iYnN?%UbHH4 zF7#Ll!1s8caT+UpaMs$TM8)=eIL-JwoQViCd8|7z<*rtb;c+ zqPIobyNdQo{1JQft{dFZwKquno?@&Ek85R49l~9F8{|BtNS<2qU^CES1xVfAb9&ub zGxWMA+1cO87?id?!T5T7(B=E=|6k+knqIgn>jzhLGDgF=YComJ`*h*uxH|bN`xKGeehu34*W_&>o--RF8;1(SPlv-!V>8&e-T#%@-ks9BsneNBd93d;@9 zi-Yr%nYS0L0^jPcRq5O0e8oPr7Qwe^xYm!OYbeXC(Hm><(3=@vE4-{u%0LGBjz0D@ zdKH;c=kGe*_IDPcer_lGa_!i1nSY_Tl1AoS&J@NzL@ZI}^71VFBp6SkmpPgLv72FI zap#(uf5i___{0P0_!{v~WI7XRWnWAoY1+pqxr_n-?ZDLPL3m}1bn~6W zFy9e-TVnIM9QYt>68FP1wh(J*FZGmaye82lK0t@@d;Y~5{8nhcj5CoV!PS8Z@Q0mx z$b81_boP5qgD&>dq(+Q#Qt?CEJsb>f3@#L@AR3M`^qcy&Hs_S(oJjsP5OOki^w-Jg(1cW_5-Kl)3Zudk{g|szQoqBLF`cqyg_`G(1}={WiHa{Q4;?HzA0m75xh_4 zoxXBWZ<-W3%x8`(`=wG9{~Jvg97il%(Zf6+EV-ziE!&$GOS4qud3~-Y>^kW4r2~*L3e;SgH_;b2w8dbL5nE!E@-jFs*)~ktlF(c?D8I{weZ7>iku<{H zG>)-pL0+E9o()r`(j;}ODxTD2TRdurR|^4_P@S?4GcLs(zlM^g?Z^Vy>G=H zHTMeqnV8>%#{1&=oAxl6-1)g)aK4fL0td{oa#pa?oQG~JeVwG%riTVd-x-_F&?iT; z#pbEo&BbO=FjUvW?cnlpV3vRH0B;1&_TTDo8eR(1;ET}Uz#baB9U5#1+a_JBLz@n> zR!5w*W(Utgmv&_MI(W;fLGEDVl}ghSgOp$+eU=2?HaxBP&j~+a%o78yQ}}EF@e!poCLK%G_aY?qV4y6eH@6SFfcuTPB zI9N$}8-e>YWo`hzErw)mjZVhEv$U<0xFsTk$k;%p&|p}u!H{&>80nh50~@i5t+*$C zM?}|&)aNDdYtZc>LsDle^d~kN-FGmt*}VpT8iPU{TUlpH>dZ%`d7bh4TKK&Nyouf$ zNnc3%RO6-T1!wqUXg=tY*2cQQY0W<|p}9nZTgGol`9GBZi!^#m4$~X`iT?A? z=uPU#1b5h>0&TSASk*M@CrR2%in%FWts|;t#`hxi#J_{qyaymBiN3 zk%!Eonu^;g;~aQ8yRHD5O6i1GYBaK&@pXvtbq2mho2nYA+r(P_VT~{7l_Bc#~skzTm2J0zabjAMaaGzmM zC~e$G8{4p1^@UyP?_#V8407g%jI-0&fMg8FcWKj8tf|U(!K?J~ro|Vr3nw%u4bJb{ zX-MrX@jq&`SgRP#X)1b4|c>mhV!A8(+o~M_Qw@Ui{Rx*xa}WNzStA%4K?XC@MGEcC4HX-d}rZ_@U5+1QBE~JMm3CYZ#HY% z__Cj-&N{xEn4g5V2o85=fqQhV!^~;IPqqKdf$~4%-?GF=nfyBrToD*#9sEof4vBeE zLO%$8u465!jd3IM(OuxE6q{9|WbZ%+c&^yj|wWq~18ZsWbLjH7CEgdVdf!t-)SU&okS zg$<-}ozm45qXeJ8))AQ>+G#IwG`gOEUu$w6_>g%-p3fMcV7)S-c?4xh8_$qN;Qg=8 zn<8(CJ}NvsBtD_+r~C4ui`tw8jgM<*U9pMr#5iSrQVE>a<_}%(-U3c!9%?}MPN43s zv|ak<9JKs8Jm?Je@onH`C-h~9Hw#=czx&CDjZd4yB>h>^3tyJ!FL~DIvTvTl`r=gR zYoj*4@#TP~q&*Q@mhr8PJB_aNv58)w(bX>SsQuH{0`-3liZWj4{1Ef7?DY^mxj%gN zg+b~}Le@M>8}HR#*JZHF=fnRo zxJLco!6oN|f799Ep|_Q;LU@4apR9pYg^JNXXDYcz?oe`%&Q-Vn4cb1e@&Bmi_B!2n zSH^&>xA*qr5TD*;O+HF)z5#j-LhIs_qT?;Cvke^U<-n&Yr%l#K;n}@${gBrW$O1c0-fNjx57^yGc=-tugbK&esQRJ_WYwwsiotidaf@eW@Um_?T`qf1!OC8ok} z#h1kezm+mYmymL`G_eI;oUwapni^mrO{A>8x|ddWDeL23M>mzx-sf+{K6nKCEzgbe zjJ_q$&+*K8?;0GUllO+hJ41&<%FxmPM+Ivmm!#R(14l%EleQg(jw0*ddszFo6Wh?C z=;yNtj=R%b%Q$0={F~DBZC57qweV}x7r*j&D_9SHgqVKeb}j7Hu6ua?579qqqol2V z+SF7!$KWsLySKs}sD65|Q}R}S9qUx+x6*{s^5%8nxJjb+H@wt1|xc$qu!#fbEk*qJ)A)%m@3 z0MoFB86rQc__wew7~HKW+e+6{p52jA29Ne`M1CSph_t7ABle;7%A3-j>M2TaEN#Nx z&KWbh>?SdwvY|2WY{p#_^B1x~Icsocm9ftAm?$Oah$BDgvq)D*x(3F$_zjn3={8Uq zBj!c5?Eh_8DDe%C{54av`^&oWQ!n91k);I7T>YnA{+FJ#8zrqv3DQ?@dY3D2R^P4n znT}(fr*>rL&j%-Z+)-l;xQWM4VF*4n3HZ_^qAw+(FD2twm4aVYv|n(g&)IsMn?}Qk zJB7zLu1M=@|H}}~PCVPLESLx0QvP)Rb{WU;k|EXMZ^?g}t9@gR9a4=?d;@ZAEqD_9 zRVIFW<@kW@#WxWfIs10m@4I-|ka;6^b5^G^q=>x*#976jNX$2FZO2%dLqC)5K#{C9 ziLWgFy=L%Te(kDs@xh$-M;)g5?A>lrlPx*DMUV0~QWQd)?^irg-Czoh23riC_X^@A5_7d9i$PT*;N zcT0MwG1cY7J~t4Z1s~RUp5u>S`F{GE(17dMhq>T+WDoJjWzEtvh&21aiP-ZV#gF?W zX?c$S@X8OkH6E0&M>hyF6baFfNavOA00{zUy2g`$x;;qnEj7DGQ9#J-Q=4_uYqu)2v;tnSb2ShD^zeDNH^o|<8X4$l#zR{Z?FB1SE7{PFKI zG_%o4TNkxqm*0J2xJH}pwzy#13ekU;dpdz(=_k{jXW>s`FDP3+W0W!>Gh>$_JHwiq znIY?7{^xeZ`Gw&gLfZz$DVrN zxN)c}cG<&^e@Hp1@2rJ>ZUVRVOh-ly<9sQ8AQs@1ei7e^Bls8|MJ8}x(LCd?*lMLsmB^Nn zHo4Ox?Mb|(Ju+5UU)TJkKPSHXNqnUbGaqCDUnV{g`Sh*8w~KiJ`qyH$^@UC3?7nc= zuV|XF12`~rC-(g(J{Q}m#Bxk#EF#VM1TJ`Y5j~7wS7x;3%#$5C>E_^j^EnVb(v&?DFC|jhw8Dj2x ziI{!Q6NgBnIqEqE6VTQQDDl>FqpD3p5-~yk(DvWF+5{= zIsL_%1=3%;!a9KD$^5ReLugX^jk7-d)#!Nn;OAxV@DVnL{@{rNo?_0djKCA=6FKWu zhhsi)%>&!H|-|UTZ1Nbw7^OfLvu4#CN5xhSq_;+MytZViO^Xq3F)y1K+zn zk$N(zXD?$qQb(lkB5jJ$?*9ZH1upid-JF@8Gt(-F^Bp zGJcL=i;1K;#Iub1rJuw)z05JYS$7ipwle24-yf*hSW{KJtl4rLzHkD*pv@_q?lCVy;^H9K>5YyM%US4zzLo$QNJ{BoY`r_AGjXC9aHPDRc| z4-D%9`ugxc^Pe@xEZ1a)ms-Ly!vJK4UC4vT3?d77`7Uy5dx|M&u5rJKUhpP*!JErR z%bH(I^OVupQ;C6p4mjl8ACV`{B2N%cOWQXvbfr5Wb62U=y%?Rf#FT?Q5FG1z^-#_< zRW=O0hxr+rlKXG46-ycix~}aWS)-Qk=%znGC#fc#dc}84?EPGV9Adi99gw|da<4rFRAE@yG$gMsGldjOg+b&s5^$r-3_Sg%IaL<}H=^=`-}o z=jg|}>a?NTiX6VW>Xe}$ao=DVR;@~oPv+mV@3hAg2V z6Dcc{H+#b@a2Ap`0_S1oI1{k7kEu&H-FIpGlwI}=4gc@N4-tS*sWZ3 z52p=Pne)WPwGx^DUx`D(+n*T|<_Fzxrf+Jknr%$0bi7@k-Yxqu=T(u`iHu+cM@8KC zhUI0EnVe(l(~lWbG&v!}IN2+_^6}QH7nZeHVwc4ZoxgXK?{nlbkrj@kD>oo7Nc-E6 z5s-cNBgdS|7rlb1uKcLIX~jB2H>d-li)#QCH@ULd|8@r+%6 zzHNjibCnzM=S3c$sG2N!z>Gd!BJdpsKJO&#uSI$~C;P-?4~0oxRWCGql)CgaCEZpw z9GV!x^=IJ8%hr9x@`mC&1}@~Rq{HkPZAWgf!BgsZmOAp05503)m-%kEju7mnanIEU`v9o5Snk!ntw^lCe8D4yRn{Eo1TdV$4*q@Yg+3&&{OHaA%0g!UB z9ckr0MV;Qa6@N#5xZGX;9NvwT>qWkr>JI0j@4gL>f1{87&e&NMZf7fXYG*n7cPy^>>U3r^{6RSCY<4{Zk{~YX3P-CW9A|8@z9;{#B#HW$pU*{)hq((Oj}7 z;GLxU_goXsm#_M(j7(x;>>(oBKKz_so4|;7cLR&J{BE zU2ZSEa8EvZuN&9UyA+V8vb8>oh}z_Ax|-~OdQ_~%x&=-TC0w*KQ*K(3n#^`tDmd5-<)g8 z$~Y>zs2X4S9(`|oj6O3MD<|a}hZ^@}``&(PMg6}@x(UNGvXNcq3LPR#A~VDn#9;?8 z46O9Q2ceC4ryA>%{ply!f0>PLm#3)Oo&w?ZwbO>c>oYS%ca-nid(+-ZrUYjT9 z*7L57VWWz^XmAOx8&<~;o6WyYXi((pf#vS?^M(!d*^m=ueAiZ0?#K$`DIYvZx%22l z(eda%P4^QRBXgY4vDDY!`buO!rTDg-LoSkaFBRI&L=LL!W3w#C?Xg4N|NPgRHZD}E zo>-(*ZNhe0i_BZwPoAg8_vHBzc~&iSSJf?YR|$=Xk5C8e6dTu5&PJu`aqODT8({@+`0e{i#XelE7%G>xE>CCP zMrMpgK8ykn`162|F7Po0{Wu7pa6G!_A&I4OdI0`$^nv%fUD%6~Dl4#Sj-`H?D-J2l z@3Gj0ht%NDURPgQ;oYJ81H~`~zIi|6E$2fiRbq3eo%k+pbr{7Kl~SqIvq+wkDx2XQ z-ah^D)>S>YjRUvU6R`z{?Z{8j7k$$gZ+55mQ#lXJGBct zwOzIN(y>b|ck21X-l5C!y8ryuP54uB9>Q1Pv2R^RM)sd4lRWqiY+VZNJOJ%10p6wb z{{!@YDX`p+>@4-1tref~H1wWSZCzeuufIVnWySb&mEG#!O#4JZIGRyJd2 z$X%?fuurU=wUnvwMss*wW#VzAY0N++IPNB;>IOIa#E5zB7|!|>`DLBuYVz4R*T*7# z&$r%qJ(3W?jZU+L;9mH|o9O8Z>v-m3&O)WXWIa&6o0j2|z}>}VC4NPvY8wJAEi8)n zrRS-R3a_NW?(ab77Mw-a+{AZKY~N?^Fkma^{HP^S=)bBKcURW$^|cl1cnrRU{D=Hq zQpehpjXebo?AHcgCCgcZtBK%*{t}#ga3^#vz7pW1sTWShhS!?LBr1V%rAn^k6I^tX zzJ_&Iea#hL7xYE(ix8idfnmM7jy0~wS?lUqhrJ1yCt=?&K$c<62)Rny7SZ9CGZt;E zvxyx~=5|?+voqJYp#zmUP1a%My^J==8ZG*LqRKrVo5O%0@B>$5?%#z@){Sew_-Q7yI;APU>0?Z@n;;u?l{K zZ>TG8>RQfv?K!^Hgnh(o-g@_j(zhPDq4%1r?Oya~)-n~=pd+yLH-~=7oFRVgg+}Eu zTe&rmw=(Y3+xX(0rT^Pk;2*52d)cqi>ExTN&6|*UI?&6VvF`P@Soc5LjjQTY6_YQC zaVR>ox|nz)HTbMqeIAqb`Guwr)nM{LHE3q7!~C(_Yu20p%>9t6pObi0y;x2jGrp)P z?Bh(?N&45hUgdgQ4Vp%>M;qLl?lWq8%I!PierAHso*HDDVMa&GiZ#uc%KvQcQ6)Fs zJbdNfW~^L!WX6w&Jv(ES@^8No-F5g{Wty_`=nRutIdvF)q0und-(g7hxm45M=L-h= ziDy#0hW1p`o=)Q$bX=>C^Bwm#CM&_Be06`bg}ds0#S+bWyoLF(c4!xJ&-zAul1$Kd z<8q@$m*N|<^{;C1)gx+9_mTOp`H9F}ZrPn5JceyX%JqK4S(yjaVD&4;fcM>eZT&Zb zPw%^GFw$2RaO$SrrJvT^nAc!D)yQ~sd>@~L6HC|UeP20c22bNh*VT7^J?Ws=fKOso z_4Q7-CIzJv=8->QABm${2T`GMlq}j469f7Yh%HUUB^E zI}aY`eu6b=4|&UD-1zsJJDpj?ej)DJYGOrBqc0_9r1S~rY`W+NOQ+FNEO+GmTZ@+s zgue|NQZ$0J%c5tlQLh+MoEbf)XvF)x8+gwcQXFpxzpK34h7_As{XJTpSsblD&r>bd z3VhIgw0rvW9N+V1@w2fu52DS7)Y#6_6s6=I+8km%qK@YmY4ZoPnT7kr9AK;@?xji1 zv3S{^QMllWnU-kxD=z2*A4~0A04MZf<~@cO-?ILhOupmSq<&|hI*=GvaT?sF%=gn{ zFXqR$@ZJL4#Hw?dGCxR?F6vkf6$miEoGY%u$u2Nn;!OnzzfbkoZ$U=+0vqhf z%-`3)a51z^WZ_7?@2e(a11a0257*F+6UKqX0{=X9V1<$(Yhv2F1)J8bYw5=p`f<&O z57O7skNfDywe;hf5&L*I@SZVbE&Zs!tGwHWtfe2dclvQH{V2~`e7_l2`POMT7}We? zw6bkHFx?IP-OajXr*Tm6UT6pX;?{Z8xrRC`p_Td6*+QN3sIw9n=2NHi!942J-&Nji zL*`MZ_D-Gis8gPaJ!Gw%k>jhR&UxT-&6$VSuTfL>iv8{cey{9p+jaun&F2hc;!Xum z^8Y0NLyVu}qu10wKiXG+61%wgjtbt_lBR_;Eu`6rZLewcs`@&{?OMv3PFZUy>p1B@ z_&T(0H|HnMW86r6Vkeh#2=0bX53zPKP)+gG_zTaYyO&rvuOt@#-JN`I1NVcW??bGo zHnJ{u0y_RR^jwjoY`dN@JBt2lffh~bD2<-iLC^0~{+4CRsYd8yH?-}Amc8mA-&9~e z5#xSkKJW9X?@{Rd*F4WFzq)H`rn0pXdbyhOt(?Rba#k%}KUFpRL@p`H+=so`Qc+5b z1P8EG0P}2MbJW(=GkGT7EBwV^?UXVb{Ke<)Gr#uc*_F$u=kAS(8!vuT707cBJss<};%iuq zEllt}Z~$k=s{>hw=N(-w)rvoRD73BYNWLa-XnxiB)R$f@^EG;2oCZL%)LY4ZMp8iJ%a}MzF^GR z@B=_zEUAQM1UK!ZD`u?7+Ljf$d=T^AUe#AWy*#I@g?iy}i6`^T{uB7f%^wVnYWZS2 z>jo<&9Gbw{2JRq&^j0a$OIgkFN^rV-XWUf`iln!65(m44Lpim7jB%}v6&lXXd)arc z;T`|4y<=6&>JAO3=FY}UY$(0(DR?xEbmOmQ_TkIjX=gm_jA5UW9sOmB>Sx`evwS!- zOu3Rq`Yf3~lRlF82zA-L`zTrOBWR$Nn5h3@Nc1Iw^HcC4JN~f9hugI0K?PmJGTC~P zx(^%U!8`kJNrPcElN_h-V4qb42tvFUHRZv>1<#;>AXhA`3&%O zh_N{coX3IlL56kpH^T=$WK7h9AL3lPWPWVN?w7+@wZeD2Bh;pO(9nEnh`vo6U10WK zLm%H9uWZ%J9^C0=J^dK?uL$?cp>V$(qhD^8@AOMiTqHfP(2vLH7x}l8de5M1AK)J0 zI~A(SQh~2_9{f!D*U9+41wM9+@hmj#f_7JPU&R>bOpjA0+L_afhm{jA4}Twj1u~TI z%IA?!uvJwE4Z7e-5ju3$uCBL8y~sN*){Am3-g&T?aeWMVM|@_HVO$m9;~4n33Vcih zAFIK~7+~o{HYk>P1zDhyd8vpxruUK!o+ob+bL#Y7vOy(tt9&a$HlXa{Vq}Ay5qs;4 zkqs)44Jv22e3j7s>Rk3?E;BUEXHL8t`1c{Z>{JI;xRDntSu0D|-(JRR3%q_WbCc|`$wOXh zKNKo?pRu-@{t(@(Ngd=W2mkZ<=HuI%(Q4CK&N?FYMK|u|_@|zC{54c^6*!p&ZdN&o zpGex{q>F`@SlU9{9s^H$pZ-4my>Oq(9K{-4NgaJ^h9{NNkHlKNLO=hb0)DKoADj*9AlsY{*C^2 zpxyFby$QRhd6{Li@OcZop(xDf3*qy};14#&N#Q7^WCH67<=uSTq{T`Tz7yf?q7Mph zHz`TzcB!3-wHxaNJ|+In^G`2#pMQ2@{u@!L`ERtk;5E&{hZ23>W;Iy;qVQgG=Tz|F zeUbT&d8-Ke_A+mw6E zi_9T-no6H{8qLL()RBii*erMji=np%38gC6(aU2YyGBXCCk!k4_!$WvmJu53rxLu|Qxk zX|U++^|ANEEZv$bO$QUIqczY-CJqh$S*kwC8lCWF2+v8(|v% z9{4>3zbr%^`#t<}-HrK8B4gTzvF<~>%X?>B>x)Cj62HBM_!;NhnY%*T^UddF9{Z5- z@;T!sjWHthlSA8N4sN7vR|(Gv%RU;GiO})r6S1nWbPpuU{ zQFG@sWbCyC>i!pL|4HQklcYUFUwn=Z^lQT)_K*+Sdk=kaH+`{>zWAJWwisf4gXjzN zhv0nrVm^H_Kc>dBmUkuE-BR;orKJwMT|&dZRfBbh75{u}0I|e-7Wrd0>-2TBp@ubE zpR^%Zz1~L|R_ZC{UI!0k@7k$4^lvLTlNg*PF+w)*F^i6ONxuSak09-nYl`6?fF^yc&Gr!<FbBnJ+lcSa3BgFj{n?X7AnDm*2{v$S0aB8O7 zByzFnxafP`I&LL;#r$6LnCQ5b%vtk$&10e?%C}19G5WlC9`o415%1T}V;=J{kIh5Z zTEje6%sj>%-h`~L&BHAkj$*ZWYz?$i&OGL19y`H2)&vf!na4VetLm+pd+IyTv)0fb zqN{D8pJX1J$2_)%d2AGP_5$-5eRc4C<}uyY5!(rGFKGsMQ^WI^132-!53J_fG`3>(GZD)%2l(ovqAyk5TVV#*-I*G#Ebd1@&Ex{{6pc`}_E)s^ftlzjrr* zyPFUaNO%ai*(8Wb00reyMK*~K2|<(?A8J(+@L@v$!KaE;Nr>9S;6oI()wTriA&FwE z#g=W^8lciZ(F&r~wx1dhH4vZh0TVUm`<{FEvUiu8fWP1O`^Ua^_uO;OIWuQw&di)S zbIxN-qNi*~elQIzoc&Jz96ThU`w>I8a$Y+iKsjcLd~;rmaZ&)-Qo zIv@IbNJm6>r_WE&`Q(|bsiN1s1`UbbufxkciEl#I+6TVvd3lxUM*hdu-3JZKgeOJc zTL6A@_#T6uup*@QErcf*KnFA7$psE~-As70BBb{{4=u02mm%;Lf%}EX={0IxM^ROs zuJ3s{~p;;EaPyARF;2%F$b0Kq74sDEqc3vh|xbVv?3%|^y53AlM{1UDA3BQE( zzWAb9@XJE@WfuH$pUy8iI=|%T{9>>73BUBF_bt-(J}bXqf5QvUhxlbS{IV;g_X)ok zw4czC^-xdA4tOJnIT5|D8U0A~?pn&mQkD%b+z!lP+_^heV(a@K=qVAL2yO%~GpM_m zdTJ{Bi9Thw3*YELYzh~4wrelG<2Tf|h z(eRyA0=Ljc0ra^T+K8K!+q44zp!iQ;$9I@8>(si}p^+8Peq|D{5VMMI-BAkduAyE# zv9gPR?Kxm0C?mND`uo^9CTC5o?+cY@t{6pMBV=v(70=@=ejDNO1n6uH?Fo;I|55yq zW8iW2DMEh8*Hhya$>}!69jC~hbV~B4$mM_DpVxUKxcTS(b2|r)5_@|f{GHJJDc|z! zLHJto>i?5@JdNLLkRv*e!vjU3h#Ud@6D@K4fq2 zA~*3Obn5%*GnFyCwrp%CGH0Xl&VY_a@JNh!R~+v>2Y*XD!r#PBcP)}~_`43CG5Zjm z{yF$tp2@zD;d9-U8XpsaHAV@{rT>HYzXYe8kC}|FGbKJ*#^vr%@PWlMhw{6P-wT=V zTIN-sOME=S=SA5vm#o$J$5t_y@w3L(t8n_MT}3Li%rTJrrV@h zz)}EAZunH56+w%$SZ@S}Ug-Kl#+ShO#6R9j`_EJNe%`5zS6+UQG1=L$vsn8Lf4654 zepBQYetOn^qbzNZ$VMsa&4!JeW!SK8WLX+Etjxc$w(U%XzmD3lvsn9Ah1Py#X2^zJ z^~Bg-Y}mSx4SOML!gKJzs*nxq0=^l*mvw}FBIK4E`V(1Ji_C>r1AfZlDAUk)1V>`S znsX*Ltp6+SECDYC;KhY3BSx)D>ZO5u@?Yq`4I6e>Y8*5mz6rs?=FIOp>KG}q-EjV zMf&>e*4Jn8mA$6k|HMMp=T-D8eu`bo#&zz3ca3-A^|iSUIK;;$yem8*yjutFE~I=W zyn6`VHSr*8^L_BH=t#0Qi~U~re?2cJAGP0KOO0b5b=bkFm1o>K{kl8SKkU(Equ?%{ z_ba$_`Uvma?O{s1i^Tr0$G`EFevTJeD@q3Qj_jA(=~?32l(TKo&xUvP43&NF8f@Gt^`EUDAZn}n;M)u8Kxkfo0&z#h<2QX9hJ^V3y zG#SXwRoL1hGq)fo>d?ut(dsJT^FscMpAi3JbGEwTrSg?&o#n_Nkp(r_ICbdle+6&i zC#n607~-h9wfIbQxxt#ABf3#YCsMI>1W#$isJy`YCeGgIByQpBo{i#fZYO65@jV@m z36DM@`}J#=N!*K(3n7X3zQhl=hIcjATm@XnTq=sMi*wfzISmI>R(4aa9)p$UHFEv6 zFF!@k^|$q*jPX*oZ3OqFt|JCzUR=Gz8Y*h#bn#G78{&JLa7EKIM{%3Sq|ss!a-8LzcXV2*0jsBGrTjz6+i%Fw%VZx~p4Dhc zSFz{Z{R**C61TN6k2s2merR9shyLiND)hdzw3$AABP`*GgdN1J7#ccjgd zs5UR=f9pK^alX|@n_EKfNSiaF+B}Q@+C2MlP8!%d>}u#8X)`CP&C&e#m)Vc=(LUNN z3%w(4rbM-w#Q)aP4Bbx{P4i#((dL#?V;s_^64mDS`Ejp+((;LbHn3&JF3k+{BOU;zRi@R-p9G`nsA$2qS_4dzo3^kZ|$SaTuYnJ zN443=|HiBB$N5$tZLYmKJkH0X+I)on?N^2AQ)Fq|nTc05AWOATjm3?~Q;~a$zfh-* z*3>NhTf^Vc$ee4#I74&;-{iiw>I?@n|7M&WyXddP&Z$k^#6U?bPufIhK)c5Fa11) zyp@_bRzH6wIo#QUNb-N`2*`T9_ncF7Je8q$)i`|m9UFO<81t|#h5PLr zBG+sGr@%6qy$#8^PTZyckRwpbd)`Id@xr}B^X3@u=9Bk2hV|{pZ;5BUN$t|kHe#Cm zi`A|M^iRQE|4>|@1O2iEeaTJ_5d5Wm?!XrSK7N%KSU^l*+{b*Y?xLKp9RZCqzXG$I zJ=7NF5@$wU#`e5`#Qn$qEOM>yamElU=^{^nn_L2MxHfw zKh4n3^-2DT^s|(Woy28-LyX?Ad7(Gt)-8`+n zWl&yl%aA6K56u692BPbMo04>=5QUHT+3YgoyJ`5Ki8O#OzseUc8#nXVcn~hx!l2AN*}~{HJfwV z%AA(-zB#8`^NcpuXB%@`#hkWS=CqYL^^wnDC}+!QCuiq8t-c7_%T;|rU#=0e`7trk ztJE{ys~pOdbj~;nPS}4h$;~B(6F7aMuK{COh+YN0c;K5=r37C4A}@eFSTXDWl)yc_ z^BUvkf1LcE$^2&%hrgEdB5A}m9VD(Pn|_)&TPo+<7L(Uba9)E=b&&IGlFP%7f9Sr= zi8|faabMr8^75$_uK2oAHSO(}$8a~}k(B|r%T>4QiIl%-ouPnaSSY);Yh4VYI!tuH!;4V z50~BR>)gUV$J%>*o2nd2piI8;@2$>2*JP|Sl*EdUpIw!@fpO)A{vUewzSN2rYoAbJ zfQ>Eb_ZjOhVA=VtBXF8yU>y5F6`ujmKY{0U9iF5L$?NB4tUH*yos2IIpU159xF==I zGx?Tz`}jGfY3C2d|5@q4CO^|15)6Raz|5?bjo$k=HIr7ZWbgM_1m=o)Yn~BfI zy(6dYAHck8Ph9;c#C4wv>^G_|<|J~GSc>iCLtf6ozCYaG*EIp( za6Py<92fcxJ`N8I{dV(vaOigezlVl?590TT(C;DOZ=O_vWa2C81pPp74Fh6nn%nKovYvELP`+~C zGk_x-{O$n1LQ_I7`#O6{IG3m67rRu?SFscLJAj}4QG5+Ub7n)6uirUz!~;7{ty|2T zuL9>ALg!F#O$L8FGjaDZIk4rO*J#odbaa&|18kMxla?qo0D+K-$sOLGjYm=6vQ z+Tw6v#TIZ_7Q&%Uqbcq>p-(s8LZ2NW`jr1gA^OyxL7yEV`qZC==u>|NeRe>fI}@t) zc8ZwKor8?uGndLUXVasa;NJI$)bERK7lU_^F*@D$^KJ0ODjWXaqSwRR-=ougDs-F~ z`t5;^S00CsEBm11j1V2u#>}cP9XtD=<1*$z0Y)d!IQcY3Og_8z6?iL`%*iCp-6v;RjQa^Mc~X z5+-b*`V}1q$Uk>!sl{U|nj-@U%IV?zQiy>Fa~!R^EE6sYm2C(U0DzoxkAA z;OY81;x8!0UqF6rKFWqtcw9Zlt3MO_qwRm_L}DwvYxE&y|Di0)ZRpIbPr9$5;TMTl zakpBxmfTqE5BUpj$x{L^Tl&%c5f*J+&4IQx;rl@bX1x?aAXd7BjSc(H;~IJ ze(D%cvNxfA05V0Mw|+5jWP;dooUeKexu&Xwnvd4LD zM)s^2q#mwfjqF~29>po9WyE~IEwS!u~RcWrQVZ0*UdWFbB}hi$44E>-6guc!nxo|-Yc7W zvPYfh2$qqnNS*2k=2AyJ+Y$6-aSq()2#SAJ@{o5gcYzDeGXrDeO4I&I>vX-L)oX9$ z>vv6z!H2F?<^|nex1r}`s@&JEv1h>fX6$G^XBhc5a<_#4mr3qM)^gE%wtxd=SAI~D zx{2Ud@{p7`bhza#yjsa`-^m`gGT!69!Vyp<&(~FsVA^<nwBx9Mo~#;s~ZcRC!T4Hhp?*<@7YpAO8cG#Rle#pAK{SGXG|Qb1b&e08Oi_!tNA& zuc}&;`g|=mz2!OkofWILP+kb{5qB8>Ms+~;$2-v98>_jS8eA9tEWF-UF?PvA&V1-= zocCsBwOeQt{4<6@<4O#hse`?&87GsE@w~iEl`j_FQJ~hO&Xlv?DTcl$=ceP(6Xjhc zD=!##MP5K1pBHqL@?S30LWMa~G(@kRm9wZlev?gqvf zXzW~Qt`=Bpm*s3)p}H#An=WZmIwzN-(}~?m98-}zlm1=6H<$gCI^Yw!(k{*eUbW&v zaOj?u$1}C!6TxSJQ7&iUzC z2uQ4Sw&E_zUNrKOczhGt19qj3L62XNYusC`F3bx`-ZxoaMJJKA@6+3MH`51KaLRo- zXM0rmPeX<|#5V*F3Li?|J$Zi~buy$39u(W3*uyx1PkXg0RmLDNda08R-w6*(&Vn)2 zBW5N}VBCV<<3@JR+>-r|Y;1M*z9)7N_XaMD;*c?=@0M>alN^>p_qV_w%)xxdCih)e z@JEHs6=fou81oEZY=cG( zd@cZ=+Xc@^ z`2g9g1Q$~N2|RA)2^mX{q7}`A2Z+fnDjcvQ)ugxk@Rta!vEQlFPUX85o2x>!CbT1T zE_?K{=1Ds$coCQ#%)iLfGH5Xu9Az-yPR1*8LgxG_*LoypwUPHr{DzYEE5dJx zTor#I^Q7P3AoB0cJcLb$eWB$vb6?K}|v*j*FaLeS}ZY3rrLHR!Y)Rr^VZh_|@IsK7$lVlEi_}xhR z;_G{s+++d^XGsDa{?^NOQYNqkLjOOo)Y%j&yMTRe^F44q$d!1G=LwfG@mq4LufShX zL41%1>7AomEgGgi&%NNS(y4E*~_;fvG?6<^Ih{>zxg;(y$? z6Z(d}w%%dTd7IlAbTg*?8FBURXT;YZ$QTgH#Wk$?62>C+rG06yVZrjvt@J0dxN^Z+ zn-y1nP~Aa0@Pe|#5!ATDy!}3h-Y*Mc$#)7l7p?)f^Nczz^BmAamZupWZoNKF^nj($ zF>lbqpo6^EdOf;_;E~_U2NQek9MPe2_lCr4i4RuZf0H_rFZ?ic-yX+ZxwO$jJl4xQ z&!}6?N8X1v1_^#{C*P>#Efu_t;rxK$?Z1q_s*ZKC2%6^Ziw^p~J99w&%FMX>>dbf@ z_7vcjIs$LiKLk$(yp?hJLH$4QR{jH8#Ya?A=Lqc3aqX(;0IuF(M&=xaxsE=6#d{{a zYxphj&J}ox<*X;LwA}nQduhThVA6lIp{L< zCf57JG3EZLGYNL|scCO3d!4}~!Sg%L;6VBQuQND6zT2F^IQc%{)O{98yE7=Xu6*na zYUr5l|Ki@w-)qwZ@5<-Sqj3%qJ`nnE1pm^1c0c?6wY~Yee`G$sab<5lYbi3|9iwa; zapcN7`9X>G)&6UgWlGt9^Mi7hLTfY1syVZ)wB-krrR;!F_P+RA4&>`FY3)W?zLd4+ z>vXSuY?Q6X@1lI19~8N-eQuOFrR;NLSjZ1kc6rzjQ@Zq6Ka4^w$aTb-%Djl&m)H!t*?DWwF$Y3)L%SJr(1;abGkXx z+kO2b#2Uq=O;1~z^(yyVlT+w@ctLDgX;*v%((czwl-0Ko8>){1UTP=*NxPG}&T!p~ z&=?L;SL&^HtkLhKk@sZZ!o0HuxOJPt?oLKo7bW(qj6SE)&ds4dE9q0a{iH#!kTbNF zXXYK;jG;@~uA*#QsNb9ESH^GM+dZ0tep}4$&bb5eAtqw~CV~4w;64W2n|F+`mxugn zbdKEgO7+OjZ#-e5!{m^foxY`yba4C|e#19`wELB%qBs1?{9lj0j-1zV;i;V7R_)x-R!xri zYI4lSRZf4|`Rh$WYwa-^SG2P4x{v+^X1ROr9@>D%Cd$~f^tV!*$X}6t@UDjsQKzW9 zd=vV0PCgF}&m_S&ed~Be2G=l#_7!Tj;6QlnK&FAG{mkW-5FQlPPFc@2_Q@_~o*qN?-zxJ3 z&V0c3H1&*pAjQzo9BAoc{LvRR^=vbI&{7wJ1h{je> zPxAIe=j;(3QF6A(TnkS8-=^#P(C9N=K41`95ZsOk&1(yCLF9+r4V6QGqFajJY%+C@ zSY(BjCKU5sWW^B+-%Fj9yeEABO$a9q;I5}fX)2(s{S;-Iu50ycxw3tzvTPqX6n+y~ zkrk>h{3>N-)W5}2HiZ9v_LpkFfvjt{fh+OF_bd+4-43TH}bxXJD-GJ zMSm1J(f3^~{Pdy)CXwegz$Ei3uGIC3*sL z^Pa=hr$$p_LPjP4aUOdjoWB?@QNC$md;}njb91#uQpaS6eOgVD)W_?^5KI zddk3&Vtej{uOv3cL7Y<_zE*j*enG;>{9)oR_Ih?QKVEz^>DcU!#B|-yr9offd&|Hl zD)lpq6GkfddUW3x{vO9L?DOQXu4@-VuA+-doX(M>>$-7ohvDlr?Bz=OHeuO=%q$&( zJtcl`#x4G_cIS|sgU}_hFi(bKFH)L+3jG*xADa(KbaGYJ56ino{^{iA1B;MJVhcgH z?arY&<;Cv$8S1c2Gl&_%7Sr$RI0Oxvu_*=En*L&~e!&X^bvnXsiHJ{`hmBwMSYGfl z_V3}-H)7_T7hLba-;EC>9pBf{yE7b0u+o?A*+JjL5trP@KEQK)t_9wCzQf8FVOGZXH?E>GWk zGM{w`>G;8kC+U_xcS@g}H?Cu!{&_yq=gND0->2`*NQgc9&U)Utdtli;%J*i!_;8o5 zrQaLrS8!IxISkg!JrYxtgH2gM|BKyP-7aFjx1{6+Uz_8uZ+SE?I2qZJK)rd4?K5Os zCh}M!sDTf2QokBJz060> z;8YREvXc36;{T6v`MMqHEz{LPU-uFA<^>-o(H#=%Eu z!_f4J* zE}X>1#JCh-tprx3JI^dnQW!_fhI9Bo4_FoI&cnx4_89)BP??u9hpIp`O7}#{6zs9x z%7`#a%LQ>K~w`<4Hjpg(UNnLb|R5%Q_4Kxrt}G;)Pui-~-e^2+*w zS1Dta?kuOG*LQ`!wWrjkR)u7ss2rkv7z5r z8E1~JCZ6gw&Oay(zOH%hABK)2=h19FCZ2TN*I~k9;K{mf4CcL?v9DL$p$1A{GVTm5 zyDc~HmxcNrYF+UAMv?K7R|0)(l8KYAF50TE>)I}C>v6t78~Zmi$je=YEY;R>@1%;) zoBK$ub9QgkIHGj|GjF2Yi_{Y8H&D$oR3|@IV3M@T=S{Erd5-3 zo4EUIC;4Y~a(=KGAMM7~z#=-6v>|PUU{4a*dxPtF`Zo3SgR7(Ubg}=#IX;0`_W`(} zH!EG5F|`@subOlJG4wy~ZemQi!!1`e^eKT=?2`xH{sBBH6W1!~I$xUQHIy?y6HA%% zVT|3+8FJY_WlbvaKa-oynW;GKFup?v=l@c9Hr=4#a*q+;oeN&dSNf*8RBZ}tz#MrF zzDt^JHP&J8yMFzSxd!r8T6LdF{(le7?DP?V&Qp)UucrqR-@Y&P$ds;r_o;i zsp0kx(4H6HozxMWu#Xp7SFsz_Aw}-nvo_`2Ei%Xdc`wEqb?k6uuHf!AFvSH6J$vI_mBinwd`VC!c7&|mOY-|Vi$7wzsSVh@(J zyZAAO++(P82|u?YH;jDj$Ldhg@FIOk!L+lCw96Eo8OJ!D2^C$ z2lvJs_N4Hkj3w(%gI^n~PwH%>E$w0@khW3jO8Xlh>@e&ZJx{7%p81qO>$Vq-wc>Ba zx1zW=Xiqts%yNx2Vk`Vuwb<8%jNMo|nmgmLPfK5C?ReeS)ySFBukhK{@EjSlv79n* zY|C_ob-RW$hRnmp+S7f39q0@9A-~uYuPDRbmwovnXnFzlXP)dMmjU@fnNQ9JSL7r^ z6YR%VFsEhA=_F{$#C2oPz;(t42Cl_+Tz_d8-?PAX=^o~p9B)qirOTfP%H`e<%oCU@B6JgNp{oyj>#nKSof_z?e9 z-DL(Ja=tZjQTc+Yt6T%>D)FHgg41hgvy}Ib5F@dV&;G&W&J%k+j{D=m-PI%@r+0bAbx4A@li$5dZv!1i~cBl2k~iqfRxo<1CkTJLP5J^B$^cA%Fu zaOeG7$~#j^Gk((KNH@kXi}E(^uNPQb&vN}NOYYVNW!k~{ zzQCaiSZ5kzvk%P$?uklZ2J#2G*YCaf2Qp0V72F^4x#+e#a^OsCvHecN4`Y@!N(|C3 z^0M2JG3f4rc|R3@qB4p5;gXELeSudTTE%nlr{E?PoGe0qVUH}`LVqrF8#nl@65-_HKMd|$@c)wI*gFH-{A1m^s7HPBdnwGm%(ZFo&s3+;6; zFM^k5;y)wK#Oc)6gB7$Rb~rjjvFy35fX;;%Ka<}J@DaV?L-*ob$Gc^lbRDEAzbX6O zwVP&g4z}nXUuQWoD!Y8dpla$!|03)C@ZG$4&Or=6@6G264cb|hl>6r5^FnmA%)jZi zWs5e6KI&7H4ReQ)ucCY2n?4Oc@6UaYTm)PfjaRd0b8hIuL?uuZt4t=(ur90PE1xO8 z|6HS;&xn8i6q&gjdHDu%bHutny z_Mcp@FMQX3N*p@cLU;?=Jcn4H3iRZX1(SRMnY)?j05ieWOmJ1mK71iLyvyOUZ1`+O zHv3i3nfvU4Q|Dcw!v+ zVK%64_fx;}-J$EBtUVvI_Q)Pm9(_t*`FvL}|7M?ddoC(8#hSm-lmj)78FIk!S3?d| z|CE?q_TKmauMF zmN)X9?1zkZ*8M5`PCoBEYrf;P&h1ARlzTnD z>i@&z@NURX3F{Q*zE2DCTHaID!AuM5gsl7Qp?rm0`ToW~6HBh*!*?KyoXDhbJf@** z7=Cycbiy8LbD_{PcMms#^K9f#*1L_H3PLoC9G_yqYQ$F_xjdhC^JqVpSoQ6O?F3E# zl6A3*HRJ3He4A=l{N&BY<|8js@RcAhW+XvJ_Xn;z+|~5tS>66O-y0OO z^nKQDxx2Ld7i&_7(oT)HviQt98=u^_buRk~toQf$x$V(s z9(*$>rvA#oF^9!}DzfK4Kjgjn9s0pH+#~uecO~R<-YB{)q1))T+B$nCUCCY{`{8<9 z|H1d-zl=2vzisJl`dl4dTicf#G}7oWbkmIW2Cd{TGS=769zt)pO@SwrjU#TKx=CP| zu$wvhx@S_Bb4cChBmJi|Ggq<}H1Qp+Bc9o5wAiym z_+83+_7F$C)`;CUeYI`F1{(49oF^4ut=Mz7j1C(d2HR?$mxYTb+8K|FKl{^3&>Eo?F`lwp#)!UPC?+*20w*4CawWzke zgCpDi($Y4%c<5Y$V?zP(iGC*M6V_VrwTU(bUt79Qy4Zy650tg9HE=5UT7f>d!o%E! z=0LlAw2lW2`Rf<|h@7`YM>PD{dGJ>*d}izqSZzPumi1}%YWV>DeMcfTe>wh$E1_#* zy!{Uovwa8pVwq1rhby*=*rzVe;bwCVHwSq-7heQ4RB{NPkJoZ8x9LXg9{gMqKbM7G zAbyJdoDUQ_lRdis@VpKAA?=HQ+!Z>vI|kjz;ODTdo{K$}iO)}yzJ;%ToflMpnHS7a zTK04}V{+o3;!GlXtfPT=wM60x@m)I-9l;oQOme4)f08v-&Qa}g@Lcv&r0&4m@2`75 z$*8|S$q|(NP6O41xXdeV+PR!E$Sz$NQ&^c=|DSU%RS8Ql9+iO#SO z+q)FMp4ie7hp3fo(qmE;#O-SFDn5DTp;4aoer2`F-PvVNID(?L9IyW4X8qq1 zo5XlZ@n>7lww66i{Ng+5*EsOY=hBBt?2p81m#%XJWnB?H(Q1Q>ALXFU9VlXdn|Wn) z_@EJi4<0VrhwWVRSYDtJ`o9Ewsgf~B%t;3A*Zh{>#Mc)xP8V=0-1)4fdp&{!{XF$5 z;_L9QKf->4)Eyx2JYl?Z_Ho|%5?N=~oj_e_Tl$suYuufCRP~16Dyz!$Ge}i4OdlnA zS)?ww3d0}vtLSk@`G#*rQIN&RN^_n~-=Idhl8fK`!Z4qm7HZSHBgL#MZJf*6D{Yw1 zr0izBU0>Hze9wr-J^`QNhmd+2x+V7dQaOL?dfK7KrOG@Bt(oo0JEAMeSX@sVXRjm% zsP?rqUB2b4G~}GdGvU=-$!kvAwaAkUwdM)&)pp$wjR(We8ND`?oEMham7K+@8FMETj-~S{@$XG7W(+=PD5sjyb<|bChHshnC)N9|GlAh+vX8rrI?_Aj=@A>V3I7tgj3(Bw-XnMBxKx+B8T}-GM|NGgqRa0I zrO-^X+t)Sb&YwS0R9-<$zgE#enZ$_aC%Nj%XZbear@C{S!$P@eNouU z)&72WaTa&7x%~c3ZsqrbX5ceA)W0^>?a$g&zQBPlKu+icK128n;&ZwqAZH!?i+MKF z5!i?CLg+seoJ~H5{8OyeVh_3CZCB{NtutcqA+hd@pYw9+nDcAe4q0tly^FEA$8sNn zmpqXp86)G&_U3X|1ir#ijFoqF7^#~*QtIWBV~^Z=@|$_e;=L^1GwYc&zZO}pjb%N+ zZj^8BPUi^Mc#%V{ibdd3=q-ggcg2t^j<(#T8vD3$9b#YSBKurC^RY*$`jo}F_~G0! zh11-MYg$^2YnqGx)U$`p*6zIPkv4pXa^Csx*GKNtSm{F6D4D-~vWMk2&ahS^C*`*u zD_LNay^l>IXIYTJUHiT?rQQioaZZZ=XTvP%(FaWQ=|N$jai`jCloP z7F=6(BYmxf*WD-OcHsx^Sj#+VYT-2KT%Q-=6)l$kJ=}{2FY5o1m1$Km%S;}THDog5 zVvZ-uT&FYVbNQCG+JHyik$n*JT}PoKV7_bem$Y#~luluVQ$x-P-MDF6YyubS)C}ZU zmC#iN&yZo@Qs+Y}e6okvc>! z;7sb25=(gtxgORKckmB+9~x;VR!U+(_N7%8@4F70MD~qB`zP1{dls;caaL*2Le{-m z-}Ou!$2xK$>xlT?$WKDPW?$FyJI2=C&zkcJWj6h*vya9m+lt{ z)109v*~P~h{uiY=g|+JyV$d3BzY$+WIq+pA;g@3#DbIkufz>7BWL-sOv#*XEL8it* z*Mjd`!H=xDQjd7S>;j&*_eVA%PgpNkw}i$d`j>ySPtGDF`A0|QV={d=R@yN4X@y2q z-jTKxWTPMamb2efDgO0kO=tU=2fa<^(Mlsn@yC9fl}?C(C{Z{^q$Zw*j?cL}&T|R< zWc|J-H4T4Et>AM@ZE7;~;R}u3)Q6+>p}k$>bzMw+5xwb~TgHcF&3msK`sN>2M(UgI zQr>!+;g>M=P4A;&ee*F(KURHHbj@2P81I?7=62e$>Y7{mZ|a)LBMDcvq$=IAMz`XF zcq@;XKTF#U7C(m{JTx+A4fIj+tF$E|gUmiQ&}M^0pKap*M)X;cdERdgoE$u0$mK?S z2CS1^8Ztxo4-_4%$7;Rku~vGJbw^~7$i~uC?%rS>6n)x>ycN1%k*Zq!k6|0$+J?Zb zB|6ZD`7l=PVn-nDV%N0xp7$QsKL6+oEfL*fiCXVMHfs|OZnDPPjll;YGD`dqWP)IyEdQ zw`-cJ6erWSwBOD+OF7e~;RngZe_G1fIQhMgxb+t3_8jUB8-TvXd+q^h*RUkD%S}7v z4WE`4i*9z3+BJ=Ot_gX89KPL@rH(_tT9G_LDe9$}g_dM=T%?tPkIRaA0xYKut>=6_n;NIa6 z@ZWyOy7du0*?0bj|6Al-apAO9*53BJl1CVEg(=Oi&sT6+afdZ!Mx3J9N<*3_Tx;r; z7c;jPF~_r+>kFClS@@!hnxFyW97dErR~FI-1h3{^yXgJ8-Ua-kw-=lReTDS)Y>VDL z5xxBk_OU9#iRkWr>WRF3B*TFmHhh1k4j)aw=o5O(v*=N-?O{FikKgw^F8lqmehHrm zpRaLne-(59jqCj0AA0vOo{juB_V@=kf5UqXAz6J(FLFS1k?v4TnrnDoz?Br%SLB)K zI-=)@exvbU8SV(We!{wTQn;Q~pLXE;miof?QeWCE#Evjx&J4d2dUm(^;z{}%Av*fF z&^!rzqC;7AZ5hKa8H2Ttt>}O7CAuW-ryK3-`ai#Q{r?e*{@+L2;sLCo9Gn7$=45Fy^HdKLT9F)C+nMxS^W@+aY7>F zfV++TY=Iqlgg%j?$Ee9OFSfC~FCYJ=QCDcWzG*e;)XBnIs+WB@>gJ~QJpO*C5xXsC zKZI7Q7@znR>KyC?g!ZZrF7`&9Gm!YDOBi!8d^Css>R6q3{ymSF-uzf(=^&l~%kpI8 zXDo3cMm$L4!Z0j7qW|P8^|BxMU5c_=WGwid)D{m@YIFDQ&hO^=X;B36c9?m*DI0y6&XZw14IOhQ8`yU!U&uBP5Qp59knGKvf zesW@PP7pY&WATd*BH!g;<{KJao)*AX+a(rQ-($44rlBA_HdpgbNZ(JoKCjD`Lqq3 zP5CDVXXOdNS&(ZFXM-J_C-n|z&As+;UJsn_@3NoI@0BpGR@lHee_y0%L40PB49OQ_sU0yVeLyEJ$3?cYNPDo{G%P5<9dg) zpxhqLt|2{-JO5x$zk@7rR@uOropxeyUUdR+wvM!i^XGPOPUsy@ZJs@xc`~2R+r#-z zPxnz>@B$k+4-P#sI5Py!ZHDg9Id?F+Z!+sGy2J7zoSQfF2diF~m14p?B4SOQ5rR2F zhahf4UsK^jlV`Dwj_SPyR~m2^IHyiNf(|$o9lp(?BTiwS<$QF@R&U)tM@rGU_eSbA zRVC#bahuwfNp&scPT%LyiiFpHO8K_+_V`+5!Pj>MR$l+9u6vXxgz+UdlCd6N1}-iI zCnea`A^l^Up?~b1Yv4`n0z14(EP|ZxHuY(LoITzS4>EW^0&mjuq``w&U^Eg_#0xzSzUP+gdf>rX971t$O(aJ6O-_U5>QQI2Kl!Uk~$} z|A76vu>FUy9GMgWtFbOLeI16iuXQ2u1mGqvaTIHsb$yg)?<}++JuM_#qjc{0@6qhgx90*9O)d z@0}Q|WhVfu|Np|U=Hh>0oYSnlDt@NB?BKpM5^k#vU65fvzvnW)nYY-({O|5CzZTlS zoc+#;!8}S}J^?x0_?8KGq#Vw-gY_r9%i;FaV__9JyqNi|USuza*H~aph=4VupT7}? z^>}i){c7Rce!D+AYY@3`2a^*wncTc7_)CVc#t%i`8HQi4Uw!+?XJ_vi`ONI*kx$RA zBkpn`XP+wH0yfiu4YA7_Xkj@OPyQC4r8Z!hbMEcpEM z`BoYD6T|z3r3{TL^5EfGtJWao17SKw0L#L0_ zO(#=6f403WeEj>cEbJFS&xTIF<9A_t?oFq+>Zb2qg^Y0a)A9E04TI6^lfiEac*Yi5 zj*LKu{W_F$*0OQ&9|UY13fVL!Y^ zz5G0T8Gfo|j(&5VRpwl&%bccl;W^4ZDswIe=a+%|OPPZb_A^8K7szMXU%K`Gk9o>k zV?R$1hUTf%I#1=t&XZ}!TIWbR(Dxjj6E#Q6%ENOcxU-w1!!~oYm9pqL`iQdVIod>7 z^c-DFS?1(4-F}Yt4ZZqZn2#pf%u(&5KYotlWscA&!w;b@s7~7 zciUvjMD`48c2HO7+Pf`_GDG$pps#J)IAvpdh?m>pW$w@@KJtA}1iwq3?$54-H_&@z zAJon#Cwrk*UuNrKb50`lo_GsSxZ#PHt^BY|<_12n=UN3nFT(rK266o zV_u3va}w>-98LN9xU?m9KK;urxZa*`rSFjbb3+){z3D&to@&T9x8}#zU+ZhrB-W-BeZ9Jjvc`z@YDn{6D9ilZbFm#R z=Yz`>=KJW{dylye7`cT_-SbxB!!BXHKqdxSS-YE%joIiuP4_CD#6;_PdPGJ_?AFbk z;WlH2f_YXM5z@cU56{nuu7Qur9Q_#kGT)q=NICmbyfHUk>)Kb}H*Gi8^iA8%10!kM zkzmZ-my{o?ry29MK9nCWS}*SD4Ab`F2;7C_>)B!4^(J4fw0*&k#9Qk$d%Rt1hqv0k z@z#D<-*~$!3U7Ha2Hu|T1#dS%$JPJw*se=2TJYwz!JF%hABVTDE16M!=-+aAvM;tXDjfb-Gb;q))Ihw~EVd;aU5L_7I(mIcmc8#oI`ofw?=2%JAg zex#c)N6L?NA($iN$FKV4gU0Lo=7Sfb_`vb;2pt#iC)mr62Pj|vsy!ck_DxuRToZw> zko-suBr&i;N?G#-n0aJy!Erg+uFYImUT(rczX{#Saq?L?-+QypclNoN%{MKu*cga z7QAisS>=#HZ-xDT9NwP%k$5YJvBw*Sh;g3?mt`-h=37r_|36Z`EwIB|6X#jk zFHn24KWBvT7HxmZdk=%32>bI@18>hA#apEPbT8%e*V*IkPe;P?ZL|&Ec6@n!yjktf zp38n5pSFH(kGGL_c-zo7y|qsY!4H_ltOg{*3*fl%gRo8h8|+pF4!h z6ymzt94W*nr4$Lxe!x2~V@I{I4<=<&w}&#Zt=hI`>2XZrkNFQ}`48ITJl=xy0l}}mJ&=`R;5FJF zI1C<~ciGe0QVYy&nj-8(Zz+{Eud14+MLMvweU)oPQEH zZ@0GxrdZ&7#sFhTayv5t#t@ign4sRcn81#0+`q>71ygBUf zw&OVZ*%x8F+39CF;2}akyWPNB{!zR|>SrFx^RKa⋘@__SflFITW%#pE*9>toqsG zA-tWie|x<>-Zu8Pu?KedO>gb(VZ24_6`~JZ2Og|^nzz`%+t+S;KK%*xt1q?p=cpFE zEwRCy>o>>8n^iw66uecR!1=rOI!3<~;*f)-_8(KY9dQyg%E1 zo&MXGVcB#>1k6UPUHPM7nAM}}wEfw<0Rr#w*5`*!SR>cxadxo2+xxne_0F-dO6=4= zV4YuJ4{NOj*3Pr7d|~+OTn~g{?Q4C0^O6&r*P1#L*2sDNqMywg{eQjBYwH`w!YcE6 zlFVzaJ*=}Wum&SwHRiSH-Y~4ko7cw$-s8+`*4-wok@NZ|J6QMiKCk{A$HFS}S|Rg# zmi;<0*aGXy2w07IEnE?XwXb=-`UK~-_2(w6k@Na)r2*2UdffJ`*tE^)4|^7weio#!YcFnHLzBn zYEQ$zvA`N10c*&=z9bB5U-SA=G4zYAW}cI_i|;diGuAkPnnfn;k+zy61iQ~_BY$GR z9_^#C+Q>C8891=Bkp&mI;6ii&(?&ir#aPQ^os(x`t3}($BPoxzktb6YZ6gn&EPs?e zP32qg{8A{dhheuEwp!tJVLay^T>~O*wWH^>L$P}Ig>Wu9L+>$_HuiCuJp3R?-$nNDrP#ptkR5!F+QXL(eDep`!*{ajxA?-`DV%gxG;lw@@;cBTXWKUcGe#wV)?(nF$Ug^ z#Rt|8pJIPvb2Z|jUF4T=)b~_R+HK@rw&Zs?*Tj8FXU`0BY)USd3*pf(m3oO`Xd9wT z>U0jTKRAONZsZBol*XI56T+RAOCI19rQ{ppG!H&7Yx5C!x^=d1bGxIY)7@QFoI_4h zH~FqR99K-Oa3oGCs>%eoE@?%%+nvij9CEK< zSzf{SdAUCQUPCos`Mxc`U+^t*xVWwi=P`0I#%%gf$*oDObiL%~KY+~MyYPp{CGXUw zsxp~GfXS|_!ta#j_`0O-z(qeiKAbvVbH9MUAM+Gd=PI7F#%|OS$%Dr`QwIWBp-QZ?S;Y2D>6MX!NTCE zf>E9l+_6!6YG-kJA5B{+|^ zef$@=_j+E|XiqiY*YnP{ zEc!_pHm;F&?x!7TZx!E?OI3bf$M4duO3;B1yoUc9nPo0NPIr{v@PW}8w=@DOW-&x?0oJ(zIDM9JapOHJQT}_;#En2DP z=hev1OOD8;73oSzE%Yz6=TcmCEle={D4dm5AXL1!O)NFIxCdnUE#pReb) ztV`4H8``5K{(g|ceKSK6DvO6g$5Uu4^~ROOXG)vMlvU(<`t@y%#qPv&^gCPY{^B0_ zE_87V<7zA(^5h70Xk9z}ybvBLP#>C7=JW+uO-uJQ@l1HK(qI#Mosy-k9S0Z3DFLatq%m=-<-zZ-3}{T%cPVe%p%}M0aC8t~*ca9z+ zNAMWN?-NJaX=q3GC$X627cujNakMvHLC?H~+7`ppK(LU*KABp9bFN$B**d?E=5t zo7%v)+!MQwdjnJ(ByZ>@Ht$1mE($UY~mR{&&==e~*bz z*uM9aglDyrJ=?QR@oaBN_w)z1t&HgtV9a~y?zz`K^whvS?&V$o(E7P~$e{~{jrQ!H z;tLku+E|Dnot+>rb%yNf$$p^c3BML{ojE!;ypP2b#GyyN%J+*E!SIXbzg zg8REVIu7)d3}Q?L>G4mphI2;-c%i+kp@Z@}eGfapo!qhP8^#^K{LYKzj$r04i~0_J zEBy8{Cl^y+=s|g6H9_RB2p9lHW@%aUx>Z<9w zJnTmP{lPd>A^hcgr)Sd7gzw<7F#;9|4cJcu(Ww=CgNk zL7;~FcqKPu{uvTWKD=ISsVrW35%^y71i=f&CWGkt;6^U^(o`3SEJPB_CeKH+pvy*A2o z6LUHzXM*P@_ZglEIj4IjZcX>pWOzMEygP_bEpz(tu!)|fd`eR%dfwMg_xw$p;Hic_ zo`TopyOO-4GOke{#*HlXj`Do`T2G1mfAs_Tf3oLV{^#*tI`8TH=r(vo-czW*a2NUB zsW*ymxksbyiVROYayq+UtViLu#&;GnqKdHy-ZXyu#=?iWlwu5SEF zH6ZeHg*u=^MRrQRGA8=b`>*)I7yO$3{lM3_Gxv@-^iN>h<0DtF%t6)N?vWRhhnQT+ zOXYs@4cphG9(KBOJ|$oDz>@0X)1dXw90ThT`zgC8@KF-0i@lWTbOi1=yHqFZ?tbS4 z^uaUgo!~EqIf_k0Z$d8iOC06tpXl`@CXV%dK)pG)FWh_+pDbu79eyd`dmr%b9jHwF zko#gja>f$(tZ??w)!fxDf9edUvNUFd@7oFJYlmaB&BOXDySK+EhttttmI9|YBg^CK zm+iTPz4uDmI|CY)wr`$2!BfI-X@B+X(>;|LXLt^R$1|YOOW->xkEP$6`7LtslGHOi zH|L<^QGOov{y_QmE6?j9CTio~uQ{*lS=PL{$mKft?UtO;o=#_Ca~JdTk+Wa(1w1>G z^ILPB%He-0PdxFp*B3mJ;R`loO!i>Mm;8(REg6$MZ@)0b)4(|X_ShMocxa)LvdU*B zd!Az4(=wI%kI0z{e1|1xw&aiB9#a_@J+fcj-)EdTu^*qUWn*UvL7yzZ&Ta z7V|v;`SZnCU+@;{O>$50tj?L_Sq+~TgR7g}r+YpOjpNPR$8Mg$|3upVk~WH||0Qiq z;9F$G>Ad>|a;=zm&p=k(>>eNS?wm6xcqT|$KLf7aw6_Y{eL7L8UjzN7f5ttl&`xQ3 zmgfWV-&VjoLYH;?c0;or(B#KXwf?og8T_&r_~b64&)`Xsw==jWr~!O0xvg^9VdsG6 z_teA=$-%w^UXuTF`F|gC`$l%+2;rk7_{fVM-xjOscMZusLtDT-x=j5l?hl=-rgZE> ze~AO$Hu@FWn>m}Dw2V>z50C9fw#vD&W!v#-37<3GIObMkT*|aDo`cZ*A>Qq9rZD#8 zoKG0*r`)sn8T367J7yp2`PSHi&1J51k0Ydy>|;C|h;tVjN58GlW-K%Lq@f=PkN=1F z`kW~(T~e$N9ybA+I8Yf8m^xeG{+u;oQ>tV zu18KrcM^NxWWyfN%T5oKB}Li@3h#XXea}$uaC9ed;zqyGkTaqaDe%90YL4fdI7QF1 zxcx$9waA;?KgNv|9jer!21`Fh?*V5T^0TQ^|kPrB*wJ*3EFHbgb>_ z0Z+cbH{`nftQ%dL_wDa=j^&(53}-2w$dvGTZ-t!KVsCst3Ev5Rh8pbdHqM4veUJyl zhCnZpvnQ3J7fm+&LB@Hv@co6IbN{B_8Q7EWAb!h1{FZakw>QLKAI4%Q_QPK6kFN!P zi&O3*mb(*`W^Gi_IC5$mewBLs2l+~UI_t0WSBY)^HE`)PN=)zmn++Y!jBoi_UQB)Y zecUCf4(+InRZ4~c2fR2)=Ge`gOjX&xPIv5{=JItNOp_e?t_qB+k{P+bs#w5xLrz|B zt=xZwZm;Y@e+S1tKJ(y#BIs-;d^K6xB%iw0{a#Hg{tWRUr_WFZ??;A{`&z$eQ26QX zOYv!NH&;73ZIxKxxOucw1dq(*J8MPa;Dg{a%{jEAjJwQ)&Sk7JMj5M;o$ZlxFqhH( zTE?`FF^LYHF88A`_qlxLGo}h;#sbE*;MBNrW!X8pZc~Zhrv-Y_aio${J~USi*vxvF zD_qvSyns2lfVnuIIXMrTJ#4QtXZo33A9ufhczO5GbLMsr)e7L(WvPQ^a6gs{xp8oC zZ7Mm$bF>0ABOyx0jXTcV~t2C!6_~UCLeb+fXHGsbd`vr{Kfk@;%k1~t8~y@4snC@J`f|eK+)2th_<>vQ z=`?()TjcI<dey`1NsOWyGghlMNm)B{Lu=X3>BtlNHMnd>&g&nb5ZITof~Eb9z>UF^P8s=HBloQ>(ltTcCH5)rRgtz5?G5kIR_7*iYTd!|R55cM9!qlrg|_UGwBOV}K9X;^H@B z@FP=9niE*$?!>PyazJm;+%`qe53Q-k@_^v^=v^$9@tW%ldb>Vexf?`uf_UO88%+5b zYn7kInDu)Lp>N^y|1Za}{YQ@D$mJ^h7siJBbRgEn+5*p zej{kgreEkHgzqqI{Et5EXrgDEy8GK39LN_Z@+C44(?0Zu{qUN=Y04R$9?=!{QRYCl z2tBr-H~UZLP9OABKYrHR-#)*oCqbFuL;m!*xicgSLLg{XyUG&f`kw6uE1uhdZ$^golpk_Z18w2Szx*QRm!z z_%p8wxODn?Z3_j1D zW7Jo;|4DpRQ-G@tnJLc~ozbK3zla{{7Z_}GCxOE&_ba0p{p{PG$!`IV?7PT$-S;We z@5w=z8bz7NwYO$-?+<#jyoWwc8FzS4uV#=kQFIxxIeO54+eHsohv(FwN0{T8!+75M zrf1@<=xcuTHDqxIv{xcJnH$|~M(%wTvS(40>r1NWzWB`r)0h0g?NanR6Qr*AiT9r& zx}WYFAGBsVclT(_smSNpu>2O>Yut^drYlM7ribOHDVyI|%DqAZl#LRPAa&jNLKdVd z+@;z%MPvLjo#no!8^E{D7tDc zI6|iGk>4vFYyKbR-aS6b>e~N*W+sGZk^l+U7;ush0!c6ykXy8tNdg)!UbtAVEdc}r zkqTBVcq8GWfp}pQq(^%SR8SJ-R4pp;Fo)m;QPc`r+iJfxfI=W3Qc*Kjn&12LT#`u$ z)_%|V{$A&gdCha%Yp=c5+H0@9_S$PdYVq<*TOK9X;)QXnX_)9g3;r=TtoGku)Hq6K zabXWHA1B+`Y)I$&2y=wpO%G0*>WMFX8h^jqiVwbY0@njCOq@La!r<>JFEt`4>B#t` zU`^>=iQP0OK8imq2p)^TLG$Zzv|aDrclxe4Y3%Le8H3ki)9HF0-;HH`cEuBBRT1ZG z2@lTUvF-RMeQM!(;Qk1GWf=eV*_q@=p-sKf31vrF1L64xjAgm}f0sTm2L&U$ z5{xaeGvGD+tV;+HRd3S2CBQT$Qe-T3xO^qj_g`Jnf~TNi)Lp>Dx1 z<411Sdi|w4z|G?~CN|^cw4)1UM*u_m;Jb8Tb2+Cy(q+PT0sZ_>*Z`WB>e;X%wtiDP zq_f0JOGhRh-n!k=r#+bF+2iY*dvr&qK`y^_3iS+S-B@)>(b%w27`x%R#4Q z(|^7~j-`K6J0Vx}zuCZyLr3J`YfU32z|mn77x!w>6|N3jJC8L_&h&P5nAQv8p}U{< zppPbEKUd3lwg_F7-D7zQXZ%I(`}6F^3CoN|^h*-{<2`(L!b5)*{p4FYldf9at)>2p zZnkxmQC0#Veg5lC{OoN^`o`e3j3Tg zw^1g6Z)K1Ef@?q5*vqAFJMT9^ck|D;G-7X9XS&%oZ)-c9c3Cz6Hg?Or^Q_b7x8J4n z_G5Q6H5pYsY5xn*SGrF6ulq=R)CqPwrkb3M$b5%6*I?Q9l6~1YiU}D>zf9*}{PNOP z!CUOJ?U<>CS(>AHl50bBbM=f(ODk6&x<=y{GEtN2@me|{8Tg`2bGe_pkc?#2W?@Tsa9rd34 zThq|}_Xex1zW;gCX?TAHQ%; z<09spW!%dTKb7&i6dH*Bu3toBy5^*H@Iie@b1r0Ii~8L-$43%9Cp>*F;>G7+=Z>@H z2AA0SKzv{4M|RI+-PTAOVRR^)G?sd=K!w8;F8;63-H^_RqPuj(^YFByfcP8qWyOkM z%_h!5ReitH^OuV(JzDVyYnwbj6Ao?t0dD+r^ZYl8_qFH}>35g+>L1zo4qV^fI{4#{ zy5HyU+O0d<2OwEB(z65oklifSL_T4@V)DO%|KeXOb|l+cuP*+LuCoHt#j}6YEmtu* z*r;=M0Na|&5Tlfh4L}TAV;23VWE^8C@==0($R1RGm2WER8_ri`?pAz;wHn1l$ww4j zUbNh!vGiZ$6@9Z6uT0<)ySAm`*YL<|^XTWg{|&U{-lb0~9|7Zc!$1$~0bcwyE&joA z#G`!|k7UP2%ZcXXSyBF-H2PSyzehYPihA$iz50&pA3K~;z<%d^ay{GQZW?Qkb15VK zeGP3yBdz5GuV#%4AE$iLv-|eQEq=}jN7GVs|Mux<=kjvT$}kOVfGC-(YeP$|HQpxL zRg?P)+F5k{k2Z8w?9iF$+U6|GRz9w%dXcwQbd;_0KKi(#e=uAAViVnw&2I($UB3BL z^qh%)>6cV=`)GdBU81ACHcH$IFN%{?bC^Wdw) zKefc*%+~gGa&a3P$wq0`0|nz7m;V>_p#z{vq-`C2J2Z|+M{jyrOJ+X5H#^M;#nBG& zw34yosLz{o?yyDK$9?DK9H*Vn@EeRzd2qnrwTU*zbRBnlKYl^_XFYt`fzIrV{qW9R zPd(PRCv{`mn zdu^87x@~?{ZA30wwfArT58L~<{{`(`$@)$-f4};F*xs-H_4X>ChkeGQJ%?$lKWp3Q z2FY+VpQZn^qV)eh?xnZdlVMj5G-kVU@D}5BD(gSBA%CAV==2)pt#SE9Cmxx72CfV# zc1+*&qra<6FxD>fG%+Mr-xsM^_-sB+nX0zG*X#{KMvlON;37+0(sc4RHssn%5$G*g8o%Nc7Tw`>_T1glo+ZbNGjP z_VYw~B=hUziKM1+7CC1z8=gL)X$59z1UjWJzeV5t!#X2by6U$6p2)47cYJHW6Is-k z-$UM-?X#FO5KmU}sJG_DpBXixuko#UU2#v(sS^2m@DbSl@NUiiaK?#M@()M1&y7cj zKD)Vjj0C=!<*hNy{D?oyo+!qPMa1aNCf0M*)!v#>+2Ee9I2?}^QzIPKt%$p>c$~*N zdtSI@Nk{(LYsKX(>g=`K74Fmc%yZj z2l_Ovv1|{P{w@5Z_V@YQ6*hEEWheOZ$jl~%!l-?)*Cv(qZK@x$}^R_f6h6L_rasJ z`Ee)G>AQ*}$e1?=nP4;9q-$>T0L#xK080(vfoo|Zo!nk^65*Xx)E zBCnI&_EsQ+S)LxP+IjLEx1IJm=3ia;iY0H$A1Scr-~-WHhw<$%pOjshoy{5Zneyoy z^T+joex0#fp}Bk#CFK>5#(Vs`wJuWXfAi6EJmzls)hoC*S66;m|4q{i@54v&|1bO> z&iGIARi7RU&>l@+0Y~}1MN{bp$N0F0a>zH)^uhch0SN)Em}3v7CSTq7x{yoVI6A<7D(C{GR2h zjiWkvw$lE=k26k|5?7->aJI@2r=+>8(LLSrW$1ZDjyK$scNNfhIeZe1so>JHe8r<9 z;hE%Gxt@o5?6VNSaoCQOXn-6cHcSlR1LUtS{lZ7uPS-k2M#P&w2(ixRT-hye~??f5E?1zLybM z!gnU$F|&-kqVl{)XV~w1+kW9D{kP_Z6WInSM*!v&!RNXl)f8ni{<}aKB&5NM3WX7a#%!Us~@Ry4Bl8J2iaO8jy ziXT@t>Bc#wjk%tL-JAWp9({oRJ&OMG7T5Q!zW>7stQC}^R~MmIcc52K-hKDO<#+da ztg*M&9+RtoQfRE&FF`P{BHBHAM;MWMB+I2p2dGjfj?B= z(TFJ4SNk1KQhy0LD2p}umsgGyBPDw zGcVKFa}E2L&;@%N@Mq4Zy`yMvHtn55drPf;5#KPbyzQmq9 z`|EgMP2*qtemqxY1?IfM9#;ANE=doR(&pJo{>r}oV0d;?a%CF-K4Pn;nZ#BRhoyFT z$~xzop1ASmJfo(Vexo(Gl=9UneVJbt_%Z@M_AnMC6Pv~UnjmqAiv84gvOi0@`YX+= z3oIEiZ!v1VLH^AJ*h#=D$??{F!V5BeC?jFm7tiueT>;Y_~2z~K7U!V9p3eT^6-kVao<3tl{qDJ== z(XDH8E1WbIm}yRbxTSXCZ2As7uUV7^j?h>#dKA2jTaa(f!;o*`X=V}ggYQeSL%c9H zr0)-hZ|HNC*3GPO5Pq;XhWN{Si?*wBM zhm3y+9!*2u#4G7xb7`=q9(_~wQqvks-tLso?d&1uo%psWukY5QqYdEbI>`Q|Khw59 zgWsR{UshnOI@6dJeMW=qi7)8;uI&^vuxX9tt&H))2Mw`F_KxJ-8^JM^``tKkc@BpB{g6yQeiaO<99&djvYm zK6r=!_U0ea=hKSL8Y`|(4qEzSD9PD=NgUY;_;cr-Rmr#YTRv!<8$X*S@=Eu&}x*&*HEE8MqPf| zKg#26$j6TGB^d0TA|@NT$-3WY#Quu}nWMl|zhqdJZ3*=eEtX&w1X$ zr`CP%Z`ta5ia~3?@3q&T6r1n%DfMm9axyyE?L&V6Ci-L2SG4&sw8D1nDtd`l$bXXP zwH`i8#(E&fC$WRx#D|>%?IpLj{iEsmlk_{;io03k(mK|3H(=g)6m zH+1IXMf5wx7f5Hj^X>!KBhR1%*U2~45jl^VcMpBvsM5Fl`DPE_l)*d6-)i{^z%#n< zP`^E9;g6`X9Tum6iNlz$@>4Ew<$n|P&Bo}M@Fr)}~fdrW)YznSkDJBJFUeEZS! zcH_@-7~y;fE7!`3oeItG73; zaeWqb-!=_ZAJn*9eA2wmyd~Y*&q&`qMJ!4Ua~kqs7@woVy81)@nu>+?`?0{u`GtMm z;4`c;N1cEFV525}uu-+VgZ_i-CLR4sR|{THG~ z?y&19O0eIXeb61$ZC-CI6y659>9W5!^@^rZH=a$CO@=&|z%Ti$)b?p#S!?LS7R7n2 z7!I3fEq;SjcWh_=KpqgvyYWUd|L)GacUbdnz5AGbQ~F(9{pbZqA@ zh`)FHc2D5!IF~tGlw4@8ScO~|$VEE)LnRj<28~s_eiIj}t!9qc!O)r?z5#3i`l@hy znEptA%adHoN9g*HTz`Y=-T};LT5W(vr|#IXN#$*Q{u29yJlJtw>^UEH9s39F;Jj7V z>9S&sXUu)K`KxE_`!cU*bD7uJtg)T|^BQ&!h4%fi_vMmN zFa2>yHGG_8gt{F|ww~=n#`XLho|}K{Jx||N^fWA6v&O56N9q-xSZE|p*ZNyzyMIGCz<3;NDG7A5;b>#1Dq0bRu zsSX$RLGCy0X$`yL7XNjdfUR|+P2UIpyDe?l+XntS-0%9mUB7UT#`%ixpvyidFTQ9V zc3^tOoi)hi^H!b}Ip4T632yUWw=Rk%XM+DCawFRBd#eTS4b6Dl^0JQmO>fzJaN(Ez z&Ht-)$P4=eBe#AB?(28k<%IhK&2Wjq;eG}8CC+=79_FPjbbkIj;O=;{cXRs}w1ImI z_eF2E@G+XsJ?6E@cC>7`bSQtLMLwoC!?o$~Q^9@1uGghQ?U5Eb($@ z%?s$CBYj3q8gXRLpGZj*->g_nXfPI-X_H%Ia18gu@S9XHj%1x@)U1wz*&e=Ij;C03 zaAkN{8=MDozs2b%b=S4v`iC>Xl`PzH%*D~>Q(7CCeWGBFz1DB_J=xFA{o^}ecW-D7 z+usIu2M4xzW)5wUg)8QNH{af`Zw>d0O>W<|d3T(9mkw!Hw9sMo8Q_Wzs}82jvw3CH z;je9Ae(1n#C0{qUkEaFilh(X?vkknR4m{}_SC_5+4tQIhw`JVr{R?g2J?Fqv8_KfH zR{G!%XMpSWgDJnW`>hLmZ5!B+MZr#cuZ5mHe%^ljw>o;}{r6kbba@-N%N)2S^1o?_ zQL`!vUK!(sI~KX)UHN~s^w--ctMSeqk8b8Z%Xwen^nu_z{^oIR%Nbyo!Ta@_Tl8UZ z8@SgA?q-`lE?i@)ztuQbG~Bkwc40S^U?1!v9@t#Ue^;Ysm&dlzcCjv2g1xzGma#DC z@Z;1SW3U58V-FN!7Zl*%kxzH0<+R3*!*=r}!YmX%_ zCxl9V&HBxwp2*LC!~gBr{?qV9;%|$`)?yyA*Bpkew(yolKR)AZY(2dzXFlxBlP|m* z^S?*u*=vpKzt-VgZd03^?VNzVVC4)%S>`Jd?gCprInVx0HR|3v%WOo}1TUD<_c`49du zE&l<2_w&1tUnRd4{Fd{p_+i~E_wu`k-!gtn`7PnMm|r=+vLDI@Xa7~rEqyzMrr+E- zRPv~=Msq0QQ&!35UJf6e*te}E!|^*zH}hOtcqyxSNL!x#2Ai|#6)*n%4%m;e$Vo@! z#YAq%=XXaOaYou_?j;`DW1Y*q>9yXrZ+`$j1!xyEe4B%Ym!F59v3Zzb=XBVI|EKt# zV6GRxYdSvL0_N(|I+OQ}>mqX8$PXxAWtQVZTzMgDbx}E^q-XYB#ms}bRaq>#y2#5h zt-tL*G;p<>cKG{<_w_-r&NlZ6(Y%9SC znOn-9=etSdu*gZxKc`_Va{Dy-oj&8;P5#c6@3N2JvmH~ne#SifGp%KL6B;H^wq#+h z){B7E!`kb%4;2KR=`rwrFp^Zm5 zz|@B1tU%ezsoSjY&*uBg)4xBr?e|_IoOQ?TTZ#84ZZxIRT$W!`u{d?>2O84~utCV( zun*sE{Q%p~T(zZlv!6L%zBAf?>W*>9(^%xH2>H4gJ#-OzXv|#X&YF*Ppw46Gy+~Z4 z9pCuvO+LP9Kj%S{FOK|@_WozBhg!6F)|SalOL{d*Tv><-ru=k zv$uhoyhI=3PV>a&}QhQ_K(vi9R zkBnjZMzHqtT?fAVDwTNlu2y`_P<>mAk4wC?_<1DtDq}8dD7V_bWh`7rs=T^;Hn2WE8JKFe_0cCNSPTGmp_k(GZo@BhmW*?Sl8hCk%2S@w!V zEE-UkXz(iVg2SK-d{zBF<;)!UChL7^Is2fEN5*<47t}cp>yFRw*xPMLy9bb8=g^oWF9f=*P?PhEd9OaW19k+F0 zTpwf%8#ag-P-rK*!JjEbA?1eetn%F}Az_US;RfF7C^r z?U%H*nfHZ8=pNCLHAnN`B+JHp@w@IzvybIldm3GzQ&4k&GUCl*d?a5Ao+~?)zm4*B zlrNiJ5LRw8(bB`ZcRAmFL$2i_aH$9sgqzFoezxj_rdFM-!96JJfW`ECYrQ2ZckVuL`*+SbIovH6*0)-FKbzdD z@&}5xWzSLWg@W*s+Y7==?=A>0qptq`ObdT~y9698`KB$Ky~e6%pq<*F_T@SFOUE03 zO8=?GA*}^lu>*XswcqIW=C<>_#Rq8XC-;!rp6<~1-`mhP;LumOOx>L2&+yIPz^A!? zzU}nStD@v;Yl~dHJ{`Ft4$WYklq^fGWP9{SuGXE63?UnrV5`*B6Y}+lh59sd2iwnX<^iAE5 zL5GhGrUzc&c{$I$Jj>!;{$J7qH|C`UR*>tbn0%u5z|&nkUk6>RJ~*o&Tt0_>__LON zxb!w#AG^HhK!19h7@AUKW4S*&@PXHuB%Y&Jr+h$ep>pZp?+NE3a_qeXtP20Y!1KV7 zYzUXtz|ol37AGI=P~Yr_97rcgA1olhxJfxXZl`AsF(Nr7jKS*9TIaO;HL%*?<-&@g zJua-7z|tC}nTD;#T3tP~?l3cD@?vCb3H+8HX({y{WZb`etDT=p_S>czOgEL-9U5A?#wmcM?S=Z z9n{wu9fWP(91}U4dE%T$^CP9d&X3Gt{YuyLgUD>=j#k|M?>ofSUxodMn`A6h>})Y~RJj<9f!Ggjxsr`eIo?knWS5(f zSvF~+$}xr(!%vm_Dh3@#Os-pQ)8kG#-v8!YyWEogWs?e34jX0~{P0jNdd;N!=jc!D zku$BCn9SX?p^ty2nJ50p|KHx)oAFC~JgcL>r14#QYh}%`yjP)L7}L|>t8|+|+=J?1 zzwZ1a$ce`4w4@a&$I;2f*euhqSq5`vlGcfJt$oDB8n4i=kEb)lqT(h1(E%EXfeTnM^pDgC8s(U@{P(9OGYcHnnnHj>>-j~vLo!s3k=2?RMg58n^KX$-p zPpQ3kQsYo9xcyE1X(yI@l;N4LF?Ez_%nuUBs`W70WW@yq3mJ=tPEID*I`mG}IvF{w zqGiXRU3wR!-6hkD^0LUMB{`MfWN{yR?Kde2y{LVxtUVtF4}Vn5cL}~0?5@peOO4G& zhy2anP6eC$-sk1s!+jz5qq&da-pBoz&ECPa7n*z6GhJuYq?@su)6OZoQ1!`QmQFqL zdCf+D%|VxqMVIM12VLg+!Q`{a0@o=)Bc%2P;cxHg_92te?NhFP`FdPGkLr;Pf6lka z5PGNwu!@<#m0-8ihfAla{H!AK#&agXbib7&!!46a8R{Emy@$v0^?87$_esxMd>*!F zmaTJKzaIRu=J48If9yODI^WJ&*f!75u0Bs(TGeOcrQ_MJn8Vt50(Nn9jw8X19^Kc9g)E{E#=MG82>Q&$SC@u8mrqQM6^oh3KlfHl zVHS3b(*joSp6|hzngnhs&Bp04wT@S3Mku8(!qwr90WuM6YEC8;~hwuVddB`fe&N&R5jq(W&_6y8R42!I}Pf8oZ>mYaE6}!%zmcadc{BUg#&tayZvk(x~uqh zUs&-a)9$vP8G3fNFWg5Vs8}x#hpT;l{v3dsH^_VI?4at-CWlx zq`l4NGo3;S`mgImOcnp1cM6&MPwX7ho*i>g=aB3JGp%z-a}cwZ_l&Vc25TzdT1Xof zkt5IDUwTFvOhyLt$a#ybk2U<4OXswe!ID{p=v;3pdA6oZpXIAbr@m<>`gNTBybj(^ zALpyl`2r=6*w2D`_K2@WZ7sRYDUUo%zs*;p{6Qs)?Ps#jrZ4u@sI9XLF3lrH#C+NF zqdaD**_-I$^Wf|RxT2gvwmh3$nOVA16rt@t3>kkV5c8#E?VMHurR zT~hOcS99NqJ#v&W52ctAA@AmF4v1Ec)^m`T?D{ zxi3EpF6zshme}VB&i*o`+0VZZz1=pJ+>Iaa3_k6}M~Z$spj&i2mF#Zgmcp9a>ca32 zbmq(G$UiPNL$Xt&aa`Z8l_EqYL6RQkxYz{`E*x3JH(sO{?wv-bQ?VysS&xiy$q zZELjS%&v6e%}zT1KVj~w_j{cGZ=Cja87LP z!m)Sxd#~WSlIuBl#r4+OK^=5)bE>X`N7Hxovh<7m?ee2-nabRewX8+4Mx;V>1orEj z-**1#NC?JY&u(|GSa2B`19K8`slfSJ!>)Q z8y;w&Ij`GB<&7+90vxm#=1t(HdgHBJ`F$76+sghED^I~F{y7ICG#DFmJA2mF zGtZI#%`iGwrW;)sgv&La!{&V2A_8TI5Y@S8;PvqY%+}Jr?RI|bCq)! z^xY~ul5t>5OiUSkjIqurK#muV^2S(aeT*Ix^H|Kn>$hGHK9a*l{B!n3Xa?sbqR>78QF z8rItJLGN`*w#F$pX5>?z*RQu@iQE{k`c)mR7(m73C|A^$0;A>+v!m;29mlwSeTvoh zRnH!$9vA-Gg1^qjL-5^LAHf{f3isA9)7RUvLxQ=j4a}|Fmz)9S>hFNLeq9TmPdYH) z`&%!IelEW2h40$d^e740^e`9N@ma$Citnf=J*uAj+u**O`%P=@wz>2u`fUr`hoj&Y z6aP~TKZ}VMCI4bgF+2sf#Xr&IHeeM`B6eqO3!mrntYod-&JyS?{;zx1{8cfri^?fo z=D;`8)2w!5e?%(i3uZF5W$n^QW@78yK8G`2wS1$8Gs5KbY1un19ck_PfA%7Kz32VR zu(_ZmHs&e%XxrGBH<+(S$HXlE;Xl^MUWkr|xt?bR`8eCg!|X-}t*Ti%Y1;mo;b{+1 z7xJz+cjYpXuf|U-v--et`eS-B=Y0{=ym6SZ>K1SJ%Hl^d!;5~CSyOy)X1MqX%2Lkt z%~kQe$NB!>_+ERtN~-z(h0L01N2u$i%+uCTqwBa&WzY-7|3#TMGi#Q2#b4!RzVX$} zn%RHNtnqU;-4W)-@qCkTSN?ks62EaY-wYkw5g+<2zf0)&j;^80nXe?g?VAp9ePND)+jKYinHmFq7O&c0AMJj8`1q zwZB)pIX4e}0wbD_f0=3dS=TX!Xe>!XFB4}!Y;}PdDkpZT{GFNM#eXwHOT7NjQlkHt z^<^J1z76@W)_lh|lEtE1JND5YF)x0HPDlT-=9e$Whsr*f87`lmV8gvRA+%(1LTKqj z387`bNx=6*j#$1O&bO<*arU>wsarS@i?HP7xX{wQaiL|bZwdacM@`_9_meVTHvD7F zBa1uPW%_ou%M9rpT2jzCv~*JE(6Z^B?HrYS8vwrWk{-C+y4Kkk-KsC)T64SaYP;&K zk7=p*kE-{dwu_hm>NTvov^S_*^$_b?`Te@JyN@U5=s$Y3^;^1o>&~=S>R;z^7kJEX zuXx-A9w)-%M0lJS#p5%7BU)t5YT@xJXz|OJyE;7XX2ZR?8$9j?kGsL+Zp}On^X+PH zlEdR9``hP|;BgW>PJ+it7LPYow$S=ci^ts^9`~@z4Cw)nd%)u!@VG}ak2mtI%VY7# zKL4a!_4{1gJpS%>?fO#fvSsV1s`sC^%jWUDR$VraYpm-t^Z40@@8a?4I#@cftseH& z%?x{1em@;~-OztcM_$hN|Ei8Gq>QT{E6|S>=*JTDV+s0E`U~5sS&#jJeQvH!BiHnr zMd&lzzHY74+Rk63gVFy#ILx>tTW+8yuCn+I@2TQ9V)@1K>wIb)I+Zo$W}TYt=+ts- z-flrN)V(%7)We7i^~7J};&6$@FDoDUq;U=(rF$=S_^9jA*0rsZ^P|51QPlSrM1Ak- zXZf0j!EgDczrD#rJX!ns?>}M9qhCj3sJo{}dFQlWkA04N&kFVona?erl)^sZ-ofEq zFPYShYpsWT%b7{_f3AAdt_#KU-iuJ{{Na8W?YX*#uc+< zpXbo0TD~jwYyB!N?0uDd6z+Wy_up9_JU&5(b50y7a&bCIv#B^X1Y*Cdx7 z2L4rRY{P$A5^oHvB^F~Jbg17uveFwG6ZXGd5b4*cFju}~-^h$Wht*@k{nLZtC(Qnw z@z_7m|LlU?oxHo4voUqH<_6AHe3f%Fy{kKfeW4D-WA+Q|ho-*JCBV8Ul9^PPdp*x$ zM)nKDuD&EZ09db6cIn6gfdTmixrcZ+&m0sulr<>u8s~L>nw1&wt?m?#33UR-6~Gu5 z>F>bU0E`Z+udrY|c?K98!PAD(0~kHR1;9)vH-UKU3;hImmp0>M054|sPptOcLph_l zeQALkoc1lHyxQkmeRkLgogEH>uW}X0k0sjKdNsLvB(Vgt>7t*##xwDG-9?7Z`b%2m zO)lN>Mbnh-UvLHjJc(ZOb@vu~*3ArOVb>X)T~mzArc;+^U8eO+b1u&>XIg8ho>eo$ z-e1iO%UADNl^OPIvCB1=*%DReX{XF4$~@zg*+iLLEoIauV;8!Ux>b)+YnL&$p;KR- z88%pJFt+i2r5W-MEvQ*e9-nM%B>zy>@91O3go3cA7(b7`EB1yxS^1|}f18{Be&5dC zbMj9Wyr0q8w&DC!FRD8~5kWO?yABb3X6XxBMfCflBk%7|ZhK8Xb(e>5c2o z^_ZShMuO**zk6Xzo!xzQo#)_V3KrUR27O`AFIDFxyUt&^b#|TWOV&5kY51t~vetDb z7uNU2B}T&NuqSP_U1wTM*kcx)@_O=5shu8= z=ae_0;FPa}UAMP`=ajF}sk=^f|D<)@jnrMIx_?65eeAmHsrx8(zdyQWEbH4Ajo*){ zsa4%asoNN1*KKqNdlpdle5daD)O{y)-|EzTD|P=#c+&3Ln6UAa{8OT}G0}6%GcEsA z{`={j<#YG{X>^UhHl{}J-FKcVJg3q{`>VXCjO)Co{2QY9y}{x4Hu(Ln!|!+Dcd=+c z-lqNaF74yz`ZhWIUMYSTwQm0=_`Op6E~5P%?e+(0|7hC3G>YF#9e)1`em_%axBnUV z{jTb~+OG3`x6ZTX`YQAd?VjhO&L6j~vjUpW6U~22ojvS2pP|kz)Omdr&98T8ekU|v z>F|3c{0>6%Jcs6a(0nvBztExih0wgjq50*|Jkz21SIoqLm z8Z_?*%}0-E;s59kHvg|16ZXt=_&*Q+KLajR4lY&TvISf=JGg8Hmm+-&9R_s>8><~$ zmV?W`Md4C3rp7<0Lyg`W&O6Wj4lXOfWtI1o#vkb$^WF6Skuky>x)?oN7|C?TnI()f zF{>|b*2C?MGp-)?uI`8)?`VxPUi8`j%s6uy_*~p(oVo0Kjx${tXS)24j8(qSmEbYH z4IWp1Pds{oM=yK4V@&X(xBn-`J1j?Vy3FF0&&&weyqelBuR69FGmX`$;E>upX8v!K zBX4Ld?Hk=j7RR>RzKh$m&%4@B`}|>VXgn~+w1F}Hd%}nZM*ROmd7em{irUEH#P2DK zNyuUn?V1dXv29>X{+=+p0izo*{`)rI|3ts?g|4P86WX-p>hIZ>vuMj%wB=f0T+#-{ zwcis)Z(#KPU)jGoiI8?(-bP1EYghhH*AeN^B^}#(1~4YJfidHI!pHzdMk_tj-h9dY z)65!^wWh}NDpHdFlv(3R(s?Q^IV0Tpld%$;7hi(nUJTYh_ThJxkJZgD(q0~kqCw2% zAI-GpQp#y&&U@1KwGv}f_iOCtd7CEHW_F6LRM)%BcH7k=E+>UxQ~jzrbfj*nM<;pqGrT~*i1)W!Viw7PaWb>aVQ zTh~5(rFEapwBme%%wy`_$qXl#X?$Ev#r0?_}1^wBi|-u&!qy zSKWbcequj6z&fw-$xJJr$gH=Y73x|2Oe>zqJZe9CoHaJ%=u9h~$o$-XrravV=kUeJ zt+FG>Uei%-mB0Vs^xP^2YvFH2n((Ez>x`1Q+hW+)u(L;D?lR`% zGe+Vk;Qn=d2~RR6&%l@Py5&pA2&}}HARoXd9wQ8W!Uymx^rL)#zE2Dk=FY&s@ET>7 z0%I9@X*%|GV3=u^Pom>RwohV@IT)YBU|irNEjP*DtWwJTEYq^XCtN$ABEQH8XIJ*9cz^yibU!m?7UpN$$1- zbN+Q29fUT`bfSDe@Oq8*bxg6_Cp-Ke+PD$gB!b(!;4ow4pgap@FIqsN&uh(V%}E{&`{2X6WojaCXz<^!USD?=)~0h%ps zLnG10l_i%(qEAvmLGEB^^bD{hL!wV+&Y))cJkzHz_XeJC1fJR^8a)Y(BoDfO5*i(% zuZc$Lt2=>nkZ(mN(Mb5rgw8vWA@#Q>DJNYa8ZCw9v-$?Z!e6+}f=2RdJ_{_#q~vIs z*9gx5j%0EMG+M%3`W0xj*%MpIe)9SGAIW#yiFlDtm7Ftqa~(ca>Ah&3HyGVkfQ}o@ z|4e=}(0jAE|5tUI{G+aK)1~+0&{aAmS{~J|{yl)w23aSJ})}I3VmlFXTnAFejT}1-w-ZO0P9@`mT-C3 zf^|AB8-XQRd^Jj^ZT9#qISd!WWP^Uoi7++-T9x6dGC&qjv2uCqA^eMZ_9^d;}dkakN+jmKDK9J z?o9fK#=Frad>lJt)o<@(EpVJ4U$IO}DVE7RHwE7bACpd?!erW4p zcg&pSwPkAq-)qc#-5FB``GVm+eOr&2JFULgdd%$SLw^H9vbmG~cZhaq?7y7yC!F$< zRgJj^+bKVq@|JA!y~=m&WtSfWK1msN{cic#i%%c3`%(96z-TpQr?wumZ!j3Mfpr4< z-+Wp7WA-e=2=`~)mTYg}`<1}B7d^BSx?RkD$SMC2<#$?Re*eHjZO44*HySuk@N>uf zlLLa0CFr7)y5pkoN8Vg{QT_ek zlgb}*Y@=C}ndc3LrK3Jg3x+!|mWkd6k(IXg(e+;RKJ(U-C&HgZtNxa8Q?jD^B`-^(WJPm;*J+>hsVgheyPu+4q`M_6 zd$<-|T^sJ7$%@((>&S~_MdP>np4)F+S&@vm@^X?~>6WZ8md8LJch2?C>_FF6*7)O& zJ>s)F{1ztNl!m3UT4{M>`cS4t+Hs75e!SGsNYGasLVZ- zclE2SQ(DSv{yK*88~91TEp_a(ljPC2#vgJ>Z1!}w?6hew5u?YrWI0)Is z#ob%m#);TJN!UpNY@fc^Oc!7i_2XG4&-(N1VxCRr*%Y2#!LuLp>=)cG;Q2zH-Ojyi zY1vvCZDjSI`3GEENp^`VuReIv-_dE(W9r)j`r3AmXgwgxR*EkFiuePcG|tIZ$b?T9 zN7=u#faBWIl2zN5w&@#fOV0$3e>y4pDdvT^yFAw{~%J!Bp?|7P=-oHhjNpc-JGOABibvpm&b*Xw9 zxvuska^1V?>GVXtN#s76Z&LV%|MNQYO>(FcXFql!hCa?vxwER`()b_IsVXi}@Oo5{ z9-40wLve|MmCSu|C@ziiBNF&VaJpB$1rBe6!<)ikM7JuF`2YIz;;TxS)0jIlDs%j1 zWeLCffpJxDg5O)<_BOcf0Ia%tIqY}JA`fc) zz>ZZ}J~LE5q8HE1P}Un6z>BTQ>1Kw`@g;_`-qw8w-f`VcaAWvh@OttrIdo39cM{gC+N@1X3w|m zoccq-NJsjHWchP+y!yEMzH=JK_nx6JB49m|P`zu05c!#d(dpBOd|tHE4N*Gw1m1-eBZi-p>bSv@IzcL;643mV6bM`+*}G9(y<#*+4nL z`t0IhAhwYLzz_S?R17XfF9luVCa}-iP`I!zbXwL#!9b z4>FN)`Ly){#^QS%T7Kf#ZjlFrk&M#8+alQd8Kv{LE%gP%PdH<~Y^P&~?Djkfe9=St z;z`T?X<1)UTO~(Je6;_IYpbMp4<)wtA&9;QX}8-4526>_`Vbxm#!?H$H5QB;+V~*^ zLw;Hp#w_qSGmNV(7#-11(Y_49h)r*S5sU6S6AaPg+pmKW(L^u?IC85w>M``4`j~9J zOyIdbjsES(uV}N(=jf*0Ha(@|)Q)e_aVvqZ{(lj0T-*C13r=g>TQCGmI_}#MS5>Jk zu3mFt%!-0B>z}|l=Ic@(=>;?ka#M7G2uRYcwx% z+asM7JuhmW*EqD5&JqmiDbYoGN;Glxly%(>Z97D@B@@{>hMtl>kJe4t0Jc3^x04i*e_kqhHqM@OuLHqt%vMY%BUX~zevdY6h%j@}Wx$a%Kz zId(i4c^q71qeZ$gMnXIJlRicFJPG{oW2Zgt(EigGudNa+&94ulg9Jw~WS2$Tda}zz zZ_755u7=MoFs^BaG0T|;3dTIz84Y7*J9bzLjH{br#5ytSf{~cs8b*h9))-wF(m%2b zkD-GkkJ3MqN7qO8EjnnaFBl#K%$4S#z~HgSHFj)UKiM*$Y>n{_}EPt8!=(TmvJ>a7;{L@!}AsRU_<^!WWpVaTEV7CB6y2r((KQP?6WfJ3ldwBGV!sDxZ zCsj#*xw^;d-@v>)!=VQ-+QUO_5FUcH553b57&k=WaS`|P92oP@fX8SDk4(XM*tQQ{ zy(2tgf$^?GQ{kYsp0>8C^p1;1KV)YA7r}_?mfnf>CAxYi+LtK3W9c0Fg6m6^-Vt8= z(L1Ao)1KaGWdou!LTzk7>76mah{XT6N-$*qz3%8PSMNl_kltwvLwZLr`uXhg_d5Pr zSLZ~Rm(FQh-qksoz81X`8EEUACmtxw-O#fj_et_de>s`4X3qR=5%kbt>gvxtBli6M zf&J*8%fa2py4owOp-%*t3}Bu7Wnu2$CKTj;nH&r+VV$@iwwCmG4C7g3?X^{(Qszl> zsP#dyVixVDxyqFxQth;?57e0Ia>(&4bS$YQgv& z{ERiW$%ZIPK!{SPL#6z{_Zwyazvp%R*q>0xq|o2^Vw>zKrnipw;1fqj5Pe zFcSU@14c5xk3KET-Glyp58AGRe$U5^2z&rtR^2Z zz4(>X7v|o5XF=|4`b00@ZH>xe3td>>+>%NBtwG~;C+4m z`GK=&zhL|yV0<*MAa@rq{s@e`_)&bH7f6oJ4%B162*!o+7dkL53^a1@!XN>j1!L`z z!rXtqy&!ivGBJa(Ouh;Ap-=FgShg0jm>D-buz_dG;?5&Jh38sJP}~B~uBYD2_#ax& zJAiNf?}8EaBYpRpIm+^BEQ4-On&)%PTqwR@;9c`aRv+7FW?S>C7;usA#PyHYUm1+} zW)I$0e=Yijyf5{=I4hl)k$QZ9JLYgU`GfMOBvm#nk*^}D@<5khp#+ zk))Wyh=Jen0CF`QIM)MbCU9;5#?OIqEB?ycD7S!ew^Qa0zP+0=GiJ};b^sb&5B)E4 z{8`7*(TCuVY!}Pd56|^KCMqt;^}A_2nSp#C*nVx*0m{g>dIC5zk&PRG`3x}RvvPfR z8-Zcjhscl%L*)hM!1imJVYusBf|1y_HH_$Wt4;>lt#tr%&s3GL_XjnP43lb!FA3z>uHfNxqklOMOK!?u9;rq5DvqwX&JO z&{~;A-%&rd@X&f&TRaXqFocJ_-j>&|?Co?AYnrT(4m%=c$fel$OoclGpv2l4-vWN$l;A0*q;rBXV2 z+FzQcu+BsN?3R3<(R;EFXS{CZ7g6kY5&JSt{C$Us|2}eetd*mtZJtD9A93=;d>fx; zhGX@AIMdq0YaGiAE7sgNkr`H;wf0Ai>Q4Q{;0vbrOFIXE`@Gz#%ly)b|0Ygcd7Lmv%p8+)Q^)Y0e0(?hc~AbH)85bIJvkFOdpNHXIeFT?A4?9tsmnNbirk5Fl7e}M zeg5$}dqd~n3VvVOw%gY@;s|?nEBPgWTSXLZd436)B_1OyByZXZJ-?qe zb*4>i;Z*&j$!b$6IT#itafS!^ZC22>H^@;3?`!?I-jTC= z&W@bQxD7_tD00MK0v@WvZ<0@s?@~MY8}8>E0dRT9bO@fgy?(?Do+mQDz5|gn;ZVK)n0&8cW|bu&l74YH1@c8%atp^oS*FE zW$fLkeJyF6MU}=`R32#Z7wRc0shG4YZr#nPhS`wcM|p+GCjs66z&kQqkdL$!&Wf2{woq$!s(pgLQV#fBZ0i=d)@cX@!p`X>3%)+{fAxOv$Z|x zr!hv-ra8k$E}s=#$X@NF<+F^1%ReZ~OEvrr=z%E}AJ}KdZs!~FtA~W!$6m8xAp9PM z+`2IT4VcQYsP`4XXvTk53;uE7KhDBG&cYvDPwb}6y}&h@{C=jVSE-p)dyVNc$L}K_ zxnM7Ga4k;aj0C6tRKqxti|jUm$KjVN9v$WB)vyj+Uzjsu0AxDpZyS~vG z7uvHTye#_APh9$l9&?;Jf}Nx2;m}~bLj$*NwS7D?FWky0d#%&%k2&{C`RMfALtC!k zxpIBD_Y=8qioe=2C%GERvvnPfVUK)h z{g}M_b?7VQ&VRAcvqw2%#e;tQmmx>xdu#K4MD7jo)6ZIZmLqqP$Hc2z_&EYOqzxg# z9S_`OVEp;+;KSvAt+nL7JN4JyK5~I_hKwRth|Vsn0QPd;XWeD?PR%st&w;*K;K4ZG zJvHB$e-6AU;=bY_djEskywow|!R3A|zpQ5~QY!YVeQutUUe?|x=6|b1hcC%N6J!q* zI<4!bCD&T#O86%yH|G*1FXWW%KF^-ExtPAW;WaBB`YUt4iaiN}mTqFkTAlD_)(rk98fZ~xrorb6!?@xz?p z>Zg>(lIv?N`QDwU+@~#P#Oo|G&xOHbLx^=!EZeHiRfZzH2^6YbR7zh3EnK+P1)k}PP#(VC5?kM{0!8wOV*3s5@|S z2gnCI9r-2e{#J5Y?(st3bD*2@lt?$OhfdEHPTETD#iVBoyKa@d4E6?V2H&1Kc_L*J zsW0_za#O;SChGfq$9*YDd^_)rA5{L}vGp@w zQZ+m};i0Y*zE0KXzz}=!8p=8QK|I!2%A(w!Y}$E*b`B(;b7}gUk3PjYROEf!lg+$z zY6s(4$+mQh#%j?A8JTn+G^sq>=(?8Yl9etzBW{1vxgX8h`c~%KDMuHkp0^pV^ILfA_Sf}ZW2o|_HjvxrF#8#g@P8xiy3b#GO{Z=X;@(P1 zhegASvxag)bJATN4)K ziZ9j~MamZr{*(B=TU@%4G;aRcU6pS)4j9;bIY*k-PKsNQ-Hby#u}h^V?s{mHC%%Dv zSyPl>T;=1ED0^$bDw_jMjH2wydS7-<5xT)7PplVt+m~84X|hA#*&hb;#>N^$XCJK1 zGtg6=)rPLbY@x@eg7;JOR};DlcIBLsk)`BhnTrnI&bv}*7|(Obn&fpevidW0^AEUA z?DYGTq|P6t40^d|?`J-ow;-|a?v!z!#GK=I_3X{wp`=nz=lHdrPNlEFd(8n7Z#&mL8kLR3=`Srf#DXC|3&I&l0<;zog`i+UV9WnBh zGy7!U53pOhSLbtGD;zo-k@CA2J-i^zSalA^{z z(%($^kMD`kO;`VH!EZTBW%hRj`f?gHr( zo&WO`dCWE~xyG^?W+%1S44NZt$3|-JyyI_g+G*JhM^lYeXPQrtm#tcJg+1)cj-D&5 z@76L`c$0S;qb*yJZ+CL9`ONlMV=#T$vMFWH)$&|pVHvz$mt+jn_j>*k&-r%#I&xI+ zW*&}XGxo8!SHn|`aY@wO0R7dTwrvsacRH|( zb!J`^-Wto*KU6M)tti_|^w7Q9QqKQe%E~@(f^H4yK|S}-hKW3PuP=43^*wo=*Yu>F zdY8`q#oYe_o4QH1G&l;52fo<0Y4_@%ooZSm+eJ3^*Z*i5mL=L=Y|K|)=H)M}O6kG; zUt`a@ySqOoo(=?t^6vM-zEmB`<99A~=#0Sa(4&+#xiGSUk^TH~3&yUyyZ25_H|C%G zDZ(V@LYYtkF8#2G>$0g$-MsR zbqmBN@OmgZ4|{vLFWk9)kN0cyJoWbcVmW*N(>#qMD$qBYr*K};f_h`Yh~?bbl?-sYP*-G(+=8NSkLrb#H}9PK-gbCc3jKqg#^GP{9GW+OGmmeYIPYsb z_@^~BjnMb_o`#bnx$8*5G@jb`EFU>jS0I_WYf65fW93{Fs}tZO~7a-C$zR=-R|~ zJ4{=S@Lf>nR^pFVoX!W5qLJvJTrKVy)Aj$yrPtYw;NkePdRFJdgJNesn~SX7 zx3?^>B8pzmd~`a!kiFg5C?Sm>z>=w8(Ov3?_HVN^}b7^ z|Btyhfvc+8{=oOSm*HOK8NDK-1E454GTn0r1`&)5wXD~Bf|>zW5H(AjxQG>cEkSMe zC1&^lwa_%BAVJgToLaBZm)fgD$<#(DjsJI@0S-vL{{P?a_xb#(<5_o~wbx#I@3q%n zd+l}h322vPYM3BXYP6#YGR2`yMY&SSRK>YF+elsql|b)0L#D)efzI~z!FekFbsNZU z0bAtg@5oZ^@mSkc;PsFte6N(|E?Jg>)ZP|Lmkf#DHK{$_-423XafsUC&huGFe!hqN zd^qs;?FzYFG$-YD8PL@(;#j-$Tp${A%C@OLc4ynflKfyzb^vW-LEF&0`PRX~Hu1a} z`aW8}I;>ZoGh(b=LHigWLo`Q|4I6=VKUL4ic2n`9MjB(r;<1g9XqOqVvG)2s z^J0hN3#8M8H66a$IrV@_C-@Rk=dQ7qceuNq{_I%8I(sASIcTtsjldnT{y3XQYiWHB zV}Iyo9sJoDCOSt2VQ~E|s8e{brNR}{`YB3L~c40s2kif0@O>LJ8TG%fT z+79cs`DCY3e_YvWti7r>b~vN|=b~S2kby$x73 zwjHwRw&VGB-7q7hSX)7^NZLRW$3gnI_h#b+wZ(X*x{-{RS8cvc9W zzQuhz=bQoloHM{nJb0mc>_FOPprCZDIH@DLfwl%7sAwV(RpQ$X@4n3vYiFE1% zYV*56Z#XUv7s*1WT8*~ zSQ~_WRp=ntF+TLWyj;ZTr`6i>zz6Bs6W}cXI^jx^wZRGLt=A_;(EefTFm-KfhP9y; zXLB?hdSL%A7t$kYUoqBdikG#wIVaVs@!i63z*qc@9d^j~>kJkl?v>H`-hMdWyFbqN z*43Sa|9lgC^|=n#hK)|Jxzw7r6Bws>Cl=qP$Uyt0qa7!rJ=4&x6KZeGORYsa3+Hb_0#qj`=_^EME1Q;KV!!;Ui9r(u8!7NcKE&- z?4Lc&9@h1U^YS4(-5GNYhi4&Ji`A^)rW}B6{v+&^a@cQV*U&SvUw>>D*2*!>D8C$S zFRc$^txIy-3GX6k_O?NO&#slf-An72e$Xxc1B@LqkDs9&iAS$;&}{|(TG;H7@EJK{ zEtbzYWfbLa!I{L@C}_t9jvkZ7|+Rnux2F>ht4@^&yZY3WeVXK6fM08v=eYpXG&O zu0~om((>xewM286MDOa7{PsN1%)sv%pr5~M&5IiCYMVy8#)f%>=#syFJ<-Vz#5Z6f z?P^IzC_Q%we29UF8vyMpwCVpF+Aoj@2$Q6XrG7llrP3bFlcZZ_-mZmMv_D7 zlPyR~Ao&}`8Y+-3_`pY@|4B~J4p{e|!+Ob!a7%$34cuI;A6eeGSh{QSeu~BZsKtNR zbL8)-%pGNIp#4o7+OOnBx_JRn`e4Y1*i^f*d)MA}6+_ymxCEVTbi5s;;0 z&>{4U18tR*hj^m4Bpi&JxY|(CF~JsBe5>^+(nto$C)td;4*-91{_lPk__>GpiQxL# zh#x9T3pgTgX>1+QxvidW^qjb4C(giHiZLP6OA9-yD>)P{_@k(e`i;bXC;Ty6@cnPO zPM?bOJ#+EhElQ)d{uk0{UdfgE!vfhsn`Pxi8fz`6(i!-eo zawHu_cpo{z*Mz+-9kn_9*kphE6AXVceH+_{VCV^gJqd=-UoH!SMp!3fO_xQqB5_R* z`InCR$%69J^Y+E2FYo_SeqLSdy)EP5gY&ao1%L6FONf8+jZ}mGT=)hw_Aq_4@XUt= zTTTJz0kq8p*z7Hk5i0Kr%BOX6=fQBnj;B7NGKo$lXc(a}yyI6#a`hWI_Ua}z}m3mW2|Qt0RMID3%v&2bw+C}9)Yx7 z@T-u|`{FbosR5j+Q;G0 zCKl4S*hk36nmZGBTI=M4&vY&J3IPXkPHiXPKX1hP?)TQaV9NDSzwyeZ{5VZlxMl0m& z8susX^z00n$>}j0bZyuJrF|WIXK?BP%->(2-Q6;F#J;|yaIwdU?XkO-6fLGUI2}`= zTRV8I&N9}f8;QN;)A=K*Pdq7a_OA3L7PJMyYmomn$d&7%;kMH)!%w{KYm6NZya?oZ zFFzvo3iduvOa2#<9r8QC*Cph;qIQaOIyB5StYz4VyO3`+@~uU_Q~ASV2@mZq_-!a3 z(HV}uzZM$dd;oQsh5cJfr+SuzMp(4qqd7Ff#)XOdX&TPkSp!=5R&eDK9ozVGe9)9u ztZk`{%5YvA`3uFiLmZCUr){>AaY+?y32}VTxvSoFbCFN}X6doJyVtCj$j9+JYx_(6 z*~UN8_jEQZ*+SH};djaXu4^ZIV+-nX;3rY9P#gmG@`ZRH!kwJaEeEoH12IDLqtM@b zRv6b~OnSAWuW4>3{j?Kwm_Liv1TgOlD}yb5yPnnIyDNh4<|y>K5BjW}7wMDljLL{k z>n=m~6Fdt089st@FQSYD&?WjgxIY8>GzVxbanSwVg6^+C8reM*i$ZCn+ZQ420`~2* z(LaxdeW;^88;AU`a|K$2GZ#3pOFcKM{VX)r$!0OAb!}TPwyB@!dv*KExU&t|n~=+z zfjk6LT^9g`KWu&*>=r7&p{#$q4(WTrb1QTm?SV%^A3IsD#y+5S5_EAX%Aq-g__&h) zcC6NNC3X`G=^!q^;sjn_z#a$DCqI2M=!2*El&4i4P)GAeiQ2c#gfY-icE4b6Qh904 zm=iV4=OWZvTRw-oefI9vL!2<*W$zAu95&SL?DxsHo<_cPU$h>$DCj=K-i zsN8sz8H5-Wt7`KD^1fAVLbnWtfXDx~Z^c6v*%+g^UP3&{t$AwbWIO0)d+2Bf=xRr- zmo$irQ&mztiR@<+{47{sYa(EOV$E@HthGV5hy95!?DJegyjJT}dttq!(fZjmEi?AF z;@m>$L&Vi|?^B3-6kKL<`%4}h<5u>Q>}*6I#XRJMyee4R}k!Q3v^ex zG=H5youR|dm1DlLMVf0}u>X&DEgJ61tBrLlE?7JdcaP$Eiwl+%?4P$}-u}wsyu~}Q z&vBhD&NahB<(4r5S0~mW*Qc#};M?VH15Uf1(Veb-`hnA&t8;;q*7iDlBl8edr6&)rY!F2X-@3HtVuV=3ibz*wp7l6qt$r{bKyfS-f#qR*_fc#SyT{F>h2};9P}z)A;YU7t$bu6CjJJ zkjWItW-{!Bq*}y232V;YYe-oxwXl~p#d+;PsI#WJT&F=@W@1f05pk)*ccexXAWlLX zEXw9)td%JCm+VTi3r4u$+-TgRaZx5v6F1Em5F*W#; z`HeXrXE!p$uxEc9+~@}#c|qlC$;W&PJ(l&b%F+2E;zSwqbzXRMob3nZCEy#*z+s4*sN|Q49T_doBmwafnRy+Yah2}(>4`{s6*tA0K`r7;Ht zm-g{B*u%#@w3jc_ID@D8A&}L*ZlWwxTa841rpQP2_CcB;+t68a6|y}D>3$^J4s4W$ z^TQs$pR+IQk1FJs+h_oAM4Q;VE*&usM)(FaE~4$?%lQgCY=Ip__*A|-@HLPz%~Z_* z-xlVX-NlO-yPpiX3U)v}R7{8|pz^35oPw|4z6TBXnuvyGC-anfB3@;_E&xa7s}VA! zfj*@e1(_bLUuB-I0vB}@Y%a2|jH>qWz7nkv@O)CBCF+7>3iyZ&LpBZpM%;j~7eW0? z@c~qRZyou2K1Su5Zya=EkO%9a7+i*T4QL&Q7+JvwcL3#J9kPdbFGc#>`0Wo~@zIAa z*?SXd&4>jO+5)`o#&6P5<)ou9KI}0*pwBwWCB1}ol;AHQ+o~46W{TwrhY!;Uc3Py` zNr-tH)aAeQu6r5u=zE|nZ+xsSfO*v*k5=+|6275_ztg)8o0-tLtZp^(L~#B#(2kp- z4!0Pg2dF%Z39lJyt>A+Y_Uy55w+3TMu!*4Ge#STw>>{k2sZJ);dpT&r{=Ml6Jj(xj zzBSlwg1&RbxUWK4M;uUh#EKHnvY$-WL)4xRQ{4m~+4xwxYx5q96=;B`Qy9mjhiVveu`Igw{_y?B!}m{i&OJ+W+oRw&uerIr zJAUOozpnTdC#=mg5%WBba}(lMb_j7BE&|OPr@Hah0Pk+#jpy8jcPYq^LFJw~*^QHk zXPdDnFUQH;I3Yg6n5xu(evMj3wr=GC*bWxNW74{Hm%4v@>`x`{3$h3s*M>GDdDg(+ zN$sxz4#oaxI!fLjn^zN?7DUe$#X|3nNehEa7B6ZqhTWmXyU|KNgU8WszQQ=oi4w*t z310<#>W?j0?^0}CjrxIhR-AxWUYL&vFKwss+UmGjSH3i1e=d!&;-&4E;B(pK%Qn)Q zncA~NjdcKGF?Xr&Z(oZsu^Dx8hMpjOL%y^K$jw!>k@L+NvFnyv_PgOdIVj1o>y{So z$9>G|rNj2GUOHmGMvHfiV5^e6$>VW5^xTiIiAm25z#K&FMYbfhg+1u522ZP@TO;#w zV}sOAZ6?U$nx(n>XF#7_1>aXc9lSpuIO)Z??Z-bI++GdYkHUTn@fFk()iz9$ZK9Pn z6tvL35%%yg+gsy8Lk0-@BGf+rfzRMe*iLxgZ=;~&Fpf#T<)e>?-lrJDRQH>ZajJg? z_|8MQYtRM;6=E;9RlaDsZQAe+;-H>FoSVT3?@>Y5+->h_`xfmnqPVdAI(*?Hi|4i9 zzP;s(Iq&2O;2I0@Yx0p1PZw+;Sh(tFfaNstTLkLs2`G5(0!e2pZ3X^_8k$X`0z z-3e>=iIArdv@ywzELV?1rii`}4|y;`Xe;X1%V;YqGXs4^c3n1n1teQs@gwcnGu#Nh zP#F%n+6)~z3^s)9E19_4uSYx=>CXS=FZs@gZM-&mUqRb2uHZ_T3TLeTzQ06_^Ai1d zt*^;C#Gl5%d<`qj(gx%Gnfn6;|42NCHL3(_xHT{OVPEgQ5^hTCPu;O`lXrBFJ11A; z?n$3Kwmz0~5n^>@y%4>Smpay~n&$%wN#hp@9J)8lMw@&18P zi*+4hEy}dUC==FqX2=MAH#r37#^jU+HI~_n=?rPXv53KF32HRrd=4>BiI~Szkq7co zW-q39<*{c?>80$f#l+68HPQZ?cbggW=o(M4?it4dgf^gdS&F(x05=k`eJ7my+brPK zMeSq@Mj11~3#~!JQ2tEBfY5h?OHp19c&GJm4$|oRURIPBjC#xj9|At=*oChp{F0vd zu809dnd#t-cr<{&ncz=@v|}rAKCQFA4bRRR?M+cCeDBi^-(n6!`!JMm1U)v;*hJqR zHiAwFw=60fv2dl}hlS(n4_@pQY2c3yWKBlYMdfPlNsGptuS5%V2;o-rq~%Gp6lp}u zmuQuMmZ>K#^c{1RXra##@7R+T_zngSUAz)4@NWctm8-EQEe^EoC0Zt;W$w;Lbp+qR z_KGy31^%i15DQRAeILa2Yg56ePJLX1aW)ZGIAmU%guVuB!!;b&X4<>MULJkhWOB$! z-M2$d>Sp5p-g0hA5axG}Bb#;iEL*n0h&jo$Z25*H#3jva4z-!_UfUteuY)FzuvO!o zJ9}q)+cu56?TD3~y)1km&#&&Hohj;|OV9qhs9{ab0b<=Qy0E5Fm7+~hx8{DV$%^_AVg$V>D*K+jQ;hPG<m4IH)e!OT6 zYHW6q=rsp5-a!xi-$4)c*rdXDTI^PUUeCU~$Ux6dqG#-b9{9h59_m5uxKZV4yNvq< zX5aS8kDXI@V$NH|)V2ehM_bMhom1)Ek3HomCc+(%0W9m_kOk1D{y(rLh4Qgyb z`CCyw&4qHgNob#0r01y|l!y7Ea%mE5Qrxj;*`~(YEf4cnWC%NZ0`;foSaU|r(n7Cd zehR}pY9@NfJJWRq<{`{uNE7A?%)`N`QsvPh=BrWDLC4IEvOw1v7;G?cI_gP9=)1Yp+>u=Egx7KPl8+ z=>M6J%b_$5(AT6tLjI`^pm~2Ku9x)ngF~iod2Q%ohqCoLv&S46~*i(M5&}XLmpp_R);9kODqv* zLi(tq?1eEvu?;5dRUEA0U@tSfB;>=m3@4ie-?H{GM>zx-qb7s48Ra|?9v$d_xrNR~ zw8Nb6D$cMO0-ij;hX=+P6UHj~3g^6#d?q2E8hZU8(Skl!g@ZrLLu8Yov?lVk|B+vb z;t0s6B>0o83`+p3p8QGV`x|y0zHRu9f)F!s6z4|BYwE$2F2tI^?}asX2>pi7NPa#L zzcu7jiWL1$EztS>NTN!goQwQtY)@cQ?n)R*8O?a=_#x&Zghw zJHhWD*z?ZV_mcfGIiSsf4#m?D-4Oh~{cX4JVhetE;5Yo7b>*=Aec_i9{3E-q!ubzv zSf>z8i?l8wy6t#}miDa)UjrYHX7DFEjf#zv`Th#@WS+@)M1C5<50e)cTmF_c&Vcn= z8?B|VFJ1l?i=%avjMEP|!X9-P_R~?e%*)@kfe$=SLzv{(#@g-x-qk6kH9l)Trz!R6+C%q& zubT1|ArIM|;y$@}CPbdOTW4{C&ief`Ar|3%>Ob@u9pcWm<4o$U>VECA?}+qMnnCUp zUAqQ;BPZ;ar(wT*;vT%i-d}5*7;bH--5y(8Q|8~UIoljZJ{*eWtx@AQ#%dbYzqDUT zYul4JD~9$k$$x5S32&owFmP621NM$HNUn!P;r&PKU$^1RJ!-ohLl@U-U61K#{S4p4 zJ+)=N?KNdS`)RNFin?DU`A=-1y&bZbfwiXXleqR_Xx9$-3erPh*Wqlt2(0TbpM%7_@&*{#+^(WeaC!pg!NI`$y9G{PG&rV_bJ$@{!Sb zFcF;73HXdFYjLIky<@Zm<-Vr&YcGFG)CI$a2tKW>+Olcw5ujPC_HD0K-`5Tv&(^Aa z+OMFD+A_a(dQRCEmml6+oao5L)F2PFR|b4!HNb_>#c~zC706sx zzY^mHp$^ayZ-gzb)s<*oYMk+CE%}7X@lJsTF$NLvPhej$A3o8kYlfI=BRHLHJN#4@ z^s5GbKut@6Ee$x?h&LeLL_T5$Oo+FxK|8+!zt7gP>Fxi7uab0y{5uN2u{X4f1+l3M zp&vGdu}bKRng$X-ITdtYSKr&-iaxC^ zo4Oydj?T2cayk|fOZ{SiAEsVCwcP@l*R;giuBbigoH(rwG7z_Rw=vF!z3q&fK@`V@ zbuhb0=WkG(?0Wmr+5+;Ep^YLy?*iJ;1{zmgk#|=~Z9et|ZMePxy}R<}#unh6fB2;; z(U)frpg(C(2{aKS=h+s5z9pL5zo&Qpt>=6}vkJBZ`NbC86xt%D3g;40ovE*=oEp?g zQ@pU9^e@%J32`3In&UcWUlwZ_$h@;lod%G+no!O{=!BZGd)rH3r;vXN=Lh+hzh#WW zbI)H9GiE3ax17K?bT*-_G|T%9P>!nzI$s9k3clwI1Io7G-RnB^S%m9xT^-7W9}Z*5 zuYG%&@BTcDB}$K2jk&tEijEftA-7+45@lgv|CixCRy@#PbTGab0#-VL--u@Ht zT~gc3;IwTNKlCX0!t*Qx*Uy4j |128b7Dz_hN?xPC0~l8!RBgEtF)Z!hcD{wRJs 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

  • j@O6e-rntvuu;L5e#W-r#YT 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 literal 1029887 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