From 57c47c815f6e401c9a506c799331e76352ed21c2 Mon Sep 17 00:00:00 2001 From: spatialfree Date: Mon, 21 Sep 2020 07:19:43 -0700 Subject: [PATCH] Continuous level generation + custom voxel physics engine --- .gitignore | 71 + .vscode/settings.json | 56 + Assets/Enemy.mat | 77 + Assets/Enemy.mat.meta | 8 + Assets/Example3DTexture.asset | 37 + Assets/Example3DTexture.asset.meta | 8 + Assets/Lighting.cs | 52 + Assets/Lighting.cs.meta | 11 + Assets/Monolith.cs | 466 +++++ Assets/Monolith.cs.meta | 11 + Assets/NaughtyAttributes.meta | 8 + Assets/NaughtyAttributes/README.html | 1581 +++++++++++++++++ Assets/NaughtyAttributes/README.html.meta | 7 + Assets/NaughtyAttributes/Scripts.meta | 10 + Assets/NaughtyAttributes/Scripts/Core.meta | 10 + .../Scripts/Core/DrawerAttributes.meta | 8 + .../DrawerAttributes/AllowNestingAttribute.cs | 9 + .../AllowNestingAttribute.cs.meta | 11 + .../DrawerAttributes/CurveRangeAttribute.cs | 30 + .../CurveRangeAttribute.cs.meta | 11 + .../Core/DrawerAttributes/DrawerAttribute.cs | 11 + .../DrawerAttributes/DrawerAttribute.cs.meta | 11 + .../DrawerAttributes/DropdownAttribute.cs | 57 + .../DropdownAttribute.cs.meta | 11 + .../DrawerAttributes/EnumFlagsAttribute.cs | 9 + .../EnumFlagsAttribute.cs.meta | 11 + .../HorizontalLineAttribute.cs | 20 + .../HorizontalLineAttribute.cs.meta | 11 + .../Core/DrawerAttributes/InfoBoxAttribute.cs | 24 + .../DrawerAttributes/InfoBoxAttribute.cs.meta | 11 + .../DrawerAttributes/InputAxisAttribute.cs | 9 + .../InputAxisAttribute.cs.meta | 11 + .../DrawerAttributes/MinMaxSliderAttribute.cs | 17 + .../MinMaxSliderAttribute.cs.meta | 11 + .../DrawerAttributes/ProgressBarAttribute.cs | 28 + .../ProgressBarAttribute.cs.meta | 11 + .../DrawerAttributes/ReadOnlyAttribute.cs | 10 + .../ReadOnlyAttribute.cs.meta | 11 + .../ResizableTextAreaAttribute.cs | 9 + .../ResizableTextAreaAttribute.cs.meta | 11 + .../Core/DrawerAttributes/SceneAttribute.cs | 9 + .../DrawerAttributes/SceneAttribute.cs.meta | 11 + .../ShowAssetPreviewAttribute.cs | 17 + .../ShowAssetPreviewAttribute.cs.meta | 11 + .../Core/DrawerAttributes/TagAttribute.cs | 9 + .../DrawerAttributes/TagAttribute.cs.meta | 11 + .../Core/DrawerAttributes_SpecialCase.meta | 8 + .../ButtonAttribute.cs | 33 + .../ButtonAttribute.cs.meta | 11 + .../ReorderableListAttribute.cs | 9 + .../ReorderableListAttribute.cs.meta | 11 + .../ShowNativePropertyAttribute.cs | 9 + .../ShowNativePropertyAttribute.cs.meta | 11 + .../ShowNonSerializedFieldAttribute.cs | 9 + .../ShowNonSerializedFieldAttribute.cs.meta | 11 + .../SpecialCaseDrawerAttribute.cs | 8 + .../SpecialCaseDrawerAttribute.cs.meta | 11 + .../Scripts/Core/INaughtyAttribute.cs | 8 + .../Scripts/Core/INaughtyAttribute.cs.meta | 11 + .../Scripts/Core/MetaAttributes.meta | 8 + .../Core/MetaAttributes/BoxGroupAttribute.cs | 15 + .../MetaAttributes/BoxGroupAttribute.cs.meta | 11 + .../Core/MetaAttributes/DisableIfAttribute.cs | 20 + .../MetaAttributes/DisableIfAttribute.cs.meta | 11 + .../Core/MetaAttributes/EnableIfAttribute.cs | 20 + .../MetaAttributes/EnableIfAttribute.cs.meta | 11 + .../MetaAttributes/EnableIfAttributeBase.cs | 23 + .../EnableIfAttributeBase.cs.meta | 11 + .../Core/MetaAttributes/HideIfAttribute.cs | 20 + .../MetaAttributes/HideIfAttribute.cs.meta | 11 + .../Core/MetaAttributes/LabelAttribute.cs | 15 + .../MetaAttributes/LabelAttribute.cs.meta | 11 + .../Core/MetaAttributes/MetaAttribute.cs | 8 + .../Core/MetaAttributes/MetaAttribute.cs.meta | 11 + .../MetaAttributes/OnValueChangedAttribute.cs | 15 + .../OnValueChangedAttribute.cs.meta | 11 + .../Core/MetaAttributes/ShowIfAttribute.cs | 20 + .../MetaAttributes/ShowIfAttribute.cs.meta | 11 + .../MetaAttributes/ShowIfAttributeBase.cs | 23 + .../ShowIfAttributeBase.cs.meta | 11 + .../Core/NaughtyAttributes.Core.asmdef | 12 + .../Core/NaughtyAttributes.Core.asmdef.meta | 7 + .../Scripts/Core/Utility.meta | 8 + .../Scripts/Core/Utility/EColor.cs | 56 + .../Scripts/Core/Utility/EColor.cs.meta | 11 + .../Core/Utility/EConditionOperator.cs | 10 + .../Core/Utility/EConditionOperator.cs.meta | 11 + .../Scripts/Core/ValidatorAttributes.meta | 8 + .../ValidatorAttributes/MaxValueAttribute.cs | 20 + .../MaxValueAttribute.cs.meta | 11 + .../ValidatorAttributes/MinValueAttribute.cs | 20 + .../MinValueAttribute.cs.meta | 11 + .../ValidatorAttributes/RequiredAttribute.cs | 15 + .../RequiredAttribute.cs.meta | 11 + .../ValidateInputAttribute.cs | 17 + .../ValidateInputAttribute.cs.meta | 11 + .../ValidatorAttributes/ValidatorAttribute.cs | 8 + .../ValidatorAttribute.cs.meta | 11 + Assets/NaughtyAttributes/Scripts/Editor.meta | 10 + .../Scripts/Editor/DecoratorDrawers.meta | 8 + .../HorizontalLineDecoratorDrawer.cs | 23 + .../HorizontalLineDecoratorDrawer.cs.meta | 11 + .../InfoBoxDecoratorDrawer.cs | 54 + .../InfoBoxDecoratorDrawer.cs.meta | 11 + .../Editor/NaughtyAttributes.Editor.asmdef | 16 + .../NaughtyAttributes.Editor.asmdef.meta | 7 + .../Scripts/Editor/NaughtyInspector.cs | 179 ++ .../Scripts/Editor/NaughtyInspector.cs.meta | 11 + .../Scripts/Editor/PropertyDrawers.meta | 8 + .../AllowNestingPropertyDrawer.cs | 16 + .../AllowNestingPropertyDrawer.cs.meta | 11 + .../CurveRangePropertyDrawer.cs | 39 + .../CurveRangePropertyDrawer.cs.meta | 11 + .../PropertyDrawers/DropdownPropertyDrawer.cs | 182 ++ .../DropdownPropertyDrawer.cs.meta | 11 + .../EnumFlagsPropertyDrawer.cs | 38 + .../EnumFlagsPropertyDrawer.cs.meta | 11 + .../InputAxisPropertyDrawer.cs | 75 + .../InputAxisPropertyDrawer.cs.meta | 11 + .../MinMaxSliderPropertyDrawer.cs | 87 + .../MinMaxSliderPropertyDrawer.cs.meta | 11 + .../ProgressBarPropertyDrawer.cs | 133 ++ .../ProgressBarPropertyDrawer.cs.meta | 11 + .../PropertyDrawers/PropertyDrawerBase.cs | 86 + .../PropertyDrawerBase.cs.meta | 11 + .../PropertyDrawers/ReadOnlyPropertyDrawer.cs | 25 + .../ReadOnlyPropertyDrawer.cs.meta | 11 + .../ResizableTextAreaPropertyDrawer.cs | 87 + .../ResizableTextAreaPropertyDrawer.cs.meta | 11 + .../PropertyDrawers/ScenePropertyDrawer.cs | 86 + .../ScenePropertyDrawer.cs.meta | 11 + .../ShowAssetPreviewPropertyDrawer.cs | 101 ++ .../ShowAssetPreviewPropertyDrawer.cs.meta | 11 + .../PropertyDrawers/TagPropertyDrawer.cs | 60 + .../PropertyDrawers/TagPropertyDrawer.cs.meta | 11 + .../Editor/PropertyDrawers_SpecialCase.meta | 8 + .../ReorderableListPropertyDrawer.cs | 68 + .../ReorderableListPropertyDrawer.cs.meta | 11 + .../SpecialCasePropertyDrawerBase.cs | 66 + .../SpecialCasePropertyDrawerBase.cs.meta | 11 + .../Scripts/Editor/PropertyValidators.meta | 8 + .../MaxValuePropertyValidator.cs | 33 + .../MaxValuePropertyValidator.cs.meta | 11 + .../MinValuePropertyValidator.cs | 33 + .../MinValuePropertyValidator.cs.meta | 11 + .../PropertyValidatorBase.cs | 38 + .../PropertyValidatorBase.cs.meta | 11 + .../RequiredPropertyValidator.cs | 31 + .../RequiredPropertyValidator.cs.meta | 11 + .../ValidateInputPropertyValidator.cs | 75 + .../ValidateInputPropertyValidator.cs.meta | 11 + .../Scripts/Editor/Utility.meta | 10 + .../Scripts/Editor/Utility/ButtonUtility.cs | 55 + .../Editor/Utility/ButtonUtility.cs.meta | 11 + .../Editor/Utility/NaughtyEditorGUI.cs | 331 ++++ .../Editor/Utility/NaughtyEditorGUI.cs.meta | 13 + .../Scripts/Editor/Utility/PropertyUtility.cs | 288 +++ .../Editor/Utility/PropertyUtility.cs.meta | 11 + .../Editor/Utility/ReflectionUtility.cs | 84 + .../Editor/Utility/ReflectionUtility.cs.meta | 13 + Assets/NaughtyAttributes/Scripts/Test.meta | 8 + .../Scripts/Test/BoxGroupTest.cs | 32 + .../Scripts/Test/BoxGroupTest.cs.meta | 11 + .../Scripts/Test/ButtonTest.cs | 39 + .../Scripts/Test/ButtonTest.cs.meta | 11 + .../Scripts/Test/CurveRangeTest.cs | 32 + .../Scripts/Test/CurveRangeTest.cs.meta | 11 + .../Scripts/Test/DisableIfTest.cs | 56 + .../Scripts/Test/DisableIfTest.cs.meta | 11 + .../Scripts/Test/DropdownTest.cs | 45 + .../Scripts/Test/DropdownTest.cs.meta | 11 + .../Scripts/Test/EnableIfTest.cs | 56 + .../Scripts/Test/EnableIfTest.cs.meta | 11 + .../Scripts/Test/EnumFlagsTest.cs | 39 + .../Scripts/Test/EnumFlagsTest.cs.meta | 11 + .../Scripts/Test/HideIfTest.cs | 56 + .../Scripts/Test/HideIfTest.cs.meta | 11 + .../Scripts/Test/HorizontalLineTest.cs | 51 + .../Scripts/Test/HorizontalLineTest.cs.meta | 11 + .../Scripts/Test/InfoBoxTest.cs | 28 + .../Scripts/Test/InfoBoxTest.cs.meta | 11 + .../Scripts/Test/InputAxisTest.cs | 34 + .../Scripts/Test/InputAxisTest.cs.meta | 11 + .../Scripts/Test/LabelTest.cs | 30 + .../Scripts/Test/LabelTest.cs.meta | 11 + .../Scripts/Test/MinMaxSliderTest.cs | 28 + .../Scripts/Test/MinMaxSliderTest.cs.meta | 11 + .../Scripts/Test/MinMaxValueTest.cs | 52 + .../Scripts/Test/MinMaxValueTest.cs.meta | 11 + .../Test/NaughtyAttributes.Test.asmdef | 14 + .../Test/NaughtyAttributes.Test.asmdef.meta | 7 + .../Scripts/Test/OnValueChangedTest.cs | 51 + .../Scripts/Test/OnValueChangedTest.cs.meta | 11 + .../Scripts/Test/ProgressBarTest.cs | 35 + .../Scripts/Test/ProgressBarTest.cs.meta | 11 + .../Scripts/Test/ReadOnlyTest.cs | 28 + .../Scripts/Test/ReadOnlyTest.cs.meta | 11 + .../Scripts/Test/ReorderableListTest.cs | 25 + .../Scripts/Test/ReorderableListTest.cs.meta | 11 + .../Scripts/Test/RequiredTest.cs | 30 + .../Scripts/Test/RequiredTest.cs.meta | 11 + .../Scripts/Test/ResizableTextAreaTest.cs | 28 + .../Test/ResizableTextAreaTest.cs.meta | 11 + .../Scripts/Test/SceneTest.cs | 28 + .../Scripts/Test/SceneTest.cs.meta | 11 + .../Scripts/Test/ShowAssetPreviewTest.cs | 37 + .../Scripts/Test/ShowAssetPreviewTest.cs.meta | 11 + .../Scripts/Test/ShowIfTest.cs | 56 + .../Scripts/Test/ShowIfTest.cs.meta | 11 + .../Scripts/Test/ShowNativePropertyTest.cs | 25 + .../Test/ShowNativePropertyTest.cs.meta | 11 + .../Test/ShowNonSerializedFieldTest.cs | 18 + .../Test/ShowNonSerializedFieldTest.cs.meta | 11 + .../NaughtyAttributes/Scripts/Test/TagTest.cs | 34 + .../Scripts/Test/TagTest.cs.meta | 11 + .../Scripts/Test/ValidateInputTest.cs | 45 + .../Scripts/Test/ValidateInputTest.cs.meta | 11 + .../Scripts/Test/_NaughtyComponent.cs | 19 + .../Scripts/Test/_NaughtyComponent.cs.meta | 13 + .../Scripts/Test/_NaughtyScriptableObject.cs | 22 + .../Test/_NaughtyScriptableObject.cs.meta | 13 + Assets/NaughtyAttributes/package.json | 17 + Assets/NaughtyAttributes/package.json.meta | 7 + Assets/NewShaderVariants.shadervariants | 15 + Assets/NewShaderVariants.shadervariants.meta | 8 + Assets/Path.mat | 94 + Assets/Path.mat.meta | 8 + Assets/Piece.mat | 77 + Assets/Piece.mat.meta | 8 + Assets/Render.cs | 137 ++ Assets/Render.cs.meta | 11 + Assets/Scenes.meta | 8 + Assets/Scenes/Main.unity | 422 +++++ Assets/Scenes/Main.unity.meta | 7 + Assets/Simulate.cs | 68 + Assets/Simulate.cs.meta | 11 + Assets/Voxel.mat | 77 + Assets/Voxel.mat.meta | 8 + Assets/Voxel.shader | 73 + Assets/Voxel.shader.meta | 9 + Assets/XR.meta | 8 + Assets/XR/Loaders.meta | 8 + Assets/XR/Loaders/Oculus Loader.asset | 14 + Assets/XR/Loaders/Oculus Loader.asset.meta | 8 + Assets/XR/Settings.meta | 8 + Assets/XR/Settings/Oculus Settings.asset | 19 + Assets/XR/Settings/Oculus Settings.asset.meta | 8 + Assets/XR/XRGeneralSettings.asset | 48 + Assets/XR/XRGeneralSettings.asset.meta | 8 + Assets/fps-zencore.blend | Bin 0 -> 636968 bytes Assets/fps-zencore.blend.meta | 96 + Assets/fps-zencore.blend1 | Bin 0 -> 636968 bytes Assets/fps-zencore.blend1.meta | 7 + Packages/manifest.json | 44 + ProjectSettings/AudioManager.asset | 19 + ProjectSettings/ClusterInputManager.asset | 6 + ProjectSettings/DynamicsManager.asset | 34 + ProjectSettings/EditorBuildSettings.asset | 15 + ProjectSettings/EditorSettings.asset | 35 + ProjectSettings/GraphicsSettings.asset | 68 + ProjectSettings/InputManager.asset | 295 +++ ProjectSettings/NavMeshAreas.asset | 91 + ProjectSettings/Physics2DSettings.asset | 56 + ProjectSettings/PresetManager.asset | 7 + ProjectSettings/ProjectSettings.asset | 766 ++++++++ ProjectSettings/ProjectVersion.txt | 2 + ProjectSettings/QualitySettings.asset | 58 + ProjectSettings/TagManager.asset | 44 + ProjectSettings/TimeManager.asset | 9 + ProjectSettings/UnityConnectSettings.asset | 34 + ProjectSettings/VFXManager.asset | 12 + ProjectSettings/XRSettings.asset | 10 + 272 files changed, 10621 insertions(+) create mode 100644 .gitignore create mode 100644 .vscode/settings.json create mode 100644 Assets/Enemy.mat create mode 100644 Assets/Enemy.mat.meta create mode 100644 Assets/Example3DTexture.asset create mode 100644 Assets/Example3DTexture.asset.meta create mode 100644 Assets/Lighting.cs create mode 100644 Assets/Lighting.cs.meta create mode 100644 Assets/Monolith.cs create mode 100644 Assets/Monolith.cs.meta create mode 100644 Assets/NaughtyAttributes.meta create mode 100644 Assets/NaughtyAttributes/README.html create mode 100644 Assets/NaughtyAttributes/README.html.meta create mode 100644 Assets/NaughtyAttributes/Scripts.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Core.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/AllowNestingAttribute.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/AllowNestingAttribute.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/CurveRangeAttribute.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/CurveRangeAttribute.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/DrawerAttribute.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/DrawerAttribute.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/DropdownAttribute.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/DropdownAttribute.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/EnumFlagsAttribute.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/EnumFlagsAttribute.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/HorizontalLineAttribute.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/HorizontalLineAttribute.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/InfoBoxAttribute.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/InfoBoxAttribute.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/InputAxisAttribute.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/InputAxisAttribute.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/MinMaxSliderAttribute.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/MinMaxSliderAttribute.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/ProgressBarAttribute.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/ProgressBarAttribute.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/ReadOnlyAttribute.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/ReadOnlyAttribute.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/ResizableTextAreaAttribute.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/ResizableTextAreaAttribute.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/SceneAttribute.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/SceneAttribute.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/ShowAssetPreviewAttribute.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/ShowAssetPreviewAttribute.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/TagAttribute.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/TagAttribute.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase/ButtonAttribute.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase/ButtonAttribute.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase/ReorderableListAttribute.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase/ReorderableListAttribute.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase/ShowNativePropertyAttribute.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase/ShowNativePropertyAttribute.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase/ShowNonSerializedFieldAttribute.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase/ShowNonSerializedFieldAttribute.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase/SpecialCaseDrawerAttribute.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase/SpecialCaseDrawerAttribute.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Core/INaughtyAttribute.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Core/INaughtyAttribute.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Core/MetaAttributes.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/BoxGroupAttribute.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/BoxGroupAttribute.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/DisableIfAttribute.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/DisableIfAttribute.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/EnableIfAttribute.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/EnableIfAttribute.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/EnableIfAttributeBase.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/EnableIfAttributeBase.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/HideIfAttribute.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/HideIfAttribute.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/LabelAttribute.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/LabelAttribute.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/MetaAttribute.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/MetaAttribute.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/OnValueChangedAttribute.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/OnValueChangedAttribute.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/ShowIfAttribute.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/ShowIfAttribute.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/ShowIfAttributeBase.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/ShowIfAttributeBase.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Core/NaughtyAttributes.Core.asmdef create mode 100644 Assets/NaughtyAttributes/Scripts/Core/NaughtyAttributes.Core.asmdef.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Core/Utility.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Core/Utility/EColor.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Core/Utility/EColor.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Core/Utility/EConditionOperator.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Core/Utility/EConditionOperator.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Core/ValidatorAttributes.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Core/ValidatorAttributes/MaxValueAttribute.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Core/ValidatorAttributes/MaxValueAttribute.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Core/ValidatorAttributes/MinValueAttribute.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Core/ValidatorAttributes/MinValueAttribute.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Core/ValidatorAttributes/RequiredAttribute.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Core/ValidatorAttributes/RequiredAttribute.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Core/ValidatorAttributes/ValidateInputAttribute.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Core/ValidatorAttributes/ValidateInputAttribute.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Core/ValidatorAttributes/ValidatorAttribute.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Core/ValidatorAttributes/ValidatorAttribute.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Editor.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Editor/DecoratorDrawers.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Editor/DecoratorDrawers/HorizontalLineDecoratorDrawer.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Editor/DecoratorDrawers/HorizontalLineDecoratorDrawer.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Editor/DecoratorDrawers/InfoBoxDecoratorDrawer.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Editor/DecoratorDrawers/InfoBoxDecoratorDrawer.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Editor/NaughtyAttributes.Editor.asmdef create mode 100644 Assets/NaughtyAttributes/Scripts/Editor/NaughtyAttributes.Editor.asmdef.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Editor/NaughtyInspector.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Editor/NaughtyInspector.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/AllowNestingPropertyDrawer.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/AllowNestingPropertyDrawer.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/CurveRangePropertyDrawer.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/CurveRangePropertyDrawer.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/DropdownPropertyDrawer.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/DropdownPropertyDrawer.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/EnumFlagsPropertyDrawer.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/EnumFlagsPropertyDrawer.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/InputAxisPropertyDrawer.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/InputAxisPropertyDrawer.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/MinMaxSliderPropertyDrawer.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/MinMaxSliderPropertyDrawer.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ProgressBarPropertyDrawer.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ProgressBarPropertyDrawer.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/PropertyDrawerBase.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/PropertyDrawerBase.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ReadOnlyPropertyDrawer.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ReadOnlyPropertyDrawer.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ResizableTextAreaPropertyDrawer.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ResizableTextAreaPropertyDrawer.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ScenePropertyDrawer.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ScenePropertyDrawer.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ShowAssetPreviewPropertyDrawer.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ShowAssetPreviewPropertyDrawer.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/TagPropertyDrawer.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/TagPropertyDrawer.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers_SpecialCase.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers_SpecialCase/ReorderableListPropertyDrawer.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers_SpecialCase/ReorderableListPropertyDrawer.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers_SpecialCase/SpecialCasePropertyDrawerBase.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers_SpecialCase/SpecialCasePropertyDrawerBase.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Editor/PropertyValidators.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Editor/PropertyValidators/MaxValuePropertyValidator.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Editor/PropertyValidators/MaxValuePropertyValidator.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Editor/PropertyValidators/MinValuePropertyValidator.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Editor/PropertyValidators/MinValuePropertyValidator.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Editor/PropertyValidators/PropertyValidatorBase.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Editor/PropertyValidators/PropertyValidatorBase.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Editor/PropertyValidators/RequiredPropertyValidator.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Editor/PropertyValidators/RequiredPropertyValidator.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Editor/PropertyValidators/ValidateInputPropertyValidator.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Editor/PropertyValidators/ValidateInputPropertyValidator.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Editor/Utility.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Editor/Utility/ButtonUtility.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Editor/Utility/ButtonUtility.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Editor/Utility/NaughtyEditorGUI.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Editor/Utility/NaughtyEditorGUI.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Editor/Utility/PropertyUtility.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Editor/Utility/PropertyUtility.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Editor/Utility/ReflectionUtility.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Editor/Utility/ReflectionUtility.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Test.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Test/BoxGroupTest.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Test/BoxGroupTest.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Test/ButtonTest.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Test/ButtonTest.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Test/CurveRangeTest.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Test/CurveRangeTest.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Test/DisableIfTest.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Test/DisableIfTest.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Test/DropdownTest.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Test/DropdownTest.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Test/EnableIfTest.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Test/EnableIfTest.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Test/EnumFlagsTest.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Test/EnumFlagsTest.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Test/HideIfTest.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Test/HideIfTest.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Test/HorizontalLineTest.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Test/HorizontalLineTest.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Test/InfoBoxTest.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Test/InfoBoxTest.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Test/InputAxisTest.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Test/InputAxisTest.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Test/LabelTest.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Test/LabelTest.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Test/MinMaxSliderTest.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Test/MinMaxSliderTest.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Test/MinMaxValueTest.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Test/MinMaxValueTest.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Test/NaughtyAttributes.Test.asmdef create mode 100644 Assets/NaughtyAttributes/Scripts/Test/NaughtyAttributes.Test.asmdef.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Test/OnValueChangedTest.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Test/OnValueChangedTest.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Test/ProgressBarTest.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Test/ProgressBarTest.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Test/ReadOnlyTest.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Test/ReadOnlyTest.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Test/ReorderableListTest.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Test/ReorderableListTest.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Test/RequiredTest.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Test/RequiredTest.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Test/ResizableTextAreaTest.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Test/ResizableTextAreaTest.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Test/SceneTest.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Test/SceneTest.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Test/ShowAssetPreviewTest.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Test/ShowAssetPreviewTest.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Test/ShowIfTest.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Test/ShowIfTest.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Test/ShowNativePropertyTest.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Test/ShowNativePropertyTest.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Test/ShowNonSerializedFieldTest.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Test/ShowNonSerializedFieldTest.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Test/TagTest.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Test/TagTest.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Test/ValidateInputTest.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Test/ValidateInputTest.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Test/_NaughtyComponent.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Test/_NaughtyComponent.cs.meta create mode 100644 Assets/NaughtyAttributes/Scripts/Test/_NaughtyScriptableObject.cs create mode 100644 Assets/NaughtyAttributes/Scripts/Test/_NaughtyScriptableObject.cs.meta create mode 100644 Assets/NaughtyAttributes/package.json create mode 100644 Assets/NaughtyAttributes/package.json.meta create mode 100644 Assets/NewShaderVariants.shadervariants create mode 100644 Assets/NewShaderVariants.shadervariants.meta create mode 100644 Assets/Path.mat create mode 100644 Assets/Path.mat.meta create mode 100644 Assets/Piece.mat create mode 100644 Assets/Piece.mat.meta create mode 100644 Assets/Render.cs create mode 100644 Assets/Render.cs.meta create mode 100644 Assets/Scenes.meta create mode 100644 Assets/Scenes/Main.unity create mode 100644 Assets/Scenes/Main.unity.meta create mode 100644 Assets/Simulate.cs create mode 100644 Assets/Simulate.cs.meta create mode 100644 Assets/Voxel.mat create mode 100644 Assets/Voxel.mat.meta create mode 100644 Assets/Voxel.shader create mode 100644 Assets/Voxel.shader.meta create mode 100644 Assets/XR.meta create mode 100644 Assets/XR/Loaders.meta create mode 100644 Assets/XR/Loaders/Oculus Loader.asset create mode 100644 Assets/XR/Loaders/Oculus Loader.asset.meta create mode 100644 Assets/XR/Settings.meta create mode 100644 Assets/XR/Settings/Oculus Settings.asset create mode 100644 Assets/XR/Settings/Oculus Settings.asset.meta create mode 100644 Assets/XR/XRGeneralSettings.asset create mode 100644 Assets/XR/XRGeneralSettings.asset.meta create mode 100644 Assets/fps-zencore.blend create mode 100644 Assets/fps-zencore.blend.meta create mode 100644 Assets/fps-zencore.blend1 create mode 100644 Assets/fps-zencore.blend1.meta create mode 100644 Packages/manifest.json create mode 100644 ProjectSettings/AudioManager.asset create mode 100644 ProjectSettings/ClusterInputManager.asset create mode 100644 ProjectSettings/DynamicsManager.asset create mode 100644 ProjectSettings/EditorBuildSettings.asset create mode 100644 ProjectSettings/EditorSettings.asset create mode 100644 ProjectSettings/GraphicsSettings.asset create mode 100644 ProjectSettings/InputManager.asset create mode 100644 ProjectSettings/NavMeshAreas.asset create mode 100644 ProjectSettings/Physics2DSettings.asset create mode 100644 ProjectSettings/PresetManager.asset create mode 100644 ProjectSettings/ProjectSettings.asset create mode 100644 ProjectSettings/ProjectVersion.txt create mode 100644 ProjectSettings/QualitySettings.asset create mode 100644 ProjectSettings/TagManager.asset create mode 100644 ProjectSettings/TimeManager.asset create mode 100644 ProjectSettings/UnityConnectSettings.asset create mode 100644 ProjectSettings/VFXManager.asset create mode 100644 ProjectSettings/XRSettings.asset diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..07da593 --- /dev/null +++ b/.gitignore @@ -0,0 +1,71 @@ +# This .gitignore file should be placed at the root of your Unity project directory +# +# Get latest from https://github.com/github/gitignore/blob/master/Unity.gitignore +# +/[Ll]ibrary/ +/[Tt]emp/ +/[Oo]bj/ +/[Bb]uild/ +/[Bb]uilds/ +/[Ll]ogs/ +/[Uu]ser[Ss]ettings/ + +# MemoryCaptures can get excessive in size. +# They also could contain extremely sensitive data +/[Mm]emoryCaptures/ + +# Asset meta data should only be ignored when the corresponding asset is also ignored +!/[Aa]ssets/**/*.meta + +# Uncomment this line if you wish to ignore the asset store tools plugin +# /[Aa]ssets/AssetStoreTools* + +# Autogenerated Jetbrains Rider plugin +/[Aa]ssets/Plugins/Editor/JetBrains* + +# Visual Studio cache directory +.vs/ + +# Gradle cache directory +.gradle/ + +# Autogenerated VS/MD/Consulo solution and project files +ExportedObj/ +.consulo/ +*.csproj +*.unityproj +*.sln +*.suo +*.tmp +*.user +*.userprefs +*.pidb +*.booproj +*.svd +*.pdb +*.mdb +*.opendb +*.VC.db + +# Unity3D generated meta files +*.pidb.meta +*.pdb.meta +*.mdb.meta + +# Unity3D generated file on crash reports +sysinfo.txt + +# Builds +*.apk +*.aab +*.unitypackage + +# Crashlytics generated file +crashlytics-build.properties + +# Packed Addressables +/[Aa]ssets/[Aa]ddressable[Aa]ssets[Dd]ata/*/*.bin* + +# Temporary auto-generated Android Assets +/[Aa]ssets/[Ss]treamingAssets/aa.meta +/[Aa]ssets/[Ss]treamingAssets/aa/* \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..1060b04 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,56 @@ +{ + "files.exclude": + { + "**/.DS_Store":true, + "**/.git":true, + "**/.gitignore":true, + "**/.gitmodules":true, + "**/*.booproj":true, + "**/*.pidb":true, + "**/*.suo":true, + "**/*.user":true, + "**/*.userprefs":true, + "**/*.unityproj":true, + "**/*.dll":true, + "**/*.exe":true, + "**/*.pdf":true, + "**/*.mid":true, + "**/*.midi":true, + "**/*.wav":true, + "**/*.gif":true, + "**/*.ico":true, + "**/*.jpg":true, + "**/*.jpeg":true, + "**/*.png":true, + "**/*.psd":true, + "**/*.tga":true, + "**/*.tif":true, + "**/*.tiff":true, + "**/*.3ds":true, + "**/*.3DS":true, + "**/*.fbx":true, + "**/*.FBX":true, + "**/*.lxo":true, + "**/*.LXO":true, + "**/*.ma":true, + "**/*.MA":true, + "**/*.obj":true, + "**/*.OBJ":true, + "**/*.asset":true, + "**/*.cubemap":true, + "**/*.flare":true, + "**/*.mat":true, + "**/*.meta":true, + "**/*.prefab":true, + "**/*.unity":true, + "build/":true, + "Build/":true, + "Library/":true, + "library/":true, + "obj/":true, + "Obj/":true, + "ProjectSettings/":true, + "temp/":true, + "Temp/":true + } +} \ No newline at end of file diff --git a/Assets/Enemy.mat b/Assets/Enemy.mat new file mode 100644 index 0000000..a00a6aa --- /dev/null +++ b/Assets/Enemy.mat @@ -0,0 +1,77 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Enemy + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 1, g: 0.25, b: 0.25, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} diff --git a/Assets/Enemy.mat.meta b/Assets/Enemy.mat.meta new file mode 100644 index 0000000..59c8084 --- /dev/null +++ b/Assets/Enemy.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d9312e72de6721d41975fc093421fc2f +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Example3DTexture.asset b/Assets/Example3DTexture.asset new file mode 100644 index 0000000..4e7c430 --- /dev/null +++ b/Assets/Example3DTexture.asset @@ -0,0 +1,37 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!117 &11700000 +Texture3D: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Example3DTexture + m_ImageContentsHash: + serializedVersion: 2 + Hash: 00000000000000000000000000000000 + m_ForcedFallbackFormat: 4 + m_DownscaleFallback: 0 + serializedVersion: 3 + m_ColorSpace: 0 + m_Format: 8 + m_Width: 32 + m_Height: 32 + m_Depth: 32 + m_MipCount: 1 + m_DataSize: 131072 + m_TextureSettings: + serializedVersion: 2 + m_FilterMode: 1 + m_Aniso: 1 + m_MipBias: 0 + m_WrapU: 1 + m_WrapV: 1 + m_WrapW: 1 + m_IsReadable: 1 + image data: 131072 + _typelessdata: 000000ff080000ff100000ff190000ff210000ff290000ff310000ff3a0000ff420000ff4a0000ff520000ff5a0000ff630000ff6b0000ff730000ff7b0000ff840000ff8c0000ff940000ff9c0000ffa50000ffad0000ffb50000ffbd0000ffc50000ffce0000ffd60000ffde0000ffe60000ffef0000fff70000ffff0000ff000800ff080800ff100800ff190800ff210800ff290800ff310800ff3a0800ff420800ff4a0800ff520800ff5a0800ff630800ff6b0800ff730800ff7b0800ff840800ff8c0800ff940800ff9c0800ffa50800ffad0800ffb50800ffbd0800ffc50800ffce0800ffd60800ffde0800ffe60800ffef0800fff70800ffff0800ff001000ff081000ff101000ff191000ff211000ff291000ff311000ff3a1000ff421000ff4a1000ff521000ff5a1000ff631000ff6b1000ff731000ff7b1000ff841000ff8c1000ff941000ff9c1000ffa51000ffad1000ffb51000ffbd1000ffc51000ffce1000ffd61000ffde1000ffe61000ffef1000fff71000ffff1000ff001900ff081900ff101900ff191900ff211900ff291900ff311900ff3a1900ff421900ff4a1900ff521900ff5a1900ff631900ff6b1900ff731900ff7b1900ff841900ff8c1900ff941900ff9c1900ffa51900ffad1900ffb51900ffbd1900ffc51900ffce1900ffd61900ffde1900ffe61900ffef1900fff71900ffff1900ff002100ff082100ff102100ff192100ff212100ff292100ff312100ff3a2100ff422100ff4a2100ff522100ff5a2100ff632100ff6b2100ff732100ff7b2100ff842100ff8c2100ff942100ff9c2100ffa52100ffad2100ffb52100ffbd2100ffc52100ffce2100ffd62100ffde2100ffe62100ffef2100fff72100ffff2100ff002900ff082900ff102900ff192900ff212900ff292900ff312900ff3a2900ff422900ff4a2900ff522900ff5a2900ff632900ff6b2900ff732900ff7b2900ff842900ff8c2900ff942900ff9c2900ffa52900ffad2900ffb52900ffbd2900ffc52900ffce2900ffd62900ffde2900ffe62900ffef2900fff72900ffff2900ff003100ff083100ff103100ff193100ff213100ff293100ff313100ff3a3100ff423100ff4a3100ff523100ff5a3100ff633100ff6b3100ff733100ff7b3100ff843100ff8c3100ff943100ff9c3100ffa53100ffad3100ffb53100ffbd3100ffc53100ffce3100ffd63100ffde3100ffe63100ffef3100fff73100ffff3100ff003a00ff083a00ff103a00ff193a00ff213a00ff293a00ff313a00ff3a3a00ff423a00ff4a3a00ff523a00ff5a3a00ff633a00ff6b3a00ff733a00ff7b3a00ff843a00ff8c3a00ff943a00ff9c3a00ffa53a00ffad3a00ffb53a00ffbd3a00ffc53a00ffce3a00ffd63a00ffde3a00ffe63a00ffef3a00fff73a00ffff3a00ff004200ff084200ff104200ff194200ff214200ff294200ff314200ff3a4200ff424200ff4a4200ff524200ff5a4200ff634200ff6b4200ff734200ff7b4200ff844200ff8c4200ff944200ff9c4200ffa54200ffad4200ffb54200ffbd4200ffc54200ffce4200ffd64200ffde4200ffe64200ffef4200fff74200ffff4200ff004a00ff084a00ff104a00ff194a00ff214a00ff294a00ff314a00ff3a4a00ff424a00ff4a4a00ff524a00ff5a4a00ff634a00ff6b4a00ff734a00ff7b4a00ff844a00ff8c4a00ff944a00ff9c4a00ffa54a00ffad4a00ffb54a00ffbd4a00ffc54a00ffce4a00ffd64a00ffde4a00ffe64a00ffef4a00fff74a00ffff4a00ff005200ff085200ff105200ff195200ff215200ff295200ff315200ff3a5200ff425200ff4a5200ff525200ff5a5200ff635200ff6b5200ff735200ff7b5200ff845200ff8c5200ff945200ff9c5200ffa55200ffad5200ffb55200ffbd5200ffc55200ffce5200ffd65200ffde5200ffe65200ffef5200fff75200ffff5200ff005a00ff085a00ff105a00ff195a00ff215a00ff295a00ff315a00ff3a5a00ff425a00ff4a5a00ff525a00ff5a5a00ff635a00ff6b5a00ff735a00ff7b5a00ff845a00ff8c5a00ff945a00ff9c5a00ffa55a00ffad5a00ffb55a00ffbd5a00ffc55a00ffce5a00ffd65a00ffde5a00ffe65a00ffef5a00fff75a00ffff5a00ff006300ff086300ff106300ff196300ff216300ff296300ff316300ff3a6300ff426300ff4a6300ff526300ff5a6300ff636300ff6b6300ff736300ff7b6300ff846300ff8c6300ff946300ff9c6300ffa56300ffad6300ffb56300ffbd6300ffc56300ffce6300ffd66300ffde6300ffe66300ffef6300fff76300ffff6300ff006b00ff086b00ff106b00ff196b00ff216b00ff296b00ff316b00ff3a6b00ff426b00ff4a6b00ff526b00ff5a6b00ff636b00ff6b6b00ff736b00ff7b6b00ff846b00ff8c6b00ff946b00ff9c6b00ffa56b00ffad6b00ffb56b00ffbd6b00ffc56b00ffce6b00ffd66b00ffde6b00ffe66b00ffef6b00fff76b00ffff6b00ff007300ff087300ff107300ff197300ff217300ff297300ff317300ff3a7300ff427300ff4a7300ff527300ff5a7300ff637300ff6b7300ff737300ff7b7300ff847300ff8c7300ff947300ff9c7300ffa57300ffad7300ffb57300ffbd7300ffc57300ffce7300ffd67300ffde7300ffe67300ffef7300fff77300ffff7300ff007b00ff087b00ff107b00ff197b00ff217b00ff297b00ff317b00ff3a7b00ff427b00ff4a7b00ff527b00ff5a7b00ff637b00ff6b7b00ff737b00ff7b7b00ff847b00ff8c7b00ff947b00ff9c7b00ffa57b00ffad7b00ffb57b00ffbd7b00ffc57b00ffce7b00ffd67b00ffde7b00ffe67b00ffef7b00fff77b00ffff7b00ff008400ff088400ff108400ff198400ff218400ff298400ff318400ff3a8400ff428400ff4a8400ff528400ff5a8400ff638400ff6b8400ff738400ff7b8400ff848400ff8c8400ff948400ff9c8400ffa58400ffad8400ffb58400ffbd8400ffc58400ffce8400ffd68400ffde8400ffe68400ffef8400fff78400ffff8400ff008c00ff088c00ff108c00ff198c00ff218c00ff298c00ff318c00ff3a8c00ff428c00ff4a8c00ff528c00ff5a8c00ff638c00ff6b8c00ff738c00ff7b8c00ff848c00ff8c8c00ff948c00ff9c8c00ffa58c00ffad8c00ffb58c00ffbd8c00ffc58c00ffce8c00ffd68c00ffde8c00ffe68c00ffef8c00fff78c00ffff8c00ff009400ff089400ff109400ff199400ff219400ff299400ff319400ff3a9400ff429400ff4a9400ff529400ff5a9400ff639400ff6b9400ff739400ff7b9400ff849400ff8c9400ff949400ff9c9400ffa59400ffad9400ffb59400ffbd9400ffc59400ffce9400ffd69400ffde9400ffe69400ffef9400fff79400ffff9400ff009c00ff089c00ff109c00ff199c00ff219c00ff299c00ff319c00ff3a9c00ff429c00ff4a9c00ff529c00ff5a9c00ff639c00ff6b9c00ff739c00ff7b9c00ff849c00ff8c9c00ff949c00ff9c9c00ffa59c00ffad9c00ffb59c00ffbd9c00ffc59c00ffce9c00ffd69c00ffde9c00ffe69c00ffef9c00fff79c00ffff9c00ff00a500ff08a500ff10a500ff19a500ff21a500ff29a500ff31a500ff3aa500ff42a500ff4aa500ff52a500ff5aa500ff63a500ff6ba500ff73a500ff7ba500ff84a500ff8ca500ff94a500ff9ca500ffa5a500ffada500ffb5a500ffbda500ffc5a500ffcea500ffd6a500ffdea500ffe6a500ffefa500fff7a500ffffa500ff00ad00ff08ad00ff10ad00ff19ad00ff21ad00ff29ad00ff31ad00ff3aad00ff42ad00ff4aad00ff52ad00ff5aad00ff63ad00ff6bad00ff73ad00ff7bad00ff84ad00ff8cad00ff94ad00ff9cad00ffa5ad00ffadad00ffb5ad00ffbdad00ffc5ad00ffcead00ffd6ad00ffdead00ffe6ad00ffefad00fff7ad00ffffad00ff00b500ff08b500ff10b500ff19b500ff21b500ff29b500ff31b500ff3ab500ff42b500ff4ab500ff52b500ff5ab500ff63b500ff6bb500ff73b500ff7bb500ff84b500ff8cb500ff94b500ff9cb500ffa5b500ffadb500ffb5b500ffbdb500ffc5b500ffceb500ffd6b500ffdeb500ffe6b500ffefb500fff7b500ffffb500ff00bd00ff08bd00ff10bd00ff19bd00ff21bd00ff29bd00ff31bd00ff3abd00ff42bd00ff4abd00ff52bd00ff5abd00ff63bd00ff6bbd00ff73bd00ff7bbd00ff84bd00ff8cbd00ff94bd00ff9cbd00ffa5bd00ffadbd00ffb5bd00ffbdbd00ffc5bd00ffcebd00ffd6bd00ffdebd00ffe6bd00ffefbd00fff7bd00ffffbd00ff00c500ff08c500ff10c500ff19c500ff21c500ff29c500ff31c500ff3ac500ff42c500ff4ac500ff52c500ff5ac500ff63c500ff6bc500ff73c500ff7bc500ff84c500ff8cc500ff94c500ff9cc500ffa5c500ffadc500ffb5c500ffbdc500ffc5c500ffcec500ffd6c500ffdec500ffe6c500ffefc500fff7c500ffffc500ff00ce00ff08ce00ff10ce00ff19ce00ff21ce00ff29ce00ff31ce00ff3ace00ff42ce00ff4ace00ff52ce00ff5ace00ff63ce00ff6bce00ff73ce00ff7bce00ff84ce00ff8cce00ff94ce00ff9cce00ffa5ce00ffadce00ffb5ce00ffbdce00ffc5ce00ffcece00ffd6ce00ffdece00ffe6ce00ffefce00fff7ce00ffffce00ff00d600ff08d600ff10d600ff19d600ff21d600ff29d600ff31d600ff3ad600ff42d600ff4ad600ff52d600ff5ad600ff63d600ff6bd600ff73d600ff7bd600ff84d600ff8cd600ff94d600ff9cd600ffa5d600ffadd600ffb5d600ffbdd600ffc5d600ffced600ffd6d600ffded600ffe6d600ffefd600fff7d600ffffd600ff00de00ff08de00ff10de00ff19de00ff21de00ff29de00ff31de00ff3ade00ff42de00ff4ade00ff52de00ff5ade00ff63de00ff6bde00ff73de00ff7bde00ff84de00ff8cde00ff94de00ff9cde00ffa5de00ffadde00ffb5de00ffbdde00ffc5de00ffcede00ffd6de00ffdede00ffe6de00ffefde00fff7de00ffffde00ff00e600ff08e600ff10e600ff19e600ff21e600ff29e600ff31e600ff3ae600ff42e600ff4ae600ff52e600ff5ae600ff63e600ff6be600ff73e600ff7be600ff84e600ff8ce600ff94e600ff9ce600ffa5e600ffade600ffb5e600ffbde600ffc5e600ffcee600ffd6e600ffdee600ffe6e600ffefe600fff7e600ffffe600ff00ef00ff08ef00ff10ef00ff19ef00ff21ef00ff29ef00ff31ef00ff3aef00ff42ef00ff4aef00ff52ef00ff5aef00ff63ef00ff6bef00ff73ef00ff7bef00ff84ef00ff8cef00ff94ef00ff9cef00ffa5ef00ffadef00ffb5ef00ffbdef00ffc5ef00ffceef00ffd6ef00ffdeef00ffe6ef00ffefef00fff7ef00ffffef00ff00f700ff08f700ff10f700ff19f700ff21f700ff29f700ff31f700ff3af700ff42f700ff4af700ff52f700ff5af700ff63f700ff6bf700ff73f700ff7bf700ff84f700ff8cf700ff94f700ff9cf700ffa5f700ffadf700ffb5f700ffbdf700ffc5f700ffcef700ffd6f700ffdef700ffe6f700ffeff700fff7f700fffff700ff00ff00ff08ff00ff10ff00ff19ff00ff21ff00ff29ff00ff31ff00ff3aff00ff42ff00ff4aff00ff52ff00ff5aff00ff63ff00ff6bff00ff73ff00ff7bff00ff84ff00ff8cff00ff94ff00ff9cff00ffa5ff00ffadff00ffb5ff00ffbdff00ffc5ff00ffceff00ffd6ff00ffdeff00ffe6ff00ffefff00fff7ff00ffffff00ff000008ff080008ff100008ff190008ff210008ff290008ff310008ff3a0008ff420008ff4a0008ff520008ff5a0008ff630008ff6b0008ff730008ff7b0008ff840008ff8c0008ff940008ff9c0008ffa50008ffad0008ffb50008ffbd0008ffc50008ffce0008ffd60008ffde0008ffe60008ffef0008fff70008ffff0008ff000808ff080808ff100808ff190808ff210808ff290808ff310808ff3a0808ff420808ff4a0808ff520808ff5a0808ff630808ff6b0808ff730808ff7b0808ff840808ff8c0808ff940808ff9c0808ffa50808ffad0808ffb50808ffbd0808ffc50808ffce0808ffd60808ffde0808ffe60808ffef0808fff70808ffff0808ff001008ff081008ff101008ff191008ff211008ff291008ff311008ff3a1008ff421008ff4a1008ff521008ff5a1008ff631008ff6b1008ff731008ff7b1008ff841008ff8c1008ff941008ff9c1008ffa51008ffad1008ffb51008ffbd1008ffc51008ffce1008ffd61008ffde1008ffe61008ffef1008fff71008ffff1008ff001908ff081908ff101908ff191908ff211908ff291908ff311908ff3a1908ff421908ff4a1908ff521908ff5a1908ff631908ff6b1908ff731908ff7b1908ff841908ff8c1908ff941908ff9c1908ffa51908ffad1908ffb51908ffbd1908ffc51908ffce1908ffd61908ffde1908ffe61908ffef1908fff71908ffff1908ff002108ff082108ff102108ff192108ff212108ff292108ff312108ff3a2108ff422108ff4a2108ff522108ff5a2108ff632108ff6b2108ff732108ff7b2108ff842108ff8c2108ff942108ff9c2108ffa52108ffad2108ffb52108ffbd2108ffc52108ffce2108ffd62108ffde2108ffe62108ffef2108fff72108ffff2108ff002908ff082908ff102908ff192908ff212908ff292908ff312908ff3a2908ff422908ff4a2908ff522908ff5a2908ff632908ff6b2908ff732908ff7b2908ff842908ff8c2908ff942908ff9c2908ffa52908ffad2908ffb52908ffbd2908ffc52908ffce2908ffd62908ffde2908ffe62908ffef2908fff72908ffff2908ff003108ff083108ff103108ff193108ff213108ff293108ff313108ff3a3108ff423108ff4a3108ff523108ff5a3108ff633108ff6b3108ff733108ff7b3108ff843108ff8c3108ff943108ff9c3108ffa53108ffad3108ffb53108ffbd3108ffc53108ffce3108ffd63108ffde3108ffe63108ffef3108fff73108ffff3108ff003a08ff083a08ff103a08ff193a08ff213a08ff293a08ff313a08ff3a3a08ff423a08ff4a3a08ff523a08ff5a3a08ff633a08ff6b3a08ff733a08ff7b3a08ff843a08ff8c3a08ff943a08ff9c3a08ffa53a08ffad3a08ffb53a08ffbd3a08ffc53a08ffce3a08ffd63a08ffde3a08ffe63a08ffef3a08fff73a08ffff3a08ff004208ff084208ff104208ff194208ff214208ff294208ff314208ff3a4208ff424208ff4a4208ff524208ff5a4208ff634208ff6b4208ff734208ff7b4208ff844208ff8c4208ff944208ff9c4208ffa54208ffad4208ffb54208ffbd4208ffc54208ffce4208ffd64208ffde4208ffe64208ffef4208fff74208ffff4208ff004a08ff084a08ff104a08ff194a08ff214a08ff294a08ff314a08ff3a4a08ff424a08ff4a4a08ff524a08ff5a4a08ff634a08ff6b4a08ff734a08ff7b4a08ff844a08ff8c4a08ff944a08ff9c4a08ffa54a08ffad4a08ffb54a08ffbd4a08ffc54a08ffce4a08ffd64a08ffde4a08ffe64a08ffef4a08fff74a08ffff4a08ff005208ff085208ff105208ff195208ff215208ff295208ff315208ff3a5208ff425208ff4a5208ff525208ff5a5208ff635208ff6b5208ff735208ff7b5208ff845208ff8c5208ff945208ff9c5208ffa55208ffad5208ffb55208ffbd5208ffc55208ffce5208ffd65208ffde5208ffe65208ffef5208fff75208ffff5208ff005a08ff085a08ff105a08ff195a08ff215a08ff295a08ff315a08ff3a5a08ff425a08ff4a5a08ff525a08ff5a5a08ff635a08ff6b5a08ff735a08ff7b5a08ff845a08ff8c5a08ff945a08ff9c5a08ffa55a08ffad5a08ffb55a08ffbd5a08ffc55a08ffce5a08ffd65a08ffde5a08ffe65a08ffef5a08fff75a08ffff5a08ff006308ff086308ff106308ff196308ff216308ff296308ff316308ff3a6308ff426308ff4a6308ff526308ff5a6308ff636308ff6b6308ff736308ff7b6308ff846308ff8c6308ff946308ff9c6308ffa56308ffad6308ffb56308ffbd6308ffc56308ffce6308ffd66308ffde6308ffe66308ffef6308fff76308ffff6308ff006b08ff086b08ff106b08ff196b08ff216b08ff296b08ff316b08ff3a6b08ff426b08ff4a6b08ff526b08ff5a6b08ff636b08ff6b6b08ff736b08ff7b6b08ff846b08ff8c6b08ff946b08ff9c6b08ffa56b08ffad6b08ffb56b08ffbd6b08ffc56b08ffce6b08ffd66b08ffde6b08ffe66b08ffef6b08fff76b08ffff6b08ff007308ff087308ff107308ff197308ff217308ff297308ff317308ff3a7308ff427308ff4a7308ff527308ff5a7308ff637308ff6b7308ff737308ff7b7308ff847308ff8c7308ff947308ff9c7308ffa57308ffad7308ffb57308ffbd7308ffc57308ffce7308ffd67308ffde7308ffe67308ffef7308fff77308ffff7308ff007b08ff087b08ff107b08ff197b08ff217b08ff297b08ff317b08ff3a7b08ff427b08ff4a7b08ff527b08ff5a7b08ff637b08ff6b7b08ff737b08ff7b7b08ff847b08ff8c7b08ff947b08ff9c7b08ffa57b08ffad7b08ffb57b08ffbd7b08ffc57b08ffce7b08ffd67b08ffde7b08ffe67b08ffef7b08fff77b08ffff7b08ff008408ff088408ff108408ff198408ff218408ff298408ff318408ff3a8408ff428408ff4a8408ff528408ff5a8408ff638408ff6b8408ff738408ff7b8408ff848408ff8c8408ff948408ff9c8408ffa58408ffad8408ffb58408ffbd8408ffc58408ffce8408ffd68408ffde8408ffe68408ffef8408fff78408ffff8408ff008c08ff088c08ff108c08ff198c08ff218c08ff298c08ff318c08ff3a8c08ff428c08ff4a8c08ff528c08ff5a8c08ff638c08ff6b8c08ff738c08ff7b8c08ff848c08ff8c8c08ff948c08ff9c8c08ffa58c08ffad8c08ffb58c08ffbd8c08ffc58c08ffce8c08ffd68c08ffde8c08ffe68c08ffef8c08fff78c08ffff8c08ff009408ff089408ff109408ff199408ff219408ff299408ff319408ff3a9408ff429408ff4a9408ff529408ff5a9408ff639408ff6b9408ff739408ff7b9408ff849408ff8c9408ff949408ff9c9408ffa59408ffad9408ffb59408ffbd9408ffc59408ffce9408ffd69408ffde9408ffe69408ffef9408fff79408ffff9408ff009c08ff089c08ff109c08ff199c08ff219c08ff299c08ff319c08ff3a9c08ff429c08ff4a9c08ff529c08ff5a9c08ff639c08ff6b9c08ff739c08ff7b9c08ff849c08ff8c9c08ff949c08ff9c9c08ffa59c08ffad9c08ffb59c08ffbd9c08ffc59c08ffce9c08ffd69c08ffde9c08ffe69c08ffef9c08fff79c08ffff9c08ff00a508ff08a508ff10a508ff19a508ff21a508ff29a508ff31a508ff3aa508ff42a508ff4aa508ff52a508ff5aa508ff63a508ff6ba508ff73a508ff7ba508ff84a508ff8ca508ff94a508ff9ca508ffa5a508ffada508ffb5a508ffbda508ffc5a508ffcea508ffd6a508ffdea508ffe6a508ffefa508fff7a508ffffa508ff00ad08ff08ad08ff10ad08ff19ad08ff21ad08ff29ad08ff31ad08ff3aad08ff42ad08ff4aad08ff52ad08ff5aad08ff63ad08ff6bad08ff73ad08ff7bad08ff84ad08ff8cad08ff94ad08ff9cad08ffa5ad08ffadad08ffb5ad08ffbdad08ffc5ad08ffcead08ffd6ad08ffdead08ffe6ad08ffefad08fff7ad08ffffad08ff00b508ff08b508ff10b508ff19b508ff21b508ff29b508ff31b508ff3ab508ff42b508ff4ab508ff52b508ff5ab508ff63b508ff6bb508ff73b508ff7bb508ff84b508ff8cb508ff94b508ff9cb508ffa5b508ffadb508ffb5b508ffbdb508ffc5b508ffceb508ffd6b508ffdeb508ffe6b508ffefb508fff7b508ffffb508ff00bd08ff08bd08ff10bd08ff19bd08ff21bd08ff29bd08ff31bd08ff3abd08ff42bd08ff4abd08ff52bd08ff5abd08ff63bd08ff6bbd08ff73bd08ff7bbd08ff84bd08ff8cbd08ff94bd08ff9cbd08ffa5bd08ffadbd08ffb5bd08ffbdbd08ffc5bd08ffcebd08ffd6bd08ffdebd08ffe6bd08ffefbd08fff7bd08ffffbd08ff00c508ff08c508ff10c508ff19c508ff21c508ff29c508ff31c508ff3ac508ff42c508ff4ac508ff52c508ff5ac508ff63c508ff6bc508ff73c508ff7bc508ff84c508ff8cc508ff94c508ff9cc508ffa5c508ffadc508ffb5c508ffbdc508ffc5c508ffcec508ffd6c508ffdec508ffe6c508ffefc508fff7c508ffffc508ff00ce08ff08ce08ff10ce08ff19ce08ff21ce08ff29ce08ff31ce08ff3ace08ff42ce08ff4ace08ff52ce08ff5ace08ff63ce08ff6bce08ff73ce08ff7bce08ff84ce08ff8cce08ff94ce08ff9cce08ffa5ce08ffadce08ffb5ce08ffbdce08ffc5ce08ffcece08ffd6ce08ffdece08ffe6ce08ffefce08fff7ce08ffffce08ff00d608ff08d608ff10d608ff19d608ff21d608ff29d608ff31d608ff3ad608ff42d608ff4ad608ff52d608ff5ad608ff63d608ff6bd608ff73d608ff7bd608ff84d608ff8cd608ff94d608ff9cd608ffa5d608ffadd608ffb5d608ffbdd608ffc5d608ffced608ffd6d608ffded608ffe6d608ffefd608fff7d608ffffd608ff00de08ff08de08ff10de08ff19de08ff21de08ff29de08ff31de08ff3ade08ff42de08ff4ade08ff52de08ff5ade08ff63de08ff6bde08ff73de08ff7bde08ff84de08ff8cde08ff94de08ff9cde08ffa5de08ffadde08ffb5de08ffbdde08ffc5de08ffcede08ffd6de08ffdede08ffe6de08ffefde08fff7de08ffffde08ff00e608ff08e608ff10e608ff19e608ff21e608ff29e608ff31e608ff3ae608ff42e608ff4ae608ff52e608ff5ae608ff63e608ff6be608ff73e608ff7be608ff84e608ff8ce608ff94e608ff9ce608ffa5e608ffade608ffb5e608ffbde608ffc5e608ffcee608ffd6e608ffdee608ffe6e608ffefe608fff7e608ffffe608ff00ef08ff08ef08ff10ef08ff19ef08ff21ef08ff29ef08ff31ef08ff3aef08ff42ef08ff4aef08ff52ef08ff5aef08ff63ef08ff6bef08ff73ef08ff7bef08ff84ef08ff8cef08ff94ef08ff9cef08ffa5ef08ffadef08ffb5ef08ffbdef08ffc5ef08ffceef08ffd6ef08ffdeef08ffe6ef08ffefef08fff7ef08ffffef08ff00f708ff08f708ff10f708ff19f708ff21f708ff29f708ff31f708ff3af708ff42f708ff4af708ff52f708ff5af708ff63f708ff6bf708ff73f708ff7bf708ff84f708ff8cf708ff94f708ff9cf708ffa5f708ffadf708ffb5f708ffbdf708ffc5f708ffcef708ffd6f708ffdef708ffe6f708ffeff708fff7f708fffff708ff00ff08ff08ff08ff10ff08ff19ff08ff21ff08ff29ff08ff31ff08ff3aff08ff42ff08ff4aff08ff52ff08ff5aff08ff63ff08ff6bff08ff73ff08ff7bff08ff84ff08ff8cff08ff94ff08ff9cff08ffa5ff08ffadff08ffb5ff08ffbdff08ffc5ff08ffceff08ffd6ff08ffdeff08ffe6ff08ffefff08fff7ff08ffffff08ff000010ff080010ff100010ff190010ff210010ff290010ff310010ff3a0010ff420010ff4a0010ff520010ff5a0010ff630010ff6b0010ff730010ff7b0010ff840010ff8c0010ff940010ff9c0010ffa50010ffad0010ffb50010ffbd0010ffc50010ffce0010ffd60010ffde0010ffe60010ffef0010fff70010ffff0010ff000810ff080810ff100810ff190810ff210810ff290810ff310810ff3a0810ff420810ff4a0810ff520810ff5a0810ff630810ff6b0810ff730810ff7b0810ff840810ff8c0810ff940810ff9c0810ffa50810ffad0810ffb50810ffbd0810ffc50810ffce0810ffd60810ffde0810ffe60810ffef0810fff70810ffff0810ff001010ff081010ff101010ff191010ff211010ff291010ff311010ff3a1010ff421010ff4a1010ff521010ff5a1010ff631010ff6b1010ff731010ff7b1010ff841010ff8c1010ff941010ff9c1010ffa51010ffad1010ffb51010ffbd1010ffc51010ffce1010ffd61010ffde1010ffe61010ffef1010fff71010ffff1010ff001910ff081910ff101910ff191910ff211910ff291910ff311910ff3a1910ff421910ff4a1910ff521910ff5a1910ff631910ff6b1910ff731910ff7b1910ff841910ff8c1910ff941910ff9c1910ffa51910ffad1910ffb51910ffbd1910ffc51910ffce1910ffd61910ffde1910ffe61910ffef1910fff71910ffff1910ff002110ff082110ff102110ff192110ff212110ff292110ff312110ff3a2110ff422110ff4a2110ff522110ff5a2110ff632110ff6b2110ff732110ff7b2110ff842110ff8c2110ff942110ff9c2110ffa52110ffad2110ffb52110ffbd2110ffc52110ffce2110ffd62110ffde2110ffe62110ffef2110fff72110ffff2110ff002910ff082910ff102910ff192910ff212910ff292910ff312910ff3a2910ff422910ff4a2910ff522910ff5a2910ff632910ff6b2910ff732910ff7b2910ff842910ff8c2910ff942910ff9c2910ffa52910ffad2910ffb52910ffbd2910ffc52910ffce2910ffd62910ffde2910ffe62910ffef2910fff72910ffff2910ff003110ff083110ff103110ff193110ff213110ff293110ff313110ff3a3110ff423110ff4a3110ff523110ff5a3110ff633110ff6b3110ff733110ff7b3110ff843110ff8c3110ff943110ff9c3110ffa53110ffad3110ffb53110ffbd3110ffc53110ffce3110ffd63110ffde3110ffe63110ffef3110fff73110ffff3110ff003a10ff083a10ff103a10ff193a10ff213a10ff293a10ff313a10ff3a3a10ff423a10ff4a3a10ff523a10ff5a3a10ff633a10ff6b3a10ff733a10ff7b3a10ff843a10ff8c3a10ff943a10ff9c3a10ffa53a10ffad3a10ffb53a10ffbd3a10ffc53a10ffce3a10ffd63a10ffde3a10ffe63a10ffef3a10fff73a10ffff3a10ff004210ff084210ff104210ff194210ff214210ff294210ff314210ff3a4210ff424210ff4a4210ff524210ff5a4210ff634210ff6b4210ff734210ff7b4210ff844210ff8c4210ff944210ff9c4210ffa54210ffad4210ffb54210ffbd4210ffc54210ffce4210ffd64210ffde4210ffe64210ffef4210fff74210ffff4210ff004a10ff084a10ff104a10ff194a10ff214a10ff294a10ff314a10ff3a4a10ff424a10ff4a4a10ff524a10ff5a4a10ff634a10ff6b4a10ff734a10ff7b4a10ff844a10ff8c4a10ff944a10ff9c4a10ffa54a10ffad4a10ffb54a10ffbd4a10ffc54a10ffce4a10ffd64a10ffde4a10ffe64a10ffef4a10fff74a10ffff4a10ff005210ff085210ff105210ff195210ff215210ff295210ff315210ff3a5210ff425210ff4a5210ff525210ff5a5210ff635210ff6b5210ff735210ff7b5210ff845210ff8c5210ff945210ff9c5210ffa55210ffad5210ffb55210ffbd5210ffc55210ffce5210ffd65210ffde5210ffe65210ffef5210fff75210ffff5210ff005a10ff085a10ff105a10ff195a10ff215a10ff295a10ff315a10ff3a5a10ff425a10ff4a5a10ff525a10ff5a5a10ff635a10ff6b5a10ff735a10ff7b5a10ff845a10ff8c5a10ff945a10ff9c5a10ffa55a10ffad5a10ffb55a10ffbd5a10ffc55a10ffce5a10ffd65a10ffde5a10ffe65a10ffef5a10fff75a10ffff5a10ff006310ff086310ff106310ff196310ff216310ff296310ff316310ff3a6310ff426310ff4a6310ff526310ff5a6310ff636310ff6b6310ff736310ff7b6310ff846310ff8c6310ff946310ff9c6310ffa56310ffad6310ffb56310ffbd6310ffc56310ffce6310ffd66310ffde6310ffe66310ffef6310fff76310ffff6310ff006b10ff086b10ff106b10ff196b10ff216b10ff296b10ff316b10ff3a6b10ff426b10ff4a6b10ff526b10ff5a6b10ff636b10ff6b6b10ff736b10ff7b6b10ff846b10ff8c6b10ff946b10ff9c6b10ffa56b10ffad6b10ffb56b10ffbd6b10ffc56b10ffce6b10ffd66b10ffde6b10ffe66b10ffef6b10fff76b10ffff6b10ff007310ff087310ff107310ff197310ff217310ff297310ff317310ff3a7310ff427310ff4a7310ff527310ff5a7310ff637310ff6b7310ff737310ff7b7310ff847310ff8c7310ff947310ff9c7310ffa57310ffad7310ffb57310ffbd7310ffc57310ffce7310ffd67310ffde7310ffe67310ffef7310fff77310ffff7310ff007b10ff087b10ff107b10ff197b10ff217b10ff297b10ff317b10ff3a7b10ff427b10ff4a7b10ff527b10ff5a7b10ff637b10ff6b7b10ff737b10ff7b7b10ff847b10ff8c7b10ff947b10ff9c7b10ffa57b10ffad7b10ffb57b10ffbd7b10ffc57b10ffce7b10ffd67b10ffde7b10ffe67b10ffef7b10fff77b10ffff7b10ff008410ff088410ff108410ff198410ff218410ff298410ff318410ff3a8410ff428410ff4a8410ff528410ff5a8410ff638410ff6b8410ff738410ff7b8410ff848410ff8c8410ff948410ff9c8410ffa58410ffad8410ffb58410ffbd8410ffc58410ffce8410ffd68410ffde8410ffe68410ffef8410fff78410ffff8410ff008c10ff088c10ff108c10ff198c10ff218c10ff298c10ff318c10ff3a8c10ff428c10ff4a8c10ff528c10ff5a8c10ff638c10ff6b8c10ff738c10ff7b8c10ff848c10ff8c8c10ff948c10ff9c8c10ffa58c10ffad8c10ffb58c10ffbd8c10ffc58c10ffce8c10ffd68c10ffde8c10ffe68c10ffef8c10fff78c10ffff8c10ff009410ff089410ff109410ff199410ff219410ff299410ff319410ff3a9410ff429410ff4a9410ff529410ff5a9410ff639410ff6b9410ff739410ff7b9410ff849410ff8c9410ff949410ff9c9410ffa59410ffad9410ffb59410ffbd9410ffc59410ffce9410ffd69410ffde9410ffe69410ffef9410fff79410ffff9410ff009c10ff089c10ff109c10ff199c10ff219c10ff299c10ff319c10ff3a9c10ff429c10ff4a9c10ff529c10ff5a9c10ff639c10ff6b9c10ff739c10ff7b9c10ff849c10ff8c9c10ff949c10ff9c9c10ffa59c10ffad9c10ffb59c10ffbd9c10ffc59c10ffce9c10ffd69c10ffde9c10ffe69c10ffef9c10fff79c10ffff9c10ff00a510ff08a510ff10a510ff19a510ff21a510ff29a510ff31a510ff3aa510ff42a510ff4aa510ff52a510ff5aa510ff63a510ff6ba510ff73a510ff7ba510ff84a510ff8ca510ff94a510ff9ca510ffa5a510ffada510ffb5a510ffbda510ffc5a510ffcea510ffd6a510ffdea510ffe6a510ffefa510fff7a510ffffa510ff00ad10ff08ad10ff10ad10ff19ad10ff21ad10ff29ad10ff31ad10ff3aad10ff42ad10ff4aad10ff52ad10ff5aad10ff63ad10ff6bad10ff73ad10ff7bad10ff84ad10ff8cad10ff94ad10ff9cad10ffa5ad10ffadad10ffb5ad10ffbdad10ffc5ad10ffcead10ffd6ad10ffdead10ffe6ad10ffefad10fff7ad10ffffad10ff00b510ff08b510ff10b510ff19b510ff21b510ff29b510ff31b510ff3ab510ff42b510ff4ab510ff52b510ff5ab510ff63b510ff6bb510ff73b510ff7bb510ff84b510ff8cb510ff94b510ff9cb510ffa5b510ffadb510ffb5b510ffbdb510ffc5b510ffceb510ffd6b510ffdeb510ffe6b510ffefb510fff7b510ffffb510ff00bd10ff08bd10ff10bd10ff19bd10ff21bd10ff29bd10ff31bd10ff3abd10ff42bd10ff4abd10ff52bd10ff5abd10ff63bd10ff6bbd10ff73bd10ff7bbd10ff84bd10ff8cbd10ff94bd10ff9cbd10ffa5bd10ffadbd10ffb5bd10ffbdbd10ffc5bd10ffcebd10ffd6bd10ffdebd10ffe6bd10ffefbd10fff7bd10ffffbd10ff00c510ff08c510ff10c510ff19c510ff21c510ff29c510ff31c510ff3ac510ff42c510ff4ac510ff52c510ff5ac510ff63c510ff6bc510ff73c510ff7bc510ff84c510ff8cc510ff94c510ff9cc510ffa5c510ffadc510ffb5c510ffbdc510ffc5c510ffcec510ffd6c510ffdec510ffe6c510ffefc510fff7c510ffffc510ff00ce10ff08ce10ff10ce10ff19ce10ff21ce10ff29ce10ff31ce10ff3ace10ff42ce10ff4ace10ff52ce10ff5ace10ff63ce10ff6bce10ff73ce10ff7bce10ff84ce10ff8cce10ff94ce10ff9cce10ffa5ce10ffadce10ffb5ce10ffbdce10ffc5ce10ffcece10ffd6ce10ffdece10ffe6ce10ffefce10fff7ce10ffffce10ff00d610ff08d610ff10d610ff19d610ff21d610ff29d610ff31d610ff3ad610ff42d610ff4ad610ff52d610ff5ad610ff63d610ff6bd610ff73d610ff7bd610ff84d610ff8cd610ff94d610ff9cd610ffa5d610ffadd610ffb5d610ffbdd610ffc5d610ffced610ffd6d610ffded610ffe6d610ffefd610fff7d610ffffd610ff00de10ff08de10ff10de10ff19de10ff21de10ff29de10ff31de10ff3ade10ff42de10ff4ade10ff52de10ff5ade10ff63de10ff6bde10ff73de10ff7bde10ff84de10ff8cde10ff94de10ff9cde10ffa5de10ffadde10ffb5de10ffbdde10ffc5de10ffcede10ffd6de10ffdede10ffe6de10ffefde10fff7de10ffffde10ff00e610ff08e610ff10e610ff19e610ff21e610ff29e610ff31e610ff3ae610ff42e610ff4ae610ff52e610ff5ae610ff63e610ff6be610ff73e610ff7be610ff84e610ff8ce610ff94e610ff9ce610ffa5e610ffade610ffb5e610ffbde610ffc5e610ffcee610ffd6e610ffdee610ffe6e610ffefe610fff7e610ffffe610ff00ef10ff08ef10ff10ef10ff19ef10ff21ef10ff29ef10ff31ef10ff3aef10ff42ef10ff4aef10ff52ef10ff5aef10ff63ef10ff6bef10ff73ef10ff7bef10ff84ef10ff8cef10ff94ef10ff9cef10ffa5ef10ffadef10ffb5ef10ffbdef10ffc5ef10ffceef10ffd6ef10ffdeef10ffe6ef10ffefef10fff7ef10ffffef10ff00f710ff08f710ff10f710ff19f710ff21f710ff29f710ff31f710ff3af710ff42f710ff4af710ff52f710ff5af710ff63f710ff6bf710ff73f710ff7bf710ff84f710ff8cf710ff94f710ff9cf710ffa5f710ffadf710ffb5f710ffbdf710ffc5f710ffcef710ffd6f710ffdef710ffe6f710ffeff710fff7f710fffff710ff00ff10ff08ff10ff10ff10ff19ff10ff21ff10ff29ff10ff31ff10ff3aff10ff42ff10ff4aff10ff52ff10ff5aff10ff63ff10ff6bff10ff73ff10ff7bff10ff84ff10ff8cff10ff94ff10ff9cff10ffa5ff10ffadff10ffb5ff10ffbdff10ffc5ff10ffceff10ffd6ff10ffdeff10ffe6ff10ffefff10fff7ff10ffffff10ff000019ff080019ff100019ff190019ff210019ff290019ff310019ff3a0019ff420019ff4a0019ff520019ff5a0019ff630019ff6b0019ff730019ff7b0019ff840019ff8c0019ff940019ff9c0019ffa50019ffad0019ffb50019ffbd0019ffc50019ffce0019ffd60019ffde0019ffe60019ffef0019fff70019ffff0019ff000819ff080819ff100819ff190819ff210819ff290819ff310819ff3a0819ff420819ff4a0819ff520819ff5a0819ff630819ff6b0819ff730819ff7b0819ff840819ff8c0819ff940819ff9c0819ffa50819ffad0819ffb50819ffbd0819ffc50819ffce0819ffd60819ffde0819ffe60819ffef0819fff70819ffff0819ff001019ff081019ff101019ff191019ff211019ff291019ff311019ff3a1019ff421019ff4a1019ff521019ff5a1019ff631019ff6b1019ff731019ff7b1019ff841019ff8c1019ff941019ff9c1019ffa51019ffad1019ffb51019ffbd1019ffc51019ffce1019ffd61019ffde1019ffe61019ffef1019fff71019ffff1019ff001919ff081919ff101919ff191919ff211919ff291919ff311919ff3a1919ff421919ff4a1919ff521919ff5a1919ff631919ff6b1919ff731919ff7b1919ff841919ff8c1919ff941919ff9c1919ffa51919ffad1919ffb51919ffbd1919ffc51919ffce1919ffd61919ffde1919ffe61919ffef1919fff71919ffff1919ff002119ff082119ff102119ff192119ff212119ff292119ff312119ff3a2119ff422119ff4a2119ff522119ff5a2119ff632119ff6b2119ff732119ff7b2119ff842119ff8c2119ff942119ff9c2119ffa52119ffad2119ffb52119ffbd2119ffc52119ffce2119ffd62119ffde2119ffe62119ffef2119fff72119ffff2119ff002919ff082919ff102919ff192919ff212919ff292919ff312919ff3a2919ff422919ff4a2919ff522919ff5a2919ff632919ff6b2919ff732919ff7b2919ff842919ff8c2919ff942919ff9c2919ffa52919ffad2919ffb52919ffbd2919ffc52919ffce2919ffd62919ffde2919ffe62919ffef2919fff72919ffff2919ff003119ff083119ff103119ff193119ff213119ff293119ff313119ff3a3119ff423119ff4a3119ff523119ff5a3119ff633119ff6b3119ff733119ff7b3119ff843119ff8c3119ff943119ff9c3119ffa53119ffad3119ffb53119ffbd3119ffc53119ffce3119ffd63119ffde3119ffe63119ffef3119fff73119ffff3119ff003a19ff083a19ff103a19ff193a19ff213a19ff293a19ff313a19ff3a3a19ff423a19ff4a3a19ff523a19ff5a3a19ff633a19ff6b3a19ff733a19ff7b3a19ff843a19ff8c3a19ff943a19ff9c3a19ffa53a19ffad3a19ffb53a19ffbd3a19ffc53a19ffce3a19ffd63a19ffde3a19ffe63a19ffef3a19fff73a19ffff3a19ff004219ff084219ff104219ff194219ff214219ff294219ff314219ff3a4219ff424219ff4a4219ff524219ff5a4219ff634219ff6b4219ff734219ff7b4219ff844219ff8c4219ff944219ff9c4219ffa54219ffad4219ffb54219ffbd4219ffc54219ffce4219ffd64219ffde4219ffe64219ffef4219fff74219ffff4219ff004a19ff084a19ff104a19ff194a19ff214a19ff294a19ff314a19ff3a4a19ff424a19ff4a4a19ff524a19ff5a4a19ff634a19ff6b4a19ff734a19ff7b4a19ff844a19ff8c4a19ff944a19ff9c4a19ffa54a19ffad4a19ffb54a19ffbd4a19ffc54a19ffce4a19ffd64a19ffde4a19ffe64a19ffef4a19fff74a19ffff4a19ff005219ff085219ff105219ff195219ff215219ff295219ff315219ff3a5219ff425219ff4a5219ff525219ff5a5219ff635219ff6b5219ff735219ff7b5219ff845219ff8c5219ff945219ff9c5219ffa55219ffad5219ffb55219ffbd5219ffc55219ffce5219ffd65219ffde5219ffe65219ffef5219fff75219ffff5219ff005a19ff085a19ff105a19ff195a19ff215a19ff295a19ff315a19ff3a5a19ff425a19ff4a5a19ff525a19ff5a5a19ff635a19ff6b5a19ff735a19ff7b5a19ff845a19ff8c5a19ff945a19ff9c5a19ffa55a19ffad5a19ffb55a19ffbd5a19ffc55a19ffce5a19ffd65a19ffde5a19ffe65a19ffef5a19fff75a19ffff5a19ff006319ff086319ff106319ff196319ff216319ff296319ff316319ff3a6319ff426319ff4a6319ff526319ff5a6319ff636319ff6b6319ff736319ff7b6319ff846319ff8c6319ff946319ff9c6319ffa56319ffad6319ffb56319ffbd6319ffc56319ffce6319ffd66319ffde6319ffe66319ffef6319fff76319ffff6319ff006b19ff086b19ff106b19ff196b19ff216b19ff296b19ff316b19ff3a6b19ff426b19ff4a6b19ff526b19ff5a6b19ff636b19ff6b6b19ff736b19ff7b6b19ff846b19ff8c6b19ff946b19ff9c6b19ffa56b19ffad6b19ffb56b19ffbd6b19ffc56b19ffce6b19ffd66b19ffde6b19ffe66b19ffef6b19fff76b19ffff6b19ff007319ff087319ff107319ff197319ff217319ff297319ff317319ff3a7319ff427319ff4a7319ff527319ff5a7319ff637319ff6b7319ff737319ff7b7319ff847319ff8c7319ff947319ff9c7319ffa57319ffad7319ffb57319ffbd7319ffc57319ffce7319ffd67319ffde7319ffe67319ffef7319fff77319ffff7319ff007b19ff087b19ff107b19ff197b19ff217b19ff297b19ff317b19ff3a7b19ff427b19ff4a7b19ff527b19ff5a7b19ff637b19ff6b7b19ff737b19ff7b7b19ff847b19ff8c7b19ff947b19ff9c7b19ffa57b19ffad7b19ffb57b19ffbd7b19ffc57b19ffce7b19ffd67b19ffde7b19ffe67b19ffef7b19fff77b19ffff7b19ff008419ff088419ff108419ff198419ff218419ff298419ff318419ff3a8419ff428419ff4a8419ff528419ff5a8419ff638419ff6b8419ff738419ff7b8419ff848419ff8c8419ff948419ff9c8419ffa58419ffad8419ffb58419ffbd8419ffc58419ffce8419ffd68419ffde8419ffe68419ffef8419fff78419ffff8419ff008c19ff088c19ff108c19ff198c19ff218c19ff298c19ff318c19ff3a8c19ff428c19ff4a8c19ff528c19ff5a8c19ff638c19ff6b8c19ff738c19ff7b8c19ff848c19ff8c8c19ff948c19ff9c8c19ffa58c19ffad8c19ffb58c19ffbd8c19ffc58c19ffce8c19ffd68c19ffde8c19ffe68c19ffef8c19fff78c19ffff8c19ff009419ff089419ff109419ff199419ff219419ff299419ff319419ff3a9419ff429419ff4a9419ff529419ff5a9419ff639419ff6b9419ff739419ff7b9419ff849419ff8c9419ff949419ff9c9419ffa59419ffad9419ffb59419ffbd9419ffc59419ffce9419ffd69419ffde9419ffe69419ffef9419fff79419ffff9419ff009c19ff089c19ff109c19ff199c19ff219c19ff299c19ff319c19ff3a9c19ff429c19ff4a9c19ff529c19ff5a9c19ff639c19ff6b9c19ff739c19ff7b9c19ff849c19ff8c9c19ff949c19ff9c9c19ffa59c19ffad9c19ffb59c19ffbd9c19ffc59c19ffce9c19ffd69c19ffde9c19ffe69c19ffef9c19fff79c19ffff9c19ff00a519ff08a519ff10a519ff19a519ff21a519ff29a519ff31a519ff3aa519ff42a519ff4aa519ff52a519ff5aa519ff63a519ff6ba519ff73a519ff7ba519ff84a519ff8ca519ff94a519ff9ca519ffa5a519ffada519ffb5a519ffbda519ffc5a519ffcea519ffd6a519ffdea519ffe6a519ffefa519fff7a519ffffa519ff00ad19ff08ad19ff10ad19ff19ad19ff21ad19ff29ad19ff31ad19ff3aad19ff42ad19ff4aad19ff52ad19ff5aad19ff63ad19ff6bad19ff73ad19ff7bad19ff84ad19ff8cad19ff94ad19ff9cad19ffa5ad19ffadad19ffb5ad19ffbdad19ffc5ad19ffcead19ffd6ad19ffdead19ffe6ad19ffefad19fff7ad19ffffad19ff00b519ff08b519ff10b519ff19b519ff21b519ff29b519ff31b519ff3ab519ff42b519ff4ab519ff52b519ff5ab519ff63b519ff6bb519ff73b519ff7bb519ff84b519ff8cb519ff94b519ff9cb519ffa5b519ffadb519ffb5b519ffbdb519ffc5b519ffceb519ffd6b519ffdeb519ffe6b519ffefb519fff7b519ffffb519ff00bd19ff08bd19ff10bd19ff19bd19ff21bd19ff29bd19ff31bd19ff3abd19ff42bd19ff4abd19ff52bd19ff5abd19ff63bd19ff6bbd19ff73bd19ff7bbd19ff84bd19ff8cbd19ff94bd19ff9cbd19ffa5bd19ffadbd19ffb5bd19ffbdbd19ffc5bd19ffcebd19ffd6bd19ffdebd19ffe6bd19ffefbd19fff7bd19ffffbd19ff00c519ff08c519ff10c519ff19c519ff21c519ff29c519ff31c519ff3ac519ff42c519ff4ac519ff52c519ff5ac519ff63c519ff6bc519ff73c519ff7bc519ff84c519ff8cc519ff94c519ff9cc519ffa5c519ffadc519ffb5c519ffbdc519ffc5c519ffcec519ffd6c519ffdec519ffe6c519ffefc519fff7c519ffffc519ff00ce19ff08ce19ff10ce19ff19ce19ff21ce19ff29ce19ff31ce19ff3ace19ff42ce19ff4ace19ff52ce19ff5ace19ff63ce19ff6bce19ff73ce19ff7bce19ff84ce19ff8cce19ff94ce19ff9cce19ffa5ce19ffadce19ffb5ce19ffbdce19ffc5ce19ffcece19ffd6ce19ffdece19ffe6ce19ffefce19fff7ce19ffffce19ff00d619ff08d619ff10d619ff19d619ff21d619ff29d619ff31d619ff3ad619ff42d619ff4ad619ff52d619ff5ad619ff63d619ff6bd619ff73d619ff7bd619ff84d619ff8cd619ff94d619ff9cd619ffa5d619ffadd619ffb5d619ffbdd619ffc5d619ffced619ffd6d619ffded619ffe6d619ffefd619fff7d619ffffd619ff00de19ff08de19ff10de19ff19de19ff21de19ff29de19ff31de19ff3ade19ff42de19ff4ade19ff52de19ff5ade19ff63de19ff6bde19ff73de19ff7bde19ff84de19ff8cde19ff94de19ff9cde19ffa5de19ffadde19ffb5de19ffbdde19ffc5de19ffcede19ffd6de19ffdede19ffe6de19ffefde19fff7de19ffffde19ff00e619ff08e619ff10e619ff19e619ff21e619ff29e619ff31e619ff3ae619ff42e619ff4ae619ff52e619ff5ae619ff63e619ff6be619ff73e619ff7be619ff84e619ff8ce619ff94e619ff9ce619ffa5e619ffade619ffb5e619ffbde619ffc5e619ffcee619ffd6e619ffdee619ffe6e619ffefe619fff7e619ffffe619ff00ef19ff08ef19ff10ef19ff19ef19ff21ef19ff29ef19ff31ef19ff3aef19ff42ef19ff4aef19ff52ef19ff5aef19ff63ef19ff6bef19ff73ef19ff7bef19ff84ef19ff8cef19ff94ef19ff9cef19ffa5ef19ffadef19ffb5ef19ffbdef19ffc5ef19ffceef19ffd6ef19ffdeef19ffe6ef19ffefef19fff7ef19ffffef19ff00f719ff08f719ff10f719ff19f719ff21f719ff29f719ff31f719ff3af719ff42f719ff4af719ff52f719ff5af719ff63f719ff6bf719ff73f719ff7bf719ff84f719ff8cf719ff94f719ff9cf719ffa5f719ffadf719ffb5f719ffbdf719ffc5f719ffcef719ffd6f719ffdef719ffe6f719ffeff719fff7f719fffff719ff00ff19ff08ff19ff10ff19ff19ff19ff21ff19ff29ff19ff31ff19ff3aff19ff42ff19ff4aff19ff52ff19ff5aff19ff63ff19ff6bff19ff73ff19ff7bff19ff84ff19ff8cff19ff94ff19ff9cff19ffa5ff19ffadff19ffb5ff19ffbdff19ffc5ff19ffceff19ffd6ff19ffdeff19ffe6ff19ffefff19fff7ff19ffffff19ff000021ff080021ff100021ff190021ff210021ff290021ff310021ff3a0021ff420021ff4a0021ff520021ff5a0021ff630021ff6b0021ff730021ff7b0021ff840021ff8c0021ff940021ff9c0021ffa50021ffad0021ffb50021ffbd0021ffc50021ffce0021ffd60021ffde0021ffe60021ffef0021fff70021ffff0021ff000821ff080821ff100821ff190821ff210821ff290821ff310821ff3a0821ff420821ff4a0821ff520821ff5a0821ff630821ff6b0821ff730821ff7b0821ff840821ff8c0821ff940821ff9c0821ffa50821ffad0821ffb50821ffbd0821ffc50821ffce0821ffd60821ffde0821ffe60821ffef0821fff70821ffff0821ff001021ff081021ff101021ff191021ff211021ff291021ff311021ff3a1021ff421021ff4a1021ff521021ff5a1021ff631021ff6b1021ff731021ff7b1021ff841021ff8c1021ff941021ff9c1021ffa51021ffad1021ffb51021ffbd1021ffc51021ffce1021ffd61021ffde1021ffe61021ffef1021fff71021ffff1021ff001921ff081921ff101921ff191921ff211921ff291921ff311921ff3a1921ff421921ff4a1921ff521921ff5a1921ff631921ff6b1921ff731921ff7b1921ff841921ff8c1921ff941921ff9c1921ffa51921ffad1921ffb51921ffbd1921ffc51921ffce1921ffd61921ffde1921ffe61921ffef1921fff71921ffff1921ff002121ff082121ff102121ff192121ff212121ff292121ff312121ff3a2121ff422121ff4a2121ff522121ff5a2121ff632121ff6b2121ff732121ff7b2121ff842121ff8c2121ff942121ff9c2121ffa52121ffad2121ffb52121ffbd2121ffc52121ffce2121ffd62121ffde2121ffe62121ffef2121fff72121ffff2121ff002921ff082921ff102921ff192921ff212921ff292921ff312921ff3a2921ff422921ff4a2921ff522921ff5a2921ff632921ff6b2921ff732921ff7b2921ff842921ff8c2921ff942921ff9c2921ffa52921ffad2921ffb52921ffbd2921ffc52921ffce2921ffd62921ffde2921ffe62921ffef2921fff72921ffff2921ff003121ff083121ff103121ff193121ff213121ff293121ff313121ff3a3121ff423121ff4a3121ff523121ff5a3121ff633121ff6b3121ff733121ff7b3121ff843121ff8c3121ff943121ff9c3121ffa53121ffad3121ffb53121ffbd3121ffc53121ffce3121ffd63121ffde3121ffe63121ffef3121fff73121ffff3121ff003a21ff083a21ff103a21ff193a21ff213a21ff293a21ff313a21ff3a3a21ff423a21ff4a3a21ff523a21ff5a3a21ff633a21ff6b3a21ff733a21ff7b3a21ff843a21ff8c3a21ff943a21ff9c3a21ffa53a21ffad3a21ffb53a21ffbd3a21ffc53a21ffce3a21ffd63a21ffde3a21ffe63a21ffef3a21fff73a21ffff3a21ff004221ff084221ff104221ff194221ff214221ff294221ff314221ff3a4221ff424221ff4a4221ff524221ff5a4221ff634221ff6b4221ff734221ff7b4221ff844221ff8c4221ff944221ff9c4221ffa54221ffad4221ffb54221ffbd4221ffc54221ffce4221ffd64221ffde4221ffe64221ffef4221fff74221ffff4221ff004a21ff084a21ff104a21ff194a21ff214a21ff294a21ff314a21ff3a4a21ff424a21ff4a4a21ff524a21ff5a4a21ff634a21ff6b4a21ff734a21ff7b4a21ff844a21ff8c4a21ff944a21ff9c4a21ffa54a21ffad4a21ffb54a21ffbd4a21ffc54a21ffce4a21ffd64a21ffde4a21ffe64a21ffef4a21fff74a21ffff4a21ff005221ff085221ff105221ff195221ff215221ff295221ff315221ff3a5221ff425221ff4a5221ff525221ff5a5221ff635221ff6b5221ff735221ff7b5221ff845221ff8c5221ff945221ff9c5221ffa55221ffad5221ffb55221ffbd5221ffc55221ffce5221ffd65221ffde5221ffe65221ffef5221fff75221ffff5221ff005a21ff085a21ff105a21ff195a21ff215a21ff295a21ff315a21ff3a5a21ff425a21ff4a5a21ff525a21ff5a5a21ff635a21ff6b5a21ff735a21ff7b5a21ff845a21ff8c5a21ff945a21ff9c5a21ffa55a21ffad5a21ffb55a21ffbd5a21ffc55a21ffce5a21ffd65a21ffde5a21ffe65a21ffef5a21fff75a21ffff5a21ff006321ff086321ff106321ff196321ff216321ff296321ff316321ff3a6321ff426321ff4a6321ff526321ff5a6321ff636321ff6b6321ff736321ff7b6321ff846321ff8c6321ff946321ff9c6321ffa56321ffad6321ffb56321ffbd6321ffc56321ffce6321ffd66321ffde6321ffe66321ffef6321fff76321ffff6321ff006b21ff086b21ff106b21ff196b21ff216b21ff296b21ff316b21ff3a6b21ff426b21ff4a6b21ff526b21ff5a6b21ff636b21ff6b6b21ff736b21ff7b6b21ff846b21ff8c6b21ff946b21ff9c6b21ffa56b21ffad6b21ffb56b21ffbd6b21ffc56b21ffce6b21ffd66b21ffde6b21ffe66b21ffef6b21fff76b21ffff6b21ff007321ff087321ff107321ff197321ff217321ff297321ff317321ff3a7321ff427321ff4a7321ff527321ff5a7321ff637321ff6b7321ff737321ff7b7321ff847321ff8c7321ff947321ff9c7321ffa57321ffad7321ffb57321ffbd7321ffc57321ffce7321ffd67321ffde7321ffe67321ffef7321fff77321ffff7321ff007b21ff087b21ff107b21ff197b21ff217b21ff297b21ff317b21ff3a7b21ff427b21ff4a7b21ff527b21ff5a7b21ff637b21ff6b7b21ff737b21ff7b7b21ff847b21ff8c7b21ff947b21ff9c7b21ffa57b21ffad7b21ffb57b21ffbd7b21ffc57b21ffce7b21ffd67b21ffde7b21ffe67b21ffef7b21fff77b21ffff7b21ff008421ff088421ff108421ff198421ff218421ff298421ff318421ff3a8421ff428421ff4a8421ff528421ff5a8421ff638421ff6b8421ff738421ff7b8421ff848421ff8c8421ff948421ff9c8421ffa58421ffad8421ffb58421ffbd8421ffc58421ffce8421ffd68421ffde8421ffe68421ffef8421fff78421ffff8421ff008c21ff088c21ff108c21ff198c21ff218c21ff298c21ff318c21ff3a8c21ff428c21ff4a8c21ff528c21ff5a8c21ff638c21ff6b8c21ff738c21ff7b8c21ff848c21ff8c8c21ff948c21ff9c8c21ffa58c21ffad8c21ffb58c21ffbd8c21ffc58c21ffce8c21ffd68c21ffde8c21ffe68c21ffef8c21fff78c21ffff8c21ff009421ff089421ff109421ff199421ff219421ff299421ff319421ff3a9421ff429421ff4a9421ff529421ff5a9421ff639421ff6b9421ff739421ff7b9421ff849421ff8c9421ff949421ff9c9421ffa59421ffad9421ffb59421ffbd9421ffc59421ffce9421ffd69421ffde9421ffe69421ffef9421fff79421ffff9421ff009c21ff089c21ff109c21ff199c21ff219c21ff299c21ff319c21ff3a9c21ff429c21ff4a9c21ff529c21ff5a9c21ff639c21ff6b9c21ff739c21ff7b9c21ff849c21ff8c9c21ff949c21ff9c9c21ffa59c21ffad9c21ffb59c21ffbd9c21ffc59c21ffce9c21ffd69c21ffde9c21ffe69c21ffef9c21fff79c21ffff9c21ff00a521ff08a521ff10a521ff19a521ff21a521ff29a521ff31a521ff3aa521ff42a521ff4aa521ff52a521ff5aa521ff63a521ff6ba521ff73a521ff7ba521ff84a521ff8ca521ff94a521ff9ca521ffa5a521ffada521ffb5a521ffbda521ffc5a521ffcea521ffd6a521ffdea521ffe6a521ffefa521fff7a521ffffa521ff00ad21ff08ad21ff10ad21ff19ad21ff21ad21ff29ad21ff31ad21ff3aad21ff42ad21ff4aad21ff52ad21ff5aad21ff63ad21ff6bad21ff73ad21ff7bad21ff84ad21ff8cad21ff94ad21ff9cad21ffa5ad21ffadad21ffb5ad21ffbdad21ffc5ad21ffcead21ffd6ad21ffdead21ffe6ad21ffefad21fff7ad21ffffad21ff00b521ff08b521ff10b521ff19b521ff21b521ff29b521ff31b521ff3ab521ff42b521ff4ab521ff52b521ff5ab521ff63b521ff6bb521ff73b521ff7bb521ff84b521ff8cb521ff94b521ff9cb521ffa5b521ffadb521ffb5b521ffbdb521ffc5b521ffceb521ffd6b521ffdeb521ffe6b521ffefb521fff7b521ffffb521ff00bd21ff08bd21ff10bd21ff19bd21ff21bd21ff29bd21ff31bd21ff3abd21ff42bd21ff4abd21ff52bd21ff5abd21ff63bd21ff6bbd21ff73bd21ff7bbd21ff84bd21ff8cbd21ff94bd21ff9cbd21ffa5bd21ffadbd21ffb5bd21ffbdbd21ffc5bd21ffcebd21ffd6bd21ffdebd21ffe6bd21ffefbd21fff7bd21ffffbd21ff00c521ff08c521ff10c521ff19c521ff21c521ff29c521ff31c521ff3ac521ff42c521ff4ac521ff52c521ff5ac521ff63c521ff6bc521ff73c521ff7bc521ff84c521ff8cc521ff94c521ff9cc521ffa5c521ffadc521ffb5c521ffbdc521ffc5c521ffcec521ffd6c521ffdec521ffe6c521ffefc521fff7c521ffffc521ff00ce21ff08ce21ff10ce21ff19ce21ff21ce21ff29ce21ff31ce21ff3ace21ff42ce21ff4ace21ff52ce21ff5ace21ff63ce21ff6bce21ff73ce21ff7bce21ff84ce21ff8cce21ff94ce21ff9cce21ffa5ce21ffadce21ffb5ce21ffbdce21ffc5ce21ffcece21ffd6ce21ffdece21ffe6ce21ffefce21fff7ce21ffffce21ff00d621ff08d621ff10d621ff19d621ff21d621ff29d621ff31d621ff3ad621ff42d621ff4ad621ff52d621ff5ad621ff63d621ff6bd621ff73d621ff7bd621ff84d621ff8cd621ff94d621ff9cd621ffa5d621ffadd621ffb5d621ffbdd621ffc5d621ffced621ffd6d621ffded621ffe6d621ffefd621fff7d621ffffd621ff00de21ff08de21ff10de21ff19de21ff21de21ff29de21ff31de21ff3ade21ff42de21ff4ade21ff52de21ff5ade21ff63de21ff6bde21ff73de21ff7bde21ff84de21ff8cde21ff94de21ff9cde21ffa5de21ffadde21ffb5de21ffbdde21ffc5de21ffcede21ffd6de21ffdede21ffe6de21ffefde21fff7de21ffffde21ff00e621ff08e621ff10e621ff19e621ff21e621ff29e621ff31e621ff3ae621ff42e621ff4ae621ff52e621ff5ae621ff63e621ff6be621ff73e621ff7be621ff84e621ff8ce621ff94e621ff9ce621ffa5e621ffade621ffb5e621ffbde621ffc5e621ffcee621ffd6e621ffdee621ffe6e621ffefe621fff7e621ffffe621ff00ef21ff08ef21ff10ef21ff19ef21ff21ef21ff29ef21ff31ef21ff3aef21ff42ef21ff4aef21ff52ef21ff5aef21ff63ef21ff6bef21ff73ef21ff7bef21ff84ef21ff8cef21ff94ef21ff9cef21ffa5ef21ffadef21ffb5ef21ffbdef21ffc5ef21ffceef21ffd6ef21ffdeef21ffe6ef21ffefef21fff7ef21ffffef21ff00f721ff08f721ff10f721ff19f721ff21f721ff29f721ff31f721ff3af721ff42f721ff4af721ff52f721ff5af721ff63f721ff6bf721ff73f721ff7bf721ff84f721ff8cf721ff94f721ff9cf721ffa5f721ffadf721ffb5f721ffbdf721ffc5f721ffcef721ffd6f721ffdef721ffe6f721ffeff721fff7f721fffff721ff00ff21ff08ff21ff10ff21ff19ff21ff21ff21ff29ff21ff31ff21ff3aff21ff42ff21ff4aff21ff52ff21ff5aff21ff63ff21ff6bff21ff73ff21ff7bff21ff84ff21ff8cff21ff94ff21ff9cff21ffa5ff21ffadff21ffb5ff21ffbdff21ffc5ff21ffceff21ffd6ff21ffdeff21ffe6ff21ffefff21fff7ff21ffffff21ff000029ff080029ff100029ff190029ff210029ff290029ff310029ff3a0029ff420029ff4a0029ff520029ff5a0029ff630029ff6b0029ff730029ff7b0029ff840029ff8c0029ff940029ff9c0029ffa50029ffad0029ffb50029ffbd0029ffc50029ffce0029ffd60029ffde0029ffe60029ffef0029fff70029ffff0029ff000829ff080829ff100829ff190829ff210829ff290829ff310829ff3a0829ff420829ff4a0829ff520829ff5a0829ff630829ff6b0829ff730829ff7b0829ff840829ff8c0829ff940829ff9c0829ffa50829ffad0829ffb50829ffbd0829ffc50829ffce0829ffd60829ffde0829ffe60829ffef0829fff70829ffff0829ff001029ff081029ff101029ff191029ff211029ff291029ff311029ff3a1029ff421029ff4a1029ff521029ff5a1029ff631029ff6b1029ff731029ff7b1029ff841029ff8c1029ff941029ff9c1029ffa51029ffad1029ffb51029ffbd1029ffc51029ffce1029ffd61029ffde1029ffe61029ffef1029fff71029ffff1029ff001929ff081929ff101929ff191929ff211929ff291929ff311929ff3a1929ff421929ff4a1929ff521929ff5a1929ff631929ff6b1929ff731929ff7b1929ff841929ff8c1929ff941929ff9c1929ffa51929ffad1929ffb51929ffbd1929ffc51929ffce1929ffd61929ffde1929ffe61929ffef1929fff71929ffff1929ff002129ff082129ff102129ff192129ff212129ff292129ff312129ff3a2129ff422129ff4a2129ff522129ff5a2129ff632129ff6b2129ff732129ff7b2129ff842129ff8c2129ff942129ff9c2129ffa52129ffad2129ffb52129ffbd2129ffc52129ffce2129ffd62129ffde2129ffe62129ffef2129fff72129ffff2129ff002929ff082929ff102929ff192929ff212929ff292929ff312929ff3a2929ff422929ff4a2929ff522929ff5a2929ff632929ff6b2929ff732929ff7b2929ff842929ff8c2929ff942929ff9c2929ffa52929ffad2929ffb52929ffbd2929ffc52929ffce2929ffd62929ffde2929ffe62929ffef2929fff72929ffff2929ff003129ff083129ff103129ff193129ff213129ff293129ff313129ff3a3129ff423129ff4a3129ff523129ff5a3129ff633129ff6b3129ff733129ff7b3129ff843129ff8c3129ff943129ff9c3129ffa53129ffad3129ffb53129ffbd3129ffc53129ffce3129ffd63129ffde3129ffe63129ffef3129fff73129ffff3129ff003a29ff083a29ff103a29ff193a29ff213a29ff293a29ff313a29ff3a3a29ff423a29ff4a3a29ff523a29ff5a3a29ff633a29ff6b3a29ff733a29ff7b3a29ff843a29ff8c3a29ff943a29ff9c3a29ffa53a29ffad3a29ffb53a29ffbd3a29ffc53a29ffce3a29ffd63a29ffde3a29ffe63a29ffef3a29fff73a29ffff3a29ff004229ff084229ff104229ff194229ff214229ff294229ff314229ff3a4229ff424229ff4a4229ff524229ff5a4229ff634229ff6b4229ff734229ff7b4229ff844229ff8c4229ff944229ff9c4229ffa54229ffad4229ffb54229ffbd4229ffc54229ffce4229ffd64229ffde4229ffe64229ffef4229fff74229ffff4229ff004a29ff084a29ff104a29ff194a29ff214a29ff294a29ff314a29ff3a4a29ff424a29ff4a4a29ff524a29ff5a4a29ff634a29ff6b4a29ff734a29ff7b4a29ff844a29ff8c4a29ff944a29ff9c4a29ffa54a29ffad4a29ffb54a29ffbd4a29ffc54a29ffce4a29ffd64a29ffde4a29ffe64a29ffef4a29fff74a29ffff4a29ff005229ff085229ff105229ff195229ff215229ff295229ff315229ff3a5229ff425229ff4a5229ff525229ff5a5229ff635229ff6b5229ff735229ff7b5229ff845229ff8c5229ff945229ff9c5229ffa55229ffad5229ffb55229ffbd5229ffc55229ffce5229ffd65229ffde5229ffe65229ffef5229fff75229ffff5229ff005a29ff085a29ff105a29ff195a29ff215a29ff295a29ff315a29ff3a5a29ff425a29ff4a5a29ff525a29ff5a5a29ff635a29ff6b5a29ff735a29ff7b5a29ff845a29ff8c5a29ff945a29ff9c5a29ffa55a29ffad5a29ffb55a29ffbd5a29ffc55a29ffce5a29ffd65a29ffde5a29ffe65a29ffef5a29fff75a29ffff5a29ff006329ff086329ff106329ff196329ff216329ff296329ff316329ff3a6329ff426329ff4a6329ff526329ff5a6329ff636329ff6b6329ff736329ff7b6329ff846329ff8c6329ff946329ff9c6329ffa56329ffad6329ffb56329ffbd6329ffc56329ffce6329ffd66329ffde6329ffe66329ffef6329fff76329ffff6329ff006b29ff086b29ff106b29ff196b29ff216b29ff296b29ff316b29ff3a6b29ff426b29ff4a6b29ff526b29ff5a6b29ff636b29ff6b6b29ff736b29ff7b6b29ff846b29ff8c6b29ff946b29ff9c6b29ffa56b29ffad6b29ffb56b29ffbd6b29ffc56b29ffce6b29ffd66b29ffde6b29ffe66b29ffef6b29fff76b29ffff6b29ff007329ff087329ff107329ff197329ff217329ff297329ff317329ff3a7329ff427329ff4a7329ff527329ff5a7329ff637329ff6b7329ff737329ff7b7329ff847329ff8c7329ff947329ff9c7329ffa57329ffad7329ffb57329ffbd7329ffc57329ffce7329ffd67329ffde7329ffe67329ffef7329fff77329ffff7329ff007b29ff087b29ff107b29ff197b29ff217b29ff297b29ff317b29ff3a7b29ff427b29ff4a7b29ff527b29ff5a7b29ff637b29ff6b7b29ff737b29ff7b7b29ff847b29ff8c7b29ff947b29ff9c7b29ffa57b29ffad7b29ffb57b29ffbd7b29ffc57b29ffce7b29ffd67b29ffde7b29ffe67b29ffef7b29fff77b29ffff7b29ff008429ff088429ff108429ff198429ff218429ff298429ff318429ff3a8429ff428429ff4a8429ff528429ff5a8429ff638429ff6b8429ff738429ff7b8429ff848429ff8c8429ff948429ff9c8429ffa58429ffad8429ffb58429ffbd8429ffc58429ffce8429ffd68429ffde8429ffe68429ffef8429fff78429ffff8429ff008c29ff088c29ff108c29ff198c29ff218c29ff298c29ff318c29ff3a8c29ff428c29ff4a8c29ff528c29ff5a8c29ff638c29ff6b8c29ff738c29ff7b8c29ff848c29ff8c8c29ff948c29ff9c8c29ffa58c29ffad8c29ffb58c29ffbd8c29ffc58c29ffce8c29ffd68c29ffde8c29ffe68c29ffef8c29fff78c29ffff8c29ff009429ff089429ff109429ff199429ff219429ff299429ff319429ff3a9429ff429429ff4a9429ff529429ff5a9429ff639429ff6b9429ff739429ff7b9429ff849429ff8c9429ff949429ff9c9429ffa59429ffad9429ffb59429ffbd9429ffc59429ffce9429ffd69429ffde9429ffe69429ffef9429fff79429ffff9429ff009c29ff089c29ff109c29ff199c29ff219c29ff299c29ff319c29ff3a9c29ff429c29ff4a9c29ff529c29ff5a9c29ff639c29ff6b9c29ff739c29ff7b9c29ff849c29ff8c9c29ff949c29ff9c9c29ffa59c29ffad9c29ffb59c29ffbd9c29ffc59c29ffce9c29ffd69c29ffde9c29ffe69c29ffef9c29fff79c29ffff9c29ff00a529ff08a529ff10a529ff19a529ff21a529ff29a529ff31a529ff3aa529ff42a529ff4aa529ff52a529ff5aa529ff63a529ff6ba529ff73a529ff7ba529ff84a529ff8ca529ff94a529ff9ca529ffa5a529ffada529ffb5a529ffbda529ffc5a529ffcea529ffd6a529ffdea529ffe6a529ffefa529fff7a529ffffa529ff00ad29ff08ad29ff10ad29ff19ad29ff21ad29ff29ad29ff31ad29ff3aad29ff42ad29ff4aad29ff52ad29ff5aad29ff63ad29ff6bad29ff73ad29ff7bad29ff84ad29ff8cad29ff94ad29ff9cad29ffa5ad29ffadad29ffb5ad29ffbdad29ffc5ad29ffcead29ffd6ad29ffdead29ffe6ad29ffefad29fff7ad29ffffad29ff00b529ff08b529ff10b529ff19b529ff21b529ff29b529ff31b529ff3ab529ff42b529ff4ab529ff52b529ff5ab529ff63b529ff6bb529ff73b529ff7bb529ff84b529ff8cb529ff94b529ff9cb529ffa5b529ffadb529ffb5b529ffbdb529ffc5b529ffceb529ffd6b529ffdeb529ffe6b529ffefb529fff7b529ffffb529ff00bd29ff08bd29ff10bd29ff19bd29ff21bd29ff29bd29ff31bd29ff3abd29ff42bd29ff4abd29ff52bd29ff5abd29ff63bd29ff6bbd29ff73bd29ff7bbd29ff84bd29ff8cbd29ff94bd29ff9cbd29ffa5bd29ffadbd29ffb5bd29ffbdbd29ffc5bd29ffcebd29ffd6bd29ffdebd29ffe6bd29ffefbd29fff7bd29ffffbd29ff00c529ff08c529ff10c529ff19c529ff21c529ff29c529ff31c529ff3ac529ff42c529ff4ac529ff52c529ff5ac529ff63c529ff6bc529ff73c529ff7bc529ff84c529ff8cc529ff94c529ff9cc529ffa5c529ffadc529ffb5c529ffbdc529ffc5c529ffcec529ffd6c529ffdec529ffe6c529ffefc529fff7c529ffffc529ff00ce29ff08ce29ff10ce29ff19ce29ff21ce29ff29ce29ff31ce29ff3ace29ff42ce29ff4ace29ff52ce29ff5ace29ff63ce29ff6bce29ff73ce29ff7bce29ff84ce29ff8cce29ff94ce29ff9cce29ffa5ce29ffadce29ffb5ce29ffbdce29ffc5ce29ffcece29ffd6ce29ffdece29ffe6ce29ffefce29fff7ce29ffffce29ff00d629ff08d629ff10d629ff19d629ff21d629ff29d629ff31d629ff3ad629ff42d629ff4ad629ff52d629ff5ad629ff63d629ff6bd629ff73d629ff7bd629ff84d629ff8cd629ff94d629ff9cd629ffa5d629ffadd629ffb5d629ffbdd629ffc5d629ffced629ffd6d629ffded629ffe6d629ffefd629fff7d629ffffd629ff00de29ff08de29ff10de29ff19de29ff21de29ff29de29ff31de29ff3ade29ff42de29ff4ade29ff52de29ff5ade29ff63de29ff6bde29ff73de29ff7bde29ff84de29ff8cde29ff94de29ff9cde29ffa5de29ffadde29ffb5de29ffbdde29ffc5de29ffcede29ffd6de29ffdede29ffe6de29ffefde29fff7de29ffffde29ff00e629ff08e629ff10e629ff19e629ff21e629ff29e629ff31e629ff3ae629ff42e629ff4ae629ff52e629ff5ae629ff63e629ff6be629ff73e629ff7be629ff84e629ff8ce629ff94e629ff9ce629ffa5e629ffade629ffb5e629ffbde629ffc5e629ffcee629ffd6e629ffdee629ffe6e629ffefe629fff7e629ffffe629ff00ef29ff08ef29ff10ef29ff19ef29ff21ef29ff29ef29ff31ef29ff3aef29ff42ef29ff4aef29ff52ef29ff5aef29ff63ef29ff6bef29ff73ef29ff7bef29ff84ef29ff8cef29ff94ef29ff9cef29ffa5ef29ffadef29ffb5ef29ffbdef29ffc5ef29ffceef29ffd6ef29ffdeef29ffe6ef29ffefef29fff7ef29ffffef29ff00f729ff08f729ff10f729ff19f729ff21f729ff29f729ff31f729ff3af729ff42f729ff4af729ff52f729ff5af729ff63f729ff6bf729ff73f729ff7bf729ff84f729ff8cf729ff94f729ff9cf729ffa5f729ffadf729ffb5f729ffbdf729ffc5f729ffcef729ffd6f729ffdef729ffe6f729ffeff729fff7f729fffff729ff00ff29ff08ff29ff10ff29ff19ff29ff21ff29ff29ff29ff31ff29ff3aff29ff42ff29ff4aff29ff52ff29ff5aff29ff63ff29ff6bff29ff73ff29ff7bff29ff84ff29ff8cff29ff94ff29ff9cff29ffa5ff29ffadff29ffb5ff29ffbdff29ffc5ff29ffceff29ffd6ff29ffdeff29ffe6ff29ffefff29fff7ff29ffffff29ff000031ff080031ff100031ff190031ff210031ff290031ff310031ff3a0031ff420031ff4a0031ff520031ff5a0031ff630031ff6b0031ff730031ff7b0031ff840031ff8c0031ff940031ff9c0031ffa50031ffad0031ffb50031ffbd0031ffc50031ffce0031ffd60031ffde0031ffe60031ffef0031fff70031ffff0031ff000831ff080831ff100831ff190831ff210831ff290831ff310831ff3a0831ff420831ff4a0831ff520831ff5a0831ff630831ff6b0831ff730831ff7b0831ff840831ff8c0831ff940831ff9c0831ffa50831ffad0831ffb50831ffbd0831ffc50831ffce0831ffd60831ffde0831ffe60831ffef0831fff70831ffff0831ff001031ff081031ff101031ff191031ff211031ff291031ff311031ff3a1031ff421031ff4a1031ff521031ff5a1031ff631031ff6b1031ff731031ff7b1031ff841031ff8c1031ff941031ff9c1031ffa51031ffad1031ffb51031ffbd1031ffc51031ffce1031ffd61031ffde1031ffe61031ffef1031fff71031ffff1031ff001931ff081931ff101931ff191931ff211931ff291931ff311931ff3a1931ff421931ff4a1931ff521931ff5a1931ff631931ff6b1931ff731931ff7b1931ff841931ff8c1931ff941931ff9c1931ffa51931ffad1931ffb51931ffbd1931ffc51931ffce1931ffd61931ffde1931ffe61931ffef1931fff71931ffff1931ff002131ff082131ff102131ff192131ff212131ff292131ff312131ff3a2131ff422131ff4a2131ff522131ff5a2131ff632131ff6b2131ff732131ff7b2131ff842131ff8c2131ff942131ff9c2131ffa52131ffad2131ffb52131ffbd2131ffc52131ffce2131ffd62131ffde2131ffe62131ffef2131fff72131ffff2131ff002931ff082931ff102931ff192931ff212931ff292931ff312931ff3a2931ff422931ff4a2931ff522931ff5a2931ff632931ff6b2931ff732931ff7b2931ff842931ff8c2931ff942931ff9c2931ffa52931ffad2931ffb52931ffbd2931ffc52931ffce2931ffd62931ffde2931ffe62931ffef2931fff72931ffff2931ff003131ff083131ff103131ff193131ff213131ff293131ff313131ff3a3131ff423131ff4a3131ff523131ff5a3131ff633131ff6b3131ff733131ff7b3131ff843131ff8c3131ff943131ff9c3131ffa53131ffad3131ffb53131ffbd3131ffc53131ffce3131ffd63131ffde3131ffe63131ffef3131fff73131ffff3131ff003a31ff083a31ff103a31ff193a31ff213a31ff293a31ff313a31ff3a3a31ff423a31ff4a3a31ff523a31ff5a3a31ff633a31ff6b3a31ff733a31ff7b3a31ff843a31ff8c3a31ff943a31ff9c3a31ffa53a31ffad3a31ffb53a31ffbd3a31ffc53a31ffce3a31ffd63a31ffde3a31ffe63a31ffef3a31fff73a31ffff3a31ff004231ff084231ff104231ff194231ff214231ff294231ff314231ff3a4231ff424231ff4a4231ff524231ff5a4231ff634231ff6b4231ff734231ff7b4231ff844231ff8c4231ff944231ff9c4231ffa54231ffad4231ffb54231ffbd4231ffc54231ffce4231ffd64231ffde4231ffe64231ffef4231fff74231ffff4231ff004a31ff084a31ff104a31ff194a31ff214a31ff294a31ff314a31ff3a4a31ff424a31ff4a4a31ff524a31ff5a4a31ff634a31ff6b4a31ff734a31ff7b4a31ff844a31ff8c4a31ff944a31ff9c4a31ffa54a31ffad4a31ffb54a31ffbd4a31ffc54a31ffce4a31ffd64a31ffde4a31ffe64a31ffef4a31fff74a31ffff4a31ff005231ff085231ff105231ff195231ff215231ff295231ff315231ff3a5231ff425231ff4a5231ff525231ff5a5231ff635231ff6b5231ff735231ff7b5231ff845231ff8c5231ff945231ff9c5231ffa55231ffad5231ffb55231ffbd5231ffc55231ffce5231ffd65231ffde5231ffe65231ffef5231fff75231ffff5231ff005a31ff085a31ff105a31ff195a31ff215a31ff295a31ff315a31ff3a5a31ff425a31ff4a5a31ff525a31ff5a5a31ff635a31ff6b5a31ff735a31ff7b5a31ff845a31ff8c5a31ff945a31ff9c5a31ffa55a31ffad5a31ffb55a31ffbd5a31ffc55a31ffce5a31ffd65a31ffde5a31ffe65a31ffef5a31fff75a31ffff5a31ff006331ff086331ff106331ff196331ff216331ff296331ff316331ff3a6331ff426331ff4a6331ff526331ff5a6331ff636331ff6b6331ff736331ff7b6331ff846331ff8c6331ff946331ff9c6331ffa56331ffad6331ffb56331ffbd6331ffc56331ffce6331ffd66331ffde6331ffe66331ffef6331fff76331ffff6331ff006b31ff086b31ff106b31ff196b31ff216b31ff296b31ff316b31ff3a6b31ff426b31ff4a6b31ff526b31ff5a6b31ff636b31ff6b6b31ff736b31ff7b6b31ff846b31ff8c6b31ff946b31ff9c6b31ffa56b31ffad6b31ffb56b31ffbd6b31ffc56b31ffce6b31ffd66b31ffde6b31ffe66b31ffef6b31fff76b31ffff6b31ff007331ff087331ff107331ff197331ff217331ff297331ff317331ff3a7331ff427331ff4a7331ff527331ff5a7331ff637331ff6b7331ff737331ff7b7331ff847331ff8c7331ff947331ff9c7331ffa57331ffad7331ffb57331ffbd7331ffc57331ffce7331ffd67331ffde7331ffe67331ffef7331fff77331ffff7331ff007b31ff087b31ff107b31ff197b31ff217b31ff297b31ff317b31ff3a7b31ff427b31ff4a7b31ff527b31ff5a7b31ff637b31ff6b7b31ff737b31ff7b7b31ff847b31ff8c7b31ff947b31ff9c7b31ffa57b31ffad7b31ffb57b31ffbd7b31ffc57b31ffce7b31ffd67b31ffde7b31ffe67b31ffef7b31fff77b31ffff7b31ff008431ff088431ff108431ff198431ff218431ff298431ff318431ff3a8431ff428431ff4a8431ff528431ff5a8431ff638431ff6b8431ff738431ff7b8431ff848431ff8c8431ff948431ff9c8431ffa58431ffad8431ffb58431ffbd8431ffc58431ffce8431ffd68431ffde8431ffe68431ffef8431fff78431ffff8431ff008c31ff088c31ff108c31ff198c31ff218c31ff298c31ff318c31ff3a8c31ff428c31ff4a8c31ff528c31ff5a8c31ff638c31ff6b8c31ff738c31ff7b8c31ff848c31ff8c8c31ff948c31ff9c8c31ffa58c31ffad8c31ffb58c31ffbd8c31ffc58c31ffce8c31ffd68c31ffde8c31ffe68c31ffef8c31fff78c31ffff8c31ff009431ff089431ff109431ff199431ff219431ff299431ff319431ff3a9431ff429431ff4a9431ff529431ff5a9431ff639431ff6b9431ff739431ff7b9431ff849431ff8c9431ff949431ff9c9431ffa59431ffad9431ffb59431ffbd9431ffc59431ffce9431ffd69431ffde9431ffe69431ffef9431fff79431ffff9431ff009c31ff089c31ff109c31ff199c31ff219c31ff299c31ff319c31ff3a9c31ff429c31ff4a9c31ff529c31ff5a9c31ff639c31ff6b9c31ff739c31ff7b9c31ff849c31ff8c9c31ff949c31ff9c9c31ffa59c31ffad9c31ffb59c31ffbd9c31ffc59c31ffce9c31ffd69c31ffde9c31ffe69c31ffef9c31fff79c31ffff9c31ff00a531ff08a531ff10a531ff19a531ff21a531ff29a531ff31a531ff3aa531ff42a531ff4aa531ff52a531ff5aa531ff63a531ff6ba531ff73a531ff7ba531ff84a531ff8ca531ff94a531ff9ca531ffa5a531ffada531ffb5a531ffbda531ffc5a531ffcea531ffd6a531ffdea531ffe6a531ffefa531fff7a531ffffa531ff00ad31ff08ad31ff10ad31ff19ad31ff21ad31ff29ad31ff31ad31ff3aad31ff42ad31ff4aad31ff52ad31ff5aad31ff63ad31ff6bad31ff73ad31ff7bad31ff84ad31ff8cad31ff94ad31ff9cad31ffa5ad31ffadad31ffb5ad31ffbdad31ffc5ad31ffcead31ffd6ad31ffdead31ffe6ad31ffefad31fff7ad31ffffad31ff00b531ff08b531ff10b531ff19b531ff21b531ff29b531ff31b531ff3ab531ff42b531ff4ab531ff52b531ff5ab531ff63b531ff6bb531ff73b531ff7bb531ff84b531ff8cb531ff94b531ff9cb531ffa5b531ffadb531ffb5b531ffbdb531ffc5b531ffceb531ffd6b531ffdeb531ffe6b531ffefb531fff7b531ffffb531ff00bd31ff08bd31ff10bd31ff19bd31ff21bd31ff29bd31ff31bd31ff3abd31ff42bd31ff4abd31ff52bd31ff5abd31ff63bd31ff6bbd31ff73bd31ff7bbd31ff84bd31ff8cbd31ff94bd31ff9cbd31ffa5bd31ffadbd31ffb5bd31ffbdbd31ffc5bd31ffcebd31ffd6bd31ffdebd31ffe6bd31ffefbd31fff7bd31ffffbd31ff00c531ff08c531ff10c531ff19c531ff21c531ff29c531ff31c531ff3ac531ff42c531ff4ac531ff52c531ff5ac531ff63c531ff6bc531ff73c531ff7bc531ff84c531ff8cc531ff94c531ff9cc531ffa5c531ffadc531ffb5c531ffbdc531ffc5c531ffcec531ffd6c531ffdec531ffe6c531ffefc531fff7c531ffffc531ff00ce31ff08ce31ff10ce31ff19ce31ff21ce31ff29ce31ff31ce31ff3ace31ff42ce31ff4ace31ff52ce31ff5ace31ff63ce31ff6bce31ff73ce31ff7bce31ff84ce31ff8cce31ff94ce31ff9cce31ffa5ce31ffadce31ffb5ce31ffbdce31ffc5ce31ffcece31ffd6ce31ffdece31ffe6ce31ffefce31fff7ce31ffffce31ff00d631ff08d631ff10d631ff19d631ff21d631ff29d631ff31d631ff3ad631ff42d631ff4ad631ff52d631ff5ad631ff63d631ff6bd631ff73d631ff7bd631ff84d631ff8cd631ff94d631ff9cd631ffa5d631ffadd631ffb5d631ffbdd631ffc5d631ffced631ffd6d631ffded631ffe6d631ffefd631fff7d631ffffd631ff00de31ff08de31ff10de31ff19de31ff21de31ff29de31ff31de31ff3ade31ff42de31ff4ade31ff52de31ff5ade31ff63de31ff6bde31ff73de31ff7bde31ff84de31ff8cde31ff94de31ff9cde31ffa5de31ffadde31ffb5de31ffbdde31ffc5de31ffcede31ffd6de31ffdede31ffe6de31ffefde31fff7de31ffffde31ff00e631ff08e631ff10e631ff19e631ff21e631ff29e631ff31e631ff3ae631ff42e631ff4ae631ff52e631ff5ae631ff63e631ff6be631ff73e631ff7be631ff84e631ff8ce631ff94e631ff9ce631ffa5e631ffade631ffb5e631ffbde631ffc5e631ffcee631ffd6e631ffdee631ffe6e631ffefe631fff7e631ffffe631ff00ef31ff08ef31ff10ef31ff19ef31ff21ef31ff29ef31ff31ef31ff3aef31ff42ef31ff4aef31ff52ef31ff5aef31ff63ef31ff6bef31ff73ef31ff7bef31ff84ef31ff8cef31ff94ef31ff9cef31ffa5ef31ffadef31ffb5ef31ffbdef31ffc5ef31ffceef31ffd6ef31ffdeef31ffe6ef31ffefef31fff7ef31ffffef31ff00f731ff08f731ff10f731ff19f731ff21f731ff29f731ff31f731ff3af731ff42f731ff4af731ff52f731ff5af731ff63f731ff6bf731ff73f731ff7bf731ff84f731ff8cf731ff94f731ff9cf731ffa5f731ffadf731ffb5f731ffbdf731ffc5f731ffcef731ffd6f731ffdef731ffe6f731ffeff731fff7f731fffff731ff00ff31ff08ff31ff10ff31ff19ff31ff21ff31ff29ff31ff31ff31ff3aff31ff42ff31ff4aff31ff52ff31ff5aff31ff63ff31ff6bff31ff73ff31ff7bff31ff84ff31ff8cff31ff94ff31ff9cff31ffa5ff31ffadff31ffb5ff31ffbdff31ffc5ff31ffceff31ffd6ff31ffdeff31ffe6ff31ffefff31fff7ff31ffffff31ff00003aff08003aff10003aff19003aff21003aff29003aff31003aff3a003aff42003aff4a003aff52003aff5a003aff63003aff6b003aff73003aff7b003aff84003aff8c003aff94003aff9c003affa5003affad003affb5003affbd003affc5003affce003affd6003affde003affe6003affef003afff7003affff003aff00083aff08083aff10083aff19083aff21083aff29083aff31083aff3a083aff42083aff4a083aff52083aff5a083aff63083aff6b083aff73083aff7b083aff84083aff8c083aff94083aff9c083affa5083affad083affb5083affbd083affc5083affce083affd6083affde083affe6083affef083afff7083affff083aff00103aff08103aff10103aff19103aff21103aff29103aff31103aff3a103aff42103aff4a103aff52103aff5a103aff63103aff6b103aff73103aff7b103aff84103aff8c103aff94103aff9c103affa5103affad103affb5103affbd103affc5103affce103affd6103affde103affe6103affef103afff7103affff103aff00193aff08193aff10193aff19193aff21193aff29193aff31193aff3a193aff42193aff4a193aff52193aff5a193aff63193aff6b193aff73193aff7b193aff84193aff8c193aff94193aff9c193affa5193affad193affb5193affbd193affc5193affce193affd6193affde193affe6193affef193afff7193affff193aff00213aff08213aff10213aff19213aff21213aff29213aff31213aff3a213aff42213aff4a213aff52213aff5a213aff63213aff6b213aff73213aff7b213aff84213aff8c213aff94213aff9c213affa5213affad213affb5213affbd213affc5213affce213affd6213affde213affe6213affef213afff7213affff213aff00293aff08293aff10293aff19293aff21293aff29293aff31293aff3a293aff42293aff4a293aff52293aff5a293aff63293aff6b293aff73293aff7b293aff84293aff8c293aff94293aff9c293affa5293affad293affb5293affbd293affc5293affce293affd6293affde293affe6293affef293afff7293affff293aff00313aff08313aff10313aff19313aff21313aff29313aff31313aff3a313aff42313aff4a313aff52313aff5a313aff63313aff6b313aff73313aff7b313aff84313aff8c313aff94313aff9c313affa5313affad313affb5313affbd313affc5313affce313affd6313affde313affe6313affef313afff7313affff313aff003a3aff083a3aff103a3aff193a3aff213a3aff293a3aff313a3aff3a3a3aff423a3aff4a3a3aff523a3aff5a3a3aff633a3aff6b3a3aff733a3aff7b3a3aff843a3aff8c3a3aff943a3aff9c3a3affa53a3affad3a3affb53a3affbd3a3affc53a3affce3a3affd63a3affde3a3affe63a3affef3a3afff73a3affff3a3aff00423aff08423aff10423aff19423aff21423aff29423aff31423aff3a423aff42423aff4a423aff52423aff5a423aff63423aff6b423aff73423aff7b423aff84423aff8c423aff94423aff9c423affa5423affad423affb5423affbd423affc5423affce423affd6423affde423affe6423affef423afff7423affff423aff004a3aff084a3aff104a3aff194a3aff214a3aff294a3aff314a3aff3a4a3aff424a3aff4a4a3aff524a3aff5a4a3aff634a3aff6b4a3aff734a3aff7b4a3aff844a3aff8c4a3aff944a3aff9c4a3affa54a3affad4a3affb54a3affbd4a3affc54a3affce4a3affd64a3affde4a3affe64a3affef4a3afff74a3affff4a3aff00523aff08523aff10523aff19523aff21523aff29523aff31523aff3a523aff42523aff4a523aff52523aff5a523aff63523aff6b523aff73523aff7b523aff84523aff8c523aff94523aff9c523affa5523affad523affb5523affbd523affc5523affce523affd6523affde523affe6523affef523afff7523affff523aff005a3aff085a3aff105a3aff195a3aff215a3aff295a3aff315a3aff3a5a3aff425a3aff4a5a3aff525a3aff5a5a3aff635a3aff6b5a3aff735a3aff7b5a3aff845a3aff8c5a3aff945a3aff9c5a3affa55a3affad5a3affb55a3affbd5a3affc55a3affce5a3affd65a3affde5a3affe65a3affef5a3afff75a3affff5a3aff00633aff08633aff10633aff19633aff21633aff29633aff31633aff3a633aff42633aff4a633aff52633aff5a633aff63633aff6b633aff73633aff7b633aff84633aff8c633aff94633aff9c633affa5633affad633affb5633affbd633affc5633affce633affd6633affde633affe6633affef633afff7633affff633aff006b3aff086b3aff106b3aff196b3aff216b3aff296b3aff316b3aff3a6b3aff426b3aff4a6b3aff526b3aff5a6b3aff636b3aff6b6b3aff736b3aff7b6b3aff846b3aff8c6b3aff946b3aff9c6b3affa56b3affad6b3affb56b3affbd6b3affc56b3affce6b3affd66b3affde6b3affe66b3affef6b3afff76b3affff6b3aff00733aff08733aff10733aff19733aff21733aff29733aff31733aff3a733aff42733aff4a733aff52733aff5a733aff63733aff6b733aff73733aff7b733aff84733aff8c733aff94733aff9c733affa5733affad733affb5733affbd733affc5733affce733affd6733affde733affe6733affef733afff7733affff733aff007b3aff087b3aff107b3aff197b3aff217b3aff297b3aff317b3aff3a7b3aff427b3aff4a7b3aff527b3aff5a7b3aff637b3aff6b7b3aff737b3aff7b7b3aff847b3aff8c7b3aff947b3aff9c7b3affa57b3affad7b3affb57b3affbd7b3affc57b3affce7b3affd67b3affde7b3affe67b3affef7b3afff77b3affff7b3aff00843aff08843aff10843aff19843aff21843aff29843aff31843aff3a843aff42843aff4a843aff52843aff5a843aff63843aff6b843aff73843aff7b843aff84843aff8c843aff94843aff9c843affa5843affad843affb5843affbd843affc5843affce843affd6843affde843affe6843affef843afff7843affff843aff008c3aff088c3aff108c3aff198c3aff218c3aff298c3aff318c3aff3a8c3aff428c3aff4a8c3aff528c3aff5a8c3aff638c3aff6b8c3aff738c3aff7b8c3aff848c3aff8c8c3aff948c3aff9c8c3affa58c3affad8c3affb58c3affbd8c3affc58c3affce8c3affd68c3affde8c3affe68c3affef8c3afff78c3affff8c3aff00943aff08943aff10943aff19943aff21943aff29943aff31943aff3a943aff42943aff4a943aff52943aff5a943aff63943aff6b943aff73943aff7b943aff84943aff8c943aff94943aff9c943affa5943affad943affb5943affbd943affc5943affce943affd6943affde943affe6943affef943afff7943affff943aff009c3aff089c3aff109c3aff199c3aff219c3aff299c3aff319c3aff3a9c3aff429c3aff4a9c3aff529c3aff5a9c3aff639c3aff6b9c3aff739c3aff7b9c3aff849c3aff8c9c3aff949c3aff9c9c3affa59c3affad9c3affb59c3affbd9c3affc59c3affce9c3affd69c3affde9c3affe69c3affef9c3afff79c3affff9c3aff00a53aff08a53aff10a53aff19a53aff21a53aff29a53aff31a53aff3aa53aff42a53aff4aa53aff52a53aff5aa53aff63a53aff6ba53aff73a53aff7ba53aff84a53aff8ca53aff94a53aff9ca53affa5a53affada53affb5a53affbda53affc5a53affcea53affd6a53affdea53affe6a53affefa53afff7a53affffa53aff00ad3aff08ad3aff10ad3aff19ad3aff21ad3aff29ad3aff31ad3aff3aad3aff42ad3aff4aad3aff52ad3aff5aad3aff63ad3aff6bad3aff73ad3aff7bad3aff84ad3aff8cad3aff94ad3aff9cad3affa5ad3affadad3affb5ad3affbdad3affc5ad3affcead3affd6ad3affdead3affe6ad3affefad3afff7ad3affffad3aff00b53aff08b53aff10b53aff19b53aff21b53aff29b53aff31b53aff3ab53aff42b53aff4ab53aff52b53aff5ab53aff63b53aff6bb53aff73b53aff7bb53aff84b53aff8cb53aff94b53aff9cb53affa5b53affadb53affb5b53affbdb53affc5b53affceb53affd6b53affdeb53affe6b53affefb53afff7b53affffb53aff00bd3aff08bd3aff10bd3aff19bd3aff21bd3aff29bd3aff31bd3aff3abd3aff42bd3aff4abd3aff52bd3aff5abd3aff63bd3aff6bbd3aff73bd3aff7bbd3aff84bd3aff8cbd3aff94bd3aff9cbd3affa5bd3affadbd3affb5bd3affbdbd3affc5bd3affcebd3affd6bd3affdebd3affe6bd3affefbd3afff7bd3affffbd3aff00c53aff08c53aff10c53aff19c53aff21c53aff29c53aff31c53aff3ac53aff42c53aff4ac53aff52c53aff5ac53aff63c53aff6bc53aff73c53aff7bc53aff84c53aff8cc53aff94c53aff9cc53affa5c53affadc53affb5c53affbdc53affc5c53affcec53affd6c53affdec53affe6c53affefc53afff7c53affffc53aff00ce3aff08ce3aff10ce3aff19ce3aff21ce3aff29ce3aff31ce3aff3ace3aff42ce3aff4ace3aff52ce3aff5ace3aff63ce3aff6bce3aff73ce3aff7bce3aff84ce3aff8cce3aff94ce3aff9cce3affa5ce3affadce3affb5ce3affbdce3affc5ce3affcece3affd6ce3affdece3affe6ce3affefce3afff7ce3affffce3aff00d63aff08d63aff10d63aff19d63aff21d63aff29d63aff31d63aff3ad63aff42d63aff4ad63aff52d63aff5ad63aff63d63aff6bd63aff73d63aff7bd63aff84d63aff8cd63aff94d63aff9cd63affa5d63affadd63affb5d63affbdd63affc5d63affced63affd6d63affded63affe6d63affefd63afff7d63affffd63aff00de3aff08de3aff10de3aff19de3aff21de3aff29de3aff31de3aff3ade3aff42de3aff4ade3aff52de3aff5ade3aff63de3aff6bde3aff73de3aff7bde3aff84de3aff8cde3aff94de3aff9cde3affa5de3affadde3affb5de3affbdde3affc5de3affcede3affd6de3affdede3affe6de3affefde3afff7de3affffde3aff00e63aff08e63aff10e63aff19e63aff21e63aff29e63aff31e63aff3ae63aff42e63aff4ae63aff52e63aff5ae63aff63e63aff6be63aff73e63aff7be63aff84e63aff8ce63aff94e63aff9ce63affa5e63affade63affb5e63affbde63affc5e63affcee63affd6e63affdee63affe6e63affefe63afff7e63affffe63aff00ef3aff08ef3aff10ef3aff19ef3aff21ef3aff29ef3aff31ef3aff3aef3aff42ef3aff4aef3aff52ef3aff5aef3aff63ef3aff6bef3aff73ef3aff7bef3aff84ef3aff8cef3aff94ef3aff9cef3affa5ef3affadef3affb5ef3affbdef3affc5ef3affceef3affd6ef3affdeef3affe6ef3affefef3afff7ef3affffef3aff00f73aff08f73aff10f73aff19f73aff21f73aff29f73aff31f73aff3af73aff42f73aff4af73aff52f73aff5af73aff63f73aff6bf73aff73f73aff7bf73aff84f73aff8cf73aff94f73aff9cf73affa5f73affadf73affb5f73affbdf73affc5f73affcef73affd6f73affdef73affe6f73affeff73afff7f73afffff73aff00ff3aff08ff3aff10ff3aff19ff3aff21ff3aff29ff3aff31ff3aff3aff3aff42ff3aff4aff3aff52ff3aff5aff3aff63ff3aff6bff3aff73ff3aff7bff3aff84ff3aff8cff3aff94ff3aff9cff3affa5ff3affadff3affb5ff3affbdff3affc5ff3affceff3affd6ff3affdeff3affe6ff3affefff3afff7ff3affffff3aff000042ff080042ff100042ff190042ff210042ff290042ff310042ff3a0042ff420042ff4a0042ff520042ff5a0042ff630042ff6b0042ff730042ff7b0042ff840042ff8c0042ff940042ff9c0042ffa50042ffad0042ffb50042ffbd0042ffc50042ffce0042ffd60042ffde0042ffe60042ffef0042fff70042ffff0042ff000842ff080842ff100842ff190842ff210842ff290842ff310842ff3a0842ff420842ff4a0842ff520842ff5a0842ff630842ff6b0842ff730842ff7b0842ff840842ff8c0842ff940842ff9c0842ffa50842ffad0842ffb50842ffbd0842ffc50842ffce0842ffd60842ffde0842ffe60842ffef0842fff70842ffff0842ff001042ff081042ff101042ff191042ff211042ff291042ff311042ff3a1042ff421042ff4a1042ff521042ff5a1042ff631042ff6b1042ff731042ff7b1042ff841042ff8c1042ff941042ff9c1042ffa51042ffad1042ffb51042ffbd1042ffc51042ffce1042ffd61042ffde1042ffe61042ffef1042fff71042ffff1042ff001942ff081942ff101942ff191942ff211942ff291942ff311942ff3a1942ff421942ff4a1942ff521942ff5a1942ff631942ff6b1942ff731942ff7b1942ff841942ff8c1942ff941942ff9c1942ffa51942ffad1942ffb51942ffbd1942ffc51942ffce1942ffd61942ffde1942ffe61942ffef1942fff71942ffff1942ff002142ff082142ff102142ff192142ff212142ff292142ff312142ff3a2142ff422142ff4a2142ff522142ff5a2142ff632142ff6b2142ff732142ff7b2142ff842142ff8c2142ff942142ff9c2142ffa52142ffad2142ffb52142ffbd2142ffc52142ffce2142ffd62142ffde2142ffe62142ffef2142fff72142ffff2142ff002942ff082942ff102942ff192942ff212942ff292942ff312942ff3a2942ff422942ff4a2942ff522942ff5a2942ff632942ff6b2942ff732942ff7b2942ff842942ff8c2942ff942942ff9c2942ffa52942ffad2942ffb52942ffbd2942ffc52942ffce2942ffd62942ffde2942ffe62942ffef2942fff72942ffff2942ff003142ff083142ff103142ff193142ff213142ff293142ff313142ff3a3142ff423142ff4a3142ff523142ff5a3142ff633142ff6b3142ff733142ff7b3142ff843142ff8c3142ff943142ff9c3142ffa53142ffad3142ffb53142ffbd3142ffc53142ffce3142ffd63142ffde3142ffe63142ffef3142fff73142ffff3142ff003a42ff083a42ff103a42ff193a42ff213a42ff293a42ff313a42ff3a3a42ff423a42ff4a3a42ff523a42ff5a3a42ff633a42ff6b3a42ff733a42ff7b3a42ff843a42ff8c3a42ff943a42ff9c3a42ffa53a42ffad3a42ffb53a42ffbd3a42ffc53a42ffce3a42ffd63a42ffde3a42ffe63a42ffef3a42fff73a42ffff3a42ff004242ff084242ff104242ff194242ff214242ff294242ff314242ff3a4242ff424242ff4a4242ff524242ff5a4242ff634242ff6b4242ff734242ff7b4242ff844242ff8c4242ff944242ff9c4242ffa54242ffad4242ffb54242ffbd4242ffc54242ffce4242ffd64242ffde4242ffe64242ffef4242fff74242ffff4242ff004a42ff084a42ff104a42ff194a42ff214a42ff294a42ff314a42ff3a4a42ff424a42ff4a4a42ff524a42ff5a4a42ff634a42ff6b4a42ff734a42ff7b4a42ff844a42ff8c4a42ff944a42ff9c4a42ffa54a42ffad4a42ffb54a42ffbd4a42ffc54a42ffce4a42ffd64a42ffde4a42ffe64a42ffef4a42fff74a42ffff4a42ff005242ff085242ff105242ff195242ff215242ff295242ff315242ff3a5242ff425242ff4a5242ff525242ff5a5242ff635242ff6b5242ff735242ff7b5242ff845242ff8c5242ff945242ff9c5242ffa55242ffad5242ffb55242ffbd5242ffc55242ffce5242ffd65242ffde5242ffe65242ffef5242fff75242ffff5242ff005a42ff085a42ff105a42ff195a42ff215a42ff295a42ff315a42ff3a5a42ff425a42ff4a5a42ff525a42ff5a5a42ff635a42ff6b5a42ff735a42ff7b5a42ff845a42ff8c5a42ff945a42ff9c5a42ffa55a42ffad5a42ffb55a42ffbd5a42ffc55a42ffce5a42ffd65a42ffde5a42ffe65a42ffef5a42fff75a42ffff5a42ff006342ff086342ff106342ff196342ff216342ff296342ff316342ff3a6342ff426342ff4a6342ff526342ff5a6342ff636342ff6b6342ff736342ff7b6342ff846342ff8c6342ff946342ff9c6342ffa56342ffad6342ffb56342ffbd6342ffc56342ffce6342ffd66342ffde6342ffe66342ffef6342fff76342ffff6342ff006b42ff086b42ff106b42ff196b42ff216b42ff296b42ff316b42ff3a6b42ff426b42ff4a6b42ff526b42ff5a6b42ff636b42ff6b6b42ff736b42ff7b6b42ff846b42ff8c6b42ff946b42ff9c6b42ffa56b42ffad6b42ffb56b42ffbd6b42ffc56b42ffce6b42ffd66b42ffde6b42ffe66b42ffef6b42fff76b42ffff6b42ff007342ff087342ff107342ff197342ff217342ff297342ff317342ff3a7342ff427342ff4a7342ff527342ff5a7342ff637342ff6b7342ff737342ff7b7342ff847342ff8c7342ff947342ff9c7342ffa57342ffad7342ffb57342ffbd7342ffc57342ffce7342ffd67342ffde7342ffe67342ffef7342fff77342ffff7342ff007b42ff087b42ff107b42ff197b42ff217b42ff297b42ff317b42ff3a7b42ff427b42ff4a7b42ff527b42ff5a7b42ff637b42ff6b7b42ff737b42ff7b7b42ff847b42ff8c7b42ff947b42ff9c7b42ffa57b42ffad7b42ffb57b42ffbd7b42ffc57b42ffce7b42ffd67b42ffde7b42ffe67b42ffef7b42fff77b42ffff7b42ff008442ff088442ff108442ff198442ff218442ff298442ff318442ff3a8442ff428442ff4a8442ff528442ff5a8442ff638442ff6b8442ff738442ff7b8442ff848442ff8c8442ff948442ff9c8442ffa58442ffad8442ffb58442ffbd8442ffc58442ffce8442ffd68442ffde8442ffe68442ffef8442fff78442ffff8442ff008c42ff088c42ff108c42ff198c42ff218c42ff298c42ff318c42ff3a8c42ff428c42ff4a8c42ff528c42ff5a8c42ff638c42ff6b8c42ff738c42ff7b8c42ff848c42ff8c8c42ff948c42ff9c8c42ffa58c42ffad8c42ffb58c42ffbd8c42ffc58c42ffce8c42ffd68c42ffde8c42ffe68c42ffef8c42fff78c42ffff8c42ff009442ff089442ff109442ff199442ff219442ff299442ff319442ff3a9442ff429442ff4a9442ff529442ff5a9442ff639442ff6b9442ff739442ff7b9442ff849442ff8c9442ff949442ff9c9442ffa59442ffad9442ffb59442ffbd9442ffc59442ffce9442ffd69442ffde9442ffe69442ffef9442fff79442ffff9442ff009c42ff089c42ff109c42ff199c42ff219c42ff299c42ff319c42ff3a9c42ff429c42ff4a9c42ff529c42ff5a9c42ff639c42ff6b9c42ff739c42ff7b9c42ff849c42ff8c9c42ff949c42ff9c9c42ffa59c42ffad9c42ffb59c42ffbd9c42ffc59c42ffce9c42ffd69c42ffde9c42ffe69c42ffef9c42fff79c42ffff9c42ff00a542ff08a542ff10a542ff19a542ff21a542ff29a542ff31a542ff3aa542ff42a542ff4aa542ff52a542ff5aa542ff63a542ff6ba542ff73a542ff7ba542ff84a542ff8ca542ff94a542ff9ca542ffa5a542ffada542ffb5a542ffbda542ffc5a542ffcea542ffd6a542ffdea542ffe6a542ffefa542fff7a542ffffa542ff00ad42ff08ad42ff10ad42ff19ad42ff21ad42ff29ad42ff31ad42ff3aad42ff42ad42ff4aad42ff52ad42ff5aad42ff63ad42ff6bad42ff73ad42ff7bad42ff84ad42ff8cad42ff94ad42ff9cad42ffa5ad42ffadad42ffb5ad42ffbdad42ffc5ad42ffcead42ffd6ad42ffdead42ffe6ad42ffefad42fff7ad42ffffad42ff00b542ff08b542ff10b542ff19b542ff21b542ff29b542ff31b542ff3ab542ff42b542ff4ab542ff52b542ff5ab542ff63b542ff6bb542ff73b542ff7bb542ff84b542ff8cb542ff94b542ff9cb542ffa5b542ffadb542ffb5b542ffbdb542ffc5b542ffceb542ffd6b542ffdeb542ffe6b542ffefb542fff7b542ffffb542ff00bd42ff08bd42ff10bd42ff19bd42ff21bd42ff29bd42ff31bd42ff3abd42ff42bd42ff4abd42ff52bd42ff5abd42ff63bd42ff6bbd42ff73bd42ff7bbd42ff84bd42ff8cbd42ff94bd42ff9cbd42ffa5bd42ffadbd42ffb5bd42ffbdbd42ffc5bd42ffcebd42ffd6bd42ffdebd42ffe6bd42ffefbd42fff7bd42ffffbd42ff00c542ff08c542ff10c542ff19c542ff21c542ff29c542ff31c542ff3ac542ff42c542ff4ac542ff52c542ff5ac542ff63c542ff6bc542ff73c542ff7bc542ff84c542ff8cc542ff94c542ff9cc542ffa5c542ffadc542ffb5c542ffbdc542ffc5c542ffcec542ffd6c542ffdec542ffe6c542ffefc542fff7c542ffffc542ff00ce42ff08ce42ff10ce42ff19ce42ff21ce42ff29ce42ff31ce42ff3ace42ff42ce42ff4ace42ff52ce42ff5ace42ff63ce42ff6bce42ff73ce42ff7bce42ff84ce42ff8cce42ff94ce42ff9cce42ffa5ce42ffadce42ffb5ce42ffbdce42ffc5ce42ffcece42ffd6ce42ffdece42ffe6ce42ffefce42fff7ce42ffffce42ff00d642ff08d642ff10d642ff19d642ff21d642ff29d642ff31d642ff3ad642ff42d642ff4ad642ff52d642ff5ad642ff63d642ff6bd642ff73d642ff7bd642ff84d642ff8cd642ff94d642ff9cd642ffa5d642ffadd642ffb5d642ffbdd642ffc5d642ffced642ffd6d642ffded642ffe6d642ffefd642fff7d642ffffd642ff00de42ff08de42ff10de42ff19de42ff21de42ff29de42ff31de42ff3ade42ff42de42ff4ade42ff52de42ff5ade42ff63de42ff6bde42ff73de42ff7bde42ff84de42ff8cde42ff94de42ff9cde42ffa5de42ffadde42ffb5de42ffbdde42ffc5de42ffcede42ffd6de42ffdede42ffe6de42ffefde42fff7de42ffffde42ff00e642ff08e642ff10e642ff19e642ff21e642ff29e642ff31e642ff3ae642ff42e642ff4ae642ff52e642ff5ae642ff63e642ff6be642ff73e642ff7be642ff84e642ff8ce642ff94e642ff9ce642ffa5e642ffade642ffb5e642ffbde642ffc5e642ffcee642ffd6e642ffdee642ffe6e642ffefe642fff7e642ffffe642ff00ef42ff08ef42ff10ef42ff19ef42ff21ef42ff29ef42ff31ef42ff3aef42ff42ef42ff4aef42ff52ef42ff5aef42ff63ef42ff6bef42ff73ef42ff7bef42ff84ef42ff8cef42ff94ef42ff9cef42ffa5ef42ffadef42ffb5ef42ffbdef42ffc5ef42ffceef42ffd6ef42ffdeef42ffe6ef42ffefef42fff7ef42ffffef42ff00f742ff08f742ff10f742ff19f742ff21f742ff29f742ff31f742ff3af742ff42f742ff4af742ff52f742ff5af742ff63f742ff6bf742ff73f742ff7bf742ff84f742ff8cf742ff94f742ff9cf742ffa5f742ffadf742ffb5f742ffbdf742ffc5f742ffcef742ffd6f742ffdef742ffe6f742ffeff742fff7f742fffff742ff00ff42ff08ff42ff10ff42ff19ff42ff21ff42ff29ff42ff31ff42ff3aff42ff42ff42ff4aff42ff52ff42ff5aff42ff63ff42ff6bff42ff73ff42ff7bff42ff84ff42ff8cff42ff94ff42ff9cff42ffa5ff42ffadff42ffb5ff42ffbdff42ffc5ff42ffceff42ffd6ff42ffdeff42ffe6ff42ffefff42fff7ff42ffffff42ff00004aff08004aff10004aff19004aff21004aff29004aff31004aff3a004aff42004aff4a004aff52004aff5a004aff63004aff6b004aff73004aff7b004aff84004aff8c004aff94004aff9c004affa5004affad004affb5004affbd004affc5004affce004affd6004affde004affe6004affef004afff7004affff004aff00084aff08084aff10084aff19084aff21084aff29084aff31084aff3a084aff42084aff4a084aff52084aff5a084aff63084aff6b084aff73084aff7b084aff84084aff8c084aff94084aff9c084affa5084affad084affb5084affbd084affc5084affce084affd6084affde084affe6084affef084afff7084affff084aff00104aff08104aff10104aff19104aff21104aff29104aff31104aff3a104aff42104aff4a104aff52104aff5a104aff63104aff6b104aff73104aff7b104aff84104aff8c104aff94104aff9c104affa5104affad104affb5104affbd104affc5104affce104affd6104affde104affe6104affef104afff7104affff104aff00194aff08194aff10194aff19194aff21194aff29194aff31194aff3a194aff42194aff4a194aff52194aff5a194aff63194aff6b194aff73194aff7b194aff84194aff8c194aff94194aff9c194affa5194affad194affb5194affbd194affc5194affce194affd6194affde194affe6194affef194afff7194affff194aff00214aff08214aff10214aff19214aff21214aff29214aff31214aff3a214aff42214aff4a214aff52214aff5a214aff63214aff6b214aff73214aff7b214aff84214aff8c214aff94214aff9c214affa5214affad214affb5214affbd214affc5214affce214affd6214affde214affe6214affef214afff7214affff214aff00294aff08294aff10294aff19294aff21294aff29294aff31294aff3a294aff42294aff4a294aff52294aff5a294aff63294aff6b294aff73294aff7b294aff84294aff8c294aff94294aff9c294affa5294affad294affb5294affbd294affc5294affce294affd6294affde294affe6294affef294afff7294affff294aff00314aff08314aff10314aff19314aff21314aff29314aff31314aff3a314aff42314aff4a314aff52314aff5a314aff63314aff6b314aff73314aff7b314aff84314aff8c314aff94314aff9c314affa5314affad314affb5314affbd314affc5314affce314affd6314affde314affe6314affef314afff7314affff314aff003a4aff083a4aff103a4aff193a4aff213a4aff293a4aff313a4aff3a3a4aff423a4aff4a3a4aff523a4aff5a3a4aff633a4aff6b3a4aff733a4aff7b3a4aff843a4aff8c3a4aff943a4aff9c3a4affa53a4affad3a4affb53a4affbd3a4affc53a4affce3a4affd63a4affde3a4affe63a4affef3a4afff73a4affff3a4aff00424aff08424aff10424aff19424aff21424aff29424aff31424aff3a424aff42424aff4a424aff52424aff5a424aff63424aff6b424aff73424aff7b424aff84424aff8c424aff94424aff9c424affa5424affad424affb5424affbd424affc5424affce424affd6424affde424affe6424affef424afff7424affff424aff004a4aff084a4aff104a4aff194a4aff214a4aff294a4aff314a4aff3a4a4aff424a4aff4a4a4aff524a4aff5a4a4aff634a4aff6b4a4aff734a4aff7b4a4aff844a4aff8c4a4aff944a4aff9c4a4affa54a4affad4a4affb54a4affbd4a4affc54a4affce4a4affd64a4affde4a4affe64a4affef4a4afff74a4affff4a4aff00524aff08524aff10524aff19524aff21524aff29524aff31524aff3a524aff42524aff4a524aff52524aff5a524aff63524aff6b524aff73524aff7b524aff84524aff8c524aff94524aff9c524affa5524affad524affb5524affbd524affc5524affce524affd6524affde524affe6524affef524afff7524affff524aff005a4aff085a4aff105a4aff195a4aff215a4aff295a4aff315a4aff3a5a4aff425a4aff4a5a4aff525a4aff5a5a4aff635a4aff6b5a4aff735a4aff7b5a4aff845a4aff8c5a4aff945a4aff9c5a4affa55a4affad5a4affb55a4affbd5a4affc55a4affce5a4affd65a4affde5a4affe65a4affef5a4afff75a4affff5a4aff00634aff08634aff10634aff19634aff21634aff29634aff31634aff3a634aff42634aff4a634aff52634aff5a634aff63634aff6b634aff73634aff7b634aff84634aff8c634aff94634aff9c634affa5634affad634affb5634affbd634affc5634affce634affd6634affde634affe6634affef634afff7634affff634aff006b4aff086b4aff106b4aff196b4aff216b4aff296b4aff316b4aff3a6b4aff426b4aff4a6b4aff526b4aff5a6b4aff636b4aff6b6b4aff736b4aff7b6b4aff846b4aff8c6b4aff946b4aff9c6b4affa56b4affad6b4affb56b4affbd6b4affc56b4affce6b4affd66b4affde6b4affe66b4affef6b4afff76b4affff6b4aff00734aff08734aff10734aff19734aff21734aff29734aff31734aff3a734aff42734aff4a734aff52734aff5a734aff63734aff6b734aff73734aff7b734aff84734aff8c734aff94734aff9c734affa5734affad734affb5734affbd734affc5734affce734affd6734affde734affe6734affef734afff7734affff734aff007b4aff087b4aff107b4aff197b4aff217b4aff297b4aff317b4aff3a7b4aff427b4aff4a7b4aff527b4aff5a7b4aff637b4aff6b7b4aff737b4aff7b7b4aff847b4aff8c7b4aff947b4aff9c7b4affa57b4affad7b4affb57b4affbd7b4affc57b4affce7b4affd67b4affde7b4affe67b4affef7b4afff77b4affff7b4aff00844aff08844aff10844aff19844aff21844aff29844aff31844aff3a844aff42844aff4a844aff52844aff5a844aff63844aff6b844aff73844aff7b844aff84844aff8c844aff94844aff9c844affa5844affad844affb5844affbd844affc5844affce844affd6844affde844affe6844affef844afff7844affff844aff008c4aff088c4aff108c4aff198c4aff218c4aff298c4aff318c4aff3a8c4aff428c4aff4a8c4aff528c4aff5a8c4aff638c4aff6b8c4aff738c4aff7b8c4aff848c4aff8c8c4aff948c4aff9c8c4affa58c4affad8c4affb58c4affbd8c4affc58c4affce8c4affd68c4affde8c4affe68c4affef8c4afff78c4affff8c4aff00944aff08944aff10944aff19944aff21944aff29944aff31944aff3a944aff42944aff4a944aff52944aff5a944aff63944aff6b944aff73944aff7b944aff84944aff8c944aff94944aff9c944affa5944affad944affb5944affbd944affc5944affce944affd6944affde944affe6944affef944afff7944affff944aff009c4aff089c4aff109c4aff199c4aff219c4aff299c4aff319c4aff3a9c4aff429c4aff4a9c4aff529c4aff5a9c4aff639c4aff6b9c4aff739c4aff7b9c4aff849c4aff8c9c4aff949c4aff9c9c4affa59c4affad9c4affb59c4affbd9c4affc59c4affce9c4affd69c4affde9c4affe69c4affef9c4afff79c4affff9c4aff00a54aff08a54aff10a54aff19a54aff21a54aff29a54aff31a54aff3aa54aff42a54aff4aa54aff52a54aff5aa54aff63a54aff6ba54aff73a54aff7ba54aff84a54aff8ca54aff94a54aff9ca54affa5a54affada54affb5a54affbda54affc5a54affcea54affd6a54affdea54affe6a54affefa54afff7a54affffa54aff00ad4aff08ad4aff10ad4aff19ad4aff21ad4aff29ad4aff31ad4aff3aad4aff42ad4aff4aad4aff52ad4aff5aad4aff63ad4aff6bad4aff73ad4aff7bad4aff84ad4aff8cad4aff94ad4aff9cad4affa5ad4affadad4affb5ad4affbdad4affc5ad4affcead4affd6ad4affdead4affe6ad4affefad4afff7ad4affffad4aff00b54aff08b54aff10b54aff19b54aff21b54aff29b54aff31b54aff3ab54aff42b54aff4ab54aff52b54aff5ab54aff63b54aff6bb54aff73b54aff7bb54aff84b54aff8cb54aff94b54aff9cb54affa5b54affadb54affb5b54affbdb54affc5b54affceb54affd6b54affdeb54affe6b54affefb54afff7b54affffb54aff00bd4aff08bd4aff10bd4aff19bd4aff21bd4aff29bd4aff31bd4aff3abd4aff42bd4aff4abd4aff52bd4aff5abd4aff63bd4aff6bbd4aff73bd4aff7bbd4aff84bd4aff8cbd4aff94bd4aff9cbd4affa5bd4affadbd4affb5bd4affbdbd4affc5bd4affcebd4affd6bd4affdebd4affe6bd4affefbd4afff7bd4affffbd4aff00c54aff08c54aff10c54aff19c54aff21c54aff29c54aff31c54aff3ac54aff42c54aff4ac54aff52c54aff5ac54aff63c54aff6bc54aff73c54aff7bc54aff84c54aff8cc54aff94c54aff9cc54affa5c54affadc54affb5c54affbdc54affc5c54affcec54affd6c54affdec54affe6c54affefc54afff7c54affffc54aff00ce4aff08ce4aff10ce4aff19ce4aff21ce4aff29ce4aff31ce4aff3ace4aff42ce4aff4ace4aff52ce4aff5ace4aff63ce4aff6bce4aff73ce4aff7bce4aff84ce4aff8cce4aff94ce4aff9cce4affa5ce4affadce4affb5ce4affbdce4affc5ce4affcece4affd6ce4affdece4affe6ce4affefce4afff7ce4affffce4aff00d64aff08d64aff10d64aff19d64aff21d64aff29d64aff31d64aff3ad64aff42d64aff4ad64aff52d64aff5ad64aff63d64aff6bd64aff73d64aff7bd64aff84d64aff8cd64aff94d64aff9cd64affa5d64affadd64affb5d64affbdd64affc5d64affced64affd6d64affded64affe6d64affefd64afff7d64affffd64aff00de4aff08de4aff10de4aff19de4aff21de4aff29de4aff31de4aff3ade4aff42de4aff4ade4aff52de4aff5ade4aff63de4aff6bde4aff73de4aff7bde4aff84de4aff8cde4aff94de4aff9cde4affa5de4affadde4affb5de4affbdde4affc5de4affcede4affd6de4affdede4affe6de4affefde4afff7de4affffde4aff00e64aff08e64aff10e64aff19e64aff21e64aff29e64aff31e64aff3ae64aff42e64aff4ae64aff52e64aff5ae64aff63e64aff6be64aff73e64aff7be64aff84e64aff8ce64aff94e64aff9ce64affa5e64affade64affb5e64affbde64affc5e64affcee64affd6e64affdee64affe6e64affefe64afff7e64affffe64aff00ef4aff08ef4aff10ef4aff19ef4aff21ef4aff29ef4aff31ef4aff3aef4aff42ef4aff4aef4aff52ef4aff5aef4aff63ef4aff6bef4aff73ef4aff7bef4aff84ef4aff8cef4aff94ef4aff9cef4affa5ef4affadef4affb5ef4affbdef4affc5ef4affceef4affd6ef4affdeef4affe6ef4affefef4afff7ef4affffef4aff00f74aff08f74aff10f74aff19f74aff21f74aff29f74aff31f74aff3af74aff42f74aff4af74aff52f74aff5af74aff63f74aff6bf74aff73f74aff7bf74aff84f74aff8cf74aff94f74aff9cf74affa5f74affadf74affb5f74affbdf74affc5f74affcef74affd6f74affdef74affe6f74affeff74afff7f74afffff74aff00ff4aff08ff4aff10ff4aff19ff4aff21ff4aff29ff4aff31ff4aff3aff4aff42ff4aff4aff4aff52ff4aff5aff4aff63ff4aff6bff4aff73ff4aff7bff4aff84ff4aff8cff4aff94ff4aff9cff4affa5ff4affadff4affb5ff4affbdff4affc5ff4affceff4affd6ff4affdeff4affe6ff4affefff4afff7ff4affffff4aff000052ff080052ff100052ff190052ff210052ff290052ff310052ff3a0052ff420052ff4a0052ff520052ff5a0052ff630052ff6b0052ff730052ff7b0052ff840052ff8c0052ff940052ff9c0052ffa50052ffad0052ffb50052ffbd0052ffc50052ffce0052ffd60052ffde0052ffe60052ffef0052fff70052ffff0052ff000852ff080852ff100852ff190852ff210852ff290852ff310852ff3a0852ff420852ff4a0852ff520852ff5a0852ff630852ff6b0852ff730852ff7b0852ff840852ff8c0852ff940852ff9c0852ffa50852ffad0852ffb50852ffbd0852ffc50852ffce0852ffd60852ffde0852ffe60852ffef0852fff70852ffff0852ff001052ff081052ff101052ff191052ff211052ff291052ff311052ff3a1052ff421052ff4a1052ff521052ff5a1052ff631052ff6b1052ff731052ff7b1052ff841052ff8c1052ff941052ff9c1052ffa51052ffad1052ffb51052ffbd1052ffc51052ffce1052ffd61052ffde1052ffe61052ffef1052fff71052ffff1052ff001952ff081952ff101952ff191952ff211952ff291952ff311952ff3a1952ff421952ff4a1952ff521952ff5a1952ff631952ff6b1952ff731952ff7b1952ff841952ff8c1952ff941952ff9c1952ffa51952ffad1952ffb51952ffbd1952ffc51952ffce1952ffd61952ffde1952ffe61952ffef1952fff71952ffff1952ff002152ff082152ff102152ff192152ff212152ff292152ff312152ff3a2152ff422152ff4a2152ff522152ff5a2152ff632152ff6b2152ff732152ff7b2152ff842152ff8c2152ff942152ff9c2152ffa52152ffad2152ffb52152ffbd2152ffc52152ffce2152ffd62152ffde2152ffe62152ffef2152fff72152ffff2152ff002952ff082952ff102952ff192952ff212952ff292952ff312952ff3a2952ff422952ff4a2952ff522952ff5a2952ff632952ff6b2952ff732952ff7b2952ff842952ff8c2952ff942952ff9c2952ffa52952ffad2952ffb52952ffbd2952ffc52952ffce2952ffd62952ffde2952ffe62952ffef2952fff72952ffff2952ff003152ff083152ff103152ff193152ff213152ff293152ff313152ff3a3152ff423152ff4a3152ff523152ff5a3152ff633152ff6b3152ff733152ff7b3152ff843152ff8c3152ff943152ff9c3152ffa53152ffad3152ffb53152ffbd3152ffc53152ffce3152ffd63152ffde3152ffe63152ffef3152fff73152ffff3152ff003a52ff083a52ff103a52ff193a52ff213a52ff293a52ff313a52ff3a3a52ff423a52ff4a3a52ff523a52ff5a3a52ff633a52ff6b3a52ff733a52ff7b3a52ff843a52ff8c3a52ff943a52ff9c3a52ffa53a52ffad3a52ffb53a52ffbd3a52ffc53a52ffce3a52ffd63a52ffde3a52ffe63a52ffef3a52fff73a52ffff3a52ff004252ff084252ff104252ff194252ff214252ff294252ff314252ff3a4252ff424252ff4a4252ff524252ff5a4252ff634252ff6b4252ff734252ff7b4252ff844252ff8c4252ff944252ff9c4252ffa54252ffad4252ffb54252ffbd4252ffc54252ffce4252ffd64252ffde4252ffe64252ffef4252fff74252ffff4252ff004a52ff084a52ff104a52ff194a52ff214a52ff294a52ff314a52ff3a4a52ff424a52ff4a4a52ff524a52ff5a4a52ff634a52ff6b4a52ff734a52ff7b4a52ff844a52ff8c4a52ff944a52ff9c4a52ffa54a52ffad4a52ffb54a52ffbd4a52ffc54a52ffce4a52ffd64a52ffde4a52ffe64a52ffef4a52fff74a52ffff4a52ff005252ff085252ff105252ff195252ff215252ff295252ff315252ff3a5252ff425252ff4a5252ff525252ff5a5252ff635252ff6b5252ff735252ff7b5252ff845252ff8c5252ff945252ff9c5252ffa55252ffad5252ffb55252ffbd5252ffc55252ffce5252ffd65252ffde5252ffe65252ffef5252fff75252ffff5252ff005a52ff085a52ff105a52ff195a52ff215a52ff295a52ff315a52ff3a5a52ff425a52ff4a5a52ff525a52ff5a5a52ff635a52ff6b5a52ff735a52ff7b5a52ff845a52ff8c5a52ff945a52ff9c5a52ffa55a52ffad5a52ffb55a52ffbd5a52ffc55a52ffce5a52ffd65a52ffde5a52ffe65a52ffef5a52fff75a52ffff5a52ff006352ff086352ff106352ff196352ff216352ff296352ff316352ff3a6352ff426352ff4a6352ff526352ff5a6352ff636352ff6b6352ff736352ff7b6352ff846352ff8c6352ff946352ff9c6352ffa56352ffad6352ffb56352ffbd6352ffc56352ffce6352ffd66352ffde6352ffe66352ffef6352fff76352ffff6352ff006b52ff086b52ff106b52ff196b52ff216b52ff296b52ff316b52ff3a6b52ff426b52ff4a6b52ff526b52ff5a6b52ff636b52ff6b6b52ff736b52ff7b6b52ff846b52ff8c6b52ff946b52ff9c6b52ffa56b52ffad6b52ffb56b52ffbd6b52ffc56b52ffce6b52ffd66b52ffde6b52ffe66b52ffef6b52fff76b52ffff6b52ff007352ff087352ff107352ff197352ff217352ff297352ff317352ff3a7352ff427352ff4a7352ff527352ff5a7352ff637352ff6b7352ff737352ff7b7352ff847352ff8c7352ff947352ff9c7352ffa57352ffad7352ffb57352ffbd7352ffc57352ffce7352ffd67352ffde7352ffe67352ffef7352fff77352ffff7352ff007b52ff087b52ff107b52ff197b52ff217b52ff297b52ff317b52ff3a7b52ff427b52ff4a7b52ff527b52ff5a7b52ff637b52ff6b7b52ff737b52ff7b7b52ff847b52ff8c7b52ff947b52ff9c7b52ffa57b52ffad7b52ffb57b52ffbd7b52ffc57b52ffce7b52ffd67b52ffde7b52ffe67b52ffef7b52fff77b52ffff7b52ff008452ff088452ff108452ff198452ff218452ff298452ff318452ff3a8452ff428452ff4a8452ff528452ff5a8452ff638452ff6b8452ff738452ff7b8452ff848452ff8c8452ff948452ff9c8452ffa58452ffad8452ffb58452ffbd8452ffc58452ffce8452ffd68452ffde8452ffe68452ffef8452fff78452ffff8452ff008c52ff088c52ff108c52ff198c52ff218c52ff298c52ff318c52ff3a8c52ff428c52ff4a8c52ff528c52ff5a8c52ff638c52ff6b8c52ff738c52ff7b8c52ff848c52ff8c8c52ff948c52ff9c8c52ffa58c52ffad8c52ffb58c52ffbd8c52ffc58c52ffce8c52ffd68c52ffde8c52ffe68c52ffef8c52fff78c52ffff8c52ff009452ff089452ff109452ff199452ff219452ff299452ff319452ff3a9452ff429452ff4a9452ff529452ff5a9452ff639452ff6b9452ff739452ff7b9452ff849452ff8c9452ff949452ff9c9452ffa59452ffad9452ffb59452ffbd9452ffc59452ffce9452ffd69452ffde9452ffe69452ffef9452fff79452ffff9452ff009c52ff089c52ff109c52ff199c52ff219c52ff299c52ff319c52ff3a9c52ff429c52ff4a9c52ff529c52ff5a9c52ff639c52ff6b9c52ff739c52ff7b9c52ff849c52ff8c9c52ff949c52ff9c9c52ffa59c52ffad9c52ffb59c52ffbd9c52ffc59c52ffce9c52ffd69c52ffde9c52ffe69c52ffef9c52fff79c52ffff9c52ff00a552ff08a552ff10a552ff19a552ff21a552ff29a552ff31a552ff3aa552ff42a552ff4aa552ff52a552ff5aa552ff63a552ff6ba552ff73a552ff7ba552ff84a552ff8ca552ff94a552ff9ca552ffa5a552ffada552ffb5a552ffbda552ffc5a552ffcea552ffd6a552ffdea552ffe6a552ffefa552fff7a552ffffa552ff00ad52ff08ad52ff10ad52ff19ad52ff21ad52ff29ad52ff31ad52ff3aad52ff42ad52ff4aad52ff52ad52ff5aad52ff63ad52ff6bad52ff73ad52ff7bad52ff84ad52ff8cad52ff94ad52ff9cad52ffa5ad52ffadad52ffb5ad52ffbdad52ffc5ad52ffcead52ffd6ad52ffdead52ffe6ad52ffefad52fff7ad52ffffad52ff00b552ff08b552ff10b552ff19b552ff21b552ff29b552ff31b552ff3ab552ff42b552ff4ab552ff52b552ff5ab552ff63b552ff6bb552ff73b552ff7bb552ff84b552ff8cb552ff94b552ff9cb552ffa5b552ffadb552ffb5b552ffbdb552ffc5b552ffceb552ffd6b552ffdeb552ffe6b552ffefb552fff7b552ffffb552ff00bd52ff08bd52ff10bd52ff19bd52ff21bd52ff29bd52ff31bd52ff3abd52ff42bd52ff4abd52ff52bd52ff5abd52ff63bd52ff6bbd52ff73bd52ff7bbd52ff84bd52ff8cbd52ff94bd52ff9cbd52ffa5bd52ffadbd52ffb5bd52ffbdbd52ffc5bd52ffcebd52ffd6bd52ffdebd52ffe6bd52ffefbd52fff7bd52ffffbd52ff00c552ff08c552ff10c552ff19c552ff21c552ff29c552ff31c552ff3ac552ff42c552ff4ac552ff52c552ff5ac552ff63c552ff6bc552ff73c552ff7bc552ff84c552ff8cc552ff94c552ff9cc552ffa5c552ffadc552ffb5c552ffbdc552ffc5c552ffcec552ffd6c552ffdec552ffe6c552ffefc552fff7c552ffffc552ff00ce52ff08ce52ff10ce52ff19ce52ff21ce52ff29ce52ff31ce52ff3ace52ff42ce52ff4ace52ff52ce52ff5ace52ff63ce52ff6bce52ff73ce52ff7bce52ff84ce52ff8cce52ff94ce52ff9cce52ffa5ce52ffadce52ffb5ce52ffbdce52ffc5ce52ffcece52ffd6ce52ffdece52ffe6ce52ffefce52fff7ce52ffffce52ff00d652ff08d652ff10d652ff19d652ff21d652ff29d652ff31d652ff3ad652ff42d652ff4ad652ff52d652ff5ad652ff63d652ff6bd652ff73d652ff7bd652ff84d652ff8cd652ff94d652ff9cd652ffa5d652ffadd652ffb5d652ffbdd652ffc5d652ffced652ffd6d652ffded652ffe6d652ffefd652fff7d652ffffd652ff00de52ff08de52ff10de52ff19de52ff21de52ff29de52ff31de52ff3ade52ff42de52ff4ade52ff52de52ff5ade52ff63de52ff6bde52ff73de52ff7bde52ff84de52ff8cde52ff94de52ff9cde52ffa5de52ffadde52ffb5de52ffbdde52ffc5de52ffcede52ffd6de52ffdede52ffe6de52ffefde52fff7de52ffffde52ff00e652ff08e652ff10e652ff19e652ff21e652ff29e652ff31e652ff3ae652ff42e652ff4ae652ff52e652ff5ae652ff63e652ff6be652ff73e652ff7be652ff84e652ff8ce652ff94e652ff9ce652ffa5e652ffade652ffb5e652ffbde652ffc5e652ffcee652ffd6e652ffdee652ffe6e652ffefe652fff7e652ffffe652ff00ef52ff08ef52ff10ef52ff19ef52ff21ef52ff29ef52ff31ef52ff3aef52ff42ef52ff4aef52ff52ef52ff5aef52ff63ef52ff6bef52ff73ef52ff7bef52ff84ef52ff8cef52ff94ef52ff9cef52ffa5ef52ffadef52ffb5ef52ffbdef52ffc5ef52ffceef52ffd6ef52ffdeef52ffe6ef52ffefef52fff7ef52ffffef52ff00f752ff08f752ff10f752ff19f752ff21f752ff29f752ff31f752ff3af752ff42f752ff4af752ff52f752ff5af752ff63f752ff6bf752ff73f752ff7bf752ff84f752ff8cf752ff94f752ff9cf752ffa5f752ffadf752ffb5f752ffbdf752ffc5f752ffcef752ffd6f752ffdef752ffe6f752ffeff752fff7f752fffff752ff00ff52ff08ff52ff10ff52ff19ff52ff21ff52ff29ff52ff31ff52ff3aff52ff42ff52ff4aff52ff52ff52ff5aff52ff63ff52ff6bff52ff73ff52ff7bff52ff84ff52ff8cff52ff94ff52ff9cff52ffa5ff52ffadff52ffb5ff52ffbdff52ffc5ff52ffceff52ffd6ff52ffdeff52ffe6ff52ffefff52fff7ff52ffffff52ff00005aff08005aff10005aff19005aff21005aff29005aff31005aff3a005aff42005aff4a005aff52005aff5a005aff63005aff6b005aff73005aff7b005aff84005aff8c005aff94005aff9c005affa5005affad005affb5005affbd005affc5005affce005affd6005affde005affe6005affef005afff7005affff005aff00085aff08085aff10085aff19085aff21085aff29085aff31085aff3a085aff42085aff4a085aff52085aff5a085aff63085aff6b085aff73085aff7b085aff84085aff8c085aff94085aff9c085affa5085affad085affb5085affbd085affc5085affce085affd6085affde085affe6085affef085afff7085affff085aff00105aff08105aff10105aff19105aff21105aff29105aff31105aff3a105aff42105aff4a105aff52105aff5a105aff63105aff6b105aff73105aff7b105aff84105aff8c105aff94105aff9c105affa5105affad105affb5105affbd105affc5105affce105affd6105affde105affe6105affef105afff7105affff105aff00195aff08195aff10195aff19195aff21195aff29195aff31195aff3a195aff42195aff4a195aff52195aff5a195aff63195aff6b195aff73195aff7b195aff84195aff8c195aff94195aff9c195affa5195affad195affb5195affbd195affc5195affce195affd6195affde195affe6195affef195afff7195affff195aff00215aff08215aff10215aff19215aff21215aff29215aff31215aff3a215aff42215aff4a215aff52215aff5a215aff63215aff6b215aff73215aff7b215aff84215aff8c215aff94215aff9c215affa5215affad215affb5215affbd215affc5215affce215affd6215affde215affe6215affef215afff7215affff215aff00295aff08295aff10295aff19295aff21295aff29295aff31295aff3a295aff42295aff4a295aff52295aff5a295aff63295aff6b295aff73295aff7b295aff84295aff8c295aff94295aff9c295affa5295affad295affb5295affbd295affc5295affce295affd6295affde295affe6295affef295afff7295affff295aff00315aff08315aff10315aff19315aff21315aff29315aff31315aff3a315aff42315aff4a315aff52315aff5a315aff63315aff6b315aff73315aff7b315aff84315aff8c315aff94315aff9c315affa5315affad315affb5315affbd315affc5315affce315affd6315affde315affe6315affef315afff7315affff315aff003a5aff083a5aff103a5aff193a5aff213a5aff293a5aff313a5aff3a3a5aff423a5aff4a3a5aff523a5aff5a3a5aff633a5aff6b3a5aff733a5aff7b3a5aff843a5aff8c3a5aff943a5aff9c3a5affa53a5affad3a5affb53a5affbd3a5affc53a5affce3a5affd63a5affde3a5affe63a5affef3a5afff73a5affff3a5aff00425aff08425aff10425aff19425aff21425aff29425aff31425aff3a425aff42425aff4a425aff52425aff5a425aff63425aff6b425aff73425aff7b425aff84425aff8c425aff94425aff9c425affa5425affad425affb5425affbd425affc5425affce425affd6425affde425affe6425affef425afff7425affff425aff004a5aff084a5aff104a5aff194a5aff214a5aff294a5aff314a5aff3a4a5aff424a5aff4a4a5aff524a5aff5a4a5aff634a5aff6b4a5aff734a5aff7b4a5aff844a5aff8c4a5aff944a5aff9c4a5affa54a5affad4a5affb54a5affbd4a5affc54a5affce4a5affd64a5affde4a5affe64a5affef4a5afff74a5affff4a5aff00525aff08525aff10525aff19525aff21525aff29525aff31525aff3a525aff42525aff4a525aff52525aff5a525aff63525aff6b525aff73525aff7b525aff84525aff8c525aff94525aff9c525affa5525affad525affb5525affbd525affc5525affce525affd6525affde525affe6525affef525afff7525affff525aff005a5aff085a5aff105a5aff195a5aff215a5aff295a5aff315a5aff3a5a5aff425a5aff4a5a5aff525a5aff5a5a5aff635a5aff6b5a5aff735a5aff7b5a5aff845a5aff8c5a5aff945a5aff9c5a5affa55a5affad5a5affb55a5affbd5a5affc55a5affce5a5affd65a5affde5a5affe65a5affef5a5afff75a5affff5a5aff00635aff08635aff10635aff19635aff21635aff29635aff31635aff3a635aff42635aff4a635aff52635aff5a635aff63635aff6b635aff73635aff7b635aff84635aff8c635aff94635aff9c635affa5635affad635affb5635affbd635affc5635affce635affd6635affde635affe6635affef635afff7635affff635aff006b5aff086b5aff106b5aff196b5aff216b5aff296b5aff316b5aff3a6b5aff426b5aff4a6b5aff526b5aff5a6b5aff636b5aff6b6b5aff736b5aff7b6b5aff846b5aff8c6b5aff946b5aff9c6b5affa56b5affad6b5affb56b5affbd6b5affc56b5affce6b5affd66b5affde6b5affe66b5affef6b5afff76b5affff6b5aff00735aff08735aff10735aff19735aff21735aff29735aff31735aff3a735aff42735aff4a735aff52735aff5a735aff63735aff6b735aff73735aff7b735aff84735aff8c735aff94735aff9c735affa5735affad735affb5735affbd735affc5735affce735affd6735affde735affe6735affef735afff7735affff735aff007b5aff087b5aff107b5aff197b5aff217b5aff297b5aff317b5aff3a7b5aff427b5aff4a7b5aff527b5aff5a7b5aff637b5aff6b7b5aff737b5aff7b7b5aff847b5aff8c7b5aff947b5aff9c7b5affa57b5affad7b5affb57b5affbd7b5affc57b5affce7b5affd67b5affde7b5affe67b5affef7b5afff77b5affff7b5aff00845aff08845aff10845aff19845aff21845aff29845aff31845aff3a845aff42845aff4a845aff52845aff5a845aff63845aff6b845aff73845aff7b845aff84845aff8c845aff94845aff9c845affa5845affad845affb5845affbd845affc5845affce845affd6845affde845affe6845affef845afff7845affff845aff008c5aff088c5aff108c5aff198c5aff218c5aff298c5aff318c5aff3a8c5aff428c5aff4a8c5aff528c5aff5a8c5aff638c5aff6b8c5aff738c5aff7b8c5aff848c5aff8c8c5aff948c5aff9c8c5affa58c5affad8c5affb58c5affbd8c5affc58c5affce8c5affd68c5affde8c5affe68c5affef8c5afff78c5affff8c5aff00945aff08945aff10945aff19945aff21945aff29945aff31945aff3a945aff42945aff4a945aff52945aff5a945aff63945aff6b945aff73945aff7b945aff84945aff8c945aff94945aff9c945affa5945affad945affb5945affbd945affc5945affce945affd6945affde945affe6945affef945afff7945affff945aff009c5aff089c5aff109c5aff199c5aff219c5aff299c5aff319c5aff3a9c5aff429c5aff4a9c5aff529c5aff5a9c5aff639c5aff6b9c5aff739c5aff7b9c5aff849c5aff8c9c5aff949c5aff9c9c5affa59c5affad9c5affb59c5affbd9c5affc59c5affce9c5affd69c5affde9c5affe69c5affef9c5afff79c5affff9c5aff00a55aff08a55aff10a55aff19a55aff21a55aff29a55aff31a55aff3aa55aff42a55aff4aa55aff52a55aff5aa55aff63a55aff6ba55aff73a55aff7ba55aff84a55aff8ca55aff94a55aff9ca55affa5a55affada55affb5a55affbda55affc5a55affcea55affd6a55affdea55affe6a55affefa55afff7a55affffa55aff00ad5aff08ad5aff10ad5aff19ad5aff21ad5aff29ad5aff31ad5aff3aad5aff42ad5aff4aad5aff52ad5aff5aad5aff63ad5aff6bad5aff73ad5aff7bad5aff84ad5aff8cad5aff94ad5aff9cad5affa5ad5affadad5affb5ad5affbdad5affc5ad5affcead5affd6ad5affdead5affe6ad5affefad5afff7ad5affffad5aff00b55aff08b55aff10b55aff19b55aff21b55aff29b55aff31b55aff3ab55aff42b55aff4ab55aff52b55aff5ab55aff63b55aff6bb55aff73b55aff7bb55aff84b55aff8cb55aff94b55aff9cb55affa5b55affadb55affb5b55affbdb55affc5b55affceb55affd6b55affdeb55affe6b55affefb55afff7b55affffb55aff00bd5aff08bd5aff10bd5aff19bd5aff21bd5aff29bd5aff31bd5aff3abd5aff42bd5aff4abd5aff52bd5aff5abd5aff63bd5aff6bbd5aff73bd5aff7bbd5aff84bd5aff8cbd5aff94bd5aff9cbd5affa5bd5affadbd5affb5bd5affbdbd5affc5bd5affcebd5affd6bd5affdebd5affe6bd5affefbd5afff7bd5affffbd5aff00c55aff08c55aff10c55aff19c55aff21c55aff29c55aff31c55aff3ac55aff42c55aff4ac55aff52c55aff5ac55aff63c55aff6bc55aff73c55aff7bc55aff84c55aff8cc55aff94c55aff9cc55affa5c55affadc55affb5c55affbdc55affc5c55affcec55affd6c55affdec55affe6c55affefc55afff7c55affffc55aff00ce5aff08ce5aff10ce5aff19ce5aff21ce5aff29ce5aff31ce5aff3ace5aff42ce5aff4ace5aff52ce5aff5ace5aff63ce5aff6bce5aff73ce5aff7bce5aff84ce5aff8cce5aff94ce5aff9cce5affa5ce5affadce5affb5ce5affbdce5affc5ce5affcece5affd6ce5affdece5affe6ce5affefce5afff7ce5affffce5aff00d65aff08d65aff10d65aff19d65aff21d65aff29d65aff31d65aff3ad65aff42d65aff4ad65aff52d65aff5ad65aff63d65aff6bd65aff73d65aff7bd65aff84d65aff8cd65aff94d65aff9cd65affa5d65affadd65affb5d65affbdd65affc5d65affced65affd6d65affded65affe6d65affefd65afff7d65affffd65aff00de5aff08de5aff10de5aff19de5aff21de5aff29de5aff31de5aff3ade5aff42de5aff4ade5aff52de5aff5ade5aff63de5aff6bde5aff73de5aff7bde5aff84de5aff8cde5aff94de5aff9cde5affa5de5affadde5affb5de5affbdde5affc5de5affcede5affd6de5affdede5affe6de5affefde5afff7de5affffde5aff00e65aff08e65aff10e65aff19e65aff21e65aff29e65aff31e65aff3ae65aff42e65aff4ae65aff52e65aff5ae65aff63e65aff6be65aff73e65aff7be65aff84e65aff8ce65aff94e65aff9ce65affa5e65affade65affb5e65affbde65affc5e65affcee65affd6e65affdee65affe6e65affefe65afff7e65affffe65aff00ef5aff08ef5aff10ef5aff19ef5aff21ef5aff29ef5aff31ef5aff3aef5aff42ef5aff4aef5aff52ef5aff5aef5aff63ef5aff6bef5aff73ef5aff7bef5aff84ef5aff8cef5aff94ef5aff9cef5affa5ef5affadef5affb5ef5affbdef5affc5ef5affceef5affd6ef5affdeef5affe6ef5affefef5afff7ef5affffef5aff00f75aff08f75aff10f75aff19f75aff21f75aff29f75aff31f75aff3af75aff42f75aff4af75aff52f75aff5af75aff63f75aff6bf75aff73f75aff7bf75aff84f75aff8cf75aff94f75aff9cf75affa5f75affadf75affb5f75affbdf75affc5f75affcef75affd6f75affdef75affe6f75affeff75afff7f75afffff75aff00ff5aff08ff5aff10ff5aff19ff5aff21ff5aff29ff5aff31ff5aff3aff5aff42ff5aff4aff5aff52ff5aff5aff5aff63ff5aff6bff5aff73ff5aff7bff5aff84ff5aff8cff5aff94ff5aff9cff5affa5ff5affadff5affb5ff5affbdff5affc5ff5affceff5affd6ff5affdeff5affe6ff5affefff5afff7ff5affffff5aff000063ff080063ff100063ff190063ff210063ff290063ff310063ff3a0063ff420063ff4a0063ff520063ff5a0063ff630063ff6b0063ff730063ff7b0063ff840063ff8c0063ff940063ff9c0063ffa50063ffad0063ffb50063ffbd0063ffc50063ffce0063ffd60063ffde0063ffe60063ffef0063fff70063ffff0063ff000863ff080863ff100863ff190863ff210863ff290863ff310863ff3a0863ff420863ff4a0863ff520863ff5a0863ff630863ff6b0863ff730863ff7b0863ff840863ff8c0863ff940863ff9c0863ffa50863ffad0863ffb50863ffbd0863ffc50863ffce0863ffd60863ffde0863ffe60863ffef0863fff70863ffff0863ff001063ff081063ff101063ff191063ff211063ff291063ff311063ff3a1063ff421063ff4a1063ff521063ff5a1063ff631063ff6b1063ff731063ff7b1063ff841063ff8c1063ff941063ff9c1063ffa51063ffad1063ffb51063ffbd1063ffc51063ffce1063ffd61063ffde1063ffe61063ffef1063fff71063ffff1063ff001963ff081963ff101963ff191963ff211963ff291963ff311963ff3a1963ff421963ff4a1963ff521963ff5a1963ff631963ff6b1963ff731963ff7b1963ff841963ff8c1963ff941963ff9c1963ffa51963ffad1963ffb51963ffbd1963ffc51963ffce1963ffd61963ffde1963ffe61963ffef1963fff71963ffff1963ff002163ff082163ff102163ff192163ff212163ff292163ff312163ff3a2163ff422163ff4a2163ff522163ff5a2163ff632163ff6b2163ff732163ff7b2163ff842163ff8c2163ff942163ff9c2163ffa52163ffad2163ffb52163ffbd2163ffc52163ffce2163ffd62163ffde2163ffe62163ffef2163fff72163ffff2163ff002963ff082963ff102963ff192963ff212963ff292963ff312963ff3a2963ff422963ff4a2963ff522963ff5a2963ff632963ff6b2963ff732963ff7b2963ff842963ff8c2963ff942963ff9c2963ffa52963ffad2963ffb52963ffbd2963ffc52963ffce2963ffd62963ffde2963ffe62963ffef2963fff72963ffff2963ff003163ff083163ff103163ff193163ff213163ff293163ff313163ff3a3163ff423163ff4a3163ff523163ff5a3163ff633163ff6b3163ff733163ff7b3163ff843163ff8c3163ff943163ff9c3163ffa53163ffad3163ffb53163ffbd3163ffc53163ffce3163ffd63163ffde3163ffe63163ffef3163fff73163ffff3163ff003a63ff083a63ff103a63ff193a63ff213a63ff293a63ff313a63ff3a3a63ff423a63ff4a3a63ff523a63ff5a3a63ff633a63ff6b3a63ff733a63ff7b3a63ff843a63ff8c3a63ff943a63ff9c3a63ffa53a63ffad3a63ffb53a63ffbd3a63ffc53a63ffce3a63ffd63a63ffde3a63ffe63a63ffef3a63fff73a63ffff3a63ff004263ff084263ff104263ff194263ff214263ff294263ff314263ff3a4263ff424263ff4a4263ff524263ff5a4263ff634263ff6b4263ff734263ff7b4263ff844263ff8c4263ff944263ff9c4263ffa54263ffad4263ffb54263ffbd4263ffc54263ffce4263ffd64263ffde4263ffe64263ffef4263fff74263ffff4263ff004a63ff084a63ff104a63ff194a63ff214a63ff294a63ff314a63ff3a4a63ff424a63ff4a4a63ff524a63ff5a4a63ff634a63ff6b4a63ff734a63ff7b4a63ff844a63ff8c4a63ff944a63ff9c4a63ffa54a63ffad4a63ffb54a63ffbd4a63ffc54a63ffce4a63ffd64a63ffde4a63ffe64a63ffef4a63fff74a63ffff4a63ff005263ff085263ff105263ff195263ff215263ff295263ff315263ff3a5263ff425263ff4a5263ff525263ff5a5263ff635263ff6b5263ff735263ff7b5263ff845263ff8c5263ff945263ff9c5263ffa55263ffad5263ffb55263ffbd5263ffc55263ffce5263ffd65263ffde5263ffe65263ffef5263fff75263ffff5263ff005a63ff085a63ff105a63ff195a63ff215a63ff295a63ff315a63ff3a5a63ff425a63ff4a5a63ff525a63ff5a5a63ff635a63ff6b5a63ff735a63ff7b5a63ff845a63ff8c5a63ff945a63ff9c5a63ffa55a63ffad5a63ffb55a63ffbd5a63ffc55a63ffce5a63ffd65a63ffde5a63ffe65a63ffef5a63fff75a63ffff5a63ff006363ff086363ff106363ff196363ff216363ff296363ff316363ff3a6363ff426363ff4a6363ff526363ff5a6363ff636363ff6b6363ff736363ff7b6363ff846363ff8c6363ff946363ff9c6363ffa56363ffad6363ffb56363ffbd6363ffc56363ffce6363ffd66363ffde6363ffe66363ffef6363fff76363ffff6363ff006b63ff086b63ff106b63ff196b63ff216b63ff296b63ff316b63ff3a6b63ff426b63ff4a6b63ff526b63ff5a6b63ff636b63ff6b6b63ff736b63ff7b6b63ff846b63ff8c6b63ff946b63ff9c6b63ffa56b63ffad6b63ffb56b63ffbd6b63ffc56b63ffce6b63ffd66b63ffde6b63ffe66b63ffef6b63fff76b63ffff6b63ff007363ff087363ff107363ff197363ff217363ff297363ff317363ff3a7363ff427363ff4a7363ff527363ff5a7363ff637363ff6b7363ff737363ff7b7363ff847363ff8c7363ff947363ff9c7363ffa57363ffad7363ffb57363ffbd7363ffc57363ffce7363ffd67363ffde7363ffe67363ffef7363fff77363ffff7363ff007b63ff087b63ff107b63ff197b63ff217b63ff297b63ff317b63ff3a7b63ff427b63ff4a7b63ff527b63ff5a7b63ff637b63ff6b7b63ff737b63ff7b7b63ff847b63ff8c7b63ff947b63ff9c7b63ffa57b63ffad7b63ffb57b63ffbd7b63ffc57b63ffce7b63ffd67b63ffde7b63ffe67b63ffef7b63fff77b63ffff7b63ff008463ff088463ff108463ff198463ff218463ff298463ff318463ff3a8463ff428463ff4a8463ff528463ff5a8463ff638463ff6b8463ff738463ff7b8463ff848463ff8c8463ff948463ff9c8463ffa58463ffad8463ffb58463ffbd8463ffc58463ffce8463ffd68463ffde8463ffe68463ffef8463fff78463ffff8463ff008c63ff088c63ff108c63ff198c63ff218c63ff298c63ff318c63ff3a8c63ff428c63ff4a8c63ff528c63ff5a8c63ff638c63ff6b8c63ff738c63ff7b8c63ff848c63ff8c8c63ff948c63ff9c8c63ffa58c63ffad8c63ffb58c63ffbd8c63ffc58c63ffce8c63ffd68c63ffde8c63ffe68c63ffef8c63fff78c63ffff8c63ff009463ff089463ff109463ff199463ff219463ff299463ff319463ff3a9463ff429463ff4a9463ff529463ff5a9463ff639463ff6b9463ff739463ff7b9463ff849463ff8c9463ff949463ff9c9463ffa59463ffad9463ffb59463ffbd9463ffc59463ffce9463ffd69463ffde9463ffe69463ffef9463fff79463ffff9463ff009c63ff089c63ff109c63ff199c63ff219c63ff299c63ff319c63ff3a9c63ff429c63ff4a9c63ff529c63ff5a9c63ff639c63ff6b9c63ff739c63ff7b9c63ff849c63ff8c9c63ff949c63ff9c9c63ffa59c63ffad9c63ffb59c63ffbd9c63ffc59c63ffce9c63ffd69c63ffde9c63ffe69c63ffef9c63fff79c63ffff9c63ff00a563ff08a563ff10a563ff19a563ff21a563ff29a563ff31a563ff3aa563ff42a563ff4aa563ff52a563ff5aa563ff63a563ff6ba563ff73a563ff7ba563ff84a563ff8ca563ff94a563ff9ca563ffa5a563ffada563ffb5a563ffbda563ffc5a563ffcea563ffd6a563ffdea563ffe6a563ffefa563fff7a563ffffa563ff00ad63ff08ad63ff10ad63ff19ad63ff21ad63ff29ad63ff31ad63ff3aad63ff42ad63ff4aad63ff52ad63ff5aad63ff63ad63ff6bad63ff73ad63ff7bad63ff84ad63ff8cad63ff94ad63ff9cad63ffa5ad63ffadad63ffb5ad63ffbdad63ffc5ad63ffcead63ffd6ad63ffdead63ffe6ad63ffefad63fff7ad63ffffad63ff00b563ff08b563ff10b563ff19b563ff21b563ff29b563ff31b563ff3ab563ff42b563ff4ab563ff52b563ff5ab563ff63b563ff6bb563ff73b563ff7bb563ff84b563ff8cb563ff94b563ff9cb563ffa5b563ffadb563ffb5b563ffbdb563ffc5b563ffceb563ffd6b563ffdeb563ffe6b563ffefb563fff7b563ffffb563ff00bd63ff08bd63ff10bd63ff19bd63ff21bd63ff29bd63ff31bd63ff3abd63ff42bd63ff4abd63ff52bd63ff5abd63ff63bd63ff6bbd63ff73bd63ff7bbd63ff84bd63ff8cbd63ff94bd63ff9cbd63ffa5bd63ffadbd63ffb5bd63ffbdbd63ffc5bd63ffcebd63ffd6bd63ffdebd63ffe6bd63ffefbd63fff7bd63ffffbd63ff00c563ff08c563ff10c563ff19c563ff21c563ff29c563ff31c563ff3ac563ff42c563ff4ac563ff52c563ff5ac563ff63c563ff6bc563ff73c563ff7bc563ff84c563ff8cc563ff94c563ff9cc563ffa5c563ffadc563ffb5c563ffbdc563ffc5c563ffcec563ffd6c563ffdec563ffe6c563ffefc563fff7c563ffffc563ff00ce63ff08ce63ff10ce63ff19ce63ff21ce63ff29ce63ff31ce63ff3ace63ff42ce63ff4ace63ff52ce63ff5ace63ff63ce63ff6bce63ff73ce63ff7bce63ff84ce63ff8cce63ff94ce63ff9cce63ffa5ce63ffadce63ffb5ce63ffbdce63ffc5ce63ffcece63ffd6ce63ffdece63ffe6ce63ffefce63fff7ce63ffffce63ff00d663ff08d663ff10d663ff19d663ff21d663ff29d663ff31d663ff3ad663ff42d663ff4ad663ff52d663ff5ad663ff63d663ff6bd663ff73d663ff7bd663ff84d663ff8cd663ff94d663ff9cd663ffa5d663ffadd663ffb5d663ffbdd663ffc5d663ffced663ffd6d663ffded663ffe6d663ffefd663fff7d663ffffd663ff00de63ff08de63ff10de63ff19de63ff21de63ff29de63ff31de63ff3ade63ff42de63ff4ade63ff52de63ff5ade63ff63de63ff6bde63ff73de63ff7bde63ff84de63ff8cde63ff94de63ff9cde63ffa5de63ffadde63ffb5de63ffbdde63ffc5de63ffcede63ffd6de63ffdede63ffe6de63ffefde63fff7de63ffffde63ff00e663ff08e663ff10e663ff19e663ff21e663ff29e663ff31e663ff3ae663ff42e663ff4ae663ff52e663ff5ae663ff63e663ff6be663ff73e663ff7be663ff84e663ff8ce663ff94e663ff9ce663ffa5e663ffade663ffb5e663ffbde663ffc5e663ffcee663ffd6e663ffdee663ffe6e663ffefe663fff7e663ffffe663ff00ef63ff08ef63ff10ef63ff19ef63ff21ef63ff29ef63ff31ef63ff3aef63ff42ef63ff4aef63ff52ef63ff5aef63ff63ef63ff6bef63ff73ef63ff7bef63ff84ef63ff8cef63ff94ef63ff9cef63ffa5ef63ffadef63ffb5ef63ffbdef63ffc5ef63ffceef63ffd6ef63ffdeef63ffe6ef63ffefef63fff7ef63ffffef63ff00f763ff08f763ff10f763ff19f763ff21f763ff29f763ff31f763ff3af763ff42f763ff4af763ff52f763ff5af763ff63f763ff6bf763ff73f763ff7bf763ff84f763ff8cf763ff94f763ff9cf763ffa5f763ffadf763ffb5f763ffbdf763ffc5f763ffcef763ffd6f763ffdef763ffe6f763ffeff763fff7f763fffff763ff00ff63ff08ff63ff10ff63ff19ff63ff21ff63ff29ff63ff31ff63ff3aff63ff42ff63ff4aff63ff52ff63ff5aff63ff63ff63ff6bff63ff73ff63ff7bff63ff84ff63ff8cff63ff94ff63ff9cff63ffa5ff63ffadff63ffb5ff63ffbdff63ffc5ff63ffceff63ffd6ff63ffdeff63ffe6ff63ffefff63fff7ff63ffffff63ff00006bff08006bff10006bff19006bff21006bff29006bff31006bff3a006bff42006bff4a006bff52006bff5a006bff63006bff6b006bff73006bff7b006bff84006bff8c006bff94006bff9c006bffa5006bffad006bffb5006bffbd006bffc5006bffce006bffd6006bffde006bffe6006bffef006bfff7006bffff006bff00086bff08086bff10086bff19086bff21086bff29086bff31086bff3a086bff42086bff4a086bff52086bff5a086bff63086bff6b086bff73086bff7b086bff84086bff8c086bff94086bff9c086bffa5086bffad086bffb5086bffbd086bffc5086bffce086bffd6086bffde086bffe6086bffef086bfff7086bffff086bff00106bff08106bff10106bff19106bff21106bff29106bff31106bff3a106bff42106bff4a106bff52106bff5a106bff63106bff6b106bff73106bff7b106bff84106bff8c106bff94106bff9c106bffa5106bffad106bffb5106bffbd106bffc5106bffce106bffd6106bffde106bffe6106bffef106bfff7106bffff106bff00196bff08196bff10196bff19196bff21196bff29196bff31196bff3a196bff42196bff4a196bff52196bff5a196bff63196bff6b196bff73196bff7b196bff84196bff8c196bff94196bff9c196bffa5196bffad196bffb5196bffbd196bffc5196bffce196bffd6196bffde196bffe6196bffef196bfff7196bffff196bff00216bff08216bff10216bff19216bff21216bff29216bff31216bff3a216bff42216bff4a216bff52216bff5a216bff63216bff6b216bff73216bff7b216bff84216bff8c216bff94216bff9c216bffa5216bffad216bffb5216bffbd216bffc5216bffce216bffd6216bffde216bffe6216bffef216bfff7216bffff216bff00296bff08296bff10296bff19296bff21296bff29296bff31296bff3a296bff42296bff4a296bff52296bff5a296bff63296bff6b296bff73296bff7b296bff84296bff8c296bff94296bff9c296bffa5296bffad296bffb5296bffbd296bffc5296bffce296bffd6296bffde296bffe6296bffef296bfff7296bffff296bff00316bff08316bff10316bff19316bff21316bff29316bff31316bff3a316bff42316bff4a316bff52316bff5a316bff63316bff6b316bff73316bff7b316bff84316bff8c316bff94316bff9c316bffa5316bffad316bffb5316bffbd316bffc5316bffce316bffd6316bffde316bffe6316bffef316bfff7316bffff316bff003a6bff083a6bff103a6bff193a6bff213a6bff293a6bff313a6bff3a3a6bff423a6bff4a3a6bff523a6bff5a3a6bff633a6bff6b3a6bff733a6bff7b3a6bff843a6bff8c3a6bff943a6bff9c3a6bffa53a6bffad3a6bffb53a6bffbd3a6bffc53a6bffce3a6bffd63a6bffde3a6bffe63a6bffef3a6bfff73a6bffff3a6bff00426bff08426bff10426bff19426bff21426bff29426bff31426bff3a426bff42426bff4a426bff52426bff5a426bff63426bff6b426bff73426bff7b426bff84426bff8c426bff94426bff9c426bffa5426bffad426bffb5426bffbd426bffc5426bffce426bffd6426bffde426bffe6426bffef426bfff7426bffff426bff004a6bff084a6bff104a6bff194a6bff214a6bff294a6bff314a6bff3a4a6bff424a6bff4a4a6bff524a6bff5a4a6bff634a6bff6b4a6bff734a6bff7b4a6bff844a6bff8c4a6bff944a6bff9c4a6bffa54a6bffad4a6bffb54a6bffbd4a6bffc54a6bffce4a6bffd64a6bffde4a6bffe64a6bffef4a6bfff74a6bffff4a6bff00526bff08526bff10526bff19526bff21526bff29526bff31526bff3a526bff42526bff4a526bff52526bff5a526bff63526bff6b526bff73526bff7b526bff84526bff8c526bff94526bff9c526bffa5526bffad526bffb5526bffbd526bffc5526bffce526bffd6526bffde526bffe6526bffef526bfff7526bffff526bff005a6bff085a6bff105a6bff195a6bff215a6bff295a6bff315a6bff3a5a6bff425a6bff4a5a6bff525a6bff5a5a6bff635a6bff6b5a6bff735a6bff7b5a6bff845a6bff8c5a6bff945a6bff9c5a6bffa55a6bffad5a6bffb55a6bffbd5a6bffc55a6bffce5a6bffd65a6bffde5a6bffe65a6bffef5a6bfff75a6bffff5a6bff00636bff08636bff10636bff19636bff21636bff29636bff31636bff3a636bff42636bff4a636bff52636bff5a636bff63636bff6b636bff73636bff7b636bff84636bff8c636bff94636bff9c636bffa5636bffad636bffb5636bffbd636bffc5636bffce636bffd6636bffde636bffe6636bffef636bfff7636bffff636bff006b6bff086b6bff106b6bff196b6bff216b6bff296b6bff316b6bff3a6b6bff426b6bff4a6b6bff526b6bff5a6b6bff636b6bff6b6b6bff736b6bff7b6b6bff846b6bff8c6b6bff946b6bff9c6b6bffa56b6bffad6b6bffb56b6bffbd6b6bffc56b6bffce6b6bffd66b6bffde6b6bffe66b6bffef6b6bfff76b6bffff6b6bff00736bff08736bff10736bff19736bff21736bff29736bff31736bff3a736bff42736bff4a736bff52736bff5a736bff63736bff6b736bff73736bff7b736bff84736bff8c736bff94736bff9c736bffa5736bffad736bffb5736bffbd736bffc5736bffce736bffd6736bffde736bffe6736bffef736bfff7736bffff736bff007b6bff087b6bff107b6bff197b6bff217b6bff297b6bff317b6bff3a7b6bff427b6bff4a7b6bff527b6bff5a7b6bff637b6bff6b7b6bff737b6bff7b7b6bff847b6bff8c7b6bff947b6bff9c7b6bffa57b6bffad7b6bffb57b6bffbd7b6bffc57b6bffce7b6bffd67b6bffde7b6bffe67b6bffef7b6bfff77b6bffff7b6bff00846bff08846bff10846bff19846bff21846bff29846bff31846bff3a846bff42846bff4a846bff52846bff5a846bff63846bff6b846bff73846bff7b846bff84846bff8c846bff94846bff9c846bffa5846bffad846bffb5846bffbd846bffc5846bffce846bffd6846bffde846bffe6846bffef846bfff7846bffff846bff008c6bff088c6bff108c6bff198c6bff218c6bff298c6bff318c6bff3a8c6bff428c6bff4a8c6bff528c6bff5a8c6bff638c6bff6b8c6bff738c6bff7b8c6bff848c6bff8c8c6bff948c6bff9c8c6bffa58c6bffad8c6bffb58c6bffbd8c6bffc58c6bffce8c6bffd68c6bffde8c6bffe68c6bffef8c6bfff78c6bffff8c6bff00946bff08946bff10946bff19946bff21946bff29946bff31946bff3a946bff42946bff4a946bff52946bff5a946bff63946bff6b946bff73946bff7b946bff84946bff8c946bff94946bff9c946bffa5946bffad946bffb5946bffbd946bffc5946bffce946bffd6946bffde946bffe6946bffef946bfff7946bffff946bff009c6bff089c6bff109c6bff199c6bff219c6bff299c6bff319c6bff3a9c6bff429c6bff4a9c6bff529c6bff5a9c6bff639c6bff6b9c6bff739c6bff7b9c6bff849c6bff8c9c6bff949c6bff9c9c6bffa59c6bffad9c6bffb59c6bffbd9c6bffc59c6bffce9c6bffd69c6bffde9c6bffe69c6bffef9c6bfff79c6bffff9c6bff00a56bff08a56bff10a56bff19a56bff21a56bff29a56bff31a56bff3aa56bff42a56bff4aa56bff52a56bff5aa56bff63a56bff6ba56bff73a56bff7ba56bff84a56bff8ca56bff94a56bff9ca56bffa5a56bffada56bffb5a56bffbda56bffc5a56bffcea56bffd6a56bffdea56bffe6a56bffefa56bfff7a56bffffa56bff00ad6bff08ad6bff10ad6bff19ad6bff21ad6bff29ad6bff31ad6bff3aad6bff42ad6bff4aad6bff52ad6bff5aad6bff63ad6bff6bad6bff73ad6bff7bad6bff84ad6bff8cad6bff94ad6bff9cad6bffa5ad6bffadad6bffb5ad6bffbdad6bffc5ad6bffcead6bffd6ad6bffdead6bffe6ad6bffefad6bfff7ad6bffffad6bff00b56bff08b56bff10b56bff19b56bff21b56bff29b56bff31b56bff3ab56bff42b56bff4ab56bff52b56bff5ab56bff63b56bff6bb56bff73b56bff7bb56bff84b56bff8cb56bff94b56bff9cb56bffa5b56bffadb56bffb5b56bffbdb56bffc5b56bffceb56bffd6b56bffdeb56bffe6b56bffefb56bfff7b56bffffb56bff00bd6bff08bd6bff10bd6bff19bd6bff21bd6bff29bd6bff31bd6bff3abd6bff42bd6bff4abd6bff52bd6bff5abd6bff63bd6bff6bbd6bff73bd6bff7bbd6bff84bd6bff8cbd6bff94bd6bff9cbd6bffa5bd6bffadbd6bffb5bd6bffbdbd6bffc5bd6bffcebd6bffd6bd6bffdebd6bffe6bd6bffefbd6bfff7bd6bffffbd6bff00c56bff08c56bff10c56bff19c56bff21c56bff29c56bff31c56bff3ac56bff42c56bff4ac56bff52c56bff5ac56bff63c56bff6bc56bff73c56bff7bc56bff84c56bff8cc56bff94c56bff9cc56bffa5c56bffadc56bffb5c56bffbdc56bffc5c56bffcec56bffd6c56bffdec56bffe6c56bffefc56bfff7c56bffffc56bff00ce6bff08ce6bff10ce6bff19ce6bff21ce6bff29ce6bff31ce6bff3ace6bff42ce6bff4ace6bff52ce6bff5ace6bff63ce6bff6bce6bff73ce6bff7bce6bff84ce6bff8cce6bff94ce6bff9cce6bffa5ce6bffadce6bffb5ce6bffbdce6bffc5ce6bffcece6bffd6ce6bffdece6bffe6ce6bffefce6bfff7ce6bffffce6bff00d66bff08d66bff10d66bff19d66bff21d66bff29d66bff31d66bff3ad66bff42d66bff4ad66bff52d66bff5ad66bff63d66bff6bd66bff73d66bff7bd66bff84d66bff8cd66bff94d66bff9cd66bffa5d66bffadd66bffb5d66bffbdd66bffc5d66bffced66bffd6d66bffded66bffe6d66bffefd66bfff7d66bffffd66bff00de6bff08de6bff10de6bff19de6bff21de6bff29de6bff31de6bff3ade6bff42de6bff4ade6bff52de6bff5ade6bff63de6bff6bde6bff73de6bff7bde6bff84de6bff8cde6bff94de6bff9cde6bffa5de6bffadde6bffb5de6bffbdde6bffc5de6bffcede6bffd6de6bffdede6bffe6de6bffefde6bfff7de6bffffde6bff00e66bff08e66bff10e66bff19e66bff21e66bff29e66bff31e66bff3ae66bff42e66bff4ae66bff52e66bff5ae66bff63e66bff6be66bff73e66bff7be66bff84e66bff8ce66bff94e66bff9ce66bffa5e66bffade66bffb5e66bffbde66bffc5e66bffcee66bffd6e66bffdee66bffe6e66bffefe66bfff7e66bffffe66bff00ef6bff08ef6bff10ef6bff19ef6bff21ef6bff29ef6bff31ef6bff3aef6bff42ef6bff4aef6bff52ef6bff5aef6bff63ef6bff6bef6bff73ef6bff7bef6bff84ef6bff8cef6bff94ef6bff9cef6bffa5ef6bffadef6bffb5ef6bffbdef6bffc5ef6bffceef6bffd6ef6bffdeef6bffe6ef6bffefef6bfff7ef6bffffef6bff00f76bff08f76bff10f76bff19f76bff21f76bff29f76bff31f76bff3af76bff42f76bff4af76bff52f76bff5af76bff63f76bff6bf76bff73f76bff7bf76bff84f76bff8cf76bff94f76bff9cf76bffa5f76bffadf76bffb5f76bffbdf76bffc5f76bffcef76bffd6f76bffdef76bffe6f76bffeff76bfff7f76bfffff76bff00ff6bff08ff6bff10ff6bff19ff6bff21ff6bff29ff6bff31ff6bff3aff6bff42ff6bff4aff6bff52ff6bff5aff6bff63ff6bff6bff6bff73ff6bff7bff6bff84ff6bff8cff6bff94ff6bff9cff6bffa5ff6bffadff6bffb5ff6bffbdff6bffc5ff6bffceff6bffd6ff6bffdeff6bffe6ff6bffefff6bfff7ff6bffffff6bff000073ff080073ff100073ff190073ff210073ff290073ff310073ff3a0073ff420073ff4a0073ff520073ff5a0073ff630073ff6b0073ff730073ff7b0073ff840073ff8c0073ff940073ff9c0073ffa50073ffad0073ffb50073ffbd0073ffc50073ffce0073ffd60073ffde0073ffe60073ffef0073fff70073ffff0073ff000873ff080873ff100873ff190873ff210873ff290873ff310873ff3a0873ff420873ff4a0873ff520873ff5a0873ff630873ff6b0873ff730873ff7b0873ff840873ff8c0873ff940873ff9c0873ffa50873ffad0873ffb50873ffbd0873ffc50873ffce0873ffd60873ffde0873ffe60873ffef0873fff70873ffff0873ff001073ff081073ff101073ff191073ff211073ff291073ff311073ff3a1073ff421073ff4a1073ff521073ff5a1073ff631073ff6b1073ff731073ff7b1073ff841073ff8c1073ff941073ff9c1073ffa51073ffad1073ffb51073ffbd1073ffc51073ffce1073ffd61073ffde1073ffe61073ffef1073fff71073ffff1073ff001973ff081973ff101973ff191973ff211973ff291973ff311973ff3a1973ff421973ff4a1973ff521973ff5a1973ff631973ff6b1973ff731973ff7b1973ff841973ff8c1973ff941973ff9c1973ffa51973ffad1973ffb51973ffbd1973ffc51973ffce1973ffd61973ffde1973ffe61973ffef1973fff71973ffff1973ff002173ff082173ff102173ff192173ff212173ff292173ff312173ff3a2173ff422173ff4a2173ff522173ff5a2173ff632173ff6b2173ff732173ff7b2173ff842173ff8c2173ff942173ff9c2173ffa52173ffad2173ffb52173ffbd2173ffc52173ffce2173ffd62173ffde2173ffe62173ffef2173fff72173ffff2173ff002973ff082973ff102973ff192973ff212973ff292973ff312973ff3a2973ff422973ff4a2973ff522973ff5a2973ff632973ff6b2973ff732973ff7b2973ff842973ff8c2973ff942973ff9c2973ffa52973ffad2973ffb52973ffbd2973ffc52973ffce2973ffd62973ffde2973ffe62973ffef2973fff72973ffff2973ff003173ff083173ff103173ff193173ff213173ff293173ff313173ff3a3173ff423173ff4a3173ff523173ff5a3173ff633173ff6b3173ff733173ff7b3173ff843173ff8c3173ff943173ff9c3173ffa53173ffad3173ffb53173ffbd3173ffc53173ffce3173ffd63173ffde3173ffe63173ffef3173fff73173ffff3173ff003a73ff083a73ff103a73ff193a73ff213a73ff293a73ff313a73ff3a3a73ff423a73ff4a3a73ff523a73ff5a3a73ff633a73ff6b3a73ff733a73ff7b3a73ff843a73ff8c3a73ff943a73ff9c3a73ffa53a73ffad3a73ffb53a73ffbd3a73ffc53a73ffce3a73ffd63a73ffde3a73ffe63a73ffef3a73fff73a73ffff3a73ff004273ff084273ff104273ff194273ff214273ff294273ff314273ff3a4273ff424273ff4a4273ff524273ff5a4273ff634273ff6b4273ff734273ff7b4273ff844273ff8c4273ff944273ff9c4273ffa54273ffad4273ffb54273ffbd4273ffc54273ffce4273ffd64273ffde4273ffe64273ffef4273fff74273ffff4273ff004a73ff084a73ff104a73ff194a73ff214a73ff294a73ff314a73ff3a4a73ff424a73ff4a4a73ff524a73ff5a4a73ff634a73ff6b4a73ff734a73ff7b4a73ff844a73ff8c4a73ff944a73ff9c4a73ffa54a73ffad4a73ffb54a73ffbd4a73ffc54a73ffce4a73ffd64a73ffde4a73ffe64a73ffef4a73fff74a73ffff4a73ff005273ff085273ff105273ff195273ff215273ff295273ff315273ff3a5273ff425273ff4a5273ff525273ff5a5273ff635273ff6b5273ff735273ff7b5273ff845273ff8c5273ff945273ff9c5273ffa55273ffad5273ffb55273ffbd5273ffc55273ffce5273ffd65273ffde5273ffe65273ffef5273fff75273ffff5273ff005a73ff085a73ff105a73ff195a73ff215a73ff295a73ff315a73ff3a5a73ff425a73ff4a5a73ff525a73ff5a5a73ff635a73ff6b5a73ff735a73ff7b5a73ff845a73ff8c5a73ff945a73ff9c5a73ffa55a73ffad5a73ffb55a73ffbd5a73ffc55a73ffce5a73ffd65a73ffde5a73ffe65a73ffef5a73fff75a73ffff5a73ff006373ff086373ff106373ff196373ff216373ff296373ff316373ff3a6373ff426373ff4a6373ff526373ff5a6373ff636373ff6b6373ff736373ff7b6373ff846373ff8c6373ff946373ff9c6373ffa56373ffad6373ffb56373ffbd6373ffc56373ffce6373ffd66373ffde6373ffe66373ffef6373fff76373ffff6373ff006b73ff086b73ff106b73ff196b73ff216b73ff296b73ff316b73ff3a6b73ff426b73ff4a6b73ff526b73ff5a6b73ff636b73ff6b6b73ff736b73ff7b6b73ff846b73ff8c6b73ff946b73ff9c6b73ffa56b73ffad6b73ffb56b73ffbd6b73ffc56b73ffce6b73ffd66b73ffde6b73ffe66b73ffef6b73fff76b73ffff6b73ff007373ff087373ff107373ff197373ff217373ff297373ff317373ff3a7373ff427373ff4a7373ff527373ff5a7373ff637373ff6b7373ff737373ff7b7373ff847373ff8c7373ff947373ff9c7373ffa57373ffad7373ffb57373ffbd7373ffc57373ffce7373ffd67373ffde7373ffe67373ffef7373fff77373ffff7373ff007b73ff087b73ff107b73ff197b73ff217b73ff297b73ff317b73ff3a7b73ff427b73ff4a7b73ff527b73ff5a7b73ff637b73ff6b7b73ff737b73ff7b7b73ff847b73ff8c7b73ff947b73ff9c7b73ffa57b73ffad7b73ffb57b73ffbd7b73ffc57b73ffce7b73ffd67b73ffde7b73ffe67b73ffef7b73fff77b73ffff7b73ff008473ff088473ff108473ff198473ff218473ff298473ff318473ff3a8473ff428473ff4a8473ff528473ff5a8473ff638473ff6b8473ff738473ff7b8473ff848473ff8c8473ff948473ff9c8473ffa58473ffad8473ffb58473ffbd8473ffc58473ffce8473ffd68473ffde8473ffe68473ffef8473fff78473ffff8473ff008c73ff088c73ff108c73ff198c73ff218c73ff298c73ff318c73ff3a8c73ff428c73ff4a8c73ff528c73ff5a8c73ff638c73ff6b8c73ff738c73ff7b8c73ff848c73ff8c8c73ff948c73ff9c8c73ffa58c73ffad8c73ffb58c73ffbd8c73ffc58c73ffce8c73ffd68c73ffde8c73ffe68c73ffef8c73fff78c73ffff8c73ff009473ff089473ff109473ff199473ff219473ff299473ff319473ff3a9473ff429473ff4a9473ff529473ff5a9473ff639473ff6b9473ff739473ff7b9473ff849473ff8c9473ff949473ff9c9473ffa59473ffad9473ffb59473ffbd9473ffc59473ffce9473ffd69473ffde9473ffe69473ffef9473fff79473ffff9473ff009c73ff089c73ff109c73ff199c73ff219c73ff299c73ff319c73ff3a9c73ff429c73ff4a9c73ff529c73ff5a9c73ff639c73ff6b9c73ff739c73ff7b9c73ff849c73ff8c9c73ff949c73ff9c9c73ffa59c73ffad9c73ffb59c73ffbd9c73ffc59c73ffce9c73ffd69c73ffde9c73ffe69c73ffef9c73fff79c73ffff9c73ff00a573ff08a573ff10a573ff19a573ff21a573ff29a573ff31a573ff3aa573ff42a573ff4aa573ff52a573ff5aa573ff63a573ff6ba573ff73a573ff7ba573ff84a573ff8ca573ff94a573ff9ca573ffa5a573ffada573ffb5a573ffbda573ffc5a573ffcea573ffd6a573ffdea573ffe6a573ffefa573fff7a573ffffa573ff00ad73ff08ad73ff10ad73ff19ad73ff21ad73ff29ad73ff31ad73ff3aad73ff42ad73ff4aad73ff52ad73ff5aad73ff63ad73ff6bad73ff73ad73ff7bad73ff84ad73ff8cad73ff94ad73ff9cad73ffa5ad73ffadad73ffb5ad73ffbdad73ffc5ad73ffcead73ffd6ad73ffdead73ffe6ad73ffefad73fff7ad73ffffad73ff00b573ff08b573ff10b573ff19b573ff21b573ff29b573ff31b573ff3ab573ff42b573ff4ab573ff52b573ff5ab573ff63b573ff6bb573ff73b573ff7bb573ff84b573ff8cb573ff94b573ff9cb573ffa5b573ffadb573ffb5b573ffbdb573ffc5b573ffceb573ffd6b573ffdeb573ffe6b573ffefb573fff7b573ffffb573ff00bd73ff08bd73ff10bd73ff19bd73ff21bd73ff29bd73ff31bd73ff3abd73ff42bd73ff4abd73ff52bd73ff5abd73ff63bd73ff6bbd73ff73bd73ff7bbd73ff84bd73ff8cbd73ff94bd73ff9cbd73ffa5bd73ffadbd73ffb5bd73ffbdbd73ffc5bd73ffcebd73ffd6bd73ffdebd73ffe6bd73ffefbd73fff7bd73ffffbd73ff00c573ff08c573ff10c573ff19c573ff21c573ff29c573ff31c573ff3ac573ff42c573ff4ac573ff52c573ff5ac573ff63c573ff6bc573ff73c573ff7bc573ff84c573ff8cc573ff94c573ff9cc573ffa5c573ffadc573ffb5c573ffbdc573ffc5c573ffcec573ffd6c573ffdec573ffe6c573ffefc573fff7c573ffffc573ff00ce73ff08ce73ff10ce73ff19ce73ff21ce73ff29ce73ff31ce73ff3ace73ff42ce73ff4ace73ff52ce73ff5ace73ff63ce73ff6bce73ff73ce73ff7bce73ff84ce73ff8cce73ff94ce73ff9cce73ffa5ce73ffadce73ffb5ce73ffbdce73ffc5ce73ffcece73ffd6ce73ffdece73ffe6ce73ffefce73fff7ce73ffffce73ff00d673ff08d673ff10d673ff19d673ff21d673ff29d673ff31d673ff3ad673ff42d673ff4ad673ff52d673ff5ad673ff63d673ff6bd673ff73d673ff7bd673ff84d673ff8cd673ff94d673ff9cd673ffa5d673ffadd673ffb5d673ffbdd673ffc5d673ffced673ffd6d673ffded673ffe6d673ffefd673fff7d673ffffd673ff00de73ff08de73ff10de73ff19de73ff21de73ff29de73ff31de73ff3ade73ff42de73ff4ade73ff52de73ff5ade73ff63de73ff6bde73ff73de73ff7bde73ff84de73ff8cde73ff94de73ff9cde73ffa5de73ffadde73ffb5de73ffbdde73ffc5de73ffcede73ffd6de73ffdede73ffe6de73ffefde73fff7de73ffffde73ff00e673ff08e673ff10e673ff19e673ff21e673ff29e673ff31e673ff3ae673ff42e673ff4ae673ff52e673ff5ae673ff63e673ff6be673ff73e673ff7be673ff84e673ff8ce673ff94e673ff9ce673ffa5e673ffade673ffb5e673ffbde673ffc5e673ffcee673ffd6e673ffdee673ffe6e673ffefe673fff7e673ffffe673ff00ef73ff08ef73ff10ef73ff19ef73ff21ef73ff29ef73ff31ef73ff3aef73ff42ef73ff4aef73ff52ef73ff5aef73ff63ef73ff6bef73ff73ef73ff7bef73ff84ef73ff8cef73ff94ef73ff9cef73ffa5ef73ffadef73ffb5ef73ffbdef73ffc5ef73ffceef73ffd6ef73ffdeef73ffe6ef73ffefef73fff7ef73ffffef73ff00f773ff08f773ff10f773ff19f773ff21f773ff29f773ff31f773ff3af773ff42f773ff4af773ff52f773ff5af773ff63f773ff6bf773ff73f773ff7bf773ff84f773ff8cf773ff94f773ff9cf773ffa5f773ffadf773ffb5f773ffbdf773ffc5f773ffcef773ffd6f773ffdef773ffe6f773ffeff773fff7f773fffff773ff00ff73ff08ff73ff10ff73ff19ff73ff21ff73ff29ff73ff31ff73ff3aff73ff42ff73ff4aff73ff52ff73ff5aff73ff63ff73ff6bff73ff73ff73ff7bff73ff84ff73ff8cff73ff94ff73ff9cff73ffa5ff73ffadff73ffb5ff73ffbdff73ffc5ff73ffceff73ffd6ff73ffdeff73ffe6ff73ffefff73fff7ff73ffffff73ff00007bff08007bff10007bff19007bff21007bff29007bff31007bff3a007bff42007bff4a007bff52007bff5a007bff63007bff6b007bff73007bff7b007bff84007bff8c007bff94007bff9c007bffa5007bffad007bffb5007bffbd007bffc5007bffce007bffd6007bffde007bffe6007bffef007bfff7007bffff007bff00087bff08087bff10087bff19087bff21087bff29087bff31087bff3a087bff42087bff4a087bff52087bff5a087bff63087bff6b087bff73087bff7b087bff84087bff8c087bff94087bff9c087bffa5087bffad087bffb5087bffbd087bffc5087bffce087bffd6087bffde087bffe6087bffef087bfff7087bffff087bff00107bff08107bff10107bff19107bff21107bff29107bff31107bff3a107bff42107bff4a107bff52107bff5a107bff63107bff6b107bff73107bff7b107bff84107bff8c107bff94107bff9c107bffa5107bffad107bffb5107bffbd107bffc5107bffce107bffd6107bffde107bffe6107bffef107bfff7107bffff107bff00197bff08197bff10197bff19197bff21197bff29197bff31197bff3a197bff42197bff4a197bff52197bff5a197bff63197bff6b197bff73197bff7b197bff84197bff8c197bff94197bff9c197bffa5197bffad197bffb5197bffbd197bffc5197bffce197bffd6197bffde197bffe6197bffef197bfff7197bffff197bff00217bff08217bff10217bff19217bff21217bff29217bff31217bff3a217bff42217bff4a217bff52217bff5a217bff63217bff6b217bff73217bff7b217bff84217bff8c217bff94217bff9c217bffa5217bffad217bffb5217bffbd217bffc5217bffce217bffd6217bffde217bffe6217bffef217bfff7217bffff217bff00297bff08297bff10297bff19297bff21297bff29297bff31297bff3a297bff42297bff4a297bff52297bff5a297bff63297bff6b297bff73297bff7b297bff84297bff8c297bff94297bff9c297bffa5297bffad297bffb5297bffbd297bffc5297bffce297bffd6297bffde297bffe6297bffef297bfff7297bffff297bff00317bff08317bff10317bff19317bff21317bff29317bff31317bff3a317bff42317bff4a317bff52317bff5a317bff63317bff6b317bff73317bff7b317bff84317bff8c317bff94317bff9c317bffa5317bffad317bffb5317bffbd317bffc5317bffce317bffd6317bffde317bffe6317bffef317bfff7317bffff317bff003a7bff083a7bff103a7bff193a7bff213a7bff293a7bff313a7bff3a3a7bff423a7bff4a3a7bff523a7bff5a3a7bff633a7bff6b3a7bff733a7bff7b3a7bff843a7bff8c3a7bff943a7bff9c3a7bffa53a7bffad3a7bffb53a7bffbd3a7bffc53a7bffce3a7bffd63a7bffde3a7bffe63a7bffef3a7bfff73a7bffff3a7bff00427bff08427bff10427bff19427bff21427bff29427bff31427bff3a427bff42427bff4a427bff52427bff5a427bff63427bff6b427bff73427bff7b427bff84427bff8c427bff94427bff9c427bffa5427bffad427bffb5427bffbd427bffc5427bffce427bffd6427bffde427bffe6427bffef427bfff7427bffff427bff004a7bff084a7bff104a7bff194a7bff214a7bff294a7bff314a7bff3a4a7bff424a7bff4a4a7bff524a7bff5a4a7bff634a7bff6b4a7bff734a7bff7b4a7bff844a7bff8c4a7bff944a7bff9c4a7bffa54a7bffad4a7bffb54a7bffbd4a7bffc54a7bffce4a7bffd64a7bffde4a7bffe64a7bffef4a7bfff74a7bffff4a7bff00527bff08527bff10527bff19527bff21527bff29527bff31527bff3a527bff42527bff4a527bff52527bff5a527bff63527bff6b527bff73527bff7b527bff84527bff8c527bff94527bff9c527bffa5527bffad527bffb5527bffbd527bffc5527bffce527bffd6527bffde527bffe6527bffef527bfff7527bffff527bff005a7bff085a7bff105a7bff195a7bff215a7bff295a7bff315a7bff3a5a7bff425a7bff4a5a7bff525a7bff5a5a7bff635a7bff6b5a7bff735a7bff7b5a7bff845a7bff8c5a7bff945a7bff9c5a7bffa55a7bffad5a7bffb55a7bffbd5a7bffc55a7bffce5a7bffd65a7bffde5a7bffe65a7bffef5a7bfff75a7bffff5a7bff00637bff08637bff10637bff19637bff21637bff29637bff31637bff3a637bff42637bff4a637bff52637bff5a637bff63637bff6b637bff73637bff7b637bff84637bff8c637bff94637bff9c637bffa5637bffad637bffb5637bffbd637bffc5637bffce637bffd6637bffde637bffe6637bffef637bfff7637bffff637bff006b7bff086b7bff106b7bff196b7bff216b7bff296b7bff316b7bff3a6b7bff426b7bff4a6b7bff526b7bff5a6b7bff636b7bff6b6b7bff736b7bff7b6b7bff846b7bff8c6b7bff946b7bff9c6b7bffa56b7bffad6b7bffb56b7bffbd6b7bffc56b7bffce6b7bffd66b7bffde6b7bffe66b7bffef6b7bfff76b7bffff6b7bff00737bff08737bff10737bff19737bff21737bff29737bff31737bff3a737bff42737bff4a737bff52737bff5a737bff63737bff6b737bff73737bff7b737bff84737bff8c737bff94737bff9c737bffa5737bffad737bffb5737bffbd737bffc5737bffce737bffd6737bffde737bffe6737bffef737bfff7737bffff737bff007b7bff087b7bff107b7bff197b7bff217b7bff297b7bff317b7bff3a7b7bff427b7bff4a7b7bff527b7bff5a7b7bff637b7bff6b7b7bff737b7bff7b7b7bff847b7bff8c7b7bff947b7bff9c7b7bffa57b7bffad7b7bffb57b7bffbd7b7bffc57b7bffce7b7bffd67b7bffde7b7bffe67b7bffef7b7bfff77b7bffff7b7bff00847bff08847bff10847bff19847bff21847bff29847bff31847bff3a847bff42847bff4a847bff52847bff5a847bff63847bff6b847bff73847bff7b847bff84847bff8c847bff94847bff9c847bffa5847bffad847bffb5847bffbd847bffc5847bffce847bffd6847bffde847bffe6847bffef847bfff7847bffff847bff008c7bff088c7bff108c7bff198c7bff218c7bff298c7bff318c7bff3a8c7bff428c7bff4a8c7bff528c7bff5a8c7bff638c7bff6b8c7bff738c7bff7b8c7bff848c7bff8c8c7bff948c7bff9c8c7bffa58c7bffad8c7bffb58c7bffbd8c7bffc58c7bffce8c7bffd68c7bffde8c7bffe68c7bffef8c7bfff78c7bffff8c7bff00947bff08947bff10947bff19947bff21947bff29947bff31947bff3a947bff42947bff4a947bff52947bff5a947bff63947bff6b947bff73947bff7b947bff84947bff8c947bff94947bff9c947bffa5947bffad947bffb5947bffbd947bffc5947bffce947bffd6947bffde947bffe6947bffef947bfff7947bffff947bff009c7bff089c7bff109c7bff199c7bff219c7bff299c7bff319c7bff3a9c7bff429c7bff4a9c7bff529c7bff5a9c7bff639c7bff6b9c7bff739c7bff7b9c7bff849c7bff8c9c7bff949c7bff9c9c7bffa59c7bffad9c7bffb59c7bffbd9c7bffc59c7bffce9c7bffd69c7bffde9c7bffe69c7bffef9c7bfff79c7bffff9c7bff00a57bff08a57bff10a57bff19a57bff21a57bff29a57bff31a57bff3aa57bff42a57bff4aa57bff52a57bff5aa57bff63a57bff6ba57bff73a57bff7ba57bff84a57bff8ca57bff94a57bff9ca57bffa5a57bffada57bffb5a57bffbda57bffc5a57bffcea57bffd6a57bffdea57bffe6a57bffefa57bfff7a57bffffa57bff00ad7bff08ad7bff10ad7bff19ad7bff21ad7bff29ad7bff31ad7bff3aad7bff42ad7bff4aad7bff52ad7bff5aad7bff63ad7bff6bad7bff73ad7bff7bad7bff84ad7bff8cad7bff94ad7bff9cad7bffa5ad7bffadad7bffb5ad7bffbdad7bffc5ad7bffcead7bffd6ad7bffdead7bffe6ad7bffefad7bfff7ad7bffffad7bff00b57bff08b57bff10b57bff19b57bff21b57bff29b57bff31b57bff3ab57bff42b57bff4ab57bff52b57bff5ab57bff63b57bff6bb57bff73b57bff7bb57bff84b57bff8cb57bff94b57bff9cb57bffa5b57bffadb57bffb5b57bffbdb57bffc5b57bffceb57bffd6b57bffdeb57bffe6b57bffefb57bfff7b57bffffb57bff00bd7bff08bd7bff10bd7bff19bd7bff21bd7bff29bd7bff31bd7bff3abd7bff42bd7bff4abd7bff52bd7bff5abd7bff63bd7bff6bbd7bff73bd7bff7bbd7bff84bd7bff8cbd7bff94bd7bff9cbd7bffa5bd7bffadbd7bffb5bd7bffbdbd7bffc5bd7bffcebd7bffd6bd7bffdebd7bffe6bd7bffefbd7bfff7bd7bffffbd7bff00c57bff08c57bff10c57bff19c57bff21c57bff29c57bff31c57bff3ac57bff42c57bff4ac57bff52c57bff5ac57bff63c57bff6bc57bff73c57bff7bc57bff84c57bff8cc57bff94c57bff9cc57bffa5c57bffadc57bffb5c57bffbdc57bffc5c57bffcec57bffd6c57bffdec57bffe6c57bffefc57bfff7c57bffffc57bff00ce7bff08ce7bff10ce7bff19ce7bff21ce7bff29ce7bff31ce7bff3ace7bff42ce7bff4ace7bff52ce7bff5ace7bff63ce7bff6bce7bff73ce7bff7bce7bff84ce7bff8cce7bff94ce7bff9cce7bffa5ce7bffadce7bffb5ce7bffbdce7bffc5ce7bffcece7bffd6ce7bffdece7bffe6ce7bffefce7bfff7ce7bffffce7bff00d67bff08d67bff10d67bff19d67bff21d67bff29d67bff31d67bff3ad67bff42d67bff4ad67bff52d67bff5ad67bff63d67bff6bd67bff73d67bff7bd67bff84d67bff8cd67bff94d67bff9cd67bffa5d67bffadd67bffb5d67bffbdd67bffc5d67bffced67bffd6d67bffded67bffe6d67bffefd67bfff7d67bffffd67bff00de7bff08de7bff10de7bff19de7bff21de7bff29de7bff31de7bff3ade7bff42de7bff4ade7bff52de7bff5ade7bff63de7bff6bde7bff73de7bff7bde7bff84de7bff8cde7bff94de7bff9cde7bffa5de7bffadde7bffb5de7bffbdde7bffc5de7bffcede7bffd6de7bffdede7bffe6de7bffefde7bfff7de7bffffde7bff00e67bff08e67bff10e67bff19e67bff21e67bff29e67bff31e67bff3ae67bff42e67bff4ae67bff52e67bff5ae67bff63e67bff6be67bff73e67bff7be67bff84e67bff8ce67bff94e67bff9ce67bffa5e67bffade67bffb5e67bffbde67bffc5e67bffcee67bffd6e67bffdee67bffe6e67bffefe67bfff7e67bffffe67bff00ef7bff08ef7bff10ef7bff19ef7bff21ef7bff29ef7bff31ef7bff3aef7bff42ef7bff4aef7bff52ef7bff5aef7bff63ef7bff6bef7bff73ef7bff7bef7bff84ef7bff8cef7bff94ef7bff9cef7bffa5ef7bffadef7bffb5ef7bffbdef7bffc5ef7bffceef7bffd6ef7bffdeef7bffe6ef7bffefef7bfff7ef7bffffef7bff00f77bff08f77bff10f77bff19f77bff21f77bff29f77bff31f77bff3af77bff42f77bff4af77bff52f77bff5af77bff63f77bff6bf77bff73f77bff7bf77bff84f77bff8cf77bff94f77bff9cf77bffa5f77bffadf77bffb5f77bffbdf77bffc5f77bffcef77bffd6f77bffdef77bffe6f77bffeff77bfff7f77bfffff77bff00ff7bff08ff7bff10ff7bff19ff7bff21ff7bff29ff7bff31ff7bff3aff7bff42ff7bff4aff7bff52ff7bff5aff7bff63ff7bff6bff7bff73ff7bff7bff7bff84ff7bff8cff7bff94ff7bff9cff7bffa5ff7bffadff7bffb5ff7bffbdff7bffc5ff7bffceff7bffd6ff7bffdeff7bffe6ff7bffefff7bfff7ff7bffffff7bff000084ff080084ff100084ff190084ff210084ff290084ff310084ff3a0084ff420084ff4a0084ff520084ff5a0084ff630084ff6b0084ff730084ff7b0084ff840084ff8c0084ff940084ff9c0084ffa50084ffad0084ffb50084ffbd0084ffc50084ffce0084ffd60084ffde0084ffe60084ffef0084fff70084ffff0084ff000884ff080884ff100884ff190884ff210884ff290884ff310884ff3a0884ff420884ff4a0884ff520884ff5a0884ff630884ff6b0884ff730884ff7b0884ff840884ff8c0884ff940884ff9c0884ffa50884ffad0884ffb50884ffbd0884ffc50884ffce0884ffd60884ffde0884ffe60884ffef0884fff70884ffff0884ff001084ff081084ff101084ff191084ff211084ff291084ff311084ff3a1084ff421084ff4a1084ff521084ff5a1084ff631084ff6b1084ff731084ff7b1084ff841084ff8c1084ff941084ff9c1084ffa51084ffad1084ffb51084ffbd1084ffc51084ffce1084ffd61084ffde1084ffe61084ffef1084fff71084ffff1084ff001984ff081984ff101984ff191984ff211984ff291984ff311984ff3a1984ff421984ff4a1984ff521984ff5a1984ff631984ff6b1984ff731984ff7b1984ff841984ff8c1984ff941984ff9c1984ffa51984ffad1984ffb51984ffbd1984ffc51984ffce1984ffd61984ffde1984ffe61984ffef1984fff71984ffff1984ff002184ff082184ff102184ff192184ff212184ff292184ff312184ff3a2184ff422184ff4a2184ff522184ff5a2184ff632184ff6b2184ff732184ff7b2184ff842184ff8c2184ff942184ff9c2184ffa52184ffad2184ffb52184ffbd2184ffc52184ffce2184ffd62184ffde2184ffe62184ffef2184fff72184ffff2184ff002984ff082984ff102984ff192984ff212984ff292984ff312984ff3a2984ff422984ff4a2984ff522984ff5a2984ff632984ff6b2984ff732984ff7b2984ff842984ff8c2984ff942984ff9c2984ffa52984ffad2984ffb52984ffbd2984ffc52984ffce2984ffd62984ffde2984ffe62984ffef2984fff72984ffff2984ff003184ff083184ff103184ff193184ff213184ff293184ff313184ff3a3184ff423184ff4a3184ff523184ff5a3184ff633184ff6b3184ff733184ff7b3184ff843184ff8c3184ff943184ff9c3184ffa53184ffad3184ffb53184ffbd3184ffc53184ffce3184ffd63184ffde3184ffe63184ffef3184fff73184ffff3184ff003a84ff083a84ff103a84ff193a84ff213a84ff293a84ff313a84ff3a3a84ff423a84ff4a3a84ff523a84ff5a3a84ff633a84ff6b3a84ff733a84ff7b3a84ff843a84ff8c3a84ff943a84ff9c3a84ffa53a84ffad3a84ffb53a84ffbd3a84ffc53a84ffce3a84ffd63a84ffde3a84ffe63a84ffef3a84fff73a84ffff3a84ff004284ff084284ff104284ff194284ff214284ff294284ff314284ff3a4284ff424284ff4a4284ff524284ff5a4284ff634284ff6b4284ff734284ff7b4284ff844284ff8c4284ff944284ff9c4284ffa54284ffad4284ffb54284ffbd4284ffc54284ffce4284ffd64284ffde4284ffe64284ffef4284fff74284ffff4284ff004a84ff084a84ff104a84ff194a84ff214a84ff294a84ff314a84ff3a4a84ff424a84ff4a4a84ff524a84ff5a4a84ff634a84ff6b4a84ff734a84ff7b4a84ff844a84ff8c4a84ff944a84ff9c4a84ffa54a84ffad4a84ffb54a84ffbd4a84ffc54a84ffce4a84ffd64a84ffde4a84ffe64a84ffef4a84fff74a84ffff4a84ff005284ff085284ff105284ff195284ff215284ff295284ff315284ff3a5284ff425284ff4a5284ff525284ff5a5284ff635284ff6b5284ff735284ff7b5284ff845284ff8c5284ff945284ff9c5284ffa55284ffad5284ffb55284ffbd5284ffc55284ffce5284ffd65284ffde5284ffe65284ffef5284fff75284ffff5284ff005a84ff085a84ff105a84ff195a84ff215a84ff295a84ff315a84ff3a5a84ff425a84ff4a5a84ff525a84ff5a5a84ff635a84ff6b5a84ff735a84ff7b5a84ff845a84ff8c5a84ff945a84ff9c5a84ffa55a84ffad5a84ffb55a84ffbd5a84ffc55a84ffce5a84ffd65a84ffde5a84ffe65a84ffef5a84fff75a84ffff5a84ff006384ff086384ff106384ff196384ff216384ff296384ff316384ff3a6384ff426384ff4a6384ff526384ff5a6384ff636384ff6b6384ff736384ff7b6384ff846384ff8c6384ff946384ff9c6384ffa56384ffad6384ffb56384ffbd6384ffc56384ffce6384ffd66384ffde6384ffe66384ffef6384fff76384ffff6384ff006b84ff086b84ff106b84ff196b84ff216b84ff296b84ff316b84ff3a6b84ff426b84ff4a6b84ff526b84ff5a6b84ff636b84ff6b6b84ff736b84ff7b6b84ff846b84ff8c6b84ff946b84ff9c6b84ffa56b84ffad6b84ffb56b84ffbd6b84ffc56b84ffce6b84ffd66b84ffde6b84ffe66b84ffef6b84fff76b84ffff6b84ff007384ff087384ff107384ff197384ff217384ff297384ff317384ff3a7384ff427384ff4a7384ff527384ff5a7384ff637384ff6b7384ff737384ff7b7384ff847384ff8c7384ff947384ff9c7384ffa57384ffad7384ffb57384ffbd7384ffc57384ffce7384ffd67384ffde7384ffe67384ffef7384fff77384ffff7384ff007b84ff087b84ff107b84ff197b84ff217b84ff297b84ff317b84ff3a7b84ff427b84ff4a7b84ff527b84ff5a7b84ff637b84ff6b7b84ff737b84ff7b7b84ff847b84ff8c7b84ff947b84ff9c7b84ffa57b84ffad7b84ffb57b84ffbd7b84ffc57b84ffce7b84ffd67b84ffde7b84ffe67b84ffef7b84fff77b84ffff7b84ff008484ff088484ff108484ff198484ff218484ff298484ff318484ff3a8484ff428484ff4a8484ff528484ff5a8484ff638484ff6b8484ff738484ff7b8484ff848484ff8c8484ff948484ff9c8484ffa58484ffad8484ffb58484ffbd8484ffc58484ffce8484ffd68484ffde8484ffe68484ffef8484fff78484ffff8484ff008c84ff088c84ff108c84ff198c84ff218c84ff298c84ff318c84ff3a8c84ff428c84ff4a8c84ff528c84ff5a8c84ff638c84ff6b8c84ff738c84ff7b8c84ff848c84ff8c8c84ff948c84ff9c8c84ffa58c84ffad8c84ffb58c84ffbd8c84ffc58c84ffce8c84ffd68c84ffde8c84ffe68c84ffef8c84fff78c84ffff8c84ff009484ff089484ff109484ff199484ff219484ff299484ff319484ff3a9484ff429484ff4a9484ff529484ff5a9484ff639484ff6b9484ff739484ff7b9484ff849484ff8c9484ff949484ff9c9484ffa59484ffad9484ffb59484ffbd9484ffc59484ffce9484ffd69484ffde9484ffe69484ffef9484fff79484ffff9484ff009c84ff089c84ff109c84ff199c84ff219c84ff299c84ff319c84ff3a9c84ff429c84ff4a9c84ff529c84ff5a9c84ff639c84ff6b9c84ff739c84ff7b9c84ff849c84ff8c9c84ff949c84ff9c9c84ffa59c84ffad9c84ffb59c84ffbd9c84ffc59c84ffce9c84ffd69c84ffde9c84ffe69c84ffef9c84fff79c84ffff9c84ff00a584ff08a584ff10a584ff19a584ff21a584ff29a584ff31a584ff3aa584ff42a584ff4aa584ff52a584ff5aa584ff63a584ff6ba584ff73a584ff7ba584ff84a584ff8ca584ff94a584ff9ca584ffa5a584ffada584ffb5a584ffbda584ffc5a584ffcea584ffd6a584ffdea584ffe6a584ffefa584fff7a584ffffa584ff00ad84ff08ad84ff10ad84ff19ad84ff21ad84ff29ad84ff31ad84ff3aad84ff42ad84ff4aad84ff52ad84ff5aad84ff63ad84ff6bad84ff73ad84ff7bad84ff84ad84ff8cad84ff94ad84ff9cad84ffa5ad84ffadad84ffb5ad84ffbdad84ffc5ad84ffcead84ffd6ad84ffdead84ffe6ad84ffefad84fff7ad84ffffad84ff00b584ff08b584ff10b584ff19b584ff21b584ff29b584ff31b584ff3ab584ff42b584ff4ab584ff52b584ff5ab584ff63b584ff6bb584ff73b584ff7bb584ff84b584ff8cb584ff94b584ff9cb584ffa5b584ffadb584ffb5b584ffbdb584ffc5b584ffceb584ffd6b584ffdeb584ffe6b584ffefb584fff7b584ffffb584ff00bd84ff08bd84ff10bd84ff19bd84ff21bd84ff29bd84ff31bd84ff3abd84ff42bd84ff4abd84ff52bd84ff5abd84ff63bd84ff6bbd84ff73bd84ff7bbd84ff84bd84ff8cbd84ff94bd84ff9cbd84ffa5bd84ffadbd84ffb5bd84ffbdbd84ffc5bd84ffcebd84ffd6bd84ffdebd84ffe6bd84ffefbd84fff7bd84ffffbd84ff00c584ff08c584ff10c584ff19c584ff21c584ff29c584ff31c584ff3ac584ff42c584ff4ac584ff52c584ff5ac584ff63c584ff6bc584ff73c584ff7bc584ff84c584ff8cc584ff94c584ff9cc584ffa5c584ffadc584ffb5c584ffbdc584ffc5c584ffcec584ffd6c584ffdec584ffe6c584ffefc584fff7c584ffffc584ff00ce84ff08ce84ff10ce84ff19ce84ff21ce84ff29ce84ff31ce84ff3ace84ff42ce84ff4ace84ff52ce84ff5ace84ff63ce84ff6bce84ff73ce84ff7bce84ff84ce84ff8cce84ff94ce84ff9cce84ffa5ce84ffadce84ffb5ce84ffbdce84ffc5ce84ffcece84ffd6ce84ffdece84ffe6ce84ffefce84fff7ce84ffffce84ff00d684ff08d684ff10d684ff19d684ff21d684ff29d684ff31d684ff3ad684ff42d684ff4ad684ff52d684ff5ad684ff63d684ff6bd684ff73d684ff7bd684ff84d684ff8cd684ff94d684ff9cd684ffa5d684ffadd684ffb5d684ffbdd684ffc5d684ffced684ffd6d684ffded684ffe6d684ffefd684fff7d684ffffd684ff00de84ff08de84ff10de84ff19de84ff21de84ff29de84ff31de84ff3ade84ff42de84ff4ade84ff52de84ff5ade84ff63de84ff6bde84ff73de84ff7bde84ff84de84ff8cde84ff94de84ff9cde84ffa5de84ffadde84ffb5de84ffbdde84ffc5de84ffcede84ffd6de84ffdede84ffe6de84ffefde84fff7de84ffffde84ff00e684ff08e684ff10e684ff19e684ff21e684ff29e684ff31e684ff3ae684ff42e684ff4ae684ff52e684ff5ae684ff63e684ff6be684ff73e684ff7be684ff84e684ff8ce684ff94e684ff9ce684ffa5e684ffade684ffb5e684ffbde684ffc5e684ffcee684ffd6e684ffdee684ffe6e684ffefe684fff7e684ffffe684ff00ef84ff08ef84ff10ef84ff19ef84ff21ef84ff29ef84ff31ef84ff3aef84ff42ef84ff4aef84ff52ef84ff5aef84ff63ef84ff6bef84ff73ef84ff7bef84ff84ef84ff8cef84ff94ef84ff9cef84ffa5ef84ffadef84ffb5ef84ffbdef84ffc5ef84ffceef84ffd6ef84ffdeef84ffe6ef84ffefef84fff7ef84ffffef84ff00f784ff08f784ff10f784ff19f784ff21f784ff29f784ff31f784ff3af784ff42f784ff4af784ff52f784ff5af784ff63f784ff6bf784ff73f784ff7bf784ff84f784ff8cf784ff94f784ff9cf784ffa5f784ffadf784ffb5f784ffbdf784ffc5f784ffcef784ffd6f784ffdef784ffe6f784ffeff784fff7f784fffff784ff00ff84ff08ff84ff10ff84ff19ff84ff21ff84ff29ff84ff31ff84ff3aff84ff42ff84ff4aff84ff52ff84ff5aff84ff63ff84ff6bff84ff73ff84ff7bff84ff84ff84ff8cff84ff94ff84ff9cff84ffa5ff84ffadff84ffb5ff84ffbdff84ffc5ff84ffceff84ffd6ff84ffdeff84ffe6ff84ffefff84fff7ff84ffffff84ff00008cff08008cff10008cff19008cff21008cff29008cff31008cff3a008cff42008cff4a008cff52008cff5a008cff63008cff6b008cff73008cff7b008cff84008cff8c008cff94008cff9c008cffa5008cffad008cffb5008cffbd008cffc5008cffce008cffd6008cffde008cffe6008cffef008cfff7008cffff008cff00088cff08088cff10088cff19088cff21088cff29088cff31088cff3a088cff42088cff4a088cff52088cff5a088cff63088cff6b088cff73088cff7b088cff84088cff8c088cff94088cff9c088cffa5088cffad088cffb5088cffbd088cffc5088cffce088cffd6088cffde088cffe6088cffef088cfff7088cffff088cff00108cff08108cff10108cff19108cff21108cff29108cff31108cff3a108cff42108cff4a108cff52108cff5a108cff63108cff6b108cff73108cff7b108cff84108cff8c108cff94108cff9c108cffa5108cffad108cffb5108cffbd108cffc5108cffce108cffd6108cffde108cffe6108cffef108cfff7108cffff108cff00198cff08198cff10198cff19198cff21198cff29198cff31198cff3a198cff42198cff4a198cff52198cff5a198cff63198cff6b198cff73198cff7b198cff84198cff8c198cff94198cff9c198cffa5198cffad198cffb5198cffbd198cffc5198cffce198cffd6198cffde198cffe6198cffef198cfff7198cffff198cff00218cff08218cff10218cff19218cff21218cff29218cff31218cff3a218cff42218cff4a218cff52218cff5a218cff63218cff6b218cff73218cff7b218cff84218cff8c218cff94218cff9c218cffa5218cffad218cffb5218cffbd218cffc5218cffce218cffd6218cffde218cffe6218cffef218cfff7218cffff218cff00298cff08298cff10298cff19298cff21298cff29298cff31298cff3a298cff42298cff4a298cff52298cff5a298cff63298cff6b298cff73298cff7b298cff84298cff8c298cff94298cff9c298cffa5298cffad298cffb5298cffbd298cffc5298cffce298cffd6298cffde298cffe6298cffef298cfff7298cffff298cff00318cff08318cff10318cff19318cff21318cff29318cff31318cff3a318cff42318cff4a318cff52318cff5a318cff63318cff6b318cff73318cff7b318cff84318cff8c318cff94318cff9c318cffa5318cffad318cffb5318cffbd318cffc5318cffce318cffd6318cffde318cffe6318cffef318cfff7318cffff318cff003a8cff083a8cff103a8cff193a8cff213a8cff293a8cff313a8cff3a3a8cff423a8cff4a3a8cff523a8cff5a3a8cff633a8cff6b3a8cff733a8cff7b3a8cff843a8cff8c3a8cff943a8cff9c3a8cffa53a8cffad3a8cffb53a8cffbd3a8cffc53a8cffce3a8cffd63a8cffde3a8cffe63a8cffef3a8cfff73a8cffff3a8cff00428cff08428cff10428cff19428cff21428cff29428cff31428cff3a428cff42428cff4a428cff52428cff5a428cff63428cff6b428cff73428cff7b428cff84428cff8c428cff94428cff9c428cffa5428cffad428cffb5428cffbd428cffc5428cffce428cffd6428cffde428cffe6428cffef428cfff7428cffff428cff004a8cff084a8cff104a8cff194a8cff214a8cff294a8cff314a8cff3a4a8cff424a8cff4a4a8cff524a8cff5a4a8cff634a8cff6b4a8cff734a8cff7b4a8cff844a8cff8c4a8cff944a8cff9c4a8cffa54a8cffad4a8cffb54a8cffbd4a8cffc54a8cffce4a8cffd64a8cffde4a8cffe64a8cffef4a8cfff74a8cffff4a8cff00528cff08528cff10528cff19528cff21528cff29528cff31528cff3a528cff42528cff4a528cff52528cff5a528cff63528cff6b528cff73528cff7b528cff84528cff8c528cff94528cff9c528cffa5528cffad528cffb5528cffbd528cffc5528cffce528cffd6528cffde528cffe6528cffef528cfff7528cffff528cff005a8cff085a8cff105a8cff195a8cff215a8cff295a8cff315a8cff3a5a8cff425a8cff4a5a8cff525a8cff5a5a8cff635a8cff6b5a8cff735a8cff7b5a8cff845a8cff8c5a8cff945a8cff9c5a8cffa55a8cffad5a8cffb55a8cffbd5a8cffc55a8cffce5a8cffd65a8cffde5a8cffe65a8cffef5a8cfff75a8cffff5a8cff00638cff08638cff10638cff19638cff21638cff29638cff31638cff3a638cff42638cff4a638cff52638cff5a638cff63638cff6b638cff73638cff7b638cff84638cff8c638cff94638cff9c638cffa5638cffad638cffb5638cffbd638cffc5638cffce638cffd6638cffde638cffe6638cffef638cfff7638cffff638cff006b8cff086b8cff106b8cff196b8cff216b8cff296b8cff316b8cff3a6b8cff426b8cff4a6b8cff526b8cff5a6b8cff636b8cff6b6b8cff736b8cff7b6b8cff846b8cff8c6b8cff946b8cff9c6b8cffa56b8cffad6b8cffb56b8cffbd6b8cffc56b8cffce6b8cffd66b8cffde6b8cffe66b8cffef6b8cfff76b8cffff6b8cff00738cff08738cff10738cff19738cff21738cff29738cff31738cff3a738cff42738cff4a738cff52738cff5a738cff63738cff6b738cff73738cff7b738cff84738cff8c738cff94738cff9c738cffa5738cffad738cffb5738cffbd738cffc5738cffce738cffd6738cffde738cffe6738cffef738cfff7738cffff738cff007b8cff087b8cff107b8cff197b8cff217b8cff297b8cff317b8cff3a7b8cff427b8cff4a7b8cff527b8cff5a7b8cff637b8cff6b7b8cff737b8cff7b7b8cff847b8cff8c7b8cff947b8cff9c7b8cffa57b8cffad7b8cffb57b8cffbd7b8cffc57b8cffce7b8cffd67b8cffde7b8cffe67b8cffef7b8cfff77b8cffff7b8cff00848cff08848cff10848cff19848cff21848cff29848cff31848cff3a848cff42848cff4a848cff52848cff5a848cff63848cff6b848cff73848cff7b848cff84848cff8c848cff94848cff9c848cffa5848cffad848cffb5848cffbd848cffc5848cffce848cffd6848cffde848cffe6848cffef848cfff7848cffff848cff008c8cff088c8cff108c8cff198c8cff218c8cff298c8cff318c8cff3a8c8cff428c8cff4a8c8cff528c8cff5a8c8cff638c8cff6b8c8cff738c8cff7b8c8cff848c8cff8c8c8cff948c8cff9c8c8cffa58c8cffad8c8cffb58c8cffbd8c8cffc58c8cffce8c8cffd68c8cffde8c8cffe68c8cffef8c8cfff78c8cffff8c8cff00948cff08948cff10948cff19948cff21948cff29948cff31948cff3a948cff42948cff4a948cff52948cff5a948cff63948cff6b948cff73948cff7b948cff84948cff8c948cff94948cff9c948cffa5948cffad948cffb5948cffbd948cffc5948cffce948cffd6948cffde948cffe6948cffef948cfff7948cffff948cff009c8cff089c8cff109c8cff199c8cff219c8cff299c8cff319c8cff3a9c8cff429c8cff4a9c8cff529c8cff5a9c8cff639c8cff6b9c8cff739c8cff7b9c8cff849c8cff8c9c8cff949c8cff9c9c8cffa59c8cffad9c8cffb59c8cffbd9c8cffc59c8cffce9c8cffd69c8cffde9c8cffe69c8cffef9c8cfff79c8cffff9c8cff00a58cff08a58cff10a58cff19a58cff21a58cff29a58cff31a58cff3aa58cff42a58cff4aa58cff52a58cff5aa58cff63a58cff6ba58cff73a58cff7ba58cff84a58cff8ca58cff94a58cff9ca58cffa5a58cffada58cffb5a58cffbda58cffc5a58cffcea58cffd6a58cffdea58cffe6a58cffefa58cfff7a58cffffa58cff00ad8cff08ad8cff10ad8cff19ad8cff21ad8cff29ad8cff31ad8cff3aad8cff42ad8cff4aad8cff52ad8cff5aad8cff63ad8cff6bad8cff73ad8cff7bad8cff84ad8cff8cad8cff94ad8cff9cad8cffa5ad8cffadad8cffb5ad8cffbdad8cffc5ad8cffcead8cffd6ad8cffdead8cffe6ad8cffefad8cfff7ad8cffffad8cff00b58cff08b58cff10b58cff19b58cff21b58cff29b58cff31b58cff3ab58cff42b58cff4ab58cff52b58cff5ab58cff63b58cff6bb58cff73b58cff7bb58cff84b58cff8cb58cff94b58cff9cb58cffa5b58cffadb58cffb5b58cffbdb58cffc5b58cffceb58cffd6b58cffdeb58cffe6b58cffefb58cfff7b58cffffb58cff00bd8cff08bd8cff10bd8cff19bd8cff21bd8cff29bd8cff31bd8cff3abd8cff42bd8cff4abd8cff52bd8cff5abd8cff63bd8cff6bbd8cff73bd8cff7bbd8cff84bd8cff8cbd8cff94bd8cff9cbd8cffa5bd8cffadbd8cffb5bd8cffbdbd8cffc5bd8cffcebd8cffd6bd8cffdebd8cffe6bd8cffefbd8cfff7bd8cffffbd8cff00c58cff08c58cff10c58cff19c58cff21c58cff29c58cff31c58cff3ac58cff42c58cff4ac58cff52c58cff5ac58cff63c58cff6bc58cff73c58cff7bc58cff84c58cff8cc58cff94c58cff9cc58cffa5c58cffadc58cffb5c58cffbdc58cffc5c58cffcec58cffd6c58cffdec58cffe6c58cffefc58cfff7c58cffffc58cff00ce8cff08ce8cff10ce8cff19ce8cff21ce8cff29ce8cff31ce8cff3ace8cff42ce8cff4ace8cff52ce8cff5ace8cff63ce8cff6bce8cff73ce8cff7bce8cff84ce8cff8cce8cff94ce8cff9cce8cffa5ce8cffadce8cffb5ce8cffbdce8cffc5ce8cffcece8cffd6ce8cffdece8cffe6ce8cffefce8cfff7ce8cffffce8cff00d68cff08d68cff10d68cff19d68cff21d68cff29d68cff31d68cff3ad68cff42d68cff4ad68cff52d68cff5ad68cff63d68cff6bd68cff73d68cff7bd68cff84d68cff8cd68cff94d68cff9cd68cffa5d68cffadd68cffb5d68cffbdd68cffc5d68cffced68cffd6d68cffded68cffe6d68cffefd68cfff7d68cffffd68cff00de8cff08de8cff10de8cff19de8cff21de8cff29de8cff31de8cff3ade8cff42de8cff4ade8cff52de8cff5ade8cff63de8cff6bde8cff73de8cff7bde8cff84de8cff8cde8cff94de8cff9cde8cffa5de8cffadde8cffb5de8cffbdde8cffc5de8cffcede8cffd6de8cffdede8cffe6de8cffefde8cfff7de8cffffde8cff00e68cff08e68cff10e68cff19e68cff21e68cff29e68cff31e68cff3ae68cff42e68cff4ae68cff52e68cff5ae68cff63e68cff6be68cff73e68cff7be68cff84e68cff8ce68cff94e68cff9ce68cffa5e68cffade68cffb5e68cffbde68cffc5e68cffcee68cffd6e68cffdee68cffe6e68cffefe68cfff7e68cffffe68cff00ef8cff08ef8cff10ef8cff19ef8cff21ef8cff29ef8cff31ef8cff3aef8cff42ef8cff4aef8cff52ef8cff5aef8cff63ef8cff6bef8cff73ef8cff7bef8cff84ef8cff8cef8cff94ef8cff9cef8cffa5ef8cffadef8cffb5ef8cffbdef8cffc5ef8cffceef8cffd6ef8cffdeef8cffe6ef8cffefef8cfff7ef8cffffef8cff00f78cff08f78cff10f78cff19f78cff21f78cff29f78cff31f78cff3af78cff42f78cff4af78cff52f78cff5af78cff63f78cff6bf78cff73f78cff7bf78cff84f78cff8cf78cff94f78cff9cf78cffa5f78cffadf78cffb5f78cffbdf78cffc5f78cffcef78cffd6f78cffdef78cffe6f78cffeff78cfff7f78cfffff78cff00ff8cff08ff8cff10ff8cff19ff8cff21ff8cff29ff8cff31ff8cff3aff8cff42ff8cff4aff8cff52ff8cff5aff8cff63ff8cff6bff8cff73ff8cff7bff8cff84ff8cff8cff8cff94ff8cff9cff8cffa5ff8cffadff8cffb5ff8cffbdff8cffc5ff8cffceff8cffd6ff8cffdeff8cffe6ff8cffefff8cfff7ff8cffffff8cff000094ff080094ff100094ff190094ff210094ff290094ff310094ff3a0094ff420094ff4a0094ff520094ff5a0094ff630094ff6b0094ff730094ff7b0094ff840094ff8c0094ff940094ff9c0094ffa50094ffad0094ffb50094ffbd0094ffc50094ffce0094ffd60094ffde0094ffe60094ffef0094fff70094ffff0094ff000894ff080894ff100894ff190894ff210894ff290894ff310894ff3a0894ff420894ff4a0894ff520894ff5a0894ff630894ff6b0894ff730894ff7b0894ff840894ff8c0894ff940894ff9c0894ffa50894ffad0894ffb50894ffbd0894ffc50894ffce0894ffd60894ffde0894ffe60894ffef0894fff70894ffff0894ff001094ff081094ff101094ff191094ff211094ff291094ff311094ff3a1094ff421094ff4a1094ff521094ff5a1094ff631094ff6b1094ff731094ff7b1094ff841094ff8c1094ff941094ff9c1094ffa51094ffad1094ffb51094ffbd1094ffc51094ffce1094ffd61094ffde1094ffe61094ffef1094fff71094ffff1094ff001994ff081994ff101994ff191994ff211994ff291994ff311994ff3a1994ff421994ff4a1994ff521994ff5a1994ff631994ff6b1994ff731994ff7b1994ff841994ff8c1994ff941994ff9c1994ffa51994ffad1994ffb51994ffbd1994ffc51994ffce1994ffd61994ffde1994ffe61994ffef1994fff71994ffff1994ff002194ff082194ff102194ff192194ff212194ff292194ff312194ff3a2194ff422194ff4a2194ff522194ff5a2194ff632194ff6b2194ff732194ff7b2194ff842194ff8c2194ff942194ff9c2194ffa52194ffad2194ffb52194ffbd2194ffc52194ffce2194ffd62194ffde2194ffe62194ffef2194fff72194ffff2194ff002994ff082994ff102994ff192994ff212994ff292994ff312994ff3a2994ff422994ff4a2994ff522994ff5a2994ff632994ff6b2994ff732994ff7b2994ff842994ff8c2994ff942994ff9c2994ffa52994ffad2994ffb52994ffbd2994ffc52994ffce2994ffd62994ffde2994ffe62994ffef2994fff72994ffff2994ff003194ff083194ff103194ff193194ff213194ff293194ff313194ff3a3194ff423194ff4a3194ff523194ff5a3194ff633194ff6b3194ff733194ff7b3194ff843194ff8c3194ff943194ff9c3194ffa53194ffad3194ffb53194ffbd3194ffc53194ffce3194ffd63194ffde3194ffe63194ffef3194fff73194ffff3194ff003a94ff083a94ff103a94ff193a94ff213a94ff293a94ff313a94ff3a3a94ff423a94ff4a3a94ff523a94ff5a3a94ff633a94ff6b3a94ff733a94ff7b3a94ff843a94ff8c3a94ff943a94ff9c3a94ffa53a94ffad3a94ffb53a94ffbd3a94ffc53a94ffce3a94ffd63a94ffde3a94ffe63a94ffef3a94fff73a94ffff3a94ff004294ff084294ff104294ff194294ff214294ff294294ff314294ff3a4294ff424294ff4a4294ff524294ff5a4294ff634294ff6b4294ff734294ff7b4294ff844294ff8c4294ff944294ff9c4294ffa54294ffad4294ffb54294ffbd4294ffc54294ffce4294ffd64294ffde4294ffe64294ffef4294fff74294ffff4294ff004a94ff084a94ff104a94ff194a94ff214a94ff294a94ff314a94ff3a4a94ff424a94ff4a4a94ff524a94ff5a4a94ff634a94ff6b4a94ff734a94ff7b4a94ff844a94ff8c4a94ff944a94ff9c4a94ffa54a94ffad4a94ffb54a94ffbd4a94ffc54a94ffce4a94ffd64a94ffde4a94ffe64a94ffef4a94fff74a94ffff4a94ff005294ff085294ff105294ff195294ff215294ff295294ff315294ff3a5294ff425294ff4a5294ff525294ff5a5294ff635294ff6b5294ff735294ff7b5294ff845294ff8c5294ff945294ff9c5294ffa55294ffad5294ffb55294ffbd5294ffc55294ffce5294ffd65294ffde5294ffe65294ffef5294fff75294ffff5294ff005a94ff085a94ff105a94ff195a94ff215a94ff295a94ff315a94ff3a5a94ff425a94ff4a5a94ff525a94ff5a5a94ff635a94ff6b5a94ff735a94ff7b5a94ff845a94ff8c5a94ff945a94ff9c5a94ffa55a94ffad5a94ffb55a94ffbd5a94ffc55a94ffce5a94ffd65a94ffde5a94ffe65a94ffef5a94fff75a94ffff5a94ff006394ff086394ff106394ff196394ff216394ff296394ff316394ff3a6394ff426394ff4a6394ff526394ff5a6394ff636394ff6b6394ff736394ff7b6394ff846394ff8c6394ff946394ff9c6394ffa56394ffad6394ffb56394ffbd6394ffc56394ffce6394ffd66394ffde6394ffe66394ffef6394fff76394ffff6394ff006b94ff086b94ff106b94ff196b94ff216b94ff296b94ff316b94ff3a6b94ff426b94ff4a6b94ff526b94ff5a6b94ff636b94ff6b6b94ff736b94ff7b6b94ff846b94ff8c6b94ff946b94ff9c6b94ffa56b94ffad6b94ffb56b94ffbd6b94ffc56b94ffce6b94ffd66b94ffde6b94ffe66b94ffef6b94fff76b94ffff6b94ff007394ff087394ff107394ff197394ff217394ff297394ff317394ff3a7394ff427394ff4a7394ff527394ff5a7394ff637394ff6b7394ff737394ff7b7394ff847394ff8c7394ff947394ff9c7394ffa57394ffad7394ffb57394ffbd7394ffc57394ffce7394ffd67394ffde7394ffe67394ffef7394fff77394ffff7394ff007b94ff087b94ff107b94ff197b94ff217b94ff297b94ff317b94ff3a7b94ff427b94ff4a7b94ff527b94ff5a7b94ff637b94ff6b7b94ff737b94ff7b7b94ff847b94ff8c7b94ff947b94ff9c7b94ffa57b94ffad7b94ffb57b94ffbd7b94ffc57b94ffce7b94ffd67b94ffde7b94ffe67b94ffef7b94fff77b94ffff7b94ff008494ff088494ff108494ff198494ff218494ff298494ff318494ff3a8494ff428494ff4a8494ff528494ff5a8494ff638494ff6b8494ff738494ff7b8494ff848494ff8c8494ff948494ff9c8494ffa58494ffad8494ffb58494ffbd8494ffc58494ffce8494ffd68494ffde8494ffe68494ffef8494fff78494ffff8494ff008c94ff088c94ff108c94ff198c94ff218c94ff298c94ff318c94ff3a8c94ff428c94ff4a8c94ff528c94ff5a8c94ff638c94ff6b8c94ff738c94ff7b8c94ff848c94ff8c8c94ff948c94ff9c8c94ffa58c94ffad8c94ffb58c94ffbd8c94ffc58c94ffce8c94ffd68c94ffde8c94ffe68c94ffef8c94fff78c94ffff8c94ff009494ff089494ff109494ff199494ff219494ff299494ff319494ff3a9494ff429494ff4a9494ff529494ff5a9494ff639494ff6b9494ff739494ff7b9494ff849494ff8c9494ff949494ff9c9494ffa59494ffad9494ffb59494ffbd9494ffc59494ffce9494ffd69494ffde9494ffe69494ffef9494fff79494ffff9494ff009c94ff089c94ff109c94ff199c94ff219c94ff299c94ff319c94ff3a9c94ff429c94ff4a9c94ff529c94ff5a9c94ff639c94ff6b9c94ff739c94ff7b9c94ff849c94ff8c9c94ff949c94ff9c9c94ffa59c94ffad9c94ffb59c94ffbd9c94ffc59c94ffce9c94ffd69c94ffde9c94ffe69c94ffef9c94fff79c94ffff9c94ff00a594ff08a594ff10a594ff19a594ff21a594ff29a594ff31a594ff3aa594ff42a594ff4aa594ff52a594ff5aa594ff63a594ff6ba594ff73a594ff7ba594ff84a594ff8ca594ff94a594ff9ca594ffa5a594ffada594ffb5a594ffbda594ffc5a594ffcea594ffd6a594ffdea594ffe6a594ffefa594fff7a594ffffa594ff00ad94ff08ad94ff10ad94ff19ad94ff21ad94ff29ad94ff31ad94ff3aad94ff42ad94ff4aad94ff52ad94ff5aad94ff63ad94ff6bad94ff73ad94ff7bad94ff84ad94ff8cad94ff94ad94ff9cad94ffa5ad94ffadad94ffb5ad94ffbdad94ffc5ad94ffcead94ffd6ad94ffdead94ffe6ad94ffefad94fff7ad94ffffad94ff00b594ff08b594ff10b594ff19b594ff21b594ff29b594ff31b594ff3ab594ff42b594ff4ab594ff52b594ff5ab594ff63b594ff6bb594ff73b594ff7bb594ff84b594ff8cb594ff94b594ff9cb594ffa5b594ffadb594ffb5b594ffbdb594ffc5b594ffceb594ffd6b594ffdeb594ffe6b594ffefb594fff7b594ffffb594ff00bd94ff08bd94ff10bd94ff19bd94ff21bd94ff29bd94ff31bd94ff3abd94ff42bd94ff4abd94ff52bd94ff5abd94ff63bd94ff6bbd94ff73bd94ff7bbd94ff84bd94ff8cbd94ff94bd94ff9cbd94ffa5bd94ffadbd94ffb5bd94ffbdbd94ffc5bd94ffcebd94ffd6bd94ffdebd94ffe6bd94ffefbd94fff7bd94ffffbd94ff00c594ff08c594ff10c594ff19c594ff21c594ff29c594ff31c594ff3ac594ff42c594ff4ac594ff52c594ff5ac594ff63c594ff6bc594ff73c594ff7bc594ff84c594ff8cc594ff94c594ff9cc594ffa5c594ffadc594ffb5c594ffbdc594ffc5c594ffcec594ffd6c594ffdec594ffe6c594ffefc594fff7c594ffffc594ff00ce94ff08ce94ff10ce94ff19ce94ff21ce94ff29ce94ff31ce94ff3ace94ff42ce94ff4ace94ff52ce94ff5ace94ff63ce94ff6bce94ff73ce94ff7bce94ff84ce94ff8cce94ff94ce94ff9cce94ffa5ce94ffadce94ffb5ce94ffbdce94ffc5ce94ffcece94ffd6ce94ffdece94ffe6ce94ffefce94fff7ce94ffffce94ff00d694ff08d694ff10d694ff19d694ff21d694ff29d694ff31d694ff3ad694ff42d694ff4ad694ff52d694ff5ad694ff63d694ff6bd694ff73d694ff7bd694ff84d694ff8cd694ff94d694ff9cd694ffa5d694ffadd694ffb5d694ffbdd694ffc5d694ffced694ffd6d694ffded694ffe6d694ffefd694fff7d694ffffd694ff00de94ff08de94ff10de94ff19de94ff21de94ff29de94ff31de94ff3ade94ff42de94ff4ade94ff52de94ff5ade94ff63de94ff6bde94ff73de94ff7bde94ff84de94ff8cde94ff94de94ff9cde94ffa5de94ffadde94ffb5de94ffbdde94ffc5de94ffcede94ffd6de94ffdede94ffe6de94ffefde94fff7de94ffffde94ff00e694ff08e694ff10e694ff19e694ff21e694ff29e694ff31e694ff3ae694ff42e694ff4ae694ff52e694ff5ae694ff63e694ff6be694ff73e694ff7be694ff84e694ff8ce694ff94e694ff9ce694ffa5e694ffade694ffb5e694ffbde694ffc5e694ffcee694ffd6e694ffdee694ffe6e694ffefe694fff7e694ffffe694ff00ef94ff08ef94ff10ef94ff19ef94ff21ef94ff29ef94ff31ef94ff3aef94ff42ef94ff4aef94ff52ef94ff5aef94ff63ef94ff6bef94ff73ef94ff7bef94ff84ef94ff8cef94ff94ef94ff9cef94ffa5ef94ffadef94ffb5ef94ffbdef94ffc5ef94ffceef94ffd6ef94ffdeef94ffe6ef94ffefef94fff7ef94ffffef94ff00f794ff08f794ff10f794ff19f794ff21f794ff29f794ff31f794ff3af794ff42f794ff4af794ff52f794ff5af794ff63f794ff6bf794ff73f794ff7bf794ff84f794ff8cf794ff94f794ff9cf794ffa5f794ffadf794ffb5f794ffbdf794ffc5f794ffcef794ffd6f794ffdef794ffe6f794ffeff794fff7f794fffff794ff00ff94ff08ff94ff10ff94ff19ff94ff21ff94ff29ff94ff31ff94ff3aff94ff42ff94ff4aff94ff52ff94ff5aff94ff63ff94ff6bff94ff73ff94ff7bff94ff84ff94ff8cff94ff94ff94ff9cff94ffa5ff94ffadff94ffb5ff94ffbdff94ffc5ff94ffceff94ffd6ff94ffdeff94ffe6ff94ffefff94fff7ff94ffffff94ff00009cff08009cff10009cff19009cff21009cff29009cff31009cff3a009cff42009cff4a009cff52009cff5a009cff63009cff6b009cff73009cff7b009cff84009cff8c009cff94009cff9c009cffa5009cffad009cffb5009cffbd009cffc5009cffce009cffd6009cffde009cffe6009cffef009cfff7009cffff009cff00089cff08089cff10089cff19089cff21089cff29089cff31089cff3a089cff42089cff4a089cff52089cff5a089cff63089cff6b089cff73089cff7b089cff84089cff8c089cff94089cff9c089cffa5089cffad089cffb5089cffbd089cffc5089cffce089cffd6089cffde089cffe6089cffef089cfff7089cffff089cff00109cff08109cff10109cff19109cff21109cff29109cff31109cff3a109cff42109cff4a109cff52109cff5a109cff63109cff6b109cff73109cff7b109cff84109cff8c109cff94109cff9c109cffa5109cffad109cffb5109cffbd109cffc5109cffce109cffd6109cffde109cffe6109cffef109cfff7109cffff109cff00199cff08199cff10199cff19199cff21199cff29199cff31199cff3a199cff42199cff4a199cff52199cff5a199cff63199cff6b199cff73199cff7b199cff84199cff8c199cff94199cff9c199cffa5199cffad199cffb5199cffbd199cffc5199cffce199cffd6199cffde199cffe6199cffef199cfff7199cffff199cff00219cff08219cff10219cff19219cff21219cff29219cff31219cff3a219cff42219cff4a219cff52219cff5a219cff63219cff6b219cff73219cff7b219cff84219cff8c219cff94219cff9c219cffa5219cffad219cffb5219cffbd219cffc5219cffce219cffd6219cffde219cffe6219cffef219cfff7219cffff219cff00299cff08299cff10299cff19299cff21299cff29299cff31299cff3a299cff42299cff4a299cff52299cff5a299cff63299cff6b299cff73299cff7b299cff84299cff8c299cff94299cff9c299cffa5299cffad299cffb5299cffbd299cffc5299cffce299cffd6299cffde299cffe6299cffef299cfff7299cffff299cff00319cff08319cff10319cff19319cff21319cff29319cff31319cff3a319cff42319cff4a319cff52319cff5a319cff63319cff6b319cff73319cff7b319cff84319cff8c319cff94319cff9c319cffa5319cffad319cffb5319cffbd319cffc5319cffce319cffd6319cffde319cffe6319cffef319cfff7319cffff319cff003a9cff083a9cff103a9cff193a9cff213a9cff293a9cff313a9cff3a3a9cff423a9cff4a3a9cff523a9cff5a3a9cff633a9cff6b3a9cff733a9cff7b3a9cff843a9cff8c3a9cff943a9cff9c3a9cffa53a9cffad3a9cffb53a9cffbd3a9cffc53a9cffce3a9cffd63a9cffde3a9cffe63a9cffef3a9cfff73a9cffff3a9cff00429cff08429cff10429cff19429cff21429cff29429cff31429cff3a429cff42429cff4a429cff52429cff5a429cff63429cff6b429cff73429cff7b429cff84429cff8c429cff94429cff9c429cffa5429cffad429cffb5429cffbd429cffc5429cffce429cffd6429cffde429cffe6429cffef429cfff7429cffff429cff004a9cff084a9cff104a9cff194a9cff214a9cff294a9cff314a9cff3a4a9cff424a9cff4a4a9cff524a9cff5a4a9cff634a9cff6b4a9cff734a9cff7b4a9cff844a9cff8c4a9cff944a9cff9c4a9cffa54a9cffad4a9cffb54a9cffbd4a9cffc54a9cffce4a9cffd64a9cffde4a9cffe64a9cffef4a9cfff74a9cffff4a9cff00529cff08529cff10529cff19529cff21529cff29529cff31529cff3a529cff42529cff4a529cff52529cff5a529cff63529cff6b529cff73529cff7b529cff84529cff8c529cff94529cff9c529cffa5529cffad529cffb5529cffbd529cffc5529cffce529cffd6529cffde529cffe6529cffef529cfff7529cffff529cff005a9cff085a9cff105a9cff195a9cff215a9cff295a9cff315a9cff3a5a9cff425a9cff4a5a9cff525a9cff5a5a9cff635a9cff6b5a9cff735a9cff7b5a9cff845a9cff8c5a9cff945a9cff9c5a9cffa55a9cffad5a9cffb55a9cffbd5a9cffc55a9cffce5a9cffd65a9cffde5a9cffe65a9cffef5a9cfff75a9cffff5a9cff00639cff08639cff10639cff19639cff21639cff29639cff31639cff3a639cff42639cff4a639cff52639cff5a639cff63639cff6b639cff73639cff7b639cff84639cff8c639cff94639cff9c639cffa5639cffad639cffb5639cffbd639cffc5639cffce639cffd6639cffde639cffe6639cffef639cfff7639cffff639cff006b9cff086b9cff106b9cff196b9cff216b9cff296b9cff316b9cff3a6b9cff426b9cff4a6b9cff526b9cff5a6b9cff636b9cff6b6b9cff736b9cff7b6b9cff846b9cff8c6b9cff946b9cff9c6b9cffa56b9cffad6b9cffb56b9cffbd6b9cffc56b9cffce6b9cffd66b9cffde6b9cffe66b9cffef6b9cfff76b9cffff6b9cff00739cff08739cff10739cff19739cff21739cff29739cff31739cff3a739cff42739cff4a739cff52739cff5a739cff63739cff6b739cff73739cff7b739cff84739cff8c739cff94739cff9c739cffa5739cffad739cffb5739cffbd739cffc5739cffce739cffd6739cffde739cffe6739cffef739cfff7739cffff739cff007b9cff087b9cff107b9cff197b9cff217b9cff297b9cff317b9cff3a7b9cff427b9cff4a7b9cff527b9cff5a7b9cff637b9cff6b7b9cff737b9cff7b7b9cff847b9cff8c7b9cff947b9cff9c7b9cffa57b9cffad7b9cffb57b9cffbd7b9cffc57b9cffce7b9cffd67b9cffde7b9cffe67b9cffef7b9cfff77b9cffff7b9cff00849cff08849cff10849cff19849cff21849cff29849cff31849cff3a849cff42849cff4a849cff52849cff5a849cff63849cff6b849cff73849cff7b849cff84849cff8c849cff94849cff9c849cffa5849cffad849cffb5849cffbd849cffc5849cffce849cffd6849cffde849cffe6849cffef849cfff7849cffff849cff008c9cff088c9cff108c9cff198c9cff218c9cff298c9cff318c9cff3a8c9cff428c9cff4a8c9cff528c9cff5a8c9cff638c9cff6b8c9cff738c9cff7b8c9cff848c9cff8c8c9cff948c9cff9c8c9cffa58c9cffad8c9cffb58c9cffbd8c9cffc58c9cffce8c9cffd68c9cffde8c9cffe68c9cffef8c9cfff78c9cffff8c9cff00949cff08949cff10949cff19949cff21949cff29949cff31949cff3a949cff42949cff4a949cff52949cff5a949cff63949cff6b949cff73949cff7b949cff84949cff8c949cff94949cff9c949cffa5949cffad949cffb5949cffbd949cffc5949cffce949cffd6949cffde949cffe6949cffef949cfff7949cffff949cff009c9cff089c9cff109c9cff199c9cff219c9cff299c9cff319c9cff3a9c9cff429c9cff4a9c9cff529c9cff5a9c9cff639c9cff6b9c9cff739c9cff7b9c9cff849c9cff8c9c9cff949c9cff9c9c9cffa59c9cffad9c9cffb59c9cffbd9c9cffc59c9cffce9c9cffd69c9cffde9c9cffe69c9cffef9c9cfff79c9cffff9c9cff00a59cff08a59cff10a59cff19a59cff21a59cff29a59cff31a59cff3aa59cff42a59cff4aa59cff52a59cff5aa59cff63a59cff6ba59cff73a59cff7ba59cff84a59cff8ca59cff94a59cff9ca59cffa5a59cffada59cffb5a59cffbda59cffc5a59cffcea59cffd6a59cffdea59cffe6a59cffefa59cfff7a59cffffa59cff00ad9cff08ad9cff10ad9cff19ad9cff21ad9cff29ad9cff31ad9cff3aad9cff42ad9cff4aad9cff52ad9cff5aad9cff63ad9cff6bad9cff73ad9cff7bad9cff84ad9cff8cad9cff94ad9cff9cad9cffa5ad9cffadad9cffb5ad9cffbdad9cffc5ad9cffcead9cffd6ad9cffdead9cffe6ad9cffefad9cfff7ad9cffffad9cff00b59cff08b59cff10b59cff19b59cff21b59cff29b59cff31b59cff3ab59cff42b59cff4ab59cff52b59cff5ab59cff63b59cff6bb59cff73b59cff7bb59cff84b59cff8cb59cff94b59cff9cb59cffa5b59cffadb59cffb5b59cffbdb59cffc5b59cffceb59cffd6b59cffdeb59cffe6b59cffefb59cfff7b59cffffb59cff00bd9cff08bd9cff10bd9cff19bd9cff21bd9cff29bd9cff31bd9cff3abd9cff42bd9cff4abd9cff52bd9cff5abd9cff63bd9cff6bbd9cff73bd9cff7bbd9cff84bd9cff8cbd9cff94bd9cff9cbd9cffa5bd9cffadbd9cffb5bd9cffbdbd9cffc5bd9cffcebd9cffd6bd9cffdebd9cffe6bd9cffefbd9cfff7bd9cffffbd9cff00c59cff08c59cff10c59cff19c59cff21c59cff29c59cff31c59cff3ac59cff42c59cff4ac59cff52c59cff5ac59cff63c59cff6bc59cff73c59cff7bc59cff84c59cff8cc59cff94c59cff9cc59cffa5c59cffadc59cffb5c59cffbdc59cffc5c59cffcec59cffd6c59cffdec59cffe6c59cffefc59cfff7c59cffffc59cff00ce9cff08ce9cff10ce9cff19ce9cff21ce9cff29ce9cff31ce9cff3ace9cff42ce9cff4ace9cff52ce9cff5ace9cff63ce9cff6bce9cff73ce9cff7bce9cff84ce9cff8cce9cff94ce9cff9cce9cffa5ce9cffadce9cffb5ce9cffbdce9cffc5ce9cffcece9cffd6ce9cffdece9cffe6ce9cffefce9cfff7ce9cffffce9cff00d69cff08d69cff10d69cff19d69cff21d69cff29d69cff31d69cff3ad69cff42d69cff4ad69cff52d69cff5ad69cff63d69cff6bd69cff73d69cff7bd69cff84d69cff8cd69cff94d69cff9cd69cffa5d69cffadd69cffb5d69cffbdd69cffc5d69cffced69cffd6d69cffded69cffe6d69cffefd69cfff7d69cffffd69cff00de9cff08de9cff10de9cff19de9cff21de9cff29de9cff31de9cff3ade9cff42de9cff4ade9cff52de9cff5ade9cff63de9cff6bde9cff73de9cff7bde9cff84de9cff8cde9cff94de9cff9cde9cffa5de9cffadde9cffb5de9cffbdde9cffc5de9cffcede9cffd6de9cffdede9cffe6de9cffefde9cfff7de9cffffde9cff00e69cff08e69cff10e69cff19e69cff21e69cff29e69cff31e69cff3ae69cff42e69cff4ae69cff52e69cff5ae69cff63e69cff6be69cff73e69cff7be69cff84e69cff8ce69cff94e69cff9ce69cffa5e69cffade69cffb5e69cffbde69cffc5e69cffcee69cffd6e69cffdee69cffe6e69cffefe69cfff7e69cffffe69cff00ef9cff08ef9cff10ef9cff19ef9cff21ef9cff29ef9cff31ef9cff3aef9cff42ef9cff4aef9cff52ef9cff5aef9cff63ef9cff6bef9cff73ef9cff7bef9cff84ef9cff8cef9cff94ef9cff9cef9cffa5ef9cffadef9cffb5ef9cffbdef9cffc5ef9cffceef9cffd6ef9cffdeef9cffe6ef9cffefef9cfff7ef9cffffef9cff00f79cff08f79cff10f79cff19f79cff21f79cff29f79cff31f79cff3af79cff42f79cff4af79cff52f79cff5af79cff63f79cff6bf79cff73f79cff7bf79cff84f79cff8cf79cff94f79cff9cf79cffa5f79cffadf79cffb5f79cffbdf79cffc5f79cffcef79cffd6f79cffdef79cffe6f79cffeff79cfff7f79cfffff79cff00ff9cff08ff9cff10ff9cff19ff9cff21ff9cff29ff9cff31ff9cff3aff9cff42ff9cff4aff9cff52ff9cff5aff9cff63ff9cff6bff9cff73ff9cff7bff9cff84ff9cff8cff9cff94ff9cff9cff9cffa5ff9cffadff9cffb5ff9cffbdff9cffc5ff9cffceff9cffd6ff9cffdeff9cffe6ff9cffefff9cfff7ff9cffffff9cff0000a5ff0800a5ff1000a5ff1900a5ff2100a5ff2900a5ff3100a5ff3a00a5ff4200a5ff4a00a5ff5200a5ff5a00a5ff6300a5ff6b00a5ff7300a5ff7b00a5ff8400a5ff8c00a5ff9400a5ff9c00a5ffa500a5ffad00a5ffb500a5ffbd00a5ffc500a5ffce00a5ffd600a5ffde00a5ffe600a5ffef00a5fff700a5ffff00a5ff0008a5ff0808a5ff1008a5ff1908a5ff2108a5ff2908a5ff3108a5ff3a08a5ff4208a5ff4a08a5ff5208a5ff5a08a5ff6308a5ff6b08a5ff7308a5ff7b08a5ff8408a5ff8c08a5ff9408a5ff9c08a5ffa508a5ffad08a5ffb508a5ffbd08a5ffc508a5ffce08a5ffd608a5ffde08a5ffe608a5ffef08a5fff708a5ffff08a5ff0010a5ff0810a5ff1010a5ff1910a5ff2110a5ff2910a5ff3110a5ff3a10a5ff4210a5ff4a10a5ff5210a5ff5a10a5ff6310a5ff6b10a5ff7310a5ff7b10a5ff8410a5ff8c10a5ff9410a5ff9c10a5ffa510a5ffad10a5ffb510a5ffbd10a5ffc510a5ffce10a5ffd610a5ffde10a5ffe610a5ffef10a5fff710a5ffff10a5ff0019a5ff0819a5ff1019a5ff1919a5ff2119a5ff2919a5ff3119a5ff3a19a5ff4219a5ff4a19a5ff5219a5ff5a19a5ff6319a5ff6b19a5ff7319a5ff7b19a5ff8419a5ff8c19a5ff9419a5ff9c19a5ffa519a5ffad19a5ffb519a5ffbd19a5ffc519a5ffce19a5ffd619a5ffde19a5ffe619a5ffef19a5fff719a5ffff19a5ff0021a5ff0821a5ff1021a5ff1921a5ff2121a5ff2921a5ff3121a5ff3a21a5ff4221a5ff4a21a5ff5221a5ff5a21a5ff6321a5ff6b21a5ff7321a5ff7b21a5ff8421a5ff8c21a5ff9421a5ff9c21a5ffa521a5ffad21a5ffb521a5ffbd21a5ffc521a5ffce21a5ffd621a5ffde21a5ffe621a5ffef21a5fff721a5ffff21a5ff0029a5ff0829a5ff1029a5ff1929a5ff2129a5ff2929a5ff3129a5ff3a29a5ff4229a5ff4a29a5ff5229a5ff5a29a5ff6329a5ff6b29a5ff7329a5ff7b29a5ff8429a5ff8c29a5ff9429a5ff9c29a5ffa529a5ffad29a5ffb529a5ffbd29a5ffc529a5ffce29a5ffd629a5ffde29a5ffe629a5ffef29a5fff729a5ffff29a5ff0031a5ff0831a5ff1031a5ff1931a5ff2131a5ff2931a5ff3131a5ff3a31a5ff4231a5ff4a31a5ff5231a5ff5a31a5ff6331a5ff6b31a5ff7331a5ff7b31a5ff8431a5ff8c31a5ff9431a5ff9c31a5ffa531a5ffad31a5ffb531a5ffbd31a5ffc531a5ffce31a5ffd631a5ffde31a5ffe631a5ffef31a5fff731a5ffff31a5ff003aa5ff083aa5ff103aa5ff193aa5ff213aa5ff293aa5ff313aa5ff3a3aa5ff423aa5ff4a3aa5ff523aa5ff5a3aa5ff633aa5ff6b3aa5ff733aa5ff7b3aa5ff843aa5ff8c3aa5ff943aa5ff9c3aa5ffa53aa5ffad3aa5ffb53aa5ffbd3aa5ffc53aa5ffce3aa5ffd63aa5ffde3aa5ffe63aa5ffef3aa5fff73aa5ffff3aa5ff0042a5ff0842a5ff1042a5ff1942a5ff2142a5ff2942a5ff3142a5ff3a42a5ff4242a5ff4a42a5ff5242a5ff5a42a5ff6342a5ff6b42a5ff7342a5ff7b42a5ff8442a5ff8c42a5ff9442a5ff9c42a5ffa542a5ffad42a5ffb542a5ffbd42a5ffc542a5ffce42a5ffd642a5ffde42a5ffe642a5ffef42a5fff742a5ffff42a5ff004aa5ff084aa5ff104aa5ff194aa5ff214aa5ff294aa5ff314aa5ff3a4aa5ff424aa5ff4a4aa5ff524aa5ff5a4aa5ff634aa5ff6b4aa5ff734aa5ff7b4aa5ff844aa5ff8c4aa5ff944aa5ff9c4aa5ffa54aa5ffad4aa5ffb54aa5ffbd4aa5ffc54aa5ffce4aa5ffd64aa5ffde4aa5ffe64aa5ffef4aa5fff74aa5ffff4aa5ff0052a5ff0852a5ff1052a5ff1952a5ff2152a5ff2952a5ff3152a5ff3a52a5ff4252a5ff4a52a5ff5252a5ff5a52a5ff6352a5ff6b52a5ff7352a5ff7b52a5ff8452a5ff8c52a5ff9452a5ff9c52a5ffa552a5ffad52a5ffb552a5ffbd52a5ffc552a5ffce52a5ffd652a5ffde52a5ffe652a5ffef52a5fff752a5ffff52a5ff005aa5ff085aa5ff105aa5ff195aa5ff215aa5ff295aa5ff315aa5ff3a5aa5ff425aa5ff4a5aa5ff525aa5ff5a5aa5ff635aa5ff6b5aa5ff735aa5ff7b5aa5ff845aa5ff8c5aa5ff945aa5ff9c5aa5ffa55aa5ffad5aa5ffb55aa5ffbd5aa5ffc55aa5ffce5aa5ffd65aa5ffde5aa5ffe65aa5ffef5aa5fff75aa5ffff5aa5ff0063a5ff0863a5ff1063a5ff1963a5ff2163a5ff2963a5ff3163a5ff3a63a5ff4263a5ff4a63a5ff5263a5ff5a63a5ff6363a5ff6b63a5ff7363a5ff7b63a5ff8463a5ff8c63a5ff9463a5ff9c63a5ffa563a5ffad63a5ffb563a5ffbd63a5ffc563a5ffce63a5ffd663a5ffde63a5ffe663a5ffef63a5fff763a5ffff63a5ff006ba5ff086ba5ff106ba5ff196ba5ff216ba5ff296ba5ff316ba5ff3a6ba5ff426ba5ff4a6ba5ff526ba5ff5a6ba5ff636ba5ff6b6ba5ff736ba5ff7b6ba5ff846ba5ff8c6ba5ff946ba5ff9c6ba5ffa56ba5ffad6ba5ffb56ba5ffbd6ba5ffc56ba5ffce6ba5ffd66ba5ffde6ba5ffe66ba5ffef6ba5fff76ba5ffff6ba5ff0073a5ff0873a5ff1073a5ff1973a5ff2173a5ff2973a5ff3173a5ff3a73a5ff4273a5ff4a73a5ff5273a5ff5a73a5ff6373a5ff6b73a5ff7373a5ff7b73a5ff8473a5ff8c73a5ff9473a5ff9c73a5ffa573a5ffad73a5ffb573a5ffbd73a5ffc573a5ffce73a5ffd673a5ffde73a5ffe673a5ffef73a5fff773a5ffff73a5ff007ba5ff087ba5ff107ba5ff197ba5ff217ba5ff297ba5ff317ba5ff3a7ba5ff427ba5ff4a7ba5ff527ba5ff5a7ba5ff637ba5ff6b7ba5ff737ba5ff7b7ba5ff847ba5ff8c7ba5ff947ba5ff9c7ba5ffa57ba5ffad7ba5ffb57ba5ffbd7ba5ffc57ba5ffce7ba5ffd67ba5ffde7ba5ffe67ba5ffef7ba5fff77ba5ffff7ba5ff0084a5ff0884a5ff1084a5ff1984a5ff2184a5ff2984a5ff3184a5ff3a84a5ff4284a5ff4a84a5ff5284a5ff5a84a5ff6384a5ff6b84a5ff7384a5ff7b84a5ff8484a5ff8c84a5ff9484a5ff9c84a5ffa584a5ffad84a5ffb584a5ffbd84a5ffc584a5ffce84a5ffd684a5ffde84a5ffe684a5ffef84a5fff784a5ffff84a5ff008ca5ff088ca5ff108ca5ff198ca5ff218ca5ff298ca5ff318ca5ff3a8ca5ff428ca5ff4a8ca5ff528ca5ff5a8ca5ff638ca5ff6b8ca5ff738ca5ff7b8ca5ff848ca5ff8c8ca5ff948ca5ff9c8ca5ffa58ca5ffad8ca5ffb58ca5ffbd8ca5ffc58ca5ffce8ca5ffd68ca5ffde8ca5ffe68ca5ffef8ca5fff78ca5ffff8ca5ff0094a5ff0894a5ff1094a5ff1994a5ff2194a5ff2994a5ff3194a5ff3a94a5ff4294a5ff4a94a5ff5294a5ff5a94a5ff6394a5ff6b94a5ff7394a5ff7b94a5ff8494a5ff8c94a5ff9494a5ff9c94a5ffa594a5ffad94a5ffb594a5ffbd94a5ffc594a5ffce94a5ffd694a5ffde94a5ffe694a5ffef94a5fff794a5ffff94a5ff009ca5ff089ca5ff109ca5ff199ca5ff219ca5ff299ca5ff319ca5ff3a9ca5ff429ca5ff4a9ca5ff529ca5ff5a9ca5ff639ca5ff6b9ca5ff739ca5ff7b9ca5ff849ca5ff8c9ca5ff949ca5ff9c9ca5ffa59ca5ffad9ca5ffb59ca5ffbd9ca5ffc59ca5ffce9ca5ffd69ca5ffde9ca5ffe69ca5ffef9ca5fff79ca5ffff9ca5ff00a5a5ff08a5a5ff10a5a5ff19a5a5ff21a5a5ff29a5a5ff31a5a5ff3aa5a5ff42a5a5ff4aa5a5ff52a5a5ff5aa5a5ff63a5a5ff6ba5a5ff73a5a5ff7ba5a5ff84a5a5ff8ca5a5ff94a5a5ff9ca5a5ffa5a5a5ffada5a5ffb5a5a5ffbda5a5ffc5a5a5ffcea5a5ffd6a5a5ffdea5a5ffe6a5a5ffefa5a5fff7a5a5ffffa5a5ff00ada5ff08ada5ff10ada5ff19ada5ff21ada5ff29ada5ff31ada5ff3aada5ff42ada5ff4aada5ff52ada5ff5aada5ff63ada5ff6bada5ff73ada5ff7bada5ff84ada5ff8cada5ff94ada5ff9cada5ffa5ada5ffadada5ffb5ada5ffbdada5ffc5ada5ffceada5ffd6ada5ffdeada5ffe6ada5ffefada5fff7ada5ffffada5ff00b5a5ff08b5a5ff10b5a5ff19b5a5ff21b5a5ff29b5a5ff31b5a5ff3ab5a5ff42b5a5ff4ab5a5ff52b5a5ff5ab5a5ff63b5a5ff6bb5a5ff73b5a5ff7bb5a5ff84b5a5ff8cb5a5ff94b5a5ff9cb5a5ffa5b5a5ffadb5a5ffb5b5a5ffbdb5a5ffc5b5a5ffceb5a5ffd6b5a5ffdeb5a5ffe6b5a5ffefb5a5fff7b5a5ffffb5a5ff00bda5ff08bda5ff10bda5ff19bda5ff21bda5ff29bda5ff31bda5ff3abda5ff42bda5ff4abda5ff52bda5ff5abda5ff63bda5ff6bbda5ff73bda5ff7bbda5ff84bda5ff8cbda5ff94bda5ff9cbda5ffa5bda5ffadbda5ffb5bda5ffbdbda5ffc5bda5ffcebda5ffd6bda5ffdebda5ffe6bda5ffefbda5fff7bda5ffffbda5ff00c5a5ff08c5a5ff10c5a5ff19c5a5ff21c5a5ff29c5a5ff31c5a5ff3ac5a5ff42c5a5ff4ac5a5ff52c5a5ff5ac5a5ff63c5a5ff6bc5a5ff73c5a5ff7bc5a5ff84c5a5ff8cc5a5ff94c5a5ff9cc5a5ffa5c5a5ffadc5a5ffb5c5a5ffbdc5a5ffc5c5a5ffcec5a5ffd6c5a5ffdec5a5ffe6c5a5ffefc5a5fff7c5a5ffffc5a5ff00cea5ff08cea5ff10cea5ff19cea5ff21cea5ff29cea5ff31cea5ff3acea5ff42cea5ff4acea5ff52cea5ff5acea5ff63cea5ff6bcea5ff73cea5ff7bcea5ff84cea5ff8ccea5ff94cea5ff9ccea5ffa5cea5ffadcea5ffb5cea5ffbdcea5ffc5cea5ffcecea5ffd6cea5ffdecea5ffe6cea5ffefcea5fff7cea5ffffcea5ff00d6a5ff08d6a5ff10d6a5ff19d6a5ff21d6a5ff29d6a5ff31d6a5ff3ad6a5ff42d6a5ff4ad6a5ff52d6a5ff5ad6a5ff63d6a5ff6bd6a5ff73d6a5ff7bd6a5ff84d6a5ff8cd6a5ff94d6a5ff9cd6a5ffa5d6a5ffadd6a5ffb5d6a5ffbdd6a5ffc5d6a5ffced6a5ffd6d6a5ffded6a5ffe6d6a5ffefd6a5fff7d6a5ffffd6a5ff00dea5ff08dea5ff10dea5ff19dea5ff21dea5ff29dea5ff31dea5ff3adea5ff42dea5ff4adea5ff52dea5ff5adea5ff63dea5ff6bdea5ff73dea5ff7bdea5ff84dea5ff8cdea5ff94dea5ff9cdea5ffa5dea5ffaddea5ffb5dea5ffbddea5ffc5dea5ffcedea5ffd6dea5ffdedea5ffe6dea5ffefdea5fff7dea5ffffdea5ff00e6a5ff08e6a5ff10e6a5ff19e6a5ff21e6a5ff29e6a5ff31e6a5ff3ae6a5ff42e6a5ff4ae6a5ff52e6a5ff5ae6a5ff63e6a5ff6be6a5ff73e6a5ff7be6a5ff84e6a5ff8ce6a5ff94e6a5ff9ce6a5ffa5e6a5ffade6a5ffb5e6a5ffbde6a5ffc5e6a5ffcee6a5ffd6e6a5ffdee6a5ffe6e6a5ffefe6a5fff7e6a5ffffe6a5ff00efa5ff08efa5ff10efa5ff19efa5ff21efa5ff29efa5ff31efa5ff3aefa5ff42efa5ff4aefa5ff52efa5ff5aefa5ff63efa5ff6befa5ff73efa5ff7befa5ff84efa5ff8cefa5ff94efa5ff9cefa5ffa5efa5ffadefa5ffb5efa5ffbdefa5ffc5efa5ffceefa5ffd6efa5ffdeefa5ffe6efa5ffefefa5fff7efa5ffffefa5ff00f7a5ff08f7a5ff10f7a5ff19f7a5ff21f7a5ff29f7a5ff31f7a5ff3af7a5ff42f7a5ff4af7a5ff52f7a5ff5af7a5ff63f7a5ff6bf7a5ff73f7a5ff7bf7a5ff84f7a5ff8cf7a5ff94f7a5ff9cf7a5ffa5f7a5ffadf7a5ffb5f7a5ffbdf7a5ffc5f7a5ffcef7a5ffd6f7a5ffdef7a5ffe6f7a5ffeff7a5fff7f7a5fffff7a5ff00ffa5ff08ffa5ff10ffa5ff19ffa5ff21ffa5ff29ffa5ff31ffa5ff3affa5ff42ffa5ff4affa5ff52ffa5ff5affa5ff63ffa5ff6bffa5ff73ffa5ff7bffa5ff84ffa5ff8cffa5ff94ffa5ff9cffa5ffa5ffa5ffadffa5ffb5ffa5ffbdffa5ffc5ffa5ffceffa5ffd6ffa5ffdeffa5ffe6ffa5ffefffa5fff7ffa5ffffffa5ff0000adff0800adff1000adff1900adff2100adff2900adff3100adff3a00adff4200adff4a00adff5200adff5a00adff6300adff6b00adff7300adff7b00adff8400adff8c00adff9400adff9c00adffa500adffad00adffb500adffbd00adffc500adffce00adffd600adffde00adffe600adffef00adfff700adffff00adff0008adff0808adff1008adff1908adff2108adff2908adff3108adff3a08adff4208adff4a08adff5208adff5a08adff6308adff6b08adff7308adff7b08adff8408adff8c08adff9408adff9c08adffa508adffad08adffb508adffbd08adffc508adffce08adffd608adffde08adffe608adffef08adfff708adffff08adff0010adff0810adff1010adff1910adff2110adff2910adff3110adff3a10adff4210adff4a10adff5210adff5a10adff6310adff6b10adff7310adff7b10adff8410adff8c10adff9410adff9c10adffa510adffad10adffb510adffbd10adffc510adffce10adffd610adffde10adffe610adffef10adfff710adffff10adff0019adff0819adff1019adff1919adff2119adff2919adff3119adff3a19adff4219adff4a19adff5219adff5a19adff6319adff6b19adff7319adff7b19adff8419adff8c19adff9419adff9c19adffa519adffad19adffb519adffbd19adffc519adffce19adffd619adffde19adffe619adffef19adfff719adffff19adff0021adff0821adff1021adff1921adff2121adff2921adff3121adff3a21adff4221adff4a21adff5221adff5a21adff6321adff6b21adff7321adff7b21adff8421adff8c21adff9421adff9c21adffa521adffad21adffb521adffbd21adffc521adffce21adffd621adffde21adffe621adffef21adfff721adffff21adff0029adff0829adff1029adff1929adff2129adff2929adff3129adff3a29adff4229adff4a29adff5229adff5a29adff6329adff6b29adff7329adff7b29adff8429adff8c29adff9429adff9c29adffa529adffad29adffb529adffbd29adffc529adffce29adffd629adffde29adffe629adffef29adfff729adffff29adff0031adff0831adff1031adff1931adff2131adff2931adff3131adff3a31adff4231adff4a31adff5231adff5a31adff6331adff6b31adff7331adff7b31adff8431adff8c31adff9431adff9c31adffa531adffad31adffb531adffbd31adffc531adffce31adffd631adffde31adffe631adffef31adfff731adffff31adff003aadff083aadff103aadff193aadff213aadff293aadff313aadff3a3aadff423aadff4a3aadff523aadff5a3aadff633aadff6b3aadff733aadff7b3aadff843aadff8c3aadff943aadff9c3aadffa53aadffad3aadffb53aadffbd3aadffc53aadffce3aadffd63aadffde3aadffe63aadffef3aadfff73aadffff3aadff0042adff0842adff1042adff1942adff2142adff2942adff3142adff3a42adff4242adff4a42adff5242adff5a42adff6342adff6b42adff7342adff7b42adff8442adff8c42adff9442adff9c42adffa542adffad42adffb542adffbd42adffc542adffce42adffd642adffde42adffe642adffef42adfff742adffff42adff004aadff084aadff104aadff194aadff214aadff294aadff314aadff3a4aadff424aadff4a4aadff524aadff5a4aadff634aadff6b4aadff734aadff7b4aadff844aadff8c4aadff944aadff9c4aadffa54aadffad4aadffb54aadffbd4aadffc54aadffce4aadffd64aadffde4aadffe64aadffef4aadfff74aadffff4aadff0052adff0852adff1052adff1952adff2152adff2952adff3152adff3a52adff4252adff4a52adff5252adff5a52adff6352adff6b52adff7352adff7b52adff8452adff8c52adff9452adff9c52adffa552adffad52adffb552adffbd52adffc552adffce52adffd652adffde52adffe652adffef52adfff752adffff52adff005aadff085aadff105aadff195aadff215aadff295aadff315aadff3a5aadff425aadff4a5aadff525aadff5a5aadff635aadff6b5aadff735aadff7b5aadff845aadff8c5aadff945aadff9c5aadffa55aadffad5aadffb55aadffbd5aadffc55aadffce5aadffd65aadffde5aadffe65aadffef5aadfff75aadffff5aadff0063adff0863adff1063adff1963adff2163adff2963adff3163adff3a63adff4263adff4a63adff5263adff5a63adff6363adff6b63adff7363adff7b63adff8463adff8c63adff9463adff9c63adffa563adffad63adffb563adffbd63adffc563adffce63adffd663adffde63adffe663adffef63adfff763adffff63adff006badff086badff106badff196badff216badff296badff316badff3a6badff426badff4a6badff526badff5a6badff636badff6b6badff736badff7b6badff846badff8c6badff946badff9c6badffa56badffad6badffb56badffbd6badffc56badffce6badffd66badffde6badffe66badffef6badfff76badffff6badff0073adff0873adff1073adff1973adff2173adff2973adff3173adff3a73adff4273adff4a73adff5273adff5a73adff6373adff6b73adff7373adff7b73adff8473adff8c73adff9473adff9c73adffa573adffad73adffb573adffbd73adffc573adffce73adffd673adffde73adffe673adffef73adfff773adffff73adff007badff087badff107badff197badff217badff297badff317badff3a7badff427badff4a7badff527badff5a7badff637badff6b7badff737badff7b7badff847badff8c7badff947badff9c7badffa57badffad7badffb57badffbd7badffc57badffce7badffd67badffde7badffe67badffef7badfff77badffff7badff0084adff0884adff1084adff1984adff2184adff2984adff3184adff3a84adff4284adff4a84adff5284adff5a84adff6384adff6b84adff7384adff7b84adff8484adff8c84adff9484adff9c84adffa584adffad84adffb584adffbd84adffc584adffce84adffd684adffde84adffe684adffef84adfff784adffff84adff008cadff088cadff108cadff198cadff218cadff298cadff318cadff3a8cadff428cadff4a8cadff528cadff5a8cadff638cadff6b8cadff738cadff7b8cadff848cadff8c8cadff948cadff9c8cadffa58cadffad8cadffb58cadffbd8cadffc58cadffce8cadffd68cadffde8cadffe68cadffef8cadfff78cadffff8cadff0094adff0894adff1094adff1994adff2194adff2994adff3194adff3a94adff4294adff4a94adff5294adff5a94adff6394adff6b94adff7394adff7b94adff8494adff8c94adff9494adff9c94adffa594adffad94adffb594adffbd94adffc594adffce94adffd694adffde94adffe694adffef94adfff794adffff94adff009cadff089cadff109cadff199cadff219cadff299cadff319cadff3a9cadff429cadff4a9cadff529cadff5a9cadff639cadff6b9cadff739cadff7b9cadff849cadff8c9cadff949cadff9c9cadffa59cadffad9cadffb59cadffbd9cadffc59cadffce9cadffd69cadffde9cadffe69cadffef9cadfff79cadffff9cadff00a5adff08a5adff10a5adff19a5adff21a5adff29a5adff31a5adff3aa5adff42a5adff4aa5adff52a5adff5aa5adff63a5adff6ba5adff73a5adff7ba5adff84a5adff8ca5adff94a5adff9ca5adffa5a5adffada5adffb5a5adffbda5adffc5a5adffcea5adffd6a5adffdea5adffe6a5adffefa5adfff7a5adffffa5adff00adadff08adadff10adadff19adadff21adadff29adadff31adadff3aadadff42adadff4aadadff52adadff5aadadff63adadff6badadff73adadff7badadff84adadff8cadadff94adadff9cadadffa5adadffadadadffb5adadffbdadadffc5adadffceadadffd6adadffdeadadffe6adadffefadadfff7adadffffadadff00b5adff08b5adff10b5adff19b5adff21b5adff29b5adff31b5adff3ab5adff42b5adff4ab5adff52b5adff5ab5adff63b5adff6bb5adff73b5adff7bb5adff84b5adff8cb5adff94b5adff9cb5adffa5b5adffadb5adffb5b5adffbdb5adffc5b5adffceb5adffd6b5adffdeb5adffe6b5adffefb5adfff7b5adffffb5adff00bdadff08bdadff10bdadff19bdadff21bdadff29bdadff31bdadff3abdadff42bdadff4abdadff52bdadff5abdadff63bdadff6bbdadff73bdadff7bbdadff84bdadff8cbdadff94bdadff9cbdadffa5bdadffadbdadffb5bdadffbdbdadffc5bdadffcebdadffd6bdadffdebdadffe6bdadffefbdadfff7bdadffffbdadff00c5adff08c5adff10c5adff19c5adff21c5adff29c5adff31c5adff3ac5adff42c5adff4ac5adff52c5adff5ac5adff63c5adff6bc5adff73c5adff7bc5adff84c5adff8cc5adff94c5adff9cc5adffa5c5adffadc5adffb5c5adffbdc5adffc5c5adffcec5adffd6c5adffdec5adffe6c5adffefc5adfff7c5adffffc5adff00ceadff08ceadff10ceadff19ceadff21ceadff29ceadff31ceadff3aceadff42ceadff4aceadff52ceadff5aceadff63ceadff6bceadff73ceadff7bceadff84ceadff8cceadff94ceadff9cceadffa5ceadffadceadffb5ceadffbdceadffc5ceadffceceadffd6ceadffdeceadffe6ceadffefceadfff7ceadffffceadff00d6adff08d6adff10d6adff19d6adff21d6adff29d6adff31d6adff3ad6adff42d6adff4ad6adff52d6adff5ad6adff63d6adff6bd6adff73d6adff7bd6adff84d6adff8cd6adff94d6adff9cd6adffa5d6adffadd6adffb5d6adffbdd6adffc5d6adffced6adffd6d6adffded6adffe6d6adffefd6adfff7d6adffffd6adff00deadff08deadff10deadff19deadff21deadff29deadff31deadff3adeadff42deadff4adeadff52deadff5adeadff63deadff6bdeadff73deadff7bdeadff84deadff8cdeadff94deadff9cdeadffa5deadffaddeadffb5deadffbddeadffc5deadffcedeadffd6deadffdedeadffe6deadffefdeadfff7deadffffdeadff00e6adff08e6adff10e6adff19e6adff21e6adff29e6adff31e6adff3ae6adff42e6adff4ae6adff52e6adff5ae6adff63e6adff6be6adff73e6adff7be6adff84e6adff8ce6adff94e6adff9ce6adffa5e6adffade6adffb5e6adffbde6adffc5e6adffcee6adffd6e6adffdee6adffe6e6adffefe6adfff7e6adffffe6adff00efadff08efadff10efadff19efadff21efadff29efadff31efadff3aefadff42efadff4aefadff52efadff5aefadff63efadff6befadff73efadff7befadff84efadff8cefadff94efadff9cefadffa5efadffadefadffb5efadffbdefadffc5efadffceefadffd6efadffdeefadffe6efadffefefadfff7efadffffefadff00f7adff08f7adff10f7adff19f7adff21f7adff29f7adff31f7adff3af7adff42f7adff4af7adff52f7adff5af7adff63f7adff6bf7adff73f7adff7bf7adff84f7adff8cf7adff94f7adff9cf7adffa5f7adffadf7adffb5f7adffbdf7adffc5f7adffcef7adffd6f7adffdef7adffe6f7adffeff7adfff7f7adfffff7adff00ffadff08ffadff10ffadff19ffadff21ffadff29ffadff31ffadff3affadff42ffadff4affadff52ffadff5affadff63ffadff6bffadff73ffadff7bffadff84ffadff8cffadff94ffadff9cffadffa5ffadffadffadffb5ffadffbdffadffc5ffadffceffadffd6ffadffdeffadffe6ffadffefffadfff7ffadffffffadff0000b5ff0800b5ff1000b5ff1900b5ff2100b5ff2900b5ff3100b5ff3a00b5ff4200b5ff4a00b5ff5200b5ff5a00b5ff6300b5ff6b00b5ff7300b5ff7b00b5ff8400b5ff8c00b5ff9400b5ff9c00b5ffa500b5ffad00b5ffb500b5ffbd00b5ffc500b5ffce00b5ffd600b5ffde00b5ffe600b5ffef00b5fff700b5ffff00b5ff0008b5ff0808b5ff1008b5ff1908b5ff2108b5ff2908b5ff3108b5ff3a08b5ff4208b5ff4a08b5ff5208b5ff5a08b5ff6308b5ff6b08b5ff7308b5ff7b08b5ff8408b5ff8c08b5ff9408b5ff9c08b5ffa508b5ffad08b5ffb508b5ffbd08b5ffc508b5ffce08b5ffd608b5ffde08b5ffe608b5ffef08b5fff708b5ffff08b5ff0010b5ff0810b5ff1010b5ff1910b5ff2110b5ff2910b5ff3110b5ff3a10b5ff4210b5ff4a10b5ff5210b5ff5a10b5ff6310b5ff6b10b5ff7310b5ff7b10b5ff8410b5ff8c10b5ff9410b5ff9c10b5ffa510b5ffad10b5ffb510b5ffbd10b5ffc510b5ffce10b5ffd610b5ffde10b5ffe610b5ffef10b5fff710b5ffff10b5ff0019b5ff0819b5ff1019b5ff1919b5ff2119b5ff2919b5ff3119b5ff3a19b5ff4219b5ff4a19b5ff5219b5ff5a19b5ff6319b5ff6b19b5ff7319b5ff7b19b5ff8419b5ff8c19b5ff9419b5ff9c19b5ffa519b5ffad19b5ffb519b5ffbd19b5ffc519b5ffce19b5ffd619b5ffde19b5ffe619b5ffef19b5fff719b5ffff19b5ff0021b5ff0821b5ff1021b5ff1921b5ff2121b5ff2921b5ff3121b5ff3a21b5ff4221b5ff4a21b5ff5221b5ff5a21b5ff6321b5ff6b21b5ff7321b5ff7b21b5ff8421b5ff8c21b5ff9421b5ff9c21b5ffa521b5ffad21b5ffb521b5ffbd21b5ffc521b5ffce21b5ffd621b5ffde21b5ffe621b5ffef21b5fff721b5ffff21b5ff0029b5ff0829b5ff1029b5ff1929b5ff2129b5ff2929b5ff3129b5ff3a29b5ff4229b5ff4a29b5ff5229b5ff5a29b5ff6329b5ff6b29b5ff7329b5ff7b29b5ff8429b5ff8c29b5ff9429b5ff9c29b5ffa529b5ffad29b5ffb529b5ffbd29b5ffc529b5ffce29b5ffd629b5ffde29b5ffe629b5ffef29b5fff729b5ffff29b5ff0031b5ff0831b5ff1031b5ff1931b5ff2131b5ff2931b5ff3131b5ff3a31b5ff4231b5ff4a31b5ff5231b5ff5a31b5ff6331b5ff6b31b5ff7331b5ff7b31b5ff8431b5ff8c31b5ff9431b5ff9c31b5ffa531b5ffad31b5ffb531b5ffbd31b5ffc531b5ffce31b5ffd631b5ffde31b5ffe631b5ffef31b5fff731b5ffff31b5ff003ab5ff083ab5ff103ab5ff193ab5ff213ab5ff293ab5ff313ab5ff3a3ab5ff423ab5ff4a3ab5ff523ab5ff5a3ab5ff633ab5ff6b3ab5ff733ab5ff7b3ab5ff843ab5ff8c3ab5ff943ab5ff9c3ab5ffa53ab5ffad3ab5ffb53ab5ffbd3ab5ffc53ab5ffce3ab5ffd63ab5ffde3ab5ffe63ab5ffef3ab5fff73ab5ffff3ab5ff0042b5ff0842b5ff1042b5ff1942b5ff2142b5ff2942b5ff3142b5ff3a42b5ff4242b5ff4a42b5ff5242b5ff5a42b5ff6342b5ff6b42b5ff7342b5ff7b42b5ff8442b5ff8c42b5ff9442b5ff9c42b5ffa542b5ffad42b5ffb542b5ffbd42b5ffc542b5ffce42b5ffd642b5ffde42b5ffe642b5ffef42b5fff742b5ffff42b5ff004ab5ff084ab5ff104ab5ff194ab5ff214ab5ff294ab5ff314ab5ff3a4ab5ff424ab5ff4a4ab5ff524ab5ff5a4ab5ff634ab5ff6b4ab5ff734ab5ff7b4ab5ff844ab5ff8c4ab5ff944ab5ff9c4ab5ffa54ab5ffad4ab5ffb54ab5ffbd4ab5ffc54ab5ffce4ab5ffd64ab5ffde4ab5ffe64ab5ffef4ab5fff74ab5ffff4ab5ff0052b5ff0852b5ff1052b5ff1952b5ff2152b5ff2952b5ff3152b5ff3a52b5ff4252b5ff4a52b5ff5252b5ff5a52b5ff6352b5ff6b52b5ff7352b5ff7b52b5ff8452b5ff8c52b5ff9452b5ff9c52b5ffa552b5ffad52b5ffb552b5ffbd52b5ffc552b5ffce52b5ffd652b5ffde52b5ffe652b5ffef52b5fff752b5ffff52b5ff005ab5ff085ab5ff105ab5ff195ab5ff215ab5ff295ab5ff315ab5ff3a5ab5ff425ab5ff4a5ab5ff525ab5ff5a5ab5ff635ab5ff6b5ab5ff735ab5ff7b5ab5ff845ab5ff8c5ab5ff945ab5ff9c5ab5ffa55ab5ffad5ab5ffb55ab5ffbd5ab5ffc55ab5ffce5ab5ffd65ab5ffde5ab5ffe65ab5ffef5ab5fff75ab5ffff5ab5ff0063b5ff0863b5ff1063b5ff1963b5ff2163b5ff2963b5ff3163b5ff3a63b5ff4263b5ff4a63b5ff5263b5ff5a63b5ff6363b5ff6b63b5ff7363b5ff7b63b5ff8463b5ff8c63b5ff9463b5ff9c63b5ffa563b5ffad63b5ffb563b5ffbd63b5ffc563b5ffce63b5ffd663b5ffde63b5ffe663b5ffef63b5fff763b5ffff63b5ff006bb5ff086bb5ff106bb5ff196bb5ff216bb5ff296bb5ff316bb5ff3a6bb5ff426bb5ff4a6bb5ff526bb5ff5a6bb5ff636bb5ff6b6bb5ff736bb5ff7b6bb5ff846bb5ff8c6bb5ff946bb5ff9c6bb5ffa56bb5ffad6bb5ffb56bb5ffbd6bb5ffc56bb5ffce6bb5ffd66bb5ffde6bb5ffe66bb5ffef6bb5fff76bb5ffff6bb5ff0073b5ff0873b5ff1073b5ff1973b5ff2173b5ff2973b5ff3173b5ff3a73b5ff4273b5ff4a73b5ff5273b5ff5a73b5ff6373b5ff6b73b5ff7373b5ff7b73b5ff8473b5ff8c73b5ff9473b5ff9c73b5ffa573b5ffad73b5ffb573b5ffbd73b5ffc573b5ffce73b5ffd673b5ffde73b5ffe673b5ffef73b5fff773b5ffff73b5ff007bb5ff087bb5ff107bb5ff197bb5ff217bb5ff297bb5ff317bb5ff3a7bb5ff427bb5ff4a7bb5ff527bb5ff5a7bb5ff637bb5ff6b7bb5ff737bb5ff7b7bb5ff847bb5ff8c7bb5ff947bb5ff9c7bb5ffa57bb5ffad7bb5ffb57bb5ffbd7bb5ffc57bb5ffce7bb5ffd67bb5ffde7bb5ffe67bb5ffef7bb5fff77bb5ffff7bb5ff0084b5ff0884b5ff1084b5ff1984b5ff2184b5ff2984b5ff3184b5ff3a84b5ff4284b5ff4a84b5ff5284b5ff5a84b5ff6384b5ff6b84b5ff7384b5ff7b84b5ff8484b5ff8c84b5ff9484b5ff9c84b5ffa584b5ffad84b5ffb584b5ffbd84b5ffc584b5ffce84b5ffd684b5ffde84b5ffe684b5ffef84b5fff784b5ffff84b5ff008cb5ff088cb5ff108cb5ff198cb5ff218cb5ff298cb5ff318cb5ff3a8cb5ff428cb5ff4a8cb5ff528cb5ff5a8cb5ff638cb5ff6b8cb5ff738cb5ff7b8cb5ff848cb5ff8c8cb5ff948cb5ff9c8cb5ffa58cb5ffad8cb5ffb58cb5ffbd8cb5ffc58cb5ffce8cb5ffd68cb5ffde8cb5ffe68cb5ffef8cb5fff78cb5ffff8cb5ff0094b5ff0894b5ff1094b5ff1994b5ff2194b5ff2994b5ff3194b5ff3a94b5ff4294b5ff4a94b5ff5294b5ff5a94b5ff6394b5ff6b94b5ff7394b5ff7b94b5ff8494b5ff8c94b5ff9494b5ff9c94b5ffa594b5ffad94b5ffb594b5ffbd94b5ffc594b5ffce94b5ffd694b5ffde94b5ffe694b5ffef94b5fff794b5ffff94b5ff009cb5ff089cb5ff109cb5ff199cb5ff219cb5ff299cb5ff319cb5ff3a9cb5ff429cb5ff4a9cb5ff529cb5ff5a9cb5ff639cb5ff6b9cb5ff739cb5ff7b9cb5ff849cb5ff8c9cb5ff949cb5ff9c9cb5ffa59cb5ffad9cb5ffb59cb5ffbd9cb5ffc59cb5ffce9cb5ffd69cb5ffde9cb5ffe69cb5ffef9cb5fff79cb5ffff9cb5ff00a5b5ff08a5b5ff10a5b5ff19a5b5ff21a5b5ff29a5b5ff31a5b5ff3aa5b5ff42a5b5ff4aa5b5ff52a5b5ff5aa5b5ff63a5b5ff6ba5b5ff73a5b5ff7ba5b5ff84a5b5ff8ca5b5ff94a5b5ff9ca5b5ffa5a5b5ffada5b5ffb5a5b5ffbda5b5ffc5a5b5ffcea5b5ffd6a5b5ffdea5b5ffe6a5b5ffefa5b5fff7a5b5ffffa5b5ff00adb5ff08adb5ff10adb5ff19adb5ff21adb5ff29adb5ff31adb5ff3aadb5ff42adb5ff4aadb5ff52adb5ff5aadb5ff63adb5ff6badb5ff73adb5ff7badb5ff84adb5ff8cadb5ff94adb5ff9cadb5ffa5adb5ffadadb5ffb5adb5ffbdadb5ffc5adb5ffceadb5ffd6adb5ffdeadb5ffe6adb5ffefadb5fff7adb5ffffadb5ff00b5b5ff08b5b5ff10b5b5ff19b5b5ff21b5b5ff29b5b5ff31b5b5ff3ab5b5ff42b5b5ff4ab5b5ff52b5b5ff5ab5b5ff63b5b5ff6bb5b5ff73b5b5ff7bb5b5ff84b5b5ff8cb5b5ff94b5b5ff9cb5b5ffa5b5b5ffadb5b5ffb5b5b5ffbdb5b5ffc5b5b5ffceb5b5ffd6b5b5ffdeb5b5ffe6b5b5ffefb5b5fff7b5b5ffffb5b5ff00bdb5ff08bdb5ff10bdb5ff19bdb5ff21bdb5ff29bdb5ff31bdb5ff3abdb5ff42bdb5ff4abdb5ff52bdb5ff5abdb5ff63bdb5ff6bbdb5ff73bdb5ff7bbdb5ff84bdb5ff8cbdb5ff94bdb5ff9cbdb5ffa5bdb5ffadbdb5ffb5bdb5ffbdbdb5ffc5bdb5ffcebdb5ffd6bdb5ffdebdb5ffe6bdb5ffefbdb5fff7bdb5ffffbdb5ff00c5b5ff08c5b5ff10c5b5ff19c5b5ff21c5b5ff29c5b5ff31c5b5ff3ac5b5ff42c5b5ff4ac5b5ff52c5b5ff5ac5b5ff63c5b5ff6bc5b5ff73c5b5ff7bc5b5ff84c5b5ff8cc5b5ff94c5b5ff9cc5b5ffa5c5b5ffadc5b5ffb5c5b5ffbdc5b5ffc5c5b5ffcec5b5ffd6c5b5ffdec5b5ffe6c5b5ffefc5b5fff7c5b5ffffc5b5ff00ceb5ff08ceb5ff10ceb5ff19ceb5ff21ceb5ff29ceb5ff31ceb5ff3aceb5ff42ceb5ff4aceb5ff52ceb5ff5aceb5ff63ceb5ff6bceb5ff73ceb5ff7bceb5ff84ceb5ff8cceb5ff94ceb5ff9cceb5ffa5ceb5ffadceb5ffb5ceb5ffbdceb5ffc5ceb5ffceceb5ffd6ceb5ffdeceb5ffe6ceb5ffefceb5fff7ceb5ffffceb5ff00d6b5ff08d6b5ff10d6b5ff19d6b5ff21d6b5ff29d6b5ff31d6b5ff3ad6b5ff42d6b5ff4ad6b5ff52d6b5ff5ad6b5ff63d6b5ff6bd6b5ff73d6b5ff7bd6b5ff84d6b5ff8cd6b5ff94d6b5ff9cd6b5ffa5d6b5ffadd6b5ffb5d6b5ffbdd6b5ffc5d6b5ffced6b5ffd6d6b5ffded6b5ffe6d6b5ffefd6b5fff7d6b5ffffd6b5ff00deb5ff08deb5ff10deb5ff19deb5ff21deb5ff29deb5ff31deb5ff3adeb5ff42deb5ff4adeb5ff52deb5ff5adeb5ff63deb5ff6bdeb5ff73deb5ff7bdeb5ff84deb5ff8cdeb5ff94deb5ff9cdeb5ffa5deb5ffaddeb5ffb5deb5ffbddeb5ffc5deb5ffcedeb5ffd6deb5ffdedeb5ffe6deb5ffefdeb5fff7deb5ffffdeb5ff00e6b5ff08e6b5ff10e6b5ff19e6b5ff21e6b5ff29e6b5ff31e6b5ff3ae6b5ff42e6b5ff4ae6b5ff52e6b5ff5ae6b5ff63e6b5ff6be6b5ff73e6b5ff7be6b5ff84e6b5ff8ce6b5ff94e6b5ff9ce6b5ffa5e6b5ffade6b5ffb5e6b5ffbde6b5ffc5e6b5ffcee6b5ffd6e6b5ffdee6b5ffe6e6b5ffefe6b5fff7e6b5ffffe6b5ff00efb5ff08efb5ff10efb5ff19efb5ff21efb5ff29efb5ff31efb5ff3aefb5ff42efb5ff4aefb5ff52efb5ff5aefb5ff63efb5ff6befb5ff73efb5ff7befb5ff84efb5ff8cefb5ff94efb5ff9cefb5ffa5efb5ffadefb5ffb5efb5ffbdefb5ffc5efb5ffceefb5ffd6efb5ffdeefb5ffe6efb5ffefefb5fff7efb5ffffefb5ff00f7b5ff08f7b5ff10f7b5ff19f7b5ff21f7b5ff29f7b5ff31f7b5ff3af7b5ff42f7b5ff4af7b5ff52f7b5ff5af7b5ff63f7b5ff6bf7b5ff73f7b5ff7bf7b5ff84f7b5ff8cf7b5ff94f7b5ff9cf7b5ffa5f7b5ffadf7b5ffb5f7b5ffbdf7b5ffc5f7b5ffcef7b5ffd6f7b5ffdef7b5ffe6f7b5ffeff7b5fff7f7b5fffff7b5ff00ffb5ff08ffb5ff10ffb5ff19ffb5ff21ffb5ff29ffb5ff31ffb5ff3affb5ff42ffb5ff4affb5ff52ffb5ff5affb5ff63ffb5ff6bffb5ff73ffb5ff7bffb5ff84ffb5ff8cffb5ff94ffb5ff9cffb5ffa5ffb5ffadffb5ffb5ffb5ffbdffb5ffc5ffb5ffceffb5ffd6ffb5ffdeffb5ffe6ffb5ffefffb5fff7ffb5ffffffb5ff0000bdff0800bdff1000bdff1900bdff2100bdff2900bdff3100bdff3a00bdff4200bdff4a00bdff5200bdff5a00bdff6300bdff6b00bdff7300bdff7b00bdff8400bdff8c00bdff9400bdff9c00bdffa500bdffad00bdffb500bdffbd00bdffc500bdffce00bdffd600bdffde00bdffe600bdffef00bdfff700bdffff00bdff0008bdff0808bdff1008bdff1908bdff2108bdff2908bdff3108bdff3a08bdff4208bdff4a08bdff5208bdff5a08bdff6308bdff6b08bdff7308bdff7b08bdff8408bdff8c08bdff9408bdff9c08bdffa508bdffad08bdffb508bdffbd08bdffc508bdffce08bdffd608bdffde08bdffe608bdffef08bdfff708bdffff08bdff0010bdff0810bdff1010bdff1910bdff2110bdff2910bdff3110bdff3a10bdff4210bdff4a10bdff5210bdff5a10bdff6310bdff6b10bdff7310bdff7b10bdff8410bdff8c10bdff9410bdff9c10bdffa510bdffad10bdffb510bdffbd10bdffc510bdffce10bdffd610bdffde10bdffe610bdffef10bdfff710bdffff10bdff0019bdff0819bdff1019bdff1919bdff2119bdff2919bdff3119bdff3a19bdff4219bdff4a19bdff5219bdff5a19bdff6319bdff6b19bdff7319bdff7b19bdff8419bdff8c19bdff9419bdff9c19bdffa519bdffad19bdffb519bdffbd19bdffc519bdffce19bdffd619bdffde19bdffe619bdffef19bdfff719bdffff19bdff0021bdff0821bdff1021bdff1921bdff2121bdff2921bdff3121bdff3a21bdff4221bdff4a21bdff5221bdff5a21bdff6321bdff6b21bdff7321bdff7b21bdff8421bdff8c21bdff9421bdff9c21bdffa521bdffad21bdffb521bdffbd21bdffc521bdffce21bdffd621bdffde21bdffe621bdffef21bdfff721bdffff21bdff0029bdff0829bdff1029bdff1929bdff2129bdff2929bdff3129bdff3a29bdff4229bdff4a29bdff5229bdff5a29bdff6329bdff6b29bdff7329bdff7b29bdff8429bdff8c29bdff9429bdff9c29bdffa529bdffad29bdffb529bdffbd29bdffc529bdffce29bdffd629bdffde29bdffe629bdffef29bdfff729bdffff29bdff0031bdff0831bdff1031bdff1931bdff2131bdff2931bdff3131bdff3a31bdff4231bdff4a31bdff5231bdff5a31bdff6331bdff6b31bdff7331bdff7b31bdff8431bdff8c31bdff9431bdff9c31bdffa531bdffad31bdffb531bdffbd31bdffc531bdffce31bdffd631bdffde31bdffe631bdffef31bdfff731bdffff31bdff003abdff083abdff103abdff193abdff213abdff293abdff313abdff3a3abdff423abdff4a3abdff523abdff5a3abdff633abdff6b3abdff733abdff7b3abdff843abdff8c3abdff943abdff9c3abdffa53abdffad3abdffb53abdffbd3abdffc53abdffce3abdffd63abdffde3abdffe63abdffef3abdfff73abdffff3abdff0042bdff0842bdff1042bdff1942bdff2142bdff2942bdff3142bdff3a42bdff4242bdff4a42bdff5242bdff5a42bdff6342bdff6b42bdff7342bdff7b42bdff8442bdff8c42bdff9442bdff9c42bdffa542bdffad42bdffb542bdffbd42bdffc542bdffce42bdffd642bdffde42bdffe642bdffef42bdfff742bdffff42bdff004abdff084abdff104abdff194abdff214abdff294abdff314abdff3a4abdff424abdff4a4abdff524abdff5a4abdff634abdff6b4abdff734abdff7b4abdff844abdff8c4abdff944abdff9c4abdffa54abdffad4abdffb54abdffbd4abdffc54abdffce4abdffd64abdffde4abdffe64abdffef4abdfff74abdffff4abdff0052bdff0852bdff1052bdff1952bdff2152bdff2952bdff3152bdff3a52bdff4252bdff4a52bdff5252bdff5a52bdff6352bdff6b52bdff7352bdff7b52bdff8452bdff8c52bdff9452bdff9c52bdffa552bdffad52bdffb552bdffbd52bdffc552bdffce52bdffd652bdffde52bdffe652bdffef52bdfff752bdffff52bdff005abdff085abdff105abdff195abdff215abdff295abdff315abdff3a5abdff425abdff4a5abdff525abdff5a5abdff635abdff6b5abdff735abdff7b5abdff845abdff8c5abdff945abdff9c5abdffa55abdffad5abdffb55abdffbd5abdffc55abdffce5abdffd65abdffde5abdffe65abdffef5abdfff75abdffff5abdff0063bdff0863bdff1063bdff1963bdff2163bdff2963bdff3163bdff3a63bdff4263bdff4a63bdff5263bdff5a63bdff6363bdff6b63bdff7363bdff7b63bdff8463bdff8c63bdff9463bdff9c63bdffa563bdffad63bdffb563bdffbd63bdffc563bdffce63bdffd663bdffde63bdffe663bdffef63bdfff763bdffff63bdff006bbdff086bbdff106bbdff196bbdff216bbdff296bbdff316bbdff3a6bbdff426bbdff4a6bbdff526bbdff5a6bbdff636bbdff6b6bbdff736bbdff7b6bbdff846bbdff8c6bbdff946bbdff9c6bbdffa56bbdffad6bbdffb56bbdffbd6bbdffc56bbdffce6bbdffd66bbdffde6bbdffe66bbdffef6bbdfff76bbdffff6bbdff0073bdff0873bdff1073bdff1973bdff2173bdff2973bdff3173bdff3a73bdff4273bdff4a73bdff5273bdff5a73bdff6373bdff6b73bdff7373bdff7b73bdff8473bdff8c73bdff9473bdff9c73bdffa573bdffad73bdffb573bdffbd73bdffc573bdffce73bdffd673bdffde73bdffe673bdffef73bdfff773bdffff73bdff007bbdff087bbdff107bbdff197bbdff217bbdff297bbdff317bbdff3a7bbdff427bbdff4a7bbdff527bbdff5a7bbdff637bbdff6b7bbdff737bbdff7b7bbdff847bbdff8c7bbdff947bbdff9c7bbdffa57bbdffad7bbdffb57bbdffbd7bbdffc57bbdffce7bbdffd67bbdffde7bbdffe67bbdffef7bbdfff77bbdffff7bbdff0084bdff0884bdff1084bdff1984bdff2184bdff2984bdff3184bdff3a84bdff4284bdff4a84bdff5284bdff5a84bdff6384bdff6b84bdff7384bdff7b84bdff8484bdff8c84bdff9484bdff9c84bdffa584bdffad84bdffb584bdffbd84bdffc584bdffce84bdffd684bdffde84bdffe684bdffef84bdfff784bdffff84bdff008cbdff088cbdff108cbdff198cbdff218cbdff298cbdff318cbdff3a8cbdff428cbdff4a8cbdff528cbdff5a8cbdff638cbdff6b8cbdff738cbdff7b8cbdff848cbdff8c8cbdff948cbdff9c8cbdffa58cbdffad8cbdffb58cbdffbd8cbdffc58cbdffce8cbdffd68cbdffde8cbdffe68cbdffef8cbdfff78cbdffff8cbdff0094bdff0894bdff1094bdff1994bdff2194bdff2994bdff3194bdff3a94bdff4294bdff4a94bdff5294bdff5a94bdff6394bdff6b94bdff7394bdff7b94bdff8494bdff8c94bdff9494bdff9c94bdffa594bdffad94bdffb594bdffbd94bdffc594bdffce94bdffd694bdffde94bdffe694bdffef94bdfff794bdffff94bdff009cbdff089cbdff109cbdff199cbdff219cbdff299cbdff319cbdff3a9cbdff429cbdff4a9cbdff529cbdff5a9cbdff639cbdff6b9cbdff739cbdff7b9cbdff849cbdff8c9cbdff949cbdff9c9cbdffa59cbdffad9cbdffb59cbdffbd9cbdffc59cbdffce9cbdffd69cbdffde9cbdffe69cbdffef9cbdfff79cbdffff9cbdff00a5bdff08a5bdff10a5bdff19a5bdff21a5bdff29a5bdff31a5bdff3aa5bdff42a5bdff4aa5bdff52a5bdff5aa5bdff63a5bdff6ba5bdff73a5bdff7ba5bdff84a5bdff8ca5bdff94a5bdff9ca5bdffa5a5bdffada5bdffb5a5bdffbda5bdffc5a5bdffcea5bdffd6a5bdffdea5bdffe6a5bdffefa5bdfff7a5bdffffa5bdff00adbdff08adbdff10adbdff19adbdff21adbdff29adbdff31adbdff3aadbdff42adbdff4aadbdff52adbdff5aadbdff63adbdff6badbdff73adbdff7badbdff84adbdff8cadbdff94adbdff9cadbdffa5adbdffadadbdffb5adbdffbdadbdffc5adbdffceadbdffd6adbdffdeadbdffe6adbdffefadbdfff7adbdffffadbdff00b5bdff08b5bdff10b5bdff19b5bdff21b5bdff29b5bdff31b5bdff3ab5bdff42b5bdff4ab5bdff52b5bdff5ab5bdff63b5bdff6bb5bdff73b5bdff7bb5bdff84b5bdff8cb5bdff94b5bdff9cb5bdffa5b5bdffadb5bdffb5b5bdffbdb5bdffc5b5bdffceb5bdffd6b5bdffdeb5bdffe6b5bdffefb5bdfff7b5bdffffb5bdff00bdbdff08bdbdff10bdbdff19bdbdff21bdbdff29bdbdff31bdbdff3abdbdff42bdbdff4abdbdff52bdbdff5abdbdff63bdbdff6bbdbdff73bdbdff7bbdbdff84bdbdff8cbdbdff94bdbdff9cbdbdffa5bdbdffadbdbdffb5bdbdffbdbdbdffc5bdbdffcebdbdffd6bdbdffdebdbdffe6bdbdffefbdbdfff7bdbdffffbdbdff00c5bdff08c5bdff10c5bdff19c5bdff21c5bdff29c5bdff31c5bdff3ac5bdff42c5bdff4ac5bdff52c5bdff5ac5bdff63c5bdff6bc5bdff73c5bdff7bc5bdff84c5bdff8cc5bdff94c5bdff9cc5bdffa5c5bdffadc5bdffb5c5bdffbdc5bdffc5c5bdffcec5bdffd6c5bdffdec5bdffe6c5bdffefc5bdfff7c5bdffffc5bdff00cebdff08cebdff10cebdff19cebdff21cebdff29cebdff31cebdff3acebdff42cebdff4acebdff52cebdff5acebdff63cebdff6bcebdff73cebdff7bcebdff84cebdff8ccebdff94cebdff9ccebdffa5cebdffadcebdffb5cebdffbdcebdffc5cebdffcecebdffd6cebdffdecebdffe6cebdffefcebdfff7cebdffffcebdff00d6bdff08d6bdff10d6bdff19d6bdff21d6bdff29d6bdff31d6bdff3ad6bdff42d6bdff4ad6bdff52d6bdff5ad6bdff63d6bdff6bd6bdff73d6bdff7bd6bdff84d6bdff8cd6bdff94d6bdff9cd6bdffa5d6bdffadd6bdffb5d6bdffbdd6bdffc5d6bdffced6bdffd6d6bdffded6bdffe6d6bdffefd6bdfff7d6bdffffd6bdff00debdff08debdff10debdff19debdff21debdff29debdff31debdff3adebdff42debdff4adebdff52debdff5adebdff63debdff6bdebdff73debdff7bdebdff84debdff8cdebdff94debdff9cdebdffa5debdffaddebdffb5debdffbddebdffc5debdffcedebdffd6debdffdedebdffe6debdffefdebdfff7debdffffdebdff00e6bdff08e6bdff10e6bdff19e6bdff21e6bdff29e6bdff31e6bdff3ae6bdff42e6bdff4ae6bdff52e6bdff5ae6bdff63e6bdff6be6bdff73e6bdff7be6bdff84e6bdff8ce6bdff94e6bdff9ce6bdffa5e6bdffade6bdffb5e6bdffbde6bdffc5e6bdffcee6bdffd6e6bdffdee6bdffe6e6bdffefe6bdfff7e6bdffffe6bdff00efbdff08efbdff10efbdff19efbdff21efbdff29efbdff31efbdff3aefbdff42efbdff4aefbdff52efbdff5aefbdff63efbdff6befbdff73efbdff7befbdff84efbdff8cefbdff94efbdff9cefbdffa5efbdffadefbdffb5efbdffbdefbdffc5efbdffceefbdffd6efbdffdeefbdffe6efbdffefefbdfff7efbdffffefbdff00f7bdff08f7bdff10f7bdff19f7bdff21f7bdff29f7bdff31f7bdff3af7bdff42f7bdff4af7bdff52f7bdff5af7bdff63f7bdff6bf7bdff73f7bdff7bf7bdff84f7bdff8cf7bdff94f7bdff9cf7bdffa5f7bdffadf7bdffb5f7bdffbdf7bdffc5f7bdffcef7bdffd6f7bdffdef7bdffe6f7bdffeff7bdfff7f7bdfffff7bdff00ffbdff08ffbdff10ffbdff19ffbdff21ffbdff29ffbdff31ffbdff3affbdff42ffbdff4affbdff52ffbdff5affbdff63ffbdff6bffbdff73ffbdff7bffbdff84ffbdff8cffbdff94ffbdff9cffbdffa5ffbdffadffbdffb5ffbdffbdffbdffc5ffbdffceffbdffd6ffbdffdeffbdffe6ffbdffefffbdfff7ffbdffffffbdff0000c5ff0800c5ff1000c5ff1900c5ff2100c5ff2900c5ff3100c5ff3a00c5ff4200c5ff4a00c5ff5200c5ff5a00c5ff6300c5ff6b00c5ff7300c5ff7b00c5ff8400c5ff8c00c5ff9400c5ff9c00c5ffa500c5ffad00c5ffb500c5ffbd00c5ffc500c5ffce00c5ffd600c5ffde00c5ffe600c5ffef00c5fff700c5ffff00c5ff0008c5ff0808c5ff1008c5ff1908c5ff2108c5ff2908c5ff3108c5ff3a08c5ff4208c5ff4a08c5ff5208c5ff5a08c5ff6308c5ff6b08c5ff7308c5ff7b08c5ff8408c5ff8c08c5ff9408c5ff9c08c5ffa508c5ffad08c5ffb508c5ffbd08c5ffc508c5ffce08c5ffd608c5ffde08c5ffe608c5ffef08c5fff708c5ffff08c5ff0010c5ff0810c5ff1010c5ff1910c5ff2110c5ff2910c5ff3110c5ff3a10c5ff4210c5ff4a10c5ff5210c5ff5a10c5ff6310c5ff6b10c5ff7310c5ff7b10c5ff8410c5ff8c10c5ff9410c5ff9c10c5ffa510c5ffad10c5ffb510c5ffbd10c5ffc510c5ffce10c5ffd610c5ffde10c5ffe610c5ffef10c5fff710c5ffff10c5ff0019c5ff0819c5ff1019c5ff1919c5ff2119c5ff2919c5ff3119c5ff3a19c5ff4219c5ff4a19c5ff5219c5ff5a19c5ff6319c5ff6b19c5ff7319c5ff7b19c5ff8419c5ff8c19c5ff9419c5ff9c19c5ffa519c5ffad19c5ffb519c5ffbd19c5ffc519c5ffce19c5ffd619c5ffde19c5ffe619c5ffef19c5fff719c5ffff19c5ff0021c5ff0821c5ff1021c5ff1921c5ff2121c5ff2921c5ff3121c5ff3a21c5ff4221c5ff4a21c5ff5221c5ff5a21c5ff6321c5ff6b21c5ff7321c5ff7b21c5ff8421c5ff8c21c5ff9421c5ff9c21c5ffa521c5ffad21c5ffb521c5ffbd21c5ffc521c5ffce21c5ffd621c5ffde21c5ffe621c5ffef21c5fff721c5ffff21c5ff0029c5ff0829c5ff1029c5ff1929c5ff2129c5ff2929c5ff3129c5ff3a29c5ff4229c5ff4a29c5ff5229c5ff5a29c5ff6329c5ff6b29c5ff7329c5ff7b29c5ff8429c5ff8c29c5ff9429c5ff9c29c5ffa529c5ffad29c5ffb529c5ffbd29c5ffc529c5ffce29c5ffd629c5ffde29c5ffe629c5ffef29c5fff729c5ffff29c5ff0031c5ff0831c5ff1031c5ff1931c5ff2131c5ff2931c5ff3131c5ff3a31c5ff4231c5ff4a31c5ff5231c5ff5a31c5ff6331c5ff6b31c5ff7331c5ff7b31c5ff8431c5ff8c31c5ff9431c5ff9c31c5ffa531c5ffad31c5ffb531c5ffbd31c5ffc531c5ffce31c5ffd631c5ffde31c5ffe631c5ffef31c5fff731c5ffff31c5ff003ac5ff083ac5ff103ac5ff193ac5ff213ac5ff293ac5ff313ac5ff3a3ac5ff423ac5ff4a3ac5ff523ac5ff5a3ac5ff633ac5ff6b3ac5ff733ac5ff7b3ac5ff843ac5ff8c3ac5ff943ac5ff9c3ac5ffa53ac5ffad3ac5ffb53ac5ffbd3ac5ffc53ac5ffce3ac5ffd63ac5ffde3ac5ffe63ac5ffef3ac5fff73ac5ffff3ac5ff0042c5ff0842c5ff1042c5ff1942c5ff2142c5ff2942c5ff3142c5ff3a42c5ff4242c5ff4a42c5ff5242c5ff5a42c5ff6342c5ff6b42c5ff7342c5ff7b42c5ff8442c5ff8c42c5ff9442c5ff9c42c5ffa542c5ffad42c5ffb542c5ffbd42c5ffc542c5ffce42c5ffd642c5ffde42c5ffe642c5ffef42c5fff742c5ffff42c5ff004ac5ff084ac5ff104ac5ff194ac5ff214ac5ff294ac5ff314ac5ff3a4ac5ff424ac5ff4a4ac5ff524ac5ff5a4ac5ff634ac5ff6b4ac5ff734ac5ff7b4ac5ff844ac5ff8c4ac5ff944ac5ff9c4ac5ffa54ac5ffad4ac5ffb54ac5ffbd4ac5ffc54ac5ffce4ac5ffd64ac5ffde4ac5ffe64ac5ffef4ac5fff74ac5ffff4ac5ff0052c5ff0852c5ff1052c5ff1952c5ff2152c5ff2952c5ff3152c5ff3a52c5ff4252c5ff4a52c5ff5252c5ff5a52c5ff6352c5ff6b52c5ff7352c5ff7b52c5ff8452c5ff8c52c5ff9452c5ff9c52c5ffa552c5ffad52c5ffb552c5ffbd52c5ffc552c5ffce52c5ffd652c5ffde52c5ffe652c5ffef52c5fff752c5ffff52c5ff005ac5ff085ac5ff105ac5ff195ac5ff215ac5ff295ac5ff315ac5ff3a5ac5ff425ac5ff4a5ac5ff525ac5ff5a5ac5ff635ac5ff6b5ac5ff735ac5ff7b5ac5ff845ac5ff8c5ac5ff945ac5ff9c5ac5ffa55ac5ffad5ac5ffb55ac5ffbd5ac5ffc55ac5ffce5ac5ffd65ac5ffde5ac5ffe65ac5ffef5ac5fff75ac5ffff5ac5ff0063c5ff0863c5ff1063c5ff1963c5ff2163c5ff2963c5ff3163c5ff3a63c5ff4263c5ff4a63c5ff5263c5ff5a63c5ff6363c5ff6b63c5ff7363c5ff7b63c5ff8463c5ff8c63c5ff9463c5ff9c63c5ffa563c5ffad63c5ffb563c5ffbd63c5ffc563c5ffce63c5ffd663c5ffde63c5ffe663c5ffef63c5fff763c5ffff63c5ff006bc5ff086bc5ff106bc5ff196bc5ff216bc5ff296bc5ff316bc5ff3a6bc5ff426bc5ff4a6bc5ff526bc5ff5a6bc5ff636bc5ff6b6bc5ff736bc5ff7b6bc5ff846bc5ff8c6bc5ff946bc5ff9c6bc5ffa56bc5ffad6bc5ffb56bc5ffbd6bc5ffc56bc5ffce6bc5ffd66bc5ffde6bc5ffe66bc5ffef6bc5fff76bc5ffff6bc5ff0073c5ff0873c5ff1073c5ff1973c5ff2173c5ff2973c5ff3173c5ff3a73c5ff4273c5ff4a73c5ff5273c5ff5a73c5ff6373c5ff6b73c5ff7373c5ff7b73c5ff8473c5ff8c73c5ff9473c5ff9c73c5ffa573c5ffad73c5ffb573c5ffbd73c5ffc573c5ffce73c5ffd673c5ffde73c5ffe673c5ffef73c5fff773c5ffff73c5ff007bc5ff087bc5ff107bc5ff197bc5ff217bc5ff297bc5ff317bc5ff3a7bc5ff427bc5ff4a7bc5ff527bc5ff5a7bc5ff637bc5ff6b7bc5ff737bc5ff7b7bc5ff847bc5ff8c7bc5ff947bc5ff9c7bc5ffa57bc5ffad7bc5ffb57bc5ffbd7bc5ffc57bc5ffce7bc5ffd67bc5ffde7bc5ffe67bc5ffef7bc5fff77bc5ffff7bc5ff0084c5ff0884c5ff1084c5ff1984c5ff2184c5ff2984c5ff3184c5ff3a84c5ff4284c5ff4a84c5ff5284c5ff5a84c5ff6384c5ff6b84c5ff7384c5ff7b84c5ff8484c5ff8c84c5ff9484c5ff9c84c5ffa584c5ffad84c5ffb584c5ffbd84c5ffc584c5ffce84c5ffd684c5ffde84c5ffe684c5ffef84c5fff784c5ffff84c5ff008cc5ff088cc5ff108cc5ff198cc5ff218cc5ff298cc5ff318cc5ff3a8cc5ff428cc5ff4a8cc5ff528cc5ff5a8cc5ff638cc5ff6b8cc5ff738cc5ff7b8cc5ff848cc5ff8c8cc5ff948cc5ff9c8cc5ffa58cc5ffad8cc5ffb58cc5ffbd8cc5ffc58cc5ffce8cc5ffd68cc5ffde8cc5ffe68cc5ffef8cc5fff78cc5ffff8cc5ff0094c5ff0894c5ff1094c5ff1994c5ff2194c5ff2994c5ff3194c5ff3a94c5ff4294c5ff4a94c5ff5294c5ff5a94c5ff6394c5ff6b94c5ff7394c5ff7b94c5ff8494c5ff8c94c5ff9494c5ff9c94c5ffa594c5ffad94c5ffb594c5ffbd94c5ffc594c5ffce94c5ffd694c5ffde94c5ffe694c5ffef94c5fff794c5ffff94c5ff009cc5ff089cc5ff109cc5ff199cc5ff219cc5ff299cc5ff319cc5ff3a9cc5ff429cc5ff4a9cc5ff529cc5ff5a9cc5ff639cc5ff6b9cc5ff739cc5ff7b9cc5ff849cc5ff8c9cc5ff949cc5ff9c9cc5ffa59cc5ffad9cc5ffb59cc5ffbd9cc5ffc59cc5ffce9cc5ffd69cc5ffde9cc5ffe69cc5ffef9cc5fff79cc5ffff9cc5ff00a5c5ff08a5c5ff10a5c5ff19a5c5ff21a5c5ff29a5c5ff31a5c5ff3aa5c5ff42a5c5ff4aa5c5ff52a5c5ff5aa5c5ff63a5c5ff6ba5c5ff73a5c5ff7ba5c5ff84a5c5ff8ca5c5ff94a5c5ff9ca5c5ffa5a5c5ffada5c5ffb5a5c5ffbda5c5ffc5a5c5ffcea5c5ffd6a5c5ffdea5c5ffe6a5c5ffefa5c5fff7a5c5ffffa5c5ff00adc5ff08adc5ff10adc5ff19adc5ff21adc5ff29adc5ff31adc5ff3aadc5ff42adc5ff4aadc5ff52adc5ff5aadc5ff63adc5ff6badc5ff73adc5ff7badc5ff84adc5ff8cadc5ff94adc5ff9cadc5ffa5adc5ffadadc5ffb5adc5ffbdadc5ffc5adc5ffceadc5ffd6adc5ffdeadc5ffe6adc5ffefadc5fff7adc5ffffadc5ff00b5c5ff08b5c5ff10b5c5ff19b5c5ff21b5c5ff29b5c5ff31b5c5ff3ab5c5ff42b5c5ff4ab5c5ff52b5c5ff5ab5c5ff63b5c5ff6bb5c5ff73b5c5ff7bb5c5ff84b5c5ff8cb5c5ff94b5c5ff9cb5c5ffa5b5c5ffadb5c5ffb5b5c5ffbdb5c5ffc5b5c5ffceb5c5ffd6b5c5ffdeb5c5ffe6b5c5ffefb5c5fff7b5c5ffffb5c5ff00bdc5ff08bdc5ff10bdc5ff19bdc5ff21bdc5ff29bdc5ff31bdc5ff3abdc5ff42bdc5ff4abdc5ff52bdc5ff5abdc5ff63bdc5ff6bbdc5ff73bdc5ff7bbdc5ff84bdc5ff8cbdc5ff94bdc5ff9cbdc5ffa5bdc5ffadbdc5ffb5bdc5ffbdbdc5ffc5bdc5ffcebdc5ffd6bdc5ffdebdc5ffe6bdc5ffefbdc5fff7bdc5ffffbdc5ff00c5c5ff08c5c5ff10c5c5ff19c5c5ff21c5c5ff29c5c5ff31c5c5ff3ac5c5ff42c5c5ff4ac5c5ff52c5c5ff5ac5c5ff63c5c5ff6bc5c5ff73c5c5ff7bc5c5ff84c5c5ff8cc5c5ff94c5c5ff9cc5c5ffa5c5c5ffadc5c5ffb5c5c5ffbdc5c5ffc5c5c5ffcec5c5ffd6c5c5ffdec5c5ffe6c5c5ffefc5c5fff7c5c5ffffc5c5ff00cec5ff08cec5ff10cec5ff19cec5ff21cec5ff29cec5ff31cec5ff3acec5ff42cec5ff4acec5ff52cec5ff5acec5ff63cec5ff6bcec5ff73cec5ff7bcec5ff84cec5ff8ccec5ff94cec5ff9ccec5ffa5cec5ffadcec5ffb5cec5ffbdcec5ffc5cec5ffcecec5ffd6cec5ffdecec5ffe6cec5ffefcec5fff7cec5ffffcec5ff00d6c5ff08d6c5ff10d6c5ff19d6c5ff21d6c5ff29d6c5ff31d6c5ff3ad6c5ff42d6c5ff4ad6c5ff52d6c5ff5ad6c5ff63d6c5ff6bd6c5ff73d6c5ff7bd6c5ff84d6c5ff8cd6c5ff94d6c5ff9cd6c5ffa5d6c5ffadd6c5ffb5d6c5ffbdd6c5ffc5d6c5ffced6c5ffd6d6c5ffded6c5ffe6d6c5ffefd6c5fff7d6c5ffffd6c5ff00dec5ff08dec5ff10dec5ff19dec5ff21dec5ff29dec5ff31dec5ff3adec5ff42dec5ff4adec5ff52dec5ff5adec5ff63dec5ff6bdec5ff73dec5ff7bdec5ff84dec5ff8cdec5ff94dec5ff9cdec5ffa5dec5ffaddec5ffb5dec5ffbddec5ffc5dec5ffcedec5ffd6dec5ffdedec5ffe6dec5ffefdec5fff7dec5ffffdec5ff00e6c5ff08e6c5ff10e6c5ff19e6c5ff21e6c5ff29e6c5ff31e6c5ff3ae6c5ff42e6c5ff4ae6c5ff52e6c5ff5ae6c5ff63e6c5ff6be6c5ff73e6c5ff7be6c5ff84e6c5ff8ce6c5ff94e6c5ff9ce6c5ffa5e6c5ffade6c5ffb5e6c5ffbde6c5ffc5e6c5ffcee6c5ffd6e6c5ffdee6c5ffe6e6c5ffefe6c5fff7e6c5ffffe6c5ff00efc5ff08efc5ff10efc5ff19efc5ff21efc5ff29efc5ff31efc5ff3aefc5ff42efc5ff4aefc5ff52efc5ff5aefc5ff63efc5ff6befc5ff73efc5ff7befc5ff84efc5ff8cefc5ff94efc5ff9cefc5ffa5efc5ffadefc5ffb5efc5ffbdefc5ffc5efc5ffceefc5ffd6efc5ffdeefc5ffe6efc5ffefefc5fff7efc5ffffefc5ff00f7c5ff08f7c5ff10f7c5ff19f7c5ff21f7c5ff29f7c5ff31f7c5ff3af7c5ff42f7c5ff4af7c5ff52f7c5ff5af7c5ff63f7c5ff6bf7c5ff73f7c5ff7bf7c5ff84f7c5ff8cf7c5ff94f7c5ff9cf7c5ffa5f7c5ffadf7c5ffb5f7c5ffbdf7c5ffc5f7c5ffcef7c5ffd6f7c5ffdef7c5ffe6f7c5ffeff7c5fff7f7c5fffff7c5ff00ffc5ff08ffc5ff10ffc5ff19ffc5ff21ffc5ff29ffc5ff31ffc5ff3affc5ff42ffc5ff4affc5ff52ffc5ff5affc5ff63ffc5ff6bffc5ff73ffc5ff7bffc5ff84ffc5ff8cffc5ff94ffc5ff9cffc5ffa5ffc5ffadffc5ffb5ffc5ffbdffc5ffc5ffc5ffceffc5ffd6ffc5ffdeffc5ffe6ffc5ffefffc5fff7ffc5ffffffc5ff0000ceff0800ceff1000ceff1900ceff2100ceff2900ceff3100ceff3a00ceff4200ceff4a00ceff5200ceff5a00ceff6300ceff6b00ceff7300ceff7b00ceff8400ceff8c00ceff9400ceff9c00ceffa500ceffad00ceffb500ceffbd00ceffc500ceffce00ceffd600ceffde00ceffe600ceffef00cefff700ceffff00ceff0008ceff0808ceff1008ceff1908ceff2108ceff2908ceff3108ceff3a08ceff4208ceff4a08ceff5208ceff5a08ceff6308ceff6b08ceff7308ceff7b08ceff8408ceff8c08ceff9408ceff9c08ceffa508ceffad08ceffb508ceffbd08ceffc508ceffce08ceffd608ceffde08ceffe608ceffef08cefff708ceffff08ceff0010ceff0810ceff1010ceff1910ceff2110ceff2910ceff3110ceff3a10ceff4210ceff4a10ceff5210ceff5a10ceff6310ceff6b10ceff7310ceff7b10ceff8410ceff8c10ceff9410ceff9c10ceffa510ceffad10ceffb510ceffbd10ceffc510ceffce10ceffd610ceffde10ceffe610ceffef10cefff710ceffff10ceff0019ceff0819ceff1019ceff1919ceff2119ceff2919ceff3119ceff3a19ceff4219ceff4a19ceff5219ceff5a19ceff6319ceff6b19ceff7319ceff7b19ceff8419ceff8c19ceff9419ceff9c19ceffa519ceffad19ceffb519ceffbd19ceffc519ceffce19ceffd619ceffde19ceffe619ceffef19cefff719ceffff19ceff0021ceff0821ceff1021ceff1921ceff2121ceff2921ceff3121ceff3a21ceff4221ceff4a21ceff5221ceff5a21ceff6321ceff6b21ceff7321ceff7b21ceff8421ceff8c21ceff9421ceff9c21ceffa521ceffad21ceffb521ceffbd21ceffc521ceffce21ceffd621ceffde21ceffe621ceffef21cefff721ceffff21ceff0029ceff0829ceff1029ceff1929ceff2129ceff2929ceff3129ceff3a29ceff4229ceff4a29ceff5229ceff5a29ceff6329ceff6b29ceff7329ceff7b29ceff8429ceff8c29ceff9429ceff9c29ceffa529ceffad29ceffb529ceffbd29ceffc529ceffce29ceffd629ceffde29ceffe629ceffef29cefff729ceffff29ceff0031ceff0831ceff1031ceff1931ceff2131ceff2931ceff3131ceff3a31ceff4231ceff4a31ceff5231ceff5a31ceff6331ceff6b31ceff7331ceff7b31ceff8431ceff8c31ceff9431ceff9c31ceffa531ceffad31ceffb531ceffbd31ceffc531ceffce31ceffd631ceffde31ceffe631ceffef31cefff731ceffff31ceff003aceff083aceff103aceff193aceff213aceff293aceff313aceff3a3aceff423aceff4a3aceff523aceff5a3aceff633aceff6b3aceff733aceff7b3aceff843aceff8c3aceff943aceff9c3aceffa53aceffad3aceffb53aceffbd3aceffc53aceffce3aceffd63aceffde3aceffe63aceffef3acefff73aceffff3aceff0042ceff0842ceff1042ceff1942ceff2142ceff2942ceff3142ceff3a42ceff4242ceff4a42ceff5242ceff5a42ceff6342ceff6b42ceff7342ceff7b42ceff8442ceff8c42ceff9442ceff9c42ceffa542ceffad42ceffb542ceffbd42ceffc542ceffce42ceffd642ceffde42ceffe642ceffef42cefff742ceffff42ceff004aceff084aceff104aceff194aceff214aceff294aceff314aceff3a4aceff424aceff4a4aceff524aceff5a4aceff634aceff6b4aceff734aceff7b4aceff844aceff8c4aceff944aceff9c4aceffa54aceffad4aceffb54aceffbd4aceffc54aceffce4aceffd64aceffde4aceffe64aceffef4acefff74aceffff4aceff0052ceff0852ceff1052ceff1952ceff2152ceff2952ceff3152ceff3a52ceff4252ceff4a52ceff5252ceff5a52ceff6352ceff6b52ceff7352ceff7b52ceff8452ceff8c52ceff9452ceff9c52ceffa552ceffad52ceffb552ceffbd52ceffc552ceffce52ceffd652ceffde52ceffe652ceffef52cefff752ceffff52ceff005aceff085aceff105aceff195aceff215aceff295aceff315aceff3a5aceff425aceff4a5aceff525aceff5a5aceff635aceff6b5aceff735aceff7b5aceff845aceff8c5aceff945aceff9c5aceffa55aceffad5aceffb55aceffbd5aceffc55aceffce5aceffd65aceffde5aceffe65aceffef5acefff75aceffff5aceff0063ceff0863ceff1063ceff1963ceff2163ceff2963ceff3163ceff3a63ceff4263ceff4a63ceff5263ceff5a63ceff6363ceff6b63ceff7363ceff7b63ceff8463ceff8c63ceff9463ceff9c63ceffa563ceffad63ceffb563ceffbd63ceffc563ceffce63ceffd663ceffde63ceffe663ceffef63cefff763ceffff63ceff006bceff086bceff106bceff196bceff216bceff296bceff316bceff3a6bceff426bceff4a6bceff526bceff5a6bceff636bceff6b6bceff736bceff7b6bceff846bceff8c6bceff946bceff9c6bceffa56bceffad6bceffb56bceffbd6bceffc56bceffce6bceffd66bceffde6bceffe66bceffef6bcefff76bceffff6bceff0073ceff0873ceff1073ceff1973ceff2173ceff2973ceff3173ceff3a73ceff4273ceff4a73ceff5273ceff5a73ceff6373ceff6b73ceff7373ceff7b73ceff8473ceff8c73ceff9473ceff9c73ceffa573ceffad73ceffb573ceffbd73ceffc573ceffce73ceffd673ceffde73ceffe673ceffef73cefff773ceffff73ceff007bceff087bceff107bceff197bceff217bceff297bceff317bceff3a7bceff427bceff4a7bceff527bceff5a7bceff637bceff6b7bceff737bceff7b7bceff847bceff8c7bceff947bceff9c7bceffa57bceffad7bceffb57bceffbd7bceffc57bceffce7bceffd67bceffde7bceffe67bceffef7bcefff77bceffff7bceff0084ceff0884ceff1084ceff1984ceff2184ceff2984ceff3184ceff3a84ceff4284ceff4a84ceff5284ceff5a84ceff6384ceff6b84ceff7384ceff7b84ceff8484ceff8c84ceff9484ceff9c84ceffa584ceffad84ceffb584ceffbd84ceffc584ceffce84ceffd684ceffde84ceffe684ceffef84cefff784ceffff84ceff008cceff088cceff108cceff198cceff218cceff298cceff318cceff3a8cceff428cceff4a8cceff528cceff5a8cceff638cceff6b8cceff738cceff7b8cceff848cceff8c8cceff948cceff9c8cceffa58cceffad8cceffb58cceffbd8cceffc58cceffce8cceffd68cceffde8cceffe68cceffef8ccefff78cceffff8cceff0094ceff0894ceff1094ceff1994ceff2194ceff2994ceff3194ceff3a94ceff4294ceff4a94ceff5294ceff5a94ceff6394ceff6b94ceff7394ceff7b94ceff8494ceff8c94ceff9494ceff9c94ceffa594ceffad94ceffb594ceffbd94ceffc594ceffce94ceffd694ceffde94ceffe694ceffef94cefff794ceffff94ceff009cceff089cceff109cceff199cceff219cceff299cceff319cceff3a9cceff429cceff4a9cceff529cceff5a9cceff639cceff6b9cceff739cceff7b9cceff849cceff8c9cceff949cceff9c9cceffa59cceffad9cceffb59cceffbd9cceffc59cceffce9cceffd69cceffde9cceffe69cceffef9ccefff79cceffff9cceff00a5ceff08a5ceff10a5ceff19a5ceff21a5ceff29a5ceff31a5ceff3aa5ceff42a5ceff4aa5ceff52a5ceff5aa5ceff63a5ceff6ba5ceff73a5ceff7ba5ceff84a5ceff8ca5ceff94a5ceff9ca5ceffa5a5ceffada5ceffb5a5ceffbda5ceffc5a5ceffcea5ceffd6a5ceffdea5ceffe6a5ceffefa5cefff7a5ceffffa5ceff00adceff08adceff10adceff19adceff21adceff29adceff31adceff3aadceff42adceff4aadceff52adceff5aadceff63adceff6badceff73adceff7badceff84adceff8cadceff94adceff9cadceffa5adceffadadceffb5adceffbdadceffc5adceffceadceffd6adceffdeadceffe6adceffefadcefff7adceffffadceff00b5ceff08b5ceff10b5ceff19b5ceff21b5ceff29b5ceff31b5ceff3ab5ceff42b5ceff4ab5ceff52b5ceff5ab5ceff63b5ceff6bb5ceff73b5ceff7bb5ceff84b5ceff8cb5ceff94b5ceff9cb5ceffa5b5ceffadb5ceffb5b5ceffbdb5ceffc5b5ceffceb5ceffd6b5ceffdeb5ceffe6b5ceffefb5cefff7b5ceffffb5ceff00bdceff08bdceff10bdceff19bdceff21bdceff29bdceff31bdceff3abdceff42bdceff4abdceff52bdceff5abdceff63bdceff6bbdceff73bdceff7bbdceff84bdceff8cbdceff94bdceff9cbdceffa5bdceffadbdceffb5bdceffbdbdceffc5bdceffcebdceffd6bdceffdebdceffe6bdceffefbdcefff7bdceffffbdceff00c5ceff08c5ceff10c5ceff19c5ceff21c5ceff29c5ceff31c5ceff3ac5ceff42c5ceff4ac5ceff52c5ceff5ac5ceff63c5ceff6bc5ceff73c5ceff7bc5ceff84c5ceff8cc5ceff94c5ceff9cc5ceffa5c5ceffadc5ceffb5c5ceffbdc5ceffc5c5ceffcec5ceffd6c5ceffdec5ceffe6c5ceffefc5cefff7c5ceffffc5ceff00ceceff08ceceff10ceceff19ceceff21ceceff29ceceff31ceceff3aceceff42ceceff4aceceff52ceceff5aceceff63ceceff6bceceff73ceceff7bceceff84ceceff8cceceff94ceceff9cceceffa5ceceffadceceffb5ceceffbdceceffc5ceceffcececeffd6ceceffdececeffe6ceceffefcecefff7ceceffffceceff00d6ceff08d6ceff10d6ceff19d6ceff21d6ceff29d6ceff31d6ceff3ad6ceff42d6ceff4ad6ceff52d6ceff5ad6ceff63d6ceff6bd6ceff73d6ceff7bd6ceff84d6ceff8cd6ceff94d6ceff9cd6ceffa5d6ceffadd6ceffb5d6ceffbdd6ceffc5d6ceffced6ceffd6d6ceffded6ceffe6d6ceffefd6cefff7d6ceffffd6ceff00deceff08deceff10deceff19deceff21deceff29deceff31deceff3adeceff42deceff4adeceff52deceff5adeceff63deceff6bdeceff73deceff7bdeceff84deceff8cdeceff94deceff9cdeceffa5deceffaddeceffb5deceffbddeceffc5deceffcedeceffd6deceffdedeceffe6deceffefdecefff7deceffffdeceff00e6ceff08e6ceff10e6ceff19e6ceff21e6ceff29e6ceff31e6ceff3ae6ceff42e6ceff4ae6ceff52e6ceff5ae6ceff63e6ceff6be6ceff73e6ceff7be6ceff84e6ceff8ce6ceff94e6ceff9ce6ceffa5e6ceffade6ceffb5e6ceffbde6ceffc5e6ceffcee6ceffd6e6ceffdee6ceffe6e6ceffefe6cefff7e6ceffffe6ceff00efceff08efceff10efceff19efceff21efceff29efceff31efceff3aefceff42efceff4aefceff52efceff5aefceff63efceff6befceff73efceff7befceff84efceff8cefceff94efceff9cefceffa5efceffadefceffb5efceffbdefceffc5efceffceefceffd6efceffdeefceffe6efceffefefcefff7efceffffefceff00f7ceff08f7ceff10f7ceff19f7ceff21f7ceff29f7ceff31f7ceff3af7ceff42f7ceff4af7ceff52f7ceff5af7ceff63f7ceff6bf7ceff73f7ceff7bf7ceff84f7ceff8cf7ceff94f7ceff9cf7ceffa5f7ceffadf7ceffb5f7ceffbdf7ceffc5f7ceffcef7ceffd6f7ceffdef7ceffe6f7ceffeff7cefff7f7cefffff7ceff00ffceff08ffceff10ffceff19ffceff21ffceff29ffceff31ffceff3affceff42ffceff4affceff52ffceff5affceff63ffceff6bffceff73ffceff7bffceff84ffceff8cffceff94ffceff9cffceffa5ffceffadffceffb5ffceffbdffceffc5ffceffceffceffd6ffceffdeffceffe6ffceffefffcefff7ffceffffffceff0000d6ff0800d6ff1000d6ff1900d6ff2100d6ff2900d6ff3100d6ff3a00d6ff4200d6ff4a00d6ff5200d6ff5a00d6ff6300d6ff6b00d6ff7300d6ff7b00d6ff8400d6ff8c00d6ff9400d6ff9c00d6ffa500d6ffad00d6ffb500d6ffbd00d6ffc500d6ffce00d6ffd600d6ffde00d6ffe600d6ffef00d6fff700d6ffff00d6ff0008d6ff0808d6ff1008d6ff1908d6ff2108d6ff2908d6ff3108d6ff3a08d6ff4208d6ff4a08d6ff5208d6ff5a08d6ff6308d6ff6b08d6ff7308d6ff7b08d6ff8408d6ff8c08d6ff9408d6ff9c08d6ffa508d6ffad08d6ffb508d6ffbd08d6ffc508d6ffce08d6ffd608d6ffde08d6ffe608d6ffef08d6fff708d6ffff08d6ff0010d6ff0810d6ff1010d6ff1910d6ff2110d6ff2910d6ff3110d6ff3a10d6ff4210d6ff4a10d6ff5210d6ff5a10d6ff6310d6ff6b10d6ff7310d6ff7b10d6ff8410d6ff8c10d6ff9410d6ff9c10d6ffa510d6ffad10d6ffb510d6ffbd10d6ffc510d6ffce10d6ffd610d6ffde10d6ffe610d6ffef10d6fff710d6ffff10d6ff0019d6ff0819d6ff1019d6ff1919d6ff2119d6ff2919d6ff3119d6ff3a19d6ff4219d6ff4a19d6ff5219d6ff5a19d6ff6319d6ff6b19d6ff7319d6ff7b19d6ff8419d6ff8c19d6ff9419d6ff9c19d6ffa519d6ffad19d6ffb519d6ffbd19d6ffc519d6ffce19d6ffd619d6ffde19d6ffe619d6ffef19d6fff719d6ffff19d6ff0021d6ff0821d6ff1021d6ff1921d6ff2121d6ff2921d6ff3121d6ff3a21d6ff4221d6ff4a21d6ff5221d6ff5a21d6ff6321d6ff6b21d6ff7321d6ff7b21d6ff8421d6ff8c21d6ff9421d6ff9c21d6ffa521d6ffad21d6ffb521d6ffbd21d6ffc521d6ffce21d6ffd621d6ffde21d6ffe621d6ffef21d6fff721d6ffff21d6ff0029d6ff0829d6ff1029d6ff1929d6ff2129d6ff2929d6ff3129d6ff3a29d6ff4229d6ff4a29d6ff5229d6ff5a29d6ff6329d6ff6b29d6ff7329d6ff7b29d6ff8429d6ff8c29d6ff9429d6ff9c29d6ffa529d6ffad29d6ffb529d6ffbd29d6ffc529d6ffce29d6ffd629d6ffde29d6ffe629d6ffef29d6fff729d6ffff29d6ff0031d6ff0831d6ff1031d6ff1931d6ff2131d6ff2931d6ff3131d6ff3a31d6ff4231d6ff4a31d6ff5231d6ff5a31d6ff6331d6ff6b31d6ff7331d6ff7b31d6ff8431d6ff8c31d6ff9431d6ff9c31d6ffa531d6ffad31d6ffb531d6ffbd31d6ffc531d6ffce31d6ffd631d6ffde31d6ffe631d6ffef31d6fff731d6ffff31d6ff003ad6ff083ad6ff103ad6ff193ad6ff213ad6ff293ad6ff313ad6ff3a3ad6ff423ad6ff4a3ad6ff523ad6ff5a3ad6ff633ad6ff6b3ad6ff733ad6ff7b3ad6ff843ad6ff8c3ad6ff943ad6ff9c3ad6ffa53ad6ffad3ad6ffb53ad6ffbd3ad6ffc53ad6ffce3ad6ffd63ad6ffde3ad6ffe63ad6ffef3ad6fff73ad6ffff3ad6ff0042d6ff0842d6ff1042d6ff1942d6ff2142d6ff2942d6ff3142d6ff3a42d6ff4242d6ff4a42d6ff5242d6ff5a42d6ff6342d6ff6b42d6ff7342d6ff7b42d6ff8442d6ff8c42d6ff9442d6ff9c42d6ffa542d6ffad42d6ffb542d6ffbd42d6ffc542d6ffce42d6ffd642d6ffde42d6ffe642d6ffef42d6fff742d6ffff42d6ff004ad6ff084ad6ff104ad6ff194ad6ff214ad6ff294ad6ff314ad6ff3a4ad6ff424ad6ff4a4ad6ff524ad6ff5a4ad6ff634ad6ff6b4ad6ff734ad6ff7b4ad6ff844ad6ff8c4ad6ff944ad6ff9c4ad6ffa54ad6ffad4ad6ffb54ad6ffbd4ad6ffc54ad6ffce4ad6ffd64ad6ffde4ad6ffe64ad6ffef4ad6fff74ad6ffff4ad6ff0052d6ff0852d6ff1052d6ff1952d6ff2152d6ff2952d6ff3152d6ff3a52d6ff4252d6ff4a52d6ff5252d6ff5a52d6ff6352d6ff6b52d6ff7352d6ff7b52d6ff8452d6ff8c52d6ff9452d6ff9c52d6ffa552d6ffad52d6ffb552d6ffbd52d6ffc552d6ffce52d6ffd652d6ffde52d6ffe652d6ffef52d6fff752d6ffff52d6ff005ad6ff085ad6ff105ad6ff195ad6ff215ad6ff295ad6ff315ad6ff3a5ad6ff425ad6ff4a5ad6ff525ad6ff5a5ad6ff635ad6ff6b5ad6ff735ad6ff7b5ad6ff845ad6ff8c5ad6ff945ad6ff9c5ad6ffa55ad6ffad5ad6ffb55ad6ffbd5ad6ffc55ad6ffce5ad6ffd65ad6ffde5ad6ffe65ad6ffef5ad6fff75ad6ffff5ad6ff0063d6ff0863d6ff1063d6ff1963d6ff2163d6ff2963d6ff3163d6ff3a63d6ff4263d6ff4a63d6ff5263d6ff5a63d6ff6363d6ff6b63d6ff7363d6ff7b63d6ff8463d6ff8c63d6ff9463d6ff9c63d6ffa563d6ffad63d6ffb563d6ffbd63d6ffc563d6ffce63d6ffd663d6ffde63d6ffe663d6ffef63d6fff763d6ffff63d6ff006bd6ff086bd6ff106bd6ff196bd6ff216bd6ff296bd6ff316bd6ff3a6bd6ff426bd6ff4a6bd6ff526bd6ff5a6bd6ff636bd6ff6b6bd6ff736bd6ff7b6bd6ff846bd6ff8c6bd6ff946bd6ff9c6bd6ffa56bd6ffad6bd6ffb56bd6ffbd6bd6ffc56bd6ffce6bd6ffd66bd6ffde6bd6ffe66bd6ffef6bd6fff76bd6ffff6bd6ff0073d6ff0873d6ff1073d6ff1973d6ff2173d6ff2973d6ff3173d6ff3a73d6ff4273d6ff4a73d6ff5273d6ff5a73d6ff6373d6ff6b73d6ff7373d6ff7b73d6ff8473d6ff8c73d6ff9473d6ff9c73d6ffa573d6ffad73d6ffb573d6ffbd73d6ffc573d6ffce73d6ffd673d6ffde73d6ffe673d6ffef73d6fff773d6ffff73d6ff007bd6ff087bd6ff107bd6ff197bd6ff217bd6ff297bd6ff317bd6ff3a7bd6ff427bd6ff4a7bd6ff527bd6ff5a7bd6ff637bd6ff6b7bd6ff737bd6ff7b7bd6ff847bd6ff8c7bd6ff947bd6ff9c7bd6ffa57bd6ffad7bd6ffb57bd6ffbd7bd6ffc57bd6ffce7bd6ffd67bd6ffde7bd6ffe67bd6ffef7bd6fff77bd6ffff7bd6ff0084d6ff0884d6ff1084d6ff1984d6ff2184d6ff2984d6ff3184d6ff3a84d6ff4284d6ff4a84d6ff5284d6ff5a84d6ff6384d6ff6b84d6ff7384d6ff7b84d6ff8484d6ff8c84d6ff9484d6ff9c84d6ffa584d6ffad84d6ffb584d6ffbd84d6ffc584d6ffce84d6ffd684d6ffde84d6ffe684d6ffef84d6fff784d6ffff84d6ff008cd6ff088cd6ff108cd6ff198cd6ff218cd6ff298cd6ff318cd6ff3a8cd6ff428cd6ff4a8cd6ff528cd6ff5a8cd6ff638cd6ff6b8cd6ff738cd6ff7b8cd6ff848cd6ff8c8cd6ff948cd6ff9c8cd6ffa58cd6ffad8cd6ffb58cd6ffbd8cd6ffc58cd6ffce8cd6ffd68cd6ffde8cd6ffe68cd6ffef8cd6fff78cd6ffff8cd6ff0094d6ff0894d6ff1094d6ff1994d6ff2194d6ff2994d6ff3194d6ff3a94d6ff4294d6ff4a94d6ff5294d6ff5a94d6ff6394d6ff6b94d6ff7394d6ff7b94d6ff8494d6ff8c94d6ff9494d6ff9c94d6ffa594d6ffad94d6ffb594d6ffbd94d6ffc594d6ffce94d6ffd694d6ffde94d6ffe694d6ffef94d6fff794d6ffff94d6ff009cd6ff089cd6ff109cd6ff199cd6ff219cd6ff299cd6ff319cd6ff3a9cd6ff429cd6ff4a9cd6ff529cd6ff5a9cd6ff639cd6ff6b9cd6ff739cd6ff7b9cd6ff849cd6ff8c9cd6ff949cd6ff9c9cd6ffa59cd6ffad9cd6ffb59cd6ffbd9cd6ffc59cd6ffce9cd6ffd69cd6ffde9cd6ffe69cd6ffef9cd6fff79cd6ffff9cd6ff00a5d6ff08a5d6ff10a5d6ff19a5d6ff21a5d6ff29a5d6ff31a5d6ff3aa5d6ff42a5d6ff4aa5d6ff52a5d6ff5aa5d6ff63a5d6ff6ba5d6ff73a5d6ff7ba5d6ff84a5d6ff8ca5d6ff94a5d6ff9ca5d6ffa5a5d6ffada5d6ffb5a5d6ffbda5d6ffc5a5d6ffcea5d6ffd6a5d6ffdea5d6ffe6a5d6ffefa5d6fff7a5d6ffffa5d6ff00add6ff08add6ff10add6ff19add6ff21add6ff29add6ff31add6ff3aadd6ff42add6ff4aadd6ff52add6ff5aadd6ff63add6ff6badd6ff73add6ff7badd6ff84add6ff8cadd6ff94add6ff9cadd6ffa5add6ffadadd6ffb5add6ffbdadd6ffc5add6ffceadd6ffd6add6ffdeadd6ffe6add6ffefadd6fff7add6ffffadd6ff00b5d6ff08b5d6ff10b5d6ff19b5d6ff21b5d6ff29b5d6ff31b5d6ff3ab5d6ff42b5d6ff4ab5d6ff52b5d6ff5ab5d6ff63b5d6ff6bb5d6ff73b5d6ff7bb5d6ff84b5d6ff8cb5d6ff94b5d6ff9cb5d6ffa5b5d6ffadb5d6ffb5b5d6ffbdb5d6ffc5b5d6ffceb5d6ffd6b5d6ffdeb5d6ffe6b5d6ffefb5d6fff7b5d6ffffb5d6ff00bdd6ff08bdd6ff10bdd6ff19bdd6ff21bdd6ff29bdd6ff31bdd6ff3abdd6ff42bdd6ff4abdd6ff52bdd6ff5abdd6ff63bdd6ff6bbdd6ff73bdd6ff7bbdd6ff84bdd6ff8cbdd6ff94bdd6ff9cbdd6ffa5bdd6ffadbdd6ffb5bdd6ffbdbdd6ffc5bdd6ffcebdd6ffd6bdd6ffdebdd6ffe6bdd6ffefbdd6fff7bdd6ffffbdd6ff00c5d6ff08c5d6ff10c5d6ff19c5d6ff21c5d6ff29c5d6ff31c5d6ff3ac5d6ff42c5d6ff4ac5d6ff52c5d6ff5ac5d6ff63c5d6ff6bc5d6ff73c5d6ff7bc5d6ff84c5d6ff8cc5d6ff94c5d6ff9cc5d6ffa5c5d6ffadc5d6ffb5c5d6ffbdc5d6ffc5c5d6ffcec5d6ffd6c5d6ffdec5d6ffe6c5d6ffefc5d6fff7c5d6ffffc5d6ff00ced6ff08ced6ff10ced6ff19ced6ff21ced6ff29ced6ff31ced6ff3aced6ff42ced6ff4aced6ff52ced6ff5aced6ff63ced6ff6bced6ff73ced6ff7bced6ff84ced6ff8cced6ff94ced6ff9cced6ffa5ced6ffadced6ffb5ced6ffbdced6ffc5ced6ffceced6ffd6ced6ffdeced6ffe6ced6ffefced6fff7ced6ffffced6ff00d6d6ff08d6d6ff10d6d6ff19d6d6ff21d6d6ff29d6d6ff31d6d6ff3ad6d6ff42d6d6ff4ad6d6ff52d6d6ff5ad6d6ff63d6d6ff6bd6d6ff73d6d6ff7bd6d6ff84d6d6ff8cd6d6ff94d6d6ff9cd6d6ffa5d6d6ffadd6d6ffb5d6d6ffbdd6d6ffc5d6d6ffced6d6ffd6d6d6ffded6d6ffe6d6d6ffefd6d6fff7d6d6ffffd6d6ff00ded6ff08ded6ff10ded6ff19ded6ff21ded6ff29ded6ff31ded6ff3aded6ff42ded6ff4aded6ff52ded6ff5aded6ff63ded6ff6bded6ff73ded6ff7bded6ff84ded6ff8cded6ff94ded6ff9cded6ffa5ded6ffadded6ffb5ded6ffbdded6ffc5ded6ffceded6ffd6ded6ffdeded6ffe6ded6ffefded6fff7ded6ffffded6ff00e6d6ff08e6d6ff10e6d6ff19e6d6ff21e6d6ff29e6d6ff31e6d6ff3ae6d6ff42e6d6ff4ae6d6ff52e6d6ff5ae6d6ff63e6d6ff6be6d6ff73e6d6ff7be6d6ff84e6d6ff8ce6d6ff94e6d6ff9ce6d6ffa5e6d6ffade6d6ffb5e6d6ffbde6d6ffc5e6d6ffcee6d6ffd6e6d6ffdee6d6ffe6e6d6ffefe6d6fff7e6d6ffffe6d6ff00efd6ff08efd6ff10efd6ff19efd6ff21efd6ff29efd6ff31efd6ff3aefd6ff42efd6ff4aefd6ff52efd6ff5aefd6ff63efd6ff6befd6ff73efd6ff7befd6ff84efd6ff8cefd6ff94efd6ff9cefd6ffa5efd6ffadefd6ffb5efd6ffbdefd6ffc5efd6ffceefd6ffd6efd6ffdeefd6ffe6efd6ffefefd6fff7efd6ffffefd6ff00f7d6ff08f7d6ff10f7d6ff19f7d6ff21f7d6ff29f7d6ff31f7d6ff3af7d6ff42f7d6ff4af7d6ff52f7d6ff5af7d6ff63f7d6ff6bf7d6ff73f7d6ff7bf7d6ff84f7d6ff8cf7d6ff94f7d6ff9cf7d6ffa5f7d6ffadf7d6ffb5f7d6ffbdf7d6ffc5f7d6ffcef7d6ffd6f7d6ffdef7d6ffe6f7d6ffeff7d6fff7f7d6fffff7d6ff00ffd6ff08ffd6ff10ffd6ff19ffd6ff21ffd6ff29ffd6ff31ffd6ff3affd6ff42ffd6ff4affd6ff52ffd6ff5affd6ff63ffd6ff6bffd6ff73ffd6ff7bffd6ff84ffd6ff8cffd6ff94ffd6ff9cffd6ffa5ffd6ffadffd6ffb5ffd6ffbdffd6ffc5ffd6ffceffd6ffd6ffd6ffdeffd6ffe6ffd6ffefffd6fff7ffd6ffffffd6ff0000deff0800deff1000deff1900deff2100deff2900deff3100deff3a00deff4200deff4a00deff5200deff5a00deff6300deff6b00deff7300deff7b00deff8400deff8c00deff9400deff9c00deffa500deffad00deffb500deffbd00deffc500deffce00deffd600deffde00deffe600deffef00defff700deffff00deff0008deff0808deff1008deff1908deff2108deff2908deff3108deff3a08deff4208deff4a08deff5208deff5a08deff6308deff6b08deff7308deff7b08deff8408deff8c08deff9408deff9c08deffa508deffad08deffb508deffbd08deffc508deffce08deffd608deffde08deffe608deffef08defff708deffff08deff0010deff0810deff1010deff1910deff2110deff2910deff3110deff3a10deff4210deff4a10deff5210deff5a10deff6310deff6b10deff7310deff7b10deff8410deff8c10deff9410deff9c10deffa510deffad10deffb510deffbd10deffc510deffce10deffd610deffde10deffe610deffef10defff710deffff10deff0019deff0819deff1019deff1919deff2119deff2919deff3119deff3a19deff4219deff4a19deff5219deff5a19deff6319deff6b19deff7319deff7b19deff8419deff8c19deff9419deff9c19deffa519deffad19deffb519deffbd19deffc519deffce19deffd619deffde19deffe619deffef19defff719deffff19deff0021deff0821deff1021deff1921deff2121deff2921deff3121deff3a21deff4221deff4a21deff5221deff5a21deff6321deff6b21deff7321deff7b21deff8421deff8c21deff9421deff9c21deffa521deffad21deffb521deffbd21deffc521deffce21deffd621deffde21deffe621deffef21defff721deffff21deff0029deff0829deff1029deff1929deff2129deff2929deff3129deff3a29deff4229deff4a29deff5229deff5a29deff6329deff6b29deff7329deff7b29deff8429deff8c29deff9429deff9c29deffa529deffad29deffb529deffbd29deffc529deffce29deffd629deffde29deffe629deffef29defff729deffff29deff0031deff0831deff1031deff1931deff2131deff2931deff3131deff3a31deff4231deff4a31deff5231deff5a31deff6331deff6b31deff7331deff7b31deff8431deff8c31deff9431deff9c31deffa531deffad31deffb531deffbd31deffc531deffce31deffd631deffde31deffe631deffef31defff731deffff31deff003adeff083adeff103adeff193adeff213adeff293adeff313adeff3a3adeff423adeff4a3adeff523adeff5a3adeff633adeff6b3adeff733adeff7b3adeff843adeff8c3adeff943adeff9c3adeffa53adeffad3adeffb53adeffbd3adeffc53adeffce3adeffd63adeffde3adeffe63adeffef3adefff73adeffff3adeff0042deff0842deff1042deff1942deff2142deff2942deff3142deff3a42deff4242deff4a42deff5242deff5a42deff6342deff6b42deff7342deff7b42deff8442deff8c42deff9442deff9c42deffa542deffad42deffb542deffbd42deffc542deffce42deffd642deffde42deffe642deffef42defff742deffff42deff004adeff084adeff104adeff194adeff214adeff294adeff314adeff3a4adeff424adeff4a4adeff524adeff5a4adeff634adeff6b4adeff734adeff7b4adeff844adeff8c4adeff944adeff9c4adeffa54adeffad4adeffb54adeffbd4adeffc54adeffce4adeffd64adeffde4adeffe64adeffef4adefff74adeffff4adeff0052deff0852deff1052deff1952deff2152deff2952deff3152deff3a52deff4252deff4a52deff5252deff5a52deff6352deff6b52deff7352deff7b52deff8452deff8c52deff9452deff9c52deffa552deffad52deffb552deffbd52deffc552deffce52deffd652deffde52deffe652deffef52defff752deffff52deff005adeff085adeff105adeff195adeff215adeff295adeff315adeff3a5adeff425adeff4a5adeff525adeff5a5adeff635adeff6b5adeff735adeff7b5adeff845adeff8c5adeff945adeff9c5adeffa55adeffad5adeffb55adeffbd5adeffc55adeffce5adeffd65adeffde5adeffe65adeffef5adefff75adeffff5adeff0063deff0863deff1063deff1963deff2163deff2963deff3163deff3a63deff4263deff4a63deff5263deff5a63deff6363deff6b63deff7363deff7b63deff8463deff8c63deff9463deff9c63deffa563deffad63deffb563deffbd63deffc563deffce63deffd663deffde63deffe663deffef63defff763deffff63deff006bdeff086bdeff106bdeff196bdeff216bdeff296bdeff316bdeff3a6bdeff426bdeff4a6bdeff526bdeff5a6bdeff636bdeff6b6bdeff736bdeff7b6bdeff846bdeff8c6bdeff946bdeff9c6bdeffa56bdeffad6bdeffb56bdeffbd6bdeffc56bdeffce6bdeffd66bdeffde6bdeffe66bdeffef6bdefff76bdeffff6bdeff0073deff0873deff1073deff1973deff2173deff2973deff3173deff3a73deff4273deff4a73deff5273deff5a73deff6373deff6b73deff7373deff7b73deff8473deff8c73deff9473deff9c73deffa573deffad73deffb573deffbd73deffc573deffce73deffd673deffde73deffe673deffef73defff773deffff73deff007bdeff087bdeff107bdeff197bdeff217bdeff297bdeff317bdeff3a7bdeff427bdeff4a7bdeff527bdeff5a7bdeff637bdeff6b7bdeff737bdeff7b7bdeff847bdeff8c7bdeff947bdeff9c7bdeffa57bdeffad7bdeffb57bdeffbd7bdeffc57bdeffce7bdeffd67bdeffde7bdeffe67bdeffef7bdefff77bdeffff7bdeff0084deff0884deff1084deff1984deff2184deff2984deff3184deff3a84deff4284deff4a84deff5284deff5a84deff6384deff6b84deff7384deff7b84deff8484deff8c84deff9484deff9c84deffa584deffad84deffb584deffbd84deffc584deffce84deffd684deffde84deffe684deffef84defff784deffff84deff008cdeff088cdeff108cdeff198cdeff218cdeff298cdeff318cdeff3a8cdeff428cdeff4a8cdeff528cdeff5a8cdeff638cdeff6b8cdeff738cdeff7b8cdeff848cdeff8c8cdeff948cdeff9c8cdeffa58cdeffad8cdeffb58cdeffbd8cdeffc58cdeffce8cdeffd68cdeffde8cdeffe68cdeffef8cdefff78cdeffff8cdeff0094deff0894deff1094deff1994deff2194deff2994deff3194deff3a94deff4294deff4a94deff5294deff5a94deff6394deff6b94deff7394deff7b94deff8494deff8c94deff9494deff9c94deffa594deffad94deffb594deffbd94deffc594deffce94deffd694deffde94deffe694deffef94defff794deffff94deff009cdeff089cdeff109cdeff199cdeff219cdeff299cdeff319cdeff3a9cdeff429cdeff4a9cdeff529cdeff5a9cdeff639cdeff6b9cdeff739cdeff7b9cdeff849cdeff8c9cdeff949cdeff9c9cdeffa59cdeffad9cdeffb59cdeffbd9cdeffc59cdeffce9cdeffd69cdeffde9cdeffe69cdeffef9cdefff79cdeffff9cdeff00a5deff08a5deff10a5deff19a5deff21a5deff29a5deff31a5deff3aa5deff42a5deff4aa5deff52a5deff5aa5deff63a5deff6ba5deff73a5deff7ba5deff84a5deff8ca5deff94a5deff9ca5deffa5a5deffada5deffb5a5deffbda5deffc5a5deffcea5deffd6a5deffdea5deffe6a5deffefa5defff7a5deffffa5deff00addeff08addeff10addeff19addeff21addeff29addeff31addeff3aaddeff42addeff4aaddeff52addeff5aaddeff63addeff6baddeff73addeff7baddeff84addeff8caddeff94addeff9caddeffa5addeffadaddeffb5addeffbdaddeffc5addeffceaddeffd6addeffdeaddeffe6addeffefaddefff7addeffffaddeff00b5deff08b5deff10b5deff19b5deff21b5deff29b5deff31b5deff3ab5deff42b5deff4ab5deff52b5deff5ab5deff63b5deff6bb5deff73b5deff7bb5deff84b5deff8cb5deff94b5deff9cb5deffa5b5deffadb5deffb5b5deffbdb5deffc5b5deffceb5deffd6b5deffdeb5deffe6b5deffefb5defff7b5deffffb5deff00bddeff08bddeff10bddeff19bddeff21bddeff29bddeff31bddeff3abddeff42bddeff4abddeff52bddeff5abddeff63bddeff6bbddeff73bddeff7bbddeff84bddeff8cbddeff94bddeff9cbddeffa5bddeffadbddeffb5bddeffbdbddeffc5bddeffcebddeffd6bddeffdebddeffe6bddeffefbddefff7bddeffffbddeff00c5deff08c5deff10c5deff19c5deff21c5deff29c5deff31c5deff3ac5deff42c5deff4ac5deff52c5deff5ac5deff63c5deff6bc5deff73c5deff7bc5deff84c5deff8cc5deff94c5deff9cc5deffa5c5deffadc5deffb5c5deffbdc5deffc5c5deffcec5deffd6c5deffdec5deffe6c5deffefc5defff7c5deffffc5deff00cedeff08cedeff10cedeff19cedeff21cedeff29cedeff31cedeff3acedeff42cedeff4acedeff52cedeff5acedeff63cedeff6bcedeff73cedeff7bcedeff84cedeff8ccedeff94cedeff9ccedeffa5cedeffadcedeffb5cedeffbdcedeffc5cedeffcecedeffd6cedeffdecedeffe6cedeffefcedefff7cedeffffcedeff00d6deff08d6deff10d6deff19d6deff21d6deff29d6deff31d6deff3ad6deff42d6deff4ad6deff52d6deff5ad6deff63d6deff6bd6deff73d6deff7bd6deff84d6deff8cd6deff94d6deff9cd6deffa5d6deffadd6deffb5d6deffbdd6deffc5d6deffced6deffd6d6deffded6deffe6d6deffefd6defff7d6deffffd6deff00dedeff08dedeff10dedeff19dedeff21dedeff29dedeff31dedeff3adedeff42dedeff4adedeff52dedeff5adedeff63dedeff6bdedeff73dedeff7bdedeff84dedeff8cdedeff94dedeff9cdedeffa5dedeffaddedeffb5dedeffbddedeffc5dedeffcededeffd6dedeffdededeffe6dedeffefdedefff7dedeffffdedeff00e6deff08e6deff10e6deff19e6deff21e6deff29e6deff31e6deff3ae6deff42e6deff4ae6deff52e6deff5ae6deff63e6deff6be6deff73e6deff7be6deff84e6deff8ce6deff94e6deff9ce6deffa5e6deffade6deffb5e6deffbde6deffc5e6deffcee6deffd6e6deffdee6deffe6e6deffefe6defff7e6deffffe6deff00efdeff08efdeff10efdeff19efdeff21efdeff29efdeff31efdeff3aefdeff42efdeff4aefdeff52efdeff5aefdeff63efdeff6befdeff73efdeff7befdeff84efdeff8cefdeff94efdeff9cefdeffa5efdeffadefdeffb5efdeffbdefdeffc5efdeffceefdeffd6efdeffdeefdeffe6efdeffefefdefff7efdeffffefdeff00f7deff08f7deff10f7deff19f7deff21f7deff29f7deff31f7deff3af7deff42f7deff4af7deff52f7deff5af7deff63f7deff6bf7deff73f7deff7bf7deff84f7deff8cf7deff94f7deff9cf7deffa5f7deffadf7deffb5f7deffbdf7deffc5f7deffcef7deffd6f7deffdef7deffe6f7deffeff7defff7f7defffff7deff00ffdeff08ffdeff10ffdeff19ffdeff21ffdeff29ffdeff31ffdeff3affdeff42ffdeff4affdeff52ffdeff5affdeff63ffdeff6bffdeff73ffdeff7bffdeff84ffdeff8cffdeff94ffdeff9cffdeffa5ffdeffadffdeffb5ffdeffbdffdeffc5ffdeffceffdeffd6ffdeffdeffdeffe6ffdeffefffdefff7ffdeffffffdeff0000e6ff0800e6ff1000e6ff1900e6ff2100e6ff2900e6ff3100e6ff3a00e6ff4200e6ff4a00e6ff5200e6ff5a00e6ff6300e6ff6b00e6ff7300e6ff7b00e6ff8400e6ff8c00e6ff9400e6ff9c00e6ffa500e6ffad00e6ffb500e6ffbd00e6ffc500e6ffce00e6ffd600e6ffde00e6ffe600e6ffef00e6fff700e6ffff00e6ff0008e6ff0808e6ff1008e6ff1908e6ff2108e6ff2908e6ff3108e6ff3a08e6ff4208e6ff4a08e6ff5208e6ff5a08e6ff6308e6ff6b08e6ff7308e6ff7b08e6ff8408e6ff8c08e6ff9408e6ff9c08e6ffa508e6ffad08e6ffb508e6ffbd08e6ffc508e6ffce08e6ffd608e6ffde08e6ffe608e6ffef08e6fff708e6ffff08e6ff0010e6ff0810e6ff1010e6ff1910e6ff2110e6ff2910e6ff3110e6ff3a10e6ff4210e6ff4a10e6ff5210e6ff5a10e6ff6310e6ff6b10e6ff7310e6ff7b10e6ff8410e6ff8c10e6ff9410e6ff9c10e6ffa510e6ffad10e6ffb510e6ffbd10e6ffc510e6ffce10e6ffd610e6ffde10e6ffe610e6ffef10e6fff710e6ffff10e6ff0019e6ff0819e6ff1019e6ff1919e6ff2119e6ff2919e6ff3119e6ff3a19e6ff4219e6ff4a19e6ff5219e6ff5a19e6ff6319e6ff6b19e6ff7319e6ff7b19e6ff8419e6ff8c19e6ff9419e6ff9c19e6ffa519e6ffad19e6ffb519e6ffbd19e6ffc519e6ffce19e6ffd619e6ffde19e6ffe619e6ffef19e6fff719e6ffff19e6ff0021e6ff0821e6ff1021e6ff1921e6ff2121e6ff2921e6ff3121e6ff3a21e6ff4221e6ff4a21e6ff5221e6ff5a21e6ff6321e6ff6b21e6ff7321e6ff7b21e6ff8421e6ff8c21e6ff9421e6ff9c21e6ffa521e6ffad21e6ffb521e6ffbd21e6ffc521e6ffce21e6ffd621e6ffde21e6ffe621e6ffef21e6fff721e6ffff21e6ff0029e6ff0829e6ff1029e6ff1929e6ff2129e6ff2929e6ff3129e6ff3a29e6ff4229e6ff4a29e6ff5229e6ff5a29e6ff6329e6ff6b29e6ff7329e6ff7b29e6ff8429e6ff8c29e6ff9429e6ff9c29e6ffa529e6ffad29e6ffb529e6ffbd29e6ffc529e6ffce29e6ffd629e6ffde29e6ffe629e6ffef29e6fff729e6ffff29e6ff0031e6ff0831e6ff1031e6ff1931e6ff2131e6ff2931e6ff3131e6ff3a31e6ff4231e6ff4a31e6ff5231e6ff5a31e6ff6331e6ff6b31e6ff7331e6ff7b31e6ff8431e6ff8c31e6ff9431e6ff9c31e6ffa531e6ffad31e6ffb531e6ffbd31e6ffc531e6ffce31e6ffd631e6ffde31e6ffe631e6ffef31e6fff731e6ffff31e6ff003ae6ff083ae6ff103ae6ff193ae6ff213ae6ff293ae6ff313ae6ff3a3ae6ff423ae6ff4a3ae6ff523ae6ff5a3ae6ff633ae6ff6b3ae6ff733ae6ff7b3ae6ff843ae6ff8c3ae6ff943ae6ff9c3ae6ffa53ae6ffad3ae6ffb53ae6ffbd3ae6ffc53ae6ffce3ae6ffd63ae6ffde3ae6ffe63ae6ffef3ae6fff73ae6ffff3ae6ff0042e6ff0842e6ff1042e6ff1942e6ff2142e6ff2942e6ff3142e6ff3a42e6ff4242e6ff4a42e6ff5242e6ff5a42e6ff6342e6ff6b42e6ff7342e6ff7b42e6ff8442e6ff8c42e6ff9442e6ff9c42e6ffa542e6ffad42e6ffb542e6ffbd42e6ffc542e6ffce42e6ffd642e6ffde42e6ffe642e6ffef42e6fff742e6ffff42e6ff004ae6ff084ae6ff104ae6ff194ae6ff214ae6ff294ae6ff314ae6ff3a4ae6ff424ae6ff4a4ae6ff524ae6ff5a4ae6ff634ae6ff6b4ae6ff734ae6ff7b4ae6ff844ae6ff8c4ae6ff944ae6ff9c4ae6ffa54ae6ffad4ae6ffb54ae6ffbd4ae6ffc54ae6ffce4ae6ffd64ae6ffde4ae6ffe64ae6ffef4ae6fff74ae6ffff4ae6ff0052e6ff0852e6ff1052e6ff1952e6ff2152e6ff2952e6ff3152e6ff3a52e6ff4252e6ff4a52e6ff5252e6ff5a52e6ff6352e6ff6b52e6ff7352e6ff7b52e6ff8452e6ff8c52e6ff9452e6ff9c52e6ffa552e6ffad52e6ffb552e6ffbd52e6ffc552e6ffce52e6ffd652e6ffde52e6ffe652e6ffef52e6fff752e6ffff52e6ff005ae6ff085ae6ff105ae6ff195ae6ff215ae6ff295ae6ff315ae6ff3a5ae6ff425ae6ff4a5ae6ff525ae6ff5a5ae6ff635ae6ff6b5ae6ff735ae6ff7b5ae6ff845ae6ff8c5ae6ff945ae6ff9c5ae6ffa55ae6ffad5ae6ffb55ae6ffbd5ae6ffc55ae6ffce5ae6ffd65ae6ffde5ae6ffe65ae6ffef5ae6fff75ae6ffff5ae6ff0063e6ff0863e6ff1063e6ff1963e6ff2163e6ff2963e6ff3163e6ff3a63e6ff4263e6ff4a63e6ff5263e6ff5a63e6ff6363e6ff6b63e6ff7363e6ff7b63e6ff8463e6ff8c63e6ff9463e6ff9c63e6ffa563e6ffad63e6ffb563e6ffbd63e6ffc563e6ffce63e6ffd663e6ffde63e6ffe663e6ffef63e6fff763e6ffff63e6ff006be6ff086be6ff106be6ff196be6ff216be6ff296be6ff316be6ff3a6be6ff426be6ff4a6be6ff526be6ff5a6be6ff636be6ff6b6be6ff736be6ff7b6be6ff846be6ff8c6be6ff946be6ff9c6be6ffa56be6ffad6be6ffb56be6ffbd6be6ffc56be6ffce6be6ffd66be6ffde6be6ffe66be6ffef6be6fff76be6ffff6be6ff0073e6ff0873e6ff1073e6ff1973e6ff2173e6ff2973e6ff3173e6ff3a73e6ff4273e6ff4a73e6ff5273e6ff5a73e6ff6373e6ff6b73e6ff7373e6ff7b73e6ff8473e6ff8c73e6ff9473e6ff9c73e6ffa573e6ffad73e6ffb573e6ffbd73e6ffc573e6ffce73e6ffd673e6ffde73e6ffe673e6ffef73e6fff773e6ffff73e6ff007be6ff087be6ff107be6ff197be6ff217be6ff297be6ff317be6ff3a7be6ff427be6ff4a7be6ff527be6ff5a7be6ff637be6ff6b7be6ff737be6ff7b7be6ff847be6ff8c7be6ff947be6ff9c7be6ffa57be6ffad7be6ffb57be6ffbd7be6ffc57be6ffce7be6ffd67be6ffde7be6ffe67be6ffef7be6fff77be6ffff7be6ff0084e6ff0884e6ff1084e6ff1984e6ff2184e6ff2984e6ff3184e6ff3a84e6ff4284e6ff4a84e6ff5284e6ff5a84e6ff6384e6ff6b84e6ff7384e6ff7b84e6ff8484e6ff8c84e6ff9484e6ff9c84e6ffa584e6ffad84e6ffb584e6ffbd84e6ffc584e6ffce84e6ffd684e6ffde84e6ffe684e6ffef84e6fff784e6ffff84e6ff008ce6ff088ce6ff108ce6ff198ce6ff218ce6ff298ce6ff318ce6ff3a8ce6ff428ce6ff4a8ce6ff528ce6ff5a8ce6ff638ce6ff6b8ce6ff738ce6ff7b8ce6ff848ce6ff8c8ce6ff948ce6ff9c8ce6ffa58ce6ffad8ce6ffb58ce6ffbd8ce6ffc58ce6ffce8ce6ffd68ce6ffde8ce6ffe68ce6ffef8ce6fff78ce6ffff8ce6ff0094e6ff0894e6ff1094e6ff1994e6ff2194e6ff2994e6ff3194e6ff3a94e6ff4294e6ff4a94e6ff5294e6ff5a94e6ff6394e6ff6b94e6ff7394e6ff7b94e6ff8494e6ff8c94e6ff9494e6ff9c94e6ffa594e6ffad94e6ffb594e6ffbd94e6ffc594e6ffce94e6ffd694e6ffde94e6ffe694e6ffef94e6fff794e6ffff94e6ff009ce6ff089ce6ff109ce6ff199ce6ff219ce6ff299ce6ff319ce6ff3a9ce6ff429ce6ff4a9ce6ff529ce6ff5a9ce6ff639ce6ff6b9ce6ff739ce6ff7b9ce6ff849ce6ff8c9ce6ff949ce6ff9c9ce6ffa59ce6ffad9ce6ffb59ce6ffbd9ce6ffc59ce6ffce9ce6ffd69ce6ffde9ce6ffe69ce6ffef9ce6fff79ce6ffff9ce6ff00a5e6ff08a5e6ff10a5e6ff19a5e6ff21a5e6ff29a5e6ff31a5e6ff3aa5e6ff42a5e6ff4aa5e6ff52a5e6ff5aa5e6ff63a5e6ff6ba5e6ff73a5e6ff7ba5e6ff84a5e6ff8ca5e6ff94a5e6ff9ca5e6ffa5a5e6ffada5e6ffb5a5e6ffbda5e6ffc5a5e6ffcea5e6ffd6a5e6ffdea5e6ffe6a5e6ffefa5e6fff7a5e6ffffa5e6ff00ade6ff08ade6ff10ade6ff19ade6ff21ade6ff29ade6ff31ade6ff3aade6ff42ade6ff4aade6ff52ade6ff5aade6ff63ade6ff6bade6ff73ade6ff7bade6ff84ade6ff8cade6ff94ade6ff9cade6ffa5ade6ffadade6ffb5ade6ffbdade6ffc5ade6ffceade6ffd6ade6ffdeade6ffe6ade6ffefade6fff7ade6ffffade6ff00b5e6ff08b5e6ff10b5e6ff19b5e6ff21b5e6ff29b5e6ff31b5e6ff3ab5e6ff42b5e6ff4ab5e6ff52b5e6ff5ab5e6ff63b5e6ff6bb5e6ff73b5e6ff7bb5e6ff84b5e6ff8cb5e6ff94b5e6ff9cb5e6ffa5b5e6ffadb5e6ffb5b5e6ffbdb5e6ffc5b5e6ffceb5e6ffd6b5e6ffdeb5e6ffe6b5e6ffefb5e6fff7b5e6ffffb5e6ff00bde6ff08bde6ff10bde6ff19bde6ff21bde6ff29bde6ff31bde6ff3abde6ff42bde6ff4abde6ff52bde6ff5abde6ff63bde6ff6bbde6ff73bde6ff7bbde6ff84bde6ff8cbde6ff94bde6ff9cbde6ffa5bde6ffadbde6ffb5bde6ffbdbde6ffc5bde6ffcebde6ffd6bde6ffdebde6ffe6bde6ffefbde6fff7bde6ffffbde6ff00c5e6ff08c5e6ff10c5e6ff19c5e6ff21c5e6ff29c5e6ff31c5e6ff3ac5e6ff42c5e6ff4ac5e6ff52c5e6ff5ac5e6ff63c5e6ff6bc5e6ff73c5e6ff7bc5e6ff84c5e6ff8cc5e6ff94c5e6ff9cc5e6ffa5c5e6ffadc5e6ffb5c5e6ffbdc5e6ffc5c5e6ffcec5e6ffd6c5e6ffdec5e6ffe6c5e6ffefc5e6fff7c5e6ffffc5e6ff00cee6ff08cee6ff10cee6ff19cee6ff21cee6ff29cee6ff31cee6ff3acee6ff42cee6ff4acee6ff52cee6ff5acee6ff63cee6ff6bcee6ff73cee6ff7bcee6ff84cee6ff8ccee6ff94cee6ff9ccee6ffa5cee6ffadcee6ffb5cee6ffbdcee6ffc5cee6ffcecee6ffd6cee6ffdecee6ffe6cee6ffefcee6fff7cee6ffffcee6ff00d6e6ff08d6e6ff10d6e6ff19d6e6ff21d6e6ff29d6e6ff31d6e6ff3ad6e6ff42d6e6ff4ad6e6ff52d6e6ff5ad6e6ff63d6e6ff6bd6e6ff73d6e6ff7bd6e6ff84d6e6ff8cd6e6ff94d6e6ff9cd6e6ffa5d6e6ffadd6e6ffb5d6e6ffbdd6e6ffc5d6e6ffced6e6ffd6d6e6ffded6e6ffe6d6e6ffefd6e6fff7d6e6ffffd6e6ff00dee6ff08dee6ff10dee6ff19dee6ff21dee6ff29dee6ff31dee6ff3adee6ff42dee6ff4adee6ff52dee6ff5adee6ff63dee6ff6bdee6ff73dee6ff7bdee6ff84dee6ff8cdee6ff94dee6ff9cdee6ffa5dee6ffaddee6ffb5dee6ffbddee6ffc5dee6ffcedee6ffd6dee6ffdedee6ffe6dee6ffefdee6fff7dee6ffffdee6ff00e6e6ff08e6e6ff10e6e6ff19e6e6ff21e6e6ff29e6e6ff31e6e6ff3ae6e6ff42e6e6ff4ae6e6ff52e6e6ff5ae6e6ff63e6e6ff6be6e6ff73e6e6ff7be6e6ff84e6e6ff8ce6e6ff94e6e6ff9ce6e6ffa5e6e6ffade6e6ffb5e6e6ffbde6e6ffc5e6e6ffcee6e6ffd6e6e6ffdee6e6ffe6e6e6ffefe6e6fff7e6e6ffffe6e6ff00efe6ff08efe6ff10efe6ff19efe6ff21efe6ff29efe6ff31efe6ff3aefe6ff42efe6ff4aefe6ff52efe6ff5aefe6ff63efe6ff6befe6ff73efe6ff7befe6ff84efe6ff8cefe6ff94efe6ff9cefe6ffa5efe6ffadefe6ffb5efe6ffbdefe6ffc5efe6ffceefe6ffd6efe6ffdeefe6ffe6efe6ffefefe6fff7efe6ffffefe6ff00f7e6ff08f7e6ff10f7e6ff19f7e6ff21f7e6ff29f7e6ff31f7e6ff3af7e6ff42f7e6ff4af7e6ff52f7e6ff5af7e6ff63f7e6ff6bf7e6ff73f7e6ff7bf7e6ff84f7e6ff8cf7e6ff94f7e6ff9cf7e6ffa5f7e6ffadf7e6ffb5f7e6ffbdf7e6ffc5f7e6ffcef7e6ffd6f7e6ffdef7e6ffe6f7e6ffeff7e6fff7f7e6fffff7e6ff00ffe6ff08ffe6ff10ffe6ff19ffe6ff21ffe6ff29ffe6ff31ffe6ff3affe6ff42ffe6ff4affe6ff52ffe6ff5affe6ff63ffe6ff6bffe6ff73ffe6ff7bffe6ff84ffe6ff8cffe6ff94ffe6ff9cffe6ffa5ffe6ffadffe6ffb5ffe6ffbdffe6ffc5ffe6ffceffe6ffd6ffe6ffdeffe6ffe6ffe6ffefffe6fff7ffe6ffffffe6ff0000efff0800efff1000efff1900efff2100efff2900efff3100efff3a00efff4200efff4a00efff5200efff5a00efff6300efff6b00efff7300efff7b00efff8400efff8c00efff9400efff9c00efffa500efffad00efffb500efffbd00efffc500efffce00efffd600efffde00efffe600efffef00effff700efffff00efff0008efff0808efff1008efff1908efff2108efff2908efff3108efff3a08efff4208efff4a08efff5208efff5a08efff6308efff6b08efff7308efff7b08efff8408efff8c08efff9408efff9c08efffa508efffad08efffb508efffbd08efffc508efffce08efffd608efffde08efffe608efffef08effff708efffff08efff0010efff0810efff1010efff1910efff2110efff2910efff3110efff3a10efff4210efff4a10efff5210efff5a10efff6310efff6b10efff7310efff7b10efff8410efff8c10efff9410efff9c10efffa510efffad10efffb510efffbd10efffc510efffce10efffd610efffde10efffe610efffef10effff710efffff10efff0019efff0819efff1019efff1919efff2119efff2919efff3119efff3a19efff4219efff4a19efff5219efff5a19efff6319efff6b19efff7319efff7b19efff8419efff8c19efff9419efff9c19efffa519efffad19efffb519efffbd19efffc519efffce19efffd619efffde19efffe619efffef19effff719efffff19efff0021efff0821efff1021efff1921efff2121efff2921efff3121efff3a21efff4221efff4a21efff5221efff5a21efff6321efff6b21efff7321efff7b21efff8421efff8c21efff9421efff9c21efffa521efffad21efffb521efffbd21efffc521efffce21efffd621efffde21efffe621efffef21effff721efffff21efff0029efff0829efff1029efff1929efff2129efff2929efff3129efff3a29efff4229efff4a29efff5229efff5a29efff6329efff6b29efff7329efff7b29efff8429efff8c29efff9429efff9c29efffa529efffad29efffb529efffbd29efffc529efffce29efffd629efffde29efffe629efffef29effff729efffff29efff0031efff0831efff1031efff1931efff2131efff2931efff3131efff3a31efff4231efff4a31efff5231efff5a31efff6331efff6b31efff7331efff7b31efff8431efff8c31efff9431efff9c31efffa531efffad31efffb531efffbd31efffc531efffce31efffd631efffde31efffe631efffef31effff731efffff31efff003aefff083aefff103aefff193aefff213aefff293aefff313aefff3a3aefff423aefff4a3aefff523aefff5a3aefff633aefff6b3aefff733aefff7b3aefff843aefff8c3aefff943aefff9c3aefffa53aefffad3aefffb53aefffbd3aefffc53aefffce3aefffd63aefffde3aefffe63aefffef3aeffff73aefffff3aefff0042efff0842efff1042efff1942efff2142efff2942efff3142efff3a42efff4242efff4a42efff5242efff5a42efff6342efff6b42efff7342efff7b42efff8442efff8c42efff9442efff9c42efffa542efffad42efffb542efffbd42efffc542efffce42efffd642efffde42efffe642efffef42effff742efffff42efff004aefff084aefff104aefff194aefff214aefff294aefff314aefff3a4aefff424aefff4a4aefff524aefff5a4aefff634aefff6b4aefff734aefff7b4aefff844aefff8c4aefff944aefff9c4aefffa54aefffad4aefffb54aefffbd4aefffc54aefffce4aefffd64aefffde4aefffe64aefffef4aeffff74aefffff4aefff0052efff0852efff1052efff1952efff2152efff2952efff3152efff3a52efff4252efff4a52efff5252efff5a52efff6352efff6b52efff7352efff7b52efff8452efff8c52efff9452efff9c52efffa552efffad52efffb552efffbd52efffc552efffce52efffd652efffde52efffe652efffef52effff752efffff52efff005aefff085aefff105aefff195aefff215aefff295aefff315aefff3a5aefff425aefff4a5aefff525aefff5a5aefff635aefff6b5aefff735aefff7b5aefff845aefff8c5aefff945aefff9c5aefffa55aefffad5aefffb55aefffbd5aefffc55aefffce5aefffd65aefffde5aefffe65aefffef5aeffff75aefffff5aefff0063efff0863efff1063efff1963efff2163efff2963efff3163efff3a63efff4263efff4a63efff5263efff5a63efff6363efff6b63efff7363efff7b63efff8463efff8c63efff9463efff9c63efffa563efffad63efffb563efffbd63efffc563efffce63efffd663efffde63efffe663efffef63effff763efffff63efff006befff086befff106befff196befff216befff296befff316befff3a6befff426befff4a6befff526befff5a6befff636befff6b6befff736befff7b6befff846befff8c6befff946befff9c6befffa56befffad6befffb56befffbd6befffc56befffce6befffd66befffde6befffe66befffef6beffff76befffff6befff0073efff0873efff1073efff1973efff2173efff2973efff3173efff3a73efff4273efff4a73efff5273efff5a73efff6373efff6b73efff7373efff7b73efff8473efff8c73efff9473efff9c73efffa573efffad73efffb573efffbd73efffc573efffce73efffd673efffde73efffe673efffef73effff773efffff73efff007befff087befff107befff197befff217befff297befff317befff3a7befff427befff4a7befff527befff5a7befff637befff6b7befff737befff7b7befff847befff8c7befff947befff9c7befffa57befffad7befffb57befffbd7befffc57befffce7befffd67befffde7befffe67befffef7beffff77befffff7befff0084efff0884efff1084efff1984efff2184efff2984efff3184efff3a84efff4284efff4a84efff5284efff5a84efff6384efff6b84efff7384efff7b84efff8484efff8c84efff9484efff9c84efffa584efffad84efffb584efffbd84efffc584efffce84efffd684efffde84efffe684efffef84effff784efffff84efff008cefff088cefff108cefff198cefff218cefff298cefff318cefff3a8cefff428cefff4a8cefff528cefff5a8cefff638cefff6b8cefff738cefff7b8cefff848cefff8c8cefff948cefff9c8cefffa58cefffad8cefffb58cefffbd8cefffc58cefffce8cefffd68cefffde8cefffe68cefffef8ceffff78cefffff8cefff0094efff0894efff1094efff1994efff2194efff2994efff3194efff3a94efff4294efff4a94efff5294efff5a94efff6394efff6b94efff7394efff7b94efff8494efff8c94efff9494efff9c94efffa594efffad94efffb594efffbd94efffc594efffce94efffd694efffde94efffe694efffef94effff794efffff94efff009cefff089cefff109cefff199cefff219cefff299cefff319cefff3a9cefff429cefff4a9cefff529cefff5a9cefff639cefff6b9cefff739cefff7b9cefff849cefff8c9cefff949cefff9c9cefffa59cefffad9cefffb59cefffbd9cefffc59cefffce9cefffd69cefffde9cefffe69cefffef9ceffff79cefffff9cefff00a5efff08a5efff10a5efff19a5efff21a5efff29a5efff31a5efff3aa5efff42a5efff4aa5efff52a5efff5aa5efff63a5efff6ba5efff73a5efff7ba5efff84a5efff8ca5efff94a5efff9ca5efffa5a5efffada5efffb5a5efffbda5efffc5a5efffcea5efffd6a5efffdea5efffe6a5efffefa5effff7a5efffffa5efff00adefff08adefff10adefff19adefff21adefff29adefff31adefff3aadefff42adefff4aadefff52adefff5aadefff63adefff6badefff73adefff7badefff84adefff8cadefff94adefff9cadefffa5adefffadadefffb5adefffbdadefffc5adefffceadefffd6adefffdeadefffe6adefffefadeffff7adefffffadefff00b5efff08b5efff10b5efff19b5efff21b5efff29b5efff31b5efff3ab5efff42b5efff4ab5efff52b5efff5ab5efff63b5efff6bb5efff73b5efff7bb5efff84b5efff8cb5efff94b5efff9cb5efffa5b5efffadb5efffb5b5efffbdb5efffc5b5efffceb5efffd6b5efffdeb5efffe6b5efffefb5effff7b5efffffb5efff00bdefff08bdefff10bdefff19bdefff21bdefff29bdefff31bdefff3abdefff42bdefff4abdefff52bdefff5abdefff63bdefff6bbdefff73bdefff7bbdefff84bdefff8cbdefff94bdefff9cbdefffa5bdefffadbdefffb5bdefffbdbdefffc5bdefffcebdefffd6bdefffdebdefffe6bdefffefbdeffff7bdefffffbdefff00c5efff08c5efff10c5efff19c5efff21c5efff29c5efff31c5efff3ac5efff42c5efff4ac5efff52c5efff5ac5efff63c5efff6bc5efff73c5efff7bc5efff84c5efff8cc5efff94c5efff9cc5efffa5c5efffadc5efffb5c5efffbdc5efffc5c5efffcec5efffd6c5efffdec5efffe6c5efffefc5effff7c5efffffc5efff00ceefff08ceefff10ceefff19ceefff21ceefff29ceefff31ceefff3aceefff42ceefff4aceefff52ceefff5aceefff63ceefff6bceefff73ceefff7bceefff84ceefff8cceefff94ceefff9cceefffa5ceefffadceefffb5ceefffbdceefffc5ceefffceceefffd6ceefffdeceefffe6ceefffefceeffff7ceefffffceefff00d6efff08d6efff10d6efff19d6efff21d6efff29d6efff31d6efff3ad6efff42d6efff4ad6efff52d6efff5ad6efff63d6efff6bd6efff73d6efff7bd6efff84d6efff8cd6efff94d6efff9cd6efffa5d6efffadd6efffb5d6efffbdd6efffc5d6efffced6efffd6d6efffded6efffe6d6efffefd6effff7d6efffffd6efff00deefff08deefff10deefff19deefff21deefff29deefff31deefff3adeefff42deefff4adeefff52deefff5adeefff63deefff6bdeefff73deefff7bdeefff84deefff8cdeefff94deefff9cdeefffa5deefffaddeefffb5deefffbddeefffc5deefffcedeefffd6deefffdedeefffe6deefffefdeeffff7deefffffdeefff00e6efff08e6efff10e6efff19e6efff21e6efff29e6efff31e6efff3ae6efff42e6efff4ae6efff52e6efff5ae6efff63e6efff6be6efff73e6efff7be6efff84e6efff8ce6efff94e6efff9ce6efffa5e6efffade6efffb5e6efffbde6efffc5e6efffcee6efffd6e6efffdee6efffe6e6efffefe6effff7e6efffffe6efff00efefff08efefff10efefff19efefff21efefff29efefff31efefff3aefefff42efefff4aefefff52efefff5aefefff63efefff6befefff73efefff7befefff84efefff8cefefff94efefff9cefefffa5efefffadefefffb5efefffbdefefffc5efefffceefefffd6efefffdeefefffe6efefffefefeffff7efefffffefefff00f7efff08f7efff10f7efff19f7efff21f7efff29f7efff31f7efff3af7efff42f7efff4af7efff52f7efff5af7efff63f7efff6bf7efff73f7efff7bf7efff84f7efff8cf7efff94f7efff9cf7efffa5f7efffadf7efffb5f7efffbdf7efffc5f7efffcef7efffd6f7efffdef7efffe6f7efffeff7effff7f7effffff7efff00ffefff08ffefff10ffefff19ffefff21ffefff29ffefff31ffefff3affefff42ffefff4affefff52ffefff5affefff63ffefff6bffefff73ffefff7bffefff84ffefff8cffefff94ffefff9cffefffa5ffefffadffefffb5ffefffbdffefffc5ffefffceffefffd6ffefffdeffefffe6ffefffefffeffff7ffefffffffefff0000f7ff0800f7ff1000f7ff1900f7ff2100f7ff2900f7ff3100f7ff3a00f7ff4200f7ff4a00f7ff5200f7ff5a00f7ff6300f7ff6b00f7ff7300f7ff7b00f7ff8400f7ff8c00f7ff9400f7ff9c00f7ffa500f7ffad00f7ffb500f7ffbd00f7ffc500f7ffce00f7ffd600f7ffde00f7ffe600f7ffef00f7fff700f7ffff00f7ff0008f7ff0808f7ff1008f7ff1908f7ff2108f7ff2908f7ff3108f7ff3a08f7ff4208f7ff4a08f7ff5208f7ff5a08f7ff6308f7ff6b08f7ff7308f7ff7b08f7ff8408f7ff8c08f7ff9408f7ff9c08f7ffa508f7ffad08f7ffb508f7ffbd08f7ffc508f7ffce08f7ffd608f7ffde08f7ffe608f7ffef08f7fff708f7ffff08f7ff0010f7ff0810f7ff1010f7ff1910f7ff2110f7ff2910f7ff3110f7ff3a10f7ff4210f7ff4a10f7ff5210f7ff5a10f7ff6310f7ff6b10f7ff7310f7ff7b10f7ff8410f7ff8c10f7ff9410f7ff9c10f7ffa510f7ffad10f7ffb510f7ffbd10f7ffc510f7ffce10f7ffd610f7ffde10f7ffe610f7ffef10f7fff710f7ffff10f7ff0019f7ff0819f7ff1019f7ff1919f7ff2119f7ff2919f7ff3119f7ff3a19f7ff4219f7ff4a19f7ff5219f7ff5a19f7ff6319f7ff6b19f7ff7319f7ff7b19f7ff8419f7ff8c19f7ff9419f7ff9c19f7ffa519f7ffad19f7ffb519f7ffbd19f7ffc519f7ffce19f7ffd619f7ffde19f7ffe619f7ffef19f7fff719f7ffff19f7ff0021f7ff0821f7ff1021f7ff1921f7ff2121f7ff2921f7ff3121f7ff3a21f7ff4221f7ff4a21f7ff5221f7ff5a21f7ff6321f7ff6b21f7ff7321f7ff7b21f7ff8421f7ff8c21f7ff9421f7ff9c21f7ffa521f7ffad21f7ffb521f7ffbd21f7ffc521f7ffce21f7ffd621f7ffde21f7ffe621f7ffef21f7fff721f7ffff21f7ff0029f7ff0829f7ff1029f7ff1929f7ff2129f7ff2929f7ff3129f7ff3a29f7ff4229f7ff4a29f7ff5229f7ff5a29f7ff6329f7ff6b29f7ff7329f7ff7b29f7ff8429f7ff8c29f7ff9429f7ff9c29f7ffa529f7ffad29f7ffb529f7ffbd29f7ffc529f7ffce29f7ffd629f7ffde29f7ffe629f7ffef29f7fff729f7ffff29f7ff0031f7ff0831f7ff1031f7ff1931f7ff2131f7ff2931f7ff3131f7ff3a31f7ff4231f7ff4a31f7ff5231f7ff5a31f7ff6331f7ff6b31f7ff7331f7ff7b31f7ff8431f7ff8c31f7ff9431f7ff9c31f7ffa531f7ffad31f7ffb531f7ffbd31f7ffc531f7ffce31f7ffd631f7ffde31f7ffe631f7ffef31f7fff731f7ffff31f7ff003af7ff083af7ff103af7ff193af7ff213af7ff293af7ff313af7ff3a3af7ff423af7ff4a3af7ff523af7ff5a3af7ff633af7ff6b3af7ff733af7ff7b3af7ff843af7ff8c3af7ff943af7ff9c3af7ffa53af7ffad3af7ffb53af7ffbd3af7ffc53af7ffce3af7ffd63af7ffde3af7ffe63af7ffef3af7fff73af7ffff3af7ff0042f7ff0842f7ff1042f7ff1942f7ff2142f7ff2942f7ff3142f7ff3a42f7ff4242f7ff4a42f7ff5242f7ff5a42f7ff6342f7ff6b42f7ff7342f7ff7b42f7ff8442f7ff8c42f7ff9442f7ff9c42f7ffa542f7ffad42f7ffb542f7ffbd42f7ffc542f7ffce42f7ffd642f7ffde42f7ffe642f7ffef42f7fff742f7ffff42f7ff004af7ff084af7ff104af7ff194af7ff214af7ff294af7ff314af7ff3a4af7ff424af7ff4a4af7ff524af7ff5a4af7ff634af7ff6b4af7ff734af7ff7b4af7ff844af7ff8c4af7ff944af7ff9c4af7ffa54af7ffad4af7ffb54af7ffbd4af7ffc54af7ffce4af7ffd64af7ffde4af7ffe64af7ffef4af7fff74af7ffff4af7ff0052f7ff0852f7ff1052f7ff1952f7ff2152f7ff2952f7ff3152f7ff3a52f7ff4252f7ff4a52f7ff5252f7ff5a52f7ff6352f7ff6b52f7ff7352f7ff7b52f7ff8452f7ff8c52f7ff9452f7ff9c52f7ffa552f7ffad52f7ffb552f7ffbd52f7ffc552f7ffce52f7ffd652f7ffde52f7ffe652f7ffef52f7fff752f7ffff52f7ff005af7ff085af7ff105af7ff195af7ff215af7ff295af7ff315af7ff3a5af7ff425af7ff4a5af7ff525af7ff5a5af7ff635af7ff6b5af7ff735af7ff7b5af7ff845af7ff8c5af7ff945af7ff9c5af7ffa55af7ffad5af7ffb55af7ffbd5af7ffc55af7ffce5af7ffd65af7ffde5af7ffe65af7ffef5af7fff75af7ffff5af7ff0063f7ff0863f7ff1063f7ff1963f7ff2163f7ff2963f7ff3163f7ff3a63f7ff4263f7ff4a63f7ff5263f7ff5a63f7ff6363f7ff6b63f7ff7363f7ff7b63f7ff8463f7ff8c63f7ff9463f7ff9c63f7ffa563f7ffad63f7ffb563f7ffbd63f7ffc563f7ffce63f7ffd663f7ffde63f7ffe663f7ffef63f7fff763f7ffff63f7ff006bf7ff086bf7ff106bf7ff196bf7ff216bf7ff296bf7ff316bf7ff3a6bf7ff426bf7ff4a6bf7ff526bf7ff5a6bf7ff636bf7ff6b6bf7ff736bf7ff7b6bf7ff846bf7ff8c6bf7ff946bf7ff9c6bf7ffa56bf7ffad6bf7ffb56bf7ffbd6bf7ffc56bf7ffce6bf7ffd66bf7ffde6bf7ffe66bf7ffef6bf7fff76bf7ffff6bf7ff0073f7ff0873f7ff1073f7ff1973f7ff2173f7ff2973f7ff3173f7ff3a73f7ff4273f7ff4a73f7ff5273f7ff5a73f7ff6373f7ff6b73f7ff7373f7ff7b73f7ff8473f7ff8c73f7ff9473f7ff9c73f7ffa573f7ffad73f7ffb573f7ffbd73f7ffc573f7ffce73f7ffd673f7ffde73f7ffe673f7ffef73f7fff773f7ffff73f7ff007bf7ff087bf7ff107bf7ff197bf7ff217bf7ff297bf7ff317bf7ff3a7bf7ff427bf7ff4a7bf7ff527bf7ff5a7bf7ff637bf7ff6b7bf7ff737bf7ff7b7bf7ff847bf7ff8c7bf7ff947bf7ff9c7bf7ffa57bf7ffad7bf7ffb57bf7ffbd7bf7ffc57bf7ffce7bf7ffd67bf7ffde7bf7ffe67bf7ffef7bf7fff77bf7ffff7bf7ff0084f7ff0884f7ff1084f7ff1984f7ff2184f7ff2984f7ff3184f7ff3a84f7ff4284f7ff4a84f7ff5284f7ff5a84f7ff6384f7ff6b84f7ff7384f7ff7b84f7ff8484f7ff8c84f7ff9484f7ff9c84f7ffa584f7ffad84f7ffb584f7ffbd84f7ffc584f7ffce84f7ffd684f7ffde84f7ffe684f7ffef84f7fff784f7ffff84f7ff008cf7ff088cf7ff108cf7ff198cf7ff218cf7ff298cf7ff318cf7ff3a8cf7ff428cf7ff4a8cf7ff528cf7ff5a8cf7ff638cf7ff6b8cf7ff738cf7ff7b8cf7ff848cf7ff8c8cf7ff948cf7ff9c8cf7ffa58cf7ffad8cf7ffb58cf7ffbd8cf7ffc58cf7ffce8cf7ffd68cf7ffde8cf7ffe68cf7ffef8cf7fff78cf7ffff8cf7ff0094f7ff0894f7ff1094f7ff1994f7ff2194f7ff2994f7ff3194f7ff3a94f7ff4294f7ff4a94f7ff5294f7ff5a94f7ff6394f7ff6b94f7ff7394f7ff7b94f7ff8494f7ff8c94f7ff9494f7ff9c94f7ffa594f7ffad94f7ffb594f7ffbd94f7ffc594f7ffce94f7ffd694f7ffde94f7ffe694f7ffef94f7fff794f7ffff94f7ff009cf7ff089cf7ff109cf7ff199cf7ff219cf7ff299cf7ff319cf7ff3a9cf7ff429cf7ff4a9cf7ff529cf7ff5a9cf7ff639cf7ff6b9cf7ff739cf7ff7b9cf7ff849cf7ff8c9cf7ff949cf7ff9c9cf7ffa59cf7ffad9cf7ffb59cf7ffbd9cf7ffc59cf7ffce9cf7ffd69cf7ffde9cf7ffe69cf7ffef9cf7fff79cf7ffff9cf7ff00a5f7ff08a5f7ff10a5f7ff19a5f7ff21a5f7ff29a5f7ff31a5f7ff3aa5f7ff42a5f7ff4aa5f7ff52a5f7ff5aa5f7ff63a5f7ff6ba5f7ff73a5f7ff7ba5f7ff84a5f7ff8ca5f7ff94a5f7ff9ca5f7ffa5a5f7ffada5f7ffb5a5f7ffbda5f7ffc5a5f7ffcea5f7ffd6a5f7ffdea5f7ffe6a5f7ffefa5f7fff7a5f7ffffa5f7ff00adf7ff08adf7ff10adf7ff19adf7ff21adf7ff29adf7ff31adf7ff3aadf7ff42adf7ff4aadf7ff52adf7ff5aadf7ff63adf7ff6badf7ff73adf7ff7badf7ff84adf7ff8cadf7ff94adf7ff9cadf7ffa5adf7ffadadf7ffb5adf7ffbdadf7ffc5adf7ffceadf7ffd6adf7ffdeadf7ffe6adf7ffefadf7fff7adf7ffffadf7ff00b5f7ff08b5f7ff10b5f7ff19b5f7ff21b5f7ff29b5f7ff31b5f7ff3ab5f7ff42b5f7ff4ab5f7ff52b5f7ff5ab5f7ff63b5f7ff6bb5f7ff73b5f7ff7bb5f7ff84b5f7ff8cb5f7ff94b5f7ff9cb5f7ffa5b5f7ffadb5f7ffb5b5f7ffbdb5f7ffc5b5f7ffceb5f7ffd6b5f7ffdeb5f7ffe6b5f7ffefb5f7fff7b5f7ffffb5f7ff00bdf7ff08bdf7ff10bdf7ff19bdf7ff21bdf7ff29bdf7ff31bdf7ff3abdf7ff42bdf7ff4abdf7ff52bdf7ff5abdf7ff63bdf7ff6bbdf7ff73bdf7ff7bbdf7ff84bdf7ff8cbdf7ff94bdf7ff9cbdf7ffa5bdf7ffadbdf7ffb5bdf7ffbdbdf7ffc5bdf7ffcebdf7ffd6bdf7ffdebdf7ffe6bdf7ffefbdf7fff7bdf7ffffbdf7ff00c5f7ff08c5f7ff10c5f7ff19c5f7ff21c5f7ff29c5f7ff31c5f7ff3ac5f7ff42c5f7ff4ac5f7ff52c5f7ff5ac5f7ff63c5f7ff6bc5f7ff73c5f7ff7bc5f7ff84c5f7ff8cc5f7ff94c5f7ff9cc5f7ffa5c5f7ffadc5f7ffb5c5f7ffbdc5f7ffc5c5f7ffcec5f7ffd6c5f7ffdec5f7ffe6c5f7ffefc5f7fff7c5f7ffffc5f7ff00cef7ff08cef7ff10cef7ff19cef7ff21cef7ff29cef7ff31cef7ff3acef7ff42cef7ff4acef7ff52cef7ff5acef7ff63cef7ff6bcef7ff73cef7ff7bcef7ff84cef7ff8ccef7ff94cef7ff9ccef7ffa5cef7ffadcef7ffb5cef7ffbdcef7ffc5cef7ffcecef7ffd6cef7ffdecef7ffe6cef7ffefcef7fff7cef7ffffcef7ff00d6f7ff08d6f7ff10d6f7ff19d6f7ff21d6f7ff29d6f7ff31d6f7ff3ad6f7ff42d6f7ff4ad6f7ff52d6f7ff5ad6f7ff63d6f7ff6bd6f7ff73d6f7ff7bd6f7ff84d6f7ff8cd6f7ff94d6f7ff9cd6f7ffa5d6f7ffadd6f7ffb5d6f7ffbdd6f7ffc5d6f7ffced6f7ffd6d6f7ffded6f7ffe6d6f7ffefd6f7fff7d6f7ffffd6f7ff00def7ff08def7ff10def7ff19def7ff21def7ff29def7ff31def7ff3adef7ff42def7ff4adef7ff52def7ff5adef7ff63def7ff6bdef7ff73def7ff7bdef7ff84def7ff8cdef7ff94def7ff9cdef7ffa5def7ffaddef7ffb5def7ffbddef7ffc5def7ffcedef7ffd6def7ffdedef7ffe6def7ffefdef7fff7def7ffffdef7ff00e6f7ff08e6f7ff10e6f7ff19e6f7ff21e6f7ff29e6f7ff31e6f7ff3ae6f7ff42e6f7ff4ae6f7ff52e6f7ff5ae6f7ff63e6f7ff6be6f7ff73e6f7ff7be6f7ff84e6f7ff8ce6f7ff94e6f7ff9ce6f7ffa5e6f7ffade6f7ffb5e6f7ffbde6f7ffc5e6f7ffcee6f7ffd6e6f7ffdee6f7ffe6e6f7ffefe6f7fff7e6f7ffffe6f7ff00eff7ff08eff7ff10eff7ff19eff7ff21eff7ff29eff7ff31eff7ff3aeff7ff42eff7ff4aeff7ff52eff7ff5aeff7ff63eff7ff6beff7ff73eff7ff7beff7ff84eff7ff8ceff7ff94eff7ff9ceff7ffa5eff7ffadeff7ffb5eff7ffbdeff7ffc5eff7ffceeff7ffd6eff7ffdeeff7ffe6eff7ffefeff7fff7eff7ffffeff7ff00f7f7ff08f7f7ff10f7f7ff19f7f7ff21f7f7ff29f7f7ff31f7f7ff3af7f7ff42f7f7ff4af7f7ff52f7f7ff5af7f7ff63f7f7ff6bf7f7ff73f7f7ff7bf7f7ff84f7f7ff8cf7f7ff94f7f7ff9cf7f7ffa5f7f7ffadf7f7ffb5f7f7ffbdf7f7ffc5f7f7ffcef7f7ffd6f7f7ffdef7f7ffe6f7f7ffeff7f7fff7f7f7fffff7f7ff00fff7ff08fff7ff10fff7ff19fff7ff21fff7ff29fff7ff31fff7ff3afff7ff42fff7ff4afff7ff52fff7ff5afff7ff63fff7ff6bfff7ff73fff7ff7bfff7ff84fff7ff8cfff7ff94fff7ff9cfff7ffa5fff7ffadfff7ffb5fff7ffbdfff7ffc5fff7ffcefff7ffd6fff7ffdefff7ffe6fff7ffeffff7fff7fff7fffffff7ff0000ffff0800ffff1000ffff1900ffff2100ffff2900ffff3100ffff3a00ffff4200ffff4a00ffff5200ffff5a00ffff6300ffff6b00ffff7300ffff7b00ffff8400ffff8c00ffff9400ffff9c00ffffa500ffffad00ffffb500ffffbd00ffffc500ffffce00ffffd600ffffde00ffffe600ffffef00fffff700ffffff00ffff0008ffff0808ffff1008ffff1908ffff2108ffff2908ffff3108ffff3a08ffff4208ffff4a08ffff5208ffff5a08ffff6308ffff6b08ffff7308ffff7b08ffff8408ffff8c08ffff9408ffff9c08ffffa508ffffad08ffffb508ffffbd08ffffc508ffffce08ffffd608ffffde08ffffe608ffffef08fffff708ffffff08ffff0010ffff0810ffff1010ffff1910ffff2110ffff2910ffff3110ffff3a10ffff4210ffff4a10ffff5210ffff5a10ffff6310ffff6b10ffff7310ffff7b10ffff8410ffff8c10ffff9410ffff9c10ffffa510ffffad10ffffb510ffffbd10ffffc510ffffce10ffffd610ffffde10ffffe610ffffef10fffff710ffffff10ffff0019ffff0819ffff1019ffff1919ffff2119ffff2919ffff3119ffff3a19ffff4219ffff4a19ffff5219ffff5a19ffff6319ffff6b19ffff7319ffff7b19ffff8419ffff8c19ffff9419ffff9c19ffffa519ffffad19ffffb519ffffbd19ffffc519ffffce19ffffd619ffffde19ffffe619ffffef19fffff719ffffff19ffff0021ffff0821ffff1021ffff1921ffff2121ffff2921ffff3121ffff3a21ffff4221ffff4a21ffff5221ffff5a21ffff6321ffff6b21ffff7321ffff7b21ffff8421ffff8c21ffff9421ffff9c21ffffa521ffffad21ffffb521ffffbd21ffffc521ffffce21ffffd621ffffde21ffffe621ffffef21fffff721ffffff21ffff0029ffff0829ffff1029ffff1929ffff2129ffff2929ffff3129ffff3a29ffff4229ffff4a29ffff5229ffff5a29ffff6329ffff6b29ffff7329ffff7b29ffff8429ffff8c29ffff9429ffff9c29ffffa529ffffad29ffffb529ffffbd29ffffc529ffffce29ffffd629ffffde29ffffe629ffffef29fffff729ffffff29ffff0031ffff0831ffff1031ffff1931ffff2131ffff2931ffff3131ffff3a31ffff4231ffff4a31ffff5231ffff5a31ffff6331ffff6b31ffff7331ffff7b31ffff8431ffff8c31ffff9431ffff9c31ffffa531ffffad31ffffb531ffffbd31ffffc531ffffce31ffffd631ffffde31ffffe631ffffef31fffff731ffffff31ffff003affff083affff103affff193affff213affff293affff313affff3a3affff423affff4a3affff523affff5a3affff633affff6b3affff733affff7b3affff843affff8c3affff943affff9c3affffa53affffad3affffb53affffbd3affffc53affffce3affffd63affffde3affffe63affffef3afffff73affffff3affff0042ffff0842ffff1042ffff1942ffff2142ffff2942ffff3142ffff3a42ffff4242ffff4a42ffff5242ffff5a42ffff6342ffff6b42ffff7342ffff7b42ffff8442ffff8c42ffff9442ffff9c42ffffa542ffffad42ffffb542ffffbd42ffffc542ffffce42ffffd642ffffde42ffffe642ffffef42fffff742ffffff42ffff004affff084affff104affff194affff214affff294affff314affff3a4affff424affff4a4affff524affff5a4affff634affff6b4affff734affff7b4affff844affff8c4affff944affff9c4affffa54affffad4affffb54affffbd4affffc54affffce4affffd64affffde4affffe64affffef4afffff74affffff4affff0052ffff0852ffff1052ffff1952ffff2152ffff2952ffff3152ffff3a52ffff4252ffff4a52ffff5252ffff5a52ffff6352ffff6b52ffff7352ffff7b52ffff8452ffff8c52ffff9452ffff9c52ffffa552ffffad52ffffb552ffffbd52ffffc552ffffce52ffffd652ffffde52ffffe652ffffef52fffff752ffffff52ffff005affff085affff105affff195affff215affff295affff315affff3a5affff425affff4a5affff525affff5a5affff635affff6b5affff735affff7b5affff845affff8c5affff945affff9c5affffa55affffad5affffb55affffbd5affffc55affffce5affffd65affffde5affffe65affffef5afffff75affffff5affff0063ffff0863ffff1063ffff1963ffff2163ffff2963ffff3163ffff3a63ffff4263ffff4a63ffff5263ffff5a63ffff6363ffff6b63ffff7363ffff7b63ffff8463ffff8c63ffff9463ffff9c63ffffa563ffffad63ffffb563ffffbd63ffffc563ffffce63ffffd663ffffde63ffffe663ffffef63fffff763ffffff63ffff006bffff086bffff106bffff196bffff216bffff296bffff316bffff3a6bffff426bffff4a6bffff526bffff5a6bffff636bffff6b6bffff736bffff7b6bffff846bffff8c6bffff946bffff9c6bffffa56bffffad6bffffb56bffffbd6bffffc56bffffce6bffffd66bffffde6bffffe66bffffef6bfffff76bffffff6bffff0073ffff0873ffff1073ffff1973ffff2173ffff2973ffff3173ffff3a73ffff4273ffff4a73ffff5273ffff5a73ffff6373ffff6b73ffff7373ffff7b73ffff8473ffff8c73ffff9473ffff9c73ffffa573ffffad73ffffb573ffffbd73ffffc573ffffce73ffffd673ffffde73ffffe673ffffef73fffff773ffffff73ffff007bffff087bffff107bffff197bffff217bffff297bffff317bffff3a7bffff427bffff4a7bffff527bffff5a7bffff637bffff6b7bffff737bffff7b7bffff847bffff8c7bffff947bffff9c7bffffa57bffffad7bffffb57bffffbd7bffffc57bffffce7bffffd67bffffde7bffffe67bffffef7bfffff77bffffff7bffff0084ffff0884ffff1084ffff1984ffff2184ffff2984ffff3184ffff3a84ffff4284ffff4a84ffff5284ffff5a84ffff6384ffff6b84ffff7384ffff7b84ffff8484ffff8c84ffff9484ffff9c84ffffa584ffffad84ffffb584ffffbd84ffffc584ffffce84ffffd684ffffde84ffffe684ffffef84fffff784ffffff84ffff008cffff088cffff108cffff198cffff218cffff298cffff318cffff3a8cffff428cffff4a8cffff528cffff5a8cffff638cffff6b8cffff738cffff7b8cffff848cffff8c8cffff948cffff9c8cffffa58cffffad8cffffb58cffffbd8cffffc58cffffce8cffffd68cffffde8cffffe68cffffef8cfffff78cffffff8cffff0094ffff0894ffff1094ffff1994ffff2194ffff2994ffff3194ffff3a94ffff4294ffff4a94ffff5294ffff5a94ffff6394ffff6b94ffff7394ffff7b94ffff8494ffff8c94ffff9494ffff9c94ffffa594ffffad94ffffb594ffffbd94ffffc594ffffce94ffffd694ffffde94ffffe694ffffef94fffff794ffffff94ffff009cffff089cffff109cffff199cffff219cffff299cffff319cffff3a9cffff429cffff4a9cffff529cffff5a9cffff639cffff6b9cffff739cffff7b9cffff849cffff8c9cffff949cffff9c9cffffa59cffffad9cffffb59cffffbd9cffffc59cffffce9cffffd69cffffde9cffffe69cffffef9cfffff79cffffff9cffff00a5ffff08a5ffff10a5ffff19a5ffff21a5ffff29a5ffff31a5ffff3aa5ffff42a5ffff4aa5ffff52a5ffff5aa5ffff63a5ffff6ba5ffff73a5ffff7ba5ffff84a5ffff8ca5ffff94a5ffff9ca5ffffa5a5ffffada5ffffb5a5ffffbda5ffffc5a5ffffcea5ffffd6a5ffffdea5ffffe6a5ffffefa5fffff7a5ffffffa5ffff00adffff08adffff10adffff19adffff21adffff29adffff31adffff3aadffff42adffff4aadffff52adffff5aadffff63adffff6badffff73adffff7badffff84adffff8cadffff94adffff9cadffffa5adffffadadffffb5adffffbdadffffc5adffffceadffffd6adffffdeadffffe6adffffefadfffff7adffffffadffff00b5ffff08b5ffff10b5ffff19b5ffff21b5ffff29b5ffff31b5ffff3ab5ffff42b5ffff4ab5ffff52b5ffff5ab5ffff63b5ffff6bb5ffff73b5ffff7bb5ffff84b5ffff8cb5ffff94b5ffff9cb5ffffa5b5ffffadb5ffffb5b5ffffbdb5ffffc5b5ffffceb5ffffd6b5ffffdeb5ffffe6b5ffffefb5fffff7b5ffffffb5ffff00bdffff08bdffff10bdffff19bdffff21bdffff29bdffff31bdffff3abdffff42bdffff4abdffff52bdffff5abdffff63bdffff6bbdffff73bdffff7bbdffff84bdffff8cbdffff94bdffff9cbdffffa5bdffffadbdffffb5bdffffbdbdffffc5bdffffcebdffffd6bdffffdebdffffe6bdffffefbdfffff7bdffffffbdffff00c5ffff08c5ffff10c5ffff19c5ffff21c5ffff29c5ffff31c5ffff3ac5ffff42c5ffff4ac5ffff52c5ffff5ac5ffff63c5ffff6bc5ffff73c5ffff7bc5ffff84c5ffff8cc5ffff94c5ffff9cc5ffffa5c5ffffadc5ffffb5c5ffffbdc5ffffc5c5ffffcec5ffffd6c5ffffdec5ffffe6c5ffffefc5fffff7c5ffffffc5ffff00ceffff08ceffff10ceffff19ceffff21ceffff29ceffff31ceffff3aceffff42ceffff4aceffff52ceffff5aceffff63ceffff6bceffff73ceffff7bceffff84ceffff8cceffff94ceffff9cceffffa5ceffffadceffffb5ceffffbdceffffc5ceffffceceffffd6ceffffdeceffffe6ceffffefcefffff7ceffffffceffff00d6ffff08d6ffff10d6ffff19d6ffff21d6ffff29d6ffff31d6ffff3ad6ffff42d6ffff4ad6ffff52d6ffff5ad6ffff63d6ffff6bd6ffff73d6ffff7bd6ffff84d6ffff8cd6ffff94d6ffff9cd6ffffa5d6ffffadd6ffffb5d6ffffbdd6ffffc5d6ffffced6ffffd6d6ffffded6ffffe6d6ffffefd6fffff7d6ffffffd6ffff00deffff08deffff10deffff19deffff21deffff29deffff31deffff3adeffff42deffff4adeffff52deffff5adeffff63deffff6bdeffff73deffff7bdeffff84deffff8cdeffff94deffff9cdeffffa5deffffaddeffffb5deffffbddeffffc5deffffcedeffffd6deffffdedeffffe6deffffefdefffff7deffffffdeffff00e6ffff08e6ffff10e6ffff19e6ffff21e6ffff29e6ffff31e6ffff3ae6ffff42e6ffff4ae6ffff52e6ffff5ae6ffff63e6ffff6be6ffff73e6ffff7be6ffff84e6ffff8ce6ffff94e6ffff9ce6ffffa5e6ffffade6ffffb5e6ffffbde6ffffc5e6ffffcee6ffffd6e6ffffdee6ffffe6e6ffffefe6fffff7e6ffffffe6ffff00efffff08efffff10efffff19efffff21efffff29efffff31efffff3aefffff42efffff4aefffff52efffff5aefffff63efffff6befffff73efffff7befffff84efffff8cefffff94efffff9cefffffa5efffffadefffffb5efffffbdefffffc5efffffceefffffd6efffffdeefffffe6efffffefeffffff7efffffffefffff00f7ffff08f7ffff10f7ffff19f7ffff21f7ffff29f7ffff31f7ffff3af7ffff42f7ffff4af7ffff52f7ffff5af7ffff63f7ffff6bf7ffff73f7ffff7bf7ffff84f7ffff8cf7ffff94f7ffff9cf7ffffa5f7ffffadf7ffffb5f7ffffbdf7ffffc5f7ffffcef7ffffd6f7ffffdef7ffffe6f7ffffeff7fffff7f7fffffff7ffff00ffffff08ffffff10ffffff19ffffff21ffffff29ffffff31ffffff3affffff42ffffff4affffff52ffffff5affffff63ffffff6bffffff73ffffff7bffffff84ffffff8cffffff94ffffff9cffffffa5ffffffadffffffb5ffffffbdffffffc5ffffffceffffffd6ffffffdeffffffe6ffffffeffffffff7ffffffffffffff + m_StreamData: + offset: 0 + size: 0 + path: diff --git a/Assets/Example3DTexture.asset.meta b/Assets/Example3DTexture.asset.meta new file mode 100644 index 0000000..e35568a --- /dev/null +++ b/Assets/Example3DTexture.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e36719ce7215fe440af46dda6a9933b3 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Lighting.cs b/Assets/Lighting.cs new file mode 100644 index 0000000..9db8726 --- /dev/null +++ b/Assets/Lighting.cs @@ -0,0 +1,52 @@ +using UnityEngine; +using UnityEditor; + +public class Lighting +{ + public static void CreateTexture3D() + { + // Configure the texture + int size = 32; + TextureFormat format = TextureFormat.RGBA32; + TextureWrapMode wrapMode = TextureWrapMode.Clamp; + + // Create the texture and apply the configuration + Texture3D texture = new Texture3D(size, size, size, format, false); + texture.wrapMode = wrapMode; + + // Create a 3-dimensional array to store color data + Color[] colors = new Color[size * size * size]; + + // Populate the array so that the x, y, and z values of the texture will map to red, blue, and green colors + float inverseResolution = 1.0f / (size - 1.0f); + for (int z = 0; z < size; z++) + { + int zOffset = z * size * size; + for (int y = 0; y < size; y++) + { + int yOffset = y * size; + for (int x = 0; x < size; x++) + { + colors[x + yOffset + zOffset] = new Color(x * inverseResolution, + y * inverseResolution, z * inverseResolution, 1.0f); + } + } + } + + // 3d texture?? yup + // just use brush fire algorithm to light the cave + // that will make nicely for the base ambiance + // then you can handle light paths or other nice depth indicating things + + // Copy the color values to the texture + texture.SetPixels(colors); + + // Apply the changes to the texture and upload the updated texture to the GPU + texture.Apply(); + +#if UNITY_EDITOR + // Save the texture to your Unity Project + AssetDatabase.CreateAsset(texture, "Assets/Example3DTexture.asset"); +#endif + } +} \ No newline at end of file diff --git a/Assets/Lighting.cs.meta b/Assets/Lighting.cs.meta new file mode 100644 index 0000000..f933c38 --- /dev/null +++ b/Assets/Lighting.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f5560e4cabd285e44b6b04035a96f584 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Monolith.cs b/Assets/Monolith.cs new file mode 100644 index 0000000..cbb017b --- /dev/null +++ b/Assets/Monolith.cs @@ -0,0 +1,466 @@ +using UnityEngine; +using System; +using System.Collections; +using System.Collections.Generic; +using NaughtyAttributes; +using Random = UnityEngine.Random; +using ExtensionMethods; +using UnityEngine.XR; + +[ExecuteInEditMode] +public class Monolith : MonoBehaviour +{ + // Then monolith the pieces (exist + // = data render and spawn(manual mono -> auto sim) + // input class fed to sim and render + // , then move, then impact) + + public Worm leftWorm, rightWorm; + + public Piece piece; + public Piece enemy; + + public Voxel[] voxels = new Voxel[48]; + public int vIndex = 0; + + public Simulate simulate = new Simulate(); + public Render render; + + [Header("References")] + public Camera cam; + + void OnEnable() + { + render.Enable(this); + } + + void OnDisable() + { + render.Disable(); + } + + [Button] + public void LightPass() + { + Lighting.CreateTexture3D(); + } + + [Button] + public void Reset() + { + voxels = new Voxel[voxels.Length]; + voxels[0] = new Voxel(Vector3Int.zero); + + leftWorm.pos = rightWorm.pos = Vector3Int.zero; + leftWorm.dirIndex = rightWorm.dirIndex = 0; + } + + [Button] + public void Step() + { + simulate.Step(this); + } + + InputDevice headset; + void Start() + { + headset = InputDevices.GetDeviceAtXRNode(XRNode.Head); + + testPos = piece.pos + Vector3.forward * 0.4f; + testVel = Vector3.down; + } + + Vector3Int Voxelcast(Vector3Int from, Vector3Int step) + { + Vector3Int vPos = from; + int i = 0; + while (i < 15) + { + vPos += step; + if (!InVoxel(vPos)) + { + vPos -= step; + break; + } + + i++; + } + + return vPos; + } + + Vector3 testPos; + Vector3Int voxelPos(Vector3 pos) + { + return new Vector3Int(Mathf.RoundToInt(pos.x), Mathf.RoundToInt(pos.y), Mathf.RoundToInt(pos.z)); + } + public Vector3 testVel; + float Bound(Vector3 pos, int axis, int dir) + { + Vector3Int step = Vector3Int.zero; + step[axis] = dir; + + float bound = Mathf.Infinity * dir; + float closest = Mathf.Infinity; + for (int i = 0; i < allDirs.Length; i++) + { + Vector3 d = (Vector3)allDirs[i] * 0.2f; + d[axis] = 0; + Vector3 vPos = Voxelcast(voxelPos(pos + d), step); + float dist = Mathf.Abs(vPos[axis] - pos[axis]); + if (dist < closest) + { + bound = vPos[axis]; + closest = dist; + } + } + // when hit ? + return bound + (0.2f * dir); + } + + bool InVoxel(Vector3Int pos) + { + for (int i = 0; i < voxels.Length; i++) + { + if (voxels[i].pos == pos) + { + return true; + } + } + + return false; + } + + + bool jumpBtn = false; + + + Vector3 onTouchPos, oldTouchPos; + Vector2 camAngle = new Vector2(30, 45); + Vector2 camAngleVel, oldCamAngleVel; + float delay; + [ReadOnly] + public bool movePiece; + void Update() + { + Vector3 mousePos = Input.mousePosition; + Transform camForm = cam.transform; + + // orbitcam + Quaternion headsetRot = Quaternion.identity; + headset.TryGetFeatureValue(CommonUsages.deviceRotation, out headsetRot); + if (headsetRot != null) + { + camForm.rotation = headsetRot; + } + camForm.position = camForm.rotation * Vector3.back * 10; + + + InputDevice mainCon = InputDevices.GetDeviceAtXRNode(XRNode.RightHand); + Vector2 wasd = new Vector2(Input.GetAxisRaw("Horizontal"), Input.GetAxisRaw("Vertical")); + Vector2 joystick = Vector2.zero; + mainCon.TryGetFeatureValue(CommonUsages.primary2DAxis, out joystick); + + Vector2 input = wasd + joystick; + + testVel.x += input.x * 6 * Time.deltaTime; + testVel.z += input.y * 6 * Time.deltaTime; + + if (input.sqrMagnitude == 0) + { + testVel.x *= 1 - (60 * Time.deltaTime); + testVel.z *= 1 - (60 * Time.deltaTime); + } + + mainCon.TryGetFeatureValue(CommonUsages.primaryButton, out jumpBtn); + if (Input.GetKeyDown(KeyCode.Space) || (jumpBtn && Mathf.Abs(testVel.y) < 0.1f)) + { + testVel.y = 8; + } + + + // holding + float gravStr = 1; + if ((!Input.GetKey(KeyCode.Space) && !jumpBtn) || testVel.y < 0) + { + gravStr = 3; + } + + testVel.y += -9.81f * gravStr * Time.deltaTime; + testVel = Vector3.ClampMagnitude(testVel, 60); + + // Graphics.DrawMesh(render.meshPieceDebug, + // voxelPos(testPos), Quaternion.identity, + // render.matPieceDebug, 0 + // ); + + // bounds/clamp + Vector3 toPos = testPos + testVel * Time.deltaTime; + + int w = 0; + while (w < 3) + { + Vector3 clampPos = new Vector3( + Mathf.Clamp(toPos.x, Bound(testPos, 0, -1), Bound(testPos, 0, 1)), + Mathf.Clamp(toPos.y, Bound(testPos, 1, -1), Bound(testPos, 1, 1)), + Mathf.Clamp(toPos.z, Bound(testPos, 2, -1), Bound(testPos, 2, 1)) + ); + + // find smallest clamp + // make only that clamp and clamp check again + // smallest? + // how'bout largest? + float largest = 0; + int largeIndex = -1; + for (int i = 0; i < 3; i++) + { + float dist = Mathf.Abs(toPos[i] - clampPos[i]); + if (dist > largest) + { + largeIndex = i; + largest = dist; + } + } + + if (largeIndex > -1) + { + toPos[largeIndex] = clampPos[largeIndex]; + testVel[largeIndex] *= -0.25f; // Bounce + + // UnityEditor.EditorApplication.isPaused = true; + } + else + { + break; + } + + w++; + } + + + + testPos = toPos; + + Graphics.DrawMesh(render.meshPieceDebug, + testPos, Quaternion.identity, + render.matPieceDebug, 0 + ); + + + // for (int i = 0; i < allDirs.Length; i++) + // { + // Graphics.DrawMesh(render.meshPieceDebug, + // testPos + allDirs[i], Quaternion.identity, + // render.matPieceDebug, 0 + // ); + // } + + return; + + // touchPos + // touchDown + // touching + // touchUp + + if (Input.GetMouseButtonDown(0)) + { + onTouchPos = mousePos; + + Vector3 screenCenter = new Vector3(Screen.width / 2, Screen.height / 2, onTouchPos.z); + movePiece = Vector3.Distance(onTouchPos, screenCenter) < 32; + } + + if (movePiece) + { + if (Input.GetMouseButtonUp(0) && Vector2.Distance(mousePos, cam.WorldToScreenPoint(piece.pos)) > 32) + { + Vector2 inputAngle = mousePos - cam.WorldToScreenPoint(piece.pos); + float closestAngle = 180; + int dirIndex = 0; + for (int i = 0; i < dirs.Length; i++) + { + float angle = Vector2.Angle( + inputAngle, + cam.WorldToScreenPoint(piece.pos + dirs[i]) - cam.WorldToScreenPoint(piece.pos) + ); + // pick out of closest available + if (angle < closestAngle && !Outside(piece.pos + dirs[i])) + { + dirIndex = i; + closestAngle = angle; + } + } + + if (closestAngle < 60) + { + while (!Outside(piece.pos)) + { + piece.pos += dirs[dirIndex]; + } + piece.pos -= dirs[dirIndex]; + + if (piece.pos == enemy.pos) + { + enemy.pos = voxels[Random.Range(0, voxels.Length)].pos; + } + } + + movePiece = false; + } + + camAngleVel = Vector2.zero; + } + else + { + if (Input.GetMouseButton(0)) + { + Vector3 offset = (mousePos - oldTouchPos) / 3f; + camAngleVel = new Vector2(-offset.y, offset.x) / Time.deltaTime; + + if (camAngleVel.sqrMagnitude > 0 || delay < Time.time) + { + oldCamAngleVel = camAngleVel; + delay = Time.time + 0.1f; + } + } + else + { + camAngleVel *= 1 - (6 * Time.deltaTime); + } + + if (Input.GetMouseButtonUp(0)) + { + camAngleVel = oldCamAngleVel; + } + } + + camAngle += camAngleVel * Time.deltaTime; + camAngle.x = Mathf.Clamp(camAngle.x, -60f, 60f); + camForm.rotation = Quaternion.Euler(Vector3.up * camAngle.y) * Quaternion.Euler(Vector3.right * camAngle.x); + + oldTouchPos = mousePos; + + // vr chess? infinite dungeon crawler ZENCORE + // just 3d the movement patterns + // twist cursor game + // input is none + // simulate is monolithed entirely + // part of simulate is to generate the level + + + // pathing needs a refactor + // we learned quite a bit + // what paths are interesting in 3D? + // build for that, don't just translate chess movement patterns + + // chess takeaways + // long shots from well placed pieces + // hook shots from knights + + // consider gravities constraints + // fall | cling walls | cling ceiling + // jump | climb fly | + + // what do I want to do? + + camPivot = render.lerpPos; + camForm.position = camPivot + Quaternion.LookRotation(camForm.rotation * Vector3.forward) * Vector3.back * 24; + } + + Vector3 camPivot; + + [HideInInspector] + public Vector3Int[] dirs = new Vector3Int[] { + new Vector3Int(-1, 0, 0), new Vector3Int(0, -1, 0), new Vector3Int(0, 0, -1), + new Vector3Int(1, 0, 0), new Vector3Int(0, 1, 0), new Vector3Int(0, 0, 1) + }; + + [HideInInspector] + public Vector3Int[] allDirs = new Vector3Int[] { + new Vector3Int(-1, 0, 0), + new Vector3Int(0, -1, 0), + new Vector3Int(0, 0, -1), + new Vector3Int(-1, -1, 0), + new Vector3Int(0, -1, -1), + new Vector3Int(-1, 0, -1), + + new Vector3Int(1, 0, 0), + new Vector3Int(0, 1, 0), + new Vector3Int(0, 0, 1), + new Vector3Int(1, 1, 0), + new Vector3Int(0, 1, 1), + new Vector3Int(1, 0, 1), + + new Vector3Int(-1, 1, 0), + new Vector3Int(0, -1, 1), + new Vector3Int(1, 0, -1), + new Vector3Int(1, -1, 0), + new Vector3Int(0, 1, -1), + new Vector3Int(-1, 0, 1) + }; + + public bool Outside(Vector3Int pos) + { + for (int v = 0; v < voxels.Length; v++) + { + if (pos == voxels[v].pos) { return false; } + } + return true; + } +} + +[Serializable] +public class Voxel +{ + public Vector3Int pos; + + public Voxel(Vector3Int pos) + { + this.pos = pos; + } +} + +[Serializable] +public class Worm +{ + public Vector3Int pos; + public int dirIndex; + + public Worm(Vector3Int pos) + { + this.pos = pos; + this.dirIndex = 0; + } +} + +[Serializable] +public class Piece +{ + public Vector3Int pos; + public int[] pattern; + // a pattern is the change in dirIndex at x Step + // cant be a dir change at zero + + public Piece(Vector3Int pos) + { + this.pos = pos; + } +} + +namespace ExtensionMethods +{ + public static class MyExtensions + { + public static int Rollover(this int index, int by, int length) + { + int rollover = index + by; + int delta = rollover - length; + if (delta >= 0) + { + rollover = delta; + } + + return rollover; + } + } +} \ No newline at end of file diff --git a/Assets/Monolith.cs.meta b/Assets/Monolith.cs.meta new file mode 100644 index 0000000..bcf49ac --- /dev/null +++ b/Assets/Monolith.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6fd8fe86f7d15534b899a0bba18bfab1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes.meta b/Assets/NaughtyAttributes.meta new file mode 100644 index 0000000..f264ba6 --- /dev/null +++ b/Assets/NaughtyAttributes.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 771bc5d1e8c87a9428691ea0aac40477 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/README.html b/Assets/NaughtyAttributes/README.html new file mode 100644 index 0000000..2987aa9 --- /dev/null +++ b/Assets/NaughtyAttributes/README.html @@ -0,0 +1,1581 @@ + + + + + README.md - Grip + + + + + + +
+
+ + + +
+
+
+
+ +

+ + README.md +

+ +
+

+NaughtyAttributes

+

openupm +License: MIT

+

NaughtyAttributes is an extension for the Unity Inspector.

+

It expands the range of attributes that Unity provides so that you can create powerful inspectors without the need of custom editors or property drawers. It also provides attributes that can be applied to non-serialized fields or functions.

+

It is implemented by replacing the default Unity Inspector. This means that if you have any custom editors, NaughtyAttributes will not work with them. All of your custom editors and property drawers are not affected in any way.

+

+System Requirements

+

Unity 2018.3.0 or later versions. Feel free to try older version. Don't forget to include the NaughtyAttributes namespace.

+

+Installation

+
    +
  1. The package is available on the openupm registry. You can install it via openupm-cli.
  2. +
+
openupm add com.dbrizov.naughtyattributes
+
+
    +
  1. You can also install via git url by adding this entry in your manifest.json +
  2. +
+
"com.dbrizov.naughtyattributes": "https://github.com/dbrizov/NaughtyAttributes.git#upm"
+
+
    +
  1. You can also download it from the Asset Store +
  2. +
+

+Drawer Attributes

+

Provide special draw options to serialized fields. +A field can have only one DrawerAttribute. If a field has more than one, only the bottom one will be used.

+

+Button

+

A method can be marked as a button. A button appears in the inspector and executes the method if clicked. +Works both with instance and static methods.

+
public class NaughtyComponent : MonoBehaviour
+{
+	[Button]
+	private void MethodOne() { }
+
+	[Button("Button Text")]
+	private void MethodTwo() { }
+}
+

inspector

+

+Dropdown

+

Provides an interface for dropdown value selection.

+
public class NaughtyComponent : MonoBehaviour
+{
+	[Dropdown("intValues")]
+	public int intValue;
+
+	[Dropdown("StringValues")]
+	public string stringValue;
+
+	[Dropdown("GetVectorValues")]
+	public Vector3 vectorValue;
+
+	private int[] intValues = new int[] { 1, 2, 3, 4, 5 };
+
+	private List<string> StringValues { get { return new List<string>() { "A", "B", "C", "D", "E" }; } }
+
+	private DropdownList<Vector3> GetVectorValues()
+	{
+		return new DropdownList<Vector3>()
+		{
+			{ "Right",   Vector3.right },
+			{ "Left",    Vector3.left },
+			{ "Up",      Vector3.up },
+			{ "Down",    Vector3.down },
+			{ "Forward", Vector3.forward },
+			{ "Back",    Vector3.back }
+		};
+	}
+}
+

inspector

+

+EnumFlags

+

Provides dropdown interface for setting enum flags

+
public enum Direction
+{
+	None = 0,
+	Right = 1 << 0,
+	Left = 1 << 1,
+	Up = 1 << 2,
+	Down = 1 << 3
+}
+
+public class NaughtyComponent : MonoBehaviour
+{
+	[EnumFlags]
+	public Direction flags;
+}
+

inspector

+

+HorizontalLine

+
public class NaughtyComponent : MonoBehaviour
+{
+	[HorizontalLine(color: EColor.Red)]
+	public int red;
+
+	[HorizontalLine(color: EColor.Green)]
+	public int green;
+
+	[HorizontalLine(color: EColor.Blue)]
+	public int blue;
+}
+

inspector

+

+InfoBox

+

Used for providing additional information.

+
public class NaughtyComponent : MonoBehaviour
+{
+	[InfoBox("This is my int", EInfoBoxType.Normal)]
+	public int myInt;
+
+	[InfoBox("This is my float", EInfoBoxType.Warning)]
+	public float myFloat;
+
+	[InfoBox("This is my vector", EInfoBoxType.Error)]
+	public Vector3 myVector;
+}
+

inspector

+

+MinMaxSlider

+

A double slider. The min value is saved to the X property, and the max value is saved to the Y property of a Vector2 field.

+
public class NaughtyComponent : MonoBehaviour
+{
+	[MinMaxSlider(0.0f, 100.0f)]
+	public Vector2 minMaxSlider;
+}
+

inspector

+

+ProgressBar

+
public class NaughtyComponent : MonoBehaviour
+{
+	[ProgressBar("Health", 300, EColor.Red)]
+	public int health = 250;
+
+	[ProgressBar("Mana", 100, EColor.Blue)]
+	public int mana = 25;
+
+	[ProgressBar("Stamina", 200, EColor.Green)]
+	public int stamina = 150;
+}
+

inspector

+

+ReorderableList

+

Provides array type fields with an interface for easy reordering of elements.

+
public class NaughtyComponent : MonoBehaviour
+{
+	[ReorderableList]
+	public int[] intArray;
+
+	[ReorderableList]
+	public List<float> floatArray;
+}
+

inspector

+

+ReadOnly

+

Makes a field read only.

+
public class NaughtyComponent : MonoBehaviour
+{
+	[ReadOnly]
+	public Vector3 forwardVector = Vector3.forward;
+}
+

inspector

+

+ResizableTextArea

+

A resizable text area where you can see the whole text. +Unlike Unity's Multiline and TextArea attributes where you can see only 3 rows of a given text, and in order to see it or modify it you have to manually scroll down to the desired row.

+
public class NaughtyComponent : MonoBehaviour
+{
+	[ResizableTextArea]
+	public string resizableTextArea;
+}
+

inspector

+

+ShowAssetPreview

+

Shows the texture preview of a given asset (Sprite, Prefab...)

+
public class NaughtyComponent : MonoBehaviour
+{
+	[ShowAssetPreview]
+	public Sprite sprite;
+
+	[ShowAssetPreview(128, 128)]
+	public GameObject prefab;
+}
+

inspector

+

+ShowNativeProperty

+

Shows native C# properties in the inspector. +All native properties are displayed at the bottom of the inspector after the non-serialized fields and before the method buttons. +It supports only certain types (bool, int, long, float, double, string, Vector2, Vector3, Vector4, Color, Bounds, Rect, UnityEngine.Object).

+
public class NaughtyComponent : MonoBehaviour
+{
+	public List<Transform> transforms;
+
+	[ShowNativeProperty]
+	public int TransformsCount => transforms.Count;
+}
+

inspector

+

+ShowNonSerializedField

+

Shows non-serialized fields in the inspector. +All non-serialized fields are displayed at the bottom of the inspector before the method buttons. +Keep in mind that if you change a non-static non-serialized field in the code - the value in the inspector will be updated after you press Play in the editor. +There is no such issue with static non-serialized fields because their values are updated at compile time. +It supports only certain types (bool, int, long, float, double, string, Vector2, Vector3, Vector4, Color, Bounds, Rect, UnityEngine.Object).

+
public class NaughtyComponent : MonoBehaviour
+{
+	[ShowNonSerializedField]
+	private int myInt = 10;
+
+	[ShowNonSerializedField]
+	private const float PI = 3.14159f;
+
+	[ShowNonSerializedField]
+	private static readonly Vector3 CONST_VECTOR = Vector3.one;
+}
+

inspector

+

+Tag

+

Enable Tag selection with string field

+
public class NaughtyComponent : MonoBehaviour
+{
+	[Tag]
+	public string tagField;
+}
+

inspector

+

+Meta Attributes

+

Give the fields meta data. A field can have more than one meta attributes

+

+BoxGroup

+

Surrounds grouped fields with a box.

+
public class NaughtyComponent : MonoBehaviour
+{
+	[BoxGroup("Integers")]
+	public int firstInt;
+	[BoxGroup("Integers")]
+	public int secondInt;
+
+	[BoxGroup("Floats")]
+	public float firstFloat;
+	[BoxGroup("Floats")]
+	public float secondFloat;
+}
+

inspector

+

+EnableIf / DisableIf

+
public class NaughtyComponent : MonoBehaviour
+{
+	public bool enableMyInt;
+
+	[EnableIf("enableMyInt")]
+	public int myInt;
+
+	[EnableIf("Enabled")]
+	public float myFloat;
+
+	[EnableIf("NotEnabled")]
+	public Vector3 myVector;
+
+	public bool Enabled() { return true; }
+
+	public bool NotEnabled => false;
+}
+

inspector

+

You can have more than one condition.

+
public class NaughtyComponent : MonoBehaviour
+{
+	public bool flag0;
+	public bool flag1;
+
+	[EnableIf(EConditionOperator.And, "flag0", "flag1")]
+	public int enabledIfAll;
+
+	[EnableIf(EConditionOperator.Or, "flag0", "flag1")]
+	public int enabledIfAny;
+}
+

+ShowIf / HideIf

+
public class NaughtyComponent : MonoBehaviour
+{
+	public bool showInt;
+
+	[ShowIf("showInt")]
+	public int myInt;
+
+	[ShowIf("AlwaysShow")]
+	public float myFloat;
+
+	[ShowIf("NeverShow")]
+	public Vector3 myVector;
+
+	public bool AlwaysShow() { return true; }
+
+	public bool NeverShow => false;
+}
+

inspector

+

You can have more than one condition.

+
public class NaughtyComponent : MonoBehaviour
+{
+	public bool flag0;
+	public bool flag1;
+
+	[ShowIf(EConditionOperator.And, "flag0", "flag1")]
+	public int showIfAll;
+
+	[ShowIf(EConditionOperator.Or, "flag0", "flag1")]
+	public int showIfAny;
+}
+

+Label

+

Override default field label

+
public class NaughtyComponent : MonoBehaviour
+{
+	[Label("Short Name")]
+	public string veryVeryLongName;
+
+	[Label("RGB")]
+	public Vector3 vectorXYZ;
+}
+

inspector

+

+OnValueChanged

+

Detects a value change and executes a callback. +Keep in mind that the event is detected only when the value is changed from the inspector. +If you want a runtime event, you should probably use an event/delegate and subscribe to it.

+
public class NaughtyComponent : MonoBehaviour
+{
+	[OnValueChanged("OnValueChangedCallback")]
+	public int myInt;
+
+	private void OnValueChangedCallback(int oldValue, int newValue)
+	{
+		Debug.Log(myInt == newValue); // prints true
+	}
+}
+

+Validator Attributes

+

Used for validating the fields. A field can have infinite number of validator attributes.

+

+MinValue / MaxValue

+

Clamps integer and float fields.

+
public class NaughtyComponent : MonoBehaviour
+{
+	[MinValue(0), MaxValue(10)]
+	public int myInt;
+
+	[MinValue(0.0f)]
+	public float myFloat;
+}
+

inspector

+

+Required

+

Used to remind the developer that a given reference type field is required.

+
public class NaughtyComponent : MonoBehaviour
+{
+	[Required]
+	public Transform myTransform;
+
+	[Required("Custom required text")]
+	public GameObject myGameObject;
+}
+

inspector

+

+ValidateInput

+

The most powerful ValidatorAttribute.

+
public class _NaughtyComponent : MonoBehaviour
+{
+	[ValidateInput("IsNotNull")]
+	public Transform myTransform;
+
+	[ValidateInput("IsGreaterThanZero", "myInteger must be greater than zero")]
+	public int myInt;
+
+	private bool IsNotNull(Transform tr)
+	{
+		return tr != null;
+	}
+
+	private bool IsGreaterThanZero(int value)
+	{
+		return value > 0;
+	}
+}
+

inspector

+

+License

+

MIT License

+

Copyright (c) 2017 Denis Rizov

+

Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions:

+

The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software.

+

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.

+ +
+
+
+
+
+ + + +
+
 
+
+ + \ No newline at end of file diff --git a/Assets/NaughtyAttributes/README.html.meta b/Assets/NaughtyAttributes/README.html.meta new file mode 100644 index 0000000..42c42d4 --- /dev/null +++ b/Assets/NaughtyAttributes/README.html.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: f1c5c604e6d27cc4d86e81f45c704e11 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts.meta b/Assets/NaughtyAttributes/Scripts.meta new file mode 100644 index 0000000..30b4bb8 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 66686847ee1fa044bb15dfe473666178 +folderAsset: yes +timeCreated: 1507995546 +licenseType: Store +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Core.meta b/Assets/NaughtyAttributes/Scripts/Core.meta new file mode 100644 index 0000000..f1fc782 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 1f67e408a6d0adf4ab29d095ccd8b116 +folderAsset: yes +timeCreated: 1507998942 +licenseType: Store +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes.meta b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes.meta new file mode 100644 index 0000000..132a3c2 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c76425e719cd4424d868674bcfb233f2 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/AllowNestingAttribute.cs b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/AllowNestingAttribute.cs new file mode 100644 index 0000000..b7abb8c --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/AllowNestingAttribute.cs @@ -0,0 +1,9 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class AllowNestingAttribute : DrawerAttribute + { + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/AllowNestingAttribute.cs.meta b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/AllowNestingAttribute.cs.meta new file mode 100644 index 0000000..343dfec --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/AllowNestingAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 95b49d3abe880c044adbe7faf6b7b4ec +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/CurveRangeAttribute.cs b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/CurveRangeAttribute.cs new file mode 100644 index 0000000..3e48717 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/CurveRangeAttribute.cs @@ -0,0 +1,30 @@ +using System; +using UnityEngine; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class CurveRangeAttribute : DrawerAttribute + { + public Vector2 Min { get; private set; } + public Vector2 Max { get; private set; } + public EColor Color { get; private set; } + + public CurveRangeAttribute(Vector2 min, Vector2 max, EColor color = EColor.Clear) + { + Min = min; + Max = max; + Color = color; + } + + public CurveRangeAttribute(EColor color) + : this(Vector2.zero, Vector2.one, color) + { + } + + public CurveRangeAttribute(float minX, float minY, float maxX, float maxY, EColor color = EColor.Clear) + : this(new Vector2(minX, minY), new Vector2(maxX, maxY), color) + { + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/CurveRangeAttribute.cs.meta b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/CurveRangeAttribute.cs.meta new file mode 100644 index 0000000..93b60ab --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/CurveRangeAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: bbdf3fb8882c7514c9a01108122cda7e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/DrawerAttribute.cs b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/DrawerAttribute.cs new file mode 100644 index 0000000..92e28d5 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/DrawerAttribute.cs @@ -0,0 +1,11 @@ +using UnityEngine; + +namespace NaughtyAttributes +{ + /// + /// Base class for all drawer attributes + /// + public class DrawerAttribute : PropertyAttribute, INaughtyAttribute + { + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/DrawerAttribute.cs.meta b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/DrawerAttribute.cs.meta new file mode 100644 index 0000000..aa54215 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/DrawerAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9df37fdebccf65c4da5b0a14f6dad5f5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/DropdownAttribute.cs b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/DropdownAttribute.cs new file mode 100644 index 0000000..2bf4702 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/DropdownAttribute.cs @@ -0,0 +1,57 @@ +using System.Collections; +using System; +using System.Collections.Generic; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class DropdownAttribute : DrawerAttribute + { + public string ValuesName { get; private set; } + + public DropdownAttribute(string valuesName) + { + ValuesName = valuesName; + } + } + + public interface IDropdownList : IEnumerable> + { + } + + public class DropdownList : IDropdownList + { + private List> _values; + + public DropdownList() + { + _values = new List>(); + } + + public void Add(string displayName, T value) + { + _values.Add(new KeyValuePair(displayName, value)); + } + + public IEnumerator> GetEnumerator() + { + return _values.GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + public static explicit operator DropdownList(DropdownList target) + { + DropdownList result = new DropdownList(); + foreach (var kvp in target) + { + result.Add(kvp.Key, kvp.Value); + } + + return result; + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/DropdownAttribute.cs.meta b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/DropdownAttribute.cs.meta new file mode 100644 index 0000000..b25926d --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/DropdownAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2cb864a1092cec04f8a4dbb556e8ed31 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/EnumFlagsAttribute.cs b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/EnumFlagsAttribute.cs new file mode 100644 index 0000000..81aab8e --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/EnumFlagsAttribute.cs @@ -0,0 +1,9 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class EnumFlagsAttribute : DrawerAttribute + { + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/EnumFlagsAttribute.cs.meta b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/EnumFlagsAttribute.cs.meta new file mode 100644 index 0000000..25a52af --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/EnumFlagsAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e8b31eb6d7299e54d89dcabc4cad0e6a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/HorizontalLineAttribute.cs b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/HorizontalLineAttribute.cs new file mode 100644 index 0000000..a3681bb --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/HorizontalLineAttribute.cs @@ -0,0 +1,20 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = true, Inherited = true)] + public class HorizontalLineAttribute : DrawerAttribute + { + public const float DefaultHeight = 2.0f; + public const EColor DefaultColor = EColor.Gray; + + public float Height { get; private set; } + public EColor Color { get; private set; } + + public HorizontalLineAttribute(float height = DefaultHeight, EColor color = DefaultColor) + { + Height = height; + Color = color; + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/HorizontalLineAttribute.cs.meta b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/HorizontalLineAttribute.cs.meta new file mode 100644 index 0000000..ecfd258 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/HorizontalLineAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2fdd6f99acca2fd42a4f3162d585ce95 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/InfoBoxAttribute.cs b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/InfoBoxAttribute.cs new file mode 100644 index 0000000..cd66aab --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/InfoBoxAttribute.cs @@ -0,0 +1,24 @@ +using System; + +namespace NaughtyAttributes +{ + public enum EInfoBoxType + { + Normal, + Warning, + Error + } + + [AttributeUsage(AttributeTargets.Field, AllowMultiple = true, Inherited = true)] + public class InfoBoxAttribute : DrawerAttribute + { + public string Text { get; private set; } + public EInfoBoxType Type { get; private set; } + + public InfoBoxAttribute(string text, EInfoBoxType type = EInfoBoxType.Normal) + { + Text = text; + Type = type; + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/InfoBoxAttribute.cs.meta b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/InfoBoxAttribute.cs.meta new file mode 100644 index 0000000..8748a6e --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/InfoBoxAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: afd1d6323740c734893fa8397c53113b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/InputAxisAttribute.cs b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/InputAxisAttribute.cs new file mode 100644 index 0000000..db74147 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/InputAxisAttribute.cs @@ -0,0 +1,9 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class InputAxisAttribute : DrawerAttribute + { + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/InputAxisAttribute.cs.meta b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/InputAxisAttribute.cs.meta new file mode 100644 index 0000000..da3b2c4 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/InputAxisAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 85033978c18810f46af271bbe94cf4aa +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/MinMaxSliderAttribute.cs b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/MinMaxSliderAttribute.cs new file mode 100644 index 0000000..4f93921 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/MinMaxSliderAttribute.cs @@ -0,0 +1,17 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class MinMaxSliderAttribute : DrawerAttribute + { + public float MinValue { get; private set; } + public float MaxValue { get; private set; } + + public MinMaxSliderAttribute(float minValue, float maxValue) + { + MinValue = minValue; + MaxValue = maxValue; + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/MinMaxSliderAttribute.cs.meta b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/MinMaxSliderAttribute.cs.meta new file mode 100644 index 0000000..03e5dcf --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/MinMaxSliderAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4aaa73f574deaa54187cb54aae571b24 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/ProgressBarAttribute.cs b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/ProgressBarAttribute.cs new file mode 100644 index 0000000..644ad11 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/ProgressBarAttribute.cs @@ -0,0 +1,28 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class ProgressBarAttribute : DrawerAttribute + { + public string Name { get; private set; } + public float MaxValue { get; set; } + public EColor Color { get; private set; } + public string MaxValueName { get; private set; } + + public ProgressBarAttribute(string name = "", string maxValueName = "", int maxValue = 100, EColor color = EColor.Blue) + { + Name = name; + MaxValue = maxValue; + MaxValueName = maxValueName; + Color = color; + } + + public ProgressBarAttribute(string name = "", int maxValue = 100, EColor color = EColor.Blue) + { + Name = name; + MaxValue = maxValue; + Color = color; + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/ProgressBarAttribute.cs.meta b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/ProgressBarAttribute.cs.meta new file mode 100644 index 0000000..11029f0 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/ProgressBarAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e19e4db6f4d08f849aa8ea8155cd2760 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/ReadOnlyAttribute.cs b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/ReadOnlyAttribute.cs new file mode 100644 index 0000000..b7627b0 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/ReadOnlyAttribute.cs @@ -0,0 +1,10 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class ReadOnlyAttribute : DrawerAttribute + { + + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/ReadOnlyAttribute.cs.meta b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/ReadOnlyAttribute.cs.meta new file mode 100644 index 0000000..24ec846 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/ReadOnlyAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e57264747ba93b94fbff12733de29499 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/ResizableTextAreaAttribute.cs b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/ResizableTextAreaAttribute.cs new file mode 100644 index 0000000..1c5eddc --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/ResizableTextAreaAttribute.cs @@ -0,0 +1,9 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class ResizableTextAreaAttribute : DrawerAttribute + { + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/ResizableTextAreaAttribute.cs.meta b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/ResizableTextAreaAttribute.cs.meta new file mode 100644 index 0000000..cc11d00 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/ResizableTextAreaAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 56d9a4b795ef4a94d86b94e55fb81240 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/SceneAttribute.cs b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/SceneAttribute.cs new file mode 100644 index 0000000..215ba6c --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/SceneAttribute.cs @@ -0,0 +1,9 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class SceneAttribute : DrawerAttribute + { + } +} \ No newline at end of file diff --git a/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/SceneAttribute.cs.meta b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/SceneAttribute.cs.meta new file mode 100644 index 0000000..f22649b --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/SceneAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e054de18423364f4688b72a0f2a472b6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/ShowAssetPreviewAttribute.cs b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/ShowAssetPreviewAttribute.cs new file mode 100644 index 0000000..37316f8 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/ShowAssetPreviewAttribute.cs @@ -0,0 +1,17 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class ShowAssetPreviewAttribute : DrawerAttribute + { + public int Width { get; private set; } + public int Height { get; private set; } + + public ShowAssetPreviewAttribute(int width = 64, int height = 64) + { + Width = width; + Height = height; + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/ShowAssetPreviewAttribute.cs.meta b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/ShowAssetPreviewAttribute.cs.meta new file mode 100644 index 0000000..4893b92 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/ShowAssetPreviewAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4b7dd9b44abc0054cb5cd68d74be2c1a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/TagAttribute.cs b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/TagAttribute.cs new file mode 100644 index 0000000..200374e --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/TagAttribute.cs @@ -0,0 +1,9 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class TagAttribute : DrawerAttribute + { + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/TagAttribute.cs.meta b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/TagAttribute.cs.meta new file mode 100644 index 0000000..618033c --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes/TagAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8903399bbd7c9d745a7b9188ab6c8320 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase.meta b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase.meta new file mode 100644 index 0000000..3096ac4 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5cf879ed72221e740a7aa02ef9c366a7 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase/ButtonAttribute.cs b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase/ButtonAttribute.cs new file mode 100644 index 0000000..1488d63 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase/ButtonAttribute.cs @@ -0,0 +1,33 @@ +using System; + +namespace NaughtyAttributes +{ + public enum EButtonEnableMode + { + /// + /// Button should be active always + /// + Always, + /// + /// Button should be active only in editor + /// + Editor, + /// + /// Button should be active only in playmode + /// + Playmode + } + + [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)] + public class ButtonAttribute : SpecialCaseDrawerAttribute + { + public string Text { get; private set; } + public EButtonEnableMode SelectedEnableMode { get; private set; } + + public ButtonAttribute(string text = null, EButtonEnableMode enabledMode = EButtonEnableMode.Always) + { + this.Text = text; + this.SelectedEnableMode = enabledMode; + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase/ButtonAttribute.cs.meta b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase/ButtonAttribute.cs.meta new file mode 100644 index 0000000..cc7be5c --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase/ButtonAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e8fe363a25ec5e24a9dd510bb0b4a0d4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase/ReorderableListAttribute.cs b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase/ReorderableListAttribute.cs new file mode 100644 index 0000000..43ae334 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase/ReorderableListAttribute.cs @@ -0,0 +1,9 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class ReorderableListAttribute : SpecialCaseDrawerAttribute + { + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase/ReorderableListAttribute.cs.meta b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase/ReorderableListAttribute.cs.meta new file mode 100644 index 0000000..add3c4a --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase/ReorderableListAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6189b48f4055e6c47aa132632d898fa6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase/ShowNativePropertyAttribute.cs b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase/ShowNativePropertyAttribute.cs new file mode 100644 index 0000000..e3b9376 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase/ShowNativePropertyAttribute.cs @@ -0,0 +1,9 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)] + public class ShowNativePropertyAttribute : SpecialCaseDrawerAttribute + { + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase/ShowNativePropertyAttribute.cs.meta b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase/ShowNativePropertyAttribute.cs.meta new file mode 100644 index 0000000..5aed9a2 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase/ShowNativePropertyAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a8e9b7b71c94a1f459336a24cfe04b1b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase/ShowNonSerializedFieldAttribute.cs b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase/ShowNonSerializedFieldAttribute.cs new file mode 100644 index 0000000..9bf0609 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase/ShowNonSerializedFieldAttribute.cs @@ -0,0 +1,9 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class ShowNonSerializedFieldAttribute : SpecialCaseDrawerAttribute + { + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase/ShowNonSerializedFieldAttribute.cs.meta b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase/ShowNonSerializedFieldAttribute.cs.meta new file mode 100644 index 0000000..84d5624 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase/ShowNonSerializedFieldAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8ea09f60df536734184a8920ff8bda6f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase/SpecialCaseDrawerAttribute.cs b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase/SpecialCaseDrawerAttribute.cs new file mode 100644 index 0000000..e71be81 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase/SpecialCaseDrawerAttribute.cs @@ -0,0 +1,8 @@ +using System; + +namespace NaughtyAttributes +{ + public class SpecialCaseDrawerAttribute : Attribute, INaughtyAttribute + { + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase/SpecialCaseDrawerAttribute.cs.meta b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase/SpecialCaseDrawerAttribute.cs.meta new file mode 100644 index 0000000..3b4bd25 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/DrawerAttributes_SpecialCase/SpecialCaseDrawerAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 95a59093f8ed1af48a8be75fa3050a3c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Core/INaughtyAttribute.cs b/Assets/NaughtyAttributes/Scripts/Core/INaughtyAttribute.cs new file mode 100644 index 0000000..b67ba03 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/INaughtyAttribute.cs @@ -0,0 +1,8 @@ +using System; + +namespace NaughtyAttributes +{ + public interface INaughtyAttribute + { + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Core/INaughtyAttribute.cs.meta b/Assets/NaughtyAttributes/Scripts/Core/INaughtyAttribute.cs.meta new file mode 100644 index 0000000..e2dd9d9 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/INaughtyAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: edda855906d15e541b46efd812fd70f3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Core/MetaAttributes.meta b/Assets/NaughtyAttributes/Scripts/Core/MetaAttributes.meta new file mode 100644 index 0000000..547f24d --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/MetaAttributes.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 64c95d02a2004854585e8d923d6680d0 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/BoxGroupAttribute.cs b/Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/BoxGroupAttribute.cs new file mode 100644 index 0000000..c487c47 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/BoxGroupAttribute.cs @@ -0,0 +1,15 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class BoxGroupAttribute : MetaAttribute + { + public string Name { get; private set; } + + public BoxGroupAttribute(string name = "") + { + Name = name; + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/BoxGroupAttribute.cs.meta b/Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/BoxGroupAttribute.cs.meta new file mode 100644 index 0000000..d68d8de --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/BoxGroupAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 07da8af1e3be52c4789678bf4138ae11 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/DisableIfAttribute.cs b/Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/DisableIfAttribute.cs new file mode 100644 index 0000000..73da124 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/DisableIfAttribute.cs @@ -0,0 +1,20 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field | AttributeTargets.Method, AllowMultiple = false, Inherited = true)] + public class DisableIfAttribute : EnableIfAttributeBase + { + public DisableIfAttribute(string condition) + : base(condition) + { + Inverted = true; + } + + public DisableIfAttribute(EConditionOperator conditionOperator, params string[] conditions) + : base(conditionOperator, conditions) + { + Inverted = true; + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/DisableIfAttribute.cs.meta b/Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/DisableIfAttribute.cs.meta new file mode 100644 index 0000000..b91dc52 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/DisableIfAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 52a0d5c249ac8fd42a4fb4d61bc2f797 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/EnableIfAttribute.cs b/Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/EnableIfAttribute.cs new file mode 100644 index 0000000..2384d5e --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/EnableIfAttribute.cs @@ -0,0 +1,20 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field | AttributeTargets.Method, AllowMultiple = false, Inherited = true)] + public class EnableIfAttribute : EnableIfAttributeBase + { + public EnableIfAttribute(string condition) + : base(condition) + { + Inverted = false; + } + + public EnableIfAttribute(EConditionOperator conditionOperator, params string[] conditions) + : base(conditionOperator, conditions) + { + Inverted = false; + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/EnableIfAttribute.cs.meta b/Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/EnableIfAttribute.cs.meta new file mode 100644 index 0000000..f3a696c --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/EnableIfAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a616ae826c8ebae45a89d6a8cb68a843 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/EnableIfAttributeBase.cs b/Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/EnableIfAttributeBase.cs new file mode 100644 index 0000000..23f346d --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/EnableIfAttributeBase.cs @@ -0,0 +1,23 @@ +using System; + +namespace NaughtyAttributes +{ + public abstract class EnableIfAttributeBase : MetaAttribute + { + public string[] Conditions { get; private set; } + public EConditionOperator ConditionOperator { get; private set; } + public bool Inverted { get; protected set; } + + public EnableIfAttributeBase(string condition) + { + ConditionOperator = EConditionOperator.And; + Conditions = new string[1] { condition }; + } + + public EnableIfAttributeBase(EConditionOperator conditionOperator, params string[] conditions) + { + ConditionOperator = conditionOperator; + Conditions = conditions; + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/EnableIfAttributeBase.cs.meta b/Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/EnableIfAttributeBase.cs.meta new file mode 100644 index 0000000..45fd5eb --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/EnableIfAttributeBase.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8ba6385cd022e164b89ead1937173ddc +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/HideIfAttribute.cs b/Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/HideIfAttribute.cs new file mode 100644 index 0000000..93b3548 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/HideIfAttribute.cs @@ -0,0 +1,20 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field | AttributeTargets.Method, AllowMultiple = false, Inherited = true)] + public class HideIfAttribute : ShowIfAttributeBase + { + public HideIfAttribute(string condition) + : base(condition) + { + Inverted = true; + } + + public HideIfAttribute(EConditionOperator conditionOperator, params string[] conditions) + : base(conditionOperator, conditions) + { + Inverted = true; + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/HideIfAttribute.cs.meta b/Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/HideIfAttribute.cs.meta new file mode 100644 index 0000000..888cf89 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/HideIfAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9ab2d0fcfb13a214ea6ef7629c96a761 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/LabelAttribute.cs b/Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/LabelAttribute.cs new file mode 100644 index 0000000..45e5d19 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/LabelAttribute.cs @@ -0,0 +1,15 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class LabelAttribute : MetaAttribute + { + public string Label { get; private set; } + + public LabelAttribute(string label) + { + Label = label; + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/LabelAttribute.cs.meta b/Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/LabelAttribute.cs.meta new file mode 100644 index 0000000..9488d54 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/LabelAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 79e0e0c0a7c25ea4fbe8eecaa4d559a0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/MetaAttribute.cs b/Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/MetaAttribute.cs new file mode 100644 index 0000000..b63026a --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/MetaAttribute.cs @@ -0,0 +1,8 @@ +using System; + +namespace NaughtyAttributes +{ + public class MetaAttribute : Attribute, INaughtyAttribute + { + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/MetaAttribute.cs.meta b/Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/MetaAttribute.cs.meta new file mode 100644 index 0000000..a7be132 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/MetaAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a482b4e0fbf0f4547a5d522182a68d24 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/OnValueChangedAttribute.cs b/Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/OnValueChangedAttribute.cs new file mode 100644 index 0000000..fcbb187 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/OnValueChangedAttribute.cs @@ -0,0 +1,15 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = true, Inherited = true)] + public class OnValueChangedAttribute : MetaAttribute + { + public string CallbackName { get; private set; } + + public OnValueChangedAttribute(string callbackName) + { + CallbackName = callbackName; + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/OnValueChangedAttribute.cs.meta b/Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/OnValueChangedAttribute.cs.meta new file mode 100644 index 0000000..4a92c4b --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/OnValueChangedAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e16a27c5576022b4bbe997c7db9051f0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/ShowIfAttribute.cs b/Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/ShowIfAttribute.cs new file mode 100644 index 0000000..76bce4c --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/ShowIfAttribute.cs @@ -0,0 +1,20 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field | AttributeTargets.Method, AllowMultiple = false, Inherited = true)] + public class ShowIfAttribute : ShowIfAttributeBase + { + public ShowIfAttribute(string condition) + : base(condition) + { + Inverted = false; + } + + public ShowIfAttribute(EConditionOperator conditionOperator, params string[] conditions) + : base(conditionOperator, conditions) + { + Inverted = false; + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/ShowIfAttribute.cs.meta b/Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/ShowIfAttribute.cs.meta new file mode 100644 index 0000000..4556ac2 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/ShowIfAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1ada427cfd2c9b04989d6d18dea27985 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/ShowIfAttributeBase.cs b/Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/ShowIfAttributeBase.cs new file mode 100644 index 0000000..703e3d2 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/ShowIfAttributeBase.cs @@ -0,0 +1,23 @@ +using System; + +namespace NaughtyAttributes +{ + public class ShowIfAttributeBase : MetaAttribute + { + public string[] Conditions { get; private set; } + public EConditionOperator ConditionOperator { get; private set; } + public bool Inverted { get; protected set; } + + public ShowIfAttributeBase(string condition) + { + ConditionOperator = EConditionOperator.And; + Conditions = new string[1] { condition }; + } + + public ShowIfAttributeBase(EConditionOperator conditionOperator, params string[] conditions) + { + ConditionOperator = conditionOperator; + Conditions = conditions; + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/ShowIfAttributeBase.cs.meta b/Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/ShowIfAttributeBase.cs.meta new file mode 100644 index 0000000..e82a9ad --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/MetaAttributes/ShowIfAttributeBase.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0532b1c4d8a9ccf4b9f98f0bbe4a6747 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Core/NaughtyAttributes.Core.asmdef b/Assets/NaughtyAttributes/Scripts/Core/NaughtyAttributes.Core.asmdef new file mode 100644 index 0000000..569e4e6 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/NaughtyAttributes.Core.asmdef @@ -0,0 +1,12 @@ +{ + "name": "NaughtyAttributes.Core", + "references": [], + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [] +} \ No newline at end of file diff --git a/Assets/NaughtyAttributes/Scripts/Core/NaughtyAttributes.Core.asmdef.meta b/Assets/NaughtyAttributes/Scripts/Core/NaughtyAttributes.Core.asmdef.meta new file mode 100644 index 0000000..731749c --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/NaughtyAttributes.Core.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 776d03a35f1b52c4a9aed9f56d7b4229 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Core/Utility.meta b/Assets/NaughtyAttributes/Scripts/Core/Utility.meta new file mode 100644 index 0000000..80be476 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/Utility.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6d61a3a977073c740ae13a3683ed22a1 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Core/Utility/EColor.cs b/Assets/NaughtyAttributes/Scripts/Core/Utility/EColor.cs new file mode 100644 index 0000000..f938b93 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/Utility/EColor.cs @@ -0,0 +1,56 @@ +using UnityEngine; + +namespace NaughtyAttributes +{ + public enum EColor + { + Clear, + White, + Black, + Gray, + Red, + Pink, + Orange, + Yellow, + Green, + Blue, + Indigo, + Violet + } + + public static class EColorExtensions + { + public static Color GetColor(this EColor color) + { + switch (color) + { + case EColor.Clear: + return new Color32(0, 0, 0, 0); + case EColor.White: + return new Color32(255, 255, 255, 255); + case EColor.Black: + return new Color32(0, 0, 0, 255); + case EColor.Gray: + return new Color32(128, 128, 128, 255); + case EColor.Red: + return new Color32(255, 0, 63, 255); + case EColor.Pink: + return new Color32(255, 152, 203, 255); + case EColor.Orange: + return new Color32(255, 128, 0, 255); + case EColor.Yellow: + return new Color32(255, 211, 0, 255); + case EColor.Green: + return new Color32(98, 200, 79, 255); + case EColor.Blue: + return new Color32(0, 135, 189, 255); + case EColor.Indigo: + return new Color32(75, 0, 130, 255); + case EColor.Violet: + return new Color32(128, 0, 255, 255); + default: + return new Color32(0, 0, 0, 255); + } + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Core/Utility/EColor.cs.meta b/Assets/NaughtyAttributes/Scripts/Core/Utility/EColor.cs.meta new file mode 100644 index 0000000..0f32c5e --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/Utility/EColor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 059f8674a8065924ea9c678298b5cd63 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Core/Utility/EConditionOperator.cs b/Assets/NaughtyAttributes/Scripts/Core/Utility/EConditionOperator.cs new file mode 100644 index 0000000..9ff8c0a --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/Utility/EConditionOperator.cs @@ -0,0 +1,10 @@ +using System; + +namespace NaughtyAttributes +{ + public enum EConditionOperator + { + And, + Or + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Core/Utility/EConditionOperator.cs.meta b/Assets/NaughtyAttributes/Scripts/Core/Utility/EConditionOperator.cs.meta new file mode 100644 index 0000000..60e3264 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/Utility/EConditionOperator.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3c227b6c19fc67b46ad294d95818f85a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Core/ValidatorAttributes.meta b/Assets/NaughtyAttributes/Scripts/Core/ValidatorAttributes.meta new file mode 100644 index 0000000..d5aba48 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/ValidatorAttributes.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: bf91d63e37bed3e4cbf75d576fc03a21 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Core/ValidatorAttributes/MaxValueAttribute.cs b/Assets/NaughtyAttributes/Scripts/Core/ValidatorAttributes/MaxValueAttribute.cs new file mode 100644 index 0000000..62c1dc3 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/ValidatorAttributes/MaxValueAttribute.cs @@ -0,0 +1,20 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class MaxValueAttribute : ValidatorAttribute + { + public float MaxValue { get; private set; } + + public MaxValueAttribute(float maxValue) + { + MaxValue = maxValue; + } + + public MaxValueAttribute(int maxValue) + { + MaxValue = maxValue; + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Core/ValidatorAttributes/MaxValueAttribute.cs.meta b/Assets/NaughtyAttributes/Scripts/Core/ValidatorAttributes/MaxValueAttribute.cs.meta new file mode 100644 index 0000000..b02fdbc --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/ValidatorAttributes/MaxValueAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a748250af5ccfd7499cfb444aafb8a03 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Core/ValidatorAttributes/MinValueAttribute.cs b/Assets/NaughtyAttributes/Scripts/Core/ValidatorAttributes/MinValueAttribute.cs new file mode 100644 index 0000000..507c034 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/ValidatorAttributes/MinValueAttribute.cs @@ -0,0 +1,20 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class MinValueAttribute : ValidatorAttribute + { + public float MinValue { get; private set; } + + public MinValueAttribute(float minValue) + { + MinValue = minValue; + } + + public MinValueAttribute(int minValue) + { + MinValue = minValue; + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Core/ValidatorAttributes/MinValueAttribute.cs.meta b/Assets/NaughtyAttributes/Scripts/Core/ValidatorAttributes/MinValueAttribute.cs.meta new file mode 100644 index 0000000..9d90191 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/ValidatorAttributes/MinValueAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 40133bac7c8d42b4d837138430a503e0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Core/ValidatorAttributes/RequiredAttribute.cs b/Assets/NaughtyAttributes/Scripts/Core/ValidatorAttributes/RequiredAttribute.cs new file mode 100644 index 0000000..b1161a5 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/ValidatorAttributes/RequiredAttribute.cs @@ -0,0 +1,15 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class RequiredAttribute : ValidatorAttribute + { + public string Message { get; private set; } + + public RequiredAttribute(string message = null) + { + Message = message; + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Core/ValidatorAttributes/RequiredAttribute.cs.meta b/Assets/NaughtyAttributes/Scripts/Core/ValidatorAttributes/RequiredAttribute.cs.meta new file mode 100644 index 0000000..7f87cfc --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/ValidatorAttributes/RequiredAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b0cdf49d1687849458b1a8d4786553d4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Core/ValidatorAttributes/ValidateInputAttribute.cs b/Assets/NaughtyAttributes/Scripts/Core/ValidatorAttributes/ValidateInputAttribute.cs new file mode 100644 index 0000000..6a353c2 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/ValidatorAttributes/ValidateInputAttribute.cs @@ -0,0 +1,17 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class ValidateInputAttribute : ValidatorAttribute + { + public string CallbackName { get; private set; } + public string Message { get; private set; } + + public ValidateInputAttribute(string callbackName, string message = null) + { + CallbackName = callbackName; + Message = message; + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Core/ValidatorAttributes/ValidateInputAttribute.cs.meta b/Assets/NaughtyAttributes/Scripts/Core/ValidatorAttributes/ValidateInputAttribute.cs.meta new file mode 100644 index 0000000..0addd1a --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/ValidatorAttributes/ValidateInputAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6c4171d68fb5bc0448d3ac298973e82c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Core/ValidatorAttributes/ValidatorAttribute.cs b/Assets/NaughtyAttributes/Scripts/Core/ValidatorAttributes/ValidatorAttribute.cs new file mode 100644 index 0000000..3b1201d --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/ValidatorAttributes/ValidatorAttribute.cs @@ -0,0 +1,8 @@ +using System; + +namespace NaughtyAttributes +{ + public class ValidatorAttribute : Attribute, INaughtyAttribute + { + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Core/ValidatorAttributes/ValidatorAttribute.cs.meta b/Assets/NaughtyAttributes/Scripts/Core/ValidatorAttributes/ValidatorAttribute.cs.meta new file mode 100644 index 0000000..f5daea8 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Core/ValidatorAttributes/ValidatorAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0f3c43bed2dbc5249b6c6ec7859c2020 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor.meta b/Assets/NaughtyAttributes/Scripts/Editor.meta new file mode 100644 index 0000000..8dd7e3e --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: b76068e69df25a94ab378b0b6829c4f0 +folderAsset: yes +timeCreated: 1507995613 +licenseType: Store +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/DecoratorDrawers.meta b/Assets/NaughtyAttributes/Scripts/Editor/DecoratorDrawers.meta new file mode 100644 index 0000000..79b2c37 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/DecoratorDrawers.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d3041a2296f3b1749b3ef18e695adee4 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/DecoratorDrawers/HorizontalLineDecoratorDrawer.cs b/Assets/NaughtyAttributes/Scripts/Editor/DecoratorDrawers/HorizontalLineDecoratorDrawer.cs new file mode 100644 index 0000000..dae6544 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/DecoratorDrawers/HorizontalLineDecoratorDrawer.cs @@ -0,0 +1,23 @@ +using UnityEngine; +using UnityEditor; + +namespace NaughtyAttributes.Editor +{ + [CustomPropertyDrawer(typeof(HorizontalLineAttribute))] + public class HorizontalLineDecoratorDrawer : DecoratorDrawer + { + public override float GetHeight() + { + HorizontalLineAttribute lineAttr = (HorizontalLineAttribute)attribute; + return EditorGUIUtility.singleLineHeight + lineAttr.Height; + } + + public override void OnGUI(Rect position) + { + Rect rect = EditorGUI.IndentedRect(position); + rect.y += EditorGUIUtility.singleLineHeight / 3.0f; + HorizontalLineAttribute lineAttr = (HorizontalLineAttribute)attribute; + NaughtyEditorGUI.HorizontalLine(rect, lineAttr.Height, lineAttr.Color.GetColor()); + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Editor/DecoratorDrawers/HorizontalLineDecoratorDrawer.cs.meta b/Assets/NaughtyAttributes/Scripts/Editor/DecoratorDrawers/HorizontalLineDecoratorDrawer.cs.meta new file mode 100644 index 0000000..719f6d8 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/DecoratorDrawers/HorizontalLineDecoratorDrawer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3ec99f3a124f20e40b8f5edfeb1ecced +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/DecoratorDrawers/InfoBoxDecoratorDrawer.cs b/Assets/NaughtyAttributes/Scripts/Editor/DecoratorDrawers/InfoBoxDecoratorDrawer.cs new file mode 100644 index 0000000..a6d614d --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/DecoratorDrawers/InfoBoxDecoratorDrawer.cs @@ -0,0 +1,54 @@ +using UnityEditor; +using UnityEngine; + +namespace NaughtyAttributes.Editor +{ + [CustomPropertyDrawer(typeof(InfoBoxAttribute))] + public class InfoBoxDecoratorDrawer : DecoratorDrawer + { + public override float GetHeight() + { + return GetHelpBoxHeight(); + } + + public override void OnGUI(Rect rect) + { + InfoBoxAttribute infoBoxAttribute = (InfoBoxAttribute)attribute; + + float indentLength = NaughtyEditorGUI.GetIndentLength(rect); + Rect infoBoxRect = new Rect( + rect.x + indentLength, + rect.y, + rect.width - indentLength, + GetHelpBoxHeight() - 2.0f); + + DrawInfoBox(infoBoxRect, infoBoxAttribute.Text, infoBoxAttribute.Type); + } + + private float GetHelpBoxHeight() + { + return EditorGUIUtility.singleLineHeight * 3.0f; + } + + private void DrawInfoBox(Rect rect, string infoText, EInfoBoxType infoBoxType) + { + MessageType messageType = MessageType.None; + switch (infoBoxType) + { + case EInfoBoxType.Normal: + messageType = MessageType.Info; + break; + + case EInfoBoxType.Warning: + messageType = MessageType.Warning; + break; + + case EInfoBoxType.Error: + messageType = MessageType.Error; + break; + } + + NaughtyEditorGUI.HelpBox(rect, infoText, messageType); + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Editor/DecoratorDrawers/InfoBoxDecoratorDrawer.cs.meta b/Assets/NaughtyAttributes/Scripts/Editor/DecoratorDrawers/InfoBoxDecoratorDrawer.cs.meta new file mode 100644 index 0000000..5f50ace --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/DecoratorDrawers/InfoBoxDecoratorDrawer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e9c18b0e698717442b7631c5066d667f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/NaughtyAttributes.Editor.asmdef b/Assets/NaughtyAttributes/Scripts/Editor/NaughtyAttributes.Editor.asmdef new file mode 100644 index 0000000..e1aafc2 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/NaughtyAttributes.Editor.asmdef @@ -0,0 +1,16 @@ +{ + "name": "NaughtyAttributes.Editor", + "references": [ + "NaughtyAttributes.Core" + ], + "optionalUnityReferences": [], + "includePlatforms": [ + "Editor" + ], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [] +} \ No newline at end of file diff --git a/Assets/NaughtyAttributes/Scripts/Editor/NaughtyAttributes.Editor.asmdef.meta b/Assets/NaughtyAttributes/Scripts/Editor/NaughtyAttributes.Editor.asmdef.meta new file mode 100644 index 0000000..70dc9f2 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/NaughtyAttributes.Editor.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: f88fb04354076c646a4107a491394033 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/NaughtyInspector.cs b/Assets/NaughtyAttributes/Scripts/Editor/NaughtyInspector.cs new file mode 100644 index 0000000..13483cc --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/NaughtyInspector.cs @@ -0,0 +1,179 @@ +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using UnityEditor; +using UnityEngine; + +namespace NaughtyAttributes.Editor +{ + [CanEditMultipleObjects] + [CustomEditor(typeof(UnityEngine.Object), true)] + public class NaughtyInspector : UnityEditor.Editor + { + private List _serializedProperties = new List(); + private IEnumerable _nonSerializedFields; + private IEnumerable _nativeProperties; + private IEnumerable _methods; + + protected virtual void OnEnable() + { + _nonSerializedFields = ReflectionUtility.GetAllFields( + target, f => f.GetCustomAttributes(typeof(ShowNonSerializedFieldAttribute), true).Length > 0); + + _nativeProperties = ReflectionUtility.GetAllProperties( + target, p => p.GetCustomAttributes(typeof(ShowNativePropertyAttribute), true).Length > 0); + + _methods = ReflectionUtility.GetAllMethods( + target, m => m.GetCustomAttributes(typeof(ButtonAttribute), true).Length > 0); + } + + protected virtual void OnDisable() + { + ReorderableListPropertyDrawer.Instance.ClearCache(); + } + + public override void OnInspectorGUI() + { + GetSerializedProperties(ref _serializedProperties); + + bool anyNaughtyAttribute = _serializedProperties.Any(p => PropertyUtility.GetAttribute(p) != null); + if (!anyNaughtyAttribute) + { + DrawDefaultInspector(); + } + else + { + DrawSerializedProperties(); + } + + DrawNonSerializedFields(); + DrawNativeProperties(); + DrawButtons(); + } + + protected void GetSerializedProperties(ref List outSerializedProperties) + { + outSerializedProperties.Clear(); + using (var iterator = serializedObject.GetIterator()) + { + if (iterator.NextVisible(true)) + { + do + { + outSerializedProperties.Add(serializedObject.FindProperty(iterator.name)); + } + while (iterator.NextVisible(false)); + } + } + } + + protected void DrawSerializedProperties() + { + serializedObject.Update(); + + // Draw non-grouped serialized properties + foreach (var property in GetNonGroupedProperties(_serializedProperties)) + { + if (property.name.Equals("m_Script", System.StringComparison.Ordinal)) + { + GUI.enabled = false; + EditorGUILayout.PropertyField(property); + GUI.enabled = true; + } + else + { + NaughtyEditorGUI.PropertyField_Layout(property, true); + } + } + + // Draw grouped serialized properties + foreach (var group in GetGroupedProperties(_serializedProperties)) + { + IEnumerable visibleProperties = group.Where(p => PropertyUtility.IsVisible(p)); + if (!visibleProperties.Any()) + { + continue; + } + + NaughtyEditorGUI.BeginBoxGroup_Layout(group.Key); + foreach (var property in visibleProperties) + { + NaughtyEditorGUI.PropertyField_Layout(property, true); + } + + NaughtyEditorGUI.EndBoxGroup_Layout(); + } + + serializedObject.ApplyModifiedProperties(); + } + + protected void DrawNonSerializedFields() + { + if (_nonSerializedFields.Any()) + { + EditorGUILayout.Space(); + EditorGUILayout.LabelField("Non-Serialized Fields", GetHeaderGUIStyle()); + NaughtyEditorGUI.HorizontalLine( + EditorGUILayout.GetControlRect(false), HorizontalLineAttribute.DefaultHeight, HorizontalLineAttribute.DefaultColor.GetColor()); + + foreach (var field in _nonSerializedFields) + { + NaughtyEditorGUI.NonSerializedField_Layout(serializedObject.targetObject, field); + } + } + } + + protected void DrawNativeProperties() + { + if (_nativeProperties.Any()) + { + EditorGUILayout.Space(); + EditorGUILayout.LabelField("Native Properties", GetHeaderGUIStyle()); + NaughtyEditorGUI.HorizontalLine( + EditorGUILayout.GetControlRect(false), HorizontalLineAttribute.DefaultHeight, HorizontalLineAttribute.DefaultColor.GetColor()); + + foreach (var property in _nativeProperties) + { + NaughtyEditorGUI.NativeProperty_Layout(serializedObject.targetObject, property); + } + } + } + + protected void DrawButtons() + { + if (_methods.Any()) + { + EditorGUILayout.Space(); + EditorGUILayout.LabelField("Buttons", GetHeaderGUIStyle()); + NaughtyEditorGUI.HorizontalLine( + EditorGUILayout.GetControlRect(false), HorizontalLineAttribute.DefaultHeight, HorizontalLineAttribute.DefaultColor.GetColor()); + + foreach (var method in _methods) + { + NaughtyEditorGUI.Button(serializedObject.targetObject, method); + } + } + } + + private static IEnumerable GetNonGroupedProperties(IEnumerable properties) + { + return properties.Where(p => PropertyUtility.GetAttribute(p) == null); + } + + private static IEnumerable> GetGroupedProperties(IEnumerable properties) + { + return properties + .Where(p => PropertyUtility.GetAttribute(p) != null) + .GroupBy(p => PropertyUtility.GetAttribute(p).Name); + } + + private static GUIStyle GetHeaderGUIStyle() + { + GUIStyle style = new GUIStyle(EditorStyles.centeredGreyMiniLabel); + style.fontStyle = FontStyle.Bold; + style.alignment = TextAnchor.UpperCenter; + + return style; + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Editor/NaughtyInspector.cs.meta b/Assets/NaughtyAttributes/Scripts/Editor/NaughtyInspector.cs.meta new file mode 100644 index 0000000..b63e99f --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/NaughtyInspector.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1b9b53879f7c93b42835c3ad9e0d0a66 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers.meta b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers.meta new file mode 100644 index 0000000..7d7dbed --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 4327d74fca5deaa4c83c483fe468d274 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/AllowNestingPropertyDrawer.cs b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/AllowNestingPropertyDrawer.cs new file mode 100644 index 0000000..7e81b12 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/AllowNestingPropertyDrawer.cs @@ -0,0 +1,16 @@ +using UnityEngine; +using UnityEditor; + +namespace NaughtyAttributes.Editor +{ + [CustomPropertyDrawer(typeof(AllowNestingAttribute))] + public class AllowNestingPropertyDrawer : PropertyDrawerBase + { + protected override void OnGUI_Internal(Rect rect, SerializedProperty property, GUIContent label) + { + EditorGUI.BeginProperty(rect, label, property); + EditorGUI.PropertyField(rect, property, label, true); + EditorGUI.EndProperty(); + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/AllowNestingPropertyDrawer.cs.meta b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/AllowNestingPropertyDrawer.cs.meta new file mode 100644 index 0000000..f2f2145 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/AllowNestingPropertyDrawer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a3175e7041b8f4348bd652485a78e7b1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/CurveRangePropertyDrawer.cs b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/CurveRangePropertyDrawer.cs new file mode 100644 index 0000000..46e5f70 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/CurveRangePropertyDrawer.cs @@ -0,0 +1,39 @@ +using UnityEngine; +using UnityEditor; + +namespace NaughtyAttributes.Editor +{ + [CustomPropertyDrawer(typeof(CurveRangeAttribute))] + public class CurveRangePropertyDrawer : PropertyDrawerBase + { + protected override float GetPropertyHeight_Internal(SerializedProperty property, GUIContent label) + { + float propertyHeight = property.propertyType == SerializedPropertyType.AnimationCurve + ? GetPropertyHeight(property) + : GetPropertyHeight(property) + GetHelpBoxHeight(); + + return propertyHeight; + } + + protected override void OnGUI_Internal(Rect rect, SerializedProperty property, GUIContent label) + { + EditorGUI.BeginProperty(rect, label, property); + + // Check user error + if (property.propertyType != SerializedPropertyType.AnimationCurve) + { + string message = string.Format("Field {0} is not an AnimationCurve", property.name); + DrawDefaultPropertyAndHelpBox(rect, property, message, MessageType.Warning); + return; + } + + var attribute = PropertyUtility.GetAttribute(property); + + EditorGUI.CurveField(rect, property, + attribute.Color == EColor.Clear ? Color.green : attribute.Color.GetColor(), + new Rect(attribute.Min.x, attribute.Min.y, attribute.Max.x - attribute.Min.x, attribute.Max.y - attribute.Min.y)); + + EditorGUI.EndProperty(); + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/CurveRangePropertyDrawer.cs.meta b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/CurveRangePropertyDrawer.cs.meta new file mode 100644 index 0000000..adea11e --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/CurveRangePropertyDrawer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 798b8c99fbc072a4b83ee387e472a2bd +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/DropdownPropertyDrawer.cs b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/DropdownPropertyDrawer.cs new file mode 100644 index 0000000..f96f8a4 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/DropdownPropertyDrawer.cs @@ -0,0 +1,182 @@ +using UnityEngine; +using UnityEditor; +using System.Collections; +using System.Reflection; +using System; +using System.Collections.Generic; + +namespace NaughtyAttributes.Editor +{ + [CustomPropertyDrawer(typeof(DropdownAttribute))] + public class DropdownPropertyDrawer : PropertyDrawerBase + { + protected override float GetPropertyHeight_Internal(SerializedProperty property, GUIContent label) + { + DropdownAttribute dropdownAttribute = (DropdownAttribute)attribute; + object values = GetValues(property, dropdownAttribute.ValuesName); + FieldInfo fieldInfo = ReflectionUtility.GetField(PropertyUtility.GetTargetObjectWithProperty(property), property.name); + + float propertyHeight = AreValuesValid(values, fieldInfo) + ? GetPropertyHeight(property) + : GetPropertyHeight(property) + GetHelpBoxHeight(); + + return propertyHeight; + } + + protected override void OnGUI_Internal(Rect rect, SerializedProperty property, GUIContent label) + { + EditorGUI.BeginProperty(rect, label, property); + + DropdownAttribute dropdownAttribute = (DropdownAttribute)attribute; + object target = PropertyUtility.GetTargetObjectWithProperty(property); + + object valuesObject = GetValues(property, dropdownAttribute.ValuesName); + FieldInfo dropdownField = ReflectionUtility.GetField(target, property.name); + + if (AreValuesValid(valuesObject, dropdownField)) + { + if (valuesObject is IList && dropdownField.FieldType == GetElementType(valuesObject)) + { + // Selected value + object selectedValue = dropdownField.GetValue(target); + + // Values and display options + IList valuesList = (IList)valuesObject; + object[] values = new object[valuesList.Count]; + string[] displayOptions = new string[valuesList.Count]; + + for (int i = 0; i < values.Length; i++) + { + object value = valuesList[i]; + values[i] = value; + displayOptions[i] = value == null ? "" : value.ToString(); + } + + // Selected value index + int selectedValueIndex = Array.IndexOf(values, selectedValue); + if (selectedValueIndex < 0) + { + selectedValueIndex = 0; + } + + NaughtyEditorGUI.Dropdown( + rect, property.serializedObject, target, dropdownField, label.text, selectedValueIndex, values, displayOptions); + } + else if (valuesObject is IDropdownList) + { + // Current value + object selectedValue = dropdownField.GetValue(target); + + // Current value index, values and display options + int index = -1; + int selectedValueIndex = -1; + List values = new List(); + List displayOptions = new List(); + IDropdownList dropdown = (IDropdownList)valuesObject; + + using (IEnumerator> dropdownEnumerator = dropdown.GetEnumerator()) + { + while (dropdownEnumerator.MoveNext()) + { + index++; + + KeyValuePair current = dropdownEnumerator.Current; + if (current.Value?.Equals(selectedValue) == true) + { + selectedValueIndex = index; + } + + values.Add(current.Value); + + if (current.Key == null) + { + displayOptions.Add(""); + } + else if (string.IsNullOrWhiteSpace(current.Key)) + { + displayOptions.Add(""); + } + else + { + displayOptions.Add(current.Key); + } + } + } + + if (selectedValueIndex < 0) + { + selectedValueIndex = 0; + } + + NaughtyEditorGUI.Dropdown( + rect, property.serializedObject, target, dropdownField, label.text, selectedValueIndex, values.ToArray(), displayOptions.ToArray()); + } + } + else + { + string message = string.Format("Invalid values with name '{0}' provided to '{1}'. Either the values name is incorrect or the types of the target field and the values field/property/method don't match", + dropdownAttribute.ValuesName, dropdownAttribute.GetType().Name); + + DrawDefaultPropertyAndHelpBox(rect, property, message, MessageType.Warning); + } + + EditorGUI.EndProperty(); + } + + private object GetValues(SerializedProperty property, string valuesName) + { + object target = PropertyUtility.GetTargetObjectWithProperty(property); + + FieldInfo valuesFieldInfo = ReflectionUtility.GetField(target, valuesName); + if (valuesFieldInfo != null) + { + return valuesFieldInfo.GetValue(target); + } + + PropertyInfo valuesPropertyInfo = ReflectionUtility.GetProperty(target, valuesName); + if (valuesPropertyInfo != null) + { + return valuesPropertyInfo.GetValue(target); + } + + MethodInfo methodValuesInfo = ReflectionUtility.GetMethod(target, valuesName); + if (methodValuesInfo != null && + methodValuesInfo.ReturnType != typeof(void) && + methodValuesInfo.GetParameters().Length == 0) + { + return methodValuesInfo.Invoke(target, null); + } + + return null; + } + + private bool AreValuesValid(object values, FieldInfo dropdownField) + { + if (values == null || dropdownField == null) + { + return false; + } + + if ((values is IList && dropdownField.FieldType == GetElementType(values)) || + (values is IDropdownList)) + { + return true; + } + + return false; + } + + private Type GetElementType(object values) + { + Type valuesType = values.GetType(); + if (valuesType.IsGenericType) + { + return valuesType.GetGenericArguments()[0]; + } + else + { + return valuesType.GetElementType(); + } + } + } +} \ No newline at end of file diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/DropdownPropertyDrawer.cs.meta b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/DropdownPropertyDrawer.cs.meta new file mode 100644 index 0000000..fecae2c --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/DropdownPropertyDrawer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: dd080b36769bcd94d909fc0431cf25e0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/EnumFlagsPropertyDrawer.cs b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/EnumFlagsPropertyDrawer.cs new file mode 100644 index 0000000..63236a1 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/EnumFlagsPropertyDrawer.cs @@ -0,0 +1,38 @@ +using UnityEngine; +using UnityEditor; +using System; + +namespace NaughtyAttributes.Editor +{ + [CustomPropertyDrawer(typeof(EnumFlagsAttribute))] + public class EnumFlagsPropertyDrawer : PropertyDrawerBase + { + protected override float GetPropertyHeight_Internal(SerializedProperty property, GUIContent label) + { + Enum targetEnum = PropertyUtility.GetTargetObjectOfProperty(property) as Enum; + + return (targetEnum != null) + ? GetPropertyHeight(property) + : GetPropertyHeight(property) + GetHelpBoxHeight(); + } + + protected override void OnGUI_Internal(Rect rect, SerializedProperty property, GUIContent label) + { + EditorGUI.BeginProperty(rect, label, property); + + Enum targetEnum = PropertyUtility.GetTargetObjectOfProperty(property) as Enum; + if (targetEnum != null) + { + Enum enumNew = EditorGUI.EnumFlagsField(rect, label.text, targetEnum); + property.intValue = (int)Convert.ChangeType(enumNew, targetEnum.GetType()); + } + else + { + string message = attribute.GetType().Name + " can be used only on enums"; + DrawDefaultPropertyAndHelpBox(rect, property, message, MessageType.Warning); + } + + EditorGUI.EndProperty(); + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/EnumFlagsPropertyDrawer.cs.meta b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/EnumFlagsPropertyDrawer.cs.meta new file mode 100644 index 0000000..c0081d2 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/EnumFlagsPropertyDrawer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b750e1461c1126d4399459b90b31e75e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/InputAxisPropertyDrawer.cs b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/InputAxisPropertyDrawer.cs new file mode 100644 index 0000000..1b6120f --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/InputAxisPropertyDrawer.cs @@ -0,0 +1,75 @@ +using System.Collections.Generic; +using System.IO; +using System.Linq; +using UnityEditor; +using UnityEngine; + +namespace NaughtyAttributes.Editor +{ + [CustomPropertyDrawer(typeof(InputAxisAttribute))] + public class InputAxisPropertyDrawer : PropertyDrawerBase + { + private static readonly string AssetPath = Path.Combine("ProjectSettings", "InputManager.asset"); + private const string AxesPropertyPath = "m_Axes"; + private const string NamePropertyPath = "m_Name"; + + protected override float GetPropertyHeight_Internal(SerializedProperty property, GUIContent label) + { + return (property.propertyType == SerializedPropertyType.String) + ? GetPropertyHeight(property) + : GetPropertyHeight(property) + GetHelpBoxHeight(); + } + + protected override void OnGUI_Internal(Rect rect, SerializedProperty property, GUIContent label) + { + if (property.propertyType == SerializedPropertyType.String) + { + var inputManagerAsset = AssetDatabase.LoadAssetAtPath(AssetPath, typeof(object)); + var inputManager = new SerializedObject(inputManagerAsset); + + var axesProperty = inputManager.FindProperty(AxesPropertyPath); + var axesSet = new HashSet(); + axesSet.Add("(None)"); + + for (var i = 0; i < axesProperty.arraySize; i++) + { + var axis = axesProperty.GetArrayElementAtIndex(i).FindPropertyRelative(NamePropertyPath).stringValue; + axesSet.Add(axis); + } + + var axes = axesSet.ToArray(); + + string propertyString = property.stringValue; + int index = 0; + // check if there is an entry that matches the entry and get the index + // we skip index 0 as that is a special custom case + for (int i = 1; i < axes.Length; i++) + { + if (axes[i] == propertyString) + { + index = i; + break; + } + } + + // Draw the popup box with the current selected index + var newIndex = EditorGUI.Popup(rect, label.text, index, axes); + + // Adjust the actual string value of the property based on the selection + if (newIndex > 0) + { + property.stringValue = axes[newIndex]; + } + else + { + property.stringValue = string.Empty; + } + } + else + { + string message = string.Format("{0} supports only string fields", typeof(InputAxisAttribute).Name); + DrawDefaultPropertyAndHelpBox(rect, property, message, MessageType.Warning); + } + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/InputAxisPropertyDrawer.cs.meta b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/InputAxisPropertyDrawer.cs.meta new file mode 100644 index 0000000..08f8f46 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/InputAxisPropertyDrawer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0de9d3dfe2d466a458be838edf361645 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/MinMaxSliderPropertyDrawer.cs b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/MinMaxSliderPropertyDrawer.cs new file mode 100644 index 0000000..679b5a8 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/MinMaxSliderPropertyDrawer.cs @@ -0,0 +1,87 @@ +using UnityEditor; +using UnityEngine; + +namespace NaughtyAttributes.Editor +{ + [CustomPropertyDrawer(typeof(MinMaxSliderAttribute))] + public class MinMaxSliderPropertyDrawer : PropertyDrawerBase + { + protected override float GetPropertyHeight_Internal(SerializedProperty property, GUIContent label) + { + return (property.propertyType == SerializedPropertyType.Vector2) + ? GetPropertyHeight(property) + : GetPropertyHeight(property) + GetHelpBoxHeight(); + } + + protected override void OnGUI_Internal(Rect rect, SerializedProperty property, GUIContent label) + { + EditorGUI.BeginProperty(rect, label, property); + + MinMaxSliderAttribute minMaxSliderAttribute = (MinMaxSliderAttribute)attribute; + + if (property.propertyType == SerializedPropertyType.Vector2) + { + EditorGUI.BeginProperty(rect, label, property); + + float indentLength = NaughtyEditorGUI.GetIndentLength(rect); + float labelWidth = EditorGUIUtility.labelWidth; + float floatFieldWidth = EditorGUIUtility.fieldWidth; + float sliderWidth = rect.width - labelWidth - 2f * floatFieldWidth; + float sliderPadding = 5f; + + Rect labelRect = new Rect( + rect.x, + rect.y, + labelWidth, + rect.height); + + Rect sliderRect = new Rect( + rect.x + labelWidth + floatFieldWidth + sliderPadding - indentLength, + rect.y, + sliderWidth - 2f * sliderPadding + indentLength, + rect.height); + + Rect minFloatFieldRect = new Rect( + rect.x + labelWidth - indentLength, + rect.y, + floatFieldWidth + indentLength, + rect.height); + + Rect maxFloatFieldRect = new Rect( + rect.x + labelWidth + floatFieldWidth + sliderWidth - indentLength, + rect.y, + floatFieldWidth + indentLength, + rect.height); + + // Draw the label + EditorGUI.LabelField(labelRect, label.text); + + // Draw the slider + EditorGUI.BeginChangeCheck(); + + Vector2 sliderValue = property.vector2Value; + EditorGUI.MinMaxSlider(sliderRect, ref sliderValue.x, ref sliderValue.y, minMaxSliderAttribute.MinValue, minMaxSliderAttribute.MaxValue); + + sliderValue.x = EditorGUI.FloatField(minFloatFieldRect, sliderValue.x); + sliderValue.x = Mathf.Clamp(sliderValue.x, minMaxSliderAttribute.MinValue, Mathf.Min(minMaxSliderAttribute.MaxValue, sliderValue.y)); + + sliderValue.y = EditorGUI.FloatField(maxFloatFieldRect, sliderValue.y); + sliderValue.y = Mathf.Clamp(sliderValue.y, Mathf.Max(minMaxSliderAttribute.MinValue, sliderValue.x), minMaxSliderAttribute.MaxValue); + + if (EditorGUI.EndChangeCheck()) + { + property.vector2Value = sliderValue; + } + + EditorGUI.EndProperty(); + } + else + { + string message = minMaxSliderAttribute.GetType().Name + " can be used only on Vector2 fields"; + DrawDefaultPropertyAndHelpBox(rect, property, message, MessageType.Warning); + } + + EditorGUI.EndProperty(); + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/MinMaxSliderPropertyDrawer.cs.meta b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/MinMaxSliderPropertyDrawer.cs.meta new file mode 100644 index 0000000..4613ffe --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/MinMaxSliderPropertyDrawer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 27011af81554b5b4489b155f09275475 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ProgressBarPropertyDrawer.cs b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ProgressBarPropertyDrawer.cs new file mode 100644 index 0000000..159a54a --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ProgressBarPropertyDrawer.cs @@ -0,0 +1,133 @@ +using UnityEngine; +using UnityEditor; +using System.Reflection; + +namespace NaughtyAttributes.Editor +{ + [CustomPropertyDrawer(typeof(ProgressBarAttribute))] + public class ProgressBarPropertyDrawer : PropertyDrawerBase + { + protected override float GetPropertyHeight_Internal(SerializedProperty property, GUIContent label) + { + ProgressBarAttribute progressBarAttribute = PropertyUtility.GetAttribute(property); + var maxValue = GetMaxValue(property, progressBarAttribute); + + return IsNumber(property) && maxValue is float + ? GetPropertyHeight(property) + : GetPropertyHeight(property) + GetHelpBoxHeight(); + } + + protected override void OnGUI_Internal(Rect rect, SerializedProperty property, GUIContent label) + { + if (!IsNumber(property)) + { + string message = string.Format("Field {0} is not a number", property.name); + DrawDefaultPropertyAndHelpBox(rect, property, message, MessageType.Warning); + return; + } + + ProgressBarAttribute progressBarAttribute = PropertyUtility.GetAttribute(property); + var value = property.propertyType == SerializedPropertyType.Integer ? property.intValue : property.floatValue; + var valueFormatted = property.propertyType == SerializedPropertyType.Integer ? value.ToString() : string.Format("{0:0.00}", value); + var maxValue = GetMaxValue(property, progressBarAttribute); + + if (maxValue != null && maxValue is float) + { + var fillPercentage = value / (float)maxValue; + var barLabel = (!string.IsNullOrEmpty(progressBarAttribute.Name) ? "[" + progressBarAttribute.Name + "] " : "") + valueFormatted + "/" + maxValue; + var barColor = progressBarAttribute.Color.GetColor(); + var labelColor = Color.white; + + var indentLength = NaughtyEditorGUI.GetIndentLength(rect); + Rect barRect = new Rect() + { + x = rect.x + indentLength, + y = rect.y, + width = rect.width - indentLength, + height = EditorGUIUtility.singleLineHeight + }; + + DrawBar(barRect, Mathf.Clamp01(fillPercentage), barLabel, barColor, labelColor); + } + else + { + string message = string.Format( + "The provided dynamic max value for the progress bar is not correct. Please check if the '{0}' is correct, or the return type is float", + nameof(progressBarAttribute.MaxValueName)); + + DrawDefaultPropertyAndHelpBox(rect, property, message, MessageType.Warning); + } + } + + private object GetMaxValue(SerializedProperty property, ProgressBarAttribute progressBarAttribute) + { + if (string.IsNullOrEmpty(progressBarAttribute.MaxValueName)) + { + return progressBarAttribute.MaxValue; + } + else + { + object target = PropertyUtility.GetTargetObjectWithProperty(property); + + FieldInfo valuesFieldInfo = ReflectionUtility.GetField(target, progressBarAttribute.MaxValueName); + if (valuesFieldInfo != null) + { + return valuesFieldInfo.GetValue(target); + } + + PropertyInfo valuesPropertyInfo = ReflectionUtility.GetProperty(target, progressBarAttribute.MaxValueName); + if (valuesPropertyInfo != null) + { + return valuesPropertyInfo.GetValue(target); + } + + MethodInfo methodValuesInfo = ReflectionUtility.GetMethod(target, progressBarAttribute.MaxValueName); + if (methodValuesInfo != null && + methodValuesInfo.ReturnType == typeof(float) && + methodValuesInfo.GetParameters().Length == 0) + { + return methodValuesInfo.Invoke(target, null); + } + + return null; + } + } + + private void DrawBar(Rect rect, float fillPercent, string label, Color barColor, Color labelColor) + { + if (Event.current.type != EventType.Repaint) + { + return; + } + + var fillRect = new Rect(rect.x, rect.y, rect.width * fillPercent, rect.height); + + EditorGUI.DrawRect(rect, new Color(0.13f, 0.13f, 0.13f)); + EditorGUI.DrawRect(fillRect, barColor); + + // set alignment and cache the default + var align = GUI.skin.label.alignment; + GUI.skin.label.alignment = TextAnchor.UpperCenter; + + // set the color and cache the default + var c = GUI.contentColor; + GUI.contentColor = labelColor; + + // calculate the position + var labelRect = new Rect(rect.x, rect.y - 2, rect.width, rect.height); + + // draw~ + EditorGUI.DropShadowLabel(labelRect, label); + + // reset color and alignment + GUI.contentColor = c; + GUI.skin.label.alignment = align; + } + + private bool IsNumber(SerializedProperty property) + { + bool isNumber = property.propertyType == SerializedPropertyType.Float || property.propertyType == SerializedPropertyType.Integer; + return isNumber; + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ProgressBarPropertyDrawer.cs.meta b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ProgressBarPropertyDrawer.cs.meta new file mode 100644 index 0000000..dfb90f1 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ProgressBarPropertyDrawer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0bcbc424b10864b4eb6e3bcfb276cdf9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/PropertyDrawerBase.cs b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/PropertyDrawerBase.cs new file mode 100644 index 0000000..11fe185 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/PropertyDrawerBase.cs @@ -0,0 +1,86 @@ +using UnityEditor; +using UnityEngine; + +namespace NaughtyAttributes.Editor +{ + public abstract class PropertyDrawerBase : PropertyDrawer + { + public sealed override void OnGUI(Rect rect, SerializedProperty property, GUIContent label) + { + // Check if visible + bool visible = PropertyUtility.IsVisible(property); + if (!visible) + { + return; + } + + // Validate + ValidatorAttribute[] validatorAttributes = PropertyUtility.GetAttributes(property); + foreach (var validatorAttribute in validatorAttributes) + { + validatorAttribute.GetValidator().ValidateProperty(property); + } + + // Check if enabled and draw + EditorGUI.BeginChangeCheck(); + bool enabled = PropertyUtility.IsEnabled(property); + GUI.enabled = enabled; + OnGUI_Internal(rect, property, new GUIContent(PropertyUtility.GetLabel(property))); + GUI.enabled = true; + + // Call OnValueChanged callbacks + if (EditorGUI.EndChangeCheck()) + { + PropertyUtility.CallOnValueChangedCallbacks(property); + } + } + + protected abstract void OnGUI_Internal(Rect rect, SerializedProperty property, GUIContent label); + + sealed override public float GetPropertyHeight(SerializedProperty property, GUIContent label) + { + bool visible = PropertyUtility.IsVisible(property); + if (!visible) + { + return 0.0f; + } + + return GetPropertyHeight_Internal(property, label); + } + + protected virtual float GetPropertyHeight_Internal(SerializedProperty property, GUIContent label) + { + return base.GetPropertyHeight(property, label); + } + + protected virtual float GetPropertyHeight(SerializedProperty property) + { + return EditorGUI.GetPropertyHeight(property, true); + } + + public virtual float GetHelpBoxHeight() + { + return EditorGUIUtility.singleLineHeight * 3.0f; + } + + public void DrawDefaultPropertyAndHelpBox(Rect rect, SerializedProperty property, string message, MessageType messageType) + { + float indentLength = NaughtyEditorGUI.GetIndentLength(rect); + Rect helpBoxRect = new Rect( + rect.x + indentLength, + rect.y, + rect.width - indentLength, + GetHelpBoxHeight() - 2.0f); + + NaughtyEditorGUI.HelpBox(helpBoxRect, message, MessageType.Warning, context: property.serializedObject.targetObject); + + Rect propertyRect = new Rect( + rect.x, + rect.y + GetHelpBoxHeight(), + rect.width, + GetPropertyHeight(property)); + + EditorGUI.PropertyField(propertyRect, property, true); + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/PropertyDrawerBase.cs.meta b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/PropertyDrawerBase.cs.meta new file mode 100644 index 0000000..71a80b6 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/PropertyDrawerBase.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 574f5fa6033f26342816a8a5f39749e5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ReadOnlyPropertyDrawer.cs b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ReadOnlyPropertyDrawer.cs new file mode 100644 index 0000000..9ca5ec9 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ReadOnlyPropertyDrawer.cs @@ -0,0 +1,25 @@ +using UnityEngine; +using UnityEditor; + +namespace NaughtyAttributes.Editor +{ + [CustomPropertyDrawer(typeof(ReadOnlyAttribute))] + public class ReadOnlyPropertyDrawer : PropertyDrawerBase + { + protected override float GetPropertyHeight_Internal(SerializedProperty property, GUIContent label) + { + return GetPropertyHeight(property); + } + + protected override void OnGUI_Internal(Rect rect, SerializedProperty property, GUIContent label) + { + EditorGUI.BeginProperty(rect, label, property); + + GUI.enabled = false; + EditorGUI.PropertyField(rect, property, label, true); + GUI.enabled = true; + + EditorGUI.EndProperty(); + } + } +} \ No newline at end of file diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ReadOnlyPropertyDrawer.cs.meta b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ReadOnlyPropertyDrawer.cs.meta new file mode 100644 index 0000000..4a7385e --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ReadOnlyPropertyDrawer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1839b194211d84f4cae22740dbba390f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ResizableTextAreaPropertyDrawer.cs b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ResizableTextAreaPropertyDrawer.cs new file mode 100644 index 0000000..97d3c82 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ResizableTextAreaPropertyDrawer.cs @@ -0,0 +1,87 @@ +using UnityEngine; +using UnityEditor; +using System.Text.RegularExpressions; +using System; + +namespace NaughtyAttributes.Editor +{ + [CustomPropertyDrawer(typeof(ResizableTextAreaAttribute))] + public class ResizableTextAreaPropertyDrawer : PropertyDrawerBase + { + protected override float GetPropertyHeight(SerializedProperty property) + { + if (property.propertyType == SerializedPropertyType.String) + { + float labelHeight = EditorGUIUtility.singleLineHeight; + float textAreaHeight = GetTextAreaHeight(property.stringValue); + return labelHeight + textAreaHeight; + } + else + { + return base.GetPropertyHeight(property); + } + } + + protected override float GetPropertyHeight_Internal(SerializedProperty property, GUIContent label) + { + return (property.propertyType == SerializedPropertyType.String) + ? this.GetPropertyHeight(property) + : base.GetPropertyHeight(property) + GetHelpBoxHeight(); + } + + protected override void OnGUI_Internal(Rect rect, SerializedProperty property, GUIContent label) + { + EditorGUI.BeginProperty(rect, label, property); + + if (property.propertyType == SerializedPropertyType.String) + { + Rect labelRect = new Rect() + { + x = rect.x, + y = rect.y, + width = rect.width, + height = EditorGUIUtility.singleLineHeight + }; + + EditorGUI.LabelField(labelRect, label.text); + + EditorGUI.BeginChangeCheck(); + + Rect textAreaRect = new Rect() + { + x = labelRect.x, + y = labelRect.y + EditorGUIUtility.singleLineHeight - 3.0f, + width = labelRect.width, + height = GetTextAreaHeight(property.stringValue) + }; + + string textAreaValue = EditorGUI.TextArea(textAreaRect, property.stringValue); + + if (EditorGUI.EndChangeCheck()) + { + property.stringValue = textAreaValue; + } + } + else + { + string message = typeof(ResizableTextAreaAttribute).Name + " can only be used on string fields"; + DrawDefaultPropertyAndHelpBox(rect, property, message, MessageType.Warning); + } + + EditorGUI.EndProperty(); + } + + private int GetNumberOfLines(string text) + { + string content = Regex.Replace(text, @"\r\n|\n\r|\r|\n", Environment.NewLine); + string[] lines = content.Split(new string[] { Environment.NewLine }, StringSplitOptions.None); + return lines.Length; + } + + private float GetTextAreaHeight(string text) + { + float height = (EditorGUIUtility.singleLineHeight - 3.0f) * GetNumberOfLines(text) + 3.0f; + return height; + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ResizableTextAreaPropertyDrawer.cs.meta b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ResizableTextAreaPropertyDrawer.cs.meta new file mode 100644 index 0000000..4b1e4a5 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ResizableTextAreaPropertyDrawer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6e27ffd9a96b58c46bb74cc93de3e06f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ScenePropertyDrawer.cs b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ScenePropertyDrawer.cs new file mode 100644 index 0000000..3f030f8 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ScenePropertyDrawer.cs @@ -0,0 +1,86 @@ +using UnityEngine; +using UnityEditor; +using System.Linq; +using System.Text.RegularExpressions; +using System; + +namespace NaughtyAttributes.Editor +{ + [CustomPropertyDrawer(typeof(SceneAttribute))] + public class ScenePropertyDrawer : PropertyDrawerBase + { + private const string SceneListItem = "{0} ({1})"; + private const string ScenePattern = @".+\/(.+)\.unity"; + private const string TypeWarningMessage = "{0} must be an int or a string"; + private const string BuildSettingsWarningMessage = "No scenes in the build settings"; + + protected override float GetPropertyHeight_Internal(SerializedProperty property, GUIContent label) + { + bool validPropertyType = property.propertyType == SerializedPropertyType.String || property.propertyType == SerializedPropertyType.Integer; + bool anySceneInBuildSettings = GetScenes().Length > 0; + + return (validPropertyType && anySceneInBuildSettings) + ? GetPropertyHeight(property) + : GetPropertyHeight(property) + GetHelpBoxHeight(); + } + + protected override void OnGUI_Internal(Rect rect, SerializedProperty property, GUIContent label) + { + string[] scenes = GetScenes(); + bool anySceneInBuildSettings = scenes.Length > 0; + if (!anySceneInBuildSettings) + { + DrawDefaultPropertyAndHelpBox(rect, property, BuildSettingsWarningMessage, MessageType.Warning); + return; + } + + string[] sceneOptions = GetSceneOptions(scenes); + switch (property.propertyType) + { + case SerializedPropertyType.String: + DrawPropertyForString(rect, property, label, scenes, sceneOptions); + break; + case SerializedPropertyType.Integer: + DrawPropertyForInt(rect, property, label, sceneOptions); + break; + default: + string message = string.Format(TypeWarningMessage, property.name); + DrawDefaultPropertyAndHelpBox(rect, property, message, MessageType.Warning); + break; + } + } + + private string[] GetScenes() + { + return EditorBuildSettings.scenes + .Where(scene => scene.enabled) + .Select(scene => Regex.Match(scene.path, ScenePattern).Groups[1].Value) + .ToArray(); + } + + private string[] GetSceneOptions(string[] scenes) + { + return scenes.Select((s, i) => string.Format(SceneListItem, s, i)).ToArray(); + } + + private static void DrawPropertyForString(Rect rect, SerializedProperty property, GUIContent label, string[] scenes, string[] sceneOptions) + { + var index = IndexOf(scenes, property.stringValue); + var newIndex = EditorGUI.Popup(rect, label.text, index, sceneOptions); + property.stringValue = scenes[newIndex]; + } + + private static void DrawPropertyForInt(Rect rect, SerializedProperty property, GUIContent label, string[] sceneOptions) + { + var index = property.intValue; + var newIndex = EditorGUI.Popup(rect, label.text, index, sceneOptions); + property.intValue = newIndex; + } + + private static int IndexOf(string[] scenes, string scene) + { + var index = Array.IndexOf(scenes, scene); + return Mathf.Clamp(index, 0, scenes.Length - 1); + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ScenePropertyDrawer.cs.meta b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ScenePropertyDrawer.cs.meta new file mode 100644 index 0000000..a416544 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ScenePropertyDrawer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7f5ed440d4f429e42a5da7bc5df48fd8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ShowAssetPreviewPropertyDrawer.cs b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ShowAssetPreviewPropertyDrawer.cs new file mode 100644 index 0000000..1e561bd --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ShowAssetPreviewPropertyDrawer.cs @@ -0,0 +1,101 @@ +using UnityEngine; +using UnityEditor; + +namespace NaughtyAttributes.Editor +{ + [CustomPropertyDrawer(typeof(ShowAssetPreviewAttribute))] + public class ShowAssetPreviewPropertyDrawer : PropertyDrawerBase + { + protected override float GetPropertyHeight_Internal(SerializedProperty property, GUIContent label) + { + if (property.propertyType == SerializedPropertyType.ObjectReference) + { + Texture2D previewTexture = GetAssetPreview(property); + if (previewTexture != null) + { + return GetPropertyHeight(property) + GetAssetPreviewSize(property).y; + } + else + { + return GetPropertyHeight(property); + } + } + else + { + return GetPropertyHeight(property) + GetHelpBoxHeight(); + } + } + + protected override void OnGUI_Internal(Rect rect, SerializedProperty property, GUIContent label) + { + EditorGUI.BeginProperty(rect, label, property); + + if (property.propertyType == SerializedPropertyType.ObjectReference) + { + Rect propertyRect = new Rect() + { + x = rect.x, + y = rect.y, + width = rect.width, + height = EditorGUIUtility.singleLineHeight + }; + + EditorGUI.PropertyField(propertyRect, property, label); + + Texture2D previewTexture = GetAssetPreview(property); + if (previewTexture != null) + { + Rect previewRect = new Rect() + { + x = rect.x + NaughtyEditorGUI.GetIndentLength(rect), + y = rect.y + EditorGUIUtility.singleLineHeight, + width = rect.width, + height = GetAssetPreviewSize(property).y + }; + + GUI.Label(previewRect, previewTexture); + } + } + else + { + string message = property.name + " doesn't have an asset preview"; + DrawDefaultPropertyAndHelpBox(rect, property, message, MessageType.Warning); + } + + EditorGUI.EndProperty(); + } + + private Texture2D GetAssetPreview(SerializedProperty property) + { + if (property.propertyType == SerializedPropertyType.ObjectReference) + { + if (property.objectReferenceValue != null) + { + Texture2D previewTexture = AssetPreview.GetAssetPreview(property.objectReferenceValue); + return previewTexture; + } + + return null; + } + + return null; + } + + private Vector2 GetAssetPreviewSize(SerializedProperty property) + { + Texture2D previewTexture = GetAssetPreview(property); + if (previewTexture == null) + { + return Vector2.zero; + } + else + { + ShowAssetPreviewAttribute showAssetPreviewAttribute = PropertyUtility.GetAttribute(property); + int width = Mathf.Clamp(showAssetPreviewAttribute.Width, 0, previewTexture.width); + int height = Mathf.Clamp(showAssetPreviewAttribute.Height, 0, previewTexture.height); + + return new Vector2(width, height); + } + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ShowAssetPreviewPropertyDrawer.cs.meta b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ShowAssetPreviewPropertyDrawer.cs.meta new file mode 100644 index 0000000..5a4d16d --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/ShowAssetPreviewPropertyDrawer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 24dee3fc91cfe94438de1e3c158f187f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/TagPropertyDrawer.cs b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/TagPropertyDrawer.cs new file mode 100644 index 0000000..91d49f5 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/TagPropertyDrawer.cs @@ -0,0 +1,60 @@ +using System.Collections.Generic; +using UnityEditor; +using UnityEngine; + +namespace NaughtyAttributes.Editor +{ + [CustomPropertyDrawer(typeof(TagAttribute))] + public class TagPropertyDrawer : PropertyDrawerBase + { + protected override float GetPropertyHeight_Internal(SerializedProperty property, GUIContent label) + { + return (property.propertyType == SerializedPropertyType.String) + ? GetPropertyHeight(property) + : GetPropertyHeight(property) + GetHelpBoxHeight(); + } + + protected override void OnGUI_Internal(Rect rect, SerializedProperty property, GUIContent label) + { + if (property.propertyType == SerializedPropertyType.String) + { + // generate the taglist + custom tags + List tagList = new List(); + tagList.Add("(None)"); + tagList.Add("Untagged"); + tagList.AddRange(UnityEditorInternal.InternalEditorUtility.tags); + + string propertyString = property.stringValue; + int index = 0; + // check if there is an entry that matches the entry and get the index + // we skip index 0 as that is a special custom case + for (int i = 1; i < tagList.Count; i++) + { + if (tagList[i] == propertyString) + { + index = i; + break; + } + } + + // Draw the popup box with the current selected index + index = EditorGUI.Popup(rect, label.text, index, tagList.ToArray()); + + // Adjust the actual string value of the property based on the selection + if (index > 0) + { + property.stringValue = tagList[index]; + } + else + { + property.stringValue = string.Empty; + } + } + else + { + string message = string.Format("{0} supports only string fields", typeof(TagAttribute).Name); + DrawDefaultPropertyAndHelpBox(rect, property, message, MessageType.Warning); + } + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/TagPropertyDrawer.cs.meta b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/TagPropertyDrawer.cs.meta new file mode 100644 index 0000000..75f76c5 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers/TagPropertyDrawer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3df4c068c970ab6498df7a60efbde311 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers_SpecialCase.meta b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers_SpecialCase.meta new file mode 100644 index 0000000..88cd458 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers_SpecialCase.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 750a102004a7e4f46a2046a3d74cae19 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers_SpecialCase/ReorderableListPropertyDrawer.cs b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers_SpecialCase/ReorderableListPropertyDrawer.cs new file mode 100644 index 0000000..9de11cb --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers_SpecialCase/ReorderableListPropertyDrawer.cs @@ -0,0 +1,68 @@ +using UnityEngine; +using UnityEditor; +using UnityEditorInternal; +using System.Collections.Generic; + +namespace NaughtyAttributes.Editor +{ + public class ReorderableListPropertyDrawer : SpecialCasePropertyDrawerBase + { + public static readonly ReorderableListPropertyDrawer Instance = new ReorderableListPropertyDrawer(); + + private readonly Dictionary _reorderableListsByPropertyName = new Dictionary(); + + private string GetPropertyKeyName(SerializedProperty property) + { + return property.serializedObject.targetObject.GetInstanceID() + "/" + property.name; + } + + protected override void OnGUI_Internal(SerializedProperty property, GUIContent label) + { + if (property.isArray) + { + string key = GetPropertyKeyName(property); + + if (!_reorderableListsByPropertyName.ContainsKey(key)) + { + ReorderableList reorderableList = new ReorderableList(property.serializedObject, property, true, true, true, true) + { + drawHeaderCallback = (Rect rect) => + { + EditorGUI.LabelField(rect, string.Format("{0}: {1}", label.text, property.arraySize), EditorStyles.boldLabel); + }, + + drawElementCallback = (Rect rect, int index, bool isActive, bool isFocused) => + { + SerializedProperty element = property.GetArrayElementAtIndex(index); + rect.y += 1.0f; + rect.x += 10.0f; + rect.width -= 10.0f; + + EditorGUI.PropertyField(new Rect(rect.x, rect.y, rect.width, 0.0f), element, true); + }, + + elementHeightCallback = (int index) => + { + return EditorGUI.GetPropertyHeight(property.GetArrayElementAtIndex(index)) + 4.0f; + } + }; + + _reorderableListsByPropertyName[key] = reorderableList; + } + + _reorderableListsByPropertyName[key].DoLayoutList(); + } + else + { + string message = typeof(ReorderableListAttribute).Name + " can be used only on arrays or lists"; + NaughtyEditorGUI.HelpBox_Layout(message, MessageType.Warning, context: property.serializedObject.targetObject); + EditorGUILayout.PropertyField(property, true); + } + } + + public void ClearCache() + { + _reorderableListsByPropertyName.Clear(); + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers_SpecialCase/ReorderableListPropertyDrawer.cs.meta b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers_SpecialCase/ReorderableListPropertyDrawer.cs.meta new file mode 100644 index 0000000..4ff1a66 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers_SpecialCase/ReorderableListPropertyDrawer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: bf36691a6d456564db2fcbfa8726b3f3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers_SpecialCase/SpecialCasePropertyDrawerBase.cs b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers_SpecialCase/SpecialCasePropertyDrawerBase.cs new file mode 100644 index 0000000..f8a3ffa --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers_SpecialCase/SpecialCasePropertyDrawerBase.cs @@ -0,0 +1,66 @@ +using System; +using System.Collections.Generic; +using UnityEditor; +using UnityEngine; + +namespace NaughtyAttributes.Editor +{ + public abstract class SpecialCasePropertyDrawerBase + { + public void OnGUI(SerializedProperty property) + { + // Check if visible + bool visible = PropertyUtility.IsVisible(property); + if (!visible) + { + return; + } + + // Validate + ValidatorAttribute[] validatorAttributes = PropertyUtility.GetAttributes(property); + foreach (var validatorAttribute in validatorAttributes) + { + validatorAttribute.GetValidator().ValidateProperty(property); + } + + // Check if enabled and draw + EditorGUI.BeginChangeCheck(); + bool enabled = PropertyUtility.IsEnabled(property); + GUI.enabled = enabled; + OnGUI_Internal(property, new GUIContent(PropertyUtility.GetLabel(property))); + GUI.enabled = true; + + // Call OnValueChanged callbacks + if (EditorGUI.EndChangeCheck()) + { + PropertyUtility.CallOnValueChangedCallbacks(property); + } + } + + protected abstract void OnGUI_Internal(SerializedProperty property, GUIContent label); + } + + public static class SpecialCaseDrawerAttributeExtensions + { + private static Dictionary _drawersByAttributeType; + + static SpecialCaseDrawerAttributeExtensions() + { + _drawersByAttributeType = new Dictionary(); + _drawersByAttributeType[typeof(ReorderableListAttribute)] = ReorderableListPropertyDrawer.Instance; + } + + public static SpecialCasePropertyDrawerBase GetDrawer(this SpecialCaseDrawerAttribute attr) + { + SpecialCasePropertyDrawerBase drawer; + if (_drawersByAttributeType.TryGetValue(attr.GetType(), out drawer)) + { + return drawer; + } + else + { + return null; + } + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers_SpecialCase/SpecialCasePropertyDrawerBase.cs.meta b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers_SpecialCase/SpecialCasePropertyDrawerBase.cs.meta new file mode 100644 index 0000000..c60287c --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyDrawers_SpecialCase/SpecialCasePropertyDrawerBase.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 771776453ad34b045a41dea54856fa12 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyValidators.meta b/Assets/NaughtyAttributes/Scripts/Editor/PropertyValidators.meta new file mode 100644 index 0000000..949d96d --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyValidators.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 41caedece93df91439d624dc9d124424 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyValidators/MaxValuePropertyValidator.cs b/Assets/NaughtyAttributes/Scripts/Editor/PropertyValidators/MaxValuePropertyValidator.cs new file mode 100644 index 0000000..34e6d13 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyValidators/MaxValuePropertyValidator.cs @@ -0,0 +1,33 @@ +using UnityEngine; +using UnityEditor; + +namespace NaughtyAttributes.Editor +{ + public class MaxValuePropertyValidator : PropertyValidatorBase + { + public override void ValidateProperty(SerializedProperty property) + { + MaxValueAttribute maxValueAttribute = PropertyUtility.GetAttribute(property); + + if (property.propertyType == SerializedPropertyType.Integer) + { + if (property.intValue > maxValueAttribute.MaxValue) + { + property.intValue = (int)maxValueAttribute.MaxValue; + } + } + else if (property.propertyType == SerializedPropertyType.Float) + { + if (property.floatValue > maxValueAttribute.MaxValue) + { + property.floatValue = maxValueAttribute.MaxValue; + } + } + else + { + string warning = maxValueAttribute.GetType().Name + " can be used only on int or float fields"; + Debug.LogWarning(warning, property.serializedObject.targetObject); + } + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyValidators/MaxValuePropertyValidator.cs.meta b/Assets/NaughtyAttributes/Scripts/Editor/PropertyValidators/MaxValuePropertyValidator.cs.meta new file mode 100644 index 0000000..3e809ac --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyValidators/MaxValuePropertyValidator.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 627b8e9e7bda6fa408c6f47fb8285665 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyValidators/MinValuePropertyValidator.cs b/Assets/NaughtyAttributes/Scripts/Editor/PropertyValidators/MinValuePropertyValidator.cs new file mode 100644 index 0000000..f7fb7ac --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyValidators/MinValuePropertyValidator.cs @@ -0,0 +1,33 @@ +using UnityEngine; +using UnityEditor; + +namespace NaughtyAttributes.Editor +{ + public class MinValuePropertyValidator : PropertyValidatorBase + { + public override void ValidateProperty(SerializedProperty property) + { + MinValueAttribute minValueAttribute = PropertyUtility.GetAttribute(property); + + if (property.propertyType == SerializedPropertyType.Integer) + { + if (property.intValue < minValueAttribute.MinValue) + { + property.intValue = (int)minValueAttribute.MinValue; + } + } + else if (property.propertyType == SerializedPropertyType.Float) + { + if (property.floatValue < minValueAttribute.MinValue) + { + property.floatValue = minValueAttribute.MinValue; + } + } + else + { + string warning = minValueAttribute.GetType().Name + " can be used only on int or float fields"; + Debug.LogWarning(warning, property.serializedObject.targetObject); + } + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyValidators/MinValuePropertyValidator.cs.meta b/Assets/NaughtyAttributes/Scripts/Editor/PropertyValidators/MinValuePropertyValidator.cs.meta new file mode 100644 index 0000000..b3bb871 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyValidators/MinValuePropertyValidator.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 03dd23f6c0598074fb1b721dcd8fe023 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyValidators/PropertyValidatorBase.cs b/Assets/NaughtyAttributes/Scripts/Editor/PropertyValidators/PropertyValidatorBase.cs new file mode 100644 index 0000000..fed61af --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyValidators/PropertyValidatorBase.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; +using UnityEditor; + +namespace NaughtyAttributes.Editor +{ + public abstract class PropertyValidatorBase + { + public abstract void ValidateProperty(SerializedProperty property); + } + + public static class ValidatorAttributeExtensions + { + private static Dictionary _validatorsByAttributeType; + + static ValidatorAttributeExtensions() + { + _validatorsByAttributeType = new Dictionary(); + _validatorsByAttributeType[typeof(MinValueAttribute)] = new MinValuePropertyValidator(); + _validatorsByAttributeType[typeof(MaxValueAttribute)] = new MaxValuePropertyValidator(); + _validatorsByAttributeType[typeof(RequiredAttribute)] = new RequiredPropertyValidator(); + _validatorsByAttributeType[typeof(ValidateInputAttribute)] = new ValidateInputPropertyValidator(); + } + + public static PropertyValidatorBase GetValidator(this ValidatorAttribute attr) + { + PropertyValidatorBase validator; + if (_validatorsByAttributeType.TryGetValue(attr.GetType(), out validator)) + { + return validator; + } + else + { + return null; + } + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyValidators/PropertyValidatorBase.cs.meta b/Assets/NaughtyAttributes/Scripts/Editor/PropertyValidators/PropertyValidatorBase.cs.meta new file mode 100644 index 0000000..97fe581 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyValidators/PropertyValidatorBase.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f332c8e1c3627d742aa9158af7b02ccc +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyValidators/RequiredPropertyValidator.cs b/Assets/NaughtyAttributes/Scripts/Editor/PropertyValidators/RequiredPropertyValidator.cs new file mode 100644 index 0000000..6ad8090 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyValidators/RequiredPropertyValidator.cs @@ -0,0 +1,31 @@ +using UnityEditor; + +namespace NaughtyAttributes.Editor +{ + public class RequiredPropertyValidator : PropertyValidatorBase + { + public override void ValidateProperty(SerializedProperty property) + { + RequiredAttribute requiredAttribute = PropertyUtility.GetAttribute(property); + + if (property.propertyType == SerializedPropertyType.ObjectReference) + { + if (property.objectReferenceValue == null) + { + string errorMessage = property.name + " is required"; + if (!string.IsNullOrEmpty(requiredAttribute.Message)) + { + errorMessage = requiredAttribute.Message; + } + + NaughtyEditorGUI.HelpBox_Layout(errorMessage, MessageType.Error, context: property.serializedObject.targetObject); + } + } + else + { + string warning = requiredAttribute.GetType().Name + " works only on reference types"; + NaughtyEditorGUI.HelpBox_Layout(warning, MessageType.Warning, context: property.serializedObject.targetObject); + } + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyValidators/RequiredPropertyValidator.cs.meta b/Assets/NaughtyAttributes/Scripts/Editor/PropertyValidators/RequiredPropertyValidator.cs.meta new file mode 100644 index 0000000..d24143a --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyValidators/RequiredPropertyValidator.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3a7e657ea45f6414682b5f41be9541b4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyValidators/ValidateInputPropertyValidator.cs b/Assets/NaughtyAttributes/Scripts/Editor/PropertyValidators/ValidateInputPropertyValidator.cs new file mode 100644 index 0000000..f7cca86 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyValidators/ValidateInputPropertyValidator.cs @@ -0,0 +1,75 @@ +using UnityEditor; +using System.Reflection; +using System; + +namespace NaughtyAttributes.Editor +{ + public class ValidateInputPropertyValidator : PropertyValidatorBase + { + public override void ValidateProperty(SerializedProperty property) + { + ValidateInputAttribute validateInputAttribute = PropertyUtility.GetAttribute(property); + object target = PropertyUtility.GetTargetObjectWithProperty(property); + + MethodInfo validationCallback = ReflectionUtility.GetMethod(target, validateInputAttribute.CallbackName); + + if (validationCallback != null && + validationCallback.ReturnType == typeof(bool)) + { + ParameterInfo[] callbackParameters = validationCallback.GetParameters(); + + if (callbackParameters.Length == 0) { + if (!(bool)validationCallback.Invoke(target, null)) + { + if (string.IsNullOrEmpty(validateInputAttribute.Message)) + { + NaughtyEditorGUI.HelpBox_Layout( + property.name + " is not valid", MessageType.Error, context: property.serializedObject.targetObject); + } + else + { + NaughtyEditorGUI.HelpBox_Layout( + validateInputAttribute.Message, MessageType.Error, context: property.serializedObject.targetObject); + } + } + } + else if (callbackParameters.Length == 1) + { + FieldInfo fieldInfo = ReflectionUtility.GetField(target, property.name); + Type fieldType = fieldInfo.FieldType; + Type parameterType = callbackParameters[0].ParameterType; + + if (fieldType == parameterType) + { + if (!(bool)validationCallback.Invoke(target, new object[] { fieldInfo.GetValue(target) })) + { + if (string.IsNullOrEmpty(validateInputAttribute.Message)) + { + NaughtyEditorGUI.HelpBox_Layout( + property.name + " is not valid", MessageType.Error, context: property.serializedObject.targetObject); + } + else + { + NaughtyEditorGUI.HelpBox_Layout( + validateInputAttribute.Message, MessageType.Error, context: property.serializedObject.targetObject); + } + } + } + else + { + string warning = "The field type is not the same as the callback's parameter type"; + NaughtyEditorGUI.HelpBox_Layout(warning, MessageType.Warning, context: property.serializedObject.targetObject); + } + } + else + { + string warning = + validateInputAttribute.GetType().Name + + " needs a callback with boolean return type and an optional single parameter of the same type as the field"; + + NaughtyEditorGUI.HelpBox_Layout(warning, MessageType.Warning, context: property.serializedObject.targetObject); + } + } + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Editor/PropertyValidators/ValidateInputPropertyValidator.cs.meta b/Assets/NaughtyAttributes/Scripts/Editor/PropertyValidators/ValidateInputPropertyValidator.cs.meta new file mode 100644 index 0000000..3f6e539 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/PropertyValidators/ValidateInputPropertyValidator.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5f6adf84ed53a7840a456e8b4dce38d9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/Utility.meta b/Assets/NaughtyAttributes/Scripts/Editor/Utility.meta new file mode 100644 index 0000000..40e857c --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/Utility.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: acb4475c71a3fe947a81ced84ab89c6d +folderAsset: yes +timeCreated: 1508062761 +licenseType: Store +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/Utility/ButtonUtility.cs b/Assets/NaughtyAttributes/Scripts/Editor/Utility/ButtonUtility.cs new file mode 100644 index 0000000..0934a23 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/Utility/ButtonUtility.cs @@ -0,0 +1,55 @@ +using UnityEngine; +using System.Reflection; +using System.Collections.Generic; + +namespace NaughtyAttributes.Editor +{ + public static class ButtonUtility + { + public static bool IsEnabled(Object target, MethodInfo method) + { + EnableIfAttributeBase enableIfAttribute = method.GetCustomAttribute(); + if (enableIfAttribute == null) + { + return true; + } + + List conditionValues = PropertyUtility.GetConditionValues(target, enableIfAttribute.Conditions); + if (conditionValues.Count > 0) + { + bool enabled = PropertyUtility.GetConditionsFlag(conditionValues, enableIfAttribute.ConditionOperator, enableIfAttribute.Inverted); + return enabled; + } + else + { + string message = enableIfAttribute.GetType().Name + " needs a valid boolean condition field, property or method name to work"; + Debug.LogWarning(message, target); + + return false; + } + } + + public static bool IsVisible(Object target, MethodInfo method) + { + ShowIfAttributeBase showIfAttribute = method.GetCustomAttribute(); + if (showIfAttribute == null) + { + return true; + } + + List conditionValues = PropertyUtility.GetConditionValues(target, showIfAttribute.Conditions); + if (conditionValues.Count > 0) + { + bool enabled = PropertyUtility.GetConditionsFlag(conditionValues, showIfAttribute.ConditionOperator, showIfAttribute.Inverted); + return enabled; + } + else + { + string message = showIfAttribute.GetType().Name + " needs a valid boolean condition field, property or method name to work"; + Debug.LogWarning(message, target); + + return false; + } + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Editor/Utility/ButtonUtility.cs.meta b/Assets/NaughtyAttributes/Scripts/Editor/Utility/ButtonUtility.cs.meta new file mode 100644 index 0000000..cf4dace --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/Utility/ButtonUtility.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a273f81125ec52d4cb5dec2228afda0e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/Utility/NaughtyEditorGUI.cs b/Assets/NaughtyAttributes/Scripts/Editor/Utility/NaughtyEditorGUI.cs new file mode 100644 index 0000000..37b76e4 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/Utility/NaughtyEditorGUI.cs @@ -0,0 +1,331 @@ +using System; +using System.Collections; +using System.Linq; +using System.Reflection; +using UnityEditor; +using UnityEditor.Experimental.SceneManagement; +using UnityEditor.SceneManagement; +using UnityEngine; + +namespace NaughtyAttributes.Editor +{ + public static class NaughtyEditorGUI + { + public static void PropertyField_Layout(SerializedProperty property, bool includeChildren) + { + SpecialCaseDrawerAttribute specialCaseAttribute = PropertyUtility.GetAttribute(property); + if (specialCaseAttribute != null) + { + specialCaseAttribute.GetDrawer().OnGUI(property); + } + else + { + GUIContent label = new GUIContent(PropertyUtility.GetLabel(property)); + bool anyDrawerAttribute = PropertyUtility.GetAttributes(property).Any(); + + if (!anyDrawerAttribute) + { + // Drawer attributes check for visibility, enableability and validator themselves, + // so if a property doesn't have a DrawerAttribute we need to check for these explicitly + + // Check if visible + bool visible = PropertyUtility.IsVisible(property); + if (!visible) + { + return; + } + + // Validate + ValidatorAttribute[] validatorAttributes = PropertyUtility.GetAttributes(property); + foreach (var validatorAttribute in validatorAttributes) + { + validatorAttribute.GetValidator().ValidateProperty(property); + } + + // Check if enabled and draw + EditorGUI.BeginChangeCheck(); + bool enabled = PropertyUtility.IsEnabled(property); + GUI.enabled = enabled; + EditorGUILayout.PropertyField(property, label, includeChildren); + GUI.enabled = true; + + // Call OnValueChanged callbacks + if (EditorGUI.EndChangeCheck()) + { + PropertyUtility.CallOnValueChangedCallbacks(property); + } + } + else + { + // We don't need to check for enableIfAttribute + EditorGUILayout.PropertyField(property, label, includeChildren); + } + } + } + + public static float GetIndentLength(Rect sourceRect) + { + Rect indentRect = EditorGUI.IndentedRect(sourceRect); + float indentLength = indentRect.x - sourceRect.x; + + return indentLength; + } + + public static void BeginBoxGroup_Layout(string label = "") + { + EditorGUILayout.BeginVertical(GUI.skin.box); + if (!string.IsNullOrEmpty(label)) + { + EditorGUILayout.LabelField(label, EditorStyles.boldLabel); + } + } + + public static void EndBoxGroup_Layout() + { + EditorGUILayout.EndVertical(); + } + + /// + /// Creates a dropdown + /// + /// The rect the defines the position and size of the dropdown in the inspector + /// The serialized object that is being updated + /// The target object that contains the dropdown + /// The field of the target object that holds the currently selected dropdown value + /// The label of the dropdown + /// The index of the value from the values array + /// The values of the dropdown + /// The display options for the values + public static void Dropdown( + Rect rect, SerializedObject serializedObject, object target, FieldInfo dropdownField, + string label, int selectedValueIndex, object[] values, string[] displayOptions) + { + EditorGUI.BeginChangeCheck(); + + int newIndex = EditorGUI.Popup(rect, label, selectedValueIndex, displayOptions); + + if (EditorGUI.EndChangeCheck()) + { + Undo.RecordObject(serializedObject.targetObject, "Dropdown"); + + // TODO: Problem with structs, because they are value type. + // The solution is to make boxing/unboxing but unfortunately I don't know the compile time type of the target object + dropdownField.SetValue(target, values[newIndex]); + } + } + + public static void Button(UnityEngine.Object target, MethodInfo methodInfo) + { + bool visible = ButtonUtility.IsVisible(target, methodInfo); + if (!visible) + { + return; + } + + if (methodInfo.GetParameters().All(p => p.IsOptional)) + { + ButtonAttribute buttonAttribute = (ButtonAttribute)methodInfo.GetCustomAttributes(typeof(ButtonAttribute), true)[0]; + string buttonText = string.IsNullOrEmpty(buttonAttribute.Text) ? ObjectNames.NicifyVariableName(methodInfo.Name) : buttonAttribute.Text; + + bool buttonEnabled = ButtonUtility.IsEnabled(target, methodInfo); + + EButtonEnableMode mode = buttonAttribute.SelectedEnableMode; + buttonEnabled &= + mode == EButtonEnableMode.Always || + mode == EButtonEnableMode.Editor && !Application.isPlaying || + mode == EButtonEnableMode.Playmode && Application.isPlaying; + + bool methodIsCoroutine = methodInfo.ReturnType == typeof(IEnumerator); + if (methodIsCoroutine) + { + buttonEnabled &= (Application.isPlaying ? true : false); + } + + EditorGUI.BeginDisabledGroup(!buttonEnabled); + + if (GUILayout.Button(buttonText)) + { + object[] defaultParams = methodInfo.GetParameters().Select(p => p.DefaultValue).ToArray(); + IEnumerator methodResult = methodInfo.Invoke(target, defaultParams) as IEnumerator; + + if (!Application.isPlaying) + { + // Set target object and scene dirty to serialize changes to disk + EditorUtility.SetDirty(target); + + PrefabStage stage = PrefabStageUtility.GetCurrentPrefabStage(); + if (stage != null) + { + // Prefab mode + EditorSceneManager.MarkSceneDirty(stage.scene); + } + else + { + // Normal scene + EditorSceneManager.MarkSceneDirty(EditorSceneManager.GetActiveScene()); + } + } + else if (methodResult != null && target is MonoBehaviour behaviour) + { + behaviour.StartCoroutine(methodResult); + } + } + + EditorGUI.EndDisabledGroup(); + } + else + { + string warning = typeof(ButtonAttribute).Name + " works only on methods with no parameters"; + HelpBox_Layout(warning, MessageType.Warning, context: target, logToConsole: true); + } + } + + public static void NativeProperty_Layout(UnityEngine.Object target, PropertyInfo property) + { + object value = property.GetValue(target, null); + + if (value == null) + { + string warning = string.Format("{0} is null. {1} doesn't support reference types with null value", property.Name, typeof(ShowNativePropertyAttribute).Name); + HelpBox_Layout(warning, MessageType.Warning, context: target); + } + else if (!Field_Layout(value, property.Name)) + { + string warning = string.Format("{0} doesn't support {1} types", typeof(ShowNativePropertyAttribute).Name, property.PropertyType.Name); + HelpBox_Layout(warning, MessageType.Warning, context: target); + } + } + + public static void NonSerializedField_Layout(UnityEngine.Object target, FieldInfo field) + { + object value = field.GetValue(target); + + if (value == null) + { + string warning = string.Format("{0} is null. {1} doesn't support reference types with null value", field.Name, typeof(ShowNonSerializedFieldAttribute).Name); + HelpBox_Layout(warning, MessageType.Warning, context: target); + } + else if (!Field_Layout(value, field.Name)) + { + string warning = string.Format("{0} doesn't support {1} types", typeof(ShowNonSerializedFieldAttribute).Name, field.FieldType.Name); + HelpBox_Layout(warning, MessageType.Warning, context: target); + } + } + + public static void HorizontalLine(Rect rect, float height, Color color) + { + rect.height = height; + EditorGUI.DrawRect(rect, color); + } + + public static void HelpBox(Rect rect, string message, MessageType type, UnityEngine.Object context = null, bool logToConsole = false) + { + EditorGUI.HelpBox(rect, message, type); + + if (logToConsole) + { + DebugLogMessage(message, type, context); + } + } + + public static void HelpBox_Layout(string message, MessageType type, UnityEngine.Object context = null, bool logToConsole = false) + { + EditorGUILayout.HelpBox(message, type); + + if (logToConsole) + { + DebugLogMessage(message, type, context); + } + } + + public static bool Field_Layout(object value, string label) + { + GUI.enabled = false; + + bool isDrawn = true; + Type valueType = value.GetType(); + + if (valueType == typeof(bool)) + { + EditorGUILayout.Toggle(label, (bool)value); + } + else if (valueType == typeof(int)) + { + EditorGUILayout.IntField(label, (int)value); + } + else if (valueType == typeof(long)) + { + EditorGUILayout.LongField(label, (long)value); + } + else if (valueType == typeof(float)) + { + EditorGUILayout.FloatField(label, (float)value); + } + else if (valueType == typeof(double)) + { + EditorGUILayout.DoubleField(label, (double)value); + } + else if (valueType == typeof(string)) + { + EditorGUILayout.TextField(label, (string)value); + } + else if (valueType == typeof(Vector2)) + { + EditorGUILayout.Vector2Field(label, (Vector2)value); + } + else if (valueType == typeof(Vector3)) + { + EditorGUILayout.Vector3Field(label, (Vector3)value); + } + else if (valueType == typeof(Vector4)) + { + EditorGUILayout.Vector4Field(label, (Vector4)value); + } + else if (valueType == typeof(Color)) + { + EditorGUILayout.ColorField(label, (Color)value); + } + else if (valueType == typeof(Bounds)) + { + EditorGUILayout.BoundsField(label, (Bounds)value); + } + else if (valueType == typeof(Rect)) + { + EditorGUILayout.RectField(label, (Rect)value); + } + else if (typeof(UnityEngine.Object).IsAssignableFrom(valueType)) + { + EditorGUILayout.ObjectField(label, (UnityEngine.Object)value, valueType, true); + } + else if (valueType.BaseType == typeof(Enum)) + { + EditorGUILayout.EnumPopup(label, (Enum)value); + } + else + { + isDrawn = false; + } + + GUI.enabled = true; + + return isDrawn; + } + + private static void DebugLogMessage(string message, MessageType type, UnityEngine.Object context) + { + switch (type) + { + case MessageType.None: + case MessageType.Info: + Debug.Log(message, context); + break; + case MessageType.Warning: + Debug.LogWarning(message, context); + break; + case MessageType.Error: + Debug.LogError(message, context); + break; + } + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Editor/Utility/NaughtyEditorGUI.cs.meta b/Assets/NaughtyAttributes/Scripts/Editor/Utility/NaughtyEditorGUI.cs.meta new file mode 100644 index 0000000..782824e --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/Utility/NaughtyEditorGUI.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: 6ff27ff7705d6064e935bb2159a1b453 +timeCreated: 1510926159 +licenseType: Store +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/Utility/PropertyUtility.cs b/Assets/NaughtyAttributes/Scripts/Editor/Utility/PropertyUtility.cs new file mode 100644 index 0000000..3c5c44b --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/Utility/PropertyUtility.cs @@ -0,0 +1,288 @@ +using UnityEditor; +using System.Reflection; +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace NaughtyAttributes.Editor +{ + public static class PropertyUtility + { + public static T GetAttribute(SerializedProperty property) where T : class + { + T[] attributes = GetAttributes(property); + return (attributes.Length > 0) ? attributes[0] : null; + } + + public static T[] GetAttributes(SerializedProperty property) where T : class + { + FieldInfo fieldInfo = ReflectionUtility.GetField(GetTargetObjectWithProperty(property), property.name); + if (fieldInfo == null) + { + return new T[] { }; + } + + return (T[])fieldInfo.GetCustomAttributes(typeof(T), true); + } + + public static string GetLabel(SerializedProperty property) + { + LabelAttribute labelAttribute = GetAttribute(property); + return (labelAttribute == null) + ? property.displayName + : labelAttribute.Label; + } + + public static void CallOnValueChangedCallbacks(SerializedProperty property) + { + OnValueChangedAttribute[] onValueChangedAttributes = GetAttributes(property); + if (onValueChangedAttributes.Length == 0) + { + return; + } + + object target = GetTargetObjectWithProperty(property); + property.serializedObject.ApplyModifiedProperties(); // We must apply modifications so that the new value is updated in the serialized object + + foreach (var onValueChangedAttribute in onValueChangedAttributes) + { + MethodInfo callbackMethod = ReflectionUtility.GetMethod(target, onValueChangedAttribute.CallbackName); + if (callbackMethod != null && + callbackMethod.ReturnType == typeof(void) && + callbackMethod.GetParameters().Length == 0) + { + callbackMethod.Invoke(target, new object[] { }); + } + else + { + string warning = string.Format( + "{0} can invoke only methods with 'void' return type and 0 parameters", + onValueChangedAttribute.GetType().Name); + + Debug.LogWarning(warning, property.serializedObject.targetObject); + } + } + } + + public static bool IsEnabled(SerializedProperty property) + { + EnableIfAttributeBase enableIfAttribute = GetAttribute(property); + if (enableIfAttribute == null) + { + return true; + } + + object target = GetTargetObjectWithProperty(property); + + List conditionValues = GetConditionValues(target, enableIfAttribute.Conditions); + if (conditionValues.Count > 0) + { + bool enabled = GetConditionsFlag(conditionValues, enableIfAttribute.ConditionOperator, enableIfAttribute.Inverted); + return enabled; + } + else + { + string message = enableIfAttribute.GetType().Name + " needs a valid boolean condition field, property or method name to work"; + Debug.LogWarning(message, property.serializedObject.targetObject); + + return false; + } + } + + public static bool IsVisible(SerializedProperty property) + { + ShowIfAttributeBase showIfAttribute = GetAttribute(property); + if (showIfAttribute == null) + { + return true; + } + + object target = GetTargetObjectWithProperty(property); + + List conditionValues = GetConditionValues(target, showIfAttribute.Conditions); + if (conditionValues.Count > 0) + { + bool enabled = GetConditionsFlag(conditionValues, showIfAttribute.ConditionOperator, showIfAttribute.Inverted); + return enabled; + } + else + { + string message = showIfAttribute.GetType().Name + " needs a valid boolean condition field, property or method name to work"; + Debug.LogWarning(message, property.serializedObject.targetObject); + + return false; + } + } + + internal static List GetConditionValues(object target, string[] conditions) + { + List conditionValues = new List(); + foreach (var condition in conditions) + { + FieldInfo conditionField = ReflectionUtility.GetField(target, condition); + if (conditionField != null && + conditionField.FieldType == typeof(bool)) + { + conditionValues.Add((bool)conditionField.GetValue(target)); + } + + PropertyInfo conditionProperty = ReflectionUtility.GetProperty(target, condition); + if (conditionProperty != null && + conditionProperty.PropertyType == typeof(bool)) + { + conditionValues.Add((bool)conditionProperty.GetValue(target)); + } + + MethodInfo conditionMethod = ReflectionUtility.GetMethod(target, condition); + if (conditionMethod != null && + conditionMethod.ReturnType == typeof(bool) && + conditionMethod.GetParameters().Length == 0) + { + conditionValues.Add((bool)conditionMethod.Invoke(target, null)); + } + } + + return conditionValues; + } + + internal static bool GetConditionsFlag(List conditionValues, EConditionOperator conditionOperator, bool invert) + { + bool flag; + if (conditionOperator == EConditionOperator.And) + { + flag = true; + foreach (var value in conditionValues) + { + flag = flag && value; + } + } + else + { + flag = false; + foreach (var value in conditionValues) + { + flag = flag || value; + } + } + + if (invert) + { + flag = !flag; + } + + return flag; + } + + /// + /// Gets the object the property represents. + /// + /// + /// + public static object GetTargetObjectOfProperty(SerializedProperty property) + { + if (property == null) + { + return null; + } + + string path = property.propertyPath.Replace(".Array.data[", "["); + object obj = property.serializedObject.targetObject; + string[] elements = path.Split('.'); + + foreach (var element in elements) + { + if (element.Contains("[")) + { + string elementName = element.Substring(0, element.IndexOf("[")); + int index = Convert.ToInt32(element.Substring(element.IndexOf("[")).Replace("[", "").Replace("]", "")); + obj = GetValue_Imp(obj, elementName, index); + } + else + { + obj = GetValue_Imp(obj, element); + } + } + + return obj; + } + + /// + /// Gets the object that the property is a member of + /// + /// + /// + public static object GetTargetObjectWithProperty(SerializedProperty property) + { + string path = property.propertyPath.Replace(".Array.data[", "["); + object obj = property.serializedObject.targetObject; + string[] elements = path.Split('.'); + + for (int i = 0; i < elements.Length - 1; i++) + { + string element = elements[i]; + if (element.Contains("[")) + { + string elementName = element.Substring(0, element.IndexOf("[")); + int index = Convert.ToInt32(element.Substring(element.IndexOf("[")).Replace("[", "").Replace("]", "")); + obj = GetValue_Imp(obj, elementName, index); + } + else + { + obj = GetValue_Imp(obj, element); + } + } + + return obj; + } + + private static object GetValue_Imp(object source, string name) + { + if (source == null) + { + return null; + } + + Type type = source.GetType(); + + while (type != null) + { + FieldInfo field = type.GetField(name, BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance); + if (field != null) + { + return field.GetValue(source); + } + + PropertyInfo property = type.GetProperty(name, BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase); + if (property != null) + { + return property.GetValue(source, null); + } + + type = type.BaseType; + } + + return null; + } + + private static object GetValue_Imp(object source, string name, int index) + { + IEnumerable enumerable = GetValue_Imp(source, name) as IEnumerable; + if (enumerable == null) + { + return null; + } + + IEnumerator enumerator = enumerable.GetEnumerator(); + for (int i = 0; i <= index; i++) + { + if (!enumerator.MoveNext()) + { + return null; + } + } + + return enumerator.Current; + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Editor/Utility/PropertyUtility.cs.meta b/Assets/NaughtyAttributes/Scripts/Editor/Utility/PropertyUtility.cs.meta new file mode 100644 index 0000000..dce67c6 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/Utility/PropertyUtility.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 312eedcb79c7a5542b87c0b848e3e2fa +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Editor/Utility/ReflectionUtility.cs b/Assets/NaughtyAttributes/Scripts/Editor/Utility/ReflectionUtility.cs new file mode 100644 index 0000000..33fe958 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/Utility/ReflectionUtility.cs @@ -0,0 +1,84 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; + +namespace NaughtyAttributes.Editor +{ + public static class ReflectionUtility + { + public static IEnumerable GetAllFields(object target, Func predicate) + { + List types = new List() + { + target.GetType() + }; + + while (types.Last().BaseType != null) + { + types.Add(types.Last().BaseType); + } + + for (int i = types.Count - 1; i >= 0; i--) + { + IEnumerable fieldInfos = types[i] + .GetFields(BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.DeclaredOnly) + .Where(predicate); + + foreach (var fieldInfo in fieldInfos) + { + yield return fieldInfo; + } + } + } + + public static IEnumerable GetAllProperties(object target, Func predicate) + { + List types = new List() + { + target.GetType() + }; + + while (types.Last().BaseType != null) + { + types.Add(types.Last().BaseType); + } + + for (int i = types.Count - 1; i >= 0; i--) + { + IEnumerable propertyInfos = types[i] + .GetProperties(BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.DeclaredOnly) + .Where(predicate); + + foreach (var propertyInfo in propertyInfos) + { + yield return propertyInfo; + } + } + } + + public static IEnumerable GetAllMethods(object target, Func predicate) + { + IEnumerable methodInfos = target.GetType() + .GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public) + .Where(predicate); + + return methodInfos; + } + + public static FieldInfo GetField(object target, string fieldName) + { + return GetAllFields(target, f => f.Name.Equals(fieldName, StringComparison.InvariantCulture)).FirstOrDefault(); + } + + public static PropertyInfo GetProperty(object target, string propertyName) + { + return GetAllProperties(target, p => p.Name.Equals(propertyName, StringComparison.InvariantCulture)).FirstOrDefault(); + } + + public static MethodInfo GetMethod(object target, string methodName) + { + return GetAllMethods(target, m => m.Name.Equals(methodName, StringComparison.InvariantCulture)).FirstOrDefault(); + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Editor/Utility/ReflectionUtility.cs.meta b/Assets/NaughtyAttributes/Scripts/Editor/Utility/ReflectionUtility.cs.meta new file mode 100644 index 0000000..fc01215 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Editor/Utility/ReflectionUtility.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: 1d86c581f02a55f458e36bf7e81e3084 +timeCreated: 1520258793 +licenseType: Store +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Test.meta b/Assets/NaughtyAttributes/Scripts/Test.meta new file mode 100644 index 0000000..6eca4f6 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ce2bd76b5676a434bb8a84254f67f1dc +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Test/BoxGroupTest.cs b/Assets/NaughtyAttributes/Scripts/Test/BoxGroupTest.cs new file mode 100644 index 0000000..80a1109 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/BoxGroupTest.cs @@ -0,0 +1,32 @@ +using UnityEngine; + +namespace NaughtyAttributes.Test +{ + public class BoxGroupTest : MonoBehaviour + { + [BoxGroup("Integers")] + public int int0; + [BoxGroup("Integers")] + public int int1; + + [BoxGroup("Floats")] + public float float0; + [BoxGroup("Floats")] + public float float1; + + [BoxGroup("Sliders")] + [MinMaxSlider(0, 1)] + public Vector2 slider0; + [BoxGroup("Sliders")] + [MinMaxSlider(0, 1)] + public Vector2 slider1; + + public string str0; + public string str1; + + [BoxGroup] + public Transform trans0; + [BoxGroup] + public Transform trans1; + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Test/BoxGroupTest.cs.meta b/Assets/NaughtyAttributes/Scripts/Test/BoxGroupTest.cs.meta new file mode 100644 index 0000000..0c5ee54 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/BoxGroupTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3920f5ea384951b4990e4d9e8032d12e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Test/ButtonTest.cs b/Assets/NaughtyAttributes/Scripts/Test/ButtonTest.cs new file mode 100644 index 0000000..e69c892 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/ButtonTest.cs @@ -0,0 +1,39 @@ +using System.Collections; +using UnityEngine; + +namespace NaughtyAttributes.Test +{ + public class ButtonTest : MonoBehaviour + { + public int myInt; + + [Button(enabledMode: EButtonEnableMode.Always)] + private void IncrementMyInt() + { + myInt++; + } + + [Button("Decrement My Int", EButtonEnableMode.Editor)] + private void DecrementMyInt() + { + myInt--; + } + + [Button(enabledMode: EButtonEnableMode.Playmode)] + private void LogMyInt(string prefix = "MyInt = ") + { + Debug.Log(prefix + myInt); + } + + [Button("StartCoroutine")] + private IEnumerator IncrementMyIntCoroutine() + { + int seconds = 5; + for (int i = 0; i < seconds; i++) + { + myInt++; + yield return new WaitForSeconds(1.0f); + } + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Test/ButtonTest.cs.meta b/Assets/NaughtyAttributes/Scripts/Test/ButtonTest.cs.meta new file mode 100644 index 0000000..1d7d58f --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/ButtonTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b592f12a9f69ac3408f6f870762232c7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Test/CurveRangeTest.cs b/Assets/NaughtyAttributes/Scripts/Test/CurveRangeTest.cs new file mode 100644 index 0000000..ba65e68 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/CurveRangeTest.cs @@ -0,0 +1,32 @@ +using UnityEngine; +using NaughtyAttributes; + +public class CurveRangeTest : MonoBehaviour +{ + [CurveRange(-1, -1, 1, 1, EColor.Red)] + public AnimationCurve curve; + + [CurveRange(EColor.Orange)] + public AnimationCurve curve1; + + [CurveRange(0, 0, 10, 10)] + public AnimationCurve curve2; + + public CurveRangeNest1 nest1; + + [System.Serializable] + public class CurveRangeNest1 + { + [CurveRange(0, 0, 1, 1, EColor.Green)] + public AnimationCurve curve; + + public CurveRangeNest2 nest2; + } + + [System.Serializable] + public class CurveRangeNest2 + { + [CurveRange(0, 0, 5, 5, EColor.Blue)] + public AnimationCurve curve; + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Test/CurveRangeTest.cs.meta b/Assets/NaughtyAttributes/Scripts/Test/CurveRangeTest.cs.meta new file mode 100644 index 0000000..e43f8f0 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/CurveRangeTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6587b100d001e7e46b9aaae7f1180b40 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Test/DisableIfTest.cs b/Assets/NaughtyAttributes/Scripts/Test/DisableIfTest.cs new file mode 100644 index 0000000..e997eaf --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/DisableIfTest.cs @@ -0,0 +1,56 @@ +using UnityEngine; + +namespace NaughtyAttributes.Test +{ + public class DisableIfTest : MonoBehaviour + { + public bool disable1; + public bool disable2; + + [DisableIf(EConditionOperator.And, "disable1", "disable2")] + [ReorderableList] + public int[] disableIfAll; + + [DisableIf(EConditionOperator.Or, "disable1", "disable2")] + [ReorderableList] + public int[] disableIfAny; + + public DisableIfNest1 nest1; + } + + [System.Serializable] + public class DisableIfNest1 + { + public bool disable1; + public bool disable2; + public bool Disable1 { get { return disable1; } } + public bool Disable2 { get { return disable2; } } + + [DisableIf(EConditionOperator.And, "Disable1", "Disable2")] + [AllowNesting] // Because it's nested we need to explicitly allow nesting + public int disableIfAll = 1; + + [DisableIf(EConditionOperator.Or, "Disable1", "Disable2")] + [AllowNesting] // Because it's nested we need to explicitly allow nesting + public int disableIfAny = 2; + + public DisableIfNest2 nest2; + } + + [System.Serializable] + public class DisableIfNest2 + { + public bool disable1; + public bool disable2; + public bool GetDisable1() { return disable1; } + public bool GetDisable2() { return disable2; } + + [DisableIf(EConditionOperator.And, "GetDisable1", "GetDisable2")] + [MinMaxSlider(0.0f, 1.0f)] // AllowNesting attribute is not needed, because the field is already marked with a custom naughty property drawer + public Vector2 enableIfAll = new Vector2(0.25f, 0.75f); + + [DisableIf(EConditionOperator.Or, "GetDisable1", "GetDisable2")] + [MinMaxSlider(0.0f, 1.0f)] // AllowNesting attribute is not needed, because the field is already marked with a custom naughty property drawer + public Vector2 enableIfAny = new Vector2(0.25f, 0.75f); + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Test/DisableIfTest.cs.meta b/Assets/NaughtyAttributes/Scripts/Test/DisableIfTest.cs.meta new file mode 100644 index 0000000..c3a1e7a --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/DisableIfTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0e48a088cb96287448c3be58932bfcb7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Test/DropdownTest.cs b/Assets/NaughtyAttributes/Scripts/Test/DropdownTest.cs new file mode 100644 index 0000000..83a24e4 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/DropdownTest.cs @@ -0,0 +1,45 @@ +using UnityEngine; +using System.Collections.Generic; + +namespace NaughtyAttributes.Test +{ + public class DropdownTest : MonoBehaviour + { + [Dropdown("intValues")] + public int intValue; + +#pragma warning disable 414 + private int[] intValues = new int[] { 1, 2, 3 }; +#pragma warning restore 414 + + public DropdownNest1 nest1; + } + + [System.Serializable] + public class DropdownNest1 + { + [Dropdown("StringValues")] + public string stringValue; + + private List StringValues { get { return new List() { "A", "B", "C" }; } } + + public DropdownNest2 nest2; + } + + [System.Serializable] + public class DropdownNest2 + { + [Dropdown("GetVectorValues")] + public Vector3 vectorValue; + + private DropdownList GetVectorValues() + { + return new DropdownList() + { + { "Right", Vector3.right }, + { "Up", Vector3.up }, + { "Forward", Vector3.forward } + }; + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Test/DropdownTest.cs.meta b/Assets/NaughtyAttributes/Scripts/Test/DropdownTest.cs.meta new file mode 100644 index 0000000..ec7fa24 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/DropdownTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3855e37cd6b01194e8166573c7c4b37d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Test/EnableIfTest.cs b/Assets/NaughtyAttributes/Scripts/Test/EnableIfTest.cs new file mode 100644 index 0000000..c3c67ec --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/EnableIfTest.cs @@ -0,0 +1,56 @@ +using UnityEngine; + +namespace NaughtyAttributes.Test +{ + public class EnableIfTest : MonoBehaviour + { + public bool enable1; + public bool enable2; + + [EnableIf(EConditionOperator.And, "enable1", "enable2")] + [ReorderableList] + public int[] enableIfAll; + + [EnableIf(EConditionOperator.Or, "enable1", "enable2")] + [ReorderableList] + public int[] enableIfAny; + + public EnableIfNest1 nest1; + } + + [System.Serializable] + public class EnableIfNest1 + { + public bool enable1; + public bool enable2; + public bool Enable1 { get { return enable1; } } + public bool Enable2 { get { return enable2; } } + + [EnableIf(EConditionOperator.And, "Enable1", "Enable2")] + [AllowNesting] // Because it's nested we need to explicitly allow nesting + public int enableIfAll; + + [EnableIf(EConditionOperator.Or, "Enable1", "Enable2")] + [AllowNesting] // Because it's nested we need to explicitly allow nesting + public int enableIfAny; + + public EnableIfNest2 nest2; + } + + [System.Serializable] + public class EnableIfNest2 + { + public bool enable1; + public bool enable2; + public bool GetEnable1() { return enable1; } + public bool GetEnable2() { return enable2; } + + [EnableIf(EConditionOperator.And, "GetEnable1", "GetEnable2")] + [MinMaxSlider(0.0f, 1.0f)] // AllowNesting attribute is not needed, because the field is already marked with a custom naughty property drawer + public Vector2 enableIfAll = new Vector2(0.25f, 0.75f); + + [EnableIf(EConditionOperator.Or, "GetEnable1", "GetEnable2")] + [MinMaxSlider(0.0f, 1.0f)] // AllowNesting attribute is not needed, because the field is already marked with a custom naughty property drawer + public Vector2 enableIfAny = new Vector2(0.25f, 0.75f); + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Test/EnableIfTest.cs.meta b/Assets/NaughtyAttributes/Scripts/Test/EnableIfTest.cs.meta new file mode 100644 index 0000000..c22fe7b --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/EnableIfTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: bed506d8be3a10f45bec4bf2237bec87 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Test/EnumFlagsTest.cs b/Assets/NaughtyAttributes/Scripts/Test/EnumFlagsTest.cs new file mode 100644 index 0000000..bb3a098 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/EnumFlagsTest.cs @@ -0,0 +1,39 @@ +using UnityEngine; + +namespace NaughtyAttributes.Test +{ + public enum TestEnum + { + None = 0, + B = 1 << 0, + C = 1 << 1, + D = 1 << 2, + E = 1 << 3, + F = 1 << 4, + All = ~0 + } + + public class EnumFlagsTest : MonoBehaviour + { + [EnumFlags] + public TestEnum flags0; + + public EnumFlagsNest1 nest1; + } + + [System.Serializable] + public class EnumFlagsNest1 + { + [EnumFlags] + public TestEnum flags1; + + public EnumFlagsNest2 nest2; + } + + [System.Serializable] + public class EnumFlagsNest2 + { + [EnumFlags] + public TestEnum flags2; + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Test/EnumFlagsTest.cs.meta b/Assets/NaughtyAttributes/Scripts/Test/EnumFlagsTest.cs.meta new file mode 100644 index 0000000..b548675 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/EnumFlagsTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7b7f6b84ce0d7674d8a386fde729279c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Test/HideIfTest.cs b/Assets/NaughtyAttributes/Scripts/Test/HideIfTest.cs new file mode 100644 index 0000000..319c6f5 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/HideIfTest.cs @@ -0,0 +1,56 @@ +using UnityEngine; + +namespace NaughtyAttributes.Test +{ + public class HideIfTest : MonoBehaviour + { + public bool hide1; + public bool hide2; + + [HideIf(EConditionOperator.And, "hide1", "hide2")] + [ReorderableList] + public int[] hideIfAll; + + [HideIf(EConditionOperator.Or, "hide1", "hide2")] + [ReorderableList] + public int[] hideIfAny; + + public HideIfNest1 nest1; + } + + [System.Serializable] + public class HideIfNest1 + { + public bool hide1; + public bool hide2; + public bool Hide1 { get { return hide1; } } + public bool Hide2 { get { return hide2; } } + + [HideIf(EConditionOperator.And, "Hide1", "Hide2")] + [AllowNesting] // Because it's nested we need to explicitly allow nesting + public int hideIfAll; + + [HideIf(EConditionOperator.Or, "Hide1", "Hide2")] + [AllowNesting] // Because it's nested we need to explicitly allow nesting + public int hideIfAny; + + public HideIfNest2 nest2; + } + + [System.Serializable] + public class HideIfNest2 + { + public bool hide1; + public bool hide2; + public bool GetHide1() { return hide1; } + public bool GetHide2() { return hide2; } + + [HideIf(EConditionOperator.And, "GetHide1", "GetHide2")] + [MinMaxSlider(0.0f, 1.0f)] // AllowNesting attribute is not needed, because the field is already marked with a custom naughty property drawer + public Vector2 hideIfAll = new Vector2(0.25f, 0.75f); + + [HideIf(EConditionOperator.Or, "GetHide1", "GetHide2")] + [MinMaxSlider(0.0f, 1.0f)] // AllowNesting attribute is not needed, because the field is already marked with a custom naughty property drawer + public Vector2 hideIfAny = new Vector2(0.25f, 0.75f); + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Test/HideIfTest.cs.meta b/Assets/NaughtyAttributes/Scripts/Test/HideIfTest.cs.meta new file mode 100644 index 0000000..6115ad2 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/HideIfTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3cf166cb519e666419bb79b0c50c5ee1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Test/HorizontalLineTest.cs b/Assets/NaughtyAttributes/Scripts/Test/HorizontalLineTest.cs new file mode 100644 index 0000000..f017da5 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/HorizontalLineTest.cs @@ -0,0 +1,51 @@ +using UnityEngine; + +namespace NaughtyAttributes.Test +{ + public class HorizontalLineTest : MonoBehaviour + { + [HorizontalLine(color: EColor.Black)] + [Header("Black")] + [HorizontalLine(color: EColor.Blue)] + [Header("Blue")] + [HorizontalLine(color: EColor.Gray)] + [Header("Gray")] + [HorizontalLine(color: EColor.Green)] + [Header("Green")] + [HorizontalLine(color: EColor.Indigo)] + [Header("Indigo")] + [HorizontalLine(color: EColor.Orange)] + [Header("Orange")] + [HorizontalLine(color: EColor.Pink)] + [Header("Pink")] + [HorizontalLine(color: EColor.Red)] + [Header("Red")] + [HorizontalLine(color: EColor.Violet)] + [Header("Violet")] + [HorizontalLine(color: EColor.White)] + [Header("White")] + [HorizontalLine(color: EColor.Yellow)] + [Header("Yellow")] + [HorizontalLine(10.0f)] + [Header("Thick")] + public int line0; + + public HorizontalLineNest1 nest1; + } + + [System.Serializable] + public class HorizontalLineNest1 + { + [HorizontalLine] + public int line1; + + public HorizontalLineNest2 nest2; + } + + [System.Serializable] + public class HorizontalLineNest2 + { + [HorizontalLine] + public int line2; + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Test/HorizontalLineTest.cs.meta b/Assets/NaughtyAttributes/Scripts/Test/HorizontalLineTest.cs.meta new file mode 100644 index 0000000..4d7ff37 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/HorizontalLineTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5cc6d3f8d4a53374887b3d620a6972e3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Test/InfoBoxTest.cs b/Assets/NaughtyAttributes/Scripts/Test/InfoBoxTest.cs new file mode 100644 index 0000000..4f72651 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/InfoBoxTest.cs @@ -0,0 +1,28 @@ +using UnityEngine; + +namespace NaughtyAttributes.Test +{ + public class InfoBoxTest : MonoBehaviour + { + [InfoBox("Normal", EInfoBoxType.Normal)] + public int normal; + + public InfoBoxNest1 nest1; + } + + [System.Serializable] + public class InfoBoxNest1 + { + [InfoBox("Warning", EInfoBoxType.Warning)] + public int warning; + + public InfoBoxNest2 nest2; + } + + [System.Serializable] + public class InfoBoxNest2 + { + [InfoBox("Error", EInfoBoxType.Error)] + public int error; + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Test/InfoBoxTest.cs.meta b/Assets/NaughtyAttributes/Scripts/Test/InfoBoxTest.cs.meta new file mode 100644 index 0000000..68dc824 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/InfoBoxTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0dcb08e489c17644e9eacaa1ec5fe781 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Test/InputAxisTest.cs b/Assets/NaughtyAttributes/Scripts/Test/InputAxisTest.cs new file mode 100644 index 0000000..667d2f2 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/InputAxisTest.cs @@ -0,0 +1,34 @@ +using UnityEngine; + +namespace NaughtyAttributes.Test +{ + public class InputAxisTest : MonoBehaviour + { + [InputAxis] + public string inputAxis0; + + public InputAxisNest1 nest1; + + [Button] + private void LogInputAxis0() + { + Debug.Log(inputAxis0); + } + } + + [System.Serializable] + public class InputAxisNest1 + { + [InputAxis] + public string inputAxis1; + + public InputAxisNest2 nest2; + } + + [System.Serializable] + public struct InputAxisNest2 + { + [InputAxis] + public string inputAxis2; + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Test/InputAxisTest.cs.meta b/Assets/NaughtyAttributes/Scripts/Test/InputAxisTest.cs.meta new file mode 100644 index 0000000..b44a862 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/InputAxisTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e0cc8a31c22090847b75538c0ed2d2fc +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Test/LabelTest.cs b/Assets/NaughtyAttributes/Scripts/Test/LabelTest.cs new file mode 100644 index 0000000..dbe61d5 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/LabelTest.cs @@ -0,0 +1,30 @@ +using UnityEngine; + +namespace NaughtyAttributes.Test +{ + public class LabelTest : MonoBehaviour + { + [Label("Label 0")] + public int int0; + + public LabelNest1 nest1; + } + + [System.Serializable] + public class LabelNest1 + { + [Label("Label 1")] + [AllowNesting] // Because it's nested we need to explicitly allow nesting + public int int1; + + public LabelNest2 nest2; + } + + [System.Serializable] + public class LabelNest2 + { + [Label("Label 2")] + [MinMaxSlider(0.0f, 1.0f)] // AllowNesting attribute is not needed, because the field is already marked with a custom naughty property drawer + public Vector2 vector2; + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Test/LabelTest.cs.meta b/Assets/NaughtyAttributes/Scripts/Test/LabelTest.cs.meta new file mode 100644 index 0000000..114af72 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/LabelTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7488af014527ebf42af5c4fc4d5f4f5b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Test/MinMaxSliderTest.cs b/Assets/NaughtyAttributes/Scripts/Test/MinMaxSliderTest.cs new file mode 100644 index 0000000..25abaa3 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/MinMaxSliderTest.cs @@ -0,0 +1,28 @@ +using UnityEngine; + +namespace NaughtyAttributes.Test +{ + public class MinMaxSliderTest : MonoBehaviour + { + [MinMaxSlider(0.0f, 1.0f)] + public Vector2 minMaxSlider0 = new Vector2(0.25f, 0.75f); + + public MinMaxSliderNest1 nest1; + } + + [System.Serializable] + public class MinMaxSliderNest1 + { + [MinMaxSlider(0.0f, 1.0f)] + public Vector2 minMaxSlider1 = new Vector2(0.25f, 0.75f); + + public MinMaxSliderNest2 nest2; + } + + [System.Serializable] + public class MinMaxSliderNest2 + { + [MinMaxSlider(0.0f, 1.0f)] + public Vector2 minMaxSlider2 = new Vector2(0.25f, 0.75f); + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Test/MinMaxSliderTest.cs.meta b/Assets/NaughtyAttributes/Scripts/Test/MinMaxSliderTest.cs.meta new file mode 100644 index 0000000..7580a81 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/MinMaxSliderTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: fd67fbde6acdd6a44944f12e507067c5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Test/MinMaxValueTest.cs b/Assets/NaughtyAttributes/Scripts/Test/MinMaxValueTest.cs new file mode 100644 index 0000000..01ba28d --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/MinMaxValueTest.cs @@ -0,0 +1,52 @@ +using UnityEngine; + +namespace NaughtyAttributes.Test +{ + public class MinMaxValueTest : MonoBehaviour + { + [MinValue(0)] + public int min0; + + [MaxValue(0)] + public int max0; + + [MinValue(0), MaxValue(1)] + public float range01; + + public MinMaxValueNest1 nest1; + } + + [System.Serializable] + public class MinMaxValueNest1 + { + [MinValue(0)] + [AllowNesting] // Because it's nested we need to explicitly allow nesting + public int min0; + + [MaxValue(0)] + [AllowNesting] // Because it's nested we need to explicitly allow nesting + public int max0; + + [MinValue(0), MaxValue(1)] + [AllowNesting] // Because it's nested we need to explicitly allow nesting + public float range01; + + public MinMaxValueNest2 nest2; + } + + [System.Serializable] + public class MinMaxValueNest2 + { + [MinValue(0)] + [AllowNesting] // Because it's nested we need to explicitly allow nesting + public int min0; + + [MaxValue(0)] + [AllowNesting] // Because it's nested we need to explicitly allow nesting + public int max0; + + [MinValue(0), MaxValue(1)] + [AllowNesting] // Because it's nested we need to explicitly allow nesting + public float range01; + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Test/MinMaxValueTest.cs.meta b/Assets/NaughtyAttributes/Scripts/Test/MinMaxValueTest.cs.meta new file mode 100644 index 0000000..328dee3 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/MinMaxValueTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 450a05787c54e6b4fa88ffe223bcee87 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Test/NaughtyAttributes.Test.asmdef b/Assets/NaughtyAttributes/Scripts/Test/NaughtyAttributes.Test.asmdef new file mode 100644 index 0000000..910f548 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/NaughtyAttributes.Test.asmdef @@ -0,0 +1,14 @@ +{ + "name": "NaughtyAttributes.Test", + "references": [ + "NaughtyAttributes.Core" + ], + "optionalUnityReferences": [], + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [] +} \ No newline at end of file diff --git a/Assets/NaughtyAttributes/Scripts/Test/NaughtyAttributes.Test.asmdef.meta b/Assets/NaughtyAttributes/Scripts/Test/NaughtyAttributes.Test.asmdef.meta new file mode 100644 index 0000000..c3d49e7 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/NaughtyAttributes.Test.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: df1dea26b8503004d92d621e88aa9421 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Test/OnValueChangedTest.cs b/Assets/NaughtyAttributes/Scripts/Test/OnValueChangedTest.cs new file mode 100644 index 0000000..328cd92 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/OnValueChangedTest.cs @@ -0,0 +1,51 @@ +using UnityEngine; + +namespace NaughtyAttributes.Test +{ + public class OnValueChangedTest : MonoBehaviour + { + [OnValueChanged("OnValueChangedMethod1")] + [OnValueChanged("OnValueChangedMethod2")] + public int int0; + + private void OnValueChangedMethod1() + { + Debug.LogFormat("int0: {0}", int0); + } + + private void OnValueChangedMethod2() + { + Debug.LogFormat("int0: {0}", int0); + } + + public OnValueChangedNest1 nest1; + } + + [System.Serializable] + public class OnValueChangedNest1 + { + [OnValueChanged("OnValueChangedMethod")] + [AllowNesting] + public int int1; + + private void OnValueChangedMethod() + { + Debug.LogFormat("int1: {0}", int1); + } + + public OnValueChangedNest2 nest2; + } + + [System.Serializable] + public class OnValueChangedNest2 + { + [OnValueChanged("OnValueChangedMethod")] + [AllowNesting] + public int int2; + + private void OnValueChangedMethod() + { + Debug.LogFormat("int2: {0}", int2); + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Test/OnValueChangedTest.cs.meta b/Assets/NaughtyAttributes/Scripts/Test/OnValueChangedTest.cs.meta new file mode 100644 index 0000000..bfd1ab2 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/OnValueChangedTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ff1df679e5b32f64bb106752c63933fa +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Test/ProgressBarTest.cs b/Assets/NaughtyAttributes/Scripts/Test/ProgressBarTest.cs new file mode 100644 index 0000000..aaeecbd --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/ProgressBarTest.cs @@ -0,0 +1,35 @@ +using UnityEngine; + +namespace NaughtyAttributes.Test +{ + public class ProgressBarTest : MonoBehaviour + { + [Header("Constant ProgressBar")] + [ProgressBar("Health", 100, EColor.Red)] + public float health = 50.0f; + + [Header("Nested ProgressBar")] + public ProgressBarNest1 nest1; + + [Header("Dynamic ProgressBar")] + [ProgressBar("Elixir", "maxElixir", color: EColor.Violet)] + public float elixir = 50.0f; + public float maxElixir = 100.0f; + } + + [System.Serializable] + public class ProgressBarNest1 + { + [ProgressBar("Mana", 100, EColor.Blue)] + public float mana = 25.0f; + + public ProgressBarNest2 nest2; + } + + [System.Serializable] + public class ProgressBarNest2 + { + [ProgressBar("Stamina", 100, EColor.Green)] + public float stamina = 75.0f; + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Test/ProgressBarTest.cs.meta b/Assets/NaughtyAttributes/Scripts/Test/ProgressBarTest.cs.meta new file mode 100644 index 0000000..db88429 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/ProgressBarTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 96ca4c27fc649764b9d1625f1740cb9e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Test/ReadOnlyTest.cs b/Assets/NaughtyAttributes/Scripts/Test/ReadOnlyTest.cs new file mode 100644 index 0000000..1c6f0f5 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/ReadOnlyTest.cs @@ -0,0 +1,28 @@ +using UnityEngine; + +namespace NaughtyAttributes.Test +{ + public class ReadOnlyTest : MonoBehaviour + { + [ReadOnly] + public int readOnlyInt = 5; + + public ReadOnlyNest1 nest1; + } + + [System.Serializable] + public class ReadOnlyNest1 + { + [ReadOnly] + public float readOnlyFloat = 3.14f; + + public ReadOnlyNest2 nest2; + } + + [System.Serializable] + public struct ReadOnlyNest2 + { + [ReadOnly] + public string readOnlyString; + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Test/ReadOnlyTest.cs.meta b/Assets/NaughtyAttributes/Scripts/Test/ReadOnlyTest.cs.meta new file mode 100644 index 0000000..d65c60c --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/ReadOnlyTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5443d37a05e188846bda9b05b067184e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Test/ReorderableListTest.cs b/Assets/NaughtyAttributes/Scripts/Test/ReorderableListTest.cs new file mode 100644 index 0000000..8edb02b --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/ReorderableListTest.cs @@ -0,0 +1,25 @@ +using System.Collections.Generic; +using UnityEngine; + +namespace NaughtyAttributes.Test +{ + public class ReorderableListTest : MonoBehaviour + { + [ReorderableList] + public int[] intArray; + + [ReorderableList] + public List vectorList; + + [ReorderableList] + public List structList; + } + + [System.Serializable] + public struct SomeStruct + { + public int Int; + public float Float; + public Vector3 Vector; + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Test/ReorderableListTest.cs.meta b/Assets/NaughtyAttributes/Scripts/Test/ReorderableListTest.cs.meta new file mode 100644 index 0000000..b993018 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/ReorderableListTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c93fde7cd79390148ac576c3a159a77b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Test/RequiredTest.cs b/Assets/NaughtyAttributes/Scripts/Test/RequiredTest.cs new file mode 100644 index 0000000..1ea1eb6 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/RequiredTest.cs @@ -0,0 +1,30 @@ +using UnityEngine; + +namespace NaughtyAttributes.Test +{ + public class RequiredTest : MonoBehaviour + { + [Required] + public Transform trans0; + + public RequiredNest1 nest1; + } + + [System.Serializable] + public class RequiredNest1 + { + [Required] + [AllowNesting] // Because it's nested we need to explicitly allow nesting + public Transform trans1; + + public RequiredNest2 nest2; + } + + [System.Serializable] + public class RequiredNest2 + { + [Required("trans2 is invalid custom message - hohoho")] + [AllowNesting] // Because it's nested we need to explicitly allow nesting + public Transform trans2; + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Test/RequiredTest.cs.meta b/Assets/NaughtyAttributes/Scripts/Test/RequiredTest.cs.meta new file mode 100644 index 0000000..bc51260 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/RequiredTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9c8c10b2234650d42b2a8efad6b413db +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Test/ResizableTextAreaTest.cs b/Assets/NaughtyAttributes/Scripts/Test/ResizableTextAreaTest.cs new file mode 100644 index 0000000..bf13ce8 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/ResizableTextAreaTest.cs @@ -0,0 +1,28 @@ +using UnityEngine; + +namespace NaughtyAttributes.Test +{ + public class ResizableTextAreaTest : MonoBehaviour + { + [ResizableTextArea] + public string text0; + + public ResizableTextAreaNest1 nest1; + } + + [System.Serializable] + public class ResizableTextAreaNest1 + { + [ResizableTextArea] + public string text1; + + public ResizableTextAreaNest2 nest2; + } + + [System.Serializable] + public class ResizableTextAreaNest2 + { + [ResizableTextArea] + public string text2; + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Test/ResizableTextAreaTest.cs.meta b/Assets/NaughtyAttributes/Scripts/Test/ResizableTextAreaTest.cs.meta new file mode 100644 index 0000000..380566d --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/ResizableTextAreaTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: fb4f4bb2e3e063340a24f4bb24528bb5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Test/SceneTest.cs b/Assets/NaughtyAttributes/Scripts/Test/SceneTest.cs new file mode 100644 index 0000000..0e114eb --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/SceneTest.cs @@ -0,0 +1,28 @@ +using UnityEngine; + +namespace NaughtyAttributes.Test +{ + public class SceneTest : MonoBehaviour + { + [Scene] + public string scene0; + + public SceneNest1 nest1; + } + + [System.Serializable] + public class SceneNest1 + { + [Scene] + public string scene1; + + public SceneNest2 nest2; + } + + [System.Serializable] + public struct SceneNest2 + { + [Scene] + public string scene2; + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Test/SceneTest.cs.meta b/Assets/NaughtyAttributes/Scripts/Test/SceneTest.cs.meta new file mode 100644 index 0000000..3ceca2f --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/SceneTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 281a85803caf74a459439020a0840fa4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Test/ShowAssetPreviewTest.cs b/Assets/NaughtyAttributes/Scripts/Test/ShowAssetPreviewTest.cs new file mode 100644 index 0000000..e9aaf3f --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/ShowAssetPreviewTest.cs @@ -0,0 +1,37 @@ +using UnityEngine; + +namespace NaughtyAttributes.Test +{ + public class ShowAssetPreviewTest : MonoBehaviour + { + [ShowAssetPreview] + public Sprite sprite0; + + [ShowAssetPreview(96, 96)] + public GameObject prefab0; + + public ShowAssetPreviewNest1 nest1; + } + + [System.Serializable] + public class ShowAssetPreviewNest1 + { + [ShowAssetPreview] + public Sprite sprite1; + + [ShowAssetPreview(96, 96)] + public GameObject prefab1; + + public ShowAssetPreviewNest2 nest2; + } + + [System.Serializable] + public class ShowAssetPreviewNest2 + { + [ShowAssetPreview] + public Sprite sprite2; + + [ShowAssetPreview(96, 96)] + public GameObject prefab2; + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Test/ShowAssetPreviewTest.cs.meta b/Assets/NaughtyAttributes/Scripts/Test/ShowAssetPreviewTest.cs.meta new file mode 100644 index 0000000..b636853 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/ShowAssetPreviewTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 705c14aa9ecaa274289972381f471367 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Test/ShowIfTest.cs b/Assets/NaughtyAttributes/Scripts/Test/ShowIfTest.cs new file mode 100644 index 0000000..dc255e5 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/ShowIfTest.cs @@ -0,0 +1,56 @@ +using UnityEngine; + +namespace NaughtyAttributes.Test +{ + public class ShowIfTest : MonoBehaviour + { + public bool show1; + public bool show2; + + [ShowIf(EConditionOperator.And, "show1", "show2")] + [ReorderableList] + public int[] showIfAll; + + [ShowIf(EConditionOperator.Or, "show1", "show2")] + [ReorderableList] + public int[] showIfAny; + + public ShowIfNest1 nest1; + } + + [System.Serializable] + public class ShowIfNest1 + { + public bool show1; + public bool show2; + public bool Show1 { get { return show1; } } + public bool Show2 { get { return show2; } } + + [ShowIf(EConditionOperator.And, "Show1", "Show2")] + [AllowNesting] // Because it's nested we need to explicitly allow nesting + public int showIfAll; + + [ShowIf(EConditionOperator.Or, "Show1", "Show2")] + [AllowNesting] // Because it's nested we need to explicitly allow nesting + public int showIfAny; + + public ShowIfNest2 nest2; + } + + [System.Serializable] + public class ShowIfNest2 + { + public bool show1; + public bool show2; + public bool GetShow1() { return show1; } + public bool GetShow2() { return show2; } + + [ShowIf(EConditionOperator.And, "GetShow1", "GetShow2")] + [MinMaxSlider(0.0f, 1.0f)] // AllowNesting attribute is not needed, because the field is already marked with a custom naughty property drawer + public Vector2 showIfAll = new Vector2(0.25f, 0.75f); + + [ShowIf(EConditionOperator.Or, "GetShow1", "GetShow2")] + [MinMaxSlider(0.0f, 1.0f)] // AllowNesting attribute is not needed, because the field is already marked with a custom naughty property drawer + public Vector2 showIfAny = new Vector2(0.25f, 0.75f); + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Test/ShowIfTest.cs.meta b/Assets/NaughtyAttributes/Scripts/Test/ShowIfTest.cs.meta new file mode 100644 index 0000000..749d05c --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/ShowIfTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4fdbfcfbf5b056a4bac491fe21569572 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Test/ShowNativePropertyTest.cs b/Assets/NaughtyAttributes/Scripts/Test/ShowNativePropertyTest.cs new file mode 100644 index 0000000..d990215 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/ShowNativePropertyTest.cs @@ -0,0 +1,25 @@ +using UnityEngine; + +namespace NaughtyAttributes.Test +{ + public class ShowNativePropertyTest : MonoBehaviour + { + [ShowNativeProperty] + private Transform Transform + { + get + { + return transform; + } + } + + [ShowNativeProperty] + private Transform ParentTransform + { + get + { + return transform.parent; + } + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Test/ShowNativePropertyTest.cs.meta b/Assets/NaughtyAttributes/Scripts/Test/ShowNativePropertyTest.cs.meta new file mode 100644 index 0000000..19f9e31 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/ShowNativePropertyTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b5a73795d25dd334e90a5a347c6079d9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Test/ShowNonSerializedFieldTest.cs b/Assets/NaughtyAttributes/Scripts/Test/ShowNonSerializedFieldTest.cs new file mode 100644 index 0000000..289718a --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/ShowNonSerializedFieldTest.cs @@ -0,0 +1,18 @@ +using UnityEngine; + +namespace NaughtyAttributes.Test +{ + public class ShowNonSerializedFieldTest : MonoBehaviour + { +#pragma warning disable 414 + [ShowNonSerializedField] + private int myInt = 10; + + [ShowNonSerializedField] + private const float PI = 3.14159f; + + [ShowNonSerializedField] + private static readonly Vector3 CONST_VECTOR = Vector3.one; +#pragma warning restore 414 + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Test/ShowNonSerializedFieldTest.cs.meta b/Assets/NaughtyAttributes/Scripts/Test/ShowNonSerializedFieldTest.cs.meta new file mode 100644 index 0000000..404ff1b --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/ShowNonSerializedFieldTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 913d67a695253f744bdc776625b9b948 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Test/TagTest.cs b/Assets/NaughtyAttributes/Scripts/Test/TagTest.cs new file mode 100644 index 0000000..144c856 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/TagTest.cs @@ -0,0 +1,34 @@ +using UnityEngine; + +namespace NaughtyAttributes.Test +{ + public class TagTest : MonoBehaviour + { + [Tag] + public string tag0; + + public TagNest1 nest1; + + [Button] + private void LogTag0() + { + Debug.Log(tag0); + } + } + + [System.Serializable] + public class TagNest1 + { + [Tag] + public string tag1; + + public TagNest2 nest2; + } + + [System.Serializable] + public struct TagNest2 + { + [Tag] + public string tag2; + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Test/TagTest.cs.meta b/Assets/NaughtyAttributes/Scripts/Test/TagTest.cs.meta new file mode 100644 index 0000000..88ea5af --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/TagTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8bcc0d5613b48fb43bd36c9d37e99900 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Test/ValidateInputTest.cs b/Assets/NaughtyAttributes/Scripts/Test/ValidateInputTest.cs new file mode 100644 index 0000000..fcb368a --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/ValidateInputTest.cs @@ -0,0 +1,45 @@ +using UnityEngine; + +namespace NaughtyAttributes.Test +{ + public class ValidateInputTest : MonoBehaviour + { + [ValidateInput("NotZero0", "int0 must not be zero")] + public int int0; + + private bool NotZero0(int value) + { + return value != 0; + } + + public ValidateInputNest1 nest1; + } + + [System.Serializable] + public class ValidateInputNest1 + { + [ValidateInput("NotZero1")] + [AllowNesting] // Because it's nested we need to explicitly allow nesting + public int int1; + + private bool NotZero1(int value) + { + return value != 0; + } + + public ValidateInputNest2 nest2; + } + + [System.Serializable] + public class ValidateInputNest2 + { + [ValidateInput("NotZero2")] + [AllowNesting] // Because it's nested we need to explicitly allow nesting + public int int2; + + private bool NotZero2(int value) + { + return value != 0; + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Test/ValidateInputTest.cs.meta b/Assets/NaughtyAttributes/Scripts/Test/ValidateInputTest.cs.meta new file mode 100644 index 0000000..f57070a --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/ValidateInputTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 94adafcfe59aa344c9b5596b2cc6ecd0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Test/_NaughtyComponent.cs b/Assets/NaughtyAttributes/Scripts/Test/_NaughtyComponent.cs new file mode 100644 index 0000000..a165e93 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/_NaughtyComponent.cs @@ -0,0 +1,19 @@ +using System.Collections.Generic; +using UnityEngine; + +namespace NaughtyAttributes.Test +{ + public class _NaughtyComponent : MonoBehaviour + { + } + + [System.Serializable] + public class MyClass + { + } + + [System.Serializable] + public struct MyStruct + { + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Test/_NaughtyComponent.cs.meta b/Assets/NaughtyAttributes/Scripts/Test/_NaughtyComponent.cs.meta new file mode 100644 index 0000000..10803ee --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/_NaughtyComponent.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: 9c928ea15ae74a44089beb2e534c1a35 +timeCreated: 1507996629 +licenseType: Store +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/Scripts/Test/_NaughtyScriptableObject.cs b/Assets/NaughtyAttributes/Scripts/Test/_NaughtyScriptableObject.cs new file mode 100644 index 0000000..0fba249 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/_NaughtyScriptableObject.cs @@ -0,0 +1,22 @@ +using UnityEngine; + +namespace NaughtyAttributes.Test +{ + //[CreateAssetMenu(fileName = "NaughtyScriptableObject", menuName = "NaughtyAttributes/_NaughtyScriptableObject")] + public class _NaughtyScriptableObject : ScriptableObject + { + public int myInt; + + [Button] + private void IncrementMyInt() + { + myInt++; + } + + [Button("Decrement My Int")] + private void DecrementMyInt() + { + myInt--; + } + } +} diff --git a/Assets/NaughtyAttributes/Scripts/Test/_NaughtyScriptableObject.cs.meta b/Assets/NaughtyAttributes/Scripts/Test/_NaughtyScriptableObject.cs.meta new file mode 100644 index 0000000..6328fa3 --- /dev/null +++ b/Assets/NaughtyAttributes/Scripts/Test/_NaughtyScriptableObject.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: 753bdb918c6038142acddbd7aae6958f +timeCreated: 1518639587 +licenseType: Store +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NaughtyAttributes/package.json b/Assets/NaughtyAttributes/package.json new file mode 100644 index 0000000..f81a395 --- /dev/null +++ b/Assets/NaughtyAttributes/package.json @@ -0,0 +1,17 @@ +{ + "name": "com.dbrizov.naughtyattributes", + "displayName": "NaughtyAttributes", + "version": "2.0.4", + "unity": "2018.3", + "description": "NaughtyAttributes is an extension for the Unity Inspector.", + "keywords": [ "attribute", "inspector", "editor" ], + "category": "editor extensions", + "dependencies": {}, + "samples": [ + { + "displayName": "Demo Scene", + "description": "Demo Scene", + "path": "Samples~/DemoScene" + } + ] +} diff --git a/Assets/NaughtyAttributes/package.json.meta b/Assets/NaughtyAttributes/package.json.meta new file mode 100644 index 0000000..6f1fa82 --- /dev/null +++ b/Assets/NaughtyAttributes/package.json.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: db9a5ca20403b0344ae64015de8f8c86 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NewShaderVariants.shadervariants b/Assets/NewShaderVariants.shadervariants new file mode 100644 index 0000000..d944ce5 --- /dev/null +++ b/Assets/NewShaderVariants.shadervariants @@ -0,0 +1,15 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!200 &20000000 +ShaderVariantCollection: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: NewShaderVariants + m_Shaders: + - first: {fileID: 4800000, guid: 729f2fad675e5e84b8f613cfa1090e3f, type: 3} + second: + variants: + - keywords: INSTANCING_ON + passType: 0 diff --git a/Assets/NewShaderVariants.shadervariants.meta b/Assets/NewShaderVariants.shadervariants.meta new file mode 100644 index 0000000..64bcf5a --- /dev/null +++ b/Assets/NewShaderVariants.shadervariants.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d1adb60b35747124ab7a9c7eb8c4b911 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Path.mat b/Assets/Path.mat new file mode 100644 index 0000000..ba4971d --- /dev/null +++ b/Assets/Path.mat @@ -0,0 +1,94 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Path + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: _EMISSION + m_LightmapFlags: 0 + m_EnableInstancingVariants: 1 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BlendOp: 0 + - _BumpScale: 1 + - _CameraFadingEnabled: 0 + - _CameraFarFadeDistance: 2 + - _CameraNearFadeDistance: 1 + - _Cull: 2 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DistortionBlend: 0.5 + - _DistortionEnabled: 0 + - _DistortionStrength: 1 + - _DistortionStrengthScaled: 0 + - _DstBlend: 0 + - _EmissionEnabled: 0 + - _FlipbookMode: 0 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _LightingEnabled: 1 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SoftParticlesEnabled: 0 + - _SoftParticlesFarFadeDistance: 1 + - _SoftParticlesNearFadeDistance: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _CameraFadeParams: {r: 0, g: Infinity, b: 0, a: 0} + - _Color: {r: 0, g: 1, b: 0.96190476, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + - _SoftParticleFadeParams: {r: 0, g: 0, b: 0, a: 0} diff --git a/Assets/Path.mat.meta b/Assets/Path.mat.meta new file mode 100644 index 0000000..5f74385 --- /dev/null +++ b/Assets/Path.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 525b9c2ebdaac4440b94ea0fa8ca42dd +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Piece.mat b/Assets/Piece.mat new file mode 100644 index 0000000..64e5390 --- /dev/null +++ b/Assets/Piece.mat @@ -0,0 +1,77 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Piece + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 0.2264151, g: 0.2264151, b: 0.2264151, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} diff --git a/Assets/Piece.mat.meta b/Assets/Piece.mat.meta new file mode 100644 index 0000000..2cd2f55 --- /dev/null +++ b/Assets/Piece.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 16daa9ed715d7874db42629f4e3e0eef +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Render.cs b/Assets/Render.cs new file mode 100644 index 0000000..1cb6b3f --- /dev/null +++ b/Assets/Render.cs @@ -0,0 +1,137 @@ +using UnityEngine; +using System; +using System.Collections; +using System.Collections.Generic; +using ExtensionMethods; + +[Serializable] +public class Render +{ + Monolith mono; + + public void Enable(Monolith mono) + { + this.mono = mono; + Camera.onPreCull -= DrawWithCamera; + Camera.onPreCull += DrawWithCamera; + } + + public void Disable() + { + Camera.onPreCull -= DrawWithCamera; + } + + public Mesh meshVoxelDebug, meshPieceDebug; + public Material matVoxelDebug, matPieceDebug, matEnemy, matPath; + + void DrawWithCamera(Camera camera) + { + if (camera) + { + // GL.Clear(true, true, Color.gray); + Draw(camera, camera.transform.localToWorldMatrix * Matrix4x4.TRS(Vector3.forward * 10, Quaternion.identity, Vector3.one)); + } + } + + public Vector3 lerpPos; + void Draw(Camera camera, Matrix4x4 matrix) + { + Voxels(); + + // Draw Enemy + Graphics.DrawMesh(meshPieceDebug, + mono.enemy.pos, + Quaternion.identity, + matEnemy, 0 + ); + + // Draw Piece + lerpPos = Vector3.Lerp(lerpPos, mono.piece.pos, Time.deltaTime * 24); + Graphics.DrawMesh(meshPieceDebug, + lerpPos, + Quaternion.identity, + matPieceDebug, 0 + ); + + // Draw Path...(s) + // lets start constraining the movement to the generated level + // convert to instanced matrices and check for duplicates + // for (int i = 0; i < mono.dirs.Length; i++) + // { + // Paths(i, mono.piece.pos); + // } + + for (int i = 0; i < mono.dirs.Length; i++) + { + if (mono.movePiece && !mono.Outside(mono.piece.pos + mono.dirs[i])) + { + Graphics.DrawMesh(meshPieceDebug, + mono.piece.pos + mono.dirs[i], + Quaternion.identity, + matPath, 0 + ); + } + } + } + + void Paths(int dirIndex, Vector3Int pos, int patternIndex = 0) + { + for (int i = patternIndex; i < mono.piece.pattern.Length; i++) + { + pos += mono.dirs[dirIndex]; + if (mono.Outside(pos)) + { + return; + } + else + { + Graphics.DrawMesh(meshPieceDebug, + pos, + Quaternion.identity, + matPath, 0 + ); + } + + if (i != patternIndex && mono.piece.pattern[i] != 0) + { + int toIndex = dirIndex.Rollover(mono.piece.pattern[i], mono.dirs.Length); + Paths(toIndex, pos, i); + Paths(toIndex.Rollover(2, mono.dirs.Length), pos, i); + Paths(toIndex.Rollover(3, mono.dirs.Length), pos, i); + Paths(toIndex.Rollover(5, mono.dirs.Length), pos, i); + return; + } + } + } + + List voxelM4 = new List(); + void Voxels() + { + voxelM4.Clear(); + for (int i = 0; i < mono.voxels.Length; i++) + { + if (mono.voxels[i] != null) + { + for (int d = 0; d < mono.dirs.Length; d++) + { + if (mono.Outside(mono.voxels[i].pos + mono.dirs[d])) + { + Vector3 renderPos = mono.voxels[i].pos + (Vector3)mono.dirs[d] / 2; + Matrix4x4 m4 = new Matrix4x4(); + m4.SetTRS(renderPos, + Quaternion.LookRotation(renderPos - mono.voxels[i].pos), + Vector3.one + ); + voxelM4.Add(m4); + } + } + } + } + + if (voxelM4.Count > 0) + { + Graphics.DrawMeshInstanced(meshVoxelDebug, 0, matVoxelDebug, voxelM4); + } + + } +} \ No newline at end of file diff --git a/Assets/Render.cs.meta b/Assets/Render.cs.meta new file mode 100644 index 0000000..47326e2 --- /dev/null +++ b/Assets/Render.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 24659522749860f4ea417708ddbd0566 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scenes.meta b/Assets/Scenes.meta new file mode 100644 index 0000000..107a99b --- /dev/null +++ b/Assets/Scenes.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: bc7e9cc9f8f8f254da3266d92fc59cf2 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scenes/Main.unity b/Assets/Scenes/Main.unity new file mode 100644 index 0000000..cd6d87e --- /dev/null +++ b/Assets/Scenes/Main.unity @@ -0,0 +1,422 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 9 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 0 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 705507994} + m_IndirectSpecularColor: {r: 0.44657898, g: 0.4964133, b: 0.5748178, a: 1} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 11 + m_GIWorkflowMode: 0 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 0 + m_LightmapEditorSettings: + serializedVersion: 12 + m_Resolution: 2 + m_BakeResolution: 40 + m_AtlasSize: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_ExtractAmbientOcclusion: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_FinalGather: 0 + m_FinalGatherFiltering: 1 + m_FinalGatherRayCount: 256 + m_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 1 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 500 + m_PVRBounces: 2 + m_PVREnvironmentSampleCount: 500 + m_PVREnvironmentReferencePointCount: 2048 + m_PVRFilteringMode: 2 + m_PVRDenoiserTypeDirect: 0 + m_PVRDenoiserTypeIndirect: 0 + m_PVRDenoiserTypeAO: 0 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVREnvironmentMIS: 0 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_LightProbeSampleCountMultiplier: 4 + m_LightingDataAsset: {fileID: 0} + m_UseShadowmask: 1 +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &344952468 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 344952469} + - component: {fileID: 344952470} + m_Layer: 0 + m_Name: Monolith + m_TagString: Monolith + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &344952469 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 344952468} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 100, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &344952470 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 344952468} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 6fd8fe86f7d15534b899a0bba18bfab1, type: 3} + m_Name: + m_EditorClassIdentifier: + leftWorm: + pos: {x: 1, y: 4, z: 5} + dirIndex: 1 + rightWorm: + pos: {x: 1, y: 2, z: 5} + dirIndex: 4 + piece: + pos: {x: -1, y: 1, z: 4} + pattern: 000000000000000000000000 + enemy: + pos: {x: 0, y: 0, z: 0} + pattern: + voxels: + - pos: {x: -2, y: -2, z: 2} + - pos: {x: -2, y: -1, z: 2} + - pos: {x: -1, y: -1, z: 2} + - pos: {x: -2, y: -1, z: 1} + - pos: {x: -2, y: -1, z: 3} + - pos: {x: -1, y: -1, z: 3} + - pos: {x: -1, y: -2, z: 2} + - pos: {x: -2, y: -2, z: 3} + - pos: {x: -1, y: -2, z: 3} + - pos: {x: -1, y: -1, z: 4} + - pos: {x: 0, y: -1, z: 3} + - pos: {x: 0, y: 0, z: 3} + - pos: {x: 0, y: -1, z: 4} + - pos: {x: 0, y: 0, z: 4} + - pos: {x: -1, y: 0, z: 4} + - pos: {x: 0, y: 1, z: 4} + - pos: {x: 0, y: 1, z: 5} + - pos: {x: -1, y: 1, z: 5} + - pos: {x: -1, y: 1, z: 4} + - pos: {x: 0, y: 1, z: 3} + - pos: {x: -1, y: 1, z: 3} + - pos: {x: 1, y: 1, z: 3} + - pos: {x: -1, y: 2, z: 4} + - pos: {x: 1, y: 2, z: 3} + - pos: {x: 0, y: 2, z: 4} + - pos: {x: 0, y: 2, z: 3} + - pos: {x: 0, y: 3, z: 4} + - pos: {x: -1, y: 3, z: 4} + - pos: {x: 0, y: 3, z: 5} + - pos: {x: 1, y: 3, z: 4} + - pos: {x: 1, y: 3, z: 5} + - pos: {x: -1, y: 3, z: 5} + - pos: {x: 1, y: 2, z: 4} + - pos: {x: 0, y: 2, z: 5} + - pos: {x: 1, y: 4, z: 5} + - pos: {x: 1, y: 2, z: 5} + - pos: {x: 0, y: 0, z: 0} + - pos: {x: -1, y: 0, z: 0} + - pos: {x: -1, y: -1, z: 0} + - pos: {x: -1, y: 0, z: 1} + - pos: {x: -1, y: -1, z: -1} + - pos: {x: -1, y: -1, z: 1} + - pos: {x: 0, y: -1, z: -1} + - pos: {x: 0, y: -1, z: 0} + - pos: {x: -1, y: -2, z: 0} + - pos: {x: -2, y: -2, z: 0} + - pos: {x: -2, y: -2, z: 1} + - pos: {x: -1, y: -2, z: 1} + vIndex: 36 + render: + meshVoxelDebug: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} + meshPieceDebug: {fileID: 8102167970221282723, guid: f17ff0e1c561a0a4bba0f4c3bb139cc4, + type: 3} + matVoxelDebug: {fileID: 2100000, guid: 38b6b77574398c54498e524a886902e7, type: 2} + matPieceDebug: {fileID: 2100000, guid: 16daa9ed715d7874db42629f4e3e0eef, type: 2} + matEnemy: {fileID: 2100000, guid: d9312e72de6721d41975fc093421fc2f, type: 2} + matPath: {fileID: 2100000, guid: 525b9c2ebdaac4440b94ea0fa8ca42dd, type: 2} + lerpPos: {x: -1, y: 1, z: 4} + cam: {fileID: 963194227} + testVel: {x: 0, y: 2.8496501, z: 0} + movePiece: 0 + dirs: + - {x: -1, y: 0, z: 0} + - {x: 0, y: -1, z: 0} + - {x: 0, y: 0, z: -1} + - {x: 1, y: 0, z: 0} + - {x: 0, y: 1, z: 0} + - {x: 0, y: 0, z: 1} +--- !u!1 &705507993 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 705507995} + - component: {fileID: 705507994} + m_Layer: 0 + m_Name: Directional Light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!108 &705507994 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 705507993} + m_Enabled: 1 + serializedVersion: 10 + m_Type: 1 + m_Shape: 0 + m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} + m_Intensity: 1 + m_Range: 10 + m_SpotAngle: 30 + m_InnerSpotAngle: 21.80208 + m_CookieSize: 10 + m_Shadows: + m_Type: 2 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_CullingMatrixOverride: + e00: 1 + e01: 0 + e02: 0 + e03: 0 + e10: 0 + e11: 1 + e12: 0 + e13: 0 + e20: 0 + e21: 0 + e22: 1 + e23: 0 + e30: 0 + e31: 0 + e32: 0 + e33: 1 + m_UseCullingMatrixOverride: 0 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingLayerMask: 1 + m_Lightmapping: 1 + m_LightShadowCasterMode: 0 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_BoundingSphereOverride: {x: 0, y: 1.8189893e-12, z: 0, w: 0} + m_UseBoundingSphereOverride: 0 + m_ShadowRadius: 0 + m_ShadowAngle: 0 +--- !u!4 &705507995 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 705507993} + m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} + m_LocalPosition: {x: 0, y: 3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} +--- !u!1 &963194225 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 963194228} + - component: {fileID: 963194227} + - component: {fileID: 963194226} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!81 &963194226 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 963194225} + m_Enabled: 1 +--- !u!20 &963194227 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 963194225} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 2 + m_BackGroundColor: {r: 0, g: 0, b: 0, a: 0} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_FocalLength: 50 + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 1 + orthographic size: 5 + m_Depth: -1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 1 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &963194228 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 963194225} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: -10} + m_LocalScale: {x: 10, y: 10, z: 10} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} diff --git a/Assets/Scenes/Main.unity.meta b/Assets/Scenes/Main.unity.meta new file mode 100644 index 0000000..952bd1e --- /dev/null +++ b/Assets/Scenes/Main.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 9fc0d4010bbf28b4594072e72b8655ab +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Simulate.cs b/Assets/Simulate.cs new file mode 100644 index 0000000..64d2ac7 --- /dev/null +++ b/Assets/Simulate.cs @@ -0,0 +1,68 @@ +using UnityEngine; +using System; +using Random = UnityEngine.Random; + +public class Simulate +{ + public Generate generate = new Generate(); + + public void Step(Monolith mono) + { + generate.Step(mono); + } +} + +public class Generate +{ + public void Step(Monolith mono) + { + WormStep(mono, mono.leftWorm, mono.rightWorm, 1); + WormStep(mono, mono.rightWorm, mono.leftWorm, -1); + } + + void WormStep(Monolith mono, Worm worm, Worm otherWorm, int stepDir) + { + worm.pos += mono.dirs[worm.dirIndex]; + + if (Random.value > 0.666f) { worm.dirIndex += stepDir; } + else + { + // we want to move closer to the other worm + // cycle through the directions and pick the closest + worm.dirIndex = otherWorm.dirIndex; + Vector3Int delta = otherWorm.pos - worm.pos; + if (delta.sqrMagnitude > 0) + { + // pick the greatest axis + int greatest = 0; + for (int i = 0; i < 3; i++) + { + if (Mathf.Abs(delta[i]) > Mathf.Abs(delta[greatest])) { greatest = i; } + } + + Vector3Int newDir = Vector3Int.zero; + newDir[greatest] = delta[greatest] / Mathf.Abs(delta[greatest]); + for (int i = 0; i < mono.dirs.Length; i++) + { + if (newDir == mono.dirs[i]) { worm.dirIndex = i; } + } + } + } + if (worm.dirIndex == mono.dirs.Length) { worm.dirIndex = 0; } + if (worm.dirIndex < 0) { worm.dirIndex = mono.dirs.Length - 1; } + + + for (int i = 0; i < mono.voxels.Length; i++) + { + if (worm.pos == mono.voxels[i].pos) + { + return; + } + } + + mono.voxels[mono.vIndex].pos = worm.pos; + + mono.vIndex++; + if (mono.vIndex == mono.voxels.Length) { mono.vIndex = 0; } + } +} \ No newline at end of file diff --git a/Assets/Simulate.cs.meta b/Assets/Simulate.cs.meta new file mode 100644 index 0000000..2e3d7c6 --- /dev/null +++ b/Assets/Simulate.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 427159c55a657c94bb823a7229012fc0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Voxel.mat b/Assets/Voxel.mat new file mode 100644 index 0000000..f41b66d --- /dev/null +++ b/Assets/Voxel.mat @@ -0,0 +1,77 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Voxel + m_Shader: {fileID: 4800000, guid: 729f2fad675e5e84b8f613cfa1090e3f, type: 3} + m_ShaderKeywords: _GLOSSYREFLECTIONS_OFF _SPECULARHIGHLIGHTS_OFF + m_LightmapFlags: 4 + m_EnableInstancingVariants: 1 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 11700000, guid: e36719ce7215fe440af46dda6a9933b3, type: 2} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 0 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 0 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} diff --git a/Assets/Voxel.mat.meta b/Assets/Voxel.mat.meta new file mode 100644 index 0000000..f61c023 --- /dev/null +++ b/Assets/Voxel.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 38b6b77574398c54498e524a886902e7 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Voxel.shader b/Assets/Voxel.shader new file mode 100644 index 0000000..b68519c --- /dev/null +++ b/Assets/Voxel.shader @@ -0,0 +1,73 @@ +Shader "Custom/Voxel" +{ + Properties + { + _MainTex ("Texture", 3D) = "white" {} + _Tex ("Tile", 2D) = "white" {} + } + SubShader + { + Tags { "RenderType"="Opaque" } + + Pass + { + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + #pragma multi_compile_instancing + #pragma target 3.5 + + #include "UnityCG.cginc" + + struct appdata + { + float4 vertex : POSITION; + float2 uv : TEXCOORD0; + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct v2f + { + float4 vertex : SV_POSITION; + fixed4 color : COlOR0; + float2 uv : TEXCOORD0; + }; + + sampler2D _Tex; + float4 _Tex_ST; + + sampler3D _MainTex; + float4 _MainTex_ST; + + v2f vert (appdata v) + { + v2f o; + UNITY_SETUP_INSTANCE_ID(v); + + o.vertex = UnityObjectToClipPos(v.vertex); + float4 worldVertex = mul(unity_ObjectToWorld, v.vertex); + + o.color = tex3Dlod(_MainTex, worldVertex); + + o.uv = TRANSFORM_TEX(v.uv, _Tex); + + return o; + } + + fixed4 frag (v2f i) : SV_Target + { + if (i.uv.x > 0.99 || i.uv.y > 0.99 || + i.uv.x < 0.01 || i.uv.y < 0.01) { + i.color = lerp(i.color, fixed4( + 1 - i.color.r, + 1 - i.color.g, + 1 - i.color.b, + 1 + ), 0.1); + } + return i.color; + } + ENDCG + } + } +} diff --git a/Assets/Voxel.shader.meta b/Assets/Voxel.shader.meta new file mode 100644 index 0000000..b3026b3 --- /dev/null +++ b/Assets/Voxel.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 729f2fad675e5e84b8f613cfa1090e3f +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/XR.meta b/Assets/XR.meta new file mode 100644 index 0000000..e7fe9b7 --- /dev/null +++ b/Assets/XR.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 48ebbaefe926ae74a9f3f5ed97734113 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/XR/Loaders.meta b/Assets/XR/Loaders.meta new file mode 100644 index 0000000..235a4eb --- /dev/null +++ b/Assets/XR/Loaders.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: bcf64733e652fba4a9c6eeb5794e74ef +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/XR/Loaders/Oculus Loader.asset b/Assets/XR/Loaders/Oculus Loader.asset new file mode 100644 index 0000000..0f89c61 --- /dev/null +++ b/Assets/XR/Loaders/Oculus Loader.asset @@ -0,0 +1,14 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 03bc68f14d65e7747a59d5ff74bd199b, type: 3} + m_Name: Oculus Loader + m_EditorClassIdentifier: diff --git a/Assets/XR/Loaders/Oculus Loader.asset.meta b/Assets/XR/Loaders/Oculus Loader.asset.meta new file mode 100644 index 0000000..12c9c63 --- /dev/null +++ b/Assets/XR/Loaders/Oculus Loader.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2affc003b38eca8449cabeb05212207c +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/XR/Settings.meta b/Assets/XR/Settings.meta new file mode 100644 index 0000000..5d9fa1b --- /dev/null +++ b/Assets/XR/Settings.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7c417da3f30e0dd488fb1798e8172cec +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/XR/Settings/Oculus Settings.asset b/Assets/XR/Settings/Oculus Settings.asset new file mode 100644 index 0000000..ae76dab --- /dev/null +++ b/Assets/XR/Settings/Oculus Settings.asset @@ -0,0 +1,19 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c353a8f1e58cf884584123914fe63cd5, type: 3} + m_Name: Oculus Settings + m_EditorClassIdentifier: + m_StereoRenderingModeDesktop: 0 + m_StereoRenderingModeAndroid: 0 + SharedDepthBuffer: 1 + DashSupport: 1 + V2Signing: 1 diff --git a/Assets/XR/Settings/Oculus Settings.asset.meta b/Assets/XR/Settings/Oculus Settings.asset.meta new file mode 100644 index 0000000..dd4e1eb --- /dev/null +++ b/Assets/XR/Settings/Oculus Settings.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a9d6c95c2e95be14b8c7ec758bcc564b +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/XR/XRGeneralSettings.asset b/Assets/XR/XRGeneralSettings.asset new file mode 100644 index 0000000..4474abd --- /dev/null +++ b/Assets/XR/XRGeneralSettings.asset @@ -0,0 +1,48 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d2dc886499c26824283350fa532d087d, type: 3} + m_Name: XRGeneralSettings + m_EditorClassIdentifier: + Keys: 01000000 + Values: + - {fileID: 7557298109923594347} +--- !u!114 &7231362451624338311 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4c3631f5e58749a59194e0cf6baf6d5, type: 3} + m_Name: Standalone Providers + m_EditorClassIdentifier: + m_RequiresSettingsUpdate: 1 + m_AutomaticLoading: 0 + m_AutomaticRunning: 0 + m_Loaders: + - {fileID: 11400000, guid: 2affc003b38eca8449cabeb05212207c, type: 2} +--- !u!114 &7557298109923594347 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d236b7d11115f2143951f1e14045df39, type: 3} + m_Name: Standalone Settings + m_EditorClassIdentifier: + m_LoaderManagerInstance: {fileID: 7231362451624338311} + m_InitManagerOnStart: 1 diff --git a/Assets/XR/XRGeneralSettings.asset.meta b/Assets/XR/XRGeneralSettings.asset.meta new file mode 100644 index 0000000..d54f13b --- /dev/null +++ b/Assets/XR/XRGeneralSettings.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f991e41c18e497c4aaf87e42c4dc0741 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/fps-zencore.blend b/Assets/fps-zencore.blend new file mode 100644 index 0000000000000000000000000000000000000000..f461e55a8992581e81c57c2e9dd1f04f305439e2 GIT binary patch literal 636968 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%0Dh8+{(}?Zf|2be;DH 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 literal 0 HcmV?d00001 diff --git a/Assets/fps-zencore.blend.meta b/Assets/fps-zencore.blend.meta new file mode 100644 index 0000000..688f572 --- /dev/null +++ b/Assets/fps-zencore.blend.meta @@ -0,0 +1,96 @@ +fileFormatVersion: 2 +guid: f17ff0e1c561a0a4bba0f4c3bb139cc4 +ModelImporter: + serializedVersion: 19300 + internalIDToNameTable: [] + externalObjects: {} + materials: + materialImportMode: 1 + materialName: 0 + materialSearch: 1 + materialLocation: 1 + animations: + legacyGenerateAnimations: 4 + bakeSimulation: 0 + resampleCurves: 1 + optimizeGameObjects: 0 + motionNodeName: + rigImportErrors: + rigImportWarnings: + animationImportErrors: + animationImportWarnings: + animationRetargetingWarnings: + animationDoRetargetingWarnings: 0 + importAnimatedCustomProperties: 0 + importConstraints: 0 + animationCompression: 1 + animationRotationError: 0.5 + animationPositionError: 0.5 + animationScaleError: 0.5 + animationWrapMode: 0 + extraExposedTransformPaths: [] + extraUserProperties: [] + clipAnimations: [] + isReadable: 0 + meshes: + lODScreenPercentages: [] + globalScale: 1 + meshCompression: 0 + addColliders: 0 + useSRGBMaterialColor: 1 + sortHierarchyByName: 1 + importVisibility: 1 + importBlendShapes: 1 + importCameras: 1 + importLights: 1 + swapUVChannels: 0 + generateSecondaryUV: 0 + useFileUnits: 1 + keepQuads: 0 + weldVertices: 1 + preserveHierarchy: 0 + skinWeightsMode: 0 + maxBonesPerVertex: 4 + minBoneWeight: 0.001 + meshOptimizationFlags: -1 + indexFormat: 0 + secondaryUVAngleDistortion: 8 + secondaryUVAreaDistortion: 15.000001 + secondaryUVHardAngle: 88 + secondaryUVPackMargin: 4 + useFileScale: 1 + tangentSpace: + normalSmoothAngle: 60 + normalImportMode: 0 + tangentImportMode: 3 + normalCalculationMode: 4 + legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 0 + blendShapeNormalImportMode: 1 + normalSmoothingSource: 0 + referencedClips: [] + importAnimation: 1 + humanDescription: + serializedVersion: 3 + human: [] + skeleton: [] + armTwist: 0.5 + foreArmTwist: 0.5 + upperLegTwist: 0.5 + legTwist: 0.5 + armStretch: 0.05 + legStretch: 0.05 + feetSpacing: 0 + globalScale: 1 + rootMotionBoneName: + hasTranslationDoF: 0 + hasExtraRoot: 0 + skeletonHasParents: 1 + lastHumanDescriptionAvatarSource: {instanceID: 0} + autoGenerateAvatarMappingIfUnspecified: 1 + animationType: 2 + humanoidOversampling: 1 + avatarSetup: 0 + additionalBone: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/fps-zencore.blend1 b/Assets/fps-zencore.blend1 new file mode 100644 index 0000000000000000000000000000000000000000..1eea563b651fb36559008755bc6730205fc9da4a GIT binary patch literal 636968 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 &J)9AMtKh5W0 zJ_hqS9Qjq%(dLWrebJcnIb4S~$u9S^qCSUpP3>=-Gxw8~!SW;h2BTA_pCP6ZFua8PM?F>=PX`aDWAjP{}z1?e(Z$yD2)3O79*aQy$z0j z!}=VI?~C~ytbK-y?QIaC7~YVH_j+%`kpqecPqZ|gn$^&5wRwz{%gUvd(~vaer#oD1 zUb-vJOOSeZC+~hTWlU<{4{>A7C#Tgd1=5b<6kxmie&g{^c$3)Hf~po zpGV@En1ESXK3X~`lHsS(Z!vzFpTYbJ=4TlBZPm->f5^7v{S4!!a`xh2X)zyJf8}7e zc9aquu9;((dA~!4Y{o>SK%_vVz(N!dKg07-;_>8XShKa$&tUdB zix*eQ&u}vO83GyWXTyRbE^2-Tqu;Q82IG6y&v3`>&+EBwf!$cl&wv54;HQ_L;l$e& z4?gl%4G-O_p;eU5OI^9FTv|B|Nl$*d!^Qjz`{JH^C0$CtUa}b!aZ&R#82uKT#~442 z->b#X!w<*xZ_lk>ytFamOEG5rH2Mw7PaC(Z#m}iPM}B%vEuEi6zs2}zeg^X^n4jUq z_r6`;BW?Z%-xrN--+g&K-ze7C?#kB-*^7gv#m}&q4H=*+u>tFTBKjHpT(_URES?|z z42#ofVLA^Wv9U;`K%_vVfKp)5{S2=~x#50?qGLsv_A;IGy%-7m)9(29y$|y{6enKW z>1QzeoW+YP(v@vpyq@+B-r{LlRiM!#YG490i!GiWcn=uWp4XgIb>mNFieu84=5ho_eBj)-qYL9VCAxM88m{Z*4Zmu%+GM-OK~3KX&Le; zjQbK6vw5k}Z?Sod`5BDgtHsaFUyb}U9xYYR@Rce?zd`wF<94<9c{utRJUd0th2zrV zK@k_V@oDs1jGyLbFu#KN8IHVL{S4-R$hMUF8Lq3AD$VTGfzkqgIuOu6w{;Z~yRz@T z=x69Z?oD1652K%9aT+a5=Pvn-8Ib~!0+9m!DDb%SGwga@r=P*>a~3bIl%HYE|BikJ zFJS#_m@i>5^D`LzhV?TT-&f1e&?ztUGpyZqp*&3Z%t`XtLy897Yo4pGLpM_-TFy^DCI2Vc!eY&tU$CY)h%1VNZ2p zd2R;%ncT&E+1Yk`q}9*x`_a#^@ch?gX5ldU85X9`;xz6dp)o5`AW|Swpf?2`mwtv5 znR65SoPEyX#m;#nbuT~Np}rT;|E}OS+qWM3pYIuqMt!&XY}i3$9xHk znV-SvH>{t*_`Z^U2KhNl*I~+w|2RKGkNpgXKdX3f^XFXnsos7DE0>i^-v(pd@~GDj zZduIFuqM8rAs}ThnKar4#Sk?=gVArXd5rlPjNhxp&y&&55HM=#{51Lv%uhFNSBsw` zaevBC{51M4#!vGzm|wyC3@88Aottp`8iLM9)cYBl_3Hj*{rrTOjFs{;tocmzGb}y_ z?xz=ge)KbVS}c#A*^v^{kphtdkpg`w@VN9dJhHQMKZDulEM8nGKf{{nX9xtWpA8F& zxTyIVjDExV8I12M>1TLq&~3_#_cbiApWzP_51#zIhKE1d+t2WrE0>kaph-kYPky?? z#rzCYaUP?jOX=53HiIHAYJLWz-(vF^^D`K~SBsx>aeqp{tX{mdF%lF*)c9%i8{tKKA*`!arwIb|4J?f(nAD z;eWHwS-eR5@7Eeao5V_ddeQw1{}lH#c(R8!ER6dS79)T7euk5de#`YU7>+dDXgG4} z+lnI%Us}5sDvn&ctzOJq)>6Y2#gRvkMI7nIH*`cOJ4=g49Jw@lb<=vO!yuNA6o?df z0#g7m>Y(DivonYfM4_*K9sY)U&zDDPsA^ywIm~;$)?MAXUS;-qwQ%H`Z$}&n-nvge z8)nyiXgJd7w_F^_dJdynDvus;rql{-hN}or1r@{Vap4$l3wR; z=f0qLaLu1-xb8n|X!oV_8&@tXmsUEmuv<_T$KFbd!dYe zi}}NipT_Ui;^#&6J-bDmE0vwn5c zr;|^;t}`!wA_XD^A_WGafSAEmTd(TzE@tsFU_N&ld-vkt4^hdJ9wA}tRn&Q0uR_Q_ z^J52VRpGjo#Zdu1hX2hzXYnH2vi7uY-o-XL!(QuEFL&o}>pXuO{R~R7lx``Xj9-qX zK`}(hA6c(*^jofM&NrLI$}4tMD^2`FO>@a$QpCs0 zP_~7E(?Xw-zm7Q4k8#p29E;hwrLCNoxrie@EmQ)-bT-~iKfNb@M+!s=L<$T-0kMFJ zBQNN^UNy|Vr_k5$dP94;ll+Ly4H;Yg$3usG6iqv6QI zUvT^9onO-0wQ&3HSJ(4nOU90NJHr*lkte*ABh5aq7LGg| ze|NyMrmxKkinyrZNTc7dIMQ&V;mCDgQ5*=#E!1~3fws^0w*Y#m374MG} zh!l9@P$2L}_Srw*A4evO;>d0fr`)pyf8d9`rlntzM_NIzx{ zf@i({d1BsR zrW{$Ajaxdru5uS~q|%|Aeqp}FyXhw+k6)1jkphtd15sdgapaS_`#`&}1RUw#=h0bJ zKR=}9YiaXGntfg^9C`R(B98R@G5eGaeF=*hjx_oWiz5v;8jgJIUld0gzO;5N1dc3C zPGNs!a*<^%HIxC=?W0<1HHqM*U4IjCWW=$ZT!;xm6d*Mi5D|IbD-C_2e z&C?%#+p&xP`1qv^Uyg8J^hYY`Qu_6>TR{;QH5_U5>xUy>^sfDmH(R$n_2CcU9Uc4_ zpLkvd?_R(U(iv_v9655I;z+}ndY}K^zWeHYW4})?BPKXf&owXOZhwnB-y{Du;z&Q< zO@>G$i}wn_uSq(G!Vq`)8)coqt+-us20joLGNBn3xW&obw= zC0h(LVs>6Te7CSWw~adb;YZ8Y77Rz4eeQ)Ly)TKnm!Ix1izB;!FZmy%KT>ID^b75n z#eE5j8IC;Z=+_TNKK!AY^4M%Q%zv4*4m)5R@z>%f7WXh7u30Kq~ zdE)OPj`SFZ>jXZ5Sul2jWoS_i!i4=$wcw$mu`TodFn>IPy z-kWl#lRwhzb1xj}dmrjl=K6FNM|SxmG78;#*{z_6iyDsHx5)2Q4C;?G+-Nv* z*Iz4+G<=!u0dQoi+$`0~^Vur{r&kn59{O()M|zw?9{4fX9k**%&dXf%M|xVQB!}s2 zyqkV{PyCJ)h!ltvSeyc9JwevB%|5Rdjy(BT^hbJW%i1YR`w|v29BK6H=Z_o|M;dN4 z9C_#*{k;;ym)5R@+jn2nDohqnn{zhn{x;&sh$C&htW-#8U#PBL*KLHvFj62=AW~p4 z3Wz&p)!sw?wC?8V!(7Tan-zKQkJ;y5IMUY9JN+H(ICZavS$`zgwZr$2AO6>fBb8Q4 zuikdcm#~=ONTXjr969K^w&6y@ktaT={z$`@)~ilG-G%>#%JSpPi zWyoq?awxJk_4g4+df6cj{TS?y+chiau~PI$dRnL?hUsj)n|^vv{Eife6o?cUgaWIJ zBYT`bSR#(xit_fi{P+HteO@gbc{08~G7z?`ow9UL#6=B98vTaFk%k)$N1lAuZEtxQ zHozLb%=TdW?%mZUULTn(=NA#RvK7UVBmWR_WWa?N+5Khm?h zpUv_mEM_>;=r=5mG~8%7a^x9`BMo0#yB2QWy=T0huN7Z$T`|AEu^e~g3jdzXS0aw| zn1@`VELoV1TROb1vKRf4N{4Rxh4~imrk{{JenkpI3PcJFM1j@yM-qo-K1;=sC_nt~ zYoBoTd9`rl$@u=rfX!x~vSCofMGZ$9{f5Pnh8qn>KJssh%M4#;dq5o7D%YAj>-pL2 zwE@#IfO`1d2fRHkCU|M&KSdlFab$Mf44bBmEmTLZ>#1DENTfidK%~GT6j)sx+2!C| zz#n@{LbrAO%XO1}5U>~k+1se2zuChFSWVXys>Ka^|V!+ny^&A0E__wDG9RN5K+ zdf6>s!eWLajef)8NW+bWBX@07f283{Yu7^H$mwGKH2OW8udY6h>>iULuae~S`CUJ9 zDIAm8xTUR}e~##n^t4b}57XIrH~sXU_#G(_DG(_z2nC+OLVe#uPCrY(-$fksJ>-T9 zU2llhmU7Mpu7|AHbe zYBnTvBRwrt0>gAR-c3KfCw@l?L<&R-3_=01fLq)-o30y%J!kVh zT{R}OmrKBrD|61q?DMMO$aeHcdRAxcl%;(Mi={Zy(QjBBX}HmFbOPYc>~ z(M}%4b?t5nSx&@}Mu`|k3PcJ-3Md86e1iO*joIhb!jb!;KQb6nAub8yK@k@<9BK3$ z7DpOxG#t6PqBzpL#4 zl`LPwg>WQFINa5FkEM9d=3GnokoTPO{gGy$d*Mir0o0BTiX+3{MO+i#AL%*Vb-u=M zN>Ic_Qyl5&w_F_g>fK2)0!Q1v^BS@)d=cW^ez)%SU%h)rwOlTaH%rw@vZ4F>pgDuI z71p)u8{aqbGTdZgcx^fHqhC8V&-yIP)s;1z_2o&j?ny~< zI$r?D`L1d@||DPy4&z!+x^6{Cf@)na?9v=<|e+ z!Xjb%bc(ZY_B=go5idWkJ|mmE`LkO5AmN6sn{_P2pOKfY%<~M|SN3I?XJR|V6a4En ze(0zRXR14T`Yfc+ux>ohv`%Op}mW0r<$u#+;y>@P&D=6#)bh*kKQJ!AXtLH(BAjyUDjW90Ltb>-#x z!c*-wm9>jEO(tRA+IIL`3dJ67Uy-I>1RGeor`E&7H7V-%YJ?dY10p+ z6WbH7IKqCPAG`kQe68Qb0rCweJRfDlah$#NnpamVYp=+U7hiULvED4sWv?%mHeABz zT#IM3c3*=VsV|b`-r#qc)&}~3ah@r&GQHwq8M)WpFLm~ahh-Sw8kFf356duqFeq>F zgnbP1!}wO0&oUNY%RHBVVJyfE3jTPFc?_9m{?qWscKF8+=hAG`>ap_7w-57pul0%dvL5EKJwDeIA)k+bjI+-c=XkL=$En3>CoO*Uwj|k# zhd#7R=W!cx&FF_{-_OB+55>2`);)q?B>A>_x%&np3c{{nzdGQ zsiVruuhrXq0|Ul(pto<4vj29T-SXGJ@%>xu@5H$}PDY;GIbN*n(!=*d4)}L2{!VO% zX2aj9{IKn>2^=hwg^8H3I+URqWpSUweYM=0UOw5AVehvmIV;(^;&k7%>Bk4AyY*wKq0!ywY;?DJ zj30-7tds6LOO09?0zX}>EbAoGu=iX4&PeVRxQ;g<3keh2_7Ap=b8T?2$c}*{PA;o%Sf%o3%&V8-ZQtfsa7r) z?Eb|>dH;DJl^IZtf2ab$ckK0Wec<&*L6 z(6xQ}v@C@Z@M&518=qD~&rMAH{r0)fotkmv+gVu889$6aM>i;cjBg{?bn@rwVl!VZ zm&T1wOAUv;-?z8&dTwIk`1Zq}JvIFC?JTV4j336IBQI6{7~c+E)ybbdwIY7^6F=Cr z%+Ij*`({^zKkwf@cZzU=Z>NJl&d=!WknzL#v+sQ6kMV6};}{J*(fIN0c>efj^ZYS>7=QM?%Gn<`jthk9e#~(XI`pvh~!JjVt zX8bVztocFZkMV7!+R2|CW&9fII6NtyP)mvpd%tgN<;Tw*x4-}R+$r+&_;xz@;~vl3 zALEDdXXHi7ALHAhS|9$vdMpRYrTkgu{j1BLdynrsMfS(H0#t-Aq zWB)<Wd8=Tf6O!+yDFVqo>IJ_;!>(?B*S} zf6D2%13S(CX8bVzoP4?R$M|-r(aE2^^?aonF{PFE9%pc>2 z@n_^><&W{r(?esI4>5LF!?5>Te^%aqtu=2xZu1{&X=OuOrwiM`a%tw{$B*&D_;cb% zlt0F|%#F#ma&0P~&0Ioy*!z7`D?NU+=EEs|^DV7p%=ihrQouwetH=)^2<7s#o5>=0Ba9bvoaU>Nk5XA09jwu6G+> zj8C?2!}vEc*U2Z3lb1*FVehx+SRFoHdHib@_JswbVJDY`;^MPu7o-TRQo)tW8)} z8Ny-jx2m|`w0+*0E4bejd!`P)GuS89ZOyIiVM6k0Gb*tCs?%tuS4+0v&i24D8$Iv5 z^VUD}na|w%+~+>`M*bna^=VIg+WNE4KAT&uR^{{TXFq%WkNn7w-1f#dzVXpFz3ENu zJ$v@FU-!D#wXeML%JvmkT+!aLWlQ^#OD_4wOJDlZJD>BM=Ulf^op|93U%2(g8*hB5 z)oQgHjYhj#t+vbMa(i-evdw<%+qX~p@|xGYM*6XB+qO3UHgDeijbZxnyyrb{{mz{` z5B}s&{$%^7e(I;%?|kPw+duIWKhb{M+uqi`<(6C8^?JR1(@i(E$H&K|AJ<=heM*lV zJ9bDP*pHXJ>}7W^l`qeF*0a{)c^~@upa1#xFZ{wUwBPfd_sHMR{_M}T4;?xreYy44 zTif&V^X*!#)-IJw?Xj`3_6;}OAbl`eY~Q}U&Axzd-xwJgSvx3Cn$701JMX-+eb-%g zwSW1Sf4P18?YFnz|Ni&4*&p_W{UBXPkGZ)y;mh>&bh}U}q_lYLYhT;mwQE-!G?c%s zTem*?J>T;^>lf<-=={)c{KjvzfAcqgv(4~VfAv?TAHVV|zmoQYeR%h~-`#%KyWZ6{ zI#4#)2g*e*mur(BS6_W~`_-?0b^G$mFPA^?!+qwSA; zANr8=;qc+ZBAe_3W%BKBe|yRc zj*b2M_lrEd`OR-`@7=q%O?hD3l!>Ocppc zsUu7lI4(IRvNU+Z8{Ux0BHMrY%U^z{wGZ0e{rS&-zRkbSeeQG857Ob@d+!xqeDaf@ zY*QXc1C9;Sfa8;V;FusENCWnPy7C?Gc!%gnj!Eij>c~(xv3=MI%!BlU`;YzEpZ!_; zPyh5!+h6#?7o;Dg1^bYt1N%T4a9mOrKls59ieBKDq+Z~7Fd9%dRVtPC#Kc6KGC-Sk z)m2vs{eSdFfAk@1AM||ai(mX=n|>Z`O9B!f9XqKYCrVQL+uA1c%Xw1lmqsGH2A|m{KHfh zj0QFqNCV0N?E`hQjRW$4_KCX4^x^2}XsQDsFL!?BD_?2zk9~OX!3RYaPMkO)vKZ2U zvS>PzG@xEGokSX#J}?>JI0)M({W%UVyzs(<#(&tz>%RKcueSgE&;PtlI)pT!9FPyB z0p;LRpZZiv1L{VO1KC2ghg!0hA9%#7$Fdwy&G=}&)pY71c(p8=VB^lM-Hn$Upl zhcw8_A$2tM5_JN3z_Dohfcl6u;5eXtX8U}8^566@Wk1w^qyzYMC)+0t$ODr_js-ry zjYaBa(jepkX%LP@>Lbbk^#JW6+oulT_{-`Z;{mYBb>R1-IhV&;+qYf}VOglvV_o`RD z>eymflzjlLAGL8veQ3|macJYfo}c>I_-}fM?Nk0pf7-!fvDm)svdfMwguRRg3}5n+ zm#l|;e6VWbLG{$ixs|y zV0W?6DlczW$~#?K{o086kphtdkpja|;PCZt6aVN`O+%>*FTpt{(Kp;MjaR+h+OLhH zpV#+~Jm+PjZ%qBAycK_Gy5nZ9McR5~$AuM1ta0n$<|nrP_45;3FL&izOY#$k<$FKp ziabuNBvK$!AW|SwAW|SwAW|SwAW|SwAW|SwAW|Sw;54ED{SAC~u=yW;5Ao11!0Y>v zXa1I#xa%h-0>2CL_LQs5wL|=_3#yQhwP*EPdynO{J?n?G$Cnll`LXt_erxZ zm21!HxAx30X#J4(E?K$utbS|HYPNnzd)z=eV zuGx0=>C>-auA4kMFr;J~@!gO_wV8$|J?tJYzSv z^35Aw`KF}FLwbxf#`EPOB56D~TP#gZvGOY3FH@{1ll5w=mdxNt1^zZB&G}j}X|%>9 zoG9lflS+QNc*Di4D?fwRM@o0fctt=HFK@sPKvj}ztytIBIOJ;i!g@9}iW*AI;&iTF zoG8|dmGNSZ)%g5!6&=&O?xH2ESIw~#QiT@PywQ3kk4BnPzR^Z9nl_Tu@ZJynYCx&j zNZ6MfE@oHoKD+!R+O8C5O9hayH0GWOSDSc1yy~qqUajPCv0g;C#`Ru4Mo`~qb*5Oa zmkPxkDyZk{^T}wnUYg`xqqX^5snTfX@tg_M6D7Q8lWY^(ZCJk%buo`Uzd@6uwLIuT zKIHMP-U6>CAXp6*@!`=H4_Hbz2oWY{Z`k;zWQt#855w^(?%^-wnx*L?dNEyNCa5yr zl*lCBMh$st)r(9DU3k4ZmW+Y6`-Ri_0?w=#imt;OH{<$P4S&T0%>;r~A8(T13}*6m zxdTb`s+p8()daQI@#7Fkfo0SA#{Q&HCZ#BsE(YNoZ`CPgqlJ12cS^Fz@1!wRo!wuY zPo~jNR#&Sk`!=w@^TFE#qh=6RG=!586qpL6XM*RB@PL%~Q5EL# z>U52q7DhCZ3JW$8{T{`G;aMBSa+%LKo**`!OiRTL_MlNL?oTGFjv z6JrDIOhV2Z#YzLO^sL*PQe>nhmDY4_tc=&oHXnc0li_< zn-Z%zN2=tT&0+-#f(LgSkdiX)9xYTS(91@?noP{)WW0-jT=J$w)C2m5cZK;LVw`|? zAPYvcRgUI-<}{_KR+_0c!NxK~fTeSgPsD}LUAaxLpfsIN@XAF<#prmsR0G8ruTD%f ziXy|J#*(}o&1+OaPGJaXR~@?va-QTl>>=SfC1ILO>E?4t0AJowu~47QjaTax3_A!N z6(*#GnN9pM0&`rlP^@7HyM%BLLgDl)i&x}yT9DVAOKSN>14F+Kb;+ZJd_eG9LafXu zV00s?)|*q+oIYluo}YChLf+?~3PlKV^B5_m3DhXTeDa1Xa$q0XAbbQZ5{z}`CHxzM za+-$bYuNo0rDoEA&M#JzdaEL$INBI5Lb@mF(9V^*hUkqDK4~CZM#TDLe15!~RQF?u zmN6Jh#o1hO9(=}=X_l!iTuI9Lc``CzDNS<_a`OS$njfDkCd{M4hCoYx10b{E;yEU8 zbE65X!JB-BbdS%L3g|}ifEljiUW=l7+D+|9qX|JO$TPf>#sGo~a`Jm#zD1KUDHSs! z43=v;h@iRijT#0|qc*SOs)4qOIS6L6RGDn3Q07GJW#n80Ed$c91C5+h8j_$TBJDR7 zEE`&RybASN!w`_~N^w#YOhNhu4K1=g%3r~0&7^i1M(HL<6~5=?`v7mQp)<)?z15h) zSg&b+G^t}xI#``(P%BWl7-DcF01Acbv<^_^H7P64&Rfb!P5Y+-J18Pv6DlOLQ>F2# zTvdMXAOV(0#*+O>p*WF)m0%^%M>H4=a2o?iYmMP-zAhmOHSoqeW=)ssQbdM{mc@ox zT(APg=~9#FseHY_u$~9<(R&2&NOSq=FMUaips%GhM37Zs9u1I`&(mhn{ED!+FgMkLO{Mw|L~;XE8PJGW zzzJYB4DX!WWQj&~qA9PmtLvL@wF0MTt7FiNtk9*=s$j=PQftiXS58KEPGy4SIoMs2 zAfY&y1C8sYF&KCOePX#4fGH~a!-gE+~()04Sf3BK^&{8lAjr-eqUI^G15hT=q26)j?ud0-`~@?3tp3gw(s zVB1_eS~NB;T*(_jGX%=pA|sw@x!c5hsQhN(7YinMyLbF42t%%!DYw zh7=kHh?dC(BQm$p96~tBK?E$-=S=bw#1?b)Vyy^xH19$nLWn7lX%XnQE+(pyhpiPA zvq8vSfqD_%Lq)@G63YONI=#feTT!4p&6r~#{E}gyg2_Bhg8YO(nviD^wbz&`%o1f5 zW+&x)OujKn6WG4`e z2+qUiVob3o#eyUyMqZ7zCbSi34JI%@YB-sZ9y5#6E`*ZCG$EgZN&rhW$}Xm{c^^H1 z8B--tCh z(!{ukDhCBxaW}ezJhfeEz$Al6mTbao>=%VY)t=+10hRUsQMGiOjRNQk2*pICL4*ht zU)^8K)hEaD>@x(goF=AAb7|boAGI`O8dEDNt5KG8f&%qiDBgP5*iBv*2i znDzI09Q~$Sh`l4>ugj78ohUPa1Q}GO;-4; z9IEk2Q3yM}A?)}bqnX4^tX{{+U`8?tIcP8k0KndWHEnNgrf^VwAQUm=Y=*;(1ebWN zUc$T={hUE=P9bd#$_qrqv}p#4n=npu#>_vl3vfbk2APaX3APU}NwtZm7cI!KI$OfSa9lc6 z%cwq}dTeCgIy#nb0xT&Io+(n(QFG;i0utwxnc9#{ZA>OMBop}FgsB~dS`h}0&<<{b zgp;;Xv&9(}o)QF_xJZUD>tT)H5uPFkAYZFA8!h>sL8lt{%^VG8Fw+3EZfP(hGuM`U z!_&0C0u9)5;Y`wmAp@=lK{2%#U|=aY955v25~%h{GMh|cK3X3Gg)oD5V~_d@-C(}b zP-A1o8Gu@_gwrvNK@(LgYIJ#jA}~lrS)+~VYLydVy!E3zp072WO{XsfP$)r_@_=AM z0mV?=27YaHkIlJ+dvu9H(kiV4-{QQWPiLZBoyEZ5Pupz>baLCEy_2D-yd z{HR4_l2oGxz_kiVnaluy0(}B{zA`Bm#925FDQUo$=Cl{*eHinjg;@%x%N(y#IaTDF zUDvTNlR!b%OS~k{h4x`OCz4VE_sd0?LO1CDVl^0g6gdjXx=|(?Ke+A(lToNf%&`)7 z8}mju1bII&{5XADpudZeoX8+wfG$~!3t-X+vN2kq9{{$Cv*npGo@=tm5F>Qi$Lx?^+);RpVRh9}4DC|FWDm|Xap;=|#51W|WqhlC|={2yYHZMY;P=_tz2g^{a_&*3IF*C+M zVa#!`T$*+<<0&yfz+y@f(UzJccpt#MQU!Ac$Q@qRE1-5!+MM)cz%5r-BP$H?kR+@ zS|lwTgbd&vD#B9=@n&b?@4)lY12{hocvYXz2`QC2uAg{b&Y$G5mG+2&Xfm~P?kHA> z+Jx(9h|Hf)ob|&Tw=Tw%qC!szsuFjDJS3SYZV-K9(aNH+#HpxmyB#p5kY&_53C}NA zopha~R1pn@G~4Ge8N6lxoh8QM@)s~T3fKkB16wKwuSTH{=AdZsP1wr` zBXv(s^U{>R0Q&_ijVmD3LY$Oy1a~QgP;3n&lO_rRAdRbavBuHxI?0}BRmR0Wh-*sm$%HfY#44%f zr)3e6h>cPEEqRoEE2O*u)CQU1GFnxs?fcpmyajyhK6=gHU zcGdE3Ws5qci2Nuq0wt=FpCm>#uH#hPC5Q%}>J`LBffw#`62QCd;K!#Kb2?>l>^Dv%E-1>fo1d7qAEc{76MD^Agp< z81^oL#XdG9?ii<*3hq(RXD;Al#gDyoE2(PaAKPr>hmf+%S zgIcphh>MXlR>->`Hzsp>rvkwqPEM%>sW)9xTGl2NW?@jkA)`yF0M^BFGq3iLHwH<$ zkw_tjSu=wfvB1T;U@h~#t{ek1Xf8k2KG|L$W5}`M_Y&S{?Cf1Q~mEHWw23h!M11(7-~1j>ePSWy97nT02p z3$YB`d;_Dv?@%FSpr;FvVu_l~)irJv_|&YcS;i)a)-=Tq_dta<;4rPxJEYTVI;Cc@ zb4Pqr62Kj$nH+u_iKB@7Tk;JD6ymeu;Q)|?mkREx*`&})3Ns1jm}me#J?b=U5U~M_ zeG7DiZ5G!W0GMnQ-~>YmULBhvTOs?9Fj;99Hd5JWvcfeZuti)XsuIvAg`j+35n2Ti z?5tx9AP&oJU=~J5>J`ah$&Pa-$>3cs>LgknCyqz?2Gk?`l!Doa4PklIe8H26^{!Ic zl0qu%O~}vcL{i}aJ1KJ}gd3RH$gfTO;^ZIuUkIiFDCtKOB?hMsb=f=y1$ThCgzV86 z#h~F_1gmm*MC_N6NP?aelKc#KJ54!Jj}G<*&>qz30^XtOzL8+Dgy;niiWR0}g25qE z-v)M@(PiKs$Y)~>iB=p7pAf|f+Bojo!g2&r3H`3vR|L=TxOiO)Zkb4Y@}zkoolq74 zn;na_Z% z1aA@-f=di5x%9eJ%DUDj5(8<*92E=D&`mQK^J67$Hp23-H41`;RwzOuGCrwDT-Kb6ASx-&QHFpVk~J-P2=b?1 za*rsBQxQsNILO@v zvc*76-~oWnWP+Xub;?Y@hs4P>!~@f9T%dnuB3G-s zHE>qzkr-yas8XVE8%%3#f=t$EJ%~4eLUjEuKZYGjHBlCFYXh*vs%ea2vy$H27$bwn zxrsvN2O2|v^&uzf#hW#zbl~FyPU8u&Hy}sQOv>m2GPZzD;#p<+TC^bay(}nGoDtth zbLiq|OLsfqkyQmq5udG-`B6|%ErmS8xIXEq>P5ABH*7$ySU4NQ7=%&drVea(WSyKf z(xIp511a$>KtQ?Ug8L{T2n^xe1Jzkl7GWXVdWV1+2VJnSgZr5TsB27&l&;}Q6mv&d z8*V(r5EP8S%}#!ohRFvo$oQ0Fp{~#C0;w zt-@LW&j;5QQ7iU`G8>`Gm~LRB1NM_9jHtVftNPGP&;e+@=QtlqBY>;>u}M@tNLTJmfIK+r;L{{I zz;ygrHx=hNHld7Tb&QKsT6?Kd!!9sf!Wt9NhqnRF(5rEV#W6rvhCES}%P=4aC2A&B z65Nxg@`&j&b4DkoF(xrd%tP&R`))2@m?6X}U_A!NfzxxFbkEHnz@$ocC~ z$yRBnf~u=&=%L-9*25g=VtAD>*sd4%ZJLzgY3g#@qd=)*_qfe)k4zF6yBzw1lW)yo zj5+c=*XsV8Ne)8Nes>YxBJAO=l&&w9=Uj+2BS~|EMO{{HuJb5)Y)qFdm3O8dCB zM^;2->Zrdczem>8ylK6%GQqB-rWWaKviEc%U%!I;&E%@!QamU9AKWoNUTf@yOHs+> z5~LKOuXFp00kpYRFNSN6S)(v>w{9RauS#dZj$BugVm(={I>kqJ?FI=jAapMhCT(@# zhWaGGWcj`dCO|`CCk^J&7&=&KrIWf`l^s~P4<1w8430|ZOko3CPLe!eC?=%&s@wLX za0PRI-T>LdVtwrjZs3JhE7w4FxQ)lhT+aBIW=xEa3-1u_!gLJ_5txj;wm5$U_37nM zLfB3;YxFA2Zl7-!8`l-U zZdeICTAcPM&XC-E*WgXD$R)8n%Y_2r_Kwq8(KX;d&Tm!j3nNBvK0{!jyG0fNSkEQ! zD(jYzi8_5S*rP@rD!1_ZdTu~!Vj-{zXQ6ZjPsXZYuav+N6PeMN@<-x!oI?`ad54~;$C++eY~2+v z8GaJkoj$_g0wR%bNCFn204g=r65M*p#n3+!lk~LVG!dXL&Jv{YM)789gc%ifrf9f* zO1el2UBoF7fG(!E6Z1K`A;8S847nSEmKJpW4xa(PC1?OIJY51j?*eA~t2ClqgXxuJ zb<57Rbl0Jhvjr;*pBXl&r5CUt6r%w`4hbSD4Y#Pr5tSLHNiSfN9@czC%@vAcEvQNk z9U1;$K8K;M9ZHTY8iEYi|B_5ovazqT#Vv-;^De5NZQCQ|xPVKkCE=)V#YF;LtNfOn zd^P8G8H~dK0kbx%@CUf{C-^HxUPmQUPh0q?fPWl7D`S$)g;SZ>PEW6pJiYD4OvspWn)-2~AnVg*BX#+p*m`sRG^7=$n}RuDd-bJr@6(DIze4z=o*^RK?K;wIRR&A^`dMogTuE_U`)L7!V`(z z0JkAe3xE|eaMZ6Sl;ea*3UW#bIe-GNOy2 z*hIz}73bE(eoJ>GQzvjja=9$C9CnO%^Z1-A=h{aAAcW5bYL9z|99K!YRB~1%{Z537DFaj5w5ueZK67&Z=uYDk_khnbLW?(a;h8IZLE z^ivp1I8ufq-+&9nLO_H@ET#Vn}(}f$(1Hx;!2#qpEE>kFA;MNp26{~0?#E- zRUcG8L^pzHu$LNJjdg)aG*7^O?F3Px?HHxfa=EhUQ&nka7NNH_;S`si#dAC*iGgG% z)ftwi*osf^P=akMmktD}j%%i^IMQ+KPRgcnRk7Hz!^$~>mL(f3fT;EwopoVr#<|_O z&sg)^vb&A|-C!Y0>G>99oTnfY9Y+e|bXOgQHnuRqIAaq$ox|A9WMQC#TnUHOSYHXN zu&^c-LL^%rP^D|B85}c{mFx8S%*JdEO?PJ*dPX$|69*0fh)`Nlnw3&Etvl!}_g%|| z1zZ#uQ^yWJPFGO363VO_ms)G!02B_yS+%6Dbg4eUtfh%z?A+m&5Uq?{fru)pvVRE1 znGl0}OGSKT8<$hz82yZ4yg|6#entY64TNx*OyM9Hml);PD!iz4Yx!JZ2(_mh3yjgR z6(qqnX-P`?@@{ola(#W$6Did3{Nj0Ij#kxiO$7(@`;cHV^XbR|;-FRO$eWN6tr{Bw zgdN+Q4K}Opq^i!(u+>*tqrwYKQFj|rh&?d#!viW)xmK>{9+AbP+0Y}Z3fy(6$CpwV z2tD0#8PE%EZ>KDdY04k2UcIEaaCrSOu$&+GPoo;0pjv6C%R&1h>;12n6uEV?&cPJGB?>9i; z204>5@3sgbt&`96Tzk-v;xNiBGK1=Telw2)Q<%4KO2D|f71J#I*h@$JCc%Ay5o;*}I%c2E?OnZ*5 zEa9-6sN|3jF007sUaKJ6Ns84s*$jn5QVzgK9LuNjK7ldlUmhsN9vM%Z6GUWusE5&DkP1INjSHB#_sOn{JBLs}`tpGfoCRk7pPjM>F zT@9FS>%sj|x}Y3ruo_j>@Q(Elc87u=!+?8@PoCUuq5C!vnGiJ4`%KbH?9 zl(0<`crqOB;y1RCyHkir9l&7c{uVwNR*L1D_i{EU_sg^pl@ze!69+huEk;~^idQSG04oC6>@Vv-KI$G- z9SWEz!#!$KSoe644B%#G6?`+kV}w^c1&h=2)9-)p(pSz29;_SQW7WP71LdLdY=& z8H8-8G1fQ-my}8)ZkowVTNROgLxgrFBpnxZ_9h#wiA6C4oceKYZFmtiUnn7~BBH2t zH&Tl)Wb#Fv5ft+zngP>5>AM^SsK^;gEVfRT4op|w1&PWkvhy_QMO|0savWFuf;`!O z6K2Rz2s5Cq=n7?%Y1{ifD0eF}1WR@8LpIC0 zC_9OrKWgORThJr4oPvuqa*Yq$tohBC+aQoxB~>lW4ZOJ+`TP?85H9c?Y{-Xui@2#c zC*>iGz%=~k2m!u^{BZL$Oju=7B+=#Iq-5eWA7^(`TB>%}8MpT=xYsQZk;5+`Vuo1? zLAq^^che7yUwIhmfZ(IaDZE301mO!j@R~85Oml|s&>vUOT@j?7`S*Er6G7AR>O>753`!5&&H2!ZMXv^H@u6e1$GNGGi(F>a#6xcs8C z&L4&y!YmT2KR=8!WZWC9#s}jZBPE;GVd-eVO;1|bWhg;~_AZA`R)veKN#01N#z~UU zE}Rna{0U<8XTnj3UBVUb8>eD&C{0$DN^ot0bW|mr4Cr|{>~@3iou~R`Ka~@E=P!gj zVeJqsVUr9X+5jk0n@{O$6|vsyFqEr<^LLQd$tIR>G>!2HiDEyX6mhV142GOg9Z~fQ zq!H-F^b+4?249~}w8X=UB`Z9$>P3!YRtI>6Z@dnMjwCkBGp8)WS)h1pl0q|wBgnGV z4qFPCz>^ob*~cw9r7kJ4UJB=FBeCFtYJ)s%Gxa60>SMUm?fz13R}==23am?&f(QHqMi^N zgTCj9c{xXnh5m92t85&M*enHR3QEGM7A~NtX?1oIY_z5^AJYSdxk3$x-zoAsiF5o@ zmp&-V7cugxM1c0WJq=lS?GWBEpi!Jpgm()l8@sb)Cp7jy%eKA(cREr!)e(-WOSPtM z#*p_nY6h0ewZGhXg#y_Ah6OMn1KE6o203FA;s;(F@fJ!|vIm>PMUHL4$p{54JE>)v ziMoziSdC3fGcCg#oRz)V#EW=o0pD2&BEnoiWAhb);4pSg;_0z9uY@cpWMP0jCMB?n zohg_VVe79x0d^-$wjipq+R32_b%=4u7(ElzARDN9+#r`uXk5lV_Nk5U=i3fksOlXL zV=gr0Q`%8$u(KLd$Ic8WwI+Jy{NDzhc%VeAEP+0UbijzQ@&uQwTP0h#hCc>?8;ACQ zp&Rl}3c9OGINX8#a$`JesTf-VT|&iH0C5ng@zuECWtb#vm=UE3sDOR(<@^}VFJa8! zkX;zpf@+W9hi571cZ?m_Y%Q%x6=0PqZt$loTvK>^gNulGN_-Bl{h_Q%f}K&@_#bU;wv45*yJl5i3b8(uSn0 z4$Xm}`<9XDyecpGlzEz#)^ukXY7xLO9OU;E`Ml1uG@f|JsW0d9iNV1_ z6nloiBiL=B@mVkfV|9|Rv`i#H_l%E0PvuBEmqS&mx4>mt)u?W7v|A>5gg}ZADp^F{ zcxnyg$26Z>SYx#oHiVMkQl9zJ!5|s*0sVt-Ua#?WA99ZlY>i{=;7kSfk;oNn_Qzh1 z^bu+$tWu;6E8J1x%oV4{@D?CaNP3_{KwOq#T5ScD6ZWWtatEyDK&`wwH+UP`oJ_t^ z@4Q70SVSTGREe!>oGZdu+4ULeVz1AVcRguw`d0K^y)wN>Q{by}1*KU!lgK1x*Fl;G z+bgG1(hL%Tu+kcFj$J=Bryy}xf{3Bu#x%zPE!@gc2b0fQR2+dP==l%QZd}@Be*@9B zLMaw!3g;UHT3Om;nb!h_sM=s5jrle$?b-~Iu9K7*-YBw@c2!gErZnMhslaV8scuP( z8Qxr+16othEnZs398p-JQ@KMJ!%{ZsOH8)tPw}XWP=!-6-a*JByZZpVnC6VzLV*}e zK*hn)#~9tklB3Q|MrC5ih)&cP^VAb{&Mb+9WVQuBUgQLF`Q7G6s4

L&Z$vSb+4$h|1>H?FnGf2U> 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 a&minfm<6-Za}K)94cBd4Ck0_Q{rwN%d)Zk4 literal 0 HcmV?d00001 diff --git a/Assets/fps-zencore.blend1.meta b/Assets/fps-zencore.blend1.meta new file mode 100644 index 0000000..48cd46f --- /dev/null +++ b/Assets/fps-zencore.blend1.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 5ec3374434c2ba043b208f81cc986133 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/manifest.json b/Packages/manifest.json new file mode 100644 index 0000000..4bf71bf --- /dev/null +++ b/Packages/manifest.json @@ -0,0 +1,44 @@ +{ + "dependencies": { + "com.unity.collab-proxy": "1.2.16", + "com.unity.ide.rider": "1.1.4", + "com.unity.ide.vscode": "1.1.3", + "com.unity.test-framework": "1.1.3", + "com.unity.textmeshpro": "2.0.1", + "com.unity.timeline": "1.2.6", + "com.unity.ugui": "1.0.0", + "com.unity.xr.management": "3.0.6", + "com.unity.xr.oculus": "1.1.5", + "com.unity.modules.ai": "1.0.0", + "com.unity.modules.androidjni": "1.0.0", + "com.unity.modules.animation": "1.0.0", + "com.unity.modules.assetbundle": "1.0.0", + "com.unity.modules.audio": "1.0.0", + "com.unity.modules.cloth": "1.0.0", + "com.unity.modules.director": "1.0.0", + "com.unity.modules.imageconversion": "1.0.0", + "com.unity.modules.imgui": "1.0.0", + "com.unity.modules.jsonserialize": "1.0.0", + "com.unity.modules.particlesystem": "1.0.0", + "com.unity.modules.physics": "1.0.0", + "com.unity.modules.physics2d": "1.0.0", + "com.unity.modules.screencapture": "1.0.0", + "com.unity.modules.terrain": "1.0.0", + "com.unity.modules.terrainphysics": "1.0.0", + "com.unity.modules.tilemap": "1.0.0", + "com.unity.modules.ui": "1.0.0", + "com.unity.modules.uielements": "1.0.0", + "com.unity.modules.umbra": "1.0.0", + "com.unity.modules.unityanalytics": "1.0.0", + "com.unity.modules.unitywebrequest": "1.0.0", + "com.unity.modules.unitywebrequestassetbundle": "1.0.0", + "com.unity.modules.unitywebrequestaudio": "1.0.0", + "com.unity.modules.unitywebrequesttexture": "1.0.0", + "com.unity.modules.unitywebrequestwww": "1.0.0", + "com.unity.modules.vehicles": "1.0.0", + "com.unity.modules.video": "1.0.0", + "com.unity.modules.vr": "1.0.0", + "com.unity.modules.wind": "1.0.0", + "com.unity.modules.xr": "1.0.0" + } +} diff --git a/ProjectSettings/AudioManager.asset b/ProjectSettings/AudioManager.asset new file mode 100644 index 0000000..07ebfb0 --- /dev/null +++ b/ProjectSettings/AudioManager.asset @@ -0,0 +1,19 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!11 &1 +AudioManager: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Volume: 1 + Rolloff Scale: 1 + Doppler Factor: 1 + Default Speaker Mode: 2 + m_SampleRate: 0 + m_DSPBufferSize: 1024 + m_VirtualVoiceCount: 512 + m_RealVoiceCount: 32 + m_SpatializerPlugin: + m_AmbisonicDecoderPlugin: + m_DisableAudio: 0 + m_VirtualizeEffects: 1 + m_RequestedDSPBufferSize: 1024 diff --git a/ProjectSettings/ClusterInputManager.asset b/ProjectSettings/ClusterInputManager.asset new file mode 100644 index 0000000..e7886b2 --- /dev/null +++ b/ProjectSettings/ClusterInputManager.asset @@ -0,0 +1,6 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!236 &1 +ClusterInputManager: + m_ObjectHideFlags: 0 + m_Inputs: [] diff --git a/ProjectSettings/DynamicsManager.asset b/ProjectSettings/DynamicsManager.asset new file mode 100644 index 0000000..cdc1f3e --- /dev/null +++ b/ProjectSettings/DynamicsManager.asset @@ -0,0 +1,34 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!55 &1 +PhysicsManager: + m_ObjectHideFlags: 0 + serializedVersion: 11 + m_Gravity: {x: 0, y: -9.81, z: 0} + m_DefaultMaterial: {fileID: 0} + m_BounceThreshold: 2 + m_SleepThreshold: 0.005 + m_DefaultContactOffset: 0.01 + m_DefaultSolverIterations: 6 + m_DefaultSolverVelocityIterations: 1 + m_QueriesHitBackfaces: 0 + m_QueriesHitTriggers: 1 + m_EnableAdaptiveForce: 0 + m_ClothInterCollisionDistance: 0 + m_ClothInterCollisionStiffness: 0 + m_ContactsGeneration: 1 + m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + m_AutoSimulation: 1 + m_AutoSyncTransforms: 0 + m_ReuseCollisionCallbacks: 1 + m_ClothInterCollisionSettingsToggle: 0 + m_ContactPairsMode: 0 + m_BroadphaseType: 0 + m_WorldBounds: + m_Center: {x: 0, y: 0, z: 0} + m_Extent: {x: 250, y: 250, z: 250} + m_WorldSubdivisions: 8 + m_FrictionType: 0 + m_EnableEnhancedDeterminism: 0 + m_EnableUnifiedHeightmaps: 1 + m_DefaultMaxAngluarSpeed: 7 diff --git a/ProjectSettings/EditorBuildSettings.asset b/ProjectSettings/EditorBuildSettings.asset new file mode 100644 index 0000000..7d10d42 --- /dev/null +++ b/ProjectSettings/EditorBuildSettings.asset @@ -0,0 +1,15 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1045 &1 +EditorBuildSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Scenes: + - enabled: 1 + path: Assets/Scenes/Main.unity + guid: 9fc0d4010bbf28b4594072e72b8655ab + m_configObjects: + Unity.XR.Oculus.Settings: {fileID: 11400000, guid: a9d6c95c2e95be14b8c7ec758bcc564b, + type: 2} + com.unity.xr.management.loader_settings: {fileID: 11400000, guid: f991e41c18e497c4aaf87e42c4dc0741, + type: 2} diff --git a/ProjectSettings/EditorSettings.asset b/ProjectSettings/EditorSettings.asset new file mode 100644 index 0000000..1a44c3d --- /dev/null +++ b/ProjectSettings/EditorSettings.asset @@ -0,0 +1,35 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!159 &1 +EditorSettings: + m_ObjectHideFlags: 0 + serializedVersion: 9 + m_ExternalVersionControlSupport: Visible Meta Files + m_SerializationMode: 2 + m_LineEndingsForNewScripts: 2 + m_DefaultBehaviorMode: 0 + m_PrefabRegularEnvironment: {fileID: 0} + m_PrefabUIEnvironment: {fileID: 0} + m_SpritePackerMode: 0 + m_SpritePackerPaddingPower: 1 + m_EtcTextureCompressorBehavior: 1 + m_EtcTextureFastCompressor: 1 + m_EtcTextureNormalCompressor: 2 + m_EtcTextureBestCompressor: 4 + m_ProjectGenerationIncludedExtensions: txt;xml;fnt;cd;asmdef;rsp;asmref + m_ProjectGenerationRootNamespace: + m_CollabEditorSettings: + inProgressEnabled: 1 + m_EnableTextureStreamingInEditMode: 1 + m_EnableTextureStreamingInPlayMode: 1 + m_AsyncShaderCompilation: 1 + m_EnterPlayModeOptionsEnabled: 0 + m_EnterPlayModeOptions: 3 + m_ShowLightmapResolutionOverlay: 1 + m_UseLegacyProbeSampleCount: 1 + m_AssetPipelineMode: 1 + m_CacheServerMode: 0 + m_CacheServerEndpoint: + m_CacheServerNamespacePrefix: default + m_CacheServerEnableDownload: 1 + m_CacheServerEnableUpload: 1 diff --git a/ProjectSettings/GraphicsSettings.asset b/ProjectSettings/GraphicsSettings.asset new file mode 100644 index 0000000..48fd405 --- /dev/null +++ b/ProjectSettings/GraphicsSettings.asset @@ -0,0 +1,68 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!30 &1 +GraphicsSettings: + m_ObjectHideFlags: 0 + serializedVersion: 13 + m_Deferred: + m_Mode: 1 + m_Shader: {fileID: 69, guid: 0000000000000000f000000000000000, type: 0} + m_DeferredReflections: + m_Mode: 1 + m_Shader: {fileID: 74, guid: 0000000000000000f000000000000000, type: 0} + m_ScreenSpaceShadows: + m_Mode: 1 + m_Shader: {fileID: 64, guid: 0000000000000000f000000000000000, type: 0} + m_LegacyDeferred: + m_Mode: 1 + m_Shader: {fileID: 63, guid: 0000000000000000f000000000000000, type: 0} + m_DepthNormals: + m_Mode: 1 + m_Shader: {fileID: 62, guid: 0000000000000000f000000000000000, type: 0} + m_MotionVectors: + m_Mode: 1 + m_Shader: {fileID: 75, guid: 0000000000000000f000000000000000, type: 0} + m_LightHalo: + m_Mode: 1 + m_Shader: {fileID: 105, guid: 0000000000000000f000000000000000, type: 0} + m_LensFlare: + m_Mode: 1 + m_Shader: {fileID: 102, guid: 0000000000000000f000000000000000, type: 0} + m_AlwaysIncludedShaders: + - {fileID: 7, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 15104, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 15105, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 15106, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 10753, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 10770, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 16000, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 16001, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 17000, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 16003, guid: 0000000000000000f000000000000000, type: 0} + m_PreloadedShaders: + - {fileID: 20000000, guid: d1adb60b35747124ab7a9c7eb8c4b911, type: 2} + m_SpritesDefaultMaterial: {fileID: 10754, guid: 0000000000000000f000000000000000, + type: 0} + m_CustomRenderPipeline: {fileID: 0} + m_TransparencySortMode: 0 + m_TransparencySortAxis: {x: 0, y: 0, z: 1} + m_DefaultRenderingPath: 1 + m_DefaultMobileRenderingPath: 1 + m_TierSettings: [] + m_LightmapStripping: 0 + m_FogStripping: 0 + m_InstancingStripping: 0 + m_LightmapKeepPlain: 1 + m_LightmapKeepDirCombined: 1 + m_LightmapKeepDynamicPlain: 1 + m_LightmapKeepDynamicDirCombined: 1 + m_LightmapKeepShadowMask: 1 + m_LightmapKeepSubtractive: 1 + m_FogKeepLinear: 1 + m_FogKeepExp: 1 + m_FogKeepExp2: 1 + m_AlbedoSwatchInfos: [] + m_LightsUseLinearIntensity: 0 + m_LightsUseColorTemperature: 0 + m_LogWhenShaderIsCompiled: 0 + m_AllowEnlightenSupportForUpgradedProject: 0 diff --git a/ProjectSettings/InputManager.asset b/ProjectSettings/InputManager.asset new file mode 100644 index 0000000..17c8f53 --- /dev/null +++ b/ProjectSettings/InputManager.asset @@ -0,0 +1,295 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!13 &1 +InputManager: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Axes: + - serializedVersion: 3 + m_Name: Horizontal + descriptiveName: + descriptiveNegativeName: + negativeButton: left + positiveButton: right + altNegativeButton: a + altPositiveButton: d + gravity: 3 + dead: 0.001 + sensitivity: 3 + snap: 1 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Vertical + descriptiveName: + descriptiveNegativeName: + negativeButton: down + positiveButton: up + altNegativeButton: s + altPositiveButton: w + gravity: 3 + dead: 0.001 + sensitivity: 3 + snap: 1 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire1 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: left ctrl + altNegativeButton: + altPositiveButton: mouse 0 + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire2 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: left alt + altNegativeButton: + altPositiveButton: mouse 1 + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire3 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: left shift + altNegativeButton: + altPositiveButton: mouse 2 + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Jump + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: space + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Mouse X + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: + altNegativeButton: + altPositiveButton: + gravity: 0 + dead: 0 + sensitivity: 0.1 + snap: 0 + invert: 0 + type: 1 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Mouse Y + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: + altNegativeButton: + altPositiveButton: + gravity: 0 + dead: 0 + sensitivity: 0.1 + snap: 0 + invert: 0 + type: 1 + axis: 1 + joyNum: 0 + - serializedVersion: 3 + m_Name: Mouse ScrollWheel + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: + altNegativeButton: + altPositiveButton: + gravity: 0 + dead: 0 + sensitivity: 0.1 + snap: 0 + invert: 0 + type: 1 + axis: 2 + joyNum: 0 + - serializedVersion: 3 + m_Name: Horizontal + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: + altNegativeButton: + altPositiveButton: + gravity: 0 + dead: 0.19 + sensitivity: 1 + snap: 0 + invert: 0 + type: 2 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Vertical + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: + altNegativeButton: + altPositiveButton: + gravity: 0 + dead: 0.19 + sensitivity: 1 + snap: 0 + invert: 1 + type: 2 + axis: 1 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire1 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: joystick button 0 + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire2 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: joystick button 1 + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire3 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: joystick button 2 + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Jump + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: joystick button 3 + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Submit + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: return + altNegativeButton: + altPositiveButton: joystick button 0 + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Submit + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: enter + altNegativeButton: + altPositiveButton: space + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Cancel + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: escape + altNegativeButton: + altPositiveButton: joystick button 1 + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 diff --git a/ProjectSettings/NavMeshAreas.asset b/ProjectSettings/NavMeshAreas.asset new file mode 100644 index 0000000..3b0b7c3 --- /dev/null +++ b/ProjectSettings/NavMeshAreas.asset @@ -0,0 +1,91 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!126 &1 +NavMeshProjectSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + areas: + - name: Walkable + cost: 1 + - name: Not Walkable + cost: 1 + - name: Jump + cost: 2 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + m_LastAgentTypeID: -887442657 + m_Settings: + - serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.75 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + debug: + m_Flags: 0 + m_SettingNames: + - Humanoid diff --git a/ProjectSettings/Physics2DSettings.asset b/ProjectSettings/Physics2DSettings.asset new file mode 100644 index 0000000..47880b1 --- /dev/null +++ b/ProjectSettings/Physics2DSettings.asset @@ -0,0 +1,56 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!19 &1 +Physics2DSettings: + m_ObjectHideFlags: 0 + serializedVersion: 4 + m_Gravity: {x: 0, y: -9.81} + m_DefaultMaterial: {fileID: 0} + m_VelocityIterations: 8 + m_PositionIterations: 3 + m_VelocityThreshold: 1 + m_MaxLinearCorrection: 0.2 + m_MaxAngularCorrection: 8 + m_MaxTranslationSpeed: 100 + m_MaxRotationSpeed: 360 + m_BaumgarteScale: 0.2 + m_BaumgarteTimeOfImpactScale: 0.75 + m_TimeToSleep: 0.5 + m_LinearSleepTolerance: 0.01 + m_AngularSleepTolerance: 2 + m_DefaultContactOffset: 0.01 + m_JobOptions: + serializedVersion: 2 + useMultithreading: 0 + useConsistencySorting: 0 + m_InterpolationPosesPerJob: 100 + m_NewContactsPerJob: 30 + m_CollideContactsPerJob: 100 + m_ClearFlagsPerJob: 200 + m_ClearBodyForcesPerJob: 200 + m_SyncDiscreteFixturesPerJob: 50 + m_SyncContinuousFixturesPerJob: 50 + m_FindNearestContactsPerJob: 100 + m_UpdateTriggerContactsPerJob: 100 + m_IslandSolverCostThreshold: 100 + m_IslandSolverBodyCostScale: 1 + m_IslandSolverContactCostScale: 10 + m_IslandSolverJointCostScale: 10 + m_IslandSolverBodiesPerJob: 50 + m_IslandSolverContactsPerJob: 50 + m_AutoSimulation: 1 + m_QueriesHitTriggers: 1 + m_QueriesStartInColliders: 1 + m_CallbacksOnDisable: 1 + m_ReuseCollisionCallbacks: 1 + m_AutoSyncTransforms: 0 + m_AlwaysShowColliders: 0 + m_ShowColliderSleep: 1 + m_ShowColliderContacts: 0 + m_ShowColliderAABB: 0 + m_ContactArrowScale: 0.2 + m_ColliderAwakeColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.7529412} + m_ColliderAsleepColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.36078432} + m_ColliderContactColor: {r: 1, g: 0, b: 1, a: 0.6862745} + m_ColliderAABBColor: {r: 1, g: 1, b: 0, a: 0.2509804} + m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff diff --git a/ProjectSettings/PresetManager.asset b/ProjectSettings/PresetManager.asset new file mode 100644 index 0000000..67a94da --- /dev/null +++ b/ProjectSettings/PresetManager.asset @@ -0,0 +1,7 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1386491679 &1 +PresetManager: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_DefaultPresets: {} diff --git a/ProjectSettings/ProjectSettings.asset b/ProjectSettings/ProjectSettings.asset new file mode 100644 index 0000000..2374e8d --- /dev/null +++ b/ProjectSettings/ProjectSettings.asset @@ -0,0 +1,766 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!129 &1 +PlayerSettings: + m_ObjectHideFlags: 0 + serializedVersion: 20 + productGUID: a129209969b7ac9409f6b21134fa9650 + AndroidProfiler: 0 + AndroidFilterTouchesWhenObscured: 0 + AndroidEnableSustainedPerformanceMode: 0 + defaultScreenOrientation: 4 + targetDevice: 2 + useOnDemandResources: 0 + accelerometerFrequency: 60 + companyName: dofdev + productName: fpsZencore + defaultCursor: {fileID: 0} + cursorHotspot: {x: 0, y: 0} + m_SplashScreenBackgroundColor: {r: 0.13725491, g: 0.12156863, b: 0.1254902, a: 1} + m_ShowUnitySplashScreen: 1 + m_ShowUnitySplashLogo: 1 + m_SplashScreenOverlayOpacity: 1 + m_SplashScreenAnimation: 1 + m_SplashScreenLogoStyle: 1 + m_SplashScreenDrawMode: 0 + m_SplashScreenBackgroundAnimationZoom: 1 + m_SplashScreenLogoAnimationZoom: 1 + m_SplashScreenBackgroundLandscapeAspect: 1 + m_SplashScreenBackgroundPortraitAspect: 1 + m_SplashScreenBackgroundLandscapeUvs: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + m_SplashScreenBackgroundPortraitUvs: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + m_SplashScreenLogos: [] + m_VirtualRealitySplashScreen: {fileID: 0} + m_HolographicTrackingLossScreen: {fileID: 0} + defaultScreenWidth: 1024 + defaultScreenHeight: 768 + defaultScreenWidthWeb: 960 + defaultScreenHeightWeb: 600 + m_StereoRenderingPath: 0 + m_ActiveColorSpace: 0 + m_MTRendering: 1 + m_StackTraceTypes: 010000000100000001000000010000000100000001000000 + iosShowActivityIndicatorOnLoading: -1 + androidShowActivityIndicatorOnLoading: -1 + iosUseCustomAppBackgroundBehavior: 0 + iosAllowHTTPDownload: 1 + allowedAutorotateToPortrait: 1 + allowedAutorotateToPortraitUpsideDown: 1 + allowedAutorotateToLandscapeRight: 1 + allowedAutorotateToLandscapeLeft: 1 + useOSAutorotation: 1 + use32BitDisplayBuffer: 1 + preserveFramebufferAlpha: 0 + disableDepthAndStencilBuffers: 0 + androidStartInFullscreen: 1 + androidRenderOutsideSafeArea: 1 + androidUseSwappy: 0 + androidBlitType: 0 + defaultIsNativeResolution: 1 + macRetinaSupport: 1 + runInBackground: 1 + captureSingleScreen: 0 + muteOtherAudioSources: 0 + Prepare IOS For Recording: 0 + Force IOS Speakers When Recording: 0 + deferSystemGesturesMode: 0 + hideHomeButton: 0 + submitAnalytics: 1 + usePlayerLog: 1 + bakeCollisionMeshes: 0 + forceSingleInstance: 0 + useFlipModelSwapchain: 1 + resizableWindow: 0 + useMacAppStoreValidation: 0 + macAppStoreCategory: public.app-category.games + gpuSkinning: 1 + xboxPIXTextureCapture: 0 + xboxEnableAvatar: 0 + xboxEnableKinect: 0 + xboxEnableKinectAutoTracking: 0 + xboxEnableFitness: 0 + visibleInBackground: 1 + allowFullscreenSwitch: 1 + fullscreenMode: 1 + xboxSpeechDB: 0 + xboxEnableHeadOrientation: 0 + xboxEnableGuest: 0 + xboxEnablePIXSampling: 0 + metalFramebufferOnly: 0 + xboxOneResolution: 0 + xboxOneSResolution: 0 + xboxOneXResolution: 3 + xboxOneMonoLoggingLevel: 0 + xboxOneLoggingLevel: 1 + xboxOneDisableEsram: 0 + xboxOnePresentImmediateThreshold: 0 + switchQueueCommandMemory: 0 + switchQueueControlMemory: 16384 + switchQueueComputeMemory: 262144 + switchNVNShaderPoolsGranularity: 33554432 + switchNVNDefaultPoolsGranularity: 16777216 + switchNVNOtherPoolsGranularity: 16777216 + vulkanNumSwapchainBuffers: 3 + vulkanEnableSetSRGBWrite: 0 + m_SupportedAspectRatios: + 4:3: 1 + 5:4: 1 + 16:10: 1 + 16:9: 1 + Others: 1 + bundleVersion: 0.1 + preloadedAssets: [] + metroInputSource: 0 + wsaTransparentSwapchain: 0 + m_HolographicPauseOnTrackingLoss: 1 + xboxOneDisableKinectGpuReservation: 1 + xboxOneEnable7thCore: 1 + vrSettings: + cardboard: + depthFormat: 0 + enableTransitionView: 0 + daydream: + depthFormat: 0 + useSustainedPerformanceMode: 0 + enableVideoLayer: 0 + useProtectedVideoMemory: 0 + minimumSupportedHeadTracking: 0 + maximumSupportedHeadTracking: 1 + hololens: + depthFormat: 1 + depthBufferSharingEnabled: 1 + lumin: + depthFormat: 0 + frameTiming: 2 + enableGLCache: 0 + glCacheMaxBlobSize: 524288 + glCacheMaxFileSize: 8388608 + oculus: + sharedDepthBuffer: 1 + dashSupport: 1 + lowOverheadMode: 0 + protectedContext: 0 + v2Signing: 1 + enable360StereoCapture: 0 + isWsaHolographicRemotingEnabled: 0 + enableFrameTimingStats: 0 + useHDRDisplay: 0 + D3DHDRBitDepth: 0 + m_ColorGamuts: 00000000 + targetPixelDensity: 30 + resolutionScalingMode: 0 + androidSupportedAspectRatio: 1 + androidMaxAspectRatio: 2.1 + applicationIdentifier: {} + buildNumber: {} + AndroidBundleVersionCode: 1 + AndroidMinSdkVersion: 19 + AndroidTargetSdkVersion: 0 + AndroidPreferredInstallLocation: 0 + aotOptions: + stripEngineCode: 1 + iPhoneStrippingLevel: 0 + iPhoneScriptCallOptimization: 0 + ForceInternetPermission: 0 + ForceSDCardPermission: 0 + CreateWallpaper: 0 + APKExpansionFiles: 0 + keepLoadedShadersAlive: 0 + StripUnusedMeshComponents: 1 + VertexChannelCompressionMask: 4054 + iPhoneSdkVersion: 988 + iOSTargetOSVersionString: 10.0 + tvOSSdkVersion: 0 + tvOSRequireExtendedGameController: 0 + tvOSTargetOSVersionString: 10.0 + uIPrerenderedIcon: 0 + uIRequiresPersistentWiFi: 0 + uIRequiresFullScreen: 1 + uIStatusBarHidden: 1 + uIExitOnSuspend: 0 + uIStatusBarStyle: 0 + iPhoneSplashScreen: {fileID: 0} + iPhoneHighResSplashScreen: {fileID: 0} + iPhoneTallHighResSplashScreen: {fileID: 0} + iPhone47inSplashScreen: {fileID: 0} + iPhone55inPortraitSplashScreen: {fileID: 0} + iPhone55inLandscapeSplashScreen: {fileID: 0} + iPhone58inPortraitSplashScreen: {fileID: 0} + iPhone58inLandscapeSplashScreen: {fileID: 0} + iPadPortraitSplashScreen: {fileID: 0} + iPadHighResPortraitSplashScreen: {fileID: 0} + iPadLandscapeSplashScreen: {fileID: 0} + iPadHighResLandscapeSplashScreen: {fileID: 0} + iPhone65inPortraitSplashScreen: {fileID: 0} + iPhone65inLandscapeSplashScreen: {fileID: 0} + iPhone61inPortraitSplashScreen: {fileID: 0} + iPhone61inLandscapeSplashScreen: {fileID: 0} + appleTVSplashScreen: {fileID: 0} + appleTVSplashScreen2x: {fileID: 0} + tvOSSmallIconLayers: [] + tvOSSmallIconLayers2x: [] + tvOSLargeIconLayers: [] + tvOSLargeIconLayers2x: [] + tvOSTopShelfImageLayers: [] + tvOSTopShelfImageLayers2x: [] + tvOSTopShelfImageWideLayers: [] + tvOSTopShelfImageWideLayers2x: [] + iOSLaunchScreenType: 0 + iOSLaunchScreenPortrait: {fileID: 0} + iOSLaunchScreenLandscape: {fileID: 0} + iOSLaunchScreenBackgroundColor: + serializedVersion: 2 + rgba: 0 + iOSLaunchScreenFillPct: 100 + iOSLaunchScreenSize: 100 + iOSLaunchScreenCustomXibPath: + iOSLaunchScreeniPadType: 0 + iOSLaunchScreeniPadImage: {fileID: 0} + iOSLaunchScreeniPadBackgroundColor: + serializedVersion: 2 + rgba: 0 + iOSLaunchScreeniPadFillPct: 100 + iOSLaunchScreeniPadSize: 100 + iOSLaunchScreeniPadCustomXibPath: + iOSUseLaunchScreenStoryboard: 0 + iOSLaunchScreenCustomStoryboardPath: + iOSDeviceRequirements: [] + iOSURLSchemes: [] + iOSBackgroundModes: 0 + iOSMetalForceHardShadows: 0 + metalEditorSupport: 1 + metalAPIValidation: 1 + iOSRenderExtraFrameOnPause: 0 + appleDeveloperTeamID: + iOSManualSigningProvisioningProfileID: + tvOSManualSigningProvisioningProfileID: + iOSManualSigningProvisioningProfileType: 0 + tvOSManualSigningProvisioningProfileType: 0 + appleEnableAutomaticSigning: 0 + iOSRequireARKit: 0 + iOSAutomaticallyDetectAndAddCapabilities: 1 + appleEnableProMotion: 0 + clonedFromGUID: c0afd0d1d80e3634a9dac47e8a0426ea + templatePackageId: com.unity.template.3d@4.2.5 + templateDefaultScene: Assets/Scenes/SampleScene.unity + AndroidTargetArchitectures: 1 + AndroidSplashScreenScale: 0 + androidSplashScreen: {fileID: 0} + AndroidKeystoreName: + AndroidKeyaliasName: + AndroidBuildApkPerCpuArchitecture: 0 + AndroidTVCompatibility: 0 + AndroidIsGame: 1 + AndroidEnableTango: 0 + androidEnableBanner: 1 + androidUseLowAccuracyLocation: 0 + androidUseCustomKeystore: 0 + m_AndroidBanners: + - width: 320 + height: 180 + banner: {fileID: 0} + androidGamepadSupportLevel: 0 + AndroidValidateAppBundleSize: 1 + AndroidAppBundleSizeToValidate: 150 + m_BuildTargetIcons: [] + m_BuildTargetPlatformIcons: + - m_BuildTarget: Android + m_Icons: + - m_Textures: [] + m_Width: 432 + m_Height: 432 + m_Kind: 2 + m_SubKind: + - m_Textures: [] + m_Width: 324 + m_Height: 324 + m_Kind: 2 + m_SubKind: + - m_Textures: [] + m_Width: 216 + m_Height: 216 + m_Kind: 2 + m_SubKind: + - m_Textures: [] + m_Width: 162 + m_Height: 162 + m_Kind: 2 + m_SubKind: + - m_Textures: [] + m_Width: 108 + m_Height: 108 + m_Kind: 2 + m_SubKind: + - m_Textures: [] + m_Width: 81 + m_Height: 81 + m_Kind: 2 + m_SubKind: + - m_Textures: [] + m_Width: 192 + m_Height: 192 + m_Kind: 0 + m_SubKind: + - m_Textures: [] + m_Width: 144 + m_Height: 144 + m_Kind: 0 + m_SubKind: + - m_Textures: [] + m_Width: 96 + m_Height: 96 + m_Kind: 0 + m_SubKind: + - m_Textures: [] + m_Width: 72 + m_Height: 72 + m_Kind: 0 + m_SubKind: + - m_Textures: [] + m_Width: 48 + m_Height: 48 + m_Kind: 0 + m_SubKind: + - m_Textures: [] + m_Width: 36 + m_Height: 36 + m_Kind: 0 + m_SubKind: + - m_Textures: [] + m_Width: 192 + m_Height: 192 + m_Kind: 1 + m_SubKind: + - m_Textures: [] + m_Width: 144 + m_Height: 144 + m_Kind: 1 + m_SubKind: + - m_Textures: [] + m_Width: 96 + m_Height: 96 + m_Kind: 1 + m_SubKind: + - m_Textures: [] + m_Width: 72 + m_Height: 72 + m_Kind: 1 + m_SubKind: + - m_Textures: [] + m_Width: 48 + m_Height: 48 + m_Kind: 1 + m_SubKind: + - m_Textures: [] + m_Width: 36 + m_Height: 36 + m_Kind: 1 + m_SubKind: + m_BuildTargetBatching: + - m_BuildTarget: Standalone + m_StaticBatching: 1 + m_DynamicBatching: 0 + - m_BuildTarget: tvOS + m_StaticBatching: 1 + m_DynamicBatching: 0 + - m_BuildTarget: Android + m_StaticBatching: 1 + m_DynamicBatching: 0 + - m_BuildTarget: iPhone + m_StaticBatching: 1 + m_DynamicBatching: 0 + - m_BuildTarget: WebGL + m_StaticBatching: 0 + m_DynamicBatching: 0 + m_BuildTargetGraphicsJobs: + - m_BuildTarget: MacStandaloneSupport + m_GraphicsJobs: 0 + - m_BuildTarget: Switch + m_GraphicsJobs: 1 + - m_BuildTarget: MetroSupport + m_GraphicsJobs: 1 + - m_BuildTarget: AppleTVSupport + m_GraphicsJobs: 0 + - m_BuildTarget: BJMSupport + m_GraphicsJobs: 1 + - m_BuildTarget: LinuxStandaloneSupport + m_GraphicsJobs: 1 + - m_BuildTarget: PS4Player + m_GraphicsJobs: 1 + - m_BuildTarget: iOSSupport + m_GraphicsJobs: 0 + - m_BuildTarget: WindowsStandaloneSupport + m_GraphicsJobs: 1 + - m_BuildTarget: XboxOnePlayer + m_GraphicsJobs: 1 + - m_BuildTarget: LuminSupport + m_GraphicsJobs: 0 + - m_BuildTarget: AndroidPlayer + m_GraphicsJobs: 0 + - m_BuildTarget: WebGLSupport + m_GraphicsJobs: 0 + m_BuildTargetGraphicsJobMode: + - m_BuildTarget: PS4Player + m_GraphicsJobMode: 0 + - m_BuildTarget: XboxOnePlayer + m_GraphicsJobMode: 0 + m_BuildTargetGraphicsAPIs: + - m_BuildTarget: AndroidPlayer + m_APIs: 0b00000008000000 + m_Automatic: 1 + - m_BuildTarget: iOSSupport + m_APIs: 10000000 + m_Automatic: 1 + - m_BuildTarget: AppleTVSupport + m_APIs: 10000000 + m_Automatic: 0 + - m_BuildTarget: WebGLSupport + m_APIs: 0b000000 + m_Automatic: 1 + m_BuildTargetVRSettings: + - m_BuildTarget: Standalone + m_Enabled: 0 + m_Devices: + - Oculus + - OpenVR + openGLRequireES31: 0 + openGLRequireES31AEP: 0 + openGLRequireES32: 0 + m_TemplateCustomTags: {} + mobileMTRendering: + Android: 1 + iPhone: 1 + tvOS: 1 + m_BuildTargetGroupLightmapEncodingQuality: [] + m_BuildTargetGroupLightmapSettings: [] + playModeTestRunnerEnabled: 0 + runPlayModeTestAsEditModeTest: 0 + actionOnDotNetUnhandledException: 1 + enableInternalProfiler: 0 + logObjCUncaughtExceptions: 1 + enableCrashReportAPI: 0 + cameraUsageDescription: + locationUsageDescription: + microphoneUsageDescription: + switchNetLibKey: + switchSocketMemoryPoolSize: 6144 + switchSocketAllocatorPoolSize: 128 + switchSocketConcurrencyLimit: 14 + switchScreenResolutionBehavior: 2 + switchUseCPUProfiler: 0 + switchApplicationID: 0x01004b9000490000 + switchNSODependencies: + switchTitleNames_0: + switchTitleNames_1: + switchTitleNames_2: + switchTitleNames_3: + switchTitleNames_4: + switchTitleNames_5: + switchTitleNames_6: + switchTitleNames_7: + switchTitleNames_8: + switchTitleNames_9: + switchTitleNames_10: + switchTitleNames_11: + switchTitleNames_12: + switchTitleNames_13: + switchTitleNames_14: + switchPublisherNames_0: + switchPublisherNames_1: + switchPublisherNames_2: + switchPublisherNames_3: + switchPublisherNames_4: + switchPublisherNames_5: + switchPublisherNames_6: + switchPublisherNames_7: + switchPublisherNames_8: + switchPublisherNames_9: + switchPublisherNames_10: + switchPublisherNames_11: + switchPublisherNames_12: + switchPublisherNames_13: + switchPublisherNames_14: + switchIcons_0: {fileID: 0} + switchIcons_1: {fileID: 0} + switchIcons_2: {fileID: 0} + switchIcons_3: {fileID: 0} + switchIcons_4: {fileID: 0} + switchIcons_5: {fileID: 0} + switchIcons_6: {fileID: 0} + switchIcons_7: {fileID: 0} + switchIcons_8: {fileID: 0} + switchIcons_9: {fileID: 0} + switchIcons_10: {fileID: 0} + switchIcons_11: {fileID: 0} + switchIcons_12: {fileID: 0} + switchIcons_13: {fileID: 0} + switchIcons_14: {fileID: 0} + switchSmallIcons_0: {fileID: 0} + switchSmallIcons_1: {fileID: 0} + switchSmallIcons_2: {fileID: 0} + switchSmallIcons_3: {fileID: 0} + switchSmallIcons_4: {fileID: 0} + switchSmallIcons_5: {fileID: 0} + switchSmallIcons_6: {fileID: 0} + switchSmallIcons_7: {fileID: 0} + switchSmallIcons_8: {fileID: 0} + switchSmallIcons_9: {fileID: 0} + switchSmallIcons_10: {fileID: 0} + switchSmallIcons_11: {fileID: 0} + switchSmallIcons_12: {fileID: 0} + switchSmallIcons_13: {fileID: 0} + switchSmallIcons_14: {fileID: 0} + switchManualHTML: + switchAccessibleURLs: + switchLegalInformation: + switchMainThreadStackSize: 1048576 + switchPresenceGroupId: + switchLogoHandling: 0 + switchReleaseVersion: 0 + switchDisplayVersion: 1.0.0 + switchStartupUserAccount: 0 + switchTouchScreenUsage: 0 + switchSupportedLanguagesMask: 0 + switchLogoType: 0 + switchApplicationErrorCodeCategory: + switchUserAccountSaveDataSize: 0 + switchUserAccountSaveDataJournalSize: 0 + switchApplicationAttribute: 0 + switchCardSpecSize: -1 + switchCardSpecClock: -1 + switchRatingsMask: 0 + switchRatingsInt_0: 0 + switchRatingsInt_1: 0 + switchRatingsInt_2: 0 + switchRatingsInt_3: 0 + switchRatingsInt_4: 0 + switchRatingsInt_5: 0 + switchRatingsInt_6: 0 + switchRatingsInt_7: 0 + switchRatingsInt_8: 0 + switchRatingsInt_9: 0 + switchRatingsInt_10: 0 + switchRatingsInt_11: 0 + switchRatingsInt_12: 0 + switchLocalCommunicationIds_0: + switchLocalCommunicationIds_1: + switchLocalCommunicationIds_2: + switchLocalCommunicationIds_3: + switchLocalCommunicationIds_4: + switchLocalCommunicationIds_5: + switchLocalCommunicationIds_6: + switchLocalCommunicationIds_7: + switchParentalControl: 0 + switchAllowsScreenshot: 1 + switchAllowsVideoCapturing: 1 + switchAllowsRuntimeAddOnContentInstall: 0 + switchDataLossConfirmation: 0 + switchUserAccountLockEnabled: 0 + switchSystemResourceMemory: 16777216 + switchSupportedNpadStyles: 22 + switchNativeFsCacheSize: 32 + switchIsHoldTypeHorizontal: 0 + switchSupportedNpadCount: 8 + switchSocketConfigEnabled: 0 + switchTcpInitialSendBufferSize: 32 + switchTcpInitialReceiveBufferSize: 64 + switchTcpAutoSendBufferSizeMax: 256 + switchTcpAutoReceiveBufferSizeMax: 256 + switchUdpSendBufferSize: 9 + switchUdpReceiveBufferSize: 42 + switchSocketBufferEfficiency: 4 + switchSocketInitializeEnabled: 1 + switchNetworkInterfaceManagerInitializeEnabled: 1 + switchPlayerConnectionEnabled: 1 + ps4NPAgeRating: 12 + ps4NPTitleSecret: + ps4NPTrophyPackPath: + ps4ParentalLevel: 11 + ps4ContentID: ED1633-NPXX51362_00-0000000000000000 + ps4Category: 0 + ps4MasterVersion: 01.00 + ps4AppVersion: 01.00 + ps4AppType: 0 + ps4ParamSfxPath: + ps4VideoOutPixelFormat: 0 + ps4VideoOutInitialWidth: 1920 + ps4VideoOutBaseModeInitialWidth: 1920 + ps4VideoOutReprojectionRate: 60 + ps4PronunciationXMLPath: + ps4PronunciationSIGPath: + ps4BackgroundImagePath: + ps4StartupImagePath: + ps4StartupImagesFolder: + ps4IconImagesFolder: + ps4SaveDataImagePath: + ps4SdkOverride: + ps4BGMPath: + ps4ShareFilePath: + ps4ShareOverlayImagePath: + ps4PrivacyGuardImagePath: + ps4NPtitleDatPath: + ps4RemotePlayKeyAssignment: -1 + ps4RemotePlayKeyMappingDir: + ps4PlayTogetherPlayerCount: 0 + ps4EnterButtonAssignment: 1 + ps4ApplicationParam1: 0 + ps4ApplicationParam2: 0 + ps4ApplicationParam3: 0 + ps4ApplicationParam4: 0 + ps4DownloadDataSize: 0 + ps4GarlicHeapSize: 2048 + ps4ProGarlicHeapSize: 2560 + playerPrefsMaxSize: 32768 + ps4Passcode: frAQBc8Wsa1xVPfvJcrgRYwTiizs2trQ + ps4pnSessions: 1 + ps4pnPresence: 1 + ps4pnFriends: 1 + ps4pnGameCustomData: 1 + playerPrefsSupport: 0 + enableApplicationExit: 0 + resetTempFolder: 1 + restrictedAudioUsageRights: 0 + ps4UseResolutionFallback: 0 + ps4ReprojectionSupport: 0 + ps4UseAudio3dBackend: 0 + ps4SocialScreenEnabled: 0 + ps4ScriptOptimizationLevel: 0 + ps4Audio3dVirtualSpeakerCount: 14 + ps4attribCpuUsage: 0 + ps4PatchPkgPath: + ps4PatchLatestPkgPath: + ps4PatchChangeinfoPath: + ps4PatchDayOne: 0 + ps4attribUserManagement: 0 + ps4attribMoveSupport: 0 + ps4attrib3DSupport: 0 + ps4attribShareSupport: 0 + ps4attribExclusiveVR: 0 + ps4disableAutoHideSplash: 0 + ps4videoRecordingFeaturesUsed: 0 + ps4contentSearchFeaturesUsed: 0 + ps4attribEyeToEyeDistanceSettingVR: 0 + ps4IncludedModules: [] + ps4attribVROutputEnabled: 0 + monoEnv: + splashScreenBackgroundSourceLandscape: {fileID: 0} + splashScreenBackgroundSourcePortrait: {fileID: 0} + blurSplashScreenBackground: 1 + spritePackerPolicy: + webGLMemorySize: 16 + webGLExceptionSupport: 1 + webGLNameFilesAsHashes: 0 + webGLDataCaching: 1 + webGLDebugSymbols: 0 + webGLEmscriptenArgs: + webGLModulesDirectory: + webGLTemplate: APPLICATION:Default + webGLAnalyzeBuildSize: 0 + webGLUseEmbeddedResources: 0 + webGLCompressionFormat: 1 + webGLLinkerTarget: 1 + webGLThreadsSupport: 0 + webGLWasmStreaming: 0 + scriptingDefineSymbols: {} + platformArchitecture: {} + scriptingBackend: {} + il2cppCompilerConfiguration: {} + managedStrippingLevel: {} + incrementalIl2cppBuild: {} + allowUnsafeCode: 0 + additionalIl2CppArgs: + scriptingRuntimeVersion: 1 + gcIncremental: 0 + gcWBarrierValidation: 0 + apiCompatibilityLevelPerPlatform: + Standalone: 3 + m_RenderingPath: 1 + m_MobileRenderingPath: 1 + metroPackageName: Template_3D + metroPackageVersion: + metroCertificatePath: + metroCertificatePassword: + metroCertificateSubject: + metroCertificateIssuer: + metroCertificateNotAfter: 0000000000000000 + metroApplicationDescription: Template_3D + wsaImages: {} + metroTileShortName: + metroTileShowName: 0 + metroMediumTileShowName: 0 + metroLargeTileShowName: 0 + metroWideTileShowName: 0 + metroSupportStreamingInstall: 0 + metroLastRequiredScene: 0 + metroDefaultTileSize: 1 + metroTileForegroundText: 2 + metroTileBackgroundColor: {r: 0.13333334, g: 0.17254902, b: 0.21568628, a: 0} + metroSplashScreenBackgroundColor: {r: 0.12941177, g: 0.17254902, b: 0.21568628, + a: 1} + metroSplashScreenUseBackgroundColor: 0 + platformCapabilities: {} + metroTargetDeviceFamilies: {} + metroFTAName: + metroFTAFileTypes: [] + metroProtocolName: + XboxOneProductId: + XboxOneUpdateKey: + XboxOneSandboxId: + XboxOneContentId: + XboxOneTitleId: + XboxOneSCId: + XboxOneGameOsOverridePath: + XboxOnePackagingOverridePath: + XboxOneAppManifestOverridePath: + XboxOneVersion: 1.0.0.0 + XboxOnePackageEncryption: 0 + XboxOnePackageUpdateGranularity: 2 + XboxOneDescription: + XboxOneLanguage: + - enus + XboxOneCapability: [] + XboxOneGameRating: {} + XboxOneIsContentPackage: 0 + XboxOneEnableGPUVariability: 1 + XboxOneSockets: {} + XboxOneSplashScreen: {fileID: 0} + XboxOneAllowedProductIds: [] + XboxOnePersistentLocalStorageSize: 0 + XboxOneXTitleMemory: 8 + XboxOneOverrideIdentityName: + vrEditorSettings: + daydream: + daydreamIconForeground: {fileID: 0} + daydreamIconBackground: {fileID: 0} + cloudServicesEnabled: + UNet: 1 + luminIcon: + m_Name: + m_ModelFolderPath: + m_PortalFolderPath: + luminCert: + m_CertPath: + m_SignPackage: 1 + luminIsChannelApp: 0 + luminVersion: + m_VersionCode: 1 + m_VersionName: + apiCompatibilityLevel: 6 + cloudProjectId: + framebufferDepthMemorylessMode: 0 + projectName: + organizationId: + cloudEnabled: 0 + enableNativePlatformBackendsForNewInputSystem: 0 + disableOldInputManagerSupport: 0 + legacyClampBlendShapeWeights: 0 diff --git a/ProjectSettings/ProjectVersion.txt b/ProjectSettings/ProjectVersion.txt new file mode 100644 index 0000000..f66c2e7 --- /dev/null +++ b/ProjectSettings/ProjectVersion.txt @@ -0,0 +1,2 @@ +m_EditorVersion: 2019.3.0f3 +m_EditorVersionWithRevision: 2019.3.0f3 (6c9e2bfd6f81) diff --git a/ProjectSettings/QualitySettings.asset b/ProjectSettings/QualitySettings.asset new file mode 100644 index 0000000..5500be2 --- /dev/null +++ b/ProjectSettings/QualitySettings.asset @@ -0,0 +1,58 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!47 &1 +QualitySettings: + m_ObjectHideFlags: 0 + serializedVersion: 5 + m_CurrentQuality: 0 + m_QualitySettings: + - serializedVersion: 2 + name: Ultra + pixelLightCount: 4 + shadows: 0 + shadowResolution: 2 + shadowProjection: 1 + shadowCascades: 1 + shadowDistance: 150 + shadowNearPlaneOffset: 3 + shadowCascade2Split: 0.33333334 + shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} + shadowmaskMode: 1 + skinWeights: 4 + textureQuality: 0 + anisotropicTextures: 2 + antiAliasing: 0 + softParticles: 0 + softVegetation: 1 + realtimeReflectionProbes: 1 + billboardsFaceCameraPosition: 1 + vSyncCount: 1 + lodBias: 2 + maximumLODLevel: 0 + streamingMipmapsActive: 0 + streamingMipmapsAddAllCameras: 1 + streamingMipmapsMemoryBudget: 512 + streamingMipmapsRenderersPerFrame: 512 + streamingMipmapsMaxLevelReduction: 2 + streamingMipmapsMaxFileIORequests: 1024 + particleRaycastBudget: 4096 + asyncUploadTimeSlice: 2 + asyncUploadBufferSize: 16 + asyncUploadPersistentBuffer: 1 + resolutionScalingFixedDPIFactor: 1 + customRenderPipeline: {fileID: 0} + excludedTargetPlatforms: [] + m_PerPlatformDefaultQuality: + Android: 0 + Lumin: 0 + Nintendo 3DS: 0 + Nintendo Switch: 0 + PS4: 0 + PSP2: 0 + Stadia: 0 + Standalone: 0 + WebGL: 0 + Windows Store Apps: 0 + XboxOne: 0 + iPhone: 0 + tvOS: 0 diff --git a/ProjectSettings/TagManager.asset b/ProjectSettings/TagManager.asset new file mode 100644 index 0000000..1de20ac --- /dev/null +++ b/ProjectSettings/TagManager.asset @@ -0,0 +1,44 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!78 &1 +TagManager: + serializedVersion: 2 + tags: + - Monolith + layers: + - Default + - TransparentFX + - Ignore Raycast + - + - Water + - UI + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + m_SortingLayers: + - name: Default + uniqueID: 0 + locked: 0 diff --git a/ProjectSettings/TimeManager.asset b/ProjectSettings/TimeManager.asset new file mode 100644 index 0000000..558a017 --- /dev/null +++ b/ProjectSettings/TimeManager.asset @@ -0,0 +1,9 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!5 &1 +TimeManager: + m_ObjectHideFlags: 0 + Fixed Timestep: 0.02 + Maximum Allowed Timestep: 0.33333334 + m_TimeScale: 1 + Maximum Particle Timestep: 0.03 diff --git a/ProjectSettings/UnityConnectSettings.asset b/ProjectSettings/UnityConnectSettings.asset new file mode 100644 index 0000000..fa0b146 --- /dev/null +++ b/ProjectSettings/UnityConnectSettings.asset @@ -0,0 +1,34 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!310 &1 +UnityConnectSettings: + m_ObjectHideFlags: 0 + serializedVersion: 1 + m_Enabled: 0 + m_TestMode: 0 + m_EventOldUrl: https://api.uca.cloud.unity3d.com/v1/events + m_EventUrl: https://cdp.cloud.unity3d.com/v1/events + m_ConfigUrl: https://config.uca.cloud.unity3d.com + m_TestInitMode: 0 + CrashReportingSettings: + m_EventUrl: https://perf-events.cloud.unity3d.com + m_Enabled: 0 + m_LogBufferSize: 10 + m_CaptureEditorExceptions: 1 + UnityPurchasingSettings: + m_Enabled: 0 + m_TestMode: 0 + UnityAnalyticsSettings: + m_Enabled: 0 + m_TestMode: 0 + m_InitializeOnStartup: 1 + UnityAdsSettings: + m_Enabled: 0 + m_InitializeOnStartup: 1 + m_TestMode: 0 + m_IosGameId: + m_AndroidGameId: + m_GameIds: {} + m_GameId: + PerformanceReportingSettings: + m_Enabled: 0 diff --git a/ProjectSettings/VFXManager.asset b/ProjectSettings/VFXManager.asset new file mode 100644 index 0000000..3a95c98 --- /dev/null +++ b/ProjectSettings/VFXManager.asset @@ -0,0 +1,12 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!937362698 &1 +VFXManager: + m_ObjectHideFlags: 0 + m_IndirectShader: {fileID: 0} + m_CopyBufferShader: {fileID: 0} + m_SortShader: {fileID: 0} + m_StripUpdateShader: {fileID: 0} + m_RenderPipeSettingsPath: + m_FixedTimeStep: 0.016666668 + m_MaxDeltaTime: 0.05 diff --git a/ProjectSettings/XRSettings.asset b/ProjectSettings/XRSettings.asset new file mode 100644 index 0000000..dcdcc12 --- /dev/null +++ b/ProjectSettings/XRSettings.asset @@ -0,0 +1,10 @@ +{ + "m_SettingKeys": [ + "VR Device Disabled", + "VR Device User Alert" + ], + "m_SettingValues": [ + "True", + "False" + ] +} \ No newline at end of file