From 3baa7da3425df4be361d7d75e1cc6f313e6fb92a Mon Sep 17 00:00:00 2001 From: Lars Viklund Date: Wed, 5 Aug 2026 00:28:11 +1200 Subject: [PATCH 1/4] fix: accurate frame elision and draw performance We always resolve the command buffer hash before drawing any layers so there is no need for mid-draw bail logic. Replaced MurmurHash64A with xxHash's way faster XXH3 for command buffer hashing. Only consider textures used for layer geometry when determining frame completeness for elision. Command buffer command structs are now packed on 1-byte alignment and the command key has shrunk from int to u8. Getting rid of padding isn't crucial as subsequent identical frames should both touch the padding bytes in similar ways, but it's nice. --- engine/render/r_main.cpp | 129 ++++++++++++++++++--------------------- engine/render/r_main.h | 4 +- vcpkg.json | 1 + 3 files changed, 62 insertions(+), 72 deletions(-) diff --git a/engine/render/r_main.cpp b/engine/render/r_main.cpp index 1d46715f..c3acc545 100644 --- a/engine/render/r_main.cpp +++ b/engine/render/r_main.cpp @@ -25,6 +25,8 @@ #include #include +#include + static uint64_t MurmurHash64A(void const* data, int len, uint64_t seed); // ======= @@ -125,8 +127,9 @@ Mat4 OrthoMatrix(double left, double right, double bottom, double top, double ne // Layer queue class // ================= +#pragma pack(push, r_layerCmd, 1) struct r_layerCmd_s { - enum Command { + enum Command : uint8_t { VIEWPORT, BLEND, BIND, @@ -165,6 +168,7 @@ struct r_layerCmdQuad_s { int stackLayer, maskLayer; } quad; }; +#pragma pack(pop, r_layerCmd) r_layer_c::r_layer_c(r_renderer_c* renderer, int layer, int subLayer) : renderer(renderer), layer(layer), subLayer(subLayer) @@ -418,6 +422,7 @@ struct RenderStrategy { virtual void ProcessCommand(r_layerCmd_s* cmd) = 0; virtual void Flush() = 0; virtual void SetShowStats(bool showStats) { showStats_ = showStats; } + virtual bool UsedIncompleteTextures() const { return false; } protected: bool showStats_{}; @@ -572,6 +577,8 @@ struct AdjacentMergeStrategy : RenderStrategy { } } + bool UsedIncompleteTextures() const override { return usedIncompleteTextures; }; + private: void Dispatch() { glBindBuffer(GL_ARRAY_BUFFER, vbo_); @@ -623,7 +630,10 @@ struct AdjacentMergeStrategy : RenderStrategy { auto tex = textures[i]; tex->Bind(); if (showStats_) { - ImGui::Text("New tex %d (%s)", tex->texId, tex->fileName.c_str()); + ImGui::Text("New tex %d (%s) %d", tex->texId, tex->fileName.c_str(), tex->status.load()); + } + if (!usedIncompleteTextures && tex->status != r_tex_c::Status::DONE) { + usedIncompleteTextures = true; } } else { @@ -655,7 +665,7 @@ struct AdjacentMergeStrategy : RenderStrategy { struct TexturedBatch { explicit TexturedBatch(GLuint prog) : batch(prog) { - textures.reserve(1ull << 20); + textures.reserve(128); } BatchKey key{}; @@ -673,9 +683,11 @@ struct AdjacentMergeStrategy : RenderStrategy { size_t totalVertexCount_ = 0; size_t batchIndex = 0; + + bool usedIncompleteTextures = false; }; -void r_layer_c::Render() +bool r_layer_c::Render() { int const optLevel = renderer->r_layerOptimize->intVal; bool const shuffle = renderer->r_layerShuffle->intVal == 1; @@ -713,6 +725,8 @@ void r_layer_c::Render() if (renderer->glPopGroupMarkerEXT) { renderer->glPopGroupMarkerEXT(); } + + return strat->UsedIncompleteTextures(); } void r_layer_c::Discard() @@ -1150,12 +1164,6 @@ void r_renderer_c::Shutdown() void r_renderer_c::PumpShaders() { texMan->ProcessPendingTextureUploads(); - for (size_t idx = 0; idx < numShader; ++idx) - if (auto* sh = shaderList[idx]) - if (auto tex = sh->tex; tex && tex->status != r_tex_c::DONE) { - inhibitElision = true; - break; - } } void r_renderer_c::BeginFrame() @@ -1344,13 +1352,15 @@ void r_renderer_c::EndFrame() ImGui::Text("Total dense footprint: %sB", BinaryUnitPrefix(totalDenseFootprint).c_str()); size_t totalCmd{}; - if (ImGui::BeginTable("Layer stats", 7, ImGuiTableFlags_Borders | ImGuiTableFlags_SizingFixedFit)) { + if (ImGui::BeginTable("Layer stats", 8, ImGuiTableFlags_Borders | ImGuiTableFlags_SizingFixedFit)) { ImGui::TableSetupColumn("Index"); ImGui::TableSetupColumn("Layer"); ImGui::TableSetupColumn("Sublayer"); ImGui::TableSetupColumn("Command count"); ImGui::TableSetupColumn("Dense"); ImGui::TableSetupColumn("Debug"); + ImGui::TableSetupColumn("XXH3-64"); + ImGui::TableSetupColumn("MH64A"); ImGui::TableHeadersRow(); for (int l = 0; l < numLayer; ++l) { auto layer = layerSort[l]; @@ -1372,6 +1382,22 @@ void r_renderer_c::EndFrame() if (ImGui::Button("Debug")) { layerBreak = { layer->layer, layer->subLayer }; } + + std::chrono::high_resolution_clock::time_point tic; + std::chrono::microseconds dt; + + ImGui::TableNextColumn(); + tic = std::chrono::high_resolution_clock::now(); + volatile auto xxh_hash = XXH3_64bits(layer->cmdStorage.data(), layer->cmdCursor); + dt = std::chrono::duration_cast(std::chrono::high_resolution_clock::now() - tic); + ImGui::Text("%d µs", dt.count()); + + ImGui::TableNextColumn(); + tic = std::chrono::high_resolution_clock::now(); + volatile auto mh_hash = MurmurHash64A(layer->cmdStorage.data(), (int)layer->cmdCursor, 0ull); + dt = std::chrono::duration_cast(std::chrono::high_resolution_clock::now() - tic); + ImGui::Text("%d µs", dt.count()); + ImGui::PopID(); ImGui::PopID(); } @@ -1383,83 +1409,46 @@ void r_renderer_c::EndFrame() if (inhibitElision || elideFrames != !!r_elideFrames->intVal) { elideFrames = !!r_elideFrames->intVal; - lastFrameHash.clear(); + lastFrameHash = 0; } - std::future>> elidedFrameHashFut; + auto tic = std::chrono::high_resolution_clock::now(); + + uint64_t commandDigest = 0; if (elideFrames) { - elidedFrameHashFut = std::async([&]() -> std::optional> { - std::vector commandDigest; - - for (auto lIdx = 0; lIdx < numLayer; ++lIdx) { - auto layer = layerSort[lIdx]; - uint64_t subHash = MurmurHash64A(layer->cmdStorage.data(), (int)layer->cmdCursor, 0ull); - uint8_t const* p = (uint8_t const*)&subHash; - commandDigest.insert(commandDigest.end(), p, p + sizeof(subHash)); - } + std::shared_ptr hashState(XXH3_createState(), XXH3_freeState); + XXH3_64bits_reset(hashState.get()); - return commandDigest; - }); - } - else { - std::promise>> p; - elidedFrameHashFut = p.get_future(); - p.set_value({}); - } + for (auto lIdx = 0; lIdx < numLayer; ++lIdx) { + auto layer = layerSort[lIdx]; + uint64_t subHash = XXH3_64bits(layer->cmdStorage.data(), (int)layer->cmdCursor); + XXH3_64bits_update(hashState.get(), &subHash, sizeof(subHash)); + } - elidedFrameHashFut.wait(); + commandDigest = XXH3_64bits_digest(hashState.get()); + } ++totalFrames; - bool decideDraw = false; - bool elideDraw = false; + const bool elideDraw = lastFrameHash != 0 && lastFrameHash == commandDigest; + if (!elideDraw) { glBindFramebuffer(GL_FRAMEBUFFER, GetDrawRenderTarget().framebuffer); glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); - int l{}; - for (l = 0; l < numLayer; l++) { - if (!decideDraw && elidedFrameHashFut.wait_for(std::chrono::milliseconds(0)) == std::future_status::ready) { - decideDraw = true; - auto commandDigest = elidedFrameHashFut.get(); - if (commandDigest) { - if (*commandDigest == lastFrameHash) { - elideDraw = true; - break; - } - else { - lastFrameHash = *commandDigest; - } - } - else { - lastFrameHash.clear(); - } - } + for (int l = 0; l < numLayer; l++) { auto& layer = layerSort[l]; if (layerBreak && layerBreak->first == layer->layer && layerBreak->second == layer->subLayer) { #ifdef _WIN32 DebugBreak(); #endif } - layer->Render(); - } - if (!elideDraw) { - presentRtt = 1 - presentRtt; - ++drawnFrames; - } - } - - if (!decideDraw) { - if (auto commandDigest = elidedFrameHashFut.get()) { - lastFrameHash = *commandDigest; - } - else { - lastFrameHash.clear(); + inhibitElision = layer->Render() || inhibitElision; } + presentRtt = 1 - presentRtt; + ++drawnFrames; } - if (inhibitElision) { - // If we explicitly inhibited elision due to things like incomplete textures, make sure that the next frame is drawn. - lastFrameHash.clear(); - } + // If we explicitly inhibited elision due to things like incomplete textures, make sure that the next frame is drawn. + lastFrameHash = inhibitElision ? 0 : commandDigest; for (int l = 0; l < numLayer; ++l) { layerSort[l]->Discard(); @@ -1500,7 +1489,7 @@ void r_renderer_c::EndFrame() if (ImGui::Begin("Hash")) { char* b64{}; size_t b64Len{}; - Base64UrlEncode((char const*)lastFrameHash.data(), lastFrameHash.size(), &b64, &b64Len); + Base64UrlEncode((char const*)&lastFrameHash, sizeof(lastFrameHash), &b64, &b64Len); ImGui::Text("%s", b64); free(b64); } diff --git a/engine/render/r_main.h b/engine/render/r_main.h index f7072fb4..808eeff2 100644 --- a/engine/render/r_main.h +++ b/engine/render/r_main.h @@ -46,7 +46,7 @@ class r_layer_c { void Bind(r_tex_c* tex); void Color(col4_t col); void Quad(float s0, float t0, float x0, float y0, float s1, float t1, float x1, float y1, float s2, float t2, float x2, float y2, float s3, float t3, float x3, float y3, int stackLayer = 0, int maskLayer = -1); - void Render(); + bool Render(); void Discard(); struct CmdHandle { @@ -180,7 +180,7 @@ class r_renderer_c: public r_IRenderer, public conCmdHandler_c { RenderTarget rttMain[2]; int presentRtt = 0; - std::vector lastFrameHash{}; + uint64_t lastFrameHash{}; uint64_t totalFrames{}; uint64_t drawnFrames{}; diff --git a/vcpkg.json b/vcpkg.json index 2e4efdd4..5bdc5d32 100644 --- a/vcpkg.json +++ b/vcpkg.json @@ -13,6 +13,7 @@ "pkgconf", "re2", "sol2", + "xxhash", "zstd", "zlib" ] From 6a740975d2bcffba3127d2a691a4740dbe0ff2c0 Mon Sep 17 00:00:00 2001 From: Lars Viklund Date: Sat, 15 Aug 2026 22:54:28 +1200 Subject: [PATCH 2/4] feat: wait on condvars instead of poll/sleep Cross-thread communication has previously been achieved by polling state and sleeping for a millisecond between attempts. This leads to a steady stream of worker threads being woken and scheduled unnecessarily. As the sleeps are not part of any form of intelligent wait, they also delay processing of work by up to a millisecond which for the console window has implications on the latency of window messages. For non-window threads, this is now generally replaced by efficient and responsive waiting on condition variables. For the console thread as that hosts a window, it uses Win32 events and `MsgWaitForMultipleObjects` to be responsive both to shutdown requests and message processing. --- engine/render/r_main.cpp | 6 +-- engine/render/r_texture.cpp | 65 +++++++++++++++++++++---------- engine/render/r_texture.h | 5 +++ engine/system/win/sys_console.cpp | 30 +++++++------- 4 files changed, 69 insertions(+), 37 deletions(-) diff --git a/engine/render/r_main.cpp b/engine/render/r_main.cpp index c3acc545..13334383 100644 --- a/engine/render/r_main.cpp +++ b/engine/render/r_main.cpp @@ -1628,9 +1628,9 @@ void r_renderer_c::GetShaderImageSize(r_shaderHnd_c* hnd, int& width, int& heigh { if (hnd) { - while (hnd->sh->tex->status < r_tex_c::SIZE_KNOWN) { - Sleep(1); - } + auto* tex = hnd->sh->tex; + std::unique_lock lock(tex->statusMutex); + tex->statusCV.wait(lock, [tex] { return tex->status.load(std::memory_order_relaxed) >= r_tex_c::SIZE_KNOWN; }); width = hnd->sh->tex->fileWidth; height = hnd->sh->tex->fileHeight; } diff --git a/engine/render/r_texture.cpp b/engine/render/r_texture.cpp index 07fdda80..b12d21c6 100644 --- a/engine/render/r_texture.cpp +++ b/engine/render/r_texture.cpp @@ -74,6 +74,7 @@ class t_manager_c: public r_ITexManager, public thread_c { std::vector workers; std::vector textureQueue; std::mutex mutex; + std::condition_variable workCV; std::vector uploadQueue; std::mutex uploadMutex; @@ -115,9 +116,14 @@ t_manager_c::t_manager_c(r_renderer_c* renderer) t_manager_c::~t_manager_c() { - doRun = false; + { + std::unique_lock lock(mutex); + doRun = false; + } + workCV.notify_all(); for (auto& worker : workers) - worker.join(); + if( worker.joinable()) + worker.join(); for (auto tex : textureQueue) delete tex; @@ -147,12 +153,15 @@ void t_manager_c::ProcessPendingTextureUploads() bool t_manager_c::AsyncAdd(r_tex_c* tex) { - std::lock_guard lock( mutex ); - if ( runnersRunning == 0 ) { - return true; + { + std::lock_guard lock(mutex); + if (runnersRunning == 0) { + return true; + } + textureQueue.push_back(tex); + tex->status = r_tex_c::IN_QUEUE; } - textureQueue.push_back( tex ); - tex->status = r_tex_c::IN_QUEUE; + workCV.notify_one(); return false; } @@ -170,11 +179,15 @@ bool t_manager_c::AsyncRemove(r_tex_c* tex) } } } - while (tex->status == r_tex_c::PROCESSING || tex->status == r_tex_c::SIZE_KNOWN) { - renderer->sys->Sleep( 1 ); + { + std::unique_lock lock(tex->statusMutex); + tex->statusCV.wait(lock, [tex] { + const auto status = tex->status.load(std::memory_order_relaxed); + return status != r_tex_c::PROCESSING && status != r_tex_c::SIZE_KNOWN; + }); } - if (tex->status == r_tex_c::PENDING_UPLOAD) { + if (tex->status.load(std::memory_order_relaxed) == r_tex_c::PENDING_UPLOAD) { RemovePendingTextureUpload(tex); } @@ -197,10 +210,14 @@ void t_manager_c::RemovePendingTextureUpload(r_tex_c* tex) void t_manager_c::ThreadProc() { ++runnersRunning; - while (doRun) { + while (true) { r_tex_c *doTex = nullptr; { - std::lock_guard lock( mutex ); + std::unique_lock lock( mutex ); + workCV.wait(lock, [this] { return !doRun || !textureQueue.empty(); }); + + if (!doRun) + break; // Find a texture with the highest loading priority int maxPri = 0; @@ -216,7 +233,7 @@ void t_manager_c::ThreadProc() if (doTexItr != textureQueue.end()) { doTex = *doTexItr; textureQueue.erase(doTexItr); - doTex->status = r_tex_c::PROCESSING; + doTex->SetStatus(r_tex_c::PROCESSING); } } @@ -224,9 +241,6 @@ void t_manager_c::ThreadProc() // Load this texture doTex->LoadFile(); doTex = nullptr; - } else { - // Idle - renderer->sys->Sleep(1); } } --runnersRunning; @@ -557,7 +571,7 @@ void r_tex_c::LoadFile() auto raw = std::make_unique(); raw->CopyRaw(IMGTYPE_GRAY, 8, 8, t_whiteImage); Upload(*raw, TF_NOMIPMAP); - status = DONE; + SetStatus(DONE); return; } else if (_stricmp(fileName.c_str(), "@black") == 0) { @@ -565,7 +579,7 @@ void r_tex_c::LoadFile() auto raw = std::make_unique(); raw->CopyRaw(IMGTYPE_RGBA, 8, 8, t_blackImage); Upload(*raw, TF_NOMIPMAP); - status = DONE; + SetStatus(DONE); return; } @@ -576,7 +590,7 @@ void r_tex_c::LoadFile() auto sizeCallback = [this](int width, int height) { this->fileWidth = width; this->fileHeight = height; - this->status = SIZE_KNOWN; + SetStatus(SIZE_KNOWN); }; error = img->Load(path, sizeCallback); if ( !error ) { @@ -604,14 +618,23 @@ void r_tex_c::LoadFile() auto raw = std::make_unique(); raw->CopyRaw(IMGTYPE_GRAY, 8, 8, t_defaultTexture); Upload(*raw, TF_NOMIPMAP); - status = DONE; + SetStatus(DONE); +} + +void r_tex_c::SetStatus(Status newStatus) +{ + { + std::unique_lock statusLock(statusMutex); + status.store(newStatus, std::memory_order_release); + } + statusCV.notify_all(); } void r_tex_c::PerformUpload(r_tex_c* tex) { tex->Upload(*tex->img, tex->flags); tex->img = {}; - tex->status = DONE; + tex->SetStatus(DONE); } static std::atomic inputBytes = 0; diff --git a/engine/render/r_texture.h b/engine/render/r_texture.h index c20c8bf0..d100191c 100644 --- a/engine/render/r_texture.h +++ b/engine/render/r_texture.h @@ -10,6 +10,7 @@ #include #include +#include #include class image_c; @@ -28,6 +29,8 @@ class r_tex_c { PENDING_UPLOAD, DONE, }; + std::mutex statusMutex; + std::condition_variable statusCV; std::atomic status; std::atomic loadPri; dword texId; @@ -52,6 +55,8 @@ class r_tex_c { void ForceLoad(); void LoadFile(); + void SetStatus(Status newStatus); + static void PerformUpload(r_tex_c*); private: diff --git a/engine/system/win/sys_console.cpp b/engine/system/win/sys_console.cpp index 88b6de85..a7285a2a 100644 --- a/engine/system/win/sys_console.cpp +++ b/engine/system/win/sys_console.cpp @@ -42,8 +42,9 @@ class sys_console_c: public sys_IConsole, public conPrintHook_c, public thread_c static LRESULT __stdcall WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); - volatile bool doRun; - volatile bool isRunning; + HANDLE threadStartedEvent{}; + HANDLE threadShouldStopEvent{}; + HANDLE threadExitedEvent{}; void RunMessages(HWND hwnd = nullptr); void ThreadProc(); @@ -68,11 +69,12 @@ void sys_IConsole::FreeHandle(sys_IConsole* hnd) sys_console_c::sys_console_c(sys_IMain* sysHnd) : conPrintHook_c(sysHnd->con), sys((sys_main_c*)sysHnd), thread_c(sysHnd) { - isRunning = false; - doRun = true; + threadStartedEvent = CreateEvent(nullptr, TRUE, FALSE, nullptr); + threadShouldStopEvent = CreateEvent(nullptr, TRUE, FALSE, nullptr); + threadExitedEvent = CreateEvent(nullptr, TRUE, FALSE, nullptr); ThreadStart(true); - while ( !isRunning ); + WaitForSingleObject(threadStartedEvent, INFINITE); } void sys_console_c::RunMessages(HWND hwnd) @@ -154,10 +156,9 @@ void sys_console_c::ThreadProc() InstallPrintHook(); - isRunning = true; - while (doRun) { + SetEvent(threadStartedEvent); + while (WAIT_OBJECT_0 != MsgWaitForMultipleObjects(1, &threadShouldStopEvent, FALSE, INFINITE, QS_ALLINPUT)) { RunMessages(hwMain); - sys->Sleep(1); } RemovePrintHook(); @@ -170,16 +171,19 @@ void sys_console_c::ThreadProc() DestroyWindow(hwMain); UnregisterClass(CFG_SCON_TITLE " Class", sys->hinst); - isRunning = false; - // Flush windowless messages (Like WM_QUIT) RunMessages(); + + SetEvent(threadExitedEvent); } sys_console_c::~sys_console_c() { - doRun = false; - while (isRunning); + SetEvent(threadShouldStopEvent); + WaitForSingleObject(threadExitedEvent, INFINITE); + DeleteObject(threadStartedEvent); + DeleteObject(threadShouldStopEvent); + DeleteObject(threadExitedEvent); } // ======================== @@ -204,7 +208,7 @@ LRESULT __stdcall sys_console_c::WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPA } case WM_CLOSE: // Quit - conWin->doRun = false; + SetEvent(conWin->threadShouldStopEvent); PostQuitMessage(0); return FALSE; } From f37e66aa88d7a5039ec6b3a59a3d7b1713d14164 Mon Sep 17 00:00:00 2001 From: Lars Viklund Date: Sat, 15 Aug 2026 23:00:18 +1200 Subject: [PATCH 3/4] feat: instrument code with Superluminal API This change adds in-process use of the Superluminal Profiler API to instrument function scopes like texture and module loading to annotate profiles with the file paths being processed. --- CMakeLists.txt | 11 + .../API/FindSuperluminalAPI.cmake | 83 +++++ .../API/dll/x64/PerformanceAPI.dll | Bin 0 -> 28672 bytes .../API/include/Superluminal/PerformanceAPI.h | 284 ++++++++++++++++++ .../Superluminal/PerformanceAPI_capi.h | 255 ++++++++++++++++ .../Superluminal/PerformanceAPI_loader.h | 106 +++++++ .../API/lib/x64/PerformanceAPI_MD.lib | Bin 0 -> 152312 bytes .../API/lib/x64/PerformanceAPI_MDd.lib | Bin 0 -> 193304 bytes .../PerformanceAPI_MDd_NoIteratorDebug.lib | Bin 0 -> 153188 bytes .../API/lib/x64/PerformanceAPI_MT.lib | Bin 0 -> 147516 bytes .../API/lib/x64/PerformanceAPI_MTd.lib | Bin 0 -> 187490 bytes .../PerformanceAPI_MTd_NoIteratorDebug.lib | Bin 0 -> 148136 bytes engine/common.h | 2 + engine/render/r_main.cpp | 2 + engine/render/r_texture.cpp | 4 +- engine/system/win/sys_console.cpp | 1 + ui_api.cpp | 2 + ui_subscript.cpp | 1 + win/entry.cpp | 1 + 19 files changed, 751 insertions(+), 1 deletion(-) create mode 100644 dep/superluminal/API/FindSuperluminalAPI.cmake create mode 100644 dep/superluminal/API/dll/x64/PerformanceAPI.dll create mode 100644 dep/superluminal/API/include/Superluminal/PerformanceAPI.h create mode 100644 dep/superluminal/API/include/Superluminal/PerformanceAPI_capi.h create mode 100644 dep/superluminal/API/include/Superluminal/PerformanceAPI_loader.h create mode 100644 dep/superluminal/API/lib/x64/PerformanceAPI_MD.lib create mode 100644 dep/superluminal/API/lib/x64/PerformanceAPI_MDd.lib create mode 100644 dep/superluminal/API/lib/x64/PerformanceAPI_MDd_NoIteratorDebug.lib create mode 100644 dep/superluminal/API/lib/x64/PerformanceAPI_MT.lib create mode 100644 dep/superluminal/API/lib/x64/PerformanceAPI_MTd.lib create mode 100644 dep/superluminal/API/lib/x64/PerformanceAPI_MTd_NoIteratorDebug.lib diff --git a/CMakeLists.txt b/CMakeLists.txt index b992d62e..2239505b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -13,6 +13,7 @@ if (MSVC) endif () list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake") +list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/dep/superluminal/API") include(${PROJECT_SOURCE_DIR}/vcpkg/scripts/buildsystems/vcpkg.cmake) @@ -108,6 +109,7 @@ target_compile_definitions(SimpleGraphic "GLFW_INCLUDE_NONE" "GL_SILENCE_DEPRECATION" "SIMPLEGRAPHIC_EXPORTS" + "PERFORMANCEAPI_ENABLED=$" ) target_include_directories(SimpleGraphic @@ -126,6 +128,7 @@ find_package(Microsoft.GSL CONFIG REQUIRED) find_package(PkgConfig REQUIRED) find_package(re2 CONFIG REQUIRED) find_package(sol2 CONFIG REQUIRED) +find_package(SuperluminalAPI) find_package(Threads REQUIRED) find_package(zstd REQUIRED) find_package(ZLIB REQUIRED) @@ -187,6 +190,7 @@ target_include_directories(SimpleGraphic PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/dep/glad/include ${CMAKE_CURRENT_SOURCE_DIR}/dep/stb + ${CMAKE_CURRENT_SOURCE_DIR}/dep/superluminal/API/include ) if (CMAKE_SYSTEM_NAME MATCHES "Linux") @@ -212,6 +216,13 @@ if (WIN32) PRIVATE "winmm.lib" ) + + if (SuperluminalAPI_FOUND) + target_link_libraries(SimpleGraphic + PRIVATE + SuperluminalAPI + ) + endif () endif () if (APPLE) diff --git a/dep/superluminal/API/FindSuperluminalAPI.cmake b/dep/superluminal/API/FindSuperluminalAPI.cmake new file mode 100644 index 00000000..8d525512 --- /dev/null +++ b/dep/superluminal/API/FindSuperluminalAPI.cmake @@ -0,0 +1,83 @@ +# This module can be used to find the Superluminal API libs & headers via find_package. +# +# For example: find_package(SuperluminalAPI REQUIRED) +# +# You can use it by adding the API directory of your Superluminal install to your CMAKE_PREFIX_PATH, or alternatively +# by copying the entire API directory to a place of your own choosing and adding that location to CMAKE_PREFIX_PATH. +# +# The following (optional) variables can be set prior to issueing the find_package command: +# - SuperluminalAPI_ROOT : The root directory where the libs & headers should be found. For example \API. +# If this is not set, the libs & headers are assumed to be next to the location of FindSuperluminalAPI.cmake +# - SuperluminalAPI_USE_STATIC_RUNTIME : If this is set, the libraries linked to the static C runtime (i.e. /MT and /MTd) will be returned +# If not set, the libraries linked to the dynamic C runtime (i.e. /MD and /MDd) will be returned +# +# On completion of find_package, the following variables will be set: +# +# SuperluminalAPI_FOUND : Whether the package was found +# SuperluminalAPI_LIBS_RELEASE : The Release libraries to link against +# SuperluminalAPI_LIBS_DEBUG : The Debug libraries to link against +# SuperluminalAPI_INCLUDE_DIRS : The include directories to use +# +# In addition, if find_package completed successfully, the target "SuperluminalAPI" will be defined. +# You should prefer to consume this target via target_link_libraries(YOUR_TARGET PRIVATE SuperluminalAPI), rather than by using the above variables directly +SET(SuperluminalAPI_SEARCH_PATHS + ${CMAKE_CURRENT_LIST_DIR} + ${SuperluminalAPI_ROOT} + ) + +find_path(SuperluminalAPI_INCLUDE_DIRS Superluminal/PerformanceAPI.h + PATHS ${SuperluminalAPI_SEARCH_PATHS} + PATH_SUFFIXES include + ) + +if (CMAKE_SIZEOF_VOID_P MATCHES 4) + set(SELECTED_ARCH "x86") +else(CMAKE_SIZEOF_VOID_P MATCHES 8) + set(SELECTED_ARCH "x64") +endif() + +if(WIN32) + if (NOT (${MSVC_VERSION} LESS 1900)) # Test for VS2015 and higher (older CMake versions don't have a >= operator) + if (${SuperluminalAPI_USE_STATIC_RUNTIME}) + find_library(SuperluminalAPI_LIBS_RELEASE + NAMES PerformanceAPI_MT + PATH_SUFFIXES lib/${SELECTED_ARCH} + PATHS ${SuperluminalAPI_SEARCH_PATHS} + ) + + find_library(SuperluminalAPI_LIBS_DEBUG + NAMES PerformanceAPI_MTd + PATH_SUFFIXES lib/${SELECTED_ARCH} + PATHS ${SuperluminalAPI_SEARCH_PATHS} + ) + else() + find_library(SuperluminalAPI_LIBS_RELEASE + NAMES PerformanceAPI_MD + PATH_SUFFIXES lib/${SELECTED_ARCH} + PATHS ${SuperluminalAPI_SEARCH_PATHS} + ) + + find_library(SuperluminalAPI_LIBS_DEBUG + NAMES PerformanceAPI_MDd + PATH_SUFFIXES lib/${SELECTED_ARCH} + PATHS ${SuperluminalAPI_SEARCH_PATHS} + ) + endif() + else() + message(SEND_ERROR "Your Visual Studio version is not currently supported. Please contact Superluminal support.") + endif() +endif() + +mark_as_advanced(SuperluminalAPI_FOUND) +mark_as_advanced(SuperluminalAPI_LIBS_RELEASE) +mark_as_advanced(SuperluminalAPI_LIBS_DEBUG) +mark_as_advanced(SuperluminalAPI_INCLUDE_DIRS) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(SuperluminalAPI REQUIRED_VARS SuperluminalAPI_INCLUDE_DIRS SuperluminalAPI_LIBS_RELEASE SuperluminalAPI_LIBS_DEBUG) + +if(SuperluminalAPI_FOUND AND NOT TARGET SuperluminalAPI) + add_library(SuperluminalAPI INTERFACE IMPORTED) + target_include_directories(SuperluminalAPI INTERFACE "${SuperluminalAPI_INCLUDE_DIRS}") + target_link_libraries(SuperluminalAPI INTERFACE debug "${SuperluminalAPI_LIBS_DEBUG}" optimized "${SuperluminalAPI_LIBS_RELEASE}" ) +endif() \ No newline at end of file diff --git a/dep/superluminal/API/dll/x64/PerformanceAPI.dll b/dep/superluminal/API/dll/x64/PerformanceAPI.dll new file mode 100644 index 0000000000000000000000000000000000000000..932168755fb4cd49356448371379fac1c87df314 GIT binary patch literal 28672 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

x?ASE_pASBF_r|ZcZ>Xe-qm(l(MSb)#4y3Cn zJ$fL`hZo=dP#@^w!(kps^KOqBNb~NG9Y|~Sl-i8la_IXzuBv##`S9VDe|PNoapStT ze?H0l@6+9nRUW%6ZSKtMf(_d~*pc?b!k2Fyes|!dFE%OsB*oiT_!&qm{0yWOev;$m z6@CWNT&>dv(p;_62hxfBE?VmKYJ5BKNAnG=9DkBu&Fn0j%|N;);Sb;44e(to_N}cB z1bu!~;_2o7>Y%U0UtSxi;z$j@wAQbctYtx!(qM}2;9WyWa#l3_P|_Mcfiy3_5F_lz zAKv@G>&5t9;tQ6n^ZUvxUA{ntzq&qHU02I1s;@xMUtPP_8mz0c*3{LmW!1F}u&%a}(^^*UuP$Fx!!?sFsqy*h zFUTrfqVc%Ae7(t%4wf+ODogjX- z-_)R!=Z_I8Z$nr>IRkm45XU)_eT}@YhvebbfqCKkF|R}rkVtqQPKf{SjP9sc`ZbiM zb+LlaRN>J4_(a{VluLhDf&G33t{YUZI9{CS^wu->=yLo_2EwHtn$Nov@?!~cszWri z2b*A=M&S5CAi9Z9qFv}f9rFroRfd#FEKg&Xi89*bKzwN1lt;8Q+KKHG{lrHrL%57P z@lzhihwfeSA=lrog!~S~FU129A)3T9J&Al!JBd#s9|G!RK>vD&lo?t+3uUy&kq{>w z(a@g6c8RX`EMDST()^?Uack)2BSqU^JHGex8S8&XycXWLs>D~mp|Co*aaBR6x~9^( z7Djm0U3LETt7cVX*>fs#$}4BjuBe(bXU(c&pTEjk>?zI8nmN0)an7t&1=Y1MG`_$p zZ}l3#5~DJ8{te}|6+SBJ@_JV-_SN{x13q4TAPc{~vPR)<0ssYia6_UzX2z_D@!y8A zRq`dt3LMMPa2vRdwPJ3LjhEX{Ys<=F*}y#*$2Gz^#@MUz^hUmXvtrPP0A^IvZ@}2# zj7EB~^7At@va%|wut;VhZJ>IEi}A%&p_9tw48|=boMSK!76W542Alcs~?0b=H(g(<9NBvgK#ChT=QTYFSi}I7C5N1-`No`H#5Pb zlD3r)zho!A)Wvar!jWzL8k0pWw`tR+$~CmdC|j-a>nCWWXqaKs50O- z^RdD23)!-GUkU$h&$vm$S(+|`4e!#|r<5gUB^5)b(OZyXlMG4B@THZpYw;Ba0*%2W zA~-0GiS#XH#*Is2!*y41x-nEAHzA3QOi1hSXRs;vqwgvlXGvni9!kn0J{(j&4f*dY ze3e}+4f-Q>V>o?MgrVhixRn}~os=~cj=Lh6jnIu}Nm&Z*80ub7hT7h#n;$HX&`wPOTqQ&u3u1O5jTj$VVCEj~k!F zQqQK8QJ<*~lSU0=qk`$oP?E+{W{qXm%djUwFqA4|keJq`8CY7$XqGn1$kP0#USn5k z{Um)7(^rmS4h&d5f=jKJnC9|cGtlR8laiQ8cR82i4)8E;(l9o*GM$Z`mBz-NO|92> z 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 Yw(scJ(Yqt#3E_zg8~G0Nk1B!x2{pu8>;M1& literal 0 HcmV?d00001 diff --git a/dep/superluminal/API/include/Superluminal/PerformanceAPI.h b/dep/superluminal/API/include/Superluminal/PerformanceAPI.h new file mode 100644 index 00000000..62849aab --- /dev/null +++ b/dep/superluminal/API/include/Superluminal/PerformanceAPI.h @@ -0,0 +1,284 @@ +/* +BSD LICENSE + +Copyright (c) 2019-2020 Superluminal. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#pragma once + +#include "PerformanceAPI_capi.h" + +// When PERFORMANCEAPI_ENABLED is defined to 0, all calls to the PerformanceAPI (either through macro or direct function calls) will be compiled out. +#ifndef PERFORMANCEAPI_ENABLED + #ifdef _WIN32 + #define PERFORMANCEAPI_ENABLED 1 + #else + #define PERFORMANCEAPI_ENABLED 0 + #endif +#endif + +/* ------------------------------------------------------------------------ +* Documentation +* ------------------------------------------------------------------------ +* +* NOTE: The C++ free functions in this header are deprecated. They remain here only for backwards compatibility. The C functions, prefixed with PerformanceAPI_ and found in PerformanceAPI_capi.h, +* should be used instead. The C++ functions are no longer maintained and new features will be added to the C interface only. +* The InstrumentationScope helper is *not* deprecated. +* +* The Performance API can be used to augment the sampling data that is naturally collected by Superluminal Performance +* with instrumentation data. Instrumentation data is seamlessly blended in all views in the UI. +* +* To send instrumentation data to Superluminal, two mechanisms are provided: +* - The InstrumentationScope class. This class will signal the start of a scope in its constructor and signal the end of the scope in its destructor. +* InstrumentationScopes can be freely nested. +* +* - The PerformanceAPI_BeginScope/PerformanceAPI_EndScope free functions. These functions are designed for integration with existing profiling systems that, for example, +* already define their own scope-based profiling classes. +* +* Note: calls to the Begin/EndScope functions must be within the same function. For example, it is not allowed to call BeginScope in function Foo +* and EndScope in function Bar. +* +* When sending an instrumentation event through either of these mechanisms, two pieces of data can be provided: +* - The event ID [required] : This must be a static string (e.g. a regular C string literal). It is used to distinguish events +* in the UI and is displayed in all views (Instrumentation Chart, Timeline, CallGraph). +* It is important that the ID of a particular scope remains the same over the lifetime of the program: +* it's not allowed to use a string that changes for every invocation of the function/scope. +* Some examples of IDs: the name of a function ("Game::Update"), the operation being performed ("ReadFile"), etc +* +* - The event Data [optional] : This must be a string that is either dynamically allocated or a regular string literal. You are free to put +* whatever data you want in the string; there are no restrictions. The data is also free to change over the lifetime of the program. +* The intent of the data string is to include data in the event that can differ per instance. +* This data is displayed in the Instrumentation Chart and Timeline. +* Some examples of Data strings: the current frame number (for "Game::Update"), the path of the file being read (for "ReadFile"), etc +* This parameter is optional; use nullptr as argument if you don't have any contextual data. +* +* - The event Color [optional] : This is a color that will be used to display the event in the timeline. The color for a specific scope is coupled to the ID and must +* be the same over the lifetime of the program. It's an RGB value encoded as an uint32_t: RRGGBB00. +* You can use PERFORMANCEAPI_MAKE_COLOR to create the uint32_t from 3 RGB values in the range of [0, 255]. +* This parameter is optional; use PERFORMANCEAPI_DEFAULT_COLOR as argument to use the default coloring. +* +* All const char* arguments in the API are assumed to be UTF8 encoded strings (i.e. non-ASCII chars are fully supported). +*/ +namespace PerformanceAPI +{ +#if PERFORMANCEAPI_ENABLED + // An InstrumentationScope measures the time of the scope it is contained in; time starts when the constructor is called and ends when the + // destructor is called. + // An ID for the scope must be provided, with optional data and an optional color (see documentation at the top of this file for more info) + // While you can manually use this, it's usually more convenient to use the PERFORMANCEAPI_* macros + struct InstrumentationScope final + { + /** + * @param inID The ID of this scope as an UTF8 encoded string. The ID for a specific scope must be the same over the lifetime of the program (see docs at the top of this file) + */ + InstrumentationScope(const char* inID); + + /** + * @param inID The ID of this scope as an UTF8 encoded string. The ID for a specific scope must be the same over the lifetime of the program (see docs at the top of this file) + * @param inData The data for this scope as an UTF8 encoded string. The data can vary for each invocation of this scope and is intended to hold information that is only available at runtime. See docs at the top of this file. + */ + InstrumentationScope(const char* inID, const char* inData); + + /** + * @param inID The ID of this scope as an UTF8 encoded string. The ID for a specific scope must be the same over the lifetime of the program (see docs at the top of this file) + * @param inData The data for this scope as an UTF8 encoded string. The data can vary for each invocation of this scope and is intended to hold information that is only available at runtime. See docs at the top of this file. + * @param inColor The color for this scope. The color for a specific scope is coupled to the ID and must be the same over the lifetime of the program + */ + InstrumentationScope(const char* inID, const char* inData, uint32_t inColor); + + /** + * @param inID The ID of this scope as an UTF16 encoded string. The ID for a specific scope must be the same over the lifetime of the program (see docs at the top of this file) + */ + InstrumentationScope(const wchar_t* inID); + + /** + * @param inID The ID of this scope as an UTF16 encoded string. The ID for a specific scope must be the same over the lifetime of the program (see docs at the top of this file) + * @param inData The data for this scope as an UTF16 encoded string. The data can vary for each invocation of this scope and is intended to hold information that is only available at runtime. See docs at the top of this file. + */ + InstrumentationScope(const wchar_t* inID, const wchar_t* inData); + + /** + * @param inID The ID of this scope as an UTF16 encoded string. The ID for a specific scope must be the same over the lifetime of the program (see docs at the top of this file) + * @param inData The data for this scope as an UTF16 encoded string. The data can vary for each invocation of this scope and is intended to hold information that is only available at runtime. See docs at the top of this file. + * @param inColor The color for this scope. The color for a specific scope is coupled to the ID and must be the same over the lifetime of the program + */ + InstrumentationScope(const wchar_t* inID, const wchar_t* inData, uint32_t inColor); + + ~InstrumentationScope(); + }; + + // Private helper macros + #define PERFORMANCEAPI_CAT_IMPL(a, b) a##b + #define PERFORMANCEAPI_CAT(a, b) PERFORMANCEAPI_CAT_IMPL(a, b) + #define PERFORMANCEAPI_UNIQUE_IDENTIFIER(a) PERFORMANCEAPI_CAT(a, __LINE__) + + /** + * Creates an InstrumentationScope with the specified ID. + * + * @param InstrumentationID The ID of this scope as an UTF8 encoded string. The ID for a specific scope must be the same over the lifetime of the program (see docs at the top of this file) + */ + #define PERFORMANCEAPI_INSTRUMENT(InstrumentationID) PerformanceAPI::InstrumentationScope PERFORMANCEAPI_UNIQUE_IDENTIFIER(__instrumentation_scope__)((InstrumentationID)); + + /** + * Creates an InstrumentationScope with the specified ID and runtime data + * + * @param InstrumentationID The ID of this scope as an UTF8 encoded string. The ID for a specific scope must be the same over the lifetime of the program. See docs at the top of this file. + * @param InstrumentationData The data for this scope as an UTF8 encoded string. The data can vary for each invocation of this scope and is intended to hold information that is only available at runtime. See docs at the top of this file. + */ + #define PERFORMANCEAPI_INSTRUMENT_DATA(InstrumentationID, InstrumentationData) PerformanceAPI::InstrumentationScope PERFORMANCEAPI_UNIQUE_IDENTIFIER(__instrumentation_scope__)((InstrumentationID), (InstrumentationData)); + + /** + * Creates an InstrumentationScope with the specified ID and color + * + * @param InstrumentationID The ID of this scope as an UTF8 encoded string. The ID for a specific scope must be the same over the lifetime of the program. See docs at the top of this file. + * @param InstrumentationColor The color for this scope. The color for a specific scope is coupled to the ID and must be the same over the lifetime of the program + */ + #define PERFORMANCEAPI_INSTRUMENT_COLOR(InstrumentationID, InstrumentationColor) PerformanceAPI::InstrumentationScope PERFORMANCEAPI_UNIQUE_IDENTIFIER(__instrumentation_scope__)((InstrumentationID), "", (InstrumentationColor)); + + /** + * Creates an InstrumentationScope with the specified ID, runtime data and color + * + * @param InstrumentationID The ID of this scope as an UTF8 encoded string. The ID for a specific scope must be the same over the lifetime of the program. See docs at the top of this file. + * @param InstrumentationData The data for this scope as an UTF8 encoded string. The data can vary for each invocation of this scope and is intended to hold information that is only available at runtime. See docs at the top of this file. + * @param InstrumentationColor The color for this scope. The color for a specific scope is coupled to the ID and must be the same over the lifetime of the program + */ + #define PERFORMANCEAPI_INSTRUMENT_DATA_COLOR(InstrumentationID, InstrumentationData, InstrumentationColor) PerformanceAPI::InstrumentationScope PERFORMANCEAPI_UNIQUE_IDENTIFIER(__instrumentation_scope__)((InstrumentationID), (InstrumentationData), (InstrumentationColor)); + + /** + * Convenience wrapper around PERFORMANCEAPI_INSTRUMENT to create an InstrumentationScope with the name of the function as ID + */ + #define PERFORMANCEAPI_INSTRUMENT_FUNCTION() PERFORMANCEAPI_INSTRUMENT(__FUNCTION__) + + /** + * Convenience wrapper around PERFORMANCEAPI_INSTRUMENT_DATA to create an InstrumentationScope with the name of the function as ID + * + * @param InstrumentationData The data for this scope as an UTF8 encoded string. The data can vary for each invocation of this scope and is intended to hold information that is only available at runtime. See docs at the top of this file. + */ + #define PERFORMANCEAPI_INSTRUMENT_FUNCTION_DATA(InstrumentationData) PERFORMANCEAPI_INSTRUMENT_DATA(__FUNCTION__, (InstrumentationData)) + + /** + * Convenience wrapper around PERFORMANCEAPI_INSTRUMENT_COLOR to create an InstrumentationScope with the name of the function as ID + * + * @param InstrumentationColor The color for this scope. The color for a specific scope is coupled to the ID and must be the same over the lifetime of the program + */ + #define PERFORMANCEAPI_INSTRUMENT_FUNCTION_COLOR(InstrumentationColor) PERFORMANCEAPI_INSTRUMENT_COLOR(__FUNCTION__, (InstrumentationColor)) + + /** + * Convenience wrapper around PERFORMANCEAPI_INSTRUMENT_DATA_COLOR to create an InstrumentationScope with the name of the function as ID + * + * @param InstrumentationData The data for this scope as an UTF8 encoded string. The data can vary for each invocation of this scope and is intended to hold information that is only available at runtime. See docs at the top of this file. + * @param InstrumentationColor The color for this scope. The color for a specific scope is coupled to the ID and must be the same over the lifetime of the program + */ + #define PERFORMANCEAPI_INSTRUMENT_FUNCTION_DATA_COLOR(InstrumentationData, InstrumentationColor) PERFORMANCEAPI_INSTRUMENT_DATA_COLOR(__FUNCTION__, (InstrumentationData), (InstrumentationColor)) + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // Deprecated functions. + // + // These functions remain here only for backwards compatibility. They're no longer maintained and new features will be added to the C interface only. + // The C functions, prefixed with PerformanceAPI_ and found in PerformanceAPI_capi.h, should be used instead. + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + /** + * Set the name of the current thread to the specified thread name. + * + * @param inThreadName The thread name as an UTF8 encoded string. + */ + inline void SetCurrentThreadName(const char* inThreadName) { PerformanceAPI_SetCurrentThreadName(inThreadName); } + + /** + * Begin an instrumentation event with the specified ID + * + * @param inID The ID of this scope as an UTF8 encoded string. The ID for a specific scope must be the same over the lifetime of the program (see docs at the top of this file) + */ + inline void BeginEvent(const char* inID) { PerformanceAPI_BeginEvent(inID, nullptr, PERFORMANCEAPI_DEFAULT_COLOR); } + + /** + * Begin an instrumentation event with the specified ID + * + * @param inID The ID of this scope as an UTF16 encoded string. The ID for a specific scope must be the same over the lifetime of the program (see docs at the top of this file) + */ + inline void BeginEvent(const wchar_t* inID) { PerformanceAPI_BeginEvent_Wide(inID, nullptr, PERFORMANCEAPI_DEFAULT_COLOR); } + + /** + * Begin an instrumentation event with the specified ID and runtime data + * + * @param inID The ID of this scope as an UTF8 encoded string. The ID for a specific scope must be the same over the lifetime of the program (see docs at the top of this file) + * @param inData The data for this scope as an UTF8 encoded string. The data can vary for each invocation of this scope and is intended to hold information that is only available at runtime. See docs at the top of this file. + */ + inline void BeginEvent(const char* inID, const char* inData) { PerformanceAPI_BeginEvent(inID, inData, PERFORMANCEAPI_DEFAULT_COLOR); } + + /** + * Begin an instrumentation event with the specified ID and runtime data + * + * @param inID The ID of this scope as an UTF8 encoded string. The ID for a specific scope must be the same over the lifetime of the program (see docs at the top of this file) + * @param inData The data for this scope as an UTF8 encoded string. The data can vary for each invocation of this scope and is intended to hold information that is only available at runtime. See docs at the top of this file. + * @param inColor The color for this event. The color for a specific scope is coupled to the ID and must be the same over the lifetime of the program + */ + inline void BeginEvent(const char* inID, const char* inData, uint32_t inColor) { PerformanceAPI_BeginEvent(inID, inData, inColor); } + + /** + * Begin an instrumentation event with the specified ID and runtime data + * + * @param inID The ID of this scope as an UTF16 encoded string. The ID for a specific scope must be the same over the lifetime of the program (see docs at the top of this file) + * @param inData The data for this scope as an UTF16 encoded string. The data can vary for each invocation of this scope and is intended to hold information that is only available at runtime. See docs at the top of this file. + */ + inline void BeginEvent(const wchar_t* inID, const wchar_t* inData) { PerformanceAPI_BeginEvent_Wide(inID, inData, PERFORMANCEAPI_DEFAULT_COLOR); } + + /** + * Begin an instrumentation event with the specified ID and runtime data + * + * @param inID The ID of this scope as an UTF16 encoded string. The ID for a specific scope must be the same over the lifetime of the program (see docs at the top of this file) + * @param inData The data for this scope as an UTF16 encoded string. The data can vary for each invocation of this scope and is intended to hold information that is only available at runtime. See docs at the top of this file. + * @param inColor The color for this event. The color for a specific scope is coupled to the ID and must be the same over the lifetime of the program + */ + inline void BeginEvent(const wchar_t* inID, const wchar_t* inData, uint32_t inColor) { PerformanceAPI_BeginEvent_Wide(inID, inData, inColor); } + + /** + * End an instrumentation event. Must be matched with a call to BeginEvent within the same function + * Note: the return value can be ignored. It is only there to prevent calls to the function from being optimized to jmp instructions as part of tail call optimization. + */ + inline PerformanceAPI_SuppressTailCallOptimization EndEvent() { return PerformanceAPI_EndEvent(); } + +#else + #define PERFORMANCEAPI_INSTRUMENT(InstrumentationID) + #define PERFORMANCEAPI_INSTRUMENT_DATA(InstrumentationID, InstrumentationData) + #define PERFORMANCEAPI_INSTRUMENT_COLOR(InstrumentationID, InstrumentationColor) + #define PERFORMANCEAPI_INSTRUMENT_DATA_COLOR(InstrumentationID, InstrumentationData, InstrumentationColor) + + #define PERFORMANCEAPI_INSTRUMENT_FUNCTION() + #define PERFORMANCEAPI_INSTRUMENT_FUNCTION_DATA(InstrumentationData) + #define PERFORMANCEAPI_INSTRUMENT_FUNCTION_COLOR(InstrumentationColor) + #define PERFORMANCEAPI_INSTRUMENT_FUNCTION_DATA_COLOR(InstrumentationData, InstrumentationColor) + + inline void SetCurrentThreadName(const char* inThreadName) {} + inline void BeginEvent(const char* inID) {} + inline void BeginEvent(const char* inID, const char* inData) {} + inline void BeginEvent(const char* inID, const char* inData, uint32_t inColor) {} + inline void BeginEvent(const wchar_t* inID) {} + inline void BeginEvent(const wchar_t* inID, const wchar_t* inData) {} + inline void BeginEvent(const wchar_t* inID, const wchar_t* inData, uint32_t inColor) {} + inline void EndEvent() {} +#endif +} \ No newline at end of file diff --git a/dep/superluminal/API/include/Superluminal/PerformanceAPI_capi.h b/dep/superluminal/API/include/Superluminal/PerformanceAPI_capi.h new file mode 100644 index 00000000..74bad84d --- /dev/null +++ b/dep/superluminal/API/include/Superluminal/PerformanceAPI_capi.h @@ -0,0 +1,255 @@ +/* +BSD LICENSE + +Copyright (c) 2019-2020 Superluminal. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#pragma once + +#include +#include + +// When PERFORMANCEAPI_ENABLED is defined to 0, all calls to the PerformanceAPI (either through macro or direct function calls) will be compiled out. +#ifndef PERFORMANCEAPI_ENABLED + #ifdef _WIN32 + #define PERFORMANCEAPI_ENABLED 1 + #else + #define PERFORMANCEAPI_ENABLED 0 + #endif +#endif + +#define PERFORMANCEAPI_MAJOR_VERSION 3 +#define PERFORMANCEAPI_MINOR_VERSION 0 +#define PERFORMANCEAPI_VERSION ((PERFORMANCEAPI_MAJOR_VERSION << 16) | PERFORMANCEAPI_MINOR_VERSION) + +/** + * This header has been designed to be fully self-contained, which makes it easy to copy this header into your own source tree as needed. + * + * See PerformanceAPI.h for the high level documentation on how to use the API. + * + * Note that this header is split into two sections: + * - The first section defines the static library interface. If you use these functions directly, you need to link against the PerformanceAPI static library. + * - The second section defines the DLL interface. The DLL interface allows you to use the API without linking to a library. Instead, you can load the DLL yourself + * through LoadLibrary, then find the "PerformanceAPI_GetAPI" export through GetProcAddress. PerformanceAPI_GetAPI can be called to get a table of function pointers + * to the API. A convenience function to perform the DLL load & retrieve the API functions is provided for you in a separate header, PerformanceAPI_loader.h. + */ +#ifdef __cplusplus +extern "C" { +#endif + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Static library interface - if you use these functions, you need to link against the PerformanceAPI library +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/** + * Helper struct that is used to prevent calls to EndEvent from being optimized to jmp instructions as part of tail call optimization. + * You don't ever need to do anything with this as user of the API. + */ +typedef struct +{ + int64_t SuppressTailCall[3]; +} PerformanceAPI_SuppressTailCallOptimization; + +#if PERFORMANCEAPI_ENABLED + /** + * Helper function to create an uint32_t color from 3 RGB values. The R, G and B values must be in range [0, 255]. + * The resulting color can be passed to the BeginEvent function. + */ + #define PERFORMANCEAPI_MAKE_COLOR(R, G, B) ((((uint32_t)(R)) << 24) | (((uint32_t)(G)) << 16) | (((uint32_t)(B)) << 8) | (uint32_t)0xFF) + + /** + * Use this define if you don't care about the color of an event and just want to use the default + */ + #define PERFORMANCEAPI_DEFAULT_COLOR 0xFFFFFFFF + + /** + * Set the name of the current thread to the specified thread name. + * + * @param inThreadName The thread name as an UTF8 encoded string. + */ + void PerformanceAPI_SetCurrentThreadName(const char* inThreadName); + + /** + * Set the name of the current thread to the specified thread name. + * + * @param inThreadName The thread name as an UTF8 encoded string. + * @param inThreadNameLength The length of the thread name, in characters, excluding the null terminator. + */ + void PerformanceAPI_SetCurrentThreadName_N(const char* inThreadName, uint16_t inThreadNameLength); + + /** + * Begin an instrumentation event with the specified ID and runtime data + * + * @param inID The ID of this scope as an UTF8 encoded string. The ID for a specific scope must be the same over the lifetime of the program (see docs at the top of this file) + * @param inData [optional] The data for this scope as an UTF8 encoded string. The data can vary for each invocation of this scope and is intended to hold information that is only available at runtime. See docs at the top of this file. + * Set to null if not available. + * @param inColor [optional] The color for this scope. The color for a specific scope is coupled to the ID and must be the same over the lifetime of the program + * Set to PERFORMANCEAPI_DEFAULT_COLOR to use default coloring. + * + */ + void PerformanceAPI_BeginEvent(const char* inID, const char* inData, uint32_t inColor); + + /** + * Begin an instrumentation event with the specified ID and runtime data, both with an explicit length. + + * It works the same as the regular BeginEvent function (see docs above). The difference is that it allows you to specify the length of both the ID and the data, + * which is useful for languages that do not have null-terminated strings. + * + * Note: both lengths should be specified in the number of characters, not bytes, excluding the null terminator. + */ + void PerformanceAPI_BeginEvent_N(const char* inID, uint16_t inIDLength, const char* inData, uint16_t inDataLength, uint32_t inColor); + + /** + * Begin an instrumentation event with the specified ID and runtime data + * + * @param inID The ID of this scope as an UTF16 encoded string. The ID for a specific scope must be the same over the lifetime of the program (see docs at the top of this file) + * @param inData [optional] The data for this scope as an UTF16 encoded string. The data can vary for each invocation of this scope and is intended to hold information that is only available at runtime. See docs at the top of this file. + Set to null if not available. + * @param inColor [optional] The color for this scope. The color for a specific scope is coupled to the ID and must be the same over the lifetime of the program + * Set to PERFORMANCEAPI_DEFAULT_COLOR to use default coloring. + */ + void PerformanceAPI_BeginEvent_Wide(const wchar_t* inID, const wchar_t* inData, uint32_t inColor); + + /** + * Begin an instrumentation event with the specified ID and runtime data, both with an explicit length. + + * It works the same as the regular BeginEvent_Wide function (see docs above). The difference is that it allows you to specify the length of both the ID and the data, + * which is useful for languages that do not have null-terminated strings. + * + * Note: both lengths should be specified in the number of characters, not bytes, excluding the null terminator. + */ + void PerformanceAPI_BeginEvent_Wide_N(const wchar_t* inID, uint16_t inIDLength, const wchar_t* inData, uint16_t inDataLength, uint32_t inColor); + + /** + * End an instrumentation event. Must be matched with a call to BeginEvent within the same function + * Note: the return value can be ignored. It is only there to prevent calls to the function from being optimized to jmp instructions as part of tail call optimization. + */ + PerformanceAPI_SuppressTailCallOptimization PerformanceAPI_EndEvent(); + + /** + * Call this function when a fiber starts running + * + * @param inFiberID The currently running fiber + */ + void PerformanceAPI_RegisterFiber(uint64_t inFiberID); + + /** + * Call this function before a fiber ends + * + * @param inFiberID The currently running fiber + */ + void PerformanceAPI_UnregisterFiber(uint64_t inFiberID); + + /** + * The call to the Windows SwitchFiber function should be surrounded by BeginFiberSwitch and EndFiberSwitch calls. For example: + * + * PerformanceAPI_BeginFiberSwitch(currentFiber, otherFiber); + * SwitchToFiber(otherFiber); + * PerformanceAPI_EndFiberSwitch(currentFiber); + * + * @param inCurrentFiberID The currently running fiber + * @param inNewFiberID The fiber we're switching to + */ + void PerformanceAPI_BeginFiberSwitch(uint64_t inCurrentFiberID, uint64_t inNewFiberID); + + /** + * The call to the Windows SwitchFiber function should be surrounded by BeginFiberSwitch and EndFiberSwitch calls + * + * PerformanceAPI_BeginFiberSwitch(currentFiber, otherFiber); + * SwitchToFiber(otherFiber); + * PerformanceAPI_EndFiberSwitch(currentFiber); + * + * @param inFiberID The fiber that was running before the call to SwitchFiber (so, the same as inCurrentFiberID in the BeginFiberSwitch call) + */ + void PerformanceAPI_EndFiberSwitch(uint64_t inFiberID); +#else + #define PERFORMANCEAPI_MAKE_COLOR(R, G, B) 0xFFFFFFFF + #define PERFORMANCEAPI_DEFAULT_COLOR 0xFFFFFFFF + + inline void PerformanceAPI_SetCurrentThreadName(const char* inThreadName) {} + inline void PerformanceAPI_SetCurrentThreadName_N(const char* inThreadName, uint16_t inThreadNameLength) {} + inline void PerformanceAPI_BeginEvent(const char* inID, const char* inData, uint32_t inColor) {} + inline void PerformanceAPI_BeginEvent_N(const char* inID, uint16_t inIDLength, const char* inData, uint16_t inDataLength, uint32_t inColor) {} + inline void PerformanceAPI_BeginEvent_Wide(const wchar_t* inID, const wchar_t* inData, uint32_t inColor) {} + inline void PerformanceAPI_BeginEvent_Wide_N(const wchar_t* inID, uint16_t inIDLength, const wchar_t* inData, uint16_t inDataLength, uint32_t inColor) {} + inline void PerformanceAPI_EndEvent() {} + + inline void PerformanceAPI_RegisterFiber(uint64_t inFiberID) {} + inline void PerformanceAPI_UnregisterFiber(uint64_t inFiberID) {} + inline void PerformanceAPI_BeginFiberSwitch(uint64_t inCurrentFiberID, uint64_t inNewFiberID) {} + inline void PerformanceAPI_EndFiberSwitch(uint64_t inFiberID) {} +#endif + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// DLL interface - These functions can be used without linking by loading PerformanceAPI.dll and using GetProcAddress to find the PerformanceAPI_GetAPI function. +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +typedef void (PerformanceAPI_SetCurrentThreadName_Func)(const char* inThreadName); +typedef void (PerformanceAPI_SetCurrentThreadName_N_Func)(const char* inThreadName, uint16_t inThreadNameLength); +typedef void (PerformanceAPI_BeginEvent_Func)(const char* inID, const char* inData, uint32_t inColor); +typedef void (PerformanceAPI_BeginEvent_N_Func)(const char* inID, uint16_t inIDLength, const char* inData, uint16_t inDataLength, uint32_t inColor); +typedef void (PerformanceAPI_BeginEvent_Wide_Func)(const wchar_t* inID, const wchar_t* inData, uint32_t inColor); +typedef void (PerformanceAPI_BeginEvent_Wide_N_Func)(const wchar_t* inID, uint16_t inIDLength, const wchar_t* inData, uint16_t inDataLength, uint32_t inColor); +typedef PerformanceAPI_SuppressTailCallOptimization (PerformanceAPI_EndEvent_Func)(); + +typedef void (PerformanceAPI_RegisterFiber_Func)(uint64_t inFiberID); +typedef void (PerformanceAPI_UnregisterFiber_Func)(uint64_t inFiberID); +typedef void (PerformanceAPI_BeginFiberSwitch_Func)(uint64_t inCurrentFiberID, uint64_t inNewFiberID); +typedef void (PerformanceAPI_EndFiberSwitch_Func)(uint64_t inFiberID); + +typedef struct +{ + PerformanceAPI_SetCurrentThreadName_Func* SetCurrentThreadName; + PerformanceAPI_SetCurrentThreadName_N_Func* SetCurrentThreadNameN; + PerformanceAPI_BeginEvent_Func* BeginEvent; + PerformanceAPI_BeginEvent_N_Func* BeginEventN; + PerformanceAPI_BeginEvent_Wide_Func* BeginEventWide; + PerformanceAPI_BeginEvent_Wide_N_Func* BeginEventWideN; + PerformanceAPI_EndEvent_Func* EndEvent; + + PerformanceAPI_RegisterFiber_Func* RegisterFiber; + PerformanceAPI_UnregisterFiber_Func* UnregisterFiber; + PerformanceAPI_BeginFiberSwitch_Func* BeginFiberSwitch; + PerformanceAPI_EndFiberSwitch_Func* EndFiberSwitch; + +} PerformanceAPI_Functions; + +/** + * Entry point for the PerformanceAPI when used through a DLL. You can get the actual function from the DLL through + * GetProcAddress and then cast it to this function pointer. The name of the function exported from the DLL is "PerformanceAPI_GetAPI". + * + * A convenience function to find & call this function from the PerformanceAPI dll is provided in a separate header, PerformanceAPI_loader.h (PerformanceAPI_LoadFrom) + * + * @param inVersion The version of the header that's used to request the function table. Always specify PERFORMANCEAPI_VERSION for this argument (defined at the top of this file). + * Note: the version of the header and DLL must match exactly; if it doesn't an error will be returned. + * @param outFunctions Pointer to a PerformanceAPI_Functions struct that will be filled with the correct function pointers to use the API + * + * @return 0 if there was an error (version mismatch), 1 on success + */ +typedef int (*PerformanceAPI_GetAPI_Func)(int inVersion, PerformanceAPI_Functions* outFunctions); + +#ifdef __cplusplus +} // extern "C" +#endif diff --git a/dep/superluminal/API/include/Superluminal/PerformanceAPI_loader.h b/dep/superluminal/API/include/Superluminal/PerformanceAPI_loader.h new file mode 100644 index 00000000..cc476cb9 --- /dev/null +++ b/dep/superluminal/API/include/Superluminal/PerformanceAPI_loader.h @@ -0,0 +1,106 @@ +/* +BSD LICENSE + +Copyright (c) 2019-2020 Superluminal. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#pragma once + +#include "PerformanceAPI_capi.h" + +#ifdef __cplusplus + #define PERFORMANCEAPI_API inline +#else + #define PERFORMANCEAPI_API static inline +#endif + +#if PERFORMANCEAPI_ENABLED + typedef HMODULE PerformanceAPI_ModuleHandle; +#else + typedef void* PerformanceAPI_ModuleHandle; +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * Load the PerformanceAPI functions from the specified DLL path. If any part of this fails, the output + * outFunctions will be zero-initialized. + * + * @param inPathToDLL The path to the PerformanceAPI DLL. Note: The DLL at the specified path must match the architecture (i.e. x86 or x64) of the program this API is used in. + * @param outFunctions Pointer to a PerformanceAPI_Functions struct that will be filled with the correct function pointers to use the API. Filled with null pointers if the load failed for whatever reason. + * + * @return A handle to the module if the module was successfully loaded and the API retrieved; NULL otherwise. This can be used to free the module through PerformanceAPI_Free if needed. + */ +PERFORMANCEAPI_API PerformanceAPI_ModuleHandle PerformanceAPI_LoadFrom(const wchar_t* inPathToDLL, PerformanceAPI_Functions* outFunctions) +{ + // Zero-initialize functions and copy to the output. This ensures we can return from this function at any point, + // without leaving the user in a state where the output is only partially initialized. + PerformanceAPI_Functions functions = { 0 }; + *outFunctions = functions; + + // If the API is not enabled (i.e. non-Windows or explicitly disabled by the user), we don't try to initialize any of the functions. + // In this case the user will be left with a default (zero) initialized functions struct. +#if PERFORMANCEAPI_ENABLED + HMODULE module = LoadLibraryW(inPathToDLL); + if (module == NULL) + return NULL; + + PerformanceAPI_GetAPI_Func getAPI = (PerformanceAPI_GetAPI_Func)((void*)GetProcAddress(module, "PerformanceAPI_GetAPI")); + if (getAPI == NULL) + { + FreeLibrary(module); + return NULL; + } + + if (getAPI(PERFORMANCEAPI_VERSION, outFunctions) == 0) + { + FreeLibrary(module); + return NULL; + } + + return module; +#else + return NULL; +#endif +} + +/** + * Free the PerformanceAPI module that was previously loaded through PerformanceAPI_LoadFrom. After this function is called, you can no longer use the function pointers + * in the PerformanceAPI_Functions struct that you previously retrieved through PerformanceAPI_LoadFrom. + * + * @param inModule The module to free + */ +PERFORMANCEAPI_API void PerformanceAPI_Free(PerformanceAPI_ModuleHandle* inModule) +{ +#if PERFORMANCEAPI_ENABLED + FreeLibrary(*inModule); +#endif +} + +#ifdef __cplusplus +} // extern "C" +#endif diff --git a/dep/superluminal/API/lib/x64/PerformanceAPI_MD.lib b/dep/superluminal/API/lib/x64/PerformanceAPI_MD.lib new file mode 100644 index 0000000000000000000000000000000000000000..bf1b301eacf69f5352c432db083b70cc3fd1261b GIT binary patch literal 152312 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 literal 0 HcmV?d00001 diff --git a/dep/superluminal/API/lib/x64/PerformanceAPI_MDd.lib b/dep/superluminal/API/lib/x64/PerformanceAPI_MDd.lib new file mode 100644 index 0000000000000000000000000000000000000000..46e634958d2cfcdcf2e116da7fd044c832404e61 GIT binary patch literal 193304 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

    {^PcOGtWv7OrMT_>R! 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 literal 0 HcmV?d00001 diff --git a/dep/superluminal/API/lib/x64/PerformanceAPI_MDd_NoIteratorDebug.lib b/dep/superluminal/API/lib/x64/PerformanceAPI_MDd_NoIteratorDebug.lib new file mode 100644 index 0000000000000000000000000000000000000000..d545a04fa35dc4aec31dc34cb7e986e04014a162 GIT binary patch literal 153188 zcmeFa3t(JD^*?^oh7!|46P`s11PD;Dl%y}((8q3`n|AXcNlVe-?IzhI3rRNYZrZdw z3{nv+AR;RG1w}+fz%MAuLs1G;;LAfEf})}#@>LL2e0;Gg!te7rGjsRu-MgDD?f>`v z{{G+Ic5~;>oH;Y+%$YN1&di;AXeizrSi7=P0+Cca5vUI&Q+OkQA76`W2jKoG_ zsaRwvwizT0$2UYlxji=0I~eUfE815bXa~Zs!9+CD*BTj)2IRRqlP?+RZXTT;^v_*Y z70h2vKa5o%y(u~pO`v|Gse~O%A&6$NQ;~rH6N4k0bht3u{wI;9Y8*xTM|z`nPo(#( zKqe1XR&I#)QV27mGsH6^#oY{)n{`Sw+$||(R;{e;i6kLINs+}sJ*201FaoY7BC(Vs zh8YFb2j=TeAQCB<*H&qf0>ZJ8*x6%I8~x|3z}n%lRCL^1n*iEhrjW1seJ>W5tKrh@iqQp4(kT0?kUT{znW-mVMSRSQGSwM~ufp+M`JaCl`U^b=Z5 zQkFJ_SJefZ!tDXOJ(XCwXk}$x?aIpf)|HDOAuhPuV4yL$I^5jeTo-8AfQDW(l86q( zlIY!DxK)j<&28b}YDg3H=E_B>czorep*VsW7;6Ldp-`wHxVkOSklH9nJA6^r2UgXG zT2{3-wm5*fO0N&Jg=>SgZ4Ijfsw0AymM;8h%UO;3K>O-&XjOZtUJ-U$0xGL35gAGL zdueM3gj-s}!8-7O+_HP)5cn8$T^_zQ213Es)vKFV1p}SYl?Xk|4}c5cof zvaU5y3x3xH!>SHa+M<<9b>SI2HAUF1j=_tl^p#mDW4MCvS$Qq!Hn+!knE-Pp3KJt&BUKWXY$3M%#2W^qDNnkR9__41DpCmE$4jB@x= zR~Kkny(%0=n@AyOkvakh#&(7zqmV)wk~V`{N+ z)!2ysK={e%tS69AB82TU#Z7@#t>MPn)~41BilyPDwbBwHxFtaZPSGW$3PWTR7-MyY zojRpu)Zqrw9e&q01wu{rs~c+Dm9!WjKYmM`w4k(Q8ne_OUEj2@IgH=EE!5BuXs-_i zL-qA_87$kqm8OO?;*=A!a9bqAMYWb$hkB3LIn0NSYYDeuQ1u~0q+a+eMWmT+u_Dqn%ZHj6xKSvJX95snz<_A(Ew7ZcO{X2+_N1LLcu_5u)V1z6l}{NL8)L> zH5msDcl;PGjfasl&1mV!5-n}x>ce2C=xL{EbQ!+YBuYOR-%{JywmMVL zP?`w9&Plf+-=#z|5J_JbyaFM}p`C-lu=A&lA(3!N=;EW~kc3t~s%#Dku<=3-4K2a8 zCPji|)gI+}dxk_wR;h!aOLz0MIvHj8X*lV^X~7rrq*&dz zmB@%Jcu)!=ff8(jLuE2es%4O-R9b4;EixyZw#+E%V4^4DLv?Tu$#gw%dT<@)pzu+w zX|4|hRyWwItLgo)8`d_ocG->1;jV@byS|~buA{lVtF1#kDeE{%^TTeewE)nrcA;%w z99&mbFzyAYfW10b8R@Bxl#&}TW2T^CrA~^pOqv`H%tyT)^6P_L!3^SADLY6XTO<`# z?g8-@t+Q8G!6=v1WHL4|Vkb60WOmUr7%I(l!$NKb!>L4y;^gb2<=oHIN!a4skxyRa;5~xh8rQ)7u_9oq)SJL z?npCu*QyCWn670<6m!uHtmdweoyOM{>)S0Ng@zH5HNIV}933^b4Yy)ylRYpL?}6*I zFFF)Ok5lR@C<-V)gsMPqYW4qv;= zS-D`X>mg{tA=y0AA8+on8e=`tL=pjyUkx!Wy>MiE29UM$?aYBdL1lQaJP>LiGDC$6 zKCRh(bEK19c|^(kf@i3I7>V=@MQh=_ zw=xB4b#&9lc%si69gc2@4tXP6~Q{p?yeX-7oh zbEnv?dD2e9z%xm5j{MSDJ2%Esy@Or^4I_QNbwYfeT&|?%k!JeuMj}IA)Gna5u~aUo zrf5n;CZm-(%(_=bP#Z6H4+I)C0SU{CMPTaUL-9nxfLZO~SFE7)Yn{Bn1)=uCYE+`| z*Gox8VlJM;qh2?bNMJc4y<+A?2UXE{`%cnjl()hE;P3vi2LOjV1DLcK_p?bkW zv)7>rn;kX>Wy6D2^uO-k$~`*(_Ur)oZ`#~ItAAzXo*e+Adv*YLwl(b80ibpiV5h*I z9RTUYtE$>PI{^0V0NAqwKz#M-Zo$0;dv*W>tMnR%S}8Is9G<0E!e~Gj1F;EV&kg`t z9%?6pJWEEhD4M(g-S0sr5CT9MYTOU0Jw&z*G!#d!96;Ne2eW5)&0QT$v@T@}0`fBcN2HZ8UX9s|5`+%)C2JG1Zz!v~r`vz>k)!_8D z0!hwZq7?wwTD*6acFzs~ayjQxeb%~lPDsDj$qQT%YCo(Qi~Qd9%t&;W%{@BFZ*|{` z$PXr4y#5<@0C=_lOm^DA$<=E8zoKG&sfP_M^>%B#S-)ysAMF_%nAaCebW5n)1AAI* zq%XcPIWOLGrd4{9IZ8pJ&Q*u%s;b3{7gtnNFIc>Qch;frqNznqr%XL_=@ms*&s1zl zz%{Qgfft}RMAegJ9e}M0m(DRy`d(TFI99T<)1+MeEz7$8c*|PyOBHh!ZUL*TR>O4} zxaS%8PxGYi0+;BEq$25f9tZJ!7F<3xw+^5U$4$t|ysvbD`M%pu-boquadgQG&FDA3jgJ$qtw-xU#^!Ofj%R zz;_Pd9@MZD(?D5!R=JdeUuEI*mxDhQ2v_u5Aaz~2}wS6;}KD zc^*t5>UL;=z znC2-8E*HMDk^gMKyrkg>?T0Ungx3MHq&Po5sBvpOU=G|%!A;45uL8-(1EzUeetdnb zA7Gx-aJlfYey;*%QAvJ$1Hg9%V76w6SF>LtJScpl01rA5|kHVm$# z@blweI|>@zr^wniQ^CC#aDMn!BYt~Xku|ei!R4wSn$|iRFh}pF;4O+2 zV6M_|lmox|-Gumi0n@j?!j~y8o7fC;5#ObN`I-yP58oERJqMW6X#n6N9cg;g_zpz; zFkn9Hg7d?7Bj7#_n3@Cg<2wX!t$-PD!TI647jWkQ=H!F?=uP+Y-y+!tOyevCw-569 z;oAZN9|27GPz5&waA|te`1S(acEJ3{VG8b`9Qf7&?n{RkS^ug~aQo%J_iMy|{YbR$ zQ3{TH_N!kzl5Yacj-wUav>f<;0|W~zi>&t^mxlAhHv@2M0n>B5g3FY@G`)8~L45-- z(GwNi$vNsb4t!frDzc`|S8#{ts9y^4CoNDg2+HMGKla}*0`9(r3N}-o)Agg8`Ym8y zU!>sn0!BZ4gGfGnaglY=$qFtP|87A32Q-YToj<<0K-0IR$hu;w!k4Rll+(L4Og?<1 zH&p|Cr{u?13O?Trm0AMZ;q|5cg$NJp~m}i3d z@sZwrYm2N$@#B?ie49Y>D}WiS&yVl#z;PpBu4~AT4?~vq9l+ezsNiz72l@3|4a55J z@}u`w#Qz>}*EHqFHyv>IYZ&6<<%e%O;vWax6`}n2rm}qj^PN=+?map1Z9(#Zt5H7= zoVarJUv`UE0dsh(g3HxE(6m-NV6JFWaJl%$X1yCQ|DZy`l?&g!NS=FYk@ZT4g5!M7 zPyT)adc&PX)-h`p93Fl7w*(1G0dw{`1(&OSoRD4vnAbHNq5axpJrdpo%-Z+o$5)U1 z=L6;e4VMewEF?S*n3q40AK&kQZ$@{K^(KD2a^bs{31<{p*M2ZRKANxF0rMSO!R6|2 z6qBC-=9ox+d{h@LfVs3MKR)Wyn*p<5Uw(W)M{*5d4(`v7??xmq0?bba^5gq8l8aFI z%dyGvO*ym3`tn)%@liGZ05E$GE4W0jn?{dI>wg7y07l>~g;2tjk-|q^<_h-Pp zT>!q>pNef%v`+xQ7bB_i};wUI*Nc z0`MKQsj&7q9B?OS*nI5~DiB{g;JORIx4A%k9|qjz1>n22Kz!c>+_p*Z(J%T7!2ChO zk(0Uf{SLqsZ_cl;i0>%C%-3-F@GS#Or~rKZfZ0$0z6rowS^&PA0rTww@NEaoQw8Ar z17O}R0AI;DMb-iM@yaECga9aw% zcSC{rZU)?)1>k$OKzuI%?v(=YO*^l!_ShG2@71vR+G9z9_yT|n7l7}~0`VmPcYXo* zt}PJXjexto0DM0v5Z{jg_mUT%XPx8#c8c@8?UB6>wisXs6adHmv8n*LD*)G#1=pUn z4okn_OIdK)^*a`D)`upigMNi$3xGQca8(7s9R|3L0^mY`i)X=Q)5~)2%7V+LcLCsj zQUDzNr!ywJe911C^_wUF?sI^9qyV@>0oQ+lx7=(x=r6e-3og5U)qwkc7F;&IQNX>K z1(%KQMAq-alhp<3plb5?Mz}{N`-2Q-@Qve+8h*JuH zqdr(&09-lX>;mAp-Z5GL9O<~I066mRngZas&UA+#oM+v+0&w1I!U}Ag=YebY0^xar z`wBd8^fP*|iL$CJxLIBxJWrHmmzxt`YA9Lh#sR=bvgq~S_wdL^Czn6g@A(4Y*lut5 z!PRwiRj#XBW2(q;Vd}+2)^z-M@o&IF|Mjek&qe%!fC*~2DTL#?xDVVKz+5m1Tmbn$ z1(@e1fm;T+R{?X(C8~b8%B=_7Qox*70Nf`4^V}qG)Vr?&rut)(m)iiCOD2IMzUu(< zpOe5X1l->NbK=(gZ zDZtz_3EUFa4={UOHhKLH0ZhvzaKsk@%r%q11pxOo!2Es^ILcqqqOR%dhRCAOKonv=))i<}<&7E!bY0dQwc4vD-U2|h|Lr3TGs-t|ev~f5Wu)(f29uZr+rpXTDY}K$YrVe~1AvPQh$9fWx#HQsf^?i2zrjf{S zthb&!A5nIFLt}7FxGUUTTXWQKazpQEBGu=KZs}YL8tOf*Y zcy@TIqsS^S1XzE<@6Y&s(<y zSkk*B(zj?)Z~x-OJ+g6>dy3~*RWGu~7ccB?PsGo}_ReItA}bb6c6Y|d61`E+9#hYw z{cg9X)>zBRi`HA#Qx?aSn?G3O+*@M3iFh*JpQ@PCaePG^zNIl7+l;S`RPakrv7u-J z@TC1>{F<#Mp&dcFj=^797sdTnB374&iGI6=t=ZOoWphl1%zJIQb%<47PQ`aRtgE)7 z*hu=&F!YbMa<&7L&Bc0@q2q8aOTESG1q}PF+s|>Y!2K7vla6~K?yEg?{1@^bO<3H& zwo`Oq_cJMZ1(|)Wx^k=3swsaSNo_?%Le(1x`%rZR2;PCDBL&n=a5y?LkQ%fOxArUF zm#K0k(+sH{>&NF+tOKp7PSbFyxmp3v){IQyv8@Q71lbTxq@sNqDN{LasMJU*#gkK= z)G5}q476PMItxEs<;XaJ``>2~EkAsOc9~}FYb`CmjOn;utHAyPJl`fymNgTV=d)gh zwsxRt`Mh3Xw4OaeJ!`e)z`v-|ncuYi^%^H{Y&*6+slQ6c{|ar*_QbZr2{PgzxG%^3 zpSW{9?rq#ZgFCkWO?(@7w9Ul*xKF|TA>8-Iy$a>N2X`))PRE^;?}K{^_nEjqhWmcF zvwr*I{uJtfwZ93<5Vk{!ti29gD?PHt?T{3)m+-qSr>v#l;Sl*61hCJAp2C(GMUs)J z=6YZ+FCTYB)pI}h0lLM;kiZ_L4n1^B%>ziOzz^5K01n`OBz|p0T;J3Jb088pP^yHO zkt4RfX`2v|%|%+-He4&^c*AQJctf%e!My_aLvcR|_u062<9;~qeP#YaWoj6G$)|7xq$NUF?Epq=qNwuRv06&fkSp zakJ#%ykW77K>=hi7kNP*bDqq;%_orsUc{Z!nK!<{@k9(VE<+a9fY4{u*Z zJX!iOeqS$yxAHm)mEh#;-3NW1!silF6IGy)Zbz*u@Wb_Pgp>-0g9Wb$b^`L5ih&oO zDZ~hJd~wS$dE%Ahx!@t$b0Y2)xSxc374Fa*6CcFA8h7##Tjzw=W#DzAhu3a7{zjp^ zE?AfiYr*YFh1tOV-xX%^Ie?$J{A77C_(xej8F$L^Qrs!aHMmojm*GxX9>#CEhrf3s zj(&|B@Vg@?f1TIeD8%gYK9?TJ*CUA|xl2w0E@+nL?Taf>Kh`0DJIAD2+!MHCi`)e3 z)rdRm|1qX{>i;vu(ckwFe&5Vl|BTnWWVoOv^0_n-94<)2L0U1fR_vAXMj(Vm5y!S! z;zGi@khWsn=}X|%jJmUat8kx#dl+}twN=w}DZ*a;;-=|aIcf5o^}3s=Dukv}HBGQn zgr+V{(^^f_7eP~lr=5BbN5A43_}!V4rmWX4DQ|8TBe%IQvLA-#3EL`=k8r^7;qyfFOvX0*NI~_E!-tWi#VBEWLCk>b$h)ixpxXweXyZ!FUNh|u4`vp@{ zx*LSjOOu~WMo@RkWDo9?$v)gEld$82rkfF7@1f}g#E}mi8orc^rkWb>tDF2dr+=)- zD@*sew9&?~;zt$id8xrzQtUX&g0U(x`XOP>#k#T`r{Z3zBcXSs9brhwSadh;)G7Dj z=cRQ%;z%O>^k4oTLo1D{0BU5&mvP9EV>kV*znA{+fL@YvFYe^}cQyUbA?&4pG2&+7 zSB>9S{%6xq%Q1v%W?GJ}vB%99(&gpLHt>P8-j6$V_5+$Pll6g{{(JdijFFw{1K$U2 z?8E5m(gz;av`*FszWP6gR?`Oz`8(GK9tFK5vD800t z6!Ll!Xq7S~j{=O+7ilDq_QKuFiLV7uNcVNPAB8*C+b34wem(91+`oW3$IQcuEUU>Q z7pEbfc{}j?Vt$@wp6Zg{!XuFZpgbDCwxTqVWDSY`$pOMQek9s_=olZWAiF6uirvB9 zRBQu$&|vrBNLc42bVP^nrLjI&`g@VS9_ggMt!NFt2Sp7dUm=E{ue^K^@lQ*UCQaDQ zn(%tcVRx1fg8cFF8~sc8{UzL4;+Jt}wQs_meEcfz*J;GR@9$${2K18;=kiwf&1;av)*6Fo%DSLzvWhA zId0Ci0U^$#&c^S$G<``dH>4fAVH{M~!jH*MLRf`0qx>R6f#vcHw?sx&{`~-vatg2P z>g=qNmJRE;1adpJ))EI0`xy}?-K;BhC$G(*i_hoaekShc;!Zlw!=3bAj^7dwz36Ke z^IU`9=kw7kq`GT>4CaE}JR5{uSz#hvq>@*bADLafQ3igF-`#1tJnJ9&dp6Vsfb+XR8pX2&X>2D>#?2>#IL%|WqmE>J zd@R*CHi9l6A4$4&ANrJYu}-9IKir}7E=3 zNGG1h9b4tZSA*?ls!u?ejp^3 zam0B4G8~{HmjigX23)2vB_d#tK{YZq48539Qbu}Tbj11q(%WaDnz|;{KFx)8Hg_MFswWpwptUM4vTJBiCf2KG8(1 z*B-(u8{m_J@k9#1v82s!KSulD2hON0*|N?d*~Ojr0j>hq^O#i)eo$=4Q3rG18ll(4>C&4$$)f8ji&*| z@KH#%XGL}kAFXSl8^d-{Gd4OJP2iLFQH*?wF0^>$}9yAKeMu|X~Z>wh2K+A$D zUgvTbPt2onFct=|LhUawIZ#7#42LWHt34V|N^fLi2C_khqWvk+3rwHLPEW)J22)Ot z(%lu+jSeL6p+^zI$Vh5gPdq*}x5`luhLu*4QZz1pGp~H7>@dx4Yf2VOU$hslIMo_f zaaMA?Havib1Dzc#ZW8=^a9!-*i?zH}N=&s5_ zh+6dz#Um*gL%M2#EEsYzGBi3Efu|&&q*MJ>FSawam??Y8gf)?c+3rmB#o|H_HJHEn zy3lIDrLrI!w`I3ur0>kJWU4t%~2jcO*o>nF8#8MC?;B%yFD@eUxQnbQG3rM!6nM4IXCKyYvW# zW9xchrD%4zEUPp_Yic+O9%AiN{$osZ)aCxTt7s~spYTPWh>i|LdKJ6B3wMKQ4b0h- zFl+3=Xaw_q%UCAwnUoy#J=$i(Wkd$wiKT(%AY;qtpoN1lC6*O-WI4@`p4bSsi#gp* zSGIuew$SNrEc_r~cSOO3Jvty_$7G-0*gKYRk_~C@&Wev$9*en*80pdu?q;Zr!5E1} zhGLteiArk`Dp7!);T7Zg$VQ>kobd>iqhnMyEnUW-@NYTaJZM6r&@`O|aCpAMVH&0+ zPP5Qc%c1zlKt|s@K@;WQQ#80H##BqAE}&ZJp_3Ye%=2eNMmb;r2PX7xP$3GeH??Ur zs%8Q;H7S0Z7PkH7s0{D|raM{SEkKTD4?PIgHLxDSo;L z-JXUQZMp&kDU0a~G&3fVqztZz)aK@(BT5;Wz)Fuim?0vWf@;}h_j03|nk-2K=HnUS zW59EbD3~_71{EV9x_1{KAZeR&a+7Gme2+;K-08aNX)fngY8a%U;!=jTdq(U4(M%-g z{hNyel&+fYC&pg#m-Q@oG*YdmL^F=u&YUm%2%&d|XlDPfOchbLgFQ)^ik1a8FOHos1kHT%&0khW9{lOkbK=G0&LbsE%}FrJL7GTLZov z_Q|T-nU*PAX8)bbhbA({&Me=YGBW_-x)>vU(+U6vZkitlz*9EGs>3#U?4|E)Zfk|1 zzKT!tWm=Y7#hRjrBjdIz9vG>%m}Mew1(+o|J{ljv)O4p*?1IHrbl{~GmKi#ZEx0^X z(pWCm#D$_8JObbl78^;|(pWCm#Lo)NgOYOTQ_|t|6Qilh^z4wDDg(e63yXY-?2C`V z0!Yh%QP2Kat#{=SPhwmgHd5xB9sbqC<0gf z)u01GCFk{!x`%S5EY*F&lr`va z@)C`iYP<&y{JG{6}owPkf zW)hFF-!kzGN0Z6OKs4zrhPir4Ha_DKAwF&4+L`!ZnfvKukpWlxQ)Ls0<=ZGD;8d2P z;PM^TcU(x!z^VIyuC4~5mNWo*hMoyPS`I}u>fYy615xqBupQ}1(lDWnGEwK&iKB_A zq|%E=fiWGhgNuUp@Yql)HafIP`R&{Vs@b!SF`{hLzTH|am2FJdB@rJR>9bSujgds3 z4L?m>x;z04H5$MkiAGSTlx1q9)9qcWQGKi)PJr;|m?AA!DMXye7xFpum;0qfW z5Li;;4~tnq4|$H25;|1Lnc@lS(a)YDrh$7%adU=}o)cemJc8974#7D=V$t43i5oUj`xiX#q-0EOQ4)<<~i$;9F6uWw_=~O z&S|94nO=+FxVte|MEy~wVk4VIprGuYXn#Brl^&1-5*~B4NbBlCE-6&KDVf@Y9bVK5 zZrzg>Lv6d5CECoYyZfxMi)oLP$ONjsxwAbSJiV^1wXwO$?yL*8hMQX(?6!{jhK}ae zCcC*6ZzG3;bq)27VmG?aTfQDe{i~Q^co@~5jVZ&bW}D^4W~>nu>)j9`D%X$hJO#Tg zi97|nz_c~vU&BPCFE;L&a7OjX1`KDYSKVy{3ZEU_(=UBAE~d-S{leeZSiGq#eITDHv8# zqQMWG#*9qm|gQ>c!50Gij01UeJkVa%jeBqla8g#|Z+}O3qqo z{YY0#UO2b@qf)0x8+$R6CrYf1xO(fRR3vnyYlLmcSG(*O5!8%ys0rr7PqkZ zCz?pa6Lv2Q+ktpu6PRX$h4v7no+Fpbs1X$@4v*~NI#=!d6oO~#KpwPefIkS;cw3Ae z8~YLa?BrN)FBH9aySyy+R?iv!570=8EQMqwJ{%p!?p1|)ijJkFjM-@lzBiRHRVVa} zB{$)%WffVhBZYI`1zlfq(&mN7OY94sX=E7t!PW4}w$&}~YIlO>%L8xLgB+)=8Nl8B$AeW{F@_j}mYu>2scjjfPYsK9 z&6;f*_q9GfW$S)Ur@V`gJK5C)d>9i5TRB(?;EuMfJku4uGtV{Q@ho0t2^yNut%4@& zlwR|S^HPdhuGYa8L>O7@Ml)dZpx3pe#%-+FV`E0Sjzp(pWD2uf_Cvy1MG}Q?&5b3J zF??>0dc`%5$)dt-tN9Jm826oFz)YpxTGrjDO3xZuG6K4bvb4!Dl#0`v_%iH&r+%Im zgN@?eoGGKId-aH{;h?d%nil(mYb(`wg*EB>YJ}{MPcN@=*~FFA(`ZVdDzdbgN03c{$xYa0F`T`}!mKX%E4|D@w19BlO=0ra zeSTTc+GZwTMuAQ!EpGQ;oOWZ?124rOZ{O%tbmX?N&6YC#x`2!fu0mGpLbRFYFKf99 z@k*LmDl$aL^d{pihXQxyWVNEp9L4jANH5iuvT@K>BG!XfyOK3E$PHUGDQCY0O+5BMl$1{`7`&z? zu8wVs+EMJhDk(48iL9gm*;XLiI~Y^RwTuc5Mu+fHLPpevYHWW^F=M*MjmZCxcb^|S zMjyL>psBJEAL#N9-8L+Pw1`G0Jn+)C9 zQ4xmU_+^X?3?!lhcqtQG2GZrQMSoc^xWmblknIJ(Y)a%{@ke3rC(`ARo*(W+2B)Os zknt(MjA9G9C}EWzE&$NMOvN#+90!1P;P}a4R|94;&1MHqIya2p)C z?Oh$BAASh^VEgNb_Yeh=Q^V4a*-O_rd1oQT;!PYhHc2h^&ns#{aK_s?K zH?YIXTfXK^JZlD$M)9I@dtE5lAy1zK3cG0y4lpsffo;$TFUnMm<*Veygg@*azXOTbkHT^mbnj3u$#J(3(;=3cqS z3)v;*e+L-~E;yFL>SbzNWSb+Yj!wmK3@YAy!V#&^(J9H*49A^HZq>_tc>lPh{G-R{ zXtk|a8?KY@E3Q~!C6T>oj={=vL9wElgnM%|5=*GH)X6tOY9DAPhCV1kIA3(eY>rl} zfC~YWMf60tJA@Q$AML}Q`1lAiCSp{N(jV&~kBZcmQNFRMc3op@3Je6i&#ID|hllZ! zB`h;6)9NyF&7Y*%;-+<^QN&%bLX3)E=0oXk5n?l2N%@_Q^fY3tObYvKR5iHcV3Vr1 znKE$moHXKe)AUja^tcs5@al}VMYQ;Zab`tH`R8%yk>VAF)3oafEE|@TZ#39!-)ai4 z>2{X<%0Z*o)76?Bd-|Iu-Pzr1UV4>WPV6#xjIklKH8LC}G4qi14X2rMzd9p^D&Us^ z{+kZNCWWu5Nks9cN1twa+J4U$TG8}$41VU4^4LL|0eII5&Uq}^S0MIgXdxv>9XNr) z9!o%Y`x9|EMrjBx1jJQN&&XZdOrC_0>l+2on32n&)D*j@aja&PDMa*K)e7rWRN=8o z%?k*;JrGq|U%_Ldx3h2Ri-4bMB-GP~#PNk?S*Xy%bfLTJtsI$ZoSvgxXC|#)ABO|1 zr2MNe+cKobm?>r;%{#K1o|Mt9kg*2Mk#UA*)z$Djd(3H5t$5u z$`Ga%(yxE!)EP&i$h%kutr&MSj1D#h`uXxmgAy$_H4KxFv{71e=}t&1d)q2ggZ{`6 zEIkg+Viml{Q75^F4VI%70nW(5VB~bZg7P>+hJ(l21S~&xO5RyTW?Hd8J>~+38l&5W z3riw&%E)l9B~c4^8^I8(M*ve|O~A9>rxf9vW{^Nnhao9_^CpKaTCd96Mvew5sDF?} zqUEH6a7g=|F_`=D_S`bNr6-xfiaiXm(~$UcqYm&gyBM@$|74cL9d@png6Kb?DQzod zmddH%&4vY$J~(wavpWm@YA#Y@hIbwv<>(6YMvQdfO=j{Tnt!A}jsq)7%6pE@&|+F$ zit&_N$~%y8$aE6UWp;zorA7ICW@Q}JJxO&ck@W*Pc;WC<6jqz*dQf71XGB0K*8C&7HP`H zefg$0Ikv8dr}ld|YDn=fW3;ZGZ+!@8zwMaEJF9Inc&hDzooEG`hScw;ntrTCZX@$r zIc1A|T5HJ&GR0VpX`Q6k7Qju|S=^t?d9Y-^}!1br^ZKcrg$h=rCHVq#UA3{AN%ge^%{$KI|>29f##yjqJBM zqe<>D$;DDSX}21I&EqvlXK_X`6D0=!(WWbih8!5fK5V6Z#m%Ay|KDZwr_7l)MrRI4 zmztT4v~Gq6hHCzb!!z_HIF2z#^ix`!yW7jrKT51J+gcAVV!K~rSb)74*hX$T?fX$? zo!h*H(c^Sl>0^FIie^kcQHHTX6Ti&}nP&`fSj&}{4>|q0EF)ZaQNum4z8FkC`f+exPlh2zyFTtEoZM7I`B9xt^|k;^ zGtkRvA$YA-Q+CfhdA>5>@;N>xv03PMIp4AW^t&1&9xJeC0FGb7ZoAIasaaiiz`0KE zcKka>8)cK>s1c+2H8X`b+DCiDWTbP9%p4;fq@68spVQUfk5?A_O?WyUFERtv*n;^= z=0(vTYo-jb5$Kj!AFY0DnZe5#^fS+J1fxCDCr&I!RC*mr;S@4zWZyR9MWItj;hK92 z$%qWA-xZN-3d!m838t>fycEF>WX93t6v19$sKy3Oe2GU-lRAOrD({TU*Ko+MjZM!J zk^KOWK4y?QmR3gh_M72m0Ju9t267tMBSs)S{a<@>*!EvEZ7=1s-^&d7b6L^Yrww~J zp5U1;baS3jz(Byt88yfW&Bcx=GSs7v&q`U%5TNLj|Hy8^qB(EoD?A$iaKt32R$ znu6k3h{rZmEXC0J`H5Ez_C;kv=BO-X<+(;`Q5wQ37GNwZr!a35ISCj-Sm2>J;YV_( zPs)=H!IOVH@i2=zqtUZ4$cg31gNd>s+D4-zSQk~jiide+gK&8Q4Jt@@;#oFC<8X=` zNy?x;-4~>OY%_{qChY^xP~p!rf;18t ziCZ*Xu5*vz^vq>wrgyKp*i9}m677r{+9=@)!-T1dow>x4C4i_pjn>Bu%~=Dp*mcgp ztj+E&WI5j{LM!xlq3m68D|5{bBUQ0D-tgiuKyO!{Hx@GAh=aBg zkxeqqIm0I%;;aB@E=|h@;4vbi)Ba|rtENc0v|~eKc(;raaCmlB*~%b0ch;B|^^9yz zQ<94-#8`Tt0kzd>V?$JpndT@5LdSc6Q`)rOj%y(iliO1e=MKu~TyGlAb&i+pLDH6C zH?VBan3{+~WjFN|Rvivrr8Gw3FmT}7P2qhdtY8?uto#eR?mDNv(w$+i?8f;DCG$=* zsj%A<9Nw%2h`iCXfTNo7C@jtdX!)FGGI^R!_i#>*_%TCKd3bB*Y&1DFW!9YXDI=rm zm@h}XG#*aGk9Mr={H7lz(ilU_k*{;-^O=cw9kM4)L-&>)D9$zja(YP z=DXB#%Df@t?|00bPSDFu1L$nYQM_SD{z}LGg3(!geb>DfK@EAiF+9z?@Jboc@wL|E z!@dn{6~!r%BLjTxzNCC0M{7GSQtA_DJIFd>UeU~UR@#H8*P7m)y-KEx z7n(SO4$&OTxg_P;sx9-QHykM0-_Z;CCdU?NsQ>x zgC3es`i$qJiTL;?nbfo!o_dTS*TID7?Mr~?CgYS;Ml*(8kyR;4Rn4s`qz@n`hw(2M zad0dw)k8S?I8L*%>cv3FRT@@$rKvRD8OMhy@G6_0nONr|^&HdSj(JyzQ@}LMB+@;} zqB3WKb`Fi$a* zj(%wTn1zdGdfMa+v+fxHjhE6dl;p(w`^E9qnnMI#8#sh!+3!TpRM=$jwV9M+ zC0uP@IAs}g{=XzAoawfBORS_kk)zc!9KoFHIF`29$D9a1VX~UtB(6^Ya7W8h!2HeV zKBs>vsJ(l_Ky8Vr)Dl|=2=!ys*BopuHnDCHY-FAyyz68H|-h9W$-)K7(wY; zx|}956rJFQTV7NUYvO3r&FngCjU9<@!~rKmQB0?4cYnzgu1w(FXs*(t__5K7>B^_o z;u(%DE50u16LFi(G1PdpwX3TbEyp)8q}NR?GWPx0&=BpZl(=_)Wd_CEJ8?wnR~bV$ zb30e2s^h4BjTzM`Ya64Hv&4zS7bSX)^n1){2Zx#taj3XAa};x0o72e`GOR4SXVVC_ z4eEi8=_RHDnKcz%%=v+{D`%q~XxOPcbJWfK;t@XOR8n4SghA{B%7Q2*>6(5p|EtKJ1&JI*RqP(JDduoc?OW&Tfqj ziFwqLg9TDoQBA)%P>Yax38-&Oy6VU>GnNV)GP*CMkD8{=o0a~bWE3-nzNGZPi@gAF zQ1WdTYo%ZA$qQ!Rme-I3`yF2FrfAL$vx;`GLuS+nsYueV(#gi&ER0Sje_pT~CQ;Zz zZ%vdOaWbJ)rs1vo{9-eDtHbXnDM?YTh)1Ece2+Ey!VkGX9GwN>dbLj=vKoIlHiVa? zbQ5w8d!3gwr=ogY+a(=_m8{)+%;;olhyCdZM>tLa#Nl3uJeZw9j2vHq%!}SlW-U9M zVjq%|EdQ3){AclJBYTNAd(H-Tas1shI0{6Oi%?{@w@8Ow9)Z@AHDse@|CgNEvfEE_ znFVs>&MI&a@1`YXUv^gGI(5m%JwwSOJ69!UBPEHQ$d={-Ev03i!G%6dYM`exH-sq5 z6(9d8$Tp)P|AetH+=e{usH~Nv!vKAa(ZyMVhRme?!-%xZPn}a?#Ed@7^yJ*O0g>Xc z95Cwul=Zr?0PNrh_7z~wWDK!~nQ?BX=2n8)G%Oz+pMmQk*CHz=iQjb)HDTAO)iu5w zAH^XuSX9YDn3|%Rkq<<%(|!GH{XZ!x7ryY``r)BzWARwKn$RWm%OwW!)3y8qI z8;h7G+2NV~5_DgenN9R&2Fx%;m1gu!Mt5ixt6Gk3?q55d$Wh$R+D$8=yafk1HhM!hUYBGd?^8nerQPcCthf@v)}q?n*Dy9 zqHwjC$(-z9bEHwGNOV`dZiXL6GZ=nLt2(jLD7w$ez*}z^y)z`MML<)eXL2ZYVkcTz zV5c?`u@rftJD1030lw}DLadD_9MfdJ3W}+eyeuqrU4TT-8~^6LUVf_%GcUf%>pq8| zp>=I@2hOBfy8z!BD=Ghd?(~|PWn&|p(e|B4N6m?2EAZ_Myl%QPIlMTME93>^r=i$} zFyq=Fb$l9YB=TNz`fIp`2zh(xmq>SB0k&;XF=h37l>WcJRO?@umHgz;5Am-t%VW z@@Yuz4B_)`!lqxKv~luY_70F~$f-XoApp9tx{$OK8;0+CQzwX@_S&XbJ^e>mji-fsVds)Q^X$@~d_w z<s!!DUQNFgSx3Jt2f{HhL5mRF!O|UnPMm0# z&gPc(Fy80aXFkc^hgf!bE*c$H_?&~{QZ2C_td$BZ1-1e;z$soh`GED~Q*B!tk4_K~ zc~V!#)WX*4Q$&O<2=`@QOw(1nx$(TVI3Y)YQT0I_7>u3p@Fi3lXg^_BuJa|Ahc^JVoZi5>`9gQ1xo{lHLqn@k(m7coC0kMUnna`N$&8sUDosW`I;`F% zLlJCj>Ncuc<;rIr&W6;4+cVDH;K@jGz6q=S42Vwm6Cv$spk=pjNAHu0^AHj_gM_QE zucAR964CKgO%3hP^y(`$=OeDv%#^oWDa-@E5+$nMqJov zRXG%<^u5lFu~hG%(lBHOd#={|hFc;^a{dQ9^N%#?87HHha_%o>)!G0oO0h(x{tmPpT_ zt%iP07?NS+kT7Y+sH0Zc$4CgJS!_O1#vWwH;{3igJJcxBMLm-5vzX@A1bR6&2_WmQ z_&pEGif}J0y7D8PJHCC$rB_tlX@6n*S<9cXtkn`f<(^CGJ{FtZJfnK+V~5{-Z>eQ{ zO5$f8dEW2-@#xsq{bxS2^70vf`G;lwOybKHd}aCKk!iipKX}ipU%ut8TXD7{3MebO z`+%CYUw>}!fy-l0ZT`XR6E6T25}iPyP^Ge`)@qpddqr3;&0lxVe`}% zZ`kkXXTLjd?wX^3|G+7N=fK-Pa(3d~ z^xxzB#Hqx;@@BgjOd~)u8uKdFEO)1N| zN8-1K&tLk7Q)*h@yyM8jx0RRPg!3AUiD&5AmHT|+8{c^E5AOWk2~R~!;2dg}_+Q-c z+0lb?x$L_yt-kxu2fzKEFa7QLOYl%Dhep}Ol-+%d3oDW(;{E<)p z;~!t%=NqT~wf;+I&$#su_n=)Q{%7}G`r#M$ZW=gg+FMWFd1&lv%lfv&AN}~n-#zTA zQy=(&{o%T4zZz-5fr;-So)3Kf=1UI!)3cv{u4Q~+^_f3h1UZ-Z8{hiF@b<6Yb^e13 zKlIwKZ&}`8S)Y;kdtQIw7bRE!bHBG^Pggv>ZF9u3UXu9z>pvTQVawsOr|o~>>6?E% zbqnMieWR@CFTd-abwf?*{BPd)vEjiJ*1ifoCGkIdK4^UP~sxpBk7FP+(+gaZ4H z#8*bIKkJD0CyxEv2OoZBpD+Jxxn<3qPCSpEH*H|r7q0%@>DS!8<>uReunrnX;%_Jm!yjiNAI4junr-+Ff?&i$A__@YwR(@M&?0e`D=mj;Q;u4S#JY`pX;N`LCNG57YJ~ zp7`&c{?A_wUi^ha%kO*immmD{uVK(g{9$W)F8{?>@BCcF1E=5h!1{mmpkGV;A69O> zspd=1&VMLyRm+x7T=ceO{aoT_zwb+zeeh$?Zu{W<3qr4b_wN718Lcyk|K#(7fBori z{=VX-L%#XPCy)9(WMo9*zwq`G5C8V7r580_7r8t9xi{BZ*4HKe)7uVz<>hUMUa|hL zPcB-r*HETqMQwN8)cVVJzSjK5n?HSZ=`F`xhhbXczx>qGw_IEE=kI@g=EY6t zS@wF%`ZtNc>mQ%nw_-}!GuMtC``!nhD!$0FUY7V5+Anzf_s9SK)EVpFIce>2hr%N_ z7b8Sj(UeccH=Nz|f$LU=hhP3|$+Y7kKNA1d6-)nZ&YQ_QXBPcnN=^8I6_6i^Kk%sS zr%d_8@tZ%~HFMhqXTOMk`liIc@cnha_*e4&jSYVffB&l&&Ho9$DF#!vtZ2!ZN8Qrb zdd<}p4?l3y56<`&^wW^pBrieq_VH&iV73mi36lpD^#_JD)lEfPufv zp8nbG*Su0~S^Hp^Dl0l=$CD>MHt^g3{9e_GdoR4|9F)0A;%_Ye$kpe(c<62RX=^_l z{OR2%Lp~+`zqX(I$fF}uy8eAm^nokRnK%LcNaB+_k_R2owmeqyuleI`f4mRF+uQ?) ze`Z7Hwa+c=fAbSRzHH>s*}uIUvulYz^Z1$9FPxhBqGBV{js5FvSQBolEue&!)etQ-ZQgvnz4){Y&$!zNZ&xh7>-8FkOG2C=yUcS_ zGnmzQaRSxrj}7FmU*Qz9cDeBs+LG#(i$aK8GOyZc|0I0y(LM^EEJyBoHOBGL2Ylor zmmCyK%@9775lamY?HOqh2*EguQwDEo5gX*0bwuR@*Id5tSi(KFuB7fVpQP zzG2tvAyZ85>&;b_LK}P>6L{_%&cWe=(V(}(*}SW0`t{s3GL#Eb28;7HxltQ>%UW)p zzblkbMG7OnkUrdt&#-m(jKzlfa8T|@s(WKRaaQ-j-l_#ldY44{7A@-SU%a@7BM(o4 zOLjvN6F6Qmn(S8R5qFQKU8a%Im>G^d(YCJVyx!5#T-+(RxyDklA$~h<7n^-Ip}|^Z z|Hi&tl_|V^WQ54w&;@e`cyPu`uKE;;rgu1!+I2%g9X6MvoeF0S>$2;dN&BpJxk7k> zrJE~TyIv`AKdW8gyV_)_!9@2s{@`HET}3q%8-_Kxt5{^?IX&w+_+6+h;)r(rdXB-E zo9`Jy3-BS8@`gSQPtrqkX%96?{K>SH)K?Z|*9V{H9KZ*yoj6BWxRu z4d6GYEL2qVZj@ZKWz@%St_nlhf1xB5js%dF4dt@>n$e^?2^<{s~e$%1a7?! zm0C|ZanCw&RalEUSl|}wP^opV6SvKYn~k-mSprv~L#5UgPTW;a+#3iTB5;4zp;BuL z){#`)#X3}Ky@1er1@1*10vy(fRNTcn1UQ5aRd6~~YF&%<9u;@J4wYJeMQFCb?a(3c z3Tr4Tj^}1FRBFA5&|w1ivJL?b>oO|tQXK*uLWe6j9fJH}eMQCHs6(aJ4up;nxVLl& zbYT5N#a*mJpaY?m0{5a0LH@9oqT;U9p;GH6C+=1!uIwPo3P|1qbg0z&mlIcn6?LYT zTC;R$x;5L0n?NWidAH~gXmjFTcH(w8ac?#PYz4!wA)l+mR_kSl}^7JOIfP^tCr2)$S0zM(^< z7Qbnx@;hjvb9JcHy3vW_K7FQ^TF+HN7Yn|h=n(qMv6l5diCeEjrB>OA zmURoX>vZb?9V*2KKP~GS>%as5{k5_8UVp}+ZC~5+n}0sN|3hN{v+8QPyI?}r(Unx^+p06D~zHi%ohtA*s_&HC8pPF~aF+JCBZv5y&-#lm2 zTUQMC5pG72>~vu;%0K(0pZocYp$@E;Yk+?-1es?Hj$D#-o@0E5YB%X;@)_#dJexbC z3%v4YsREYw;a7xr2P}N`g`oicR!gYuKhC@Uh~6&*uX^kpWNj>!B^uf~;~3WG+YyZC2pbSaULVS=WZ&WuAxFI+t!KOx zJqeMq(1ixe%#bEX%Mk}66rU;A!HvC_V(leioB0BK+q|Nm4A z|8Hww8M@Y%x$(b{UdO(=@bx7|CL41%=h4*dp)gtsZRt1SSBNN9fWuVnOFV4; z-zQHl{>};B{SGdeEa0IsIVj~-E~8gQzKro+XQIIt$equKaC-R6L{g7(LIvQ+%=Q05 zeKDU9{W_Sbp4vl~!H{@G#1J9qmcNHwx-Sg9YOF38Adb!pJLX3wCost%Dl0YHCI4s= z;Ke*f4aBcafqM4LUvl7E0(?|#R%#w4V2~Pd4g%|`>si7&_Apq!U2L^*W#F9y39d_U zbt=`LIG?(3ITfmv+DF%jPuVr%)Qi@wwRPK8G43%dIzVPcp{+9>-CA6-R0gT@gKj%s z(f-cZ+y&b%d}NAF+4_{C+6|Z)R>NH;Ls0&bLduW1QJM0)Tqfuo@@7 zqa+*<=9&j#j2mHQ*woX-R@0p@9-#kn&U(SQmB2aGO6|R1+p7<g-lbQFHY)|L26-&wJB9YP-jroF7&5uyj7*t#E~qwy=YevZG568ADfge$gQMW{(q z-@;#d2#c*5FbS4PXg`Eh-fn~zOWe5#RY~X?gie}?;!+dJ3@a&=okt86Cvg; zmjC2ov2_X_6u$EiQhC3M&~$=we%4PDJ=B}!SM<#s}WM=wj)$0<^CH&io5qAq_A*xMPYdvAtf*C&_$aCi;a+y zl0JkKmJcDMu-t}_!tz}Wx0m%SLJCU=t0tV9f>#JBEL{jGEOCSsmg{xuUe+B5sk~1j z)FydzfFva-T#j>>F<=&;^_Oc#Ah${ib)(;RmSyG=v zs9i!oMQECYeua?2_Zx&tB<}YJsl0n(^+(lUAB0p5j^>JxV4mxQsu5B(I9bQ-Wd#x9 zIzh2@9ztsc^M?^qDngeOSBAFY z=lIDa%qgHA6ffL9>p^G+SxWvWP#sg$gk`JrMFR)xQ{u(`BbJ2pg`KxJQRdwon}rjN z3O+K6u+=O6uN9=v_09k3CDaM$7|pi!D-$jnhB)_%Rpof2xxBmrF)tj)5hyhnOXA3? z^71)|;zxtqifkL_wBsEmu(rIs3enq+mgu#Sp=x-A+sds!Ba#W`Vmr*i5Cdt%M}yRb z;dO#-gW+Ui0qz()`QaBC!lp}Z4rW-+#9xM{Ti5GQsg=V76_a2+4X7nB>vj~S&Uyu<_=^V6^wFXkWGKth$O5Dr}x5ym;Z<^eG0eNI@vC zwBda;_aS#i7DJ}!jC)0GIX-ApUfzz_9XNjgg4Y;JB>B#MdHK3@WH_SZ)~Dleumule zC@&vG+&&eOIXEP8Jc<~8G{z;z6z_3F^T0({G|O3nXkBG454Z9|hn*mAPQso1nXjAs{otc&ZiY%_SB8p%nzU40#w=b` z9uyfT|67~OLQ6v>V>7=ESkV@`(a?}c4U|w6AO-w`5Y)}Nl@(giK^b9&ZWP@*qv!yW zspv2$L!Bu_$G(ALltvZgP?w@JEzxnn2(4QL|3T=%69L+VY8B%QQ=_kp@Z67>q(^wZ zg*aFq*6sKOJR`Sy8Pz2sc@N91sfiAc4n^?UIUW$=%B9A^+`5P3Aa&25MfW)4;5tOD ztDvG-W@E&&aUj2|;oay+Llu6QCE&zebzL{rnjl@D!<~BJ^SEEonGy(wN=1-V+zUFj)XESDnKlR5O1d$mrO_;KCj`onM_P;zR8Mp@E8kr}^>4>J zqaW!LrOUGkuxf1K6k1IwP5b=~F}HZyuMcsg)5dSX0r;aX84A?*6Vwjwe5Xfxn^hkm z$Rlr(v0j{sKO(%QTF%|rKLNyqv13WwKOBbGvaJ$jcf`Jk8A!fh6|ecbKQSb9{iSrY1*1zUF~Rz-}2pG0#JOb@MQa&2xc7 z*)6GYRAy=UQbh534ucP$Th*iW0G?f4HlU+^D$IveI02kj*39V-S5Paiz<#CS;4*N#2Fu`R__lZ!KhlSAGsf#F750f z&>lP8wju+{qU|uN8&u4u={ayfN9%Qutdw9$?xeEU&de$cj(_eWNwvGOXbV-n4kFJWtVZS|EOxDnG3h~ zxs^+-)S;$IVBwMs<_2Xpi@5`a!IdcE4HQ&tH6U~hkAPN z@2L|y8lhVJimemym-1FjyTz)PI1UQRpS0WwF-7H|kLYB{LBEH}LBn;8#GQjsorFG& zkix=gd?S9vGVv>s`rUwMMcbVSO_wfVZtN^O#z05TA*_ zP3pnSpcRS{oF6a*)ih1i6*QRr@%li3T&+}(I&$sDklm7>v^jAF3Q^6x% z2LJW?+2p^^l}`1^X%HpMT;z2bLAsbduz4p=!t)UB91<7c zPW24go1lRKnVA^H9qgUhiaS*K#Fuf$xHLi5t-zgo-d5uN0PaEDsYh#Z{~PY$-30wo z>u_IyJNnoJ%})%s6W8G0jr%RQLw`@)f%|&ge}Fr9EV?|5u+rrWm0Hx`D()T~Ql^-S zW627RJXLY8J8?UlxVM}*`r8!T3?0J$WG9Y&PvM*6#Lac$mN;=7H544D_Y6&!zbbB> z6W8s)4LWf{PTYhOx5bGw|b|x-`KwtI<(ec(jhhkLk1V`!{A**ZMww=PA}(k@goQD&Qcj zIBpPdem?)0 zM$bW8GVKVIY=yNx30&(C$dDmW8GU9JBRdi((rS@})uvKRyQA1|&hZd=2;xX2#prW+ ziEP2=t;XL4r7e+Bm31;|sblsuzVZdQ5= z?FFyjgmmnFyBjw%$16(B;8br)>hxE?0&LE9kA}PP-&uAG&kf!`mgNz?!{HXGeV+OGeZX*phO8QtmHQ0fU{) zh{tD@C9smPrE-D@ks$LjGZb>OyTF-*b@f|I=sgXYIf0rq2x9=VOo&(pRMxAd*gO@w z?9$4M@t_!Y!S65F(t$(uAu+t@S-89E?JpaqI$C

    hRKzDBDn1cG0n1zz1XP|V4=96=q4)p= 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