Skip to content

Commit

Permalink
[directxmesh, directxtex, directxtk(12), uvatlas] Updated for October…
Browse files Browse the repository at this point in the history
… 2024 releases (#41878)
  • Loading branch information
walbourn authored Nov 4, 2024
1 parent ee27d75 commit 0f16cea
Show file tree
Hide file tree
Showing 22 changed files with 425 additions and 36 deletions.
8 changes: 4 additions & 4 deletions ports/directxmesh/portfile.cmake
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
set(DIRECTXMESH_TAG sep2024)
set(DIRECTXMESH_TAG oct2024)

vcpkg_check_linkage(ONLY_STATIC_LIBRARY)

vcpkg_from_github(
OUT_SOURCE_PATH SOURCE_PATH
REPO Microsoft/DirectXMesh
REF ${DIRECTXMESH_TAG}
SHA512 ea0f39c14613e60e967eaea2735f73730a1c79f9fdd9b3d799b6c765843804dd7c002dedac8f566989bac99dc41dfa9b1a9a14e141a0917f888d3e3c6ecf47cb
SHA512 a7d6eca75315a8f24fdc7753fd0e0b26b1b170ef0ffa1954065164f5da567ba09d1605c45cae91cf73dccc04f52162c3ad62f6a83eddf33c076e6ffb4723276d
HEAD_REF main
)

Expand Down Expand Up @@ -41,7 +41,7 @@ if("tools" IN_LIST FEATURES)
MESHCONVERT_EXE
URLS "https://github.com/Microsoft/DirectXMesh/releases/download/${DIRECTXMESH_TAG}/meshconvert.exe"
FILENAME "meshconvert-${DIRECTXMESH_TAG}.exe"
SHA512 f7cfd5d89d92bfe9e6b58691444b9b49e42b88b721f52abe40af4a090f3ff45476727116131fae2d4bbb74e81ff7d998ccbdb01bb037391d743e44823c490786
SHA512 6b437004ee3b8a44d475db51f01558d777bf3c65b1ea132606b9b682ab6310dbdf0c939ecdf7b621255b6130a424de6db368dd73b8d22393bd932342fd3f45e0
)

file(INSTALL
Expand All @@ -56,7 +56,7 @@ if("tools" IN_LIST FEATURES)
MESHCONVERT_EXE
URLS "https://github.com/Microsoft/DirectXMesh/releases/download/${DIRECTXMESH_TAG}/meshconvert_arm64.exe"
FILENAME "meshconvert-${DIRECTXMESH_TAG}-arm64.exe"
SHA512 71d677b95fa964dc3a6d3e3804fa86fb86ec0a5165045baeb42fa4e025c68806edf4cb737906f1f4287e877d5443eda9e5c38e51a9aa62c76ba84f68ba48c69e
SHA512 e4f9eb983ea6cfbf18c342d5f1a52210d933ca6bbe7fe5dbca4fee516106f02ac4936804ab222c337ac42eb809c16f06132d51ffa44fb67315c2f28f282afdf3
)

file(INSTALL
Expand Down
2 changes: 1 addition & 1 deletion ports/directxmesh/vcpkg.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "directxmesh",
"version-date": "2024-09-04",
"version-date": "2024-10-28",
"description": "DirectXMesh geometry processing library",
"homepage": "https://github.com/Microsoft/DirectXMesh",
"documentation": "https://github.com/microsoft/DirectXMesh/wiki",
Expand Down
284 changes: 284 additions & 0 deletions ports/directxtex/FixStdByteAndCMake.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,284 @@
diff --git a/Auxiliary/DirectXTexXbox.h b/Auxiliary/DirectXTexXbox.h
index 0829c8f..9f75866 100644
--- a/Auxiliary/DirectXTexXbox.h
+++ b/Auxiliary/DirectXTexXbox.h
@@ -132,6 +132,39 @@ namespace Xbox
HRESULT __cdecl SaveToDDSMemory(_In_ const XboxImage& xbox, _Out_ DirectX::Blob& blob);
HRESULT __cdecl SaveToDDSFile(_In_ const XboxImage& xbox, _In_z_ const wchar_t* szFile);

+#ifdef __cpp_lib_byte
+ inline HRESULT __cdecl GetMetadataFromDDSMemory(
+ _In_reads_bytes_(size) const std::byte* pSource, _In_ size_t size,
+ _Out_ DirectX::TexMetadata& metadata, _Out_ bool& isXbox)
+ {
+ return GetMetadataFromDDSMemory(reinterpret_cast<const uint8_t*>(pSource), size, metadata, isXbox);
+ }
+
+ inline HRESULT __cdecl GetMetadataFromDDSMemoryEx(
+ _In_reads_bytes_(size) const std::byte* pSource, _In_ size_t size,
+ _Out_ DirectX::TexMetadata& metadata, _Out_ bool& isXbox,
+ _Out_opt_ DirectX::DDSMetaData* ddPixelFormat)
+ {
+ return GetMetadataFromDDSMemoryEx(reinterpret_cast<const uint8_t*>(pSource), size, metadata, isXbox, ddPixelFormat);
+ }
+
+ inline HRESULT __cdecl LoadFromDDSMemory(
+ _In_reads_bytes_(size) const std::byte* pSource, _In_ size_t size,
+ _Out_opt_ DirectX::TexMetadata* metadata, _Out_ XboxImage& image)
+ {
+ return LoadFromDDSMemory(reinterpret_cast<const uint8_t*>(pSource), size, metadata, image);
+ }
+
+ inline HRESULT __cdecl LoadFromDDSMemoryEx(
+ _In_reads_bytes_(size) const std::byte* pSource, _In_ size_t size,
+ _Out_opt_ DirectX::TexMetadata* metadata,
+ _Out_opt_ DirectX::DDSMetaData* ddPixelFormat,
+ _Out_ XboxImage& image)
+ {
+ return LoadFromDDSMemoryEx(reinterpret_cast<const uint8_t*>(pSource), size, metadata, ddPixelFormat, image);
+ }
+#endif // __cpp_lib_byte
+
//---------------------------------------------------------------------------------
// Xbox Texture Tiling / Detiling (requires XG DLL to be present at runtime)

@@ -178,4 +211,20 @@ namespace Xbox
const XboxImage& xbox,
_Out_writes_bytes_(maxsize) uint8_t* pDestination, _In_ size_t maxsize) noexcept;

+#ifdef __cpp_lib_byte
+ inline HRESULT __cdecl EncodeDDSHeader(
+ const XboxImage& xbox,
+ _Out_writes_bytes_(maxsize) std::byte* pDestination, _In_ size_t maxsize) noexcept
+ {
+ return EncodeDDSHeader(xbox, reinterpret_cast<uint8_t*>(pDestination), maxsize);
+ }
+
+ inline HRESULT __cdecl EncodeDDSHeader(
+ const XboxImage& xbox,
+ _Reserved_ std::nullptr_t, _In_ size_t maxsize) noexcept
+ {
+ return EncodeDDSHeader(xbox, static_cast<uint8_t*>(nullptr), maxsize);
+ }
+#endif
+
} // namespace
diff --git a/CMakeLists.txt b/CMakeLists.txt
index cffe5ca..e26b5a1 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -311,7 +311,11 @@ endif()

if(MINGW OR (NOT WIN32))
find_package(directxmath CONFIG REQUIRED)
+ target_link_libraries(${PROJECT_NAME} PUBLIC Microsoft::DirectXMath)
+
find_package(directx-headers CONFIG REQUIRED)
+ target_link_libraries(${PROJECT_NAME} PUBLIC Microsoft::DirectX-Headers)
+ target_compile_definitions(${PROJECT_NAME} PUBLIC USING_DIRECTX_HEADERS)
else()
find_package(directxmath CONFIG QUIET)
find_package(directx-headers CONFIG QUIET)
@@ -319,13 +323,13 @@ endif()

if(directxmath_FOUND)
message(STATUS "Using DirectXMath package")
- target_link_libraries(${PROJECT_NAME} PUBLIC Microsoft::DirectXMath)
+ target_link_libraries(${PROJECT_NAME} PRIVATE Microsoft::DirectXMath)
endif()

if(directx-headers_FOUND)
message(STATUS "Using DirectX-Headers package")
- target_link_libraries(${PROJECT_NAME} PUBLIC Microsoft::DirectX-Headers)
- target_compile_definitions(${PROJECT_NAME} PUBLIC USING_DIRECTX_HEADERS)
+ target_link_libraries(${PROJECT_NAME} PRIVATE Microsoft::DirectX-Headers)
+ target_compile_definitions(${PROJECT_NAME} PRIVATE USING_DIRECTX_HEADERS)
target_compile_options(${PROJECT_NAME} PRIVATE $<$<CXX_COMPILER_ID:MSVC,Intel>:/wd4062> $<$<CXX_COMPILER_ID:Clang,IntelLLVM>:-Wno-switch-enum>)
endif()

diff --git a/DirectXTex/DirectXTex.h b/DirectXTex/DirectXTex.h
index e24142c..4dc36c8 100644
--- a/DirectXTex/DirectXTex.h
+++ b/DirectXTex/DirectXTex.h
@@ -382,6 +382,34 @@ namespace DirectX
_In_z_ const wchar_t* szFile,
_Out_ TexMetadata& metadata) noexcept;

+#ifdef __cpp_lib_byte
+ HRESULT __cdecl GetMetadataFromDDSMemory(
+ _In_reads_bytes_(size) const std::byte* pSource, _In_ size_t size,
+ _In_ DDS_FLAGS flags,
+ _Out_ TexMetadata& metadata) noexcept;
+ HRESULT __cdecl GetMetadataFromDDSMemoryEx(
+ _In_reads_bytes_(size) const std::byte* pSource, _In_ size_t size,
+ _In_ DDS_FLAGS flags,
+ _Out_ TexMetadata& metadata,
+ _Out_opt_ DDSMetaData* ddPixelFormat) noexcept;
+ HRESULT __cdecl GetMetadataFromHDRMemory(
+ _In_reads_bytes_(size) const std::byte* pSource, _In_ size_t size,
+ _Out_ TexMetadata& metadata) noexcept;
+ HRESULT __cdecl GetMetadataFromTGAMemory(
+ _In_reads_bytes_(size) const std::byte* pSource, _In_ size_t size,
+ _In_ TGA_FLAGS flags,
+ _Out_ TexMetadata& metadata) noexcept;
+
+#ifdef _WIN32
+ HRESULT __cdecl GetMetadataFromWICMemory(
+ _In_reads_bytes_(size) const std::byte* pSource, _In_ size_t size,
+ _In_ WIC_FLAGS flags,
+ _Out_ TexMetadata& metadata,
+ _In_ std::function<void __cdecl(IWICMetadataQueryReader*)> getMQR = nullptr);
+#endif
+#endif // __cpp_lib_byte
+
+
//---------------------------------------------------------------------------------
// Bitmap image container
struct Image
@@ -590,6 +618,34 @@ namespace DirectX
HRESULT __cdecl SaveToTGAMemory(_In_ const Image& image, _Out_ Blob& blob, _In_opt_ const TexMetadata* metadata = nullptr) noexcept;
HRESULT __cdecl SaveToTGAFile(_In_ const Image& image, _In_z_ const wchar_t* szFile, _In_opt_ const TexMetadata* metadata = nullptr) noexcept;

+#ifdef __cpp_lib_byte
+ HRESULT __cdecl LoadFromDDSMemory(
+ _In_reads_bytes_(size) const std::byte* pSource, _In_ size_t size,
+ _In_ DDS_FLAGS flags,
+ _Out_opt_ TexMetadata* metadata, _Out_ ScratchImage& image) noexcept;
+ HRESULT __cdecl LoadFromDDSMemoryEx(
+ _In_reads_bytes_(size) const std::byte* pSource, _In_ size_t size,
+ _In_ DDS_FLAGS flags,
+ _Out_opt_ TexMetadata* metadata,
+ _Out_opt_ DDSMetaData* ddPixelFormat,
+ _Out_ ScratchImage& image) noexcept;
+ HRESULT __cdecl LoadFromHDRMemory(
+ _In_reads_bytes_(size) const std::byte* pSource, _In_ size_t size,
+ _Out_opt_ TexMetadata* metadata, _Out_ ScratchImage& image) noexcept;
+ HRESULT __cdecl LoadFromTGAMemory(
+ _In_reads_bytes_(size) const std::byte* pSource, _In_ size_t size,
+ _In_ TGA_FLAGS flags,
+ _Out_opt_ TexMetadata* metadata, _Out_ ScratchImage& image) noexcept;
+
+#ifdef _WIN32
+ HRESULT __cdecl LoadFromWICMemory(
+ _In_reads_bytes_(size) const std::byte* pSource, _In_ size_t size,
+ _In_ WIC_FLAGS flags,
+ _Out_opt_ TexMetadata* metadata, _Out_ ScratchImage& image,
+ _In_ std::function<void __cdecl(IWICMetadataQueryReader*)> getMQR = nullptr);
+#endif
+#endif // __cpp_lib_byte
+
//---------------------------------------------------------------------------------
// Texture conversion, resizing, mipmap generation, and block compression

@@ -959,6 +1015,18 @@ namespace DirectX
_Out_writes_bytes_to_opt_(maxsize, required) uint8_t* pDestination, _In_ size_t maxsize,
_Out_ size_t& required) noexcept;

+#ifdef __cpp_lib_byte
+ HRESULT __cdecl EncodeDDSHeader(
+ _In_ const TexMetadata& metadata, DDS_FLAGS flags,
+ _Out_writes_bytes_to_opt_(maxsize, required) std::byte* pDestination, _In_ size_t maxsize,
+ _Out_ size_t& required) noexcept;
+
+ HRESULT __cdecl EncodeDDSHeader(
+ _In_ const TexMetadata& metadata, DDS_FLAGS flags,
+ _Reserved_ std::nullptr_t, _In_ size_t maxsize,
+ _Out_ size_t& required) noexcept;
+#endif
+
//---------------------------------------------------------------------------------
// Direct3D interop

diff --git a/DirectXTex/DirectXTex.inl b/DirectXTex/DirectXTex.inl
index 49745ae..d20f41e 100644
--- a/DirectXTex/DirectXTex.inl
+++ b/DirectXTex/DirectXTex.inl
@@ -190,3 +190,85 @@ inline HRESULT __cdecl SaveToTGAFile(const Image& image, const wchar_t* szFile,
{
return SaveToTGAFile(image, TGA_FLAGS_NONE, szFile, metadata);
}
+
+
+//=====================================================================================
+// C++17 helpers
+//=====================================================================================
+#ifdef __cpp_lib_byte
+
+_Use_decl_annotations_
+inline HRESULT __cdecl GetMetadataFromDDSMemory(const std::byte* pSource, size_t size, DDS_FLAGS flags, TexMetadata& metadata) noexcept
+{
+ return GetMetadataFromDDSMemory(reinterpret_cast<const uint8_t*>(pSource), size, flags, metadata);
+}
+
+_Use_decl_annotations_
+inline HRESULT __cdecl LoadFromDDSMemory(const std::byte* pSource, size_t size, DDS_FLAGS flags, TexMetadata* metadata, ScratchImage& image) noexcept
+{
+ return LoadFromDDSMemory(reinterpret_cast<const uint8_t*>(pSource), size, flags, metadata, image);
+}
+
+_Use_decl_annotations_
+inline HRESULT __cdecl GetMetadataFromDDSMemoryEx(const std::byte* pSource, size_t size, DDS_FLAGS flags, TexMetadata& metadata, DDSMetaData* ddPixelFormat) noexcept
+{
+ return GetMetadataFromDDSMemoryEx(reinterpret_cast<const uint8_t*>(pSource), size, flags, metadata, ddPixelFormat);
+}
+
+_Use_decl_annotations_
+inline HRESULT __cdecl LoadFromDDSMemoryEx(const std::byte* pSource, size_t size, DDS_FLAGS flags, TexMetadata* metadata, DDSMetaData* ddPixelFormat, ScratchImage& image) noexcept
+{
+ return LoadFromDDSMemoryEx(reinterpret_cast<const uint8_t*>(pSource), size, flags, metadata, ddPixelFormat, image);
+}
+
+_Use_decl_annotations_
+inline HRESULT __cdecl GetMetadataFromHDRMemory(const std::byte* pSource, size_t size, TexMetadata& metadata) noexcept
+{
+ return GetMetadataFromHDRMemory(reinterpret_cast<const uint8_t*>(pSource), size, metadata);
+}
+
+_Use_decl_annotations_
+inline HRESULT __cdecl LoadFromHDRMemory(const std::byte* pSource, size_t size, TexMetadata* metadata, ScratchImage& image) noexcept
+{
+ return LoadFromHDRMemory(reinterpret_cast<const uint8_t*>(pSource), size, metadata, image);
+}
+
+_Use_decl_annotations_
+inline HRESULT __cdecl GetMetadataFromTGAMemory(const std::byte* pSource, size_t size, TGA_FLAGS flags, TexMetadata& metadata) noexcept
+{
+ return GetMetadataFromTGAMemory(reinterpret_cast<const uint8_t*>(pSource), size, flags, metadata);
+}
+
+_Use_decl_annotations_
+inline HRESULT __cdecl LoadFromTGAMemory(const std::byte* pSource, size_t size, TGA_FLAGS flags, TexMetadata* metadata, ScratchImage& image) noexcept
+{
+ return LoadFromTGAMemory(reinterpret_cast<const uint8_t*>(pSource), size, flags, metadata, image);
+}
+
+_Use_decl_annotations_
+inline HRESULT __cdecl EncodeDDSHeader(const TexMetadata& metadata, DDS_FLAGS flags, std::byte* pDestination, size_t maxsize, size_t& required) noexcept
+{
+ return EncodeDDSHeader(metadata, flags, reinterpret_cast<uint8_t*>(pDestination), maxsize, required);
+}
+
+_Use_decl_annotations_
+inline HRESULT __cdecl EncodeDDSHeader(const TexMetadata& metadata, DDS_FLAGS flags, std::nullptr_t, size_t maxsize, size_t& required) noexcept
+{
+ return EncodeDDSHeader(metadata, flags, static_cast<uint8_t*>(nullptr), maxsize, required);
+}
+
+#ifdef _WIN32
+_Use_decl_annotations_
+inline HRESULT __cdecl GetMetadataFromWICMemory(const std::byte* pSource, size_t size, WIC_FLAGS flags, TexMetadata& metadata, std::function<void __cdecl(IWICMetadataQueryReader*)> getMQR)
+{
+ return GetMetadataFromWICMemory(reinterpret_cast<const uint8_t*>(pSource), size, flags, metadata, getMQR);
+}
+
+_Use_decl_annotations_
+inline HRESULT __cdecl LoadFromWICMemory(const std::byte* pSource, size_t size, WIC_FLAGS flags, TexMetadata* metadata, ScratchImage& image, std::function<void __cdecl(IWICMetadataQueryReader*)> getMQR)
+{
+ return LoadFromWICMemory(reinterpret_cast<const uint8_t*>(pSource), size, flags, metadata, image, getMQR);
+}
+#endif // _WIN32
+
+#endif // __cpp_lib_byte
--
2.47.0.vfs.0.3

18 changes: 10 additions & 8 deletions ports/directxtex/portfile.cmake
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
set(DIRECTXTEX_TAG sep2024)
set(DIRECTXTEX_TAG oct2024)

vcpkg_check_linkage(ONLY_STATIC_LIBRARY)

vcpkg_from_github(
OUT_SOURCE_PATH SOURCE_PATH
REPO Microsoft/DirectXTex
REF ${DIRECTXTEX_TAG}
SHA512 c76c6d33f6a06e28e27c36be0f56b2c880cdd221b12680cc390f6f05a2c80169266cce9f0ac1803e7160d098f02f25a358ea73a116fd4186f4e0de17aba81ab7
SHA512 4ac9307ab6e36aa727afa5bd5bb945fb431c89fa01c9c8283eebf512707acfb15a0d7cd84f72349d4271b0eef2e13bca38a38226c1afafd8f1e36b38c1c4b07f
HEAD_REF main
PATCHES
FixStdByteAndCMake.patch
)

vcpkg_check_features(
Expand Down Expand Up @@ -67,21 +69,21 @@ if("tools" IN_LIST FEATURES)
TEXASSEMBLE_EXE
URLS "https://github.com/Microsoft/DirectXTex/releases/download/${DIRECTXTEX_TAG}/texassemble.exe"
FILENAME "texassemble-${DIRECTXTEX_TAG}.exe"
SHA512 17ae3ce91135e6c442c6127b77a4407ee5e029f1239cdc9066f34ddae9a3982de67d5314b5f03fde77802525e770be49f719fb6ddeb4d5316f440fb4ab24113a
SHA512 bb3c45d35305a56b80035bd7c076cd0000461cb37a5cd9495ac8f8a1647967fb6ecb02245336356674829f179ef05330d5aa9e768637e93b9db587d7eb684dfe
)

vcpkg_download_distfile(
TEXCONV_EXE
URLS "https://github.com/Microsoft/DirectXTex/releases/download/${DIRECTXTEX_TAG}/texconv.exe"
FILENAME "texconv-${DIRECTXTEX_TAG}.exe"
SHA512 856648b04c9d9eab5a63b1abf226eac8509b400a2087dae32fddcc61ea6d7d8426b07d710f765a01ab1bacbd8a9731684c42a72e2bd4f7f3477f379cec39c409
SHA512 6376ee91dca0b53c043e1e86ec56f418029591885dd9fd49f8e932aa635e6668d430aeb30b497daa4e8c1f02ac42f7dc901ebec107d8bc1e611c9a0ec8747029
)

vcpkg_download_distfile(
TEXDIAG_EXE
URLS "https://github.com/Microsoft/DirectXTex/releases/download/${DIRECTXTEX_TAG}/texdiag.exe"
FILENAME "texdiag-${DIRECTXTEX_TAG}.exe"
SHA512 38f083bbcf80b30b7d36312e824e03e25396f8801d8c13f6d4029731226415a3596e61863c7f8fd54f71afd6770e6e08bfc4118d65b48a977613b81f221e08d8
SHA512 31261ceefc17ce30c7f21dff961bfe03b2dc65619f60c64891a5fc56847cd7468a6629c36b1fcbf4c6f967232ad88eb85cf5c2ea874084dfe0d8da4ffabc12c8
)

file(INSTALL
Expand All @@ -100,21 +102,21 @@ if("tools" IN_LIST FEATURES)
TEXASSEMBLE_EXE
URLS "https://github.com/Microsoft/DirectXTex/releases/download/${DIRECTXTEX_TAG}/texassemble_arm64.exe"
FILENAME "texassemble-${DIRECTXTEX_TAG}-arm64.exe"
SHA512 4026647c8e18fc54a28fdec31e9b5c26dba4d6141e2fee53dc94c84bc1bdfb446b40c31a0f4babbaf1eda2a25589486ae5898210f2a5644bc29959ddbe88a475
SHA512 48b629b7aead482c0dc96c2fcfb28d534076d62dc77ce94256ad52df48596c1993645900873bf0dfd3d888087b423c350ba3f420b1305ef2ed7a43eafecfb523
)

vcpkg_download_distfile(
TEXCONV_EXE
URLS "https://github.com/Microsoft/DirectXTex/releases/download/${DIRECTXTEX_TAG}/texconv_arm64.exe"
FILENAME "texconv-${DIRECTXTEX_TAG}-arm64.exe"
SHA512 2556604381e5c45aa137bf868db27013bee4bec1860df25f991f104a4c606bfde90e0eba8a347e5a5fc145c6a6a0b28529c6c7edd9cec0a5310dcec50d295b50
SHA512 53f319be7e739d9e3addc2e86648022ec802315a94c600eb6886a4474232aa25de0c9fb8d72868d2871d29eb36ee1dd6a186094edb6d9ab8f249b4eb4849a10c
)

vcpkg_download_distfile(
TEXDIAG_EXE
URLS "https://github.com/Microsoft/DirectXTex/releases/download/${DIRECTXTEX_TAG}/texdiag_arm64.exe"
FILENAME "texdiag-${DIRECTXTEX_TAG}-arm64.exe"
SHA512 dfa8d2046cc18541998b719ace66b6807e59ea480febf41852b5973eb60aea20cb66702cab578d6e4474ecd782c03c061f363deb8e1bcb6a4c8f5002a521fe88
SHA512 638b6b8443767ca390efdfdb8e4e8a655f0cc370a81b946678414481a6c3fc0c431a7082d08206fa86bc4ccf9c8b0027a427d483474a8c3d1ff0a030011779f7
)

file(INSTALL
Expand Down
Loading

0 comments on commit 0f16cea

Please sign in to comment.