[PATCH 4/6] mfreadwrite/tests: Add some video media type attributes tests.

Rémi Bernon rbernon at codeweavers.com
Mon Nov 8 08:08:18 CST 2021


Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
 dlls/mfreadwrite/tests/mfplat.c            | 195 ++++++++++++++++++++-
 dlls/mfreadwrite/tests/resource.rc         |   2 +
 dlls/mfreadwrite/tests/test-40x36-h264.mp4 | Bin 0 -> 11151 bytes
 3 files changed, 196 insertions(+), 1 deletion(-)
 create mode 100644 dlls/mfreadwrite/tests/test-40x36-h264.mp4

diff --git a/dlls/mfreadwrite/tests/mfplat.c b/dlls/mfreadwrite/tests/mfplat.c
index 5a7d021ef84..051c7206e96 100644
--- a/dlls/mfreadwrite/tests/mfplat.c
+++ b/dlls/mfreadwrite/tests/mfplat.c
@@ -28,6 +28,7 @@
 
 #include "initguid.h"
 #include "ole2.h"
+#include "uuids.h"
 
 DEFINE_GUID(GUID_NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
 
@@ -1261,7 +1262,9 @@ struct media_type_item
 {
     const GUID *key;
     const PROPVARIANT value;
+    BOOL optional;
     BOOL todo_missing;
+    BOOL todo_value;
 };
 
 struct media_type_desc
@@ -1287,7 +1290,13 @@ static void check_media_type_items(IMFMediaType *media_type, const struct media_
         hr = IMFMediaType_GetItemByIndex(media_type, i, &key, &value);
         ok(hr == S_OK, "GetItemByIndex returned hr %#x\n", hr);
 
-        for (j = 0; expect->items[j].key; j++) if (IsEqualGUID(expect->items[j].key, &key)) break;
+        for (j = 0; expect->items[j].key; j++)
+        {
+            if (!IsEqualGUID(expect->items[j].key, &key))
+                continue;
+            if (!expect->items[j].optional || !PropVariantCompareEx(&value, &expect->items[j].value, 0, 0))
+                break;
+        }
         if (!expect->items[j].key)
         {
             todo_wine_if(expect->todo_spurious > spurious_count)
@@ -1301,6 +1310,7 @@ static void check_media_type_items(IMFMediaType *media_type, const struct media_
 
         if (!strcmp(winetest_platform, "wine"))
             ok(!expect->items[j].todo_missing, "attribute not missing %s\n", debugstr_guid(&key));
+        todo_wine_if(expect->items[j].todo_value)
         ok(!PropVariantCompareEx(&value, &expect->items[j].value, 0, 0), "got %s, expected %s.\n",
                 debugstr_propvariant(&value), debugstr_propvariant(&expect->items[j].value));
         PropVariantClear(&value);
@@ -1312,6 +1322,7 @@ static void check_media_type_items(IMFMediaType *media_type, const struct media_
     for (j = 0; expect->items[j].key; j++)
     {
         if (found[j]) continue;
+        if (expect->items[j].optional) continue;
         todo_wine_if(expect->items[j].todo_missing)
         ok(0, "missing attribute %s\n", debugstr_guid(expect->items[j].key));
     }
@@ -1400,6 +1411,118 @@ static void test_media_types(void)
         .todo_spurious = 1,
     };
 
+    static const BYTE mpeg_sequence_header[] =
+    {
+        0x00,0x00,0x01,0x67,0x64,0x00,0x14,0xac,0xd9,0x4d,0xf9,0x67,0xc0,0x5a,0x83,0x03,
+        0x03,0x52,0x80,0x00,0x00,0x03,0x00,0x80,0x00,0x00,0x1e,0x47,0x8a,0x14,0xcb,0x00,
+        0x00,0x01,0x68,0xeb,0xec,0xb2,0x2c,
+    };
+    static const BYTE mpeg4_sample_description[] =
+    {
+        0x00,0x00,0x00,0xd1,0x73,0x74,0x73,0x64,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
+        0x00,0x00,0x00,0xc1,0x61,0x76,0x63,0x31,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
+        0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+        0x00,0x28,0x00,0x24,0x00,0x48,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x00,0x00,0x00,
+        0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+        0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+        0x00,0x00,0x00,0x18,0xff,0xff,0x00,0x00,0x00,0x34,0x61,0x76,0x63,0x43,0x01,0x64,
+        0x00,0x14,0xff,0xe1,0x00,0x1c,0x67,0x64,0x00,0x14,0xac,0xd9,0x4d,0xf9,0x67,0xc0,
+        0x5a,0x83,0x03,0x03,0x52,0x80,0x00,0x00,0x03,0x00,0x80,0x00,0x00,0x1e,0x47,0x8a,
+        0x14,0xcb,0x01,0x00,0x05,0x68,0xeb,0xec,0xb2,0x2c,0x00,0x00,0x00,0x14,0x62,0x74,
+        0x72,0x74,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x01,0x34,0x38,0x00,0x00,
+        0x00,0x13,0x63,0x6f,0x6c,0x72,0x6e,0x63,0x6c,0x78,0x00,0x06,0x00,0x06,0x00,0x06,
+        0x00,0x00,0x00,0x00,0x10,0x70,0x61,0x73,0x70,0x00,0x00,0x00,0x01,0x00,0x00,0x00,
+        0x01,
+    };
+    static const struct media_type_desc video_40x36_h264_desc =
+    {
+        .items =
+        {
+            {.key = &MF_MT_MAJOR_TYPE, .value = {.vt = VT_CLSID, .puuid = (GUID *)&MFMediaType_Video}},
+            {.key = &MF_MT_SUBTYPE, .value = {.vt = VT_CLSID, .puuid = (GUID *)&MFVideoFormat_H264}, .todo_value = TRUE},
+            {.key = &MF_MT_AM_FORMAT_TYPE, .value = {.vt = VT_CLSID, .puuid = (GUID *)&FORMAT_MPEG2Video}, .todo_missing = TRUE},
+            {.key = &MF_MT_SAMPLE_SIZE, .value = {.vt = VT_UI4, .ulVal = 1}, .todo_missing = TRUE},
+            {.key = &MF_MT_AVG_BITRATE, .value = {.vt = VT_UI4, .ulVal = 78904}, .todo_missing = TRUE},
+            {.key = &MF_MT_FRAME_RATE, .value = {.vt = VT_UI8, .uhVal = {.QuadPart = (30ull << 32) | 1ull}}},
+            {.key = &MF_MT_FRAME_SIZE, .value = {.vt = VT_UI8, .uhVal = {.QuadPart = (40ull << 32) | 36ull}}},
+            {.key = &MF_MT_INTERLACE_MODE, .value = {.vt = VT_UI4, .ulVal = MFVideoInterlace_MixedInterlaceOrProgressive}, .todo_missing = TRUE},
+            {
+                .key = &MF_MT_MPEG_SEQUENCE_HEADER,
+                .value =
+                {
+                    .vt = VT_VECTOR|VT_UI1,
+                    .caub =
+                    {
+                        .pElems = (BYTE *)mpeg_sequence_header,
+                        .cElems = ARRAY_SIZE(mpeg_sequence_header)
+                    }
+                },
+                .todo_missing = TRUE
+            },
+            {.key = &MF_MT_MPEG2_LEVEL, .value = {.vt = VT_UI4, .ulVal = 20}, .todo_missing = TRUE},
+            {.key = &MF_MT_MPEG2_PROFILE, .value = {.vt = VT_UI4, .ulVal = 100}, .todo_missing = TRUE},
+            {.key = &MF_MT_PIXEL_ASPECT_RATIO, .value = {.vt = VT_UI8, .uhVal = {.QuadPart = (1ull << 32) | 1ull}}, .todo_missing = TRUE},
+            {
+                .key = &MF_MT_MPEG4_SAMPLE_DESCRIPTION,
+                .value =
+                {
+                    .vt = VT_VECTOR|VT_UI1,
+                    .caub =
+                    {
+                        .pElems = (BYTE *)mpeg4_sample_description,
+                        .cElems = ARRAY_SIZE(mpeg4_sample_description)
+                    }
+                },
+                .todo_missing = TRUE
+            },
+            {.key = &MF_MT_MPEG4_CURRENT_SAMPLE_ENTRY, .value = {.vt = VT_UI4}, .todo_missing = TRUE},
+            {.key = &MF_MT_VIDEO_ROTATION, .value = {.vt = VT_UI4, .ulVal = 0}, .optional = TRUE /* <= win7 */},
+            {.key = &MF_PROGRESSIVE_CODING_CONTENT, .value = {.vt = VT_UI4, .ulVal = 1}, .optional = TRUE /* <= win7 */, .todo_missing = TRUE},
+            {.key = &MF_NALU_LENGTH_SET, .value = {.vt = VT_UI4, .ulVal = 1}, .optional = TRUE /* <= win7 */, .todo_missing = TRUE},
+        },
+        .todo_spurious = 2,
+    };
+    static const struct media_type_desc video_40x36_h264_nv12_desc =
+    {
+        .items =
+        {
+            {.key = &MF_MT_MAJOR_TYPE, .value = {.vt = VT_CLSID, .puuid = (GUID *)&MFMediaType_Video}},
+            {.key = &MF_MT_SUBTYPE, .value = {.vt = VT_CLSID, .puuid = (GUID *)&MFVideoFormat_NV12}},
+            {.key = &MF_MT_ALL_SAMPLES_INDEPENDENT, .value = {.vt = VT_UI4, .ulVal = 1}},
+            {.key = &MF_MT_COMPRESSED, .value = {.vt = VT_UI4, .ulVal = 0}},
+            {.key = &MF_MT_FIXED_SIZE_SAMPLES, .value = {.vt = VT_UI4, .ulVal = 1}, .todo_missing = TRUE},
+            {.key = &MF_MT_SAMPLE_SIZE, .value = {.vt = VT_UI4, .ulVal = 40 * 36 * 3 / 2}, .todo_missing = TRUE},
+            {.key = &MF_MT_AVG_BIT_ERROR_RATE, .value = {.vt = VT_UI4, .ulVal = 0}, .todo_missing = TRUE},
+            {.key = &MF_MT_AVG_BITRATE, .value = {.vt = VT_UI4, .ulVal = 78904}, .todo_missing = TRUE},
+            {.key = &MF_MT_DEFAULT_STRIDE, .value = {.vt = VT_UI4, .ulVal = 40}, .todo_missing = TRUE},
+            {.key = &MF_MT_FRAME_RATE, .value = {.vt = VT_UI8, .uhVal = {.QuadPart = (30ull << 32) | 1ull}}},
+            {.key = &MF_MT_FRAME_SIZE, .value = {.vt = VT_UI8, .uhVal = {.QuadPart = (40ull << 32) | 36ull}}},
+            {.key = &MF_MT_INTERLACE_MODE, .value = {.vt = VT_UI4, .ulVal = MFVideoInterlace_MixedInterlaceOrProgressive}, .todo_missing = TRUE},
+            {.key = &MF_MT_PIXEL_ASPECT_RATIO, .value = {.vt = VT_UI8, .uhVal = {.QuadPart = (1ull << 32) | 1ull}}, .todo_missing = TRUE},
+            {.key = &MF_MT_VIDEO_ROTATION, .value = {.vt = VT_UI4, .ulVal = 0}, .optional = TRUE /* <= win7 */},
+        },
+    };
+    static const struct media_type_desc video_40x36_h264_i420_desc =
+    {
+        .items =
+        {
+            {.key = &MF_MT_MAJOR_TYPE, .value = {.vt = VT_CLSID, .puuid = (GUID *)&MFMediaType_Video}},
+            {.key = &MF_MT_SUBTYPE, .value = {.vt = VT_CLSID, .puuid = (GUID *)&MFVideoFormat_I420}},
+            {.key = &MF_MT_ALL_SAMPLES_INDEPENDENT, .value = {.vt = VT_UI4, .ulVal = 1}},
+            {.key = &MF_MT_COMPRESSED, .value = {.vt = VT_UI4, .ulVal = 0}},
+            {.key = &MF_MT_FIXED_SIZE_SAMPLES, .value = {.vt = VT_UI4, .ulVal = 1}, .todo_missing = TRUE},
+            {.key = &MF_MT_SAMPLE_SIZE, .value = {.vt = VT_UI4, .ulVal = 40 * 36 * 3 / 2}, .todo_missing = TRUE},
+            {.key = &MF_MT_AVG_BIT_ERROR_RATE, .value = {.vt = VT_UI4, .ulVal = 0}, .todo_missing = TRUE},
+            {.key = &MF_MT_AVG_BITRATE, .value = {.vt = VT_UI4, .ulVal = 78904}, .todo_missing = TRUE},
+            {.key = &MF_MT_DEFAULT_STRIDE, .value = {.vt = VT_UI4, .ulVal = 40}, .todo_missing = TRUE},
+            {.key = &MF_MT_FRAME_RATE, .value = {.vt = VT_UI8, .uhVal = {.QuadPart = (30ull << 32) | 1ull}}},
+            {.key = &MF_MT_FRAME_SIZE, .value = {.vt = VT_UI8, .uhVal = {.QuadPart = (40ull << 32) | 36ull}}},
+            {.key = &MF_MT_INTERLACE_MODE, .value = {.vt = VT_UI4, .ulVal = MFVideoInterlace_MixedInterlaceOrProgressive}, .todo_missing = TRUE},
+            {.key = &MF_MT_PIXEL_ASPECT_RATIO, .value = {.vt = VT_UI8, .uhVal = {.QuadPart = (1ull << 32) | 1ull}}, .todo_missing = TRUE},
+            {.key = &MF_MT_VIDEO_ROTATION, .value = {.vt = VT_UI4, .ulVal = 0}, .optional = TRUE /* <= win7 */},
+        },
+    };
+
     struct test_audio_format
     {
         GUID subtype;
@@ -1408,12 +1531,20 @@ static void test_media_types(void)
         const struct media_type_desc *current;
     };
 
+    struct test_video_format
+    {
+        GUID subtype;
+        const struct media_type_desc *current;
+    };
+
     struct test_media_type
     {
         const char *resource;
         const struct media_type_desc *native;
         struct test_audio_format *audio_formats;
         UINT audio_format_count;
+        struct test_video_format *video_formats;
+        UINT video_format_count;
     };
 
     struct test_audio_format test_audio_formats[] =
@@ -1424,6 +1555,12 @@ static void test_media_types(void)
         {.subtype = MFAudioFormat_Float, .bits = 32, .rate = 48000, .current = &audio_48000_f32_desc},
     };
 
+    struct test_video_format test_h264_formats[] =
+    {
+        {.subtype = MFVideoFormat_NV12, .current = &video_40x36_h264_nv12_desc},
+        {.subtype = MFVideoFormat_I420, .current = &video_40x36_h264_i420_desc},
+    };
+
     struct test_media_type tests[] =
     {
         {
@@ -1438,9 +1575,16 @@ static void test_media_types(void)
              .audio_formats = test_audio_formats,
              .audio_format_count = ARRAY_SIZE(test_audio_formats),
         },
+        {
+            .resource = "test-40x36-h264.mp4",
+            .native = &video_40x36_h264_desc,
+            .video_formats = test_h264_formats,
+            .video_format_count = ARRAY_SIZE(test_h264_formats),
+        },
     };
 
     struct test_audio_format audio_format;
+    struct test_video_format video_format;
     IMFMediaType *media_type;
     IMFSourceReader *reader;
     IMFByteStream *stream;
@@ -1518,6 +1662,55 @@ static void test_media_types(void)
             IMFByteStream_Release(stream);
         }
 
+        for (j = 0; j < tests[i].video_format_count; ++j)
+        {
+            video_format = tests[i].video_formats[j];
+            stream = get_resource_stream(tests[i].resource);
+            if (FAILED(hr = MFCreateSourceReaderFromByteStream(stream, NULL, &reader)))
+            {
+                todo_wine
+                win_skip("MFCreateSourceReaderFromByteStream() failed\n");
+                IMFByteStream_Release(stream);
+                continue;
+            }
+            ok(hr == S_OK, "Failed to create source reader, hr %#x.\n", hr);
+
+            hr = IMFSourceReader_GetNativeMediaType(reader, MF_SOURCE_READER_FIRST_VIDEO_STREAM, 0, &media_type);
+            ok(hr == S_OK, "Failed to get native mediatype, hr %#x.\n", hr);
+            winetest_push_context("native video");
+            check_media_type_items(media_type, tests[i].native);
+            IMFMediaType_Release(media_type);
+            winetest_pop_context();
+
+            hr = IMFSourceReader_GetNativeMediaType(reader, MF_SOURCE_READER_FIRST_VIDEO_STREAM, 1, &media_type);
+            todo_wine
+            ok(hr == MF_E_NO_MORE_TYPES, "Expected only one native mediatype, hr %#x.\n", hr);
+            if (hr == S_OK) IMFMediaType_Release(media_type);
+
+            hr = IMFSourceReader_SetStreamSelection(reader, MF_SOURCE_READER_FIRST_VIDEO_STREAM, TRUE);
+            ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+            hr = MFCreateMediaType(&media_type);
+            ok(hr == S_OK, "Failed to create media type, hr %#x.\n", hr);
+            hr = IMFMediaType_SetGUID(media_type, &MF_MT_MAJOR_TYPE, &MFMediaType_Video);
+            ok(hr == S_OK, "Failed to set attribute, hr %#x.\n", hr);
+            hr = IMFMediaType_SetGUID(media_type, &MF_MT_SUBTYPE, &video_format.subtype);
+            ok(hr == S_OK, "Failed to set attribute, hr %#x.\n", hr);
+            hr = IMFSourceReader_SetCurrentMediaType(reader, MF_SOURCE_READER_FIRST_VIDEO_STREAM, NULL, media_type);
+            ok(hr == S_OK, "Failed setting current media type %u, hr %#x.\n", j, hr);
+            IMFMediaType_Release(media_type);
+
+            hr = IMFSourceReader_GetCurrentMediaType(reader, MF_SOURCE_READER_FIRST_VIDEO_STREAM, &media_type);
+            ok(hr == S_OK, "Failed to get current mediatype, hr %#x.\n", hr);
+            winetest_push_context("current video %u", j);
+            check_media_type_items(media_type, video_format.current);
+            winetest_pop_context();
+            IMFMediaType_Release(media_type);
+
+            IMFSourceReader_Release(reader);
+            IMFByteStream_Release(stream);
+        }
+
         winetest_pop_context();
     }
 }
diff --git a/dlls/mfreadwrite/tests/resource.rc b/dlls/mfreadwrite/tests/resource.rc
index 5b3269fef1d..5ae9636d671 100644
--- a/dlls/mfreadwrite/tests/resource.rc
+++ b/dlls/mfreadwrite/tests/resource.rc
@@ -24,3 +24,5 @@ test.wav RCDATA test.wav
 /* @makedep: test-48000.wav */
 test-48000.wav RCDATA test-48000.wav
 
+/* @makedep: test-40x36-h264.mp4 */
+test-40x36-h264.mp4 RCDATA test-40x36-h264.mp4
diff --git a/dlls/mfreadwrite/tests/test-40x36-h264.mp4 b/dlls/mfreadwrite/tests/test-40x36-h264.mp4
new file mode 100644
index 0000000000000000000000000000000000000000..3b3771a7c67322ed99721a026b9f17d8c7829856
GIT binary patch
literal 11151
zcmb7q1z40%@GwUUNQ0DcAdPgFbc523aKMpAAB}Vif^<kI4N4=D0s;~uU4k at 7w@Ar-
z at 99r}|N8#V_w7BiGdnXoyE{7 at FDwcQ3fKnj>+0kxz=r}PBnE)j-owQS03;9F#vKYp
zL19jCvWCEcGU_ctAg8glMj?GYt8ro5VH}2rrX7ref`$TQv`Vq0gMb{vZfCdlKA?Su
ziGe^I&ns-TZOke+rrn<b&)(ZV at Zl2@0CR$^T->2xULhW^J3kLEFWAZ&Dhd(h2L#Go
zfC9IMrh*cu09Zy}4$!oQS^)w%7gt{x)CLab<Kf}w<m2Jv0ho4hxT_d9x3{-9mzTXY
z)CC4{=5lej<wmx`We0bH0Xi<OaC;YL4>7P6#1dj9$qROe+DP()t)Z4M7b{0eUNIgq
z9x%ii0`v8NO7i&di}CpI^74b7ppte_AFzj~B|r&-T|In(sz7e;ZY{~n#RF6VGO&}q
z57gQmX^|JGVeSrbwuMUa3W2Tc++Ca?=0H_mFx(vqgV}okl!%XrwG|v7tlXR=d4MiJ
zto>Y^p^|*O_W>u^Ks?~)t{#r|u1JmF2HafDU2JSTpm0e}J}}(Q9jJjc1aon5gxCQE
z^M83BFncSYFMk+3U}yJVZCKemLEy-K*gM0a?l1_T1n at 0kp6(D|b1N4oR|p&^TLCVD
zyF=`q0TY0tI|Qj?;|_6xdH~L{G<Wp{XnSi(K7fW;LtK%gur#-{hj<_xv3H058kaZJ
z-qsFo3CLVrq0Z*EF0O#|H`5iU>In4(Y)kS3j{8lTJJ~w}MX-kz)ER2!36~V$L3Yy}
zf^?}n)WZ&_?rvrNceqHoyOpGsr90Tk67VZ>SeEvHJ}^K&9sv<Bl7hRykTV2!Lk>=o
zhYN@@H&<jszc9o{Qb-hFc)+2qk^*2aOD}ULh|j+kkPJ&t8xMOwz&IbD2pEVAb30(t
zoq?GG+t|ZkP^4e&U4h940t;vf=o7>Zh$CcFAXfq!Av8K1g%Yv-Jy6P-HF)&S#Y8RQ
zMcCcp;Da+P0_tAIsNy!ELPC~D-|zHKjK+lo9W~Y(houkhtHW_n at C5tYY`6<QZK&+3
zHv9X}?q%G`nQUK5!biXEeV*q^TqRv3<u%o^vA%M0&UGaxdx=YDN!Lk`!vu{Pjw~MI
zxgL~SeUXORN1Pr;eOhmW>mZ at 5M!t#B&474&WJ7jSb)gBGH9*I(m5NsEdYrlR at -flR
zWb`$cnl3cQXv6J5ea?VeS0zCTR8w{gmvj27An|R_2tRDUx*su3bgJIWMvi9hFNPeS
zD64al591ov>Aa3vs@>l9Vur{E8(IY?7&PH7h^tj*`1O#`vEHtj$B7KitTGL&Q*#!W
zKWd23jvpmUTuJ`%QL20AlCr`hAlYrPJUY{#+V;eacLU8jsB#&L+MFS?t(D^p7h4%a
z%Wz|^yc|lS^c_-r^ZeCi8jS>w0qAEzNT>;e*v8;ZjQ`Ye<LhM{O;&r78_hT7cyz9K
zo{8_Ui_=p_Ukk{UxCq`7HNrf)^P{kog>3V9lEl at 62Y=pjajJCdahc(|TjK`DLcCD_
zS5?$X!?+e4-l)a*47)Cq93!75bcR~3gxC&ElZvF4<_rC1`J|W%UPH_~h1%x at -6?Ag
zr at -<h$<^&oZPfUmE>qFZcDOHL7|^8H#+!aYWsq&?lA0)P=eS(|V6H9 at k-(n at eeUi4
zbg!X&k+h0>*rMZ@#rJ|1O=Uop1)})QgZDB1*AET%+j%-~#4YDf#b3Q9${`SFL=!=~
zklHLeU5-Ay8wpCaj}HuX`mp(M6D{&#dTMlNsk7naCzkl(2Z1ADToO6~5(n-H%UVx4
znI5S}7$J&muImGM?vUT#g83yHIxh`&F+{&$rF at t!#L<BJMr|e!gkvjEb)?t#mfl6h
z=B>8ol}0DGgJgDw)&}itIb(yQX4#Mlwal&3ct?|-IIRGO^{b{^yqG~4tX-TtcQMDN
zPtrXwH{0Uz!cu#jEm*ylq7brX4XnKZa8m<ceeLj#eE86f9cPao_gp7%ETG=vK|ukr
z$Ye3VWU6lZRw8R_sm#%4jW!H<MNCVJ-pqD^6%G!1uY}Sn3?0Awwzd~d$9={4v at 7qi
zW<l_o&z-p1$*8Xys&xCV`GLlWh%<-avZ`0q;D!E^N2UYt?cV3l^9{Lp-sUCAQ at zT0
z8WDODxKmQO#Zq|8aSz8y%Z9}k4Rwy9?_wFYw!PjKtoVQqv6F$_rtykZw(^w=T at lUY
zrp1Bz<?zE!k&whJ>SqGICeNlaOcf{f2ZRZg`XF99vb>+4=*|d+p}H1Tbs3&I=%Ss(
zHw+k7cw^oKb-v3Fe0MLZF>;qgffk1@{ZKn(%qC7kN$acVanyjGIV{SjGDQfUgPN(|
zO<)Ln{7L394cQ?J9us3ynZ+radI>SfGYWBgI=dWVRam|38^kY%X#)8kC|AZ8BZz5+
zaC=Migj^KkC}ij5`d}jo7S%ka2f1LCr%p;&QP(lOL|qYKcsS&%o^AT3iD&*hU0A`D
zcclEb8dQ>fmuk<0lmS;^&?vC!fheaZqM-1u!?&w7VJD*!k6K>uiIjbh?5LvRg9N7d
zq^A!@O<1(Pb*qR~=B)V*nC-KlXPo%Nl6qIDuOzMba6fGfs6O!C=6Nm?bZGv?y^pWA
zJC>w{T5al<Mc-hQq=8q4O9OZzEU{DSZpVc<Nq5!@#*hyMy01fmTq{YbFsTx3$nV_7
zP%Fv*`rxB~HDkMQ`%~MN#GIJ*(yEKUaY81Or6 at t4%oa|Gxash^YgjIBdqyQai<53l
z!@KPbS$Y&tIF*4uhEgxlPo|(9Y4l#Czv(DwTVJqDPL(+bZ%IcZE32}D)%_!7zFIF)
z*loK(EUHSam3H^nleLXm?yOWcV7Dq%W>uSQYk71F&+Ep=3>J at 1IJNB^b0qK;(9l{N
zqbe9C1)bW%Ws9A^rGs_uRZV at _waeBu`o4geA5Xn{%TGs(w<j$QC;GtQWz>4XvC}5J
zoUBa}Pq|+jH*%6 at Y^*$Vg7dHd)75E1Ub`PPa81VI2P)wjxq;iRq{aYkg#!WN@)5OR
z;Yt at y&AR^6Pe!64H~VD{b54<#5uU_DETc~h4}}~gh-~yGD9*#71<w&hf1?6KD3fdL
zpwk%y=4JnW5=pRBHUw&V%AsY;^rU2p)J0#EZy~_=aYpldU4Kk2-7V+F*Ujm;Dc-_5
zGn(D^r~R>bX1|>e_-8G<&n)M1vkpn_K=gfM`;VRE<KJCjnON&8eyl!Fci?8r(COxj
zr3n~NG4yq+ibE58 at nk{07+1n~IEvvB5tg?l8U-N=YZ%`g)DX2moc#Jr{&?+q!BHAs
zZ`DV}VKbFmB5D2^eNQn!c?`n@)VVH(uu{boE>eAAdZ($B`<p$)W!@C`nx+jh_F<2x
zcUz2mS|!s8vUhY%NNVUqxf9GuG`h1j at K@0}tuJqcw1VyU>Lxd#Cj$8e9v5RTZK`Qz
zU&Us(5T^vko&5C-$|fi`3@&5NGzMX$4T=mHp?%i6EZnbaoYRnbs`)+ci}{MKrI{$Z
zf~zZw!;Il`wuJBb9Cr8_Xp_;qJwwTYZ~EIyAHK;tFJ&{}^qcvFg*MIWY8kGL^JwCX
zPJsN|e5~ZVcuyxY9<$o%_Roy3H#5V2P^h(N3Nnp|U46 at 4SN4WSdYmg?z1NX5`smWD
zm*qRjXo%N5)J_&UiHE+w%zD9nlDpe5q=`zJNPS4}GG%DPao6UX^Fsn%%Ng{y+q<Ro
z^)dB)JGpia#uTK9JQwrN6eZCO+i~ITgAP%XoVk4WTCS~&mN=#Uju at l}%8hW4F=xzU
zr+bm;Q(?qpXZPi40v*@t$Ce$qv<nz<iwjY*)BIK|!S6xvEE(r*GZiAMt84j;kj2rU
zZ4FS7wW7}40s2!0Lo<qTyMm>133uX*{HI}$Xq?#z&%Tv5kV#EBq)V<*zy6Xv-ZF^m
zARqn=0X~hOch*s%D8Qw*6%&x^5m07o-1x9Zl&hEiVdfPDf9KRPr}=sX8F-+nJpWTh
zgz9`IQ}~-qsWQ(R;pK at B>B;*6Px{D-sVa;RhWK+FRm+J)tL+~LseiVIxAU#m(Zx1(
zw!RP&I at MID5tU$(*Q~?eC!8->OFMmQd)=*=juk=ZAN at JHU1=7U|GJ0DI`5U7R$>>^
zfwsoF&E}*SYY{col+&t)cs(&!|GbnQNecCu{KIeKJXynKycr}%%9acYRct<)r)oiO
zWyD0gDTn*8{%$>LGFee7r80Jz>ezyao4yF2DSbJ$B_Bz=GDbBQ$5HT*7l=_V_U(S0
zW<V~sKV!Da20#3c<^z&m;|GZ3Dv0Cjg`eB~PNWAR6)Xh|K{WK`#HpJBZ}1?IOjQCt
z%O4y{NLDPFKXP4qw&oL(2u^h!MMW6Ao^b2u|4eH(95@;<a~M~C#eBbZ7yD4Z`>Sq=
z*q1e4wCfwmC+ at 7#<hz6Tv#xuhGzAe`o;7dlNsBK&le-C at _o2ArX(gu<D&zlfqpU|f
z#mpc$-P~Acp~#>odOT4HUQkXl95F9ZTTOCIEtT}`U>Vzf(rWoWg5ZknFfB*Y^;`R3
z?n8mpi=qw`62T6Wrly5U{8h%)g8Vzq>yhu at 2MzKsi<<1umMqFVNJ!HY-T6Xpr1wR@
zBC3pAr8cLRI0`-wZ{<_0 at NObC9t9=Uyx$1KXA#8-TK?-)37M=im1P`lD32C#Cvg0K
zzh`80n>%Epwf|@67(;)<qGP_T1n;xpR!HQrzyPDoCQlbS2^STa$Sb!Y6`|@8iPkPb
zc9LQJpiVD|EHH>7yo2qW_JlULHwGT4VbmGx`7Q7Cyc7be_gMPGe#NJ at cOZ6&^Xf6A
zGWTpE@;tyqH3;vCVm-t*3_TR at t-9OYw;DEVF~Jk at A64hUBm9wiv4yW_p4GFNIa%&L
zXQxLu>>F)$DIVE>IE<(ZbdSpZ at TTZ9W*a$Qwjt|B`H9)~Dmi`80WP)Tey-bEPF(sz
zK_6HxQ!W;!DO3q<zzGs at ffs%kPh~_wszldCXPI_9Pl at MTrx8C+q5~2iZ>FzHGxF7h
z^M;+<kk#AU<Bs3#7G1}Oiv_*>YF!%E0HIe37nsj~2er;958PjT at c!_Z7lF$Fhys+`
z2P}1_ at t6Hrc}t1a=rnKQ)wf;~_sw>W#pT%MOo5m{E!Sl=v^DqMZ*1Si{R%1OH$L6?
zbWDejDoDwDg?>A}@V#gWV#$-QJ~d)x!t)1L_LHd6DiWEzw&(Gd3q>Cm<qFiF!C#`s
zlVu-X*RElNPw;3FMu-piulH!>a%sb4zW3POQ=5G{&{lj%O)lD|r~9J{Du`OSv2a%P
zhPcJs_F_E2yZY0v_J`oAE<FLbnvnl}sc_zKw#}laA2s-z*jb$W+~f-by8QCzvi;?_
zZjla$S$~lcV=)vMW6MdcuH8-kc}>|H%l)_-aff&_H91k3`us38l*E=FqJ(N7%be>c
zeX)*LxZu2WG&eH$5sw>M+>^8UH_oVKvOcLS<Hw|Qgqi;nWo!yc+1YQg<`~n)<iZS1
zqI^Tkm$U|HmS|6}GPajYmbSSDj2>iKh%FcM8F~#$_qHc<Zz`PfX_(C+npHS4zF)BN
zvSQp}6pnNKE?JBjd>bo~q-U&8<mst!itRu^hk)e0Ch-+&p0+FFMUDH-G2;Sq#<Ouh
z(<$#w6V);bvSA&owAxg!SD%DJjP!o&W3EP|t}vU3C&!Y%6p{@p&_)U7S6X_tI5?io
z;qH|x`c8U;2P5-+-k~$Oj#8eepV`4W)hGi;dhr|dSx1$I_7zLbpq$g_;VEDD_|#ZG
zOCyde_to6u5Qwf97tKc-GeP+7 at Y3*L^>X<_hbm73d&I^`5!*J8(6rRgzhOiple?`z
zCP9v1va!NHGzc6EZ8lyY&DXj=ue#=O`|{Oliree7Zt<qGf^&2SMP3oT#;kjVAw4+H
zWuCEcj)8on{I*VHb`A|&Q8E;RXLlpbdLS70*<<w&^3khz?rcuu_D}G+M#WgUdb*^0
zm|lNR%K5Zsn!{YWg5I4IgS~$;AK{^Uzde%Z^KAq{Y&6licI&g4mv}DEWr}vW)NAf0
z#-7Gw`mxNbQ1IlS-2|#=ggjD-YW08rXs+qL#%N6C*z{WgFZ2_}fY=K3_UhTidpzZb
zmT~)WB}K!p+V8ezkMxG}Li5lY3+J;C2df0z)i)ROgt+DEby9a*$Sc@)<lI;N0$ucn
zk00ph#|XA#v{msf`7DMylQ5sRJKg;863Qtk5BJw%%V)h2Fo~BLpA+ic5D{^}U~xw8
zG>}dL3;1tg6y1dM&kL73aMVbNsij%U9EDMriEe$SGFqD$k5MqwE-vm?NpW3DVef;;
zZSQV$^FdUWBC{fNYN?Ap+2AF7b3~078|t}R!PTP~@VUJA5$zpC;qy8T1`5<K=-$Ip
z^83tIn&V_t>+%Fi+tClfUE&&s9W5|R!NhLe+bKrdvp0Ak8m~w-P~fS$x?5k6wC!5P
z7L{euvJ`2B3LR$XGF_~sVWop&IfXd9o{7egFYA_nG>E=CSakLCxdKAkSnhF4=MqNs
z*~hy3DDqc99e)=RyG%CWKc^r+a0O2!kFo0#J~UZNBsEVn1^4!Cs|j`L;fpS3y$V)9
zUFAq+HOLMBp3u=2jw>ALaDN6L)#=Drwsdc$cl$OtG1pQnDe<0_$(7oP{F~ipmm1-%
z3l6#!m-JR<u#wM}<ZzBcC7;!M&NN||Lamg`BtgpK0z~^J%@S<Y{x5BLOM{-}^cxFs
zDr4*>3R0N<e8$lxcDeb8T_>qTf+ct+K(Sm%u9E+(y|E&w-dBDQj92z$Z*dUO%JkxO
zd2 at +aV~PSnjRl_8BPT}54K-&(m_iWcP at S9q<e9l;wjyp*nxm>!djKCZHgi!T;S)-m
zGKHq*queAMthf+|rq7=pD6t at mo9}hUp_8kYp|fS4KW@<oyZM})_ at K*9u+XIcKID+w
zGmcCimjcoKI|zE5vo03$p!AwZ1&8{w=@%nh$*6DP{Q|q9Sk;yv{llpox$Aemz(y(I
zLUaiayqxO=9*8BPfU**lgC1Sa;rFqDePT3kv&{1fxlNk3`Bx;AUb^_Y&Lf`nCT`XS
zak*m!#1A!xc%})af^}Pj%*xnxhCV4!rLi!yY>^INy&xb=-w3!zmoYx^p2arYMAwez
zcmV4s0=qYe0Wv?D>-ky}yZ;JIzi at 8KTm1R3sNhXWOM&d94}N0}*Cz`hRrD>37Ss?Q
zOkXT=mz%C>s*^}RexGhiv#{q65cf3{o?&fJGxfi~!zHer+^f- at zAAY#>4hVLGN0V`
zGso96S2+tF^!tM!`TdFj<!K=A<G+rqS#05%Rzy5Gz4YL%nzZqBe>$`Al`6WxOgh@;
zIp2Ju_${Ax5}o(^5r_U3in<eCKl27#&&-#qWoeo0bB(dEwVr{a3T~6}E+wud`%g_5
zSUd#vt;@@MgKW!$Qyn<O2~bTL at df-Fj5mIc7o|-+=Yif{;!Xp73}WCOspl5fcwzFB
zbLvU*B1avSxxfNQL{^44Gk(JWm$u}mOwgiYHP?VB!41R4197id4zbEd?AA%z&sDgz
ztcV)~?!xGOG6W=puFm-d)U$cio?0=txhk~;4uZi+hlF>HsMxq7eNaN&o5L~3nPy=q
zI6|-2+||whLvVod9{s(h``%zdw4%l~e;SeenAA{B9n>FLh#o4{62Uxr0}++&=&;ut
z%-ryzowf6HX?87A(B4 at +L$UH<pJX^egy&X%s^r*ov^Y{P$$BWLM*8JL^jHSNUbK6F
zX at 6xAPOdz)d+jzc(Q<dv_R+Bu`i0dY#aO59-Z<I)uAM2xl8=%)?y<bDo4|`gJ at 2cZ
z&u}rl<=iM})Y^ypk+Z11-6z+u;Cf~{NBF{oy739Hzqr4YHq4Wy78<brj!#V(>?Kb5
zfW*@`+CU;yc4?z5_EwqrwK7bua{Ab^GPbd at Ob8*&rabTvV;ik&SMEtax at VOtNw|?!
zYqvh%!SUgXs(V38e>WLnnQU!flYwQbld4nwbJv#5EY6?N7iOxn83^dq3&I$u2`-$!
zb&IyDk?hU2kMhs5<E~Ry*h3!iqcC1;E?J-OutE&OZB>3B5Nf$4&t9BkXzQ{6eI3pc
z=<eBLlA;aQ{n`>YwmG%{*sC$C!kMk-Rfa#mN6kE+tX$8%3q7wg$Z3)rL~nMibj9<X
zyc;rxH at ARc<i(SPTSKqcVtr<``+O<R$vR_R{xFz3J6j3EL+pAX>9P22d>V=bNFP~9
zoj+YleoiTUc+30;^4!Ja?-=YcWn${%vzAW5a$2CwHyx(5nhsyi(Kg=Y at r?c~I{V=*
z^F^fAjQQ!*N}yz9P>^qRCWhyJee1NQ+tmxUEuWW}-C{{TyK<H4 at UIShtoq_}ubtT0
zzntB1gg(4gvo_|T^xJ{R)pY^NbNh244CfgkAmI}^FM at hM>OT|K(q2GkWf`n@!?W1B
z?zhsmBUzyyog}L$jvYLev+Q8lOd+IP>+d?8s|~f0i at ZJ2eAnS@`?GdSbWHvaoYH~x
zqkdTYZ5vMpqCCIuZ7hRFG_z}$CX%7m6AE8Fl0fXyCD_cb8kRl79wudSxrxq9>^#KK
zD at _0Tu+R~{>p&*+lk8N>4-d<uXc(tdnY%La(xQB$!s9i}Rw*mnmEc7UajA}&R!pw%
z6qdmqL=c8#`5XO2v(>&jV;^%E_njPpQ8||l^a)ji>Teb5 at zIrU%j=+<)=e{~;YVOr
z_;+o{-xvZ8D$n0v7U1c>pKGi7(mcd$X3Ct8!>Wv~Qgg=IUxW$Ec!fW{*H@#=Y at 4?^
z#O$z-KlE6uNvZO+Z^{W5*+F%X^hrA}6LZN=1KsKVn9I>4Q+F5)+eu%StXW{;oWW>;
zp45>sWMSt;<jbnh2i6}5UfvSv*cFUT`bqEIoNCuk6G<v~U?pwg6I3Z~RHkHJMEk-Z
zJSXgBMq*r%bK7FEzo5PFRy0~+XphlWgUhx3w{hhT at m(Y5>xgD;Pw$uRdt~z{B`UdR
zskLq!JH at e<%HMDf<?MexuDNiz`{PHLr!s0WK4{YRouyh}bgpF(VgUv}WsBv$>yS2_
z5xBdCsv_r$Wpp3A4|ga?xj);`u;FkC=9V<23KjR{z?~a)llmJr$b%|bK|q}x!N{k0
zcJX3e+0C!1%cM#!5S>N%hSFrfh!fGJKDMl^Iw%kWVeqhAi&x~mX%iKU$0p%RYX+T!
zX$b6b<}0PU;@b^oKQ25hflA6`?_2Tji+AE+2;-w;4q4l(R&uK^s@#yd8j0}ZWeM(l
zkn%b#?Gto9es=KY^5C3#rWK|lKkWCxS5gEL_sBoPklRhyPWR<DQBI<LQA-Y=SJt+1
zr(B<o-EL)s%eQ1k`8~7SNz4mBt5b=yKiRl%mw{~7+VC}XO~)0de9yN;66lii2EMD3
zzZFZrz1PI}f_dV5(DP@#tsU!2PkZ0E6KTsato)#5ic!&gczcQcd~%Li>|i+W{8t<y
z4{uCRUj08y2|Y?J+SIeQeYVV^J{FTJnz~`s0mTIzLP}o~JhqpkUp*s4aP5x;u?->;
zrZa(6zr%F2lJ<|@1?#VmSacVOwYhMXK1s at GNF@z=V9T|sq(Zp1WCmKYh~O-}Rt~)k
zRY*12OP!B?+&6*R=p3 at 5Q#4Am8~L*0=3G<?drbZIrQpZ{(Y~sG;|23t$n<E~$d#@=
zdV_s5OaOX_d&}5!H^ebTIPbtiY+zWXDxSG23G0jWfiD01gRZ_6_?qhm1BMh at Si=cx
zh}6kB>!#6d!Fmy)lbuMm<*~HDrl_KX5bl?5(VeePWj|_CDw+PEM at vWJpzbn2!B6Wt
zIr_V<m}Ih>{=EQpa=eGP6TJ`ZZoM at S+@Pp1glDD}xKGzaOUce at kH_{*qk^WI(&BUu
zrJ?vPB#*mF;nqvD9g4RB<ahMMPDceB$wf7)1j58Dl2=}kWF6j5w|yH-tu)^5`-C9r
zZT(#Khw-oXG-OOUSp8Yv#9u-`Y1FaHsxJ=7-*3R%NMmi#t$A#M;h&{A&Uv}rUIcNB
zeANM-s<^|jO4oDX@*%`}=uVDvZT#?5m3(H^o^twfN}FsXRbV*h9<&H?gDPR%0;bEx
zc$@oup?Tkk?|EnL9uouFbtbOrBhz)GR(xXzQpDm|nnyUhquWv38r{76MsHS8T(mv8
zTfWw)N@*i~V?r!rdy3jca*W at +2g-Q&dM7h=r*)W3nEl`I0hZMCue%>u0rPovOi$jy
zPYP8<QR;4-htE}?*f0|k;z3QEjLENuQze$@-=mG^1o}M;jK;#9z;W_ZM&<5TD?X3#
zSSc&fKE36c(i|6NHx79%5NW_(GxoKfw*4$fL%)UYWDaKz6^FD6&!XSpshW1Qk6P-T
zDbxp2%4-kuqMiEUs;yWvqz^rw=h<`B2wSHAkV$XFDqA{-)${e*)5HajjS!_<wH5A_
z&()m&P{cskxh(8arY={C<nAff7~Ak&P<CyOgQgW`n(NM=b;sw>-CU0iybT`=<S35O
zv{!K+`pVMuVq6bn_PO5uOO6ukBZW&Ig_le>4C at i+=?oVwBIkN39f*)WK0)~o$~yz@
zevDmPx`KTK-)07lq{VD3H|anz1g1&&rZX=iqe#=ceGhUSBa$KskJp~QNnrkvR+*3T
z<4~_$;Tr-gKGUMq`hN7t0-1x-oor=6S-$k_f=kYvy|La^k{<O&&u7$FiHqrb42Uq}
zFZ*wNXN!~M=C`64bYqmvA|gdCeRbPPS8B^b>JuoyS=JU}-CJG at 5Ba7u1;&YRg4npP
z$<I<O3=o(oZF!^A8&A at 0s|N&bCB3w(hg)*pb%{0+`<&2uz6B}5F3r^Ktt*x&ku01!
zA}9YsGPN at 0X*l6JGP?Pq(YhycEXvd0?MzDlVyyKL at t>}~=l|aLjz5NVJ)o#SP1qSR
zFnfn1oM<69GZVo+;52HIAd2!TL@&)p?2RVM8pm}{9yVU&QCx)gmvXYwVoqYVnw^vJ
z($BVG0hno-UP}S#bsC2$8Ml(Y{j^qMwU<y$l?$o1mCdO7Tuj~1=&0&EFZjBql0amC
zI*Qh)nf)sCo(E=}?YoOD^Z8kOEHX}f_|g%MZ=1k39dnhhk0`sT-oANPKaHq8@{5-7
z&o*JI>2Z}|loJT-hw+CW^Ad<w9^c%M!0@}bNEl5=BHy8Z`!V`TX0K+qC8ejXuE8<P
zOj at FfmnViq-Yf*8-bP4ULjhkhWP`!?_m?yeu(jgKWdHnq&BNwE+(coqM={cR<FAV2
z99to-l(Z4NDkp0h3o;!E;j`#q(x8JTJlkZ5Qsf6=5K%HsQG-KgbHp_BJ$(+jZVimP
z>9?VY8#=A8J_uf0tWO}&0tJp^2xm5f<bJ-V{KOGuwm0x@#p51dE{<z7XNJ}UF=A<i
zqnA>=`sUsoX<2u4Ok;z*)@syS9U-1R`_wKIE?Gr9gU>a2T`~59{j+MjZu at 8cU-e$S
zVoZ&FU@{&@pi at RWmZL$P7D{t-yG4*r3(sO_#Ez$jc8hr6L_C83mXuWZOu)r^b;{-V
zIaf}}>#j+ at YI{_9SizbAbJE=>W^~CSVNG at 1JJuO9()|W`zxP+<d2?4Lms)`g_*euJ
z$wH<-Q%HqaiJmsgo-Wg<7d%gJU$-#jYze#U_Gk+LQ#5f`k}6X1n5ka&a19xNAtex9
znT?hB=ShK|GM|2040!nQ1glo)j3Jan&5yX9#oKB*-INn$sWRK at S(EMCC!spVXW!7K
zFL7Vg(~2atN50YVQbHv@?Y_*@MHHB0m^@CHw3 at gXGK%t6bDo7P6fIF~`JD|IAhaLf
zl3W<{Hwc_;kUDAEe>~e<cr2;dNZR!>f0R$ImN at O@y~3lLPcB;T!$6)Y%mb#jT`5%d
zEQsRxM3YjH_9brrFNi3Hj2-dnH`sHruS2Iizc?N at e{e)o(2pT`sB7!FSutv`%$C$S
zWT19v*Kg#)=c(-_7)$^DpHBp&n at B;qV#x1Di~`MRuvDk<HTuRgqZ<wr^pwW~2|08Q
zb^MTrS5Z<-sjF&~EGvtY3Ou4!;rH+1^=M`Z;RoEqp4YXxnHgbBkQ8t<xM4|#@#2Cn
z8Vh?)b%$_=nU<un35{L2)aTZC_QqD28;jy6hR=#wWOpuyT|y(H;`YSCAzz-<`EzH(
zI9zEC1>;K&swL6;F?Zivg~YO--CChe7B0oTzWP4FUGg&T!B0=zU49nI2I;YmI#-Xy
zDRfKkj=Nk0i4cqrs9{y_O5hse&2qeqe%R+6Wt_bE(t##RWj4Y;4s|XAQrSdYKzir4
zUn(Y_^t(}Lv(65-d?`wfiZf6o at Ea_5h4p+%B$QkX3AYe_Q1|yQc_>GqT!}yT|Jdw1
z{9fnOtRlJjOPWp>Uxds<YFopOgR%KYdD=_cw5i%VUzi-h?C_T4YjswrOOL4bStDm;
z>z|6h(nF~n&T>#aaa&!~$Hp}^A;qmL7j}_Sc(IFVxHs at JG-yV<Kmh$2nN!&9>X9JL
z^2FW399!Z7ixia{e5U~mE~3cjwnEQ#X_1b4#aGfF-jPFGB&4cYmJK;)3(}nr>}qjj
zbe+cpywU5|CQVrVxStVN_erl;#E;%lZ>|K74h*llu2oP>SY-~{xg7^ZODOrMSr?{v
zE50z$8OpCDx6vw=1~(fC?OIO)Lr0%+a&hqj4jGt}mz_0$QNHHu3n2jo1^3-A00Du6
z6#Pm5sQ at tlOIiAl-v5kIfi_uyCq|Bd*c9&gt4*wb+x%k<+4g@)|D~Njnt!yUkpwFM
zj7S275o!(h05A;{=7D@}hfIKlUv~R`*F{rwvbKi+e6W-C|2%fR?qBsd?W|$$zbGI>
zzKr`rBe6d6rJORv*&2As1Qbz^fVWXL072^I^vmdf>^7tIZyAj>@E{9W8AwPuo~Jtu
z{F_Ft at qk;x0D9B|?(u6ve)CZ}AzoIz0F6xl(dKUsD==(jfJ6c^{dbMu{C{%_1oFS0
z0)SOH5by>OvHZWkMFjnQiikoAycPTHQZQfvBp?FhBvvjkcV{b at 4+`e5AHX7Xg?P9k
z75)JV5BRSc0gAtPv;am9kQ5jwa;A{!k1h?sv--{Y%R}lT<#B+_?;jZw0ennJK!kM8
z4*=5vKn2jp07h<ldH^T_zyJUf0L*|4I8H$V0FVN3>mMuwU^D>!@CgB$`?m}QaMdq8
zG61sxfb7c^0Ebrpj)?{+Bm39)8-svXo4?A)F#>$h=|AOv<Ur{^$^WnQ5&=D6)%^0+
z|AU?X*6#mr{r|0>z+73mAUh5u<XCwCF!Hp9LjbJh1pS2p5{3THigB`oxdW^0 at 9IGc
pk%`g%_p+oZgS#LNk^+xnkw%b4QIPLV0VMg4VZr|&!`Mi}{|7xJ&h7vJ

literal 0
HcmV?d00001

-- 
2.33.1




More information about the wine-devel mailing list