From 240a13b4b9fa41f19f433c8b65473e06f8fc4451 Mon Sep 17 00:00:00 2001 From: Steve Gerbino Date: Fri, 30 Oct 2026 19:30:02 +0100 Subject: [PATCH 1/2] refactor!: make buffer_param an implementation detail buffer_param appears only in the virtual interfaces that stream and backend implementations override, so it moves to namespace detail and leaves the user guide and glossary. Adopt capy's renamed buffer_sequence_begin and buffer_sequence_end, and remove the docs for capy's removed buffer_slice and now-private consuming_buffers. --- .../config/vocabularies/Corosio/accept.txt | 4 +- .../pages/4.guide/4g.composed-operations.adoc | 24 ---- .../ROOT/pages/4.guide/4n.buffers.adoc | 45 ------ doc/modules/ROOT/pages/glossary.adoc | 4 - include/boost/corosio/detail/buffer_param.hpp | 8 +- include/boost/corosio/io/io_read_stream.hpp | 2 +- include/boost/corosio/io/io_stream.hpp | 8 +- include/boost/corosio/io/io_write_stream.hpp | 2 +- .../boost/corosio/local_datagram_socket.hpp | 28 ++-- include/boost/corosio/random_access_file.hpp | 4 +- include/boost/corosio/udp_socket.hpp | 26 ++-- .../corosio/win_random_access_handle.hpp | 4 +- test/doc/snippets/4g_composed_operations.cpp | 31 ---- test/doc/snippets/4n_buffers.cpp | 136 ------------------ test/unit/buffer_param.cpp | 14 +- 15 files changed, 52 insertions(+), 288 deletions(-) diff --git a/doc/.vale/styles/config/vocabularies/Corosio/accept.txt b/doc/.vale/styles/config/vocabularies/Corosio/accept.txt index 186131452..ce8636324 100644 --- a/doc/.vale/styles/config/vocabularies/Corosio/accept.txt +++ b/doc/.vale/styles/config/vocabularies/Corosio/accept.txt @@ -189,7 +189,7 @@ # pages that named an English/technical term rather than a documented entity. Names # that DO have a generated reference page are deliberately absent -- they are B1 # defects and must keep alerting until they become `cpp:` links (io_stream, -# signal_set, buffer_param, worker_base and friends). +# signal_set, worker_base and friends). (?i)hostnames? (?i)loopback (?i)multicast @@ -255,8 +255,6 @@ (?i)results (?i)const_buffer (?i)mutable_buffer -(?i)buffer_slice -(?i)consuming_buffers (?i)execution_context (?i)any_executor (?i)stop_tokens? diff --git a/doc/modules/ROOT/pages/4.guide/4g.composed-operations.adoc b/doc/modules/ROOT/pages/4.guide/4g.composed-operations.adoc index e6b0dc900..7b0e18d54 100644 --- a/doc/modules/ROOT/pages/4.guide/4g.composed-operations.adoc +++ b/doc/modules/ROOT/pages/4.guide/4g.composed-operations.adoc @@ -83,30 +83,6 @@ include::example$snippets/4g_composed_operations.cpp[tag=write_full,indent=0] 2. If an error occurs, returns immediately with bytes written so far 3. On success, returns total bytes (equals `buffer_size(buffers)`) -== buffer_slice Helper - -Both `read()` and `write()` use `capy::consuming_buffers` internally to -track progress through a buffer sequence. A related helper, -`capy::buffer_slice`, returns a view over a byte range of the underlying -sequence. The result is itself a buffer sequence covering only that -range, so it can be passed directly to any I/O operation: - -[source,cpp] ----- -include::example$snippets/4g_composed_operations.cpp[tag=slice_helper,indent=0] ----- - -The returned `slice_type` models the same buffer-sequence concept as -`seq`, and is mutable when `seq` is a mutable buffer sequence. Slicing a -single buffer yields an adjusted buffer of the same kind. Any other -sequence yields a borrowed view. `offset` is clamped to the total -size, and `length` defaults to the end of the sequence. - -NOTE: Except for the single-buffer case, the result borrows `seq`: it -stores iterators into the sequence, not a copy, so `seq` must outlive -it. Passing a temporary buffer sequence is rejected at compile time; -hoist it into a named variable first. - == Error Handling Patterns === Structured Bindings with EOF Check diff --git a/doc/modules/ROOT/pages/4.guide/4n.buffers.adoc b/doc/modules/ROOT/pages/4.guide/4n.buffers.adoc index e4ebbb62a..82ec2b2e2 100644 --- a/doc/modules/ROOT/pages/4.guide/4n.buffers.adoc +++ b/doc/modules/ROOT/pages/4.guide/4n.buffers.adoc @@ -107,51 +107,6 @@ Get the total size of a buffer sequence: include::example$snippets/4n_buffers.cpp[tag=buffer_size,indent=0] ---- -== buffer_slice - -`capy::buffer_slice` returns a byte sub-range of a buffer sequence, as a -value. The result is itself a buffer sequence, so it can be passed directly -to any I/O operation: - -[source,cpp] ----- -include::example$snippets/4n_buffers.cpp[tag=buffer_slice_include] -include::example$snippets/4n_buffers.cpp[tag=buffer_slice,indent=0] ----- - -Except for the single-buffer case, the result borrows the underlying -sequence, which must outlive the slice. - -== consuming_buffers - -When transferring data incrementally, `capy::consuming_buffers` is a cursor -that tracks progress through a sequence. It exposes the bytes not yet -transferred via `data()` and advances past completed bytes with -`consume(n)`: - -[source,cpp] ----- -include::example$snippets/4n_buffers.cpp[tag=consuming_buffers_include] -include::example$snippets/4n_buffers.cpp[tag=consuming_buffers,indent=0] ----- - -This is used internally by `read()` and `write()` but can be used directly. -The underlying sequence must outlive the cursor and any view obtained from -its `data()`. - -== buffer_param - -The cpp:buffer_param[] class type-erases buffer sequences: - -[source,cpp] ----- -include::example$snippets/4n_buffers.cpp[tag=buffer_param_include] -include::example$snippets/4n_buffers.cpp[tag=buffer_param] -include::example$snippets/4n_buffers.cpp[tag=buffer_param_call,indent=0] ----- - -This enables non-templated code to work with any buffer type. - == Memory Safety === Lifetime diff --git a/doc/modules/ROOT/pages/glossary.adoc b/doc/modules/ROOT/pages/glossary.adoc index b3668277c..e344bfcfc 100644 --- a/doc/modules/ROOT/pages/glossary.adoc +++ b/doc/modules/ROOT/pages/glossary.adoc @@ -26,10 +26,6 @@ Affinity:: The binding of a coroutine to a specific executor. A coroutine with affinity to executor `ex` has all its resumptions dispatched through `ex`. -buffer_param:: -A type-erased buffer sequence parameter, allowing non-template code to -work with any buffer type. - any_executor:: A type-erased wrapper for executors, enabling runtime polymorphism for executor types. See `capy::any_executor`. diff --git a/include/boost/corosio/detail/buffer_param.hpp b/include/boost/corosio/detail/buffer_param.hpp index 89a9f6983..63f0db9e2 100644 --- a/include/boost/corosio/detail/buffer_param.hpp +++ b/include/boost/corosio/detail/buffer_param.hpp @@ -16,7 +16,7 @@ #include -namespace boost::corosio { +namespace boost::corosio::detail { /** Erases a buffer sequence to the pointer and length a system call takes. @@ -362,8 +362,8 @@ class buffer_param copy_impl(void const* p, capy::mutable_buffer* dest, std::size_t n) { auto const& bs = *static_cast(p); - auto it = capy::begin(bs); - auto const end_it = capy::end(bs); + auto it = capy::buffer_sequence_begin(bs); + auto const end_it = capy::buffer_sequence_end(bs); std::size_t i = 0; if constexpr (capy::MutableBufferSequence) @@ -398,6 +398,6 @@ class buffer_param fn_t fn_; }; -} // namespace boost::corosio +} // namespace boost::corosio::detail #endif diff --git a/include/boost/corosio/io/io_read_stream.hpp b/include/boost/corosio/io/io_read_stream.hpp index 53023e06f..54a11c555 100644 --- a/include/boost/corosio/io/io_read_stream.hpp +++ b/include/boost/corosio/io/io_read_stream.hpp @@ -90,7 +90,7 @@ class BOOST_COROSIO_DECL io_read_stream : virtual public io_object virtual std::coroutine_handle<> do_read_some( capy::continuation& cont, capy::executor_ref ex, - buffer_param buffers, + detail::buffer_param buffers, std::stop_token token, std::error_code* ec, std::size_t* bytes) = 0; diff --git a/include/boost/corosio/io/io_stream.hpp b/include/boost/corosio/io/io_stream.hpp index d1abdd557..81e12d681 100644 --- a/include/boost/corosio/io/io_stream.hpp +++ b/include/boost/corosio/io/io_stream.hpp @@ -87,7 +87,7 @@ class BOOST_COROSIO_DECL io_stream virtual std::coroutine_handle<> read_some( capy::continuation& cont, capy::executor_ref ex, - buffer_param buffers, + detail::buffer_param buffers, std::stop_token token, std::error_code* ec, std::size_t* bytes) = 0; @@ -107,7 +107,7 @@ class BOOST_COROSIO_DECL io_stream virtual std::coroutine_handle<> write_some( capy::continuation& cont, capy::executor_ref ex, - buffer_param buffers, + detail::buffer_param buffers, std::stop_token token, std::error_code* ec, std::size_t* bytes) = 0; @@ -135,7 +135,7 @@ class BOOST_COROSIO_DECL io_stream std::coroutine_handle<> do_read_some( capy::continuation& cont, capy::executor_ref ex, - buffer_param buffers, + detail::buffer_param buffers, std::stop_token token, std::error_code* ec, std::size_t* bytes) override @@ -158,7 +158,7 @@ class BOOST_COROSIO_DECL io_stream std::coroutine_handle<> do_write_some( capy::continuation& cont, capy::executor_ref ex, - buffer_param buffers, + detail::buffer_param buffers, std::stop_token token, std::error_code* ec, std::size_t* bytes) override diff --git a/include/boost/corosio/io/io_write_stream.hpp b/include/boost/corosio/io/io_write_stream.hpp index 30f8bb231..dce87f212 100644 --- a/include/boost/corosio/io/io_write_stream.hpp +++ b/include/boost/corosio/io/io_write_stream.hpp @@ -89,7 +89,7 @@ class BOOST_COROSIO_DECL io_write_stream : virtual public io_object virtual std::coroutine_handle<> do_write_some( capy::continuation& cont, capy::executor_ref ex, - buffer_param buffers, + detail::buffer_param buffers, std::stop_token token, std::error_code* ec, std::size_t* bytes) = 0; diff --git a/include/boost/corosio/local_datagram_socket.hpp b/include/boost/corosio/local_datagram_socket.hpp index de7cef685..c7409988d 100644 --- a/include/boost/corosio/local_datagram_socket.hpp +++ b/include/boost/corosio/local_datagram_socket.hpp @@ -116,7 +116,7 @@ class BOOST_COROSIO_DECL local_datagram_socket : public io_object virtual std::coroutine_handle<> send_to( capy::continuation& cont, capy::executor_ref ex, - buffer_param buf, + detail::buffer_param buf, corosio::local_endpoint dest, int flags, std::stop_token token, @@ -140,7 +140,7 @@ class BOOST_COROSIO_DECL local_datagram_socket : public io_object virtual std::coroutine_handle<> recv_from( capy::continuation& cont, capy::executor_ref ex, - buffer_param buf, + detail::buffer_param buf, corosio::local_endpoint* source, int flags, std::stop_token token, @@ -181,7 +181,7 @@ class BOOST_COROSIO_DECL local_datagram_socket : public io_object virtual std::coroutine_handle<> send( capy::continuation& cont, capy::executor_ref ex, - buffer_param buf, + detail::buffer_param buf, int flags, std::stop_token token, std::error_code* ec, @@ -203,7 +203,7 @@ class BOOST_COROSIO_DECL local_datagram_socket : public io_object virtual std::coroutine_handle<> recv( capy::continuation& cont, capy::executor_ref ex, - buffer_param buf, + detail::buffer_param buf, int flags, std::stop_token token, std::error_code* ec, @@ -324,7 +324,7 @@ class BOOST_COROSIO_DECL local_datagram_socket : public io_object send_to_awaitable( local_datagram_socket& s, - buffer_param buf, + detail::buffer_param buf, corosio::local_endpoint dest, int flags = 0) noexcept : s_(s) @@ -337,7 +337,7 @@ class BOOST_COROSIO_DECL local_datagram_socket : public io_object friend detail::bytes_op_base; local_datagram_socket& s_; - buffer_param buf_; + detail::buffer_param buf_; corosio::local_endpoint dest_; int flags_; @@ -361,7 +361,7 @@ class BOOST_COROSIO_DECL local_datagram_socket : public io_object recv_from_awaitable( local_datagram_socket& s, - buffer_param buf, + detail::buffer_param buf, corosio::local_endpoint& source, int flags = 0) noexcept : s_(s) @@ -374,7 +374,7 @@ class BOOST_COROSIO_DECL local_datagram_socket : public io_object friend detail::bytes_op_base; local_datagram_socket& s_; - buffer_param buf_; + detail::buffer_param buf_; corosio::local_endpoint& source_; int flags_; @@ -450,7 +450,9 @@ class BOOST_COROSIO_DECL local_datagram_socket : public io_object friend local_datagram_socket; send_awaitable( - local_datagram_socket& s, buffer_param buf, int flags = 0) noexcept + local_datagram_socket& s, + detail::buffer_param buf, + int flags = 0) noexcept : s_(s) , buf_(buf) , flags_(flags) @@ -460,7 +462,7 @@ class BOOST_COROSIO_DECL local_datagram_socket : public io_object friend detail::bytes_op_base; local_datagram_socket& s_; - buffer_param buf_; + detail::buffer_param buf_; int flags_; std::coroutine_handle<> @@ -481,7 +483,9 @@ class BOOST_COROSIO_DECL local_datagram_socket : public io_object friend local_datagram_socket; recv_awaitable( - local_datagram_socket& s, buffer_param buf, int flags = 0) noexcept + local_datagram_socket& s, + detail::buffer_param buf, + int flags = 0) noexcept : s_(s) , buf_(buf) , flags_(flags) @@ -491,7 +495,7 @@ class BOOST_COROSIO_DECL local_datagram_socket : public io_object friend detail::bytes_op_base; local_datagram_socket& s_; - buffer_param buf_; + detail::buffer_param buf_; int flags_; std::coroutine_handle<> diff --git a/include/boost/corosio/random_access_file.hpp b/include/boost/corosio/random_access_file.hpp index 8e2600797..319ce6335 100644 --- a/include/boost/corosio/random_access_file.hpp +++ b/include/boost/corosio/random_access_file.hpp @@ -87,7 +87,7 @@ class BOOST_COROSIO_DECL random_access_file : public io_object std::uint64_t offset, capy::continuation& cont, capy::executor_ref ex, - buffer_param buf, + detail::buffer_param buf, std::stop_token token, std::error_code* ec, std::size_t* bytes_out) = 0; @@ -108,7 +108,7 @@ class BOOST_COROSIO_DECL random_access_file : public io_object std::uint64_t offset, capy::continuation& cont, capy::executor_ref ex, - buffer_param buf, + detail::buffer_param buf, std::stop_token token, std::error_code* ec, std::size_t* bytes_out) = 0; diff --git a/include/boost/corosio/udp_socket.hpp b/include/boost/corosio/udp_socket.hpp index 124f17f5d..6cae2cf06 100644 --- a/include/boost/corosio/udp_socket.hpp +++ b/include/boost/corosio/udp_socket.hpp @@ -102,7 +102,7 @@ class BOOST_COROSIO_DECL udp_socket : public io_object virtual std::coroutine_handle<> send_to( capy::continuation& cont, capy::executor_ref ex, - buffer_param buf, + detail::buffer_param buf, endpoint dest, int flags, std::stop_token token, @@ -128,7 +128,7 @@ class BOOST_COROSIO_DECL udp_socket : public io_object virtual std::coroutine_handle<> recv_from( capy::continuation& cont, capy::executor_ref ex, - buffer_param buf, + detail::buffer_param buf, endpoint* source, int flags, std::stop_token token, @@ -241,7 +241,7 @@ class BOOST_COROSIO_DECL udp_socket : public io_object virtual std::coroutine_handle<> send( capy::continuation& cont, capy::executor_ref ex, - buffer_param buf, + detail::buffer_param buf, int flags, std::stop_token token, std::error_code* ec, @@ -265,7 +265,7 @@ class BOOST_COROSIO_DECL udp_socket : public io_object virtual std::coroutine_handle<> recv( capy::continuation& cont, capy::executor_ref ex, - buffer_param buf, + detail::buffer_param buf, int flags, std::stop_token token, std::error_code* ec, @@ -306,7 +306,7 @@ class BOOST_COROSIO_DECL udp_socket : public io_object send_to_awaitable( udp_socket& s, - buffer_param buf, + detail::buffer_param buf, endpoint dest, int flags = 0) noexcept : s_(s) @@ -319,7 +319,7 @@ class BOOST_COROSIO_DECL udp_socket : public io_object friend detail::bytes_op_base; udp_socket& s_; - buffer_param buf_; + detail::buffer_param buf_; endpoint dest_; int flags_; @@ -343,7 +343,7 @@ class BOOST_COROSIO_DECL udp_socket : public io_object recv_from_awaitable( udp_socket& s, - buffer_param buf, + detail::buffer_param buf, endpoint& source, int flags = 0) noexcept : s_(s) @@ -356,7 +356,7 @@ class BOOST_COROSIO_DECL udp_socket : public io_object friend detail::bytes_op_base; udp_socket& s_; - buffer_param buf_; + detail::buffer_param buf_; endpoint& source_; int flags_; @@ -418,7 +418,8 @@ class BOOST_COROSIO_DECL udp_socket : public io_object private: friend udp_socket; - send_awaitable(udp_socket& s, buffer_param buf, int flags = 0) noexcept + send_awaitable( + udp_socket& s, detail::buffer_param buf, int flags = 0) noexcept : s_(s) , buf_(buf) , flags_(flags) @@ -428,7 +429,7 @@ class BOOST_COROSIO_DECL udp_socket : public io_object friend detail::bytes_op_base; udp_socket& s_; - buffer_param buf_; + detail::buffer_param buf_; int flags_; std::coroutine_handle<> @@ -444,7 +445,8 @@ class BOOST_COROSIO_DECL udp_socket : public io_object private: friend udp_socket; - recv_awaitable(udp_socket& s, buffer_param buf, int flags = 0) noexcept + recv_awaitable( + udp_socket& s, detail::buffer_param buf, int flags = 0) noexcept : s_(s) , buf_(buf) , flags_(flags) @@ -454,7 +456,7 @@ class BOOST_COROSIO_DECL udp_socket : public io_object friend detail::bytes_op_base; udp_socket& s_; - buffer_param buf_; + detail::buffer_param buf_; int flags_; std::coroutine_handle<> diff --git a/include/boost/corosio/win_random_access_handle.hpp b/include/boost/corosio/win_random_access_handle.hpp index d4a24459d..2879ba29f 100644 --- a/include/boost/corosio/win_random_access_handle.hpp +++ b/include/boost/corosio/win_random_access_handle.hpp @@ -109,7 +109,7 @@ class BOOST_COROSIO_DECL win_random_access_handle : public io_object std::uint64_t offset, capy::continuation& cont, capy::executor_ref ex, - buffer_param buf, + detail::buffer_param buf, std::stop_token token, std::error_code* ec, std::size_t* bytes_out) = 0; @@ -130,7 +130,7 @@ class BOOST_COROSIO_DECL win_random_access_handle : public io_object std::uint64_t offset, capy::continuation& cont, capy::executor_ref ex, - buffer_param buf, + detail::buffer_param buf, std::stop_token token, std::error_code* ec, std::size_t* bytes_out) = 0; diff --git a/test/doc/snippets/4g_composed_operations.cpp b/test/doc/snippets/4g_composed_operations.cpp index 480b4f4fe..c09ec86d5 100644 --- a/test/doc/snippets/4g_composed_operations.cpp +++ b/test/doc/snippets/4g_composed_operations.cpp @@ -47,10 +47,6 @@ namespace corosio = boost::corosio; namespace capy = boost::capy; // end::assume[] -// tag::slice_helper[] -#include -// end::slice_helper[] - #include #include #include @@ -83,16 +79,6 @@ write(capy::WriteStream auto& stream, capy::ConstBufferSequence auto buffers) -> capy::task>; // end::write_signature[] -// tag::slice_interface[] -template - requires capy::MutableBufferSequence || - capy::ConstBufferSequence -capy::slice_type buffer_slice( - BufferSequence const& seq, - std::size_t offset = 0, - std::size_t length = (std::numeric_limits::max)()); -// end::slice_interface[] - } // namespace synopsis capy::task<> @@ -320,22 +306,6 @@ struct composed_operations_test ioc.run(); } - void testBufferSlice() - { - char header[16]; - char body[1024]; - // tag::slice_helper[] - - std::array bufs = { - capy::mutable_buffer(header, 16), capy::mutable_buffer(body, 1024)}; - - // After reading 20 bytes, slice off what was consumed: - auto rest = capy::buffer_slice(bufs, 20); - // rest covers: 4 bytes of header remaining + full body - // end::slice_helper[] - BOOST_TEST_EQ(capy::buffer_size(rest), 1020u); - } - void testErrorBindings() { corosio::io_context ioc; @@ -407,7 +377,6 @@ struct composed_operations_test testReadFull(); testReadUntilEof(); testWriteFull(); - testBufferSlice(); testErrorBindings(); testErrorExceptions(); testCancellation(); diff --git a/test/doc/snippets/4n_buffers.cpp b/test/doc/snippets/4n_buffers.cpp index 79be08a55..4fc8e2d82 100644 --- a/test/doc/snippets/4n_buffers.cpp +++ b/test/doc/snippets/4n_buffers.cpp @@ -45,19 +45,6 @@ namespace corosio = boost::corosio; namespace capy = boost::capy; // end::assume[] -// tag::buffer_slice_include[] -#include - -// end::buffer_slice_include[] -// tag::consuming_buffers_include[] -#include - -// end::consuming_buffers_include[] -// tag::buffer_param_include[] -#include - -// end::buffer_param_include[] - #include #include @@ -132,52 +119,6 @@ multi_buffer_write( // end::multi_buffer[] } -capy::task<> -slice_writes( - corosio::tcp_socket& sock, std::array const& bufs) -{ - // tag::buffer_slice[] - // Send only the first 16 bytes of the sequence - auto [ec, n] = co_await capy::write(sock, capy::buffer_slice(bufs, 0, 16)); - if (ec) - co_return; - - // Everything after the first 16 bytes, as a value - auto rest = capy::buffer_slice(bufs, 16); - std::tie(ec, n) = co_await capy::write(sock, rest); - // end::buffer_slice[] - sock.shutdown(corosio::shutdown_send); -} - -capy::task<> -consume_reads( - corosio::tcp_socket& sock, - std::array const& bufs, - std::size_t& out_n) -{ - // tag::consuming_buffers[] - capy::consuming_buffers consuming(bufs); - - // After reading n bytes: - auto [ec, n] = co_await sock.read_some(consuming.data()); - consuming.consume(n); // Advance past the bytes read - - // consuming.data() now spans the remaining unread bytes - // end::consuming_buffers[] - out_n = n; -} - -// tag::buffer_param[] -void -accept_any_buffer(corosio::buffer_param buffers) -{ - capy::mutable_buffer temp[8]; - std::size_t n = buffers.copy_to(temp, 8); - // Use temp[0..n-1] -} - -// end::buffer_param[] - // tag::lifetime[] // WRONG: buffer outlives string capy::task @@ -402,80 +343,6 @@ struct buffers_test BOOST_TEST(total == 1040); } - void testBufferSlice() - { - corosio::io_context ioc; - auto [ec, a, b] = corosio::test::make_socket_pair(ioc); - BOOST_TEST(!ec); - if (ec) - return; - std::string part1(16, 'x'); - std::string part2(16, 'y'); - std::array bufs = { - capy::const_buffer(part1.data(), part1.size()), - capy::const_buffer(part2.data(), part2.size())}; - - std::string got; - bool eof = false; - capy::run_async(ioc.get_executor())(slice_writes(a, bufs)); - capy::run_async(ioc.get_executor())( - [](corosio::tcp_socket& peer, std::string& out, - bool& eof_out) -> capy::task<> { - char chunk[64]; - for (;;) - { - auto [ec, n] = co_await peer.read_some( - capy::mutable_buffer(chunk, sizeof(chunk))); - out.append(chunk, n); - if (ec) - { - eof_out = ec == capy::cond::eof; - co_return; - } - } - }(b, got, eof)); - ioc.run(); - BOOST_TEST(eof); - BOOST_TEST(got == part1 + part2); - } - - void testConsumingBuffers() - { - corosio::io_context ioc; - auto [ec, a, b] = corosio::test::make_socket_pair(ioc); - BOOST_TEST(!ec); - if (ec) - return; - char head[4] = {}; - char tail[8] = {}; - std::array bufs = { - capy::mutable_buffer(head, sizeof(head)), - capy::mutable_buffer(tail, sizeof(tail))}; - std::size_t n = 0; - capy::run_async(ioc.get_executor())( - [](corosio::tcp_socket& peer) -> capy::task<> { - co_await peer.write_some(capy::const_buffer("0123456789", 10)); - }(b)); - capy::run_async(ioc.get_executor())(consume_reads(a, bufs, n)); - ioc.run(); - BOOST_TEST(n > 0); - BOOST_TEST(std::memcmp(head, "0123", 4) == 0); - } - - void testBufferParam() - { - char header[16]; - char body[64]; - // tag::buffer_param_call[] - // Works with any buffer sequence (implicit conversion) - std::array bufs = { - capy::mutable_buffer(header, sizeof(header)), - capy::mutable_buffer(body, sizeof(body))}; - accept_any_buffer(bufs); - // end::buffer_param_call[] - BOOST_TEST(capy::buffer_size(bufs) == 80); - } - void testLifetime() { corosio::io_context ioc; @@ -588,9 +455,6 @@ struct buffers_test testSingleBuffer(); testMultipleBuffers(); testBufferSize(); - testBufferSlice(); - testConsumingBuffers(); - testBufferParam(); testLifetime(); testStringInvalidation(); testScatterRead(); diff --git a/test/unit/buffer_param.cpp b/test/unit/buffer_param.cpp index ca96e0a1a..70ef1d601 100644 --- a/test/unit/buffer_param.cpp +++ b/test/unit/buffer_param.cpp @@ -21,7 +21,7 @@ struct buffer_param_test { // Helper to reduce repeated copy_to assertion pattern static void check_copy( - buffer_param p, + detail::buffer_param p, std::initializer_list> expected) { capy::mutable_buffer dest[8]; @@ -37,7 +37,7 @@ struct buffer_param_test } // Helper for checking empty/zero-byte sequences - static void check_empty(buffer_param p) + static void check_empty(detail::buffer_param p) { capy::mutable_buffer dest[8]; BOOST_TEST_EQ(p.copy_to(dest, 8), 0); @@ -118,7 +118,7 @@ struct buffer_param_test capy::const_buffer(data1, 3), capy::const_buffer(data2, 3), capy::const_buffer(data3, 5)}; - buffer_param ref(arr); + detail::buffer_param ref(arr); // copy only 2 buffers capy::mutable_buffer dest[2]; @@ -222,14 +222,14 @@ struct buffer_param_test } // Helper function that accepts buffer_param by value - static std::size_t acceptByValue(buffer_param p) + static std::size_t acceptByValue(detail::buffer_param p) { capy::mutable_buffer dest[8]; return p.copy_to(dest, 8); } // Helper function that accepts buffer_param by const reference - static std::size_t acceptByConstRef(buffer_param const& p) + static std::size_t acceptByConstRef(detail::buffer_param const& p) { capy::mutable_buffer dest[8]; return p.copy_to(dest, 8); @@ -246,7 +246,7 @@ struct buffer_param_test BOOST_TEST_EQ(n, 1); // Pass buffer_param object - buffer_param p(cb); + detail::buffer_param p(cb); n = acceptByValue(p); BOOST_TEST_EQ(n, 1); @@ -264,7 +264,7 @@ struct buffer_param_test capy::const_buffer cb(data, 5); // Pass buffer_param object by const ref - buffer_param p(cb); + detail::buffer_param p(cb); auto n = acceptByConstRef(p); BOOST_TEST_EQ(n, 1); From 244bfaee44eaba34d213b271ed86f339dfe9b839 Mon Sep 17 00:00:00 2001 From: Steve Gerbino Date: Fri, 30 Oct 2026 23:08:28 +0100 Subject: [PATCH 2/2] test: put the server certificate's hostname in subjectAltName OpenSSL 4.1 no longer matches hostnames against the subject CN, so every SNI and hostname test failed verification against the CN-only test certificate. Reissue it from the same key with the same subject, which keeps the CA path hash, and rebuild the PKCS#12 bundle from it. --- test/unit/test_utils.hpp | 472 ++++++++++++++++++++------------------- 1 file changed, 239 insertions(+), 233 deletions(-) diff --git a/test/unit/test_utils.hpp b/test/unit/test_utils.hpp index 8ca7fc047..38a80b08a 100644 --- a/test/unit/test_utils.hpp +++ b/test/unit/test_utils.hpp @@ -152,18 +152,22 @@ native_socket_valid(native_handle_type h) // Embedded Test Certificates // -// Self-signed server certificate from Boost.Beast +// Self-signed server certificate, reissued from the Boost.Beast key // Subject: C=US, ST=CA, L=Los Angeles, O=Beast, CN=www.example.com -// Valid: 2021-07-06 to 2048-11-21 (self-signed, CA:TRUE) +// Valid: 2026-01-01 to 2049-12-31 (self-signed, CA:TRUE) +// The name is in subjectAltName because OpenSSL 4.1 no longer falls back +// to the subject CN for hostname checks. // Command: -// openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 10000 -nodes +// openssl req -x509 -new -key key.pem -out cert.pem +// -not_before 20260101000000Z -not_after 20491231235959Z // -subj "/C=US/ST=CA/L=Los Angeles/O=Beast/CN=www.example.com" +// -addext "subjectAltName=DNS:www.example.com" inline constexpr char const* server_cert_pem = "-----BEGIN CERTIFICATE-----\n" - "MIIDlTCCAn2gAwIBAgIUOLxr3q7Wd/pto1+2MsW4fdRheCIwDQYJKoZIhvcNAQEL\n" + "MIIDsTCCApmgAwIBAgIUVInhrVt9AS5BOP5b16ugGiz+dpAwDQYJKoZIhvcNAQEL\n" "BQAwWjELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMRQwEgYDVQQHDAtMb3MgQW5n\n" "ZWxlczEOMAwGA1UECgwFQmVhc3QxGDAWBgNVBAMMD3d3dy5leGFtcGxlLmNvbTAe\n" - "Fw0yMTA3MDYwMTQ5MjVaFw00ODExMjEwMTQ5MjVaMFoxCzAJBgNVBAYTAlVTMQsw\n" + "Fw0yNjAxMDEwMDAwMDBaFw00OTEyMzEyMzU5NTlaMFoxCzAJBgNVBAYTAlVTMQsw\n" "CQYDVQQIDAJDQTEUMBIGA1UEBwwLTG9zIEFuZ2VsZXMxDjAMBgNVBAoMBUJlYXN0\n" "MRgwFgYDVQQDDA93d3cuZXhhbXBsZS5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IB\n" "DwAwggEKAoIBAQCz0GwgnxSBhygxBdhTHGx5LDLIJSuIDJ6nMwZFvAjdhLnB/vOT\n" @@ -171,15 +175,15 @@ inline constexpr char const* server_cert_pem = "P41c2F9pBEnUwUxIUG1Cb6AN0cZWF/wSMOZ0w3DoBhnl1sdQfQiS25MTK6x4tATm\n" "Wm9SJc2lsjWptbyIN6hFXLYPXTwnYzCLvv1EK6Ft7tMPc/FcJpd/wYHgl8shDmY7\n" "rV+AiGTxUU35V0AzpJlmvct5aJV/5vSRRLwT9qLZSddE9zy/0rovC5GML6S7BUC4\n" - "lIzJ8yxzOzSStBPxvdrOobSSNlRZIlE7gnyNAgMBAAGjUzBRMB0GA1UdDgQWBBR+\n" + "lIzJ8yxzOzSStBPxvdrOobSSNlRZIlE7gnyNAgMBAAGjbzBtMB0GA1UdDgQWBBR+\n" "dYtY9zmFSw9GYpEXC1iJKHC0/jAfBgNVHSMEGDAWgBR+dYtY9zmFSw9GYpEXC1iJ\n" - "KHC0/jAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQBzKrsiYywl\n" - "RKeB2LbddgSf7ahiQMXCZpAjZeJikIoEmx+AmjQk1bam+M7WfpRAMnCKooU+Utp5\n" - "TwtijjnJydkZHFR6UH6oCWm8RsUVxruao/B0UFRlD8q+ZxGd4fGTdLg/ztmA+9oC\n" - "EmrcQNdz/KIxJj/fRB3j9GM4lkdaIju47V998Z619E/6pt7GWcAySm1faPB0X4fL\n" - "FJ6iYR2r/kJLoppPqL0EE49uwyYQ1dKhXS2hk+IIfA9mBn8eAFb/0435A2fXutds\n" - "qhvwIOmAObCzcoKkz3sChbk4ToUTqbC0TmFAXI5Upz1wnADzjpbJrpegCA3pmvhT\n" - "7356drqnCGY9\n" + "KHC0/jAPBgNVHRMBAf8EBTADAQH/MBoGA1UdEQQTMBGCD3d3dy5leGFtcGxlLmNv\n" + "bTANBgkqhkiG9w0BAQsFAAOCAQEAq17MIo/kjOWcWZxkIYXy7W/WMvl0EEfCBs/m\n" + "Cxr3Q/t20FN0p8/bRKh6rnC+mBg/oRqeFqbapOxlyBy010h+ugXrIBJv1SwHQ/LA\n" + "ljtx5+zPAuZSzdAUTsvu48ynfeRkUsU1fT7M8pUNNo4tCDhX/RuCMVXSiIi8E4i1\n" + "46qplRK6uw+iARJFoTaeUZcgQEhvIZzgBC5SwZewkA2BBMciEovHM7wOzFO8glbw\n" + "BBAGt5XbDs+cfxICcgihYwotFdJxcTZUXUOxbMIk60VLCb9uzF4INSNdO+S8r2st\n" + "2lvQ6jqX5g+/ro3WZg8wXjPu6AL8kHCnFq9yazJZROBOEJuXEw==\n" "-----END CERTIFICATE-----\n"; // CA cert is the same as server cert (self-signed) @@ -845,231 +849,233 @@ inline constexpr char const* encrypted_key_password = "test-password"; (PBES2/AES-256-CBC; 3DES is disabled in the test wolfSSL build) */ inline constexpr unsigned char server_p12[] = { - 0x30, 0x82, 0x0a, 0x87, 0x02, 0x01, 0x03, 0x30, 0x82, 0x0a, 0x35, 0x06, + 0x30, 0x82, 0x0a, 0x97, 0x02, 0x01, 0x03, 0x30, 0x82, 0x0a, 0x45, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x07, 0x01, 0xa0, 0x82, - 0x0a, 0x26, 0x04, 0x82, 0x0a, 0x22, 0x30, 0x82, 0x0a, 0x1e, 0x30, 0x82, - 0x04, 0x8a, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x07, - 0x06, 0xa0, 0x82, 0x04, 0x7b, 0x30, 0x82, 0x04, 0x77, 0x02, 0x01, 0x00, - 0x30, 0x82, 0x04, 0x70, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, + 0x0a, 0x36, 0x04, 0x82, 0x0a, 0x32, 0x30, 0x82, 0x0a, 0x2e, 0x30, 0x82, + 0x04, 0x9a, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x07, + 0x06, 0xa0, 0x82, 0x04, 0x8b, 0x30, 0x82, 0x04, 0x87, 0x02, 0x01, 0x00, + 0x30, 0x82, 0x04, 0x80, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x07, 0x01, 0x30, 0x5f, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x05, 0x0d, 0x30, 0x52, 0x30, 0x31, 0x06, 0x09, 0x2a, 0x86, - 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x05, 0x0c, 0x30, 0x24, 0x04, 0x10, 0xd7, - 0x31, 0x9c, 0xcd, 0x95, 0x22, 0xd6, 0x91, 0x14, 0xbd, 0x9e, 0xbe, 0x88, - 0x5f, 0x0d, 0xad, 0x02, 0x02, 0x08, 0x00, 0x30, 0x0c, 0x06, 0x08, 0x2a, + 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x05, 0x0c, 0x30, 0x24, 0x04, 0x10, 0x6c, + 0x93, 0xad, 0x98, 0x85, 0x2e, 0x24, 0xb7, 0x77, 0x46, 0x14, 0x01, 0x3c, + 0xff, 0xb1, 0x52, 0x02, 0x02, 0x08, 0x00, 0x30, 0x0c, 0x06, 0x08, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x02, 0x09, 0x05, 0x00, 0x30, 0x1d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x01, 0x2a, 0x04, 0x10, - 0xe5, 0x84, 0x61, 0xf8, 0x7b, 0xde, 0xa8, 0x89, 0x02, 0xde, 0x22, 0x49, - 0xc8, 0x5b, 0xe4, 0x72, 0x80, 0x82, 0x04, 0x00, 0xaf, 0x0c, 0x6e, 0xfd, - 0x77, 0xb4, 0xbb, 0x12, 0x7f, 0x8b, 0x79, 0xd6, 0x17, 0x2c, 0xd6, 0xd0, - 0x5e, 0x60, 0x29, 0xbc, 0xcf, 0xcf, 0x43, 0x63, 0x4a, 0x3b, 0x6e, 0xa8, - 0x0e, 0x85, 0x66, 0xca, 0xc6, 0x02, 0xe2, 0x20, 0x1a, 0xd7, 0x21, 0xd0, - 0xb1, 0x17, 0x74, 0xec, 0xe1, 0x53, 0xd9, 0x1f, 0xb2, 0xae, 0xeb, 0x2e, - 0x94, 0x01, 0xd6, 0x46, 0x7f, 0x5f, 0x21, 0x8e, 0x1f, 0x9f, 0x21, 0x6d, - 0x6c, 0xca, 0x4f, 0x77, 0x2a, 0xe0, 0x4d, 0x8b, 0xf0, 0x1a, 0x65, 0x00, - 0xe0, 0x23, 0x65, 0x7b, 0x82, 0x53, 0xd8, 0x00, 0x6d, 0x20, 0xe9, 0x78, - 0xe4, 0x54, 0x06, 0xcd, 0xde, 0x2f, 0x39, 0xe8, 0x2d, 0x97, 0x81, 0xee, - 0x8e, 0x5b, 0x81, 0x40, 0x77, 0x4d, 0x8a, 0x88, 0x8a, 0xcc, 0xf0, 0x20, - 0x1c, 0xae, 0x92, 0x9a, 0xac, 0xf7, 0x28, 0x77, 0xcf, 0x89, 0x10, 0x2f, - 0x1b, 0x2c, 0x46, 0x96, 0x2b, 0xf2, 0x13, 0x65, 0xdf, 0x7c, 0x73, 0xbd, - 0x01, 0x87, 0xc3, 0x22, 0xca, 0x41, 0xa4, 0xc0, 0x9a, 0xe5, 0xab, 0x27, - 0x28, 0xc5, 0xcd, 0x21, 0x2e, 0xa6, 0xcd, 0x69, 0x76, 0x5e, 0x35, 0xee, - 0x8b, 0xc4, 0xfb, 0x31, 0xaa, 0x76, 0x9a, 0x1d, 0x5b, 0x30, 0x25, 0xfb, - 0x46, 0x47, 0xd8, 0x6d, 0x99, 0x2c, 0x4e, 0xc3, 0x6c, 0x42, 0x97, 0xcf, - 0x16, 0x06, 0x07, 0xc5, 0x81, 0xc5, 0x17, 0xab, 0x7e, 0xd2, 0x39, 0x9b, - 0xc2, 0xe7, 0x25, 0x30, 0x22, 0x6a, 0xe3, 0xa6, 0x1e, 0x93, 0x62, 0x60, - 0xc2, 0x22, 0x7a, 0xcd, 0x23, 0xe1, 0x05, 0x71, 0xd3, 0x5b, 0xcb, 0xc1, - 0xd5, 0x71, 0xdf, 0x9b, 0x70, 0x62, 0x61, 0x18, 0xef, 0x6b, 0x17, 0x68, - 0x96, 0x9f, 0x29, 0x2a, 0xf1, 0x13, 0xc1, 0xa0, 0x75, 0xb3, 0x7a, 0x39, - 0x04, 0x32, 0xa9, 0xc3, 0xe1, 0xfd, 0x9c, 0x2d, 0x76, 0x95, 0x49, 0x86, - 0x92, 0x6e, 0x1a, 0xf9, 0x26, 0x9d, 0x09, 0xb6, 0x51, 0xd3, 0x96, 0xf7, - 0x70, 0x9e, 0x23, 0x48, 0x10, 0x30, 0x2a, 0xd9, 0xb6, 0x3d, 0xe0, 0x3f, - 0x93, 0x21, 0xfd, 0x20, 0xff, 0xf6, 0xeb, 0x45, 0xb3, 0x9a, 0xe3, 0x2d, - 0x3d, 0xe9, 0x57, 0xb9, 0xab, 0xc5, 0xb7, 0x53, 0x49, 0x48, 0x31, 0x09, - 0x4b, 0x0c, 0x20, 0x0b, 0x20, 0x7f, 0x43, 0x3b, 0xc7, 0x04, 0x35, 0xcf, - 0x08, 0xa4, 0x4d, 0x6b, 0xff, 0x0a, 0xa9, 0xaa, 0xa2, 0x72, 0x1c, 0x5d, - 0x53, 0xde, 0xe6, 0x4b, 0x9b, 0xc9, 0x56, 0x56, 0x8b, 0x3a, 0xec, 0x4d, - 0xae, 0x4f, 0xef, 0x31, 0x3c, 0x2f, 0x42, 0xf2, 0xb7, 0x23, 0xb3, 0x50, - 0x3d, 0xb6, 0xcb, 0xb3, 0xe9, 0x56, 0x7a, 0xca, 0xbb, 0x68, 0xbe, 0xec, - 0xb7, 0xd8, 0x82, 0x62, 0x3a, 0x30, 0xc2, 0xfa, 0xee, 0x1f, 0xbb, 0x86, - 0x91, 0x93, 0x71, 0x05, 0x72, 0x96, 0xf5, 0x11, 0xd7, 0x3f, 0xad, 0x7c, - 0x5f, 0xb7, 0x69, 0xe0, 0x4a, 0xbf, 0x1f, 0x7b, 0x44, 0x2b, 0x51, 0x21, - 0xda, 0x72, 0x23, 0xbc, 0x46, 0x7f, 0x02, 0x40, 0x5b, 0xef, 0xcc, 0x7c, - 0x8a, 0x33, 0xd5, 0xe8, 0x52, 0x1a, 0x9a, 0xe1, 0x13, 0x3c, 0x56, 0xa5, - 0xe7, 0x77, 0x22, 0x72, 0x36, 0x7f, 0x57, 0x57, 0xe5, 0x32, 0xf6, 0x2a, - 0xf7, 0xab, 0xf9, 0xfa, 0x87, 0xe9, 0x20, 0xe6, 0xe3, 0xed, 0xcb, 0x3e, - 0x9b, 0xf0, 0xa7, 0x99, 0x06, 0xd7, 0xaa, 0x3d, 0x3a, 0x80, 0xf2, 0xd5, - 0x7b, 0x37, 0xc4, 0xbc, 0x26, 0x97, 0x72, 0x78, 0x56, 0x37, 0xa2, 0xd6, - 0x90, 0x37, 0xcd, 0xf9, 0x78, 0xd8, 0x8d, 0xf8, 0x10, 0x30, 0xd7, 0x61, - 0xe9, 0x5c, 0x00, 0xc1, 0x8a, 0x11, 0x88, 0xf2, 0x4e, 0xab, 0xce, 0x3f, - 0x55, 0x36, 0xfe, 0xd0, 0xa9, 0xf9, 0x6a, 0xcd, 0xed, 0xf3, 0xdc, 0x94, - 0x33, 0x0d, 0x10, 0x45, 0x3f, 0x54, 0x5c, 0x75, 0xfb, 0x05, 0x48, 0x27, - 0x4e, 0x2e, 0x75, 0xe3, 0x56, 0xd4, 0x92, 0xc9, 0x79, 0xb3, 0xb3, 0x93, - 0x6d, 0x89, 0x68, 0x85, 0xff, 0xee, 0x59, 0x76, 0xa5, 0x4e, 0xb6, 0x0b, - 0xa8, 0xfb, 0x23, 0x84, 0xdb, 0x3b, 0x53, 0x4a, 0xd5, 0xb7, 0x30, 0x4d, - 0x2a, 0x75, 0xb2, 0x71, 0xf4, 0xda, 0x73, 0x27, 0x56, 0x98, 0xcb, 0xe5, - 0x03, 0x6f, 0x43, 0xb4, 0x65, 0xbb, 0xb3, 0x0f, 0xc0, 0xfc, 0xdd, 0x45, - 0x7e, 0x99, 0x75, 0x16, 0xb6, 0x44, 0xfb, 0x0b, 0x1d, 0xe5, 0xb8, 0x44, - 0xe8, 0x87, 0xed, 0xed, 0x6d, 0x21, 0x8c, 0xa5, 0x55, 0xd2, 0xb5, 0xb2, - 0x36, 0xbc, 0xa3, 0x93, 0x5d, 0x6f, 0x73, 0x11, 0xba, 0xda, 0x75, 0xb9, - 0x98, 0x20, 0xef, 0x94, 0x3d, 0xf4, 0x08, 0x01, 0xab, 0xd7, 0xae, 0xe2, - 0x86, 0xd1, 0xe5, 0x64, 0xa8, 0x5b, 0x14, 0x99, 0x01, 0x8b, 0xa3, 0x09, - 0xa9, 0x1e, 0x44, 0x1c, 0xdc, 0x46, 0x33, 0xe7, 0xe5, 0x8a, 0x70, 0xb5, - 0xea, 0x1f, 0x4c, 0x21, 0x18, 0xfe, 0x75, 0xc9, 0x0b, 0x7a, 0xd1, 0x4c, - 0x94, 0x2d, 0x36, 0xf9, 0xe7, 0xe5, 0x67, 0x24, 0xa3, 0x43, 0xcc, 0x51, - 0xa0, 0xcb, 0x33, 0x9b, 0x36, 0x03, 0x1b, 0xdb, 0x91, 0xd7, 0xd8, 0xea, - 0x4d, 0x0a, 0x7b, 0x27, 0x6f, 0xee, 0x11, 0xc3, 0xc3, 0x52, 0x9c, 0x91, - 0x7b, 0x56, 0x10, 0x04, 0x70, 0xd7, 0x1f, 0x68, 0xfb, 0xa0, 0x53, 0x85, - 0x87, 0x21, 0x7a, 0xe9, 0xaf, 0x50, 0xe4, 0x80, 0x37, 0xe9, 0x12, 0x5c, - 0x69, 0x96, 0xbd, 0xe6, 0x69, 0xb8, 0x79, 0x64, 0x6f, 0x97, 0xd4, 0x0c, - 0x54, 0x45, 0xce, 0xee, 0x45, 0x07, 0xdf, 0x76, 0x44, 0xa0, 0xb7, 0x34, - 0x8d, 0xfc, 0x2b, 0x3d, 0xe1, 0x40, 0xa2, 0xf3, 0xeb, 0xb6, 0x22, 0x7f, - 0x76, 0x9f, 0x72, 0x01, 0x59, 0xee, 0x99, 0x17, 0x2b, 0xbf, 0x7f, 0x29, - 0x62, 0x87, 0x25, 0x50, 0x12, 0x7a, 0x86, 0x55, 0x2a, 0x74, 0xf6, 0x1f, - 0x39, 0xc6, 0xb8, 0x4b, 0xac, 0x5a, 0x63, 0x7a, 0xa9, 0xe3, 0x8c, 0xdd, - 0x70, 0xc0, 0xb4, 0x5d, 0x88, 0xa8, 0x8e, 0xc1, 0xc0, 0xa8, 0xf3, 0xf6, - 0x91, 0x9f, 0xe4, 0x64, 0x3f, 0x79, 0x29, 0xc1, 0xfc, 0x4c, 0x31, 0xb1, - 0x5b, 0x30, 0x61, 0x7e, 0xc6, 0x68, 0xc5, 0x27, 0x5e, 0xb5, 0x83, 0xd2, - 0x58, 0x75, 0x43, 0xb3, 0x75, 0x4a, 0x0e, 0xa8, 0xf2, 0xd8, 0x80, 0x6d, - 0x31, 0x9e, 0x48, 0x3f, 0x09, 0x39, 0xf8, 0xc0, 0x97, 0x4b, 0x4e, 0xa6, - 0xad, 0xcc, 0x18, 0xee, 0x44, 0x0d, 0xe8, 0x5e, 0xbd, 0xb7, 0x34, 0x65, - 0x60, 0x64, 0x36, 0xb3, 0xb9, 0xa2, 0x50, 0xd8, 0x34, 0x47, 0x39, 0xbe, - 0x0d, 0x80, 0x24, 0x2d, 0x75, 0x73, 0x32, 0x4f, 0x10, 0x6c, 0x59, 0xe0, - 0xb0, 0x95, 0x3a, 0x96, 0x86, 0x6e, 0xf5, 0x74, 0xb5, 0x78, 0x97, 0x53, - 0x87, 0xf8, 0x9e, 0x3f, 0xa5, 0x1e, 0x22, 0xd5, 0xa5, 0xf7, 0x78, 0xb2, - 0xbb, 0x22, 0x1d, 0xc6, 0x70, 0x79, 0x26, 0x97, 0x18, 0x58, 0x80, 0x1c, - 0x43, 0xc8, 0xae, 0x44, 0xbf, 0x09, 0x83, 0x30, 0xec, 0x0f, 0xb1, 0x86, - 0x3b, 0x3e, 0x1a, 0x4f, 0x4e, 0x8e, 0xa6, 0x23, 0xf7, 0x9a, 0xfa, 0x4e, - 0x42, 0xcb, 0x02, 0x1f, 0xc8, 0x0a, 0xfa, 0xe5, 0x7c, 0x1c, 0xda, 0x68, - 0xb2, 0x9c, 0x99, 0x68, 0x5d, 0x70, 0x71, 0x24, 0xb1, 0x1f, 0x29, 0xba, - 0xc4, 0x81, 0x01, 0x78, 0x77, 0x06, 0x46, 0xdd, 0x54, 0x53, 0xae, 0x13, - 0xd6, 0x50, 0xaf, 0x48, 0xfd, 0x57, 0x98, 0xae, 0x1f, 0xff, 0x34, 0x91, - 0xe8, 0xfd, 0x3f, 0xbf, 0x7c, 0x99, 0x78, 0x48, 0x9a, 0xe4, 0x9a, 0xea, - 0x78, 0xf7, 0x94, 0x42, 0x0b, 0x7a, 0x63, 0x06, 0xa2, 0x25, 0xc4, 0x63, - 0x30, 0x82, 0x05, 0x8c, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, - 0x01, 0x07, 0x01, 0xa0, 0x82, 0x05, 0x7d, 0x04, 0x82, 0x05, 0x79, 0x30, - 0x82, 0x05, 0x75, 0x30, 0x82, 0x05, 0x71, 0x06, 0x0b, 0x2a, 0x86, 0x48, - 0x86, 0xf7, 0x0d, 0x01, 0x0c, 0x0a, 0x01, 0x02, 0xa0, 0x82, 0x05, 0x39, - 0x30, 0x82, 0x05, 0x35, 0x30, 0x5f, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, - 0xf7, 0x0d, 0x01, 0x05, 0x0d, 0x30, 0x52, 0x30, 0x31, 0x06, 0x09, 0x2a, - 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x05, 0x0c, 0x30, 0x24, 0x04, 0x10, - 0x5e, 0x1a, 0x19, 0x51, 0xeb, 0x2e, 0x9b, 0xf2, 0xdd, 0xfe, 0x32, 0x0b, - 0x8e, 0x13, 0xa4, 0xac, 0x02, 0x02, 0x08, 0x00, 0x30, 0x0c, 0x06, 0x08, - 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x02, 0x09, 0x05, 0x00, 0x30, 0x1d, - 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x01, 0x2a, 0x04, - 0x10, 0x2e, 0x39, 0xe8, 0x93, 0xe5, 0x92, 0x85, 0x7f, 0x21, 0xa3, 0xf4, - 0x89, 0xda, 0x51, 0xf9, 0xcf, 0x04, 0x82, 0x04, 0xd0, 0x37, 0x51, 0x2f, - 0x8d, 0xd3, 0x48, 0x0f, 0x17, 0xe1, 0x8a, 0x4b, 0xb9, 0xc2, 0x49, 0x0c, - 0x60, 0x81, 0x0d, 0x0a, 0x2e, 0x4a, 0x44, 0x93, 0x62, 0x9b, 0x24, 0xc8, - 0x81, 0x2f, 0x8d, 0x91, 0xce, 0x98, 0x4a, 0xcd, 0x07, 0xd6, 0xd5, 0xb9, - 0x89, 0xad, 0xdf, 0xc2, 0x7d, 0x29, 0x43, 0x5f, 0xb8, 0x65, 0x2f, 0x18, - 0x51, 0x2c, 0x5f, 0xab, 0xe3, 0xa9, 0x0d, 0x02, 0xf5, 0xd5, 0x9a, 0x0e, - 0x4c, 0x3d, 0x84, 0x4a, 0x92, 0x61, 0xb8, 0x34, 0xfd, 0xe9, 0x1a, 0xd6, - 0xeb, 0xf1, 0x15, 0x90, 0x43, 0x71, 0xd0, 0xdf, 0x61, 0x09, 0xa3, 0x24, - 0x1f, 0x0c, 0x04, 0xb1, 0x8e, 0x4a, 0x9b, 0xe9, 0x35, 0xf9, 0x9a, 0x84, - 0xd6, 0xaf, 0xc6, 0xb3, 0x1c, 0x7c, 0xa9, 0xb9, 0x44, 0x09, 0xc9, 0x45, - 0xe0, 0xb7, 0x4a, 0x6d, 0x27, 0x68, 0x0a, 0xd8, 0x95, 0x1f, 0x4b, 0x4d, - 0x7f, 0x4a, 0x18, 0xd0, 0x1d, 0x5a, 0x46, 0xd5, 0xcb, 0x7e, 0xfd, 0x6d, - 0xf2, 0x9f, 0x3b, 0xe0, 0xe0, 0x71, 0xa3, 0xbf, 0xd1, 0x5b, 0xff, 0xd5, - 0x3d, 0xc2, 0xda, 0xcd, 0x27, 0xa2, 0x90, 0x5b, 0x13, 0xa9, 0x99, 0x4e, - 0xd1, 0x60, 0x85, 0x14, 0x09, 0x26, 0x5d, 0x9e, 0x52, 0x4a, 0x7e, 0x2b, - 0x98, 0x2b, 0xf4, 0x8b, 0xd4, 0x35, 0xdb, 0xd8, 0xe4, 0xa8, 0x51, 0xc4, - 0xd7, 0xf7, 0x3a, 0xad, 0xe7, 0x80, 0xa6, 0xe1, 0x44, 0xe9, 0x95, 0x6e, - 0x3e, 0xc5, 0x69, 0x95, 0x79, 0xb7, 0x02, 0x02, 0x59, 0x29, 0xa4, 0x90, - 0x82, 0x7e, 0xb3, 0x14, 0x28, 0x47, 0xab, 0x2e, 0xdd, 0x5e, 0x43, 0xa6, - 0xd8, 0xec, 0x80, 0xe4, 0x0e, 0x0c, 0x0d, 0x2e, 0xc7, 0xc9, 0xdb, 0xbb, - 0x23, 0xe2, 0xa9, 0x3a, 0x0d, 0x7e, 0xb3, 0x77, 0x12, 0xf0, 0x18, 0xbd, - 0x41, 0x1c, 0x96, 0x43, 0xf2, 0xb6, 0x3a, 0xc0, 0xd2, 0x90, 0x5d, 0x7f, - 0x4d, 0xa4, 0xda, 0x50, 0x28, 0x60, 0x62, 0x36, 0x05, 0xc6, 0xa1, 0x2f, - 0xd6, 0x91, 0xcf, 0x4a, 0xc4, 0x0b, 0x33, 0xd4, 0x33, 0xd2, 0x85, 0xae, - 0xbd, 0xb3, 0xc2, 0x21, 0x2e, 0x74, 0x67, 0x62, 0x01, 0x91, 0xbf, 0xaf, - 0x1a, 0xa6, 0x52, 0x8f, 0xe1, 0x5c, 0x2c, 0xf9, 0x34, 0x98, 0x7f, 0xcc, - 0x9f, 0x6c, 0xf1, 0x1b, 0x0f, 0x8f, 0x99, 0xf1, 0x91, 0x34, 0xa4, 0x11, - 0xf3, 0x86, 0x23, 0xe8, 0x95, 0x6a, 0x07, 0xad, 0x52, 0x2e, 0xec, 0xdd, - 0x81, 0xd9, 0xb5, 0x49, 0x9c, 0x1d, 0x3e, 0x89, 0x88, 0x90, 0x56, 0x7f, - 0xc1, 0xff, 0x46, 0xf3, 0x8f, 0xf6, 0xbd, 0x0d, 0x57, 0x9c, 0x2a, 0xad, - 0x86, 0xb3, 0x81, 0x45, 0x13, 0x1f, 0x11, 0x61, 0xe0, 0x45, 0xa4, 0x55, - 0x68, 0xb7, 0x6c, 0x48, 0x94, 0x05, 0xeb, 0x2e, 0x26, 0x4f, 0x41, 0x6a, - 0x9a, 0x28, 0x7d, 0x43, 0xb5, 0xcb, 0x78, 0x32, 0xf2, 0xf8, 0xb8, 0x05, - 0x85, 0x39, 0x24, 0xc7, 0x89, 0x04, 0x77, 0x23, 0xe3, 0x5d, 0x1f, 0x78, - 0x98, 0x09, 0xab, 0x8a, 0xbc, 0x2b, 0x8a, 0xf2, 0xc6, 0xd2, 0x85, 0x6e, - 0xb8, 0xe6, 0xb7, 0xb3, 0x5c, 0x0c, 0x2f, 0xe4, 0xdd, 0x2c, 0xab, 0xf2, - 0xf5, 0x48, 0x8e, 0xd4, 0xc1, 0x5b, 0xe9, 0x2b, 0xdb, 0x71, 0x7f, 0xc2, - 0xc0, 0x10, 0x96, 0x8a, 0x10, 0xd3, 0x5c, 0x1d, 0xf6, 0x26, 0xca, 0xcc, - 0x11, 0xa4, 0x23, 0xdc, 0x30, 0x48, 0x48, 0x73, 0x5d, 0x8a, 0x14, 0x09, - 0x3a, 0x8f, 0x89, 0x1d, 0x4f, 0xd5, 0x96, 0x87, 0x5e, 0xc7, 0x38, 0x63, - 0x40, 0x9b, 0x8d, 0x14, 0xc0, 0x3e, 0xd8, 0xeb, 0xf7, 0xc3, 0x2e, 0x88, - 0x90, 0x62, 0x68, 0x77, 0x72, 0xed, 0x35, 0xda, 0xf4, 0xed, 0xb0, 0x19, - 0xe1, 0xcb, 0x4c, 0x6a, 0x4a, 0x99, 0x88, 0x81, 0xcd, 0xd2, 0x0c, 0x24, - 0x32, 0x02, 0x72, 0x95, 0x86, 0xa8, 0x0d, 0xaa, 0x19, 0x33, 0x91, 0xeb, - 0xd0, 0xf2, 0x0f, 0x33, 0xd7, 0x85, 0xcf, 0x56, 0x58, 0x0e, 0x0b, 0xb4, - 0x6a, 0xb0, 0xdd, 0x0a, 0xed, 0x51, 0xb1, 0xa1, 0xbb, 0x9c, 0x3b, 0xf4, - 0x50, 0xea, 0x77, 0x34, 0x66, 0x28, 0x1f, 0xfc, 0xa7, 0xad, 0xb0, 0x50, - 0x29, 0x8d, 0x81, 0xf6, 0xd7, 0xbb, 0x21, 0xa8, 0x88, 0x98, 0xae, 0x5e, - 0x8b, 0xea, 0xc9, 0xc9, 0x50, 0xfb, 0xce, 0x81, 0x5d, 0xbc, 0x08, 0x87, - 0x8b, 0x04, 0x2a, 0x8a, 0xd1, 0x64, 0x08, 0x47, 0x5b, 0xeb, 0x72, 0xc5, - 0x1f, 0x90, 0x17, 0x3a, 0xb2, 0xb0, 0x01, 0x5a, 0x02, 0x57, 0xf4, 0x4f, - 0xdd, 0x40, 0xd0, 0xae, 0x2f, 0xd0, 0x58, 0x98, 0xa8, 0xa0, 0xb8, 0x37, - 0x0a, 0x74, 0x2f, 0x1a, 0x1a, 0x71, 0x93, 0xaf, 0xb2, 0xfa, 0xe1, 0x03, - 0x61, 0xb4, 0x59, 0x4a, 0xaa, 0x05, 0xf7, 0x30, 0xc9, 0xa0, 0x32, 0xdf, - 0x34, 0xb0, 0x16, 0xa6, 0xfc, 0x6a, 0x2b, 0x73, 0x50, 0x00, 0x1f, 0xf8, - 0x20, 0x09, 0x94, 0x55, 0xd9, 0x01, 0xa7, 0x55, 0x15, 0x32, 0xdb, 0x92, - 0xf4, 0x65, 0x02, 0xb5, 0x1e, 0x87, 0xde, 0x5c, 0xc1, 0x9e, 0x4b, 0xe3, - 0xa4, 0xc6, 0x61, 0xe2, 0x09, 0x6e, 0x9e, 0x60, 0x09, 0xfc, 0x1f, 0x88, - 0xb6, 0x8c, 0xc3, 0x44, 0x3a, 0xd0, 0x57, 0x82, 0xdc, 0x44, 0x62, 0x71, - 0xc2, 0x19, 0xf1, 0xf9, 0x3b, 0x06, 0xfd, 0xcd, 0xde, 0x87, 0xb7, 0xf8, - 0xfe, 0x36, 0xad, 0x56, 0x81, 0x7c, 0xfc, 0x72, 0x95, 0xda, 0xbe, 0xa4, - 0xfe, 0x5c, 0x20, 0xca, 0xb4, 0x11, 0xa4, 0xb1, 0x4a, 0x53, 0x60, 0x6d, - 0xd8, 0xc7, 0x08, 0xf0, 0xf2, 0x3a, 0xc4, 0x1d, 0xfa, 0xed, 0x58, 0x6e, - 0x5e, 0xd7, 0x61, 0xfb, 0xd7, 0xa6, 0x41, 0x51, 0x88, 0x69, 0xb5, 0x33, - 0xcd, 0x6a, 0x7a, 0x09, 0x9e, 0x2d, 0xce, 0x39, 0xe9, 0xd7, 0xf3, 0x40, - 0x6f, 0x18, 0x9c, 0x00, 0xbb, 0xb8, 0xaa, 0x96, 0x80, 0x41, 0x32, 0x86, - 0x85, 0xf0, 0xe2, 0xfc, 0x5d, 0x94, 0xdf, 0xf6, 0x83, 0xcc, 0x4b, 0xf9, - 0x98, 0xb2, 0x41, 0x06, 0xff, 0x2d, 0x40, 0xd8, 0x1a, 0x10, 0x55, 0xe6, - 0x24, 0x77, 0x82, 0x6f, 0xe9, 0x42, 0x5a, 0x5a, 0x94, 0x0b, 0xf1, 0xd9, - 0xf7, 0x47, 0x65, 0xae, 0x08, 0xda, 0x3b, 0x02, 0x8b, 0xdb, 0xbd, 0x03, - 0x21, 0x90, 0x56, 0x74, 0x11, 0xaa, 0x7e, 0x4f, 0x3a, 0xe0, 0x83, 0xbe, - 0x21, 0x40, 0x40, 0x5f, 0xad, 0x39, 0x94, 0xa7, 0x13, 0xfc, 0xbd, 0xc5, - 0x3b, 0x7a, 0x08, 0xbe, 0xa9, 0x68, 0xd9, 0x1d, 0x0e, 0x9c, 0xa7, 0x5b, - 0x9d, 0x3c, 0xb0, 0x41, 0xde, 0x9c, 0xf6, 0x6e, 0x8c, 0x04, 0x34, 0xed, - 0xfc, 0x8e, 0x55, 0xd3, 0xc5, 0x86, 0x78, 0xd2, 0x25, 0x7b, 0xaf, 0x1d, - 0xde, 0x5c, 0x80, 0x27, 0x27, 0x63, 0x16, 0x29, 0xa5, 0xc4, 0x3a, 0xd7, - 0xec, 0x85, 0x39, 0x37, 0xc0, 0x16, 0xae, 0x2b, 0x2d, 0x42, 0x7f, 0x72, - 0x73, 0x54, 0x23, 0xca, 0x1d, 0xa3, 0x92, 0x52, 0xec, 0x62, 0x1c, 0x43, - 0x34, 0x79, 0x19, 0x5a, 0x67, 0x07, 0x9f, 0x9a, 0xac, 0x5a, 0xf2, 0x92, - 0x16, 0x0a, 0x6e, 0xd9, 0x2a, 0x98, 0x66, 0x7c, 0x59, 0x66, 0xac, 0x5f, - 0x57, 0xb9, 0x5d, 0x2e, 0x33, 0xb3, 0x74, 0xcc, 0x74, 0x7e, 0x81, 0xfb, - 0x06, 0x6d, 0x7b, 0x47, 0xb2, 0xe0, 0x6f, 0x7d, 0xd4, 0x8a, 0x92, 0x13, - 0xfe, 0x9d, 0x5d, 0x56, 0x5a, 0x77, 0x29, 0x6e, 0x12, 0x4e, 0xa6, 0x47, - 0x8c, 0x75, 0xbe, 0x56, 0x27, 0x51, 0x41, 0xf2, 0x03, 0x4e, 0xb0, 0xae, - 0x9a, 0x9e, 0x5e, 0x2f, 0x2e, 0x4f, 0x8d, 0xa7, 0x45, 0x4b, 0x8c, 0xc5, - 0xaa, 0x4c, 0x14, 0x3f, 0x57, 0x74, 0x3f, 0xb8, 0xe0, 0xdc, 0x8e, 0xfd, - 0x70, 0x78, 0xf4, 0x50, 0xf3, 0x23, 0x3e, 0x6c, 0xcd, 0x98, 0x2c, 0x24, - 0x39, 0x4a, 0x8b, 0xea, 0x91, 0x67, 0xed, 0x84, 0xbd, 0x0e, 0x54, 0xdb, - 0xbd, 0x67, 0x52, 0x88, 0x63, 0x31, 0xef, 0x7c, 0x3d, 0xab, 0x61, 0xc2, - 0xfd, 0xcd, 0xb3, 0xf5, 0x33, 0xd8, 0xbd, 0xcd, 0x25, 0x1d, 0x93, 0x7f, - 0x4c, 0x41, 0xf2, 0x08, 0xc4, 0x97, 0xb6, 0xd3, 0x02, 0xc2, 0x1d, 0xc9, - 0x18, 0x4e, 0x3f, 0x84, 0xf7, 0x9a, 0xe2, 0x93, 0x08, 0x62, 0x0e, 0x19, - 0xc7, 0x6c, 0xb0, 0x53, 0x07, 0x2a, 0x22, 0xc3, 0x05, 0xcc, 0x11, 0xb0, - 0x97, 0x08, 0x98, 0x69, 0xe4, 0xfb, 0xb1, 0xe5, 0x45, 0xe2, 0xda, 0x14, - 0x6f, 0x60, 0xaa, 0xc1, 0x18, 0xb3, 0x1a, 0x78, 0x85, 0xbd, 0x70, 0x43, - 0x4a, 0xb3, 0x39, 0x0e, 0x38, 0x7b, 0x4c, 0xb9, 0x5b, 0x02, 0xbf, 0xda, - 0x65, 0xb7, 0xfb, 0x3d, 0xab, 0xde, 0x95, 0xb8, 0xea, 0xfe, 0xff, 0x8a, - 0xfa, 0x93, 0x11, 0x00, 0xf1, 0x2e, 0xa7, 0xb2, 0x34, 0x06, 0xdd, 0xdc, - 0xfc, 0x6c, 0xba, 0x38, 0x48, 0xde, 0xc8, 0xd0, 0x65, 0x22, 0x50, 0xf3, - 0x26, 0x87, 0x66, 0x2c, 0x3f, 0x14, 0x29, 0x50, 0x03, 0xb1, 0x05, 0x6a, - 0x3d, 0xa6, 0x9e, 0x9e, 0xbd, 0x5b, 0xf7, 0x20, 0x80, 0x5e, 0x52, 0x32, - 0xc9, 0x41, 0xb5, 0x6c, 0xf4, 0x4e, 0x16, 0xb5, 0x23, 0xd6, 0xa2, 0xbb, - 0xfc, 0x3f, 0xd5, 0x5a, 0x3f, 0x23, 0xa7, 0xce, 0x6a, 0xb9, 0x94, 0x05, - 0x38, 0x76, 0x86, 0x66, 0x97, 0x31, 0x25, 0x30, 0x23, 0x06, 0x09, 0x2a, - 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x15, 0x31, 0x16, 0x04, 0x14, - 0x3a, 0x9d, 0x84, 0xd4, 0xfd, 0x45, 0xd5, 0xc2, 0x80, 0x6d, 0xaf, 0x27, - 0x85, 0x1f, 0x23, 0xa3, 0xa0, 0xc7, 0xa9, 0x49, 0x30, 0x49, 0x30, 0x31, - 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, - 0x01, 0x05, 0x00, 0x04, 0x20, 0x25, 0xaf, 0xce, 0x7f, 0x92, 0xfb, 0x42, - 0x36, 0xe3, 0x97, 0xe4, 0x0c, 0x5e, 0x6f, 0x6e, 0x37, 0xe4, 0x0c, 0x4c, - 0x10, 0x18, 0x96, 0xba, 0xba, 0x9c, 0x0b, 0xa1, 0xb1, 0x04, 0x14, 0x1b, - 0x01, 0x04, 0x10, 0x67, 0xa7, 0x59, 0x31, 0xf2, 0x26, 0x1f, 0x63, 0xfe, - 0x87, 0x20, 0xeb, 0x11, 0xa8, 0x05, 0x00, 0x02, 0x02, 0x08, 0x00, + 0x4a, 0xf1, 0xc6, 0xb0, 0x9f, 0x84, 0xa9, 0xac, 0x5e, 0x8d, 0x51, 0xdf, + 0xd2, 0x06, 0xa4, 0x86, 0x80, 0x82, 0x04, 0x10, 0xf5, 0xe0, 0x38, 0xfd, + 0x09, 0x14, 0xe3, 0x7b, 0x1a, 0x00, 0x41, 0x2a, 0xc0, 0xeb, 0x77, 0x5f, + 0xc6, 0x3e, 0x80, 0x89, 0x05, 0x9f, 0x98, 0x17, 0xdf, 0x24, 0xaf, 0xc7, + 0x5f, 0x35, 0x6b, 0xf7, 0xbb, 0xb4, 0x27, 0xf0, 0x29, 0xec, 0xa5, 0x56, + 0xd4, 0x11, 0xdf, 0x20, 0xf1, 0xd9, 0xf3, 0x03, 0xc5, 0x29, 0xdd, 0x00, + 0xb8, 0xff, 0xf1, 0x06, 0x69, 0x5c, 0x81, 0x6a, 0x19, 0x23, 0x61, 0x5c, + 0x4b, 0x93, 0x21, 0x59, 0x4c, 0x33, 0x84, 0x0e, 0x2c, 0x31, 0xef, 0x58, + 0x6f, 0xcf, 0x01, 0x41, 0x9a, 0x16, 0x51, 0x2a, 0xf2, 0x23, 0x6b, 0xbd, + 0xc5, 0xbf, 0xc6, 0xee, 0x28, 0x1b, 0x3d, 0xcb, 0x6a, 0x18, 0xe8, 0x57, + 0xd3, 0x5b, 0x56, 0x4c, 0xe6, 0x29, 0xe8, 0x5d, 0x1d, 0x07, 0xc0, 0x1b, + 0x7d, 0xa2, 0xc4, 0x6e, 0x8e, 0x88, 0x14, 0x57, 0x94, 0x48, 0x0d, 0xbc, + 0x95, 0xee, 0x7a, 0xc8, 0xaa, 0x7d, 0xc0, 0x27, 0x2a, 0x09, 0xb8, 0x79, + 0x0b, 0x8e, 0x84, 0xc4, 0x17, 0x92, 0xda, 0xf8, 0x3a, 0x75, 0xc2, 0xef, + 0x1f, 0x49, 0xef, 0x6e, 0x3f, 0x6a, 0xe1, 0xe0, 0x2d, 0x14, 0xee, 0x6a, + 0xbe, 0xb6, 0x03, 0x5a, 0x93, 0x38, 0x18, 0x3f, 0x3d, 0xbc, 0xc3, 0x8c, + 0xcb, 0xaa, 0x1b, 0x7f, 0x02, 0xd5, 0xd1, 0xb5, 0x5d, 0x1e, 0x0d, 0xe5, + 0x27, 0x01, 0x24, 0xa5, 0xd2, 0x00, 0x41, 0x65, 0xff, 0x6c, 0xaa, 0x93, + 0x92, 0x0a, 0x0c, 0xef, 0xee, 0x6a, 0x2d, 0x17, 0x13, 0x31, 0xd1, 0xff, + 0x11, 0xe7, 0x51, 0x61, 0xe2, 0x27, 0xdf, 0x12, 0xf7, 0x7f, 0x65, 0xba, + 0x52, 0x97, 0x12, 0x0d, 0xa0, 0x1a, 0xda, 0x45, 0x5d, 0xfc, 0x5c, 0x04, + 0x29, 0x3b, 0x7c, 0xb9, 0xd3, 0x7d, 0x11, 0xbf, 0xb7, 0x82, 0xb6, 0x15, + 0x9e, 0x5a, 0xcd, 0xb7, 0xed, 0xb3, 0xf2, 0x20, 0x8b, 0x12, 0x1f, 0xa0, + 0x9a, 0x29, 0xbb, 0xbe, 0x21, 0x74, 0x14, 0x51, 0xd5, 0xad, 0xa0, 0xc2, + 0x12, 0x8f, 0xa7, 0xc2, 0x34, 0x66, 0x7f, 0x9c, 0xc5, 0x2d, 0x95, 0x5a, + 0xe5, 0xb4, 0xac, 0xf8, 0xb8, 0xd3, 0x70, 0x5b, 0x63, 0xe2, 0xcb, 0x78, + 0x9e, 0xd1, 0x10, 0xd6, 0xb7, 0x04, 0x62, 0x7a, 0xf5, 0x71, 0xb3, 0xde, + 0xf1, 0xea, 0xeb, 0x59, 0x35, 0xcc, 0xdc, 0xe8, 0xa3, 0x03, 0x79, 0xa1, + 0x97, 0x5e, 0xd4, 0xfa, 0xb8, 0xf0, 0x59, 0x25, 0x4c, 0xbc, 0x16, 0xbe, + 0xc3, 0x11, 0x9d, 0xdc, 0x96, 0x26, 0x73, 0x21, 0x9b, 0x4f, 0x32, 0x1a, + 0x82, 0xaf, 0x2d, 0xaa, 0x7b, 0x8f, 0x6f, 0x93, 0x15, 0xab, 0x7b, 0xf5, + 0xb6, 0xe9, 0x0e, 0x7e, 0xc0, 0xc2, 0x21, 0xc7, 0x96, 0x65, 0x4c, 0x78, + 0x6e, 0x2a, 0x2c, 0x62, 0x09, 0x68, 0x3b, 0xb9, 0x04, 0xcc, 0xdb, 0x64, + 0x51, 0x07, 0xd0, 0xa5, 0xe5, 0x4f, 0xff, 0x3e, 0x90, 0xa7, 0x28, 0xda, + 0x9e, 0xdb, 0xe2, 0x8f, 0x2e, 0x62, 0x51, 0xff, 0x71, 0x57, 0x28, 0xd7, + 0x69, 0xec, 0xe2, 0x27, 0xad, 0x54, 0xe4, 0x72, 0xa9, 0x6f, 0x9b, 0x5e, + 0xb3, 0xb2, 0xca, 0xfc, 0x82, 0xab, 0xa8, 0x59, 0xd5, 0x71, 0xef, 0x8a, + 0xde, 0xfe, 0xcc, 0x9a, 0x2f, 0xf7, 0xf7, 0x58, 0xbb, 0x00, 0x6d, 0xda, + 0x3c, 0x19, 0x12, 0x70, 0x14, 0xbe, 0x3a, 0x98, 0x9a, 0x33, 0xed, 0xe7, + 0xe6, 0x5d, 0x9d, 0xf3, 0x15, 0x62, 0x5b, 0x3f, 0xfd, 0x7e, 0xf2, 0x52, + 0x52, 0xa3, 0x30, 0x8a, 0x54, 0x13, 0xc0, 0x94, 0x56, 0x87, 0x42, 0x63, + 0xdc, 0x3b, 0x0d, 0x31, 0x69, 0x71, 0x21, 0xc2, 0xd8, 0xac, 0x07, 0xed, + 0x1b, 0xff, 0x0e, 0x74, 0x1b, 0xdc, 0x8d, 0xaa, 0xd5, 0x73, 0xcc, 0xc8, + 0xca, 0xdb, 0x6c, 0xbe, 0xec, 0xb5, 0x83, 0x47, 0x89, 0x03, 0x24, 0x92, + 0x43, 0xaf, 0x58, 0x66, 0x91, 0x1d, 0x02, 0x1a, 0xf7, 0xe1, 0x4c, 0x89, + 0x08, 0x9f, 0x15, 0xc2, 0x66, 0xb0, 0x0c, 0x82, 0x49, 0x37, 0x38, 0x06, + 0xf6, 0xec, 0xd5, 0x6e, 0x65, 0x5e, 0x38, 0xfd, 0x22, 0xa9, 0xe8, 0xe5, + 0x5b, 0x38, 0x8c, 0xcf, 0x89, 0xdb, 0x41, 0x52, 0xff, 0xad, 0x28, 0x69, + 0x7b, 0x7f, 0xe5, 0x29, 0x70, 0xb5, 0x4d, 0x7d, 0x6c, 0x76, 0x5b, 0xb6, + 0x0c, 0x32, 0x3d, 0xfd, 0xf4, 0xd7, 0xa2, 0xb0, 0x6c, 0x4e, 0x36, 0x35, + 0xa3, 0xce, 0x1e, 0xe2, 0x01, 0x98, 0x86, 0x6b, 0x0f, 0x47, 0xe1, 0xf7, + 0x1e, 0xab, 0x87, 0x1d, 0x7e, 0x10, 0x1b, 0x21, 0xd9, 0x2a, 0x3f, 0x70, + 0xad, 0xb8, 0x9d, 0x02, 0x83, 0xbc, 0xbc, 0x80, 0x42, 0xaa, 0x0d, 0xa4, + 0x51, 0x88, 0x3a, 0x25, 0x3c, 0xda, 0xea, 0xaf, 0x79, 0xe4, 0x19, 0x53, + 0x59, 0xed, 0x04, 0xb5, 0xe7, 0x4f, 0x7e, 0x0c, 0xae, 0xa2, 0x27, 0x36, + 0xf9, 0x1a, 0x1a, 0xc6, 0x7e, 0x82, 0x62, 0x96, 0xa0, 0x61, 0x80, 0x9b, + 0x11, 0x36, 0xc4, 0xbd, 0x6a, 0xf5, 0x38, 0x4f, 0x38, 0x7b, 0x40, 0xc2, + 0x42, 0x95, 0x56, 0xd7, 0xc4, 0x7f, 0x08, 0x59, 0xf7, 0xc8, 0x33, 0x36, + 0x5c, 0x9b, 0xd9, 0x37, 0xe8, 0x28, 0xf0, 0x18, 0xae, 0x7b, 0x5e, 0xb1, + 0xa9, 0x93, 0xf5, 0xf5, 0xa8, 0x9b, 0xcb, 0x64, 0x7b, 0x6f, 0xd9, 0x7f, + 0x56, 0xe5, 0x4b, 0xe4, 0x64, 0xc2, 0x49, 0x2a, 0x8d, 0x33, 0xba, 0xd9, + 0x66, 0xfa, 0x61, 0x88, 0xd0, 0x03, 0xfe, 0xe7, 0x85, 0x16, 0x53, 0xec, + 0x44, 0xc9, 0x03, 0xc3, 0x14, 0xc6, 0x1f, 0x21, 0x13, 0xa4, 0x1d, 0xe6, + 0x03, 0x65, 0x31, 0xc8, 0x83, 0x98, 0x2a, 0x2b, 0x51, 0x95, 0xec, 0x6f, + 0xd1, 0x3d, 0xd2, 0xbe, 0x00, 0xd2, 0x31, 0x0b, 0xd7, 0xc3, 0xd5, 0xe5, + 0x19, 0x73, 0x9f, 0xe6, 0x98, 0x73, 0x89, 0xdb, 0x40, 0xab, 0x93, 0x44, + 0xd5, 0x64, 0x3c, 0x7b, 0x37, 0x81, 0x01, 0x30, 0xe4, 0x65, 0x0e, 0x5f, + 0xf5, 0xaf, 0x20, 0x32, 0xfa, 0x45, 0xe7, 0x80, 0x09, 0xe4, 0x48, 0xae, + 0x9b, 0x12, 0xf5, 0xf9, 0x96, 0xa0, 0x1b, 0xef, 0x05, 0x65, 0xff, 0x79, + 0x3f, 0xd1, 0x63, 0x19, 0xf6, 0xa1, 0x02, 0xf7, 0x33, 0xe6, 0xa2, 0x8d, + 0x62, 0xcc, 0x62, 0xde, 0xf3, 0x17, 0xf3, 0xd7, 0x95, 0x4a, 0x8c, 0x3e, + 0x55, 0x6a, 0x84, 0x48, 0xe7, 0x34, 0xba, 0x14, 0xbc, 0x7a, 0x7e, 0x30, + 0x57, 0x31, 0x8a, 0x86, 0xbb, 0x7e, 0x96, 0x5a, 0xc4, 0x41, 0x31, 0xa3, + 0x4b, 0x08, 0x23, 0x14, 0xb4, 0x2d, 0xdc, 0x2a, 0xc1, 0xf8, 0xde, 0x4b, + 0x5f, 0xff, 0x3a, 0xd5, 0xee, 0x2d, 0x79, 0x24, 0x80, 0x8a, 0x59, 0x01, + 0xc9, 0x64, 0x95, 0xfc, 0x8c, 0x99, 0x94, 0x0e, 0xcf, 0xc0, 0x57, 0x24, + 0x53, 0x95, 0x2b, 0x50, 0x3b, 0x2e, 0xba, 0xe6, 0x34, 0x14, 0x9d, 0xc8, + 0xe3, 0xae, 0xce, 0xbf, 0x56, 0x6d, 0x6e, 0x08, 0xe1, 0x3e, 0xa2, 0xe8, + 0x4f, 0x96, 0xb2, 0x0e, 0x74, 0x79, 0x8e, 0x61, 0xb3, 0x4d, 0xf9, 0x1e, + 0x43, 0x4b, 0x39, 0x43, 0x55, 0xad, 0x12, 0x09, 0xa8, 0x0e, 0xca, 0xc4, + 0xa6, 0x1c, 0x23, 0xbb, 0x38, 0xa3, 0xc9, 0xfd, 0x42, 0x27, 0x83, 0x8f, + 0x30, 0x52, 0x48, 0x5b, 0x44, 0xb4, 0xf6, 0x2e, 0x0d, 0x53, 0xb7, 0xa6, + 0x6d, 0x23, 0xbb, 0x73, 0xf4, 0x62, 0xd3, 0xbd, 0x42, 0xea, 0x88, 0x72, + 0x0f, 0x56, 0x95, 0xaa, 0x17, 0xba, 0x68, 0x25, 0x7e, 0x48, 0x44, 0xcc, + 0x36, 0xcc, 0x50, 0xcb, 0xd6, 0x0d, 0x4b, 0xff, 0x6c, 0xd3, 0x5b, 0x16, + 0xcf, 0x44, 0x0f, 0x0d, 0x6b, 0x18, 0x59, 0xd4, 0x3c, 0xa7, 0x98, 0x61, + 0x91, 0xc4, 0x37, 0xc1, 0xc6, 0x95, 0xd3, 0x1c, 0x52, 0xf8, 0xdf, 0x43, + 0x1a, 0x78, 0xec, 0x42, 0xc2, 0x86, 0x78, 0x41, 0x50, 0x29, 0x8f, 0x0b, + 0x1b, 0x88, 0x7d, 0xdd, 0x30, 0x82, 0x05, 0x8c, 0x06, 0x09, 0x2a, 0x86, + 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x07, 0x01, 0xa0, 0x82, 0x05, 0x7d, 0x04, + 0x82, 0x05, 0x79, 0x30, 0x82, 0x05, 0x75, 0x30, 0x82, 0x05, 0x71, 0x06, + 0x0b, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x0c, 0x0a, 0x01, 0x02, + 0xa0, 0x82, 0x05, 0x39, 0x30, 0x82, 0x05, 0x35, 0x30, 0x5f, 0x06, 0x09, + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x05, 0x0d, 0x30, 0x52, 0x30, + 0x31, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x05, 0x0c, + 0x30, 0x24, 0x04, 0x10, 0x7c, 0x95, 0x80, 0x23, 0xa6, 0x1a, 0x06, 0x7e, + 0x9f, 0x33, 0xf2, 0x8b, 0x15, 0x57, 0x96, 0x0f, 0x02, 0x02, 0x08, 0x00, + 0x30, 0x0c, 0x06, 0x08, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x02, 0x09, + 0x05, 0x00, 0x30, 0x1d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, + 0x04, 0x01, 0x2a, 0x04, 0x10, 0xcb, 0x7d, 0x95, 0xaf, 0xd9, 0x93, 0xe0, + 0x82, 0x46, 0x1d, 0x71, 0x12, 0xa6, 0x12, 0x16, 0xec, 0x04, 0x82, 0x04, + 0xd0, 0x3f, 0x64, 0x09, 0x1f, 0x52, 0x7f, 0x64, 0xd3, 0xc9, 0x75, 0x3e, + 0xd5, 0xad, 0x78, 0xcd, 0x2d, 0x5f, 0x9a, 0x54, 0x1a, 0x1b, 0x11, 0x02, + 0xf4, 0x08, 0xb5, 0xc9, 0x72, 0x9d, 0xdd, 0x08, 0xfe, 0xb9, 0x19, 0x93, + 0x71, 0x01, 0xcd, 0xe9, 0x3c, 0xe1, 0x0a, 0x9c, 0x18, 0x88, 0xb6, 0x77, + 0xea, 0xa4, 0x86, 0x70, 0x0a, 0xc4, 0x2b, 0x2f, 0x81, 0xd4, 0xec, 0x03, + 0x62, 0x9b, 0xfc, 0xe4, 0x76, 0x89, 0xa0, 0xfa, 0x0f, 0x4a, 0xbd, 0xda, + 0xa5, 0x9d, 0xf4, 0x9a, 0x7b, 0x10, 0xe2, 0x65, 0xa7, 0xc6, 0x01, 0xf8, + 0xc0, 0x81, 0x0f, 0x1d, 0xe1, 0x89, 0x74, 0x47, 0xe8, 0xe5, 0x8a, 0x52, + 0x20, 0x76, 0x4f, 0x1b, 0xe7, 0xe1, 0x81, 0x7e, 0xb7, 0x0b, 0xea, 0xf2, + 0xe2, 0xbd, 0x29, 0xed, 0x8e, 0x0c, 0x79, 0x01, 0x8a, 0x51, 0x13, 0x7e, + 0x3a, 0xf2, 0x5d, 0x57, 0x41, 0xc8, 0x46, 0xa3, 0xea, 0x1d, 0x53, 0x7a, + 0x4c, 0x79, 0xce, 0xff, 0x78, 0x2f, 0xc8, 0xf1, 0xb3, 0x83, 0xed, 0xf6, + 0x4a, 0x1c, 0x1d, 0x7c, 0xcc, 0x2a, 0xd5, 0x69, 0x50, 0x7b, 0xeb, 0xf6, + 0x35, 0x99, 0x33, 0xfe, 0x40, 0x1e, 0xf8, 0x51, 0x0f, 0x6c, 0xca, 0xfb, + 0x7b, 0x22, 0xb4, 0x19, 0x72, 0x49, 0x95, 0x7d, 0x65, 0x63, 0x2b, 0xeb, + 0xf1, 0x27, 0x6a, 0x85, 0xe3, 0x02, 0x19, 0xed, 0xa3, 0x40, 0xf4, 0x49, + 0xa0, 0x2a, 0x72, 0x1f, 0x32, 0x69, 0x8b, 0x71, 0xc3, 0x1f, 0xc5, 0x54, + 0x46, 0x6e, 0x47, 0xa6, 0x86, 0x31, 0x0a, 0xcd, 0x02, 0xef, 0xbb, 0xb7, + 0x2d, 0xc6, 0x02, 0x89, 0x78, 0x09, 0x59, 0x9f, 0xe9, 0x35, 0x6a, 0x2e, + 0x5f, 0x94, 0x7f, 0xcf, 0x7f, 0x1f, 0xa7, 0xf8, 0x59, 0xe7, 0xc4, 0xf0, + 0xef, 0xec, 0x1f, 0x6c, 0x2e, 0xa9, 0x86, 0x29, 0x2f, 0x5f, 0x3d, 0xe6, + 0x2a, 0xb3, 0x61, 0x2b, 0xef, 0x13, 0x2f, 0xa7, 0xcb, 0xcb, 0x9f, 0x1e, + 0xb9, 0x0c, 0xeb, 0x43, 0x1a, 0xe9, 0xad, 0xbd, 0x7a, 0x87, 0xd8, 0x25, + 0x21, 0x0b, 0x43, 0xfd, 0x67, 0x28, 0x14, 0xfe, 0x1b, 0xca, 0x99, 0xb5, + 0xf5, 0xab, 0xa3, 0xb7, 0x0d, 0x31, 0x7a, 0xdd, 0xaa, 0x79, 0x35, 0xfb, + 0x43, 0xfd, 0x7a, 0x2d, 0xa5, 0xd7, 0x34, 0x62, 0xe3, 0xa4, 0xbc, 0x39, + 0x5e, 0x0c, 0x79, 0x63, 0xce, 0x9b, 0xd9, 0xf0, 0x37, 0xd1, 0x3f, 0x68, + 0xb2, 0xec, 0x77, 0x72, 0x6d, 0x33, 0x01, 0xfa, 0x09, 0x3c, 0x00, 0x88, + 0xed, 0xce, 0x44, 0xe6, 0xb4, 0xce, 0x9a, 0x70, 0xd1, 0x0f, 0x19, 0xfd, + 0xdc, 0x29, 0x07, 0xd8, 0xf2, 0xcd, 0xa5, 0x6b, 0x91, 0xeb, 0xce, 0xa5, + 0xe0, 0xec, 0xb7, 0xcc, 0x29, 0xab, 0x8a, 0x57, 0x90, 0xe0, 0x34, 0x70, + 0xae, 0xe4, 0x67, 0xd5, 0x6d, 0x73, 0xb2, 0x9d, 0x85, 0x57, 0x66, 0xee, + 0x34, 0x71, 0x77, 0xaa, 0xf5, 0xfc, 0xe4, 0xab, 0xdc, 0x54, 0xfb, 0xf3, + 0xf5, 0x15, 0xb1, 0x96, 0xa4, 0x9f, 0x3c, 0xca, 0x24, 0xfa, 0xb2, 0xbc, + 0xcf, 0x55, 0x32, 0x54, 0xa9, 0xf1, 0xd9, 0x9c, 0x58, 0x8e, 0xef, 0x7c, + 0x13, 0x0b, 0x15, 0xdb, 0x00, 0x9f, 0x8a, 0x67, 0xff, 0xe9, 0x63, 0xc2, + 0xc6, 0xae, 0x69, 0x89, 0x2a, 0xcc, 0x8d, 0x04, 0x33, 0x1d, 0xd1, 0x65, + 0x0d, 0x85, 0x5c, 0x3c, 0x42, 0xb0, 0x82, 0x6a, 0xad, 0xfa, 0x07, 0x83, + 0x92, 0xc8, 0x45, 0xe8, 0x70, 0x19, 0x81, 0xc2, 0xb9, 0xb4, 0xa5, 0x80, + 0x86, 0xd1, 0x2b, 0xb6, 0x15, 0x7a, 0xf3, 0xe2, 0x79, 0x9e, 0x53, 0xe2, + 0x50, 0x44, 0x69, 0xef, 0x9c, 0x03, 0x7a, 0x3b, 0x03, 0x6a, 0x7d, 0x03, + 0xc2, 0x2e, 0xd8, 0x74, 0x3f, 0xbc, 0xed, 0x74, 0xbe, 0x21, 0xac, 0x02, + 0x93, 0x55, 0x93, 0xe0, 0x25, 0xfb, 0xa7, 0x6e, 0x29, 0xce, 0xb2, 0xd8, + 0xf8, 0xef, 0xfa, 0x29, 0x65, 0x04, 0xca, 0xa4, 0x3b, 0x1d, 0x63, 0x13, + 0xb8, 0x09, 0xd5, 0x8e, 0xfe, 0x00, 0x50, 0xef, 0x5a, 0xba, 0xde, 0x92, + 0x87, 0x89, 0xc0, 0x38, 0xa9, 0x35, 0xb3, 0x96, 0x39, 0x9a, 0x45, 0xd6, + 0x2c, 0x74, 0x7a, 0x12, 0x52, 0x0e, 0x04, 0xb7, 0x47, 0xa5, 0x94, 0x90, + 0x8a, 0x0d, 0x69, 0x05, 0xc2, 0xa6, 0x92, 0xb8, 0x85, 0x2d, 0x43, 0x34, + 0x63, 0xc4, 0x8c, 0x27, 0xfe, 0xec, 0x61, 0xe2, 0x77, 0x6c, 0x35, 0x7c, + 0x97, 0x87, 0x19, 0x2f, 0x21, 0xa7, 0xa1, 0x62, 0xfe, 0x67, 0x49, 0x44, + 0x69, 0x34, 0xa5, 0x08, 0x0f, 0xf1, 0xc5, 0x9a, 0x32, 0x45, 0xab, 0x62, + 0x90, 0x6a, 0x07, 0xd2, 0xef, 0x09, 0x56, 0x45, 0x1e, 0xbb, 0x71, 0x7a, + 0xaa, 0x92, 0xcf, 0x9c, 0x15, 0x9c, 0xc1, 0x04, 0xaf, 0xea, 0x5b, 0xff, + 0xb8, 0x4a, 0xe3, 0x65, 0x40, 0x75, 0x54, 0x85, 0xca, 0xa3, 0x0c, 0x7d, + 0xf9, 0xd4, 0xcb, 0x47, 0x51, 0xf3, 0x6d, 0x72, 0x37, 0xae, 0xdc, 0x4f, + 0x47, 0x35, 0xb3, 0xb7, 0xcf, 0x10, 0x18, 0xe8, 0x31, 0x95, 0xd1, 0xc7, + 0xe8, 0x1d, 0xfb, 0xe5, 0xf1, 0x6e, 0x83, 0x44, 0x21, 0x72, 0xe1, 0x46, + 0x6e, 0x3c, 0xb6, 0x24, 0xa3, 0x1c, 0xca, 0xe0, 0xee, 0x9d, 0xb0, 0xfc, + 0xbf, 0xa3, 0xa1, 0xb7, 0x1e, 0xca, 0x51, 0x9c, 0xe8, 0x0f, 0xb4, 0xd4, + 0x2d, 0xa5, 0xdb, 0x03, 0x4f, 0x43, 0x9e, 0x26, 0x4d, 0xd3, 0xd8, 0x13, + 0x17, 0xa5, 0xac, 0xb5, 0x3e, 0x7f, 0x22, 0x22, 0x64, 0xf6, 0x42, 0x78, + 0xae, 0x78, 0x36, 0x5b, 0x3b, 0xea, 0x3b, 0x3b, 0xc2, 0xd3, 0x10, 0x30, + 0x50, 0xca, 0x73, 0xd8, 0xb8, 0x94, 0x30, 0x16, 0xe5, 0x4a, 0xb5, 0x77, + 0xbb, 0xa0, 0x5b, 0x89, 0x93, 0xde, 0x6d, 0x38, 0x32, 0x09, 0x51, 0xcc, + 0xf8, 0x1b, 0xc7, 0x20, 0x89, 0x1a, 0xbe, 0xd6, 0x6d, 0x21, 0x12, 0xc2, + 0x10, 0xf3, 0x94, 0x79, 0xbb, 0x43, 0xb3, 0x40, 0x6e, 0x6e, 0x55, 0xc6, + 0x38, 0x1e, 0xd3, 0x18, 0xf7, 0xf7, 0x50, 0x7d, 0xad, 0xde, 0x6a, 0x2c, + 0x43, 0xb6, 0x7a, 0xfd, 0xa9, 0x45, 0xaa, 0xe8, 0xbf, 0xb5, 0xbb, 0xea, + 0x32, 0xda, 0x94, 0x8b, 0x78, 0x65, 0x11, 0x5c, 0xd8, 0xd4, 0x84, 0x0d, + 0x1f, 0x51, 0x74, 0xba, 0x79, 0xff, 0xc0, 0x58, 0xbb, 0x6c, 0xd3, 0xcb, + 0x7d, 0xeb, 0x38, 0xd7, 0xcf, 0x50, 0xa8, 0xfd, 0xf2, 0xae, 0xb7, 0x32, + 0xb5, 0x82, 0xe3, 0xf8, 0x3d, 0xc3, 0x1a, 0xf3, 0x98, 0x1d, 0xe9, 0x5d, + 0xc3, 0x39, 0xc5, 0xd7, 0xff, 0xaf, 0x5e, 0xa9, 0x7e, 0x4d, 0x99, 0x2f, + 0xb9, 0xd0, 0x81, 0x83, 0x4a, 0x85, 0xe3, 0xff, 0xf4, 0x37, 0x45, 0xc8, + 0x5b, 0x31, 0x40, 0x41, 0x27, 0xf9, 0xfa, 0xbf, 0x30, 0xb0, 0xfd, 0x32, + 0x97, 0xc5, 0x55, 0x0d, 0x9c, 0x82, 0x41, 0x6e, 0x91, 0x6a, 0x14, 0x1b, + 0xcc, 0x57, 0x80, 0x31, 0xa4, 0xce, 0xa0, 0x38, 0xf5, 0xbd, 0x93, 0x54, + 0xb5, 0x2e, 0xfa, 0x93, 0x1e, 0x0c, 0x51, 0x6e, 0xd6, 0x4e, 0xa8, 0x92, + 0x80, 0x31, 0xa2, 0xfa, 0x61, 0x44, 0x7d, 0x8d, 0x4b, 0xdd, 0x46, 0x41, + 0xc7, 0x00, 0x62, 0x3e, 0x2f, 0x82, 0x74, 0x3f, 0xb1, 0xa5, 0x13, 0x53, + 0xd3, 0x07, 0x09, 0x5e, 0x5a, 0x64, 0x81, 0x08, 0x02, 0xac, 0x9c, 0x99, + 0x86, 0x8e, 0xc7, 0xfb, 0xc7, 0x95, 0x5b, 0xab, 0xfe, 0x6a, 0x69, 0xc1, + 0x2d, 0x5f, 0x0d, 0x6e, 0x61, 0xbd, 0x44, 0xdd, 0x6b, 0x47, 0xb7, 0x2e, + 0x05, 0x47, 0x7a, 0x03, 0x9a, 0x13, 0x0c, 0x18, 0x15, 0xd8, 0xc5, 0x14, + 0xaa, 0x26, 0x80, 0x81, 0xf7, 0x86, 0x2c, 0x6d, 0x8a, 0xb3, 0x65, 0xc7, + 0x6a, 0x66, 0x8f, 0xe2, 0x83, 0x86, 0x45, 0xb4, 0xa4, 0xa5, 0xf8, 0x77, + 0xee, 0xda, 0x7f, 0x2a, 0x64, 0xf9, 0x03, 0xab, 0xaa, 0x62, 0x81, 0x8d, + 0xc0, 0xf8, 0xe5, 0x41, 0xda, 0x1a, 0xcf, 0x45, 0x03, 0xa8, 0x0d, 0x47, + 0x84, 0xca, 0x73, 0xb0, 0x82, 0x21, 0x9c, 0xbb, 0x39, 0x0b, 0xe8, 0xab, + 0x78, 0xf4, 0x4d, 0x89, 0xf0, 0x8b, 0x5d, 0x9d, 0x5a, 0x7b, 0x32, 0x90, + 0x55, 0x35, 0x74, 0xd1, 0x2f, 0x26, 0xca, 0x93, 0xd2, 0x33, 0xeb, 0x05, + 0x39, 0x99, 0x5b, 0x93, 0xa4, 0x6f, 0xba, 0x85, 0x02, 0xce, 0x81, 0xcb, + 0xc8, 0x3e, 0xc1, 0xbb, 0x13, 0x7a, 0x8e, 0x78, 0xd9, 0xea, 0x25, 0x17, + 0x9b, 0xcf, 0x92, 0xd3, 0xab, 0xa3, 0x33, 0xf6, 0x9c, 0x10, 0x59, 0x3d, + 0xdb, 0x68, 0x77, 0x26, 0xf5, 0x13, 0x46, 0x82, 0xc1, 0x88, 0x4b, 0x90, + 0x2c, 0x18, 0x34, 0x7e, 0x55, 0x9e, 0x7b, 0x4c, 0x70, 0x0a, 0xeb, 0xe9, + 0x72, 0x0a, 0x78, 0xb6, 0xd8, 0x1d, 0xed, 0x61, 0x18, 0xbb, 0x83, 0xbe, + 0x47, 0x3b, 0x9b, 0x07, 0x10, 0x9f, 0xa7, 0x2d, 0xf4, 0xe5, 0x92, 0x74, + 0xb6, 0xff, 0xeb, 0xc8, 0x8a, 0x44, 0xb5, 0x26, 0xcf, 0x9a, 0x9d, 0x95, + 0x55, 0x9a, 0xdc, 0xcb, 0x7f, 0xc6, 0xb0, 0x27, 0xed, 0x9b, 0xcb, 0xf9, + 0x70, 0xc2, 0x7b, 0x5e, 0x1a, 0xec, 0x87, 0xc7, 0x5e, 0xca, 0xdb, 0xa9, + 0x7f, 0x02, 0xc7, 0x8b, 0xe6, 0x26, 0xc4, 0xa5, 0xcb, 0x89, 0x42, 0x14, + 0x9a, 0xcc, 0xfe, 0xc2, 0xa6, 0x41, 0xc5, 0xff, 0xf0, 0x31, 0x25, 0x30, + 0x23, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x15, + 0x31, 0x16, 0x04, 0x14, 0x5e, 0x51, 0x69, 0xdf, 0x7d, 0x05, 0xba, 0x30, + 0xdc, 0xb7, 0x00, 0x43, 0x3a, 0x0b, 0xa2, 0xc9, 0x7b, 0xb5, 0x2a, 0x30, + 0x30, 0x49, 0x30, 0x31, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, + 0x65, 0x03, 0x04, 0x02, 0x01, 0x05, 0x00, 0x04, 0x20, 0x04, 0x32, 0x0c, + 0x1c, 0x1d, 0x86, 0x8a, 0x5e, 0x1b, 0x4a, 0xa5, 0x93, 0x49, 0xab, 0x25, + 0x7d, 0x51, 0x04, 0xa0, 0x3c, 0xbc, 0x3b, 0x36, 0x3c, 0x9c, 0x06, 0xbd, + 0xbe, 0xd6, 0x26, 0x02, 0x04, 0x04, 0x10, 0x94, 0xf5, 0xe4, 0xec, 0x2b, + 0x9d, 0x32, 0x9a, 0x2e, 0x23, 0xf2, 0x4c, 0xcd, 0x5f, 0x49, 0x6a, 0x02, + 0x02, 0x08, 0x00, }; /// Passphrase matching `server_p12`.