From d74149b3330b15a58e3f76d7237f8bc073d25909 Mon Sep 17 00:00:00 2001 From: tmathern <60901087+tmathern@users.noreply.github.com> Date: Sun, 26 Jul 2026 20:03:43 -0700 Subject: [PATCH 01/27] feat: Initial commit for the type guessing --- docs/usage.md | 14 +- include/c2pa.hpp | 22 +- src/c2pa_builder.cpp | 90 ++++++-- src/c2pa_internal.hpp | 81 +++++++ src/c2pa_reader.cpp | 43 +++- tests/builder.test.cpp | 182 +++++++++++++++ tests/embeddable.test.cpp | 66 ++++++ tests/reader.test.cpp | 459 +++++++++++++++++++++++++++++++++++++- 8 files changed, 933 insertions(+), 24 deletions(-) diff --git a/docs/usage.md b/docs/usage.md index 57b72cff..61098401 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -18,9 +18,21 @@ Use the `Reader` constructor to read C2PA data from a stream. This constructor e The parameters are: - `context` - A `Context` (or any `IContextProvider`) that configures SDK behavior. See [Configuring the SDK with Context and Settings](context-settings.md). -- `` - A MIME string format for the stream; must be one of the [supported file formats](supported-formats.md). +- `` - A MIME type or file extension for the stream, for example `image/jpeg` or `jpg`; see the [supported file formats](https://github.com/contentauth/c2pa-rs/blob/main/docs/supported-formats.md). Pass an empty string to take the format from the stream's leading bytes instead. - `` - An open readable iostream. +You pass an empty string or use the overload that takes no format to ask the native core library to try to guess the format: + +```cpp +c2pa::Context context; +std::ifstream ifs("asset.bin", std::ios::binary); +auto reader = c2pa::Reader(std::make_shared(), ifs); +``` + +The stream must support seeking, since it is rewound after inspection. A file path with no extension is read the same way. + +`Builder` always requires an explicit format, because the container type decides how the asset is written and hashed. Signing with a blank format, or to a destination path with no extension, throws. + For example: ```cpp diff --git a/include/c2pa.hpp b/include/c2pa.hpp index 02e06076..a90bb1c9 100644 --- a/include/c2pa.hpp +++ b/include/c2pa.hpp @@ -741,7 +741,7 @@ namespace c2pa class C2PA_CPP_API Reader { private: - C2paReader *c2pa_reader; + C2paReader *c2pa_reader = nullptr; std::unique_ptr owned_stream; // Owns file stream when created from path std::unique_ptr cpp_stream; // Wraps stream for C API; destroyed before owned_stream std::shared_ptr context_ref; @@ -800,12 +800,23 @@ namespace c2pa /// @throws C2paException if context is null or context->is_valid() returns false. Reader(std::shared_ptr context, const std::string &format, std::istream &stream); + /// @brief Create a Reader from a shared context and stream, trying to guess the format from content. + /// @details Equivalent to passing an empty format. + /// The stream is rewound after inspection, so it must support seeking. + /// @param context Shared context provider. + /// @param stream The input stream to read from. Must support seeking. + /// @throws C2paException if context is null, context->is_valid() returns false, or the + /// container type cannot be determined. + Reader(std::shared_ptr context, std::istream &stream); + /// @brief Create a Reader from a shared context and file path. /// @details The Reader retains a shared reference to the context, keeping it /// alive for the lifetime of the Reader. /// @param context Shared context provider. /// @param source_path The path to the file to read. /// @throws C2paException if context is null or context->is_valid() returns false. + /// @note With no extension, the container may be guessed by the native core library (best-effort). + /// An unsupported extension is accepted, since content overrides it. Reader(std::shared_ptr context, const std::filesystem::path &source_path); /// @brief Create a Reader from a shared context, image stream, and external JUMBF manifest. @@ -881,6 +892,15 @@ namespace c2pa /// @throws C2paException for errors other than a missing manifest. static std::optional from_asset(std::shared_ptr context, const std::string &format, std::istream &stream); + /// @brief Try to create a Reader from a shared context and stream, trying to guess the format from content. + /// @details The Reader retains a shared reference to the context if C2PA data is found. + /// @param context Shared context provider. + /// @param stream The input stream to read from. Must support seeking. + /// @return A Reader if JUMBF (c2pa/manifest) data is present; std::nullopt if none. + /// @throws C2paException for errors other than a missing manifest. + /// Content that cannot be identified also raises an error. + static std::optional from_asset(std::shared_ptr context, std::istream &stream); + // Non-copyable Reader(const Reader&) = delete; diff --git a/src/c2pa_builder.cpp b/src/c2pa_builder.cpp index 38ac1cb0..7b4780da 100644 --- a/src/c2pa_builder.cpp +++ b/src/c2pa_builder.cpp @@ -187,8 +187,12 @@ namespace c2pa void Builder::add_ingredient(const std::string &ingredient_json, const std::string &format, std::istream &source) { + // Guessing formats is not supported here. + const std::string resolved = detail::validate_format( + format, detail::supported_builder_formats(), false); + CppIStream c_source(source); - int result = c2pa_builder_add_ingredient_from_stream(builder, ingredient_json.c_str(), format.c_str(), c_source.c_stream); + int result = c2pa_builder_add_ingredient_from_stream(builder, ingredient_json.c_str(), resolved.c_str(), c_source.c_stream); if (result < 0) { throw C2paException(); @@ -197,8 +201,12 @@ namespace c2pa void Builder::add_ingredient(const std::string &ingredient_json, const std::filesystem::path &source_path) { + // Guessing formats is not supported here. + const std::string format = detail::validate_format( + detail::extract_file_extension(source_path), + detail::supported_builder_formats(), false); + auto stream = detail::open_file_binary(source_path); - auto format = detail::extract_file_extension(source_path); add_ingredient(ingredient_json, format, *stream); } @@ -222,6 +230,10 @@ namespace c2pa std::vector Builder::sign(const std::string &format, std::istream &source, std::ostream &dest, Signer &signer) { + // Guessing formats is not supported here. + const std::string resolved = detail::validate_format( + format, detail::supported_builder_formats(), false); + // Caller's source/dest streams must outlive this call // Stream wrappers are stack locals that wrap the caller's streams CppIStream c_source(source); @@ -229,12 +241,16 @@ namespace c2pa const unsigned char *c2pa_manifest_bytes = nullptr; // c2pa_builder_sign() uses streams synchronously and completes before returning - auto result = c2pa_builder_sign(builder, format.c_str(), c_source.c_stream, c_dest.c_stream, signer.c2pa_signer(), &c2pa_manifest_bytes); + auto result = c2pa_builder_sign(builder, resolved.c_str(), c_source.c_stream, c_dest.c_stream, signer.c2pa_signer(), &c2pa_manifest_bytes); return detail::to_byte_vector(c2pa_manifest_bytes, result); } std::vector Builder::sign(const std::string &format, std::istream &source, std::iostream &dest, Signer &signer) { + // Guessing formats is not supported here. + const std::string resolved = detail::validate_format( + format, detail::supported_builder_formats(), false); + // Caller's source/dest streams must outlive this call // Stream wrappers are stack locals that wrap the caller's streams CppIStream c_source(source); @@ -242,7 +258,7 @@ namespace c2pa const unsigned char *c2pa_manifest_bytes = nullptr; // c2pa_builder_sign() uses streams synchronously and completes before returning - auto result = c2pa_builder_sign(builder, format.c_str(), c_source.c_stream, c_dest.c_stream, signer.c2pa_signer(), &c2pa_manifest_bytes); + auto result = c2pa_builder_sign(builder, resolved.c_str(), c_source.c_stream, c_dest.c_stream, signer.c2pa_signer(), &c2pa_manifest_bytes); return detail::to_byte_vector(c2pa_manifest_bytes, result); } @@ -254,6 +270,12 @@ namespace c2pa /// @throws C2pa::C2paException for errors encountered by the C2PA library. std::vector Builder::sign(const std::filesystem::path &source_path, const std::filesystem::path &dest_path, Signer &signer) { + // Guessing formats is not supported here. Validate before opening the + // destination, which opens with trunc. + const std::string format = detail::validate_format( + detail::extract_file_extension(dest_path), + detail::supported_builder_formats(), false); + auto source = detail::open_file_binary(source_path); // Ensure the destination directory exists auto dest_dir = dest_path.parent_path(); @@ -270,23 +292,32 @@ namespace c2pa { throw std::runtime_error("Failed to open destination file: " + dest_path.string()); } - auto format = detail::extract_file_extension(dest_path); auto result = sign(format, *source, dest, signer); return result; } std::vector Builder::sign(const std::string &format, std::istream &source, std::iostream &dest) { + // Guessing formats is not supported here. + const std::string resolved = detail::validate_format( + format, detail::supported_builder_formats(), false); + CppIStream c_source(source); CppIOStream c_dest(dest); const unsigned char *c2pa_manifest_bytes = nullptr; - auto result = c2pa_builder_sign_context(builder, format.c_str(), c_source.c_stream, c_dest.c_stream, &c2pa_manifest_bytes); + auto result = c2pa_builder_sign_context(builder, resolved.c_str(), c_source.c_stream, c_dest.c_stream, &c2pa_manifest_bytes); return detail::to_byte_vector(c2pa_manifest_bytes, result); } std::vector Builder::sign(const std::filesystem::path &source_path, const std::filesystem::path &dest_path) { + // Guessing formats is not supported here. Validate before opening the + // destination, which opens with trunc. + const std::string format = detail::validate_format( + detail::extract_file_extension(dest_path), + detail::supported_builder_formats(), false); + auto source = detail::open_file_binary(source_path); auto dest_dir = dest_path.parent_path(); if (!std::filesystem::exists(dest_dir)) @@ -302,7 +333,6 @@ namespace c2pa { throw std::runtime_error("Failed to open destination file: " + dest_path.string()); } - auto format = detail::extract_file_extension(dest_path); auto result = sign(format, *source, dest); return result; } @@ -386,30 +416,42 @@ namespace c2pa std::vector Builder::data_hashed_placeholder(uintptr_t reserve_size, const std::string &format) { + // Guessing formats is not supported here. + const std::string resolved = detail::validate_format( + format, detail::supported_builder_formats(), false); + const unsigned char *c2pa_manifest_bytes = nullptr; - auto result = c2pa_builder_data_hashed_placeholder(builder, reserve_size, format.c_str(), &c2pa_manifest_bytes); + auto result = c2pa_builder_data_hashed_placeholder(builder, reserve_size, resolved.c_str(), &c2pa_manifest_bytes); return detail::to_byte_vector(c2pa_manifest_bytes, result); } std::vector Builder::sign_data_hashed_embeddable(Signer &signer, const std::string &data_hash, const std::string &format, std::istream *asset) { + // Guessing formats is not supported here. + const std::string resolved = detail::validate_format( + format, detail::supported_builder_formats(), false); + int64_t result; const unsigned char *c2pa_manifest_bytes = nullptr; if (asset) { CppIStream c_asset(*asset); - result = c2pa_builder_sign_data_hashed_embeddable(builder, signer.c2pa_signer(), data_hash.c_str(), format.c_str(), c_asset.c_stream, &c2pa_manifest_bytes); + result = c2pa_builder_sign_data_hashed_embeddable(builder, signer.c2pa_signer(), data_hash.c_str(), resolved.c_str(), c_asset.c_stream, &c2pa_manifest_bytes); } else { - result = c2pa_builder_sign_data_hashed_embeddable(builder, signer.c2pa_signer(), data_hash.c_str(), format.c_str(), nullptr, &c2pa_manifest_bytes); + result = c2pa_builder_sign_data_hashed_embeddable(builder, signer.c2pa_signer(), data_hash.c_str(), resolved.c_str(), nullptr, &c2pa_manifest_bytes); } return detail::to_byte_vector(c2pa_manifest_bytes, result); } bool Builder::needs_placeholder(const std::string &format) { - int result = c2pa_builder_needs_placeholder(builder, format.c_str()); + // Guessing formats is not supported here. + const std::string resolved = detail::validate_format( + format, detail::supported_builder_formats(), false); + + int result = c2pa_builder_needs_placeholder(builder, resolved.c_str()); if (result < 0) { throw C2paException(); @@ -419,8 +461,13 @@ namespace c2pa std::vector Builder::placeholder(const std::string &format) { + // Guessing formats is not supported here: + // the format selects the hash assertion written into the builder. + const std::string resolved = detail::validate_format( + format, detail::supported_builder_formats(), false); + const unsigned char *c2pa_manifest_bytes = nullptr; - auto result = c2pa_builder_placeholder(builder, format.c_str(), &c2pa_manifest_bytes); + auto result = c2pa_builder_placeholder(builder, resolved.c_str(), &c2pa_manifest_bytes); return detail::to_byte_vector(c2pa_manifest_bytes, result); } @@ -443,8 +490,13 @@ namespace c2pa void Builder::update_hash_from_stream(const std::string &format, std::istream &stream) { + // Guessing formats is not supported here: the format decides which + // hash assertion is updated. + const std::string resolved = detail::validate_format( + format, detail::supported_builder_formats(), false); + CppIStream c_stream(stream); - int result = c2pa_builder_update_hash_from_stream(builder, format.c_str(), c_stream.c_stream); + int result = c2pa_builder_update_hash_from_stream(builder, resolved.c_str(), c_stream.c_stream); if (result < 0) { throw C2paException(); @@ -453,15 +505,23 @@ namespace c2pa std::vector Builder::sign_embeddable(const std::string &format) { + // Guessing formats is not supported here. + const std::string resolved = detail::validate_format( + format, detail::supported_builder_formats(), false); + const unsigned char *c2pa_manifest_bytes = nullptr; - auto result = c2pa_builder_sign_embeddable(builder, format.c_str(), &c2pa_manifest_bytes); + auto result = c2pa_builder_sign_embeddable(builder, resolved.c_str(), &c2pa_manifest_bytes); return detail::to_byte_vector(c2pa_manifest_bytes, result); } std::vector Builder::format_embeddable(const std::string &format, std::vector &data) { + // Guessing formats is not supported here. + const std::string resolved = detail::validate_format( + format, detail::supported_builder_formats(), false); + const unsigned char *c2pa_manifest_bytes = nullptr; - auto result = c2pa_format_embeddable(format.c_str(), data.data(), data.size(), &c2pa_manifest_bytes); + auto result = c2pa_format_embeddable(resolved.c_str(), data.data(), data.size(), &c2pa_manifest_bytes); return detail::to_byte_vector(c2pa_manifest_bytes, result); } diff --git a/src/c2pa_internal.hpp b/src/c2pa_internal.hpp index 1cf16e06..b5a8687e 100644 --- a/src/c2pa_internal.hpp +++ b/src/c2pa_internal.hpp @@ -18,10 +18,13 @@ #ifndef C2PA_INTERNAL_HPP #define C2PA_INTERNAL_HPP +#include +#include #include #include #include #include +#include #include #include @@ -237,11 +240,89 @@ inline std::unique_ptr open_file_binary(const std::filesystem::path /// @brief Extract file extension without the leading dot /// @param path Filesystem path /// @return Extension string (e.g., "jpg" not ".jpg") +/// @details Empty when the path has no extension, which asks the library to +/// determine the container type from the asset's leading bytes. inline std::string extract_file_extension(const std::filesystem::path &path) noexcept { auto ext = path.extension().string(); return ext.empty() ? "" : ext.substr(1); } +/// @brief Format asking the library to determine the container type from content. +/// @details The C API rejects a null format, so absent must be spelled empty. +inline constexpr const char *kDetectFormatFromContent = ""; + +/// @brief ASCII whitespace padding. Formats are MIME types or extensions, +/// so non-ASCII spaces are deliberately excluded. +inline constexpr std::string_view kFormatWhitespace = " \t\n\r\f\v"; + +/// @brief True when a format is absent, i.e. empty or only ASCII whitespace. +inline bool is_blank_format(const std::string &format) noexcept { + return format.find_first_not_of(kFormatWhitespace) == std::string::npos; +} + +/// @brief Validate a caller-supplied format and normalize a blank one. +/// @param format The format supplied by, or derived for, the caller. +/// @param supported Formats accepted here. When empty the check is skipped. +/// @param allow_detection Whether a blank format may request content detection. +/// @return An empty string when @p format is blank, otherwise @p format unchanged. +/// @throws C2paException if @p format is blank and @p allow_detection is false, +/// or if a non-blank @p format is not in a non-empty @p supported. +/// @details Matching ignores case; the caller's spelling is returned unchanged. +[[nodiscard]] inline std::string validate_format(const std::string &format, + const std::vector &supported, + bool allow_detection) { + if (is_blank_format(format)) { + if (!allow_detection) { + throw C2paException("An explicit format is required."); + } + // Blank hint for the native core lib to attempt guessing the format. + return std::string(); + } + + if (supported.empty()) { + // List unavailable; defer to the library's own validation. + return format; + } + + std::string lowered = format; + std::transform(lowered.begin(), lowered.end(), lowered.begin(), + [](unsigned char c) { return static_cast(std::tolower(c)); }); + + if (std::find(supported.begin(), supported.end(), lowered) == supported.end()) { + throw C2paException("Unsupported format \"" + format + "\"."); + } + return format; +} + +/// @brief Formats accepted for reading, queried once from the C2PA library. +/// @return The supported formats, or an empty vector if the library reported none. +/// @details Fixed for the lifetime of the loaded library, so it is cached. +/// An empty result disables the check, leaving validation to the library. +inline const std::vector &supported_reader_formats() { + static const std::vector formats = [] { + try { + return Reader::supported_mime_types(); + } catch (...) { + return std::vector{}; + } + }(); + return formats; +} + +/// @brief Formats accepted for signing, queried once from the C2PA library. +/// @return The supported formats, or an empty vector if the library reported none. +/// @details This list is for signing and must not be substituted for supported_reader_formats(). +inline const std::vector &supported_builder_formats() { + static const std::vector formats = [] { + try { + return Builder::supported_mime_types(); + } catch (...) { + return std::vector{}; + } + }(); + return formats; +} + /// @brief Convert C string result to C++ string with cleanup /// @param c_result Raw C string from C API /// @return C++ string (throws if null) diff --git a/src/c2pa_reader.cpp b/src/c2pa_reader.cpp index 0564fc63..f3e44335 100644 --- a/src/c2pa_reader.cpp +++ b/src/c2pa_reader.cpp @@ -46,6 +46,10 @@ namespace c2pa throw C2paException("Invalid Context provider IContextProvider"); } + // Validate before acquiring anything. + const std::string resolved = detail::validate_format( + format, detail::supported_reader_formats(), true); + // Create the stream wrapper before the reader handle cpp_stream = std::make_unique(stream); @@ -56,7 +60,7 @@ namespace c2pa // Update reader with stream. // Note: c2pa_reader_with_stream consumes the reader pointer. - C2paReader* updated = c2pa_reader_with_stream(c2pa_reader, format.c_str(), cpp_stream->c_stream); + C2paReader* updated = c2pa_reader_with_stream(c2pa_reader, resolved.c_str(), cpp_stream->c_stream); c2pa_reader = nullptr; if (updated == nullptr) { throw C2paException(); @@ -79,7 +83,10 @@ namespace c2pa throw std::system_error(errno, std::system_category(), "Failed to open file: " + source_path.string()); } - std::string extension = detail::extract_file_extension(source_path); + // The extension describes the filename, so it is normalized and left unchecked. + // Content type detection overrides it anyway if wrong. + const std::string extension = detail::validate_format( + detail::extract_file_extension(source_path), {}, true); // CppIStream stores reference to owned_stream, which lives as long as Reader cpp_stream = std::make_unique(*owned_stream); @@ -111,6 +118,11 @@ namespace c2pa throw C2paException("manifest_jumbf must not be empty"); } + // Guessing formats is not supported here. + // The container type decides how the asset is hashed. + const std::string resolved = detail::validate_format( + format, detail::supported_reader_formats(), false); + cpp_stream = std::make_unique(image_stream); c2pa_reader = c2pa_reader_from_context(context.c_context()); @@ -121,7 +133,7 @@ namespace c2pa // c2pa_reader_with_manifest_data_and_stream always consumes c2pa_reader. C2paReader* updated = c2pa_reader_with_manifest_data_and_stream( c2pa_reader, - format.c_str(), + resolved.c_str(), cpp_stream->c_stream, manifest_jumbf.data(), manifest_jumbf.size()); @@ -157,6 +169,11 @@ namespace c2pa context_ref = std::move(context); } + Reader::Reader(std::shared_ptr context, std::istream &stream) + : Reader(std::move(context), detail::kDetectFormatFromContent, stream) + { + } + Reader::Reader(std::shared_ptr context, const std::filesystem::path &source_path) : c2pa_reader(nullptr) { @@ -184,6 +201,10 @@ namespace c2pa { ensure_initialized(); + // Guessing formats is not supported here. + const std::string resolved = detail::validate_format( + format, detail::supported_reader_formats(), false); + CppIStream main_wrapper(stream); CppIStream fragment_wrapper(fragment); @@ -191,7 +212,7 @@ namespace c2pa // *this is returned for chaining so reading can go through all segments. C2paReader* updated = c2pa_reader_with_fragment( c2pa_reader, - format.c_str(), + resolved.c_str(), main_wrapper.c_stream, fragment_wrapper.c_stream); c2pa_reader = nullptr; @@ -205,8 +226,11 @@ namespace c2pa Reader::Reader(const std::string &format, std::istream &stream) { + const std::string resolved = detail::validate_format( + format, detail::supported_reader_formats(), true); + cpp_stream = std::make_unique(stream); - c2pa_reader = c2pa_reader_from_stream(format.c_str(), cpp_stream->c_stream); + c2pa_reader = c2pa_reader_from_stream(resolved.c_str(), cpp_stream->c_stream); if (c2pa_reader == nullptr) { throw C2paException(); @@ -221,7 +245,8 @@ namespace c2pa throw std::system_error(errno, std::system_category(), "Failed to open file: " + source_path.string()); } - std::string extension = detail::extract_file_extension(source_path); + const std::string extension = detail::validate_format( + detail::extract_file_extension(source_path), {}, true); // CppIStream stores reference to owned_stream, which lives as long as Reader cpp_stream = std::make_unique(*owned_stream); @@ -321,4 +346,10 @@ namespace c2pa std::optional Reader::from_asset(std::shared_ptr context, const std::string& format, std::istream& stream) { return reader_from_asset_impl([&]() { return Reader(std::move(context), format, stream); }); } + + std::optional Reader::from_asset(std::shared_ptr context, std::istream& stream) { + return reader_from_asset_impl([&]() { + return Reader(std::move(context), detail::kDetectFormatFromContent, stream); + }); + } } // namespace c2pa diff --git a/tests/builder.test.cpp b/tests/builder.test.cpp index 18f748d0..f72104b8 100644 --- a/tests/builder.test.cpp +++ b/tests/builder.test.cpp @@ -82,6 +82,12 @@ class BuilderTest : public ::testing::Test { temp_dirs.clear(); } + // Helper: Creates a Builder with a test manifest. + c2pa::Builder make_builder() { + auto manifest = c2pa_test::read_text_file(c2pa_test::get_fixture_path("training.json")); + return c2pa::Builder(manifest); + } + // Helper: Creates an ingredient archive (.c2pa) from a single ingredient. void create_ingredient_archive( const fs::path& archive_path, @@ -7506,3 +7512,179 @@ TEST_F(BuilderTest, ArchiveToFstreamBackedCppOStream) { EXPECT_GT(std::filesystem::file_size(archive_path), 0u); } + +// Signing always needs the container type, which decides how it hashes. +class BuilderBlankFormatTest : public BuilderTest, public ::testing::WithParamInterface {}; + +INSTANTIATE_TEST_SUITE_P(BuilderBlankFormatSignTests, BuilderBlankFormatTest, + ::testing::Values("", " ", " ", "\t", "\n", "\t\n ", "\r\n", "\v\f")); + +TEST_P(BuilderBlankFormatTest, SignRejectsBlankFormat) { + auto signer = c2pa_test::create_test_signer(); + auto builder = make_builder(); + + std::ifstream source(c2pa_test::get_fixture_path("A.jpg"), std::ios::binary); + ASSERT_TRUE(source.is_open()); + std::stringstream dest(std::ios::in | std::ios::out | std::ios::binary); + + EXPECT_THROW({ builder.sign(GetParam(), source, dest, signer); }, c2pa::C2paException); +} + +TEST_F(BuilderTest, SignBlankAndEmptyFormatsReportTheSameMessage) { + auto signer = c2pa_test::create_test_signer(); + + auto collect_message = [&](const std::string& format) { + auto builder = make_builder(); + std::ifstream source(c2pa_test::get_fixture_path("A.jpg"), std::ios::binary); + EXPECT_TRUE(source.is_open()); + std::stringstream dest(std::ios::in | std::ios::out | std::ios::binary); + try { + builder.sign(format, source, dest, signer); + return std::string(""); + } catch (const c2pa::C2paException& e) { + return std::string(e.what()); + } + }; + + const std::string from_empty = collect_message(""); + EXPECT_NE(from_empty, ""); + EXPECT_EQ(from_empty, collect_message(" ")); +} + +TEST_F(BuilderTest, SignToExtensionlessDestinationThrows) { + auto signer = c2pa_test::create_test_signer(); + auto builder = make_builder(); + fs::path dest = get_temp_path("signed-noext"); + + EXPECT_THROW( + { builder.sign(c2pa_test::get_fixture_path("A.jpg"), dest, signer); }, + c2pa::C2paException); +} + +TEST_F(BuilderTest, SignDoesNotTruncateDestinationWhenFormatIsRejected) { + // The destination opens with trunc, so the format is checked before it. + auto signer = c2pa_test::create_test_signer(); + auto builder = make_builder(); + + fs::path dest = get_temp_path("existing-destination-noext"); + const std::string original = "existing contents that must survive"; + { + std::ofstream f(dest, std::ios::binary | std::ios::trunc); + ASSERT_TRUE(f.is_open()); + f << original; + } + + EXPECT_THROW( + { builder.sign(c2pa_test::get_fixture_path("A.jpg"), dest, signer); }, + c2pa::C2paException); + + ASSERT_TRUE(fs::exists(dest)); + std::ifstream check(dest, std::ios::binary); + std::stringstream after; + after << check.rdbuf(); + EXPECT_EQ(after.str(), original); +} + +TEST_F(BuilderTest, SignWithUnsupportedFormatThrows) { + auto signer = c2pa_test::create_test_signer(); + auto builder = make_builder(); + + std::ifstream source(c2pa_test::get_fixture_path("A.jpg"), std::ios::binary); + ASSERT_TRUE(source.is_open()); + std::stringstream dest(std::ios::in | std::ios::out | std::ios::binary); + + EXPECT_THROW({ builder.sign("application/zip", source, dest, signer); }, + c2pa::C2paException); +} + +TEST_F(BuilderTest, SignRejectsReadOnlyFormat) { + // Signing validates against the writable formats. + const auto readable = c2pa::Reader::supported_mime_types(); + const auto writable = c2pa::Builder::supported_mime_types(); + + std::string read_only; + for (const auto& format : readable) { + if (std::find(writable.begin(), writable.end(), format) == writable.end()) { + read_only = format; + break; + } + } + if (read_only.empty()) { + GTEST_SKIP() << "Every readable format is also writable"; + } + + auto signer = c2pa_test::create_test_signer(); + auto builder = make_builder(); + std::ifstream source(c2pa_test::get_fixture_path("A.jpg"), std::ios::binary); + ASSERT_TRUE(source.is_open()); + std::stringstream dest(std::ios::in | std::ios::out | std::ios::binary); + + EXPECT_THROW({ builder.sign(read_only, source, dest, signer); }, c2pa::C2paException); +} + +TEST_F(BuilderTest, SignMessageNamesFormatNotPath) { + auto signer = c2pa_test::create_test_signer(); + auto builder = make_builder(); + fs::path dest = get_temp_path("message-probe-noext"); + + try { + builder.sign(c2pa_test::get_fixture_path("A.jpg"), dest, signer); + FAIL() << "Expected an extensionless destination to be rejected"; + } catch (const c2pa::C2paException& e) { + const std::string msg = e.what(); + EXPECT_EQ(msg.find(dest.string()), std::string::npos) << msg; + EXPECT_EQ(msg.find("message-probe-noext"), std::string::npos) << msg; + } +} + +TEST_F(BuilderTest, AddIngredientExtensionlessPathThrows) { + auto builder = make_builder(); + fs::path ingredient = get_temp_path("ingredient-noext"); + { + std::ifstream src(c2pa_test::get_fixture_path("A.jpg"), std::ios::binary); + ASSERT_TRUE(src.is_open()); + std::ofstream out(ingredient, std::ios::binary | std::ios::trunc); + ASSERT_TRUE(out.is_open()); + out << src.rdbuf(); + } + + EXPECT_THROW( + { builder.add_ingredient(R"({"title": "A.jpg", "relationship": "componentOf"})", ingredient); }, + c2pa::C2paException); +} + +TEST_F(BuilderTest, AcceptsSupportedBareExtension) { + auto signer = c2pa_test::create_test_signer(); + auto builder = make_builder(); + + std::ifstream source(c2pa_test::get_fixture_path("A.jpg"), std::ios::binary); + ASSERT_TRUE(source.is_open()); + std::stringstream dest(std::ios::in | std::ios::out | std::ios::binary); + + EXPECT_NO_THROW({ builder.sign("jpg", source, dest, signer); }); +} + +TEST_F(BuilderTest, ArchiveWithEmptyFormatThrows) { + // A c2pa archive carries no signature that identifies the format it came for/from, + // so reading one back requires naming the format. + auto builder = make_builder(); + builder.add_ingredient(R"({"title": "C.jpg", "relationship": "componentOf"})", + c2pa_test::get_fixture_path("C.jpg")); + + std::ostringstream archive_out(std::ios::binary); + ASSERT_NO_THROW(builder.to_archive(archive_out)); + const std::string archive_bytes = archive_out.str(); + ASSERT_FALSE(archive_bytes.empty()); + + { // Control: naming the format works. + std::istringstream in(archive_bytes, std::ios::binary); + auto ctx = std::make_shared(); + c2pa::Reader reader(ctx, "application/c2pa", in); + EXPECT_FALSE(reader.json().empty()); + } + { // Same bytes, no format: the container cannot be identified. + std::istringstream in(archive_bytes, std::ios::binary); + auto ctx = std::make_shared(); + EXPECT_THROW({ c2pa::Reader reader(ctx, "", in); }, c2pa::C2paException); + } +} diff --git a/tests/embeddable.test.cpp b/tests/embeddable.test.cpp index 67e00bd8..d10be9bc 100644 --- a/tests/embeddable.test.cpp +++ b/tests/embeddable.test.cpp @@ -50,6 +50,12 @@ class EmbeddableTest : public ::testing::Test { } temp_files.clear(); } + + // Helper: Creates a Builder with a test manifest. + c2pa::Builder make_builder() { + auto manifest = c2pa_test::read_text_file(c2pa_test::get_fixture_path("training.json")); + return c2pa::Builder(manifest); + } }; // e2e workflow with A.jpg (has no existing C2PA) @@ -646,3 +652,63 @@ TEST_F(EmbeddableTest, DirectEmbeddingWithFormat) { EXPECT_EQ(jpeg_manifest.size(), placeholder.size()) << "Direct JPEG format output matches placeholder size"; } + +// The format selects the hash binding, so the embeddable workflow requires one. + +class EmbeddableBlankFormatTest : public EmbeddableTest, public ::testing::WithParamInterface {}; + +INSTANTIATE_TEST_SUITE_P(EmbeddableBlankFormats, EmbeddableBlankFormatTest, + ::testing::Values("", " ", " ", "\t", "\n", "\t\n ", "\r\n", "\v\f")); + +TEST_P(EmbeddableBlankFormatTest, NeedsPlaceholderRejectsBlankFormat) { + auto builder = make_builder(); + EXPECT_THROW({ builder.needs_placeholder(GetParam()); }, c2pa::C2paException); +} + +TEST_P(EmbeddableBlankFormatTest, PlaceholderRejectsBlankFormat) { + auto builder = make_builder(); + EXPECT_THROW({ builder.placeholder(GetParam()); }, c2pa::C2paException); +} + +TEST_F(EmbeddableTest, DataHashedPlaceholderRejectsBlankFormat) { + auto signer = c2pa_test::create_test_signer(); + auto builder = make_builder(); + EXPECT_THROW({ builder.data_hashed_placeholder(signer.reserve_size(), ""); }, + c2pa::C2paException); + EXPECT_THROW({ builder.data_hashed_placeholder(signer.reserve_size(), " "); }, + c2pa::C2paException); +} + +TEST_F(EmbeddableTest, UpdateHashFromStreamRejectsBlankFormat) { + auto builder = make_builder(); + std::ifstream asset(c2pa_test::get_fixture_path("A.jpg"), std::ios::binary); + ASSERT_TRUE(asset.is_open()); + EXPECT_THROW({ builder.update_hash_from_stream("", asset); }, c2pa::C2paException); +} + +TEST_F(EmbeddableTest, SignEmbeddableRejectsBlankFormat) { + auto builder = make_builder(); + EXPECT_THROW({ builder.sign_embeddable(""); }, c2pa::C2paException); +} + +TEST_F(EmbeddableTest, FormatEmbeddableRejectsBlankFormat) { + std::vector data{0x01, 0x02, 0x03}; + EXPECT_THROW({ c2pa::Builder::format_embeddable("", data); }, c2pa::C2paException); +} + +TEST_F(EmbeddableTest, EmbeddableStepsRejectUnsupportedFormat) { + auto builder = make_builder(); + EXPECT_THROW({ builder.needs_placeholder("application/zip"); }, c2pa::C2paException); + EXPECT_THROW({ builder.placeholder("application/zip"); }, c2pa::C2paException); + + std::vector data{0x01, 0x02, 0x03}; + EXPECT_THROW({ c2pa::Builder::format_embeddable("application/zip", data); }, + c2pa::C2paException); +} + +TEST_F(EmbeddableTest, NeedsPlaceholderDistinguishesContainersWhenFormatIsGiven) { + // A named format yields a container-specific answer. + auto builder = make_builder(); + EXPECT_NO_THROW({ builder.needs_placeholder("image/jpeg"); }); + EXPECT_NO_THROW({ builder.needs_placeholder("video/mp4"); }); +} diff --git a/tests/reader.test.cpp b/tests/reader.test.cpp index e3568f44..fc9ced9b 100644 --- a/tests/reader.test.cpp +++ b/tests/reader.test.cpp @@ -40,6 +40,27 @@ class ReaderTest : public ::testing::Test { return temp_path; } + // Copy a fixture to a temp path with any (or no) extension. + fs::path copy_fixture_to(const std::string& fixture, const std::string& temp_name) { + fs::path dest = get_temp_path(temp_name); + std::ifstream src(c2pa_test::get_fixture_path(fixture), std::ios::binary); + EXPECT_TRUE(src.is_open()) << "Failed to open fixture: " << fixture; + std::ofstream out(dest, std::ios::binary | std::ios::trunc); + EXPECT_TRUE(out.is_open()) << "Failed to create temp file: " << dest; + out << src.rdbuf(); + out.close(); + return dest; + } + + // Read a whole fixture into a string, for use with std::istringstream. + static std::string fixture_bytes(const std::string& fixture) { + std::ifstream f(c2pa_test::get_fixture_path(fixture), std::ios::binary); + EXPECT_TRUE(f.is_open()) << "Failed to open fixture: " << fixture; + std::ostringstream ss; + ss << f.rdbuf(); + return ss.str(); + } + void TearDown() override { if (cleanup_temp_files) { for (const auto& path : temp_files) { @@ -81,7 +102,13 @@ INSTANTIATE_TEST_SUITE_P(ReaderStreamWithManifestTests, StreamWithManifestTests, // (filename, type or mimetype, expected_content = Title from the manifest) std::make_tuple("video1.mp4", "video/mp4", "My Title"), std::make_tuple("sample1_signed.wav", "wav", "sample1_signed.wav"), - std::make_tuple("C.dng", "DNG", "C.jpg"))); + std::make_tuple("C.dng", "DNG", "C.jpg"), + // The supported list holds extensions as well as + // MIME types, and matching ignores case. + std::make_tuple("C.jpg", "jpg", "C.jpg"), + std::make_tuple("C.jpg", "JPG", "C.jpg"), + std::make_tuple("C.jpg", "image/jpeg", "C.jpg"), + std::make_tuple("C.jpg", "Image/JPEG", "C.jpg"))); TEST_P(StreamWithManifestTests, StreamWithManifest) { auto filename = std::get<0>(GetParam()); @@ -846,3 +873,433 @@ TEST_F(ReaderSidecarTest, SidecarReaderResetsStreamPosition) { c2pa::Reader r(ctx, "image/jpeg", *img, sc.manifest); EXPECT_FALSE(r.json().empty()); } + +// A blank format should trigger content guessing from the core lib. +class BlankFormatDetectionTest + : public ReaderTest, + public ::testing::WithParamInterface> {}; + +INSTANTIATE_TEST_SUITE_P( + ReaderBlankFormatDetectionTest, BlankFormatDetectionTest, + ::testing::Values( + // (format, fixture, expected content in the manifest store JSON) + std::make_tuple("", "C.jpg", "C.jpg"), + std::make_tuple("", "video1.mp4", "My Title"), + std::make_tuple("", "sample1_signed.wav", "sample1_signed.wav"), + std::make_tuple("", "C.dng", "C.jpg"), + std::make_tuple(" ", "C.jpg", "C.jpg"), + std::make_tuple(" ", "C.jpg", "C.jpg"), + std::make_tuple("\t", "C.jpg", "C.jpg"), + std::make_tuple("\n", "C.jpg", "C.jpg"), + std::make_tuple("\t\n ", "C.jpg", "C.jpg"), + std::make_tuple("\r\n", "C.jpg", "C.jpg"), + std::make_tuple("\v\f", "C.jpg", "C.jpg"))); + +TEST_P(BlankFormatDetectionTest, ResolvesFormatFromContent) { + const auto& [format, filename, expected_content] = GetParam(); + auto path = c2pa_test::get_fixture_path(filename); + ASSERT_TRUE(fs::exists(path)) << "Test file does not exist: " << path; + + std::ifstream file(path, std::ios::binary); + ASSERT_TRUE(file.is_open()) << "Failed to open file: " << path; + + c2pa::Reader reader(format, file); + EXPECT_NE(reader.json().find(expected_content), std::string::npos); +} + +TEST_P(BlankFormatDetectionTest, ResolvesFormatOnSharedContext) { + const auto& [format, filename, expected_content] = GetParam(); + std::string bytes = fixture_bytes(filename); + std::istringstream stream(bytes, std::ios::binary); + auto ctx = std::make_shared(); + + c2pa::Reader reader(ctx, format, stream); + EXPECT_NE(reader.json().find(expected_content), std::string::npos); +} + +TEST_F(ReaderTest, ExtensionlessFilePathReadsManifest) { + fs::path noext = copy_fixture_to("C.jpg", "detect-noext"); + ASSERT_TRUE(fs::exists(noext)); + ASSERT_TRUE(noext.extension().empty()) << "temp path must have no extension"; + + c2pa::Reader reader(noext); + EXPECT_NE(reader.json().find("C.jpg"), std::string::npos); +} + +TEST_F(ReaderTest, UnlistedExtensionDefersToContent) { + // The extension describes the filename; the bytes decide the format. + fs::path odd = copy_fixture_to("C.jpg", "detect-unlisted-ext.zzz"); + c2pa::Reader reader(odd); + EXPECT_NE(reader.json().find("C.jpg"), std::string::npos); +} + +TEST_F(ReaderTest, WrongButSupportedExtensionDefersToContent) { + fs::path mislabeled = copy_fixture_to("C.jpg", "detect-mislabeled.png"); + c2pa::Reader reader(mislabeled); + EXPECT_NE(reader.json().find("C.jpg"), std::string::npos); +} + +TEST_F(ReaderTest, EmptyFormatRewindsPreSeekedStream) { + std::string bytes = fixture_bytes("C.jpg"); + std::istringstream stream(bytes, std::ios::binary); + stream.seekg(4096); + ASSERT_EQ(stream.tellg(), 4096); + + c2pa::Reader reader("", stream); + EXPECT_NE(reader.json().find("C.jpg"), std::string::npos); +} + +TEST_F(ReaderTest, EmptyFormatMatchesExplicitFormatJson) { + std::string bytes = fixture_bytes("C.jpg"); + + std::istringstream detected_stream(bytes, std::ios::binary); + c2pa::Reader detected("", detected_stream); + + std::istringstream explicit_stream(bytes, std::ios::binary); + c2pa::Reader explicitly("image/jpeg", explicit_stream); + + auto a = json::parse(detected.json()); + auto b = json::parse(explicitly.json()); + EXPECT_EQ(a["active_manifest"], b["active_manifest"]); + EXPECT_EQ(a["manifests"].size(), b["manifests"].size()); + EXPECT_EQ(detected.is_embedded(), explicitly.is_embedded()); +} + +TEST_F(ReaderTest, WrongMimeHintIsCorrectedByContent) { + std::string bytes = fixture_bytes("C.jpg"); + std::istringstream stream(bytes, std::ios::binary); + + c2pa::Reader reader("image/png", stream); + EXPECT_NE(reader.json().find("C.jpg"), std::string::npos); +} + +TEST_F(ReaderTest, DngExtensionWithJpegContentIsCorrected) { + fs::path mislabeled = copy_fixture_to("C.jpg", "detect-mislabeled.dng"); + c2pa::Reader reader(mislabeled); + EXPECT_NE(reader.json().find("C.jpg"), std::string::npos); +} + +TEST_F(ReaderTest, WhitespaceFormatMatchesEmptyFormatJson) { + std::string bytes = fixture_bytes("C.jpg"); + + std::istringstream empty_stream(bytes, std::ios::binary); + c2pa::Reader from_empty("", empty_stream); + + std::istringstream ws_stream(bytes, std::ios::binary); + c2pa::Reader from_whitespace("\t\n ", ws_stream); + + auto a = json::parse(from_empty.json()); + auto b = json::parse(from_whitespace.json()); + EXPECT_EQ(a["active_manifest"], b["active_manifest"]); + EXPECT_EQ(a["manifests"].size(), b["manifests"].size()); +} + +TEST_F(ReaderTest, WhitespaceFormatFromAssetReturnsReader) { + std::string bytes = fixture_bytes("C.jpg"); + std::istringstream stream(bytes, std::ios::binary); + auto ctx = std::make_shared(); + + auto reader = c2pa::Reader::from_asset(ctx, " ", stream); + ASSERT_TRUE(reader.has_value()); + EXPECT_NE(reader->json().find("C.jpg"), std::string::npos); +} + +TEST_F(ReaderTest, WhitespaceFormatFromAssetUnsignedReturnsNullopt) { + // Reachable only if detection ran, since an unidentified container throws. + std::string bytes = fixture_bytes("A.jpg"); + std::istringstream stream(bytes, std::ios::binary); + auto ctx = std::make_shared(); + + auto reader = c2pa::Reader::from_asset(ctx, " ", stream); + EXPECT_FALSE(reader.has_value()); +} + +TEST_F(ReaderTest, WhitespaceFormatUndetectableStillThrows) { + std::string garbage(512, 'w'); + std::istringstream stream(garbage, std::ios::binary); + EXPECT_THROW({ c2pa::Reader reader(" ", stream); }, c2pa::C2paException); +} + +TEST_F(ReaderTest, BlankFormatVariantsAreIndistinguishableOnFailure) { + // SVG cannot be identified, so every blank spelling fails identically. + std::string bytes = fixture_bytes("sample2.svg"); + + auto message_for = [&](const std::string& format) { + std::istringstream stream(bytes, std::ios::binary); + try { + c2pa::Reader reader(format, stream); + return std::string(""); + } catch (const c2pa::C2paException& e) { + return std::string(e.what()); + } + }; + + const std::string from_empty = message_for(""); + EXPECT_NE(from_empty, ""); + for (const std::string& blank : {" ", " ", "\t", "\n", "\t\n ", "\r\n", "\v\f"}) { + EXPECT_EQ(message_for(blank), from_empty) << "blank variant: " << blank; + } +} + +TEST_F(ReaderTest, PaddedFormatIsRejectedNotTrimmed) { + // Padding is preserved, so a padded format stays invalid. + std::string bytes = fixture_bytes("C.jpg"); + std::istringstream stream(bytes, std::ios::binary); + + try { + c2pa::Reader reader(" image/jpeg ", stream); + FAIL() << "Expected a padded format to be rejected"; + } catch (const c2pa::C2paException& e) { + EXPECT_NE(std::string(e.what()).find("image/jpeg"), std::string::npos); + } +} + +TEST_F(ReaderTest, UnsupportedFormatOnStreamThrows) { + // The bytes are a valid signed JPEG, so only the format check can throw. + std::string bytes = fixture_bytes("C.jpg"); + std::istringstream stream(bytes, std::ios::binary); + EXPECT_THROW({ c2pa::Reader reader("application/zip", stream); }, c2pa::C2paException); +} + +TEST_F(ReaderTest, SuppliedFormatEnforcedButDerivedIsNot) { + // A supplied format is the caller's claim about the data, so it is checked. + // A derived extension only describes the filename, so it is left alone. + std::string bytes = fixture_bytes("C.jpg"); + std::istringstream stream(bytes, std::ios::binary); + EXPECT_THROW({ c2pa::Reader reader("zzz", stream); }, c2pa::C2paException); + + fs::path odd = copy_fixture_to("C.jpg", "detect-asymmetry.zzz"); + EXPECT_NO_THROW({ c2pa::Reader reader(odd); }); +} + +TEST_F(ReaderTest, UnsupportedFormatMessageNamesFormatNotPath) { + // Paths may hold sensitive data, so they never appear in messages. + fs::path asset = copy_fixture_to("C.jpg", "detect-message-probe.jpg"); + std::ifstream file(asset, std::ios::binary); + ASSERT_TRUE(file.is_open()); + + try { + c2pa::Reader reader("application/zip", file); + FAIL() << "Expected an unsupported format to be rejected"; + } catch (const c2pa::C2paException& e) { + const std::string msg = e.what(); + EXPECT_NE(msg.find("application/zip"), std::string::npos); + EXPECT_EQ(msg.find(asset.string()), std::string::npos) << msg; + EXPECT_EQ(msg.find("detect-message-probe"), std::string::npos) << msg; + } +} + +TEST_F(ReaderTest, NoFormatOverloadDetectsFromContent) { + std::ifstream file(c2pa_test::get_fixture_path("C.jpg"), std::ios::binary); + ASSERT_TRUE(file.is_open()); + auto ctx = std::make_shared(); + + c2pa::Reader reader(ctx, file); + EXPECT_NE(reader.json().find("C.jpg"), std::string::npos); +} + +TEST_F(ReaderTest, NoFormatOverloadMatchesEmptyFormat) { + std::string bytes = fixture_bytes("C.jpg"); + auto ctx = std::make_shared(); + + std::istringstream overload_stream(bytes, std::ios::binary); + c2pa::Reader from_overload(ctx, overload_stream); + + std::istringstream empty_stream(bytes, std::ios::binary); + c2pa::Reader from_empty(ctx, "", empty_stream); + + auto a = json::parse(from_overload.json()); + auto b = json::parse(from_empty.json()); + EXPECT_EQ(a["active_manifest"], b["active_manifest"]); + EXPECT_EQ(a["manifests"].size(), b["manifests"].size()); +} + +TEST_F(ReaderTest, NoFormatOverloadUndetectableThrows) { + std::string garbage(512, 'q'); + std::istringstream stream(garbage, std::ios::binary); + auto ctx = std::make_shared(); + + EXPECT_THROW({ c2pa::Reader reader(ctx, stream); }, c2pa::C2paException); +} + +TEST_F(ReaderTest, NoFormatOverloadResolvesUnambiguously) { + // Compile-level guard that each call selects exactly one overload. + auto ctx = std::make_shared(); + fs::path asset = c2pa_test::get_fixture_path("C.jpg"); + + std::ifstream ifs(asset, std::ios::binary); + ASSERT_TRUE(ifs.is_open()); + EXPECT_NO_THROW({ c2pa::Reader reader(ctx, ifs); }); + + std::string bytes = fixture_bytes("C.jpg"); + std::istringstream iss(bytes, std::ios::binary); + EXPECT_NO_THROW({ c2pa::Reader reader(ctx, iss); }); + + std::istringstream base_source(bytes, std::ios::binary); + std::istream& base_ref = base_source; + EXPECT_NO_THROW({ c2pa::Reader reader(ctx, base_ref); }); + + EXPECT_NO_THROW({ c2pa::Reader reader(ctx, asset); }); +} + +TEST_F(ReaderTest, FromAssetNoFormatOverloadReturnsNullopt) { + std::string bytes = fixture_bytes("A.jpg"); + std::istringstream stream(bytes, std::ios::binary); + auto ctx = std::make_shared(); + + auto reader = c2pa::Reader::from_asset(ctx, stream); + EXPECT_FALSE(reader.has_value()); +} + +TEST_F(ReaderTest, GarbageStreamWithEmptyFormatThrows) { + // Bytes confined to 0x03..0x7f cannot match any container signature. + std::string garbage(512, '\0'); + for (size_t i = 0; i < garbage.size(); ++i) { + garbage[i] = static_cast((i * 7 + 3) & 0x7f); + } + std::istringstream stream(garbage, std::ios::binary); + EXPECT_THROW({ c2pa::Reader reader("", stream); }, c2pa::C2paException); +} + +TEST_F(ReaderTest, GarbageStreamWithEmptyFormatIsNotAManifestLookupFailure) { + std::string garbage(512, 'q'); + std::istringstream stream(garbage, std::ios::binary); + try { + c2pa::Reader reader("", stream); + FAIL() << "Expected undetectable content to be rejected"; + } catch (const c2pa::C2paException& e) { + const std::string msg = e.what(); + EXPECT_FALSE(msg.empty()); + // An unidentified container reports a different failure. + EXPECT_EQ(msg.find("ManifestNotFound"), std::string::npos) << msg; + } +} + +TEST_F(ReaderTest, SubMagicLengthStreamWithEmptyFormatThrows) { + // Detection needs two bytes, so one leaves nothing to identify. + std::string tiny("\xff", 1); + std::istringstream stream(tiny, std::ios::binary); + EXPECT_THROW({ c2pa::Reader reader("", stream); }, c2pa::C2paException); +} + +TEST_F(ReaderTest, EmptyStreamWithEmptyFormatThrows) { + std::istringstream stream(std::string{}, std::ios::binary); + EXPECT_THROW({ c2pa::Reader reader("", stream); }, c2pa::C2paException); +} + +TEST_F(ReaderTest, ExtensionlessGarbageFileThrows) { + fs::path junk = get_temp_path("detect-garbage-noext"); + { + std::ofstream f(junk, std::ios::binary | std::ios::trunc); + ASSERT_TRUE(f.is_open()); + const std::string bytes(256, 'k'); + f.write(bytes.data(), static_cast(bytes.size())); + } + // The file exists, so the library reports the error. + EXPECT_THROW({ c2pa::Reader reader(junk); }, c2pa::C2paException); +} + +TEST_F(ReaderTest, CorruptedJpegBodyWithEmptyFormatThrows) { + // The JPEG signature survives, so detection succeeds and parsing fails after. + std::string bytes = fixture_bytes("C.jpg"); + ASSERT_GT(bytes.size(), 64u); + for (size_t i = 16; i < bytes.size(); ++i) { + bytes[i] = static_cast(bytes[i] ^ 0x5a); + } + std::istringstream stream(bytes, std::ios::binary); + EXPECT_THROW({ c2pa::Reader reader("", stream); }, c2pa::C2paException); +} + +TEST_F(ReaderTest, FromAssetExtensionlessUnsignedReturnsNullopt) { + // Reporting a missing manifest proves detection ran. + fs::path noext = copy_fixture_to("A.jpg", "detect-unsigned-noext"); + auto ctx = std::make_shared(); + + auto reader = c2pa::Reader::from_asset(ctx, noext); + EXPECT_FALSE(reader.has_value()); +} + +TEST_F(ReaderTest, FromAssetEmptyFormatSignedReturnsReader) { + std::string bytes = fixture_bytes("C.jpg"); + std::istringstream stream(bytes, std::ios::binary); + auto ctx = std::make_shared(); + + auto reader = c2pa::Reader::from_asset(ctx, "", stream); + ASSERT_TRUE(reader.has_value()); + EXPECT_NE(reader->json().find("C.jpg"), std::string::npos); +} + +TEST_F(ReaderTest, FromAssetGarbageThrowsRatherThanNullopt) { + std::string garbage(512, 'w'); + std::istringstream stream(garbage, std::ios::binary); + auto ctx = std::make_shared(); + + try { + auto reader = c2pa::Reader::from_asset(ctx, "", stream); + FAIL() << "Expected a throw; got " + << (reader.has_value() ? "a Reader" : "std::nullopt"); + } catch (const c2pa::C2paException& e) { + EXPECT_EQ(std::string(e.what()).find("ManifestNotFound"), std::string::npos) << e.what(); + } +} + +TEST_F(ReaderTest, SvgWithEmptyFormatIsNotAManifestLookupFailure) { + std::string bytes = fixture_bytes("sample2.svg"); + + std::string explicit_msg; + { + std::istringstream stream(bytes, std::ios::binary); + try { + c2pa::Reader reader("image/svg+xml", stream); + FAIL() << "sample2.svg is unsigned and should not produce a Reader"; + } catch (const c2pa::C2paException& e) { + explicit_msg = e.what(); + } + } + EXPECT_NE(explicit_msg.find("ManifestNotFound"), std::string::npos) << explicit_msg; + + std::string detected_msg; + { + std::istringstream stream(bytes, std::ios::binary); + try { + c2pa::Reader reader("", stream); + FAIL() << "SVG cannot be identified from content"; + } catch (const c2pa::C2paException& e) { + detected_msg = e.what(); + } + } + EXPECT_EQ(detected_msg.find("ManifestNotFound"), std::string::npos) << detected_msg; + EXPECT_NE(explicit_msg, detected_msg); +} + +TEST_F(ReaderTest, ReaderSidecarEmptyFormatThrows) { + // External manifest data is always matched against the named format. + std::string bytes = fixture_bytes("C.jpg"); + std::vector manifest{0x01, 0x02, 0x03}; + auto ctx = std::make_shared(); + + for (const std::string& blank : {std::string(""), std::string(" ")}) { + std::istringstream stream(bytes, std::ios::binary); + EXPECT_THROW({ c2pa::Reader reader(ctx, blank, stream, manifest); }, + c2pa::C2paException); + } +} + +TEST_F(ReaderTest, WithFragmentEmptyFormatThrows) { + auto ctx = std::make_shared(); + std::ifstream init(c2pa_test::get_fixture_path("dashinit.mp4"), std::ios::binary); + ASSERT_TRUE(init.is_open()); + c2pa::Reader reader(ctx, "video/mp4", init); + + for (const std::string& blank : {std::string(""), std::string(" ")}) { + std::ifstream main_seg(c2pa_test::get_fixture_path("dashinit.mp4"), std::ios::binary); + std::ifstream fragment(c2pa_test::get_fixture_path("dash1.m4s"), std::ios::binary); + ASSERT_TRUE(main_seg.is_open()); + ASSERT_TRUE(fragment.is_open()); + EXPECT_THROW({ reader.with_fragment(blank, main_seg, fragment); }, + c2pa::C2paException); + } + + // The reader handle is untouched by the rejected calls. + EXPECT_FALSE(reader.json().empty()); +} From ceccd6f906fc7890610f05c0a69d6d93b4dffc51 Mon Sep 17 00:00:00 2001 From: tmathern <60901087+tmathern@users.noreply.github.com> Date: Sun, 26 Jul 2026 20:07:18 -0700 Subject: [PATCH 02/27] fix: Refactor --- src/c2pa_builder.cpp | 4 +--- src/c2pa_internal.hpp | 8 ++++++-- src/c2pa_reader.cpp | 4 +--- .../out.jpg | 0 .../legacy-ingredient-label-persist/asset.jpg | Bin 0 -> 125010 bytes .../ingredient.json | 11 +++++++++++ .../manifest_data.c2pa | Bin 0 -> 63278 bytes .../signed.jpg | Bin 0 -> 125010 bytes 8 files changed, 19 insertions(+), 8 deletions(-) create mode 100644 tests/build/legacy-ingredient-label-persist-out/out.jpg create mode 100644 tests/build/legacy-ingredient-label-persist/asset.jpg create mode 100644 tests/build/legacy-ingredient-label-persist/ingredient.json create mode 100644 tests/build/legacy-ingredient-label-persist/manifest_data.c2pa create mode 100644 tests/build/legacy-ingredient-seed-label-persist/signed.jpg diff --git a/src/c2pa_builder.cpp b/src/c2pa_builder.cpp index 7b4780da..fadf2e35 100644 --- a/src/c2pa_builder.cpp +++ b/src/c2pa_builder.cpp @@ -526,8 +526,6 @@ namespace c2pa } std::vector Builder::supported_mime_types() { - uintptr_t count = 0; - auto ptr = c2pa_builder_supported_mime_types(&count); - return detail::c_mime_types_to_vector(ptr, count); + return detail::supported_builder_formats(); } } // namespace c2pa diff --git a/src/c2pa_internal.hpp b/src/c2pa_internal.hpp index b5a8687e..0e3e812b 100644 --- a/src/c2pa_internal.hpp +++ b/src/c2pa_internal.hpp @@ -301,7 +301,9 @@ inline bool is_blank_format(const std::string &format) noexcept { inline const std::vector &supported_reader_formats() { static const std::vector formats = [] { try { - return Reader::supported_mime_types(); + uintptr_t count = 0; + const char *const *ptr = c2pa_reader_supported_mime_types(&count); + return c_mime_types_to_vector(ptr, count); } catch (...) { return std::vector{}; } @@ -315,7 +317,9 @@ inline const std::vector &supported_reader_formats() { inline const std::vector &supported_builder_formats() { static const std::vector formats = [] { try { - return Builder::supported_mime_types(); + uintptr_t count = 0; + const char *const *ptr = c2pa_builder_supported_mime_types(&count); + return c_mime_types_to_vector(ptr, count); } catch (...) { return std::vector{}; } diff --git a/src/c2pa_reader.cpp b/src/c2pa_reader.cpp index f3e44335..208dd5d6 100644 --- a/src/c2pa_reader.cpp +++ b/src/c2pa_reader.cpp @@ -318,9 +318,7 @@ namespace c2pa } std::vector Reader::supported_mime_types() { - uintptr_t count = 0; - auto ptr = c2pa_reader_supported_mime_types(&count); - return detail::c_mime_types_to_vector(ptr, count); + return detail::supported_reader_formats(); } std::optional Reader::from_asset(IContextProvider& context, const std::filesystem::path& source_path) { diff --git a/tests/build/legacy-ingredient-label-persist-out/out.jpg b/tests/build/legacy-ingredient-label-persist-out/out.jpg new file mode 100644 index 00000000..e69de29b diff --git a/tests/build/legacy-ingredient-label-persist/asset.jpg b/tests/build/legacy-ingredient-label-persist/asset.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cbef45acbbe61275b854ec6238c4187c06e32893 GIT binary patch literal 125010 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

)N_6f8qAclo1JGNVA@Y6I7< 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 UBtsIMi9QI~e;`3(@Xy5m12o>eumAu6 literal 0 HcmV?d00001 diff --git a/tests/build/legacy-ingredient-label-persist/ingredient.json b/tests/build/legacy-ingredient-label-persist/ingredient.json new file mode 100644 index 00000000..19be6fb8 --- /dev/null +++ b/tests/build/legacy-ingredient-label-persist/ingredient.json @@ -0,0 +1,11 @@ +{ + "format": "image/jpeg", + "instance_id": "xmp:iid:11111111-2222-3333-4444-555555555555", + "label": "dir-link-label", + "manifest_data": { + "format": "application/c2pa", + "identifier": "manifest_data.c2pa" + }, + "relationship": "componentOf", + "title": "label-persist.jpg" +} \ No newline at end of file diff --git a/tests/build/legacy-ingredient-label-persist/manifest_data.c2pa b/tests/build/legacy-ingredient-label-persist/manifest_data.c2pa new file mode 100644 index 0000000000000000000000000000000000000000..edb2745f7dc61e744e0eae6e3a6cb78a1a1569ff GIT binary patch literal 63278 zcmbUJ2{@Gd{|1gfW2Yop3R$w0rBPWAp|Q(O)+v;A405t3dn-keT^Rd}^;L;X*VP#xI-f+UxVg9?-IWzp+)v3VEB~P)2j1&>+wYf?+I_i8{{QPuWiR>ryZHrp`d;=2 zPk4Ib_Y?HsC!jj_$~DCqWS8ub?q7}6_T+-!TQ&d#KFH-up5C%9-j_Umz_Xx3E^_{u zMZU~?77w|^uX-0YjeHN!2Y=^wc6W7#Jbf;CxShcM>E;3c^rXw#)75$B{mw^dzoFh) zJqSSuK?v|4wDSbwWT7i#fanpN5FICio)fV%3~56wOiav7j4aH|%&e>|Y0vd2V3kBc2XEU7GY{NyPG1qI<_D(Zj8smaPK$iXjyU}a_9 zyJznqcJ@PZM-Cs6`+xnj(+&xP<77n8e&Ejx{~+k-85o(ESy0xq8YFc_mW`03oQE>^LP+C(=_s{?NxxjKD=olF28JOYEg`f+DKR71?Y@9!_94?seR?Y*_qMoPAp0T3KiDT$e$~MpDy9Pcwg^ z3GCpQNyfWe?CEuLhC|HJ zv9azF8?%+nw_{`7Y?>~TGhXN*mt0 z_)t4#Le~e`&f8T&bzk3qYNcaKt8O@rs^ZwBlEuUK**ZuS9QnNL?zTODv1k2M(xd$o zSQkua1%rI^H*T3an;i(-Vl4Zr^J}fTEVAi9lg-!m2JGHWD;Z9OGL+r@x9IAWqU^|9 zQ8H$#a|CA(#JI|O*A7Hq$@b#Ovr4~bQEZST?PTL=OF&y0YlMI~gNde&59&34l#CH- zzak4;7g|Il^r9ApCAKtH3=8>Kh=H@f+>HQFkc+w1%@6=Cym*`o20?^6ARlvfaE9Pl zCL;O`NrVo|)F=RtjxO+0kP<-0zW<6Ul*7UJ#4f!mbP5^L-<5`FP6{~om&s`K$<(Hc``vYieo+ff6I$5F!V8(n_Km5;L)?q!I{QAO%*_?5P__)}E>sydfU**2<&(J}NXg09Hu{piE? zv7QD0b~+lkkb0 zSK7U5V2`0h9${oFgGHI}lhS7NR@L%ROM6XthAzY4cnO0;7%VTm zB!S>`&%g@W@js1o5f^5)t8^t z_q%_STd*N|&qX`5QAzAs$hSyMueN<;z3cKaf6cQ&h8L9*wc`~;?F1&v^!$}Brlh%9 znH}RgFlVxCdx2vQ*Mad`aGU+2Jvfs(KtH*3MP$WZh9JcKeoVc72dYJjC0HIWuc#p~ z5)b#)56-G&hu9L{&9JwA4h*5zYYZ@!v!z^rKbvqprA}ieIj*GO@#f31Jv-2t^-Z1d z)N>B#mzS{Dr=4$$jG_!}PLI(&-6YtzwK(P+boo*{ofA6|7VFUI|GDT$nUB?xF1l_x zr8otgwg6TF@*t}g|MWg96h5vJHay?C?iEv=uP5Q33}1kfh|b>#fl0&~UR6W|ic=9n zts?fATQCq`+F&oDCVRR)1Mos0$dCXYDvT1ejlPUVn%brPNNto7vTx_okf)(dmfkK?ht@2vSD~uNRJl*kE6fBQ4+gv+1YEMzc0E{$EELRmd zeJ@MQwb1+^nZS`VF0lh$&NmzJa8*d0&cxQ7mk3Lh8uI==?RB7?L}v2kl8bCZD+Osg zGu@xa|Cvd^x;p7E4@3xNQ(P}8hB6o4>OP6Pgkr&CedFLozv%gH%Fo;?<=y%d z%gBO8fPBZ|gDw;DQ!}ALi-|I%%VA;p%4BpNCvkOebjcVhu6JQ@n+myHSlF1Z>HQOA0$|Ah_vDao6Jd(nhwdpsRe1uA-qbC30bQ&R}yKg2HhhoGhT z43vTeD{chKMlHk{hma~fY2wmR!J=<6hPCpdAw-J2BS{!QM)DTio0d+W); z3Bt_j8Mm<$A1WL5-FW@|D+fZ?K8f`g+E(yACW+EMIQt$?FT2`=!T`nblnBGAyK2V9 zMt_+(n0ve%pXTikoxQH%b?|q?~qsiu{}B0^K--ZzMwX!l9yHcy{8Hn z{2SZIa<*x4Bb$4xH;a9)$WvPLtc-7;cw^A}uvQ=>_r(Rj*!4kcH%Yrv{zqok+2p7* zpFh|*E!vjde7|8TqRwQqaiGa!sr__TI6ae1DC9ecj?u*VR-t}eJ~NJujCzeu=gCY54#5WdmuM)1 z7Bx@Y3Ia3^ubf5{AFLuo=oKzsl}Rc3UMP4ja1vGs@Mqd(PhXo;uVTD`p-ZN*1rtC7 zAR`JilbC>p!Xee@1cGFuBw`H^f&^?b0V({gZ9Ee28~jG=1Nat@2S6u%`Y)UQfMm5a&V_SQZ8jpT>;`J?Q9P2cWll26 zSA~Yq?5Tel_Z|&viy-P>2om_k{fg4nWHam#kkDarcz$R;sfEpWP3m-hc3`$B1wO5G zQOAeXt?c7{$I(dgW3eEC6WJogH_Fj)R z#TOD*o)~Q>>_CgQ6*t~*Xo#o_Iy)r+I6SL)g{qXFFr@q9*FivaJRJFzjEGh54BIRf zP$=2+`lI6cT%`?aZUWqiUZm1SKvb6C(T~$`Z{w2ZADpfqQtOlB3LG%BlgqL zd(P1@;n=!tV23e86pzINqM$iNnuvIroA-m&w&0-`K)nR|5+z{F)Cc`$1a8D2P!YYb zRfM56uBH|Vp*m6Q!(fSlM%)XeE&D#gAy`gud9bVijFzHctnLyCY?xpmW%xklS&&|=0U^)~D0Kh(-@xNUD;p=#Vdo_bT5?M0ha zX$v;WIt*`KR|;Z+I#lU6UNC>O9})p{wMt znjAQ7;Zc3t{bJ?jR8XwB2#yX<7bPBD*Mhl|)TsE;XD#0&!;z_weFcDI<^5xRPD9cl zQ&_)jhMT=tW#Y=A$9BHyr2deapo?7sebqM#Rgq0o)kR7!UWpO2fma_toT+((xn!Gj z-&-omT+Xg;aidI1tagtLmD6TA=t5+Rog(2U6MsJ8tl(JG!SI6mEk*3wpIO4Ea)0SZ z^v+dM!qP06vhkb(W+-;2oG6hTY3OxxU1HCS>#A~$t^T7iT~VxD9XV~2I@uqZtEqNI zaZh|<*lIz?v-A&7Esv}Mj{!*J_ws-b#!o?Tbu;*A>HzO36eXj6@(A{#4Hk+9jsr_` z9Ke%^0|kPW#T@*q5|AQI9lNAPkLn+CD_!5_ z+m_@ihX7@}2<)*^fTp97m(tS3?S9+P(1%3Bs`jCqU$LFFA&bHx7)spHogN|=8 zJ5Zq^_0yyuk)!fSL6iH2*90hHq`;*wN#)5}w80O0t4B;2joj)8&I;;Z?V7I5rr7!o z6zJx(3Z}<9OizU(j9q{Q2d7ZxoH4%w(yf9^Mfyo^Y=%(dMe?45baTdJfZQ(UkETs! zt%=L;f7o-@r>FFX71_EgcRl>!buQI7bFgqF5ik2FZm0?Pgn@^#8YR++HyuMqe%jqU z$p%TCW!!LhHi?{W{3}U=EYZFqBVYI9+72Z0bqA`fa7;Mpa{J7WgqaZW$R-E;hHQZi z6HdE-&@qZB)-p;o4QtNi)AiPKPrqg8K@$zvtEOdPZ9@YBk)xxIZXSg7fRn%8J1cG` zU-9r8Y+>dL_696D~e=H z^nqbP4@9W&5-cRJyaYlj(okyDVIs{LQy{A-*scPsn!`?GY8SQtxDgE;gCT?lCiNM3 zpFq*joa-N@Ca>{1-~EAZoc0de_7S`sSUw;eRHr8E{?z7^u)jI)L;l_o-^~;WmFnS2 zDSoX2rX1g6>=O*n%nWm+dg17!iF4|*8gC{2%clFa8gIU znlB(rjK9kfWrEaG6kTSWz6|N=keI% zX++4wqT8ud!THAK=-a&{DpSbgT0_aSMP%U9T;;pS@;wfe!Q~&+EAw;%0emYVckJ%I zMt84F2qeUv$n`-SdVd=o9r11lnj6TCMGNbus+(FicVfdWL-*kx;55(P*0Re8QYC4t ztJQMOeF=)7+oBd!0oGW2?j7vme~z+hcFL=Suv{KzZ~Fs#OaJQ}j;(j3n<;Fic54VC z=WeTy1$vyg(Vw=&`Q>NT8+>Q|=GwT;kNdqR&pgph7YMU17Y{4;H(F0SR^|~aQY`W> z8^VL)2FB8*n*m895dK}PbhDtN_bXb6v!nK_o3n$o16;ts1OQ7wgofA-t%85}DSN%l z<)mp*$8NnM7sbZFjhO1K2zcan)+S0u!CK@T22aQ5jLT<2GwF4r_5w1QCmb4r{i{o< zAq*3kPv9^E_8Wl)uqc5y0XX6jq5XySyEF=}zRl^uJrJx><|lEQ1_>oszD;B(^4b2d zSGILP-j`9j-{jvHRN)Q4gu|FW!r%^fZe2wxPvz?BXNPvGOYF2FG~* zbboMa@nGCs;o9kG`LtGtnt_V5Q`fj1Z=y%0Ky9ndn;u0uB5Ef*S;5H_TgE^l+JAAL z7DEq($2$D!(KSAOkax0)P&;`l;6ZqC({$~ZrNv}t^7$M!k1MnO)lK1PYGJMPkW|~xbz$Yh1{OZZ(oiP)^`aU1YNu!{st^B3*DnhzM&9o<@?N(!G zj(EKQsWd7!KPfuq$=C}Ny?xb^Iipv)m{D-~#J9}eZBaEBTet20$HVKvwzr+e&zya- z10nWSr~SZs8l8Ld&huLR3EN9c%kKlhO8;}}C1IWf`XCf_WY>*=N|q2!-ya2XuyU%- z14T&Rik?48K=TMp0kCJJQ)LrC?Zv|INQk}%k`Ul-f0wgR2Y|35sp)1ok3|7OiN3j8z5vroi@Siy`CX~}u25hT@;^)o8=QxLV~6Wo zI)b-Eb=#*si#1+L^5Oj(SiUyL87RGNiZc&agR*6 zKuM=&vzI8JFORh2mun8jqu5BI=jAdx+aIRof@U9%WGdDVu1=+GmN~JeTTkL6QnU>* z&0g;kCa202J-IME627VR=LI=+(+fvZ?&V(+*H^SMiq81+k*zV`pvj{TdBUg5`tr$6 z9AZjMrcZ!%f~l3K6}w+Cugu5cibvKR1sr&H}$>{q2v?C(Tu}Ndwhzp0}??*~UEWI6gs7|iFyRHTEFx}y@mhav2ZQpL3 zM{)(P&o+WfWazlj`Sc4xR6|#$sotm~p0+^cU7$D*x!N~_~TwTpT^aLbl*M@+= z3_yt+F>?>#ga^h6l5xKw5n&H-(gm`%7?8+{hCUF((Sfw}5?thh*t853t$<13lAG-T zAQG5103P5s`}z0p;Fk90K#BlbIq;I8yfJdN_cc!Ip!l5Mtf{a@zV&+fO}$a(kBOTC z9^VE$PAx4Ll`-{wj{I1Vp6jYN6y~{HVbJnmqIMAFM{oaf?S$V}PT@f%>F*1qTVkJ1 zpA6W6LSh)~(tN_0WQChOrny&RL{oxnk>y>}bGE6EOvWv87y6e}MYT)Fn_uJ046A!5 z{S{o%6FR!d$Iu`4PTwG%RAkvkuTH6R*m8&=TGv9E@pT8HZ_;SdoN?IREC2ZCD&xTz z^oQdczue?4S+@=6i^=IPQQ02o#bR>mOH}YsYGa>9* z5lgR>$ErlH<+>bPxOo-_IFwn&JG>JmxC7mg81rn1j4f--h}R3OI4yDcV!A?8Z+b^k z2dD?!arr9tc)r}LTC5HyRYjky zFzeB?qr#kz%mF)lhkzX9{})U^y$b~AUoc^rf`BOQ+FRJiaKotxw?3SnCPPCw*p~dp z2xQJ&E;n%Y2`FfIiqJ`My%ms63JA-};5JMRz?@Ja695*#2^~m9Kq{spNoNgiVRN$E zc7dS=SPPEH4F1k*!0*2y1H0uJCTSBzXnR_`v>O{cDGjiq?C2n*XU z_q$OW5@OVg3nKaiJudl+*nbY*T(whqFga|ftNhnk>!#OX;|k;1XS(ldsx1QtWd^>c zH#mAsQG#@iO;$RVXmyvJ=tQ>#j=KjiI$^O&~*~-5tdmd2nF{t{nxQX8RPA_z;0F z72{+sEJ4VPI<2s`3)Ow-%07b^ZvVB z*U^zy7bj)QaElT@q z{_9HmRt#3OOq52bK9C|_G7bg}yy`CCcyMsU0*nc49W+rwkJoztd{6`8G8iu1j4FU$ z;N<;yIRznL6%A+ez?}fULC?k}ZU}`^fE$5JWEc@N@_^kea3C=2O~FhCxDVv+v_OZE z5#pg2M#aQvWsY#ze!HC={AsGLZFD12dQrb)QeneO;Ea2s#u{_B!t05;tVJY)-$^@J zuF1l~_cBs_QXbW-O4JB?d<`$~4<8zT>xT8HeyE?*D3LZ<^=`IfMdLd^kH7>$Z{n(# zU1odHnbC^zfF~1yk!_%nRfX#u&#a#KJkim$wQq4g=zL_XSI1kaYpSAj4V*xbt@VnED0#M|Fzx8IFyjWVvP& zBcG<({Jk6Au6+0=N8nf{svo$vY7GEIs+3K|_4mwG-p%nQwC+In`GR&Jzv|p)K_A=V?n|V!g>JUB?h?(&nQuKDoxiLfsvdeh>^fX# zaQbjahhach%4W)x*h)EE4rScdT+{lk0Pvc_bqp?2ozWVtASzwa|ZixE_mQ$LEq*q?a8nXf#dlb*&v?%JAws}f@NzreY4`$ zh`ve3b}=;g`8D#7luo#7^N~z17ys4&@kTIcy6IpmiRD5m1N0y49bnGus|VN}y3Le6<r}>XMseDgE$jy+_pGIGz95@=HqT$WmXUu#JJ`@2ePI z0w{J0^ltX6GwvtRi~P<|P@rpL6Pj-@6eWVq*XxD_gBwoXfXQXYaq=+T@u7$F7q~M6 zYZK@N!$lCxNJ1~EfNRu&Bw-Cf3zE40cYYfjo9bXuh6b~v!Ilp?}ZcjB#C$9qBQ zf6OT*YNA+(5D~IIi5ynp(`Tx{`Q@GZXb#)zUQ@tLqT|NgWomao_ zkfvc%A*kt-F&=8I!TIS@r^Vs<@fwFlQb-`c&bO*{OiZm3xVFH>7OEfPY}-4&14Y{w zXuGgxJ3S!PjC8SMQlt=Eh6L39jk#3>cWsRX2 zAKYwgqn`>I$F}MZQQf^sF2~4qjgsrhZQ1 zY^R4{V6F_CDqFu-TcDVk%cXb^p$_`g=MgXQI}lQvS)k^uZO2XCRvESI3717VJHKv9 zRNX|?BXy#-=zOVeiQmyuy_+&A8(#U$y7I9DXFgB1W+8uY$S6cCWmY(5OloE;-@Y8- z5#9Dtab+X>=xEQvr(+>m{uNhGb+3xN^?I=(Q}>XvSh%Lr(C1}aVloxFnsY-@FJBQ7 z?S3gc!*~gE^m&0#6)LlPur3Dl+@+SVQQtdTO35wn<2Mp#Orsyx z8ty>z=d^^GzGU!MX4U>t9k78{@J0q7^IvIP-8lLT|K#^YOk*4j;=UDw4*(8KHZq`H z45X^QmMc;-OB73E6B=sZ%mp-x_kudwf~)%!Nt@<@yXhtO1EB)12J#g8q0C0p z15CT+bW#OOGjVb>$P@s`fW!}c1}e}c5YR~;S_6F`%&rsO<(Te&dO-jm0H~#g|I9t` zh=79tWtJoWFJ3Yna_YH^?z15!Mt&{rrzChA`<~6|`JTHu1NuM&4Vyjquv|qkVc#pA zR|Q%SWWT_M_*vCV-P(M%Wu3Is7Y4pI5Erd;aUTob=<>}kldc-9n%|x*ws~(wzo~jYl6^cj9k{yT`y^zrVEye{mGO#bXPrE$<=NQ_k4p{B8)iOE1`RjAw{B~3 zl2P=m9l9>J$lE9-4}kO4H_dCI$}meEdqV4`cOc-=y*?)e4H%qSjBOMu(4^~Xb5n`;!;!lrjl)vemMncD4si&X1NK(uP@Ks=Cuiy`EqAi0V- zccFQ(u%mN5$R@CrtDau?L&5VMXriif9o_0z-%jrH)E|wNE1e%1`^Nul^2=$@5tm@= z3dB=GB)?KutN5q`1ytO%abYR;>fRxrfl=A5i(ps?;aOl&ViO5v0=|R(937E_+y8&y z2bL_*5z^G=j}pV>-ABEo?xi&jQF{U1{B9@H5A!#gsl`r#*O1_mz_D3&Tj+&CMM%bE zHym3$JhPOsiT(wGY7n|T7mfPH+<-&QU5JaphEy~^0$Ef&VXrVUQ+VVgu6Z{ zr3%;N@KwCmj%ILS`5nqS`57}VtIq1dTiF@?Q}s?5;_~n!GVGnk!y6m- zLmySfF1S>N$k*)sx&{~HQu2Mcx9B-_5uA%>)C@`~eP1DClTyX_J9JO?aCB<@T@C+( zX6Kw)Z97b;qlW0*V+nX4$__8O$CN`kB? z!`tEm0uO)iSC@Uuek}Z1?1hc>#+jv=jh}5?XH1G}B<#-wblSb2iWQJoJY{^>%X&oY zTPFWC<#(itgM{UcHD*bNgR{gRORN7Wm~g=J;9<|B$hcpf{sfDz!D|AG-3A_Fe6?3M#FEcCEB z-VJ7IRze(snz6U`CB=q}Xw4l#0^saw@GZ)_X+sOIc$@>$PlvRy$ z0t{t>3g=#}XWo4j%$V(X_vRa9*4NPGTF>PkkBW!qCM$K-!WPiKwu|dMMs=s1TW306 z;$13dh-fja8{a_JX5(~WprzX4xwMD^WcV${h^cS2%$v`$gX~s@DJkgMB*miB^1j*) zo9fF8n>Asi$w}_yJpT{RO{b<7yuN;Fn0}gW+v%`6INj}W`q+mmO(9|spRo%88oCIM z9d(v#9{afFXl1;C1op%6r7H?ul0`nT4pv2k<@Ym~7VZkiY$;*kghGSzH_~zge(yK1 zrG0XN;bghXRmxlqYbq|y#y`i^qi~vO{Tl<@;{Ct|4-^@9xZjvR`m-k^udO)% z$FyO*ia3_iHsREQ+J{kY?Z>eVjX%p2e6|DqMU8j5F%M#2J|WHn17zxt`+c6?u|aV! zzv}4w45AG9Zz%tzFZ(7jv#xOM4|#s+0Q(BZ=nY~@;jRr+p5PmCmR#~z)Ux>6W=4ZuAz=Ab%14&0M8Xgjj<0=C%;jI=mAMcdD(Y|0K+>Ui=LN^27b3eai)_zcuI$k7n*0{rK)swXs#H8Q zm~$XY_QbWuwwWd{3RxvQ-bYY_KG{ z&%qa16cdg)xbOycux^HU^>KP;w@>Aa_lBCceIB=ydMNjoupA|cbliuvslJq+<;RUd zi4QAfUm1RUv2ZQJ_L-|K>pUYJjcllDB4bNZV45zdMcVzGau|MA&;1Txfgu#_20SmM zwv~*quZ#%qLUGP`eUIn=>;>`#tNtIRBOFVKpE{2YZFID8{`5iSvm@O)ycOM6JeS|o z2a|Q9up0@ht2&)lK2L_n4Ofqdt<1eks{u$JoJ0z~>OBM^S1~+*17Ne#I5A*H@O*#^ zI8Zz}>HA3-hTXAAW&jrpF@PGHR6rmyhE)rLAnEQ6WzwV2R135t=|Gib2lIqEbG;(w zDhMdqdP$5t5?F|wf|n$xMoF4d5PCL1w=_Yr%uYD;6G{Xw>3^XIXelKMIOcySXC?{E zI{e@0k=pml>D$kcKKoSGh`HG1Z62z@Qf1}rHf@qoW~NoxQV=_A}%xYHK3a_TG_1J zo{$;2N3A96T1$A>A4A99SqGD#|54t-m$dL4z(2?&` zhEv^5=ugG(e)>_qDzcPy7l`#2h@Bijzh7W;5io$yBYzT0+VP1pePqbUP>fSj{f+zC zFT3?_a1Dg32p@~bImTu!+7=klr zIi|=3449QSI!OZ3 zD0EFmNQ1x_0B83NG-y>7c%9z?PGR0|jQpS9;gd~kQzDG=j0eA!??4_)>`jr^CQ6GM zUZm@-nwfbHP7eQ4oI0;P?soch?f2B}9jMdp4SKTYp^unVeMj!Xz}KrSrr1~0cG6)) z^Fg{!N1dFK3l4GR<;1Sb0`=y+hdQkVJB`1F>7Ph(lZmW#%yAH)=<9A^YTwDsrM~J? zf0hnPK{GD%fZoKQcR_JhDPYj(ltr`Id3K~}zMj3a{lNuNh^$(TdZzcY*1L;fu3o5! z?@)!qoz?vv`7z-5B@yhW^6dn^;@)8f>##$6zgL&1dyDgIhg0|<%e$5aryWF|2$a~Gz20PvK1KlJh|7ldf zBq8qAwL+g28AZ3)+~em}zXe#$6k^T_jWs!?yBwXc&MiC_6sKc2ERz=G*`ZQbbB?7Z zZv%}VMKVXS3+hrnH@nDo9&}n%yq00?Yu;=$@%)isxc$d{IBopl+cIIR46gPzmDtj+ z6}M7L&K8xdh{k~%kJ^}w1?ZmU6 z!kMMuMcrGntTl7=WUp`HVHVJXYR?hr8f7vxIJGc&VYYZ!+Mi~V0v7(bvtkex{z56BPBB7K7-Ta`0cK+ zEhiA*q`rRWS9CETeiTKoD0lUG*M@Q=58|!L`A{oGyfPurL%R7qn9}-j6%*!o^)|Lj z<#L@GZ5#n62{59`qysuf*0iCBb2Lw5BU%eH%u$_Hz8cm1TVS0)ZUR;g?ny=QX=4*pq1HwV-koK+?o2XDjZfx7)WsV2OydCajJFr6LDwUoGMu{$n_7X@eKgMhi0FMy?X>Q*<>Mz^H@rR_@A=MJtS+!gX}FU#rzsxU zPSPVh=*B9Ut(jPVk2%9R@!>>nM9D;Cpv;`#9kjBFKVN{#&+lfEsSln-CloUzD(du* zSh440%aY1f5*N)=Z=c10q3~*_#SQNb8yl=dQtIRf zz55Fkp&YC`BSFXCwpbC*HaUYI5%YuGR%Jz?azkeSX zbz7P!ye}iPQOdXW;Yvaw=&N=bGb5!AG7~Nzt-LDKDiq2;WVI;~GQ9BS*KFrYt)Dqm zR*Vt;Sm%WR$C9$!p^sMYlFGX8Hq5*j-CKI;5)n)!Z+J$*yC&PIJyjk^v|5;zqSAbk zPYTrp%<2_;8Z~}4P20*`yxzT0O59pWa;tRrQN)>Fd|+;89<@ehH=4k3MmCbB&z*FQ z_dg0o@#J04Gza6D<>qiq}Gzo1T{wCb)L(E=K{g}DZL-oVb>vcdL%xQ~;*TU4o39AtK?`C7D< z0=R+eB|2$%V*oxcdGCKX2HQ@%>fx|Yy&)6086uHZAz6|jieF7a^|h)wPsmQ}MfpbQDN^+v z_;^+kqCH2B5!9^7Vy*Y?UQvSQHYSp<=942ikn9b%P*h*>>Mg$5B~k5=tB83!$WXSjy$~hl9Avs~p~CpH5h zX^XdXSFQXZ@8S-NYK^gnfx2t#s|w}A;f;~C4y)PZ8}IPafp-;qTwW!YKdapp8(>0W z@pR0kV2dIP{|&iXn>#H0>34*p_meEdO@P_m6(yLKh(MPPQ9w`X)Jz;0+Jko+!3}Tr zG9XMq*)f7NAa{mpQ-#qib zKm!+1;68X<7=Crw-uzZCIOLnzK1>$ZK*qY5bc)KoS)IM`zGEikD7t8#Z{B+b6cerd zfmV})?+ZHO9=@obM2|l*y<@ofAoi3wQDNe-(mvHO@s~xvSvOks$vKu+E z$uoE`Z~1+u;}U373u>J#V`rik+^o>b&<45P`t4(bdBZ!1u&jR?kRPAF})J=YZP^d|q}hDM#Xgi$RUXC@w6QQi|9bB+-fQbfT7VqNnEoj{FQ zv39B6FH)CxpjTe$Klj|42&MbfU@=t4EOX-9)(}e7NmeSTs%zcz{v)2$2mS}k&o5SO zt(*tjq&!v|KKsoF>*fmj21p(|~2Pq1~sMFjZW(spnwQHq`o@@ae-`ARQYD-X+Cgcu3B= ze6Uc$dBntys&0II?f9^1k74`;>%4$#t2sBDrq+)xF4_tnBg}j%yd*bY*}f3!IpSll zy=z>w?tD2N;X95Kuk;@5Y^^-LRBfbvnPF^C)h5`<=+QB5+YIU!K?N5_{yjGLk9wIG z8)QwPLhItnGY_ASd`y}~J#!<~CH4hkUTcrv{W?V97CU}Qole3DOm;4rpH&?x10yqC z1F8Dm3)IM1{^Ikz*{f=C*0%MjOq;_IHtRf-w(;a(>5941!b?8b6>@{=lv4NUxXu;J z2A8_t$9BQVU?lxS7s`)4J_38l@1T!B$KxI7+C+)T%%AQG4O2>3TU_0lGnus*={s!T zDh7Mi*0jZdBblPB?W5x@2CZ%u{&F1-FwS7ksYoXPm({dEV9+W6FyRCih6#*yg60vZ zix2=dOw`@oT5$0cx}xZPbwEbm{GhZUg|Q=vgz$S*VJTNw0VXAI`9PrP%`F5$WmKaJ zkB5UjjOfH933_3;6G@xM0@egJN`H^)?IH#y6WZiB82;Q1V|HEdGZfL^?$6kHAOadM zKG|hFoP6w_ST^pDZl>PXPI_f4T2^t@-xFt&UvSyB(o;8c=yNJs4ClvrmVavk*L$LY z71tvayhIn?N5wrsnN~DCT;C)$g8#Sg`t#;Sih#Dp|iJMRh^x(sbGH=#qkmT6ksPtn+sC@E}uX_ zQEgi2nazsxeV}!1`u6#@YT-LZVV18ux8N9k^P$xLFF_z7VJLZFDw#v|7=)PWD)0q~O(> zk?G>OKDk8^yGlV=d9JRQ$girgTU%x(vP*dfz8JHhGUcr&MTu`%a1yWw`OArRvPR1r zO@tD6H;Is1`-rcdE4Bp(LvkNEPyb=-Qu@vuwjXdmo09~FXP{`>p0!%g!m?p7`yT)S z2B8~FSOI470re2r$p~hwnBZxMy*O~;l+gyxL5~%1Nh#oxG(TP}-Gn_ls=?9*Cu`+S z0KqnLwtK; zqO0Lljr*09I6u9PwHvD*ITdfp3~Y0sVP{f+NS8B;`D$kqr0-gElQR@7%1ETk>qWs4*i)k`1z5!5qj{pz^My5|LkL1S5E-#5mxraaBr)U1dl2li`9W0!O1 zevw9XKOAfS8qgqfA+ug>KUfXgPBsexc!q{W2y_Nc!t)T+i#jwR0zQ~T6C$`S0S*^* zA;HiMJm^^pTi$=cXSbf7o}*TO;mH6Stg#QZ3KSvh6g(dqn3y>VopcM+op`uJ3OuU~ zOe`-v84Pc0bNyF^gyN3cWf>Zo(7>|`86JsUI}G0of?+`ub-Gv9-!{!QZDYq%9tH%> z^ePYFstzi(mj8+#b&Efh839^m%Bg$Otrux!6g4sC+C)WUCM?ZnORdlhDfM{{Q-mZ@!{RVm~wKMVap8S&tz zx`DSP9he^JH(N73Rt;HVsT||zG&;&_8KrVe_7na?Mq1fR%Q*K60=B0GX(~U_GA3F) z3V^o7g)ou!xSnAh_6iZsJh(7%ceBc2@4LIr22uhXKutvi4S)fkj+)5JJ4SGqerB*( zAm>`?DK_4Mrm6=xzr33*EPLDYTE&1sHJN5bU>7Ho|n|86r7*mo*BU1OJ5|;nNaiP zU1d(6>3D-;sq1RiS0w79P*geIgMYxYdI#FUn7DQs!|+ zI-Z`(r6#0YY|Z>;Mk(CWmJVArkzVB>yOJ)UV*Ur)&{~l&+n^{cAm0_m(!Oj#HAd_A ztS9JQf>!nr*d0mxevVT_r~|MNkMnQa3o^ABP$Zp#`Q;;$dAQZ@XdQ$C#f*A-=*#15Oxl$(+x z61tHYnB*AQ;gqZ(sj+kCGlu52Z8AVJ$>EPb{H^tf0l_LpeEs5PNo@wtPXr1d%P?H| zBl}7ac0hPuX{G^b@>dNQLwGw4vfn~_0xhCe!8nV@)q0pn@miN<8m#}>cetW@8x73Q zh{DScB?756B@MHdiH3Em@O~XS_;gkWiWA*eQm^kdzI?a#R~mPpT4>zV0h003DTM{I z^99cd0*sgh|G^3z7#TNd9a}(#8o8tg4`z96DzJFz3UyI+ZYPsb`*t9!T$x`Kh^$^0 zMn>^PNSr?(&$r#Xjjnpz`ePn^gAE`Y=i%UAZNWdhZY~5c>eL^wwUwG-YdT;yzAZgb z!8I$VruF5E{Pvb}IPz&wH$#)Hn+G1$Y8JPs0may%!)4VygaZD!CHJ=`Eu3Y2MM#c! z)yW$&rznk&lqgd7z%J?lZWLuNm?&o|X5cVpL4#?mzkYAIR-|pA1ub_l)C^)?V0Y-G zfhB&O3GZ@3gEPVOUqK#B5(^n+E-#P#hji#B+_CH|e0aKJI7~bq$=PiOObcv%853}< zSUpfXiGoRSU|(nh!@%|atAwTjW!KukJ#84GtGgHP`QGxObt_VxQ$}%$?ONppYaKqpH93qt9g9IN)hHe<#};OC3MIwA96!BiRq?tZ zdi=zXH9N2YXl-`Fe6rN{nr5x)9z}g!tI@_b&F57C8+!vP-<^2bt=L+gJL+1NL}_NI z%Ig|XnP!AEz_-+Z?=%D5(?bSH(p@*i{~x}-JRZtDe0wC?EM=<*MO3zmke%#X_Q6Oh z+cdT!J6Vd75QR{-B#b4@SVO0hY#}pb%Sl-pTlQV={fs*2{NCUDdH*=a=}_`K_xE0| z`?{{L)xF|4g(qhkF)!m3CeFNXoa>w1ob+&RbGU!MyI{y~-{%tyPA19%;_#HNBzzlk ziK)a28C8ijpG;oMGm+1GlrQ6?*2c<`-`G_Z`#1V7h0GHWm)~t|QssN?n{QX9Mn=;3hTci4eP_3@`PGzQC;@Rnq;)X|jg zJ<^vg7uZ+K?!Jg@4eN@x7~qMvwCv1_z2CevetYfRR0ukxUy4W{GG}~XVL&@BYBJy|4 za67(DQ6l(cpSU^O_e^_3slcbF)yDB$g9A6#|4K=TOHqWrKG&JfBXOd{7=HEl=6nMs zvCj*&O7I&LhDuI;Y^__uEp<^zE>$LzJr@!;#OQ3kuHeVSIo*0MG_y~&7oR_2H&<&@ zW80pV+1-mYzi&*g2IHXtVY@i`h8@31aApRFaV+f?#qL)I}4~821r-` z%`k?isPA*U2cPxx0}M^{xVU>QK&MC!R?}C>vM@kD761Xzou zfR-9B)N}%i$iuslPU`;-7-*ok>Jl|zcDx7>EADae_g~j*=G;8g{oy(zdho=c3f7Nl z1YPtva@b+95@~1@GSZH}kFc8RsLXt*#_M%UzX5Nkt89LKKxfFfePrQyRw8=kCgpix zs*1rtWy53Aa9C*XN3}qJ)ck6zk`*GJTf)aA*T`i5I)(JF1rTnm(Ob_X}xoBPIn?sv2vu-8g!nO9Pe3lw7c!-yV zPE_xY2ReBF{hl)#(XmQ7L;i$wR*ADktuP9{}+-x7zj7WO<8Hsw^~iw6uys(O2* zROgB`S5VDt7lG%+)5n^rw)NDL-4f*LHyCx3?ul4K}bt;<$LLfGY7 zS?u=CKznIht<>Sat=x)z&NnKK>sC1+;*B?>>?`90@0`zLW%%xR|LDcTE{%pw#udAy z+V2fl)Crq#keTZtfC|^?9ey^*(`kSbFn8*e zKb!lq&iFD$A;0dazDxA|{WAvp3;BQSfO7#}H_*iZ)W=;LEP&396Js`RB0{9V(ut|i zE5@5qT&63tq4Z9Y20`u(k`s|gr(2t6vf{XcV?Mc$rKzhJk_qFk?locu?dbJ=qy@Y^ zmf)nmDQH$?>3prY1TX92mQ+`*l46@#ma<$+A@3}EDfVuYn?xh>QX>sUY~`_6gtgo% z^>ikyp)-`lMcs9)sQ35i})#m5G$2jgw;nrl|ak-z6%cI~?$ zr8t<9)UUsAj+baXw(nT{Ec%ip$cU^zj1B%2`Xts8fv->5b1@Y7G4I7w!n~xCK1zZX z1+1pB#W@hG!o5gF*(R(22Sj-v8TB5*0-2JK9}&qeKo#Fd)f*I;(qbTnkePdn5krG` z62PNiDu9dvqU^nr+V;pU(|D%~=%J8)$BZNNmKp>AEk%EaAvC(SW82ho!OqaOD?Ow6 zcVGK&p!_eym)hzepTE7c)RESDpx$Nwmn5?JOumzxda1=!;I8d^+}zksZ+s@31?^t% z-n)XA=+KM5__8PJU7CB{m%MwG@yUndMC-gFggH;dPT|y<2dY9aZv}c|CCrSvGF7-g zTG~Gx?PLD3f}dZnJ@m*}QByK)`XGLLiMngru`h+2FYZzfZVFu$TR)wn`Mui3x@Ax& zxtjYdXIibidqoW13YZqkFiAlh6AWPFVv*lrLfV(~){^qn##u5OqsMGOTlpFRH7IR6<(3?}3mk8R0t%E5dB=2* zmaIrk4a}Jc$nzp&RaMf?kPkA3_v| zDT&5157d#M$!UE&(I!e})gjvSgznOWsIR zL?a{^Ej|K)1C5L2Ls}P6I{I5ex5L{pyZ0bZIRixKxiB(q0W{!JWeb1}+wbf`{XoTH z9{kQOzsDxzmxv_bN60Vct!V%EBs}NsimnopP1ei z{h*U?pzN0J1;1t$CR)p&Y89=R5gmGS(&#K<#WD!^nG7=cOx`yiZY;BRde4|s&X`xk zL^L!HI^20w=Nnh9HEY+SYj|stQ*vVWTEK@C?_o=lrp7@+8y!4Oh?wXPCpf_@3vBm( zpde~!L?L%xjT1I>;sC~#KhGBqzlTlLlb_;aE=HNP*nh0%DOS7#N<|??E0W9BVcQn0 zT%hu(xmdbU&487i#S=Fc0@hVL?IkN1{k)>}SuE!OE6WK zTz;$J@I`%XlH6d%>-ngwMviT%OEXUtr9F)HK2tGrFEZ?XzP^53bMMXRr%rf=1x3fZ zCk8zBW2%`S^8Z7g0_N1eF>((4i1Gk$0~HaJ=igNbQQBg1GLIobTY!K;OF%>XU4anI z+6fNX2i&H3Ysc33RB+)n-kB>(e>b1Zr*?w_i4I13vt5ko1U3#f8c~GTAgXN_fe;-U zw)AiZsG=n#n?bVrJ^yI^hadxo5k$J%z_Dt#u^(H)o$LUS;*EjHrM2RsImy{|RpUl= z?#G^Xe#iQY;$(Lv=!oeme<)Bs!QNwuxnQuW}@dV${4`@C!h!x(km_4&jV^MZ$} z$rZYPI|P;$EqX(zQl|s6(E2ab>GB@o6TvQ^Rmf^Y4)<5jk1gxb!~SKTf{w`#FcBs~m|FY@1^QX6Suq(^_6+ zRn7C_S@-@_v$&&h*c)<_UfP^=_`#ABC*$}FmAY#de5w`aS8CC)v+h~HLGyNb(JN5n zli=oox}-wCVdY`rIKlfTg28+Evy(fciuc>uZUNIkK~3~raqOJ==>=PFNt9fx3#szl z_ga6W5Bs^<7K|~>8Ll5~(l#i0Of9peegU8TlNm3D{B(0a_S>Thbg~G!!3^v$_py>$ z;J;z;0bLtnPxU)mh;%@LkoprX0MEeYkqco?0r-!I@fnak0Jk&Vx}h~5xC;fMsse1o z`8}CJl60A}jC*@&{!J@@$@NQ>)aU z#w7=dCIrJl5k>oq>TOi})^|9Z`Gwlk=W3H|^F{ib&5kE#qwjc<(f4Fy;_;2nQhfHp zmY)foTq9)WM_wDG-Cg|l=^1!c+NU$DBIR8_gLW5ER`tSp7Ct(g3}>5K9T<={?{7zI z{x!lgAEhgIz)O&{l2COhMvN{0;=T6@Yd5EQ!#{>;%`mz%myRbE2YI0jWzsH(1XZ3u zV<{ET$b`heIY7Ze3V1YoDfHT`XmQPpJQ|O7w_UAX_BLYkp=S~gCysY;MS zJ~Y%UTi3iUsm5YJ|H0&YV8I;t3KqK=Bu)o$P*CODN&>&9GwmN@`rhTz?JzhWL~%-E zt;}LFuJq$Pl^#2fG7RMxu%1DCGV6-vHX1hK=JEq4jcFWd~VC#V|pKm4zOrKx?PLCl7Ey- zf7II4*%p>b)Pm$>#-=vU5QRvdpi42N#k~g76D@*fSs;*v;SO7&?(1{*ClInP!y}V~ zQir=aB#ygdXH>D<#cwI+v2dwikBdMCW78p^C~*j3Gxq>E(3qlD>1F>LJqXSL^Age} z!Mch1c&V+`4%0_$Gzw1`uY0rYS<3P>TX)($)$ZIC`f4I@m%YoP)$w$jYRg|g z-*#f=o$mhol5{ph_HHfabgGlrPA&=3IYg&KXJL`Y7l@McJOUn~o`-prBiQroqOc!& zitYV1BbVcsjM&_S68N6p)M?68n5f0O9Ox`;DD>yGQU7w(Q}7$2nA-}hJxe+M2S}Lx zm)t7N4Ls`WRXw_r>d5NravTs>2QSK&>Igd+B-LWbJRbceFVFp`GN?Ayc9@-&E{`x% zA{X|eaz_g{Is^x&4YwDc?^}}ig?f#p4W1$8uda%1^j*P>yqmg8n^5Q)exGV!b^C)H4clDoqopkw{BOsP37wm!TYBd!7XvSSKm$y(krIG)9c#s?h5%kTGskq z;aX65)i;R`x%&O3wl4@T?1 z<}rE7ll>kk`YQo(v!wD3wriC-56TABnClM7x7Y=C`5!VD9(Czi!hgOW6ZTGJAo){& z!5d$_v1)V`t9+%VG5sska`njNt1KF&jVA{TmU2)QDM78XP_T3MoKma)g_?))?6uD~ zcb`~t?d-d>riyV_Y_w~!Kj#)ZlUG@^NxCCoj9ibAQtUpKSM&7Ved2A)iGshbe3>uA z@|d@&zn0I=((=_`%Aqyx^XQv$tG2Fi2ype*U(=1o{iuBru8d?MBx@OfR}mhNKs9}; ze9lY_K=Pcel)-)&0d`=q#Rwvp)R0(!b&w4^l`hPL`6s537k*XLPh=(TK9OO!@h7{? z`^1zp>W=9IRh3LG6%}QMJP}aZaYE}88i5XmnerWc~E#g*WaIK%XM$Asn#;jmU z?VQy*U{jYjlE_sR$zY0m@$!s0$x+u@(Klr(PrBLqfYzM;Hqy`)msr8xjXewnY%xz; zQlD)Oz-0yV97PvTDXOw6`INc@6#ha<0L$BtaNj`T3Ttcu-FLSo>?8ee$NPtF9#wA3 z=`mP}&s-afx{mH&4ahT(c-wW-w(qX#T`<5$(iR=l0A%*l5Ml?VNnM{5g9t&D=CmoS za;$CpmvT)tUnH7IxS}friHe4+*B^z{X z)H=m{jjYV^sV`Hu2sW7PC|~c$zMzPyU#Ljp0h^rE}ZvIxohx|6s>AQPjgr+6@P*4Xzz3P|lYdPDk^L_u$Rg!4fNS~tMi_?pZ`7S{78MKe)F6w zZdz+4d9puR>!_oCo&OrKrcE~A(m{#X*Ie!}j1yCni8X1cECx6AuvX$#`Q;ZXXgDvI zo9TXGX7Tp5)K|U5q_qp%i4s{C6g<)_H7PT0rCenION= zL)sWiZbiElT)6&@RZ=g4FiAAOGCG+uq_0x^WW}C<<5m@HG45~5@1~~xU5ob|~TG(N#R}Q4GWW>>$55XECi-A~2yR+MpB!+V?nI>e!-81fT?qK^80%1&$3VjoDKMyLS3q1l-XUx+G z&{2hYh}}I5`%F1tDGHu`zq8oZ2LK_ru%$mKF7vQeaY&)qP{_^sX#9nWB=`EKXP$Ws zPE2mL*+WBSYi83_C;iSK^_gSNgvAcY;K!4se64C#!y}LLj!PSJ-{DQZO%OQb9VrRz z_o{lyFBHc{^FmSH*X4_|GS^*6ACgBM2R4OPDY_=Zr)LdS(@9cp@v-2bGfz;&nN=pq zv-b4|lKKRvlkjp;I^vQpndLp|t?Xw@pU#kMX0(;oq<2}66atFfKQ<(o%l5CD3!g&J z4)RtyL&?S>T$QfZnO4Ppi%|tjmQFaiR4;qpf&KDPccV6@tF6uWGe(9j60eu^iJK>( zk9`>?w=~CpUU(Cjz1v&uO!VRcmmYWvfggsgw@I<|?krVV7ooW+356TyG$W(lJ}d4N z!+hPeiFYbtQPkzq=1<2;uMhfFwF!Jk-lO!;dt*T*CDuND_Tdz8&r}6M(Q19A!x(yB zrW&PQ$&GW?cdHAzhB069l^JQqizwuh3Z&=F>I$#$b#IlBLR*vryKvd5Ep92M?yt7w zdv<#iv`IRp1u!mxtlQGdn5KDY$;{aANkz__q1~kQk2E?njLSYr%Ou+N?IP3|qcx-X zm-h~=IiX-kAQ7;a01`7NSsf-spaiKQ&a~TapqgGHI3`dX^5_B7Ft(r|Y@ac($**A@ z(J^kPJBYL3dxX?V8Jxyl40K>Qd%>0mS(oIrLvM9F9z7M%hBbmNJEkP;K zGm!3Rz(pxc{EM;*HBY;N%}FmoANCY~=CV+yAR%;6g8tyind_!4#&M#3xM~)g(~3Y} z%`9wp>imVm`bZo0t;<>cq%Xl2j}OP!%r)WfuZ|B;Z;(MAQvx_jfn13r_~`R?CwKpY zUe?ddI{LpiXeOtK7L2sT*G~F*N@_O$UDFfSEVeoaE3Rqr)rc&kr)Cdbu9<4~!AN-} z$_^&VT`DSiuT5AQPgqhEIt`k4fXD7cJ zq`s&ady~s(E6wZLFHJEp@pz#uDeaoyehzCwYY>RN?9dr5SWos=2)7nLS+Vt)*^1 z$x`Ry?8dXLssfwBTiMxc*+Q#&#Pv2n=u#gNi&Zh z5{o@Fe$ienu*(KLdGM21ccI64PW3x`1hC*c7rgrtAb+n?^_s|8JlT@Ze4f@OTw(=KelC3H+roAnbm44=|XO855hI|Qg7t~5G#=AvIWOG2f&TGnz8Cs4% zUNv@;#G>ZR1C^O^DE6B=9K)C;!Oh*%nQdXM&zdcw@E*;`6%I)E1>n|BAWn1SNg&iB z6!^$wYZ)Ga6nQEOIIIyr9!dQ!j~XQC!R#%NEgdby6z!o$sMRQxH@8YhAc@3;~giE7Gx6TBOsuDgM#JEHWr^0WoEM$bb;egSYD zMkWjRg8v<4T7O1LD9QROX03;dGA3`*m9Cwa0Iu^KzX6y(H%-)k&VaAZfB^@ z*`@%l9;M0_)=dCw?Mn#Bws%@mvTt{@n~$i&O#G#q`pQUG-(b7j)A9Lxe(F5xntt~u z0>lcgXHA-~WOx(3*(^Hwrk&|LYJJX5zgiKa&v`CCs@lbTxvpl( zNhoq%v}iw4sid?AJ4RvMCF2Sq z{;84`isJ>(!h@m)<*%F1?S5E+2om(R<%mh23A-lg&4+m^bw_L?(weR3?~yZ8eoSeB zoX(pIUg~N55x1n#o{1xoj^I(*!Qop*3LQav_ZKY%RqO2{r%c3ss2gXutUIE5@Eb$l zphpn_(+uRsmJmvGhzS zph{Bn7ZO@RuOSE#0?|K{Bm!*iuopJZYfC!bZ1_4?R4PJU+es>FpJh%lHlJkC!I)W3 z$AQWfu?K{i7dF5&OzG{hIBkH>az$VdjMLBsFcv_FkTBG5ohcGjRQL-{&mS@^uQG@8 zC8x-7pTy-P^vinPgoh5xp1z+~nGMRV{Et7g`D#d9$rgO}R0A%X!&&7V`I z0}8B7E$3FqN?xPaY0s_6w=G0kwWdiNC^T;S{4H^lZe3E$;od%e7d{yi+%Htka+j;U zkeyeriMsd5`!#P#^K-c-!#Od>x(}}jR{HPw*&rv>&Dy`F2TrBO+ixIt1CSWt0Rmb> zM=Ox7w|}}58utXBMV;~5nw=8gi#bhg(+!?-1oIxXewrOuw_y>;)%xv`=x`fgbRZKHvG-kYYUoyy1uI|s3CX+xPBuP6oAdEfN_!zmMuV$gk>MNzk}HIG=YX4 z@)&##D(-)bl3h*Yab9t%Mu^C;4^kQSUaNA4We&is5UtAZVFJen@~g2QmJL3Nf$Kw< z@|%$X0i0YsA-*mHrtwc;{f;mA08JSc4uf0Gq(hu<_6;2<5B$7|o0YiNPq=V?oy~d5 z-#N&=PBCHBxf}$378)4($Ad{&nx1qKUccbaPNFE^7w^{Mrk$8J)85)xzn%FsVv+D{ z56^WQ<7d7XW>epHhYj12%ZkhY0z$hr@-{Xgtz*?zq?unc^&y6TJJDN;Za9@Y1Y>td)Ly>gVE;vMj&Xo<$oR#92Lb9YL?ZF7&(8 zby>hqYjj*92ia61C;;>op`i%I%O7LBSjDP2T=E>3G`iN9 z;H_CwDfDjjNl9sYv^8wr1J}5g6QyOv_M6A_iQV)8!`PC+KK71p)@jp{&i8j?p5(3a zq&Jsts70=#Jq~_1dxr&LJhDi-So@p||JRvUFKBOGm(P@}x;~tBvGd+_a*Q8ly@I)yobQmKSjt z5j{u1LJ+w{k+L2Bfwmi%0|by2LGgqtx|PWcPZKX8>vVv7{zrIqmYU}WG$L}v39`sO zG^RBfH2G)FkvNYKARDQu9!I4U6mO}qLrp&llO&4LQjF}Fso@2ieaM!-TdhCY>rapc zdme_KBY6H7Dx5QD%CW|6Xa!xXc~=;7;YHCMuwDHm)!lSMvZAY>@Yksrzj#_(mr|DTg{!>myS1g=wQsEXN2NR*&UI(YrN^})l;e9WwX8+r6U$gB7qE9x=i2Fpg+4U{nWiJo%CtfyO%`Y?0a$ku3fxyLZ zwvaUThZWe^Q=UCI)$OuBW3FPpCil=qS4xk9f#QYi+oH$%pBu|^S9;oI>Gk1T@T^lW zCCRZm_HVoQ0D1((=nFDgZV6)W`1qHPI%aUp^8?lsW+1JwZ3yC>%D@X z5p3LKx}_93=*t%Fgcoun5h5p7NIeBQnBJAjq~y@;-`Ma>{!s&+tZZ z`E!dCxLS9N=!^IJ8+9({))?lR5+d{RegFi|{G~{dVDPe;GQjt|X}U=EdhwF4%efF4 z_MNNrQ@4NP(qP2R7|5h?_0@B~v0DK7yRmkjF(VqJ1cIS`z3mAif99I4?ra`H;Fbp8iGPV^y0^j@6wyu0uvCiq<;CO-_Xc3JcTXMP+tvVi=}hin`H zb%3OJ6oy6wDFC-t(7D07F@|~vEUq}#5JpBM2`RIfB4iNC7VveP)+M>7nfJ`OR`uYJ zJj`}9t~IlR)%axxHwTo&m(X-&)-z+^qyT7jbh~JDO_;!QF_&Up`!Q6qaO0@sPBPvjx6<9{014w-;GV) z3OXgF$L#W5_3WgQpu5j!3wG_j#C{>YMT!05M&jEg#&x}Fr#i9cZD#w~pE=%c>KpXD z8Mbrw^^71`-F=eVyTol2sD6A$a_)L;^i`A6llAg37N!xC z!(`drEo~P)Ez*1wNo2O~YYQI&txs4pW;t&qc6eE-O+kXg7{V>mXaU!|sWXvJrvO+* zZs{rAeO03Dme;#}P|B`Jc9T{rlQvJ=2)}ioTq_aZm@d$F2|bqFy-$UjN4IE?6qFr) z)?CtrGJ6%PTIqCuRkGqFY=k^Sg+sU{kDQI}o0}?NyFbiLuWLP{xc_vF=#^5qw>06q zC|U*KZ6db7aP<TKKt60 z4hG$&CG=>DK!!c*cYR`&Be!O*SD)L!pk?d+u-sgMZQY{zVd3U`Sb zl>J3^*=w4LoHZcwpEC`F`8x0+{s8Sw0nPQ|%lM|EkmxS8Xd? z`ki8eeKXT3y~ruFUc7?ezzI*N8ORh~c>{I#-$cYyobSJ)R=`&+dQG7%zu%!t$BX-I z3r^(FTXLSS{-Harn1F0oHRHmzWp+PPFGXpYnCYE7Wmc(jpSL=uki1}ku|V;LNFz0X z5rc#cuwq>3_CeBtn`G4xtz@ji7O+6=a1Ie+YS~&$!xEAHmZblS)(4;{a3=MNL_pX? zN3uypqKpt&VJm79s8N%VAX|D#7UAV>;Sw6UTH8wDI~_;R_pPg*kjlDMKjD9E)wbs( zt%bJmGDY;`PU$b8y)JF)PCGGW6eD`{<7Tb%<$K${c^h5gPTuyH7X9RlYg}LO>8m{2 zGeT>vq)*IWqiZ|)pHKBSa|xSh{XISwbM!bW>w^{dix986-e-=R<3gM9H4^o$8P7k~ zttr~+7YE>%67p9*YrM^L$|+w-^TeKUFP6vTt+Z8gdk6MLOzonm46WE!|5O-!w3aNT z@o+pjV#4phjHI%ZhB*<&B$Y zBi4oC{{ATRGT>e8`Mxd!Hu|EuhwfyYPOJ#TjehZlEHdqBnA@1D3$4fhgC=NAADQ{t0maCkq)T7@6?YKZpCn>WCN1&jcso#jTC855`E%-)C+ zLic=;XRc3F!gfz_ZRBn25xyh3Jz74XNP?wCq78JP4Esnv9D&K3U2FLTtLO*v6Yr(7 z{O}_p($ZEs+_lY*CReaaZ7_gak+-|-uijCGz zHd3o*1)J3xs8m0O$(0tPg}dIZy(-^(&$XJTGHHR}cte1`k-`T048lPGRzBMpe@PK* zt}i(3ekFd$FEv)N`9|V$a&>NvLBx9#Y{9o&%lUEZ!8vkWyo=?S?*p_W^M$wYM7J(_ z1R?AyN?0g`C!DS~lMgqCa}69m=7)_+${9X0a@5kxsOiw_PXz{t>4%>^*!jXOuKL>O z$I*RDyQ8e9ZHIUAJh+R9+%mN|0jo?$ZUHPg7ea>^A1oj~>vX>z>S-~EQ1ZUtOa63K zEbu)EY;ZYb&OwCp`V!eCBXs-P+bbmsBnDSXTzET;4uUIXAx_fi>Dw|ALQCy4=96sm z4lrdkaT~r46ttkU1_MI`?tFtYNrZ1jO*Q{JUXIhcy(tTF=@$J44!^j$(i5|W&XaG> z%_%JQc%8%BJRv`Pl%jC3&L^StsB5n`h=08(BH-)o)md?{x3#=F`6$h`6+&ujB4ydPB|HZp34Gfc$rdb3DM8;Eap}X9<^S7zb4GzAbSh$ z-7Xb+4pBDc9H4~6wbT6G-{sI$L%vDns)A1ex8-+r$=%Mzc{s;D%;9yQ>Tyq18d6gF zaLy&gha#R1uRW2?-56@?D-kPV6+rD6K>LB%l|Y)C2QeJ{n`TUj@y0Kd)Ra}iCU3Qk zM4H)>jDam3k42f^r;Xm_w<w z7?RJN|4jJxJ)kcmGdz$!_rQ~)SvV{kyeo)Qb2irG>*?nKVoe$zQ@E(A682-M9 zs7F*e7Kq|P8gP=}UGH-%3RwAj5b6Si@$cG_1&iL$j0E-+8qgK-8ou@v#IiH&Ft(4$ z|BU#|Kvkw{3Lq>VQFBcWL=ObxKYNoyj}*eo6<)lS4eB{#hwMj+Zhgdk!E07)yMNMj zx=5p-%J$})C6=Z-_p@!e@!oh1R<|KOAJ9#lT}!&{g$EWO3JhepLmt%U%p)HO~8lB`tqTqq@ivj zZQ5{;NBt|K@=cZk-6l1&xjtNx&g<0+hl*(VZWUUAuPcN-()1p8ZwI!QCyMv4^G8jW z^|Y-<3x<5hhv*XWU06g22MGpj#7uC?^V?rg=p=)GdSJhU^_+J%qeYriqM5h4uj0ma zi3#fB?G|EJNre)feSGUa$=6Mrn{oJ_UH)>+d?@DR#Olq#n&R@Co*hyFF4$g831j!@ zErvak*&sUNvaL8fz2XG0<>^@9c9px(s?wS% z=-66s>RiV}@0{V~v0hp21An~0E~E3LLU#x8rF?g@sd@R=)HQ*ecbjr*L#fY2&zg48 zo>;|^0sJI7piKN}9%o!ngIIl!%Euv-&6Zdtl45U&MKm+~2lCV=CT2I>oL12u2_oEHz(H89ImmMABA3QNQm$R6x9X2jP>M-?#{!74+ZK!+~+lICkQZacyE#nU~vC zxBh{F6cf!5r*0)Ixe)1OnQ06XV!zu8_$GOFw|{$JwiBNFwqOO#zY?4GhY$75iI=)! zN=H3J1#cMQcX6$ zU_U{*s-if*wh*tCnn3R=^0f9wkz%Iev`FCuy3ls49d?ot+{XI>K}QKYd%8`L|DxC) z|8h*#S6G+*S&*O5m(dp66TN!TL`BajxODSh=KOG`)qZV?rA7JMi}rzSgl66f$pZY7 zMXl#$IMf{{0o3kK0w_i~XZ)Raj%F8A#GkJ%OuYT7q*yO(YA1^J0Qw_rs~$i`AYanl zdaDS}60UzG0CZvs#36(wggEh1V*>6G1JyG^8jZ~$aomA=vYQO)0)EHu4gx-e?{sl! z-D_;C0_lPhZn26aicpw|5x%yNhBhRNf4>&~^goe=2)Xtep33iv9xgC2TXuOdQRdsX zjQ=)A=?7T%?`{G9PmAmEvu`PEJEe^-F_KXCiRyyVNDh+$rWwF*nn}MJiR%N$(vf*-tOOXgK)Nq z8LgV9Mg__N1>Zv5c42M(53b(%I5s%Z_28_~lu;ihjt#Yd*@aCONN>$tC>xmn^8SWn zGrx*i-MtE7O_Pb)Udo4%+6{MJCymTU8tvvrk9I=CMfWDSq6zy^6X9%nlW(47LT65RDlppoXS7p%p+_J0 zNCAqG?Ic_$9pc@-o#n5RJl=g#_BUFt-rVr}xoi;D!k$;c0baR?K@bi&il~UZ*U`V< z3-!GspalbUzXT~k9eM^v@Yh0`85%PEE$BB8oE7Q@9d4-&!BqaO9je=zX= zkqi{n)|ss|8x-aLFg{^4HyMU?_-vXCQOCkY)9bTsw5hftB5hi57%xBZhV#OFSgm!6 z_d1DZySE5J)84;?+f#gK@mljz4tw;;p))+_htFNqdW-m0p005+n~TPdn)3Yphg0nd zS0q3~kr2$S$|Za;i0&$FXxWG>h4f&~%aAspcQ^K_eUD0tTC>6#_a-Tae3Q}_Eel~< zX)1{Z%D6epB@50cA6!6xjPz1FD-8GV)=G+dJ@^*$?Bl!lW2A^$odI5f`%y`v7#aST zCVNxHXpr24Q0vsngp~H(q#I;M+J*+9WtIF*zfpxunM-zS1RBd%-_whmmIn5K~ZD%}6GI(qMXums%QRvx=LQ znGtEw7R~nG9I#cA;Lo6ftS-wJ+a{}8VZT#;(ZSv%?xEZ@(`mUhWec@ptGw<}vti#d zKTl7)H7DVuD0uOC+;?2lMFb8XAho}jaMr1|PKfXM#-mibrtxCfZH>6tBPwQbVWh== zYW9h}|LA?FLM8B^x66j4Y%;kmr}DwA3~Kf{XNzZQBuMClyLr@YSU1eE@r2VZ--&PcAH)V~0cZ(N3^|KibBE#kyVHCd zU6fBd==nWP)NWWNb2h7_yQIf9&l+wYH)BoEYcI3!QTy1!ei3c8_T!?pR+@JLT1_UO z`B_c-qei$ZljY4VDXCDNZ;8|7Okro7m2{)^UPV=IZtZam-w((4ZV}&*)T1gSNQ?xp zu?k^cqj=Vp;^{((F%g*r>2whlfs(p`XOFrc=X87JvX# zh1SfyMohYqzJ*#4xKxh|OVMakF$*%oOJwFej?A10AF$CFf#ngB`#+~23ANwl;0=s! z3d~oSP z3>qW4fvcrw)LK>22S_YjIos3|@&t{;!*Y(TjK#*wz1JWx)(scRb|_Yh<*&pZ0t4^h zHJsSYZiib?Aa!|FQVy=);8)C!Pfa`Ya%FB~VC^P`pl=;9T()-fL-mrd;4ld0Pd`=@ z*6_*y(>-dzMlVH7@cDhKPp?)RI)_!0d&<{|?*qB-COPPAd#7|Y>G;UWN3m{7HJYc~ zZ(YE5aDRw-cLm2gj_=ASp7m{Uk&py81F*p5|BY|GMDVTu`RV|ffF1!cN&w0pLUBia zeoy5iz%2N0jX-*r*ng@-FXF%yj)CS8CQjLm;8nd0atg4h;0R@bzJdgQ#P3T&{*xux zkZ+w(uNHgLyU$3*{auA-QtH6p)=Cq}YE}=Y&0jk#_)^kT*qhHc*k2Srh1D|=8#1Pm zHsQYINptz?PW#hO;5uB_u0fqg(?tff2FZD{N2clKqV3E(w!!}msOV(J4{36!Rzfiv4pQ+Eermr+Led1fL7&U0^M87LaS&Aq5x zrDqE05Sq%BbA_22dz!m4hlbFS5FQqd7kFf_KklK%pj6i;tKLVy=(QW&-#%KTl6B^*cn5UeF(qaErfi;MR}X%%!QN?rjPK+MH(xoYX{J zjpI5lmKIkf=~%fuvIrQqIa1#BR8z_k=T!WuMqa9+$x*8bM^U^1ixv*BUI!ctzfB04 zBL3+JfE$j4NE5UP1f;X1+Tj8OO#Hw52qZ@S+;R^u`+vnqIv^4Mi4kO_4u9mI@AGe5 z+KWbsGWAXRJ$+>}X)Y*!f$;IwQQs{8&G;QX6GKr!VNP@R^;SlDCe2E`&S>h4_$Td2 zrn{7`>eX)c9#RoKMPx_vx<+k}%P{ygtvbggo|$SreKIcO`=pJd6E@(RxA*SMe{vRW zrprTquo8%SW#I9t@MgygtLD;Wv*cT&r*%Gw5)Au;UOVygWi5)Nd5@&qxv<4N!*P5H zsJ+2*vUTFP#>-Ec^5+SP;hgV0wctL8^o+h7)POS6pfdfcvJ$WdG2sTrK3vm9YwXu# zuFJ6v39w+l(6*9SS;TiDp?6p8QAp#vq5a z&Z9QqpwcG9i3twGtmggwj@KZb$?ddo2(Rkp+JFem;g{3plEV8xNEWegVnhyQMT)o? z)2fBe>y zgJ%BrDe}APpYM71uu7WpdtG4v?h_MpvbH04#pVrh$yY(q;=*XlXhCd)d6kd*?sKr( zL#)b>$M%p_v%tr1RKDqxMO9u8vlOKzX36XJlc>`80hhnFC`kCD=Nms(Z zwW19YZDE75v$mnl{THerXlYz6kXtE)PCOJ2=v$SLQ}!0IscM+l$7%QUzm z)fE~WWXw54h`la-8t-XPYrdLID7GB4AKfaOB^aFF)L`X79J*p;>f)L#eiBeZ{6@~sdfX^3tAQG`$7`L)|M1mmQc-@$Z)EW z#Ri!U#*B7QTq8tWWY*Zq5r0~Za4f);Lg$0Nvvqc5BSbYx3)6QnK@V+5omY};`Q;0IXVbLrghmOc-p9{&w>hXl= z;e82@AvNeZI1oJ+{g1gVI+gBXy2^dPXVB!eBtDG@s`pLu%{##_n)QAb6J_!adUm;M z9X|~Co3h|43ZfFZ;kCcc_v&eaUs}i%W=YTM>5_P+3=cmeDC|O zQaVLTIZW5PI$Iw4I#169ROhIB$)i_KmQtkm22P8itp}s9G0$H7PBQ zq#jsP)FcVznr`6UN+@7|Bi<=k{zliA2m$hQXyJINDFjG9i7P6db{bCF_6`%PT?I_d zZ}p0!g0Dee7V@*?h& zhphUFg?-Y5@1q~P;?F{S>Q-$9=wS%ZCQ_`CEThDR*|jUoIZctZ{sPzd2ZjZ#+NRNW zWi$c{u*DZLM&8foD;i7PlYUOR?)T(NB};bG{L4NbrW*vArNYkdcY7c2Q#f@58AzMJ zGlv=^&?-V>xV1iSqSh8T-0*M_5ePIJa8o?6Lfet%A$<#(*ji}(u0ae?HyEjV5Gtg- zjoOR~>B5Qtkz+vxgrv8HV#53hb?0|~LvP^7dcitNcU|A2JGYs>^@nOQb_tk!mK%wB zVL?4bA3b(IS+G(J`>{Rx-m7m9pARW>rpdunAAfcp>NJ)2#_k0KN z@p=?2mD>zv8@_8nQmpUCNhMS}<`y0)74C>r2O5)-lFwe08I|Oz(AgDnM$1DR$)9d!B zCig}V%7lj<)!Q!3a@A(E&JLXKH_OMm&O7&<2lu=ehlddMczx1XXB#HQW|qs58dP!3fNGot$R_ID)W?g z^y%KGEMG5h$tsAc4#gh;arF6Q#LeeB43Gk? zU?G};AO_?E7z`RYh-KOd0kd4`=7dN_#}+t+oQCZJPb+Ap11)xs44M$7Vcvq^UlFed zz(FEYuwxpR*f;U4OO5BQV3%Kcv@L;ga(~=J*R}ku0)v7`OhND`S=w*2_=WBAb?#kS zbqE`ZpIW7AsA5g;PnZ&z$n>iByS|nIYJ6OOP%ScLm%?S7J)y_p4f7HE`C?B$zn}3A zh-r9H^X;83m*7>3{VyKdmes0>X5Fe^*t@jJ8MqX{CK}^T>T-fLF{homo5ROi79UaG zz^STU@g_f*473yn;je+xF$yVz?z1rO3RtJP-3t3&MaduI+If_0J2OIAZJqkb_(6~_ zI;(RxPPnrAjN2HAUAWUv7`({#TFdkJMa$U$DaX|7cT%!>+A9(h7Me$iGxgNv2`yVg zhsw=cdpr;qlv?kfxH@hqI@vQ{aS6n+)i$U`3Jn!}FKh1nx;QdXrTfx%86acQT2{i3 znW;9Ap%xrZ+nM#o8ks2%-QntdyXa@HTT)uk-{Iq4E!6fLK3^neHdb-*qHp1q!s|pa zMZ2x1Q|^isE4+^z4jEZ>LGP6%SZ|O<_{3CTv4AMF;EuY(ASa+Fp>a+F<4AKfc#ysd z7KVY~h$AEuKvapAJ|f7M<32{9F#l3qApHfhYYIa z7laoNmp3+J6_2b7)eAJ@EILW#b;*jTGmpyNbx6ZaGj&MAhR^~jA;US?=9Fu8l=+q^ zREVK;3Pptwf*GAS8v)O_#M{r#S<7-@Ddf(Qf1Z1Jw<r1MC~s$5R%9rN^7ytyr@5jeN}Y!agJEI;l=Bs125)^#jI2S#mDl4Jl%(>Fb%CJ3>?A z9@14@+gF<}R91hKx-7^(c+S0$oJm5_3X$MH_mTE2I>Ay9o6ZQ^#QVG+YPIzu19=YqrsA|RF-?mcZGGfOUI?Ig>{0ylcglclAqQsWS zM}MSVi)$P#z6@7OwEUh`KhTBMXJHfZ-RxjZcSg^^_l5EYQ;SaR*txVRI@!Z;?}xH1 z?_4gp4QGD0BC~PStzb~7QYsH$vQKp)NisxZUbvN_{*(#F$itJVsZ)7A37Xk9Pd%EI zqJF|k1~sQvQ(Xdl5@)hJ{wTLd>Q8wv3#g45Xpz9w59EsoI2QwaU4oK^JoY`o;T`MB z@Nsiw`MY+7``(tp1|4(Z`Z*%uxR9ZE*89%=ve#c$S0FKS<628b;K*3b3$2v35l_x5TIG`q^f$J!hSxM)jkJtWPRl&?&o8dCNw%mD0n+C_4fe z8t|tE^ZTWdkXuJS7I5nTXUxC`+mTQ>d^r?3;4`3)YJttS4d&B8@UW(t96GMP31lwz zT{#j}hc7v3TzPnTf{FeM!Ykc&^58T!2P_BjID?+VSe|x|kOt6m$aj2r$2PCNqm^@_O@lR2s#xI+9>h%azfc?-Y#uYe%K^A&~uT^aHk8AH~Yxn z)%nI(H))moR z(5_$hj3}3Lz;^yN^RS$WEcrt2>;(qpJ2I0;@<)?rWQLYFRmeGG*oTJpj_UV=4Fic6 z8f8ctcj+PJT!fMooB@8}p&I#8z^2t2et*f$r7DZIigqKV*tA8rTKbN%eBM#j0ut@I;GBA-jbE9dL%=*ou&jL&58vEWt@Twik+vJQuU+L zqlzv!&@Q~O_e^M9{%|vYKw2n92n(2KS*&5uHVqMmy)ZNeMJ9!oo{&lm2_*pS2Bf%*>h`r5Ntd49nb8= z7l8fled4VYF1%IL`8~g^S(4mdLciok(G0K7y$%e1oS*iTX`vp4fqOr`ev7M_4Z&uTCBUqdAU1=RgV;>9K}q6t{u={DCz75Z zh*g?zL{o7?NXjD0Mwowi&rg*$VhYKid&;_B@jh=cEz?fEo%c>~s&nCOy^*s;_0F~~ znX!bbcLcu65Cg_9?A(i>LO*IkR0!Y@-_L3w`kO zyMaI(Iv?KPnw#?Ofzhf&GEG3wTx)U7W{vZYo`Mpc6COyfIt~)UaMq;wiuk5`B~QOd zd=gB^J7<|=NSYpA$kXn9j3kpe2uVO60*;8*Aj%D}%ESU6B?vox$19&-aKh-GK%{^} z{3Hf=nDbGU$jmmvQ0zlu16u;Qht{lKiFYVdv!))J-O~+PRONSa$dnryx;Q6WRW~;a%ef- zoMH)yK?38shy_NnzGpF;J3eN{+r&2!ofrDHqUnp8`s8HaK=cfQ>>?tE<{5Z?deyGc zmnH32-$3{QqM6LlBIPb6gE;iP=Si>QKs+;dxwr&(tz?3zVL7W1HH}O+Bg&gAH-K#r z*nMXw->sMULb7S_LS54Dx0*66+v(f8R)`DIg?pOwys0B2hYUCD$` z_>a?c3OEH`&bV3*@rwKyT3aC+Z+2x_p*OZ$7Mh(OWhLj1F!+P5^`2VI*QxTw=<}n- zXrEc%`yWfr&nl4Wq!EZ{1p=47G7t@?VDgzb$DE*t_r zfR*<&r1c(Q(2g8q9H3WqmF8j#TPxvhF20R=m-7N;|&H;s(u0 zgi3b;g}UXFp_HuB&$IjNTRbv<2(^cQ-f;frJ{ezgeLkVIKaGC_KWRz*!#?XhKHe1} zc`4CHuNrJX3^sk0Bqg?){FE#6cP?*!@%b_ICPTzRKC^uiT!dZm+GrY&N2J7jOh#fM zK6Pyjk12|c{R|Dg-g_6#n(=D|kHo9Sbcc=Yu8v*E_-gb0dgyHTd!Re17HZ(c!tJ|$ zI1jj$D_=XKpAz#t??;G-ZURDo^Rr6PdvBl^3;(u8KUT;AzQB=d8nCNC3P=%hr3Q}G zz;BoXXhu54*3*%vZyW{`02W0(4On{MP-mdJLT}zBiTPYWpkT#-&Jzw&i`tA9x zPh`CNW$wmpbv?7a9^nRsXU>>Ikpqv663{%U%Cg&YHEgWEc3$tUx9#E(o7RqvtMAj% ztTx*U?vLD%>NFFQ3#@r)=@raFg(bmmYI)a5{ zdR;X;AD>29TAgE~Ou1PR8SPK|wp)8}wa`UmWbPifa%E}Uhp=bssyV4kI{bC$$F?He zb&Yoy2Y}NyWrfo7%oLqms-?$>sj@Jntd)Cb!g;?Q%r8{Ucon~R)s+}& z9JBmn#<|bjw8D*EAs>n<0ItRKZmzt+hLX86`zF6nIsN-u)gbvxuYKjwuiy5{rS%P$ zbnKN4!p{s@(?^LZ?d;_x!H4sxvF&m%&bSPX&xb-n%OdrSm^qMHrR>nPo8^G@(1%?G zwCP{taX2{th^r9URxrHaG6;iupA_VEN9aTc^ibLhz$~x8p0`|D8;lD{cL^&--U?hn z4Tu%&bVIZ^iy_!wF4t(VKkP9q|JlZ6SentQ(W3X^)l}~WIL5e3R%Zw{|$_^gGa3i^pFr)888qOWcU2 z$0+}Qq6>oqY{Mpv9fQfbfU4_;D6#yEPttZt4I5tb6A$~UaAuP@3@OCjdAPVbsg~lZ zKuBW4C+FVo>)TeQaQ0;=3^Sz+dwA0>DL0c`?(gqbHe4}2d!7rmFs zi|0{US~kSK;#*NGt#<097HwNU_no$m3ZgNfSp9_gezY*tKb;SBb?)0}HBEF$|Mt~J z7liY;yHsSEi~VGNIO9qZXXS1WZWt{BIIZN#5wmKH;6)OD=HK2G`}L6 zpljWQMY~I%;*sX-ZbPEu)Nb_p8wi#rWr?Mji95%%(I0z2(TG)ioiQT2cvoCES|)6- zR<*B3GOSR)I!Q@UDLDOY|E1e)JKu$I>fCkg0)=NY&z&?HiP6otBgwtCt<2Fsn@Yt8 zPMd+n9!wE4wE;LFOhHNqrlT;bPY!UgfObHkec&Tm1z^F=fmPxCN%Fz7KY+A~2)ynT zat4-L{RX^qB;>*70((Jp`mq2`U@qI?hQOc|AL#x=OCU)UW z4Z9nwvy#2aHzhPPhb3uu-K*>3l@8d8yB$|1gO%G&t&ME64W7QnwCH%raoAcMy^_am z4dIQob5|28(ih^ni!GymOcYC3PBYYhJ-E0(UlEfZ*P_VNvXi4^FCy78PIM)Ox6a)4 zQOEH4$t}tmP2nbi_(Gaqzl(rcG3`549Uk)5tK~c|`SShp)aPsvl29r-uBFJ}&T4aI zOe@Vu2HUwTjzWZa&nE&hDf6B|0-ad9NxRN>T^j7|zAfgHC6GLB-_$7)y6>>Z8FjYSGZWCOLhqq9u$c z{a`(yt&Y#NQ1Q}Eo7>VoCkfVM|Bgm*TjRK)j)%Cr1@8(c@uv9Ir9H$+-I9l@A7j-X ze>jW!0M2AQWd%{(KqxC&T3R3f9WL5Ng3(~zocp^&ewE*iB(|d))4+uc15;(wA`_%i zmeWjU87B+c=o^KwP}B=q@gc0YwnJ|&f3l~v_FZ(Z?~S$Ih>ip+K*%TO=;a7wM+i8C z8l^07Uw}5(K=i;PP3sMaGi3r?wLaENgq(rLVld_$91*BB0-+6H44nF~gcY;_Hi8B- z80a_}5NeNt2LXIxly~qEk+R(%#3Bo{sZUy03qAFl?N!~CD;{e$WY-QUm$DUy6mpey zCvnp@&zrMBg9u?hy;QhAo6`NHOPfE7H66=p+}vEL!G*fgk~pyopI5zi=k#`xTqHtp zph*HCbv$D*atq!AqCe)A2&K;rF?1zm8CLC4zBY6TFTCpc{N|nw`P0k%&GfljGXl;f zQ^uzX6A|WPN+1O31K!T{@p?k^*Mt_G$nOp5a%qPG{cxU~;Qf-db>Upq@_uAxPJg+u zG)geK!S+Vi=H1aUhrRM>e$HkZQv>2}ESdT8$_lLD4IdIw=~`-^E>=BQ5t3fkht+=j_Ide^R$dUXs6@ z5`UxkI>Q8+|97qypVR=gOJ@x@-?Utep-@x|1{VV2yV|y`6Fhn`YJdpS5NkZOA7fWE z&)K&#vgrT4y~11hJx1Sxe8G;00^+PfD%TaJx$X>OI%D>L!uD^A3-#+oh&(2)F+r1lJwi+ zAXLNUgNVxVptYT+Zo01H7eVP$FD!0&LXx{%CBeeUm!*Ka+QZQ23L!xs;TKkto|5Xr(~c> z$l-q}Q3ZT0Dr;v7)g%}+`Uc;56>c^P{3z_7cixMahWGvWvEOCUYw=~Gak-tm!q=UJ z%8tqBOs69MO&!t-Pfh*1dnI0}aopTHPDqR7C;6{d4E7XDRy0Q31cWce62)24lszln zy{IeXk-h*zn1wA;UA>oYq%f8}sw9rhUvahVg>N}-P~%{F@Hrv8+i{is3ZX6y=Nuja z{c5#lv4wkMhKU1QtRoI26?C`&Bgg+d&)WPz&J@KY zx2+_2lb@c03E}UTP_;m_A)%ooUQx_CWde>oKvzRx^}?@8-^n<6)3h@B_RY^SVGGZE zfg8rdp~xDs;vS@Nle7aPxIM}2(?wA;ai|*qB%)wh0zHz1E%W?q``WEq-}2nKz|efU z5W!lr7mFpv#Po2C;YI5Q9y+E6MQsw4%HJf1stl7?K-5vt3?S?dU($oci%I-i3Yk3z zAByB_zNLK=^sKH=Krilj!C((Ljg6SShwM5j9{fk>egK2>r_a0e)s22zTz9ri&4ln) zI7_2d%_B@@zNLrAgysI&{c6!~azIYCSEyBWVbT0cK%UIvr<+V+D=so$%c2g%H>F#b zWmeZWe!@uhccqi-Qb%=LzsW?MTPFgSbXh1ZRCS_qZ}-l3-5^zs*+91Jb1WBsE3P$U zB1U|kHNOH~PLD0@YP`{U!!s({hwFevg6XTlDtpZq-)B1&Q$Fc(IJZK7!fhSf9xQEz zyEUELx3{@IzG31@nRjt83R=D63c3*04c2u34KlG;W0tES~=Le@VN7XbTDcZzl&uxV^d(z61%CN zx9kPh1m!vKxheE;y2VlApl9ZX?`$zypq$Yru4pqSGb;-#R}))J2RCOFTFc83?a6NG z>gp)Y%Zo|o;B3Krl*9#-#1$mrMcX;LdVvyFj;gBkud8a}VZr0-Y+_|^Wp9D7!@T^e zZ_4RVB2UGzCZ=S9z=*&oH25Opu)b(}S7$4xeQu5RMA^EzKtmby4DI4- z;_QlLZi}|JaJ8h_5;wCqu|wNK1)4M4nb=#IgA^zeTMKg+OA~$}VKb;8J?5Q+AD)df zIg;@cmT8{1Pv$Cwyrg^g1K*)WRlfehDCs$rqluXcRF$J2teT@Huw$CQkFxz8Uf74& zur;x=I|LWjJ*cKx)>ihQdZ1TT6g;^-?HqZmtjxqk`2^5tL4JOOn23NdLJ(z!LWr57 z!8^2o5ZX)>Ey#y5bwxpW9gm=cvoRPShYU>9Y@o6bC}vmCE(>?GGt>_#BoDs_z#I?C z!QK@B!Nkqgk_Sp>?CfHWiZaVWVs z8Yw6&Bp@V$K#GWg8VQ*q5n^Z*8euLXBxcUXFCro;#(#+LU)ebyO$lQY7Z5Vd*mjpWU>z#l#~ zv57UxV-NP(xFRyzt~@%-obx|r{-k~h=K&top?`<#ElZ)k_X zkdQotY|v+fM2zzM>T=9l0NTtd0LjjFXfrDyZ<#e599)^f z!!*b5woWvFIc$@nbiGb}U2WY|N*D`^S&$T&_ZERmK>j(`LSgo0^mZb9PAgdo z3oD{+qMRF6rjKP0kZ28lNsrLz=lF>}pq92S|l|z zLWD%8{v6%^0)J$f{sZ_sag_Mq;ZEci?*8wZCjTCTUg&eT>uls$p9{nE*E&cuE&SC? z^G=;7z={-O4F6W{aMvU>>WU}Ys5y2A{FPBLMR@bc+~% z0xK=}%nk679u^#%j}%FaM{q0j5*&?gNAe3JMfgRK0!R@)0Rt=oSi}h`n~c5pr_zEc#F4>x3&>!c{=@l0 zMi{t6eK~3cH@N4mdv=_wB~*o@dcwhS8fo>{>2n52iJ2V~Bnm(UhNK-g5Y;FiJ~^Ze z^aVDB=>Qaj&@PS+ z_GW13!)ovW$-?q`7l5I|2EqmgJ}1Nq#)8ATl?o8#?^3#Fi*D(Zap~4NT>lyBNC^MZ zCelH35sBi@N%(Slz-jN~tGS-$D`y;Sec_j;BeK?}E#6(--Ia8`+L*cbp=ATLB63!Z zHE@uTj5AJtVYt(r@r9w8cMMm(LQ=q2{983#+}Yka35y-Yl+J$G^)EWS&2TeL3zKw+ zzPvP}cHQc73WFe_zHgRzpCg+Gmy=+ZlvG@w%z>jm`V`kV)4OwND-LLmwlddy5?aL9 zdu|S9JARAAcFZ}k9jihS%iP_&)y7&H@rWnBTv32obTH*Ni<8uq)| z2{*=D0worchhA0At#wQF?hMchb9SYv3 zp7~?xMJ$H(y78##?NNEp>XemP5mK^Fr>ORh#SNSiY<+mfXNCnEx4b8Ptw7}L+0LYk zv{v2s2o)JW*DSMUy}T0cNFcBMCebl9aBF|hD;om`e_ts^2H@e7)PoALwlI_NmObU;C>_JQ4VBm>M4$ z6n9M9a5zp-7&0gX$$I<=5*|u@v=ntfxj6Db%TN@UreJMghrIbK6;|l=;{~e;^tH=h z67n8ToTDkMEcp8bKAJ^`a|)WhVDj>yoL!N|Q2Uv1^pHA8tu&1^_0Vg_WjNak{GS(K zi)4lhV8#JzAQB%B&mxEj4m6sRzl+enN-r>V;V?93;R-!FPEFA*x%nP^g%p&m^V#i* zO%}Cbp@`>%6%HY%Xnm=0duT{M!}C9NT7uh0($B7Ko>vfAQF~GT=(QGAhRN>m*`NlJ znd)=5-@Nozuigy_&U2GNHliuFv(|n(pEuX=G4X|y_PM5CtCarCCzdCOt^rHt%#G_ZY@}~t)J$mS0nIDpSH@z#aFF4+oW@P_vK#8M zHHuV>5FBIVu$5$C$~Hfu#4CS06jtu{ zMpEnDLOR)bt9&*gkBfB1&-2!{DQmlDBFS;RXsqGwceJJGIo}<0JW?qA3ZGy6={(mf zm(MQHP33rpNk?q0XrF~3Rg6sSq=srt=$$H5G6^HzlLeW{*JH6*l?OPJvJZ)K#CO^D z`ER*>^q6#A@l#RXd;Lf77q-EOy`s=;$A`F1wdZg<(2B1^yGzezrxzQyx(X%-)`7chWu+klfEEf6cNvva*vhj*8DGp>6x5KT)(dJ%KJg){d&~ z=eH^CHYqGin)KRcYI9iwduLAx$F~wn2H&#F*r~F57rk+khexVe1ddjtt(>0NmdE|k zTolIBC2F=el@&3&b@8Q_ZRqDwA(!B@m*%ajIxPU@?idPI1{Ed{!`KhGxc$jY-2 ziK~SEF6|-0GyN;ePy*E)QU@uBj^_l#cfVA83NjB5kH0{h?<{7b116;Y^~5m~VpKzA z!6T*rp7xQ-LUWmJVO+UzeX~aV-c`oPk7xE33xs%V5;)k*q*n$m+ zhK06c_ADkCEWz{{!g0 zcD2lz_Sw!|7fFHAX`Zxv2~)MPkj9^eOf?VM!uaU=a3sCEbc^?DZ3U-qv9__in(d=A zzo~kMPSd*M;lpwHtanNm25s+?@GQw8gUtIC**5gYq(1~%W#2K_ZdDa9A4-!h>Cy63 z63o@>;+QPDy;5tO6c}-#W1gVmO>zI1r1rbw zKL6=k@JFYcW>>!OSjbG*J}IInRr@RJfrS7x-x%2bvN**@dK@zsU_2Y7)qlx%a>q|0 zu|kE8x#+*(J7}IN3t~7;{*cook>W_vG~qPCQ2yh5{u8JD%H;niZ=LzDM-@naa6;;o zyA!g$;pF=Y!K{GJ?z_!lw8#LprlcEqF3U5EAy-gV={MuP5q(s*dB5H*V10*mt7=Y? z4&2LrxpT z0Yf{_{#T4ZV>o?1YIv^M<`o=31 zDx9Ia&F88@)S{`X8F5$cO{xVMFAi27pJ86bV!gmeZ|wUY8gLAxyDHl*(bL=%yn1hw zr+%S*DD0kacA}&OMdjQWqdUW2 z-k^D&v28QlW{wMqS=W>L4oUVwlGFGy(nPwX5^E(&AURiMSo# z`LFJ$9*{hG9Q^QfiP<-g0xRV_TDhN1Y}F!V&w{y^*({1;I>Mx0@J5|aN&7pC49VR)1MX+~rD_ z{Swb0>wVZ{aB_oAKKa%@8R^TAHVuJ~E$40Xo73$wgeyA+9&D=BRDq==ZWQ1xwG;+l5=qZ7GpDJ6@_CH+>uoS zu+^W`#mC2o6g#G_{|Wm1Pn^{_^}xk)tZw3_sw9#HX(cfKCYz0?^{mwDz0dk@zFx?d z(#v;G>@4!3yF>gI$+Sk7DM~e`^X{=7Lw>2(YTK!g6UGC$k{YBMOz%=CpZhnY=IT=E zYdaTPK5~3hTI-fz?ZO}1L#9B+^Cfug#GNTu2|K581QFdLbAKx{1L^|e!@SY8_m8&E znj{I%;l4APH>7i*d}?4wmEp zG>qfIX&(dkJ$t3^Wf2{=+f7gNL2*8XL;=}G{7(idnQx|Y(=0|a*$O#w`xAF5{hJrv?}k6N^1ihE$1`#|^F-ISvCE9pB&edPzNLo`#Z#n4U=xaL z;gyLBG+h3#V#`08*v$zHHh;N{1MBdkk86tFI$K(Ls;VwvwLj94Tkcj~35r@Fj@I4O ze>3pK-i#U82@OB-wZ3XfK9jmS%LD$EG?wTrL#fsUws6}?5{>K1t_|l4D&^e9ybFw@ zWLjVL%AF!NoFr49<7;knreY!Z;(NtS1~q@y_$~8w8;6qo&}95+P~zZ-w8``?pg8r!}ef4#Px{m z?6b*hcJE35iLktmSq5;E9n$8%4qqlyAVEb?*~c2YcKCut<$ zr!>G%p@PRb{abeW=WJ||r=V<@aR`xs)$wq^Ti8EH7wlj-9OjtTD1SqHTGTi#!<9~| zlIqh|qwb0N#Des@-18wuxwLgG+jnWLv{)80!#wQjX-}_HsCx4vszjI8e+JfUr*Ew~ zkFmbgzg(!}S4fgSI~VVqeyKd6Jy|Uq51Yb+U7>F} zU`9V@xsmr|*7sFG$@wkpmb*D0ugKB}DOp=-y{Jytxj&!TFEvv#@`L{Kx`)9Htw@KZ zbaknHcLK{hsSa(!%uzzO=&`WdnO_v>rIE;@nxC+|F4f=Aw&`New{`#Ea1OEV?__<> zhUF)DwHAWi|Fihua^>ClABH_Q3aFc|rn*$Yb5nKmj5x+?V)=rxeUZV~p1^8{^!pz) zjA8vtBi(Pt#k8OvB<(M=9RW5U@n39>Ncum&!{s9d+abT32a#OACB`D+qelV@I1*U> zM@^9hp@aye&5&q`rI!Zs#Gaf#lK0Q7aQIkon17%@nZzfNsri58u-#zlZP1qAX-Ik7 z;c+hO%#f<8#2QlM_uP5;IFRR&fM{@-RnugiaeumTr}@UC=-~SnHcyM%%4ELTolndV zTv0kjDDXP~fe{WT7z>6y@>S)ky!+3#;y27eKKG`vFVEv!=HL$$n)G0qAgE2e1wUMr zd?lD@liE=Ky!O%#NB%+nmi)`awUcjWnsXa3zO2Sqm8~*m2vb+(W60R_-(42zUvcah z&KN!UO3!YYBmygS&#x<=dqSGFtlgMt^>PczJcu=&@KOhlykfNC#0NYai%P?hY`tCU z(T#Fiil)F#R-8WS7Zzh z)xTrcI_Bm}hT}g>`NvCE!&zsnvG;SWwS`;KK75;Y7gW`r)|>9?l#9^r-aK1IPV`b^ zBC+4j%BZP%-C@5aDqe1yqD8ZcYTHaj_qUs3prz~%BryMEV zM@~Q1d%Uc9m$JzE6$Qn6mnk%n(Y3js_@Z{1&sJrp4Mb(WvnKDqr(U#25i`vB@)xu` zh(LCJDf8#b=eS~U7pDpj>u1Z}#y-MgQeH^*3XagicRmeeKk5#C^TE3})_6N-#*6Bu zT8mChB_xqa>&|++e5|0OxqewNQ=9NkY#jNu3zU)r*ku>4;YnDn5k+OITXg!3vMGKi zeY}~YSKs&X*6OgdSA;QfxuVYN-lgbtqn^$n{A4Y)@#rUK()y@se>kPe(WNhB4lZ0H zU{u&EH6Lr;;E#zZD<`{}mkSQt9$D&iSr0m7lDeiSUp8o~97!no$ literal 0 HcmV?d00001 diff --git a/tests/build/legacy-ingredient-seed-label-persist/signed.jpg b/tests/build/legacy-ingredient-seed-label-persist/signed.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cbef45acbbe61275b854ec6238c4187c06e32893 GIT binary patch literal 125010 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

)N_6f8qAclo1JGNVA@Y6I7< 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 UBtsIMi9QI~e;`3(@Xy5m12o>eumAu6 literal 0 HcmV?d00001 From 3b54169a3afe83dc569250a512a972bcd708c304 Mon Sep 17 00:00:00 2001 From: tmathern <60901087+tmathern@users.noreply.github.com> Date: Sun, 26 Jul 2026 20:08:41 -0700 Subject: [PATCH 03/27] fix: Refactor --- .../out.jpg | 0 .../legacy-ingredient-label-persist/asset.jpg | Bin 125010 -> 0 bytes .../ingredient.json | 11 ----------- .../manifest_data.c2pa | Bin 63278 -> 0 bytes .../signed.jpg | Bin 125010 -> 0 bytes 5 files changed, 11 deletions(-) delete mode 100644 tests/build/legacy-ingredient-label-persist-out/out.jpg delete mode 100644 tests/build/legacy-ingredient-label-persist/asset.jpg delete mode 100644 tests/build/legacy-ingredient-label-persist/ingredient.json delete mode 100644 tests/build/legacy-ingredient-label-persist/manifest_data.c2pa delete mode 100644 tests/build/legacy-ingredient-seed-label-persist/signed.jpg diff --git a/tests/build/legacy-ingredient-label-persist-out/out.jpg b/tests/build/legacy-ingredient-label-persist-out/out.jpg deleted file mode 100644 index e69de29b..00000000 diff --git a/tests/build/legacy-ingredient-label-persist/asset.jpg b/tests/build/legacy-ingredient-label-persist/asset.jpg deleted file mode 100644 index cbef45acbbe61275b854ec6238c4187c06e32893..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 125010 zcmbUJc|4T;`v#0(W2Yop3R$w0rBPWUG1LGJ9y-bztq7sftgy)i@f?$SmY z%M964itMr_3D5f)-Jkn&f4|??@AZ40{-812HP`#Nj^j9w^L)?F`<>bK(}w1BoDc*d zAZT3{8|dQ<{x1Z6ySm8zaT(%-_D4ZbDResPDn0EF;885UAEm$hD4%~nD$wtWD*Q-Q zx04D=it>ue$dk${N=OAo=aWbkHy1agyRxE+`zbkP<XJWMp6f_lAS}AqGyy14mA2GI3d4W){85Ef<}b$0DXx{TGjA&o^;- zXTKO$Hr|7W`1mD`9+Q-kR!~#|Yp1HMqpPQHaL(|&m9>qnojuyc)y>@lh+tB-aZPo zf8hP#(5LawUnVBMPEF4&Ew8MueP92v@e}@B2yn*#{`Y@=F0dR3ItB)M24?tkA?SkP z56;QJc;pn*0Zj|$%U8KX<)T@*wG#8H|6&!BxBSNA?AOD_E3WWKVhR3ev`_Z`-v^8N z|MbcJ^TGc4Ttm=adIW$GJtuS)`dC!nDQ$$}DZ;tw;aD=G1W@caW^;NxVilT!0_hKv zBo1^l+%u=2LQq9iqXbcm5I1Cw(A1uS2oUXo5RNWN(2{-%zJ-9FNP)nk!7WQf2ZeR+ zy3L)idVZ7Uwz-PnryCd1h6G$+S^xbvq^t3&B}@H5d-B>mZS(&MU{?!ZOgxxbg|a_9 zc8}`#Vh0+n3~drhKn!_g+X`qTnSMW0#WA{-|Ki|}M-$kM`yKZz8x}tmXP*(cUe;MW z*JV($k<|3j)68FJ0y{WnlJPDVdC|TNcJt2_G$wbdQ|g?c871 zn2B~IdwSiR;Sh6lY^=M)#%v|?o!D46o2E3>RCUP^mzXS)&&zJ63|x08X;iL zV4|txgL=&$C1ZrzugJpIg%%MBy`)89i7ky4!$Lk5V&E(=cO$?P z1_Dh@6bB6)2=Hha90(K#{2PD++>ZnR`Uy!vGYp{*ZV1eW9yZz`6@66l%}^>vcz$k2&w9YI9z9r@M2%Mpbs85f~jgoI@U|;jb#S zr}`R|npLiSzrHB*1Kr%*!P?g_b4l9K=FF3UkgD{XSIB7e$<(Gx``vYieo+g~5L(#C z!V8(n_Km5#F(?q`U}QAO%*`jxh{_)}E>tU8}e**2<& z(J}NXg09Hu{ph3iv7QD0b~+lkkb0SK7U5V2`0h9${oFgGHI}lhS7NR@L%ROM6Xt zhOWTicnO0;7%VTmB!S>`&%g@hT;aG>_VPyuM%hocXK zRBG>;NN=b9GGCRg~V9sRO_9Dj~t^?z>;CJ?m_TWtF0R80BRgo2Y8G;b^`!V(U z9jF#9mSB0jyrPD{NIcwEKRBzB9b!v(H^bigIWUA;uQ9+_&X#iH{cOUGlsb)>73Y!uvmvq z|IbB7%6zPjbkTLoDa9$^v<0vdkOx_{_^0F55Nn3AVUIps4z;0CEsks!&M=1Iul!SK_V*}PxJP;w6O>w=f7|L9DyZa>WGKvL*x>Mkd?S7}% zQg+1dJoqaIr;7$r5;wyqqRFWUJTD+|N64EBd-1oz+loXooYmSiAK z6#TBZoKu?-6724;TJC5?`fNM0dB4ey+l#q+XqBz-hO23lgA(bog;1Tn1A%Xm_l<)W z{i5f)DL-?oly~b-Eh7sW0rDM-54udqPtAl1Ehfs4u7riLud9TNSyTKXW)p@`h{|g)TQz@A!T!> z#hVh#&APr@{Uf9zBw1Nd;OTcWDX;R4(c9PdtP>t}sMmELE;KH)JX~NSVaV((lVTg& zpYNU+TJR=tst(%=vxc8W0ox7~q+cYvr3Wy9Z8){B=M26oY<1Rc(AP=oZgAp!yEiGu z{hPdpQx4I1_V&|*6NH&FGj3xiK2$d9yYc$_R}O@(eG=<0w5{NKLK3BYaP~c(UUsz! zg#n7=DG`QK_tcDyjs7%qF!y*jKF!-7I(tLI>!5*mz2Y#}S?druWE_&2tZ@^?t)tM4icI<3N+eQu~>#aC#=2P{?->9ixf!$yEew zL6@(tv?`N1w=#Mya@^%2PexIuo`e5guxQNP@af*g1yB_n8{`A&tU~>`d}bUQ8TA^S z&XbuA9D)t@Pti~YEoz>)6$EG;UO9~@K3GMF&?{WNDw9(5{ZQ~+;3TXN;Lo(np1wAx zUd4C=Lzhfr3nqXFKt>d3CNTjGg+r>*2?WVRNyHi;1PRz=0#f)}+ju14H~5X#hwyJe z9sspeSoPT0n7~g4$KGR`8nvD$*4@y(sb7_jDi@Qz?X7$G8_AFG^GDhJn!fkRe?2sC zs^kMs<>gkRGGX7<3ct27oXYe0Q;q66U6;rwmn?Un_P)TYuYZPdHM0%zFH*)U_qq@{ zY+}~QhPT@M%A91BuL%vI*;D^C?mZgT7D3d%7$oqE`xT|D$!6FgAfdzL@chtxQVW~$ zn$(&6?7(bM3Vd4WqK*%%TiM6!U{Ta&`_IlUggm+dE547;o%gtGUHMk*s`;6!w3s_w zjt~ScC(mvDA+=_JcDo3?+GIkPZmUt64d+qAMt2?oT^UjPugyMR#Q=0_#gb@C2% z6q@CC$dF{X?Y$mviZ3LrJT=-**nt*pD{j8u&=64yY5+KRH| zM2TV9M6gUiN9?Dg_nfC=!m)MPzz$=GC?1OkL_u?kG!gMKH}40lZNWn?fO-k^B}%}U zsSo6I?{&AqN#0UeDV1yL}JYg?*q;|efQbA^BdRr_*$(Tl2kN=Nuk-yc`#y z+SqRj?Le8OlNxV>->+}Y$O^p`Fni$9X%O*(bL*BTbB(smpv8K)e4r`5`Cx@~V= zrE1(co_b4|?M0haX$v;WIt*`DgZ7Z+I#l zU6UNC>b%hBp{wMtnjAQ7;Zc3Z{Zi%TR8XwB2#yX<7bPBD*Mhm5)TsE;XD#0&!;z_w zeFcDI<^2ebqM$Rgq0o)kR7!UWpO2 zf!CfqnyGn%xon&Bz*{QHT+Xg;aidI1tagtLmD6TA=wf7xog(2U6MsJ8oZwj0!SI6m zEk*3wA6deua)0SZ^v+dM!qP06vhkb(W+-;2oG6hTY3OxxU1HCS>#A~$t^VUNT~VxD z9XV~2I@uqZtEqNYaZh|<*lIz?v-A&tSsqyh9s`ib@8tm>jGuzw>SplK)B)a6C`v~C zIDjV+2MPo$i#hneq?b8^6}M7!JeEl*O0*Ql$*vUzS3Er_#moP0 zkuCHbbcK5_!)- zx;bMqKyH`wN7JUV*2LxaKkPZ{(^LAxifrALyB_`UI-hEsIas)oh?jjFH`D}t!oZ_g zjS}g^TaKY4KkaUvWP_y6F>W|Kn?z1G{+XmfmS|s*k+1u4eFqZxx&u{KI3^r)xpVeM z!c2&GWRnAaL$<(%38&pZ=orNmYZ)b)hBasM>3ZwAr{6O4poxa-HPf=NwxI!m$k9

)N_6f8qAclo1JGNVA@Y6I7< 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 UBtsIMi9QI~e;`3(@Xy5m12o>eumAu6 diff --git a/tests/build/legacy-ingredient-label-persist/ingredient.json b/tests/build/legacy-ingredient-label-persist/ingredient.json deleted file mode 100644 index 19be6fb8..00000000 --- a/tests/build/legacy-ingredient-label-persist/ingredient.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "format": "image/jpeg", - "instance_id": "xmp:iid:11111111-2222-3333-4444-555555555555", - "label": "dir-link-label", - "manifest_data": { - "format": "application/c2pa", - "identifier": "manifest_data.c2pa" - }, - "relationship": "componentOf", - "title": "label-persist.jpg" -} \ No newline at end of file diff --git a/tests/build/legacy-ingredient-label-persist/manifest_data.c2pa b/tests/build/legacy-ingredient-label-persist/manifest_data.c2pa deleted file mode 100644 index edb2745f7dc61e744e0eae6e3a6cb78a1a1569ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63278 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 diff --git a/tests/build/legacy-ingredient-seed-label-persist/signed.jpg b/tests/build/legacy-ingredient-seed-label-persist/signed.jpg deleted file mode 100644 index cbef45acbbe61275b854ec6238c4187c06e32893..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 125010 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

)N_6f8qAclo1JGNVA@Y6I7< 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 UBtsIMi9QI~e;`3(@Xy5m12o>eumAu6 From 6a52f30d70dc6af6e67a2a9157a26d15230ff91c Mon Sep 17 00:00:00 2001 From: tmathern <60901087+tmathern@users.noreply.github.com> Date: Sun, 26 Jul 2026 21:05:30 -0700 Subject: [PATCH 04/27] fix: Refactor --- include/c2pa.hpp | 2 +- src/c2pa_builder.cpp | 73 +++++---------- src/c2pa_internal.hpp | 55 ++++++++---- src/c2pa_reader.cpp | 24 ++--- tests/builder.test.cpp | 168 +++++++++++++++++++++++++++++++++-- tests/embeddable.test.cpp | 35 ++++++-- tests/fixtures/C2.DNG | Bin 0 -> 166246 bytes tests/include/test_utils.hpp | 5 ++ tests/reader.test.cpp | 18 +++- 9 files changed, 279 insertions(+), 101 deletions(-) create mode 100644 tests/fixtures/C2.DNG diff --git a/include/c2pa.hpp b/include/c2pa.hpp index a90bb1c9..ed745732 100644 --- a/include/c2pa.hpp +++ b/include/c2pa.hpp @@ -802,7 +802,7 @@ namespace c2pa /// @brief Create a Reader from a shared context and stream, trying to guess the format from content. /// @details Equivalent to passing an empty format. - /// The stream is rewound after inspection, so it must support seeking. + /// The stream is rewound after inspection, so it must support seeking. /// @param context Shared context provider. /// @param stream The input stream to read from. Must support seeking. /// @throws C2paException if context is null, context->is_valid() returns false, or the diff --git a/src/c2pa_builder.cpp b/src/c2pa_builder.cpp index fadf2e35..7ea9396c 100644 --- a/src/c2pa_builder.cpp +++ b/src/c2pa_builder.cpp @@ -187,12 +187,8 @@ namespace c2pa void Builder::add_ingredient(const std::string &ingredient_json, const std::string &format, std::istream &source) { - // Guessing formats is not supported here. - const std::string resolved = detail::validate_format( - format, detail::supported_builder_formats(), false); - CppIStream c_source(source); - int result = c2pa_builder_add_ingredient_from_stream(builder, ingredient_json.c_str(), resolved.c_str(), c_source.c_stream); + int result = c2pa_builder_add_ingredient_from_stream(builder, ingredient_json.c_str(), format.c_str(), c_source.c_stream); if (result < 0) { throw C2paException(); @@ -201,13 +197,8 @@ namespace c2pa void Builder::add_ingredient(const std::string &ingredient_json, const std::filesystem::path &source_path) { - // Guessing formats is not supported here. - const std::string format = detail::validate_format( - detail::extract_file_extension(source_path), - detail::supported_builder_formats(), false); - auto stream = detail::open_file_binary(source_path); - add_ingredient(ingredient_json, format, *stream); + add_ingredient(ingredient_json, detail::extract_file_extension(source_path), *stream); } void Builder::add_action(const std::string &action_json) @@ -230,9 +221,7 @@ namespace c2pa std::vector Builder::sign(const std::string &format, std::istream &source, std::ostream &dest, Signer &signer) { - // Guessing formats is not supported here. - const std::string resolved = detail::validate_format( - format, detail::supported_builder_formats(), false); + const std::string resolved = detail::require_explicit_format(format); // Caller's source/dest streams must outlive this call // Stream wrappers are stack locals that wrap the caller's streams @@ -247,9 +236,7 @@ namespace c2pa std::vector Builder::sign(const std::string &format, std::istream &source, std::iostream &dest, Signer &signer) { - // Guessing formats is not supported here. - const std::string resolved = detail::validate_format( - format, detail::supported_builder_formats(), false); + const std::string resolved = detail::require_explicit_format(format); // Caller's source/dest streams must outlive this call // Stream wrappers are stack locals that wrap the caller's streams @@ -270,11 +257,9 @@ namespace c2pa /// @throws C2pa::C2paException for errors encountered by the C2PA library. std::vector Builder::sign(const std::filesystem::path &source_path, const std::filesystem::path &dest_path, Signer &signer) { - // Guessing formats is not supported here. Validate before opening the - // destination, which opens with trunc. - const std::string format = detail::validate_format( - detail::extract_file_extension(dest_path), - detail::supported_builder_formats(), false); + // Validate before opening the destination, which opens with trunc. + const std::string format = + detail::require_explicit_format(detail::extract_file_extension(dest_path)); auto source = detail::open_file_binary(source_path); // Ensure the destination directory exists @@ -298,9 +283,7 @@ namespace c2pa std::vector Builder::sign(const std::string &format, std::istream &source, std::iostream &dest) { - // Guessing formats is not supported here. - const std::string resolved = detail::validate_format( - format, detail::supported_builder_formats(), false); + const std::string resolved = detail::require_explicit_format(format); CppIStream c_source(source); CppIOStream c_dest(dest); @@ -312,11 +295,9 @@ namespace c2pa std::vector Builder::sign(const std::filesystem::path &source_path, const std::filesystem::path &dest_path) { - // Guessing formats is not supported here. Validate before opening the - // destination, which opens with trunc. - const std::string format = detail::validate_format( - detail::extract_file_extension(dest_path), - detail::supported_builder_formats(), false); + // Validate before opening the destination, which opens with trunc. + const std::string format = + detail::require_explicit_format(detail::extract_file_extension(dest_path)); auto source = detail::open_file_binary(source_path); auto dest_dir = dest_path.parent_path(); @@ -416,9 +397,7 @@ namespace c2pa std::vector Builder::data_hashed_placeholder(uintptr_t reserve_size, const std::string &format) { - // Guessing formats is not supported here. - const std::string resolved = detail::validate_format( - format, detail::supported_builder_formats(), false); + const std::string resolved = detail::require_explicit_format(format); const unsigned char *c2pa_manifest_bytes = nullptr; auto result = c2pa_builder_data_hashed_placeholder(builder, reserve_size, resolved.c_str(), &c2pa_manifest_bytes); @@ -427,9 +406,7 @@ namespace c2pa std::vector Builder::sign_data_hashed_embeddable(Signer &signer, const std::string &data_hash, const std::string &format, std::istream *asset) { - // Guessing formats is not supported here. - const std::string resolved = detail::validate_format( - format, detail::supported_builder_formats(), false); + const std::string resolved = detail::require_explicit_format(format); int64_t result; const unsigned char *c2pa_manifest_bytes = nullptr; @@ -447,9 +424,7 @@ namespace c2pa bool Builder::needs_placeholder(const std::string &format) { - // Guessing formats is not supported here. - const std::string resolved = detail::validate_format( - format, detail::supported_builder_formats(), false); + const std::string resolved = detail::require_explicit_format(format); int result = c2pa_builder_needs_placeholder(builder, resolved.c_str()); if (result < 0) @@ -461,10 +436,8 @@ namespace c2pa std::vector Builder::placeholder(const std::string &format) { - // Guessing formats is not supported here: - // the format selects the hash assertion written into the builder. - const std::string resolved = detail::validate_format( - format, detail::supported_builder_formats(), false); + // The format selects the hash assertion written into the builder. + const std::string resolved = detail::require_explicit_format(format); const unsigned char *c2pa_manifest_bytes = nullptr; auto result = c2pa_builder_placeholder(builder, resolved.c_str(), &c2pa_manifest_bytes); @@ -490,10 +463,8 @@ namespace c2pa void Builder::update_hash_from_stream(const std::string &format, std::istream &stream) { - // Guessing formats is not supported here: the format decides which - // hash assertion is updated. - const std::string resolved = detail::validate_format( - format, detail::supported_builder_formats(), false); + // The format decides which hash assertion is updated. + const std::string resolved = detail::require_explicit_format(format); CppIStream c_stream(stream); int result = c2pa_builder_update_hash_from_stream(builder, resolved.c_str(), c_stream.c_stream); @@ -505,9 +476,7 @@ namespace c2pa std::vector Builder::sign_embeddable(const std::string &format) { - // Guessing formats is not supported here. - const std::string resolved = detail::validate_format( - format, detail::supported_builder_formats(), false); + const std::string resolved = detail::require_explicit_format(format); const unsigned char *c2pa_manifest_bytes = nullptr; auto result = c2pa_builder_sign_embeddable(builder, resolved.c_str(), &c2pa_manifest_bytes); @@ -516,9 +485,7 @@ namespace c2pa std::vector Builder::format_embeddable(const std::string &format, std::vector &data) { - // Guessing formats is not supported here. - const std::string resolved = detail::validate_format( - format, detail::supported_builder_formats(), false); + const std::string resolved = detail::require_explicit_format(format); const unsigned char *c2pa_manifest_bytes = nullptr; auto result = c2pa_format_embeddable(resolved.c_str(), data.data(), data.size(), &c2pa_manifest_bytes); diff --git a/src/c2pa_internal.hpp b/src/c2pa_internal.hpp index 0e3e812b..123a6bf8 100644 --- a/src/c2pa_internal.hpp +++ b/src/c2pa_internal.hpp @@ -24,7 +24,6 @@ #include #include #include -#include #include #include @@ -251,23 +250,24 @@ inline std::string extract_file_extension(const std::filesystem::path &path) noe /// @details The C API rejects a null format, so absent must be spelled empty. inline constexpr const char *kDetectFormatFromContent = ""; -/// @brief ASCII whitespace padding. Formats are MIME types or extensions, -/// so non-ASCII spaces are deliberately excluded. -inline constexpr std::string_view kFormatWhitespace = " \t\n\r\f\v"; - /// @brief True when a format is absent, i.e. empty or only ASCII whitespace. +/// @details Formats are MIME types or extensions, so non-ASCII spaces are +/// deliberately excluded. inline bool is_blank_format(const std::string &format) noexcept { - return format.find_first_not_of(kFormatWhitespace) == std::string::npos; + return format.find_first_not_of(" \t\n\r\f\v") == std::string::npos; } -/// @brief Validate a caller-supplied format and normalize a blank one. +/// @brief Validate a caller-supplied format and normalize it. /// @param format The format supplied by, or derived for, the caller. /// @param supported Formats accepted here. When empty the check is skipped. /// @param allow_detection Whether a blank format may request content detection. -/// @return An empty string when @p format is blank, otherwise @p format unchanged. +/// @return Empty when @p format is blank, otherwise @p format lowercased. /// @throws C2paException if @p format is blank and @p allow_detection is false, /// or if a non-blank @p format is not in a non-empty @p supported. -/// @details Matching ignores case; the caller's spelling is returned unchanged. +/// @details The returned value reaches the C API, so it is the canonical +/// lowercase form. Some library paths match a MIME type case +/// sensitively and silently skip work when it does not match. +/// Error messages keep the caller's spelling. [[nodiscard]] inline std::string validate_format(const std::string &format, const std::vector &supported, bool allow_detection) { @@ -279,25 +279,26 @@ inline bool is_blank_format(const std::string &format) noexcept { return std::string(); } - if (supported.empty()) { - // List unavailable; defer to the library's own validation. - return format; - } - std::string lowered = format; std::transform(lowered.begin(), lowered.end(), lowered.begin(), [](unsigned char c) { return static_cast(std::tolower(c)); }); + if (supported.empty()) { + // List unavailable; defer to the library's own validation. + return lowered; + } + if (std::find(supported.begin(), supported.end(), lowered) == supported.end()) { throw C2paException("Unsupported format \"" + format + "\"."); } - return format; + return lowered; } /// @brief Formats accepted for reading, queried once from the C2PA library. /// @return The supported formats, or an empty vector if the library reported none. -/// @details Fixed for the lifetime of the loaded library, so it is cached. -/// An empty result disables the check, leaving validation to the library. +/// @details Fixed for the lifetime of the loaded library, so it is cached. Backs +/// a message-quality check on the Reader rather than an authority on +/// what the library accepts. An empty result skips that check. inline const std::vector &supported_reader_formats() { static const std::vector formats = [] { try { @@ -313,7 +314,7 @@ inline const std::vector &supported_reader_formats() { /// @brief Formats accepted for signing, queried once from the C2PA library. /// @return The supported formats, or an empty vector if the library reported none. -/// @details This list is for signing and must not be substituted for supported_reader_formats(). +/// @details Cached to serve Builder::supported_mime_types(). inline const std::vector &supported_builder_formats() { static const std::vector formats = [] { try { @@ -327,6 +328,24 @@ inline const std::vector &supported_builder_formats() { return formats; } +/// @brief Resolve a format for reading, letting a blank one request detection. +[[nodiscard]] inline std::string resolve_reader_format(const std::string &format) { + return validate_format(format, supported_reader_formats(), true); +} + +/// @brief Resolve a format that must be stated. These paths never infer the +/// container type from content, so a blank format is rejected. +[[nodiscard]] inline std::string require_explicit_format(const std::string &format) { + return validate_format(format, {}, false); +} + +/// @brief Normalize an extension derived from a filename (path). +/// @details The extension describes the filename rather than the data. +/// Content detection overrides a wrong one. +[[nodiscard]] inline std::string normalize_derived_extension(const std::string &extension) { + return validate_format(extension, {}, true); +} + /// @brief Convert C string result to C++ string with cleanup /// @param c_result Raw C string from C API /// @return C++ string (throws if null) diff --git a/src/c2pa_reader.cpp b/src/c2pa_reader.cpp index 208dd5d6..7dcbf855 100644 --- a/src/c2pa_reader.cpp +++ b/src/c2pa_reader.cpp @@ -47,8 +47,7 @@ namespace c2pa } // Validate before acquiring anything. - const std::string resolved = detail::validate_format( - format, detail::supported_reader_formats(), true); + const std::string resolved = detail::resolve_reader_format(format); // Create the stream wrapper before the reader handle cpp_stream = std::make_unique(stream); @@ -85,8 +84,8 @@ namespace c2pa // The extension describes the filename, so it is normalized and left unchecked. // Content type detection overrides it anyway if wrong. - const std::string extension = detail::validate_format( - detail::extract_file_extension(source_path), {}, true); + const std::string extension = + detail::normalize_derived_extension(detail::extract_file_extension(source_path)); // CppIStream stores reference to owned_stream, which lives as long as Reader cpp_stream = std::make_unique(*owned_stream); @@ -118,10 +117,8 @@ namespace c2pa throw C2paException("manifest_jumbf must not be empty"); } - // Guessing formats is not supported here. - // The container type decides how the asset is hashed. - const std::string resolved = detail::validate_format( - format, detail::supported_reader_formats(), false); + // The container type decides how the asset is hashed, so it is required. + const std::string resolved = detail::require_explicit_format(format); cpp_stream = std::make_unique(image_stream); @@ -201,9 +198,7 @@ namespace c2pa { ensure_initialized(); - // Guessing formats is not supported here. - const std::string resolved = detail::validate_format( - format, detail::supported_reader_formats(), false); + const std::string resolved = detail::require_explicit_format(format); CppIStream main_wrapper(stream); CppIStream fragment_wrapper(fragment); @@ -226,8 +221,7 @@ namespace c2pa Reader::Reader(const std::string &format, std::istream &stream) { - const std::string resolved = detail::validate_format( - format, detail::supported_reader_formats(), true); + const std::string resolved = detail::resolve_reader_format(format); cpp_stream = std::make_unique(stream); c2pa_reader = c2pa_reader_from_stream(resolved.c_str(), cpp_stream->c_stream); @@ -245,8 +239,8 @@ namespace c2pa throw std::system_error(errno, std::system_category(), "Failed to open file: " + source_path.string()); } - const std::string extension = detail::validate_format( - detail::extract_file_extension(source_path), {}, true); + const std::string extension = + detail::normalize_derived_extension(detail::extract_file_extension(source_path)); // CppIStream stores reference to owned_stream, which lives as long as Reader cpp_stream = std::make_unique(*owned_stream); diff --git a/tests/builder.test.cpp b/tests/builder.test.cpp index f72104b8..0c46b3a8 100644 --- a/tests/builder.test.cpp +++ b/tests/builder.test.cpp @@ -7517,7 +7517,7 @@ TEST_F(BuilderTest, ArchiveToFstreamBackedCppOStream) { class BuilderBlankFormatTest : public BuilderTest, public ::testing::WithParamInterface {}; INSTANTIATE_TEST_SUITE_P(BuilderBlankFormatSignTests, BuilderBlankFormatTest, - ::testing::Values("", " ", " ", "\t", "\n", "\t\n ", "\r\n", "\v\f")); + ::testing::ValuesIn(c2pa_test::kBlankFormats)); TEST_P(BuilderBlankFormatTest, SignRejectsBlankFormat) { auto signer = c2pa_test::create_test_signer(); @@ -7637,7 +7637,52 @@ TEST_F(BuilderTest, SignMessageNamesFormatNotPath) { } } -TEST_F(BuilderTest, AddIngredientExtensionlessPathThrows) { +TEST_F(BuilderTest, AddIngredientAcceptsBlankFormat) { + auto builder = make_builder(); + const std::string json = R"({"title": "A.jpg", "relationship": "componentOf"})"; + + for (const std::string& blank : {std::string(""), std::string(" ")}) { + std::ifstream src(c2pa_test::get_fixture_path("A.jpg"), std::ios::binary); + ASSERT_TRUE(src.is_open()); + EXPECT_NO_THROW({ builder.add_ingredient(json, blank, src); }); + } +} + +TEST_F(BuilderTest, AddIngredientAcceptsUnknownFormat) { + auto builder = make_builder(); + const std::string json = R"({"title": "A.jpg", "relationship": "componentOf"})"; + + for (const std::string& format : {std::string("application/zip"), std::string("zzz")}) { + std::ifstream src(c2pa_test::get_fixture_path("A.jpg"), std::ios::binary); + ASSERT_TRUE(src.is_open()); + EXPECT_NO_THROW({ builder.add_ingredient(json, format, src); }) << "format: " << format; + } +} + +TEST_F(BuilderTest, AddIngredientAcceptsReadOnlyFormat) { + const auto readable = c2pa::Reader::supported_mime_types(); + const auto writable = c2pa::Builder::supported_mime_types(); + + std::string read_only; + for (const auto& format : readable) { + if (std::find(writable.begin(), writable.end(), format) == writable.end()) { + read_only = format; + break; + } + } + if (read_only.empty()) { + GTEST_SKIP() << "Every readable format is also writable"; + } + + auto builder = make_builder(); + std::ifstream src(c2pa_test::get_fixture_path("A.jpg"), std::ios::binary); + ASSERT_TRUE(src.is_open()); + EXPECT_NO_THROW({ + builder.add_ingredient(R"({"title": "A.jpg", "relationship": "componentOf"})", read_only, src); + }) << "read-only format: " << read_only; +} + +TEST_F(BuilderTest, AddIngredientFromExtensionlessPath) { auto builder = make_builder(); fs::path ingredient = get_temp_path("ingredient-noext"); { @@ -7648,9 +7693,23 @@ TEST_F(BuilderTest, AddIngredientExtensionlessPathThrows) { out << src.rdbuf(); } - EXPECT_THROW( - { builder.add_ingredient(R"({"title": "A.jpg", "relationship": "componentOf"})", ingredient); }, - c2pa::C2paException); + EXPECT_NO_THROW( + { builder.add_ingredient(R"({"title": "A.jpg", "relationship": "componentOf"})", ingredient); }); +} + +TEST_F(BuilderTest, AddIngredientFromPathWithUnknownExtension) { + auto builder = make_builder(); + fs::path ingredient = get_temp_path("ingredient-unknown.zzz"); + { + std::ifstream src(c2pa_test::get_fixture_path("A.jpg"), std::ios::binary); + ASSERT_TRUE(src.is_open()); + std::ofstream out(ingredient, std::ios::binary | std::ios::trunc); + ASSERT_TRUE(out.is_open()); + out << src.rdbuf(); + } + + EXPECT_NO_THROW( + { builder.add_ingredient(R"({"title": "A.jpg", "relationship": "componentOf"})", ingredient); }); } TEST_F(BuilderTest, AcceptsSupportedBareExtension) { @@ -7688,3 +7747,102 @@ TEST_F(BuilderTest, ArchiveWithEmptyFormatThrows) { EXPECT_THROW({ c2pa::Reader reader(ctx, "", in); }, c2pa::C2paException); } } + +TEST_F(BuilderTest, SignProducesEquivalentManifestForEverySpelling) { + auto signer = c2pa_test::create_test_signer(); + + for (const std::string& format : + {"image/jpeg", "IMAGE/JPEG", "Image/Jpeg", "jpg", "JPG"}) { + auto builder = make_builder(); + + std::ifstream source(c2pa_test::get_fixture_path("A.jpg"), std::ios::binary); + ASSERT_TRUE(source.is_open()); + std::stringstream dest(std::ios::in | std::ios::out | std::ios::binary); + ASSERT_NO_THROW({ builder.sign(format, source, dest, signer); }) << "format: " << format; + + dest.seekg(0); + auto ctx = std::make_shared(); + c2pa::Reader reader(ctx, "image/jpeg", dest); + + auto store = json::parse(reader.json()); + const auto& active = store["manifests"][store["active_manifest"].get()]; + ASSERT_TRUE(active.contains("thumbnail")) + << "signing with " << format << " dropped the claim thumbnail"; + EXPECT_EQ(active["thumbnail"]["format"], "image/jpeg"); + + // The reference must resolve to a real JPEG, not just be present. + std::stringstream thumbnail(std::ios::in | std::ios::out | std::ios::binary); + reader.get_resource(active["thumbnail"]["identifier"].get(), thumbnail); + const std::string bytes = thumbnail.str(); + EXPECT_GT(bytes.size(), 1000u) + << "signing with " << format << " produced an empty claim thumbnail"; + ASSERT_GE(bytes.size(), 3u); + EXPECT_EQ(bytes.compare(0, 3, "\xff\xd8\xff"), 0) + << "signing with " << format << " produced a thumbnail that is not a JPEG"; + } +} + +TEST_F(BuilderTest, SidecarSignAcceptsUnknownFormat) { + // A sidecar manifest travels beside the asset, so the container never has + // to be parsed or rewritten and any format is signable. + auto signer = c2pa_test::create_test_signer(); + + for (const std::string& format : {std::string("application/zip"), std::string("zzz")}) { + auto builder = make_builder(); + builder.set_no_embed(); + + std::ifstream source(c2pa_test::get_fixture_path("A.jpg"), std::ios::binary); + ASSERT_TRUE(source.is_open()); + std::stringstream dest(std::ios::in | std::ios::out | std::ios::binary); + + std::vector manifest; + ASSERT_NO_THROW({ manifest = builder.sign(format, source, dest, signer); }) + << "format: " << format; + EXPECT_FALSE(manifest.empty()) << "format: " << format; + } +} + +// The boundary this binding enforces: a blank format is rejected wherever the +// library would otherwise misclassify it, and nothing else is second-guessed. +// Tightening the lax paths or loosening the strict ones fails one of these. + +TEST_F(BuilderTest, BlankFormatRejectedWhereItWouldMisclassify) { + auto signer = c2pa_test::create_test_signer(); + + for (const auto& blank : c2pa_test::kBlankFormats) { + auto builder = make_builder(); + EXPECT_THROW({ builder.needs_placeholder(blank); }, c2pa::C2paException) + << "needs_placeholder accepted a blank format"; + EXPECT_THROW({ builder.placeholder(blank); }, c2pa::C2paException) + << "placeholder accepted a blank format"; + + std::ifstream source(c2pa_test::get_fixture_path("A.jpg"), std::ios::binary); + ASSERT_TRUE(source.is_open()); + std::stringstream dest(std::ios::in | std::ios::out | std::ios::binary); + EXPECT_THROW({ builder.sign(blank, source, dest, signer); }, c2pa::C2paException) + << "sign accepted a blank format"; + } +} + +TEST_F(BuilderTest, LaxPathsAcceptWhatTheLibraryAccepts) { + const auto readable = c2pa::Reader::supported_mime_types(); + const auto writable = c2pa::Builder::supported_mime_types(); + + std::vector formats{"application/zip", "zzz", "", " "}; + for (const auto& format : readable) { + if (std::find(writable.begin(), writable.end(), format) == writable.end()) { + formats.push_back(format); + break; + } + } + + auto builder = make_builder(); + for (const auto& format : formats) { + std::ifstream source(c2pa_test::get_fixture_path("A.jpg"), std::ios::binary); + ASSERT_TRUE(source.is_open()); + EXPECT_NO_THROW({ + builder.add_ingredient(R"({"title": "A.jpg", "relationship": "componentOf"})", + format, source); + }) << "add_ingredient rejected format: " << format; + } +} diff --git a/tests/embeddable.test.cpp b/tests/embeddable.test.cpp index d10be9bc..578dd2e9 100644 --- a/tests/embeddable.test.cpp +++ b/tests/embeddable.test.cpp @@ -658,7 +658,7 @@ TEST_F(EmbeddableTest, DirectEmbeddingWithFormat) { class EmbeddableBlankFormatTest : public EmbeddableTest, public ::testing::WithParamInterface {}; INSTANTIATE_TEST_SUITE_P(EmbeddableBlankFormats, EmbeddableBlankFormatTest, - ::testing::Values("", " ", " ", "\t", "\n", "\t\n ", "\r\n", "\v\f")); + ::testing::ValuesIn(c2pa_test::kBlankFormats)); TEST_P(EmbeddableBlankFormatTest, NeedsPlaceholderRejectsBlankFormat) { auto builder = make_builder(); @@ -697,18 +697,37 @@ TEST_F(EmbeddableTest, FormatEmbeddableRejectsBlankFormat) { } TEST_F(EmbeddableTest, EmbeddableStepsRejectUnsupportedFormat) { - auto builder = make_builder(); - EXPECT_THROW({ builder.needs_placeholder("application/zip"); }, c2pa::C2paException); - EXPECT_THROW({ builder.placeholder("application/zip"); }, c2pa::C2paException); - std::vector data{0x01, 0x02, 0x03}; EXPECT_THROW({ c2pa::Builder::format_embeddable("application/zip", data); }, c2pa::C2paException); } +TEST_F(EmbeddableTest, FormatEmbeddableAcceptsReadOnlyFormat) { + // Composing a manifest for a container the library reads but cannot write + // is the point of the embeddable workflow: an outside writer embeds it. + const auto readable = c2pa::Reader::supported_mime_types(); + const auto writable = c2pa::Builder::supported_mime_types(); + + std::string read_only; + for (const auto& format : readable) { + if (std::find(writable.begin(), writable.end(), format) == writable.end()) { + read_only = format; + break; + } + } + if (read_only.empty()) { + GTEST_SKIP() << "Every readable format is also writable"; + } + + std::vector data{0x01, 0x02, 0x03}; + EXPECT_NO_THROW({ c2pa::Builder::format_embeddable(read_only, data); }) + << "read-only format: " << read_only; +} + TEST_F(EmbeddableTest, NeedsPlaceholderDistinguishesContainersWhenFormatIsGiven) { - // A named format yields a container-specific answer. + // A named format yields a container-specific answer: + // BMFF needs a placeholder sized differently from a JPEG. auto builder = make_builder(); - EXPECT_NO_THROW({ builder.needs_placeholder("image/jpeg"); }); - EXPECT_NO_THROW({ builder.needs_placeholder("video/mp4"); }); + EXPECT_TRUE(builder.needs_placeholder("image/jpeg")); + EXPECT_TRUE(builder.needs_placeholder("video/mp4")); } diff --git a/tests/fixtures/C2.DNG b/tests/fixtures/C2.DNG new file mode 100644 index 0000000000000000000000000000000000000000..361a7a0ff694e0c35f82e3df0cf956a7d73c3b03 GIT binary patch literal 166246 zcmeEv30zHU_y0N7X%5vvGE|fbrNNMpic;w&C38`k#}LXCDMLb%DWNEt$t+`;LP!}i zmCREi!!`9^&$Q1zhkIYY-}`_6|Le8++~eGR&e_jC&syudzU#Z5XCF_`CL-TCN}{S8 zRmVlT>XHC;k+N7$=maSSl zv~ld%$<4j9ho_f+_kbQfd-d)UI&je7Aw!1^A0Iwp;-rYk$+Kc&XU~~CFD`LO($Zzi zSFB84w>~{%L*~X!n|JNrvv=SA0|&EnPnv_YF|k$EbLplQ zJXXJ<-Ar|<>*BPm9F0cyeib!C#$DE|W!j?D>^1so_?!LQ7mNO1eKYQh$-Y;yNLyJ9 zZltU$>L7ZXT+ubT*39|Nr_yawLkbP{Xm@kYO*oYr5~nJiZ6(oiKJEv{`lwo-wv zJc8kkwnO2NB|0e4wA8jhuXhwX!)FQ&*3FDHfpet}z%MJ;O2~!JgcSJt+73hSSJv!^ z#=-*>z#;hTY%684iz^zqkE#+HxWLx!yRoEJFgQLl8l0R=3Zt@Z!n zFVhEo3*}nT(Fs~{ss^dbQc=hZZC`Pm$ktiaLUc+b9QwaE6KX537puft_23u)U1VEp%6}j4k%&&v~{EIgIp4M1hP2tTR0c^ zCvz(s?4MHRu*i|IN5F-_IhkWFb|$_j^(F5o{>+`z)=eV8?+*s=g=-*wi(`a*8DFup zL?jjc#{Y;PO{jcax~>3CzZ>8Lu{T6BnlTjZ{AmY&z&O$o=9@$&nce}!3MfEP=-c3E z{SIbKVkKGxcgP^%4`>j1e?SgEj?=M7=u_D6-9y2K8Js#5a~>D!4?lz%P1WDp(!|Rn zS5I^KI27YG%>lEeED9B^fddi(E;?2*Itl1QK$3_*B}Hb5gIUMX_7@TF;zFWu&ukLv z0PcJjn~@IIMG!!b(+pNXBOAujM5zn;8bJbZl~buSvPs@R34~rlFyy%3JhYL)8w_sx zton&qlI$gD#<i6GBKb(fp#w0 zTQGBB6mbLaz@g443!){wbP*lP#~9A3;LIdXEOtehP65j#_V>ndUUY}y*@ZcRXhid? zzyWbCFN7e1=_hbaQY{a(Wkz6JkFzLE5b~Df#!4j?qkL`V4B~e(Uda-~kNgp38aGG~ z%tt5{WCIb^PfX>yQQNXin$hxLQJVSo`aJ(Of9n= zBXjccC#Crq^ZD<&mekLJAg=<+qvil>k$C0E9}fwLf6z37uZ`9Yycz*K$3osCx%7ew zrJuoX%+e@B1+w-|t#lm<-fk{5n-UZ!^&Lzt#5@gZ89W0BP{*KPi5NIoi?C=Dh%7lm zMu`_V3}Ipvo>@@S0*+B@%KgNYO=!!Kj4xstG$AmTgQQL%p9DKcH}SUsdO*iQu`ZZf z{AekdI}OjQ1)f(qV8#JPrqkA~Vf0Lt+!+yeCIKd6;x3RZ|01$kd2d6AAXi;U!3MZ+ z<1#Kp@Qid#5NgCoGVaWU8Nyov7Q>J#M2?dLOwY-no8!*dny>tR|T!ksbIUT$6Bg2O>^Lo-h)Id*AXyNw;E#y13NG>>)DhJ4k_*lU1elOs zK$s!CPP9WbqK&}RM5)#7Yl6^{i%^)0LWo%uowV*j^oK+zn$11(^k>g(i&V<4<&l6Q zKB31@bSYGI+*stC5`Yq1b%~(~3`4|FyKKCH52-lB9!{1(3 z6ZujdRiZ^i4_<`HRm;d8xIhEjbLA30I=M(<)ig3VcnxQ8Ou%JI9b^FPJWMx31E2%M zYnX0EXc}gK7}^!m3&k8(I1p%u)Q`UfuS-g0uF%FP>b>aUzME`QEDJ)W=WP@xR;^im-S;=qK9umrH0@6 zAJP-cWnu)F4oz?zWktscMPflqgOf39DtvQ-I7Ad!mSgeM4GI{*(%5BEEgQ0%2XH-E z!48a@B0Gl%&}?D6kriq@BVzIW@3TlM^&UYshwxrKtIdG0fPf^TQ>m#$#$oju%}m@mh0+_zipm#I z3)B_oNVF(PE>t*7$CQf998_GSSV9qlj}vyp!cvn3ts;jeg_Z;l!0|4YC%|;*WRMRU z#)9ohR~yyPm>x3IVf%w$$d5=x6?RTQ8(;<~;0bE5Qn2H1-VP(e+FQp@vnooN)(xxD zP#*oMRcXk63Q`!;$B#%Uc36c4-ki{Yt{)8`qzWmw z)RmAr5OC;xGpQUxmR50yFhDmP9gvbn7Ol{^Bu?j*tI!ap%kTn&4gv}}{>YLIC3{ps z`Ys7^o=B(*S7(v|7}-Zj2rtniUPFZU-Nxs{}{4mE(Ud=m!z zgGMqC10=dDb25*TJccVSW~a82^DJl#kR;DWq)iy2EJ5aiTu+!I33y)SLf=9mbMYF$ z0_}%7@2xE;^7UkbIiRAfE&|J;dY=Xf*5q7V8QBL@l8Gm@4T?al!V=gufj~#I4|ssx zgD<*CKy+b(E|({O3&2<;AHX$GO#d+wxVYevSbvpKM7VBpDN+pWoOmch0zt(g4Yz8H zFB6lo?L#21@~dhqWtuy&fQFay+m~p~m}<)_AZxG%^EqcR<)9 zbQ$bRS-zsWj{5H;Z(tQjF)wf%U=^4EZSetZK#G$#?yw?P;4Du(0_a>cD8Gz#fWzXk zNRpAMLBx?6bx~j)XbC<79n#x@5pfoi^(h2iAmasCIAxVL+cw5gZ#VzTs5I7lV|gkW3zn{(KE=)a`k%wp?awAt0|Z2v63&V(~*1d)=qHl!_Pr* z0knSmi>|>8j4|LZv2wYITQ*BWo#qRKF~Uk5v=T?A|FWn>1sg_Qg0l)-pJa2HKd=yD z%!@3OW1F8?1Av)@5_G(@N`@009*}f_G$P~=vX~~$#m5QY30zE5h_~c(Rko9z8`vY{ zzHpC&|LmuUL zh~0;i3AxZ`)jvKbx1dxeMBw8x*nnEJ57)6mJ_X-`1pzuId<%(CRp9+Ksj$C>r{rTQ zsL;MsxXB4)|4au06^<}?8u|=QVA_dU8Un|obtW7j9Dt}n)GS~wjv|t7GjlFN1$_zm z#H)RIMGN~7zn#pZg0dtewGv5Z2peor35nMM^wDIs7zr?DNy4F!;EMtXsY1Z3IaQe9 zFtR0n9fLVuU5)cK5{c0CQ_M$#6FSbyJO%IIyoM$QTwem)ph*ZgAz1`~?ai?eK3PR5 zLd0Rtd4Ln(O9=)ND-o9QeSfP1oUn0)Pt8FJCf)`dcn8vsh&fn4mfuPPg8+3P5lKKD z3&6+{^qf*DInG}rAXj4Iz5!3mFGMvWsXK5ZS@HuFS+49OeFJbd*|!ktJXGi5g#b`{ z0U$H!&c#JRek1BVjWZU@EY^YDAs>NxrGdoX*v8w1LC%R|7m_I*5%>Wq;Ia2`g(h8B zDRnn7?Iz+C5{P-BTeFL#P8Uql2GRThwtD=Hd=#i5qQYOFb`=7>~h?S z#XPkt{4e75OmUEhetxr|Kt}4=Sda<)P;ubKB_RU+90$N|Gg~Pd55SG!aStx^8QYJJ{(;*dBa?cMq#3yL&G(@X z=|+kBECwot(5HC}LzINInIOMVu>dT~OEXgLu1&P=z#V{Gw7#9*PT;rwhut=VLBFg` zgVQx9$5ZHs0K4KV$oD(O8AJv(}{#Z(YMf}t|SUzCPfFiyGv_zaIm`DhWLV$Bh1X=j; znKx3`NSlVw$gr&-Ym;QnZ_@;mDvqrIB62F)7e|iEny7fa7faSujpHQ|bY>>K48Xd- ztmVgrG-*XZtw^#u0T=idy!t^#8_2g4+B^K*EtmaR=nj?de}BJT4y$McqoLNKiaEEQ z2Q0@3JIc(=ZAhpSK~JK^Hs3Q7gD)YJCYk;e>j*OIH`GBeK5)lgBJ={`GvJZBY3 zl8#B5R$u^#86xKazl6jAJ|QPV0L1gjCgB{w1$fFcbc%j^8He7`4gu~k)Nv)D#mjmS zmK3|W4m`0LWy73S2dST|<{>!23N!AUpw$7i^Hf*F+4(>Kw-SXn6X?em0LV;$fCl_J z{?;o*#pQtj?2jcSh0H`D9=?UZ&51;-g9C&d6VSr z0=H3+l`bT*0i7jacZSYC)a0PYAs?NH-SN=&Uw36mC@Vy~eA*?9ONKFgO%9kOS1FQ# z<&{NF_s8{v&|oE%m@n+OFaa2s)6>Bc)Lax{uDBe(9RfF zE=Fy59aHS@I35LH7Z>CYT!WQ04VY8Wd$@3wIRP0iwZlme20)UbO#{K+$lhMiP%n`0 zmeZt2t$}MPzILI&)^K#XxH6McThV?BiB3qgbpHhh&kVLXYkH1> zWz=Da^2ya+w5QJ`BihVoNd{c&w^!Bh68u>em$A|bWfiTZxQ!O_F^w86c!K#|aG+)^ zrX`fWLCJ*`GEBW$`3CA4@BTL5_sEbV@ai^XEIbyWYlOdZIxZWLHOuMh%Z4*Z39hKB zVTvdyYwYgBEs#JVzdMSiVICOrZ%52on9jF6I?FAlgEO;`Cg((w7@=SUW_jUFk$Gkcm;%@OvF651 zM~Y?M&C!0e&4Oue9LHDG+yFcv?wO3PumVmY$8bMH0GEy2hZAZD1B9`7YjMFDg#POP zlm2S7Ts2Mh&LG&Pd4U8vfAJ-*+*9dsCVI;#7jg$g(@?%(l8d~XpkA&U6c(h&lO=hI zGK4=uEr?kMI0pp=mWn6{0m%FaglK06hy(#A8Y2RB$hKng*U4ey(}I~Oc{s(RndK5M ziBGTwXyQa&!zRX9&a@f=HehwB2<^dDfNy@!4vO=?`n?d6gy3~tB4APqgK+gF@yH*s z4qn3*l^2?VL@SeMfnia=Wtt2P3D#KSZXO#+IVXA1W%2WMyZEr%#Y(~l8TqSypuS((zdJ#@7t!&%z5 zmQB9|$$ea-T_I0EM3Z}@^GZQko&e{8&w{+8KrH3QQv8(zlB01K2BmYdM?w)}gxoF5 z-TbO4I+n&XkZ`DvNt)(Gr;NqPr(>@6W7R!X%vraVEwo@Pj^YPGYaZE0tPD5SsC0`# z995y%AxU8Y4oRzi4!q?oF1v9#O&6$S6eM|GKOHQ~^mmf>1`vb?j?Ibm7&Pewf}n@0 zD48aXahhwtVJ~4pD)SzB7DpN_U|;|gUDF&<@u_4>cqsV0$_^`|-FhSXV zNor`qv3N=_-Lr-bik3$pb}fS$0B9)Sei-`T3j}5q@5{qE73FhmMFwUiU_T%MlvqH5 z;0idBs$>~M=2Qq@uuzStjeN!+j*8mNLaHG5hLrs>G&Z=43n2om*h1k)=sgN$nAe8U z*cv}b=eW!w3pl{e2+>)8h+EYTG|$ELN7^0c29W!~t2qA7HGm*>A#bBygy?8|C9-rP zKNj7y&wjRn3fKr9goTwrg%!6;@?(XP06Cz=>uE4=gBA@R0e*5SU+w0GA79Yfv^Di9=uF1MwJEv1oopD)J>S+2U$kg4^8`dBzuDj0=7j2 zTVeMqF1qCSoEuOu#<3U_knjW!2JeK7OT+WWK#Tbt7#5Fcf>JO?*ktJf^gaLtKC}~B z!8s2=0ZA`}I`S(!bhUsr1PU-W(H8EDj&FYoza5*)gIF}Zlr6zix_pfV7-Uui_pGan zk|o)Zj*k6xQ(EFri!lZ?w`A}Y?wL_5;HW0VozjFmxhPE_}4 zqL8Kugt{w}1Fqul47TU4yE!^8eQ8HJo(G^$_r_m^EVG@(v&pLw0q;4D#@aR3s z?byx|EyZ;l@>wL6{KO5!DLqd4B&QE*l5|5nQQqUQ7sCL^ZH45GlK0T2@Y}JjTyP@e z@B)cnPGkNfQB?F89cF|~asMSP+qc`Ge2u(!x7>nJjRw4e??LB(1)Cs6($*6)B7#6iFp2>Kvm zj>nSM3glO0u*5(S4O|Zwia+l0;NGO%s%)WGPw$g`nX7=A*rl)v76Aj4&_Al*fi{rD z08t9zijo4SnB#=Z5P>Ph=1Vh-S@1y@3sfpKobX^MWrZb|qNAK5Bha{rG45MD`6 z->wOR<};u2J&A-`vV+GR(WM+qk$g?2%(3T)MDG z2YHx6(09ZVse=NVQ;D_|gQl$3@?;ql9UP&g%vweYmp)kCvi;NY2OW-RKl&E zQ0&Li=!CRRVmg?_D61slAPQS4f_?-XKf(!w2QUEc`eNXq-8X&)B49+!Pk_KisOn|E zLrig&)*;(IBzCxF!POOE?TaxUc48cJL|%WCzRv z!-78&if6zfJ5Jv4ema&cyI`sz(+bcDe%ref$#9L_Z8{baa4LPGkPp~Yo*Fq#Bdk`xu)oEvbNACqX*GnI=@ zMgZ8xN2;oG5l^%iuBej`>}CyA1@4bL6Ox0hJ_CP3NWjkrnzd#KKTOLuzeg})1^Ji8 z8AL9a496eDIu%=3fXVnco>{VUiLO)tz$J0UnGD63tc(=9mk{EIbK6S@PO5V3X9}5Sr%t|syM`_=Oh{}NlgTMgyfAX z?^EbUq!9SAiN!mFNXr5%T{8Xyp-=S@Fehbk6k!#sWqP-0rs)%%orkbATnSFlTM{v7 z$189U*P@#uxZ@;UkaNQ8q^wtfc9uruZY&8dps8vgtfT!;ucP&Xy|*QD{GCQ4WOGY| zvkdzA>taw1=Hl{$3XMSyFadI34NC+@U`vD-fF+oxBasN7S_V;s)Uj+%{S@CEhp;)K z@UgOkl2zH7ZHyPhF_}h)u*Su;5NV1Okc4I)cPncyjT6MBEKhDNBbqsR^yb`w)>I6= zc}gD9gn-*~WS>@&j0xcG4BBG>H34B1a+am#9VGT#9#`St{e%?%6pBcpsgPB`V^Paj zur}Lr5rN_ll0KK0!8p_bFr9}Yohl?;p(gJi^d40#G03gVLZMB$7?);YhBW9S&`nd!I@XHqwzjbgTM$6S};XYp#>bKr;ZZZAXsN3WHS=%(g#Vl&y-BI?gtz z-b2z2NeQe>1!L1jaYJa^vDF@2AwtK(ZVqib>Rs}c1Uo0&s>xIgsEqNzzp*mJ3My{l z2c2LU3FMoU5i?5aq`u6gI9n?w1}4W-$l;QZloAVOI@->qNeFlwu{Z^rAK$T$vp@JC zDnz-}9z^6~W5ET($v9yOjTkGe>5}~}0dKtwKco>sT!qy>=nfC~8iEOp#26z> zLflQ)G=*-S61s5)E%OQpLnjP@gbGw*fSVj^ldsTd@%Q}=H)!lq5nq8Jvb)Q3#h;5S z8u+gnBJLCMC554&?NX=0@&%~<{QeMxF=L~2IiM^v31E&^@ja`4!VR^#(X7*n#Kjea zmrN$)N1>c?X#EDW&cctZ%%R7*b25!U7V7fslF$Y+B6U3kD=dkVWX+*7Ksk0v66#!| zkhTq2%U7;b1$7OqP59k!X3g6!>BfojINreA^6TUzoG8zU^=u^+0D-ENM3V(Ajc`Wd zSj9*i@QO_wOsPBXK=K;<#iD=j4+(TEAo2hpZ}q&oZCl?5|2RL`>Fvg>F3; z-Kb4N??Fx5G#qu3p);=ENKM7kF)vNyomHq=`XiixlaSx7rz{z_+Y~m!!!`{3*}wc1 z8j@q!4^9D#;Gc~4b|8001GWEdX|bPya32NHe_H=Vzf4Oz!;CZ&q-DhvTNuaOhp{;q z7ZT_^tq2uUERWEivL%8ar@}I+AEgsS3fM+Xd3s5g4nTUMj?6?1%mHL%pXN8FF)DPY zx!a0REiwIfPZM|*-}Ng-@Y9uKod;9paRE;_8dL#&B22@(p*=Hg$mxM@C!NCde zPM6m*6p>3pu$DlRB_YUFKv^ieXC7xIAwm>|30nKn+j?Q<5G(v58Qdi$zh}|f*`%>z zp-`fed1Xo%|Mx^u)KQ&}ADmc?i^Y1YtY3>!ft3BIBqQOjP>NHDAKm5}g(gF1;yiE& zf)m&EazAH9C?XuE=Y;r0E4*ltPj0;hgM*+z#uSJkTY~S3i+RSH@zOWK=6C`QyhYaC z$M0vF99<$y2^fP3W&~7&qxlA?ms`q7#Te=xxTgT_0+CNBfgesHw9aJSLH1k|*dVA* z9D${HssjF)%I3}#WINKmHH4bnk0xS>X_5rx?pnt-N%3P^B474_Yaj*y;l?72wAkPP zGY9SV5_U%fJpfu-_Q_kClzr4sWZ*5^)`wsl98^K*!vMu83i5PQDC%+Yu6$gYiwF*< zZW9!z+?rRx^8*UF6Dg;-MHSd4l%^4(3>L@I&{o_%1-62d(fiXf?;!X~>^~Iz27aH6 zjL1te=s1V<RhlVc4@evb8WR8sp@E|u9 z(qsThIDe$LFM}Sao#p|lyxZFt- zE%p`I4n-v}MXL}V56gWJH3tlc#qXz`7PtiJZE%k@_A-phI3T;}=}@|BM&S~O(nG!o zzV$u80urAIMFcPrZhM7pdzA;pH%M!sNVzd#ifn0NiYZ+LDYFjKSAdFW`P6^ z(+u}gA|^AteB%+fr2Z!5qyQA>g3S>z z`|I>2*!=fP>4MD#nG%b@$WG6S9wi{b0N-!IRAV8^Q*-2-(9B==R%wdaW2I9 zOjyfClsQg45$f|_+${ub7qDHx_Fp`R|Bk%T*MvA1;#`PxAR3fL}S zyMXNiwhP$)6JYs^y+y!w0ow&^|L@244pleRMd+_cB!!>MZYS~;g^DJL=8M*fc8ku4 zZi!xt)Wyc)HsbE$G2(df7V$apb8$5#JEfjV)08rlE-L-0WTxz|9Id=t`Ju9b${#8* zDu-3xtJq1#NVZ8{N}8*VS3RKmO|`SyVzoPJP1Gl=pHr`|F-{{-!&oy?^Qxwu)?%$U zS^?VG+QvF_b>8R%Rm-o|uKM=sCN-AVsHQttS6Od{o=AVDzKV37v_{S3nr5|j)pDs_ zRC}<&XM-hmni=L94z8*rp+6hLfbudEA3~r7}heNm1}Ez2eUSYj(Tmi+Nrfy zbyDk~>0HCbz_n3Fn@%0vy15VPJk?{VXO`EcE*0MTK5e=N`^I-W==apWZh&u(IX!cF zee2!6@AQ7Tfg1h&2CNBw8R9f>@t`Mzork6j`!u}o$fKi7$1Di@ICk*(>)~D#k56h7 zxo5K7)ZNosM;)2r9({RM|JaJzF>~w2?V0bppnPFMLd(S4OJ*;%TYi5C#H(h9d-Idm=mMoIC9+q(CxOMS}5K3x9z_|q59>%RJe1)ueXhK7cI2J26MYUtiQMS( zUT}Vc({Kj(;9z)O2c9dz>tgt8cv^z5VQ_b`s6HG=<4lL=4d6I>PYgUaqR*4yxiNj7 z4$p1jIl7iT@Z63*KMc?N(dQ@O`GV6bFcTtCK0HT%s%})>62*wL)z#HC)U`DQ=?k78q#Xjs!7p9H7WUs?$4Z{ z>JD6%bJZ(RHJ5>7LI#Nj9*2t)R~;AWsw-_#foW(c66=bUbj4LC#U0=ki5UMuUjhDr zt&~(Gs%q*Qnp!Z6@-K=-O3LiT8en^|vXY9DL`_v)qO5HXFX}3*nCRI`T)GA8Hyk_D zPF1=%Ez7l$X-&VJ5c?M6qAzz;GfVWZD199|zGba-yJj`+w50n$x7_vNt!ftr+#mF2 zcg%^R31x5H&6Cn&_bfem!1vpjSEnd^@~ z=!%q-;A&OyHL0meTH;GEvDH(7D;V2QUt%|Nu@qfFj^E`9d()88anXq#{cDDfZ}Hkp z6vS?H-5RNH5z1H8Xz zgHMf&obabh(!6J)$1c(2Ja8P&;787Esvlz+;TMiZS(3h5Gf2AHv=lwsgHeTk438q$hed@k{hH-Q?wInwVi}n&_4EPd?;dRq$ZR2A|!VPHXyk z!#9Ola+DshF!ywn9=3G!%#|LtF!xSJGl^%rXoDZjp*eZy3N-(C-n3%y3_LYOXVAd! zq-Ss;=aCs9!Gn8F-bf8nO6OK~hN2A`U|APOWI;5cO@4_9#kTKSb@>4}PPa^{C3cGJ z@MsUeiUU3g#1COktg$ckGxz5EQVyCdkH*A(k*k>^zluhF7`-H2AD%BsNAF*PXD0k< zG6#QWOCE@W5uUPVhjcGAEB3rszE$@TmFg%qWhg4poH@iek=rWjLgH<_<_l z5wEX;qY%FR0Wzgz&PYrbYT&PpA61@`=lIKG|0V918=k1ni(`m;2yhk%)JzNs@Z1wT zuuE`VE-}|gN+6N3QmNDdPTH@w4-N{`L{Go&iJoR&ex9aFEn$|sXP`q#|IkBgtBM}# z$DF-7d8`tdxS|*Ys$QPR{fOgXC*;5o;oMU^lLRk|%+>u$5EgE5hDQJmYkh!IYpqP; z-ln{XGlsbZIE8r&#}-j}suGPnmmEPJ4MD-1e;a^nfOieR-&&sS%ryL#{g*zjt-A8i z&(oos|6G_JJi*}FCFw9pE0vbSB!au;hM)656OXJyQkq5)a{mJevkzORVBqlcMmUkQ z1bKU*2iOHZK!V>CCNhkqFb8iOJUjr;Cn|WS!ooPt82h zgV*0Yd;+f@xFr2wKRkiRNc8#F4_()Jg5e$i^@G#Azqzoes;dwE(^t1ju}Oc5BG(1Q zETlXPB8TPN4rQZ$rs!)2QUpg4;h9VGSwTh)ex4^?ZJa1`cTZE^`_c5JG)6fL^9*Ve zmRaGjizk9>O`nyJ6@Xj7c}TYSC-a3LP#gcMYY&&CC$=bMT!5r=S6OCy}E#y5te#V79x^ncR08KVLJeV-ZQxCS>?m?P(TvyD zK*QIHNptk@TLzC1r1UX06S#0elKD?RN&!~-=*9f>WAtj%O3}q#_u4kbbM*@up?Dw?9B$t8E9hcN4kPkJzex;JS=n;6<9?Rpjq{b*Il`cW9 zMX?&(Sw81eApys^JOL&p9VXJHxE^GcU?M7cOrQ8012J=9Q6Yg;!LuR`5DeG^NIVNM zY`}yfe>L&^HR==W!ckRM9u;~z7G;X415s&5qj4e1afLYRfzM!PmXHdDl*nX0DG8C7 zo<-i5i`Xrk2tN)2+U6HVXc*0I$ormRcAXub<2VY(MH7|+6OjXlN8?8#Jn7-W9?JWE z(nQ}RGniLbUnu;{G+d$bOMTyGM{@wD*LOW$OgX5k8=TTGfEuvH7Bzs00!`Xzel#egVh z;iU_zT$-sR_w=9pW?8N*coxd!e>$#tKDR2eU9)TIy@11csi~%?BL5ou;xHu64TV@WVbBHX4qgEEQ3_@RtOJDdwDDPrtEFNz$-im^ zQ}Eb7ef1dsOF)saQ{r;4h!%VVaVd*X0nGzL$x5ZCrYVhKemv0>gOc}$31D;rBsTyA zl*DMUf{(~!iJ}H-se&Ni%f*gV^GM0pr)K44;Q_0g0C;;M>^A)cG&`CTFF#(Ao)D(Kik+#Z$}E=7EI31XD!_6j4M-i15HKxaCSk(ljB>4n&A0NK^$y3Lv9j zZ4Urw1RNEpqUVd-M9o9|kTCOKy8if!y2-z)@G-EhY_G@yT4UoX!CH?pWlVKx-GBfW zife1A7tPiEjd=`@$<|b5LIsSaC-PKZ+>b%D5e&*#jmSGGU6H9q1eLjp6KMoq&A$C_kj`Kw1Xr zcr8iCbOlebemZogm>P?#bf%Axv_KOfa#v534}i2_VFRgB5=aa1Ve)7$CupOTf?b^! zRKHxZyp{{o`oi)NlH%3bmrsAHf*1j1zZh&ObH;N{*ojQpV+A(w6<9z3RDH_iwk-JfG^WWd(x}FQub;vO?HJt==imA+RX-}L8 zqHJbpu|g&h0SrI2vlHAATr47`Et|`v=Edc_`wjCfKVQqUEthA9Dzqy04OLT zy%M2vL~A(UDJ~+>!VcL}R!{25-to_UbCsy7;DnE!hjsCqp#UTZg6TRI;*D4};xR?M z4&<=4Y<6;7pm>2+4r;RWgJ?-WmOwIKrneG+5RcK|I+GDUh%Nvaun;m0O{g%{wDU&U zDqU29YOG&J=3@&zPJ-|ec%fYZUN!&=0Q8YFLJp*hjer>wB8Rn4SXhHqPhQ`Vaz{$K z2LJ?6E<)D70K{-k&(!E8^;YpZQt%H#XsCDIn+Jh;^xZzy`CTpdm7E&`jajAjDk(jHnY-qr03ADRye4>Gq zt#p77L2->l>*(;S_;@1jgZ+Vvcy;mu#%XxJi)pkZVql`D@c}yz(}X{Q>Zl}Y80Vpp zpqZFEuv7xBzhuJ>aDDw$wA4YP0I8{_XpIM2?15H&Btm`mk2#Q8RrF7rKxCO@I(Oi) zDo^lYBotFQ55Gm4yO)^ zUP#B_SsU~Y(;7`rz$8d=62TjXSLB%{c&ehsHH8FXFcoi!VHdf%U3l%-f2#N4u&BEF zck`!@f*Qvs)DaL}rFLP-XyM_%9l`^jSZgP0nCkbO4YTNBhsaxEi3|_6AmDI8vj~Cw zPxCoB-|t#=?e8Y=-@-r*mVGCuW%hZ8@rZPHV#&H4&7~AIojJgwy?3X zY3*oZgYFT)_G{x^%4}~nY+PphwYR{ISebR3-2+6f5*ac^ruQQRr6b^xyd5f!)!Je&RTTA zCF|6i9P!?@#v)P8ChOzt9!`1w=bMgmPVHInTzk~sQNd#097(79ZnZ^2TjUlUG_IGF zX}n4XIM1Q^T?J8in} zU}8uT{Ouk(GIT5cZ)=D&^zgi~JMWIF8;btcUtd2I{;oGH3ydFct6E)u*4we+@wTT= zmxvb5Gzg8Ko1>dLXs%7eRzV3f^5zG0GN06Kt!=8N*QiK)htQ+8=5GFuh~d$*3rmZyOuGE{W;W+|=Xa$DwuCZV&ko^)#?${c7zE3ubuUz7jk> zPGh>sjl%YJ#g!*~8uxZeta5j=*gCw@?AWK*o^KOt%iDPEp;_;8!shR*9&S+o?6rFqmYr4A%Wk*p((dDi zNs~5Cd(>lfw${{g@8BK6e!} zvDGcZFSnl6pT0QsbK<~2t86w(V^h4|%{kmIfzx#MbWv$bd%tO^J2Ctd))aK4`&#j{k zcJwGO9#+4_jQv|~c0D`k(3_ESZ8SH{=`woxGJV{xt*yG*V8dL0! zM%|qBDr9s2=Pgv-N4vYei1`w@ao^Q5rUA_+?$jObKH*kT)XTk(93y&u+0g3R1a6mOxv$0C{?a{{N$*I_WLFJ#X&nTUqRmbG5bZXxlYXqTUokuO~JnDUiI4!3wZE$fqmQlkGtlKZfiWTLBl%jdfuJxW41GH?a@wG zoeCedF|gXw>--VZ1p&kE%{#Q{{l|KK%Z`+}*yyyYaVNiV{(h73gTgg-#=k!m6Thy@ zsJI3fZ%@wpqs%>RmH8)k)!p+_!XK*77*vN{owDI4$ad>P*C)C`@Mr6*>8TRc~}pX;^G zTRw&~Yrn|)sZB~;pH35-&S*AUTvAP`S*6kD z;L|Us|=9>SZ_AfWwT6?*b+GCx$=OWh`N@oR3n0)l@5VG%=J~xeu=t~O z)X}Our6$+C;s>p|wsIyQyUQ#qMeIqJ@P-aw)p#cBjGD!`cpZ*FIEh&CufoXT4WmyQW^pVUuJVa%#{X*m^LcxGkarDt0#Ax>=`dz9=|I< z{OQE@@-^ah`?g${YN^&NUiIYcNRuBA1 z#|7z)Q423jb1YdBsu!%bddZfYEy-=oXGgc4*XZ4e`#x1yR44kFJy%<)*155UjqevP zE1!L@4!js=9Ah#^Y1ZuIys1)?$H}7>`aC-~;o7&x^Q@xu!o3$+t8sNRI#^zjykB@{#g@SzR%AIfF0)F=Ho3MhQ<{I=EYjq%XYrZQJ<4aj zAG5VgD=;MAW{TnS15ax7Nl%=k@3K52bejHf!)8tAbPSJQ-DLtKn8I5T-b&3@8Rqts z?9JQyq-mm!>hsy{%X}KXy{=I!r|r59)pixszN6Hr#4OXF0b)*qJQDN`Q@SM z+eVjWTPFryw;$Sao$k8GmSdFSk4pPx7Sh#vR~NnM37I^2|;@O z8V7s3$4JbbdcL%AExEko;Gjs)0WIe4b-Po?u>RisH65j&N1aO%$Vu8(ZO`v$2pSZI*Wp5XQ*}G`*nY6R`~80OI!Nyv>Bw-_|^pP*zqR5 zsUE>E(zsVg&S+UIw%of!rQfu?QD1~p^xoHipE1R}x42sYSn<^gHu=k0+>KBIU zsEycsb&h)VR+eKL4S&_JqMJ$+HIr4x9~>%Qb2ijjJ26PVM{w&G9|zS_cG`aTZj&1- z`_ijCHn+A)51Z#1;V|^D>7G@sRt#@9y5k$&c{W9Uix0f6UUt*DQ)seYr{iK#MU+IZ zhIoclRL%ED)C8@(A!C3{`ik;;h~ZJRwS~xcTd8z<=LVvOGqfeX1KXGZtxfvUf0}CZ zg=5wRT-a=)pVmG$b>i-rH_h4{(C*K+XBWNrqr)UXN^V%E;o;aVV|^LuZ|I5iww((|YV;^z@__uA0Uu4)hL*WhwcTSXDa+SViner;Y(HZ8 zaYl28D>*G6#$`M&UU1=Fc*x6z3)ckS75DXaYSYL&FUnFgZgE8Yr#D(>KHpNaTj1F8 z-5=wp#*T8#FIw_J<D(hX0-z@d(-mvx}2M{Zc*(f z&!UwIrE@bYJF8~y+W17Yw8_b*hXy>oQn7r<S9h+x#mGI}y1ak2F)ii?WKC=m(MhY;*Oe8s8@QD_JL?V( zuq|7^SlO|vdcxapW4(?V6?{8#+$hK6Xq?mNsL~_J#}3tOUKr7`qq4ZUzw$I?&!{iT z#(w)%S9Q4`G9hEswf5yD#{J*cugv(QCN}@l{bPrI=RT~>f0guUNnekwk}D6?o>&-c zObU8E$Sgc@w%;5#L)*Oew;+ z#4x{sXNGm?{CSbow~E5J!1MhWDGBI9vZ%WDaxXJd$4`;m(`;hwKf?2z9eS12;aPihJ>0F>cy876Y zU(Q6eEq^#5Vn(&H_SQjpuNr5})!W;w^Re=$FP1qU+dVYY?J>UQw8`DB&kFVpG7e9O z#(!2n{#5y4<@ifx|`vGn;*haGl@E$Y61bEj^88QHT(?AL2Q)mqgfv~vE* zht1D72>m!Hu$k1raFAzW&yymnMs|yBCQn}UDN*gt#5K8D4Z60Q@n~55#KjwjJRfy7 zZ_Ac$cT#3q&)(s+eOOdSm7uia!|o~9(^kov;=OyuOQ~Def|h=-j!D(tgddD^AJE4+ z#qa)zmTh-d|J-g|dVZy|PU+;HHKp;ha@$?F<*{~rix)<2N{cJwhBiLi_Oa)zJN7Q4 z9&Fd%;XbKpV;!%OKO?WLZo2GRrzg*M`$vjR2j3l|8>rPHBPw-+RV#;swin-b_Z{PL z%y7K_lFq7i_8r)^vQCG)tM5-Jw;Rz`9O?8x@AA0Zb6xV3rzV$7-WD^fQRY#{@;!ex zS~dO8PP1-Yut`4AV%p~VE&MDFymVf3Zc0`AFJD|gJw7(&c$U)Sl%=gxu2*b6wp7bn zzi@|bou0Kits3yUc-|n-7j4eP^t&5oxM8Ph{Tah=Z}75z*Rg%xjUiuir(Sj1F;UHW zc}z*q{@i(=e}53re%r4vTp?ev-kd3lH`zSTV=F z&0tOS5bbf!cVnMc_cm^K#DBueZ$~Q&LdD)@p0U-{S`4&pw>ozD%Z%THY*>A!4+yrrQCqYsW&o|3giV{_{%&pO}wA}Q%VZ`J-85f{Yk9!#7(yv6QE zcLpzCu>G)2rRN^e>o1STcno;{XR}7Tj-;>eawk3hkI$7=As6o292+!b`nEIuJLels zsVW%#p?^KkR)f0lu4`u-G5uZOlm_WfTKYdaW~CoJ=7^o+l>PS?Z;y3|XdgPb`LKZd zs!vwwY#;mOu&R@)-PAQZo5b$AHKOIXPog&(byo*wO$}0 zsWX=wx9)jUo3Goc=D>mDE)2U1kLGFzUCb5cWQU1 z^0#fyzv_O~vR8|3>bozy+f}vn@tER#`{If=2Jvf4@0T|neD8jp-IeYaOTI2i4m_;7 zxsk!kMH@GEPQEzp_Lj^2=01y^b*cS*U)}BRW_epBrw_@0)#25E+C%?%a5wmC-p8|! z(Tk@XiwR3L8*;hs%<(0W1xL<#AHOiS{CwcuZiY>pG;EaAwtsMsHMyU1n=a75Du6GM~C zF9m&Wa(dGAg$o@Qu5UX>>u`JP&Q%-V4h~E|<6|MU>Du>0=)(GCN4ras-j6<)JYsp< zq{WlfkB!)U*62vh?9*pLZ{?1=pRZY~_B?An*W&f7hx;xF+}nMv)yL97sVc4htaa3W zTverQFZ**9#tV;!o=Um)^6-#Fd4a91A5MLG-|xh$Z^sNy%`tjAc)>xXi_e|PZ=MXR zZK$Ta#kPHWUQ|pYc0p?NHUd~cZA5bHed+CU)homEPnj?|pPk zH)Tc5)`6~TPj7gBzT{9ur#puhKGTj|Fndkeok($mGwrq6CGh+-I7&7QmVD}{NlLzL`SrG8_xxKfUi~G%><&m2@2HsS*+*vbBYwLl2rx(;~c2lX` zsB~>Fzlx)c&P}_%%C%0%1(PJRLt@PeL`4O!hgIB7x{~y6W^>EMscB7HFC72s%(jlE z@m9}!j!rdk-jRMhFmHigi?%+^^1PR3_Pr&!x^>=``d2S3ShsWRu>KBPYES9Dz1Q0o z`*oMjy{MgCmj6EC=JdLTCu=?`x14IzY45kM>w2y~+OA3Oj2LB)kOj3Cn)Doy>*N%g zVKU|Y{8R2)<8`ze-#>Neq~*im9d?DR8r5WP#N>i{9^sPBclRyG?l<+ec!ABvE9*u( z4cZrf$mHtSx<@XZ%=W!xpgdf8RxZHk9NUyTC0sbMnZWXt@|GaSP$>PnnSysB% z>#GGXTX{LlqK}qMd2;9BHB0m6S8f~p>B9PiQ-&uxnQ3*jfAQ^;ep!$x^L|J`jZfB_ zFMA)IHuBQB>)Jhvr)ECz%&I(lY;EYBtk3haPwU3E(osHi{q3xc?jBmL~du2xsH2b{u!^s&R?p;mTx4mA2nl{suuMfC#cY%-hpS~9= z%wAUc)w=m8LhYHy>aLqEYRt4=dc*Ng$4yIn>%ltMK-o$Y^UROi-PO?#-Qns-?AO8Z#1(GmTQUF@xSWSIX! zzc)Qj4)_|G_o(t<+~Gv8jcK8tI(@n{(;BtXJJEiT(?sh%;~s+UT%eZM!c)%R?CcD~%CVoKD$3D$LTCk_hPo}j+ydPvWP{T#DN|_Y-im1$?9i=>Qp~>)BZ!Fo1dD@$X9)vY?Bia?@(kO zbEf9*yKOb9KE5~3zr6lp_wplk9$LbxTm$o`gLZe3WP7AN^BUAGY1_cb*S0RuF}W2o!DQ2wm9{5>4_J#bHQ#MC znbyD8l6iX%2C9V=k52#Gb+czs|FCImw%y(Kty|U19Z{P-8c2;cw$Yn-?VQ)qxJ&zs zs*QTzY*KU6ZB@7OPJhrTd0bT5-}Tt>t^2ZV}0a_r#=~i@bAwWMb*G zj3G01dN`P^3b1Tj!=&ZjXLtQoT?{9Ao3EZXIiO8oR z%Zh^*MEa~f_HKM<6WvC-kLMqVUg|J^%gyy)YJ3&V+0bK<#d3|Tjw>FvxE9y`SzDVM z&2Dw76Ht47LTa7+mKC+S1fM)|r|%x6{A(^foa@>3eYUHXL&?*qi!JSAhi{lz82QHF zopO&w=Qih0Y2cLYT%*;jW0ilX^=-b)epIr*`2gRrD=x*+^#l_yBNpS&HU_wbEqXYuHIy5*CfI%ZW`k~L&LD7@zUVW)t*se}L zW7U55w}yVH-#hc&Qrj)v<8BTrdwu+_@&0{VtvX&+4PP z#I?zh`PrAYos6h^AjspPfhc;z#AEYxMk~E?{M@+vs(bT8C*)jT@%8AN%e!4xdbWNR zw6D*E>4zMySARFXroEPP9AIa(*4}PrDX9JHL2VX6#9K z(PsPG*E2hIZSeVJhs9eCwRx}J+ur2f`H35bH;c*m`fB~k#urWvQItT7LTb_PIN3G?ZKgYP+WNmqARMRJAjjB^f;oMkl*S+Ug zwm7rlakHq=rAr;ow>`M%Mpq-xwD_*KCJr|mv%)xB=W%V%3(IdM8fVqYG#J}`OzD&d z4>ZrDXL>t7)H}83nDsXE;$E8@`HYO}z2j@A7hx0UJhU6~Wbu`yyKc9&@3Eri?Mky^ zZ*j+x%GSDWqnGtNSl8rX<2QM6OHU1%H!4qi*|~2HohQVqmtI_vH2=)=D7Bpl7bp0u zUDMklIXvoU`!Oo{<1FWX8W8Zfc;TY3$_L9dhs0kys@?Ej)q$(m!w+-~`W6sc?t1A( z;=?laT6H`pX;kd*lxAk#eREz}j?RK}^`{?u)4k&nrPTv=rtVwT(EW4EI~}LDEL?SY zVeFfIN->Rx^*EaBHZ0_9PS^pXe$&4-y{_tJAf9D;Y^1Y&czLm<_4B>uQ!X|dd7?)3 z71wU|>9PNtsZ{B3QPSBw8);wnNo`;3@_JLa`fhH^lhbs&M%Ud?tz$?=&f{C6@*&D@ zCH?#RBpbe}J+jvBond#v;$7d&K5l=v){CyrwxjH?9(lD8378c^A3m?k4f8rb?Cx zU4v^^JC^%p)V=2Kj9WCjd+2$uxu;DpX1cG>Kh#)x;`GY3)xX3$TzqGpJi5V-Vbg*> zT-xFO>Qae)gWeSyqTr_yi*6WZmwgLJ_Zj*j+eX7r&&cS|SP_1|`2A;TE*aZJGP#bq_OUf9zwUnP$1bRdPXPs`e`# z?cv%d28_|U+o0D(z0I-CpO@FVe01r-xcF7|ddxHG_b~NqYr{1=P1{aS2 z_3j0`w{$KxYFE$e`NyMk+Vx#uYe#FRZ)KC6H`mCH?YG;zY~p%Po0pp1Cv>mAV)d4s z5~of$d-g5+{2B8;McQfv zjaj#AYmCzr-w21Rb^E+8Pmjr;{bqrcR@JyqmCt=oR-Za<{r_R@9fL*r)pg%t+cxH~ zZDS7Gwv9P#+qP}nwr$%!^S{?xd!IUW>)iX{Ce_LFCS7k*sdQCWI{gd&ejpDmLRLDt z?t3>=tlLn%WV`IK8f8LKzJi4v)&l}GK!+O|v2}~}^T!WqOhN|;tTIa;o89S+Q({Hvd!Kb z5Fn(6!B{Vs1x8v=LQtc`V+YQkMO8HMKTvsQdH(6P_zb`T3zp@&~ugT?%Ay z@2lov8-@V4dJ+Oy9g*ba(`KShs2}S%22A%~C%#SL8v^w(1g{H8?j(BqdOx7^cZO{4 zQ<1ky343}c+n?CYjY!;?5x93}(nPxyHZ&;{8`6il>ikR>a%zMZnN%l2*WYtxMIKa@Bi z%3%2cuLTuO&tkklT1;6(Q9pa&jTLonp*yd~As51_rA;rd6A63k`O_G zuLMMW-kGxn*?6CUTgngUG0Wq5gbr&q&`}ADKQzRXiKO4pqYTKpEfh31^!b)_zXy%eZ?~LUtymQ0j;I9-w#T3|0)e%yX zR#Lk66p+&AAc#HgHQSyZrg6LeI>+O@Bv1sb^%E8LpIol{De}uJJFuWQQS}>%Z7ITA{)@%8(^U0uV*GAIC*bWp47_%XsXkwAZGup5e z6V^pQJ&*-}?&USyW#1WnV?}cBdD;884!t42f~js2nx;eq@?>2$0{#2$+{6A2?+4< z2^cCt>J6X7oIWBq%KQ-?F^G(-5cP(H1Vt=JxXZ}cqf-olspb$MNscsVXL;Q#;x62W~*j$ zH1s&(r(U6nXO<%iT#A!nh+?%q=XOzPJ%Kz zGfB_uc}PMTLKh2;%{jMNHW+7apy03FnftW~K#}AJN{7dDh;E&9#eAIZ+Kt=aLXew? zCN%>P#(n{WgQe|3(*U=*f-f(SmlAZLdpX5eQt(VB1_Pn-5 zrUW2S)x?B%Tl`=WiD^S+e<_J`NwNVpL+sX~?Qu8f99_e8x_C#Xy_ah6PWC0PidWxT z@jU8zFpI7Wo@~Fh>EZyzBk!o`E2AO^M6WImNWm*$#&T&W&Ek(w39vq@yR!?T9(OF{ z>LCI-qcgtPjFae{{2kXFh)DxcU1Yp(&lQFC(;7uu(dfy^!%1Wq3JTR{V0W$Ow#oR_ zAP{}KAU{oUSHgAgcLw|c%;(RkJ*x>}GLM%h4npK2GOZrVCOl4vB`;oBO@#S}_fxhp zGof6Dz7>%yAR+m|#TL*Q%CftFK9Lf4>>nXkOrG~S+^}_w!FMArqGJx$x;A3A1u9Q% zc~=ma3?f{GcTmGXw)SI0G|>E(K;h zT2z>)u~-sCz?#~1iJ*PGi8>>Kp$saLrU&?H2)WUA>_!67{*Pelmld#7)fT1o?yh>( zpkFe~;UFnHZR8>*suyk2-;yWsvIP4TRA4Yr}+zed{>~UxD|e8LL%zY$Rin<=GXNqMXSYxy<$NqG9jJ!y6A!u@QdHo(xIaZ=I9fqdflfw%~HDp zfTeS4KDkB&{g+?UBWHn?NH%q0OY}cP{86xA$&)I_Yq7Xw6#N6s-XTqa#sTw4?zXtt zpoc{fBK75D=&WJGP;PFbs%L1VgUfE4)Gtx>cA{Ej%OScWvVW%>du*_*?Rq$>PhK#g zjbN-gOINc^G;kZ0#+2z@>RON+wIIFH%~H0AV>A6X3(I{$(FwQk-whp~JmFS|s7Oz?cP7p= zQkl|w&|4GN)Okdm+e-kImD?4iJRsk0%L_q67Cq9Q31E+?-JevVdyN2}HZA|b&Axhl z8_%j^4k=tH1f}gq#b+UQ;NEZyZE`SUJ35V}${t1r6naB3jx~PnOXXu-f}CE1*b#GUvYf{it;rt^?ykIPF$Pu#OWTr5iunXaW8#0!ls3`CBh6 z{(TJVg7>vkaE@vaT(4D}vEF~MOi;%mB{;MaLzV<1vdXAFZ|bHA+zKFo~jtjA#R zeDg#GH%Ojrg%^~P>u(;Lf?YNKrD<`TJ?zaR0Kq?`Y#zAti^87zyT+?`EL3U=7GKr} zj|-u*wr?=|(XjkcZmIsi*6$Pv+-|fJE9b_y=pd=sQ>OzxOMe)ccWwy5U*ZAe(I6gX ziTKnkwQw#|kwLss$7ivWr0cVNdaueD1m&D%=nIz{g%Q4$4CRXdV$|=tpm2B-ADK%~vunSsEFo^Ycn;Hm((bqqtl4@959I-$RVo5T z-JYjy1Ht2|1sO};Yiwn8P;MtM>@g}ZsJtR4K8vwUedz)K4U%_o8sLVRS}*@XhH60| zd@hiGNso_%ICO!&*z8}Gym@7~fW`rVr3e;%UT13(mYTO8%QuFYk<3CLxW;NLbm~^q z2F}FfUgc~M0?@U4`v~;wg69%@?EsF+TY0D+Y2vE9$lhh|q3K4al{|0 z9wy~2JMLr;chk`TGuVi*WcW;)xx%yW3V&AO6RW(%>h#!-A2|mhq59U1SP0pKF3CkV zG-Sc74hQ!|vnU8j4M`e-B5bQhnrkqd(>m;YqQ`I?E>7ovHbKoS2>J*jYb(b6Ik!klVd^v8#_Q29N`vDfHrpg0c%wl0dVn_ z6pV>3-wR-M@k`NjohWH@i>@%M4;R4+FfS>4$^D|(1kPOWe+AKHee^pb&>b~Bcp zFCn^S=9HmswuYUiMIin@7Vlr-bsC*a7FSKQrPf%5{{x(hQC8R4+3m1HLq6J1HNm}l zi?>P*bR6HAI+W3!8qP6*@!P4!7~j~X4kdB2!!{jFl>CzJ%p77( z-nRbg4f%8;6x4{SKleMYFK^4bX&47iD2^8BLAXxDK)7%-P@)Lj&8S?(3P;UBmq6UX z^u5-4#*+Es3MIuy)tbVGdxma^N{YE{?9e*3P)X#PexCR*!B@v)cg80ML&5_}ssb8G zfp9aoajgjwX`}^?B%5OnKVkk^ToIs|gwn@ZV1xGJLwV^KMi3ZSrzjP0vlGY8dkAI7 zdj)os6RORFcmWSfOH2m)L2Q=tCDDwQ%6h_<(h#KO&4`Om&?N_}6RM;PnV61cB^Fl`A}Pp)m3YYu2S+ zw?CkXQZV7Wt`hToxuTWZlg7F)8AFLKeE1f-H*la}!v^F@_b}T|JJBisH=aS)!FN#` zEF6-+Y!vlWC{H!y3K<{FF-i5Sw(Np;O!0jnnV8ycB_X>a^Of~4(EAErC~D5vJPJ@G*`6zO7SHbe#=bL7tHGdSZ6k6J8s*LWt&Ko)BG!opf0dto?lm0YF( z-nlByPd7sP2*BZrt(2;jY|X zZ-FdkA2s&LjXlCu0z#anyafxmeWaMEQc~iY9eYRm4_W%~ndXz=PXt3sx$Y$al z?Cvq{XehoxoXrZOM;^n}aM7Oni+W|=V#+GcZBBo`O#w>0x9_hMUi0krBA0al=wLfz zbF#ck_09#ao5dpY`)s90eTgB#sNur|sjvtm>7C*vxBlHs8nbk6q_z)gjB++8WWw#S zX)lSzPeI|cl+Q4;8~S!VtOZP1M@uYWKst|ml85mO8S*r$Ot0eOeHrf3>+zf_5Q*_a@R^)g{LCJ67BO}55ei;J zVt}q}OnCoU0)g@Va6TM~Br+R4_=+hnDvne1lc~r>v7=C-5a42BpPxkDHV|$7Dw)Gk zFR3EV!JV#i8f|`{ZrZXP1YH0ETm5`;o6C$w5j95ZqVlz%ZF%xLH)7$65#~LQpk?{b z8hL##$9qVtZb9~OTcyI=9mO$jS>9kjZHWZ1sb$=5`QnNVyz;z6!ylR!xM=>X)sZ%E z1blQLiDa^{t!Cw)orMqf@xFLk8go&)@5CG&SQUK5{lqPD@tE+P!kIA=6pV8Eab3*L z=(CpcN1yCHdLQA-A9C+i7ftnjq*dGtMlATyVsw1ZL1m#PBpHR}JK)dMiC108e)<6A z<6rVh08*1a4Ac>X1#KH#(eWvy^&u5eS=W^-}j&a-=VyUO6e{{YAG!NA^EPWUZ zjD_Lx%u`%+jXK9Ru!#3AF}5{W{9VI2QUwbx?vd*5@?Y84=-3MY7OE}CkrdK&zv_x! z$3e(C_nA|agudj~Xju5W>oplQ%TA<(6fb;xk8fMGKbSC#vPwffH>3?3C-o7}(7!P+s+W{fI# z3xh0t@z(5GB-y;M66O`eImeDOAf8QRD1 zv>MPl=sd(@Rt2p4Uk^FbK`-7B09sxn)KKLPp zr+@9RVC!g50la?TZOZGR*B!zNfVF>^27Stv+J3N>uA3ijXz8f0os=OLZ<_k>jGwfA z;>uQLkCS@$y9Ec42Krv4O?W<0b>vXnrzSLvcFMYnG{8^a@AW&ZIc6Fqn@Jy3PVeY_ zyL2&V+g>k%4*S1tzuUjY-}JvdNdDqsx_IWW7Q+cP80Rb`%kt_^@)6{QOa@Is5HfIu zoC7R|l6t7+6+itG>j%b5P_!=ikYR8CXa?REmP}M3yHFmUuuY;^$ZBOulk(2Jxx|O1iD|;-rZFYTZ1%0ARg80xQ*qGMo+;sBR_spqOxMkARRQv;E-Byel+=a&Dg{tE zA*#1u_pOgJXDGxF!t(yllk@j@N&5IHBmLp6Mf9cG6DFN`BGb-`oOWzYlwQ zSFA;c0lpD7NGV>WJUsPuT98sDkv|?k_{}t9*42%+7jL>#8Iy@1R(JC zEoC_CjDI$6T1Ex;QAA*nA(f51pz8J2V-eVe!1%@#Y?W*ej_q<5e2qSSre;6>RLDtR zOKGRc$T0-YcnE`-d%l8#F^K&E`z`&qhd)^;tl@3b?pD-DPrPmih*#g5ofCXIbZ$a$ z(!!^`0ppG}HxAl^D|-3d@ZEyj3o19tkf>2U*koW2j&6t^%ZZmrCh%tLGAX^3?nQ*| zp;}PkhF3oAqcsT!JqgAkm6=k_X{WT&hT5ZKP`TktKQ{LaA|9)e-0T!h*6dUo%lSQ% z#=OT%u7Qa;edx<@u+$-RhqrXoz{|B~sy}NNUGbI=XlP$kmofrAG8lV`)-&@mO%TMq zmsp|L6^rS)K8P=WinKG21Fa4K#@)qwe=!~2Oh>F(o7MnJ#zQggy;;ci3QxEv2Q-Y) zwS(WBP%FveWPyM3f{E24eUiBpc}jMv`_%Z!3#@7f%8w=|EzBQ6-R+%OR}%QE>#YKe z=hfc~6*h^M3$HgW8#fVOMBD&$#Y>{x_CaW4xtB?T=IG2Lgh6+b9Y=cb1_hlS_$Fs{ElRt0qJuZgq>6j-; zKEQ{=eAg|aVF*{I^A)0`<00Z5M%r3bymij`F^QLg-QKr)f8by&dzM$uWt(9#%3Els zPUU39t8*z=PHw8ozC7`b^!pFl^YFk_Ozb5O?hL7XFGKA@qEYOrv82;P!!EUiE-&*8AD?CNTox#*@am>BZYGtWF6aP^4oxj zSK#Wng!Cvn@%@z9qBG9o2Yv=&|8WE813W42Y zaNOeg1jfiQlK;XCEX`t>OibBBUf>cgxKc!Ub^h@HWH~?pNzxD*q>%$TMdmyU#zFPK z4OX!h@DHU2i4;C(#P_DfKKQbbtFS7`XpU zNO3V9{v0mPX$=tk)jgV)E z5&0r(>O-yvWQ52~I5v(7!DLZtmU&)^t8j2o0tchp?VK-du5AvHl^s!*AA^3{&W$+& z@s?={*;6R)9RVIf`+d8z*7>9Q+xWoo%jl$E4G-X8pd&9JNOXLXgi5!={R1jIbw7AG zLM1E_92TDFyzAiD#SS|M8$KS+b*_ppM!Rg1qOc0mL01|eD+MIU7E{Migan%^IjP{SSMkdYSf;UK?j`#*X^?VyQ)4J~nGOgnR+4p^lb@}?I(Y}9 zwVa0-AV+qNx?laNwe+qap`FF|RLeE!3g&A6^ zjzaxim5{#X0g!|=Q?g*$h;B$Vd#PdBjha;CTf9T?TF-6hOsGlAR%iLyBlcS0jU{WCSpH6^tzRPg8-%fP6RW2Rdr8*Jf_v#D?y3 zYTl3N~@h`l9|M|rpk+FkXFKp#T77$d^1`LYV+tqoEyED zk$|iLSe`v;=?%X7b<5RyDCqEU)q|@wq)HC8rLt*Z%>$wBw~eJWH(b4v;vI!GSD7mHCLFnPp#Wl}lg zdxBB6o#F&$sf$1|l_&kN>VHl0V0JUKxZ&1zGK>Kn@t6gogaEHHDr}Sh@4Y3Au01S{ ztMowB2B8%`F_tE4C80y5orR^;sK>QkY!-kuidy1MBJzkcA0Njs3WhFRf#ZMxT?M{J zv}MRmQs_9bYIf=2R}nfz7beFSJ$VuEq}d}F`@D-^?~@!pZMB!J?;i6Mk<2AbF@UQvw@AUlEntbeVyihT z3gK|hTn9gm#r&Q^a=3h`Sh{4SsfsKpu0VUv7XpcI?j~o zm;g5=!wzZqB{w`^7<)>_UD~BitkJCDj>~*wbwdt$Z^}w>@kEU>nH6ZZ?bk$2pWI09 zl9&c>SaW4L5KQ5?k=!-AH|QtPDAXv@FQ@v%=qJ4g$q0#GvaEl2RZp{|26_hNwiwW= zhVYxJ`_J<60NrS)D>OR;_4AHp4#fP^@l-Yh?;-3ao%`q{ikSbb7xvf?EOkD!3FUfe zP0w$2$Z){goS7~Zq@MkCZRNIYRO4y+OqDg)H4YT@7H*T@W1m3V8Wyv zPYrt6I2tMmugSeI)cfmx7CTVIv+O7$6?YWLJ=#tkp5ZdTw+)vPt#8ek5Vd_2^~qDfo;PYo{Qfl?-vq0O*&6WaDCE zYd~%YjqASQ2icJv)-+Q=XN{?O#wC&)HYXqHFpSnM;q-xR=ZGtAlBAwTD08bhdd#Or z*x-g0c^6t_3!3z9y-^+9K@uM0Asybx z>KL#Rl30b@h!Tc;>pug@yT7mr`3H)O4o(1>sU<^HCsl*|EbQ(bz91s4**Kqxf9f%R zIZ@}766<9BHf{W2#a$L)WwP7{aY~EG{S%yYESyamC0E`%S>@gF*=>=UI&adEF-neM z`=q0c#2ihVQ%*0AU9#n!fs>v)s~`RivUyqNEz{@`);VPupm2f-T-ef{0Wj|zHdEyJ z%`?1F&6xmy86yP;DNq}?LBQBgj^m^GMkbi1xGe3sf{bxWT?$MKS(3$A3o%$}wC{+eq_FPSm_E=d>3^t zVRRj0962@XQ3y+JJ5kupy(o`mtb?TF3glF^v!)im>h(Sp&tmK@PdKh`K#M@`c2~!A zF?tY(?&7*2{_whPsnPJM?>e9`#!oHDJfX27ys7@+ho*nAcU(BYIm)r^SLPtH^rRm| z!4vMRK>SV`zi&p5Zffb@rtT0t1R>CBqBfGuje}F>05UR<4Y)K$FejBtK8qw-*q|jM z2PVp3yecIl-_Yen0Scb(Fms|Ax{JwJ-$D%*p=~QD@{O@%Y8{HRyCw^ivvrgRpq`HQ zy!%khjOlAKxEUR7F-%~jcfvOIM|mS5_1qYW-sTK*lcCh$h&!J)+csl{OQ~{fP0|CP z`lLm$JIbID%+47}?qr+H*RK-ce!~{67j3rxwDAq5EG*1XCkcWx4#L{q{Hie%8dt_n!iLA&s2|D5( z$50A2f83q+q}}>LVKb*YO#R266uL>OJKAS$z$bpf$-+9ryFDLLL%joEEuq_Z)KYn& zt&J5cFSAdDDd{TGp{_w6s6w;rH{k;DJ1VkM!Z8Z{xMO**ANqZmE5(!P>M{t8bXTlr zWaBGut=(L(1LDPPvC}gUX{K>uPK3y+@o$h~yCD>oCV2XwTImai^&g?h$8}v+-0B96 z@-@y$r^;UOo3@puj4z*w!tfV@syyKmO}k11E+I%S03-!DeAO6>-t)2TwPYdARDKbQ za|{sG1y4QK^IX3vC^B`3hHEr_loWy&i8{dS?1 z)nB|jvpd3;P-yYZ^VRTuN|S8`1c=2vyg32kvVt~4Zffp8IdsXK$%}4Ar!r=AUS)ZX z4Dec|*=Bt`PF)Ig@;olj<>-7JBsrh*p!73G$@Tl|Be)IDsl&|Izf#(tjVV#$MwOs; z%IP20b}7*VDt()%bWhpUd=W)SI5NZte~kKzyV&qm_9u=;KhBhncXut1vHrM_s!)^W zM5dH$wlWkUk?V=?H>0(~F{%AH*;^G^C}7g6oWr1bFeTNDb#Q0ZGug*hCUcF9_kFu; zb7LlvuB+n*3WO(i4CCDercw;I9R46dpU`~y)gBbL96D;hm2UNXLKX%OR3xST8I8_g zkZc7oSL@JILsQTYLkIh_n3q0Yxj9Hq3P0~5)FGfu{Ttxvy5j}#W2HX*>w34Edo*`@ z(hN^sP|jPAB5LThGbQFv$aknY5gm4s$#_#A%K#Prk=o(=CZ`c60AfTsH?TaS8I`3$ zM@|aXSyrh9JL^nP@~Gyr*^l;7+H#Rb&*JrAP%$Xw0tKL&8!Be^Kx$ygndSjw#z>R{ z?09JOyV-=q42&%#MDXZ>Bafh&1GlsSRk)Y=h$)w9g6v@NfTjeo?XCiak&wG3Lzf}{ z{@lH^X}PLbX~%OJPHp2S+L4n*p0?Lq*}+PJGdllNA+hCg?X14dj*^CtIaB}{9na=T zhRoJXND<(JBcdEXVqc6qoJMlpRb>Xa%HjN$I9_r3ag?h=(C6U6@zzBCZ*}U$eqOx^ z0RoPM+~nLfHVaHr)GhuFz&Vf(6plWaNER&N$0~Y%gThEqTi+sR2i<@nbhwallmU2{ z2p@hq|7E1Lg9UbtRl{e>u}89Du^Xe=HNR{3doD6|a`MiB_ptiTT5?hmZbVjB{-xb= z0#luuwHK`_=tY%?#-^ElY$Q94Abc(Of?R0qX48sGs@FmWOiN#Se{1zHH+{^(iE&DW zk}VrlYVt8w1AWkAr62w>M%_M)Oguw71xL*|YsDkMDTn1M!%naE@mQ&i7=C?s>HJ%c zN`L!~A$Z?4CB=KnpSorpRB_Cbb+ma@W$nR}soZj@Xi*JDHbZq=qA_0uk|H+GMsrj+ z@@|~n`4cJvA2VobIUF18Yf5tW;r++>T3=R}U6VzUOK_bUISbN#z*p)P7>nedx(e zg2(!3mzCa$>v7xlnPdjpOAx`rmR547Cel;c4|Ud-a_R@4s#)~1%5^yStJ8s{viP0Z z@{^>I^uj@*2f*s1%%?~8mZ1F*CwhVaC!*fkl=_=Ceh;IlJ=Iz&8Q+Xai~ih-4Z;6G zy(e6q1O>8SofH!nE|##>35{|@L<#4mvUl?!JA2~ibsoNN)f+(mNvZ*lVd%&Ul+PJF zoM3ezSc`o}tKDX6C>J(p)}#HzkL;jKv+V0~+eJ&^Z`*U2ii&$|ja>1<-XF`4ZZl zLRYT)#qtyYAsFsiKBh5UHY0k*baE5FLxRyO#hLr}`2jVo*MI>wT!up62275}-!OpY z;Bvz$3+Oa@W1k(FVPJDb)Bha$l6kUTNLrI;5OQ;N$Y+O20s$z8d2P&YZ|OtPLO6jTCafk5&g}qTWDK^bW4+qaiPt0}GuKreQ|PY(AO@l|hZY2|kl zUB3XxLR0WK^s!)G;j$~ckxID=H?Tx{XW0i*5|SMi?{- zZd0A?wd~Pch1nnS3v=`U(G|oDP}nwUt(ET_ea#Vu!E3887?cSOGfx0MM18cB-_HXG z!{C&po?S`3ZS$TmdxD|rLDIZFnCwMR=>W=K;p$;Qf!M6;bD6+s=M6CX5p{%`CY+>< zcP>eP*Fsu_nIve5lE|+$?w)_Kf-f2v-|EW5HBksVZRxm%#lLZ&o= z+|*{$y`?x-xpeajprH5rXo=G96vdl9Vn6y8J0sWlA>@u(yC?+l?Lms{#xXL=o)1&_ zMGI&<)Ygcn@kH1-$X`P1er8t2V0YBI@7@(IbG+ZmQlj$;vMP{SYUVQ!yqpDC+W_sB zt?6il-x0cC4n0d!{zUU-+}kx1_}iini05~kBo$5zSZZSZ0l%4|RU6K=)Z?mx2;1|+ zhSPQ$v8u(Yb1)fRV7`6X^o$!NTJ=KnwtrHPdwcWSpXsK!q8%Fb)E@|~lsaoEsfPsX zD_XB=o%WUum4k>b#Q)RSyzJc@D9>G4jQ8%a3TAxmD*?Dj^0gi#%%{VbPx1Pp_7QJE zMzn{5Yksvd*D45DM2Qj;><8d7k}ckGh!$gT`~W~8l`YjIZ%ue#k=j$pwUl^nc=P>O z0`#4(Wv?ph-gk3~>XZZNx2pEW4Bwh*(uUZ0Lz zBk4+MEq|R##)GUqiS;pxuipn7glU;h*ru!LX$)^iX^Aef_Apg%ZG9ST(hUf>`JLL z(?#ar@Cb3KUvCimaicaI;3GEnWkJX0hWqFn5Xj_rFY&P|I!8LzkrgBC01Jhl$ib>8Ax8)NKqpK<%`RYksK^`vzbw!n7GbOLRn8D?e zN{fSu2l&IZ<-@2@C(QcyV95Z9Tu@F;q{5oPw~648 zgpBs3nD0CCWi9!Ae^1Bjcx2;Cddnn{`{exmmC|VKDK87tWHi+MUfRbW)JS_DC5m4} zqLtmwtTZ~Ae|@#uTdPRoo4Wzz~*!Y6vPf(<_f zI6=H-AGE*zU>8$@uH=40p>SK2O8+2g(3S^I>Z0_B^zMcK)O*9De*fi+=Tb}*v87F8L!)V2XKBb?}_ zj%>^gE++nT8uu6#`bIQIHstB$5flS66dX>%=%lvvyi(ad z;Xn?@cyB5CVf-3SEFWG+It$;hZPlY$8_@aujxhun!Eu7a4}qXqbLHD37Kwi{w#oX3wWR@K&XAQ*tJXJk(+>9zu6cZ$< z43yE6$W>%+PFeneKm6p($dS<&$%Ca?^pGsO0N~=%8e%i`&tx$?Fi-vLTKF09A`Ba- zu7h8(RYjpUFV#xzy{Eo{lN&97leEmRNt7wAZ(pLNfP7@^HwkpZCoc;Jp0ov{TLd z2@l{~dDdhAXDA)pu(6zL0Tc7_XxR(_U0|`5nLu%MxC}B>HI*0!{NJgc$bYGyPJj}^ z3M;YjMm4208(67H|-Z- zM-bw7@VZEw+Mmn6(Zic8rKA_M6^@mM2o%a4BlOp}GbY0&lGFW0i?l%qDRzLP7vy0` z&s85e7&2?i`U!0}A?Y#}z`c%gv6X@v(B z^f#$T4J_nG$@qh}WUR*zpzu2|#Eyi(*FadkRTKfUeTXF7#Y{N6aSdnsad!w9D3*xe z=f8rF$?(6#e^SN}G70z-+K?xwRjcp((Wg|~S&w}JdifELe|~CGjk*Bgi_^U^ zP6^TE+#+!Oh#tWu1pWzq~y=8a&o3#Ambcow*6s_nZ8Juipd{%Ef}%@*?82~vwxLmUm2)@=zj9e41ED$?aTwJXGjDZcSS zx%<;t^XxUBFm$$J)>L|I9qpps8bAO-L{x^k%^kmSVId<9j)ci$;F@RvQonL=g(`p& zF*JN@5;3n-+TjX~P%0O$326XOLU{Iz%=4EYJU(Y6 zt^oj|(eYoiFSvCVvP&@;0Q-2MJ*2%A8Tats0g@Alc|F5s zusvUmFrrB!fD_+MGu!4v@MH60>c=A>(~IxZ3x_~A*fB1iWvl8Ov=wA{eVL@KupvqD zm*0+GCF;{q(FB8Z?Cv_%krz=1Em+ssbOs?Fr_bn)<61w##g-?2LH+0Wz`f&oE@$s8 zM%)517mI&r+uUoFE*MvS5_a|3T2ZCs(ir7j+HX_8vq8Y?`;dUnO{v*<7M$tQe#5p_ zuvO~Vk`Zk2ji9jBY0WD+U5o%+`lUTCA(zq1Xn`T36;P%gyhh+7jFa7i^roQ9`^)>h zK4j^4h+i6(_zroXO1fF)V2xAmpqS|C#X-HBr2stWBU2H}B(ib;CQOvU`ngWQy>Q}a zwlJtJDM<6UdkcnrkS6n#BfJGoY&s)ZAue^19BNpjbljk1@E{p`s#ES%nlU$qk+2gD z#v9^thgnl}WDqT7n8hYf&^jSl2Y8w+4oBF3pck1-S_n~KeN~4bTB8IvTQ+(G&nJ}E zR-U|6@|2lJ0p)TxX!^*W$V_0kB~g(U%?rXqU&LBk>8=DU?w~$m#an?X$HGc-UL=p~ zDB{rWaqmpyX#68Vc~LBzD6n>3*7?BB>{j~Yk7O!z7I0@S0)KyEFF(rvtxI~JH4nbu zkS~EW18lK>#+>^no>uKhnFJ3BJd0d-cwt$vh%{@egQ!1o<`*MyOXSLxe|b2GpS>^& z75)WoqAQ-Q9vF=d(#-n>^6}MW+om{CN$r@fkqS5WHSiHM5pu!>#HT(|`qSc%7DNRx zTl^@6)jfI|CVUv@s+%9J2prYDe}=N{pr{ERN>#L%iXPKlUwCI8 z`I`FA=R}f8huv{RCJ?z#+}kaE1H~VnSp}RLVmoq3mBk_gx!}d=qi-o#Y79pup-LnO zM(8|iDDd+|ia{pfTow9+JW4wYLYPDg+yHi=%ug7ICWGOf)b}z^p?!5F1W!tC8jzqZ;2=L`6rW*DE8;k~==_teeKc7-1PIi{8QnI|# z7#zT5hB#SobPH@O zjMsDlI)38a1G$Vzy(PAcUL*$Fo%6+o^rGBT{<1qt?_@iL)x!L5KuPI;7rDF79;Lh8 z)yHUw@QB;y;d#9lAk#gW+T#I>o?Ui%7`@)R6I3fmXasyD>#sh`8{gU8F{PRZbb4VN zjncl;DM;S3J1wlY861s)u!Y za900V#S2KJ(WV?ec6kg+=)8qQklhn8Qqv3^eGF~7gwBM#qF22cfk`(Zm?RqUj5KWT zy~X~ZgKKG_mduaU&Plgk>(kNqH2fG`(w*vDlR=)O@vOQxy9CIFAJRaW9Bt^3c+@p$ z^X`SYzKkZd+TWS(z`ncJXCgVw-O%gG7q*tTBRcsyN$b^0P?vok?sMa?$<9{@%5doh z*M)MuC{fhI&1NuwwCpGjqzwFKCO?wkUmbPt-#^xmJ&BIhs*gRONUiK9IUoDjKCATR zfh<#Y+q@s*#tD7XkN=HFq$Lu-GRXxMW9XGovOr2$^;vxb{hY>?iZ0B?7Kv)?>18-@FF_o5#8Ff7VfxLDeLr+;1 zt4PPy4Q2kZae(kpdU2@l)d>asU$qE-0qzI@{t18pZYO{M&x!y5MUVgh|0m)8FLv`E zPCf+SziIh@^L^}q7J>HnLr|M>V%4#d|J zg8w%X@Cn)>{f!8GeiDd(BmDmdU;p&uKYsr2{X+hK=JWq`@E<<^U)=tG^Z9Y_{)f*m zIQ2h#eyPyERQtbU^-o*>j2OFp@t%dM6dfuLL4oJI7FM-ih2mzLKst8|TUR%FC zPOgwxp?%=uIw>*nuV2EEYAfN9@{w`japCge@=^a>agp}4!?`|{t{cOv!==N&M$|@r zjg$_%g)`{D=+J?g=7Z?zMh-Ikh3~sDumf@Z=A=PH#6?9!!a+qf6o!EttOe{X1pxS< zJ!3E2X;vWO2o={_M}FlaSe50xx8GN~8v&9k6(*X z;`>B=@15fwUCJ|rx(7!5Bu;cUWbCB^m)igM+9sy}d&WrxrFT`6Q5xj75A^v_3Vqk- ze-=%k?exnwPbD8D1dD&536mQKgH*ys8ADWvbiKWFd*1kXjeRx9BrgvL!jfTut&T}> zM7cn|8}kFwQ{3gb2^`^&L}>l=JDHNBV++fhf(^JpNGD7vi%8bedgwH1rRMx?#c`Tw z(R|J=Z_Vv`iqH4fk--0A3m*2a3_RDq@ywKXt-ioIi>|RlerM~G`yE!8lD-{03-yH# z7RV%rf2PgpYQkdST2M;m(-g2;JqM^O5R#n2U1+UxJoW8;(nlD?wqrr%g&z(=(WT5` z<|G8GyAy-k_*(V0|APWk<@&hegh9NJ;FbAs)u%z22YfqQMDT%Z4awetD!kO$7x2g4gk6q8`c)We!ms4748!!F=YGHBFF43Q zDVlcPzLGs7JUr$!6O&BSJCE9GQyav^;~t{08_{=1EQ_mc7e=W<&^N4KXABx#=%g1( zYC9j9Bpjm?w)00h;rR5-`Sefoe&NR0!!`^~-`&%`4JF4Ex%99cH~wJ!q)yCq@%oO1 zom>m%_6fYwgM}T8RS9UtAr}9esqM#=gKj@B7@UW6CLU3=qGDeR@yaJ=chF6Rlv zINMgbIB5>e%!#iZ_7r7eqUs-F$lCW-UrUkitvy|z|2V5`vjyuLdMW#dshJfvmRcWW zWCfdXPlHZ76i|eJrPMWQWREMLwT`ztDiwT%BZ!7==muYc(~xBS4%xwTdRg3ar81Wa zCv!Gd3t(;IV0**%uSJa>pQ34?F+;o~Vn8^wONTPF9JN zU$kGa%+6n#&maWwV}&h{l94k<9#&IX^0H#UHu|9U`?~3OPGw~0rVqX79bg(XT}*A!-}QiRf2G591Bu){60ZhN z4ZBLthCjb*)91$Scr#oETf)n)y-5R3^Y$In+uX%8osj+^Sz~UKO*W4C z$FxsuZ_Bz_nC;5d8IgL+nBi$LQxmJ?@!ERskpX?BQWma(A)y;5rHa3V6#Uq}H&Ei} zQ_cPScy(8Ujz^tjb$R-2W2c#3^aX@18JmWvaMXkaH_VBj556k2~*|S*0;Yhdp6mqGAp{>UpShfR0Mm z1*tDeN$V$a25o}WJ(Hs2rF5XG*f^zjJ$t_}&C@cq`P{Q-Ss=Wxd! z=$tUxJ|-Zr#{(7|rmx)pHlT~2Z0M;Rd)m+t+uP*CsNJ&6tP&7W+c8u?`=uN+q&ReaK7os_c+xu;>s+8bVHHD(aUYq2seV9JcY0<-O z3)+i8hfr}P|=fJ zng0kvSYKp*@)DQpb@kz+?(tDCw%KuEMjt&6zm+;~{fX$-Loaoo*vtMKO4WA>hK558P>~Ed9si@Jp?e;>z)dl(o z)pF7_;V(QBZ+)*WGuvCeIj=M0t#G6Xnzq-o!PShb^TP$jvxGxi@`d-kHGZSJiMnCW z+!vbyDr(o95FyM-myn~a!+ofo%Gh1rXX2W~eTGCj8|ZhT18wi$e7u7>0)-@ zrk5}8JDJnb>XlQ?XAVDqK6;nW!Ro-SSFwz@($ZTsj=#GU+n36vrgW#e*2As!^B_#8 z!mcbH-)q?(Rj=$ccrNt&!+S+MeYoOdm1(bB@5l;XWe-xuG<4@G^>m-}+9v%j;^HLR zS2nGdOotEIraqYM-()vzI_tV)+QFw=(K)cD;hj6?u(qK?7yO`|rGRS6y|?+DXasfS_NO=n zOl@TMGf_7AN~(DeWt9Vq*BndiOe_rg50!7z&cuD(L12>E6s5;@+Jh@UV}|wA)Xtcr z8e?uj%}nKkqJGe-n}nA(@t*WNuxc5ulWz;tr*`Jze9-( z@V8u5!}~5&nc9+Dmq^3?hT;=;n0%blx%-3SZ0-E0)-A!DA*~JDoE}9^#tnWOW)yqU zkz!cjq#>g_C;O5%^(HeK1**o+@c$#J39GQZGkTWT8CtDef|CFAiX=2^$>FsBVV1)=fiiAUvG5y`zQ zp*f~I#a`EHpgn!Pis>X-Nkc-R^@r{ z*9WQnby4MU7m!K(iL~&ysu!F;7|rG0vX+NWHn1JJ1g|K2;eZ{fwo-ju+EOzjf3-ID zmBgj-GdglKR?IPH71AnQPbsMHY@6paJbUy;Q>cSt=#K}r;Y#dOh3&%O=|OkSCf(wd z+bQxvdy{yGJ-h6@4ot~vN>Y>T5H0~#H2V0B&W9HxuI@F_TPX&4TU<;ZhZ|Y6C6;=A zq(3(=t-K??Ny`r|GuyR6_^I95f>w&EZVF|p-9mWJ?P$lR=@+aNb}4EmQA=MC`IKQ% zxR-03?Z8>CGX|6`?9#hx z)o&+oP))a5=-;e8xdZ@Jv z>1MJH1@+Y!St%U8Riwa#HiE|&W2b*So=osjI%D0IM|jC`gY4vv*bl?GEmM-@Pke@r zuI0=V=;~{(4768$J*~2NQCDV=a$fU6t^XMgqmn0>8#3|^hc_+;X%F&$pc|Rm!nxaV z!_*aZqmZCs#O)IS&BfQs?9~lo3V8!tKfwjq-4c5#20rN>KUboAPMK5Wbh5AqvsZdp z3Nq)Y=&8FgmouONveOc}xoAKME&1IC4$D+0D!%-shn8q(Bb?)cWC5m-amB~ec zpUN|`m|kq*q&k&GKk__19Cn57;NAk^>bsN=KT4fwdJ#61a&6f7*=OsJ_NS)Sv~4FN zhn`omiCodk=RSGWx!;zFh3ebmKBpnV0kiyriiD8%xW2=dVhYUKux$$`86UE%H;%t7 zX2=NVc6#U?#^Iiofyz0U5>sWUCA7f?-+0hX%Bx9h3rk8B+xVbda%S2+@p-lC-3SM& z6WdYXZei-!^~Mgv9jSA#y|h^$#W2aSE{f&D_iommcop5;*&3Q)aDs-rd25keo%#-6 zhy0@v7u*G<-m2SbKW91SS+;1d?szh%BS6e#{*>RtT@MzE93x2Wq#I(bB!=8*TLj5~EoJyp#fOfKxS0p1qW-X+s2WltR11$Nvl zy28jIkkm`XLwmPP9yM6Ix#hW)ou&L46(*5~ugni8w@_EO?jA+d`VM@qHP8v-;o};3 zGxBOYOk{+mkZ&XN*3(oyGxaBtgn?T0$>dRQDe!DOKj)P}yd7HeFf&flNXT~}?Yy(( z#OTBidQLin!cI!vdHbAg-rky@y-vGiz1x;{x$5+3FHWJcrq4IHkxu!ZDlJb(r0_hK}u;2sy!iaSOuFd(8iNl*m>Y7k25ZXB;tF z`8s^@Guo()S6l@TDKdU3W-=0k8@_){{y?>li5)SXd-a7(p3@ceBeial=4ZOKvjqLu{IAmG*=I`9xr=@%=_VU}%|3gGZDtg)3zf?@`*ks7 z!|kVIk=vdtJj4pvS8|u$-JLeNu@2vZ=hQIxzU$FD zrPL`t^QJeibT_8=l?Yp=UHrSr%$hGnwoItpOLcO;mt6ndx%XcoMj_h_WioC z*&UiW&r*&kTRzS4DbMOGQht9UyFlLT%v-JJ=nSrhj^TQIvt!?S&5no9>eP*S!j47< zb{`81h2=|}ZSGONnG|&8yi97{sy7p5-ss(!Z*(I`JAzjeQ4C8MA)Zw z%8-WZn$b8o51|eU5nO57WYtZ_|4oXNwB)-E^-_N6OGhZh6@vos#MPlrONA{FEkp z!4>dB>9yqso;N<<38>F2_K10ZR#o%-{6{nD1{3BVZ(em7I^zV}Zx(?HondhCZe4KC**3gWya4@e<<*hoSJnu_v|7(P`9yg1Z}E zixK?XO6MqzKh*L~} z-M0AtQ#z`psY&sA$K=`$W@R`kFxT7O-A3o6%P--QWuMZ)1luxO+qH#CK*ahQ_|a$l z@#cqj$gD(c?<8x6xXU?v(~Mt_V?sVn5!oep{$T9bf$D+}Epqe6ujfd69~9CbtBIR&IlHIj$qW3z;TH1md(+*dFBfq=pQv$9ob=)< z*}A(yxPP&mA#KkS^F+Bep4=@3*{a6%1z8LGksGsb66A<|*lQPyxZw z-XX&G7No_~`(@%U_3oS9ar-e9ThJ%^J@vy6o~3e$#x&R0h@837R6ArZ70P_@-H1wF znn|`JKh+kuhLVjkp~htc9|y^Ime8g(=S%a2Z}$kkBOE6>9eaT>5B%KtE1rw$C)Kwf z`C8m2E|b1{k8G&k=_@-L4piJOdc^`aK-64&ac*%8V{PoJqL{n){#ImCYJN z_|7e&8snkk_-)I}?m(xfZ|{B@boH{nGktYWLRi4q zo!2&3w8ai)e&q8Jp<&xjQ`Mi{^Vm|m`<`lc$DE!&!}}ildabW~8~yqYI3Kl4`SL@j zn}3Gu?#7$hfoHD!&&_Xd8yL4c$#Wp>-CWmv$@zezBBe|d;>Cs3{M<}dCvGf+c{hYk zb|)t*FWORGB?Q zyCuOA4!&5sf}@cpN#{hA^pYMjzAs9A?{fV~+vnU&lho+Jv2P!AJjqdD6>Hk!0Dh9x zN^&ztw2_Y~562$8bBf12BHq^u@!5L2*Mc~t6GO&zg$Q!Vy?aI2GxI;oG$iB>sw&w| z_dM7Atg$1R3YD49O7SwGo}p6F=#%}T#Qq~UD9nX2^A$m6E<>N<=TG(`k{dYR2_%Bz z78_qCj54SzSx?$;_2#ijc+B5jOR$s;o%$dkMa8FO`0d~iLWQZhMYIfz*U)TFp8Js! zuJ(|8WyM;?#cgH_PUM0YUa%X$`oB7CKv3}OP`GS%yTB=^DRvJQup_vXdh@$aRF*c2 z4^+k5N2j}Y?&V<1{wRERoadlFnrDya{x;XBJNK)V-#2gF^>%T=a%9M{`)eUrxJKW% zF3D%dnWVQw-u0vr&p%(;US)2-?`++dYhMHT*e^}t??zY`&NvUtpK8UjoXvkEX)I?> z14C7vvCcj-SmY6KTzOZFG~JYVDeaF;gJV2Vy5(EE3`34NKA)!BTG;5n%_=0js5qCwZ?Vc8I-2>;dsMz9czI|^lr}e0o zv3Sh1Q~Bi`_}E6PsJ`Q6sjV-m=I26>_}wDhyWFrNS@}h%%PEDrcj5`z$P0S<8*G@< z$h6K-%ljrh9~i&Q64>?9`IK?#IqCT$MlUxC-?=O~_2I;rkw@ehCvvuO(4hOA%NF(O zCZ-$RJ4*#7Qzh@!7`Hr|cbaG|=GlL6kk{3X>C~5@eb0R&&&4u6duyE8*I$+D@Y%5o zeZc)xePg%*+;r!ek5ZKt-a-t1XR7qiKSqaa6?Hv6w$ZUZ+UPNpvF3H@gi`?)ad>;T zE$_+oU*0c{M__kfs{b%KuC@WEqQOLM(HBHz~+4yr+~;_CK1~0FB-5h6YU9iFfzy>^2=I|5g9od ze!^-xtsWZ9u_4s&j?jMJ$sFHqnDO+a6>H_4EBt2Wob@JbxBW$_@>sh!)eY>oEso}J zkLEo#m&I#gJTxmHXvk78jobH(QaO|)JKu*B;Pcjza&PC4us87O9Cbl;T} zbBlI95p}LJv*_!{sr2Tcs~e;BbAqD|(Tq)p9pn+pv-7b^sxM5RS?FXaG9##VYNINI z7UmRPIa8cN2D+tq0 z&T?|Qzt1%dwd=lF|E`&nwL82O$m?|J-ADb8J3qY4JQbfdT-I_nsElw33I2EEyhZGV--r|t6m zIJeQ*eU4hKBFDk79U_!hZUr@mezEkMuA`ETE(<&GAc&=#{aoRo++>%Ys?ld^rrin? zN0?rqeKii1hU|#;I6R`&%$v!sdeEHhxW7_C@M(^WX%1)Sd&-uXLt%WD729?4tYYJ` zA0L!uwD~OkrHBU4+)xmsMI5X*`rhH^u^yAqqIXc36r|)4Zh=b2-~|;y(u}Ug+p}h6) z${?Bf>f4Eq%GB^XYHBw*@;bU0JRRX`cj_!qes|ZDFfW=SZ$sM-4f!P8~!)7f=t?d4dXLL-`sb0jWN&NWy zIe?qy$HVwLZi9M1VzgbN9!ovx5k6I{<(4G7Ge|0_`P8R=QOs$TgKVdenpx(Wr9{;rM$&KEY6UF7bF;Q3V8IBHm z@x_|$^)~Gnc+}Xh(%u)%P|hm#sx)E0=iJ4l{pN}#ZOTa}o4OlQ_@d2)$L5my%++Cv z@3oS;9efOZHS_BXxBI|P?fP^hKae8v{m#b1B5#g!pHAPlP<*xT_Q+SK62l7dJb_(b zza%{PT7y8x)NF%ockWfaj646(`dXAx^j5c7>%sc_y)$G|wK8^Mc{D{cOvg~2r}`-0ykST^ zuXo!v)YCsmwDt#J9l{_FU{u}Zb%!&zrpej+$xks2flJSXMHhYm)@x1oO;;)cQ#du zgO|CF3QKEFs$SS7@!%mH?nhud0V$R0S>HE{Cdj z+AVZ#9{8|}d^W}RSxOCWf{G)RSbJh{YWCq8*deYUx5xB%2iVl9J{}E(C*SD0_iDOH zeDj-@kk6==fCGjB38~tJUh&-1caHN%dL^btC9&+9c5E=$YuJ7_^kl0}Tv6br%l4IZ z!4idpUWZ#jCiFqE7U8w;SbbxfT95ahbC22Mc-WT>6`Rp7@wV-|2ic>R7M6l+wa*Kg zUb}VX_xW}o&2^S|$<&hICgr2<%I(ho{n6et3`$Ig<`TP<)m$0$oZo7@NH*lKD|&>L z5)$f7MamD^DQpZIVTeC`E0~|(SAdUe!)JbnbFWQ>-Z2^-ANSqg$iu|>_4Ai*=bifm zu7+!06FSv+)BUUkwMwNN!pGmJ*n4`jIAyG47A{V*wb}n5`Qw~NPZp@AGRZY-&RjSV zt9UrL`+Y1gIqvG!O&IfiV_(t+leaH?xkS@5<>0t`ggq_m={rH#y=xSD$^3C|*qWMM zq5~IxEQl)Zp3;5z&2}Hpqb(kz%=Q%m4l~8hkbpW3%e=)G&s{KTrn~F zZ0=Cs{t@N}44mFi$S+;vdm@n{{WgSi&|Yun4Kr{jK}abvD3FWuo>kp|M&+BzGJ%TM zagEn~12ojP+D!;OG@;b=p`e+MO6Pf|xUbi+H))fq0om*s*;y4Whp_Ew_l*KCHT8Qv z^@!fA&+Gnd=)912V*%MIiODznO8LjV%H}@=q0Z+>hkh@j{vd1IyzhrzZ~t&}d})%2#%G&Q zY~R~l`i!kHcKLK}M>8nLHh(;_xZqUtF0!h_*~zl6=DWMacsPwn(-9YKb2^yYN1^S^ zCa#Dh2%gSx>VP@TM`ZFJc24LiTAP3{XVozIP zKgs4f@*SV~?_@dtJ9or@8o;};IU%3%zVq%jX`drh<Ml6S%7JgwZjTdCMR!E$X+d zHa5F2&GEvTS?8WC2v2QHJlR2$@<0eXLGXA&NdumzDUQxjZwQo#-_dpSU^K7g%hdb5 zQg1fKnX+a-$=HGp3wSY+a>L_GK)PP)6}}gbA~w|J?7Nw}$wXxL_h-%znw=cPhaF@p zCNt=Fo^h~{?DbMCKfWzQiw&ETM5a^xvDgCL=lZt)w%exq_krhseC5_Orrx??Zqs0z zc*#{bQmkL~0R8^XPe;ej$g!N~da5HI%}CeWZL7!=4&N|05Z(0r?BVZmH`O20X{WLc z=uU*RurgA9Dhw1}48naytBH4E7!X`9w)U8xIMhaW$a1?F_#We_Z#&OfpeVTk00>;CAM<8uD{1a7R?_9f8p96=F7leIqWa-kU)^1 z@sL2*<#qBs+2U{LHNLS8|RB9R=%0n(zpKo*dO z;w#lb8rl|n7W-k*FltIlN-9cfDk^F^YOpiVQd841Fw)aA(9<)rG7`6?1L@@VPcj-B z8YV_2ZdO)q4rXR%4(NlKgN?|>MmjJq9eyuLI$wMa#Dy<@gfSC?d12^kARO6ZHH?iG zb`6BBf;V%Jv5}FpkuBDdWdRZm8MJ`}aigT7Ag3mS(a_S-Gmyc^$thM-K?VgS6*ZB_ z3K^e*oRXZHh5~$$1p^{DWRn^GeBluWaUU@^$*sQqPP6y8e z$Io7^c-%WaC!uca=oNAzJ-@QC@9j4>pbwCeiVEmJNlQWD3-n>5poAo*+6^S84v07< zf2nwaqo(bZkS?dCD{fLjSWz#M>$H_f7V2g#4ZdCJwSLq_>m+~<_a;$g10FFn!A4~& z`__Z4;vGZN(aD!@|0=Sf?TXNUmH9u2yx0e01TIL%M$QJ)h7FG?oI@N?<}sSQye zARHtwYZM&Fdu>Iarbv>c*Df}2tND|JBPkkrV>3FKH{98TmkzXP2gF=CKvFE_tV;gM z^Yd)6Z6r^Dwr1!hNszxG(*%%#M6lCINmKLR8okLODwX^g@dPLZfL$&~#5Zp!bcNt))50MBYgD-pD zGQd;-L4P%}%6}}>n&Jb|y57(#9NIU@`a4X2_!QBWOK$iJOrW!`Fq1kDWM6+Z7yv=^ zxk)hBf8Ilt{;LlxcE9mZ$VUWwEOoxsvMgh>>~O#I6%tvH4YzFf8se~2W6yMxm)QvN zbKp^XhJbfjlUyGQZ1xOf-veeW0bKz)2PTy)AF3{eOj}|?q(SG`q22;c7oWXpP$)qJ z+b@lR#76Tt37aTr}&!dw1o+H{)43f zZle47ubKZiW3e^-;?wPjU{yils7xA~iN8nG9h|rl|F1w`b0?A%WMqLJY)s>ob zNn8ea*|^pD5zwWW3XC%V!2kIUjfF==5AI~i)L}jA0A>Yri2}goFlcaf6}8m^SC0nP zks3CBkfhXwa_vkaAg+|eks4wF&JIaXKtP^S&EJ;7=Li@98953s)~9rWfA03mwD!s< z9y==@I}4QYTSiZ3op{MSxtu_`%OG11N>M8o<|+~kaJS!I>;kgv4xOTnZft_u!!$4$Q48kqlMLy#Ev7oROPc5Lb<5jkA( zwcPC$i2!7$a!I0QLJb>bmKATRFFZ>QG42Kz9+L>%#lo`=czB^Ynm2rHbyh38*!r7h zO%RNvX8(k-1AxidL4;KT(l1fQnscbJ=`2-12Yi_3zo1z7&}Fgh_txr*__tR;{^NAV zYdj?tX!SSMASEH|{&UsZe`~BUQcxoT4=>_hZtU0;732*|Fav#wvRIRRClA89LGt8T z8u+%qy2ei|LFefBqdDMlXCc>wEaX5k4zN(cvc5lk1X5ap9;pA%eFW->koPb9$VCXq zB_DYN0l7-I^N@zl@roviLW3IFS|0yXEs_H*b}jbO!l1w3zRn3(m63yQ zHASL4{RmjRhdAu#+E-o`E~l)nAg8W~fDKra!QxJn!K9|hU>cjrVUl2NI0n`ryTCFR zI^w`O5jsK}v}{~lI)?w3a}Diae&2mAW_VhBihu&<9FUOiY-5Q)aRV$?wz%9a&`6Ilq} znt~*C?M*Gg+bs}A{fdoxKK|qK9RK(Zc)O5LeKfDZ4Eg2NnS2h^wFAHRr_4Soq zT>?)q*bgdM5@^j5cRf&3oMbA^Nm3LK2RI@-ziJd{GLtJ{|{zeA24+Nk!y_! z{#|`NA0*C`aNze^^)VjEkY8}J^>oFNFkVr@3PKYJ4H~Oqvq0iNUm@T;QOf|X6j>qa zBXQmU#kEK#L;%*NtpKz(oz$k4zmF#{#wuH^G;HdLCSd(AODwC5xWcmB$P$yvicLZN zIDe7@tcY$B=nMK2@IWhHESBH_28Y$c>0y1aI5Vs#9%G3?2cmw*%P0_|gZ2u<6QEuV zI93<^g=P*6;QotIejz(xe0;D$e=WTOhr#?}r(X)|1Oy`gT2$93@bAr91mgUC{!TUp zeH>hGR@c4aHh-*5X0 z{0Y+E=uz-sym z@PA=j?)iVOX_@7}R|CPS1 z#a}seeK3A#;!w6~j9h7dhY!{j>GN0dN#wsuPa^-;woV`cYl0+ztF(`v&T6$xFn)M2 z3vl!F!5H`JAfhSKFA&UUJn;l94jNx|e6fMQUd(Mh-TlD44f7{OALE7tYGO!E z_}}P2VH2#Tpu&nte=QH_MxL62Du2?6-RbYu6Uj@pEB>YQQsv4kWD783^2dN{%6^QE zKXG!h8n;zcFnc0+qL4m+Asb6*1V{6+#D$8!zaT43=6Jsj5m?=~iN7VF<8c;I3S5M3=a$XUBr|Fq6(W@6sj z?9iC^Th&n3+RR4!mIi1~f+-gLi!5M@xE~nJ8Vj^OfG0s{i1fi@mM4qmfR6J-1Bb+V z|I}Sm@K+u%`eF0}ar-f5U{Xe!=9zf{u zr#l9k=ISf!7%J%)=qSr8DXAFh8Gwa@9zsn`1srwt74-C$Yd1pTt(MkHnu6B2z!m8M z1v1+20_*tTFi7+P9e*%(LzAHub-?09T@MgJAGgM0fhUvJ&&1gx4vY2u{dNIS2B?rJ zSa+k51f)LEgQ1%U(g;;)c~$G5HxWqB&sX@dXiv8T|Ac#am8K4H6NQ6h{@H|_s`bxj z^u)C`T!XX#Ga?RD2cYHm(gNHH6F@p6t;c;li6l6jxQ13oE=?NI7#!&6q@^4vNh11_ z=G$N(&=f?GdRK{EmxKRvk(L`JN@Rfr*F)lj4*wq|kzTnU`TvLHfA{m>fFTuFb&C|BMal!WUcoJ2 z+2wn_BpAU+^S`<+T^jyZ+kme(@~`k+hie_Ke}%xmVqW*Ib-4Z&0{@D6-MiM|`d0}2 zE9Q0YT8HajA@Hx5*S%{Uu78EVzhYkZu64Nn9Re#+W8mSLreF|=2{X1Z*a7nhfx%e8 zx59d=7Z;&p*L%|OVK3>}YfPe>gAg@{-Ug!Apd-^)5`9#ebiQ4e1-90XHl!lvqk~CD z5Znes|A!rlgoAb^bvk$1@_zBMR$L*n>V3=4yZ^t3;=zid6P_9xORHqh*Ikn~CNTZ= zMlCF%b8s;Eed-Hte;vwPo}fw?OfkqS(AO2T#t)8Yl)OI@e5s2y90tpWsb&OF5HkSR z?j^1rBre}yxdL&1>JX>8va6b+oSFhgTFwnbJSk$75z?*-ZpzY%iWn7nMLAVD6jBb- zu3@Pe<|RK#jR0*cq1M!vtJ%6P>upjS?;8}^Z1Bt zH&V(65>o~Q9)U*!Xy0FMRR{A}93XgrAUi#I3mv$X{w_EHJWe6qnGZmN+ri)goE0$^ z4hoD5)?SL8L+zIV!FecR^cuKhk4J$=MR?gIep2il0Scr;`nZFe$^;KzPn0PJ?Fk+X z`1t6ML6zn&2?kX_@mctYEFd)! zN8o{xTRw9G&xzd$9-9<{(0<@ik{?vL8{8M^=jjHxz;i2iH@pW@UP&1ZRca6Kzh~Mw zQOY=@?6$}BP}ln9oBo&iBYYVwMz7&#RbQd&(_Nl97}?S_|_K&;CJJXe5%#jrRRPd_*8eWGUWkX@y5cz5vF4T8Z9A)}-wBNqf>EI}Bg9|4MU z2_$&PKx{5J{1SQ56AvCe6XVW;P4O5XHz6WGnz9g^?7#AAViB3;>TpXg=Cb0(ky$7Z z3L`3*c3ICzETM&FCak*B+wF2%5;ve98U?}`gVsaohki=vl z4PH<{1rFhWV5g=b;zv%l1SAC+4TUa@lEvfRsYE*N#2nSx6H`>8a>6aIK2=d2YwW*! zQzO)GqK9i_Cf0QGSKb)^>IdodurCLdJmpgf)DT#*HlUnfmPx1r~%yZ+ld3A5>9d5>8$ z1%;&>hi^;4ZaI+q0Z;S-JIj(chWS6^JzUAts=R%>T~F-e-sAQ1fvcNF1pQ0v@*ub& z3(+&OtyuRT_#Z0~Kj42fOU!@sJC$X>`~Oxq`MVDuzz9WEdFu%0D8n44n^`WqA2N5% zXA`9(k5l76K6D!!gFG5{r$+U68HVF*KV0a!_Q z(04Q4W=GAoFPZLfTZ2=Xw#$%BM~bBG=f~`6n>+jjjU}{!hTKiEdfh)wp4Io!$Spln`NDa2^x^cyHw3|P z(I1Z5BDXxkV6)y57t>Jt+pYwi$C_%n1T;4B4=Q+N!(dXd1@LOApWk$XExo4;%2?~2 zVDl0y?*yX(dQmUEAB-BL*_O)sfp=$ZSjva$ z%+5dt=zVAekbi$EAF68>$OFj`4f21~ljH}d%kNK%2l=btpSI}{sh;y7pXU*YACh%5 ec;6ZiI9><&SC)7lfwWEw4J=3z=nK-&_WuC)1yUdY literal 0 HcmV?d00001 diff --git a/tests/include/test_utils.hpp b/tests/include/test_utils.hpp index 91292c10..16089811 100644 --- a/tests/include/test_utils.hpp +++ b/tests/include/test_utils.hpp @@ -20,6 +20,7 @@ #include #include #include +#include #include "c2pa.hpp" @@ -27,6 +28,10 @@ namespace c2pa_test { namespace fs = std::filesystem; +/// Formats that count as absent: empty, or only ASCII whitespace. +inline const std::vector kBlankFormats = { + "", " ", " ", "\t", "\n", "\t\n ", "\r\n", "\v\f"}; + /// @brief Read a text file into a string /// @param path Path to the file to read /// @return Contents of the file as a string diff --git a/tests/reader.test.cpp b/tests/reader.test.cpp index fc9ced9b..a9a79df8 100644 --- a/tests/reader.test.cpp +++ b/tests/reader.test.cpp @@ -108,7 +108,10 @@ INSTANTIATE_TEST_SUITE_P(ReaderStreamWithManifestTests, StreamWithManifestTests, std::make_tuple("C.jpg", "jpg", "C.jpg"), std::make_tuple("C.jpg", "JPG", "C.jpg"), std::make_tuple("C.jpg", "image/jpeg", "C.jpg"), - std::make_tuple("C.jpg", "Image/JPEG", "C.jpg"))); + std::make_tuple("C.jpg", "Image/JPEG", "C.jpg"), + std::make_tuple("C2.DNG", "dng", "C.jpg"), + std::make_tuple("C2.DNG", "image/dng", "C.jpg"), + std::make_tuple("C2.DNG", "image/x-adobe-dng", "C.jpg"))); TEST_P(StreamWithManifestTests, StreamWithManifest) { auto filename = std::get<0>(GetParam()); @@ -1303,3 +1306,16 @@ TEST_F(ReaderTest, WithFragmentEmptyFormatThrows) { // The reader handle is untouched by the rejected calls. EXPECT_FALSE(reader.json().empty()); } + +TEST_F(ReaderTest, DngReadsWithExplicitAndDetectedFormat) { + auto by_path = c2pa::Reader(c2pa_test::get_fixture_path("C2.DNG")); + + std::string bytes = fixture_bytes("C2.DNG"); + std::istringstream stream(bytes, std::ios::binary); + auto detected = c2pa::Reader("", stream); + + auto a = json::parse(by_path.json()); + auto b = json::parse(detected.json()); + EXPECT_EQ(a["active_manifest"], b["active_manifest"]); + EXPECT_EQ(a["manifests"].size(), b["manifests"].size()); +} From eaaab9ee66fc0070415bfa203fd8269279c444b6 Mon Sep 17 00:00:00 2001 From: tmathern <60901087+tmathern@users.noreply.github.com> Date: Sun, 26 Jul 2026 21:08:51 -0700 Subject: [PATCH 05/27] fix: Refactor --- src/c2pa_builder.cpp | 3 ++- src/c2pa_reader.cpp | 6 ++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/c2pa_builder.cpp b/src/c2pa_builder.cpp index 7ea9396c..e39d2cb3 100644 --- a/src/c2pa_builder.cpp +++ b/src/c2pa_builder.cpp @@ -198,7 +198,8 @@ namespace c2pa void Builder::add_ingredient(const std::string &ingredient_json, const std::filesystem::path &source_path) { auto stream = detail::open_file_binary(source_path); - add_ingredient(ingredient_json, detail::extract_file_extension(source_path), *stream); + auto format = detail::extract_file_extension(source_path); + add_ingredient(ingredient_json, format, *stream); } void Builder::add_action(const std::string &action_json) diff --git a/src/c2pa_reader.cpp b/src/c2pa_reader.cpp index 7dcbf855..3862a9b8 100644 --- a/src/c2pa_reader.cpp +++ b/src/c2pa_reader.cpp @@ -84,8 +84,7 @@ namespace c2pa // The extension describes the filename, so it is normalized and left unchecked. // Content type detection overrides it anyway if wrong. - const std::string extension = - detail::normalize_derived_extension(detail::extract_file_extension(source_path)); + std::string extension = detail::normalize_derived_extension(detail::extract_file_extension(source_path)); // CppIStream stores reference to owned_stream, which lives as long as Reader cpp_stream = std::make_unique(*owned_stream); @@ -239,8 +238,7 @@ namespace c2pa throw std::system_error(errno, std::system_category(), "Failed to open file: " + source_path.string()); } - const std::string extension = - detail::normalize_derived_extension(detail::extract_file_extension(source_path)); + std::string extension = detail::normalize_derived_extension(detail::extract_file_extension(source_path)); // CppIStream stores reference to owned_stream, which lives as long as Reader cpp_stream = std::make_unique(*owned_stream); From b447d5237a513feabff406095493f0e111b06bc8 Mon Sep 17 00:00:00 2001 From: tmathern <60901087+tmathern@users.noreply.github.com> Date: Mon, 27 Jul 2026 19:08:34 -0700 Subject: [PATCH 06/27] fix: Refactor --- docs/usage.md | 12 +++++- include/c2pa.hpp | 38 +++++++++++------ src/c2pa_builder.cpp | 4 +- src/c2pa_internal.hpp | 93 +++++++++++++----------------------------- src/c2pa_reader.cpp | 4 +- tests/builder.test.cpp | 12 ++++++ tests/reader.test.cpp | 58 ++++++++++++-------------- 7 files changed, 110 insertions(+), 111 deletions(-) diff --git a/docs/usage.md b/docs/usage.md index 61098401..f01f7720 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -21,7 +21,7 @@ The parameters are: - `` - A MIME type or file extension for the stream, for example `image/jpeg` or `jpg`; see the [supported file formats](https://github.com/contentauth/c2pa-rs/blob/main/docs/supported-formats.md). Pass an empty string to take the format from the stream's leading bytes instead. - `` - An open readable iostream. -You pass an empty string or use the overload that takes no format to ask the native core library to try to guess the format: +Example of passing an empty string (or use a format-less overload) that takes no format, to ask the native core library to guess the format: ```cpp c2pa::Context context; @@ -29,7 +29,15 @@ std::ifstream ifs("asset.bin", std::ios::binary); auto reader = c2pa::Reader(std::make_shared(), ifs); ``` -The stream must support seeking, since it is rewound after inspection. A file path with no extension is read the same way. +The used stream must support seeking, since it is rewound after inspection. A file path with no extension is read the same way. + +Prefer passing the format when you know it. When you do pass one, it is reconciled against the container detected in the leading bytes: + +- Both identify the same container: your format is used, keeping the more specific spelling (`dng` stays `dng` rather than widening to `image/tiff`). +- They identify different containers: the detected container wins. +- Detection finds no container: the format is used as given. + +If detection detects no container and no format was supplied, the read fails with an unsupported-type error. Note that the format is a hint, not a constraint: the library does not reject a format merely because it is absent from `Reader::supported_mime_types()`, and an unrecognized format on recognizable bytes still reads. `Builder` always requires an explicit format, because the container type decides how the asset is written and hashed. Signing with a blank format, or to a destination path with no extension, throws. diff --git a/include/c2pa.hpp b/include/c2pa.hpp index ed745732..ec0bcea6 100644 --- a/include/c2pa.hpp +++ b/include/c2pa.hpp @@ -795,18 +795,26 @@ namespace c2pa /// @details The Reader retains a shared reference to the context, keeping it /// alive for the lifetime of the Reader. /// @param context Shared context provider. - /// @param format The mime format of the stream. - /// @param stream The input stream to read from. - /// @throws C2paException if context is null or context->is_valid() returns false. + /// @param format The mime type or file extension of the stream. Treated as a hint and + /// reconciled against the container detected in the leading bytes: the same + /// container keeps @p format (so "dng" is not widened to "image/tiff"), a + /// different one wins over @p format, and if nothing is detected @p format is + /// used as given. Pass an empty string to rely on detection alone. A format + /// absent from supported_mime_types() is not rejected here. + /// @param stream The input stream to read from. Must support seeking; it is rewound + /// before inspection. + /// @throws C2paException if context is null or context->is_valid() returns false, or if + /// no container is detected and @p format does not name a supported one. Reader(std::shared_ptr context, const std::string &format, std::istream &stream); - /// @brief Create a Reader from a shared context and stream, trying to guess the format from content. - /// @details Equivalent to passing an empty format. - /// The stream is rewound after inspection, so it must support seeking. + /// @brief Create a Reader from a shared context and stream, guessing the format from content. + /// @details Equivalent to passing an empty format. Detection is best effort; prefer the + /// overload taking a format when the format is known. + /// The stream is rewound before inspection, so it must support seeking. /// @param context Shared context provider. /// @param stream The input stream to read from. Must support seeking. /// @throws C2paException if context is null, context->is_valid() returns false, or the - /// container type cannot be determined. + /// container type cannot be determined from the bytes. Reader(std::shared_ptr context, std::istream &stream); /// @brief Create a Reader from a shared context and file path. @@ -815,8 +823,9 @@ namespace c2pa /// @param context Shared context provider. /// @param source_path The path to the file to read. /// @throws C2paException if context is null or context->is_valid() returns false. - /// @note With no extension, the container may be guessed by the native core library (best-effort). - /// An unsupported extension is accepted, since content overrides it. + /// @note The extension is used as a hint only. With no extension, the container is + /// guessed from the leading bytes (best-effort). A wrong or unrecognized + /// extension is accepted, since a detected container overrides it. Reader(std::shared_ptr context, const std::filesystem::path &source_path); /// @brief Create a Reader from a shared context, image stream, and external JUMBF manifest. @@ -888,17 +897,22 @@ namespace c2pa /// @brief Try to create a Reader from a shared context and stream when the asset may lack C2PA data. /// @details The Reader retains a shared reference to the context if C2PA data is found. + /// @param context Shared context provider. + /// @param format The mime type or file extension of the stream, used as a hint and + /// reconciled against the detected container. See the corresponding constructor. + /// @param stream The input stream to read from. Must support seeking. /// @return A Reader if JUMBF (c2pa/manifest) data is present; std::nullopt if none. /// @throws C2paException for errors other than a missing manifest. static std::optional from_asset(std::shared_ptr context, const std::string &format, std::istream &stream); - /// @brief Try to create a Reader from a shared context and stream, trying to guess the format from content. + /// @brief Try to create a Reader from a shared context and stream, guessing the format from content. /// @details The Reader retains a shared reference to the context if C2PA data is found. + /// Detection is best effort; prefer the overload taking a format when it is known. /// @param context Shared context provider. /// @param stream The input stream to read from. Must support seeking. /// @return A Reader if JUMBF (c2pa/manifest) data is present; std::nullopt if none. - /// @throws C2paException for errors other than a missing manifest. - /// Content that cannot be identified also raises an error. + /// @throws C2paException for errors other than a missing manifest. Content whose + /// container cannot be identified raises an error rather than returning nullopt. static std::optional from_asset(std::shared_ptr context, std::istream &stream); // Non-copyable diff --git a/src/c2pa_builder.cpp b/src/c2pa_builder.cpp index e39d2cb3..8c02213e 100644 --- a/src/c2pa_builder.cpp +++ b/src/c2pa_builder.cpp @@ -494,6 +494,8 @@ namespace c2pa } std::vector Builder::supported_mime_types() { - return detail::supported_builder_formats(); + uintptr_t count = 0; + auto ptr = c2pa_builder_supported_mime_types(&count); + return detail::c_mime_types_to_vector(ptr, count); } } // namespace c2pa diff --git a/src/c2pa_internal.hpp b/src/c2pa_internal.hpp index 123a6bf8..35dc18fc 100644 --- a/src/c2pa_internal.hpp +++ b/src/c2pa_internal.hpp @@ -24,6 +24,7 @@ #include #include #include +#include #include #include @@ -250,28 +251,35 @@ inline std::string extract_file_extension(const std::filesystem::path &path) noe /// @details The C API rejects a null format, so absent must be spelled empty. inline constexpr const char *kDetectFormatFromContent = ""; -/// @brief True when a format is absent, i.e. empty or only ASCII whitespace. +/// @brief ASCII whitespace ignored around a format. /// @details Formats are MIME types or extensions, so non-ASCII spaces are /// deliberately excluded. +inline constexpr const char *kFormatWhitespace = " \t\n\r\f\v"; + +/// @brief The format with surrounding whitespace removed, empty when blank. +[[nodiscard]] inline std::string_view trim_format(const std::string &format) noexcept { + const auto first = format.find_first_not_of(kFormatWhitespace); + if (first == std::string::npos) { + return {}; // Empty or all whitespace. + } + const auto last = format.find_last_not_of(kFormatWhitespace); + return std::string_view(format).substr(first, last - first + 1); +} + +/// @brief True when a format is absent, i.e. empty or only ASCII whitespace. inline bool is_blank_format(const std::string &format) noexcept { - return format.find_first_not_of(" \t\n\r\f\v") == std::string::npos; + return trim_format(format).empty(); } -/// @brief Validate a caller-supplied format and normalize it. +/// @brief Normalize a caller-supplied format for the C FFI. /// @param format The format supplied by, or derived for, the caller. -/// @param supported Formats accepted here. When empty the check is skipped. /// @param allow_detection Whether a blank format may request content detection. -/// @return Empty when @p format is blank, otherwise @p format lowercased. -/// @throws C2paException if @p format is blank and @p allow_detection is false, -/// or if a non-blank @p format is not in a non-empty @p supported. -/// @details The returned value reaches the C API, so it is the canonical -/// lowercase form. Some library paths match a MIME type case -/// sensitively and silently skip work when it does not match. -/// Error messages keep the caller's spelling. -[[nodiscard]] inline std::string validate_format(const std::string &format, - const std::vector &supported, - bool allow_detection) { - if (is_blank_format(format)) { +/// @return Empty when @p format is blank, otherwise @p format trimmed and lowercased. +/// @throws C2paException if @p format is blank and @p allow_detection is false. +[[nodiscard]] inline std::string normalize_format(const std::string &format, + bool allow_detection) { + const std::string_view trimmed = trim_format(format); + if (trimmed.empty()) { if (!allow_detection) { throw C2paException("An explicit format is required."); } @@ -279,71 +287,28 @@ inline bool is_blank_format(const std::string &format) noexcept { return std::string(); } - std::string lowered = format; - std::transform(lowered.begin(), lowered.end(), lowered.begin(), + std::string normalized(trimmed); + std::transform(normalized.begin(), normalized.end(), normalized.begin(), [](unsigned char c) { return static_cast(std::tolower(c)); }); - - if (supported.empty()) { - // List unavailable; defer to the library's own validation. - return lowered; - } - - if (std::find(supported.begin(), supported.end(), lowered) == supported.end()) { - throw C2paException("Unsupported format \"" + format + "\"."); - } - return lowered; -} - -/// @brief Formats accepted for reading, queried once from the C2PA library. -/// @return The supported formats, or an empty vector if the library reported none. -/// @details Fixed for the lifetime of the loaded library, so it is cached. Backs -/// a message-quality check on the Reader rather than an authority on -/// what the library accepts. An empty result skips that check. -inline const std::vector &supported_reader_formats() { - static const std::vector formats = [] { - try { - uintptr_t count = 0; - const char *const *ptr = c2pa_reader_supported_mime_types(&count); - return c_mime_types_to_vector(ptr, count); - } catch (...) { - return std::vector{}; - } - }(); - return formats; -} - -/// @brief Formats accepted for signing, queried once from the C2PA library. -/// @return The supported formats, or an empty vector if the library reported none. -/// @details Cached to serve Builder::supported_mime_types(). -inline const std::vector &supported_builder_formats() { - static const std::vector formats = [] { - try { - uintptr_t count = 0; - const char *const *ptr = c2pa_builder_supported_mime_types(&count); - return c_mime_types_to_vector(ptr, count); - } catch (...) { - return std::vector{}; - } - }(); - return formats; + return normalized; } /// @brief Resolve a format for reading, letting a blank one request detection. [[nodiscard]] inline std::string resolve_reader_format(const std::string &format) { - return validate_format(format, supported_reader_formats(), true); + return normalize_format(format, true); } /// @brief Resolve a format that must be stated. These paths never infer the /// container type from content, so a blank format is rejected. [[nodiscard]] inline std::string require_explicit_format(const std::string &format) { - return validate_format(format, {}, false); + return normalize_format(format, false); } /// @brief Normalize an extension derived from a filename (path). /// @details The extension describes the filename rather than the data. /// Content detection overrides a wrong one. [[nodiscard]] inline std::string normalize_derived_extension(const std::string &extension) { - return validate_format(extension, {}, true); + return normalize_format(extension, true); } /// @brief Convert C string result to C++ string with cleanup diff --git a/src/c2pa_reader.cpp b/src/c2pa_reader.cpp index 3862a9b8..7e9ef2f3 100644 --- a/src/c2pa_reader.cpp +++ b/src/c2pa_reader.cpp @@ -310,7 +310,9 @@ namespace c2pa } std::vector Reader::supported_mime_types() { - return detail::supported_reader_formats(); + uintptr_t count = 0; + auto ptr = c2pa_reader_supported_mime_types(&count); + return detail::c_mime_types_to_vector(ptr, count); } std::optional Reader::from_asset(IContextProvider& context, const std::filesystem::path& source_path) { diff --git a/tests/builder.test.cpp b/tests/builder.test.cpp index 0c46b3a8..4bc3ca62 100644 --- a/tests/builder.test.cpp +++ b/tests/builder.test.cpp @@ -7585,6 +7585,18 @@ TEST_F(BuilderTest, SignDoesNotTruncateDestinationWhenFormatIsRejected) { EXPECT_EQ(after.str(), original); } +TEST_F(BuilderTest, SignTrimsPaddedFormat) { + // Trim stray whitespaces in format. + auto signer = c2pa_test::create_test_signer(); + auto builder = make_builder(); + + std::ifstream source(c2pa_test::get_fixture_path("A.jpg"), std::ios::binary); + ASSERT_TRUE(source.is_open()); + std::stringstream dest(std::ios::in | std::ios::out | std::ios::binary); + + EXPECT_NO_THROW({ builder.sign(" \t image/jpeg \n ", source, dest, signer); }); +} + TEST_F(BuilderTest, SignWithUnsupportedFormatThrows) { auto signer = c2pa_test::create_test_signer(); auto builder = make_builder(); diff --git a/tests/reader.test.cpp b/tests/reader.test.cpp index a9a79df8..5bc1c8f0 100644 --- a/tests/reader.test.cpp +++ b/tests/reader.test.cpp @@ -1044,52 +1044,48 @@ TEST_F(ReaderTest, BlankFormatVariantsAreIndistinguishableOnFailure) { } } -TEST_F(ReaderTest, PaddedFormatIsRejectedNotTrimmed) { - // Padding is preserved, so a padded format stays invalid. +TEST_F(ReaderTest, PaddedFormatIsTrimmed) { + // Padding is never meaningful in a format, so it is trimmed before the + // format reaches the library, which does no trimming of its own. std::string bytes = fixture_bytes("C.jpg"); std::istringstream stream(bytes, std::ios::binary); + std::istringstream clean(bytes, std::ios::binary); - try { - c2pa::Reader reader(" image/jpeg ", stream); - FAIL() << "Expected a padded format to be rejected"; - } catch (const c2pa::C2paException& e) { - EXPECT_NE(std::string(e.what()).find("image/jpeg"), std::string::npos); - } + c2pa::Reader padded(std::make_shared(), " \t image/jpeg \n ", stream); + c2pa::Reader exact(std::make_shared(), "image/jpeg", clean); + EXPECT_EQ(padded.json(), exact.json()); } -TEST_F(ReaderTest, UnsupportedFormatOnStreamThrows) { - // The bytes are a valid signed JPEG, so only the format check can throw. +TEST_F(ReaderTest, PaddedUnknownFormatStillDefersToContent) { + // Trimming does not make an unknown format known; content detection is + // still what resolves the container. std::string bytes = fixture_bytes("C.jpg"); std::istringstream stream(bytes, std::ios::binary); - EXPECT_THROW({ c2pa::Reader reader("application/zip", stream); }, c2pa::C2paException); + std::istringstream clean(bytes, std::ios::binary); + + c2pa::Reader padded(std::make_shared(), " application/zip ", stream); + c2pa::Reader exact(std::make_shared(), "image/jpeg", clean); + EXPECT_EQ(padded.json(), exact.json()); } -TEST_F(ReaderTest, SuppliedFormatEnforcedButDerivedIsNot) { - // A supplied format is the caller's claim about the data, so it is checked. - // A derived extension only describes the filename, so it is left alone. +TEST_F(ReaderTest, UnsupportedFormatOnStreamDefersToContent) { + // The library reconciles the hint against the container it detects. std::string bytes = fixture_bytes("C.jpg"); std::istringstream stream(bytes, std::ios::binary); - EXPECT_THROW({ c2pa::Reader reader("zzz", stream); }, c2pa::C2paException); + std::istringstream clean(bytes, std::ios::binary); - fs::path odd = copy_fixture_to("C.jpg", "detect-asymmetry.zzz"); - EXPECT_NO_THROW({ c2pa::Reader reader(odd); }); + c2pa::Reader mismatched(std::make_shared(), "application/zip", stream); + c2pa::Reader exact(std::make_shared(), "image/jpeg", clean); + EXPECT_EQ(mismatched.json(), exact.json()); } -TEST_F(ReaderTest, UnsupportedFormatMessageNamesFormatNotPath) { - // Paths may hold sensitive data, so they never appear in messages. - fs::path asset = copy_fixture_to("C.jpg", "detect-message-probe.jpg"); - std::ifstream file(asset, std::ios::binary); - ASSERT_TRUE(file.is_open()); +TEST_F(ReaderTest, SuppliedAndDerivedFormatsBothDeferToContent) { + std::string bytes = fixture_bytes("C.jpg"); + std::istringstream stream(bytes, std::ios::binary); + EXPECT_NO_THROW({ c2pa::Reader reader(std::make_shared(), "zzz", stream); }); - try { - c2pa::Reader reader("application/zip", file); - FAIL() << "Expected an unsupported format to be rejected"; - } catch (const c2pa::C2paException& e) { - const std::string msg = e.what(); - EXPECT_NE(msg.find("application/zip"), std::string::npos); - EXPECT_EQ(msg.find(asset.string()), std::string::npos) << msg; - EXPECT_EQ(msg.find("detect-message-probe"), std::string::npos) << msg; - } + fs::path odd = copy_fixture_to("C.jpg", "detect-asymmetry.zzz"); + EXPECT_NO_THROW({ c2pa::Reader reader(odd); }); } TEST_F(ReaderTest, NoFormatOverloadDetectsFromContent) { From 0f15807ef6e8c7feba3ebf218f2d218aa73cd54c Mon Sep 17 00:00:00 2001 From: tmathern <60901087+tmathern@users.noreply.github.com> Date: Mon, 27 Jul 2026 20:20:41 -0700 Subject: [PATCH 07/27] fix: Add tests --- src/c2pa_context.cpp | 4 +--- tests/context.test.cpp | 49 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 3 deletions(-) diff --git a/src/c2pa_context.cpp b/src/c2pa_context.cpp index 53374953..c763520a 100644 --- a/src/c2pa_context.cpp +++ b/src/c2pa_context.cpp @@ -183,8 +183,7 @@ namespace c2pa if (!raw) { throw C2paException("Signer is not valid"); } - // On error the signer may not have been consumed by the C API, - // surface an error + if (c2pa_context_builder_set_signer(context_builder, raw) != 0) { throw C2paException(); } @@ -204,7 +203,6 @@ namespace c2pa throw C2paException("Failed to create HTTP resolver"); } if (c2pa_context_builder_set_http_resolver(context_builder, resolver) != 0) { - c2pa_free(resolver); throw C2paException(); } return *this; diff --git a/tests/context.test.cpp b/tests/context.test.cpp index 6f0d2261..71f96b8e 100644 --- a/tests/context.test.cpp +++ b/tests/context.test.cpp @@ -482,6 +482,55 @@ TEST_F(ContextTest, ReaderWorksAfterContextOutOfScope) { EXPECT_NO_THROW(reader->json()); } +// A resolver callback that does nothing besides existing. +static int noop_http_resolver(void* /*context*/, + const C2paHttpRequest* /*request*/, + C2paHttpResponse* /*response*/) { + return 0; +} + +TEST(Context, WithHttpResolverSucceeds) { + auto context = c2pa::Context::ContextBuilder() + .with_http_resolver(nullptr, noop_http_resolver) + .create_context(); + EXPECT_TRUE(context.is_valid()); +} + +TEST(Context, WithHttpResolverRejectsNullCallback) { + auto builder = c2pa::Context::ContextBuilder(); + EXPECT_THROW(builder.with_http_resolver(nullptr, nullptr), c2pa::C2paException); +} + +TEST(Context, WithHttpResolverOnMovedFromBuilderThrows) { + auto builder = c2pa::Context::ContextBuilder(); + auto moved = std::move(builder); + EXPECT_THROW(builder.with_http_resolver(nullptr, noop_http_resolver), + c2pa::C2paException); +} + +TEST(Context, WithHttpResolverRepeatedCallsSucceed) { + // Each call allocates a fresh resolver and hands it to the C API, + // which consumes it. + auto builder = c2pa::Context::ContextBuilder(); + for (int i = 0; i < 3; ++i) { + EXPECT_NO_THROW(builder.with_http_resolver(nullptr, noop_http_resolver)); + } + auto context = builder.create_context(); + EXPECT_TRUE(context.is_valid()); +} + +TEST(Context, WithSignerConsumesSignerOnSuccess) { + // The C API consumes the signer handle. + auto signer = c2pa_test::create_test_signer(); + { + auto context = c2pa::Context::ContextBuilder() + .with_signer(std::move(signer)) + .create_context(); + EXPECT_TRUE(context.is_valid()); + } + // signer destructs here, after the context that owns the native handle. +} + // ContextBuilder::with_signer can be chained with with_settings TEST(Context, ContextBuilderWithSettingsAndSigner) { c2pa::Settings settings; From 3e966627bb58d8372dc685ac96cc9d662cd76b48 Mon Sep 17 00:00:00 2001 From: Tania Mathern Date: Tue, 28 Jul 2026 10:25:37 -0700 Subject: [PATCH 08/27] fix: Appease Linux and Windows builds --- tests/builder.test.cpp | 2 +- tests/reader.test.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/builder.test.cpp b/tests/builder.test.cpp index 4bc3ca62..8db2bb1f 100644 --- a/tests/builder.test.cpp +++ b/tests/builder.test.cpp @@ -7763,7 +7763,7 @@ TEST_F(BuilderTest, ArchiveWithEmptyFormatThrows) { TEST_F(BuilderTest, SignProducesEquivalentManifestForEverySpelling) { auto signer = c2pa_test::create_test_signer(); - for (const std::string& format : + for (const char* format : {"image/jpeg", "IMAGE/JPEG", "Image/Jpeg", "jpg", "JPG"}) { auto builder = make_builder(); diff --git a/tests/reader.test.cpp b/tests/reader.test.cpp index 5bc1c8f0..3c55445b 100644 --- a/tests/reader.test.cpp +++ b/tests/reader.test.cpp @@ -1039,7 +1039,7 @@ TEST_F(ReaderTest, BlankFormatVariantsAreIndistinguishableOnFailure) { const std::string from_empty = message_for(""); EXPECT_NE(from_empty, ""); - for (const std::string& blank : {" ", " ", "\t", "\n", "\t\n ", "\r\n", "\v\f"}) { + for (const char* blank : {" ", " ", "\t", "\n", "\t\n ", "\r\n", "\v\f"}) { EXPECT_EQ(message_for(blank), from_empty) << "blank variant: " << blank; } } From e28b945ae04853233dbde1165457d7a59c04a3fc Mon Sep 17 00:00:00 2001 From: tmathern <60901087+tmathern@users.noreply.github.com> Date: Tue, 28 Jul 2026 10:34:20 -0700 Subject: [PATCH 09/27] Update usage.md --- docs/usage.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/usage.md b/docs/usage.md index f01f7720..7f88a504 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -21,7 +21,7 @@ The parameters are: - `` - A MIME type or file extension for the stream, for example `image/jpeg` or `jpg`; see the [supported file formats](https://github.com/contentauth/c2pa-rs/blob/main/docs/supported-formats.md). Pass an empty string to take the format from the stream's leading bytes instead. - `` - An open readable iostream. -Example of passing an empty string (or use a format-less overload) that takes no format, to ask the native core library to guess the format: +Passing an empty string (or use a format-less overload of a `Reader`) asks the native core library to guess the format (the read will still fail if the format can't be guessed or is unsupported): ```cpp c2pa::Context context; From 0349217aa04c1c852116a4dbb378482f020a0e9d Mon Sep 17 00:00:00 2001 From: Tania Mathern Date: Wed, 29 Jul 2026 09:49:01 -0700 Subject: [PATCH 10/27] fix: Minor clean up --- src/c2pa_internal.hpp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/c2pa_internal.hpp b/src/c2pa_internal.hpp index 35dc18fc..54160129 100644 --- a/src/c2pa_internal.hpp +++ b/src/c2pa_internal.hpp @@ -266,11 +266,6 @@ inline constexpr const char *kFormatWhitespace = " \t\n\r\f\v"; return std::string_view(format).substr(first, last - first + 1); } -/// @brief True when a format is absent, i.e. empty or only ASCII whitespace. -inline bool is_blank_format(const std::string &format) noexcept { - return trim_format(format).empty(); -} - /// @brief Normalize a caller-supplied format for the C FFI. /// @param format The format supplied by, or derived for, the caller. /// @param allow_detection Whether a blank format may request content detection. From b8af244f5cb9b81f4f2eaa309c731854d7f4b37e Mon Sep 17 00:00:00 2001 From: Tania Mathern Date: Wed, 29 Jul 2026 10:41:48 -0700 Subject: [PATCH 11/27] fix: no change in builder --- src/c2pa_builder.cpp | 54 +++++++++++--------------------------------- 1 file changed, 13 insertions(+), 41 deletions(-) diff --git a/src/c2pa_builder.cpp b/src/c2pa_builder.cpp index 8c02213e..38ac1cb0 100644 --- a/src/c2pa_builder.cpp +++ b/src/c2pa_builder.cpp @@ -222,8 +222,6 @@ namespace c2pa std::vector Builder::sign(const std::string &format, std::istream &source, std::ostream &dest, Signer &signer) { - const std::string resolved = detail::require_explicit_format(format); - // Caller's source/dest streams must outlive this call // Stream wrappers are stack locals that wrap the caller's streams CppIStream c_source(source); @@ -231,14 +229,12 @@ namespace c2pa const unsigned char *c2pa_manifest_bytes = nullptr; // c2pa_builder_sign() uses streams synchronously and completes before returning - auto result = c2pa_builder_sign(builder, resolved.c_str(), c_source.c_stream, c_dest.c_stream, signer.c2pa_signer(), &c2pa_manifest_bytes); + auto result = c2pa_builder_sign(builder, format.c_str(), c_source.c_stream, c_dest.c_stream, signer.c2pa_signer(), &c2pa_manifest_bytes); return detail::to_byte_vector(c2pa_manifest_bytes, result); } std::vector Builder::sign(const std::string &format, std::istream &source, std::iostream &dest, Signer &signer) { - const std::string resolved = detail::require_explicit_format(format); - // Caller's source/dest streams must outlive this call // Stream wrappers are stack locals that wrap the caller's streams CppIStream c_source(source); @@ -246,7 +242,7 @@ namespace c2pa const unsigned char *c2pa_manifest_bytes = nullptr; // c2pa_builder_sign() uses streams synchronously and completes before returning - auto result = c2pa_builder_sign(builder, resolved.c_str(), c_source.c_stream, c_dest.c_stream, signer.c2pa_signer(), &c2pa_manifest_bytes); + auto result = c2pa_builder_sign(builder, format.c_str(), c_source.c_stream, c_dest.c_stream, signer.c2pa_signer(), &c2pa_manifest_bytes); return detail::to_byte_vector(c2pa_manifest_bytes, result); } @@ -258,10 +254,6 @@ namespace c2pa /// @throws C2pa::C2paException for errors encountered by the C2PA library. std::vector Builder::sign(const std::filesystem::path &source_path, const std::filesystem::path &dest_path, Signer &signer) { - // Validate before opening the destination, which opens with trunc. - const std::string format = - detail::require_explicit_format(detail::extract_file_extension(dest_path)); - auto source = detail::open_file_binary(source_path); // Ensure the destination directory exists auto dest_dir = dest_path.parent_path(); @@ -278,28 +270,23 @@ namespace c2pa { throw std::runtime_error("Failed to open destination file: " + dest_path.string()); } + auto format = detail::extract_file_extension(dest_path); auto result = sign(format, *source, dest, signer); return result; } std::vector Builder::sign(const std::string &format, std::istream &source, std::iostream &dest) { - const std::string resolved = detail::require_explicit_format(format); - CppIStream c_source(source); CppIOStream c_dest(dest); const unsigned char *c2pa_manifest_bytes = nullptr; - auto result = c2pa_builder_sign_context(builder, resolved.c_str(), c_source.c_stream, c_dest.c_stream, &c2pa_manifest_bytes); + auto result = c2pa_builder_sign_context(builder, format.c_str(), c_source.c_stream, c_dest.c_stream, &c2pa_manifest_bytes); return detail::to_byte_vector(c2pa_manifest_bytes, result); } std::vector Builder::sign(const std::filesystem::path &source_path, const std::filesystem::path &dest_path) { - // Validate before opening the destination, which opens with trunc. - const std::string format = - detail::require_explicit_format(detail::extract_file_extension(dest_path)); - auto source = detail::open_file_binary(source_path); auto dest_dir = dest_path.parent_path(); if (!std::filesystem::exists(dest_dir)) @@ -315,6 +302,7 @@ namespace c2pa { throw std::runtime_error("Failed to open destination file: " + dest_path.string()); } + auto format = detail::extract_file_extension(dest_path); auto result = sign(format, *source, dest); return result; } @@ -398,36 +386,30 @@ namespace c2pa std::vector Builder::data_hashed_placeholder(uintptr_t reserve_size, const std::string &format) { - const std::string resolved = detail::require_explicit_format(format); - const unsigned char *c2pa_manifest_bytes = nullptr; - auto result = c2pa_builder_data_hashed_placeholder(builder, reserve_size, resolved.c_str(), &c2pa_manifest_bytes); + auto result = c2pa_builder_data_hashed_placeholder(builder, reserve_size, format.c_str(), &c2pa_manifest_bytes); return detail::to_byte_vector(c2pa_manifest_bytes, result); } std::vector Builder::sign_data_hashed_embeddable(Signer &signer, const std::string &data_hash, const std::string &format, std::istream *asset) { - const std::string resolved = detail::require_explicit_format(format); - int64_t result; const unsigned char *c2pa_manifest_bytes = nullptr; if (asset) { CppIStream c_asset(*asset); - result = c2pa_builder_sign_data_hashed_embeddable(builder, signer.c2pa_signer(), data_hash.c_str(), resolved.c_str(), c_asset.c_stream, &c2pa_manifest_bytes); + result = c2pa_builder_sign_data_hashed_embeddable(builder, signer.c2pa_signer(), data_hash.c_str(), format.c_str(), c_asset.c_stream, &c2pa_manifest_bytes); } else { - result = c2pa_builder_sign_data_hashed_embeddable(builder, signer.c2pa_signer(), data_hash.c_str(), resolved.c_str(), nullptr, &c2pa_manifest_bytes); + result = c2pa_builder_sign_data_hashed_embeddable(builder, signer.c2pa_signer(), data_hash.c_str(), format.c_str(), nullptr, &c2pa_manifest_bytes); } return detail::to_byte_vector(c2pa_manifest_bytes, result); } bool Builder::needs_placeholder(const std::string &format) { - const std::string resolved = detail::require_explicit_format(format); - - int result = c2pa_builder_needs_placeholder(builder, resolved.c_str()); + int result = c2pa_builder_needs_placeholder(builder, format.c_str()); if (result < 0) { throw C2paException(); @@ -437,11 +419,8 @@ namespace c2pa std::vector Builder::placeholder(const std::string &format) { - // The format selects the hash assertion written into the builder. - const std::string resolved = detail::require_explicit_format(format); - const unsigned char *c2pa_manifest_bytes = nullptr; - auto result = c2pa_builder_placeholder(builder, resolved.c_str(), &c2pa_manifest_bytes); + auto result = c2pa_builder_placeholder(builder, format.c_str(), &c2pa_manifest_bytes); return detail::to_byte_vector(c2pa_manifest_bytes, result); } @@ -464,11 +443,8 @@ namespace c2pa void Builder::update_hash_from_stream(const std::string &format, std::istream &stream) { - // The format decides which hash assertion is updated. - const std::string resolved = detail::require_explicit_format(format); - CppIStream c_stream(stream); - int result = c2pa_builder_update_hash_from_stream(builder, resolved.c_str(), c_stream.c_stream); + int result = c2pa_builder_update_hash_from_stream(builder, format.c_str(), c_stream.c_stream); if (result < 0) { throw C2paException(); @@ -477,19 +453,15 @@ namespace c2pa std::vector Builder::sign_embeddable(const std::string &format) { - const std::string resolved = detail::require_explicit_format(format); - const unsigned char *c2pa_manifest_bytes = nullptr; - auto result = c2pa_builder_sign_embeddable(builder, resolved.c_str(), &c2pa_manifest_bytes); + auto result = c2pa_builder_sign_embeddable(builder, format.c_str(), &c2pa_manifest_bytes); return detail::to_byte_vector(c2pa_manifest_bytes, result); } std::vector Builder::format_embeddable(const std::string &format, std::vector &data) { - const std::string resolved = detail::require_explicit_format(format); - const unsigned char *c2pa_manifest_bytes = nullptr; - auto result = c2pa_format_embeddable(resolved.c_str(), data.data(), data.size(), &c2pa_manifest_bytes); + auto result = c2pa_format_embeddable(format.c_str(), data.data(), data.size(), &c2pa_manifest_bytes); return detail::to_byte_vector(c2pa_manifest_bytes, result); } From f7f0244be4d458bc4eddd79d74c1d41995437dcb Mon Sep 17 00:00:00 2001 From: Tania Mathern Date: Wed, 29 Jul 2026 10:47:07 -0700 Subject: [PATCH 12/27] fix: no no change in builder --- src/c2pa_builder.cpp | 54 +++++++++++++++++++++++++++++++++----------- 1 file changed, 41 insertions(+), 13 deletions(-) diff --git a/src/c2pa_builder.cpp b/src/c2pa_builder.cpp index 38ac1cb0..8c02213e 100644 --- a/src/c2pa_builder.cpp +++ b/src/c2pa_builder.cpp @@ -222,6 +222,8 @@ namespace c2pa std::vector Builder::sign(const std::string &format, std::istream &source, std::ostream &dest, Signer &signer) { + const std::string resolved = detail::require_explicit_format(format); + // Caller's source/dest streams must outlive this call // Stream wrappers are stack locals that wrap the caller's streams CppIStream c_source(source); @@ -229,12 +231,14 @@ namespace c2pa const unsigned char *c2pa_manifest_bytes = nullptr; // c2pa_builder_sign() uses streams synchronously and completes before returning - auto result = c2pa_builder_sign(builder, format.c_str(), c_source.c_stream, c_dest.c_stream, signer.c2pa_signer(), &c2pa_manifest_bytes); + auto result = c2pa_builder_sign(builder, resolved.c_str(), c_source.c_stream, c_dest.c_stream, signer.c2pa_signer(), &c2pa_manifest_bytes); return detail::to_byte_vector(c2pa_manifest_bytes, result); } std::vector Builder::sign(const std::string &format, std::istream &source, std::iostream &dest, Signer &signer) { + const std::string resolved = detail::require_explicit_format(format); + // Caller's source/dest streams must outlive this call // Stream wrappers are stack locals that wrap the caller's streams CppIStream c_source(source); @@ -242,7 +246,7 @@ namespace c2pa const unsigned char *c2pa_manifest_bytes = nullptr; // c2pa_builder_sign() uses streams synchronously and completes before returning - auto result = c2pa_builder_sign(builder, format.c_str(), c_source.c_stream, c_dest.c_stream, signer.c2pa_signer(), &c2pa_manifest_bytes); + auto result = c2pa_builder_sign(builder, resolved.c_str(), c_source.c_stream, c_dest.c_stream, signer.c2pa_signer(), &c2pa_manifest_bytes); return detail::to_byte_vector(c2pa_manifest_bytes, result); } @@ -254,6 +258,10 @@ namespace c2pa /// @throws C2pa::C2paException for errors encountered by the C2PA library. std::vector Builder::sign(const std::filesystem::path &source_path, const std::filesystem::path &dest_path, Signer &signer) { + // Validate before opening the destination, which opens with trunc. + const std::string format = + detail::require_explicit_format(detail::extract_file_extension(dest_path)); + auto source = detail::open_file_binary(source_path); // Ensure the destination directory exists auto dest_dir = dest_path.parent_path(); @@ -270,23 +278,28 @@ namespace c2pa { throw std::runtime_error("Failed to open destination file: " + dest_path.string()); } - auto format = detail::extract_file_extension(dest_path); auto result = sign(format, *source, dest, signer); return result; } std::vector Builder::sign(const std::string &format, std::istream &source, std::iostream &dest) { + const std::string resolved = detail::require_explicit_format(format); + CppIStream c_source(source); CppIOStream c_dest(dest); const unsigned char *c2pa_manifest_bytes = nullptr; - auto result = c2pa_builder_sign_context(builder, format.c_str(), c_source.c_stream, c_dest.c_stream, &c2pa_manifest_bytes); + auto result = c2pa_builder_sign_context(builder, resolved.c_str(), c_source.c_stream, c_dest.c_stream, &c2pa_manifest_bytes); return detail::to_byte_vector(c2pa_manifest_bytes, result); } std::vector Builder::sign(const std::filesystem::path &source_path, const std::filesystem::path &dest_path) { + // Validate before opening the destination, which opens with trunc. + const std::string format = + detail::require_explicit_format(detail::extract_file_extension(dest_path)); + auto source = detail::open_file_binary(source_path); auto dest_dir = dest_path.parent_path(); if (!std::filesystem::exists(dest_dir)) @@ -302,7 +315,6 @@ namespace c2pa { throw std::runtime_error("Failed to open destination file: " + dest_path.string()); } - auto format = detail::extract_file_extension(dest_path); auto result = sign(format, *source, dest); return result; } @@ -386,30 +398,36 @@ namespace c2pa std::vector Builder::data_hashed_placeholder(uintptr_t reserve_size, const std::string &format) { + const std::string resolved = detail::require_explicit_format(format); + const unsigned char *c2pa_manifest_bytes = nullptr; - auto result = c2pa_builder_data_hashed_placeholder(builder, reserve_size, format.c_str(), &c2pa_manifest_bytes); + auto result = c2pa_builder_data_hashed_placeholder(builder, reserve_size, resolved.c_str(), &c2pa_manifest_bytes); return detail::to_byte_vector(c2pa_manifest_bytes, result); } std::vector Builder::sign_data_hashed_embeddable(Signer &signer, const std::string &data_hash, const std::string &format, std::istream *asset) { + const std::string resolved = detail::require_explicit_format(format); + int64_t result; const unsigned char *c2pa_manifest_bytes = nullptr; if (asset) { CppIStream c_asset(*asset); - result = c2pa_builder_sign_data_hashed_embeddable(builder, signer.c2pa_signer(), data_hash.c_str(), format.c_str(), c_asset.c_stream, &c2pa_manifest_bytes); + result = c2pa_builder_sign_data_hashed_embeddable(builder, signer.c2pa_signer(), data_hash.c_str(), resolved.c_str(), c_asset.c_stream, &c2pa_manifest_bytes); } else { - result = c2pa_builder_sign_data_hashed_embeddable(builder, signer.c2pa_signer(), data_hash.c_str(), format.c_str(), nullptr, &c2pa_manifest_bytes); + result = c2pa_builder_sign_data_hashed_embeddable(builder, signer.c2pa_signer(), data_hash.c_str(), resolved.c_str(), nullptr, &c2pa_manifest_bytes); } return detail::to_byte_vector(c2pa_manifest_bytes, result); } bool Builder::needs_placeholder(const std::string &format) { - int result = c2pa_builder_needs_placeholder(builder, format.c_str()); + const std::string resolved = detail::require_explicit_format(format); + + int result = c2pa_builder_needs_placeholder(builder, resolved.c_str()); if (result < 0) { throw C2paException(); @@ -419,8 +437,11 @@ namespace c2pa std::vector Builder::placeholder(const std::string &format) { + // The format selects the hash assertion written into the builder. + const std::string resolved = detail::require_explicit_format(format); + const unsigned char *c2pa_manifest_bytes = nullptr; - auto result = c2pa_builder_placeholder(builder, format.c_str(), &c2pa_manifest_bytes); + auto result = c2pa_builder_placeholder(builder, resolved.c_str(), &c2pa_manifest_bytes); return detail::to_byte_vector(c2pa_manifest_bytes, result); } @@ -443,8 +464,11 @@ namespace c2pa void Builder::update_hash_from_stream(const std::string &format, std::istream &stream) { + // The format decides which hash assertion is updated. + const std::string resolved = detail::require_explicit_format(format); + CppIStream c_stream(stream); - int result = c2pa_builder_update_hash_from_stream(builder, format.c_str(), c_stream.c_stream); + int result = c2pa_builder_update_hash_from_stream(builder, resolved.c_str(), c_stream.c_stream); if (result < 0) { throw C2paException(); @@ -453,15 +477,19 @@ namespace c2pa std::vector Builder::sign_embeddable(const std::string &format) { + const std::string resolved = detail::require_explicit_format(format); + const unsigned char *c2pa_manifest_bytes = nullptr; - auto result = c2pa_builder_sign_embeddable(builder, format.c_str(), &c2pa_manifest_bytes); + auto result = c2pa_builder_sign_embeddable(builder, resolved.c_str(), &c2pa_manifest_bytes); return detail::to_byte_vector(c2pa_manifest_bytes, result); } std::vector Builder::format_embeddable(const std::string &format, std::vector &data) { + const std::string resolved = detail::require_explicit_format(format); + const unsigned char *c2pa_manifest_bytes = nullptr; - auto result = c2pa_format_embeddable(format.c_str(), data.data(), data.size(), &c2pa_manifest_bytes); + auto result = c2pa_format_embeddable(resolved.c_str(), data.data(), data.size(), &c2pa_manifest_bytes); return detail::to_byte_vector(c2pa_manifest_bytes, result); } From 0c2324bee70ecfa4e021b75a21bb5792843a8453 Mon Sep 17 00:00:00 2001 From: Tania Mathern Date: Wed, 29 Jul 2026 10:57:16 -0700 Subject: [PATCH 13/27] fix: renamings --- src/c2pa_builder.cpp | 24 ++++++++++++------------ src/c2pa_internal.hpp | 4 ++-- src/c2pa_reader.cpp | 9 +++++---- 3 files changed, 19 insertions(+), 18 deletions(-) diff --git a/src/c2pa_builder.cpp b/src/c2pa_builder.cpp index 8c02213e..4b1e0580 100644 --- a/src/c2pa_builder.cpp +++ b/src/c2pa_builder.cpp @@ -222,7 +222,7 @@ namespace c2pa std::vector Builder::sign(const std::string &format, std::istream &source, std::ostream &dest, Signer &signer) { - const std::string resolved = detail::require_explicit_format(format); + const std::string resolved = detail::resolve_format(format); // Caller's source/dest streams must outlive this call // Stream wrappers are stack locals that wrap the caller's streams @@ -237,7 +237,7 @@ namespace c2pa std::vector Builder::sign(const std::string &format, std::istream &source, std::iostream &dest, Signer &signer) { - const std::string resolved = detail::require_explicit_format(format); + const std::string resolved = detail::resolve_format(format); // Caller's source/dest streams must outlive this call // Stream wrappers are stack locals that wrap the caller's streams @@ -260,7 +260,7 @@ namespace c2pa { // Validate before opening the destination, which opens with trunc. const std::string format = - detail::require_explicit_format(detail::extract_file_extension(dest_path)); + detail::resolve_format(detail::extract_file_extension(dest_path)); auto source = detail::open_file_binary(source_path); // Ensure the destination directory exists @@ -284,7 +284,7 @@ namespace c2pa std::vector Builder::sign(const std::string &format, std::istream &source, std::iostream &dest) { - const std::string resolved = detail::require_explicit_format(format); + const std::string resolved = detail::resolve_format(format); CppIStream c_source(source); CppIOStream c_dest(dest); @@ -298,7 +298,7 @@ namespace c2pa { // Validate before opening the destination, which opens with trunc. const std::string format = - detail::require_explicit_format(detail::extract_file_extension(dest_path)); + detail::resolve_format(detail::extract_file_extension(dest_path)); auto source = detail::open_file_binary(source_path); auto dest_dir = dest_path.parent_path(); @@ -398,7 +398,7 @@ namespace c2pa std::vector Builder::data_hashed_placeholder(uintptr_t reserve_size, const std::string &format) { - const std::string resolved = detail::require_explicit_format(format); + const std::string resolved = detail::resolve_format(format); const unsigned char *c2pa_manifest_bytes = nullptr; auto result = c2pa_builder_data_hashed_placeholder(builder, reserve_size, resolved.c_str(), &c2pa_manifest_bytes); @@ -407,7 +407,7 @@ namespace c2pa std::vector Builder::sign_data_hashed_embeddable(Signer &signer, const std::string &data_hash, const std::string &format, std::istream *asset) { - const std::string resolved = detail::require_explicit_format(format); + const std::string resolved = detail::resolve_format(format); int64_t result; const unsigned char *c2pa_manifest_bytes = nullptr; @@ -425,7 +425,7 @@ namespace c2pa bool Builder::needs_placeholder(const std::string &format) { - const std::string resolved = detail::require_explicit_format(format); + const std::string resolved = detail::resolve_format(format); int result = c2pa_builder_needs_placeholder(builder, resolved.c_str()); if (result < 0) @@ -438,7 +438,7 @@ namespace c2pa std::vector Builder::placeholder(const std::string &format) { // The format selects the hash assertion written into the builder. - const std::string resolved = detail::require_explicit_format(format); + const std::string resolved = detail::resolve_format(format); const unsigned char *c2pa_manifest_bytes = nullptr; auto result = c2pa_builder_placeholder(builder, resolved.c_str(), &c2pa_manifest_bytes); @@ -465,7 +465,7 @@ namespace c2pa void Builder::update_hash_from_stream(const std::string &format, std::istream &stream) { // The format decides which hash assertion is updated. - const std::string resolved = detail::require_explicit_format(format); + const std::string resolved = detail::resolve_format(format); CppIStream c_stream(stream); int result = c2pa_builder_update_hash_from_stream(builder, resolved.c_str(), c_stream.c_stream); @@ -477,7 +477,7 @@ namespace c2pa std::vector Builder::sign_embeddable(const std::string &format) { - const std::string resolved = detail::require_explicit_format(format); + const std::string resolved = detail::resolve_format(format); const unsigned char *c2pa_manifest_bytes = nullptr; auto result = c2pa_builder_sign_embeddable(builder, resolved.c_str(), &c2pa_manifest_bytes); @@ -486,7 +486,7 @@ namespace c2pa std::vector Builder::format_embeddable(const std::string &format, std::vector &data) { - const std::string resolved = detail::require_explicit_format(format); + const std::string resolved = detail::resolve_format(format); const unsigned char *c2pa_manifest_bytes = nullptr; auto result = c2pa_format_embeddable(resolved.c_str(), data.data(), data.size(), &c2pa_manifest_bytes); diff --git a/src/c2pa_internal.hpp b/src/c2pa_internal.hpp index 54160129..82de416b 100644 --- a/src/c2pa_internal.hpp +++ b/src/c2pa_internal.hpp @@ -289,13 +289,13 @@ inline constexpr const char *kFormatWhitespace = " \t\n\r\f\v"; } /// @brief Resolve a format for reading, letting a blank one request detection. -[[nodiscard]] inline std::string resolve_reader_format(const std::string &format) { +[[nodiscard]] inline std::string resolve_detectable_format(const std::string &format) { return normalize_format(format, true); } /// @brief Resolve a format that must be stated. These paths never infer the /// container type from content, so a blank format is rejected. -[[nodiscard]] inline std::string require_explicit_format(const std::string &format) { +[[nodiscard]] inline std::string resolve_format(const std::string &format) { return normalize_format(format, false); } diff --git a/src/c2pa_reader.cpp b/src/c2pa_reader.cpp index 7e9ef2f3..a94bee97 100644 --- a/src/c2pa_reader.cpp +++ b/src/c2pa_reader.cpp @@ -47,7 +47,7 @@ namespace c2pa } // Validate before acquiring anything. - const std::string resolved = detail::resolve_reader_format(format); + const std::string resolved = detail::resolve_detectable_format(format); // Create the stream wrapper before the reader handle cpp_stream = std::make_unique(stream); @@ -117,7 +117,7 @@ namespace c2pa } // The container type decides how the asset is hashed, so it is required. - const std::string resolved = detail::require_explicit_format(format); + const std::string resolved = detail::resolve_format(format); cpp_stream = std::make_unique(image_stream); @@ -197,7 +197,8 @@ namespace c2pa { ensure_initialized(); - const std::string resolved = detail::require_explicit_format(format); + // format can't be auto-detected here + const std::string resolved = detail::resolve_format(format); CppIStream main_wrapper(stream); CppIStream fragment_wrapper(fragment); @@ -220,7 +221,7 @@ namespace c2pa Reader::Reader(const std::string &format, std::istream &stream) { - const std::string resolved = detail::resolve_reader_format(format); + const std::string resolved = detail::resolve_detectable_format(format); cpp_stream = std::make_unique(stream); c2pa_reader = c2pa_reader_from_stream(resolved.c_str(), cpp_stream->c_stream); From 71b42eefae198f12420a468e3203d195f9b11387 Mon Sep 17 00:00:00 2001 From: Tania Mathern Date: Wed, 29 Jul 2026 11:14:56 -0700 Subject: [PATCH 14/27] fix: Rename --- src/c2pa_internal.hpp | 36 ++++++++++++------------------------ src/c2pa_reader.cpp | 4 ++-- 2 files changed, 14 insertions(+), 26 deletions(-) diff --git a/src/c2pa_internal.hpp b/src/c2pa_internal.hpp index 82de416b..0fca44e9 100644 --- a/src/c2pa_internal.hpp +++ b/src/c2pa_internal.hpp @@ -240,8 +240,6 @@ inline std::unique_ptr open_file_binary(const std::filesystem::path /// @brief Extract file extension without the leading dot /// @param path Filesystem path /// @return Extension string (e.g., "jpg" not ".jpg") -/// @details Empty when the path has no extension, which asks the library to -/// determine the container type from the asset's leading bytes. inline std::string extract_file_extension(const std::filesystem::path &path) noexcept { auto ext = path.extension().string(); return ext.empty() ? "" : ext.substr(1); @@ -266,44 +264,34 @@ inline constexpr const char *kFormatWhitespace = " \t\n\r\f\v"; return std::string_view(format).substr(first, last - first + 1); } -/// @brief Normalize a caller-supplied format for the C FFI. -/// @param format The format supplied by, or derived for, the caller. -/// @param allow_detection Whether a blank format may request content detection. -/// @return Empty when @p format is blank, otherwise @p format trimmed and lowercased. -/// @throws C2paException if @p format is blank and @p allow_detection is false. -[[nodiscard]] inline std::string normalize_format(const std::string &format, - bool allow_detection) { +/// @brief Trim and lowercase a caller-supplied format; empty when @p format is blank. +/// @details Empty means detection from content, so this alone is enough wherever +/// a blank format is allowed to request that. +[[nodiscard]] inline std::string normalize_format(const std::string &format) { const std::string_view trimmed = trim_format(format); - if (trimmed.empty()) { - if (!allow_detection) { - throw C2paException("An explicit format is required."); - } - // Blank hint for the native core lib to attempt guessing the format. - return std::string(); - } - std::string normalized(trimmed); std::transform(normalized.begin(), normalized.end(), normalized.begin(), [](unsigned char c) { return static_cast(std::tolower(c)); }); return normalized; } -/// @brief Resolve a format for reading, letting a blank one request detection. -[[nodiscard]] inline std::string resolve_detectable_format(const std::string &format) { - return normalize_format(format, true); -} - /// @brief Resolve a format that must be stated. These paths never infer the /// container type from content, so a blank format is rejected. +/// @return @p format trimmed and lowercased. +/// @throws C2paException if @p format is blank. [[nodiscard]] inline std::string resolve_format(const std::string &format) { - return normalize_format(format, false); + std::string normalized = normalize_format(format); + if (normalized.empty()) { + throw C2paException("An explicit format is required."); + } + return normalized; } /// @brief Normalize an extension derived from a filename (path). /// @details The extension describes the filename rather than the data. /// Content detection overrides a wrong one. [[nodiscard]] inline std::string normalize_derived_extension(const std::string &extension) { - return normalize_format(extension, true); + return normalize_format(extension); } /// @brief Convert C string result to C++ string with cleanup diff --git a/src/c2pa_reader.cpp b/src/c2pa_reader.cpp index a94bee97..4ce841e1 100644 --- a/src/c2pa_reader.cpp +++ b/src/c2pa_reader.cpp @@ -47,7 +47,7 @@ namespace c2pa } // Validate before acquiring anything. - const std::string resolved = detail::resolve_detectable_format(format); + const std::string resolved = detail::normalize_format(format); // Create the stream wrapper before the reader handle cpp_stream = std::make_unique(stream); @@ -221,7 +221,7 @@ namespace c2pa Reader::Reader(const std::string &format, std::istream &stream) { - const std::string resolved = detail::resolve_detectable_format(format); + const std::string resolved = detail::normalize_format(format); cpp_stream = std::make_unique(stream); c2pa_reader = c2pa_reader_from_stream(resolved.c_str(), cpp_stream->c_stream); From c812ef0fb4bd3acb8a59b88517bf2eeacd43a0c2 Mon Sep 17 00:00:00 2001 From: Tania Mathern Date: Wed, 29 Jul 2026 11:17:51 -0700 Subject: [PATCH 15/27] fix: Refact 1 --- src/c2pa_builder.cpp | 44 +++++++++++++++++++++----------------------- 1 file changed, 21 insertions(+), 23 deletions(-) diff --git a/src/c2pa_builder.cpp b/src/c2pa_builder.cpp index 4b1e0580..29d07c9a 100644 --- a/src/c2pa_builder.cpp +++ b/src/c2pa_builder.cpp @@ -222,7 +222,7 @@ namespace c2pa std::vector Builder::sign(const std::string &format, std::istream &source, std::ostream &dest, Signer &signer) { - const std::string resolved = detail::resolve_format(format); + const std::string resolved_format = detail::resolve_format(format); // Caller's source/dest streams must outlive this call // Stream wrappers are stack locals that wrap the caller's streams @@ -231,13 +231,13 @@ namespace c2pa const unsigned char *c2pa_manifest_bytes = nullptr; // c2pa_builder_sign() uses streams synchronously and completes before returning - auto result = c2pa_builder_sign(builder, resolved.c_str(), c_source.c_stream, c_dest.c_stream, signer.c2pa_signer(), &c2pa_manifest_bytes); + auto result = c2pa_builder_sign(builder, resolved_format.c_str(), c_source.c_stream, c_dest.c_stream, signer.c2pa_signer(), &c2pa_manifest_bytes); return detail::to_byte_vector(c2pa_manifest_bytes, result); } std::vector Builder::sign(const std::string &format, std::istream &source, std::iostream &dest, Signer &signer) { - const std::string resolved = detail::resolve_format(format); + const std::string resolved_format = detail::resolve_format(format); // Caller's source/dest streams must outlive this call // Stream wrappers are stack locals that wrap the caller's streams @@ -246,7 +246,7 @@ namespace c2pa const unsigned char *c2pa_manifest_bytes = nullptr; // c2pa_builder_sign() uses streams synchronously and completes before returning - auto result = c2pa_builder_sign(builder, resolved.c_str(), c_source.c_stream, c_dest.c_stream, signer.c2pa_signer(), &c2pa_manifest_bytes); + auto result = c2pa_builder_sign(builder, resolved_format.c_str(), c_source.c_stream, c_dest.c_stream, signer.c2pa_signer(), &c2pa_manifest_bytes); return detail::to_byte_vector(c2pa_manifest_bytes, result); } @@ -258,7 +258,6 @@ namespace c2pa /// @throws C2pa::C2paException for errors encountered by the C2PA library. std::vector Builder::sign(const std::filesystem::path &source_path, const std::filesystem::path &dest_path, Signer &signer) { - // Validate before opening the destination, which opens with trunc. const std::string format = detail::resolve_format(detail::extract_file_extension(dest_path)); @@ -284,19 +283,18 @@ namespace c2pa std::vector Builder::sign(const std::string &format, std::istream &source, std::iostream &dest) { - const std::string resolved = detail::resolve_format(format); + const std::string resolved_format = detail::resolve_format(format); CppIStream c_source(source); CppIOStream c_dest(dest); const unsigned char *c2pa_manifest_bytes = nullptr; - auto result = c2pa_builder_sign_context(builder, resolved.c_str(), c_source.c_stream, c_dest.c_stream, &c2pa_manifest_bytes); + auto result = c2pa_builder_sign_context(builder, resolved_format.c_str(), c_source.c_stream, c_dest.c_stream, &c2pa_manifest_bytes); return detail::to_byte_vector(c2pa_manifest_bytes, result); } std::vector Builder::sign(const std::filesystem::path &source_path, const std::filesystem::path &dest_path) { - // Validate before opening the destination, which opens with trunc. const std::string format = detail::resolve_format(detail::extract_file_extension(dest_path)); @@ -398,36 +396,36 @@ namespace c2pa std::vector Builder::data_hashed_placeholder(uintptr_t reserve_size, const std::string &format) { - const std::string resolved = detail::resolve_format(format); + const std::string resolved_format = detail::resolve_format(format); const unsigned char *c2pa_manifest_bytes = nullptr; - auto result = c2pa_builder_data_hashed_placeholder(builder, reserve_size, resolved.c_str(), &c2pa_manifest_bytes); + auto result = c2pa_builder_data_hashed_placeholder(builder, reserve_size, resolved_format.c_str(), &c2pa_manifest_bytes); return detail::to_byte_vector(c2pa_manifest_bytes, result); } std::vector Builder::sign_data_hashed_embeddable(Signer &signer, const std::string &data_hash, const std::string &format, std::istream *asset) { - const std::string resolved = detail::resolve_format(format); + const std::string resolved_format = detail::resolve_format(format); int64_t result; const unsigned char *c2pa_manifest_bytes = nullptr; if (asset) { CppIStream c_asset(*asset); - result = c2pa_builder_sign_data_hashed_embeddable(builder, signer.c2pa_signer(), data_hash.c_str(), resolved.c_str(), c_asset.c_stream, &c2pa_manifest_bytes); + result = c2pa_builder_sign_data_hashed_embeddable(builder, signer.c2pa_signer(), data_hash.c_str(), resolved_format.c_str(), c_asset.c_stream, &c2pa_manifest_bytes); } else { - result = c2pa_builder_sign_data_hashed_embeddable(builder, signer.c2pa_signer(), data_hash.c_str(), resolved.c_str(), nullptr, &c2pa_manifest_bytes); + result = c2pa_builder_sign_data_hashed_embeddable(builder, signer.c2pa_signer(), data_hash.c_str(), resolved_format.c_str(), nullptr, &c2pa_manifest_bytes); } return detail::to_byte_vector(c2pa_manifest_bytes, result); } bool Builder::needs_placeholder(const std::string &format) { - const std::string resolved = detail::resolve_format(format); + const std::string resolved_format = detail::resolve_format(format); - int result = c2pa_builder_needs_placeholder(builder, resolved.c_str()); + int result = c2pa_builder_needs_placeholder(builder, resolved_format.c_str()); if (result < 0) { throw C2paException(); @@ -438,10 +436,10 @@ namespace c2pa std::vector Builder::placeholder(const std::string &format) { // The format selects the hash assertion written into the builder. - const std::string resolved = detail::resolve_format(format); + const std::string resolved_format = detail::resolve_format(format); const unsigned char *c2pa_manifest_bytes = nullptr; - auto result = c2pa_builder_placeholder(builder, resolved.c_str(), &c2pa_manifest_bytes); + auto result = c2pa_builder_placeholder(builder, resolved_format.c_str(), &c2pa_manifest_bytes); return detail::to_byte_vector(c2pa_manifest_bytes, result); } @@ -465,10 +463,10 @@ namespace c2pa void Builder::update_hash_from_stream(const std::string &format, std::istream &stream) { // The format decides which hash assertion is updated. - const std::string resolved = detail::resolve_format(format); + const std::string resolved_format = detail::resolve_format(format); CppIStream c_stream(stream); - int result = c2pa_builder_update_hash_from_stream(builder, resolved.c_str(), c_stream.c_stream); + int result = c2pa_builder_update_hash_from_stream(builder, resolved_format.c_str(), c_stream.c_stream); if (result < 0) { throw C2paException(); @@ -477,19 +475,19 @@ namespace c2pa std::vector Builder::sign_embeddable(const std::string &format) { - const std::string resolved = detail::resolve_format(format); + const std::string resolved_format = detail::resolve_format(format); const unsigned char *c2pa_manifest_bytes = nullptr; - auto result = c2pa_builder_sign_embeddable(builder, resolved.c_str(), &c2pa_manifest_bytes); + auto result = c2pa_builder_sign_embeddable(builder, resolved_format.c_str(), &c2pa_manifest_bytes); return detail::to_byte_vector(c2pa_manifest_bytes, result); } std::vector Builder::format_embeddable(const std::string &format, std::vector &data) { - const std::string resolved = detail::resolve_format(format); + const std::string resolved_format = detail::resolve_format(format); const unsigned char *c2pa_manifest_bytes = nullptr; - auto result = c2pa_format_embeddable(resolved.c_str(), data.data(), data.size(), &c2pa_manifest_bytes); + auto result = c2pa_format_embeddable(resolved_format.c_str(), data.data(), data.size(), &c2pa_manifest_bytes); return detail::to_byte_vector(c2pa_manifest_bytes, result); } From ab1efde405bc3a7c0e00967948436871bc6d8e61 Mon Sep 17 00:00:00 2001 From: Tania Mathern Date: Wed, 29 Jul 2026 11:24:13 -0700 Subject: [PATCH 16/27] fix: Refact 1 --- src/c2pa_internal.hpp | 12 +++--------- src/c2pa_reader.cpp | 4 ++-- 2 files changed, 5 insertions(+), 11 deletions(-) diff --git a/src/c2pa_internal.hpp b/src/c2pa_internal.hpp index 0fca44e9..49736c01 100644 --- a/src/c2pa_internal.hpp +++ b/src/c2pa_internal.hpp @@ -275,8 +275,9 @@ inline constexpr const char *kFormatWhitespace = " \t\n\r\f\v"; return normalized; } -/// @brief Resolve a format that must be stated. These paths never infer the -/// container type from content, so a blank format is rejected. +/// @brief Resolve a format that must be stated explicitly. +/// These paths never infer the container type from content, +/// so a blank format is rejected. /// @return @p format trimmed and lowercased. /// @throws C2paException if @p format is blank. [[nodiscard]] inline std::string resolve_format(const std::string &format) { @@ -287,13 +288,6 @@ inline constexpr const char *kFormatWhitespace = " \t\n\r\f\v"; return normalized; } -/// @brief Normalize an extension derived from a filename (path). -/// @details The extension describes the filename rather than the data. -/// Content detection overrides a wrong one. -[[nodiscard]] inline std::string normalize_derived_extension(const std::string &extension) { - return normalize_format(extension); -} - /// @brief Convert C string result to C++ string with cleanup /// @param c_result Raw C string from C API /// @return C++ string (throws if null) diff --git a/src/c2pa_reader.cpp b/src/c2pa_reader.cpp index 4ce841e1..c7cf88dd 100644 --- a/src/c2pa_reader.cpp +++ b/src/c2pa_reader.cpp @@ -84,7 +84,7 @@ namespace c2pa // The extension describes the filename, so it is normalized and left unchecked. // Content type detection overrides it anyway if wrong. - std::string extension = detail::normalize_derived_extension(detail::extract_file_extension(source_path)); + std::string extension = detail::normalize_format(detail::extract_file_extension(source_path)); // CppIStream stores reference to owned_stream, which lives as long as Reader cpp_stream = std::make_unique(*owned_stream); @@ -239,7 +239,7 @@ namespace c2pa throw std::system_error(errno, std::system_category(), "Failed to open file: " + source_path.string()); } - std::string extension = detail::normalize_derived_extension(detail::extract_file_extension(source_path)); + std::string extension = detail::normalize_format(detail::extract_file_extension(source_path)); // CppIStream stores reference to owned_stream, which lives as long as Reader cpp_stream = std::make_unique(*owned_stream); From c901ba018f0b4bc66374c87b22bed5fe6c03096e Mon Sep 17 00:00:00 2001 From: Tania Mathern Date: Wed, 29 Jul 2026 11:29:16 -0700 Subject: [PATCH 17/27] fix: Refact 1 --- src/c2pa_internal.hpp | 16 +++++----------- src/c2pa_reader.cpp | 1 - 2 files changed, 5 insertions(+), 12 deletions(-) diff --git a/src/c2pa_internal.hpp b/src/c2pa_internal.hpp index 49736c01..ee50d324 100644 --- a/src/c2pa_internal.hpp +++ b/src/c2pa_internal.hpp @@ -254,22 +254,16 @@ inline constexpr const char *kDetectFormatFromContent = ""; /// deliberately excluded. inline constexpr const char *kFormatWhitespace = " \t\n\r\f\v"; -/// @brief The format with surrounding whitespace removed, empty when blank. -[[nodiscard]] inline std::string_view trim_format(const std::string &format) noexcept { +/// @brief Trim and lowercase a caller-supplied format; empty when @p format is blank. +/// @details Empty means detection from content, so this alone is enough wherever +/// a blank format is allowed to request that. +[[nodiscard]] inline std::string normalize_format(const std::string &format) { const auto first = format.find_first_not_of(kFormatWhitespace); if (first == std::string::npos) { return {}; // Empty or all whitespace. } const auto last = format.find_last_not_of(kFormatWhitespace); - return std::string_view(format).substr(first, last - first + 1); -} - -/// @brief Trim and lowercase a caller-supplied format; empty when @p format is blank. -/// @details Empty means detection from content, so this alone is enough wherever -/// a blank format is allowed to request that. -[[nodiscard]] inline std::string normalize_format(const std::string &format) { - const std::string_view trimmed = trim_format(format); - std::string normalized(trimmed); + std::string normalized(std::string_view(format).substr(first, last - first + 1)); std::transform(normalized.begin(), normalized.end(), normalized.begin(), [](unsigned char c) { return static_cast(std::tolower(c)); }); return normalized; diff --git a/src/c2pa_reader.cpp b/src/c2pa_reader.cpp index c7cf88dd..a146829a 100644 --- a/src/c2pa_reader.cpp +++ b/src/c2pa_reader.cpp @@ -197,7 +197,6 @@ namespace c2pa { ensure_initialized(); - // format can't be auto-detected here const std::string resolved = detail::resolve_format(format); CppIStream main_wrapper(stream); From 1ac9d8fa98a29a34a25caf35a327c127682ce55e Mon Sep 17 00:00:00 2001 From: Tania Mathern Date: Wed, 29 Jul 2026 11:38:54 -0700 Subject: [PATCH 18/27] fix: Refactor --- src/c2pa_reader.cpp | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/c2pa_reader.cpp b/src/c2pa_reader.cpp index a146829a..a4daefc9 100644 --- a/src/c2pa_reader.cpp +++ b/src/c2pa_reader.cpp @@ -46,8 +46,7 @@ namespace c2pa throw C2paException("Invalid Context provider IContextProvider"); } - // Validate before acquiring anything. - const std::string resolved = detail::normalize_format(format); + const std::string resolved_format = detail::normalize_format(format); // Create the stream wrapper before the reader handle cpp_stream = std::make_unique(stream); @@ -59,7 +58,7 @@ namespace c2pa // Update reader with stream. // Note: c2pa_reader_with_stream consumes the reader pointer. - C2paReader* updated = c2pa_reader_with_stream(c2pa_reader, resolved.c_str(), cpp_stream->c_stream); + C2paReader* updated = c2pa_reader_with_stream(c2pa_reader, resolved_format.c_str(), cpp_stream->c_stream); c2pa_reader = nullptr; if (updated == nullptr) { throw C2paException(); @@ -82,8 +81,6 @@ namespace c2pa throw std::system_error(errno, std::system_category(), "Failed to open file: " + source_path.string()); } - // The extension describes the filename, so it is normalized and left unchecked. - // Content type detection overrides it anyway if wrong. std::string extension = detail::normalize_format(detail::extract_file_extension(source_path)); // CppIStream stores reference to owned_stream, which lives as long as Reader @@ -116,8 +113,9 @@ namespace c2pa throw C2paException("manifest_jumbf must not be empty"); } - // The container type decides how the asset is hashed, so it is required. - const std::string resolved = detail::resolve_format(format); + // The container type decides how the asset is hashed, + // format required here (can't be guessed). + const std::string resolved_format = detail::resolve_format(format); cpp_stream = std::make_unique(image_stream); @@ -129,7 +127,7 @@ namespace c2pa // c2pa_reader_with_manifest_data_and_stream always consumes c2pa_reader. C2paReader* updated = c2pa_reader_with_manifest_data_and_stream( c2pa_reader, - resolved.c_str(), + resolved_format.c_str(), cpp_stream->c_stream, manifest_jumbf.data(), manifest_jumbf.size()); @@ -197,7 +195,9 @@ namespace c2pa { ensure_initialized(); - const std::string resolved = detail::resolve_format(format); + // The container type decides how the asset is hashed, + // format required here (can't be guessed). + const std::string resolved_format = detail::resolve_format(format); CppIStream main_wrapper(stream); CppIStream fragment_wrapper(fragment); @@ -206,7 +206,7 @@ namespace c2pa // *this is returned for chaining so reading can go through all segments. C2paReader* updated = c2pa_reader_with_fragment( c2pa_reader, - resolved.c_str(), + resolved_format.c_str(), main_wrapper.c_stream, fragment_wrapper.c_stream); c2pa_reader = nullptr; @@ -220,10 +220,10 @@ namespace c2pa Reader::Reader(const std::string &format, std::istream &stream) { - const std::string resolved = detail::normalize_format(format); + const std::string resolved_format = detail::normalize_format(format); cpp_stream = std::make_unique(stream); - c2pa_reader = c2pa_reader_from_stream(resolved.c_str(), cpp_stream->c_stream); + c2pa_reader = c2pa_reader_from_stream(resolved_format.c_str(), cpp_stream->c_stream); if (c2pa_reader == nullptr) { throw C2paException(); From a7560dfbb87ea85a991f8a80d52e021f0f810640 Mon Sep 17 00:00:00 2001 From: Tania Mathern Date: Wed, 29 Jul 2026 11:52:58 -0700 Subject: [PATCH 19/27] fix: Refact 1 --- src/c2pa_builder.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/c2pa_builder.cpp b/src/c2pa_builder.cpp index 29d07c9a..92057d61 100644 --- a/src/c2pa_builder.cpp +++ b/src/c2pa_builder.cpp @@ -222,7 +222,7 @@ namespace c2pa std::vector Builder::sign(const std::string &format, std::istream &source, std::ostream &dest, Signer &signer) { - const std::string resolved_format = detail::resolve_format(format); + const std::string resolved_format = detail::normalize_format(format); // Caller's source/dest streams must outlive this call // Stream wrappers are stack locals that wrap the caller's streams @@ -237,7 +237,7 @@ namespace c2pa std::vector Builder::sign(const std::string &format, std::istream &source, std::iostream &dest, Signer &signer) { - const std::string resolved_format = detail::resolve_format(format); + const std::string resolved_format = detail::normalize_format(format); // Caller's source/dest streams must outlive this call // Stream wrappers are stack locals that wrap the caller's streams @@ -283,7 +283,7 @@ namespace c2pa std::vector Builder::sign(const std::string &format, std::istream &source, std::iostream &dest) { - const std::string resolved_format = detail::resolve_format(format); + const std::string resolved_format = detail::normalize_format(format); CppIStream c_source(source); CppIOStream c_dest(dest); @@ -396,7 +396,7 @@ namespace c2pa std::vector Builder::data_hashed_placeholder(uintptr_t reserve_size, const std::string &format) { - const std::string resolved_format = detail::resolve_format(format); + const std::string resolved_format = detail::normalize_format(format); const unsigned char *c2pa_manifest_bytes = nullptr; auto result = c2pa_builder_data_hashed_placeholder(builder, reserve_size, resolved_format.c_str(), &c2pa_manifest_bytes); @@ -405,7 +405,7 @@ namespace c2pa std::vector Builder::sign_data_hashed_embeddable(Signer &signer, const std::string &data_hash, const std::string &format, std::istream *asset) { - const std::string resolved_format = detail::resolve_format(format); + const std::string resolved_format = detail::normalize_format(format); int64_t result; const unsigned char *c2pa_manifest_bytes = nullptr; @@ -436,7 +436,7 @@ namespace c2pa std::vector Builder::placeholder(const std::string &format) { // The format selects the hash assertion written into the builder. - const std::string resolved_format = detail::resolve_format(format); + const std::string resolved_format = detail::normalize_format(format); const unsigned char *c2pa_manifest_bytes = nullptr; auto result = c2pa_builder_placeholder(builder, resolved_format.c_str(), &c2pa_manifest_bytes); @@ -475,7 +475,7 @@ namespace c2pa std::vector Builder::sign_embeddable(const std::string &format) { - const std::string resolved_format = detail::resolve_format(format); + const std::string resolved_format = detail::normalize_format(format); const unsigned char *c2pa_manifest_bytes = nullptr; auto result = c2pa_builder_sign_embeddable(builder, resolved_format.c_str(), &c2pa_manifest_bytes); @@ -484,7 +484,7 @@ namespace c2pa std::vector Builder::format_embeddable(const std::string &format, std::vector &data) { - const std::string resolved_format = detail::resolve_format(format); + const std::string resolved_format = detail::normalize_format(format); const unsigned char *c2pa_manifest_bytes = nullptr; auto result = c2pa_format_embeddable(resolved_format.c_str(), data.data(), data.size(), &c2pa_manifest_bytes); From a123fc3f4247486fc958374aeca8932a0fb5ec4b Mon Sep 17 00:00:00 2001 From: Tania Mathern Date: Wed, 29 Jul 2026 11:59:18 -0700 Subject: [PATCH 20/27] fix: Refact 1 --- src/c2pa_builder.cpp | 34 +++++++++++++++++----------------- src/c2pa_reader.cpp | 8 ++++---- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/src/c2pa_builder.cpp b/src/c2pa_builder.cpp index 92057d61..2b8eec73 100644 --- a/src/c2pa_builder.cpp +++ b/src/c2pa_builder.cpp @@ -222,7 +222,7 @@ namespace c2pa std::vector Builder::sign(const std::string &format, std::istream &source, std::ostream &dest, Signer &signer) { - const std::string resolved_format = detail::normalize_format(format); + const std::string normalized_format = detail::normalize_format(format); // Caller's source/dest streams must outlive this call // Stream wrappers are stack locals that wrap the caller's streams @@ -231,13 +231,13 @@ namespace c2pa const unsigned char *c2pa_manifest_bytes = nullptr; // c2pa_builder_sign() uses streams synchronously and completes before returning - auto result = c2pa_builder_sign(builder, resolved_format.c_str(), c_source.c_stream, c_dest.c_stream, signer.c2pa_signer(), &c2pa_manifest_bytes); + auto result = c2pa_builder_sign(builder, normalized_format.c_str(), c_source.c_stream, c_dest.c_stream, signer.c2pa_signer(), &c2pa_manifest_bytes); return detail::to_byte_vector(c2pa_manifest_bytes, result); } std::vector Builder::sign(const std::string &format, std::istream &source, std::iostream &dest, Signer &signer) { - const std::string resolved_format = detail::normalize_format(format); + const std::string normalized_format = detail::normalize_format(format); // Caller's source/dest streams must outlive this call // Stream wrappers are stack locals that wrap the caller's streams @@ -246,7 +246,7 @@ namespace c2pa const unsigned char *c2pa_manifest_bytes = nullptr; // c2pa_builder_sign() uses streams synchronously and completes before returning - auto result = c2pa_builder_sign(builder, resolved_format.c_str(), c_source.c_stream, c_dest.c_stream, signer.c2pa_signer(), &c2pa_manifest_bytes); + auto result = c2pa_builder_sign(builder, normalized_format.c_str(), c_source.c_stream, c_dest.c_stream, signer.c2pa_signer(), &c2pa_manifest_bytes); return detail::to_byte_vector(c2pa_manifest_bytes, result); } @@ -283,13 +283,13 @@ namespace c2pa std::vector Builder::sign(const std::string &format, std::istream &source, std::iostream &dest) { - const std::string resolved_format = detail::normalize_format(format); + const std::string normalized_format = detail::normalize_format(format); CppIStream c_source(source); CppIOStream c_dest(dest); const unsigned char *c2pa_manifest_bytes = nullptr; - auto result = c2pa_builder_sign_context(builder, resolved_format.c_str(), c_source.c_stream, c_dest.c_stream, &c2pa_manifest_bytes); + auto result = c2pa_builder_sign_context(builder, normalized_format.c_str(), c_source.c_stream, c_dest.c_stream, &c2pa_manifest_bytes); return detail::to_byte_vector(c2pa_manifest_bytes, result); } @@ -396,27 +396,27 @@ namespace c2pa std::vector Builder::data_hashed_placeholder(uintptr_t reserve_size, const std::string &format) { - const std::string resolved_format = detail::normalize_format(format); + const std::string normalized_format = detail::normalize_format(format); const unsigned char *c2pa_manifest_bytes = nullptr; - auto result = c2pa_builder_data_hashed_placeholder(builder, reserve_size, resolved_format.c_str(), &c2pa_manifest_bytes); + auto result = c2pa_builder_data_hashed_placeholder(builder, reserve_size, normalized_format.c_str(), &c2pa_manifest_bytes); return detail::to_byte_vector(c2pa_manifest_bytes, result); } std::vector Builder::sign_data_hashed_embeddable(Signer &signer, const std::string &data_hash, const std::string &format, std::istream *asset) { - const std::string resolved_format = detail::normalize_format(format); + const std::string normalized_format = detail::normalize_format(format); int64_t result; const unsigned char *c2pa_manifest_bytes = nullptr; if (asset) { CppIStream c_asset(*asset); - result = c2pa_builder_sign_data_hashed_embeddable(builder, signer.c2pa_signer(), data_hash.c_str(), resolved_format.c_str(), c_asset.c_stream, &c2pa_manifest_bytes); + result = c2pa_builder_sign_data_hashed_embeddable(builder, signer.c2pa_signer(), data_hash.c_str(), normalized_format.c_str(), c_asset.c_stream, &c2pa_manifest_bytes); } else { - result = c2pa_builder_sign_data_hashed_embeddable(builder, signer.c2pa_signer(), data_hash.c_str(), resolved_format.c_str(), nullptr, &c2pa_manifest_bytes); + result = c2pa_builder_sign_data_hashed_embeddable(builder, signer.c2pa_signer(), data_hash.c_str(), normalized_format.c_str(), nullptr, &c2pa_manifest_bytes); } return detail::to_byte_vector(c2pa_manifest_bytes, result); } @@ -436,10 +436,10 @@ namespace c2pa std::vector Builder::placeholder(const std::string &format) { // The format selects the hash assertion written into the builder. - const std::string resolved_format = detail::normalize_format(format); + const std::string normalized_format = detail::normalize_format(format); const unsigned char *c2pa_manifest_bytes = nullptr; - auto result = c2pa_builder_placeholder(builder, resolved_format.c_str(), &c2pa_manifest_bytes); + auto result = c2pa_builder_placeholder(builder, normalized_format.c_str(), &c2pa_manifest_bytes); return detail::to_byte_vector(c2pa_manifest_bytes, result); } @@ -475,19 +475,19 @@ namespace c2pa std::vector Builder::sign_embeddable(const std::string &format) { - const std::string resolved_format = detail::normalize_format(format); + const std::string normalized_format = detail::normalize_format(format); const unsigned char *c2pa_manifest_bytes = nullptr; - auto result = c2pa_builder_sign_embeddable(builder, resolved_format.c_str(), &c2pa_manifest_bytes); + auto result = c2pa_builder_sign_embeddable(builder, normalized_format.c_str(), &c2pa_manifest_bytes); return detail::to_byte_vector(c2pa_manifest_bytes, result); } std::vector Builder::format_embeddable(const std::string &format, std::vector &data) { - const std::string resolved_format = detail::normalize_format(format); + const std::string normalized_format = detail::normalize_format(format); const unsigned char *c2pa_manifest_bytes = nullptr; - auto result = c2pa_format_embeddable(resolved_format.c_str(), data.data(), data.size(), &c2pa_manifest_bytes); + auto result = c2pa_format_embeddable(normalized_format.c_str(), data.data(), data.size(), &c2pa_manifest_bytes); return detail::to_byte_vector(c2pa_manifest_bytes, result); } diff --git a/src/c2pa_reader.cpp b/src/c2pa_reader.cpp index a4daefc9..3ba422ef 100644 --- a/src/c2pa_reader.cpp +++ b/src/c2pa_reader.cpp @@ -46,7 +46,7 @@ namespace c2pa throw C2paException("Invalid Context provider IContextProvider"); } - const std::string resolved_format = detail::normalize_format(format); + const std::string normalized_format = detail::normalize_format(format); // Create the stream wrapper before the reader handle cpp_stream = std::make_unique(stream); @@ -58,7 +58,7 @@ namespace c2pa // Update reader with stream. // Note: c2pa_reader_with_stream consumes the reader pointer. - C2paReader* updated = c2pa_reader_with_stream(c2pa_reader, resolved_format.c_str(), cpp_stream->c_stream); + C2paReader* updated = c2pa_reader_with_stream(c2pa_reader, normalized_format.c_str(), cpp_stream->c_stream); c2pa_reader = nullptr; if (updated == nullptr) { throw C2paException(); @@ -220,10 +220,10 @@ namespace c2pa Reader::Reader(const std::string &format, std::istream &stream) { - const std::string resolved_format = detail::normalize_format(format); + const std::string normalized_format = detail::normalize_format(format); cpp_stream = std::make_unique(stream); - c2pa_reader = c2pa_reader_from_stream(resolved_format.c_str(), cpp_stream->c_stream); + c2pa_reader = c2pa_reader_from_stream(normalized_format.c_str(), cpp_stream->c_stream); if (c2pa_reader == nullptr) { throw C2paException(); From 0a97981b9a14e7548466c376db4be703c0838c83 Mon Sep 17 00:00:00 2001 From: Tania Mathern Date: Wed, 29 Jul 2026 12:21:45 -0700 Subject: [PATCH 21/27] fix: Refactor --- src/c2pa_reader.cpp | 13 ++++++----- tests/embeddable.test.cpp | 27 +-------------------- tests/reader.test.cpp | 49 ++++++++++++++++++++++++++++++++------- 3 files changed, 49 insertions(+), 40 deletions(-) diff --git a/src/c2pa_reader.cpp b/src/c2pa_reader.cpp index 3ba422ef..3faff774 100644 --- a/src/c2pa_reader.cpp +++ b/src/c2pa_reader.cpp @@ -113,9 +113,8 @@ namespace c2pa throw C2paException("manifest_jumbf must not be empty"); } - // The container type decides how the asset is hashed, - // format required here (can't be guessed). - const std::string resolved_format = detail::resolve_format(format); + // The format is a hint for hash verification against the supplied manifest. + const std::string normalized_format = detail::normalize_format(format); cpp_stream = std::make_unique(image_stream); @@ -127,7 +126,7 @@ namespace c2pa // c2pa_reader_with_manifest_data_and_stream always consumes c2pa_reader. C2paReader* updated = c2pa_reader_with_manifest_data_and_stream( c2pa_reader, - resolved_format.c_str(), + normalized_format.c_str(), cpp_stream->c_stream, manifest_jumbf.data(), manifest_jumbf.size()); @@ -195,8 +194,10 @@ namespace c2pa { ensure_initialized(); - // The container type decides how the asset is hashed, - // format required here (can't be guessed). + // Validate the format before the FFI call below, + // which consumes (frees) the current reader handle. + // The core rejects a blank format, but only after taking ownership of the reader, + // leaving the Reader in an unusable state. const std::string resolved_format = detail::resolve_format(format); CppIStream main_wrapper(stream); diff --git a/tests/embeddable.test.cpp b/tests/embeddable.test.cpp index 578dd2e9..ddafff8b 100644 --- a/tests/embeddable.test.cpp +++ b/tests/embeddable.test.cpp @@ -653,9 +653,8 @@ TEST_F(EmbeddableTest, DirectEmbeddingWithFormat) { << "Direct JPEG format output matches placeholder size"; } -// The format selects the hash binding, so the embeddable workflow requires one. - class EmbeddableBlankFormatTest : public EmbeddableTest, public ::testing::WithParamInterface {}; +// needs_placeholder() and update_hash_from_stream() are the only embeddable steps when the core is silent on a blank format. INSTANTIATE_TEST_SUITE_P(EmbeddableBlankFormats, EmbeddableBlankFormatTest, ::testing::ValuesIn(c2pa_test::kBlankFormats)); @@ -665,20 +664,6 @@ TEST_P(EmbeddableBlankFormatTest, NeedsPlaceholderRejectsBlankFormat) { EXPECT_THROW({ builder.needs_placeholder(GetParam()); }, c2pa::C2paException); } -TEST_P(EmbeddableBlankFormatTest, PlaceholderRejectsBlankFormat) { - auto builder = make_builder(); - EXPECT_THROW({ builder.placeholder(GetParam()); }, c2pa::C2paException); -} - -TEST_F(EmbeddableTest, DataHashedPlaceholderRejectsBlankFormat) { - auto signer = c2pa_test::create_test_signer(); - auto builder = make_builder(); - EXPECT_THROW({ builder.data_hashed_placeholder(signer.reserve_size(), ""); }, - c2pa::C2paException); - EXPECT_THROW({ builder.data_hashed_placeholder(signer.reserve_size(), " "); }, - c2pa::C2paException); -} - TEST_F(EmbeddableTest, UpdateHashFromStreamRejectsBlankFormat) { auto builder = make_builder(); std::ifstream asset(c2pa_test::get_fixture_path("A.jpg"), std::ios::binary); @@ -686,16 +671,6 @@ TEST_F(EmbeddableTest, UpdateHashFromStreamRejectsBlankFormat) { EXPECT_THROW({ builder.update_hash_from_stream("", asset); }, c2pa::C2paException); } -TEST_F(EmbeddableTest, SignEmbeddableRejectsBlankFormat) { - auto builder = make_builder(); - EXPECT_THROW({ builder.sign_embeddable(""); }, c2pa::C2paException); -} - -TEST_F(EmbeddableTest, FormatEmbeddableRejectsBlankFormat) { - std::vector data{0x01, 0x02, 0x03}; - EXPECT_THROW({ c2pa::Builder::format_embeddable("", data); }, c2pa::C2paException); -} - TEST_F(EmbeddableTest, EmbeddableStepsRejectUnsupportedFormat) { std::vector data{0x01, 0x02, 0x03}; EXPECT_THROW({ c2pa::Builder::format_embeddable("application/zip", data); }, diff --git a/tests/reader.test.cpp b/tests/reader.test.cpp index 3c55445b..f3250117 100644 --- a/tests/reader.test.cpp +++ b/tests/reader.test.cpp @@ -1271,20 +1271,53 @@ TEST_F(ReaderTest, SvgWithEmptyFormatIsNotAManifestLookupFailure) { EXPECT_NE(explicit_msg, detected_msg); } -TEST_F(ReaderTest, ReaderSidecarEmptyFormatThrows) { - // External manifest data is always matched against the named format. - std::string bytes = fixture_bytes("C.jpg"); - std::vector manifest{0x01, 0x02, 0x03}; +TEST_F(ReaderTest, ReaderSidecarBlankFormatReadsValidManifest) { + // A sidecar (external) manifest is parsed from the supplied bytes, not from the + // container, so the format is only a verification hint. The core accepts a blank + // format here, yielding the same result as naming it, so the binding does not + // reject one. + auto signer = c2pa_test::create_test_signer(); + auto manifest = c2pa_test::read_text_file(c2pa_test::get_fixture_path("training.json")); auto ctx = std::make_shared(); - for (const std::string& blank : {std::string(""), std::string(" ")}) { - std::istringstream stream(bytes, std::ios::binary); - EXPECT_THROW({ c2pa::Reader reader(ctx, blank, stream, manifest); }, - c2pa::C2paException); + // Produce a valid sidecar manifest over A.jpg (no_embed returns the JUMBF bytes). + c2pa::Builder builder(manifest); + builder.set_no_embed(); + std::ifstream src(c2pa_test::get_fixture_path("A.jpg"), std::ios::binary); + ASSERT_TRUE(src.is_open()); + std::stringstream signed_dest(std::ios::in | std::ios::out | std::ios::binary); + std::vector manifest_bytes = builder.sign("image/jpeg", src, signed_dest, signer); + ASSERT_FALSE(manifest_bytes.empty()); + std::vector jumbf(manifest_bytes.begin(), manifest_bytes.end()); + + const std::string asset = fixture_bytes("A.jpg"); + + std::string named_json; + { + std::istringstream stream(asset, std::ios::binary); + c2pa::Reader reader(ctx, "image/jpeg", stream, jumbf); + named_json = reader.json(); + EXPECT_FALSE(named_json.empty()); } + + std::string blank_json; + { + std::istringstream stream(asset, std::ios::binary); + c2pa::Reader reader(ctx, "", stream, jumbf); // blank format accepted + blank_json = reader.json(); + EXPECT_FALSE(blank_json.empty()); + } + + // Same manifest and asset: naming the format or not is indistinguishable. + EXPECT_EQ(json::parse(named_json)["active_manifest"], + json::parse(blank_json)["active_manifest"]); } TEST_F(ReaderTest, WithFragmentEmptyFormatThrows) { + // with_fragment rejects a blank format. The core would reject it too, but only + // after c2pa_reader_with_fragment() has consumed (freed) the reader handle, which + // would leave this Reader unusable. The binding validates the format first, so a + // rejected append leaves the reader intact for later calls (asserted below). auto ctx = std::make_shared(); std::ifstream init(c2pa_test::get_fixture_path("dashinit.mp4"), std::ios::binary); ASSERT_TRUE(init.is_open()); From c14e106a56a42c0faea0742470d3b841b0b65057 Mon Sep 17 00:00:00 2001 From: Tania Mathern Date: Wed, 29 Jul 2026 12:23:55 -0700 Subject: [PATCH 22/27] fix: Refactor --- tests/reader.test.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/tests/reader.test.cpp b/tests/reader.test.cpp index f3250117..89061e90 100644 --- a/tests/reader.test.cpp +++ b/tests/reader.test.cpp @@ -1272,10 +1272,8 @@ TEST_F(ReaderTest, SvgWithEmptyFormatIsNotAManifestLookupFailure) { } TEST_F(ReaderTest, ReaderSidecarBlankFormatReadsValidManifest) { - // A sidecar (external) manifest is parsed from the supplied bytes, not from the - // container, so the format is only a verification hint. The core accepts a blank - // format here, yielding the same result as naming it, so the binding does not - // reject one. + // A sidecar (external) manifest is parsed from the supplied bytes, not from the container. + // The core accepts a blank format here too. auto signer = c2pa_test::create_test_signer(); auto manifest = c2pa_test::read_text_file(c2pa_test::get_fixture_path("training.json")); auto ctx = std::make_shared(); @@ -1288,6 +1286,7 @@ TEST_F(ReaderTest, ReaderSidecarBlankFormatReadsValidManifest) { std::stringstream signed_dest(std::ios::in | std::ios::out | std::ios::binary); std::vector manifest_bytes = builder.sign("image/jpeg", src, signed_dest, signer); ASSERT_FALSE(manifest_bytes.empty()); + // Use those re-read bytes directly std::vector jumbf(manifest_bytes.begin(), manifest_bytes.end()); const std::string asset = fixture_bytes("A.jpg"); From 5856400be00e404bb6f19c617c046264bf37c6ce Mon Sep 17 00:00:00 2001 From: Tania Mathern Date: Wed, 29 Jul 2026 12:58:16 -0700 Subject: [PATCH 23/27] fix: Refact 1 --- tests/reader.test.cpp | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/tests/reader.test.cpp b/tests/reader.test.cpp index 89061e90..4852d8f3 100644 --- a/tests/reader.test.cpp +++ b/tests/reader.test.cpp @@ -1312,6 +1312,37 @@ TEST_F(ReaderTest, ReaderSidecarBlankFormatReadsValidManifest) { json::parse(blank_json)["active_manifest"]); } +TEST_F(ReaderTest, ReaderBmffSidecarBlankFormatMatchesNamed) { + // BMFF hash verification is self-describing. + auto signer = c2pa_test::create_test_signer(); + auto manifest = c2pa_test::read_text_file(c2pa_test::get_fixture_path("training.json")); + auto ctx = std::make_shared(); + + c2pa::Builder builder(manifest); + builder.set_no_embed(); + std::ifstream src(c2pa_test::get_fixture_path("video1.mp4"), std::ios::binary); + ASSERT_TRUE(src.is_open()); + std::stringstream signed_dest(std::ios::in | std::ios::out | std::ios::binary); + std::vector manifest_bytes = builder.sign("video/mp4", src, signed_dest, signer); + ASSERT_FALSE(manifest_bytes.empty()); + std::vector jumbf(manifest_bytes.begin(), manifest_bytes.end()); + + const std::string asset = fixture_bytes("video1.mp4"); + + auto read_state = [&](const std::string& fmt) { + std::istringstream stream(asset, std::ios::binary); + c2pa::Reader reader(ctx, fmt, stream, jumbf); + auto j = json::parse(reader.json()); + return std::make_pair(j.value("validation_state", std::string("")), + j.value("active_manifest", std::string(""))); + }; + + std::pair blank; + // Verify we can read both, with and without format + EXPECT_NO_THROW({ blank = read_state(""); }); + EXPECT_EQ(blank, read_state("video/mp4")); +} + TEST_F(ReaderTest, WithFragmentEmptyFormatThrows) { // with_fragment rejects a blank format. The core would reject it too, but only // after c2pa_reader_with_fragment() has consumed (freed) the reader handle, which From 3f5914f97ae1749c99e9ffe831e2c524b97f8b55 Mon Sep 17 00:00:00 2001 From: Tania Mathern Date: Wed, 29 Jul 2026 13:24:12 -0700 Subject: [PATCH 24/27] fix: Pruned tests --- tests/builder.test.cpp | 198 ----------------------------------------- 1 file changed, 198 deletions(-) diff --git a/tests/builder.test.cpp b/tests/builder.test.cpp index 8db2bb1f..f6b58110 100644 --- a/tests/builder.test.cpp +++ b/tests/builder.test.cpp @@ -7530,37 +7530,6 @@ TEST_P(BuilderBlankFormatTest, SignRejectsBlankFormat) { EXPECT_THROW({ builder.sign(GetParam(), source, dest, signer); }, c2pa::C2paException); } -TEST_F(BuilderTest, SignBlankAndEmptyFormatsReportTheSameMessage) { - auto signer = c2pa_test::create_test_signer(); - - auto collect_message = [&](const std::string& format) { - auto builder = make_builder(); - std::ifstream source(c2pa_test::get_fixture_path("A.jpg"), std::ios::binary); - EXPECT_TRUE(source.is_open()); - std::stringstream dest(std::ios::in | std::ios::out | std::ios::binary); - try { - builder.sign(format, source, dest, signer); - return std::string(""); - } catch (const c2pa::C2paException& e) { - return std::string(e.what()); - } - }; - - const std::string from_empty = collect_message(""); - EXPECT_NE(from_empty, ""); - EXPECT_EQ(from_empty, collect_message(" ")); -} - -TEST_F(BuilderTest, SignToExtensionlessDestinationThrows) { - auto signer = c2pa_test::create_test_signer(); - auto builder = make_builder(); - fs::path dest = get_temp_path("signed-noext"); - - EXPECT_THROW( - { builder.sign(c2pa_test::get_fixture_path("A.jpg"), dest, signer); }, - c2pa::C2paException); -} - TEST_F(BuilderTest, SignDoesNotTruncateDestinationWhenFormatIsRejected) { // The destination opens with trunc, so the format is checked before it. auto signer = c2pa_test::create_test_signer(); @@ -7585,18 +7554,6 @@ TEST_F(BuilderTest, SignDoesNotTruncateDestinationWhenFormatIsRejected) { EXPECT_EQ(after.str(), original); } -TEST_F(BuilderTest, SignTrimsPaddedFormat) { - // Trim stray whitespaces in format. - auto signer = c2pa_test::create_test_signer(); - auto builder = make_builder(); - - std::ifstream source(c2pa_test::get_fixture_path("A.jpg"), std::ios::binary); - ASSERT_TRUE(source.is_open()); - std::stringstream dest(std::ios::in | std::ios::out | std::ios::binary); - - EXPECT_NO_THROW({ builder.sign(" \t image/jpeg \n ", source, dest, signer); }); -} - TEST_F(BuilderTest, SignWithUnsupportedFormatThrows) { auto signer = c2pa_test::create_test_signer(); auto builder = make_builder(); @@ -7609,57 +7566,6 @@ TEST_F(BuilderTest, SignWithUnsupportedFormatThrows) { c2pa::C2paException); } -TEST_F(BuilderTest, SignRejectsReadOnlyFormat) { - // Signing validates against the writable formats. - const auto readable = c2pa::Reader::supported_mime_types(); - const auto writable = c2pa::Builder::supported_mime_types(); - - std::string read_only; - for (const auto& format : readable) { - if (std::find(writable.begin(), writable.end(), format) == writable.end()) { - read_only = format; - break; - } - } - if (read_only.empty()) { - GTEST_SKIP() << "Every readable format is also writable"; - } - - auto signer = c2pa_test::create_test_signer(); - auto builder = make_builder(); - std::ifstream source(c2pa_test::get_fixture_path("A.jpg"), std::ios::binary); - ASSERT_TRUE(source.is_open()); - std::stringstream dest(std::ios::in | std::ios::out | std::ios::binary); - - EXPECT_THROW({ builder.sign(read_only, source, dest, signer); }, c2pa::C2paException); -} - -TEST_F(BuilderTest, SignMessageNamesFormatNotPath) { - auto signer = c2pa_test::create_test_signer(); - auto builder = make_builder(); - fs::path dest = get_temp_path("message-probe-noext"); - - try { - builder.sign(c2pa_test::get_fixture_path("A.jpg"), dest, signer); - FAIL() << "Expected an extensionless destination to be rejected"; - } catch (const c2pa::C2paException& e) { - const std::string msg = e.what(); - EXPECT_EQ(msg.find(dest.string()), std::string::npos) << msg; - EXPECT_EQ(msg.find("message-probe-noext"), std::string::npos) << msg; - } -} - -TEST_F(BuilderTest, AddIngredientAcceptsBlankFormat) { - auto builder = make_builder(); - const std::string json = R"({"title": "A.jpg", "relationship": "componentOf"})"; - - for (const std::string& blank : {std::string(""), std::string(" ")}) { - std::ifstream src(c2pa_test::get_fixture_path("A.jpg"), std::ios::binary); - ASSERT_TRUE(src.is_open()); - EXPECT_NO_THROW({ builder.add_ingredient(json, blank, src); }); - } -} - TEST_F(BuilderTest, AddIngredientAcceptsUnknownFormat) { auto builder = make_builder(); const std::string json = R"({"title": "A.jpg", "relationship": "componentOf"})"; @@ -7671,29 +7577,6 @@ TEST_F(BuilderTest, AddIngredientAcceptsUnknownFormat) { } } -TEST_F(BuilderTest, AddIngredientAcceptsReadOnlyFormat) { - const auto readable = c2pa::Reader::supported_mime_types(); - const auto writable = c2pa::Builder::supported_mime_types(); - - std::string read_only; - for (const auto& format : readable) { - if (std::find(writable.begin(), writable.end(), format) == writable.end()) { - read_only = format; - break; - } - } - if (read_only.empty()) { - GTEST_SKIP() << "Every readable format is also writable"; - } - - auto builder = make_builder(); - std::ifstream src(c2pa_test::get_fixture_path("A.jpg"), std::ios::binary); - ASSERT_TRUE(src.is_open()); - EXPECT_NO_THROW({ - builder.add_ingredient(R"({"title": "A.jpg", "relationship": "componentOf"})", read_only, src); - }) << "read-only format: " << read_only; -} - TEST_F(BuilderTest, AddIngredientFromExtensionlessPath) { auto builder = make_builder(); fs::path ingredient = get_temp_path("ingredient-noext"); @@ -7724,42 +7607,6 @@ TEST_F(BuilderTest, AddIngredientFromPathWithUnknownExtension) { { builder.add_ingredient(R"({"title": "A.jpg", "relationship": "componentOf"})", ingredient); }); } -TEST_F(BuilderTest, AcceptsSupportedBareExtension) { - auto signer = c2pa_test::create_test_signer(); - auto builder = make_builder(); - - std::ifstream source(c2pa_test::get_fixture_path("A.jpg"), std::ios::binary); - ASSERT_TRUE(source.is_open()); - std::stringstream dest(std::ios::in | std::ios::out | std::ios::binary); - - EXPECT_NO_THROW({ builder.sign("jpg", source, dest, signer); }); -} - -TEST_F(BuilderTest, ArchiveWithEmptyFormatThrows) { - // A c2pa archive carries no signature that identifies the format it came for/from, - // so reading one back requires naming the format. - auto builder = make_builder(); - builder.add_ingredient(R"({"title": "C.jpg", "relationship": "componentOf"})", - c2pa_test::get_fixture_path("C.jpg")); - - std::ostringstream archive_out(std::ios::binary); - ASSERT_NO_THROW(builder.to_archive(archive_out)); - const std::string archive_bytes = archive_out.str(); - ASSERT_FALSE(archive_bytes.empty()); - - { // Control: naming the format works. - std::istringstream in(archive_bytes, std::ios::binary); - auto ctx = std::make_shared(); - c2pa::Reader reader(ctx, "application/c2pa", in); - EXPECT_FALSE(reader.json().empty()); - } - { // Same bytes, no format: the container cannot be identified. - std::istringstream in(archive_bytes, std::ios::binary); - auto ctx = std::make_shared(); - EXPECT_THROW({ c2pa::Reader reader(ctx, "", in); }, c2pa::C2paException); - } -} - TEST_F(BuilderTest, SignProducesEquivalentManifestForEverySpelling) { auto signer = c2pa_test::create_test_signer(); @@ -7813,48 +7660,3 @@ TEST_F(BuilderTest, SidecarSignAcceptsUnknownFormat) { EXPECT_FALSE(manifest.empty()) << "format: " << format; } } - -// The boundary this binding enforces: a blank format is rejected wherever the -// library would otherwise misclassify it, and nothing else is second-guessed. -// Tightening the lax paths or loosening the strict ones fails one of these. - -TEST_F(BuilderTest, BlankFormatRejectedWhereItWouldMisclassify) { - auto signer = c2pa_test::create_test_signer(); - - for (const auto& blank : c2pa_test::kBlankFormats) { - auto builder = make_builder(); - EXPECT_THROW({ builder.needs_placeholder(blank); }, c2pa::C2paException) - << "needs_placeholder accepted a blank format"; - EXPECT_THROW({ builder.placeholder(blank); }, c2pa::C2paException) - << "placeholder accepted a blank format"; - - std::ifstream source(c2pa_test::get_fixture_path("A.jpg"), std::ios::binary); - ASSERT_TRUE(source.is_open()); - std::stringstream dest(std::ios::in | std::ios::out | std::ios::binary); - EXPECT_THROW({ builder.sign(blank, source, dest, signer); }, c2pa::C2paException) - << "sign accepted a blank format"; - } -} - -TEST_F(BuilderTest, LaxPathsAcceptWhatTheLibraryAccepts) { - const auto readable = c2pa::Reader::supported_mime_types(); - const auto writable = c2pa::Builder::supported_mime_types(); - - std::vector formats{"application/zip", "zzz", "", " "}; - for (const auto& format : readable) { - if (std::find(writable.begin(), writable.end(), format) == writable.end()) { - formats.push_back(format); - break; - } - } - - auto builder = make_builder(); - for (const auto& format : formats) { - std::ifstream source(c2pa_test::get_fixture_path("A.jpg"), std::ios::binary); - ASSERT_TRUE(source.is_open()); - EXPECT_NO_THROW({ - builder.add_ingredient(R"({"title": "A.jpg", "relationship": "componentOf"})", - format, source); - }) << "add_ingredient rejected format: " << format; - } -} From 8330a1f03078c6583f69b528a5505f97bd86c823 Mon Sep 17 00:00:00 2001 From: Tania Mathern Date: Wed, 29 Jul 2026 13:28:29 -0700 Subject: [PATCH 25/27] fix: Refactor tests --- tests/reader.test.cpp | 197 ------------------------------------------ 1 file changed, 197 deletions(-) diff --git a/tests/reader.test.cpp b/tests/reader.test.cpp index 4852d8f3..26cc459d 100644 --- a/tests/reader.test.cpp +++ b/tests/reader.test.cpp @@ -898,18 +898,6 @@ INSTANTIATE_TEST_SUITE_P( std::make_tuple("\r\n", "C.jpg", "C.jpg"), std::make_tuple("\v\f", "C.jpg", "C.jpg"))); -TEST_P(BlankFormatDetectionTest, ResolvesFormatFromContent) { - const auto& [format, filename, expected_content] = GetParam(); - auto path = c2pa_test::get_fixture_path(filename); - ASSERT_TRUE(fs::exists(path)) << "Test file does not exist: " << path; - - std::ifstream file(path, std::ios::binary); - ASSERT_TRUE(file.is_open()) << "Failed to open file: " << path; - - c2pa::Reader reader(format, file); - EXPECT_NE(reader.json().find(expected_content), std::string::npos); -} - TEST_P(BlankFormatDetectionTest, ResolvesFormatOnSharedContext) { const auto& [format, filename, expected_content] = GetParam(); std::string bytes = fixture_bytes(filename); @@ -942,16 +930,6 @@ TEST_F(ReaderTest, WrongButSupportedExtensionDefersToContent) { EXPECT_NE(reader.json().find("C.jpg"), std::string::npos); } -TEST_F(ReaderTest, EmptyFormatRewindsPreSeekedStream) { - std::string bytes = fixture_bytes("C.jpg"); - std::istringstream stream(bytes, std::ios::binary); - stream.seekg(4096); - ASSERT_EQ(stream.tellg(), 4096); - - c2pa::Reader reader("", stream); - EXPECT_NE(reader.json().find("C.jpg"), std::string::npos); -} - TEST_F(ReaderTest, EmptyFormatMatchesExplicitFormatJson) { std::string bytes = fixture_bytes("C.jpg"); @@ -968,35 +946,12 @@ TEST_F(ReaderTest, EmptyFormatMatchesExplicitFormatJson) { EXPECT_EQ(detected.is_embedded(), explicitly.is_embedded()); } -TEST_F(ReaderTest, WrongMimeHintIsCorrectedByContent) { - std::string bytes = fixture_bytes("C.jpg"); - std::istringstream stream(bytes, std::ios::binary); - - c2pa::Reader reader("image/png", stream); - EXPECT_NE(reader.json().find("C.jpg"), std::string::npos); -} - TEST_F(ReaderTest, DngExtensionWithJpegContentIsCorrected) { fs::path mislabeled = copy_fixture_to("C.jpg", "detect-mislabeled.dng"); c2pa::Reader reader(mislabeled); EXPECT_NE(reader.json().find("C.jpg"), std::string::npos); } -TEST_F(ReaderTest, WhitespaceFormatMatchesEmptyFormatJson) { - std::string bytes = fixture_bytes("C.jpg"); - - std::istringstream empty_stream(bytes, std::ios::binary); - c2pa::Reader from_empty("", empty_stream); - - std::istringstream ws_stream(bytes, std::ios::binary); - c2pa::Reader from_whitespace("\t\n ", ws_stream); - - auto a = json::parse(from_empty.json()); - auto b = json::parse(from_whitespace.json()); - EXPECT_EQ(a["active_manifest"], b["active_manifest"]); - EXPECT_EQ(a["manifests"].size(), b["manifests"].size()); -} - TEST_F(ReaderTest, WhitespaceFormatFromAssetReturnsReader) { std::string bytes = fixture_bytes("C.jpg"); std::istringstream stream(bytes, std::ios::binary); @@ -1007,43 +962,6 @@ TEST_F(ReaderTest, WhitespaceFormatFromAssetReturnsReader) { EXPECT_NE(reader->json().find("C.jpg"), std::string::npos); } -TEST_F(ReaderTest, WhitespaceFormatFromAssetUnsignedReturnsNullopt) { - // Reachable only if detection ran, since an unidentified container throws. - std::string bytes = fixture_bytes("A.jpg"); - std::istringstream stream(bytes, std::ios::binary); - auto ctx = std::make_shared(); - - auto reader = c2pa::Reader::from_asset(ctx, " ", stream); - EXPECT_FALSE(reader.has_value()); -} - -TEST_F(ReaderTest, WhitespaceFormatUndetectableStillThrows) { - std::string garbage(512, 'w'); - std::istringstream stream(garbage, std::ios::binary); - EXPECT_THROW({ c2pa::Reader reader(" ", stream); }, c2pa::C2paException); -} - -TEST_F(ReaderTest, BlankFormatVariantsAreIndistinguishableOnFailure) { - // SVG cannot be identified, so every blank spelling fails identically. - std::string bytes = fixture_bytes("sample2.svg"); - - auto message_for = [&](const std::string& format) { - std::istringstream stream(bytes, std::ios::binary); - try { - c2pa::Reader reader(format, stream); - return std::string(""); - } catch (const c2pa::C2paException& e) { - return std::string(e.what()); - } - }; - - const std::string from_empty = message_for(""); - EXPECT_NE(from_empty, ""); - for (const char* blank : {" ", " ", "\t", "\n", "\t\n ", "\r\n", "\v\f"}) { - EXPECT_EQ(message_for(blank), from_empty) << "blank variant: " << blank; - } -} - TEST_F(ReaderTest, PaddedFormatIsTrimmed) { // Padding is never meaningful in a format, so it is trimmed before the // format reaches the library, which does no trimming of its own. @@ -1079,15 +997,6 @@ TEST_F(ReaderTest, UnsupportedFormatOnStreamDefersToContent) { EXPECT_EQ(mismatched.json(), exact.json()); } -TEST_F(ReaderTest, SuppliedAndDerivedFormatsBothDeferToContent) { - std::string bytes = fixture_bytes("C.jpg"); - std::istringstream stream(bytes, std::ios::binary); - EXPECT_NO_THROW({ c2pa::Reader reader(std::make_shared(), "zzz", stream); }); - - fs::path odd = copy_fixture_to("C.jpg", "detect-asymmetry.zzz"); - EXPECT_NO_THROW({ c2pa::Reader reader(odd); }); -} - TEST_F(ReaderTest, NoFormatOverloadDetectsFromContent) { std::ifstream file(c2pa_test::get_fixture_path("C.jpg"), std::ios::binary); ASSERT_TRUE(file.is_open()); @@ -1113,14 +1022,6 @@ TEST_F(ReaderTest, NoFormatOverloadMatchesEmptyFormat) { EXPECT_EQ(a["manifests"].size(), b["manifests"].size()); } -TEST_F(ReaderTest, NoFormatOverloadUndetectableThrows) { - std::string garbage(512, 'q'); - std::istringstream stream(garbage, std::ios::binary); - auto ctx = std::make_shared(); - - EXPECT_THROW({ c2pa::Reader reader(ctx, stream); }, c2pa::C2paException); -} - TEST_F(ReaderTest, NoFormatOverloadResolvesUnambiguously) { // Compile-level guard that each call selects exactly one overload. auto ctx = std::make_shared(); @@ -1150,30 +1051,6 @@ TEST_F(ReaderTest, FromAssetNoFormatOverloadReturnsNullopt) { EXPECT_FALSE(reader.has_value()); } -TEST_F(ReaderTest, GarbageStreamWithEmptyFormatThrows) { - // Bytes confined to 0x03..0x7f cannot match any container signature. - std::string garbage(512, '\0'); - for (size_t i = 0; i < garbage.size(); ++i) { - garbage[i] = static_cast((i * 7 + 3) & 0x7f); - } - std::istringstream stream(garbage, std::ios::binary); - EXPECT_THROW({ c2pa::Reader reader("", stream); }, c2pa::C2paException); -} - -TEST_F(ReaderTest, GarbageStreamWithEmptyFormatIsNotAManifestLookupFailure) { - std::string garbage(512, 'q'); - std::istringstream stream(garbage, std::ios::binary); - try { - c2pa::Reader reader("", stream); - FAIL() << "Expected undetectable content to be rejected"; - } catch (const c2pa::C2paException& e) { - const std::string msg = e.what(); - EXPECT_FALSE(msg.empty()); - // An unidentified container reports a different failure. - EXPECT_EQ(msg.find("ManifestNotFound"), std::string::npos) << msg; - } -} - TEST_F(ReaderTest, SubMagicLengthStreamWithEmptyFormatThrows) { // Detection needs two bytes, so one leaves nothing to identify. std::string tiny("\xff", 1); @@ -1186,18 +1063,6 @@ TEST_F(ReaderTest, EmptyStreamWithEmptyFormatThrows) { EXPECT_THROW({ c2pa::Reader reader("", stream); }, c2pa::C2paException); } -TEST_F(ReaderTest, ExtensionlessGarbageFileThrows) { - fs::path junk = get_temp_path("detect-garbage-noext"); - { - std::ofstream f(junk, std::ios::binary | std::ios::trunc); - ASSERT_TRUE(f.is_open()); - const std::string bytes(256, 'k'); - f.write(bytes.data(), static_cast(bytes.size())); - } - // The file exists, so the library reports the error. - EXPECT_THROW({ c2pa::Reader reader(junk); }, c2pa::C2paException); -} - TEST_F(ReaderTest, CorruptedJpegBodyWithEmptyFormatThrows) { // The JPEG signature survives, so detection succeeds and parsing fails after. std::string bytes = fixture_bytes("C.jpg"); @@ -1209,68 +1074,6 @@ TEST_F(ReaderTest, CorruptedJpegBodyWithEmptyFormatThrows) { EXPECT_THROW({ c2pa::Reader reader("", stream); }, c2pa::C2paException); } -TEST_F(ReaderTest, FromAssetExtensionlessUnsignedReturnsNullopt) { - // Reporting a missing manifest proves detection ran. - fs::path noext = copy_fixture_to("A.jpg", "detect-unsigned-noext"); - auto ctx = std::make_shared(); - - auto reader = c2pa::Reader::from_asset(ctx, noext); - EXPECT_FALSE(reader.has_value()); -} - -TEST_F(ReaderTest, FromAssetEmptyFormatSignedReturnsReader) { - std::string bytes = fixture_bytes("C.jpg"); - std::istringstream stream(bytes, std::ios::binary); - auto ctx = std::make_shared(); - - auto reader = c2pa::Reader::from_asset(ctx, "", stream); - ASSERT_TRUE(reader.has_value()); - EXPECT_NE(reader->json().find("C.jpg"), std::string::npos); -} - -TEST_F(ReaderTest, FromAssetGarbageThrowsRatherThanNullopt) { - std::string garbage(512, 'w'); - std::istringstream stream(garbage, std::ios::binary); - auto ctx = std::make_shared(); - - try { - auto reader = c2pa::Reader::from_asset(ctx, "", stream); - FAIL() << "Expected a throw; got " - << (reader.has_value() ? "a Reader" : "std::nullopt"); - } catch (const c2pa::C2paException& e) { - EXPECT_EQ(std::string(e.what()).find("ManifestNotFound"), std::string::npos) << e.what(); - } -} - -TEST_F(ReaderTest, SvgWithEmptyFormatIsNotAManifestLookupFailure) { - std::string bytes = fixture_bytes("sample2.svg"); - - std::string explicit_msg; - { - std::istringstream stream(bytes, std::ios::binary); - try { - c2pa::Reader reader("image/svg+xml", stream); - FAIL() << "sample2.svg is unsigned and should not produce a Reader"; - } catch (const c2pa::C2paException& e) { - explicit_msg = e.what(); - } - } - EXPECT_NE(explicit_msg.find("ManifestNotFound"), std::string::npos) << explicit_msg; - - std::string detected_msg; - { - std::istringstream stream(bytes, std::ios::binary); - try { - c2pa::Reader reader("", stream); - FAIL() << "SVG cannot be identified from content"; - } catch (const c2pa::C2paException& e) { - detected_msg = e.what(); - } - } - EXPECT_EQ(detected_msg.find("ManifestNotFound"), std::string::npos) << detected_msg; - EXPECT_NE(explicit_msg, detected_msg); -} - TEST_F(ReaderTest, ReaderSidecarBlankFormatReadsValidManifest) { // A sidecar (external) manifest is parsed from the supplied bytes, not from the container. // The core accepts a blank format here too. From 015ed9bace4d8d3fccb68c04103876390e54a285 Mon Sep 17 00:00:00 2001 From: Tania Mathern Date: Wed, 29 Jul 2026 13:30:44 -0700 Subject: [PATCH 26/27] fix: Refactor tests --- tests/context.test.cpp | 49 ------------------------------------------ 1 file changed, 49 deletions(-) diff --git a/tests/context.test.cpp b/tests/context.test.cpp index 71f96b8e..6f0d2261 100644 --- a/tests/context.test.cpp +++ b/tests/context.test.cpp @@ -482,55 +482,6 @@ TEST_F(ContextTest, ReaderWorksAfterContextOutOfScope) { EXPECT_NO_THROW(reader->json()); } -// A resolver callback that does nothing besides existing. -static int noop_http_resolver(void* /*context*/, - const C2paHttpRequest* /*request*/, - C2paHttpResponse* /*response*/) { - return 0; -} - -TEST(Context, WithHttpResolverSucceeds) { - auto context = c2pa::Context::ContextBuilder() - .with_http_resolver(nullptr, noop_http_resolver) - .create_context(); - EXPECT_TRUE(context.is_valid()); -} - -TEST(Context, WithHttpResolverRejectsNullCallback) { - auto builder = c2pa::Context::ContextBuilder(); - EXPECT_THROW(builder.with_http_resolver(nullptr, nullptr), c2pa::C2paException); -} - -TEST(Context, WithHttpResolverOnMovedFromBuilderThrows) { - auto builder = c2pa::Context::ContextBuilder(); - auto moved = std::move(builder); - EXPECT_THROW(builder.with_http_resolver(nullptr, noop_http_resolver), - c2pa::C2paException); -} - -TEST(Context, WithHttpResolverRepeatedCallsSucceed) { - // Each call allocates a fresh resolver and hands it to the C API, - // which consumes it. - auto builder = c2pa::Context::ContextBuilder(); - for (int i = 0; i < 3; ++i) { - EXPECT_NO_THROW(builder.with_http_resolver(nullptr, noop_http_resolver)); - } - auto context = builder.create_context(); - EXPECT_TRUE(context.is_valid()); -} - -TEST(Context, WithSignerConsumesSignerOnSuccess) { - // The C API consumes the signer handle. - auto signer = c2pa_test::create_test_signer(); - { - auto context = c2pa::Context::ContextBuilder() - .with_signer(std::move(signer)) - .create_context(); - EXPECT_TRUE(context.is_valid()); - } - // signer destructs here, after the context that owns the native handle. -} - // ContextBuilder::with_signer can be chained with with_settings TEST(Context, ContextBuilderWithSettingsAndSigner) { c2pa::Settings settings; From 3af00d11024586f7b81fdb31d4059ef12575a35c Mon Sep 17 00:00:00 2001 From: Tania Mathern Date: Wed, 29 Jul 2026 13:34:26 -0700 Subject: [PATCH 27/27] fix: Refactor tests --- tests/builder.test.cpp | 15 --------------- tests/embeddable.test.cpp | 36 ------------------------------------ 2 files changed, 51 deletions(-) diff --git a/tests/builder.test.cpp b/tests/builder.test.cpp index f6b58110..8ea51353 100644 --- a/tests/builder.test.cpp +++ b/tests/builder.test.cpp @@ -7592,21 +7592,6 @@ TEST_F(BuilderTest, AddIngredientFromExtensionlessPath) { { builder.add_ingredient(R"({"title": "A.jpg", "relationship": "componentOf"})", ingredient); }); } -TEST_F(BuilderTest, AddIngredientFromPathWithUnknownExtension) { - auto builder = make_builder(); - fs::path ingredient = get_temp_path("ingredient-unknown.zzz"); - { - std::ifstream src(c2pa_test::get_fixture_path("A.jpg"), std::ios::binary); - ASSERT_TRUE(src.is_open()); - std::ofstream out(ingredient, std::ios::binary | std::ios::trunc); - ASSERT_TRUE(out.is_open()); - out << src.rdbuf(); - } - - EXPECT_NO_THROW( - { builder.add_ingredient(R"({"title": "A.jpg", "relationship": "componentOf"})", ingredient); }); -} - TEST_F(BuilderTest, SignProducesEquivalentManifestForEverySpelling) { auto signer = c2pa_test::create_test_signer(); diff --git a/tests/embeddable.test.cpp b/tests/embeddable.test.cpp index ddafff8b..3205b08d 100644 --- a/tests/embeddable.test.cpp +++ b/tests/embeddable.test.cpp @@ -670,39 +670,3 @@ TEST_F(EmbeddableTest, UpdateHashFromStreamRejectsBlankFormat) { ASSERT_TRUE(asset.is_open()); EXPECT_THROW({ builder.update_hash_from_stream("", asset); }, c2pa::C2paException); } - -TEST_F(EmbeddableTest, EmbeddableStepsRejectUnsupportedFormat) { - std::vector data{0x01, 0x02, 0x03}; - EXPECT_THROW({ c2pa::Builder::format_embeddable("application/zip", data); }, - c2pa::C2paException); -} - -TEST_F(EmbeddableTest, FormatEmbeddableAcceptsReadOnlyFormat) { - // Composing a manifest for a container the library reads but cannot write - // is the point of the embeddable workflow: an outside writer embeds it. - const auto readable = c2pa::Reader::supported_mime_types(); - const auto writable = c2pa::Builder::supported_mime_types(); - - std::string read_only; - for (const auto& format : readable) { - if (std::find(writable.begin(), writable.end(), format) == writable.end()) { - read_only = format; - break; - } - } - if (read_only.empty()) { - GTEST_SKIP() << "Every readable format is also writable"; - } - - std::vector data{0x01, 0x02, 0x03}; - EXPECT_NO_THROW({ c2pa::Builder::format_embeddable(read_only, data); }) - << "read-only format: " << read_only; -} - -TEST_F(EmbeddableTest, NeedsPlaceholderDistinguishesContainersWhenFormatIsGiven) { - // A named format yields a container-specific answer: - // BMFF needs a placeholder sized differently from a JPEG. - auto builder = make_builder(); - EXPECT_TRUE(builder.needs_placeholder("image/jpeg")); - EXPECT_TRUE(builder.needs_placeholder("video/mp4")); -}