From 81cbc9192704bfcc2bf405c77ce73de089db1006 Mon Sep 17 00:00:00 2001 From: Olek <115580134+oleks-rip@users.noreply.github.com> Date: Tue, 13 Jan 2026 16:38:48 -0500 Subject: [PATCH] Fix traces (#6127) * Fix traces * More tests for codecov * Review fixes * trace float test * Fix return value for traces * Remove SuiteJournalSink2 * Add explicit severity * Move logs to ApplyView * Add check for output strings * Merging fix --- src/test/app/HostFuncImpl_test.cpp | 347 +++++++++---- src/test/app/TestHostFunctions.h | 36 +- src/test/app/Wasm_test.cpp | 2 +- .../wasm_fixtures/codecov_tests/src/lib.rs | 32 +- src/test/app/wasm_fixtures/fixtures.cpp | 490 +++++++++--------- src/xrpld/app/wasm/detail/HostFuncImpl.cpp | 61 ++- src/xrpld/app/wasm/detail/WasmiVM.cpp | 30 +- 7 files changed, 594 insertions(+), 404 deletions(-) diff --git a/src/test/app/HostFuncImpl_test.cpp b/src/test/app/HostFuncImpl_test.cpp index 692b085102..9a5326e18d 100644 --- a/src/test/app/HostFuncImpl_test.cpp +++ b/src/test/app/HostFuncImpl_test.cpp @@ -62,19 +62,23 @@ static ApplyContext createApplyContext( test::jtx::Env& env, OpenView& ov, + beast::Journal j, STTx const& tx = STTx(ttESCROW_FINISH, [](STObject&) {})) { ApplyContext ac{ - env.app(), - ov, - tx, - tesSUCCESS, - env.current()->fees().base, - tapNONE, - env.journal}; + env.app(), ov, tx, tesSUCCESS, env.current()->fees().base, tapNONE, j}; return ac; } +static ApplyContext +createApplyContext( + test::jtx::Env& env, + OpenView& ov, + STTx const& tx = STTx(ttESCROW_FINISH, [](STObject&) {})) +{ + return createApplyContext(env, ov, env.journal, tx); +} + struct HostFuncImpl_test : public beast::unit_test::suite { void @@ -1912,24 +1916,63 @@ struct HostFuncImpl_test : public beast::unit_test::suite testcase("trace"); using namespace test::jtx; - Env env{*this}; - OpenView ov{*env.current()}; - ApplyContext ac = createApplyContext(env, ov); + { + Env env(*this); + OpenView ov{*env.current()}; + test::StreamSink sink{beast::severities::kTrace}; + beast::Journal jlog{sink}; + ApplyContext ac = createApplyContext(env, ov, jlog); - auto const dummyEscrow = - keylet::escrow(env.master, env.seq(env.master)); - WasmHostFunctionsImpl hfs(ac, dummyEscrow); + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); - std::string msg = "test trace"; - std::string data = "abc"; - auto const slice = Slice(data.data(), data.size()); - auto const result = hfs.trace(msg, slice, false); - BEAST_EXPECT(result.has_value()); - BEAST_EXPECT(result.value() == msg.size() + data.size()); + std::string msg = "test trace"; + std::string data = "abc"; + auto const slice = Slice(data.data(), data.size()); + auto const result = hfs.trace(msg, slice, false); + if (BEAST_EXPECT(result.has_value())) + { + BEAST_EXPECT(result.value() == msg.size() + data.size()); + auto const messages = sink.messages().str(); + BEAST_EXPECT(messages.find(msg) != std::string::npos); + } - auto const resultHex = hfs.trace(msg, slice, true); - BEAST_EXPECT(resultHex.has_value()); - BEAST_EXPECT(resultHex.value() == msg.size() + data.size() * 2); + auto const resultHex = hfs.trace(msg, slice, true); + if (BEAST_EXPECT(resultHex.has_value())) + { + BEAST_EXPECT(resultHex.has_value()); + BEAST_EXPECT(resultHex.value() == msg.size() + data.size() * 2); + auto const messages = sink.messages().str(); + std::string hex; + hex.reserve(data.size() * 2); + boost::algorithm::hex( + data.begin(), data.end(), std::back_inserter(hex)); + BEAST_EXPECT(messages.find(msg) != std::string::npos); + BEAST_EXPECT(messages.find(hex) != std::string::npos); + } + } + + { + // logs disabled (trace < error) + Env env(*this); + OpenView ov{*env.current()}; + test::StreamSink sink{beast::severities::kError}; + beast::Journal jlog{sink}; + ApplyContext ac = createApplyContext(env, ov, jlog); + + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + std::string msg = "test trace"; + std::string data = "abc"; + auto const slice = Slice(data.data(), data.size()); + auto const result = hfs.trace(msg, slice, false); + BEAST_EXPECT(result && *result == msg.size() + data.size()); + auto const messages = sink.messages().str(); + BEAST_EXPECT(messages.empty()); + } } void @@ -1938,19 +1981,49 @@ struct HostFuncImpl_test : public beast::unit_test::suite testcase("traceNum"); using namespace test::jtx; - Env env{*this}; - OpenView ov{*env.current()}; - ApplyContext ac = createApplyContext(env, ov); + { + Env env(*this); + OpenView ov{*env.current()}; + test::StreamSink sink{beast::severities::kTrace}; + beast::Journal jlog{sink}; + ApplyContext ac = createApplyContext(env, ov, jlog); - auto const dummyEscrow = - keylet::escrow(env.master, env.seq(env.master)); - WasmHostFunctionsImpl hfs(ac, dummyEscrow); + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); - std::string msg = "trace number"; - int64_t num = 123456789; - auto const result = hfs.traceNum(msg, num); - BEAST_EXPECT(result.has_value()); - BEAST_EXPECT(result.value() == msg.size() + sizeof(num)); + std::string msg = "trace number"; + int64_t num = 123456789; + auto const result = hfs.traceNum(msg, num); + if (BEAST_EXPECT(result.has_value())) + { + BEAST_EXPECT(result.value() == msg.size() + sizeof(num)); + auto const messages = sink.messages().str(); + BEAST_EXPECT(messages.find(msg) != std::string::npos); + BEAST_EXPECT( + messages.find(std::to_string(num)) != std::string::npos); + } + } + + { + // logs disabled + Env env(*this); + OpenView ov{*env.current()}; + test::StreamSink sink{beast::severities::kError}; + beast::Journal jlog{sink}; + ApplyContext ac = createApplyContext(env, ov, jlog); + + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + std::string msg = "trace number"; + int64_t num = 123456789; + auto const result = hfs.traceNum(msg, num); + BEAST_EXPECT(result && *result == msg.size() + sizeof(int64_t)); + auto const messages = sink.messages().str(); + BEAST_EXPECT(messages.empty()); + } } void @@ -1959,22 +2032,47 @@ struct HostFuncImpl_test : public beast::unit_test::suite testcase("traceAccount"); using namespace test::jtx; - Env env{*this}; - OpenView ov{*env.current()}; - ApplyContext ac = createApplyContext(env, ov); - - auto const dummyEscrow = - keylet::escrow(env.master, env.seq(env.master)); - WasmHostFunctionsImpl hfs(ac, dummyEscrow); - - std::string msg = "trace account"; - // Valid account { + Env env(*this); + OpenView ov{*env.current()}; + test::StreamSink sink{beast::severities::kTrace}; + beast::Journal jlog{sink}; + ApplyContext ac = createApplyContext(env, ov, jlog); + + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + std::string msg = "trace account"; auto const result = hfs.traceAccount(msg, env.master.id()); if (BEAST_EXPECT(result.has_value())) + { BEAST_EXPECT( - result.value() == - msg.size() + toBase58(env.master.id()).size()); + result.value() == msg.size() + env.master.id().size()); + auto const messages = sink.messages().str(); + BEAST_EXPECT(messages.find(msg) != std::string::npos); + BEAST_EXPECT( + messages.find(env.master.human()) != std::string::npos); + } + } + + { + // logs disabled + Env env(*this); + OpenView ov{*env.current()}; + test::StreamSink sink{beast::severities::kError}; + beast::Journal jlog{sink}; + ApplyContext ac = createApplyContext(env, ov, jlog); + + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + std::string msg = "trace account"; + auto const result = hfs.traceAccount(msg, env.master.id()); + BEAST_EXPECT( + result && *result == msg.size() + env.master.id().size()); + auto const messages = sink.messages().str(); + BEAST_EXPECT(messages.empty()); } } @@ -1984,46 +2082,72 @@ struct HostFuncImpl_test : public beast::unit_test::suite testcase("traceAmount"); using namespace test::jtx; - Env env{*this}; - OpenView ov{*env.current()}; - ApplyContext ac = createApplyContext(env, ov); - - auto const dummyEscrow = - keylet::escrow(env.master, env.seq(env.master)); - WasmHostFunctionsImpl hfs(ac, dummyEscrow); - - std::string msg = "trace amount"; - STAmount amount = XRP(12345); { + Env env(*this); + OpenView ov{*env.current()}; + test::StreamSink sink{beast::severities::kTrace}; + beast::Journal jlog{sink}; + ApplyContext ac = createApplyContext(env, ov, jlog); + + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + std::string msg = "trace amount"; + STAmount amount = XRP(12345); + { + auto const result = hfs.traceAmount(msg, amount); + if (BEAST_EXPECT(result.has_value())) + { + BEAST_EXPECT(*result == msg.size()); + auto const messages = sink.messages().str(); + BEAST_EXPECT(messages.find(msg) != std::string::npos); + BEAST_EXPECT( + messages.find(amount.getFullText()) != + std::string::npos); + } + } + + // IOU amount + Account const alice("alice"); + env.fund(XRP(1000), alice); + env.close(); + STAmount iouAmount = env.master["USD"](100); + { + auto const result = hfs.traceAmount(msg, iouAmount); + if (BEAST_EXPECT(result.has_value())) + BEAST_EXPECT(*result == msg.size()); + } + + // MPT amount + { + auto const mptId = makeMptID(42, env.master.id()); + Asset mptAsset = Asset(mptId); + STAmount mptAmount(mptAsset, 123456); + auto const result = hfs.traceAmount(msg, mptAmount); + if (BEAST_EXPECT(result.has_value())) + BEAST_EXPECT(*result == msg.size()); + } + } + + { + // logs disabled + Env env(*this); + OpenView ov{*env.current()}; + test::StreamSink sink{beast::severities::kError}; + beast::Journal jlog{sink}; + ApplyContext ac = createApplyContext(env, ov, jlog); + + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + std::string msg = "trace amount"; + STAmount amount = XRP(12345); auto const result = hfs.traceAmount(msg, amount); - if (BEAST_EXPECT(result.has_value())) - BEAST_EXPECT( - result.value() == msg.size() + amount.getFullText().size()); - } - - // IOU amount - Account const alice("alice"); - env.fund(XRP(1000), alice); - env.close(); - STAmount iouAmount = env.master["USD"](100); - { - auto const result = hfs.traceAmount(msg, iouAmount); - if (BEAST_EXPECT(result.has_value())) - BEAST_EXPECT( - result.value() == - msg.size() + iouAmount.getFullText().size()); - } - - // MPT amount - { - auto const mptId = makeMptID(42, env.master.id()); - Asset mptAsset = Asset(mptId); - STAmount mptAmount(mptAsset, 123456); - auto const result = hfs.traceAmount(msg, mptAmount); - if (BEAST_EXPECT(result.has_value())) - BEAST_EXPECT( - result.value() == - msg.size() + mptAmount.getFullText().size()); + BEAST_EXPECT(result && *result == msg.size()); + auto const messages = sink.messages().str(); + BEAST_EXPECT(messages.empty()); } } @@ -2058,28 +2182,51 @@ struct HostFuncImpl_test : public beast::unit_test::suite testcase("FloatTrace"); using namespace test::jtx; - Env env{*this}; - OpenView ov{*env.current()}; - ApplyContext ac = createApplyContext(env, ov); - - auto const dummyEscrow = - keylet::escrow(env.master, env.seq(env.master)); - WasmHostFunctionsImpl hfs(ac, dummyEscrow); - - std::string msg = "trace float"; - { - auto const result = hfs.traceFloat(msg, makeSlice(invalid)); - BEAST_EXPECT( - result && - *result == - msg.size() + 14 /* error msg size*/ + invalid.size() * 2); + Env env{*this}; + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + std::string msg = "trace float"; + + { + auto const result = hfs.traceFloat(msg, makeSlice(invalid)); + BEAST_EXPECT( + result && + *result == msg.size() + makeSlice(invalid).size()); + } + + { + auto const result = hfs.traceFloat(msg, makeSlice(floatMaxExp)); + BEAST_EXPECT( + result && + *result == msg.size() + makeSlice(floatMaxExp).size()); + } } { - auto const result = hfs.traceFloat(msg, makeSlice(floatMaxExp)); + // logs disabled + Env env(*this); + OpenView ov{*env.current()}; + test::StreamSink sink{beast::severities::kError}; + beast::Journal jlog{sink}; + ApplyContext ac = createApplyContext(env, ov, jlog); + + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + std::string msg = "trace float"; + + auto const result = hfs.traceFloat(msg, makeSlice(invalid)); BEAST_EXPECT( - result && *result == msg.size() + 19 /* string represenation*/); + result && *result == msg.size() + makeSlice(invalid).size()); + auto const messages = sink.messages().str(); + BEAST_EXPECT(messages.empty()); } } diff --git a/src/test/app/TestHostFunctions.h b/src/test/app/TestHostFunctions.h index 0cb010b0e9..a7f4c8038b 100644 --- a/src/test/app/TestHostFunctions.h +++ b/src/test/app/TestHostFunctions.h @@ -383,9 +383,12 @@ public: Expected trace(std::string_view const& msg, Slice const& data, bool asHex) override { + auto const ret = msg.size() + data.size() * (asHex ? 2 : 1); #ifdef DEBUG_OUTPUT auto& j = std::cerr; #else + if (!getJournal().active(beast::severities::kTrace)) + return ret; auto j = getJournal().trace(); #endif if (!asHex) @@ -407,15 +410,18 @@ public: j << std::endl; #endif - return msg.size() + data.size() * (asHex ? 2 : 1); + return ret; } Expected traceNum(std::string_view const& msg, int64_t data) override { + auto const ret = msg.size() + sizeof(data); #ifdef DEBUG_OUTPUT auto& j = std::cerr; #else + if (!getJournal().active(beast::severities::kTrace)) + return ret; auto j = getJournal().trace(); #endif j << "WASM TRACE NUM: " << msg << " " << data; @@ -423,15 +429,18 @@ public: #ifdef DEBUG_OUTPUT j << std::endl; #endif - return msg.size() + sizeof(data); + return ret; } Expected traceAccount(std::string_view const& msg, AccountID const& account) override { + auto const ret = msg.size() + account.size(); #ifdef DEBUG_OUTPUT auto& j = std::cerr; #else + if (!getJournal().active(beast::severities::kTrace)) + return ret; auto j = getJournal().trace(); #endif if (!account) @@ -440,15 +449,23 @@ public: auto const accountStr = toBase58(account); j << "WASM TRACE ACCOUNT: " << msg << " " << accountStr; - return msg.size() + accountStr.size(); + +#ifdef DEBUG_OUTPUT + j << std::endl; +#endif + + return ret; } Expected traceFloat(std::string_view const& msg, Slice const& data) override { + auto const ret = msg.size() + data.size(); #ifdef DEBUG_OUTPUT auto& j = std::cerr; #else + if (!getJournal().active(beast::severities::kTrace)) + return ret; auto j = getJournal().trace(); #endif auto const s = floatToString(data); @@ -457,20 +474,29 @@ public: #ifdef DEBUG_OUTPUT j << std::endl; #endif - return msg.size() + s.size(); + + return ret; } Expected traceAmount(std::string_view const& msg, STAmount const& amount) override { + auto const ret = msg.size(); #ifdef DEBUG_OUTPUT auto& j = std::cerr; #else + if (!getJournal().active(beast::severities::kTrace)) + return ret; auto j = getJournal().trace(); #endif auto const amountStr = amount.getFullText(); j << "WASM TRACE AMOUNT: " << msg << " " << amountStr; - return msg.size() + amountStr.size(); + +#ifdef DEBUG_OUTPUT + j << std::endl; +#endif + + return ret; } Expected diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index 543f57cccd..c61482a057 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -703,7 +703,7 @@ struct Wasm_test : public beast::unit_test::suite Bytes const wasm(wasmStr.begin(), wasmStr.end()); TestHostFunctions hfs(env, 0); - auto const allowance = 189'508; + auto const allowance = 185'974; auto re = runEscrowWasm(wasm, hfs, ESCROW_FUNCTION_NAME, {}, allowance); if (BEAST_EXPECT(re.has_value())) diff --git a/src/test/app/wasm_fixtures/codecov_tests/src/lib.rs b/src/test/app/wasm_fixtures/codecov_tests/src/lib.rs index 4cbc7e1707..a5aa2eb6e5 100644 --- a/src/test/app/wasm_fixtures/codecov_tests/src/lib.rs +++ b/src/test/app/wasm_fixtures/codecov_tests/src/lib.rs @@ -248,7 +248,7 @@ pub extern "C" fn finish() -> i32 { account.0.len(), ) }, - 47, + (message.len() + 20) as i32, "trace_account", ); let amount = &[0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5F]; // 95 drops of XRP @@ -261,7 +261,7 @@ pub extern "C" fn finish() -> i32 { amount.len(), ) }, - 19, + message.len() as i32, "trace_amount", ); let amount = &[0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]; // 0 drops of XRP @@ -274,7 +274,7 @@ pub extern "C" fn finish() -> i32 { amount.len(), ) }, - 18, + message.len() as i32, "trace_amount_zero", ); @@ -307,32 +307,6 @@ pub extern "C" fn finish() -> i32 { "get_parent_ledger_hash_len_too_long", ) }); - let message = "testing trace"; - check_result( - unsafe { - host::trace_account( - message.as_ptr(), - message.len(), - account.0.as_ptr(), - account.0.len(), - ) - }, - 47, - "trace_account", - ); - let amount = &[0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5F]; // 95 drops of XRP - check_result( - unsafe { - host::trace_amount( - message.as_ptr(), - message.len(), - amount.as_ptr(), - amount.len(), - ) - }, - 19, - "trace_amount", - ); // ######################################## // Step #3: Test getData[Type] edge cases diff --git a/src/test/app/wasm_fixtures/fixtures.cpp b/src/test/app/wasm_fixtures/fixtures.cpp index 493d5aca8a..3f339e7a0d 100644 --- a/src/test/app/wasm_fixtures/fixtures.cpp +++ b/src/test/app/wasm_fixtures/fixtures.cpp @@ -661,251 +661,251 @@ extern std::string const codecovTestsWasmHex = "61696e5f6b65796c6574000108686f73745f6c69620e7369676e6572735f6b65796c657400" "0008686f73745f6c69620d7469636b65745f6b65796c6574000108686f73745f6c69620c76" "61756c745f6b65796c657400010303020a0505030100110619037f01418080c0000b7f0041" - "a99ec0000b7f0041b09ec0000b072e04066d656d6f727902000666696e697368003d0a5f5f" - "646174615f656e6403010b5f5f686561705f6261736503020a9e2702460002402000200147" - "04402002200341004100410010001a20004100480d01418b80c000410b2000ad1001000b20" - "0220032000ac10011a0f0b418b80c000410b2000ac1001000bd426020a7f017e230041f001" - "6b22002400419680c000412341004100410010001a100241b9e00041b980c000410e103c10" - "0341b2920441c780c0004116103c200041f0006a22044200370300200041e8006a22064200" - "370300200041e0006a2203420037030020004200370358200041d8006a2201412010044120" - "41d88cc0004116103c1005410a41dd80c000410c103c200041186a2207428182848890a0c0" - "8001370300200041106a2208428182848890a0c08001370300200041086a22094281828488" - "90a0c080013703002000428182848890a0c0800137030041e980c000410e1006410141f780" - "c0004111103c200041201006410141f780c0004111103c4181802020014114100722024114" - "4604400240200041266a200041da006a2d00003a00002000200029005f3703c80120002000" - "41e4006a2900003700cd01200041306a20002900cd01370000200020002f00583b01242000" - "200028005b360027200020002903c80137002b200442003703002006420037030020034200" - "37030020004200370358200041246a2204411420014120100822024120470d002000413a6a" - "20002d005a3a0000200041d0016a2202200041e7006a290000220a370300200041c7006a20" - "0a370000200041cf006a200041ef006a290000370000200041d7006a200041f7006a2d0000" - "3a0000200020002f01583b01382000200028005b36003b2000200029005f37003f20004138" - "6a4120410010094101418881c0004110103c20064100360200200342003703002000420037" - "03584181802020014114100a411441ee8cc000411c103c2006410036020020034200370300" - "2000420037035841014181802020014114100b4114418a8dc0004114103c20004104360298" - "01200041818020360258200041d8016a2203410036020020024200370300200042003703c8" - "0120014104200041c8016a22064114100c4114419e8dc0004113103c200341003602002002" - "4200370300200042003703c801200120002802980120064114100d411441b18dc000412310" - "3c2003410036020020024200370300200042003703c8014101200120002802980120064114" - "100e411441d48dc000411b103c4189803c100f4120419881c0004110103c4189803c101041" - "2041a881c0004120103c41014189803c1011412041c881c0004118103c2001200028029801" - "1012412041e081c0004117103c20012000280298011013412041f781c0004127103c410120" - "0120002802980110144120419e82c000411f103c200441141015411441bd82c000410b103c" - "200041e0016a220542003703002003420037030020024200370300200042003703c8012001" - "200028029801200641201016412041ef8dc0004113103c41c882c000410c41d482c000410b" - "41df82c000410e1017410141ed82c0004109103c200041b8016a2007290300370300200041" - "b0016a2008290300370300200041a8016a2009290300370300200020002903003703a00120" - "0341003b010020024200370300200042003703c80120044114200041a0016a220741202006" - "41121018411241828ec0004107103c2003410036020020024200370300200042003703c801" - "20074120200641141019411441898ec000410e103c200041003602c8012007412020064104" - "101a410441978ec000410d103c20074120101b410841f682c000410d103c20074120101c41" - "0a418383c0004114103c200041003602c8012007412020064104101d410441a48ec000410e" - "103c419783c000410d20044114101e412f41a483c000410d103c419783c000410d41b183c0" - "004108101f411341b983c000410c103c419783c000410d41c583c0004108101f411241cd83" - "c0004111103c417f41041004417141de83c000411e103c200041003602c8012006417f1004" - "417141b28ec000411e103c200041ca016a41003a0000200041003b01c80120064103100441" - "7d41d08ec0004124103c200041003602c8012006418094ebdc031004417341f48ec0004123" - "103c419783c000410d20044114101e412f41a483c000410d103c419783c000410d41b183c0" - "004108101f411341b983c000410c103c200542003703002003420037030020024200370300" - "200042003703c801200041d894ebdc036a220741082006412041001020417341978fc00041" - "17103c200542003703002003420037030020024200370300200042003703c8012001200028" - "0298012006412041001020417141ae8fc0004119103c4102100f416f41fc83c000411f103c" - "417f20002802980110124171419b84c000411f103c2001417f1012417141ba84c000411f10" - "3c20014181201012417441d984c0004120103c20072000280298011012417341f984c00041" - "1f103c2007200028029801410110094173419885c0004118103c2001200028029801410110" - "09417141b085c000411a103c20054200370300200342003703002002420037030020004200" - "3703c8012007200028029801200641201008417341c78fc0004116103c2005420037030020" - "03420037030020024200370300200042003703c80120012000280298012006412010084171" - "41dd8fc0004118103c200542003703002003420037030020024200370300200042003703c8" - "0120044114200441142007200028029801200641201021417341f58fc000411c103c200542" - "003703002003420037030020024200370300200042003703c8012004411420044114200120" - "00280298012006412010214171419190c000411e103c200542003703002003420037030020" - "024200370300200042003703c80141959ec000411420072000280298012006412010224173" - "41af90c0004119103c200542003703002003420037030020024200370300200042003703c8" - "0141959ec00041142001200028029801200641201022417141c890c000411f103c20054200" - "3703002003420037030020024200370300200042003703c80141959ec000411441ca85c000" - "4114200641201022417141e790c0004129103c200542003703002003420037030020024200" - "370300200042003703c80141de85c000412841959ec00041142006412010224171419091c0" - "004125103c200041dc016a200041346a280100360200200041d4016a2000412c6a29010037" - "0200200020002901243702cc01200041808080083602c801200041003b01c0012006411841" - "959ec0004114200041c0016a220341021022417141b591c000410e103c2007200028029801" - "422a10014173418686c0004111103c200041003b01c0014102200341021007416f41c391c0" - "00411b103c200041003b01c001410220034102100a416f41de91c000412b103c200041003b" - "01c0014101410220034102100b416f418992c0004123103c4102100f416f41fc83c000411f" - "103c41021010416f419786c000412f103c410141021011416f41c686c0004127103c41e980" - "c0004181201006417441ed86c000411f103c41e980c00041c10010064174418c87c000411a" - "103c200041003b01c001200141812020034102100c417441ac92c0004121103c200041003b" - "01c001200141812020034102100d417441cd92c0004131103c200041003b01c00141012001" - "41812020034102100e417441fe92c0004129103c20014181201012417441a687c000412510" - "3c20014181201013417441cb87c0004135103c4101200141812010144174418088c000412d" - "103c20014181201015417441ad88c0004119103c419783c00041812041d482c000410b41df" - "82c000410e1017417441ed82c0004109103c419783c000410d41d482c00041812041df82c0" - "00410e1017417441ed82c0004109103c419783c000410d41d482c000410b41df82c0004181" - "201017417441ed82c0004109103c200041003b01c0012001418120200341021016417441a7" - "93c0004121103c200041003b01c00141959ec00041812041959ec000411420034102102241" - "7441c893c0004118103c200041003b01c00120044114200441142001418120200341021023" - "417441e093c000411f103c200041003b01c001200641812020044114200341021024417441" - "ff93c0004122103c419783c000410d200720002802980141001000417341c688c000410f10" - "3c200042d487b6f4c7d4b1c0003700c001419783c000410d200041c095ebdc036a22054108" - "1025417341d588c000411c103c419783c000410d2007200028029801101f417341f188c000" - "4116103c200541082003410810264173418789c0004118103c200341082005410810264173" - "419f89c0004118103c200041003b01ec012005410820034108200041ec016a220241024100" - "1027417341a194c0004114103c200041003b01ec0120034108200541082002410241001027" - "417341b594c0004114103c200041003b01ec01200541082003410820024102410010284173" - "41c994c0004119103c200041003b01ec0120034108200541082002410241001028417341e2" - "94c0004119103c200041003b01ec0120054108200341082002410241001029417341fb94c0" - "004119103c200041003b01ec01200341082005410820024102410010294173419495c00041" - "19103c200041003b01ec012005410820034108200241024100102a417341ad95c000411710" - "3c200041003b01ec012003410820054108200241024100102a417341c495c0004117103c20" - "0041003b01ec01200541084103200241024100102b417341db95c0004114103c200041003b" - "01ec01200541084103200241024100102c417341ef95c0004113103c200041003b01ec0120" - "054108200241024100102d4173418296c0004113103c200120002802980141001009417141" - "b789c0004123103c200041003b01ec01200441142001200028029801200241021018417141" - "9596c000411a103c200041003b01ec012001200028029801200241021019417141af96c000" - "4121103c200041003b01ec01200120002802980120024102101a417141d096c0004120103c" - "2001200028029801101b417141da89c0004120103c2001200028029801101c417141fa89c0" - "004127103c200041003602ec01200120002802980120024104101d417141f096c000412110" - "3c200041003b01ec0120012000280298012002410210084171419197c0004123103c200041" - "003b01ec012001200028029801410120024102102e417141b497c0004121103c200041003b" - "01ec01200120002802980122052004411420012005200241021023417141d597c000412710" - "3c200041003b01ec01200441142001200028029801220520012005200241021023417141fc" - "97c0004127103c200041003b01ec0120012000280298012004411420024102102f417141a3" - "98c0004125103c200041003b01ec0120044114200120002802980120024102102f417141c8" - "98c0004125103c200041003b01ec01200120002802980120044114200241021030417141ed" - "98c000412c103c200041003b01ec0120044114200120002802980120024102103041714199" - "99c000412c103c200041003b01ec012001200028029801200241021031417141c599c00041" - "1f103c200041003b01ec0120012000280298014101200241021032417141e499c000412210" - "3c200041003b01ec0120012000280298012004411441ca85c0004114200241021021417141" - "869ac0004121103c200041003b01ec0120044114200120002802980141ca85c00041142002" - "41021021417141a79ac0004121103c200041003b01ec012001200028029801410120024102" - "1033417141c89ac0004128103c200041003b01ec0120064118200120002802980120024102" - "1024417141f09ac0004123103c200041003b01ec0120012000280298014101200241021034" - "417141939bc0004125103c200041003b01ec01200120002802980141012002410210354171" - "41b89bc0004121103c200041003b01ec0120012000280298014101200241021036417141d9" - "9bc0004122103c200041003b01ec0120012000280298012004411441012002410210374171" - "41fb9bc0004124103c200041003b01ec012004411420012000280298014101200241021037" - "4171419f9cc0004124103c200041003b01ec01200120002802980141012002410210384171" - "41c39cc000412f103c200041003b01ec012001200028029801200241021039417141f29cc0" - "004123103c200041003b01ec012001200028029801410120024102103a417141959dc00041" - "22103c200041003b01ec012001200028029801410120024102103b417141b79dc000412110" - "3c200041003b01ec01200120002802980141a18ac0004120200241021018417141d89dc000" - "411c103c419783c000410d2001200028029801101e417141c18ac0004122103c419797abdd" - "03410d41a18ac000412041001000417341e38ac0004110103c419797abdd03410d20034108" - "1025417341f38ac000411d103c419797abdd03410d20044114101e417341908bc000411810" - "3c419797abdd03410d41b183c0004108101f417341a88bc0004117103c2001200028029801" - "200141812041001000417441bf8bc000410e103c200141812042011001417441cd8bc00041" - "12103c419783c000418120200341081025417441df8bc000411b103c419783c00041812020" - "044114101e417441fa8bc0004116103c419783c00041812041b183c0004108101f41744190" - "8cc0004115103c419783c000410d2001200028029801101f417141a58cc0004119103c2000" - "41003b01ec01200120002802980120044114200241021024417141f49dc0004121103c4101" - "410020044114101e412241be8cc000411a103c200041f0016a240041010f0b0b418080c000" - "410b417f20022002417f4e1bac1001000b0b801e0200418080c0000bde056572726f725f63" - "6f64653d54455354204641494c45442424242424205354415254494e47205741534d204558" - "45435554494f4e2024242424246765745f6c65646765725f73716e6765745f706172656e74" - "5f6c65646765725f74696d656765745f626173655f666565746573745f616d656e646d656e" - "74616d656e646d656e745f656e61626c656463616368655f6c65646765725f6f626a676574" - "5f74785f61727261795f6c656e6765745f63757272656e745f6c65646765725f6f626a5f61" - "727261795f6c656e6765745f6c65646765725f6f626a5f61727261795f6c656e6765745f74" - "785f6e65737465645f61727261795f6c656e6765745f63757272656e745f6c65646765725f" - "6f626a5f6e65737465645f61727261795f6c656e6765745f6c65646765725f6f626a5f6e65" - "737465645f61727261795f6c656e7570646174655f6461746174657374206d657373616765" - "74657374207075626b657974657374207369676e6174757265636865636b5f736967676574" - "5f6e66745f666c6167736765745f6e66745f7472616e736665725f66656574657374696e67" - "20747261636574726163655f6163636f756e74400000000000005f74726163655f616d6f75" - "6e74400000000000000074726163655f616d6f756e745f7a65726f6765745f706172656e74" - "5f6c65646765725f686173685f6e65675f7074726765745f74785f61727261795f6c656e5f" - "696e76616c69645f736669656c646765745f74785f6e65737465645f61727261795f6c656e" - "5f6e65675f7074726765745f74785f6e65737465645f61727261795f6c656e5f6e65675f6c" - "656e6765745f74785f6e65737465645f61727261795f6c656e5f746f6f5f6c6f6e67676574" - "5f74785f6e65737465645f61727261795f6c656e5f7074725f6f6f6263616368655f6c6564" - "6765725f6f626a5f7074725f6f6f6263616368655f6c65646765725f6f626a5f77726f6e67" - "5f6c656e555344303030303030303030303030303030303000418686c0000b8f1874726163" - "655f6e756d5f6f6f625f7374726765745f63757272656e745f6c65646765725f6f626a5f61" - "727261795f6c656e5f696e76616c69645f736669656c646765745f6c65646765725f6f626a" - "5f61727261795f6c656e5f696e76616c69645f736669656c64616d656e646d656e745f656e" - "61626c65645f746f6f5f6269675f736c696365616d656e646d656e745f656e61626c65645f" - "746f6f5f6c6f6e676765745f74785f6e65737465645f61727261795f6c656e5f746f6f5f62" - "69675f736c6963656765745f63757272656e745f6c65646765725f6f626a5f6e6573746564" - "5f61727261795f6c656e5f746f6f5f6269675f736c6963656765745f6c65646765725f6f62" - "6a5f6e65737465645f61727261795f6c656e5f746f6f5f6269675f736c6963657570646174" - "655f646174615f746f6f5f6269675f736c69636574726163655f6f6f625f736c6963657472" - "6163655f6f70617175655f666c6f61745f6f6f625f736c69636574726163655f616d6f756e" - "745f6f6f625f736c696365666c6f61745f636f6d706172655f6f6f625f736c69636531666c" - "6f61745f636f6d706172655f6f6f625f736c6963653263616368655f6c65646765725f6f62" - "6a5f77726f6e675f73697a655f75696e743235366765745f6e66745f666c6167735f77726f" - "6e675f73697a655f75696e743235366765745f6e66745f7472616e736665725f6665655f77" - "726f6e675f73697a655f75696e743235363030303030303030303030303030303030303030" - "30303030303030303030303174726163655f6163636f756e745f77726f6e675f73697a655f" - "6163636f756e74696474726163655f6f6f625f737472696e6774726163655f6f7061717565" - "5f666c6f61745f6f6f625f737472696e6774726163655f6163636f756e745f6f6f625f7374" - "72696e6774726163655f616d6f756e745f6f6f625f737472696e6774726163655f746f6f5f" - "6c6f6e6774726163655f6e756d5f746f6f5f6c6f6e6774726163655f6f70617175655f666c" - "6f61745f746f6f5f6c6f6e6774726163655f6163636f756e745f746f6f5f6c6f6e67747261" - "63655f616d6f756e745f746f6f5f6c6f6e6774726163655f616d6f756e745f77726f6e675f" - "6c656e67746874726163655f6163636f756e745f636865636b5f646573796e636765745f70" - "6172656e745f6c65646765725f686173686765745f63757272656e745f6c65646765725f6f" - "626a5f6669656c646765745f6c65646765725f6f626a5f6669656c646765745f74785f6e65" - "737465645f6669656c646765745f63757272656e745f6c65646765725f6f626a5f6e657374" - "65645f6669656c646765745f6c65646765725f6f626a5f6e65737465645f6669656c64636f" - "6d707574655f7368613531325f68616c666765745f6e66746765745f6e66745f6973737565" - "726765745f6e66745f7461786f6e6765745f6e66745f73657269616c6765745f706172656e" - "745f6c65646765725f686173685f6e65675f6c656e6765745f706172656e745f6c65646765" - "725f686173685f6275665f746f6f5f736d616c6c6765745f706172656e745f6c6564676572" - "5f686173685f6c656e5f746f6f5f6c6f6e67666c6f61745f66726f6d5f75696e745f6c656e" - "5f6f6f62666c6f61745f66726f6d5f75696e745f77726f6e675f6c656e6163636f756e745f" - "6b65796c65745f6c656e5f6f6f626163636f756e745f6b65796c65745f77726f6e675f6c65" - "6e6c696e655f6b65796c65745f6c656e5f6f6f625f63757272656e63796c696e655f6b6579" - "6c65745f77726f6e675f6c656e5f63757272656e6379616d6d5f6b65796c65745f6c656e5f" - "6f6f625f617373657432616d6d5f6b65796c65745f6c656e5f77726f6e675f6c656e5f6173" - "73657432616d6d5f6b65796c65745f6c656e5f77726f6e675f6e6f6e5f7872705f63757272" - "656e63795f6c656e616d6d5f6b65796c65745f6c656e5f77726f6e675f7872705f63757272" - "656e63795f6c656e616d6d5f6b65796c65745f6d70746765745f74785f6669656c645f696e" - "76616c69645f736669656c646765745f63757272656e745f6c65646765725f6f626a5f6669" - "656c645f696e76616c69645f736669656c646765745f6c65646765725f6f626a5f6669656c" - "645f696e76616c69645f736669656c646765745f74785f6e65737465645f6669656c645f74" - "6f6f5f6269675f736c6963656765745f63757272656e745f6c65646765725f6f626a5f6e65" - "737465645f6669656c645f746f6f5f6269675f736c6963656765745f6c65646765725f6f62" - "6a5f6e65737465645f6669656c645f746f6f5f6269675f736c696365636f6d707574655f73" - "68613531325f68616c665f746f6f5f6269675f736c696365616d6d5f6b65796c65745f746f" - "6f5f6269675f736c69636563726564656e7469616c5f6b65796c65745f746f6f5f6269675f" - "736c6963656d70746f6b656e5f6b65796c65745f746f6f5f6269675f736c6963655f6d7074" - "6964666c6f61745f6164645f6f6f625f736c69636531666c6f61745f6164645f6f6f625f73" - "6c69636532666c6f61745f73756274726163745f6f6f625f736c69636531666c6f61745f73" - "756274726163745f6f6f625f736c69636532666c6f61745f6d756c7469706c795f6f6f625f" - "736c69636531666c6f61745f6d756c7469706c795f6f6f625f736c69636532666c6f61745f" - "6469766964655f6f6f625f736c69636531666c6f61745f6469766964655f6f6f625f736c69" - "636532666c6f61745f726f6f745f6f6f625f736c696365666c6f61745f706f775f6f6f625f" - "736c696365666c6f61745f6c6f675f6f6f625f736c6963656765745f6e66745f77726f6e67" - "5f73697a655f75696e743235366765745f6e66745f6973737565725f77726f6e675f73697a" - "655f75696e743235366765745f6e66745f7461786f6e5f77726f6e675f73697a655f75696e" - "743235366765745f6e66745f73657269616c5f77726f6e675f73697a655f75696e74323536" - "6163636f756e745f6b65796c65745f77726f6e675f73697a655f6163636f756e7469646368" - "65636b5f6b65796c65745f77726f6e675f73697a655f6163636f756e74696463726564656e" - "7469616c5f6b65796c65745f77726f6e675f73697a655f6163636f756e7469643163726564" - "656e7469616c5f6b65796c65745f77726f6e675f73697a655f6163636f756e746964326465" - "6c65676174655f6b65796c65745f77726f6e675f73697a655f6163636f756e746964316465" - "6c65676174655f6b65796c65745f77726f6e675f73697a655f6163636f756e746964326465" - "706f7369745f707265617574685f6b65796c65745f77726f6e675f73697a655f6163636f75" - "6e746964316465706f7369745f707265617574685f6b65796c65745f77726f6e675f73697a" - "655f6163636f756e746964326469645f6b65796c65745f77726f6e675f73697a655f616363" - "6f756e746964657363726f775f6b65796c65745f77726f6e675f73697a655f6163636f756e" - "7469646c696e655f6b65796c65745f77726f6e675f73697a655f6163636f756e746964316c" - "696e655f6b65796c65745f77726f6e675f73697a655f6163636f756e746964326d70745f69" - "737375616e63655f6b65796c65745f77726f6e675f73697a655f6163636f756e7469646d70" - "746f6b656e5f6b65796c65745f77726f6e675f73697a655f6163636f756e7469646e66745f" - "6f666665725f6b65796c65745f77726f6e675f73697a655f6163636f756e7469646f666665" - "725f6b65796c65745f77726f6e675f73697a655f6163636f756e7469646f7261636c655f6b" - "65796c65745f77726f6e675f73697a655f6163636f756e7469647061796368616e5f6b6579" - "6c65745f77726f6e675f73697a655f6163636f756e746964317061796368616e5f6b65796c" - "65745f77726f6e675f73697a655f6163636f756e746964327065726d697373696f6e65645f" - "646f6d61696e5f6b65796c65745f77726f6e675f73697a655f6163636f756e746964736967" - "6e6572735f6b65796c65745f77726f6e675f73697a655f6163636f756e7469647469636b65" - "745f6b65796c65745f77726f6e675f73697a655f6163636f756e7469647661756c745f6b65" - "796c65745f77726f6e675f73697a655f6163636f756e7469646765745f6e66745f77726f6e" - "675f73697a655f6163636f756e7469646d70746f6b656e5f6b65796c65745f6d707469645f" - "77726f6e675f6c656e677468004d0970726f64756365727302086c616e6775616765010452" - "757374000c70726f6365737365642d6279010572757374631d312e38352e31202834656231" - "363132353020323032352d30332d313529002c0f7461726765745f6665617475726573022b" - "0f6d757461626c652d676c6f62616c732b087369676e2d657874"; + "8f9ec0000b7f0041909ec0000b072e04066d656d6f727902000666696e697368003d0a5f5f" + "646174615f656e6403010b5f5f686561705f6261736503020c01020ad62602460002402000" + "20014704402002200341004100410010001a20004100480d01418b80c000410b2000ad1001" + "000b200220032000ac10011a0f0b418b80c000410b2000ac1001000b8c26020a7f017e2300" + "41f0016b22002400419680c000412341004100410010001a100241b9e00041b980c000410e" + "103c100341b2920441c780c0004116103c200041f0006a22064200370300200041e8006a22" + "054200370300200041e0006a2203420037030020004200370358200041d8006a2201412010" + "04412041be8cc0004116103c1005410a41dd80c000410c103c200041186a22074281828488" + "90a0c08001370300200041106a2208428182848890a0c08001370300200041086a22094281" + "82848890a0c080013703002000428182848890a0c0800137030041e980c000410e10064101" + "41f780c0004111103c200041201006410141f780c0004111103c4181802020014114100722" + "0241144604400240200041266a200041da006a2d00003a00002000200029005f3703c80120" + "00200041e4006a2900003700cd01200041306a20002900cd01370000200020002f00583b01" + "242000200028005b360027200020002903c80137002b200642003703002005420037030020" + "03420037030020004200370358200041246a2206411420014120100822024120470d002000" + "413a6a20002d005a3a0000200041d0016a2202200041e7006a290000220a370300200041c7" + "006a200a370000200041cf006a200041ef006a290000370000200041d7006a200041f7006a" + "2d00003a0000200020002f01583b01382000200028005b36003b2000200029005f37003f20" + "0041386a4120410010094101418881c0004110103c20054100360200200342003703002000" + "42003703584181802020014114100a411441d48cc000411c103c2005410036020020034200" + "3703002000420037035841014181802020014114100b411441f08cc0004114103c20004104" + "36029801200041818020360258200041d8016a220341003602002002420037030020004200" + "3703c80120014104200041c8016a22054114100c411441848dc0004113103c200341003602" + "0020024200370300200042003703c801200120002802980120054114100d411441978dc000" + "4123103c2003410036020020024200370300200042003703c8014101200120002802980120" + "054114100e411441ba8dc000411b103c4189803c100f4120419881c0004110103c4189803c" + "1010412041a881c0004120103c41014189803c1011412041c881c0004118103c2001200028" + "0298011012412041e081c0004117103c20012000280298011013412041f781c0004127103c" + "4101200120002802980110144120419e82c000411f103c200641141015411441bd82c00041" + "0b103c200041e0016a220442003703002003420037030020024200370300200042003703c8" + "012001200028029801200541201016412041d58dc0004113103c41c882c000410c41d482c0" + "00410b41df82c000410e1017410141ed82c0004109103c200041b8016a2007290300370300" + "200041b0016a2008290300370300200041a8016a2009290300370300200020002903003703" + "a001200341003b010020024200370300200042003703c80120064114200041a0016a220741" + "20200541121018411241e88dc0004107103c20034100360200200242003703002000420037" + "03c80120074120200541141019411441ef8dc000410e103c200041003602c8012007412020" + "054104101a410441fd8dc000410d103c20074120101b410841f682c000410d103c20074120" + "101c410a418383c0004114103c200041003602c8012007412020054104101d4104418a8ec0" + "00410e103c419783c000410d20064114101e412141a483c000410d103c419783c000410d41" + "b183c0004108101f410d41b983c000410c103c419783c000410d41c583c0004108101f410d" + "41cd83c0004111103c417f41041004417141de83c000411e103c200041003602c801200541" + "7f1004417141988ec000411e103c200041ca016a41003a0000200041003b01c80120054103" + "1004417d41b68ec0004124103c200041003602c8012005418094ebdc031004417341da8ec0" + "004123103c200442003703002003420037030020024200370300200042003703c801200041" + "d894ebdc036a220741082005412041001020417341fd8ec0004117103c2004420037030020" + "03420037030020024200370300200042003703c80120012000280298012005412041001020" + "417141948fc0004119103c4102100f416f41fc83c000411f103c417f200028029801101241" + "71419b84c000411f103c2001417f1012417141ba84c000411f103c20014181201012417441" + "d984c0004120103c20072000280298011012417341f984c000411f103c2007200028029801" + "410110094173419885c0004118103c200120002802980141011009417141b085c000411a10" + "3c200442003703002003420037030020024200370300200042003703c80120072000280298" + "01200541201008417341ad8fc0004116103c20044200370300200342003703002002420037" + "0300200042003703c8012001200028029801200541201008417141c38fc0004118103c2004" + "42003703002003420037030020024200370300200042003703c80120064114200641142007" + "200028029801200541201021417341db8fc000411c103c2004420037030020034200370300" + "20024200370300200042003703c80120064114200641142001200028029801200541201021" + "417141f78fc000411e103c2004420037030020034200370300200242003703002000420037" + "03c80141fb9dc000411420072000280298012005412010224173419590c0004119103c2004" + "42003703002003420037030020024200370300200042003703c80141fb9dc0004114200120" + "0028029801200541201022417141ae90c000411f103c200442003703002003420037030020" + "024200370300200042003703c80141fb9dc000411441ca85c0004114200541201022417141" + "cd90c0004129103c200442003703002003420037030020024200370300200042003703c801" + "41de85c000412841fb9dc0004114200541201022417141f690c0004125103c200041dc016a" + "200041346a280100360200200041d4016a2000412c6a290100370200200020002901243702" + "cc01200041808080083602c801200041003b01c0012005411841fb9dc0004114200041c001" + "6a2203410210224171419b91c000410e103c2007200028029801422a10014173418686c000" + "4111103c200041003b01c0014102200341021007416f41a991c000411b103c200041003b01" + "c001410220034102100a416f41c491c000412b103c200041003b01c0014101410220034102" + "100b416f41ef91c0004123103c4102100f416f41fc83c000411f103c41021010416f419786" + "c000412f103c410141021011416f41c686c0004127103c41e980c0004181201006417441ed" + "86c000411f103c41e980c00041c10010064174418c87c000411a103c200041003b01c00120" + "0141812020034102100c4174419292c0004121103c200041003b01c0012001418120200341" + "02100d417441b392c0004131103c200041003b01c0014101200141812020034102100e4174" + "41e492c0004129103c20014181201012417441a687c0004125103c20014181201013417441" + "cb87c0004135103c4101200141812010144174418088c000412d103c200141812010154174" + "41ad88c0004119103c419783c00041812041d482c000410b41df82c000410e1017417441ed" + "82c0004109103c419783c000410d41d482c00041812041df82c000410e1017417441ed82c0" + "004109103c419783c000410d41d482c000410b41df82c0004181201017417441ed82c00041" + "09103c200041003b01c00120014181202003410210164174418d93c0004121103c20004100" + "3b01c00141fb9dc00041812041fb9dc0004114200341021022417441ae93c0004118103c20" + "0041003b01c00120064114200641142001418120200341021023417441c693c000411f103c" + "200041003b01c001200541812020064114200341021024417441e593c0004122103c419783" + "c000410d200720002802980141001000417341c688c000410f103c200042d487b6f4c7d4b1" + "c0003700c001419783c000410d200041c095ebdc036a220441081025417341d588c000411c" + "103c419783c000410d2007200028029801101f417341f188c0004116103c20044108200341" + "0810264173418789c0004118103c200341082004410810264173419f89c0004118103c2000" + "41003b01ec012004410820034108200041ec016a22024102410010274173418794c0004114" + "103c200041003b01ec01200341082004410820024102410010274173419b94c0004114103c" + "200041003b01ec0120044108200341082002410241001028417341af94c0004119103c2000" + "41003b01ec0120034108200441082002410241001028417341c894c0004119103c20004100" + "3b01ec0120044108200341082002410241001029417341e194c0004119103c200041003b01" + "ec0120034108200441082002410241001029417341fa94c0004119103c200041003b01ec01" + "2004410820034108200241024100102a4173419395c0004117103c200041003b01ec012003" + "410820044108200241024100102a417341aa95c0004117103c200041003b01ec0120044108" + "4103200241024100102b417341c195c0004114103c200041003b01ec012004410841032002" + "41024100102c417341d595c0004113103c200041003b01ec0120044108200241024100102d" + "417341e895c0004113103c200120002802980141001009417141b789c0004123103c200041" + "003b01ec01200641142001200028029801200241021018417141fb95c000411a103c200041" + "003b01ec0120012000280298012002410210194171419596c0004121103c200041003b01ec" + "01200120002802980120024102101a417141b696c0004120103c2001200028029801101b41" + "7141da89c0004120103c2001200028029801101c417141fa89c0004127103c200041003602" + "ec01200120002802980120024104101d417141d696c0004121103c200041003b01ec012001" + "200028029801200241021008417141f796c0004123103c200041003b01ec01200120002802" + "9801410120024102102e4171419a97c0004121103c200041003b01ec012001200028029801" + "22042006411420012004200241021023417141bb97c0004127103c200041003b01ec012006" + "41142001200028029801220420012004200241021023417141e297c0004127103c20004100" + "3b01ec0120012000280298012006411420024102102f4171418998c0004125103c20004100" + "3b01ec0120064114200120002802980120024102102f417141ae98c0004125103c20004100" + "3b01ec01200120002802980120064114200241021030417141d398c000412c103c20004100" + "3b01ec01200641142001200028029801200241021030417141ff98c000412c103c20004100" + "3b01ec012001200028029801200241021031417141ab99c000411f103c200041003b01ec01" + "20012000280298014101200241021032417141ca99c0004122103c200041003b01ec012001" + "2000280298012006411441ca85c0004114200241021021417141ec99c0004121103c200041" + "003b01ec0120064114200120002802980141ca85c00041142002410210214171418d9ac000" + "4121103c200041003b01ec0120012000280298014101200241021033417141ae9ac0004128" + "103c200041003b01ec01200541182001200028029801200241021024417141d69ac0004123" + "103c200041003b01ec0120012000280298014101200241021034417141f99ac0004125103c" + "200041003b01ec01200120002802980141012002410210354171419e9bc0004121103c2000" + "41003b01ec0120012000280298014101200241021036417141bf9bc0004122103c20004100" + "3b01ec012001200028029801200641144101200241021037417141e19bc0004124103c2000" + "41003b01ec012006411420012000280298014101200241021037417141859cc0004124103c" + "200041003b01ec0120012000280298014101200241021038417141a99cc000412f103c2000" + "41003b01ec012001200028029801200241021039417141d89cc0004123103c200041003b01" + "ec012001200028029801410120024102103a417141fb9cc0004122103c200041003b01ec01" + "2001200028029801410120024102103b4171419d9dc0004121103c200041003b01ec012001" + "20002802980141a18ac0004120200241021018417141be9dc000411c103c419783c000410d" + "2001200028029801101e417141c18ac0004122103c419797abdd03410d41a18ac000412041" + "001000417341e38ac0004110103c419797abdd03410d200341081025417341f38ac000411d" + "103c419797abdd03410d20064114101e417341908bc0004118103c419797abdd03410d41c5" + "83c0004108101f417341a88bc0004117103c20012000280298012001418120410010004174" + "41bf8bc000410e103c200141812042011001417441cd8bc0004112103c419783c000418120" + "200341081025417441df8bc000411b103c419783c00041812020064114101e417441fa8bc0" + "004116103c419783c00041812041c583c0004108101f417441908cc0004115103c419783c0" + "00410d2001200028029801101f417141a58cc0004119103c200041003b01ec012001200028" + "02980120064114200241021024417141da9dc0004121103c200041f0016a240041010f0b0b" + "418080c000410b417f20022002417f4e1bac1001000b0be61d0200418080c0000bde056572" + "726f725f636f64653d54455354204641494c45442424242424205354415254494e47205741" + "534d20455845435554494f4e2024242424246765745f6c65646765725f73716e6765745f70" + "6172656e745f6c65646765725f74696d656765745f626173655f666565746573745f616d65" + "6e646d656e74616d656e646d656e745f656e61626c656463616368655f6c65646765725f6f" + "626a6765745f74785f61727261795f6c656e6765745f63757272656e745f6c65646765725f" + "6f626a5f61727261795f6c656e6765745f6c65646765725f6f626a5f61727261795f6c656e" + "6765745f74785f6e65737465645f61727261795f6c656e6765745f63757272656e745f6c65" + "646765725f6f626a5f6e65737465645f61727261795f6c656e6765745f6c65646765725f6f" + "626a5f6e65737465645f61727261795f6c656e7570646174655f6461746174657374206d65" + "737361676574657374207075626b657974657374207369676e6174757265636865636b5f73" + "69676765745f6e66745f666c6167736765745f6e66745f7472616e736665725f6665657465" + "7374696e6720747261636574726163655f6163636f756e74400000000000005f7472616365" + "5f616d6f756e74400000000000000074726163655f616d6f756e745f7a65726f6765745f70" + "6172656e745f6c65646765725f686173685f6e65675f7074726765745f74785f6172726179" + "5f6c656e5f696e76616c69645f736669656c646765745f74785f6e65737465645f61727261" + "795f6c656e5f6e65675f7074726765745f74785f6e65737465645f61727261795f6c656e5f" + "6e65675f6c656e6765745f74785f6e65737465645f61727261795f6c656e5f746f6f5f6c6f" + "6e676765745f74785f6e65737465645f61727261795f6c656e5f7074725f6f6f6263616368" + "655f6c65646765725f6f626a5f7074725f6f6f6263616368655f6c65646765725f6f626a5f" + "77726f6e675f6c656e555344303030303030303030303030303030303000418686c0000bf5" + "1774726163655f6e756d5f6f6f625f7374726765745f63757272656e745f6c65646765725f" + "6f626a5f61727261795f6c656e5f696e76616c69645f736669656c646765745f6c65646765" + "725f6f626a5f61727261795f6c656e5f696e76616c69645f736669656c64616d656e646d65" + "6e745f656e61626c65645f746f6f5f6269675f736c696365616d656e646d656e745f656e61" + "626c65645f746f6f5f6c6f6e676765745f74785f6e65737465645f61727261795f6c656e5f" + "746f6f5f6269675f736c6963656765745f63757272656e745f6c65646765725f6f626a5f6e" + "65737465645f61727261795f6c656e5f746f6f5f6269675f736c6963656765745f6c656467" + "65725f6f626a5f6e65737465645f61727261795f6c656e5f746f6f5f6269675f736c696365" + "7570646174655f646174615f746f6f5f6269675f736c69636574726163655f6f6f625f736c" + "69636574726163655f6f70617175655f666c6f61745f6f6f625f736c69636574726163655f" + "616d6f756e745f6f6f625f736c696365666c6f61745f636f6d706172655f6f6f625f736c69" + "636531666c6f61745f636f6d706172655f6f6f625f736c6963653263616368655f6c656467" + "65725f6f626a5f77726f6e675f73697a655f75696e743235366765745f6e66745f666c6167" + "735f77726f6e675f73697a655f75696e743235366765745f6e66745f7472616e736665725f" + "6665655f77726f6e675f73697a655f75696e74323536303030303030303030303030303030" + "303030303030303030303030303030303174726163655f6163636f756e745f77726f6e675f" + "73697a655f6163636f756e74696474726163655f6f6f625f737472696e6774726163655f6f" + "70617175655f666c6f61745f6f6f625f737472696e6774726163655f6163636f756e745f6f" + "6f625f737472696e6774726163655f616d6f756e745f6f6f625f737472696e677472616365" + "5f746f6f5f6c6f6e6774726163655f6e756d5f746f6f5f6c6f6e6774726163655f6f706171" + "75655f666c6f61745f746f6f5f6c6f6e6774726163655f6163636f756e745f746f6f5f6c6f" + "6e6774726163655f616d6f756e745f746f6f5f6c6f6e6774726163655f616d6f756e745f77" + "726f6e675f6c656e6774686765745f706172656e745f6c65646765725f686173686765745f" + "63757272656e745f6c65646765725f6f626a5f6669656c646765745f6c65646765725f6f62" + "6a5f6669656c646765745f74785f6e65737465645f6669656c646765745f63757272656e74" + "5f6c65646765725f6f626a5f6e65737465645f6669656c646765745f6c65646765725f6f62" + "6a5f6e65737465645f6669656c64636f6d707574655f7368613531325f68616c666765745f" + "6e66746765745f6e66745f6973737565726765745f6e66745f7461786f6e6765745f6e6674" + "5f73657269616c6765745f706172656e745f6c65646765725f686173685f6e65675f6c656e" + "6765745f706172656e745f6c65646765725f686173685f6275665f746f6f5f736d616c6c67" + "65745f706172656e745f6c65646765725f686173685f6c656e5f746f6f5f6c6f6e67666c6f" + "61745f66726f6d5f75696e745f6c656e5f6f6f62666c6f61745f66726f6d5f75696e745f77" + "726f6e675f6c656e6163636f756e745f6b65796c65745f6c656e5f6f6f626163636f756e74" + "5f6b65796c65745f77726f6e675f6c656e6c696e655f6b65796c65745f6c656e5f6f6f625f" + "63757272656e63796c696e655f6b65796c65745f77726f6e675f6c656e5f63757272656e63" + "79616d6d5f6b65796c65745f6c656e5f6f6f625f617373657432616d6d5f6b65796c65745f" + "6c656e5f77726f6e675f6c656e5f617373657432616d6d5f6b65796c65745f6c656e5f7772" + "6f6e675f6e6f6e5f7872705f63757272656e63795f6c656e616d6d5f6b65796c65745f6c65" + "6e5f77726f6e675f7872705f63757272656e63795f6c656e616d6d5f6b65796c65745f6d70" + "746765745f74785f6669656c645f696e76616c69645f736669656c646765745f6375727265" + "6e745f6c65646765725f6f626a5f6669656c645f696e76616c69645f736669656c64676574" + "5f6c65646765725f6f626a5f6669656c645f696e76616c69645f736669656c646765745f74" + "785f6e65737465645f6669656c645f746f6f5f6269675f736c6963656765745f6375727265" + "6e745f6c65646765725f6f626a5f6e65737465645f6669656c645f746f6f5f6269675f736c" + "6963656765745f6c65646765725f6f626a5f6e65737465645f6669656c645f746f6f5f6269" + "675f736c696365636f6d707574655f7368613531325f68616c665f746f6f5f6269675f736c" + "696365616d6d5f6b65796c65745f746f6f5f6269675f736c69636563726564656e7469616c" + "5f6b65796c65745f746f6f5f6269675f736c6963656d70746f6b656e5f6b65796c65745f74" + "6f6f5f6269675f736c6963655f6d70746964666c6f61745f6164645f6f6f625f736c696365" + "31666c6f61745f6164645f6f6f625f736c69636532666c6f61745f73756274726163745f6f" + "6f625f736c69636531666c6f61745f73756274726163745f6f6f625f736c69636532666c6f" + "61745f6d756c7469706c795f6f6f625f736c69636531666c6f61745f6d756c7469706c795f" + "6f6f625f736c69636532666c6f61745f6469766964655f6f6f625f736c69636531666c6f61" + "745f6469766964655f6f6f625f736c69636532666c6f61745f726f6f745f6f6f625f736c69" + "6365666c6f61745f706f775f6f6f625f736c696365666c6f61745f6c6f675f6f6f625f736c" + "6963656765745f6e66745f77726f6e675f73697a655f75696e743235366765745f6e66745f" + "6973737565725f77726f6e675f73697a655f75696e743235366765745f6e66745f7461786f" + "6e5f77726f6e675f73697a655f75696e743235366765745f6e66745f73657269616c5f7772" + "6f6e675f73697a655f75696e743235366163636f756e745f6b65796c65745f77726f6e675f" + "73697a655f6163636f756e746964636865636b5f6b65796c65745f77726f6e675f73697a65" + "5f6163636f756e74696463726564656e7469616c5f6b65796c65745f77726f6e675f73697a" + "655f6163636f756e7469643163726564656e7469616c5f6b65796c65745f77726f6e675f73" + "697a655f6163636f756e7469643264656c65676174655f6b65796c65745f77726f6e675f73" + "697a655f6163636f756e7469643164656c65676174655f6b65796c65745f77726f6e675f73" + "697a655f6163636f756e746964326465706f7369745f707265617574685f6b65796c65745f" + "77726f6e675f73697a655f6163636f756e746964316465706f7369745f707265617574685f" + "6b65796c65745f77726f6e675f73697a655f6163636f756e746964326469645f6b65796c65" + "745f77726f6e675f73697a655f6163636f756e746964657363726f775f6b65796c65745f77" + "726f6e675f73697a655f6163636f756e7469646c696e655f6b65796c65745f77726f6e675f" + "73697a655f6163636f756e746964316c696e655f6b65796c65745f77726f6e675f73697a65" + "5f6163636f756e746964326d70745f69737375616e63655f6b65796c65745f77726f6e675f" + "73697a655f6163636f756e7469646d70746f6b656e5f6b65796c65745f77726f6e675f7369" + "7a655f6163636f756e7469646e66745f6f666665725f6b65796c65745f77726f6e675f7369" + "7a655f6163636f756e7469646f666665725f6b65796c65745f77726f6e675f73697a655f61" + "63636f756e7469646f7261636c655f6b65796c65745f77726f6e675f73697a655f6163636f" + "756e7469647061796368616e5f6b65796c65745f77726f6e675f73697a655f6163636f756e" + "746964317061796368616e5f6b65796c65745f77726f6e675f73697a655f6163636f756e74" + "6964327065726d697373696f6e65645f646f6d61696e5f6b65796c65745f77726f6e675f73" + "697a655f6163636f756e7469647369676e6572735f6b65796c65745f77726f6e675f73697a" + "655f6163636f756e7469647469636b65745f6b65796c65745f77726f6e675f73697a655f61" + "63636f756e7469647661756c745f6b65796c65745f77726f6e675f73697a655f6163636f75" + "6e7469646765745f6e66745f77726f6e675f73697a655f6163636f756e7469646d70746f6b" + "656e5f6b65796c65745f6d707469645f77726f6e675f6c656e677468004d0970726f647563" + "65727302086c616e6775616765010452757374000c70726f6365737365642d627901057275" + "7374631d312e38392e30202832393438333838336520323032352d30382d3034290094010f" + "7461726765745f6665617475726573082b0f6d757461626c652d676c6f62616c732b136e6f" + "6e7472617070696e672d6670746f696e742b0b62756c6b2d6d656d6f72792b087369676e2d" + "6578742b0f7265666572656e63652d74797065732b0a6d756c746976616c75652b0f62756c" + "6b2d6d656d6f72792d6f70742b1663616c6c2d696e6469726563742d6f7665726c6f6e67"; extern std::string const floatTestsWasmHex = "0061736d0100000001430860077f7f7f7f7f7f7f017f60057f7f7f7f7f017f60047f7f7f7f" diff --git a/src/xrpld/app/wasm/detail/HostFuncImpl.cpp b/src/xrpld/app/wasm/detail/HostFuncImpl.cpp index 7d2136f4f7..3fda13424a 100644 --- a/src/xrpld/app/wasm/detail/HostFuncImpl.cpp +++ b/src/xrpld/app/wasm/detail/HostFuncImpl.cpp @@ -715,11 +715,15 @@ WasmHostFunctionsImpl::trace( Slice const& data, bool asHex) { + auto const ret = msg.size() + data.size() * (asHex ? 2 : 1); #ifdef DEBUG_OUTPUT - auto j = getJournal().error(); + auto& j = std::cerr; #else + if (!getJournal().active(beast::severities::kTrace)) + return ret; auto j = getJournal().trace(); #endif + if (!asHex) { j << "HF TRACE (" << leKey.key << "): " << msg << " " @@ -735,19 +739,32 @@ WasmHostFunctionsImpl::trace( j << "HF DEV TRACE (" << leKey.key << "): " << msg << " " << hex; } - return msg.size() + data.size() * (asHex ? 2 : 1); +#ifdef DEBUG_OUTPUT + j << std::endl; +#endif + + return ret; } Expected WasmHostFunctionsImpl::traceNum(std::string_view const& msg, int64_t data) { + auto const ret = msg.size() + sizeof(data); #ifdef DEBUG_OUTPUT - auto j = getJournal().error(); + auto& j = std::cerr; #else + if (!getJournal().active(beast::severities::kTrace)) + return ret; auto j = getJournal().trace(); #endif + j << "HF TRACE NUM(" << leKey.key << "): " << msg << " " << data; - return msg.size() + sizeof(data); + +#ifdef DEBUG_OUTPUT + j << std::endl; +#endif + + return ret; } Expected @@ -755,16 +772,24 @@ WasmHostFunctionsImpl::traceAccount( std::string_view const& msg, AccountID const& account) { + auto const ret = msg.size() + account.size(); #ifdef DEBUG_OUTPUT - auto j = getJournal().error(); + auto& j = std::cerr; #else + if (!getJournal().active(beast::severities::kTrace)) + return ret; auto j = getJournal().trace(); #endif auto const accountStr = toBase58(account); j << "HF TRACE ACCOUNT(" << leKey.key << "): " << msg << " " << accountStr; - return msg.size() + accountStr.size(); + +#ifdef DEBUG_OUTPUT + j << std::endl; +#endif + + return ret; } Expected @@ -772,14 +797,22 @@ WasmHostFunctionsImpl::traceFloat( std::string_view const& msg, Slice const& data) { + auto const ret = msg.size() + data.size(); #ifdef DEBUG_OUTPUT - auto j = getJournal().error(); + auto& j = std::cerr; #else + if (!getJournal().active(beast::severities::kTrace)) + return ret; auto j = getJournal().trace(); #endif auto const s = floatToString(data); j << "HF TRACE FLOAT(" << leKey.key << "): " << msg << " " << s; - return msg.size() + s.size(); + +#ifdef DEBUG_OUTPUT + j << std::endl; +#endif + + return ret; } Expected @@ -787,14 +820,22 @@ WasmHostFunctionsImpl::traceAmount( std::string_view const& msg, STAmount const& amount) { + auto const ret = msg.size(); #ifdef DEBUG_OUTPUT - auto j = getJournal().error(); + auto& j = std::cerr; #else + if (!getJournal().active(beast::severities::kTrace)) + return ret; auto j = getJournal().trace(); #endif auto const amountStr = amount.getFullText(); j << "HF TRACE AMOUNT(" << leKey.key << "): " << msg << " " << amountStr; - return msg.size() + amountStr.size(); + +#ifdef DEBUG_OUTPUT + j << std::endl; +#endif + + return ret; } Expected diff --git a/src/xrpld/app/wasm/detail/WasmiVM.cpp b/src/xrpld/app/wasm/detail/WasmiVM.cpp index fa61ec2679..3c56f885dd 100644 --- a/src/xrpld/app/wasm/detail/WasmiVM.cpp +++ b/src/xrpld/app/wasm/detail/WasmiVM.cpp @@ -20,23 +20,25 @@ print_wasm_error(std::string_view msg, wasm_trap_t* trap, beast::Journal jlog) auto& j = std::cerr; #else auto j = jlog.warn(); + if (jlog.active(beast::severities::kWarning)) #endif - - wasm_byte_vec_t error_message WASM_EMPTY_VEC; - - if (trap) - wasm_trap_message(trap, &error_message); - - if (error_message.size) { - j << "WASMI Error: " << msg << ", " - << std::string_view(error_message.data, error_message.size - 1); - } - else - j << "WASMI Error: " << msg; + wasm_byte_vec_t error_message WASM_EMPTY_VEC; - if (error_message.size) - wasm_byte_vec_delete(&error_message); + if (trap) + wasm_trap_message(trap, &error_message); + + if (error_message.size) + { + j << "WASMI Error: " << msg << ", " + << std::string_view(error_message.data, error_message.size - 1); + } + else + j << "WASMI Error: " << msg; + + if (error_message.size) + wasm_byte_vec_delete(&error_message); + } if (trap) wasm_trap_delete(trap);