From 98a0cd6e62862ff15bdbf7022271fd40ce182954 Mon Sep 17 00:00:00 2001 From: Dutchman101 <12105539+Dutchman101@users.noreply.github.com> Date: Wed, 12 Jan 2022 21:45:19 +0100 Subject: [PATCH 01/49] Update CEF from 97.1.1+g50067f2+chromium-97.0.4692.71 to 97.1.2+gb821dc3+chromium-97.0.4692.71 It's a small non-chromium update, but contains a crash fix that may be 1 of the biggest CEF crashes in MTA --- utils/buildactions/install_cef.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/utils/buildactions/install_cef.lua b/utils/buildactions/install_cef.lua index b749c309d1..e33c53c406 100644 --- a/utils/buildactions/install_cef.lua +++ b/utils/buildactions/install_cef.lua @@ -9,8 +9,8 @@ local CEF_URL_PREFIX = "https://cef-builds.spotifycdn.com/cef_binary_" local CEF_URL_SUFFIX = "_windows32_minimal.tar.bz2" -- Change here to update CEF version -local CEF_VERSION = "97.1.1+g50067f2+chromium-97.0.4692.71" -local CEF_HASH = "0963e38547512c32974500245530cf2615ccc14cc77dd2605cf76eae851229e2" +local CEF_VERSION = "97.1.2+gb821dc3+chromium-97.0.4692.71" +local CEF_HASH = "c563e4c3f150e70e20a80b3665768fa250ed9b64a3cda13955a1c00a58d2da71" function make_cef_download_url() return CEF_URL_PREFIX..http.escapeUrlParam(CEF_VERSION)..CEF_URL_SUFFIX From 8088801f07fa866028a3f88cf7d3a979a3034ef2 Mon Sep 17 00:00:00 2001 From: Marek Kulik Date: Thu, 13 Jan 2022 18:05:10 +0100 Subject: [PATCH 02/49] Fix settings gui crash It's undefined behavior to assign a null pointer to std::string (see https://godbolt.org/z/se8EPaPP5) --- Client/core/CKeyBinds.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Client/core/CKeyBinds.cpp b/Client/core/CKeyBinds.cpp index 35d301dbba..b642820a4a 100644 --- a/Client/core/CKeyBinds.cpp +++ b/Client/core/CKeyBinds.cpp @@ -630,7 +630,7 @@ bool CKeyBinds::AddCommand(const char* szKey, const char* szCommand, const char* if (bScriptCreated) bind->originalScriptKey = szKey; - else + else if (szOriginalScriptKey) bind->originalScriptKey = szOriginalScriptKey; // Will wait for script to addcommand before doing replace } From a69f69495b8c5577907fbf10518c94447748386b Mon Sep 17 00:00:00 2001 From: Marek Kulik Date: Sat, 15 Jan 2022 16:50:09 +0100 Subject: [PATCH 03/49] Fix re-enabling a game control Co-Authored-By: srslyyyy <51768772+srslyyyy@users.noreply.github.com> --- Client/core/CKeyBinds.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Client/core/CKeyBinds.cpp b/Client/core/CKeyBinds.cpp index b642820a4a..dd8940436d 100644 --- a/Client/core/CKeyBinds.cpp +++ b/Client/core/CKeyBinds.cpp @@ -1252,7 +1252,7 @@ void CKeyBinds::ResetGTAControlState(SBindableGTAControl* pControl) if (controlBind->control == pControl && controlBind->state) { - controlBind->state = true; + pControl->bState = true; return; } } From 5c4d1f4d24061ff06394b98850ad2743f2769255 Mon Sep 17 00:00:00 2001 From: patrikjuvonen <22572159+patrikjuvonen@users.noreply.github.com> Date: Sat, 15 Jan 2022 23:09:32 +0200 Subject: [PATCH 04/49] Update rebuild-pots.yaml --- .github/workflows/rebuild-pots.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/rebuild-pots.yaml b/.github/workflows/rebuild-pots.yaml index 845c7afd68..d96b2914d0 100644 --- a/.github/workflows/rebuild-pots.yaml +++ b/.github/workflows/rebuild-pots.yaml @@ -1,7 +1,8 @@ name: 'Rebuild en_US pot files' on: push: - branch: master + branches: + - master workflow_dispatch: jobs: From 29dfe4bd095170a131b27f9687262995ad301489 Mon Sep 17 00:00:00 2001 From: Pieter Dewachter Date: Tue, 18 Jan 2022 23:23:37 +0100 Subject: [PATCH 05/49] Remove debug assert in CFileLoaderSA that causes crashes without valid reason (#2513) --- Client/game_sa/CFileLoaderSA.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Client/game_sa/CFileLoaderSA.cpp b/Client/game_sa/CFileLoaderSA.cpp index e6f1971131..c8b04691a3 100644 --- a/Client/game_sa/CFileLoaderSA.cpp +++ b/Client/game_sa/CFileLoaderSA.cpp @@ -45,7 +45,7 @@ void GetNameAndDamage(const char* nodeName, char (&outName)[OutBuffSize], bool& const auto NodeNameEndsWith = [=](const char* with) { const auto withLen = strlen(with); - dassert(withLen <= nodeNameLen); + //dassert(withLen <= nodeNameLen); return withLen <= nodeNameLen /*dont bother checking otherwise, because it might cause a crash*/ && strncmp(nodeName + nodeNameLen - withLen, with, withLen) == 0; }; From 9c571d617c517fc2c54a39186baa69a45036c72f Mon Sep 17 00:00:00 2001 From: MTABot Date: Wed, 19 Jan 2022 08:03:57 +0000 Subject: [PATCH 06/49] Visual Studio Update VS2022: 17.0.32014.148 => 17.0.32112.339 This is an automated commit to keep track of toolchain changes on the build server. It applies to every MTA build after this commit until further notice. From df4d35d2a14cba7fc5549b13cc6cf221d2e7132a Mon Sep 17 00:00:00 2001 From: Merlin Date: Wed, 19 Jan 2022 14:09:35 +0100 Subject: [PATCH 07/49] Fix healthbar blinking faster on high fps (#2487) --- Client/multiplayer_sa/CMultiplayerSA.cpp | 29 ++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/Client/multiplayer_sa/CMultiplayerSA.cpp b/Client/multiplayer_sa/CMultiplayerSA.cpp index d08d94372d..880a3f6134 100644 --- a/Client/multiplayer_sa/CMultiplayerSA.cpp +++ b/Client/multiplayer_sa/CMultiplayerSA.cpp @@ -288,6 +288,8 @@ DWORD RETURN_CTaskSimpleSwim_ProcessSwimmingResistance = 0x68A50E; const DWORD HOOKPOS_Idle_CWorld_ProcessPedsAfterPreRender = 0x53EA03; const DWORD RETURN_Idle_CWorld_ProcessPedsAfterPreRender = 0x53EA08; +#define HOOKPOS_CHud_RenderHealthBar 0x5892AF + #define HOOKPOS_CAEAmbienceTrackManager__UpdateAmbienceTrackAndVolume_StartRadio 0x4D7198 #define HOOKPOS_CAEAmbienceTrackManager__UpdateAmbienceTrackAndVolume_StopRadio 0x4D71E7 @@ -530,6 +532,8 @@ void HOOK_CAEVehicleAudioEntity__ProcessDummyProp(); void HOOK_CTaskSimpleSwim_ProcessSwimmingResistance(); void HOOK_Idle_CWorld_ProcessPedsAfterPreRender(); +void HOOK_CHud_RenderHealthBar(); + void HOOK_CAEAmbienceTrackManager__UpdateAmbienceTrackAndVolume_StartRadio(); void HOOK_CAEAmbienceTrackManager__UpdateAmbienceTrackAndVolume_StopRadio(); @@ -762,6 +766,8 @@ void CMultiplayerSA::InitHooks() HookInstall(HOOKPOS_CAnimManager_AddAnimationAndSync, (DWORD)HOOK_CAnimManager_AddAnimationAndSync, 10); HookInstall(HOOKPOS_CAnimManager_BlendAnimation_Hierarchy, (DWORD)HOOK_CAnimManager_BlendAnimation_Hierarchy, 5); + HookInstall(HOOKPOS_CHud_RenderHealthBar, (DWORD)HOOK_CHud_RenderHealthBar, 9); + HookInstall(HOOKPOS_CAEAmbienceTrackManager__UpdateAmbienceTrackAndVolume_StartRadio, (DWORD)HOOK_CAEAmbienceTrackManager__UpdateAmbienceTrackAndVolume_StartRadio, 5); HookInstall(HOOKPOS_CAEAmbienceTrackManager__UpdateAmbienceTrackAndVolume_StopRadio, @@ -6945,6 +6951,29 @@ void _declspec(naked) HOOK_Idle_CWorld_ProcessPedsAfterPreRender() } } +const DWORD RETURN_CHud_RenderHealthBar = 0x5892B8; +const DWORD RETURN_CHud_RenderHealthBarNoRender = 0x58939E; +void _declspec(naked) HOOK_CHud_RenderHealthBar() +{ + __asm { + //(CTimer::m_snTimeInMilliseconds / 250) % 2 + mov eax, 0xB7CB84 + mov eax, [eax] + xor edx, edx + mov ecx, 250 + div ecx + xor edx, edx + mov ecx, 2 + div ecx + test edx, edx + jz norender + jmp RETURN_CHud_RenderHealthBar + +norender: + jmp RETURN_CHud_RenderHealthBarNoRender + } +} + DWORD dwLastRequestedStation = -1; void CAEAmbienceTrackManager__UpdateAmbienceTrackAndVolume_ChangeStation(DWORD dwStationID) { From 1fac28795ece272f0a7fe0b697c793b315ac3459 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=83=8C=E3=83=AB=E3=83=9D?= <191977649@qq.com> Date: Sat, 22 Jan 2022 19:32:04 +0800 Subject: [PATCH 08/49] Add new world special property (vehicle sun glare effect) (#2495) Co-authored-by: Uladzislau Nikalayevich --- Client/game_sa/CGameSA.cpp | 21 ++++++++++++++++++ Client/game_sa/CGameSA.h | 5 +++++ Client/game_sa/CVehicleSA.cpp | 40 +++++++++++++++++++++++++++++++++++ Client/game_sa/CVehicleSA.h | 8 +++++++ 4 files changed, 74 insertions(+) diff --git a/Client/game_sa/CGameSA.cpp b/Client/game_sa/CGameSA.cpp index 631b7b329f..db7c7df1dd 100644 --- a/Client/game_sa/CGameSA.cpp +++ b/Client/game_sa/CGameSA.cpp @@ -222,6 +222,7 @@ CGameSA::CGameSA() CFxSystemSA::StaticSetHooks(); CFileLoaderSA::StaticSetHooks(); D3DResourceSystemSA::StaticSetHooks(); + CVehicleSA::StaticSetHooks(); } CGameSA::~CGameSA() @@ -603,6 +604,9 @@ bool CGameSA::IsCheatEnabled(const char* szCheatName) if (!strcmp(szCheatName, PROP_UNDERWORLD_WARP)) return IsUnderWorldWarpEnabled(); + if (!strcmp(szCheatName, PROP_VEHICLE_SUNGLARE)) + return IsVehicleSunGlareEnabled(); + std::map::iterator it = m_Cheats.find(szCheatName); if (it == m_Cheats.end()) return false; @@ -635,6 +639,12 @@ bool CGameSA::SetCheatEnabled(const char* szCheatName, bool bEnable) return true; } + if (!strcmp(szCheatName, PROP_VEHICLE_SUNGLARE)) + { + SetVehicleSunGlareEnabled(bEnable); + return true; + } + std::map::iterator it = m_Cheats.find(szCheatName); if (it == m_Cheats.end()) return false; @@ -724,6 +734,17 @@ void CGameSA::SetJetpackWeaponEnabled(eWeaponType weaponType, bool bEnabled) } } +void CGameSA::SetVehicleSunGlareEnabled(bool bEnabled) +{ + // State turning will be handled in hooks handler + CVehicleSA::SetVehiclesSunGlareEnable(bEnabled); +} + +bool CGameSA::IsVehicleSunGlareEnabled() +{ + return CVehicleSA::GetVehiclesSunGlareEnable(); +} + bool CGameSA::PerformChecks() { std::map::iterator it; diff --git a/Client/game_sa/CGameSA.h b/Client/game_sa/CGameSA.h index a3016a5aac..bc2a6dc615 100644 --- a/Client/game_sa/CGameSA.h +++ b/Client/game_sa/CGameSA.h @@ -85,6 +85,8 @@ extern unsigned int OBJECTDYNAMICINFO_MAX; // default: 160 #define PROP_SNIPER_MOON "snipermoon" #define PROP_EXTRA_AIR_RESISTANCE "extraairresistance" #define PROP_UNDERWORLD_WARP "underworldwarp" +#define PROP_VEHICLE_SUNGLARE "vehiclesunglare" + struct SCheatSA { @@ -391,6 +393,9 @@ class CGameSA : public CGame void SetJetpackWeaponEnabled(eWeaponType weaponType, bool bEnabled); bool GetJetpackWeaponEnabled(eWeaponType weaponType); + void SetVehicleSunGlareEnabled(bool bEnabled); + bool IsVehicleSunGlareEnabled(); + unsigned long GetMinuteDuration(); void SetMinuteDuration(unsigned long ulTime); diff --git a/Client/game_sa/CVehicleSA.cpp b/Client/game_sa/CVehicleSA.cpp index 16f454ae51..d371f3db2f 100644 --- a/Client/game_sa/CVehicleSA.cpp +++ b/Client/game_sa/CVehicleSA.cpp @@ -16,6 +16,30 @@ bool g_bVehiclePointerInvalid = false; #include "gamesa_renderware.h" +static BOOL m_bVehicleSunGlare = false; +_declspec(naked) void DoVehicleSunGlare(void* this_) +{ + _asm { + mov eax, FUNC_CVehicle_DoSunGlare + jmp eax + } +} + +void _declspec(naked) HOOK_Vehicle_PreRender(void) +{ + _asm { + mov ecx, m_bVehicleSunGlare + cmp ecx, 0 + jle noglare + mov ecx, esi + call DoVehicleSunGlare + noglare: + mov [esp+0D4h], edi + push 6ABD04h + retn + } +} + namespace { bool ClumpDumpCB(RpAtomic* pAtomic, void* data) @@ -2318,6 +2342,22 @@ void CVehicleSA::OnChangingPosition(const CVector& vecNewPosition) } } +void CVehicleSA::StaticSetHooks() +{ + // Setup vehicle sun glare hook + HookInstall(FUNC_CAutomobile_OnVehiclePreRender, (DWORD)HOOK_Vehicle_PreRender, 5); +} + +void CVehicleSA::SetVehiclesSunGlareEnable(bool bEnabled) +{ + m_bVehicleSunGlare = bEnabled; +} + +bool CVehicleSA::GetVehiclesSunGlareEnable() +{ + return m_bVehicleSunGlare; +} + namespace { VOID _MatrixConvertFromEulerAngles(CMatrix_Padded* matrixPadded, float fX, float fY, float fZ) diff --git a/Client/game_sa/CVehicleSA.h b/Client/game_sa/CVehicleSA.h index 0612e10a34..70ffd3df69 100644 --- a/Client/game_sa/CVehicleSA.h +++ b/Client/game_sa/CVehicleSA.h @@ -164,6 +164,10 @@ class CVehicleSA; #define VAR_CVehicle_Variation1 0x8A6458 #define VAR_CVehicle_Variation2 0x8A6459 +// for vehicle sun glare +#define FUNC_CAutomobile_OnVehiclePreRender 0x6ABCFD +#define FUNC_CVehicle_DoSunGlare 0x6DD6F0 + struct SRailNodeSA { short sX; // x coordinate times 8 @@ -769,6 +773,10 @@ class CVehicleSA : public virtual CVehicle, public virtual CPhysicalSA CVector* GetDummyPositions() { return m_dummyPositions.data(); } const CVector* GetDummyPositions() const override { return m_dummyPositions.data(); } + static void StaticSetHooks(); + static void SetVehiclesSunGlareEnable(bool bEnabled); + static bool GetVehiclesSunGlareEnable(); + private: static void SetAutomobileDummyPosition(CAutomobileSAInterface* automobile, eVehicleDummies dummy, const CVector& position); From e1d0993876089602e3d05a5083c2909fb7ae7d4e Mon Sep 17 00:00:00 2001 From: Dutchman101 <12105539+Dutchman101@users.noreply.github.com> Date: Sat, 22 Jan 2022 20:47:04 +0100 Subject: [PATCH 09/49] Update CEF from 97.1.2+gb821dc3+chromium-97.0.4692.71 to 97.1.6+g8961cdb+chromium-97.0.4692.99 --- utils/buildactions/install_cef.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/utils/buildactions/install_cef.lua b/utils/buildactions/install_cef.lua index e33c53c406..a8922a517c 100644 --- a/utils/buildactions/install_cef.lua +++ b/utils/buildactions/install_cef.lua @@ -9,8 +9,8 @@ local CEF_URL_PREFIX = "https://cef-builds.spotifycdn.com/cef_binary_" local CEF_URL_SUFFIX = "_windows32_minimal.tar.bz2" -- Change here to update CEF version -local CEF_VERSION = "97.1.2+gb821dc3+chromium-97.0.4692.71" -local CEF_HASH = "c563e4c3f150e70e20a80b3665768fa250ed9b64a3cda13955a1c00a58d2da71" +local CEF_VERSION = "97.1.6+g8961cdb+chromium-97.0.4692.99" +local CEF_HASH = "3540c9c6cf80967b66a1884ec097f2d3f9020ccf262fe2498d118cec747a81c2" function make_cef_download_url() return CEF_URL_PREFIX..http.escapeUrlParam(CEF_VERSION)..CEF_URL_SUFFIX From c372dc38ff76ca8ff33f853e4384ab4a9d657881 Mon Sep 17 00:00:00 2001 From: Pirulax Date: Sat, 22 Jan 2022 21:35:26 +0100 Subject: [PATCH 10/49] Get rid of std::function in AsyncTaskSched (#2522) --- .../logic/luadefs/CLuaVectorGraphicDefs.cpp | 8 ++--- .../logic/luadefs/CLuaCryptDefs.cpp | 18 +++++----- Shared/sdk/SharedUtil.AsyncTaskScheduler.h | 35 ++++++++++++------- Shared/sdk/SharedUtil.AsyncTaskScheduler.hpp | 4 +++ 4 files changed, 40 insertions(+), 25 deletions(-) diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaVectorGraphicDefs.cpp b/Client/mods/deathmatch/logic/luadefs/CLuaVectorGraphicDefs.cpp index 9e1e7cb512..86cfe97666 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaVectorGraphicDefs.cpp +++ b/Client/mods/deathmatch/logic/luadefs/CLuaVectorGraphicDefs.cpp @@ -151,7 +151,7 @@ CClientVectorGraphic* CLuaVectorGraphicDefs::SVGCreate(lua_State* luaVM, CVector { CLuaFunctionRef funcRef = luaFunctionRef.value(); - CLuaShared::GetAsyncTaskScheduler()->PushTask( + CLuaShared::GetAsyncTaskScheduler()->PushTask( [funcRef, pVectorGraphic, strRawData] { return LoadFromData(funcRef.GetLuaVM(), pVectorGraphic, strRawData); }, [funcRef](const bool didLoad) { CLuaMain* pLuaMain = m_pLuaManager->GetVirtualMachine(funcRef.GetLuaVM()); @@ -186,7 +186,7 @@ CClientVectorGraphic* CLuaVectorGraphicDefs::SVGCreate(lua_State* luaVM, CVector CLuaFunctionRef funcRef = luaFunctionRef.value(); std::string path = pathOrRawData.value(); - CLuaShared::GetAsyncTaskScheduler()->PushTask( + CLuaShared::GetAsyncTaskScheduler()->PushTask( [funcRef, pFile, pVectorGraphic, path] { lua_State* luaVM = funcRef.GetLuaVM(); @@ -248,7 +248,7 @@ bool CLuaVectorGraphicDefs::SVGSetDocumentXML(CClientVectorGraphic* pVectorGraph { CLuaFunctionRef funcRef = luaFunctionRef.value(); - CLuaShared::GetAsyncTaskScheduler()->PushTask([pVectorGraphic, pXMLNode] { return SetDocument(pVectorGraphic, pXMLNode); }, + CLuaShared::GetAsyncTaskScheduler()->PushTask([pVectorGraphic, pXMLNode] { return SetDocument(pVectorGraphic, pXMLNode); }, [funcRef](const bool didLoad) { CLuaMain* pLuaMain = m_pLuaManager->GetVirtualMachine(funcRef.GetLuaVM()); if (pLuaMain) @@ -282,7 +282,7 @@ bool CLuaVectorGraphicDefs::SVGSetSize(CClientVectorGraphic* pVectorGraphic, CVe { CLuaFunctionRef funcRef = luaFunctionRef.value(); - CLuaShared::GetAsyncTaskScheduler()->PushTask([pVectorGraphic, size] { return SetSize(pVectorGraphic, size); }, + CLuaShared::GetAsyncTaskScheduler()->PushTask([pVectorGraphic, size] { return SetSize(pVectorGraphic, size); }, [funcRef](const bool didLoad) { CLuaMain* pLuaMain = m_pLuaManager->GetVirtualMachine(funcRef.GetLuaVM()); if (pLuaMain) diff --git a/Shared/mods/deathmatch/logic/luadefs/CLuaCryptDefs.cpp b/Shared/mods/deathmatch/logic/luadefs/CLuaCryptDefs.cpp index 4879bbe1e1..9096b49ded 100644 --- a/Shared/mods/deathmatch/logic/luadefs/CLuaCryptDefs.cpp +++ b/Shared/mods/deathmatch/logic/luadefs/CLuaCryptDefs.cpp @@ -108,7 +108,7 @@ std::variant CLuaCryptDefs::PasswordHash(lua_State* luaVM, st CLuaMain* pLuaMain = m_pLuaManager->GetVirtualMachine(luaVM); if (pLuaMain) { - CLuaShared::GetAsyncTaskScheduler()->PushTask( + CLuaShared::GetAsyncTaskScheduler()->PushTask( [password, salt = options["salt"], cost] { // Execute time-consuming task return SharedUtil::BcryptHash(password, salt, cost); @@ -199,7 +199,7 @@ int CLuaCryptDefs::PasswordVerify(lua_State* luaVM) CLuaMain* pLuaMain = m_pLuaManager->GetVirtualMachine(luaVM); if (pLuaMain) { - CLuaShared::GetAsyncTaskScheduler()->PushTask( + CLuaShared::GetAsyncTaskScheduler()->PushTask( [password, hash] { // Execute time-consuming task return SharedUtil::BcryptVerify(password, hash); @@ -253,7 +253,7 @@ std::variant> CLuaCryptDefs::GenerateKey CLuaMain* pLuaMain = m_pLuaManager->GetVirtualMachine(luaVM); if (pLuaMain) { - CLuaShared::GetAsyncTaskScheduler()->PushTask>( + CLuaShared::GetAsyncTaskScheduler()->PushTask( [size]() -> std::variant { // Execute time-consuming task try @@ -346,7 +346,7 @@ int CLuaCryptDefs::EncodeString(lua_State* luaVM) CLuaMain* pLuaMain = m_pLuaManager->GetVirtualMachine(luaVM); if (pLuaMain) { - CLuaShared::GetAsyncTaskScheduler()->PushTask( + CLuaShared::GetAsyncTaskScheduler()->PushTask( [data, key] { // Execute time-consuming task SString result; @@ -391,7 +391,7 @@ int CLuaCryptDefs::EncodeString(lua_State* luaVM) CLuaMain* pLuaMain = m_pLuaManager->GetVirtualMachine(luaVM); if (pLuaMain) { - CLuaShared::GetAsyncTaskScheduler()->PushTask>( + CLuaShared::GetAsyncTaskScheduler()->PushTask( [data, key] { std::pair result; try @@ -459,7 +459,7 @@ int CLuaCryptDefs::EncodeString(lua_State* luaVM) CLuaMain* pLuaMain = m_pLuaManager->GetVirtualMachine(luaVM); if (pLuaMain) { - CLuaShared::GetAsyncTaskScheduler()->PushTask>( + CLuaShared::GetAsyncTaskScheduler()->PushTask( [data, key] { try { @@ -558,7 +558,7 @@ int CLuaCryptDefs::DecodeString(lua_State* luaVM) CLuaMain* pLuaMain = m_pLuaManager->GetVirtualMachine(luaVM); if (pLuaMain) { - CLuaShared::GetAsyncTaskScheduler()->PushTask( + CLuaShared::GetAsyncTaskScheduler()->PushTask( [data, key] { // Execute time-consuming task SString result; @@ -611,7 +611,7 @@ int CLuaCryptDefs::DecodeString(lua_State* luaVM) CLuaMain* pLuaMain = m_pLuaManager->GetVirtualMachine(luaVM); if (pLuaMain) { - CLuaShared::GetAsyncTaskScheduler()->PushTask( + CLuaShared::GetAsyncTaskScheduler()->PushTask( [data, key, iv] { // Execute time-consuming task SString result; @@ -678,7 +678,7 @@ int CLuaCryptDefs::DecodeString(lua_State* luaVM) CLuaMain* pLuaMain = m_pLuaManager->GetVirtualMachine(luaVM); if (pLuaMain) { - CLuaShared::GetAsyncTaskScheduler()->PushTask>( + CLuaShared::GetAsyncTaskScheduler()->PushTask( [data, key] { try { diff --git a/Shared/sdk/SharedUtil.AsyncTaskScheduler.h b/Shared/sdk/SharedUtil.AsyncTaskScheduler.h index 52c278923c..d20de61cc3 100644 --- a/Shared/sdk/SharedUtil.AsyncTaskScheduler.h +++ b/Shared/sdk/SharedUtil.AsyncTaskScheduler.h @@ -1,9 +1,17 @@ #pragma once + +#include + +// Workaround MultiplayerSA including this header for whatever reason.. +#ifdef __cpp_lib_is_invocable +#define HAS_ASYNC_TASK_SCHED + #include #include #include #include #include +#include namespace SharedUtil { @@ -24,17 +32,19 @@ namespace SharedUtil virtual void ProcessResult() = 0; }; - template + template struct STask : public SBaseTask { - using TaskFunction_t = std::function; - using ReadyFunction_t = std::function; + using Result = std::invoke_result_t; - TaskFunction_t m_TaskFunction; - ReadyFunction_t m_ReadyFunction; - ResultType m_Result; + TaskFn m_TaskFunction; + ReadyFn m_ReadyFunction; + Result m_Result; - STask(const TaskFunction_t& taskFunc, const ReadyFunction_t& readyFunc) : m_TaskFunction(taskFunc), m_ReadyFunction(readyFunc) {} + STask(TaskFn&& task, ReadyFn&& ready) : + m_TaskFunction(std::move(task)), + m_ReadyFunction(std::move(ready)) + {} void Execute() override { m_Result = std::move(m_TaskFunction()); } @@ -60,13 +70,13 @@ namespace SharedUtil // taskFunc: Time-consuming function that is executed on the secondary thread (be aware of thread safety!) // readyFunc: Function that is called once the result is ready (called on the main thread) // - template - void PushTask(const std::function& taskFunc, const std::function& readyFunc) + template + void PushTask(TaskFn&& task, ReadyFn&& ready) { - std::unique_ptr pTask{new STask{taskFunc, readyFunc}}; + std::unique_ptr pTask{new STask{std::move(task), std::move(ready)}}; - std::lock_guard lock{m_TasksMutex}; - m_Tasks.push(std::move(pTask)); + std::scoped_lock lock{m_TasksMutex}; + m_Tasks.emplace(std::move(pTask)); } // @@ -90,3 +100,4 @@ namespace SharedUtil std::mutex m_TaskResultsMutex; }; } // namespace SharedUtil +#endif diff --git a/Shared/sdk/SharedUtil.AsyncTaskScheduler.hpp b/Shared/sdk/SharedUtil.AsyncTaskScheduler.hpp index eaf46f7965..d547786eb1 100644 --- a/Shared/sdk/SharedUtil.AsyncTaskScheduler.hpp +++ b/Shared/sdk/SharedUtil.AsyncTaskScheduler.hpp @@ -1,5 +1,8 @@ #include "SharedUtil.AsyncTaskScheduler.h" +// Workaround MultiplayerSA including this header for whatever reason.. +#ifdef HAS_ASYNC_TASK_SCHED + namespace SharedUtil { CAsyncTaskScheduler::CAsyncTaskScheduler(std::size_t numWorkers) @@ -65,3 +68,4 @@ namespace SharedUtil } } } // namespace SharedUtil +#endif From 3068896767976610332272a35ceda28fd33bb75f Mon Sep 17 00:00:00 2001 From: Nurupo Date: Mon, 24 Jan 2022 18:25:30 +0800 Subject: [PATCH 11/49] Fix vehicle sun glare is still enabled after reconnect (#2527) --- Client/game_sa/CGameSA.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Client/game_sa/CGameSA.cpp b/Client/game_sa/CGameSA.cpp index db7c7df1dd..44373ad27f 100644 --- a/Client/game_sa/CGameSA.cpp +++ b/Client/game_sa/CGameSA.cpp @@ -490,6 +490,9 @@ void CGameSA::Reset() // Restore vehicle model wheel sizes CModelInfoSA::ResetAllVehiclesWheelSizes(); + + // Reset the vehicle sun glare effect to default + CVehicleSA::SetVehiclesSunGlareEnable(false); } } From da49960feb6651e1cb6efb8a63408eb8ad89c30e Mon Sep 17 00:00:00 2001 From: Nurupo <191977649@qq.com> Date: Sat, 29 Jan 2022 19:06:46 +0800 Subject: [PATCH 12/49] Do misc refactor of PR #2526 (#2530) --- Client/game_sa/CGameSA.cpp | 8 +++----- Client/game_sa/CVehicleSA.cpp | 4 ++-- Client/game_sa/CVehicleSA.h | 4 ++-- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/Client/game_sa/CGameSA.cpp b/Client/game_sa/CGameSA.cpp index 44373ad27f..4f376e75d6 100644 --- a/Client/game_sa/CGameSA.cpp +++ b/Client/game_sa/CGameSA.cpp @@ -490,9 +490,6 @@ void CGameSA::Reset() // Restore vehicle model wheel sizes CModelInfoSA::ResetAllVehiclesWheelSizes(); - - // Reset the vehicle sun glare effect to default - CVehicleSA::SetVehiclesSunGlareEnable(false); } } @@ -664,6 +661,7 @@ void CGameSA::ResetCheats() SetMoonEasterEggEnabled(false); SetExtraAirResistanceEnabled(true); SetUnderWorldWarpEnabled(true); + CVehicleSA::SetVehiclesSunGlareEnabled(false); std::map::iterator it; for (it = m_Cheats.begin(); it != m_Cheats.end(); it++) @@ -740,12 +738,12 @@ void CGameSA::SetJetpackWeaponEnabled(eWeaponType weaponType, bool bEnabled) void CGameSA::SetVehicleSunGlareEnabled(bool bEnabled) { // State turning will be handled in hooks handler - CVehicleSA::SetVehiclesSunGlareEnable(bEnabled); + CVehicleSA::SetVehiclesSunGlareEnabled(bEnabled); } bool CGameSA::IsVehicleSunGlareEnabled() { - return CVehicleSA::GetVehiclesSunGlareEnable(); + return CVehicleSA::GetVehiclesSunGlareEnabled(); } bool CGameSA::PerformChecks() diff --git a/Client/game_sa/CVehicleSA.cpp b/Client/game_sa/CVehicleSA.cpp index d371f3db2f..0ed18b8595 100644 --- a/Client/game_sa/CVehicleSA.cpp +++ b/Client/game_sa/CVehicleSA.cpp @@ -2348,12 +2348,12 @@ void CVehicleSA::StaticSetHooks() HookInstall(FUNC_CAutomobile_OnVehiclePreRender, (DWORD)HOOK_Vehicle_PreRender, 5); } -void CVehicleSA::SetVehiclesSunGlareEnable(bool bEnabled) +void CVehicleSA::SetVehiclesSunGlareEnabled(bool bEnabled) { m_bVehicleSunGlare = bEnabled; } -bool CVehicleSA::GetVehiclesSunGlareEnable() +bool CVehicleSA::GetVehiclesSunGlareEnabled() { return m_bVehicleSunGlare; } diff --git a/Client/game_sa/CVehicleSA.h b/Client/game_sa/CVehicleSA.h index 70ffd3df69..7b4e5b0528 100644 --- a/Client/game_sa/CVehicleSA.h +++ b/Client/game_sa/CVehicleSA.h @@ -774,8 +774,8 @@ class CVehicleSA : public virtual CVehicle, public virtual CPhysicalSA const CVector* GetDummyPositions() const override { return m_dummyPositions.data(); } static void StaticSetHooks(); - static void SetVehiclesSunGlareEnable(bool bEnabled); - static bool GetVehiclesSunGlareEnable(); + static void SetVehiclesSunGlareEnabled(bool bEnabled); + static bool GetVehiclesSunGlareEnabled(); private: static void SetAutomobileDummyPosition(CAutomobileSAInterface* automobile, eVehicleDummies dummy, const CVector& position); From 64b55bbc7c2ad6cb43f057f85f75574f5fd9673b Mon Sep 17 00:00:00 2001 From: Marek Kulik Date: Sat, 5 Feb 2022 16:51:52 +0100 Subject: [PATCH 13/49] Fix removal of key binds crashing the client --- Client/core/CKeyBinds.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Client/core/CKeyBinds.cpp b/Client/core/CKeyBinds.cpp index dd8940436d..dc6d5a8f3a 100644 --- a/Client/core/CKeyBinds.cpp +++ b/Client/core/CKeyBinds.cpp @@ -519,7 +519,7 @@ void CKeyBinds::Remove(CKeyBind* keyBind) const auto predicate = [keyBind](const KeyBindPtr& bind) { return bind.get() == keyBind; }; if (auto iter = std::find_if(m_binds.begin(), m_binds.end(), predicate); iter != m_binds.end()) - m_binds.erase(iter); + Remove(iter); } void CKeyBinds::Remove(KeyBindContainer::iterator& iter) From f01fe5d711fd3b9d655a0846880461ff1368c72e Mon Sep 17 00:00:00 2001 From: patrikjuvonen <22572159+patrikjuvonen@users.noreply.github.com> Date: Sat, 12 Feb 2022 01:14:24 +0200 Subject: [PATCH 14/49] Update Turkish translations to fix a crash --- .../MTA San Andreas/MTA/locale/tr/client.po | 1615 ++++++----------- 1 file changed, 577 insertions(+), 1038 deletions(-) diff --git a/Shared/data/MTA San Andreas/MTA/locale/tr/client.po b/Shared/data/MTA San Andreas/MTA/locale/tr/client.po index b30c692d5a..28c9623a3b 100644 --- a/Shared/data/MTA San Andreas/MTA/locale/tr/client.po +++ b/Shared/data/MTA San Andreas/MTA/locale/tr/client.po @@ -1,31 +1,28 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. msgid "" msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" +"Project-Id-Version: 2d3d942aa8adf891478198912ac0b233\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-30 23:37+0300\n" -"PO-Revision-Date: 2021-10-03 02:55+0000\n" -"Last-Translator: turret001 \n" -"Language-Team: LANGUAGE \n" -"Language: tr\n" +"POT-Creation-Date: 2022-01-08 17:25+0200\n" +"PO-Revision-Date: 2022-02-11 23:12\n" +"Last-Translator: \n" +"Language-Team: Turkish\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"Translators: Furkan Özden; Avenger; Mert \"MaXenon\"; Darkneblade; Semih; Oguzcan Uyar; Colegon; Samurai; Mert; WindowsOttoman; RaceXtreme; Oguzcan; turret001; Eren Yücel; Uber; Cynydlan; Wickness; velona77; TRFURKAN; daaeernil\n" -"X-Generator: Pootle 2.5.1.3\n" -"X-POOTLE-MTIME: 1633229753.000000\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Crowdin-Project: 2d3d942aa8adf891478198912ac0b233\n" +"X-Crowdin-Project-ID: 13\n" +"X-Crowdin-Language: tr\n" +"X-Crowdin-File: /master/Shared/data/MTA San Andreas/MTA/locale/en_US/client.pot\n" +"X-Crowdin-File-ID: 87\n" +"Language: tr_TR\n" #: ..\Client\cefweb\CWebsiteRequests.cpp:19 msgid "Website requests" msgstr "Website istekleri" #: ..\Client\cefweb\CWebsiteRequests.cpp:27 -msgid "" -"The server requests the following websites in order to load them (later):" +msgid "The server requests the following websites in order to load them (later):" msgstr "Sunucu, (sonradan) yükleme yapmak için şu siteleri talep ediyor:" #: ..\Client\cefweb\CWebsiteRequests.cpp:33 @@ -49,29 +46,27 @@ msgid "***[ COMMAND HELP ]***\n" msgstr "***[ KOMUT YARDIMI ]***\n" #: ..\Client\core\CCommandFuncs.cpp:167 -#, c-format, c-format +#, c-format msgid "* The time is %d:%02d:%02d" msgstr "* Saat %d:%02d:%02d" #: ..\Client\core\CCommandFuncs.cpp:251 msgid "connect: Syntax is 'connect [ ]'" -msgstr "" -"bağlan (/connect): Sözdizimi 'connect [ " -"<şifre>]'" +msgstr "bağlan (/connect): Sözdizimi 'connect [ <şifre>]'" #: ..\Client\core\CCommandFuncs.cpp:259 ..\Client\core\CCommandFuncs.cpp:327 msgid "connect: Bad port number" msgstr "Bağlantı: Hatalı port adresi" #: ..\Client\core\CCommandFuncs.cpp:281 ..\Client\core\CCommandFuncs.cpp:342 -#, c-format, c-format +#, c-format msgid "connect: Connecting to %s:%u..." -msgstr "bağlantı: %s:%u...'e Bağlanılıyor" +msgstr "bağlantı: %s:%u...'e bağlanılıyor..." #: ..\Client\core\CCommandFuncs.cpp:285 ..\Client\core\CCommandFuncs.cpp:346 -#, c-format, c-format +#, c-format msgid "connect: could not connect to %s:%u!" -msgstr "Bağlantı: %s:%u'e bağlanılamadı %s:%u!" +msgstr "bağlantı: %s:%u adresine bağlanılamadı!" #: ..\Client\core\CCommandFuncs.cpp:290 msgid "connect: Failed to unload current mod" @@ -87,7 +82,7 @@ msgstr "Yapılandırma dosyası kaydedildi" #. Print it #: ..\Client\core\CCommandFuncs.cpp:460 -#, c-format, c-format +#, c-format msgid "* Your serial is: %s" msgstr "* Seri numaran: %s" @@ -113,8 +108,8 @@ msgstr "Bağlantı başarısız. Girilen kullanıcı adı geçersiz!" #: ..\Client\core\CConnectManager.cpp:417 #: ..\Client\core\CConnectManager.cpp:427 ..\Client\core\CCore.cpp:1200 #: ..\Client\core\CCore.cpp:1213 ..\Client\core\CGUI.cpp:87 -#: ..\Client\core\CSettings.cpp:2851 ..\Client\core\CSettings.cpp:4025 -#: ..\Client\core\CSettings.cpp:4053 ..\Client\core\CSettings.cpp:4558 +#: ..\Client\core\CSettings.cpp:2870 ..\Client\core\CSettings.cpp:4044 +#: ..\Client\core\CSettings.cpp:4072 ..\Client\core\CSettings.cpp:4577 #: ..\Client\core\DXHook\CDirect3DHook9.cpp:127 #: ..\Client\core\ServerBrowser\CServerBrowser.cpp:1273 #: ..\Client\core\ServerBrowser\CServerBrowser.cpp:1295 @@ -127,17 +122,17 @@ msgstr "Bağlantı başarısız. Girilen kullanıcı adı geçersiz!" #: ..\Client\loader\MainFunctions.cpp:260 #: ..\Client\loader\MainFunctions.cpp:262 #: ..\Client\loader\MainFunctions.cpp:815 -#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:567 -#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:641 -#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:665 -#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:687 -#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:1003 -#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:1083 -#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:1093 -#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:1162 -#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:1196 -#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:1245 -#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:1257 +#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:568 +#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:642 +#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:666 +#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:688 +#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:1004 +#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:1084 +#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:1094 +#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:1163 +#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:1197 +#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:1246 +#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:1258 #: ..\Client\mods\deathmatch\logic\CResourceFileDownloadManager.cpp:145 #: ..\Client\mods\deathmatch\logic\CServer.cpp:181 #: ..\Shared\mods\deathmatch\logic\CLatentTransferManager.cpp:358 @@ -147,76 +142,75 @@ msgstr "Hata" #: ..\Client\core\CConnectManager.cpp:116 msgid "Connecting failed. Invalid host provided!" -msgstr "Bağlantı başarısız. girilen sunucu adresi geçersiz!" +msgstr "Bağlantı başarısız. Girilen sunucu adresi geçersiz!" #: ..\Client\core\CConnectManager.cpp:132 -#, c-format, c-format +#, c-format msgid "Connecting to %s at port %u failed!" msgstr "%s sunucusuna %u portundan yapılan bağlantı başarısız!" #. Display the status box #: ..\Client\core\CConnectManager.cpp:153 -#, c-format, c-format +#, c-format msgid "Connecting to %s:%u ..." -msgstr "%s:%u'a bağlanılıyor ..." +msgstr "%s:%u'a bağlanılıyor..." #. Display the status box #: ..\Client\core\CConnectManager.cpp:154 -#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:583 +#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:584 msgid "CONNECTING" msgstr "BAĞLANILIYOR" #: ..\Client\core\CConnectManager.cpp:269 -#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:1162 +#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:1163 msgid "Connection timed out" msgstr "Bağlantı zaman aşımına uğradı" #: ..\Client\core\CConnectManager.cpp:283 #: ..\Client\core\CConnectManager.cpp:287 -#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:1207 +#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:1208 msgid "Disconnected: unknown protocol error" -msgstr "Bağlantı Kesildi : Bilinmeyen protokol hatası" +msgstr "Bağlantı kesildi: Bilinmeyen protokol hatası" #: ..\Client\core\CConnectManager.cpp:291 -#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:1211 +#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:1212 msgid "Disconnected: disconnected remotely" msgstr "Bağlantı kesildi: bağlantı uzaktan kesildi." #: ..\Client\core\CConnectManager.cpp:295 -#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:1215 +#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:1216 msgid "Disconnected: connection lost remotely" -msgstr "Bağlanti Kesildi: bağlantı uzaktan kaybedildi" +msgstr "Bağlanti kesildi: bağlantı uzaktan kaybedildi" -# Bağlantı koptu: Bu sunucudan uzaklaştırıldınız #: ..\Client\core\CConnectManager.cpp:299 -#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:1219 +#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:1220 msgid "Disconnected: you are banned from this server" -msgstr "Bağlantı kesildi: Bu sunucudan yasaklandınız" +msgstr "Bağlantı kesildi: bu sunucudan yasaklandınız" #: ..\Client\core\CConnectManager.cpp:306 -#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:1227 +#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:1228 msgid "Disconnected: disconnected from the server" msgstr "Bağlantı kesildi: sunucu ile olan bağlantı kesildi" #: ..\Client\core\CConnectManager.cpp:310 -#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:1231 +#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:1232 msgid "Disconnected: connection to the server was lost" -msgstr "Bağlantı kesildi: Sunucu ile yapılan bağlantı koptu." +msgstr "Bağlantı kesildi: sunucu ile yapılan bağlantı koptu" #: ..\Client\core\CConnectManager.cpp:317 -#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:1239 +#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:1240 msgid "Disconnected: connection was refused" -msgstr "Bağlantı Koptu : Bağlantı Reddedildi" +msgstr "Bağlantı Koptu: bağlantı reddedildi" #. Failed loading the mod #: ..\Client\core\CConnectManager.cpp:409 -#, c-format, c-format +#, c-format msgid "No such mod installed (%s)" msgstr "Böyle bir mod yüklü değil (%s)" #: ..\Client\core\CConnectManager.cpp:417 msgid "Bad server response (2)" -msgstr "Sunucudan cevap alınamıyor (2)" +msgstr "Sunucudan yanıt alınamıyor (2)" #: ..\Client\core\CConnectManager.cpp:427 msgid "Bad server response (1)" @@ -228,9 +222,9 @@ msgid "CONSOLE" msgstr "KONSOL" #: ..\Client\core\CCore.cpp:727 ..\Client\loader\CInstallManager.cpp:756 -#, c-format, c-format +#, c-format msgid "MTA:SA cannot continue because drive %s does not have enough space." -msgstr " %s sürücüsünde yeterli alan olmadığı için MTA:SA devam edemiyor." +msgstr "%s diskinde yeterli alan olmadığı için MTA:SA devam edemiyor." #: ..\Client\core\CCore.cpp:729 ..\Shared\mods\deathmatch\logic\Utils.cpp:102 msgid "Fatal error" @@ -241,7 +235,7 @@ msgid "TO FIX, REMOVE THIS FILE:" msgstr "DÜZELTMEK İÇİN, ŞU DOSYAYI SİL:" #: ..\Client\core\CCore.cpp:887 -#, c-format, c-format +#, c-format msgid "%s module is incorrect!" msgstr "%s modülü yanlış!" @@ -250,7 +244,7 @@ msgid "Error executing URL" msgstr "URL çalıştırılırken bir hata oluştu" #: ..\Client\core\CCore.cpp:1212 -#, c-format, c-format +#, c-format msgid "Error running mod specified in command line ('%s')" msgstr "Komut satırında ('%s') belirtilen mod'u çalıştırırken hata" @@ -258,7 +252,7 @@ msgstr "Komut satırında ('%s') belirtilen mod'u çalıştırırken hata" #. m_pCommands->Add ( "clear", CCommandFuncs::Clear ); #: ..\Client\core\CCore.cpp:1297 msgid "this help screen" -msgstr "Bu yardım ekranı" +msgstr "bu yardım ekranı" #: ..\Client\core\CCore.cpp:1298 ..\Client\core\CCore.cpp:1299 msgid "exits the application" @@ -278,7 +272,7 @@ msgstr "arayüzü gösterir" #: ..\Client\core\CCore.cpp:1303 msgid "shows all the binds" -msgstr "Bütün tuş atamalarını gösterir" +msgstr "bütün tuş atamalarını gösterir" #: ..\Client\core\CCore.cpp:1304 msgid "shows your serial" @@ -286,7 +280,7 @@ msgstr "seri numaranızı gösterir" #: ..\Client\core\CCore.cpp:1313 msgid "connects to a server (host port nick pass)" -msgstr "bir sunucuya (host port takma-ad şifre) bağlanır" +msgstr "bir sunucuya (ip port takma-ad şifre) bağlanır" #: ..\Client\core\CCore.cpp:1314 msgid "connects to a previous server" @@ -302,11 +296,11 @@ msgstr "tuş atamasını çıkarır (tuş)" #: ..\Client\core\CCore.cpp:1317 msgid "copies the default gta controls" -msgstr "Varsayılan gta kontrolleri kopyalar" +msgstr "varsayılan gta kontrollerini kopyalar" #: ..\Client\core\CCore.cpp:1318 msgid "outputs a screenshot" -msgstr "Bir ekran görüntüsü kaydeder" +msgstr "bir ekran görüntüsü kaydeder" #: ..\Client\core\CCore.cpp:1319 msgid "immediately saves the config" @@ -314,7 +308,7 @@ msgstr "yapılandırmayı hemen kaydeder" #: ..\Client\core\CCore.cpp:1321 msgid "clears the debug view" -msgstr "Debug görünümünü temizler" +msgstr "debug görünümünü temizler" #: ..\Client\core\CCore.cpp:1322 msgid "scrolls the chatbox upwards" @@ -322,7 +316,7 @@ msgstr "chatboxu yukarı kaydırır" #: ..\Client\core\CCore.cpp:1323 msgid "scrolls the chatbox downwards" -msgstr " Chatboxu aşağıya kaydırır" +msgstr "chatboxu aşağıya kaydırır" #: ..\Client\core\CCore.cpp:1324 msgid "scrolls the debug view upwards" @@ -334,11 +328,11 @@ msgstr "debug görünümünü aşağı doğru kaydırır" #: ..\Client\core\CCore.cpp:1328 msgid "shows the memory statistics" -msgstr "Hafıza istatistiklerini gösterir" +msgstr "hafıza istatistiklerini gösterir" #: ..\Client\core\CCore.cpp:1329 msgid "shows the frame timing graph" -msgstr "Çerçeve zamanlama grafiğini gösterir" +msgstr "çerçeve zamanlama grafiğini gösterir" #: ..\Client\core\CCredits.cpp:32 msgid "Programming" @@ -348,34 +342,30 @@ msgstr "Programlama" msgid "Contributors" msgstr "Katkıda Bulunanlar" -#: ..\Client\core\CCredits.cpp:78 +#: ..\Client\core\CCredits.cpp:82 msgid "Game Design / Scripting" msgstr "Oyun Dizaynı / Modlama" -#: ..\Client\core\CCredits.cpp:98 +#: ..\Client\core\CCredits.cpp:102 msgid "Language Localization" -msgstr "Dil Bölgesi" +msgstr "Yerelleştirme" -#: ..\Client\core\CCredits.cpp:104 +#: ..\Client\core\CCredits.cpp:108 msgid "Patch contributors" -msgstr "Aktif katkıda bulunanlar" +msgstr "Aktif Katkıda Bulunanlar" -#: ..\Client\core\CCredits.cpp:204 +#: ..\Client\core\CCredits.cpp:216 msgid "Special Thanks" msgstr "Özel Teşekkürler" -#: ..\Client\core\CCredits.cpp:231 +#: ..\Client\core\CCredits.cpp:245 msgid "This software makes use of the following libraries and software:" msgstr "Bu yazılım aşağıdaki kütüphaneleri ve yazılımı kullanır:" #. Even the default skin doesn't work, so give up #: ..\Client\core\CGUI.cpp:86 -msgid "" -"The skin you selected could not be loaded, and the default skin also could " -"not be loaded, please reinstall MTA." -msgstr "" -"Seçtiğiniz oyuncu tipi yüklenemedi , ayrıca varsayılan tip de " -"yüklenememiştir. Lütfen MTA' yı baştan yükleyiniz." +msgid "The skin you selected could not be loaded, and the default skin also could not be loaded, please reinstall MTA." +msgstr "Seçtiğiniz oyuncu tipi yüklenemedi, ayrıca varsayılan tip de yüklenememiştir. Lütfen MTA' yı yeniden yükleyiniz." #: ..\Client\core\CJoystickManager.cpp:1578 msgid "Accelerate Axis" @@ -385,185 +375,185 @@ msgstr "Ekseni hızlandır" msgid "Brake Axis" msgstr "Ekseni yavaşlat" -#: ..\Client\core\CKeyBinds.cpp:183 +#: ..\Client\core\CKeyBinds.cpp:181 msgid "Fire" -msgstr "Ateş" +msgstr "Ateş Etme" -#: ..\Client\core\CKeyBinds.cpp:184 +#: ..\Client\core\CKeyBinds.cpp:182 msgid "Next weapon" msgstr "Sonraki silah" -#: ..\Client\core\CKeyBinds.cpp:185 +#: ..\Client\core\CKeyBinds.cpp:183 msgid "Previous weapon" msgstr "Önceki silah" -#: ..\Client\core\CKeyBinds.cpp:186 +#: ..\Client\core\CKeyBinds.cpp:184 msgid "Forwards" msgstr "İleri" -#: ..\Client\core\CKeyBinds.cpp:187 +#: ..\Client\core\CKeyBinds.cpp:185 msgid "Backwards" msgstr "Geri" -#: ..\Client\core\CKeyBinds.cpp:188 ..\Client\core\CSettings.cpp:2169 +#: ..\Client\core\CKeyBinds.cpp:186 ..\Client\core\CSettings.cpp:2169 #: ..\Client\core\CSettings.cpp:2197 msgid "Left" msgstr "Sol" -#: ..\Client\core\CKeyBinds.cpp:189 ..\Client\core\CSettings.cpp:2171 +#: ..\Client\core\CKeyBinds.cpp:187 ..\Client\core\CSettings.cpp:2171 #: ..\Client\core\CSettings.cpp:2198 msgid "Right" msgstr "Sağ" -#: ..\Client\core\CKeyBinds.cpp:190 +#: ..\Client\core\CKeyBinds.cpp:188 msgid "Zoom in" msgstr "Yakınlaştır" -#: ..\Client\core\CKeyBinds.cpp:191 +#: ..\Client\core\CKeyBinds.cpp:189 msgid "Zoom out" msgstr "Uzaklaştır" -#: ..\Client\core\CKeyBinds.cpp:192 +#: ..\Client\core\CKeyBinds.cpp:190 msgid "Enter/Exit" msgstr "Giriş/Çıkış" -#: ..\Client\core\CKeyBinds.cpp:193 +#: ..\Client\core\CKeyBinds.cpp:191 msgid "Change camera" -msgstr "Kamerayı Değiştir" +msgstr "Kamerayı değiştir" #. 10 -#: ..\Client\core\CKeyBinds.cpp:194 +#: ..\Client\core\CKeyBinds.cpp:192 msgid "Jump" msgstr "Zıpla" -#: ..\Client\core\CKeyBinds.cpp:195 +#: ..\Client\core\CKeyBinds.cpp:193 msgid "Sprint" msgstr "Koş" -#: ..\Client\core\CKeyBinds.cpp:196 +#: ..\Client\core\CKeyBinds.cpp:194 msgid "Look behind" -msgstr "Arkaya Bak" +msgstr "Arkaya bakma" -#: ..\Client\core\CKeyBinds.cpp:197 +#: ..\Client\core\CKeyBinds.cpp:195 msgid "Crouch" msgstr "Eğil" -#: ..\Client\core\CKeyBinds.cpp:198 +#: ..\Client\core\CKeyBinds.cpp:196 msgid "Action" msgstr "Eylem" -#: ..\Client\core\CKeyBinds.cpp:199 +#: ..\Client\core\CKeyBinds.cpp:197 msgid "Walk" msgstr "Yürü" -#: ..\Client\core\CKeyBinds.cpp:200 +#: ..\Client\core\CKeyBinds.cpp:198 msgid "Vehicle fire" msgstr "Araç silahı" -#: ..\Client\core\CKeyBinds.cpp:201 +#: ..\Client\core\CKeyBinds.cpp:199 msgid "Vehicle secondary fire" -msgstr "Araç 2. silahı" +msgstr "Araç ikincil silahı" -#: ..\Client\core\CKeyBinds.cpp:202 +#: ..\Client\core\CKeyBinds.cpp:200 msgid "Vehicle left" msgstr "Aracı sola döndürme" -#: ..\Client\core\CKeyBinds.cpp:203 +#: ..\Client\core\CKeyBinds.cpp:201 msgid "Vehicle right" msgstr "Aracı sağa döndürme" #. 20 -#: ..\Client\core\CKeyBinds.cpp:204 +#: ..\Client\core\CKeyBinds.cpp:202 msgid "Steer forwards/down" msgstr "İleri/aşağı yönlendir" -#: ..\Client\core\CKeyBinds.cpp:205 +#: ..\Client\core\CKeyBinds.cpp:203 msgid "Steer backwards/up" msgstr "Geriye/yukarıya yönlendir" -#: ..\Client\core\CKeyBinds.cpp:206 +#: ..\Client\core\CKeyBinds.cpp:204 msgid "Accelerate" msgstr "İvme" -#: ..\Client\core\CKeyBinds.cpp:207 +#: ..\Client\core\CKeyBinds.cpp:205 msgid "Brake/Reverse" msgstr "Fren/Geri" -#: ..\Client\core\CKeyBinds.cpp:208 +#: ..\Client\core\CKeyBinds.cpp:206 msgid "Radio next" -msgstr "Bir sonraki radyo kanalı" +msgstr "Sonraki radyo kanalı" -#: ..\Client\core\CKeyBinds.cpp:209 +#: ..\Client\core\CKeyBinds.cpp:207 msgid "Radio previous" msgstr "Önceki radyo kanalı" -#: ..\Client\core\CKeyBinds.cpp:210 +#: ..\Client\core\CKeyBinds.cpp:208 msgid "Radio user track skip" -msgstr "Sonraki radyo kanalına geçiş" +msgstr "Kullanıcı radyosu şarkı geçme" -#: ..\Client\core\CKeyBinds.cpp:211 +#: ..\Client\core\CKeyBinds.cpp:209 msgid "Horn" msgstr "Korna" -#: ..\Client\core\CKeyBinds.cpp:212 +#: ..\Client\core\CKeyBinds.cpp:210 msgid "Sub-mission" msgstr "Yan Görev" -#: ..\Client\core\CKeyBinds.cpp:213 +#: ..\Client\core\CKeyBinds.cpp:211 msgid "Handbrake" msgstr "El Freni" #. 30 -#: ..\Client\core\CKeyBinds.cpp:214 +#: ..\Client\core\CKeyBinds.cpp:212 msgid "Vehicle look left" -msgstr "Araçtan sola bak" +msgstr "Araçta sola bak" -#: ..\Client\core\CKeyBinds.cpp:215 +#: ..\Client\core\CKeyBinds.cpp:213 msgid "Vehicle look right" -msgstr "Araçtan sağa bak" +msgstr "Araçta sağa bak" -#: ..\Client\core\CKeyBinds.cpp:216 +#: ..\Client\core\CKeyBinds.cpp:214 msgid "Vehicle look behind" -msgstr "Araçtan arkaya bak" +msgstr "Araçta arkaya bak" -#: ..\Client\core\CKeyBinds.cpp:217 +#: ..\Client\core\CKeyBinds.cpp:215 msgid "Vehicle mouse look" -msgstr "araç mouse bakışı" +msgstr "Araç mouse bakışı" -#: ..\Client\core\CKeyBinds.cpp:218 +#: ..\Client\core\CKeyBinds.cpp:216 msgid "Special control left" msgstr "Özel kontrol sol" -#: ..\Client\core\CKeyBinds.cpp:219 +#: ..\Client\core\CKeyBinds.cpp:217 msgid "Special control right" msgstr "Özel kontrol sağ" -#: ..\Client\core\CKeyBinds.cpp:220 +#: ..\Client\core\CKeyBinds.cpp:218 msgid "Special control down" msgstr "Özel kontrol aşağı" -#: ..\Client\core\CKeyBinds.cpp:221 +#: ..\Client\core\CKeyBinds.cpp:219 msgid "Special control up" msgstr "Özel kontrol yukarı" -#: ..\Client\core\CKeyBinds.cpp:222 +#: ..\Client\core\CKeyBinds.cpp:220 msgid "Aim weapon" msgstr "Silah nişan al" -#: ..\Client\core\CKeyBinds.cpp:223 +#: ..\Client\core\CKeyBinds.cpp:221 msgid "Conversation yes" -msgstr "Sohbetler açık" +msgstr "Sohbet olumlu" #. 40 -#: ..\Client\core\CKeyBinds.cpp:224 +#: ..\Client\core\CKeyBinds.cpp:222 msgid "Conversation no" -msgstr "Sohbetler kapalı" +msgstr "Sohbet olumsuz" -#: ..\Client\core\CKeyBinds.cpp:225 +#: ..\Client\core\CKeyBinds.cpp:223 msgid "Group control forwards" msgstr "Grup kontrol ileri" -#: ..\Client\core\CKeyBinds.cpp:226 +#: ..\Client\core\CKeyBinds.cpp:224 msgid "Group control backwards" msgstr "Grup kontrol geri" @@ -573,41 +563,29 @@ msgid "English" msgstr "Türkçe" #: ..\Client\core\CMainMenu.cpp:315 -msgid "" -"You are using a feature-branch build! This is a test build only which cannot" -" be used to connect to public servers!" -msgstr "" -"Yeni özelliklerin olduğu bir versiyon kullanıyorsun! Bu versiyon sadece " -"deneme amaçlıdır ve herhangi bir sunucuya bağlanmak için kullanılamaz!" +msgid "You are using a feature-branch build! This is a test build only which cannot be used to connect to public servers!" +msgstr "Yeni özelliklerin olduğu bir versiyon kullanıyorsun! Bu versiyon sadece deneme amaçlıdır ve herhangi bir sunucuya bağlanmak için kullanılamaz!" #: ..\Client\core\CMainMenu.cpp:334 -msgid "" -"MTA will not receive updates on XP/Vista after July 2019.\n" -"\n" +msgid "MTA will not receive updates on XP/Vista after July 2019.\n\n" "Upgrade Windows to play on the latest servers." -msgstr "" -"Xp ve Vista Temmuz 2019'dan sonra MTA'yı kaldırmayacak.\n" -"\n" +msgstr "Xp ve Vista Temmuz 2019'dan sonra MTA'yı kaldırmayacak.\n\n" "En son ve güncel serverlarda oynamak için, Windowsunuzu güncelleyin." #: ..\Client\core\CMainMenu.cpp:1148 -msgid "" -"This will disconnect you from the current server.\n" -"\n" +msgid "This will disconnect you from the current server.\n\n" "Are you sure you want to disconnect?" -msgstr "" -"Bu sizi mevcut sunucudan atacaktır.\n" -"\n" +msgstr "Bu sizi mevcut sunucudan atacaktır.\n\n" "Çıkmak istediğinizden emin misiniz?" #: ..\Client\core\CMainMenu.cpp:1152 msgid "DISCONNECT WARNING" -msgstr "Bağlantı kesme hatası" +msgstr "BAĞLANTI KESME UYARISI" #: ..\Client\core\CMainMenu.cpp:1154 ..\Client\core\CQuestionBox.cpp:194 #: ..\Client\core\CSettings.cpp:1339 ..\Client\core\CSettings.cpp:1363 -#: ..\Client\core\CSettings.cpp:4345 ..\Client\core\CSettings.cpp:4412 -#: ..\Client\core\CSettings.cpp:4461 ..\Client\core\CVersionUpdater.cpp:1569 +#: ..\Client\core\CSettings.cpp:4364 ..\Client\core\CSettings.cpp:4431 +#: ..\Client\core\CSettings.cpp:4480 ..\Client\core\CVersionUpdater.cpp:1569 #: ..\Client\core\CVersionUpdater.cpp:1587 #: ..\Client\core\CVersionUpdater.cpp:1856 #: ..\Client\core\CVersionUpdater.cpp:1875 @@ -617,12 +595,15 @@ msgid "No" msgstr "Hayır" #. ///////////////////////////////////////////////////////////////////////// +#. #. Dialog strings +#. +#. #. ///////////////////////////////////////////////////////////////////////// #: ..\Client\core\CMainMenu.cpp:1155 ..\Client\core\CQuestionBox.cpp:195 #: ..\Client\core\CSettings.cpp:1340 ..\Client\core\CSettings.cpp:1364 -#: ..\Client\core\CSettings.cpp:4346 ..\Client\core\CSettings.cpp:4413 -#: ..\Client\core\CSettings.cpp:4462 ..\Client\core\CVersionUpdater.cpp:1570 +#: ..\Client\core\CSettings.cpp:4365 ..\Client\core\CSettings.cpp:4432 +#: ..\Client\core\CSettings.cpp:4481 ..\Client\core\CVersionUpdater.cpp:1570 #: ..\Client\core\CVersionUpdater.cpp:1588 #: ..\Client\core\CVersionUpdater.cpp:1857 #: ..\Client\core\CVersionUpdater.cpp:1876 @@ -634,14 +615,14 @@ msgstr "Evet" #. News link #: ..\Client\core\CNewsBrowser.cpp:171 msgid "Visit latest news article" -msgstr "Son haber makalesini ziyaret et." +msgstr "Son haber makalesini ziyaret et" #: ..\Client\core\CQuestionBox.cpp:192 ..\Shared\sdk\SharedUtil.Misc.hpp:696 msgid "Do you want to see some on-line help about this problem ?" msgstr "Bu problem hakkında önerilen çözümü görmek ister misiniz?" #: ..\Client\core\CScreenShot.cpp:53 -#, c-format, c-format +#, c-format msgid "Screenshot taken: '%s'" msgstr "Ekran görüntüsü alındı: '%s'" @@ -656,7 +637,7 @@ msgstr "Çok Oyunculu" #: ..\Client\core\CSettings.cpp:116 msgid "Video" -msgstr "Video" +msgstr "Görüntü" #: ..\Client\core\CSettings.cpp:117 msgid "Audio" @@ -684,7 +665,7 @@ msgstr "Gelişmiş" #. Create buttons #. OK button -#: ..\Client\core\CSettings.cpp:126 ..\Client\core\CSettings.cpp:4579 +#: ..\Client\core\CSettings.cpp:126 ..\Client\core\CSettings.cpp:4598 #: ..\Client\core\CVersionUpdater.cpp:1605 #: ..\Client\core\CVersionUpdater.cpp:1821 #: ..\Client\core\CVersionUpdater.cpp:1914 @@ -700,7 +681,7 @@ msgid "OK" msgstr "TAMAM" #. Cancel button -#: ..\Client\core\CSettings.cpp:131 ..\Client\core\CSettings.cpp:4578 +#: ..\Client\core\CSettings.cpp:131 ..\Client\core\CSettings.cpp:4597 #: ..\Client\core\CVersionUpdater.cpp:1788 #: ..\Client\core\CVersionUpdater.cpp:1804 #: ..\Client\core\CVersionUpdater.cpp:1839 @@ -724,7 +705,7 @@ msgstr "Fare hassasiyeti:" #. VerticalAimSensitivity #: ..\Client\core\CSettings.cpp:156 ..\Client\core\CSettings.cpp:198 msgid "Vertical aim sensitivity:" -msgstr "Dikey mouse hassasiyeti" +msgstr "Dikey fare hassasiyeti:" #. Mouse Options #: ..\Client\core\CSettings.cpp:159 @@ -737,7 +718,7 @@ msgstr "Fareyi dikine doğru ters çevir" #: ..\Client\core\CSettings.cpp:170 msgid "Steer with mouse" -msgstr "Mouse ile sürüş" +msgstr "Fare ile sürüş" #: ..\Client\core\CSettings.cpp:174 msgid "Fly with mouse" @@ -762,7 +743,7 @@ msgstr "Ölü alan" #: ..\Client\core\CSettings.cpp:278 msgid "Saturation" -msgstr "Dolgunluk" +msgstr "Doygunluk" #: ..\Client\core\CSettings.cpp:284 msgid "Use the 'Binds' tab for joypad buttons." @@ -774,11 +755,11 @@ msgstr "Sol Çubuk" #: ..\Client\core\CSettings.cpp:329 msgid "Right Stick" -msgstr "Sağ çubuk" +msgstr "Sağ Çubuk" #: ..\Client\core\CSettings.cpp:344 msgid "DESCRIPTION" -msgstr "Tanım" +msgstr "AÇIKLAMA" #: ..\Client\core\CSettings.cpp:345 msgid "KEY" @@ -786,7 +767,7 @@ msgstr "TUŞ" #: ..\Client\core\CSettings.cpp:347 msgid "ALT. KEY" -msgstr "Alt tuşu" +msgstr "ALTERNATİF TUŞ" #. * #. * Multiplayer tab @@ -805,11 +786,11 @@ msgstr "Sunucu tarayıcısını otomatik yenile" #: ..\Client\core\CSettings.cpp:375 msgid "Allow screen upload" -msgstr "Ekran yüklemesine izin ver." +msgstr "Ekran yüklemesine izin ver" #: ..\Client\core\CSettings.cpp:380 msgid "Allow external sounds" -msgstr "Harici seslere izin ver." +msgstr "Harici seslere izin ver" #: ..\Client\core\CSettings.cpp:385 msgid "Always show download window" @@ -825,7 +806,7 @@ msgstr "Harita renderlama seçenekleri" #: ..\Client\core\CSettings.cpp:401 ..\Client\core\CSettings.cpp:610 msgid "Opacity:" -msgstr "Matlık" +msgstr "Opaklık:" #. * #. * Audio tab @@ -840,7 +821,7 @@ msgstr "Radyo Ses seviyesi:" #: ..\Client\core\CSettings.cpp:421 ..\Client\core\CSettings.cpp:468 msgid "SFX volume:" -msgstr "SFX ses düzeyi" +msgstr "SFX ses düzeyi:" #: ..\Client\core\CSettings.cpp:421 ..\Client\core\CSettings.cpp:487 msgid "MTA volume:" @@ -848,7 +829,7 @@ msgstr "MTA ses düzeyi" #: ..\Client\core\CSettings.cpp:422 ..\Client\core\CSettings.cpp:506 msgid "Voice volume:" -msgstr "Ses düzeyi" +msgstr "Ses düzeyi:" #: ..\Client\core\CSettings.cpp:422 ..\Client\core\CSettings.cpp:547 msgid "Play mode:" @@ -869,7 +850,7 @@ msgstr "Radyo ayarları" #: ..\Client\core\CSettings.cpp:531 msgid "Radio Equalizer" -msgstr "Radyo Equalizer" +msgstr "Radyo Ekolayzer" #: ..\Client\core\CSettings.cpp:536 msgid "Radio Auto-tune" @@ -879,30 +860,29 @@ msgstr "Radyo Otomatik Açıcı" msgid "Usertrack options" msgstr "Kullanıcı radyosu ayarları" -#: ..\Client\core\CSettings.cpp:555 ..\Client\core\CSettings.cpp:2986 +#: ..\Client\core\CSettings.cpp:555 ..\Client\core\CSettings.cpp:3005 msgid "Radio" msgstr "Radyo" -#: ..\Client\core\CSettings.cpp:556 ..\Client\core\CSettings.cpp:2988 +#: ..\Client\core\CSettings.cpp:556 ..\Client\core\CSettings.cpp:3007 msgid "Random" msgstr "Rastgele" -#: ..\Client\core\CSettings.cpp:557 ..\Client\core\CSettings.cpp:2990 +#: ..\Client\core\CSettings.cpp:557 ..\Client\core\CSettings.cpp:3009 msgid "Sequential" msgstr "Ardışık Sıralı" #: ..\Client\core\CSettings.cpp:560 msgid "Automatic Media Scan" -msgstr "otomatik medya araması," +msgstr "Otomatik Medya Taraması" #: ..\Client\core\CSettings.cpp:567 msgid "Mute options" msgstr "Susturma ayarları" #: ..\Client\core\CSettings.cpp:573 -#, fuzzy msgid "Mute All sounds when minimized" -msgstr "Simge durumuna küçültüldüğünde radyoyu sustur" +msgstr "Simge durumuna küçültüldüğünde bütün sesleri sustur" #: ..\Client\core\CSettings.cpp:578 msgid "Mute Radio sounds when minimized" @@ -910,15 +890,15 @@ msgstr "Simge durumuna küçültüldüğünde radyoyu sustur" #: ..\Client\core\CSettings.cpp:583 msgid "Mute SFX sounds when minimized" -msgstr "Simge durumuna küçültüldüğünde radyoyu sustur" +msgstr "Simge durumuna küçültüldüğünde SFX seslerini sustur" #: ..\Client\core\CSettings.cpp:588 msgid "Mute MTA sounds when minimized" -msgstr "Simge durumuna küçültüldüğünde radyoyu sustur" +msgstr "Simge durumuna küçültüldüğünde MTA seslerini sustur" #: ..\Client\core\CSettings.cpp:593 msgid "Mute Voice sounds when minimized" -msgstr "Simge durumuna küçültüldüğünde radyoyu sustur" +msgstr "Simge durumuna küçültüldüğünde oyuncu mikrofonlarını sustur" #. * #. * Video tab @@ -933,7 +913,7 @@ msgstr "Görüş Açısı:" #: ..\Client\core\CSettings.cpp:609 ..\Client\core\CSettings.cpp:681 msgid "Draw Distance:" -msgstr "Render Mesafesi:" +msgstr "Görüş Mesafesi:" #: ..\Client\core\CSettings.cpp:609 ..\Client\core\CSettings.cpp:699 msgid "Brightness:" @@ -941,7 +921,7 @@ msgstr "Parlaklık:" #: ..\Client\core\CSettings.cpp:609 ..\Client\core\CSettings.cpp:717 msgid "FX Quality:" -msgstr "FX kalitesi" +msgstr "FX Kalitesi:" #: ..\Client\core\CSettings.cpp:610 ..\Client\core\CSettings.cpp:731 msgid "Anisotropic filtering:" @@ -949,11 +929,11 @@ msgstr "Anizotropik filtreleme:" #: ..\Client\core\CSettings.cpp:610 ..\Client\core\CSettings.cpp:758 msgid "Anti-aliasing:" -msgstr "Yumuşatma" +msgstr "Yumuşatma:" #: ..\Client\core\CSettings.cpp:610 ..\Client\core\CSettings.cpp:772 msgid "Aspect Ratio:" -msgstr "Ekran oranı:" +msgstr "Ekran Oranı:" #: ..\Client\core\CSettings.cpp:630 msgid "Windowed" @@ -966,7 +946,7 @@ msgstr "DPI hassaslığı" #: ..\Client\core\CSettings.cpp:644 ..\Client\core\CSettings.cpp:959 #: ..\Client\loader\MainFunctions.cpp:380 msgid "Fullscreen mode:" -msgstr "Tam ekran modu:" +msgstr "Ekran modu:" #: ..\Client\core\CSettings.cpp:651 ..\Client\core\CSettings.cpp:1546 msgid "Standard" @@ -994,7 +974,7 @@ msgid "Medium" msgstr "Orta" #: ..\Client\core\CSettings.cpp:727 ..\Client\core\CSettings.cpp:1041 -#: ..\Client\core\CSettings.cpp:1472 ..\Client\core\CSettings.cpp:3044 +#: ..\Client\core\CSettings.cpp:1472 ..\Client\core\CSettings.cpp:3063 msgid "High" msgstr "Yüksek" @@ -1005,8 +985,8 @@ msgstr "Çok yüksek" #: ..\Client\core\CSettings.cpp:743 ..\Client\core\CSettings.cpp:766 #: ..\Client\core\CSettings.cpp:972 ..\Client\core\CSettings.cpp:1026 #: ..\Client\core\CSettings.cpp:1157 ..\Client\core\CSettings.cpp:1478 -#: ..\Client\core\CSettings.cpp:3051 ..\Client\core\CSettings.cpp:3083 -#: ..\Client\core\CSettings.cpp:3105 ..\Client\core\CSettings.cpp:4093 +#: ..\Client\core\CSettings.cpp:3070 ..\Client\core\CSettings.cpp:3102 +#: ..\Client\core\CSettings.cpp:3124 ..\Client\core\CSettings.cpp:4112 msgid "Off" msgstr "Kapalı" @@ -1023,7 +1003,7 @@ msgid "3x" msgstr "3x" #: ..\Client\core\CSettings.cpp:782 ..\Client\core\CSettings.cpp:974 -#: ..\Client\core\CSettings.cpp:1490 ..\Client\core\CSettings.cpp:3053 +#: ..\Client\core\CSettings.cpp:1490 ..\Client\core\CSettings.cpp:3072 msgid "Auto" msgstr "Otomatik" @@ -1061,7 +1041,7 @@ msgstr "Lastik dumanı vs." #: ..\Client\core\CSettings.cpp:810 msgid "Render vehicles always in high detail" -msgstr "Araçları her zaman yüksek detaylı olarak göster." +msgstr "Araçları her zaman yüksek detayda göster" #: ..\Client\core\CSettings.cpp:814 msgid "Render peds always in high detail" @@ -1077,7 +1057,7 @@ msgstr "Cihaz Seçme Diyaloğunu Aktif Hale Getir" #: ..\Client\core\CSettings.cpp:843 msgid "Show unsafe resolutions" -msgstr "Stabil olmayan çözünürlükleri göster" +msgstr "Güvenli olmayan çözünürlükleri göster" #: ..\Client\core\CSettings.cpp:879 msgid "Enable remote websites" @@ -1119,49 +1099,49 @@ msgstr "Diğer" #. Fast clothes loading #: ..\Client\core\CSettings.cpp:958 ..\Client\core\CSettings.cpp:965 -#: ..\Client\core\CSettings.cpp:4597 +#: ..\Client\core\CSettings.cpp:4616 msgid "Fast CJ clothes loading:" msgstr "Hızlı CJ giysileri yükleme:" #. Browser scan speed #: ..\Client\core\CSettings.cpp:958 ..\Client\core\CSettings.cpp:979 -#: ..\Client\core\CSettings.cpp:4599 +#: ..\Client\core\CSettings.cpp:4618 msgid "Browser speed:" msgstr "Tarayıcı hızı:" #. Single download #: ..\Client\core\CSettings.cpp:958 ..\Client\core\CSettings.cpp:993 -#: ..\Client\core\CSettings.cpp:4601 +#: ..\Client\core\CSettings.cpp:4620 msgid "Single connection:" msgstr "Tek bağlantı:" #. Packet tag #: ..\Client\core\CSettings.cpp:958 ..\Client\core\CSettings.cpp:1006 -#: ..\Client\core\CSettings.cpp:4603 +#: ..\Client\core\CSettings.cpp:4622 msgid "Packet tag:" msgstr "Paket etiketi:" #. Progress animation #: ..\Client\core\CSettings.cpp:959 ..\Client\core\CSettings.cpp:1019 -#: ..\Client\core\CSettings.cpp:4605 +#: ..\Client\core\CSettings.cpp:4624 msgid "Progress animation:" msgstr "Yükleme animasyonu:" #. Process priority #: ..\Client\core\CSettings.cpp:959 ..\Client\core\CSettings.cpp:1032 -#: ..\Client\core\CSettings.cpp:4595 +#: ..\Client\core\CSettings.cpp:4614 msgid "Process priority:" msgstr "İşlem önceliği:" #. Debug setting #: ..\Client\core\CSettings.cpp:959 ..\Client\core\CSettings.cpp:1046 -#: ..\Client\core\CSettings.cpp:4607 +#: ..\Client\core\CSettings.cpp:4626 msgid "Debug setting:" msgstr "Geliştirici ayarları:" #. Streaming memory #: ..\Client\core\CSettings.cpp:960 ..\Client\core\CSettings.cpp:1069 -#: ..\Client\core\CSettings.cpp:4609 +#: ..\Client\core\CSettings.cpp:4628 msgid "Streaming memory:" msgstr "Görüntüleme belleği:" @@ -1176,12 +1156,12 @@ msgid "Install important updates:" msgstr "Önemli güncellemeleri kur:" #: ..\Client\core\CSettings.cpp:973 ..\Client\core\CSettings.cpp:1001 -#: ..\Client\core\CSettings.cpp:1014 ..\Client\core\CSettings.cpp:3055 -#: ..\Client\core\CSettings.cpp:3071 ..\Client\core\CSettings.cpp:3078 +#: ..\Client\core\CSettings.cpp:1014 ..\Client\core\CSettings.cpp:3074 +#: ..\Client\core\CSettings.cpp:3090 ..\Client\core\CSettings.cpp:3097 msgid "On" -msgstr "Devrede" +msgstr "Açık" -#: ..\Client\core\CSettings.cpp:986 ..\Client\core\CSettings.cpp:3060 +#: ..\Client\core\CSettings.cpp:986 ..\Client\core\CSettings.cpp:3079 msgid "Very slow" msgstr "Çok yavaş" @@ -1189,31 +1169,31 @@ msgstr "Çok yavaş" #: ..\Client\core\CSettings.cpp:1013 ..\Client\core\CSettings.cpp:1027 #: ..\Client\core\CSettings.cpp:1053 ..\Client\core\CSettings.cpp:1065 #: ..\Client\core\CSettings.cpp:1158 ..\Client\core\CSettings.cpp:1178 -#: ..\Client\core\CSettings.cpp:3062 ..\Client\core\CSettings.cpp:3069 -#: ..\Client\core\CSettings.cpp:3076 ..\Client\core\CSettings.cpp:3085 -#: ..\Client\core\CSettings.cpp:3098 +#: ..\Client\core\CSettings.cpp:3081 ..\Client\core\CSettings.cpp:3088 +#: ..\Client\core\CSettings.cpp:3095 ..\Client\core\CSettings.cpp:3104 +#: ..\Client\core\CSettings.cpp:3117 msgid "Default" msgstr "Varsayılan" -#: ..\Client\core\CSettings.cpp:988 ..\Client\core\CSettings.cpp:3064 +#: ..\Client\core\CSettings.cpp:988 ..\Client\core\CSettings.cpp:3083 msgid "Fast" msgstr "Hızlı" -#: ..\Client\core\CSettings.cpp:1039 ..\Client\core\CSettings.cpp:3040 +#: ..\Client\core\CSettings.cpp:1039 ..\Client\core\CSettings.cpp:3059 msgid "Normal" msgstr "Normal" -#: ..\Client\core\CSettings.cpp:1040 ..\Client\core\CSettings.cpp:3042 +#: ..\Client\core\CSettings.cpp:1040 ..\Client\core\CSettings.cpp:3061 msgid "Above normal" msgstr "Normal üstü" #: ..\Client\core\CSettings.cpp:1076 msgid "Min" -msgstr "En az" +msgstr "Min" #: ..\Client\core\CSettings.cpp:1089 msgid "Max" -msgstr "En fazla" +msgstr "Maks" #. Windows 8 compatibility #: ..\Client\core\CSettings.cpp:1096 @@ -1252,14 +1232,10 @@ msgid "Some settings will be changed when you next start MTA" msgstr "Bazı ayarlar MTA'yı bir sonraki başlattığınızda değişmiş olacak" #: ..\Client\core\CSettings.cpp:1334 -msgid "" -"\n" -"\n" +msgid "\n\n" "Do you want to restart now?" -msgstr "" -"\n" -"\n" -"Şimdi yeniden başlatmak ister misiniz?" +msgstr "\n\n" +"Şimdi yeniden başlatmak istiyor musun?" #: ..\Client\core\CSettings.cpp:1337 msgid "RESTART REQUIRED" @@ -1270,13 +1246,9 @@ msgid "Some settings will be changed when you disconnect the current server" msgstr "Şu anki sunucudan çıktığınızda bazı ayarlar değiştirilicektir." #: ..\Client\core\CSettings.cpp:1358 -msgid "" -"\n" -"\n" +msgid "\n\n" "Do you want to disconnect now?" -msgstr "" -"\n" -"\n" +msgstr "\n\n" "Bağlantıyı şimdi kesmek ister misiniz?" #: ..\Client\core\CSettings.cpp:1361 @@ -1330,7 +1302,7 @@ msgstr "Seçenekler" #: ..\Client\core\CSettings.cpp:2024 msgid "Chat Background" -msgstr "Konuşma Arka Planı" +msgstr "Sohbet Arka Planı" #: ..\Client\core\CSettings.cpp:2024 msgid "Chat Text" @@ -1338,7 +1310,7 @@ msgstr "Sohbet Yazısı" #: ..\Client\core\CSettings.cpp:2024 msgid "Input Background" -msgstr "Giriş Arka Planı" +msgstr "Giriş Arka planı" #: ..\Client\core\CSettings.cpp:2024 msgid "Input Text" @@ -1438,230 +1410,197 @@ msgstr "Balon bildirimlerine izin ver" #: ..\Client\core\CSettings.cpp:2290 msgid "Chat text black/white outline" -msgstr "Chat mesajlarına siyah çerçeve ekle" +msgstr "Chat mesajlarına siyah/beyaz çerçeve ekle" #. Create a messagebox to notify the user -#. SString strText = SString::Printf ( "Press a key to bind to '%s'", -#. pItemBind->GetText ().c_str () ); +#. SString strText = SString::Printf ( "Press a key to bind to '%s'", pItemBind->GetText ().c_str () ); #. Create a messagebox to notify the user -#. sSString strText = SString::Printf ( "Press a key to bind to '%s'", -#. pItemBind->GetText ().c_str () ); -#: ..\Client\core\CSettings.cpp:2538 ..\Client\core\CSettings.cpp:2545 +#. sSString strText = SString::Printf ( "Press a key to bind to '%s'", pItemBind->GetText ().c_str () ); +#: ..\Client\core\CSettings.cpp:2539 ..\Client\core\CSettings.cpp:2546 msgid "Press a key to bind, or escape to clear" msgstr "Atamak istediğin tuşa bas veya tuşu temizlemek için ESC'ye bas" -#: ..\Client\core\CSettings.cpp:2539 +#: ..\Client\core\CSettings.cpp:2540 msgid "Binding a primary key" msgstr "Ana tuş ataması" -#: ..\Client\core\CSettings.cpp:2546 +#: ..\Client\core\CSettings.cpp:2547 msgid "Binding a secondary key" msgstr "İkincil tuş ataması" -#: ..\Client\core\CSettings.cpp:2620 +#: ..\Client\core\CSettings.cpp:2623 msgid "GTA GAME CONTROLS" msgstr "GTA OYUN KONTROLLERİ" -#: ..\Client\core\CSettings.cpp:2622 +#: ..\Client\core\CSettings.cpp:2625 msgid "MULTIPLAYER CONTROLS" msgstr "ÇOKLU OYUNCU KONTROLLERİ" -#: ..\Client\core\CSettings.cpp:2851 ..\Client\core\CSettings.cpp:4558 +#: ..\Client\core\CSettings.cpp:2870 ..\Client\core\CSettings.cpp:4577 msgid "Your nickname contains invalid characters!" msgstr "Nickinde izin verilmeyen karakterler var!" -#: ..\Client\core\CSettings.cpp:3637 +#: ..\Client\core\CSettings.cpp:3656 msgid "Red:" msgstr "Kırmızı:" -#: ..\Client\core\CSettings.cpp:3637 +#: ..\Client\core\CSettings.cpp:3656 msgid "Green:" msgstr "Yeşil:" -#: ..\Client\core\CSettings.cpp:3637 +#: ..\Client\core\CSettings.cpp:3656 msgid "Blue:" msgstr "Mavi:" -#: ..\Client\core\CSettings.cpp:3637 +#: ..\Client\core\CSettings.cpp:3656 msgid "Transparency:" msgstr "Şeffaflık:" -#: ..\Client\core\CSettings.cpp:3640 +#: ..\Client\core\CSettings.cpp:3659 msgid "Color" msgstr "Renk" -#: ..\Client\core\CSettings.cpp:3717 +#: ..\Client\core\CSettings.cpp:3736 msgid "Preview" -msgstr "Önizleme" +msgstr "Ön izleme" -#: ..\Client\core\CSettings.cpp:4025 +#: ..\Client\core\CSettings.cpp:4044 msgid "Please disconnect before changing language" msgstr "Lütfen dilinizi değiştirmeden önce sunucudan ayrılın" -#: ..\Client\core\CSettings.cpp:4053 +#: ..\Client\core\CSettings.cpp:4072 msgid "Please disconnect before changing skin" msgstr "Lütfen temanızı değiştirmeden önce sunucudan ayrılın" -#: ..\Client\core\CSettings.cpp:4339 -msgid "" -"Volmetric shadows can cause some systems to slow down.\n" -"\n" +#: ..\Client\core\CSettings.cpp:4358 +msgid "Volmetric shadows can cause some systems to slow down.\n\n" "Are you sure you want to enable them?" -msgstr "" -"Volumetrik gölgeler bazı sistemlerin yavaşlamasına neden olabilir.\n" -"\n" +msgstr "Volumetrik gölgeler bazı sistemlerin yavaşlamasına neden olabilir.\n\n" "Etkinleştirmek istediğine emin misin?" -#: ..\Client\core\CSettings.cpp:4343 +#: ..\Client\core\CSettings.cpp:4362 msgid "PERFORMANCE WARNING" msgstr "PERFORMANS UYARISI" -#: ..\Client\core\CSettings.cpp:4363 -msgid "" -"Screen upload is required by some servers for anti-cheat purposes.\n" -"\n" +#: ..\Client\core\CSettings.cpp:4382 +msgid "Screen upload is required by some servers for anti-cheat purposes.\n\n" "(The chat box and GUI is excluded from the upload)\n" -msgstr "" -"Ekran görüntüsü paylaşımı, bazı sunucular için anti-hile amacıyla gerekmektedir.\n" -"\n" +msgstr "Ekran görüntüsü paylaşımı, bazı sunucular için anti-hile amacıyla gerekmektedir.\n\n" "(Sohbet kutusu ve GUI yüklemenin dışındadır)\n" -#: ..\Client\core\CSettings.cpp:4365 +#: ..\Client\core\CSettings.cpp:4384 msgid "SCREEN UPLOAD INFORMATION" msgstr "EKRAN YÜKLEME BİLGİSİ" -#: ..\Client\core\CSettings.cpp:4380 -msgid "" -"Some scripts may play sounds, such as radio, from the internet.\n" -"\n" +#: ..\Client\core\CSettings.cpp:4399 +msgid "Some scripts may play sounds, such as radio, from the internet.\n\n" "Disabling this setting may decrease network\n" "bandwidth consumption.\n" -msgstr "" -"Bazı scriptler, internetten -radyo gibi- sesleri oynatabilir.\n" -"\n" +msgstr "Bazı scriptler, internetten -radyo gibi- sesleri oynatabilir.\n\n" "Bu ayarı kapatmak internet\n" "bant genişliğini rahatlatabilir\n" -#: ..\Client\core\CSettings.cpp:4383 +#: ..\Client\core\CSettings.cpp:4402 msgid "EXTERNAL SOUNDS" msgstr "HARİCİ SESLER" -#: ..\Client\core\CSettings.cpp:4404 -msgid "" -"Some files in your GTA:SA data directory are customized.\n" -"MTA will only use these modified files if this check box is ticked.\n" -"\n" -"However, CUSTOMIZED GTA:SA FILES ARE BLOCKED BY MANY SERVERS\n" -"\n" +#: ..\Client\core\CSettings.cpp:4423 +msgid "Some files in your GTA:SA data directory are customized.\n" +"MTA will only use these modified files if this check box is ticked.\n\n" +"However, CUSTOMIZED GTA:SA FILES ARE BLOCKED BY MANY SERVERS\n\n" "Are you sure you want to use them?" -msgstr "" -"GTA:SA klasörünüzdeki bazı dosyalar değiştirilmiş.\n" -"MTA bu dosyaları sadece bu kutu işaretlenmişse kullanır.\n" -"\n" -"Ancak, DEĞİŞTİRİLMİŞ GTA:SA DOSYALARI ÇOĞU SUNUCU TARAFINDAN ENGELLENMİŞTİR.\n" -"\n" -"Bu dosyaları kullanmak istediğinizden emin misiniz?" - -#: ..\Client\core\CSettings.cpp:4410 ..\Client\core\CVersionUpdater.cpp:2079 +msgstr "GTA:SA klasörünüzdeki bazı dosyalar değiştirilmiş.\n" +"MTA bu dosyaları sadece bu kutu işaretlenmişse kullanır.\n\n" +"Ancak, DEĞİŞTİRİLMİŞ GTA:SA DOSYALARI ÇOĞU SUNUCU TARAFINDAN ENGELLENMİŞTİR.\n\n" +"Bu dosyaları kullanmak istediğinize emin misiniz?" + +#: ..\Client\core\CSettings.cpp:4429 ..\Client\core\CVersionUpdater.cpp:2079 msgid "CUSTOMIZED GTA:SA FILES" msgstr "DEĞİŞTİRİLMİŞ GTA:SA DOSYALARI" -#: ..\Client\core\CSettings.cpp:4453 -msgid "" -"Enabling DPI awareness is an experimental feature and\n" +#: ..\Client\core\CSettings.cpp:4472 +msgid "Enabling DPI awareness is an experimental feature and\n" "we only recommend it when you play MTA:SA on a scaled monitor.\n" -"You may experience graphical issues if you enable this option.\n" -"\n" +"You may experience graphical issues if you enable this option.\n\n" "Are you sure you want to enable this option?" -msgstr "" -"DPI Hassasiyetini aktif etmek, deneysel bir özellik ve sadece\n" +msgstr "DPI hassasiyetini aktif etmek, deneysel bir özellik ve sadece\n" "MTA:SA'yı ölçekli bir monitörde oynadığınızda tavsiye ediyoruz.\n" -"Aksi taktirde bazı grafiksel problemlerle karşılaşabilirsiniz.\n" -"\n" +"Aksi taktirde bazı grafiksel problemlerle karşılaşabilirsiniz.\n\n" "Bu özelliği aktif etmek istiyor musunuz?" -#: ..\Client\core\CSettings.cpp:4459 +#: ..\Client\core\CSettings.cpp:4478 msgid "EXPERIMENTAL FEATURE" msgstr "DENEYSEL ÖZELLİK" -#: ..\Client\core\CSettings.cpp:4576 +#: ..\Client\core\CSettings.cpp:4595 msgid "Please enter a nickname" msgstr "Lütfen bir nick girin" -#: ..\Client\core\CSettings.cpp:4577 -msgid "" -"Please enter a nickname to be used ingame. \n" +#: ..\Client\core\CSettings.cpp:4596 +msgid "Please enter a nickname to be used ingame. \n" "This will be your name when you connect to and play in a server" -msgstr "" -"Oyunda kullanılmak üzere bir nick girin. \n" -"Bu girdiğiniz sunucularda sizin adınız olarak kullanılacak" +msgstr "Oyunda kullanılmak üzere bir nick girin. \n" +"Bu, girdiğiniz sunucularda sizin adınız olarak kullanılacak" -#: ..\Client\core\CSettings.cpp:4595 +#: ..\Client\core\CSettings.cpp:4614 msgid "Very experimental feature." msgstr "Çok deneysel özellik." -#: ..\Client\core\CSettings.cpp:4597 +#: ..\Client\core\CSettings.cpp:4616 msgid "Stops stalls with CJ variations (Uses 65MB more RAM)" -msgstr "" -"CJ varyasyonlarındaki takılmaları durdurur (65MB daha fazla RAM kullanır)" +msgstr "CJ varyasyonlarındaki takılmaları durdurur (65MB daha fazla RAM kullanır)" -#: ..\Client\core\CSettings.cpp:4599 +#: ..\Client\core\CSettings.cpp:4618 msgid "Older routers may require a slower scan speed." msgstr "Eski modemler daha yavaş tarama hızı gerektirebilir." -#: ..\Client\core\CSettings.cpp:4601 +#: ..\Client\core\CSettings.cpp:4620 msgid "Switch on to use only one connection when downloading." -msgstr "" -"İndirme yaparken sadece bir bağlantı üzerinden indirmek yapmak için aktif " -"edin." +msgstr "İndirme yaparken sadece bir bağlantı üzerinden indirme yapmak için aktif edin." -#: ..\Client\core\CSettings.cpp:4603 +#: ..\Client\core\CSettings.cpp:4622 msgid "Tag network packets to help ISPs identify MTA traffic." -msgstr "" -"Ağ paketlerini etiketleyerek MTA trafiğini tanıyabilmesi için Internet " -"Servis Sağlayıcılarına yardımcı olun." +msgstr "Ağ paketlerini etiketleyerek MTA trafiğini tanıyabilmesi için Internet Servis Sağlayıcılarına yardımcı olun." -#: ..\Client\core\CSettings.cpp:4605 +#: ..\Client\core\CSettings.cpp:4624 msgid "Spinning circle animation at the bottom of the screen" msgstr "Ekranın alt kısmındaki dönen daire animasyonu" -#: ..\Client\core\CSettings.cpp:4607 +#: ..\Client\core\CSettings.cpp:4626 msgid "Select default always. (This setting is not saved)" msgstr "Varsayılan seçin. (Bu ayar kaydedilmez)" -#: ..\Client\core\CSettings.cpp:4609 +#: ..\Client\core\CSettings.cpp:4628 msgid "Maximum is usually best" msgstr "Maximum genellikle en iyidir" -#: ..\Client\core\CSettings.cpp:4611 ..\Client\core\CSettings.cpp:4613 +#: ..\Client\core\CSettings.cpp:4630 ..\Client\core\CSettings.cpp:4632 msgid "Auto updater:" msgstr "Otomatik güncelleyici:" -#: ..\Client\core\CSettings.cpp:4611 +#: ..\Client\core\CSettings.cpp:4630 msgid "Select default unless you like filling out bug reports." -msgstr "Eğer hata raporu doldurmayı sevmiyorsanız varsayılanı seçiniz." +msgstr "Eğer hata raporu doldurmayı sevmiyorsanız varsayılanı seçin." -#: ..\Client\core\CSettings.cpp:4613 +#: ..\Client\core\CSettings.cpp:4632 msgid "Select default to automatically install important updates." -msgstr "" -"Önemli güncelleştirmeleri otomatik olarak yüklemek için varsayılan'ı seçin." +msgstr "Önemli güncelleştirmeleri otomatik olarak yüklemek için varsayılan'ı seçin." -#: ..\Client\core\CSettings.cpp:4615 +#: ..\Client\core\CSettings.cpp:4634 msgid "16-bit color:" msgstr "16-bit renk:" -#: ..\Client\core\CSettings.cpp:4615 +#: ..\Client\core\CSettings.cpp:4634 msgid "Enable 16 bit color modes - Requires MTA restart" msgstr "16-bit renk modunu etkinleştir - MTA'yı baştan başlatmayı gerektirir" -#: ..\Client\core\CSettings.cpp:4617 +#: ..\Client\core\CSettings.cpp:4636 msgid "Mouse fix:" -msgstr "Fareyi düzeltmesi:" +msgstr "Fare düzeltmesi:" -#: ..\Client\core\CSettings.cpp:4617 +#: ..\Client\core\CSettings.cpp:4636 msgid "Mouse movement fix - May need PC restart" -msgstr "" -"Fare hareketini düzelt - Bilgisayarı yeniden başlatmayı gerektirebilir" +msgstr "Fare hareketini düzelt - Bilgisayarı yeniden başlatmayı gerektirebilir" #: ..\Client\core\CVersionUpdater.cpp:624 msgid "Busy" @@ -1669,40 +1608,31 @@ msgstr "Meşgul" #: ..\Client\core\CVersionUpdater.cpp:624 msgid "Can't check for updates right now" -msgstr "Güncellemeler şuan kontrol edilemez" +msgstr "Güncellemeler şuan kontrol edilemiyor" #: ..\Client\core\CVersionUpdater.cpp:1565 #: ..\Client\core\CVersionUpdater.cpp:1585 #: ..\Client\core\CVersionUpdater.cpp:1603 -#, c-format, c-format +#, c-format msgid "MTA:SA %s required" msgstr "MTA:SA %s gerekli" #: ..\Client\core\CVersionUpdater.cpp:1566 -#, c-format, c-format -msgid "" -"An updated version of MTA:SA %s is required to join the selected server.\n" -"\n" +#, c-format +msgid "An updated version of MTA:SA %s is required to join the selected server.\n\n" "Do you want to download and install MTA:SA %s ?" -msgstr "" -"Bu sunucuya girebilmek için MTA:SA %s gerekiyor.\n" -"\n" +msgstr "Bu sunucuya girebilmek için MTA:SA %s gerekiyor.\n\n" "MTA:SA %s versiyonunu indirip yüklemek ister misiniz?" #: ..\Client\core\CVersionUpdater.cpp:1586 -#, c-format, c-format +#, c-format msgid "Do you want to launch MTA:SA %s and connect to this server ?" -msgstr "" -"MTA:SA %s versiyonunu çalıştırıp bu sunucuyua bağlanmak ister misiniz?" +msgstr "MTA:SA %s versiyonunu çalıştırıp bu sunucuyua bağlanmak ister misiniz?" #: ..\Client\core\CVersionUpdater.cpp:1604 -msgid "" -"It is not possible to connect at this time.\n" -"\n" +msgid "It is not possible to connect at this time.\n\n" "Please try later." -msgstr "" -"Bağlantı şu an mümkün değil.\n" -"\n" +msgstr "Bağlantı şu an mümkün değil.\n\n" "Lütfen sonra tekrar deneyin." #: ..\Client\core\CVersionUpdater.cpp:1786 @@ -1740,13 +1670,9 @@ msgid "MANDATORY UPDATE" msgstr "ZORUNLU GÜNCELLEME" #: ..\Client\core\CVersionUpdater.cpp:1855 -msgid "" -"To join this server, you must update MTA.\n" -"\n" +msgid "To join this server, you must update MTA.\n\n" " Do you want to update now ?" -msgstr "" -"Bu sunucuya bağlanmak için MTA'yı güncellemeniz gerekiyor.\n" -"\n" +msgstr "Bu sunucuya bağlanmak için MTA'yı güncellemeniz gerekiyor.\n\n" "Şimdi güncellemek ister misiniz?" #: ..\Client\core\CVersionUpdater.cpp:1873 @@ -1754,23 +1680,15 @@ msgid "OPTIONAL UPDATE" msgstr "İSTEĞE BAĞLI GÜNCELLEME" #: ..\Client\core\CVersionUpdater.cpp:1874 -msgid "" -"Server says an update is recommended, but not essential.\n" -"\n" +msgid "Server says an update is recommended, but not essential.\n\n" " Do you want to update now ?" -msgstr "" -"Sunucu bir güncelleme yapmanızı öneriyor, ama zorunlu değil.\n" -"\n" +msgstr "Sunucu bir güncelleme yapmanızı öneriyor, ama zorunlu değil.\n\n" "Güncellemek ister misiniz?" #: ..\Client\core\CVersionUpdater.cpp:1913 -msgid "" -"Update not currently avalable.\n" -"\n" +msgid "Update not currently avalable.\n\n" "Please check www.mtasa.com" -msgstr "" -"Güncelleştirme şu an mevcut değil.\n" -"\n" +msgstr "Güncelleştirme şu an mevcut değil.\n\n" "Lütfen www.mtasa.com'a bakınız." #: ..\Client\core\CVersionUpdater.cpp:1934 @@ -1781,7 +1699,7 @@ msgstr "KAYIT HATASI" #: ..\Client\core\CVersionUpdater.cpp:1935 #: ..\Client\core\CVersionUpdater.cpp:2117 msgid "Unable to create the file." -msgstr "Dosya oluşturulamadı." +msgstr "Dosya oluşturulamıyor." #: ..\Client\core\CVersionUpdater.cpp:1943 #: ..\Client\core\CVersionUpdater.cpp:1952 @@ -1798,7 +1716,7 @@ msgstr "İndirilen dosya bozuk gibi gözüküyor." #: ..\Client\core\CVersionUpdater.cpp:1953 #: ..\Client\core\CVersionUpdater.cpp:2135 msgid "For some reason." -msgstr "Nedense." +msgstr "Bazı sebeplerden dolayı." #: ..\Client\core\CVersionUpdater.cpp:1964 #: ..\Client\core\CVersionUpdater.cpp:2148 @@ -1819,47 +1737,33 @@ msgid "ERROR" msgstr "HATA" #: ..\Client\core\CVersionUpdater.cpp:2095 -msgid "" -"Some MTA:SA data files are missing.\n" -"\n" -"\n" +msgid "Some MTA:SA data files are missing.\n\n\n" "Please reinstall MTA:SA" -msgstr "" -"Bazı MTA:SA dosyaları bulunamıyor.\n" -"\n" -"\n" +msgstr "Bazı MTA:SA dosyaları bulunamıyor.\n\n\n" "Lütfen MTA:SA'yı tekrar yükleyin." #: ..\Client\core\CVersionUpdater.cpp:2722 -#, c-format, c-format +#, c-format msgid "%3d %% completed" msgstr "%3d %% tamamlandı" #: ..\Client\core\CVersionUpdater.cpp:2724 -#, c-format, c-format -msgid "" -"\n" -"\n" +#, c-format +msgid "\n\n" "Waiting for response - %-3d" -msgstr "" -"\n" -"\n" -"Cevap bekleniyor %-3d" +msgstr "\n\n" +"Cevap bekleniyor - %-3d" #: ..\Client\core\CVersionUpdater.cpp:3399 -msgid "" -"We've reset your update preferences back to Default, please go change your " -"settings again if you want Nightly updates.\n" -msgstr "" -"Güncelleme tercihlerinizi Varsayılan'a sıfırladık, Nightly güncellemelerini " -"istiyorsanız lütfen ayarlarınızı tekrar değiştirin.\n" +msgid "We've reset your update preferences back to Default, please go change your settings again if you want Nightly updates.\n" +msgstr "Güncelleme tercihlerinizi Varsayılan'a sıfırladık, Nightly güncellemelerini istiyorsanız lütfen ayarlarınızı tekrar değiştirin.\n" #: ..\Client\core\CVersionUpdater.cpp:3400 msgid "VERSION UPDATE INFORMATION" msgstr "VERSİYON GÜNCELLEME BİLGİSİ" #: ..\Client\core\DXHook\CDirect3DEvents9.cpp:230 -#, c-format, c-format, c-format, c-format +#, c-format msgid "Screenshot got %d bytes, but expected %d" msgstr "Ekran görüntüsü %d boyutunda, ancak %d olması gerekiyor" @@ -1868,14 +1772,10 @@ msgid "Screenshot failed" msgstr "Ekran görüntüsü alınamadı" #: ..\Client\core\DXHook\CDirect3DHook9.cpp:124 -msgid "" -"Could not initialize Direct3D9.\n" -"\n" +msgid "Could not initialize Direct3D9.\n\n" "Please ensure the DirectX End-User Runtime and\n" "latest Windows Service Packs are installed correctly." -msgstr "" -"Direct3D9 başlatılamadı.\n" -"\n" +msgstr "Direct3D9 başlatılamadı.\n\n" "Lütfen DirectX End-User Runtime ve\n" "son çıkan Windows Güncelleştirmelerinin doğru yüklendiğini teyit edin." @@ -1903,16 +1803,12 @@ msgid "Recent" msgstr "Son oynananlar" #: ..\Client\core\ServerBrowser\CServerBrowser.cpp:191 -msgid "" -"FOR QUICK CONNECT:\n" -"\n" +msgid "FOR QUICK CONNECT:\n\n" "Type the address and port into the address bar.\n" "Or select a server from the history list and press 'Connect'" -msgstr "" -"HIZLI BAĞLANTI İÇİN:\n" -"\n" +msgstr "HIZLI BAĞLANTI İÇİN:\n\n" "Adresi ve portu adres çubuğuna yazın.\n" -"Veya geçmiş listesinden bir sunucu seçim 'Bağlan'a basın." +"Veya geçmiş listesinden bir sunucu seçin ve 'Bağlan'a basın" #: ..\Client\core\ServerBrowser\CServerBrowser.cpp:203 msgid "HELP" @@ -2046,8 +1942,8 @@ msgstr "Lütfen mtasa:// protokolünü kullanın!" #: ..\Client\core\ServerBrowser\CServerBrowser.cpp:1295 #: ..\Client\core\ServerBrowser\CServerBrowser.cpp:1352 -#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:567 -#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:665 +#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:568 +#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:666 msgid "Invalid nickname! Please go to Settings and set a new one!" msgstr "Geçersiz nick! Ayarlardan yeni bir isim belirleyin!" @@ -2055,7 +1951,7 @@ msgstr "Geçersiz nick! Ayarlardan yeni bir isim belirleyin!" #: ..\Client\core\ServerBrowser\CServerInfo.cpp:319 #: ..\Client\loader\MainFunctions.cpp:594 #: ..\Client\loader\MainFunctions.cpp:601 -#: ..\Client\loader\MainFunctions.cpp:1203 +#: ..\Client\loader\MainFunctions.cpp:1204 msgid "Information" msgstr "Bilgiler" @@ -2153,7 +2049,8 @@ msgstr "Beklemede" #: ..\Client\core\ServerBrowser\CServerList.cpp:150 msgid "player" msgid_plural "players" -msgstr[0] "oyuncuoyuncular" +msgstr[0] "oyuncu" +msgstr[1] "oyuncular" #: ..\Client\core\ServerBrowser\CServerList.cpp:151 msgid "on" @@ -2162,11 +2059,12 @@ msgstr "açık" #: ..\Client\core\ServerBrowser\CServerList.cpp:154 msgid "server" msgid_plural "servers" -msgstr[0] "sunucusunucular" +msgstr[0] "sunucu" +msgstr[1] "sunucular" #. We are polling for the master server list (first pass) #: ..\Client\core\ServerBrowser\CServerList.cpp:238 -#, c-format, c-format +#, c-format msgid "Requesting master server list (%lu ms elapsed)" msgstr "Ana sunucu listesi alınıyor. (%lu ms geçti)" @@ -2231,39 +2129,25 @@ msgid "Copy main executable to avoid graphic driver issues" msgstr "Ekran kartı sorunlarını önlemek için ana çalıştırılabiliri kopyala" #: ..\Client\loader\CInstallManager.cpp:329 ..\Client\loader\Utils.cpp:1182 -#, c-format, c-format -msgid "" -"MTA:SA needs Administrator access for the following task:\n" -"\n" -" '%s'\n" -"\n" +#, c-format +msgid "MTA:SA needs Administrator access for the following task:\n\n" +" '%s'\n\n" "Please confirm in the next window." -msgstr "" -"MTA:SA şu görevi yürütebilmek için Yönetici izni istiyor:\n" -"\n" -"'%s'\n" -"\n" +msgstr "MTA:SA şu görevi yürütebilmek için Yönetici izni istiyor:\n\n" +"'%s'\n\n" "Lütfen bir sonraki pencereden onay verin. " #: ..\Client\loader\CInstallManager.cpp:344 -#, c-format, c-format -msgid "" -"MTA:SA could not complete the following task:\n" -"\n" +#, c-format +msgid "MTA:SA could not complete the following task:\n\n" " '%s'\n" -msgstr "" -"MTA:SA bu görevi tamamlayamadı:\n" -"\n" +msgstr "MTA:SA bu görevi tamamlayamadı:\n\n" "'%s'\n" #: ..\Client\loader\CInstallManager.cpp:394 -msgid "" -"** The crash was caused by a graphics driver error **\n" -"\n" +msgid "** The crash was caused by a graphics driver error **\n\n" "** Please update your graphics drivers **" -msgstr "" -"** Hata, grafik kartı sürücüsü nedeniyle oluştu **\n" -"\n" +msgstr "** Hata, grafik kartı sürücüsü nedeniyle oluştu **\n\n" "** Lütfen grafik kartı sürücülerinizi güncelleyin**" #: ..\Client\loader\CInstallManager.cpp:500 @@ -2271,25 +2155,18 @@ msgid "Install updated MTA:SA files" msgstr "Güncellenmiş MTA:SA dosyalarını yükle" #: ..\Client\loader\CInstallManager.cpp:520 -msgid "" -"Could not update due to file conflicts. Please close other applications and " -"retry" -msgstr "" -"Dosya çakışmaları nedeniyle güncellenemedi. Lütfen diğer uygulamaları " -"kapatın ve tekrar deneyin" +msgid "Could not update due to file conflicts. Please close other applications and retry" +msgstr "Dosya çakışmaları nedeniyle güncellenemedi. Lütfen diğer uygulamaları kapatın ve tekrar deneyin" #: ..\Client\loader\CInstallManager.cpp:529 -#, c-format, c-format +#, c-format msgid "Multi Theft Auto has not been installed properly, please reinstall. %s" -msgstr "" -"Multi Theft Auto düzgün şekilde yüklenmemiş, lütfen tekrar yükleyin. %s" +msgstr "Multi Theft Auto düzgün şekilde yüklenmemiş, lütfen tekrar yükleyin. %s" #: ..\Client\loader\CInstallManager.cpp:584 #: ..\Client\loader\CInstallManager.cpp:616 msgid "MTA:SA cannot continue because the following files are incorrect:" -msgstr "" -"Bazı dosyalarınız bozuk olduğundan MTA:SA çalışmaya devam edemiyor. Bozuk " -"dosyalar:" +msgstr "Bazı dosyalarınız bozuk olduğundan MTA:SA çalışmaya devam edemiyor. Bozuk dosyalar:" #: ..\Client\loader\CInstallManager.cpp:609 msgid "Patch GTA" @@ -2301,9 +2178,7 @@ msgstr "Eksik dosya:" #: ..\Client\loader\CInstallManager.cpp:816 msgid "If MTA fails to load, please re-install GTA:SA" -msgstr "" -"Eğer MTA açılırken başarısız olursa, lütfen GTA:San Andreas'ı tekrardan " -"kurun" +msgstr "Eğer MTA açılırken başarısız olursa, lütfen GTA:San Andreas'ı tekrardan kurun" #: ..\Client\loader\CInstallManager.cpp:937 msgid "Update install settings" @@ -2326,11 +2201,8 @@ msgid "Crash information" msgstr "Çökme bilgisi" #: ..\Client\loader\Dialogs.cpp:53 -msgid "" -"Tick the check box to send this crash info to MTA devs using the 'internet'" -msgstr "" -"Çökme bilgisini 'internet' aracılığı ile MTA geliştiricilerine göndemek için" -" kutucuğu işaretleyin" +msgid "Tick the check box to send this crash info to MTA devs using the 'internet'" +msgstr "Çökme bilgisini 'internet' aracılığı ile MTA geliştiricilerine göndemek için kutucuğu işaretleyin" #: ..\Client\loader\Dialogs.cpp:54 msgid "Doing so will increase the chance of this crash being fixed." @@ -2345,27 +2217,18 @@ msgid "MTA: San Andreas - Warning" msgstr "MTA: San Andreas - Uyarı" #: ..\Client\loader\Dialogs.cpp:63 -msgid "" -"Your Grand Theft Auto: San Andreas install directory contains a d3d9.dll " -"file:" -msgstr "" -"Grand Theft Auto: San Andreas'ın yüklü olduğu dizin d3d9.dll dosyası " -"içermektedir:" +msgid "Your Grand Theft Auto: San Andreas install directory contains a d3d9.dll file:" +msgstr "Grand Theft Auto: San Andreas'ın yüklü olduğu dizin d3d9.dll dosyası içermektedir:" #: ..\Client\loader\Dialogs.cpp:65 -msgid "" -"The file is not required and may interfere with the graphical features in this version of MTA:SA.\n" -"\n" +msgid "The file is not required and may interfere with the graphical features in this version of MTA:SA.\n\n" "It is recommended that you remove or rename d3d9.dll" -msgstr "" -"Bu dosya lazım değil ve MTA'nın bu sürümündeki grafik özellikleri ile çakışabilir.\n" -"\n" +msgstr "Bu dosya lazım değil ve MTA'nın bu sürümündeki grafik özellikleri ile çakışabilir.\n\n" "d3d9.dll dosyasını silmeniz veya yeniden adlandırmanız önerilmektedir" #: ..\Client\loader\Dialogs.cpp:67 msgid "Use this d3d9.dll, but also show this warning on next start" -msgstr "" -"Bu d3d9.dll dosyasını kullan, fakat sonraki başlatmada bana tekrar sor" +msgstr "Bu d3d9.dll dosyasını kullan, fakat sonraki başlatmada bana tekrar sor" #: ..\Client\loader\Dialogs.cpp:68 msgid "Do not tell me about this d3d9.dll again" @@ -2448,17 +2311,11 @@ msgid "Warning: Could not detect anti-virus product" msgstr "Uyarı: Anti-virüs programı bulunamadı" #: ..\Client\loader\Dialogs.cpp:101 -msgid "" -"MTA could not detect an anti-virus on your PC.\n" -"\n" -"Viruses interfere with MTA and degrade your gameplay experience.\n" -"\n" +msgid "MTA could not detect an anti-virus on your PC.\n\n" +"Viruses interfere with MTA and degrade your gameplay experience.\n\n" "Press 'Help' for more information." -msgstr "" -"MTA bilgisayarınızda anti-virüs programı bulamadı.\n" -"\n" -"Virüsler, MTA ile çakışır ve oyun deneyiminizi düşürür.\n" -"\n" +msgstr "MTA bilgisayarınızda anti-virüs programı bulamadı.\n\n" +"Virüsler, MTA ile çakışır ve oyun deneyiminizi düşürür.\n\n" "Daha fazla bilgi için 'Yardım' butonuna basın." #: ..\Client\loader\Dialogs.cpp:104 @@ -2466,11 +2323,9 @@ msgid "I have already installed an anti-virus" msgstr "Ben zaten önceden anti-virüs kurdum" #: ..\Client\loader\Dialogs.cpp:106 -msgid "" -"I will not install an anti-virus.\n" +msgid "I will not install an anti-virus.\n" "I want my PC to lag and be part of a botnet." -msgstr "" -"Anti-virüs kurmayacağım.\n" +msgstr "Anti-virüs kurmayacağım.\n" "Bilgisayarımın yavaşlamasını ve botnetin bir parçası olmasını istiyorum." #: ..\Client\loader\Dialogs.cpp:717 ..\Client\loader\Utils.cpp:747 @@ -2495,7 +2350,7 @@ msgstr "Dosyalar kopyalanıyor..." #: ..\Client\loader\Dialogs.cpp:746 ..\Client\loader\Utils.cpp:1665 msgid "Copy finished early. Everything OK." -msgstr "Kopyalama işlemi erken bitti. Herşey yolunda." +msgstr "Kopyalama işlemi erken bitti. Her şey yolunda." #: ..\Client\loader\Dialogs.cpp:751 ..\Client\loader\Utils.cpp:1671 msgid "Finishing..." @@ -2507,293 +2362,188 @@ msgstr "Bitti!" #: ..\Client\loader\Install.cpp:92 msgid "Do you want to terminate the MTA Server and continue updating?" -msgstr "" -"MTA Sunucusunu sonlandırmak ve güncellemeye devam etmek istiyor musunuz?" +msgstr "MTA Sunucusunu sonlandırmak ve güncellemeye devam etmek istiyor musunuz?" #: ..\Client\loader\MainFunctions.cpp:241 -msgid "" -"Trouble restarting MTA:SA\n" -"\n" +msgid "Trouble restarting MTA:SA\n\n" "If the problem persists, open Task Manager and\n" -"stop the 'gta_sa.exe' and 'Multi Theft Auto.exe' processes\n" -"\n" -"\n" +"stop the 'gta_sa.exe' and 'Multi Theft Auto.exe' processes\n\n\n" "Try to launch MTA:SA again?" -msgstr "" -"MTA:SA'yı başlatırken sorun\n" -"\n" +msgstr "MTA:SA'yı başlatırken sorun\n\n" "Bu problem tekrar ederse, Görev Yöneticisini açın ve\n" -"'gta_sa.exe' ve 'Multi Theft Auto.exe' işlemlerini durdurun.\n" -"\n" -"\n" +"'gta_sa.exe' ve 'Multi Theft Auto.exe' işlemlerini durdurun.\n\n\n" "MTA:SA'yı tekrar başlatmak istiyor musunuz?" #: ..\Client\loader\MainFunctions.cpp:259 -msgid "" -"Another instance of MTA is already running.\n" -"\n" +msgid "Another instance of MTA is already running.\n\n" "If this problem persists, please restart your computer" -msgstr "" -"MTA zaten çalışıyor.\n" -"\n" +msgstr "Başka bir MTA işlemi zaten çalışıyor.\n\n" "Bu problem devam ederse, lütfen bilgisayarınızı yeniden başlatın" #: ..\Client\loader\MainFunctions.cpp:262 -msgid "" -"Another instance of MTA is already running.\n" -"\n" +msgid "Another instance of MTA is already running.\n\n" "Do you want to terminate it?" -msgstr "" -"Başka bir MTA zaten çalışıyor.\n" -"\n" +msgstr "Başka bir MTA zaten çalışıyor.\n\n" "Durdurmak ister misiniz?" #: ..\Client\loader\MainFunctions.cpp:286 -msgid "" -"Are you having problems running MTA:SA?.\n" -"\n" +msgid "Are you having problems running MTA:SA?.\n\n" "Do you want to revert to an earlier version?" -msgstr "" -"MTA:SA'yı başlatmakta sorun mu yaşıyorsunuz?.\n" -"\n" +msgstr "MTA:SA'yı başlatmakta sorun mu yaşıyorsunuz?.\n\n" "Bir eski sürüme dönmek ister misiniz?" #: ..\Client\loader\MainFunctions.cpp:315 -msgid "" -"There seems to be a problem launching MTA:SA.\n" -"Resetting GTA settings can sometimes fix this problem.\n" -"\n" +msgid "There seems to be a problem launching MTA:SA.\n" +"Resetting GTA settings can sometimes fix this problem.\n\n" "Do you want to reset GTA settings now?" -msgstr "" -"MTA:SA'nın başlatmasında bir problem olduğu görülüyor.\n" -"GTA ayarlarını sıfırlamak bazen bu hatayı düzeltir.\n" -"\n" +msgstr "MTA:SA'nın başlatmasında bir problem olduğu görülüyor.\n" +"GTA ayarlarını sıfırlamak bazen bu hatayı düzeltir.\n\n" "GTA ayarlarını şimdi sıfırlamak ister misiniz?" #: ..\Client\loader\MainFunctions.cpp:330 -msgid "" -"GTA settings have been reset.\n" -"\n" +msgid "GTA settings have been reset.\n\n" "Press OK to continue." -msgstr "" -"GTA ayarları sıfırlandı.\n" -"\n" +msgstr "GTA ayarları sıfırlandı.\n\n" "Devam etmek için Tamam'a basın." #: ..\Client\loader\MainFunctions.cpp:335 -#, c-format, c-format +#, c-format msgid "File could not be deleted: '%s'" msgstr "Dosya silinemedi: '%s'" #. No settings to delete, or can't find them #: ..\Client\loader\MainFunctions.cpp:343 -msgid "" -"Are you having problems running MTA:SA?.\n" -"\n" +msgid "Are you having problems running MTA:SA?.\n\n" "Do you want to see some online help?" -msgstr "" -"MTA:SA'yı çalıştırmakta sorun mu yaşıyorsunuz?\n" -"\n" +msgstr "MTA:SA'yı çalıştırmakta sorun mu yaşıyorsunuz?\n\n" "Çevrimiçi yardım almak ister misiniz?" #. Inform user #: ..\Client\loader\MainFunctions.cpp:379 -msgid "" -"Are you having problems running MTA:SA?.\n" -"\n" +msgid "Are you having problems running MTA:SA?.\n\n" "Do you want to change the following setting?" -msgstr "" -"MTA:SA'yı çalıştırırken sorun mu yaşıyorsunuz?.\n" -"\n" +msgstr "MTA:SA'yı çalıştırırken sorun mu yaşıyorsunuz?.\n\n" "Şu ayarı değiştirmek ister misiniz?" #: ..\Client\loader\MainFunctions.cpp:422 -msgid "" -"Are you having problems running MTA:SA?.\n" -"\n" +msgid "Are you having problems running MTA:SA?.\n\n" "Try disabling the following products for GTA and MTA:" -msgstr "" -"MTA:SA'yı çalıştırırken sorun mu yaşıyorsunuz?.\n" -"\n" +msgstr "MTA:SA'yı çalıştırırken sorun mu yaşıyorsunuz?.\n\n" "Şu programları GTA ve MTA için devre dışı bırakmayı deneyin:" #: ..\Client\loader\MainFunctions.cpp:456 -msgid "" -"WARNING\n" -"\n" +msgid "WARNING\n\n" "MTA:SA has detected unusual activity.\n" -"Please run a virus scan to ensure your system is secure.\n" -"\n" -msgstr "" -"UYARI\n" -"\n" +"Please run a virus scan to ensure your system is secure.\n\n" +msgstr "UYARI\n\n" "MTA:SA alışılmadık bir olay algıladı.\n" -"Lütfen bilgisayarınızın güvenli olduğundan emin olmak için virüs taraması yapın.\n" -"\n" +"Lütfen bilgisayarınızın güvenli olduğundan emin olmak için virüs taraması yapın.\n\n" #: ..\Client\loader\MainFunctions.cpp:459 -#, c-format, c-format +#, c-format msgid "The detected file was: %s\n" -msgstr "Algılanan dosya: %s\n" +msgstr "Algılanan dosya: %s\n" #: ..\Client\loader\MainFunctions.cpp:593 -msgid "" -"An instance of GTA: San Andreas is already running. It needs to be " -"terminated before MTA:SA can be started. Do you want to do that now?" -msgstr "" -"Başka bir GTA:San Andreas işlemi zaten çalışıyor. MTA:SA'nın başlatılması " -"için bu işlemin sonlandırılması gerekiyor. Şu an yapmak ister misiniz?" +msgid "An instance of GTA: San Andreas is already running. It needs to be terminated before MTA:SA can be started. Do you want to do that now?" +msgstr "Başka bir GTA:San Andreas işlemi zaten çalışıyor. MTA:SA'nın başlatılması için bu işlemin sonlandırılması gerekiyor. Şu an yapmak ister misiniz?" #: ..\Client\loader\MainFunctions.cpp:600 -msgid "" -"Unable to terminate GTA: San Andreas. If the problem persists, please " -"restart your computer." -msgstr "" -"GTA:San Andreas'ı sonlandırmak başarısız oldu. Eğer sorun devam ederse, " -"lütfen bilgisayarınızı yeniden başlatın." +msgid "Unable to terminate GTA: San Andreas. If the problem persists, please restart your computer." +msgstr "GTA: San Andreas sonlandırması başarısız oldu. Eğer sorun devam ederse, lütfen bilgisayarınızı yeniden başlatın." #: ..\Client\loader\MainFunctions.cpp:623 -msgid "" -"Registry entries are missing. Please reinstall Multi Theft Auto: San " -"Andreas." -msgstr "" -"Kayıt defteri girdileri eksik. Lütfen Multi Theft Auto: San Andreas'ı " -"denetim masasından silip tekrar yükleyiniz." +msgid "Registry entries are missing. Please reinstall Multi Theft Auto: San Andreas." +msgstr "Kayıt defteri girdileri eksik. Lütfen Multi Theft Auto: San Andreas'ı denetim masasından silip tekrar yükleyiniz." #: ..\Client\loader\MainFunctions.cpp:629 -msgid "" -"The path to your installation of GTA: San Andreas contains unsupported " -"(unicode) characters. Please move your Grand Theft Auto: San Andreas " -"installation to a compatible path that contains only standard ASCII " -"characters and reinstall Multi Theft Auto: San Andreas." -msgstr "" -"GTA: San Andreas yüklemenizin yolu desteklenmeyen (unicode) karakterler " -"içeriyor. Lütfen Grand Theft Auto: San Andreas yüklemenizi sadece uyumlu bir" -" yola, yani sadece standart ASCII karakterleri içeren bir yere taşıyın ve " -"Multi Theft Auto: San Andreas'ı tekrar yükleyin. " +msgid "The path to your installation of GTA: San Andreas contains unsupported (unicode) characters. Please move your Grand Theft Auto: San Andreas installation to a compatible path that contains only standard ASCII characters and reinstall Multi Theft Auto: San Andreas." +msgstr "GTA: San Andreas yüklemenizin yolu desteklenmeyen (unicode) karakterler içeriyor. Lütfen Grand Theft Auto: San Andreas yüklemenizi sadece uyumlu bir yola, yani sadece standart ASCII karakterleri içeren bir yere taşıyın ve Multi Theft Auto: San Andreas'ı tekrar yükleyin. " #: ..\Client\loader\MainFunctions.cpp:639 -msgid "" -"The path to your installation of 'MTA:SA' or 'GTA: San Andreas'\n" -"contains a ';' (semicolon).\n" -"\n" +msgid "The path to your installation of 'MTA:SA' or 'GTA: San Andreas'\n" +"contains a ';' (semicolon).\n\n" " If you experience problems when running MTA:SA,\n" " move your installation(s) to a path that does not contain a semicolon." -msgstr "" -"'MTA:SA' veya 'GTA San Andreas' yüklemenizin yolu\n" -"bir ';' (noktalı virgül) içeriyor.\n" -"\n" +msgstr "'MTA:SA' veya 'GTA San Andreas' yüklemenizin yolu\n" +"bir ';' (noktalı virgül) içeriyor.\n\n" "MTA:SA'yı çalıştırırken sorun yaşıyorsanız,\n" "yükleme(leri)nizi noktalı virgül içermeyen bir yola taşıyın. " #: ..\Client\loader\MainFunctions.cpp:779 -msgid "" -"Load failed. Please ensure that the latest data files have been installed " -"correctly." -msgstr "" -"Yükleme başarısız. Lütfen en yeni veri dosyalarının doğru yüklendiğinden " -"emin olunuz." +msgid "Load failed. Please ensure that the latest data files have been installed correctly." +msgstr "Yükleme başarısız. Lütfen en yeni veri dosyalarının doğru yüklendiğinden emin olunuz." #: ..\Client\loader\MainFunctions.cpp:788 -#, c-format, c-format +#, c-format msgid "Load failed. Please ensure that %s is installed correctly." msgstr "Yükleme başarısız. Lütfen %s doğru yüklendiğinden emin olun." #: ..\Client\loader\MainFunctions.cpp:795 -#, c-format, c-format +#, c-format msgid "Load failed. Could not find gta_sa.exe in %s." msgstr "Yükleme başarısız. gta_sa.exe %s konumunda bulunamadı" #: ..\Client\loader\MainFunctions.cpp:805 -#, c-format, c-format -msgid "" -"Load failed. %s exists in the GTA directory. Please delete before " -"continuing." -msgstr "" -"Yükleme başarısız. GTA klasöründe %s bulunmaktadır. Lütfen devam etmeden " -"önce bunu siliniz." +#, c-format +msgid "Load failed. %s exists in the GTA directory. Please delete before continuing." +msgstr "Yükleme başarısız. GTA klasöründe %s bulunmaktadır. Lütfen devam etmeden önce bunu siliniz." #: ..\Client\loader\MainFunctions.cpp:814 -#, c-format, c-format +#, c-format msgid "Main file has an incorrect name (%s)" msgstr "Ana dosya hatalı isme sahip (%s)" #: ..\Client\loader\MainFunctions.cpp:825 -msgid "" -"Main file is unsigned. Possible virus activity.\n" -"\n" +msgid "Main file is unsigned. Possible virus activity.\n\n" "See online help if MTA does not work correctly." -msgstr "" -"Ana dosya imzalanmamış. Buna bilgisayarınızdaki bir virüs sebep olmuş olabilir.\n" -"\n" +msgstr "Ana dosya imzalanmamış. Buna bilgisayarınızdaki bir virüs sebep olmuş olabilir.\n\n" "Eğer MTA doğru bir biçimde çalışmazsa çevrimiçi yardıma bakın." -#: ..\Client\loader\MainFunctions.cpp:855 -msgid "" -"Data files modified. Possible virus activity.\n" -"\n" +#: ..\Client\loader\MainFunctions.cpp:856 +msgid "Data files modified. Possible virus activity.\n\n" "See online help if MTA does not work correctly." -msgstr "" -"Veri dosyaları değiştirilmiş. Buna bilgisayarınızdaki bir virüs sebep olmuş olabilir.\n" -"\n" +msgstr "Veri dosyaları değiştirilmiş. Buna bilgisayarınızdaki bir virüs sebep olmuş olabilir.\n\n" "Eğer MTA doğru bir biçimde çalıştırılamıyorsa çevrimiçi yardıma bakın." -#: ..\Client\loader\MainFunctions.cpp:867 -msgid "" -".asi files are in the 'MTA:SA' or 'GTA: San Andreas' installation directory.\n" -"\n" +#: ..\Client\loader\MainFunctions.cpp:868 +msgid ".asi files are in the 'MTA:SA' or 'GTA: San Andreas' installation directory.\n\n" "Remove these .asi files if you experience problems with MTA:SA." -msgstr "" -"'MTA:SA' veya 'GTA: San Andreas' klasörlerinde .asi uzantılı dosyalar var.\n" -"\n" +msgstr "'MTA:SA' veya 'GTA: San Andreas' klasörlerinde .asi uzantılı dosyalar var.\n\n" "Eğer MTA:SA ile alakalı bir problemle karşılaşırsanız bu klasörlerden .asi uzantılı dosyalarını silin." -#: ..\Client\loader\MainFunctions.cpp:932 -msgid "" -"File version mismatch error. Reinstall MTA:SA if you experience problems.\n" -msgstr "" -"Dosya sürümü uyumsuzluk hatası. Bir problemle karşılaşırsanız MTA:SA tekrar " -"kurun.\n" +#: ..\Client\loader\MainFunctions.cpp:933 +msgid "File version mismatch error. Reinstall MTA:SA if you experience problems.\n" +msgstr "Dosya sürümü uyumsuzluk hatası. Bir problemle karşılaşırsanız MTA:SA'yı tekrar kurun.\n" -#: ..\Client\loader\MainFunctions.cpp:941 +#: ..\Client\loader\MainFunctions.cpp:942 msgid "Some files are missing. Reinstall MTA:SA if you experience problems.\n" -msgstr "" -"Bazı dosyalar eksik. Bir problemle karşılaşırsanız MTA:SA'yı tekrar kurun.\n" +msgstr "Bazı dosyalar eksik. Bir problemle karşılaşırsanız MTA:SA'yı tekrar kurun.\n" -#: ..\Client\loader\MainFunctions.cpp:953 -msgid "" -"MTA:SA is not compatible with Windows 'Safe Mode'.\n" -"\n" +#: ..\Client\loader\MainFunctions.cpp:954 +msgid "MTA:SA is not compatible with Windows 'Safe Mode'.\n\n" "Please restart your PC.\n" -msgstr "" -"MTA:SA Windows 'Güvenli Mod' ile uyumlu değildir.\n" -"\n" +msgstr "MTA:SA Windows 'Güvenli Mod' ile uyumlu değildir.\n\n" "Lütfen bilgisayarınızı yeniden başlatın.\n" -#: ..\Client\loader\MainFunctions.cpp:1089 +#: ..\Client\loader\MainFunctions.cpp:1090 msgid "Fix configuration issue" msgstr "Kurulum hatasını düzelt" #. Try to relaunch as admin if not done so already -#: ..\Client\loader\MainFunctions.cpp:1131 +#: ..\Client\loader\MainFunctions.cpp:1132 msgid "Fix elevation required error" msgstr "Yükseltme gerektiren hatayı düzelt" -#: ..\Client\loader\MainFunctions.cpp:1138 -#, c-format, c-format -msgid "" -"Could not start Grand Theft Auto: San Andreas. Please try restarting, or if the problem persists,contact MTA at www.multitheftauto.com. \n" -"\n" +#: ..\Client\loader\MainFunctions.cpp:1139 +#, c-format +msgid "Could not start Grand Theft Auto: San Andreas. Please try restarting, or if the problem persists,contact MTA at www.multitheftauto.com. \n\n" "[%s]" -msgstr "" -"Grand Theft Auto: San Andreas başlatılamadı. Lütfen tekrar deneyiniz, yada sorun devam ederse, lütfen www.multitheftauto.com adresinden MTA ile iletişime geçiniz. \n" -"\n" +msgstr "Grand Theft Auto: San Andreas başlatılamadı. Lütfen tekrar deneyiniz, ya da sorun devam ederse, lütfen www.multitheftauto.com adresinden MTA ile iletişime geçiniz. \n\n" "[%s]" -#: ..\Client\loader\MainFunctions.cpp:1203 -msgid "" -"GTA: San Andreas may not have launched correctly. Do you want to terminate " -"it?" +#: ..\Client\loader\MainFunctions.cpp:1204 +msgid "GTA: San Andreas may not have launched correctly. Do you want to terminate it?" msgstr "Gta: San Andreas doğru çalıştıralamadı. Yok etmek istermisiniz ?" #: ..\Client\loader\Utils.cpp:813 @@ -2801,47 +2551,41 @@ msgid "Select your Grand Theft Auto: San Andreas Installation Directory" msgstr "Grand Theft Auto: San Andreas yükleme adresinizi seçiniz." #: ..\Client\loader\Utils.cpp:1283 -#, c-format, c-format +#, c-format msgid "Error loading %s module! (%s)" msgstr "%s modülünü yüklemede hata! (%s)" #: ..\Client\loader\Utils.cpp:1713 -#, c-format, c-format -msgid "" -"New installation of %s detected.\n" -"\n" +#, c-format +msgid "New installation of %s detected.\n\n" "Do you want to copy your settings from %s ?" -msgstr "" -"%s yeni kurulumu algılanı.\n" -"\n" -"%s den ayarlarınızı kopyalamak ister misiniz?" +msgstr "Yeni %s kurulumu algılandı.\n\n" +"%s ayarlarınızı kopyalamak ister misiniz?" #: ..\Client\loader\Utils.cpp:1752 -#, c-format, c-format +#, c-format msgid "GTA:SA had trouble opening the file '%s'" msgstr "GTA:SA '%s' dosyasını açmakta sorun yaşadı" #: ..\Client\loader\Utils.cpp:1774 -#, c-format, c-format +#, c-format msgid "GTA:SA is missing the file '%s'." -msgstr "GTA:SA dosyası kayıp '%s'." +msgstr "GTA:SA '%s' dosyası kayıp." #: ..\Client\loader\Utils.cpp:1799 msgid "GTA:SA had trouble loading a model." -msgstr "GTA:SA model yüklerken sorunla karşılaştı." +msgstr "GTA:SA bir modeli yüklerken sorunla karşılaştı." #: ..\Client\loader\Utils.cpp:1801 msgid "If you recently modified gta3.img, then try reinstalling GTA:SA." -msgstr "" -"Eğer yakın zamanda gta3.img dosyasını değiştirdiyseniz, GTA:SA'yı tekrar " -"yüklemeyi deneyin." +msgstr "Eğer yakın zamanda gta3.img dosyasını değiştirdiyseniz, GTA:SA'yı tekrar yüklemeyi deneyin." #: ..\Client\loader\Utils.cpp:1826 msgid "GTA:SA had trouble adding an upgrade to a vehicle." msgstr "GTA:SA arabaya modifiye eklerken sorunla karşılaştı." #: ..\Client\loader\Utils.cpp:1845 -#, c-format, c-format +#, c-format msgid "GTA:SA found errors in the file '%s'" msgstr "GTA:SA '%s' dosyasında hatalar buldu" @@ -2851,15 +2595,15 @@ msgstr "MTA:SA oynarken bilgisayar yeniden başlatıldı mı?" #: ..\Client\loader\Utils.cpp:1983 msgid "Please terminate the following programs before continuing:" -msgstr "Lütfen devam etmeden önce gerekli programları sonlandırınız:" +msgstr "Lütfen devam etmeden önce şu programları sonlandırınız:" #: ..\Client\mods\deathmatch\CClient.cpp:36 msgid "This version has expired." -msgstr "bu versiyon zaman aşımına uğradı" +msgstr "Bu versiyon zaman aşımına uğradı." #: ..\Client\mods\deathmatch\CClient.cpp:56 msgid "disconnect from the game" -msgstr "Oyundun ayrılma" +msgstr "oyundan ayrıl" #: ..\Client\mods\deathmatch\CClient.cpp:57 msgid "shows the nametags" @@ -2867,7 +2611,7 @@ msgstr "isim etikletlerini göster" #: ..\Client\mods\deathmatch\CClient.cpp:58 msgid "shows the chatbox" -msgstr "konuşma kutusunda göster" +msgstr "konuşma kutusunu göster" #: ..\Client\mods\deathmatch\CClient.cpp:59 msgid "shows the network statistics" @@ -2884,11 +2628,11 @@ msgstr "sesi diğer oyunculara iletir" #: ..\Client\mods\deathmatch\CClient.cpp:65 msgid "enters a car as passenger" -msgstr "Bir araca yolcu olarak bin" +msgstr "bir araca yolcu olarak biner" #: ..\Client\mods\deathmatch\CClient.cpp:66 msgid "next radio channel" -msgstr "sonraki radio kanalı" +msgstr "sonraki radyo kanalı" #: ..\Client\mods\deathmatch\CClient.cpp:67 msgid "previous radio channel" @@ -2900,7 +2644,7 @@ msgstr "radar bakışını aktif eder" #: ..\Client\mods\deathmatch\CClient.cpp:69 msgid "zooms the radar in" -msgstr "radarı içeri zumlar" +msgstr "radarı yakınlaştırır" #: ..\Client\mods\deathmatch\CClient.cpp:70 msgid "zooms the radar out" @@ -2928,11 +2672,11 @@ msgstr "radarı ekler" #: ..\Client\mods\deathmatch\CClient.cpp:76 msgid "reduces radar opacity" -msgstr "radarın donukluğunu düşürür" +msgstr "radarın opaklığını düşürür" #: ..\Client\mods\deathmatch\CClient.cpp:77 msgid "increases radar opacity" -msgstr "radarın donukluğunu arttırır" +msgstr "radarın opaklığını arttırır" #: ..\Client\mods\deathmatch\CClient.cpp:78 msgid "toggles radar help text" @@ -2966,71 +2710,65 @@ msgstr "(Geliştirme Modu) colshapeleri gösterir" #: ..\Client\mods\deathmatch\CClient.cpp:93 msgid "(Development mode) prints world sound ids into the debug window" -msgstr "(Geliştirme Modu) colshapeleri gösterir" +msgstr "(Geliştirme Modu) dünya seslerinin id'lerini debug ekranına yollar" -#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:583 +#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:584 msgid "Entering the game ..." -msgstr "" -"(Geliştirme modu) dünya seslerinin idlerini bir debug penceresine yazdırır" +msgstr "Oyuna giriliyor ..." -#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:641 -msgid "" -"Not connected; please use Quick Connect or the 'connect' command to connect " -"to a server." -msgstr "" -"Bağlanmadı; lütfen Hızlı Bağlan veya 'bağlan' komutunu kullanın ve bir " -"sunucuya bağlanın." +#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:642 +msgid "Not connected; please use Quick Connect or the 'connect' command to connect to a server." +msgstr "Bağlanmadı; lütfen Hızlı Bağlan veya 'connect' komutunu kullanın ve bir sunucuya bağlanın." -#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:687 +#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:688 msgid "The server is not installed" msgstr "Sunucu kurulmadı." -#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:697 -#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:1072 +#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:698 +#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:1073 msgid "Local Server" msgstr "Yerel Sunucu" -#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:697 +#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:698 msgid "Starting local server ..." msgstr "Yerel sunucu başlatılıyor ..." -#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:1003 -#, c-format, c-format +#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:1004 +#, c-format msgid "You were kicked from the game ( %s )" -msgstr "Oyundan atıldınız (%s)" +msgstr "Oyundan atıldınız ( %s )" -#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:1072 +#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:1073 msgid "Connecting to local server..." msgstr "Yerel sunucuya bağlanılıyor..." -#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:1083 +#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:1084 msgid "Error connecting to server." -msgstr "Sununcuya bağlanırken hata." +msgstr "Sunucuya bağlanırken hata." -#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:1093 +#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:1094 msgid "Connecting to local server timed out. See console for details." -msgstr "" -"Yerel sunucuya bağlantı zaman aşımına uğradı. Detaylar için konsola bakınız." +msgstr "Yerel sunucuya bağlantı zaman aşımına uğradı. Detaylar için konsola bakınız." -#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:1196 +#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:1197 msgid "Connection with the server was lost" msgstr "Sunucuyla bağlantı koptu." -#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:1223 +#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:1224 msgid "Disconnected: the server is currently full" -msgstr "Bağlantı Kesildi: sunucu şu an dolu" +msgstr "Bağlantı Kesildi: sunucu dolu" -#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:1235 +#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:1236 msgid "Disconnected: invalid password specified" msgstr "Bağlantı Kesildi: yanlış şifre girildi" -#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:1257 +#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:1258 msgid "MTA Client verification failed!" -msgstr "MTA müşteri doğrulaması yapılamadı!" +msgstr "MTA İstemci doğrulaması yapılamadı!" #: ..\Client\mods\deathmatch\logic\CLocalServer.cpp:37 msgid "HOST GAME" -msgstr "Ev Sunucusu" +msgstr "SUNUCU KUR" #. m_pTabs->CreateTab ( "Gamemode" ); #: ..\Client\mods\deathmatch\logic\CLocalServer.cpp:53 @@ -3040,7 +2778,7 @@ msgstr "Kaynaklar" #: ..\Client\mods\deathmatch\logic\CLocalServer.cpp:55 #: ..\Client\mods\deathmatch\logic\CLocalServer.cpp:57 msgid "Server name:" -msgstr "Sunucu adı" +msgstr "Sunucu adı:" #: ..\Client\mods\deathmatch\logic\CLocalServer.cpp:64 #: ..\Client\mods\deathmatch\logic\CLocalServer.cpp:66 @@ -3050,12 +2788,12 @@ msgstr "Parola:" #: ..\Client\mods\deathmatch\logic\CLocalServer.cpp:73 #: ..\Client\mods\deathmatch\logic\CLocalServer.cpp:75 msgid "Max players:" -msgstr "En fazla oyuncu:" +msgstr "Oyuncu limiti:" #: ..\Client\mods\deathmatch\logic\CLocalServer.cpp:82 #: ..\Client\mods\deathmatch\logic\CLocalServer.cpp:84 msgid "Broadcast:" -msgstr "Yayın:" +msgstr "Yayınla:" #: ..\Client\mods\deathmatch\logic\CLocalServer.cpp:86 msgid "LAN" @@ -3073,218 +2811,205 @@ msgstr "Tüm" msgid "Start" msgstr "Başlat" -#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:480 +#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:475 msgid "Disconnected: Invalid nickname" -msgstr "Bağlantı Kesildi: Geçersiz takma ad" +msgstr "Bağlantı Kesildi: Geçersiz nick" -#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:484 +#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:479 msgid "Disconnect from server" msgstr "Sunucu bağlantısını sonlandır" -#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:488 -#, c-format, c-format -msgid "" -"Disconnected: Serial is banned.\n" +#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:483 +#, c-format +msgid "Disconnected: Serial is banned.\n" "Reason: %s" -msgstr "" -"Bağlantı kesildi. Seri kodu yasaklandı.\n" +msgstr "Bağlantı kesildi. Seri kodu yasaklandı.\n" "Gerekçe: %s" -#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:494 -#, c-format, c-format -msgid "" -"Disconnected: You are banned.\n" +#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:489 +#, c-format +msgid "Disconnected: You are banned.\n" "Reason: %s" -msgstr "" -"Bağlantı kesildi: Yasaklandınız.\n" +msgstr "Bağlantı kesildi: Yasaklandınız.\n" "Gerekçe: %s" -#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:500 -#, c-format, c-format -msgid "" -"Disconnected: Account is banned.\n" +#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:495 +#, c-format +msgid "Disconnected: Account is banned.\n" "Reason: %s" -msgstr "" -"Bağlantı kesildi: Hesap yasaklandı.\n" +msgstr "Bağlantı kesildi: Hesap yasaklandı.\n" "Gerekçe: %s" -#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:505 +#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:500 msgid "Disconnected: Version mismatch" msgstr "Bağlantı kesildi: Sürüm uyumsuzluğu" -#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:509 +#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:504 msgid "Disconnected: Join flood. Please wait a minute, then reconnect." -msgstr "" -"Bağlantı kesildi; Flood'a katıl. Lütfen bir dakika bekleyin, ve tekrar " -"bağlanın. " +msgstr "Bağlantı kesildi: Giriş trafiği. Lütfen bir dakika bekleyin, ardından tekrar bağlanın." + +#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:508 +#, c-format +msgid "Disconnected: Server from different branch.\n" +"Information: %s" +msgstr "Bağlantı kesildi: Server farklı branştan.\n" +"Bilgi: %s" #: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:513 -#, c-format, c-format -msgid "" -"Disconnected: Server from different branch.\n" +#, c-format +msgid "Disconnected: Bad version.\n" "Information: %s" -msgstr "" -"Bağlantı kesildi: Server farklı branştan.\n" +msgstr "Bağlantı kesildi: Kötü versiyon.\n" "Bilgi: %s" #: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:518 -#, c-format, c-format -msgid "" -"Disconnected: Bad version.\n" +#, c-format +msgid "Disconnected: Server is running a newer build.\n" "Information: %s" -msgstr "" -"Bağlantı kesildi: Kötü versiyon.\n" +msgstr "Bağlantı kesildi: Sunucu daha yeni bir versiyonda çalışıyor.\n" "Bilgi: %s" #: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:523 -#, c-format, c-format -msgid "" -"Disconnected: Server is running a newer build.\n" +#, c-format +msgid "Disconnected: Server is running an older build.\n" "Information: %s" -msgstr "" -"Bağlantı kesildi: Sunucu daha yeni bir yapı çalıştırıyor.\n" +msgstr "Bağlantı kesildi: Sunucu daha eski bir versiyonda çalışıyor.\n" "Bilgi: %s" #: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:528 -#, c-format, c-format -msgid "" -"Disconnected: Server is running an older build.\n" -"Information: %s" -msgstr "" -"Bağlantı kesildi: Sunucu daha eski bir yapı çalıştırıyor.\n" -"Bilgi: %s" - -#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:533 msgid "Disconnected: Nick already in use" -msgstr "Bağlantı kesildi: Takma ad zaten kullanılıyor" +msgstr "Bağlantı kesildi: Nick zaten kullanılıyor" -#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:537 -#, fuzzy +#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:532 msgid "Disconnected: Player element could not be created." -msgstr "Bağlantı kesildi: Oyuncu Elementi Oluşturulamadı. " +msgstr "Bağlantı kesildi: Oyuncu elementi yaratılamadı." -#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:541 -#, c-format, c-format +#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:536 +#, c-format msgid "Disconnected: Server refused the connection: %s" -msgstr "Bağlantı kesildi: Server bağlantıyı geri çevirdi: %s" +msgstr "Bağlantı kesildi: Sunucu bağlantıyı reddetti: %s" -#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:546 +#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:541 msgid "Disconnected: Serial verification failed" msgstr "Bağlantı kesildi: Seri kod doğrulaması başarısız oldu" -#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:550 -#, c-format, c-format +#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:545 +#, c-format msgid "Disconnected: Connection desync %s" -msgstr "Bağlantı kesildi: Bağlantı desenkronize %s" +msgstr "Bağlantı kesildi: Bağlantı desenkronize oldu %s" -#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:559 -#, c-format, c-format +#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:554 +#, c-format msgid "Disconnected: You were kicked by %s" msgstr "Bağlantı kesildi: %s tarafından atıldınız." -#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:564 -#, c-format, c-format +#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:559 +#, c-format msgid "Disconnected: You were banned by %s" msgstr "Bağlantı kesildi: %s tarafından yasaklandınız." -#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:575 +#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:570 msgid "Disconnected: Server shutdown or restarting" msgstr "Bağlantı Koptu: Server kapatıldı veya yeniden başlatılıyor" -#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:595 +#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:590 msgid "You were kicked from the game" msgstr "Oyundan atıldınız" -#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:596 -#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:607 +#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:591 +#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:602 msgid "This server requires a non-modifed gta_sa.exe" -msgstr "" +msgstr "Bu sunucu değiştirilmemiş bir gta_sa.exe dosyasına ihtiyaç duyuyor" -#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:597 -#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:608 +#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:592 +#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:603 msgid "Please replace gta_sa.exe" -msgstr "" +msgstr "Lütfen gta_sa.exe dosyasını değiştirin" -#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:598 +#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:593 msgid "This server does not allow custom D3D9.DLLs" -msgstr "" +msgstr "Bu sunucu özelleştirilmiş D3D9.DLL dosyalarına izin vermiyor" -#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:599 +#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:594 msgid "Remove D3D9.DLL from your GTA install directory and restart MTA" -msgstr "" +msgstr "D3D9.DLL dosyasını GTA yükleme dizininden kaldırın ve MTA'yı yeniden başlatın" -#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:600 +#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:595 msgid "This server does not allow virtual machines" -msgstr "" +msgstr "Bu sunucu sanal bilgisayarlara izin vermiyor" -#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:601 +#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:596 msgid "This server requires driver signing to be enabled" -msgstr "" +msgstr "Bu sunucu, sürücü imzalamasına izin verilmiş olmasını gerektiriyor" -#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:602 +#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:597 msgid "Please restart your PC" -msgstr "" +msgstr "Lütfen bilgisayarınızı yeniden başlatın" -#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:603 +#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:598 msgid "This server has detected missing anti-cheat components" -msgstr "" +msgstr "Bu sunucu, eksik anti-hile bileşenleri algıladı" -#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:604 +#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:599 msgid "Try restarting MTA" -msgstr "" +msgstr "MTA'yı yeniden başlatmayı deneyin" -#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:605 +#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:600 msgid "This server requires a non-modifed gta3.img and gta_int.img" -msgstr "" +msgstr "Bu sunucu değiştirilmemiş gta3.img ve gta_int.img dosyalarına ihtiyaç duyuyor" -#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:606 +#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:601 msgid "Please replace gta3.img or gta_int.img" -msgstr "" +msgstr "Lütfen gta3.img ve gta_int.img dosyalarının yerini seçin" -#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:609 +#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:604 msgid "This server does not allow Wine" -msgstr "" +msgstr "Bu sunucu Wine ile girişlere izin vermiyor" -#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:610 +#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:605 msgid "Ensure no other program is modifying MTA:SA" -msgstr "" +msgstr "Farklı bir programın MTA:SA'yı değiştirmediğinden emin olun" -#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:624 +#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:619 msgid "Time Remaining: " msgstr "Kalan Süre:" -#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:634 -#, c-format, c-format +#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:629 +#, c-format msgid "%d day" msgid_plural "%d days" msgstr[0] "%d gün" +msgstr[1] "%d gün" -#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:636 -#, c-format, c-format +#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:631 +#, c-format msgid "%d hour" msgid_plural "%d hours" msgstr[0] "%d saat" +msgstr[1] "%d saat" -#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:638 -#, c-format, c-format +#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:633 +#, c-format msgid "%d minute" msgid_plural "%d minutes" msgstr[0] "%d dakika" +msgstr[1] "%d dakika" -#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:640 -#, c-format, c-format +#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:635 +#, c-format msgid "%d second" msgid_plural "%d seconds" msgstr[0] "%d saniye" +msgstr[1] "%d saniye" #. Display the error -#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:644 +#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:639 msgid "Disconnected" msgstr "Bağlantı kesildi" #. Throw the error and disconnect #: ..\Client\mods\deathmatch\logic\CResourceFileDownloadManager.cpp:141 -#, c-format, c-format +#, c-format msgid "Download error: %s" msgstr "İndirme hatası: %s" @@ -3293,7 +3018,7 @@ msgid "Could not start the local server. See console for details." msgstr "Yerel sunucu başlatılamadı. Ayrıntılar için konsola bakın. " #: ..\Client\mods\deathmatch\logic\CServer.cpp:182 -#, c-format, c-format +#, c-format msgid "Error: Could not start local server. [%s]" msgstr "Hata: Yerel sunucu başlatılamadı. [%s]" @@ -3308,7 +3033,7 @@ msgstr "İndirme Süreci: " #. Find our largest piece of text, so we can size accordingly #: ..\Client\mods\deathmatch\logic\CTransferBox.cpp:42 #: ..\Client\mods\deathmatch\logic\CTransferBox.cpp:105 -#, c-format, c-format +#, c-format msgid "%s of %s" msgstr "%s'nin %s'i" @@ -3324,26 +3049,18 @@ msgstr "Grafik sürücüsü ile problem" #. Populate the message and show the box #: ..\Shared\mods\deathmatch\logic\Utils.cpp:100 -#, c-format, c-format -msgid "" -"Fatal error (%u). If this problem persists, please check out mtasa.com for " -"support." -msgstr "" -"Ölümcül hata (%u). Eğer bu problem devam ederse, lütfen destek için " -"mtasa.com'u kontol edin. " +#, c-format +msgid "Fatal error (%u). If this problem persists, please check out mtasa.com for support." +msgstr "Ölümcül hata (%u). Eğer bu problem devam ederse, lütfen destek için mtasa.com'a göz atın." #. #ifdef MTA_DEBUG #. assert ( 0 ); #. #endif #. Populate the message and show the box #: ..\Shared\mods\deathmatch\logic\Utils.cpp:116 -#, c-format, c-format -msgid "" -"Protocol error (%u). If this problem persists, please check out mtasa.com " -"for support." -msgstr "" -"Protokol hatası (%u). Eğer bu problem devam ederse, lütfen destek için " -"mtasa.com'a göz atın." +#, c-format +msgid "Protocol error (%u). If this problem persists, please check out mtasa.com for support." +msgstr "Protokol hatası (%u). Eğer bu problem devam ederse, lütfen destek için mtasa.com'a göz atın." #: ..\Shared\mods\deathmatch\logic\Utils.cpp:118 msgid "Connection error" @@ -3354,186 +3071,8 @@ msgid "Multi Theft Auto has not been installed properly, please reinstall." msgstr "Multi Theft Auto düzgün yüklenmemiş, lütfen tekrar yükleyin." #: ..\Shared\sdk\SharedUtil.Misc.hpp:710 -msgid "" -"Your browser will now display a web page with some help infomation.\n" -"\n" +msgid "Your browser will now display a web page with some help infomation.\n\n" "(If the page fails to load, paste (CTRL-V) the URL into your web browser)" -msgstr "" -"Tarayıcınız biraz yardım bilgisi bulunduran bir sayfa açacak.\n" -"\n" -"(Sayfa hata verip yüklenmez ise, tarayıcınıza URL'yi yapıştırın (CTRL-V))." - -#~ msgid "" -#~ "This server is blocking your customized GTA:SA files.\n" -#~ "\n" -#~ "To join this server please uncheck:\n" -#~ "Settings->Multiplayer->Use customized GTA:SA files" -#~ msgstr "" -#~ "Bu sunucu modifiye edilmiş GTA:SA dosyalarına izin vermiyor.\n" -#~ "\n" -#~ "Bu sunucuya girmek için lütfen şuradaki işareti kaldırın:\n" -#~ "Ayarlar > Çok oyunculu > Modifiye edilmiş GTA San Andreas dosyalarını kullan." +msgstr "Tarayıcınız yardım bilgisi bulunduran bir sayfa açacak.\n\n" +"(Sayfa hata verip yüklenmez ise, URL'yi tarayıcınıza yapıştırın(CTRL+V))" -#~ msgid "" -#~ "It appears you have a Steam version of GTA:SA, which is currently " -#~ "incompatible with MTASA. You are now being redirected to a page where you " -#~ "can find information to resolve this issue." -#~ msgstr "" -#~ "Sizde GTA:SA'nın Steam versiyonu var gibi gözüküyor, bu MTASA ile " -#~ "uyumsuzdur. Şimdi bu sorunu çözmek için bilgi alabileceğiniz sayfaya " -#~ "yönlendiriliyorsunuz." - -#~ msgid "Disconnected: Player Element Could not be created." -#~ msgstr "Bağlantı kesildi: Oyuncu Elementi Oluşturulamadı. " - -#~ msgid "No host specified!" -#~ msgstr "Hiç makine adı belirtilmemiş!" - -#~ msgid "No port specified!" -#~ msgstr "port belirtilmedi!" - -#~ msgid "Invalid port specified!" -#~ msgstr "Geçersiz port " - -#~ msgid "connect: Syntax is 'connect [ ]'" -#~ msgstr "" -#~ "bağlan (/connect): Sözdizimi 'connect [ " -#~ "<şifre>]'" - -#~ msgid "Copyright (C) 2003 - 2018 Multi Theft Auto" -#~ msgstr "Tüm Hakları (C) 2003-2018 Multi Theft Auto' ya aittir" - -#~ msgid "Services currently unavailable" -#~ msgstr "Servis bulunamıyor" - -#~ msgid "Login Error" -#~ msgstr "Giriş hatası" - -#~ msgid "Invalid username/password" -#~ msgstr "Geçersiz kullanıcı adı/Şifre" - -#~ msgid "Success" -#~ msgstr "Başarılı" - -#~ msgid "Successfully registered!" -#~ msgstr "Başarı ile kayıt oldunuz" - -#~ msgid "Username missing" -#~ msgstr "Takma ad eksik." - -#~ msgid "Email missing" -#~ msgstr "Mail adresiniz eksik" - -#~ msgid "Password missing" -#~ msgstr "Parola eksik" - -#~ msgid "Passwords do not match" -#~ msgstr "Parolalar birbirini tutmuyor" - -#~ msgid "Validation code missing" -#~ msgstr "Onay kodu eksik" - -#, fuzzy -#~ msgid "Copyright (C) 2003 - 2015 Multi Theft Auto" -#~ msgstr "Tüm Hakları (C) 2003-2014 Multi Theft Auto ya aittir" - -#~ msgid "Community" -#~ msgstr "Topluluk" - -#~ msgid "Username:" -#~ msgstr "Kullanıcı adı:" - -#~ msgid "Login" -#~ msgstr "Oturum Aç:" - -#~ msgid "Register" -#~ msgstr "Kayıt ol" - -#~ msgid "Chat BG" -#~ msgstr "sohbet BG" - -#~ msgid "Input BG" -#~ msgstr "Giriş BG" - -#~ msgid "Font:" -#~ msgstr "Yazı tipi" - -#~ msgid "Logging in..." -#~ msgstr "Giriş yapılıyor..." - -#~ msgid "Logout" -#~ msgstr "Çıkış yap" - -#~ msgid "Copyright (C) 2003 - 2014 Multi Theft Auto" -#~ msgstr "Tüm Hakları (C) 2003-2014 Multi Theft Auto ya aittir" - -#~ msgid "Disable Aero Desktop" -#~ msgstr "Aero Masaüstünü Devre Dışı Bırak" - -#~ msgid "Disable Driver Overrides" -#~ msgstr "Sürücü engellemelerini devredışı bırak" - -#~ msgid "Experimental feature." -#~ msgstr "Deneysel özellik." - -#~ msgid "DATA FILES" -#~ msgstr "veri dosyaları" - -#~ msgid "" -#~ "Data files not currently avalable.\n" -#~ "\n" -#~ "Please check www.mtasa.com" -#~ msgstr "" -#~ "Veri dosyaları şu an mevcut değil.\n" -#~ "\n" -#~ "Lütfen www.mtasa.com'a bakınız." - -#~ msgid "Slow" -#~ msgstr "Yavaş" - -#~ msgid "General " -#~ msgstr "Genel" - -#~ msgid "Copyright (C) 2003 - 2013 Multi Theft Auto" -#~ msgstr "Tüm Hakları (C) 2003-2013 Multi Theft Auto ya aittir" - -#~ msgid "Resolution" -#~ msgstr "Çözünürlük:" - -#~ msgid " and " -#~ msgstr "ve" - -#~ msgid "Anti-aliasing" -#~ msgstr "Yumuşatma" - -#~ msgid "Aero setting" -#~ msgstr "aero ayarları" - -#, c-format -#~ msgid "%s will be changed when you next start MTA" -#~ msgstr "%s bir daha MTA başlattığında değişmiş olacak" - -#~ msgid "/Full Screen Minimize" -#~ msgstr "/Tam Ekran Küçültme" - -#~ msgid "Customized GTA:SA files setting" -#~ msgstr "özel GTA:SA dosya ayarı" - -#~ msgid "Language setting" -#~ msgstr "Dil ayarları" - -#~ msgid "Some settings" -#~ msgstr "bazı ayarlar" - -#~ msgid "Error! (CTRL+C to copy)" -#~ msgstr "HATA! (CTRL+C kopyalama)" - -#, c-format -#~ msgid "" -#~ "GTA:SA had trouble opening the file '%s'\n" -#~ "\n" -#~ "Try reinstalling GTA:SA to fix it" -#~ msgstr "" -#~ "GTA:SA %s dosyasını açmakta problem yaşadı.\n" -#~ "\n" -#~ "Onarmak için GTA:SA yı tekrar yüklemeyi deneyin." From a0559c4e07c9ee211da236eb9052e7282d5326b0 Mon Sep 17 00:00:00 2001 From: patrikjuvonen <22572159+patrikjuvonen@users.noreply.github.com> Date: Tue, 15 Feb 2022 23:24:09 +0200 Subject: [PATCH 15/49] Fix #2542: Add note about account requirement --- .github/SECURITY.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/SECURITY.md b/.github/SECURITY.md index f4c0b13b77..156529be73 100644 --- a/.github/SECURITY.md +++ b/.github/SECURITY.md @@ -3,7 +3,7 @@ Before disclosing a cheat or security vulnerability, please do not try and check that they work as they could either result in you getting globally banned or infected by a virus. -Please submit your security vulnerabilities and cheats to our [private bugtracker]. +Please submit your security vulnerabilities and cheats to our [private bugtracker]. Our private bugtracker requires a forum account. Please do not submit vulnerabilities and cheats publicly, on GitHub or anywhere else. From 387264965de22bd3a14d22ea2b1bea2f585a9fb0 Mon Sep 17 00:00:00 2001 From: patrikjuvonen <22572159+patrikjuvonen@users.noreply.github.com> Date: Thu, 17 Feb 2022 20:14:51 +0200 Subject: [PATCH 16/49] Update CEF from 97.1.6+g8961cdb+chromium-97.0.4692.99 to 98.1.21+g9782362+chromium-98.0.4758.102 --- utils/buildactions/install_cef.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/utils/buildactions/install_cef.lua b/utils/buildactions/install_cef.lua index a8922a517c..fa957e61f7 100644 --- a/utils/buildactions/install_cef.lua +++ b/utils/buildactions/install_cef.lua @@ -9,8 +9,8 @@ local CEF_URL_PREFIX = "https://cef-builds.spotifycdn.com/cef_binary_" local CEF_URL_SUFFIX = "_windows32_minimal.tar.bz2" -- Change here to update CEF version -local CEF_VERSION = "97.1.6+g8961cdb+chromium-97.0.4692.99" -local CEF_HASH = "3540c9c6cf80967b66a1884ec097f2d3f9020ccf262fe2498d118cec747a81c2" +local CEF_VERSION = "98.1.21+g9782362+chromium-98.0.4758.102" +local CEF_HASH = "e5c0aadf0620262dfd6a91022bb91b286134aa91ca0a46ed68ffd147d77267b0" function make_cef_download_url() return CEF_URL_PREFIX..http.escapeUrlParam(CEF_VERSION)..CEF_URL_SUFFIX From 61ec1db4125446fddf3811cc6bd586f75f231ac0 Mon Sep 17 00:00:00 2001 From: Dutchman101 Date: Fri, 18 Feb 2022 21:08:25 +0100 Subject: [PATCH 17/49] Visual Studio Update VS2022: 17.0.32112.339 => 17.1.32210.238 Manual commit to keep track, because the bot failed to do it this time --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b9a5ffa429..3c8477b0c8 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ [![Build Status](https://github.com/multitheftauto/mtasa-blue/workflows/Build/badge.svg?event=push&branch=master)](https://github.com/multitheftauto/mtasa-blue/actions?query=branch%3Amaster+event%3Apush) [![Unique servers online](https://img.shields.io/endpoint?url=https%3A%2F%2Fmtasa.com%2Fapi%2Fservers-shields.io.json)](https://community.multitheftauto.com/index.php?p=servers) [![Unique players online](https://img.shields.io/endpoint?url=https%3A%2F%2Fmtasa.com%2Fapi%2Fplayers-shields.io.json)](https://multitheftauto.com) [![Unique players last 24 hours](https://img.shields.io/endpoint?url=https%3A%2F%2Fmtasa.com%2Fapi%2Funique-players-shields.io.json)](https://multitheftauto.com) [![Discord](https://img.shields.io/discord/278474088903606273?label=discord&logo=discord)](https://multitheftauto.com/discord) [![Crowdin](https://badges.crowdin.net/e/f5dba7b9aa6594139af737c85d81d3aa/localized.svg)](https://multitheftauto.crowdin.com/multitheftauto) -[Multi Theft Auto](https://www.multitheftauto.com/) (MTA) is a software project that adds network play functionality to Rockstar North's Grand Theft Auto game series, in which this functionality is not originally found. It is a unique modification that incorporates an extendable network play element into a proprietary commercial single-player PC game. +[Multi Theft Auto](https://www.multitheftauto.com/) (MTA) is a software project that adds network play functionality to Rockstar North's Grand Theft Auto game series, in which this functionality is not originally found. It is a unique modification that incorporates an extendable network play element into a proprietary commercial single-player PC game. ## Introduction From 671a5f83b7e19d952439bec0251ec53dd5978058 Mon Sep 17 00:00:00 2001 From: Dutchman101 Date: Fri, 18 Feb 2022 21:14:07 +0100 Subject: [PATCH 18/49] Update launchers --- Client/launch/launch.rc | 2 +- Shared/data/launchers/CEFLauncher.exe | Bin 86096 -> 86096 bytes Shared/data/launchers/MTA Server.exe | Bin 292944 -> 336464 bytes Shared/data/launchers/MTA Server64.exe | Bin 348240 -> 390736 bytes Shared/data/launchers/Multi Theft Auto.exe | Bin 404560 -> 405584 bytes Shared/data/launchers/wow64_helper.exe | Bin 242256 -> 243280 bytes 6 files changed, 1 insertion(+), 1 deletion(-) diff --git a/Client/launch/launch.rc b/Client/launch/launch.rc index a5a83dcb73..e7ec2bb66d 100644 --- a/Client/launch/launch.rc +++ b/Client/launch/launch.rc @@ -90,7 +90,7 @@ BEGIN VALUE "CompanyName", "Multi Theft Auto" VALUE "FileDescription", "Multi Theft Auto Launcher" VALUE "FileVersion", "1.5.9.0" - VALUE "LegalCopyright", "(C) 2003 - 2021 Multi Theft Auto" + VALUE "LegalCopyright", "(C) 2003 - 2022 Multi Theft Auto" VALUE "ProductName", "MTA San Andreas" VALUE "ProductVersion", "1.5.9.0" END diff --git a/Shared/data/launchers/CEFLauncher.exe b/Shared/data/launchers/CEFLauncher.exe index f39b490d40a1c4ffefa32fd2a5d740737d69c8c4..e28fba9ded10625c5e65cb4621407874791167d5 100644 GIT binary patch delta 15835 zcmd_xiCEXj%S7-I#(Y1EbeD=1jfzDtv}byUwESGc4))db887d%z|9r0Wr8r(gFpJMFqV zG}tFx=R==i3D@nRV@|@g8RmS_bqBKtul1W~u1{MsKa=i@>HiC`$S?`93=_}VFjbod z%zKsWV0f$}JHUr{v0AGOK0Gp$4PcLuwXC0gtuw>4Ig4h!z zg!cwpTfdu^!fvv54-LgGI4>K9F?4fB0~scZEfsN>cnnk2ZkfI0lJ!_yW=|#M3gtqRqC?KP47P50l ztxW{a(T}v*M6oByP}@NJMW5^E-D^Def#d@_!VV&S{D@J1UYss zt4K%JHX)y9#|7XxJ01JCw~iF@AMgeQl1%$t_AV3gAg80O0^^1Gv-J!(C))`Qw8;^Q=tZ6ZsZJQp6oj*1p` zGg4z>a*FhP`P=P@E*}~Gm|0P3SNeu^=@h>7d})f4A-3J{c1LM!&)R3>7cS2;#B%Z_ z%NI^4jqNkU-jgrSU6@@O+bcEdE$f!2x0hNOV*4CpdmYb}uCykclQygwM^$u@E!ELN zr>()PVbZ-UyVTN2eX7`=H6rPG%Ld34XJ3hVIV(eY_ilj@t2Xn_*)(BQ95AzoW}cm9 z7y;u_OpqvQwni)Y$XV}Bm$7=a%+p3;uBND2NE@F!i`l07umMw9Qs^?wZQoxelVKd+ zFxkoKqSQ$_XLkBSLJql%WM3yYU2gD{)#R99H%~c`qz&w2-yzAaQ`qMEeXb8!_9!WL z`)$x>Ph9%+Z>$;49(!A7bSds7<%50M1LV+P_k!;+qSNRYvXfi2BWF%2GT)H8DojWZiF7yIfN z?n`vU9=eURqFz&;6&)7cBV%xfBx3a_^SU8eH}W-fS=Nx*m{^M3(dB0!K1VmCa2J9ZCes=x z|5Xh=UsG}l_ZQ)WQ`lCb^qs(_kavBRj;F9jTIt)p$y_}-dBVOOu*Vyhw|Nb8}|T zJl`laCeS}_CpqQsIj{yT0mN@tkm%ex&*T+KQnb8*%P=R^b<@ZY3E}5aBr9lwkpg&nelX5)#8IYhHP3| zW)e*#5OL6GHiP5_1v=9k5Hq(uoe(dOPl6`1?~|uNVJ?%APeal)xEMpXg}6A58DTJC zqMTZ^u#YK^?MujPrNa zV|rtjQ)V^on2mQ|b<77OF~pyJM)E^M>{_xvB!gv$Lui=O`&iqup|fOks75{h{}KfQ z=nQ1SmRoQf@8N0C(24@xdK=xk_zuoy;XPbq+VvyJ@z5x58RlyAyi;ZaUE*5D-9j>)LUSmT~s6!sm<5?OecibEG-9x#}a4RUwP3d!6& z2L_+lCG>MPc96_{@w>^C%qgDJ%i>nY&Thn2*-6qO0u@Iws!j4@37tVo<%N*@$eePD zh+#_24cta^LSRnNG*?KDMuEw|pf(XS&ZQWh5Umm$B zj<-#v#X1r$S!kP2i?O6yGR00wi`{MHKaxyVPg10H_~gr4*(!2FHhj?MemG-8tW)W@ z_}MrXy991Hagh74&LmXs%|?(oc|b5fgkci7CcGr2bsAGl@&sH-?hoAGm=gw?A1>z1 z9kN+29kd1)vSl|-B-4k2djdC$+?0D@#6OYy1*T)IWX{99DJ`B<<`v`mH|3IGsVhm8 z!r$iZpV$x)VAW$}t-_nVPIf5*f)8W%O5~PV{o`1+Bl*u`*+9A!V%wp5T=Ff%FH+3z zA=4wn1Ae=VTRJPDd|gMM2@_ue_u-EwQ)UYuYvt=iFZ)yL$tRI_ogZAnlDH?N-_7B& z$rj~#wuEG;MzLk2LbcK{quXRcZwZq*xB3BU4=dh{`}HBZ53TS3Z`7v+-ET3O&iBt5 zMO}g{rhHO2H~$fx2YOCCe917X1b(g)mqNzGoMex08oit?s$VhsD(iCUJY5fisexXz z4J2{wuc3Y4>oNcA?(L_ipKdee@qry+^SEci$>P}6>_l=mwwslZ%j2%HX=MNSDE1=Z z#!q866HVL(+iJR9SMqJ#Cia*5*%RDYyhN{jt%MbmzSj=oG4&H(W z!?W$BsY#?FF~t=#fb^+heLki~^c&t3o{<-c$^zR5w3o*TG&ZS$F$^7jJ$Q~F}q$IeJ|v6dEv z#4|Zj+VV4POT~K#ciLQ>MT^JGMLca7?lTmNnu0N7na9plZUw1Hmav3eP7Y?jCwkdNhzVMh!mtK2EBO#Tg~f9?tksdViUP;(wq{_>pM#9Q@!!EB`Eb2JDuE5 z_4SqFab!AHLXYUL7dX>2)2cPx@c&C<*)-qq-|6Kr*)y$C=DM{fTb*Rlodgt(h}+y0{O* zIPR$He~xl?gg?`pJxu~JU~BaDa(z!|Ei^hCY$I-3$dG}XM0K9tbk$kg*cJ(yK25Qanin7 zc9|JiD3Nm^C9@9V_Kr*+<#>;-)Qk}%yB!d zo0Gj{@@$#YURpONom$BIvlWi!BQ$4)*+szFRbholC+OM@w_?1j%CdtdU^p(GWsZdm6rXGWUW%+&fmK#0+Yn$Rl#GN zaFeG=pC)ovv|u<}zOV~-g82c;{knxd)=YUqQ=S)IAh-^Ck9J;p_4vXYH+?`Rlc+b2 zVrxBb1hX>Yogc~*{6r??$Fsg?t^45kzCC8wQHkS;g?PI&+?bC>?pEu zwGqGQ1itl%eVYtf&9C)-AFbra{0!)6$M)?>|IBE-d~FeX!rX&Z1d?+epo;D z13AxEz{Jq44;J?8UD$7cs9(9BY~AQ>ueUWX)gU6qjdNA4{cUY@y$*9Z4ZBafxyU8; z0?lHIMAfDb7GF8yOslolbO**~ECHb4jF5k4` zn9h8IUn1}xam%Iw3pJj2i1)dj=oeS#ntBa!WqAUY zOsO2j^TcmBm3mtHrczG%vvQbFfZjg4E(Z@Gt44?Od53Pb-3+I>#v8^PcW#D95ZUH< zb~IVLxrE(G3buFTtlHV` ze2<*_@I-Vk(hpfY^h+mooQu6@u12GZau02KfTjDJ%vFDLQwQA!mSA|qxYe6y%_Bc; z9m_*4VB2_aJ`V@rfmQ)62vBgR1v?b5VClArbop!BDluO#-M$rHfNXcnW;@8j9W(H0 z+_4Ow5j%&o-DJ|v|M-7iXfolOy<;+W0VVqD0^g+IBIu6LLIVzU_-(OF?|NiT#-~|2k zRBBwLn(FRSi7)x|i#{gHJ^NSU_rIZ^?q>^n2V)8R4IjcXO2lNu0>nFrN<=N932_(E zgAfd58GnQl5syekWFqnr6^L4d5y2sP5IlFRgYZNIBh-j^#B9WJcea38jY0)tC*lag zh-g8yA-WKKhyflf#-X&rHeHZ}c5Z zGCmg+^fu`kdT&~v(KB|?3DUYd#FuBrAL7e7BeJN4^i?F@(w+)2ikJ*bJ=XthLmS zKv&e8A>MZw4thiWx&C@Er1iLS`U3L;nMn8{Q3mm2H&Y9Rum$?SE*J>in)};D5I>_a zdPom^EVO~~mi#P8w^s=1a4CWG1S%nZ4P*8~x*ub6LH`kTAQ6BB|Gb{@hayPpscwVx7lzYEQF5m)$l8`>09z^U5VYwH%( z4IujC9PK<3)Np>PMy*E?KVMnAvQ*EQ5XrdDY5X!n&qUAEGaqH^nR*2MtH!dk#^{+6 z#JM?oCMZMCbfoq#{}GA#V$k3Q%hq;7x|Mk_u71fED_Ca+U)G!u?g)Q!|AbUt*{Wx% z5!(?ph`oqf!~sMdq5)w8i!VpS?9$}4$LnI(l z5gCYVL@uHbQHH2MR3d5+M-Z&}G%-w2Zbq~s+7KNG4$+P1{Xsv3;a|ee5y1#8A_0*> zoKKFN)PzzC;tJv(q8DL(8M}c3=!FPIC=v09S%@4&F`^7niKs=iBJS0{d2+G+q_`jT z484>k(1_sQ#P>SH5d^)w-B8qyGNKmIi%7VIzC~~dTz;kx@^2$wAAa_tb%E$X|0JV? zbV%r-HH?GwzDkAWX&2HPKNIp{4z!2)&;b@gI?PKT9sU)NesQjb^uDWs^uDcy0$2wJ z(rLK?1y>}Da1d;UbVg}~_(uw+4bpFc9nc+e&;xcudSCWJdK)pn^xr;wNM{%U91h)~ z4-`Tn42Hf?1V>>1O!tlc8AFMLKN|Ef0LDQ&^CZ9^mMAY;jj>n zf+bJ^D_|t7hDuliRj?LDVgF1W3em6u>Y)+Fz-BlGw!*Qn4UU5ya6IJT1lSEkz)aL_ zVJ@_Tg^&-+pgp{Yk?RPnQFnrSp);(51K>#x4*?exnvoE|D{vsBGlVOoGsGa+fxH{+ zf`ef%90IK$VoX2*q`y6TK~ESAhd~+if_mr;6Q;miI0F{Lg|HGXg?nK(JObB3BV_p)ZY?NS z^U+1P)^@NBb$fUZI>2t|1pA->^1Co5pc{09LO2A5K~JcJ-Y@}%!C6oPb72%LgkxYC zT*}9A--`l^DeDNdhDK-yTcAB`gAVW>bb{T`6ZSz3bo&h(fI51t{dBpn=7Z#ne{`tziwcg9o5JY=9212|B@6=n31Q2KGP}Q>68Ousjq% z2j~TzU@-KAGN^&^uz+QTEz0UBvLY@zM`I1t(n zIob|;Xgg#cp*5}xUqe?id$JwDNqsJFpP_#@1PhhZVCfo1RmSPd`2z3?im zgO}h*xF0sdFW?o}1Uq0mZdRrX1^P(ng)Pv!SI>M61+W?B|Z5q>mi>tm{GD0CTWCJ81o9|1&Kgbw26>)c4S5lNSo# z!C-g*%HVmZhnrwLJONYT8Mpu*fjRIRTmxHS37iNkp%K==%dikTw1)>!{{c3@Td)Zh zTt}f5g$uA99)%n{4SV1f$UN6Gdw~=D9J<4wpg$x~1UsM>ehK5?_b>_Gff?{7%!apN zKD+^opW|jZi$WZ(r5~(7!$L^kH$vfd)U#m*>VdEp^-NfTGjf1OP>+W-XpewK)K|g^ zv^&BU)GJ{d{21PY2Vpmy1pA)jVR;M%{tG>G5(;tcqM#ehw}oW5Z4` z4E4#d7VV>;67^izi*|Q77WG3g0nUIm$UDPXs84}8ST7i679f#@f(Qv8n2Y*cSc??~ zz(Uk<^P1l+U0@mNn_)Ga3LCJT0PaP78qH%n;jj+%*J(TIVt5kue8}Jg)u0*mcVU4M z8yJWJeRGP2SI|%j@4-Z9#0Dg=8}&C~D(V5S5B0?`0d;@K@59fy&<(y1OOPK4g{Uus zVXz3gV?R2mM14KI|M^I0kQj?ZF|5OiBA9^s4mbMFPf^|jC)buUJH+d@Z^rp^$Hjw^yO;0-$bvop;p%CUkIveFeOn38`H7L*_TnxQn8Kfht64IM| zJ9LM8AsxC0ARV$t;0SmU`avV~hfOd5Hp4*JO1z(4-YjN^l2%@T4gIgA^ki-C95#;J z=^Z-5>9iip^#8s352ksj&Oo#}vv|z>vyC3Q8zO7~%Y;4uXB+K~TCA)`oBlaD%^O}| zL|5hr(Hm&u74ix*ut`12HIPmiJJ4_gF%@Tg7I7ZYg1Crq!{zWoOvg4BBGl-9cbusw zg8pYkhY+;Og?zMQ8;-ctkyvIw%P>}G^X8!+YL4KNA(3zlk1#AhEpcpObN07e&%B?m zKQ*Vt$5)m~Mvt8NFwKXR zkVNo-0-$AeE&iC&>J*Mj)xf$kdcmF+?WbOv0hpc@u zNY{&&lUCS%KHaN7y+F(nH~h;3-RBZ>PC|3-$k9<}$Tmp0*|pW)3a6fQHm4Gp|RRX^bLSFMaUOp>&;hrqdkzEeZL{hxdGz zIX5iB%*MqO_Ac3vrs5oPZp?D?;WmPv^+4ro(jI?V0AXa5A>>9*A zv63*ts!?ui!10rA>d1X`D^5(NS@MH8Kulp<|^M-2C7D>B2_C@ zZ>!d;K2YsdeXeR(-B45UHy@|R(()?ME#}u z8})g0tNOb7w)(#MH}w4tCgLVwaVIMcVrJ_ zcJiTB1`l>R+gx?WgN-hb%Zg+M*=8(vNOl@a3FJfMq4GE7>*c%Td*z?YhbVR_Y86)% zw-pZ*F_Fh2$0>hSN>n=48r8?DUX@NAqn@Ciu3mvtIi+sKN!(Q5QFo~ys~OF3O{7Mv znXXx+S*rO_^Gvf%yHES4meuifgQFHlRYzTl3X0xR5PcvTV_MIc-zmn6Mu*yB}XOKBqoWQG*Bv)#!J(si>0N~tXQgc(w(R;!WZM;xEN##Fua=UEsIOx>W=DcqCBD| zL`{oY8nq|tYE*YrX!P9ZmC>I>U!c90fj4y!A&L?$5xs>I*d;nFY7|`+{UZ8P&4aLPsPE~2V;ZxjeEv(pKrH6exwt z0A;9Bt&CQVRW4DkQxfGaY=?rWU1 z!?mH>z1q*TN3}P!_PQ9|9NpWx&AK|>m%86|E>WIQZ$=eHy%+U<)V8RusNbWWM!kr# zjy@CpeKeDUmuU0ZM~bH4?01WviHgKK#2<-Eq#sESOTU(WE4?ngFMT3)kon5S%I3(j zWvg*(5ZQj&DOtf~#VnOdtyjOUUZdWn-mmUc@7E-0&uD{m`*iKP(5P>sc(jWP@md1P z#8TNT*?Y1E*;g`exu0AlpD)jsm&*T;+bdEPxr!|cP7xfrI`T?nhf=7Tfr;Rd>V&FU zm8dRO??FF&jk|-VS)tjiIjOm&N!7knp#50eq%FjGUeLYNc}A(CT%$M99ai9#AFv`v z(Hzkh(Q(mNxSpM&UeQZj(VgOdi?56CiXV$dN_I=?C1)fqau4|!`B24fg;CL>7_IzV zc}{snX{`!YNmY8)G}TsBy($uyWx9H{xVtArg){;D4rlGlYAu!l(=NBb;Y{wsGg|asJ^Hwy^wv)w<)?gx+S_b`bu&+Am~dWNSo)qGC~rs7zEL>cs;BzmVhZaZ(G^ZfbY6ms+Uy$DI_W7O7=w zrCN*8IaXce?#t@%!rFls{o`rAY$-dyOX05wQ!w4wG|ut(;}PsP>=0$79vz5*WB#5z z15@cd@gi|mi$5!w?~hZIVNQ9gx*kr3J9N zwgj^O5^k;9F1G!1hEH73$Jq`qTwecq>auZrewg~`lO-!|y9|E+;_;1vY`UOem+!o- zl}V@1ZLt4t!Q6vyO9X{^ONQQbvvg3H+Ss| z$*9v`9b0mf?BmFxcbmW8aNaQ58BXMuqpSKK`B@LCT0~(JT~;9UH7!)Pv5Cfsi$^q zSu1<{O4!&>vGwW67mrQCWixYsKYaMJFSZUDv)uHiVo&9+4ObP5&xLHv z__VF-{GBahM4!5!YwvVfRwUf9Q|nN-M^fqd<@s^r9^S}yjF{eGyfU&n>DlEAOG~un zMpNr8dGOG$svS$Bj+L2Kuotad8z$&;KW5h~8lkp1b@KS5RNLgnuonH+TjNf@soImV z(ybxoo8M=Qukuy0Z>u&v@ibNE-CXVexuU@<_5D9~e~>Wmt(H=m_o7GN_1-=41JBN( zc8&89t2^#4xQO^4ZcC*^DUlz)u4J`tj(^Kk4WGnL6gk{}WBJhY{6TSx2F!`yxX$11 zh0MnE(KKVUygFfcilHaPDgMI6r^|-@_Oku)bY;3*)rXVVV+Dt&UXz`zl1*rCT=V6o z52kc&UMuk{$={zHnew>poi5jT7cPYCYtH`25Itu_;E|cjBZ_wIk9_x%@M?MA!9ekt z?$d``7yXs8v~sTL{#%p!tbZD8x|&ndtx_Lt-1+^*nvzM?31=VtxMbC^FRMJe-|%Xf zwEI@hoUQJA2JLV#aciX+K?SLGk!ibn-+I(FV&6}thrXK-I`2T+?#(T-eeLg!cw^&^ zo7D$L_U+k|x@$j=I<;DQ_4%4*x!oJ3DUXM)98?uIe>L|c{>=|# zKezSVJ&PCTojvT#p@a*BU`ZN@F#n7!F}GW<;Su|);S zj_QbA6DFzuGvP&7@{aH49e=$sX~>{yqi=is{BFqir0$!RKX){Q<|tk+b6YPf($6@( z;@_uV-d*11yl-WMa6z$`@X_^(+{KAIruT*%{^a-xcJZ=|z0#YHie?s%^P9AB!HG`w z!ap`R{44Ya*GGTs+qWt2M&X?63p=Ks+?1VBP+Pa8;Ork||MRB0k0mT6=R_ai(VoQ}Fv1&dN0QE^I_tn877wHGi||h zXIq_28)L&du|0f9Agi&x-p!J^Y!K^AirD~%Di?-%f7-J{5bRff|v&ACrnhnF`pL3p3P@lQ%&OI*2 zo?#3e8NrKTGl`KG)@!333N7a`Og#5d5W^%lqJF?bShzMq{3Rh`KQ zej4jds`sp>?W}`7QAa@;}u|JV(jxj_Ntgtc6Ad{WO z4ywZ=7K@C_dE7Cx#{C??FirVE^{A3*n4EAbN*Kv}9Ys2w0vuq)QY#kLaN_4YmTe>p zocqq*$D$k4IvGj*7ouDf`$vvGRc%LWGHo!KM* zs*SY@TjTW3kA;4ywbAAxzmcqW@xdeQanXA=;tsZ$g1czyiw3_;b$+8C&GOns%r@2z z?=g`jt6ckg?E1@OGL8}$$2;3zl{hPA&Y1pd8TryRgbgEiTyNWSRgj~?k8R3?B)Mld zt0oC<6WFHOy>7p->>*O>@tgakz8J{qXL$_gfV&meyA~WFrM>*w{p8DDp1DnEZ!(<` zJjtDo5eezR=`6P&C5)Z$zQ}Y-Fv8Oe)u#!%(TFp1oFQqcSTe(xCVOT7y-kYtpg z$@ckwnX=yPNHFpWg=9#d5c}$H^h^S$A}M_au_dISPl$W|wS?7Hs-@d-gW&e*pMuAq zVO})}hAx`gNiS4Ox8)v@8qZKS=O%b~^g^|C9`^-#>={P-dyQe6h`}oa16c0Wo6mk# z`&oZCn-E9zY`9nNJ>tYn4oT;s`28?8E;)`kkrT1A2)-X4D8!;7E(%cc}9CW zFFVc62&}gGHh^pj8gA1tkTe8s?AeSc!8QB~OCwrf5^-yS$<8Q=Q#rZ>AyiWOlfp?yx|-jNygNx2x*A90SSgy zvL$$Q&~La4Hh_k7Hl23Bk5=?!m^&7ruI=mrmT z-YaC7iwp(^m5_|Vy@j2$3vS$d(*>KzmcfB+H~D(7h%F$G2G3$`N!*Z7=Z#n@)^e9f z;Sja+*#B{?B~3&6dWd?WqRgMs&a`$69PQ6xfg<8lq!c zNqIAcd_yu`_z=YP^Ck-?!!!QVVJnI;$8a}A(z zdY943=upg-j^@R42dT#?0d^#h+fDX`USWA;`Orto5OfY=fYFp-lzAc|Byeet46dzV z^g0(eNZ`8vFqslK`77Gt9yRQY2K4vOWc#pz@;Z#2NmdX>qernU59IckUCzTInPPJS zS8jF)%?|43@=4b)am+-xlZ$l-y9l9%j4PNdofv9vl^FhH%RuF=5-^!=`Pv**%w+Pp z0SbnpJLliBA04PNKA>o);uZ6zKHoOKylFd^I?O6x)|B7fg;f#>5so8DnCKdvIDU zI@T19h!-XvMy8AF>@sLOMv#7Cv3507?IerB((Ib4T1Z;LCfJuzRdkySlNi`wQX#3q zHAdRZen`Az{oTI|Ko1zBor_1s&OqDj<2gSvR_4pPl6095Dr5x7sSQS{}&%=}%Nd;$>cJ9XTWSVQ-V4{mq50-sJYR49_ONeIN z7i>A{7#Ha-LhCUrCG{P0tO43fi%CT62zEm4+E^bOHknk7e~bN#bdTT9J|~|}n1HzU zazdt^h&K6A?UMLjEc-?6`iUcL?Bc1blr&FH^k~BDPLRAXuFD=CNf!Z*6VHiqiXxZy z3+?DpLNz~WU?f8);1ld3@OY^CDOOLL#p9{w&$4>HwRpVM{8X#wgvH~h<{PY@{T5H4 zn!nKMskC?$YJQ&8vu>KjrBU+>tgcLpN3Z4=Sv_+so+vfH#OjH+cw*H2GOI^t@x-e6 zn2S(=U};S|E1HmfOAJ#1EIQFR~G{BywwVwMdP zCyXBx!q^W;&%|Jyc2tQ&*mRPX7|PBeo1hOPCllrF$Bv`ctY-<9(^)z@nR`s^k|J!v zkCM?zK5S2tmUI#kFd*6AUyNPJbhL=J=&yg{Ns~?Q=5XHs<3!$M|DnIPVKuBPN3PR( zxP)Ac=UUCKN~`rPEYr~vSR5WbIXuWn9TKhpNJhZw&d+_uWcD_W?#5(t&Q~y5m^t%_ z>$E;z6KEFmF~n*xv^YGTCaG^p`d-J* ziS6iuF|ISU7;mizSmriySINP*rbeXvh>a_WUZ{rEYeEie(+!60)LBk1R7>~Z{`Ds1 zFm)cFm%}7FMbEa8btysp=y7^7=YP|@Xwez|>Gp;gWSY#mkP9hau-8e}^x;lTv{)m( zG?6c-PjSkm>Oy*{Cp~6JopPvZcHSUyunVYdcD9p}8B*sGYMY&1-;kymawl^O&0c5X zGV>&+<~K77*rOzVmZy6FJ>(j@I&35+*Dte#36r@fvT~M}P47cw%PdpRGTNE-`z@V` zM_)zu&K}{j_BYyLINUVTTB}B+J;az1rH@BD{o6*lPZ2JA)%%$@YUGsx@IbwZ&#)N6Zb zSf@v{GD6Y_8$|}qyU!jYPV;B7Gs%Ma5t7B%=)SUxo<+FR&=Fd#CzGs@bY4QSESsjp z{4Ljq*;E z(r7|#&|Oq=kJYRA0uiqDpksI1%Qq5kiVXIsdkcQx!bvj1Hr+l#cnI}9(s z?#qKm_P{z%mb{qE@u_0GP@47#lis|Ia)T=9-e$`3Gi7<>7{T46%e3Rhn>`HYZn{lQ zCaaepVLgd7I~dH3irXUDPuw2=p zyx|HB@wB4S+U7MEZ0s_qex`PNftqzLqk7&tbc?o;+%G&8WH9NOJJY+jy*MMt6mI*e z?aol@xjX&YHW)9?2s0h;49z4L)4nMHR$`tou7zzl9+$f0k;u~IzEx=0JlEhxNY^~qWzEuguB+?kxlX}k zKU|t0T!!Q)u1QG#J~ohdH!6_VaF^chm`LtpK#w@(jw`VFF$vFO&X>+^H@lvMXF8^IJzj6v& zw(CSCJMIM1ZeP0n`tEI7XRFTv*qBy3>u_LZmR)RhX@aBU^j-ep|H`=gO-4K`^X|@8 zmvh8^>+y&dxPN7_?H9+jU5suwn-MUf-=ImqAh#vSYzCT>+Grif(Z+7t=3~>&65nl6 zHf=0P+cw&VL#YlgBz96o2&IcE_E3=V(zbClfA8((EJHrqz7_8eqjt<->&c!S)7bh= zI~PG+yt6;sOiFh?4*V_8{9f;rz&Wl#C_pR{nB?3r`iTG$W2WTF46coQ^wBvRejZ7y zn!sKrN2x+lFjlpMrv%& ztWnTU)md&|;p;QpF`ilWb8GR6p{zo1lbKa3b_Eu zy@m@1c>!_uL}5rEL5yzl z3FH&VVMrt7dq}$%>&!fZLVqiI>51#-UIEMV^^E-tJu_yRo(b8ZH>c6d9hsiFx>e8g z%+zo6_ad`C7v^@J(=&8sc7yn0&hXA#Y$1sEX~rAG`#KYBr4)3A9c4|A2QiD7B&(fj zWd>*ue>OOyHv^{KPoz;KBYS&wN&dNrR zKFAHL-2&2jTCH}QmF-qPXJ#(`iNosX1nFvgX0^Ml?6#7*U}+E!q!kOSwzJh1T5S)j z?P;aAm44RrKr4eO@m-4vwK_zUne(Uhk25CI+&8rk?o~Qk7)M zKWC~X56wsGpua3@-7`Sy^9A`9y>|UqZ?i7kw|eFogux4%GkJYn5|`7gXYwEgkRnJ4 zqzqCHsf1KPsv$Ly6OcwoGo%&L25EQ4uE%#6Fi0?jdPSfDqKCvlra)34 z21q6(8G~@I>G~}Lg!>!2jKop%WX^K@Pi`|3Bh0xC<18&Qhm%R)Ko38jJ*Mz>#1b7zNgYqrgURG}sJ| z0b9VaU>i6NovdoT%r089jhVD2<1o>0<2Kk5L3L6(Qm2HJoM&=!mW zd7v{^FCUDDZ3m`+_Mib2fSI5J*o5ip1m?kZ21`H}uoCP6?&c8WU7^&#Ap}o=JwX~K z+&~&8+`&fpJ-{1aFR%^l4L$-r!7h+~Z|41qIROg6exNt#4F-cgpcL#6>Oo&H_E!XX zKPX9X_=Bn705Ag#0CT`Vum}tS%fW$Q6*vey01gK0z#-r{Fa&G{L%~*XDEJH<4l)n* zOc>}4NnP2ec71so0LwnG^Mr4t+rc7x+UL5H4+1wFv=pdUB^3G%yET0G5CY!R_E0uo`3qm~Mxm@C4{0jJZ8n58DB30v*8?&>3t8g4t9ec zpx_ba0_Xwu1^qxDPyvR5QJ@-30d=4O90_KE3j~<%B~WmdWwwJnuo|=n4}%V1J?IEF zfzDtH*cWUE)nGTc02KU&dJx(?K^_ikslO-eL-(f4NAdW7BMpl ziUSxAI)W)+U(f)m!90-l!{h=T!0n(TSWVNx!!$h*4Wa2^Gff9uX*$T!^k6iIrh~lS zkq!!f$NFbO(IPk;z+jpHN>!gI!=FI13FM4D!14%r?*)TmbsPPd7a&?77rNgIQ1y8~wn< zf~&wJ@E913bovsM0XrJh!{*`sOb#4$?AS_qtZtMlcEW*@KT@j|FGJ7Jyx_chS9x_otq@0t&$cpf`943a}x+fS4`%6#(P6LbJcLAedPXLopE*Ol@g(Dq`CmgFb|vvRw17dEP*|V`ccnNuoCuCnhskG?uMNW(u0%=tbx52%&kTRJ)zK( zQv`Sd3B_O&I2o))fiSQI_Iscnb`aPOdp@Xu9SC;9o(Fb=AAlL~hk$}^J+lb(0P{fx z_t64=u-DP`--(QBI6~nl04rgOKn3g_U=+9TWm^Xa+cXfi=aPgsb}tk=U|@&TfvjyGcb2A6z9M6%!gnX z3ibm7VQ&RR;B>GC4U&Kw*egJKxYmO)u-^w;kgfoeVCR8tu$5pc>@^?*+Z)J$Jp;@E z7lVQa`dssiO%WV3;iyMO8CVWG2c+*Yeqa^sIiL{f{lNpUXMuIFrIfIDg3aJcFdqIv zAP4(x@EQ0H$e1i|ghKEhOh3~gJyQlH6poKU1$YRI0{4UQ;3zPqcFg?=g4(K%LsLM+xj9S<6gqcPL2qy&NT*aLNLP0b z=m{2pbk3H5bgq_z1HkQI09XYEg1f;Wuo@f)))4K>>l5Gnv9k?4(;&evEH)`9_`OLp zM@QHNNGtfSH2SF3C|rrON~E12J-hH(pG@qU$qLB9u0B!c@W-t5SC8Jy@WV`lZj)z| z2bh0;C@G*CdWmjnlO{(^c6xG3xbyL=m|dN}wS4yezdtAKf2QKEtH-<=J#x~Nz@(Ap`v}R#SMFMmf2PnUV?6)i8)MGx{a-%n^dmo`hCrmyakJDt zW+bga`p?|vS{48B#nTEH4H5s_JvZu~DM>Ub=AS-u4YB|5O`+MCc=-P3?o-V9X2DlA z4lP=mIy-YVGFdy$Vh1kEwz>uI`!Nh@_;=5tbT~b2-;@blv0_E)9CRF`7qXU~TbemH za7<(*Tuc;UyWO=he@~fWNs0Z3Z<@I^@$j9XHJfi6m`!VNCKJ2e2TMIz^QVzvZ_@?^ z(kR2kz$ajl+v1}OoQbb3?G9ksPsqX7zU*l7-D}^-M{+$)VeprbCdw8oseMANXX+vJ z_y0?$eorF)%NPFuJQ3G?s{6O-^fci=CGb~Q=9=Hspd$y7*GRs@^*H$hCGO1p-%Cs; zVv{esn@q%Y6j_2RpKQccP7a!U{qHUL-%IC_Kaf|yxhLxz`Mm6(dH?>jmpAH}Um*1N zrmfBY)%J0lm$1HU-R6yKzhTNFI5t6ON5A>aq5ry5kBYY)i!&7nV3B-O@8HEqVrjpo4!1I;QBs zR`MJ?CRzH+qvEz3yWUpBh%4s0vr4n_kvsd`R?PTS4EJDzj-BvekK5)>4o?n08h$$b zT==cWrlKvGGAGu{8+hPd0Tl;*`fSXX`>2Mg{V}j zC{?0rmTG}&sj5&#R3EB7QteTFraGvqQ=L{_P+d{oP~B18Q$18YQN2>xsa@3`>b~kg z^)R(gJzhOSJzw2X@!XT08W}86N}?rGBnu^*CDoEv* zHt8Pd5+WAnMlgEpLYTGoqI;rWMSaBm#SvnIc$IjAc)R$B_*?NKv3po>m?A7XY;jmt z*p{%5l340pmEb);Hl8li|lPs2`;Bl8pcT2xV3Qibsi!Pewn(-_wp_MSwnkQn+kGPYOm;!` zROTa}DgROK6do47D*O}0r;5)NhZG^o`^sUe?WzN+^BCYiRXnwu+Dq-5t5&Ha)jc&K znkAY%%?Fy#G_{&m&3%nYW2g1eO0gUa*D%gU?DhstM4p2|VhLp4~XP>oc@sNz%x)pFHZ z)p}KlYQO3$)j8EA)winORVI}}oubaetk|ypG*|ttx=sB^Jx{Ypvs|-H^Nq$<>#vQ_ zCTf>zS7~dt-)UR5YTXFk7+t(>y6y{It*%aYQg=bOKB5dy|7QfAJOgj4KuaC`=QMG2ziqSd0!qR&KiqLZR;L^H%o z#TDXD#D~Nk;@M%#!V1H#N^eVTWw&Ir<$3ZFxeW$uy`o%kPQfXjDj21ka+-3P@}<&Q z)l1c1Ri)aCm~#jXX;%G=X_#wLIjM)JMF=uW)KAq8ns+n@uui|z4A)Av?`hX)i?tiI zA8Ll z78|x2i*=slg`_v4(@JTMtVFg$wnugZ>tv{0A=l-~N6Xj9%jDbTpUF?j@5%+?0pSb7 zv%*)0ug8SE5#AM^uHY+Em8X?MRk5m7s;g=TZJ<`Ajn^h=amO0GuK_1S=fpR~N2OmQ zfOSYs2y(sUbeBAgl_3xd#ol5+tb$;1s8}S{i1k?9voJ>t;tX*`UtjjeSRrDqr@9j{ zfzk4`0zi)fGFA|7G3K8xsz=#HS@fNCoC__2}0+LY}| zPWedLiM7+E>{jACyGo#PRtZ%eDo>TS$`2byFrsU>ju+t^QPJ0*)$-afHI7a9XN&0v zU#1f;Q+P&Ck)J47bnMvx_ALDji@(1>no6t_j}VU%YcT&}RZ~e5oRXs6bRC+AXRUof9>RIFSHd6=Uw8B5}32QOt=22*EL7hOnZr>afNzE=(W^ zmc&R5k|N1&>_LqZPQsH4DrN_tP8a4z?$1x%w0Tk8?&P;_UlG+w{>>M92-+8abd^8v?2`Ak zXhkk|4nx+(tb6IgvMitBtz{WD?bEp(2YVK-<@pcUx>omM|C(J_74NO>J!i-lk-b*T z46EgBIVEhmKWcj6@3#(T9%T*%G$#B}@X6Wp&3@C$>R-*6w*Afpo=fz}uY;EEANcUepw&4&vj7H z@n5GN2@~YpYT5eJ>h+JGllTQMuJ?KS_~PMDH^^cFqq<`4r7MfZ?EIr2sbKe>ZIA29 z&i>)Ss<2jd?8epEGnQ_j`0>710ku7Bf0(-D?RP@H59p}ySFo#;%~^Y1+B1K&uir55 zQdH^vN#{2ny_vh`Ucrvf8>c#!d3xB`J67k|mA}5~=^7>q6JzR&#NmioqGPudtj5FX zZ=Q<&aqKve%j#37KWq?;H$IQr^2eq7!*_1mJh(9QbMD5m^^L=A*QIAIKYqF7fg-KX z_jQM|8a9Phd>F?b&7HdYQ28Hmh2kUbo9*76dwHk9e*eb6e)GNN*If=g%Wu{0%T&GH z=DNY(d;WzL6W09Ihf7`ga^|DEM;^Ghed_YtkDo*xN?P*O<0giA`uL`!{K8v@G}(?$ z^M3xcsCMYmXQRe7q;+|}^LFFrMU1Gd2S1#vdT{6u{jJ%L|8;ZF`$1<9x>OcZY6$es^sTY2k*v zgU5QO4<5aW*UFMEhxs45f7f;|z5Upw#ir5?!Y!{VSlz4rPRi9$TLt6Scx>I3m|x#A zR#Q?}`Qp~n;h*)c9>_R0Y`nE$U~qC&Wt_qn7>>j$!wn*cgAC6kG_|O*XmEV vSM|MGad^@vRD9Fa$u|CegxT;=*!+Gc;Sc>qd!6}zmXYNU diff --git a/Shared/data/launchers/MTA Server.exe b/Shared/data/launchers/MTA Server.exe index 6c11824d68adf83b2c7e4bf05dc24d2dda2764da..6e082626ee1ade2915b36b4d1d150974fac6cc0e 100644 GIT binary patch delta 140442 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 Ks{8vZk^ckuTy^&V delta 112651 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 _+cT)SVly_}7wF_(HA>*ckJ;IQ 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%0DSvntST=ym+231+{V7{EG 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 z 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 diff --git a/Shared/data/launchers/wow64_helper.exe b/Shared/data/launchers/wow64_helper.exe index 2829a2ea7678243f205f3b81195b8841a42e46d4..f8e756e9f0dacd7e16b12713c22be274bfdacfe7 100644 GIT binary patch delta 78462 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 delta 78086 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

  • rO7b>#NfuEgdlBAmcV0yN~Keon^nTU&} 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 From abd5612bcac7ba757a0c56de4ebdeca136aaa557 Mon Sep 17 00:00:00 2001 From: Dutchman101 Date: Fri, 18 Feb 2022 21:43:56 +0100 Subject: [PATCH 19/49] update BASS libaries Verification: 1) http://www.un4seen.com/stuff/bass.zip 2) http://www.un4seen.com/files/bassmix24.zip 3) http://www.un4seen.com/stuff/bassmidi.zip --- Client/loader/MainFunctions.cpp | 6 +++--- Shared/data/MTA San Andreas/MTA/bass.dll | Bin 136152 -> 137624 bytes Shared/data/MTA San Andreas/MTA/bassmidi.dll | Bin 66240 -> 68224 bytes Shared/data/MTA San Andreas/MTA/bassmix.dll | Bin 30144 -> 31104 bytes vendor/bass/bass.h | 8 ++++++-- 5 files changed, 9 insertions(+), 5 deletions(-) diff --git a/Client/loader/MainFunctions.cpp b/Client/loader/MainFunctions.cpp index de81e891ab..1951351c11 100644 --- a/Client/loader/MainFunctions.cpp +++ b/Client/loader/MainFunctions.cpp @@ -832,10 +832,10 @@ void CheckDataFiles() { const char* szMd5; const char* szFilename; - } integrityCheckList[] = {{"44129923FA13DBE2E7E5981DF328946D", "bass.dll"}, {"E48EA82D7A87853FA4F09F19C4E7A2C1", "bass_aac.dll"}, + } integrityCheckList[] = {{"6051E04522F175FF96F694B5A2151DF6", "bass.dll"}, {"E48EA82D7A87853FA4F09F19C4E7A2C1", "bass_aac.dll"}, {"BD43C88917D6234FF962B6E88B648B8C", "bass_ac3.dll"}, {"D8CCB4B8235F31A3C73485FDE18B0187", "bass_fx.dll"}, - {"E2A26F0C195B75D520D39EAC4E4C804B", "bassflac.dll"}, {"6BD691BB8E37DDCF1E2F620673442667", "bassmidi.dll"}, - {"444B4B36442ABA15F72E2B20A34B24EE", "bassmix.dll"}, {"26C74F5E9DF6C59DED3B09335E5D82AD", "bassopus.dll"}, + {"E2A26F0C195B75D520D39EAC4E4C804B", "bassflac.dll"}, {"B006C2DE22C7141337F139495B2179F2", "bassmidi.dll"}, + {"D4CBD1DAFA00F389B5717ECF1A1D7766", "bassmix.dll"}, {"26C74F5E9DF6C59DED3B09335E5D82AD", "bassopus.dll"}, {"1A78628A8AB4B8DB0E336610A3ACF153", "basswebm.dll"}, {"476BDA1EE12C760A29E4EE43F593F878", "basswma.dll"}, {"6E2C5DCF4EE973E69ECA39288D20C436", "tags.dll"}, {"309D860FC8137E5FE9E7056C33B4B8BE", "vea.dll"}, {"0602F672BA595716E64EC4040E6DE376", "vog.dll"}, {"B37D7DF4A1430DB65AD3EA84801F9EC3", "vvo.dll"}, diff --git a/Shared/data/MTA San Andreas/MTA/bass.dll b/Shared/data/MTA San Andreas/MTA/bass.dll index 0a35d6025923c1a3349ffd2339788ae525af21bd..0942d4c9fae76f8c8683dbf212f15c1c0e05a38a 100644 GIT binary patch delta 130392 zcmX7PWmFtY&-Ma~EsMLmySux)yKAxH1r~RAEAH;@Ufdl@acOaf((iuWFOwg0U6Y*T z-{edt8x;syEeJ_MkRSj6fI`}h0%%2?CGUh%nkCn=v;Ruw>h5CeZvKVL(%jkE#e>Yk zn#|qPnatjqOiERg?2C()H48E_i0VJz|B0G30H6c~1L!9IYySTk0AL>gO^yTw0$`#3 z$NYx+KN{Ew1OU+f+ulI`52O9Jk|D&<_$$fzB+NI>KmZjO0BCFi0t)|k90UZ2{h!_c z004mZ7YYzW1OR9~Ljk~<$)`}9P->~fP;5|VsVY#U+-(1u{O1AqPXQPIKivPk{wHGp zsjIbzy@xg6|EKd`8vmEpRq7NJ1>|%o7z&Umb5X5!i|#{;h`L;{i@qrj(hMO-RUjBs z9}0;E6zUHpE01Z23JeX%lGyXLAeZ2#a^zgiv%*ROM|?}pnLO9oxb`R6sncPI*(N8s zyyk9*e*U408PT#G)j{*M2%>YpQ}RySoBbvD6%7?`AqWcX`VZ;RAl<0)TKkWdvEE2;NZei-EP_nGGg8&gNpQ;lt*^q zU&+GhKr}*2pHUc+FgOk{nvP$R@+n_YpK9FWVUc?^}4fysk2^$!TvQ!Xw zpL~I}5S7=hmU?MdqjIQ}6ex@=K9t7BVDkHuF&wdAn>{5NP0V={x($+JR#T;=Z?P*BoWcyfeXiX2cCD)hXTP2wNsifh_ zsh!)t@6oALvA?L536!6fRu)C`N9RUB-W29FLQ~zp#{Vnbi8EW`$ZBT8-l_BytfmTq)V17 zg~L*ql*67Oq7tqYKi{4lTaP28STo!4pRds{1U&+ zVNbtgt1&CTxw-DRe&R$K&@H$R8hNhQ)+Rk)R%Su(chiA{=E*H<0cF!;ttu#T!I{~r zJIb&S^q{Mh6H!S1x1f$gJ*9~*RWZB;@&@C``v->-S1YBg+L6iP(bAkci75n2h9qhp zJjE?>Jf18wfW3$k*c#uqk=&t+J2+W#IRPoTlWp>|&lO6LC<1(d^!KK_veK<6N4>Q}xajljf&kE|dD?*~H0 zQE{xl-|?`anT@l4ji(LV9lC8C#Slzk*oX<@O)1%x%xp|zhMR{aA;g0Y8P=8c?)X5k zlMLs2#QSiTv1pvQ#__O=aZiol83*w2CgjL;&%UEXs$j^TMY&InweY!XAS=PPR1VSC zW^Lfhh*8+5bLpZa|MINK#HThONS}q+Y8-$;I@(`!mJ)avs*8itiiqg-8gQK4eKKZZ z+{=9nHGVs?ENt+AEx8?>tnjLWmwP6cKc^L@H4f>SPifrs zQmoe+&$srfK$p>`rw1`RIS#!YMI6_UMU+K4xpeepJgxkAs;M;(<@KgvUs4;~^EXTr zX)=>=K&uB*Pw~j?JJ>S>p+iANOQ7d{_<~??-JWYEirHpdm8Grl%*>@D6mO#!(Uj1w z_~{IOCiO+#FFcPU=kjjSR z^~4o%0HXMWmA;o$Nqs-n3y#pc^5y_XO`>1lpWK~2A67z#+Pt5<9sK*58ZX#*GW!o) zd`6&60A6`pMhmt#Gd7fwVaJImyXO~)Nwi~Ve#O?4m*Fn2`DQWv-_?c3Is;q*?1ujs z<3U&w)I&eSo=$eEe{6-MhEmMooI)t~(c%=|XDjB@)|kcQkMhsagIW9sDy>q`j~m$G z`JjCzGuu>d^$~kG0=vAF4)bdfkwB5;&?rwTO2e-Qyg z!UGCFi5^qQnMM|i{I&{pVDO>El7Gcm+DZ~06P~6p{XqK7VQmBfQ#Qr+0-tl#Vc^*d z|9)X#r|ndPvm1*)ZnuB-K7c-?O;4nSXVh!sTg{wfUy*+*nqUYAS`^$SVramf@<}Zy zq@Ij)n9WgC-(>tO=HpYSaJtrQ5)XeJPTPE?wL7rMC?}ovlScNZt*K@4T|o$TadJGb zO;)i@>U7}J-8F}(0n>}In{HaOFRmNH^DC`>ys(M-`H-QW&OSgEq_k+C;^gp@qE23O zKSIEiK&iFA?^O~&M0AuBrdg>ZH1Yc*j@n)smEEFl{L1_i=4gJ=_vC7yWD z`0u)$5}q$|5Ivdqp|(O6HAUhf^#~DJdU}$I`J$VqC`hk+3v3X6^hw;$FAn)fb%^{P zhaOem{O@%tSvSk@0<#Woo)^^~a9-5+(w4;hw5UyPVogy5g`6^3$2D%j79|Vfcx{%c z7tCB&uZS(D_QfT#2Pj}$B35?3FZ{s7w6tNP3KD913Yox@4;+rU% z>sQG*bV$os^o>)NF>}fMm6txbVX9?@6T0INh5rFgFq0oczD3mUW-d=S9sy@%Wr#~4 z!BK6^(F6mBo+We-Po8M5(o7>f-nX^9t+5FxXz8VQEPXUAIVn6o2e34(hb3P2dUBy_ zkL-yXjE@-yn;Xju$tW90U=lOqcR%cliGKTw5TuY+etj#1?0qJYSyUQ}o>h1G?nuwF z8d01}if{jKQjt=<6-U3H6A6gAEdr`L*p1Z|g?&LR%OS~H2gV#3_Y_G@6NA89jL$x~ zx2#Pq8nH*N7StGrg_YKV8M+eDtK7^}#SO!e5sh4GHyy1QBVQ*bEuyY7Eay%w!{c^e z0wK!?Z^ikP*yAY`K!$fE(59UO&eSBST(CYffy&Ud7TRzV3RkQg&(m37H?xP&MAm>x zJV*w0tlvp`mF`Me$@t1SZum2;3;xz?Vi5Rz+%|5rV;jq zfk~fc_9e>|HP`ry!lp?=g^L0Hvu zwoCGs%UD^-pa6dyR6WCR&G7?evFumQ`loKn!OmJJ4t$i#{u9Yry>jyqKtFYsUtILx zK1xqkNem*$Rh>o;Mkaa23%@##wh!E#5R~09Q_xFhXxbD|T8H0SKmJ?OACeIe1NMm! ziYG(IQr#V2S|C^qPnz^TeFtwFG91B&s&Ddu#UJ2Os#1#(r+j;H!>||0H36d0tTVaE;UbQoO5xQ%8h|&eggVQ>z2kUR~Q`Lc4cw`G(0l(v8u27ff zBhBNI@iy#{oe{&pv&fbJB!GnN7M#|eA%72ihN27V zv`#Q+fgK-_6+C~;P>@03NEyvFaJXy${+VbNq_8JiF5iIzrdm2uXjGt40099|VbDM^iPkO;_kb z`~YB^!KLhAwJM+W{YqA|j`a#0z(W#swB0Z0q7`u}3J{S2UMs-e(T9&$uG|5Yqw?#W^=&T2N6*+wKw4z>&5Rg zi3Py+^)(E(Mq1U_euALsK|dy!n*Ig;SZD(QwyzMwJcem?y>&cXXITe_Cv_I}ia%BU zw%Hh&+85`nLVDW0rV8fo+GZN!61_~9I#zv(sD|2}OuUKLIy z$-oc{SIj+=qwQ^tbq>JA;F|P-2&`KXtT|PI_2y`) zC0X4y*=|?0W0)r8?D}cZ78}A$9-R8ZBYv=k7sSLR9&xD{hS+tn_jouZI6u;1=E0j* znhY%nh5W2CjeZNGF(i)ORAZNHaf;g4N*A)H%x_c0Z!)GHQq2+`%+0-M9j~lBV+q6S zF7n*L%5WQm0*m)JC*Vk!f5EZf7$x`xS^{m6(ci{2Zd|rxey=ci`4G4kb^vP}?AK!= zCY)ETn5wmDWyC4&ciT)EaO?JxuTYn`+_SU6N_wo4*+`dBSRSn)W~D({|Ip%gI0>1u zXo|duo}L6cW57p6EP0WnjuMV~P_jg(*A1UdmAx+v`M{JFG$afrrQ~MXcc!_FMrq!Vm zXWVKUiIzuw`Of$_Mr*^t#?d4xduEDEPP*W#(3TxR|B%HW`$bTndGJ!jMVd$9Pq1dg zWFx3Z08$%(u%Cw;3|I#LX|yA7Yg9`l%mp98Mbl9nuj=E3iQwBg=<LdEj@w`)~zg6TYav8O}gcH`=F#C-SxmpVypcN@Im@AS9rSR4HzgXGm8`d1)Z2w$K4ygB!a>n_ z!NI95waXL{Fjee3kQTDhp5_BW+@ZEv4C;(hq}x4yA(&UId%1W18GXBZQ5|{L2DP)2 zv2$XGihoSZCcym_J^IKjOm5mpN!qG1{3))*ZcxzM_Goh_*rV9}rRfj6c9u?1qtvWo9C+q#W@sgXGo*gEyuF(qi~a*ocWOj=E5S=xkKN zHm)mh12h&jx~j!4QGM^738TxSZJ z2d03+)8DF@Z1KLgbYwnB{n_MkHvUrpc#5Fdpgq8c1cw_bdcr=_V!t;ezNf`8MYYg| zGylWKTYT+B$C>{DXY}LbkB}2qkC&cTN}CzouX_i zDxP(panseAw>qr@r%LMRZTj-LUt#X7)tWs9>2*7X?FZkO$zC0D$1 zQbNz`L`oMalC?ua^_)H1Q7$QgYKYs1y>jDWS+<^0S% zf{8bHHd7?E;M&JOlDh;OyX+wZ!F4=oCt!9pZeRF7WO6NV%wKodyknu*f1bx*NnQrO zPTPO~mvg=A2nRn-n7XX3X|o8%b&G&?IdYufRv4h9826+-0tTnUR)1-8pYs0f)sQY(T8=D9;5jA5iI zDc_6#{^BdU;RXYzfZ@<2ji8PF^%>Cqo5Q~-G@$g|p+vCAt4zlGVnn!KBz5pRKH`JI zi;qtXr)R30Dv1brH9Hp&{e@$ajCwflsMJ|VoyY)nZ0-k#ayo7Rg zD)0ztFd5+vav$d40D(YQdXJ{$IiONf`E-rR+ljiAT$;9M)^T2#>5f7PKFfYpf1JKz zX6!NCq-eZzcrilZRa35xr9L*@fM(hV@(nI3>6BDIhrKImV3Xu{JWY;DizB{1B+meK zE@AXKe!%zLMu&jSf&`#9Bz~jp%7d3Up}rCp4|5;cp4=Ju{DQ0tL3+YokIg;@pPHx=zHxnv5zw_{3at0*5=WO`}lp^CG?|R^mFCNmDbAJ5&6b zbgrOrx#=NZ_Z6?qgaqJ};XpU);TP7!DwntH>pSZuPV<%g_U@m*6;9l!bA7Q1oiehQ zV^iZZF$BO(0k;H{m;_W=SfJkTl?K94jn#}N4sG5-R>dI5@AEwE4tGu?EvitnFr{9& zyZ%1oMB31P#A;2f$4xiPLdK0AerA>Xr-nnYaFg5?my?ax;ta;bS;RC|W?#uV*PtjAaGpCshp@Cyrc8kkf~30%VRtdZwJVA#%k zoQ8&x@nRq@NL>Dy#4G6v918yFaOt!-*2GI_#67=g!Gbt{s4CCj;_lgIRbaGbe;7oX zA!r}k(1YJB&=bFxq7`u#E>*&MCzV50q0yTQ)4C55hXp^6um?Wg7`TRx0xzvBhv3_W z$0hcj_{_Sd-(!@cG-CXGnqD4)(HoU#1DfHyUA!UA*nM*e&8)?uT+G(O3+N?c^WTX|36;?1I+gQckMzRpV zAyhM=Eot(VdX#UMVJ}NiPqNL#V7?gBaZrSCH%!tjl(Pr%?dXdQ4-FrTT6d1KBzsjLLg>sqWeML%ns43)G;cS2q$BzQ+7z*hxn5CXXzZ7q zop`7%==iK>{FVvyWg-ozjn96RPG7u_P=RNtjbB{Dew*TBXVJOm6nyjXmZ|yJIk)U` z`uJnf@Hhvb#=WYz7OR+e6^Et31LAxE<@!U;9lG1vGb)TNIZozkiDD^8-4)G?$QD(vswFYUext}%W$xEyIYD(fXWjMLGWCTAteY3Fm9(`zL9p@&r>XsxZVEF6OGa5-O)@rErN<%; zz!Y5aitXvf3!^WR%LF{!5{Ij}fqM|1yd9`VvejS3ToJd0H2RUXJ zn5`NGCDuo=`L0aj!GIIKOR;ZkG^LxCZ4!t6lTkwMH2-P3Awj*v!`{y-x1<2g*p9X_|nDur4!d?gU7hDH`~ z`iWtOer+@;2^iI{k1ib&T*X3&X*#0NkX`C~`AVt`Gl2DxrD zlTs>f5&L$#Rxg=`t7bVz>K8+UO}8tP2DjbU_Y3pMD+hJQJ6j_2ZFRALstRwfF?-K{ zoMXvet^a^R5GcR=?6EAMq0|j=8NTBpir4LvB&TxD zTsk7#w_^g3rkmkv{BwypIdQi(;0H{PMpsWixWO_VmDJ_koaKB?cYI~WjJu;SpWpa) zB7OHPw@o?KX`^H4<_x*54LqTnH-j4y{?MgfaUaikX7HB@*< zBiuf!bN@Z_^zwb6(0OWj*PoR+1-WRF8vFuLQenYN5MWyjH$b8=G|BQ&rm4e6(Y}}4 zED01tv5|6*GK2nZnrdrrm_;H=eExw043Vt_KCb2K7VRsK#O8s8!iQT>pQ4j|%luZE z=M?5ib>Uje2~PWG)kQ%5XQv>$oHd{w-xIU}61N%vkq(c_$}ZImyMxTNA6b=YGFhUT zNX%afdMMNY44Gm>0IEzbvbA6U)BrugLG}$7TFa0H^xsG3eT5MSSxtnVv$S&I8y^eU zAsvHeL~DwU$syHI)@Cg65o;*BHsVH4M}gs-z#KKdg>^}bg4Di^2+HobMvzyk~eal zUc_ktbQ>Av>5*yMS%)7e9R2#!fzT0?9OqP7M+$?*Qe}WKJCCoMBzfDDpcW&$n{g?;WvGZwOvb(eTa|B zJ#*thZ%hI!teiU)5>Bve$gwI>8nCt(s*x3e;XMj`AM&R+Ad|C3CJUJO>j^nT5ToQ@Vh$RD3A{J>HoQ96C8y_(V>e`^S`INGd!>wP zpN=y$b7*0`Em|KLX~kTOczEQkQ5MH0=HE%zK^wp7_^Ydy{SLy^Z?@kMvb}v_4j8? zRwn)c=XSeN^LoM?cttMsBXe(C%OY2s6f?H`cpH$%T%L2nl8HK%e6o?@<&h4RuI4oz z4c%6_$GV(qcViNs4cyaSuUbvq_v_V^7X|qmgCi5)bo!%DW;!%+iplP7p~%Ycqn$I= zS@nx1xS*DdT;q+U;>}dZL9)ieK~j%ITt^}-kQ8?5HXV6k3bg!6L7fY_XX1nqZQd4D zzA(VsHcb+lg;hsF19obH$jK70uyaVPap!oEnIsvyxg1}})!&))iNMk(On;cAdt^`} z2JRfO7>nvpYNa-8G8pT?69SD=lX|Cz041JevmH`a0g#=Myaykg zUeE0^jxem7yQJe|?3xzSkd{8w*C7~eVMqMV$^f^Vyq=p>)jabVOsyAy12{HFYJ`2L zF{@en*v>}8Tfcn=<}EP)bdScgy!+#dh;=M07s>$gZ`m@|(&O()MEwKgv8G2+8Jc)1 zDRK}FBQWhgO@s*B@mV*pNE7S{AcPcA@rKt8)dHd^!lqK*GOU*ZrNYc(*3)key2()E zN6xOxF0Dm(x>ODZ)9ISn0uuFG`op>bIDwDU_Z1I`%f8bWkUh_ca_Pu9*N{n@=G zo4zO2){G4k5K9vV$hV)#5t@M$=&*WKC=>@^@Gujl$07SKiay5gnlmKr(_hNWq%~E9 z9R@o+?{QTcYoD9&XVp!nPlh`q1~<{xaGp1sJtb~cbi{O4R~gYAAm#XF&ePf27I1Id zcxFscf2n_ZFkIwggEm|uT#jO|I|C(&ZPIp`&sOr$2fhI=`sSzW@o|IcI9z)thZ>xh zaNF^8xFI$GNjZTGy?J*9LO|{}!nDBpeLUVgEfE?WrrtBt-GCVKt5M>HZmMH##g9G% zZqe?pEtf_uxs-lCU8th{5@fqj!c23rp}H)_6IGs{i8#C#-(%wS>Ux=y0{DIC9$03G zul|^pr_}fKEzv3QD=iXHNu-Y&M8wu<(q|R4Q$R|(*+W68m_g2 z__odEh~B7w+>Ee4AX=el*k?HJ+i${&=p_|GA+b(`(8$Je)ok4i!$O1V6vo0Vs_d<7 zjIMD@ycdO6#m&q^5ed)_j({pKK(&*D8ImZqTp<(d%0G9@ejDf2uFjT`+%Hy@I3$ zM5hkkRkY-Y^F%j$3~u#q?w~jgksp|C9^g#MH30fZ9RSWSti1SLKyY zjjtyQ6#YcT#NRGh7tg_A`;^XU>4eMRqmSVI6@dM3r#?u~Q{fwXYlSthWtZNlKSU*n z52bnY=D?u#I2FXzO5L%5Re@n;h5!km;X`MK8#Qb9FypciSYN55`8lqIqfIu>J1I9i zpnfWS(4g;yZ7$a8p%WpgFYZrXQqUyxb&R32#*xXg{%euIxQ6}cEGRY`xg_Gx5hPd#C*>*~tY!1-h_{Ih;3P;rvE6$J|?_>g(gi+BA zwgXE?LLp|U^P_#>6E8T^)G(>*xUpOOE;+_ox?F4%&tkspd4lICA9ZLNb0n_dPAFh1 zIbC2}-@bvT`I7O2ja>4jLQ`DC&9&@;8$XEUDOjVdaJ7X5z&~vG^*iK{h}kvVEp~Zw z=V!zRhWKIGMajz$E>$xeZGDsrWj~x5I<6<#HM*Fp;ZI^Zl_9{uDr9vTx3-T?q>&{M z@Y&ejnIo#;aAszHwS3+0d-j)kKR9{#h&)%h)N$UQR+5i2Awh+@)=bm_?r(<}AIFe> zHJ$M^&EH!4Agw>K-hWYJQQ7q_i#ydJiU_s>{i z$3~VEHhLANBT`d%q)|o`IF7CjTN5~*qY?{rD&VE=aOZ%gg%aeh1WFFx5N&+fvUX_U zhEc=e-77ipJ6yz?V*UnPn-Vd|uX~YoEF-%@40cwlNmems*i5-jgomIrBDCL4W(`f( z(s&`?h6u9mdA2!k!aAbOV-$)l=1ohd!XAk0V9PsELm}F9%QYW^HD~nXv*Up)`0MXf z)sa0ZE~7YiX%d8US1Tv^yqsoHzG$P{0aXcT`1qa@`6Xb?G{J`4E7mwXH(r9MAeN77 zigMJsSVBVS-M%M1nc+I-y6FYPB&-}hPP?fN3bqhclbrKxhY@dx*`R-gh6HnaF3Lcz z#D*m;_qeg=sq{++wdV|j6=GS7s6y~y>n%bJ+0hUskReQnh{C2Qu^%lS4?36C`~UX0 z=oAm6_4ROT+`bgoEd98Obk`DO8+*zW6h{~1+m5&0#+&H2#_NppVQ}9Ms$u)Ac;x($ zL8kaPVty1dFU=9!$x7en6E#QKKB9tB4oi4~Z}noGLWc&fTQJa>+XE31Ls7&K(8MLE zFNFrY{)-PqQBtS;u$0#o@pQe3K9$+J72(nIiTU-G5_iJ$oB9%5uls&$-6=N*KxhVR^ZUmO47OS-n#PY^K}GqJy9{A&W& z!8ZOBV><)kNa|!lE8uDQkXKyokh)nR1aTs2e`xI1iCw=A4i-If5UQ(5{~}7$Qj%-9 zY=)FA@do;Nd>6Uwr2JY8KR+&hZ?>ur|94N}_ng;bm379~zILKYEcXqyfdTq_?REQU zQUs!fTCzdN$qlapJnpt^7Y(%h=HmU#63273-u)|Pa-a0)(jRr`1IUK9_uu9-bY{kh zJeMzD5WbrCX)|9I@l>`JJ`^C{2?|~J(d$E|c!U;o;F3aOa7_@#05XgUHh#8RKnt+m zP*ZHv21w1q4n}7R%fS{}ukj2FuP2adqU(Jf?xvGsg0qLw3KBK1bwSXT#^TUaI8;gOFB_#-F&Wktt|D)JH-NkqM-PE9R)Bk(qp zdasVG!iaocDMHEGq0)rSSZ<=zJWfjZp#>up@GAG{cJIh!uVwC6B=||sxPJx;u3kwf zvM5+<`-XB*s|WkcDflyb(+v`2!HcrxJfzXut0m;nV1d+d*l)Vzfw-fd%IV%Bv-Vx1 z2Cl?Oa!h_jJlP@6AHHBgG}FS}2`-dIGcec-R=%P%_PL&KsKA!`V=Pk%>I=D)Ub z4>eP)s{=34yQUhiTA#3D)tEutz=C^tX}L_lUIqO>W;xxpVGM z(3-kFknH)lm$C?PH2{M1fY;^Mv3^{=Ah|+O-9X$;f@%SPcBzfI2>(+&(lz`TyKP9ZSR7+sK_ki9S4WMDVvNconktSmCgPOsYkrM> z0w#sWt-k{HED223&f|12%+`@F?2OFf6*s!{GnE+&k@gUU)|aB@brO|Tn9947-mT1= zOFISyvK!VIOG2xm_BQix-2bw|2Odb_J`~2Q{A&OEWz`O=v1UWE8r0I2PHKQox}q&C zYmiZvt|zik?RpRDqb@0Ldr(n*VUkz5V>K&3L$BSK(!?%Q3H)*~)%m`?gir@o3BkP|l zXtHgA$6t8xnF@B!Enk z3g316w-xqF>n3RSxd37h28;qc#rc68ql5&Vc0{$$n0J=P#=hlfBt$*tqjmmL26f&s zPg%&}s}l8nT^JPHSAaGG%tow;5qd8|s!~H{(6FMzuCQP~$E_zc4v3YIZF-R%rk_Y$S2r+;2}sNezwxtRM{hXDcU zgl}Pn2oVg4WzQ|z>1NFJH+hIc$hP+;aaPAp0fkbN}o^N2E33e5!IC}5@Mh$oi|GI~OhMw9P$7+V~ zwqC&`^^ggL3dww}eX9f*l zgQ-&n2|+8K>h|!j=y+&wnA!FqPhS#WuS_f2ikq!$@aL;j=$F}5?CnS>2Gjg1^SQqf zvFc?}%-=_F?jD2AtC?9!2h*b#8h0VWRkN7emR9L%lGY~cZCfR-{U$@f>*)hSAw@(j zeLtmoZlgz(WqQo-ziBHj$}x^?8go~fCURTRD6V2wLDQ6VX3XU)_N6ZLQ+Q*zd4XwA zj5XHqI!#z;{m*_4V9fx8=$+ZRw{1x00?|i;^vt|>|GXGBwnTjpWrm-}=DkDuS8_bV z7!nwXW7556B~P7zpSP~ z_PI4Ce;D32XZ=v)4Sq>VbIEPem3LurjWKx*#qn~b;_V^_A9@=0Bq}lIxhabw4|{6S z(|&<<2(q(cAqnW7q*~YK0rWx8e#~*&lRT<(j659bIbewOV`kJFFYz*IMl(7ebBYd9 zYa1PMBZnV!-rq}PMWKIxc!+fN9Mr0;`YbsBc8yN4AO+c*F8*fk2x$*-NvLmrX=Z_T z+rsKzuv_NH%B8v_VeV4t&;Vmq<9rrvQZXmAn6+#iW)cnaN=sV8OP-?5-%s9cL6sCNf4x4`_gwz88&&hVRF5Y z>9rm1;Br(!x_icNr|2abc}Ciu`sx-Ws@g-@M>*Is9Qhl^W^t2uP~*TpCxruQw)}vLu5dVHx2X5km)j`!~z!!(0M4M zw4bcg$Wx}`gXwS}Pu!SqZ|qNu95EbJsQZWIgEOK3iuU}9sD5p!?=ojK=q=KD_(+PX zG&!;VHDIUeY%b~63x3-NWDZFE{xyVks*oHEyc&why26o?&V3e>Q{6QsrznPw zuJlSK^byc(?N7}*8?RycEswv{l|?KBlwD;z9G~^P!S;oLIMaorU6kaV2MGk4|212+ zakCR)689L?=xSp?S~{PKEBkgN>7A5B5kcQLQdM2rn!KD4sqFpmp*jgVY)dlyHPVB! zk7#mCxFxN5(o@Rk$UrX0%@HOrO`s{Og=1ZZsI~9UQv1|t7h8Fh=A~hr@JOi%FpsnU z75a)mm-X@lX<|JCyXCEx?027G6Io)HCx(nn4)f_kS=h1PJczC|5^nNy1HS{wXqC4= z>jv}+LZFOR$(55fxdkZ)YPpu4UP!7 zv_a4^Wcn*+f>;-KcGv}L=2wci{L~t!mT|k*=z%*vL}Fa$0nP5-h8QP|ZnQjwj>=fe zasTHonP?o`A7+{?^bsXn%S>^A^z>H!oa^HxXY*~b9V5 zrgXM7gv(?IRCy;iM2tX$IR5eH!;OxnyNR13ZXW^IKN$mafg$)Kem*uurTnzO<|Zu zLJKBi_#@Ok0R!^Z>P;B~8^oHqLobH7rd*KTpc}3~pu^)ZRbo`h;qN-j<@Q*E1Ae%G zV0d_zZLk3Se3VNcJ>$1KxcWf};LA4+wEX&3dO*Nv-qda($T7$s3%9#>s5zq1JHQT zUFL5NJFP?G7fSE!W5jozecA7aweBLsAb_>O+H7+9FW)f6L&S&tGoKAUu>}TXKM)_ylIo z_ORls3qq}Mr^+2&93i(>Ao|E*uK$4qG{E{=d+=GC+@02rK~G8RU*n~rp*b+MK&WA~ zB98ST21>D+M~+f&eaNJC6qb;(--Xlv%-F$NL{RN2>XN=LDqjkjPLxOcMkAYpZX}Bi zH*~v*hs>&YwXys*^{5m~8}0caSYN~=qC(G?i9Z5rC2`GBX!f2koOIKV99!ZyK>HcS zWv!bRl%oNaF`s;I-b#uu5_Dz&5xQ?&W5U+`7zZTS57U3SezJ9^T$w`9qw5z-li_%e zc>>fp(SCqZR=`RyiBMT=Yq)6tEPk~#R0AT?TV^L~kbWK6*Qo6XR10X8$%@m*M=CBZ z$iQAE*absBKw;!zYC5dk!u(K5eSneYK(U815D>@ykS<2imE?T>+87HaIdC#|X^ORy0(`c~6P&{9d1F>N+thzT@ZcPdjJxymYTmu3I`{*Ts41bnrWCosZ z2Lpg~Nh!R4do##$YitYpY6Y$Z^n7)&>f<|KgyXh()mC~~Q+92+Xj1V5%vPz9RjVL( zMWpMPxn7n51#{_70?7lkqu|1+Uy)lJR7t%}z`3L4+N4COTHNe@OO9&yP#tup#1`Sv z;)XYk4jfdzLU;2{Wh$OVZGS)$UAm%C*49|7tVgw)E-9&el~Ye=Koa%;+W2wz-+6D? zK)fpxR)8GlGRpcfeYUqnSL5LP-jR#IF4slnnApMK8X;Z`7?EQign=R<3>*vs>KBIe zq4ew9b;J^5m8q@&i$)RU!lTSqpLtv`M-=5YOMh04iM#2^D)jwuTz~F{YzBGUM>1Tx zv#e`VnJ^`BPr7wg!JX2&e04YYQB`*Ec{1^gy9W34t1=PSIDjhjZJD<>zRP8KO(DzF zSoc+Ptqb8Y>Y`@@D8FYINX}@A#ECGl246TVQ(RROSW`%Y9}AE&r&n3)^&4E9<2h`2 zziqx&ufd@~q*b$CU4P?kkv+RKY@1lY&ECPCrG#Sm@1Ng=?OB_*vja5!bC|Xji+Gxe|(pfOD$%yj99* zTmeJ22u)8Md#?bgllSOvS#nx&%7rS)4gkG&t(bLA>6efpI?WrO7Xig+oW zeT?Phf$HQb#JbPOiilI5Nn&mO7YZU-)rk2Hd7IL?{zcGQ3=&4y$Sc=YA0L4H`l=Gv zU0_C=6Wgz3)_)f+a6j}DM#9`zK(0p^U~tlZxQAb1_y%8d)sPDl9*Cl6VS}KCYv88o zc!eTWh$ohjzMXsPIMcA2C!=>DKmy;@PPZOzd|ATdtROS+v6Y-q zRha@}nf$IZ#gnnDC43dADe@TBO^BJ@%IguxZRy3WD9s(Ls*TwKgxHjwC}#131c9cI zJYe~T?0*>${d`6t!XQ=a$tP*a z@N$VC;o?xhlcaS>|0aKW%05^7iKmnyKHa)|1!10>{mqSfJDdDnIPG zHM6v}yc$bv*cA}TivJGXiz9fcaK8R5Ezsv~1E5Nr(A7R}1pqx5;@Le~LOKI^8tg)p z_sn+x3tr8LjX(uuVB^DBiS93sNQIQd(>U2E}tC58Gr z4>3J3&^4d@BjBGdEJ}u`i?(&H1j%#o<#NKO5&ra3-3 zu`L8r9KPz0j6GD3{>zNG(bQGW&`*|okADM3r~r{@Rq=QGmVSOV%DopYLm| zWcAv^xExJM)ajQw-*szlH3*v*BWC2d{EPc{Dnehi0HC9p2pE_NxV+a-1uXald?m;Ji%LE(?cP|TC89}6Zd5>zb#)K{^Cn)xOZ`gP6UyU=+= z1xNVF9X>b)_QD8hZ+3U>#jW#qr+<*MUvBIV3%8ZpYQe90*KZB}#q4HyH1Zitz6#D8 zLzgy`Kl)3ykPomF`Ji*^;q5TCcJeTxEi@|vC{b=;dgY=ao@FPNiYF%A1;YsYj6L;j%IA5PFsf!_Pv_Ji`3Y)mfIIMm51`FO1Lf%fUGE=nt!>j2PmJg zu+lrj=+CCT$q&$~hF8-`G44|1F0;5XJ~C{yQEN(7B-@yCwv;#GyXm3|O?{=vRvLC~ zyE5~w=w-Febx9yt=NA$yq~s(S5)Tv*(L|NtT;*grY7agl6Z~NJxHFMhH!-x;jHp=c zShew9D%ZZLXdJaG*A0Rh2PN|wI?(BO`X8iI-l%T>Ub%IDBS2JG--p}1R6 z?(x85v1VgGdgop4)4B!FMFx|KlmDmh zhETuMx_Z46am=4fj0~F#2dVYMqj|X#0NrCLe6;1RFt1ZyM`?AY5`T0_NTIM7INMco zHj~BPJ5reYB6k-ENLa55$Q4@#T`;6x15k@6KN@TrYsevC2w>QpZbGLGn_+zwSGyw4 zFbtjP78BtVXmzmA?*v0l&iWW;?b?wSqTt1@hy{pI*V9h5U}L2O-xJ+6TyO$R`9|?Y zuSwqIxV;3`hwg@Clz%RBxKK8g!LCvOc~~kuD41+)G1x7G zVR0p*1SWwv{ud`h%BZkjV{(pYtZsYv9OOI`)bbblDN8ZU>i;xmnS= zBMBWAeIFT{NJz(||;- z2wv=sRFveUbI<`2<$SMfYz3^Fc&3g}*(|8p7`jGnr&x7l9bPx%t8|hYo95kFRE;i- zGfO9i(ce3ppMOg__3!q7{n-}~PKW_}my1=OicAiRod^wt;yoG|0{1Y~IM7a+#g#KH zWdu+c)*$KJ=9f|IQ;zg$(C~LU1 zFf6TN7UpE&n_OF_X>!0`Y-x2!6KR@*C2`mMZbPPJm708NUhY1~pC*M`p>+-8F{xZ- zj0DF6R?vfX!P>ylM*h~RGe+Xx>m*502cwpSoh)q;ScsnC%pL7&|J_j#C>Z~u)(Ztu z5Ct49-+u{F5FQhFhV$*JN*@P1F%%gJEG;oH6fqPh799()2t40% zDm}rVrHg^#^|R#7kmc*9lFmCCi`w0<6h&Yep4RT7wn>r5`o}!bEk^Mt*8R@!Pt)C2 zcb9o}vu*fRCCDixpbm^k#e2m|NCJ|8#c#zwfqz*C4aJb>MfFmegbX!%nMX@(QM#qS z5{Y>5ZrVpTir~OuJ4c~NC=xG6BS-ru7%68}!wQ6~BY&-~_Itsa9Y;u?FZ?dF`Wd1i z!N!A1mG~xzf>baBJz$7}C?yK+Ylg>h^fMA`(PgK z`7SUby_)QO8Ae^;t3#U{)X%2+gzCHFU7r1^$@&1ADA^JN>Lw@Hr{bWt3pZLA-N~2E zT?rzvsJL*Lbcb22*uC!g@tynT$)sFo0e>)@CfL%>)~CzS(a`FpaDqs|%eud*i$2Zw zojEAZqt78IArcI{!zRzwE+|u9Qhr~7z|sTWKO_EkaxJr?t%^_67JNdM;H>iw zj$|%c!T`n~jkBa06GaV4tx;D#g!xXmSNiojpbN{%{Y50?IKq;zXC3zly(+BVE`P4E z+H`=e;;qUqij=F(zH?~h?_&%Mi2Ck-R8tNI}iM8^FaTSn5 z!{$T>4A6aFX!s+%B4u84^8Ijoy^{)}zefAkn*v~H55Sp1Ya44zN8|pC2 zs%_J)>`5%zz}fuO$}MN30aye}b@mKEJIny;<+N~;c4S=Vm@jAc`51<~EELt5AppU) znzyFFLZtiKzeBrd&xO=Y>gry_1%IV|Pf4GmfEI3P?{ZS60|Q*$qBk}-A%7xsCp9o1 zOpiKyEMP#8JZmd0GfNjp%)1CeD=FJ%fvcszOSFFHJFTF~u1&a(!$^y<^9^Mkr|p;G zgQF7o=|VU|?~X8%W%HTg;uPzkh1Ky_sh?m3wZPN4r@kB^U17oh+p(Xa3IxV6GK(BB zPNA3K@1dZ&fDfOmUR^}=I)9jgH!jhuvid{N9rJX+tLb?4rl#ip7wRV4fl%zN``Sk$WujLYeAfIgt!&&rSt zGqY+Lvo6#%)f5~q{=;z0;bpm_W;LOE`I{sxm*ss|6wfyh+5wptbYx=z6?D zD(}*vU;_hZ1LNWt&wp2~-n*d50+YR@w}s+^Tu{%3l(vK0qeYZXDFPkVXStAY8|{&< zdrf`B&r*cwBflLR1qfdYc(Fk%(=uu)^2Kf^qK*ugAT$FY9(k5!kU|d+R)^>+UrUPrEIHgU_V{3G zI!<`oRbWC~BJa$*pM4D=UHi*v@y35hh3!R!~tm9O3YnYZBN(#-Wnl2<(4IhB=kjBMepWN zS{pc6>Ov$PO~?Ig*=9rGPqOApWhMVyw3nv~E(qUsr+=kaDx{k1G$;-Bpbi4sM?nJ9 z|MCIUkvV+g`e~i(7qMdvyTe0y@4T<5Gq}$@<8y6C@hVqdy-bRXS%LW>8MYK8ue?3~ zH{7H}QO8CoR>gDP-tVU{N(xlvLLch|biS!wc8>nRC{(ryBO4@*j9jP9iWy0NE=L1_ zW93L*PJdWPMK(AMepijYI22ZN(=;XxZVnnOMM{bd?b#~YTbzC|jhFGYx9|%1KR5*H zdnHE{J($@w7skiPn zja~BcQx znC?ociTJ7BvWd)~;JmiZ6qMvP-b=r+Nh69}wAun$_D`k~Nb6kvz^tw{n#)gNli^$R z&VPhRLn(Xxv^Er=E4q4O|6%|G?}U5k3ZXZ>dj()h?x7^M9CGWutZ5bUf6{q2$0k5| z$hLEvuR@GX7xR0`jlsmb$;pzhT`t0?Yl#?Z6uC}*jj`sRN>&K%T%m6k1b7~X?gtb@ zHvY}7%CjI&DvVY6T4?DINP`mn==cne7z0n95T7{WbHNb7yA&JpdT|cOP;zH3;`-YK{RS~Hyb|?iZk=VBUs!i$ajGpPOxQq z`3gW9R!5F;01ZYx%Xs&cWwE}=;BxKZqt8)5syt#JI*mF*ex7@mhlu;9u4Uw_rhjGc z_D03dYOi~X7z>_DxuzKR30=W(zi!>PnwhOc{O?w^u7r-R9(WfZ=;4C+cXjKN5kxp( zYGfLk0cZV(w5|g66;(}A7+g&z2W)?|)@gmgU7h_S`t6HFuXdo{WBwun{lO33onkg& z8R*5ZPfr6n#3o=c;||fJUmlHb5r0$8R=4B9X_=I=`?+Ss9Tjjzr|V=Fq@=2DU%4F zU4kW~Y7E}=WH>;ac6z_%G~r|J^rVj4M6Bsb&S?B-)0PvJ_Q{!A$vysCv9A;^jdj+hsm~Lr z@s!UG`b?*$nYpd1q$?)Ue5Az#8Ely3mv(>_H5Z0DzTi`C}mv}u$LH$E0ijd#a(LE6 z8(&1@BOQ>ccsGQOB$H1rqX=?)inlZxeAb@^X~GFn=5lr!r*qr$VBQXS7DH zI3TB;#ROD=r!;wg(UsZojy>S>-R* zU2hCE$guW?JAHLyGs%A16{?9;Q~u#Z2_bN~YtKj6K+?w?&e-bCd}R*3W*K8YAkC|& zP8|8zK%SMuvwvvJBCW6wW}r`}<4o`lRe7Ssf{cQ|d+~Hby8Sq#vH(}_!LnE&eeVx5y2DKW55`sIXWoRp*dw_GJh0k!6%>OJ#XrWlU|n(6FTh; zFXBO5SUx=?1{=(Fb3^!n^0X^7@Uz2Oc*h04nvYah>&&iO<&)3ZtG&Kk7j!MWS&|g) zQfK{+4VwhZ_r#K+-ne0su-rT{VfV$+1_Cmdjr#pLFJz9DU>-qLHMl|)cN1!a8M;^? zU)FRFkbged$X(w=uT}G1nWjBs>nP`S!uTK%+7dNCF6AMX9bnydENKw(*x-sDAR^Mc z|MYI=dU=Q8KdL4F8aOa9c;DLw83=}>*xQ87ZN}EbAxKD?u75QUJK<_!ZGVfScX+$U*sLM`$DJFf zw?9I`gn))UKos#dH+SbYK`eI*(4$;zLnk|M3tI~x&l&0`IfPTs~0AL{snd}a7&56xg=X`fCUPR!uh&O%Yt_-ZYnqq zi+^-eHk`bRgX+sEuMGN^^0hGUg!DP9)z+C1MDL*d=+rR4QbctV*jLM<7O`)=@Do-? z^cQjoCWTW1PYkLqKpS=<{8h){tA(!_S_4#p;b(>Uyi47$TFj#^Z8Iy*?oMDsI%;z! z+!Tl~Q>i@XYUK({X3jt z#{m3FC&NuavPJF1Ib!Kf5GnURpns~#xVps{dysWF5Tq_$qHPu6rTi%ac-iSI4nvMs z7spuFmKyxZOEm-k2b{en2fCp`y-HVxm%>j!b?pC^S86K<XTB63Q zuItCvKaT65Q&cEE_P4qlE233(XkkIp6@wq{N}$T?%?SX(4;fvEUa|e zk*dh&-G`t^Pey;bR3zG*y9&)QdPyy?YkGdkQd9u2ED}Zmcje{lrZfDotsC{qV0-u- zFp&+tiyj;ndZ5S;^Xi7LHGlV{BN0FuIRtwob7S*RxxBOgt%T}8B%Bm9AY>(=62m{zU(Gc;KNq6?-3u0$hkBva3qLP++*kW;!*L}NlMCi z5G7PuS~@+11wk)l7#!+WE)`hH2yM})VaW^D?h1_}rjRW~!y5gV>>egL^35V;^8jKm z;T8JBm>8aqd9MReR)1g4^j6Em?UxHG;@7%I`DsWpha@Edf+f-^(#n9e2Q~J#+B%Cj zwv!BF%lvbOO(uh=(52C@F{%ozJ4yVI85|*q3@5#kFlr*vVuV?0#Q4~+Ovn=Yq*6_e zC>E|bCR^@s5;=Ha%DhULVW9d{9mjmtm5-&TmGznN1J!r1*ndWZwB>b31F^`e?)JJ) zC9UdmD&Q?v3@86_1@M<;D*ATO5X_a&e2Tdqlyy{sfm+9!|CRiLmr*rRos@`WwDz65 z^!xgKIAjN|=vZ5RX=cfxP-NXz=Fv=l5T?j+SKS?Fpi)ZC@9}d!H2acc z(4}3{yY)e74u8oNFVOAS=&EPb{HTKR)@KQYJ54WPjO$`A0<7xH01R@3snlcz%3wCF z_6zo!D=@z0U?EuX%KLl@*le zva^1?5=*)@GYoMCN4=T`oPw4+Di~o=rnjFlR|g9Z`)VuMJd7CTD$K&#_4ztg{Gr^$ zSBa`Bpi-!X|Ieq9!%mFLxkrz@PYJaLBO);3QtEK>(Mnx$V9xCK76KxAGH_irk&Z@1 zIr%?!E`Km3=sCu)1+>@FgF=xI&O4Dy1URJ~OmzT1vc{4RgV$yfzYix=Sm;7S&|g~j}DR6+)A zW8xZq(V06I-hC8|K&Vd?jfHp3op%E~QN1q;{C`;EQ8VDJq?PWf!}{Bu(#HD23zn#M z-nGt1IZ;>w)4~3W6O3g0ueRU5#L}ZjnDkLk)Wm2dC?MdQbgy@B7l$4>Bv|)f3Kcro z^8N)&s-O%Qvg(s<6=peTRIQ__bJ)+%l6hbS|Mqb{Xga{zxF`X#bX9T@4SfEn6ibsf z#DCcKDB8R3DDmRI+LHS>Wa+^4?m5ZA4IIhm$zKW6bz}#GHH2V29^FF|+q`~nekbo4 zcT4UFD5mYHZc*C4x!kmL1a$ua8l~#)B(BZ+7W56M>I{GS<4}d6fmjH!;6mSrs*r5G zfhf&{iHjP%N_u2bL5YKbPrjf~%kHRx3hoL1ZLVNTLIQOS7Tf%2cGny)1|NijHe2_0?@S*>`4$^jaOmh>9eWx} zING;M%zifWDuBTwq9Xo#a@rw=LK1~Ar{#pWRb>*so}k|UYC{W3ayNI! zU$!62y3cPvQ_O+*9q!pR?YR8(D1U_+_O{5VpKspxahztcg|DMH{$9i!NMhy~F@D?8 zcI2^YrZh+ST~VaV4yQ&BCIMY1+I_^Jv;hu>XKg}ZWFza_G9RzqSX%4L3`nPI1DBgd z9T=lPM%$`VEsJMBZ3_#o;tU&R9hEEG^|odH?z}RzR-9{YQNJ9`us6HVz4sYTkT}BEd#+h(ksrH7~SyZXR2ym^=i5^pN1$MmR2ob1KM^$!m z1kHXhM11^THtiNvtBs?SdY+5)93$10ucXoqe7a-ow&o=zjAi$A`kw!mzrPqeo6;oI zih-z-9jp-pSA11hH(iIO>wg{J^DEvbxSFo&w!c-a#~EHxQw%_;rOOD5l*-|37Tn`+ z6EGWGpBaW~?D3=c>~7jHD*4sqiLl-QdeM>hQl*+u#$piP1=fJv7@_vB8kRV3tAohN zN{wmwK6hJ`FD&O1ixW%GtZoZYRge_5>DMhY;OcR>`l|k!f~GzUN`FY~k5KHRNCkk1 z_v{xlP-dxB^h2|LrSrH4b#Ql&0;Aqr=*R;AAi27f5XAmE7a07X!C000V_W+x^3ffq1<5Io3p2`J2850Gx^tPrge{B@PP zAyK7~@6}<0JMx0+tJPiy`NnbFqMapMGIz-2Du1cK?tqU&Uf@R}LViGW>-AQE=s|H_ zo#A6^NUiS}Z`oHMoLTe6?s3sq6*BsQqEao>NQfMZ<$vL?O_?rueTptim0$yRTR23I zQ^m$bU8b}TMM%ffvO;IYU+Kh%sIP9Ksa}ZGw{Lfjjk95v90M9(h;3#C{GXiVzacDW zW~y6PaQ!@WJ9rG95I9(4>EowFDln4B|5q@5_(;vLr{oTz8>SoV9hh?+2dZmC<*uuG z3@k9Lzkk_4y*z})9cC=8c%rDod_^DRwAnR>n%El+xX?P{5e=HzRoaN@9rHYB{H|}OybT?7l33qd#GvrUz&BJVG4c*y5pi*o~Tyo)$4(UID{N~UD18RrwHK6TXCB-mu zA%ze4{8um$jCx0saAyp?R~J<8&o3zXbBC0D*MEG4R-Tu;q!Mkvs}Q;CCsbCH{Vrm) zweZcFssl-gqWo3E`7X-w|F7f|x1F38k|KF0a)^khCm1f*rzQXHoWrjZGk%@5QdiN> z_Ud{F>j1oSeQDmbFZu-?Z(oKP`3{ybDXNOOPKJUsB8R%cg$BM!LQ)IAbf%}w7bYZZ zu77aU${B`JdeZClV!}Z&p89<+^3O!6ptKDRSRHK*`tW-Z14@1ppJU^VxRj{uY6{x?sX40BA%pXZ@u z*p<65sTJ4mCbFn2itL!E1$*KYgMS7CNCrJAe0pf=h7Sggs00hvQWfQgHu4Q7Dhi1C zK?4J_Z|rW|gh8lR5A%D=19#pV} z%6(%9R}6A+?`1YCF38nlFDwlZSK{Wz&~2{bV1U23#$bL^-*!GQDfbWT`%#JD(x7f) z*`UEXF!h>qk*>3Vqw9NH>>Hvi94RUhqP~dVS7he9Bt_X@@p%+Tgts~*&$#Aw1-4>8 zY--Ss5MB7WQHEC6Q(J>nf`8&`73&xEdf=YBD?k0gNdE@|H3lNr>Kp^=b5(kZ(Q}ce z>EJT$Jeo?mR;8wji!x+KxKoqilHOj4S(TK{(Ia#euiWla@VuyOHVYn%RRE~Qx$;7# zh%I8tpMG_dot+)UVJG`rpFewj@JqCLPZyB&3g}T+a4{g=m$LX8cYkyNCJq=PFj(QR z7A`XqCco3L;_ePxEn_gcF=KYUQF7CsT{i*>aG~~HzKX(X5mfed+RqVG$&`C61bxu( z5XW>?7XwvYuB(`@XijuA!v$A4lI$QSBQ`d$EzqOPSf2)v8ZhgF|F{1~y5vfg?QFJc z48BS+Uj-s_Hu>Qz1b^WC=u)|BN2<>zzSV4PIm?$)a<=3LQryppld8zJ*YsfloqmG5 zckS1H@k$rRcBP>ixpxesnTw| zj@iE&Ec{*_`Lo?&W%|PJ=i}-XTpo1APqO|skwA;m<4hk5N}x@#J3Ck$S34@n2hxw+2zWYxr}^Ir%rYnsjTia09m_qY+SieMmqq>WhbuaBbxUZp!2azB<|MS*xxztlB6O@*%lr4gWl zhYb_;BF1&G@?IkK%#}xFS^5)Sdr#PLryLDOsD--z`X0>9Wyf$aS43xB3#vSFR*Z zj&q43!&bi55Jb7vG6hc{)Ljs77-j4);I>=7_jZL~Fj1J`%X->WD|}UJpYAw??|=VD z-$G55YyCedyxF|rD;ZBtO_}f6>gPczp(ig z<{~a}+U)V|-=EUUths{V-b`gsz1<1@IDP{`hT)mW$McAUMYO>qTl30L+Z^FyMi1-e zYov>rEp3hGW@Y6V1dr%r4dzrmx_<(LfhBlJNJyyj@z2$L3e=b&W%Bc&soWT2t0*vt zgb{pBE%bG9F}zM!$?60R+{Da>$ROqUo0<%DbQP{VZ590!H*42ruY6r30S?ILt*LJ= zt$(xLn};n(6|Mrk)weE5H2L~<%xw7I!0p|Gw(V2~RV6P1N?DSr99WlPbk_=vTi{406IC%XNRCwS zxmb{{N>C+Bf%eC<6TSY`eRV1+IQ(?ggNA71)M;}rbTPzaRxx=vR3*4-2bT5~h&(P< zEv?jFR0juWqObR~#=1iAg><*+y(liEj=_kKN2T|ZE5I335EM`VZ-1h}-V7c#*gQxK zX7hAVjnY-$dRM-|6*XbHOM*MPpfP=5IqEudjH2mRG9^9oQ?PR-$wH>@MnK-aTo(E; z(ltqxd^$j!p2kQ%;jl4HOg>)DBP$)d0ziuGWAqmQz?o?qRLYi5oF$b{PH3HnO<^d= zwKP%kx;(2Z0QvA}-+v{7NH<2G;Hl?ZtGBN-PJ9kub_|&zQ?WDqpAd^!WQyL7qs~4tR91ya)3_s%b zyGREnYM30!86by>gi^|N6_sNwD@m2bjz||Py;oWEUbTcohJR9$R_MW6Ns7A0TU&tz zsq&#PQqnO{WP;3=Z;lGafgH>e{XM9|CwC`ajHT$o%JGSg1chKe(2|;uI`+R!#08ZZ z+FU+npg3p1^mwT&==unyc1RO!fzXSNNBjI8hLq3pPd zo|sOV6+u_Ul@#$%w4F)Sk{iA5R1Q8NaeXU3pSKI+oS3Jr+f-UuZIGJkxb2!V5m?*nUm>bFv1`ALK$;-YMH>L~-3(7E-Eq~V+U<9kqee_-`=OfP#a1%5EE!I z2b+N@`~Q5hHua8V<1a8Z*j6`3jbn>+&nl;ap2=9r1hms>$6$H>ZrQlOfP|3Kutz8C zRz>A#TYnTTZ_^Dn(omNJHITpsKhlY5Q0#-)ufdwDh1+hE5dPgU zo_`*yu9dkUj@uI1FA#X5dTsp*pzon&WV5cCaetui61RL4|J6C*jqVz)r}$&_lS`Gl z5LTL2$(c2_cn1dbaZyrVWQ9aCp*1KksUO_}Dm6}173}=it_pyj$Gc07(O-AaVuipP z+dNx48=hvCl;!^`SaU!iZTzqLcnOk0N!odJu&lQ6H=62L4Rcg?+eIuswBd39*vi?psjr@nOTn5h79;_|8sJ`Hm@ zA~T3>2V{Fn!2+aTUUhf}=xkUAUn`(vakI{IZUq3}uC7@HfNFU#QSwqt$3l($>VMu6 z0-MZ+ab_&{Wtaj3W^GD$CrIqi)U{swj#|m<6fiZ{ZQsCgS9EMfAl$=$_*4Q~u2vAdqV?sv zgrrs8NYL09=0@g2lqOXj4c}z}1?zh@x0fO{gL32Tc8C`{Q9BMY5&61U(SLZ7RzC#| zf0US#Eh3GaqPZ*nKsQR?KJ`V}ig$_^^jFA*B)RT2Tr(cWDa@UWil{7jR%KG5t2DBU z?$PTzEdnA|1t~$L5nBuLpuzdAkTi$yFbegU!z{*nvejb_zCXXMxNxuN=ynZ=MD?=q zzL;wS(j&v<84_^?*5%^uDt~e@^%yu)nkbNY=wG&8NGRX`L0bdkcdCvJ8CXH-D=NifTOL~vB5)e5nW{RP)Y-?(Wto39%i8D7)%c@fVcT+BeV zY(>2S-Bbn3h(&gLHr#%2nc_yGlU@$p7V978{}TV9}98Jf{ZRSM^p zL!(DUrQsG)aMk4G)hDXO{3rPiwH;a#(0#4>4qeYRDzxkYEZs9Dumb(nhJ|95EE#Yh z2aixu17%gYL!<-ojDJY~GxXb@D00g_MJ4SR!nnGZ&Ia3q)4z7(qpP+x6Bz|85#7@H zKUV7reL>vZlfcIRpWwS9Pb<)1_K(pmOO68taknt_FWgs}0{vo2s@iRj$j6{$Ja@+f zT0ML~Ep>voeD@4AL6LXzJwhdRu+TmuRbextp;O9JwF%K4*?(Z_s0x-k-Ar9jGLs`! zgA%g0_@^)bks5KcvYqakypubs2&iY`*igxr30J1f`A3Fj-^P$m9>6d|Bs~mTPb&*^&CH{rp2zjVoX2wg2wuQG7n@^yYPmNea3X5$qPcG_4?8 zuTi}ZQCEEsy24FE7(|a?ntsgpn}a>-pjCqOt>Q)uLSvzoY1yDKU09`|3=+pGZwbL5 zALzT`pho6{KJ&k2eL`Oo<%o6#K#?mB*g?&?>G?C@&wpeXvXBJS*REz`{BbvlwbfT- zNiKTdWY;H`h#oR~m$F<4ox{OVs4RF{Dx#LJ5MHE8L+AZN7vHF6DMcrL{34EAJ-%^p ze`VhR+wMMlMMCLs1&}79@1a}1RDp}{Iv5wJafe`kL|yCGH2wL;a6F?{u2LROfF*rC`b1xkBgpJ4P=f%~sUsU?s~zLKa7ad(iD zjKvY#vjJ-J*8A!j7hf$wb2$=F!LVT=r_p^=n_Z%n4_zMYDyeU)kH@veQHXLwnmvuY ze*LOo?g*2=qCg<{2UfhFG3!Q3na&zvyH6B9Q-3kIxGDyuN?H^;S`mEr@FG_c1bXsj z=?7M$7G%}{=Vh0CS)EXTIFyB5rKMdf9sj&)&S z(BTknt7vscPzmNI@9NdVU6pdOjH^R6ZMZgjmryMS2hpvcnT`4NRRLe#$Z zscUMrXU*PCYolGhYlWlCQRYrZ1|ua92L$bqmSGU=DnOblP z6IpT#(N2CP>~3r(iNM744O44LH-BRNKdk{JZ8M=q<1Yg8+3#Zm1<94|>!>y|#cV)4 zN$!@{1t8ys46|gvuNK7ae4`QE)dl3stD(&ayYt+B>XBIm?Pe&%I{d8%|N92G*JED= zUV^DFGx~xxMMU#UCSNeM0aLmtSJ=0zk~2F-=o~OZcN^6;uyhi*2b;y_Uw=qvD?3g_ z0H-y9OZ@x2405hL!ne^pqkkq=)spIJ1pCTZ_9{9RrTcyYKwm_&!N)SSMeysZ;K*Dt z3y!Mj)8Eur$MvrIY61{!fAWO`9>Zc&7= z&ioRLIb!I{hR_tr#Q&tW@HQg2O_{OpS>IOjqAY8nV|Y5JrP?L0sDCbtA~3O-Jm~wj zbq4^^NsfQuyQf1(w>xxjjGWVv%G4Ls|34v7sH8S1q`pjsV%U~s%+q6F+kw^>9y?2NCt7T= zO;?pd9b}QK>dUY|sS)9!`=hL?z)JeBdea;F{G#u{5rm$n(LDtE+2QM|?y@BnVM=pj zz|HED%yxgOj!bH94tJ117@j(VVMrAbI;fwwaQ55;;9nr%8h^U#;u#KS#kT+!B*#fU zOB3Hjk_gG}@y?u@|JNzb_5S^l)rq?ETZ?-u2w4@Ran@f2V+2PRscQZGcWC{sgxiE& zgBaE-5?(a^0W_2Y>l>{wBY=ve71r;^vQY0N_RWA?< zK;u*z*rhtSr+-q)_Km-!+fp2>FUUf)dtb5oIShbWvVULE>#N@!Fp)-NP<7&_2ws;^ zOLHVix6(CMR~*rC7}IqX#WRn};YPCgs-{CNRH8}_{Q~v8zsQm4=0gzm;eR6v25S@$CXhqdf|ctjyn6_@>r`TR z_oQfd+kbBn-Fblv>SnCxLKhZPsYpkF#La7cU`MNYu5eZ?=2Z?nKN3$+TBctQT!%?K z*mrzMHPNe!aQF$y0&qLh%s^(9rbY*u%41w9P!)D~JSrCke5+|-$ypm91$3D9R?`(n z|H6vgg0mOE5=5%>`=jmmIjK@CJ5gOrc3GsCnDJsT0&*^C4a6Pd;$6|J#USNtfi&)-$L z3VTP?2h|be4BO%E$X9W7dCK{Rac{!*Z-_}UQ)bwgTl!DOSKYr_W5 zU+APK?>nR~+@TI`QixpOW%d1BZe9zEimQJDmwWzq8YYb%)Sog@8oC13pXPDo!BH^* z;&s0(fc7#+tOSCpoC~j;UOQLYp$)`ijUY9F^i~&zFXFgy^QcM}mtO|4-UfuAE#tg# z@yeip!>Ms(R>9Z)9UObG_01I_a`>is5=9#7SwqKz|G%g1QZUGBoJ}uApwZI>ipYOm z-U>dR(F}0oYX-Qz6I~eYDVY>x<|YGgpus*H#@EEg#*7h|a#0u{c-Cs$BHBOCjl^#l zC73Q!{1rZz6J_o)O<2iQB?lo0nQSe`Vx$t{h!_fBP%5q&{(WUZR|PYasy_D+i}>p0 z&(BsF*FjB}U@Ui`?`uQl{rTNN?ZbabC*T_C=Ogl-EP}6(X;$;%?PyY7#7P?Q06|}= zb7<36F9i4)$ixC?O`XMB^(O8w{2j1qv_>xm>?#0sl?PoT%HC@>Cb)vEycv;R13{F~ zRdgLcL}iW%Pm3s{sBr)vubzv#TGb~W?b z&R74&cB$C5(@S{&_FG>G36HjZq+TXf1#tFP&u2NZ3O`~bBG?X0(Al0$BuctGtMvgtsvBp%zdnDs-|=G{ee&Ji zc=;~ci^)K@UAdmB+18wN)hCBJt3qseU=0UmX550XTKUmckJkQL3mh_ppu1_$K-%Eh z91X>BIu%qqG9N)0?N0Z-ZlL=`9bk2O(-B2h9)kfJ!-Ef>DpBW-XpQVXSc8&>Z80qu zpkPPoCqF9%oq1zl1!R8!Ss$U=zw425E#!a27$uA3lChOUa^h>XY^y8~OA?tURb?Y8 z;YK*hASkXcmYiQNQ*a!^va%|NRPYTFziUFh%+~Mv8>;-+`wO4GMuvX@uP;|x-4b!x z-$O~*yCq$$}E^Duk!~ z?a{7;gVjlQR+1rUOKULIn{?v|$PUPi(AKkveUC>|>kdR-49<;1ZPacosJCFn&EY&_ zzfZr5`~kfPdz99oS6MG5F!<_POXb};ntgZcJ&l)a15r7LTv0mI5|!ddLpCOhnY zP*P~&S@Zp*F-dB{3)OxH!ID zMo4{m83it>af19^fkEAcCM$?x;R8dXF+E^D zBR79qZBD?BGC?ke-ge^IM~%aqYQ3znh{rOH^8tA)YT{>YzE+`1=U28)G4n)w$XqbE=O8V|jal!+eAEyIzbNZij~7j?e+yShZNcztjasm! z)CQ#F82p`f%P<91zM(-(jx0+D-c~fSjkJHGS>fY-AO;^<1|}$fV)#~HY8FbveL-P8 zEDd!KF=5>6*G_S^i*co1u0%s{WtqU!a97zWwP19>VepObof6kJPWpbe5-k07Po9*z4MXqPeU)oUVTY z*rI>q=wYfQD`Rba`u0EmEV(<9a~D#ceTY#*$y)$&i;X{7h^1zySTVbVC=!so{BU~O z9v2~37YbpO9tE{-@jgdQSK5UhC969{bg~v4{W(Ci=!rDr*6!(k&Ir#M#tE5aK@=*R zBD)eG+8k`|^BEbV6+0?KSdmIZKc;_m3iSL>bwQ!#xok?e_M@RU&E2USY~cAF#IEc< zVru~agf!Ozxg-sv9SzIb!8^tml`sRAiQm`@B{Y7@`twH|6U=B*+tVa(jcDPs)=!BD zbnzGDe9;W{@44x=ENCH|G4RRoz@|~Eq5My zt-KQI*zy$3fp5AhIKIQ(ny=!+sS1<>3X0g*!npWq5k^sWdDBV4&s z5HzDTB^n6z<)R}i8(Rx#>X3gD3>Mcb(C?|t4~|U5{&cbm9h;3njqNO>IAmdD;H7_f zxUU0Mj0G{fcQdJc`EM)Mvu1Nq1HNz_UIl>@9F22%#A1Ipa{9MR%c`X| zD5Kh}c_=O|D(9E=W~%ZSn>9Ko&xZRjLj{wlM)Su7c)2|$jW*U3Y>+*Q2b_v1_RVR? zA3tmMhe#E&Dv5KXM!Z)1cerX)fmeNm;C~_@7>=#dBQT>#vh=D0$T}}m3di!suMGlG zW4QDw-Ky6akMV(TF&BU5mKv<>TB^TUMv)h!x`|Qmctn$Ko?3XDJ9x_WJCOrNL~V)x zf>EuUaV?~jOD+kR1aEyZbEO1IP^h7@RXP^~zll*6R;20bg&m{1ArncKy>tq@#SCdE*Yp$VS;~tw0MQwNW`zD6ibErATu7C&B zNz<=MH;Uz{=k9-9-ZsZtbN;X_6KhDfB^us=voL7_M$_eB9$PCWF(l9aaWnGJdPf6m zb($kuppDR`h!MCp7vHwx&jKcB&9$#%tGRVOUfU$wHR`K1jxmf>x3M`pF{g2OEUD znXf8c_@WB#RM%4Z4qGhRz{PY{7hQ$QNQC+t|J}U?SCbgRl=bPD8@Q@H5Odu=(1sEN z28`pt3@DL@52I|mQCH=CgDi%|n`XI$7pRs?D0Rhm;FB)QbM^?$$td`ZEpR>a70i{RfOj5|yP1EvEA!tsS8Wdgi$W5C8DqCTOoZwQ>* z^&fxt!}7XX=J;*cDtX4#V!c}^D3v@{2z1qZFRzDhh1{B}40t$%C-q@x)8zHa#d z-4Uh%UfS(4@RXO+gDi)4P0D`W16RQ-T;T14f;VjfKu53=)PPqVt5${KO3GnW9Bj|; zfoNF~lY^$CU)mw-h_2+a>j(j&JmFvj2>*Y9F5H`*HVVK~vnpSf=T`~-GM?`-%OWk( zc|Vf-qWGgvB5uvZk2pH{U2a)Y8yWgllG0R)|AQmS6)H06$&mPeq<5k2&1nwC(pjzY z2#A7LS%bbv6}1o(2|e2iVY_VWeig_X^;g!HuUC#+Tu+4D))4i zDPSQ1%%&DmFK!TbxFHpm!spv~Y*i2!kke&Jw?Ao48-}hoBP+FFts#Z3Pxg&1j!y=6 zGx%_30EYt?-gteNs>hsi!t|pA@b>e%x4_J6_JHke)m1$GUkvtme3J9y92lQiH{DYW z`+POQ3{d`)-84iN*;P-l463Vx*j0bD5r&bm9*p9Mxhh{|w;9pV-{Xqq)Q5$URDzAn ziS{vdVo^vh{GeP^h58@;?7_nDojMXC zcP-10p&+a`8tGfz3=@UPM>ir@PW71lDld0|6x{fW89n_pyGOMPPS!0oeIas(? z1Whrg`z)&-iC0<3)aQxn>)N$`4U>~oQqv^RUxG%BA;eZxXuPAi83x7*6O{@7FF$_C zY;|quzEh-;>-Z(gIkv37`U`)~*75Ug%P+!`uFDq@T>dvw(&R8|Rgs7oP$!n|RCPHl zm}&tA1EJQ}On3(%tdQ=Ij$}pqjy8u~7gs#Iy;VzP-=3K`9Mo*15RyW7@#HlV&4_k96 zA-)EuNDUV_&H-_Qv9?o*$x?V!L~q44T(sr!WdhVBSr znZn&i8}2)fDyhbROU-tv`_PrRu;l%9!zgl4Ap|1;>79v%eV~65fl-0W#899{Sq@Nv z{gR0~MYu`{+I=9thhqJTh0!#H0TBFtm|%X+ZRC8lZvYzPlH%!VULX;=*GoqD8Y^)~ zhYX2w2~MJ0)nGB0N+el6iB&NWKeIZ&bTm@o@TbvdSdHFs;<|PH{`*RP!{_dsmR)aH zd&g70>EuQAqFR4okBf>3Tab1?~6*$hbsINA4gH(|Mll?f874+g&){@ z*FCR#<}c7`89?njKA_hs3J$C)1NLa>ul`wz68lR~4cPk*FbWKDRgi%`<$+0ebld|b@ou%wvirrqEE zbSU9!Um|I1vyw%HLQV7qgC6Z`o?2x4cSS^N5z%GR!7r&m?O-9}$oA5VRWyP|*sVZG5dVqm4ge79ef{YZhLXZe+?01_!MkwevFLjQM- z>lHAxzt3_hs5ah!bd@0IKB4OnHA$N6eY=04$D^J%i{d@%>Hz!~ha6A#VKA{Xl3khT zFK4TQ`Sf7b3-=y*wjC6*eHHtReu0~Tsup6_zay)d!s^a~_o@eP0+VzoV==Oio zVsfX-i?uMLCu0&9m@p!s;mCWoxa!B8kSd)XYyCkM-Q#IjGw`p4=|tgydv`1{xof}5 zx2A2w88-tJ_s;D*RWhoY*G+nItRdQiAE)nKwZp2a0MH_yO`lISa#|L9&-s+8Dh#8x zqU}`x0GqQ+eg=NQKc?=DtYsKFggIZn{NeLQ&m60sGTe0Dd>tY@i zO%9ryqN!m;Ui^^VjYCbvCJ8+!XQ@acVz#z#R07Vc*WkmAX%EN*Y^r z%J3_sL5{f8bRKzfPbAcrA&`H0s~~{Bri2dH&R-r}T{kQrs)LY6n1>^wl~Q;v?n>5!*l z4Cgxy{5j$80vM#gu@v3iB~3S^cT$gh(po4CDcrJxlcTH))w&wo)^c*#?$uD3|o)gWwTnVNb!>J%WzrG0f;abw*(tw{;%cj^zF4!2uJwlYmNU9EBI*5S= zqmc_J$S=r>c)cVQvW8jE2^QivQ(de-E#z0W6`rLeyYgei$dW|`7-A$CF&GM zF&JVJ3}}Df@&9MC3`2)X`Qr|=pS(LIAA`WWWg+SYFAew>ZD5Cdh4QPJ4e_)=u5#Hc zLF!wLJy=oen$(CvM?cL9(x(d6B58`H!hcZG!;P070U#OZ8gPx{hywnRXM+xCM1q@e zImnNCkT&o}sZmx$HE2k@<*qSu?5ceF<)KZ2j>vznN(`smSV;9sl{=DOD#K2FPH}%h zD8E0M?if=a+-B0`fPs!39U4$)>C-e#Bn^)U34@Ji6NxlUSxY19rsy%GX_`nG=djJA zK+@ARkw_8BGtG(VyX+}DVLowkz$O>dmlcsn(?p|vM{%Bkk>pKI*fihSTceXV=7FD! z(?owVNndewb!tIWf;5pxZ)ZhX_P1wdS6739LM&HDM@L6{MgW!oP)bO3OH)%*Qx7UA zDg;0Th9NC2D=RZIGcy|s2p9#2fgVgW2L%N$I65?z@Fp_i5O(rbpL;T;zr0Aug9d|=rIcKHJzJXrG_q!i>=L~ zQoGqYmXE@k6Jo|HeqGoExOUuK=6gKK=jwm+`K>-hMe+kEc0m#_GTXc0@}35i|~Jd zF4X1p77&XqCiLw%$fFg6A=pQ;*@ks(z(e+?ahJW#*S8M({AUaZ*PS{biq?{MxTEg4 z;)i>;aq7^e>#kHu46;Xm`gkYk?mqtl@4KgZ6l>N8cO|M`vm+l}Yk}`~Yphkmfg!`& z5YP~PdO*pLL?ccybWu$OY1dz`#>0Pic>GQ%BwuIn?kQNDxkHdq{vO#7Q(>LezBt;; zPJ^F%$NmL^^?AWcoe44!T&scmD?tpP>dTDF0oK+Bg||%^Qi;IYRi``- zXv#p1dKcxIK`J%d4);J2{iJFKs4Adz$zuCmXzGOY|M zW`BdKi5Vf{1~%Wyi3~i}4!Q?|0m@<%11#V;rA`CQh zo3r*@HixYR2ErH@0)3^w2||AxN_EXiT}QiyFG7?8q&z~oK0a|cQ5fJBWWE)yL*%GW z?CTbMV1=;4iv3irdXK9NQ=J6|hmoGEH2&>$RaE=dq`Jk}+G3h6=*F3I&y{BSga70I zUKe`G1cSx`6={=Ie)C_f;95}Jr0*jXF9argG?Ku|RA-?W8?WFkJ)eKCN2%y(V#9+- z(y=??ZV(RKB%R&?6${RA^VPam7V@usz{e>7x8~0MiG1Ux6~?S@f42k&*3o!S9FtGoW;>bivW~&P4ZXS) zrV9Pzwh_m@Xb4mZT(63umsaptkQv~Q;#PnYV0~#as7H5~90bPju`*s; z)amY)yB2yWhlR?p?ZotElfE`#AhQ_L5(allGjFJHQ-&Bt5vTqgpeWk=ox2Ofz|M|F zQdcfZ6R(0Blj?ti_+P(j0|h>oENfKB#DW!;+=+eYtF69h1CIAu7}Qo@6(Em4QZ_ZO zC>_|CvbGjcr`A*9lvh_O9NmIJnEv)A<-tV7{5AtCh(5rX1wC^M4!8p54Td({<=`Q| z^WS1*Gq+QbH$c~ew@ulQq}aTp{P|G?$&fw(oqzhL`q zt~rtkRVD!E)P z|MC^UV6Fa;ZSh_QjHIW@sQ({Wb^zh3>LyL)DUW}_{P;*Etc6qy%#sBOCc;-$X2^nK zULI8gNZkvlGfdPu^1GVELdhHml_jy_H1NnpjE4QI&vvtFUdR z!Qg-1u2br-!*UgVtXWtw&XhB;#2p=XY?)J%`pZe<#6215cE^yMj?zSRMQjjV{&4Ai zG&=TOU&r=ia}_2)jZLy1|4R5}*1LsrV^Kijs z#owS#j-MpSj)wT6j~)NRkTIBX`BRe4z;;bR+D;S%LS5<)PYTTnWcgSJ>UnBINP>iDV zqTK^1$}2udHbD=j3^tN`2xb&g%{!pi@AP9Lld3@4Nat`Ov_hrFXuW-0UlBgoY_5N* zR;??{TsD7~M*y0Shk4mdhL`U;+xYncSH)1rktx-Sao)BhmiZvja|Bzww%;w(bhSv! zY|XGA?(ae`6T?zGgrX0MS~GuId5?O_D|fD{>rD=itLkI^mEX?zApYv`R{?J< zVH)D9@4u=SP#9v2AtrE-&(F&Rt^TR26B+c~j=qi7MKZqbYK)V-bVcxaRf?jnh4L6w zq-}vk+Mc2zc(YCGKa4FP#yEjom=v8T3d@L4b29z?wo?Z&x#+~C)^^mkB z`ka{P#b~gGrwiFph1J2#T9qms#(_|{wzs+ooOc&6gWcsS82=Zs%M&gl>h8JtUsE6! z`l#cFszR?Q(|K}_ssrY(9Or+hMC)p`1sT@;bsAk#Y-`AarFn0IdlFekVkcJfn>8B~ zI=D)Nx{%2^!X|h?8zqWo8E10Ff=;hxvq9q#bqPiT|RYfK+>>+=^MKp3L8A|^v zA05Mv*0%t!3bwl^|#Z>Va|Y zKs2P?c}--VnI(G{2!vvHO;gN0wvsiW{;gR<6ZQ$N643=}O=T_xQWfZt3iS&#E)Z&z z^i>v>oN)ayLd(>@B1^VOsnXYJ^cT=$D86DNL#1k&bO99W*uv(dT`?t8FP)6p`h-%i zJe+3NK6%Z1XPk;KZ;# z1U#TG^dQl5AHG98|DY}I+IPg->inOjfmN{Er40s~G7~i}B-nPmSay%sWoifDsP2b*~8*(9`nj`^( ziO<#@w_VHIRZ+X)J zIg~@=lx2T65@@DL)lO!FF)h(kSMpUSLhbGQ5T-5|n7lKqk6=ptlynBF!!*QYs}y7( zkFUv?fxdQYf7sf6KVPI8i-y_r?8!f|S|?Tf#@ETW_JP`uRroSqhCbbg9!2w! zg=|`T=TYGUL(IQ&SH|537xm7OhT-^y*O%Ac6P|x5f0QU_8G^UyicA;4Uu_Vep5QX4 z7)D$s1$oe_Jc*}x6irzZhqdn4)PO;j%mx2$_xCC^1M!h-^)pbQFLwhMcF>~>R4SHF zE0+Cw&(gr;=21NfxpUb}B8zDF&7Zy%@vF~_QNkX*Cr@@`rK1juD$`C^w;&FG(Y-2~ zSd4$;KGmQU^mg4Onomu>Kb_FkN`RCHi4_U|mSMiA!o@u+sV zN-|Z+^yB=x*Qy_FfFY3_q)tWGlYlq#(Q7I!fWp< zYRfTo;%!+_a5KQ6Xn9ZLJUn(b6x>sCtQUX?jnTD$a zj!B2Slbws8tm>^#PV2scoai7YJQaU7{~ub}oJ_GweU8OtDT$izKt}Wi&lpJX9z;x3 zKM9N_b7dk>aGz>luYd>;SVT=0*+NgUvx(cr5@83uivywziI0w$kB{IGCT2b`fj9K( z*zNt%Y^L87Qzhb-JWn?oFj_<^Jqij$qyHs5^`r3>kUa}3cN9@1W3n(rniYSO^|4vN z%upOqgOeE6iw(NN$*qAwe*#`!9~4*&lw1%LECy>}HZ131fXF-`JtibNO$w)i9wrSa zH4F|8dask)R2A@QS$ z?Dz8dPB7afDj}Jcz{BR)tl1GivN*$OTN&|HSKFf;|x7}sfQY;b=O!0`$kB4EpM zcl_+24UWJ0S2|pYz^9h?X|dTLU`|0`C2&k$sk&Uu9c)Z$>8|603Pe?9!B+OXsuU5n z5VaXqWoT&#C=;$vz}wXa2pLtkNn(pM6oHW?DhdWF$VKWx4$nCfxYdiZumTS%hQV~_ zp^TaRJWMG{PZk>Eu2p}SCr2zq63cgi-8$7b!4S8vdcR(+a@}bDW7v}jX_#~c{n0gG zk8(8V*F?B?Dgae23GSWyD#ZFq{U;)1$?1qW_1Lw=*_>q~%iU}C-ht8GFMOTqAW^xw zlZ3VcvXvoY!Kt2p1$1-U++kcA)pHDc6yhv{CS*{+0$6i0PiVppQ+ScGDC*L#_nLJ(TO04HEx zi-bk7b0q|>a)woocLszacKT*mgjdz*6l(ghK~$1oG41!RbthhC2q&=}`l__Aup6^V6JI&hEn6^5YR&T3HLuL4U2H9pG(X|l zH9Cp;1k@OJN$QUYkC-H+pT7#PRu_QwIlk=hFLR9?B#IlJ4o{ebLiI6BMQek)PnS_67kiKm<%&LpPG3`lpcrrs-$)HJJFc?IXlBAP+P4-{h)8yM1_Xb1r zur@x0M8P`Ah2S#n>|lV!2>zdfv*g_eT;dNqCU^rxVsz?+iwGl}^4-(5y6LN>(V-!X z*_My&7jj5K%!(R{s&WV@$YG8eDd|#ugD!uB&NG3Uz~1`pHTZLwCXRN#JLTi9qbv%8 z&{t(flvH7HwFQot>(*MY8B{Rk-ym|h2RTm-jV0jK*0L!Qve;#D^ZZoxRPy2=_u;*| z^xtiM9Z&*5`nKH43ld4u1hlU>v%oa;rO_9X#thFk<=5k_rPI(_-V`zMlSNgVI zb7mZ&9CSMR3vij{-OL~)nNUPxgQpfH?l*1&qHi!wnkCpWBF+5w8jFdbJYUs$ii-Nl ze6jj+kwcSJ~?DC!;=*)7V1~Pnm#TgD7JlX2=)=effWY9%F%*y~%gFrL6n1kY;+sXz@@0iuKmbtLlo8<&U0=D2s01Mvhr zbumcSgJOycY73Ybq3`d}ko%tb1Jv(so~+O@4ev^P-#4N)7`(st@3z+>USGPZ?HaW{ z3|=huA+YP|3=u_`YS(`UiiRik3lMFW(ufg&oF^@cut*ocssk4jH=Tw<6Be%j@xuFJ zDv9;gb!ZNW`b~FZvfbba~x8@cUY?02QFsKOa8=VO2I?x$}KTo>ZU{)LI< zPx?>8kb5Df&PCIt?||GgA66MEf2N!{an>b|a&Yf=2yjv&U~9R$2!9pTR8}!e6l~+4 zKV08eKWcHnvKVBKb~?+bzZ5N4e;wfjE&D3m!eB%7a6ShB7H3$wrIzhp1%zU^2a-xo!6q%jIeoX6taiJ3d( z3k*H*9}XK;6GE)N!Imi{NWqgV?r*yf1rvtCQJVoO6&V!1@!Bi*Cp5Tjz4Ksy0*MPJ z#sz+M_>PFEgZUC5)ip@J1^-($P>j+)ClhmV%>|&%o2`GwNY$3B+f^_X9n{3gUiQ`4 zypRX1TSA;Z`zzRhzeZ@8mi371qNaHpi+t$>dZMKKv|&3YTI#AVR2`*QhFoJORBW+k zV-Hi!?6F~K(9Lz(Rozejvb%^fH%qXVPCZKrRe!8lH94wUs0uB722lQ?i+sR~YQN>Z zI{^Fj)ct?%%F?EoukN^iSGX_7+n|+lYfwP`#UkAQDyLHtbYCaN>y$UerMku%-Jy*t zWf&&kmm63A)>ZhG5ftK;8+Tov-4uaof3}JOb0A^3qXB1Tp*EyGnQTzM8ex+O3@p1`@b#NzE*d~{0=xg0;x_f(r9A6G>I2>Cw|yGU zG4Ai@F&1oL;MTe-L{*5nj2ivJe-KnqYF%R)WTqex`Q^s!5DneBM3-SMNsqk2#Nt8a zF1UZAX~+(6OQB+fazi<0xr$ltwxuZKm|c)JG&|S9vNhV>vQTqSsExh>RtUq#YAi*JI@#0>_prW)I-_)k}ypqB*v!R%2SJ$bgh zc3i2-j;K9B<=+2uO^yLU*8X|jkgSBEwc>wN-MnXpD_%9$!XQnRyh=H669#_%NkMgQ z*QeghJ7M7EqUI@?kZ(+|*VW?&TIxnLDF)gQ8U+f&{?b1@&+5l^jB0c|<=eyS{uxrij?4{N^Qrq9=%uJXG>PZxw#fb0> ziSw^QhN+z(r+B5Vva1e>o>=|!2o_1rQ2X-(MI&D;W-b8HS9JpE+49ac+!9x}UHc1z z@i+0mRx+vmv~F}aa{X@QtG~1PV-|l?*T|a99Mn}{yN3T=Si{2qu49V-ohOm)f3*s} zF9D})-f+wcfgj{0MF5*+s4BH}4CBMx7@L!YNbbMl;I!LPj0r$NLw83u?H2a2uCnS; zSWxKB@_3;VfX_p$ha(f8nY`n`{R9uig?wQ%|F8*sf3M0bT<&p*D4MG7w7-89*j4+* zrIC_S;;)3JAd5c!V#Fcc->&^XL1Eh(QFaR65O1rbn92l{ym-}e%e24n50x{CO5Gk} z3LNZU@-D~>cx8@sgoomlaX47y)wRyf#%x!l!8bG(YD_+$Fh9;D*%`0v3P4t%Iz01- zRe{Q|dhlY}*@zItML|=6Ra1Xtdw^DFq(@UjMPSd7iZ{#ZGR76^5k32%0Mi&SuH5hS zZG91m8OaY|m$^kkQ5{#gMb%>P?+#ele0Q<)Rd`eel3n1t;ru^w`)_mRAfb{UPfToC zMc&LNo^*M!B4-P$s(0~yRU9MFs?&ih_f38K)G7zR9nq-Dw0e-py9R%~D7;dpM0VG< zUs16c&)Bv(t)$)QlEMIh(X0V+%Z>P)ar?P)w3>07R5sP_4YRf{vR>>&^)gBDhc4#-|@7kcccZU1isO&Syc|R zx>vQk`t>E9@4k~n$j+RNS#>GY^qPY$rYEz$x|i*79+uWhHv)?yXJ>=EzSB>OzZ*r{ z`*Rw`+xF{Vnw3LrhqS!q)5WwfHx$*Vnu@9D<6LpBAs}Ed7HNOC92y{*{{kSN44u9K1Ono8~D*F@*UaICKxzEY%IQTI4YM_GDFTNhcxK%*T_xRU~cj zS5Gl!^#d^T{TQXI;;N=Y8i|OqX{xf`I!gmYp%3unt5eQSR?}BVNNgSt!I*k{NSF|& zpyKut96^!kKooxvTv&Tk)+a%zwM?#~7hP=IpD6(6`-YD>`m5rZcr z?3m#j%(Mjug7~ovnf|awD%qK+x&X@eZ1QNc{b`BXNii6d%)v>Pl)8q~v5+*e=G{SF zH=5>rgs6@#P=_oiyCG1n-LI`}t%R!vMc}rpYJk~oSA~C*#hEGVQ)O!iah@^aJ}Qn1 z>Q-(xb%zQMq*r_Df`Qx)W?pb)|MPcFx6CR)8cSr*jC4$7BlO0J2PhO2xywyJ*TbiS&I#x zZb^yplCOWCmhit9{;#+NOX4O)K&oq)@XNyyhN18aGV6(Jeh86EoDff)5F#mxz%~$3 zFj52{l3Xz8Bb+J~Al$ZEaumEadR-j$?;~(B*mrJtclU89we9RHveU{ zoU2|Np$iz&mzd8~hQO(=su4asXzM)$?tiM)rI4i;aSC9Gcc@(em~euxifqzd(;_;N zqeL`S2u7ooZ`BQ^zA#iR?j8FWoeHqlB?6*=vLAiE2(0+quK`V_{XK6$2Wu6*DiFHd zv|WD%jq&;?)8d2wQvgU_BD*^z$jYxBA=@a{EoEC}&??6&Wz&QBgWIwo=ilc7WeCrP z53`IuJH0M|Z;Ls{__oNO;wO;``j6`M$r;{O!&k{ub(T@F3SG@pGP$aTU%>4b-NPR`h<#U2E+TWmn`x~LSU=zBdQ#arp};uE(%Hu zCni4@9Hzm(Hd1#XomB?``9MxW)7?9(1d(xs-cDU&e5(5Z+C?GxrS*Q(i>d?E@yUNp zdhcA|fs83NCF%QhArJNA)?eSiJ0TNP6kmbAsvz&WM1;q+Au+%CzKu-pE;ucEk&l=E zW6f`sZ9L{))?#d(SW0Q47) zQB)0lJHoh&def0@U8~=+8IV!8@31CS=MnH=fo4+2xAl>OF0=V1VXKKeF6oGMngqAt zrHs;TCjkkClJQIxO&hf;5W-c5OG(Fl?vJpa+`l5n(gDEYAqz4jA&ORSLxX=|$oR9+ ziRQzdv{iR;bee$X(EbC2EQa@#!57!%2s?}wjZbAoaf$V8!KcHXYDcjt(Xouj+qBw+ zkcAv{MhdAe2V5O-EHN;}67t-=sypvFj!wr6`$cuK@rIVOkWXFyEW~_kW_z4-*w&sh5QG# zzTrlU$L^(1b60S!q{}ZDQn*%aM#L_~cIfRiT-d*`=yidn)DcNybeE#6joG2KHO&Lt zud2WJ&(+~9IJ2m{3xj=CASS;EG71rgnGI+A_A*4(23D@qd(wr-;7JH8Vc954n;4wn5KSX<`VRsJrRt1t@#Wm4ix+s3B@2v@0Q zoDQ{tkzd%OMamIc-6=7^qUYl1unCW0&rCzd=ua{?F{WT>2c~9-N;Ku~aK?}D`f@Zf z;y^~s=`cH3QU(gXY=jq}uo{R!7?YQJG2>_lj%8@GcunTAnd*P)7Y0Yx;IB>W*4@~f zm&}7a9_dtbwI^#_h~Ng$*{&~0YAS2zFZtjrD{Df|$gaVv*I{?rYASP8f9fZF7qb+x_6c2NNw#Zv48&A1(s?yJztB~4 zAf+**pv(=~1~-3ULOD`sE8ur165DZbF(|PVBwK+B@RGGqyp!vBWL7X``ho31Gc-<$ zi7KjU9g7+4u(yp3s{>jpZGL|tPHkdBY8;K0x_?GEV$tTXSo7Z^{*zz6gl(N1BCSBj zv1yYf#{W>(dWynY4W6*$lBb7*IlXchm=58OBsJpRb{af28*~VQC1@+hDgA{(8(!2 zixHGqaUX_=gADQ!2}eOjpJ8Z=i70qBME*CR_DldhK*GPwE1rtJ>yQl*t|c;-AG(tW zLr_;cPi|F)h#X+I9YeFzz|a@&NP_jA?_&!1#c;@B$~@D5sr#_-3?@#Eo@chLguj4U zgaCUsm;&CdCnsHJO1GaNMr2-fe^o0N68(a`_f_q6;Nw*Q;jzgPav{j`)%n6Zgc0( zu!K3-pj|By56ilWP`WnB-;MoBe1N+2ttxa%4?)_tEvRNECnEcK7g0$^wh9`(HNI=dKYzqYUq3->BGsKz~QGZHZ7IF6*y^ILGP%mDZN8 zUlAJy;qIZr1`zcQ+;lQ<&#mBjsDiG-g!~$!CM>yiSOY7(0`Re4yMc5=hZiCEIrKJ% ze*m<|{t012y`9S$65(0B2Vrz|+4+5tRiP^~DDQy20$r_dn;{OEyJ5}+OC%}>z)iyl zeyx3fHPDweg{5j*q<`s{zT(sh1te&2l5c&LN^YMZT;YDqkVGtIdrwfkDzFdxjRHI0eyjAt8E26JjH^NfHkX4=EbCt0D*D_nIEUW!|AF_=fWcxH5Dwkny z=sBbW0YQ2HrS8hE+nD=x{?gsof*MQS;#?i}=XVMi1}S}4s~7i!?q)zVMXIhkLA9EH zhE8+x&cZEgsG_}C80X&;R~CbL8vK{_&n`$9%ROZnT&=EfI5%+6q7!YKco zI&kP1YZIsI%EQc_l^r2fBM-U8*N4%6NA+@$(=cI0!%l!#0lQ)~scU$+?1w#o`5>V( zorl~!F#V4HbnKEeMEt0_UKI6J10>#72;<}MD&R!HyEYEP!5}~WU2*}*+nq+OzJ59q zEOu52gE+b@4~K;!h!koRP*|k+Q5Nq39#_AV&cVE^8roBh12Wovm<$|`}8&|~!@QvjjwfAIy+IQ>Z z@$YxCwa!eW>SMa+s*8C6RY9gcO9bnsb@3uP38*h~D^p)>BiR0hRT(^u;I|h`Lk6ht zTYmhbuU)8z)s>XK8EC&ucMZpXj8X{F0qHBppJsi&+scNBEv}tll?7mV0gv6Npj_`P2`4~TB&$T4iH%B$kk7Iz2pbdLvA>F-9UR~?9VQKHfT%@f1$HD| z?5PmTn^FxC?;=}Tcah|b5E(uKrv`&p!xn;(;wU&1zk(Hj+2U;A+=q??s@-2cGhC%g ziIEL6yIe+CeKttd`@`0MzjWyq%$KuGDSGf6p=+X0WtSOcixdASSiC4C=pj`mQ+GHA zvM#k|1GC0N6WHSZauf^Ok7~0t;n<1|Kj|1r6Q`!il^O|)P3MgGTMf>Z2vXd*!%y%R`VnIDi z8(7TJRfqP!qI9G$ShzCx>S1}6Bi~XeG`iL|TY^ONQC>3)qR}XNlxL6i&(##J>v5Pp zei8b*sH$$Ri}XyxNg2e5!}Lrl;k)Lm9sKbFVXt2iY2TmcIp6AndHe$z88F5U7Pi|r zfV2~hR8<97YVWUq;p<)iLiOrHmm`I*`(30v&&2wG&;gRKtoIj?5fNp7qQgz8cUC836BQaQ|BJ$dQmYIN^pjuT7k|rr9xl#a{ z;5%EsCGzT|Y{Q-9;F#FRCkOaQ@fg^>BUSIEU6VmG4<#U1t{@6k1FvP~pPQMRT<@pt zRWoV6OPk5!swE{~1Gq}j0#^MvXn}=(D31Sy{($n8xP77zyHi?Sge(NzG5fnEY|oMJ4gF&e*VZ4KF|Xt7kX_+!RmUHy zRw0)5+sgWa<8SP)s>Qq2M?q-f)W1)ASNU`^*I{XFnLf~d9*`>L9z}qA$$e)5YFj;@ zrrdx%uhQcbPCkO33PyN;X_@P%b{$%Su0#GsH+ZjqP&x!~ipoA!LRSrw=4(9y#s97v zr3LmN^+}jtM)cL78bZ_*Mr0ivoYPuC6eNkvGaanDk&TkGqxxR#4iM^YDA2T}B1UIN zW$xfb&YZ820ZVKQ3ucx?Wt&x8fcN44dHqc!x7V3KWRXXHnC>*4jMkFD(ua~LKm$e(&B{`*YGBd)M@6v`U?@HIj=8Xk-^-5{+kT|^1=stivPl$u0z`mPI+B6FRE*e z956t?Xya|??jq`7Xi&nSyPcvCs0B5zSOJw+K}O7o*8T$kT?9lPm`50dFttomM$H2G zs%XowK^Z=^9^6ezq|u@Mahv1cE4%E`)2JL3-oJn@__~6{BLK)K6_$Vz(7w;=dg(=@%>b||+e^=a z5vq?r#{CFTh!zkp+99GMpzmW;9Epp8iLh*_$?S-+p!+3<#TcSlWOzFCCv6I;uGEG| zRx6x20FL9e6Y_A&Z_&j6Lv%PfQ!&neQ&w#vMk1~SF6uJlnok9cm#d&;bxb$3QJvgY z^3}js45IIH7L~&GatRp9aFquY^c`r(7cm;b1BCc$L4G=B;yge|YVxGUUvAG`AlAl; zvn*TcPjjPcfNUZ-X_0>c0$za$bAJwmM-GJw!-aM*M|(FY$~=B`$S7MGYDc(#@|RRi zR{wh;``6AT5`8rRi_4O!uaXz9YKX8f$N6ARxE^CZc~6)}Hdlo)Fi8Ey=11f3eYpiw z^w+^ETC1x=L^U$5QP3Yq!_R;ugh1l{C_BGBHR`%`CC~iVvN2xpm^^KGBd;$z!>>Xc zGz0JkNS$mrSh!*HBMCs>xm*5!Y~Ph&i$WNw1&Xd<1aZOpYsjvs}08$sl=l9mqwHeD3w20w40*+Tz#nI?g-kehK ziJIM~d!0YH(b3&gU7`vEu=X6UyA?NU>Z-qUq7BowP$d5=59(?~yF2={YOdP{`V{~z zb*-H`$RhZlrSFe4O(6Pzu>AD#lwo&8bKjt&=l_qz0@vwCbS_uy6ol|q#l&hDK~m6< zlKXfR__25+t47XOKrlHhQ|UQKMI`s+dGK^%%tHo)du^pBz8JxN!P%@Sa}jAtMN`o} z2=Gi$`(O8V)jvT3SSmDV0mx0d-fQ%zBHf=Ku8Qg6^8JZT zF}7FB0rL!OL4R%3?D$n>;a?kPk1;&@#yk2|L$sLUBoW^u<2m8FW%a)7iA2bNwAbJ% zRfW{+UZ(}|3%~TN`@CsDF#m^jrX_!^rui4tkW~{v1QaUNRaSMiVd^0!^a?!oiQ)Sk zpsxC48cTxXB+U1JwPOreV!p2w|1Y#?L7st>mDXHKqV{wA4=ShKOjV2(N2~iJ%K=w? zi`9>rv0|LItI0T&)Aty5yloN{LES5GRU3q6)H*N z-3J6^08A~C6#*81YD<)+28a;stI*2;u<@!z>ah(m#{hMI5EidhBMe}PjS^88*2ac? zTB|tr-5E46q~z?nQ07scEpNd`3fTtAXEV1e)LvqvN74Y)#(! z(~D752mXHo)O&of`P19mtg&)AURNGCb^pF>EQt*QXuHY!zE=0|>6-a2rxuM?Jsln@ z?n5fty+zi4)nF6fSdI1xi-*2@Uj>s01q1-{l7x&1`uOB^N!zO*?cfiq;?=D9R-0AP z?d!$FQtkec%Y+!DZVRZ}C0D?fQXdR{{?m=kRU+N{m~-X1pZf}N&?Hsy@CQ@va3_N% z1354=FmX4$-L+o{t_=iR@1dKT#81hK_;pY0`Wi5QO>k=K9^uRF-9xm1_eHYt6p-m) zK$LR<=#sYUN^uy-c3nupu|^Qs80d<~OFFgd5@~6_F4+3|T_!BSCxw5O*t5Gh+#EV| z1zG6BqR-KgFBQk%iVS;(swnWwXvreY+#!)uBOvbAy@f`U7GZYYJ5frYn7)PzSl%y7 zSdJ`ztVg{og()e*gM1nh`$b)^DsJlfU%>ICiGMH!68E9{l7r2=zy0vXO+rjf2!4(v zV|dDoMet_HHl6ai(myqzZiS07co{iykIL-7%9TGVwcvu?VSTlkp!WNIJCs`;pWmyK zjIb3zNXVIPKmlcpVZm(dYXuZ5v@LKDbG-_G%J=)qJo~B$3}bjKM0h22e?=r!6<|Yn zIy!YNy)mdi&?}1!dbjkv`juKLD@KTt#w!~0y5>F{anL^F}&1cgbO!V4TH_9T&koAVm+~G!n>}8nIIus!yP`doe(P7sKa*l(a zIugc&t?!F^5nE>RExR)@ex`nvp96O;JQQd^-It8&?-Gs;>{OGxWZz5@GR_ffHt_>I^(nEh96RW;*HIhw*+GE^VKr+e?Cm2dNY-wW*L3x5#-PRp_TB5CTt8+LVP3gE|MG$7D_xW4jm zvO}ZrKliJ+3;(x)AryrC>q~7rZ$VSzt_$d{_Os|A{q=+sL;I=(W(xP!s9;@{79a$- zANSGy@1Vk|L}}J_l__)8-X6M?SYQU8-gEq#gH;;7VY|5nL!n~ndy5SUmjI;QeqT{n zxffgBB*O`zK4q(~bJp9m)HOkWhyf5(Bm!<1KJchORQnMdJ6v&iUk+yqaWjPzE(1Hg zFK5lZg+}}J-vS(=rXr@UAeI&7tL^RZj>DVlct(2%s2=EY_K20mzFI#ebCJ}Cg%PlH zb4?#6thMN%x8m;*Rno%WX+7bSEfmi`9IZwLd(TIkyD}k$OZ!d;{!cr9UOKJ8gq?k> z{IwHgiH-_|xHZW~(Esa`nstSdd!pmW7t<3}sNrDVd!&2}#|=$kZ6vfHyF+ax zBpxzncOc=+hQxoBPTriui`PZ#9!o()ePRy}uh&I1Cq-S3>mDvu==_DkM0d~iPuTgt z*8Q2jc>73%7_Rz>(62JXLpk6y52j1QzeknExJyBLh?s8HRw4`l0GiG z(~J)#Mcs9nXyyC!qQ)^kRM9WSeGW3Kxvyf)kZaW|`q)&u95eopjZE&2-N(fO zhCuqv2%sK39ogQW)_U)&=II+pRwmpm?q=B=^%+P@iqND`*+71tOYK@OX^;HB5alChe|u~|FV5w0&M z1M2QytDGaRk>q-` z1;^#yps#0&t)N{_`vMM_zIkSvmb1*n>S-+tq@7S7>f zKy+)OU(gAph(^UrqSGuLG+@y&@{~^(|4V66vK( zsF}>IzJi^`BpED46+KN9KXrLg{1^;v(Q>2?UCOou&K;6TplwY>{nU82%-0{k?_1Bw zW?piCD!I8kU#WLCQR@VSq#B#yT@jL@2u6a^QvG)bYX|EOUFBt!`H$aaEA9OFW7g_5 zazc!*l`h<1$uZMzD8`T9!AbI^5m}3Mc6H%6GPI#!Ol@?zN3h3#m3`sW{(qOTRO|a6 z@l2r#P8e}qZ0ir8jG-<}F8l8UJ{AuR9VF?0KrCd)QaIWP=fc>O;@rglDR~W zK@w`9-?TVaIZ?g!{=?P-!-IRuo%5+`_p<*W2jX|i>oU5H8DjUPN7$qzXp zF|a8XXRL6E5Sf56xnH+BN)1mOMuU38I$jyr(q?bFic2fTy87P*3vB#*IDTLt!i zqg4N`-wKR%{+t&=U}|OhFFj<&BGhjwI zi`GZl5exlQUZJ5`D{ui34wkT0j7mU%4vw-?MN5a3dx+!=T`Q5Odo|_{@t3C@={sl*3K$_K)P1G zef6yhQHZ3vsEMlhnuuG$U}*};9Y_lB!0h+QOH0!6XBSd z1ohv)Uzk_W2}TfSpC~aM2IL-#l|w+xgbDD>iP4by>q^kkcW;9Iw=w)L4!W*;5mgD?u!ur7V6_yt#+gS}7+Hgeg>KBW39Vjeq)Z(3gI_3Q8gL*a3 z|ItXSs&Q0K|MtGH<8?t0t2FLU4Ea%1)Q9EzipUO;BXv^Q2sCPOdiMTUEIF=hoS<8_ zvqpsL26l-paxrMw)L-nTYTln7m}O5yQEb_e^R7-qlTBGpMZc9%6I=Do!iCXy0&u&8 zYr%>d7`+)ppcSO7c_F=2}j;PbWN{Dp23~mEJF;r#e;yt%^4gNRR zZO&#*x#nl_DGS!5mFC_17iis26Ys*+UKH-jVfk02+Do1L3V+7nNJn+_CqqyL;9B`h z{w}Z$CPz767ZT`fC~JY@IV%P7F^SCBlM#E!N-C^^C(hzUSt}u2R6nv{S}C0w2$#qR%_&bSH(~JqA;dDjRgjt zxGt5fGopb-5^ybqim3tv)QdX3hU_-80JC98B!%5T?ht=g2fdRFf%;dzKEgP~-3^!m zy!DP!70AK8W8T$&^*%;A&(mP%Jxsh<cKCp3q=-!=N|W+5e6Uzl24W@i!(Ge5MwYm&4uQWpD{7BO9>tf5mYh451Hw&-jd@i z{E#)ezT{2S)kzgNfrhBO6bA!}M3v=xO*2cziE%9TWj||w5T)t_bnR?sr0prC81HSX zE=Fcm2N+wP>2Vz?Xl9j2nE`WOsxPEF%~{6>3*ly6{g2PTE+u)&*!$V( zg&$rB{#53#9tI?%7*$%tCL*@UpK;kDzNV7{TJ4h_XAW_0)`9{1FXNV zNRJNq0|OIrmoqK5EzIASBp_igDG)PNu*};j*7!M<4|Wm*%|m>lmzWYe{D53MDg||c`PIy+j>lIHT*y!Q68QPwY_u=%zos6AEm#$ zvgaD>4hm8FERFXYBW3UDo~;TQIJw2O+!x51JtIRLsK+Bl?$Oe*xS%^8S&FzVF*z82 za-~(Rh0Lp6HpN8rA=-wTT>(V|q^o6Ut21N;b`{H+HaXUJ9BqVCXS43gA}Tzei0R51 zzPuY83U$zZAfOw*p`}x9(Q<*t96nA>J1N2?#4I+1zTwFs(|-01E1E!w9V;mkSJ@fJ z>YV2$Eedh|N9?!fRD-U-ZD^TO5k#_ojlwj|S^_tkH%L9WH^%fZRb7N)lX8=m1BHPj zuicp#35}r_fMEghL?xJ2!f&bosNd27l%UAzjxv;KhLNrsh;)W1IBsvoovwzlI+cLj z6V6Rf+~d>ml_1;`3$uudczAp|~oOx{7eCeosd34rm?oyF<`cuWs?NZkZ^5u-GoINB35% zK2k@ico+|oootLyC}Nmc_#F?v7UTEaQmazLF!)@_iEVj~qK^yNcTkX#M-Z6eRLN#d z!syY|a*wC@@m+TAs-#H0d=cRB3#!EERayWb-Ivn1!_3Q1KxJ#V6Cgtq;-!2P;l5E$ zzHPr&jD#E+_cO!M7AQu4J)XHitD?R>HpCP>$kWychG`YUqA<}$#(n9p&O{zjwbyFP*~);BQ85JHZON4$bI6syIb29EKKTZ@mAdkH7tzs z%)@cDeOmW^`nwEi?sgE8`=BX4vQDm5?Lr1HyjN5~;Bi&Jdh`x_JDBa4%syc8` zf`u?>y!d%%u~P*W!HWP-=|66LR>c~d*rqR7w^M!5!d!rLZLt9*21q(bLHfCov2~h^ z$Q$hjSbBf-rT@E}MZ=umn}e9Bs15RP5Oj6MgtcmR&#%~?q!4VnEA{$#(S^Zv&@-M< zg;3_?>}B~2$O~nES^<*v7}~+20gmEi0ce^MqmBO8IltNpGVs2*yDN#5Gx1nF;$#L5 zZp*&P6oMH5agyp&3#K|AL}iBO78t^Ua}b4zN`2I0Q@9d3Mjh%a9qIHG0sabZDcU_I z;!dxMw@hMgJ&dye#)P7~!AFEYo^bP|bT?+{P>*Tnp(@jV1-vLPcUl)=n(Lni&D~eS zyHNaEuFCx|hcH<_*!|_^CUVLpa7yyCP7Gg6S&-Jqz=QU==M6<4+RT_Yk6Xg`zK>i68em8@Nh6jP%7;^7hLR6%3?oN47 zHEuM6MYmOds~B|k9`aRn-Q4HymAL(?lEyIH?+frfe$Evjdl%q2@)r11=TUa6tl)V- zZg|}RGfP`zm6V?C>jIL-vyDgf9P;Xlj6Qk+WB^T>jCo*uB^C=UK`PNhpcdt8WMpct zt00Kr)({;Kmagm6{|;&)#&Ez=zDk3I>~%J%sspBf8{kT)m?e;P1w1QVC0c(sqNBbT(cB4%0_Gl|nY*{QVsD_78ZD$O zuQ?bhoXyVm=N3?$o8Y=C#lEKGiz*JTgDu4jT(zh{2A|y^L!)See7LG4-h!RM02PXz zI}p2nn|@tjm&ttrJOwVilwIz`V{5h!JJO&FG?t@XbQ4{0wpQb$DNx8dLlC;MMp3v0 zPe&3Og&XX|=04c%M|n0|fKT9&C~m=gQqZtP+Ueir7?vLKDlstwlfWC>z&aFf8;*t| zi{S}CweQ0GJT3&rLEqKh7s{t@D4erdWnE@}%Jav6(NdBi0#j}H(zfP|^41xO9$Sn? zQ1P98mtL$1uddYKKmWq1|I8v%Z8S%{RqMhs>yUr9w~+zI1F;0MS^KaNbWct@xcyib z1cOWE1F7)Y>5vqqD~ayW-EuG}re)VD#kx=Juv1cC)Kz@B6D448S2lIx{HUu~N3`k2!y+>8Zwz^hBXd~G@|s0d_vDBEA7U2=sKGR=VGVY5OvM@dkg z8Z>)qtS-a^8MQ6sm{L0E(W*%95#`8~{VmK~k0rAfeRSd3HLvh%gpW*b$|Uli3X#6# z5Sjw59vIC4O9tH|)To~{{RTLH80v2|vOVtI2A9S*umMcrE>Ev3P^;adla-JdeE~H< zWp(jUT|^xKL>k&D@?4BD&ZI;4RE4ECr7dFHCh27hv4iAQTL6F;xY{J7B@n z9`#?M7x)ChkO!%`mI=ozh33I$nrc&o`Z%~X6ORSIW9GoRX# z4i{vFq&X+e2W-lH(BfUh zKb;K#@KklEnfA>7vXNJstOvbEJBAe1f4s3Kl2q!K+9B84SQU zu+iG^jvl^%y!16D0|~(MO(kYlJslZ(K};+H5aer6+b_m{h>Hr`xPqLx7ho);xJ^hl zC-cA}ux-jHNpau^HN0qTH|%9%_-0_oEdj3EFWj0mum}lQO<)2XYN8JJR|am&NO)H! zR}17OREmaTSAL@Z4_{ieiK2nDQGw23R>3B}zYWw>!p07gCKU^n&v64P8EyBa3`Gng zL%!D^?-@9M19ta@WXEZ`#ZL$Z>rU*M=qoQ*V6poJ+8}*&5k<%4%{^d9Td7W-!q&ZeF#Gs=* z3wvcUPIVkI(8JI&H937{Z=FDnFYXZ^6+TA`9AE?*$>gxS5F z0aV0+iOGsr^|rBHQpqT0{XV)Qy>ApWVKRpK2G%&3ud$HbB~knyN0b? zCGV7fUHP;Vd(b7IOa{k~LW)>)b;DLe}so)B? zDcJv0xC!3js-Ny(lc%JDv@m{i`O0aoAEPaQTO}>`>eDZ3v$%Yw;>_g#vRCPQW5*iF z=ks=yj4EdGQjN&Q(_M8pVrbS<^!#$v>Vb0aKjxe_qG9|xA6eGtBaI>;f2R(c0Qr>m zQc3V@!0IbRND@IeNY9eGRyRexKxw*jt5_Wz1#5&6MImxy&udsvsW|#~LM<_l??yI% zD#C1oRR><8bA5EJ#-f>n=;Rq#ijR>sW3rdzno6O0-ks#2InW@M)stPwBNwVsY)a@x zG6FWM(CCMObQ?y_n7u5c?LrN6j2+F7o(X}Vv~w7U!6a#%5-;R;90u^t`({9q?3WpF zj>Sfb^li&j$7W*0t2~*=Uct9v->_JJ#Gw{6l|U>v#gF<#o4zek$&^ zgoh+sLppAr2!RH2Ix28$0&s@8ms+?^W{K-y7KThy{pKv)i01yd1g zjWhEx?6GshskG`UW_#+oiG5~a^ruo8yG{bU9Gjr`)ZX=Qyfp@jmvKWWSZIHCH9!4T z%$~f90lvV)0L+Yvb>MXlGZ;ey6H=3yh^=Y{Vp#AD3UJ^QThT` zG5IkYMu2f~hJI8Pk8QnE^{gTkhzir2pED62L`-%k2P{3C{|^AOhh_DDb`;xCO*$&@ zrBn#0t4I-X{q$LNP@#gdFa#9J+Av}8ffKa8UsnR3hbvKQgCRb9V$x`$?2+RVmu){)+l$qUp1*1ZE6noh4P13l_>R_jxdvu55{e#Qe;q zLBci_gk~Zy4C?5hcU7>~>PJO~Nvi9~!Abd>AVp#tpuwFdV7$P8K#P}1Mi{fvAEKGd~B?067WQ`XjesF%UsR*QTIJdksl9 z!|QS%ji?aUvU1w0I)B6D!HVJwBFKV@CX$?m@VuV7VaPaYhkBta`!A)gp-H|1Kc?>G zLl$Hl;S)kJ7`8NjjV%g?e=njYRbXAzr3Bh3AoPB++Ie%U!>168P-LLXYX%Nhfp7SF zFi^m9e%Ze(m?-2oft#VX8z{0yQyhhS+2N?YA|f1LV&6}484+-Z9nt!)SKw1NI!%X$ zTd+70CjXUDeo+f`u^Wg!F_eQxx+PAmBXz-qIrlWODxx!gDFXpHkBiq&l={$+CBIoL z5-U=xkhnW{9BnK*t~E3l-UXxt5*zq0C|(0bG?qk8LvuC4dzBk2)%qJr-|Agp$SK#) z`)lC!!^{eJye_RmOC~Xy1FxC3RTVLSIKEOK5Z8x5+^RQ_3C6uP_k)ZUxEyozVN&8p zF5#t^q=6-Wxvhqb({2g38_3DS0Yt+K_@=_b_Zln!T&v^_S?m0KYL}J=S(%gu531?# zcS#4_he7K)>`&trCds--=FQ>^`&osnMO0w>DveZRbRg>x3ZH_9s>{oS0 z#LxYZDs_#~?wg;1z9IS*ozAmfb3q+hrrK{_p!z&1ZWXvn4lDPo5x9XuMvS+en#R~+ zViB733JN18s;j?D$J=@%FsRtZOGF>Bdbt*N3mZI1x-)z^??>rZb9i#Vmd|H{dzG|*d8pVJ40Fz-ET&bl_ttGzG63+ZoNK;9!3b>}VYpkIlW1@)VV`-IPb zF#d%BLrRdbEUkAoS-&cI`WsAK1w6fo?3L{Js~&n;q#|Wp7;1^t9XbebQV?0R0d79r zoZTI1uHsY@T^ZN`4eAo+ILQ(NR7L2_-hp9+v;_TxAdThv@Q znLj1CxH(YXQbAtR_gd{bQDVElDy(0B&+O^xaJiXfMtT*QxP8AUQF*N<(U&G#sE*mG zLlYO5=u-7ijjlmKcYEicfK}@`b&^7eBXPe%mf1@cT;1H*L3F{Wsccn6#&vZ#a540K z{UVM=%7_<(ehgwaMlD?EMrj&5u5fkduQ#>@WpGJd5vwBhq-Kiwi?ISus3a+Wl7I8Jj7I5MsGBhIV4s%9hn3<|tpHTVxPm-B(8 z#G@>AaDVmw!d7i3#wA%1FFY`XGrW9D^+l;s7X6 z3S_8(14X0G!nX47S|^5}(xXCDxsVfKt~!Kfpk`Gh-Blhncd)tlZz1G=klE?C2pY%_ zFUhKa1gg1|d_I!B)({LRf9tWhHdtKl)%y&5#MYqI z|8mAOJP^`hW3BEiIOsZA9T6P~vfvWAEx9d3lofjFfxb`&G;-zSoql=MZ~neAkO^OG zn4zO$9mEQ7R-=^h(tjm?u05O5U(_Y|h-^0D2dj6oU9KAF6tr1i;bdP~^kzKa-gH`2SCIR@Qe={ZbX4 z(vG!ja$rQkxBH*^`M*;Em=Ggml@kXc{v82-fTqTK13>k#fQ<3$uXO4QU0su`G*DmS>!JYX zxa6MN#MuDBa)^y#J17$q5Y1JsmhMj^sRyZo-Tp5Ef#$s+8-#D7yFgQA_KPe@zbk?; zFh8-YOjSCsi!jQ6ar@Vo9#ulE>AGw8j$$Tq^I1AR*feAckeICO-~m955K}?NazC5P zMa^30sCyfBRRbk=t`nM}jW5&EhN9`#dXoOT6WP_bEV(o&Gds~4-?bo-#Y$Nw4`=k= z%5?Bo85N6`g@IcbmN(uqZ zy{+i)H>avMTKeclA}ho7Vt=t{_(&GzVIdg?fOSU%RC^wV)=L2nHGg#nW|-}kw0ck% zT6fdjGz-2Kdf67Z(zxtW3t>Dl_cg}XKtJzl>EWwajfGv)o-LQ^Y@2Y8*yM6?`a zC&oI5j(&B-`5^6aR0Ypjo$g7B0tcnXj;}8anuVpX>m2{7mjN%dC7suU5}D_p;g^m~ zx#;#Il->5WfxgEmLwCyNefWNSn6*@#OkD~SM%j&jK}NiE4e+v8xvxM0i>O+m-i0aCZJ?$F&MAR0VSPmtmhuw82racL_|fH{x}v2-*ez43dJbF3V8_i5r*Qe zEgk)Ty_eKqQsw)6rmsWXgf8xGh)9yc>+jtRy7Hct_ZETHPjZQRu3V7S>9*m)mv^dn zSR}nG0+YYrr@4T8!lK!sVB_Hn48eW)U4-M{bM`KpcXbKAzuF7S24a)+86SqQV9?|C z7M4<Mtr`&$QJN2iV=@oY1O zsu2&F-UE-3>S)L8UB!W}{1Px;69}%r_MPvHmZi8=zX2Fie+a%x$%;_J6=L|p$1 zRL4@6`;;(H`sFL+U|`oeOq4ymIKo`1Dy*H!>ud~gABA$_GDFwCm+Lhey>p2(esNcS zx$vmXo4eKM6)YO&!rW8_!~-_{kKfb=E_v(0<$f*Bzt^pmf;k%RD?|6x6{9c3o)_C42!wkyjEHMCil4#<43QEe$F;y^A=AFm0(kar>TWnX8GvbhTA20+I)T zm4lXtupN#E`_<4hT#$Et{~|16b4DoP{y+wXi3ExjAhFCy%ppY+W`@g^QC}AWtrI%j zE$tkmRW2}SFf;;Ig++0BD;pVqhFE1LIXZ;1>%|or=gfk`Jm&0#^Yb-oxIPdqM_h}u z(oTtjw`3L~D~wxj1W!Ou&b)1iYuK?2#vxRJS*$l>LQ%S=gGD*GIDwPF6B+>RffZDE zljQ-Vf#R9ou0?{xf>!=;l46?>Y!D8}&;Ls04;Rg9raWDe{)6_Ll1Y(&Ibk#E${$hoChm)y&QVO^}g8H1`+1zhDF9w$NrJY_GQC;?D6 zdkB1~T+U%Y<(jSe>?8z~f(26YEaau`B*<0{mY9?1E z%`vK(aoT(LttBY|m%zpUiS%hO)YDw<@$E{+(p|^4=1YtL z5!_1)KGyu-UpLCj1UeG$XKXxTsU^BOZNMf;VE#@mJ7#IIQ+yT#$RssEDug7*TNi+0 zl6iK@sTgoGZ9m|yadQvD%dYPYyiMhJUgl)Ypo(x}BitE4`n>I1NUPF7EWx5QSS!2&LuU;%b< zNH!7o2C`zdGphy+3X|c}i|oA!h%MzG2|DB7g zIpb_I1~qtp3|+64lB|~J7T9jT$(d;8YU& z4Ny3OB}yRSPswA}0=8Z{7SZBekYXW}n+F4jDGcm?A%vr;=34io28>R(!wJi2PxaI- z;9XR7_n7yq;v9RrU3!NRKi;ZZ!d1>ubd^l7+pV3plvIH?-^ArPBBTzag#?8zpXk^& zES_CL^!imoe?U@hmxNOcsD@laI*PM&%o23B`qfFueX1LyOmS8qQDc!K5iP)WQek2h zS?Rui1lX=Xhy@o#6on+LaKAnwxtyp#e2P+pFR^=`$RLYKuC39AsbmUq-~*>D5tfIH zOspz^(7UIiA!=ZyvMww(Xvx}NNm8?F0ehvwvqF-#rz<9>X2HOq(s&62>eWKYeKQMD z3LXi+br%Ean_UvX%tvVN^CKxFGay>n4(^J<*g5U*}h z>KZRx_-YQ2g^^Zb?=ci39T-E8n)HYS*IYj55_SYjLxYetrA#D5ZFRp&rXg1?VA^8s=+_{&s)i@q4zAl8We_0-tByJtvy){2 zs8527s4D2wt(WQTf)w!PWa=zlvg^BL`;6jfQO~M>lGi+(#wS=AbaSd6AQeA4A}MD&o@3$VXL~3> z`28M)1BFKR>-t8)yT{0e9j|I+WK_7mRbAVE#qD0B>e}<~uq!a3SXQN(3qW~N3dICD zM7O;-O|@y%L=8+xDik=cI|iAxMYx0UWV&XR;?n?N2gddVW?v_T+=9wF-|>HcY05~W z8h7j+PBs|3R&=3eh+5G$rWO_CqF|kJzdtSK{|9H7#%gU3n7xTrU|=CGLOLDR&7YFT z;a@7E9HQx!neT7OcB|6Th3?}8cB=@1taIzA$!Is&FMICYvSaCa<_Q-Ys>PaHAn`Lz z#ccE&nB0K)z&zvi5k`!d#VwhChl~e+jBuyMJW>@n7@%bJoQk@a{wC~;8FdzCTxV1@ zd@-o=gA$nw3z=7?h?^&gU(NW8T>{G?W5y#e`h}M!yNB1zjKM0hz3rlsV=M#l#hNFj zS~L$7iqRpDg}UGwY5+0Dv$cLy2=QP^3M49el9zzsSoub=2ehCyjxcwBP0{~sQg}-x z`QW92_ycaNVZ_QcgR4Z{`?>7n!m2S#E)1XNH1p=zs8E47uFB3@YOjr(jC&G3A&St` z5Vz#fNfGq=+XddNBhx@77^jik+-Z54UW4wS20u=QKRcsrq(t{Mq<#A;e`$MhVn0|2 z2;EeDjARvC1%{Xv=NLDC2`oM_VW9{c4z-l&jsgtwR47kM>V)Ml|D585z<{-&smNlw z)U@`Usj+_q?!fRJf{7RZ9^zj*wtjsh>!+*ru0k>@BC)u zjz5nRQ|5u2vDgI-}7L>w4v($111Iba5DuwM`0vSun# z^#6lAOt^Jjxh?~XG*@S8QiPsl7o_({iIj)^^&@$A>cz8k6M?E)kLEUXC!Rr;}734cK_5dc{TvzVH& zz5;IIA`0mqzq)k(e_pg@T{B%lN-&1Uwnaz+613{E>y7IR3gx-n{xBstcw4K2O4us> za%Nu(PS7LyT_vFaSj)d1&F*@c=>^N=?aC}Z`s*?yRSOXc&KqnUJBG$32EKioW8tnN zh7v;#3|Men3OCubU>h)2SY502s{L26{4HktL)>}~p34$Pe-<#!tuCOrfsrPuY*d)h0ojh4r>)8U~w2LUOl$%yi~-f>X}|_ zW98!GJWRa*e|-(B=n-})x-wK)G?cX3K&pobFg^0b-}$G<{k6IyfkkdzfI3cfWsv4~ z2ZpobWBfXtiSBd-2pa8cCriV%Z!0$D#)}rzd0Afs!SoQnG-zpYqr>&pNMyt+(7b;e zRtD6mhq36JAGxQK6&%JWkFf*b?fCRakDQR5ck6IVt*-Fbbo3FGqTH zHzvDcuE=S7L~q0(BNe1UMOD3inZ~m?Pvrj#oJ?=_b*7NAUT!B z2MgXOe~bNNsc_x8YXT2gbK&uS6llsz<|?RA9EF+EUMF=IKeZ@RxnL_K|L4e8ts{5t zFe!~t>UrVxF=G_e-jt|?BYnuCP|)q9LKj~|IYuj#RbQ*C;hnx_daG+?;aMx#lp$VQ z;h?z=jLpR+bpF*LVWRh#)vZ5a_O;WiSgcDle{ey`7-XMLHCqV>cOT$VC+x2*41(<8 zM4igyW`{8MVj(4N+cs^E`W;K!emwrL3$a^%wYz@S(QHgpVZNyC6sY@gQR~vv<1w_Q zz=87tz-H}M5$jIaP0Y#}GLfh%m|ro6;Vs0)SnoP$YqK2ag&8rpJOqJ`>sA3JP_tP2 zf0J{C?0cHrcoaUdBsVmD46-qBb4+V7BE+O}ADvNM%-3q_iKSs_f5hB~2tz#8Pcy|M zTc#J+RCzK%SP{@wr2z+q^Oa>mEw^o4Cx#q-S2)-PWnapslLY>`$T1WEqL=9esI6X) z@F#LrLPaD1)Od08z3GYuFqk_bN^yfwaUe%v`Cg=j-yz4YD1u+=JFB|LXe?yz6 zE?cCogbA9WAy#_EIEVXF#0X2~8DWD)zET>mDwE5(rd@qKzka*lJtKO zF(TSh7f*P%sZpWa=@%*lF09*Lb!)TX`MyZYgN4Kd`TmN5>{aHK=u1D8FaQo3r z5R-*oxj(Mc!9||Dc@>Zn2;&!oOp@0Vs4q?Y&Pxm^VCBufW5>0M&605bnw)zzmGAU@ zR+D%kC78zNg4TPX0&7`@)C|)IEnjD_g}{i)zj!BRpV1te@e?7<_x}mBPZypH#mo#5Eh$!1<93ojM?a*4UoInA!0!2bf z988Vfb)=Le7Gtcc6>^RzA$faZ6VpEajP`#b-!G=2ruuWPNX0Yni)g6=Bqr3(s>M4n zpNGo$_#ne*QlpA5l7VTm#cGEZwW#rX?RRNnzynp|DMS}#d|S#pe}`oY8*C8`jfkf5 zw!Z>B(B{K|WdKr+WC|H$^TXEz?d?0|HWLUqtwk7VZ-*Kfrw;q-MqTKNv|NiaTc`?| zO<24s<7v7KpBEGkHvuXLddW(G6dg$?5nGXI?s^8=pz7ooM>xPmVrv8f98kffy(MS0 zL2!fQlzjy(^I#_3f3DHXqj(Wm>)x-33@#1M$zrBC>$kYIKLAM6yxG%t%ieu~T=(Vk zXrUUUsB-2(P7IyxiuzK4o&~lBm{k10vRC!Cs++J=cPDOZz<&2_ht+}N^tbFAzz)b% z#8j=g3@qgTVxnn8V~9xqS-^;|TZt~=AfdAC;QnAp#2uqhf3TQsZI7>N>sDj+tyo;? z^qeG8R{>^_loEaYFLQe$<-9Kh3+?-;EzsiUuDOap72g5^hb>iSa)Yh()~I+v)iJR< z5e6(MZTUxQr)iQ4U*FGrd=P`Zx<-Jiq2d^367Op-EAMSdc~>B|Na-9=dH@T-35tCb>X0M|3g!r)ZT9yhisa42EY7oT}TPad{+TQ==ygB zFoDkW-}J)n{owlT`QFCaD}R+3+7#gqT-(l7o*0PG&d|Z(CC@)x6Wn7tzVCg<6M1Y4N=Kt@s1OLj^?MV%&#I72=r*r9L97^m37zWf-aFuxST|jN$qNO9Dp&{?6 zua4^caQ)wxj2}pqAgZK@YQ|p(Y70&C79y$?e@@YjXhxz`pe#3r4Dx~r&ULpt$UaLm zD-BRgv{J7bq975+k=wp?hXS*iy?;A|rN4&;MWu*FMdcI$@+W8d1>^src97)1%SZoL zRp1F?In-$b9f#@?hIlMNWoY91)6(>Qq==E~3hePVzR3LLyRc%2ci$S~;D{;LA0p+U ze_RMv48IuGq03=5&GACT7-+E^v6=H`;P(CgD7K~#s(94rlNMygAFIk*TLoW_0dOvnLK?}%|UE+Uz6$C{P@hex1mv&c%#jz=C|2Qos! za5F-7r2npym`4IT^`n7`E8rb%1OJkwe>EQQDZVK=I%b$7rQ*{5RVyi9h|f~@>-FyD zQpzD(#D+>UC z!hZCuHhD^;2n-9^q3}%Kswg&*f1fNNY$1=rZ<$K@m$TSt0e@u|yP`#!?UoHv!pow3 z&StW5JY4WBActb-<+gUx%gr+H(5x*$g{x6&;E4Q>o^BlwY>j0X@nnSsUJL86Hc?zx zV}tQ96eP3$_BZCwG`LkP94uU@*@7eslHADADVQP2yQW9#z(T)+L{LJmf9AW&(Pv9g z?|O*9a#K&hh~#fCid-wiGDkS<=+Hg1pq3PdE#1_0BZuxje1FhF@`)9FZjFAOAkuN zG#S+(ie0$A59*6sA86%se+i*ILVckFpb0|`O+-aO$c8A$39|Sh8=|2gosEDa9^(A( zl;ecb^R8kKIV0RGRJg>3gcz-Cm{2wIn9#g0)MABopDZ{}?h|x>hs4t#RNgNXt?&!- zcOTyefFli7Dn7$Vie~{mOl0?!VsV)i0 z3cNa1A{dgedBuFPLFFp0`h{mWVLVErQ_xTE(-fChJ=|cw=U2zZQcJ;6cn@k?SO@$l zkcTmO^7-8`A%%6ZPkTIav#Ydeg3a;W6s6XlnS2^2)SXXJtK4(7sA-}Py|AoSU@(AS zbZw`E8e@rG9>$#-e?-;u%^Tkeygvfrn*#XDXa1iu7r&)Fm?`0h>Z{OVCRDn zrug7tiVrTF2T1~mk$pGVm~P ziG89SP#wqxe;sp&rQFDYVuTEIc4fbw>%#JRGGTT5x#e|-Giw<8zhNR%Q?&;TYR@)> zL1EwCi@XBH0lE&cgdx&BpHAwQh`&eU~cqxs^V>f5~=voL<(Y*1u=9p6BE{CL_+ipw z@XQRse`4TI2SIGXCsF{s5sT|8xtUiin7~~ncu{AC0lm8+mRmReDil|0#4y?q!mAx3qgzUj=)pR*KoK7Of`g^t zzO#);d@{Ox@!<9qb&*G^FRZxoa~D&h@S;P_Dqs`YNX< z7yul?#F%N_+x7%^F_9{MQ9GC0DE&89{dl?u5R6)OXB`8Z-JbtwfYg#J23dk>hfh$5 zf5`zSgSKQ9_e+0#6i8%$9VGo>agj!AORLtIFCrY793_`%fhKq6c^yKmrP8WOA2wW<#HD7^NsXncs*rwN)2 zn0u9Q&fwup;6xY?IEyE+ahLcm6qAtuf1Pbzp%)BmmNurjvU9j;%oa0JYy#W{m`}^r zZ7(;nQRMsMCY$%`V9bymU2Dds8zn=Vy!MB5l2wyRRi{2`)q?GGDYJ|dQ{ zh3TnzHx?h#xUxi%g0NF@L3kC5n9gr>GrAK)IX=-qij$<&vMqGG_iWf?1h3xQT?)?FkfD=X5o-Z|XZ#8w~Y&# zfWLf_zYLsxJYU|?(h+rfukQpNRCxG)mC&(!?h6}|1b($t{|hdl>md1NNO$7`e8T~s zTvc@rvP~W7-Gdp4|KEa!E2;{0b1B2Wn(hFTsQ%t-r=<=x{u*MGuIybJf0vpKYU-|h=oFDLt#y7u8L0?H7v@eU0+c#e$?;l1= ztE^Y@QX@NOq5Dy?bv8xB=6eCGoFRE0&h~CF!2Hu_T))i2Nb`tZAMI$dE2BiA$Bw9+O$FzeeEMVNFc;{%jAxj8Ya##*ky zA~h{3F)9-%moe(Mm$11IBSja+p7=InCTS%y2y4tGwHI6N3wC^ve^yKvwJlwNo90SQ zffGG-U+kW0#rWaFn82vI;&w8H;3TSK=m)sy$={}=Z~-8EcA6d1cy+GZQ!!jHwSdY- z@(}tkg4xU4z}IX4E5V;ayjFn=&t=aAi`j+B!D6bR4;M#r^FfEbY#NNO3biE_V+Xn~ zY=0iFc8|UXwcfAjo>HzTtPat9Jm{r{{A*K##FHhy$;T42}ez9Cn0vHMsYTp_kn zxgy#}LjRxCRS3jZOi)U7t^a=|TWO-{(6`Evol9~lq@-$daz1f=R-9a=p%=*YhuT}_ zqJ#w@hFkVc-1@+aT{;(ZmZWVkv3m31bU1o|;ofBeR_5^7*;xhnh4eWclH z1c_BA2GaT0DPsV^kAh{|f1U8EpsXv$wBYWM43Yl+?x$6GzF%L|A)O-ODEWT{HG0iw)0$JjX_U{;FgQwXg3exc7K!Sf zvigfYj>F?$f1gAxE1LoGzeFYa1);f7N-TDN)Cb=GPCYUKcu8-`<%wqMUR!h0{CeZ;Q!YLBd%@ky3=1!LQJ;`U zXW(uvR4Od^cUlH6z)<~pEKe2V8ItvP(nn9krhvG0ZCw&N_WO8ui>DX1zK|$(TP+iw>Z;BM-M;{Llk=hl##JYgblu{N z6^Nt)riFQA2)yLXYIxTn*^Bz4Xh|apXBAd2f3Qv8XaH3UU%&Mcpt@9H@bh$TR+-Ax?N!^!L3K!jC_?)p%~>Tg9oq!$HSRqsG9u`>+)_Mfb(7~w*$ ze>_rstqP#zg_)UJi5i|k{rxoS5XGtL0~~?R*8_DS%nF|X6+jbqtJS-&m-Pj+!ToOb z_C#TI@j!MNM7IJ#mvl2ehx0qR`nudIYAjO)%B(D>n4#r@Nx8TgEi;obX5S2kK7eTk z2Zl$ZgG=Tqvi55%AqW?Pn(g2|=-DJsf1c{a)l2s4@bc?{R*zs*V{T6Se@%sh>jR|o zc-#Z9%10HrUb=fgRvQ>&q*fkOb78cRK!5slXdM?;*&OXL~c4w_(3pt&j zX?tPI%(f$CW4%_4A+9p-Cu7y}I(pc|1riens3{dsXLSO9pV@rro-FG4hHnVjf8VSJ zeL>O-en@JW0wD_(DAIS1%f06H7;mkaj$2bOoFjelZe>pns~VhC@)KFI`YI}b-5;V;toP|jQHvla$?sb#;s3fI7?H4L2dQ*>jx7)nRDNT^vtNz5s)q*AZrK8d{6Lz>$`T?Uep%M0wePe?(KpNgo5m zkf^#+Oe6&Zd8HoLRB!cUd3S-vAEAr?Yosh~bX^edt}&Pj2ir8_YEsO^U;|cPLZt4x z+)^2Jg=LYjz&TZ(Dq*88uv4z5Qu zGyXeLS$F_&(|bJ@!d>w+e;%A{W5O7%wwZj_9rUraTVGptRe|s6|;l~Wfq(ESA zSEa1fsJo)dAb#)fox^{@E|+Gh?uOi;q9KS=3_XJC!?56H006}Pi~^Dl%k>1F{HuJ6 zvmHp;!mcYz5H##H9aDX+v_U8Glbc~)8cP28+PLuZ%mTT8gK)*Be{z)Sb$H~e_En4x z*jt|%09LNAy>3{xAFXjvuYv+n{1IL99#$m zGJ0y$q@#|>z4{zhuifa;EIzXY%tSpkK7R5_LqS-s|9IiPfjOJfpRl9an~~cd=EcGf1!$m?}F;=$BX}WZev`gi8`_Ll%SqR1MfS?CIx(@Ep_nQ!yM}2 zX;*&?Vxq&~BdI0F8*=AeK#6_77uXXt+md@~nFZS=1^O@1_Jzc*A`Dk_~!sFx( zDIUMo%PpFnf#b7WzZOu|&G~!2BF(Qzt9nWw;|x9Z0@i^re}%0Xv=oZg&$m~P5E~1A ze^?~_G3b>%OiL;XQffQ;y3^%wbs+6x1a3WiWo{faB~%&gNcRV-MVA&rHahh zr4FMgpW%!sFouZk1Me7Xb-)|Y?v$Z7v3m;coVYI{I5~L6{iWc1u45P!G8AShT2{AX zsz@-5E*{_$s#Bpo2Kv(W<MLIU+h9)i`Grw+w6j>_TtCFMQr*Qx zes*%^5aR$RHl{ve)b+h9K+B+lMP%ArKn&K1eOE&jKa3SHtZg`m#+JB9Ogl%PUYF*2 z385tEYGGDz5rCc``5Nd%P z^>LQfwOzvGwWMqKF6&58yP~{kg&w0)X+f>sDdoRghn-tr!{c@R)ZIhsXHs56Wdo_k zY@qGywtIdx;HqV7%da5S^*XHqe#%)P4pbr9-g?a1L-! ze-BXv25*|Gq=KOdD%ZDOJf6vTe;29D5E>|)8(oRV0GX|sl(w}e<`%+ z)sW2%h1*)P_&X>HQ3P%*Cv`79DO|k`im)A&{_Tr&;_B(}2rL2y{plENlcMe4%0h@~ zTc#B5GO6OFz+{yn-eBs83RgN8MF9RMRHn%RQ%1+i?ckcGX_^xr9ULdDf*ETnX<5wJ z*p>QE(lnKcmN;YUx3;KX)q|@Le;<8Qi%9gW=o_oD4kU$r8rE%hI`-Y&uoPLOY#&qr z6k*vw^F?!Uit$E!023Atv1oFyeP`QsQM%}yN`*VgJ|gd^5WBdHV3cIp(404zQX~Pz ztKzx%DiTRRw)C**L4TD$=qL#zgiNS*K!ZmVoEliIf6ySyAPH8;Avh4y(7}-n zMFt^+!$OJ!`4@*D+6;}tj8H5EoWcT&q795+$_c&Dk0=6)fd8H7i^d|L2+f7-hZfmH zxtYqQpM7Cb1cQZ-ux+gre}{z?1&TJei|ed+mYtEHHZYH>Q?_-A_7n!tB(!FUNI5$N z^%2)F;-&gjq`1>GksPwUOjcM;(=<&Q6b^7=d^AndG)+=spPbV)P1AvvtDw7o(=<&$ zJvt{emb!$X9Te!#iz(YG-{`7Z*{t=~jqK$$ViPGDZK!PO>-+wle|WgKss9G!L#@xd z&SJY!SEH#$Uk5T&*tTdufGRyi?UJju)ZFA^WS+i+L8DZ9f(QDtd)HSHmV$_@o7C?t?y2`)e={081 znE&ku*hlH|Cg`cQUJP|{c#84j$Q{eT%IlxH6`SS-YUIcAe`&=9L0ph0y*sM~LDt?w z*oP{~=bN6YB)R$Ax!u-I{oz3@Kv!$iZXW^`35&tJG{yc(CRHYwmd3H6((V!?T^fit zA(HE1dI$)O>!+Gu?`r2<3n=cjAQ3qamd5_*pZ-hty7v$FeMp!4?SqW$^83B}ta(@8 zvAx~JQM^#we-r(cliW^K1a`s5D8oCn$2?xby^CzuM^8RCa%reEb$xwhvGMi@?9nD-;_BA!<@IZR^f;A5e@h+i6tFe?++}ucxu6NFOFMoleT+zftd3M& z2bQ9Ne_UtKG%__QIsK}G1u0ZulB_=tKQ(Gp39i5jNxY#Nb^l8UFb*xM3m`FyLO%x= zeq?(URT`yqHv!n%y5g$|2OnT3N{j<_OIBzBOdgw3eAkH?>lb1JtFo-BNsYUE}<68e_JEkl>VBb)hSoGlU$YZh;uRx5W3%?=|6@GMmVh{pb^R@nG$|dn#GwIfe ze?ixGb1dc;3;MR~3$JThAc>$7GOo*~2%C($psb;vS8Lo=_Fq>WR<{KSvCEf}q?JXU zQ}b5H8Csn0)~m%QbgBa6Pab^vtfBc-7rg&T!@I8{rdZ`E<6R-&J6(Me7E@KdBjb?1 zoiuRgOmx_YsUn`0&2ly+hKtN2Gu< zL>1xn)gj@0yFR+tH@c-LEC25sMQchTrHY{*=ZCVqyPHikD>%xoQs@YdPpQ%u>J1K0w$919u)qhHqD($hf3v)O zU!t{hmgG4qWVpB35+f5$VNmr=(cqnuDZ=NEdk*ftAgAnu4f5o#Z(T@_?=Fbb_7GP} zoN@ORIv8CYQMf!R0ktfh>@0YZIAUjYM|r^u(~BbongQfObtMf#7a_iddsUk)|LeB% zbN5wf!u?UsnqwF)!H^_rV3H3xe*hBFBu&!!@BZxj6Zmp<@y1}};z{iL(^Aor1}3@1 z``b-j6h+{4-A(Txuc@oesx|>f!M2e;0w-Yz$JMjI?S|dMCv|@$s*~?W=!f8I>x~=3Um9&?do+#J|OM(fC5HtjJx;}Gbe~ff%D5EB- zDV45qs0)Z>8Co=BzCIG+_>9UsjBQ*}22+k0E%Xo+#&F~~;&ap>qi~SX=;_g~yn#sd z8=9!wy4SnhuarOoRt?jF(bj^`4XAZKIPBr2yl)aJ!XhY$m4s!33KGlUDtY$vSpHB5 zu9Z?Cm@=*5Oya6S5^Q>#f0|$t-gA*q5;kOOK^LP&U+@q@FriR1Db5oz%!J*?%{WZR1mDNj2nM0p@l#mtkz0d!uaWL97b2VL zs#G@KG!lrVf5%dOT%r*i#`D?ns~&Q=sGN1OsLA#A?V zMX$V9*&b)Dk^}@z2IXt?-YvVXN^%TrU(0wU0+TYa3OxXr6oR2LuU!T<1d=346*CVw z3I!(BVgL~v$R$Zq8zJ4-;r$^+(6Yly)#=rn$RdWXg~;m$u$f`<>*_k?aihj`AB;FR z?NufI@;$k*D_i_>fByB43ML=bX88o<{{$nK#!2h1^{=i(weqq3$Y#22Qa9A$wYZUe zbxygj0PvM?bD+J8ZF0bm+T%i!i$X;lVB5dyr39IikY1%qD)BVS2`Ap5T{r3Bmf*k; z&hAvs4H9(M8I20DSt6cL?m_;0{r$fx$2`M7cbO$Cmcun@e`EicBmj+3RH_Xvkt^4m z!|1J*smBzvRrxraLfz0!4_d749} zztyYIc=t0jxm(%&mAdg%`*PY*K+At5>jl8wee!F#sp@A{_ODJ(82bG6$)&N1zg%D@ zq5*Y{QqIK|e>*@>4s~_Gtv7m)VcA9`BYoqQ)4Q);EUZu%2-RsfOg4B03C7hyk5K{l zSl>yE+Xb^=1wT38y=ccw%raCdQHl6eO@H2%nem0?K#Z;+2yq3i1;IYSXD=ygp+5U< zT^+cqUrxc`VX7Kg6GhdPLb?2Kv8bDc0GgBx@$aXrFEdZNk^)d`#v({XUHl?N{JiBnSyBRvTfB>_@LL*EEAQREHJFU8fxHHnUqzY29 zuSZ8zgZfaSFllprSW@Q`t}9gdd}URm?Rc>g*4J+6qLSrybK**-8LP&!x7h?tMjq71 z=2f={e_aP+{`)U{T6HlIpS;bTouRk>>$NN{5jZwxOX(=hXsU&!nR@*N!Mj%-K_;QF zh@R|s0RRPMY2;zl1_rIMiOxWoV>{_s6t*2*!MfEAe=4)O-yDR1K*2&QbLRh_fI7Mo z^o9&}w`}^Z+rF(Y>Px>uG=kn50mRhD^`&5%e~UnMP0&ZqH3rj176f38tD&pdRD;n% zFbR(NBDGFigP5fkxftnV(#D(O@8r3Gi=|q*kna3Ad|MuE^SZ=F66cI=y`Vh+&1Kw4c(t_6JF|zEDnZ`mvFV=zhMbbfSY|zTQ~|BKvVu$s?}ZFz)lV0 zxLXgl{0Xzc|B47AKF6&VtIeiR9q7RDe_&c7`nm$wY!gh!k;dMNfJRm|=~R-zjVUTZ zKyHi$^^LuKKVpVD4IKbmo6$Zg3)_O`Tp2>qj=HXM)eW3(LxuWf69h(H#U$xhP-DFU zqa7=4Y$P1#M4|i34rqCV^q^?(lIdEb6DC4QX88t@R}0aJ_Uxe^tpre#x!?7yf9m-6 z52Z8Q7p5xYW4f+<@qkrOi3!Exi^&?I5(Hg_dgydrCq|VovDLynWQ0(rbw1vgD9z`Ft_RN_{+A|*ey*%*!2 z>R#a@T3MOXe}D>=e$_4Ge;3B>f5(=%GQsf2qhixHp-E^G;|S{oC#&Wk^n5nl|AOlo z9a#|qdySp~Bu^_3{}{+SV`3;^%{)nAjj_a)V`Snvpl(eLg9Za*!h=J|e6H?RA=%f3KU?{GE>Q$Cf4h{|Ulgk@ z?VmX~Xz|=t7SOFYwKT$=D-`G2$>H>JXAws zq3Uh63KZ?8(p^0y?$8^D^$N4j>zBp1F{;bP|4+&G%;99+C?fVIC16Nq&84QduEvoS zyIDwB6{MSZCfF2(f{do>fA+nP^PTqUrd@;gr!o-LLe*scdNQM!Y$^6{7zJ@*Vqj!+ zGN8_%8_W;)v_Pe8$hr(oZRkkm(F8?gmKh3h9LEPOW-*COT_HwSP-s_?T2WVYTI08X zv{EMBmoPCy_xj%iv15hQOYfU-|F}FC>Z>OOt3D}>=nluGzw>?hf86gzsAopzs6MXX zFpdK>@|t>{@wwW*o|fO>Zs@-{)mPN&V1MpTb(g2c^(*lxs=3lebV0w4IOd+>ACV4M z3zlD9WJJfRo2dX$jd$v4OgBaK1!Ns&%)xzVmU6=@L+xh(*rl$+^$vVueS86TLcw8w zA8=e8V_POHX-Ya6e}tY(;s0ehyXgJ8=W&gepz^{15mwx=+W*SC)4$S(C{+=Fz!b8f zzSHZ8K8;W|#F@1!kA_P8DqZNeW9j)F#M}? z26=a3MOZFY-W{_4j(RG1~1k6 zit)RyA^6aBC3>ps<)issbdSG^b*Tn6y4#kvjOIXiqj4 z{-P?q49ex}QsBeRhdQ{X<@`c7m}saagRK+ai1`Jzf4roo>!@pwb~GxdoofZkn6Dn{D=2!{MC+cLS@%f^vAT+{E)gWGx>R40XW8Ns zy=l5hQ&6xIEfe=pD>>@=uCHJZO16xh6c^NXsH#?m)ieRB+$#3_fJ_015x^Gf_rVlt z@Vxg5!PV35s;df2>ElVlAkSPKI!GRa*B7)Oe;^s4{|S^F7xR8WjwyEznLDpLV_!Lb zs`b5oN7Q{pN?F~XZdrzdZQ~zZh>EI(2hWddz;*C-V93Dwc!COM2@}WrX6tk*h-U2| z0hPr7(5Ml-SLj7V;9DVKDlF9PbvO>1$?!;cjGa3-VF~=MI5Qc;AY2Ws%8@dkYyb9~_4P!RX(_il6_52R071R?Q}@Wu5L&Rhmv-px+PlWBMEg+h0tQ8A~LJ40tj>JjW$>+ zTq{35Ko?~1MHQ1S#lowB@^!mR;gIW0e<&T0WwKIl_I#6Xi{l5fxIH0gy+9#%AcSil zhQ!l}WW>E?$X={>Nl_F%(fjpY-c>ep94w8RR7*FfS2Ue>Gkgm7)shT6#gSX#?Co@h zx(9wr85`^UrNXz5jnQp+Lj0F1P>K!HC79>u98snl>ZQr0=6{{1tGi{~RqexyfA+xN z7|U$bon3UL01H}1$aSf7KnSbN=B2eOuu{hSpsfMKa){m_LkR`46&c#ejn6$;P@`&7R1s8-Ox<0iYhTKWw*X03r*H}GLR)PW zYE@+J05n~>{2_C%g6Vu7n9CeYS`|vMQ^o}UZSYkk$eNM+Y;vf{so!V|e?gWOssz3V zO7|2BCDLi;bpKujgcyy^AGTzyFpz>iPlPPJK7Ed-S)zngehFoWvoTS$!(W_O#AWy=Cm;LNK z^S$i!dL7!bC>ewV{VMYvf98KomRr zKdY<#-#M!uuznCOUrJ6hGc-4z5(u{(OW*{zGX6~>MzU1)AQ32wsA#-V+L!vRE6bQ; z{3~r(lr?0>VIYEKLrD#n56x0(hXaBN)N=ovHi=FYMH#kmqbHF)m{9rQVCqNrDrN51 zHo?T7MTOxeRis_pe;USnT;)x&Fz4R8BaCftwmAAPDgf##e4$t+xP2XcG1)rds)Wcl z;OuE0GmZMI@TysxbP{|*#%h9!s+&F)2Q040|HME;@bR1sug+N%bOb9U#Ic;h;=17e zChFD3VfcT*yQ|u+ywGEa5OD)t3-=FRCD^2us&`HPf;aB`f4v`6O#RnNCG@>JhCSfb z5;W4#*C2}yXvtnX4B!3k){+t=nM+q)OL6+RM)ekZpUl3S*P(*_F0y1r>ZfthzJOFq za_bb(?v#F6+8aZD-c|PmN;T#3G@?(So@tLr!~H`}R4IZ>$uM{eCm?p(Fut)|&N$kJ za$O*5km>%Be~AxF2p;2K*4o$rl7OVq*3ZJ_PLis?wD7&TNs=T^ zQ9*ouh1G@<&YaHv9PhwHm}ls3_As;qKgf8o>$eeQ6R9dmtH3vSJO0ZBj| zHgYOyub2cRE@jeJNtto2`tSW*a`!*YS>;@9pN7RV2xupon!tT>8M{E}waA%hd&@Q*qPyL&DyM;vrv zA7)`cf9?7L91Fzf<|Q6P)e213&xY&sYA$~ z?BL{5lm{Q7o2$cxUl#xF{;fR>lP^Op0NUB(e^c-~#Y-?$j)@HQh2YYvCggt|R#mQ; z^KF$3>_ZP7tQl@hD@!DIM35MmErxl15o0o0aB`k1XDG`^Qx~nU-HLFqPF`xG?o4OF zNcW|NY6XDrd^)^$K1sOT0Kd35*9;zbrlAz`PX$cj+eK9s*qJ204N(|q{QyRku)T%H ze|usTSar!o{~xq0TIGa?LerPQQ5Kvbk(>m|X@UQZ@_DPl%nHKpdb$Hf^#i`3z#L_3 z!9HNgOENtub8L4z305y(<~jz%9dhK{sjf4Gid(3c6hv#w6!eiFCJ_N4RXFa_h$?1)d~z}brH|R zoa@4#@>04dx2$$wmFZPkRIS?8hY>)yYGB-|RUg^W5nPoQlHJJR3at&`Y@~bg$J)Cu zh!Kn2a5U7V^+f-Xl1#$E^ksLPuuNzYGOwejpQ^y5MvkX}N|Gc=f1sSX zo3^71Qm4nZ{=J2U`dvgrh^lx(X<;~SXJLAGr;eZ$zaYBO7k8szE9sJF-KK;>605Lp0cYM%GCAR?Rw+{JlGCZeG zbE+MDDg%Gz2HtKo7r%j8&SP}NJzF_(h6VHd(o$92f>IQ8H&+0Ws=!=94$)AZC4_w| zfmCe1TD?ewpOa@YQYq-)B2L63QX7V)rLxvBuS(AsrHY< ze*$!+7gdaTud(6l4Hk^9D^Ei?S>lNii@0A$=4{=#GA{oDz5H%D;4?u|k{M#WXUp}7 zDjnNhLScQTbpE|=hI693@faMzO*DzYiNFptKGaC)`^RH&=>%(#e_185m;f<0q$wK2 z1_uBiz!Jz8On^)!h7RuCh~qqOn9%od%;obgBCqrAX6keoG3XAbUq$!e0#WeJ$ zx^NP+&g_F>3@LV5Dp+S$mbEqOFUZY5D}7af8Wle4@3}N_zI8q4Y5nctqo<#J`Noe`2zq*mIc^=RP>4JH;vAZ zKp%1?fNv~D8{~7fT4T1#FOWez_60X(b)7ge0|8(d!&UgC704zz-D%XUQ~uI62hN15 zTj*ESRxAHzfB97z>P$Yp;NTRrR@rPYXdJvV)z89$q+)0r-y-jFM{`rAG(C;z#VZz& zVJG;0M;iINmtZ)yme6Yhuxw6;pUsvn?d*l#$ zfp?^W8tPp$ z=SB5)DQl8bS(>k!ZKP8QR$`j#3v3SnN-~8MNyLw2Fo`|XdLRq~e_zFc^qArwIx$V##~So2#NPP$YVqyW z<7bAY5q6D6^%@0~z2V<|a?R__%daQu-RX$yoQxN=$m4Z!FdZW}!3DHrQYq6FYCgLm? zf0-;!?!R6uCmx03C~D#kjl`#wER^UIr3_HE)!r}cHPHI@@>?Q3Y zNf}(4;j3dKd;fOA8iSp1Y-|Sv@b)tmmAR&TN#6l#Ls5WAqSIevJi5EA_0f#%&`-ugD(f)oVvd2jfBRE>{!=f*zlu>;)yk~&hau2f@lzp|h`g*i z3IM;-4SUS%A0ZP=NQDQlCa4T95l&6jE+jtwN%O~-8%#)?;i%nrf(w(phargDt>gL< zp=ZrPM$}(G=ZhF}wMoH|WxC&6y|IGfMo*8*qELXGEY(2^?d}g~dfW~cRVShtf4I_6 zL!yYA*Klm;LzV!#QYD7lxC4Aq6=PEsQLNe~v$U#`voKr#kyvY)Seu|VAS4{5$D;^4 zm#q}f8PI}n4|_0(*M2wvjILKV0OV_Rb_a^;eK$26_dxw;bnB_kX}|z-WfB@lITEuijX=>?)T2Eb*+ng=wW| zv4NGF;PQ5+!;S?Ps}*xwDSz>TeN;pnCb>=TcpZ})he3x}^*&28iaF#17o>j#!>TR+ z2Y?M3USEa=iZjTIEtqiyQV&+hzwN7VfJFxrs4#>XknT%Me4OBYJUZIRMgDw6p?{Og zR)pBq(JftH%9V$A(2O?axHKTW4=Wsi^T&JmzU-^0`&=MqPpV4hq|;Qn2_8)Hg>|96ZL(hsU#6}hq^wy)ZG3&Gfp zYU(KMn)zyVlCsOc1KPw57D_O%;Ds0ZT=c60_Y^EMyhhv&cS*(X2zGCq$$yE}VGE@X zrQJfFUb-5X6^;NR)2WL}c6Wk?qXdjy+-R9^R~6i_$i-KwgEN6FT}{AJzTIM7p44Mq zM+wjgMvef=;qKoaubiyTvrIXsH3FxFGXjd3)T?IuOsp`!WJ*D69P2REZY!NtkVT$R z_$iiB)X&OL7Zh#P4hbpHV}BmtL7`OEe*%ryqOvU%H`9-MYN8$bUyV0^?(aygwCBV* zj-4QfB5XRDCEz}(ge4^K>w{`$ttVm~)q>QWIS#=qV9ohR0qX#|xK~vP*hEMgEoHC7 zddoBf=NlQYF6G?!mcIVVkW-#Yl)$E{`lLs0{E&>dVpBC$%jO@kb$=fwU}nFVk-J}C zlBab6&?sgKFI!g}uziKZghRXx;Yu#Vf0X3x7%()UUk=lK{4NMf2UlkbnUz8elO@+_ z)MLZj?g3oiWs7E{se^ENn+2M-R9eAs2~Wk2lHmW|RJpqRFj2E!ZVL>>SVg<4MrcgZ z`7)iZ8=B_!n~iCSyMGnMV4&jqchS=d=as#t5H*;ToRAF8)PEYcj8O#peRltxxL>hD z*>QF*a%R7ojM;W#=`@fFpK-aWe!50~mpffm@szGK^NNN}UO!$!j{#~E^U}m($H2^F zOG&p`J`BA{RTY3vf5zxA{C6pI)sp?8%7E~xCJ>m7l~M*AHGf{!hh7@!hSSW&=kvUX zl$7`lw!`O`Vh{p*CO>Tyzrm4%980J z4xwA!T%8?qw*;@L=FM#2kAg8s#@(jFaJ_(ML|!R#`|Ess7l?y}@{_kpi}zK3#+;cq z(h+xx+^|xEZ*u~<6<*6>39+!4e7FUn?h2qrv$URIrGMgXtAVh1J2YuJ-y@i5yL@=DWT~&v*J1seMz+(Wouq zW#9h|(^sv_M4xQCZlHHJ{fQX-RS~95?oFQie)_7 zqu01ly4w;}>hQTL7(3{%9hi9+YR3++LUmQsysm~>B>Xo7ZY_JR*kflKvV05~AK6%I zP03!}_vWJLFhNcItHhKF_*DqonEmGb(H%wZ`2gyM~~LkV-gIAedfKVw=cXYUachi1KMi>CW3GApKUttl87 zLw_1y-CX{|RS&icCA{R}78s&Z|D6r09_1gefkj2WN93xe!un`z_I1C=GVS|m*mqdg zqnIxb%^qR?U263|>cXVkVQ5Lc`h8va`LGo zrPtM_4^0fD2m%Lu3zj#&FIJndxQm*4jDNXe3(0SPigk8sG?amXfqtXx4uaT5Tx!jT zxd-DMQPh|=Ok56|@_`~-UK4U^hws+ecR+76Bv1uz^#L_u*fcLHaAkCQ!nT?)0Ehhl zbq6S|?qa2n)nQ}&tkh!voApl}g9fCv95M>c2?HCd+6bvnSBBBO2Y*H2F6jiMw|`F! z(&VV(zLrIO_;-l%i!k-? zuQ;eNey+;GDjy9=y5xVxz-@iv^ndS|*5m&se0flJQVsyQ|FmEqhT8I+BFfiyGE%j! z&#bd!zq4S9sw$vB##{NM#_U_Jn$_^W^;}GOECh`sBeJ3ihusSFWO`g zj3TTLm97nSR}TC>+e{q-@kr4jz+l1Hw^L~o41l0_J6tv4rA1Hvx**Y7EE=TURMJ|f z1ylCOzk6e{epmfi)zgl z;6FcV8+rr#`b{`WOed-B(>q*Mbg5+5z9|fY-fuQrxOL!oWc$j&QhzdSFRxn<2b~ng zCVr1rO$QJvs^k;%7S4HgBKmw znVldlibx0DgNGy^^@aA6y@hk^Dge??hX-@{Rqd{L>XAsPz7NXPmG28RvrdQiX$50K zP6>LuQ(DzgW8Pq%fx*^uPPbk;kpkDa?0fxi{Qy| z67wn6-PY}{FaWLD9p(cja}e-&zw`Z3!DirY6;lw_3OT`s$h^DO6+OYAA43_*O*=Bh z2`tP^1WZ;IjMqUtSmvsVy{@UJH4 za`ocMnGnsddU%KSwNRmRpM6+;QNeo(x*iOL27mLEWtcoG|0f)+N@@|%qLJ0FSH$_M zi0QI_T^_aIN!loXp?F080~)1q`n(BLw>sN&50nWFv~_47`5F7nk|Hzp`n?O7uy#f1Rw^iZ%qiMfVVY9i-?s+? zMbrMfMDLB%M$raN0?-4j^oH}qqq{W>)pBf)n|fqufsz4eWTCO6(xG8kXr1~$Bw-M( z<(%z(;n^#>7yvM*R(uZ5xOiN+KbLT+nRBmzsXtkEF@FV@q}`npufI^bfNZ4-L0W}N zFnIzw_+1n!m{zT&T48V5&<9Zmq`N9mLP<<@dH_jVCnzrkqwUQ=ry2@B7-cGT04YKI zKx*gf0#I~oKqXKB9k3|;O1b_h5PT{zlUt9P^bsp9jQLN^4tB%3X2!Tvs`1)t^U{I=EoyPF$n-_- zhQ@|aW}JJ*KsakLYw&e&9r|u23uP;(ji?>}6|*mqw;kjaDr~1#u4;r(3g)lkKThV+ z)Gc1bGr3;lDtWm3^L%&vH|fKesz$TwJ&k-85`QqkF{>f{GxJW9PFQN90lI5G*Ovw@ zFKv^$uTGjsO5HE`+1=Pk&Ixr&6@rlykQh+z>P2(kr5Who;{Dg1QB`j5@V>r|t}6Z6 zmE`lbDp>!CgHxcIvMDW}#P5eHgI8VI1>@3e=p< zet&DK!7+)ySG@VgPmSU4Xa#ZO#DdX7=0nJ$=v`(x3AJI zPA{^AIJ7r2TO+EXLiL{U#jBScH~f37MZ^C=P!ZA-#>eS)1e8^2;E7Cfc=Q-(@B+&# zIv&%4P?&!agsRV2SofygRn|IBE5E)#+~)L4zUc zI@)$s+m3~*+1=Om*K`+Rts!wy%c(E6krUH> zEiA>=CDVa%8d;vk=+wp+uYUy1CEQ_FS{=*#V2Bx1vw@GpzelGMT@T&G>j2e=(Yj#Y zj?ro`g`EwID<_vDTKg|`TzIQ%DhFY0Z67Evmh?^2=VtqFFkfEsv{-7G_C?i0lyPT` zv8?)YWnSxwh2YB)$Y2zsEF#sXEXa!xdeqf5qZq35M$S z9tMiG!7`2Rp{BKaf)T&XdVomyG?nCm&)oM_zq$y&hlYIzH8t`xx%H!$eoX-uCtA5| zE3T3WgKtvrM=VNse|MADCEx&sNcTBXM~TN@hm}0W$!}0Wm%B{?9Dh>UPJF&ImAfFg zYc4~sk?gKXIva|JsXOuLNNayJSM9+4)@1(@w7X&<8s?pfUqBV1dzDiaMha0Px)&V* zu;$%nYRu;UB_y*Hw5?-$y(eq5W^FUx{i>AV*8i|g(j@OEV8VyVfds5s(bFuWGlbVm z#C%`FrDG$9u9In%Cx0YmcN?SLt;zBn+LjbB@LkMHCj)OCleqU6q3X(=&cZdf0;;m| zEoE*GtM}si44PY(7oq1@P?*aJk~lHLq?1>Y+Zap(AsIE_YF5CN_}8+-Z#Rw0n9wX; z_eWt)Umr;$=F9nR*ewRT&I*zH>OoM_|3KtmT$Nqfml!SYiwVypNT#-)1i zwyh-#EHlY+Pk+PsJ3$uAzU8vq?&zLNJgkAX5C^Ga-gV zFgfTqFRXWD6|L(j|E*fs>LZ;M8a!d@SKTjy1!ADo6a8sp05>BM2)nYPutw)_5Y$(h z(1~IJT<)?12rR{|%w||ZT~%b-mja$#SsCe^Oo6XF3V*u$Xi!xzyIb??we)T|@Uu~H zE1|8RHQxSKU&$FsS&6g3HLVxlt^cE8c>mF3gO4#2*B5=jSgWIi+LAPVs+Ay170b9f z%v<};g;KAOEK#S6XFtokCcZkGk?ferXrE&4{L`IAMfcmS^%fVI*-<<@MFi$@)6e)3 z%K08_C4X|)Im%S_%gE3=R$o|Shkpp!Y3@SD9+DEN@>2ETkKldtT%eQ0_Ph&SRc`>s zw)~VGv zVaDyyU1Kp|w6{xG8&+0F*AEmrQ;=hwosQC#`hS5cbXn!rhPh3sb`%=6Ir69Gr_dCr zzWlDj`GB{Ge2&{di33K;xHVaRO`UBJr2$Lm%LS+q`@ja}ZAb+}0o4oxxZW~#8>V=w z{urNb+K8XFa48e4^F-1HyjU6@JpKeQ47YPyLB{@thhvytEMkC1| z&41Z=ubEa9Ph2r!%soTjrMG%o+;z~adf0CyO)Y9pVeecVMQnNjg(k?C-gcy3zDbuY z%S~(Opj|njL@32eo<8Hmq^l4*L7U+Hr2~PWfpR4QVhXB(Hf*703wT3RhGCv~1MXUa zfpv#apdla#Y;3#QZj05jA7aqh`RBwkb%}zk`VowhOMNU;{QXED=h`R)5hJ z%X|Rk>`X)x?Su7XBW5B{_mZtBw`P79cfegC@UJck83TomBjUPK>SiO4CGQp$ky-TM zJ|-w)Kb;IUFS@>pGTKq*OWyfa&CI3!7Zo=2x$CR*LvqLnYwh=JWe7;x%B!xg{oDN? z;+FEsGgJ^T4MO@fh@()QUqVC~mwzIyd{-J}CI>?FgKtkz)=6AoS$&0qQ9plQURrnm zu2L6^WSD|NR0}r-_C^^o79vs@%rv0|{3Ut8RuW3ocLC=5J{kV@?zr=ZQ*Hf;WS*}R zF;2VxbXDp4M_v%je_75uanHrL?gu-36_Vrj`*mM68!y2CRTDx5WZkc$TG`C1%hxGzRo%8u{y$N#Exc7naol}-wcZ><7%@eS zBu<1y&y98dc-8ll``%WC%d!s=TTwQU?mF;*b{XQMBhq5ZJ9E1pVt;`v#bVL6&@n?| zb<8Q|emE-SxJjf0KrTxAU@OrJd0klSE*a^>K#r>C#uo^IGSMUkINC!%tH~8IMvQ6$ zDjpO8sw7eN1oe!uvfA}zZb%Eks4>`mFMyBtf9;H7_u8+-pdBLRo|aB&s{if#I=112 z;}Szc?>>wr*6w~+(SOCh>0~gGP)*Yzyar6k79P}L&ut`<60n<{jH+ocQ3gi2w`Q0j zwr@+45|x_0u+}XpheD^Kx|7h0haN$=D% zhzEqk{~fWd^~mV$Pwp8T6Jh&aT~9B74JT zl9^=eux)!3$$zqkR$^f}rZRKW`=SfXVOhY#rPvNH+!(7Uw;}3!CkfX;c_>B(<_6gn z#{1eba6ASK@o@E1647NYJ~c-e-#0$v0@}ZgsB)dexEyT??&~_jf0tSl&POC_6eRF8 zCo}Nt5G-Z+QmQbtwDoGy_o*G784I|7=KohUk!?KKuljBquspg4 z9?n)8FcMHXL;PT1_|9IYmYN0@4$PHCBu^elmP5=u3c`ni!opxx7>O+zZFsb{ zx;J5OXe4M0Tw6dwW&cJpScvOHOVJ!iLw5jfzJFmj*j5RY2l{lk>mxJXb@hB{>=h@qb|Bv)OQQ2xhFLRHWaPB1ON&PSy9ELHv?zfCYm{i3rY=bXR~FUyVeV zNPjR}MGm#ylj=ABjTAU5on&v>dGQI{2oyk$9H34Eyt&m}#Jvpd!y4E?r26RZSMoM@ zNHt{yyVCJ50Cjbs;>;oo@1*H>9pLI|ADECM6B=fBrT^^-z^e&TgR<&`h6osn^mThi z`TqJ~^sZ{|!-4kChNdykPxc;!TSKfjyMIpPzQl|RGRrryT7IIXOX-W93oS?)u`8xJ z-_<~RX(NN%AAJ1{Odj^G*vz?{C?-DjhW|%ReP&#Mda;(1q7M2BsbS#|wiLatB97j5 z$kq+ZvQs0abe8n82%gBb8&iS?|f6 zEq0z{iuctspN*Bs^kHEj#k%5p;1?XQE|tf8MUEV4TeX6jwPyg=nTE1Vt-B)8a(sD( zI(lv^#LX3C+#0lvl(X(6DeS$HM1TLIYgHdu>?^=RO?i4qU|lb71lc_9+PnDAwO#=O z^8on~eQ44gBUq1~WZBUn?4fl7d8O&5MG@W#+Ub#|E;eSaWjluCs zd^BItt2=Ak|C+f{c72<5?25Zq;4IMyoWAEz61YE&j3A(4u4S#vV5(UCd1dUgvQBcYT%Ge{pnALpu%Tnla(chjm9??`4 zo~gAa{FwpYwQZ=-_`Q<$=R3x8u{N(W{h=5CnjY*3cO?0K}xdPHAk ztN$hAN9F#1v3^aCvLew6+-}z-E0a}`;hT%?hi{xJ%Ts-Nr2KV&2Y*VLGn_;8zr1jk zkVt{6+>xCuE-<)J20qS?ECYvO?LUY_q67gX*HO}1(f9H&h{0p{@HiQxVT5482*xN( z?l09ViKG^+C;~q9dJuczcX_ca%<&UTR-!NshefKlAFBx%RUDqTiaq{aI&YwtfJu@o zNo8)7?021L#YyTkEPtWY{E@H0Kcq&xb zpx;*o%!wsuea0h9K4T_#H&%#AXVuguNm2zE90mcQBwZsCw10*=DljI}%{xERBnHU$ z4hk+Nd6qRCi!ezKJ47(Ce3Oip2$FhAQs|;4jMn~DV8BUr7(rpgN1IJj6E^BXf$(FK zRD!m5_H(SL8B+B>N--)yE(Ra1t*R(wi*FWYdl{>2aVjE;Ru7H1%=1)!<(a|7(Gz>u zAC;PKCn~`NWq*0EJARHB77{auH`5;=m#u{ z#v><~C;>h#7m*@!WndyVFAwb^kChAqR^#9i9nLn)>Snw8mLI+%^tLM715ck2-Y4Z> z_&no>k-!w<)zEB{BuT27YL|RvQ_5=Mn6U4hH!=op*M@~>Nc5g)k(7h5wUijd^mY}m zmZSxDV1MqB?e=Xfv?=hdvDw>qGEl%SUvI&LMc@nV_)csxIRZYw*&qCpNmb4vgcUQv z0wpti2GsF8Di|<0W%Y)5j$g}7W8u3Agg%Cx9K)8_x<&GNzEG+{FI9()QFke?M zMDSvk*-BfIcHC`6mY~7vbO{zr;CS*(y2`aewSN&@p`gB@^YbA_A*4V+>IxitkOAs}clgBum7Oj*b&xGlT|vxeI?LwkuF67 z35omX?+v8kV4TS#zmOB;ND_4JXPOwG4h&kR*U(w832eSh&cUJ>Ahv%v$K`1nbIkg= z`5*axM@SxGxZgX=;IhZu+w((%h9f}4d4Ji98gs4V5?xZS3X@4b^LZ$TrsK@9<5m5X83SxZw<~f%dMtuwd=?g{( z(}ou16pE(`1e({`5_7?(7JXwuFlaULSCt0qDXPJ~I!Jdg3}e2b>OR)Su~Ndqkuu#+ zwvaM6$*H#Tt57i`;bh7*Vf>YrGbALID=<3-5H!7(45ESn)M~&{70&66Z+{JGKZjgeS?}VR_-pf+To4JrF@c82)>W=6~D-*^_b;YLzG- zw>K#qm$K`2_%^xnn|zyf_`{fVnH-zo#E_WmX&)h$VH0XQM9|LXA(mkiiU}J;(5!{& zq66zFC!hyYwyN05z>t)KIyX8Zkq-}>1jN+GVMK$OUl`G1vPW!&aIkRqK~k_u3s*Oj zR)D*uuj#44kWA&q*MCx=5G(<6x0T(GHSMxNx{t$l?#8t%QW!p~79L0P&akpR5aqoy&eL9ao%+@!nu{!#%? zhUMtHNky#y^Lb)^h4z9)vin=(&LACAk1PgI+b|fBFuk%$A z3*0W&pPw@e1b=w{PizX(&JsZdoju4}J9kr%j!a=^-+vL0=NJ@J6$b6t*)Z|#W(E1S z&7LQ+6==5&ff-x39Oh%%orfeVhz>h7O(NqUPOo553Uc0@XxdE#f9xDmhq8iv?4r3I zqGp>fE66U002!!){2)5Ei?V{ef}X7)Zpa%k9CL|Os(=sICU)aaL7D!W#rTExl-pG68JbzFt0tx?LzuBt<^E|o>RqtKQ zvaU=eWPj?{!MjgmfFIPP;?=efjRpZwsqn8|Ao0FSWtH+bO5Z~mj&c6pFUGn<<0}^x z)n;F`sa=ZtSN(`F-9q!=P+WdB+n-2bg0jqo#e50t)>?U}lqV`6;Q+?24gN zY-G%E!)3BVU7dP$ex)cJv~DXW{2Ysv8a4aj($oD_2@s}z*{`bb=e@EKL#xoS`kn}l zS2OTx91(LG-e7?>p?9`=565>Sl_;2H6o0J!t4Ud)P~nipyBK^z%|h;mWhM$7XcXnD zy6PT!q0nexCnY#LRzCb-5S+G^;MGgeT-t(HMKGj7pUUHe|})yXw|Iq(yvwO z@j8~$gJba|25>P!rsu2DAo@*kH-MOlwet%oNsv0cE!sbMe_1_0F z?zi9fk!6CuGXc^ksj&LgDZsZ<_^WQ4hKM{(Bp_?T$C= zN<~b470xtfh59ZK<)jlG;yC7KHRS9KMdT?5w13rqsAgBG z#;=gRJVEPW24c{o>{q~gEh~Wi^TC9E%2fICnHKV;w5v6e~eAgE?Th| zO0HR?=q^}UuNNZ(ONf_enRj0c1JirRrU!Z4j2`F&S2|j(nqfv^-koBzrrNr-Q+XvS zDQ55c^qLLSAH`GRR|^dZ41XYBFT8G{E)-(_skVk=>bsAyfC&?&QU^GA_%DwdehUn-^bBMM8pILC{q{jWfbgMtZzD@UZRYywq}NHU(k7~{XG zzdG!Pqh(az^0hSV?k{Krbn6riC|*1l=oLW)eVt9{h5`@e?n1djk$+yEf>1g$p^Et^ z$s4fq0{;caXh9>Ag+lJF)#&z7ZNIJEzpi>_p_H5JgGo`?145a!4(fL+^Dhi)k&XH~ zuQC>cqj0$%+6o6xpVF#I-j_P6|(R82q_!-sZUuZ9V3cIf#5HkgnvO*ztc|8X#~)!zPAO_7^|lhl%=a-yL-IUohJTa zcU^#)d2J&~co;)8{u-+k7T?z%n#8Oh9ldZIF45C;gaiigruFZKk^VN5i)W`BuR7qk39!Ey zxUEs{KQNBzb)V>Sq^|(L7n`u9Mm(*wu}$u@F!;GZbiZsSsxgYj+c)Xk73{{Mx}H$K z`#Sms<*!eyKMW3m4o-sNV(j-H!q++)+V60gUa8GtqD8kEn?sX}bI#g6+7VG-4@oMwdf7CjvFeuMr3Sf`XDG9nD zoc49C1b>j4Ro}P9zW2xLaj)w8E|f$T{Xtxb$W>j%#bzAAaT+R(D1TAF5%8|t&e_Az ze!dUm(==d8<}gq^Ra-&&|Hy+nwp7R(XyIW}ur3-*jiXVOfEm`ig5a*9E*{ndHZ)5{ zHo?tCY1esoRgokNM^?x+tF_oAtRjVG^)n>%dJesSWRo@VC#Ds%-97XTK0c zl>Yikx*?>ypnKRe*3u@Ebysvb_ z2TQ9Dyo*ke6CBz_aN#HfJKlFmgbfM;9(wL)!nP4YDm<} zj7FbO+VFjH>UvmUU|$@1ZmeyrcRSnM7bg192yzQxV}x{%+?Xr zj3&QvSj2vlM-t*=1}zqe9S_1Qpnham`2?0f{wi4qT9<@>p_dE!9ytj(9SdFnz<*{L zG*EIdjrjZ*1$8iq(C1$z_(|MXX}us&?jRD@615ID-W|yGDo|kz2lIj2<7JZbmo2%+ z+g2a23MPeY%e{Q!?oV;Vn`ODX17EdgmEhj7M(POH)6fUIz#4)d^`~7sx-=1L-6}#< z6%EkdMsleIR_*)dr+r%X-EGsEuz%?RT8brpUmq2EPF2+E=dG)|k%F(Pt|!xS8`oFJ zWZsv6_jAWDI}sptl{QASWouw^qHkLSl7}QE1tKds!!$)`C9^m*Dzu=L@Y)`@=E|#9$g)%kaW{y_IWeV#k^B`wdZe3X_QX`EIisp+4v0;eqh0u-+gc#tr^-mpBbP zp44P;%s|SFNF-l2;@V+ak*fNA(t;xTEHF(g%GsiR5jLznCIO;aYkxiP(2d|5PT{Sp z8OJu6jyR@(KpBE+4UCM7{=sUu?5ziNnhKXvL+jg$6_YS{d*mYc%(A&KZF1k&>|&je zI^y%}+%cvzx2YIc1B}l7yck5{UqUrq41KB9Z-hJ+uj`^tTHVDpCtfhLEbOgrq^4q3i2ox>X1lqffZw)IpetT~Q$_JrRp@O^7(;qsfF>vF>c62ezG{$F5wZ$}b)F>Tgz-o=!JtjPbWOCn zx3Eh^vj2-N`{5UP{*w;fE|N{D;D6EZP2iRoh-sTJ4kbhtPSkj=-1xOb1LnGx2TsXUjom_pVXuzNU6P@zVIleQw1tDCjDfsY!GlQv zwF(f!`~sJdkSbRCx<9#`wPPdR>&UQUHufN)0xAA0%@F%nhsfW8m0)n&?daMN@PF4Q zlo+&s7(6F+1)S`){&iQ`(1HD{P&4lfuGJR$MbZ%ZQuS5C6SNoMk%Qo9^_g6^HyN@O zMt4kbUulsmv)_%N)?@xx9f|&r@-~97``^>uvw#AX?x~IO>(E6eH(8p2;{V+p&4CpX zaPtp~KTE6coOHMA%arv2Qbl^P%T-hh+*b>KBx)v$-xp^)U!u4ek1qV*a3c{$&_Ux;Pfg`DZ znek)$)tp}&MvT9kF1*Cw6|97Jl?z{xsYr0l)a)&Fmu_&?K3AYu>wLe$GDVKt?CNW} z+y~cmPXX4iZAnrBrfOwYS4i~w@>MGuRLi8KkUx%bIh-r7{8k3dSnm5a`+n=~NxL~% z=%w8yY}j@&hC9#s;nP<{nj)93F1FWy=dT^M{-@z(XJ4UKye=N8820|Z-LDGCtq1dn zzACAa^0M_cfngVVUYMGIBoJ-q7kKh&W*pAy3oKJPKI;&!&G^-D{p@3NIALGe7&A_2 zQByE5$E(#i$jV!qb&>xE@f4s68wdXWP{3G8mUgO4t{DM;J`Af;f3M#1x}T~=C#LMSFs?)Fy7z>aaM2VNKg zjzmmQlwDUP4y2a#X=t{fyo6@C|@FHOq`yFVF&`75H)wM9VVq~I*~+2rL> zT8H(Y+M#^~1*3(KyG2P-e|P(Ut%8VaRRl?|BuF78tycuiL_nz8Av!jHm5}{4%_K4m zX24v)4CNFyYMR0#R;dO+alX2OtvhC@toyO_RaH3k*!sAF0t;!1q>c*tqdIl|WUc8; zW#+rj`2RaKGWj}&*RY7zK#6N>twnns!m*VIN4X2*bx|^ol`r+U>$Ou|pSkL}02v-wS?xb)iD6jr2v0vXW^&L>Fv3Ly>8sc#HKSQAT@ z8E^Yl+hElixfe+xC7+ruvxMAMHeG~Gjc&xcBgSHaO&~X9$so<=ZU4ah!;fEN(#i`K zS-n@NBIi(~+QM+iPg4|buY>wifnQQOx4H^u}51t|SIzPmEx%Mb=M9-dxKj_R4s z4ZWD%3lrTF?_JsVOwZwU7p2H-!DTu(JXZI~*W+CN?vd|HqPSxA2G5s$^hM^SD+EJo zoZpwcP<3>Tunr3JY7RiMm2|z{HE`aQ{!Qi|Bvvkul)+VhASv}LH_^LEOjaer#R}6h zgy<8Z|BW`JQV3nhC}W z)TvrpRj=RvzX})}t+y9W*Qcf?Nhk!tgUs{1PAkEkU2C#Z!61Bgnz_-suiEl1?buqax0@EMk8U%@2dv*RTZ!#9&kBR_|{!Tp$5pf_0`+{XAejOYlT2w z!$T{c9>?K+?r~&5;aFi=L7qACm$|MKI3JO`&A-xr|4Nc1g@*U|x~iM$Hbagqw%A9b zxOyP)G&x|p>I2tT>gc~t8;%jutjlwQKdT7AUr0Eq$+cX+sMfZK$KtRKRaK@MiDJHz zW~HrEnRQk?lBcKLup-yz08ZR4EO77kT|tw%$_(ro@`QpdLG!J86zN*Xh3alDY%_j% zUphR0>uF%=nUoF%TOffw))`cm8<}koL>bl^RD{iyzi`9QR_^ZT$ z0~Z~GXCd!^t&t=!g>r<$`;V56*)qG=P3_!{eyIYxBuyEZfU%91nRQIkqMNUIsb0=5 z0O7m?uv(lADTyp?@?RNo9CGt`EDJjlGs9(n-<^GjN^<@G*)>=)R2D}w(TsfsRT?vC z1nXWGZ6!S^`TIxIItEj>${@E7AGU0pw~R0=4YTX-{<3MB@893e-CZA()5;4=!I!F_ zci?cD=0FvtnhcuU@1u`{#<(#Hn?O|Uz8e)`vH^$&REXAemhfrS5|0A^0AI#}>*#}j zg}Bs|7-`kwU1Wz@sI7V-zTO*ihXML=mz}k8xHw!nUWpYEn=(}Ae3T>M%7GT2+BAK6 z`mu>v@!v=aJ7cf^+YbMi#6-vd79*INkRUhn7L-U#YlO9!$=8)=BdMrwL6RQfhWPHI z_oo(EtF?`Y-9#=0n}8;9|4*lIg9z@6qzB;|o=x|Iw{p59<9HU(!kObMmf_oM!2y21c#CR>l{fmSEJv z+TTN5fwe$F@>4@cAB|zB+-eYi(dQ9yi|D(kh_>fd_GZh1tr5|dqoJ`)ZkPpu<&8vJ z#Eq>-wnG!6qwdzis4oA7rCG69R-_^os(O}N*!GaApSRaC+iBzHuN^yPzGg_*7L5ob z0Gs%+725c-@NLK3SM{+a4I7uZ1Xf-^qFHs}>Z)lhz5YoxftL{R@4?W2_jF14nMl2e z8wt3vY#i~litm-Ke(Lt>BHYup+xM9!>>Xd#V8Fmi#rOAplfcNTu&rZSzfZ(JrRZeZ zxW1MhD>^Ly656q|T!Vc1W2Z|6(F7z%3>ce*@yIa~aM<0cP!6yQbvjr*ear_6DzoS! zknbP&%r`#@Kq=isGhsk~C4o#s9%e9=N&pj*YqnKgwRnF8wk(3)s%k=m^K`k{3*_Kv zBf#grWOQMj5`II(G^LSx9t;&ij{r!^rA6AG@~9Gzsg2pvme$wZq+J8lA6>S?pYx-U zM2TSj!3;CTW1+4n5kR?A|BWT!^!fU)P=S?QCKG7a)<2D?bKymQW?~=cbYE2%cfsp8 z^r>o@CXVhR&s|jO;Qt|Vhq82$%3vVW9X{_!E8Bz z-vxeeG$M++@Xm2?7C@kIg@?Mabf~%UVT8trRkS!dR{*(Oqqp!&OH_ZAEcaDc#jo#Kp{D>A8X8{^Ffo^cU(XY4_?E8pp@u z7w*agQG$t2r%ZOlWR2c>zM=}!d5|{RW2?SkRMc0-mCUVT^n(=)aQ$9PRZ7%7H3scE z;2Slg3_PHJHS*(fyhhTm@MJ)ZxIBhlJah#IuUp}nBfe~PVJZ@G_xpPc5eVZ8-HLn+ zN0kAe2x$`38BtnxnK0#^)WKCw7A2~S>*D|Xt~{($NTUlgPBulG@3MWCID82}GVFq` zdux673uvV=s`4(nXvFDHSMU33X^dDR$o_*wxE$nvS%%$YUh}xd_S46T1aT;``U+s^ z)deQd%;Z%u(*3_=U8?OS0s{c?{rDto&zI@AP*H{3WKxMzTp1140IbpYwTKHeJ%yOrhum)papRuNbH^g%C+%zj$x#|l6Kz~fZBhUhPs6C`V7=v_0fF?Fj!DLe>r10GP+-V=4cmRSCnUXyMfeV z7HEAp7Nahae+T4Dt!uVAcsg#syWQK};4OcJWS5wH%hqwLvSIbiOn+(%x7xZNf z4|zQCO#M!prM-!Y6TW0nC7XAW&-$|)W)N9|D)|P8$*Q^#9(C~z$v z{Vs|Ei@T~KKhnx|VH<~~Y+Q3=81cKg9f%cYMRCGEJT@P^I>(p0E2OJx9)$4(M^AV? zy0Bk&eAURb{tETY+!tLDZA%Rb&!s_m#SaiFe^D|Ps43vlO^ejK{~Z%MrZc~m-&YM6 zNQwe|zt@cGtSV}d{~CgKMMDVYYfG+m9M#WLpq1GU#e6xihxH{tiJX?{S|Lk|Zg`?k z?tj-8XX;D#8Cm^Yq=$*G`(+HkK>@J;J~Rn}kz*ZrrH&bw>#G@dRDb^Co1;bISjH7z ze{m{(t|MJkICpz2e45JsAEH@T1&B&E;XnD{B(=Ly6dlLlU6Ya1`bu_A@a`_?m%b#) z;UN~0E!?!3kxb`Wb0Ltp?^1XHcjEg3qo*!eDc+aHc`C)?`uDNP-dyac3>Ra!yvEj_ zu1p=4c`NkJOIvG|eTK{FHFt%aHmT|6f4>72^Y`SRm0ZJJIUuOje|SZQFoCA~uZmb+ ze?=j;0=jEm8=Oz+{w9~|_hsfcg1H%ALUHq{w)=3y&PhC7ojWxDEtotQVK!AgyJ9LG zbwF*+FW7@_`vYqGyDAY$V4-ON4+PwSUteG-;Q%aCRScN5VlsXNq4)heUkzN9f28^L z4N2Aah8ag+?N|m`k0Sy!5!u+3WUw=9d4geVI8MYP#vnpcr%5 z?v&A@>hF$ZNL|+tY6RjY{MjLhU+ezRb?t>JjQbO(jzg{#>X;hWS8e*FFI8(=x`${Q zWu8!8ilcfiD;xsffkb9uFgyHdf8VNP!Nec|){V|g31oK)`gc7nTVLIrjTfUu4;r7;+VBhTH%-G^uPd(X%t2NBx;ny@wT65Zrtd0%1L)wJJ(sT9w0~pN%2PUT z-4>n1h4J%K2gOSZ!M;o>W~4k=5T3)M^J+l)7lo)GL8~B2d*WyuXetW`8|? z4_8IhA8rzy2Pe7iB5TuYUio)v+8(UCkI(2T-Ko^g^B4@n$v#V8R9y|y1*hMWqLr`tts=Qf2jlM;7fI#SGUc8VqNSmb?2nSI8_cQclO_5%`j(N!TnVMK3*9^%L4A@^6P!vTZ0bfdi^w%0RL9_ZPDRFhpoOz?JSph~e{2q~F zeJf~L(XO)G0?Hx-1B&jpIb#5xrS^(r9f0{vV(+BsR!nW$i z!=$^<{B)t-M;eh;eXNd!;J-zLjY)%#stR3R6!Wd09Bajt9@c?AY~_zZlWK7(y}s~d z%qdQPRRRC67eaEvFlf9}i_w8qHX~)8sDZ*iHuMICEEgd-H)UMLTOhSv#i?PQ=S4;e z=Vi{E6q{i~(KP=8f4Vo<1!bhx#_jmSiP5Lb%0P!{n)(u~wL1UnV88bCF2Z6zwA#1N zH1>1e1zK=s{LmPPt2gupuL7!;ZCK=V37tjp5TMEPsHxvLV7wfCL)EA9EL)rYIP zdi{IcK-r4#jNW$ZqzJ>)k)F7J#QZn^3Qx@~V=me2%9E!>e^}~nuysg!7u9m^H{FV@ z+dt|u(=gDCN=FG>IDf+i@&6-;;sPQhS#)i%dpb~d3QKiu_{#OI;}ro{=_)4kyK28J z^1lM}feYT>7=$!{T+YPyME?$q1p(FyoCQ~odBL;v*h2?n@0|E`3H~e3tLuec;W&7a z*{rrY&COE^f8HLsEAC5VV!E&5|JTahQU%6q?xJxClq5;4e~x{dg#E=Aa*#jkAHRKF zTer`EZ!ZL@`FB>AQ@5X%`A5-oLnpk_pz3G)WOZ5-7R>z39(|Y#S#Oivf3tDrR##}81LW*>cxvt(zun`!<|q{RdLbFlq-K}-#180g(Q>y@rws2*lrU5zxW zE`Q^?e+_w_x4R-$4Zq0y0#95=0H|v6U)fkc{a4MMNv>IM2d!K`#<{T`a6eV~3-pdnt66W%7!VIOH%ab%-Nz-nPw z(u8fmx#HbTLspUzqyh)y zS4c=msBKe0PdDXBNNr<%OhB5g-_EDiPt2-Wrs|tltLIVr5a4Sj2foFg@!ExqTUNhn ze`v*!PFu%Nc0VrTbn_=syS-xAGi)-vlVS5F# zYln2~s&>V3!aR$mfOTh2_mu^9{fOKG%YGfWWNA2dG#1(QEK^&B9FkO2XWZkV5DXkV zQxsyFq9R@~A?odki$+7>SI?H)tgqStf3_8el6GomeXVgPtl#zXN~t06^!9h%ME|;N zbypMi239R3Pa6aIK8vVjkGhM+wVU;aqCnNJt3_2{0<5u$L38~j-@~9ZtA~YHu7h&r z!-0>lI%0)~-J)}@dbxHg;ZVu`>d)lzE1(>-_*I@G_@dg?r;x7|NBw`nuyvWfe|I(W z)5pY*WTRWcUy!y8I07b;)h2rN#!5dmS7O9_BGOu?qyk*Z7Y4dt23TY#Y;G^k+jgo< z3K!FlX#E1s7j{z>6&>?&Hc2pggY~|x>#7UDyY`of|9`T?48eTRGWS=v=~(0!7=l_b zl;Zza*pI){sBm*u=|R9{P^qvbe^h=I7OKwd9n|RpuqhBCTmV0pjpQ~lc?Ad; zs*&gZDb%=o>1_R_!IJ03Q?K00QK|NOTGo}I^qHi1?qG2F`CnBvdCID?fv|^?qVkix z0Xp$wK*p~OsN&$PVfcbU{k81|jo$AHba7s7hx>)5Fn5yvy=o?1RzM{(UaFYIyxLb_ zHRxTK?qKDtbgmA6i5xZ7W(6iznk71~8}+5I8q;1mQdQ>Rk&V>6y4s``t}gM`9{vl- zcCS14H}8Oxs|xmi)tDlFg)@!Y{nkFcdsWv+mm^;VyDp-a>xcm;f0e7NknL;5jOkY` z=W0}CvniOvs^CKC?4pafPzNUAx9+4~_4nkWKgvEPr2XB5P2OL729~8Usd(7=RD3x^ z5Rjd#IF_Y}zAGO3?w?m2R>gE1Z&iysebJIMM;K)%w&O&4)gcPRb}aqxQe6f;W&;Mb z7}J$io@_W2VMznge|rvnWd;=)$?jUeuRZ#}BuOG5DKY|;BudM-yuJFB`kT{#)p)6u z-#};8YuQ}O6$=j$RWb@F9j4!oXtM9{WqrgxM&q-apT$;6tJ;g-4z zBt?6HduQ3c0IXE;V*n5}-4a5Nwam2skFwdj@;RD+R*_1DeS)QccdREedh}B%OK*UblFiMW@0VlU{$24y(Xue1dFAeA4Vt<+ z#YH4m_7FFAp%?^XS{ol@GIW=^sc15QA_MA$G~NP|Hje)Si64>K1HDUfM2^^t5sPx0 zb|1D~Us3%^f2*wNROMUqQX&Hj(?+FQl)60inMRw&w?td);!6tLzb}}~_igla>zh^B z_@4-N6_{Q|KIw`#0=QCJk&S(%NUaLj}9C*vcCRI5^|t^?o|`<+7DeQy}ezn-%`j^qCQx;ia&zJ|)e<*6~j8=H4zgB9xB=_0uaUkwe7DF9CVP++Pj(OF-Pc!#s!%}od7B%%t5W_| z@btG%KV)LCf>`L7iXJ>~7BYn2wL^P2;TUIrF0*0C5GCUpZUYVeLhgs#M+c&-NLm*9 ze@^2(#GD{*4j$QvH+4vwFzZZu2s`p@1>9hIe73dUvciZq((Y)L!|<8wpMB#o5f90f+(o#eyMC&gNflM-BdKI5+m1S=gi)C|9zo);Z{t!P8>4F62SutcxGdNe%fShZYS{SeV*V$IQ%*+%+Ke=!n; zJh>ry^1VO7*b~-u`1^omKBAgp`}qor+jl{;5KDtm6IX(BhL4Kj3m-*lkd(A&$mP#7 zjQ9+NbwFR7Ev~6F6kSzm=&c#J`7doXIt^`%yirUnif~wfABE&@hHP@y^o74!}z+e?a8_O*JN1jieoUB7Y1@C$22o2 zM4!%~MKcr}(N*7G-xyRw1s3D%D)x%kR2RXE^h|pO@R#mJU`isQmzOFT7(lXNP=6@> zT!DMNSBMznbChiy@^yW0Yg+}WG~60V_t=oRsTO7}Qg`tvieK#WS>i7u3I_aec15WE)`Q?aAXo!IlXpCR zFzp3ffsFAt_2u$#DpnJqIQ?GNMc;kpTC4Cx=any!+R0Hwrb)WMy zjv9l+zy{V;vo08`ymYhNL0WXp8M!ZqU5U}gS-qqC?iHJ%e~X}KGInTP>>!Reg?%*d z1%~^os(G}fsvbjj+@cnb8 zR0M`JX0jH=f34EFRyhu1d#(N-TBxO1t^*AbMC{9*E*vkZLW-CEK9VgiS=gu73WJjc zwptg%Y!qZidyHQv0RZ;VP-SE7iq?|7_FDd{h$7zt^w+doZg5@*K?bX;6;xM6l4!0}B!olzy@<9* z!IiIHe_+|+QF%cO4w60<0*krIgUZAsVUHo z>v!Zn1PMu^`a;J;(lkjzK}Ks{Pwxaosoj%@e+x$%M}2*~#9{OFh}-iQ?ODK?Mkk`L zuSxq#cFTTOrlna4>7+rcut+xw19EU3%L(;Mc}7Jl--3v`bj(Z<7QM++U3dXb8rm)x zLN$6A!45VoFHcPYUOijC4yuV*%R|LEqXF&542wmU;w{q1U%hDRB4hj~)7`rgQOyJ1 zf1a00j8?slU@UQVbw#x+Cg(^o`Z`R=CbeC4u|mwKTs9W%@y{t~A12~k*m3oryx@&@ zVVuBLG18C0P?yc%TcRo8_Pn|Q3GZ-!gqk*dzt=rZQ>(mt3^7PP(6RD(rv|KPtEpD{ z38;byQ*4wDq6?DLnW|B!)f1m_)ao23fAY?{AZB{T4s;4X_1D_acF_6pX)*jbcRa21 z2Vqn!@)}}NQ7i1ng&gIW*NPIIhX14lw23{QDAx`qT0kac+icc0+svcpwb1RF1IIe9 z)=6vDd_hA>6>fss`l=-~>bCuXP_0Dsi{e7jWKK|ZRP(RG+UKX83iAU3ro-GYf75@2 zRP9+;_0zg~va4)f|ApH8;|r8Q_nij5?kbSh`69ZfW?FaGtMjkxOO_huFC^Z6`cB8!f4ZjiQKjOJ+3odRsr#`Il=DXhN~-Egu4Tau25%j| zI%uYQchrh4R$KfZNq=3qf7r8nKXjj$Ki_4@sS{krKCqv*7(zkreXaF{@ow z*}>~R{wqCd`Xdr+$@%O=Sn2-OJ<;V5DL0g0Fk#BwBmhGT=fCF!RbVUQf9kh4SUR(~ zZp-dO&0>m$z+b=cDqMnz!mq(#=9`ftcY9=TMt^w6Qp9`?&*%ogCMQJ!!Me}I`?+wU zrMtD3_cf_vY2E!PlUcyrySNrmBDawkLBtzR0n|UhNvgU8IUCh*s!TWLefD`EokE3) zH%|He7giqa>-AcAU1*+mf5TIbdsx@F=yfor8nKPKJa?xNXfad@-rRNNQq1JmWl?ps zZVw2bz!i7yu^Cg;TSltdH2fXz*wHGp4n#o+(q7J6k9QyhzKRjsgp@9kJ}o$m&5SJn z{sT`4D{J9)X1)8;C2ZCm|7JHQ2? zW$P6Yzt#m^%ZtE>7xufKCue6AuGt(idK1<{8&bwRc07}Wxy|;unVmWXhakXE%7=^}F>_uB$g#`g# zb(JxSDW1J4-(d_pK;$&wswywLdmI$7#-~E^XJf3s1fXJi!PmaYm{r(p%mEWa-qZUn0a84OeN zfhaCDuMVS3e-|}e%skS*RF;hujGfLY_U}tr6gR>$I0yIDJfQ19q-0pYr=$)OuR4Vd z0~A`g9JrvZpKKT@i~tT+4H12XL@Y*j4|exevsRKes9?!XU}GVUm3s3x`NeinquCCI zB*6by#1$_X^R&A&I0o-#P;7HqYnsP5VnwjhQ! zu0yoizG!2o##(T=J#*I#gP4d$MCTn#BTaDspMQ0Qp@SG2tZQ#v?kq^T@j681FDWx1 z^UHMJaK_ZYhlUw6T16HeQPFD*kqZP2Xs0j(TRk<1q-}p2L#ym&V4BcfLl8kgvJ6Ac zd2UM(e?z%T+;7H+^xNdIm(?h@;k+>wU#ox??Qhh|o0R%j>3!MAyO?H60h>hks}V?+ zg!IGti~RK81iFwQ%np>~o9tEB0<{JE3~PgdRd=b)^{u=W4f);Evr4j|T^2KPx6pkR zj*v`60U>Umixh;i@gzW*vLS+fl6^*-YV9J$y73T&J4hhDU<^r1*JWD- zqqoiZJ87%jE;|S>e+^#OPe?;xFs@%yMQNoW$WUWeEyy@#~S@c$XY{ zzgJ5*>c79J75=Cq{#P2lol3BHV(a}<XV>kL z!IO$;;mqj0B7`-0!HapL-V$*=f7ZJNx+?!P05m|6!I6|uje7OwELA7*?qXSrG_9pO zrvoAKx9~jC9#PlzS#z$vDpEVg>@zCcsU8U5O9WVY4in{Vu7i$$wR89XJYt zH=?S+XD2gUQREfUb&K=ziE_nkJGT$(A!}B;+~R&;^LJ28QHEZsss$FCfAlM`9-N|t zqZqo=!>u$_4@?D0dbqT2T&c#Fa-zJs4e>|)l?v7u$vGHQ-PJ@@z##5`PI$lRf?$v0 zs7Ndp>&GUz5Xp0mX{f0M@&e_$3(*cw_OeLSBG8i-LLW{V$_<6nYFPuiw>0l70lo}J za?ywBqh2hDGAaq$1vm%hf4YMH?ck;~929E>E`aHMr+V2RK%I=~TIuKqLrd*SPEf{z z)xM%4X8zS&E?`;2rn{US{*ItN*sG|VF5U{Nm!*PECF%o3fd^s!6JT@0$CW?2uK_w*^Sm%u-)mR9`1xe|+inT_>2gII3Wd(9i>KOa+_8~*DVQENc(kb)x`XkEyu@KUWlNn zCNg_Pa!RJ{?eFH$fSvs>e-L^Jwms?AIhm$*RT#Rv0N3dO7-gz!^8B}dwOgNIyqC%h z#Kizvcvr8IbGM&%e=+|>|LcMZ=e91DBWk?&h!|`t?yyL5NMgRfwYCNw4RFjt@D9gL zB=;$tZB=0y7JiZ3VUVZK{i~STf#O*4yMrJ3yswPzO^4Rj4ZQry8U{gc;G>l`f1{AU zkTQ#PmeJ3>M-lQDWG+<1rTN3JHp#do(yI0ce)R|yF4I+6f2iHLzDlk0obXV8aeyKT zv4w1sFT81rrFeF1SE*CKf7dQNyb&WI=g*{`Bl>oPd%_3dCQHR(vv` zI&e;gEKIiSuxm390;KLrPY^ID_7#XQsnTd$Fp5UpM=+q;WDwC`S*1K`eWh8kbIt2l z)1+$5TmMzqthcAIKQUq1Tag54bl|@5yy`6KHCQdMe<6_UlaQgYovhgsgD%y6K<7WE zTSQqb_)1ikgY@aS-QQN|)GmG2zEEcC?w7p{ z=DG@i4VHke{7AjSbW!Fu0wtozKLxlkE_Dei|F970R(lqTV@rEhXB$-wPZtp2YC>lB zSgTQde;EcRty7g=)!DKxkXCAOyMDb}bc3V}`MM%H?&2z=<17!9IHX5uC$~e7RcGVI zv{!Sr4LNMfEsT%o<4%x6)s3984rmzh%+ZK@k^TY1|03jAUObFB7o6cI6>7f4B-ju`(7++IBQ-NeqK=Xe<^JzDmIi z9IC+BnhSI}4d$S!PASg}Cm!>LgIACzP8%cS$946-_hZEb&fZk=;1D`y5waa z94gjI&7Hx%fi~T?=t|*;-*uuxOv-h5;2Rm=kKn@suJ8$qL|ln8JFQ1$cZivS>p%o+ ze~V^pFsAdtRu4!lI}b7m3?quvfND!%VzkE1077yRin_M&DZ^_)Q~cdsU~!UL&9^X> zuv7dk!d@Z04|*U;jqYl2AlvBbhLhMp2UMI9=YZh&ks5;x;6#5{Iqnwa*>|7MKailh zkgoBs>F(35)P6IZ?e4_^s=ffCB;k6YoFL_d8H`$I%h6)yrzMGF34ucvz+Dj@! zPgZsJ!u95VN#+C0C@Zl@`0I6L%k|S0_vFJ<2?AqV|I+Z+@!#UZxYNIACKOV0e}Z;D zDPO3?Dgr1N+*PlU5jHc|wyld8{?T^=Hb7F;&+QtZI_sL{`g6BsCZ_L8;u@J)TvfqY zn=Tl1#3QEpTkaB-d@`_W!c5RJbv3&Y)pYTh^O`+^I<{B`csVM@Lg040A@zJ^_U2rE zs?W-QmyiyLpt79akaby_NB*QAe@DFO<$e7Sv2AVk+w@-t7E&H-NY`J{#aCAZRv%R@ z;8w`Wp=eS#$UMR zt(A!)>!jH=2r|00cM4j|79RFY#h1x!IEwBHxE0OL2}|evANnfh%SKW4e>EWN>Y&T+ z+lJM@7Hl>D0Aelb_P17u8OB$aqTUnkMn~V|&^1JpU}7+!C=du{5N0{&aWF=0?=NRx zrRhg(PIsvUf1`9NjNavYg>+PXp{}}aK*Yv+_W1gKNBqSF=J3tGo62YZ*>}(+GgQ^g zU%p6$f?Rxk^~6X)&;X)u$3ev@NhSj%0>9&~DCZnKb;Zg+Q!Wf1xUt z*PYqsH^BwW2SlKikCFlfgMu7MZ^UH(&42g)BIaYBlnhn^VCs?wKgn0qb+{iXK5!(` zzUTS%_2X*;2z^)7LioHrXB0$Wt~xWyV(HQPXzPiOH6*xOh_$e)e>5dmrQb%l)v%01 z21AH2eD|U+B)g{umP_NW*B+Uz=KpNX=RbVqL(r(A@O8fHY}KVp;kk#pMnAm} z>YVDOud2vzdCph0&fhw4su zZbi&aid?l}W@$MpzYxX}AgQ8{D4dtm=TU{p#v0RI4zb7#_GD2l^6QA~f2Kp3PXBfb zyMg<}2<~b?f2LrHuoQ3?z`g5E{UePYvZ}Z0s)=H3zE%akaJK>WcV?ALa{opvDI!w& zwIUp9Qu=u@^L>W86=ka`PEZ%6VBJ{<6hc*1BoW{5%EA;Qp*>0oOTeo7fr;3wsq}oi z^;hYRB%m-C(9x1Aa2vzWvi{1l3+>?kbP4<0@89)_f02OhsibA>KwGmUrkTLI`?|O5 z^1wvPtB^6pt*!faa(}3lSt>BQWI2;s1;z_TPbdl-)^>Bzsu&3t3w}@Js!|i2v?Qx_ z3;eEm*=_{^hu|X3Hs31iFfQA^?!*kSA-!Od_%94gMfhH3ty1hIgk zjbd_Jxi3($Fx7&ksBkY{Ho=G?sx7x-5J85V>+4eLREy~ucqSoRJsw+~vOM68ok1KVjpHPn}O2ROo1CK!8^A2uJX(E+vhD?d!1M*exUMFMC<87#s(uZ6Tr> z?O@$FB9VMvlqZ+&O;dD_zRN7Gz3=$m!K6)cK*yPh&t=<$o9G;S zV2)}W6*&oYk~5h}-Pn9=je!jQ9W#9e@p@f#jRw(tNngOiovcO zwuEw_dOX=}z<_z~730P14N8;;wI{@>1qbDg`h(VB|8?%kg5xUqV6s8b)dOL<;h=ax zzB;G}apba^SUNns2Q9+XgDi4jY%mud0&c7am1C)(C@H87%E8#c@6`vPbuOAWf4;4_ zgp!*4a2fai>fE{kbN8wgEyh~tRt$;@1WcQRK+>f~gj2Fs4%l8~Xpk))%8F zH3idwF2`A~AJ1}>LR})BCbfW?T2}!uu+k5U?G_Ks->#=*?V+QTc2qR%Yq3;jQg>C^}j8~o1ZwV#4;H*H{iT*z*EvTaUHlSberarZE)1$%g z+|HiC#BE5E`7z5->ir5N?e_Z50#o#p zN?HX7?wjILDC(Soo~MF{rc4LpH%KpX*gJnk^=!|9qo`39&rQg(#!?C3X~Sg1Vim-uRLGjM zwlzAexKV!d7Oq#Yf8`Q*EKmve$gx?K@O9qNgAz&%ptAA|fA*rC;8yjDcG0WpS~qW5 z9SrpB6ru~#{wt_C+utv%G^s1G^1iyhq^+ohfS69Szxq`ahQE>jT9CYjcvoQOoNZN} zdSr5#7Ot3${j2~QM7vLMc&M9T9ACd83VvPZ*RK^K0lK7@e;q-Qrhe)l%#_oe%)E3* zMt2wejR+G~e%FKLJJr#hU~VtJ0&A=u4>qYTa96vhJJYUMVw~1}FPT)UfWDnGBc!^j zSg%~rXH|9nsvz$!c|Kj;5JilQA&lEZ^7?8UO^^#kUubXmdSNp&V8RAuZyyP{dPAB=FXxG zgQ9)%bvF+U+-+al)TN!pyND8Ln zw<)f+L*y-Wk=9Dp9lEQ)8e|&TAsqHD8Zr7U|Lm2oq;z3qGtGf7Q$sy;cx;gG&qW0sdXkBzOp3;j8^nq1*y(-JA5Ve(B#~f9E z9IfVyz+4sPs3M2k+^bUBlbOe@iQfB#e|^KXp}Q=L+X~CnDT_ezmK>O;yqZ zqf`16MXQ`;3RQUDzr=b&SBs(goUf#6qJP=^{rT8yT}tL_vm9U5HQn0+`Yg?#->hfK z2pV{AyV^lmJ<=tci>qL$zn81J!r`vUEc{f}wM2SLRDtk#d&_K`Vew=6XdI8QfAme^ zTPsw?t~uhPc?CB*+*{jM6GZ>orRixdGG z;A;%DZFh>MumiKA`XpD#p)N^P&Fqrg!*_=0H?krnODM$J0R=sn}j-h`0&AV5BC#!2X(%e+tayo$J8PiD%e^pWc)mX>JDq&7AxLyFyyYPIo*H=ol z2i)J}Uv!h|i5eFh_4)hLe;%%h%%|ybw2HRsI*G2BZxbjIiXC9FHM~D~o$F!Sc5W44 z;wrp={i*xjmzr9_q&%Y!84M)(PBJ$_z6L|YEbHh?U9SYGPzyg*Jm7#>ct)I2(7H4d zt4;$CJ9_B|U~0 zOt4D%K1a=u@pd%_e^dRRP_5a6AY-c;YXTS6nPGaQFJNz#D&}g!9A}78=*?5}-W@eR zsS=n+ZVG2l4t-bzj)GtkcL675B9Fl>ivRzDSc^-q-9K7Oa;m~e+*${#d?)^j@u+?J zS3-cG-~sKG&P&WDy^J(p&upBV0Yt#-Y=MqbLssk;(7RYcDD3^V;VBhYmkN_Tj%Jg>C!7&nB-=mi`Y?N1H zE;5H+c)TZdr5a2I>Q&fx70!tiRDabZzXn3Kz`E9Z0`$M|^569)(uSjBYSK4&Q09%_ zbZk%EQ7er(f5bpZ;U%_8nxV=@*B9m8(j+gaOrc)b(ScZ+K~h!Di_A~YG$k5@Jn2)% zF@LY(GTk4uq0?IBO9gZO)Fg|r(GlB4%|v~fMWNT_>jmWduA5JI)0ONObHTiq*w9NQ;C_fA|_Q><%QDf1AXne2=1a?*4b- zST7|JhXi|LVKakN><$gg5eXy4V)7qdDcg9mwR$JCsNA1ku3oDNb;z__>?xesSW#pA z_qESbL?+dv-Iz#sDPkg9;nej-kq)eLRn88O?k*DgxmWmZ@N*&OyRLHxoPb_ut0)qy zlWk~Se>bz1+c985-qW{k-iLc15e}Asu9)rXg#CA+GO9@%bhc!K9AY@RJ^uUX>A;jd zm0eX}K->;o%0k^*QWnMwec=(Gbv>~Jtt*T3(Iv4}-*7XU8kY7me6uTO)c*Pm<*VgG zpFt1>h+P$%YoUJiYl0l`U1P+T(az2!?jt>_e-zK2@RYT6G)q;tG7|zg@u5>fX>^}|gn^omYmGxyL zsLU|wQurv81*Bo^#)4#dsQwna9pvf%*B!fB?K>F_uiKjGK$M);dQRDWv(RA&snvM`zJzr{ z;4R9>I53=5uH^j!#f-OgVV~&qpUb{de*q8=%^7<~Obc;2`nja4ipqnT&SBOUbgwYj zi0NQMtSMAni6zw4V5CWL15)vhAmT1N3a-WZAyZ!P~^XYtDR3{9g%ff0e_O zn8!-oucEo_WmO1t&VmcO%Z=WlIBe6~Zohld)P01b*A42e!IEt?jd5sZEP;83h6GQLd9=5I1Jpl zzi+cmT0`9%*E^B--xu^!>(Xz1f3)e!u3wJ?UtU-JRpdDwOiZ!gJqY6sv64m9Dx(uV&}f0S+Tgwwb}Nf0pay<4(}k z6X5_I)pbeDMzi_OJa@J3R~B0q9b?Qq;Yih&cQR5B86=aQDb-*0lll+F{+*&!G9*o& zPj(J8@2^>TM$ctFzozrQ%J;=&B4Ud8nl%|Q7Ja>##=oaxUl~`{%&5$5#||UT?|N!- z*51p=fQ$_TcK2$AYNfS}f44FpU|{f}j((*Sm#5O>ZhD(89Hr|83Jp;koA?F;*E{#S ziy-aJIVeGL?eu`Jqao~_$1nhn$x7#5!x+bfd<;g^r^+Ex8aZ9?Mfz8T*(DT8G4va} zqxs$Gf&O~a1Vjtefq??gi8vnK8Q6&L!#^V6;wPzK4<8uU))|_0e_-Y01KEnCwKSB7b_ zYEwt~0SOtrfQB_T%givZ-%_L~@@9pMjX+(`a+lj5kh}-1?HO2Xm{g1n@zFCnC_ory z;psKk&asYU24Ym`1fG-(eCe{|4*WmAeytPebD&Zs%P zlq=HVud6C3?t-JL+g9I0qF6punZJe0L-dMj@=(O_C4a4 zbX07wx(@K^{?`Swz&u2XqLo6Yt`r>00x&@~KIGlv>EPP__9m`t!-(GA+tNV-YuK<2 zAIfM(5=Y}>e;fKlu?KqMnJ&2(9noO&!1wnJBM&e4$6dAkmEx04#mVszlxyAD7{eaj zVa%uN0zVgX5L3ck)f4)v0>@{o49BVerB{C4D=??XwxlgWn~jZ|Aqi%MR$nD}Gjt^( zzh$C8j+9h=mn@VcL+%63)9FO_xsZRz@YKM9Z9BXnv?JSjpCOyP17`) z+ttr8(=<)fB{@3uO+!x%0zh za+sgf?;mE#G)_%cSDY z!_}onX&Lh0@9FLNn-qD#4iXK95fdn0t!krWxNFh1vhqa zm=+BV3_ONsKO8Fs9kMje9ZF~j00vZ4e@FvY2~HeN9TNvl5FP^(B8CVM6%lsQ_0&UqNkQjE$$aoSdGQvpl9EZk&~ofZRy(wvd9E zvz4{2jX{(XaHP1ts-ph>&?x8Sj;O$=0%)zN#oO-g?Dp33(HejO4Zy|5+~C~6f6mm? z_UQOnEraIX1}@ooS-EgO?FBq~4ps0iXr|0FdLtFT@@cs=45reF;fraETv8 z-cK0-03rZ%3~$qNyFcMd&&)*Oe+-CpnC~HW5!I+cD57C*^BqhgT-YcLA{Km-6pmRO|JN<|7n!NtW^@vHqU%NzJ6f1tn31%L=+A<}eMbhUS?^b7tkuc%1?005v9bW8L3uF2Fp z(~`W9NMUj}^a)g-PAkdQH~F%G000009*ltqy>*L;#^^0ubZ2Gq72|-bm4rWB&!kx+ z_Bg@g#24yb3f6`PdrtKCF5`g@j@D9zkFpZ^9dMon_USEgC9w?ff0;heZ$B_HXJo0q zG7?-huUz)*;xmop&xELx5Qp*D3f%DdZJH+JP?&(;JS>MIzY(-VnMNX!weVHdQ{FCM zav4?$yuG39#-(P(05nX-Qb3u^gP2^f)a$DdM1%-L)L?whjF3L}_~q2tJA6b$L`2t2 zx~43gf(9UqD!fEQe?&wtYUGem(Vd;J>SiWD(0)V#LCc1xvF}N%fZH4ZeG9LzvQDA1 z7q%)S4U@1u(Ygi3sSyz&NkgylIZUqX(3#7L2X1fLZ|2ky zpGs2mTLB_X(=@U3>l|*pNF>rkDyvayE2b*icaTIPkybG6f0EX%J|a!i#3^Mx6!PN3 zNG54annsBd97rU6N;aQ5rC!@asG1BSkuYir*x4D2UZ-gXR!n`W#T@!(#umEAfQ2W)EjSBzf?I&#?k>R{0t>ew!Ga}$0KqK;0>Rx0A-IL$PH+oyC;RMu-afl- z-FIKrTU9^0zn-3NdWP=)_e_uA=>91jpbo^>m%NHeQRqe#6?0rQCU>nC720LdCY>@f z22G`ZaXdFwP7#;KsJ2IoSQdiiI3zQxRe2bt@?z|u%@M@N9Ls;Hc7FEe2imqKy?7ES z?yJ7PT_jAKO#6cYJUN>#c03IUKDu5sUb%zwqo{TyvpNr1ew_EAOi%<@$ZF4#zDn`3 z-B?t-UI~J{;Q5i>qeY~SaSYvvsq(Go+aB9$Z+WGlzC3!FFRFBfHc5f@69z8bpqw02 zp8NKr7@3+(w6HHp;+Tao1<%9hCV`$L8L0FA?aq*?RCygkPm{zFY(qLTOrRYN9fA$1 zH;)(QQ1G8Ec0j#;m}I_KpiGuRf%dof*g;FF5=4O|V+P6grrKSOm-hxiC)=N!l^_}O1D!vLvO7wz}S6aFiewCCd3Nj1I z3Lj)+v}L23=#9k(Mle{r%stQH-LnWI9y>!)wy{YGY^(3|LzglO%!Gau3TM>|C-g(g zH4|n_m+e-x{Z_yCeEYs*d5#!A;%N~8@I&RdnK1;J8V8YN+O5jg6VGs({PgHTd);RF zM_vj8?a`*k1@&z)dkZ`pBDbrD<-gI44mN`x+H(nJlRxY7@yeRW#+kx0Lw#HXKT;i0djLJ<-x3zbnc%6KqVOnPJjN|efnygQ)e&;-yChm@ zp5)ylIOy^uS;ccVSt9+%r=_a-@-6xwzsONuneW=!CtUxc_QlWB_f~sSlr2q>gMrr> zChYSzmw-_6kXn?$urou=ji~DpqH&0e&5We~nS~p&nYFFAkEW`YytnHMZ&D^f4|5`I z8}r)qm0$L=YdJ8i9uY$0K&1 z5;a>>6tq05zwOhyeyeBXfx%j6U}GeKtz3lZ>Lp8S>omH`Vs;?qb8gJ*wa zAKV^a9^W6ik8g0TomW6_ZbWo$AATHMe^FcQwXA%Ba)cH%PRx!$eT!U<3nN8h=5drZ zo8-p8o#DX%`(A&IEAj*eY z-UazWn)Y9s6)0zVkVjtCFw5HeTE_ov`#$8=6*t$AD zW7w*&v~OL#e)@!kxMR6OB4PK@<|e_}d@{T>;jh{pa}QevpcJN~uO2bR<|NX)(M>Ry zDn`58eYMkV=bhbWzy<(L!l^-{2eUP4y`xxmDXWx@n13Dw&;fuIOr9$}9EH&{9`KFi zyU}t~I$azaQr2j8M9i@JdUF|Q`x~g0465&2uQagdY)Sn(uuK2={u36l9z*7*bsVMr zsQ0|)e5xvlVuCXBRx;y|%+60(PjkcEL{j$$#-?UxNZg)IPE0L*&Z%$7-)L0!&}yHZ z^Rb;fjg>B&VqljPXL=|`d`WPY`c|qbNUnQJZ;KxbgY=aAR0M(fh{a7mk+Acr;q&=3 zaZ>^kn4$&IG!x!)PVR{(@{Z!X>}N#@(<0*Lxb%$9_IZ`^x@x5o*-D|FI`1{!XM~vW zX^J6-W@Q^By^W!IP}Ls!CNVtk&ONB?rB+mOL+O`#M0j?6ta@ETag}h8WK?~vLuJF@ zVdLbl_f!+%_FY*BxEBz!dGcp@?JPZ&R|OaO{T{|@-K<)lS^O0%dLQ>S%sqR(@@N$O zx6SQ0YoZ#4Y}|Y~3_W`F`({dBv@5j=I3_>BK!tJ7zI)eBaV$ zVkBx?zYz*lW69ivEJpzq6$qZ#zvG;gf0tuLJNvgj zIh%eUd<{o=Rv@#Kj^6{4kTOGwz5KOT7Wp4M+xJOx3h(7ocN>Y*MS4I61UaYxM%jOdLs({ujZ;XQYv<&;??VXCt#z_qq7R@;RA7=o z3xOTJ$5$0p#Db2ULie!78?u~GZdc?F;mt)KnKwjH-ejRyr*PmMJL&?#HoEGRHU;l- zk7ENXwVeiYQA#Sm*0E#TyOZIt>X=I;5e!%s++-4KC1V1?Yw(yy{82>X8IP<5kF>rx zchZ>u-B>zSFGz_P?JNaUur6-Xv?gbk4&uw7@ojEP<;0wKN8STo2QxF-7gGzJb79j> zXgjyRH@4uBlpCws+2FoQO~Wk7j>oSrOVuj3C*JNt`g$U&T{NWHOw|#IsxJccdC&% zo9A>nA-wZ7<0qev64MFo$M&BwZ>!0D5RVri9_JoFRTKEOS(%;pAv*VCd|sSdp{4oz ztmwM*oJQTILc5gML;wgTVPoU09=SlPt@UM5FyV1jZjg83b!%;Hc`yhn`~f@MG5fzmum1&qH*Jvj zw?&g3AyM~zB-)p7z<=Q(%Jy)B6u@UvH2o=}_N@9TE?PWY9zT$~OT(f_&kAx@_w)al zt=5~mIQ2S@R_N zv-1Ok2t8!WgXPQnaDD5FPttEwKQUTHx#G*PnYVtN8NCT(d?w*Quc*-;6X#^L!|^QH z*2MpDJ2dCSZ06x9E9c>>W1*m<{@%J^{TVoJh>4>#y3QdWY)1K`IgPWmeNRoRh(Ah6 zqdJAvqqtoMD?{&X2bxETZ#l@LCe6LK6o9Ra$8nM4Tw}4#-STuDX}nALt?I~8i$GM- zz~@ux$b+B?f~9SM^p|e-5PE}6w3#?=Atw^imaUHY_xF#D@q%Qy zTf{*F<^1QG9T*-TP*F_-MIVY|#Go$Xc?-}`W&K76I41WeQRX*iLVs2-paax3J7mOY zkCT=QHpACr<|}9SmRc5B1oK|3j(ymIrO;c%kA7|MT;FXvK#`=SpKlHQj5zB2v{1IB zO(d({{{6IXFq(;sH7@fs`QnF5yMPJ-ZE9At+fGbU1m`^1-p(9g6M(28#fo@ zAW&zr!b*ewwS3%^Ldg*wNK$RATWccuD$y3)9N)<~fm0Sr3Vdg)e2Is6V1}##TB94T ziZ^6op+y{bztSly^eU(CKoC_VE#FK!B$K60wY6%mki>oO?(MPo=-BcKL$=hS!v6;? zmfX_knDT*=f!>6dT8agcF;gnu*kw6h!{PQ#+u{v!8g*vX!7b`u?n=9QKI4>>u&?`# zXW1kT9i}l7o>f{Ei+IyBtK<6`OOErKN-Tm%5*$HnlCMJ#8@r@Kbi(5>w(Tl1E?fypf2n!XQgU%gRuD8-Fa!pAknN7NgRw&>Z3& z0|%(PuIOI74>#C;;lNPk?G_k+T8T_N7N#Zi!8KzX@p45Ep2zAF?J??d>9A@8($AQ7 zn!bWbBf{+8eJaq(EK1ZD8!^HVin;1OZTPb4@3J$~RnojdgiTdl;&)tU+z0)@M@B(4 zzPbKV0csM^OR0j31KT}t-JE@R9DD4ST{@rxSK-8JIc|<&`#STjp}GEzDV?#HW^DyR zM^;@%CjQxF+%vwE+x`-Hb)v10f7;4}0@u%J6HQINJjskEx{7^C(^SlWKsJk}jV^hp zM%7jj3S%Ns%wx*)#*X+}&W5C~4o}p*KD>8HT{U)`F!`4LD9b`oBlUX>b9O?tMOaaxTt@ZWE^*`4^H(a-6 zOkPK)r2sqM6jJVhzW~<=ysNQ;udh;(mR_$#>hq5LmtR@lpUilWNwuclZrTO`(zn~osYk199IC$37XL8 zFH2@RY(wAQ=d$E-ggn~d6Ql(4zP@Z?L zP2p|9^LJ2|XrA|kxaybuQc@_%%JGjp6kfeT39JZy7l?R^f4j~4ZAH~B-vg!&2c(=_ zU1sd{lD=3yvfL&#-le5iC$gnW(?Y0YX~seui@!%&=5!$np@(kU>rE8LkA|UIt}(%L z*cqWpBHJPn=2D;^OfN;iK;G~$u8wGB6Px7V&w_lo^7DvOKzQF* z_Xuqv|H;ME=^?~DS)9$aE<#xBTDKjOJtG5gx4V>ne~B9XmTYb#bxU`LYY!thbl?!{ z=lP2hjT@TV^lM^u&%DMs$MA%Z9hvSil)XnO9mD5K0PX9K{PQf6(2F-I$9YHGN3Hse zpqt#q+Ua4M9dPNds{OUHv3Yh`?I!1%JI}Q9nbh8=-98!)&pOjCq(W+y$zypR@XE^` zVNmybzOanFX~s;nV1z7ol*$UfNd%DSyFKwF~Ja@Dxbbh1Wa5fA@;U0nUurzb75 zCCDj_h0T4J_$9iPaul8eKlrX#p<&*y{ARjDng>tX8NkQ=59O$SQaBQJ!19t2U>Ru^ zaX#Lc@Xbp8ZEO^5wDI=mIir$<7o=yc2bLOz+^Rq*{&XAp;%~Wg zP6gO(8!-ZreMg)=zrjh>`V58Z>fDrM#n20NynZ4}taR#wDv+|5l)*RC)rNdiM|QWP z*>U48G`s&Q+syGy|Be{enf35yXmzPyQTSzA(#@u6Is)55H)c6@^<+B#xD~w#k=C|j zgSUz*-BT6!M-=nMOW()S>zH&7aesEZY?^T;C@*n%@!#U~tXho321@hQmg@!{t( zEK@w*PtS6P9oYIWQLztkoHyNleg$}mZ)c0UJl%RVDt=pZ85XqvbUP98>TWw{d-`tg z?lP*a>i%kovTL}u=J}s52&Zk}yzAaN=Ny|>+$%jKaoM_md1V?ChDS+&X>nqGHDfP` z#^ysfp@#-|lf~(i8zbY-l=zrBg7^)V3T82hNCuXc^!(FjP5>am~>^TeR>!ers77K;GXcDfq zBz~{Io7)n$CN9f|bX#2VEr@34r-qaLRMB3H+GWXVyfY|;zEgEjI=Y*FP#V@WbWp0= zTIS;G)x7(XO(O^ zU}GjdOVhxE()^>t&syv-+|P8aAq)d+8CY)D;FDE!!KbqWh=Y)i*zK=aE#NW%K7Q06 z+P>|B3*JKH&ns;Sa94d&_T$i1Czd?A(uWVc^@yTZ-zQq3M+*%*QdwW@693Z7em<)g zQbd!il{Q`Yd{E5a;$2<~(zRBvWtB+_gYQMVqL^xJUqo1*N`lOfoe670<~(<`UvSv+ znv^~ArW4+C3B<`vX-rEoUHkP$VuHU3%-zuocholKt3^?wdq!BrM>%VJA+%kesPNsP z1QqdYVZ8ej7v-7Vr*@CmMES3HR>x}Y18%jvKys;+HdYhpG{?bpP4YXNRAt$)#IAlw z;!oWUu;x>9mle)oPEkYM$3H3v?HJpOG|RI|KeQDLPsG|n6Dw8rc%@_aE^A+{q(^f% zBOMpkN~6>>T{UTqx&vc7BSYPcB_+|9p8N!p+Vz14RgJ8YtO(1pp0jt{?8DcAY~#fr zGGF{5iOizOR!klX-*&wind@xVmRTiQvv7|%8+AyD?_w!W;Xd{%Zl#o-PTTO-M?~am zdG*;Js3YoX_EfMPbkw^HRSW`9QNn82oq&~PfU3(#2HHX5wKFybKt4q0<{`PfhLumu6jtN!n z=b>Yq!FwWogPPw1{S-!JSaTa^=062^SzdK_H2x{}XVb#I#Jqp~hbNV^B<%pUgtk<3 zHbyXpsC=V&+{BV%JT~0v@Z7lQ5xx1N_lWK~MWbe#CnFIoI8`Q26@SbcP1Z);K5>eL z#GdmLe>(?>P5`eZEJU$&}M_bw*gvGA}HrBHO;)DEpZFNrm3T!7o)_^xGlFJRYo(e05wE8g)&Xm5g z@@j}Q8)jFV7m6y3!1H>U7*1L>*htq~^%AYwP$E2ciraI`=%04B&+o}O7=4nnFAtxwyqNRfP!6&T|owyZhCf%a^iL@a~GPsTGIZ|MF9Yp!&5(& zBO)i@FqD+ghe5&|zIX)CMD6}t8%qj=#Y-!HYjbNSGfPWHM|*MXxDE|d6lD~^*w|I} zrGvA)xWAmLx|5VLQZk58;|k!Wp?jJ}MJ6gH$|)4Cq83cVFU*Gdgq^zDOum`{2N@3o zI@3|(euDEP{Lj>G&)NCyuMp`wN$)03ZWgEFZ^RUwpsq?V1|7(i@rW z?e3d9JUp7;-&j%<;YYgM?af|XKJg7M-fpUDx@~?_nEjD>H)9NuUGNEVA68w_v{08= zdKi@&(VTr+81H?b^QSy36OedK5LKCw6LQ5-w;2DaEv>hY2cVB3^?6zDitxAg*OxOF z-Nr)4=W%4WH}F#CXR2e6o&n<1)l4*GyFBbQs-YQg2?G^VMWrQuk#AZ=Ccb+5!LG-R3*fjv1nJSVD9nlRm<{(q zfQdvL;6W2WBfFg3INI4et~<)CB-UuYzo9$(8p;}ZvwHKXvft#`CwEys{AbtY=+DvN zeus(vIl^k>xfkmlYu|r#4xpnFR+m<{~b~nD`}tt+|%?tcU#A~c-)({vVJb3 zsHqusC~2GOI5QW@Bpv4=Bgspj7@|?jc$pLFQ#}?D;Wr3x(O@tjrjINqwj&U+^nJ{V zhDJ+AjfxQLM8|(+jZSEeCWh?`J_VxQ;;!S)1S>KlGfY?`=c1n81N2|bk6NV)?f1i1 z&UYx6cVg>Y-N)c{G@b)f&wf<5Z&s30|DGOQ9~~WNUCb9I3TF74E>Toi-*#6T4oLLi zm+DpqR^>NVeOYE(udn+YasIP~djfnFmpl>@7K3=ZtX;?!nUtFvOJ4UTJ(A%I!RG)I zw@=u1dX9dUW-l%MKcuWzT0@s_8!HSnJWd!t7~kZA#d5y-_Kx;c3iwztTZXK%dQu9? zQm}F2`xbhyE84tTVUU%P<%w?t626CV{i1pzmn2iolC4FclzDEdKND87>~|Q`G*76cobVi7Q9cgs(+EcM<6f5aFxHl~m9sayYWhU7eJ( zV4;@haCpCttgPvV8pw&jYfkw zJb~u&-0!zOtUrc#Ud?>lgeRSR>lgkZ+SlF%o3WSZn3?bDTwdq z3>|TDR)1O|U3n8LO(V~(H#drkgE#yLV!|LAG!df-MZN%j9yC-MUG-`Uu}74|9Qg+v z)MiYi*!cjpDBP0%Shx~6EB>olo42LFEV{pQs?b74c^?|T3wj{Vw9Ms z2zph?M8&q<#?MMCp;{*~!O!npj_^787DA3by}1v^i+dJFXxikeVBRL=sNm#ICgHs# za%#mY-Gg82%VV;y;)jDqsX-!js1Z0Qsw{Xo{}jo=PUEICLcQ|#a&`7~=hSiwVjiE*@j(>dO- zV#xSw=2y9F9fl7$Li?(AWAgN8Re>Pv%T9=Gg#Jp8rKF)k|5*zY6G4Zpf)V?QrWje)mBl>%YZU6Ll&r(kyDWRgXQ;{-BjMW zUmavY=;5xi?eWs?*@4?NhqyiDb-X9yuLG$gj+t3q`~^ZXOoJ^63GopbZ3Kywo+uAJ zDHJq|uLb3C{F)=E30=dG5<+0?l=y%0;Xwb_Kc$NMt2g({D_Se}m{`H^t+TED$!eSV zQrYiZ9Mh$Z-y=8z2PFo3Tp!NJPp@@bwiI)Q$JJ~#3?3}Eg<-&mwSNrPeTa!Yj3`*7 zPc4ilRnOl|i+ROO3oAp=DugBBKZ5ye_h$#E(Q@NPjl6h@D-o-1{M01!rd^XsRs1eE zbxlf2RRGo|%gz#{-T|YRjVVpuh^4X8&{F?MtMr!G(LLz{wR?%hh=JngCs%o#g%l)| zL`=mZwL(lu?&42{VZjlXgUzI!y>W>^nUDwGt2}o!_FVwa4fQ=@_2u|WVBFT}u*!)1 zq}My`rhB`IOVdD_@T1javG?JYmxq%daj+PoZ>eKpYH;q&h}MMnZ{N2Gk?}v$&Nwu$i<3J>1Eul0 zw!Z*?^N8lR()e45x{6W4kA#-lr0NTcGs_78BQdh~^()dsmhvYDx$&-0_d2uvPus*k1Znay>$05{qJZ*T!-hF*nZ(U2R5< z8sQ0H=6ZmPj3XSx%oD)RFT~@m_5c~+p%LR^5Td5`dEqQ%Z}uXKU=mG750DIEl~R5A z()IBVCp=9N@5j`~?Uo*Crv%HGQ440L$RFt*{*pteX+E#8&;jt@{6UR9#h5Jh3pzGG zB{B()!?G1O-?}oROW(Gn6s7>?c*nUGGiS_*r;+u?pP{->$qvwvu43SK{9^GREP!`> zm~n_@eY)EX0>MXfmA4uJH&1?)lRn2IPmMD*<$V$``1tFh=wOXWNGkF0yM<}L6OfYz zAG6Yk1n~5>L{DSdKvML@g5JLVbs?R34##qZ&z4pK2e&}j55GxwO#cxOhpddPB)3#T zBf}k2|I}ajiva8Bx(uch?JfRf2oIx0^g|4{_7};~i8#Z!a2p0_O!*5)584D@r{`{h zZ0WdLU?d2uPul`bL6E!tY#Ss;VqwqQ&vlTn1Kwcbsz^hBObfrD;OZxpDIE2WpK>^et{{2@5*+&17)&SYQ|B==W*}?yj_8qdL|08V< zvS0s4+8ShM)Sx8M5Gx*5qX2ghe}7n?PyjLrHVAPDH3&0^zdz@HhA;ma#{DzQ_-9z0 zUUUE&A{uCJ|1kxQ-G%~y&}#PogzPg4&|C|-`+@@45`h2UITSVuf9Tqt&<>HJ3weGD0xcpSP^Ae1n$WrtvLNtG8bkoQ z4j>TZ1On6cAi!q_0{D=Fb0||VVUu#8xS~wmf=8- zjO9RJ5d#EhoIxN1;sFF7L<0^~02l}`6Mz6IKI8|=^92G4N>jxJfprW72n0ZpX((|H z%7Bdp0=0P1XrC7Z^tnOcJrp-40s$XF5J>+ULXPbCK;Qzx3ChFC4+7;7Y7niE{Rv8c z0mXYD+(|)zjtm5LAA&$KB?v4)aZ)Hg3i(Na;>u9`904sbf=Yt~Io5^>kqLnT6(|uZ zOeYk^LIq%?0)bK%5IAB30U}mtMRpMQ0I|&h9SJxH3`2Qd|3Lz{>rsHG5c&{~5HBGz zAZj3nAT}VbA@Cbe0D1^v2*h*fj}1f+L^4DXL<__>h+hy#5a?e~0CET(2qg$Bh+v2; zh|dt;AeJF6ATS$I015~`2t^1h2rr0eh%AUIh-Qc}h_yx(1aJUFfF=}x5P}MV1405q z8^Q|02O=IK3!)U_D?}H>4~S)mLx?{R51OG3L%<;BzIK&3TEd(ai%8&qL00lq=&;WD*qdxE$EW@A*{(HL&5)uFpCHFwXWQkOWym$bj zBjtvYTR}-?>GFR-B{KakkzZqdyg!ddyh|t3t3wQhx`%T^NvZ4fkWf+UU9ph3Q4#P^ zG#7X%if%445{QI^ZlaX>aRn?`%u0=K0_2qxxA_wJ9U@bZ z2f{>pCx)yeG*_MkWs(w2#KL!m)>!uZ(kFY9&($V=K5LhMTXEefik>v#-#DW8ZPHak z-tzI(2pd~H{SGaUarMMKHBQIybMNqTZ8P??+dru|pllDqO|JWVY%sJ`EY&ZkqQ)CX zKI8UisDFNw)V5Q-LYo2+OC0l!5}U!4vAw}DKjpw(M2sZpY};U?34`j#_vkfEp&Xo? z#wgdZN5#4`dW=9&-#3*|wU678%(}-#s!J!o*d#P+A8sGnu6_6h&*Sz@%)s=bH?U?h zNJjtAVLyhC_|~?i`B>OFlZHZ5=Dnzag$0}m^EF|5J}mbX>FH0>R_qs#U_(`jyIFMJc1#Dpnu(!_Wft)vwvhvfoV=Cx`gjj}Zs4tln%O^W#_?O)&H-9WB#m zboqYrlkLf$x3_!+T2=W-$RGgbhk{YiKP3!K1=RxzIutTENidOC=N*0;kTT+Mw%I;C zTl1_T5oZmQq<1V(^Z(0)6&}Alf%Q~1yqp`PMlCJ zgDMoerk91ZB>UfL_0L+x4%H%dUbqlHy9O5rvZmME`W6+Kok%ziiQJ~2n7r+frH4%Ae;@(@-Ih7AcBPQuO|yrTm2affxwUCkFDt{BHP~_k;aH(90T=D;B*W6$HcX9r2_6z~- zn)?el#b1B8C?qIEP)k!ucwJ?B=R=s{^E5tP@t~CDA5D}34+QT~P>_+(ga5tBKusJu z6bS_UR!(u|Z%OasLlFn3>^1CFqR;alvGeG`Yv>uoxWy;=IEU=6rckY4+9P^841>78+G*TaLst8{_u z;2%G*!e};?t?jUmQ04jL+gCqH=~?OFD*(+={jd-D`n$azk3aqjaJ=HajN2-AD4qLq zWf9sfwU1DYj4{7!(2fj$rf^QFUf&!f^>e5ww(%R{bLas_y+ui^Cd%+~sOJOIl+bT` zJN&J{`3JI=0L5hBO$RLd#k*=@rS{$zYIJwxEnms?ql?j6m3J2=W?r4%iYqi6d>BlV zCU>#LRmL>8jidi&L&>xA4RCV}lk!Xd{z=Vk|6@8b>iKzbSD^pS`J5n5j-O&j-Z#m? zstT`A1Zex~t5MXI-9-)j;)>YQ;fQkLCq5&Sty;=wi?Yh6QL0o93k<=?Z?NSAc$05T z=Q+~3z~Qs^&1V7nd%oXvK9`)`WD4n%HZ*-Su^`ebq$@+e+Lbmbc9OwtDVq>OnT*Gc z?mO}K<7+eF{j5+)F5Z2{Z+u4W)tmYV$Q=}CLxld;;S3`zKu@qHq1Zq_rkfPfh$S>B zfwc{8xo~}^+81KvP8P;9Oz&Y7C5a!4jBNGP8DQ7<_YrLBbHn|q%9|TlexUcHM|7Y` zvk6iLcSsow{!1A!ta#MN`vh|^{-e6UU;djSApWl;0c!401%)I5?_ZMO;%@F~4~YdA zob&GzWE>`F$v=ca!^OpuS{iEM_BQsG|Hwow>E&tX;%@Kh_g5JHssa~3oS&PQ8_vs% z;Q1>HJY4^>A@l!t#ri)97UF*@RwxqfzaOoC=n)bgq(?|tNPk;dP8gv_X?3p?&CvWS z|0vJzZVL(N?pbS1(Y&>b!N|RwvIU-5ZIpOwJMW!*Pjar+8B4_8jn$;;ivJOcd7Q+m z^V@c41A7%$D6W_9G)`=hVH*LKlS&2Zkw`3DO)|+)q*=kug{_X$r#+Md1L%;PPP}%t z#av3+yQ^9~%Z=|GzTE5>`EBD#zpc|i#rrM(=~Lo&#frjJsfSumPdITu486P~yrL7D zgYFIy2b6?exZwg;lzo+6=rh_s$Odp@oAZqhUt$$SgmmIoC1x6pn=v4o!wl@n83;$* z&vxGiXD_hXb}tTKW=wkQcGKjqb0>&%YGm}930TF|xF~74lMO$Kx*qY$v!qe36SKNy zEzH)gVpKM({c3bqCf!o;ozO;&3j0S);r(uFkq5b38wy=&Vm8PY0QrQ_wfKpSI|V)uwRf;XQEu8aR2_Qp+jW9lfG5PtjK3%QY=HiR(hw@EO4ZA zo%3k-Y=U|+o!8kI#Ss~$y^NGyI{Ye@M{( zR@eWI68~F*z{r1ZCI6D3Gd#v9*Q(6C!LzA>!+0Apq0sSYx|z_nM6K{AU&h1Gr{6z` zQ3+4b8lyfilb+X=678!_L!7q`@8pXmJV)zg)sIB%dORLnmtg!Q<}!TV;?_G7h)XRY zG==)3Dixy*(Wzd~S{D#Tb7(oY{&v}(!;3<7$ei-*BhM1jJL1`W`xMs7{}K_nFzagQ-)L9& zS;>Ypar1CfchUZ?*<^V#E{CuwEsOY%A8W*@`p(!eT1Q= zH*Q!0_3zXIM2#=*lngD99r)zxG1EkIrJF`5TAUvs)8nmi|S`XKpgzy~MdJtY0xB3is)k{VBqE5e1|# zYs&+l^63qAwLMzQ(b92}UDrH`j%DS_9~4&`19+c03PqWNBxni=1mPiZ|L$N#A>{~ulX|K`L96AhIW z7a8dhDv;|6$4A5ZJ1R_P#z)dZOyFjwy?(u*is@?$=N$hWQh8y*`|mXz(gBoEFqq;e zR;P5$t9dNjrj=oLL+sOf(TMf{K~^VjZr-hRI~7^)q)xr2w(=8B_4^+YJQ2{B!^n-s zz5|*?*8MWuzfZfLiw3Q^Nwkrx8h$PRAe1qYHP4+YeV&Pk;&MME&$7gLRyXJ7Yo0b5 zJ(u1ZEa~(zM)q4buYoe&=>uC&lZh@BF(!eZGy}6Q(Gf3>DlvIG_xh(cUY&by6)u;X zO4l=+z6_H|bfnrh2@2^1j%{?^3gPBigSugIQ0yd9Byv=y4q#ua8)(+BSVX&a9#5;D1y$CFn`? zQt@3kvG?nXm?PW~83A6qDM}`e?`*5B(lF_-xvT~#r+m6EXPZ<;@H{u_=6{N=uSQy( zVqyr8iJ4^_d~^OH=l=n9Cz+D8T8P0_dN}08@9qlzGL~_Sf+t}FJA)I*ou`y>0uKh3 zrN{Hf+7owD)ZZ!w1~g?gKCn?0QsAsDgvO~zYhv6`7st!R%_jioHh=~o|2mt-MB$=E zp@wd$=$s0RF556*&RnG)Z6tC=^I-M3YxV$}G)pOc#S3{o|SV6Mc@=@aGaEX?Jr*t;wmi^!C?}-aDwZ0QPE$H7tEZvBmGc z6lx>#f9m(9e;{Y=MX2K%W3rrNQa7g9k+tsGyLb_b#q;6u<6)N?M>suhP@E8yggaRlY!MIR#@W7 z(+#5+lT!MQuTKR-1j8A_iA)u@Ff`!E5e2m)Jut|~G*<4=Jpauoio;Y#X)`w0F*R5n)94>qGzJXU{Wl%&WrH+% zVB*L3$D)zM!1LJ;*Z%;}S_;erqs|-BcwtEh$eymcnN|!Upns)vptx-1xu;|Rd26ct ztRZHA9P*4PEMCCQMIBmpB5JdBoR4>+spG1aSEYWv906%C)pr{C<+D~^4_QtLjxAduAUkc z0^>I-(BrBIru-iz*hP;Gj<77!jDHR(&X58j(o6Z)s1V1DeMYgCMV=T1Ce@sC_Ha^? zs7%TcPp51VLfZz8I#BUNQ%^#X<%HVx^O6Y=A+qPk=8sajYfs{ZgpGq(3Ab zEn&fwFe-k`#;~ab%Qy4zn}CGmK4ks%N~uT*BNbW7xRmM}(3P5iB1sX_EPwq3ZDs^Z zCa6cQEg*`7RPf$XMVk2-1=v)}z}1nir5Qx7K<%g|Hn%jk11T5oWGuzlqo?P8GJ;5! zw5tqf9Ey^_gakY`NKU0Dxbbdc>JH_Ypb4m1q&b%>)k6F(%R5wMrZ?ZR4XIG+XB#L^ zDL*h6P^CJi2c)Q>i5aQ;hJX4>&r*YvaubdJq~3^vkrs6om5>tXIU zi~IyckrIJsL$5Z^-hY%U!F)7QlL{jJI8rK@9q8jx9hng959X;o%K#QymM)eOXBKiP zm=-Zt?ij5b6d6nvqmyY$1(k3QYpN@VrVMJzpT;>t;bCQm4Vh3aO`36V+;E;YsCp>S za=?65_pGdt_Y0_)0^nN6>fA5EW2^wB>*cgg4oIQ5xo`Y!1%DBM?(&9TAO0KQ*Mm4L zr`az+7|T85{>j1+oVA>upf}xL2*ftD9HEL{R zIH`ftyXTtpodN@N;$J<}5mwwAT{c(-rdBsXE>;HyNW>gfM^hnY3yU^&Hjfw18*s!# zh>Ixi)GvkO5-bRlDeE{SH{(Z=9xV}}=@fM<@_#UpG@8sukLes&kSSGj7PJzv00yK% z39EO3;8I+fBOzog3FMmgXiBltfW(FOl%SN*p*Ug6Qu5qFx2#>ywA?NNr6-m3pe<}` z!P>;8#g4^>rH4#!x4o7Y)XDa%Oo4+pcP25?P{96Nd$b<0U_xpzjwB_@Hb%e-2`YdQ z0e_^!Vy_rDfCCp1m&@m(FwAgmWn>s&VP&Rk(TULzOc7)`D0=Bkek?@2QVc+bdyV_$ zt%t`be7nf`a3JMH01jxU(+@j8_)#TA@GMkf5RK0sX(1bjz~A{8qu*zSSvi=fU2S^E zbn&Amim4s|lLRprp-pm2c}P}KZ8QWp27h`_%lxn6K8^}8o2-Fk01$Bmu1)>wnbq z21T4LhaW@0AsCgLt;eq@ty_R;#JcPkSe3@w

    c29kfjI~S3mw3oe3kP2^V^!1`c9C9gWd9$5@vP(28vZR*4sv z0tCiSDz678SFmbv^)H=csA<+ik5vjJ#XjR7ax!LzScssNCWfQRZo!;IkoNyYad4D} zOwV_bf(rA6wE5Zg&&18POg~ojrR|(fR#{z{s1X9+jEmA)Bb`Sfan)#d{eQ!t2r7a# zk56s;hFfWdoE5hO$q`wAbC7RE4w0Orh1s5M7z+MlqD_JdVG zU7(izgQE<6XHrr;PVa%xV}B8O<&!1gG7`-hzYPjJ$y*ay6f4#-_gqi8#Y}O&dC=D= zZwx>2aMZM_5)1tDeivgPJ`z7Ot9@ajDij_-viQ7%WVNZotSYs59mn}5Vau4 zJ`GIl01;KllNOS_rGNI6dO#2j5e}igWJr%|C2{{fmzO{Z`osKWKu+$=riU14AX%wX zq^p6j2G%6XuavOappShtIbPBns6@zQiB^eIO4ZX&*@+^R#U@#NRQ+@T8Oy{>qWL>y@Q3Vjo##vXf0~=DE2AxJXTNdUC#eWZFMkjUdH1i2k2&xf! z)=+A)HAyIH?(9rLbU6PJ0%ntin{w`6-LWGnQtszc%V&Wph%d4kj@SGGPS0_}fr&t$ z5)9(*gHy<=N;I%w!6oxNvh#rdPTEP$kvwspY?O(^I!I7Tz` zgILPL4QX;n?I|V}Zi-rXa|kASY$dgrbU2=hW)(xmARMML^Z65HDLO!PH|1 zozK}s2YDI7w)hdWF)*;i&$~UT!ZRqw3_vSqP6xz=92DB0{FlqUDb?#~vrN@vtVWS; z)2u_~R=Q&TFL9mFj{ykpqC#muG!0{0*q(tR2ka*6kraa!OH@`xC4#42#B!n58#1z_ zP$1Bt7Jn#0OkpUxJjmxQ|ENHIQJ+{QLs6GnJcescNVZW{fAxISJ^z_=4shSz~ zJby>@83+EDoCQ0M%h`xq3nfc$Z0e0k0c_1BiQgp! zs`8%CStc?`xB>QhBVUmt@$|wzaTbL{b%daBN8ajAXT<8eMcrgkX?Q4Ghb)8IQZKmJ z=tk6PWS5W(QNbrnKQLtMq&li{$vR^dNGV-B2T!ZAk%;|}l1LewYyl@{LgHr|w|~by zf+rlL-a+BRsjHGq)sC+rOgye>Ky?FSuI^Wq(pt<4TRk8!QcSe(C~NFuB2`QL&={ws6hbe|GU4M$gPFwFM5sRLRpD zaM2Y-$6XPuaocdVo;7L+t|(ATpGF$%iHahy2nHAnu_!jeKtzW)Gc1Au^9>t66r;!t z=h|c|0z5QC@bl5Ze6V2Vgdo5TLwdtmfOJ7}V{ln}BOxd-^3>K*CiIE$Gk=_wHpRY0 z{6PtqX2kh+wweD|=VT?=8;q^Wh&h3g+uXQJsGz}|XG@}AwthgMz|7~~qC1&GNx)xx z%IGzyYF+zZYCf$>z-KB7z_Ah0n~y42?Pb#VTsUtk|1ddPV!{Hrn9e=h{gTzw9XSYD4+|%wfW{VzD<*6cl(cfE8SYh;JAwrMS ziTE&R$C?X@J@yced@+t<7A}%QbExIM3zKs==^;X?pAmN9z4e=4#Cb1rK7@ndzg3An zzXLif73s^q2H1cV=W)x{d`@i7oR(8%Nduq`Z0vR5MW3e7S`bDeK7Yb^OgaV<3`l`~ z7|9AaA<|5^hN=yNHmm(*Ft3!+CS?~8KM3q<9XimF(Q+L^V=;NC#w;RLV^Rd-w;`>K zN`-QOc>ycP=*YOUGOZkuC&7c1W0o4U_}IN9oc8O|W*`o9S!0so6Z6NsJnzS!+mn;s`a9RE<~rg{<; zRU*H=(2HI^>_uO9Tpxc@!{Y>6J66j_rR~9s_9Z4Ea+T{3QyjRA3`CJaZ)?F2*kuG^ zqm&I5e}`2O2lSr{tt;I=q$q~613M7#SLA=psQpqVy64K53h zE%XbDA;V@ky4Jl;dTMe^cFj~r#Z%(!Y`ne=2p&69?|*!G0Js6-c|z$iEPrlcjn$u~ zi!CUkC(-y>3z+;pBwV@N;kHOBmW0`hsq*W zX%@BG?SIZ#NNUR(V~R84)AH^E6WdJ3(LLGaDkiOkBl*<_g;KTqeOXOlLfx1_L+__0 z+GzsV1a^e>v4dq;SQO}@49F`=>%z_2GogRIsBS?eqC=SR@&s07hq7zM6yt_ED8fWI z1+%<|9Ok~I3;?;b%Nth<6=;KlqYj49KW%vQ1b=BIdWhdMgf|G~J}}rO19(3;)6>8j zD+|LcVL}1JE8p|g#(x3QSjQvxx1o-{&WRCqM1L82;2ziplMpu|XJ9xanm}p{U?4CO z3vz*d9D$qK(StE?t>Hw8<;Ft1ceBqx!05$X=~$Q++I$Y2)GHKo^>ukiGB=%QVm82N zlYf!f@;MlxqNykuKVu@iZkomB&K*jw#+q|BB1L+Ah&gqnnqL~YEHP7XU5Pbl($SZf zOouD8!QB}UyaJ00Gr;94=?c81$1xDZjbefp6c-DOndCqTs8A1mkI)$-W7dw11hLH) ztqWr;$Hk@%0wUbnH$B0`BF)kQ$Bg0-^nWAQ(2b7CVZyo8h$p1v$HD;yMbW_4%9kt< zCH3=Cgr$aUHPjVg~xUPCI;}s%X*7TB+z3Vv9YbaW(EKV@Ip1F zcv;6R5$Ikd&&op5Xjkkv5uB+};$dmg({})nE@#F2$?%2K&Gwn&(d3--vrzqdE`RPc z0f}Jo+uzU%3q$S2xyCKr0uZ>ysKuC6yf%B_EK{j52KU^c0csWiT(~WKQ&=nK+!UIf z8S=U8?TLF=>!yvhq5LO+eR~M@P5L3%lA(ik6yrW+U}UITc9|F&Wvy(rOSOd7pGLQzS^)59g21~oc~P2?qPa;_rjtc7k@_mVZq9v zuQNmqZK2Xnoj69pktwbzlT-`*@*w7J?$Zlkz8)q7m45QZ)~0DDTVJtm!+N5~oxw#M z+F(>#I>G=6U{FrN4D8k^wNG;4B40J#sRCWS`B>rGw)eD){S+L9*Y5CCt`59b)JGxpDf(J@aRa-#-FHiuZsMblCLw_Qcee1b2 ze>(TK=ZF{XL@p?>TkJ$1Flc;L`T5=20Prx5wOOC03x|0NSRy0C+<#A3QhPQ++==B> zfr)&02_M5pv#3XbZ3Z$>PEg=I8vhH19Ed;F{@~c1KJs26L({KRCXzO$$90M5)6YEmHHi3^M9@GO2YuL($x!5i)6s@ zWGR?FY~GjZv8WtEIxM5nY{}9GLP!e1AU7mL>`+NkISnHeDsf3I3=0UCdTRqae{HfQ zhp7x~jic~$cVKhUGy+>yHdf6UVxSmgA7VqO7!;fpWH`%t7Fg6q(me2i=XA(EUNugB z${7xfH%v0N%zuJrxxwNL3*N}tPKuyM$)tE2O2p}|GgiWz2>Gla4lj1P@)0>j{$wp^ zFhxx39i@VWFxb!{3}{L7?>O4K)mWq?3sR@WHVRUs7Rrx&;CUnzqn!6>2l2}VtB9hS z4H$II@3qew=#|W2$4auxBvjE3l-dE%-Xi&+55lUCkALoVK%(1?HW9~`krL^feAH)} zGxZO0eWLk6ch8vDtG8dy|% zmw!ETq6hNZsUCyMYGIzd@(25I^hHyUwq;)pIN`KfxxrxT52NfeoTfdI%Q#Jt`1|o! z0^fqE6Y8+d7z~6q|AFI)3opw6bQWuMx!`U2cmB_vXL;{@=z@l}loyGt4r(x}wzX9g zp&Pz^dOQyxWyq#(&A4X}QFYPN0Tqwl5`V1$ivbQIs+7J3LxWC71&)_s27b1VTYmvu z@YShwbxjW#rGmLAm2ad!ZgokB}&a7R-K$-`H>=99i z$WYC`vj*r_Tl8HvPIK@u1`I`rocqJ=8fxK0mE)O05Zl$gX!;UmZx_@>1 zKI44&LBT-PQM!g97=qIZvI>K~*2H9|SrxAqf^EUITN4#R+6E5TG$8npJm3!fRZ zH-(2u=jIpDV$fZB7Z*t|x&K6E0lb(3cNfJNY8IM!GEs~_yW3qxM6d=4qR?D9)gfu( zQSUnoNLUaZGmes_oDmFy+ff7bPM{WQqt$Lv*~R*lbBNbT4o^hu1`H^NEPuQ{=mMfN z(UGAH&IC&oqBKsoIhJYCZfrJ%A};H+%({dwsup9dBqfd;LQf`LIVuqKH(_8->A^Ey z?9ZscL?g-0C@H;jTIH9UGV2|`8&e&-HD+V6l$=4ve zV^C)%Hx#jrxC^4{G6>9MYA!y)dPObsUH}AF;fq%KmaopSiGnes56)r9T z!U=*BR0wu!)8}1EsOJ>@#Nc*)N7C3LWMslir%9R)km@um_}i}(L^ZQf2X`jI0(TAx zM@e|=0EQywtR}naEqcB%;I3s4!Zw5vmMU}@aKt}1N&Qo+n14@A3xEEd&wG>SWN7b` zb@R9>okdr$H#%+(;wyp!MIr)z@yRPH9(p$s!B|q?B^VewFTkxw7fMn9>wh#W5H7{0>?&P$VN;Qm=&{0v z>dr^-;Qatld0WHxyZpTi@reNn@$#%cLUlr zAXnU2oKWhdoY?^192d@rGk-dPNGJwMYUes%5q~8{H9~Vd9hQX!Av#S#Wri|D17L_h z732*n-T8lYb;k}9bPWK4kz(Eev>uhV{zAc<+N10Icsc za(^P>qbOu9sIgGf02F{0+g;!Z&x#*(gakBd&$> z)P?;aT>-cgxZ%MR;8PONAc^(@dGUxaCVzc4^Sd`#aQ{&emVPTl7V1S5PN+-40GPQ? z23JpxO?Rt)Mf_0c%k55U!$)RxU^78shxS}3Iv%5oIavMknP04_CdBzwp2kbi7S zV|)o5^ne8lJNcS$+<;OW@o?0zcAjF(jsWS4rv|shvYMvk;In%T!NYKV+I3|9w3rzo z;ce?ZI{-xE>jzTaIjeYfH7i?gnGhtPu|PamFx&!lY&T|*VY1^_&! zXr8f6tBl#cS>9^aziS;68S6+%XDiLLTY|B~n*z{1Z7lPaaBIokVuO{7H-DdG3U;{n zx*>56RCINSYhTL>jS2WWoaKkvOw;s*rfGLn!9o$C@rl7!H07`jt=~ArMa>Am+Ek)m zrw!8@7v2;s)5r?GsT&Fdd6JB78w$poMj^ak$^bWJ`>qaZ8ueg~cDU;_6eP7I0LBZT zTy6a5Ni_8Dn)J#GU~AKsmwz{CIncbqB$|fsfna+S*k({r376KRG@Y>01nv~u4l;;8 z>Lpz#L-3&=t`1NfB8(@hin4VZ@3e7mf{cDS?OovuKcKk$zih8WY{8objqUK^)#0U~gS>usdUgfD(VM>{Fld4F-^9nymZuQ`lI zUa5}c{H|w6>t2D!hVBKyor>0k8&}EvEJ*`HU!*Iq=BchKu8`-DypC+V1V)twebRCa z8uSknwt~$@{18N`Qz0$(r$r~f!h*B$_``79Dp;0K{-kO?=}dH3EGOlG#!wD?F+?HY zl_~-!>50*W0Zt{!rGKkb1|M&FuY-^sm+TQ`N_iOw1YwUoVg%>lT_cnkRiwG}g`?U; z8gRGac`cxf=<6%uGezn!a;3+Z#S zy(0~C%{$O1Yl$EaLl*~vHj|_S08o5;xKv2)MaDTwe0d&4k|cY?!E=mAMfYo*2})PR zPQp~;8vLr20rEV8;h|Rv7#@aR)en}9^P-qEC#jRc0FGL|>kWv4@`=N;!2${~o*IC% zz`r##6iCJIrGGu(`a0u_bZlYG@b-~COgIEH`9Kri zkO(?6HGi?8U^vMa92b7*+NuZ`Koo8VCGZq&U?l={3{p_RIz4M8;zAJ(#1q#5Y^K{} z9i{2|Mz6=5>ar}HxnK5+(FH2wpRa#y_3;85&#WsucSRPR-0}A4NEIES*R1ThNsjQk z0~n4d{@+93_(8w>Q$@xHn9FVWaz#@fwmLx;_&xFwF;J3CK)-4>6`w!2sUCbSqiP+B2}&bai1NPa2=>GV=Tf^;=g(K@g5o zM^p-CGpmBAZcO68=nOP}fXKdlMi94Bw1NAp`L) zT(HeR1_!$4R;FTgT@J3TuEfewrU+0T0{qqjQkAsDVap` zYOi>IC&NEvO*l_{?6;0^BNbykdmI0PoQVYnf^!RfWK1l&GHXTpH%yOdMoVt5lir|k-uAxQ)4$mGERXV1v)S97t5xvP>~&- z>g>g6#3ab=+8DfI?i(1HB7dsrz!Kveqt1<~@_U2?5wmQhe}KrxUpONA_(CeeH`mks zRdBOf66{>(h5wAD)>uDP7H36u_(5!%6;P`$j5o~r;+^O0?yjHH7L+{E(k06{a+ITl zqNVn~R)Y_`@lO;QE%h$|$J2=p>la1{odV)<(y!e|Z$j0AI~3@30DoM^9ZGN?Nis;m zhf!A=UqaYf6$80FEdRFc%)<`8IpM=`o2{uFI1EB|p<~xJ%tb^g_h^#n?*Z4-EjSnK z3H2@DFwrz$u@a!fmPN&$GOG9^siy&YGE}~PU$((#aBM_YzuPrB^x2X&YFFcyh+Fkb zUtOFZ!led~_3uYOGJm@md{%26cG<}0WpeBUtILp3bQmBcMa%_lM4&|}r)ILs!fj$_ z*qL zfD&-TY*nDuuuwm(c9ckkA0Mat8N_ASD(p&DmWbY+1DdL0`g#+dSmX^%W914{Vl`JAV zYq#<-4*Oo7%7Ar|goy2pFaP*Ds;)TrV`88Adu5Q1isf*7oL>psC1#&d8y>FZbg%_6 zB{IMo42@qArPh%2>okBRUh>3_rxfZ?(1;nZkG7$_MSnd2<-6919x%I zH_qiZxl`A!nKa@YNQZh2#)FiceFew;XH;I9XU@KI!@v!aq%h7D8#BQ;x+WJvg z;xp=pMt^yvr%hBy2e-Ks^A-Z34O%qTUABD+=_t^sNrBqNEn>{Smd8=lN+^H zeg1dXMp;?`4vkm=O{C(?0$r6(a6gpen2|BGzklEiiU7j6;0U_9rrQ}U!@y-#mjm}! zpPWB!oZ&NS5aEVzspknreck79tOUp240G5f$J^ZPd4jusm zNQfXOK#CtFKm-9E)dmjinlrb7B|STWUL{uh$o`dLF8-2O%=RQNPT7B@9o(xoSq(Bs z4u2mL2)qm3b(t6l{ke_0knV>U^hs%DjvCsOSEYy0nxqUYfyS<4Dfvmu7B~b0H4;nI z`t72YBq;&wl$9k(k`DK{#pd}7yWT<-82kgGlNm2rC4>T3M zN|GcNCv16D0QEXM*pv>F9vFeU@;`lRG=F{HEpK7S^w(rIn;W4gkNg8`4hnw86`6W) z+biMhne1wYmNyU#8f3+gb>pNG1{$852|M>poWd&LOoFd>>&QC>tRFDYWPRwx6jV_- zwj~u4QVBtJsq_uhU1!L;B<{!@8o|eL5Sdsz*1@N@b-FX%f9j8AUoWJ#0)-rQm497X z&vaFI8Z-w2&0bd8+n*l%(b2)h%08}%=t`K{%qvuiobOGl$i4$veinz zYX!h|Tw=YpU#x?A_iO z6@lCXR(hc=T#R~Yo?Re_-3li`|8Rc;+=lVX^CB+Gf7`Fo^mO!dkE>Ij2foh;T9 z0cgq)c5eey7;;0sH=3Pjs!(&xbZ-@GYA7&l6av|78g9bG0RY`n%t?NQFit>26!yMa zLsKSI)HmEd6)_jC5{8}nQGc>WV{O&0Y-0*FO<)HZQRFxf-KYT*B81+(3IXod{~~cZOR~S4#k*4z zys97wJNCZBsrDdXHR4JqvEpFm*udV2DnYVD!+^l23(bsZpHF{@Ab*2qX=r@8>a0lh z5ku%|w0OXXCbvLRB{c2=T_#m?QVJ}oLpe63$`Pe~sRm*h>f#(lnbw4;5{*toSJqfn z1p>pQa(2hNf&F*-rSiolaEumVPMsEKT%Ot`anR=Z*-;I|7GB*Vm)^&DsL*JNgGtJO zP_%VbvARO6C2WDR)qm;zsK#oznIDu;Mjgm2)MzqlbsUU%axQph-Us!SFlMk$Rd}AI z`>cyfaP!4WkS=!UvaZ{>Pa<{$pqzonoxw49N4d!nbS&t!1+wZyA$wadU+F6md#h*q?&CfdaObK)u#Mzj&n0dw(b8_~RZ>Cy)tb0E=?r zr_juZ>5hg^>O$3F_D3Hjm&JU{mK67;XNaoTRFS*U%)Ax(U#>#rxJ_HNe^^{a;|4fZ zKq5o)H$(-QhJN zH8Pg}s{*Yl#8B5-sgJHb9k1}C_`@gb58jlMkr3Rore;h)oRr_7bkt=dZJOi^5s1k` zGD0*Dvc?4X_W1VVamrYfY!MG?AYp~G;e;(b*XH>?C4b@-$43;Euv~!=8W`_be)FDr zw^=}6ok2NoL4;^M6v#?CB{VU%Q*U}XbaP5*5lnDVStW42r#xbb2Xr84)BLdH^R)DM zh?d%wDh0*MhlgF69vQ6g*5=XxSl&h~SrMFQuUt!=#X|jumpU`L(8pHx2d_p4vc~5P zcWlsFG=HV51Peg8MdUe52807srWtM)I9~~Hs(Jt})+-&{$2EQ!diM%qHfwEpx=*vZ zsKn!N49-j`Ym@bAdyZ7928#;!9Wt8DpsyvFo3TtlOBqWqN=p#RQ2z=uYRstaVY<;( z+-vm!^pMHgzrd>d?={EOQ8+oRlTZGRXJqh{f6prs6NzS2J~9-HEaZGlv( z*nZA6;H;tLhsH`;Z2H+n29Yl|E$D{M4;2TNY}2@D1=tA-gct3@onbEKKyE2@c6vdbRd zb$?-?7pOeZ{v2B4>J|iuv`W&qp}kdA$e-?~NBWh)aJhVPietZbl;bN=uBQ_!9LnQY zDSnpkhd;mJIPyvuFAE@b?xDvs>ifP&Y?M zE7792eZ_rRDBa@e#7q7lIw>g$Z{xZNl2L&)65!yM0|d+eWdA-q2KP)4*^9Xpq<_6C zv%-sM-Mv7s6NDF#Skd-hCB6VAsnKKuP{o(w-K{x0g2;xzeQ+^C4Dv66o27MSxdpRe z?^1*ASHK`QN{*NJU?AdCWQXyq)7H~q;PtETM7V{LG5J_$d;2k6QsX}TVU2j~`JucC zt`X5w0#tichY5#&g&6O%u@M7ByMJl100O)ReWeMOQHUNdA&O1&$ik}~WL}uU45AZc z5U*J;mDTS=#8VLLaD!eNEGMXL;kr`1@G?S?&-gHcn&mn$9kfc#B9%Ad(+ytRAHq~B z=Bij)p3QN3d0!dfUf)pE$h&9J-39-}H{}a`bPgHxkkF-Jc7GPOWffVy z@jpTL_wBtDCSHT5R7#fNz*+ivkVf3W;&KfvjIUS$M1dd-CRFheat$b5$uI$C6ka*p`(^XqsDS|5*co=1ca;qY?*he+Q z<~4uqg8NtO6%5&r{nsoQ%6|dN#Z9yuAMvYXv>WzYT8c)Bnj87f?yBu6daNN^TB@G- z6)-6^P<|$Mqg8td8re(AFmYYJvc|Au08!!Vl0c8i!Fy2w1oR-B^OqNU&9GMx+9 z{O@7;e%v{~wQ$A(Yj?FZ2-h);oU|1H!lIG6q_)KZMkG4}aEyQPo~WBKMy&~t^L4-z z<|)+z5EYC4sx^0IDu0p1t*qvUXpM?%yvDUXS`dC-7_%`VkA57iL=G6NP*J4$kBSpf zEF$&^;RAO-M42BdF#zIq`WBVNmvvf+)5d%7^MOX2mcce4S@&q)I+n??VW3d8jLkWb zl|m6a*76CD<-=t0Y&bxPo11K}wruSOxze4vyU8bEfpDu&>VJi$5rg4w+T-AzVEpm} zhHZf7prf#gzVtK_%d=eAy*4*AH&o2vNOu4@R|38IUC{$9EgC&lSs?WnfTnAN-{dg)A(4v!S*iTS6d*CL`@6|Z+!?~K6Z3?A{_VtEfFD{b| z^l1&jfFAjCO`cnp5IqHhC^C9ta4Z#8?n%-JEKUXk%C)XejjKXJiJ}b2WL|^UI6HnA zw_d1>B!6ocxOP;iRx}Dp1@%B=(3ex}E3AnO3D&gv+OCyW>Quf~^z*x<@m-9zqzh^V-kny)4~v(P7~%EGbi*4v*zBKXFuE}`X~{NowY zxp_y`FxC~T>V5DP#(*dV6q43vqnzoX72BQPoHkleuV2 zIerbrVbr2hf%A?z;-W2#{H=sZNOjaBj7$N+ka$2&GlUQ3+3Uu>phPeoRF8rSS8$9@ zXMe>A4kOUND8mMbq4LoGP@`dih_}`dbbksqZTpA(Vtwp%TU9mEKxWstlKirIQ9Rk_ zd){EfIO?(&h+K2PJ3V*JfyQ1KoB7>feJeqXVlHQVIg7lAlJ><8?6Pkz-stW<7NQd}~xiNncwk zlm>RHYrAoLbaPW!)Mg}#h~WyFw}r|NmKp94*Pvb&WlVQ?1uIB<;5%00uyH8zj(=LW ztr20QO2+U-R*X=W*dZ-PUX&b)gBf8~{I6A4Ww`PES^~8WiXWG3x_@8?01a^=e&3fk z;-kZFRY##~R5bs&e;Tljf51-vR;z0x)|aORiICJJAaq*=|;-kO=nsDE)2y9>vW9pVvlRC)an8H+ANER zgx9k&@R!VyAS?Q&J12&(!C-8Hk-QqDoVls5B$_BeHDFZNQdlr3=M24ZH=-!*d~wMq znX8I~a4{}FuBzBhW*Rl+z*-9iKDa5YvP#?+>iJdO!oc;q#)53SUj@th1%Lfp5dc6( zhPwD>Ry`9n;!x12T_TDuRSJ_82ig=F*_$IM3bDgGf(&(Ajot$-$^>HlTKxm7VMfCX zse3p61vBVo`5bDlLs`}>AZ*%&f?V`>a#=^OStp!6sNB>zevaj{@}6~&O)I5&ZUY35V} z58dU9R0$DdNJsI8Z){yXVj;#<>9t;u0BF!(3*l;91k zGWGqmBI333>08o0J51MDZj2L{3aR}$z~0hEt;r~z{=8lLB3CDWbv;eMLpXB(qaYP6 z$Sa#HVDl1ye*|q%F3KubpoD-B!h~y=8K5%64Y8M^w7eu=E39>G_*gR&8TVxf{s)Ue zr2Mq0b&48Mdvj{DWq&bm%Dm-1lm!G>{l~r{`vC|BOAX(m(8TVr-AaN@%c+;l3o=Cf zE12%!Z(|+0NI6!1ww`*sDj@FzZN%1N#q27b+(S(C2eE=noM56a6v7uq=>zaVS;L%d zmCY8q_o$!;6D8~i=>LjH6jCBaIgK>9at+>tnt>o8;(83!lz(^(#O#>9T=*XgpFOn& zFsu~orJ!BNC|42FIMz|!Sv)-oO5xSt6N!jZcSI}hB%lwNs(iahW||E9!hBgDNRk=$ zk?FG1so*aXrRI;D`b`SvU4KXkdvJ1?4iHQ0&HZj%eaK(vN=2`{ zLg9gH`ZBaTVd@Q(%OTijADjYa)Hb_^MP_1558myKLB=BKfCw^!tGd#fAcKX~=YtvQ z03gXxgtR~M^u9~>?CIaTTEQ)WHD4Vw069R$zxo)>R{>;CUKM|e9+r!p=mZ*pTY*W{ zBp%oSqv}`aI_5qlWk8% zGzQhAIP%Rj06BlJ`vGd`)8)`L{iS;(yAZ67teJRN+P7M>&ZblWsZj2>wfd24W8ZBE zaqStM`>O!=cW90~|?3DudX9m)7okSnTR&md=9qD8qpI>^AtoUjObUA;B%)%-491={#!RsgK8 z;3sW?^IhB`2L^s|Fnsu>iBYW@a$#n;d4FUOU{cS8Z#O)vP_O62nsP-^Lmj!+waZl7 z07_SZB)WfJ{mR|&Ytcptcy%^1GM(8tFj2vn5)QF4vtbyP3y%!mob=Y!G1lq@t`6R9 zQO$+BD?$!J$(`)xDAGwktQBAdw%BS!5OGbyn##n^*%G&8I_YQ5rh3+ugz32@wtVbF ziv?HbW2HOhc=R&=Nf}t;B4Ozo#7aSC;A6izp{jo}JY&U+c~fSJC$>+MNFGp>Kes|X z(WX8aJ>B}p=c2~W;4Q(&Y)=?Qh#H^02$a~UiW3h@_6!#YgH?w0*F1BJ(Yu1(@e|^s z0r|%?rXUlJo9;>Yk08l{ybgE5(NGtamX;OPO812i6`?bX5Ie4b6;}bXEa#1nBIB40 z?!bSpMcxu>X*djS5#${~jzEs#giFnU0H-JqviL>bwZMn>7(9#6c>z$k_9@5;DvIl{ z4pgNq<-0msg&KT=6xq&KQ6@nE7F3+ju>xgKc7;R(do*yxaWr%DA{jD#^sod^bIcjn zx}bJjROPO%BRJMfKFp1``TpJ&<|f{mr6zw+s#s#rt%v!e)zu`1mx_dRU1lkofn(ha zT9i2Bs@;eR08d}Uvk9~eN zUF=aZeUS+0*(T?;klRWxc2SlP&_U@*kUMo2wr$LaIsWV#7dD}wsoMfn?NvR5%{G6! zF^g6x;TI&byM5NC`-9M3E~w($QXHl^r0|iC{w)Ni@wSFFVm(y)4u=nZDPW5OM52Vd zADt0!n1uJKJ6+g|*eLIk#{{`~M)-RLefQ#>uP}6d7E2Bd%fwZD^W@MFUo&7Abc{!B zZ8&uwDBIa$BWGZBp<)cKSlz2}?QDOs?Qwey`;fNB8?8~Te~I?Eiosl?+2exO*@rA0 zXLW3Ek4C3bp$rtIBlPwbzfsNfZ5%O{YCn$6c`m$4kHEch(&8<2#7$%*Apq|F;ds@Z=>C6Jdy+8em=nHgK+*VLh~qbuC-;;0d=1g_@68pJXwXK9~JhU&rc+M`0!nt}|x8NKajb zd4Q0-&efZ)Bx2G^FRX>u}QJ=UrMDK%&}TEaMO7y!s207@-NFhS-I zOCm=8rh9c0I;C4kyRoo1OWzLp)24rkN-7f!HH9D$m^E~}f;NAzVwDG?AVyt_HD|67 z^<?!_Bx8eO4#HGPcF@B0t^vvz#R*A0wDX1r4`<>?4uAY z`Y$^zaih>T^`wEM!1jz&7MwQDN~JUcS&er;TDXWkmABWW7jIVS?`g z+0gEc8j!brgsdsQ(t{mcrDvwxI_u7)x^pjQT{y(Yss{LPXQk z$GWM=RAebDv}+0!i`LY%L2cs?GbL@fp!{H%GL2F1+ZZWh-V$^bUjgK_hK)y^46=}t zT(GM_nQ54LVPPT)#dLHz)D%Kl_>Q76Pt1`0)hR3qy%hWo zqZIwG_3?ko?=K2a+>sF{-dTioO-l&f2?K`CH+pYyX<_7R><19ez&n~I2TasUc613M zk)~-48-TkywBK4fscE}h#-#373{_G%r4_!h?gfQSNbbe-Qn;oG54guVjh2j+cN(Yz zL;9emny>E&ERv+!!Qu3}eSWsutL%%ri*|ug&L-3d_;($}Q;pDvH3uwmt)m&>|@=6cR(}AOwo5d_A-3DN;#}?%pwN109&obb%xR zNkD%Gfd_#z4jPaIfpdZD=L53|8Q{tJzg>gPeWf&)u-&wyB;G}Xfph2J^H3xd!T*En zgDQETk>?}5eImwpg{N}xf5%^Iu>&;2UJzv4NEy2eouwa!D1yRE1B!h$;)sF>1<3he zh=M5kzZK%eQ3N7z;}) z>PrsvTd3Otsw>apuHel+bMp7^M24Qx$x7m*{W+wjq4BoMhuttR+yK8Dlcu1w-l{od zY55E^hymj)I9e<5txSnYRi(}E8i;kHfwh(e&8xY6yp?RJ8w(4-+JeQldEI|^`e6d0 ziya{(oxJy|h1Tc{GEu1&Yr975qS9wLz&*cU^mPc|F1KlB&J7IP{1<5`a+buR9XR|| zt=wnLppHemGRTBk@HE!@IL03`C=m4g%gdPuN+01aXsP980Kv9e+Q1^?`k%io{%C{A zn7Z}GRx>Q-y(_tk(n|Ui1*(6oBfg$A9T?ytX7lp%?e4$h@qzhZdgiC-00V;Lr|;?a z_fti7)1q$><%dtwDMA9Y*%fxwt`c14aD|NVc{12iF1cs5@#o23ngDC4$BOQ>S`B+9AevR42R$&@~9Nw4H(-^=c1V}zG zFfwOpKPyl$7{`6XIZA&eTEDG3i%nMlkz!02#N3-t!-(`%U|dd@1N=C$epZICclS`sm`%$<_@`KE z)_xf7D!eTByJ^+nXJ2bp5^fT~3C(j1O1xU!E0jb`c{em*@I8OU_A3?@tH&oMSs)Z_ zH zw43L5DKFp`_O8%zuzVm`F~G-hTBY>&=kHcr6!$7Zifj-19}Gw@g9s8m-7tj|&u3l2 z&K1-Lgci9rTkn5120?8g15|sh26=ZiXm@FJp{Fc9DawE@h-jL?P?h;|)Cl$4MJpu0 z$)zKtLe!CgE9CIc?9#om3{r^G!|D}R#cE0M-|C_67)$J=t|yeeD(1W)u9kIa-OoNr z(5d(JCAESh6unx*Fx2~*Vlb&h^3&ZJWHER*fTkv3k>U#f(BTq%HNfj)UU*-9Vnl27qa3c=*P+k7tih=Grp9@E`3Iw@**1(!kTf!KYXN^oCoA{40}KR?l?);>Bs3J+;50fD zKknjC3OJY1m^8S`X|NP2M!_jkt7vanvcxoA#&L7OE8zd&5UB6zi_rOEX4hPLM)%bs z2$R2$Zk3fP%Be766^;~P)fvqybHU`Gj=JJ+OCOF>ygX}#HS`R2$;+2pd`q>9*QiHb$C;u$HRL}NwYABAuk(?=cu^2R5=ZF z>kzt8Bqjz0el+3H$38qNP_qHjvkzDfz13o2bzV0N3$1*xX?YQOU|Drcc1_^CiTLC; z%%F0LT(lIFk_Y?s4Th!?BZ^KH46nef_D_H6%VSjiCC~KEHJZo-{j}j*58x^(dj`H| zgf_IUGp@fk#a;nIl5MPpB4yxuFY8T8;H~tZwA{V12~c6B@w;((Z!*)`NAsYfBGBM>@kOP~0lVlFH`&EBm zE7^PlFB;Uheh&@HTMH<||GwO->#E#n1dJUX)ANDe%F7YsLLrZy+|EPTLg@=J2u;xT z+xOMr*L~Xn6`+}g=(ecq-}{+)VTRP7?i6IjI}RsU7dJS)P8a{8K+-K-+&NbuNeXd? zG_wYm>!){)0!l4l;2QHG&*C5Aam#;0M4j{1+O1X7vb}qw($Tfo0(Z~Pxm0IV;#`NT z-~}}MDw+G%FZz4l`});fzz;lucgpmz!c{x4br1+5MC_!l4b6bbtD9L@GTw@c<@=u0 z?h@bb&{`iall=&-b&X|Fx9IUkgw*l#M)h}_zVm(XI@vCIEmaJ9F8ry#wo}ZRvU$ihEXzdwY4Z^_VPh2DxQRo+Om|#=gQIVA{ zuWAe#=JZVJdz(MUzaY*W)r(teV?i{=`&&Zll}(vM_%o3#AyvchrY95pgdobsrwJcp z1ERQf+$JjMRdPlnu$#8r$?1yD)JjG{J6B1INhm>{`1C%3t@xUW=G%Xf{MGclM6S5x zSS{S!ZU2qp<5gi8QL2?~yzJ8oQ9yll6Q*#H{I+(^cV9(~r+iaWZ|pX!DycqK+@DEq zVpK|oZK!3{XvNM&%k#V0;@G(U5fwEKOS>AawIzMjWUsDBuQIc7q$W;U5 zRf?+m*WjnCETLH3SN%e;3V4^(af%59wS-~C`qXS+lIypPFAb-W0vG?e z8^YfgMI+Rl781+ODL^e2C^$C|BytoovYv0s znYq9rzcP+ziv~VCJ(^>ZXf_|L?42`b(dxkL3ejuN%Ikm2gI2?N34CY1oj`X7CCLH6 z;j0!IBCOb~Sn4V~9axiE)^Su;XB!{?*tU%UgS_^w7G5^XO&A(4Q9|L7Aa5is-SL;f zydz<|7GcG9203wE&Ph1yN0o+iwI49{7%)Dkq_R#Yzw7R$3KkP=z>Ri`ALD zPkY0Q%ME|mjZdix!v-@4D|Qcf%pDDEep%esae)ouHR|b8Ij3M%#N`%jz{gv$Szt~oN z2s0e2)mUP=9tBNtiMzrf-yx&BGWEJu)~d+rvbuk@6`-Rfplhcrr`N6^tFo>B^Z2o@ zJd}!e9*BYQUwz`v(O_mU!}V2FG7t=L9cEFI+l&p6kTl6eN@YkiZj`=5a>{s0ZUihQ zxfv&9wFO1Q34qjxb)7R^tAY!woK;{{@gNeC>%X3{YwYKF-(Kil*z4Ig>n{B)>jo+< zxgmd`;kiY;O)$r~O%M>Rwu{Iq`{9f>cMGW*87_IR!Yzgyjt3Vab`7svVPZHLq38?; zzFPbrjMHBquL5b-rWk;#x`lTIc9v0%yr_wQ+4}>U;ROnCO9f1GFe*4~fYnhL@qh*X z*^7fLO-ydJquG~0tav{Zv#(UM)|n6QkM)15lhiN}L|JOWb60ri(d=JaF)ItZ4m4cs zr{K%^R}xGLh|{04_R20d?2HK@{$E4|7Lkj3Gg-S1Q0)(Yx}@i>#I-wtv4N$@&6y3a z9OA#IT8^gi9V5b-kNaD9yJXLJs@|*snx|mUFZlm?`i^Wpd6rpRHr~7M82TYt0;d(W!_ zun7h@l>R}3@9qi)jKOeKI;M>}*~5PoibuAwk?&k*b-&b*^o0p;h?zitN#N|p*yeLP$4l#w5jS9P#pjrNRjuir;2J{0iaA>3$B@XKJo=ct{yvU zx2l8gsN7ISj?ZeWh$0oCh2`ix%|%Hs+PHr-NW50 znTW`0gwJZ@shFfXwfBq~qk(^7N|I{T_2Kh6Rk>A3tL)VQ4^DxgNoSCqr029F!@;`` zSu%{ebkQil?(`pZ6`u5xTC`Ot^!$=js31w#aPhk;CQk?1f8m3jP;@tsUq?Dtm*uxQkeXNt8 zw4lZ^p8aPLPNJrPnPyQKxj~d3^>?-Xf{VYRenH(xH+p* zXeAsbUN~YIzivss1ss2TcwXJ_5v-F|x$soAm)v8D#HHxG(AS7hQHRQC;;ra7I!Q{c zwLmXaSsdzw1qulU`;AP5qb(jXfqg!y0-;^8oA~!ZfUt zCN~OJ75c%;maYTZ&UGr{^j0_cmkTn-$-1n9C22@%vtky?Mf8)M3VZZ1Ni6R$&r zhNw1omi}gy53G$Dw>PsxW@PvvG9>Y@H5!W%a)hYzq2ptVM0>5P5htQpFd;1JHfXsw zIe{tTnE0B+GTOf9;2iT|W?k51Qgt0o^0~I}?y)$$4k@-k-W;2WR+q9lKwun7)wa>F z*4|>pNZHWzvOw!F2j?BuW zs3yTeuoii86rkbCL(YyC5l;AkhJQz0%Z=iYjk`jgn>W-Qistvq|97(a zsS2nRV^05TLgcU$v%$~QBkxl^pSzq0jC5l7dgws3Qdf2j`@My#@|5HLRk6iHDrnM+ z5vU%DkgiH&zoJCBqNly}36^gl1TyUFh^C>^&S-!4QpxHsjT}1ccynCP(20$3T2&`t z`GxakeNaFjI?Zou^#|tys5+q7SHT=;ixgGE`QjOOb;zS*)Nj$DIxsjm?kuQjS!I1u zp^JGJ&x}b#xURXEDQ!%xSx$*kws&C;dyo@_g{gjOzc|4tu_1C{3RN6yqM&~Pu)d{< zJm7y24oPS&>)yo#J#t9)MZN(lbRN9?3vhfj88E<6h61K} z!->|2vjiJ~lFi#Xs3zzkyQl$+n&1{T9Lx3S%-RnekG|TH4cB2QCOnFJ#KOWGHD{Ba z2`{T51WSXgYxJS@Tk>O#b^EPrOd?1>V4HuYeTHwMJE|8zHT410S4;b8UjU@IdixoJ*GbW21q{}-+>TNql zkZfb2B3P?-Z+%d-i@D(&99n|fFOe!RFRvWw{E%jjR&rwzvF{7@6w~9Sg^-17VPAiA zuo$(ag?)KvXqLmKHJ+Yqo5z0(@8oK$0Zic<*Q@CNp#7{NE709aMjWiaD0We*aEDHM z+ca7^_3AT9fla{?b%LUBS&S1gLJ3uy^8X#DQCmZ%>0TEiJ5?xFLkp_W>;zYi7o++3 zLtQp{`*!DT<*|36Eb*Z@`Vs6g*X)09>2Ll%!mA)Y*8zbMQm~jRLD)NlT$6 z_jG%i>o3AYB4<4a_NAX8feL0#=96opmZls(+EuOWqO(RqNA3;HqR$)BrmE4x_j$ip8D9B3Y~@t~34XVrg?Vet&)#JjH!YgNXDwi4R`l>M513EA!3L+A8UUBT1EAPl7C^;Yqt~_X&gQ=0zh(IyytR%(UNYQ$`n=Y zVEq>_1}0ETB<4g9Vi@7?!~hAk6D9iB)nNx~0R6s7iV5x|#h&lIFE;h&lB*OTAk>Iw z_681l>nR3)zdkQ_VEI|UunY%)Cx-(Z{HQ)NR;#Ue-Sl9*rwe2TL>zyTyaOzcdPj>B zDZ6cPJu!M)ezc%*xmE|hLz5albma?6nUH4l!wmo079S+V5?cTsPa(< zMl7JuUw~qegQEd$*c^Xp`nGXCqzL$qx)}lS{i}8%YR9@TFpZ-95xrJ5LrYd~&bvQY zn44sjbgASMGbjv}{-l9vLhR5ofyd|>`KS?2eS7A==~xxH=lo*4V%2*n8$I8!O8hVD zT|fKe$r2!1M5QD0fw|-R`bvc5HrW(Mrm%<$vBbp2>I9}16Q6(Y*W)1|iXiM=CR)_w z%7y=MnFiJJCShuAtFJ(<5h|gj4RVOs4on6$Si<$u0Hk}a{JC`~ypAa9y7MD6AOFie z0ZCJgsg{^UnKngV`F@!R3KA7^di$5b-J>+?!ov2+LKx_qN=imk*yye-?B=9i1&2zg zuXhTKPNjg8XyWVg;EjhxdQV3S6=!V^M-6T%S=r?2ql! z;6B9WWT`ZD)?1MjT?Oe=o|Ls#8pmO*;LAylxKC5M1Y%TGY=;YqN@(>xx^OI(Eg`-( zWh&t)x~w}t8>rT8N%&S3dI+AD?J^QdCq_E=+%*#u%>(-LyP;WiY@EH}7|^(LjBGQr zgP7JQi1V=j%>I)CGEAE0fxMdv03*(sNy=1 z`#`x+|G-_(@H+8WU?@fscI{~ASX%KISsK7~pr(q<@#v7#X4g_{VsA9#LhFdErZ;v~ zY1^fzcFgmj`#bv|kPEsCeiOw}8ZZYsLmGmZG|Yc?)`)WT2P(y;=gCx01J;}eI}ZZ` z3WGSg-CxeWR>riS_oi(Vuqyn&VK8;UIvgt$UKm~ zrI5;XQWxFk-2bsmz|pacIE*>wRnH8V*Qo00;nztYcna+B#YScJ0)h2wLhO^} zIfH1Sp1Zu2BD8sKj6z0gySd?5M+yjL*kjlP3g*pls-i3_=}%;8Aekf`G6llvtQDQc>-tB`6v#-+b9E+rfVfXZP|w zov)b{%ns6=Y+gUH#df^>=g$C6xbAE2J;Vc5=ps#FoDYh zk4glG4RsUC-VN4)0YEL@odtg!1;l{cVnbWq;Yd;0e9ip6B4g`K`-;y)4wLY&^`g}Q zpAD-kU>IY$;8pxi zqB{G)cICVng`V#h36pI-xMQL2*jL`!b>Y>@-6c2e_x-E}hvLLnysIdSiQ-+S zx|a_@l}x$e&<72=3PyidSWnbVqm{MziUHQ=n_@G-T4M{}b2962Kx)8H4Kzk9N(@5y z2VcypF&O_MSaNg~&}sD}>n1!9X!0u+t+IFcs~Y1X*K4H|gyc&p-vNFR80>oA_0?no=ZgZ%#{?eYHi>yAvi7VBzq*AuOCp|5@?^mkF< z$THxJ^qije6^)ji?!xLwSB1HxaqnDC9YV{~A63z!eMUlhnzj7}!A|x^Q&tECTol2? zIM6nTDjQN)q=kRn7xAEAFz+%{fYYB{DeX_JuEng8;B~fB*YY*^u1xm?;S38@SMLU9 zDX*S+BOPPi<=6H0C9lObwi}MT#aCzeixe}|3NVTpHZIelEIl%6#SA{McbyrJ!Qk^V zv6>aA4_ydE|B)Yu=68o@SE!|HSjYuo)`2O;9B6EZw6K3HcM-C4SIn=rZ*~dEYJjN7 z7rVaA(us%8#klzgG-BV4V*9HOQNoF-aPIF>l5n$Dhl(JELe}*qY=3$FTT-P9uGrg0 z`{BQH!KKKhP*~r}_}SVIzQL~~RbW!Z*3;B-{}4=><#jtSQvLz&2D7yi8Z%(8{^d2s zru-d2z}kPO?Nw02!!0Y+(aywQYByuALDp4}jk+p1dxZ^0Wk+~3ynu=%aTHEQuwOt& zhh9(<_J9oL$Fp@D35l;D{4o4Fpn=F7H+p3Sn1SMgv4WhDZbn6PG!xJea35y5zE zhGN84$x|;{%c>#5eMXK9T5>|sh;J1e`x6?@nACqL*N6!k&bzlDHZ1I*YY%S^ zWBNkgS%Fc1yc23J`y_qwa>2%;kvjJv;L<`1yZI<|q1{>aYZkJ9ze)Jlqz52H8sqevCr zC*%E&6O1wsGIS{!5GFn_WQj2Zo)8bi2Aj7@b~K8K1}V|JbzIk$+fEq9Q6G{HZe$b( zzQd~RTI0VEHP<1h?o><&)bY_km=tkkpaXxb!d(@?EAco5civxLhrGE;Z3X@XDvdQf z|Aqf^fmixWPjxMv;1{66A*dloQ2u4SeOgrS6n91;>vL3M)pe&SkQrj5rbhJz0qHsl z!}1p+sesrVkCU*|r!BkV-YCv6nyu-4&;BQuA?E0kPLryU+Q*l7gq1Ffm}FGfWK@5O zgt&S$sDGs2>`LMmG?yqcqpfZYL2P)d2r_tmsp9K`cfH?Bf7tr}tXJ2wi$e?vzT$8S zU)8!IJ5J&ID4hgac7>LKz^@XRR7rP5Gj`AaRjT!_-uvA+2m8pbZqEjk9c}Z=uqxy@ zRJc`Q;_H&&or|~uJRZFM>4Lq?n#+GL?#)yt>jr3JF<1bphf_986C)!M7WHE)p`a^6 zZO?>@8O`U5kuGL(J%+%Zo0Y9&5Iidb$u%i8o+ zRRV5dAm3FuhxeQH!aQt|;c%tl-FS6LqNy*2BEQ1I9#>R;|Mf+o{zYUEx1ud8ZWCY= z2mccu7#?0HO4$WI64k6hnFoAaPjY8^hC(GNfCc3!5~S*@uACY+qsJv3ZoR)4RIxpo zg@E#M5=1?r!JtbXR!AIX?bs{88R4h(gikIr zW(*!SRXj)x>)CJ>P)X1&OIN5HabLWhJ zynW}R^hbF;Be#?I#>Sjof`*oIAZsal-!gqTpY{{uHG?#xA62LXq0o({!~(zp7VA zSOiRls+x94-1PhWd{!5Qy>R-eBDK<}cDul|wA){FI>a%k0da|8cHrjiFMikmvc9Jy zUEm&KIw>+<5kpQ@6)So+!CDdjm7(RjQ_;3BxvdY>v0Z;B9(G~t=k4?)CuTOQw(q7E zRvVx?ZoB9Vd1mhl%TirbKwz1~$T=qaGUkRd)(jLv@@c{s5xE$`f-=onearO)ng22t zG1Tn&$di~Mq;{7Bw*o*kGy~j@o*3ECCbeHP<-l@;*zHYf@kPXGA-M@r34e>Yg zK#YH_`m*?SdIzGt=DMH-kQn<&Bzn@zpX^;e`jQL;Wiu; zbpUMAzUFF&s@nu`dE<7Br*2+bE{Ncv#QlFLo~R&2<&pf{TZZ#h!rWSSiN_6q{_1)# z!gaviQ~a^y$#qC)^jdl=O{?KDyaNL&&{}_}FONc^nT{uvFw{tX0hJmQs1J5H<5dM` zhO(XN-KEAY2(-`>i;ZoZa4g0$``$Q2|5w|N!T>qiJb^MLY9>f3kC^>pg0Ky0vH%d9 zM$Z;%yc(6>%rWE?EE^O!4I?Io5{IN+%)XKAthq;TNPps=^QsOkT>sS7eM^<^LI8h< z%>4$C0i=nyg0atymWR(+_q84U(J$ce4v>R@tn;hiT%V1d=iK7)wOvhT?bY&N0I}z$ z8n}c2(E@J?P3q?iGm?8{>O3$3v$i<)%bRv*YJr<~MQd99E)k3nY$*@*6!f0eko)MbWj4~J8QD#(Y`Us+0awH+EQw}5|2mcMed zNNjw8cQw9*q!0nJJg_fN%x5x^H~6YL8gPp_wtRO??REwOf%VJItB_CUdB|tCR*ST9 zkgUV_qkP76eqrP+Xnf)N_GuA^O7zNAyguFrLN2T?LwN1Fnu)f)VeG8o*xtFbI!+5+ zMP-;)-zn1uHxRLMJ< z?W3=1um%P`ktX=R5k(5lp1Ps~m{9>#<&1a1_`gw^Rw=|X_ECdb9esb}rtjNqY+!g! z$LB?xjd1Y-)ok$z3v^QvXH=Qn?b&eX!DWi7FK8iDWnc71m2KyKkWVt5Rw&t2qSb5* zl@TOF3xkQ)=YRuN?Lp;1xJ#c>nd&gg$?akxbRNJvPNMRsrBiMnlmZHJAxR$p4^u;)zIbD>xOOI#~{ zfyhC%Vd6mB1Q2Nk90gxFTYpvVuZmne^M^=xit&c%8D@&Qt?#er5!mU7qhJwF14ita2wu{{Y&^>Ajv=)%5 zD!1MuAA^X?d%xz1$m~V6)Ctfdt1jWqFwg{+@uFNj(k6^lg@9y%v{70^Hx@X*$2yg!7fszjsu1uBl>n#vUqVn=6`VeDI zb@TS4bE<=}KH7hbh|tM6uKSXZ;b7U-n5j|fE(LwnEu~GcU_04sW8OntzHK3$Jb=s} zcwtZu8-G~Zg^g}^nS+#oQHN7ZF*;U-#nx5%`Gu$&%f3=&|J~7xy?fT_&6#DB?p`PD z7%X^cTFj4M19=~X`}-g?h4J^S=p(^2{fnbF2YS@Zs=R;bTb_&$_F8u}^V6U%t_e^dkpiIp^$~qvp+mbFZ9OF+SC~U$G#mKIFeI>GW8Guj z$6U?EJ~jWY5tCf>2x7UePcBA-^)4A)u{wu?Ur|}Wq|Q|YEsD)Zm3AqY{Twg8QK`%O z`uIhl!L5INd-e*zy91UM-F5c2(%*`j*KgfJizKN6yS%Z}x~fPAhtdlB%U0M&cNN%- z5>g9!tN(nJ2K+Q~34I|3b3?GYw!cQ@x_U36OhoKZqAb(te7~wsv}uZ3KN9b1lqw{l zY>c1R14UU zt16-vnG~jQtO2V}m+gtNOSX4cK#f_P(dgqUxZQi-7Rk@=rg0`~S_gLZDNyTOsRBc! zS(AS#?K)lsRShzXI)Sb0^_PQumxWQMfSu7KNkHN4H|EkYM2bWY3djRkR>UI&GZr*| zuuLI2gCD*iZ15s#?-5^ajWI0AgkPDZL=E*_qxvG3{~=Y>Kis}LEhRc%a9!i&A5!vj z-D2jk3#ARxl)GJrDC{dqu&ef#{wt8<0{ed|nh_?!Py6b1IvH^&07S;$Fp#*3Nh>ZFm*d#+acGIJVdL011%5F!+gH+`-+Q)PEe7dVvF%kDGc8Ij+Z9*)$ z6@`Z>X_(x?2kzzwj>?OQIT(v8o;bl~WH3qbwW-ju=u(asFbl0Z!^z+dh-PK6tAgcwE&6V^0E-xpgPj~*NPDFzlLp+0D0ZyCv>~^RY$9D{Ty7pF8pfiz~^>1^s8|f12dpro?R%j zh{Eb;4@4Nz4YksKJLaaLUpVq&?tFjb5b|}w9M1XFKl+LOgpcZXCKO1?_)koY&B( zJzM*Rwj;`21w~Y-FZkar`hqpO3ngEZwShi)0Ah5&B-Q^s!1ADT06S4dRM$DCMv}lV zdUTq=0&(>CH&ZSO(>G)?nArV!CHe<{G&4IgpDBp=J#T{zG-Q7>t%A~H4=;ZWO(b;2XAYOmc$kye8+jV7NF)n>-m5>R;=#lr7>Me{|jMG%;_J-gkQ$R8B z){Xi7h`PYb-|Cd=?ih{fSM&vJH<+gsc%n>&G;5X-nr`Qs?ka<3g8S{?Mc7%Hwu@@I z@S>X$>d<1{D88z-C^g1fGH?}G2^LBaOL_yIRS-QmLT|0}G+KZ3ZdI*bU4hV@q#`Wo zJ3O>mUA9lvaSXx&%+0}$2*Z>4#%}0+6<{y|smWPjMjXzboA>z(1kLYNT|D3Ep!l}I zg5)@j`k?xoND`XAppl=Ou>Uu?x!#N|ODIuRl=}?k@|fV^#`M>eaya!m5)86p(`Pp(nw2P3UXT#66?JxGE;j;x zGI1)68Zb{=kMv*CZJ>?I7Ug?I<9`=~#*=5Nh+vOlz&VQ~X6Aqi)VZ0ZadklSky@Lt zMV_b_BuUreo1AFCt{lN}qKJIL49eX`uK)cA_rVOJO0j>fwNn$)g4R>=9 zMsDpY!=%nKAmkXRkkG1kXN$hjon-=9!3qe8i=H+JD@y*-onKSZQJMzSClJDe@3pUQ zbe4Zi_|5@lhq99WQ5t|muR+b*ukU*IOn?4Whd6vG!61K-6J$=F_?OTQT%{;x$wq)P_J?R-9mfn* z$6bNn{>e0$LEn$t=e`>GV%G>x*kO;m{%tVJ$t~}K5o|5qz3P|>AinAImCo5X>1%p? z167x`INJ{QChY!(n534aQg)Hz!i(`$0#JCuRW-iRlh#+2pCc^%OSU3@b_KO!wbg$M zaz$|Lk<-VnnB7?$MNI09ea`PWdX?(thAzb9WyIjFBjtLLFN82Y{XK zW$Iud84)O}*6HJ#C_w{Sg^iR8Wwc~KBr|Ciwr>#vu))#1bh~lt19Z~?iXK_F)ElB8k0Rn$W*Tvqmvt`b1*6Ej;_Yg_Xly}Hhz8_b>Z{A3I zM1wu1FhD(5m&Q=g}o{&e?Wo1EKBX_)gNE)kV@BMbcDn+%u}~mocoxK`>~`D84)mWkY@zM;w2dRlb~k z2R8GtidIF481AK2dy$4|K1IeBloyzuQ3{3?adHLar*XPKg(GgQ%A3HQ0bG2;dthLq z3&Z4A*{Wka!RA3`&}0RcVr`59 zUmhrL&hHLt8w_N>)kr&FmiJ`Q>c}j$niX$CQ}UWLvC&@$8tOh|Vr_V8M_(l07kmr| z+JG5ww7R;LP45nSi|m3f@pLs3x=Q3lURCbnDk)q+)LxUogrPDf=t+M?l#buz>pV}- z#e}C5;9Cf+zL)h9s;dEy8BDIOo(_^wU4*Xqm2;o<>}>wM_v-*tK&-#vhVE|E0RUG4 z#U~^PbXnOZxxTXkIL`ORUQi!=mNQ^cm4&OzTI5Ol({$Z}Vao6XFUl(Pss;H^eA9I> zb$>e^9E!9f%xl4cbtk20?Y;efUdE6gDJTHtVzLS~iGKxs!Ge}F6Uy?kiQMnds-+r? z*YhqkDVP+Fz`ESM1q0>g+MsCb?z{_DQJ~xZf%0cp2D9xvvj2vcT5XNJD)kSS-<2xK zPwKa9YrbK=C!?Q2-k%N(4DX_*KLArBb3vX*(5)*rOwtSxIU)`FTlT_#s4Bp*ziT-Q zj#c>)BN3QR43N+EWFiXCsaZ`9yiwh!e);v6{fQsrP%OQ_2E=#&Ud($#=?XOR2lhLp zs}x57isoTb2WvPmCY)D;b;^;bdVKcMTHt&prPu9`0MZ7}Tul^va(9=#sb2wPv7wc- z7B66-=zPq$S{U}34wl}3HXjVwL(li>RLM?@L2G1%BW+hol)P$Zf6N1gITTwH=!k6Y zDw>pI#rksiU5{<8RQfArON5&umyEI^NLwpp?B~LDSdx{c<9Cq=Hwso<`~kiDpYM~f z+((pmZCJQ4g7m%d;F7Mr3Fq1D=y54z5O*=~houVli{EGMD{Y$eOr(;TFapnWPr4_@z@lHR*dA5%#z2y`zL z>)8=Rt$F33o(On=B~%K}oTHD4|C8JF+CH1?MHE6HV)r z$Nye0l_;EMJl@_3hqKJKJ3(pLb@U$+m$>X4`z4-L5G^+xcjhSl7yvKagE8@}KKo^` zo9Y!UZLbfO-0v?IsaRzW)q(n57Y2c+0L2-xLVMUj#l-=Zu>hZr$QCd2a!^MrOcA&z zzCIm-`m2L~8MD8Icje`QD^=ZF?3xw5refDJ3sA}wWrz=CY&}S|T2yOjBea*nLDwJD zD0ke>;=*(7_H-&tYCDzYXiHY8wK)X^c<;rR4)hqnh=wWN?|%+_BUN=Qe*qaTKaI#E zAg?J{AJFJb5XM@8G1=)5fKUvrPY&fYL4*wa3Amnr(+BUw|MtS_$*<~GS?;qA_$(|L z;X^FY?gK?TE!AU?P?MzdNoKJNwb^3thtyewi!YC5gtULZSrpyr*zBRK;&%lGWioBE zY4Rd`5ku+X_-!De0QwC6OE4Jv+ERGhNMM~A<6Ir>%ihv}Wautetgq$p{V42u?L)nA z#Ss{P7r~2Vsj3cjx51QUT`?g*WR|3otRT*z42{OPA^o8KXtg;F7V4LOiO>tu9*1HLxh3D2`5cw~$JC-!40+k{GlaVc zo`bX~obU%tnJ)xULm1$H=qs2{^zr-g%eA$C!C#lG!B$cyO_B@nYsSh6RFPe_{_LSX zuqeH{7NZ?yS#%kpqcQl9t$Il70~tnUXg?wv?!&iXX|PZMhzSepKWwUlU5ubsWoG7$ zinDRvw?@969e0(QJru!+5h$bY2|?IGuM>)PM2zrV)=k~u*Lf(FL8&Sj_NT7}->M&f z;KfDDE3o5kzj_D^O!`2V!tCO)smG;qpeBrpD^Fl zojy_vsY!pmNRfjr0FSv#P5+t5y8IEx#0;pC8#KvV&!{1D^;06kv@zEtyg;N5U152DBjH>m zSFcm1+p<}Tpj@X{h>T=iWw4X3-^oN;fv_=S;yALTzdR52Ei`0sK1H*@JcZ)a8y z^K(%P_!3?PX8ytBjpuO672%~g6Rm=-;({>1mpmPaH9dG0`1lE{@ljxZ&3GV6)~O$u z;s!bO!FZ7wV((g14_wA$@36AK#nG6vxh!@gx3sKUO1k%Us?D0WXlQPta(+3rrYeuo z+oN;xY`70IR7HtuG;fDRxOx53Xk$GF*`sLF$Ek>7&y6Yk@w3LZ$5bJ!f=Nee#EX_Z zx2r}KI2T0-UWH;{Shh-kNPckRNzkhzLx_4D%Nrwa6YoTI;VMn1YO4yDS;hx~(Q#L& z)><)E9S=obxw4YKXAxvNZ|X|wDcciGnz&p0Q4zK6;7LD1k;b(Q9AwmB60~v)FFhzh zxg>Hk=v)kx65;aySdmug$*F`2MOmsFXP6dthnKJgSGsr5=5bh^N>6}BiKw55_5Q=XsNQi5Yh zQm7nAnj4s`t&?egmlRDRN$%kwqb)aLdu%qfc;ek!Jgn>V$k=3xUr?WsjljxRk6Cz zj2y*^xp>`w;H7F31HYZ!g4DHPnfCi4m<{VdV^ZC3OvVRF3=9df`7|0BSX?d;nBhGg z+wU)3F4_SfEC6?Q-ij)ELdlA1dfoGvt>z(RXpOCDzixE8ug_K!-IWY*MEN659SgXG^YQEbLBm{sSP7%iVzrtKRf*LBv zBm0YlnNk=#REru6G$((~l_MSg{)*wPy@fUZ)RQQKt%OAM5i7XU;;#0OWF z^$eMRzmgoqLI`3q!mhpAx0X5+{hsl{fS=;$wbt`M}9J8$neeEYNeTxGy`#Amf3C$prr7weOvN0+F zB6!y%!-_uNwmT*a&V7tI6REettR8~`#1DsmaMIz59%y3tF z?C%~(uEaqfK1c&ZmEed4{)29u+urkR6o98{AM$JU6G;oA`u$~*7T@*1ZXZSQN9GQd zzKZ7fU2d73(D%%mN=iZQM+(eVLJ4dqC!mSC^iH|Z;jY{f?$(kK5S!B-!U26-<)#XM zuCfSG{Tp`KY9T6+6~fwg{)vXsZ^tdKTBM95x5NiuStM&z!{3O!GSz`!=R0#_aXx)& zB3y|!9YkSK{bCAX47$*XF&642*aw{W6N`SWrmxy$$vWrdg~I`NrT)rgK;$Hk(6B@pM$=DaIbB;EsJ~>l6zj$nc|<_OBB=xqOl;ZhW9kcRvF|&T zs0v!Xv3<*f#o((xxKpo($+MD~-}PgEth$B=XmZi&0n0K5Swz*Q2T3U)#_fIoo$|$1)bsMER}@vb34xyaG6;?r zF=Kzx;;ZrQ9qF$=Ze3B?^&AP6YCwnY1b>}spa%taRZH;yhA`qJXcZ#0=v&UBs$JK< z%F30T&Hff9$@Oaj$03%InhWB89c>JK-d32P;?jRHE&5awsC+4?N{`ri62eyB^L;&| zkga=++c@7BAzjPoMD$+-j^I@-B6mxVF>uKB>t{FiSt1cBTc-wE_`ekuSRn%pfx8;^ z4?rtdL5s#6$qvqJ4jnc|mtDMLkE?z|aNgB8@CZKMkDB^*Ir4dC()|i;X!oGqwbIx|QSkiU zPtm?Ca>7$OqeOXnOoQ*$n?s~~eqAd1HjQ6bk0QQQoS|d}zqd&j>tbk&b?~4RNN8q zU+=yw;uV~nS?ar>u|zZ$hkIkSn3F@>R2cg5vHMtpDX$DIfiJbR6zLoXb>RkIAGJS+ zltj)IH+#n55q-Pl#|<$m`B-UPpZ0XI1O?Wiw5~(J*C&7;bVm?>-G;tC+HiNuZcH@> z3JJQw*N3ijbRapX8%9x-3?Uc+6JRpADm9HG0R3=hn440#f-6jk=}#M6Hwxlj^f~)H8&rSX3`* z1NOKsjIafBYUt(MKUDfF-c?b_?{J=`KQWQ#l6< z-K&`!s!6O%bg#xNPU#a?Mqj1fg_^FgF}heGm!(-}Fgr$n?3>_!x5V#aD|5!ekeE3n zLB@E<9sCbXe{#02^C^pG`1PI>mbktE2(GT|`5O&L%&wh$cjttt@9rIWw0sDZp}5&W;R z;;)ZHgQ^;Ujj^V`gh#wClTzYm+>EE)WjXjKK97Q(|1r(o%((p33lGq?uVPGYQrMrH0@{MaRbt_lcq2;pGR7P+f++9W+1F~4e~ z`CR4dqx6x+0L)cK?kZx*PdtSR_3{N!)}Mx$t8$xt`GUBZqsB4OP5FGe{pm`MT{ZMHM$H3Pt~4Qy1rB z44T@1R%vF#bYg%Vtu@pHgrSCr_f5ZwoY7T+I^C;7N>SFK_w9llk9ywEroyPJ1NvVaa*Hyhy2S3dtKAiX{;?{U z#=GUuGvSeEqrbp1L2-Fk#kvuwY9>wnd$Im1Gur|#0khO7DV^Wt1-C0ejx|;Sc0VJ3 z6Bh#^3s+$?ogO z`FuHgGA1jD2_u3n1ix}R!pVKFIcDIYRK4mUC(~)qt}RUlt!M|QjEKIg&x1Du6_7O6 zhr5EIXCtY7dO%9rW!B=KQ zOZ*j8R2fN4#U^1rCuc+0OqK~Nf~=9UsF~8;G4x6ru9lR)0=lgX!kdfhBJ~5J(&(SR zM?*!#O8H&_Q81w8vlCyW^jqW(7}J5O%PRk5ao6M#y&Fr$7u#i%k*o{+6(}%(jQZFT8vSaL=>kIn1S=PD zAqc9GC^nvdsCx&-jLu8aVL59q0OY+PvBGk42(lN@q%3BCyJ@u(M$q4M01Lb-J z7Q2xO3=Ujq(IHh8=HrQf;oEw*bj3s3-d^lpDA9Ip$3Tud#CApBGRRWm!+uqkoxA>C zo7jo*TY8K0cnnG!H3)*=GIq2snTw*FlaO&tLr*&!FZ-s6kAjBO}<*Kl6~}n4Mkw^M#m2ewEBm z?s}KYTgqXI^kVixd5C)qr$XClaA`n7mJVSZjuZKXVR{D!(16lH{Ne>!2QkUxIo1#b z`MU%{oTNf%bQXnw96G@m8kB_fr;B`9vcj`J7GjJTn%F0{H|Ee2@Sd1avKA22VrT4{ z3^57j!16Ooh9UZ(N8W&rO0kTDA%_sK4}F|Zh@S&46yc%xa-eofF~7}BRd=sDzui5 z)q|;ml@41Z`E}HSMte+X3u6;I!$b-m136@oxkwuj9;O|o<*9;4q;{#VbplI>*yCFZ z70i6=PK-H!LT?!M^~8_y$XzH<0NMZi$s`s-Clg47A%`$Q`w6TYA!fob33VgSGh>F1 zd6V&px%fP3Q^(*A{X3}06y0OXPB{5jTN?zugIuNLov-LcY7@crU=yu-3P>pi^8xG9 z3e=|(=B-9)Xu*Fl2T5z<-n4=NAQ?d~MBXAzyGN0K4roMQL~c04dqnf5^nwu1r^$K#wrfJbjYPC(114fbF7zj`>Ka4b8 ze6C%8$pf2Q$ohO~njEl1QXnvCB25!nm&*7|Zaz1jNE1gt6Fo{a@ygR|FSeSHNTi7; zL!}(&9#AJF763IE01y@w76=9e1^_z+3kx+25)cyXU15YLegAe$C`+qY2^IQDc2;}?JW~{puIaJm2sHK%c>GAe| z-M8vJ4Fq6Bf9=d2^8@>YVTeexE^V+VFCb70M7Jehi^`9|ZIz;L0g3o*Wwok#i&{Y# zl9>eXnpoEcQ2aM#u-V{zZFtSkf5vdf7G49QOs!F{d0;PhBSd#2;;UA=F1v^-i3__w z_rKSD=K5bseN&GDoYL{)lrtl%Vn!1?`djTVC_Fl3C;5_Z133Md(p;EdHNhAzZ8 z?Mm$4T=)(@kLSfT*bqt?^qzvhR+>8mSUJ56F%^`D;ESsd#NHpQXYIl5Q=g3e5|khV zYP%+_ze|03@Q>vY=H1h?t%ZOLI%3M#K3m4bL10x^gMg(^V&>^$d9&(f z)sIxCV=h1r<=f4!Xq#aAq1PvW8AzxCEh7XG1{yTt@V66n!`1==gI}1f?$Y?Kj)W%o zAO%Rf-|lgJgec*+yLzBp;6(Rtv0IP`oE0QRU;Foi$-EX=FoPClJJ9O6N~nECMRgeS zb-lWmjIB*qn}S5DTZLRHu<6==IsB#QDT`b=FkuT!cwMbC)?p1ATUUF3vcrIDRbzF{ zaj!c4)w5g|jaS++RP<1cp>BNOE}m^2IhBbY3U5m~!7DEK?;-#2aw;mP{u z$V+fg;f)9NchtRR9ozUZ>p1=b0jo=qiO@e@&eIXZXsVb7vqK^u;jxZ-)}NlJx$phO zx?PAmMKEM`DZT9ot_vB1(?I=46h$Iu>@ZBWhfFhPIayR^WuMo7*$izF@m!UDkKfY! z0LN;Ru#x*B<*{`PY*ZD|bN5cgh!Ws?0}bFG!D@9XinH-vMa`sk;<-`P~*}v$5faQGL+AS8bqR96^$WhU%GE zu)>l%u`j)+)z>L-@jeUJ)9R~Y^zlck_xgqd8&ek7T_EbT7mzR@>+px{RNWdw6$fDs zWgwOZ6TKGL46IvyIi_vq7C=Em%o_~;uz0!4!Jco$$Yz{>Q1r>(s|Oi>RJ)`iVn1@% z0bO~|19V|?c;fCEJ4O@b<7D~4E($qg1Z`ZKH|T*|M`RR7Eux%&4@^j2N_~#}@1pr~ zkcA01{_YFVM$_9}qk{i|%aH?d>xB5g_S;-@BuT2KU$j-3skSiXX^_M0&@O=RzR8=u8 zx56x_1-}L>myj4|fWgGTcc*X;W8^CU!X!?!{iS7p=-&6hwpecUZ1?O2z*PbnzOQDh zH+`PEDJWRerz9Tw8Cv0*-aPF)o_NA^`3^VTC8tX6! z;*kFv_C*kXoPgFcWkn1P$i4lFwwj$5uKues(qA*B`IO}fN2CLHLdQ_c!GuruXf5sN z?STV-FQ~;=W#{(Z7*+XruESrxPdj*8tRUJneU@?+XQ;;FKk?tDvq(D*AMU`(SOTkt zoFMMa>bAK%`H%lkqIBhD{Y^c!->Y{x-JGR=2lFQy)VswQhGO3YzY8>9yr|*a+7}Pr zl)t|yHR&=3p8;JRZC0{FF%*HfILyt0)J{yVN)gr)F5UstS-p!zVlR6J7${NJ(V@={dN5_pYmniI{kc)z)4YGD9}{DPhBU>!@^?Xh zY*wBz=Cm|dxT^a5t1x4Y^j(VcC}|$%aaw{E(Y~DGZYItZ{i*Bxs4vFjR`;C^IM1b2 zP1^^zkmiF|A}z#z!{&R{3w^CM6|cCz`v6@MFv40e7bI|yX?<*ZU;RIYa2RQP9GPr6 zFa1O;v|&(L4Y<2D-Wua&3-ScbknZsJbZwt+xNY7W9DHFA>Y?m@uI;Ck z5$vV$^)qf8iK>U5EwSgs*X%@tH9T6#iz>0zyCd#X;4lt^(cRwdY1o8F;;FmJQ6Kof znp&Q45!1(w!vC5Au~0^M7#&o96~Q==A61Y~R2}6IPOq9_t1YBhI`=bH!YoLs&)0h#a4_@WZn}MpY_Tr4yhuByEdE;I=$wR7k z!^!11z)ar(DoHC>c)(u`m_g>LpHODvuU_ORV8(nlW0G@CzB3#CuQ_ipzL8TVtq37h~l9|`HD^*+iTBNQ7 z>y_)0u~nI5$+qjHoBI~pA6R6ydlm!g4kT_MdQ$KEA=iQ|)f!c|E1aeE@A0gxzIf;@C>o#DKSE4NcDhxJpDaLuN_` zo8-w{yzI)d#x(rGib zscbtm5dHd%+1&<1+A#9!9ZyvA{3@KKT^BzhgUByc7GfHI)kQ^G_Ssiscdbj6kq1(l z6vACJvR19<+FhLRjPsrGSUZ+Ht)MLBV+o<7>SkScd1>6ght^DeF{Uc_Wo(rt_P7qG zW_`CL)m6~2Xp%IY=+KY_-x}+`GjJS5%yzAvmrb_o_7n45fAE^p!}d;j)|dvz_id{h zgy?BgLKxY9ydkO!+H_Vn-U3~t|MN?KDc;4=}HDC}P&6QHtMc&OU{58&%*Y3TG z3fx#K^ytD2$i2b8-m)Ekpu#Y@xlgLZTsD(5;K>?(bM8xEKG-v3)FNObmEGz!sKa8H z>rB&sRq2SspUQ}e4%RKT)HNtLuiH0?rcdPRgk7!p?W|^RSQ!Rg>|pvKPZW)O^1Mpb z+^WUZ@slRwA?=nTlDaZJ7EX2v6+^V%xB&qVT$>7mx-Yec{S{n}qpu>NdtfA1eh;3i zN$!8m2_!5+=kS56es}tZx61BCXApmn9pYGj@QQY8?)^p`(T4|p+ip)_6T`IaMh11V zqdh*_3wpVB=5GVv+Xi|se}{E6fbV39kq_s(A~0!npWFA0`P(Dc&AGrelxqb$ch$nbr+($@H>U@cnTw%ViBqW$l<>xcdbU*jbz)_$ClP7JK~^!t0`Ka#FFR}`6@R0KLzvJm?DMx9E;0RM>F4n zj4BPDF%Uk~j*61S@IK?YuSB5WK4gJ{UjY#yo{PmSgo%iWx8?jK!UlNL8V5uf)zHQn z!LA`p%)E93Kj_tiPWhsK_=S%{Jpp}EB96--1fxZy-J_sDW%FNh@ogDj0d38H?2YcP z+Ls>{Ve9na-N*%AYB(dz*Jun!Nt4k3wzbc0eAV2 zVSgy5Wz%UNe9A}3|3jNwlQ7H4yy^Y9JV zd(}mEYsuw|JkdzZkWwCwUX>vieZiZ4@pE&=-0xo&)s`NYXg`*JK@&1KWC1Kk24qom zicuR`8Z)t(+vy__=PH2T+aD;%!h}6wxtZ!3RJXAb!I&7Yq9l41f(pd@0o`%fm4s0+ zq1cjEb&4pq8HtO8ujF$je5+ona##fturP{29#v&*`a=gF8(dNVk`K{T;okumufZPZ zze%ch(f7e#gII}wnGvzb{WX&k@vom(m7v?-vbfTAv77d_e7kgLS3I1!;3lXOS!h?4 zvLvZ?dsf+8+YVg!2vWcUTT2IIpi)&b#W<;Z<#AV`ef7kdRYuS&q3+n4D~G<$$Pi&= zKJ8LKiKGR3&aTmE%qO6(?CKw$eg9to{WKSVe52Od6_UVzbB&NzAm29KGc?Hcp6ipu zyf^&oj;%V7WWd18tU5dW3jnH)cz^9k0-7XbnStJAT9HX2j++2pGtNphbqu^vlQ$qj zP*65c@oS{E^q^wU)4g^&ZZD8;NaJ-8QpON;M9`^`KR!VSd7o z%Y)raSYfVAuB^HUS;PQUhbJ=t9eete!JbCKEx0PRzxeHoo@JZX303KUi_?*9cQyWB zAauIo>BRaxlG>YIw&hW>G!i(5Ao}8RuHc8e>Ji{Yc^HF#Ba-P}x4KQ9U=iZ0j3^kG zNsmE)1Tustkj^b?ig96e3fUf?@3(c;DSZ5k8QW{&*y(x|CLM)m_Gg}39U#ccRm@vj zfWfP!rv277HSelHddI63O0>E&@LF?(@h*LT?e>#Nh&eP0(=84GMGiG{#3kKIRadk~ zZu&+e_%3(a2|L`nz@ra1q?cqUAtJh(9W>C3Oe}l+ry#c&{ z@U?7XkblSuh94`vyljeuxH<(rm4uZY**?c|uP%t$b#<6um!dcTEmBfzl#> zFbbr-hUSi8xh9T71KG+B{zs^4$$Xx5^^Eh_?3X>dib7`KQ@P)&*_9V;x~cO?L#+=o zEyFq!kW1oEo}V_2fYz$;DHFnC34-pgqw7tK7*P9eEtdqV9RgKH%6*MErCw_f&kw%zdY0q5T z$zO6ZZMru(fJG@mND|T2F31+{&Ns;<>x8E%>qsSVeI zM_|$VsuJpg@lcEwcP)PQi}!r$_FZ%9OT1~eTl{h$P=s3J?}c~Mc?*uggUB%EUbwV* zPN_oRAZsPprb|;CTTOst;dp`a!VvC#C`Cn%)w-=ZjgBHhHZma@r+(MoahjIi7wMl@ns-%I)KfuPf-O)GT5yEFK*Sp zwg45!*UjthRplx=ITzE^yK`M<3t_LA5kukXs?~RW;)41V@Vq2u%<#Rs&tEM1g2;d8 zG#UU5*KO98W(8NO=aBg*)$Yj{r!Da4dQ?ntL4WDTy>xW_bGD+QyR=I;QKx_wlw6 zT?4@TqP~WEg!}P8ML}p?1!O?C_6ra_TpdDEpLB*gEKDkN z1IS2)e1#oxHcLkZFx}NSSHrui`B2e&&_ls~#BCAP>=W8j=X7vW4vp&lNa(H(s=H?R zpsE9)6E~fPn99$w|M9{stE!0g)x2o#g8EK(W3tt7^+mEV3|xJGps*_z^%a_TrN5|) z87@a;rS7M17hD%Aa7R8c|4I5!dMD~k!E_jX`VPo#^I;W8^JmH_lV@EbHU!j%kSi%T zkT%b|3h-A^4Tc}XM8T@ODQfi{9HSN|{EI>M_`mVl?@J-p_16&|TC%T#CJa+lmuS{s zDKN_a1?xpa^sm}~`F-VRt4-2XYD!&IjA(#fW#Oe&YhTqu|vMV5C7q?9$NKRc3l@~gs%aw^|xJ6c_;<&joJ(<1N<7? zro!;J{uFV+t#_WB>rWtc(752C=+_YufNfbbrMg!7N8o>dxc~}SXjxcI7y za+G2jnq(aZI()^Nm30j@v&XVV*f-Z@Ptad~{X^~|ko@~#S~?ZVMO6L4WYy#>YN9Hz z*&faL2R*8Pfjz3h^sMdx1o+C0s;7aQalT^r@r~iW7>t9K$^Air`EQ)iqN}W-4c?qi zN$BnlY={uihICct7O-^lqgFKJc4t)h^B{z%mgY7@)f-7NsU+EzpZ8`lv3 z7Q{h5@~bhK7sMS{44Z;$C=VA^i7)!!D%#qS|3fU5_N|!=Ec;(P%q$I{IcEQBaTi&B z?{eRZB=rHC1~X`+!58TAn6>!rl>l4U2^ak73geT5stPe{?D(%KNLsDLL_-FdnuKMT zF*}fdoN%!&(YebbZ?c1UU~ea4;%FNQcDYNT?zTfY%YWrj4u89Hy6mZ~aK$a4a=EV{jD|(s%LEC4 z?VFTNydZ1mt3agPn)H~&Sb@3pG(vl-QN4>h;Y|XF?M2eNW@6VC^9&Lra5rzEbEf93VUQ+pLdh#r+w8+vhDo|c-OnM@7PO^LG!*(A)T~# zb;Q4u84{T={;eh+L}pVv5#c;jg$&yss#KN4SxEjq-!x#&a;fLKP&D#|U@u`+CzL)( znl0~;b0u+gnF9NZ+yN<&RlR6G1f-+f}J>zVvrt z4qf`YjLr0SY}kP$AxxBiBM6FI0vKnDuaE)<2VX9JWnHd^(9Q)aH4A!nMOd zR~dyhDh?4vQzd=!w|u&FzqnLiQtRG79~)#*$UBIDxB4E=vi~P-TO-O@!5iYeZj}^M z`JN}QTD>3tJMur1qSV*B(VfE%CSid`Rpv-*qTIV&8Had5bAbC8bEzrs>b94 zYsi^Jk_Gavt^j0t;pHSwT@@&QL9qlcrka142SHpENHwhT-|Hies8LaODJlEiYRH<=}cd zR`Bw(M@*P^4Q)|)r5i)fx<3}C{uLDufARp`O4=pSqp1x5I)cKn*Ep=;Dec85!X5k5 zRU}(m-m8aT2<%>~VtxceBh+IH>|wx=qA3&mqyCJqEGg)S)qvT)KDj9TyouOPFh zDRgI&XPj|;@#eJeB;^MyG#FN0+D$FxV2kOpFRiccNSueI z0rri+q8=W^;qC<-#-rlzlpSN7kCd7&U2GD;$9F*ajjCBb?o$e0?hzv{!6~&w?A|iRIvL~y&k>yU2yQ`d@P`(5XBI(R!`AAShH0()M}IF>|2$p zuqB;(j)jcckFPoxOG5I(&G*5A%?0KM>c1(xYb5-$rQz>Vn(1))e@Ao_& z4ySl8GdD~@k=Ox$xq>1wA%T#%up~GOGEi$NAPRv$x=w-xN>C?8)ALxmyvt{zHav;q z=_>KQN}kvW3A@@)1~cv8%CI{uLuUB5kxDjx&|-ixtc(?n5y*rdz=IjvK;4sBQtB3% z&6+~e#3or}_Lpdy^TkbnSM?pTpxkUgxpqUY8We?AR+LhI+O8@XOSD}T0!$pNPnBg* zA;fv6i2JCls9U+k)zlp-XxR2GtP9w3JD6R;j{OG;Io&dQ{1PlNLEq9bk!kL#4?eya z7-%q;ao74j5-<_--_+43S|1VI@X~`55@cj%q)esW=7n&Bd$q;mcEp5o!~~|Ce3Bxd zX=I9SWHn}gEjD(~;udU>niK)4vQIk#4o4Vh_$=fMG z>eF&^{*^>+#FNBCn8(Z7-Q4V}XmxUBIJ)EoOG1%45!H!8 z{5(irB>yz5XhL&_bS>v0aOeVa{(a1-sxXyv&JS7MoYxLG1XIW!6k7q#z~L52*Ez{m zfR?`u1JQ{BcR#5@FcRw8CT=kGrJ?F|uU5zCRDcX0>JUYd-PT25#TT|BR%n9k_w)lg zSPS-lDuVOPNEP086|71_m}(Jd`cFv%-51wAOdp`QdziYVY>TW>9;s1SrEJ>Dx7pwb zkn?mvqFK-h@JxQbj14ayaa>gg2Rr^$(3SEk+wxriqsf(QQ3zoAxzOBA|mLdZ#P?89|Te`xPht_AeBj4bssVD{pENx zNe63lQBYF+G5N8$ur2nrIl2q!G#UuV2a*{Z?%r8FJc=Wo2fD=gh(7|fi$a_-HT1K8 z0q3d?2>OPpy>kIH*wfV9r0cW@P0Xix-~cp}6A2W97GJNvswD4qM1%+PzAnG{b(`M} z7SW4+yeB5S4$ppXTj*_s!O;;C->wMJB>aXQPgFk(5<{6TG*oLXnRdwiS@c$m$&X-8 zbVhDPVlko9f81Bm9aZ79!k!bR3sVDsC=z6jfI=`=P_NXOe|KAhn?aPgUfWnmsD2O( z3us*u+u4Q&z8%HfMLnu2YOd99fiqCCw#Q*js$@RhvZ+d>Zg1Zw2VKku*=`Sp#8kC_ z!*!Yj>)@q~h;1hUx3H4&Ow!zh%xr+eRfWoT?kYL15+uiKYD*A|1aJuR+K-{%9uD2^JW;9&be;35$V1QTKVDiVcBa%`Y zU~)h4YnaixR8@Dc?72GY{b2`aA+Zqo6*`JI%xor<-?x_`M-}gsx|A-&0*c9B1Ddhm zVKvn0tHOE=6nyli*U-j)nI^5fkkiY8Hb9SagCz&Nn6(%VtS!AK7tB?Gg@7`wYlki4 z(@6-TR5MQWK33o_?2!x7oAlB?|oR zN*+z^*4)->%!53xm#%ZQC!a>bYXN(FzvlOvZ30-7&sx^2FydW{M zdH=7V&^2=lH>ELuqf!mo1`=UH87XS9;CCpPFkx^pD7+LTTU9DBlC@CMDyBP%d1O{W z&47zDG)_kAjH+rK=34Bow{01#1M9B8qdbi0?fq{Vt>K)%i5J3bgcPO#$AR-OzMM9#iEySm~Dil+Q48mYCC)#K| zE=JITEmI6(3LCmRiVEv-d^|gHx;_f}f-asmU)>U9kCEwD8ND& zT7!=Tqq`G-YVIh7g%VIuhZUQ@TGYiMWgO9~R{c0{}5% z#KaQ_!?46>TR|Qx?ocxfagay=DaeK>$mqyDi5UgY^qz_SlwFVw5i4!x79zUq2t!aZ z7I$ujh#Zq0KCQgl>XSQiNzkpeU z!Mrw@0^O}AC0!&7wVxnH8y{bPRVx<~Jt+hI)$BH4<5d74atQHpA;|I7`NID07W9{p z1oa7sYvT^E?(b&;jSBfS7{8qLww;K0(tr`K={oF-fIFlvq=`h*+Mdw?&~r(14c|GqoXQp@*Mbf>(fg=E8Q+`s~vO#c!bB85bzbm{oX4HBW1@t zOEeX=e_-92;~Zj85xyUmb?|hJg;h9JmBBT0SN7bA#)lwH?flMoy0r_C(fgD2Pp?|W zgFj8`K3Dv{MI;IgHMX<=^Ce}0yphfKPn+t0BcRcPBAn^+5?`5%^xLA`v#d4#K8 z3@WWF4II8AHZAEwg$>*49jJw6;GSU_LsU=$T{GKZnL`GzAWL?Za-Il&&cJ^mw}LnT z4e~{`dB(p=ARPSOie7=f)gM!$7&Lw#WbYQ>Y;$X%uRwGj>?qn|Pi}bgV-ktVx%9 z)vKNB6uCm9;lR>gTc+COqjGcqe91_I+2$}6Uq%DJ7V|jzcj!nwzXYsL7#Xc*2D9p6 z4(&`I{sGag0@r3-3`-29&x*Px#)njYy08FGK(N2n0*kMWj~X`!5NsVT9iaq`YY~v7S-qv(Qie)Dom}b7LBkJ@nkjU_p(K6|26TLD;sNn--m1? z-lsavhDs%v8+s1qKe^XidSxVbT}&u7T8tBMAG@Cl)xb6k z%6c6_)zwKG#J7N9LF^eEV?#jDLXdevSuouqo0h^}b(zc(*ns`T4DJbm=UTd$cclPg z4l@`S(I@Z!rVgAb+p4VQy7Cb7XJtpof7Qrtu7&ksR8qE((KJlFTd)c}b%7fS<#WB)|D_bR{^`MGzAP&egTmk@2Gr3)d*XorAFmUl296e<`4=H&a)sfBRgg zfh{f-Ee0;)+u>d+#H7W(W$fDUv5niS3Wg;`kUwF^mxxa8f8pHXtWV>} zwjywZmTJWJlTE|AxXwvm?1e2;*!3F@wC=0@J$XXBn9*J?X(9ihW zgRkUHnH*%EoyAX9fl&R??G;K;=x=;sW83QGzgG}KnzIafb+e&Ah-uAOe?jk~U7be% zLAH$;3!L=?bDVzv4CFfZc3}OlksUS1X@FvzAm`qvxc}TtTv&AC; z2U%FGevsH-MNwkTmNh^DAxS!D5z~=Wh=m>>#zu#C9>BXua@^hGNR3nDlP1&(WDCK> zhlpRnOcgGmihb@wK<*O3e_Vf|VRWU^d-`mU5FL@Mf9bF{jh8P+n^NG?cn8_W9)PmT z7^sDaf8&6&*YJF*O}sT&mol?YS!1I0d~tuptG{xTL+A+pzblfZ zq`Ddi)+H!c2)jyp#C_ue$FOjvD@(Hb6hxUwU-WkF)x+`@N50i$H=@zCa~c#RqL25; zZXM*%qda@8f3BwgUXRPsy3JtUzWuHnH5D1e2ylg`I ztOKY42^P!bvVXy@d4ERhK7wQ+37}{%~OV(qVxA z)-93+PQcYRh9pVG$H>t~-jL&B%$AoMK+G30d%Zc<0-2}le=&4ir7pNA)!Q;t>u%jW ztBNpQ+_oTBidTGRCZ#ZLos>-%^%G4s6B|ul!?qV3_tz+x>ZvpyGH9NoKNS^3p=%HY z@LDRyL9dy)$u)n$UbVxT@6w_ne6Yea)bFl% zoqy~KrP+dwe^P~Pl{&UPU+R?uI4X-5U$&cf6jRfdvAD)yWZKJX^}d&5f4nVRzel{r z_Kyb79EH1Wq^Md!b_JX1A6@ZAzp>kI?^f%IUbjpCstmDR<)aCthow#Hyg>WST+Wtz zWcmfDK`OOSs~L;^`=^f$Swf~?sSdn9nQ^wxIp3>_e*?SsCTad1`a6y~1aOjO4N^c? z?SGtf}JhZ!7;L;!}{`q~rsao)EFM*{|c*aE*I zH6Xt{0VS)?G>45|=3H&fR&hq6pAHJtA9wkZkP2a#hv-GyZ0H`>ry2u}vMFYqAW3MP zwQEMdScsh!4jBuLABdn}%*0(p{fK{G9#ZFyK(9!{O~=jx%0Qr)Z}t7cAV>>J&p2WAHz6jh=snyj1ps6ue)uPNx2q+JOv`6A%U};c{Na;IbEGXMyF@`7wIRr|J6NwGRLgvAV zjOtlnA?uH|?)*Pq+g2|X>lO`TR9R`#8(vorxiz0y3nj?9WX7zwXo6P3NbSFF zz4To|{4QGViX{?u2(D6C4LJeB^=EZRjJ^YRQF@|doJLs!g1)4iaT6LUiMZe?tB( z^yq)@avga8lDVQLVDa(@-&JzY3Jehz=G8#dgwjk+*%3jq&(g4O^q2!AE#w z!F(0k-GVnjOc;2WLDK^%-dhCnf6h!|4*aeJh{H%NBC9EP1tW`EL3TwEuZSx9#5ZbV zwq4ao0{1kbt1&uPRn9bG0q!rv>gp{8NLTel&i|W+*jEQv)1c{ac<1PolwLQzs}h2A z%IbB1rP5;TL8~sWVIvEOC-1R(wi*Z$cc9xhRtL+@KvWstpmMclJaG8Bf81djX|$3l z_yhr6>|b;F`#002{(9Cg<;9erC6Itwq#N|Z{D{E9o>y4LN% zd{AJO{SR+@*eVCk&RbNSjA`BU5Dv_Lt8Hqt1t}z{;N2 zi3zt0;j2YU-FNGp17g$v=M~09AI-?Wpib~Lb0B0mpso@&tBF#lF`*Ht9M%Ni=Llcb zCreloT)rT>uhkCGe|@Ec?B#%=#l}2aKwU)b(Sr6L5V)3|9x44T%Sv2AmCj4ev}!eyQ!3Y>*!w6lZ!?OJ37 zU@T3)bmQ*w#ERgB3M*wwQv+}<_EqR0kkLBTBK0jWk(gtEe+g^Ss_Z_n#743Ax^8P@ z!_n0T`|}JMbi^8VT`1Y8&X%FUBZdNdEksM;DQ|Op&%t7$i=o(V!8C88OnPy2Ty1f9 z!`^jt{iix}LFzq5@E-H+ZPr+lnXfAkoC|l=9vuY#8^5nFRWN-wHD$r-zN!Z)-^1M^ z&BeOIGp>r^e_Oj3Fs~Y9xNR2cvZEG~ghJ(!(ioDE5!#rmPnG{Rg7HPHj8j6!{vV+I8n z41xm@9KF>)OmJ-=dwd4n)IkhZUe;A_ZBR_t*MLf0fAai(e#2$2Lp7I z;RsTvU00E)z?ih_;gQIy=re-A#%mg(U6)98`gMVt&+jr}p*ZLHlep90#o^{!q$>zP zAn_Zey)3w^Y8uqe7jUUx5G69#?VFbesJ^-2Nr;{2C?1hy46mxO z2;R)87ARgjt#GjhFC*rWZ;bs{S#?LH793*Z_^$TUUfZv^2VScKzyEcT=yWw; z2{}V+j4>=2AYlxBt$?D1w#9=@u2*4rc3+uae-(j2+=H0Rq?q^Xe`ceq0?ebB+S--P zoxa}(nhUEeT9?#Uzf$XE#Rw|0=0)99SB5c1j%{CJvq1@KEs=G<%HR0P5Ko3sing6l zWW^?wcgF;+|6Fy99x>YeLAL|ZsfJ%e9(4K!S>bQr7X@3p-}3GqU~MYFi@$HSb%(#k ze=QKC^+%=%vQ6{ZG;Acjw$+ic2r|{?4l8%Kq0Dp{X0$hP0&pA}zjAKC({+M)|7VRR zWLNG>z|`4nISre;JM27te(mZ5cP=zYU@P4hiT3XjlrG1yVj!yZon`k@f&eK@zozo` z7jnqM%W&dI*yjot;^X@Mqczjj*ByMOf4dlLw6jb)*CQQ#>N;~Z-22R|&|KK1F!9T( zkjLhnYSNwFQ3MIct_t$I3R=Cc3lmP5`mRCn#8U=FGfhLnrK&Si_k_#eRZw88vKguS zu~z123KDcbHsH$)c*l7!_rWaf7gq@ z9ojk|#JTg_cMS}o%R@~YPbUnT8Y_s-meYui{%+^~b5}i8^{uZ})h<=&?Z+MR|2rtb z;mKr41*uLZQ+sm^SXf{N1%5u09C}q6zLdVG1%sht?crOO0Hi~!ZFXN#3OCtz-Xz0J zX~A9vuXEO0`_#22s{s&Hkpv=6e>d=`K!|kP8#`P+cwY_?3UM<{r85pA8ysiNXP)Pk zVg35A0gg~pMQT?N%L>KS_R@33ASIlQ%m7KNc+C5zFgsY{N>mob(BDSg~2ev=Ke3i(@ zJ^uwl_j!mWixWzyZQ_W$&a)VY_^Rk=3)$Vs`XNGf&D$x--(=Vwwnxl$0CyCS zQIOTLj<~q=sLyyurClZM_PPVO|3_C!RMK^Xb^@pHvdZ|}m6BQcf0sv@`ywYvADi=i z#)p#qRTxY}^5c0?;~rIF=ojTa2bpHvS7|@Mv}%~u)vEoD8Gkbd26bKTJDaD*yRWJD%2x1wR0hHvc zSQ_cM^5#2v{|sn*uJZ43p8zmy1vwzD{>yf%DB>X4xUQImx>zdpy684*b@~nUhN4uYh*r^JL?R=RZ4*fje-}%FN|y*y%b0NluC_p# zp5jQfx+GPyY%zkhUlLD6jEb{KbLt9)mix0Qy=Mjxf_FCjWIcvK(Sdx?cZ&UN#iK_*C*hSC0{N47{skfz zG*Bn~?)&5X#P_b`rx>a#0PQWpU>eiw503mrq?BwIe*gncDE~!SSN8f1PVh7nWY7de zQDkh(gggP!O1MThL`%|v)a3xOZtS>hYQG2||4l+)jdbgVlwDm5t6bUmz4->cP}Gd z(lv5Iyx(BStqxfz#*d*X>p1eI5mgeDICgd6m7!ovRGDY~Q15;AcfruWeV6eI&H5kl zLHi0$7`%)NFMzCp4=&6Z&n-X%J{Al_=)^s@e}Ww(=}WBYQfn~1;D3O&)iU$hBqZ-p z5-OJ8v^ZBeah>%3!`1`CgEPvV^QlS~vi~6G&3EU6vhaESNnTZ5h)F$-AN&yMFBu^* zuqif2tZ<1C`QTC6UAH<)@DvSh1{nIH@%tehw|Eny^3I-xftAG{$ z7%1>oLcXw;Truz036#HYEJH>IVXU7Es4ip~pJarWv17$733=>MjL&)ueGsc$^XLai*D79}e-%yY zv8aSybm;%sx~Q#Surw!4!pcl-?yKDXjJvfqPQ^uVD=xtd5*}a2Amd;eiEw<$B-Q_2 zEy}Ap!NlN4atMcjfE@mo_=kWzVXiFDED81?+9~=DcEbNQMv28iucpqTYB~SWR(&sG z>{(Zg=@uM#*Q@{Rh~Mde1bjrye<7!nK(kbxp}C8yZn-fffG85dl{K3aj=8&Gmx{^O zS1UR!lBtsJV6NWPLLpbpa}Xm8G<{G{f4uqsj9)d5 zs+4Hoo{d#_Vb$r7!xYYH+O95dZ0B7OIX`akLn<5b{;tTrPE;kwRW063bjuctlW^UD z69x_2h*qf$^nc8TN&~Y@F8*(%v5Yxzbz|t$bFI0qr7~(_-n-TFxB5;1|B$O1As{a* z(GznlrcWU{xL$WJIqdEhe{3}$5F~^{(fQXt!EL}1D(Do3s!W&1y3H9V!X1}ZE#4{D zwB<+937WLhtj7J@t@~-g^AG=u^a3I^zVr?&I&)tkET1L-sQzSVDW|aIBY%mB-VVX! z2psD|0=CFZEl~9484D(n8D(X-^I0iIK5;T}SBa`-4|`&@a!`1if3D-oILgBWoMnKw z<8?Lckgu;hNj!=M?s8dyO>o4%gcYI&>?VX%ZxOB6ZSc%Wfc(8<&dqkPVA_bf+gPe|2p)l&rtLE%V=~bGKoQeGH;feLFpXeB4nVG5uX(Iu&bxq|HQ z+w=~FyJ~`{T7_9ZV?*Wuu~&u2QM79M{bB@WwIjoEyu4bY!uS4+SI?^2+qXzgL=}kR z{C^gzsamvObN#C6O2BBsG>J<$s)71*?w!3|_rfZ$e+M0g7uJ;H?DFGgR8<0u-@C6! zF4!X^0~2u*4VMi7K~+HCmk*FIDG)QPyGcgc*U z@gy55*qMHR_RPBGzVp8^lJ5%jbM)nV+p904Xs9Pq-6`F@s4KP@;zC-QD2;`4{W=&Bzp3tgb%5PWM-=F+=)WU3dB=j*l)xCVvsx znHXrZ;6r~^@M1PWDqie_(naB79c&0!@;8jJf3rZYOarPpSWs+SqD41XTf45&m$}D` z49EHBzbI`a&HmbI(iUW?LUM}?1aKYL*5jlB3W@6ee)T8sLTxWBo&*NqJGlFuqjj}=pPUR3K_XT{&r$cmR&&bi(mXUk3>e{`IN7zkKOb&*Hb&aL$ ze~V_9O)=DcX^6I=K|m1!ONEHZ>I_+`Tg7sQ89VhIN2GH{=J~pEN?g|`V!C*E9c{To=13c$QJF(x+YL!%gOS0Tz0;&yvLhK zi$dOK%$LV>^PnqmNV#({WRhm1Fij7Qf0n?F7*Y@Jrj$_gZ2uLZ67%-LKw;pIe0L^B zt${Z%U|36}cL`>dkJlG)=Q81`4JmQ!>0~HV>D*j35OoYua8IWFuUrjd^_Aeb%Y8Sh z6QJtu`ncrkqFbigx*uyvDOxb0;Z+x0JDdAp^zl0Y1NrqO{37rn=pCT92Z{OEf8bI2 z6ONpc@-nG=?OZ$+Ntj}bB`D$!6Jx<+-6CRP^Qdq_u?oba4tH;f2ub;Hr%s<>X+TIG z!fDjwfvf(4_{J;18g->Z_u91xrK$E~YPG)>YlfOV>JfBSW%R0y!r53=Wj-*2AXHM( z^0vE+$qAa4rD12C0VJ=vvQ@fgf9mgR>FYluYG2mXCjZ{POC9@I7X@(#$Uz22t3!$_ zwph1uxk809w(S8l7@UB#H@NAY<2<70`xR6{IoSt_*#B3-)kR`frWg)4+`TJld$!BP z=PNq_Urp!zp>b6T-t+yQC_~!n9ngqYeY>EogWLg4cZZKo(UD${+%ngFf26QHr%4_p zRaSk(F!3;qYrB)w&a`3tCx#>k8iD9Wtpdj-cYw;&=sYF%b&48LNSuP9 z1Pj<%N0EP~3M{KmUHSkT(l(`f`?$tWvD&aEr=ro2xB%-k14;~9Ct=!|{vu=Rtmr$< zh7Az&)P>)5cR7o^|GPJcCBhOW2e<82Mp&z6FHbn_NeaPQ3tg{|7g!iv1Tf z;E^qu>L_vw{-mB;U`&M~Vw2_}^%*eqL*Yv36g8-?Og+i%E4UfdG-&sjvVtzp-ZF`$ z4qfaR6N)O++Y$bF0^v~8ghM^19aI-as!SK8$D9ZcS6zf@e})TxsPq(R2YfNZyUMy} z)?Fynb>8luD&3J&u8mN2V)!y@(rkjXMxLOw&ppp=CA@ju8h^U1qW66)!=$=`ttvwM z&G7#+nh&i42Um4A6b*>0092ilCFdZX*B4D!31etx=M~6}A%yk5B}7sc>+X~XPERvf zWHr8uL05C~e>D}^&3W$iK*p~srqBUp{k|Pu?!Xz+RROYhHiu7j9#*i*3Z7uotGl2% z*Byg(baEzBZRp3lE~gc2-kQl>s;(hG2GEqOSwPBHVzCWjq7pp>HpNRsM5un?x(dLy zaDB84A?doGZVDG-3N4cBcKq&>6mwc^RUUS5FO8lMe z&q<&-H=A`;iY-maw`3d~y?2TkxKx#c3_e>uhDOm)V{lbTKt5u90V))AecSMxyI#O9 zlY?C$e;g$aoV47D$GS_FcBDbOD-^baJrug&Y#la9Q=lfOS|f1U(xPw+#xEywdN8mB1^9OUR$^kL<8uQm!MpStifn9;YXRxL3vW2w z91bLPSEJAm|nKOCnaM60PdThNZ zgWvRBkKf{n-$=E&QWU3M%d9htwQw8{tP7u4S5f59Jw*mmxf`zASRD*5!A7{JLs}5U zBZ;mg!e`F$pqNsW{RQhj$-%dc`&Fe5&@+^PNf8_mH>0lRPF59oSfGjXJ<|U>Hk_|2 zfBmt})7S0wm54l0=@$b(d+XQzW|j5*kvLS)0UX3<~} z+vfNHzrQx2XF$bL&(|VJ5{0p*k{<+OCi;pLU%qd}LlKU%RmObWh80Gp@Qj^SeY(kP zvMILD^5?IterlS~vM@pB88ogG?2Q&Ee|XraD#6)_${ZZ1u{x5GexGrP-(Sd-u9YfK zk|YsnT>xS!NK-roGo`iI_x7h2TvZ74d0xSsrTC1wDoABemG9Tp_I@1`Qy2S0`y(N zUA_G$Xug-`Byk)mQ3q=|O6)peChTYWYq1q+6+0OC{T4k55Uey217z=v?FhjhLxF|+X0KB(^f&rFMHD#sRwfhTO0HMM+ zAQ%#1*#7`h?O!l}a{$Qm14WFTjqa+UfvbjU`_M8=K@Fm4FUFkP5Nt?V#i4Z=+-6Mo zd1@akdwbe#Ms_>)6tr}7$3L<{$PHL9e-6S7Mk23W>SSCW zDlHYaB}y{_TB0C2t>Ph)1ix<3tO!N(T0)%KLf8&fQ7{uy{uL6_P6;}Ya1ur2qc40J z{vbkSraCMT3!*%Ff8Ixd%oQ2pu#`vr$T>n7)*X#=Sc@suEp8e~mFkDkjHgzNu2~^z zj`znc=Z)ojH)9GVf2))@l$2Z6bjUIB?h9EcRj>>fKLzBbhQ`GV{$%Otuy_|SIl}eh zPiF&wkTey@`8~7!_)&dGhLa>QXBeVb55?E9Q>oq^pI|7E0t<%>Axo%01_Q8|P%%0X zZvLL2oYX)9@H`a;Z3RYl9X&Z(5EF~QFvLqRi!tJ2yK20ye;_CBcNhyPE-fflM?A0y zEDfp%QXDwK6`V*-7tEO$zF9!$4I%amw`PtFEJDJ#t$^bENbC0%isp_h65f@Gx9hnH zl_F+>x1NHl!j~45se+-D73j*gcKh2v9pMHgY#iqDMs@$X7)QaQmoh8^c_nQ5p03^4 z-HQZ&k9npcSz{GVR6 z94eN&Q&+;KSRMu~xmp54c?!mW7fM0;7|cv}A30s|QD2S&;MeIk=EOq`I+|HFS*sfb zAp<=OQZ7~S5)~O;)(PauMGqdKLHR;5zSssqmD|i`ep`k#j)X_G&@-`f{-9lT8@&!WjlH|GF{Y4y@ zXkqH=ch#1ajABNSecc|K`$j<{19pQs&i$Ho&q>%9bX)vgk?V%LKKJNzzH3+@Rq_b= zl}|gte_LImYth-lR)HYQT* z0-IHcZo_J%xMj3GkYSFom;Ehoe(7O$4nwGzBn_0jG63EgF%QI7+eToq%(ppF*hrDX z)J>~2OpMsE%M;n_*rDtjmM1vW;x-hue_#wzDI1Fy!~iWT(Fqa+Vkx>mb`qqmroOC1 zXGZq$t`XcJ9Jy^-ilA;59cxGy9oAboIT#VGQMZm@@Uja;Ady3>G-o_mxb6TDhOUeC zpvB56f7Hs5anMpX2HfN={GePrX(0y51dyu)OZpN5$Qie`k(l zYenCE|3t`<=cyDhS6~~7$^(!7eW6(^VNNG ze7H+x>sB>E)raP+$}PV{e~8RtHnuc&MjJ7o^0~k?_J_}{rHZSO-TglJ4&8ML`pWq$>YIQGlTQ$sF;Z}awR0DlEm$bO!d$wtX=4!cGnZlF7FQ6O zi4QEw$bi>XJzB~i6&=6IizWvr<@-PviD`hL{hEOB0wC-6NX9|?eh=X^y{%S@&(e;6-g7VYf2hspJ?)Um5w_q_4K|}Y3phX zqA?h@G;Pi5XP?iaeeztV7V zb^|ebUU4giaVvxj3^EIH zS3FIk<65)S_gz3r!1DVT&&a;xL}N+huA`H@SGi%;%dNkWB>&0lG-Ot?%an# z>pJXD<8?;Fx<}^C;tbn4<;x{hVEZcr*30r!_VI3}NAwKw8BZZbsm;~;ek2&HJfFw2 z?mqFq2i0aoldI1wNBTPqvgl-)-6@U(2<^oLK9clBe^^zMiP~+BD%y-!bwj_w%msKy(vrq z5iF|tf9688cq9sI!Cpoqd8(mV0YkPb#m?b+#MRCcT-->#K4bNXgYtgQRqhupz%U9P zU8)>ijAKq{%o(x z3lm%!ew2Q-hbOi9wtP0YH?`DJ2oG);hQxtX`_qrZQ*aE{2GWJKH z6oPl?bE;>~@rkP{@xu=`Fv4F_ei!rovs>O)!ASG^ws)GYl9R>wvvf>GHau5TzI`nK zDDB0k@60=IBK$&n1t=X#?wS_ti=B}7i|~2NTNeY&LA^!YK)-u4Orm9I9%bR9FzY_y zf2ywvWUNu&#S;?oXO@((2_@=1&9I zAzcoXw?4C%I*pfZlsN9M3hS?oMS40`f4R9-nUP+Ybl)#ZYF?`#Zp5XD76E$d(D%9v z=u)s0EkM^mv&p@4P&ME6oH}A|#8I$fwz<@$3a-4kq9D3prWF;w)U~QuBRE*=zkU%% z>J7w;K`cTSW(|BBj!;{4qcl~n^Vb{Y(lTJ9@rI{W5qoMGz{OYrhe=IJ* zt5xZ_RQaL36lJ2hwY}5DKC3?gd6jxBn*d4~MJtOADdV z7T2?_(I3W6(>Kx9w`!YSF|%)nf7A74t6l0XeQP#=%bnaTDt3c4Y@HFJy=e;F41Qnz z<*-#-mB&d|gul;PQGs#Mbp;T{9x0dqhk=hdYh~H@1hm=!so@wR9Qr-iA1%V7;6M=o z!>;MO7HXoX^r)RjBIHDvA#{!!8K_wzG@zECZ>nkVF)>VXtq`o41ISqEQLFK|{eP)xXi zgF-#S^nWG93ZBw&(uiwLe+eVBjWpIJ_~zveBb^fsY2d={n;;#ap8@=o{r|CeE9F@5 zjR_7;pLfFUetH)t3-~XX0K0md6oS#^52`SP`uGIEqmEzJcaxZ(FBcV_bRw_Gl}kjy z{Zg0tzj9#PX}i?Aux=k3_-@emgzSYrX4!2XwCjlB7BJXi!|-W|e~6vv8AG_!gdOVK zxE*h#{7M3~bf~R#Rk@MxQC(YYJVGj?RREKbv_${?37xV03?n+}TIoe}jc2?*(6c1l@$0DzhgtP4#>N| zzNnz#N!K+xaTGK7e_Tgj@WFo%gim4$5{K>ws1fT1=vbc21FEQ5tr5`CtoisdJy4a` zfjF%f+KOE*nw9&=NvpAY6P>~0S*$d((z;ww?*D(@^f%UQB{Sgf2qQK9QV&#J)*E%CUShF zz2LBrSTrL7i}D;BPktGtfS0-px&uS&c5C0ev#dKa%w^PF3#fzF3tZa1sRg}k&zN9b zc0Sm(FrLlQD2T#2;U(j)T46#d^7%YM&fU%#1h_~@Y%CYDg=PY?d}J6mlaY{GU@NLO z?ygt9DT16Ae{3VZVWM#`cXQB_=1UVfadyq$6VY<8Zyf6!Itm&K=Nmop1a~w%2#O*H zR05#D44Q>WgP;)iF)yGl+Nawpklg9z7j%@l=z|jOn(-!&@~Day#`CfJ1>c@bdbd)+ z_H|6~Vb+^n(tyh{btz6uxtV)4z-%w&z5;-yRjk#3eF5WUYL=f-tptU)_t@ zgh*DkD0#U0^t)J=`{A%}UDpEVb^0>Bqmb)-&p<&d5P@l1LoQVzrEl3{Fe&{87;RY3 z)$=cqIvdxBiZI3dBMT4Mc8XDgiR~&6ehmy+TNMf_81}HGU8ExJ{+c7{>yXERDeEGV zq%dpNf7IFuvAnnAJ%yR|U0gz&t1M)7pR?w~cd9odz$3UT0@JwCth^L^>Y?PCU<=_3 z2I-CSU4;JsZuV}IcW^tezXA@+24a){5+8=JW!L8Y7M(T(F(qA1zD!z0x4RBodHvzs*9fe3|e`gF;BQloL2OcBUZ`$*^in3SvCGxl@ z^;Q-8fZQ3x*ZN%(b?IRZ)ViSL)Us+rZ`W_#ef}4yz*NVE>tM+9%Of(tz^-*upD=iF zgt@LSmzd7h*%)*h3+2RRNS%Ez*J{Xl=W=IMx2~k?P@6Y*O3o`-AIpV2e8;io=1W$-9h!!!+dn)(1|)0GBQ&{tr|k>ovOpcAduvc z&B$Q^!3O`dtoAii-lseN)p||Iq{t#>I-nX{gAu+(u!$BP)kRL)>Il(-f5qinD^5@x zfu-X7s~9HMUZx`NWMeJ{1RDs*789F>@qv41!bBFxOD<@b&()9Bl)`me?j^H1tLxHLQ5=|7+pEC^Tq zD0L?xDb29NoMcl1Kg_RoQ8^EWKXM?Q{@-AzN~=+gR2F1$ya~8$j(gXrq)#hJ`@lQV zd@=e@)<=RmaFwuf-vwl&{v42bAD{_wG0Vo_dRTKUuu_-*dG5lhvP zE?xrzuk8tHnmWBU@E2w-_}bIV!E&DJ%;HkE^yp-V_;Y&+AY`1aZJc zsrkzV^t++Vtz)S|AI0AfvA-%Z%hosLTdyF(54OyFIsOC{SA>9tbO!MD$f*b-lUzqSKwEY5NnW9=KKi<}tKW4l%B;>K}$^-qH zWYH@J>XM{z0X02&g9u{-c_gp-j$6Nu(QTe02u|$P>eM;rXEp{kcnn&inxChV9Z6CG z{_fgt@kO9Pe@|X8Fk-qj6Hz>ocY+`bGA@IU@Sy;*gZ=_-7!0R|^$b;~>RqUa^!c+< zJFgP3ifl&a%_R>wJ^&J`)J4b8T3>2Yud9d}IK;P058(|^ID#NSE$%}0Ue*G(UOgKj z;a!ktCXs*#1BWRG=_Y|#sd`%XqXvvlyv7dJ>Pp(we=6nY;r9`KRh*+kP(JT4o+80j z6}T$NhOXjAbi1|Fv63qA>%!kWM}(9Bl8`jerKHu>hV8Pe2vNVvzevjMQhaoXr^NxynTUTAWIRG1WJMIvaFBn~iaCl$t4k(Ca$0i_CrSRiakSxCY%=DHy~ zq6);Pe^{AW_!7H^{0y?FMC=-En2LW7dhHC#5@FebXu+y-h25~C8lncqsKR1{Cb`1> zl_cf17ODQ_PM7EAO1{bw9-^Q5@e=!g(jlN!3Sbad2IKGL!$2burU<^H4 zpYz5b&Ua-K622f1I`)MKO~5QJP3MS?9%d+wgKb_d6GXWN8^qcJw3_vfXnnl9)>+y# zbhKAFhHS3+aov$os25%N_12vwOTc4}%!anuHHs76E|lhnNC7}jNh5{~Le@iQezX57 zf0S0-D5z0+pipGp$t=_brxXH+F@Ce*2#WBr zf@R9g3K%_ zztNiDG5DbZW0vDTj9weDQN--^B(&5e(-0dN`esQHiqNe7)T|@q(ev0v!Q2I?J{?|z zr;%m`KY5uogE&54%lDw8Z17&BTl*?{W_EF6KUfVn-Bf*yX&zezhL{fQ6*vSZJ~3gT z^BWFTk?D>C4DVAdPfF^9f8rwl#NoKXfVCj3!*8|Ouk)I$e*{*&OxqnIh9BQ<;9t(W z5Z5E*@TDkcmcK0TW8thTz1A*z(D zZhN&;@5L;E+%_8bIXMV)0`}oyRg*@_h63nHA!z>JpU1(>%0B|Kf9iK3nEKYmA`R*Q zp=Ac05|Gko8r?CZyEmxPUo<&j>QU^FYiXJ$(k4Rfsg+aWz(}MxbTxbYMl#4Ch`coj zr6Ns}1C8ZF2Re~R(?k_1Do7}lCW5kK(=@x^)Z~qBNA73f<=!{CM z4GR@^SBwZOQsd%+C%#?uWLU8NdSDvMJ{(+bok=%mlXAZM%s5|H6)-tr&^-c4hpnr) z(2VN~5tMbyt@-;jLg4={>YyIgkBZTg7aUdP$<(L+a5wPge@==Egp)MR(-o_hSDq$L zjS$#_HQ!oS{h5G)!GSmJ$AT3$f_Aa+ApuW2L_F=QYt<2>ycZi*i?vg2}Ae^7u$fzmsypcPO7=`xF8+Mf7= z2hR{zkg1v>Os7|~lfFd<6lPEH-OjxM2d8TOMTp>s?SHU&HD;ny$u4Lxn|yNvjPc zuZRHCL;uUt@_(Yh#)yR$t=Cl^izn5U1)JX;80wCXF_p(-bkh|e%m?;vAg$BBP1u+l zFR&BSWPK5=(?k3=pryqHS0j$bod z%cw80a)AHH_zR+>woUks2*8F&xF&i&hCV~R8BQMwoPVfx$JH~cK+rcd=LHT0hW>*L zI60R@6{s)rNJF7g)nF9lQ0TkDD2zIBB1qks>{5NXVm^Of zQK-D0Qh#@W3eAf$<#n`W@_+tQI&!x{!{a+FrJi@y83l_6gp0-9#0S>1|FGHwOEdXKu4 zVPAJdLG~%aLq7Kbo{UBoSt{eAAjno*=BZ51!hdrwM$~ycwrz6=v7}w%Xmxox^$`1> z->>TjyT&x-3E6DgP7%$m@U<@Oi_Ak?8W+oq{A|`f9Cs6F;TZ}h!B&; zPk$0bbuq`%Z6}t7#ddmgBO<6cKg|>qIWCzRTvt!Y1YvCy-&h7580PkpZbT|dah;Tz z-d*9`8{!}Vokh!_Zs(VB)}fyA+kJo|VYw`AKIEoL=|k=A z$f}<47A0h5<}k5+e@_NFfx60KzAGLT1{-ET(JvdG;_w!j{Ot?upNK?#Hw2m4&vM?M z4pSjk%;A4fgbn2EyMIa} zyJl3N;L7YNh_z#EtP%@74PxnSzla#1Z7F2$O55Hj5$^O0ye$DGuDZ2QYqWe{eZfNF z*+l_=#lYq1^GYprR3dg6TbX%&btm6Rth%x)G-uILnSaDJmbK1GlmO|Qw@#lfKn3U$gGuSCRs{u& zSfW1S$fSO7HB(>HSG8f1^~PtV3A2!%f|*L+!zzFmQuv=pZM_%v?s&SEW%Ej$Q}y{< zXd|>fjCVqlR#k;0rG!FMH9kWs_~px@k9nomMM|HX`BJF0MrF;vzcc&>34c7_P5et4 z9z2GWGxXwDbuf&8HLf~LUiWNJEze)>oyfM#euAtEy{t<4MREe14BVqnu|H$oI>% z^Qg`Koa>)jmHQ$FsjP_!mC5zY=b-?v!mJ>!4ymb8WqdT*VKk3a_&v$M-fw^tG_hLL z#qqrLyIXw~gVGW!W44IC;PJl8zebJa!=~CD4)uFbjwB5nSnWFiQh)QC+~_%PhXa=u z6D6`(?&=t66&3N9qc}Y!42uj^AroCjUAsI@cMBJnM#|HpO%+|Zq*ne`&+h&};e53YMgOux~ea!q1GBgiz;^$4Ag)6W%z+dstzg+OK zQQPE>x*~L21NQ1}1*{J5`@Uu00Czy9B2lW*A7CN(2(My6-@u~F7`7tCk6!NUR^)L9 zNT~bqrfUU#9}=~nXxAfmRc6e^H~Cj9Nu*$0{8u&D?dLU9o_{oMC;@=p6Db7X!so8J zdtMda0t$f-h#+2Kb*=Q)KzKpbgFMPc1}rG3XyRIQx^lc--w~Rfyt>kSd7()-WrI^wPX#@)rx!rQ^z*MXDduLF@H z+{V?{%iGNED7U-H6Uy=AhwD3m6=J+E0x{6^Ra7S=?iYhV{L4R1G+?)(Qt-hsP2lr)>MBorD zX>6_dbuetX6yEp3Rn&liPHu1DY9AgaSno<&eA2Mmb$@u{bQ%yEH*8Q1^j7Hc>vM2X81QKO`()Z+A<1 z6ks3PnSUh)5ml(B#$gI7z7{7!iPE5D!`nQmrlS?I3EO%s1FNrC7grSt+3O|tf>GyC zn;2)RH4c?sKyBtQnBStMBcY)osILz4@KN7goKL??NTNsieSjVORSCAxgs35+il7wT zh&FFZ1?m(mATMYnHwn9gY{TA+rD)$o0%cKe>;RwRC*|- zzf@FyXdr)rXlH5%NfGxYEV4&R&5lQbjF2!MUT}<%9qIq;B<9fqJN;;&p(}Vt+d#i0X$>Cn zDQ`-S${FSesp71E)ru(>;-FyDlz(z)*2JOG42lExNGhGR4_1X4Vsxy`nY2o% zZVi;ugQFuE?EO7HsY6|5z5=J_`6;xf3}`YaB)_#{`t@%pAZV9~1X9gVOE*dzM2_Hb zztpiFY@&7h2dR8l!P!eaauV7!6@~ufsi|Z4+lTHJ8SSA=sf;^@Gc`U~rXbXW%YQ`1 z-4&(PKCBK_-)1H;r?q*^DJ@x+q^_>lT5Eu8LYcJh(qlY(ttHLX61!N8Eg(_1DK{KJ z>0wWSD?$ptwjqSzQyhO_LVx>I#mJ4YAGA%L62$ZZ!vd>3)AuOZicMrFp9ousDvw*H z5=;4)Hd=u2u4vILe`UL6!^QBjsDEaB&a51dlncnAnOtJ$t(`PHv&?(B3sB*5(5q2u z68|G>o^BmmV;MLXSz!SLUJL6@6jwY~V>}E6tR%Dk4Q|z7_BZAS3)eHK$$}&c+1$ux zNU|W&yQVs@Pzt|;zWDBuL{Q3NL}1C1OHguCLXmepPry9WS%quFa-~coZhz-oAnqU^ zF-`?6SPtI)YR<$S@X`AV@sJnuz5&$R0Wo^md9dW$1H$`uAWXj<2orAt!bAX-!SZn} zumUv!$~+`OOn}WXhCKG&JiTL@itE)Y5XA?jT?h4yY7aDA--OV`t-jFmxgm!hp#x16 zWYB~}ML`MCP-H{0_#mAR@qdsFjr>Asz!C5BuAC9daoj^fv4<>Fs2W^i7_GPuF--d` z^Fl3FUH8d?Pwo?R_jgD%A5`A>LeY{7@^>Q*zVcrHR^;&PADZ+PBG}^9te~ogfu>*( zX~5)Rv>Cn^9gLKY6OiA3CrKnAsV)i0tH3Mpc`kw>3B`P}K~%2u|9^#Ng%if3qEpaM z?>#yU@Wy1QFsrhriFFC?v9tKJ$0NB)n5VguZwTPM~`n|BMXaxoXV03M#M5r;AULI`RsX^8G-frIbSKtLgA$4g= z$fmlaTFY4ScyJ|baDRcZb6i4fe3u71AAvB%2MAMqaNs;h5{Qv~RNAfi-h4t{)7|MI z{uLT6DPDZ@<@8C>(orybzWF@ub(#?1QaiU$tjARcMB>uLq@GO%~t zul5}5vMcRJilY58KL|lq@qeZsBmC{iE0zUfk=Z!8 z(E-akXc)v3uS~B{f(QdK>eclyU~;~IaP`VIwd%SPWBbJjm)Z93v$|5EzT0Ni?0$*F zJu40E$5U5By)S}+2J%dXJo=_7=Ob=#_Ll6`t*Mh@@mgbVNlrM8$ezvi^+b3EpNpDNO#GllEJ)IQh`&e zV1K6yOX6+!ZYx8;)!@k>PPqC;4EV1ySh^DGIB76I@)zf8mx(+e<$LB9K<==Rw95xf zlq?y}FuHoP>Py%dErN54m-IPNzv&|BhW*3FJ;Ga6BY!f?ce%5=((lG>Y!H6iUC4H# zpUE#IXjpAtr<5qv7+0_?Me6&81+)tYxLdd^%s4G`CO+2@lV1j}D@+SpT2OdM5bCxA z1CtCW1OwZJj^PXo1}yW2j7YIHtN56-7(C2Fuo!qx2SHo#i4@4<)fE7|xwls$TUSXe zc;OrGE`L#HA(mS=zY4=usyjrq59A)O)jxs3AXqvCZ??b%(I3^(kKu5R`4#<9_wOoU zi$j=Js~sYv$qC)yo?a1F9EL`uR4ttoihS+qsdw(R>fiYPCR~W_=4#0x(X;(AZo58A- z7yjqBFKacfDl}BNYcmQ^`YO)!uBRu$#2~>K_5=VNm}z&3bluziH!+b>JC|s>+aQcO zR{eHomH!729Rt*oo82fTPf%!pS%QeRWNC-V0ZD%+gGgi*_i}wC{gFm|6l+VXQg>l- zHh-Bfxf~^zXn`ho=H(S#?jk_$#NvjNz{Iz4%Z7J#Nh2PrQsdv^BeC?KZ>Xb{j3{xB zue)#HVh<9l(6#@CdlZLU^^a&i#8>eIO$JPRl{jbc@J!&02b@JjC$MoVd>0DI!2ix| zU7;6-HA|b*T-iC8G-it#QfvWk1I(vo>wh+v8_%fZ`*HKk`|B`f$c|k#W77>Kp<>Rt z0fZaH%$;Oym=DvdQpElc(Q^_T+l~=4GWSpE)Vv!DAJSY|qR2tmsW`lfMNC1?Z*()= ziJ=@m(ICaiQPhP1_IXi*UKOxjx^BKm6br!vm9=062y;lXzvJ<-0nPXt166qmv7#AmGAH5Ebkt8E3&);MEfTj zeWjunY(Sme!^DNE%{UeX?Rf*E7^=*cT){=|KQE1;13ndgvB zr9Zfv2v+DPM7hUB1N}5?5MF)CbS!}f_`*J4 zC135D`wOTfIaC1K|AOcM`DRGNSJmCPd3OL8bq=!scT>lMLS07Tf`;(#idrPoHt7ET^}7ZEx$HjBT0*p??yVSo2*w-BTOFwBD@h8@{n}C9c5rOjO`pfHLy1R zm@Mk2)LG^_#A?8T7-o%F(o|#!87#W9_Ss@x9rluZ0kz}nG9*~-tYyTnAl+2qA@2fA zluBmp*x%u_T))i2L(UEv1$BiA$B z(kA^l>)RHzMRY0SFawl1IWel3TCTylF)9bEHm^FhI47l*xU3bjXa8YKrBjIS@Rb`@i6J#l{?j|CIHFQ2Rna_;>9tRu4r5_08E z{W{O;3fDG%bab)%T7N*H0URJ#bGaf|9RHuTQrZZ_M?h9gQ2$TVRZ3-|HLdB;x1DPx zH*#`5%8)6fq_g7WLZ_{9rJ*3MKkV9D=A|kKxf8a&d|ND~pnWDqD;Y2^b>aT{;)rrBX()r35Kw!a-f`4EB_H|{d>&lV#wBRH| zBpCkw?x$6G*B7;WA)O<=yENfd+Kq9B^5ga5zeCg3ey~`=Xsbj@KuVSHmqUoBS^=_$B&iZd5=a*Iz;D zP>&MS2Qr2pBYzSKF3V=>URChmzO6gQBm4&o>TcptDs+JCaS+>gT&6D!70`4bl#TRDpZ7-r_k3-^&xl%lx?hu0|k zx=1dV*JQy%IacJaS78d(;VL45Pr~b8)?I>rFEhBl{(sPa6kX?{s z{!7pdX#S>H%m!c@(TuL0HySkR6B0*f;H`y9g)IM0%fKz5sy~kfPhvbn0`+&&M^D5Q zkhQLDT|&ox-|lX)Rd#18d~j4xl{o6hV$uo266kD3efd{)&RrB4M);;Nmn^0+%cz3% zuNtg`gMag7?PlkoU~w^kT!OH0;6U7W0^;~b!HPkO4!N*2bQM#8PO81`-5DzYtEBVD5X1teyyVRJ-9-x7i)f4B7Dv&NwiQ-i zV4J>Z0IC*se(NJ5yD)XKwe4S{5NlO!=T577!+#f2T7R#>3j6Pszq=vkkUXd&`quJ} z{-0Z~bq!wKU;FB{uB-AaIqfe1ed>Mt;W3fav1S;$?LJvmG2ud8d87JU74XP~nVGc`H7G&)`)Sq?#oK>}HDaEx zZ-44Sm=(tWD}XlXtJS-&m-Pj+!Ta5;?dZYkVnB95GKg*kmvl2ehx0qR`gOTg)GSj4 zlv!C$m_o}1lexGVEi;p2%)S|hK7fA}4h(OjgPNzXhvjQ5A?+hv3~Jy$=-HDzd8&MO zFWKwxxyer?zK>4(kb+T-e?^78w_vT5Vt_odb(FVjkPH z17KTNM8Z7*c4I(0xXWRSXRTrjPS7+TdtqkVk(^~?#t_$Ky)TbixK1nG3Wu4v;1@Fr z?kX0~p0oK-Q*{E=@c%yPhQC=oS#JlV7Z9?3NQFQ8f~4=%G7G}%D=3aL9hch}V1GE@ zS|fe&ZX8y(rW%}7@>NvIo)cL=5McEmV(Knqx_7g{c^Wwjhks(&tD{K-H}z2gS|ru0 zrzWL8?es38L{plk^xKf!3ha56tXqOw{{c#HClv_;>U%7R@$opqS#ek;7RIYf`zeX( z5n?g_k9)26Q;I2+qsdeU#B!>BV1IzjL}K*Utm*2&h9Nz(54O50&Gi{m*hh<ncV#!u=P@Ns+?kv!*WJlfLzycRIsUju7ihI zs9Ap;7{AJ=kw`VbD|eral)a#V`9z7cg*Z^q0~&R5vJM&hF|Jb81;v6$#k;z(*6a?Rp-7k$4McQp0{ zmhUifKH+#>?Y*b|y^oe5`e21i{#%fq@oOTyKHHGG)yplKW8E1zv^z9w0Yz%gORIWH z=n-Uo^@RBtXHXQd4t=fG&xFXJr5fW1AQ@9EB_uH=EUPDUFW!>(y&IjRs+t z1V#!*><|OYZ0bvAMKf@SA|^JOiz#=BJNn7g)d(-3Cg&kqJS_kw3@RNKrflyPYcX0e z4+|AyqXp#cuYaf&UeK6-*J&zC8Z(7N6~1i=FV-9Jat9Fa^V+)VKGmh0MKO6mj>}6F z)CR*GmVW1e>J>s#U#{@7aVYbB*hbN}@EEBv?UJ{u=L8u<9P9r=!uxY_(P79S_+TU$ zh+-;})S(rbDhEsHiNmvXm*7hk3$aTb#y-OtnWJC~5r0wc1CiD0P{14ADM8;i_Y|C< za9{LcI5~LxOToE($1o^}G8AShT5fYxU0@g;tRCQ}LVJ)C2Kw#GomH^AgQSK2(uV(T zVH7CTF`%;A!0r`6FUGmo2T~2I!PHb&wQHSJcNEB;1Qk^UxK7vJJ)GI(_eOJq%+FL*j zj1|^^LolqCxD`KbI7q*%h{jAi=F93xmuFz6o!{ZN z42apQMF5Kn8RHlMq~K)8(CL3S?R52VRrdH-e}8G2M*eF-36t0OyP~{k1-Yyvg&wWl zDdl#KN~PESZXGvkeT_ub^-~QDsh_Ftc@34uY@k!OuiJw7)qrINtS!IQIMnO3ex534 zg;zn^)O>F)E*MJxmh(4@Mqjh+5m+R}a1L;&JUv7PZLvM}IG66>E>|)8(oRV5NfgyTnq|fg6UKiBZi+ zjd=-To@7u5rr&9B5f}y;cTT)3j**K+PbpJ5JV*(c^dSI!3cW?(7%av-I7|NAe>t&H zExu)cMi36$HCJ$m-$eu?Y7kj)K+JGgCY$tX4`L=h|}buT?oCVz1C z{w^xQcJ2EZ%uc)TiXyNG{ps!BnPRX_%0ibSrfn0Bc*~@Uz+s_ShGyaAT^&&xVCtfX zCsacxP17_vDh&WLK4VSOG(9{=N{NFaFlj4-mDPWerj?17#Tgs0h)DXX9$ba^h?0v) z^k7BbSh5Z$DeTkMYP-|1-Q9+z$bX`2A5;aP2+Kh8MRReA@kV<9ny_$)XmYQ8x;fXb zi|ENdiXOn%;x+MErHUyQ;6 zi^>VT0*Zj5(2xI}=pvv9D2vU7>xbDyxyG5wreRS87N3KKZLJi2kB0?{Hn4@ai|huL z6`i0qu>8|^+xVnx0T^s+Y2IE7|yUt>}9#L1LHCufLRM@s?Kz|jWN)PRltG3kK z2*R9Vzoov0q%Yp)K^#= zzZBPnZ&22yuaJ!%evnDdTDtCexK$XsJ8+)Xc`uM9^(^kG_g*7s_NKUt>vC{$|2E;} zMX_t?N>~tPiGojqtA8<=*{Z7)wG?gLX}G2>+~nysX3&`bUi$%d>GCG%skUA&LtPw-@#4rG%fPwv z`ll6}uX%wQ$MR{#1wl6#N+wkZv91WQozkU&*f$=ghcF?M(70~8u6E9anqLdzUJLPHU+j+& zIc({_^!K`lYPpa15BKeaZ0x_^v)__;^&Q9CUCdF?UpX1PP}|&8MPRqV$TGY`>&HA^ z!hQ7QgT0GvH-BnVLnX=W3B7@AcJ9KY(={e{cC65B=ZCPoFDC#neiPmiTRL= z^_5RrD<@aP2w-)|&^vyKste>QeT+zf2Q-k2RcFvNGBqi6u)tC|DO6yR$KgF)HEL8? zA&K<~ynmq@vkAc!Fb*Isx}HKm2N!;htf($zdvrH3D=M_FBdZBGfTOJkA7FJ$R%iiC zm~o=S9-C4i=yjdzGH{_+OF_qTiNgI=J1J6%L8&UOV9G^AQWuGGu|z{Z!aBTVZ!}ac zF8W#>YQdEA=&u=dZS1a5q>;VX)?Shk_M6(6bANn?p`B#F3w>Y3;SaewP^togip<-- zzUg=b)&c`TlY>g=t^#7@x##H8YQvLc?rmw#`YR+MuAB4l820^&P>>!Q6&XNLVWu>U zq${b`uLFK`ePVq*$|V9@@m%bjmy@KGMV_4RQ}foVssb5W#pF*OeEF=j|0i^z`Gq1> z7fGMPqGFZTqFo{1T=hwq7E|Ajj82fg3_hM$@m(jacG28E%8$~WYwj*>#dnQMvZiYp zg=&3oiQj#MAH;p^V7vRh3=tEBTDV6QNPjpfpuu(XT6YuCEoIv%E2u@gzW++6Hg)&$ z!@C=l>?(B#n@uz;Dvg4p?I?~*0s3tV{*=Sdr{62PB zFP-bF>J7He$+@uX{b&o_s29i8Q)Azk=(Tetd5%hFn76jX$b?IQE7wyr;8gfmfqy%b zkF)Lzfv4<)4Sw(X23`2>f~ZK-_7GP}s&!uhW_7{9QRxMjM`=}zrIVd_BoasLbw_!@ z1!Q4*ahd@QLW&%yt`{Mj);Dgig5`hMXgR|aeJ(=+_a~ZTNn*GJ4>?Jbq=5hu`R~<9 zlQjP9`|&4D;K|19`{aU=i_=ok#eWn@8kqar;B=-oby3|-t3ENv%u}H8g>u+V9)EG8-~r}gLl@VY`il#Mg!d<2SeYA2Y>qZ{Csfb0SB+VnyA~lN(mH**SiB&Ef~%H)`I7Q(=g8s?8*Cv zS|ThGzF0OWp(uz9u2M+~dG_;I;94oM{v;#`g;HirYxcl08#}e)e##TMaU&dA>G%|o6r3rvcpQo)#=s9 zBADT2h3k@>0c>XLqlCIndB$}72P3ZSUss8`J-J8h%8+Injju#LbJ^qn1PTiu>#y9G zM78op^{=r=MY^tSH-CiT{k6D}eYvjyQg!f^aC4x&i*3M<+76P7LUQ9p9AMj-laNBZ ziltsE@iYWQ%LxaRT{lYMmf+sN&hAv{&J9-A84wDwS!yDlQ0_r_{r!z9$2<g~;) zmFwijO!8J3PBcKb(!F(_d5M~)zg5yKc=sDLxm&CKmAW(W`*P~iQGX=sR6qsSee%m| z?Y~#%v9C_}PFeKz6^g%H7|EqzCZctXQnAh!I{*Ms4s~^Uk732ajYcFRH+|!k)307E z*{m3dox5o_On)|b1;o`sP>)do-${%K_q(%T;Zi@xOw0v2-@P$(1WkWvDN%{um6*2;1~E+jjRbp>PmrJ{BT&*&7J^FN`~?8 zwE5Lr^YWI^9k1#RQQ&%s?pF`3F~W^ zH*`_S<-0j?CDV*mW3snw0wyCK)MN9i+YPJ3FaP})?)kcy$iuwNot>dr|Ml7ymk6vj zW=rXmW`8tQg{9QF{sO_fs*WI&rbvjM?7IM9*<*?1Vblf&t+7OBpv+!d=~xQej;_Jo z>V`iN^Ve@eK%ih8LM!qAPe5}zT?u+y47(d4eb;SYR2KE6UqUoNZ;e30H1F(EFq&XB z^H-DL$hppS`pAM{x^XacLJON}Ffa*@`9q}EX@7&5>0{Ec^dc9=o8tYQJU5G_O)DpR z{5Xwo%cJwU#MMY*9X202@zAV?kQi^F!MHiRZR@zWSyDX4jO(-#~{)I)uz0FredcIdH-#3c+CP~c|<1G7F`!BqeTP{==_*8_s~eU8 zb%2}Yw1x8u01kNfs?}ZFz)lV0-FmRa{0XzcS40rOKF6&VtIekBKfyc+z%7Jhb>)k9fPzX)d$C z5vqKNMHc26H;Hf6^{8D-jrP*W`flmhKm@Lc2}Zns-~ws)KUP2%I8Q34Q5R`x0(reE zxT#J2+!f#wx58B>sm;cqA|;L2>IxUp`k4L$^jQj(t8N+3yD&cR$CkJWhClwJV$)4R zlaM##2|6(X$%}EMt#IeLAG?n13 z(W#J3nb4}4Zsjiz)zD(0>TRt8MZ2cbT|Ff3^u}Sm!mRT;m&MJC>axcF z6S4iw;aN9|#P&%E7!qd9rKY#5ab$(N77|v4q@D>jMVp0!jA->;FR!1@Ck3Xb3Uv+M zzsW!p)nxv9GNYJ+qxN@+#iTI0gp0@8nbbYC$Q4#Dc<62y+wOYin>!u?xTb#taC z1#2{|@8}N4zw<_Y`P{BXsAn|hs6OEGn!hlP1A3nEx!S&-mfzIi?0>!LVAm(rSAVDR zUP^V+#PutVD5|+e3v@xhIOd+>ADfX5SC(I0WOqczs;r8`08ou-OgBaK1!Ns&%)x!G zXqIv-L+xk50I;RT)ed}OeSB~McS2koV_S5`eIF()X`V~EN;(+f|7AI#yJ-FA06>bC z^6;?Su-c6O%DdCQ(tn329e}{X6tbbd)96F6-UlBx#4&Z3lr!W~1TCEZjfH~FE67$c zEG#`iF;dtG!k8wIF$TWdeW9kpzdC1rppJoRh!WY%h5}SA+C7=A01ru(V&n}0Q(Ll8 zL56^#OZJft@4(Wjo}N3huis-m1I5m<;j4u2F?gJWp3Iy9S}6vGMq zJ>k(EP%*G>%ku`1%}m*tM@*Ch>G>hw_t;Bk5|CC`2G4R0iOOv0RT6g0Ha zWZ)F}&Xn@XlL~O~f>2fIJane|5;w-RdSsKGC;#?M5gBR+pH{!ueRPCfN?Iie0&}$=9m9es-nDBax~)(Eu)vYF^BGjSH>K96@HTR~1L~{a zCsQC0-hVj+AWetMS48Xg)#^*NzQc;~YY4u>bvUKq{jW+ zxT*jNOYWdFry`~fzdl~RD4JN2Pc|q>uMQRry40<|%EO@!WcjAQ(2et$Xs9LY#CJLV z55Qm`=9|3S@q9Stw2Y3JJ7GUcnv9tw(HfzhI+ z`kSg!0)IBKtA9(GpR8c~x2tE_L~k0E(z;0$?1Z>26Ry7N6!%ao*n?8iwyd2L_QLZp z7u0~N9je?uU^Pul0f-U67Dbv${p;}c^nEbA_X3kbaPH~IvFfVh4l(#w9Xis|?FZ=F z8KD0OlpGiH6UyBMM#bw+kTzG2U&gAh-_h6~{eRncS>2zO;T3gY10MpQs#}F{7 zV1M+V|AqL$xC0*%6BT6E1((W~HOn{ts5VP3G<4on8)jFxGXv>crP}RuQC;LuNDGIA zI!PxbT2hhnkwE1#ggIz2tLhalR{`xSpbHx;WbZ{4lli(IA1=khaLCm_l#X4dkT?5v zCPl?@S*d*7p2@e6y8~GvXhY&&03d|ZiGO6oWUsXktSE}!GCk2Mo4cg@^>ao|FYi>E zP7an!H+M5?$INqK&{>(i0Vr?5o~n*k38n^?x0yD0HE;chy_r zLDpRv{zc%Un1Mh0nHVyR+;6injm>wAGe$6$PR0F4L8(R{WUG2S6cn9+=B{yb`KaqE$hWQ^o}U z$j{aWUviD68M&wnB?z4Qc6m=iv{0Y)(-G-3a~A|fjZ(Y~D@eXV1RqZqXn*G~cMnVl z=QP=CnkFYbGXXD5^NpL`Os$3=yB~<&MN}nOzW{Eh0RNUe>U}r0d-S)zngak%V*Me= zBNn*Xq*KGAOe9NxQ?STWu#siK7SDVzMX%3m%c5e067;Lg9p>Ugig#4NXboHB`lEZ~ zr~}G}@W_pSd^)zj%UMcj0e>*Ay8*IdYB3m6I@Sq!N@{Z21~U~y5GEr4l3l?FUc_nz z_dq+ix(qEGdp>Bhwp=GtWQvr1%wlB9$5&UhMAD$aXQzP1%3vL zNPKm&2u%3pSxg3Bth!bJ|7W$~}HSd`U}9fyDjmJLY_mk-T?3P`0L4%Bl0oHmI& zQ50piaHA)Y^k72e;b3L%s~_E~UE2f`pG6mjn^dG-+Zr10ag|N7Fz0sfjxcR+*y89v zsQ{>}e4${K;PxFO&wpg=L?63|FPUm%MPqa}OofL`~zS$|7PkeL8obuDr0;~Lc# zd!I1-ZeF1a_Pa=AMX8_0MZW6+QZ308LAz7>XK8N?e%@905-8P_@-&G)fqH3=BL(*l zPE@A|E+sH{3!i}4X)wOAa5>{>$jNnqYLMyvk%{A9J}@D8*4o(714sgr*3ZJ_PLint z)55*EBuSDax_`8{v#6`Gv@st4n^DyT@%a^o63(2?{v7WE6Jeg{Z}u>>Rc-LS|7_Kz zHi2|SXB3J6nY$MR5nv1Bz7C(_D~oi6XVs$%wNzhq;z@$zd;$e)RRkeIHmTad{|ngz zsLI2s3Vm$^U1R6MzN z6QGdV8r!8{Fw521s_5?ug5}|_$>^^nl%Ku7H(2gHTn~oj0@20NE*LD3A4ISqgOpft z6r=o-X0SsBC*SaoIth07Tv(1c=)xanVL#gS1vn0f&v_*tMAZsR(7qgCX(CjsXrL`v z28RipZhtnUy;w;5e04omTNr>iyW&Q0KUjc8{LR%Cp?v` z`jdb%l781EmHEFh_4=mux2&vawjHb`27mUU86-?Mrj>UshV>;#40$n`oCI=} zGn9zSsf$)mu-!OVC!}6lhVepb7q#5qeW{^d0pL42ymvlHxZD80xHtGUg9oOe6!XSY z0aM#WRTbEoB(HBn6lnbbmJuafg~xU6o>&FR;n4pF2#Z!ZheFer!GDwmXOWx)vvOMC zjeqh{-fA!k!tV70ho0_$vM(qwO+&=(0$58jJ<+YQ7^7YlkWThAwNuZzu{}Lb@#^R4cPm|#EjrFsjWi12zI|4DO6s{a6h0yKyyRq zI~RF-;xdachD&7hXA9!>Y6WNcx`=0-)_-+jPf{w~lUsIK!>`KpRIpa<>Ji**AY3&I z)vAxtl7$Ga%B>CH`EKNJL^jer#}`@!=-n5L)J2PGE!2HTJvbVrl1zVlq5qj+bmje= zu&*N~Gzp`ppCnaaQjVvApi?DDlAO7lwxZDmsmHedy@fP6{Vqd@VLeqmp*VM6w|}!R zr)oD)iXghu7k9o_s!R<{oMOI5;Dsvn1TP z2;wd%sHQNDdxGk|>Xz(vNU4UUcX{ZOsdrGNekRL=bhVNj6K-CJP#DiJa+q9;r;Lr<$Fwc@Lw z-`IhEBl^Z5Lh;)R3HE&EGu04!<+P$pb;^I5sy_u{$l`bd0;FRd{<|GH-<`ucSsGmC z-?b}8z4v_4k- z(Eu?#{5^MZw*cr(uuBg4ZzVFPPjj~&d@4KxJBA@eJcYoB!T75DW+Ji&l)~(Q&O(XPQV z)6)t}YQg%~BuSE_@YRN+_u89)t5IScBYI#RP~+B{ogbAdUtH0G2?$ARkPCOfhtD2i=I{d4I!%F86Tb=hP1G z=4Uz?(p#nQBK1xRi}4~&k%UUe)R=W<5A>$GaAQcZlY?2oINkzfk3b)CC4l5}joH4jKnB%nJoc2;DZj`J6x;y} zS9Rj}bfOVaSAQ7Fj{Kl;S2?OpAQQ`$ zX+{->H6VQ_ohR{mX60mIF8NjX@a{B2lF(YwFo9Wu4~8fO zDw4rr&ro%lBSI!11bqK?4K1_qHpQ+gyVxHmPcC#VX@8W5f&BDkK}0B=!x@Xg3vBML z9!=mk>2S4AMiwSX+SdFbkR* zwDo}o8CVnc2&!~o*SWH_``6XF{~q~-9{I%R==tjx0*W}H#Ym3_CaK6P*18YOXxO*K zCtj+>_kV?3Vpt_zdi8La{yNUplpY9! z17F2~^qBaEP7F=k#~S?#vA6iXT6{b8_?aPuU4NrdrS(PuWpCl%pIr00&GPGsdUrbF z(wvMJtcvtNLNy1+Rp92@d?@Z^YiYtMY!F`)BQQlA94D9)p(glQUqoM0Gfh%1Mzkr4 zUOqEzRHa~(RC=S-OBCi>ED6z;892*DW+p67?yuL%i5`VGiZ1OAjl^js3#I52r2~|0 z^?%+k>^0E(_VPk6E-wiO(;%1&x$GsoNK%Gen&GQsBi_HAaK>OK+#A~gflNhZF7WoH zT+(-d+E5grQli=2)@9Uwx)a^FqY4C90Rt9i;fC&RYkf3h?9fl~kjgqR>te;xQoc}t ziqC)Q!~Rz>>b_c;kcTk@S}S)d#1g!$U4KUb;L@pKpK>3CC1ipL2d@#t1eL)~zNy-U z$;UrwNbvY_gPh^S=lV_yh;)+oFx#zXV_aV%%|gzE`U~uQ5ks{$DLAsa>3gd;P%zx+ zk6l?53Ykp0I%uKpZbbVXp6dIOO^nlAWS2M=tE(5fKMM$vW9ybD1Wxf zn!B@zR#kE^Tl7B?YaWooqzxH=1TNnXRtJDyUxo&XGsufAm~j)R1yabr?W=HrFoa8d zMF$y>I@az>oZ!iPMSVP>lgce!MgCTV*wBpC(O=4yHs!c9D;$S+AinIq4}XC3$E#d1 zarkYEr2hT-OsZ5Jmkh6ML9Djq$P9ol<7eHUQ?X$YogeiHW!KQ@>dU$N!nQ3^H2#Vl zvI9RN3&ROFiAftY;8=~$fls0H#YCBXBrBaV_u=sLCxBFCO z8bF%ZU`jT}Mm{moa|KBtrhoJJ$p_DA$l@x*a=^Y`bC}+bH*?MsPdNnD!64q_C{Oj^ zwg2DZvH#8wvQ=BPtGiK~_Ia&tAsA}vDD9GWKr>(3$1N6IV)+(+RS5=#7iUJFivzOm zt}|>M!HA1iu{x>vZ(+21GdXLsqV%Cco?hfxR|B!j5kRSnN_KaGhJV~>f_s#JnJV?| zs<49z7`gZ}fm@8Ft6iS!NXoYf&i4|nBNGWLRFx74=o>Ho_3Q^S0tr|bY%1{oJ>Vl#PDbQmcg#tV%)_($x*EiFT zd#h1YwrZmNy(Rzl{C{Re0+)2#J5 z4mrQNkHJ891*}K`J768SS-GkzM2OWj>#+X3w?_grx`nBB{-^n?GIm$&%~TcZZQ}2NtWQ4*L0Ud7A}NX_=A16+3F$ zaQk~FJo3Xx%~VmdUN98q>R3g)p)t8F)tNGGXsR0KHYRhriMxY=+HX%QR21U+=aoX# z+(np_oRCrf^_nt9G30*)`+a`JYTS1JL)p1-;$|{t$8y=zK$`t_3!kd`iKYErX5>3v zQ@ZK}ig;DUDU+y8C>lRwq8$T22Gi2aWce@RorHPPJi3qwG_r*OQLhByXI;i zstoB6n2jlAz|l2Tedtvh=s3+>?C0~mh?L)8J8YDWIVOUtk8#sD7N=ci%LXjef z4TxH5KmDIgehkAYCY%gcqj@~@$hSW~EBLX`3IyF$;oYe!aT`+P0oPj(g>V{8hYUTV z;Nd%z>D?fZDKyg6py)7EV4)mcDN3JvE%rZ(TOXV&x=r1`)HNx-XJ}s)H!;rNe%5ob z3dYJ<*pP1CYb}4!Uii9LyCOZ`#rhPfO)W?JsPFC;`#VetUoI1U{%lnUrlRP7&xA#nSvF0+AAeQu z>UERniEvWkIuhfwnB)9KT*SJtuko+}nb5$^OJ6}66;dvL19pKPH z0(o84b@&MQt83XuLO$5#V<2#2XBi*aSZna=-jHG3vTFAlZ7CH*(fts%SBaSY=O8ia z@vGb=o=*#CGMqu@^gvfm0pgVb%hLWj#?G%wdG$v>c7JXYVNh zLkV-gIAedfKVxRSS}74~`zjNMGHdhrW#)kwka6hT>c#JN}Q?|HmEL?8^Th5 zy#9Z8`5t+cf#jvJ6&0$c`z+L(-T0REuM|n6m^$_ym@f}qk9xC5!Wh=`_es6_&^YOK zbPA!NF^+!O2eG&Vdiv|6{9gj<((6LI=R$Jw2GZ1#)usp<--jk52YgM~1&d9+7psM2 z+(nFUeQF|_?3t%vV3nO9Hf3ObqeeIfyMupU3eAY7P42-=T%br4H4a-|;rph16CIG8 z+HW)@Pz7#Hm~i&kuT_0OG%qHM3S4>shf1rkt^EJhQ{4gWLfC)lV`KcF0V_3|^`x~N zG75(3Q^(EIRl*?J5jaBXhTdHP>A_#OPdTbfI^t1ZgEaWOxUXem)*Yhuo>tz8+7^F( zL8Zu)<(1dB80+5}+z`o_+LE3ISl!Zpk_NF@DK2^{hm(Gmk9r*_%$FQ1mVVZ#?~C3F zSba5G>n;&dFd#d5KVYF1T|E&g_!>Zc-5L(+!(uTI!}}{<9};Pwv8%E;y)OB{e@R=P z@0g3ald>Ir4gjYG%Yz?=+C9O^{i%O-75U_ModuIo&#bemVGbJm##{NM)vQ*f4eZG0 zV%l6<`jZ)zFEQ5W*u(R#%4j$}}JEUV_ zp$@tl3CFrVU`YQiQX_o>^iOj1@1;O5+GJsU_*D^=;P+t^t_^h%h`(~%NYQ^G3&v*Z zw^INF1qNw%J6tv4@zS6rHACaaJurT<*8uKTl zDeFSm>4xaz`1wF*;r~qQJ21%jIoykZztiSuhZfbp@F?8SQan{LTY2@OEQs>!vzq-M ztKM;e^#ya4h~Lb(UrFw6h_ip!-gTRDFgox$bsDM0SAYWViuUlvdUtG}20g@xek`nvrA`6xiG9@kQW`-nVqCX5lIK#gNNj!z7Y14y@hjK1wfil zhX-@{Rqd{L>XD30_kqgn&|e+-zBKD}c%4=-CQb=@w>za(aG>dbg^cz+07y1k&l5x< zFVl0>gWAqGzf65V_Nsr9QQ@ll!1&7L7>nSV9H(9>*4=H{?gj(UnjPi?CUX$*c)#<| z9~EriZWTKPVXZmAVTj1P))hU$0s1kN$xS;l#R)9TOpMn-OTc7hJXl{uZroif7<0y3rTpdjq(>n{sXO18mGJo zOLeQWM)zPT^Q@xjs?91>4wnEbCM|8M2lJF97A7^=WfxaG+-=wE4y~$gpP7@kAErJ( zWBRU0Qe?dg=~jO^1rydPsvAX*+E}0{OjF;}=>7I!(8Pb2jnr`7DB1$h1H_}dT8@?8 zkF18FY%<_+Q)mneEl^~kv7=}tOgc235bHqyhppwD?dG&EJh@gU3j+Xr4$ioET)01% zaH*MduXZuC+b;DNs^F5Hx`1q@t02wwN?klic>=9%S`>fKDHvC!S}I|0*#}XQ2DQ3k zb&|HAgeNGO9t3DF?ae@^8i2wNMk;jx5kdSwl-l{aP;>z98c+!xh$9NWQvN6qd@5bc zVT4Sh{@#}IOE`-7AKgh4&HfMfTiIE|ISeBWtGL0SsYq?dn4j)IUyn2~y6BAg zPtBBr-LQYEyqPiXT)ej0(t>Y5i&~H9#<@FAzpTa37o2;>nJfU|Yw&e&9c3%0jTe*Z zyQtoFbo}JGs=Y)NDr|&`|D0M-3QdN$*qFb>Gr6neMN_!@?caEf^XbDH!SUVdJ&nKw zW2yu(t2$v>NFn_*^J=25`8Z7)w8XtHZ8}L_Uz2}zMd-d%;vp&cT6UN<+fU?I`4Lp%4a(Dv`ULf@L3&&$x5DN1zLWHV*^#cmeSXh;TvT*uefx9|c z2tWI)Q&_9haZ{^aY#Tj>w1cSDuUYMd7v!mY95ED8_zRzr=%8<_tFnK7 z6R-}?udlRJRTsu~`q;)$8oXU9`ddYVA=e>QCep5c+p$m_yZgH6n(jiaA#rvmKry+? z#%Q{r91245LdcmP<%+Bvh%fwbtX~KNG_?v|7j<}yCUz{e+MC0!0b}PEZ}>X~TTxZ` zqP%(j-^1T|A5Dx;t{a{sG(?!E67YXg+y(EQ)1K37#{9!|a)2VG;3uKq}BPQUOEyDt$ObQcKC`lLJOWMO-ClWH$|8ReD(kW3oLg6htW4 z2w_<;103f%UG1rBGc70`dU~e38n+%S)Rt|)H;kWUd<)ksKTtY z%lor|kJrHvGsC|}rxIPGAG&{wx?tZH8mbYFPNES{onIOlSCCmuQ7p&@ z?^{DFRQK|22|zA=Rhx!QF%IK%1z6wJ4IT!Hw!t!u?xCi&dx8<4&3c!6PXQT!W4ym0 zoXnJ9P;Cz=RQ`%2VwBmgVDyEuxNIw~k_m%vQtwAB%5#5rlh-BS0EI~Rxlu=n$6tq) zJjTgyRUx~iP5Ptnk5vO?xyy483j-=d>LmY2XD^g0zrQ}(PJBKImAfFgYc4~sk?gKX zIva|JsXM9YxM+VhSM9+4)@1*G>a)9IAsXhLieEq#p?j566-EkCD)15=0l?-SnHsa^ z|6P&H0vfGjwCeSqtfex;?4e&LL~Hb`fC+fR#w1K=miI?t(&4U; zBj(ejl!Ns&b2%|;FujfO!4nAcfNU(6Ug6@IUmw^|Q3MA1@`hd!2^kjCfc`#G0}v## zK{yldc8lY>fclP(2y5UNqfmsu>90A*ebro#;M-Bt*s@J#Y}Qr z+!OI4vV>2hl!<2OChyX>b^d~Xe~^@G=--XANlKtX4CD&PQv8U2ArTDTGdbutFY6sy zMXl?~f2$VQ>PTmWMmd4`Rrkwaff!V*6MxzmfL|jK2(GLsY)0oCx!=_$bfOpmT<+`u z0!zh}%wAa9RTY`q|9~e~5*g~eQ{XF)3cCAfP}R%s7W{fGeOnIv>`~huysPo{w}W5K zNXn{-v%xjJ_-;*q|D#%`u5M$x%)<2r|C@clSgWJ9Bu!t0s+Gu6#j?0M^VYsIg;Fad zOBAPz*;nxHiLcJ)Bs(UuWxrzX{B);LQTN-ey~Rc5*-<<@5rMf})6e)3%K08_iQIKg z%9Z^xa?sTm))+d6e+b!{yU?i~k`k$uRDF1l;C=HK=p?a!_CiChVQ#@7v7@s$7#Lw2a zlnGYlgjuRvD!#6zEqDx=A|9HJ9W~vbZltPlqBjk_f?0DBqD~eBC zm@wv^L*LR{J+0hz=v6)JHvXy?{c0ljKWpJ5n#-B$t-urZsd>VVqDR zltN3MpK)SRs}P-_O>q9wfk4nexsm~5)j%6I34vw>ydf&XFi*S#cP+s{xXAs_@c zw%yvd#cEj}F=*_3cSo9hU#G`5Fcd+<x z$o#N>Ids2&h~G6p0IlC$zF!e7SesvXw3T(QqYJ{?Wp5xuWDw_?7xVgHuSmf-5u&VWP};K?f14a1SHzZRoB;k+x`!6$@0k=D(H?4 zLi#j_QK-(ZLPQytB2>OBjb$bSA^JgYPf*rLTwqy!g~6zwzh7QjgMC*i7mG4XL7`NC z3pWP#Mj03j5h)nVG@%9jlDuH65(VnJfadx>8UFTn-1$ROZT&brDCkU zd&Jcf1#C!2$%y*a?2D$46{Scyg(O&i3xX?cr;XvVY=JHgVZ%<+)c20qWOCQl*(xt^ ziV{AubgE^aNMarOm+jR9*n73<-31;qO)Hq9XH1g*2jD0#6}|df8UL-_`b$NB*IP85 z$k$ci6Wy<)6hZ~r%&KI|*Kk$cTDJZ_Q7NyyRYy*7+8Vq(~fh+PX79mm4F+<0kVqRi?QjVKc zIHUxkv=630E76eGh2_7Ok-n&Z%GBz{C=(6j7bLWrj1UGm+7+PUF$6M3j1&@OuQmY$ zE32(a_4Tw6%ot>-_X6mKG5^;e-HfmOdQsXTB6i@umf-JC3}YMaH0_(i67=q}uZ$I4 zJR~L7?!JK&dEj?V(;>w|Uj|`oz?5vyZJSk6DFK}s7==@+xwmFXO29;am?5^6nzy99 zExm_APHMwir=m^)GluG$AjyCzzHgi^k-L8O2F7J8qHO;u#{r;o+kh23h0N4n>Uq$( zy1z?dS>JxTWX)B|W673nlj2@j?y3s}&Uhl~5-^@{zV+${uSk;b)H9$V{%_DBKOj6R zuR`oPJpmgC!yoT>4ixo&6(qP)z+e>44G<)i>^ekQbYNR$97fgFacoeGna@#P@V62y zJ}PBp!|BXj4Gzi#q$e)WQ?aB2lAoB=9sRGw_9ADLeTJ zRAID4^=i@gsX8+jq_}_P|D_S@I#)IPW6}!tBA(H+S7~8x66>0krAkl-#t~2e#$?Kp zwX&-nSSrDw03-o_Nvp7nfQxG+q~&M!^m~VY{)+kZ5lzd3N>uu~Y~{8A0d?TvIcx%> z0V4sWeWE*AqDUfeo`PekI#(p2S?wnz@!mB{HkMk?s<0faHL2*Dv&3TbtO+);%KhrK z!zW-gu`GAJQHj1VS_NS!$h9lR4;pctb`I;uxU@RUpdh|~dquOv&E50PygH}tyxP*K zZJ&$jRMnVW4VuW=lZc%bBu^f}fw|I1ma1%snMa33P*@l-M$IO%Z6#rEjMi57Xe2;w zE#U}do=64@h>TjcPIT5tFmwmtzF|1nW0gR8`gCl&K0+Ibw(NxnAqs~|kxWYZk1LNU zXqj%wk2Obs)VxKJXTr8_Sxhs3SG7hZB-y4+0bOGzw43I&Rp5>+>f-A`_(!P}Ryi67 z@qb`(IzF2Xf?&o{R!h6vQvdiQofRFo@2SbXS1jUyWNuNrZ_60^v~G zJ%97xNH{B%piVKwo0nX~y~WUfKCCc6q^6Jle)2Ydhg4Hauqz!e z;=1}(2h1W1@1#Y3*8%EjADECM6RKf$SO3_a0K5rOHz=!4h6sk?L|=PG^pfwd59q4q zUKD8mZ1x^&8uR>wTR6mevrY>#%S!G`%r_9L}o4(k&)Pj@|E2f063=1e7@dE31^i6Qx!_)P}@nvaPO43w0+v**xyry8*+0uJr)Z1jvu*Xwsg4 zWZ@XWdfCw-?=;EL2Ud`a2LzfdDCu3dSsQH5mJ8uFb}&7jPgW7Q*V&kCg@c7K@M7)8 z?hrLpJLC3e?f?Xo6YPfe&&0wZ6G@W!;^~#k_;YkK*430|Wqxp)qTWj3@ z*UXZ!>)UnUXII>{1ko6R@jO!W61YEqbrj|5VN3YCXJT!(tS);T)dzN!Nv~5jEI=V) z?B5fdr1$1nFVpPqN~|s@*Hk;PMxwL>gZ4(pNmgXslOn@6-P;e}s#TV!7I+%@>i{_ds%JQd2=u?aaF&q*S2Ns^oh%G| zoFOhSxCRcxqK@r}L3TuEm)Z- z0zUS_?-KQTVp*6W@e`~>Ve$=!MQ=Y=moTb0RGzmx{JRo50h1&ZZ=fqlDAn&SWu0in z)M;4UuJrto!fXR38iZLxq!7-4NDl6opk4(8cu2hpM(uvK<={3P*IhE&+PuL{D^ zQh$_U<|;uh23lKH>nJSD_C9N?8LMnmL=@jv4~?$psp5TbakOMdrDkRmdv7p7+4U!R zuj+=8O5|Z+Fg5sEmkq;1S~d%x;nfxLpSTm0$^?us3^TKiOmaql2x3E-lYL+L4(qC# zk-;!oRp%&Y_AyS_N-nw&IYjfNyJQb}kcpdnicCQqOjw0KBU&BXu3a+=Qd-3ULe7HE zzyV;!*xX!$;g5`9dHxH0s-tJ(jB%v^;nf`+qO>A>EM3b{);8!^6pdXYCs6`?4lNhT zz(g>SA~!GEMIPsWl?(&M!6P0W&Y0EBto1EFY`*AiRdzlhyhYmsC*@yx#t)y7Da5Ps z&}>PPRDqdlmwc4f#3yB#Id5d9u-vW<-_MZf4I(KA3!bpGl!)o=&=s%lz}zvGq>=60 zSPHb@TVva|?_^R?z`ovsvx~qNT=AXQ2yz5`+Q8ZPC6i=-Rn7=2WuU01~{vq|?vwj}M~ z^ldCbgO$P(ESQSmc*=B@Yw1UoxI#ghzM=E;HT)!q1pp%I&UNM{0{7_2vG}bJDypG}*`HHl~9H zueEu)^1&685KLIJu3|z4MIoGvn~;z}aF3&OBqU^ikaA05WkiDs8FNw$(t}N5Q%*|_ z#SC)6H3iUM200`l8=10@K@}-mcKK0HA%kjg1--SC@oS?p0ft+kz{)yw>F@PceIr0c z66(KfHkUT2W+Z0BW$K_e{pK#B!o&)*v&!@)TB z$sx;s!%Frf=-hv2Kphy6np&n{6WB1<(7sI0MKM6KwtqOw(=>u}%yaWUj{A;~^c#Z3 zOE=~bB>RPM8D!l(TP?#3hZ~%o^^1fbH2tv{MiZgsM!wA^j?~EGDg71Imbp=E8SK-`$eKGV|85~~D2u5WF4Yk2jP!x`VwaUw` zn2+_6>AQHMkSegQhm>@brC zsu54p`z-ECQ5qqoP${V~dQnOB0ufN(zB%gq{|cpskr;gp0_hRLbk2qrEtoG_6lKN<2a@NBeV$l z1*YA!#TH!Vx3LmfJ{e?#Lm4&Eg**v=OW{c}Al+jkWDpIle;1x6U@G6-b} z0|W0tnFSyx{3@84%GoZ9GNL75puu)ffuB9Sk;>ZBSfFvQ#gajR`Ap`-6oMqc65+aB@)T{C{hX`Wh{F00bG0|&5Gs7m7 z3gM^;qmA&P$N+Sz!7q&Qw;FLNyo!osfI>ROaan#2c(O~9ZMzol0M{FS+EFAYi6l~IhS2vU3Zt1I5dMYp^ zOy$PcQlJD&z-d&Hq%JIZ@}HR0|GxcVA8p}dhS&XWT3?M+Vx|{VL{+|jN7oGah03h| z(i1fis`U{IKAy z8dY~Z8#Pku#1IEb20;jFT~s_S#=w0zvca08ACv)uC1F&P2R6tLLr6Yssi$4UdI(s?#zCJtMP)0x;Vs8ZTq}J9GqPQiHFte^HszGw+q(i=gdL` z-v1NZg0!;)K|yB^vRcmF6l9K5*xC1g#N#;z1yzMX?RGXyJO^2SK|Z$46PakY+lD~T z8Cwo>wC&Ertwe{NF(fsSagY^GuSPlVCSaU2?Pfzpb`GgSe_263cA~itQL{}i6=WAg z02x$4evmr0SwUVwi=M3zH{=a59Jxd)RrikQ<-AvucYn>kF0Sc{jH-KKV6bq@Dc9?X zLcV%h_-HyzTEQHDA;Ly531=AkhIcPAGqb}Lm?sEHQr;_sTPWR=gd}ZhP+9+Y?%_Y& z6)Yg>>=sICFWk>x7D!W#QhaQ&-pD<2p1)8Pfjs|TzwA|l`8?f)s`oBpSXWFXGWF}= z-KQ}?5j3RYYTJj#1^}p3_^&RIc;BV6O8GaX?;(tiasJ+a7h~Na<0}`6YO=4isV>9( ztNp~7ZlUwza9qEd?N6k_w_VtQkqFmSyU4xRQdS=Q@U9PDMV+H(E;B^mak-7xpdob^ zK|;D?N2r{3XUH?_fpzHQx(X60{hrDNZ@w>P0T9anR!|vZ17dR`c6B8&`n5_M5Quea zM9?%-O;c5WwWn?u24zkzQyt8xDz2ltLo?p`fK_{Te50t)?320~j(^D4F#y^@SvL%r z;;8x`fEb{|FNnGGz7=4hp~z!461dQIrOT5G-K*2))&BXq@ji4%ptjx4u4+LXyB?vg z9OwbwET^+OnZTJjxiD96Tx;N%hgO&9qz9;Y-w48gV`=7$`AbQ4W{L`(Vk6Fw!<{LU z9qM{B^(#djv~J<&Ae_{w*+1dZ)2~W^pr#$!RfTNom5q3LtI*Z=MCgrIfmh>*E>jxb z3#pxMh zEDqQjiowHM4LzzOdb?oskGyQlh4GKoe}t7<7a=DjI*ce0sYgguGTcL^LXEqMH*v)_xzzxZHlx~gK>Zt4_g5R$UqlbrAP3p=TgzzBbZ^Fq?^ zDr0%{p?(l<)4KD7|99$(b@HoVIldZQNuV&NRRreWYZ%xaYn7puKHmWQK8QWx_in*| zx-ZlQ9gf4&L4dIYd3Q~+OxWf7o5~S6-!n!JS^8c%-y09&n*MtmirjX`>q^cvh#I86 zX62+4mF{;J9pX5RBK{}I3Pe=6-g4C9>#)m%@!1;jZL1>kl(f~LKUA}+#;`7u(ZSD`kwxNvcreh#Q2vujHGhl@@sc@B&`MVqtyr#Er069V zY^#WYixGmCXPNWgy03-wJ!I2)&1G8;1jVWu#ztY?DK@L7+FLu7=Ou#hzOO3u*+Bh~ z#Z%(7(2$@EAYU)*7V2^oV*fCtzRR|j2n(2C6Rg6}x6f0dE%*(zetkM}&_FVOF7jgS z`F|_n{=mnVN}!0sl5W*F$BSzJE6|LfV8S3PN2IQ7BGn_3%$~m(lC)Do&$sWU{XT-OD3&koI$s@wTCWlo-{!vW1g)R;2$ULDJPH1?h2QV|q#zMfi1pC~FQC-w`0w z3e{gAqPsyYg!MU)eQSLqxbbDK_uTu@6-d7q|{~h(8^Ot$lwa%wL zv%FKdakBb|h841Nu~${)CgPEP>V$xQZ^wu)oB=d}`qNJRE_52IzF*~SMWZ+t;`UE# z8(!6}wNk5?j|Z4fHKGQ8e$H*b>W;3$61o_xr}$S;mSMYlyyjb7nqh<9bpd&8BT9G} zLtoSQYjsjnd>%t|Zhq9YLhkOsgnwyLN>Ji_=a6XG#HlaI(06mcPpGO&Ih|@XV@pr5 zSo~E$bydV+9bPyNr|4-q!UP6*)B5+BoBrag{pvVw!sr{X_E({Q2hgqm6buGFk%QcG zq^~cwo9mYiB7m~_Mm(*wu}!ov__-!f0f_FZF^b09?8c%M_jPWWw)$V6@mF%Zs+QKTsqt{`wNthzqeo05NbRJ|m+ zQ=@v!GZ+6=Wo{>b#JuaiRB=~TA8@gMOg&zjo0n$fRpixyiAeMGO3v?2$K;yi`~Koq z)di`e8jH(%?o?D6Uzc)Y7A>@{-wLBPZzuppt)rm(ET)gw8l93L1oh2lU$?3bDOtw8 z_s3+h9`*bC)kQ){pcDpF#b;irZ7-E zRb#u=wp7ULf;^}iXyF=6m=Pugjic5Y8dV9qU?T|bE;LJQQjeO3*zBBDx{iX%o_2 zlR}LdYuLTIEc%0u!tWX(h*K{0h8QsKS0Jv2hG3&t(qX?UK&Dt@1vNE2EK$V(*zmhu za|9wSCGzBic^3>qQOMrHHm)~x6j9R$FFt<>rhM&x{GdHAt}OtrZx2O^94r$Y+N1C; zIuRDZg#3XcNLJTojEKsHp)l*Z)6O{ zb^TJ~n5zS1W4euw|BA53xC^4F8pv4ER?odI-wpDrWAlg3Z!eaN@v7r)tf~swp8cW? z`jCu&O;p$2;{xn^vJsqJpLxtorcO=~eqIaPau{*uab2@T1j|wzmV@rr8ixH)6lRBtPz4Af7-QkOB111B1Bc8-3`#*B$ryCR=#h3 zYF%aD-O`;2n_dB02;%oO9~F93MXj#Zy1MJ>?W%gN^ZIucC)0ficrVCgcl@&BQdenz zGZ9}}wgyM_O2FhqTLcA4Bo9d=inD`|?*I5hBGS7<@nmCFC=n2YpXIHbN#RNjPr zpPgj%|1u@DYu+C)t)ti@AydEnp{-~MVE0Z{7seIxLcHuxBkkT#t2QVb|GHJHjT(^D z@;k1}PUKGDX9XT9ujczI4q;`z9qqY)bp9H2b+5R>yDn?UT~%uC5jlTCBzWz>RfY%} zie&s0KZzsU_*|F{qn5f#Q=!t@Xv&rg7#u@71qsGPj3ql3$9j^&*7GwW4cns zLHjgepa!2ngXf#el}tN&rcXuqDG%kXP|@x)-_ znS8yK@%xBrV#f_pp?C_D`uVVKvl>3<;^D@D@T&lxWZoblbeA{{aEv^j)JP@c`=8teMf4fc&M-|@l(R*C5o}m{OaVo;)_U;JjlegY!lH^9$80hkai)L`fieWu zjEsx@gVk>AS`X?p6fUKP*S8gaE0baHHpQEVnPs_P+TgF(?8Q1Eb>j2v++$2C(F9xH6TJuXRm#;VYJ}11 zR(PM5_Eo*y>nYkW3@MWmVShptL$h{4Quo|nvK%t-3XkN{i}>id)#vVikItX`jJCV% z?8?%AQ}y$nP#-~6YlCy^YQmuT-%}%Tufij158$A=9;|gquw1VHU5Mxq32+C+N&`Br&mRK^M86mMa5TD zp=~!|4C!EinjEaFzoEqVszFyp$SQ?(o|2Fg#z-~aO-rnU3}LgRR?rH zuh2=?AChJg4Ez~iD_E|86%yAj)Lai3zQjnxO?Ty#zf&0gC`=nJaxhgf_2C!(lMZ#e zNH(e9{YAq!;8|iIrkgMiB!AC|fdDmKnLMx3KV6vqYXZi5@>OJko1;XoJ4CQf)Ofmb zW6cu{nCn_Dd@q{hb_*3@zd8zVlA)`Hh2+Du6%LLv*}Pu`4<-QZDnJPG0+*1GDpu?3 z{^a!3jtx`mAj6K?_LhQ#3ZyHwLFiu{$lnWAg2CJE=-TjV|6M0jVt>$LJWtgXaI&@j z)Lm8Yf%mUMjPDDs)m!KnNf7!+)mIHn&|Y+rgWzcOWpdr#WXM(+cT8}zf2BpP-;IJ= zYxq}p6#75URtiGvf79KwfTQBNr;S}?Ay7A23I4wh(Hy9m!7Sh156($fA&WmtzRI}z z^;M*2yRpkvzbFWF$#S zz-3lfNP2zws!#9#Wh2~oncs?(R5_yNeSZa(y}cRBHV13pZ|HN2ts}c%6$kT(^0LExRZ>anYXT8` zUez!)0T6BHW~MIi-uU++9B}Zf-LLP*=5IEpZcRuEPMf-LkSB>%H3pxR zk)XQ@;wcIn2mJlzfUuGbF{+tdGXj4;469dfYv}}*bAQ_Q6}YCXS66rq2dZnUtS&~o zt|02#Hz34(`jE}3uX<>@j-QZ<*QXuKR}5;tvd$)tqWsl*+7@*MigyhS>i3_R{9^hm z#IW;GNng*J-w%hztnS%a2sfb23{qz|#T7eP)GEiiE@f_5f6dqMt*SFz1oc#EpY9c9 zEI?Yic7GZ9)hMt$j6igI!RJ}KtXg?uP)wlQ_EwyM9pkDnyU?XaTnM|ayd}_VK_L#L zmi2?A7>X#yW!j zqW%hZTLlq|`|LlG0IwuSiPowLtw5+DuLzpjA%A3aY%2ZvYMMz5W<7i?mD5e#GA2y{ zKCNR%bo^cYz#<$oaagApx+#L2UnLI|ShR&#IZ{WYKX_e%gx~uGrY7^9e)j*n>l&7P zwQJZyVQ|Eqprf3<4#Y^hUC;){LadH-qkp)9((%A6}tPm;JpaOh_-Fc+cw9S7=~9{ zpsy=@t6w=v3O`p6pQS+qU%>L;kR|%jwEgSV&j?x#JbvUWWc2||v7<@{Gk-)1 zaik6LFOuukt^X(#$j27&HR2(?zC#!j3_Tolb&jOIXTiZHS}T(9?~A{T|{Ny z+O==od^^`62bbx}{LibqHQe2bWb z1{a|U!FkifO0Y>1hR^Vru@tYy!n@y((IgyK7JmT(K-q9* zZ4GVxIb?mXp!xcCo|1<}6nCTgE2_P{0|cR>NK+8JfRYk_subq!1?KQ=0HA9tMr&~{ zq$jT$XcR>*ZdE`%x+fEVG*JB&)kjx3%U54ock>_--PUe~O;OGqhnYP^veAS47iYjgXE9^Ohgr@UpiW7Z7XXwF@L@fa(GxC2wY?7 zYi>f7gZW|;voVqRUpd)4>JdzWEP?xfIxs-L8t;I_fq;2(=O3-T zj@cwIhsK7D+>e$wxTylCO{N)`i++Pl(j-m1h^eKPs(undn02h>0KJgn-|Qx@#o1c2 zkjT;oY#DVkJdelae}5w}VE*Xr-`eW`%&ftZ!3aB=iDq~RsnVE92liPKZY$|S!QVfk z1v^l@RR+ld0cZN>>+brP)>mFwVVY6}{Q`!|GzSu(&}7i$ z>fVBeFvg8pmVaqx_uZ%&lMT=tSB=qon@_72(U}MQ{aiK{Tz^L!EX1Xm8*D8V?;^Tn ztqau)@zWS~iZ~3=kC?J|yERiZ_e!jYoHtjP3tEY6iTSx1dB~S|hk^BtR*?uBxr(gZn}alJw)C@}LvITG!i&?Iv=m z+5|L-oVf6i+<#Eyko-3I;jtw$mqG8l@P0c~LHZT)+HMhcP-q!ai{hjn_jT`c6m?gT ziLGfOiJxMDF*T%TQR7?SsNv*USW0r1&5uO{4e+3LJQUw(!wf!UTx2Itt zOD>*a2iR8L2a-}o7Dv)YbaCGeqz4fQyaaSLGp{vd;D4n)oz9x?Utc9kq;=yt{8x^j ztoi=Ky{xaAFcMPT#!n6xZGYTe?*PD<#r8Z)5yhy#)%!=k|FnYCv>@q&BRKZ8>Uhq=s1#5wyHT+}PycfUr9>LA0)>EsT0(Us&pH zT((^*Qq}UOZ4YThf2({mP zd4HIN0X6^Zxhk4Rx*Dhd>MpWPc`FWlHx|5@rj$juY;)T4VZm!fJmpmHm;D zk;xE{Pc;h0D^@pVm6(;HVPez==&;|E@Szo?LD#C-pYgd)Y=yo53M?3wQGb__;$fA? zv#>{bQ2p)cpMOF87uQ{380@~k=l|jd)G`WrcLTafWM}N{? zafsZxQuN>cRugac~xb z!WD{#x(_2X27l3XsJWc2MGsesi}W%OZqC(rf{ZG{a&-t_xhj$;!YfDQ_#@(|64+4A z-Yg0TWVh?8?B(S3)C2vi?(LM)J%8BJ*NNTtFR1=N2D;$&y+it46?JD-Lo80ERupOO zYPmG7IwFQ`Oi|Ak-6?ooM_kNcxqHrJw=lnMS4q3~>d-hIR^t~}CWyL%eL7`wcEtDA z^UY*ckj`t97TRO=1!EJ`SFU7iU1IdCV1P6IUQAU=)Yk#u7(F!xHKPnXpno;;$Ky3> z(uF4j8ja;K^mfWVQ-~9qHs`4(n zXghKG)9>rPS{hg)$gBULe19C|S%%&5nb%&51aX3~{q$f7imblSD0+2)%;Z%u(ArktH=4@nx9h#jI>iALp08t(BHN{-g0sT_f!&*aUa`xL zRyoB7cm(`^E^}kdYwhcLZQ%f$*Gyk2mc7~*Y!rE6Dz+5p;vp9&%YTvTyXHdL^IxsZ za;N*524i2fv8I}^H*)gapHI2!#5A|DuPX~gWR*m0ghphAzOOe4CjS-zi=g#S7f4vX zRMl(F6TFbz+4;YgWlis{B6yFqK6Sn->*u5!H%d{mt3D=pLY>6LPT)~|nLQcI<%Qt9sBt^<Nz z&Dl{(CVa5g!=`Dv?$g}jysBWjOAuxf^yr^D-Y71L0u_O4@jnZ7)>UPbR<2y%-8d|B ztQdnfXa33UKs>%IiW4zE0`BTL(F*CR9vxvk!B2QSe7`Q}*LO9rtdc@~GZzhUS47(i z&qZlaUJnqcu766Dj49yJY11O~|1-Zs$Hb1nNcUC$1(Kp2zt@cGtdWWuU?Z34)PhUa8}LYKC108JC~4z51J@IF=~@gg|@0)fFY^Ns)hEaa|h=p9W=`hv?lN z0iv=0N;cs?`QRkAMJLu($KYME{%#bz%VcCqc1g00x#(oer7z(mQ;0>}=UTfIZDw;J zow$GN=qX;nU8T0bF0pv#wZ^h{o=W<~*nMnV?DZ!q!?&(X-U_d=WnYJ7^v+9q&DIKO zL9BjXqvXV?>3@G6w8Z!1pOsv#WKl@EP5JeZFD%u6fq!M7`vkf#UbXHGCNye(bbpge z_4~5(8^PQeUqZP2RC9f}VdqIaUC!Nv{}xOhjA1raJzbHNj&(q7%`fZ$kM{$N_gxhc zB(Tu*0S^Q&jIOURlyCqnQ&k4cS}`(y1jhUR9j^wiDx`n;``)4I_t{b{c_G^Ozp@lg z{b9(F2#JHJa$lFDx`$|<-%ws+dM<%5E8GG* z!9-?Z{AquU->PK9cOU`Q&P)kpJ)Cz6`Yc6TU)>{(7o*~#+7BZLD!c4W18nQ?D+};9 zqm07CTd&MPRn_^rI+cL6iG2Ow?kWS;=-``|uG+NSe`C}WQ#x-JoeIQ=c&F5bXj#&U z1^kLuDV#Gj9(R{lqpbY#DKR>E#Kl$L!J{5n>$+R&6PAsX82C31K6#kE8W0`H0 zkRKLXCy_zzN7ZUJR{b3Z5?Dp4|MyJ2$kHdRE#t@g>qKq#*B@>Y>;7<6oSk-Xk|Jx< zYr5-|e~;3w?ZK(k!SIZ(!^u9?)jW?1^S1Ow!L$@+42$Bcq%zW@yJdPn4z3F<+N~+` zq&9z+I*?0somaPa-V7*H#rjeX)=Wx_DR;$Z{~czv0h5+xmpNMBi5y);o0?b>a?Owu z4A@^60SiS@L|;mQ^w+FG6EylMS`$~-!HpFY$(!@q;4s*gvkvGDd+ zh_ErqgO8!hi=wLYt&?M|Sd_y$(C2LYF=*0iaVfnQo{YIEPQQ!H-`5Lu_`)z~-l@gt zfmJpmWlz*VVLvwX28Aq(5S$xjT*fVs+OEZ^VV>tABZc#2&YTpRVWDW6{{p%<>wc9_~FFp)6B|1!!%9(60BOC|Mjt7d-@k)v7fZs+h-bkbMJy>s=`#_Xe*Zbz@Q@i z6*}q|^EyMUUW!b3%hfSQqWm?rkDb=sRf+iimG*qqhrv}{y?bG9pj_{a-gf?VQiRiy zo+sQtV&$8Eh0QHvlXaKub-mLfEN*|gZWbgL)pG7PjYvI`*&GI%Q5k0mTR4Bi5dMDz zQCvX8Bw2KAuzNaCc44Wm4fwgfbzCCgDqSijepl_cMgCVn^N^SOyBLHtnb@8vfL!0I zv%mp?b!6}3F)w&l^n2)F%JooUj^>PsFPEctpns`SI}=!%1-q&e2A$P)&qy^za29mB{s2*lrE`LK_S0k>-xNd({zJTZL4NqK0 z0H|s?)-UpNr~FqxR$Kp7E<=)Q2aVcwo94diz~1=dbs~~oHc)v6_V?~$bC#gWY>KBx z477%0{b_Z)`W2{$CLvys6W%6A8mM2{D0JAC^i>>4z=V;zS{QA>x@-H;Zc%q7%&}os z)1#NZEKTD(cUtBslZJo9K$JxlSVdmkn53lKTb{f9GPnYk$v_9QL1I(BuL>j@90e{8 zdbHTuZa-LQaUe)?Oe$Cu-iN@-B-pq5C=pfHkd>sWz`gTr5)u*;Q$bH{=1qALV^$v% zkgea&r`6RHvueJn`sVKHd6W>~!?ze?-pVE;u`yV1+wYdAswoA#c{nb&tiao-PzM$ zWr1CY9k;-;9k@MN8jd85MRqJx$5tVSR8(i&<47n313Xg{Uisgqs4+cpQNdzE;Og0O zyY*EY;I`t>7B^)Zb z{_4-;N;;1!$!L}OH_q$$m8pnUckqpqS!VA)t;W)q?vic^k z-dIULHA;+lPefYl^i+ULSr-QP%K(dHCv0xkdD~7ikZ+r4%@+z6c2gbm{W5VjgY^{^ zN$RRFdJFcKBK(Q}_gBEXf3n03!F;z`FwiFHMf4Yx;{VgA7=l;WR_TwwLBOf7aC3eY zWl$Edpi_U+gq0Hw z-=x+->0h~fTJhYiE5E8TNnmg_Rb}(@f#oOjl(2`q0f3ApMLMqx!CB+Q`fE|eVfY%o z1%v3~+6@Hv-xX!)UO7@#=HZcz)V#Xdq!zBV+14KZbIW$GJNGy5;F7Bf+<(=WB7TKa zjoba!KD~QY*GQKmUj@4^nwJcV0Vscfs;iLgY^A!EM=#0~LG75s(Ah<)s^E*E4ormM z-ATQ0_4h@8ly5#JqzRk6$^G^WEW4#Ku=AbW z$?jTTd-MBAk|cg0DKaWalz_{(yuB;+Hw9aJ)%DZ)Efwpsy~fQ|T(R&_5hbI5vK^-1 zj%czDKh{_5V>JG=z_>pQ}wl;M_pfqQ4!zQ9TauVVmF(+v_r zkG0IS{*R;iX9cp^yYi7rXi|TRmMbhLcVrq>Bqlg_#y?ozdQt^hR@Gddq})>7uY-s{ z#7^5VN}OEN@Q9t6yvuc8!W?@2yGCVULi6SB%o;RxhPduaR>4?K@pf)%Cond1l8GOY*#o_fHje*xOL9cmixFRoa+|B)jaTJS{YrlWtm#x+y7N*Z z3)4oMrCO9c?Dd&O#@x3=TW#V?3coMdn9TR|bg1i_RW10R2%10ss@5qgp#{2?DS(@8 zcHeltI&)d+sq?x!#LKZIPC2iV*0(0^j4_g!py7c^#!f>H5PmapBJQ?HE{Ptmj-Pgo zHJV!AzvV`o&9jPDk->k#y<461t?l$z$alN2wh98Mm+F(MS0xmH_BCJs49!Q-3;*BP zx6As<#5@kvH~JXGs`HN=Hsm%OH$BFPmaq~npUEj8sR&CZ-z0F=RwO@1J7G;*qeJ)w zBz3buONgr8iO@bU$dXN->096Rxap$&u}H=#{tFeu1!=`sLcf2Gq@YlXVK>ZWj?T15 zda@Gk*T3<;{!DV9ekkr$6TQ8v+7De}#*R8gTgG7at|W_#IobJGs2tp#N7#-i2t?r4 zrl@+|Oj;1tqBXnAst}Y*renbOI$am+!I-*S9G+*grmN9VO3U^a5h@i+NT=(Y{bBl- z(P~o`S&S*>u9*^=qE zCcm$HzB+u@$P6Zs6i;?g|4H37^>(a4{`PrmKD(<@Rj}~%w;n%aVuDyQ=$MKaJZ~0+ z-?c+$elFvCIN`Hl+sF_l8g2s({zrd8?uUoyDj53HI1hjEkwAk-Hll7fbx0=6I+J<` zJ6i!anDTmjwzc1~!ibHuI~tY4{Hvg|G|9K{VtSi3@*q8Lt*d_B-R?QY;HMlhOa}{x z`I%5>NtM(=y9r=-pdqV^kkq+@T>m>S#z}cP6xDfE`F9nCXI3nOntT*>D$-K>1-ZemLoyiZx7Cbt-NVa9etB z@Qrsh^8CiQx(UOuT&{a=n*Sq692RfmRa!Ie$?!u|DX8vN`*3`e{&<_Bp;vjBnz_LD3O|f`< z1;uTuQL5EIP>#;EDNgv7m^J zMnQi;pQ-V?N}anjVj{tUK!WlEURKF=U=bt{3U7QN*mNFT$6S@w7-C-^J0<`#hu?K= zO;lg>U{ElTBiA$mDMBwe@L}v!dMl*@(df@5aZIDiG-|-2A8|4gx+$JakL*lN`EA1f z?z1O^6ZA^;Mwji0t_kYzSL`E1 zZ;y*B@WZ;W?Y+tS*JSwZietGj7Y1@zCo?ESm&c#Zp+y|gRWvi-7?jjFMFs3C_TM(w zR2SpHiw5wQiu6qGMqo-JqL-H$7(jcnVNic4{ak^27~^v)y;qcN9DQ$Vi1J&hG~9Jb z_}{&wqbwk4s&=ITb;{nZde@iNQn>YW_=P1^%iC=opcpMg=0k`@MzTe;$!zPedrd-HVy7b# zEK$&FZomFiHTgdU3nV>i73RteR1*a&Jv&E!nT{GH1~ypMnsvb#tGt`#4ys2K$bC7a z&0UN(&dPVM*i5~np#(*f*>-Nf(YniY+X;YehzXgIg`^(>9990%Vhbi(yB50H`v?uVZUT`)IvY z#CApYBKm7B|2VF10kox~EjQcdvT#-Uc)X)49}9jlPe1T=WJMZABjmPspgmRSE~7CV z;spq8e%c;+FJ8mVQ`LVd>`BmcR}@exO2Dfw$k|Da5UP6%2m4%I@qEkvOe=amqDV&1fasuiw^B!g(KR0xN*slAA{NMFCeNWs~o@`8UV93*|h734fM*%=;@ zY#aU*++6|54-!sVT>KI~*=eO5;=OnUuBZRC#HbAtvLGPgA(jY-ARgb>_el~E2XO9@ znA~-5+NTn>>G9ee-DV<0bTnG}@lO+Rp;cC!%(HeN9MLvRhZCg)PlWgCh-ENH-l8 zR2Y!U3H3{PM(F4*Qu(@c%+g?ru*p+hs=*6z+Ij)le;0XqYQasbHn(8`&%{FI?n5dK zP)+T}bg6*8i$%Jnc#Fu%S1+2g$Qb|A-S4hMR0H0gmyv%GqeYHjEVV04GFM%R$vIN` zwOyAE6S8%&iV!m@DR#qD#2cAYJFY(M7rb!`cN5s^lQA(EDvX!TfLoSVSNftU;T;a# zhVM5Ze}rn4SJT%$2Fb^1d(hN?l_9p$Y1K*}?+FlLYBg+hK@wGz)C#rQL75Ys<3u%| zaS|8Aj9PzsPT|K{##$TNfp$MWt^VhZ2RbqSAdDYY%tK77l~K5mLtZQ8qSKK5oA;D} zR#Ay7<@%pQ3#i8?W!r4lHo9HY!Q0HE=2*wI7S>6cFKFOH!cB0^ghpMd+WNNrs+CB! zs*WlU^NZp_(PZ;j``ihqVSeCM1;!g@x>Jy_^;#eJ_d0CxE#nb;a|Ze56j~iYYH7r|)!Z-q*TX zA60+q;*Q;3-(?>QL7A!ZM+Qp&tK_;C+*q^mtAkc=x_3w2*kUzj@g?XhNv`Tj_r6>~ zU3dw(SKwHpcppKXu#s*DXS=H+DJ0T#LdTccNyoiiO~>Uw9QR!9>E>U@&vd z$dS8yWN@QDyyH^De1~Ur1K=hnqJUss=i>d`aM9A;+Lrs8R55AY{*=kA&-`6n3#g$N z|BFGy!5hFyc?zKZQPm~L8>@y>(N*PrjdvhrwOuGhlrNAoltQ;vUo zz`Djose>`qifz>8bcc&Ti=kKW=B_K3VkXvQ4^GggbqJr6J-tWi$W%-w6QQR13aZ zF{7jTxl9D+bu<48V50mrvk?oH64FP$9Yhis{Dsssn=lWc&iCY!(lp2bB!4t>*8&UjXy8d zbCPA!^Pnd{FST$%Y0)eqH6HuwDkiRi-Sw~N?(C)#t;`9kGT;m9=vNY@qo8TXy766I z6Rge(D8?-lHP=Sa;0>;B!UEk0RscpBrY0d3m}FiZbu%n4YPggzcN%}GPwP;PFJVzs zOuIQT+*jqis{@f2eL=^ruLOJQ6jt9*P_w?^O12J$VWcoR9~Vsq7!?w+u)m4+jaPy5 z-fudI_yoZHe=<-y z)fI-uVrT>QW4W^oVo&QZl)s=PAUw=3Q^n^=lK~%sjSy%RSr`OGuQAY=1TdhTMmGvj z)F6@)WOx8twDo=YL3i~^1Odr{H%hrJK|s}7E^)u*!P0MA=c9kzh9jxx#!Y-xthp_} zQ7iLK>YuaaAMft)l5_>E5cNi&RW1yF4aD$(^?${^u7WTh(2e7gT?^Dg<2o~}4OUd$ zrS8aYScTdmOL4S7X<4E;YILdv#G8L8WICm{R_(HxY;s3JjxVo~}hr!hqI`2fb zr+vOEPq_rHw~c?*NcYXyyW#WYl5FgEuQ439@zw_$);x8sP;G^4a~QjhLYp^S@9s#y z8uhT(C#*hTtj(g`-Kn|w?Nf=1GMOak{lNH#zf6KG-jS`jKAK@nE7n#TD z?bF9BF{!a zOPcJTS6Y8HcC1)rNtWCncd*-ZU$_;1Lq@^1mi1p8KD>8a70f_BxEwoum6F%Us-ur+5_+aS+MT~_uNzcc~v7AW0=ssPKn7Sx-MF}_PlPHHbRS&cXf>r3QjJaYXM%EDUact=AbA1C za}bTXMD68t0h=z8W$@DlG2C!bk?=lnAs)qCW}6z*j!oFvbr+K772?5Vkp#&e#4^Ad zPfhKkuR2PL1?i(+!pQ9^$=Mh7-mik*@U|oj1a^OG z1up66eJANJYC}Msj9dL$)#>O5Ue47}#)8tjB3}M1K5#x+M5c@lKO z-w6m3_!3pFQ)D@8zV$pjl}Oe#e-nQSaUeSp&ll%Sa_aGmqRzkERl4jcR{c9^$5k`4 zI#7KT972rOf3Y{Hx`DAxH;4=U-NJt>JZM1H7?NddnA!$BOzstk@2ZpXT6 zmMGaVC{>zU;_S6Uy1TrWvwzxnSD#@V)HPp%3IG{mgGX8SiG;|m~+O~ zADMg}2C+PfiGsa2_MzO0D-Lv?@kML-cnm3)G=(69b9h<24ajRcsn>$0FoRt$+He0_?C zxF8{NX8(FwS0`0|4U!6bFGvnw2{{WRt1lhBnH*CXU#%t=zhZ{?F5bkD5Hto$gt-o| zzP#lRw(FQtJ>P$&5Gae3b{7T|?b5$$mp?(%VYh{cH-a%UYAo8?wl^d}~)dn=OjcuSxcnpZs>y#^b_ zHUy4cgMc))lNGsQ(4~Jmx@DwCC~L&;$jWkXi~AdtiRAew-|y0Sql24gMgifij=y^S z$%91os4sbHmA+EuD6@4|%H9HBT?Ihb9o&3Ab66dwi?X*7DCyF;DZq^}K9zCbN{i%L z)oTVgwzLPOr%~1Lqyc%Wc2Q=JwH9@3VQ|uVZiQ~;CF=s2W)^=Z>z70~NUE)huPd@j zo~|-F&hkKs8+w#>!aMX>MK*5Cc1Ks+kaL{e!uUA&^8`6WzGH2d5aDy7X&9KXT?#R) zhK`6DvLQVm{SV@XI7PsS8nPkEw3-C*TQ(*Xap7e)dCWk|NEUAz9|PHISB^q~s{l~J zq-+<#LPQ+IFc^PlcswSn6wHt#EDDT`=^JDz4w&ks9XZS}j%ao%87+$_^zvlvYpV^B zb=On>9UWd*=OlCO7Vg5POHTHIX)4BA+_$)^Xwz-mt`v?K??pPqq>5!|QStpK@II`! zx&Zlm#FaP$(|S}!XP61NzHnT&XvT&BmcwlIfV3PdAEJLq4HzOB9C|wtMr+(Wa5AB& zYbyePIV8Z}9n*VFaC{3>8DXMpk8{i&>lM=5A8IhF=&mM%4DX!KtRR`tvQdZuT>y)7V>q4QE_vZJSlMp z>7HCe1q;Tmi=PaKK@BXbJ6eGeDZ`zJ(&hI2za;bAIQo@X6#L=2GUem{ihFWnIbVT? zt-|2P;m`7{QQzp~H795{@`YL~&)V|X=w0<1Spk10Bgfggh`{c_Ctw3)V&wnbDv%1> zimpF5dvGTDz9d!(iNsYEWTWYVfn?M(wk}b~m+4Cby9VrhQ`fR9;K586KZ)atsAG#2 z&G(3-Vk`vkW>U{rmW#utWvBWa+II=*z?sm?>CO11`QtAI`f`b+U z_Z*?GV%|HZ{atgyt`2HDzHL|yYr)py?+}01qGtc6X1Fc|sw$G?$6X|&uK|V>x`tvB zOboC%799e?3`zH42*#-FKX-h7NA9aM{h6HLZ;nfqRE5vGh>of+)HaH5Ro4v$2nvq* zhQGKL0C(@C`FB$<`wp5TM6P=I%XqY_3w-ud<OkIl{biEym9Yc^v0@sg=dFQeo8J{AF&_|xpMnw1~7!>L=Q0S~p%DB}^L%I^t`encrAu_>_=ThIv?x_K0yZGz12WG4J|69FWW#j8A9#JnA zBPs0QPmqACul@iW!pg!{2Gmc{vhf4y2dg^r3Gr8?%AqfsDkaq^h7bM*8+H!D4VVSwLpRs3;_|+Asc*$GxK%h;>-SaVL`A8xTr7WhYikH- zLpXRTgs36y>%ZTb$APraFg3er8Wh|e97xeso;cWMXos$K>zUF+jc@9Dl@wJvE&Cq) zzh*iYbtzJKoA0TYs#ZE?b?GmxdM|{tuzD%_xQj8|>cz?V-DllJRoHPd_iodxlD7N| zYAna>Efi3#byr^@m_r8xoc(|6iaNj0e%BZ09dL{z2FehtJ2tv2(t{TJMj=!*ycOE* zs#6^&E@+ra3mC~^b^MxJ5zt+{SFO{X$gh(gadr(zT8_E0zhnqw6|AS@uJfqE_IqP( z>9IC#29(|L>xk@+Rn{BxjShdJYP0I9nR0Bd zRt2sA$8m;0%d|`aD=8v}Lg^wLYDRkMX(4@vy0s;%Dh~5t2VmVuT8Y-HO6s}fxAj+n`6Qq)d?(=HDsUT))Beh`lE53_{`9dK+wR|OiILv= zp4sd`TlLf=rkQ2Xi_3qChw{Kgv-`U-Wv%PIeP>dTb5zPKk(gbw97(MLV;fdq6on1z zMnh-`m;@#}spoN3tpiS4lGSB?*Su_d9(902a1mykZ!2mU;NnS}PYk1_x?wjZC$L!%8Oz`c!gGC(CLWi~o z-dG4qWs60@EWSno7$R^E){I8l!J=AqYE={tm^tC+_RcCNsD0^2Tc*2am7x4rPFSE$ zg-})(F2Ylk1QmZ&S*N7s5Gxanycs0{g|f3TB?-ZegMd*ci6tEY&rERH*Gx&iQL+9M zi%F3D<)R9~bg<~HopgOl(t=n((VcRF+!v@=tH5f(QpA8iFPmV*F}jvpF$i(CtSOQ1 z`s|AX&trY7$0I#cmM3J8zKYy%AYZE!`MY_%FRAk>1#y4VD+~yb@nqOW;uxi*5zSZN zeI2sZWrRJj5Z}uc1G@~gEo3jU3alIF;1Y}Sq#dD$X^M`|pU@XP$-T#IEr4%;EUWiD zocc;TnADA3LO3%K-~UzXv||qp=!>2rCjp(Bg<>0`rL*4|`AS~9 zJAxs0hwHuU*F~5;*89h)ql$6ON57{JClEaQz>Zbz0ONND`naf4yJ6;;LmZL4r0`A# zaoOBQRh(>;OI*@Xo%TCXxxUL0%7B>}Y;#^nE`a1EhIAA)k$sYGNsSpu!)U{RUSp zt*e!X=I-vHA@M_DeEqlk|JHcqG-E@uwDoD%stoHf&vvk;&Ai~lBxTX5Cmb5^X083} z%EpqUGK`?zO|-lF=4+#74H2}Mi&|r~LkFWO zC{8;tO{T8rYI)0bJL*Q&YnKA(Zp>?@T1AgP~^dY-3gNxF`euFJJ=seXwHA| zGZ?~RxsQFp9djvmkuEOHd_?9B>~DGlI3Y}$#iB}hV-6XRb7!*|(Sv%wKl5;f+!Y+` zvOmlebgSY%1?t-E?e_W=dID4QB#uf22=32>v-wnA<_LY`+`9jt=WJs`ke|!jCo7tF z%XdS^T!TF{SCn0MJ7NDDeU(I@2{M1%Llc&)FfXZU!GQ)SNmy%|IS3w1I4T(AHHa8f zqTFly6ihg%Rg9Qe7;TuMgtmV|Lf9aEa;IR#K#-2p0g5`8vd|YCHlisjZ&l@#1=5Rr z-;v*4*i^zOYLFSTScR;ytSuR_)V4%!6tdi3*dicpagPb zTEm}r^!!k`m8?7l<@Bm(C(WCpT?2i()(Toy2izo*J6DBu`+Y@?)*|69>xz`I`_8wL zuCHX#VId%fy`ZLk6@{>x`M(wBc#wK4|m2;hqdJ~3*EA*!sYMAEF?ua4kCKD^C z)~^R{*Rl17eo64XiHh#@>(hTGhMVpT#ictkVt5{JM3|WJyA167iH+`Tdu1jS$YR|o zHVu#wyP7-wpmwE!wC;P^dB9o)oVV&qSlz|NvgOLltH$$J;du8v>FS11LSk$T--Y4% zxsZhcC@}$^v)0cD77%P&g}MPrXL0w_-u&V*Rynur?ylj}^QsPA9#wyJ_DgyKe%D>{ z3hJP6n>I%euhOd<7f^qniXG^p%u7!QoshY+6q+oXXqJ5H0|j@~m+tfvHQ`T$zU)5z zf`##L)Yk;G{X3%8*+M>5XY)fZyGhjnu3Hd)f2CVeGAdSzRmM(^>O{-+s|m)c>m(R? zull=0SAFbdL5ad#3EzMGrn3&My3W%FlESa)EsCqj5$Q_Zn&ETqNYotviY>bZmhP&R zDs!||^#64AC8`Q+A84Tj&4tSN7s8P7azf011+gLV#Np)vB;2zDVUb&Pz*@7lNSyN( z#H;b;ye(IND=;y6?U%|_wG`G}De?y~@LEyx|A~r+LGIp?HQIlDr8`50ylDT1#t99n zVbsO*!FRK(epB6|+{JOkkUPmvZ-lXSS2E*Nd;xWxpqfrH>(i+Pa?Kx*qSIx;AT$@b z=_gvAp2Vssq0nG*T2)6tWp_BQRgIU{KdaiUB;eJ(cSLdMT2&2vNCH9>qjDs2b4Ux- zW>q=N6<(|wuM~g1R@w*9gZFE)%d+~BMS&{%p`htEuE?V?-{a~}*id`Iq7im&asEy; z(k)Nc7<^Ne)5yOl{c21pzNuP--w}iu-HG9;u3CwY?%=x0UGUm;I!c3dVCxjay-IB1 zJM{lZVruV0@9^}wf=oBhTufJ|_Ib6WpwOzuR|!hqYFmF^dCLFfjQmp%)eBMAw5m|4 zphU>3cK$jWuljq=tiI^41?^jnS6gEqI(GVJRa*3OiGJPI%1*%lE6=_h$Mfc@1V3$` zU3KW*zeM9Rp3%6s~1s{nlQ z!8S`HrB{E~h(C2r)&&Wa(O*aT7P?&n_U;}SwXIF3D5{jJoMpoM-qH)zSE#?ldP5~u zyBeZ@@6Yah*lRRj%j9n9?h>|qXKDVb+noPXMo`ci)(&DlM|kFWJnxHox4iTJm+I<= zuddhd6RqhjQ7P56fi2f@67YCo@ngqvJnpsBg>QfL8J*(lm=IZ_vXeHq+e!Ru&6MXxDxM7LP)wWhVGgasnY}bx4KxK z@lDee^{)d-3w3w=SLP^Fjkxf(sByp!t3Rn1)uwOFx~_jD zCNiIKw2H0Qs_VtNV!kL6t~+*sFr4uIV0vNOc5W5!e~GIw0QRNcmzr9_q&y_~PBOEO zK4dpSzUwU*3=!x{U9ZZg`$9i>tKtC%Mx0U5x-=4Ab$XzgOLh7{&uy~qO?!p{QpIeF z*X1qmzYM-GyamZ#y^x)48gW(oRM&s4XG0ubvWnWucg6JqEf@bbtRJ?g*CyX%hm?lO3zwG=jOG<}vHc#Gz8>T9??etR-ZV>np7e$J%+eof>rrGN6n87;Hyhh=>LC&YT1JU z8C%V30vFbqU~dSMC4H4DIad?rXNXZkZ=Txo?x=~Wl)yal3TICaeZeAd6kwvb3piyW zkHIa9|N0liT1$TI{?T31Qx!<$);d`H;ydwIi0{+C65s{}pJ=LdUScNgWu*CkX5(xD zM8XSaJ3Q&dQq3<@@F2E|Cc=OB?;>e3tLug0ya76BO>Oe~t z$Z!)VTyeD-ssRonkRTkCQccZox zRDUGjzXn3Uy4HIF^wp!k@bY*j(uQMnYSK4QjpmKtY)?7FK(^gcD@K1w;U!AanxV?q zOc&+dnj|l%p@G9RzXW~9p+rabaP00IyVqkLk=>0* zNObIqi!#;4IE0vN_!@tIn|16CB*dmKe2=2;{$qFHSS1mvg9Ll&=CBP#5iWLz1_>j^ zJu&%@DcdJcJlR@RT2$^XFJG?->^fvxe)bep6RapU_qDNSDI(RQ-IyZeZCw>ckt$j0 z`p$g^_PGnN0|FHZxx35Cn3Z!fVP8xYfs4Usb`?cplWh#G>vn(Jayte`{%ZQx&HZri zBMz2;#uc-Dgth)IRHZ2!bl;YYh+-HgC&-k0A3YsCm0h6<42TX~%0k^*Q_8}4b-piz z;ytkhu61Q`(Iqmq>KpcKMpMHx)R%8|<^I0|hfL@*2tx&kT@`aJ)Nl1`f*ihUjCeBI z*%>F!q(_zF&z^tqIH>z{l(ImahpweXgSqjD9Ws~D01rEeL@s!QuA*% zUcaluRHP1Y9aWUI0cksb3>I*(7G6C(H98Xh@7uK>JL7-v5%Jw2s}r9k2S<@uV|kY} zJ*7g6F+7Cc-zDazQ+F(@T1R2j`lRZ}!3H7{FQ^CFVXf=py%#JN!U_-1aRFzm_{S8K%#HF=k3hr80 z|I73R=a>|!>I3!2^<5V6e=6eC(b6R%GAbTZtt)mO<_PlL!ES$*V($x7#SssG9Lt5W z!E>_hrw!1vt>R?+LI?j7`>t)y@qZ<3d{qupGMInIdB4iMn^hqwxpOY;E;qJg#7GOMnBomka3bvJtd*BxEj z%ios#>T3>HOBh)26%5()vKp!|)b&vPVDSVlBN;9+8i|~Ub1@5)3n(dsFDksTu=sNr z#VVz2*OjiT+4*<6fWrvWO}3fAIt6)kuTFo^L^!zR9bH~?^+vvP!e8zC)oew_*j*OP zJW=)KmUq-cMz|!CTDPl==$?S9zNaXa3^F62;lktd#QOg5%_eTa~Y-)yTrL~Q>GW&l3 z1B0V(ex($br@Ah3(^;FhA45|G3Jn{zHE08Ty>q{^2-5L6C_!@V^b+_w8tk3N1Owoh zO6Oj~7{^%1$6z$4${|u3IbHBmsDD-2^cz<~p%lEM`Q4a|y|2>*BeOsqfi3Wyh~wd% zfr0ow{377uC!PxS@EiBm8LC+aR^)#%08TK*N>wpsR#Z1VLcYkUhR8L^azVVq!WIuL zF*68%8C-O7IvXmO#d@(XfW@wsrXXwzk`ZBU-It8Di?J#Q)pToBGEg?;D9-KH)j5zK zMMf=+W=*>z!-eJ6283h^3cJez$k758xNeU`)=~8S7ahnO7aSFRe~Owl=FETL4DmtC zcEpg6aY1{aS(%*_h)}W!+?yI-9$stNnr>G$Op{epNBIdz$l!p6HMCh~hOggJq$ra& zD`btA2(13qsQ#@+UsQ#+x#5ui`|F0q)t12iZ>MnfSsZRC1NkoTL z7%&PYR%Ru;La%4AjRBnWQkN-8>t1u6IxTAmW^hGRs?URadhOj?5o@Vt|X#Bl*ru?mn;L#=suTn(~y6t zYABt^qkP?7K16^}Gb4Y%{<6>`B_{x(@b=GQ2?3$tLnK3NqV*ZM4bw!7P#@vy^Nqsh^V$@E9g@MQrL0(dIOh08}jUjPypuk9L(8KwJgoJ;D=k@#X%hNPD4B)G* z7eCw9rb#kQwu5)yHv-p9lVqBzgEFJa=aNj*GzTJomMM!QnWkySDhBHYi)or9)0;vI zBL-KJX_}@^pZC)bXid{JO;&D$w#)uz;7KwIO)Cn&rm0~%=di|yd(Oa4n_qK`Oq0Vt zPb1Eqhk5Lvk8*#Q&n6r0ubv#{v}uo)gR)K2B$=M_&;RZoG)>bqEsQ)?hVpSjq3gWLY{F-A5umf9XG( zrpaNymv^$~n4cPWi*kReX>uzE>t+S8#|JPo05OLC+RJ~{$kofi|I5SKX@HVP%-F`= z*U!ttG7#V3-2dtM{Mh&C=TM_ylIj15!{hen@$?oE9;Iaf6MQ-r8x0ya2LT1RWGt2e z9S#60y(kDb2MiD}Gr(gJPX{0{Bn&SnIwH}O@wP22EyZD4C~s9(R2ZK9*c5cg@^ox> zD50$Y7*KyXd~iE&F=jMoH9Ie5NQf9BIL6S(&B>L*lfaY79SRi=-{08Yir&+k5TpVC zu&t-Gh@X#{hncmxq@|Caw6vItxD}?ai=?foawEy}?#S9vPQU^2+x^|e<=nudoRG=Kb^f-S67#0i*9ssornrjd?3<3mrG3#Lo zJ+6Ho4a1yAJtzb;O_LxHC?pq70|3$#N!Qs+<7mbil)6DdP*wl{001)l#ZG=*w@t%e zb%9DzYj5eyTqa{V`AF{NL@LKD_RIhP0044fI6|e-kxf{kH*EH2F-$a9>q>(M*<$C# zRXrf`*xGe@U%4m0001jh)T@|>P@g_(dzPUvL)|)04D0K zXtQV)0h);6>03ZU43j-W$Xj*qHGUrRX7ER+9GXn*yo^jQo^jZKA0RWkNNaKH9 z^CQ3>n1@RV`dn~aoiFmNQ>J(K@F4&Iw7Gj6Bb$-dv8+R@>cr?E2^wFV00000VLbO1 zbCHg3q3YQ-q^Tg4U8AA?&=q4$UtP*Q%cz6BLfs1htQT|_e1ZEe;2AsOK5p-m{@#W7 z8+oem(TV3~TKW;rv%p$D)29Q@(G`D59f|lyCX$8$7Z@5pJoL@-Zv2y;AS$Mj;xK3? zhmow*^w>OzC=zL!aA-vjLh?l7FmZE?YuIIE8i{b7c9v|>b^)B!X|?&Zp8Y+mGVtdrAdtRf;rAP5wu{$`9(!&GQR%l0D|@-sUvPrNf)tGh4WX!5~ahMhtq8E<5o6|&mDl=J`6NxlU+tVaQ zlmdf9B9Tamvhz;DGM}!<6GMLzi4|%-Mb`18i8M`36)eiyWU?s@Bbgr2NnHrDY`2IKuUAfhq!tA(1|F%Hu{+ zq-mO_;pVA~hw?-skx0N^WJ>6cZ4$fmITDFpnkaNXlXx+onkIu8(V>5zP9hPI2GNqI zNDhyFutLt39En8IK7US=4yWK)Nit3Pf$m*7;Q`V_e5!btAj!{hQNmt=ACX8T65iMb zBkrn3>3?Q48Kh6+uStE5G)>bmZJBbS`%c41ZcW2?(#bX^da9B9TO< z+KDhG3*v5`@HG;NM0%=PaqeqQX%k7G(#G*@GCk-_(=<&TNyl0pp>jz=B8i650;oPu zfRvF)BocZ(jwhDc{!<(sByk~x1X@NY?py zBYWhho2I;7H&ryuW!6*6vEt)!t z;>8_JBVmiO_R;{_e3JKwKv+X+MK?$MTLAz7NxVyYatUzcZjfw5YZz(5XO3l1V02_Ge zo(v;SNVzD=?wZtfIklYZp&i#pvyD#B9 zNk`8PqG*)KD$&|wV#2dQFR3iER^BrPjkwe@>d33=OB(27<)AQJ-4qI3aXxyQ=%`w1 z6rrUUoZMXORz7VhScr-92^c$Ub8&mvK5`RVD39GkKj}?VTs>XQ#bYks&nv4c+aYoP zL-p~z_xJcb3SY~4$|jS2sb|>lgxQ2rJfL`X2SvhfyYSNv-9TKcHNU{aZNf=MXvt3U z-I9w?a#Daum5&bqay~Zi=D|Zge=3KzaEKZdxm_uP(guzZY|TpN9b;U zk;skLbjfO9^Q)LWD|%xLsC@=RI~t|#YnMKe6LYwgU4|r+`y?t|4;O=d20Kk3Tc_Hh z?yua6|;)4IYktb^X}xA4Kf6a(RB#tQV-f@q6~2VxDkOKgG^hKBG*lt&f5<$!rX5 zZ~@$x{@n>onMMx-JUKm8$n>pa&u^IrSfB!(J8;eXjWJakELJvjkxL>6r z&5CpyOA9mrPcgq3<7EBhS5dO*A)!(urz3n(VZjW6#VWDrs=EE(?g80>S`i6lS!jkb z1>agcKd!BeeE$iFi2h!((WdTJe8acN<1XZRQz5`_%+%fA2OHCUr5}^|FE)|Oov2GI zhQ)-AG*!bGX59P!-l);qc6x^DH%=@OKH`Fc;)gqi2Wq^(U-4OSC{KNeynX+5@{@B$e?)NB1Z5 z2@?qH5%IKKTsN^15q>eaBsbSgWF6nIaJ0`R#}vJ8HC!EjQa@Z`*mBhBAHEc+XXF1m zQVVJswz0GwIYI|^8t-^U9>4owiI{LU$s~V;RLqf{yKXrzhg2%u8P8w z(~0*f2SI?}T34OkI_EvnesmyO+o_w4>1w~G0zaJ&3xh*DGiX5CeL~t)R68+V9$*xX ziP87=*BVN_VI}lStJ1mUIvXal6tPZ_9)$uPV)nP3Tqcc-&;5M)QBlC)7jb^n@i&qK z^#1splTiU4gIm)rlWn^+*grQfclX!7i`O2uL*EXMLTT@waGjl%As+;F@Bzd4nLGj8 zllNCvsk9j@?jFDt0w|RPrb+!JqhwkAitRD=9B%65>{DaDJbgcNhVFFVQaJNDa@9P_ zUCBUHaouKk@63*8CB8K&8JK}#H#&6i=~rAJH|yYz;@u6aj2NkxU2k33^VVAMGMv%S z)0vSOxi7O~1~Qa7-ls=aq;kk@s1 zWTp9aDaJVrab@pqJZ9bbfWiDuy7My(0Kk>=?~jY}a_L-hYiOt^>~40)?fgN38H@4i zm>1mrx=PpC7)isph$)dvu_Iwm;^-mDNy{d0GW+0BFAt!mSoV+z>*eh%L3Vj&=-WIJ zV<1miCrWT|qD*h}u>*5 zI{;We&K_?UG;sVGk@yK~;q)r(Nqe`x#oHD(3*`vcVa710ef*|gCE6orlnl$mB@j(~-!mBC;@QOJ!Df=9 z5#*McU-mlKi74rl&Z?Si6Q@=)RjPxB9)@+sBdhVo6RK4DpW-u?Z9`W6s2` z=}S*th*a;BrQ{1I(hDaNtELjG=BFD|k|Z(z)RAROq3i+GaJTeENk62ezD`bY?g151 z6VZ%vqC8a0l#Kh6C2|OHVno6-#*M>G1T_~v7kfZDUMwZ(#4;j;2ubT%E~Jd8vVeNl=QKD0v_mKw0+)NR_aFH|`Gh(06*zn__$x&bobTy#d|k>n*H@r8oeITiolIl7#+Oo5?hZSm~)V+!8O<-agAx%Fxdv z1ptZ4l8Dk>EpeSc728!5N@x{fi8!fU>2q0h^ehN;iFk^3i{l`x?-}v83Ib!&>J;E4 zryz>^Cu2?fn=g-U$dHiA^jaQ}7)(*TquQRLCM6}cCb-`KykCG94=7S@_@A#tE;6a+ z?iK72?*m?2n74moZaubj#im{5oF|xOnYASMA;o+!e3K|>N(5ob(&vTOA=+lx%C_l> z?b2-72z;&S6G=JZ!U+ZAfB2MO6`L2T%V(g}Wz=VCecruEGf``6?F7MTup`>cOQ&a|ix<_ZR zMb}C8JnMj5#%P4ebfaXt)bYC^p2!$}mGANWn?apU>Rh!w)zb~H%A3ife4Yti)?RpUm7rC?WzSyqR9ci9P${*KUtd`nS^0f_ zS-fuYjP0=Kf;Xef>leT!;D4XD56P@I3Tv%x7U)3NOAYbMBg!`)SI#FE$Rknd-fBi= z@9d(p$O4^JJU$qSox4iFKX9`V8HL6LB|R&8YyuR7y>%~i{T%ydS{-h*+2(kh9#n0Y z;?gXm-fUTEkQUij%8lY(Q2KEa@-5}V>39g3#debaQ@HJ38?uEL5e?)axktH%Jf@Fl z)L<8@jWTjsY_{xw$i}Hl)+kUi>J*`aK6NwZ3DWAZYw_pzln;!hA&Zh2{7vZVR1S+F zk#-3HZsnY*4rkAg_okb}Od0IH-A7%}ZpdP7>7jb-+uVrAVsimGs~CiU2ou3!7~17y zPnLI9WC)mHop+g|`i}2CIgvU%fi3z}Q0e6j54jgFHaMiD;DIGUsCR*Hzas&X%S9Ep zY!4|XSC?@+z4%H?bqZ4T8x|YnMq4(w*`g85Nm?j%Jk6I^!OYQFumv7piH7z#aT1GV z7m7$WB!vtq<_9j8dWldeG8uK3oF{kas%c}|eg`pEP%N(DQ~mtiEIR%83PqF!wZ|}% z(-Ye!_Y!#oi@ezhsy$}g&wJ?{ss`TC@h7iiwRR9tTdUAq>uKzbm6iX-FW)*<^`LJ0 zTRATjBkZi8Yoau0CFgL2RGMt}&F1^==FP0Qa|V+P3zJuFpM5gCo%lO^hx|1UL1M*m(--iYqnp?baO40PSEVJIC7g;PBRhWzrlhi)_{JtWl z>g*Hi>sq;)`iZM_yYT8xgxAJCjTI#~Q7! zj(I{z=w{>^DR*W6P?AodQg|3pZyI>drdEfl6ye7vREq|~>6t2Cm}0=|?fBNlqR~{E zKLX8I$7-$NUGVZ8 zgQG|kf(I4$>vbzT%EHr&W|-kL*Fs+c!0@Hy*OFX-cm<3 zgxWnHx*Rwa8E9jjvmr2lKB_V8$;pU6Pg=68=dgV2QNVL(~)Wmy)E(lze(t zj3*#saMOgC|I;bvUZ!G3uRZ=Af%DoMan4S6pZTX=>o3GNF7sU;KHKRRk3*e?ZhUyS z@n`$RpNPhdv9q2(r@dcFuYOn3w*tqg&#J8-j-590Os=dJtnd*joePU&R%gL+xTM7N zWVk|D<_DZU!qfO}&@o z>jl-u&D2s%1_O-Gh{sq~tgY?L?9RB_JoUkWe4_XwI`_pRtwkcvgy#FIZGusyHC4-e z-vzScXLo^D(7B@1NVcnoBEj3NR~4)#41nGHpyblm;TfQ1OhDk`(`UM1-SVsW7xN_M z(?fVcr(dZ2Ui~n$A#cz)Ri`mO6_^%%lPyngyr`@_Q;5!zul=JhQi485`&Xmu(6u!W z*3svmzn)j>c6|LAkgy~d%Q%h_M3QvK+txRxKGS&ayOHmT*`y-6n2YGKBP;fO{xFW^ z@$knsVclmd<&=JjX;qN?@MR>c<>J1!h_sj>NuwctEV_~dkl9XdxcvDLSx#Sm%vNwsXNet|)LM6Jby8yt zioa2v(4+LdfzV1C%Tw(Z^EZE&HN=sj+HO&5Tz|(mkofJe%9oDkp;<%Aa?G2@e1xF81L3sPUqxffpjM^VPVmf;CEa2QQ-2faFy3`~$WK;gVbnEv$H~ zEuV<6t)AGShc1F?^`h0yX31uO5IkIS{ zl|~i#LOeM$ye~(o(o?AKRl-T%q+7IYOG{JwIeXS}mn?5ht9+VG#f1^&sDj7YIelZx z>Sn3MgMtEmYr6(;6jNmM$v)BAasU4}xeRIfz%CVEGDe;wuRJGIce=KWUkI0W=k zXQ~zzWO*m2b2q?BjIb~C?K2ZA&5uDGt{*3VuWdRdZ#itGXX?iNOxlZ8Nc_W*QdC_^ ztRmNZMahv--oy384@(;}nsc|Sb8`0$5qec-@f@iob|a~|&2uKOGmxt2#c&uZa+kIn z>wI0|M7PIfLNf^^A7yK8c4kDFfVQ<)jc7z`GNX}%udNp+pX>6>z6wNAhObpuj@G`H z;MtGHTN_U~8X1N@67eQh2`xR*vefreyr6?lQN0?kqML5^*rewy!qEP_6s9;cW41xr zQ_n1-AV`Zz2X4c=z3$I1_)A((poFEAvX`2*T%BJ#gWD+W&CiZkHMqq`;z>$5!jaa| zA1{i2TBTJGY#x1eU%{aWbHkt1owA>rDsy-2ylcooVSKsX{9Q5_LuvKkVrNBF);9R? z_;^h=b|}YlU3=Y+lL1Tb37*g7Fg{*U!JR>#I>ODVjM3+n9JOMKNgvB#0*b`HxZ-_f zs-*?)KUNDuDU?%KJATVyA&<;A$m(m|rY0?T`>8;yDCA}|ws4p9feH+8D+mdVI-fsV zJK4EBSl4SEX`a)YHM{iEEDqh=IKF}rr6jCh?JVv`%u6;+t*oveE6AX_>8Bp((aU4MqgHGzwYY&p>||;9du_1#>^(su3U$&n*6Z~d#|n~7M)x>nqVf=b zPtWV?)TW+#bQ#bB+(27fQkx%C9`X}w77~Omiwp@O1aBBa3lfX8)YKTeJN(Mj4^Z>W zSgqI(t69dD9EKyRcniWT1~}SjtPd0i@OmpF_A<-j=F{m`IhTUtgUmT>lLG@% zE<5P#l;elJi}mH}E8&csLi{9jL;R#Y1OWudL4IXAPEpR`@rZ2r+K&-wgfesWkY`he zXbTMh?4@<~KMfy7lAhc7?t1bIIa87W0OBA#zzg5Y*4^IKMORZ--^fT^-9#Kerddy$ zO&<~ zeO$(Hesr`CRgPNc%=tj!ukn@stNE?Pwe7au)^8`@4%e5*e!cq+tp_H1%3FIky88#a zC%)~gPd3fWjJIxWtPZa3{`fWDzn!C=V9lBS<$Y%UFQ6>%%VE`rPa$;xihYzfq4;@3 zV$e!-Wqj8ia}X$d7h92dSrTTp8n##-8WNk!0|YTfBt{aAsW7|CNjvg>7kcKAYYoT| z*_m2AvrtjB7g#lCNg=>yR5DYNctk)JN-l4#WiSD}lrx!e@{r4erXqmtBMCJ!PF_C2 z#xfRbHX?QoGG9h94skdN54?%PD0ye+W|l3hkv+FHw{|ubZw6}!;hDXYGru$C9AWlb8BWC4b9)c;`{Kb1flNnWX zMd*jG%`riV@1}xXV(}wMOgv1DY12$}bv@*PSNDRh!u;K^rfhZG{NJes425su;wyx) z%H>`f>gg4A9}+!IS;kXQ@n%Bf15DA0cn=?l64E-VQ>VaCeHVRq^Z^RqXWVR~js9S{v(Md6uz;+27yQFmtCSMK1r`oK1bQD!5SLlPSJ5 zkWr9VlU1|LGhbF#R^7D}mDCv$8@{rneVmpSQ(%VX%uiKDY4N{F3{7BvlN4^`?jv9% zVeM~i<7aB)RFy(zYKnWOf6T^7BH_(_eZ{AS&d&DfmDq$ZT|!(64e8+q6@_qxE<_{` zf~p0Tc3{@;B4)NwxO+j{wDufvdj+eFMIzdoX4B=Dkm>{8P)2nw1iqm@ zPVQ##2p@?vYPIXnSi+v1#`eX<{>W?=`zO}|8iD!jyq)akH6xHab?f4M;$gyfSkTQE z{b}EO^FyaoN#4ls$v1W@bo?w=w4@HN3A{xM^B!m{+*2JZvIXT%J7aQr*c(Gfr7lx! zo`_(!91phC%*GR{Nqi3p&#R068C#LmCK}va91F9RLYdsKBz&ghZBdCQk#56vN9ned zvDvbtQg~?MrLK$J?jzZ-x)=N^vf8?USac*pR=ZVN#t18bX}LfEi9{@YhD~BHa=#YgzD}nu6vA;_}>b!;lvn%ym$fJ&UA!XnU8gaKxTX*Gw}7&-VXU( zP?UH?6pEnlaJ=(KFKN}To6uG>u6?FycBXkY&I{wgbZj7i@uh2a?^|4-{;$RPF*3OU z*8GG_A?qv)HQt9$kDjU7o9WtVBeo?cO>b?BKN1aa5kQ62d)ca4eWk;6#(cu(z%JGE zOu_8Unre`;(ZJ$drpr@9j_;+Km?Y{p$G!sGv~N*{UON>o)iDj!_o#1i+&1DOAq`5< zCZeF%A;uu(kKh!dd`PZM&#w`)dKVw8PNd7h*gGtH@)Y-S_SGQ_t9>_l{R+AYR=Oin zfLmlK)D#{$vp)Btcf_SHyw})^AmVi&X>|K5I+o9uV@$-8k-A|7+shTj`DHs9&gFBf zqa}qXr`+~j0x_ZT1efXH56JgRzlsr~`y?iAZKr{9yH&P3g~~*?CA{YzTtM%VrLw&3 z%V)f!>__mZTgnz|Pb08fR7vRB@5fE{wi+hm?iffeeTGG<;20}LX2}O^1?wc>D+H2( z>8=7X9tpoMl26NkL`NqIE#$LD^P*bTh=q6_m8#25cp(|8it}sZqGd=opvQ3j=GzJ! zsw!@v&oX|rZsc%QSqodDon~@owfUk3{hippZr8MEt^z&4{$nkrruhBsqMm0nI{84S z>x=47SIg#GB^8PFkz8nzz^pDxq}%P(s`|~`z4;xh+5)-g?R7%M;lN~rjX{}ZPkJLV zRA!-TsIxh-^fz&|{yl*=qEAWLo>1WlOEXo1!hpp0PGY7%_{dt}yCX=JUt*RI90kqG z73sa%#PB#M(HF2YcHDk5g1!icRzpnnj?I7i7P0~ zb6?%pYKLZqZC&UP&FY{^P@-2lK*_gI#YSGuOP^k^Oj=e>>Nn-1UId=sD=w4A&e+QZ z07{Q&iF2DDv26>s(N*xbc-HtHi0@1Eh`)lKCiA~AI)=lF0Ml;bseXdHggq{*ft-p%kT zK}t&HK53&2k4zg+Gbyu-rAAZ{rIxyTd^A%oLg8&Dqr1L5r9)vkD|eoG-z_R03bq2j z-UnZV*`nRWpPzQqKNKOYqi&Ch3j&ITJ&0dmac#9^0mN>Y?}q{a_oX2lC)8f4A>BcH z(#5xciLaXakG#n(M+$hoJ)Hb<_tt~%qP#lhnx{v*Cj)kUDU0C0xmG>S1XBp3SJkmAK5 z>3=o&jldp5q9^5a}!si{xLK*;FjDCHA6LxlIZgg$8=2uyLHk5!<{=79J zsbiW$C%MOjkW0#=`tR++@$niDE7ra{Mz!z_EJ2a@WoLG; z823szlroYvQq`vuDblkiFZ11^m!4w)8g2gXirfM{UQ~tSB!%yxEZd+M?zD|bp0%}h zf69-_UG=`4@~bC==O86-J3`YeQb8+*tQQuVA4-lf$G_?qUyh_m*4{t^Y8tqCkMLLp z_>uhg%`ur2zilqSOz1?-h6pK-wIn?Bko^XDx1>1zSeRe{)2ihItb>`bW0j;VaRKsp z9+JI71$UAIxGxG+FivFC)FSc3>VpGv)xTH?gGyc;Ug>dTty`nF>5LC$tNbgDYV!7m z*RD;L-|3(i;--3yD17V-$6_hblwtAve1dyErquDED2CXBIa1OsOfq)e8nG zOXBPs49LsKWUUp#9?Nr1S(E8xcWMAH^k!4t$tT}+3`Vp!yPO@7!CJ4hG-WnY zl5jud9x5s5v9RkaQb`~jkvJ=S-i`zoi%IMm3L6AOIU;__^}SEu*%*k zE_;YzlD_9JQhA>vdFwezq%^M6NHA?2AB#CoeA~QZLL@;iQNGn3XlIncf$OG@iA*uu z0K-y89Gyy^0s-rEC4kk?5tSf6TVGAIkiRe@<2-pKxul!*E5GBn__w_b( zsr6+=&OQjdI8|H6gVOTEej&}we5FRxn)2W$Sedf_6YNHzKf?iIh=2dpKz{rG2y2J@ z;r|gf2>E0GBWxD(C;vy-I^=)hY4 zK9HRS5eSsxg8)hv@=QYuLXi6a3UtH<0ZPa)o)-jKctGHa00i<#LEsw+2+Tw7IF!)9 zJrFSE1A$S2rdX2h$j%95YHh}A&MXx zA$lPeAP!N`-yaB)uW;Zt1P_Ebgc^hugeOD<#5;&0h+2p)h#`nYh+hyu9UQ=ixCOxl zApxNVVG7{|5etzCQ325hF$1v=fmII&P}I=hT?k7rWrWZqK|%2;_b)*Ol=#l!Z}OKMv&5cqPc7BB!|fbQ zW->y^&yXSTVq^%$>kJGS2!oM`y|IkWb-?TmW)otFb_Fbvg#VKwh>r;%)p_xexL6q4 za4d3|wk9tnlKk3(M^4~rYv$u=#mOk|Y{AXTfxLSij6sh0S1_Zdu$<&Q0YSz`E|yk| znszqMcFs18k0cqn7$4t5(o+-i3iBfG2_ygd=~ENlyNBexcmE!rfUtmYN(v6lKBeFf zbWcw{o&VnV8-tSRv7z#GV(xUTNE;3L^8L`h0-oea-9RkM1RIzI zd+uBq!fTS5&H7f~5|y4OWf9(LiGP$;IP30X_Ta}(cfWdE@$Ey9g|9e$t!-XQ_uy_R zS*CwP;#AYwW<2u{yQce5$1j?u?0nS{dU<=;=xFw`v<=O%`3)Real;LVF9X5b>LPrq zsDT3*1|*l+A)q}n1hoEZN8BQZ!;k=y0jlp?x8XEMsvrv2;{p#6wS5CT*FMr_TRiVQ zv0NSGt!o1!I2D|Np!N<;3(rRo>xAWl8~Sk?*L%J-B**n?1~@Ykfn>~}&!7vxVe9GX zD#F9#>B8;d=VW2dZQ+7)y7pPPJ0gj$t%*VK3J%ABVF&%y2yWeh6Cm-ha5%6)OiXMH z45ah55hL6NX@#`F!m6BtPKS0)}%E&oT0bJ z&24|Q!=!bjd_ZEI)nLvQL&yQ*+syzj-MWo`DG%Sg|vGE9Tg zPvxU6Mqw9TL#GbXmxbw+8{bk~ZHE^L)&$Ee0=-bn-vOp^>!LQ=G-(&z(|-7N(WqQ) zMLT9_$o-ew!7=jGYpBo)$2XMm9~f>~?c7Y9Mi+GE9N)3BaE_(|XNwsf>fYU2Qbi9w zAbwD>-AW?-fcs)pu}G{uVvfNlwq?eMb6~#4fgy29YjR*GD&vePN3xHl48OI%?T3fQ z6SdbwxSwyj6ImXxylRxwuvV{1yM*>MiWpLllfTsi|De~RAC6Rh+*%O<|4@MaPtE;Z zamZlw|10@mgZ2z0ANb@9kF4B1?X2xA%slN}oEbHtFD2SpSa~o?+j-l0Kq0(BNR;5e zOnKNW?lRs(B83?LU5Oxpk#%urH1qPbb#b@zx3XmP@~~obadw2hc7#M+$HXAN`L{-? zx!XCJx%)9{xVU)!txbG?X%j#4J|sy0qfOUd-hXM6K2rVvt04YA>tRanACL((p;Ovj zVka>B080n-5=a@;43MwIZp1CU%j2d zs&|h@@`+PKLx_N7`1&W2Fx(e?*n`g|{<-R{dGqe8;U}$TTpqbV`B_+Zt zI49Z;ac%>Da9?szS>pJy>X)i8zNMII z`L$|+q+N5OILym}z^-bq>t^nWc07~0zD@8$Vm~U~A3M8_Hv|lvB%Pg7MJ|=n9`$X0 zx@(svfVJj$jHR`t<2QI@-_vES@YA8uB!46B_sLK9snOp|M_d;3>knQ&rY1#=YyYEl zp^(<0klg=tW~g&R8il0)#}9RGvVS`FUsCn2zD;(mKIGRDg@eR`92f{7J+8wT;f_dq zq%9V{X}BC1ekucEBVqriETKIAo7nsxx^&}Om;RgOzsVB+b*>C>E+jN6X0T@53BUcn zihHfBPCQzF4WDX{B)J~*T}v$LziaCM5?&DNuVMBU>2-zV&?D)1Zy;&@)uu@`{hZ94 zJ*_O%6y>>ix$fT+__qPzzm5<8K7f=s7NHVN-|j45or~jna#&!TR6c3^kG}ku2%76z z8wv7kqmDX?aRfr~$hE$@zF6>Q3(}eT$k@z&)0M>g62}BL_eGv5!{O!*sbKy{#)9@B zC9B^+Es>pLMB5s!K2CUJuLE5)r>?U`-$1H{2iuXr(w(Mal!GCgK#kWU0_~Txk9$lK z#c17h`S@o%+Vlpu(7h`y=daQ(F@C+^eX16`#NlHLK4tam$Gpc>5+<>KM2pc5$3v@+ zbP6DZTUY~{qqP;WnEFl4*x5RdL$*~qz`CMYe6n`5$U%rKYdKBj#=G~*3NWAIyU9Kj zE8{KntBR)Mtks`GnVWPy49L0$n{-(5U%P3p$7*Zb|J0$+pkf0>x!VqtO+VZd%+0vWC;rj#&4luD1`5Al#JsesCs zr4oCC%nj!65B`0xftUb11UkrgP?-Cm^LR-yK}o*cQAdgpzD$JL!4^}n;FD7nxoet^ zeMN^HtF7|;F0KA6$dMaejl-3b6i9P;fH{^yUTU|%#Oh}9;hiK1i{}_E!7+x0N zCx5>CLuSGtr@{hv^jC~oz=Q<~7I8)4HO}yHsY2C+*V~v&8&9QuG3`SYv#54uac1bB z=C|japNH@Q9E6TPQw`t;xdd!j>NBxFe9Rr~dzT|`oY_a3prxMDqO_`^W9@u|_!K-S z8x9l2QQBQOUDEtLiw{pfRPai%poT$@cwbLBdHMMSczN}q*~UK;XIwZh0?v5Xh@=7^ z@w%Dgac|2~wI*gl>b)erI$Wo%j1Hyk*z@lHR2}r$o(m9|3Y| zv~E0jqRjYcf-Ap8HcYsfK;kRi5g{w4Hi90l8-yDtXZwrW k^ZZt5@9*?r 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�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 delta 60752 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 diff --git a/Shared/data/MTA San Andreas/MTA/bassmix.dll b/Shared/data/MTA San Andreas/MTA/bassmix.dll index 9207cb1bfa29a4d39f42b6bffaa42fb7c3bcc2de..6792184fc767dbe0df4637e460f68ead7bf31de5 100644 GIT binary patch delta 25138 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

    on systems without pkg-config. - Closes #8076 + Closes #8375 -- CURLMOPT_TIMERFUNCTION.3: call it expire time, not interval +- scripts/release-notes.pl: remove leftover debug output + +- RELEASE-NOTES: synced + +- scripts/release-notes.pl: fix number extraction for full URLs + +- [Leah Neukirchen brought this change] + + scripts/completion.pl: improve zsh completion - Since we say it is a non-repating timer + - Detect all spellings of , etc as well as . + - Only complete directories for . + - Complete URLs for . + - Complete --request and --ftp-method. + + Closes #8363 -- [Florian Van Heghe brought this change] +- [Davide Cassioli brought this change] - mbedTLS: include NULL byte in blob data length for CURLOPT_CAINFO_BLOB + configure: use correct CFLAGS for threaded resolver with xlC on AIX - Fixes #8079 - Closes #8081 + Fixes #8276 + Closes #8374 -Jay Satiro (2 Dec 2021) -- [Wyatt O'Day brought this change] +- mailmap: Henrik Holst - version_win32: Check build number and platform id +Jay Satiro (2 Feb 2022) +- build: fix ngtcp2 crypto library detection - Prior to this change the build number was not checked during version - comparison, and the platform id was supposed to be checked but wasn't. + - Change library link check for ngtcp2_crypto_{gnutls,openssl} to + to use function ngtcp2_crypto_recv_client_initial_cb instead of + ngtcp2_crypto_ctx_initial. - Checking the build number is required for enabling "evergreen" - Windows 10/11 features (like TLS 1.3). + The latter function is no longer external since two days ago in + ngtcp2/ngtcp2@533451f. curl HTTP/3 CI builds have been failing since + then because they would not link to the ngtcp2 crypto library. - Ref: https://github.com/curl/curl/pull/7784 + Ref: https://github.com/ngtcp2/ngtcp2/pull/356 - Closes https://github.com/curl/curl/pull/7824 - Closes https://github.com/curl/curl/pull/7867 + Closes https://github.com/curl/curl/pull/8372 -- libssh2: fix error message for sha256 mismatch +- [Henrik Holst brought this change] + + urlapi: remove an unnecessary call to strlen - - On mismatch error show sha256 fingerprint in base64 format. + - Use strcpy instead of strlen+memcpy to copy the url path. - Prior to this change the fingerprint was mistakenly printed in binary. + Ref: https://curl.se/mail/lib-2022-02/0006.html + + Closes https://github.com/curl/curl/pull/8370 -Daniel Stenberg (1 Dec 2021) -- [x2018 brought this change] +Daniel Stenberg (1 Feb 2022) +- scripts/copyright.pl: fix for handling removed files better - openssl: check the return value of BIO_new() +- vxworks: drop support - Closes #8078 + No changes or fixes in vxworks related code since 2009 leads me to + believe that this doesn't work anymore. + + Closes #8362 -Dan Fandrich (30 Nov 2021) -- docs: Update the Reducing Size section +- [Henrik Holst brought this change] + + base64: remove an unnecessary call to strlen - Add many more options that can reduce the size of the binary that were - added since the last update. Update the sample minimal binary size for - version 7.80.0. + Closes #8369 -- tests: Add some missing keywords to tests +- tool_getparam: initial --json support - These are needed to skip some tests when configure options have disabled - certain features. + Adds these test cases: + + 383 - simple single command line option + 384 - reading it from stdin + 385 - getting two --json options on command line + 386 - --next works after --json + + Closes #8314 -Daniel Stenberg (30 Nov 2021) -- [Florian Van Heghe brought this change] +- [Bjarni Ingi Gislason brought this change] - mbedTLS: add support for CURLOPT_CAINFO_BLOB + curl_getdate.3: remove pointless .PP line - Closes #8071 + mandoc: WARNING: skipping paragraph macro: PP empty + + Reported-by: Samuel Henrique + Closes #8365 -- [Glenn Strauss brought this change] +- [Sebastian Sterk brought this change] - digest: compute user:realm:pass digest w/o userhash + multi: grammar fix in comment - https://datatracker.ietf.org/doc/html/rfc7616#section-3.4.4 - ... the client MUST calculate a hash of the username after - any other hash calculation ... + After 'must', the verb is used without 'to'. Correct: "must" or "have + to" - Signed-off-by: Glenn Strauss - Closes #8066 + Closes #8368 -- config.d: update documentation to match the path search +- openldap: fix compiler warning when built without SSL support - Assisted-by: Jay Satiro + openldap.c:841:52: error: unused parameter ‘data’ [-Werror=unused-parameter] + + Closes #8367 -- tool_findfile: search for a file in the homedir +- [Samuel Henrique brought this change] + + CURLSHOPT_LOCKFUNC.3: fix typo "relased" -> "released" - The homedir() function is now renamed into findfile() and iterates over - all the environment variables trying to access the file in question - until it finds it. Last resort is then getpwuid() if - available. Previously it would first try to find a home directory and if - that was set, insist on checking only that directory for the file. This - now returns the full file name it finds. + Found when packaging 7.81.0 for Debian. - The Windows specific checks are now done differently too and in this - order: + Closes #8364 + +- netware: remove support - 1 - %USERPROFILE% - 2 - %APPDATA% - 3 - %USERPROFILE%\\Application Data + There are no current users and no Netware related changes done in the + code for over 13 years is a clear sign this is abandoned. - The windows order is modified to match how the Windows 10 ssh tool works - when it searches for .ssh/known_hosts. + Closes #8358 + +- CI: move two jobs from Zuul to Circle CI - Reported-by: jeffrson on github - Co-authored-by: Jay Satiro - Fixes #8033 - Closes #8035 + - openssl-no-verbose + - openssl-no-proxy + + Closes #8359 -- docs: consistent manpage SYNOPSIS +- cirlceci: also run a c-ares job on arm with debug enabled - Make all libcurl related options use .nf (no fill) for the SYNOPSIS - section - for consistent look. roffit then renders that section using -
     (monospace font) in html for the website.
    +  Closes #8357
    +
    +- ci: move the OpenSSL + c-ares job from Zuul to Circle CI
       
    -  Extended manpage-syntax (test 1173) with a basic check for it.
    +  Closes #8357
    +
    +- mailmap: Jan-Piet Mens
    +
    +- [luminixinc on github brought this change]
    +
    +  multi: remember connection_id before returning connection to pool
       
    -  Closes #8062
    +  Fix a bug that does not require a new CVE as discussed on hackerone.com.
    +  Previously `connection_id` was accessed after returning connection to
    +  the shared pool.
    +  
    +  Bug: https://hackerone.com/reports/1463013
    +  Closes #8355
    +
    +Jay Satiro (31 Jan 2022)
    +- write-out.d: Fix num_headers formatting
     
    +- [Jan-Piet Mens brought this change]
    +
    +  docs: capitalize the name 'Netscape'
    +  
    +  Closes https://github.com/curl/curl/pull/8354
    +
    +Daniel Stenberg (30 Jan 2022)
     - RELEASE-NOTES: synced
     
    -- [Patrick Monnerat brought this change]
    +- [Antoine Pietri brought this change]
     
    -  openldap: handle connect phase with a state machine
    +  docs: grammar proofread, typo fixes
       
    -  Closes #8054
    +  (Partially automated) proofread of most of the documentation, leading to
    +  various typo fixes.
    +  
    +  Closes #8353
     
    -- docs: address proselint nits
    +- urldata: CONN_IS_PROXIED replaces bits.close when proxy can be disabled
       
    -  - avoid exclamation marks
    -  - use consistent number of spaces after periods: one
    -  - avoid clichés
    -  - avoid using 'very'
    +  To remove run-time checks for such builds.
       
    -  Closes #8060
    +  Closes #8350
     
    -- [Bruno Baguette brought this change]
    +- setopt: fix the TLSAUTH #ifdefs for proxy-disabled builds
    +  
    +  Closes #8350
     
    -  FAQ: typo fix : "yout" ➤ "your"
    +- conncache: make conncache_add_bundle return the pointer
       
    -  Closes #8059
    +  Simplifies the logic a little and avoids a ternary operator.
    +  
    +  Ref: #8346
    +  Closes #8349
     
    -- [Bruno Baguette brought this change]
    +- mailmap: neutric on github
     
    -  docs/INSTALL.md: typo fix : added missing "get" verb
    +Jay Satiro (30 Jan 2022)
    +- [neutric on github brought this change]
    +
    +  docs/TheArtOfHttpScripting: fix example POST URL
       
    -  Closes #8058
    +  Closes https://github.com/curl/curl/pull/8352
     
    -- insecure.d: detail its use for SFTP and SCP as well
    +Daniel Stenberg (28 Jan 2022)
    +- nss: handshake callback during shutdown has no conn->bundle
       
    -  Closes #8056
    +  The callback gets called because of the call to PR_Recv() done to
    +  attempt to avoid RST on the TCP connection. The conn->bundle pointer is
    +  already cleared at this point so avoid dereferencing it.
    +  
    +  Reported-by: Eric Musser
    +  Fixes #8341
    +  Closes #8342
     
    -Viktor Szakats (25 Nov 2021)
    -- Makefile.m32: rename -winssl option to -schannel and tidy up
    +- [Michał Antoniak brought this change]
    +
    +  mbedtls: remove #include 
       
    -  - accept `-schannel` as an alternative to `CFG` option `-winssl`
    -    (latter still accepted, but deprecated)
    -  - rename internal variable `WINSSL` to `SCHANNEL`
    -  - make the `CFG` option evaluation shorter, without repeating the option
    -    name
    +  mbedtls/certs.h file contains only certificates example (all definitions
    +  is beginning by mbedtls_test_*). None of them is used so we can avoid
    +  include the file.
       
    -  Reviewed-by: Marcel Raad
    -  Reviewed-by: Daniel Stenberg
    -  Closes #8053
    +  Closes #8343
     
    -Daniel Stenberg (25 Nov 2021)
    -- KNOWN_BUGS: 5.6 make distclean loops forever
    +- [Michał Antoniak brought this change]
    +
    +  mbedtls: enable use of mbedtls without CRL support
       
    -  Reported-by: David Bohman
    -  Closes #7716
    +  Closes #8344
     
    -- KNOWN_BUGS: add one, remove one
    +- [Bernhard Walle brought this change]
    +
    +  configure: set CURL_LIBRARY_PATH for nghttp2
       
    -  - 5.10 SMB tests fail with Python 2
    +  To execute the test program, we might need the library path so that the
    +  lib is found at runtime.
       
    -  Just use python 3.
    +  Closes #8340
    +
    +Jay Satiro (28 Jan 2022)
    +- schannel: restore debug message in schannel_connect_step2
       
    -  + 5.10 curl hangs on SMB upload over stdin
    +  This is a follow-up to recent commit 2218c3a which removed the debug
    +  message to avoid an unused variable warning. The message has been
    +  reworked to avoid the warning.
       
    -  Closes #7896
    +  Ref: https://github.com/curl/curl/pull/8320#issuecomment-1022957904
    +  
    +  Closes https://github.com/curl/curl/pull/8336
     
    -- urlapi: provide more detailed return codes
    +- test3021: disable all msys2 path transformation
       
    -  Previously, the return code CURLUE_MALFORMED_INPUT was used for almost
    -  30 different URL format violations. This made it hard for users to
    -  understand why a particular URL was not acceptable. Since the API cannot
    -  point out a specific position within the URL for the problem, this now
    -  instead introduces a number of additional and more fine-grained error
    -  codes to allow the API to return more exactly in what "part" or section
    -  of the URL a problem was detected.
    +  - Disable all MSYS2 path transformation in test3021 and test3022.
       
    -  Also bug-fixes curl_url_get() with CURLUPART_ZONEID, which previously
    -  returned CURLUE_OK even if no zoneid existed.
    +  Prior to this change path transformation in those tests was disabled
    +  only for arguments that start with forward slashes. However arguments
    +  that are in base64 contain forward slashes at any position and caused
    +  unwanted translations.
       
    -  Test cases in 1560 have been adjusted and extended. Tests 1538 and 1559
    -  have been updated.
    +  == Info: Denied establishing ssh session: mismatch sha256 fingerprint.
    +  Remote +/EYG2YDzDGm6yiwepEMSuExgRRMoTi8Di1UN3kixZw= is not equal to
    +  +C:/msys64/EYG2YDzDGm6yiwepEMSuExgRRMoTi8Di1UN3kixZw
       
    -  Updated libcurl-errors.3 and curl_url_strerror() accordingly.
    +  In the above example an argument containing a base64 sha256 fingerprint
    +  was passed to curl after MSYS2 translated +/ into +C:/msys64/, and then
    +  the fingerprint didn't match what was expected.
       
    -  Closes #8049
    +  Ref: https://www.msys2.org/wiki/Porting/
    +  
    +  Fixes https://github.com/curl/curl/issues/8084
    +  Closes https://github.com/curl/curl/pull/8325
     
    -- urlapi: make Curl_is_absolute_url always use MAX_SCHEME_LEN
    +Daniel Stenberg (27 Jan 2022)
    +- CI: move scan-build job from Zuul to Azure Pipelines
       
    -  Instad of having all callers pass in the maximum length, always use
    -  it. The passed in length is instead used only as the length of the
    -  target buffer for to storing the scheme name in, if used.
    +  Closes #8338
    +
    +Marcel Raad (27 Jan 2022)
    +- openssl: fix `ctx_option_t` for OpenSSL v3+
       
    -  Added the scheme max length restriction to the curl_url_set.3 man page.
    +  The options have been changed to `uint64_t` in
    +  https://github.com/openssl/openssl/commit/56bd17830f2d5855b533d923d4e0649d3ed61d11.
       
    -  Follow-up to 45bcb2eaa78c79
    +  Closes https://github.com/curl/curl/pull/8331
    +
    +Daniel Stenberg (27 Jan 2022)
    +- CI: move 'distcheck' job from zuul to azure pipelines
       
    -  Closes #8047
    +  Assisted-by: Kushal Das
    +  
    +  Closes #8334
     
    -- [Jay Satiro brought this change]
    +- vtls: pass on the right SNI name
    +  
    +  The TLS backends convert the host name to SNI name and need to use that.
    +  This involves cutting off any trailing dot and lowercasing.
    +  
    +  Co-authored-by: Jay Satiro
    +  Closes #8320
     
    -  cmake: warn on use of the now deprecated symbols
    +- url: revert the removal of trailing dot from host name
       
    -  Follow-up to 9108da2c26d
    +  Reverts 5de8d84098db1bd24e (May 2014, shipped in 7.37.0) and the
    +  follow-up changes done afterward.
       
    -  Closes #8052
    +  Keep the dot in names for everything except the SNI to make curl behave
    +  more similar to current browsers. This means 'name' and 'name.' send the
    +  same SNI for different 'Host:' headers.
    +  
    +  Updated test 1322 accordingly
    +  
    +  Fixes #8290
    +  Reported-by: Charles Cazabon
    +  Closes #8320
     
    -- [Kevin Burke brought this change]
    +- [neutric on github brought this change]
     
    -  tests/CI.md: add more information on CI environments
    +  docs/TheArtOfHttpScripting: fix capitalization
       
    -  Fixes #8012
    -  Closes #8022
    +  Closes #8333
     
    -- cmake: private identifiers use CURL_ instead of CMAKE_ prefix
    +- tests/memanalyze.pl: also count and show "total allocations"
       
    -  Since the 'CMAKE_' prefix is reserved for cmake's own private use.
    -  Ref: https://cmake.org/cmake/help/latest/manual/cmake-variables.7.html
    +  This is the total number of bytes allocated, increasing for new
    +  allocations and never reduced when freed. The existing "Maximum
    +  allocated" is the high water mark.
       
    -  Reported-by: Boris Rasin
    -  Fixes #7988
    -  Closes #8044
    +  Closes #8330
     
    -- urlapi: reject short file URLs
    +- mailmap: spellfix githuh => github
    +
    +- RELEASE-NOTES: synced
    +
    +- hostcheck: fixed to not touch used input strings
       
    -  file URLs that are 6 bytes or shorter are not complete. Return
    -  CURLUE_MALFORMED_INPUT for those. Extended test 1560 to verify.
    +  Avoids the need to clone the strings before check, thus avoiding
    +  mallocs, which for cases where there are many SAN names in a cert could
    +  end up numerous.
       
    -  Triggered by #8041
    -  Closes #8042
    +  Closes #8321
     
    -- curl: improve error message for --head with -J
    -  
    -  ... it now focuses on the "output of headers" combined with the
    -  --remote-header-name option, as that is actually the problem. Both
    -  --head and --include can output headers.
    +- ngtcp2: adapt to changed end of headers callback proto
       
    -  Reported-by: nimaje on github
    -  Fixes #7987
    -  Closes #8045
    +  Closes #8322
     
    -- RELEASE-NOTES: synced
    +- [Xiaoke Wang brought this change]
     
    -- [Stefan Eissing brought this change]
    +  openssl: check SSL_get_ex_data to prevent potential NULL dereference
    +  
    +  Closes #8268
     
    -  urlapi: cleanup scheme parsing
    +Jay Satiro (23 Jan 2022)
    +- md5: check md5_init_func return value
       
    -  Makea Curl_is_absolute_url() always leave a defined 'buf' and avoids
    -  copying on urls that do not start with a scheme.
    +  Prior to this change the md5_init_func (my_md5_init) return value was
    +  ignored.
       
    -  Closes #8043
    +  Closes https://github.com/curl/curl/pull/8319
     
    -- tool_operate: only set SSH related libcurl options for SSH URLs
    +- md5: refactor for standard compliance
       
    -  For example, this avoids trying to find and set the known_hosts file (or
    -  warn for its absence) if SFTP or SCP are not used.
    +  - Wrap OpenSSL / wolfSSL MD5 functions instead of taking their function
    +    addresses during static initialization.
       
    -  Closes #8040
    +  Depending on how curl was built the old way may have used a dllimport
    +  function address during static initialization, which is not standard
    +  compliant, resulting in Visual Studio warning C4232 (nonstandard
    +  extension). Instead the function pointers now point to the wrappers
    +  which call the MD5 functions.
    +  
    +  This change only affects OpenSSL and wolfSSL because calls to other SSL
    +  libraries' md5 functions were already wrapped. Also sha256.c already
    +  does this for all SSL libraries.
    +  
    +  Ref: https://github.com/curl/curl/pull/8298
    +  
    +  Closes https://github.com/curl/curl/pull/8318
     
    -- [Jacob Hoffman-Andrews brought this change]
    +Daniel Stenberg (21 Jan 2022)
    +- [Lucas Pardue brought this change]
     
    -  rustls: remove comment about checking handshaking
    +  docs: update IETF links to use datatracker
       
    -  The comment is incorrect in two ways:
    -   - It says the check needs to be last, but the check is actually first.
    -   - is_handshaking actually starts out true.
    +  The tools.ietf.org domain has been deprecated a while now, with the
    +  links being redirected to datatracker.ietf.org.
       
    -  Closes #8038
    +  Rather than make people eat that redirect time, this change switches the
    +  URL to a more canonical source.
    +  
    +  Closes #8317
     
    -Marcel Raad (20 Nov 2021)
    -- openssl: use non-deprecated API to read key parameters
    +- [Harry Sarson brought this change]
    +
    +  CI: test building wolfssl with --enable-opensslextra
       
    -  With OpenSSL 3.0, the parameters are read directly from the `EVP_PKEY`
    -  using `EVP_PKEY_get_bn_param`.
    +  Closes #8315
    +
    +- [Harry Sarson brought this change]
    +
    +  misc: allow curl to build with wolfssl --enable-opensslextra
       
    -  Closes https://github.com/curl/curl/pull/7893
    +  put all #include of openssl files behind wolfssl ifdefs so that we can
    +  use the wolfssl/ prefixed include paths. Without these curl only builds
    +  when wolfssl is built with enable-all.
    +  
    +  Fixes #8292
    +  Closes #8315
     
    -- openssl: reduce code duplication
    +- [Lucas Pardue brought this change]
    +
    +  quiche: change qlog file extension to `.sqlog`
       
    -  `BN_print`'s `BIGNUM` parameter has been `const` since OpenSSL 0.9.4.
    +  quiche has just switched it's qlog serialization format to JSON-SEQ by
    +  default . The spec says this SHOULD use `.sqlog` extension.
       
    -  Closes https://github.com/curl/curl/pull/7893
    +  I believe ngtcp2 also supports JSON-SEQ by default as of
    +  https://github.com/ngtcp2/ngtcp2/commit/9baf06fc3f352a1d062b6953ae1de22cae30639d
    +  
    +  Let's update curl so that tools know what format we are using!
    +  
    +  Closes #8316
     
    -- openssl: remove `RSA_METHOD_FLAG_NO_CHECK` handling if unavailable
    +Jay Satiro (21 Jan 2022)
    +- projects: Fix Visual Studio wolfSSL configurations
       
    -  The flag has been deprecated without replacement in OpenSSL 3.0.
    +  - Change build-wolfssl.bat to disable SSLv3, enable TLSv1.3, enable
    +    wolfSSL_DES_ecb_encrypt (needed by NTLM) and enable alt cert chains.
       
    -  Closes https://github.com/curl/curl/pull/7893
    +  - Disable warning C4214 'bit field types other than int'.
    +  
    +  - Add include directory wolfssl\wolfssl.
    +  
    +  wolfSSL offers OpenSSL API compatibility that libcurl uses, and some
    +  recent change in libcurl included an include file for wolfSSL like
    +  openssl/foo.h, which has a path like wolfssl\wolfssl\openssl\foo.h.
    +  
    +  The include directory issue was reported in #8292 but it's currently
    +  unclear whether this type of change is needed for other build systems.
    +  
    +  Bug: https://github.com/curl/curl/issues/8292
    +  Reported-by: Harry Sarson
    +  
    +  Closes https://github.com/curl/curl/pull/8298
     
    -- openssl: remove usage of deprecated `SSL_get_peer_certificate`
    +Daniel Stenberg (21 Jan 2022)
    +- openssl: return error if TLS 1.3 is requested when not supported
       
    -  The function name was changed to `SSL_get1_peer_certificate` in OpenSSL
    -  3.0.
    +  Previously curl would just silently ignore it if the necessary defines
    +  are not present at build-time.
       
    -  Closes https://github.com/curl/curl/pull/7893
    +  Reported-by: Stefan Eissing
    +  Fixes #8309
    +  Closes #8310
     
    -Daniel Stenberg (19 Nov 2021)
    -- page-footer: fix typo
    +- TODO: Passing NOTIFY option to CURLOPT_MAIL_RCPT
       
    -  Closes #8036
    +  Closes #8232
     
    -- http: enable haproxy support for hyper backend
    +- [pheiduck on github brought this change]
    +
    +  workflows/wolfssl: install impacket
       
    -  This is done by having native code do the haproxy header output before
    -  hyper issues its request. The little downside with this approach is that
    -  we need the entire Curl_buffer_send() function built, which is otherwise
    -  not used for hyper builds.
    +  needed Python Package for SMB tests
       
    -  If hyper ends up getting native support for the haproxy protocols we can
    -  backpedal on this.
    +  Closes #8307
    +
    +- url: make Curl_disconnect return void
       
    -  Enables test 1455 and 1456
    +   1. The function would only ever return CURLE_OK anyway
    +   2. Only one caller actually used the return code
    +   3. Most callers did (void)Curl_disconnect()
       
    -  Closes #8034
    +  Closes #8303
     
    -- [Bernhard Walle brought this change]
    +- docs: document HTTP/2 not insisting on TLS 1.2
    +  
    +  Both for --http2 and CURLOPT_HTTP_VERSION.
    +  
    +  Reported-by: jhoyla on github
    +  Fixes #8235
    +  Closes #8300
     
    -  configure: fix runtime-lib detection on macOS
    +- cmdline-opts/gen.pl: fix option matching to improve references
       
    -  With a non-standard installation of openssl we get this error:
    +  Previously it could mistakenly match partial names when there are
    +  options that start with the same prefix, leading to the wrong references
    +  used.
       
    -      checking run-time libs availability... failed
    -      configure: error: one or more libs available at link-time are not available run-time. Libs used at link-time: -lnghttp2 -lssl -lcrypto -lssl -lcrypto -lz
    +  Closes #8299
    +
    +- TODO: Less memory massaging with Schannel
    +
    +- [Patrick Monnerat brought this change]
    +
    +  runtests.pl: disable debuginfod
       
    -  There's already code to set LD_LIBRARY_PATH on Linux, so set
    -  DYLD_LIBRARY_PATH equivalent on macOS.
    +  Valgrind and gdb implement this feature: as this highly slows down tests,
    +  disable it.
       
    -  Closes #8028
    +  Closes #8291
     
    -- [Don J Olmstead brought this change]
    +- RELEASE-NOTES: synced
     
    -  cmake: don't set _USRDLL on a static Windows build
    +- CURLMOPT_TIMERFUNCTION/DATA.3: fix the examples
       
    -  Closes #8030
    +  ... to not call libcurl recursively back.
    +  
    +  Closes #8286
     
    -- page-footer: document more environment variables
    +- multi: set in_callback for multi interface callbacks
       
    -  ... that curl might use.
    +  This makes most libcurl functions return error if called from within a
    +  callback using the same multi handle. For example timer or socket
    +  callbacks calling curl_multi_socket_action.
       
    -  Closes #8027
    +  Reported-by: updatede on github
    +  Fixes #8282
    +  Closes #8286
     
    -- netrc.d: edit the .netrc example to look nicer
    +- docs/HISTORY.md: mention alt-svc and HSTS
    +
    +- misc: remove the final watcom references
       
    -  Works nicely thanks to d1828b470f43d
    +  Follow-up to bbf8cae44dedc495e6
       
    -  Closes #8025
    +  We removed support for the watcom builds files back in September
    +  2020. This removes all remaining watcom references and ifdefs.
    +  
    +  Closes #8287
     
    -- tftp: mark protocol as not possible to do over CONNECT
    +- misc: remove BeOS code and references
       
    -  ... and make connect_init() refusing trying to tunnel protocols marked
    -  as not working. Avoids a double-free.
    +  There has not been a mention of this OS in any commit since December
    +  2004 (58f4af7973e3d2). The OS is also long gone.
       
    -  Reported-by: Even Rouault
    -  Fixes #8018
    -  Closes #8020
    +  Closes #8288
     
    -- docs/cmdline-opts: do not say "protocols: all"
    +- tool_getparam: DNS options that need c-ares now fail without it
       
    -  Remove the lines saying "protocols: all". It makes the output in the
    -  manpage look funny, and the expectation is probably by default that if
    -  not anything is mentioned about protocols the option apply to them all.
    +  Just silently accepting the options and then not having any effect is
    +  not good.
       
    -  Closes #8021
    +  Ref: #8283
    +  Closes #8285
     
    -- curl.1: require "see also" for every documented option
    +- curl: remove "separators" (when using globbed URLs)
       
    -  gen.pl now generates a warning if the "See Also" field is not filled in for a
    -  command line option
    +  Unless muted (with -s) When doing globbing, curl would output mime-like
    +  separators between the separate transfers. This is not documented
    +  anywhere, surprises users and clobbers the output. Gone now.
       
    -  All command line options now provide one or more related options. 167
    -  "See alsos" added!
    +  Updated test 18 and 1235
       
    -  Closes #8019
    +  Reported-by: jonny112 on github
    +  Bug: https://github.com/curl/curl/discussions/8257
    +  Closes #8278
     
    -- insecure.d: expand and clarify
    +Jay Satiro (15 Jan 2022)
    +- [Niels Martignène brought this change]
    +
    +  mbedtls: fix CURLOPT_SSLCERT_BLOB (again)
       
    -  Closes #8017
    +  - Increase the buffer length passed to mbedtls_x509_crt_parse to account
    +    for the null byte appended to the temporary blob.
    +  
    +  Follow-up to 867ad1c which uses a null terminated copy of the
    +  certificate blob, because mbedtls_x509_crt_parse requires PEM data
    +  to be null terminated.
    +  
    +  Ref: https://github.com/curl/curl/commit/867ad1c#r63439893
    +  Ref: https://github.com/curl/curl/pull/8146
    +  
    +  Closes https://github.com/curl/curl/pull/8260
     
    -- gen.pl: improve example output format
    +Daniel Stenberg (15 Jan 2022)
    +- [Alessandro Ghedini brought this change]
    +
    +  quiche: verify the server cert on connect
       
    -  Treat consecutive lines that start with a space to be "examples". They
    -  are output enclosed by .nf and .fi
    +  Similarly to c148f0f551f9bea0e3d0, make quiche correctly acknowledge
    +  `CURLOPT_SSL_VERIFYPEER` and `CURLOPT_SSL_VERIFYHOST`.
       
    -  Updated form.d to use this new fanciness
    +  Fixes #8173
    +  Closes #8275
    +
    +- [Ikko Ashimine brought this change]
    +
    +  checksrc: fix typo in comment
       
    -  Closes #8016
    +  enfore -> enforce
    +  
    +  Closes #8281
     
    -- Revert "form-escape.d: double the back-slashes for proper man page output"
    +- curl-openssl: remove the OpenSSL headers and library versions check
       
    -  This reverts commit a2d8eac04a4eb1d5a98cf24b4e5cec5cec565d27.
    +  It is more work to maintain that check than the (any?) benefit it
    +  brings.
       
    -  silly me, it was intended to be one backslash!
    +  Fixes #8279
    +  Reported-by: Satadru Pramanik
    +  Closes #8280
     
    -- form-escape.d: double the back-slashes for proper man page output
    +- mqtt: free any leftover when done
    +  
    +  Oss-fuzz found an issue when the "sendleftovers" pointer could leak memory.
    +  Fix this by always freeing it (if still assigned) in the done function.
    +  
    +  Bug: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=43515
    +  Closes #8274
     
    -- page-footer: add a mention of how to report bugs to the man page
    +- formdata: avoid size_t => long typecast overflows
    +  
    +  Typically a problem for platforms with 32 bit long and 64 bit size_t
    +  
    +  Reported-by: Fabian Yamaguchi
    +  Bug: https://hackerone.com/reports/1444539
    +  Closes #8272
     
     - RELEASE-NOTES: synced
       
    -  and bump to 7.81.0-DEV
    +  bump next release to become 7.82.0
     
    -- [Patrick Monnerat brought this change]
    +Marcel Raad (13 Jan 2022)
    +- build: enable -Warith-conversion
    +  
    +  This makes the behavior consistent between GCC 10 and earlier versions.
    +  
    +  Closes https://github.com/curl/curl/pull/8271
     
    -  mime: use percent-escaping for multipart form field and file names
    +- build: fix -Wenum-conversion handling
       
    -  Until now, form field and file names where escaped using the
    -  backslash-escaping algorithm defined for multipart mails. This commit
    -  replaces this with the percent-escaping method for URLs.
    +  Don't enable that warning when warnings are disabled.
    +  Also add it to CMake.
       
    -  As this may introduce incompatibilities with server-side applications, a
    -  new libcurl option CURLOPT_MIME_OPTIONS with bitmask
    -  CURLMIMEOPT_FORMESCAPE is introduced to revert to legacy use of
    -  backslash-escaping. This is controlled by new cli tool option
    -  --form-escape.
    +  Closes https://github.com/curl/curl/pull/8271
    +
    +- appveyor: use VS 2017 image for the autotools builds
       
    -  New tests and documentation are provided for this feature.
    +  The newer images don't have all required MSYS2 packages.
       
    -  Reported by: Ryan Sleevi
    -  Fixes #7789
    -  Closes #7805
    +  Fixes https://github.com/curl/curl/issues/8248
    +  Closes https://github.com/curl/curl/pull/8265
     
    -- [Kevin Burke brought this change]
    +- appveyor: update images from VS 2019 to 2022
    +  
    +  Closes https://github.com/curl/curl/pull/8265
     
    -  zuul.d: update rustls-ffi to version 0.8.2
    +Daniel Stenberg (12 Jan 2022)
    +- [Michał Antoniak brought this change]
    +
    +  mbedtls: return CURLcode result instead of a mbedtls error code
       
    -  This version fixes errors with ALPN negotiation in rustls, which is
    -  necessary for HTTP/2 support. For more information see the rustls-ffi
    -  changelog.
    +  ... when a certificate fails to be loaded from a blob
       
    -  Closes #8013
    +  Closes #8266
     
    -- configure: better diagnostics if hyper is built wrong
    +- curl_multi_socket.3: remove callback and typical usage descriptions
       
    -  If hyper is indeed present in the specified directory but couldn't be
    -  used to find the correct symbol, then offer a different error message to
    -  better help the user understand the issue.
    +  1. The callback is better described in the option for setting it. Having
    +  it in a single place reduces the risk that one of them is wrong.
       
    -  Suggested-by: Jacob Hoffman-Andrews
    -  Fixes #8001
    -  Closes #8005
    +  2. The "typical usage" is wrong since the functions described in this
    +  man page are both deprecated so they cannot be used in any "typical" way
    +  anymore.
    +  
    +  Closes #8262
     
    -- test1939: require proxy support to run
    +- curl-functions.m4: revert DYLD_LIBRARY_PATH tricks in CURL_RUN_IFELSE
       
    -  Follow-up to f0b7099a10d1a
    +  Mostly reverts ba0657c343f, but now instead just run the plain macro on
    +  darwin. The approach as used on other platforms is simply not necessary
    +  on macOS.
       
    -  Closes #8011
    +  Fixes #8229
    +  Reported-by: Ryan Schmidt
    +  Closes #8247
     
    -- test302[12]: run only with the libssh2 backend
    +- [Patrick Monnerat brought this change]
    +
    +  openldap: implement SASL authentication
       
    -  ... as the others don't support --hostpubsha256
    +  As credentials can be quite different depending on the mechanism used,
    +  there are no default mechanisms for LDAP and simple bind with a DN is
    +  then used.
       
    -  Reported-by: Paul Howarth
    -  Fixes #8009
    -  Closes #8010
    -
    -- runtests: make the SSH library a testable feature
    +  The caller has to provide mechanism(s) using CURLOPT_LOGIN_OPTIONS to
    +  enable SASL authentication and disable simple bind.
       
    -  libssh2, libssh and wolfssh
    +  Closes #8152
     
    -- [Jacob Hoffman-Andrews brought this change]
    +Jay Satiro (10 Jan 2022)
    +- [Cameron Will brought this change]
     
    -  rustls: read of zero bytes might be okay
    +  CURLOPT_RESOLVE.3: change example port to 443
       
    -  When we're reading out plaintext from rustls' internal buffers, we might
    -  get a read of zero bytes (meaning a clean TCP close, including
    -  close_notify). However, we shouldn't return immediately when that
    -  happens, since we may have already copied out some plaintext bytes.
    -  Break out of the loop when we get a read of zero bytes, and figure out
    -  which path we're dealing with.
    +  83cc966 changed documentation from using http to https. However,
    +  CURLOPT_RESOLVE being set to port 80 in the documentation means that it
    +  isn't valid for the new URL. Update to 443.
       
    -  Acked-by: Kevin Burke
    +  Closes https://github.com/curl/curl/pull/8258
    +
    +Daniel Stenberg (10 Jan 2022)
    +- [Fabian Keil brought this change]
    +
    +  test374: gif data without new line at the end
       
    -  Closes #8003
    +  Closes #8239
     
    -- [Jacob Hoffman-Andrews brought this change]
    +- [Fabian Keil brought this change]
     
    -  rustls: remove incorrect EOF check
    +  runtests.pl: support the nonewline attribute for the data part
       
    -  The update to rustls-ffi 0.8.0 changed handling of EOF and close_notify.
    -  From the CHANGELOG:
    +  Added to FILEFORMAT
       
    -  > Handling of unclean close and the close_notify TLS alert. Mirroring
    -  > upstream changes, a rustls_connection now tracks TCP closed state like
    -  > so: rustls_connection_read_tls considers a 0-length read from its
    -  > callback to mean "TCP stream was closed by peer."  If that happens
    -  > before the peer sent close_notify, rustls_connection_read will return
    -  > RUSTLS_RESULT_UNEXPECTED_EOF once the available plaintext bytes are
    -  > exhausted. This is useful to protect against truncation attacks. Note:
    -  > some TLS implementations don't send close_notify. If you are already
    -  > getting length information from your protocol (e.g. Content-Length in
    -  > HTTP) you may choose to ignore UNEXPECTED_EOF so long as the number of
    -  > plaintext bytes was as expected.
    +  Closes #8239
    +
    +- [Patrick Monnerat brought this change]
    +
    +  curl tool: erase some more sensitive command line arguments
       
    -  That means we don't need to check for unclean EOF in `cr_recv()`,
    -  because `process_new_packets()` will give us an error if appropriate.
    +  As the ps command may reveal sensitive command line info, obfuscate
    +  options --tlsuser, --tlspasswd, --proxy-tlsuser, --proxy-tlspassword and
    +  --oauth2-bearer arguments.
       
    -  Closes #8003
    +  Reported-by: Stephen Boost 
    +  
    +  Closes #7964
     
    -- lib1939: make it endure torture tests
    +- mesalink: remove support
       
    -  Follow-up to f0b7099a10d1a
    +  Mesalink has ceased development. We can no longer encourage use of it.
    +  It seems to be continued under the name TabbySSL, but no attempts have
    +  (yet) been to make curl support it.
       
    -  Closes #8007
    +  Fixes #8188
    +  Closes #8191
     
    -- azure: make the "w/o HTTP/SMTP/IMAP" build disable SSL proper
    +- ldap: return CURLE_URL_MALFORMAT for bad URL
       
    -  The configure line would previously depend on a configure mistake using
    -  --without-openssl that is fixed and now this configure line needs
    -  adjusting to use --without-ssl.
    +  For consistency, use the same return code for URL malformats,
    +  independently of what scheme that is used. Previously this would return
    +  CURLE_LDAP_INVALID_URL, but starting now that error cannot be returned.
       
    -  Follow-up to b589696f0312d
    +  Closes #8170
    +
    +- docs/cmdline-opts: add "mutexed" options for more http versions
       
    -  Closes #8006
    +  Update four http version man page sections.
    +  
    +  Closes #8254
     
    -- [Jacob Hoffman-Andrews brought this change]
    +- [Stephen M. Coakley brought this change]
     
    -  configure: add -lm to configure for rustls build.
    +  rustls: add CURLOPT_CAINFO_BLOB support
       
    -  Note: The list of libraries that rustc tells us we need to include is
    -  longer, but also includes some more platform-specific libraries that I
    -  am not sure how to effectively incorporate. Adding just -lm seems to
    -  solve an immediate problem, so I'm adding just that.
    +  Add support for `CURLOPT_CAINFO_BLOB` `CURLOPT_PROXY_CAINFO_BLOB` to the
    +  rustls TLS backend. Multiple certificates in a single PEM string are
    +  supported just like OpenSSL does with this option.
       
    -  Closes #8002
    +  This is compatible at least with rustls-ffi 0.8+ which is our new
    +  minimum version anyway.
    +  
    +  I was able to build and run this on Windows, pulling trusted certs from
    +  the system and then add them to rustls by setting
    +  `CURLOPT_CAINFO_BLOB`. Handy!
    +  
    +  Closes #8255
     
    -- curl_share_setopt.3: refer to CURLSHOPT_USERDATA(3) properly
    +- scripts/copyright.pl: ignore missing files
     
    -- curl_share_setopt.3: split out options into their own manpages
    +- RELEASE-NOTES: synced
    +
    +- data/DISABLED: disable test 313 for wolfssl builds
       
    -  CURLSHOPT_LOCKFUNC.3
    -  CURLSHOPT_SHARE.3
    -  CURLSHOPT_UNLOCKFUNC.3
    -  CURLSHOPT_UNSHARE.3
    -  CURLSHOPT_USERDATA.3
    +  It was previously disabled only in the CI jobs yaml
       
    -  Closes #7998
    +  Closes #8252
     
    -- http_proxy: make Curl_connect_done() work for proxy disabled builds
    +- runtests: make 'wolfssl' a testable feature
       
    -  ... by making it an empty macro then.
    +  Closes #8252
    +
    +- GHA: install stunnel in the medbtls + wolfssl CI jobs
       
    -  Follow-up to f0b7099a10d1a
    -  Reported-by: Vincent Grande
    -  Fixes #7995
    -  Closes #7996
    +  Closes #8252
     
    -- Curl_connect_done: handle being called twice
    +- CI: move the rustls CI job to GHA from Zuul
       
    -  Follow-up to f0b7099a10d1a7c
    +  Closes #8251
    +
    +- DISABLE: disable a dozen tests in the rustls build
       
    -  When torture testing 1021, it turns out the Curl_connect_done function
    -  might be called twice and that previously then wrongly cleared the HTTP
    -  pointer in the second invoke.
    +  Disables tests that don't yet work with the rustls backend.
       
    -  Closes #7999
    +  Fixes #8004
    +  Closes #8250
     
    -- [Stan Hu brought this change]
    +- runtests: make 'rustls' a testable feature
     
    -  configure: don't enable TLS when --without-* flags are used
    -  
    -  Previously specifying `--without-gnutls` would unexpectedly attempt to
    -  compile with GnuTLS, effectively interpreting this as
    -  `--with-gnutls`. This caused a significant amount of confusion when
    -  `libcurl` was built with SSL disabled since GnuTLS wasn't present.
    +- remote-header-name.d: clarify
       
    -  68d89f24 dropped the `--without-*` options from the configure help, but
    -  `AC_ARG_WITH` still defines these flags automatically. As
    -  https://www.gnu.org/software/autoconf/manual/autoconf-2.60/html_node/External-Software.html
    -  describes, the `action-if-given` is called when the user specifies
    -  `--with-*` or `--without-*` options.
    -  
    -  To prevent this confusion, we make the `--without` flag do the right
    -  thing by ignoring the value if it set to "no".
    +  - it strips off the path from the server provided name
    +  - it saves in current directory or --output-dir
       
    -  Closes #7994
    -
    -- [Rikard Falkeborn brought this change]
    +  Ref: https://curl.se/mail/archive-2022-01/0032.html
    +  Closes #8249
     
    -  docs/checksrc: Add documentation for STRERROR
    +- url: given a user in the URL, find pwd for that user in netrc
       
    -  Closes #7991
    -
    -- vtls/rustls: adapt to the updated rustls_version proto
    +  Add test 380 and 381 to verify, edited test 133
       
    -  Closes #7956
    +  Reported-by: Manfred Schwarb
    +  Fixes #8241
    +  Closes #8243
     
    -- [Kevin Burke brought this change]
    +- [Niels Martignène brought this change]
     
    -  vtls/rustls: handle RUSTLS_RESULT_PLAINTEXT_EMPTY
    +  mbedtls: Fix ssl_init error with mbedTLS 3.1.0+
       
    -  Previously we'd return CURLE_READ_ERROR if we received this, instead
    -  of triggering the error handling logic that's present in the next if
    -  block down.
    +  Since mbedTLS 3.1.0, mbedtls_ssl_setup() fails if the provided
    +  config struct is not valid.
       
    -  After this change, curl requests to https://go.googlesource.com using
    -  HTTP/2 complete successfully.
    +  mbedtls_ssl_config_defaults() needs to be called before the config
    +  struct is passed to mbedtls_ssl_setup().
       
    -  Fixes #7949
    -  Closes #7948
    -
    -- [Kevin Burke brought this change]
    -
    -  zuul: update build environment for rustls-ffi 0.8.0
    +  Closes #8238
     
    -- [Kevin Burke brought this change]
    +- [Filip Lundgren brought this change]
     
    -  vtls/rustls: update to compile with rustls-ffi v0.8.0
    +  cmake: fix iOS CMake project generation error
       
    -  Some method names, as well as the generated library name, were changed
    -  in a recent refactoring.
    +  Closes #8244
    +
    +- ngtcp2: fix declaration of ‘result’ shadows a previous local
       
    -  Further, change the default configuration instructions to check for
    -  Hyper in either "target/debug" or "target/release" - the latter
    -  contains an optimized build configuration.
    +  Follow-up to 8fbd6feddfa587cfd3
       
    -  Fixes #7947
    -  Closes #7948
    +  Closes #8245
     
    -- RELEASE-NOTES: synced
    +- openssl.h: avoid including OpenSSL headers here
       
    -  and bump the version to 7.80.1
    -
    -- multi: shut down CONNECT in Curl_detach_connnection
    +  ... by instead using the struct version of the typedef'ed pointer. To
    +  fix build errors when both Schannel and OpenSSL are enabled.
       
    -  ... to prevent a lingering pointer that would lead to a double-free.
    +  Fixes #8240
    +  Reported-by: Jan Ehrhardt
    +  Closes #8246
    +
    +- curl_url_set.3: mention when CURLU_ALLOW_SPACE was added
    +
    +- tool_findfile: free mem properly
       
    -  Added test 1939 to verify.
    +  Follow-up to 764e4f066d5
       
    -  Reported-by: Stephen M. Coakley
    -  Fixes #7982
    -  Closes #7986
    +  Closes #8242
     
    -- curl_easy_cleanup.3: remove from multi handle first
    +- tool_findfile: check ~/.config/curlrc too
       
    -  Easy handles that are used by the multi interface should be removed from
    -  the multi handle before they are cleaned up.
    +  ... after the initial checks for .curlrc and if XDG_CONFIG_HOME is not
    +  set, use $HOME and $CURL_HOME to check if ~/.config/curlrc is present.
       
    -  Reported-by: Stephen M. Coakley
    -  Ref: #7982
    -  Closes #7983
    +  Add test 436 to verify
    +  
    +  Reported-by: Sandro Jaeckel
    +  Fixes #8208
    +  Closes #8213
     
    -- url.c: fix the SIGPIPE comment for Curl_close
    +- runtests: allow client/file to specify multiple directories
       
    -  Closes #7984
    +  ... and make sure to mkdir them all
     
    -Version 7.80.0 (10 Nov 2021)
    +- scripts/copyright.pl: support many provided file names on the cmdline
     
    -Daniel Stenberg (10 Nov 2021)
    -- RELEASE-NOTES: synced
    -  
    -  for curl 7.80.0
    +- [Fabian Keil brought this change]
     
    -- THANKS: add contributors from the 7.80.0 cycle
    +  tests/FILEFORMAT.md: fix typo
     
    -- [Tatsuhiro Tsujikawa brought this change]
    +- [Fabian Keil brought this change]
     
    -  ngtcp2: advertise h3 as well as h3-29
    -  
    -  Advertise h3 as well as h3-29 since some servers out there require h3
    -  for QUIC v1.
    -  
    -  Closes #7979
    +  Add test373: multiple chunks with binary zeros
     
    -- [Tatsuhiro Tsujikawa brought this change]
    +- [Fabian Keil brought this change]
     
    -  ngtcp2: use QUIC v1 consistently
    -  
    -  Since we switched to v1 quic_transport_parameters codepoint in #7960
    -  with quictls, lets use QUIC v1 consistently.
    -  
    -  Closes #7979
    +  Add test372: binary zero in data element
     
    -- [Tatsuhiro Tsujikawa brought this change]
    +- [Fabian Keil brought this change]
     
    -  ngtcp2: compile with the latest nghttp3
    -  
    -  Closes #7978
    +  tests/server/getpart.c: properly deal with binary data containing NUL bytes
     
    -Marc Hoersken (9 Nov 2021)
    -- tests: add Schannel-specific tests and disable unsupported ones
    -  
    -  Adds Schannel variants of SSLpinning tests that include the option
    -  --ssl-revoke-best-effort to ignore certificate revocation check
    -  failures which is required due to our custom test CA certificate.
    -  
    -  Disable the original variants if the Schannel backend is enabled.
    -  
    -  Also skip all IDN tests which are broken while using an msys shell.
    -  
    -  This is a step to simplify test exclusions for Windows and MinGW.
    -  
    -  Reviewed-by: Jay Satiro
    -  Reviewed-by: Marcel Raad
    -  Reviewed-by: Daniel Stenberg
    -  Closes #7968
    +- [Fabian Keil brought this change]
     
    -Daniel Stenberg (8 Nov 2021)
    -- docs: NAME fixes in easy option man pages
    -  
    -  Closes #7975
    +  runtests.pl: properly print the test if it contains binary zeros
     
    -- [Roger Young brought this change]
    +- mailmap: Xiaoke Wang
     
    -  ftp: make the MKD retry to retry once per directory
    +- openssl: copyright year update
       
    -  Reported-by: Roger Young
    -  Fixes #7967
    -  Closes #7976
    +  Follow-up to 30aea2b1ede
     
    -- tool_operate: reorder code to avoid compiler warning
    -  
    -  tool_operate.c(889) : warning C4701: potentially uninitialized local
    -  variable 'per' use
    -  
    -  Follow-up to cc71d352651a0d95
    -  Reported-by: Marc Hörsken
    -  Bug: https://github.com/curl/curl/pull/7922#issuecomment-963042676
    -  Closes #7971
    +- scripts/copyright.pl: hush unless -v (for verbose) is used
     
    -- curl_easy_perform.3: add a para about recv and send data
    -  
    -  Reported-by: Godwin Stewart
    -  Fixes #7973
    -  Closes #7974
    +- [Xiaoke Wang brought this change]
     
    -- tool_operate: fclose stream only if fopened
    +  openssl: check the return value of BIO_new_mem_buf()
       
    -  Fixes torture test failures
    -  Follow-up to cc71d352651
    +  Closes #8233
    +
    +- examples/multi-app.c: call curl_multi_remove_handle as well
       
    -  Closes #7972
    +  Fixes #8234
    +  Reported-by: Melroy van den Berg
    +  Closes #8236
     
    -- libcurl-easy.3: language polish
    +- COPYING: bump copyright year range
     
    -- limit-rate.d: this is average over several seconds
    +- RELEASE-NOTES: synced
       
    -  Closes #7970
    +  and bump curlver after release
     
    -- docs: reduce/avoid English contractions
    -  
    -  You're => You are
    -  Hasn't => Has not
    -  Doesn't => Does not
    -  Don't => Do not
    -  You'll => You will
    -  etc
    +- docs: fix mandoc -T lint formatting complaints
       
    -  Closes #7930
    +  Closes #8228
     
    -- tool_operate: fix torture leaks with etags
    +- next.d. remove .fi/.nf as they are handled by gen.pl
       
    -  Spotted by torture testing 343 344 345 347.
    +  Closes #8228
    +
    +- gen.pl: terminate "example" sections better
       
    -  Follow-up from cc71d352651a0
    -  Pointed-out-by: Dan Fandrich
    +  If the example (section that is prefixed with spaces) ends the
    +  description gen.pl would previously miss to output the terminating .fi
       
    -  Closes #7969
    +  Closes #8228
     
    -- [Amaury Denoyelle brought this change]
    +- [Satadru Pramanik brought this change]
     
    -  ngtcp2: support latest QUIC TLS RFC9001
    -  
    -  QUIC Transport Parameters Extension has been changed between draft-29
    -  and latest RFC9001. Most notably, its identifier has been updated from
    -  0xffa5 to 0x0039. The version is selected through the QUIC TLS library
    -  via the legacy codepoint.
    +  curl-functions.m4: fix LIBRARY_PATH adjustment to avoid eval
       
    -  Disable the usage of legacy codepoint in curl to switch to latest
    -  RFC9001. This is required to be able to keep up with latest QUIC
    -  implementations.
    +  $$ usage in a m4 file introduces the PID in linux.
    +  Instead, just duplicate previous working code with a case switch.
       
    -  Acked-by: Tatsuhiro Tsujikawa
    -  Closes #7960
    +  Fixes #8229
    +  Closes #8230
     
    -- test1173: make manpage-syntax.pl spot \n errors in examples
    +Version 7.81.0 (5 Jan 2022)
     
    -- man pages: fix backslash-n in examples
    -  
    -  ... to be proper backslash-backslash-n sequences to render nicely in man
    -  and on website.
    -  
    -  Follow-up to 24155569d8a
    -  Reported-by: Sergey Markelov
    +Daniel Stenberg (5 Jan 2022)
    +- RELEASE-NOTES: synced
       
    -  Fixes https://github.com/curl/curl-www/issues/163
    -  Closes #7962
    +  curl 7.81.0 release
     
    -- scripts/release-notes.pl: use out of repo links verbatim in refs
    +- THANKS: add names from 7.81.0 release
     
    -- tool_operate: a failed etag save now only fails that transfer
    +- curl_multi_init.3: fix the copyright year range
    +
    +- test719-721: require "proxy" feature present to run
       
    -  When failing to create the output file for saving an etag, only fail
    -  that particular single transfer and allow others to follow.
    +  Bug: https://github.com/curl/curl/pull/8223#issuecomment-1005188696
    +  Reported-by: Marc Hörsken
       
    -  In a serial transfer setup, if no transfer at all is done due to them
    -  all being skipped because of this error, curl will output an error
    -  message and return exit code 26.
    +  Closes #8226
    +
    +- test719: require ipv6 support to run
       
    -  Added test 369 and 370 to verify.
    +  Follow-up to effd2bd7ba2a5fd244
    +  Reported-by: Marc Hörsken
    +  Bug: https://github.com/curl/curl/pull/8217#issuecomment-1004681145
       
    -  Reported-by: Earnestly on github
    -  Ref: #7942
    -  Closes #7945
    +  Closes #8223
     
    -- [Kevin Burke brought this change]
    +- test719-721: verify SOCKS details
    +  
    +  Using the new verify/socks details
     
    -  .github: retry macos "brew install" command on failure
    +- runtests: add verify/socks check
       
    -  Previously we saw errors attempting to run "brew install", see
    -  https://github.com/curl/curl/runs/4095721123?check_suite_focus=true for
    -  an example, since this command is idempotent, it is safe to run again.
    +  If used, this data is compared with the data in log/socksd-request.log
    +  which the socksd server logs.
       
    -  Closes #7955
    +  Added to FILEFORMAT.md
     
    -- CURLOPT_ALTSVC_CTRL.3: mention conn reuse is preferred
    +- server/socksd: log atyp + address in a separate log
       
    -  Ref: https://github.com/curl/curl/discussions/7954
    +  To allow the test suite to verify that the right data arrived
    +
    +- socks5: use appropriate ATYP for numerical IP address host names
       
    -  Closes #7957
    +  When not resolving the address locallly (known as socks5h).
    +  
    +  Add test 719 and 720 to verify.
    +  
    +  Reported-by: Peter Piekarski
    +  Fixes #8216
    +  Closes #8217
    +
    +Jay Satiro (3 Jan 2022)
    +- curl_multi_init.3: fix EXAMPLE formatting
     
    +Daniel Stenberg (3 Jan 2022)
     - RELEASE-NOTES: synced
     
    -- zuul: pin the quiche build to use an older cmake-rs
    +- libtest: avoid "assignment within conditional expression"
       
    -  The latest cmake-rs assumes cmake's --parallel works. That was added in
    -  cmake 3.12, but a lot of our CI builds run on Ubuntu Bionic which only
    -  has cmake 3.10.
    +  In lib530, lib540 and lib582
       
    -  Fixes #7927
    -  Closes #7952
    -
    -- [Marc Hoersken brought this change]
    +  Closes #8218
     
    -  Revert "src/tool_filetime: disable -Wformat on mingw for this file"
    +- ftp: disable warning 4706 in MSVC
       
    -  This reverts commit 7c88fe375b15c44d77bccc9ab733b8069d228e6f.
    +  Follow-up to 21248e052d
       
    -  Follow up to #6535 as the pragma is obsolete with warnf
    +  Disabling "assignment within conditional expression" for MSVC needs to
    +  be done before the function starts, for it to take effect.
       
    -  Closes #7941
    +  Closes #8218
     
    -Jay Satiro (2 Nov 2021)
    -- schannel: fix memory leak due to failed SSL connection
    +- tool_operate: warn if too many output arguments were found
       
    -  - Call schannel_shutdown if the SSL connection fails.
    +  More output instructions than URLs is likely a user error.
       
    -  Prior to this change schannel_shutdown (which shuts down the SSL
    -  connection as well as memory cleanup) was not called when the SSL
    -  connection failed (eg due to failed handshake).
    +  Add test case 371 to verify
       
    -  Co-authored-by: Gisle Vanem
    +  Closes #8210
    +
    +- .github/workflows/mbedtls.yml: bump to mbedtls 3.1.0
       
    -  Fixes https://github.com/curl/curl/issues/7877
    -  Closes https://github.com/curl/curl/pull/7878
    +  Closes #8215
     
    -Daniel Stenberg (2 Nov 2021)
    -- Curl_updateconninfo: store addresses for QUIC connections too
    +- zuul: remove the mbedtls jobs
       
    -  So that CURLINFO_PRIMARY_IP etc work for HTTP/3 like for other HTTP
    -  versions.
    +  Now running as github workflows
       
    -  Reported-by: Jerome Mao
    -  Fixes #7939
    -  Closes #7944
    +  Closes #8215
     
    -- [Sergio Durigan Junior brought this change]
    +- github/workflows: add mbedtls and mbedtls-clang
    +  
    +  Closes #8215
     
    -  curl.1: fix typos in the manpage
    +- [Valentin Richter brought this change]
    +
    +  mbedtls: fix private member designations for v3.1.0
       
    -  s/transfering/transferring/
    -  s/transfered/transferred/
    +  "As a last resort, you can access the field foo of a structure bar by
    +  writing bar.MBEDTLS_PRIVATE(foo). Note that you do so at your own risk,
    +  since such code is likely to break in a future minor version of Mbed
    +  TLS." -
    +  https://github.com/ARMmbed/mbedtls/blob/f2d1199edc5834df4297f247f213e614f7782d1d/docs/3.0-migration-guide.md
       
    -  Signed-off-by: Sergio Durigan Junior 
    -  Closes #7937
    -
    -Marc Hoersken (1 Nov 2021)
    -- tests/smbserver.py: fix compatibility with impacket 0.9.23+
    +  That future minor version is v3.1.0. I set the >= to == for the version
    +  checks because v3.1.0 is a release, and I am not sure when the private
    +  designation was reverted after v3.0.0.
       
    -  impacket now performs sanity checks if the requested and to
    -  be served file path actually is inside the real share path.
    +  Closes #8214
    +
    +- [Valentin Richter brought this change]
    +
    +  cmake: prevent dev warning due to mismatched arg
       
    -  Ref: https://github.com/SecureAuthCorp/impacket/pull/1066
    +  -- curl version=[7.81.0-DEV]
    +  CMake Warning (dev) at /usr/share/cmake-3.22.1/Modules/FindPackageHandleStandardArgs.cmake:438 (message):
    +    The package name passed to `find_package_handle_standard_args` (MBEDTLS)
    +    does not match the name of the calling package (MbedTLS).  This can lead to
    +    problems in calling code that expects `find_package` result variables
    +    (e.g., `_FOUND`) to follow a certain pattern.
    +  Call Stack (most recent call first):
    +    deps/curl/CMake/FindMbedTLS.cmake:31 (find_package_handle_standard_args)
    +    deps/curl/CMakeLists.txt:473 (find_package)
    +  This warning is for project developers.  Use -Wno-dev to suppress it.
       
    -  Fixes #7924
    -  Closes #7935
    +  Closes #8207
     
    -Daniel Stenberg (1 Nov 2021)
    -- docs: reduce use of "very"
    +- urlapi: if possible, shorten given numerical IPv6 addresses
       
    -  "Very" should be avoided in most texts. If intensifiers are needed, try
    -  find better words instead.
    +  Extended test 1560 to verify
       
    -  Closes #7936
    +  Closes #8206
     
    -- [Tatsuhiro Tsujikawa brought this change]
    +- [Michał Antoniak brought this change]
     
    -  ngtcp2: specify the missing required callback functions
    +  url: reduce ssl backend count for CURL_DISABLE_PROXY builds
       
    -  Closes #7929
    +  Closes #8212
     
    -- CURLOPT_[PROXY]_SSL_CIPHER_LIST.3: bold instead of quote
    +- KNOWN_BUGS: "Trying local ports fails on Windows"
       
    -  Bold the example ciphers instead of using single quotes, which then also
    -  avoids the problem of how to use single quotes when first in a line.
    +  Reported-by: gclinch on github
    +  Closes #8112
    +
    +- misc: update copyright year range
    +
    +- zuul: remove the wolfssl even more
       
    -  Also rephrased the pages a little.
    +  Follow-up to 1914465cf180d32b3d
    +
    +- examples/multi-single.c: remove WAITMS()
       
    -  Reported-by: Sergio Durigan Junior
    -  Ref: #7928
    -  Closes #7934
    +  As it isn't used.
    +  
    +  Reported-by: Melroy van den Berg
    +  Fixes #8200
    +  Closes #8201
     
    -- gen.pl: replace leading single quotes with \(aq
    +- gtls: add gnutls include for the session type
       
    -  ... and allow single quotes to be used "normally" in the .d files.
    +  Follow-up to 8fbd6feddfa5 to make it build more universally
    +
    +- m4/curl-compilers: tell clang -Wno-pointer-bool-conversion
       
    -  Makes the output curl.1 use better nroff.
    +  To hush compiler warnings we don't care for: error: address of function
    +  'X' will always evaluate to 'true'
       
    -  Reported-by: Sergio Durigan Junior
    -  Ref: #7928
    -  Closes #7933
    +  Fixes #8197
    +  Closes #8198
     
    -Marc Hoersken (1 Nov 2021)
    -- tests: kill some test servers afterwards to avoid locked logfiles
    +- http_proxy: don't close the socket (too early)
       
    -  Reviewed-by: Daniel Stenberg
    -  Closes #7925
    +  ... and double-check in the OpenSSL shutdown that the socket is actually
    +  still there before it is used.
    +  
    +  Fixes #8193
    +  Closes #8195
    +  
    +  Reported-by: Leszek Kubik
     
    -Daniel Stenberg (1 Nov 2021)
    -- smooth-gtk-thread.c: enhance the mutex lock use
    +- ngtcp2: verify the server certificate for the gnutls case
       
    -  Reported-by: ryancaicse on github
    -  Fixes #7926
    -  Closes #7931
    +  Closes #8178
     
    -Marc Hoersken (31 Oct 2021)
    -- CI/runtests.pl: restore -u flag, but remove it from CI runs
    +- ngtcp2: verify the server cert on connect (quictls)
       
    -  This makes it possible to use -u again for local testing,
    -  but removes the flag from CI config files and make targets.
    +  Make ngtcp2+quictls correctly acknowledge `CURLOPT_SSL_VERIFYPEER` and
    +  `CURLOPT_SSL_VERIFYHOST`.
       
    -  Reviewed-by: Daniel Stenberg
    +  The name check now uses a function from lib/vtls/openssl.c which will
    +  need attention for when TLS is not done by OpenSSL or is disabled while
    +  QUIC is enabled.
       
    -  Partially reverts #7841
    -  Closes #7921
    +  Possibly the servercert() function in openssl.c should be adjusted to be
    +  able to use for both regular TLS and QUIC.
    +  
    +  Ref: #8173
    +  Closes #8178
     
    -Daniel Stenberg (29 Oct 2021)
    -- [Jonathan Cardoso Machado brought this change]
    +- zuul: remove the wolfssl build
     
    -  CURLOPT_HSTSWRITEFUNCTION.3: using CURLOPT_HSTS_CTRL is required
    +- github workflow: add wolfssl
       
    -  Closes #7923
    +  Closes #8196
     
    -- [Axel Morawietz brought this change]
    +- [Nicolas Sterchele brought this change]
     
    -  imap: display quota information
    +  zuul: fix quiche build pointing to wrong Cargo
       
    -  Show response to "GETQUOTAROOT INBOX" command.
    +  Fixes #8184
    +  Closes #8189
    +
    +- checksrc: detect more kinds of NULL comparisons we avoid
       
    -  Closes #6973
    +  Co-authored-by: Jay Satiro
    +  Closes #8180
     
     - RELEASE-NOTES: synced
     
    -- [Boris Rasin brought this change]
    -
    -  cmake: fix error getting LOCATION property on non-imported target
    +- mesalink: remove the BACKEND define kludge
       
    -  Closes #7885
    +  Closes #8183
     
    -- [x2018 brought this change]
    +- schannel: remove the BACKEND define kludge
    +  
    +  Closes #8182
     
    -  url: check the return value of curl_url()
    +- gtls: check return code for gnutls_alpn_set_protocols
       
    -  Closes #7917
    +  Closes #8181
     
    -- [Roy Li brought this change]
    +- [Stefan Huber brought this change]
     
    -  configure.ac: replace krb5-config with pkg-config
    +  README: label the link to the support document
       
    -  The rationale is that custom *-config tools don't work well when
    -  cross-compiling or using sysroots (such as when using Yocto project) and
    -  require custom fixing for each of them; pkg-config on the other hand
    -  works similarly everywhere.
    +  Closes #8185
    +
    +- docs/HTTP3: describe how to setup a h3 reverse-proxy for testing
       
    -  Signed-off-by: Roy Li 
    -  Signed-off-by: Alexander Kanavin 
    +  Assisted-by: Matt Holt
       
    -  Closes #7916
    +  Closes #8177
     
    -- test1160: edited to work with hyper
    +- libcurl-multi.3: "SOCKS proxy handshakes" are not blocking
       
    -  Closes #7912
    +  Since 4a4b63daaa0
     
    -- data/DISABLED: enable tests that now work with hyper
    -  
    -  Closes #7911
    +- [Vladimir Panteleev brought this change]
     
    -- test559: add 'HTTP' in keywords
    -  
    -  Makes it run fine with hyper
    -  
    -  Closes #7911
    +  tests: Add test for CURLOPT_HTTP200ALIASES
     
    -- test552: updated to work with hyper
    -  
    -  Closes #7911
    +- [Vladimir Panteleev brought this change]
     
    -Marc Hoersken (27 Oct 2021)
    -- github: fix incomplete permission to label PRs for Hacktoberfest
    +  http: Fix CURLOPT_HTTP200ALIASES
       
    -  Unfortunately the GitHub API requires a token with write permission
    -  for both issues and pull-requests to edit labels on even just PRs.
    +  The httpcode < 100 check was also triggered when none of the fields were
    +  parsed, thus making the if(!nc) block unreachable.
       
    -  Follow up to #7897
    +  Closes #8171
     
    -Daniel Stenberg (27 Oct 2021)
    -- opt-manpages: use 'Added in' instead of 'Since'
    -  
    -  Closes #7913
    +- RELEASE-NOTES: synced
     
    -Marc Hoersken (27 Oct 2021)
    -- github: fix missing permission to label PRs for Hacktoberfest
    -  
    -  Follow up to #7897
    +- language: "email"
       
    -  Test references to see if permissions are now sufficient:
    +  Missed three occurrences.
       
    -  Closes #7832
    -  Closes #7897
    +  Follow-up to 7a92f86
     
    -- CI: more use of test-ci make target and verbose output
    +- nss:set_cipher don't clobber the cipher list
       
    -  Replace test-nonflaky with test-ci and enable verbose output
    -  in all remaining CIs except Zuul which is customized a lot.
    +  The string is set by the user and needs to remain intact for proper
    +  connection reuse etc.
       
    -  Reviewed-by: Daniel Stenberg
    -  Reviewed-by: Jay Satiro
    -  
    -  Follow up to #7785
    -  Closes #7832
    +  Reported-by: Eric Musser
    +  Fixes #8160
    +  Closes #8161
     
    -- github: add support for Hacktoberfest using labels
    +- misc: s/e-mail/email
       
    -  Automatically add hacktoberfest-accepted label to PRs opened between
    -  September 30th and November 1st once a commit with a close reference
    -  to it is pushed onto the master branch.
    +  Consistency is king. Following the lead in everything curl.
       
    -  With this workflow we can participate in Hacktoberfest while not
    -  relying on GitHub to identify PRs as merged due to our rebasing.
    +  Closes #8159
    +
    +- [Tobias Nießen brought this change]
    +
    +  docs: fix typo in OpenSSL 3 build instructions
       
    -  Requires hacktoberfest-accepted labels to exist for PRs on the
    -  participating repository. Also requires hacktoberfest topic on
    -  the participating repository to avoid applying to forked repos.
    +  Closes #8162
    +
    +- linkcheck.yml: add CI job that checks markdown links
       
    -  Reviewed-by: Daniel Stenberg
    +  Closes #8158
    +
    +- RELEASE-PROCEDURE.md: remove ICAL link and old release dates
    +
    +- BINDINGS.md: "markdown-link-check-disable"
       
    -  Fixes #7865
    -  Closes #7897
    +  It feels a bit unfortunate to litter an ugly tag for this functionality,
    +  but if we get link scans of all markdown files, this might be worth the
    +  price.
     
    -Daniel Stenberg (27 Oct 2021)
    -- http: reject HTTP response codes < 100
    +- docs: fix dead links, remove ECH.md
    +
    +Jay Satiro (16 Dec 2021)
    +- openssl: define HAVE_OPENSSL_VERSION for OpenSSL 1.1.0+
       
    -  ... which then also includes negative ones as test 1430 uses.
    +  Prior to this change OpenSSL_version was only detected in configure
    +  builds. For other builds the old version parsing code was used which
    +  would result in incorrect versioning for OpenSSL 3:
       
    -  This makes native + hyper backend act identically on this and therefore
    -  test 1430 can now be enabled when building with hyper. Adjust test 1431
    -  as well.
    +  Before:
       
    -  Closes #7909
    +  curl 7.80.0 (i386-pc-win32) libcurl/7.80.0 OpenSSL/3.0.0a zlib/1.2.11
    +  WinIDN libssh2/1.9.0
    +  
    +  After:
    +  
    +  curl 7.80.0 (i386-pc-win32) libcurl/7.80.0 OpenSSL/3.0.1 zlib/1.2.11
    +  WinIDN libssh2/1.9.0
    +  
    +  Reported-by: lllaffer@users.noreply.github.com
    +  
    +  Fixes https://github.com/curl/curl/issues/8154
    +  Closes https://github.com/curl/curl/pull/8155
     
    -- [Kerem Kat brought this change]
    +Daniel Stenberg (16 Dec 2021)
    +- [James Fuller brought this change]
     
    -  docs: fix typo in CURLOPT_TRAILERFUNCTION example
    +  docs: add known bugs list to HTTP3.md
       
    -  Closes #7910
    +  Closes #8156
     
    -- docs/HYPER: remove some remaining issues, add HTTP/0.9 limitation
    +Dan Fandrich (15 Dec 2021)
    +- BINDINGS: add one from Everything curl and update a link
     
    -- configure: when hyper is selected, deselect nghttp2
    +- libcurl-security.3: mention address and URL mitigations
       
    -  Closes #7908
    +  The new CURLOPT_PREREQFUNCTION callback is another way to sanitize
    +  addresses.
    +  Using the curl_url API is a way to mitigate against attacks relying on
    +  URL parsing differences.
     
    -- [Patrick Monnerat brought this change]
    +Daniel Stenberg (15 Dec 2021)
    +- RELEASE-NOTES: synced
     
    -  sendf: accept zero-length data in Curl_client_write()
    -  
    -  Historically, Curl_client_write() used a length value of 0 as a marker
    -  for a null-terminated data string. This feature has been removed in
    -  commit f4b85d2. To detect leftover uses of the feature, a DEBUGASSERT
    -  statement rejecting a length with value 0 was introduced, effectively
    -  precluding use of this function with zero-length data.
    +- x509asn1: return early on errors
       
    -  The current commit removes the DEBUGASSERT and makes the function to
    -  return immediately if length is 0.
    +  Overhaul to make sure functions that detect errors bail out early with
    +  error rather than trying to continue and risk hiding the problem.
       
    -  A direct effect is to fix trying to output a zero-length distinguished
    -  name in openldap.
    +  Closes #8147
    +
    +- [Patrick Monnerat brought this change]
    +
    +  openldap: several minor improvements
       
    -  Another DEBUGASSERT statement is also rephrased for better readability.
    +  - Early check proper LDAP URL syntax. Reject URLs with a userinfo part.
    +  - Use dynamic memory for ldap_init_fd() URL rather than a
    +    stack-allocated buffer.
    +  - Never chase referrals: supporting it would require additional parallel
    +    connections and alternate authentication credentials.
    +  - Do not wait 1 microsecond while polling/reading query response data.
    +  - Store last received server code for retrieval with CURLINFO_RESPONSE_CODE.
       
    -  Closes #7898
    +  Closes #8140
     
    -- hyper: disable test 1294 since hyper doesn't allow such crazy headers
    +- [Michał Antoniak brought this change]
    +
    +  misc: remove unused doh flags when CURL_DISABLE_DOH is defined
       
    -  Closes #7905
    +  Closes #8148
     
    -- c-hyper: make CURLOPT_SUPPRESS_CONNECT_HEADERS work
    +- mbedtls: fix CURLOPT_SSLCERT_BLOB
       
    -  Verified by the enabled test 1288
    +  The memory passed to mbedTLS for this needs to be null terminated.
       
    -  Closes #7905
    +  Reported-by: Florian Van Heghe
    +  Closes #8146
     
    -- test1287: make work on hyper
    +- asyn-ares: ares_getaddrinfo needs no happy eyeballs timer
       
    -  Closes #7905
    +  Closes #8142
     
    -- test1266/1267: disabled on hyper: no HTTP/0.9 support
    +- mailmap: add Yongkang Huang
       
    -  Closes #7905
    +  From #8141
     
    -Viktor Szakats (25 Oct 2021)
    -- Makefile.m32: fix to not require OpenSSL with -libssh2 or -rtmp options
    -  
    -  Previously, -libssh2/-rtmp options assumed that OpenSSL is also enabled
    -  (and then failed with an error when not finding expected OpenSSL headers),
    -  but this isn't necessarly true, e.g. when building both libssh2 and curl
    -  against Schannel. This patch makes sure to only enable the OpenSSL backend
    -  with -libssh2/-rtmp, when there was no SSL option explicitly selected.
    -  
    -  - Re-implement the logic as a single block of script.
    -  - Also fix an indentation while there.
    +- [Yongkang Huang brought this change]
    +
    +  check ssl_config when re-use proxy connection
    +
    +- mbedtls: do a separate malloc for ca_info_blob
       
    -  Assisted-by: Jay Satiro
    +  Since the mbedTLS API requires the data to the null terminated.
       
    -  Closes #7895
    -
    -Daniel Stenberg (25 Oct 2021)
    -- docs: consistent use of "Added in"
    +  Follow-up to 456c53730d21b1fad0c7f72c1817
       
    -  Make them all say "Added in [version]" without using 'curl' or 'libcurl'
    -  in that phrase.
    +  Fixes #8139
    +  Closes #8145
     
    -- man pages: require all to use the same section header order
    +Marc Hoersken (14 Dec 2021)
    +- CI: build examples for additional code verification
       
    -  This is the same order we already enforce among the options' man pages:
    -  consistency is good. Add lots of previously missing examples.
    +  Some CIs already build them, let's do it on more of them.
       
    -  Adjust the manpage-syntax script for this purpose, used in test 1173.
    +  Reviewed-by: Daniel Stenberg
       
    -  Closes #7904
    -
    -- [David Hu brought this change]
    +  Follow up to #7690 and 77311f420a541a0de5b3014e0e40ff8b4205d4af
    +  Replaces #7591
    +  Closes #7922
     
    -  docs/HTTP3: improve build instructions
    +- docs/examples: workaround broken -Wno-pedantic-ms-format
       
    -  1. If writing to a system path if the command is not prefixed with
    -  `sudo` it will cause a permission denied error
    +  Avoid CURL_FORMAT_CURL_OFF_T by using unsigned long instead.
    +  Improve size_t to long conversion in imap-append.c example.
       
    -  2. The patched OpenSSL branch has been updated to `openssl-3.0.0+quic`
    -  to match upstream OpenSSL version.
    +  Ref: https://github.com/curl/curl/issues/6079
    +  Ref: https://github.com/curl/curl/pull/6082
    +  Assisted-by: Jay Satiro
    +  Reviewed-by: Daniel Stenberg
       
    -  3. We should not disable GnuTLS docs.
    +  Preparation of #7922
    +
    +- tests/data/test302[12]: fix MSYS2 path conversion of hostpubsha256
       
    -  Updated some commands about `make install`
    +  Ref: https://www.msys2.org/wiki/Porting/#filesystem-namespaces
       
    -  Closes #7842
    +  Reviewed-by: Marcel Raad
    +  Reviewed-by: Jay Satiro
    +  
    +  Fixes #8084
    +  Closes #8138
     
    -- [Ricardo Martins brought this change]
    +Daniel Stenberg (13 Dec 2021)
    +- [Patrick Monnerat brought this change]
     
    -  CMake: restore support for SecureTransport on iOS
    +  openldap: simplify ldif generation code
       
    -  Restore support for building curl for iOS with SecureTransport enabled.
    +  and take care of zero-length values, avoiding conversion to base64
    +  and/or trailing spaces.
       
    -  Closes #7501
    +  Closes #8136
     
    -- tests: enable more tests with hyper
    +- example/progressfunc: remove code for old libcurls
       
    -  Adjusted 1144, 1164 and 1176.
    +  7.61.0 is over three years old now, remove all #ifdefs for handling
    +  ancient libcurl versions so that the example gets easier to read and
    +  understand
       
    -  Closes #7900
    +  Closes #8137
     
    -- docs: provide "RETURN VALUE" section for more func manpages
    -  
    -  Three were missing, one used a non-standard name for the header.
    -  
    -  Closes #7902
    +- [Xiaoke Wang brought this change]
     
    -Jay Satiro (25 Oct 2021)
    -- curl_multi_socket_action.3: add a "RETURN VALUE" section
    -  
    -  .. because it may not be immediately clear to the user what
    -  curl_multi_socket_action returns.
    +  sha256/md5: return errors when init fails
       
    -  Ref: https://curl.se/mail/lib-2021-10/0035.html
    +  Closes #8133
    +
    +- TODO: 13.3 Defeat TLS fingerprinting
       
    -  Closes https://github.com/curl/curl/pull/7901
    +  Closes #8119
     
    -Daniel Stenberg (24 Oct 2021)
     - RELEASE-NOTES: synced
     
    -- [Samuel Henrique brought this change]
    +- [Patrick Monnerat brought this change]
     
    -  tests: use python3 in test 1451
    -  
    -  This is a continuation of commit ec91b5a69000bea0794bbb3 in which
    -  changing this test was missed.  There are no other python2 leftovers
    -  now.
    +  openldap: process search query response messages one by one
       
    -  Based on a Debian patch originally written by Alessandro Ghedini
    -  
    +  Upon receiving large result sets, this reduces memory consumption and
    +  allows starting to output results while the transfer is still in
    +  progress.
       
    -  Closes #7899
    -
    -- [Eddie Lumpkin brought this change]
    +  Closes #8101
     
    -  lib: fixing comment spelling typos in lib files
    +- hash: lazy-alloc the table in Curl_hash_add()
       
    -  Closes #7894
    -  Signed-off-by: ewlumpkin 
    -
    -- openssl: if verifypeer is not requested, skip the CA loading
    -  
    -  It was previously done mostly to show a match/non-match in the verbose
    -  output even when verification was not asked for. This change skips the
    -  loading of the CA certs unless verifypeer is set to save memory and CPU.
    +  This makes Curl_hash_init() infallible which saves error paths.
       
    -  Closes #7892
    +  Closes #8132
     
    -- curl-confopts.m4:  remove --enable/disable-hidden-symbols
    +- multi: cleanup the socket hash when destroying it
       
    -  These configure options have been saying "deprecated" since 9e24b9c7af
    -  (April 2012). It was about time we remove them.
    +  Since each socket hash entry may themselves have a hash table in them,
    +  the destroying of the socket hash needs to make sure all the subhashes
    +  are also correctly destroyed to avoid leaking memory.
       
    -  Closes #7891
    +  Fixes #8129
    +  Closes #8131
     
    -- c-hyper: don't abort CONNECT responses early when auth-in-progress
    +- test1156: fixup the stdout check for Windows
       
    -  ... and make sure to stop ignoring the body once the CONNECT is done.
    +  It is not text mode.
       
    -  This should make test 206 work proper again and not be flaky.
    +  Follow-up to 6f73e68d182
       
    -  Closes #7889
    +  Closes #8134
     
    -- hyper: does not support disabling CURLOPT_HTTP_TRANSFER_DECODING
    -  
    -  Simply because hyper doesn't have this ability. Mentioned in docs now.
    -  
    -  Skip test 326 then
    +- test1528: enable for hyper
       
    -  Closes #7889
    +  Closes #8128
     
    -- test262: don't attempt with hyper
    -  
    -  This test verifies that curl works with binary zeroes in HTTP response
    -  headers and hyper refuses such. They're not kosher http.
    +- test1527: enable for hyper
       
    -  Closes #7889
    +  Closes #8128
     
    -- c-hyper: make test 217 run
    +- test1526: enable for hyper
       
    -  Closes #7889
    +  Closes #8128
     
    -- DISABLED: enable test 209+213 for hyper
    -  
    -  Follow-up to 823d3ab855c
    +- test1525: slightly tweaked for hyper
       
    -  Closes #7889
    +  Closes #8128
     
    -- test207: accept a different error code for hyper
    +- test1156: enable for hyper
       
    -  It returns HYPERE_UNEXPECTED_EOF for this case which we convert to the
    -  somewhat generic CURLE_RECV_ERROR.
    +  Minor reorg of the lib1156 code and it works fine for hyper.
       
    -  Closes #7889
    -
    -- [Érico Nogueira brought this change]
    +  Closes #8127
     
    -  INSTALL: update symbol hiding option
    -  
    -  --enable-hidden-symbols was deprecated in
    -  9e24b9c7afbcb81120af4cf3f6cdee49a06d8224.
    +- test661: enable for hyper
       
    -  Closes #7890
    +  Closes #8126
     
    -- http_proxy: multiple CONNECT with hyper done better
    +- docs: fix proselint nits
       
    -  Enabled test 206
    +  - remove a lot of exclamation marks
    +  - use consistent spaces (1, not 2)
    +  - use better words at some places
       
    -  Closes #7888
    +  Closes #8123
     
    -- hyper: pass the CONNECT line to the debug callback
    -  
    -  Closes #7887
    +- [RekGRpth brought this change]
     
    -- mailmap: Malik Idrees Hasan Khan
    +  BINDINGS.md: add cURL client for PostgreSQL
    +  
    +  Closes #8125
     
    -Jay Satiro (21 Oct 2021)
    -- [Malik Idrees Hasan Khan brought this change]
    +- [RekGRpth brought this change]
     
    -  build: fix typos
    +  CURLSHOPT_USERDATA.3: fix copy-paste mistake
       
    -  Closes https://github.com/curl/curl/pull/7886
    +  Closes #8124
     
    -- URL-SYNTAX: add IMAP UID SEARCH example
    -  
    -  - Explain the difference between IMAP search via URL (which returns
    -    message sequence numbers) and IMAP search via custom request (which
    -    can return UID numbers if prefixed with UID, eg "UID SEARCH ...").
    -  
    -  Bug: https://github.com/curl/curl/issues/7626
    -  Reported-by: orycho@users.noreply.github.com
    +- docs: fix minor nroff format nits
       
    -  Ref: https://github.com/curl/curl/issues/2789
    +  Repairs test 1140
       
    -  Closes https://github.com/curl/curl/pull/7881
    +  Follow-up to 436cdf82041
     
    -Daniel Stenberg (20 Oct 2021)
    -- manpage: adjust the asterisk in some SYNOPSIS sections
    -  
    -  Closes #7884
    +- docs/URL-SYNTAX.md: space is not fine in a given URL
     
    -- curl_multi_perform.3: polish wording
    -  
    -   - simplify the example by using curl_multi_poll
    +- curl_multi_perform/socket_action.3: clarify what errors mean
       
    -   - mention curl_multi_add_handle in the text
    +  An error returned from one of these funtions mean that ALL still ongoing
    +  transfers are to be considered failed.
       
    -   - cut out the description of pre-7.20.0 return code behavior - that version
    -     is now more than eleven years old and is basically no longer out there
    +  Ref: #8114
    +  Closes #8120
    +
    +- libcurl-errors.3: add CURLM_ABORTED_BY_CALLBACK
       
    -   - adjust the "typical usage" to mention curl_multi_poll
    +  Follow-up to #8089 (2b3dd01)
       
    -  Closes #7883
    -
    -- docs/THANKS: removed on request
    -
    -- FAQ: polish the explanation of libcurl
    -
    -- curl_easy_perform.3: minor wording tweak
    -
    -- [Erik Stenlund brought this change]
    +  Closes #8116
     
    -  mime: mention CURL_DISABLE_MIME in comment
    +- hash: add asserts to help detect bad usage
       
    -  CURL_DISABLE_MIME is not mentioned in the comment describing the if else
    -  preprocessor directive.
    +  For example trying to add entries after the hash has been "cleaned up"
       
    -  Closes #7882
    +  Closes #8115
     
    -- tls: remove newline from three infof() calls
    +- lib530: abort on curl_multi errors
       
    -  Follow-up to e7416cf
    +  This makes torture tests run more proper.
       
    -  Reported-by: billionai on github
    -  Fixes #7879
    -  Closes #7880
    +  Also add an assert to trap situations where it would end up with no
    +  sockets to wait for.
    +  
    +  Closes #8121
    +
    +- FAQ: we never pronounced it "see URL", we say "kurl"
     
     - RELEASE-NOTES: synced
     
    -- curl_gssapi: fix build warnings by removing const
    +- CURLOPT_RESOLVE.3: minor polish
       
    -  Follow-up to 20e980f85b0ea6
    +  Minor rephrasing for some explanations.
       
    -  In #7875 these inits were modified but I get two warnings that these new
    -  typecasts are necessary for.
    +  Put the format strings in stand-alone lines with .nf/.fi to be easier to spot.
       
    -  Closes #7876
    -
    -- [Bo Anderson brought this change]
    -
    -  curl_gssapi: fix link error on macOS Monterey
    +  Move "added in" to AVAILABILITY
       
    -  Fixes #7657
    -  Closes #7875
    +  Closed #8110
     
    -- test1185: verify checksrc
    +- test1556: adjust for hyper
       
    -  Closes #7866
    +  Closes #8105
     
    -- checksrc: improve the SPACESEMICOLON error message
    -  
    -  and adjust the MULTISPACE one to use plural
    +- test1554: adjust for hyper
       
    -  Closes #7866
    +  Closes #8104
     
    -- url: set "k->size" -1 at start of request
    -  
    -  The size of the transfer is unknown at that point.
    +- retry-all-errors.d: make the example complete
       
    -  Fixes #7871
    -  Closes #7872
    +  ... as it needs --retry too to work
     
    -Daniel Gustafsson (18 Oct 2021)
    -- doh: remove experimental code for DoH with GET
    -  
    -  The code for sending DoH requests with GET was never enabled in a way
    -  such that it could be used or tested. As there haven't been requests
    -  for this feature, and since it at this is effectively dead, remove it
    -  and favor reimplementing the feature in case anyone is interested.
    +- TODO: 5.7 Require HTTP version X or higher
       
    -  Closes #7870
    -  Reviewed-by: Daniel Stenberg 
    +  Closes #7980
     
    -Daniel Stenberg (18 Oct 2021)
    -- cirrus: remove FreeBSD 11.4 from the matrix
    +- CURLOPT_STDERR.3: does not work with libcurl as a win32 DLL
       
    -  It has reached End-Of-Life and causes some LDAP CI issues.
    +  This is the exact same limitation already documented for
    +  CURLOPT_WRITEDATA but should be clarified here. It also has a different
    +  work-around.
       
    -  Closes #7869
    +  Reported-by: Stephane Pellegrino
    +  Bug: https://github.com/curl/curl/issues/8102
    +  Closes #8103
     
    -- cirrus: switch to openldap24-client
    +- multi: handle errors returned from socket/timer callbacks
       
    -  ... as it seems openldap-client doesn't exist anymore.
    +  The callbacks were partially documented to support this. Now the
    +  behavior is documented and returning error from either of these
    +  callbacks will effectively kill all currently ongoing transfers.
       
    -  Reported-by: Jay Satiro
    -  Fixes #7868
    -  Closes #7869
    -
    -- checksrc: ignore preprocessor lines
    +  Added test 530 to verify
       
    -  In order to check the actual code better, checksrc now ignores
    -  everything that look like preprocessor instructions. It also means
    -  that code in macros are now longer checked.
    +  Reported-by: Marcelo Juchem
    +  Fixes #8083
    +  Closes #8089
    +
    +- http2:set_transfer_url() return early on OOM
       
    -  Note that some rules then still don't need to be followed when code is
    -  exactly below a cpp instruction.
    +  If curl_url() returns NULL this should return early to avoid mistakes -
    +  even if right now the subsequent function invokes are all OK.
       
    -  Removes two checksrc exceptions we needed previously because of
    -  preprocessor lines being checked.
    +  Coverity (wrongly) pointed out this as a NULL deref.
       
    -  Reported-by: Marcel Raad
    -  Fixes #7863
    -  Closes #7864
    +  Closes #8100
     
    -- urlapi: skip a strlen(), pass in zero
    +- tool_parsecfg: use correct free() call to free memory
       
    -  ... to let curl_easy_escape() itself do the strlen. This avoids a (false
    -  positive) Coverity warning and it avoids us having to store the strlen()
    -  return value in an int variable.
    +  Detected by Coverity. CID 1494642.
    +  Follow-up from 2be1aa619bca
       
    -  Reviewed-by: Daniel Gustafsson
    -  Closes #7862
    -
    -- misc: update copyright years
    +  Closes #8099
     
    -- examples/htmltidy: correct wrong printf() use
    +- tool_operate: fix potential memory-leak
       
    -  ... and update the includes to match how current htmltidy wants them
    -  used.
    +  A 'CURLU *' would leak if url_proto() is called with no URL.
       
    -  Reported-by: Stathis Kapnidis
    -  Fixes #7860
    -  Closes #7861
    -
    -Jay Satiro (15 Oct 2021)
    -- http: set content length earlier
    -  
    -  - Make content length (ie download size) accessible to the user in the
    -    header callback, but only after all headers have been processed (ie
    -    only in the final call to the header callback).
    -  
    -  Background:
    -  
    -  For a long time the content length could be retrieved in the header
    -  callback via CURLINFO_CONTENT_LENGTH_DOWNLOAD_T as soon as it was parsed
    -  by curl.
    -  
    -  Changes were made in 8a16e54 (precedes 7.79.0) to ignore content length
    -  if any transfer encoding is used. A side effect of that was that
    -  content length was not set by libcurl until after the header callback
    -  was called the final time, because until all headers are processed it
    -  cannot be determined if content length is valid.
    -  
    -  This change keeps the same intention --all headers must be processed--
    -  but now the content length is available before the final call to the
    -  header function that indicates all headers have been processed (ie
    -  a blank header).
    -  
    -  Bug: https://github.com/curl/curl/commit/8a16e54#r57374914
    -  Reported-by: sergio-nsk@users.noreply.github.com
    -  
    -  Co-authored-by: Daniel Stenberg
    -  
    -  Fixes https://github.com/curl/curl/issues/7804
    -  Closes https://github.com/curl/curl/pull/7803
    +  Detected by Coverity. CID 1494643.
    +  Follow-up to 18270893abdb19
    +  Closes #8098
     
    -Daniel Stenberg (15 Oct 2021)
    -- [Abhinav Singh brought this change]
    +- [Patrick Monnerat brought this change]
     
    -  aws-sigv4: make signature work when post data is binary
    -  
    -  User sets the post fields size for binary data.  Hence, we should not be
    -  using strlen on it.
    +  openldap: implement STARTTLS
       
    -  Added test 1937 and 1938 to verify.
    +  As this introduces use of CURLOPT_USE_SSL option for LDAP, also check
    +  this option in ldap.c as it is not supported by this backend.
       
    -  Closes #7844
    +  Closes #8065
     
    -- [a1346054 brought this change]
    +- [Jun Tseng brought this change]
     
    -  MacOSX-Framework: remove redundant ';'
    +  curl_easy_unescape.3: call curl_easy_cleanup in example
       
    -  Closes #7859
    +  Closes #8097
     
    -- RELEASE-NOTES: synced
    +- [Jun Tseng brought this change]
     
    -- openssl: with OpenSSL 1.1.0+ a failed RAND_status means goaway
    +  curl_easy_escape.3: call curl_easy_cleanup in example
       
    -  One reason we know it can fail is if a provider is used that doesn't do
    -  a proper job or is wrongly configured.
    +  Closes #8097
    +
    +- tool_listhelp: sync
       
    -  Reported-by: Michael Baentsch
    -  Fixes #7840
    -  Closes #7856
    +  Follow-up to 172068b76f
     
    -Marcel Raad (14 Oct 2021)
    -- [Ryan Mast brought this change]
    +- [Damien Walsh brought this change]
     
    -  cmake: add CURL_ENABLE_SSL option and make CMAKE_USE_* SSL backend options depend on it
    +  request.d: refer to 'method' rather than 'command'
       
    -  Closes https://github.com/curl/curl/pull/7822
    +  Closes #8094
     
    -Daniel Stenberg (14 Oct 2021)
    -- http: remove assert that breaks hyper
    -  
    -  Reported-by: Jay Satiro
    -  Fixes #7852
    -  Closes #7855
    +- RELEASE-NOTES: synced
     
    -- http_proxy: fix one more result assign for hyper
    +- writeout: fix %{http_version} for HTTP/3
       
    -  and remove the bad assert again, since it was run even with no error!
    +  Output "3" properly when HTTP/3 was used.
       
    -  Closes #7854
    +  Reported-by: Bernat Mut
    +  Fixes #8072
    +  Closes #8092
     
    -Jay Satiro (14 Oct 2021)
    -- sws: fix memory leak on exit
    +- urlapi: accept port number zero
       
    -  - Free the allocated http request struct on cleanup.
    +  This is a regression since 7.62.0 (fb30ac5a2d).
       
    -  Prior to this change if sws was built with leak sanitizer it would
    -  report a memory leak error during testing.
    +  Updated test 1560 accordingly
       
    -  Closes https://github.com/curl/curl/pull/7849
    +  Reported-by: Brad Fitzpatrick
    +  Fixes #8090
    +  Closes #8091
     
    -Daniel Stenberg (14 Oct 2021)
    -- c-hyper: make Curl_http propagate errors better
    -  
    -  Pass on better return codes when errors occur within Curl_http instead
    -  of insisting that CURLE_OUT_OF_MEMORY is the only possible one.
    +- [Mark Dodgson brought this change]
    +
    +  lift: ignore is a deprecated config option, use ignoreRules
       
    -  Pointed-out-by: Jay Satiro
    -  Closes #7851
    +  Closes #8082
     
    -- http_proxy: make hyper CONNECT() return the correct error code
    +- [Alessandro Ghedini brought this change]
    +
    +  HTTP3: update quiche build instructions
       
    -  For every 'goto error', make sure the result variable holds the error
    -  code for what went wrong.
    +  The repo repo was re-organized a bit, so the build instructions need to
    +  be updated.
       
    -  Reported-by: Rafał Mikrut
    -  Fixes #7825
    -  Closes #7846
    +  Closes #8076
     
    -- docs/Makefile.am: repair 'make html'
    -  
    -  by removing index.html which isn't around anymore
    +- CURLMOPT_TIMERFUNCTION.3: call it expire time, not interval
       
    -  Closes #7853
    +  Since we say it is a non-repating timer
     
    -- [Борис Верховский brought this change]
    +- [Florian Van Heghe brought this change]
     
    -  curl: correct grammar in generated libcurl code
    +  mbedTLS: include NULL byte in blob data length for CURLOPT_CAINFO_BLOB
       
    -  Closes #7802
    +  Fixes #8079
    +  Closes #8081
     
    -- tests: disable test 2043
    +Jay Satiro (2 Dec 2021)
    +- [Wyatt O'Day brought this change]
    +
    +  version_win32: Check build number and platform id
       
    -  It uses revoked.badssl.com which now is expired and therefor this now
    -  permafails. We should not use external sites for tests, this test should
    -  be converted to use our own infra.
    +  Prior to this change the build number was not checked during version
    +  comparison, and the platform id was supposed to be checked but wasn't.
       
    -  Closes #7845
    -
    -- runtests: split out ignored tests
    +  Checking the build number is required for enabling "evergreen"
    +  Windows 10/11 features (like TLS 1.3).
       
    -  Report ignore tests separately from the actual fails.
    +  Ref: https://github.com/curl/curl/pull/7784
       
    -  Don't exit non-zero if test servers couldn't get killed.
    +  Closes https://github.com/curl/curl/pull/7824
    +  Closes https://github.com/curl/curl/pull/7867
    +
    +- libssh2: fix error message for sha256 mismatch
       
    -  Assisted-by: Jay Satiro
    +  - On mismatch error show sha256 fingerprint in base64 format.
       
    -  Fixes #7818
    -  Closes #7841
    +  Prior to this change the fingerprint was mistakenly printed in binary.
     
    -- http2: make getsock not wait for write if there's no remote window
    +Daniel Stenberg (1 Dec 2021)
    +- [Xiaoke Wang brought this change]
    +
    +  openssl: check the return value of BIO_new()
       
    -  While uploading, check for remote window availability in the getsock
    -  function so that we don't wait for a writable socket if no data can be
    -  sent.
    +  Closes #8078
    +
    +Dan Fandrich (30 Nov 2021)
    +- docs: Update the Reducing Size section
       
    -  Reported-by: Steini2000 on github
    -  Fixes #7821
    -  Closes #7839
    +  Add many more options that can reduce the size of the binary that were
    +  added since the last update. Update the sample minimal binary size for
    +  version 7.80.0.
     
    -- test368: verify dash is appended for "-r [num]"
    +- tests: Add some missing keywords to tests
       
    -  Follow-up to 8758a26f8878
    +  These are needed to skip some tests when configure options have disabled
    +  certain features.
     
    -- [Борис Верховский brought this change]
    +Daniel Stenberg (30 Nov 2021)
    +- [Florian Van Heghe brought this change]
     
    -  curl: actually append "-" to --range without number only
    +  mbedTLS: add support for CURLOPT_CAINFO_BLOB
       
    -  Closes #7837
    +  Closes #8071
     
    -- RELEASE-NOTES: synced
    +- [Glenn Strauss brought this change]
     
    -- urlapi: URL decode percent-encoded host names
    +  digest: compute user:realm:pass digest w/o userhash
       
    -  The host name is stored decoded and can be encoded when used to extract
    -  the full URL. By default when extracting the URL, the host name will not
    -  be URL encoded to work as similar as possible as before. When not URL
    -  encoding the host name, the '%' character will however still be encoded.
    +  https://datatracker.ietf.org/doc/html/rfc7616#section-3.4.4
    +    ... the client MUST calculate a hash of the username after
    +        any other hash calculation ...
       
    -  Getting the URL with the CURLU_URLENCODE flag set will percent encode
    -  the host name part.
    +  Signed-off-by: Glenn Strauss 
    +  Closes #8066
    +
    +- config.d: update documentation to match the path search
       
    -  As a bonus, setting the host name part with curl_url_set() no longer
    -  accepts a name that contains space, CR or LF.
    +  Assisted-by: Jay Satiro
    +
    +- tool_findfile: search for a file in the homedir
       
    -  Test 1560 has been extended to verify percent encodings.
    +  The homedir() function is now renamed into findfile() and iterates over
    +  all the environment variables trying to access the file in question
    +  until it finds it. Last resort is then getpwuid() if
    +  available. Previously it would first try to find a home directory and if
    +  that was set, insist on checking only that directory for the file. This
    +  now returns the full file name it finds.
       
    -  Reported-by: Noam Moshe
    -  Reported-by: Sharon Brizinov
    -  Reported-by: Raul Onitza-Klugman
    -  Reported-by: Kirill Efimov
    -  Fixes #7830
    -  Closes #7834
    -
    -Marc Hoersken (8 Oct 2021)
    -- CI/makefiles: introduce dedicated test target
    +  The Windows specific checks are now done differently too and in this
    +  order:
       
    -  Make it easy to use the same set of test flags
    -  throughout all current and future CI builds.
    +  1 - %USERPROFILE%
    +  2 - %APPDATA%
    +  3 - %USERPROFILE%\\Application Data
       
    -  Reviewed-by: Jay Satiro
    +  The windows order is modified to match how the Windows 10 ssh tool works
    +  when it searches for .ssh/known_hosts.
       
    -  Follow up to #7690
    -  Closes #7785
    -
    -Daniel Stenberg (8 Oct 2021)
    -- maketgz: redirect updatemanpages.pl output to /dev/null
    +  Reported-by: jeffrson on github
    +  Co-authored-by: Jay Satiro
    +  Fixes #8033
    +  Closes #8035
     
    -- CURLOPT_HTTPHEADER.3: add descripion for specific headers
    +- docs: consistent manpage SYNOPSIS
       
    -  Settting Host: or Transfer-Encoding: chunked actually have special
    -  meanings to libcurl. This change tries to document them
    -  
    -  Closes #7829
    -
    -- c-hyper: use hyper_request_set_uri_parts to make h2 better
    +  Make all libcurl related options use .nf (no fill) for the SYNOPSIS
    +  section - for consistent look. roffit then renders that section using
    +  
     (monospace font) in html for the website.
       
    -  and make sure to not send Host: over h2.
    +  Extended manpage-syntax (test 1173) with a basic check for it.
       
    -  Fixes #7679
    -  Reported-by: David Cook
    -  Closes #7827
    +  Closes #8062
     
    -- [Michael Afanasiev brought this change]
    +- RELEASE-NOTES: synced
     
    -  curl-openssl.m4: modify library order for openssl linking
    -  
    -  lcrypto may depend on lz, and configure corrently fails with when
    -  statically linking as the order is "-lz -lcrypto". This commit switches
    -  the order to "-lcrypto -lz".
    -  
    -  Closes #7826
    +- [Patrick Monnerat brought this change]
     
    -Marcel Raad (7 Oct 2021)
    -- sha256: use high-level EVP interface for OpenSSL
    -  
    -  Available since OpenSSL 0.9.7. The low-level SHA256 interface is
    -  deprecated in OpenSSL v3, and its usage was discouraged even before.
    +  openldap: handle connect phase with a state machine
       
    -  Closes https://github.com/curl/curl/pull/7808
    +  Closes #8054
     
    -- curl_ntlm_core: use OpenSSL only if DES is available
    +- docs: address proselint nits
       
    -  This selects another SSL backend then if available, or otherwise at
    -  least gives a meaningful error message.
    +  - avoid exclamation marks
    +  - use consistent number of spaces after periods: one
    +  - avoid clichés
    +  - avoid using 'very'
       
    -  Closes https://github.com/curl/curl/pull/7808
    +  Closes #8060
     
    -- md5: fix compilation with OpenSSL 3.0 API
    +- [Bruno Baguette brought this change]
    +
    +  FAQ: typo fix : "yout" ➤ "your"
       
    -  Only use OpenSSL's MD5 code if it's available.
    +  Closes #8059
    +
    +- [Bruno Baguette brought this change]
    +
    +  docs/INSTALL.md: typo fix : added missing "get" verb
       
    -  Also fix wolfSSL build with `NO_MD5`, in which case neither the
    -  wolfSSL/OpenSSL implementation nor the fallback implementation was
    -  used.
    +  Closes #8058
    +
    +- insecure.d: detail its use for SFTP and SCP as well
       
    -  Closes https://github.com/curl/curl/pull/7808
    +  Closes #8056
     
    -Daniel Stenberg (7 Oct 2021)
    -- print_category: printf %*s needs an int argument
    +Viktor Szakats (25 Nov 2021)
    +- Makefile.m32: rename -winssl option to -schannel and tidy up
       
    -  ... not a size_t!
    +  - accept `-schannel` as an alternative to `CFG` option `-winssl`
    +    (latter still accepted, but deprecated)
    +  - rename internal variable `WINSSL` to `SCHANNEL`
    +  - make the `CFG` option evaluation shorter, without repeating the option
    +    name
       
    -  Detected by Coverity: CID 1492331.
    -  Closes #7823
    +  Reviewed-by: Marcel Raad
    +  Reviewed-by: Daniel Stenberg
    +  Closes #8053
     
    -Jay Satiro (7 Oct 2021)
    -- version_win32: use actual version instead of manifested version
    +Daniel Stenberg (25 Nov 2021)
    +- KNOWN_BUGS: 5.6 make distclean loops forever
       
    -  - Use RtlVerifyVersionInfo instead of VerifyVersionInfo, when possible.
    +  Reported-by: David Bohman
    +  Closes #7716
    +
    +- KNOWN_BUGS: add one, remove one
       
    -  Later versions of Windows have normal version functions that compare and
    -  return versions based on the way the application is manifested, instead
    -  of the actual version of Windows the application is running on. We
    -  prefer the actual version of Windows so we'll now call the Rtl variant
    -  of version functions (RtlVerifyVersionInfo) which does a proper
    -  comparison of the actual version.
    +  - 5.10 SMB tests fail with Python 2
       
    -  Reported-by: Wyatt O'Day
    +  Just use python 3.
       
    -  Ref: https://github.com/curl/curl/pull/7727
    +  + 5.10 curl hangs on SMB upload over stdin
       
    -  Fixes https://github.com/curl/curl/issues/7742
    -  Closes https://github.com/curl/curl/pull/7810
    -
    -Daniel Stenberg (6 Oct 2021)
    -- RELEASE-NOTES: synced
    +  Closes #7896
     
    -- http: fix Basic auth with empty name field in URL
    +- urlapi: provide more detailed return codes
       
    -  Add test 367 to verify.
    +  Previously, the return code CURLUE_MALFORMED_INPUT was used for almost
    +  30 different URL format violations. This made it hard for users to
    +  understand why a particular URL was not acceptable. Since the API cannot
    +  point out a specific position within the URL for the problem, this now
    +  instead introduces a number of additional and more fine-grained error
    +  codes to allow the API to return more exactly in what "part" or section
    +  of the URL a problem was detected.
       
    -  Reported-by: Rick Lane
    -  Fixes #7819
    -  Closes #7820
    -
    -- [Jeffrey Tolar brought this change]
    -
    -  CURLOPT_MAXLIFETIME_CONN: maximum allowed lifetime for conn reuse
    +  Also bug-fixes curl_url_get() with CURLUPART_ZONEID, which previously
    +  returned CURLUE_OK even if no zoneid existed.
       
    -  ... and close connections that are too old instead of reusing them.
    +  Test cases in 1560 have been adjusted and extended. Tests 1538 and 1559
    +  have been updated.
       
    -  By default, this behavior is disabled.
    +  Updated libcurl-errors.3 and curl_url_strerror() accordingly.
       
    -  Bug: https://curl.se/mail/lib-2021-09/0058.html
    -  Closes #7751
    +  Closes #8049
     
    -Daniel Gustafsson (6 Oct 2021)
    -- docs/examples: add missing binaries to gitignore
    +- urlapi: make Curl_is_absolute_url always use MAX_SCHEME_LEN
       
    -  Commit f65d7889b added getreferrer, and commit ae8e11ed5 multi-legacy,
    -  both of which missed adding .gitignore clauses for the built binaries.
    +  Instad of having all callers pass in the maximum length, always use
    +  it. The passed in length is instead used only as the length of the
    +  target buffer for to storing the scheme name in, if used.
       
    -  Closes #7817
    -  Reviewed-by: Daniel Stenberg 
    -
    -Daniel Stenberg (5 Oct 2021)
    -- [Josip Medved brought this change]
    -
    -  HTTP3: fix the HTTP/3 Explained book link
    +  Added the scheme max length restriction to the curl_url_set.3 man page.
       
    -  Closes #7813
    +  Follow-up to 45bcb2eaa78c79
    +  
    +  Closes #8047
     
    -- [Lucas Holt brought this change]
    +- [Jay Satiro brought this change]
     
    -  misc: fix a few issues on MidnightBSD
    +  cmake: warn on use of the now deprecated symbols
       
    -  Closes #7812
    +  Follow-up to 9108da2c26d
    +  
    +  Closes #8052
     
    -Daniel Gustafsson (4 Oct 2021)
    -- [8U61ife brought this change]
    +- [Kevin Burke brought this change]
     
    -  tool_main: fix typo in comment
    +  tests/CI.md: add more information on CI environments
       
    -  Closes: #7811
    -  Reviewed-by: Daniel Gustafsson 
    -
    -Daniel Stenberg (4 Oct 2021)
    -- [Ryan Mast brought this change]
    +  Fixes #8012
    +  Closes #8022
     
    -  BINDINGS: URL updates
    +- cmake: private identifiers use CURL_ instead of CMAKE_ prefix
       
    -  For cpr, BBHTTP, Eiffel, Harbour, Haskell, Mono, and Rust
    +  Since the 'CMAKE_' prefix is reserved for cmake's own private use.
    +  Ref: https://cmake.org/cmake/help/latest/manual/cmake-variables.7.html
       
    -  Closes #7809
    +  Reported-by: Boris Rasin
    +  Fixes #7988
    +  Closes #8044
     
    -- scripts/delta: hide a git error message we don't care about
    +- urlapi: reject short file URLs
       
    -  fatal: path 'src/tool_listhelp.c' exists on disk, but not in [tag]
    -
    -- [Patrick Monnerat brought this change]
    -
    -  sasl: binary messages
    +  file URLs that are 6 bytes or shorter are not complete. Return
    +  CURLUE_MALFORMED_INPUT for those. Extended test 1560 to verify.
       
    -  Capabilities of sasl module are extended to exchange messages in binary
    -  as an alternative to base64.
    +  Triggered by #8041
    +  Closes #8042
    +
    +- curl: improve error message for --head with -J
       
    -  If http authentication flags have been set, those are used as sasl
    -  default preferred mechanisms.
    +  ... it now focuses on the "output of headers" combined with the
    +  --remote-header-name option, as that is actually the problem. Both
    +  --head and --include can output headers.
       
    -  Closes #6930
    +  Reported-by: nimaje on github
    +  Fixes #7987
    +  Closes #8045
     
    -- [Hayden Roche brought this change]
    +- RELEASE-NOTES: synced
     
    -  wolfssl: use for SHA256, MD4, MD5, and setting DES odd parity
    +- [Stefan Eissing brought this change]
    +
    +  urlapi: cleanup scheme parsing
       
    -  Prior to this commit, OpenSSL could be used for all these functions, but
    -  not wolfSSL. This commit makes it so wolfSSL will be used if USE_WOLFSSL
    -  is defined.
    +  Makea Curl_is_absolute_url() always leave a defined 'buf' and avoids
    +  copying on urls that do not start with a scheme.
       
    -  Closes #7806
    +  Closes #8043
     
    -- scripts/delta: count command line options in the new file
    +- tool_operate: only set SSH related libcurl options for SSH URLs
       
    -  ... which makes the shown delta number wrong until next release.
    +  For example, this avoids trying to find and set the known_hosts file (or
    +  warn for its absence) if SFTP or SCP are not used.
    +  
    +  Closes #8040
     
    -- RELEASE-NOTES: synced
    +- [Jacob Hoffman-Andrews brought this change]
     
    -- print_category: print help descriptions aligned
    +  rustls: remove comment about checking handshaking
       
    -  Adjust the description position to make an aligned column when doing
    -  help listings, which is more pleasing to the eye.
    +  The comment is incorrect in two ways:
    +   - It says the check needs to be last, but the check is actually first.
    +   - is_handshaking actually starts out true.
       
    -  Suggested-by: Gisle Vanem
    -  Closes #7792
    +  Closes #8038
     
    -- lib/mk-ca-bundle.pl: skip certs passed Not Valid After date
    -  
    -  With this change applied, the now expired 'DST Root CA X3' cert will no
    -  longer be included in the output.
    +Marcel Raad (20 Nov 2021)
    +- openssl: use non-deprecated API to read key parameters
       
    -  Details: https://letsencrypt.org/docs/dst-root-ca-x3-expiration-september-2021/
    +  With OpenSSL 3.0, the parameters are read directly from the `EVP_PKEY`
    +  using `EVP_PKEY_get_bn_param`.
       
    -  Closes #7801
    +  Closes https://github.com/curl/curl/pull/7893
     
    -- tool_listhelp: easier to generate with gen.pl
    +- openssl: reduce code duplication
       
    -  tool_listhelp.c is now a separate file with only the command line --help
    -  output, exactly as generated by gen.pl. This makes it easier to generate
    -  updates according to what's in the docs/cmdline-opts docs.
    +  `BN_print`'s `BIGNUM` parameter has been `const` since OpenSSL 0.9.4.
       
    -    cd $srcroot/docs/cmdline-opts
    -    ./gen.pl listhelp *.d > $srcroot/src/tool_listhelp.c
    +  Closes https://github.com/curl/curl/pull/7893
    +
    +- openssl: remove `RSA_METHOD_FLAG_NO_CHECK` handling if unavailable
       
    -  With a configure build, this also works:
    -  
    -    make -C src listhelp
    +  The flag has been deprecated without replacement in OpenSSL 3.0.
       
    -  Closes #7787
    -
    -- [Anthony Hu brought this change]
    +  Closes https://github.com/curl/curl/pull/7893
     
    -  wolfssl: allow setting of groups/curves
    +- openssl: remove usage of deprecated `SSL_get_peer_certificate`
       
    -  In particular, the quantum safe KEM and hybrid curves if wolfSSL is
    -  built to support them.
    +  The function name was changed to `SSL_get1_peer_certificate` in OpenSSL
    +  3.0.
       
    -  Closes #7728
    -
    -- [Jan Mazur brought this change]
    +  Closes https://github.com/curl/curl/pull/7893
     
    -  connnect: use sysaddr_un fron sys/un.h or custom-defined for windows
    +Daniel Stenberg (19 Nov 2021)
    +- page-footer: fix typo
       
    -  Closes #7737
    -
    -Jay Satiro (30 Sep 2021)
    -- [Rikard Falkeborn brought this change]
    +  Closes #8036
     
    -  hostip: Move allocation to clarify there is no memleak
    -  
    -  By just glancing at the code, it looks like there is a memleak if the
    -  call to Curl_inet_pton() fails. Looking closer, it is clear that the
    -  call to Curl_inet_pton() can not fail, so the code will never leak
    -  memory. However, we can make this obvious by moving the allocation
    -  after the if-statement.
    +- http: enable haproxy support for hyper backend
       
    -  Closes https://github.com/curl/curl/pull/7796
    -
    -Daniel Stenberg (30 Sep 2021)
    -- gen.pl: make the output date format work better
    +  This is done by having native code do the haproxy header output before
    +  hyper issues its request. The little downside with this approach is that
    +  we need the entire Curl_buffer_send() function built, which is otherwise
    +  not used for hyper builds.
       
    -  Follow-up to 15910dfd143dd
    +  If hyper ends up getting native support for the haproxy protocols we can
    +  backpedal on this.
       
    -  The previous strftime format used didn't work correctly on Windows, so
    -  change to %B %d %Y which today looks like "September 29 2021".
    +  Enables test 1455 and 1456
       
    -  Reported-by: Gisle Vanem
    -  Bug: #7782
    -  Closes #7793
    +  Closes #8034
     
    -- typecheck-gcc.h: add CURLOPT_PREREQDATA awareness
    +- [Bernhard Walle brought this change]
    +
    +  configure: fix runtime-lib detection on macOS
       
    -  Follow-up to a517378de58358a
    +  With a non-standard installation of openssl we get this error:
       
    -  To make test 1912 happy again
    +      checking run-time libs availability... failed
    +      configure: error: one or more libs available at link-time are not available run-time. Libs used at link-time: -lnghttp2 -lssl -lcrypto -lssl -lcrypto -lz
       
    -  Closes #7799
    -
    -Marcel Raad (29 Sep 2021)
    -- configure: remove `HAVE_WINSOCK_H` definition
    +  There's already code to set LD_LIBRARY_PATH on Linux, so set
    +  DYLD_LIBRARY_PATH equivalent on macOS.
       
    -  It's not used anymore.
    +  Closes #8028
    +
    +- [Don J Olmstead brought this change]
    +
    +  cmake: don't set _USRDLL on a static Windows build
       
    -  Closes https://github.com/curl/curl/pull/7795
    +  Closes #8030
     
    -- CMake: remove `HAVE_WINSOCK_H` definition
    +- page-footer: document more environment variables
       
    -  It's not used anymore.
    +  ... that curl might use.
       
    -  Closes https://github.com/curl/curl/pull/7795
    +  Closes #8027
     
    -- config: remove `HAVE_WINSOCK_H` definition
    +- netrc.d: edit the .netrc example to look nicer
       
    -  It's not used anymore.
    +  Works nicely thanks to d1828b470f43d
       
    -  Closes https://github.com/curl/curl/pull/7795
    +  Closes #8025
     
    -- lib: remove `HAVE_WINSOCK_H` usage
    +- tftp: mark protocol as not possible to do over CONNECT
       
    -  WinSock v1 is not supported anymore. Exclusively use `HAVE_WINSOCK2_H`
    -  instead.
    +  ... and make connect_init() refusing trying to tunnel protocols marked
    +  as not working. Avoids a double-free.
       
    -  Closes https://github.com/curl/curl/pull/7795
    +  Reported-by: Even Rouault
    +  Fixes #8018
    +  Closes #8020
     
    -Daniel Stenberg (29 Sep 2021)
    -- easyoptions: add the two new PRE* options
    -  
    -  Follow-up to a517378de58358a
    +- docs/cmdline-opts: do not say "protocols: all"
       
    -  Also fix optiontable.pl to do the correct remainder on the entry.
    +  Remove the lines saying "protocols: all". It makes the output in the
    +  manpage look funny, and the expectation is probably by default that if
    +  not anything is mentioned about protocols the option apply to them all.
       
    -  Reported-by: Gisle Vanem
    -  Bug: https://github.com/curl/curl/commit/a517378de58358a85b7cfe9efecb56051268f629#commitcomment-57224830
    -  Closes #7791
    +  Closes #8021
     
    -- Revert "build: remove checks for WinSock 1"
    +- curl.1: require "see also" for every documented option
       
    -  Due to CI issues
    +  gen.pl now generates a warning if the "See Also" field is not filled in for a
    +  command line option
       
    -  This reverts commit c2ea04f92b00b6271627cb218647527b5a50f2fc.
    +  All command line options now provide one or more related options. 167
    +  "See alsos" added!
       
    -  Closes #7790
    +  Closes #8019
     
    -Daniel Gustafsson (29 Sep 2021)
    -- lib: avoid fallthrough cases in switch statements
    -  
    -  Commit b5a434f7f0ee4d64857f8592eced5b9007d83620 inhibits the warning
    -  on implicit fallthrough cases, since the current coding of indicating
    -  fallthrough with comments is falling out of fashion with new compilers.
    -  This attempts to make the issue smaller by rewriting fallthroughs to no
    -  longer fallthrough, via either breaking the cases or turning switch
    -  statements into if statements.
    -  
    -    lib/content_encoding.c: the fallthrough codepath is simply copied
    -      into the case as it's a single line.
    -    lib/http_ntlm.c: the fallthrough case skips a state in the state-
    -      machine and fast-forwards to NTLMSTATE_LAST. Do this before the
    -      switch statement instead to set up the states that we actually
    -      want.
    -    lib/http_proxy.c: the fallthrough is just falling into exiting the
    -      switch statement which can be done easily enough in the case.
    -    lib/mime.c: switch statement rewritten as if statement.
    -    lib/pop3.c: the fallthrough case skips to the next state in the
    -      statemachine, do this explicitly instead.
    -    lib/urlapi.c: switch statement rewritten as if statement.
    -    lib/vssh/wolfssh.c: the fallthrough cases fast-forwards the state
    -      machine, do this by running another iteration of the switch
    -      statement instead.
    -    lib/vtls/gtls.c: switch statement rewritten as if statement.
    -    lib/vtls/nss.c: the fallthrough codepath is simply copied into the
    -      case as it's a single line. Also twiddle a comment to not be
    -      inside a non-brace if statement.
    +- insecure.d: expand and clarify
       
    -  Closes: #7322
    -  See-also: #7295
    -  Reviewed-by: Daniel Stenberg 
    +  Closes #8017
     
    -Marcel Raad (28 Sep 2021)
    -- config-win32ce: enable WinSock 2
    +- gen.pl: improve example output format
       
    -  WinSock 2.2 is supported by Windows CE .NET 4.1 (from 2002, out of
    -  support since 2013).
    +  Treat consecutive lines that start with a space to be "examples". They
    +  are output enclosed by .nf and .fi
       
    -  Ref: https://docs.microsoft.com/en-us/previous-versions/windows/embedded/ms899586(v=msdn.10)
    +  Updated form.d to use this new fanciness
       
    -  Closes https://github.com/curl/curl/pull/7778
    +  Closes #8016
     
    -- externalsocket: use WinSock 2.2
    +- Revert "form-escape.d: double the back-slashes for proper man page output"
       
    -  That's the only version we support.
    +  This reverts commit a2d8eac04a4eb1d5a98cf24b4e5cec5cec565d27.
       
    -  Closes https://github.com/curl/curl/pull/7778
    +  silly me, it was intended to be one backslash!
     
    -- build: remove checks for WinSock 1
    -  
    -  It's not supported anymore.
    -  
    -  Closes https://github.com/curl/curl/pull/7778
    +- form-escape.d: double the back-slashes for proper man page output
     
    -Daniel Stenberg (28 Sep 2021)
    -- scripts/copyright: .muse is .lift now
    -  
    -  And update 5 files with old copyright year range
    +- page-footer: add a mention of how to report bugs to the man page
     
    -- cmdline-opts: made the 'Added:' field mandatory
    -  
    -  Since "too old" versions are no longer included in the generated man
    -  page, this field is now mandatory so that it won't be forgotten and then
    -  not included in the documentation.
    +- RELEASE-NOTES: synced
       
    -  Closes #7786
    +  and bump to 7.81.0-DEV
     
    -- curl.1: remove mentions of really old version changes
    +- [Patrick Monnerat brought this change]
    +
    +  mime: use percent-escaping for multipart form field and file names
       
    -  To make the man page more readable, this change removes all references
    -  to changes in support/versions etc that happened before 7.30.0 from the
    -  curl.1 output file. 7.30.0 was released on Apr 12 2013. This particular
    -  limit is a bit arbitrary but was fairly easy to grep for.
    +  Until now, form field and file names where escaped using the
    +  backslash-escaping algorithm defined for multipart mails. This commit
    +  replaces this with the percent-escaping method for URLs.
       
    -  It is handled like this: the 'Added' keyword is only used in output if
    -  it refers to 7.30.0 or later. All occurances of "(Added in $VERSION)" in
    -  description will be stripped out if the mentioned $VERSION is from
    -  before 7.30.0. It is therefore important that the "Added in..."
    -  references are always written exactly like that - and on a single line,
    -  not split over two.
    +  As this may introduce incompatibilities with server-side applications, a
    +  new libcurl option CURLOPT_MIME_OPTIONS with bitmask
    +  CURLMIMEOPT_FORMESCAPE is introduced to revert to legacy use of
    +  backslash-escaping. This is controlled by new cli tool option
    +  --form-escape.
       
    -  This change removes about 80 version number references from curl.1, down
    -  to 138 from 218.
    +  New tests and documentation are provided for this feature.
       
    -  Closes #7786
    +  Reported by: Ryan Sleevi
    +  Fixes #7789
    +  Closes #7805
     
    -- RELEASE-NOTES: synced
    +- [Kevin Burke brought this change]
     
    -- tool_cb_prg: make resumed upload progress bar show better
    +  zuul.d: update rustls-ffi to version 0.8.2
       
    -  This is a regression that was *probably* injected in the larger progress
    -  bar overhaul in 2018.
    +  This version fixes errors with ALPN negotiation in rustls, which is
    +  necessary for HTTP/2 support. For more information see the rustls-ffi
    +  changelog.
       
    -  Reported-by: beslick5 on github
    -  Fixes #7760
    -  Closes #7777
    +  Closes #8013
     
    -- gen.pl: insert the current date and version in generated man page
    +- configure: better diagnostics if hyper is built wrong
       
    -  Reported-by: Gisle Vanem
    -  Ref: #7780
    -  Closes #7782
    +  If hyper is indeed present in the specified directory but couldn't be
    +  used to find the correct symbol, then offer a different error message to
    +  better help the user understand the issue.
    +  
    +  Suggested-by: Jacob Hoffman-Andrews
    +  Fixes #8001
    +  Closes #8005
     
    -- NTLM: use DES_set_key_unchecked with OpenSSL
    +- test1939: require proxy support to run
       
    -  ... as the previously used function DES_set_key() will in some cases
    -  reject using a key that it deems "weak" which will cause curl to
    -  continue using the unitialized buffer content as key instead.
    +  Follow-up to f0b7099a10d1a
       
    -  Assisted-by: Harry Sintonen
    -  Fixes #7779
    -  Closes #7781
    +  Closes #8011
     
    -Marc Hoersken (27 Sep 2021)
    -- CI: align make and test flags in various config files
    +- test302[12]: run only with the libssh2 backend
       
    -  1. Use Makefile target to run tests in autotools builds on AppVeyor.
    -  2. Disable testing of SCP protocol on native Windows environments.
    -  3. Remove redundant parameters -a -p from target test-nonflaky.
    -  4. Don't use -vc parameter which is reserved for debugging.
    +  ... as the others don't support --hostpubsha256
       
    -  Replaces #7591
    -  Closes #7690
    +  Reported-by: Paul Howarth
    +  Fixes #8009
    +  Closes #8010
     
    -Daniel Stenberg (27 Sep 2021)
    -- mailmap: unify Max!
    +- runtests: make the SSH library a testable feature
    +  
    +  libssh2, libssh and wolfssh
     
    -- [Max Dymond brought this change]
    +- [Jacob Hoffman-Andrews brought this change]
     
    -  CURLOPT_PREREQFUNCTION: add new callback
    -  
    -  Triggered before a request is made but after a connection is set up
    +  rustls: read of zero bytes might be okay
       
    -  Changes:
    +  When we're reading out plaintext from rustls' internal buffers, we might
    +  get a read of zero bytes (meaning a clean TCP close, including
    +  close_notify). However, we shouldn't return immediately when that
    +  happens, since we may have already copied out some plaintext bytes.
    +  Break out of the loop when we get a read of zero bytes, and figure out
    +  which path we're dealing with.
       
    -  - callback: Update docs and callback for pre-request callback
    -  - Add documentation for CURLOPT_PREREQDATA and CURLOPT_PREREQFUNCTION,
    -  - Add redirect test and callback failure test
    -  - Note that the function may be called multiple times on a redirection
    -  - Disable new 2086 test due to Windows weirdness
    +  Acked-by: Kevin Burke
       
    -  Closes #7477
    +  Closes #8003
     
    -- KNOWN_BUGS: HTTP/2 connections through HTTPS proxy frequently stall
    -  
    -  Closes #6936
    +- [Jacob Hoffman-Andrews brought this change]
     
    -- TODO: make configure use --cache-file more and better
    +  rustls: remove incorrect EOF check
       
    -  Closes #7753
    -
    -- [Sergey Markelov brought this change]
    -
    -  urlapi: support UNC paths in file: URLs on Windows
    +  The update to rustls-ffi 0.8.0 changed handling of EOF and close_notify.
    +  From the CHANGELOG:
       
    -  - file://host.name/path/file.txt is a valid UNC path
    -    \\host.name\path\files.txt to a non-local file transformed into URI
    -    (RFC 8089 Appendix E.3)
    +  > Handling of unclean close and the close_notify TLS alert. Mirroring
    +  > upstream changes, a rustls_connection now tracks TCP closed state like
    +  > so: rustls_connection_read_tls considers a 0-length read from its
    +  > callback to mean "TCP stream was closed by peer."  If that happens
    +  > before the peer sent close_notify, rustls_connection_read will return
    +  > RUSTLS_RESULT_UNEXPECTED_EOF once the available plaintext bytes are
    +  > exhausted. This is useful to protect against truncation attacks. Note:
    +  > some TLS implementations don't send close_notify. If you are already
    +  > getting length information from your protocol (e.g. Content-Length in
    +  > HTTP) you may choose to ignore UNEXPECTED_EOF so long as the number of
    +  > plaintext bytes was as expected.
       
    -  - UNC paths on other OSs must be smb: URLs
    +  That means we don't need to check for unclean EOF in `cr_recv()`,
    +  because `process_new_packets()` will give us an error if appropriate.
       
    -  Closes #7366
    -
    -- [Gleb Ivanovsky brought this change]
    +  Closes #8003
     
    -  urlapi: add curl_url_strerror()
    +- lib1939: make it endure torture tests
       
    -  Add curl_url_strerror() to convert CURLUcode into readable string and
    -  facilitate easier troubleshooting in programs using URL API.
    -  Extend CURLUcode with CURLU_LAST for iteration in unit tests.
    -  Update man pages with a mention of new function.
    -  Update example code and tests with new functionality where it fits.
    +  Follow-up to f0b7099a10d1a
       
    -  Closes #7605
    -
    -- RELEASE-NOTES: synced
    -
    -- [Mats Lindestam brought this change]
    +  Closes #8007
     
    -  libssh2: add SHA256 fingerprint support
    +- azure: make the "w/o HTTP/SMTP/IMAP" build disable SSL proper
       
    -  Added support for SHA256 fingerprint in command line curl and in
    -  libcurl.
    +  The configure line would previously depend on a configure mistake using
    +  --without-openssl that is fixed and now this configure line needs
    +  adjusting to use --without-ssl.
       
    -  Closes #7646
    +  Follow-up to b589696f0312d
    +  
    +  Closes #8006
     
    -- libcurl.rc: switch out the copyright symbol for plain ASCII
    +- [Jacob Hoffman-Andrews brought this change]
    +
    +  configure: add -lm to configure for rustls build.
       
    -  Reported-by: Vitaly Varyvdin
    -  Assisted-by: Viktor Szakats
    -  Fixes #7765
    -  Closes #7776
    +  Note: The list of libraries that rustc tells us we need to include is
    +  longer, but also includes some more platform-specific libraries that I
    +  am not sure how to effectively incorporate. Adding just -lm seems to
    +  solve an immediate problem, so I'm adding just that.
    +  
    +  Closes #8002
     
    -- [Jun-ya Kato brought this change]
    +- curl_share_setopt.3: refer to CURLSHOPT_USERDATA(3) properly
     
    -  ngtcp2: fix QUIC transport parameter version
    +- curl_share_setopt.3: split out options into their own manpages
       
    -  fix inappropriate version setting for QUIC transport parameters.
    -  this patch keeps curl with ngtcp2 uses QUIC draft version (h3-29).
    +  CURLSHOPT_LOCKFUNC.3
    +  CURLSHOPT_SHARE.3
    +  CURLSHOPT_UNLOCKFUNC.3
    +  CURLSHOPT_UNSHARE.3
    +  CURLSHOPT_USERDATA.3
       
    -  Closes #7771
    +  Closes #7998
     
    -- examples/imap-append: fix end-of-data check
    +- http_proxy: make Curl_connect_done() work for proxy disabled builds
       
    -  Reported-by: Alexander Chuykov
    -  Fixes #7774
    -  Closes #7775
    +  ... by making it an empty macro then.
    +  
    +  Follow-up to f0b7099a10d1a
    +  Reported-by: Vincent Grande
    +  Fixes #7995
    +  Closes #7996
     
    -Michael Kaufmann (24 Sep 2021)
    -- vtls: Fix a memory leak if an SSL session cannot be added to the cache
    +- Curl_connect_done: handle being called twice
       
    -  On connection shutdown, a new TLS session ticket may arrive after the
    -  SSL session cache has already been destructed. In this case, the new
    -  SSL session cannot be added to the SSL session cache.
    +  Follow-up to f0b7099a10d1a7c
       
    -  The callers of Curl_ssl_addsessionid() need to know whether the SSL
    -  session has been added to the cache. If it has not been added, the
    -  reference counter of the SSL session must not be incremented, or memory
    -  used by the SSL session must be freed. This is now possible with the new
    -  output parameter "added" of Curl_ssl_addsessionid().
    +  When torture testing 1021, it turns out the Curl_connect_done function
    +  might be called twice and that previously then wrongly cleared the HTTP
    +  pointer in the second invoke.
       
    -  Fixes #7683
    -  Closes #7752
    +  Closes #7999
     
    -Daniel Stenberg (24 Sep 2021)
    -- [Momoka Yamamoto brought this change]
    +- [Stan Hu brought this change]
     
    -  HTTP3.md: use 'autoreconf -fi' instead of buildconf
    +  configure: don't enable TLS when --without-* flags are used
       
    -  buildconf is not used since #5853
    +  Previously specifying `--without-gnutls` would unexpectedly attempt to
    +  compile with GnuTLS, effectively interpreting this as
    +  `--with-gnutls`. This caused a significant amount of confusion when
    +  `libcurl` was built with SSL disabled since GnuTLS wasn't present.
       
    -  Closes #7746
    -
    -- GIT-INFO: rephrase to adapt to s/buildconf/autoreconf
    +  68d89f24 dropped the `--without-*` options from the configure help, but
    +  `AC_ARG_WITH` still defines these flags automatically. As
    +  https://www.gnu.org/software/autoconf/manual/autoconf-2.60/html_node/External-Software.html
    +  describes, the `action-if-given` is called when the user specifies
    +  `--with-*` or `--without-*` options.
    +  
    +  To prevent this confusion, we make the `--without` flag do the right
    +  thing by ignoring the value if it set to "no".
    +  
    +  Closes #7994
     
    -- [h1zzz brought this change]
    +- [Rikard Falkeborn brought this change]
     
    -  llist: remove redundant code, branch will not be executed
    +  docs/checksrc: Add documentation for STRERROR
       
    -  Closes #7770
    -
    -- [tlahn brought this change]
    +  Closes #7991
     
    -  HTTP-COOKIES.md: remove duplicate 'each'
    +- vtls/rustls: adapt to the updated rustls_version proto
       
    -  Closes #7772
    +  Closes #7956
     
    -Jay Satiro (24 Sep 2021)
    -- [Joel Depooter brought this change]
    +- [Kevin Burke brought this change]
     
    -  libssh2: Get the version at runtime if possible
    +  vtls/rustls: handle RUSTLS_RESULT_PLAINTEXT_EMPTY
       
    -  Previously this code used a compile time constant, meaning that libcurl
    -  always reported the libssh2 version that libcurl was built with. This
    -  could differ from the libssh2 version actually being used. The new code
    -  uses the CURL_LIBSSH2_VERSION macro, which is defined in ssh.h. The
    -  macro calls the libssh2_version function if it is available, otherwise
    -  it falls back to the compile time version.
    +  Previously we'd return CURLE_READ_ERROR if we received this, instead
    +  of triggering the error handling logic that's present in the next if
    +  block down.
       
    -  Closes https://github.com/curl/curl/pull/7768
    +  After this change, curl requests to https://go.googlesource.com using
    +  HTTP/2 complete successfully.
    +  
    +  Fixes #7949
    +  Closes #7948
     
    -- [Joel Depooter brought this change]
    +- [Kevin Burke brought this change]
     
    -  schannel: fix typo
    -  
    -  Closes https://github.com/curl/curl/pull/7769
    +  zuul: update build environment for rustls-ffi 0.8.0
     
    -Daniel Stenberg (23 Sep 2021)
    -- cmake: with OpenSSL, define OPENSSL_SUPPRESS_DEPRECATED
    -  
    -  To avoid the "... is deprecated" warnings brought by OpenSSL v3.
    -  (We need to address the underlying code at some point of course.)
    -  
    -  Assisted-by: Jakub Zakrzewski
    -  Closes #7767
    +- [Kevin Burke brought this change]
     
    -- curl-openssl: pass argument to sed single-quoted
    +  vtls/rustls: update to compile with rustls-ffi v0.8.0
       
    -  ... instead of using an escaped double-quote. This is an attempt to make
    -  this work better with ksh that otherwise would insist on a double
    -  escape!
    +  Some method names, as well as the generated library name, were changed
    +  in a recent refactoring.
       
    -  Reported-by: Randall S. Becker
    -  Fixes #7758
    -  Closes #7764
    +  Further, change the default configuration instructions to check for
    +  Hyper in either "target/debug" or "target/release" - the latter
    +  contains an optimized build configuration.
    +  
    +  Fixes #7947
    +  Closes #7948
     
     - RELEASE-NOTES: synced
       
    -  Bumped curlver to 7.80.0-dev
    -
    -- [a1346054 brought this change]
    +  and bump the version to 7.80.1
     
    -  misc: fix typos in docs and comments
    +- multi: shut down CONNECT in Curl_detach_connnection
       
    -  No user facing output from curl/libcurl is changed by this, just
    -  comments.
    +  ... to prevent a lingering pointer that would lead to a double-free.
       
    -  Closes #7747
    -
    -- [Thomas M. DuBuisson brought this change]
    +  Added test 1939 to verify.
    +  
    +  Reported-by: Stephen M. Coakley
    +  Fixes #7982
    +  Closes #7986
     
    -  ci: update Lift config to match requirements of curl build
    +- curl_easy_cleanup.3: remove from multi handle first
       
    -  Also renamed Muse -> Lift, the new tool name.
    +  Easy handles that are used by the multi interface should be removed from
    +  the multi handle before they are cleaned up.
       
    -  Closes #7761
    -
    -- [Rikard Falkeborn brought this change]
    +  Reported-by: Stephen M. Coakley
    +  Ref: #7982
    +  Closes #7983
     
    -  cleanup: constify unmodified static structs
    -  
    -  Constify a number of static structs that are never modified. Make them
    -  const to show this.
    +- url.c: fix the SIGPIPE comment for Curl_close
       
    -  Closes #7759
    +  Closes #7984
     
    -Version 7.79.1 (22 Sep 2021)
    +Version 7.80.0 (10 Nov 2021)
     
    -Daniel Stenberg (22 Sep 2021)
    +Daniel Stenberg (10 Nov 2021)
     - RELEASE-NOTES: synced
       
    -  curl 7.79.1 release
    +  for curl 7.80.0
     
    -- THANKS: added names from the 7.79.1 release
    +- THANKS: add contributors from the 7.80.0 cycle
     
    -- test897: verify delivery of IMAP post-body header content
    -  
    -  The "content" is delivered as "body" by curl, but the envelope continues
    -  after the body and the rest of it should be delivered as header.
    -  
    -  The IMAP server can now get 'POSTFETCH' set to include more data to
    -  include after the body and test 897 is done to verify that such "extra"
    -  header data is in fact delivered by curl as header.
    -  
    -  Ref: #7284 but fails to reproduce the issue
    -  
    -  Closes #7748
    +- [Tatsuhiro Tsujikawa brought this change]
     
    -- KNOWN_BUGS: connection migration doesn't work
    +  ngtcp2: advertise h3 as well as h3-29
       
    -  Closes #7695
    +  Advertise h3 as well as h3-29 since some servers out there require h3
    +  for QUIC v1.
    +  
    +  Closes #7979
     
    -- RELEASE-NOTES: synced
    +- [Tatsuhiro Tsujikawa brought this change]
     
    -- http: fix the broken >3 digit response code detection
    +  ngtcp2: use QUIC v1 consistently
       
    -  When the "reason phrase" in the HTTP status line starts with a digit,
    -  that was treated as the forth response code digit and curl would claim
    -  the response to be non-compliant.
    +  Since we switched to v1 quic_transport_parameters codepoint in #7960
    +  with quictls, lets use QUIC v1 consistently.
       
    -  Added test 1466 to verify this case.
    +  Closes #7979
    +
    +- [Tatsuhiro Tsujikawa brought this change]
    +
    +  ngtcp2: compile with the latest nghttp3
       
    -  Regression brought by 5dc594e44f73b17
    -  Reported-by: Glenn de boer
    -  Fixes #7738
    -  Closes #7739
    +  Closes #7978
     
    -Jay Satiro (17 Sep 2021)
    -- strerror: use sys_errlist instead of strerror on Windows
    +Marc Hoersken (9 Nov 2021)
    +- tests: add Schannel-specific tests and disable unsupported ones
       
    -  - Change Curl_strerror to use sys_errlist[errnum] instead of strerror to
    -    retrieve the error message on Windows.
    +  Adds Schannel variants of SSLpinning tests that include the option
    +  --ssl-revoke-best-effort to ignore certificate revocation check
    +  failures which is required due to our custom test CA certificate.
       
    -  Windows' strerror writes to a static buffer and is not thread-safe.
    +  Disable the original variants if the Schannel backend is enabled.
       
    -  Follow-up to 2f0bb86 which removed most instances of strerror in favor
    -  of calling Curl_strerror (which calls strerror_r for other platforms).
    +  Also skip all IDN tests which are broken while using an msys shell.
       
    -  Ref: https://github.com/curl/curl/pull/7685
    -  Ref: https://github.com/curl/curl/commit/2f0bb86
    +  This is a step to simplify test exclusions for Windows and MinGW.
       
    -  Closes https://github.com/curl/curl/pull/7735
    +  Reviewed-by: Jay Satiro
    +  Reviewed-by: Marcel Raad
    +  Reviewed-by: Daniel Stenberg
    +  Closes #7968
     
    -Daniel Stenberg (16 Sep 2021)
    -- dist: provide lib/.checksrc in the tarball
    -  
    -  So that debug builds work (checksrc really)
    +Daniel Stenberg (8 Nov 2021)
    +- docs: NAME fixes in easy option man pages
       
    -  Reported-by: Marcel Raad
    -  Reported-by: tawmoto on github
    -  Fixes #7733
    -  Closes #7734
    +  Closes #7975
     
    -- TODO: Improve documentation about fork safety
    -  
    -  Closes #6968
    +- [Roger Young brought this change]
     
    -- hsts: CURLSTS_FAIL from hsts read callback should fail transfer
    +  ftp: make the MKD retry to retry once per directory
       
    -  ... and have CURLE_ABORTED_BY_CALLBACK returned.
    +  Reported-by: Roger Young
    +  Fixes #7967
    +  Closes #7976
    +
    +- tool_operate: reorder code to avoid compiler warning
       
    -  Extended test 1915 to verify.
    +  tool_operate.c(889) : warning C4701: potentially uninitialized local
    +  variable 'per' use
       
    -  Reported-by: Jonathan Cardoso
    -  Fixes #7726
    -  Closes #7729
    +  Follow-up to cc71d352651a0d95
    +  Reported-by: Marc Hörsken
    +  Bug: https://github.com/curl/curl/pull/7922#issuecomment-963042676
    +  Closes #7971
     
    -- test1184: disable
    -  
    -  The test should be fine and it works for me repeated when run manually,
    -  but clearly it causes CI failures and it needs more research.
    +- curl_easy_perform.3: add a para about recv and send data
       
    -  Reported-by: RiderALT on github
    -  Fixes #7725
    -  Closes #7732
    +  Reported-by: Godwin Stewart
    +  Fixes #7973
    +  Closes #7974
     
    -- Curl_http2_setup: don't change connection data on repeat invokes
    +- tool_operate: fclose stream only if fopened
       
    -  Regression from 3cb8a748670ab88c (releasde in 7.79.0). That change moved
    -  transfer oriented inits to before the check but also erroneously moved a
    -  few connection oriented ones, which causes problems.
    +  Fixes torture test failures
    +  Follow-up to cc71d352651
       
    -  Reported-by: Evangelos Foutras
    -  Fixes #7730
    -  Closes #7731
    +  Closes #7972
     
    -- RELEASE-NOTES: synced
    -  
    -  and bump to 7.79.1
    +- libcurl-easy.3: language polish
     
    -Kamil Dudka (16 Sep 2021)
    -- tests/sshserver.pl: make it work with openssh-8.7p1
    -  
    -  ... by not using options with no argument where an argument is required:
    +- limit-rate.d: this is average over several seconds
       
    -  === Start of file tests/log/ssh_server.log
    -  curl_sshd_config line 6: no argument after keyword "DenyGroups"
    -  curl_sshd_config line 7: no argument after keyword "AllowGroups"
    -  curl_sshd_config line 10: Deprecated option AuthorizedKeysFile2
    -  curl_sshd_config line 29: Deprecated option KeyRegenerationInterval
    -  curl_sshd_config line 39: Deprecated option RhostsRSAAuthentication
    -  curl_sshd_config line 40: Deprecated option RSAAuthentication
    -  curl_sshd_config line 41: Deprecated option ServerKeyBits
    -  curl_sshd_config line 45: Deprecated option UseLogin
    -  curl_sshd_config line 56: no argument after keyword "AcceptEnv"
    -  curl_sshd_config: terminating, 3 bad configuration options
    -  === End of file tests/log/ssh_server.log
    +  Closes #7970
    +
    +- docs: reduce/avoid English contractions
       
    -  === Start of file log/sftp_server.log
    -  curl_sftp_config line 33: Unsupported option "rhostsrsaauthentication"
    -  curl_sftp_config line 34: Unsupported option "rsaauthentication"
    -  curl_sftp_config line 52: no argument after keyword "sendenv"
    -  curl_sftp_config: terminating, 1 bad configuration options
    -  Connection closed.
    -  Connection closed
    -  === End of file log/sftp_server.log
    +  You're => You are
    +  Hasn't => Has not
    +  Doesn't => Does not
    +  Don't => Do not
    +  You'll => You will
    +  etc
       
    -  Closes #7724
    +  Closes #7930
     
    -Daniel Stenberg (15 Sep 2021)
    -- hsts: handle unlimited expiry
    -  
    -  When setting a blank expire string, meaning unlimited, curl would pass
    -  TIME_T_MAX to getime_r() when creating the output, while on 64 bit
    -  systems such a large value cannot be convetered to a tm struct making
    -  curl to exit the loop with an error instead. It can't be converted
    -  because the year it would represent doesn't fit in the 'int tm_year'
    -  field!
    +- tool_operate: fix torture leaks with etags
       
    -  Starting now, unlimited expiry is instead handled differently by using a
    -  human readable expiry date spelled out as "unlimited" instead of trying
    -  to use a distant actual date.
    +  Spotted by torture testing 343 344 345 347.
       
    -  Test 1660 and 1915 have been updated to help verify this change.
    +  Follow-up from cc71d352651a0
    +  Pointed-out-by: Dan Fandrich
       
    -  Reported-by: Jonathan Cardoso
    -  Fixes #7720
    -  Closes #7721
    +  Closes #7969
     
    -- curl_multi_fdset: make FD_SET() not operate on sockets out of range
    +- [Amaury Denoyelle brought this change]
    +
    +  ngtcp2: support latest QUIC TLS RFC9001
       
    -  The VALID_SOCK() macro was made to only check for FD_SETSIZE if curl was
    -  built to use select(), even though the curl_multi_fdset() function
    -  always and unconditionally uses FD_SET and needs the check.
    +  QUIC Transport Parameters Extension has been changed between draft-29
    +  and latest RFC9001. Most notably, its identifier has been updated from
    +  0xffa5 to 0x0039. The version is selected through the QUIC TLS library
    +  via the legacy codepoint.
       
    -  Reported-by: 0xee on github
    -  Fixes #7718
    -  Closes #7719
    -
    -- FAQ: add GOPHERS + curl works on data, not files
    -
    -Version 7.79.0 (14 Sep 2021)
    -
    -Daniel Stenberg (14 Sep 2021)
    -- RELEASE-NOTES: synced
    +  Disable the usage of legacy codepoint in curl to switch to latest
    +  RFC9001. This is required to be able to keep up with latest QUIC
    +  implementations.
       
    -  For the 7.79.0 release
    +  Acked-by: Tatsuhiro Tsujikawa
    +  Closes #7960
     
    -- THANKS: add contributors from 7.79.0 release cycle
    +- test1173: make manpage-syntax.pl spot \n errors in examples
     
    -- FAQ: add two dev related questions
    -  
    -    8.1 Why does curl use C89?
    -    8.2 Will curl be rewritten?
    +- man pages: fix backslash-n in examples
       
    -  Spell-checked-by: Paul Johnson
    -  Closes #7715
    -
    -- zuul.d/jobs: disable three tests for *-openssl-disable-proxy
    +  ... to be proper backslash-backslash-n sequences to render nicely in man
    +  and on website.
       
    -  ... as they mysteriously seem to permfail without being related to
    -  proxy.
    +  Follow-up to 24155569d8a
    +  Reported-by: Sergey Markelov
       
    -  Closes #7714
    +  Fixes https://github.com/curl/curl-www/issues/163
    +  Closes #7962
     
    -- [Patrick Monnerat brought this change]
    +- scripts/release-notes.pl: use out of repo links verbatim in refs
     
    -  ftp,imap,pop3,smtp: reject STARTTLS server response pipelining
    +- tool_operate: a failed etag save now only fails that transfer
       
    -  If a server pipelines future responses within the STARTTLS response, the
    -  former are preserved in the pingpong cache across TLS negotiation and
    -  used as responses to the encrypted commands.
    +  When failing to create the output file for saving an etag, only fail
    +  that particular single transfer and allow others to follow.
       
    -  This fix detects pipelined STARTTLS responses and rejects them with an
    -  error.
    +  In a serial transfer setup, if no transfer at all is done due to them
    +  all being skipped because of this error, curl will output an error
    +  message and return exit code 26.
       
    -  CVE-2021-22947
    +  Added test 369 and 370 to verify.
       
    -  Bug: https://curl.se/docs/CVE-2021-22947.html
    +  Reported-by: Earnestly on github
    +  Ref: #7942
    +  Closes #7945
     
    -- [Patrick Monnerat brought this change]
    +- [Kevin Burke brought this change]
     
    -  ftp,imap,pop3: do not ignore --ssl-reqd
    +  .github: retry macos "brew install" command on failure
       
    -  In imap and pop3, check if TLS is required even when capabilities
    -  request has failed.
    +  Previously we saw errors attempting to run "brew install", see
    +  https://github.com/curl/curl/runs/4095721123?check_suite_focus=true for
    +  an example, since this command is idempotent, it is safe to run again.
       
    -  In ftp, ignore preauthentication (230 status of server greeting) if TLS
    -  is required.
    +  Closes #7955
    +
    +- CURLOPT_ALTSVC_CTRL.3: mention conn reuse is preferred
       
    -  Bug: https://curl.se/docs/CVE-2021-22946.html
    +  Ref: https://github.com/curl/curl/discussions/7954
       
    -  CVE-2021-22946
    +  Closes #7957
     
    -- [z2_ on hackerone brought this change]
    +- RELEASE-NOTES: synced
     
    -  mqtt: clear the leftovers pointer when sending succeeds
    +- zuul: pin the quiche build to use an older cmake-rs
       
    -  CVE-2021-22945
    +  The latest cmake-rs assumes cmake's --parallel works. That was added in
    +  cmake 3.12, but a lot of our CI builds run on Ubuntu Bionic which only
    +  has cmake 3.10.
       
    -  Bug: https://curl.se/docs/CVE-2021-22945.html
    +  Fixes #7927
    +  Closes #7952
     
    -- zuul: bump the rustls job to use v0.7.2
    +- [Marc Hoersken brought this change]
    +
    +  Revert "src/tool_filetime: disable -Wformat on mingw for this file"
       
    -  ... and add -lm when using a rust library.
    +  This reverts commit 7c88fe375b15c44d77bccc9ab733b8069d228e6f.
       
    -  Closes #7701
    -
    -- RELEASE-PROCEDURE: add release dates from now to 8.0.0 in 2023
    -
    -- SECURITY-PROCESS: tweak a little to match current practices
    +  Follow up to #6535 as the pragma is obsolete with warnf
       
    -  Closes #7713
    +  Closes #7941
     
    -- http_proxy: fix the User-Agent inclusion in CONNECT
    +Jay Satiro (2 Nov 2021)
    +- schannel: fix memory leak due to failed SSL connection
       
    -  It should not refer to the uagent string that is allocated and created
    -  for the end server http request, as that pointer may be cleared on
    -  subsequent CONNECT requests.
    +  - Call schannel_shutdown if the SSL connection fails.
       
    -  Added test case 1184 to verify.
    +  Prior to this change schannel_shutdown (which shuts down the SSL
    +  connection as well as memory cleanup) was not called when the SSL
    +  connection failed (eg due to failed handshake).
       
    -  Reported-by: T200proX7 on github
    -  Fixes #7705
    -  Closes #7707
    -
    -- Curl_hsts_loadcb: don't attempt to load if hsts wasn't inited
    +  Co-authored-by: Gisle Vanem
       
    -  Reported-by: Jonathan Cardoso
    -  Fixes #7710
    -  Closes #7711
    -
    -- [Tatsuhiro Tsujikawa brought this change]
    +  Fixes https://github.com/curl/curl/issues/7877
    +  Closes https://github.com/curl/curl/pull/7878
     
    -  ngtcp2: fix build with ngtcp2 and nghttp3
    -  
    -  ngtcp2_conn_client_new and nghttp3_conn_client_new are now macros.
    -  Check the wrapped functions instead.
    +Daniel Stenberg (2 Nov 2021)
    +- Curl_updateconninfo: store addresses for QUIC connections too
       
    -  ngtcp2_stream_close callback now takes flags parameter.
    +  So that CURLINFO_PRIMARY_IP etc work for HTTP/3 like for other HTTP
    +  versions.
       
    -  Closes #7709
    +  Reported-by: Jerome Mao
    +  Fixes #7939
    +  Closes #7944
     
    -- write-out.d: clarify size_download/upload
    -  
    -  They show the number of "body" bytes transfered.
    -  Fixes #7702
    -  Closes #7706
    +- [Sergio Durigan Junior brought this change]
     
    -- http2: Curl_http2_setup needs to init stream data in all invokes
    +  curl.1: fix typos in the manpage
       
    -  Thus function was written to avoid doing multiple connection data
    -  initializations, which is fine, but since it also initiates stream
    -  related data it is crucial that it doesn't skip those even if called
    -  again for the same connection. Solved by moving the stream
    -  initializations before the "doing-it-again" check.
    +  s/transfering/transferring/
    +  s/transfered/transferred/
       
    -  Reported-by: Inho Oh
    -  Fixes #7630
    -  Closes #7692
    +  Signed-off-by: Sergio Durigan Junior 
    +  Closes #7937
     
    -- url: fix compiler warning in no-verbose builds
    -  
    -  Follow-up from 2f0bb864c12
    +Marc Hoersken (1 Nov 2021)
    +- tests/smbserver.py: fix compatibility with impacket 0.9.23+
       
    -  Closes #7700
    -
    -- non-ascii: fix build errors from strerror fix
    +  impacket now performs sanity checks if the requested and to
    +  be served file path actually is inside the real share path.
       
    -  Follow-up to 2f0bb864c12
    +  Ref: https://github.com/SecureAuthCorp/impacket/pull/1066
       
    -  Closes #7697
    +  Fixes #7924
    +  Closes #7935
     
    -- parse_args: redo the warnings for --remote-header-name combos
    -  
    -  ... to avoid the memory leak risk pointed out by scan-build.
    +Daniel Stenberg (1 Nov 2021)
    +- docs: reduce use of "very"
       
    -  Follow-up from 7a3e981781d6c18a
    +  "Very" should be avoided in most texts. If intensifiers are needed, try
    +  find better words instead.
       
    -  Closes #7698
    +  Closes #7936
     
    -- ngtcp2: adapt to new size defintions upstream
    -  
    -  Reviewed-by: Tatsuhiro Tsujikawa
    -  Closes #7699
    +- [Tatsuhiro Tsujikawa brought this change]
     
    -- rustls: add strerror.h include
    +  ngtcp2: specify the missing required callback functions
       
    -  Follow-up to 2f0bb864c12
    +  Closes #7929
     
    -- docs: the security list is reached at security at curl.se now
    +- CURLOPT_[PROXY]_SSL_CIPHER_LIST.3: bold instead of quote
       
    -  Also update the FAQ section a bit to encourage users to rather submit
    -  security issues on hackerone than sending email.
    +  Bold the example ciphers instead of using single quotes, which then also
    +  avoids the problem of how to use single quotes when first in a line.
       
    -  Closes #7689
    +  Also rephrased the pages a little.
    +  
    +  Reported-by: Sergio Durigan Junior
    +  Ref: #7928
    +  Closes #7934
     
    -Marc Hoersken (9 Sep 2021)
    -- runtests: add option -u to error on server unexpectedly alive
    +- gen.pl: replace leading single quotes with \(aq
       
    -  Let's try to actually handle the server unexpectedly alive
    -  case by first making them visible on CI builds as failures.
    +  ... and allow single quotes to be used "normally" in the .d files.
       
    -  This is needed to detect issues with killing of the test
    -  servers completely including nested process chains with
    -  multiple PIDs per test server (including bash and perl).
    +  Makes the output curl.1 use better nroff.
       
    -  On Windows/cygwin platforms this is especially helpful with
    -  debugging PID mixups due to cygwin using its own PID space.
    +  Reported-by: Sergio Durigan Junior
    +  Ref: #7928
    +  Closes #7933
    +
    +Marc Hoersken (1 Nov 2021)
    +- tests: kill some test servers afterwards to avoid locked logfiles
       
       Reviewed-by: Daniel Stenberg
    -  Closes #7180
    +  Closes #7925
     
    -Daniel Stenberg (9 Sep 2021)
    -- opts docs: unify phrasing in NAME header
    +Daniel Stenberg (1 Nov 2021)
    +- smooth-gtk-thread.c: enhance the mutex lock use
       
    -  - avoid writing "set ..." or "enable/disable ..." or "specify ..."
    -    *All* options for curl_easy_setopt() are about setting or enabling
    -    things and most of the existing options didn't use that way of
    -    description.
    +  Reported-by: ryancaicse on github
    +  Fixes #7926
    +  Closes #7931
    +
    +Marc Hoersken (31 Oct 2021)
    +- CI/runtests.pl: restore -u flag, but remove it from CI runs
       
    -  - start with lowercase letter, unless abbreviation. For consistency.
    +  This makes it possible to use -u again for local testing,
    +  but removes the flag from CI config files and make targets.
       
    -  - Some additional touch-ups
    +  Reviewed-by: Daniel Stenberg
       
    -  Closes #7688
    +  Partially reverts #7841
    +  Closes #7921
     
    -- strerror.h: remove the #include from files not using it
    +Daniel Stenberg (29 Oct 2021)
    +- [Jonathan Cardoso Machado brought this change]
     
    -- lib: don't use strerror()
    -  
    -  We have and provide Curl_strerror() internally for a reason: strerror()
    -  is not necessarily thread-safe so we should always try to avoid it.
    -  
    -  Extended checksrc to warn for this, but feature the check disabled by
    -  default and only enable it in lib/
    +  CURLOPT_HSTSWRITEFUNCTION.3: using CURLOPT_HSTS_CTRL is required
       
    -  Closes #7685
    +  Closes #7923
     
    -Daniel Gustafsson (8 Sep 2021)
    -- cirrus: Add FreeBSD 13.0 job and disable sanitizer build
    -  
    -  As alluded to the in the now removed comment, a 13.0 image became
    -  available and is now ready to be used.
    +- [Axel Morawietz brought this change]
    +
    +  imap: display quota information
       
    -  The sanitizer builds were running on the 12.1 image which since has
    -  been removed from the config, leaving the builds not running at all.
    -  When enabled it turns out that they don't actually work due to very
    -  long timeouts in executing the tests, so keep the disabled for now
    -  but a bit more controlled.
    +  Show response to "GETQUOTAROOT INBOX" command.
       
    -  Closes #7592
    -
    -Daniel Stenberg (8 Sep 2021)
    -- copyrights: update copyright year ranges
    +  Closes #6973
     
     - RELEASE-NOTES: synced
     
    -- INTERNALS: c-ares has a new home: c-ares.org
    +- [Boris Rasin brought this change]
     
    -- docs: remove experimental mentions from HSTS and MQTT
    +  cmake: fix error getting LOCATION property on non-imported target
       
    -  Reported-by: Jonathan Cardoso
    -  Bug: https://github.com/curl/curl/pull/6700#issuecomment-913792863
    -  Closes #7681
    +  Closes #7885
     
    -- [Cao ZhenXiang brought this change]
    +- [Xiaoke Wang brought this change]
     
    -  curl: add warning for incompatible parameters usage
    -  
    -  --continue-at - and --remote-header-name are known incompatible parameters
    +  url: check the return value of curl_url()
       
    -  Closes #7674
    -
    -- [git-bruh brought this change]
    +  Closes #7917
     
    -  examples/*hiperfifo.c: fix calloc arguments to match function proto
    -  
    -  Closes #7678
    +- [Roy Li brought this change]
     
    -- INTERNALS: bump c-ares requirement to 1.16.0
    +  configure.ac: replace krb5-config with pkg-config
       
    -  Since ba904db0705c93 we use ares_getaddrinfo, added in c-ares 1.16.0
    -
    -- curl: stop retry if Retry-After: is longer than allowed
    -  
    -  If Retry-After: specifies a period that is longer than what fits within
    -  --retry-max-time, then stop retrying immediately.
    +  The rationale is that custom *-config tools don't work well when
    +  cross-compiling or using sysroots (such as when using Yocto project) and
    +  require custom fixing for each of them; pkg-config on the other hand
    +  works similarly everywhere.
       
    -  Added test 366 to verify.
    +  Signed-off-by: Roy Li 
    +  Signed-off-by: Alexander Kanavin 
       
    -  Reported-by: Kari Pahula
    -  Fixes #7675
    -  Closes #7676
    -
    -- [Michał Antoniak brought this change]
    +  Closes #7916
     
    -  mbedtls: avoid using a large buffer on the stack
    -  
    -  Use dynamic memory allocation for the buffer used in checking "pinned
    -  public key". The PUB_DER_MAX_BYTES parameter with default settings is
    -  set to a value greater than 2kB.
    +- test1160: edited to work with hyper
       
    -  Co-authored-by: Daniel Stenberg
    -  Closes #7586
    +  Closes #7912
     
    -- configure: make --disable-hsts work
    -  
    -  The AC_ARG_ENABLE() macro itself uses a variable called
    -  'enable_[option]', so when our script also used a variable with that
    -  name for the purpose of storing what the user wants, it also
    -  accidentally made it impossible to switch off the feature with
    -  --disable-hsts. Fix this by renaming our variable.
    +- data/DISABLED: enable tests that now work with hyper
       
    -  Reported-by: Michał Antoniak
    -  Fixes #7669
    -  Closes #7672
    +  Closes #7911
     
    -Jay Satiro (5 Sep 2021)
    -- config.d: note that curlrc is used even when --config
    +- test559: add 'HTTP' in keywords
       
    -  Bug: https://github.com/curl/curl/pull/7666#issuecomment-912214751
    -  Reported-by: Viktor Szakats
    +  Makes it run fine with hyper
       
    -  Closes https://github.com/curl/curl/pull/7667
    +  Closes #7911
     
    -Daniel Stenberg (4 Sep 2021)
    -- RELEASE-NOTES: synced
    +- test552: updated to work with hyper
    +  
    +  Closes #7911
     
    -- test1173: check references to libcurl options
    +Marc Hoersken (27 Oct 2021)
    +- github: fix incomplete permission to label PRs for Hacktoberfest
       
    -  ... that they refer to actual existing libcurl options.
    +  Unfortunately the GitHub API requires a token with write permission
    +  for both issues and pull-requests to edit labels on even just PRs.
       
    -  Reviewed-by: Daniel Gustafsson
    -  Closes #7656
    +  Follow up to #7897
     
    -- CURLOPT_UNIX_SOCKET_PATH.3: remove nginx reference, add see also
    +Daniel Stenberg (27 Oct 2021)
    +- opt-manpages: use 'Added in' instead of 'Since'
       
    -  Closes #7656
    +  Closes #7913
     
    -- opt-docs: verify man page sections + order
    -  
    -  In every libcurl option man page there are now 8 mandatory sections that
    -  must use the right name in the correct order and test 1173 verifies
    -  this. Only 14 man pages needed adjustments.
    +Marc Hoersken (27 Oct 2021)
    +- github: fix missing permission to label PRs for Hacktoberfest
       
    -  The sections and the order is as follows:
    +  Follow up to #7897
       
    -   - NAME
    -   - SYNOPSIS
    -   - DESCRIPTION
    -   - PROTOCOLS
    -   - EXAMPLE
    -   - AVAILABILITY
    -   - RETURN VALUE
    -   - SEE ALSO
    +  Test references to see if permissions are now sufficient:
       
    -  Reviewed-by: Daniel Gustafsson
    -  Closes #7656
    +  Closes #7832
    +  Closes #7897
     
    -- opt-docs: make sure all man pages have examples
    -  
    -  Extended manpage-syntax.pl (run by test 1173) to check that every man
    -  page for a libcurl option has an EXAMPLE section that is more than two
    -  lines. Then fixed all errors it found and added examples.
    +- CI: more use of test-ci make target and verbose output
       
    -  Reviewed-by: Daniel Gustafsson
    -  Closes #7656
    -
    -- get.d: provide more useful examples
    +  Replace test-nonflaky with test-ci and enable verbose output
    +  in all remaining CIs except Zuul which is customized a lot.
       
    -  Closes #7668
    -
    -- page-header: add GOPHERS, simplify wording in the 1st para
    +  Reviewed-by: Daniel Stenberg
    +  Reviewed-by: Jay Satiro
       
    -  Closes #7665
    +  Follow up to #7785
    +  Closes #7832
     
    -- connect: get local port + ip also when reusing connections
    +- github: add support for Hacktoberfest using labels
       
    -  Regression. In d6a37c23a3c (7.75.0) we removed the duplicated storage
    -  (connection + easy handle), so this info needs be extracted again even
    -  for re-used connections.
    +  Automatically add hacktoberfest-accepted label to PRs opened between
    +  September 30th and November 1st once a commit with a close reference
    +  to it is pushed onto the master branch.
       
    -  Add test 435 to verify
    +  With this workflow we can participate in Hacktoberfest while not
    +  relying on GitHub to identify PRs as merged due to our rebasing.
       
    -  Reported-by: Max Dymond
    -  Fixes #7660
    -  Closes #7662
    -
    -Marcel Raad (2 Sep 2021)
    -- multi: fix compiler warning with `CURL_DISABLE_WAKEUP`
    +  Requires hacktoberfest-accepted labels to exist for PRs on the
    +  participating repository. Also requires hacktoberfest topic on
    +  the participating repository to avoid applying to forked repos.
       
    -  `use_wakeup` is unused in this case.
    +  Reviewed-by: Daniel Stenberg
       
    -  Closes https://github.com/curl/curl/pull/7661
    +  Fixes #7865
    +  Closes #7897
     
    -Daniel Stenberg (1 Sep 2021)
    -- tests: adjust the tftpd output to work with hyper mode
    +Daniel Stenberg (27 Oct 2021)
    +- http: reject HTTP response codes < 100
       
    -  By making them look less like http headers, the hyper mode "tweak"
    -  doesn't interfere.
    +  ... which then also includes negative ones as test 1430 uses.
       
    -  Enable test 2002 and 2003 in hyper builds (and 1280 which is unrelated
    -  but should be enabled).
    +  This makes native + hyper backend act identically on this and therefore
    +  test 1430 can now be enabled when building with hyper. Adjust test 1431
    +  as well.
       
    -  Closes #7658
    +  Closes #7909
     
    -Daniel Gustafsson (1 Sep 2021)
    -- [Gisle Vanem brought this change]
    +- [Kerem Kat brought this change]
     
    -  openssl: annotate SSL3_MT_SUPPLEMENTAL_DATA
    +  docs: fix typo in CURLOPT_TRAILERFUNCTION example
       
    -  This adds support for the previously unhandled supplemental data which
    -  in -v output was printed like:
    +  Closes #7910
    +
    +- docs/HYPER: remove some remaining issues, add HTTP/0.9 limitation
    +
    +- configure: when hyper is selected, deselect nghttp2
       
    -      TLSv1.2 (IN), TLS header, Unknown (23):
    +  Closes #7908
    +
    +- [Patrick Monnerat brought this change]
    +
    +  sendf: accept zero-length data in Curl_client_write()
       
    -  These will now be printed with proper annotation:
    +  Historically, Curl_client_write() used a length value of 0 as a marker
    +  for a null-terminated data string. This feature has been removed in
    +  commit f4b85d2. To detect leftover uses of the feature, a DEBUGASSERT
    +  statement rejecting a length with value 0 was introduced, effectively
    +  precluding use of this function with zero-length data.
       
    -      TLSv1.2 (OUT), TLS header, Supplemental data (23):
    +  The current commit removes the DEBUGASSERT and makes the function to
    +  return immediately if length is 0.
       
    -  Closes #7652
    -  Reviewed-by: Daniel Stenberg 
    -
    -Daniel Stenberg (1 Sep 2021)
    -- curl.1: provide examples for each option
    +  A direct effect is to fix trying to output a zero-length distinguished
    +  name in openldap.
       
    -  The file format for each option now features a "Example:" header that
    -  can provide one or more examples that get rendered appropriately in the
    -  output. All options MUST have at least one example or gen.pl complains
    -  at build-time.
    +  Another DEBUGASSERT statement is also rephrased for better readability.
       
    -  This fix also does a few other minor format and consistency cleanups.
    +  Closes #7898
    +
    +- hyper: disable test 1294 since hyper doesn't allow such crazy headers
       
    -  Closes #7654
    +  Closes #7905
     
    -- progress: make trspeed avoid floats
    +- c-hyper: make CURLOPT_SUPPRESS_CONNECT_HEADERS work
       
    -  and compiler warnings for data conversions.
    +  Verified by the enabled test 1288
       
    -  Reported-by: Michał Antoniak
    -  Fixes #7645
    -  Closes #7653
    -
    -- test365: verify response with chunked AND Content-Length headers
    +  Closes #7905
     
    -- http: ignore content-length if any transfer-encoding is used
    +- test1287: make work on hyper
       
    -  Fixes #7643
    -  Closes #7649
    +  Closes #7905
     
    -- RELEASE-NOTES: synced
    +- test1266/1267: disabled on hyper: no HTTP/0.9 support
    +  
    +  Closes #7905
     
    -- Revert "http2: skip immediate parsing of payload following protocol switch"
    +Viktor Szakats (25 Oct 2021)
    +- Makefile.m32: fix to not require OpenSSL with -libssh2 or -rtmp options
       
    -  This reverts commit 455a63c66f188598275e87d32de2c4e8e26b80cb.
    +  Previously, -libssh2/-rtmp options assumed that OpenSSL is also enabled
    +  (and then failed with an error when not finding expected OpenSSL headers),
    +  but this isn't necessarly true, e.g. when building both libssh2 and curl
    +  against Schannel. This patch makes sure to only enable the OpenSSL backend
    +  with -libssh2/-rtmp, when there was no SSL option explicitly selected.
       
    -  Reported-by: Tk Xiong
    -  Fixes #7633
    -  Closes #7648
    -
    -- KNOWN_BUGS: HTTP/3 doesn't support client certs
    +  - Re-implement the logic as a single block of script.
    +  - Also fix an indentation while there.
       
    -  Closes #7625
    +  Assisted-by: Jay Satiro
    +  
    +  Closes #7895
     
    -- mailing lists: move from cool.haxx.se to lists.haxx.se
    +Daniel Stenberg (25 Oct 2021)
    +- docs: consistent use of "Added in"
    +  
    +  Make them all say "Added in [version]" without using 'curl' or 'libcurl'
    +  in that phrase.
     
    -- http_proxy: only wait for writable socket while sending request
    +- man pages: require all to use the same section header order
       
    -  Otherwise it would wait socket writability even after the entire CONNECT
    -  request has sent and make curl basically busy-loop while waiting for a
    -  response to come back.
    +  This is the same order we already enforce among the options' man pages:
    +  consistency is good. Add lots of previously missing examples.
       
    -  The previous fix attempt in #7484 (c27a70a591a4) was inadequate.
    +  Adjust the manpage-syntax script for this purpose, used in test 1173.
       
    -  Reported-by: zloi-user on github
    -  Reported-by: Oleguer Llopart
    -  Fixes #7589
    -  Closes #7647
    +  Closes #7904
     
    -- http: disallow >3-digit response codes
    +- [David Hu brought this change]
    +
    +  docs/HTTP3: improve build instructions
       
    -  Make the built-in HTTP parser behave similar to hyper and reject any
    -  HTTP response using more than 3 digits for the response code.
    +  1. If writing to a system path if the command is not prefixed with
    +  `sudo` it will cause a permission denied error
       
    -  Updated test 1432 accordingly.
    -  Enabled test 1432 in the hyper builds.
    +  2. The patched OpenSSL branch has been updated to `openssl-3.0.0+quic`
    +  to match upstream OpenSSL version.
       
    -  Closes #7641
    +  3. We should not disable GnuTLS docs.
    +  
    +  Updated some commands about `make install`
    +  
    +  Closes #7842
     
    -- [Tatsuhiro Tsujikawa brought this change]
    +- [Ricardo Martins brought this change]
     
    -  ngtcp2: stop buffering crypto data
    +  CMake: restore support for SecureTransport on iOS
       
    -  Stop buffering crypto data because libngtcp2 now buffers submitted
    -  crypto data.
    +  Restore support for building curl for iOS with SecureTransport enabled.
       
    -  Closes #7637
    +  Closes #7501
     
    -- test1280: CRLFify the response to please hyper
    +- tests: enable more tests with hyper
       
    -  Closes #7639
    -
    -- tests: enable test 1129 for hyper builds
    +  Adjusted 1144, 1164 and 1176.
       
    -  Closes #7638
    +  Closes #7900
     
    -- curl: better error message when -O fails to get a good name
    +- docs: provide "RETURN VALUE" section for more func manpages
       
    -  Due to how this currently works internally, it needs a working initial
    -  file name to store contents in, so it may still fail even with -J is
    -  used (and thus accepting a name from content-disposition:) if the file
    -  name part of the URL isn't "good enough".
    +  Three were missing, one used a non-standard name for the header.
       
    -  Fixes #7628
    -  Closes #7635
    +  Closes #7902
     
    -- curl_easy_setopt: tweak the string copy wording
    +Jay Satiro (25 Oct 2021)
    +- curl_multi_socket_action.3: add a "RETURN VALUE" section
       
    -  Reported-by: Yaobin Wen
    -  Fixes #7632
    -  Closes #7634
    +  .. because it may not be immediately clear to the user what
    +  curl_multi_socket_action returns.
    +  
    +  Ref: https://curl.se/mail/lib-2021-10/0035.html
    +  
    +  Closes https://github.com/curl/curl/pull/7901
     
    +Daniel Stenberg (24 Oct 2021)
     - RELEASE-NOTES: synced
     
    -- [Don J Olmstead brought this change]
    +- [Samuel Henrique brought this change]
     
    -  cmake: sync CURL_DISABLE options
    +  tests: use python3 in test 1451
       
    -  Adds the full listing of CURL_DISABLE options to the CMake build. Moves
    -  all option code, except for CURL_DISABLE_OPENSSL_AUTO_LOA_CONFIG which
    -  resides near OpenSSL configuration, to the same block of code. Also
    -  sorts the options here and in the cmake config header.
    +  This is a continuation of commit ec91b5a69000bea0794bbb3 in which
    +  changing this test was missed.  There are no other python2 leftovers
    +  now.
       
    -  Additionally sorted the CURL-DISABLE listing and fixed the
    -  CURL_DISABLE_POP3 option.
    +  Based on a Debian patch originally written by Alessandro Ghedini
    +  
       
    -  Closes #7624
    +  Closes #7899
     
    -Jay Satiro (25 Aug 2021)
    -- KNOWN_BUGS: FTPS upload data loss with TLS 1.3
    -  
    -  Bug: https://github.com/curl/curl/issues/6149
    -  Reported-by: Bylon2@users.noreply.github.com
    +- [Eddie Lumpkin brought this change]
    +
    +  lib: fixing comment spelling typos in lib files
       
    -  Closes https://github.com/curl/curl/pull/7623
    +  Closes #7894
    +  Signed-off-by: ewlumpkin 
     
    -Daniel Stenberg (24 Aug 2021)
    -- cmake: avoid poll() on macOS
    +- openssl: if verifypeer is not requested, skip the CA loading
       
    -  ... like we do in configure builds. Since poll() on macOS is not
    -  reliable enough.
    +  It was previously done mostly to show a match/non-match in the verbose
    +  output even when verification was not asked for. This change skips the
    +  loading of the CA certs unless verifypeer is set to save memory and CPU.
       
    -  Reported-by: marc-groundctl
    -  Fixes #7595
    -  Closes #7619
    +  Closes #7892
     
    -- c-hyper: handle HTTP/1.1 => HTTP/1.0 downgrade on reused connection
    +- curl-confopts.m4:  remove --enable/disable-hidden-symbols
       
    -  Enable test 1074
    +  These configure options have been saying "deprecated" since 9e24b9c7af
    +  (April 2012). It was about time we remove them.
       
    -  Closes #7617
    +  Closes #7891
     
    -- c-hyper: deal with Expect: 100-continue combined with POSTFIELDS
    +- c-hyper: don't abort CONNECT responses early when auth-in-progress
       
    -  Enable test 1130 and 1131
    +  ... and make sure to stop ignoring the body once the CONNECT is done.
       
    -  Closes #7616
    -
    -- [a1346054 brought this change]
    +  This should make test 206 work proper again and not be flaky.
    +  
    +  Closes #7889
     
    -  tests: be explicit about using 'python3' instead of 'python'
    +- hyper: does not support disabling CURLOPT_HTTP_TRANSFER_DECODING
       
    -  This fixes running tests in virtualenvs (or on distros) that no longer
    -  have a symlink from python to python2 or python3.
    +  Simply because hyper doesn't have this ability. Mentioned in docs now.
       
    -  Closes #7602
    -
    -- [a1346054 brought this change]
    -
    -  scripts: invoke interpreters through /usr/bin/env
    +  Skip test 326 then
       
    -  Closes #7602
    +  Closes #7889
     
    -- DISABLED: enable 11 more tests for hyper builds
    +- test262: don't attempt with hyper
       
    -  Closes #7612
    +  This test verifies that curl works with binary zeroes in HTTP response
    +  headers and hyper refuses such. They're not kosher http.
    +  
    +  Closes #7889
     
    -- setopt: enable CURLOPT_IGNORE_CONTENT_LENGTH for hyper
    +- c-hyper: make test 217 run
       
    -  Since this option is also used for FTP, it needs to work to set for
    -  applications even if hyper doesn't support it for HTTP. Verified by test
    -  1137.
    +  Closes #7889
    +
    +- DISABLED: enable test 209+213 for hyper
       
    -  Updated docs to specify that the option doesn't work for HTTP when using
    -  the hyper backend.
    +  Follow-up to 823d3ab855c
       
    -  Closes #7614
    +  Closes #7889
     
    -- test1138: remove trailing space to make work with hyper
    +- test207: accept a different error code for hyper
       
    -  Closes #7613
    -
    -- libcurl-errors.3: clarify two CURLUcode errors
    +  It returns HYPERE_UNEXPECTED_EOF for this case which we convert to the
    +  somewhat generic CURLE_RECV_ERROR.
       
    -  CURLUE_BAD_HANDLE and CURLUE_BAD_PARTPOINTER should be for "bad" or
    -  wrong pointers in a generic sense, not just for NULL pointers.
    +  Closes #7889
    +
    +- [Érico Nogueira brought this change]
    +
    +  INSTALL: update symbol hiding option
       
    -  Reviewed-by: Jay Satiro
    +  --enable-hidden-symbols was deprecated in
    +  9e24b9c7afbcb81120af4cf3f6cdee49a06d8224.
       
    -  Ref: #7605
    -  Closes #7611
    +  Closes #7890
     
    -Jay Satiro (23 Aug 2021)
    -- symbols-in-versions: fix CURLSSLBACKEND_QSOSSL last used version
    +- http_proxy: multiple CONNECT with hyper done better
       
    -  ... and also change the 'Removed' column name to 'Last' since that
    -  column is for the last version to contain the symbol.
    +  Enabled test 206
       
    -  Closes https://github.com/curl/curl/pull/7609
    +  Closes #7888
     
    -Daniel Stenberg (23 Aug 2021)
    -- urlapi.c:seturl: assert URL instead of using if-check
    +- hyper: pass the CONNECT line to the debug callback
       
    -  There's no code flow possible where this can happen. The assert makes
    -  sure it also won't be introduced undetected in the future.
    +  Closes #7887
    +
    +- mailmap: Malik Idrees Hasan Khan
    +
    +Jay Satiro (21 Oct 2021)
    +- [Malik Idrees Hasan Khan brought this change]
    +
    +  build: fix typos
       
    -  Closes #7610
    +  Closes https://github.com/curl/curl/pull/7886
     
    -- curl-openssl.m4: show correct output for OpenSSL v3
    +- URL-SYNTAX: add IMAP UID SEARCH example
       
    -  Using 3.0.0 versions configure should now show this:
    +  - Explain the difference between IMAP search via URL (which returns
    +    message sequence numbers) and IMAP search via custom request (which
    +    can return UID numbers if prefixed with UID, eg "UID SEARCH ...").
       
    -  checking for OpenSSL headers version... 3.0.0 - 0x300
    -  checking for OpenSSL library version... 3.0.0
    -  checking for OpenSSL headers and library versions matching... yes
    +  Bug: https://github.com/curl/curl/issues/7626
    +  Reported-by: orycho@users.noreply.github.com
       
    -  This output doesn't actually change what configure generates but is only
    -  "cosmetic".
    +  Ref: https://github.com/curl/curl/issues/2789
       
    -  Reported-by: Randall S. Becker
    -  Fixes #7606
    -  Closes #7608
    +  Closes https://github.com/curl/curl/pull/7881
     
    -Jay Satiro (22 Aug 2021)
    -- mksymbolsmanpage.pl: Fix showing symbol's last used version
    -  
    -  Prior to this change the symbol's deprecated version was erroneously
    -  shown as its last used version.
    +Daniel Stenberg (20 Oct 2021)
    +- manpage: adjust the asterisk in some SYNOPSIS sections
       
    -  Bug: https://github.com/curl/curl/commit/4e53b94#commitcomment-55239509
    -  Reported-by: i-ky@users.noreply.github.com
    +  Closes #7884
     
    -Daniel Stenberg (21 Aug 2021)
    -- mksymbolsmanpage.pl: match symbols case insenitively
    +- curl_multi_perform.3: polish wording
       
    -  Follow-up to 4e53b9430c750 which made this bug show.
    +   - simplify the example by using curl_multi_poll
       
    -  Reported-by: i-ky
    -  Bug: https://github.com/curl/curl/commit/4e53b9430c7504de8984796e2a2091ec16f27136#commitcomment-55239253
    -  Closes #7607
    -
    -- asyn-ares: call ares_freeaddrinfo() to clean up addrinfo results
    +   - mention curl_multi_add_handle in the text
       
    -  As this leaks memory otherwise
    +   - cut out the description of pre-7.20.0 return code behavior - that version
    +     is now more than eleven years old and is basically no longer out there
       
    -  Follow-up to ba904db0705c931
    +   - adjust the "typical usage" to mention curl_multi_poll
       
    -  Closes #7599
    +  Closes #7883
     
    -- [Ehren Bendler brought this change]
    +- docs/THANKS: removed on request
     
    -  wolfssl: clean up wolfcrypt error queue
    +- FAQ: polish the explanation of libcurl
    +
    +- curl_easy_perform.3: minor wording tweak
    +
    +- [Erik Stenlund brought this change]
    +
    +  mime: mention CURL_DISABLE_MIME in comment
       
    -  If wolfSSL is built in certain ways (OPENSSL_EXTRA or Debug), the error
    -  queue gets added on to for each session and never freed. Fix it by
    -  calling ERR_clear_error() like in vtls/openssl when needed. This func is
    -  a no-op in wolfcrypt if the error queue is not enabled.
    +  CURL_DISABLE_MIME is not mentioned in the comment describing the if else
    +  preprocessor directive.
       
    -  Closes #7594
    +  Closes #7882
     
    -- man pages: remove trailing whitespaces
    +- tls: remove newline from three infof() calls
       
    -  Extended test 1173 (via the manpage-syntax.pl script) to detect and warn
    -  for them.
    +  Follow-up to e7416cf
       
    -  Ref: #7602
    -  Reported-by: a1346054 on github
    -  Closes #7604
    +  Reported-by: billionai on github
    +  Fixes #7879
    +  Closes #7880
     
    -- mailmap: add Gleb Ivanovsky
    +- RELEASE-NOTES: synced
     
    -- config.d: escape the backslash properly
    +- curl_gssapi: fix build warnings by removing const
       
    -  Closes #7603
    +  Follow-up to 20e980f85b0ea6
    +  
    +  In #7875 these inits were modified but I get two warnings that these new
    +  typecasts are necessary for.
    +  
    +  Closes #7876
     
    -- [Don J Olmstead brought this change]
    +- [Bo Anderson brought this change]
     
    -  curl_setup.h: sync values for HTTP_ONLY
    +  curl_gssapi: fix link error on macOS Monterey
       
    -  The values for HTTP_ONLY differed between CMakeLists.txt and
    -  curl_setup.h. Sync them and sort the values in curl_setup.h to make it
    -  easier to spot differences.
    +  Fixes #7657
    +  Closes #7875
    +
    +- test1185: verify checksrc
       
    -  Closes #7601
    +  Closes #7866
     
    -Jay Satiro (21 Aug 2021)
    -- configure: set classic mingw minimum OS version to XP
    +- checksrc: improve the SPACESEMICOLON error message
       
    -  - If the user has not specified a minimum OS version (via WINVER or
    -    _WIN32_WINNT macros) then set it to Windows XP.
    +  and adjust the MULTISPACE one to use plural
       
    -  Prior to this change classic MinGW defaulted the minimum OS version
    -  to Windows NT 4.0 which is way too old. At least Windows XP is needed
    -  for getaddrinfo (which resolves hostnames to IPv6 addresses).
    +  Closes #7866
    +
    +- url: set "k->size" -1 at start of request
       
    -  Ref: https://github.com/curl/curl/issues/7483#issuecomment-891597034
    +  The size of the transfer is unknown at that point.
       
    -  Closes https://github.com/curl/curl/pull/7581
    +  Fixes #7871
    +  Closes #7872
     
    -- schannel: Work around typo in classic mingw macro
    +Daniel Gustafsson (18 Oct 2021)
    +- doh: remove experimental code for DoH with GET
       
    -  - Define ALG_CLASS_DHASH (the typo from the include) to ALG_CLASS_HASH.
    +  The code for sending DoH requests with GET was never enabled in a way
    +  such that it could be used or tested. As there haven't been requests
    +  for this feature, and since it at this is effectively dead, remove it
    +  and favor reimplementing the feature in case anyone is interested.
       
    -  Prior to this change there was an incomplete fix to ignore the
    -  CALG_TLS1PRF macro on those versions of MinGW where it uses the
    -  ALG_CLASS_DHASH typoed macro.
    +  Closes #7870
    +  Reviewed-by: Daniel Stenberg 
    +
    +Daniel Stenberg (18 Oct 2021)
    +- cirrus: remove FreeBSD 11.4 from the matrix
       
    -  Ref: 48cf45c
    -  Ref: https://osdn.net/projects/mingw/ticket/38391
    -  Ref: https://github.com/curl/curl/issues/2924
    +  It has reached End-Of-Life and causes some LDAP CI issues.
       
    -  Closes https://github.com/curl/curl/pull/7580
    -
    -Daniel Stenberg (20 Aug 2021)
    -- RELEASE-NOTES: synced
    +  Closes #7869
     
    -- http_proxy: fix user-agent and custom headers for CONNECT with hyper
    +- cirrus: switch to openldap24-client
       
    -  Enable test 287
    +  ... as it seems openldap-client doesn't exist anymore.
       
    -  Closes #7598
    +  Reported-by: Jay Satiro
    +  Fixes #7868
    +  Closes #7869
     
    -- c-hyper: initial support for "dumping" 1xx HTTP responses
    +- checksrc: ignore preprocessor lines
       
    -  With the use hyper_request_on_informational()
    +  In order to check the actual code better, checksrc now ignores
    +  everything that look like preprocessor instructions. It also means
    +  that code in macros are now longer checked.
       
    -  Enable test 155 and 158
    +  Note that some rules then still don't need to be followed when code is
    +  exactly below a cpp instruction.
       
    -  Closes #7597
    -
    -Marc Hoersken (18 Aug 2021)
    -- tests/*server.pl: flush output before executing subprocess
    +  Removes two checksrc exceptions we needed previously because of
    +  preprocessor lines being checked.
       
    -  Also avoid shell processes staying around by using exec.
    -  This is necessary to avoid output data being buffering
    -  inside the process chain of Perl, Bash/Shell and our
    -  test server binaries. On non-Windows systems the exec
    -  will also make the subprocess replace the intermediate
    -  shell, but on Windows it will at least bind the processes
    -  together since there is no real fork or exec available.
    +  Reported-by: Marcel Raad
    +  Fixes #7863
    +  Closes #7864
    +
    +- urlapi: skip a strlen(), pass in zero
       
    -  See: https://cygwin.com/cygwin-ug-net/highlights.html
    -  and: https://docs.microsoft.com/cpp/c-runtime-library/exec-wexec-functions
    -  Ref: https://github.com/curl/curl/pull/7530#issuecomment-900949010
    +  ... to let curl_easy_escape() itself do the strlen. This avoids a (false
    +  positive) Coverity warning and it avoids us having to store the strlen()
    +  return value in an int variable.
       
    -  Reviewed-by: Daniel Stenberg
    -  Reviewed-by: Jay Satiro
    -  Closes #7530
    +  Reviewed-by: Daniel Gustafsson
    +  Closes #7862
     
    -- CI: use GitHub Container Registry instead of Docker Hub
    +- misc: update copyright years
    +
    +- examples/htmltidy: correct wrong printf() use
       
    -  Avoid limits on Docker Hub and improve image pull/download speed.
    +  ... and update the includes to match how current htmltidy wants them
    +  used.
       
    -  Closes #7587
    +  Reported-by: Stathis Kapnidis
    +  Fixes #7860
    +  Closes #7861
     
    -Daniel Stenberg (18 Aug 2021)
    -- openssl: when creating a new context, there cannot be an old one
    +Jay Satiro (15 Oct 2021)
    +- http: set content length earlier
       
    -  Remove the previous handling that would call SSL_CTX_free(), and instead
    -  add an assert that halts a debug build if there ever is a context
    -  already set at this point.
    +  - Make content length (ie download size) accessible to the user in the
    +    header callback, but only after all headers have been processed (ie
    +    only in the final call to the header callback).
       
    -  Closes #7585
    -
    -Jay Satiro (18 Aug 2021)
    -- KNOWN_BUGS: Renegotiate from server may cause hang for OpenSSL backend
    +  Background:
       
    -  Closes https://github.com/curl/curl/issues/6785
    +  For a long time the content length could be retrieved in the header
    +  callback via CURLINFO_CONTENT_LENGTH_DOWNLOAD_T as soon as it was parsed
    +  by curl.
    +  
    +  Changes were made in 8a16e54 (precedes 7.79.0) to ignore content length
    +  if any transfer encoding is used. A side effect of that was that
    +  content length was not set by libcurl until after the header callback
    +  was called the final time, because until all headers are processed it
    +  cannot be determined if content length is valid.
    +  
    +  This change keeps the same intention --all headers must be processed--
    +  but now the content length is available before the final call to the
    +  header function that indicates all headers have been processed (ie
    +  a blank header).
    +  
    +  Bug: https://github.com/curl/curl/commit/8a16e54#r57374914
    +  Reported-by: sergio-nsk@users.noreply.github.com
    +  
    +  Co-authored-by: Daniel Stenberg
    +  
    +  Fixes https://github.com/curl/curl/issues/7804
    +  Closes https://github.com/curl/curl/pull/7803
     
    -Viktor Szakats (17 Aug 2021)
    -- docs/BINDINGS: URL update
    +Daniel Stenberg (15 Oct 2021)
    +- [Abhinav Singh brought this change]
     
    -Marc Hoersken (17 Aug 2021)
    -- tests/server/*.c: align handling of portfile argument and file
    +  aws-sigv4: make signature work when post data is binary
       
    -  1. Call the internal variable portname (like pidname) everywhere.
    -  2. Have a variable wroteportfile (like wrotepidfile) everywhere.
    -  3. Make sure the file is cleaned up on exit (like pidfile).
    -  4. Add parameter --portfile to usage outputs everywhere.
    +  User sets the post fields size for binary data.  Hence, we should not be
    +  using strlen on it.
       
    -  Reviewed-by: Daniel Stenberg
    +  Added test 1937 and 1938 to verify.
       
    -  Replaces #7523
    -  Closes #7574
    +  Closes #7844
     
    -Daniel Gustafsson (17 Aug 2021)
    -- KNOWN_BUGS: Fix a number of typos in KNOWN_BUGS
    +- [a1346054 brought this change]
    +
    +  MacOSX-Framework: remove redundant ';'
       
    -  Fixes a set of typos found in section 11.3.
    +  Closes #7859
     
    -Daniel Stenberg (17 Aug 2021)
    -- getparameter: fix the --local-port number parser
    +- RELEASE-NOTES: synced
    +
    +- openssl: with OpenSSL 1.1.0+ a failed RAND_status means goaway
       
    -  It could previously get tricked into parsing the uninitialized stack
    -  based buffer.
    +  One reason we know it can fail is if a provider is used that doesn't do
    +  a proper job or is wrongly configured.
       
    -  Reported-by: Brian Carpenter
    -  Closes #7582
    +  Reported-by: Michael Baentsch
    +  Fixes #7840
    +  Closes #7856
     
    -- KNOWN_BUGS: Can't use Secure Transport with Crypto Token Kit
    +Marcel Raad (14 Oct 2021)
    +- [Ryan Mast brought this change]
    +
    +  cmake: add CURL_ENABLE_SSL option and make CMAKE_USE_* SSL backend options depend on it
       
    -  Closes #7048
    +  Closes https://github.com/curl/curl/pull/7822
     
    -- [Jan Verbeek brought this change]
    +Daniel Stenberg (14 Oct 2021)
    +- http: remove assert that breaks hyper
    +  
    +  Reported-by: Jay Satiro
    +  Fixes #7852
    +  Closes #7855
     
    -  curl: add warning for ignored data after quoted form parameter
    +- http_proxy: fix one more result assign for hyper
       
    -  In an argument like `-F 'x=@/etc/hostname;filename="foo"abc'` the `abc`
    -  is ignored. This adds a warning if the ignored data isn't all
    -  whitespace.
    +  and remove the bad assert again, since it was run even with no error!
       
    -  Closes #7394
    +  Closes #7854
     
    -Jay Satiro (17 Aug 2021)
    -- codeql: fix error "Resource not accessible by integration"
    +Jay Satiro (14 Oct 2021)
    +- sws: fix memory leak on exit
       
    -  - Enable codeql writing security-events.
    +  - Free the allocated http request struct on cleanup.
       
    -  GitHub set the default permissions to read, apparently since earlier
    -  this year.
    +  Prior to this change if sws was built with leak sanitizer it would
    +  report a memory leak error during testing.
       
    -  Ref: https://github.com/github/codeql-action/issues/464
    -  Ref: https://github.blog/changelog/2021-04-20-github-actions-control-permissions-for-github_token/
    +  Closes https://github.com/curl/curl/pull/7849
    +
    +Daniel Stenberg (14 Oct 2021)
    +- c-hyper: make Curl_http propagate errors better
       
    -  Fixes https://github.com/curl/curl/issues/7575
    -  Closes https://github.com/curl/curl/pull/7576
    +  Pass on better return codes when errors occur within Curl_http instead
    +  of insisting that CURLE_OUT_OF_MEMORY is the only possible one.
    +  
    +  Pointed-out-by: Jay Satiro
    +  Closes #7851
     
    -- tool_operate: Fix --fail-early with parallel transfers
    +- http_proxy: make hyper CONNECT() return the correct error code
       
    -  - Abort via progress callback to fail early during parallel transfers.
    +  For every 'goto error', make sure the result variable holds the error
    +  code for what went wrong.
       
    -  When a critical error occurs during a transfer (eg --fail-early
    -  constraint) then other running transfers will be aborted via progress
    -  callback and finish with error CURLE_ABORTED_BY_CALLBACK (42). In this
    -  case, the callback error does not become the most recent error and a
    -  custom error message is used for those transfers:
    -  
    -  curld --fail --fail-early --parallel
    -  https://httpbin.org/status/404 https://httpbin.org/delay/10
    -  
    -  curl: (22) The requested URL returned error: 404
    -  curl: (42) Transfer aborted due to critical error in another transfer
    +  Reported-by: Rafał Mikrut
    +  Fixes #7825
    +  Closes #7846
    +
    +- docs/Makefile.am: repair 'make html'
       
    -  > echo %ERRORLEVEL%
    -  22
    +  by removing index.html which isn't around anymore
       
    -  Fixes https://github.com/curl/curl/issues/6939
    -  Closes https://github.com/curl/curl/pull/6984
    +  Closes #7853
     
    -Daniel Stenberg (17 Aug 2021)
    -- [Sergey Markelov brought this change]
    +- [Борис Верховский brought this change]
     
    -  sectransp: support CURLINFO_CERTINFO
    +  curl: correct grammar in generated libcurl code
       
    -  Fixes #4130
    -  Closes #7372
    +  Closes #7802
     
    -- ngtcp2: remove the acked_crypto_offset struct field init
    +- tests: disable test 2043
       
    -  ... as it is gone from the API upstream.
    +  It uses revoked.badssl.com which now is expired and therefor this now
    +  permafails. We should not use external sites for tests, this test should
    +  be converted to use our own infra.
       
    -  Closes #7578
    +  Closes #7845
     
    -- misc: update incorrect copyright year ranges
    +- runtests: split out ignored tests
       
    -  Closes #7577
    +  Report ignore tests separately from the actual fails.
    +  
    +  Don't exit non-zero if test servers couldn't get killed.
    +  
    +  Assisted-by: Jay Satiro
    +  
    +  Fixes #7818
    +  Closes #7841
     
    -- KNOWN_BUGS: HTTP/3 quiche upload large file fails
    +- http2: make getsock not wait for write if there's no remote window
       
    -  Closes #7532
    +  While uploading, check for remote window availability in the getsock
    +  function so that we don't wait for a writable socket if no data can be
    +  sent.
    +  
    +  Reported-by: Steini2000 on github
    +  Fixes #7821
    +  Closes #7839
     
    -- KNOWN_BUGS: CMake build with MIT Kerberos does not work
    +- test368: verify dash is appended for "-r [num]"
       
    -  Closes #6904
    +  Follow-up to 8758a26f8878
     
    -- TODO: add asynch getaddrinfo support
    +- [Борис Верховский brought this change]
    +
    +  curl: actually append "-" to --range without number only
       
    -  Closes #6746
    +  Closes #7837
     
     - RELEASE-NOTES: synced
     
    -- [Artur Sinila brought this change]
    -
    -  http2: revert call the handle-closed function correctly on closed stream
    +- urlapi: URL decode percent-encoded host names
       
    -  Reverts 252790c5335a221
    +  The host name is stored decoded and can be encoded when used to extract
    +  the full URL. By default when extracting the URL, the host name will not
    +  be URL encoded to work as similar as possible as before. When not URL
    +  encoding the host name, the '%' character will however still be encoded.
       
    -  Assisted-by: Gergely Nagy
    -  Fixes #7400
    -  Closes #7525
    -
    -- [Patrick Monnerat brought this change]
    -
    -  auth: do not append zero-terminator to authorisation id in kerberos
    +  Getting the URL with the CURLU_URLENCODE flag set will percent encode
    +  the host name part.
       
    -  RFC4752 Section 3.1 states "The authorization identity is not terminated
    -  with a zero-valued (%x00) octet". Although a comment in code said it may
    -  be needed anyway, nothing confirms it. In addition, servers may consider
    -  it as part of the identity, causing a failure.
    +  As a bonus, setting the host name part with curl_url_set() no longer
    +  accepts a name that contains space, CR or LF.
       
    -  Closes #7008
    -
    -- [Patrick Monnerat brought this change]
    -
    -  auth: use sasl authzid option in kerberos
    +  Test 1560 has been extended to verify percent encodings.
       
    -  ... instead of deriving it from active ticket.
    -  Closes #7008
    -
    -- [Patrick Monnerat brought this change]
    +  Reported-by: Noam Moshe
    +  Reported-by: Sharon Brizinov
    +  Reported-by: Raul Onitza-Klugman
    +  Reported-by: Kirill Efimov
    +  Fixes #7830
    +  Closes #7834
     
    -  auth: we do not support a security layer after kerberos authentication
    +Marc Hoersken (8 Oct 2021)
    +- CI/makefiles: introduce dedicated test target
       
    -  Closes #7008
    -
    -- [Patrick Monnerat brought this change]
    -
    -  auth: properly handle byte order in kerberos security message
    +  Make it easy to use the same set of test flags
    +  throughout all current and future CI builds.
       
    -  Closes #7008
    +  Reviewed-by: Jay Satiro
    +  
    +  Follow up to #7690
    +  Closes #7785
     
    -- [z2_ brought this change]
    +Daniel Stenberg (8 Oct 2021)
    +- maketgz: redirect updatemanpages.pl output to /dev/null
     
    -  x509asn1: fix heap over-read when parsing x509 certificates
    +- CURLOPT_HTTPHEADER.3: add descripion for specific headers
       
    -  Assisted-by: Patrick Monnerat
    -  Closes #7536
    -
    -- KNOWN_BUGS: Disconnects don't do verbose
    +  Settting Host: or Transfer-Encoding: chunked actually have special
    +  meanings to libcurl. This change tries to document them
       
    -  Closes #6995
    +  Closes #7829
     
    -- mailmap: fixup Michał Antoniak
    +- c-hyper: use hyper_request_set_uri_parts to make h2 better
    +  
    +  and make sure to not send Host: over h2.
    +  
    +  Fixes #7679
    +  Reported-by: David Cook
    +  Closes #7827
     
    -- [Michał Antoniak brought this change]
    +- [Michael Afanasiev brought this change]
     
    -  build: fix compiler warnings
    -  
    -  For when CURL_DISABLE_VERBOSE_STRINGS and DEBUGBUILD flags are both
    -  active.
    +  curl-openssl.m4: modify library order for openssl linking
       
    -  - socks.c : warning C4100: 'lineno': unreferenced formal parameter
    -    (co-authored by Daniel Stenberg)
    +  lcrypto may depend on lz, and configure corrently fails with when
    +  statically linking as the order is "-lz -lcrypto". This commit switches
    +  the order to "-lcrypto -lz".
       
    -  - mbedtls.c: warning C4189: 'port': local variable is initialized but
    -    not referenced
    +  Closes #7826
    +
    +Marcel Raad (7 Oct 2021)
    +- sha256: use high-level EVP interface for OpenSSL
       
    -  - schannel.c: warning C4189: 'hostname': local variable is initialized
    -    but not referenced
    +  Available since OpenSSL 0.9.7. The low-level SHA256 interface is
    +  deprecated in OpenSSL v3, and its usage was discouraged even before.
       
    -  Cloes #7528
    -
    -- [Gleb Ivanovsky brought this change]
    +  Closes https://github.com/curl/curl/pull/7808
     
    -  CODE_STYLE-md: fix bold font style
    +- curl_ntlm_core: use OpenSSL only if DES is available
       
    -  Markdown gets confused with abundance of asterisks, so use underscores
    -  instead.
    +  This selects another SSL backend then if available, or otherwise at
    +  least gives a meaningful error message.
       
    -  Reviewed-by: Daniel Gustafsson
    -  Closes #7569
    -
    -- [Gleb Ivanovsky brought this change]
    +  Closes https://github.com/curl/curl/pull/7808
     
    -  CODE_STYLE-md: add missing comma
    +- md5: fix compilation with OpenSSL 3.0 API
       
    -  Reviewed-by: Daniel Gustafsson
    -  Closes #7570
    +  Only use OpenSSL's MD5 code if it's available.
    +  
    +  Also fix wolfSSL build with `NO_MD5`, in which case neither the
    +  wolfSSL/OpenSSL implementation nor the fallback implementation was
    +  used.
    +  
    +  Closes https://github.com/curl/curl/pull/7808
     
    -- [Daniel Gustafsson brought this change]
    +Daniel Stenberg (7 Oct 2021)
    +- print_category: printf %*s needs an int argument
    +  
    +  ... not a size_t!
    +  
    +  Detected by Coverity: CID 1492331.
    +  Closes #7823
     
    -  examples/ephiperfifo.c: simplify signal handler
    +Jay Satiro (7 Oct 2021)
    +- version_win32: use actual version instead of manifested version
       
    -  The signal handler registered for SIGINT is only handling SIGINT
    -  so there isn't much need for inspecting the signo.  While there,
    -  rename the handler to be more specific.
    +  - Use RtlVerifyVersionInfo instead of VerifyVersionInfo, when possible.
       
    -  g_should_exit should really be of sig_atomic_t type, but relying
    -  on autoconf in the examples seems like a bad idea so keep that
    -  for now.
    +  Later versions of Windows have normal version functions that compare and
    +  return versions based on the way the application is manifested, instead
    +  of the actual version of Windows the application is running on. We
    +  prefer the actual version of Windows so we'll now call the Rtl variant
    +  of version functions (RtlVerifyVersionInfo) which does a proper
    +  comparison of the actual version.
       
    -  Reviewed-by: Daniel Stenberg
    -  Closes #7310
    -
    -- c-hyper: initial step for 100-continue support
    +  Reported-by: Wyatt O'Day
       
    -  Enabled test 154
    +  Ref: https://github.com/curl/curl/pull/7727
       
    -  Closes #7568
    +  Fixes https://github.com/curl/curl/issues/7742
    +  Closes https://github.com/curl/curl/pull/7810
     
    -- [Ikko Ashimine brought this change]
    +Daniel Stenberg (6 Oct 2021)
    +- RELEASE-NOTES: synced
     
    -  vtls: fix typo in schannel_verify.c
    +- http: fix Basic auth with empty name field in URL
       
    -  occurence -> occurrence
    +  Add test 367 to verify.
       
    -  Closes #7566
    +  Reported-by: Rick Lane
    +  Fixes #7819
    +  Closes #7820
     
    -- [Emil Engler brought this change]
    +- [Jeffrey Tolar brought this change]
     
    -  curl_url_get.3: clarify about path and query
    +  CURLOPT_MAXLIFETIME_CONN: maximum allowed lifetime for conn reuse
       
    -  The current man-page lacks some details regarding the obtained path and
    -  query.
    +  ... and close connections that are too old instead of reusing them.
       
    -  Closes #7563
    -
    -- c-hyper: fix header value passed to debug callback
    +  By default, this behavior is disabled.
       
    -  Closes #7567
    +  Bug: https://curl.se/mail/lib-2021-09/0058.html
    +  Closes #7751
     
    -Viktor Szakats (12 Aug 2021)
    -- cleanup: URL updates
    +Daniel Gustafsson (6 Oct 2021)
    +- docs/examples: add missing binaries to gitignore
       
    -  - replace broken URL with the one it was most probably pointing to
    -    when added (lib/tftp.c)
    -  - replace broken URL with archive.org link (lib/curl_ntlm_wb.c)
    -  - delete unnecessary protocol designator from archive.org URL
    -    (docs/BINDINGS.md)
    +  Commit f65d7889b added getreferrer, and commit ae8e11ed5 multi-legacy,
    +  both of which missed adding .gitignore clauses for the built binaries.
       
    -  Closes #7562
    +  Closes #7817
    +  Reviewed-by: Daniel Stenberg 
     
    -Daniel Stenberg (12 Aug 2021)
    -- [April King brought this change]
    +Daniel Stenberg (5 Oct 2021)
    +- [Josip Medved brought this change]
     
    -  DEPRECATE.md: linkify curl-library mailing list
    +  HTTP3: fix the HTTP/3 Explained book link
       
    -  Closes #7561
    -
    -- [Barry Pollard brought this change]
    +  Closes #7813
     
    -  output.d: add method to suppress response bodies
    -  
    -  Closes #7560
    +- [Lucas Holt brought this change]
     
    -- TODO: remove 'c-ares deviates on http://1346569778'
    +  misc: fix a few issues on MidnightBSD
       
    -  Fixed since 56a037cc0ad1b2 (7.77.0)
    +  Closes #7812
     
    -- [Colin O'Dell brought this change]
    +Daniel Gustafsson (4 Oct 2021)
    +- [8U61ife brought this change]
     
    -  BINDINGS.md: update links to use https where available
    +  tool_main: fix typo in comment
       
    -  Closes #7558
    +  Closes: #7811
    +  Reviewed-by: Daniel Gustafsson 
     
    -- asyn-ares.c: move all version number checks to the top
    -  
    -  ... and use #ifdef [feature] in the code as per our guidelines.
    +Daniel Stenberg (4 Oct 2021)
    +- [Ryan Mast brought this change]
     
    -- ares: use ares_getaddrinfo()
    -  
    -  ares_getaddrinfo() is the getaddrinfo() cloned provided by c-ares, introduced
    -  in version 1.16.0.
    +  BINDINGS: URL updates
       
    -  With older c-ares versions, curl invokes ares_gethostbyname() twice - once for
    -  IPv4 and once for IPv6 to resolve both addresses, and then combines the
    -  returned results.
    +  For cpr, BBHTTP, Eiffel, Harbour, Haskell, Mono, and Rust
       
    -  Reported-by: jjandesmet
    -  Fixes #7364
    -  Closes #7552
    -
    -- [Tatsuhiro Tsujikawa brought this change]
    +  Closes #7809
     
    -  ngtcp2: utilize crypto API functions to simplify
    +- scripts/delta: hide a git error message we don't care about
       
    -  Closes #7551
    +  fatal: path 'src/tool_listhelp.c' exists on disk, but not in [tag]
     
    -- [megatronking brought this change]
    +- [Patrick Monnerat brought this change]
     
    -  ngtcp2: reset the oustanding send buffer again when drained
    +  sasl: binary messages
       
    -  Closes #7538
    -
    -Michael Kaufmann (10 Aug 2021)
    -- progress: fix a compile warning on some systems
    +  Capabilities of sasl module are extended to exchange messages in binary
    +  as an alternative to base64.
       
    -  lib/progress.c:380:40: warning: conversion to 'long double' from
    -  'curl_off_t {aka long long int}' may alter its value [-Wconversion]
    +  If http authentication flags have been set, those are used as sasl
    +  default preferred mechanisms.
       
    -  Closes #7549
    +  Closes #6930
     
    -Daniel Stenberg (10 Aug 2021)
    -- RELEASE-NOTES: synced
    +- [Hayden Roche brought this change]
     
    -- http: consider cookies over localhost to be secure
    +  wolfssl: use for SHA256, MD4, MD5, and setting DES odd parity
       
    -  Updated test31.
    -  Added test 392 to verify secure cookies used for http://localhost
    +  Prior to this commit, OpenSSL could be used for all these functions, but
    +  not wolfSSL. This commit makes it so wolfSSL will be used if USE_WOLFSSL
    +  is defined.
       
    -  Reviewed-by: Daniel Gustafsson
    -  Fixes #6733
    -  Closes #7263
    +  Closes #7806
     
    -- TODO: erase secrets from heap/stack after use
    +- scripts/delta: count command line options in the new file
       
    -  Closes #7268
    +  ... which makes the shown delta number wrong until next release.
     
    -Jay Satiro (10 Aug 2021)
    -- hostip: Make Curl_ipv6works function independent of getaddrinfo
    -  
    -  - Do not assume IPv6 is not working when getaddrinfo is not present.
    +- RELEASE-NOTES: synced
    +
    +- print_category: print help descriptions aligned
       
    -  The check to see if IPv6 actually works is now independent of whether
    -  there is any resolver that can potentially resolve a hostname to IPv6.
    +  Adjust the description position to make an aligned column when doing
    +  help listings, which is more pleasing to the eye.
       
    -  Prior to this change if getaddrinfo() was not found at compile time then
    -  Curl_ipv6works() would be defined as a macro that returns FALSE.
    +  Suggested-by: Gisle Vanem
    +  Closes #7792
    +
    +- lib/mk-ca-bundle.pl: skip certs passed Not Valid After date
       
    -  When getaddrinfo is not found then libcurl is built with CURLRES_IPV4
    -  defined instead of CURLRES_IPV6, meaning that it cannot do IPv6 lookups
    -  in the traditional way. With this commit if libcurl is built with IPv6
    -  support (ENABLE_IPV6) but without getaddrinfo (CURLRES_IPV6), and the
    -  IPv6 stack is actually working, then it is possible for libcurl to
    -  resolve IPv6 addresses by using DoH.
    +  With this change applied, the now expired 'DST Root CA X3' cert will no
    +  longer be included in the output.
       
    -  Ref: https://github.com/curl/curl/issues/7483#issuecomment-890765378
    +  Details: https://letsencrypt.org/docs/dst-root-ca-x3-expiration-september-2021/
       
    -  Closes https://github.com/curl/curl/pull/7529
    +  Closes #7801
     
    -- test1565: fix windows build errors
    +- tool_listhelp: easier to generate with gen.pl
       
    -  - Use our wait_ms() instead of sleep() since Windows doesn't have the
    -    latter.
    +  tool_listhelp.c is now a separate file with only the command line --help
    +  output, exactly as generated by gen.pl. This makes it easier to generate
    +  updates according to what's in the docs/cmdline-opts docs.
       
    -  - Use a separate variable to keep track of whether the pthread_t thread
    -    id is valid.
    +    cd $srcroot/docs/cmdline-opts
    +    ./gen.pl listhelp *.d > $srcroot/src/tool_listhelp.c
       
    -  On Windows pthread_t is not an integer type. pthread offers no macro for
    -  invalid pthread_t thread id, so validity is kept track of separately.
    +  With a configure build, this also works:
       
    -  Closes https://github.com/curl/curl/pull/7527
    +    make -C src listhelp
    +  
    +  Closes #7787
     
    -- [Jeremy Falcon brought this change]
    +- [Anthony Hu brought this change]
     
    -  winbuild/README.md: clarify GEN_PDB option
    +  wolfssl: allow setting of groups/curves
       
    -  - Document that GEN_PDB option creates an external database.
    +  In particular, the quantum safe KEM and hybrid curves if wolfSSL is
    +  built to support them.
       
    -  Ref: https://github.com/curl/curl/issues/7502
    +  Closes #7728
     
    -Daniel Stenberg (9 Aug 2021)
    -- [Tatsuhiro Tsujikawa brought this change]
    +- [Jan Mazur brought this change]
     
    -  ngtcp2: replace deprecated functions with nghttp3_conn_shutdown_stream_read
    +  connnect: use sysaddr_un fron sys/un.h or custom-defined for windows
       
    -  Closes #7546
    +  Closes #7737
     
    -- [Tatsuhiro Tsujikawa brought this change]
    +Jay Satiro (30 Sep 2021)
    +- [Rikard Falkeborn brought this change]
     
    -  ngtcp2: rework the return value handling of ngtcp2_conn_writev_stream
    +  hostip: Move allocation to clarify there is no memleak
       
    -  Rework the return value handling of ngtcp2_conn_writev_stream and treat
    -  NGTCP2_ERR_STREAM_SHUT_WR separately.
    +  By just glancing at the code, it looks like there is a memleak if the
    +  call to Curl_inet_pton() fails. Looking closer, it is clear that the
    +  call to Curl_inet_pton() can not fail, so the code will never leak
    +  memory. However, we can make this obvious by moving the allocation
    +  after the if-statement.
       
    -  Closes #7546
    +  Closes https://github.com/curl/curl/pull/7796
     
    -- configure: error out if both ngtcp2 and quiche are specified
    +Daniel Stenberg (30 Sep 2021)
    +- gen.pl: make the output date format work better
       
    -  Reported-by: Vincent Grande
    -  See #7539
    -  Closes #7545
    -
    -- [Jeff Mears brought this change]
    -
    -  easy: use a custom implementation of wcsdup on Windows
    +  Follow-up to 15910dfd143dd
       
    -  ... so that malloc/free overrides from curl_global_init are used for
    -  wcsdup correctly.
    +  The previous strftime format used didn't work correctly on Windows, so
    +  change to %B %d %Y which today looks like "September 29 2021".
       
    -  Closes #7540
    +  Reported-by: Gisle Vanem
    +  Bug: #7782
    +  Closes #7793
     
    -- zuul: add an mbedtls3 CI job
    +- typecheck-gcc.h: add CURLOPT_PREREQDATA awareness
       
    -  Closes #7544
    -
    -- [Benau brought this change]
    -
    -  mbedTLS: initial 3.0.0 support
    +  Follow-up to a517378de58358a
       
    -  Closes #7428
    -
    -- RELEASE-NOTES: synced
    -
    -- configure.ac: revert bad nghttp2 library detection improvements
    +  To make test 1912 happy again
       
    -  This reverts commit b4b34db65f9f8, 673753344c5f and 29c7cf79e8b.
    +  Closes #7799
    +
    +Marcel Raad (29 Sep 2021)
    +- configure: remove `HAVE_WINSOCK_H` definition
       
    -  The logic is now back to assuming that the nghttp2 lib is called nghttp2 and
    -  nothing else.
    +  It's not used anymore.
       
    -  Reported-by: Rui Pinheiro
    -  Reported-by: Alex Crichton
    -  Fixes #7514
    -  Closes #7515
    +  Closes https://github.com/curl/curl/pull/7795
     
    -- happy-eyeballs-timeout-ms.d: polish the wording
    +- CMake: remove `HAVE_WINSOCK_H` definition
       
    -  Reported-by: Josh Soref
    -  Fixes #7433
    -  Closes #7542
    -
    -- [modbw brought this change]
    -
    -  mbedtls_threadlock: fix unused variable warning
    +  It's not used anymore.
       
    -  Closes #7393
    -
    -- [Tatsuhiro Tsujikawa brought this change]
    +  Closes https://github.com/curl/curl/pull/7795
     
    -  ngtcp2: compile with the latest ngtcp2 and nghttp3
    +- config: remove `HAVE_WINSOCK_H` definition
       
    -  Closes #7541
    +  It's not used anymore.
    +  
    +  Closes https://github.com/curl/curl/pull/7795
     
    -Marc Hoersken (31 Jul 2021)
    -- CI/cirrus: reduce compile time with increased parallism
    +- lib: remove `HAVE_WINSOCK_H` usage
       
    -  Cirrus CI VMs have 2 CPUs, let's use them also for Windows builds.
    +  WinSock v1 is not supported anymore. Exclusively use `HAVE_WINSOCK2_H`
    +  instead.
       
    -  Reviewed-by: Daniel Stenberg
    -  Closes #7505
    -
    -Daniel Stenberg (30 Jul 2021)
    -- [Bin Lan brought this change]
    +  Closes https://github.com/curl/curl/pull/7795
     
    -  tool/tests: fix potential year 2038 issues
    +Daniel Stenberg (29 Sep 2021)
    +- easyoptions: add the two new PRE* options
       
    -  The length of 'long' in a 32-bit system is 32 bits, which cannot be used
    -  to save timestamps after 2038. Most operating systems have extended
    -  time_t to 64 bits.
    +  Follow-up to a517378de58358a
       
    -  Remove the castings to long.
    -  
    -  Closes #7466
    -
    -- compressed.d: it's a request, not an order
    -  
    -  Clarified
    -  
    -  Reported-by: Dan Jacobson
    -  Reviewed-by: Daniel Gustafsson
    -  Fixes #7516
    -  Closes #7517
    -
    -- [Bernhard M. Wiedemann brought this change]
    -
    -  tests: make three tests pass until 2037
    -  
    -  after 2038 something in test1915 fails on 32-bit OSes
    +  Also fix optiontable.pl to do the correct remainder on the entry.
       
    -  Closes #7512
    +  Reported-by: Gisle Vanem
    +  Bug: https://github.com/curl/curl/commit/a517378de58358a85b7cfe9efecb56051268f629#commitcomment-57224830
    +  Closes #7791
     
    -Daniel Gustafsson (30 Jul 2021)
    -- connect: remove superfluous conditional
    +- Revert "build: remove checks for WinSock 1"
       
    -  Commit dbd16c3e2 cleaned up the logic for traversing the addrinfos,
    -  but the move left a conditional on ai which no longer is needed as
    -  the while loop reevaluation will cover it.
    +  Due to CI issues
       
    -  Closes #7511
    -  Reviewed-by: Carlo Marcelo Arenas Belón
    -  Reviewed-by: Daniel Stenberg 
    -
    -Daniel Stenberg (29 Jul 2021)
    -- RELEASE-NOTES: synced
    +  This reverts commit c2ea04f92b00b6271627cb218647527b5a50f2fc.
       
    -  and bump curlver to 7.79.0 for next release
    +  Closes #7790
     
    -Marc Hoersken (29 Jul 2021)
    -- tests/*server.py: remove pidfile on server termination
    -  
    -  Avoid pidfile leaking/laying around after server already exited.
    +Daniel Gustafsson (29 Sep 2021)
    +- lib: avoid fallthrough cases in switch statements
       
    -  Reviewed-by: Daniel Stenberg
    -  Closes #7506
    -
    -Daniel Gustafsson (27 Jul 2021)
    -- tool_main: fix typo in comment
    +  Commit b5a434f7f0ee4d64857f8592eced5b9007d83620 inhibits the warning
    +  on implicit fallthrough cases, since the current coding of indicating
    +  fallthrough with comments is falling out of fashion with new compilers.
    +  This attempts to make the issue smaller by rewriting fallthroughs to no
    +  longer fallthrough, via either breaking the cases or turning switch
    +  statements into if statements.
       
    -  The referred to library is NSPR, so fix the switched around characters.
    -
    -Daniel Stenberg (28 Jul 2021)
    -- [Aleksandr Krotov brought this change]
    -
    -  bearssl: support CURLOPT_CAINFO_BLOB
    +    lib/content_encoding.c: the fallthrough codepath is simply copied
    +      into the case as it's a single line.
    +    lib/http_ntlm.c: the fallthrough case skips a state in the state-
    +      machine and fast-forwards to NTLMSTATE_LAST. Do this before the
    +      switch statement instead to set up the states that we actually
    +      want.
    +    lib/http_proxy.c: the fallthrough is just falling into exiting the
    +      switch statement which can be done easily enough in the case.
    +    lib/mime.c: switch statement rewritten as if statement.
    +    lib/pop3.c: the fallthrough case skips to the next state in the
    +      statemachine, do this explicitly instead.
    +    lib/urlapi.c: switch statement rewritten as if statement.
    +    lib/vssh/wolfssh.c: the fallthrough cases fast-forwards the state
    +      machine, do this by running another iteration of the switch
    +      statement instead.
    +    lib/vtls/gtls.c: switch statement rewritten as if statement.
    +    lib/vtls/nss.c: the fallthrough codepath is simply copied into the
    +      case as it's a single line. Also twiddle a comment to not be
    +      inside a non-brace if statement.
       
    -  Closes #7468
    +  Closes: #7322
    +  See-also: #7295
    +  Reviewed-by: Daniel Stenberg 
     
    -- curl.1: mention "global" flags
    +Marcel Raad (28 Sep 2021)
    +- config-win32ce: enable WinSock 2
       
    -  Mention options that are "global". A global command line option is one
    -  that doesn't get reset at --next uses and therefore don't need to be
    -  used again.
    +  WinSock 2.2 is supported by Windows CE .NET 4.1 (from 2002, out of
    +  support since 2013).
       
    -  Reported-by: Josh Soref
    +  Ref: https://docs.microsoft.com/en-us/previous-versions/windows/embedded/ms899586(v=msdn.10)
       
    -  Fixes #7457
    -  Closes #7510
    +  Closes https://github.com/curl/curl/pull/7778
     
    -- CURLOPT_DOH_URL.3: CURLOPT_OPENSOCKETFUNCTION is not inherited
    +- externalsocket: use WinSock 2.2
       
    -  Reported-by: Daniel Woelfel
    -  Fixes #7441
    -  Closes #7509
    -
    -- KNOWN_BUGS: add more HTTP/3 problems
    +  That's the only version we support.
       
    -  Closes #7351
    -  Closes #7339
    -  Closes #7125
    +  Closes https://github.com/curl/curl/pull/7778
     
    -Marc Hoersken (27 Jul 2021)
    -- CI/azure: reduce compile time with increased parallism
    +- build: remove checks for WinSock 1
       
    -  Azure Pipelines CI VMs have 2 CPUs, let's use them.
    +  It's not supported anymore.
       
    -  Closes #7489
    -
    -Jay Satiro (27 Jul 2021)
    -- [Josh Soref brought this change]
    +  Closes https://github.com/curl/curl/pull/7778
     
    -  docs: fix grammar
    +Daniel Stenberg (28 Sep 2021)
    +- scripts/copyright: .muse is .lift now
       
    -  Fixes https://github.com/curl/curl/issues/7444
    -  Fixes https://github.com/curl/curl/issues/7451
    -  Fixes https://github.com/curl/curl/issues/7465
    -  Closes https://github.com/curl/curl/pull/7495
    +  And update 5 files with old copyright year range
     
    -- mail-rcpt.d: fix grammar
    -  
    -  Remove confusing sentence that says to specify an e-mail address for
    -  mail transfer, since that's implied.
    +- cmdline-opts: made the 'Added:' field mandatory
       
    -  Reported-by: Josh Soref
    +  Since "too old" versions are no longer included in the generated man
    +  page, this field is now mandatory so that it won't be forgotten and then
    +  not included in the documentation.
       
    -  Fixes https://github.com/curl/curl/issues/7452
    -  Closes https://github.com/curl/curl/pull/7495
    +  Closes #7786
     
    -Daniel Stenberg (27 Jul 2021)
    -- c-hyper: remove the hyper_executor_poll() loop from Curl_http
    +- curl.1: remove mentions of really old version changes
       
    -  1. it's superfluous
    -  2. it didn't work identically to the Curl_hyper_stream one which could
    -     cause problems like #7486
    +  To make the man page more readable, this change removes all references
    +  to changes in support/versions etc that happened before 7.30.0 from the
    +  curl.1 output file. 7.30.0 was released on Apr 12 2013. This particular
    +  limit is a bit arbitrary but was fairly easy to grep for.
       
    -  Pointed-out-by: David Cook
    -  Closes #7499
    -
    -- curl-openssl.m4: check lib64 for the pkg-config file
    +  It is handled like this: the 'Added' keyword is only used in output if
    +  it refers to 7.30.0 or later. All occurances of "(Added in $VERSION)" in
    +  description will be stripped out if the mentioned $VERSION is from
    +  before 7.30.0. It is therefore important that the "Added in..."
    +  references are always written exactly like that - and on a single line,
    +  not split over two.
       
    -  OpenSSL recently started putting the libs in $prefix/lib64 on 'make
    -  install', so we check that directory for pkg-config data if the 'lib'
    -  check fails.
    +  This change removes about 80 version number references from curl.1, down
    +  to 138 from 218.
       
    -  Closes #7503
    +  Closes #7786
     
    -- CURLOPT_SSL_CTX_*.3: tidy up the example
    -  
    -  Use the proper code style. Don't store return codes that aren't read.
    -  Copy the same example into CURLOPT_SSL_CTX_FUNCTION.3 as well.
    -  
    -  Closes #7500
    +- RELEASE-NOTES: synced
     
    -- example/cookie_interface: fix scan-build printf warning
    +- tool_cb_prg: make resumed upload progress bar show better
       
    -  Follow-up to 4b79c4fb565
    +  This is a regression that was *probably* injected in the larger progress
    +  bar overhaul in 2018.
       
    -  Fixes #7497
    -  Closes #7498
    -
    -- [Josh Soref brought this change]
    +  Reported-by: beslick5 on github
    +  Fixes #7760
    +  Closes #7777
     
    -  limit-rate.d: clarify base unit
    +- gen.pl: insert the current date and version in generated man page
       
    -  Fixes #7439
    -  Closes #7494
    -
    -- [Carlo Marcelo Arenas Belón brought this change]
    +  Reported-by: Gisle Vanem
    +  Ref: #7780
    +  Closes #7782
     
    -  examples/cookie_interface: avoid printfing time_t directly
    -  
    -  time_t representation is undefined and varies on bitsize and signedness,
    -  and as of C11 could be even non integer.
    -  
    -  instead of casting to unsigned long (which would truncate in systems
    -  with a 32bit long after 2106) use difftime to get the elapsed time as a
    -  double and print that (without decimals) instead.
    +- NTLM: use DES_set_key_unchecked with OpenSSL
       
    -  alternatively a cast to curl_off_t and its corresponding print
    -  formatting could have been used (at least in POSIX) but portability and
    -  curl agnostic code was prioritized.
    +  ... as the previously used function DES_set_key() will in some cases
    +  reject using a key that it deems "weak" which will cause curl to
    +  continue using the unitialized buffer content as key instead.
       
    -  Closes #7490
    +  Assisted-by: Harry Sintonen
    +  Fixes #7779
    +  Closes #7781
     
    -Marc Hoersken (25 Jul 2021)
    -- tests/servers: remove obsolete pid variable
    +Marc Hoersken (27 Sep 2021)
    +- CI: align make and test flags in various config files
       
    -  Variable is not used since pidfile handling moved to util.[ch]
    +  1. Use Makefile target to run tests in autotools builds on AppVeyor.
    +  2. Disable testing of SCP protocol on native Windows environments.
    +  3. Remove redundant parameters -a -p from target test-nonflaky.
    +  4. Don't use -vc parameter which is reserved for debugging.
       
    -  Reviewed-by: Jay Satiro
    -  Closes #7482
    +  Replaces #7591
    +  Closes #7690
     
    -- tests/servers: use our platform-aware pid for server verification
    -  
    -  The pid used for server verification is later stored as pid2 in
    -  the hash of running test servers and therefore used for shutdown.
    -  
    -  The pid used for shutdown must be the platform-aware (Win32) pid
    -  to avoid leaking test servers while running them using Cygwin/msys.
    -  
    -  Reviewed-by: Jay Satiro
    -  Closes #7481
    +Daniel Stenberg (27 Sep 2021)
    +- mailmap: unify Max!
     
    -- tests/runtests.pl: cleanup copy&paste mistakes and unused code
    -  
    -  Reviewed-by: Jay Satiro
    -  Part of #7481
    +- [Max Dymond brought this change]
     
    -Daniel Stenberg (25 Jul 2021)
    -- RELEASE-NOTES: synced
    +  CURLOPT_PREREQFUNCTION: add new callback
       
    -  bumped to 7.78.1 for next release
    -
    -- http_proxy: clear 'sending' when the outgoing request is sent
    +  Triggered before a request is made but after a connection is set up
       
    -  ... so that Curl_connect_getsock() will know how to wait for the socket
    -  to become readable and not writable after the entire CONNECT request has
    -  been issued.
    +  Changes:
       
    -  Regression added in 7.77.0
    +  - callback: Update docs and callback for pre-request callback
    +  - Add documentation for CURLOPT_PREREQDATA and CURLOPT_PREREQFUNCTION,
    +  - Add redirect test and callback failure test
    +  - Note that the function may be called multiple times on a redirection
    +  - Disable new 2086 test due to Windows weirdness
       
    -  Reported-by: zloi-user on github
    -  Assisted-by: Jay Satiro
    -  Fixes #7155
    -  Closes #7484
    -
    -Jay Satiro (25 Jul 2021)
    -- [Josh Soref brought this change]
    +  Closes #7477
     
    -  openssl: fix grammar
    +- KNOWN_BUGS: HTTP/2 connections through HTTPS proxy frequently stall
       
    -  Closes https://github.com/curl/curl/pull/7480
    +  Closes #6936
     
    -- configure.ac: tweak nghttp2 library name fix again
    -  
    -  - Change extraction to handle multiple library names returned by
    -    pkg-config (eg a possible scenario with pkg-config --static).
    -  
    -  Ref: https://github.com/curl/curl/pull/7472
    +- TODO: make configure use --cache-file more and better
       
    -  Closes https://github.com/curl/curl/pull/7485
    +  Closes #7753
     
    -Dan Fandrich (23 Jul 2021)
    -- Get rid of the unused HAVE_SIG_ATOMIC_T et. al.
    -  
    -  It was added in 2006 but I see no evidence it was ever used.
    +- [Sergey Markelov brought this change]
     
    -Jay Satiro (23 Jul 2021)
    -- docs: change max-filesize caveat again
    -  
    -  - Add protocols field to max-filesize.d.
    -  
    -  - Revert wording on unknown file size caveat and do not discuss specific
    -    protocols in that section.
    +  urlapi: support UNC paths in file: URLs on Windows
       
    -  Partial revert of ecf0225. All max-filesize options now have the list of
    -  protocols and it's clearer just to have that list without discussing
    -  specific protocols in the caveat.
    +  - file://host.name/path/file.txt is a valid UNC path
    +    \\host.name\path\files.txt to a non-local file transformed into URI
    +    (RFC 8089 Appendix E.3)
       
    -  Reported-by: Josh Soref
    +  - UNC paths on other OSs must be smb: URLs
       
    -  Ref: https://github.com/curl/curl/issues/7453#issuecomment-884128762
    +  Closes #7366
     
    -Daniel Stenberg (22 Jul 2021)
    -- [Christian Weisgerber brought this change]
    +- [Gleb Ivanovsky brought this change]
     
    -  configure: tweak nghttp2 library name fix
    -  
    -  commit 29c7cf79e8b44cf (shipped in 7.78.0) introduced a problem by
    -  assuming that LIB_H2 does not have any leading whitespace.  At least
    -  OpenBSD's native pkg-config can produce such whitespace, though:
    -  
    -      $ pkg-config --libs-only-l libnghttp2
    -       -lnghttp2
    +  urlapi: add curl_url_strerror()
       
    -  As a result, the configure check for libnghttp2 will erroneously fail.
    +  Add curl_url_strerror() to convert CURLUcode into readable string and
    +  facilitate easier troubleshooting in programs using URL API.
    +  Extend CURLUcode with CURLU_LAST for iteration in unit tests.
    +  Update man pages with a mention of new function.
    +  Update example code and tests with new functionality where it fits.
       
    -  Bug: https://curl.se/mail/lib-2021-07/0050.html
    -  Closes #7472
    +  Closes #7605
     
    -- [Bastian Krause brought this change]
    +- RELEASE-NOTES: synced
     
    -  docs/MQTT: update state of username/password support
    +- [Mats Lindestam brought this change]
    +
    +  libssh2: add SHA256 fingerprint support
       
    -  PR #7243 implemented username/password support for MQTT, so let's drop
    -  these items from the caveats.
    +  Added support for SHA256 fingerprint in command line curl and in
    +  libcurl.
       
    -  Signed-off-by: Bastian Krause 
    +  Closes #7646
    +
    +- libcurl.rc: switch out the copyright symbol for plain ASCII
       
    -  Closes #7474
    +  Reported-by: Vitaly Varyvdin
    +  Assisted-by: Viktor Szakats
    +  Fixes #7765
    +  Closes #7776
     
    -- [Oleg Pudeyev brought this change]
    +- [Jun-ya Kato brought this change]
     
    -  CURLMOPT_TIMERFUNCTION.3: remove misplaced "time"
    +  ngtcp2: fix QUIC transport parameter version
       
    -  Closes #7470
    +  fix inappropriate version setting for QUIC transport parameters.
    +  this patch keeps curl with ngtcp2 uses QUIC draft version (h3-29).
    +  
    +  Closes #7771
     
    -Version 7.78.0 (21 Jul 2021)
    +- examples/imap-append: fix end-of-data check
    +  
    +  Reported-by: Alexander Chuykov
    +  Fixes #7774
    +  Closes #7775
     
    -Daniel Stenberg (21 Jul 2021)
    -- RELEASE-NOTES: synced
    +Michael Kaufmann (24 Sep 2021)
    +- vtls: Fix a memory leak if an SSL session cannot be added to the cache
       
    -  curl 7.78.0 release
    +  On connection shutdown, a new TLS session ticket may arrive after the
    +  SSL session cache has already been destructed. In this case, the new
    +  SSL session cannot be added to the SSL session cache.
    +  
    +  The callers of Curl_ssl_addsessionid() need to know whether the SSL
    +  session has been added to the cache. If it has not been added, the
    +  reference counter of the SSL session must not be incremented, or memory
    +  used by the SSL session must be freed. This is now possible with the new
    +  output parameter "added" of Curl_ssl_addsessionid().
    +  
    +  Fixes #7683
    +  Closes #7752
     
    -- winbuild/MakefileBuild.vc: bump copyright year
    +Daniel Stenberg (24 Sep 2021)
    +- [Momoka Yamamoto brought this change]
     
    -Jay Satiro (21 Jul 2021)
    -- docs: mention max-filesize options also apply to MQTT transfers
    -  
    -  Also make it clearer that the caveat 'if the file size is unknown it
    -  the option will have no effect' may apply to protocols other than FTP
    -  and HTTP.
    +  HTTP3.md: use 'autoreconf -fi' instead of buildconf
       
    -  Reported-by: Josh Soref
    +  buildconf is not used since #5853
       
    -  Fixes https://github.com/curl/curl/issues/7453
    +  Closes #7746
     
    -- [Josh Soref brought this change]
    +- GIT-INFO: rephrase to adapt to s/buildconf/autoreconf
     
    -  docs/cmdline: fix grammar and typos
    +- [h1zzz brought this change]
     
    -- [Josh Soref brought this change]
    +  llist: remove redundant code, branch will not be executed
    +  
    +  Closes #7770
     
    -  dump-header.d: Drop suggestion to use for cookie storage
    +- [tlahn brought this change]
    +
    +  HTTP-COOKIES.md: remove duplicate 'each'
       
    -  Since --cookie-jar is the preferred way to store cookies, no longer
    -  suggest using --dump-header to do so.
    +  Closes #7772
    +
    +Jay Satiro (24 Sep 2021)
    +- [Joel Depooter brought this change]
    +
    +  libssh2: Get the version at runtime if possible
       
    -  Co-authored-by: Daniel Stenberg
    +  Previously this code used a compile time constant, meaning that libcurl
    +  always reported the libssh2 version that libcurl was built with. This
    +  could differ from the libssh2 version actually being used. The new code
    +  uses the CURL_LIBSSH2_VERSION macro, which is defined in ssh.h. The
    +  macro calls the libssh2_version function if it is available, otherwise
    +  it falls back to the compile time version.
       
    -  Closes https://github.com/curl/curl/issues/7414
    +  Closes https://github.com/curl/curl/pull/7768
     
    -- [Josh Soref brought this change]
    +- [Joel Depooter brought this change]
     
    -  doc/cmdline: fix grammar and typos
    +  schannel: fix typo
       
    -  Closes https://github.com/curl/curl/pull/7454
    -  Closes https://github.com/curl/curl/pull/7455
    -  Closes https://github.com/curl/curl/pull/7456
    -  Closes https://github.com/curl/curl/pull/7459
    -  Closes https://github.com/curl/curl/pull/7460
    -  Closes https://github.com/curl/curl/pull/7461
    -  Closes https://github.com/curl/curl/pull/7462
    -  Closes https://github.com/curl/curl/pull/7463
    +  Closes https://github.com/curl/curl/pull/7769
     
    -Daniel Stenberg (20 Jul 2021)
    -- vtls: fix connection reuse checks for issuer cert and case sensitivity
    +Daniel Stenberg (23 Sep 2021)
    +- cmake: with OpenSSL, define OPENSSL_SUPPRESS_DEPRECATED
       
    -  CVE-2021-22924
    +  To avoid the "... is deprecated" warnings brought by OpenSSL v3.
    +  (We need to address the underlying code at some point of course.)
       
    -  Reported-by: Harry Sintonen
    -  Bug: https://curl.se/docs/CVE-2021-22924.html
    +  Assisted-by: Jakub Zakrzewski
    +  Closes #7767
     
    -- sectransp: check for client certs by name first, then file
    +- curl-openssl: pass argument to sed single-quoted
       
    -  CVE-2021-22926
    +  ... instead of using an escaped double-quote. This is an attempt to make
    +  this work better with ksh that otherwise would insist on a double
    +  escape!
       
    -  Bug: https://curl.se/docs/CVE-2021-22926.html
    +  Reported-by: Randall S. Becker
    +  Fixes #7758
    +  Closes #7764
    +
    +- RELEASE-NOTES: synced
       
    -  Assisted-by: Daniel Gustafsson
    -  Reported-by: Harry Sintonen
    +  Bumped curlver to 7.80.0-dev
     
    -- telnet: fix option parser to not send uninitialized contents
    +- [a1346054 brought this change]
    +
    +  misc: fix typos in docs and comments
       
    -  CVS-2021-22925
    +  No user facing output from curl/libcurl is changed by this, just
    +  comments.
       
    -  Reported-by: Red Hat Product Security
    -  Bug: https://curl.se/docs/CVE-2021-22925.html
    +  Closes #7747
     
    -Jay Satiro (20 Jul 2021)
    -- connect: fix wrong format specifier in connect error string
    +- [Thomas M. DuBuisson brought this change]
    +
    +  ci: update Lift config to match requirements of curl build
       
    -  0842175 (not in any release) used the wrong format specifier (long int)
    -  for timediff_t. On an OS such as Windows libcurl's timediff_t (usually
    -  64-bit) is bigger than long int (32-bit). In 32-bit Windows builds the
    -  upper 32-bits of the timediff_t were erroneously then used by the next
    -  format specifier. Usually since the timeout isn't larger than 32-bits
    -  this would result in null as a pointer to the string with the reason for
    -  the connection failing. On other OSes or maybe other compilers it could
    -  probably result in garbage values (ie crash on deref).
    +  Also renamed Muse -> Lift, the new tool name.
       
    -  Before:
    -  Failed to connect to localhost port 12345 after 1201 ms: (nil)
    +  Closes #7761
    +
    +- [Rikard Falkeborn brought this change]
    +
    +  cleanup: constify unmodified static structs
       
    -  After:
    -  Failed to connect to localhost port 12345 after 1203 ms: Connection refused
    +  Constify a number of static structs that are never modified. Make them
    +  const to show this.
       
    -  Closes https://github.com/curl/curl/pull/7449
    +  Closes #7759
     
    -- winbuild: support alternate nghttp2 static lib name
    +Version 7.79.1 (22 Sep 2021)
    +
    +Daniel Stenberg (22 Sep 2021)
    +- RELEASE-NOTES: synced
       
    -  - Support both nghttp2.lib and nghttp2_static.lib for static nghttp2.
    +  curl 7.79.1 release
    +
    +- THANKS: added names from the 7.79.1 release
    +
    +- test897: verify delivery of IMAP post-body header content
       
    -  nghttp2 briefly changed its static lib name to nghttp2_static, but then
    -  made the _static suffix optional.
    +  The "content" is delivered as "body" by curl, but the envelope continues
    +  after the body and the rest of it should be delivered as header.
       
    -  Ref: https://github.com/nghttp2/nghttp2/pull/1394
    -  Ref: https://github.com/nghttp2/nghttp2/pull/1418
    -  Ref: https://github.com/nghttp2/nghttp2/issues/1466
    +  The IMAP server can now get 'POSTFETCH' set to include more data to
    +  include after the body and test 897 is done to verify that such "extra"
    +  header data is in fact delivered by curl as header.
       
    -  Reported-by: Pierre Yager
    +  Ref: #7284 but fails to reproduce the issue
       
    -  Fixes https://github.com/curl/curl/issues/7446
    -  Closes https://github.com/curl/curl/pull/7447
    -
    -- [Josh Soref brought this change]
    +  Closes #7748
     
    -  docs/cmdline: fix grammar and typos
    +- KNOWN_BUGS: connection migration doesn't work
       
    -  Closes https://github.com/curl/curl/pull/7432
    -  Closes https://github.com/curl/curl/pull/7436
    -  Closes https://github.com/curl/curl/pull/7438
    -  Closes https://github.com/curl/curl/pull/7440
    -  Closes https://github.com/curl/curl/pull/7445
    +  Closes #7695
     
    -- [Josh Soref brought this change]
    +- RELEASE-NOTES: synced
     
    -  delegation.d: mention what happens when used multiple times
    +- http: fix the broken >3 digit response code detection
       
    -  Closes https://github.com/curl/curl/pull/7408
    -
    -- [Josh Soref brought this change]
    -
    -  create-file-mode.d: mention what happens when used multiple times
    +  When the "reason phrase" in the HTTP status line starts with a digit,
    +  that was treated as the forth response code digit and curl would claim
    +  the response to be non-compliant.
       
    -  Closes https://github.com/curl/curl/pull/7407
    -
    -- [Josh Soref brought this change]
    -
    -  config.d: split comments and option-per line
    +  Added test 1466 to verify this case.
       
    -  Closes https://github.com/curl/curl/pull/7405
    -
    -Daniel Stenberg (19 Jul 2021)
    -- misc: copyright year range updates
    -
    -- mailmap: add Tobias and Timur
    -
    -Daniel Gustafsson (18 Jul 2021)
    -- [Josh Soref brought this change]
    +  Regression brought by 5dc594e44f73b17
    +  Reported-by: Glenn de boer
    +  Fixes #7738
    +  Closes #7739
     
    -  docs: spell out directories instead of dirs in create-dirs
    +Jay Satiro (17 Sep 2021)
    +- strerror: use sys_errlist instead of strerror on Windows
       
    -  Write out directories rather than using the dirs abbrevation. Also
    -  use plural form consistently, even if the code in the end might just
    -  create a single directory.
    +  - Change Curl_strerror to use sys_errlist[errnum] instead of strerror to
    +    retrieve the error message on Windows.
       
    -  Closes #7406
    -  Reviewed-by: Daniel Stenberg 
    -  Reviewed-by: Daniel Gustafsson 
    -
    -- [Tobias Nyholm brought this change]
    +  Windows' strerror writes to a static buffer and is not thread-safe.
    +  
    +  Follow-up to 2f0bb86 which removed most instances of strerror in favor
    +  of calling Curl_strerror (which calls strerror_r for other platforms).
    +  
    +  Ref: https://github.com/curl/curl/pull/7685
    +  Ref: https://github.com/curl/curl/commit/2f0bb86
    +  
    +  Closes https://github.com/curl/curl/pull/7735
     
    -  docs: correct spelling errors and a broken link
    +Daniel Stenberg (16 Sep 2021)
    +- dist: provide lib/.checksrc in the tarball
       
    -  Update grammar and spelling in docs and source code comments.
    +  So that debug builds work (checksrc really)
       
    -  Closes: #7427
    -  Reviewed-by: Daniel Stenberg 
    +  Reported-by: Marcel Raad
    +  Reported-by: tawmoto on github
    +  Fixes #7733
    +  Closes #7734
     
    -Marc Hoersken (18 Jul 2021)
    -- CI/cirrus: install impacket from PyPI instead of FreeBSD packages
    +- TODO: Improve documentation about fork safety
       
    -  Availability of impacket as FreeBSD package is too flaky.
    +  Closes #6968
    +
    +- hsts: CURLSTS_FAIL from hsts read callback should fail transfer
       
    -  Stick to legacy version of cryptography which still
    -  supports OpenSSL version 1.0.2 due to FreeBSD 11.
    +  ... and have CURLE_ABORTED_BY_CALLBACK returned.
       
    -  Reviewed-by: Daniel Stenberg
    +  Extended test 1915 to verify.
       
    -  Closes #7418
    +  Reported-by: Jonathan Cardoso
    +  Fixes #7726
    +  Closes #7729
     
    -Daniel Stenberg (18 Jul 2021)
    -- [Josh Soref brought this change]
    +- test1184: disable
    +  
    +  The test should be fine and it works for me repeated when run manually,
    +  but clearly it causes CI failures and it needs more research.
    +  
    +  Reported-by: RiderALT on github
    +  Fixes #7725
    +  Closes #7732
     
    -  docs/cmdline: mention what happens when used multiple times
    +- Curl_http2_setup: don't change connection data on repeat invokes
       
    -  For --dns-ipv4-addr, --dns-ipv6-addr and --dns-servers
    +  Regression from 3cb8a748670ab88c (releasde in 7.79.0). That change moved
    +  transfer oriented inits to before the check but also erroneously moved a
    +  few connection oriented ones, which causes problems.
       
    -  Closes #7410
    -  Closes #7411
    -  Closes #7412
    +  Reported-by: Evangelos Foutras
    +  Fixes #7730
    +  Closes #7731
     
    -- [Michał Antoniak brought this change]
    +- RELEASE-NOTES: synced
    +  
    +  and bump to 7.79.1
     
    -  lib: fix compiler warnings with CURL_DISABLE_NETRC
    +Kamil Dudka (16 Sep 2021)
    +- tests/sshserver.pl: make it work with openssh-8.7p1
       
    -  warning C4189: 'netrc_user_changed': local variable is initialized but
    -  not referenced
    +  ... by not using options with no argument where an argument is required:
       
    -  warning C4189: 'netrc_passwd_changed': local variable is initialized but
    -  not referenced
    +  === Start of file tests/log/ssh_server.log
    +  curl_sshd_config line 6: no argument after keyword "DenyGroups"
    +  curl_sshd_config line 7: no argument after keyword "AllowGroups"
    +  curl_sshd_config line 10: Deprecated option AuthorizedKeysFile2
    +  curl_sshd_config line 29: Deprecated option KeyRegenerationInterval
    +  curl_sshd_config line 39: Deprecated option RhostsRSAAuthentication
    +  curl_sshd_config line 40: Deprecated option RSAAuthentication
    +  curl_sshd_config line 41: Deprecated option ServerKeyBits
    +  curl_sshd_config line 45: Deprecated option UseLogin
    +  curl_sshd_config line 56: no argument after keyword "AcceptEnv"
    +  curl_sshd_config: terminating, 3 bad configuration options
    +  === End of file tests/log/ssh_server.log
       
    -  Closes #7423
    -
    -- disable-epsv.d: remove duplicate "(FTP)"
    +  === Start of file log/sftp_server.log
    +  curl_sftp_config line 33: Unsupported option "rhostsrsaauthentication"
    +  curl_sftp_config line 34: Unsupported option "rsaauthentication"
    +  curl_sftp_config line 52: no argument after keyword "sendenv"
    +  curl_sftp_config: terminating, 1 bad configuration options
    +  Connection closed.
    +  Connection closed
    +  === End of file log/sftp_server.log
       
    -  ... since the tooling adds that to the output based on the "Protocols:"
    -  tag.
    -
    -- [Max Zettlmeißl brought this change]
    +  Closes #7724
     
    -  docs: make the documentation for --etag-save match the program behaviour
    +Daniel Stenberg (15 Sep 2021)
    +- hsts: handle unlimited expiry
       
    -  When using curl with the option `--etag-save` I expected it to save the
    -  ETag without its surrounding quotes, as stated by the documentation in
    -  the repository and by the generated man pages.
    +  When setting a blank expire string, meaning unlimited, curl would pass
    +  TIME_T_MAX to getime_r() when creating the output, while on 64 bit
    +  systems such a large value cannot be convetered to a tm struct making
    +  curl to exit the loop with an error instead. It can't be converted
    +  because the year it would represent doesn't fit in the 'int tm_year'
    +  field!
       
    -  My first endeavour was to fix the program, but while investigating the
    -  history of the relevant parts, I discovered that curl once saved the
    -  ETag without the quotes.  This was undone by Daniel Stenberg in commit
    -  `98c94596f5928840177b6bd3c7b0f0dd03a431af`, therefore I decided that in
    -  this case the documentation should be adjusted to match the behaviour of
    -  curl.
    +  Starting now, unlimited expiry is instead handled differently by using a
    +  human readable expiry date spelled out as "unlimited" instead of trying
    +  to use a distant actual date.
       
    -  The changed save behaviour also made parts of the `--etag-compare`
    -  documentation wrong or superfluous, so I adjusted those accordingly.
    +  Test 1660 and 1915 have been updated to help verify this change.
       
    -  Closes #7429
    -
    -- [Josh Soref brought this change]
    +  Reported-by: Jonathan Cardoso
    +  Fixes #7720
    +  Closes #7721
     
    -  write-out.d: add missing periods
    +- curl_multi_fdset: make FD_SET() not operate on sockets out of range
       
    -  Closes #7404
    +  The VALID_SOCK() macro was made to only check for FD_SETSIZE if curl was
    +  built to use select(), even though the curl_multi_fdset() function
    +  always and unconditionally uses FD_SET and needs the check.
    +  
    +  Reported-by: 0xee on github
    +  Fixes #7718
    +  Closes #7719
     
    -- [Josie Huddleston brought this change]
    +- FAQ: add GOPHERS + curl works on data, not files
     
    -  easy: during upkeep, attach Curl_easy to connections in the cache
    +Version 7.79.0 (14 Sep 2021)
    +
    +Daniel Stenberg (14 Sep 2021)
    +- RELEASE-NOTES: synced
       
    -  During the protocol-specific parts of connection upkeep, some code
    -  assumes that the data->conn pointer already is set correctly.  However,
    -  there's currently no guarantee of that in the code.
    +  For the 7.79.0 release
    +
    +- THANKS: add contributors from 7.79.0 release cycle
    +
    +- FAQ: add two dev related questions
       
    -  This fix temporarily attaches each connection to the Curl_easy object
    -  before performing the protocol-specific connection check on it, in a
    -  similar manner to the connection checking in extract_if_dead().
    +    8.1 Why does curl use C89?
    +    8.2 Will curl be rewritten?
       
    -  Fixes #7386
    -  Closes #7387
    -  Reported-by: Josie Huddleston
    -
    -- [Josh Soref brought this change]
    +  Spell-checked-by: Paul Johnson
    +  Closes #7715
     
    -  cleanup: spell DoH with a lowercase o
    +- zuul.d/jobs: disable three tests for *-openssl-disable-proxy
       
    -  Signed-off-by: Josh Soref 
    +  ... as they mysteriously seem to permfail without being related to
    +  proxy.
       
    -  Closes #7413
    +  Closes #7714
     
    -- [Josh Soref brought this change]
    +- [Patrick Monnerat brought this change]
     
    -  TheArtOfHttpScripting: polish
    +  ftp,imap,pop3,smtp: reject STARTTLS server response pipelining
       
    -  - add missing backticks and comma
    +  If a server pipelines future responses within the STARTTLS response, the
    +  former are preserved in the pingpong cache across TLS negotiation and
    +  used as responses to the encrypted commands.
       
    -  - fix proxy description:
    +  This fix detects pipelined STARTTLS responses and rejects them with an
    +  error.
       
    -  * example proxy isn't local
    -  * locally doesn't really make sense
    +  CVE-2021-22947
       
    -  Closes #7416
    +  Bug: https://curl.se/docs/CVE-2021-22947.html
     
    -- [Josh Soref brought this change]
    +- [Patrick Monnerat brought this change]
     
    -  form.d: add examples of `,`/`;` for file[name]
    +  ftp,imap,pop3: do not ignore --ssl-reqd
       
    -  Fixes #7415
    -  Closes #7417
    -
    -- [Michał Antoniak brought this change]
    -
    -  mbedtls: Remove unnecessary include
    +  In imap and pop3, check if TLS is required even when capabilities
    +  request has failed.
       
    -  - curl_setup.h: all references to mbedtls_md4* functions and structures
    -    are in the md4.c. This file already includes the  file
    -    along with the file existence control (defined (MBEDTLS_MD4_C))
    +  In ftp, ignore preauthentication (230 status of server greeting) if TLS
    +  is required.
       
    -  - curl_ntlm_core.c: unnecessary include - repeated below
    +  Bug: https://curl.se/docs/CVE-2021-22946.html
       
    -  Closes #7419
    -
    -- RELEASE-NOTES: synced
    +  CVE-2021-22946
     
    -Jay Satiro (16 Jul 2021)
    -- [User Sg brought this change]
    +- [z2_ on hackerone brought this change]
     
    -  multi: fix crash in curl_multi_wait / curl_multi_poll
    -  
    -  Appears to have been caused by 51c0ebc (precedes 7.77.0) which added a
    -  VALID_SOCK check to one of the loops through the sockets but not the
    -  other.
    +  mqtt: clear the leftovers pointer when sending succeeds
       
    -  Reported-by: sylgal@users.noreply.github.com
    -  Authored-by: sylgal@users.noreply.github.com
    +  CVE-2021-22945
       
    -  Fixes https://github.com/curl/curl/issues/7379
    -  Closes https://github.com/curl/curl/pull/7389
    -
    -- [Daniel Gustafsson brought this change]
    +  Bug: https://curl.se/docs/CVE-2021-22945.html
     
    -  tool_help: remove unused define
    +- zuul: bump the rustls job to use v0.7.2
       
    -  The PRINT_LINES_PAUSE macro is no longer used, and has been mostly
    -  cleaned out but one occurrence remained.
    +  ... and add -lm when using a rust library.
       
    -  Closes https://github.com/curl/curl/pull/7380
    +  Closes #7701
     
    -- [Sergey Markelov brought this change]
    +- RELEASE-PROCEDURE: add release dates from now to 8.0.0 in 2023
     
    -  build: fix compiler warnings when CURL_DISABLE_VERBOSE_STRINGS
    -  
    -  fix compiler warnings about unused variables and parameters when
    -  built with --disable-verbose.
    +- SECURITY-PROCESS: tweak a little to match current practices
       
    -  Closes https://github.com/curl/curl/pull/7377
    -
    -- [Andrea Pappacoda brought this change]
    +  Closes #7713
     
    -  build: fix IoctlSocket FIONBIO check
    +- http_proxy: fix the User-Agent inclusion in CONNECT
       
    -  Prior to this change HAVE_IOCTLSOCKET_CAMEL_FIONBIO mistakenly checked
    -  for (lowercase) ioctlsocket when it should have checked for IoctlSocket.
    +  It should not refer to the uagent string that is allocated and created
    +  for the end server http request, as that pointer may be cleared on
    +  subsequent CONNECT requests.
       
    -  Closes https://github.com/curl/curl/pull/7375
    -
    -- [Timur Artikov brought this change]
    +  Added test case 1184 to verify.
    +  
    +  Reported-by: T200proX7 on github
    +  Fixes #7705
    +  Closes #7707
     
    -  configure: fix nghttp2 library name for static builds
    -  
    -  Don't hardcode the nghttp2 library name,
    -  because it can vary, be "nghttp2_static" for example.
    +- Curl_hsts_loadcb: don't attempt to load if hsts wasn't inited
       
    -  Fixes https://github.com/curl/curl/issues/7367
    -  Closes https://github.com/curl/curl/pull/7368
    +  Reported-by: Jonathan Cardoso
    +  Fixes #7710
    +  Closes #7711
     
    -Gisle Vanem (16 Jul 2021)
    -- [PellesC] fix _lseeki64() macro
    +- [Tatsuhiro Tsujikawa brought this change]
     
    -- [SChannel] Use '_tcsncmp()' instead
    +  ngtcp2: fix build with ngtcp2 and nghttp3
       
    -  Revert previous change for PellesC.
    +  ngtcp2_conn_client_new and nghttp3_conn_client_new are now macros.
    +  Check the wrapped functions instead.
       
    -  Instead replace all use of `_tcsnccmp()` with `_tcsncmp()`.
    +  ngtcp2_stream_close callback now takes flags parameter.
    +  
    +  Closes #7709
     
    -- [PellesC] missing '_tcsnccmp'
    +- write-out.d: clarify size_download/upload
       
    -  PellesC compiler does not have this macro in it's ``
    +  They show the number of "body" bytes transfered.
    +  Fixes #7702
    +  Closes #7706
     
    -Daniel Gustafsson (14 Jul 2021)
    -- TODO: add mention of mbedTLS 3 incompatibilities
    +- http2: Curl_http2_setup needs to init stream data in all invokes
       
    -  Wyatt OʼDay reported in #7385 that mbedTLS isn't backwards compatible
    -  and curl no longer builds with it. Document the need to fix our support
    -  until so has been done.
    +  Thus function was written to avoid doing multiple connection data
    +  initializations, which is fine, but since it also initiates stream
    +  related data it is crucial that it doesn't skip those even if called
    +  again for the same connection. Solved by moving the stream
    +  initializations before the "doing-it-again" check.
       
    -  Closes #7390
    -  Fixes #7385
    -  Reported-by: Wyatt OʼDay
    -  Reviewed-by: Jay Satiro 
    +  Reported-by: Inho Oh
    +  Fixes #7630
    +  Closes #7692
     
    -- docs: fix inconsistencies in EGDSOCKET documentation
    +- url: fix compiler warning in no-verbose builds
       
    -  Only the OpenSSL backend actually use the EGDSOCKET, and also use
    -  TLS consistently rather than mixing SSL and TLS. While there, also
    -  fix a minor spelling nit.
    +  Follow-up from 2f0bb864c12
       
    -  Closes: #7391
    -  Reviewed-by: Jay Satiro 
    -
    -- [Борис Верховский brought this change]
    +  Closes #7700
     
    -  docs: document missing arguments to commands
    +- non-ascii: fix build errors from strerror fix
       
    -  This is a followup to commit f410b9e538129e77607fef1 fixing a few
    -  more commands which takes arguments.
    +  Follow-up to 2f0bb864c12
       
    -  Closes #7382
    -  Reviewed-by: Daniel Gustafsson 
    -
    -- [Randolf J brought this change]
    +  Closes #7697
     
    -  docs: fix incorrect argument name reference
    +- parse_args: redo the warnings for --remote-header-name combos
       
    -  The documentation for the read callback was erroneously referencing
    -  the nitems argument by nmemb.  The error was introduced in commit
    -  ce0881edee3c7.
    +  ... to avoid the memory leak risk pointed out by scan-build.
       
    -  Closes #7383
    -  Reviewed-by: Daniel Gustafsson 
    -
    -- [Борис Верховский brought this change]
    -
    -  tool_help: Document that --tlspassword takes a password
    +  Follow-up from 7a3e981781d6c18a
       
    -  Closes #7378
    -  Reviewed-by: Daniel Stenberg 
    +  Closes #7698
     
    -- scripts: Fix typo in release-notes instructions
    +- ngtcp2: adapt to new size defintions upstream
       
    -  The command to run had a typo in the pathname which prevented copy
    -  pasting it to work, which has annoyed me enough to fix this now.
    +  Reviewed-by: Tatsuhiro Tsujikawa
    +  Closes #7699
     
    -- RELEASE-NOTES: synced
    +- rustls: add strerror.h include
    +  
    +  Follow-up to 2f0bb864c12
     
    -Jay Satiro (10 Jul 2021)
    -- write-out.d: Clarify urlnum is not unique for de-globbed URLs
    +- docs: the security list is reached at security at curl.se now
       
    -  Reported-by: Коваленко Анатолий Викторович
    +  Also update the FAQ section a bit to encourage users to rather submit
    +  security issues on hackerone than sending email.
       
    -  Fixes https://github.com/curl/curl/issues/7342
    -  Closes https://github.com/curl/curl/pull/7369
    -
    -Daniel Gustafsson (3 Jul 2021)
    -- [William Desportes brought this change]
    +  Closes #7689
     
    -  docs: Fix typos
    +Marc Hoersken (9 Sep 2021)
    +- runtests: add option -u to error on server unexpectedly alive
       
    -  Closes: #7370
    -  Reviewed-by: Daniel Gustafsson 
    -
    -Daniel Stenberg (8 Jul 2021)
    -- [Jonathan Wernberg brought this change]
    -
    -  Revert "ftp: Expression 'ftpc->wait_data_conn' is always false"
    +  Let's try to actually handle the server unexpectedly alive
    +  case by first making them visible on CI builds as failures.
       
    -  The reverted commit introduced a logic error in code that was
    -  correct.
    +  This is needed to detect issues with killing of the test
    +  servers completely including nested process chains with
    +  multiple PIDs per test server (including bash and perl).
       
    -  The client using libcurl would notice the error since FTP file
    -  uploads in active transfer mode would somtimes complete with
    -  success despite no transfer having been performed and the
    -  "uploaded" file thus not being on the remote server afterwards.
    +  On Windows/cygwin platforms this is especially helpful with
    +  debugging PID mixups due to cygwin using its own PID space.
       
    -  The FTP server would notice the error because it receives a
    -  RST on the data connection it has established with the client
    -  before any data was transferred at all.
    +  Reviewed-by: Daniel Stenberg
    +  Closes #7180
    +
    +Daniel Stenberg (9 Sep 2021)
    +- opts docs: unify phrasing in NAME header
       
    -  The logic error happens if the STOR response from the server have
    -  arrived by the time ftp_multi_statemach() in the affected code path
    -  is called, but the incoming data connection have not arrived yet.
    -  In that case, the processing of the STOR response will cause
    -  'ftpc->wait_data_conn' to be set to TRUE, contradicting the comment
    -  in the code. Since 'complete' will also be set, later logic would
    -  believe the transfer was done.
    +  - avoid writing "set ..." or "enable/disable ..." or "specify ..."
    +    *All* options for curl_easy_setopt() are about setting or enabling
    +    things and most of the existing options didn't use that way of
    +    description.
       
    -  In most cases, the STOR response will not have arrived yet when
    -  the affected code path is executed, or the incoming connection will
    -  also have arrived, and thus the error would not express itself.
    -  But if the speed difference of the device using libcurl and the
    -  FTP server is exactly right, the error may happen as often as in
    -  one out of hundred file transfers.
    +  - start with lowercase letter, unless abbreviation. For consistency.
       
    -  This reverts commit 49f3117a238b6eac0e22a32f50699a9eddcb66ab.
    +  - Some additional touch-ups
       
    -  Bug: https://curl.se/mail/lib-2021-07/0025.html
    -  Closes #7362
    +  Closes #7688
     
    -- msnprintf: return number of printed characters excluding null byte
    +- strerror.h: remove the #include from files not using it
    +
    +- lib: don't use strerror()
       
    -  ... even when the output is "capped" by the maximum length argument.
    +  We have and provide Curl_strerror() internally for a reason: strerror()
    +  is not necessarily thread-safe so we should always try to avoid it.
       
    -  Clarified in the docs.
    +  Extended checksrc to warn for this, but feature the check disabled by
    +  default and only enable it in lib/
       
    -  Closes #7361
    +  Closes #7685
     
    -- infof: remove newline from format strings, always append it
    +Daniel Gustafsson (8 Sep 2021)
    +- cirrus: Add FreeBSD 13.0 job and disable sanitizer build
       
    -  - the data needs to be "line-based" anyway since it's also passed to the
    -    debug callback/application
    +  As alluded to the in the now removed comment, a 13.0 image became
    +  available and is now ready to be used.
       
    -  - it makes infof() work like failf() and consistency is good
    +  The sanitizer builds were running on the 12.1 image which since has
    +  been removed from the config, leaving the builds not running at all.
    +  When enabled it turns out that they don't actually work due to very
    +  long timeouts in executing the tests, so keep the disabled for now
    +  but a bit more controlled.
       
    -  - there's an assert that triggers on newlines in the format string
    +  Closes #7592
    +
    +Daniel Stenberg (8 Sep 2021)
    +- copyrights: update copyright year ranges
    +
    +- RELEASE-NOTES: synced
    +
    +- INTERNALS: c-ares has a new home: c-ares.org
    +
    +- docs: remove experimental mentions from HSTS and MQTT
       
    -  - Also removes a few instances of "..."
    +  Reported-by: Jonathan Cardoso
    +  Bug: https://github.com/curl/curl/pull/6700#issuecomment-913792863
    +  Closes #7681
    +
    +- [Cao ZhenXiang brought this change]
    +
    +  curl: add warning for incompatible parameters usage
       
    -  - Removes the code that would append "..." to the end of the data *iff*
    -    it was truncated in infof()
    +  --continue-at - and --remote-header-name are known incompatible parameters
       
    -  Closes #7357
    +  Closes #7674
     
    -- examples/multi-single: fix scan-build warning
    -  
    -  warning: Value stored to 'mc' during its initialization is never read
    +- [git-bruh brought this change]
    +
    +  examples/*hiperfifo.c: fix calloc arguments to match function proto
       
    -  Follow-up to ae8e11ed5fd2ce
    +  Closes #7678
    +
    +- INTERNALS: bump c-ares requirement to 1.16.0
       
    -  Closes #7360
    +  Since ba904db0705c93 we use ares_getaddrinfo, added in c-ares 1.16.0
     
    -- wolfssl: failing to set a session id is not reason to error out
    +- curl: stop retry if Retry-After: is longer than allowed
       
    -  ... as it is *probably* just timed out.
    +  If Retry-After: specifies a period that is longer than what fits within
    +  --retry-max-time, then stop retrying immediately.
       
    -  Reported-by: Francisco Munoz
    +  Added test 366 to verify.
       
    -  Closes #7358
    +  Reported-by: Kari Pahula
    +  Fixes #7675
    +  Closes #7676
     
    -- docs/examples: use curl_multi_poll() in multi examples
    -  
    -  The API is soon two years old and deserves being shown as the primary
    -  way to drive multi code as it makes it much easier to write code.
    -  
    -  multi-poll: removed
    +- [Michał Antoniak brought this change]
    +
    +  mbedtls: avoid using a large buffer on the stack
       
    -  multi-legacy: add to show how we did multi API use before
    -  curl_multi_wait/poll.
    +  Use dynamic memory allocation for the buffer used in checking "pinned
    +  public key". The PUB_DER_MAX_BYTES parameter with default settings is
    +  set to a value greater than 2kB.
       
    -  Closes #7352
    +  Co-authored-by: Daniel Stenberg
    +  Closes #7586
     
    -- KNOWN_BUGS: flaky Windows CI builds
    +- configure: make --disable-hsts work
    +  
    +  The AC_ARG_ENABLE() macro itself uses a variable called
    +  'enable_[option]', so when our script also used a variable with that
    +  name for the purpose of storing what the user wants, it also
    +  accidentally made it impossible to switch off the feature with
    +  --disable-hsts. Fix this by renaming our variable.
       
    -  Closes #6972
    -
    -- RELEASE-NOTES: synced
    +  Reported-by: Michał Antoniak
    +  Fixes #7669
    +  Closes #7672
     
    -- test1147: hyper doesn't allow "crazy" request headers like built-in
    +Jay Satiro (5 Sep 2021)
    +- config.d: note that curlrc is used even when --config
       
    -  ... so strip that from the test.
    +  Bug: https://github.com/curl/curl/pull/7666#issuecomment-912214751
    +  Reported-by: Viktor Szakats
       
    -  Closes #7349
    +  Closes https://github.com/curl/curl/pull/7667
     
    -- c-hyper: bail on too long response headers
    +Daniel Stenberg (4 Sep 2021)
    +- RELEASE-NOTES: synced
    +
    +- test1173: check references to libcurl options
       
    -  To match with built-in behaviors. Makes test 1154 work.
    +  ... that they refer to actual existing libcurl options.
       
    -  Closes #7350
    +  Reviewed-by: Daniel Gustafsson
    +  Closes #7656
     
    -- test1151: added missing CRLF to work with hyper
    +- CURLOPT_UNIX_SOCKET_PATH.3: remove nginx reference, add see also
       
    -  Closes #7350
    +  Closes #7656
     
    -- c-hyper: add support for transfer-encoding in the request
    +- opt-docs: verify man page sections + order
       
    -  Closes #7348
    -
    -- [Andrea Pappacoda brought this change]
    -
    -  cmake: remove libssh2 feature checks
    +  In every libcurl option man page there are now 8 mandatory sections that
    +  must use the right name in the correct order and test 1173 verifies
    +  this. Only 14 man pages needed adjustments.
       
    -  libssh2 features are detected based on version since commit
    -  9dbbba997608f7c3c5de1c627c77c8cd2aa85b73
    +  The sections and the order is as follows:
       
    -  Closes #7343
    -
    -- test1116: hyper doesn't pass through "surprise-trailers"
    +   - NAME
    +   - SYNOPSIS
    +   - DESCRIPTION
    +   - PROTOCOLS
    +   - EXAMPLE
    +   - AVAILABILITY
    +   - RETURN VALUE
    +   - SEE ALSO
       
    -  Closes #7344
    +  Reviewed-by: Daniel Gustafsson
    +  Closes #7656
     
    -- socks4: scan for the IPv4 address in resolve results
    +- opt-docs: make sure all man pages have examples
       
    -  Follow-up to 84d2839740 which changed the resolving to always resolve
    -  both address families, but since SOCKS4 only supports IPv4 it should
    -  scan for and use the first available IPv4 address.
    +  Extended manpage-syntax.pl (run by test 1173) to check that every man
    +  page for a libcurl option has an EXAMPLE section that is more than two
    +  lines. Then fixed all errors it found and added examples.
       
    -  Reported-by: shithappens2016 on github
    -  Fixes #7345
    -  Closes #7346
    +  Reviewed-by: Daniel Gustafsson
    +  Closes #7656
     
    -Jay Satiro (5 Jul 2021)
    -- proto.d: fix formatting for paragraphs after margin changes
    +- get.d: provide more useful examples
       
    -  Closes https://github.com/curl/curl/pull/7341
    +  Closes #7668
     
    -- pinnedpubkey.d: fix formatting for version support lists
    +- page-header: add GOPHERS, simplify wording in the 1st para
       
    -  Closes https://github.com/curl/curl/pull/7340
    +  Closes #7665
     
    -Daniel Stenberg (2 Jul 2021)
    -- TODO: "Support in-memory certs/ca certs/keys" done
    +- connect: get local port + ip also when reusing connections
       
    -  Has been suppored for a while now with the *BLOB options.
    -
    -- examples: safer and more proper read callback logic
    +  Regression. In d6a37c23a3c (7.75.0) we removed the duplicated storage
    +  (connection + easy handle), so this info needs be extracted again even
    +  for re-used connections.
       
    -  The same callback code is used in:
    +  Add test 435 to verify
       
    -   imap-append.c
    -   smtp-authzid.c
    -   smtp-mail.c
    -   smtp-multi.c
    -   smtp-ssl.c
    -   smtp-tls.c
    +  Reported-by: Max Dymond
    +  Fixes #7660
    +  Closes #7662
    +
    +Marcel Raad (2 Sep 2021)
    +- multi: fix compiler warning with `CURL_DISABLE_WAKEUP`
       
    -  It should not assume that it can copy full lines into the buffer as it
    -  will encourage sloppy coding practices. Instead use byte-wise logic and
    -  check/acknowledge the buffer size appropriately.
    +  `use_wakeup` is unused in this case.
       
    -  Reported-by: Harry Sintonen
    -  Fixes #7330
    -  Closes #7331
    +  Closes https://github.com/curl/curl/pull/7661
     
    -- test1519: adjusted to work with hyper
    +Daniel Stenberg (1 Sep 2021)
    +- tests: adjust the tftpd output to work with hyper mode
       
    -  Closes #7333
    -
    -- test1518: adjusted to work with hyper
    +  By making them look less like http headers, the hyper mode "tweak"
    +  doesn't interfere.
       
    -  ... by making sure the stdout output doesn't look like HTTP headers.
    +  Enable test 2002 and 2003 in hyper builds (and 1280 which is unrelated
    +  but should be enabled).
       
    -  Closes #7333
    +  Closes #7658
     
    -- test1514: add a CRLF to the response to make it correct
    -  
    -  Makes hyper accept it fine instead returning HYPERE_UNEXPECTED_EOF on
    -  us.
    -  
    -  Closes #7334
    +Daniel Gustafsson (1 Sep 2021)
    +- [Gisle Vanem brought this change]
     
    -- formdata: avoid "Argument cannot be negative" warning
    +  openssl: annotate SSL3_MT_SUPPLEMENTAL_DATA
       
    -  ... when converting a curl_off_t to size_t, by using
    -  CURL_ZERO_TERMINATED before passing the argument to the function.
    +  This adds support for the previously unhandled supplemental data which
    +  in -v output was printed like:
       
    -  Detected by Coverity CID 1486590.
    +      TLSv1.2 (IN), TLS header, Unknown (23):
       
    -  Closes #7328
    -  Assisted-by: Daniel Gustafsson
    -
    -- lib: more %u for port and int for %*s fixes
    +  These will now be printed with proper annotation:
       
    -  Detected by Coverity
    +      TLSv1.2 (OUT), TLS header, Supplemental data (23):
       
    -  Closes #7329
    -
    -- doh: (void)-prefix call to curl_easy_setopt
    +  Closes #7652
    +  Reviewed-by: Daniel Stenberg 
     
    -- lib: fix type of len passed to *printf's %*s
    -  
    -  ... it needs to be 'int'. Detected by Coverity CID 1486611 (etc)
    +Daniel Stenberg (1 Sep 2021)
    +- curl.1: provide examples for each option
       
    -  Closes #7326
    -
    -- lib: use %u instead of %ld for port number printf
    +  The file format for each option now features a "Example:" header that
    +  can provide one or more examples that get rendered appropriately in the
    +  output. All options MUST have at least one example or gen.pl complains
    +  at build-time.
       
    -  Follow-up to 764c6bd3bf which changed the type of some port number
    -  fields. Detected by Coverity (CID 1486624) etc.
    +  This fix also does a few other minor format and consistency cleanups.
       
    -  Closes #7325
    +  Closes #7654
     
    -- version: turn version number functions into returning void
    +- progress: make trspeed avoid floats
       
    -  ... as we never use the return codes from them.
    +  and compiler warnings for data conversions.
       
    -  Reviewed-by: Daniel Gustafsson
    -  Closes #7319
    +  Reported-by: Michał Antoniak
    +  Fixes #7645
    +  Closes #7653
     
    -- mqtt: extend the error message for no topic
    -  
    -  ... and mention that it needs URL encoding.
    -  
    -  Reported-by: Peter Körner
    -  Fixes #7316
    -  Closes #7317
    +- test365: verify response with chunked AND Content-Length headers
     
    -- formdata: correct typecast in curl_mime_data call
    -  
    -  Coverity pointed out it the mismatch. CID 1486590
    +- http: ignore content-length if any transfer-encoding is used
       
    -  Closes #7327
    +  Fixes #7643
    +  Closes #7649
     
    -- url: (void)-prefix a curl_url_get() call
    -  
    -  Coverity (CID 1486645) pointed out a use of curl_url_get() in the
    -  parse_proxy function where the return code wasn't checked. A
    -  (void)-prefix makes the intention obvious.
    -  
    -  Closes #7320
    +- RELEASE-NOTES: synced
     
    -- glob: pass an 'int' as len when using printf's %*s
    +- Revert "http2: skip immediate parsing of payload following protocol switch"
       
    -  Detected by Coverity CID 1486629.
    +  This reverts commit 455a63c66f188598275e87d32de2c4e8e26b80cb.
       
    -  Closes #7324
    +  Reported-by: Tk Xiong
    +  Fixes #7633
    +  Closes #7648
     
    -- vtls: use free() not curl_free()
    -  
    -  curl_free() is provided for users of the API to free returned data,
    -  there's no need to use it internally.
    +- KNOWN_BUGS: HTTP/3 doesn't support client certs
       
    -  Closes #7318
    +  Closes #7625
     
    -- zuul: use the new rustls directory name
    +- mailing lists: move from cool.haxx.se to lists.haxx.se
    +
    +- http_proxy: only wait for writable socket while sending request
       
    -  Follow-up to 6d972c8b1cbb3 which missed updating this directory name.
    +  Otherwise it would wait socket writability even after the entire CONNECT
    +  request has sent and make curl basically busy-loop while waiting for a
    +  response to come back.
       
    -  Also no longer call it crustls in the docs and bump to rusttls-ffi 0.7.1
    +  The previous fix attempt in #7484 (c27a70a591a4) was inadequate.
       
    -  Closes #7311
    +  Reported-by: zloi-user on github
    +  Reported-by: Oleguer Llopart
    +  Fixes #7589
    +  Closes #7647
     
    -Jay Satiro (29 Jun 2021)
    -- http: fix crash in rate-limited upload
    +- http: disallow >3-digit response codes
       
    -  - Don't set the size of the piece of data to send to the rate limit if
    -    that limit is larger than the buffer size that will hold the piece.
    +  Make the built-in HTTP parser behave similar to hyper and reject any
    +  HTTP response using more than 3 digits for the response code.
       
    -  Prior to this change if CURLOPT_MAX_SEND_SPEED_LARGE
    -  (curl tool: --limit-rate) was set then it was possible that a temporary
    -  buffer used for uploading could be written to out of bounds. A likely
    -  scenario for this would be a non-trivial amount of post data combined
    -  with a rate limit larger than CURLOPT_UPLOAD_BUFFERSIZE (default 64k).
    +  Updated test 1432 accordingly.
    +  Enabled test 1432 in the hyper builds.
       
    -  The bug was introduced in 24e469f which is in releases since 7.76.0.
    +  Closes #7641
    +
    +- [Tatsuhiro Tsujikawa brought this change]
    +
    +  ngtcp2: stop buffering crypto data
       
    -  perl -e "print '0' x 200000" > tmp
    -  curl --limit-rate 128k -d @tmp httpbin.org/post
    +  Stop buffering crypto data because libngtcp2 now buffers submitted
    +  crypto data.
    +  
    +  Closes #7637
    +
    +- test1280: CRLFify the response to please hyper
       
    -  Reported-by: Richard Marion
    +  Closes #7639
    +
    +- tests: enable test 1129 for hyper builds
       
    -  Fixes https://github.com/curl/curl/issues/7308
    -  Closes https://github.com/curl/curl/pull/7315
    +  Closes #7638
     
    -Daniel Stenberg (29 Jun 2021)
    -- copyright: add boiler-plate headers to CI config files
    +- curl: better error message when -O fails to get a good name
       
    -  And whitelist .zuul.ignore
    +  Due to how this currently works internally, it needs a working initial
    +  file name to store contents in, so it may still fail even with -J is
    +  used (and thus accepting a name from content-disposition:) if the file
    +  name part of the URL isn't "good enough".
       
    -  Closes #7314
    +  Fixes #7628
    +  Closes #7635
     
    -- CI: remove travis details
    -  
    -  Rename still used leftovers to "zuul" as that's now the CI using them.
    +- curl_easy_setopt: tweak the string copy wording
       
    -  Closes #7313
    +  Reported-by: Yaobin Wen
    +  Fixes #7632
    +  Closes #7634
     
     - RELEASE-NOTES: synced
     
    -- openssl: avoid static variable for seed flag
    +- [Don J Olmstead brought this change]
    +
    +  cmake: sync CURL_DISABLE options
       
    -  Avoid the race condition risk by instead storing the "seeded" flag in
    -  the multi handle. Modern OpenSSL versions handle the seeding itself so
    -  doing the seeding once per multi-handle instead of once per process is
    -  less of an issue.
    +  Adds the full listing of CURL_DISABLE options to the CMake build. Moves
    +  all option code, except for CURL_DISABLE_OPENSSL_AUTO_LOA_CONFIG which
    +  resides near OpenSSL configuration, to the same block of code. Also
    +  sorts the options here and in the cmake config header.
       
    -  Reported-by: Gerrit Renker
    -  Fixes #7296
    -  Closes #7306
    +  Additionally sorted the CURL-DISABLE listing and fixed the
    +  CURL_DISABLE_POP3 option.
    +  
    +  Closes #7624
     
    -- configure: inhibit the implicit-fallthrough warning on gcc-12
    +Jay Satiro (25 Aug 2021)
    +- KNOWN_BUGS: FTPS upload data loss with TLS 1.3
       
    -  ... since it no longer acknowledges the comment markup we use for that
    -  purpose.
    +  Bug: https://github.com/curl/curl/issues/6149
    +  Reported-by: Bylon2@users.noreply.github.com
       
    -  Reported-by: Younes El-karama
    -  Fixes #7295
    -  Closes #7307
    +  Closes https://github.com/curl/curl/pull/7623
     
    -Daniel Gustafsson (28 Jun 2021)
    -- [Andrei Rybak brought this change]
    +Daniel Stenberg (24 Aug 2021)
    +- cmake: avoid poll() on macOS
    +  
    +  ... like we do in configure builds. Since poll() on macOS is not
    +  reliable enough.
    +  
    +  Reported-by: marc-groundctl
    +  Fixes #7595
    +  Closes #7619
     
    -  misc: fix typos in comments which repeat a word
    +- c-hyper: handle HTTP/1.1 => HTTP/1.0 downgrade on reused connection
       
    -  Fix typos in code comments which repeat various words.  In trivial
    -  cases, just delete the repeated word.  Reword the affected sentence in
    -  "lib/url.c" for it to make sense.
    +  Enable test 1074
       
    -  Closes #7303
    -  Reviewed-by: Daniel Gustafsson 
    +  Closes #7617
     
    -Daniel Stenberg (27 Jun 2021)
    -- lib677: make it survive torture testing
    +- c-hyper: deal with Expect: 100-continue combined with POSTFIELDS
       
    -  Follow-up to a5ab72d5edd7
    +  Enable test 1130 and 1131
       
    -  Closes #7300
    +  Closes #7616
     
    -- [Tommy Chiang brought this change]
    +- [a1346054 brought this change]
     
    -  docs/BINDINGS: fix outdated links
    +  tests: be explicit about using 'python3' instead of 'python'
       
    -  * luacurl page is now not accessible, fix it with wayback machine page
    -  * Scheme one seems not providing https now, change it back to http one
    +  This fixes running tests in virtualenvs (or on distros) that no longer
    +  have a symlink from python to python2 or python3.
       
    -  Closes #7301
    +  Closes #7602
     
    -- [Jacob Hoffman-Andrews brought this change]
    +- [a1346054 brought this change]
     
    -  curstls: bump crustls version and use new URL
    -  
    -  crustls moved to https://github.com/rustls/rustls-ffi. This also bumps
    -  the expected version to 0.7.0.
    +  scripts: invoke interpreters through /usr/bin/env
       
    -  Closes #7297
    +  Closes #7602
     
    -- RELEASE-NOTES: synced
    +- DISABLED: enable 11 more tests for hyper builds
    +  
    +  Closes #7612
     
    -- examples: length-limit two sscanf() uses of %s
    +- setopt: enable CURLOPT_IGNORE_CONTENT_LENGTH for hyper
       
    -  Reported-by: Jishan Shaikh
    -  Fixes #7293
    -  Closes #7294
    +  Since this option is also used for FTP, it needs to work to set for
    +  applications even if hyper doesn't support it for HTTP. Verified by test
    +  1137.
    +  
    +  Updated docs to specify that the option doesn't work for HTTP when using
    +  the hyper backend.
    +  
    +  Closes #7614
     
    -- [Richard Whitehouse brought this change]
    +- test1138: remove trailing space to make work with hyper
    +  
    +  Closes #7613
     
    -  multi: alter transfer timeout ordering
    +- libcurl-errors.3: clarify two CURLUcode errors
       
    -  - Check whether a connection has succeded before checking whether it's
    -    timed out.
    +  CURLUE_BAD_HANDLE and CURLUE_BAD_PARTPOINTER should be for "bad" or
    +  wrong pointers in a generic sense, not just for NULL pointers.
       
    -    This means if we've connected quickly, but subsequently been
    -    descheduled, we allow the connection to succeed. Note, if we timeout,
    -    but between checking the timeout, and connecting to the server the
    -    connection succeeds, we will allow it to go ahead. This is viewed as
    -    an acceptable trade off.
    +  Reviewed-by: Jay Satiro
       
    -  - Add additional failf logging around failed connection attempts to
    -    propogate the cause up to the caller.
    +  Ref: #7605
    +  Closes #7611
    +
    +Jay Satiro (23 Aug 2021)
    +- symbols-in-versions: fix CURLSSLBACKEND_QSOSSL last used version
       
    -  Co-Authored-by: Martin Howarth
    -  Closes #7178
    +  ... and also change the 'Removed' column name to 'Last' since that
    +  column is for the last version to contain the symbol.
    +  
    +  Closes https://github.com/curl/curl/pull/7609
     
    -- test677: IMAP CONNECT_ONLY, custom command and then exit
    +Daniel Stenberg (23 Aug 2021)
    +- urlapi.c:seturl: assert URL instead of using if-check
       
    -  Adjusted ftpserver.pl to add support for the IMAP IDLE command
    +  There's no code flow possible where this can happen. The assert makes
    +  sure it also won't be introduced undetected in the future.
       
    -  Adjusted test 660 to sync with the fix
    +  Closes #7610
     
    -- multi: do not switch off connect_only flag when closing
    +- curl-openssl.m4: show correct output for OpenSSL v3
       
    -  ... as it made protocol specific disconnect commands wrongly get used.
    +  Using 3.0.0 versions configure should now show this:
       
    -  Bug: https://curl.se/mail/lib-2021-06/0024.html
    -  Reported-by: Aleksander Mazur
    -  Closes #7288
    +  checking for OpenSSL headers version... 3.0.0 - 0x300
    +  checking for OpenSSL library version... 3.0.0
    +  checking for OpenSSL headers and library versions matching... yes
    +  
    +  This output doesn't actually change what configure generates but is only
    +  "cosmetic".
    +  
    +  Reported-by: Randall S. Becker
    +  Fixes #7606
    +  Closes #7608
     
    -- http: make the haproxy support work with unix domain sockets
    +Jay Satiro (22 Aug 2021)
    +- mksymbolsmanpage.pl: Fix showing symbol's last used version
       
    -  ... it should then pass on "PROXY UNKNOWN" since it doesn't know the
    -  involved IP addresses.
    +  Prior to this change the symbol's deprecated version was erroneously
    +  shown as its last used version.
       
    -  Reported-by: Valentín Gutiérrez
    -  Fixes #7290
    -  Closes #7291
    +  Bug: https://github.com/curl/curl/commit/4e53b94#commitcomment-55239509
    +  Reported-by: i-ky@users.noreply.github.com
     
    -- [Xiang Xiao brought this change]
    +Daniel Stenberg (21 Aug 2021)
    +- mksymbolsmanpage.pl: match symbols case insenitively
    +  
    +  Follow-up to 4e53b9430c750 which made this bug show.
    +  
    +  Reported-by: i-ky
    +  Bug: https://github.com/curl/curl/commit/4e53b9430c7504de8984796e2a2091ec16f27136#commitcomment-55239253
    +  Closes #7607
     
    -  curl.h: include sys/select.h for NuttX RTOS
    +- asyn-ares: call ares_freeaddrinfo() to clean up addrinfo results
       
    -  Closes #7287
    +  As this leaks memory otherwise
    +  
    +  Follow-up to ba904db0705c931
    +  
    +  Closes #7599
     
    -- [Bin Meng brought this change]
    +- [Ehren Bendler brought this change]
     
    -  curl.h: remove the execution bit
    +  wolfssl: clean up wolfcrypt error queue
       
    -  The execution bit of curl.h file was wrongly added:
    +  If wolfSSL is built in certain ways (OPENSSL_EXTRA or Debug), the error
    +  queue gets added on to for each session and never freed. Fix it by
    +  calling ERR_clear_error() like in vtls/openssl when needed. This func is
    +  a no-op in wolfcrypt if the error queue is not enabled.
       
    -    commit 2621025d6f96 ("curl.h:  is supported by VxWorks7")
    +  Closes #7594
    +
    +- man pages: remove trailing whitespaces
       
    -  and should be removed.
    +  Extended test 1173 (via the manpage-syntax.pl script) to detect and warn
    +  for them.
       
    -  Follow-up to 2621025d6f96 ("curl.h:  is supported by VxWorks7")
    -  Signed-off-by: Bin Meng 
    -  Closes #7286
    +  Ref: #7602
    +  Reported-by: a1346054 on github
    +  Closes #7604
     
    -- [Bin Lan brought this change]
    +- mailmap: add Gleb Ivanovsky
     
    -  curl.h:  is supported by VxWorks7
    +- config.d: escape the backslash properly
       
    -  Closes #7285
    +  Closes #7603
     
    -- [Bachue Zhou brought this change]
    +- [Don J Olmstead brought this change]
     
    -  quiche: use send() instead of sendto() to avoid macOS issue
    +  curl_setup.h: sync values for HTTP_ONLY
       
    -  sendto() always returns "Socket is already connected" error on macos
    +  The values for HTTP_ONLY differed between CMakeLists.txt and
    +  curl_setup.h. Sync them and sort the values in curl_setup.h to make it
    +  easier to spot differences.
       
    -  Closes #7260
    -
    -- [Li Xinwei brought this change]
    +  Closes #7601
     
    -  cmake: fix support for UnixSockets feature on Win32
    +Jay Satiro (21 Aug 2021)
    +- configure: set classic mingw minimum OS version to XP
       
    -  Move the definition of sockaddr_un struct from config-win32.h to
    -  curl_setup.h, so that it could be shared by all build systems.
    +  - If the user has not specified a minimum OS version (via WINVER or
    +    _WIN32_WINNT macros) then set it to Windows XP.
       
    -  Add ADDRESS_FAMILY typedef for old mingw, now old mingw can also use
    -  unix sockets.
    +  Prior to this change classic MinGW defaulted the minimum OS version
    +  to Windows NT 4.0 which is way too old. At least Windows XP is needed
    +  for getaddrinfo (which resolves hostnames to IPv6 addresses).
       
    -  Also fix the build of tests/server/sws.c on Win32 when USE_UNIX_SOCKETS
    -  is defined.
    +  Ref: https://github.com/curl/curl/issues/7483#issuecomment-891597034
       
    -  Closes #7034
    -
    -- [Gregory Muchka brought this change]
    +  Closes https://github.com/curl/curl/pull/7581
     
    -  hostip: (macOS) free returned memory of SCDynamicStoreCopyProxies
    +- schannel: Work around typo in classic mingw macro
       
    -  From Apples documentation on SCDynamicStoreCopyProxies, "Return Value: A
    -  dictionary of key-value pairs that represent the current internet proxy
    -  settings, or NULL if no proxy settings have been defined or if an error
    -  occurred. You must release the returned value."
    +  - Define ALG_CLASS_DHASH (the typo from the include) to ALG_CLASS_HASH.
       
    -  Failure to release the returned value of SCDynamicStoreCopyProxies can
    -  result in a memory leak.
    +  Prior to this change there was an incomplete fix to ignore the
    +  CALG_TLS1PRF macro on those versions of MinGW where it uses the
    +  ALG_CLASS_DHASH typoed macro.
       
    -  Source: https://developer.apple.com/documentation/systemconfiguration/1517088-scdynamicstorecopyproxies
    +  Ref: 48cf45c
    +  Ref: https://osdn.net/projects/mingw/ticket/38391
    +  Ref: https://github.com/curl/curl/issues/2924
       
    -  Closes #7265
    +  Closes https://github.com/curl/curl/pull/7580
     
    +Daniel Stenberg (20 Aug 2021)
     - RELEASE-NOTES: synced
     
    -Jay Satiro (21 Jun 2021)
    -- vtls: fix warning due to function prototype mismatch
    +- http_proxy: fix user-agent and custom headers for CONNECT with hyper
       
    -  b09c8ee changed the function prototype. Caught by Visual Studio.
    -
    -- curl_multibyte: Remove local encoding fallbacks
    +  Enable test 287
       
    -  - If the UTF-8 to UTF-16 conversion fails in Windows Unicode builds then
    -    no longer fall back to assuming the string is in a local encoding.
    +  Closes #7598
    +
    +- c-hyper: initial support for "dumping" 1xx HTTP responses
       
    -  Background:
    +  With the use hyper_request_on_informational()
       
    -  Some functions in Windows Unicode builds must convert UTF-8 to UTF-16 to
    -  pass to the Windows CRT API wide-character functions since in Windows
    -  UTF-8 is not a valid locale (or at least 99% of the time right now).
    +  Enable test 155 and 158
       
    -  Prior to this change if the Unicode encoding conversion failed then
    -  libcurl would assume, for backwards compatibility with applications that
    -  may have written their code for non-Unicode builds, attempt to convert
    -  the string from local encoding to UTF-16.
    +  Closes #7597
    +
    +Marc Hoersken (18 Aug 2021)
    +- tests/*server.pl: flush output before executing subprocess
       
    -  That type of "best effort" could theoretically cause some type of
    -  security or other problem if a string that was locally encoded was also
    -  valid UTF-8, and therefore an unexpected UTF-8 to UTF-16 conversion
    -  could occur.
    +  Also avoid shell processes staying around by using exec.
    +  This is necessary to avoid output data being buffering
    +  inside the process chain of Perl, Bash/Shell and our
    +  test server binaries. On non-Windows systems the exec
    +  will also make the subprocess replace the intermediate
    +  shell, but on Windows it will at least bind the processes
    +  together since there is no real fork or exec available.
       
    -  Ref: https://github.com/curl/curl/pull/7246
    +  See: https://cygwin.com/cygwin-ug-net/highlights.html
    +  and: https://docs.microsoft.com/cpp/c-runtime-library/exec-wexec-functions
    +  Ref: https://github.com/curl/curl/pull/7530#issuecomment-900949010
       
    -  Closes https://github.com/curl/curl/pull/7257
    +  Reviewed-by: Daniel Stenberg
    +  Reviewed-by: Jay Satiro
    +  Closes #7530
     
    -Daniel Stenberg (20 Jun 2021)
    -- curl_endian: remove the unused Curl_write64_le function
    +- CI: use GitHub Container Registry instead of Docker Hub
       
    -  The last usage was removed in cca455a36
    +  Avoid limits on Docker Hub and improve image pull/download speed.
       
    -  Closes #7280
    +  Closes #7587
     
    -- vtls: only store TIMER_APPCONNECT for non-proxy connect
    +Daniel Stenberg (18 Aug 2021)
    +- openssl: when creating a new context, there cannot be an old one
       
    -  Introducing a 'isproxy' argument to the connect function so that it
    -  knows wether to store the time stamp or not.
    +  Remove the previous handling that would call SSL_CTX_free(), and instead
    +  add an assert that halts a debug build if there ever is a context
    +  already set at this point.
       
    -  Reported-by: Yongkang Huang
    -  Fixes #7274
    -  Closes #7274
    +  Closes #7585
     
    -- gnutls: set the preferred TLS versions in correct order
    -  
    -  Regression since 781864bedbc57 (curl 7.77.0)
    +Jay Satiro (18 Aug 2021)
    +- KNOWN_BUGS: Renegotiate from server may cause hang for OpenSSL backend
       
    -  Reported-by: civodul on github
    -  Assisted-by: Nikos Mavrogiannopoulos
    -  Fixes #7277
    -  Closes #7278
    +  Closes https://github.com/curl/curl/issues/6785
     
    -- [Gergely Nagy brought this change]
    +Viktor Szakats (17 Aug 2021)
    +- docs/BINDINGS: URL update
     
    -  configure/cmake: remove checks for unused gethostbyaddr and gethostbyaddr_r
    +Marc Hoersken (17 Aug 2021)
    +- tests/server/*.c: align handling of portfile argument and file
       
    -  Closes #7276
    -
    -- [Gergely Nagy brought this change]
    -
    -  configure/cmake: remove checks for unused inet_ntoa and inet_ntoa_r
    +  1. Call the internal variable portname (like pidname) everywhere.
    +  2. Have a variable wroteportfile (like wrotepidfile) everywhere.
    +  3. Make sure the file is cleaned up on exit (like pidfile).
    +  4. Add parameter --portfile to usage outputs everywhere.
       
    -  Closes #7276
    -
    -- [Gergely Nagy brought this change]
    -
    -  configure/cmake: remove unused define HAVE_PERROR
    +  Reviewed-by: Daniel Stenberg
       
    -  Closes #7276
    -
    -- [Gergely Nagy brought this change]
    +  Replaces #7523
    +  Closes #7574
     
    -  configure: remove unused check for gai_strerror
    +Daniel Gustafsson (17 Aug 2021)
    +- KNOWN_BUGS: Fix a number of typos in KNOWN_BUGS
       
    -  Closes #7276
    -
    -- [Gergely Nagy brought this change]
    +  Fixes a set of typos found in section 11.3.
     
    -  configure/cmake: remove unused define HAVE_FREEIFADDRS
    +Daniel Stenberg (17 Aug 2021)
    +- getparameter: fix the --local-port number parser
       
    -  Closes #7276
    -
    -- [Gergely Nagy brought this change]
    -
    -  configure/cmake: remove unused define HAVE_FORK
    +  It could previously get tricked into parsing the uninitialized stack
    +  based buffer.
       
    -  Closes #7276
    -
    -- [Gergely Nagy brought this change]
    +  Reported-by: Brian Carpenter
    +  Closes #7582
     
    -  configure/cmake: remove unused define HAVE_FDOPEN
    +- KNOWN_BUGS: Can't use Secure Transport with Crypto Token Kit
       
    -  Closes #7276
    +  Closes #7048
     
    -- [Gergely Nagy brought this change]
    +- [Jan Verbeek brought this change]
     
    -  configure/cmake: remove checks for unused sgtty.h
    +  curl: add warning for ignored data after quoted form parameter
       
    -  Closes #7276
    -
    -- [Gergely Nagy brought this change]
    -
    -  configure/cmake: remove remaining checks for rsa.h
    +  In an argument like `-F 'x=@/etc/hostname;filename="foo"abc'` the `abc`
    +  is ignored. This adds a warning if the ignored data isn't all
    +  whitespace.
       
    -  Closes #7276
    -
    -- [Gergely Nagy brought this change]
    +  Closes #7394
     
    -  configure/cmake: remove remaining checks for err.h
    +Jay Satiro (17 Aug 2021)
    +- codeql: fix error "Resource not accessible by integration"
       
    -  Closes #7276
    -
    -- [Gergely Nagy brought this change]
    -
    -  configure/cmake: remove remaining checks for crypto.h
    +  - Enable codeql writing security-events.
       
    -  Closes #7276
    -
    -- [Gergely Nagy brought this change]
    -
    -  configure/cmake: remove checks for unused getservbyport_r
    +  GitHub set the default permissions to read, apparently since earlier
    +  this year.
       
    -  Closes #7276
    -
    -- --socks4[a]: clarify where the host name is resolved
    +  Ref: https://github.com/github/codeql-action/issues/464
    +  Ref: https://github.blog/changelog/2021-04-20-github-actions-control-permissions-for-github_token/
       
    -  Closes #7273
    +  Fixes https://github.com/curl/curl/issues/7575
    +  Closes https://github.com/curl/curl/pull/7576
     
    -- libcurl-security.3: mention file descriptors and forks
    +- tool_operate: Fix --fail-early with parallel transfers
       
    -  ... and move the security report section last.
    +  - Abort via progress callback to fail early during parallel transfers.
       
    -  Reported-by: Harry Sintonen
    -  Closes #7270
    +  When a critical error occurs during a transfer (eg --fail-early
    +  constraint) then other running transfers will be aborted via progress
    +  callback and finish with error CURLE_ABORTED_BY_CALLBACK (42). In this
    +  case, the callback error does not become the most recent error and a
    +  custom error message is used for those transfers:
    +  
    +  curld --fail --fail-early --parallel
    +  https://httpbin.org/status/404 https://httpbin.org/delay/10
    +  
    +  curl: (22) The requested URL returned error: 404
    +  curl: (42) Transfer aborted due to critical error in another transfer
    +  
    +  > echo %ERRORLEVEL%
    +  22
    +  
    +  Fixes https://github.com/curl/curl/issues/6939
    +  Closes https://github.com/curl/curl/pull/6984
     
    -- [Alex Xu (Hello71) brought this change]
    +Daniel Stenberg (17 Aug 2021)
    +- [Sergey Markelov brought this change]
     
    -  configure.ac: make non-executable
    -  
    -  it needs to be processed by autoconf or autoreconf, and doesn't have a
    -  suitable shebang to be directly executed. other projects normally set
    -  configure.ac -x.
    +  sectransp: support CURLINFO_CERTINFO
       
    -  Closes #7272
    +  Fixes #4130
    +  Closes #7372
     
    -- configure: do not strip out debug flags
    +- ngtcp2: remove the acked_crypto_offset struct field init
       
    -  To allow users to set them when invoking configure without using
    -  --with-debug.
    +  ... as it is gone from the API upstream.
       
    -  Reported-by: Alex Xu
    -  Fixes #7216
    -  Closes #7267
    +  Closes #7578
     
    -- libssh2: limit time a disconnect can take to 1 second
    +- misc: update incorrect copyright year ranges
       
    -  Closes #7271
    +  Closes #7577
     
    -- TLS: prevent shutdown loops to get stuck
    +- KNOWN_BUGS: HTTP/3 quiche upload large file fails
       
    -  ... by making sure the loops are only allowed to read the shutdown
    -  traffic a limited number of times.
    +  Closes #7532
    +
    +- KNOWN_BUGS: CMake build with MIT Kerberos does not work
       
    -  Reported-by: Harry Sintonen
    -  Closes #7271
    +  Closes #6904
    +
    +- TODO: add asynch getaddrinfo support
    +  
    +  Closes #6746
    +
    +- RELEASE-NOTES: synced
    +
    +- [Artur Sinila brought this change]
     
    -- hyper: propagate errors back up from read callbacks
    +  http2: revert call the handle-closed function correctly on closed stream
       
    -  Makes test 513 work with hyper
    +  Reverts 252790c5335a221
       
    -  Closes #7266
    +  Assisted-by: Gergely Nagy
    +  Fixes #7400
    +  Closes #7525
     
    -- KNOWN_BUGS: Negotiate on Windows fails
    +- [Patrick Monnerat brought this change]
    +
    +  auth: do not append zero-terminator to authorisation id in kerberos
       
    -  Closes #5881
    +  RFC4752 Section 3.1 states "The authorization identity is not terminated
    +  with a zero-valued (%x00) octet". Although a comment in code said it may
    +  be needed anyway, nothing confirms it. In addition, servers may consider
    +  it as part of the identity, causing a failure.
    +  
    +  Closes #7008
     
    -- KNOWN_BUGS: renames instead of locking for atomic operations
    +- [Patrick Monnerat brought this change]
    +
    +  auth: use sasl authzid option in kerberos
       
    -  Closes #6882
    -  Closes #6884
    +  ... instead of deriving it from active ticket.
    +  Closes #7008
     
    -- zuul: add two missing CI jobs
    +- [Patrick Monnerat brought this change]
    +
    +  auth: we do not support a security layer after kerberos authentication
       
    -  ... that were configured, just not run
    +  Closes #7008
    +
    +- [Patrick Monnerat brought this change]
    +
    +  auth: properly handle byte order in kerberos security message
       
    -  Closes #7261
    +  Closes #7008
     
    -Viktor Szakats (15 Jun 2021)
    -- idn: fix libidn2 with windows unicode builds
    +- [z2_ brought this change]
    +
    +  x509asn1: fix heap over-read when parsing x509 certificates
       
    -  Unicode Windows builds use UTF-8 strings internally in libcurl,
    -  so make sure to call the UTF-8 flavour of the libidn2 API. Also
    -  document that Windows builds with libidn2 and UNICODE do expect
    -  CURLOPT_URL as an UTF-8 string.
    +  Assisted-by: Patrick Monnerat
    +  Closes #7536
    +
    +- KNOWN_BUGS: Disconnects don't do verbose
       
    -  Reported-by: dEajL3kA on github
    -  Assisted-by: Jay Satiro
    -  Reviewed-by: Marcel Raad
    -  Closes #7246
    -  Fixes #7228
    +  Closes #6995
     
    -Daniel Stenberg (15 Jun 2021)
    -- curl_url_set: reject spaces in URLs w/o CURLU_ALLOW_SPACE
    +- mailmap: fixup Michał Antoniak
    +
    +- [Michał Antoniak brought this change]
    +
    +  build: fix compiler warnings
       
    -  They were never officially allowed and slipped in only due to sloppy
    -  parsing. Spaces (ascii 32) should be correctly encoded (to %20) before
    -  being part of a URL.
    +  For when CURL_DISABLE_VERBOSE_STRINGS and DEBUGBUILD flags are both
    +  active.
       
    -  The new flag bit CURLU_ALLOW_SPACE when a full URL is set, makes libcurl
    -  allow spaces.
    +  - socks.c : warning C4100: 'lineno': unreferenced formal parameter
    +    (co-authored by Daniel Stenberg)
       
    -  Updated test 1560 to verify.
    +  - mbedtls.c: warning C4189: 'port': local variable is initialized but
    +    not referenced
       
    -  Closes #7073
    -
    -- RELEASE-NOTES: synced
    +  - schannel.c: warning C4189: 'hostname': local variable is initialized
    +    but not referenced
       
    -  ... and bump to version 7.78.0 for the next planned release.
    +  Cloes #7528
     
    -Jay Satiro (15 Jun 2021)
    -- docs: Remove outdated curl tool limitation
    -  
    -  - Document that HTTP/2 multiplexing is supported by the curl tool when
    -    parallel transfers are used.
    +- [Gleb Ivanovsky brought this change]
    +
    +  CODE_STYLE-md: fix bold font style
       
    -  Supported since 7.66.0 via --parallel, but the doc wasn't updated.
    +  Markdown gets confused with abundance of asterisks, so use underscores
    +  instead.
       
    -  Closes https://github.com/curl/curl/pull/7259
    +  Reviewed-by: Daniel Gustafsson
    +  Closes #7569
     
    -- http2: Clarify 'Using HTTP2' verbose message
    -  
    -  - Change phrasing from multi-use to multiplexing since the former may
    -    not be as well understood.
    +- [Gleb Ivanovsky brought this change]
    +
    +  CODE_STYLE-md: add missing comma
       
    -  Before: * Using HTTP2, server supports multi-use
    +  Reviewed-by: Daniel Gustafsson
    +  Closes #7570
    +
    +- [Daniel Gustafsson brought this change]
    +
    +  examples/ephiperfifo.c: simplify signal handler
       
    -  After: * Using HTTP2, server supports multiplexing
    +  The signal handler registered for SIGINT is only handling SIGINT
    +  so there isn't much need for inspecting the signo.  While there,
    +  rename the handler to be more specific.
       
    -  Bug: https://github.com/curl/curl/discussions/7255
    -  Reported-by: David Hu
    +  g_should_exit should really be of sig_atomic_t type, but relying
    +  on autoconf in the examples seems like a bad idea so keep that
    +  for now.
       
    -  Closes https://github.com/curl/curl/pull/7258
    +  Reviewed-by: Daniel Stenberg
    +  Closes #7310
     
    -Daniel Stenberg (14 Jun 2021)
    -- winbuild/README: VC should be set to 6 'or larger'
    +- c-hyper: initial step for 100-continue support
       
    -  Previously it listed all versions up to 15 (missing 16) but this new
    -  phrasing is more open ended.
    +  Enabled test 154
       
    -  Reported-by: Hugh Macdonald
    -  Fixes #7253
    -  Closes #7254
    +  Closes #7568
     
    -- [Jacob Hoffman-Andrews brought this change]
    +- [Ikko Ashimine brought this change]
     
    -  rustls: remove native_roots fallback
    -  
    -  For the commandline tool, we expect to be passed
    -  SSL_CONN_CONFIG(CAfile); for library use, the use should pass a set of
    -  trusted roots (like in other TLS backends).
    -  
    -  This also removes a dependency on Security.framework when building on
    -  macOS.
    +  vtls: fix typo in schannel_verify.c
       
    -  Closes #7250
    -
    -- [Albin Vass brought this change]
    -
    -  travis: remove jobs that have migrated to zuul
    +  occurence -> occurrence
       
    -  Closes #7245
    +  Closes #7566
     
    -- [Mohammed Naser brought this change]
    +- [Emil Engler brought this change]
     
    -  CI: add jobs using Zuul
    +  curl_url_get.3: clarify about path and query
       
    -  It also includes a few changes to get the builds going:
    -  - Added autoconf to common dependencies
    -  - Added automake to common dependencies
    -  - Added libtool to common dependencies
    -  - Added libssl-dev to common dependencies
    +  The current man-page lacks some details regarding the obtained path and
    +  query.
       
    -  Co-authored-by: Albin Vass
    +  Closes #7563
    +
    +- c-hyper: fix header value passed to debug callback
       
    -  Closes #7245
    +  Closes #7567
     
    -- netrc: skip 'macdef' definitions
    +Viktor Szakats (12 Aug 2021)
    +- cleanup: URL updates
       
    -  Add test 494 to verify
    +  - replace broken URL with the one it was most probably pointing to
    +    when added (lib/tftp.c)
    +  - replace broken URL with archive.org link (lib/curl_ntlm_wb.c)
    +  - delete unnecessary protocol designator from archive.org URL
    +    (docs/BINDINGS.md)
       
    -  Reported-by: Harry Sintonen
    -  Fixes #7238
    -  Closes #7244
    +  Closes #7562
     
    -- multi: add scan-build-6 work-around in curl_multi_fdset
    -  
    -  scan-build-6 otherwise warns, saying: warning: The left operand of '>='
    -  is a garbage value otherwise, which is false.
    +Daniel Stenberg (12 Aug 2021)
    +- [April King brought this change]
    +
    +  DEPRECATE.md: linkify curl-library mailing list
       
    -  Later scan-builds don't claim this on the same code.
    +  Closes #7561
    +
    +- [Barry Pollard brought this change]
    +
    +  output.d: add method to suppress response bodies
       
    -  Closes #7248
    +  Closes #7560
     
    -- asyn-ares: remove check for 'data' in Curl_resolver_cancel
    +- TODO: remove 'c-ares deviates on http://1346569778'
       
    -  It implied it would survive a NULL in there which it won't. Instead do
    -  an assert.
    +  Fixed since 56a037cc0ad1b2 (7.77.0)
    +
    +- [Colin O'Dell brought this change]
    +
    +  BINDINGS.md: update links to use https where available
       
    -  Pointed out by scan-build.
    +  Closes #7558
    +
    +- asyn-ares.c: move all version number checks to the top
       
    -  Closes #7248
    +  ... and use #ifdef [feature] in the code as per our guidelines.
     
    -- url.c: remove two variable assigns that are never read
    +- ares: use ares_getaddrinfo()
       
    -  Pointed out by scan-build
    +  ares_getaddrinfo() is the getaddrinfo() cloned provided by c-ares, introduced
    +  in version 1.16.0.
       
    -  Closes #7248
    +  With older c-ares versions, curl invokes ares_gethostbyname() twice - once for
    +  IPv4 and once for IPv6 to resolve both addresses, and then combines the
    +  returned results.
    +  
    +  Reported-by: jjandesmet
    +  Fixes #7364
    +  Closes #7552
     
    -- [Gealber Morales brought this change]
    +- [Tatsuhiro Tsujikawa brought this change]
     
    -  mqtt: add support for username and password
    -  
    -  Minor-edits-by: Daniel Stenberg
    -  Added test 2200 to 2205
    +  ngtcp2: utilize crypto API functions to simplify
       
    -  Closes #7243
    +  Closes #7551
    +
    +- [megatronking brought this change]
     
    -- travis: remove the arm job
    +  ngtcp2: reset the oustanding send buffer again when drained
       
    -  We do it on circle CI instead
    +  Closes #7538
     
    -- CI: add .circleci/config.yml
    +Michael Kaufmann (10 Aug 2021)
    +- progress: fix a compile warning on some systems
       
    -  Assisted-by: Gabriel Simmer
    +  lib/progress.c:380:40: warning: conversion to 'long double' from
    +  'curl_off_t {aka long long int}' may alter its value [-Wconversion]
       
    -  Closes #7239
    +  Closes #7549
     
    +Daniel Stenberg (10 Aug 2021)
     - RELEASE-NOTES: synced
     
    -- runtests: init $VERSION to avoid warnings when using -l
    -
    -- openssl: don't remove session id entry in disassociate
    +- http: consider cookies over localhost to be secure
       
    -  When a connection is disassociated from a transfer, the Session ID entry
    -  should remain.
    +  Updated test31.
    +  Added test 392 to verify secure cookies used for http://localhost
       
    -  Regression since 7f4a9a9 (shipped in libcurl 7.77.0)
    -  Reported-by: Gergely Nagy
    -  Reported-by: Paul Groke
    +  Reviewed-by: Daniel Gustafsson
    +  Fixes #6733
    +  Closes #7263
    +
    +- TODO: erase secrets from heap/stack after use
       
    -  Fixes #7222
    -  Closes #7230
    +  Closes #7268
     
    -- single_transfer: ignore blank --output-dir
    +Jay Satiro (10 Aug 2021)
    +- hostip: Make Curl_ipv6works function independent of getaddrinfo
    +  
    +  - Do not assume IPv6 is not working when getaddrinfo is not present.
       
    -  ... as otherwise it creates a rather unexpected target directory with a
    -  leading slash.
    +  The check to see if IPv6 actually works is now independent of whether
    +  there is any resolver that can potentially resolve a hostname to IPv6.
       
    -  Reported-by: Harry Sintonen
    -  Fixes #7218
    -  Closes #7233
    -
    -- tests: update README about servers and port numbers
    +  Prior to this change if getaddrinfo() was not found at compile time then
    +  Curl_ipv6works() would be defined as a macro that returns FALSE.
       
    -  Closes #7242
    -
    -- conn_shutdown: if closed during CONNECT cleanup properly
    +  When getaddrinfo is not found then libcurl is built with CURLRES_IPV4
    +  defined instead of CURLRES_IPV6, meaning that it cannot do IPv6 lookups
    +  in the traditional way. With this commit if libcurl is built with IPv6
    +  support (ENABLE_IPV6) but without getaddrinfo (CURLRES_IPV6), and the
    +  IPv6 stack is actually working, then it is possible for libcurl to
    +  resolve IPv6 addresses by using DoH.
       
    -  Reported-by: Alex Xu
    -  Reported-by: Phil E. Taylor
    +  Ref: https://github.com/curl/curl/issues/7483#issuecomment-890765378
       
    -  Fixes #7236
    -  Closes #7237
    -
    -- [Christian Weisgerber brought this change]
    +  Closes https://github.com/curl/curl/pull/7529
     
    -  sws: malloc request struct instead of using stack
    +- test1565: fix windows build errors
       
    -  ... 2MB requests is otherwise just too big for some systems.
    +  - Use our wait_ms() instead of sleep() since Windows doesn't have the
    +    latter.
       
    -  (The allocations are not freed properly.)
    +  - Use a separate variable to keep track of whether the pthread_t thread
    +    id is valid.
       
    -  Bug: https://curl.se/mail/lib-2021-06/0018.html
    +  On Windows pthread_t is not an integer type. pthread offers no macro for
    +  invalid pthread_t thread id, so validity is kept track of separately.
       
    -  Closes #7235
    +  Closes https://github.com/curl/curl/pull/7527
     
    -- [Mark Swaanenburg brought this change]
    +- [Jeremy Falcon brought this change]
     
    -  lib: don't compare fd to FD_SETSIZE when using poll
    -  
    -  FD_SETSIZE is irrelevant when using poll. So ensuring that the file
    -  descriptor is smaller than FD_SETSIZE in VALID_SOCK, can cause
    -  multi_wait to ignore perfectly valid file descriptors and simply wait
    -  for 1s to avoid hammering the CPU in a busy loop.
    +  winbuild/README.md: clarify GEN_PDB option
       
    -  Fixes #7240
    -  Closes #7241
    -
    -- [zhangxiuhua brought this change]
    -
    -  doh: fix wrong DEBUGASSERT for doh private_data
    +  - Document that GEN_PDB option creates an external database.
       
    -  Closes #7227
    +  Ref: https://github.com/curl/curl/issues/7502
     
    -- [yb999 brought this change]
    +Daniel Stenberg (9 Aug 2021)
    +- [Tatsuhiro Tsujikawa brought this change]
     
    -  tests: update README.md with a missing single quote
    +  ngtcp2: replace deprecated functions with nghttp3_conn_shutdown_stream_read
       
    -  Closes #7231
    +  Closes #7546
     
    -- GHA: run all tests for hyper too
    -  
    -  As it lists disabled ones in DISABLED now
    -  
    -  Closes #7209
    +- [Tatsuhiro Tsujikawa brought this change]
     
    -- tests/data/DISABLED: add tests not working with hyper
    +  ngtcp2: rework the return value handling of ngtcp2_conn_writev_stream
       
    -  The goal is to remove them all from here over time.
    +  Rework the return value handling of ngtcp2_conn_writev_stream and treat
    +  NGTCP2_ERR_STREAM_SHUT_WR separately.
       
    -  Closes #7209
    +  Closes #7546
     
    -- runtests: also find the last test in Makefile.inc
    +- configure: error out if both ngtcp2 and quiche are specified
       
    -  Closes #7209
    +  Reported-by: Vincent Grande
    +  See #7539
    +  Closes #7545
     
    -- test3010: work with hyper mode
    -  
    -  Closes #7209
    +- [Jeff Mears brought this change]
     
    -- configure: disable RTSP when hyper is selected
    -  
    -  Makes test 1013 work
    +  easy: use a custom implementation of wcsdup on Windows
       
    -  Closes #7209
    -
    -- test1594/1595/1596: fix to work in hyper mode
    +  ... so that malloc/free overrides from curl_global_init are used for
    +  wcsdup correctly.
       
    -  Closes #7209
    +  Closes #7540
     
    -- test1438/1457: add HTTP keyword to make hyper mode work
    +- zuul: add an mbedtls3 CI job
       
    -  Closes #7209
    +  Closes #7544
     
    -- test1340/1341: adjusted for hyper mode
    -  
    -  Closes #7209
    +- [Benau brought this change]
     
    -- test1218: adjusted for hyper mode
    +  mbedTLS: initial 3.0.0 support
       
    -  Closes #7209
    +  Closes #7428
     
    -- test1216: adjusted for hyper mode
    -  
    -  Closes #7209
    +- RELEASE-NOTES: synced
     
    -- test1230: adjust to work in hyper mode
    +- configure.ac: revert bad nghttp2 library detection improvements
       
    -  Closes #7209
    -
    -- c-hyper: abort CONNECT response reading early on non 2xx responses
    +  This reverts commit b4b34db65f9f8, 673753344c5f and 29c7cf79e8b.
       
    -  Fixes test 493
    +  The logic is now back to assuming that the nghttp2 lib is called nghttp2 and
    +  nothing else.
       
    -  Closes #7209
    +  Reported-by: Rui Pinheiro
    +  Reported-by: Alex Crichton
    +  Fixes #7514
    +  Closes #7515
     
    -- test434: add HTTP keyword
    +- happy-eyeballs-timeout-ms.d: polish the wording
       
    -  Closes #7209
    +  Reported-by: Josh Soref
    +  Fixes #7433
    +  Closes #7542
     
    -- test599: adjusted to work in hyper mode
    -  
    -  Closes #7209
    +- [modbw brought this change]
     
    -- c-hyper: fix the uploaded field in progress callbacks
    -  
    -  Makes test 578 work
    +  mbedtls_threadlock: fix unused variable warning
       
    -  Closes #7209
    +  Closes #7393
     
    -- test566: adjust to work with hyper mode
    -  
    -  Closes #7209
    +- [Tatsuhiro Tsujikawa brought this change]
     
    -- [Fawad Mirza brought this change]
    +  ngtcp2: compile with the latest ngtcp2 and nghttp3
    +  
    +  Closes #7541
     
    -  CURLOPT_WRITEFUNCTION.3: minor update of the example
    +Marc Hoersken (31 Jul 2021)
    +- CI/cirrus: reduce compile time with increased parallism
       
    -  Safely avoid chunk.size garbage value if declared non globally.
    +  Cirrus CI VMs have 2 CPUs, let's use them also for Windows builds.
       
    -  Closes #7219
    +  Reviewed-by: Daniel Stenberg
    +  Closes #7505
     
    -- [Bastian Krause brought this change]
    +Daniel Stenberg (30 Jul 2021)
    +- [Bin Lan brought this change]
     
    -  configure: rename get-easy-option configure option to get-easy-options
    +  tool/tests: fix potential year 2038 issues
       
    -  "get-easy-options" is the configure option advertised by the help text
    -  anyway, so use that.
    +  The length of 'long' in a 32-bit system is 32 bits, which cannot be used
    +  to save timestamps after 2038. Most operating systems have extended
    +  time_t to 64 bits.
       
    -  Fixes #7211
    -  Closes #7213
    +  Remove the castings to long.
       
    -  Follow-up to ad691b191 ("configure: added --disable-get-easy-options")
    -  Suggested-by: Daniel Stenberg 
    -  Signed-off-by: Bastian Krause 
    +  Closes #7466
     
    -- runtests: skip disabled tests unless -f is used
    -  
    -  To make it easier to write ranges like '115 to 229' without that
    -  explicitly enabling tests that are listed in DISABLED, this makes
    -  runtests always skip disabled tests unless the -f command line option is
    -  used.
    +- compressed.d: it's a request, not an order
       
    -  Previously the code attempted to not run such tests, but didn't do it
    -  correctly.
    +  Clarified
       
    -  Closes #7212
    +  Reported-by: Dan Jacobson
    +  Reviewed-by: Daniel Gustafsson
    +  Fixes #7516
    +  Closes #7517
     
    -- [Jun-ya Kato brought this change]
    +- [Bernhard M. Wiedemann brought this change]
     
    -  ngtcp2: disable TLSv1.3 compatible mode when using GnuTLS
    -  
    -  The latest GnuTLS-3.7.2 implements disable switch for TLSv1.3 compatible
    -  mode for middle box but it is enabled by default, which is unnecessary
    -  for QUIC.
    +  tests: make three tests pass until 2037
       
    -  Fixes #6896
    -  Closes #7202
    -
    -- test644: remove as duplicate of test 587
    +  after 2038 something in test1915 fails on 32-bit OSes
       
    -  Closes #7208
    -
    -Daniel Gustafsson (8 Jun 2021)
    -- RELEASE-NOTES: synced
    +  Closes #7512
     
    -- cookies: track expiration in jar to optimize removals
    +Daniel Gustafsson (30 Jul 2021)
    +- connect: remove superfluous conditional
       
    -  Removing expired cookies needs to be a fast operation since we want to
    -  be able to perform it often and speculatively. By tracking the timestamp
    -  of the next known expiration we can exit early in case the timestamp is
    -  in the future.
    +  Commit dbd16c3e2 cleaned up the logic for traversing the addrinfos,
    +  but the move left a conditional on ai which no longer is needed as
    +  the while loop reevaluation will cover it.
       
    -  Closes: #7172
    +  Closes #7511
    +  Reviewed-by: Carlo Marcelo Arenas Belón
       Reviewed-by: Daniel Stenberg 
     
    -Daniel Stenberg (7 Jun 2021)
    -- GHA: add several libcurl tests to the hyper job
    -  
    -  500 to 512
    -
    -- test500: adjust to work with hyper mode
    -
    -- c-hyper: support CURLINFO_STARTTRANSFER_TIME
    +Daniel Stenberg (29 Jul 2021)
    +- RELEASE-NOTES: synced
       
    -  Closes #7204
    +  and bump curlver to 7.79.0 for next release
     
    -- c-hyper: support CURLOPT_HEADER
    -  
    -  When enabled, the headers are passed to the body write callback as well.
    +Marc Hoersken (29 Jul 2021)
    +- tests/*server.py: remove pidfile on server termination
       
    -  Like in test 500
    +  Avoid pidfile leaking/laying around after server already exited.
       
    -  Closes #7204
    +  Reviewed-by: Daniel Stenberg
    +  Closes #7506
     
    -- GHA: run the newly fixed tests with hyper
    +Daniel Gustafsson (27 Jul 2021)
    +- tool_main: fix typo in comment
       
    -  Closes #7205
    +  The referred to library is NSPR, so fix the switched around characters.
     
    -- test433: adjust for hyper mode
    -  
    -  Closes #7205
    +Daniel Stenberg (28 Jul 2021)
    +- [Aleksandr Krotov brought this change]
     
    -- test395: hyper cannot work around > 64 bit content-lengths like built-in
    +  bearssl: support CURLOPT_CAINFO_BLOB
       
    -  Closes #7205
    +  Closes #7468
     
    -- test394: hyper returns a different error
    +- curl.1: mention "global" flags
       
    -  Closes #7205
    -
    -- test393: make Content-Length fit within 64 bit for hyper
    +  Mention options that are "global". A global command line option is one
    +  that doesn't get reset at --next uses and therefore don't need to be
    +  used again.
       
    -  Closes #7205
    -
    -- test347: CRLFify to work in hyper mode
    +  Reported-by: Josh Soref
       
    -  Closes #7205
    +  Fixes #7457
    +  Closes #7510
     
    -- test339: CRLFify better to work in hyper mode
    +- CURLOPT_DOH_URL.3: CURLOPT_OPENSOCKETFUNCTION is not inherited
       
    -  Closes #7205
    -
    -- travis: remove the hyper build
    +  Reported-by: Daniel Woelfel
    +  Fixes #7441
    +  Closes #7509
     
    -- GHA: add a linux-hyper job
    +- KNOWN_BUGS: add more HTTP/3 problems
       
    -  Closes #7206
    +  Closes #7351
    +  Closes #7339
    +  Closes #7125
     
    -- test328: avoid a header-looking body to make hyper mode work
    +Marc Hoersken (27 Jul 2021)
    +- CI/azure: reduce compile time with increased parallism
       
    -  The test still works the same, just modified two bytes in the content.
    +  Azure Pipelines CI VMs have 2 CPUs, let's use them.
       
    -  Closes #7203
    +  Closes #7489
     
    -- release-notes.pl: also spot common 'closes' typo
    +Jay Satiro (27 Jul 2021)
    +- [Josh Soref brought this change]
     
    -- metalink: remove
    -  
    -  Warning: this will make existing curl command lines that use metalink to
    -  stop working.
    -  
    -  Reasons for removal:
    -  
    -  1. We've found several security problems and issues involving the
    -     metalink support in curl. The issues are not detailed here. When
    -     working on those, it become apparent to the team that several of the
    -     problems are due to the system design, metalink library API and what
    -     the metalink RFC says. They are very hard to fix on the curl side
    -     only.
    +  docs: fix grammar
       
    -  2. The metalink usage with curl was only very briefly documented and was
    -     not following the "normal" curl usage pattern in several ways, making
    -     it surprising and non-intuitive which could lead to further security
    -     issues.
    +  Fixes https://github.com/curl/curl/issues/7444
    +  Fixes https://github.com/curl/curl/issues/7451
    +  Fixes https://github.com/curl/curl/issues/7465
    +  Closes https://github.com/curl/curl/pull/7495
    +
    +- mail-rcpt.d: fix grammar
       
    -  3. The metalink library was last updated 6 years ago and wasn't so
    -     active the years before that either. An unmaintained library means
    -     there's a security problem waiting to happen. This is probably reason
    -     enough.
    +  Remove confusing sentence that says to specify an e-mail address for
    +  mail transfer, since that's implied.
       
    -  4. Metalink requires an XML parsing library, which is complex code (even
    -     the smaller alternatives) and to this day often gets security
    -     updates.
    +  Reported-by: Josh Soref
       
    -  5. Metalink is not a widely used curl feature. In the 2020 curl user
    -     survey, only 1.4% of the responders said that they'd are using it. In
    -     2021 that number was 1.2%. Searching the web also show very few
    -     traces of it being used, even with other tools.
    +  Fixes https://github.com/curl/curl/issues/7452
    +  Closes https://github.com/curl/curl/pull/7495
    +
    +Daniel Stenberg (27 Jul 2021)
    +- c-hyper: remove the hyper_executor_poll() loop from Curl_http
       
    -  6. The torrent format and associated technology clearly won for
    -     downloading large files from multiple sources in parallel.
    +  1. it's superfluous
    +  2. it didn't work identically to the Curl_hyper_stream one which could
    +     cause problems like #7486
       
    -  Cloes #7176
    +  Pointed-out-by: David Cook
    +  Closes #7499
     
    -- docs/INSTALL: remove mentions of configure --with-darwin-ssl
    -  
    -  ... as it isn't supported since a while back.
    +- curl-openssl.m4: check lib64 for the pkg-config file
       
    -  Make configure fail with a warning if used.
    +  OpenSSL recently started putting the libs in $prefix/lib64 on 'make
    +  install', so we check that directory for pkg-config data if the 'lib'
    +  check fails.
       
    -  Reported-by: Vadim Grinshpun
    -  Bug: https://curl.se/mail/lib-2021-06/0008.html
    -  Closes #7200
    -
    -- RELEASE-NOTES: synced
    -
    -- [Gregor Jasny brought this change]
    +  Closes #7503
     
    -  cmake: Avoid leaking absolute paths into exported config
    -  
    -  The `find_libarary` command resolves the library or framework
    -  into an absolute path. In case of system frameworks which are
    -  located within an Xcode-provided SDK this results in the Xcode
    -  path and SDK version being part of the library path.
    +- CURLOPT_SSL_CTX_*.3: tidy up the example
       
    -  Because those library paths end up in the exported CMake config
    -  importing curl will fail once the Xcode location or SDK version
    -  changes:
    +  Use the proper code style. Don't store return codes that aren't read.
    +  Copy the same example into CURLOPT_SSL_CTX_FUNCTION.3 as well.
       
    -  ```cmake
    -  set_target_properties(CURL::libcurl PROPERTIES
    -    INTERFACE_INCLUDE_DIRECTORIES "${_IMPORT_PREFIX}/include"
    -    INTERFACE_LINK_LIBRARIES "lber;ldap;/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX11.3.sdk/System/Library/Frameworks/SystemConfiguration.framework;OpenSSL::SSL;OpenSSL::Crypto;ZLIB::ZLIB"
    -  )
    -  ```
    +  Closes #7500
    +
    +- example/cookie_interface: fix scan-build printf warning
       
    -  A work-around is to link against system-level frameworks with
    -  `-framework XYZ`. In case of `SystemConfiguration` we might be able
    -  to omit the lookup-check because we could assume the framework is
    -  always present.
    +  Follow-up to 4b79c4fb565
       
    -  Closes #7152
    +  Fixes #7497
    +  Closes #7498
     
    -- [Shikha Sharma brought this change]
    +- [Josh Soref brought this change]
     
    -  http2_connisdead: handle trailing GOAWAY better
    -  
    -  When checking the connection the input processing returns error
    -  immediately, we now consider that a dead connnection.
    +  limit-rate.d: clarify base unit
       
    -  Bug: https://curl.se/mail/lib-2021-06/0001.html
    -  Closes #7192
    +  Fixes #7439
    +  Closes #7494
     
    -- [Dmitry Karpov brought this change]
    +- [Carlo Marcelo Arenas Belón brought this change]
     
    -  ares: always store IPv6 addresses first
    -  
    -  Trying dual-stack on some embedded platform, I noticed that quite
    -  frequently (20%) libCurl starts from IPv4 regardless the Happy Eyeballs
    -  timeout value.  After debugging this issue, I noticed that this happens
    -  if c-ares resolver response for IPv6 family comes before IPv4 (which was
    -  randomly happening in my tests).
    +  examples/cookie_interface: avoid printfing time_t directly
       
    -  In such cases, because libCurl puts the last resolver response on top of
    -  the address list, when IPv4 resolver response comes after IPv6 one - the
    -  IPv4 family starts the connection phase instead of IPv6 family.
    +  time_t representation is undefined and varies on bitsize and signedness,
    +  and as of C11 could be even non integer.
       
    -  The solution for this issue is to always put IPv6 addresses on top of
    -  the address list, regardless the order of resolver responses.
    +  instead of casting to unsigned long (which would truncate in systems
    +  with a 32bit long after 2106) use difftime to get the elapsed time as a
    +  double and print that (without decimals) instead.
       
    -  Bug: https://curl.se/mail/lib-2021-06/0003.html
    +  alternatively a cast to curl_off_t and its corresponding print
    +  formatting could have been used (at least in POSIX) but portability and
    +  curl agnostic code was prioritized.
       
    -  Closes #7188
    +  Closes #7490
     
    -- Revert "Revert "socketpair: fix potential hangs""
    -  
    -  This reverts commit 3e70c3430a370a31eff2c1d8fea29edaca8f1127.
    -  
    -  Thus brings back the change from #7144 as was originally landed in
    -  c769d1eab4de8b
    +Marc Hoersken (25 Jul 2021)
    +- tests/servers: remove obsolete pid variable
       
    -  Closes #7144 (again)
    -
    -- [Ebe Janchivdorj brought this change]
    -
    -  schannel: move code out of SChannel_connect_step1
    +  Variable is not used since pidfile handling moved to util.[ch]
       
    -  Reviewed-by: Marc Hoersken
    -  Closes #7168
    +  Reviewed-by: Jay Satiro
    +  Closes #7482
     
    -- tests/data/Makefile.inc: error: trailing backslash on last line
    +- tests/servers: use our platform-aware pid for server verification
       
    -  Follow-up to d8dcb399b8009d
    -
    -- TODO: Support rate-limiting for MQTT
    -
    -- [Dmitry Kostjuchenko brought this change]
    -
    -  warnless: simplify type size handling
    +  The pid used for server verification is later stored as pid2 in
    +  the hash of running test servers and therefore used for shutdown.
       
    -  By using sizeof(T), existing defines and relying on the compiler to
    -  define the required signed/unsigned mask.
    +  The pid used for shutdown must be the platform-aware (Win32) pid
    +  to avoid leaking test servers while running them using Cygwin/msys.
       
    -  Closes #7181
    +  Reviewed-by: Jay Satiro
    +  Closes #7481
     
    -Gisle Vanem (4 Jun 2021)
    -- [Win32] Fix for USE_WATT32
    +- tests/runtests.pl: cleanup copy&paste mistakes and unused code
       
    -  My Watt-32 tcp/ip stack works on Windows but it does not have `WSAIoctl()`
    +  Reviewed-by: Jay Satiro
    +  Part of #7481
     
    -Daniel Stenberg (4 Jun 2021)
    -- [Alexis Vachette brought this change]
    +Daniel Stenberg (25 Jul 2021)
    +- RELEASE-NOTES: synced
    +  
    +  bumped to 7.78.1 for next release
     
    -  url: bad CURLOPT_CONNECT_TO syntax now returns error
    +- http_proxy: clear 'sending' when the outgoing request is sent
    +  
    +  ... so that Curl_connect_getsock() will know how to wait for the socket
    +  to become readable and not writable after the entire CONNECT request has
    +  been issued.
       
    -  Added test 3020 to verify
    +  Regression added in 7.77.0
       
    -  Closes #7183
    +  Reported-by: zloi-user on github
    +  Assisted-by: Jay Satiro
    +  Fixes #7155
    +  Closes #7484
     
    -- github: remove the cmake macOS gcc-8 jobs
    -  
    -  They're too similar to the gcc-9 ones to be useful (and seems to not
    -  work anymore).
    -  
    -  Closes #7187
    +Jay Satiro (25 Jul 2021)
    +- [Josh Soref brought this change]
     
    -- test269: disable for hyper
    -  
    -  --ignore-content-length / CURLOPT_IGNORE_CONTENT_LENGTH doesn't work
    -  with hyper.
    +  openssl: fix grammar
       
    -  Closes #7184
    +  Closes https://github.com/curl/curl/pull/7480
     
    -- runtests: enable 'hyper mode' only for HTTP tests
    +- configure.ac: tweak nghttp2 library name fix again
       
    -  The 'hyper mode' makes line-ending checks work in the test suite for
    -  when hyper is used. Now it also requires that HTTP or HTTPS are
    -  mentioned as keywords to be enabled so that it doesn't wrongly adjusts
    -  tests for other protocols.
    +  - Change extraction to handle multiple library names returned by
    +    pkg-config (eg a possible scenario with pkg-config --static).
       
    -  This makes test 271 (TFTP) work again in hyper enabled builds.
    +  Ref: https://github.com/curl/curl/pull/7472
       
    -  Closes #7185
    -
    -- [Alexis Vachette brought this change]
    +  Closes https://github.com/curl/curl/pull/7485
     
    -  hostip: bad CURLOPT_RESOLVE syntax now returns error
    +Dan Fandrich (23 Jul 2021)
    +- Get rid of the unused HAVE_SIG_ATOMIC_T et. al.
       
    -  Added test 3019
    -  Fixes #7170
    -  Closes #7174
    +  It was added in 2006 but I see no evidence it was ever used.
     
    -Daniel Gustafsson (3 Jun 2021)
    -- cookies: fix typo and expand comment
    +Jay Satiro (23 Jul 2021)
    +- docs: change max-filesize caveat again
       
    -  Fix a typo in the sorting comment, and while in there elaborate slightly
    -  on why creationtime can be used as a tiebreaker.
    -
    -- cookies: remove unused header
    +  - Add protocols field to max-filesize.d.
       
    -  Commit 1c1d9f1affbd3367bcb24062e261d0ea5d185e3a removed the last use
    -  for the inet_pton.h headerfile, this removes the inclusion of the
    -  header.
    +  - Revert wording on unknown file size caveat and do not discuss specific
    +    protocols in that section.
       
    -  Closes: #7182
    -  Reviewed-by: Daniel Stenberg 
    -
    -Daniel Stenberg (3 Jun 2021)
    -- Revert "socketpair: fix potential hangs"
    +  Partial revert of ecf0225. All max-filesize options now have the list of
    +  protocols and it's clearer just to have that list without discussing
    +  specific protocols in the caveat.
       
    -  This reverts commit c769d1eab4de8b9f1bd84d992c63692fdc43c5be.
    +  Reported-by: Josh Soref
       
    -  See #7144 for details
    +  Ref: https://github.com/curl/curl/issues/7453#issuecomment-884128762
     
    -- [Paul Groke brought this change]
    +Daniel Stenberg (22 Jul 2021)
    +- [Christian Weisgerber brought this change]
     
    -  socketpair: fix potential hangs
    -  
    -  Fixes potential hang in accept by using select + non-blocking accept.
    -  
    -  Fixes potential hang in peer check by replacing the send/recv check with
    -  a getsockname/getpeername check.
    -  
    -  Adds length check for returned sockaddr data.
    +  configure: tweak nghttp2 library name fix
       
    -  Closes #7144
    -
    -- runtests: parse data/Makefile.inc instead of using make
    +  commit 29c7cf79e8b44cf (shipped in 7.78.0) introduced a problem by
    +  assuming that LIB_H2 does not have any leading whitespace.  At least
    +  OpenBSD's native pkg-config can produce such whitespace, though:
       
    -  The warning about missing entries in that file then doesn't require that
    -  the Makefile has been regenerated which was confusing.
    +      $ pkg-config --libs-only-l libnghttp2
    +       -lnghttp2
       
    -  The scan for the test num is a little more error prone than before
    -  (since now it doesn't actually verify that it is legitimate Makefile
    -  syntax), but I think it is good enough.
    +  As a result, the configure check for libnghttp2 will erroneously fail.
       
    -  Closes #7177
    +  Bug: https://curl.se/mail/lib-2021-07/0050.html
    +  Closes #7472
     
    -- [Harry Sintonen brought this change]
    +- [Bastian Krause brought this change]
     
    -  filecheck: quietly remove test-place/*~
    +  docs/MQTT: update state of username/password support
       
    -  Closes #7179
    -
    -- CURLE_SETOPT_OPTION_SYNTAX: new error name for wrong setopt syntax
    +  PR #7243 implemented username/password support for MQTT, so let's drop
    +  these items from the caveats.
       
    -  For options that pass in lists or strings that are subsequently parsed
    -  and must be correct. This broadens the scope for the option previously
    -  known as CURLE_TELNET_OPTION_SYNTAX but the old name is of course still
    -  provided as a #define for existing applications.
    +  Signed-off-by: Bastian Krause 
       
    -  Closes #7175
    +  Closes #7474
     
    -- tests: fix Accept-Encoding strips to work with Hyper builds
    -  
    -  The previous strip also removed the CR which turned problematic.
    -  
    -  valgrind.supp: add zstd suppression using hyper
    -  
    -  Reported-and-analyzed-by: Kevin Burke
    -  Fixes #7169
    -  Closes #7171
    +- [Oleg Pudeyev brought this change]
     
    -- github: timeout jobs on macOS after 90 minutes
    +  CURLMOPT_TIMERFUNCTION.3: remove misplaced "time"
       
    -  Assisted-by: Marc Hoersken
    -  Closes #7173
    +  Closes #7470
     
    -- [Harry Sintonen brought this change]
    +Version 7.78.0 (21 Jul 2021)
     
    -  mqtt: detect illegal and too large file size
    +Daniel Stenberg (21 Jul 2021)
    +- RELEASE-NOTES: synced
       
    -  Add test 3017 and 3018 to verify.
    -  Closes #7166
    +  curl 7.78.0 release
     
    -- [Abhinav Singh brought this change]
    +- winbuild/MakefileBuild.vc: bump copyright year
     
    -  cmake: add CURL_DISABLE_NTLM option
    +Jay Satiro (21 Jul 2021)
    +- docs: mention max-filesize options also apply to MQTT transfers
    +  
    +  Also make it clearer that the caveat 'if the file size is unknown it
    +  the option will have no effect' may apply to protocols other than FTP
    +  and HTTP.
    +  
    +  Reported-by: Josh Soref
       
    -  Closes #7028
    +  Fixes https://github.com/curl/curl/issues/7453
     
    -- [Abhinav Singh brought this change]
    +- [Josh Soref brought this change]
     
    -  configure: add --disable-ntlm option
    -  
    -  Closes #7028
    +  docs/cmdline: fix grammar and typos
     
    -- [Abhinav Singh brought this change]
    +- [Josh Soref brought this change]
     
    -  define: re-add CURL_DISABLE_NTLM and corresponding ifdefs
    +  dump-header.d: Drop suggestion to use for cookie storage
    +  
    +  Since --cookie-jar is the preferred way to store cookies, no longer
    +  suggest using --dump-header to do so.
       
    -  This flag will be further exposed by adding build options.
    +  Co-authored-by: Daniel Stenberg
       
    -  Reverts #6809
    -  Closes #7028
    +  Closes https://github.com/curl/curl/issues/7414
     
    -- RELEASE-NOTES: synced
    +- [Josh Soref brought this change]
     
    -Viktor Szakats (1 Jun 2021)
    -- travis: delete --enable-hsts option (it is the default now) [ci skip]
    +  doc/cmdline: fix grammar and typos
       
    -  Reviewed-by: Daniel Stenberg
    -  Closes #7167
    +  Closes https://github.com/curl/curl/pull/7454
    +  Closes https://github.com/curl/curl/pull/7455
    +  Closes https://github.com/curl/curl/pull/7456
    +  Closes https://github.com/curl/curl/pull/7459
    +  Closes https://github.com/curl/curl/pull/7460
    +  Closes https://github.com/curl/curl/pull/7461
    +  Closes https://github.com/curl/curl/pull/7462
    +  Closes https://github.com/curl/curl/pull/7463
     
    -Daniel Stenberg (1 Jun 2021)
    -- hostip: fix 3 coverity complaints
    -  
    -  Follow-up to 1a0ebf6632f889eed
    -  
    -  - Check the return code to Curl_inet_pton() in two instances, even
    -    though we know the input is valid so the functions won't fail.
    +Daniel Stenberg (20 Jul 2021)
    +- vtls: fix connection reuse checks for issuer cert and case sensitivity
       
    -  - Clear the 'struct sockaddr_in' struct before use so that the
    -    'sin_zero' field isn't left uninitialized.
    +  CVE-2021-22924
       
    -  Detected by Coverity.
    -  Assisted-by: Harry Sintonen
    -  Closes #7163
    +  Reported-by: Harry Sintonen
    +  Bug: https://curl.se/docs/CVE-2021-22924.html
     
    -- c-hyper: fix NTLM on closed connection tested with test159
    +- sectransp: check for client certs by name first, then file
       
    -  Closes #7154
    -
    -- conncache: lowercase the hash key for better match
    +  CVE-2021-22926
       
    -  As host names are case insensitive, the use of case sensitive hashing
    -  caused unnecesary cache misses and therefore lost performance. This
    -  lowercases the hash key.
    +  Bug: https://curl.se/docs/CVE-2021-22926.html
       
    +  Assisted-by: Daniel Gustafsson
       Reported-by: Harry Sintonen
    -  Fixes #7159
    -  Closes #7161
     
    -- mbedtls: make mbedtls_strerror always work
    +- telnet: fix option parser to not send uninitialized contents
       
    -  If the function doesn't exist, provide a macro that just clears the
    -  error message. Removes #ifdef uses from the code.
    +  CVS-2021-22925
       
    -  Closes #7162
    +  Reported-by: Red Hat Product Security
    +  Bug: https://curl.se/docs/CVE-2021-22925.html
     
    -- vtls: exit addsessionid if no cache is inited
    +Jay Satiro (20 Jul 2021)
    +- connect: fix wrong format specifier in connect error string
       
    -  Follow-up to b249592d29ae0
    +  0842175 (not in any release) used the wrong format specifier (long int)
    +  for timediff_t. On an OS such as Windows libcurl's timediff_t (usually
    +  64-bit) is bigger than long int (32-bit). In 32-bit Windows builds the
    +  upper 32-bits of the timediff_t were erroneously then used by the next
    +  format specifier. Usually since the timeout isn't larger than 32-bits
    +  this would result in null as a pointer to the string with the reason for
    +  the connection failing. On other OSes or maybe other compilers it could
    +  probably result in garbage values (ie crash on deref).
       
    -  Avoids NULL pointer derefs.
    +  Before:
    +  Failed to connect to localhost port 12345 after 1201 ms: (nil)
       
    -  Closes #7165
    -
    -- [Harry Sintonen brought this change]
    -
    -  Curl_ntlm_core_mk_nt_hash: fix OOM in error path
    +  After:
    +  Failed to connect to localhost port 12345 after 1203 ms: Connection refused
       
    -  Closes #7164
    +  Closes https://github.com/curl/curl/pull/7449
     
    -Michael Kaufmann (1 Jun 2021)
    -- ssl: read pending close notify alert before closing the connection
    -  
    -  This avoids a TCP reset (RST) if the server initiates a connection
    -  shutdown by sending an SSL close notify alert and then closes the TCP
    -  connection.
    +- winbuild: support alternate nghttp2 static lib name
       
    -  For SSL connections, usually the server announces that it will close the
    -  connection with an SSL close notify alert. curl should read this alert.
    -  If curl does not read this alert and just closes the connection, some
    -  operating systems close the TCP connection with an RST flag.
    +  - Support both nghttp2.lib and nghttp2_static.lib for static nghttp2.
       
    -  See RFC 1122, section 4.2.2.13
    +  nghttp2 briefly changed its static lib name to nghttp2_static, but then
    +  made the _static suffix optional.
       
    -  If curl reads the close notify alert, the TCP connection is closed
    -  normally with a FIN flag.
    +  Ref: https://github.com/nghttp2/nghttp2/pull/1394
    +  Ref: https://github.com/nghttp2/nghttp2/pull/1418
    +  Ref: https://github.com/nghttp2/nghttp2/issues/1466
       
    -  The new code is similar to existing code in the "SSL shutdown" function:
    -  try to read an alert (non-blocking), and ignore any read errors.
    +  Reported-by: Pierre Yager
       
    -  Closes #7095
    +  Fixes https://github.com/curl/curl/issues/7446
    +  Closes https://github.com/curl/curl/pull/7447
     
    -Daniel Stenberg (1 Jun 2021)
    -- [Laurent Dufresne brought this change]
    +- [Josh Soref brought this change]
     
    -  setopt: fix incorrect comments
    +  docs/cmdline: fix grammar and typos
       
    -  Closes #7157
    +  Closes https://github.com/curl/curl/pull/7432
    +  Closes https://github.com/curl/curl/pull/7436
    +  Closes https://github.com/curl/curl/pull/7438
    +  Closes https://github.com/curl/curl/pull/7440
    +  Closes https://github.com/curl/curl/pull/7445
     
    -- [Laurent Dufresne brought this change]
    +- [Josh Soref brought this change]
     
    -  mbedtls: add support for cert and key blob options
    -  
    -  CURLOPT_SSLCERT_BLOB and CURLOPT_SSLKEY_BLOB weren't usable with
    -  mbedtls backend, so the support was added.
    +  delegation.d: mention what happens when used multiple times
       
    -  Closes #7157
    +  Closes https://github.com/curl/curl/pull/7408
     
    -- [Gregor Jasny brought this change]
    +- [Josh Soref brought this change]
     
    -  cmake: try well-known send/recv signature for Apple
    -  
    -  The CMake `try_compile` command is especially slow for
    -  the Xcode generator. With this patch applied it first tests
    -  for the currently used (and Open Group specified) send/recv
    -  signature. In case this fails testing falls-back to the
    -  permutations.
    -  
    -  speed-up:
    -  
    -  ```
    -  time cmake .. -GNinja -DCMAKE_USE_SECTRANSP=ON -DHTTP_ONLY=ON -DCMAKE_USE_LIBSSH2=OFF
    -  before: 11.64s user 11.09s system 55% cpu 40.754 total
    -  after:   7.84s user 6.57s  system 51% cpu 28.074 total
    -  ```
    -  
    -  ```
    -  time cmake .. -GXcode -DCMAKE_USE_SECTRANSP=ON -DHTTP_ONLY=ON -DCMAKE_USE_LIBSSH2=OFF
    -  before: 217.07s user 104.15s system 60% cpu 8:51.79 total
    -  after:  108.76s user  51.80s system 58% cpu 4:32.58 total
    -  ```
    +  create-file-mode.d: mention what happens when used multiple times
       
    -  Closes #7158
    +  Closes https://github.com/curl/curl/pull/7407
     
    -- http2: init recvbuf struct for pushed streams
    -  
    -  Debug builds would warn that these structs were not initialized properly
    -  for pushed streams.
    -  
    -  Ref: #7148
    -  Closes #7153
    +- [Josh Soref brought this change]
     
    -- Curl_ssl_getsessionid: fail if no session cache exists
    -  
    -  This function might get called for an easy handle for which the session
    -  cache hasn't been setup. It now just returns a "miss" in that case.
    +  config.d: split comments and option-per line
       
    -  Reported-by: Christoph M. Becker
    -  Fixes #7148
    -  Closes #7153
    +  Closes https://github.com/curl/curl/pull/7405
     
    -- GOVERNANCE: add 'user', 'committer' and 'contributor'
    -  
    -  As those are commonly used terms in the project.
    -  
    -  Closes #7151
    +Daniel Stenberg (19 Jul 2021)
    +- misc: copyright year range updates
     
    -- URL-SYNTAX.md: document the new 'localhost' treatment
    +- mailmap: add Tobias and Timur
     
    -- hostip: make 'localhost' return fixed values
    -  
    -  Resolving the case insensitive host name 'localhost' now returns the
    -  addresses 127.0.0.1 and (if IPv6 is enabled) ::1 without using any
    -  resolver.
    +Daniel Gustafsson (18 Jul 2021)
    +- [Josh Soref brought this change]
    +
    +  docs: spell out directories instead of dirs in create-dirs
       
    -  This removes the risk that users accidentally resolves 'localhost' to
    -  something else. By making sure 'localhost' is always local, we can
    -  assume a "secure context" for such transfers (for cookies etc).
    +  Write out directories rather than using the dirs abbrevation. Also
    +  use plural form consistently, even if the code in the end might just
    +  create a single directory.
       
    -  Closes #7039
    +  Closes #7406
    +  Reviewed-by: Daniel Stenberg 
    +  Reviewed-by: Daniel Gustafsson 
     
    -Daniel Gustafsson (31 May 2021)
    -- docs: fix typos
    +- [Tobias Nyholm brought this change]
     
    -Daniel Stenberg (30 May 2021)
    -- hsts: ignore numberical IP address hosts
    +  docs: correct spelling errors and a broken link
       
    -  Also, use a single function library-wide for detecting if a given hostname is
    -  a numerical IP address.
    +  Update grammar and spelling in docs and source code comments.
       
    -  Reported-by: Harry Sintonen
    -  Fixes #7146
    -  Closes #7149
    +  Closes: #7427
    +  Reviewed-by: Daniel Stenberg 
     
    -- test178: adjust for hyper
    +Marc Hoersken (18 Jul 2021)
    +- CI/cirrus: install impacket from PyPI instead of FreeBSD packages
       
    -  Hyper returns the same error for wrong HTTP version as for negative
    -  content-length. Test 178 verifies that negative content-length is
    -  rejected but the hyper backend will return a different error for it (and
    -  without any helpful message telling why the message was bad). It will
    -  also not return any headers at all for the response, not even the ones
    -  that arrived before the error.
    +  Availability of impacket as FreeBSD package is too flaky.
       
    -  Closes #7147
    -
    -- HYPER: remove mentions of deprecated development branch
    -
    -- c-hyper: handle NULL from hyper_buf_copy()
    +  Stick to legacy version of cryptography which still
    +  supports OpenSSL version 1.0.2 due to FreeBSD 11.
       
    -  Closes #7143
    -
    -- HSTS: not experimental anymore
    +  Reviewed-by: Daniel Stenberg
    +  
    +  Closes #7418
     
    -- [Douglas R. Reno brought this change]
    +Daniel Stenberg (18 Jul 2021)
    +- [Josh Soref brought this change]
     
    -  INSTALL: use correct extension for CURL-DISABLE.md
    +  docs/cmdline: mention what happens when used multiple times
       
    -  In INSTALL.MD, it's currently set to CURL-DISABLE-md instead of
    -  CURL-DISABLE.md. This generates a 404 on the cURL website as well as
    -  when viewing the docs through Github.
    +  For --dns-ipv4-addr, --dns-ipv6-addr and --dns-servers
       
    -  Closes #7142
    +  Closes #7410
    +  Closes #7411
    +  Closes #7412
     
    -- travis: run tests 1 - 153 with hyper
    +- [Michał Antoniak brought this change]
     
    -- c-hyper: convert HYPERE_INVALID_PEER_MESSAGE to CURLE_UNSUPPORTED_PROTOCOL
    +  lib: fix compiler warnings with CURL_DISABLE_NETRC
       
    -  Makes test 129 work (HTTP/1.2 response).
    +  warning C4189: 'netrc_user_changed': local variable is initialized but
    +  not referenced
       
    -  Closes #7141
    -
    -- http_proxy: deal with non-200 CONNECT response with Hyper
    +  warning C4189: 'netrc_passwd_changed': local variable is initialized but
    +  not referenced
       
    -  Makes test 94 and 95 work
    +  Closes #7423
    +
    +- disable-epsv.d: remove duplicate "(FTP)"
       
    -  Closes #7141
    +  ... since the tooling adds that to the output based on the "Protocols:"
    +  tag.
     
    -- c-hyper: clear NTLM auth buffer when request is issued
    +- [Max Zettlmeißl brought this change]
    +
    +  docs: make the documentation for --etag-save match the program behaviour
    +  
    +  When using curl with the option `--etag-save` I expected it to save the
    +  ETag without its surrounding quotes, as stated by the documentation in
    +  the repository and by the generated man pages.
       
    -  To prevent previous ones to get reused on subsequent requests. Matches
    -  how the built-in HTTP code works. Makes test 90 to 93 work.
    +  My first endeavour was to fix the program, but while investigating the
    +  history of the relevant parts, I discovered that curl once saved the
    +  ETag without the quotes.  This was undone by Daniel Stenberg in commit
    +  `98c94596f5928840177b6bd3c7b0f0dd03a431af`, therefore I decided that in
    +  this case the documentation should be adjusted to match the behaviour of
    +  curl.
       
    -  Add test 90 to 93 in travis.
    +  The changed save behaviour also made parts of the `--etag-compare`
    +  documentation wrong or superfluous, so I adjusted those accordingly.
       
    -  Closes #7139
    +  Closes #7429
     
    -- [Joel Depooter brought this change]
    +- [Josh Soref brought this change]
     
    -  schannel: set ALPN length correctly for HTTP/2
    -  
    -  In a3268eca792f1 this code was changed to use the ALPN_H2 constant
    -  instead of the NGHTTP2_PROTO_ALPN constant. However, these constants are
    -  not the same. The nghttp2 constant included the length of the string,
    -  like this: "\x2h2". The ALPN_H2 constant is just "h2". Therefore we need
    -  to re-add the length of the string to the ALPN buffer.
    +  write-out.d: add missing periods
       
    -  Closes #7138
    +  Closes #7404
     
    -- travis: run tests 1-89 in the hyper build
    -  
    -  Closes #7137
    +- [Josie Huddleston brought this change]
     
    -- Revert "c-hyper: handle body on HYPER_TASK_EMPTY"
    +  easy: during upkeep, attach Curl_easy to connections in the cache
    +  
    +  During the protocol-specific parts of connection upkeep, some code
    +  assumes that the data->conn pointer already is set correctly.  However,
    +  there's currently no guarantee of that in the code.
       
    -  This reverts commit c3eefa95c31f55657f0af422e8268d738f689066.
    +  This fix temporarily attaches each connection to the Curl_easy object
    +  before performing the protocol-specific connection check on it, in a
    +  similar manner to the connection checking in extract_if_dead().
       
    -  Reported-by: Kevin Burke
    -  Fixes #7122
    -  Closes #7136
    +  Fixes #7386
    +  Closes #7387
    +  Reported-by: Josie Huddleston
     
    -- [Jon Rumsey brought this change]
    +- [Josh Soref brought this change]
     
    -  ccsidcurl: fix the compile errors
    +  cleanup: spell DoH with a lowercase o
       
    -  Looks like the declaration of cpp shoule be const char ** and return
    -  null if convert_version_info_string fails.
    +  Signed-off-by: Josh Soref 
       
    -  Fixes #7134
    -  Closes #7135
    +  Closes #7413
     
    -- [Viktor Szakats brought this change]
    +- [Josh Soref brought this change]
     
    -  docs: use --max-redirs instead of --max-redir
    +  TheArtOfHttpScripting: polish
       
    -  For consistency.
    +  - add missing backticks and comma
       
    -  Closes #7130
    -
    -- RELEASE-NOTES: synced
    +  - fix proxy description:
       
    -  ... and bump to 7.77.1
    -
    -- [Michael Forney brought this change]
    -
    -  travis: add bearssl build
    +  * example proxy isn't local
    +  * locally doesn't really make sense
       
    -  Closes #7133
    +  Closes #7416
     
    -- [Michael Forney brought this change]
    +- [Josh Soref brought this change]
     
    -  bearssl: explicitly initialize all fields of Curl_ssl
    -  
    -  Also, add comments like the other vtls backends.
    +  form.d: add examples of `,`/`;` for file[name]
       
    -  Closes #7133
    +  Fixes #7415
    +  Closes #7417
     
    -- [Michael Forney brought this change]
    +- [Michał Antoniak brought this change]
     
    -  bearssl: remove incorrect const on variable that is modified
    +  mbedtls: Remove unnecessary include
       
    -  hostname may be set to NULL later on in this function if it is an
    -  IP address.
    +  - curl_setup.h: all references to mbedtls_md4* functions and structures
    +    are in the md4.c. This file already includes the  file
    +    along with the file existence control (defined (MBEDTLS_MD4_C))
       
    -  Closes #7133
    -
    -Version 7.77.0 (26 May 2021)
    +  - curl_ntlm_core.c: unnecessary include - repeated below
    +  
    +  Closes #7419
     
    -Daniel Stenberg (26 May 2021)
     - RELEASE-NOTES: synced
     
    -- THANKS: added contributors from 7.77.0 cycle
    -
    -- copyright: update copyright year ranges to 2021
    -
    -- [Radek Zajic brought this change]
    +Jay Satiro (16 Jul 2021)
    +- [User Sg brought this change]
     
    -  hostip: fix broken macOS/CMake/GCC builds
    +  multi: fix crash in curl_multi_wait / curl_multi_poll
       
    -  Follow-up to 31f631a142d855f06
    +  Appears to have been caused by 51c0ebc (precedes 7.77.0) which added a
    +  VALID_SOCK check to one of the loops through the sockets but not the
    +  other.
       
    -  Fixes #7128
    -  Closes #7129
    -
    -- TODO: netrc caching and sharing
    +  Reported-by: sylgal@users.noreply.github.com
    +  Authored-by: sylgal@users.noreply.github.com
       
    -  URL: https://curl.se/mail/archive-2021-05/0018.html
    +  Fixes https://github.com/curl/curl/issues/7379
    +  Closes https://github.com/curl/curl/pull/7389
     
    -- [Orgad Shaneh brought this change]
    +- [Daniel Gustafsson brought this change]
     
    -  setopt: streamline ssl option code
    +  tool_help: remove unused define
       
    -  Make it use the same style as the code next to it
    +  The PRINT_LINES_PAUSE macro is no longer used, and has been mostly
    +  cleaned out but one occurrence remained.
       
    -  Closes #7123
    +  Closes https://github.com/curl/curl/pull/7380
     
    -- [Radek Zajic brought this change]
    +- [Sergey Markelov brought this change]
     
    -  lib/hostip6.c: make NAT64 address synthesis on macOS work
    +  build: fix compiler warnings when CURL_DISABLE_VERBOSE_STRINGS
    +  
    +  fix compiler warnings about unused variables and parameters when
    +  built with --disable-verbose.
       
    -  Closes #7121
    +  Closes https://github.com/curl/curl/pull/7377
     
    -- [ejanchivdorj brought this change]
    +- [Andrea Pappacoda brought this change]
     
    -  sectransp: fix EXC_BAD_ACCESS caused by uninitialized buffer
    -  
    -  When the SecCertificateCopyCommonName function fails, it leaves
    -  common_name in a invalid state so CFStringCompare uses the invalid
    -  result, causing EXC_BAD_ACCESS.
    +  build: fix IoctlSocket FIONBIO check
       
    -  The fix is to check the return value of the function before using the
    -  name.
    +  Prior to this change HAVE_IOCTLSOCKET_CAMEL_FIONBIO mistakenly checked
    +  for (lowercase) ioctlsocket when it should have checked for IoctlSocket.
       
    -  Closes #7126
    +  Closes https://github.com/curl/curl/pull/7375
     
    -- [Paweł Wegner brought this change]
    +- [Timur Artikov brought this change]
     
    -  CMake: add CURL_ENABLE_EXPORT_TARGET option
    +  configure: fix nghttp2 library name for static builds
       
    -  install(EXPORT ...) causes trouble when embedding curl dependencies
    -  which don't provide install(EXPORT ...) targets (e.g libressl and
    -  nghttp2) with cmake's add_subdirectory.
    +  Don't hardcode the nghttp2 library name,
    +  because it can vary, be "nghttp2_static" for example.
       
    -  Reviewed-by: Jakub Zakrzewski
    -  Closes #7060
    +  Fixes https://github.com/curl/curl/issues/7367
    +  Closes https://github.com/curl/curl/pull/7368
     
    -- [Alessandro Ghedini brought this change]
    +Gisle Vanem (16 Jul 2021)
    +- [PellesC] fix _lseeki64() macro
     
    -  quiche: update for network path aware API
    +- [SChannel] Use '_tcsncmp()' instead
       
    -  Latest version of quiche requires the application to pass the peer
    -  address of received packets, and it provides the address for outgoing
    -  packets back.
    +  Revert previous change for PellesC.
       
    -  Closes #7120
    +  Instead replace all use of `_tcsnccmp()` with `_tcsncmp()`.
     
    -- [Jacob Hoffman-Andrews brought this change]
    +- [PellesC] missing '_tcsnccmp'
    +  
    +  PellesC compiler does not have this macro in it's ``
     
    -  rustls: switch read_tls and write_tls to callbacks
    +Daniel Gustafsson (14 Jul 2021)
    +- TODO: add mention of mbedTLS 3 incompatibilities
       
    -  And update to 0.6.0, including a rename from session to connection for
    -  many fields.
    +  Wyatt OʼDay reported in #7385 that mbedTLS isn't backwards compatible
    +  and curl no longer builds with it. Document the need to fix our support
    +  until so has been done.
       
    -  Closes #7071
    -
    -- [Koichi Shiraishi brought this change]
    +  Closes #7390
    +  Fixes #7385
    +  Reported-by: Wyatt OʼDay
    +  Reviewed-by: Jay Satiro 
     
    -  sectransp: fix 7f4a9a9b2a49 commit about missing comma
    +- docs: fix inconsistencies in EGDSOCKET documentation
       
    -  Follow-up to 7f4a9a9b2a495
    +  Only the OpenSSL backend actually use the EGDSOCKET, and also use
    +  TLS consistently rather than mixing SSL and TLS. While there, also
    +  fix a minor spelling nit.
       
    -  Closes #7119
    +  Closes: #7391
    +  Reviewed-by: Jay Satiro 
     
    -- [Harry Sintonen brought this change]
    +- [Борис Верховский brought this change]
     
    -  openssl: associate/detach the transfer from connection
    +  docs: document missing arguments to commands
       
    -  CVE-2021-22901
    +  This is a followup to commit f410b9e538129e77607fef1 fixing a few
    +  more commands which takes arguments.
       
    -  Bug: https://curl.se/docs/CVE-2021-22901.html
    +  Closes #7382
    +  Reviewed-by: Daniel Gustafsson 
     
    -- [Harry Sintonen brought this change]
    +- [Randolf J brought this change]
     
    -  telnet: check sscanf() for correct number of matches
    +  docs: fix incorrect argument name reference
       
    -  CVE-2021-22898
    +  The documentation for the read callback was erroneously referencing
    +  the nitems argument by nmemb.  The error was introduced in commit
    +  ce0881edee3c7.
       
    -  Bug: https://curl.se/docs/CVE-2021-22898.html
    +  Closes #7383
    +  Reviewed-by: Daniel Gustafsson 
     
    -- schannel: don't use static to store selected ciphers
    -  
    -  CVE-2021-22897
    +- [Борис Верховский brought this change]
    +
    +  tool_help: Document that --tlspassword takes a password
       
    -  Bug: https://curl.se/docs/CVE-2021-22897.html
    +  Closes #7378
    +  Reviewed-by: Daniel Stenberg 
     
    -- docs/tests: remove freenode references
    +- scripts: Fix typo in release-notes instructions
    +  
    +  The command to run had a typo in the pathname which prevented copy
    +  pasting it to work, which has annoyed me enough to fix this now.
     
     - RELEASE-NOTES: synced
     
    -- [Sergey Markelov brought this change]
    -
    -  NSS: make colons, commas and spaces valid separators in cipher list
    +Jay Satiro (10 Jul 2021)
    +- write-out.d: Clarify urlnum is not unique for de-globbed URLs
       
    -  Fixes #7110
    -  Closes #7115
    -
    -- curl: include libmetalink version in --version output
    +  Reported-by: Коваленко Анатолий Викторович
       
    -  Closes #7112
    +  Fixes https://github.com/curl/curl/issues/7342
    +  Closes https://github.com/curl/curl/pull/7369
     
    -Jay Satiro (21 May 2021)
    -- [Matias N. Goldberg brought this change]
    +Daniel Gustafsson (3 Jul 2021)
    +- [William Desportes brought this change]
     
    -  cmake: Use multithreaded compilation on VS 2008+
    -  
    -  Multithreaded compilation has been supported since at least VS 2005 and
    -  been robustly stable since at least VS 2008
    +  docs: Fix typos
       
    -  Closes https://github.com/curl/curl/pull/7109
    +  Closes: #7370
    +  Reviewed-by: Daniel Gustafsson 
     
    -Daniel Stenberg (21 May 2021)
    -- [Matias N. Goldberg brought this change]
    +Daniel Stenberg (8 Jul 2021)
    +- [Jonathan Wernberg brought this change]
     
    -  cmake: fix two invokes result in different curl_config.h
    +  Revert "ftp: Expression 'ftpc->wait_data_conn' is always false"
       
    -  Fixes #7100
    -  Closes #7101
    +  The reverted commit introduced a logic error in code that was
    +  correct.
       
    -  Reviewed-by: Jakub Zakrzewski
    -  Signed-off-by: Matias N. Goldberg 
    -
    -- [Peng-Yu Chen brought this change]
    -
    -  cmake: detect CURL_SA_FAMILY_T
    +  The client using libcurl would notice the error since FTP file
    +  uploads in active transfer mode would somtimes complete with
    +  success despite no transfer having been performed and the
    +  "uploaded" file thus not being on the remote server afterwards.
       
    -  Fixes #7049
    -  Closes #7065
    -
    -- [Lucas Clemente Vella brought this change]
    -
    -  CURLOPT_IPRESOLVE: preventing wrong IP version from being used
    +  The FTP server would notice the error because it receives a
    +  RST on the data connection it has established with the client
    +  before any data was transferred at all.
       
    -  In some situations, it was possible that a transfer was setup to
    -  use an specific IP version, but due do DNS caching or connection
    -  reuse, it ended up using a different IP version from requested.
    +  The logic error happens if the STOR response from the server have
    +  arrived by the time ftp_multi_statemach() in the affected code path
    +  is called, but the incoming data connection have not arrived yet.
    +  In that case, the processing of the STOR response will cause
    +  'ftpc->wait_data_conn' to be set to TRUE, contradicting the comment
    +  in the code. Since 'complete' will also be set, later logic would
    +  believe the transfer was done.
       
    -  This commit changes the effect of CURLOPT_IPRESOLVE from simply
    -  restricting address resolution to preventing the wrong connection
    -  type being used, when choosing a connection from the pool, and
    -  to restricting what addresses could be used when establishing
    -  a new connection.
    +  In most cases, the STOR response will not have arrived yet when
    +  the affected code path is executed, or the incoming connection will
    +  also have arrived, and thus the error would not express itself.
    +  But if the speed difference of the device using libcurl and the
    +  FTP server is exactly right, the error may happen as often as in
    +  one out of hundred file transfers.
       
    -  It is important that all addresses versions are resolved, even if
    -  not used in that transfer in particular, because the result is
    -  cached, and could be useful for a different transfer with a
    -  different CURLOPT_IPRESOLVE setting.
    +  This reverts commit 49f3117a238b6eac0e22a32f50699a9eddcb66ab.
       
    -  Closes #6853
    -
    -- [Oliver Urbann brought this change]
    +  Bug: https://curl.se/mail/lib-2021-07/0025.html
    +  Closes #7362
     
    -  AmigaOS: add functions definitions for SHA256
    +- msnprintf: return number of printed characters excluding null byte
       
    -  AmiSSL replaces many functions with macros. Curl requires pointer
    -  to some of these functions. Thus, we have to encapsulate these macros:
    -  SHA256_Init, SHA256_Update, SHA256_Final, X509_INFO_free.
    +  ... even when the output is "capped" by the maximum length argument.
       
    -  Bug: https://github.com/jens-maus/amissl/issues/15
    -  Co-authored-by: Daniel Stenberg 
    +  Clarified in the docs.
       
    -  Closes #7099
    +  Closes #7361
     
    -- test2100: make it run with and require IPv6
    +- infof: remove newline from format strings, always append it
       
    -  Closes #7083
    -
    -- tests/getpart: generate output URL encoded for better diffs
    +  - the data needs to be "line-based" anyway since it's also passed to the
    +    debug callback/application
       
    -  Closes #7083
    -
    -- [Ryan Beck-Buysse brought this change]
    -
    -  docs/TheArtOfHttpScripting: fix markdown links
    +  - it makes infof() work like failf() and consistency is good
       
    -  extra parens cause the links to be incorrectly formatted
    -  and inconsistent with the rest of the document.
    +  - there's an assert that triggers on newlines in the format string
       
    -  Signed-off-by: Ryan Beck-Buysse 
    -  Closes #7097
    -
    -- RELEASE-NOTES: synced
    -
    -- [Emil Engler brought this change]
    -
    -  docs: replace dots with dashes in markdown enums
    +  - Also removes a few instances of "..."
       
    -  We use dashes instead of dots nearly everywhere except for those few
    -  cases. This commit addresses this issues and brings more coherency into
    -  it.
    +  - Removes the code that would append "..." to the end of the data *iff*
    +    it was truncated in infof()
       
    -  Closes #7093
    -
    -- [Emil Engler brought this change]
    +  Closes #7357
     
    -  docs: improve INTERNALS.md regarding getsock cb
    +- examples/multi-single: fix scan-build warning
       
    -  This adds the I/O prefix to indicate that those "actions" are kind-of
    -  related to those found in select(2) or poll(2) (reading/writing).
    +  warning: Value stored to 'mc' during its initialization is never read
       
    -  It also adds a note where the prototypes of those functions can be found
    -  in the source code.
    +  Follow-up to ae8e11ed5fd2ce
       
    -  Closes #7092
    -
    -- [Emil Engler brought this change]
    +  Closes #7360
     
    -  docs: document attach in INTERNALS.md
    +- wolfssl: failing to set a session id is not reason to error out
    +  
    +  ... as it is *probably* just timed out.
       
    -  The new field in the Curl_handler struct still lacks documentation. This
    -  adds it it from the information extracted from lib/urldata.h:797
    +  Reported-by: Francisco Munoz
       
    -  Closes #7091
    +  Closes #7358
     
    -- [Marc Aldorasi brought this change]
    +- docs/examples: use curl_multi_poll() in multi examples
    +  
    +  The API is soon two years old and deserves being shown as the primary
    +  way to drive multi code as it makes it much easier to write code.
    +  
    +  multi-poll: removed
    +  
    +  multi-legacy: add to show how we did multi API use before
    +  curl_multi_wait/poll.
    +  
    +  Closes #7352
     
    -  config: remove now-unused macros
    +- KNOWN_BUGS: flaky Windows CI builds
       
    -  Closes #7094
    +  Closes #6972
     
    -- [Marc Aldorasi brought this change]
    +- RELEASE-NOTES: synced
     
    -  hostip.h: remove declaration of unimplemented function
    +- test1147: hyper doesn't allow "crazy" request headers like built-in
       
    -  Closes #7094
    +  ... so strip that from the test.
    +  
    +  Closes #7349
     
    -- h3: add 'attach' callback to protocol handlers
    +- c-hyper: bail on too long response headers
       
    -  Follow-up to 0c55fbab45be
    +  To match with built-in behaviors. Makes test 1154 work.
    +  
    +  Closes #7350
    +
    +- test1151: added missing CRLF to work with hyper
       
    -  Reviewed-by: Emil Engler
    -  Closes #7090
    +  Closes #7350
     
    -- wolfssl: remove SSLv3 support leftovers
    +- c-hyper: add support for transfer-encoding in the request
       
    -  Closes #7088
    +  Closes #7348
     
    -- curl-wolfssl.m4: without custom include path, assume /usr/include
    +- [Andrea Pappacoda brought this change]
    +
    +  cmake: remove libssh2 feature checks
       
    -  ... so that we can point out the root of the OpenSSL emulation headers.
    -  Previously this used the '$includedir' variable which is wrong since
    -  that defaults to the dir where the current configure invoke will install
    -  the built libcurl headers: /usr/local by default.
    +  libssh2 features are detected based on version since commit
    +  9dbbba997608f7c3c5de1c627c77c8cd2aa85b73
       
    -  Fixes #7085
    -  Reported-by: Joel Jakobsson
    -  Closes #7087
    +  Closes #7343
     
    -- [Joel Depooter brought this change]
    +- test1116: hyper doesn't pass through "surprise-trailers"
    +  
    +  Closes #7344
     
    -  data_pending: check only SECONDARY socket for FTP(S) transfers
    +- socks4: scan for the IPv4 address in resolve results
       
    -  Check the FIRST for all other protocols.
    +  Follow-up to 84d2839740 which changed the resolving to always resolve
    +  both address families, but since SOCKS4 only supports IPv4 it should
    +  scan for and use the first available IPv4 address.
       
    -  This fixes a timeout in an ftps download. The server sends a TLS
    -  close_notify message in the same packet as the file data. The
    -  close_notify seems to not be handled in the schannel_recv function, so
    -  libcurl is not aware that the server has closed the connection. Thus
    -  libcurl ends up waiting for action on the socket until a timeout is
    -  reached. With the secondary socket check added to the data_pending
    -  function, the close_notify is properly handled, and the ftps transfer
    -  terminates as expected.
    +  Reported-by: shithappens2016 on github
    +  Fixes #7345
    +  Closes #7346
    +
    +Jay Satiro (5 Jul 2021)
    +- proto.d: fix formatting for paragraphs after margin changes
       
    -  Fixes #7068
    -  Closes #7069
    +  Closes https://github.com/curl/curl/pull/7341
     
    -- github: inhibit deprecated declarations for clang on macOS
    +- pinnedpubkey.d: fix formatting for version support lists
       
    -  ... as they otherwise cause ldap build errors in the CI.
    +  Closes https://github.com/curl/curl/pull/7340
    +
    +Daniel Stenberg (2 Jul 2021)
    +- TODO: "Support in-memory certs/ca certs/keys" done
       
    -  Fixes #7081
    -  Closes #7082
    +  Has been suppored for a while now with the *BLOB options.
     
    -- conn: add 'attach' to protocol handler, make libssh2 use it
    +- examples: safer and more proper read callback logic
    +  
    +  The same callback code is used in:
    +  
    +   imap-append.c
    +   smtp-authzid.c
    +   smtp-mail.c
    +   smtp-multi.c
    +   smtp-ssl.c
    +   smtp-tls.c
       
    -  The libssh2 backend has SSH session associated with the connection but
    -  the callback context is the easy handle, so when a connection gets
    -  attached to a transfer, the protocol handler now allows for a custom
    -  function to get used to set things up correctly.
    +  It should not assume that it can copy full lines into the buffer as it
    +  will encourage sloppy coding practices. Instead use byte-wise logic and
    +  check/acknowledge the buffer size appropriately.
       
    -  Reported-by: Michael O'Farrell
    -  Fixes #6898
    -  Closes #7078
    +  Reported-by: Harry Sintonen
    +  Fixes #7330
    +  Closes #7331
     
    -- http2: make sure pause is done on HTTP
    -  
    -  Since the function is called for any protocol, we can't assume that the
    -  HTTP struct is there without first making sure it is HTTP.
    +- test1519: adjusted to work with hyper
       
    -  Reported-by: Denis Goleshchikhin
    -  Fixes #7079
    -  Closes #7080
    +  Closes #7333
     
    -- docs: cookies from HTTP headers need domain set
    -  
    -  ... or the cookies won't get sent. Push users to using the "Netscape"
    -  format instead, which curl uses when saving a cookie "jar".
    +- test1518: adjusted to work with hyper
       
    -  Reported-by: Martin Dorey
    -  Reviewed-by: Daniel Gustafsson
    -  Fixes #6723
    -  Closes #7077
    -
    -- RELEASE-NOTES: synced
    -
    -- github: add a workflow with libssh2 on macOS using cmake
    +  ... by making sure the stdout output doesn't look like HTTP headers.
       
    -  Closes #7047
    +  Closes #7333
     
    -- sws: allow HTTP requests up to 2MB in size
    -  
    -  To allow tests with slightly larger payloads. Like #7071 ...
    +- test1514: add a CRLF to the response to make it correct
       
    -  Closes #7075
    -
    -Marc Hoersken (16 May 2021)
    -- CI/azure: increase verbosity and fix outdated task names
    +  Makes hyper accept it fine instead returning HYPERE_UNEXPECTED_EOF on
    +  us.
       
    -  Closes #7063
    +  Closes #7334
     
    -- CI/cirrus: add shared and static Windows release builds
    +- formdata: avoid "Argument cannot be negative" warning
       
    -  Azure Pipelines is currently being used for debug builds,
    -  let's also run some non-debug (release) Windows builds and
    -  make use of previously underutilized Cirrus CI for that.
    +  ... when converting a curl_off_t to size_t, by using
    +  CURL_ZERO_TERMINATED before passing the argument to the function.
       
    -  Reviewed-by: Marcel Raad
    +  Detected by Coverity CID 1486590.
       
    -  Closes #6991
    +  Closes #7328
    +  Assisted-by: Daniel Gustafsson
     
    -Daniel Stenberg (16 May 2021)
    -- CURLOPT_CAPATH.3: defaults to a path, not NULL
    +- lib: more %u for port and int for %*s fixes
       
    -  Reported-by: Andrew Barnert
    +  Detected by Coverity
       
    -  Closes #7062
    +  Closes #7329
     
    -- [Jacob Hoffman-Andrews brought this change]
    +- doh: (void)-prefix call to curl_easy_setopt
     
    -  c-hyper: handle body on HYPER_TASK_EMPTY
    -  
    -  Some of the time, we get a HYPER_TASK_EMPTY response before the status
    -  line, headers, and body have been read. Previously, that would cause us
    -  to poll again, leading to a 1 second timeout.
    -  
    -  The HYPER_TASK_EMPTY docs say:
    -  
    -     The value of this task is null (does not imply an error).
    +- lib: fix type of len passed to *printf's %*s
       
    -  So, if we receive a HYPER_TASK_EMPTY, continue on with processing the
    -  response.
    +  ... it needs to be 'int'. Detected by Coverity CID 1486611 (etc)
       
    -  Reported-by: Kevin Burke
    -  Fixes #7064
    -  Closes #7070
    -
    -- [Ikko Ashimine brought this change]
    +  Closes #7326
     
    -  tool_getparam: fix comment typo in tool_getparam.c
    +- lib: use %u instead of %ld for port number printf
       
    -  enfore -> enforce
    +  Follow-up to 764c6bd3bf which changed the type of some port number
    +  fields. Detected by Coverity (CID 1486624) etc.
       
    -  Closes #7074
    +  Closes #7325
     
    -- mem-include-scan.pl: require a non-word letter before memory funcs
    +- version: turn version number functions into returning void
       
    -  ... so that ldap_memfree() for example doesn't match the scan for free.
    +  ... as we never use the return codes from them.
       
    -  Closes #7061
    +  Reviewed-by: Daniel Gustafsson
    +  Closes #7319
     
    -- version: free the openldap info correctly
    +- mqtt: extend the error message for no topic
       
    -  ... to avoid memory leaks.
    +  ... and mention that it needs URL encoding.
       
    -  Follow-up to: bf0feae7768d9
    -  Closes #7061
    +  Reported-by: Peter Körner
    +  Fixes #7316
    +  Closes #7317
     
    -- dupset: remove totally off comment
    +- formdata: correct typecast in curl_mime_data call
       
    -  Closes #7067
    -
    -- configure: if asked for, fail if ldap is not found
    +  Coverity pointed out it the mismatch. CID 1486590
       
    -  Reported-by: Jakub Zakrzewski
    -  Fixes #7053
    -  Closes #7055
    +  Closes #7327
     
    -- version: add OpenLDAP version in the output
    +- url: (void)-prefix a curl_url_get() call
       
    -  Assisted-by: Howard Chu
    -  Closes #7054
    -
    -Jay Satiro (13 May 2021)
    -- [Joel Depooter brought this change]
    +  Coverity (CID 1486645) pointed out a use of curl_url_get() in the
    +  parse_proxy function where the return code wasn't checked. A
    +  (void)-prefix makes the intention obvious.
    +  
    +  Closes #7320
     
    -  schannel: Ensure the security context request flags are always set
    +- glob: pass an 'int' as len when using printf's %*s
       
    -  As of commit 54e7475, these flags would only be set when using a new
    -  credential handle. When re-using an existing credential handle, the
    -  flags would not be set.
    +  Detected by Coverity CID 1486629.
       
    -  Closes https://github.com/curl/curl/pull/7051
    -
    -Dan Fandrich (12 May 2021)
    -- tests: Fix some tag matching issues in a number of tests
    +  Closes #7324
     
    -Daniel Stenberg (12 May 2021)
    -- sasl: use 'unsigned short' to store mechanism
    +- vtls: use free() not curl_free()
       
    -  ... saves a few bytes of struct size in memory and it only uses
    -  10 bits anyway.
    +  curl_free() is provided for users of the API to free returned data,
    +  there's no need to use it internally.
       
    -  Closes #7045
    +  Closes #7318
     
    -- hostip: remove the debug code for LocalHost
    +- zuul: use the new rustls directory name
       
    -  The Curl_resolv() had special code (when built in debug mode) for when
    -  resolving the host name "LocalHost" (using that exact casing). It would
    -  then get the host name from the --interface option instead.
    +  Follow-up to 6d972c8b1cbb3 which missed updating this directory name.
       
    -  This development-only feature was not used by anything (anymore) and we
    -  have the --resolve feature if we want to play similar tricks properly
    -  going forward.
    +  Also no longer call it crustls in the docs and bump to rusttls-ffi 0.7.1
       
    -  Closes #7044
    +  Closes #7311
     
    -- progress: reset limit_size variables at transfer start
    +Jay Satiro (29 Jun 2021)
    +- http: fix crash in rate-limited upload
       
    -  Otherwise the old value would linger from a previous use and would mess
    -  up the network speed cap logic.
    +  - Don't set the size of the piece of data to send to the rate limit if
    +    that limit is larger than the buffer size that will hold the piece.
       
    -  Reported-by: Ymir1711 on github
    +  Prior to this change if CURLOPT_MAX_SEND_SPEED_LARGE
    +  (curl tool: --limit-rate) was set then it was possible that a temporary
    +  buffer used for uploading could be written to out of bounds. A likely
    +  scenario for this would be a non-trivial amount of post data combined
    +  with a rate limit larger than CURLOPT_UPLOAD_BUFFERSIZE (default 64k).
       
    -  Fixes #7042
    -  Closes #7043
    -
    -- RELEASE-NOTES: synced
    -
    -- [Daniel Gustafsson brought this change]
    -
    -  cookies: use CURLcode for cookie_output reporting
    +  The bug was introduced in 24e469f which is in releases since 7.76.0.
       
    -  Writing the cookie file has multiple error conditions, and was using an
    -  int with magic numbers to report the different error (which in turn were
    -  disregarded anyways). This moves reporting to use a CURLcode value.
    +  perl -e "print '0' x 200000" > tmp
    +  curl --limit-rate 128k -d @tmp httpbin.org/post
       
    -  Lightly-touched-by: Daniel Stenberg
    +  Reported-by: Richard Marion
       
    -  Closes #7037
    -  Closes #6749
    -
    -- [Daniel Gustafsson brought this change]
    +  Fixes https://github.com/curl/curl/issues/7308
    +  Closes https://github.com/curl/curl/pull/7315
     
    -  cookies: make use of string duplication function
    +Daniel Stenberg (29 Jun 2021)
    +- copyright: add boiler-plate headers to CI config files
       
    -  strstore() is defined as a strdup which ensures to free the target
    -  pointer before duping the source char * into it. Make use of it in
    -  two more cases where it can simplify the code.
    -
    -- [Daniel Gustafsson brought this change]
    -
    -  cookies: refactor comments
    +  And whitelist .zuul.ignore
       
    -  Comments in the cookie code were a bit all over the place in terms of
    -  style and wording. This takes a stab at cleaning them up by keeping to
    -  a single style and overall shape. Some comments are moved a little and
    -  some removed alltogether due to being redundant. No functional changes
    -  have been made,
    -
    -- [Peng-Yu Chen brought this change]
    +  Closes #7314
     
    -  http2: skip immediate parsing of payload following protocol switch
    -  
    -  This is considered not harmful as a following http2_recv shall be
    -  called very soon.
    +- CI: remove travis details
       
    -  This is considered helpful in the specific situation where some
    -  servers (e.g. nghttpx v1.43.0) may fulfill stream 1 immediately
    -  following the return of HTTP status 101, other than waiting for
    -  the client-side connection preface to arrive.
    +  Rename still used leftovers to "zuul" as that's now the CI using them.
       
    -  Fixes #7036
    -  Closes #7040
    +  Closes #7313
     
    -- [Peng-Yu Chen brought this change]
    +- RELEASE-NOTES: synced
     
    -  http2: use nghttp2_session_upgrade2 instead of nghttp2_session_upgrade
    -  
    -  Following the upstream deprecation of nghttp2_session_upgrade.
    -  
    -  Also provides further checks for requests with the HEAD method.
    +- openssl: avoid static variable for seed flag
       
    -  Closes #7041
    -
    -- progress/trspeed: use a local convenient pointer to beautify code
    +  Avoid the race condition risk by instead storing the "seeded" flag in
    +  the multi handle. Modern OpenSSL versions handle the seeding itself so
    +  doing the seeding once per multi-handle instead of once per process is
    +  less of an issue.
       
    -  The function becomes easier to read and understand with less repetition.
    -
    -- trspeed: use long double for transfer speed calculation
    +  Reported-by: Gerrit Renker
    +  Fixes #7296
    +  Closes #7306
     
    -- progress: move transfer speed calc into function
    +- configure: inhibit the implicit-fallthrough warning on gcc-12
       
    -  This silences two scan-build-11 warnings: "The result of the '/'
    -  expression is undefined"
    +  ... since it no longer acknowledges the comment markup we use for that
    +  purpose.
       
    -  Bug: https://curl.se/mail/lib-2021-05/0022.html
    -  Closes #7035
    -
    -- [Cameron Cawley brought this change]
    +  Reported-by: Younes El-karama
    +  Fixes #7295
    +  Closes #7307
     
    -  openssl: remove unneeded cast for CertOpenSystemStore()
    -  
    -  Closes #7025
    +Daniel Gustafsson (28 Jun 2021)
    +- [Andrei Rybak brought this change]
     
    -- travis: disable the libssh build
    -  
    -  It can't run on focal and causes warnings on bionic. Since the focal
    -  failure started rather suddenly a while ago, we can suspect it might be
    -  temporary.
    +  misc: fix typos in comments which repeat a word
       
    -  Added "bring back the build" to the TODO document.
    +  Fix typos in code comments which repeat various words.  In trivial
    +  cases, just delete the repeated word.  Reword the affected sentence in
    +  "lib/url.c" for it to make sense.
       
    -  Fixes #7011
    -  Closes #7012
    -
    -- [Peng-Yu Chen brought this change]
    +  Closes #7303
    +  Reviewed-by: Daniel Gustafsson 
     
    -  http: use calculated offsets inst of integer literals for header parsing
    -  
    -  Assumed to be a minor coding style improvement with no behavior change.
    +Daniel Stenberg (27 Jun 2021)
    +- lib677: make it survive torture testing
       
    -  A modern compiler is expected to have the calculation optimized during
    -  compilation. It may be deemed okay even if that's not the case, since
    -  the added overhead is considered very low.
    +  Follow-up to a5ab72d5edd7
       
    -  Closes #7032
    -
    -- [Peng-Yu Chen brought this change]
    +  Closes #7300
     
    -  GIT-INFO: suggest using autoreconf instead of buildconf
    -  
    -  Follow-up to 85868537d
    -  
    -  Closes #7033
    +- [Tommy Chiang brought this change]
     
    -- http: deal with partial CONNECT sends
    -  
    -  Also added 'CURL_SMALLSENDS' to make Curl_write() send short packets,
    -  which helped verifying this even more.
    +  docs/BINDINGS: fix outdated links
       
    -  Add test 363 to verify.
    +  * luacurl page is now not accessible, fix it with wayback machine page
    +  * Scheme one seems not providing https now, change it back to http one
       
    -  Reported-by: ustcqidi on github
    -  Fixes #6950
    -  Closes #7024
    +  Closes #7301
     
    -- HTTP3: make the ngtcp2 build use the quictls fork
    -  
    -  ... as ngtcp2 itself documents the build this way.
    -  
    -  Closes #7031
    +- [Jacob Hoffman-Andrews brought this change]
     
    -- http: limit the initial send amount to used upload buffer size
    -  
    -  Previously this logic would cap the send to CURL_MAX_WRITE_SIZE bytes,
    -  but for the situations where a larger upload buffer has been set, this
    -  function can benefit from sending more bytes. With default size used,
    -  this does the same as before.
    -  
    -  Also changed the storage of the size to an 'unsigned int' as it is not
    -  allowed to be set larger than 2M.
    +  curstls: bump crustls version and use new URL
       
    -  Also added cautions to the man pages about changing buffer sizes in
    -  run-time.
    +  crustls moved to https://github.com/rustls/rustls-ffi. This also bumps
    +  the expected version to 0.7.0.
       
    -  Closes #7022
    +  Closes #7297
     
     - RELEASE-NOTES: synced
     
    -- ngtcp2: fix the cb_acked_stream_data_offset proto
    -  
    -  The 'datalen' value should be 64 bit, not size_t!
    +- examples: length-limit two sscanf() uses of %s
       
    -  Reported-by: Dmitry Karpov
    -  Bug: https://curl.se/mail/lib-2021-05/0019.html
    -  Closes #7027
    +  Reported-by: Jishan Shaikh
    +  Fixes #7293
    +  Closes #7294
     
    -- progress: when possible, calculate transfer speeds with microseconds
    -  
    -  ... this improves precision, especially for transfers in the few or even
    -  sub millisecond range.
    -  
    -  Reported-by: J. Bromley
    -  Fixes #7017
    -  Closes #7020
    +- [Richard Whitehouse brought this change]
     
    -- http: reset the header buffer when sending the request
    +  multi: alter transfer timeout ordering
       
    -  A reused transfer handle could otherwise reuse the previous leftover
    -  buffer and havoc would ensue.
    +  - Check whether a connection has succeded before checking whether it's
    +    timed out.
       
    -  Reported-by: sergio-nsk on github
    -  Fixes #7018
    -  Closes #7021
    -
    -- curl_mprintf.3: add description
    +    This means if we've connected quickly, but subsequently been
    +    descheduled, we allow the connection to succeed. Note, if we timeout,
    +    but between checking the timeout, and connecting to the server the
    +    connection succeeds, we will allow it to go ahead. This is viewed as
    +    an acceptable trade off.
       
    -  These functions have existed in the API since the dawn of time. It is
    -  about time we describe how they work, even if we discourage users from
    -  using them.
    +  - Add additional failf logging around failed connection attempts to
    +    propogate the cause up to the caller.
       
    -  Closes #7010
    -
    -- [Timothy Gu brought this change]
    +  Co-Authored-by: Martin Howarth
    +  Closes #7178
     
    -  URL-SYNTAX: update IDNA section for WHATWG spec changes
    -  
    -  WHATWG URL has dictated the use of Nontransitional Processing (IDNA
    -  2008) for several years now. Chrome (and derivatives) still use
    -  Transitional Processing, but Firefox and Safari have both switched.
    -  
    -  Also document the fact that winidn functions differently from libidn2
    -  here.
    +- test677: IMAP CONNECT_ONLY, custom command and then exit
       
    -  Closes #7026
    -
    -- [Calvin Buckley brought this change]
    -
    -  INSTALL: add IBM i specific quirks
    +  Adjusted ftpserver.pl to add support for the IMAP IDLE command
       
    -  Fixes #6830
    -  Closes #7013
    +  Adjusted test 660 to sync with the fix
     
    -- libcurl.3: mention the URL API
    +- multi: do not switch off connect_only flag when closing
       
    -  To make it easier to find. Also a minor polish of libcurl-url.3
    +  ... as it made protocol specific disconnect commands wrongly get used.
       
    -  Closes #7009
    +  Bug: https://curl.se/mail/lib-2021-06/0024.html
    +  Reported-by: Aleksander Mazur
    +  Closes #7288
     
    -- GnuTLS: don't allow TLS 1.3 for versions that don't support it
    -  
    -  Follow-up to 781864bedbc5
    +- http: make the haproxy support work with unix domain sockets
       
    -  ... as they don't understand it and will return error at us!
    +  ... it should then pass on "PROXY UNKNOWN" since it doesn't know the
    +  involved IP addresses.
       
    -  Closes #7014
    +  Reported-by: Valentín Gutiérrez
    +  Fixes #7290
    +  Closes #7291
     
    -Kamil Dudka (6 May 2021)
    -- tool_getparam: handle failure of curlx_convert_tchar_to_UTF8()
    -  
    -  Reported by GCC analyzer:
    -  
    -  Error: GCC_ANALYZER_WARNING (CWE-476):
    -  src/tool_getparam.c: scope_hint: In function 'parse_args'
    -  src/tool_getparam.c:2318:38: warning[-Wanalyzer-possible-null-dereference]: dereference of possibly-NULL 'orig_opt'
    -  lib/curlx.h:56: included_from: Included from here.
    -  src/tool_getparam.c:28: included_from: Included from here.
    -  lib/curl_multibyte.h:70:51: note: in definition of macro 'curlx_convert_tchar_to_UTF8'
    -  src/tool_getparam.c:2316:16: note: in expansion of macro 'curlx_convert_tchar_to_UTF8'
    +- [Xiang Xiao brought this change]
    +
    +  curl.h: include sys/select.h for NuttX RTOS
       
    -  Reviewed-by: Marcel Raad
    -  Reviewed-by: Daniel Stenberg
    -  Closes #7023
    +  Closes #7287
     
    -Daniel Stenberg (6 May 2021)
    -- scripts/delta: also show total number of days
    +- [Bin Meng brought this change]
     
    -Marc Hoersken (5 May 2021)
    -- sockfilt: fix invalid increment of handles index variable nfd
    +  curl.h: remove the execution bit
       
    -  Only increment the array index if we actually stored a handle.
    +  The execution bit of curl.h file was wrongly added:
       
    -  Follow up to e917492048f4b85a0fd58a033d10072fc7666c3b
    -  Closes #6992
    -
    -- sockfilt: avoid getting stuck waiting for writable socket
    +    commit 2621025d6f96 ("curl.h:  is supported by VxWorks7")
       
    -  Reset FD_WRITE event using the same approach as in multi.c
    +  and should be removed.
       
    -  Follow up to b36442b24305f3cda7c13cc64b46838995a4985b
    -  Closes #6992
    +  Follow-up to 2621025d6f96 ("curl.h:  is supported by VxWorks7")
    +  Signed-off-by: Bin Meng 
    +  Closes #7286
     
    -Jay Satiro (5 May 2021)
    -- test678: Fix for Windows multibyte builds
    -  
    -  Follow-up to 77fc385 from yesterday.
    +- [Bin Lan brought this change]
    +
    +  curl.h:  is supported by VxWorks7
       
    -  Bug: https://github.com/curl/curl/pull/6662#issuecomment-832966557
    -  Reported-by: Marc Hörsken
    +  Closes #7285
     
    -- [Dmitry Kostjuchenko brought this change]
    +- [Bachue Zhou brought this change]
     
    -  build: fix compilation for Windows UWP platform
    +  quiche: use send() instead of sendto() to avoid macOS issue
       
    -  - Include afunix.h which is necessary for sockaddr_un when
    -    USE_UNIX_SOCKETS is defined on Windows.
    +  sendto() always returns "Socket is already connected" error on macos
       
    -  Closes https://github.com/curl/curl/pull/7006
    +  Closes #7260
     
    -Daniel Stenberg (5 May 2021)
    -- gnutls: make setting only the MAX TLS allowed version work
    -  
    -  Previously, settting only the max allowed TLS version, leaving the
    -  minimum one at default, didn't actually set it and left it to default
    -  (TLS 1.3) too!
    -  
    -  As a bonus, this change also removes the dead code handling of SSLv3
    -  since that version can't be set anymore (since eff614fb0242cb).
    -  
    -  Reported-by: Daniel Carpenter
    -  Fixes #6998
    -  Closes #7000
    +- [Li Xinwei brought this change]
     
    -- openldap: replace ldap_ prefix on private functions
    +  cmake: fix support for UnixSockets feature on Win32
       
    -  Since openldap itself uses that prefix and with OpenĹDAP 2.5.4 (at
    -  least) there's a symbol collision because of that.
    +  Move the definition of sockaddr_un struct from config-win32.h to
    +  curl_setup.h, so that it could be shared by all build systems.
       
    -  The private functions now use the 'oldap_' prefix where it previously
    -  used 'ldap_'.
    +  Add ADDRESS_FAMILY typedef for old mingw, now old mingw can also use
    +  unix sockets.
       
    -  Reported-by: 3eka on github
    -  Fixes #7004
    -  Closes #7005
    -
    -Jay Satiro (5 May 2021)
    -- http2: fix potentially uninitialized variable
    +  Also fix the build of tests/server/sws.c on Win32 when USE_UNIX_SOCKETS
    +  is defined.
       
    -  introduced several days ago in 3193170. caught by visual studio linker.
    +  Closes #7034
     
    -- [Gilles Vollant brought this change]
    +- [Gregory Muchka brought this change]
     
    -  SSL: support in-memory CA certs for some backends
    -  
    -  - New options CURLOPT_CAINFO_BLOB and CURLOPT_PROXY_CAINFO_BLOB to
    -    specify in-memory PEM certificates for OpenSSL, Schannel (Windows)
    -    and Secure Transport (Apple) SSL backends.
    +  hostip: (macOS) free returned memory of SCDynamicStoreCopyProxies
       
    -  Prior to this change PEM certificates could only be imported from a file
    -  and not from memory.
    +  From Apples documentation on SCDynamicStoreCopyProxies, "Return Value: A
    +  dictionary of key-value pairs that represent the current internet proxy
    +  settings, or NULL if no proxy settings have been defined or if an error
    +  occurred. You must release the returned value."
       
    -  Co-authored-by: moparisthebest@users.noreply.github.com
    +  Failure to release the returned value of SCDynamicStoreCopyProxies can
    +  result in a memory leak.
       
    -  Ref: https://github.com/curl/curl/pull/4679
    -  Ref: https://github.com/curl/curl/pull/5677
    -  Ref: https://github.com/curl/curl/pull/6109
    +  Source: https://developer.apple.com/documentation/systemconfiguration/1517088-scdynamicstorecopyproxies
       
    -  Closes https://github.com/curl/curl/pull/6662
    +  Closes #7265
     
    -Daniel Stenberg (4 May 2021)
    -- [David Cook brought this change]
    +- RELEASE-NOTES: synced
     
    -  tests: ignore case of chunked hex numbers in tests
    -  
    -  When hyper is used, it emits uppercase hexadecimal numbers for chunked
    -  encoding lengths. Without hyper, lowercase hexadecimal numbers are used.
    -  This change adds preprocessor statements to tests where this is an
    -  issue, and adapts the fixtures to match.
    +Jay Satiro (21 Jun 2021)
    +- vtls: fix warning due to function prototype mismatch
       
    -  Closes #6987
    +  b09c8ee changed the function prototype. Caught by Visual Studio.
     
    -- cmake: check for getppid and utimes
    -  
    -  ... as they're checked for in the configure script and are used by
    -  source code.
    +- curl_multibyte: Remove local encoding fallbacks
       
    -  Removed checks for perror, setvbuf and strlcat since those defines are
    -  not checked for in source code.
    +  - If the UTF-8 to UTF-16 conversion fails in Windows Unicode builds then
    +    no longer fall back to assuming the string is in a local encoding.
       
    -  Bonus: removed HAVE_STRLCPY from a few config-*.h files since that
    -  symbol is not used in source code.
    +  Background:
       
    -  Closes #6997
    -
    -- libtest: remove lib530.c
    +  Some functions in Windows Unicode builds must convert UTF-8 to UTF-16 to
    +  pass to the Windows CRT API wide-character functions since in Windows
    +  UTF-8 is not a valid locale (or at least 99% of the time right now).
       
    -  Follow up from e50a877df when test 530 was removed. Since then this
    -  source file has not been used/needed.
    +  Prior to this change if the Unicode encoding conversion failed then
    +  libcurl would assume, for backwards compatibility with applications that
    +  may have written their code for non-Unicode builds, attempt to convert
    +  the string from local encoding to UTF-16.
       
    -  Closes #6999
    -
    -- FILEFORMAT: mention sectransp as a feature
    +  That type of "best effort" could theoretically cause some type of
    +  security or other problem if a string that was locally encoded was also
    +  valid UTF-8, and therefore an unexpected UTF-8 to UTF-16 conversion
    +  could occur.
       
    -  Been supported since at least 40259ca65
    +  Ref: https://github.com/curl/curl/pull/7246
       
    -  Closes #7001
    -
    -- RELEASE-NOTES: synced
    +  Closes https://github.com/curl/curl/pull/7257
     
    -- libssh2: ignore timeout during disconnect
    -  
    -  ... to avoid memory leaks!
    +Daniel Stenberg (20 Jun 2021)
    +- curl_endian: remove the unused Curl_write64_le function
       
    -  libssh2 is tricky as we have to deal with the non-blockiness even in
    -  close and shutdown cases. In the cases when we shutdown after a timeout
    -  already expired, it is crucial that curl doen't let the timeout abort
    -  the shutdown process as that then leaks memory!
    +  The last usage was removed in cca455a36
       
    -  Reported-by: Benjamin Riefenstahl
    -  Fixes #6990
    -
    -- KNOWN_BUGS: add two HTTP/2 bugs
    +  Closes #7280
     
    -- KNOWN_BUGS: add three HTTP/3 issues
    +- vtls: only store TIMER_APPCONNECT for non-proxy connect
       
    -  ... and moved the HTTP/2 issues to its own section
    +  Introducing a 'isproxy' argument to the connect function so that it
    +  knows wether to store the time stamp or not.
       
    -  Closes #6606
    -  Closes #6510
    -  Closes #6494
    -
    -- [ejanchivdorj brought this change]
    +  Reported-by: Yongkang Huang
    +  Fixes #7274
    +  Closes #7274
     
    -  CURLcode: add CURLE_SSL_CLIENTCERT
    -  
    -  When a TLS server requests a client certificate during handshake and
    -  none can be provided, libcurl now returns this new error code
    -  CURLE_SSL_CLIENTCERT
    +- gnutls: set the preferred TLS versions in correct order
       
    -  Only supported by Secure Transport and OpenSSL for TLS 1.3 so far.
    +  Regression since 781864bedbc57 (curl 7.77.0)
       
    -  Closes #6721
    +  Reported-by: civodul on github
    +  Assisted-by: Nikos Mavrogiannopoulos
    +  Fixes #7277
    +  Closes #7278
     
    -- [Tobias Gabriel brought this change]
    +- [Gergely Nagy brought this change]
     
    -  .github/FUNDING: add link to GitHub sponsors
    +  configure/cmake: remove checks for unused gethostbyaddr and gethostbyaddr_r
       
    -  Closes #6985
    +  Closes #7276
     
    -- [Harry Sintonen brought this change]
    +- [Gergely Nagy brought this change]
     
    -  krb5/name_to_level: replace checkprefix with curl_strequal
    +  configure/cmake: remove checks for unused inet_ntoa and inet_ntoa_r
       
    -  Closes #6993
    +  Closes #7276
     
    -- [Harry Sintonen brought this change]
    +- [Gergely Nagy brought this change]
     
    -  Curl_input_digest: require space after Digest
    +  configure/cmake: remove unused define HAVE_PERROR
       
    -  Closes #6993
    +  Closes #7276
     
    -- [Harry Sintonen brought this change]
    +- [Gergely Nagy brought this change]
     
    -  Curl_http_header: check for colon when matching Persistent-Auth
    +  configure: remove unused check for gai_strerror
       
    -  Closes #6993
    -
    -- [Harry Sintonen brought this change]
    +  Closes #7276
     
    -  Curl_http_input_auth: require valid separator after negotiation type
    -  
    -  Closes #6993
    +- [Gergely Nagy brought this change]
     
    -- http: fix the check for 'Authorization' with Bearer
    -  
    -  The code would wrongly check for it using an additional colon.
    +  configure/cmake: remove unused define HAVE_FREEIFADDRS
       
    -  Reported-by: Blake Burkhart
    -  Closes #6988
    +  Closes #7276
     
    -- [Kamil Dudka brought this change]
    +- [Gergely Nagy brought this change]
     
    -  http2: fix a resource leak in push_promise()
    -  
    -  ... detected by Coverity:
    -  
    -  Error: RESOURCE_LEAK (CWE-772):
    -  lib/http2.c:532: alloc_fn: Storage is returned from allocation function "duphandle".
    -  lib/http2.c:532: var_assign: Assigning: "newhandle" = storage returned from "duphandle(data)".
    -  lib/http2.c:552: noescape: Resource "newhandle" is not freed or pointed-to in "set_transfer_url".
    -  lib/http2.c:555: leaked_storage: Variable "newhandle" going out of scope leaks the storage it points to.
    +  configure/cmake: remove unused define HAVE_FORK
       
    -  Closes #6986
    +  Closes #7276
     
    -- [Kamil Dudka brought this change]
    +- [Gergely Nagy brought this change]
     
    -  http2: fix resource leaks in set_transfer_url()
    -  
    -  ... detected by Coverity:
    -  
    -  Error: RESOURCE_LEAK (CWE-772):
    -  lib/http2.c:480: alloc_fn: Storage is returned from allocation function "curl_url". [Note: The source code implementation of the function has been overridden by a builtin model.]
    -  lib/http2.c:480: var_assign: Assigning: "u" = storage returned from "curl_url()".
    -  lib/http2.c:486: noescape: Resource "u" is not freed or pointed-to in "curl_url_set". [Note: The source code implementation of the function has been overridden by a builtin model.]
    -  lib/http2.c:488: leaked_storage: Variable "u" going out of scope leaks the storage it points to.
    -  
    -  Error: RESOURCE_LEAK (CWE-772):
    -  lib/http2.c:480: alloc_fn: Storage is returned from allocation function "curl_url". [Note: The source code implementation of the function has been overridden by a builtin model.]
    -  lib/http2.c:480: var_assign: Assigning: "u" = storage returned from "curl_url()".
    -  lib/http2.c:493: noescape: Resource "u" is not freed or pointed-to in "curl_url_set". [Note: The source code implementation of the function has been overridden by a builtin model.]
    -  lib/http2.c:495: leaked_storage: Variable "u" going out of scope leaks the storage it points to.
    -  
    -  Error: RESOURCE_LEAK (CWE-772):
    -  lib/http2.c:480: alloc_fn: Storage is returned from allocation function "curl_url". [Note: The source code implementation of the function has been overridden by a builtin model.]
    -  lib/http2.c:480: var_assign: Assigning: "u" = storage returned from "curl_url()".
    -  lib/http2.c:500: noescape: Resource "u" is not freed or pointed-to in "curl_url_set". [Note: The source code implementation of the function has been overridden by a builtin model.]
    -  lib/http2.c:502: leaked_storage: Variable "u" going out of scope leaks the storage it points to.
    -  
    -  Error: RESOURCE_LEAK (CWE-772):
    -  lib/http2.c:480: alloc_fn: Storage is returned from allocation function "curl_url". [Note: The source code implementation of the function has been overridden by a builtin model.]
    -  lib/http2.c:480: var_assign: Assigning: "u" = storage returned from "curl_url()".
    -  lib/http2.c:505: noescape: Resource "u" is not freed or pointed-to in "curl_url_get". [Note: The source code implementation of the function has been overridden by a builtin model.]
    -  lib/http2.c:507: leaked_storage: Variable "u" going out of scope leaks the storage it points to.
    +  configure/cmake: remove unused define HAVE_FDOPEN
       
    -  Closes #6986
    +  Closes #7276
     
    -- [Jacob Hoffman-Andrews brought this change]
    +- [Gergely Nagy brought this change]
     
    -  rustls: use ALPN
    -  
    -  Update required rustls to 0.5.0
    +  configure/cmake: remove checks for unused sgtty.h
       
    -  Closes #6960
    +  Closes #7276
     
    -- [Michał Antoniak brought this change]
    +- [Gergely Nagy brought this change]
     
    -  gskit: fix CURL_DISABLE_PROXY build
    -  
    -  Removed localfd and remotefd from ssl_backend_data (ued only with proxy
    -  connection). Function pipe_ssloverssl return always 0, when proxy is not
    -  used.
    +  configure/cmake: remove remaining checks for rsa.h
       
    -  Closes #6981
    +  Closes #7276
     
    -- [Michał Antoniak brought this change]
    +- [Gergely Nagy brought this change]
     
    -  gskit: fix undefined reference to 'conn'
    +  configure/cmake: remove remaining checks for err.h
       
    -  Closes #6980
    +  Closes #7276
     
    -- [Jacob Hoffman-Andrews brought this change]
    +- [Gergely Nagy brought this change]
     
    -  tls: add USE_HTTP2 define
    -  
    -  This abstracts across the two HTTP/2 backends: nghttp2 and Hyper.
    -  
    -  Add our own define for the "h2" ALPN protocol, so TLS backends can use
    -  it without depending on a specific HTTP backend.
    +  configure/cmake: remove remaining checks for crypto.h
       
    -  Closes #6959
    +  Closes #7276
     
    -- [Jacob Hoffman-Andrews brought this change]
    +- [Gergely Nagy brought this change]
     
    -  lib: fix 0-length Curl_client_write calls
    +  configure/cmake: remove checks for unused getservbyport_r
       
    -  Closes #6954
    +  Closes #7276
     
    -- [Jacob Hoffman-Andrews brought this change]
    +- --socks4[a]: clarify where the host name is resolved
    +  
    +  Closes #7273
     
    -  lib: remove strlen call from Curl_client_write
    +- libcurl-security.3: mention file descriptors and forks
       
    -  At all call sites with an explicit 0 len, pass an appropriate nonzero
    -  len.
    +  ... and move the security report section last.
       
    -  Closes #6954
    +  Reported-by: Harry Sintonen
    +  Closes #7270
     
    -- [Ayushman Singh Chauhan brought this change]
    +- [Alex Xu (Hello71) brought this change]
     
    -  docs: camelcase it like GitHub everywhere
    +  configure.ac: make non-executable
       
    -  Closes #6979
    -
    -Jay Satiro (27 Apr 2021)
    -- [Lucas Servén Marín brought this change]
    +  it needs to be processed by autoconf or autoreconf, and doesn't have a
    +  suitable shebang to be directly executed. other projects normally set
    +  configure.ac -x.
    +  
    +  Closes #7272
     
    -  docs: fix typo in fail-with-body doc
    +- configure: do not strip out debug flags
       
    -  This commit fixes a small typo in the documentation for the
    -  --fail-with-body flag.
    +  To allow users to set them when invoking configure without using
    +  --with-debug.
       
    -  Closes https://github.com/curl/curl/pull/6977
    +  Reported-by: Alex Xu
    +  Fixes #7216
    +  Closes #7267
     
    -- lib: fix some misuse of curlx_convert_UTF8_to_tchar
    -  
    -  curlx_convert_UTF8_to_tchar must be freed by curlx_unicodefree, but
    -  prior to this change some uses mistakenly called free.
    +- libssh2: limit time a disconnect can take to 1 second
       
    -  I've reviewed all other uses of curlx_convert_UTF8_to_tchar and
    -  curlx_convert_tchar_to_UTF8.
    +  Closes #7271
    +
    +- TLS: prevent shutdown loops to get stuck
       
    -  Bug: https://github.com/curl/curl/pull/6602#issuecomment-825236763
    -  Reported-by: sergio-nsk@users.noreply.github.com
    +  ... by making sure the loops are only allowed to read the shutdown
    +  traffic a limited number of times.
       
    -  Closes https://github.com/curl/curl/pull/6938
    +  Reported-by: Harry Sintonen
    +  Closes #7271
     
    -Daniel Stenberg (27 Apr 2021)
    -- ntlm: precaution against super huge type2 offsets
    +- hyper: propagate errors back up from read callbacks
       
    -  ... which otherwise caused an integer overflow and circumvented the if()
    -  conditional size check.
    +  Makes test 513 work with hyper
       
    -  Detected by OSS-Fuzz
    -  Bug: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=33720
    -  Assisted-by: Max Dymond
    -  Closes #6975
    -
    -- c-hyper: fix unused variable ‘wrote’
    +  Closes #7266
     
    -- libcurl-security.3: be careful of setuid
    +- KNOWN_BUGS: Negotiate on Windows fails
       
    -  Reported-by: Harry Sintonen
    -  Closes #6970
    -
    -- [Kevin Burke brought this change]
    +  Closes #5881
     
    -  c-hyper: don't write to set.writeheader if null
    +- KNOWN_BUGS: renames instead of locking for atomic operations
       
    -  Previously if a caller set CURLOPT_WRITEFUNCTION but did not set a
    -  CURLOPT_HEADERDATA buffer, Hyper would still attempt to write headers to
    -  the data->set.writeheader header buffer, even though it is null.  This
    -  led to NPE segfaults attempting to use libcurl+Hyper with Git, for
    -  example.
    +  Closes #6882
    +  Closes #6884
    +
    +- zuul: add two missing CI jobs
       
    -  Instead, process the client write for the status line using the same
    -  logic we use to process the client write for the later HTTP headers,
    -  which contains the appropriate guard logic. As a side benefit,
    -  data->set.writeheader is now only read in one file instead of two.
    +  ... that were configured, just not run
       
    -  Fixes #6619
    -  Fixes abetterinternet/crustls#49
    -  Fixes hyperium/hyper#2438
    -  Closes #6971
    +  Closes #7261
     
    -- wolfssl: handle SSL_write() returns 0 for error
    +Viktor Szakats (15 Jun 2021)
    +- idn: fix libidn2 with windows unicode builds
       
    -  Reported-by: Timo Lange
    +  Unicode Windows builds use UTF-8 strings internally in libcurl,
    +  so make sure to call the UTF-8 flavour of the libidn2 API. Also
    +  document that Windows builds with libidn2 and UNICODE do expect
    +  CURLOPT_URL as an UTF-8 string.
       
    -  Closes #6967
    +  Reported-by: dEajL3kA on github
    +  Assisted-by: Jay Satiro
    +  Reviewed-by: Marcel Raad
    +  Closes #7246
    +  Fixes #7228
     
    -- easy: ignore sigpipe in curl_easy_send
    +Daniel Stenberg (15 Jun 2021)
    +- curl_url_set: reject spaces in URLs w/o CURLU_ALLOW_SPACE
       
    -  Closes #6965
    -
    -- sigpipe: ignore SIGPIPE when using wolfSSL as well
    +  They were never officially allowed and slipped in only due to sloppy
    +  parsing. Spaces (ascii 32) should be correctly encoded (to %20) before
    +  being part of a URL.
       
    -  Closes #6966
    -
    -- libcurl-security.3: don't try to filter IPv4 hosts based on the URL
    +  The new flag bit CURLU_ALLOW_SPACE when a full URL is set, makes libcurl
    +  allow spaces.
       
    -  Closes #6942
    -
    -- [Harry Sintonen brought this change]
    -
    -  nss_set_blocking: avoid static for sock_opt
    +  Updated test 1560 to verify.
       
    -  Reviewed-by: Kamil Dudka
    -  Closes #6945
    +  Closes #7073
     
     - RELEASE-NOTES: synced
    -
    -- [Yusuke Nakamura brought this change]
    -
    -  docs/HTTP3.md: fix nghttp2's HTTP/3 server port
    -  
    -  Port 8443 does not work now.
    -  Correct origin is in the quicwg's wiki.
    -  https://github.com/quicwg/base-drafts/wiki/Implementations#ngtcp2
       
    -  Closes #6964
    +  ... and bump to version 7.78.0 for the next planned release.
     
    -- krb5: don't use 'static' to store PBSZ size response
    +Jay Satiro (15 Jun 2021)
    +- docs: Remove outdated curl tool limitation
       
    -  ... because it makes the knowledge and usage cross-transfer in funny and
    -  unexpected ways.
    +  - Document that HTTP/2 multiplexing is supported by the curl tool when
    +    parallel transfers are used.
       
    -  Reported-by: Harry Sintonen
    -  Closes #6963
    -
    -- [Kevin Burke brought this change]
    +  Supported since 7.66.0 via --parallel, but the doc wasn't updated.
    +  
    +  Closes https://github.com/curl/curl/pull/7259
     
    -  m4: add security frameworks on Mac when compiling rustls
    +- http2: Clarify 'Using HTTP2' verbose message
       
    -  Previously compiling rustls on Mac would only complete if you also
    -  compiled the SecureTransport TLS backend, which curl would prefer to
    -  the Rust backend.
    +  - Change phrasing from multi-use to multiplexing since the former may
    +    not be as well understood.
       
    -  Appending these flags to LDFLAGS makes it possible to compile the
    -  Rustls backend on Mac without the SecureTransport backend, which means
    -  this patch will make it possible for Mac users to use the Rustls
    -  backend for TLS.
    +  Before: * Using HTTP2, server supports multi-use
       
    -  Reviewed-by: Jacob Hoffman-Andrews
    +  After: * Using HTTP2, server supports multiplexing
       
    -  Fixes #6955
    -  Cloes #6956
    -
    -- krb5: remove the unused 'overhead' function
    +  Bug: https://github.com/curl/curl/discussions/7255
    +  Reported-by: David Hu
       
    -  Closes #6947
    -
    -- [Johann150 brought this change]
    +  Closes https://github.com/curl/curl/pull/7258
     
    -  curl_url_set.3: add memory management information
    -  
    -  wording taken from man page for CURLOPT_URL.3
    +Daniel Stenberg (14 Jun 2021)
    +- winbuild/README: VC should be set to 6 'or larger'
       
    -  As far as I can see, the URL part is either malloc'ed before due to
    -  encoding or it is strdup'ed.
    +  Previously it listed all versions up to 15 (missing 16) but this new
    +  phrasing is more open ended.
       
    -  Closes #6953
    +  Reported-by: Hugh Macdonald
    +  Fixes #7253
    +  Closes #7254
     
     - [Jacob Hoffman-Andrews brought this change]
     
    -  c-hpyer: fix handling of zero-byte chunk from hyper
    +  rustls: remove native_roots fallback
       
    -  Closes #6951
    -
    -- CURLOPT_POSTFIELDS.3: clarify how it gets the size of the data
    +  For the commandline tool, we expect to be passed
    +  SSL_CONN_CONFIG(CAfile); for library use, the use should pass a set of
    +  trusted roots (like in other TLS backends).
       
    -  Ref: https://curl.se/mail/lib-2021-04/0085.html
    -  Closes #6943
    -
    -- [Ralph Langendam brought this change]
    -
    -  cmake: make libcurl output filename configurable
    +  This also removes a dependency on Security.framework when building on
    +  macOS.
       
    -  Reviewed-by: Jakub Zakrzewski
    -  Closes #6933
    -
    -- [Patrick Monnerat brought this change]
    +  Closes #7250
     
    -  vtls: reset ssl use flag upon negotiation failure
    -  
    -  Fixes the segfault in ldaps disconnect.
    -  
    -  Reported-by: Illarion Taev
    -  Fixes #6934
    -  Closes #6937
    +- [Albin Vass brought this change]
     
    -- configure: fix typo in TLS error message
    +  travis: remove jobs that have migrated to zuul
       
    -  Reported-by: Pontus Lundkvist
    -
    -- README: link to the commercial support option
    +  Closes #7245
     
    -Jay Satiro (22 Apr 2021)
    -- [Martin Halle brought this change]
    +- [Mohammed Naser brought this change]
     
    -  version: add gsasl_version to curl_version_info_data
    +  CI: add jobs using Zuul
       
    -  - Add gsasl_version string and bump to CURLVERSION_TENTH.
    +  It also includes a few changes to get the builds going:
    +  - Added autoconf to common dependencies
    +  - Added automake to common dependencies
    +  - Added libtool to common dependencies
    +  - Added libssl-dev to common dependencies
       
    -  Ref: https://curl.se/mail/lib-2021-04/0003.html
    +  Co-authored-by: Albin Vass
       
    -  Closes https://github.com/curl/curl/pull/6843
    -
    -- [Morten Minde Neergaard brought this change]
    +  Closes #7245
     
    -  schannel: Support strong crypto option
    +- netrc: skip 'macdef' definitions
       
    -  - Support enabling strong crypto via optional user cipher list when
    -    USE_STRONG_CRYPTO or SCH_USE_STRONG_CRYPTO is in the list.
    +  Add test 494 to verify
       
    -  MSDN says SCH_USE_STRONG_CRYPTO "Instructs Schannel to disable known
    -  weak cryptographic algorithms, cipher suites, and SSL/TLS protocol
    -  versions that may be otherwise enabled for better interoperability."
    +  Reported-by: Harry Sintonen
    +  Fixes #7238
    +  Closes #7244
    +
    +- multi: add scan-build-6 work-around in curl_multi_fdset
       
    -  Ref: https://curl.se/mail/lib-2021-02/0066.html
    -  Ref: https://curl.se/docs/manpage.html#--ciphers
    -  Ref: https://curl.se/libcurl/c/CURLOPT_SSL_CIPHER_LIST.html
    -  Ref: https://docs.microsoft.com/en-us/windows/win32/api/schannel/ns-schannel-schannel_cred
    +  scan-build-6 otherwise warns, saying: warning: The left operand of '>='
    +  is a garbage value otherwise, which is false.
       
    -  Closes https://github.com/curl/curl/pull/6734
    -
    -Daniel Stenberg (22 Apr 2021)
    -- RELEASE-NOTES: synced
    -
    -- ci: adapt to configure requiring an explicit TLS choice
    -
    -- configure: split out each TLS library detector into its own function
    +  Later scan-builds don't claim this on the same code.
       
    -  ... and put those functions in separate m4 files per TLS library.
    +  Closes #7248
    diff --git a/vendor/curl/RELEASE-NOTES b/vendor/curl/RELEASE-NOTES
    index 6c9553bc64..b16e31f1eb 100644
    --- a/vendor/curl/RELEASE-NOTES
    +++ b/vendor/curl/RELEASE-NOTES
    @@ -1,138 +1,191 @@
    -curl and libcurl 7.81.0
    +curl and libcurl 7.82.0
     
    - Public curl releases:         205
    - Command line options:         244
    + Public curl releases:         206
    + Command line options:         245
      curl_easy_setopt() options:   295
      Public functions in libcurl:  86
    - Contributors:                 2558
    + Contributors:                 2597
     
     This release includes the following changes:
     
    - o mime: use percent-escaping for multipart form field and file names [1]
    + o curl: add --json [67]
    + o mesalink: remove support [23]
     
     This release includes the following bugfixes:
     
    - o asyn-ares: ares_getaddrinfo needs no happy eyeballs timer [73]
    - o azure: make the "w/o HTTP/SMTP/IMAP" build disable SSL proper [12]
    - o BINDINGS: add cURL client for PostgreSQL [68]
    - o BINDINGS: add one from Everything curl and update a link
    - o checksrc: detect more kinds of NULL comparisons we avoid [105]
    - o CI: build examples for additional code verification [75]
    - o CI: bump job to use mbedtls 3.1.0 [90]
    - o cmake: don't set _USRDLL on a static Windows build [22]
    - o cmake: prevent dev warning due to mismatched arg [94]
    - o cmake: private identifiers use CURL_ instead of CMAKE_ prefix [40]
    - o config.d: update documentation to match the path search
    - o configure: add -lm to configure for rustls build. [13]
    - o configure: better diagnostics if hyper is built wrong [6]
    - o configure: don't enable TLS when --without-* flags are used [17]
    - o configure: fix runtime-lib detection on macOS [21]
    - o curl.1: require "see also" for every documented option [27]
    - o curl: improve error message for --head with -J [42]
    - o curl_easy_cleanup.3: remove from multi handle first [3]
    - o curl_easy_escape.3: call curl_easy_cleanup in example [58]
    - o curl_easy_unescape.3: call curl_easy_cleanup in example [57]
    - o curl_multi_init.3: fix EXAMPLE formatting
    - o curl_multi_perform/socket_action.3: clarify what errors mean [70]
    - o curl_share_setopt.3: split out options into their own manpages [14]
    - o CURLOPT_STDERR.3: does not work with libcurl as a win32 DLL [51]
    - o digest: compute user:realm:pass digest w/o userhash [45]
    - o docs/checksrc: Add documentation for STRERROR [18]
    - o docs/cmdline-opts: do not say "protocols: all" [26]
    - o docs/examples: workaround broken -Wno-pedantic-ms-format
    - o docs/HTTP3: describe how to setup a h3 reverse-proxy for testing [88]
    - o docs/INSTALL.md: typo fix : added missing "get" verb [31]
    - o docs/URL-SYNTAX.md: space is not fine in a given URL
    - o docs: add known bugs list to HTTP3.md [83]
    - o docs: address proselint nits [16]
    - o docs: consistent manpage SYNOPSIS [47]
    - o docs: fix dead links, remove ECH.md
    - o docs: fix typo in OpenSSL 3 build instructions [80]
    - o docs: Update the Reducing Size section
    - o example/progressfunc: remove code for old libcurls [78]
    - o examples/multi-single.c: remove WAITMS() [98]
    - o FAQ: typo fix : "yout" ➤ "your" [30]
    - o ftp: disable warning 4706 in MSVC [85]
    - o gen.pl: improve example output format [29]
    - o github workflow: add wolfssl (removed from zuul) [103]
    - o github/workflows: add mbedtls and mbedtls-clang (removed from zuul) [92]
    - o gtls: check return code for gnutls_alpn_set_protocols [86]
    - o hash: lazy-alloc the table in Curl_hash_add() [54]
    - o http2:set_transfer_url() return early on OOM [53]
    - o HTTP3: update quiche build instructions [37]
    - o http: enable haproxy support for hyper backend [20]
    - o http: Fix CURLOPT_HTTP200ALIASES [89]
    - o http_proxy: don't close the socket (too early) [100]
    - o insecure.d: detail its use for SFTP and SCP as well [32]
    - o insecure.d: expand and clarify [28]
    - o libcurl-multi.3: "SOCKS proxy handshakes" are not blocking
    - o libcurl-security.3: mention address and URL mitigations
    - o libssh2: fix error message for sha256 mismatch
    - o libtest: avoid "assignment within conditional expression" [84]
    - o lift: ignore is a deprecated config option, use ignoreRules [35]
    - o linkcheck.yml: add CI job that checks markdown links [82]
    - o m4/curl-compilers: tell clang -Wno-pointer-bool-conversion [99]
    - o Makefile.m32: rename -winssl option to -schannel and tidy up [33]
    - o mbedTLS: add support for CURLOPT_CAINFO_BLOB [44]
    - o mbedtls: fix CURLOPT_SSLCERT_BLOB [72]
    - o mbedtls: fix private member designations for v3.1.0 [93]
    - o misc: remove unused doh flags when CURL_DISABLE_DOH is defined [71]
    - o misc: s/e-mail/email [74]
    - o multi: cleanup the socket hash when destroying it [55]
    - o multi: handle errors returned from socket/timer callbacks [52]
    - o multi: shut down CONNECT in Curl_detach_connnection [2]
    - o netrc.d: edit the .netrc example to look nicer [24]
    - o ngtcp2: verify the server cert on connect (quictls) [102]
    - o ngtcp2: verify the server certificate for the gnutls case [101]
    - o nss:set_cipher don't clobber the cipher list [38]
    - o openldap: implement STARTTLS [56]
    - o openldap: process search query response messages one by one [50]
    - o openldap: several minor improvements [69]
    - o openldap: simplify ldif generation code [77]
    - o openssl: check the return value of BIO_new() [43]
    - o openssl: define HAVE_OPENSSL_VERSION for OpenSSL 1.1.0+
    - o openssl: remove `RSA_METHOD_FLAG_NO_CHECK` handling if unavailable
    - o openssl: remove usage of deprecated `SSL_get_peer_certificate`
    - o openssl: use non-deprecated API to read key parameters
    - o page-footer: add a mention of how to report bugs to the man page
    - o page-footer: document more environment variables [23]
    - o request.d: refer to 'method' rather than 'command' [59]
    - o retry-all-errors.d: make the example complete
    - o runtests: make the SSH library a testable feature
    - o rustls: read of zero bytes might be okay [9]
    - o rustls: remove comment about checking handshaking [15]
    - o rustls: remove incorrect EOF check [10]
    - o sha256/md5: return errors when init fails [79]
    - o socks5: use appropriate ATYP for numerical IP address host names [91]
    - o test1156: enable for hyper [65]
    - o test1156: fixup the stdout check for Windows [60]
    - o test1525: tweaked for hyper [64]
    - o test1526: enable for hyper [63]
    - o test1527: enable for hyper [62]
    - o test1528: enable for hyper [61]
    - o test1554: adjust for hyper [49]
    - o test1556: adjust for hyper [48]
    - o test302[12]: run only with the libssh2 backend [8]
    - o test661: enable for hyper [66]
    - o tests/CI.md: add more information on CI environments [39]
    - o tests/data/test302[12]: fix MSYS2 path conversion of hostpubsha256 [76]
    - o tftp: mark protocol as not possible to do over CONNECT [25]
    - o tool_findfile: updated search for a file in the homedir [46]
    - o tool_operate: only set SSH related libcurl options for SSH URLs [11]
    - o tool_operate: warn if too many output arguments were found [87]
    - o url.c: fix the SIGPIPE comment for Curl_close [4]
    - o url: check ssl_config when re-use proxy connection [81]
    - o url: reduce ssl backend count for CURL_DISABLE_PROXY builds [96]
    - o urlapi: accept port number zero [34]
    - o urlapi: if possible, shorten given numerical IPv6 addresses [95]
    - o urlapi: provide more detailed return codes [36]
    - o urlapi: reject short file URLs [41]
    - o version_win32: Check build number and platform id
    - o vtls/rustls: adapt to the updated rustls_version proto [19]
    - o writeout: fix %{http_version} for HTTP/3 [7]
    - o x509asn1: return early on errors [67]
    - o zuul.d: update rustls-ffi to version 0.8.2 [5]
    - o zuul: fix quiche build pointing to wrong Cargo [104]
    + o appveyor: update images from VS 2019 to 2022
    + o appveyor: use VS 2017 image for the autotools builds
    + o azure-pipelines: add a build on Windows with libssh [154]
    + o bearssl: fix connect error on expired cert and no verify [132]
    + o bearssl: fix EXC_BAD_ACCESS on incomplete CA cert [131]
    + o bearssl: fix session resumption (session id) [133]
    + o build: enable -Warith-conversion
    + o build: fix -Wenum-conversion handling
    + o build: fix ngtcp2 crypto library detection [63]
    + o checkprefix: remove strlen calls [128]
    + o checksrc: fix typo in comment [34]
    + o CI: move 'distcheck' job from zuul to azure pipelines [60]
    + o CI: move scan-build job from Zuul to Azure Pipelines [59]
    + o CI: move the NSS job from zuul to GHA [84]
    + o ci: move the OpenSSL + c-ares job from Zuul to Circle CI [75]
    + o CI: move the rustls CI job to GHA from Zuul [8]
    + o CI: move two jobs from Zuul to Circle CI [73]
    + o CI: test building wolfssl with --enable-opensslextra [42]
    + o CI: workflows/wolfssl: install impacket [47]
    + o circleci: add a job using libssh [121]
    + o cirlceci: also run a c-ares job on arm with debug enabled [74]
    + o cmake: fix iOS CMake project generation error [13]
    + o cmdline-opts/gen.pl: fix option matching to improve references [50]
    + o config.d: Clarify _curlrc filename is still valid on Windows [95]
    + o configure.ac: use user-specified gssapi dir when using pkg-config [136]
    + o configure: change output for cross-compiled alt-svc support [140]
    + o configure: fix '--enable-code-coverage' typo [110]
    + o configure: remove support for "embedded ares" [82]
    + o configure: requires --with-nss-deprecated to build with NSS [114]
    + o configure: set CURL_LIBRARY_PATH for nghttp2 [58]
    + o configure: support specification of a nghttp2 library path [101]
    + o configure: use correct CFLAGS for threaded resolver with xlC on AIX [54]
    + o curl tool: erase some more sensitive command line arguments [22]
    + o curl-functions.m4: fix LIBRARY_PATH adjustment to avoid eval [5]
    + o curl-functions.m4: revert DYLD_LIBRARY_PATH tricks in CURL_RUN_IFELSE [9]
    + o curl-openssl: fix SRP check for OpenSSL 3.0 [86]
    + o curl-openssl: remove the OpenSSL headers and library versions check [35]
    + o curl.h: fix typo [129]
    + o curl: remove "separators" (when using globbed URLs) [32]
    + o curl_getdate.3: remove pointless .PP line [68]
    + o curl_multi_socket.3: remove callback and typical usage descriptions [7]
    + o curl_url_set.3: mention when CURLU_ALLOW_SPACE was added
    + o CURLMOPT_TIMERFUNCTION/DATA.3: fix the examples [27]
    + o CURLOPT_PROGRESSFUNCTION.3: fix example struct assignment [147]
    + o CURLOPT_RESOLVE.3: change example port to 443
    + o CURLOPT_XFERINFOFUNCTION.3: fix example struct assignment [153]
    + o CURLOPT_XFERINFOFUNCTION.3: fix typo in example [81]
    + o CURLSHOPT_LOCKFUNC.3: fix typo "relased" -> "released" [71]
    + o des: fix compile break for OpenSSL without DES [141]
    + o docs/cmdline-opts: add "mutexed" options for more http versions [25]
    + o docs/DEPRECATE: remove NPN support in August 2022 [64]
    + o docs: capitalize the name 'Netscape' [77]
    + o docs: document HTTP/2 not insisting on TLS 1.2 [49]
    + o docs: fix mandoc -T lint formatting complaints [2]
    + o docs: update IETF links to use datatracker [41]
    + o examples/curlx: support building with OpenSSL 1.1.0+ [148]
    + o examples/multi-app.c: call curl_multi_remove_handle as well [19]
    + o formdata: avoid size_t => long typecast overflows [37]
    + o ftp: provide error message for control bytes in path [66]
    + o gen.pl: terminate "example" sections better [4]
    + o gha: add a macOS CI job with libssh [142]
    + o gskit: Convert to using Curl_poll [111]
    + o gskit: Fix errors from Curl_strerror refactor [113]
    + o gskit: Fix initialization of Curl_ssl_gskit struct [112]
    + o h2/h3: allow CURLOPT_HTTPHEADER change ":scheme" [88]
    + o hostcheck: fixed to not touch used input strings [38]
    + o hostcheck: reduce strlen calls on chained certificates [92]
    + o hostip: avoid unused parameter error in Curl_resolv_check [144]
    + o http2: move two infof calls to debug-h2-only [145]
    + o http: make Curl_compareheader() take string length arguments too [87]
    + o if2ip: make Curl_ipv6_scope a blank macro when IPv6-disabled [104]
    + o KNOWN_BUGS: fix typo "libpsl"
    + o ldap: return CURLE_URL_MALFORMAT for bad URL [24]
    + o lib: remove support for CURL_DOES_CONVERSIONS [96]
    + o libssh2: don't typecast socket to int for libssh2_session_handshake [151]
    + o libssh: fix include files and defines use for Windows builds [156]
    + o Makefile.am: Generate VS 2022 projects
    + o maketgz: return error if 'make dist' fails [79]
    + o mbedtls: enable use of mbedtls without CRL support [57]
    + o mbedtls: enable use of mbedtls without filesystem functions support [100]
    + o mbedtls: fix CURLOPT_SSLCERT_BLOB (again)
    + o mbedtls: fix ssl_init error with mbedTLS 3.1.0+ [12]
    + o mbedtls: remove #include  [56]
    + o mbedtls: return CURLcode result instead of a mbedtls error code [1]
    + o md5: check md5_init_func return value
    + o mime: use a define instead of the magic number 24 [89]
    + o misc: allow curl to build with wolfssl --enable-opensslextra [43]
    + o misc: remove BeOS code and references [30]
    + o misc: remove the final watcom references [29]
    + o misc: remove unused data when IPv6 is not supported [80]
    + o mqtt: free 'sendleftovers' in disconnect [115]
    + o mqtt: free any send leftover data when done [36]
    + o multi: allow user callbacks to call curl_multi_assign [126]
    + o multi: grammar fix in comment [69]
    + o multi: remember connection_id before returning connection to pool [76]
    + o multi: set in_callback for multi interface callbacks [28]
    + o netware: remove support [72]
    + o next.d. remove .fi/.nf as they are handled by gen.pl [3]
    + o ngtcp2: adapt to changed end of headers callback proto [39]
    + o ngtcp2: fix declaration of ‘result’ shadows a previous local [14]
    + o ngtcp2: Reset dynbuf when it is fully drained [143]
    + o nss: handshake callback during shutdown has no conn->bundle [55]
    + o ntlm: remove unused feature defines [117]
    + o openldap: fix compiler warning when built without SSL support [70]
    + o openldap: implement SASL authentication [16]
    + o openldap: pass string length arguments to client_write() [116]
    + o openssl.h: avoid including OpenSSL headers here [15]
    + o openssl: check if sessionid flag is enabled before retrieving session [125]
    + o openssl: check SSL_get_ex_data to prevent potential NULL dereference [40]
    + o openssl: check the return value of BIO_new_mem_buf() [18]
    + o openssl: fix `ctx_option_t` for OpenSSL v3+
    + o openssl: fix build for version < 1.1.0 [134]
    + o openssl: return error if TLS 1.3 is requested when not supported [45]
    + o os400: Add function wrapper for system command [138]
    + o os400: Add link to QADRT devkit to README.OS400 [137]
    + o os400: Default build to target current release [139]
    + o OS400: fix typos in rpg include file [149]
    + o projects: add support for Visual Studio 17 (2022) [124]
    + o projects: fix Visual Studio wolfSSL configurations
    + o projects: remove support for MSVC before VC10 (Visual Studio 2010) [123]
    + o quiche: after leaving h3_recving state, poll again [108]
    + o quiche: change qlog file extension to `.sqlog` [44]
    + o quiche: fix upload for bigger content-length [146]
    + o quiche: handle stream reset [83]
    + o quiche: remove two leftover debug infof() outputs
    + o quiche: verify the server cert on connect [33]
    + o quiche: when *recv_body() returns data, drain it before polling again [109]
    + o README.md: fix links [118]
    + o remote-header-name.d: clarify [10]
    + o runtests.pl: disable debuginfod [51]
    + o runtests.pl: properly print the test if it contains binary zeros
    + o runtests.pl: support the nonewline attribute for the data part [21]
    + o runtests.pl: tolerate test directories without Makefile.inc [98]
    + o runtests: allow client/file to specify multiple directories
    + o runtests: make 'rustls' a testable feature
    + o runtests: make 'wolfssl' a testable feature [6]
    + o runtests: set 'oldlibssh' for libssh versions before 0.9.5 [122]
    + o rustls: add CURLOPT_CAINFO_BLOB support [26]
    + o schannel: move the algIds array out of schannel.h [135]
    + o scripts/cijobs.pl: output data about all currect CI jobs [78]
    + o scripts/completion.pl: improve zsh completion [46]
    + o scripts/copyright.pl: support many provided file names on the cmdline
    + o scripts/delta: check the file delta for current branch
    + o sectransp: mark a 3DES cipher as weak [130]
    + o setopt: do bounds-check before strdup [99]
    + o setopt: fix the TLSAUTH #ifdefs for proxy-disabled builds [53]
    + o sha256: Fix minimum OpenSSL version [102]
    + o smb: pass socket for writing and reading data instead of FIRSTSOCKET [90]
    + o ssl: reduce allocated space for ssl backend when FTP is disabled [127]
    + o test3021: disable all msys2 path transformation
    + o test374: gif data without new line at the end [20]
    + o tests/disable-scan.pl: properly detect multiple symbols per line [94]
    + o tests/unit/Makefile.am: add NSS_LIBS to build with NSS fine [85]
    + o tool_findfile: check ~/.config/curlrc too [17]
    + o tool_getparam: DNS options that need c-ares now fail without it [31]
    + o TPF: drop support [97]
    + o unit1610: init SSL library before calling SHA256 functions [152]
    + o url: exclude zonefrom_url when no ipv6 is available [103]
    + o url: given a user in the URL, find pwd for that user in netrc [11]
    + o url: keep trailing dot in host name [62]
    + o url: make Curl_disconnect return void [48]
    + o urlapi: handle "redirects" smarter [119]
    + o urldata: CONN_IS_PROXIED replaces bits.proxy when proxy can be disabled [52]
    + o urldata: remove conn->bits.user_passwd [105]
    + o version_win32: fix warning for `CURL_WINDOWS_APP` [93]
    + o vtls: fix socket check conditions [150]
    + o vtls: pass on the right SNI name [61]
    + o vxworks: drop support [65]
    + o winbuild: add parameter WITH_SSH [120]
    + o wolfssl: return CURLE_AGAIN for the SSL_ERROR_NONE case [106]
    + o wolfssl: when SSL_read() returns zero, check the error [107]
    + o write-out.d: Fix num_headers formatting
    + o x509asn1: toggle off functions not needed for diff tls backends [91]
     
     This release includes the following known bugs:
     
    @@ -141,124 +194,179 @@ This release includes the following known bugs:
     This release would not have looked like this without help, code, reports and
     advice from friends like these:
     
    -  Alessandro Ghedini, Bernat Mut, Bernhard Walle, Boris Rasin,
    -  Brad Fitzpatrick, Bruno Baguette, Damien Walsh, Dan Fandrich,
    -  Daniel Stenberg, David Bohman, Don J Olmstead, Eric Musser, Even Rouault,
    -  Florian Van Heghe, gclinch on github, Glenn Strauss, Jacob Hoffman-Andrews,
    -  James Fuller, Jeff Luszcz, jeffrson on github, Jun Tseng, Kevin Burke,
    -  Leszek Kubik, lllaffer on github, Marcelo Juchem, Marcel Raad, Marc Hörsken,
    -  Mark Dodgson, Matt Holt, Melroy van den Berg, Michał Antoniak,
    -  Nicolas Sterchele, nimaje on github, Patrick Monnerat, Paul Howarth,
    -  Peter Piekarski, Ray Satiro, RekGRpth on github, Rikard Falkeborn,
    -  Ryan Sleevi, Stan Hu, Stefan Eissing, Stefan Huber, Stephane Pellegrino,
    -  Stephen M. Coakley, Tobias Nießen, Valentin Richter, Viktor Szakats,
    -  Vincent Grande, Vladimir Panteleev, Wyatt O'Day, x2018 on github,
    -  Yongkang Huang,
    -  (53 contributors)
    +  1337vt on github, Alejandro R. Sedeño, Alessandro Ghedini, Antoine Pietri,
    +  Bernhard Walle, Bjarni Ingi Gislason, Cameron Will, Charles Cazabon,
    +  coralw on github, Dan Fandrich, Daniel Stenberg, Davide Cassioli,
    +  Eric Musser, Fabian Keil, Fabian Yamaguchi, Farzin on github, Filip Lundgren,
    +  gaoxingwang on github, Harry Sarson, Henrik Holst, Ikko Ashimine,
    +  illusory-dream on github, Jan Ehrhardt, Jan-Piet Mens, Jan Venekamp,
    +  Jean-Philippe Menil, jhoyla on github, Jim Beveridge, Joel Depooter,
    +  John H. Ayad, jonny112 on github, Kantanat Wannapaka, Kevin Adler,
    +  Kushal Das, Leah Neukirchen, Lucas Pardue, luminixinc on github,
    +  Manfred Schwarb, Marcel Raad, Melroy van den Berg, Michael Kaufmann,
    +  Michael Wallner, Michał Antoniak, Neal McBurnett, neutric on github,
    +  Niels Martignène, Patrick Monnerat, pheiduck on github, Ray Satiro,
    +  Rob Boeckermann, Ryan Schmidt, Samuel Henrique, Sandro Jaeckel,
    +  Satadru Pramanik, Sebastian Sterk, siddharthchhabrap on github, Stav Nir,
    +  Stefan Eissing, Stephen Boost, Stephen M. Coakley, Stewart Gebbie,
    +  Tatsuhiro Tsujikawa, updatede on github, Viktor Szakats, vl409 on github,
    +  Xiaoke Wang, 梦终无痕
    +  (67 contributors)
     
     References to bug reports and discussions on issues:
     
    - [1] = https://curl.se/bug/?i=7789
    - [2] = https://curl.se/bug/?i=7982
    - [3] = https://curl.se/bug/?i=7983
    - [4] = https://curl.se/bug/?i=7984
    - [5] = https://curl.se/bug/?i=8013
    - [6] = https://curl.se/bug/?i=8001
    - [7] = https://curl.se/bug/?i=8072
    - [8] = https://curl.se/bug/?i=8009
    - [9] = https://curl.se/bug/?i=8003
    - [10] = https://curl.se/bug/?i=8003
    - [11] = https://curl.se/bug/?i=8040
    - [12] = https://curl.se/bug/?i=8006
    - [13] = https://curl.se/bug/?i=8002
    - [14] = https://curl.se/bug/?i=7998
    - [15] = https://curl.se/bug/?i=8038
    - [16] = https://curl.se/bug/?i=8060
    - [17] = https://curl.se/bug/?i=7994
    - [18] = https://curl.se/bug/?i=7991
    - [19] = https://curl.se/bug/?i=7956
    - [20] = https://curl.se/bug/?i=8034
    - [21] = https://curl.se/bug/?i=8028
    - [22] = https://curl.se/bug/?i=8030
    - [23] = https://curl.se/bug/?i=8027
    - [24] = https://curl.se/bug/?i=8025
    - [25] = https://curl.se/bug/?i=8018
    - [26] = https://curl.se/bug/?i=8021
    - [27] = https://curl.se/bug/?i=8019
    - [28] = https://curl.se/bug/?i=8017
    - [29] = https://curl.se/bug/?i=8016
    - [30] = https://curl.se/bug/?i=8059
    - [31] = https://curl.se/bug/?i=8058
    - [32] = https://curl.se/bug/?i=8056
    - [33] = https://curl.se/bug/?i=8053
    - [34] = https://curl.se/bug/?i=8090
    - [35] = https://curl.se/bug/?i=8082
    - [36] = https://curl.se/bug/?i=8049
    - [37] = https://curl.se/bug/?i=8076
    - [38] = https://curl.se/bug/?i=8160
    - [39] = https://curl.se/bug/?i=8012
    - [40] = https://curl.se/bug/?i=7988
    - [41] = https://curl.se/bug/?i=8042
    - [42] = https://curl.se/bug/?i=7987
    - [43] = https://curl.se/bug/?i=8078
    - [44] = https://curl.se/bug/?i=8071
    - [45] = https://curl.se/bug/?i=8066
    - [46] = https://curl.se/bug/?i=8033
    - [47] = https://curl.se/bug/?i=8062
    - [48] = https://curl.se/bug/?i=8105
    - [49] = https://curl.se/bug/?i=8104
    - [50] = https://curl.se/bug/?i=8101
    - [51] = https://curl.se/bug/?i=8103
    - [52] = https://curl.se/bug/?i=8083
    - [53] = https://curl.se/bug/?i=8100
    - [54] = https://curl.se/bug/?i=8132
    - [55] = https://curl.se/bug/?i=8129
    - [56] = https://curl.se/bug/?i=8065
    - [57] = https://curl.se/bug/?i=8097
    - [58] = https://curl.se/bug/?i=8097
    - [59] = https://curl.se/bug/?i=8094
    - [60] = https://curl.se/bug/?i=8134
    - [61] = https://curl.se/bug/?i=8128
    - [62] = https://curl.se/bug/?i=8128
    - [63] = https://curl.se/bug/?i=8128
    - [64] = https://curl.se/bug/?i=8128
    - [65] = https://curl.se/bug/?i=8127
    - [66] = https://curl.se/bug/?i=8126
    - [67] = https://curl.se/bug/?i=8147
    - [68] = https://curl.se/bug/?i=8125
    - [69] = https://curl.se/bug/?i=8140
    - [70] = https://curl.se/bug/?i=8120
    - [71] = https://curl.se/bug/?i=8148
    - [72] = https://curl.se/bug/?i=8146
    - [73] = https://curl.se/bug/?i=8142
    - [74] = https://curl.se/bug/?i=8159
    - [75] = https://curl.se/bug/?i=7922
    - [76] = https://curl.se/bug/?i=8084
    - [77] = https://curl.se/bug/?i=8136
    - [78] = https://curl.se/bug/?i=8137
    - [79] = https://curl.se/bug/?i=8133
    - [80] = https://curl.se/bug/?i=8162
    - [81] = https://curl.se/bug/?i=8141
    - [82] = https://curl.se/bug/?i=8158
    - [83] = https://curl.se/bug/?i=8156
    - [84] = https://curl.se/bug/?i=8218
    - [85] = https://curl.se/bug/?i=8218
    - [86] = https://curl.se/bug/?i=8181
    - [87] = https://curl.se/bug/?i=8210
    - [88] = https://curl.se/bug/?i=8177
    - [89] = https://curl.se/bug/?i=8171
    - [90] = https://curl.se/bug/?i=8215
    - [91] = https://curl.se/bug/?i=8216
    - [92] = https://curl.se/bug/?i=8215
    - [93] = https://curl.se/bug/?i=8214
    - [94] = https://curl.se/bug/?i=8207
    - [95] = https://curl.se/bug/?i=8206
    - [96] = https://curl.se/bug/?i=8212
    - [98] = https://curl.se/bug/?i=8200
    - [99] = https://curl.se/bug/?i=8197
    - [100] = https://curl.se/bug/?i=8193
    - [101] = https://curl.se/bug/?i=8178
    - [102] = https://curl.se/bug/?i=8178
    - [103] = https://curl.se/bug/?i=8196
    - [104] = https://curl.se/bug/?i=8184
    - [105] = https://curl.se/bug/?i=8180
    + [1] = https://curl.se/bug/?i=8266
    + [2] = https://curl.se/bug/?i=8228
    + [3] = https://curl.se/bug/?i=8228
    + [4] = https://curl.se/bug/?i=8228
    + [5] = https://curl.se/bug/?i=8229
    + [6] = https://curl.se/bug/?i=8252
    + [7] = https://curl.se/bug/?i=8262
    + [8] = https://curl.se/bug/?i=8251
    + [9] = https://curl.se/bug/?i=8229
    + [10] = https://curl.se/bug/?i=8249
    + [11] = https://curl.se/bug/?i=8241
    + [12] = https://curl.se/bug/?i=8238
    + [13] = https://curl.se/bug/?i=8244
    + [14] = https://curl.se/bug/?i=8245
    + [15] = https://curl.se/bug/?i=8240
    + [16] = https://curl.se/bug/?i=8152
    + [17] = https://curl.se/bug/?i=8208
    + [18] = https://curl.se/bug/?i=8233
    + [19] = https://curl.se/bug/?i=8234
    + [20] = https://curl.se/bug/?i=8239
    + [21] = https://curl.se/bug/?i=8239
    + [22] = https://curl.se/bug/?i=7964
    + [23] = https://curl.se/bug/?i=8188
    + [24] = https://curl.se/bug/?i=8170
    + [25] = https://curl.se/bug/?i=8254
    + [26] = https://curl.se/bug/?i=8255
    + [27] = https://curl.se/bug/?i=8286
    + [28] = https://curl.se/bug/?i=8282
    + [29] = https://curl.se/bug/?i=8287
    + [30] = https://curl.se/bug/?i=8288
    + [31] = https://curl.se/bug/?i=8285
    + [32] = https://curl.se/bug/?i=8278
    + [33] = https://curl.se/bug/?i=8173
    + [34] = https://curl.se/bug/?i=8281
    + [35] = https://curl.se/bug/?i=8279
    + [36] = https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=43515
    + [37] = https://hackerone.com/reports/1444539
    + [38] = https://curl.se/bug/?i=8321
    + [39] = https://curl.se/bug/?i=8322
    + [40] = https://curl.se/bug/?i=8268
    + [41] = https://curl.se/bug/?i=8317
    + [42] = https://curl.se/bug/?i=8315
    + [43] = https://curl.se/bug/?i=8292
    + [44] = https://curl.se/bug/?i=8316
    + [45] = https://curl.se/bug/?i=8309
    + [46] = https://curl.se/bug/?i=8363
    + [47] = https://curl.se/bug/?i=8307
    + [48] = https://curl.se/bug/?i=8303
    + [49] = https://curl.se/bug/?i=8235
    + [50] = https://curl.se/bug/?i=8299
    + [51] = https://curl.se/bug/?i=8291
    + [52] = https://curl.se/bug/?i=8350
    + [53] = https://curl.se/bug/?i=8350
    + [54] = https://curl.se/bug/?i=8276
    + [55] = https://curl.se/bug/?i=8341
    + [56] = https://curl.se/bug/?i=8343
    + [57] = https://curl.se/bug/?i=8344
    + [58] = https://curl.se/bug/?i=8340
    + [59] = https://curl.se/bug/?i=8338
    + [60] = https://curl.se/bug/?i=8334
    + [61] = https://curl.se/bug/?i=8320
    + [62] = https://curl.se/bug/?i=8290
    + [63] = https://curl.se/bug/?i=8372
    + [64] = https://curl.se/bug/?i=8458
    + [65] = https://curl.se/bug/?i=8362
    + [66] = https://curl.se/bug/?i=8460
    + [67] = https://curl.se/bug/?i=8314
    + [68] = https://curl.se/bug/?i=8365
    + [69] = https://curl.se/bug/?i=8368
    + [70] = https://curl.se/bug/?i=8367
    + [71] = https://curl.se/bug/?i=8364
    + [72] = https://curl.se/bug/?i=8358
    + [73] = https://curl.se/bug/?i=8359
    + [74] = https://curl.se/bug/?i=8357
    + [75] = https://curl.se/bug/?i=8357
    + [76] = https://hackerone.com/reports/1463013
    + [77] = https://curl.se/bug/?i=8354
    + [78] = https://curl.se/bug/?i=8408
    + [79] = https://curl.se/mail/lib-2022-02/0070.html
    + [80] = https://curl.se/bug/?i=8430
    + [81] = https://curl.se/bug/?i=8487
    + [82] = https://curl.se/bug/?i=8397
    + [83] = https://curl.se/bug/?i=8437
    + [84] = https://curl.se/bug/?i=8396
    + [85] = https://curl.se/bug/?i=8396
    + [86] = https://curl.se/bug/?i=8394
    + [87] = https://curl.se/bug/?i=8391
    + [88] = https://curl.se/bug/?i=8381
    + [89] = https://curl.se/bug/?i=8441
    + [90] = https://curl.se/bug/?i=8383
    + [91] = https://curl.se/bug/?i=8386
    + [92] = https://curl.se/bug/?i=8428
    + [93] = https://curl.se/bug/?i=8385
    + [94] = https://curl.se/bug/?i=8384
    + [95] = https://curl.se/bug/?i=8382
    + [96] = https://curl.se/bug/?i=8378
    + [97] = https://curl.se/bug/?i=8378
    + [98] = https://curl.se/bug/?i=8379
    + [99] = https://curl.se/bug/?i=8377
    + [100] = https://curl.se/bug/?i=8376
    + [101] = https://curl.se/bug/?i=8375
    + [102] = https://curl.se/bug/?i=8464
    + [103] = https://curl.se/bug/?i=8439
    + [104] = https://curl.se/bug/?i=8439
    + [105] = https://curl.se/bug/?i=8449
    + [106] = https://curl.se/bug/?i=8431
    + [107] = https://curl.se/bug/?i=8431
    + [108] = https://curl.se/bug/?i=8436
    + [109] = https://curl.se/bug/?i=8429
    + [110] = https://curl.se/bug/?i=8425
    + [111] = https://curl.se/bug/?i=8454
    + [112] = https://curl.se/bug/?i=8454
    + [113] = https://curl.se/bug/?i=8454
    + [114] = https://curl.se/bug/?i=8395
    + [115] = https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=43646
    + [116] = https://curl.se/bug/?i=8404
    + [117] = https://curl.se/bug/?i=8453
    + [118] = https://curl.se/bug/?i=8448
    + [119] = https://curl.se/bug/?i=8450
    + [120] = https://curl.se/bug/?i=8514
    + [121] = https://curl.se/bug/?i=8444
    + [122] = https://curl.se/bug/?i=8444
    + [123] = https://curl.se/bug/?i=8442
    + [124] = https://curl.se/bug/?i=8438
    + [125] = https://curl.se/bug/?i=8472
    + [126] = https://curl.se/bug/?i=8480
    + [127] = https://curl.se/bug/?i=8471
    + [128] = https://curl.se/bug/?i=8481
    + [129] = https://curl.se/bug/?i=8482
    + [130] = https://curl.se/bug/?i=8479
    + [131] = https://curl.se/bug/?i=8476
    + [132] = https://curl.se/bug/?i=8475
    + [133] = https://curl.se/bug/?i=8474
    + [134] = https://curl.se/bug/?i=8470
    + [135] = https://curl.se/bug/?i=8469
    + [136] = https://curl.se/bug/?i=8289
    + [137] = https://curl.se/bug/?i=8455
    + [138] = https://curl.se/bug/?i=8455
    + [139] = https://curl.se/bug/?i=8455
    + [140] = https://curl.se/bug/?i=8512
    + [141] = https://curl.se/bug/?i=8459
    + [142] = https://curl.se/bug/?i=8513
    + [143] = https://curl.se/bug/?i=7351
    + [144] = https://curl.se/bug/?i=8505
    + [145] = https://curl.se/bug/?i=8502
    + [146] = https://curl.se/bug/?i=8421
    + [147] = https://curl.se/bug/?i=8500
    + [148] = https://curl.se/bug/?i=8529
    + [149] = https://curl.se/bug/?i=8494
    + [150] = https://curl.se/bug/?i=8493
    + [151] = https://curl.se/bug/?i=8492
    + [152] = https://curl.se/bug/?i=8538
    + [153] = https://curl.se/bug/?i=8519
    + [154] = https://curl.se/bug/?i=8511
    + [156] = https://curl.se/mail/lib-2022-02/0131.html
    diff --git a/vendor/curl/include/curl/curl.h b/vendor/curl/include/curl/curl.h
    index 7b69ce2d67..2e260d5168 100644
    --- a/vendor/curl/include/curl/curl.h
    +++ b/vendor/curl/include/curl/curl.h
    @@ -7,7 +7,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2021, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -73,8 +73,7 @@
         defined(ANDROID) || defined(__ANDROID__) || defined(__OpenBSD__) || \
         defined(__CYGWIN__) || defined(AMIGA) || defined(__NuttX__) || \
        (defined(__FreeBSD_version) && (__FreeBSD_version < 800000)) || \
    -   (defined(__MidnightBSD_version) && (__MidnightBSD_version < 100000)) || \
    -    defined(__VXWORKS__)
    +   (defined(__MidnightBSD_version) && (__MidnightBSD_version < 100000))
     #include 
     #endif
     
    @@ -82,14 +81,10 @@
     #include 
     #endif
     
    -#if !defined(CURL_WIN32) && !defined(__WATCOMC__) && !defined(__VXWORKS__)
    +#if !defined(CURL_WIN32)
     #include 
     #endif
     
    -#ifdef __BEOS__
    -#include 
    -#endif
    -
     /* Compatibility for non-Clang compilers */
     #ifndef __has_declspec_attribute
     #  define __has_declspec_attribute(x) 0
    @@ -529,10 +524,6 @@ typedef enum {
       CURLE_UPLOAD_FAILED,           /* 25 - failed upload "command" */
       CURLE_READ_ERROR,              /* 26 - couldn't open/read from file */
       CURLE_OUT_OF_MEMORY,           /* 27 */
    -  /* Note: CURLE_OUT_OF_MEMORY may sometimes indicate a conversion error
    -           instead of a memory allocation error if CURL_DOES_CONVERSIONS
    -           is defined
    -  */
       CURLE_OPERATION_TIMEDOUT,      /* 28 - the timeout time was reached */
       CURLE_OBSOLETE29,              /* 29 - NOT USED */
       CURLE_FTP_PORT_FAILED,         /* 30 - FTP PORT operation failed */
    @@ -569,7 +560,7 @@ typedef enum {
       CURLE_PEER_FAILED_VERIFICATION, /* 60 - peer's certificate or fingerprint
                                          wasn't verified fine */
       CURLE_BAD_CONTENT_ENCODING,    /* 61 - Unrecognized/bad encoding */
    -  CURLE_LDAP_INVALID_URL,        /* 62 - Invalid LDAP URL */
    +  CURLE_OBSOLETE62,              /* 62 - NOT IN USE since 7.82.0 */
       CURLE_FILESIZE_EXCEEDED,       /* 63 - Maximum file size exceeded */
       CURLE_USE_SSL_FAILED,          /* 64 - Requested FTP SSL level failed */
       CURLE_SEND_FAIL_REWIND,        /* 65 - Sending the data requires a rewind
    @@ -585,11 +576,7 @@ typedef enum {
       CURLE_REMOTE_FILE_EXISTS,      /* 73 - File already exists */
       CURLE_TFTP_NOSUCHUSER,         /* 74 - No such user */
       CURLE_CONV_FAILED,             /* 75 - conversion failed */
    -  CURLE_CONV_REQD,               /* 76 - caller must register conversion
    -                                    callbacks using curl_easy_setopt options
    -                                    CURLOPT_CONV_FROM_NETWORK_FUNCTION,
    -                                    CURLOPT_CONV_TO_NETWORK_FUNCTION, and
    -                                    CURLOPT_CONV_FROM_UTF8_FUNCTION */
    +  CURLE_OBSOLETE76,              /* 76 - NOT IN USE since 7.82.0 */
       CURLE_SSL_CACERT_BADFILE,      /* 77 - could not load CACERT file, missing
                                         or wrong format */
       CURLE_REMOTE_FILE_NOT_FOUND,   /* 78 - remote file not found */
    @@ -683,13 +670,13 @@ typedef enum {
     /* The following were added earlier */
     
     #define CURLE_OPERATION_TIMEOUTED CURLE_OPERATION_TIMEDOUT
    -
     #define CURLE_HTTP_NOT_FOUND CURLE_HTTP_RETURNED_ERROR
     #define CURLE_HTTP_PORT_FAILED CURLE_INTERFACE_FAILED
     #define CURLE_FTP_COULDNT_STOR_FILE CURLE_UPLOAD_FAILED
    -
     #define CURLE_FTP_PARTIAL_FILE CURLE_PARTIAL_FILE
     #define CURLE_FTP_BAD_DOWNLOAD_RESUME CURLE_BAD_DOWNLOAD_RESUME
    +#define CURLE_LDAP_INVALID_URL CURLE_OBSOLETE62
    +#define CURLE_CONV_REQD CURLE_OBSOLETE76
     
     /* This was the error code 50 in 7.7.3 and a few earlier versions, this
        is no longer used by libcurl but is instead #defined here only to not
    @@ -2832,7 +2819,7 @@ typedef enum {
       CURLCLOSEPOLICY_LAST /* last, never use this */
     } curl_closepolicy;
     
    -#define CURL_GLOBAL_SSL (1<<0) /* no purpose since since 7.57.0 */
    +#define CURL_GLOBAL_SSL (1<<0) /* no purpose since 7.57.0 */
     #define CURL_GLOBAL_WIN32 (1<<1)
     #define CURL_GLOBAL_ALL (CURL_GLOBAL_SSL|CURL_GLOBAL_WIN32)
     #define CURL_GLOBAL_NOTHING 0
    diff --git a/vendor/curl/include/curl/curlver.h b/vendor/curl/include/curl/curlver.h
    index 6d2f99b6da..14d168e935 100644
    --- a/vendor/curl/include/curl/curlver.h
    +++ b/vendor/curl/include/curl/curlver.h
    @@ -7,7 +7,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2021, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -26,16 +26,16 @@
        a script at release-time. This was made its own header file in 7.11.2 */
     
     /* This is the global package copyright */
    -#define LIBCURL_COPYRIGHT "1996 - 2021 Daniel Stenberg, ."
    +#define LIBCURL_COPYRIGHT "1996 - 2022 Daniel Stenberg, ."
     
     /* This is the version number of the libcurl package from which this header
        file origins: */
    -#define LIBCURL_VERSION "7.81.0"
    +#define LIBCURL_VERSION "7.82.0"
     
     /* The numeric version number is also available "in parts" by using these
        defines: */
     #define LIBCURL_VERSION_MAJOR 7
    -#define LIBCURL_VERSION_MINOR 81
    +#define LIBCURL_VERSION_MINOR 82
     #define LIBCURL_VERSION_PATCH 0
     
     /* This is the numeric version of the libcurl version number, meant for easier
    @@ -57,7 +57,7 @@
        CURL_VERSION_BITS() macro since curl's own configure script greps for it
        and needs it to contain the full number.
     */
    -#define LIBCURL_VERSION_NUM 0x075100
    +#define LIBCURL_VERSION_NUM 0x075200
     
     /*
      * This is the date and time when the full source package was created. The
    @@ -68,7 +68,7 @@
      *
      * "2007-11-23"
      */
    -#define LIBCURL_TIMESTAMP "2022-01-05"
    +#define LIBCURL_TIMESTAMP "2022-03-05"
     
     #define CURL_VERSION_BITS(x,y,z) ((x)<<16|(y)<<8|(z))
     #define CURL_AT_LEAST_VERSION(x,y,z) \
    diff --git a/vendor/curl/include/curl/system.h b/vendor/curl/include/curl/system.h
    index faf8fcf84f..038ac0b167 100644
    --- a/vendor/curl/include/curl/system.h
    +++ b/vendor/curl/include/curl/system.h
    @@ -7,7 +7,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2020, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -98,22 +98,6 @@
     #  define CURL_SUFFIX_CURL_OFF_TU    UL
     #  define CURL_TYPEOF_CURL_SOCKLEN_T int
     
    -#elif defined(__WATCOMC__)
    -#  if defined(__386__)
    -#    define CURL_TYPEOF_CURL_OFF_T     __int64
    -#    define CURL_FORMAT_CURL_OFF_T     "I64d"
    -#    define CURL_FORMAT_CURL_OFF_TU    "I64u"
    -#    define CURL_SUFFIX_CURL_OFF_T     i64
    -#    define CURL_SUFFIX_CURL_OFF_TU    ui64
    -#  else
    -#    define CURL_TYPEOF_CURL_OFF_T     long
    -#    define CURL_FORMAT_CURL_OFF_T     "ld"
    -#    define CURL_FORMAT_CURL_OFF_TU    "lu"
    -#    define CURL_SUFFIX_CURL_OFF_T     L
    -#    define CURL_SUFFIX_CURL_OFF_TU    UL
    -#  endif
    -#  define CURL_TYPEOF_CURL_SOCKLEN_T int
    -
     #elif defined(__POCC__)
     #  if (__POCC__ < 280)
     #    define CURL_TYPEOF_CURL_OFF_T     long
    diff --git a/vendor/curl/lib/altsvc.c b/vendor/curl/lib/altsvc.c
    index 36acc3a5ef..242733bfd7 100644
    --- a/vendor/curl/lib/altsvc.c
    +++ b/vendor/curl/lib/altsvc.c
    @@ -5,7 +5,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 2019 - 2021, Daniel Stenberg, , et al.
    + * Copyright (C) 2019 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -21,7 +21,7 @@
      ***************************************************************************/
     /*
      * The Alt-Svc: header is defined in RFC 7838:
    - * https://tools.ietf.org/html/rfc7838
    + * https://datatracker.ietf.org/doc/html/rfc7838
      */
     #include "curl_setup.h"
     
    diff --git a/vendor/curl/lib/base64.c b/vendor/curl/lib/base64.c
    index be6f163dc4..960a1ca3ad 100644
    --- a/vendor/curl/lib/base64.c
    +++ b/vendor/curl/lib/base64.c
    @@ -5,7 +5,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2020, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -34,7 +34,6 @@
     #include "urldata.h" /* for the Curl_easy definition */
     #include "warnless.h"
     #include "curl_base64.h"
    -#include "non-ascii.h"
     
     /* The last 3 #include files should be in this order */
     #include "curl_printf.h"
    @@ -176,19 +175,15 @@ CURLcode Curl_base64_decode(const char *src,
     }
     
     static CURLcode base64_encode(const char *table64,
    -                              struct Curl_easy *data,
                                   const char *inputbuff, size_t insize,
                                   char **outptr, size_t *outlen)
     {
    -  CURLcode result;
       unsigned char ibuf[3];
       unsigned char obuf[4];
       int i;
       int inputparts;
       char *output;
       char *base64data;
    -  char *convbuf = NULL;
    -
       const char *indata = inputbuff;
     
       *outptr = NULL;
    @@ -206,20 +201,6 @@ static CURLcode base64_encode(const char *table64,
       if(!output)
         return CURLE_OUT_OF_MEMORY;
     
    -  /*
    -   * The base64 data needs to be created using the network encoding
    -   * not the host encoding.  And we can't change the actual input
    -   * so we copy it to a buffer, translate it, and use that instead.
    -   */
    -  result = Curl_convert_clone(data, indata, insize, &convbuf);
    -  if(result) {
    -    free(output);
    -    return result;
    -  }
    -
    -  if(convbuf)
    -    indata = (char *)convbuf;
    -
       while(insize > 0) {
         for(i = inputparts = 0; i < 3; i++) {
           if(insize > 0) {
    @@ -270,10 +251,8 @@ static CURLcode base64_encode(const char *table64,
       /* Return the pointer to the new data (allocated memory) */
       *outptr = base64data;
     
    -  free(convbuf);
    -
       /* Return the length of the new data */
    -  *outlen = strlen(base64data);
    +  *outlen = output - base64data;
     
       return CURLE_OK;
     }
    @@ -295,11 +274,10 @@ static CURLcode base64_encode(const char *table64,
      *
      * @unittest: 1302
      */
    -CURLcode Curl_base64_encode(struct Curl_easy *data,
    -                            const char *inputbuff, size_t insize,
    +CURLcode Curl_base64_encode(const char *inputbuff, size_t insize,
                                 char **outptr, size_t *outlen)
     {
    -  return base64_encode(base64, data, inputbuff, insize, outptr, outlen);
    +  return base64_encode(base64, inputbuff, insize, outptr, outlen);
     }
     
     /*
    @@ -319,11 +297,10 @@ CURLcode Curl_base64_encode(struct Curl_easy *data,
      *
      * @unittest: 1302
      */
    -CURLcode Curl_base64url_encode(struct Curl_easy *data,
    -                               const char *inputbuff, size_t insize,
    +CURLcode Curl_base64url_encode(const char *inputbuff, size_t insize,
                                    char **outptr, size_t *outlen)
     {
    -  return base64_encode(base64url, data, inputbuff, insize, outptr, outlen);
    +  return base64_encode(base64url, inputbuff, insize, outptr, outlen);
     }
     
     #endif /* no users so disabled */
    diff --git a/vendor/curl/lib/c-hyper.c b/vendor/curl/lib/c-hyper.c
    index c253cd36ed..8015de25bc 100644
    --- a/vendor/curl/lib/c-hyper.c
    +++ b/vendor/curl/lib/c-hyper.c
    @@ -5,7 +5,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2021, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -142,7 +142,7 @@ static int hyper_each_header(void *userdata,
           return HYPER_ITER_BREAK;
       }
       else {
    -    if(Curl_dyn_add(&data->state.headerb, "\r\n"))
    +    if(Curl_dyn_addn(&data->state.headerb, STRCONST("\r\n")))
           return HYPER_ITER_BREAK;
       }
       len = Curl_dyn_len(&data->state.headerb);
    @@ -1022,7 +1022,8 @@ CURLcode Curl_http(struct Curl_easy *data, bool *done)
           goto error;
       }
     
    -  p_accept = Curl_checkheaders(data, "Accept")?NULL:"Accept: */*\r\n";
    +  p_accept = Curl_checkheaders(data,
    +                               STRCONST("Accept"))?NULL:"Accept: */*\r\n";
       if(p_accept) {
         result = Curl_hyper_header(data, headers, p_accept);
         if(result)
    @@ -1036,8 +1037,8 @@ CURLcode Curl_http(struct Curl_easy *data, bool *done)
     
     #ifndef CURL_DISABLE_PROXY
       if(conn->bits.httpproxy && !conn->bits.tunnel_proxy &&
    -     !Curl_checkheaders(data, "Proxy-Connection") &&
    -     !Curl_checkProxyheaders(data, conn, "Proxy-Connection")) {
    +     !Curl_checkheaders(data, STRCONST("Proxy-Connection")) &&
    +     !Curl_checkProxyheaders(data, conn, STRCONST("Proxy-Connection"))) {
         result = Curl_hyper_header(data, headers, "Proxy-Connection: Keep-Alive");
         if(result)
           goto error;
    @@ -1045,7 +1046,7 @@ CURLcode Curl_http(struct Curl_easy *data, bool *done)
     #endif
     
       Curl_safefree(data->state.aptr.ref);
    -  if(data->state.referer && !Curl_checkheaders(data, "Referer")) {
    +  if(data->state.referer && !Curl_checkheaders(data, STRCONST("Referer"))) {
         data->state.aptr.ref = aprintf("Referer: %s\r\n", data->state.referer);
         if(!data->state.aptr.ref)
           result = CURLE_OUT_OF_MEMORY;
    @@ -1055,7 +1056,7 @@ CURLcode Curl_http(struct Curl_easy *data, bool *done)
           goto error;
       }
     
    -  if(!Curl_checkheaders(data, "Accept-Encoding") &&
    +  if(!Curl_checkheaders(data, STRCONST("Accept-Encoding")) &&
          data->set.str[STRING_ENCODING]) {
         Curl_safefree(data->state.aptr.accept_encoding);
         data->state.aptr.accept_encoding =
    diff --git a/vendor/curl/lib/config-dos.h b/vendor/curl/lib/config-dos.h
    index 6859208ab3..b8e7dbd3fb 100644
    --- a/vendor/curl/lib/config-dos.h
    +++ b/vendor/curl/lib/config-dos.h
    @@ -7,7 +7,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2021, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -31,8 +31,6 @@
       #define OS  "MSDOS/djgpp"
     #elif defined(__HIGHC__)
       #define OS  "MSDOS/HighC"
    -#elif defined(__WATCOMC__)
    -  #define OS  "MSDOS/Watcom"
     #else
       #define OS  "MSDOS/?"
     #endif
    @@ -154,9 +152,6 @@
       #define HAVE_TERMIOS_H  1
       #define HAVE_VARIADIC_MACROS_GCC 1
     
    -#elif defined(__WATCOMC__)
    -  #define HAVE_STRCASECMP 1
    -
     #elif defined(__HIGHC__)
       #define HAVE_SYS_TIME_H 1
       #define strerror(e) strerror_s_((e))
    diff --git a/vendor/curl/lib/config-linux.h b/vendor/curl/lib/config-linux.h
    index d64998fa57..cdcb20b035 100644
    --- a/vendor/curl/lib/config-linux.h
    +++ b/vendor/curl/lib/config-linux.h
    @@ -493,15 +493,13 @@
     /* Define to 1 if you have the  header file. */
     /* #undef HAVE_OPENSSL_RSA_H */
     
    -/* if you have the function SRP_Calc_client_key */
    +/* if you have the functions SSL_CTX_set_srp_username and
    +   SSL_CTX_set_srp_password */
     /* #undef HAVE_OPENSSL_SRP */
     
     /* Define to 1 if you have the  header file. */
     /* #undef HAVE_OPENSSL_SSL_H */
     
    -/* Define to 1 if you have the `OpenSSL_version' function. */
    -/* #undef HAVE_OPENSSL_VERSION */
    -
     /* Define to 1 if you have the  header file. */
     /* #undef HAVE_OPENSSL_X509_H */
     
    @@ -601,9 +599,6 @@
     /* Define to 1 if you have the  header file. */
     /* #undef HAVE_SOCKET_H */
     
    -/* Define to 1 if you have the `SSLv2_client_method' function. */
    -/* #undef HAVE_SSLV2_CLIENT_METHOD */
    -
     /* Define to 1 if you have the `SSL_get_ech_status' function. */
     /* #undef HAVE_SSL_GET_ECH_STATUS */
     
    @@ -966,9 +961,6 @@
     /* if mbedTLS is enabled */
     /* #undef USE_MBEDTLS */
     
    -/* if MesaLink is enabled */
    -/* #undef USE_MESALINK */
    -
     /* if nghttp2 is in use */
     /* #undef USE_NGHTTP2 */
     
    diff --git a/vendor/curl/lib/config-macos.h b/vendor/curl/lib/config-macos.h
    index ce5bfa3f54..6ac266e179 100644
    --- a/vendor/curl/lib/config-macos.h
    +++ b/vendor/curl/lib/config-macos.h
    @@ -493,15 +493,13 @@
     /* Define to 1 if you have the  header file. */
     /* #undef HAVE_OPENSSL_RSA_H */
     
    -/* if you have the function SRP_Calc_client_key */
    +/* if you have the functions SSL_CTX_set_srp_username and
    +   SSL_CTX_set_srp_password */
     /* #undef HAVE_OPENSSL_SRP */
     
     /* Define to 1 if you have the  header file. */
     /* #undef HAVE_OPENSSL_SSL_H */
     
    -/* Define to 1 if you have the `OpenSSL_version' function. */
    -/* #undef HAVE_OPENSSL_VERSION */
    -
     /* Define to 1 if you have the  header file. */
     /* #undef HAVE_OPENSSL_X509_H */
     
    @@ -601,9 +599,6 @@
     /* Define to 1 if you have the  header file. */
     /* #undef HAVE_SOCKET_H */
     
    -/* Define to 1 if you have the `SSLv2_client_method' function. */
    -/* #undef HAVE_SSLV2_CLIENT_METHOD */
    -
     /* Define to 1 if you have the `SSL_get_ech_status' function. */
     /* #undef HAVE_SSL_GET_ECH_STATUS */
     
    @@ -821,7 +816,7 @@
     /* #undef NTLM_WB_FILE */
     
     /* cpu-machine-OS */
    -#define OS "x86_64-apple-darwin21.2.0"
    +#define OS "x86_64-apple-darwin21.4.0"
     
     /* Name of package */
     #define PACKAGE "curl"
    @@ -966,9 +961,6 @@
     /* if mbedTLS is enabled */
     /* #undef USE_MBEDTLS */
     
    -/* if MesaLink is enabled */
    -/* #undef USE_MESALINK */
    -
     /* if nghttp2 is in use */
     /* #undef USE_NGHTTP2 */
     
    diff --git a/vendor/curl/lib/config-tpf.h b/vendor/curl/lib/config-tpf.h
    deleted file mode 100644
    index cce06cedd8..0000000000
    --- a/vendor/curl/lib/config-tpf.h
    +++ /dev/null
    @@ -1,680 +0,0 @@
    -#ifndef HEADER_CURL_CONFIG_TPF_H
    -#define HEADER_CURL_CONFIG_TPF_H
    -/***************************************************************************
    - *                                  _   _ ____  _
    - *  Project                     ___| | | |  _ \| |
    - *                             / __| | | | |_) | |
    - *                            | (__| |_| |  _ <| |___
    - *                             \___|\___/|_| \_\_____|
    - *
    - * Copyright (C) 1998 - 2021, Daniel Stenberg, , et al.
    - *
    - * This software is licensed as described in the file COPYING, which
    - * you should have received as part of this distribution. The terms
    - * are also available at https://curl.se/docs/copyright.html.
    - *
    - * You may opt to use, copy, modify, merge, publish, distribute and/or sell
    - * copies of the Software, and permit persons to whom the Software is
    - * furnished to do so, under the terms of the COPYING file.
    - *
    - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
    - * KIND, either express or implied.
    - *
    - ***************************************************************************/
    -
    -/* ================================================================ */
    -/*                 Hand crafted config file for TPF                 */
    -/* ================================================================ */
    -
    -/* ---------------------------------------------------------------- */
    -/*            FEATURES, FUNCTIONS, and DEFINITIONS                  */
    -/* ---------------------------------------------------------------- */
    -
    -/* NOTE: Refer also to the .mak file for some of the flags below */
    -
    -/* to disable cookies support */
    -/* #undef CURL_DISABLE_COOKIES */
    -
    -/* to disable cryptographic authentication */
    -/* #undef CURL_DISABLE_CRYPTO_AUTH */
    -
    -/* to disable DICT */
    -/* #undef CURL_DISABLE_DICT */
    -
    -/* to disable FILE */
    -/* #undef CURL_DISABLE_FILE */
    -
    -/* to disable FTP */
    -/* #undef CURL_DISABLE_FTP */
    -
    -/* to disable HTTP */
    -/* #undef CURL_DISABLE_HTTP */
    -
    -/* to disable LDAP */
    -/* #undef CURL_DISABLE_LDAP */
    -
    -/* to disable TELNET */
    -/* #undef CURL_DISABLE_TELNET */
    -
    -/* to disable TFTP */
    -/* #undef CURL_DISABLE_TFTP */
    -
    -/* to disable verbose strings */
    -/* #undef CURL_DISABLE_VERBOSE_STRINGS */
    -
    -/* lber dynamic library file */
    -/* #undef DL_LBER_FILE */
    -
    -/* ldap dynamic library file */
    -/* #undef DL_LDAP_FILE */
    -
    -/* your Entropy Gathering Daemon socket pathname */
    -/* #undef EGD_SOCKET */
    -
    -/* Define if you want to enable IPv6 support */
    -/* #undef ENABLE_IPV6 */
    -
    -/* Define if struct sockaddr_in6 has the sin6_scope_id member */
    -/* #undef HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID */
    -
    -/* Define to 1 if you have the alarm function. */
    -#define HAVE_ALARM 1
    -
    -/* Define to 1 if you have the  header file. */
    -#define HAVE_ARPA_INET_H 1
    -
    -/* Define to 1 if you have the  header file. */
    -/* #undef HAVE_ARPA_TFTP_H */
    -
    -/* Define to 1 if you have the  header file. */
    -#define HAVE_ASSERT_H 1
    -
    -/* Define to 1 if you have the `basename' function. */
    -#define HAVE_BASENAME 1
    -
    -/* Define to 1 if you have the `closesocket' function. */
    -/* #undef HAVE_CLOSESOCKET */
    -
    -/* Define to 1 if you have the `CRYPTO_cleanup_all_ex_data' function. */
    -/* #undef HAVE_CRYPTO_CLEANUP_ALL_EX_DATA */
    -#define HAVE_CRYPTO_CLEANUP_ALL_EX_DATA 1
    -
    -/* Define to 1 if you have the  header file. */
    -#define HAVE_ERRNO_H 1
    -
    -/* Define to 1 if you have the  header file. */
    -#define HAVE_FCNTL_H 1
    -
    -/* Define to 1 if you have the fcntl function. */
    -#define HAVE_FCNTL 1
    -
    -/* Define to 1 if you have a working fcntl O_NONBLOCK function. */
    -#define HAVE_FCNTL_O_NONBLOCK 1
    -
    -/* Define to 1 if you have the `ftruncate' function. */
    -#define HAVE_FTRUNCATE 1
    -
    -/* Define if getaddrinfo exists and works */
    -/* #undef HAVE_GETADDRINFO */
    -
    -/* Define to 1 if you have the `geteuid' function. */
    -#define HAVE_GETEUID 1
    -
    -/* If you have gethostbyname */
    -#define HAVE_GETHOSTBYNAME 1
    -
    -/* Define to 1 if you have the `gethostbyname_r' function. */
    -/* #undef HAVE_GETHOSTBYNAME_R */
    -
    -/* gethostbyname_r() takes 3 args */
    -/* #undef HAVE_GETHOSTBYNAME_R_3 */
    -
    -/* gethostbyname_r() takes 5 args */
    -/* #undef HAVE_GETHOSTBYNAME_R_5 */
    -
    -/* gethostbyname_r() takes 6 args */
    -/* #undef HAVE_GETHOSTBYNAME_R_6 1 */
    -
    -/* Define to 1 if you have the `getpass_r' function. */
    -/* #undef HAVE_GETPASS_R */
    -
    -/* Define to 1 if you have the `getprotobyname' function. */
    -/* #undef HAVE_GETPROTOBYNAME */
    -
    -/* Define to 1 if you have the `getpwuid' function. */
    -#define HAVE_GETPWUID 1
    -
    -/* Define to 1 if you have the `getrlimit' function. */
    -/* #undef HAVE_GETRLIMIT */
    -
    -/* Define to 1 if you have the `gettimeofday' function. */
    -#define HAVE_GETTIMEOFDAY 1
    -
    -/* we have a glibc-style strerror_r() */
    -/* #undef HAVE_GLIBC_STRERROR_R */
    -#define HAVE_GLIBC_STRERROR_R 1
    -
    -/* Define to 1 if you have the `gmtime_r' function. */
    -#define HAVE_GMTIME_R 1
    -
    -/* if you have the gssapi libraries */
    -/* #undef HAVE_GSSAPI */
    -
    -/* if you have the GNU gssapi libraries */
    -/* #undef HAVE_GSSGNU */
    -
    -/* if you have the Heimdal gssapi libraries */
    -/* #undef HAVE_GSSHEIMDAL */
    -
    -/* if you have the MIT gssapi libraries */
    -/* #undef HAVE_GSSMIT */
    -
    -/* Define to 1 if you have the `iconv' functions. */
    -#define HAVE_ICONV 1
    -
    -/* Define to 1 if you have the `idna_strerror' function. */
    -/* #undef HAVE_IDNA_STRERROR */
    -
    -/* Define to 1 if you have the `idn_free' function. */
    -/* #undef HAVE_IDN_FREE */
    -
    -/* Define to 1 if you have the  header file. */
    -/* #undef HAVE_IDN_FREE_H */
    -
    -/* Define to 1 if you have the `inet_addr' function. */
    -#define HAVE_INET_ADDR 1
    -
    -/* Define to 1 if you have a IPv6 capable working inet_ntop function. */
    -/* #undef HAVE_INET_NTOP */
    -
    -/* Define to 1 if you have a IPv6 capable working inet_pton function. */
    -/* #undef HAVE_INET_PTON */
    -
    -/* Define to 1 if you have the  header file. */
    -#define HAVE_INTTYPES_H 1
    -
    -/* Define to 1 if you have the ioctl function. */
    -#define HAVE_IOCTL 1
    -
    -/* Define to 1 if you have a working ioctl FIONBIO function. */
    -#define HAVE_IOCTL_FIONBIO 1
    -
    -/* Define to 1 if you have the ioctlsocket function. */
    -/* #undef HAVE_IOCTLSOCKET */
    -
    -/* Define to 1 if you have a working ioctlsocket FIONBIO function. */
    -/* #undef HAVE_IOCTLSOCKET_FIONBIO */
    -
    -/* Define to 1 if you have the IoctlSocket camel case function. */
    -/* #undef HAVE_IOCTLSOCKET_CAMEL */
    -
    -/* Define to 1 if you have a working IoctlSocket camel case FIONBIO
    -   function. */
    -/* #undef HAVE_IOCTLSOCKET_CAMEL_FIONBIO */
    -
    -/* Define to 1 if you have the  header file. */
    -/* #undef HAVE_IO_H */
    -
    -/* if you have the Kerberos4 libraries (including -ldes) */
    -/* #undef HAVE_KRB4 */
    -
    -/* Define to 1 if you have the `krb_get_our_ip_for_realm' function. */
    -/* #undef HAVE_KRB_GET_OUR_IP_FOR_REALM */
    -
    -/* Define to 1 if you have the  header file. */
    -/* #undef HAVE_KRB_H */
    -
    -/* Define to 1 if you have the  header file. */
    -/* #undef HAVE_LIBGEN_H 1 */
    -
    -/* Define to 1 if you have the `idn' library (-lidn). */
    -/* #undef HAVE_LIBIDN */
    -
    -/* Define to 1 if you have the `resolv' library (-lresolv). */
    -/* #undef HAVE_LIBRESOLV */
    -
    -/* Define to 1 if you have the `resolve' library (-lresolve). */
    -/* #undef HAVE_LIBRESOLVE */
    -
    -/* Define to 1 if you have the `socket' library (-lsocket). */
    -/* #undef HAVE_LIBSOCKET */
    -
    -/* if zlib is available */
    -/* #undef HAVE_LIBZ */
    -
    -/* if your compiler supports LL */
    -#define HAVE_LL 1
    -
    -/* Define to 1 if you have the  header file. */
    -#define HAVE_LOCALE_H 1
    -
    -/* Define to 1 if you have the `localtime_r' function. */
    -#define HAVE_LOCALTIME_R 1
    -
    -/* Define to 1 if the compiler supports the 'long long' data type. */
    -#define HAVE_LONGLONG 1
    -
    -/* Define to 1 if you need the malloc.h header file even with stdlib.h  */
    -/* #undef NEED_MALLOC_H */
    -
    -/* Define to 1 if you have the  header file. */
    -#define HAVE_MEMORY_H 1
    -
    -/* Define to 1 if you have the  header file. */
    -#define HAVE_NETDB_H 1
    -
    -/* Define to 1 if you have the  header file. */
    -#define HAVE_NETINET_IN_H 1
    -
    -/* Define to 1 if you have the  header file. */
    -/* undef HAVE_NETINET_TCP_H */
    -
    -/* Define to 1 if you have the  header file. */
    -#define HAVE_NET_IF_H 1
    -
    -/* Define if NI_WITHSCOPEID exists and works */
    -/* #undef HAVE_NI_WITHSCOPEID */
    -
    -/* we have no strerror_r() proto */
    -/* #undef HAVE_NO_STRERROR_R_DECL */
    -
    -/* Define to 1 if you have the  header file. */
    -/* #undef HAVE_OPENSSL_CRYPTO_H */
    -#define HAVE_OPENSSL_CRYPTO_H 1
    -
    -/* Define to 1 if you have the  header file. */
    -/* #undef HAVE_OPENSSL_ERR_H */
    -#define HAVE_OPENSSL_ERR_H 1
    -
    -/* Define to 1 if you have the  header file. */
    -/* #undef HAVE_OPENSSL_PEM_H */
    -#define HAVE_OPENSSL_PEM_H 1
    -
    -/* Define to 1 if you have the  header file. */
    -/* #undef HAVE_OPENSSL_PKCS12_H */
    -#define HAVE_OPENSSL_PKCS12_H 1
    -
    -/* Define to 1 if you have the  header file. */
    -/* #undef HAVE_OPENSSL_RSA_H */
    -#define HAVE_OPENSSL_RSA_H 1
    -
    -/* Define to 1 if you have the  header file. */
    -/* #undef HAVE_OPENSSL_SSL_H */
    -#define HAVE_OPENSSL_SSL_H 1
    -
    -/* Define to 1 if you have the  header file. */
    -/* #undef HAVE_OPENSSL_X509_H */
    -#define HAVE_OPENSSL_X509_H 1
    -
    -/* Define to 1 if you have the  header file. */
    -/* #undef HAVE_PEM_H */
    -#define HAVE_PEM_H 1
    -
    -/* Define to 1 if you have the `pipe' function. */
    -#define HAVE_PIPE 1
    -
    -/* Define to 1 if you have the `poll' function. */
    -/* #undef HAVE_POLL */
    -
    -/* If you have a fine poll */
    -/* #undef HAVE_POLL_FINE */
    -
    -/* we have a POSIX-style strerror_r() */
    -/* #undef HAVE_POSIX_STRERROR_R */
    -
    -/* Define to 1 if you have the  header file. */
    -#define HAVE_PWD_H 1
    -
    -/* Define to 1 if you have the `RAND_egd' function. */
    -/* #undef HAVE_RAND_EGD */
    -#define HAVE_RAND_EGD 1
    -
    -/* Define to 1 if you have the `RAND_screen' function. */
    -/* #undef HAVE_RAND_SCREEN */
    -
    -/* Define to 1 if you have the `RAND_status' function. */
    -/* #undef HAVE_RAND_STATUS */
    -#define HAVE_RAND_STATUS 1
    -
    -/* Define to 1 if you have the `select' function. */
    -#define HAVE_SELECT 1
    -
    -/* Define to 1 if you have the  header file. */
    -#define HAVE_SETJMP_H 1
    -
    -/* Define to 1 if you have the `setlocale' function. */
    -#define HAVE_SETLOCALE 1
    -
    -/* Define to 1 if you have the `setrlimit' function. */
    -#define HAVE_SETRLIMIT 1
    -
    -/* Define to 1 if you have the setsockopt function. */
    -/* #undef HAVE_SETSOCKOPT */
    -
    -/* Define to 1 if you have a working setsockopt SO_NONBLOCK function. */
    -/* #undef HAVE_SETSOCKOPT_SO_NONBLOCK */
    -
    -/* Define to 1 if you have the `sigaction' function. */
    -#define HAVE_SIGACTION 1
    -
    -/* Define to 1 if you have the `siginterrupt' function. */
    -/* #undef HAVE_SIGINTERRUPT */
    -
    -/* Define to 1 if you have the `signal' function. */
    -#define HAVE_SIGNAL 1
    -
    -/* Define to 1 if you have the  header file. */
    -#define HAVE_SIGNAL_H 1
    -
    -/* If you have sigsetjmp */
    -/* #undef HAVE_SIGSETJMP */
    -
    -/* Define to 1 if you have the `socket' function. */
    -#define HAVE_SOCKET 1
    -
    -/* Define to 1 if you have the  header file. */
    -/* #undef HAVE_SSL_H */
    -#define HAVE_SSL_H 1
    -
    -/* Define to 1 if you have the  header file. */
    -#define HAVE_STDINT_H 1
    -
    -/* Define to 1 if you have the  header file. */
    -#define HAVE_STDLIB_H 1
    -
    -/* Define to 1 if you have the `strcasecmp' function. */
    -#define HAVE_STRCASECMP 1
    -
    -/* Define to 1 if you have the `strcmpi' function. */
    -/* #undef HAVE_STRCMPI */
    -
    -/* Define to 1 if you have the `strdup' function. */
    -#define HAVE_STRDUP 1
    -
    -/* Define to 1 if you have the `strerror_r' function. */
    -#define HAVE_STRERROR_R 1
    -
    -/* Define to 1 if you have the `stricmp' function. */
    -/* #undef HAVE_STRICMP */
    -#define HAVE_STRICMP 1
    -
    -/* Define to 1 if you have the  header file. */
    -#define HAVE_STRINGS_H 1
    -
    -/* Define to 1 if you have the  header file. */
    -#define HAVE_STRING_H 1
    -
    -/* Define to 1 if you have the `strstr' function. */
    -#define HAVE_STRSTR 1
    -
    -/* Define to 1 if you have the `strtok_r' function. */
    -#define HAVE_STRTOK_R 1
    -
    -/* Define to 1 if you have the `strtoll' function. */
    -#define HAVE_STRTOLL 1
    -
    -/* if struct sockaddr_storage is defined */
    -/* #undef HAVE_STRUCT_SOCKADDR_STORAGE */
    -
    -/* Define this if you have struct timeval */
    -#define HAVE_STRUCT_TIMEVAL 1
    -
    -/* Define to 1 if you have the  header file. */
    -#define HAVE_SYS_FILIO_H 1
    -
    -/* Define to 1 if you have the  header file. */
    -#define HAVE_SYS_IOCTL_H 1
    -
    -/* Define to 1 if you have the  header file. */
    -#define HAVE_SYS_PARAM_H 1
    -
    -/* Define to 1 if you have the  header file. */
    -/* #undef HAVE_SYS_POLL_H */
    -
    -/* Define to 1 if you have the  header file. */
    -#define HAVE_SYS_RESOURCE_H 1
    -
    -/* Define to 1 if you have the  header file. */
    -#define HAVE_SYS_SELECT_H 1
    -
    -/* Define to 1 if you have the  header file. */
    -#define HAVE_SYS_SOCKET_H 1
    -
    -/* Define to 1 if you have the  header file. */
    -/* #undef HAVE_SYS_SOCKIO_H */
    -#define HAVE_SYS_SOCKIO_H 1
    -
    -/* Define to 1 if you have the  header file. */
    -#define HAVE_SYS_STAT_H 1
    -
    -/* Define to 1 if you have the  header file. */
    -#define HAVE_SYS_TIME_H 1
    -
    -/* Define to 1 if you have the  header file. */
    -#define HAVE_SYS_TYPES_H 1
    -
    -/* Define to 1 if you have the  header file. */
    -/* #undef HAVE_SYS_UTIME_H */
    -
    -/* Define to 1 if you have the  header file. */
    -/* #undef HAVE_TERMIOS_H */
    -
    -/* Define to 1 if you have the  header file. */
    -/* #undef HAVE_TERMIO_H */
    -
    -/* Define to 1 if you have the  header file. */
    -#define HAVE_TIME_H 1
    -
    -/* Define to 1 if you have the  header file. */
    -/* #undef HAVE_TLD_H */
    -
    -/* Define to 1 if you have the `tld_strerror' function. */
    -/* #undef HAVE_TLD_STRERROR */
    -
    -/* Define to 1 if you have the  header file. */
    -#define HAVE_UNISTD_H 1
    -
    -/* Define to 1 if you have the `utime' function. */
    -#define HAVE_UTIME 1
    -
    -/* Define to 1 if you have the  header file. */
    -#define HAVE_UTIME_H 1
    -
    -/* Define to 1 if you have the  header file. */
    -/* #undef HAVE_WINSOCK2_H */
    -
    -/* Define this symbol if your OS supports changing the contents of argv */
    -/* #undef HAVE_WRITABLE_ARGV */
    -
    -/* Define to 1 if you have the ws2tcpip.h header file. */
    -/* #undef HAVE_WS2TCPIP_H */
    -
    -/* Define to 1 if you have the  header file. */
    -/* #undef HAVE_X509_H */
    -
    -/* if you have the zlib.h header file */
    -/* #undef HAVE_ZLIB_H */
    -
    -/* Define to 1 if _REENTRANT preprocessor symbol must be defined. */
    -/* #undef NEED_REENTRANT */
    -
    -/* Define to 1 if _THREAD_SAFE preprocessor symbol must be defined. */
    -/* #undef NEED_THREAD_SAFE */
    -
    -/* cpu-machine-OS */
    -#define OS "s390x-ibm-tpf"
    -
    -/* Name of package */
    -#define PACKAGE "curl"
    -
    -/* Define to the address where bug reports for this package should be sent. */
    -#define PACKAGE_BUGREPORT \
    -  "a suitable curl mailing list => https://curl.se/mail/"
    -
    -/* Define to the full name of this package. */
    -#define PACKAGE_NAME "curl"
    -
    -/* Define to the full name and version of this package. */
    -#define PACKAGE_STRING "curl -"
    -
    -/* Define to the one symbol short name of this package. */
    -#define PACKAGE_TARNAME "curl"
    -
    -/* Define to the version of this package. */
    -#define PACKAGE_VERSION "-"
    -
    -/* a suitable file to read random data from */
    -/* #undef RANDOM_FILE */
    -
    -/* Define to the type of arg 1 for `select'. */
    -#define SELECT_TYPE_ARG1 int
    -
    -/* Define to the type of args 2, 3 and 4 for `select'. */
    -#define SELECT_TYPE_ARG234 (fd_set *)
    -
    -/* Define to the type of arg 5 for `select'. */
    -#define SELECT_TYPE_ARG5 (struct timeval *)
    -
    -/* The size of `int', as computed by sizeof. */
    -#define SIZEOF_INT 4
    -
    -/* The size of `off_t', as computed by sizeof. */
    -#define SIZEOF_OFF_T 8
    -
    -/* The size of `short', as computed by sizeof. */
    -#define SIZEOF_SHORT 2
    -
    -/* Define to the size of `long', as computed by sizeof. */
    -#define SIZEOF_LONG 8
    -
    -/* The size of `size_t', as computed by sizeof. */
    -#define SIZEOF_SIZE_T 8
    -
    -/* The size of `time_t', as computed by sizeof. */
    -#define SIZEOF_TIME_T 8
    -
    -/* Define to 1 if you have the ANSI C header files. */
    -#define STDC_HEADERS 1
    -
    -/* Define to 1 if you can safely include both  and . */
    -#define TIME_WITH_SYS_TIME 1
    -
    -/* Define if you want to enable ares support */
    -/* #undef USE_ARES */
    -
    -/* if GnuTLS is enabled */
    -/* #undef USE_GNUTLS */
    -
    -/* If you want to build curl with the built-in manual */
    -/* #undef USE_MANUAL */
    -
    -/* if OpenSSL is in use */
    -/* #undef USE_OPENSSL */
    -
    -/* if SSL is enabled */
    -/* #undef USE_OPENSSL */
    -
    -/* to enable SSPI support */
    -/* #undef USE_WINDOWS_SSPI */
    -
    -/* Version number of package */
    -#define VERSION "not-used"
    -
    -/* Define to avoid automatic inclusion of winsock.h */
    -/* #undef WIN32_LEAN_AND_MEAN */
    -
    -/* Define to 1 if on AIX 3.
    -   System headers sometimes define this.
    -   We just want to avoid a redefinition error message.  */
    -#ifndef _ALL_SOURCE
    -/* # undef _ALL_SOURCE */
    -#endif
    -
    -/* Number of bits in a file offset, on hosts where this is settable. */
    -/* #undef _FILE_OFFSET_BITS */
    -
    -/* Define for large files, on AIX-style hosts. */
    -/* #undef _LARGE_FILES */
    -
    -/* Define to empty if `const' does not conform to ANSI C. */
    -/* #undef const */
    -
    -/* type to use in place of in_addr_t if not defined */
    -/* #undef in_addr_t */
    -
    -/* Define to `unsigned' if  does not define. */
    -/* #undef size_t */
    -
    -/* the signed version of size_t */
    -/* #undef ssize_t */
    -
    -/* Define to 1 if you have the recv function. */
    -#define HAVE_RECV 1
    -
    -/* Define to the type of arg 1 for recv. */
    -#define RECV_TYPE_ARG1 int
    -
    -/* Define to the type of arg 2 for recv. */
    -#define RECV_TYPE_ARG2 char *
    -
    -/* Define to the type of arg 3 for recv. */
    -#define RECV_TYPE_ARG3 int
    -
    -/* Define to the type of arg 4 for recv. */
    -#define RECV_TYPE_ARG4 int
    -
    -/* Define to the function return type for recv. */
    -#define RECV_TYPE_RETV int
    -
    -/* Define to 1 if you have the recvfrom function. */
    -#define HAVE_RECVFROM 1
    -
    -/* Define to the type of arg 1 for recvfrom. */
    -#define RECVFROM_TYPE_ARG1 int
    -
    -/* Define to the type pointed by arg 2 for recvfrom. */
    -#define RECVFROM_TYPE_ARG2 char
    -
    -/* Define to the type of arg 3 for recvfrom. */
    -#define RECVFROM_TYPE_ARG3 int
    -
    -/* Define to the type of arg 4 for recvfrom. */
    -#define RECVFROM_TYPE_ARG4 int
    -
    -/* Define to the type pointed by arg 5 for recvfrom. */
    -#define RECVFROM_TYPE_ARG5 struct sockaddr
    -
    -/* Define to the type pointed by arg 6 for recvfrom. */
    -#define RECVFROM_TYPE_ARG6 int
    -
    -/* Define to the function return type for recvfrom. */
    -#define RECVFROM_TYPE_RETV int
    -
    -/* Define to 1 if you have the send function. */
    -#define HAVE_SEND 1
    -
    -/* Define to the type of arg 1 for send. */
    -#define SEND_TYPE_ARG1 int
    -
    -/* Define to the type qualifier of arg 2 for send. */
    -#define SEND_QUAL_ARG2 const
    -
    -/* Define to the type of arg 2 for send. */
    -#define SEND_TYPE_ARG2 char *
    -
    -/* Define to the type of arg 3 for send. */
    -#define SEND_TYPE_ARG3 int
    -
    -/* Define to the type of arg 4 for send. */
    -#define SEND_TYPE_ARG4 int
    -
    -/* Define to the function return type for send. */
    -#define SEND_TYPE_RETV int
    -
    -#define CURL_DOES_CONVERSIONS
    -#ifndef CURL_ICONV_CODESET_OF_HOST
    -#define CURL_ICONV_CODESET_OF_HOST "IBM-1047"
    -#endif
    -
    -
    -#endif /* HEADER_CURL_CONFIG_TPF_H */
    diff --git a/vendor/curl/lib/config-vxworks.h b/vendor/curl/lib/config-vxworks.h
    deleted file mode 100644
    index af1d87345c..0000000000
    --- a/vendor/curl/lib/config-vxworks.h
    +++ /dev/null
    @@ -1,811 +0,0 @@
    -#ifndef HEADER_CURL_CONFIG_VXWORKS_H
    -#define HEADER_CURL_CONFIG_VXWORKS_H
    -/***************************************************************************
    - *                                  _   _ ____  _
    - *  Project                     ___| | | |  _ \| |
    - *                             / __| | | | |_) | |
    - *                            | (__| |_| |  _ <| |___
    - *                             \___|\___/|_| \_\_____|
    - *
    - * Copyright (C) 1998 - 2021, Daniel Stenberg, , et al.
    - *
    - * This software is licensed as described in the file COPYING, which
    - * you should have received as part of this distribution. The terms
    - * are also available at https://curl.se/docs/copyright.html.
    - *
    - * You may opt to use, copy, modify, merge, publish, distribute and/or sell
    - * copies of the Software, and permit persons to whom the Software is
    - * furnished to do so, under the terms of the COPYING file.
    - *
    - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
    - * KIND, either express or implied.
    - *
    - ***************************************************************************/
    -
    -/* =============================================================== */
    -/*               Hand crafted config file for VxWorks              */
    -/* =============================================================== */
    -
    -/* Location of default ca bundle */
    -/* #undef CURL_CA_BUNDLE */
    -
    -/* Location of default ca path */
    -/* #undef CURL_CA_PATH */
    -
    -/* to disable cookies support */
    -/* #undef CURL_DISABLE_COOKIES */
    -
    -/* to disable cryptographic authentication */
    -/* #undef CURL_DISABLE_CRYPTO_AUTH */
    -
    -/* to disable DICT */
    -/* #undef CURL_DISABLE_DICT */
    -
    -/* to disable FILE */
    -/* #undef CURL_DISABLE_FILE */
    -
    -/* to disable FTP */
    -#define CURL_DISABLE_FTP 1
    -
    -/* to disable HTTP */
    -/* #undef CURL_DISABLE_HTTP */
    -
    -/* to disable LDAP */
    -#define CURL_DISABLE_LDAP 1
    -
    -/* to disable LDAPS */
    -#define CURL_DISABLE_LDAPS 1
    -
    -/* to disable NTLM authentication */
    -#define CURL_DISABLE_NTLM 1
    -
    -/* to disable proxies */
    -/* #undef CURL_DISABLE_PROXY */
    -
    -/* to disable TELNET */
    -#define CURL_DISABLE_TELNET 1
    -
    -/* to disable TFTP */
    -#define CURL_DISABLE_TFTP 1
    -
    -/* to disable verbose strings */
    -/* #undef CURL_DISABLE_VERBOSE_STRINGS */
    -
    -/* Definition to make a library symbol externally visible. */
    -/* #undef CURL_EXTERN_SYMBOL */
    -
    -/* Use Windows LDAP implementation */
    -/* #undef USE_WIN32_LDAP */
    -
    -/* your Entropy Gathering Daemon socket pathname */
    -/* #undef EGD_SOCKET */
    -
    -/* Define if you want to enable IPv6 support */
    -#define ENABLE_IPV6 1
    -
    -/* Define to 1 if you have the alarm function. */
    -#define HAVE_ALARM 1
    -
    -/* Define to 1 if you have the  header file. */
    -#define HAVE_ALLOCA_H 1
    -
    -/* Define to 1 if you have the  header file. */
    -#define HAVE_ARPA_INET_H 1
    -
    -/* Define to 1 if you have the  header file. */
    -/* #undef HAVE_ARPA_TFTP_H */
    -
    -/* Define to 1 if you have the  header file. */
    -#define HAVE_ASSERT_H 1
    -
    -/* Define to 1 if you have the `basename' function. */
    -/* #undef HAVE_BASENAME */
    -
    -/* Define to 1 if bool is an available type. */
    -#define HAVE_BOOL_T 1
    -
    -/* Define to 1 if you have the clock_gettime function and monotonic timer. */
    -/* #undef HAVE_CLOCK_GETTIME_MONOTONIC */
    -
    -/* Define to 1 if you have the `closesocket' function. */
    -/* #undef HAVE_CLOSESOCKET */
    -
    -/* Define to 1 if you have the `CRYPTO_cleanup_all_ex_data' function. */
    -#define HAVE_CRYPTO_CLEANUP_ALL_EX_DATA 1
    -
    -/* Define to 1 if you have the  header file. */
    -#define HAVE_DLFCN_H 1
    -
    -/* Define to 1 if you have the  header file. */
    -#define HAVE_ERRNO_H 1
    -
    -/* Define to 1 if you have the fcntl function. */
    -#define HAVE_FCNTL 1
    -
    -/* Define to 1 if you have the  header file. */
    -#define HAVE_FCNTL_H 1
    -
    -/* Define to 1 if you have a working fcntl O_NONBLOCK function. */
    -#define HAVE_FCNTL_O_NONBLOCK 1
    -
    -/* Define to 1 if you have the freeaddrinfo function. */
    -#define HAVE_FREEADDRINFO 1
    -
    -/* Define to 1 if you have the ftruncate function. */
    -#define HAVE_FTRUNCATE 1
    -
    -/* Define to 1 if you have a working getaddrinfo function. */
    -#define HAVE_GETADDRINFO 1
    -
    -/* Define to 1 if you have the `geteuid' function. */
    -/* #undef HAVE_GETEUID */
    -
    -/* Define to 1 if you have the gethostbyname function. */
    -#define HAVE_GETHOSTBYNAME 1
    -
    -/* Define to 1 if you have the gethostbyname_r function. */
    -/* #undef HAVE_GETHOSTBYNAME_R */
    -
    -/* gethostbyname_r() takes 3 args */
    -/* #undef HAVE_GETHOSTBYNAME_R_3 */
    -
    -/* gethostbyname_r() takes 5 args */
    -/* #undef HAVE_GETHOSTBYNAME_R_5 */
    -
    -/* gethostbyname_r() takes 6 args */
    -/* #undef HAVE_GETHOSTBYNAME_R_6 */
    -
    -/* Define to 1 if you have the gethostname function. */
    -#define HAVE_GETHOSTNAME 1
    -
    -/* Define to 1 if you have a working getifaddrs function. */
    -/* #undef HAVE_GETIFADDRS */
    -
    -/* Define to 1 if you have the `getpass_r' function. */
    -/* #undef HAVE_GETPASS_R */
    -
    -/* Define to 1 if you have the `getppid' function. */
    -#define HAVE_GETPPID 1
    -
    -/* Define to 1 if you have the `getprotobyname' function. */
    -#define HAVE_GETPROTOBYNAME 1
    -
    -/* Define to 1 if you have the `getpwuid' function. */
    -/* #undef HAVE_GETPWUID */
    -
    -/* Define to 1 if you have the `getrlimit' function. */
    -#define HAVE_GETRLIMIT 1
    -
    -/* Define to 1 if you have the `gettimeofday' function. */
    -/* #undef HAVE_GETTIMEOFDAY */
    -
    -/* Define to 1 if you have a working glibc-style strerror_r function. */
    -/* #undef HAVE_GLIBC_STRERROR_R */
    -
    -/* Define to 1 if you have a working gmtime_r function. */
    -#define HAVE_GMTIME_R 1
    -
    -/* if you have the gssapi libraries */
    -/* #undef HAVE_GSSAPI */
    -
    -/* Define to 1 if you have the  header file. */
    -/* #undef HAVE_GSSAPI_GSSAPI_GENERIC_H */
    -
    -/* Define to 1 if you have the  header file. */
    -/* #undef HAVE_GSSAPI_GSSAPI_H */
    -
    -/* Define to 1 if you have the  header file. */
    -/* #undef HAVE_GSSAPI_GSSAPI_KRB5_H */
    -
    -/* if you have the GNU gssapi libraries */
    -/* #undef HAVE_GSSGNU */
    -
    -/* if you have the Heimdal gssapi libraries */
    -/* #undef HAVE_GSSHEIMDAL */
    -
    -/* if you have the MIT gssapi libraries */
    -/* #undef HAVE_GSSMIT */
    -
    -/* Define to 1 if you have the `idna_strerror' function. */
    -/* #undef HAVE_IDNA_STRERROR */
    -
    -/* Define to 1 if you have the `idn_free' function. */
    -/* #undef HAVE_IDN_FREE */
    -
    -/* Define to 1 if you have the  header file. */
    -/* #undef HAVE_IDN_FREE_H */
    -
    -/* Define to 1 if you have the  header file. */
    -/* #undef HAVE_IFADDRS_H */
    -
    -/* Define to 1 if you have the `inet_addr' function. */
    -#define HAVE_INET_ADDR 1
    -
    -/* Define to 1 if you have a IPv6 capable working inet_ntop function. */
    -/* #undef HAVE_INET_NTOP */
    -
    -/* Define to 1 if you have a IPv6 capable working inet_pton function. */
    -/* #undef HAVE_INET_PTON */
    -
    -/* Define to 1 if you have the  header file. */
    -#define HAVE_INTTYPES_H 1
    -
    -/* Define to 1 if you have the ioctl function. */
    -#define HAVE_IOCTL 1
    -
    -/* Define to 1 if you have the ioctlsocket function. */
    -/* #undef HAVE_IOCTLSOCKET */
    -
    -/* Define to 1 if you have the IoctlSocket camel case function. */
    -/* #undef HAVE_IOCTLSOCKET_CAMEL */
    -
    -/* Define to 1 if you have a working IoctlSocket camel case FIONBIO function.
    -   */
    -/* #undef HAVE_IOCTLSOCKET_CAMEL_FIONBIO */
    -
    -/* Define to 1 if you have a working ioctlsocket FIONBIO function. */
    -/* #undef HAVE_IOCTLSOCKET_FIONBIO */
    -
    -/* Define to 1 if you have a working ioctl FIONBIO function. */
    -#define HAVE_IOCTL_FIONBIO 1
    -
    -/* Define to 1 if you have a working ioctl SIOCGIFADDR function. */
    -#define HAVE_IOCTL_SIOCGIFADDR 1
    -
    -/* Define to 1 if you have the  header file. */
    -#define HAVE_IO_H 1
    -
    -/* if you have the Kerberos4 libraries (including -ldes) */
    -/* #undef HAVE_KRB4 */
    -
    -/* Define to 1 if you have the `krb_get_our_ip_for_realm' function. */
    -/* #undef HAVE_KRB_GET_OUR_IP_FOR_REALM */
    -
    -/* Define to 1 if you have the  header file. */
    -/* #undef HAVE_KRB_H */
    -
    -/* Define to 1 if you have the lber.h header file. */
    -/* #undef HAVE_LBER_H */
    -
    -/* Define to 1 if you have the ldapssl.h header file. */
    -/* #undef HAVE_LDAPSSL_H */
    -
    -/* Define to 1 if you have the ldap.h header file. */
    -/* #undef HAVE_LDAP_H */
    -
    -/* Use LDAPS implementation */
    -/* #undef HAVE_LDAP_SSL */
    -
    -/* Define to 1 if you have the ldap_ssl.h header file. */
    -/* #undef HAVE_LDAP_SSL_H */
    -
    -/* Define to 1 if you have the `ldap_url_parse' function. */
    -/* #undef HAVE_LDAP_URL_PARSE */
    -
    -/* Define to 1 if you have the  header file. */
    -/* #undef HAVE_LIBGEN_H */
    -
    -/* Define to 1 if you have the `idn' library (-lidn). */
    -/* #undef HAVE_LIBIDN */
    -
    -/* Define to 1 if you have the `resolv' library (-lresolv). */
    -/* #undef HAVE_LIBRESOLV */
    -
    -/* Define to 1 if you have the `resolve' library (-lresolve). */
    -/* #undef HAVE_LIBRESOLVE */
    -
    -/* Define to 1 if you have the `socket' library (-lsocket). */
    -/* #undef HAVE_LIBSOCKET */
    -
    -/* Define to 1 if you have the `ssh2' library (-lssh2). */
    -/* #undef HAVE_LIBSSH2 */
    -
    -/* Define to 1 if you have the  header file. */
    -/* #undef HAVE_LIBSSH2_H */
    -
    -/* Define to 1 if you have the `libssh2_version' function. */
    -/* #undef HAVE_LIBSSH2_VERSION */
    -
    -/* if zlib is available */
    -#define HAVE_LIBZ 1
    -
    -/* if your compiler supports LL */
    -#define HAVE_LL 1
    -
    -/* Define to 1 if you have the  header file. */
    -#define HAVE_LOCALE_H 1
    -
    -/* Define to 1 if you have a working localtime_r function. */
    -#define HAVE_LOCALTIME_R 1
    -
    -/* Define to 1 if the compiler supports the 'long long' data type. */
    -#define HAVE_LONGLONG 1
    -
    -/* Define to 1 if you have the malloc.h header file. */
    -#define HAVE_MALLOC_H 1
    -
    -/* Define to 1 if you have the memory.h header file. */
    -#define HAVE_MEMORY_H 1
    -
    -/* Define to 1 if you have the MSG_NOSIGNAL flag. */
    -/* #undef HAVE_MSG_NOSIGNAL */
    -
    -/* Define to 1 if you have the  header file. */
    -#define HAVE_NETDB_H 1
    -
    -/* Define to 1 if you have the  header file. */
    -#define HAVE_NETINET_IN_H 1
    -
    -/* Define to 1 if you have the  header file. */
    -#define HAVE_NETINET_TCP_H 1
    -
    -/* Define to 1 if you have the  header file. */
    -#define HAVE_NET_IF_H 1
    -
    -/* Define to 1 if NI_WITHSCOPEID exists and works. */
    -/* #undef HAVE_NI_WITHSCOPEID */
    -
    -/* if you have an old MIT gssapi library, lacking GSS_C_NT_HOSTBASED_SERVICE
    -   */
    -/* #undef HAVE_OLD_GSSMIT */
    -
    -/* Define to 1 if you have the  header file. */
    -#define HAVE_OPENSSL_CRYPTO_H 1
    -
    -/* Define to 1 if you have the  header file. */
    -#define HAVE_OPENSSL_ERR_H 1
    -
    -/* Define to 1 if you have the  header file. */
    -#define HAVE_OPENSSL_PEM_H 1
    -
    -/* Define to 1 if you have the  header file. */
    -#define HAVE_OPENSSL_PKCS12_H 1
    -
    -/* Define to 1 if you have the  header file. */
    -#define HAVE_OPENSSL_RSA_H 1
    -
    -/* Define to 1 if you have the  header file. */
    -#define HAVE_OPENSSL_SSL_H 1
    -
    -/* Define to 1 if you have the  header file. */
    -#define HAVE_OPENSSL_X509_H 1
    -
    -/* Define to 1 if you have the  header file. */
    -/* #undef HAVE_PEM_H */
    -
    -/* Define to 1 if you have the `pipe' function. */
    -#define HAVE_PIPE 1
    -
    -/* Define to 1 if you have a working poll function. */
    -/* #undef HAVE_POLL */
    -
    -/* If you have a fine poll */
    -/* #undef HAVE_POLL_FINE */
    -
    -/* Define to 1 if you have the  header file. */
    -/* #undef HAVE_POLL_H */
    -
    -/* Define to 1 if you have a working POSIX-style strerror_r function. */
    -/* #undef HAVE_POSIX_STRERROR_R */
    -
    -/* Define to 1 if you have the  header file. */
    -/* #undef HAVE_PWD_H */
    -
    -/* Define to 1 if you have the `RAND_egd' function. */
    -#define HAVE_RAND_EGD 1
    -
    -/* Define to 1 if you have the `RAND_screen' function. */
    -/* #undef HAVE_RAND_SCREEN */
    -
    -/* Define to 1 if you have the `RAND_status' function. */
    -#define HAVE_RAND_STATUS 1
    -
    -/* Define to 1 if you have the recv function. */
    -#define HAVE_RECV 1
    -
    -/* Define to 1 if you have the recvfrom function. */
    -#define HAVE_RECVFROM 1
    -
    -/* Define to 1 if you have the select function. */
    -#define HAVE_SELECT 1
    -
    -/* Define to 1 if you have the send function. */
    -#define HAVE_SEND 1
    -
    -/* Define to 1 if you have the  header file. */
    -#define HAVE_SETJMP_H 1
    -
    -/* Define to 1 if you have the `setlocale' function. */
    -#define HAVE_SETLOCALE 1
    -
    -/* Define to 1 if you have the `setmode' function. */
    -#define HAVE_SETMODE 1
    -
    -/* Define to 1 if you have the `setrlimit' function. */
    -#define HAVE_SETRLIMIT 1
    -
    -/* Define to 1 if you have the setsockopt function. */
    -#define HAVE_SETSOCKOPT 1
    -
    -/* Define to 1 if you have a working setsockopt SO_NONBLOCK function. */
    -/* #undef HAVE_SETSOCKOPT_SO_NONBLOCK */
    -
    -/* Define to 1 if you have the sigaction function. */
    -#define HAVE_SIGACTION 1
    -
    -/* Define to 1 if you have the siginterrupt function. */
    -#define HAVE_SIGINTERRUPT 1
    -
    -/* Define to 1 if you have the signal function. */
    -#define HAVE_SIGNAL 1
    -
    -/* Define to 1 if you have the  header file. */
    -#define HAVE_SIGNAL_H 1
    -
    -/* Define to 1 if you have the sigsetjmp function or macro. */
    -/* #undef HAVE_SIGSETJMP */
    -
    -/* Define to 1 if struct sockaddr_in6 has the sin6_scope_id member */
    -#define HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID 1
    -
    -/* Define to 1 if you have the `socket' function. */
    -#define HAVE_SOCKET 1
    -
    -/* Define to 1 if you have the  header file. */
    -/* #undef HAVE_SSL_H */
    -
    -/* Define to 1 if you have the  header file. */
    -#define HAVE_STDBOOL_H 1
    -
    -/* Define to 1 if you have the  header file. */
    -/* #undef HAVE_STDINT_H */
    -
    -/* Define to 1 if you have the  header file. */
    -#define HAVE_STDIO_H 1
    -
    -/* Define to 1 if you have the  header file. */
    -#define HAVE_STDLIB_H 1
    -
    -/* Define to 1 if you have the strcasecmp function. */
    -#define HAVE_STRCASECMP 1
    -
    -/* Define to 1 if you have the strcmpi function. */
    -/* #undef HAVE_STRCMPI */
    -
    -/* Define to 1 if you have the strdup function. */
    -#define HAVE_STRDUP 1
    -
    -/* Define to 1 if you have the strerror_r function. */
    -#define HAVE_STRERROR_R 1
    -
    -/* Define to 1 if you have the stricmp function. */
    -/* #undef HAVE_STRICMP */
    -
    -/* Define to 1 if you have the  header file. */
    -#define HAVE_STRINGS_H 1
    -
    -/* Define to 1 if you have the  header file. */
    -#define HAVE_STRING_H 1
    -
    -/* Define to 1 if you have the strncmpi function. */
    -/* #undef HAVE_STRNCMPI */
    -
    -/* Define to 1 if you have the strnicmp function. */
    -/* #undef HAVE_STRNICMP */
    -
    -/* Define to 1 if you have the  header file. */
    -/* #undef HAVE_STROPTS_H */
    -
    -/* Define to 1 if you have the strstr function. */
    -#define HAVE_STRSTR 1
    -
    -/* Define to 1 if you have the strtok_r function. */
    -#define HAVE_STRTOK_R 1
    -
    -/* Define to 1 if you have the strtoll function. */
    -/* #undef HAVE_STRTOLL */
    -
    -/* if struct sockaddr_storage is defined */
    -#define HAVE_STRUCT_SOCKADDR_STORAGE 1
    -
    -/* Define to 1 if you have the timeval struct. */
    -#define HAVE_STRUCT_TIMEVAL 1
    -
    -/* Define to 1 if you have the  header file. */
    -/* #undef HAVE_SYS_FILIO_H */
    -
    -/* Define to 1 if you have the  header file. */
    -#define HAVE_SYS_IOCTL_H 1
    -
    -/* Define to 1 if you have the  header file. */
    -/* #undef HAVE_SYS_PARAM_H */
    -
    -/* Define to 1 if you have the  header file. */
    -/* #undef HAVE_SYS_POLL_H */
    -
    -/* Define to 1 if you have the  header file. */
    -#define HAVE_SYS_RESOURCE_H 1
    -
    -/* Define to 1 if you have the  header file. */
    -/* #undef HAVE_SYS_SELECT_H */
    -
    -/* Define to 1 if you have the  header file. */
    -#define HAVE_SYS_SOCKET_H 1
    -
    -/* Define to 1 if you have the  header file. */
    -/* #undef HAVE_SYS_SOCKIO_H */
    -
    -/* Define to 1 if you have the  header file. */
    -#define HAVE_SYS_STAT_H 1
    -
    -/* Define to 1 if you have the  header file. */
    -/* #undef HAVE_SYS_TIME_H */
    -
    -/* Define to 1 if you have the  header file. */
    -#define HAVE_SYS_TYPES_H 1
    -
    -/* Define to 1 if you have the  header file. */
    -#define HAVE_SYS_UIO_H 1
    -
    -/* Define to 1 if you have the  header file. */
    -#define HAVE_SYS_UN_H 1
    -
    -/* Define to 1 if you have the  header file. */
    -#define HAVE_SYS_UTIME_H 1
    -
    -/* Define to 1 if you have the  header file. */
    -#define HAVE_TERMIOS_H 1
    -
    -/* Define to 1 if you have the  header file. */
    -#define HAVE_TERMIO_H 1
    -
    -/* Define to 1 if you have the  header file. */
    -#define HAVE_TIME_H 1
    -
    -/* Define to 1 if you have the  header file. */
    -/* #undef HAVE_TLD_H */
    -
    -/* Define to 1 if you have the `tld_strerror' function. */
    -/* #undef HAVE_TLD_STRERROR */
    -
    -/* Define to 1 if you have the `uname' function. */
    -#define HAVE_UNAME 1
    -
    -/* Define to 1 if you have the  header file. */
    -#define HAVE_UNISTD_H 1
    -
    -/* Define to 1 if you have the `utime' function. */
    -#define HAVE_UTIME 1
    -
    -/* Define to 1 if you have the  header file. */
    -#define HAVE_UTIME_H 1
    -
    -/* Define to 1 if compiler supports C99 variadic macro style. */
    -#define HAVE_VARIADIC_MACROS_C99 1
    -
    -/* Define to 1 if compiler supports old gcc variadic macro style. */
    -#define HAVE_VARIADIC_MACROS_GCC 1
    -
    -/* Define to 1 if you have a working vxworks-style strerror_r function. */
    -#define HAVE_VXWORKS_STRERROR_R 1
    -
    -/* Define to 1 if you have the winber.h header file. */
    -/* #undef HAVE_WINBER_H */
    -
    -/* Define to 1 if you have the windows.h header file. */
    -/* #undef HAVE_WINDOWS_H */
    -
    -/* Define to 1 if you have the winldap.h header file. */
    -/* #undef HAVE_WINLDAP_H */
    -
    -/* Define to 1 if you have the winsock2.h header file. */
    -/* #undef HAVE_WINSOCK2_H */
    -
    -/* Define this symbol if your OS supports changing the contents of argv */
    -#define HAVE_WRITABLE_ARGV 1
    -
    -/* Define to 1 if you have the writev function. */
    -#define HAVE_WRITEV 1
    -
    -/* Define to 1 if you have the ws2tcpip.h header file. */
    -/* #undef HAVE_WS2TCPIP_H */
    -
    -/* Define to 1 if you have the  header file. */
    -/* #undef HAVE_X509_H */
    -
    -/* if you have the zlib.h header file */
    -#define HAVE_ZLIB_H 1
    -
    -/* Define to 1 if you need the lber.h header file even with ldap.h */
    -/* #undef NEED_LBER_H */
    -
    -/* Define to 1 if you need the malloc.h header file even with stdlib.h */
    -/* #undef NEED_MALLOC_H */
    -
    -/* Define to 1 if you need the memory.h header file even with stdlib.h */
    -/* #undef NEED_MEMORY_H */
    -
    -/* Define to 1 if _REENTRANT preprocessor symbol must be defined. */
    -/* #undef NEED_REENTRANT */
    -
    -/* Define to 1 if _THREAD_SAFE preprocessor symbol must be defined. */
    -/* #undef NEED_THREAD_SAFE */
    -
    -/* Define to 1 if the open function requires three arguments. */
    -#define OPEN_NEEDS_ARG3 1
    -
    -/* cpu-machine-OS */
    -#define OS "unknown-unknown-vxworks"
    -
    -/* Name of package */
    -#define PACKAGE "curl"
    -
    -/* a suitable file to read random data from */
    -#define RANDOM_FILE "/dev/urandom"
    -
    -/* Define to the type of arg 1 for recvfrom. */
    -#define RECVFROM_TYPE_ARG1 int
    -
    -/* Define to the type pointed by arg 2 for recvfrom. */
    -#define RECVFROM_TYPE_ARG2 void
    -
    -/* Define to 1 if the type pointed by arg 2 for recvfrom is void. */
    -#define RECVFROM_TYPE_ARG2_IS_VOID 1
    -
    -/* Define to the type of arg 3 for recvfrom. */
    -#define RECVFROM_TYPE_ARG3 size_t
    -
    -/* Define to the type of arg 4 for recvfrom. */
    -#define RECVFROM_TYPE_ARG4 int
    -
    -/* Define to the type pointed by arg 5 for recvfrom. */
    -#define RECVFROM_TYPE_ARG5 struct sockaddr
    -
    -/* Define to 1 if the type pointed by arg 5 for recvfrom is void. */
    -/* #undef RECVFROM_TYPE_ARG5_IS_VOID */
    -
    -/* Define to the type pointed by arg 6 for recvfrom. */
    -#define RECVFROM_TYPE_ARG6 socklen_t
    -
    -/* Define to 1 if the type pointed by arg 6 for recvfrom is void. */
    -/* #undef RECVFROM_TYPE_ARG6_IS_VOID */
    -
    -/* Define to the function return type for recvfrom. */
    -#define RECVFROM_TYPE_RETV int
    -
    -/* Define to the type of arg 1 for recv. */
    -#define RECV_TYPE_ARG1 int
    -
    -/* Define to the type of arg 2 for recv. */
    -#define RECV_TYPE_ARG2 void *
    -
    -/* Define to the type of arg 3 for recv. */
    -#define RECV_TYPE_ARG3 size_t
    -
    -/* Define to the type of arg 4 for recv. */
    -#define RECV_TYPE_ARG4 int
    -
    -/* Define to the function return type for recv. */
    -#define RECV_TYPE_RETV int
    -
    -/* Define to the type qualifier of arg 5 for select. */
    -#define SELECT_QUAL_ARG5
    -
    -/* Define to the type of arg 1 for select. */
    -#define SELECT_TYPE_ARG1 int
    -
    -/* Define to the type of args 2, 3 and 4 for select. */
    -#define SELECT_TYPE_ARG234 fd_set *
    -
    -/* Define to the type of arg 5 for select. */
    -#define SELECT_TYPE_ARG5 struct timeval *
    -
    -/* Define to the function return type for select. */
    -#define SELECT_TYPE_RETV int
    -
    -/* Define to the type qualifier of arg 2 for send. */
    -#define SEND_QUAL_ARG2 const
    -
    -/* Define to the type of arg 1 for send. */
    -#define SEND_TYPE_ARG1 int
    -
    -/* Define to the type of arg 2 for send. */
    -#define SEND_TYPE_ARG2 void *
    -
    -/* Define to the type of arg 3 for send. */
    -#define SEND_TYPE_ARG3 size_t
    -
    -/* Define to the type of arg 4 for send. */
    -#define SEND_TYPE_ARG4 int
    -
    -/* Define to the function return type for send. */
    -#define SEND_TYPE_RETV int
    -
    -/* The size of `int', as computed by sizeof. */
    -#define SIZEOF_INT 4
    -
    -/* The size of `long', as computed by sizeof. */
    -#define SIZEOF_LONG 4
    -
    -/* The size of `off_t', as computed by sizeof. */
    -#define SIZEOF_OFF_T 8
    -
    -/* The size of `short', as computed by sizeof. */
    -#define SIZEOF_SHORT 2
    -
    -/* The size of `size_t', as computed by sizeof. */
    -#define SIZEOF_SIZE_T 4
    -
    -/* The size of `time_t', as computed by sizeof. */
    -#define SIZEOF_TIME_T 4
    -
    -/* Define to 1 if you have the ANSI C header files. */
    -#define STDC_HEADERS 1
    -
    -/* Define to the type of arg 3 for strerror_r. */
    -/* #undef STRERROR_R_TYPE_ARG3 */
    -
    -/* Define to 1 if you can safely include both  and . */
    -/* #undef TIME_WITH_SYS_TIME */
    -
    -/* Define if you want to enable c-ares support */
    -/* #undef USE_ARES */
    -
    -/* if GnuTLS is enabled */
    -/* #undef USE_GNUTLS */
    -
    -/* if libSSH2 is in use */
    -/* #undef USE_LIBSSH2 */
    -
    -/* If you want to build curl with the built-in manual */
    -#define USE_MANUAL 1
    -
    -/* if NSS is enabled */
    -/* #undef USE_NSS */
    -
    -/* if OpenSSL is in use */
    -#define USE_OPENSSL 1
    -
    -/* Define to 1 if you are building a Windows target without large file
    -   support. */
    -/* #undef USE_WIN32_LARGE_FILES */
    -
    -/* to enable SSPI support */
    -/* #undef USE_WINDOWS_SSPI */
    -
    -/* Define to 1 if using yaSSL in OpenSSL compatibility mode. */
    -/* #undef USE_YASSLEMUL */
    -
    -/* Define to avoid automatic inclusion of winsock.h */
    -/* #undef WIN32_LEAN_AND_MEAN */
    -
    -/* Define to 1 if OS is AIX. */
    -#ifndef _ALL_SOURCE
    -/* #  undef _ALL_SOURCE */
    -#endif
    -
    -/* Number of bits in a file offset, on hosts where this is settable. */
    -/* #undef _FILE_OFFSET_BITS */
    -
    -/* Define for large files, on AIX-style hosts. */
    -/* #undef _LARGE_FILES */
    -
    -/* Define to empty if `const' does not conform to ANSI C. */
    -/* #undef const */
    -
    -/* Type to use in place of in_addr_t when system does not provide it. */
    -/* #undef in_addr_t */
    -
    -/* Define to `__inline__' or `__inline' if that's what the C compiler
    -   calls it, or to nothing if 'inline' is not supported under any name.  */
    -#ifndef __cplusplus
    -/* #undef inline */
    -#endif
    -
    -/* Define to `unsigned int' if  does not define. */
    -/* #undef size_t */
    -
    -/* the signed version of size_t */
    -/* #undef ssize_t */
    -
    -#endif /* HEADER_CURL_CONFIG_VXWORKS_H */
    diff --git a/vendor/curl/lib/config-win32.h b/vendor/curl/lib/config-win32.h
    index 89593a815d..712437009b 100644
    --- a/vendor/curl/lib/config-win32.h
    +++ b/vendor/curl/lib/config-win32.h
    @@ -7,7 +7,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2021, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -124,8 +124,7 @@
     #define HAVE_TIME_H 1
     
     /* Define if you have the  header file. */
    -#if defined(__MINGW32__) || defined(__WATCOMC__) || defined(__LCC__) || \
    -    defined(__POCC__)
    +#if defined(__MINGW32__) || defined(__LCC__) || defined(__POCC__)
     #define HAVE_UNISTD_H 1
     #endif
     
    @@ -246,7 +245,7 @@
     #define HAVE_STRSTR 1
     
     /* Define if you have the strtoll function. */
    -#if defined(__MINGW32__) || defined(__WATCOMC__) || defined(__POCC__) || \
    +#if defined(__MINGW32__) || defined(__POCC__) || \
         (defined(_MSC_VER) && (_MSC_VER >= 1800))
     #define HAVE_STRTOLL 1
     #endif
    @@ -328,9 +327,7 @@
     
     /* Define if ssize_t is not an available 'typedefed' type. */
     #ifndef _SSIZE_T_DEFINED
    -#  if (defined(__WATCOMC__) && (__WATCOMC__ >= 1240)) || \
    -      defined(__POCC__) || \
    -      defined(__MINGW32__)
    +#  if defined(__POCC__) || defined(__MINGW32__)
     #  elif defined(_WIN64)
     #    define _SSIZE_T_DEFINED
     #    define ssize_t __int64
    @@ -440,7 +437,7 @@
     #endif
     
     /* Define if the compiler supports the 'long long' data type. */
    -#if defined(__MINGW32__) || defined(__WATCOMC__)      || \
    +#if defined(__MINGW32__) || \
         (defined(_MSC_VER)     && (_MSC_VER     >= 1310)) || \
         (defined(__BORLANDC__) && (__BORLANDC__ >= 0x561))
     #define HAVE_LONGLONG 1
    @@ -604,10 +601,6 @@ Vista
     #  define USE_WIN32_LARGE_FILES
     #endif
     
    -#if defined(__WATCOMC__) && !defined(USE_WIN32_LARGE_FILES)
    -#  define USE_WIN32_LARGE_FILES
    -#endif
    -
     #if defined(__POCC__)
     #  undef USE_WIN32_LARGE_FILES
     #endif
    @@ -654,13 +647,6 @@ Vista
     #define USE_WIN32_LDAP 1
     #endif
     
    -#if defined(__WATCOMC__) && defined(USE_WIN32_LDAP)
    -#if __WATCOMC__ < 1280
    -#define WINBERAPI  __declspec(cdecl)
    -#define WINLDAPAPI __declspec(cdecl)
    -#endif
    -#endif
    -
     #if defined(__POCC__) && defined(USE_WIN32_LDAP)
     #  define CURL_DISABLE_LDAP 1
     #endif
    diff --git a/vendor/curl/lib/config-win32ce.h b/vendor/curl/lib/config-win32ce.h
    index 889028b269..ca197d69bc 100644
    --- a/vendor/curl/lib/config-win32ce.h
    +++ b/vendor/curl/lib/config-win32ce.h
    @@ -7,7 +7,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2021, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -103,7 +103,7 @@
     #define HAVE_TIME_H 1
     
     /* Define if you have the  header file.  */
    -#if defined(__MINGW32__) || defined(__WATCOMC__) || defined(__LCC__)
    +#if defined(__MINGW32__) || defined(__LCC__)
     #define HAVE_UNISTD_H 1
     #endif
     
    @@ -191,7 +191,7 @@
     #define HAVE_STRSTR 1
     
     /* Define if you have the strtoll function.  */
    -#if defined(__MINGW32__) || defined(__WATCOMC__)
    +#if defined(__MINGW32__)
     #define HAVE_STRTOLL 1
     #endif
     
    @@ -269,7 +269,7 @@
     #define in_addr_t unsigned long
     
     /* Define ssize_t if it is not an available 'typedefed' type */
    -#if (defined(__WATCOMC__) && (__WATCOMC__ >= 1240)) || defined(__POCC__)
    +#if defined(__POCC__)
     #elif defined(_WIN64)
     #define ssize_t __int64
     #else
    diff --git a/vendor/curl/lib/conncache.c b/vendor/curl/lib/conncache.c
    index fec1937f0b..cd5756ae40 100644
    --- a/vendor/curl/lib/conncache.c
    +++ b/vendor/curl/lib/conncache.c
    @@ -6,7 +6,7 @@
      *                             \___|\___/|_| \_\_____|
      *
      * Copyright (C) 2012 - 2016, Linus Nielsen Feltzing, 
    - * Copyright (C) 2012 - 2021, Daniel Stenberg, , et al.
    + * Copyright (C) 2012 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -193,13 +193,11 @@ Curl_conncache_find_bundle(struct Curl_easy *data,
       return bundle;
     }
     
    -static bool conncache_add_bundle(struct conncache *connc,
    -                                 char *key,
    -                                 struct connectbundle *bundle)
    +static void *conncache_add_bundle(struct conncache *connc,
    +                                  char *key,
    +                                  struct connectbundle *bundle)
     {
    -  void *p = Curl_hash_add(&connc->hash, key, strlen(key), bundle);
    -
    -  return p?TRUE:FALSE;
    +  return Curl_hash_add(&connc->hash, key, strlen(key), bundle);
     }
     
     static void conncache_remove_bundle(struct conncache *connc,
    @@ -238,7 +236,6 @@ CURLcode Curl_conncache_add_conn(struct Curl_easy *data)
       bundle = Curl_conncache_find_bundle(data, conn, data->state.conn_cache,
                                           NULL);
       if(!bundle) {
    -    int rc;
         char key[HASHKEY_SIZE];
     
         result = bundle_create(&bundle);
    @@ -247,9 +244,8 @@ CURLcode Curl_conncache_add_conn(struct Curl_easy *data)
         }
     
         hashkey(conn, key, sizeof(key), NULL);
    -    rc = conncache_add_bundle(data->state.conn_cache, key, bundle);
     
    -    if(!rc) {
    +    if(!conncache_add_bundle(data->state.conn_cache, key, bundle)) {
           bundle_destroy(bundle);
           result = CURLE_OUT_OF_MEMORY;
           goto unlock;
    @@ -410,7 +406,7 @@ bool Curl_conncache_return_conn(struct Curl_easy *data,
         conn_candidate = Curl_conncache_extract_oldest(data);
         if(conn_candidate) {
           /* the winner gets the honour of being disconnected */
    -      (void)Curl_disconnect(data, conn_candidate, /* dead_connection */ FALSE);
    +      Curl_disconnect(data, conn_candidate, /* dead_connection */ FALSE);
         }
       }
     
    @@ -547,7 +543,7 @@ void Curl_conncache_close_all_connections(struct conncache *connc)
         /* This will remove the connection from the cache */
         connclose(conn, "kill all");
         Curl_conncache_remove_conn(connc->closure_handle, conn, TRUE);
    -    (void)Curl_disconnect(connc->closure_handle, conn, FALSE);
    +    Curl_disconnect(connc->closure_handle, conn, FALSE);
         sigpipe_restore(&pipe_st);
     
         conn = conncache_find_first_connection(connc);
    diff --git a/vendor/curl/lib/connect.c b/vendor/curl/lib/connect.c
    index 5252f9714d..64f951118b 100644
    --- a/vendor/curl/lib/connect.c
    +++ b/vendor/curl/lib/connect.c
    @@ -5,7 +5,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2021, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -257,6 +257,9 @@ static CURLcode bindlocal(struct Curl_easy *data,
     #ifdef IP_BIND_ADDRESS_NO_PORT
       int on = 1;
     #endif
    +#ifndef ENABLE_IPV6
    +  (void)scope;
    +#endif
     
       /*************************************************************
        * Select device to bind socket to
    @@ -314,8 +317,11 @@ static CURLcode bindlocal(struct Curl_easy *data,
           }
     #endif
     
    -      switch(Curl_if2ip(af, scope, conn->scope_id, dev,
    -                        myhost, sizeof(myhost))) {
    +      switch(Curl_if2ip(af,
    +#ifdef ENABLE_IPV6
    +                        scope, conn->scope_id,
    +#endif
    +                        dev, myhost, sizeof(myhost))) {
             case IF2IP_NOT_FOUND:
               if(is_interface) {
                 /* Do not fall back to treating it as a host name */
    diff --git a/vendor/curl/lib/curl_base64.h b/vendor/curl/lib/curl_base64.h
    index d48edc4241..4cb9d73537 100644
    --- a/vendor/curl/lib/curl_base64.h
    +++ b/vendor/curl/lib/curl_base64.h
    @@ -7,7 +7,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2020, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -22,13 +22,10 @@
      *
      ***************************************************************************/
     
    -CURLcode Curl_base64_encode(struct Curl_easy *data,
    -                            const char *inputbuff, size_t insize,
    +CURLcode Curl_base64_encode(const char *inputbuff, size_t insize,
                                 char **outptr, size_t *outlen);
    -CURLcode Curl_base64url_encode(struct Curl_easy *data,
    -                               const char *inputbuff, size_t insize,
    +CURLcode Curl_base64url_encode(const char *inputbuff, size_t insize,
                                    char **outptr, size_t *outlen);
    -
     CURLcode Curl_base64_decode(const char *src,
                                 unsigned char **outptr, size_t *outlen);
     
    diff --git a/vendor/curl/lib/curl_ctype.c b/vendor/curl/lib/curl_ctype.c
    index d6cd08a077..233a69e76f 100644
    --- a/vendor/curl/lib/curl_ctype.c
    +++ b/vendor/curl/lib/curl_ctype.c
    @@ -5,7 +5,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2020, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -22,8 +22,6 @@
     
     #include "curl_setup.h"
     
    -#ifndef CURL_DOES_CONVERSIONS
    -
     #undef _U
     #define _U (1<<0) /* upper case */
     #undef _L
    @@ -130,4 +128,3 @@ int Curl_iscntrl(int c)
       return (ascii[c] & (_C));
     }
     
    -#endif /* !CURL_DOES_CONVERSIONS */
    diff --git a/vendor/curl/lib/curl_ctype.h b/vendor/curl/lib/curl_ctype.h
    index 17dfaa0942..2fa749dca9 100644
    --- a/vendor/curl/lib/curl_ctype.h
    +++ b/vendor/curl/lib/curl_ctype.h
    @@ -7,7 +7,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2020, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -24,32 +24,6 @@
     
     #include "curl_setup.h"
     
    -#ifdef CURL_DOES_CONVERSIONS
    -
    -/*
    - * Uppercase macro versions of ANSI/ISO is*() functions/macros which
    - * avoid negative number inputs with argument byte codes > 127.
    - *
    - * For non-ASCII platforms the C library character classification routines
    - * are used despite being locale-dependent, because this is better than
    - * not to work at all.
    - */
    -#include 
    -
    -#define ISSPACE(x)  (isspace((int)  ((unsigned char)x)))
    -#define ISDIGIT(x)  (isdigit((int)  ((unsigned char)x)))
    -#define ISALNUM(x)  (isalnum((int)  ((unsigned char)x)))
    -#define ISXDIGIT(x) (isxdigit((int) ((unsigned char)x)))
    -#define ISGRAPH(x)  (isgraph((int)  ((unsigned char)x)))
    -#define ISALPHA(x)  (isalpha((int)  ((unsigned char)x)))
    -#define ISPRINT(x)  (isprint((int)  ((unsigned char)x)))
    -#define ISUPPER(x)  (isupper((int)  ((unsigned char)x)))
    -#define ISLOWER(x)  (islower((int)  ((unsigned char)x)))
    -#define ISCNTRL(x)  (iscntrl((int)  ((unsigned char)x)))
    -#define ISASCII(x)  (isascii((int)  ((unsigned char)x)))
    -
    -#else
    -
     int Curl_isspace(int c);
     int Curl_isdigit(int c);
     int Curl_isalnum(int c);
    @@ -73,8 +47,6 @@ int Curl_iscntrl(int c);
     #define ISCNTRL(x)  (Curl_iscntrl((int)  ((unsigned char)x)))
     #define ISASCII(x)  (((x) >= 0) && ((x) <= 0x80))
     
    -#endif
    -
     #define ISBLANK(x)  (int)((((unsigned char)x) == ' ') ||        \
                               (((unsigned char)x) == '\t'))
     
    diff --git a/vendor/curl/lib/curl_des.c b/vendor/curl/lib/curl_des.c
    index 76185cbf21..5f28ef4f33 100644
    --- a/vendor/curl/lib/curl_des.c
    +++ b/vendor/curl/lib/curl_des.c
    @@ -5,7 +5,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 2015 - 2021, Steve Holme, .
    + * Copyright (C) 2015 - 2022, Steve Holme, .
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -22,7 +22,12 @@
     
     #include "curl_setup.h"
     
    -#if defined(USE_NTLM) && !defined(USE_OPENSSL) && !defined(USE_WOLFSSL)
    +#if defined(USE_CURL_NTLM_CORE) && !defined(USE_WOLFSSL) && \
    +    (defined(USE_GNUTLS) || \
    +     defined(USE_NSS) || \
    +     defined(USE_SECTRANSP) || \
    +     defined(USE_OS400CRYPTO) || \
    +     defined(USE_WIN32_CRYPTO))
     
     #include "curl_des.h"
     
    @@ -60,4 +65,4 @@ void Curl_des_set_odd_parity(unsigned char *bytes, size_t len)
       }
     }
     
    -#endif /* USE_NTLM && !USE_OPENSSL */
    +#endif
    diff --git a/vendor/curl/lib/curl_des.h b/vendor/curl/lib/curl_des.h
    index 438706a0d2..3d0fd92600 100644
    --- a/vendor/curl/lib/curl_des.h
    +++ b/vendor/curl/lib/curl_des.h
    @@ -7,7 +7,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 2015 - 2020, Steve Holme, .
    + * Copyright (C) 2015 - 2022, Steve Holme, .
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -24,11 +24,16 @@
     
     #include "curl_setup.h"
     
    -#if defined(USE_NTLM) && !defined(USE_OPENSSL)
    +#if defined(USE_CURL_NTLM_CORE) && !defined(USE_WOLFSSL) && \
    +    (defined(USE_GNUTLS) || \
    +     defined(USE_NSS) || \
    +     defined(USE_SECTRANSP) || \
    +     defined(USE_OS400CRYPTO) || \
    +     defined(USE_WIN32_CRYPTO))
     
     /* Applies odd parity to the given byte array */
     void Curl_des_set_odd_parity(unsigned char *bytes, size_t length);
     
    -#endif /* USE_NTLM && !USE_OPENSSL */
    +#endif
     
     #endif /* HEADER_CURL_DES_H */
    diff --git a/vendor/curl/lib/curl_ntlm_core.c b/vendor/curl/lib/curl_ntlm_core.c
    index ed123d0c1c..f3b8b130f1 100644
    --- a/vendor/curl/lib/curl_ntlm_core.c
    +++ b/vendor/curl/lib/curl_ntlm_core.c
    @@ -5,7 +5,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2021, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -108,7 +108,6 @@
     #endif
     
     #include "urldata.h"
    -#include "non-ascii.h"
     #include "strcase.h"
     #include "curl_ntlm_core.h"
     #include "curl_md5.h"
    @@ -402,11 +401,9 @@ void Curl_ntlm_core_lm_resp(const unsigned char *keys,
     /*
      * Set up lanmanager hashed password
      */
    -CURLcode Curl_ntlm_core_mk_lm_hash(struct Curl_easy *data,
    -                                   const char *password,
    +CURLcode Curl_ntlm_core_mk_lm_hash(const char *password,
                                        unsigned char *lmbuffer /* 21 bytes */)
     {
    -  CURLcode result;
       unsigned char pw[14];
       static const unsigned char magic[] = {
         0x4B, 0x47, 0x53, 0x21, 0x40, 0x23, 0x24, 0x25 /* i.e. KGS!@#$% */
    @@ -416,14 +413,6 @@ CURLcode Curl_ntlm_core_mk_lm_hash(struct Curl_easy *data,
       Curl_strntoupper((char *)pw, password, len);
       memset(&pw[len], 0, 14 - len);
     
    -  /*
    -   * The LanManager hashed password needs to be created using the
    -   * password in the network encoding not the host encoding.
    -   */
    -  result = Curl_convert_to_network(data, (char *)pw, 14);
    -  if(result)
    -    return result;
    -
       {
         /* Create LanManager hashed password. */
     
    @@ -455,7 +444,6 @@ CURLcode Curl_ntlm_core_mk_lm_hash(struct Curl_easy *data,
       return CURLE_OK;
     }
     
    -#ifdef USE_NTRESPONSES
     static void ascii_to_unicode_le(unsigned char *dest, const char *src,
                                     size_t srclen)
     {
    @@ -466,7 +454,7 @@ static void ascii_to_unicode_le(unsigned char *dest, const char *src,
       }
     }
     
    -#if defined(USE_NTLM_V2) && !defined(USE_WINDOWS_SSPI)
    +#if !defined(USE_WINDOWS_SSPI)
     
     static void ascii_uppercase_to_unicode_le(unsigned char *dest,
                                               const char *src, size_t srclen)
    @@ -478,19 +466,17 @@ static void ascii_uppercase_to_unicode_le(unsigned char *dest,
       }
     }
     
    -#endif /* USE_NTLM_V2 && !USE_WINDOWS_SSPI */
    +#endif /* !USE_WINDOWS_SSPI */
     
     /*
      * Set up nt hashed passwords
      * @unittest: 1600
      */
    -CURLcode Curl_ntlm_core_mk_nt_hash(struct Curl_easy *data,
    -                                   const char *password,
    +CURLcode Curl_ntlm_core_mk_nt_hash(const char *password,
                                        unsigned char *ntbuffer /* 21 bytes */)
     {
       size_t len = strlen(password);
       unsigned char *pw;
    -  CURLcode result;
       if(len > SIZE_T_MAX/2) /* avoid integer overflow */
         return CURLE_OUT_OF_MEMORY;
       pw = len ? malloc(len * 2) : (unsigned char *)strdup("");
    @@ -499,22 +485,16 @@ CURLcode Curl_ntlm_core_mk_nt_hash(struct Curl_easy *data,
     
       ascii_to_unicode_le(pw, password, len);
     
    -  /*
    -   * The NT hashed password needs to be created using the password in the
    -   * network encoding not the host encoding.
    -   */
    -  result = Curl_convert_to_network(data, (char *)pw, len * 2);
    -  if(!result) {
    -    /* Create NT hashed password. */
    -    Curl_md4it(ntbuffer, pw, 2 * len);
    -    memset(ntbuffer + 16, 0, 21 - 16);
    -  }
    +  /* Create NT hashed password. */
    +  Curl_md4it(ntbuffer, pw, 2 * len);
    +  memset(ntbuffer + 16, 0, 21 - 16);
    +
       free(pw);
     
    -  return result;
    +  return CURLE_OK;
     }
     
    -#if defined(USE_NTLM_V2) && !defined(USE_WINDOWS_SSPI)
    +#if !defined(USE_WINDOWS_SSPI)
     
     /* Timestamp in tenths of a microsecond since January 1, 1601 00:00:00 UTC. */
     struct ms_filetime {
    @@ -730,8 +710,6 @@ CURLcode  Curl_ntlm_core_mk_lmv2_resp(unsigned char *ntlmv2hash,
       return result;
     }
     
    -#endif /* USE_NTLM_V2 && !USE_WINDOWS_SSPI */
    -
    -#endif /* USE_NTRESPONSES */
    +#endif /* !USE_WINDOWS_SSPI */
     
     #endif /* USE_CURL_NTLM_CORE */
    diff --git a/vendor/curl/lib/curl_ntlm_core.h b/vendor/curl/lib/curl_ntlm_core.h
    index 02b39d4858..5e52bb26de 100644
    --- a/vendor/curl/lib/curl_ntlm_core.h
    +++ b/vendor/curl/lib/curl_ntlm_core.h
    @@ -7,7 +7,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2021, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -42,22 +42,6 @@
     #  include 
     #endif
     
    -/* Define USE_NTRESPONSES in order to make the type-3 message include
    - * the NT response message. */
    -#define USE_NTRESPONSES
    -
    -/* Define USE_NTLM2SESSION in order to make the type-3 message include the
    -   NTLM2Session response message, requires USE_NTRESPONSES defined to 1 */
    -#if defined(USE_NTRESPONSES)
    -#define USE_NTLM2SESSION
    -#endif
    -
    -/* Define USE_NTLM_V2 in order to allow the type-3 message to include the
    -   LMv2 and NTLMv2 response messages, requires USE_NTRESPONSES defined to 1 */
    -#if defined(USE_NTRESPONSES)
    -#define USE_NTLM_V2
    -#endif
    -
     /* Helpers to generate function byte arguments in little endian order */
     #define SHORTPAIR(x) ((int)((x) & 0xff)), ((int)(((x) >> 8) & 0xff))
     #define LONGQUARTET(x) ((int)((x) & 0xff)), ((int)(((x) >> 8) & 0xff)), \
    @@ -67,16 +51,13 @@ void Curl_ntlm_core_lm_resp(const unsigned char *keys,
                                 const unsigned char *plaintext,
                                 unsigned char *results);
     
    -CURLcode Curl_ntlm_core_mk_lm_hash(struct Curl_easy *data,
    -                                   const char *password,
    +CURLcode Curl_ntlm_core_mk_lm_hash(const char *password,
                                        unsigned char *lmbuffer /* 21 bytes */);
     
    -#ifdef USE_NTRESPONSES
    -CURLcode Curl_ntlm_core_mk_nt_hash(struct Curl_easy *data,
    -                                   const char *password,
    +CURLcode Curl_ntlm_core_mk_nt_hash(const char *password,
                                        unsigned char *ntbuffer /* 21 bytes */);
     
    -#if defined(USE_NTLM_V2) && !defined(USE_WINDOWS_SSPI)
    +#if !defined(USE_WINDOWS_SSPI)
     
     CURLcode Curl_hmac_md5(const unsigned char *key, unsigned int keylen,
                            const unsigned char *data, unsigned int datalen,
    @@ -98,9 +79,7 @@ CURLcode  Curl_ntlm_core_mk_lmv2_resp(unsigned char *ntlmv2hash,
                                           unsigned char *challenge_server,
                                           unsigned char *lmresp);
     
    -#endif /* USE_NTLM_V2 && !USE_WINDOWS_SSPI */
    -
    -#endif /* USE_NTRESPONSES */
    +#endif /* !USE_WINDOWS_SSPI */
     
     #endif /* USE_CURL_NTLM_CORE */
     
    diff --git a/vendor/curl/lib/curl_path.c b/vendor/curl/lib/curl_path.c
    index 65106188c7..a1669d12f7 100644
    --- a/vendor/curl/lib/curl_path.c
    +++ b/vendor/curl/lib/curl_path.c
    @@ -5,7 +5,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2021, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -40,7 +40,7 @@ CURLcode Curl_getworkingpath(struct Curl_easy *data,
       char *working_path;
       size_t working_path_len;
       CURLcode result =
    -    Curl_urldecode(data, data->state.up.path, 0, &working_path,
    +    Curl_urldecode(data->state.up.path, 0, &working_path,
                        &working_path_len, REJECT_ZERO);
       if(result)
         return result;
    diff --git a/vendor/curl/lib/curl_sasl.c b/vendor/curl/lib/curl_sasl.c
    index 8d39e4f81b..7e28c92fd3 100644
    --- a/vendor/curl/lib/curl_sasl.c
    +++ b/vendor/curl/lib/curl_sasl.c
    @@ -5,7 +5,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 2012 - 2021, Daniel Stenberg, , et al.
    + * Copyright (C) 2012 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -48,7 +48,6 @@
     #include "warnless.h"
     #include "strtok.h"
     #include "sendf.h"
    -#include "non-ascii.h" /* included for Curl_convert_... prototypes */
     /* The last 3 #include files should be in this order */
     #include "curl_printf.h"
     #include "curl_memory.h"
    @@ -283,8 +282,7 @@ static CURLcode get_server_message(struct SASL *sasl, struct Curl_easy *data,
     }
     
     /* Encode the outgoing SASL message. */
    -static CURLcode build_message(struct SASL *sasl, struct Curl_easy *data,
    -                              struct bufref *msg)
    +static CURLcode build_message(struct SASL *sasl, struct bufref *msg)
     {
       CURLcode result = CURLE_OK;
     
    @@ -297,7 +295,7 @@ static CURLcode build_message(struct SASL *sasl, struct Curl_easy *data,
           char *base64;
           size_t base64len;
     
    -      result = Curl_base64_encode(data, (const char *) Curl_bufref_ptr(msg),
    +      result = Curl_base64_encode((const char *) Curl_bufref_ptr(msg),
                                       Curl_bufref_len(msg), &base64, &base64len);
           if(!result)
             Curl_bufref_set(msg, base64, base64len, curl_free);
    @@ -312,10 +310,10 @@ static CURLcode build_message(struct SASL *sasl, struct Curl_easy *data,
      *
      * Check if we have enough auth data and capabilities to authenticate.
      */
    -bool Curl_sasl_can_authenticate(struct SASL *sasl, struct connectdata *conn)
    +bool Curl_sasl_can_authenticate(struct SASL *sasl, struct Curl_easy *data)
     {
       /* Have credentials been provided? */
    -  if(conn->bits.user_passwd)
    +  if(data->state.aptr.user)
         return TRUE;
     
       /* EXTERNAL can authenticate without a user name and/or password */
    @@ -367,7 +365,7 @@ CURLcode Curl_sasl_start(struct SASL *sasl, struct Curl_easy *data,
         if(force_ir || data->set.sasl_ir)
           result = Curl_auth_create_external_message(conn->user, &resp);
       }
    -  else if(conn->bits.user_passwd) {
    +  else if(data->state.aptr.user) {
     #if defined(USE_KERBEROS5)
         if((enabledmechs & SASL_MECH_GSSAPI) && Curl_auth_is_gssapi_supported() &&
            Curl_auth_user_contains_domain(conn->user)) {
    @@ -494,7 +492,7 @@ CURLcode Curl_sasl_start(struct SASL *sasl, struct Curl_easy *data,
       if(!result && mech) {
         sasl->curmech = mech;
         if(Curl_bufref_ptr(&resp))
    -      result = build_message(sasl, data, &resp);
    +      result = build_message(sasl, &resp);
     
         if(sasl->params->maxirlen &&
            strlen(mech) + Curl_bufref_len(&resp) > sasl->params->maxirlen)
    @@ -729,7 +727,7 @@ CURLcode Curl_sasl_continue(struct SASL *sasl, struct Curl_easy *data,
         newstate = SASL_CANCEL;
         break;
       case CURLE_OK:
    -    result = build_message(sasl, data, &resp);
    +    result = build_message(sasl, &resp);
         if(!result)
           result = sasl->params->contauth(data, sasl->curmech, &resp);
         break;
    diff --git a/vendor/curl/lib/curl_sasl.h b/vendor/curl/lib/curl_sasl.h
    index 91458c74a0..d377ae7bc8 100644
    --- a/vendor/curl/lib/curl_sasl.h
    +++ b/vendor/curl/lib/curl_sasl.h
    @@ -7,7 +7,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 2012 - 2021, Daniel Stenberg, , et al.
    + * Copyright (C) 2012 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -150,7 +150,7 @@ void Curl_sasl_init(struct SASL *sasl, struct Curl_easy *data,
                         const struct SASLproto *params);
     
     /* Check if we have enough auth data and capabilities to authenticate */
    -bool Curl_sasl_can_authenticate(struct SASL *sasl, struct connectdata *conn);
    +bool Curl_sasl_can_authenticate(struct SASL *sasl, struct Curl_easy *data);
     
     /* Calculate the required login details for SASL authentication  */
     CURLcode Curl_sasl_start(struct SASL *sasl, struct Curl_easy *data,
    diff --git a/vendor/curl/lib/curl_setup.h b/vendor/curl/lib/curl_setup.h
    index 61384cdff6..25c667477e 100644
    --- a/vendor/curl/lib/curl_setup.h
    +++ b/vendor/curl/lib/curl_setup.h
    @@ -7,7 +7,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2021, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -101,14 +101,6 @@
     #  include "config-os400.h"
     #endif
     
    -#ifdef TPF
    -#  include "config-tpf.h"
    -#endif
    -
    -#ifdef __VXWORKS__
    -#  include "config-vxworks.h"
    -#endif
    -
     #ifdef __PLAN9__
     #  include "config-plan9.h"
     #endif
    @@ -274,22 +266,6 @@
     #  include 
     #endif
     
    -#ifdef TPF
    -#  include     /* for bzero, strcasecmp, and strncasecmp */
    -#  include      /* for strcpy and strlen */
    -#  include      /* for rand and srand */
    -#  include  /* for select and ioctl*/
    -#  include       /* for in_addr_t definition */
    -#  include  /* for tpf_process_signals */
    -   /* change which select is used for libcurl */
    -#  define select(a,b,c,d,e) tpf_select_libcurl(a,b,c,d,e)
    -#endif
    -
    -#ifdef __VXWORKS__
    -#  include     /* for generic BSD socket functions */
    -#  include       /* for basic I/O interface functions */
    -#endif
    -
     #ifdef __AMIGA__
     #  include 
     #  include 
    @@ -619,14 +595,6 @@
     #  endif
     #endif
     
    -#ifdef NETWARE
    -int netware_init(void);
    -#ifndef __NOVELL_LIBC__
    -#include 
    -#include 
    -#endif
    -#endif
    -
     #if defined(HAVE_LIBIDN2) && defined(HAVE_IDN2_H) && !defined(USE_WIN32_IDN)
     /* The lib and header are present */
     #define USE_LIBIDN2
    @@ -641,7 +609,7 @@ int netware_init(void);
     #if defined(USE_GNUTLS) || defined(USE_OPENSSL) || defined(USE_NSS) || \
         defined(USE_MBEDTLS) || \
         defined(USE_WOLFSSL) || defined(USE_SCHANNEL) || \
    -    defined(USE_SECTRANSP) || defined(USE_GSKIT) || defined(USE_MESALINK) || \
    +    defined(USE_SECTRANSP) || defined(USE_GSKIT) || \
         defined(USE_BEARSSL) || defined(USE_RUSTLS)
     #define USE_SSL    /* SSL support has been enabled */
     #endif
    @@ -804,6 +772,11 @@ endings either CRLF or LF so 't' is appropriate.
     #define CURLMAX(x,y) ((x)>(y)?(x):(y))
     #define CURLMIN(x,y) ((x)<(y)?(x):(y))
     
    +/* A convenience macro to provide both the string literal and the length of
    +   the string literal in one go, useful for functions that take "string,len"
    +   as their argument */
    +#define STRCONST(x) x,sizeof(x)-1
    +
     /* Some versions of the Android SDK is missing the declaration */
     #if defined(HAVE_GETPWUID_R) && defined(HAVE_DECL_GETPWUID_R_MISSING)
     struct passwd;
    diff --git a/vendor/curl/lib/curl_sha256.h b/vendor/curl/lib/curl_sha256.h
    index 55dc30ad74..2b7890a039 100644
    --- a/vendor/curl/lib/curl_sha256.h
    +++ b/vendor/curl/lib/curl_sha256.h
    @@ -8,7 +8,7 @@
      *                             \___|\___/|_| \_\_____|
      *
      * Copyright (C) 2017, Florin Petriuc, 
    - * Copyright (C) 2018 - 2021, Daniel Stenberg, , et al.
    + * Copyright (C) 2018 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -32,7 +32,7 @@ extern const struct HMAC_params Curl_HMAC_SHA256[1];
     /* SHA256_DIGEST_LENGTH is an enum value in wolfSSL. Need to import it from
      * sha.h*/
     #include 
    -#include 
    +#include 
     #else
     #define SHA256_DIGEST_LENGTH 32
     #endif
    diff --git a/vendor/curl/lib/dict.c b/vendor/curl/lib/dict.c
    index 5d53b8f1ff..e23e661912 100644
    --- a/vendor/curl/lib/dict.c
    +++ b/vendor/curl/lib/dict.c
    @@ -5,7 +5,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2021, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -96,13 +96,13 @@ const struct Curl_handler Curl_handler_dict = {
       PROTOPT_NONE | PROTOPT_NOURLQUERY     /* flags */
     };
     
    -static char *unescape_word(struct Curl_easy *data, const char *inputbuff)
    +static char *unescape_word(const char *inputbuff)
     {
       char *newp = NULL;
       char *dictp;
       size_t len;
     
    -  CURLcode result = Curl_urldecode(data, inputbuff, 0, &newp, &len,
    +  CURLcode result = Curl_urldecode(inputbuff, 0, &newp, &len,
                                        REJECT_NADA);
       if(!newp || result)
         return NULL;
    @@ -190,10 +190,6 @@ static CURLcode dict_do(struct Curl_easy *data, bool *done)
     
       *done = TRUE; /* unconditionally */
     
    -  if(conn->bits.user_passwd) {
    -    /* AUTH is missing */
    -  }
    -
       if(strncasecompare(path, DICT_MATCH, sizeof(DICT_MATCH)-1) ||
          strncasecompare(path, DICT_MATCH2, sizeof(DICT_MATCH2)-1) ||
          strncasecompare(path, DICT_MATCH3, sizeof(DICT_MATCH3)-1)) {
    @@ -226,7 +222,7 @@ static CURLcode dict_do(struct Curl_easy *data, bool *done)
           strategy = (char *)".";
         }
     
    -    eword = unescape_word(data, word);
    +    eword = unescape_word(word);
         if(!eword)
           return CURLE_OUT_OF_MEMORY;
     
    @@ -274,7 +270,7 @@ static CURLcode dict_do(struct Curl_easy *data, bool *done)
           database = (char *)"!";
         }
     
    -    eword = unescape_word(data, word);
    +    eword = unescape_word(word);
         if(!eword)
           return CURLE_OUT_OF_MEMORY;
     
    diff --git a/vendor/curl/lib/doh.c b/vendor/curl/lib/doh.c
    index d6a2167701..292f5dc667 100644
    --- a/vendor/curl/lib/doh.c
    +++ b/vendor/curl/lib/doh.c
    @@ -5,7 +5,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 2018 - 2021, Daniel Stenberg, , et al.
    + * Copyright (C) 2018 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -530,7 +530,7 @@ static DOHcode store_cname(const unsigned char *doh,
     
         if(length) {
           if(Curl_dyn_len(c)) {
    -        if(Curl_dyn_add(c, "."))
    +        if(Curl_dyn_addn(c, STRCONST(".")))
               return DOH_OUT_OF_MEM;
           }
           if((index + length) > dohlen)
    @@ -911,7 +911,7 @@ CURLcode Curl_doh_is_resolved(struct Curl_easy *data,
       if(!dohp->probe[DOH_PROBE_SLOT_IPADDR_V4].easy &&
          !dohp->probe[DOH_PROBE_SLOT_IPADDR_V6].easy) {
         failf(data, "Could not DoH-resolve: %s", data->state.async.hostname);
    -    return data->conn->bits.proxy?CURLE_COULDNT_RESOLVE_PROXY:
    +    return CONN_IS_PROXIED(data->conn)?CURLE_COULDNT_RESOLVE_PROXY:
           CURLE_COULDNT_RESOLVE_HOST;
       }
       else if(!dohp->pending) {
    diff --git a/vendor/curl/lib/dotdot.c b/vendor/curl/lib/dotdot.c
    index 3a1435f8ec..73ef2fa729 100644
    --- a/vendor/curl/lib/dotdot.c
    +++ b/vendor/curl/lib/dotdot.c
    @@ -5,7 +5,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2020, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -32,7 +32,7 @@
     
     /*
      * "Remove Dot Segments"
    - * https://tools.ietf.org/html/rfc3986#section-5.2.4
    + * https://datatracker.ietf.org/doc/html/rfc3986#section-5.2.4
      */
     
     /*
    diff --git a/vendor/curl/lib/easy.c b/vendor/curl/lib/easy.c
    index 20293a710b..0e23561376 100644
    --- a/vendor/curl/lib/easy.c
    +++ b/vendor/curl/lib/easy.c
    @@ -5,7 +5,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2021, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -68,7 +68,6 @@
     #include "slist.h"
     #include "mime.h"
     #include "amigaos.h"
    -#include "non-ascii.h"
     #include "warnless.h"
     #include "multiif.h"
     #include "sigpipe.h"
    @@ -168,12 +167,6 @@ static CURLcode global_init(long flags, bool memoryfuncs)
       }
     #endif
     
    -#ifdef NETWARE
    -  if(netware_init()) {
    -    DEBUGF(fprintf(stderr, "Warning: LONG namespace not available\n"));
    -  }
    -#endif
    -
       if(Curl_resolver_global_init()) {
         DEBUGF(fprintf(stderr, "Error: resolver_global_init failed\n"));
         goto fail;
    @@ -933,8 +926,6 @@ struct Curl_easy *curl_easy_duphandle(struct Curl_easy *data)
       }
     #endif /* USE_ARES */
     
    -  Curl_convert_setup(outcurl);
    -
       Curl_initinfo(outcurl);
     
       outcurl->magic = CURLEASY_MAGIC_NUMBER;
    diff --git a/vendor/curl/lib/escape.c b/vendor/curl/lib/escape.c
    index 683b6fc4a6..ff5887508e 100644
    --- a/vendor/curl/lib/escape.c
    +++ b/vendor/curl/lib/escape.c
    @@ -5,7 +5,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2020, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -29,7 +29,6 @@
     
     #include "urldata.h"
     #include "warnless.h"
    -#include "non-ascii.h"
     #include "escape.h"
     #include "strdup.h"
     /* The last 3 #include files should be in this order */
    @@ -39,7 +38,7 @@
     
     /* Portable character check (remember EBCDIC). Do not use isalnum() because
        its behavior is altered by the current locale.
    -   See https://tools.ietf.org/html/rfc3986#section-2.3
    +   See https://datatracker.ietf.org/doc/html/rfc3986#section-2.3
     */
     bool Curl_isunreserved(unsigned char in)
     {
    @@ -80,8 +79,8 @@ char *curl_easy_escape(struct Curl_easy *data, const char *string,
                            int inlength)
     {
       size_t length;
    -  CURLcode result;
       struct dynbuf d;
    +  (void)data;
     
       if(inlength < 0)
         return NULL;
    @@ -102,16 +101,7 @@ char *curl_easy_escape(struct Curl_easy *data, const char *string,
         }
         else {
           /* encode it */
    -      char encoded[4];
    -      result = Curl_convert_to_network(data, (char *)&in, 1);
    -      if(result) {
    -        /* Curl_convert_to_network calls failf if unsuccessful */
    -        Curl_dyn_free(&d);
    -        return NULL;
    -      }
    -
    -      msnprintf(encoded, sizeof(encoded), "%%%02X", in);
    -      if(Curl_dyn_add(&d, encoded))
    +      if(Curl_dyn_addf(&d, "%%%02X", in))
             return NULL;
         }
         string++;
    @@ -126,8 +116,7 @@ char *curl_easy_escape(struct Curl_easy *data, const char *string,
      * Returns a pointer to a malloced string in *ostring with length given in
      * *olen. If length == 0, the length is assumed to be strlen(string).
      *
    - * 'data' can be set to NULL but then this function can't convert network
    - * data to host for non-ascii.
    + * 'data' can be set to NULL
      *
      * ctrl options:
      * - REJECT_NADA: accept everything
    @@ -139,8 +128,7 @@ char *curl_easy_escape(struct Curl_easy *data, const char *string,
      * invokes that used TRUE/FALSE (0 and 1).
      */
     
    -CURLcode Curl_urldecode(struct Curl_easy *data,
    -                        const char *string, size_t length,
    +CURLcode Curl_urldecode(const char *string, size_t length,
                             char **ostring, size_t *olen,
                             enum urlreject ctrl)
     {
    @@ -148,7 +136,6 @@ CURLcode Curl_urldecode(struct Curl_easy *data,
       char *ns;
       size_t strindex = 0;
       unsigned long hex;
    -  CURLcode result = CURLE_OK;
     
       DEBUGASSERT(string);
       DEBUGASSERT(ctrl >= REJECT_NADA); /* crash on TRUE/FALSE */
    @@ -174,15 +161,6 @@ CURLcode Curl_urldecode(struct Curl_easy *data,
     
           in = curlx_ultouc(hex); /* this long is never bigger than 255 anyway */
     
    -      if(data) {
    -        result = Curl_convert_from_network(data, (char *)&in, 1);
    -        if(result) {
    -          /* Curl_convert_from_network calls failf if unsuccessful */
    -          free(ns);
    -          return result;
    -        }
    -      }
    -
           string += 2;
           alloc -= 2;
         }
    @@ -218,10 +196,11 @@ char *curl_easy_unescape(struct Curl_easy *data, const char *string,
                              int length, int *olen)
     {
       char *str = NULL;
    +  (void)data;
       if(length >= 0) {
         size_t inputlen = length;
         size_t outputlen;
    -    CURLcode res = Curl_urldecode(data, string, inputlen, &str, &outputlen,
    +    CURLcode res = Curl_urldecode(string, inputlen, &str, &outputlen,
                                       REJECT_NADA);
         if(res)
           return NULL;
    diff --git a/vendor/curl/lib/escape.h b/vendor/curl/lib/escape.h
    index 46cb59039a..02668835cc 100644
    --- a/vendor/curl/lib/escape.h
    +++ b/vendor/curl/lib/escape.h
    @@ -7,7 +7,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2020, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -32,8 +32,7 @@ enum urlreject {
       REJECT_ZERO
     };
     
    -CURLcode Curl_urldecode(struct Curl_easy *data,
    -                        const char *string, size_t length,
    +CURLcode Curl_urldecode(const char *string, size_t length,
                             char **ostring, size_t *olen,
                             enum urlreject ctrl);
     
    diff --git a/vendor/curl/lib/file.c b/vendor/curl/lib/file.c
    index 0420db3454..3da79a2c1b 100644
    --- a/vendor/curl/lib/file.c
    +++ b/vendor/curl/lib/file.c
    @@ -5,7 +5,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2021, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -147,7 +147,7 @@ static CURLcode file_connect(struct Curl_easy *data, bool *done)
     #endif
       size_t real_path_len;
     
    -  CURLcode result = Curl_urldecode(data, data->state.up.path, 0, &real_path,
    +  CURLcode result = Curl_urldecode(data->state.up.path, 0, &real_path,
                                        &real_path_len, REJECT_ZERO);
       if(result)
         return result;
    diff --git a/vendor/curl/lib/formdata.c b/vendor/curl/lib/formdata.c
    index ac7a0009cd..5fefd7a6ef 100644
    --- a/vendor/curl/lib/formdata.c
    +++ b/vendor/curl/lib/formdata.c
    @@ -5,7 +5,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2021, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -33,7 +33,6 @@
     
     #include "urldata.h" /* for struct Curl_easy */
     #include "mime.h"
    -#include "non-ascii.h"
     #include "vtls/vtls.h"
     #include "strcase.h"
     #include "sendf.h"
    @@ -77,10 +76,15 @@ AddHttpPost(char *name, size_t namelength,
                 struct curl_httppost **last_post)
     {
       struct curl_httppost *post;
    +  if(!namelength && name)
    +    namelength = strlen(name);
    +  if((bufferlength > LONG_MAX) || (namelength > LONG_MAX))
    +    /* avoid overflow in typecasts below */
    +    return NULL;
       post = calloc(1, sizeof(struct curl_httppost));
       if(post) {
         post->name = name;
    -    post->namelength = (long)(name?(namelength?namelength:strlen(name)):0);
    +    post->namelength = (long)namelength;
         post->contents = value;
         post->contentlen = contentslength;
         post->buffer = buffer;
    @@ -269,14 +273,8 @@ CURLFORMcode FormAdd(struct curl_httppost **httppost,
            * Set the Name property.
            */
         case CURLFORM_PTRNAME:
    -#ifdef CURL_DOES_CONVERSIONS
    -      /* Treat CURLFORM_PTR like CURLFORM_COPYNAME so that libcurl will copy
    -       * the data in all cases so that we'll have safe memory for the eventual
    -       * conversion.
    -       */
    -#else
           current_form->flags |= HTTPPOST_PTRNAME; /* fall through */
    -#endif
    +
           /* FALLTHROUGH */
         case CURLFORM_COPYNAME:
           if(current_form->name)
    @@ -901,11 +899,6 @@ CURLcode Curl_getformdata(struct Curl_easy *data,
               else
                 uclen = (size_t)clen;
               result = curl_mime_data(part, post->contents, uclen);
    -#ifdef CURL_DOES_CONVERSIONS
    -          /* Convert textual contents now. */
    -          if(!result && data && part->datasize)
    -            result = Curl_convert_to_network(data, part->data, part->datasize);
    -#endif
             }
           }
     
    diff --git a/vendor/curl/lib/ftp.c b/vendor/curl/lib/ftp.c
    index f6921e4262..c6efaedd3d 100644
    --- a/vendor/curl/lib/ftp.c
    +++ b/vendor/curl/lib/ftp.c
    @@ -76,7 +76,6 @@
     #include "speedcheck.h"
     #include "warnless.h"
     #include "http_proxy.h"
    -#include "non-ascii.h"
     #include "socks.h"
     /* The last 3 #include files should be in this order */
     #include "curl_printf.h"
    @@ -1030,8 +1029,11 @@ static CURLcode ftp_state_use_port(struct Curl_easy *data,
         if(*addr != '\0') {
           /* attempt to get the address of the given interface name */
           switch(Curl_if2ip(conn->ip_addr->ai_family,
    +#ifdef ENABLE_IPV6
                             Curl_ipv6_scope(conn->ip_addr->ai_addr),
    -                        conn->scope_id, addr, hbuf, sizeof(hbuf))) {
    +                        conn->scope_id,
    +#endif
    +                        addr, hbuf, sizeof(hbuf))) {
             case IF2IP_NOT_FOUND:
               /* not an interface, use the given string as host name instead */
               host = addr;
    @@ -1460,7 +1462,7 @@ static CURLcode ftp_state_list(struct Curl_easy *data)
         /* url-decode before evaluation: e.g. paths starting/ending with %2f */
         const char *slashPos = NULL;
         char *rawPath = NULL;
    -    result = Curl_urldecode(data, ftp->path, 0, &rawPath, NULL, REJECT_CTRL);
    +    result = Curl_urldecode(ftp->path, 0, &rawPath, NULL, REJECT_CTRL);
         if(result)
           return result;
     
    @@ -3247,7 +3249,7 @@ static CURLcode ftp_done(struct Curl_easy *data, CURLcode status,
     
       if(!result)
         /* get the url-decoded "raw" path */
    -    result = Curl_urldecode(data, ftp->path, 0, &rawPath, &pathLen,
    +    result = Curl_urldecode(ftp->path, 0, &rawPath, &pathLen,
                                 REJECT_CTRL);
       if(result) {
         /* We can limp along anyway (and should try to since we may already be in
    @@ -4131,9 +4133,11 @@ CURLcode ftp_parse_url_path(struct Curl_easy *data)
       ftpc->cwdfail = FALSE;
     
       /* url-decode ftp path before further evaluation */
    -  result = Curl_urldecode(data, ftp->path, 0, &rawPath, &pathLen, REJECT_CTRL);
    -  if(result)
    +  result = Curl_urldecode(ftp->path, 0, &rawPath, &pathLen, REJECT_CTRL);
    +  if(result) {
    +    failf(data, "path contains control characters");
         return result;
    +  }
     
       switch(data->set.ftp_filemethod) {
         case FTPFILE_NOCWD: /* fastest, but less standard-compliant */
    diff --git a/vendor/curl/lib/gopher.c b/vendor/curl/lib/gopher.c
    index f61232ff56..0a3ba8fb56 100644
    --- a/vendor/curl/lib/gopher.c
    +++ b/vendor/curl/lib/gopher.c
    @@ -5,7 +5,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2021, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -165,7 +165,7 @@ static CURLcode gopher_do(struct Curl_easy *data, bool *done)
         newp += 2;
     
         /* ... and finally unescape */
    -    result = Curl_urldecode(data, newp, 0, &sel, &len, REJECT_ZERO);
    +    result = Curl_urldecode(newp, 0, &sel, &len, REJECT_ZERO);
         free(gopherpath);
         if(result)
           return result;
    diff --git a/vendor/curl/lib/h2h3.c b/vendor/curl/lib/h2h3.c
    new file mode 100644
    index 0000000000..cf8d156945
    --- /dev/null
    +++ b/vendor/curl/lib/h2h3.c
    @@ -0,0 +1,310 @@
    +/***************************************************************************
    + *                                  _   _ ____  _
    + *  Project                     ___| | | |  _ \| |
    + *                             / __| | | | |_) | |
    + *                            | (__| |_| |  _ <| |___
    + *                             \___|\___/|_| \_\_____|
    + *
    + * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al.
    + *
    + * This software is licensed as described in the file COPYING, which
    + * you should have received as part of this distribution. The terms
    + * are also available at https://curl.se/docs/copyright.html.
    + *
    + * You may opt to use, copy, modify, merge, publish, distribute and/or sell
    + * copies of the Software, and permit persons to whom the Software is
    + * furnished to do so, under the terms of the COPYING file.
    + *
    + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
    + * KIND, either express or implied.
    + *
    + ***************************************************************************/
    +
    +#include "curl_setup.h"
    +#include "urldata.h"
    +#include "h2h3.h"
    +#include "transfer.h"
    +#include "sendf.h"
    +#include "strcase.h"
    +
    +/* The last 3 #include files should be in this order */
    +#include "curl_printf.h"
    +#include "curl_memory.h"
    +#include "memdebug.h"
    +
    +/*
    + * Curl_pseudo_headers() creates the array with pseudo headers to be
    + * used in a HTTP/2 or HTTP/3 request.
    + */
    +
    +#if defined(USE_NGHTTP2) || defined(ENABLE_QUIC)
    +
    +/* Index where :authority header field will appear in request header
    +   field list. */
    +#define AUTHORITY_DST_IDX 3
    +
    +/* USHRT_MAX is 65535 == 0xffff */
    +#define HEADER_OVERFLOW(x) \
    +  (x.namelen > 0xffff || x.valuelen > 0xffff - x.namelen)
    +
    +/*
    + * Check header memory for the token "trailers".
    + * Parse the tokens as separated by comma and surrounded by whitespace.
    + * Returns TRUE if found or FALSE if not.
    + */
    +static bool contains_trailers(const char *p, size_t len)
    +{
    +  const char *end = p + len;
    +  for(;;) {
    +    for(; p != end && (*p == ' ' || *p == '\t'); ++p)
    +      ;
    +    if(p == end || (size_t)(end - p) < sizeof("trailers") - 1)
    +      return FALSE;
    +    if(strncasecompare("trailers", p, sizeof("trailers") - 1)) {
    +      p += sizeof("trailers") - 1;
    +      for(; p != end && (*p == ' ' || *p == '\t'); ++p)
    +        ;
    +      if(p == end || *p == ',')
    +        return TRUE;
    +    }
    +    /* skip to next token */
    +    for(; p != end && *p != ','; ++p)
    +      ;
    +    if(p == end)
    +      return FALSE;
    +    ++p;
    +  }
    +}
    +
    +typedef enum {
    +  /* Send header to server */
    +  HEADERINST_FORWARD,
    +  /* Don't send header to server */
    +  HEADERINST_IGNORE,
    +  /* Discard header, and replace it with "te: trailers" */
    +  HEADERINST_TE_TRAILERS
    +} header_instruction;
    +
    +/* Decides how to treat given header field. */
    +static header_instruction inspect_header(const char *name, size_t namelen,
    +                                         const char *value, size_t valuelen) {
    +  switch(namelen) {
    +  case 2:
    +    if(!strncasecompare("te", name, namelen))
    +      return HEADERINST_FORWARD;
    +
    +    return contains_trailers(value, valuelen) ?
    +           HEADERINST_TE_TRAILERS : HEADERINST_IGNORE;
    +  case 7:
    +    return strncasecompare("upgrade", name, namelen) ?
    +           HEADERINST_IGNORE : HEADERINST_FORWARD;
    +  case 10:
    +    return (strncasecompare("connection", name, namelen) ||
    +            strncasecompare("keep-alive", name, namelen)) ?
    +           HEADERINST_IGNORE : HEADERINST_FORWARD;
    +  case 16:
    +    return strncasecompare("proxy-connection", name, namelen) ?
    +           HEADERINST_IGNORE : HEADERINST_FORWARD;
    +  case 17:
    +    return strncasecompare("transfer-encoding", name, namelen) ?
    +           HEADERINST_IGNORE : HEADERINST_FORWARD;
    +  default:
    +    return HEADERINST_FORWARD;
    +  }
    +}
    +
    +CURLcode Curl_pseudo_headers(struct Curl_easy *data,
    +                             const char *mem, /* the requeset */
    +                             const size_t len /* size of request */,
    +                             struct h2h3req **hp)
    +{
    +  struct connectdata *conn = data->conn;
    +  size_t nheader = 0;
    +  size_t i;
    +  size_t authority_idx;
    +  char *hdbuf = (char *)mem;
    +  char *end, *line_end;
    +  struct h2h3pseudo *nva = NULL;
    +  struct h2h3req *hreq = NULL;
    +  char *vptr;
    +
    +  /* Calculate number of headers contained in [mem, mem + len). Assumes a
    +     correctly generated HTTP header field block. */
    +  for(i = 1; i < len; ++i) {
    +    if(hdbuf[i] == '\n' && hdbuf[i - 1] == '\r') {
    +      ++nheader;
    +      ++i;
    +    }
    +  }
    +  if(nheader < 2) {
    +    goto fail;
    +  }
    +  /* We counted additional 2 \r\n in the first and last line. We need 3
    +     new headers: :method, :path and :scheme. Therefore we need one
    +     more space. */
    +  nheader += 1;
    +  hreq = malloc(sizeof(struct h2h3req) +
    +                sizeof(struct h2h3pseudo) * (nheader - 1));
    +  if(!hreq) {
    +    goto fail;
    +  }
    +
    +  nva = &hreq->header[0];
    +
    +  /* Extract :method, :path from request line
    +     We do line endings with CRLF so checking for CR is enough */
    +  line_end = memchr(hdbuf, '\r', len);
    +  if(!line_end) {
    +    goto fail;
    +  }
    +
    +  /* Method does not contain spaces */
    +  end = memchr(hdbuf, ' ', line_end - hdbuf);
    +  if(!end || end == hdbuf)
    +    goto fail;
    +  nva[0].name = H2H3_PSEUDO_METHOD;
    +  nva[0].namelen = sizeof(H2H3_PSEUDO_METHOD) - 1;
    +  nva[0].value = hdbuf;
    +  nva[0].valuelen = (size_t)(end - hdbuf);
    +
    +  hdbuf = end + 1;
    +
    +  /* Path may contain spaces so scan backwards */
    +  end = NULL;
    +  for(i = (size_t)(line_end - hdbuf); i; --i) {
    +    if(hdbuf[i - 1] == ' ') {
    +      end = &hdbuf[i - 1];
    +      break;
    +    }
    +  }
    +  if(!end || end == hdbuf)
    +    goto fail;
    +  nva[1].name = H2H3_PSEUDO_PATH;
    +  nva[1].namelen = sizeof(H2H3_PSEUDO_PATH) - 1;
    +  nva[1].value = hdbuf;
    +  nva[1].valuelen = (end - hdbuf);
    +
    +  nva[2].name = H2H3_PSEUDO_SCHEME;
    +  nva[2].namelen = sizeof(H2H3_PSEUDO_SCHEME) - 1;
    +  vptr = Curl_checkheaders(data, STRCONST(H2H3_PSEUDO_SCHEME));
    +  if(vptr) {
    +    vptr += sizeof(H2H3_PSEUDO_SCHEME);
    +    while(*vptr && ISSPACE(*vptr))
    +      vptr++;
    +    nva[2].value = vptr;
    +    infof(data, "set pseudo header %s to %s", H2H3_PSEUDO_SCHEME, vptr);
    +  }
    +  else {
    +    if(conn->handler->flags & PROTOPT_SSL)
    +      nva[2].value = "https";
    +    else
    +      nva[2].value = "http";
    +  }
    +  nva[2].valuelen = strlen((char *)nva[2].value);
    +
    +  authority_idx = 0;
    +  i = 3;
    +  while(i < nheader) {
    +    size_t hlen;
    +
    +    hdbuf = line_end + 2;
    +
    +    /* check for next CR, but only within the piece of data left in the given
    +       buffer */
    +    line_end = memchr(hdbuf, '\r', len - (hdbuf - (char *)mem));
    +    if(!line_end || (line_end == hdbuf))
    +      goto fail;
    +
    +    /* header continuation lines are not supported */
    +    if(*hdbuf == ' ' || *hdbuf == '\t')
    +      goto fail;
    +
    +    for(end = hdbuf; end < line_end && *end != ':'; ++end)
    +      ;
    +    if(end == hdbuf || end == line_end)
    +      goto fail;
    +    hlen = end - hdbuf;
    +
    +    if(hlen == 4 && strncasecompare("host", hdbuf, 4)) {
    +      authority_idx = i;
    +      nva[i].name = H2H3_PSEUDO_AUTHORITY;
    +      nva[i].namelen = sizeof(H2H3_PSEUDO_AUTHORITY) - 1;
    +    }
    +    else {
    +      nva[i].namelen = (size_t)(end - hdbuf);
    +      /* Lower case the header name for HTTP/3 */
    +      Curl_strntolower((char *)hdbuf, hdbuf, nva[i].namelen);
    +      nva[i].name = hdbuf;
    +    }
    +    hdbuf = end + 1;
    +    while(*hdbuf == ' ' || *hdbuf == '\t')
    +      ++hdbuf;
    +    end = line_end;
    +
    +    switch(inspect_header((const char *)nva[i].name, nva[i].namelen, hdbuf,
    +                          end - hdbuf)) {
    +    case HEADERINST_IGNORE:
    +      /* skip header fields prohibited by HTTP/2 specification. */
    +      --nheader;
    +      continue;
    +    case HEADERINST_TE_TRAILERS:
    +      nva[i].value = "trailers";
    +      nva[i].valuelen = sizeof("trailers") - 1;
    +      break;
    +    default:
    +      nva[i].value = hdbuf;
    +      nva[i].valuelen = (end - hdbuf);
    +    }
    +
    +    nva[i].value = hdbuf;
    +    nva[i].valuelen = (end - hdbuf);
    +
    +    ++i;
    +  }
    +
    +  /* :authority must come before non-pseudo header fields */
    +  if(authority_idx && authority_idx != AUTHORITY_DST_IDX) {
    +    struct h2h3pseudo authority = nva[authority_idx];
    +    for(i = authority_idx; i > AUTHORITY_DST_IDX; --i) {
    +      nva[i] = nva[i - 1];
    +    }
    +    nva[i] = authority;
    +  }
    +
    +  /* Warn stream may be rejected if cumulative length of headers is too
    +     large. */
    +#define MAX_ACC 60000  /* <64KB to account for some overhead */
    +  {
    +    size_t acc = 0;
    +
    +    for(i = 0; i < nheader; ++i) {
    +      acc += nva[i].namelen + nva[i].valuelen;
    +
    +      infof(data, "h2h3 [%.*s: %.*s]",
    +            (int)nva[i].namelen, nva[i].name,
    +            (int)nva[i].valuelen, nva[i].value);
    +    }
    +
    +    if(acc > MAX_ACC) {
    +      infof(data, "http_request: Warning: The cumulative length of all "
    +            "headers exceeds %d bytes and that could cause the "
    +            "stream to be rejected.", MAX_ACC);
    +    }
    +  }
    +
    +  hreq->entries = nheader;
    +  *hp = hreq;
    +
    +  return CURLE_OK;
    +
    +  fail:
    +  free(hreq);
    +  return CURLE_OUT_OF_MEMORY;
    +}
    +
    +void Curl_pseudo_free(struct h2h3req *hp)
    +{
    +  free(hp);
    +}
    +
    +#endif /* USE_NGHTTP2 or HTTP/3 enabled */
    diff --git a/vendor/curl/lib/h2h3.h b/vendor/curl/lib/h2h3.h
    new file mode 100644
    index 0000000000..22256841c6
    --- /dev/null
    +++ b/vendor/curl/lib/h2h3.h
    @@ -0,0 +1,59 @@
    +#ifndef HEADER_CURL_H2H3_H
    +#define HEADER_CURL_H2H3_H
    +/***************************************************************************
    + *                                  _   _ ____  _
    + *  Project                     ___| | | |  _ \| |
    + *                             / __| | | | |_) | |
    + *                            | (__| |_| |  _ <| |___
    + *                             \___|\___/|_| \_\_____|
    + *
    + * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al.
    + *
    + * This software is licensed as described in the file COPYING, which
    + * you should have received as part of this distribution. The terms
    + * are also available at https://curl.se/docs/copyright.html.
    + *
    + * You may opt to use, copy, modify, merge, publish, distribute and/or sell
    + * copies of the Software, and permit persons to whom the Software is
    + * furnished to do so, under the terms of the COPYING file.
    + *
    + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
    + * KIND, either express or implied.
    + *
    + ***************************************************************************/
    +#include "curl_setup.h"
    +
    +#define H2H3_PSEUDO_METHOD ":method"
    +#define H2H3_PSEUDO_SCHEME ":scheme"
    +#define H2H3_PSEUDO_AUTHORITY ":authority"
    +#define H2H3_PSEUDO_PATH ":path"
    +#define H2H3_PSEUDO_STATUS ":status"
    +
    +struct h2h3pseudo {
    +  const char *name;
    +  size_t namelen;
    +  const char *value;
    +  size_t valuelen;
    +};
    +
    +struct h2h3req {
    +  size_t entries;
    +  struct h2h3pseudo header[1]; /* the array is allocated to contain entries */
    +};
    +
    +/*
    + * Curl_pseudo_headers() creates the array with pseudo headers to be
    + * used in a HTTP/2 or HTTP/3 request. Returns an allocated struct.
    + * Free it with Curl_pseudo_free().
    + */
    +CURLcode Curl_pseudo_headers(struct Curl_easy *data,
    +                             const char *request,
    +                             const size_t len,
    +                             struct h2h3req **hp);
    +
    +/*
    + * Curl_pseudo_free() frees a h2h3req struct.
    + */
    +void Curl_pseudo_free(struct h2h3req *hp);
    +
    +#endif /* HEADER_CURL_H2H3_H */
    diff --git a/vendor/curl/lib/hostip.c b/vendor/curl/lib/hostip.c
    index 911d5ed6d3..9d69bbe359 100644
    --- a/vendor/curl/lib/hostip.c
    +++ b/vendor/curl/lib/hostip.c
    @@ -5,7 +5,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2021, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -1220,6 +1220,7 @@ CURLcode Curl_resolv_check(struct Curl_easy *data,
                                struct Curl_dns_entry **dns)
     {
     #if defined(CURL_DISABLE_DOH) && !defined(CURLRES_ASYNCH)
    +  (void)data;
       (void)dns;
     #endif
     #ifndef CURL_DISABLE_DOH
    diff --git a/vendor/curl/lib/hsts.c b/vendor/curl/lib/hsts.c
    index 052dc11571..03fcc9e425 100644
    --- a/vendor/curl/lib/hsts.c
    +++ b/vendor/curl/lib/hsts.c
    @@ -5,7 +5,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 2020 - 2021, Daniel Stenberg, , et al.
    + * Copyright (C) 2020 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -21,7 +21,7 @@
      ***************************************************************************/
     /*
      * The Strict-Transport-Security header is defined in RFC 6797:
    - * https://tools.ietf.org/html/rfc6797
    + * https://datatracker.ietf.org/doc/html/rfc6797
      */
     #include "curl_setup.h"
     
    diff --git a/vendor/curl/lib/http.c b/vendor/curl/lib/http.c
    index f08a343e3b..799d4fb457 100644
    --- a/vendor/curl/lib/http.c
    +++ b/vendor/curl/lib/http.c
    @@ -5,7 +5,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2021, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -77,7 +77,6 @@
     #include "content_encoding.h"
     #include "http_proxy.h"
     #include "warnless.h"
    -#include "non-ascii.h"
     #include "http2.h"
     #include "connect.h"
     #include "strdup.h"
    @@ -216,10 +215,10 @@ static CURLcode http_setup_conn(struct Curl_easy *data,
      */
     char *Curl_checkProxyheaders(struct Curl_easy *data,
                                  const struct connectdata *conn,
    -                             const char *thisheader)
    +                             const char *thisheader,
    +                             const size_t thislen)
     {
       struct curl_slist *head;
    -  size_t thislen = strlen(thisheader);
     
       for(head = (conn->bits.proxy && data->set.sep_headers) ?
             data->set.proxyheaders : data->set.headers;
    @@ -233,7 +232,7 @@ char *Curl_checkProxyheaders(struct Curl_easy *data,
     }
     #else
     /* disabled */
    -#define Curl_checkProxyheaders(x,y,z) NULL
    +#define Curl_checkProxyheaders(x,y,z,a) NULL
     #endif
     
     /*
    @@ -327,7 +326,7 @@ static CURLcode http_output_basic(struct Curl_easy *data, bool proxy)
       if(!out)
         return CURLE_OUT_OF_MEMORY;
     
    -  result = Curl_base64_encode(data, out, strlen(out), &authorization, &size);
    +  result = Curl_base64_encode(out, strlen(out), &authorization, &size);
       if(result)
         goto fail;
     
    @@ -588,7 +587,7 @@ CURLcode Curl_http_auth_act(struct Curl_easy *data)
       if(data->state.authproblem)
         return data->set.http_fail_on_error?CURLE_HTTP_RETURNED_ERROR:CURLE_OK;
     
    -  if((conn->bits.user_passwd || data->set.str[STRING_BEARER]) &&
    +  if((data->state.aptr.user || data->set.str[STRING_BEARER]) &&
          ((data->req.httpcode == 401) ||
           (conn->bits.authneg && data->req.httpcode < 300))) {
         pickhost = pickoneauth(&data->state.authhost, authmask);
    @@ -667,6 +666,7 @@ output_auth_headers(struct Curl_easy *data,
     {
       const char *auth = NULL;
       CURLcode result = CURLE_OK;
    +  (void)conn;
     
     #ifdef CURL_DISABLE_CRYPTO_AUTH
       (void)request;
    @@ -725,10 +725,10 @@ output_auth_headers(struct Curl_easy *data,
         if(
     #ifndef CURL_DISABLE_PROXY
           (proxy && conn->bits.proxy_user_passwd &&
    -       !Curl_checkProxyheaders(data, conn, "Proxy-authorization")) ||
    +       !Curl_checkProxyheaders(data, conn, STRCONST("Proxy-authorization"))) ||
     #endif
    -      (!proxy && conn->bits.user_passwd &&
    -       !Curl_checkheaders(data, "Authorization"))) {
    +      (!proxy && data->state.aptr.user &&
    +       !Curl_checkheaders(data, STRCONST("Authorization")))) {
           auth = "Basic";
           result = http_output_basic(data, proxy);
           if(result)
    @@ -742,7 +742,7 @@ output_auth_headers(struct Curl_easy *data,
       if(authstatus->picked == CURLAUTH_BEARER) {
         /* Bearer */
         if((!proxy && data->set.str[STRING_BEARER] &&
    -        !Curl_checkheaders(data, "Authorization"))) {
    +        !Curl_checkheaders(data, STRCONST("Authorization")))) {
           auth = "Bearer";
           result = http_output_bearer(data);
           if(result)
    @@ -811,7 +811,7 @@ Curl_http_output_auth(struct Curl_easy *data,
     #ifndef CURL_DISABLE_PROXY
         (conn->bits.httpproxy && conn->bits.proxy_user_passwd) ||
     #endif
    -     conn->bits.user_passwd || data->set.str[STRING_BEARER])
    +     data->state.aptr.user || data->set.str[STRING_BEARER])
         /* continue please */;
       else {
         authhost->done = TRUE;
    @@ -1143,7 +1143,7 @@ static bool http_should_fail(struct Curl_easy *data)
       ** Either we're not authenticating, or we're supposed to
       ** be authenticating something else.  This is an error.
       */
    -  if((httpcode == 401) && !data->conn->bits.user_passwd)
    +  if((httpcode == 401) && !data->state.aptr.user)
         return TRUE;
     #ifndef CURL_DISABLE_PROXY
       if((httpcode == 407) && !data->conn->bits.proxy_user_passwd)
    @@ -1251,14 +1251,6 @@ CURLcode Curl_buffer_send(struct dynbuf *in,
     
       DEBUGASSERT(size > (size_t)included_body_bytes);
     
    -  result = Curl_convert_to_network(data, ptr, headersize);
    -  /* Curl_convert_to_network calls failf if unsuccessful */
    -  if(result) {
    -    /* conversion failed, free memory and return to the caller */
    -    Curl_dyn_free(in);
    -    return result;
    -  }
    -
       if((conn->handler->flags & PROTOPT_SSL
     #ifndef CURL_DISABLE_PROXY
           || conn->http_proxy.proxytype == CURLPROXY_HTTPS
    @@ -1425,18 +1417,22 @@ CURLcode Curl_buffer_send(struct dynbuf *in,
     bool
     Curl_compareheader(const char *headerline, /* line to check */
                        const char *header,  /* header keyword _with_ colon */
    -                   const char *content) /* content string to find */
    +                   const size_t hlen,   /* len of the keyword in bytes */
    +                   const char *content, /* content string to find */
    +                   const size_t clen)   /* len of the content in bytes */
     {
       /* RFC2616, section 4.2 says: "Each header field consists of a name followed
        * by a colon (":") and the field value. Field names are case-insensitive.
        * The field value MAY be preceded by any amount of LWS, though a single SP
        * is preferred." */
     
    -  size_t hlen = strlen(header);
    -  size_t clen;
       size_t len;
       const char *start;
       const char *end;
    +  DEBUGASSERT(hlen);
    +  DEBUGASSERT(clen);
    +  DEBUGASSERT(header);
    +  DEBUGASSERT(content);
     
       if(!strncasecompare(headerline, header, hlen))
         return FALSE; /* doesn't start with header */
    @@ -1460,7 +1456,6 @@ Curl_compareheader(const char *headerline, /* line to check */
       }
     
       len = end-start; /* length of the content part of the input line */
    -  clen = strlen(content); /* length of the word to find */
     
       /* find the content string in the rest of the line */
       for(; len >= clen; len--, start++) {
    @@ -1546,7 +1541,7 @@ static CURLcode add_haproxy_protocol_header(struct Curl_easy *data)
     #ifdef USE_UNIX_SOCKETS
       if(data->conn->unix_domain_socket)
         /* the buffer is large enough to hold this! */
    -    result = Curl_dyn_add(&req, "PROXY UNKNOWN\r\n");
    +    result = Curl_dyn_addn(&req, STRCONST("PROXY UNKNOWN\r\n"));
       else {
     #endif
       /* Emit the correct prefix for IPv6 */
    @@ -1713,13 +1708,13 @@ static CURLcode expect100(struct Curl_easy *data,
         /* if not doing HTTP 1.0 or version 2, or disabled explicitly, we add an
            Expect: 100-continue to the headers which actually speeds up post
            operations (as there is one packet coming back from the web server) */
    -    const char *ptr = Curl_checkheaders(data, "Expect");
    +    const char *ptr = Curl_checkheaders(data, STRCONST("Expect"));
         if(ptr) {
           data->state.expect100header =
    -        Curl_compareheader(ptr, "Expect:", "100-continue");
    +        Curl_compareheader(ptr, STRCONST("Expect:"), STRCONST("100-continue"));
         }
         else {
    -      result = Curl_dyn_add(req, "Expect: 100-continue\r\n");
    +      result = Curl_dyn_addn(req, STRCONST("Expect: 100-continue\r\n"));
           if(!result)
             data->state.expect100header = TRUE;
         }
    @@ -1867,7 +1862,7 @@ CURLcode Curl_add_custom_headers(struct Curl_easy *data,
               ptr = optr;
             }
           }
    -      if(ptr) {
    +      if(ptr && (ptr != headers->data)) {
             /* we require a colon for this to be a true header */
     
             ptr++; /* pass the colon */
    @@ -1949,6 +1944,7 @@ CURLcode Curl_add_timecondition(struct Curl_easy *data,
       CURLcode result;
       char datestr[80];
       const char *condp;
    +  size_t len;
     
       if(data->set.timecondition == CURL_TIMECOND_NONE)
         /* no condition was asked for */
    @@ -1967,16 +1963,19 @@ CURLcode Curl_add_timecondition(struct Curl_easy *data,
     
       case CURL_TIMECOND_IFMODSINCE:
         condp = "If-Modified-Since";
    +    len = 17;
         break;
       case CURL_TIMECOND_IFUNMODSINCE:
         condp = "If-Unmodified-Since";
    +    len = 19;
         break;
       case CURL_TIMECOND_LASTMOD:
         condp = "Last-Modified";
    +    len = 13;
         break;
       }
     
    -  if(Curl_checkheaders(data, condp)) {
    +  if(Curl_checkheaders(data, condp, len)) {
         /* A custom header was specified; it will be sent instead. */
         return CURLE_OK;
       }
    @@ -2065,7 +2064,7 @@ CURLcode Curl_http_useragent(struct Curl_easy *data)
          it might have been used in the proxy connect, but if we have got a header
          with the user-agent string specified, we erase the previously made string
          here. */
    -  if(Curl_checkheaders(data, "User-Agent")) {
    +  if(Curl_checkheaders(data, STRCONST("User-Agent"))) {
         free(data->state.aptr.uagent);
         data->state.aptr.uagent = NULL;
       }
    @@ -2088,7 +2087,7 @@ CURLcode Curl_http_host(struct Curl_easy *data, struct connectdata *conn)
       }
       Curl_safefree(data->state.aptr.host);
     
    -  ptr = Curl_checkheaders(data, "Host");
    +  ptr = Curl_checkheaders(data, STRCONST("Host"));
       if(ptr && (!data->state.this_is_a_follow ||
                  strcasecompare(data->state.first_host, conn->host.name))) {
     #if !defined(CURL_DISABLE_COOKIES)
    @@ -2305,7 +2304,7 @@ CURLcode Curl_http_body(struct Curl_easy *data, struct connectdata *conn,
     
     #ifndef CURL_DISABLE_MIME
       if(http->sendit) {
    -    const char *cthdr = Curl_checkheaders(data, "Content-Type");
    +    const char *cthdr = Curl_checkheaders(data, STRCONST("Content-Type"));
     
         /* Read and seek body only. */
         http->sendit->flags |= MIME_BODY_ONLY;
    @@ -2330,11 +2329,12 @@ CURLcode Curl_http_body(struct Curl_easy *data, struct connectdata *conn,
       }
     #endif
     
    -  ptr = Curl_checkheaders(data, "Transfer-Encoding");
    +  ptr = Curl_checkheaders(data, STRCONST("Transfer-Encoding"));
       if(ptr) {
         /* Some kind of TE is requested, check if 'chunked' is chosen */
         data->req.upload_chunky =
    -      Curl_compareheader(ptr, "Transfer-Encoding:", "chunked");
    +      Curl_compareheader(ptr,
    +                         STRCONST("Transfer-Encoding:"), STRCONST("chunked"));
       }
       else {
         if((conn->handler->protocol & PROTO_FAMILY_HTTP) &&
    @@ -2394,7 +2394,8 @@ CURLcode Curl_http_bodysend(struct Curl_easy *data, struct connectdata *conn,
           http->postsize = data->state.infilesize;
     
         if((http->postsize != -1) && !data->req.upload_chunky &&
    -       (conn->bits.authneg || !Curl_checkheaders(data, "Content-Length"))) {
    +       (conn->bits.authneg ||
    +        !Curl_checkheaders(data, STRCONST("Content-Length")))) {
           /* only add Content-Length if not uploading chunked */
           result = Curl_dyn_addf(r, "Content-Length: %" CURL_FORMAT_CURL_OFF_T
                                  "\r\n", http->postsize);
    @@ -2409,7 +2410,7 @@ CURLcode Curl_http_bodysend(struct Curl_easy *data, struct connectdata *conn,
         }
     
         /* end of headers */
    -    result = Curl_dyn_add(r, "\r\n");
    +    result = Curl_dyn_addn(r, STRCONST("\r\n"));
         if(result)
           return result;
     
    @@ -2434,7 +2435,7 @@ CURLcode Curl_http_bodysend(struct Curl_easy *data, struct connectdata *conn,
         /* This is form posting using mime data. */
         if(conn->bits.authneg) {
           /* nothing to post! */
    -      result = Curl_dyn_add(r, "Content-Length: 0\r\n\r\n");
    +      result = Curl_dyn_addn(r, STRCONST("Content-Length: 0\r\n\r\n"));
           if(result)
             return result;
     
    @@ -2454,7 +2455,8 @@ CURLcode Curl_http_bodysend(struct Curl_easy *data, struct connectdata *conn,
            we don't upload data chunked, as RFC2616 forbids us to set both
            kinds of headers (Transfer-Encoding: chunked and Content-Length) */
         if(http->postsize != -1 && !data->req.upload_chunky &&
    -       (conn->bits.authneg || !Curl_checkheaders(data, "Content-Length"))) {
    +       (conn->bits.authneg ||
    +        !Curl_checkheaders(data, STRCONST("Content-Length")))) {
           /* we allow replacing this header if not during auth negotiation,
              although it isn't very wise to actually set your own */
           result = Curl_dyn_addf(r,
    @@ -2481,10 +2483,10 @@ CURLcode Curl_http_bodysend(struct Curl_easy *data, struct connectdata *conn,
            the somewhat bigger ones we allow the app to disable it. Just make
            sure that the expect100header is always set to the preferred value
            here. */
    -    ptr = Curl_checkheaders(data, "Expect");
    +    ptr = Curl_checkheaders(data, STRCONST("Expect"));
         if(ptr) {
           data->state.expect100header =
    -        Curl_compareheader(ptr, "Expect:", "100-continue");
    +        Curl_compareheader(ptr, STRCONST("Expect:"), STRCONST("100-continue"));
         }
         else if(http->postsize > EXPECT_100_THRESHOLD || http->postsize < 0) {
           result = expect100(data, conn, r);
    @@ -2495,7 +2497,7 @@ CURLcode Curl_http_bodysend(struct Curl_easy *data, struct connectdata *conn,
           data->state.expect100header = FALSE;
     
         /* make the request end in a true CRLF */
    -    result = Curl_dyn_add(r, "\r\n");
    +    result = Curl_dyn_addn(r, STRCONST("\r\n"));
         if(result)
           return result;
     
    @@ -2534,7 +2536,8 @@ CURLcode Curl_http_bodysend(struct Curl_easy *data, struct connectdata *conn,
            we don't upload data chunked, as RFC2616 forbids us to set both
            kinds of headers (Transfer-Encoding: chunked and Content-Length) */
         if((http->postsize != -1) && !data->req.upload_chunky &&
    -       (conn->bits.authneg || !Curl_checkheaders(data, "Content-Length"))) {
    +       (conn->bits.authneg ||
    +        !Curl_checkheaders(data, STRCONST("Content-Length")))) {
           /* we allow replacing this header if not during auth negotiation,
              although it isn't very wise to actually set your own */
           result = Curl_dyn_addf(r, "Content-Length: %" CURL_FORMAT_CURL_OFF_T
    @@ -2543,9 +2546,9 @@ CURLcode Curl_http_bodysend(struct Curl_easy *data, struct connectdata *conn,
             return result;
         }
     
    -    if(!Curl_checkheaders(data, "Content-Type")) {
    -      result = Curl_dyn_add(r, "Content-Type: application/"
    -                            "x-www-form-urlencoded\r\n");
    +    if(!Curl_checkheaders(data, STRCONST("Content-Type"))) {
    +      result = Curl_dyn_addn(r, STRCONST("Content-Type: application/"
    +                                         "x-www-form-urlencoded\r\n"));
           if(result)
             return result;
         }
    @@ -2554,10 +2557,10 @@ CURLcode Curl_http_bodysend(struct Curl_easy *data, struct connectdata *conn,
            the somewhat bigger ones we allow the app to disable it. Just make
            sure that the expect100header is always set to the preferred value
            here. */
    -    ptr = Curl_checkheaders(data, "Expect");
    +    ptr = Curl_checkheaders(data, STRCONST("Expect"));
         if(ptr) {
           data->state.expect100header =
    -        Curl_compareheader(ptr, "Expect:", "100-continue");
    +        Curl_compareheader(ptr, STRCONST("Expect:"), STRCONST("100-continue"));
         }
         else if(http->postsize > EXPECT_100_THRESHOLD || http->postsize < 0) {
           result = expect100(data, conn, r);
    @@ -2584,7 +2587,7 @@ CURLcode Curl_http_bodysend(struct Curl_easy *data, struct connectdata *conn,
                get the data duplicated with malloc() and family. */
     
             /* end of headers! */
    -        result = Curl_dyn_add(r, "\r\n");
    +        result = Curl_dyn_addn(r, STRCONST("\r\n"));
             if(result)
               return result;
     
    @@ -2606,12 +2609,12 @@ CURLcode Curl_http_bodysend(struct Curl_easy *data, struct connectdata *conn,
                   result = Curl_dyn_addn(r, data->set.postfields,
                                          (size_t)http->postsize);
                   if(!result)
    -                result = Curl_dyn_add(r, "\r\n");
    +                result = Curl_dyn_addn(r, STRCONST("\r\n"));
                   included_body += 2;
                 }
               }
               if(!result) {
    -            result = Curl_dyn_add(r, "\x30\x0d\x0a\x0d\x0a");
    +            result = Curl_dyn_addn(r, STRCONST("\x30\x0d\x0a\x0d\x0a"));
                 /* 0  CR  LF  CR  LF */
                 included_body += 5;
               }
    @@ -2634,7 +2637,7 @@ CURLcode Curl_http_bodysend(struct Curl_easy *data, struct connectdata *conn,
             Curl_pgrsSetUploadSize(data, http->postsize);
     
             /* end of headers! */
    -        result = Curl_dyn_add(r, "\r\n");
    +        result = Curl_dyn_addn(r, STRCONST("\r\n"));
             if(result)
               return result;
           }
    @@ -2643,14 +2646,14 @@ CURLcode Curl_http_bodysend(struct Curl_easy *data, struct connectdata *conn,
     #endif
         {
            /* end of headers! */
    -      result = Curl_dyn_add(r, "\r\n");
    +      result = Curl_dyn_addn(r, STRCONST("\r\n"));
           if(result)
             return result;
     
           if(data->req.upload_chunky && conn->bits.authneg) {
             /* Chunky upload is selected and we're negotiating auth still, send
                end-of-data only */
    -        result = Curl_dyn_add(r, (char *)"\x30\x0d\x0a\x0d\x0a");
    +        result = Curl_dyn_addn(r, (char *)STRCONST("\x30\x0d\x0a\x0d\x0a"));
             /* 0  CR  LF  CR  LF */
             if(result)
               return result;
    @@ -2678,7 +2681,7 @@ CURLcode Curl_http_bodysend(struct Curl_easy *data, struct connectdata *conn,
         break;
     
       default:
    -    result = Curl_dyn_add(r, "\r\n");
    +    result = Curl_dyn_addn(r, STRCONST("\r\n"));
         if(result)
           return result;
     
    @@ -2702,7 +2705,8 @@ CURLcode Curl_http_cookies(struct Curl_easy *data,
     {
       CURLcode result = CURLE_OK;
       char *addcookies = NULL;
    -  if(data->set.str[STRING_COOKIE] && !Curl_checkheaders(data, "Cookie"))
    +  if(data->set.str[STRING_COOKIE] &&
    +     !Curl_checkheaders(data, STRCONST("Cookie")))
         addcookies = data->set.str[STRING_COOKIE];
     
       if(data->cookies || addcookies) {
    @@ -2728,7 +2732,7 @@ CURLcode Curl_http_cookies(struct Curl_easy *data,
           while(co) {
             if(co->value) {
               if(0 == count) {
    -            result = Curl_dyn_add(r, "Cookie: ");
    +            result = Curl_dyn_addn(r, STRCONST("Cookie: "));
                 if(result)
                   break;
               }
    @@ -2744,14 +2748,14 @@ CURLcode Curl_http_cookies(struct Curl_easy *data,
         }
         if(addcookies && !result) {
           if(!count)
    -        result = Curl_dyn_add(r, "Cookie: ");
    +        result = Curl_dyn_addn(r, STRCONST("Cookie: "));
           if(!result) {
             result = Curl_dyn_addf(r, "%s%s", count?"; ":"", addcookies);
             count++;
           }
         }
         if(count && !result)
    -      result = Curl_dyn_add(r, "\r\n");
    +      result = Curl_dyn_addn(r, STRCONST("\r\n"));
     
         if(result)
           return result;
    @@ -2770,14 +2774,14 @@ CURLcode Curl_http_range(struct Curl_easy *data,
          * ones if any such are specified.
          */
         if(((httpreq == HTTPREQ_GET) || (httpreq == HTTPREQ_HEAD)) &&
    -       !Curl_checkheaders(data, "Range")) {
    +       !Curl_checkheaders(data, STRCONST("Range"))) {
           /* if a line like this was already allocated, free the previous one */
           free(data->state.aptr.rangeline);
           data->state.aptr.rangeline = aprintf("Range: bytes=%s\r\n",
                                                data->state.range);
         }
         else if((httpreq == HTTPREQ_POST || httpreq == HTTPREQ_PUT) &&
    -            !Curl_checkheaders(data, "Content-Range")) {
    +            !Curl_checkheaders(data, STRCONST("Content-Range"))) {
     
           /* if a line like this was already allocated, free the previous one */
           free(data->state.aptr.rangeline);
    @@ -2962,14 +2966,14 @@ CURLcode Curl_http_firstwrite(struct Curl_easy *data,
     #ifdef HAVE_LIBZ
     CURLcode Curl_transferencode(struct Curl_easy *data)
     {
    -  if(!Curl_checkheaders(data, "TE") &&
    +  if(!Curl_checkheaders(data, STRCONST("TE")) &&
          data->set.http_transfer_encoding) {
         /* When we are to insert a TE: header in the request, we must also insert
            TE in a Connection: header, so we need to merge the custom provided
            Connection: header and prevent the original to get sent. Note that if
            the user has inserted his/her own TE: header we don't do this magic
            but then assume that the user will handle it all! */
    -    char *cptr = Curl_checkheaders(data, "Connection");
    +    char *cptr = Curl_checkheaders(data, STRCONST("Connection"));
     #define TE_HEADER "TE: gzip\r\n"
     
         Curl_safefree(data->state.aptr.te);
    @@ -3089,13 +3093,13 @@ CURLcode Curl_http(struct Curl_easy *data, bool *done)
       }
     
       Curl_safefree(data->state.aptr.ref);
    -  if(data->state.referer && !Curl_checkheaders(data, "Referer")) {
    +  if(data->state.referer && !Curl_checkheaders(data, STRCONST("Referer"))) {
         data->state.aptr.ref = aprintf("Referer: %s\r\n", data->state.referer);
         if(!data->state.aptr.ref)
           return CURLE_OUT_OF_MEMORY;
       }
     
    -  if(!Curl_checkheaders(data, "Accept-Encoding") &&
    +  if(!Curl_checkheaders(data, STRCONST("Accept-Encoding")) &&
          data->set.str[STRING_ENCODING]) {
         Curl_safefree(data->state.aptr.accept_encoding);
         data->state.aptr.accept_encoding =
    @@ -3117,7 +3121,8 @@ CURLcode Curl_http(struct Curl_easy *data, bool *done)
       if(result)
         return result;
     
    -  p_accept = Curl_checkheaders(data, "Accept")?NULL:"Accept: */*\r\n";
    +  p_accept = Curl_checkheaders(data,
    +                               STRCONST("Accept"))?NULL:"Accept: */*\r\n";
     
       result = Curl_http_resume(data, conn, httpreq);
       if(result)
    @@ -3147,7 +3152,7 @@ CURLcode Curl_http(struct Curl_easy *data, bool *done)
       }
     
     #ifndef CURL_DISABLE_ALTSVC
    -  if(conn->bits.altused && !Curl_checkheaders(data, "Alt-Used")) {
    +  if(conn->bits.altused && !Curl_checkheaders(data, STRCONST("Alt-Used"))) {
         altused = aprintf("Alt-Used: %s:%d\r\n",
                           conn->conn_to_host.name, conn->conn_to_port);
         if(!altused) {
    @@ -3194,8 +3199,10 @@ CURLcode Curl_http(struct Curl_easy *data, bool *done)
     #ifndef CURL_DISABLE_PROXY
                       (conn->bits.httpproxy &&
                        !conn->bits.tunnel_proxy &&
    -                   !Curl_checkheaders(data, "Proxy-Connection") &&
    -                   !Curl_checkProxyheaders(data, conn, "Proxy-Connection"))?
    +                   !Curl_checkheaders(data, STRCONST("Proxy-Connection")) &&
    +                   !Curl_checkProxyheaders(data,
    +                                           conn,
    +                                           STRCONST("Proxy-Connection")))?
                       "Proxy-Connection: Keep-Alive\r\n":"",
     #else
                       "",
    @@ -3308,20 +3315,6 @@ checkhttpprefix(struct Curl_easy *data,
       struct curl_slist *head = data->set.http200aliases;
       statusline rc = STATUS_BAD;
       statusline onmatch = len >= 5? STATUS_DONE : STATUS_UNKNOWN;
    -#ifdef CURL_DOES_CONVERSIONS
    -  /* convert from the network encoding using a scratch area */
    -  char *scratch = strdup(s);
    -  if(!scratch) {
    -    failf(data, "Failed to allocate memory for conversion!");
    -    return FALSE; /* can't return CURLE_OUT_OF_MEMORY so return FALSE */
    -  }
    -  if(CURLE_OK != Curl_convert_from_network(data, scratch, strlen(s) + 1)) {
    -    /* Curl_convert_from_network calls failf if unsuccessful */
    -    free(scratch);
    -    return FALSE; /* can't return CURLE_foobar so return FALSE */
    -  }
    -  s = scratch;
    -#endif /* CURL_DOES_CONVERSIONS */
     
       while(head) {
         if(checkprefixmax(head->data, s, len)) {
    @@ -3334,9 +3327,6 @@ checkhttpprefix(struct Curl_easy *data,
       if((rc != STATUS_DONE) && (checkprefixmax("HTTP/", s, len)))
         rc = onmatch;
     
    -#ifdef CURL_DOES_CONVERSIONS
    -  free(scratch);
    -#endif /* CURL_DOES_CONVERSIONS */
       return rc;
     }
     
    @@ -3347,26 +3337,9 @@ checkrtspprefix(struct Curl_easy *data,
     {
       statusline result = STATUS_BAD;
       statusline onmatch = len >= 5? STATUS_DONE : STATUS_UNKNOWN;
    -
    -#ifdef CURL_DOES_CONVERSIONS
    -  /* convert from the network encoding using a scratch area */
    -  char *scratch = strdup(s);
    -  if(!scratch) {
    -    failf(data, "Failed to allocate memory for conversion!");
    -    return FALSE; /* can't return CURLE_OUT_OF_MEMORY so return FALSE */
    -  }
    -  if(CURLE_OK != Curl_convert_from_network(data, scratch, strlen(s) + 1)) {
    -    /* Curl_convert_from_network calls failf if unsuccessful */
    -    result = FALSE; /* can't return CURLE_foobar so return FALSE */
    -  }
    -  else if(checkprefixmax("RTSP/", scratch, len))
    -    result = onmatch;
    -  free(scratch);
    -#else
       (void)data; /* unused */
       if(checkprefixmax("RTSP/", s, len))
         result = onmatch;
    -#endif /* CURL_DOES_CONVERSIONS */
     
       return result;
     }
    @@ -3436,7 +3409,9 @@ CURLcode Curl_http_header(struct Curl_easy *data, struct connectdata *conn,
     #ifndef CURL_DISABLE_PROXY
       else if((conn->httpversion == 10) &&
               conn->bits.httpproxy &&
    -          Curl_compareheader(headp, "Proxy-Connection:", "keep-alive")) {
    +          Curl_compareheader(headp,
    +                             STRCONST("Proxy-Connection:"),
    +                             STRCONST("keep-alive"))) {
         /*
          * When a HTTP/1.0 reply comes when using a proxy, the
          * 'Proxy-Connection: keep-alive' line tells us the
    @@ -3448,7 +3423,9 @@ CURLcode Curl_http_header(struct Curl_easy *data, struct connectdata *conn,
       }
       else if((conn->httpversion == 11) &&
               conn->bits.httpproxy &&
    -          Curl_compareheader(headp, "Proxy-Connection:", "close")) {
    +          Curl_compareheader(headp,
    +                             STRCONST("Proxy-Connection:"),
    +                             STRCONST("close"))) {
         /*
          * We get a HTTP/1.1 response from a proxy and it says it'll
          * close down after this transfer.
    @@ -3458,7 +3435,9 @@ CURLcode Curl_http_header(struct Curl_easy *data, struct connectdata *conn,
       }
     #endif
       else if((conn->httpversion == 10) &&
    -          Curl_compareheader(headp, "Connection:", "keep-alive")) {
    +          Curl_compareheader(headp,
    +                             STRCONST("Connection:"),
    +                             STRCONST("keep-alive"))) {
         /*
          * A HTTP/1.0 reply with the 'Connection: keep-alive' line
          * tells us the connection will be kept alive for our
    @@ -3468,7 +3447,8 @@ CURLcode Curl_http_header(struct Curl_easy *data, struct connectdata *conn,
         connkeep(conn, "Connection keep-alive");
         infof(data, "HTTP/1.0 connection set to keep alive!");
       }
    -  else if(Curl_compareheader(headp, "Connection:", "close")) {
    +  else if(Curl_compareheader(headp,
    +                             STRCONST("Connection:"), STRCONST("close"))) {
         /*
          * [RFC 2616, section 8.1.2.1]
          * "Connection: close" is HTTP/1.1 language and means that
    @@ -3903,21 +3883,10 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
           size_t headerlen;
           /* Zero-length header line means end of headers! */
     
    -#ifdef CURL_DOES_CONVERSIONS
    -      if(0x0d == *headp) {
    -        *headp = '\r'; /* replace with CR in host encoding */
    -        headp++;       /* pass the CR byte */
    -      }
    -      if(0x0a == *headp) {
    -        *headp = '\n'; /* replace with LF in host encoding */
    -        headp++;       /* pass the LF byte */
    -      }
    -#else
           if('\r' == *headp)
             headp++; /* pass the \r byte */
           if('\n' == *headp)
             headp++; /* pass the \n byte */
    -#endif /* CURL_DOES_CONVERSIONS */
     
           if(100 <= k->httpcode && 199 >= k->httpcode) {
             /* "A user agent MAY ignore unexpected 1xx status responses." */
    @@ -4189,30 +4158,11 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
           int httpversion_major;
           int rtspversion_major;
           int nc = 0;
    -#ifdef CURL_DOES_CONVERSIONS
    -#define HEADER1 scratch
    -#define SCRATCHSIZE 21
    -      CURLcode res;
    -      char scratch[SCRATCHSIZE + 1]; /* "HTTP/major.minor 123" */
    -      /* We can't really convert this yet because we don't know if it's the
    -         1st header line or the body.  So we do a partial conversion into a
    -         scratch area, leaving the data at 'headp' as-is.
    -      */
    -      strncpy(&scratch[0], headp, SCRATCHSIZE);
    -      scratch[SCRATCHSIZE] = 0; /* null terminate */
    -      res = Curl_convert_from_network(data,
    -                                      &scratch[0],
    -                                      SCRATCHSIZE);
    -      if(res)
    -        /* Curl_convert_from_network calls failf if unsuccessful */
    -        return res;
    -#else
     #define HEADER1 headp /* no conversion needed, just use headp */
    -#endif /* CURL_DOES_CONVERSIONS */
     
           if(conn->handler->protocol & PROTO_FAMILY_HTTP) {
             /*
    -         * https://tools.ietf.org/html/rfc7230#section-3.1.2
    +         * https://datatracker.ietf.org/doc/html/rfc7230#section-3.1.2
              *
              * The response code is always a three-digit number in HTTP as the spec
              * says. We allow any three-digit number here, but we cannot make
    @@ -4333,11 +4283,6 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
           }
         }
     
    -    result = Curl_convert_from_network(data, headp, strlen(headp));
    -    /* Curl_convert_from_network calls failf if unsuccessful */
    -    if(result)
    -      return result;
    -
         result = Curl_http_header(data, conn, headp);
         if(result)
           return result;
    diff --git a/vendor/curl/lib/http.h b/vendor/curl/lib/http.h
    index b4aaba2a26..07e963dc48 100644
    --- a/vendor/curl/lib/http.h
    +++ b/vendor/curl/lib/http.h
    @@ -7,7 +7,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2021, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -47,13 +47,16 @@ extern const struct Curl_handler Curl_handler_https;
     /* Header specific functions */
     bool Curl_compareheader(const char *headerline,  /* line to check */
                             const char *header,   /* header keyword _with_ colon */
    -                        const char *content); /* content string to find */
    +                        const size_t hlen,   /* len of the keyword in bytes */
    +                        const char *content, /* content string to find */
    +                        const size_t clen);   /* len of the content in bytes */
     
     char *Curl_copy_header_value(const char *header);
     
     char *Curl_checkProxyheaders(struct Curl_easy *data,
                                  const struct connectdata *conn,
    -                             const char *thisheader);
    +                             const char *thisheader,
    +                             const size_t thislen);
     CURLcode Curl_buffer_send(struct dynbuf *in,
                               struct Curl_easy *data,
                               curl_off_t *bytes_written,
    diff --git a/vendor/curl/lib/http2.c b/vendor/curl/lib/http2.c
    index e74400a4ca..1254365847 100644
    --- a/vendor/curl/lib/http2.c
    +++ b/vendor/curl/lib/http2.c
    @@ -5,7 +5,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2021, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -36,7 +36,9 @@
     #include "connect.h"
     #include "strtoofft.h"
     #include "strdup.h"
    +#include "transfer.h"
     #include "dynbuf.h"
    +#include "h2h3.h"
     /* The last 3 #include files should be in this order */
     #include "curl_printf.h"
     #include "curl_memory.h"
    @@ -64,7 +66,6 @@
     #define H2BUGF(x) do { } while(0)
     #endif
     
    -
     static ssize_t http2_recv(struct Curl_easy *data, int sockindex,
                               char *mem, size_t len, CURLcode *err);
     static bool http2_connisdead(struct Curl_easy *data,
    @@ -200,9 +201,9 @@ static bool http2_connisdead(struct Curl_easy *data, struct connectdata *conn)
             nread = ((Curl_recv *)httpc->recv_underlying)(
               data, FIRSTSOCKET, httpc->inbuf, H2_BUFSIZE, &result);
           if(nread != -1) {
    -        infof(data,
    -              "%d bytes stray data read before trying h2 connection",
    -              (int)nread);
    +        H2BUGF(infof(data,
    +                     "%d bytes stray data read before trying h2 connection",
    +                     (int)nread));
             httpc->nread_inbuf = 0;
             httpc->inbuflen = nread;
             if(h2_process_pending_input(data, httpc, &result) < 0)
    @@ -513,7 +514,7 @@ static int set_transfer_url(struct Curl_easy *data,
       if(!u)
         return 5;
     
    -  v = curl_pushheader_byname(hp, ":scheme");
    +  v = curl_pushheader_byname(hp, H2H3_PSEUDO_SCHEME);
       if(v) {
         uc = curl_url_set(u, CURLUPART_SCHEME, v, 0);
         if(uc) {
    @@ -522,7 +523,7 @@ static int set_transfer_url(struct Curl_easy *data,
         }
       }
     
    -  v = curl_pushheader_byname(hp, ":authority");
    +  v = curl_pushheader_byname(hp, H2H3_PSEUDO_AUTHORITY);
       if(v) {
         uc = curl_url_set(u, CURLUPART_HOST, v, 0);
         if(uc) {
    @@ -531,7 +532,7 @@ static int set_transfer_url(struct Curl_easy *data,
         }
       }
     
    -  v = curl_pushheader_byname(hp, ":path");
    +  v = curl_pushheader_byname(hp, H2H3_PSEUDO_PATH);
       if(v) {
         uc = curl_url_set(u, CURLUPART_PATH, v, 0);
         if(uc) {
    @@ -757,7 +758,7 @@ static int on_frame_recv(nghttp2_session *session, const nghttp2_frame *frame,
           stream->status_code = -1;
         }
     
    -    result = Curl_dyn_add(&stream->header_recvbuf, "\r\n");
    +    result = Curl_dyn_addn(&stream->header_recvbuf, STRCONST("\r\n"));
         if(result)
           return NGHTTP2_ERR_CALLBACK_FAILURE;
     
    @@ -1009,7 +1010,7 @@ static int on_header(nghttp2_session *session, const nghttp2_frame *frame,
       if(frame->hd.type == NGHTTP2_PUSH_PROMISE) {
         char *h;
     
    -    if(!strcmp(":authority", (const char *)name)) {
    +    if(!strcmp(H2H3_PSEUDO_AUTHORITY, (const char *)name)) {
           /* pseudo headers are lower case */
           int rc = 0;
           char *check = aprintf("%s:%d", conn->host.name, conn->remote_port);
    @@ -1072,22 +1073,22 @@ static int on_header(nghttp2_session *session, const nghttp2_frame *frame,
         return 0;
       }
     
    -  if(namelen == sizeof(":status") - 1 &&
    -     memcmp(":status", name, namelen) == 0) {
    +  if(namelen == sizeof(H2H3_PSEUDO_STATUS) - 1 &&
    +     memcmp(H2H3_PSEUDO_STATUS, name, namelen) == 0) {
         /* nghttp2 guarantees :status is received first and only once, and
            value is 3 digits status code, and decode_status_code always
            succeeds. */
         stream->status_code = decode_status_code(value, valuelen);
         DEBUGASSERT(stream->status_code != -1);
     
    -    result = Curl_dyn_add(&stream->header_recvbuf, "HTTP/2 ");
    +    result = Curl_dyn_addn(&stream->header_recvbuf, STRCONST("HTTP/2 "));
         if(result)
           return NGHTTP2_ERR_CALLBACK_FAILURE;
         result = Curl_dyn_addn(&stream->header_recvbuf, value, valuelen);
         if(result)
           return NGHTTP2_ERR_CALLBACK_FAILURE;
         /* the space character after the status code is mandatory */
    -    result = Curl_dyn_add(&stream->header_recvbuf, " \r\n");
    +    result = Curl_dyn_addn(&stream->header_recvbuf, STRCONST(" \r\n"));
         if(result)
           return NGHTTP2_ERR_CALLBACK_FAILURE;
         /* if we receive data for another handle, wake that up */
    @@ -1105,13 +1106,13 @@ static int on_header(nghttp2_session *session, const nghttp2_frame *frame,
       result = Curl_dyn_addn(&stream->header_recvbuf, name, namelen);
       if(result)
         return NGHTTP2_ERR_CALLBACK_FAILURE;
    -  result = Curl_dyn_add(&stream->header_recvbuf, ": ");
    +  result = Curl_dyn_addn(&stream->header_recvbuf, STRCONST(": "));
       if(result)
         return NGHTTP2_ERR_CALLBACK_FAILURE;
       result = Curl_dyn_addn(&stream->header_recvbuf, value, valuelen);
       if(result)
         return NGHTTP2_ERR_CALLBACK_FAILURE;
    -  result = Curl_dyn_add(&stream->header_recvbuf, "\r\n");
    +  result = Curl_dyn_addn(&stream->header_recvbuf, STRCONST("\r\n"));
       if(result)
         return NGHTTP2_ERR_CALLBACK_FAILURE;
       /* if we receive data for another handle, wake that up */
    @@ -1235,7 +1236,7 @@ void Curl_http2_done(struct Curl_easy *data, bool premature)
           (void)nghttp2_session_send(httpc->h2);
     
         if(http->stream_id == httpc->pause_stream_id) {
    -      infof(data, "stopped the pause stream!");
    +      H2BUGF(infof(data, "stopped the pause stream!"));
           httpc->pause_stream_id = 0;
         }
       }
    @@ -1337,7 +1338,7 @@ CURLcode Curl_http2_request_upgrade(struct dynbuf *req,
       }
       conn->proto.httpc.binlen = binlen;
     
    -  result = Curl_base64url_encode(data, (const char *)binsettings, binlen,
    +  result = Curl_base64url_encode((const char *)binsettings, binlen,
                                      &base64, &blen);
       if(result) {
         Curl_dyn_free(req);
    @@ -1816,80 +1817,6 @@ static ssize_t http2_recv(struct Curl_easy *data, int sockindex,
       return -1;
     }
     
    -/* Index where :authority header field will appear in request header
    -   field list. */
    -#define AUTHORITY_DST_IDX 3
    -
    -/* USHRT_MAX is 65535 == 0xffff */
    -#define HEADER_OVERFLOW(x) \
    -  (x.namelen > 0xffff || x.valuelen > 0xffff - x.namelen)
    -
    -/*
    - * Check header memory for the token "trailers".
    - * Parse the tokens as separated by comma and surrounded by whitespace.
    - * Returns TRUE if found or FALSE if not.
    - */
    -static bool contains_trailers(const char *p, size_t len)
    -{
    -  const char *end = p + len;
    -  for(;;) {
    -    for(; p != end && (*p == ' ' || *p == '\t'); ++p)
    -      ;
    -    if(p == end || (size_t)(end - p) < sizeof("trailers") - 1)
    -      return FALSE;
    -    if(strncasecompare("trailers", p, sizeof("trailers") - 1)) {
    -      p += sizeof("trailers") - 1;
    -      for(; p != end && (*p == ' ' || *p == '\t'); ++p)
    -        ;
    -      if(p == end || *p == ',')
    -        return TRUE;
    -    }
    -    /* skip to next token */
    -    for(; p != end && *p != ','; ++p)
    -      ;
    -    if(p == end)
    -      return FALSE;
    -    ++p;
    -  }
    -}
    -
    -typedef enum {
    -  /* Send header to server */
    -  HEADERINST_FORWARD,
    -  /* Don't send header to server */
    -  HEADERINST_IGNORE,
    -  /* Discard header, and replace it with "te: trailers" */
    -  HEADERINST_TE_TRAILERS
    -} header_instruction;
    -
    -/* Decides how to treat given header field. */
    -static header_instruction inspect_header(const char *name, size_t namelen,
    -                                         const char *value, size_t valuelen) {
    -  switch(namelen) {
    -  case 2:
    -    if(!strncasecompare("te", name, namelen))
    -      return HEADERINST_FORWARD;
    -
    -    return contains_trailers(value, valuelen) ?
    -           HEADERINST_TE_TRAILERS : HEADERINST_IGNORE;
    -  case 7:
    -    return strncasecompare("upgrade", name, namelen) ?
    -           HEADERINST_IGNORE : HEADERINST_FORWARD;
    -  case 10:
    -    return (strncasecompare("connection", name, namelen) ||
    -            strncasecompare("keep-alive", name, namelen)) ?
    -           HEADERINST_IGNORE : HEADERINST_FORWARD;
    -  case 16:
    -    return strncasecompare("proxy-connection", name, namelen) ?
    -           HEADERINST_IGNORE : HEADERINST_FORWARD;
    -  case 17:
    -    return strncasecompare("transfer-encoding", name, namelen) ?
    -           HEADERINST_IGNORE : HEADERINST_FORWARD;
    -  default:
    -    return HEADERINST_FORWARD;
    -  }
    -}
    -
     static ssize_t http2_send(struct Curl_easy *data, int sockindex,
                               const void *mem, size_t len, CURLcode *err)
     {
    @@ -1904,14 +1831,12 @@ static ssize_t http2_send(struct Curl_easy *data, int sockindex,
       struct HTTP *stream = data->req.p.http;
       nghttp2_nv *nva = NULL;
       size_t nheader;
    -  size_t i;
    -  size_t authority_idx;
    -  char *hdbuf = (char *)mem;
    -  char *end, *line_end;
       nghttp2_data_provider data_prd;
       int32_t stream_id;
       nghttp2_session *h2 = httpc->h2;
       nghttp2_priority_spec pri_spec;
    +  CURLcode result;
    +  struct h2h3req *hreq;
     
       (void)sockindex;
     
    @@ -1977,174 +1902,29 @@ static ssize_t http2_send(struct Curl_easy *data, int sockindex,
         return len;
       }
     
    -  /* Calculate number of headers contained in [mem, mem + len) */
    -  /* Here, we assume the curl http code generate *correct* HTTP header
    -     field block */
    -  nheader = 0;
    -  for(i = 1; i < len; ++i) {
    -    if(hdbuf[i] == '\n' && hdbuf[i - 1] == '\r') {
    -      ++nheader;
    -      ++i;
    -    }
    +  result = Curl_pseudo_headers(data, mem, len, &hreq);
    +  if(result) {
    +    *err = result;
    +    return -1;
       }
    -  if(nheader < 2)
    -    goto fail;
    +  nheader = hreq->entries;
     
    -  /* We counted additional 2 \r\n in the first and last line. We need 3
    -     new headers: :method, :path and :scheme. Therefore we need one
    -     more space. */
    -  nheader += 1;
       nva = malloc(sizeof(nghttp2_nv) * nheader);
       if(!nva) {
    +    Curl_pseudo_free(hreq);
         *err = CURLE_OUT_OF_MEMORY;
         return -1;
       }
    -
    -  /* Extract :method, :path from request line
    -     We do line endings with CRLF so checking for CR is enough */
    -  line_end = memchr(hdbuf, '\r', len);
    -  if(!line_end)
    -    goto fail;
    -
    -  /* Method does not contain spaces */
    -  end = memchr(hdbuf, ' ', line_end - hdbuf);
    -  if(!end || end == hdbuf)
    -    goto fail;
    -  nva[0].name = (unsigned char *)":method";
    -  nva[0].namelen = strlen((char *)nva[0].name);
    -  nva[0].value = (unsigned char *)hdbuf;
    -  nva[0].valuelen = (size_t)(end - hdbuf);
    -  nva[0].flags = NGHTTP2_NV_FLAG_NONE;
    -  if(HEADER_OVERFLOW(nva[0])) {
    -    failf(data, "Failed sending HTTP request: Header overflow");
    -    goto fail;
    -  }
    -
    -  hdbuf = end + 1;
    -
    -  /* Path may contain spaces so scan backwards */
    -  end = NULL;
    -  for(i = (size_t)(line_end - hdbuf); i; --i) {
    -    if(hdbuf[i - 1] == ' ') {
    -      end = &hdbuf[i - 1];
    -      break;
    -    }
    -  }
    -  if(!end || end == hdbuf)
    -    goto fail;
    -  nva[1].name = (unsigned char *)":path";
    -  nva[1].namelen = strlen((char *)nva[1].name);
    -  nva[1].value = (unsigned char *)hdbuf;
    -  nva[1].valuelen = (size_t)(end - hdbuf);
    -  nva[1].flags = NGHTTP2_NV_FLAG_NONE;
    -  if(HEADER_OVERFLOW(nva[1])) {
    -    failf(data, "Failed sending HTTP request: Header overflow");
    -    goto fail;
    -  }
    -
    -  nva[2].name = (unsigned char *)":scheme";
    -  nva[2].namelen = strlen((char *)nva[2].name);
    -  if(conn->handler->flags & PROTOPT_SSL)
    -    nva[2].value = (unsigned char *)"https";
    -  else
    -    nva[2].value = (unsigned char *)"http";
    -  nva[2].valuelen = strlen((char *)nva[2].value);
    -  nva[2].flags = NGHTTP2_NV_FLAG_NONE;
    -  if(HEADER_OVERFLOW(nva[2])) {
    -    failf(data, "Failed sending HTTP request: Header overflow");
    -    goto fail;
    -  }
    -
    -  authority_idx = 0;
    -  i = 3;
    -  while(i < nheader) {
    -    size_t hlen;
    -
    -    hdbuf = line_end + 2;
    -
    -    /* check for next CR, but only within the piece of data left in the given
    -       buffer */
    -    line_end = memchr(hdbuf, '\r', len - (hdbuf - (char *)mem));
    -    if(!line_end || (line_end == hdbuf))
    -      goto fail;
    -
    -    /* header continuation lines are not supported */
    -    if(*hdbuf == ' ' || *hdbuf == '\t')
    -      goto fail;
    -
    -    for(end = hdbuf; end < line_end && *end != ':'; ++end)
    -      ;
    -    if(end == hdbuf || end == line_end)
    -      goto fail;
    -    hlen = end - hdbuf;
    -
    -    if(hlen == 4 && strncasecompare("host", hdbuf, 4)) {
    -      authority_idx = i;
    -      nva[i].name = (unsigned char *)":authority";
    -      nva[i].namelen = strlen((char *)nva[i].name);
    -    }
    -    else {
    -      nva[i].namelen = (size_t)(end - hdbuf);
    -      /* Lower case the header name for HTTP/2 */
    -      Curl_strntolower((char *)hdbuf, hdbuf, nva[i].namelen);
    -      nva[i].name = (unsigned char *)hdbuf;
    -    }
    -    hdbuf = end + 1;
    -    while(*hdbuf == ' ' || *hdbuf == '\t')
    -      ++hdbuf;
    -    end = line_end;
    -
    -    switch(inspect_header((const char *)nva[i].name, nva[i].namelen, hdbuf,
    -                          end - hdbuf)) {
    -    case HEADERINST_IGNORE:
    -      /* skip header fields prohibited by HTTP/2 specification. */
    -      --nheader;
    -      continue;
    -    case HEADERINST_TE_TRAILERS:
    -      nva[i].value = (uint8_t*)"trailers";
    -      nva[i].valuelen = sizeof("trailers") - 1;
    -      break;
    -    default:
    -      nva[i].value = (unsigned char *)hdbuf;
    -      nva[i].valuelen = (size_t)(end - hdbuf);
    -    }
    -
    -    nva[i].flags = NGHTTP2_NV_FLAG_NONE;
    -    if(HEADER_OVERFLOW(nva[i])) {
    -      failf(data, "Failed sending HTTP request: Header overflow");
    -      goto fail;
    -    }
    -    ++i;
    -  }
    -
    -  /* :authority must come before non-pseudo header fields */
    -  if(authority_idx && authority_idx != AUTHORITY_DST_IDX) {
    -    nghttp2_nv authority = nva[authority_idx];
    -    for(i = authority_idx; i > AUTHORITY_DST_IDX; --i) {
    -      nva[i] = nva[i - 1];
    -    }
    -    nva[i] = authority;
    -  }
    -
    -  /* Warn stream may be rejected if cumulative length of headers is too large.
    -     It appears nghttp2 will not send a header frame larger than 64KB. */
    -#define MAX_ACC 60000  /* <64KB to account for some overhead */
    -  {
    -    size_t acc = 0;
    -
    -    for(i = 0; i < nheader; ++i) {
    -      acc += nva[i].namelen + nva[i].valuelen;
    -
    -      H2BUGF(infof(data, "h2 header: %.*s:%.*s",
    -                   nva[i].namelen, nva[i].name,
    -                   nva[i].valuelen, nva[i].value));
    -    }
    -
    -    if(acc > MAX_ACC) {
    -      infof(data, "http2_send: Warning: The cumulative length of all "
    -            "headers exceeds %d bytes and that could cause the "
    -            "stream to be rejected.", MAX_ACC);
    +  else {
    +    unsigned int i;
    +    for(i = 0; i < nheader; i++) {
    +      nva[i].name = (unsigned char *)hreq->header[i].name;
    +      nva[i].namelen = hreq->header[i].namelen;
    +      nva[i].value = (unsigned char *)hreq->header[i].value;
    +      nva[i].valuelen = hreq->header[i].valuelen;
    +      nva[i].flags = NGHTTP2_NV_FLAG_NONE;
         }
    +    Curl_pseudo_free(hreq);
       }
     
       h2_pri_spec(data, &pri_spec);
    @@ -2213,11 +1993,6 @@ static ssize_t http2_send(struct Curl_easy *data, int sockindex,
       nghttp2_session_resume_data(h2, stream->stream_id);
     
       return len;
    -
    -fail:
    -  free(nva);
    -  *err = CURLE_SEND_ERROR;
    -  return -1;
     }
     
     CURLcode Curl_http2_setup(struct Curl_easy *data,
    @@ -2271,8 +2046,6 @@ CURLcode Curl_http2_setup(struct Curl_easy *data,
       httpc->pause_stream_id = 0;
       httpc->drain_total = 0;
     
    -  infof(data, "Connection state changed (HTTP/2 confirmed)");
    -
       return CURLE_OK;
     }
     
    diff --git a/vendor/curl/lib/http_aws_sigv4.c b/vendor/curl/lib/http_aws_sigv4.c
    index 751e5af5f9..210c3dbe56 100644
    --- a/vendor/curl/lib/http_aws_sigv4.c
    +++ b/vendor/curl/lib/http_aws_sigv4.c
    @@ -5,7 +5,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2021, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -87,7 +87,7 @@ CURLcode Curl_output_aws_sigv4(struct Curl_easy *data, bool proxy)
       struct tm tm;
       char timestamp[17];
       char date[9];
    -  const char *content_type = Curl_checkheaders(data, "Content-Type");
    +  const char *content_type = Curl_checkheaders(data, STRCONST("Content-Type"));
       char *canonical_headers = NULL;
       char *signed_headers = NULL;
       Curl_HttpReq httpreq;
    @@ -110,7 +110,7 @@ CURLcode Curl_output_aws_sigv4(struct Curl_easy *data, bool proxy)
       DEBUGASSERT(!proxy);
       (void)proxy;
     
    -  if(Curl_checkheaders(data, "Authorization")) {
    +  if(Curl_checkheaders(data, STRCONST("Authorization"))) {
         /* Authorization already present, Bailing out */
         return CURLE_OK;
       }
    diff --git a/vendor/curl/lib/http_chunks.c b/vendor/curl/lib/http_chunks.c
    index beb9695884..7edfd64724 100644
    --- a/vendor/curl/lib/http_chunks.c
    +++ b/vendor/curl/lib/http_chunks.c
    @@ -5,7 +5,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2021, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -29,7 +29,6 @@
     #include "dynbuf.h"
     #include "content_encoding.h"
     #include "http.h"
    -#include "non-ascii.h" /* for Curl_convert_to_network prototype */
     #include "strtoofft.h"
     #include "warnless.h"
     
    @@ -74,18 +73,7 @@
     
      */
     
    -#ifdef CURL_DOES_CONVERSIONS
    -/* Check for an ASCII hex digit.
    -   We avoid the use of ISXDIGIT to accommodate non-ASCII hosts. */
    -static bool isxdigit_ascii(char digit)
    -{
    -  return (digit >= 0x30 && digit <= 0x39) /* 0-9 */
    -    || (digit >= 0x41 && digit <= 0x46) /* A-F */
    -    || (digit >= 0x61 && digit <= 0x66); /* a-f */
    -}
    -#else
     #define isxdigit_ascii(x) Curl_isxdigit(x)
    -#endif
     
     void Curl_httpchunk_init(struct Curl_easy *data)
     {
    @@ -157,14 +145,6 @@ CHUNKcode Curl_httpchunk_read(struct Curl_easy *data,
             /* length and datap are unmodified */
             ch->hexbuffer[ch->hexindex] = 0;
     
    -        /* convert to host encoding before calling strtoul */
    -        result = Curl_convert_from_network(data, ch->hexbuffer, ch->hexindex);
    -        if(result) {
    -          /* Curl_convert_from_network calls failf if unsuccessful */
    -          /* Treat it as a bad hex character */
    -          return CHUNKE_ILLEGAL_HEX;
    -        }
    -
             if(curlx_strtoofft(ch->hexbuffer, &endptr, 16, &ch->datasize))
               return CHUNKE_ILLEGAL_HEX;
             ch->state = CHUNK_LF; /* now wait for the CRLF */
    @@ -234,19 +214,12 @@ CHUNKcode Curl_httpchunk_read(struct Curl_easy *data,
     
             if(tr) {
               size_t trlen;
    -          result = Curl_dyn_add(&conn->trailer, (char *)"\x0d\x0a");
    +          result = Curl_dyn_addn(&conn->trailer, (char *)STRCONST("\x0d\x0a"));
               if(result)
                 return CHUNKE_OUT_OF_MEMORY;
     
               tr = Curl_dyn_ptr(&conn->trailer);
               trlen = Curl_dyn_len(&conn->trailer);
    -          /* Convert to host encoding before calling Curl_client_write */
    -          result = Curl_convert_from_network(data, tr, trlen);
    -          if(result)
    -            /* Curl_convert_from_network calls failf if unsuccessful */
    -            /* Treat it as a bad chunk */
    -            return CHUNKE_BAD_CHUNK;
    -
               if(!data->set.http_te_skip) {
                 result = Curl_client_write(data, CLIENTWRITE_HEADER, tr, trlen);
                 if(result) {
    diff --git a/vendor/curl/lib/http_negotiate.c b/vendor/curl/lib/http_negotiate.c
    index 5f764dc136..888d3b24a2 100644
    --- a/vendor/curl/lib/http_negotiate.c
    +++ b/vendor/curl/lib/http_negotiate.c
    @@ -5,7 +5,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2021, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -161,7 +161,7 @@ CURLcode Curl_output_negotiate(struct Curl_easy *data,
             return result;
         }
     
    -    result = Curl_auth_create_spnego_message(data, neg_ctx, &base64, &len);
    +    result = Curl_auth_create_spnego_message(neg_ctx, &base64, &len);
         if(result)
           return result;
     
    diff --git a/vendor/curl/lib/http_ntlm.c b/vendor/curl/lib/http_ntlm.c
    index a6526db9f7..bb7e5360f9 100644
    --- a/vendor/curl/lib/http_ntlm.c
    +++ b/vendor/curl/lib/http_ntlm.c
    @@ -5,7 +5,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2021, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -213,8 +213,7 @@ CURLcode Curl_output_ntlm(struct Curl_easy *data, bool proxy)
                                                      ntlm, &ntlmmsg);
         if(!result) {
           DEBUGASSERT(Curl_bufref_len(&ntlmmsg) != 0);
    -      result = Curl_base64_encode(data,
    -                                  (const char *) Curl_bufref_ptr(&ntlmmsg),
    +      result = Curl_base64_encode((const char *) Curl_bufref_ptr(&ntlmmsg),
                                       Curl_bufref_len(&ntlmmsg), &base64, &len);
           if(!result) {
             free(*allocuserpwd);
    @@ -233,8 +232,7 @@ CURLcode Curl_output_ntlm(struct Curl_easy *data, bool proxy)
         result = Curl_auth_create_ntlm_type3_message(data, userp, passwdp,
                                                      ntlm, &ntlmmsg);
         if(!result && Curl_bufref_len(&ntlmmsg)) {
    -      result = Curl_base64_encode(data,
    -                                  (const char *) Curl_bufref_ptr(&ntlmmsg),
    +      result = Curl_base64_encode((const char *) Curl_bufref_ptr(&ntlmmsg),
                                       Curl_bufref_len(&ntlmmsg), &base64, &len);
           if(!result) {
             free(*allocuserpwd);
    diff --git a/vendor/curl/lib/http_proxy.c b/vendor/curl/lib/http_proxy.c
    index e13f485a73..5d5ffc0e1c 100644
    --- a/vendor/curl/lib/http_proxy.c
    +++ b/vendor/curl/lib/http_proxy.c
    @@ -5,7 +5,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2021, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -35,7 +35,6 @@
     #include "url.h"
     #include "select.h"
     #include "progress.h"
    -#include "non-ascii.h"
     #include "connect.h"
     #include "curlx.h"
     #include "vtls/vtls.h"
    @@ -245,7 +244,7 @@ static CURLcode CONNECT_host(struct Curl_easy *data,
       if(!hostheader)
         return CURLE_OUT_OF_MEMORY;
     
    -  if(!Curl_checkProxyheaders(data, conn, "Host")) {
    +  if(!Curl_checkProxyheaders(data, conn, STRCONST("Host"))) {
         host = aprintf("Host: %s\r\n", hostheader);
         if(!host) {
           free(hostheader);
    @@ -324,20 +323,23 @@ static CURLcode CONNECT(struct Curl_easy *data,
                             data->state.aptr.proxyuserpwd?
                             data->state.aptr.proxyuserpwd:"");
     
    -        if(!result && !Curl_checkProxyheaders(data, conn, "User-Agent") &&
    +        if(!result && !Curl_checkProxyheaders(data,
    +                                              conn, STRCONST("User-Agent")) &&
                data->set.str[STRING_USERAGENT])
               result = Curl_dyn_addf(req, "User-Agent: %s\r\n",
                                      data->set.str[STRING_USERAGENT]);
     
    -        if(!result && !Curl_checkProxyheaders(data, conn, "Proxy-Connection"))
    -          result = Curl_dyn_add(req, "Proxy-Connection: Keep-Alive\r\n");
    +        if(!result && !Curl_checkProxyheaders(data, conn,
    +                                              STRCONST("Proxy-Connection")))
    +          result = Curl_dyn_addn(req,
    +                                 STRCONST("Proxy-Connection: Keep-Alive\r\n"));
     
             if(!result)
               result = Curl_add_custom_headers(data, TRUE, req);
     
             if(!result)
               /* CRLF terminate the request */
    -          result = Curl_dyn_add(req, "\r\n");
    +          result = Curl_dyn_addn(req, STRCONST("\r\n"));
     
             if(!result) {
               /* Send the connect request to the proxy */
    @@ -481,12 +483,6 @@ static CURLcode CONNECT(struct Curl_easy *data,
             linep = Curl_dyn_ptr(&s->rcvbuf);
             perline = Curl_dyn_len(&s->rcvbuf); /* amount of bytes in this line */
     
    -        /* convert from the network encoding */
    -        result = Curl_convert_from_network(data, linep, perline);
    -        /* Curl_convert_from_network calls failf if unsuccessful */
    -        if(result)
    -          return result;
    -
             /* output debug if that is requested */
             Curl_debug(data, CURLINFO_HEADER_IN, linep, perline);
     
    @@ -596,7 +592,8 @@ static CURLcode CONNECT(struct Curl_easy *data,
                                       strlen("Content-Length:"), NULL, 10, &s->cl);
               }
             }
    -        else if(Curl_compareheader(linep, "Connection:", "close"))
    +        else if(Curl_compareheader(linep,
    +                                   STRCONST("Connection:"), STRCONST("close")))
               s->close_connection = TRUE;
             else if(checkprefix("Transfer-Encoding:", linep)) {
               if(k->httpcode/100 == 2) {
    @@ -607,14 +604,17 @@ static CURLcode CONNECT(struct Curl_easy *data,
                       "CONNECT %03d response", k->httpcode);
               }
               else if(Curl_compareheader(linep,
    -                                     "Transfer-Encoding:", "chunked")) {
    +                                     STRCONST("Transfer-Encoding:"),
    +                                     STRCONST("chunked"))) {
                 infof(data, "CONNECT responded chunked");
                 s->chunked_encoding = TRUE;
                 /* init our chunky engine */
                 Curl_httpchunk_init(data);
               }
             }
    -        else if(Curl_compareheader(linep, "Proxy-Connection:", "close"))
    +        else if(Curl_compareheader(linep,
    +                                   STRCONST("Proxy-Connection:"),
    +                                   STRCONST("close")))
               s->close_connection = TRUE;
             else if(2 == sscanf(linep, "HTTP/1.%d %d",
                                 &subversion,
    @@ -877,7 +877,7 @@ static CURLcode CONNECT(struct Curl_easy *data,
               goto error;
           }
     
    -      if(!Curl_checkProxyheaders(data, conn, "User-Agent") &&
    +      if(!Curl_checkProxyheaders(data, conn, STRCONST("User-Agent")) &&
              data->set.str[STRING_USERAGENT]) {
             struct dynbuf ua;
             Curl_dyn_init(&ua, DYN_HTTP_REQUEST);
    @@ -891,7 +891,7 @@ static CURLcode CONNECT(struct Curl_easy *data,
             Curl_dyn_free(&ua);
           }
     
    -      if(!Curl_checkProxyheaders(data, conn, "Proxy-Connection")) {
    +      if(!Curl_checkProxyheaders(data, conn, STRCONST("Proxy-Connection"))) {
             result = Curl_hyper_header(data, headers,
                                        "Proxy-Connection: Keep-Alive");
             if(result)
    diff --git a/vendor/curl/lib/if2ip.c b/vendor/curl/lib/if2ip.c
    index 132b3eeeea..1d34531932 100644
    --- a/vendor/curl/lib/if2ip.c
    +++ b/vendor/curl/lib/if2ip.c
    @@ -5,7 +5,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2021, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -60,12 +60,10 @@
     
     /* ------------------------------------------------------------------ */
     
    +#ifdef ENABLE_IPV6
     /* Return the scope of the given address. */
     unsigned int Curl_ipv6_scope(const struct sockaddr *sa)
     {
    -#ifndef ENABLE_IPV6
    -  (void) sa;
    -#else
       if(sa->sa_family == AF_INET6) {
         const struct sockaddr_in6 * sa6 = (const struct sockaddr_in6 *)(void *) sa;
         const unsigned char *b = sa6->sin6_addr.s6_addr;
    @@ -88,27 +86,25 @@ unsigned int Curl_ipv6_scope(const struct sockaddr *sa)
           break;
         }
       }
    -#endif
    -
       return IPV6_SCOPE_GLOBAL;
     }
    -
    +#endif
     
     #if defined(HAVE_GETIFADDRS)
     
    -if2ip_result_t Curl_if2ip(int af, unsigned int remote_scope,
    -                          unsigned int local_scope_id, const char *interf,
    +if2ip_result_t Curl_if2ip(int af,
    +#ifdef ENABLE_IPV6
    +                          unsigned int remote_scope,
    +                          unsigned int local_scope_id,
    +#endif
    +                          const char *interf,
                               char *buf, int buf_size)
     {
       struct ifaddrs *iface, *head;
       if2ip_result_t res = IF2IP_NOT_FOUND;
     
    -#ifndef ENABLE_IPV6
    -  (void) remote_scope;
    -#endif
    -
    -#if !defined(HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID) || \
    -    !defined(ENABLE_IPV6)
    +#if defined(ENABLE_IPV6) && \
    +    !defined(HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID)
       (void) local_scope_id;
     #endif
     
    @@ -181,8 +177,12 @@ if2ip_result_t Curl_if2ip(int af, unsigned int remote_scope,
     
     #elif defined(HAVE_IOCTL_SIOCGIFADDR)
     
    -if2ip_result_t Curl_if2ip(int af, unsigned int remote_scope,
    -                          unsigned int local_scope_id, const char *interf,
    +if2ip_result_t Curl_if2ip(int af,
    +#ifdef ENABLE_IPV6
    +                          unsigned int remote_scope,
    +                          unsigned int local_scope_id,
    +#endif
    +                          const char *interf,
                               char *buf, int buf_size)
     {
       struct ifreq req;
    @@ -192,8 +192,10 @@ if2ip_result_t Curl_if2ip(int af, unsigned int remote_scope,
       size_t len;
       const char *r;
     
    +#ifdef ENABLE_IPV6
       (void)remote_scope;
       (void)local_scope_id;
    +#endif
     
       if(!interf || (af != AF_INET))
         return IF2IP_NOT_FOUND;
    @@ -230,13 +232,19 @@ if2ip_result_t Curl_if2ip(int af, unsigned int remote_scope,
     
     #else
     
    -if2ip_result_t Curl_if2ip(int af, unsigned int remote_scope,
    -                          unsigned int local_scope_id, const char *interf,
    +if2ip_result_t Curl_if2ip(int af,
    +#ifdef ENABLE_IPV6
    +                          unsigned int remote_scope,
    +                          unsigned int local_scope_id,
    +#endif
    +                          const char *interf,
                               char *buf, int buf_size)
     {
         (void) af;
    +#ifdef ENABLE_IPV6
         (void) remote_scope;
         (void) local_scope_id;
    +#endif
         (void) interf;
         (void) buf;
         (void) buf_size;
    diff --git a/vendor/curl/lib/if2ip.h b/vendor/curl/lib/if2ip.h
    index e074e476dc..a360d4a0e4 100644
    --- a/vendor/curl/lib/if2ip.h
    +++ b/vendor/curl/lib/if2ip.h
    @@ -7,7 +7,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2020, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2020, 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -30,7 +30,11 @@
     #define IPV6_SCOPE_UNIQUELOCAL  3       /* Unique local */
     #define IPV6_SCOPE_NODELOCAL    4       /* Loopback. */
     
    +#ifdef ENABLE_IPV6
     unsigned int Curl_ipv6_scope(const struct sockaddr *sa);
    +#else
    +#define Curl_ipv6_scope(x) 0
    +#endif
     
     typedef enum {
       IF2IP_NOT_FOUND = 0, /* Interface not found */
    @@ -38,8 +42,12 @@ typedef enum {
       IF2IP_FOUND = 2 /* The address has been stored in "buf" */
     } if2ip_result_t;
     
    -if2ip_result_t Curl_if2ip(int af, unsigned int remote_scope,
    -                          unsigned int local_scope_id, const char *interf,
    +if2ip_result_t Curl_if2ip(int af,
    +#ifdef ENABLE_IPV6
    +                          unsigned int remote_scope,
    +                          unsigned int local_scope_id,
    +#endif
    +                          const char *interf,
                               char *buf, int buf_size);
     
     #ifdef __INTERIX
    diff --git a/vendor/curl/lib/imap.c b/vendor/curl/lib/imap.c
    index 958ad1456c..fb5a114d1d 100644
    --- a/vendor/curl/lib/imap.c
    +++ b/vendor/curl/lib/imap.c
    @@ -5,7 +5,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2021, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -507,7 +507,7 @@ static CURLcode imap_perform_login(struct Curl_easy *data,
     
       /* Check we have a username and password to authenticate with and end the
          connect phase if we don't */
    -  if(!conn->bits.user_passwd) {
    +  if(!data->state.aptr.user) {
         state(data, IMAP_STOP);
     
         return result;
    @@ -608,7 +608,7 @@ static CURLcode imap_perform_authentication(struct Curl_easy *data,
       /* Check if already authenticated OR if there is enough data to authenticate
          with and end the connect phase if we don't */
       if(imapc->preauth ||
    -     !Curl_sasl_can_authenticate(&imapc->sasl, conn)) {
    +     !Curl_sasl_can_authenticate(&imapc->sasl, data)) {
         state(data, IMAP_STOP);
         return result;
       }
    @@ -777,7 +777,7 @@ static CURLcode imap_perform_append(struct Curl_easy *data)
                                            NULL, MIMESTRATEGY_MAIL);
     
         if(!result)
    -      if(!Curl_checkheaders(data, "Mime-Version"))
    +      if(!Curl_checkheaders(data, STRCONST("Mime-Version")))
             result = Curl_mime_add_header(&data->set.mimepost.curlheaders,
                                           "Mime-Version: 1.0");
     
    @@ -1986,7 +1986,7 @@ static CURLcode imap_parse_url_path(struct Curl_easy *data)
         if(end > begin && end[-1] == '/')
           end--;
     
    -    result = Curl_urldecode(data, begin, end - begin, &imap->mailbox, NULL,
    +    result = Curl_urldecode(begin, end - begin, &imap->mailbox, NULL,
                                 REJECT_CTRL);
         if(result)
           return result;
    @@ -2009,7 +2009,7 @@ static CURLcode imap_parse_url_path(struct Curl_easy *data)
           return CURLE_URL_MALFORMAT;
     
         /* Decode the name parameter */
    -    result = Curl_urldecode(data, begin, ptr - begin, &name, NULL,
    +    result = Curl_urldecode(begin, ptr - begin, &name, NULL,
                                 REJECT_CTRL);
         if(result)
           return result;
    @@ -2020,7 +2020,7 @@ static CURLcode imap_parse_url_path(struct Curl_easy *data)
           ptr++;
     
         /* Decode the value parameter */
    -    result = Curl_urldecode(data, begin, ptr - begin, &value, &valuelen,
    +    result = Curl_urldecode(begin, ptr - begin, &value, &valuelen,
                                 REJECT_CTRL);
         if(result) {
           free(name);
    @@ -2108,7 +2108,7 @@ static CURLcode imap_parse_custom_request(struct Curl_easy *data)
     
       if(custom) {
         /* URL decode the custom request */
    -    result = Curl_urldecode(data, custom, 0, &imap->custom, NULL, REJECT_CTRL);
    +    result = Curl_urldecode(custom, 0, &imap->custom, NULL, REJECT_CTRL);
     
         /* Extract the parameters if specified */
         if(!result) {
    diff --git a/vendor/curl/lib/krb5.c b/vendor/curl/lib/krb5.c
    index 5edd34cbdf..787137c192 100644
    --- a/vendor/curl/lib/krb5.c
    +++ b/vendor/curl/lib/krb5.c
    @@ -2,7 +2,7 @@
      *
      * Copyright (c) 1995, 1996, 1997, 1998, 1999 Kungliga Tekniska Högskolan
      * (Royal Institute of Technology, Stockholm, Sweden).
    - * Copyright (c) 2004 - 2021 Daniel Stenberg
    + * Copyright (c) 2004 - 2022 Daniel Stenberg
      * All rights reserved.
      *
      * Redistribution and use in source and binary forms, with or without
    @@ -47,7 +47,6 @@
     #include "sendf.h"
     #include "curl_krb5.h"
     #include "warnless.h"
    -#include "non-ascii.h"
     #include "strcase.h"
     #include "strdup.h"
     
    @@ -81,11 +80,6 @@ static CURLcode ftpsend(struct Curl_easy *data, struct connectdata *conn,
       write_len += 2;
       bytes_written = 0;
     
    -  result = Curl_convert_to_network(data, s, write_len);
    -  /* Curl_convert_to_network calls failf if unsuccessful */
    -  if(result)
    -    return result;
    -
       for(;;) {
     #ifdef HAVE_GSSAPI
         conn->data_prot = PROT_CMD;
    @@ -298,7 +292,7 @@ krb5_auth(void *app_data, struct Curl_easy *data, struct connectdata *conn)
           if(output_buffer.length) {
             char *cmd;
     
    -        result = Curl_base64_encode(data, (char *)output_buffer.value,
    +        result = Curl_base64_encode((char *)output_buffer.value,
                                         output_buffer.length, &p, &base64_sz);
             if(result) {
               infof(data, "base64-encoding: %s", curl_easy_strerror(result));
    @@ -612,7 +606,7 @@ static void do_sec_send(struct Curl_easy *data, struct connectdata *conn,
         return; /* error */
     
       if(iscmd) {
    -    error = Curl_base64_encode(data, buffer, curlx_sitouz(bytes),
    +    error = Curl_base64_encode(buffer, curlx_sitouz(bytes),
                                    &cmd_buffer, &cmd_size);
         if(error) {
           free(buffer);
    diff --git a/vendor/curl/lib/ldap.c b/vendor/curl/lib/ldap.c
    index 3154db5cf0..52eac0d558 100644
    --- a/vendor/curl/lib/ldap.c
    +++ b/vendor/curl/lib/ldap.c
    @@ -5,7 +5,7 @@
      *                | (__| |_| |  _ <| |___
      *                 \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2021, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -306,8 +306,8 @@ static CURLcode ldap_do(struct Curl_easy *data, bool *done)
       rc = _ldap_url_parse(data, conn, &ludp);
     #endif
       if(rc) {
    -    failf(data, "LDAP local: %s", ldap_err2string(rc));
    -    result = CURLE_LDAP_INVALID_URL;
    +    failf(data, "Bad LDAP URL: %s", ldap_err2string(rc));
    +    result = CURLE_URL_MALFORMAT;
         goto quit;
       }
     
    @@ -328,7 +328,7 @@ static CURLcode ldap_do(struct Curl_easy *data, bool *done)
       host = conn->host.name;
     #endif
     
    -  if(conn->bits.user_passwd) {
    +  if(data->state.aptr.user) {
         user = conn->user;
         passwd = conn->passwd;
       }
    @@ -636,11 +636,8 @@ static CURLcode ldap_do(struct Curl_easy *data, bool *done)
               if((attr_len > 7) &&
                  (strcmp(";binary", (char *) attr + (attr_len - 7)) == 0)) {
                 /* Binary attribute, encode to base64. */
    -            result = Curl_base64_encode(data,
    -                                        vals[i]->bv_val,
    -                                        vals[i]->bv_len,
    -                                        &val_b64,
    -                                        &val_b64_sz);
    +            result = Curl_base64_encode(vals[i]->bv_val, vals[i]->bv_len,
    +                                        &val_b64, &val_b64_sz);
                 if(result) {
                   ldap_value_free_len(vals);
                   FREE_ON_WINLDAP(attr);
    @@ -870,7 +867,7 @@ static int _ldap_url_parse2(struct Curl_easy *data,
         LDAP_TRACE(("DN '%s'\n", dn));
     
         /* Unescape the DN */
    -    result = Curl_urldecode(data, dn, 0, &unescaped, NULL, REJECT_ZERO);
    +    result = Curl_urldecode(dn, 0, &unescaped, NULL, REJECT_ZERO);
         if(result) {
           rc = LDAP_NO_MEMORY;
     
    @@ -935,7 +932,7 @@ static int _ldap_url_parse2(struct Curl_easy *data,
           LDAP_TRACE(("attr[%zu] '%s'\n", i, attributes[i]));
     
           /* Unescape the attribute */
    -      result = Curl_urldecode(data, attributes[i], 0, &unescaped, NULL,
    +      result = Curl_urldecode(attributes[i], 0, &unescaped, NULL,
                                   REJECT_ZERO);
           if(result) {
             free(attributes);
    @@ -1005,7 +1002,7 @@ static int _ldap_url_parse2(struct Curl_easy *data,
         LDAP_TRACE(("filter '%s'\n", filter));
     
         /* Unescape the filter */
    -    result = Curl_urldecode(data, filter, 0, &unescaped, NULL, REJECT_ZERO);
    +    result = Curl_urldecode(filter, 0, &unescaped, NULL, REJECT_ZERO);
         if(result) {
           rc = LDAP_NO_MEMORY;
     
    diff --git a/vendor/curl/lib/md5.c b/vendor/curl/lib/md5.c
    index c6923e036b..d2ca240fcd 100644
    --- a/vendor/curl/lib/md5.c
    +++ b/vendor/curl/lib/md5.c
    @@ -5,7 +5,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2021, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -60,22 +60,22 @@
     /* The last #include file should be: */
     #include "memdebug.h"
     
    -typedef struct md5_ctx MD5_CTX;
    +typedef struct md5_ctx my_md5_ctx;
     
    -static CURLcode MD5_Init(MD5_CTX *ctx)
    +static CURLcode my_md5_init(my_md5_ctx *ctx)
     {
       md5_init(ctx);
       return CURLE_OK;
     }
     
    -static void MD5_Update(MD5_CTX *ctx,
    -                       const unsigned char *input,
    -                       unsigned int inputLen)
    +static void my_md5_update(my_md5_ctx *ctx,
    +                          const unsigned char *input,
    +                          unsigned int inputLen)
     {
       md5_update(ctx, inputLen, input);
     }
     
    -static void MD5_Final(unsigned char *digest, MD5_CTX *ctx)
    +static void my_md5_final(unsigned char *digest, my_md5_ctx *ctx)
     {
       md5_digest(ctx, 16, digest);
     }
    @@ -83,11 +83,38 @@ static void MD5_Final(unsigned char *digest, MD5_CTX *ctx)
     #elif defined(USE_OPENSSL_MD5) || defined(USE_WOLFSSL_MD5)
     
     /* When OpenSSL or wolfSSL is available, we use their MD5 functions. */
    +#if defined(USE_OPENSSL_MD5)
     #include 
    +#elif defined(USE_WOLFSSL_MD5)
    +#include 
    +#endif
    +
     #include "curl_memory.h"
     /* The last #include file should be: */
     #include "memdebug.h"
     
    +typedef MD5_CTX my_md5_ctx;
    +
    +static CURLcode my_md5_init(my_md5_ctx *ctx)
    +{
    +  if(!MD5_Init(ctx))
    +    return CURLE_OUT_OF_MEMORY;
    +
    +  return CURLE_OK;
    +}
    +
    +static void my_md5_update(my_md5_ctx *ctx,
    +                          const unsigned char *input,
    +                          unsigned int len)
    +{
    +  (void)MD5_Update(ctx, input, len);
    +}
    +
    +static void my_md5_final(unsigned char *digest, my_md5_ctx *ctx)
    +{
    +  (void)MD5_Final(digest, ctx);
    +}
    +
     #elif defined(USE_MBEDTLS)
     
     #include 
    @@ -97,21 +124,25 @@ static void MD5_Final(unsigned char *digest, MD5_CTX *ctx)
     /* The last #include file should be: */
     #include "memdebug.h"
     
    -typedef mbedtls_md5_context MD5_CTX;
    +typedef mbedtls_md5_context my_md5_ctx;
     
    -static CURLcode MD5_Init(MD5_CTX *ctx)
    +static CURLcode my_md5_init(my_md5_ctx *ctx)
     {
    -#if !defined(HAS_MBEDTLS_RESULT_CODE_BASED_FUNCTIONS)
    -  (void) mbedtls_md5_starts(ctx);
    +#if (MBEDTLS_VERSION_NUMBER >= 0x03000000)
    +  if(mbedtls_md5_starts(ctx))
    +    return CURLE_OUT_OF_MEMORY;
    +#elif defined(HAS_MBEDTLS_RESULT_CODE_BASED_FUNCTIONS)
    +  if(mbedtls_md5_starts_ret(ctx))
    +    return CURLE_OUT_OF_MEMORY;
     #else
    -  (void) mbedtls_md5_starts_ret(ctx);
    +  (void)mbedtls_md5_starts(ctx);
     #endif
       return CURLE_OK;
     }
     
    -static void MD5_Update(MD5_CTX *ctx,
    -                       const unsigned char *data,
    -                       unsigned int length)
    +static void my_md5_update(my_md5_ctx *ctx,
    +                          const unsigned char *data,
    +                          unsigned int length)
     {
     #if !defined(HAS_MBEDTLS_RESULT_CODE_BASED_FUNCTIONS)
       (void) mbedtls_md5_update(ctx, data, length);
    @@ -120,7 +151,7 @@ static void MD5_Update(MD5_CTX *ctx,
     #endif
     }
     
    -static void MD5_Final(unsigned char *digest, MD5_CTX *ctx)
    +static void my_md5_final(unsigned char *digest, my_md5_ctx *ctx)
     {
     #if !defined(HAS_MBEDTLS_RESULT_CODE_BASED_FUNCTIONS)
       (void) mbedtls_md5_finish(ctx, digest);
    @@ -143,25 +174,27 @@ static void MD5_Final(unsigned char *digest, MD5_CTX *ctx)
        Declaring the functions as static like this seems to be a bit more
        reliable than defining COMMON_DIGEST_FOR_OPENSSL on older cats. */
     #  include 
    -#  define MD5_CTX CC_MD5_CTX
    +#  define my_md5_ctx CC_MD5_CTX
     #include "curl_memory.h"
     /* The last #include file should be: */
     #include "memdebug.h"
     
    -static CURLcode MD5_Init(MD5_CTX *ctx)
    +static CURLcode my_md5_init(my_md5_ctx *ctx)
     {
    -  CC_MD5_Init(ctx);
    +  if(!CC_MD5_Init(ctx))
    +    return CURLE_OUT_OF_MEMORY;
    +
       return CURLE_OK;
     }
     
    -static void MD5_Update(MD5_CTX *ctx,
    -                       const unsigned char *input,
    -                       unsigned int inputLen)
    +static void my_md5_update(my_md5_ctx *ctx,
    +                          const unsigned char *input,
    +                          unsigned int inputLen)
     {
       CC_MD5_Update(ctx, input, inputLen);
     }
     
    -static void MD5_Final(unsigned char *digest, MD5_CTX *ctx)
    +static void my_md5_final(unsigned char *digest, my_md5_ctx *ctx)
     {
       CC_MD5_Final(digest, ctx);
     }
    @@ -177,25 +210,30 @@ struct md5_ctx {
       HCRYPTPROV hCryptProv;
       HCRYPTHASH hHash;
     };
    -typedef struct md5_ctx MD5_CTX;
    +typedef struct md5_ctx my_md5_ctx;
     
    -static CURLcode MD5_Init(MD5_CTX *ctx)
    +static CURLcode my_md5_init(my_md5_ctx *ctx)
     {
    -  if(CryptAcquireContext(&ctx->hCryptProv, NULL, NULL, PROV_RSA_FULL,
    -                         CRYPT_VERIFYCONTEXT | CRYPT_SILENT)) {
    -    CryptCreateHash(ctx->hCryptProv, CALG_MD5, 0, 0, &ctx->hHash);
    +  if(!CryptAcquireContext(&ctx->hCryptProv, NULL, NULL, PROV_RSA_FULL,
    +                          CRYPT_VERIFYCONTEXT | CRYPT_SILENT))
    +    return CURLE_OUT_OF_MEMORY;
    +
    +  if(!CryptCreateHash(ctx->hCryptProv, CALG_MD5, 0, 0, &ctx->hHash)) {
    +    CryptReleaseContext(ctx->hCryptProv, 0);
    +    return CURLE_OUT_OF_MEMORY;
       }
    +
       return CURLE_OK;
     }
     
    -static void MD5_Update(MD5_CTX *ctx,
    -                       const unsigned char *input,
    -                       unsigned int inputLen)
    +static void my_md5_update(my_md5_ctx *ctx,
    +                          const unsigned char *input,
    +                          unsigned int inputLen)
     {
       CryptHashData(ctx->hHash, (unsigned char *)input, inputLen, 0);
     }
     
    -static void MD5_Final(unsigned char *digest, MD5_CTX *ctx)
    +static void my_md5_final(unsigned char *digest, my_md5_ctx *ctx)
     {
       unsigned long length = 0;
       CryptGetHashParam(ctx->hHash, HP_HASHVAL, NULL, &length, 0);
    @@ -263,11 +301,12 @@ struct md5_ctx {
       unsigned char buffer[64];
       MD5_u32plus block[16];
     };
    -typedef struct md5_ctx MD5_CTX;
    +typedef struct md5_ctx my_md5_ctx;
     
    -static CURLcode MD5_Init(MD5_CTX *ctx);
    -static void MD5_Update(MD5_CTX *ctx, const void *data, unsigned long size);
    -static void MD5_Final(unsigned char *result, MD5_CTX *ctx);
    +static CURLcode my_md5_init(my_md5_ctx *ctx);
    +static void my_md5_update(my_md5_ctx *ctx, const void *data,
    +                          unsigned long size);
    +static void my_md5_final(unsigned char *result, my_md5_ctx *ctx);
     
     /*
      * The basic MD5 functions.
    @@ -318,7 +357,7 @@ static void MD5_Final(unsigned char *result, MD5_CTX *ctx);
      * This processes one or more 64-byte data blocks, but does NOT update
      * the bit counters.  There are no alignment requirements.
      */
    -static const void *body(MD5_CTX *ctx, const void *data, unsigned long size)
    +static const void *body(my_md5_ctx *ctx, const void *data, unsigned long size)
     {
       const unsigned char *ptr;
       MD5_u32plus a, b, c, d;
    @@ -426,7 +465,7 @@ static const void *body(MD5_CTX *ctx, const void *data, unsigned long size)
       return ptr;
     }
     
    -static CURLcode MD5_Init(MD5_CTX *ctx)
    +static CURLcode my_md5_init(my_md5_ctx *ctx)
     {
       ctx->a = 0x67452301;
       ctx->b = 0xefcdab89;
    @@ -439,7 +478,8 @@ static CURLcode MD5_Init(MD5_CTX *ctx)
       return CURLE_OK;
     }
     
    -static void MD5_Update(MD5_CTX *ctx, const void *data, unsigned long size)
    +static void my_md5_update(my_md5_ctx *ctx, const void *data,
    +                          unsigned long size)
     {
       MD5_u32plus saved_lo;
       unsigned long used;
    @@ -474,7 +514,7 @@ static void MD5_Update(MD5_CTX *ctx, const void *data, unsigned long size)
       memcpy(ctx->buffer, data, size);
     }
     
    -static void MD5_Final(unsigned char *result, MD5_CTX *ctx)
    +static void my_md5_final(unsigned char *result, my_md5_ctx *ctx)
     {
       unsigned long used, available;
     
    @@ -530,13 +570,13 @@ static void MD5_Final(unsigned char *result, MD5_CTX *ctx)
     const struct HMAC_params Curl_HMAC_MD5[] = {
       {
         /* Hash initialization function. */
    -    CURLX_FUNCTION_CAST(HMAC_hinit_func, MD5_Init),
    +    CURLX_FUNCTION_CAST(HMAC_hinit_func, my_md5_init),
         /* Hash update function. */
    -    CURLX_FUNCTION_CAST(HMAC_hupdate_func, MD5_Update),
    +    CURLX_FUNCTION_CAST(HMAC_hupdate_func, my_md5_update),
         /* Hash computation end function. */
    -    CURLX_FUNCTION_CAST(HMAC_hfinal_func, MD5_Final),
    +    CURLX_FUNCTION_CAST(HMAC_hfinal_func, my_md5_final),
         /* Size of hash context structure. */
    -    sizeof(MD5_CTX),
    +    sizeof(my_md5_ctx),
         /* Maximum key length. */
         64,
         /* Result size. */
    @@ -547,13 +587,13 @@ const struct HMAC_params Curl_HMAC_MD5[] = {
     const struct MD5_params Curl_DIGEST_MD5[] = {
       {
         /* Digest initialization function */
    -    CURLX_FUNCTION_CAST(Curl_MD5_init_func, MD5_Init),
    +    CURLX_FUNCTION_CAST(Curl_MD5_init_func, my_md5_init),
         /* Digest update function */
    -    CURLX_FUNCTION_CAST(Curl_MD5_update_func, MD5_Update),
    +    CURLX_FUNCTION_CAST(Curl_MD5_update_func, my_md5_update),
         /* Digest computation end function */
    -    CURLX_FUNCTION_CAST(Curl_MD5_final_func, MD5_Final),
    +    CURLX_FUNCTION_CAST(Curl_MD5_final_func, my_md5_final),
         /* Size of digest context struct */
    -    sizeof(MD5_CTX),
    +    sizeof(my_md5_ctx),
         /* Result size */
         16
       }
    @@ -564,15 +604,17 @@ const struct MD5_params Curl_DIGEST_MD5[] = {
      * Returns CURLE_OK on success.
      */
     CURLcode Curl_md5it(unsigned char *outbuffer, const unsigned char *input,
    -                const size_t len)
    +                    const size_t len)
     {
    -  MD5_CTX ctx;
    +  CURLcode result;
    +  my_md5_ctx ctx;
     
    -  MD5_Init(&ctx);
    -  MD5_Update(&ctx, input, curlx_uztoui(len));
    -  MD5_Final(outbuffer, &ctx);
    -
    -  return CURLE_OK;
    +  result = my_md5_init(&ctx);
    +  if(!result) {
    +    my_md5_update(&ctx, input, curlx_uztoui(len));
    +    my_md5_final(outbuffer, &ctx);
    +  }
    +  return result;
     }
     
     struct MD5_context *Curl_MD5_init(const struct MD5_params *md5params)
    @@ -594,7 +636,11 @@ struct MD5_context *Curl_MD5_init(const struct MD5_params *md5params)
     
       ctxt->md5_hash = md5params;
     
    -  (*md5params->md5_init_func)(ctxt->md5_hashctx);
    +  if((*md5params->md5_init_func)(ctxt->md5_hashctx)) {
    +    free(ctxt->md5_hashctx);
    +    free(ctxt);
    +    return NULL;
    +  }
     
       return ctxt;
     }
    diff --git a/vendor/curl/lib/mime.c b/vendor/curl/lib/mime.c
    index 7783b8990a..cab3ef1c37 100644
    --- a/vendor/curl/lib/mime.c
    +++ b/vendor/curl/lib/mime.c
    @@ -5,7 +5,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2021, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -25,7 +25,6 @@
     #include 
     
     #include "mime.h"
    -#include "non-ascii.h"
     #include "warnless.h"
     #include "urldata.h"
     #include "sendf.h"
    @@ -315,7 +314,7 @@ static char *escape_string(struct Curl_easy *data,
     
       Curl_dyn_init(&db, CURL_MAX_INPUT_LENGTH);
     
    -  for(result = Curl_dyn_add(&db, ""); !result && *src; src++) {
    +  for(result = Curl_dyn_addn(&db, STRCONST("")); !result && *src; src++) {
         for(p = table; *p && **p != *src; p++)
           ;
     
    @@ -340,9 +339,9 @@ static char *match_header(struct curl_slist *hdr, const char *lbl, size_t len)
     }
     
     /* Get a header from an slist. */
    -static char *search_header(struct curl_slist *hdrlist, const char *hdr)
    +static char *search_header(struct curl_slist *hdrlist,
    +                           const char *hdr, size_t len)
     {
    -  size_t len = strlen(hdr);
       char *value = NULL;
     
       for(; !value && hdrlist; hdrlist = hdrlist->next)
    @@ -506,15 +505,6 @@ static size_t encoder_base64_read(char *buffer, size_t size, bool ateof,
         }
       }
     
    -#ifdef CURL_DOES_CONVERSIONS
    -  /* This is now textual data, Convert character codes. */
    -  if(part->easy && cursize) {
    -    CURLcode result = Curl_convert_to_network(part->easy, buffer, cursize);
    -    if(result)
    -      return READ_ERROR;
    -  }
    -#endif
    -
       return cursize;
     }
     
    @@ -768,7 +758,7 @@ static void mime_file_free(void *ptr)
     static size_t readback_bytes(struct mime_state *state,
                                  char *buffer, size_t bufsize,
                                  const char *bytes, size_t numbytes,
    -                             const char *trail)
    +                             const char *trail, size_t traillen)
     {
       size_t sz;
       size_t offset = curlx_sotouz(state->offset);
    @@ -778,13 +768,11 @@ static size_t readback_bytes(struct mime_state *state,
         bytes += offset;
       }
       else {
    -    size_t tsz = strlen(trail);
    -
         sz = offset - numbytes;
    -    if(sz >= tsz)
    +    if(sz >= traillen)
           return 0;
         bytes = trail + sz;
    -    sz = tsz - sz;
    +    sz = traillen - sz;
       }
     
       if(sz > bufsize)
    @@ -925,9 +913,6 @@ static size_t readback_part(curl_mimepart *part,
                                 char *buffer, size_t bufsize, bool *hasread)
     {
       size_t cursize = 0;
    -#ifdef CURL_DOES_CONVERSIONS
    -  char *convbuf = buffer;
    -#endif
     
       /* Readback from part. */
     
    @@ -956,26 +941,18 @@ static size_t readback_part(curl_mimepart *part,
             mimesetstate(&part->state, MIMESTATE_USERHEADERS, part->userheaders);
           else {
             sz = readback_bytes(&part->state, buffer, bufsize,
    -                            hdr->data, strlen(hdr->data), "\r\n");
    +                            hdr->data, strlen(hdr->data), STRCONST("\r\n"));
             if(!sz)
               mimesetstate(&part->state, part->state.state, hdr->next);
           }
           break;
         case MIMESTATE_EOH:
    -      sz = readback_bytes(&part->state, buffer, bufsize, "\r\n", 2, "");
    +      sz = readback_bytes(&part->state, buffer, bufsize, STRCONST("\r\n"),
    +                          STRCONST(""));
           if(!sz)
             mimesetstate(&part->state, MIMESTATE_BODY, NULL);
           break;
         case MIMESTATE_BODY:
    -#ifdef CURL_DOES_CONVERSIONS
    -      if(part->easy && convbuf < buffer) {
    -        CURLcode result = Curl_convert_to_network(part->easy, convbuf,
    -                                                  buffer - convbuf);
    -        if(result)
    -          return READ_ERROR;
    -        convbuf = buffer;
    -      }
    -#endif
           cleanup_encoder_state(&part->encstate);
           mimesetstate(&part->state, MIMESTATE_CONTENT, NULL);
           break;
    @@ -1012,16 +989,6 @@ static size_t readback_part(curl_mimepart *part,
         bufsize -= sz;
       }
     
    -#ifdef CURL_DOES_CONVERSIONS
    -      if(part->easy && convbuf < buffer &&
    -         part->state.state < MIMESTATE_BODY) {
    -        CURLcode result = Curl_convert_to_network(part->easy, convbuf,
    -                                                  buffer - convbuf);
    -        if(result)
    -          return READ_ERROR;
    -      }
    -#endif
    -
       return cursize;
     }
     
    @@ -1031,10 +998,6 @@ static size_t mime_subparts_read(char *buffer, size_t size, size_t nitems,
     {
       curl_mime *mime = (curl_mime *) instream;
       size_t cursize = 0;
    -#ifdef CURL_DOES_CONVERSIONS
    -  char *convbuf = buffer;
    -#endif
    -
       (void) size;   /* Always 1. */
     
       while(nitems) {
    @@ -1043,9 +1006,6 @@ static size_t mime_subparts_read(char *buffer, size_t size, size_t nitems,
         switch(mime->state.state) {
         case MIMESTATE_BEGIN:
         case MIMESTATE_BODY:
    -#ifdef CURL_DOES_CONVERSIONS
    -      convbuf = buffer;
    -#endif
           mimesetstate(&mime->state, MIMESTATE_BOUNDARY1, mime->firstpart);
           /* The first boundary always follows the header termination empty line,
              so is always preceded by a CRLF. We can then spare 2 characters
    @@ -1053,23 +1013,19 @@ static size_t mime_subparts_read(char *buffer, size_t size, size_t nitems,
           mime->state.offset += 2;
           break;
         case MIMESTATE_BOUNDARY1:
    -      sz = readback_bytes(&mime->state, buffer, nitems, "\r\n--", 4, "");
    +      sz = readback_bytes(&mime->state, buffer, nitems, STRCONST("\r\n--"),
    +                          STRCONST(""));
           if(!sz)
             mimesetstate(&mime->state, MIMESTATE_BOUNDARY2, part);
           break;
         case MIMESTATE_BOUNDARY2:
    -      sz = readback_bytes(&mime->state, buffer, nitems, mime->boundary,
    -                          strlen(mime->boundary), part? "\r\n": "--\r\n");
    +      if(part)
    +        sz = readback_bytes(&mime->state, buffer, nitems, mime->boundary,
    +                            MIME_BOUNDARY_LEN, STRCONST("\r\n"));
    +      else
    +        sz = readback_bytes(&mime->state, buffer, nitems, mime->boundary,
    +                            MIME_BOUNDARY_LEN, STRCONST("--\r\n"));
           if(!sz) {
    -#ifdef CURL_DOES_CONVERSIONS
    -        if(mime->easy && convbuf < buffer) {
    -          CURLcode result = Curl_convert_to_network(mime->easy, convbuf,
    -                                                    buffer - convbuf);
    -          if(result)
    -            return READ_ERROR;
    -          convbuf = buffer;
    -        }
    -#endif
             mimesetstate(&mime->state, MIMESTATE_CONTENT, part);
           }
           break;
    @@ -1086,9 +1042,6 @@ static size_t mime_subparts_read(char *buffer, size_t size, size_t nitems,
           case STOP_FILLING:
             return cursize? cursize: sz;
           case 0:
    -#ifdef CURL_DOES_CONVERSIONS
    -        convbuf = buffer;
    -#endif
             mimesetstate(&mime->state, MIMESTATE_BOUNDARY1, part->nextpart);
             break;
           }
    @@ -1105,16 +1058,6 @@ static size_t mime_subparts_read(char *buffer, size_t size, size_t nitems,
         nitems -= sz;
       }
     
    -#ifdef CURL_DOES_CONVERSIONS
    -      if(mime->easy && convbuf < buffer &&
    -         mime->state.state <= MIMESTATE_CONTENT) {
    -        CURLcode result = Curl_convert_to_network(mime->easy, convbuf,
    -                                                  buffer - convbuf);
    -        if(result)
    -          return READ_ERROR;
    -      }
    -#endif
    -
       return cursize;
     }
     
    @@ -1341,8 +1284,9 @@ curl_mime *curl_mime_init(struct Curl_easy *easy)
         mime->firstpart = NULL;
         mime->lastpart = NULL;
     
    -    memset(mime->boundary, '-', 24);
    -    if(Curl_rand_hex(easy, (unsigned char *) &mime->boundary[24],
    +    memset(mime->boundary, '-', MIME_BOUNDARY_DASHES);
    +    if(Curl_rand_hex(easy,
    +                     (unsigned char *) &mime->boundary[MIME_BOUNDARY_DASHES],
                          MIME_RAND_BOUNDARY_CHARS + 1)) {
           /* failed to get random separator, bail out */
           free(mime);
    @@ -1675,10 +1619,9 @@ CURLcode Curl_mime_rewind(curl_mimepart *part)
     
     /* Compute header list size. */
     static size_t slist_size(struct curl_slist *s,
    -                         size_t overhead, const char *skip)
    +                         size_t overhead, const char *skip, size_t skiplen)
     {
       size_t size = 0;
    -  size_t skiplen = skip? strlen(skip): 0;
     
       for(; s; s = s->next)
         if(!skip || !match_header(s, skip, skiplen))
    @@ -1696,7 +1639,7 @@ static curl_off_t multipart_size(curl_mime *mime)
       if(!mime)
         return 0;           /* Not present -> empty. */
     
    -  boundarysize = 4 + strlen(mime->boundary) + 2;
    +  boundarysize = 4 + MIME_BOUNDARY_LEN + 2;
       size = boundarysize;  /* Final boundary - CRLF after headers. */
     
       for(part = mime->firstpart; part; part = part->nextpart) {
    @@ -1727,8 +1670,8 @@ curl_off_t Curl_mime_size(curl_mimepart *part)
     
       if(size >= 0 && !(part->flags & MIME_BODY_ONLY)) {
         /* Compute total part size. */
    -    size += slist_size(part->curlheaders, 2, NULL);
    -    size += slist_size(part->userheaders, 2, "Content-Type");
    +    size += slist_size(part->curlheaders, 2, NULL, 0);
    +    size += slist_size(part->userheaders, 2, STRCONST("Content-Type"));
         size += 2;    /* CRLF after headers. */
       }
       return size;
    @@ -1804,10 +1747,9 @@ const char *Curl_mime_contenttype(const char *filename)
       return NULL;
     }
     
    -static bool content_type_match(const char *contenttype, const char *target)
    +static bool content_type_match(const char *contenttype,
    +                               const char *target, size_t len)
     {
    -  size_t len = strlen(target);
    -
       if(contenttype && strncasecompare(contenttype, target, len))
         switch(contenttype[len]) {
         case '\0':
    @@ -1843,7 +1785,7 @@ CURLcode Curl_mime_prepare_headers(curl_mimepart *part,
       /* Check if content type is specified. */
       customct = part->mimetype;
       if(!customct)
    -    customct = search_header(part->userheaders, "Content-Type");
    +    customct = search_header(part->userheaders, STRCONST("Content-Type"));
       if(customct)
         contenttype = customct;
     
    @@ -1872,12 +1814,12 @@ CURLcode Curl_mime_prepare_headers(curl_mimepart *part,
           boundary = mime->boundary;
       }
       else if(contenttype && !customct &&
    -          content_type_match(contenttype, "text/plain"))
    +          content_type_match(contenttype, STRCONST("text/plain")))
         if(strategy == MIMESTRATEGY_MAIL || !part->filename)
           contenttype = NULL;
     
       /* Issue content-disposition header only if not already set by caller. */
    -  if(!search_header(part->userheaders, "Content-Disposition")) {
    +  if(!search_header(part->userheaders, STRCONST("Content-Disposition"))) {
         if(!disposition)
           if(part->filename || part->name ||
             (contenttype && !strncasecompare(contenttype, "multipart/", 10)))
    @@ -1924,7 +1866,8 @@ CURLcode Curl_mime_prepare_headers(curl_mimepart *part,
       }
     
       /* Content-Transfer-Encoding header. */
    -  if(!search_header(part->userheaders, "Content-Transfer-Encoding")) {
    +  if(!search_header(part->userheaders,
    +                    STRCONST("Content-Transfer-Encoding"))) {
         if(part->encoder)
           cte = part->encoder->name;
         else if(contenttype && strategy == MIMESTRATEGY_MAIL &&
    @@ -1948,7 +1891,7 @@ CURLcode Curl_mime_prepare_headers(curl_mimepart *part,
         curl_mimepart *subpart;
     
         disposition = NULL;
    -    if(content_type_match(contenttype, "multipart/form-data"))
    +    if(content_type_match(contenttype, STRCONST("multipart/form-data")))
           disposition = "form-data";
         for(subpart = mime->firstpart; subpart; subpart = subpart->nextpart) {
           ret = Curl_mime_prepare_headers(subpart, NULL, disposition, strategy);
    diff --git a/vendor/curl/lib/mime.h b/vendor/curl/lib/mime.h
    index 56642ae661..f2fc434c58 100644
    --- a/vendor/curl/lib/mime.h
    +++ b/vendor/curl/lib/mime.h
    @@ -7,7 +7,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2021, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -24,6 +24,7 @@
     
     #include "curl_setup.h"
     
    +#define MIME_BOUNDARY_DASHES            24  /* leading boundary dashes */
     #define MIME_RAND_BOUNDARY_CHARS        16  /* Nb. of random boundary chars. */
     #define MAX_ENCODED_LINE_LENGTH         76  /* Maximum encoded line length. */
     #define ENCODING_BUFFER_SIZE            256 /* Encoding temp buffers size. */
    @@ -91,8 +92,8 @@ struct mime_state {
       curl_off_t offset;          /* State-dependent offset. */
     };
     
    -/* minimum buffer size for the boundary string */
    -#define MIME_BOUNDARY_LEN (24 + MIME_RAND_BOUNDARY_CHARS + 1)
    +/* Boundary string length. */
    +#define MIME_BOUNDARY_LEN (MIME_BOUNDARY_DASHES + MIME_RAND_BOUNDARY_CHARS)
     
     /* A mime multipart. */
     struct curl_mime {
    @@ -100,7 +101,7 @@ struct curl_mime {
       curl_mimepart *parent;           /* Parent part. */
       curl_mimepart *firstpart;        /* First part. */
       curl_mimepart *lastpart;         /* Last part. */
    -  char boundary[MIME_BOUNDARY_LEN]; /* The part boundary. */
    +  char boundary[MIME_BOUNDARY_LEN + 1]; /* The part boundary. */
       struct mime_state state;         /* Current readback state. */
     };
     
    diff --git a/vendor/curl/lib/mprintf.c b/vendor/curl/lib/mprintf.c
    index 0fd3afc8ae..13812010b3 100644
    --- a/vendor/curl/lib/mprintf.c
    +++ b/vendor/curl/lib/mprintf.c
    @@ -5,7 +5,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1999 - 2021, Daniel Stenberg, , et al.
    + * Copyright (C) 1999 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -65,7 +65,6 @@
      */
     
     #if (defined(__BORLANDC__) && (__BORLANDC__ >= 0x520)) || \
    -    (defined(__WATCOMC__) && defined(__386__)) || \
         (defined(__POCC__) && defined(_MSC_VER)) || \
         (defined(_WIN32_WCE)) || \
         (defined(__MINGW32__)) || \
    @@ -830,6 +829,8 @@ static int dprintf_formatf(
             }
             else if(prec != -1)
               len = (size_t)prec;
    +        else if(*str == '\0')
    +          len = 0;
             else
               len = strlen(str);
     
    diff --git a/vendor/curl/lib/mqtt.c b/vendor/curl/lib/mqtt.c
    index fcd40b41e6..e79bd3b482 100644
    --- a/vendor/curl/lib/mqtt.c
    +++ b/vendor/curl/lib/mqtt.c
    @@ -5,7 +5,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 2020 - 2021, Daniel Stenberg, , et al.
    + * Copyright (C) 2020 - 2022, Daniel Stenberg, , et al.
      * Copyright (C) 2019, Björn Stenberg, 
      *
      * This software is licensed as described in the file COPYING, which
    @@ -60,6 +60,8 @@
      */
     
     static CURLcode mqtt_do(struct Curl_easy *data, bool *done);
    +static CURLcode mqtt_done(struct Curl_easy *data,
    +                          CURLcode status, bool premature);
     static CURLcode mqtt_doing(struct Curl_easy *data, bool *done);
     static int mqtt_getsock(struct Curl_easy *data, struct connectdata *conn,
                             curl_socket_t *sock);
    @@ -74,7 +76,7 @@ const struct Curl_handler Curl_handler_mqtt = {
       "MQTT",                             /* scheme */
       mqtt_setup_conn,                    /* setup_connection */
       mqtt_do,                            /* do_it */
    -  ZERO_NULL,                          /* done */
    +  mqtt_done,                          /* done */
       ZERO_NULL,                          /* do_more */
       ZERO_NULL,                          /* connect_it */
       ZERO_NULL,                          /* connecting */
    @@ -344,7 +346,9 @@ static CURLcode mqtt_connect(struct Curl_easy *data)
     static CURLcode mqtt_disconnect(struct Curl_easy *data)
     {
       CURLcode result = CURLE_OK;
    +  struct MQTT *mq = data->req.p.mqtt;
       result = mqtt_send(data, (char *)"\xe0\x00", 2);
    +  Curl_safefree(mq->sendleftovers);
       return result;
     }
     
    @@ -384,8 +388,7 @@ static CURLcode mqtt_get_topic(struct Curl_easy *data,
     {
       char *path = data->state.up.path;
       if(strlen(path) > 1)
    -    return Curl_urldecode(data, path + 1, 0, topic, topiclen,
    -                          REJECT_NADA);
    +    return Curl_urldecode(path + 1, 0, topic, topiclen, REJECT_NADA);
       failf(data, "No MQTT topic found. Forgot to URL encode it?");
       return CURLE_URL_MALFORMAT;
     }
    @@ -692,6 +695,16 @@ static CURLcode mqtt_do(struct Curl_easy *data, bool *done)
       return CURLE_OK;
     }
     
    +static CURLcode mqtt_done(struct Curl_easy *data,
    +                          CURLcode status, bool premature)
    +{
    +  struct MQTT *mq = data->req.p.mqtt;
    +  (void)status;
    +  (void)premature;
    +  Curl_safefree(mq->sendleftovers);
    +  return CURLE_OK;
    +}
    +
     static CURLcode mqtt_doing(struct Curl_easy *data, bool *done)
     {
       CURLcode result = CURLE_OK;
    diff --git a/vendor/curl/lib/multi.c b/vendor/curl/lib/multi.c
    index f8dcc63b47..6fdeafb8e6 100644
    --- a/vendor/curl/lib/multi.c
    +++ b/vendor/curl/lib/multi.c
    @@ -5,7 +5,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2021, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -687,16 +687,10 @@ static CURLcode multi_done(struct Curl_easy *data,
     #endif
          ) || conn->bits.close
            || (premature && !(conn->handler->flags & PROTOPT_STREAM))) {
    -    CURLcode res2;
         connclose(conn, "disconnecting");
         Curl_conncache_remove_conn(data, conn, FALSE);
         CONNCACHE_UNLOCK(data);
    -    res2 = Curl_disconnect(data, conn, premature);
    -
    -    /* If we had an error already, make sure we return that one. But
    -       if we got a new error, return that. */
    -    if(!result && res2)
    -      result = res2;
    +    Curl_disconnect(data, conn, premature);
       }
       else {
         char buffer[256];
    @@ -709,14 +703,15 @@ static CURLcode multi_done(struct Curl_easy *data,
           conn->bits.conn_to_host ? conn->conn_to_host.dispname :
           conn->host.dispname;
         /* create string before returning the connection */
    +    long connection_id = conn->connection_id;
         msnprintf(buffer, sizeof(buffer),
                   "Connection #%ld to host %s left intact",
    -              conn->connection_id, host);
    +              connection_id, host);
         /* the connection is no longer in use by this transfer */
         CONNCACHE_UNLOCK(data);
         if(Curl_conncache_return_conn(data, conn)) {
           /* remember the most recently used connection */
    -      data->state.lastconnect_id = conn->connection_id;
    +      data->state.lastconnect_id = connection_id;
           infof(data, "%s", buffer);
         }
         else
    @@ -1759,6 +1754,10 @@ CURLcode Curl_preconnect(struct Curl_easy *data)
       return CURLE_OK;
     }
     
    +static void set_in_callback(struct Curl_multi *multi, bool value)
    +{
    +  multi->in_callback = value;
    +}
     
     static CURLMcode multi_runsingle(struct Curl_multi *multi,
                                      struct curltime *nowp,
    @@ -2169,8 +2168,8 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
               Curl_posttransfer(data);
               drc = multi_done(data, result, FALSE);
     
    -          /* When set to retry the connection, we must to go back to
    -           * the CONNECT state */
    +          /* When set to retry the connection, we must go back to the CONNECT
    +           * state */
               if(newurl) {
                 if(!drc || (drc == CURLE_SEND_ERROR)) {
                   follow = FOLLOW_RETRY;
    @@ -2872,8 +2871,10 @@ static CURLMcode singlesocket(struct Curl_multi *multi,
           continue;
     
         if(multi->socket_cb) {
    +      set_in_callback(multi, TRUE);
           rc = multi->socket_cb(data, s, comboaction, multi->socket_userp,
                                 entry->socketp);
    +      set_in_callback(multi, FALSE);
           if(rc == -1) {
             multi->dead = TRUE;
             return CURLM_ABORTED_BY_CALLBACK;
    @@ -2914,8 +2915,10 @@ static CURLMcode singlesocket(struct Curl_multi *multi,
             entry->readers--;
           if(!entry->users) {
             if(multi->socket_cb) {
    +          set_in_callback(multi, TRUE);
               rc = multi->socket_cb(data, s, CURL_POLL_REMOVE,
                                     multi->socket_userp, entry->socketp);
    +          set_in_callback(multi, FALSE);
               if(rc == -1) {
                 multi->dead = TRUE;
                 return CURLM_ABORTED_BY_CALLBACK;
    @@ -2969,9 +2972,12 @@ void Curl_multi_closed(struct Curl_easy *data, curl_socket_t s)
     
           if(entry) {
             int rc = 0;
    -        if(multi->socket_cb)
    +        if(multi->socket_cb) {
    +          set_in_callback(multi, TRUE);
               rc = multi->socket_cb(data, s, CURL_POLL_REMOVE,
                                     multi->socket_userp, entry->socketp);
    +          set_in_callback(multi, FALSE);
    +        }
     
             /* now remove it from the socket hash */
             sh_delentry(entry, &multi->sockhash, s);
    @@ -3343,7 +3349,9 @@ CURLMcode Curl_update_timer(struct Curl_multi *multi)
           multi->timer_lastcall = none;
           /* there's no timeout now but there was one previously, tell the app to
              disable it */
    +      set_in_callback(multi, TRUE);
           rc = multi->timer_cb(multi, -1, multi->timer_userp);
    +      set_in_callback(multi, FALSE);
           if(rc == -1) {
             multi->dead = TRUE;
             return CURLM_ABORTED_BY_CALLBACK;
    @@ -3362,7 +3370,9 @@ CURLMcode Curl_update_timer(struct Curl_multi *multi)
     
       multi->timer_lastcall = multi->timetree->key;
     
    +  set_in_callback(multi, TRUE);
       rc = multi->timer_cb(multi, timeout_ms, multi->timer_userp);
    +  set_in_callback(multi, FALSE);
       if(rc == -1) {
         multi->dead = TRUE;
         return CURLM_ABORTED_BY_CALLBACK;
    @@ -3561,9 +3571,6 @@ CURLMcode curl_multi_assign(struct Curl_multi *multi, curl_socket_t s,
     {
       struct Curl_sh_entry *there = NULL;
     
    -  if(multi->in_callback)
    -    return CURLM_RECURSIVE_API_CALL;
    -
       there = sh_getentry(&multi->sockhash, s);
     
       if(!there)
    diff --git a/vendor/curl/lib/non-ascii.c b/vendor/curl/lib/non-ascii.c
    deleted file mode 100644
    index 3b77ae98d5..0000000000
    --- a/vendor/curl/lib/non-ascii.c
    +++ /dev/null
    @@ -1,336 +0,0 @@
    -/***************************************************************************
    - *                                  _   _ ____  _
    - *  Project                     ___| | | |  _ \| |
    - *                             / __| | | | |_) | |
    - *                            | (__| |_| |  _ <| |___
    - *                             \___|\___/|_| \_\_____|
    - *
    - * Copyright (C) 1998 - 2021, Daniel Stenberg, , et al.
    - *
    - * This software is licensed as described in the file COPYING, which
    - * you should have received as part of this distribution. The terms
    - * are also available at https://curl.se/docs/copyright.html.
    - *
    - * You may opt to use, copy, modify, merge, publish, distribute and/or sell
    - * copies of the Software, and permit persons to whom the Software is
    - * furnished to do so, under the terms of the COPYING file.
    - *
    - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
    - * KIND, either express or implied.
    - *
    - ***************************************************************************/
    -
    -#include "curl_setup.h"
    -
    -#ifdef CURL_DOES_CONVERSIONS
    -
    -#include 
    -
    -#include "non-ascii.h"
    -#include "formdata.h"
    -#include "sendf.h"
    -#include "urldata.h"
    -#include "multiif.h"
    -#include "strerror.h"
    -
    -#include "curl_memory.h"
    -/* The last #include file should be: */
    -#include "memdebug.h"
    -
    -#ifdef HAVE_ICONV
    -#include 
    -/* set default codesets for iconv */
    -#ifndef CURL_ICONV_CODESET_OF_NETWORK
    -#define CURL_ICONV_CODESET_OF_NETWORK "ISO8859-1"
    -#endif
    -#ifndef CURL_ICONV_CODESET_FOR_UTF8
    -#define CURL_ICONV_CODESET_FOR_UTF8   "UTF-8"
    -#endif
    -#define ICONV_ERROR  (size_t)-1
    -#endif /* HAVE_ICONV */
    -
    -/*
    - * Curl_convert_clone() returns a malloced copy of the source string (if
    - * returning CURLE_OK), with the data converted to network format.
    - */
    -CURLcode Curl_convert_clone(struct Curl_easy *data,
    -                           const char *indata,
    -                           size_t insize,
    -                           char **outbuf)
    -{
    -  char *convbuf;
    -  CURLcode result;
    -
    -  convbuf = malloc(insize);
    -  if(!convbuf)
    -    return CURLE_OUT_OF_MEMORY;
    -
    -  memcpy(convbuf, indata, insize);
    -  result = Curl_convert_to_network(data, convbuf, insize);
    -  if(result) {
    -    free(convbuf);
    -    return result;
    -  }
    -
    -  *outbuf = convbuf; /* return the converted buffer */
    -
    -  return CURLE_OK;
    -}
    -
    -/*
    - * Curl_convert_to_network() is an internal function for performing ASCII
    - * conversions on non-ASCII platforms. It converts the buffer _in place_.
    - */
    -CURLcode Curl_convert_to_network(struct Curl_easy *data,
    -                                 char *buffer, size_t length)
    -{
    -  if(data && data->set.convtonetwork) {
    -    /* use translation callback */
    -    CURLcode result;
    -    Curl_set_in_callback(data, true);
    -    result = data->set.convtonetwork(buffer, length);
    -    Curl_set_in_callback(data, false);
    -    if(result) {
    -      failf(data,
    -            "CURLOPT_CONV_TO_NETWORK_FUNCTION callback returned %d: %s",
    -            (int)result, curl_easy_strerror(result));
    -    }
    -
    -    return result;
    -  }
    -  else {
    -#ifdef HAVE_ICONV
    -    /* do the translation ourselves */
    -    iconv_t tmpcd = (iconv_t) -1;
    -    iconv_t *cd = &tmpcd;
    -    char *input_ptr, *output_ptr;
    -    size_t in_bytes, out_bytes, rc;
    -    char ebuffer[STRERROR_LEN];
    -
    -    /* open an iconv conversion descriptor if necessary */
    -    if(data)
    -      cd = &data->outbound_cd;
    -    if(*cd == (iconv_t)-1) {
    -      *cd = iconv_open(CURL_ICONV_CODESET_OF_NETWORK,
    -                       CURL_ICONV_CODESET_OF_HOST);
    -      if(*cd == (iconv_t)-1) {
    -        failf(data,
    -              "The iconv_open(\"%s\", \"%s\") call failed with errno %i: %s",
    -              CURL_ICONV_CODESET_OF_NETWORK,
    -              CURL_ICONV_CODESET_OF_HOST,
    -              errno, Curl_strerror(errno, ebuffer, sizeof(ebuffer)));
    -        return CURLE_CONV_FAILED;
    -      }
    -    }
    -    /* call iconv */
    -    input_ptr = output_ptr = buffer;
    -    in_bytes = out_bytes = length;
    -    rc = iconv(*cd, &input_ptr, &in_bytes,
    -               &output_ptr, &out_bytes);
    -    if(!data)
    -      iconv_close(tmpcd);
    -    if((rc == ICONV_ERROR) || (in_bytes)) {
    -      failf(data,
    -            "The Curl_convert_to_network iconv call failed with errno %i: %s",
    -            errno, Curl_strerror(errno, ebuffer, sizeof(ebuffer)));
    -      return CURLE_CONV_FAILED;
    -    }
    -#else
    -    failf(data, "CURLOPT_CONV_TO_NETWORK_FUNCTION callback required");
    -    return CURLE_CONV_REQD;
    -#endif /* HAVE_ICONV */
    -  }
    -
    -  return CURLE_OK;
    -}
    -
    -/*
    - * Curl_convert_from_network() is an internal function for performing ASCII
    - * conversions on non-ASCII platforms. It converts the buffer _in place_.
    - */
    -CURLcode Curl_convert_from_network(struct Curl_easy *data,
    -                                   char *buffer, size_t length)
    -{
    -  if(data && data->set.convfromnetwork) {
    -    /* use translation callback */
    -    CURLcode result;
    -    Curl_set_in_callback(data, true);
    -    result = data->set.convfromnetwork(buffer, length);
    -    Curl_set_in_callback(data, false);
    -    if(result) {
    -      failf(data,
    -            "CURLOPT_CONV_FROM_NETWORK_FUNCTION callback returned %d: %s",
    -            (int)result, curl_easy_strerror(result));
    -    }
    -
    -    return result;
    -  }
    -  else {
    -#ifdef HAVE_ICONV
    -    /* do the translation ourselves */
    -    iconv_t tmpcd = (iconv_t) -1;
    -    iconv_t *cd = &tmpcd;
    -    char *input_ptr, *output_ptr;
    -    size_t in_bytes, out_bytes, rc;
    -    char ebuffer[STRERROR_LEN];
    -
    -    /* open an iconv conversion descriptor if necessary */
    -    if(data)
    -      cd = &data->inbound_cd;
    -    if(*cd == (iconv_t)-1) {
    -      *cd = iconv_open(CURL_ICONV_CODESET_OF_HOST,
    -                       CURL_ICONV_CODESET_OF_NETWORK);
    -      if(*cd == (iconv_t)-1) {
    -        failf(data,
    -              "The iconv_open(\"%s\", \"%s\") call failed with errno %i: %s",
    -              CURL_ICONV_CODESET_OF_HOST,
    -              CURL_ICONV_CODESET_OF_NETWORK,
    -              errno, Curl_strerror(errno, ebuffer, sizeof(ebuffer)));
    -        return CURLE_CONV_FAILED;
    -      }
    -    }
    -    /* call iconv */
    -    input_ptr = output_ptr = buffer;
    -    in_bytes = out_bytes = length;
    -    rc = iconv(*cd, &input_ptr, &in_bytes,
    -               &output_ptr, &out_bytes);
    -    if(!data)
    -      iconv_close(tmpcd);
    -    if((rc == ICONV_ERROR) || (in_bytes)) {
    -      failf(data,
    -            "Curl_convert_from_network iconv call failed with errno %i: %s",
    -            errno, Curl_strerror(errno, ebuffer, sizeof(ebuffer)));
    -      return CURLE_CONV_FAILED;
    -    }
    -#else
    -    failf(data, "CURLOPT_CONV_FROM_NETWORK_FUNCTION callback required");
    -    return CURLE_CONV_REQD;
    -#endif /* HAVE_ICONV */
    -  }
    -
    -  return CURLE_OK;
    -}
    -
    -/*
    - * Curl_convert_from_utf8() is an internal function for performing UTF-8
    - * conversions on non-ASCII platforms.
    - */
    -CURLcode Curl_convert_from_utf8(struct Curl_easy *data,
    -                                char *buffer, size_t length)
    -{
    -  if(data && data->set.convfromutf8) {
    -    /* use translation callback */
    -    CURLcode result;
    -    Curl_set_in_callback(data, true);
    -    result = data->set.convfromutf8(buffer, length);
    -    Curl_set_in_callback(data, false);
    -    if(result) {
    -      failf(data,
    -            "CURLOPT_CONV_FROM_UTF8_FUNCTION callback returned %d: %s",
    -            (int)result, curl_easy_strerror(result));
    -    }
    -
    -    return result;
    -  }
    -  else {
    -#ifdef HAVE_ICONV
    -    /* do the translation ourselves */
    -    iconv_t tmpcd = (iconv_t) -1;
    -    iconv_t *cd = &tmpcd;
    -    char *input_ptr;
    -    char *output_ptr;
    -    size_t in_bytes, out_bytes, rc;
    -    char ebuffer[STRERROR_LEN];
    -
    -    /* open an iconv conversion descriptor if necessary */
    -    if(data)
    -      cd = &data->utf8_cd;
    -    if(*cd == (iconv_t)-1) {
    -      *cd = iconv_open(CURL_ICONV_CODESET_OF_HOST,
    -                       CURL_ICONV_CODESET_FOR_UTF8);
    -      if(*cd == (iconv_t)-1) {
    -        failf(data,
    -              "The iconv_open(\"%s\", \"%s\") call failed with errno %i: %s",
    -              CURL_ICONV_CODESET_OF_HOST,
    -              CURL_ICONV_CODESET_FOR_UTF8,
    -              errno, Curl_strerror(errno, ebuffer, sizeof(ebuffer)));
    -        return CURLE_CONV_FAILED;
    -      }
    -    }
    -    /* call iconv */
    -    input_ptr = output_ptr = buffer;
    -    in_bytes = out_bytes = length;
    -    rc = iconv(*cd, &input_ptr, &in_bytes,
    -               &output_ptr, &out_bytes);
    -    if(!data)
    -      iconv_close(tmpcd);
    -    if((rc == ICONV_ERROR) || (in_bytes)) {
    -      failf(data,
    -            "The Curl_convert_from_utf8 iconv call failed with errno %i: %s",
    -            errno, Curl_strerror(errno, ebuffer, sizeof(ebuffer)));
    -      return CURLE_CONV_FAILED;
    -    }
    -    if(output_ptr < input_ptr) {
    -      /* null terminate the now shorter output string */
    -      *output_ptr = 0x00;
    -    }
    -#else
    -    failf(data, "CURLOPT_CONV_FROM_UTF8_FUNCTION callback required");
    -    return CURLE_CONV_REQD;
    -#endif /* HAVE_ICONV */
    -  }
    -
    -  return CURLE_OK;
    -}
    -
    -/*
    - * Init conversion stuff for a Curl_easy
    - */
    -void Curl_convert_init(struct Curl_easy *data)
    -{
    -#if defined(CURL_DOES_CONVERSIONS) && defined(HAVE_ICONV)
    -  /* conversion descriptors for iconv calls */
    -  data->outbound_cd = (iconv_t)-1;
    -  data->inbound_cd  = (iconv_t)-1;
    -  data->utf8_cd     = (iconv_t)-1;
    -#else
    -  (void)data;
    -#endif /* CURL_DOES_CONVERSIONS && HAVE_ICONV */
    -}
    -
    -/*
    - * Setup conversion stuff for a Curl_easy
    - */
    -void Curl_convert_setup(struct Curl_easy *data)
    -{
    -  data->inbound_cd = iconv_open(CURL_ICONV_CODESET_OF_HOST,
    -                                CURL_ICONV_CODESET_OF_NETWORK);
    -  data->outbound_cd = iconv_open(CURL_ICONV_CODESET_OF_NETWORK,
    -                                 CURL_ICONV_CODESET_OF_HOST);
    -  data->utf8_cd = iconv_open(CURL_ICONV_CODESET_OF_HOST,
    -                             CURL_ICONV_CODESET_FOR_UTF8);
    -}
    -
    -/*
    - * Close conversion stuff for a Curl_easy
    - */
    -
    -void Curl_convert_close(struct Curl_easy *data)
    -{
    -#ifdef HAVE_ICONV
    -  /* close iconv conversion descriptors */
    -  if(data->inbound_cd != (iconv_t)-1) {
    -    iconv_close(data->inbound_cd);
    -  }
    -  if(data->outbound_cd != (iconv_t)-1) {
    -    iconv_close(data->outbound_cd);
    -  }
    -  if(data->utf8_cd != (iconv_t)-1) {
    -    iconv_close(data->utf8_cd);
    -  }
    -#else
    -  (void)data;
    -#endif /* HAVE_ICONV */
    -}
    -
    -#endif /* CURL_DOES_CONVERSIONS */
    diff --git a/vendor/curl/lib/non-ascii.h b/vendor/curl/lib/non-ascii.h
    deleted file mode 100644
    index 458e8ef091..0000000000
    --- a/vendor/curl/lib/non-ascii.h
    +++ /dev/null
    @@ -1,61 +0,0 @@
    -#ifndef HEADER_CURL_NON_ASCII_H
    -#define HEADER_CURL_NON_ASCII_H
    -/***************************************************************************
    - *                                  _   _ ____  _
    - *  Project                     ___| | | |  _ \| |
    - *                             / __| | | | |_) | |
    - *                            | (__| |_| |  _ <| |___
    - *                             \___|\___/|_| \_\_____|
    - *
    - * Copyright (C) 1998 - 2020, Daniel Stenberg, , et al.
    - *
    - * This software is licensed as described in the file COPYING, which
    - * you should have received as part of this distribution. The terms
    - * are also available at https://curl.se/docs/copyright.html.
    - *
    - * You may opt to use, copy, modify, merge, publish, distribute and/or sell
    - * copies of the Software, and permit persons to whom the Software is
    - * furnished to do so, under the terms of the COPYING file.
    - *
    - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
    - * KIND, either express or implied.
    - *
    - ***************************************************************************/
    -#include "curl_setup.h"
    -
    -#ifdef CURL_DOES_CONVERSIONS
    -
    -#include "urldata.h"
    -
    -/*
    - * Curl_convert_clone() returns a malloced copy of the source string (if
    - * returning CURLE_OK), with the data converted to network format.
    - *
    - * If no conversion was needed *outbuf may be NULL.
    - */
    -CURLcode Curl_convert_clone(struct Curl_easy *data,
    -                            const char *indata,
    -                            size_t insize,
    -                            char **outbuf);
    -
    -void Curl_convert_init(struct Curl_easy *data);
    -void Curl_convert_setup(struct Curl_easy *data);
    -void Curl_convert_close(struct Curl_easy *data);
    -
    -CURLcode Curl_convert_to_network(struct Curl_easy *data,
    -                                 char *buffer, size_t length);
    -CURLcode Curl_convert_from_network(struct Curl_easy *data,
    -                                 char *buffer, size_t length);
    -CURLcode Curl_convert_from_utf8(struct Curl_easy *data,
    -                                 char *buffer, size_t length);
    -#else
    -#define Curl_convert_clone(a,b,c,d) ((void)a, CURLE_OK)
    -#define Curl_convert_init(x) Curl_nop_stmt
    -#define Curl_convert_setup(x) Curl_nop_stmt
    -#define Curl_convert_close(x) Curl_nop_stmt
    -#define Curl_convert_to_network(a,b,c) ((void)a, CURLE_OK)
    -#define Curl_convert_from_network(a,b,c) ((void)a, CURLE_OK)
    -#define Curl_convert_from_utf8(a,b,c) ((void)a, CURLE_OK)
    -#endif
    -
    -#endif /* HEADER_CURL_NON_ASCII_H */
    diff --git a/vendor/curl/lib/nonblock.c b/vendor/curl/lib/nonblock.c
    index fda2e9ad79..92fb22ec22 100644
    --- a/vendor/curl/lib/nonblock.c
    +++ b/vendor/curl/lib/nonblock.c
    @@ -5,7 +5,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2021, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -73,12 +73,6 @@ int curlx_nonblock(curl_socket_t sockfd,    /* operate on this */
       long flags = nonblock ? 1L : 0L;
       return IoctlSocket(sockfd, FIONBIO, (char *)&flags);
     
    -#elif defined(HAVE_SETSOCKOPT_SO_NONBLOCK)
    -
    -  /* BeOS */
    -  long b = nonblock ? 1L : 0L;
    -  return setsockopt(sockfd, SOL_SOCKET, SO_NONBLOCK, &b, sizeof(b));
    -
     #else
     #  error "no non-blocking method was found/used/set"
     #endif
    diff --git a/vendor/curl/lib/nwlib.c b/vendor/curl/lib/nwlib.c
    deleted file mode 100644
    index 769326892a..0000000000
    --- a/vendor/curl/lib/nwlib.c
    +++ /dev/null
    @@ -1,327 +0,0 @@
    -/***************************************************************************
    - *                                  _   _ ____  _
    - *  Project                     ___| | | |  _ \| |
    - *                             / __| | | | |_) | |
    - *                            | (__| |_| |  _ <| |___
    - *                             \___|\___/|_| \_\_____|
    - *
    - * Copyright (C) 1998 - 2020, Daniel Stenberg, , et al.
    - *
    - * This software is licensed as described in the file COPYING, which
    - * you should have received as part of this distribution. The terms
    - * are also available at https://curl.se/docs/copyright.html.
    - *
    - * You may opt to use, copy, modify, merge, publish, distribute and/or sell
    - * copies of the Software, and permit persons to whom the Software is
    - * furnished to do so, under the terms of the COPYING file.
    - *
    - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
    - * KIND, either express or implied.
    - *
    - ***************************************************************************/
    -
    -#include "curl_setup.h"
    -
    -#ifdef NETWARE /* Novell NetWare */
    -
    -#ifdef __NOVELL_LIBC__
    -/* For native LibC-based NLM we need to register as a real lib. */
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -
    -#include "curl_memory.h"
    -/* The last #include file should be: */
    -#include "memdebug.h"
    -
    -struct libthreaddata {
    -  int     _errno;
    -  void    *twentybytes;
    -};
    -
    -struct libdata {
    -  int         x;
    -  int         y;
    -  int         z;
    -  void        *tenbytes;
    -  NXKey_t     perthreadkey;   /* if -1, no key obtained... */
    -  NXMutex_t   *lock;
    -};
    -
    -int         gLibId      = -1;
    -void        *gLibHandle = (void *) NULL;
    -rtag_t      gAllocTag   = (rtag_t) NULL;
    -NXMutex_t   *gLibLock   = (NXMutex_t *) NULL;
    -
    -/* internal library function prototypes... */
    -int  DisposeLibraryData(void *);
    -void DisposeThreadData(void *);
    -int  GetOrSetUpData(int id, struct libdata **data,
    -                    struct libthreaddata **threaddata);
    -
    -
    -int _NonAppStart(void        *NLMHandle,
    -                 void        *errorScreen,
    -                 const char  *cmdLine,
    -                 const char  *loadDirPath,
    -                 size_t      uninitializedDataLength,
    -                 void        *NLMFileHandle,
    -                 int         (*readRoutineP)(int conn,
    -                                             void *fileHandle, size_t offset,
    -                                             size_t nbytes,
    -                                             size_t *bytesRead,
    -                                             void *buffer),
    -                  size_t      customDataOffset,
    -                  size_t      customDataSize,
    -                  int         messageCount,
    -                  const char  **messages)
    -{
    -  NX_LOCK_INFO_ALLOC(liblock, "Per-Application Data Lock", 0);
    -
    -#ifndef __GNUC__
    -#pragma unused(cmdLine)
    -#pragma unused(loadDirPath)
    -#pragma unused(uninitializedDataLength)
    -#pragma unused(NLMFileHandle)
    -#pragma unused(readRoutineP)
    -#pragma unused(customDataOffset)
    -#pragma unused(customDataSize)
    -#pragma unused(messageCount)
    -#pragma unused(messages)
    -#endif
    -
    -  /*
    -   * Here we process our command line, post errors (to the error screen),
    -   * perform initializations and anything else we need to do before being able
    -   * to accept calls into us. If we succeed, we return non-zero and the NetWare
    -   * Loader will leave us up, otherwise we fail to load and get dumped.
    -   */
    -  gAllocTag = AllocateResourceTag(NLMHandle,
    -                                  " memory allocations",
    -                                  AllocSignature);
    -
    -  if(!gAllocTag) {
    -    OutputToScreen(errorScreen, "Unable to allocate resource tag for "
    -                   "library memory allocations.\n");
    -    return -1;
    -  }
    -
    -  gLibId = register_library(DisposeLibraryData);
    -
    -  if(gLibId < -1) {
    -    OutputToScreen(errorScreen, "Unable to register library with kernel.\n");
    -    return -1;
    -  }
    -
    -  gLibHandle = NLMHandle;
    -
    -  gLibLock = NXMutexAlloc(0, 0, &liblock);
    -
    -  if(!gLibLock) {
    -    OutputToScreen(errorScreen, "Unable to allocate library data lock.\n");
    -    return -1;
    -  }
    -
    -  return 0;
    -}
    -
    -/*
    - * Here we clean up any resources we allocated. Resource tags is a big part
    - * of what we created, but NetWare doesn't ask us to free those.
    - */
    -void _NonAppStop(void)
    -{
    -  (void) unregister_library(gLibId);
    -  NXMutexFree(gLibLock);
    -}
    -
    -/*
    - * This function cannot be the first in the file for if the file is linked
    - * first, then the check-unload function's offset will be nlmname.nlm+0
    - * which is how to tell that there isn't one. When the check function is
    - * first in the linked objects, it is ambiguous. For this reason, we will
    - * put it inside this file after the stop function.
    - *
    - * Here we check to see if it's alright to ourselves to be unloaded. If not,
    - * we return a non-zero value. Right now, there isn't any reason not to allow
    - * it.
    - */
    -int _NonAppCheckUnload(void)
    -{
    -    return 0;
    -}
    -
    -int GetOrSetUpData(int id, struct libdata **appData,
    -                   struct libthreaddata **threadData)
    -{
    -  int                 err;
    -  struct libdata      *app_data;
    -  struct libthreaddata *thread_data;
    -  NXKey_t             key;
    -  NX_LOCK_INFO_ALLOC(liblock, "Application Data Lock", 0);
    -
    -  err         = 0;
    -  thread_data = (struct libthreaddata_t *) NULL;
    -
    -  /*
    -   * Attempt to get our data for the application calling us. This is where we
    -   * store whatever application-specific information we need to carry in
    -   * support of calling applications.
    -   */
    -  app_data = (struct libdata *) get_app_data(id);
    -
    -  if(!app_data) {
    -    /*
    -     * This application hasn't called us before; set up application AND
    -     * per-thread data. Of course, just in case a thread from this same
    -     * application is calling us simultaneously, we better lock our application
    -     * data-creation mutex. We also need to recheck for data after we acquire
    -     * the lock because WE might be that other thread that was too late to
    -     * create the data and the first thread in will have created it.
    -     */
    -    NXLock(gLibLock);
    -
    -    app_data = (struct libdata *) get_app_data(id);
    -    if(!app_data) {
    -      app_data = calloc(1, sizeof(struct libdata));
    -
    -      if(app_data) {
    -        app_data->tenbytes = malloc(10);
    -        app_data->lock     = NXMutexAlloc(0, 0, &liblock);
    -
    -        if(!app_data->tenbytes || !app_data->lock) {
    -          if(app_data->lock)
    -            NXMutexFree(app_data->lock);
    -          free(app_data->tenbytes);
    -          free(app_data);
    -          app_data = (libdata_t *) NULL;
    -          err      = ENOMEM;
    -        }
    -
    -        if(app_data) {
    -          /*
    -           * Here we burn in the application data that we were trying to get
    -           * by calling get_app_data(). Next time we call the first function,
    -           * we'll get this data we're just now setting. We also go on here to
    -           * establish the per-thread data for the calling thread, something
    -           * we'll have to do on each application thread the first time
    -           * it calls us.
    -           */
    -          err = set_app_data(gLibId, app_data);
    -
    -          if(err) {
    -            if(app_data->lock)
    -              NXMutexFree(app_data->lock);
    -            free(app_data->tenbytes);
    -            free(app_data);
    -            app_data = (libdata_t *) NULL;
    -            err      = ENOMEM;
    -          }
    -          else {
    -            /* create key for thread-specific data... */
    -            err = NXKeyCreate(DisposeThreadData, (void *) NULL, &key);
    -
    -            if(err)                /* (no more keys left?) */
    -              key = -1;
    -
    -            app_data->perthreadkey = key;
    -          }
    -        }
    -      }
    -    }
    -
    -    NXUnlock(gLibLock);
    -  }
    -
    -  if(app_data) {
    -    key = app_data->perthreadkey;
    -
    -    if(key != -1 /* couldn't create a key? no thread data */
    -        && !(err = NXKeyGetValue(key, (void **) &thread_data))
    -        && !thread_data) {
    -      /*
    -       * Allocate the per-thread data for the calling thread. Regardless of
    -       * whether there was already application data or not, this may be the
    -       * first call by a new thread. The fact that we allocation 20 bytes on
    -       * a pointer is not very important, this just helps to demonstrate that
    -       * we can have arbitrarily complex per-thread data.
    -       */
    -      thread_data = malloc(sizeof(struct libthreaddata));
    -
    -      if(thread_data) {
    -        thread_data->_errno      = 0;
    -        thread_data->twentybytes = malloc(20);
    -
    -        if(!thread_data->twentybytes) {
    -          free(thread_data);
    -          thread_data = (struct libthreaddata *) NULL;
    -          err         = ENOMEM;
    -        }
    -
    -        err = NXKeySetValue(key, thread_data);
    -        if(err) {
    -          free(thread_data->twentybytes);
    -          free(thread_data);
    -          thread_data = (struct libthreaddata *) NULL;
    -        }
    -      }
    -    }
    -  }
    -
    -  if(appData)
    -    *appData = app_data;
    -
    -  if(threadData)
    -    *threadData = thread_data;
    -
    -  return err;
    -}
    -
    -int DisposeLibraryData(void *data)
    -{
    -  if(data) {
    -    void *tenbytes = ((libdata_t *) data)->tenbytes;
    -
    -    free(tenbytes);
    -    free(data);
    -  }
    -
    -  return 0;
    -}
    -
    -void DisposeThreadData(void *data)
    -{
    -  if(data) {
    -    void *twentybytes = ((struct libthreaddata *) data)->twentybytes;
    -
    -    free(twentybytes);
    -    free(data);
    -  }
    -}
    -
    -#else /* __NOVELL_LIBC__ */
    -/* For native CLib-based NLM seems we can do a bit more simple. */
    -#include 
    -
    -int main(void)
    -{
    -  /* initialize any globals here... */
    -
    -  /* do this if any global initializing was done
    -  SynchronizeStart();
    -  */
    -  ExitThread(TSR_THREAD, 0);
    -  return 0;
    -}
    -
    -#endif /* __NOVELL_LIBC__ */
    -
    -#else /* NETWARE */
    -
    -#ifdef __POCC__
    -#  pragma warn(disable:2024)  /* Disable warning #2024: Empty input file */
    -#endif
    -
    -#endif /* NETWARE */
    diff --git a/vendor/curl/lib/nwos.c b/vendor/curl/lib/nwos.c
    deleted file mode 100644
    index 889403132c..0000000000
    --- a/vendor/curl/lib/nwos.c
    +++ /dev/null
    @@ -1,88 +0,0 @@
    -/***************************************************************************
    - *                                  _   _ ____  _
    - *  Project                     ___| | | |  _ \| |
    - *                             / __| | | | |_) | |
    - *                            | (__| |_| |  _ <| |___
    - *                             \___|\___/|_| \_\_____|
    - *
    - * Copyright (C) 1998 - 2020, Daniel Stenberg, , et al.
    - *
    - * This software is licensed as described in the file COPYING, which
    - * you should have received as part of this distribution. The terms
    - * are also available at https://curl.se/docs/copyright.html.
    - *
    - * You may opt to use, copy, modify, merge, publish, distribute and/or sell
    - * copies of the Software, and permit persons to whom the Software is
    - * furnished to do so, under the terms of the COPYING file.
    - *
    - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
    - * KIND, either express or implied.
    - *
    - ***************************************************************************/
    -
    -#include "curl_setup.h"
    -
    -#ifdef NETWARE /* Novell NetWare */
    -
    -#ifdef __NOVELL_LIBC__
    -/* For native LibC-based NLM we need to do nothing. */
    -int netware_init(void)
    -{
    -  return 0;
    -}
    -
    -#else /* __NOVELL_LIBC__ */
    -
    -/* For native CLib-based NLM we need to initialize the LONG namespace. */
    -#include 
    -#include 
    -#include 
    -/* Make the CLIB Ctx stuff link */
    -#include 
    -NETDB_DEFINE_CONTEXT
    -/* Make the CLIB Inet stuff link */
    -#include 
    -#include 
    -NETINET_DEFINE_CONTEXT
    -
    -int netware_init(void)
    -{
    -  int rc = 0;
    -  unsigned int myHandle = GetNLMHandle();
    -  /* import UnAugmentAsterisk dynamically for NW4.x compatibility */
    -  void (*pUnAugmentAsterisk)(int) = (void(*)(int))
    -          ImportSymbol(myHandle, "UnAugmentAsterisk");
    -  /* import UseAccurateCaseForPaths dynamically for NW3.x compatibility */
    -  void (*pUseAccurateCaseForPaths)(int) = (void(*)(int))
    -          ImportSymbol(myHandle, "UseAccurateCaseForPaths");
    -  if(pUnAugmentAsterisk)
    -    pUnAugmentAsterisk(1);
    -  if(pUseAccurateCaseForPaths)
    -    pUseAccurateCaseForPaths(1);
    -  UnimportSymbol(myHandle, "UnAugmentAsterisk");
    -  UnimportSymbol(myHandle, "UseAccurateCaseForPaths");
    -  /* set long name space */
    -  if((SetCurrentNameSpace(4) == 255)) {
    -    rc = 1;
    -  }
    -  if((SetTargetNameSpace(4) == 255)) {
    -    rc = rc + 2;
    -  }
    -  return rc;
    -}
    -
    -/* dummy function to satisfy newer prelude */
    -int __init_environment(void)
    -{
    -  return 0;
    -}
    -
    -/* dummy function to satisfy newer prelude */
    -int __deinit_environment(void)
    -{
    -  return 0;
    -}
    -
    -#endif /* __NOVELL_LIBC__ */
    -
    -#endif /* NETWARE */
    diff --git a/vendor/curl/lib/openldap.c b/vendor/curl/lib/openldap.c
    index 0ffb6a36a2..4e92567706 100644
    --- a/vendor/curl/lib/openldap.c
    +++ b/vendor/curl/lib/openldap.c
    @@ -5,7 +5,7 @@
      *                | (__| |_| |  _ <| |___
      *                 \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 2011 - 2021, Daniel Stenberg, , et al.
    + * Copyright (C) 2011 - 2022, Daniel Stenberg, , et al.
      * Copyright (C) 2010, Howard Chu, 
      *
      * This software is licensed as described in the file COPYING, which
    @@ -46,6 +46,8 @@
     #include "curl_ldap.h"
     #include "curl_base64.h"
     #include "connect.h"
    +#include "curl_sasl.h"
    +#include "strcase.h"
     /* The last 3 #include files should be in this order */
     #include "curl_printf.h"
     #include "curl_memory.h"
    @@ -76,6 +78,8 @@ typedef enum {
       OLDAP_SSL,            /* Performing SSL handshake. */
       OLDAP_STARTTLS,       /* STARTTLS request sent. */
       OLDAP_TLS,            /* Performing TLS handshake. */
    +  OLDAP_MECHS,          /* Get SASL authentication mechanisms. */
    +  OLDAP_SASL,           /* SASL binding reply. */
       OLDAP_BIND,           /* Simple bind reply. */
       OLDAP_BINDV2,         /* Simple bind reply in protocol version 2. */
       OLDAP_LAST            /* Never used */
    @@ -96,6 +100,13 @@ static CURLcode oldap_connecting(struct Curl_easy *data, bool *done);
     static CURLcode oldap_disconnect(struct Curl_easy *data,
                                      struct connectdata *conn, bool dead);
     
    +static CURLcode oldap_perform_auth(struct Curl_easy *data, const char *mech,
    +                                   const struct bufref *initresp);
    +static CURLcode oldap_continue_auth(struct Curl_easy *data, const char *mech,
    +                                    const struct bufref *resp);
    +static CURLcode oldap_cancel_auth(struct Curl_easy *data, const char *mech);
    +static CURLcode oldap_get_message(struct Curl_easy *data, struct bufref *out);
    +
     static Curl_recv oldap_recv;
     
     /*
    @@ -154,10 +165,26 @@ const struct Curl_handler Curl_handler_ldaps = {
     };
     #endif
     
    +/* SASL parameters for the ldap protocol */
    +static const struct SASLproto saslldap = {
    +  "ldap",                     /* The service name */
    +  oldap_perform_auth,         /* Send authentication command */
    +  oldap_continue_auth,        /* Send authentication continuation */
    +  oldap_cancel_auth,          /* Send authentication cancellation */
    +  oldap_get_message,          /* Get SASL response message */
    +  0,                          /* Maximum initial response length (no max) */
    +  LDAP_SASL_BIND_IN_PROGRESS, /* Code received when continuation is expected */
    +  LDAP_SUCCESS,               /* Code to receive upon authentication success */
    +  SASL_AUTH_NONE,             /* Default mechanisms */
    +  0                           /* Configuration flags */
    +};
    +
     struct ldapconninfo {
    +  struct SASL sasl;          /* SASL-related parameters */
       LDAP *ld;                  /* Openldap connection handle. */
       Curl_recv *recv;           /* For stacking SSL handler */
       Curl_send *send;
    +  struct berval *servercred; /* SASL data from server. */
       ldapstate state;           /* Current machine state. */
       int proto;                 /* LDAP_PROTO_TCP/LDAP_PROTO_UDP/LDAP_PROTO_IPC */
       int msgid;                 /* Current message id. */
    @@ -184,6 +211,8 @@ static void state(struct Curl_easy *data, ldapstate newstate)
         "SSL",
         "STARTTLS",
         "TLS",
    +    "MECHS",
    +    "SASL",
         "BIND",
         "BINDV2",
         /* LAST */
    @@ -251,6 +280,37 @@ static CURLcode oldap_url_parse(struct Curl_easy *data, LDAPURLDesc **ludp)
       return result;
     }
     
    +/* Parse the login options. */
    +static CURLcode oldap_parse_login_options(struct connectdata *conn)
    +{
    +  CURLcode result = CURLE_OK;
    +  struct ldapconninfo *li = conn->proto.ldapc;
    +  const char *ptr = conn->options;
    +
    +  while(!result && ptr && *ptr) {
    +    const char *key = ptr;
    +    const char *value;
    +
    +    while(*ptr && *ptr != '=')
    +        ptr++;
    +
    +    value = ptr + 1;
    +
    +    while(*ptr && *ptr != ';')
    +      ptr++;
    +
    +    if(checkprefix("AUTH=", key))
    +      result = Curl_sasl_parse_url_auth_option(&li->sasl, value, ptr - value);
    +    else
    +      result = CURLE_SETOPT_OPTION_SYNTAX;
    +
    +    if(*ptr == ';')
    +      ptr++;
    +  }
    +
    +  return result == CURLE_URL_MALFORMAT? CURLE_SETOPT_OPTION_SYNTAX: result;
    +}
    +
     static CURLcode oldap_setup_connection(struct Curl_easy *data,
                                            struct connectdata *conn)
     {
    @@ -271,14 +331,94 @@ static CURLcode oldap_setup_connection(struct Curl_easy *data,
           conn->proto.ldapc = li;
           connkeep(conn, "OpenLDAP default");
     
    +      /* Initialize the SASL storage */
    +      Curl_sasl_init(&li->sasl, data, &saslldap);
    +
           /* Clear the TLS upgraded flag */
           conn->bits.tls_upgraded = FALSE;
    +
    +      result = oldap_parse_login_options(conn);
         }
       }
     
       return result;
     }
     
    +/*
    + * Get the SASL authentication challenge from the server credential buffer.
    + */
    +static CURLcode oldap_get_message(struct Curl_easy *data, struct bufref *out)
    +{
    +  struct berval *servercred = data->conn->proto.ldapc->servercred;
    +
    +  if(!servercred || !servercred->bv_val)
    +    return CURLE_WEIRD_SERVER_REPLY;
    +  Curl_bufref_set(out, servercred->bv_val, servercred->bv_len, NULL);
    +  return CURLE_OK;
    +}
    +
    +/*
    + * Sends an initial SASL bind request to the server.
    + */
    +static CURLcode oldap_perform_auth(struct Curl_easy *data, const char *mech,
    +                                   const struct bufref *initresp)
    +{
    +  struct connectdata *conn = data->conn;
    +  struct ldapconninfo *li = conn->proto.ldapc;
    +  CURLcode result = CURLE_OK;
    +  struct berval cred;
    +  struct berval *pcred = &cred;
    +  int rc;
    +
    +  cred.bv_val = (char *) Curl_bufref_ptr(initresp);
    +  cred.bv_len = Curl_bufref_len(initresp);
    +  if(!cred.bv_val)
    +    pcred = NULL;
    +  rc = ldap_sasl_bind(li->ld, NULL, mech, pcred, NULL, NULL, &li->msgid);
    +  if(rc != LDAP_SUCCESS)
    +    result = oldap_map_error(rc, CURLE_LDAP_CANNOT_BIND);
    +  return result;
    +}
    +
    +/*
    + * Sends SASL continuation.
    + */
    +static CURLcode oldap_continue_auth(struct Curl_easy *data, const char *mech,
    +                                    const struct bufref *resp)
    +{
    +  struct connectdata *conn = data->conn;
    +  struct ldapconninfo *li = conn->proto.ldapc;
    +  CURLcode result = CURLE_OK;
    +  struct berval cred;
    +  struct berval *pcred = &cred;
    +  int rc;
    +
    +  cred.bv_val = (char *) Curl_bufref_ptr(resp);
    +  cred.bv_len = Curl_bufref_len(resp);
    +  if(!cred.bv_val)
    +    pcred = NULL;
    +  rc = ldap_sasl_bind(li->ld, NULL, mech, pcred, NULL, NULL, &li->msgid);
    +  if(rc != LDAP_SUCCESS)
    +    result = oldap_map_error(rc, CURLE_LDAP_CANNOT_BIND);
    +  return result;
    +}
    +
    +/*
    + * Sends SASL bind cancellation.
    + */
    +static CURLcode oldap_cancel_auth(struct Curl_easy *data, const char *mech)
    +{
    +  struct ldapconninfo *li = data->conn->proto.ldapc;
    +  CURLcode result = CURLE_OK;
    +  int rc = ldap_sasl_bind(li->ld, NULL, LDAP_SASL_NULL, NULL, NULL, NULL,
    +                          &li->msgid);
    +
    +  (void)mech;
    +  if(rc != LDAP_SUCCESS)
    +    result = oldap_map_error(rc, CURLE_LDAP_CANNOT_BIND);
    +  return result;
    +}
    +
     /* Starts LDAP simple bind. */
     static CURLcode oldap_perform_bind(struct Curl_easy *data, ldapstate newstate)
     {
    @@ -292,7 +432,7 @@ static CURLcode oldap_perform_bind(struct Curl_easy *data, ldapstate newstate)
       passwd.bv_val = NULL;
       passwd.bv_len = 0;
     
    -  if(conn->bits.user_passwd) {
    +  if(data->state.aptr.user) {
         binddn = conn->user;
         passwd.bv_val = conn->passwd;
         passwd.bv_len = strlen(passwd.bv_val);
    @@ -304,11 +444,45 @@ static CURLcode oldap_perform_bind(struct Curl_easy *data, ldapstate newstate)
         state(data, newstate);
       else
         result = oldap_map_error(rc,
    -                             conn->bits.user_passwd?
    +                             data->state.aptr.user?
                                  CURLE_LOGIN_DENIED: CURLE_LDAP_CANNOT_BIND);
       return result;
     }
     
    +/* Query the supported SASL authentication mechanisms. */
    +static CURLcode oldap_perform_mechs(struct Curl_easy *data)
    +{
    +  CURLcode result = CURLE_OK;
    +  struct ldapconninfo *li = data->conn->proto.ldapc;
    +  int rc;
    +  static const char * const supportedSASLMechanisms[] = {
    +    "supportedSASLMechanisms",
    +    NULL
    +  };
    +
    +  rc = ldap_search_ext(li->ld, "", LDAP_SCOPE_BASE, "(objectclass=*)",
    +                       (char **) supportedSASLMechanisms, 0,
    +                       NULL, NULL, NULL, 0, &li->msgid);
    +  if(rc == LDAP_SUCCESS)
    +    state(data, OLDAP_MECHS);
    +  else
    +    result = oldap_map_error(rc, CURLE_LOGIN_DENIED);
    +  return result;
    +}
    +
    +/* Starts SASL bind. */
    +static CURLcode oldap_perform_sasl(struct Curl_easy *data)
    +{
    +  saslprogress progress = SASL_IDLE;
    +  struct ldapconninfo *li = data->conn->proto.ldapc;
    +  CURLcode result = Curl_sasl_start(&li->sasl, data, TRUE, &progress);
    +
    +  state(data, OLDAP_SASL);
    +  if(!result && progress != SASL_INPROGRESS)
    +    result = CURLE_LOGIN_DENIED;
    +  return result;
    +}
    +
     #ifdef USE_SSL
     static Sockbuf_IO ldapsb_tls;
     
    @@ -414,11 +588,106 @@ static CURLcode oldap_connect(struct Curl_easy *data, bool *done)
       }
     #endif
     
    +  if(li->sasl.prefmech != SASL_AUTH_NONE)
    +    return oldap_perform_mechs(data);
    +
       /* Force bind even if anonymous bind is not needed in protocol version 3
          to detect missing version 3 support. */
       return oldap_perform_bind(data, OLDAP_BIND);
     }
     
    +/* Handle the supported SASL mechanisms query response */
    +static CURLcode oldap_state_mechs_resp(struct Curl_easy *data,
    +                                       LDAPMessage *msg, int code)
    +{
    +  struct connectdata *conn = data->conn;
    +  struct ldapconninfo *li = conn->proto.ldapc;
    +  int rc;
    +  BerElement *ber = NULL;
    +  CURLcode result = CURLE_OK;
    +  struct berval bv, *bvals;
    +
    +  switch(ldap_msgtype(msg)) {
    +  case LDAP_RES_SEARCH_ENTRY:
    +    /* Got a list of supported SASL mechanisms. */
    +    if(code != LDAP_SUCCESS && code != LDAP_NO_RESULTS_RETURNED)
    +      return CURLE_LOGIN_DENIED;
    +
    +    rc = ldap_get_dn_ber(li->ld, msg, &ber, &bv);
    +    if(rc < 0)
    +      return oldap_map_error(rc, CURLE_BAD_CONTENT_ENCODING);
    +    for(rc = ldap_get_attribute_ber(li->ld, msg, ber, &bv, &bvals);
    +        rc == LDAP_SUCCESS;
    +        rc = ldap_get_attribute_ber(li->ld, msg, ber, &bv, &bvals)) {
    +      int i;
    +
    +      if(!bv.bv_val)
    +        break;
    +
    +      if(bvals) {
    +        for(i = 0; bvals[i].bv_val; i++) {
    +          size_t llen;
    +          unsigned short mech = Curl_sasl_decode_mech((char *) bvals[i].bv_val,
    +                                                      bvals[i].bv_len, &llen);
    +          if(bvals[i].bv_len == llen)
    +            li->sasl.authmechs |= mech;
    +        }
    +        ber_memfree(bvals);
    +      }
    +    }
    +    ber_free(ber, 0);
    +    break;
    +
    +  case LDAP_RES_SEARCH_RESULT:
    +    switch(code) {
    +    case LDAP_SIZELIMIT_EXCEEDED:
    +      infof(data, "Too many authentication mechanisms\n");
    +      /* FALLTHROUGH */
    +    case LDAP_SUCCESS:
    +    case LDAP_NO_RESULTS_RETURNED:
    +      if(Curl_sasl_can_authenticate(&li->sasl, data))
    +        result = oldap_perform_sasl(data);
    +      else
    +        result = CURLE_LOGIN_DENIED;
    +      break;
    +    default:
    +      result = oldap_map_error(code, CURLE_LOGIN_DENIED);
    +      break;
    +    }
    +    break;
    +  default:
    +    break;
    +  }
    +  return result;
    +}
    +
    +/* Handle a SASL bind response. */
    +static CURLcode oldap_state_sasl_resp(struct Curl_easy *data,
    +                                      LDAPMessage *msg, int code)
    +{
    +  struct connectdata *conn = data->conn;
    +  struct ldapconninfo *li = conn->proto.ldapc;
    +  CURLcode result = CURLE_OK;
    +  saslprogress progress;
    +  int rc;
    +
    +  li->servercred = NULL;
    +  rc = ldap_parse_sasl_bind_result(li->ld, msg, &li->servercred, 0);
    +  if(rc != LDAP_SUCCESS) {
    +    failf(data, "LDAP local: sasl ldap_parse_result %s", ldap_err2string(rc));
    +    result = oldap_map_error(rc, CURLE_LOGIN_DENIED);
    +  }
    +  else {
    +    result = Curl_sasl_continue(&li->sasl, data, code, &progress);
    +    if(!result && progress != SASL_INPROGRESS)
    +      state(data, OLDAP_STOP);
    +  }
    +
    +  if(li->servercred)
    +    ber_bvfree(li->servercred);
    +  return result;
    +}
    +
     /* Handle a simple bind response. */
     static CURLcode oldap_state_bind_resp(struct Curl_easy *data, LDAPMessage *msg,
                                           int code)
    @@ -459,12 +728,20 @@ static CURLcode oldap_connecting(struct Curl_easy *data, bool *done)
       if(li->state != OLDAP_SSL && li->state != OLDAP_TLS) {
         /* Get response to last command. */
         rc = ldap_result(li->ld, li->msgid, LDAP_MSG_ONE, &tv, &msg);
    -    if(!rc)
    -      return CURLE_OK;                    /* Timed out. */
    -    if(rc < 0) {
    -      failf(data, "LDAP local: connecting ldap_result %s",
    -            ldap_err2string(rc));
    -      return oldap_map_error(rc, CURLE_COULDNT_CONNECT);
    +    switch(rc) {
    +    case 0:                               /* Timed out. */
    +      return CURLE_OK;
    +    case LDAP_RES_SEARCH_ENTRY:
    +    case LDAP_RES_SEARCH_REFERENCE:
    +      break;
    +    default:
    +      li->msgid = 0;                      /* Nothing to abandon upon error. */
    +      if(rc < 0) {
    +        failf(data, "LDAP local: connecting ldap_result %s",
    +              ldap_err2string(rc));
    +        return oldap_map_error(rc, CURLE_COULDNT_CONNECT);
    +      }
    +      break;
         }
     
         /* Get error code from message. */
    @@ -477,11 +754,11 @@ static CURLcode oldap_connecting(struct Curl_easy *data, bool *done)
         }
     
         /* If protocol version 3 is not supported, fallback to version 2. */
    -    if(code == LDAP_PROTOCOL_ERROR && li->state != OLDAP_BINDV2
    +    if(code == LDAP_PROTOCOL_ERROR && li->state != OLDAP_BINDV2 &&
     #ifdef USE_SSL
    -       && (ssl_installed(conn) || data->set.use_ssl <= CURLUSESSL_TRY)
    +       (ssl_installed(conn) || data->set.use_ssl <= CURLUSESSL_TRY) &&
     #endif
    -       ) {
    +       li->sasl.prefmech == SASL_AUTH_NONE) {
           static const int version = LDAP_VERSION2;
     
           ldap_set_option(li->ld, LDAP_OPT_PROTOCOL_VERSION, &version);
    @@ -496,13 +773,19 @@ static CURLcode oldap_connecting(struct Curl_easy *data, bool *done)
     #ifdef USE_SSL
       case OLDAP_SSL:
         result = oldap_ssl_connect(data, OLDAP_SSL);
    -    if(!result && ssl_installed(conn))
    -      result = oldap_perform_bind(data, OLDAP_BIND);
    +    if(!result && ssl_installed(conn)) {
    +      if(li->sasl.prefmech != SASL_AUTH_NONE)
    +        result = oldap_perform_mechs(data);
    +      else
    +        result = oldap_perform_bind(data, OLDAP_BIND);
    +    }
         break;
       case OLDAP_STARTTLS:
         if(code != LDAP_SUCCESS) {
           if(data->set.use_ssl != CURLUSESSL_TRY)
             result = oldap_map_error(code, CURLE_USE_SSL_FAILED);
    +      else if(li->sasl.prefmech != SASL_AUTH_NONE)
    +        result = oldap_perform_mechs(data);
           else
             result = oldap_perform_bind(data, OLDAP_BIND);
           break;
    @@ -514,7 +797,9 @@ static CURLcode oldap_connecting(struct Curl_easy *data, bool *done)
           result = oldap_map_error(code, CURLE_USE_SSL_FAILED);
         else if(ssl_installed(conn)) {
           conn->bits.tls_upgraded = TRUE;
    -      if(conn->bits.user_passwd)
    +      if(li->sasl.prefmech != SASL_AUTH_NONE)
    +        result = oldap_perform_mechs(data);
    +      else if(data->state.aptr.user)
             result = oldap_perform_bind(data, OLDAP_BIND);
           else {
             state(data, OLDAP_STOP); /* Version 3 supported: no bind required */
    @@ -524,6 +809,12 @@ static CURLcode oldap_connecting(struct Curl_easy *data, bool *done)
         break;
     #endif
     
    +  case OLDAP_MECHS:
    +    result = oldap_state_mechs_resp(data, msg, code);
    +    break;
    +  case OLDAP_SASL:
    +    result = oldap_state_sasl_resp(data, msg, code);
    +    break;
       case OLDAP_BIND:
       case OLDAP_BINDV2:
         result = oldap_state_bind_resp(data, msg, code);
    @@ -540,6 +831,10 @@ static CURLcode oldap_connecting(struct Curl_easy *data, bool *done)
       if(*done)
         conn->recv[FIRSTSOCKET] = oldap_recv;
     
    +  if(result && li->msgid) {
    +    ldap_abandon_ext(li->ld, li->msgid, NULL, NULL);
    +    li->msgid = 0;
    +  }
       return result;
     }
     
    @@ -549,6 +844,9 @@ static CURLcode oldap_disconnect(struct Curl_easy *data,
     {
       struct ldapconninfo *li = conn->proto.ldapc;
       (void) dead_connection;
    +#ifndef USE_SSL
    +  (void)data;
    +#endif
     
       if(li) {
         if(li->ld) {
    @@ -562,6 +860,7 @@ static CURLcode oldap_disconnect(struct Curl_easy *data,
           ldap_unbind_ext(li->ld, NULL, NULL);
           li->ld = NULL;
         }
    +    Curl_sasl_cleanup(conn, li->sasl.authused);
         conn->proto.ldapc = NULL;
         free(li);
       }
    @@ -632,21 +931,21 @@ static CURLcode oldap_done(struct Curl_easy *data, CURLcode res,
       return CURLE_OK;
     }
     
    -static CURLcode client_write(struct Curl_easy *data, const char *prefix,
    -                             const char *value, size_t len, const char *suffix)
    +static CURLcode client_write(struct Curl_easy *data,
    +                             const char *prefix, size_t plen,
    +                             const char *value, size_t len,
    +                             const char *suffix, size_t slen)
     {
       CURLcode result = CURLE_OK;
    -  size_t l;
     
       if(prefix) {
    -    l = strlen(prefix);
         /* If we have a zero-length value and the prefix ends with a space
            separator, drop the latter. */
    -    if(!len && l && prefix[l - 1] == ' ')
    -      l--;
    -    result = Curl_client_write(data, CLIENTWRITE_BODY, (char *) prefix, l);
    +    if(!len && plen && prefix[plen - 1] == ' ')
    +      plen--;
    +    result = Curl_client_write(data, CLIENTWRITE_BODY, (char *) prefix, plen);
         if(!result)
    -      data->req.bytecount += l;
    +      data->req.bytecount += plen;
       }
       if(!result && value) {
         result = Curl_client_write(data, CLIENTWRITE_BODY, (char *) value, len);
    @@ -654,10 +953,9 @@ static CURLcode client_write(struct Curl_easy *data, const char *prefix,
           data->req.bytecount += len;
       }
       if(!result && suffix) {
    -    l = strlen(suffix);
    -    result = Curl_client_write(data, CLIENTWRITE_BODY, (char *) suffix, l);
    +    result = Curl_client_write(data, CLIENTWRITE_BODY, (char *) suffix, slen);
         if(!result)
    -      data->req.bytecount += l;
    +      data->req.bytecount += slen;
       }
       return result;
     }
    @@ -734,7 +1032,8 @@ static ssize_t oldap_recv(struct Curl_easy *data, int sockindex, char *buf,
           break;
         }
     
    -    result = client_write(data, "DN: ", bv.bv_val, bv.bv_len, "\n");
    +    result = client_write(data, STRCONST("DN: "), bv.bv_val, bv.bv_len,
    +                          STRCONST("\n"));
         if(result)
           break;
     
    @@ -747,7 +1046,8 @@ static ssize_t oldap_recv(struct Curl_easy *data, int sockindex, char *buf,
             break;
     
           if(!bvals) {
    -        result = client_write(data, "\t", bv.bv_val, bv.bv_len, ":\n");
    +        result = client_write(data, STRCONST("\t"), bv.bv_val, bv.bv_len,
    +                              STRCONST(":\n"));
             if(result)
               break;
             continue;
    @@ -759,7 +1059,8 @@ static ssize_t oldap_recv(struct Curl_easy *data, int sockindex, char *buf,
           for(i = 0; bvals[i].bv_val != NULL; i++) {
             int binval = 0;
     
    -        result = client_write(data, "\t", bv.bv_val, bv.bv_len, ":");
    +        result = client_write(data, STRCONST("\t"), bv.bv_val, bv.bv_len,
    +                              STRCONST(":"));
             if(result)
               break;
     
    @@ -784,15 +1085,17 @@ static ssize_t oldap_recv(struct Curl_easy *data, int sockindex, char *buf,
     
               /* Binary value, encode to base64. */
               if(bvals[i].bv_len)
    -            result = Curl_base64_encode(data, bvals[i].bv_val, bvals[i].bv_len,
    +            result = Curl_base64_encode(bvals[i].bv_val, bvals[i].bv_len,
                                             &val_b64, &val_b64_sz);
               if(!result)
    -            result = client_write(data, ": ", val_b64, val_b64_sz, "\n");
    +            result = client_write(data, STRCONST(": "), val_b64, val_b64_sz,
    +                                  STRCONST("\n"));
               free(val_b64);
             }
             else
    -          result = client_write(data, " ",
    -                                bvals[i].bv_val, bvals[i].bv_len, "\n");
    +          result = client_write(data, STRCONST(" "),
    +                                bvals[i].bv_val, bvals[i].bv_len,
    +                                STRCONST("\n"));
             if(result)
               break;
           }
    @@ -800,7 +1103,7 @@ static ssize_t oldap_recv(struct Curl_easy *data, int sockindex, char *buf,
           ber_memfree(bvals);
           bvals = NULL;
           if(!result)
    -        result = client_write(data, "\n", NULL, 0, NULL);
    +        result = client_write(data, STRCONST("\n"), NULL, 0, NULL, 0);
           if(result)
             break;
         }
    @@ -808,7 +1111,7 @@ static ssize_t oldap_recv(struct Curl_easy *data, int sockindex, char *buf,
         ber_free(ber, 0);
     
         if(!result)
    -      result = client_write(data, "\n", NULL, 0, NULL);
    +      result = client_write(data, STRCONST("\n"), NULL, 0, NULL, 0);
         if(!result)
           result = CURLE_AGAIN;
         break;
    diff --git a/vendor/curl/lib/pingpong.c b/vendor/curl/lib/pingpong.c
    index 84c7f51de5..1453bf299a 100644
    --- a/vendor/curl/lib/pingpong.c
    +++ b/vendor/curl/lib/pingpong.c
    @@ -5,7 +5,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2021, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -32,7 +32,6 @@
     #include "speedcheck.h"
     #include "pingpong.h"
     #include "multiif.h"
    -#include "non-ascii.h"
     #include "vtls/vtls.h"
     
     /* The last 3 #include files should be in this order */
    @@ -199,11 +198,6 @@ CURLcode Curl_pp_vsendf(struct Curl_easy *data,
       s = Curl_dyn_ptr(&pp->sendbuf);
       Curl_pp_init(data, pp);
     
    -  result = Curl_convert_to_network(data, s, write_len);
    -  /* Curl_convert_to_network calls failf if unsuccessful */
    -  if(result)
    -    return result;
    -
     #ifdef HAVE_GSSAPI
       conn->data_prot = PROT_CMD;
     #endif
    @@ -324,11 +318,6 @@ CURLcode Curl_pp_readresp(struct Curl_easy *data,
           if(result == CURLE_AGAIN)
             return CURLE_OK; /* return */
     
    -      if(!result && (gotbytes > 0))
    -        /* convert from the network encoding */
    -        result = Curl_convert_from_network(data, ptr, gotbytes);
    -      /* Curl_convert_from_network calls failf if unsuccessful */
    -
           if(result)
             /* Set outer result variable to this error. */
             keepon = FALSE;
    diff --git a/vendor/curl/lib/pop3.c b/vendor/curl/lib/pop3.c
    index d4ca67877d..065bdbaf51 100644
    --- a/vendor/curl/lib/pop3.c
    +++ b/vendor/curl/lib/pop3.c
    @@ -5,7 +5,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2021, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -401,7 +401,7 @@ static CURLcode pop3_perform_user(struct Curl_easy *data,
     
       /* Check we have a username and password to authenticate with and end the
          connect phase if we don't */
    -  if(!conn->bits.user_passwd) {
    +  if(!data->state.aptr.user) {
         state(data, POP3_STOP);
     
         return result;
    @@ -435,7 +435,7 @@ static CURLcode pop3_perform_apop(struct Curl_easy *data,
     
       /* Check we have a username and password to authenticate with and end the
          connect phase if we don't */
    -  if(!conn->bits.user_passwd) {
    +  if(!data->state.aptr.user) {
         state(data, POP3_STOP);
     
         return result;
    @@ -545,7 +545,7 @@ static CURLcode pop3_perform_authentication(struct Curl_easy *data,
     
       /* Check we have enough data to authenticate with and end the
          connect phase if we don't */
    -  if(!Curl_sasl_can_authenticate(&pop3c->sasl, conn)) {
    +  if(!Curl_sasl_can_authenticate(&pop3c->sasl, data)) {
         state(data, POP3_STOP);
         return result;
       }
    @@ -1423,7 +1423,7 @@ static CURLcode pop3_parse_url_path(struct Curl_easy *data)
       const char *path = &data->state.up.path[1]; /* skip leading path */
     
       /* URL decode the path for the message ID */
    -  return Curl_urldecode(data, path, 0, &pop3->id, NULL, REJECT_CTRL);
    +  return Curl_urldecode(path, 0, &pop3->id, NULL, REJECT_CTRL);
     }
     
     /***********************************************************************
    @@ -1440,7 +1440,7 @@ static CURLcode pop3_parse_custom_request(struct Curl_easy *data)
     
       /* URL decode the custom request */
       if(custom)
    -    result = Curl_urldecode(data, custom, 0, &pop3->custom, NULL, REJECT_CTRL);
    +    result = Curl_urldecode(custom, 0, &pop3->custom, NULL, REJECT_CTRL);
     
       return result;
     }
    diff --git a/vendor/curl/lib/rtsp.c b/vendor/curl/lib/rtsp.c
    index 30fefb9b82..f16e87c12d 100644
    --- a/vendor/curl/lib/rtsp.c
    +++ b/vendor/curl/lib/rtsp.c
    @@ -5,7 +5,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2021, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -340,7 +340,7 @@ static CURLcode rtsp_do(struct Curl_easy *data, bool *done)
       }
     
       /* Transport Header for SETUP requests */
    -  p_transport = Curl_checkheaders(data, "Transport");
    +  p_transport = Curl_checkheaders(data, STRCONST("Transport"));
       if(rtspreq == RTSPREQ_SETUP && !p_transport) {
         /* New Transport: setting? */
         if(data->set.str[STRING_RTSP_TRANSPORT]) {
    @@ -364,11 +364,11 @@ static CURLcode rtsp_do(struct Curl_easy *data, bool *done)
       /* Accept Headers for DESCRIBE requests */
       if(rtspreq == RTSPREQ_DESCRIBE) {
         /* Accept Header */
    -    p_accept = Curl_checkheaders(data, "Accept")?
    +    p_accept = Curl_checkheaders(data, STRCONST("Accept"))?
           NULL:"Accept: application/sdp\r\n";
     
         /* Accept-Encoding header */
    -    if(!Curl_checkheaders(data, "Accept-Encoding") &&
    +    if(!Curl_checkheaders(data, STRCONST("Accept-Encoding")) &&
            data->set.str[STRING_ENCODING]) {
           Curl_safefree(data->state.aptr.accept_encoding);
           data->state.aptr.accept_encoding =
    @@ -385,11 +385,12 @@ static CURLcode rtsp_do(struct Curl_easy *data, bool *done)
          it might have been used in the proxy connect, but if we have got a header
          with the user-agent string specified, we erase the previously made string
          here. */
    -  if(Curl_checkheaders(data, "User-Agent") && data->state.aptr.uagent) {
    +  if(Curl_checkheaders(data, STRCONST("User-Agent")) &&
    +     data->state.aptr.uagent) {
         Curl_safefree(data->state.aptr.uagent);
         data->state.aptr.uagent = NULL;
       }
    -  else if(!Curl_checkheaders(data, "User-Agent") &&
    +  else if(!Curl_checkheaders(data, STRCONST("User-Agent")) &&
               data->set.str[STRING_USERAGENT]) {
         p_uagent = data->state.aptr.uagent;
       }
    @@ -405,7 +406,7 @@ static CURLcode rtsp_do(struct Curl_easy *data, bool *done)
     
       /* Referrer */
       Curl_safefree(data->state.aptr.ref);
    -  if(data->state.referer && !Curl_checkheaders(data, "Referer"))
    +  if(data->state.referer && !Curl_checkheaders(data, STRCONST("Referer")))
         data->state.aptr.ref = aprintf("Referer: %s\r\n", data->state.referer);
       else
         data->state.aptr.ref = NULL;
    @@ -422,7 +423,7 @@ static CURLcode rtsp_do(struct Curl_easy *data, bool *done)
          (rtspreq  & (RTSPREQ_PLAY | RTSPREQ_PAUSE | RTSPREQ_RECORD))) {
     
         /* Check to see if there is a range set in the custom headers */
    -    if(!Curl_checkheaders(data, "Range") && data->state.range) {
    +    if(!Curl_checkheaders(data, STRCONST("Range")) && data->state.range) {
           Curl_safefree(data->state.aptr.rangeline);
           data->state.aptr.rangeline = aprintf("Range: %s\r\n", data->state.range);
           p_range = data->state.aptr.rangeline;
    @@ -432,11 +433,11 @@ static CURLcode rtsp_do(struct Curl_easy *data, bool *done)
       /*
        * Sanity check the custom headers
        */
    -  if(Curl_checkheaders(data, "CSeq")) {
    +  if(Curl_checkheaders(data, STRCONST("CSeq"))) {
         failf(data, "CSeq cannot be set as a custom header.");
         return CURLE_RTSP_CSEQ_ERROR;
       }
    -  if(Curl_checkheaders(data, "Session")) {
    +  if(Curl_checkheaders(data, STRCONST("Session"))) {
         failf(data, "Session ID cannot be set as a custom header.");
         return CURLE_BAD_FUNCTION_ARGUMENT;
       }
    @@ -523,7 +524,7 @@ static CURLcode rtsp_do(struct Curl_easy *data, bool *done)
         if(putsize > 0 || postsize > 0) {
           /* As stated in the http comments, it is probably not wise to
            * actually set a custom Content-Length in the headers */
    -      if(!Curl_checkheaders(data, "Content-Length")) {
    +      if(!Curl_checkheaders(data, STRCONST("Content-Length"))) {
             result =
               Curl_dyn_addf(&req_buffer,
                             "Content-Length: %" CURL_FORMAT_CURL_OFF_T"\r\n",
    @@ -534,18 +535,20 @@ static CURLcode rtsp_do(struct Curl_easy *data, bool *done)
     
           if(rtspreq == RTSPREQ_SET_PARAMETER ||
              rtspreq == RTSPREQ_GET_PARAMETER) {
    -        if(!Curl_checkheaders(data, "Content-Type")) {
    -          result = Curl_dyn_addf(&req_buffer,
    -                                 "Content-Type: text/parameters\r\n");
    +        if(!Curl_checkheaders(data, STRCONST("Content-Type"))) {
    +          result = Curl_dyn_addn(&req_buffer,
    +                                 STRCONST("Content-Type: "
    +                                          "text/parameters\r\n"));
               if(result)
                 return result;
             }
           }
     
           if(rtspreq == RTSPREQ_ANNOUNCE) {
    -        if(!Curl_checkheaders(data, "Content-Type")) {
    -          result = Curl_dyn_addf(&req_buffer,
    -                                 "Content-Type: application/sdp\r\n");
    +        if(!Curl_checkheaders(data, STRCONST("Content-Type"))) {
    +          result = Curl_dyn_addn(&req_buffer,
    +                                 STRCONST("Content-Type: "
    +                                          "application/sdp\r\n"));
               if(result)
                 return result;
             }
    @@ -563,7 +566,7 @@ static CURLcode rtsp_do(struct Curl_easy *data, bool *done)
       /* RTSP never allows chunked transfer */
       data->req.forbidchunk = TRUE;
       /* Finish the request buffer */
    -  result = Curl_dyn_add(&req_buffer, "\r\n");
    +  result = Curl_dyn_addn(&req_buffer, STRCONST("\r\n"));
       if(result)
         return result;
     
    diff --git a/vendor/curl/lib/select.c b/vendor/curl/lib/select.c
    index 70d7ee5c26..1de207725f 100644
    --- a/vendor/curl/lib/select.c
    +++ b/vendor/curl/lib/select.c
    @@ -5,7 +5,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2021, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -34,19 +34,10 @@
     #error "We can't compile without select() or poll() support."
     #endif
     
    -#if defined(__BEOS__) && !defined(__HAIKU__)
    -/* BeOS has FD_SET defined in socket.h */
    -#include 
    -#endif
    -
     #ifdef MSDOS
     #include   /* delay() */
     #endif
     
    -#ifdef __VXWORKS__
    -#include   /* bzero() in FD_SET */
    -#endif
    -
     #include 
     
     #include "urldata.h"
    @@ -450,23 +441,3 @@ int Curl_poll(struct pollfd ufds[], unsigned int nfds, timediff_t timeout_ms)
     
       return r;
     }
    -
    -#ifdef TPF
    -/*
    - * This is a replacement for select() on the TPF platform.
    - * It is used whenever libcurl calls select().
    - * The call below to tpf_process_signals() is required because
    - * TPF's select calls are not signal interruptible.
    - *
    - * Return values are the same as select's.
    - */
    -int tpf_select_libcurl(int maxfds, fd_set *reads, fd_set *writes,
    -                       fd_set *excepts, struct timeval *tv)
    -{
    -   int rc;
    -
    -   rc = tpf_select_bsd(maxfds, reads, writes, excepts, tv);
    -   tpf_process_signals();
    -   return rc;
    -}
    -#endif /* TPF */
    diff --git a/vendor/curl/lib/select.h b/vendor/curl/lib/select.h
    index 59a571dbbd..f4bcba30fb 100644
    --- a/vendor/curl/lib/select.h
    +++ b/vendor/curl/lib/select.h
    @@ -7,7 +7,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2021, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -83,22 +83,11 @@ int Curl_socket_check(curl_socket_t readfd, curl_socket_t readfd2,
     int Curl_poll(struct pollfd ufds[], unsigned int nfds, timediff_t timeout_ms);
     int Curl_wait_ms(timediff_t timeout_ms);
     
    -#ifdef TPF
    -int tpf_select_libcurl(int maxfds, fd_set* reads, fd_set* writes,
    -                       fd_set* excepts, struct timeval *tv);
    -#endif
    -
    -/* TPF sockets are not in range [0..FD_SETSIZE-1], which
    -   unfortunately makes it impossible for us to easily check if they're valid
    -
    +/*
        With Winsock the valid range is [0..INVALID_SOCKET-1] according to
        https://docs.microsoft.com/en-us/windows/win32/winsock/socket-data-type-2
     */
    -#if defined(TPF)
    -#define VALID_SOCK(x) 1
    -#define VERIFY_SOCK(x) Curl_nop_stmt
    -#define FDSET_SOCK(x) 1
    -#elif defined(USE_WINSOCK)
    +#ifdef USE_WINSOCK
     #define VALID_SOCK(s) ((s) < INVALID_SOCKET)
     #define FDSET_SOCK(x) 1
     #define VERIFY_SOCK(x) do { \
    diff --git a/vendor/curl/lib/sendf.c b/vendor/curl/lib/sendf.c
    index bcfa27a501..220c7dd7ba 100644
    --- a/vendor/curl/lib/sendf.c
    +++ b/vendor/curl/lib/sendf.c
    @@ -5,7 +5,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2021, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -41,7 +41,6 @@
     #include "vssh/ssh.h"
     #include "easyif.h"
     #include "multiif.h"
    -#include "non-ascii.h"
     #include "strerror.h"
     #include "select.h"
     #include "strdup.h"
    @@ -628,19 +627,14 @@ CURLcode Curl_client_write(struct Curl_easy *data,
     
       /* FTP data may need conversion. */
       if((type & CLIENTWRITE_BODY) &&
    -    (conn->handler->protocol & PROTO_FAMILY_FTP) &&
    -    conn->proto.ftpc.transfertype == 'A') {
    -    /* convert from the network encoding */
    -    CURLcode result = Curl_convert_from_network(data, ptr, len);
    -    /* Curl_convert_from_network calls failf if unsuccessful */
    -    if(result)
    -      return result;
    +     (conn->handler->protocol & PROTO_FAMILY_FTP) &&
    +     conn->proto.ftpc.transfertype == 'A') {
     
     #ifdef CURL_DO_LINEEND_CONV
         /* convert end-of-line markers */
         len = convert_lineends(data, ptr, len);
     #endif /* CURL_DO_LINEEND_CONV */
    -    }
    +  }
     
       return chop_write(data, type, ptr, len);
     }
    @@ -716,44 +710,6 @@ int Curl_debug(struct Curl_easy *data, curl_infotype type,
       if(data->set.verbose) {
         static const char s_infotype[CURLINFO_END][3] = {
           "* ", "< ", "> ", "{ ", "} ", "{ ", "} " };
    -
    -#ifdef CURL_DOES_CONVERSIONS
    -    char *buf = NULL;
    -    size_t conv_size = 0;
    -
    -    switch(type) {
    -    case CURLINFO_HEADER_OUT:
    -      buf = Curl_memdup(ptr, size);
    -      if(!buf)
    -        return 1;
    -      conv_size = size;
    -
    -      /* Special processing is needed for this block if it
    -       * contains both headers and data (separated by CRLFCRLF).
    -       * We want to convert just the headers, leaving the data as-is.
    -       */
    -      if(size > 4) {
    -        size_t i;
    -        for(i = 0; i < size-4; i++) {
    -          if(memcmp(&buf[i], "\x0d\x0a\x0d\x0a", 4) == 0) {
    -            /* convert everything through this CRLFCRLF but no further */
    -            conv_size = i + 4;
    -            break;
    -          }
    -        }
    -      }
    -
    -      Curl_convert_from_network(data, buf, conv_size);
    -      /* Curl_convert_from_network calls failf if unsuccessful */
    -      /* we might as well continue even if it fails...   */
    -      ptr = buf; /* switch pointer to use my buffer instead */
    -      break;
    -    default:
    -      /* leave everything else as-is */
    -      break;
    -    }
    -#endif /* CURL_DOES_CONVERSIONS */
    -
         if(data->set.fdebug) {
           Curl_set_in_callback(data, true);
           rc = (*data->set.fdebug)(data, type, ptr, size, data->set.debugdata);
    @@ -766,20 +722,11 @@ int Curl_debug(struct Curl_easy *data, curl_infotype type,
           case CURLINFO_HEADER_IN:
             fwrite(s_infotype[type], 2, 1, data->set.err);
             fwrite(ptr, size, 1, data->set.err);
    -#ifdef CURL_DOES_CONVERSIONS
    -        if(size != conv_size) {
    -          /* we had untranslated data so we need an explicit newline */
    -          fwrite("\n", 1, 1, data->set.err);
    -        }
    -#endif
             break;
           default: /* nada */
             break;
           }
         }
    -#ifdef CURL_DOES_CONVERSIONS
    -    free(buf);
    -#endif
       }
       return rc;
     }
    diff --git a/vendor/curl/lib/setopt.c b/vendor/curl/lib/setopt.c
    index 599ed5d994..8e1bf12791 100644
    --- a/vendor/curl/lib/setopt.c
    +++ b/vendor/curl/lib/setopt.c
    @@ -5,7 +5,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2021, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -62,19 +62,12 @@ CURLcode Curl_setstropt(char **charp, const char *s)
       Curl_safefree(*charp);
     
       if(s) {
    -    char *str = strdup(s);
    +    if(strlen(s) > CURL_MAX_INPUT_LENGTH)
    +      return CURLE_BAD_FUNCTION_ARGUMENT;
     
    -    if(str) {
    -      size_t len = strlen(str);
    -      if(len > CURL_MAX_INPUT_LENGTH) {
    -        free(str);
    -        return CURLE_BAD_FUNCTION_ARGUMENT;
    -      }
    -    }
    -    if(!str)
    +    *charp = strdup(s);
    +    if(!*charp)
           return CURLE_OUT_OF_MEMORY;
    -
    -    *charp = str;
       }
     
       return CURLE_OK;
    @@ -162,7 +155,9 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
       char *argptr;
       CURLcode result = CURLE_OK;
       long arg;
    +#ifdef ENABLE_IPV6
       unsigned long uarg;
    +#endif
       curl_off_t bigsize;
     
       switch(option) {
    @@ -1650,24 +1645,6 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
          */
         data->set.seek_client = va_arg(param, void *);
         break;
    -  case CURLOPT_CONV_FROM_NETWORK_FUNCTION:
    -    /*
    -     * "Convert from network encoding" callback
    -     */
    -    data->set.convfromnetwork = va_arg(param, curl_conv_callback);
    -    break;
    -  case CURLOPT_CONV_TO_NETWORK_FUNCTION:
    -    /*
    -     * "Convert to network encoding" callback
    -     */
    -    data->set.convtonetwork = va_arg(param, curl_conv_callback);
    -    break;
    -  case CURLOPT_CONV_FROM_UTF8_FUNCTION:
    -    /*
    -     * "Convert from UTF-8 encoding" callback
    -     */
    -    data->set.convfromutf8 = va_arg(param, curl_conv_callback);
    -    break;
       case CURLOPT_IOCTLFUNCTION:
         /*
          * I/O control callback. Might be NULL.
    @@ -2558,6 +2535,7 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
         break;
     #endif
     
    +#ifdef ENABLE_IPV6
       case CURLOPT_ADDRESS_SCOPE:
         /*
          * Use this scope id when using IPv6
    @@ -2571,6 +2549,7 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
     #endif
         data->set.scope_id = (unsigned int)uarg;
         break;
    +#endif
     
       case CURLOPT_PROTOCOLS:
         /* set the bitmask for the protocols that are allowed to be used for the
    @@ -2769,30 +2748,30 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
         if(data->set.str[STRING_TLSAUTH_USERNAME] && !data->set.ssl.authtype)
           data->set.ssl.authtype = CURL_TLSAUTH_SRP; /* default to SRP */
         break;
    +#ifndef CURL_DISABLE_PROXY
       case CURLOPT_PROXY_TLSAUTH_USERNAME:
         result = Curl_setstropt(&data->set.str[STRING_TLSAUTH_USERNAME_PROXY],
                                 va_arg(param, char *));
    -#ifndef CURL_DISABLE_PROXY
         if(data->set.str[STRING_TLSAUTH_USERNAME_PROXY] &&
            !data->set.proxy_ssl.authtype)
           data->set.proxy_ssl.authtype = CURL_TLSAUTH_SRP; /* default to SRP */
    -#endif
         break;
    +#endif
       case CURLOPT_TLSAUTH_PASSWORD:
         result = Curl_setstropt(&data->set.str[STRING_TLSAUTH_PASSWORD],
                                 va_arg(param, char *));
         if(data->set.str[STRING_TLSAUTH_USERNAME] && !data->set.ssl.authtype)
           data->set.ssl.authtype = CURL_TLSAUTH_SRP; /* default to SRP */
         break;
    +#ifndef CURL_DISABLE_PROXY
       case CURLOPT_PROXY_TLSAUTH_PASSWORD:
         result = Curl_setstropt(&data->set.str[STRING_TLSAUTH_PASSWORD_PROXY],
                                 va_arg(param, char *));
    -#ifndef CURL_DISABLE_PROXY
         if(data->set.str[STRING_TLSAUTH_USERNAME_PROXY] &&
            !data->set.proxy_ssl.authtype)
           data->set.proxy_ssl.authtype = CURL_TLSAUTH_SRP; /* default to SRP */
    -#endif
         break;
    +#endif
       case CURLOPT_TLSAUTH_TYPE:
         argptr = va_arg(param, char *);
         if(!argptr ||
    diff --git a/vendor/curl/lib/sha256.c b/vendor/curl/lib/sha256.c
    index cf7ea4f543..1e879f60f6 100644
    --- a/vendor/curl/lib/sha256.c
    +++ b/vendor/curl/lib/sha256.c
    @@ -6,7 +6,7 @@
      *                             \___|\___/|_| \_\_____|
      *
      * Copyright (C) 2017, Florin Petriuc, 
    - * Copyright (C) 2018 - 2021, Daniel Stenberg, , et al.
    + * Copyright (C) 2018 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -40,7 +40,7 @@
     
     #include 
     
    -#if (OPENSSL_VERSION_NUMBER >= 0x0090700fL)
    +#if (OPENSSL_VERSION_NUMBER >= 0x0090800fL)
     #define USE_OPENSSL_SHA256
     #endif
     
    @@ -69,8 +69,14 @@
     
     #if defined(USE_OPENSSL_SHA256)
     
    -/* When OpenSSL is available we use the SHA256-function from OpenSSL */
    +/* When OpenSSL or wolfSSL is available is available we use their
    + * SHA256-functions.
    + */
    +#if defined(USE_OPENSSL)
     #include 
    +#elif defined(USE_WOLFSSL)
    +#include 
    +#endif
     
     #include "curl_memory.h"
     
    diff --git a/vendor/curl/lib/smb.c b/vendor/curl/lib/smb.c
    index fd49cf6aaf..8f44704a2c 100644
    --- a/vendor/curl/lib/smb.c
    +++ b/vendor/curl/lib/smb.c
    @@ -5,7 +5,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 2016 - 2021, Daniel Stenberg, , et al.
    + * Copyright (C) 2016 - 2022, Daniel Stenberg, , et al.
      * Copyright (C) 2014, Bill Nagel , Exacq Technologies
      *
      * This software is licensed as described in the file COPYING, which
    @@ -262,7 +262,7 @@ static CURLcode smb_connect(struct Curl_easy *data, bool *done)
       (void) done;
     
       /* Check we have a username and password to authenticate with */
    -  if(!conn->bits.user_passwd)
    +  if(!data->state.aptr.user)
         return CURLE_LOGIN_DENIED;
     
       /* Initialize the connection state */
    @@ -299,6 +299,7 @@ static CURLcode smb_connect(struct Curl_easy *data, bool *done)
     static CURLcode smb_recv_message(struct Curl_easy *data, void **msg)
     {
       struct connectdata *conn = data->conn;
    +  curl_socket_t sockfd = conn->sock[FIRSTSOCKET];
       struct smb_conn *smbc = &conn->proto.smbc;
       char *buf = smbc->recv_buf;
       ssize_t bytes_read;
    @@ -307,7 +308,7 @@ static CURLcode smb_recv_message(struct Curl_easy *data, void **msg)
       size_t len = MAX_MESSAGE_SIZE - smbc->got;
       CURLcode result;
     
    -  result = Curl_read(data, FIRSTSOCKET, buf + smbc->got, len, &bytes_read);
    +  result = Curl_read(data, sockfd, buf + smbc->got, len, &bytes_read);
       if(result)
         return result;
     
    @@ -377,11 +378,12 @@ static CURLcode smb_send(struct Curl_easy *data, ssize_t len,
                              size_t upload_size)
     {
       struct connectdata *conn = data->conn;
    +  curl_socket_t sockfd = conn->sock[FIRSTSOCKET];
       struct smb_conn *smbc = &conn->proto.smbc;
       ssize_t bytes_written;
       CURLcode result;
     
    -  result = Curl_write(data, FIRSTSOCKET, data->state.ulbuf,
    +  result = Curl_write(data, sockfd, data->state.ulbuf,
                           len, &bytes_written);
       if(result)
         return result;
    @@ -399,6 +401,7 @@ static CURLcode smb_send(struct Curl_easy *data, ssize_t len,
     static CURLcode smb_flush(struct Curl_easy *data)
     {
       struct connectdata *conn = data->conn;
    +  curl_socket_t sockfd = conn->sock[FIRSTSOCKET];
       struct smb_conn *smbc = &conn->proto.smbc;
       ssize_t bytes_written;
       ssize_t len = smbc->send_size - smbc->sent;
    @@ -407,7 +410,7 @@ static CURLcode smb_flush(struct Curl_easy *data)
       if(!smbc->send_size)
         return CURLE_OK;
     
    -  result = Curl_write(data, FIRSTSOCKET,
    +  result = Curl_write(data, sockfd,
                           data->state.ulbuf + smbc->sent,
                           len, &bytes_written);
       if(result)
    @@ -459,14 +462,10 @@ static CURLcode smb_send_setup(struct Curl_easy *data)
       if(byte_count > sizeof(msg.bytes))
         return CURLE_FILESIZE_EXCEEDED;
     
    -  Curl_ntlm_core_mk_lm_hash(data, conn->passwd, lm_hash);
    +  Curl_ntlm_core_mk_lm_hash(conn->passwd, lm_hash);
       Curl_ntlm_core_lm_resp(lm_hash, smbc->challenge, lm);
    -#ifdef USE_NTRESPONSES
    -  Curl_ntlm_core_mk_nt_hash(data, conn->passwd, nt_hash);
    +  Curl_ntlm_core_mk_nt_hash(conn->passwd, nt_hash);
       Curl_ntlm_core_lm_resp(nt_hash, smbc->challenge, nt);
    -#else
    -  memset(nt, 0, sizeof(nt));
    -#endif
     
       memset(&msg, 0, sizeof(msg));
       msg.word_count = SMB_WC_SETUP_ANDX;
    @@ -989,7 +988,7 @@ static CURLcode smb_parse_url_path(struct Curl_easy *data,
       char *slash;
     
       /* URL decode the path */
    -  CURLcode result = Curl_urldecode(data, data->state.up.path, 0, &path, NULL,
    +  CURLcode result = Curl_urldecode(data->state.up.path, 0, &path, NULL,
                                        REJECT_CTRL);
       if(result)
         return result;
    diff --git a/vendor/curl/lib/smtp.c b/vendor/curl/lib/smtp.c
    index 6c08293783..28aa44a49a 100644
    --- a/vendor/curl/lib/smtp.c
    +++ b/vendor/curl/lib/smtp.c
    @@ -5,7 +5,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2021, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -492,7 +492,7 @@ static CURLcode smtp_perform_authentication(struct Curl_easy *data)
       /* Check we have enough data to authenticate with, and the
          server supports authentication, and end the connect phase if not */
       if(!smtpc->auth_supported ||
    -     !Curl_sasl_can_authenticate(&smtpc->sasl, conn)) {
    +     !Curl_sasl_can_authenticate(&smtpc->sasl, data)) {
         state(data, SMTP_STOP);
         return result;
       }
    @@ -698,7 +698,7 @@ static CURLcode smtp_perform_mail(struct Curl_easy *data)
                                            NULL, MIMESTRATEGY_MAIL);
     
         if(!result)
    -      if(!Curl_checkheaders(data, "Mime-Version"))
    +      if(!Curl_checkheaders(data, STRCONST("Mime-Version")))
             result = Curl_mime_add_header(&data->set.mimepost.curlheaders,
                                           "Mime-Version: 1.0");
     
    @@ -1724,8 +1724,7 @@ static CURLcode smtp_parse_url_path(struct Curl_easy *data)
       }
     
       /* URL decode the path and use it as the domain in our EHLO */
    -  return Curl_urldecode(data, path, 0, &smtpc->domain, NULL,
    -                        REJECT_CTRL);
    +  return Curl_urldecode(path, 0, &smtpc->domain, NULL, REJECT_CTRL);
     }
     
     /***********************************************************************
    @@ -1742,7 +1741,7 @@ static CURLcode smtp_parse_custom_request(struct Curl_easy *data)
     
       /* URL decode the custom request */
       if(custom)
    -    result = Curl_urldecode(data, custom, 0, &smtp->custom, NULL, REJECT_CTRL);
    +    result = Curl_urldecode(custom, 0, &smtp->custom, NULL, REJECT_CTRL);
     
       return result;
     }
    diff --git a/vendor/curl/lib/strcase.c b/vendor/curl/lib/strcase.c
    index 955e3c79ea..dd46ca1ba0 100644
    --- a/vendor/curl/lib/strcase.c
    +++ b/vendor/curl/lib/strcase.c
    @@ -5,7 +5,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2020, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -28,142 +28,25 @@
     
     static char raw_tolower(char in);
     
    -/* Portable, consistent toupper (remember EBCDIC). Do not use toupper() because
    -   its behavior is altered by the current locale. */
    +/* Portable, consistent toupper. Do not use toupper() because its behavior is
    +   altered by the current locale. */
     char Curl_raw_toupper(char in)
     {
    -#if !defined(CURL_DOES_CONVERSIONS)
       if(in >= 'a' && in <= 'z')
         return (char)('A' + in - 'a');
    -#else
    -  switch(in) {
    -  case 'a':
    -    return 'A';
    -  case 'b':
    -    return 'B';
    -  case 'c':
    -    return 'C';
    -  case 'd':
    -    return 'D';
    -  case 'e':
    -    return 'E';
    -  case 'f':
    -    return 'F';
    -  case 'g':
    -    return 'G';
    -  case 'h':
    -    return 'H';
    -  case 'i':
    -    return 'I';
    -  case 'j':
    -    return 'J';
    -  case 'k':
    -    return 'K';
    -  case 'l':
    -    return 'L';
    -  case 'm':
    -    return 'M';
    -  case 'n':
    -    return 'N';
    -  case 'o':
    -    return 'O';
    -  case 'p':
    -    return 'P';
    -  case 'q':
    -    return 'Q';
    -  case 'r':
    -    return 'R';
    -  case 's':
    -    return 'S';
    -  case 't':
    -    return 'T';
    -  case 'u':
    -    return 'U';
    -  case 'v':
    -    return 'V';
    -  case 'w':
    -    return 'W';
    -  case 'x':
    -    return 'X';
    -  case 'y':
    -    return 'Y';
    -  case 'z':
    -    return 'Z';
    -  }
    -#endif
    -
       return in;
     }
     
     
    -/* Portable, consistent tolower (remember EBCDIC). Do not use tolower() because
    -   its behavior is altered by the current locale. */
    +/* Portable, consistent tolower. Do not use tolower() because its behavior is
    +   altered by the current locale. */
     static char raw_tolower(char in)
     {
    -#if !defined(CURL_DOES_CONVERSIONS)
       if(in >= 'A' && in <= 'Z')
         return (char)('a' + in - 'A');
    -#else
    -  switch(in) {
    -  case 'A':
    -    return 'a';
    -  case 'B':
    -    return 'b';
    -  case 'C':
    -    return 'c';
    -  case 'D':
    -    return 'd';
    -  case 'E':
    -    return 'e';
    -  case 'F':
    -    return 'f';
    -  case 'G':
    -    return 'g';
    -  case 'H':
    -    return 'h';
    -  case 'I':
    -    return 'i';
    -  case 'J':
    -    return 'j';
    -  case 'K':
    -    return 'k';
    -  case 'L':
    -    return 'l';
    -  case 'M':
    -    return 'm';
    -  case 'N':
    -    return 'n';
    -  case 'O':
    -    return 'o';
    -  case 'P':
    -    return 'p';
    -  case 'Q':
    -    return 'q';
    -  case 'R':
    -    return 'r';
    -  case 'S':
    -    return 's';
    -  case 'T':
    -    return 't';
    -  case 'U':
    -    return 'u';
    -  case 'V':
    -    return 'v';
    -  case 'W':
    -    return 'w';
    -  case 'X':
    -    return 'x';
    -  case 'Y':
    -    return 'y';
    -  case 'Z':
    -    return 'z';
    -  }
    -#endif
    -
       return in;
     }
     
    -
     /*
      * Curl_strcasecompare() is for doing "raw" case insensitive strings. This is
      * meant to be locale independent and only compare strings we know are safe
    @@ -171,9 +54,6 @@ static char raw_tolower(char in)
      * https://daniel.haxx.se/blog/2008/10/15/strcasecmp-in-turkish/ for some
      * further explanation to why this function is necessary.
      *
    - * The function is capable of comparing a-z case insensitively even for
    - * non-ascii.
    - *
      * @unittest: 1301
      */
     
    diff --git a/vendor/curl/lib/strcase.h b/vendor/curl/lib/strcase.h
    index 10dc698817..b628656b97 100644
    --- a/vendor/curl/lib/strcase.h
    +++ b/vendor/curl/lib/strcase.h
    @@ -7,7 +7,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2020, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -28,8 +28,7 @@
      * Only "raw" case insensitive strings. This is meant to be locale independent
      * and only compare strings we know are safe for this.
      *
    - * The function is capable of comparing a-z case insensitively even for
    - * non-ascii.
    + * The function is capable of comparing a-z case insensitively.
      */
     
     #define strcasecompare(a,b) Curl_strcasecompare(a,b)
    @@ -42,8 +41,8 @@ int Curl_strncasecompare(const char *first, const char *second, size_t max);
     char Curl_raw_toupper(char in);
     
     /* checkprefix() is a shorter version of the above, used when the first
    -   argument is zero-byte terminated */
    -#define checkprefix(a,b)    curl_strnequal(a,b,strlen(a))
    +   argument is the string literal */
    +#define checkprefix(a,b)    curl_strnequal(b, STRCONST(a))
     
     void Curl_strntoupper(char *dest, const char *src, size_t n);
     void Curl_strntolower(char *dest, const char *src, size_t n);
    diff --git a/vendor/curl/lib/strerror.c b/vendor/curl/lib/strerror.c
    index 07d73a74b7..781e26b69f 100644
    --- a/vendor/curl/lib/strerror.c
    +++ b/vendor/curl/lib/strerror.c
    @@ -5,7 +5,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 2004 - 2021, Daniel Stenberg, , et al.
    + * Copyright (C) 2004 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -24,12 +24,9 @@
     
     #ifdef HAVE_STRERROR_R
     #  if (!defined(HAVE_POSIX_STRERROR_R) && \
    -       !defined(HAVE_GLIBC_STRERROR_R) && \
    -       !defined(HAVE_VXWORKS_STRERROR_R)) || \
    -      (defined(HAVE_POSIX_STRERROR_R) && defined(HAVE_VXWORKS_STRERROR_R)) || \
    -      (defined(HAVE_GLIBC_STRERROR_R) && defined(HAVE_VXWORKS_STRERROR_R)) || \
    +       !defined(HAVE_GLIBC_STRERROR_R)) || \
           (defined(HAVE_POSIX_STRERROR_R) && defined(HAVE_GLIBC_STRERROR_R))
    -#    error "strerror_r MUST be either POSIX, glibc or vxworks-style"
    +#    error "strerror_r MUST be either POSIX, glibc style"
     #  endif
     #endif
     
    @@ -224,9 +221,6 @@ curl_easy_strerror(CURLcode error)
       case CURLE_BAD_CONTENT_ENCODING:
         return "Unrecognized or bad HTTP Content or Transfer-Encoding";
     
    -  case CURLE_LDAP_INVALID_URL:
    -    return "Invalid LDAP URL";
    -
       case CURLE_FILESIZE_EXCEEDED:
         return "Maximum file size exceeded";
     
    @@ -272,9 +266,6 @@ curl_easy_strerror(CURLcode error)
       case CURLE_CONV_FAILED:
         return "Conversion failed";
     
    -  case CURLE_CONV_REQD:
    -    return "Caller must register CURLOPT_CONV_ callback options";
    -
       case CURLE_REMOTE_FILE_NOT_FOUND:
         return "Remote file not found";
     
    @@ -337,6 +328,8 @@ curl_easy_strerror(CURLcode error)
       case CURLE_OBSOLETE50:
       case CURLE_OBSOLETE51:
       case CURLE_OBSOLETE57:
    +  case CURLE_OBSOLETE62:
    +  case CURLE_OBSOLETE76:
       case CURL_LAST:
         break;
       }
    @@ -883,18 +876,6 @@ const char *Curl_strerror(int err, char *buf, size_t buflen)
         else
           msnprintf(buf, max, "Unknown error %d", err);
       }
    -#elif defined(HAVE_STRERROR_R) && defined(HAVE_VXWORKS_STRERROR_R)
    - /*
    -  * The vxworks-style strerror_r() does use the buffer we pass to the function.
    -  * The buffer size should be at least NAME_MAX (256)
    -  */
    -  {
    -    char buffer[256];
    -    if(OK == strerror_r(err, buffer))
    -      strncpy(buf, buffer, max);
    -    else
    -      msnprintf(buf, max, "Unknown error %d", err);
    -  }
     #else
       {
         /* !checksrc! disable STRERROR 1 */
    diff --git a/vendor/curl/lib/telnet.c b/vendor/curl/lib/telnet.c
    index a81bb81c36..e709973244 100644
    --- a/vendor/curl/lib/telnet.c
    +++ b/vendor/curl/lib/telnet.c
    @@ -5,7 +5,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2021, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -781,7 +781,7 @@ static CURLcode check_telnet_options(struct Curl_easy *data)
     
       /* Add the user name as an environment variable if it
          was given on the command line */
    -  if(conn->bits.user_passwd) {
    +  if(data->state.aptr.user) {
         msnprintf(option_arg, sizeof(option_arg), "USER,%s", conn->user);
         beg = curl_slist_append(tn->telnet_vars, option_arg);
         if(!beg) {
    diff --git a/vendor/curl/lib/tftp.c b/vendor/curl/lib/tftp.c
    index f8c68441ca..7f2c88b71e 100644
    --- a/vendor/curl/lib/tftp.c
    +++ b/vendor/curl/lib/tftp.c
    @@ -5,7 +5,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2021, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -327,7 +327,7 @@ static CURLcode tftp_parse_option_ack(struct tftp_state_data *state,
     
         infof(data, "got option=(%s) value=(%s)", option, value);
     
    -    if(checkprefix(option, TFTP_OPTION_BLKSIZE)) {
    +    if(checkprefix(TFTP_OPTION_BLKSIZE, option)) {
           long blksize;
     
           blksize = strtol(value, NULL, 10);
    @@ -359,7 +359,7 @@ static CURLcode tftp_parse_option_ack(struct tftp_state_data *state,
           infof(data, "%s (%d) %s (%d)", "blksize parsed from OACK",
                 state->blksize, "requested", state->requested_blksize);
         }
    -    else if(checkprefix(option, TFTP_OPTION_TSIZE)) {
    +    else if(checkprefix(TFTP_OPTION_TSIZE, option)) {
           long tsize = 0;
     
           tsize = strtol(value, NULL, 10);
    @@ -463,7 +463,7 @@ static CURLcode tftp_send_first(struct tftp_state_data *state,
         /* As RFC3617 describes the separator slash is not actually part of the
            file name so we skip the always-present first letter of the path
            string. */
    -    result = Curl_urldecode(data, &state->data->state.up.path[1], 0,
    +    result = Curl_urldecode(&state->data->state.up.path[1], 0,
                                 &filename, NULL, REJECT_ZERO);
         if(result)
           return result;
    diff --git a/vendor/curl/lib/transfer.c b/vendor/curl/lib/transfer.c
    index 22704fa158..1f8019b3d0 100644
    --- a/vendor/curl/lib/transfer.c
    +++ b/vendor/curl/lib/transfer.c
    @@ -5,7 +5,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2021, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -73,7 +73,6 @@
     #include "select.h"
     #include "multiif.h"
     #include "connect.h"
    -#include "non-ascii.h"
     #include "http2.h"
     #include "mime.h"
     #include "strcase.h"
    @@ -95,10 +94,10 @@
      * Returns a pointer to the first matching header or NULL if none matched.
      */
     char *Curl_checkheaders(const struct Curl_easy *data,
    -                        const char *thisheader)
    +                        const char *thisheader,
    +                        const size_t thislen)
     {
       struct curl_slist *head;
    -  size_t thislen = strlen(thisheader);
       DEBUGASSERT(thislen);
       DEBUGASSERT(thisheader[thislen-1] != ':');
     
    @@ -165,20 +164,6 @@ CURLcode Curl_fillreadbuffer(struct Curl_easy *data, size_t bytes,
       curl_read_callback readfunc = NULL;
       void *extra_data = NULL;
     
    -#ifdef CURL_DOES_CONVERSIONS
    -  bool sending_http_headers = FALSE;
    -  struct connectdata *conn = data->conn;
    -
    -  if(conn->handler->protocol&(PROTO_FAMILY_HTTP|CURLPROTO_RTSP)) {
    -    const struct HTTP *http = data->req.p.http;
    -
    -    if(http->sending == HTTPSEND_REQUEST)
    -      /* We're sending the HTTP request headers, not the data.
    -         Remember that so we don't re-translate them into garbage. */
    -      sending_http_headers = TRUE;
    -  }
    -#endif
    -
     #ifndef CURL_DISABLE_HTTP
       if(data->state.trailers_state == TRAILERS_INITIALIZED) {
         struct curl_slist *trailers = NULL;
    @@ -347,26 +332,6 @@ CURLcode Curl_fillreadbuffer(struct Curl_easy *data, size_t bytes,
           }
         }
     
    -#ifdef CURL_DOES_CONVERSIONS
    -    {
    -      CURLcode result;
    -      size_t length;
    -      if(data->state.prefer_ascii)
    -        /* translate the protocol and data */
    -        length = nread;
    -      else
    -        /* just translate the protocol portion */
    -        length = hexlen;
    -      if(length) {
    -        result = Curl_convert_to_network(data, data->req.upload_fromhere,
    -                                         length);
    -        /* Curl_convert_to_network calls failf if unsuccessful */
    -        if(result)
    -          return result;
    -      }
    -    }
    -#endif /* CURL_DOES_CONVERSIONS */
    -
     #ifndef CURL_DISABLE_HTTP
         if(data->state.trailers_state == TRAILERS_SENDING &&
            !trailers_left(data)) {
    @@ -391,15 +356,6 @@ CURLcode Curl_fillreadbuffer(struct Curl_easy *data, size_t bytes,
         if(added_crlf)
           nread += strlen(endofline_network); /* for the added end of line */
       }
    -#ifdef CURL_DOES_CONVERSIONS
    -  else if((data->state.prefer_ascii) && (!sending_http_headers)) {
    -    CURLcode result;
    -    result = Curl_convert_to_network(data, data->req.upload_fromhere, nread);
    -    /* Curl_convert_to_network calls failf if unsuccessful */
    -    if(result)
    -      return result;
    -  }
    -#endif /* CURL_DOES_CONVERSIONS */
     
       *nreadp = nread;
     
    diff --git a/vendor/curl/lib/transfer.h b/vendor/curl/lib/transfer.h
    index 0fa3d55e82..56d2fd1ee3 100644
    --- a/vendor/curl/lib/transfer.h
    +++ b/vendor/curl/lib/transfer.h
    @@ -7,7 +7,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2021, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -24,7 +24,8 @@
     
     #define Curl_headersep(x) ((((x)==':') || ((x)==';')))
     char *Curl_checkheaders(const struct Curl_easy *data,
    -                        const char *thisheader);
    +                        const char *thisheader,
    +                        const size_t thislen);
     
     void Curl_init_CONNECT(struct Curl_easy *data);
     
    diff --git a/vendor/curl/lib/url.c b/vendor/curl/lib/url.c
    index 9f1013554f..adef2cdb36 100644
    --- a/vendor/curl/lib/url.c
    +++ b/vendor/curl/lib/url.c
    @@ -99,7 +99,6 @@ bool curl_win32_idn_to_ascii(const char *in, char **out);
     #include "easyif.h"
     #include "speedcheck.h"
     #include "warnless.h"
    -#include "non-ascii.h"
     #include "getinfo.h"
     #include "urlapi-int.h"
     #include "system_win32.h"
    @@ -137,15 +136,6 @@ bool curl_win32_idn_to_ascii(const char *in, char **out);
     #include "curl_memory.h"
     #include "memdebug.h"
     
    -/* Count of the backend ssl objects to allocate */
    -#ifdef USE_SSL
    -#  ifndef CURL_DISABLE_PROXY
    -#    define SSL_BACKEND_CNT 4
    -#  else
    -#    define SSL_BACKEND_CNT 2
    -#  endif
    -#endif
    -
     static void conn_free(struct connectdata *conn);
     
     /* Some parts of the code (e.g. chunked encoding) assume this buffer has at
    @@ -445,7 +435,6 @@ CURLcode Curl_close(struct Curl_easy **datap)
       Curl_resolver_cleanup(data->state.async.resolver);
     
       Curl_http2_cleanup_dependencies(data);
    -  Curl_convert_close(data);
     
       /* No longer a dirty share, if it exists */
       if(data->share) {
    @@ -509,11 +498,6 @@ CURLcode Curl_init_userdefined(struct Curl_easy *data)
       set->seek_func = ZERO_NULL;
       set->seek_client = ZERO_NULL;
     
    -  /* conversion callbacks for non-ASCII hosts */
    -  set->convfromnetwork = ZERO_NULL;
    -  set->convtonetwork   = ZERO_NULL;
    -  set->convfromutf8    = ZERO_NULL;
    -
       set->filesize = -1;        /* we don't know the size */
       set->postfieldsize = -1;   /* unknown size */
       set->maxredirs = -1;       /* allow any amount by default */
    @@ -677,7 +661,6 @@ CURLcode Curl_open(struct Curl_easy **curl)
       result = Curl_init_userdefined(data);
       if(!result) {
         Curl_dyn_init(&data->state.headerb, CURL_MAX_HTTP_HEADER);
    -    Curl_convert_init(data);
         Curl_initinfo(data);
     
         /* most recent connection is not yet defined */
    @@ -760,7 +743,9 @@ static void conn_shutdown(struct Curl_easy *data, struct connectdata *conn)
       /* close the SSL stuff before we close any sockets since they will/may
          write to the sockets */
       Curl_ssl_close(data, conn, FIRSTSOCKET);
    +#ifndef CURL_DISABLE_FTP
       Curl_ssl_close(data, conn, SECONDARYSOCKET);
    +#endif
     
       /* close possibly still open sockets */
       if(CURL_SOCKET_BAD != conn->sock[SECONDARYSOCKET])
    @@ -830,8 +815,8 @@ static void conn_free(struct connectdata *conn)
      *
      */
     
    -CURLcode Curl_disconnect(struct Curl_easy *data,
    -                         struct connectdata *conn, bool dead_connection)
    +void Curl_disconnect(struct Curl_easy *data,
    +                     struct connectdata *conn, bool dead_connection)
     {
       /* there must be a connection to close */
       DEBUGASSERT(conn);
    @@ -851,7 +836,7 @@ CURLcode Curl_disconnect(struct Curl_easy *data,
        */
       if(CONN_INUSE(conn) && !dead_connection) {
         DEBUGF(infof(data, "Curl_disconnect when inuse: %zu", CONN_INUSE(conn)));
    -    return CURLE_OK;
    +    return;
       }
     
       if(conn->dns_entry) {
    @@ -883,7 +868,6 @@ CURLcode Curl_disconnect(struct Curl_easy *data,
       Curl_detach_connnection(data);
     
       conn_free(conn);
    -  return CURLE_OK;
     }
     
     /*
    @@ -949,7 +933,7 @@ socks_proxy_info_matches(const struct proxy_info *data,
     
       /* the user information is case-sensitive
          or at least it is not defined as case-insensitive
    -     see https://tools.ietf.org/html/rfc3986#section-3.2.1 */
    +     see https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.1 */
       if(!data->user != !needle->user)
         return FALSE;
       /* curl_strequal does a case insentive comparison, so do not use it here! */
    @@ -1105,7 +1089,7 @@ static void prune_dead_connections(struct Curl_easy *data)
           Curl_conncache_remove_conn(data, prune.extracted, TRUE);
     
           /* disconnect it */
    -      (void)Curl_disconnect(data, prune.extracted, TRUE);
    +      Curl_disconnect(data, prune.extracted, TRUE);
         }
         CONNCACHE_LOCK(data);
         data->state.conn_cache->last_cleanup = now;
    @@ -1209,7 +1193,7 @@ ConnectionExists(struct Curl_easy *data,
     
           if(extract_if_dead(check, data)) {
             /* disconnect it */
    -        (void)Curl_disconnect(data, check, TRUE);
    +        Curl_disconnect(data, check, TRUE);
             continue;
           }
     
    @@ -1574,20 +1558,6 @@ bool Curl_is_ASCII_name(const char *hostname)
       return TRUE;
     }
     
    -/*
    - * Strip single trailing dot in the hostname,
    - * primarily for SNI and http host header.
    - */
    -static void strip_trailing_dot(struct hostname *host)
    -{
    -  size_t len;
    -  if(!host || !host->name)
    -    return;
    -  len = strlen(host->name);
    -  if(len && (host->name[len-1] == '.'))
    -    host->name[len-1] = 0;
    -}
    -
     /*
      * Perform any necessary IDN conversion of hostname
      */
    @@ -1690,18 +1660,35 @@ static struct connectdata *allocate_conn(struct Curl_easy *data)
          Note that these backend pointers can be swapped by vtls (eg ssl backend
          data becomes proxy backend data). */
       {
    -    size_t sslsize = Curl_ssl->sizeof_ssl_backend_data;
    -    char *ssl = calloc(SSL_BACKEND_CNT, sslsize);
    +    size_t onesize = Curl_ssl->sizeof_ssl_backend_data;
    +    size_t totalsize = onesize;
    +    char *ssl;
    +
    +#ifndef CURL_DISABLE_FTP
    +    totalsize *= 2;
    +#endif
    +#ifndef CURL_DISABLE_PROXY
    +    totalsize *= 2;
    +#endif
    +
    +    ssl = calloc(1, totalsize);
         if(!ssl) {
           free(conn);
           return NULL;
         }
         conn->ssl_extra = ssl;
    -    conn->ssl[0].backend = (void *)ssl;
    -    conn->ssl[1].backend = (void *)(ssl + sslsize);
    +    conn->ssl[FIRSTSOCKET].backend = (void *)ssl;
    +#ifndef CURL_DISABLE_FTP
    +    ssl += onesize;
    +    conn->ssl[SECONDARYSOCKET].backend = (void *)ssl;
    +#endif
     #ifndef CURL_DISABLE_PROXY
    -    conn->proxy_ssl[0].backend = (void *)(ssl + 2 * sslsize);
    -    conn->proxy_ssl[1].backend = (void *)(ssl + 3 * sslsize);
    +    ssl += onesize;
    +    conn->proxy_ssl[FIRSTSOCKET].backend = (void *)ssl;
    +#ifndef CURL_DISABLE_FTP
    +    ssl += onesize;
    +    conn->proxy_ssl[SECONDARYSOCKET].backend = (void *)ssl;
    +#endif
     #endif
       }
     #endif
    @@ -1761,7 +1748,6 @@ static struct connectdata *allocate_conn(struct Curl_easy *data)
       conn->bits.tunnel_proxy = data->set.tunnel_thru_httpproxy;
     #endif /* CURL_DISABLE_PROXY */
     
    -  conn->bits.user_passwd = (data->state.aptr.user) ? TRUE : FALSE;
     #ifndef CURL_DISABLE_FTP
       conn->bits.ftp_use_epsv = data->set.ftp_use_epsv;
       conn->bits.ftp_use_eprt = data->set.ftp_use_eprt;
    @@ -1882,6 +1868,7 @@ CURLcode Curl_uc_to_curlcode(CURLUcode uc)
       }
     }
     
    +#ifdef ENABLE_IPV6
     /*
      * If the URL was set with an IPv6 numerical address with a zone id part, set
      * the scope_id based on that!
    @@ -1931,6 +1918,9 @@ static void zonefrom_url(CURLU *uh, struct Curl_easy *data,
         free(zoneid);
       }
     }
    +#else
    +#define zonefrom_url(a,b,c) Curl_nop_stmt
    +#endif
     
     /*
      * Parse URL and fill in the relevant members of the connection struct.
    @@ -2038,45 +2028,47 @@ static CURLcode parseurlandfillconn(struct Curl_easy *data,
        * User name and password set with their own options override the
        * credentials possibly set in the URL.
        */
    -  if(!data->state.aptr.user) {
    -    /* we don't use the URL API's URL decoder option here since it rejects
    -       control codes and we want to allow them for some schemes in the user
    -       and password fields */
    -    uc = curl_url_get(uh, CURLUPART_USER, &data->state.up.user, 0);
    +  if(!data->state.aptr.passwd) {
    +    uc = curl_url_get(uh, CURLUPART_PASSWORD, &data->state.up.password, 0);
         if(!uc) {
           char *decoded;
    -      result = Curl_urldecode(NULL, data->state.up.user, 0, &decoded, NULL,
    +      result = Curl_urldecode(data->state.up.password, 0, &decoded, NULL,
                                   conn->handler->flags&PROTOPT_USERPWDCTRL ?
                                   REJECT_ZERO : REJECT_CTRL);
           if(result)
             return result;
    -      conn->user = decoded;
    -      conn->bits.user_passwd = TRUE;
    -      result = Curl_setstropt(&data->state.aptr.user, decoded);
    +      conn->passwd = decoded;
    +      result = Curl_setstropt(&data->state.aptr.passwd, decoded);
           if(result)
             return result;
         }
    -    else if(uc != CURLUE_NO_USER)
    +    else if(uc != CURLUE_NO_PASSWORD)
           return Curl_uc_to_curlcode(uc);
       }
     
    -  if(!data->state.aptr.passwd) {
    -    uc = curl_url_get(uh, CURLUPART_PASSWORD, &data->state.up.password, 0);
    +  if(!data->state.aptr.user) {
    +    /* we don't use the URL API's URL decoder option here since it rejects
    +       control codes and we want to allow them for some schemes in the user
    +       and password fields */
    +    uc = curl_url_get(uh, CURLUPART_USER, &data->state.up.user, 0);
         if(!uc) {
           char *decoded;
    -      result = Curl_urldecode(NULL, data->state.up.password, 0, &decoded, NULL,
    +      result = Curl_urldecode(data->state.up.user, 0, &decoded, NULL,
                                   conn->handler->flags&PROTOPT_USERPWDCTRL ?
                                   REJECT_ZERO : REJECT_CTRL);
           if(result)
             return result;
    -      conn->passwd = decoded;
    -      conn->bits.user_passwd = TRUE;
    -      result = Curl_setstropt(&data->state.aptr.passwd, decoded);
    -      if(result)
    -        return result;
    +      conn->user = decoded;
    +      result = Curl_setstropt(&data->state.aptr.user, decoded);
         }
    -    else if(uc != CURLUE_NO_PASSWORD)
    +    else if(uc != CURLUE_NO_USER)
           return Curl_uc_to_curlcode(uc);
    +    else if(data->state.aptr.passwd) {
    +      /* no user was set but a password, set a blank user */
    +      result = Curl_setstropt(&data->state.aptr.user, "");
    +    }
    +    if(result)
    +      return result;
       }
     
       uc = curl_url_get(uh, CURLUPART_OPTIONS, &data->state.up.options,
    @@ -2128,9 +2120,11 @@ static CURLcode parseurlandfillconn(struct Curl_easy *data,
         return CURLE_OUT_OF_MEMORY;
       conn->host.name = conn->host.rawalloc;
     
    +#ifdef ENABLE_IPV6
       if(data->set.scope_id)
         /* Override any scope that was set above.  */
         conn->scope_id = data->set.scope_id;
    +#endif
     
       return CURLE_OK;
     }
    @@ -2560,14 +2554,14 @@ static CURLcode parse_proxy_auth(struct Curl_easy *data,
       CURLcode result = CURLE_OK;
     
       if(proxyuser) {
    -    result = Curl_urldecode(data, proxyuser, 0, &conn->http_proxy.user, NULL,
    +    result = Curl_urldecode(proxyuser, 0, &conn->http_proxy.user, NULL,
                                 REJECT_ZERO);
         if(!result)
           result = Curl_setstropt(&data->state.aptr.proxyuser,
                                   conn->http_proxy.user);
       }
       if(!result && proxypasswd) {
    -    result = Curl_urldecode(data, proxypasswd, 0, &conn->http_proxy.passwd,
    +    result = Curl_urldecode(proxypasswd, 0, &conn->http_proxy.passwd,
                                 NULL, REJECT_ZERO);
         if(!result)
           result = Curl_setstropt(&data->state.aptr.proxypasswd,
    @@ -2922,10 +2916,10 @@ static CURLcode override_login(struct Curl_easy *data,
       char **optionsp = &conn->options;
     
     #ifndef CURL_DISABLE_NETRC
    -  if(data->set.use_netrc == CURL_NETRC_REQUIRED && conn->bits.user_passwd) {
    +  if(data->set.use_netrc == CURL_NETRC_REQUIRED && data->state.aptr.user) {
         Curl_safefree(*userp);
         Curl_safefree(*passwdp);
    -    conn->bits.user_passwd = FALSE; /* disable user+password */
    +    Curl_safefree(data->state.aptr.user); /* disable user+password */
       }
     #endif
     
    @@ -2942,6 +2936,13 @@ static CURLcode override_login(struct Curl_easy *data,
         bool netrc_user_changed = FALSE;
         bool netrc_passwd_changed = FALSE;
         int ret;
    +    bool url_provided = FALSE;
    +
    +    if(data->state.up.user) {
    +      /* there was a user name in the URL */
    +      userp = &data->state.up.user;
    +      url_provided = TRUE;
    +    }
     
         ret = Curl_parsenetrc(conn->host.name,
                               userp, passwdp,
    @@ -2959,29 +2960,37 @@ static CURLcode override_login(struct Curl_easy *data,
              file, so that it is safe to use even if we followed a Location: to a
              different host or similar. */
           conn->bits.netrc = TRUE;
    -      conn->bits.user_passwd = TRUE; /* enable user+password */
    +    }
    +    if(url_provided) {
    +      Curl_safefree(conn->user);
    +      conn->user = strdup(*userp);
    +      if(!conn->user)
    +        return CURLE_OUT_OF_MEMORY;
    +      /* don't update the user name below */
    +      userp = NULL;
         }
       }
     #endif
     
       /* for updated strings, we update them in the URL */
    -  if(*userp) {
    -    CURLcode result = Curl_setstropt(&data->state.aptr.user, *userp);
    -    if(result)
    -      return result;
    -  }
    -  if(data->state.aptr.user) {
    -    uc = curl_url_set(data->state.uh, CURLUPART_USER, data->state.aptr.user,
    -                      CURLU_URLENCODE);
    -    if(uc)
    -      return Curl_uc_to_curlcode(uc);
    -    if(!*userp) {
    -      *userp = strdup(data->state.aptr.user);
    -      if(!*userp)
    -        return CURLE_OUT_OF_MEMORY;
    +  if(userp) {
    +    if(*userp) {
    +      CURLcode result = Curl_setstropt(&data->state.aptr.user, *userp);
    +      if(result)
    +        return result;
    +    }
    +    if(data->state.aptr.user) {
    +      uc = curl_url_set(data->state.uh, CURLUPART_USER, data->state.aptr.user,
    +                        CURLU_URLENCODE);
    +      if(uc)
    +        return Curl_uc_to_curlcode(uc);
    +      if(!*userp) {
    +        *userp = strdup(data->state.aptr.user);
    +        if(!*userp)
    +          return CURLE_OUT_OF_MEMORY;
    +      }
         }
       }
    -
       if(*passwdp) {
         CURLcode result = Curl_setstropt(&data->state.aptr.passwd, *passwdp);
         if(result)
    @@ -3005,14 +3014,15 @@ static CURLcode override_login(struct Curl_easy *data,
     /*
      * Set the login details so they're available in the connection
      */
    -static CURLcode set_login(struct connectdata *conn)
    +static CURLcode set_login(struct Curl_easy *data,
    +                          struct connectdata *conn)
     {
       CURLcode result = CURLE_OK;
       const char *setuser = CURL_DEFAULT_USER;
       const char *setpasswd = CURL_DEFAULT_PASSWORD;
     
       /* If our protocol needs a password and we have none, use the defaults */
    -  if((conn->handler->flags & PROTOPT_NEEDSPWD) && !conn->bits.user_passwd)
    +  if((conn->handler->flags & PROTOPT_NEEDSPWD) && !data->state.aptr.user)
         ;
       else {
         setuser = "";
    @@ -3389,7 +3399,7 @@ static CURLcode resolve_server(struct Curl_easy *data,
         else
     #endif
     
    -    if(!conn->bits.proxy) {
    +    if(!CONN_IS_PROXIED(conn)) {
           struct hostname *connhost;
           if(conn->bits.conn_to_host)
             connhost = &conn->conn_to_host;
    @@ -3486,8 +3496,7 @@ static void reuse_conn(struct Curl_easy *data,
     
       /* get the user+password information from the old_conn struct since it may
        * be new for this request even when we re-use an existing connection */
    -  conn->bits.user_passwd = old_conn->bits.user_passwd;
    -  if(conn->bits.user_passwd) {
    +  if(old_conn->user) {
         /* use the new user name and password though */
         Curl_safefree(conn->user);
         Curl_safefree(conn->passwd);
    @@ -3665,7 +3674,7 @@ static CURLcode create_conn(struct Curl_easy *data,
       if(result)
         goto out;
     
    -  result = set_login(conn); /* default credentials */
    +  result = set_login(data, conn); /* default credentials */
       if(result)
         goto out;
     
    @@ -3947,7 +3956,7 @@ static CURLcode create_conn(struct Curl_easy *data,
             CONNCACHE_UNLOCK(data);
     
             if(conn_candidate)
    -          (void)Curl_disconnect(data, conn_candidate, FALSE);
    +          Curl_disconnect(data, conn_candidate, FALSE);
             else {
               infof(data, "No more connections allowed to host %s: %zu",
                     bundlehost, max_host_connections);
    @@ -3967,7 +3976,7 @@ static CURLcode create_conn(struct Curl_easy *data,
           /* The cache is full. Let's see if we can kill a connection. */
           conn_candidate = Curl_conncache_extract_oldest(data);
           if(conn_candidate)
    -        (void)Curl_disconnect(data, conn_candidate, FALSE);
    +        Curl_disconnect(data, conn_candidate, FALSE);
           else {
             infof(data, "No connections available in cache");
             connections_available = FALSE;
    @@ -4038,17 +4047,6 @@ static CURLcode create_conn(struct Curl_easy *data,
        *************************************************************/
       result = resolve_server(data, conn, async);
     
    -  /* Strip trailing dots. resolve_server copied the name. */
    -  strip_trailing_dot(&conn->host);
    -#ifndef CURL_DISABLE_PROXY
    -  if(conn->bits.httpproxy)
    -    strip_trailing_dot(&conn->http_proxy.host);
    -  if(conn->bits.socksproxy)
    -    strip_trailing_dot(&conn->socks_proxy.host);
    -#endif
    -  if(conn->bits.conn_to_host)
    -    strip_trailing_dot(&conn->conn_to_host);
    -
     out:
       return result;
     }
    diff --git a/vendor/curl/lib/url.h b/vendor/curl/lib/url.h
    index 929fc60f26..59a1c24919 100644
    --- a/vendor/curl/lib/url.h
    +++ b/vendor/curl/lib/url.h
    @@ -7,7 +7,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2021, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -35,8 +35,8 @@ void Curl_freeset(struct Curl_easy *data);
     CURLcode Curl_uc_to_curlcode(CURLUcode uc);
     CURLcode Curl_close(struct Curl_easy **datap); /* opposite of curl_open() */
     CURLcode Curl_connect(struct Curl_easy *, bool *async, bool *protocol_connect);
    -CURLcode Curl_disconnect(struct Curl_easy *data,
    -                         struct connectdata *, bool dead_connection);
    +void Curl_disconnect(struct Curl_easy *data,
    +                     struct connectdata *, bool dead_connection);
     CURLcode Curl_setup_conn(struct Curl_easy *data,
                              bool *protocol_done);
     void Curl_free_request_state(struct Curl_easy *data);
    diff --git a/vendor/curl/lib/urlapi.c b/vendor/curl/lib/urlapi.c
    index d29aeb238f..ff00ee4243 100644
    --- a/vendor/curl/lib/urlapi.c
    +++ b/vendor/curl/lib/urlapi.c
    @@ -90,16 +90,6 @@ static void free_urlhandle(struct Curl_URL *u)
       free(u->temppath);
     }
     
    -/* move the full contents of one handle onto another and
    -   free the original */
    -static void mv_urlhandle(struct Curl_URL *from,
    -                         struct Curl_URL *to)
    -{
    -  free_urlhandle(to);
    -  *to = *from;
    -  free(from);
    -}
    -
     /*
      * Find the separator at the end of the host name, or the '?' in cases like
      * http://www.url.com?id=2380
    @@ -804,8 +794,7 @@ static CURLUcode decode_host(char *hostname, char **outp)
       else {
         /* might be encoded */
         size_t dlen;
    -    CURLcode result = Curl_urldecode(NULL, hostname, 0,
    -                                     outp, &dlen, REJECT_CTRL);
    +    CURLcode result = Curl_urldecode(hostname, 0, outp, &dlen, REJECT_CTRL);
         if(result)
           return CURLUE_BAD_HOSTNAME;
       }
    @@ -1005,9 +994,7 @@ static CURLUcode seturl(const char *url, CURLU *u, unsigned int flags)
             return CURLUE_NO_HOST;
         }
     
    -    len = strlen(p);
    -    memcpy(path, p, len);
    -    path[len] = 0;
    +    strcpy(path, p);
     
         if(schemep) {
           u->scheme = strdup(schemep);
    @@ -1156,6 +1143,25 @@ static CURLUcode parseurl(const char *url, CURLU *u, unsigned int flags)
       return result;
     }
     
    +/*
    + * Parse the URL and, if successful, replace everyting in the Curl_URL struct.
    + */
    +static CURLUcode parseurl_and_replace(const char *url, CURLU *u,
    +                                      unsigned int flags)
    +{
    +  CURLUcode result;
    +  CURLU tmpurl;
    +  memset(&tmpurl, 0, sizeof(tmpurl));
    +  result = parseurl(url, &tmpurl, flags);
    +  if(!result) {
    +    free_urlhandle(u);
    +    *u = tmpurl;
    +  }
    +  else
    +    free_urlhandle(&tmpurl);
    +  return result;
    +}
    +
     /*
      */
     CURLU *curl_url(void)
    @@ -1422,8 +1428,7 @@ CURLUcode curl_url_get(CURLU *u, CURLUPart what,
           size_t dlen;
           /* this unconditional rejection of control bytes is documented
              API behavior */
    -      CURLcode res = Curl_urldecode(NULL, *part, 0, &decoded, &dlen,
    -                                    REJECT_CTRL);
    +      CURLcode res = Curl_urldecode(*part, 0, &decoded, &dlen, REJECT_CTRL);
           free(*part);
           if(res) {
             *part = NULL;
    @@ -1564,52 +1569,24 @@ CURLUcode curl_url_set(CURLU *u, CURLUPart what,
         CURLUcode result;
         char *oldurl;
         char *redired_url;
    -    CURLU *handle2;
     
    -    if(Curl_is_absolute_url(part, NULL, 0)) {
    -      handle2 = curl_url();
    -      if(!handle2)
    -        return CURLUE_OUT_OF_MEMORY;
    -      result = parseurl(part, handle2, flags);
    -      if(!result)
    -        mv_urlhandle(handle2, u);
    -      else
    -        curl_url_cleanup(handle2);
    -      return result;
    -    }
    -    /* extract the full "old" URL to do the redirect on */
    -    result = curl_url_get(u, CURLUPART_URL, &oldurl, flags);
    -    if(result) {
    -      /* couldn't get the old URL, just use the new! */
    -      handle2 = curl_url();
    -      if(!handle2)
    -        return CURLUE_OUT_OF_MEMORY;
    -      result = parseurl(part, handle2, flags);
    -      if(!result)
    -        mv_urlhandle(handle2, u);
    -      else
    -        curl_url_cleanup(handle2);
    -      return result;
    +    /* if the new thing is absolute or the old one is not
    +     * (we could not get an absolute url in 'oldurl'),
    +     * then replace the existing with the new. */
    +    if(Curl_is_absolute_url(part, NULL, 0)
    +       || curl_url_get(u, CURLUPART_URL, &oldurl, flags)) {
    +      return parseurl_and_replace(part, u, flags);
         }
     
    -    /* apply the relative part to create a new URL */
    +    /* apply the relative part to create a new URL
    +     * and replace the existing one with it. */
         redired_url = concat_url(oldurl, part);
         free(oldurl);
         if(!redired_url)
           return CURLUE_OUT_OF_MEMORY;
     
    -    /* now parse the new URL */
    -    handle2 = curl_url();
    -    if(!handle2) {
    -      free(redired_url);
    -      return CURLUE_OUT_OF_MEMORY;
    -    }
    -    result = parseurl(redired_url, handle2, flags);
    +    result = parseurl_and_replace(redired_url, u, flags);
         free(redired_url);
    -    if(!result)
    -      mv_urlhandle(handle2, u);
    -    else
    -      curl_url_cleanup(handle2);
         return result;
       }
       default:
    diff --git a/vendor/curl/lib/urldata.h b/vendor/curl/lib/urldata.h
    index cc9c888709..cc8a600db4 100644
    --- a/vendor/curl/lib/urldata.h
    +++ b/vendor/curl/lib/urldata.h
    @@ -7,7 +7,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2021, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -352,10 +352,6 @@ typedef enum {
       GSS_AUTHSUCC
     } curlnegotiate;
     
    -#if defined(CURL_DOES_CONVERSIONS) && defined(HAVE_ICONV)
    -#include 
    -#endif
    -
     /* Struct used for GSSAPI (Kerberos V5) authentication */
     #if defined(USE_KERBEROS5)
     struct kerberos5data {
    @@ -450,6 +446,11 @@ struct negotiatedata {
     };
     #endif
     
    +#ifdef CURL_DISABLE_PROXY
    +#define CONN_IS_PROXIED(x) 0
    +#else
    +#define CONN_IS_PROXIED(x) x->bits.proxy
    +#endif
     
     /*
      * Boolean values that concerns this connection.
    @@ -470,6 +471,7 @@ struct ConnectBits {
       BIT(proxy_connect_closed); /* TRUE if a proxy disconnected the connection
                                     in a CONNECT request with auth, so that
                                     libcurl should reconnect and continue. */
    +  BIT(proxy); /* if set, this transfer is done through a proxy - any type */
     #endif
       /* always modify bits.close with the connclose() and connkeep() macros! */
       BIT(close); /* if set, we close the connection after this request */
    @@ -479,8 +481,6 @@ struct ConnectBits {
                             that overrides the host in the URL */
       BIT(conn_to_port); /* if set, this connection has a "connect to port"
                             that overrides the port in the URL (remote port) */
    -  BIT(proxy); /* if set, this transfer is done through a proxy - any type */
    -  BIT(user_passwd); /* do we use user+password for this connection? */
       BIT(ipv6_ip); /* we communicate with a remote site specified with pure IPv6
                        IP address */
       BIT(ipv6);    /* we communicate with a site using an IPv6 address */
    @@ -939,8 +939,9 @@ struct connectdata {
          cache entry remains locked. It gets unlocked in multi_done() */
       struct Curl_addrinfo *ip_addr;
       struct Curl_addrinfo *tempaddr[2]; /* for happy eyeballs */
    -
    +#ifdef ENABLE_IPV6
       unsigned int scope_id;  /* Scope id for IPv6 */
    +#endif
     
       enum {
         TRNSPRT_TCP = 3,
    @@ -1659,13 +1660,6 @@ struct UserDefined {
       void *prereq_userp; /* pre-initial request user data */
     
       void *seek_client;    /* pointer to pass to the seek callback */
    -  /* the 3 curl_conv_callback functions below are used on non-ASCII hosts */
    -  /* function to convert from the network encoding: */
    -  curl_conv_callback convfromnetwork;
    -  /* function to convert to the network encoding: */
    -  curl_conv_callback convtonetwork;
    -  /* function to convert from UTF-8 encoding: */
    -  curl_conv_callback convfromutf8;
     #ifndef CURL_DISABLE_HSTS
       curl_hstsread_callback hsts_read;
       void *hsts_read_userp;
    @@ -1749,7 +1743,9 @@ struct UserDefined {
       long ssh_auth_types;   /* allowed SSH auth types */
       char *str[STRING_LAST]; /* array of strings, pointing to allocated memory */
       struct curl_blob *blobs[BLOB_LAST];
    +#ifdef ENABLE_IPV6
       unsigned int scope_id;  /* Scope id for IPv6 */
    +#endif
       long allowed_protocols;
       long redir_protocols;
       long mime_options;      /* Mime option flags. */
    @@ -1949,11 +1945,6 @@ struct Curl_easy {
       struct PureInfo info;        /* stats, reports and info data */
       struct curl_tlssessioninfo tsi; /* Information about the TLS session, only
                                          valid after a client has asked for it */
    -#if defined(CURL_DOES_CONVERSIONS) && defined(HAVE_ICONV)
    -  iconv_t outbound_cd;         /* for translating to the network encoding */
    -  iconv_t inbound_cd;          /* for translating from the network encoding */
    -  iconv_t utf8_cd;             /* for translating to UTF8 */
    -#endif /* CURL_DOES_CONVERSIONS && HAVE_ICONV */
     #ifdef USE_HYPER
       struct hyptransfer hyp;
     #endif
    diff --git a/vendor/curl/lib/vauth/digest.c b/vendor/curl/lib/vauth/digest.c
    index d8aac66bda..d4616095da 100644
    --- a/vendor/curl/lib/vauth/digest.c
    +++ b/vendor/curl/lib/vauth/digest.c
    @@ -5,7 +5,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2021, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -40,7 +40,6 @@
     #include "warnless.h"
     #include "strtok.h"
     #include "strcase.h"
    -#include "non-ascii.h" /* included for Curl_convert_... prototypes */
     #include "curl_printf.h"
     #include "rand.h"
     
    @@ -56,20 +55,7 @@
     #define DIGEST_QOP_VALUE_STRING_AUTH      "auth"
     #define DIGEST_QOP_VALUE_STRING_AUTH_INT  "auth-int"
     #define DIGEST_QOP_VALUE_STRING_AUTH_CONF "auth-conf"
    -
    -/* The CURL_OUTPUT_DIGEST_CONV macro below is for non-ASCII machines.
    -   It converts digest text to ASCII so the MD5 will be correct for
    -   what ultimately goes over the network.
    -*/
    -#define CURL_OUTPUT_DIGEST_CONV(a, b)                  \
    -  do {                                                 \
    -    result = Curl_convert_to_network(a, b, strlen(b)); \
    -    if(result) {                                       \
    -      free(b);                                         \
    -      return result;                                   \
    -    }                                                  \
    -  } while(0)
    -#endif /* !USE_WINDOWS_SSPI */
    +#endif
     
     bool Curl_auth_digest_get_pair(const char *str, char *value, char *content,
                                    const char **endptr)
    @@ -692,7 +678,7 @@ static CURLcode auth_create_digest_http_message(
         if(result)
           return result;
     
    -    result = Curl_base64_encode(data, cnoncebuf, strlen(cnoncebuf),
    +    result = Curl_base64_encode(cnoncebuf, strlen(cnoncebuf),
                                     &cnonce, &cnonce_sz);
         if(result)
           return result;
    @@ -705,7 +691,6 @@ static CURLcode auth_create_digest_http_message(
         if(!hashthis)
           return CURLE_OUT_OF_MEMORY;
     
    -    CURL_OUTPUT_DIGEST_CONV(data, hashthis);
         hash(hashbuf, (unsigned char *) hashthis, strlen(hashthis));
         free(hashthis);
         convert_to_ascii(hashbuf, (unsigned char *)userh);
    @@ -726,7 +711,6 @@ static CURLcode auth_create_digest_http_message(
       if(!hashthis)
         return CURLE_OUT_OF_MEMORY;
     
    -  CURL_OUTPUT_DIGEST_CONV(data, hashthis); /* convert on non-ASCII machines */
       hash(hashbuf, (unsigned char *) hashthis, strlen(hashthis));
       free(hashthis);
       convert_to_ascii(hashbuf, ha1);
    @@ -739,7 +723,6 @@ static CURLcode auth_create_digest_http_message(
         if(!tmp)
           return CURLE_OUT_OF_MEMORY;
     
    -    CURL_OUTPUT_DIGEST_CONV(data, tmp); /* Convert on non-ASCII machines */
         hash(hashbuf, (unsigned char *) tmp, strlen(tmp));
         free(tmp);
         convert_to_ascii(hashbuf, ha1);
    @@ -778,7 +761,6 @@ static CURLcode auth_create_digest_http_message(
       if(!hashthis)
         return CURLE_OUT_OF_MEMORY;
     
    -  CURL_OUTPUT_DIGEST_CONV(data, hashthis); /* convert on non-ASCII machines */
       hash(hashbuf, (unsigned char *) hashthis, strlen(hashthis));
       free(hashthis);
       convert_to_ascii(hashbuf, ha2);
    @@ -794,7 +776,6 @@ static CURLcode auth_create_digest_http_message(
       if(!hashthis)
         return CURLE_OUT_OF_MEMORY;
     
    -  CURL_OUTPUT_DIGEST_CONV(data, hashthis); /* convert on non-ASCII machines */
       hash(hashbuf, (unsigned char *) hashthis, strlen(hashthis));
       free(hashthis);
       convert_to_ascii(hashbuf, request_digest);
    diff --git a/vendor/curl/lib/vauth/ntlm.c b/vendor/curl/lib/vauth/ntlm.c
    index 04f6590acf..b769e0f5d2 100644
    --- a/vendor/curl/lib/vauth/ntlm.c
    +++ b/vendor/curl/lib/vauth/ntlm.c
    @@ -5,7 +5,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2021, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -34,7 +34,6 @@
     #define DEBUG_ME 0
     
     #include "urldata.h"
    -#include "non-ascii.h"
     #include "sendf.h"
     #include "curl_ntlm_core.h"
     #include "curl_gethostname.h"
    @@ -383,12 +382,6 @@ CURLcode Curl_auth_create_ntlm_type1_message(struct Curl_easy *data,
       /* Clean up any former leftovers and initialise to defaults */
       Curl_auth_cleanup_ntlm(ntlm);
     
    -#if defined(USE_NTRESPONSES) && \
    -    (defined(USE_NTLM2SESSION) || defined(USE_NTLM_V2))
    -#define NTLM2FLAG NTLMFLAG_NEGOTIATE_NTLM2_KEY
    -#else
    -#define NTLM2FLAG 0
    -#endif
       ntlmbuf = aprintf(NTLMSSP_SIGNATURE "%c"
                         "\x01%c%c%c" /* 32-bit type = 1 */
                         "%c%c%c%c"   /* 32-bit NTLM flag field */
    @@ -408,7 +401,7 @@ CURLcode Curl_auth_create_ntlm_type1_message(struct Curl_easy *data,
                         LONGQUARTET(NTLMFLAG_NEGOTIATE_OEM |
                                     NTLMFLAG_REQUEST_TARGET |
                                     NTLMFLAG_NEGOTIATE_NTLM_KEY |
    -                                NTLM2FLAG |
    +                                NTLMFLAG_NEGOTIATE_NTLM2_KEY |
                                     NTLMFLAG_NEGOTIATE_ALWAYS_SIGN),
                         SHORTPAIR(domlen),
                         SHORTPAIR(domlen),
    @@ -433,18 +426,18 @@ CURLcode Curl_auth_create_ntlm_type1_message(struct Curl_easy *data,
                 LONGQUARTET(NTLMFLAG_NEGOTIATE_OEM |
                             NTLMFLAG_REQUEST_TARGET |
                             NTLMFLAG_NEGOTIATE_NTLM_KEY |
    -                        NTLM2FLAG |
    +                        NTLMFLAG_NEGOTIATE_NTLM2_KEY |
                             NTLMFLAG_NEGOTIATE_ALWAYS_SIGN),
                 NTLMFLAG_NEGOTIATE_OEM |
                 NTLMFLAG_REQUEST_TARGET |
                 NTLMFLAG_NEGOTIATE_NTLM_KEY |
    -            NTLM2FLAG |
    +            NTLMFLAG_NEGOTIATE_NTLM2_KEY |
                 NTLMFLAG_NEGOTIATE_ALWAYS_SIGN);
         ntlm_print_flags(stderr,
                          NTLMFLAG_NEGOTIATE_OEM |
                          NTLMFLAG_REQUEST_TARGET |
                          NTLMFLAG_NEGOTIATE_NTLM_KEY |
    -                     NTLM2FLAG |
    +                     NTLMFLAG_NEGOTIATE_NTLM2_KEY |
                          NTLMFLAG_NEGOTIATE_ALWAYS_SIGN);
         fprintf(stderr, "\n****\n");
       });
    @@ -498,13 +491,11 @@ CURLcode Curl_auth_create_ntlm_type3_message(struct Curl_easy *data,
       unsigned char ntlmbuf[NTLM_BUFSIZE];
       int lmrespoff;
       unsigned char lmresp[24]; /* fixed-size */
    -#ifdef USE_NTRESPONSES
       int ntrespoff;
       unsigned int ntresplen = 24;
       unsigned char ntresp[24]; /* fixed-size */
       unsigned char *ptr_ntresp = &ntresp[0];
       unsigned char *ntlmv2resp = NULL;
    -#endif
       bool unicode = (ntlm->flags & NTLMFLAG_NEGOTIATE_UNICODE) ? TRUE : FALSE;
       char host[HOSTNAME_MAX + 1] = "";
       const char *user;
    @@ -540,12 +531,7 @@ CURLcode Curl_auth_create_ntlm_type3_message(struct Curl_easy *data,
         hostlen = strlen(host);
       }
     
    -#if defined(USE_NTRESPONSES) && \
    -    (defined(USE_NTLM2SESSION) || defined(USE_NTLM_V2))
    -  /* We don't support NTLM2 or extended security if we don't have
    -     USE_NTRESPONSES */
       if(ntlm->flags & NTLMFLAG_NEGOTIATE_NTLM2_KEY) {
    -# if defined(USE_NTLM_V2)
         unsigned char ntbuffer[0x18];
         unsigned char entropy[8];
         unsigned char ntlmv2hash[0x18];
    @@ -558,7 +544,7 @@ CURLcode Curl_auth_create_ntlm_type3_message(struct Curl_easy *data,
         if(result)
           return result;
     
    -    result = Curl_ntlm_core_mk_nt_hash(data, passwdp, ntbuffer);
    +    result = Curl_ntlm_core_mk_nt_hash(passwdp, ntbuffer);
         if(result)
           return result;
     
    @@ -580,67 +566,21 @@ CURLcode Curl_auth_create_ntlm_type3_message(struct Curl_easy *data,
           return result;
     
         ptr_ntresp = ntlmv2resp;
    -# else /* defined(USE_NTLM_V2) */
    -    unsigned char ntbuffer[0x18];
    -    unsigned char tmp[0x18];
    -    unsigned char md5sum[MD5_DIGEST_LEN];
    -    unsigned char entropy[8];
    -
    -    /* NTLM version 1 with extended security. */
    -
    -    /* Need to create 8 bytes random data */
    -    result = Curl_rand(data, entropy, 8);
    -    if(result)
    -      return result;
    -
    -    /* 8 bytes random data as challenge in lmresp */
    -    memcpy(lmresp, entropy, 8);
    -
    -    /* Pad with zeros */
    -    memset(lmresp + 8, 0, 0x10);
    -
    -    /* Fill tmp with challenge(nonce?) + entropy */
    -    memcpy(tmp, &ntlm->nonce[0], 8);
    -    memcpy(tmp + 8, entropy, 8);
    -
    -    result = Curl_md5it(md5sum, tmp, 16);
    -    if(result)
    -      return result;
    -
    -    /* We shall only use the first 8 bytes of md5sum, but the des code in
    -       Curl_ntlm_core_lm_resp only encrypt the first 8 bytes */
    -    result = Curl_ntlm_core_mk_nt_hash(data, passwdp, ntbuffer);
    -    if(result)
    -      return result;
    -
    -    Curl_ntlm_core_lm_resp(ntbuffer, md5sum, ntresp);
    -
    -    /* End of NTLM2 Session code */
    -    /* NTLM v2 session security is a misnomer because it is not NTLM v2.
    -       It is NTLM v1 using the extended session security that is also
    -       in NTLM v2 */
    -# endif /* defined(USE_NTLM_V2) */
       }
    -  else
    -#endif
    -  {
    +  else {
     
    -#ifdef USE_NTRESPONSES
         unsigned char ntbuffer[0x18];
    -#endif
         unsigned char lmbuffer[0x18];
     
         /* NTLM version 1 */
     
    -#ifdef USE_NTRESPONSES
    -    result = Curl_ntlm_core_mk_nt_hash(data, passwdp, ntbuffer);
    +    result = Curl_ntlm_core_mk_nt_hash(passwdp, ntbuffer);
         if(result)
           return result;
     
         Curl_ntlm_core_lm_resp(ntbuffer, &ntlm->nonce[0], ntresp);
    -#endif
     
    -    result = Curl_ntlm_core_mk_lm_hash(data, passwdp, lmbuffer);
    +    result = Curl_ntlm_core_mk_lm_hash(passwdp, lmbuffer);
         if(result)
           return result;
     
    @@ -659,12 +599,8 @@ CURLcode Curl_auth_create_ntlm_type3_message(struct Curl_easy *data,
       }
     
       lmrespoff = 64; /* size of the message header */
    -#ifdef USE_NTRESPONSES
       ntrespoff = lmrespoff + 0x18;
       domoff = ntrespoff + ntresplen;
    -#else
    -  domoff = lmrespoff + 0x18;
    -#endif
       useroff = domoff + domlen;
       hostoff = useroff + userlen;
     
    @@ -719,17 +655,11 @@ CURLcode Curl_auth_create_ntlm_type3_message(struct Curl_easy *data,
                        SHORTPAIR(lmrespoff),
                        0x0, 0x0,
     
    -#ifdef USE_NTRESPONSES
                        SHORTPAIR(ntresplen),  /* NT-response length, twice */
                        SHORTPAIR(ntresplen),
                        SHORTPAIR(ntrespoff),
                        0x0, 0x0,
    -#else
    -                   0x0, 0x0,
    -                   0x0, 0x0,
    -                   0x0, 0x0,
    -                   0x0, 0x0,
    -#endif
    +
                        SHORTPAIR(domlen),
                        SHORTPAIR(domlen),
                        SHORTPAIR(domoff),
    @@ -766,7 +696,6 @@ CURLcode Curl_auth_create_ntlm_type3_message(struct Curl_easy *data,
         ntlm_print_hex(stderr, (char *)&ntlmbuf[lmrespoff], 0x18);
       });
     
    -#ifdef USE_NTRESPONSES
       /* ntresplen + size should not be risking an integer overflow here */
       if(ntresplen + size > sizeof(ntlmbuf)) {
         failf(data, "incoming NTLM message too big");
    @@ -783,8 +712,6 @@ CURLcode Curl_auth_create_ntlm_type3_message(struct Curl_easy *data,
     
       free(ntlmv2resp);/* Free the dynamic buffer allocated for NTLMv2 */
     
    -#endif
    -
       DEBUG_OUT({
         fprintf(stderr, "\n   flags=0x%02.2x%02.2x%02.2x%02.2x 0x%08.8x ",
                 LONGQUARTET(ntlm->flags), ntlm->flags);
    @@ -823,12 +750,6 @@ CURLcode Curl_auth_create_ntlm_type3_message(struct Curl_easy *data,
     
       size += hostlen;
     
    -  /* Convert domain, user, and host to ASCII but leave the rest as-is */
    -  result = Curl_convert_to_network(data, (char *)&ntlmbuf[domoff],
    -                                   size - domoff);
    -  if(result)
    -    return CURLE_CONV_FAILED;
    -
       /* Return the binary blob. */
       result = Curl_bufref_memdup(out, ntlmbuf, size);
     
    diff --git a/vendor/curl/lib/vauth/spnego_gssapi.c b/vendor/curl/lib/vauth/spnego_gssapi.c
    index 8e8932bd03..8c1a3edd04 100644
    --- a/vendor/curl/lib/vauth/spnego_gssapi.c
    +++ b/vendor/curl/lib/vauth/spnego_gssapi.c
    @@ -5,7 +5,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2021, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -204,16 +204,14 @@ CURLcode Curl_auth_decode_spnego_message(struct Curl_easy *data,
      *
      * Returns CURLE_OK on success.
      */
    -CURLcode Curl_auth_create_spnego_message(struct Curl_easy *data,
    -                                         struct negotiatedata *nego,
    +CURLcode Curl_auth_create_spnego_message(struct negotiatedata *nego,
                                              char **outptr, size_t *outlen)
     {
       CURLcode result;
       OM_uint32 minor_status;
     
       /* Base64 encode the already generated response */
    -  result = Curl_base64_encode(data,
    -                              nego->output_token.value,
    +  result = Curl_base64_encode(nego->output_token.value,
                                   nego->output_token.length,
                                   outptr, outlen);
     
    diff --git a/vendor/curl/lib/vauth/spnego_sspi.c b/vendor/curl/lib/vauth/spnego_sspi.c
    index 68bb17da59..d219d8bb24 100644
    --- a/vendor/curl/lib/vauth/spnego_sspi.c
    +++ b/vendor/curl/lib/vauth/spnego_sspi.c
    @@ -5,7 +5,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2021, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -301,27 +301,19 @@ CURLcode Curl_auth_decode_spnego_message(struct Curl_easy *data,
      *
      * Returns CURLE_OK on success.
      */
    -CURLcode Curl_auth_create_spnego_message(struct Curl_easy *data,
    -                                         struct negotiatedata *nego,
    +CURLcode Curl_auth_create_spnego_message(struct negotiatedata *nego,
                                              char **outptr, size_t *outlen)
     {
    -  CURLcode result;
    -
       /* Base64 encode the already generated response */
    -  result = Curl_base64_encode(data,
    -                              (const char *) nego->output_token,
    -                              nego->output_token_length,
    -                              outptr, outlen);
    -
    -  if(result)
    -    return result;
    -
    -  if(!*outptr || !*outlen) {
    +  CURLcode result = Curl_base64_encode((const char *) nego->output_token,
    +                                       nego->output_token_length, outptr,
    +                                       outlen);
    +  if(!result && (!*outptr || !*outlen)) {
         free(*outptr);
    -    return CURLE_REMOTE_ACCESS_DENIED;
    +    result = CURLE_REMOTE_ACCESS_DENIED;
       }
     
    -  return CURLE_OK;
    +  return result;
     }
     
     /*
    diff --git a/vendor/curl/lib/vauth/vauth.h b/vendor/curl/lib/vauth/vauth.h
    index 47a7c0bc81..6e1237834a 100644
    --- a/vendor/curl/lib/vauth/vauth.h
    +++ b/vendor/curl/lib/vauth/vauth.h
    @@ -7,7 +7,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 2014 - 2021, Steve Holme, .
    + * Copyright (C) 2014 - 2022, Steve Holme, .
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -219,8 +219,7 @@ CURLcode Curl_auth_decode_spnego_message(struct Curl_easy *data,
     
     /* This is used to generate a base64 encoded SPNEGO (Negotiate) response
        message */
    -CURLcode Curl_auth_create_spnego_message(struct Curl_easy *data,
    -                                         struct negotiatedata *nego,
    +CURLcode Curl_auth_create_spnego_message(struct negotiatedata *nego,
                                              char **outptr, size_t *outlen);
     
     /* This is used to clean up the SPNEGO specifiec data */
    diff --git a/vendor/curl/lib/version.c b/vendor/curl/lib/version.c
    index c84ef85fb3..e37253df2a 100644
    --- a/vendor/curl/lib/version.c
    +++ b/vendor/curl/lib/version.c
    @@ -5,7 +5,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2021, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -46,10 +46,6 @@
     #include 
     #endif
     
    -#if defined(HAVE_ICONV) && defined(CURL_DOES_CONVERSIONS)
    -#include 
    -#endif
    -
     #ifdef USE_LIBRTMP
     #include 
     #endif
    @@ -106,7 +102,7 @@ static void zstd_version(char *buf, size_t bufsz)
      * zeros in the data.
      */
     
    -#define VERSION_PARTS 17 /* number of substrings we can concatenate */
    +#define VERSION_PARTS 16 /* number of substrings we can concatenate */
     
     char *curl_version(void)
     {
    @@ -135,9 +131,6 @@ char *curl_version(void)
     #ifdef USE_LIBPSL
       char psl_version[40];
     #endif
    -#if defined(HAVE_ICONV) && defined(CURL_DOES_CONVERSIONS)
    -  char iconv_version[40]="iconv";
    -#endif
     #ifdef USE_SSH
       char ssh_version[40];
     #endif
    @@ -206,15 +199,7 @@ char *curl_version(void)
       msnprintf(psl_version, sizeof(psl_version), "libpsl/%s", psl_get_version());
       src[i++] = psl_version;
     #endif
    -#if defined(HAVE_ICONV) && defined(CURL_DOES_CONVERSIONS)
    -#ifdef _LIBICONV_VERSION
    -  msnprintf(iconv_version, sizeof(iconv_version), "iconv/%d.%d",
    -            _LIBICONV_VERSION >> 8, _LIBICONV_VERSION & 255);
    -#else
    -  /* version unknown, let the default stand */
    -#endif /* _LIBICONV_VERSION */
    -  src[i++] = iconv_version;
    -#endif
    +
     #ifdef USE_SSH
       Curl_ssh_version(ssh_version, sizeof(ssh_version));
       src[i++] = ssh_version;
    @@ -433,9 +418,6 @@ static curl_version_info_data version_info = {
     #if defined(WIN32) && defined(UNICODE) && defined(_UNICODE)
       | CURL_VERSION_UNICODE
     #endif
    -#if defined(CURL_DOES_CONVERSIONS)
    -  | CURL_VERSION_CONV
    -#endif
     #if defined(USE_TLS_SRP)
       | CURL_VERSION_TLSAUTH_SRP
     #endif
    @@ -551,15 +533,6 @@ curl_version_info_data *curl_version_info(CURLversion stamp)
       version_info.features |= CURL_VERSION_IDN;
     #endif
     
    -#if defined(HAVE_ICONV) && defined(CURL_DOES_CONVERSIONS)
    -#ifdef _LIBICONV_VERSION
    -  version_info.iconv_ver_num = _LIBICONV_VERSION;
    -#else
    -  /* version unknown */
    -  version_info.iconv_ver_num = -1;
    -#endif /* _LIBICONV_VERSION */
    -#endif
    -
     #if defined(USE_SSH)
       Curl_ssh_version(ssh_buffer, sizeof(ssh_buffer));
       version_info.libssh_version = ssh_buffer;
    diff --git a/vendor/curl/lib/version_win32.c b/vendor/curl/lib/version_win32.c
    index 79a2aa6ab4..afdb1d6a72 100644
    --- a/vendor/curl/lib/version_win32.c
    +++ b/vendor/curl/lib/version_win32.c
    @@ -5,7 +5,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 2016 - 2021, Steve Holme, .
    + * Copyright (C) 2016 - 2022, Steve Holme, .
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -76,6 +76,8 @@ bool curlx_verify_windows_version(const unsigned int majorVersion,
       bool matched = FALSE;
     
     #if defined(CURL_WINDOWS_APP)
    +  (void)buildVersion;
    +
       /* We have no way to determine the Windows version from Windows apps,
          so let's assume we're running on the target Windows version. */
       const WORD fullVersion = MAKEWORD(minorVersion, majorVersion);
    diff --git a/vendor/curl/lib/vquic/ngtcp2.c b/vendor/curl/lib/vquic/ngtcp2.c
    index 1596049b77..aac092b8d2 100644
    --- a/vendor/curl/lib/vquic/ngtcp2.c
    +++ b/vendor/curl/lib/vquic/ngtcp2.c
    @@ -5,7 +5,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2021, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -45,6 +45,7 @@
     #include "strerror.h"
     #include "dynbuf.h"
     #include "vquic.h"
    +#include "h2h3.h"
     #include "vtls/keylog.h"
     
     /* The last 3 #include files should be in this order */
    @@ -1043,7 +1044,7 @@ static int decode_status_code(const uint8_t *value, size_t len)
     }
     
     static int cb_h3_end_headers(nghttp3_conn *conn, int64_t stream_id,
    -                             void *user_data, void *stream_user_data)
    +                             int fin, void *user_data, void *stream_user_data)
     {
       struct Curl_easy *data = stream_user_data;
       struct HTTP *stream = data->req.p.http;
    @@ -1051,6 +1052,7 @@ static int cb_h3_end_headers(nghttp3_conn *conn, int64_t stream_id,
       (void)conn;
       (void)stream_id;
       (void)user_data;
    +  (void)fin;
     
       /* add a CRLF only if we've received some headers */
       if(stream->firstheader) {
    @@ -1078,8 +1080,8 @@ static int cb_h3_recv_header(nghttp3_conn *conn, int64_t stream_id,
       (void)flags;
       (void)user_data;
     
    -  if(h3name.len == sizeof(":status") - 1 &&
    -     !memcmp(":status", h3name.base, h3name.len)) {
    +  if(h3name.len == sizeof(H2H3_PSEUDO_STATUS) - 1 &&
    +     !memcmp(H2H3_PSEUDO_STATUS, h3name.base, h3name.len)) {
         char line[14]; /* status line is always 13 characters long */
         size_t ncopy;
         int status = decode_status_code(h3val.base, h3val.len);
    @@ -1218,6 +1220,8 @@ static size_t drain_overflow_buffer(struct HTTP *stream)
         if(ncopy != overlen)
           /* make the buffer only keep the tail */
           (void)Curl_dyn_tail(&stream->overflow, overlen - ncopy);
    +    else
    +      Curl_dyn_reset(&stream->overflow);
       }
       return ncopy;
     }
    @@ -1383,16 +1387,13 @@ static CURLcode http_request(struct Curl_easy *data, const void *mem,
       struct connectdata *conn = data->conn;
       struct HTTP *stream = data->req.p.http;
       size_t nheader;
    -  size_t i;
    -  size_t authority_idx;
    -  char *hdbuf = (char *)mem;
    -  char *end, *line_end;
       struct quicsocket *qs = conn->quic;
       CURLcode result = CURLE_OK;
       nghttp3_nv *nva = NULL;
       int64_t stream3_id;
       int rc;
       struct h3out *h3out = NULL;
    +  struct h2h3req *hreq = NULL;
     
       rc = ngtcp2_conn_open_bidi_stream(qs->qconn, &stream3_id, NULL);
       if(rc) {
    @@ -1405,158 +1406,23 @@ static CURLcode http_request(struct Curl_easy *data, const void *mem,
       stream->h3req = TRUE; /* senf off! */
       Curl_dyn_init(&stream->overflow, CURL_MAX_READ_SIZE);
     
    -  /* Calculate number of headers contained in [mem, mem + len). Assumes a
    -     correctly generated HTTP header field block. */
    -  nheader = 0;
    -  for(i = 1; i < len; ++i) {
    -    if(hdbuf[i] == '\n' && hdbuf[i - 1] == '\r') {
    -      ++nheader;
    -      ++i;
    -    }
    -  }
    -  if(nheader < 2)
    +  result = Curl_pseudo_headers(data, mem, len, &hreq);
    +  if(result)
         goto fail;
    +  nheader = hreq->entries;
     
    -  /* We counted additional 2 \r\n in the first and last line. We need 3
    -     new headers: :method, :path and :scheme. Therefore we need one
    -     more space. */
    -  nheader += 1;
       nva = malloc(sizeof(nghttp3_nv) * nheader);
       if(!nva) {
         result = CURLE_OUT_OF_MEMORY;
         goto fail;
       }
    -
    -  /* Extract :method, :path from request line
    -     We do line endings with CRLF so checking for CR is enough */
    -  line_end = memchr(hdbuf, '\r', len);
    -  if(!line_end) {
    -    result = CURLE_BAD_FUNCTION_ARGUMENT; /* internal error */
    -    goto fail;
    -  }
    -
    -  /* Method does not contain spaces */
    -  end = memchr(hdbuf, ' ', line_end - hdbuf);
    -  if(!end || end == hdbuf)
    -    goto fail;
    -  nva[0].name = (unsigned char *)":method";
    -  nva[0].namelen = strlen((char *)nva[0].name);
    -  nva[0].value = (unsigned char *)hdbuf;
    -  nva[0].valuelen = (size_t)(end - hdbuf);
    -  nva[0].flags = NGHTTP3_NV_FLAG_NONE;
    -
    -  hdbuf = end + 1;
    -
    -  /* Path may contain spaces so scan backwards */
    -  end = NULL;
    -  for(i = (size_t)(line_end - hdbuf); i; --i) {
    -    if(hdbuf[i - 1] == ' ') {
    -      end = &hdbuf[i - 1];
    -      break;
    -    }
    -  }
    -  if(!end || end == hdbuf)
    -    goto fail;
    -  nva[1].name = (unsigned char *)":path";
    -  nva[1].namelen = strlen((char *)nva[1].name);
    -  nva[1].value = (unsigned char *)hdbuf;
    -  nva[1].valuelen = (size_t)(end - hdbuf);
    -  nva[1].flags = NGHTTP3_NV_FLAG_NONE;
    -
    -  nva[2].name = (unsigned char *)":scheme";
    -  nva[2].namelen = strlen((char *)nva[2].name);
    -  if(conn->handler->flags & PROTOPT_SSL)
    -    nva[2].value = (unsigned char *)"https";
    -  else
    -    nva[2].value = (unsigned char *)"http";
    -  nva[2].valuelen = strlen((char *)nva[2].value);
    -  nva[2].flags = NGHTTP3_NV_FLAG_NONE;
    -
    -
    -  authority_idx = 0;
    -  i = 3;
    -  while(i < nheader) {
    -    size_t hlen;
    -
    -    hdbuf = line_end + 2;
    -
    -    /* check for next CR, but only within the piece of data left in the given
    -       buffer */
    -    line_end = memchr(hdbuf, '\r', len - (hdbuf - (char *)mem));
    -    if(!line_end || (line_end == hdbuf))
    -      goto fail;
    -
    -    /* header continuation lines are not supported */
    -    if(*hdbuf == ' ' || *hdbuf == '\t')
    -      goto fail;
    -
    -    for(end = hdbuf; end < line_end && *end != ':'; ++end)
    -      ;
    -    if(end == hdbuf || end == line_end)
    -      goto fail;
    -    hlen = end - hdbuf;
    -
    -    if(hlen == 4 && strncasecompare("host", hdbuf, 4)) {
    -      authority_idx = i;
    -      nva[i].name = (unsigned char *)":authority";
    -      nva[i].namelen = strlen((char *)nva[i].name);
    -    }
    -    else {
    -      nva[i].namelen = (size_t)(end - hdbuf);
    -      /* Lower case the header name for HTTP/3 */
    -      Curl_strntolower((char *)hdbuf, hdbuf, nva[i].namelen);
    -      nva[i].name = (unsigned char *)hdbuf;
    -    }
    -    nva[i].flags = NGHTTP3_NV_FLAG_NONE;
    -    hdbuf = end + 1;
    -    while(*hdbuf == ' ' || *hdbuf == '\t')
    -      ++hdbuf;
    -    end = line_end;
    -
    -#if 0 /* This should probably go in more or less like this */
    -    switch(inspect_header((const char *)nva[i].name, nva[i].namelen, hdbuf,
    -                          end - hdbuf)) {
    -    case HEADERINST_IGNORE:
    -      /* skip header fields prohibited by HTTP/2 specification. */
    -      --nheader;
    -      continue;
    -    case HEADERINST_TE_TRAILERS:
    -      nva[i].value = (uint8_t*)"trailers";
    -      nva[i].value_len = sizeof("trailers") - 1;
    -      break;
    -    default:
    -      nva[i].value = (unsigned char *)hdbuf;
    -      nva[i].value_len = (size_t)(end - hdbuf);
    -    }
    -#endif
    -    nva[i].value = (unsigned char *)hdbuf;
    -    nva[i].valuelen = (size_t)(end - hdbuf);
    -    nva[i].flags = NGHTTP3_NV_FLAG_NONE;
    -
    -    ++i;
    -  }
    -
    -  /* :authority must come before non-pseudo header fields */
    -  if(authority_idx && authority_idx != AUTHORITY_DST_IDX) {
    -    nghttp3_nv authority = nva[authority_idx];
    -    for(i = authority_idx; i > AUTHORITY_DST_IDX; --i) {
    -      nva[i] = nva[i - 1];
    -    }
    -    nva[i] = authority;
    -  }
    -
    -  /* Warn stream may be rejected if cumulative length of headers is too
    -     large. */
    -#define MAX_ACC 60000  /* <64KB to account for some overhead */
    -  {
    -    size_t acc = 0;
    -    for(i = 0; i < nheader; ++i)
    -      acc += nva[i].namelen + nva[i].valuelen;
    -
    -    if(acc > MAX_ACC) {
    -      infof(data, "http_request: Warning: The cumulative length of all "
    -            "headers exceeds %d bytes and that could cause the "
    -            "stream to be rejected.", MAX_ACC);
    +  else {
    +    unsigned int i;
    +    for(i = 0; i < nheader; i++) {
    +      nva[i].name = (unsigned char *)hreq->header[i].name;
    +      nva[i].namelen = hreq->header[i].namelen;
    +      nva[i].value = (unsigned char *)hreq->header[i].value;
    +      nva[i].valuelen = hreq->header[i].valuelen;
         }
       }
     
    @@ -1605,10 +1471,12 @@ static CURLcode http_request(struct Curl_easy *data, const void *mem,
       infof(data, "Using HTTP/3 Stream ID: %x (easy handle %p)",
             stream3_id, (void *)data);
     
    +  Curl_pseudo_free(hreq);
       return CURLE_OK;
     
     fail:
       free(nva);
    +  Curl_pseudo_free(hreq);
       return result;
     }
     static ssize_t ngh3_stream_send(struct Curl_easy *data,
    @@ -1676,7 +1544,6 @@ static CURLcode ng_has_connected(struct Curl_easy *data,
       if(conn->ssl_config.verifyhost) {
     #ifdef USE_OPENSSL
         X509 *server_cert;
    -    CURLcode result;
         server_cert = SSL_get_peer_certificate(conn->quic->ssl);
         if(!server_cert) {
           return CURLE_PEER_FAILED_VERIFICATION;
    diff --git a/vendor/curl/lib/vquic/quiche.c b/vendor/curl/lib/vquic/quiche.c
    index f7577605c0..132eef98a5 100644
    --- a/vendor/curl/lib/vquic/quiche.c
    +++ b/vendor/curl/lib/vquic/quiche.c
    @@ -5,7 +5,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2021, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -25,6 +25,7 @@
     #ifdef USE_QUICHE
     #include 
     #include 
    +#include 
     #include "urldata.h"
     #include "sendf.h"
     #include "strdup.h"
    @@ -35,6 +36,10 @@
     #include "connect.h"
     #include "strerror.h"
     #include "vquic.h"
    +#include "transfer.h"
    +#include "h2h3.h"
    +#include "vtls/openssl.h"
    +#include "vtls/keylog.h"
     
     /* The last 3 #include files should be in this order */
     #include "curl_printf.h"
    @@ -172,6 +177,68 @@ static void quiche_debug_log(const char *line, void *argp)
     }
     #endif
     
    +static void keylog_callback(const SSL *ssl, const char *line)
    +{
    +  (void)ssl;
    +  Curl_tls_keylog_write_line(line);
    +}
    +
    +static SSL_CTX *quic_ssl_ctx(struct Curl_easy *data)
    +{
    +  SSL_CTX *ssl_ctx = SSL_CTX_new(TLS_method());
    +
    +  SSL_CTX_set_alpn_protos(ssl_ctx,
    +                          (const uint8_t *)QUICHE_H3_APPLICATION_PROTOCOL,
    +                          sizeof(QUICHE_H3_APPLICATION_PROTOCOL) - 1);
    +
    +  SSL_CTX_set_default_verify_paths(ssl_ctx);
    +
    +  /* Open the file if a TLS or QUIC backend has not done this before. */
    +  Curl_tls_keylog_open();
    +  if(Curl_tls_keylog_enabled()) {
    +    SSL_CTX_set_keylog_callback(ssl_ctx, keylog_callback);
    +  }
    +
    +  {
    +    struct connectdata *conn = data->conn;
    +    const char * const ssl_cafile = conn->ssl_config.CAfile;
    +    const char * const ssl_capath = conn->ssl_config.CApath;
    +
    +    if(conn->ssl_config.verifypeer) {
    +      SSL_CTX_set_verify(ssl_ctx, SSL_VERIFY_PEER, NULL);
    +      /* tell OpenSSL where to find CA certificates that are used to verify
    +         the server's certificate. */
    +      if(!SSL_CTX_load_verify_locations(ssl_ctx, ssl_cafile, ssl_capath)) {
    +        /* Fail if we insist on successfully verifying the server. */
    +        failf(data, "error setting certificate verify locations:"
    +              "  CAfile: %s CApath: %s",
    +              ssl_cafile ? ssl_cafile : "none",
    +              ssl_capath ? ssl_capath : "none");
    +        return NULL;
    +      }
    +      infof(data, " CAfile: %s", ssl_cafile ? ssl_cafile : "none");
    +      infof(data, " CApath: %s", ssl_capath ? ssl_capath : "none");
    +    }
    +  }
    +  return ssl_ctx;
    +}
    +
    +static int quic_init_ssl(struct quicsocket *qs, struct connectdata *conn)
    +{
    +  /* this will need some attention when HTTPS proxy over QUIC get fixed */
    +  const char * const hostname = conn->host.name;
    +
    +  DEBUGASSERT(!qs->ssl);
    +  qs->ssl = SSL_new(qs->sslctx);
    +
    +  SSL_set_app_data(qs->ssl, qs);
    +
    +  /* set SNI */
    +  SSL_set_tlsext_host_name(qs->ssl, hostname);
    +  return 0;
    +}
    +
    +
     CURLcode Curl_quic_connect(struct Curl_easy *data,
                                struct connectdata *conn, curl_socket_t sockfd,
                                int sockindex,
    @@ -179,7 +246,6 @@ CURLcode Curl_quic_connect(struct Curl_easy *data,
     {
       CURLcode result;
       struct quicsocket *qs = &conn->hequic[sockindex];
    -  char *keylog_file = NULL;
       char ipbuf[40];
       int port;
     
    @@ -216,25 +282,25 @@ CURLcode Curl_quic_connect(struct Curl_easy *data,
                                            sizeof(QUICHE_H3_APPLICATION_PROTOCOL)
                                            - 1);
     
    +  qs->sslctx = quic_ssl_ctx(data);
    +  if(!qs->sslctx)
    +    return CURLE_QUIC_CONNECT_ERROR;
    +
    +  if(quic_init_ssl(qs, conn))
    +    return CURLE_QUIC_CONNECT_ERROR;
    +
       result = Curl_rand(data, qs->scid, sizeof(qs->scid));
       if(result)
         return result;
     
    -  keylog_file = getenv("SSLKEYLOGFILE");
    -
    -  if(keylog_file)
    -    quiche_config_log_keys(qs->cfg);
    -
    -  qs->conn = quiche_connect(conn->host.name, (const uint8_t *) qs->scid,
    -                            sizeof(qs->scid), addr, addrlen, qs->cfg);
    +  qs->conn = quiche_conn_new_with_tls((const uint8_t *) qs->scid,
    +                                      sizeof(qs->scid), NULL, 0, addr, addrlen,
    +                                      qs->cfg, qs->ssl, false);
       if(!qs->conn) {
         failf(data, "can't create quiche connection");
         return CURLE_OUT_OF_MEMORY;
       }
     
    -  if(keylog_file)
    -    quiche_conn_set_keylog_path(qs->conn, keylog_file);
    -
       /* Known to not work on Windows */
     #if !defined(WIN32) && defined(HAVE_QUICHE_CONN_SET_QLOG_FD)
       {
    @@ -284,7 +350,8 @@ CURLcode Curl_quic_connect(struct Curl_easy *data,
       return CURLE_OK;
     }
     
    -static CURLcode quiche_has_connected(struct connectdata *conn,
    +static CURLcode quiche_has_connected(struct Curl_easy *data,
    +                                     struct connectdata *conn,
                                          int sockindex,
                                          int tempindex)
     {
    @@ -298,6 +365,21 @@ static CURLcode quiche_has_connected(struct connectdata *conn,
       conn->httpversion = 30;
       conn->bundle->multiuse = BUNDLE_MULTIPLEX;
     
    +  if(conn->ssl_config.verifyhost) {
    +    X509 *server_cert;
    +    server_cert = SSL_get_peer_certificate(qs->ssl);
    +    if(!server_cert) {
    +      return CURLE_PEER_FAILED_VERIFICATION;
    +    }
    +    result = Curl_ossl_verifyhost(data, conn, server_cert);
    +    X509_free(server_cert);
    +    if(result)
    +      return result;
    +    infof(data, "Verified certificate just fine");
    +  }
    +  else
    +    infof(data, "Skipped certificate verification");
    +
       qs->h3config = quiche_h3_config_new();
       if(!qs->h3config)
         return CURLE_OUT_OF_MEMORY;
    @@ -344,7 +426,7 @@ CURLcode Curl_quic_is_connected(struct Curl_easy *data,
     
       if(quiche_conn_is_established(qs->conn)) {
         *done = TRUE;
    -    result = quiche_has_connected(conn, 0, sockindex);
    +    result = quiche_has_connected(data, conn, 0, sockindex);
         DEBUGF(infof(data, "quiche established connection!"));
       }
     
    @@ -392,7 +474,18 @@ static CURLcode process_ingress(struct Curl_easy *data, int sockfd,
           break;
     
         if(recvd < 0) {
    +      if(QUICHE_ERR_TLS_FAIL == recvd) {
    +        long verify_ok = SSL_get_verify_result(qs->ssl);
    +        if(verify_ok != X509_V_OK) {
    +          failf(data, "SSL certificate problem: %s",
    +                X509_verify_cert_error_string(verify_ok));
    +
    +          return CURLE_PEER_FAILED_VERIFICATION;
    +        }
    +      }
    +
           failf(data, "quiche_conn_recv() == %zd", recvd);
    +
           return CURLE_RECV_ERROR;
         }
       } while(1);
    @@ -451,7 +544,7 @@ static int cb_each_header(uint8_t *name, size_t name_len,
       struct h3h1header *headers = (struct h3h1header *)argp;
       size_t olen = 0;
     
    -  if((name_len == 7) && !strncmp(":status", (char *)name, 7)) {
    +  if((name_len == 7) && !strncmp(H2H3_PSEUDO_STATUS, (char *)name, 7)) {
         msnprintf(headers->dest,
                   headers->destlen, "HTTP/3 %.*s\n",
                   (int) value_len, value);
    @@ -496,6 +589,19 @@ static ssize_t h3_stream_recv(struct Curl_easy *data,
         return -1;
       }
     
    +  if(qs->h3_recving) {
    +    /* body receiving state */
    +    rcode = quiche_h3_recv_body(qs->h3c, qs->conn, stream->stream3_id,
    +                                (unsigned char *)buf, buffersize);
    +    if(rcode <= 0) {
    +      recvd = -1;
    +      qs->h3_recving = FALSE;
    +      /* fall through into the while loop below */
    +    }
    +    else
    +      recvd = rcode;
    +  }
    +
       while(recvd < 0) {
         int64_t s = quiche_h3_conn_poll(qs->h3c, qs->conn, &ev);
         if(s < 0)
    @@ -537,9 +643,15 @@ static ssize_t h3_stream_recv(struct Curl_easy *data,
             recvd = -1;
             break;
           }
    +      qs->h3_recving = TRUE;
           recvd += rcode;
           break;
     
    +    case QUICHE_H3_EVENT_RESET:
    +      streamclose(conn, "Stream reset");
    +      *curlcode = CURLE_PARTIAL_FILE;
    +      return -1;
    +
         case QUICHE_H3_EVENT_FINISHED:
           streamclose(conn, "End of stream");
           recvd = 0; /* end of stream */
    @@ -585,10 +697,12 @@ static ssize_t h3_stream_send(struct Curl_easy *data,
         sent = len;
       }
       else {
    -    H3BUGF(infof(data, "Pass on %zd body bytes to quiche", len));
         sent = quiche_h3_send_body(qs->h3c, qs->conn, stream->stream3_id,
                                    (uint8_t *)mem, len, FALSE);
    -    if(sent < 0) {
    +    if(sent == QUICHE_H3_ERR_DONE) {
    +      sent = 0;
    +    }
    +    else if(sent < 0) {
           *curlcode = CURLE_SEND_ERROR;
           return -1;
         }
    @@ -618,175 +732,34 @@ void Curl_quic_ver(char *p, size_t len)
     static CURLcode http_request(struct Curl_easy *data, const void *mem,
                                  size_t len)
     {
    -  /*
    -   */
       struct connectdata *conn = data->conn;
       struct HTTP *stream = data->req.p.http;
       size_t nheader;
    -  size_t i;
    -  size_t authority_idx;
    -  char *hdbuf = (char *)mem;
    -  char *end, *line_end;
       int64_t stream3_id;
       quiche_h3_header *nva = NULL;
       struct quicsocket *qs = conn->quic;
       CURLcode result = CURLE_OK;
    +  struct h2h3req *hreq = NULL;
     
       stream->h3req = TRUE; /* senf off! */
     
    -  /* Calculate number of headers contained in [mem, mem + len). Assumes a
    -     correctly generated HTTP header field block. */
    -  nheader = 0;
    -  for(i = 1; i < len; ++i) {
    -    if(hdbuf[i] == '\n' && hdbuf[i - 1] == '\r') {
    -      ++nheader;
    -      ++i;
    -    }
    -  }
    -  if(nheader < 2)
    +  result = Curl_pseudo_headers(data, mem, len, &hreq);
    +  if(result)
         goto fail;
    +  nheader = hreq->entries;
     
    -  /* We counted additional 2 \r\n in the first and last line. We need 3
    -     new headers: :method, :path and :scheme. Therefore we need one
    -     more space. */
    -  nheader += 1;
       nva = malloc(sizeof(quiche_h3_header) * nheader);
       if(!nva) {
         result = CURLE_OUT_OF_MEMORY;
         goto fail;
       }
    -
    -  /* Extract :method, :path from request line
    -     We do line endings with CRLF so checking for CR is enough */
    -  line_end = memchr(hdbuf, '\r', len);
    -  if(!line_end) {
    -    result = CURLE_BAD_FUNCTION_ARGUMENT; /* internal error */
    -    goto fail;
    -  }
    -
    -  /* Method does not contain spaces */
    -  end = memchr(hdbuf, ' ', line_end - hdbuf);
    -  if(!end || end == hdbuf)
    -    goto fail;
    -  nva[0].name = (unsigned char *)":method";
    -  nva[0].name_len = strlen((char *)nva[0].name);
    -  nva[0].value = (unsigned char *)hdbuf;
    -  nva[0].value_len = (size_t)(end - hdbuf);
    -
    -  hdbuf = end + 1;
    -
    -  /* Path may contain spaces so scan backwards */
    -  end = NULL;
    -  for(i = (size_t)(line_end - hdbuf); i; --i) {
    -    if(hdbuf[i - 1] == ' ') {
    -      end = &hdbuf[i - 1];
    -      break;
    -    }
    -  }
    -  if(!end || end == hdbuf)
    -    goto fail;
    -  nva[1].name = (unsigned char *)":path";
    -  nva[1].name_len = strlen((char *)nva[1].name);
    -  nva[1].value = (unsigned char *)hdbuf;
    -  nva[1].value_len = (size_t)(end - hdbuf);
    -
    -  nva[2].name = (unsigned char *)":scheme";
    -  nva[2].name_len = strlen((char *)nva[2].name);
    -  if(conn->handler->flags & PROTOPT_SSL)
    -    nva[2].value = (unsigned char *)"https";
    -  else
    -    nva[2].value = (unsigned char *)"http";
    -  nva[2].value_len = strlen((char *)nva[2].value);
    -
    -
    -  authority_idx = 0;
    -  i = 3;
    -  while(i < nheader) {
    -    size_t hlen;
    -
    -    hdbuf = line_end + 2;
    -
    -    /* check for next CR, but only within the piece of data left in the given
    -       buffer */
    -    line_end = memchr(hdbuf, '\r', len - (hdbuf - (char *)mem));
    -    if(!line_end || (line_end == hdbuf))
    -      goto fail;
    -
    -    /* header continuation lines are not supported */
    -    if(*hdbuf == ' ' || *hdbuf == '\t')
    -      goto fail;
    -
    -    for(end = hdbuf; end < line_end && *end != ':'; ++end)
    -      ;
    -    if(end == hdbuf || end == line_end)
    -      goto fail;
    -    hlen = end - hdbuf;
    -
    -    if(hlen == 4 && strncasecompare("host", hdbuf, 4)) {
    -      authority_idx = i;
    -      nva[i].name = (unsigned char *)":authority";
    -      nva[i].name_len = strlen((char *)nva[i].name);
    -    }
    -    else {
    -      nva[i].name_len = (size_t)(end - hdbuf);
    -      /* Lower case the header name for HTTP/3 */
    -      Curl_strntolower((char *)hdbuf, hdbuf, nva[i].name_len);
    -      nva[i].name = (unsigned char *)hdbuf;
    -    }
    -    hdbuf = end + 1;
    -    while(*hdbuf == ' ' || *hdbuf == '\t')
    -      ++hdbuf;
    -    end = line_end;
    -
    -#if 0 /* This should probably go in more or less like this */
    -    switch(inspect_header((const char *)nva[i].name, nva[i].namelen, hdbuf,
    -                          end - hdbuf)) {
    -    case HEADERINST_IGNORE:
    -      /* skip header fields prohibited by HTTP/2 specification. */
    -      --nheader;
    -      continue;
    -    case HEADERINST_TE_TRAILERS:
    -      nva[i].value = (uint8_t*)"trailers";
    -      nva[i].value_len = sizeof("trailers") - 1;
    -      break;
    -    default:
    -      nva[i].value = (unsigned char *)hdbuf;
    -      nva[i].value_len = (size_t)(end - hdbuf);
    -    }
    -#endif
    -    nva[i].value = (unsigned char *)hdbuf;
    -    nva[i].value_len = (size_t)(end - hdbuf);
    -
    -    ++i;
    -  }
    -
    -  /* :authority must come before non-pseudo header fields */
    -  if(authority_idx && authority_idx != AUTHORITY_DST_IDX) {
    -    quiche_h3_header authority = nva[authority_idx];
    -    for(i = authority_idx; i > AUTHORITY_DST_IDX; --i) {
    -      nva[i] = nva[i - 1];
    -    }
    -    nva[i] = authority;
    -  }
    -
    -  /* Warn stream may be rejected if cumulative length of headers is too
    -     large. */
    -#define MAX_ACC 60000  /* <64KB to account for some overhead */
    -  {
    -    size_t acc = 0;
    -
    -    for(i = 0; i < nheader; ++i) {
    -      acc += nva[i].name_len + nva[i].value_len;
    -
    -      H3BUGF(infof(data, "h3 [%.*s: %.*s]",
    -                   nva[i].name_len, nva[i].name,
    -                   nva[i].value_len, nva[i].value));
    -    }
    -
    -    if(acc > MAX_ACC) {
    -      infof(data, "http_request: Warning: The cumulative length of all "
    -            "headers exceeds %d bytes and that could cause the "
    -            "stream to be rejected.", MAX_ACC);
    +  else {
    +    unsigned int i;
    +    for(i = 0; i < nheader; i++) {
    +      nva[i].name = (unsigned char *)hreq->header[i].name;
    +      nva[i].name_len = hreq->header[i].namelen;
    +      nva[i].value = (unsigned char *)hreq->header[i].value;
    +      nva[i].value_len = hreq->header[i].valuelen;
         }
       }
     
    @@ -833,10 +806,12 @@ static CURLcode http_request(struct Curl_easy *data, const void *mem,
             stream3_id, (void *)data);
       stream->stream3_id = stream3_id;
     
    +  Curl_pseudo_free(hreq);
       return CURLE_OK;
     
     fail:
       free(nva);
    +  Curl_pseudo_free(hreq);
       return result;
     }
     
    diff --git a/vendor/curl/lib/vquic/quiche.h b/vendor/curl/lib/vquic/quiche.h
    index d311e99887..759a20bbac 100644
    --- a/vendor/curl/lib/vquic/quiche.h
    +++ b/vendor/curl/lib/vquic/quiche.h
    @@ -7,7 +7,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2020, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -27,6 +27,7 @@
     #ifdef USE_QUICHE
     
     #include 
    +#include 
     
     struct quic_handshake {
       char *buf;       /* pointer to the buffer */
    @@ -43,6 +44,9 @@ struct quicsocket {
       uint8_t scid[QUICHE_MAX_CONN_ID_LEN];
       curl_socket_t sockfd;
       uint32_t version;
    +  SSL_CTX *sslctx;
    +  SSL *ssl;
    +  bool h3_recving; /* TRUE when in h3-body-reading state */
     };
     
     #endif
    diff --git a/vendor/curl/lib/vquic/vquic.c b/vendor/curl/lib/vquic/vquic.c
    index 7c0cc6df2a..be2a65f454 100644
    --- a/vendor/curl/lib/vquic/vquic.c
    +++ b/vendor/curl/lib/vquic/vquic.c
    @@ -5,7 +5,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2020, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -67,7 +67,7 @@ CURLcode Curl_qlogdir(struct Curl_easy *data,
           result = Curl_dyn_add(&fname, hex);
         }
         if(!result)
    -      result = Curl_dyn_add(&fname, ".qlog");
    +      result = Curl_dyn_add(&fname, ".sqlog");
     
         if(!result) {
           int qlogfd = open(Curl_dyn_ptr(&fname), QLOGMODE,
    diff --git a/vendor/curl/lib/vquic/vquic.h b/vendor/curl/lib/vquic/vquic.h
    index eb8a893d92..3df138f10e 100644
    --- a/vendor/curl/lib/vquic/vquic.h
    +++ b/vendor/curl/lib/vquic/vquic.h
    @@ -7,7 +7,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2020, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    diff --git a/vendor/curl/lib/vssh/libssh.c b/vendor/curl/lib/vssh/libssh.c
    index 3e317e87c9..9879161b64 100644
    --- a/vendor/curl/lib/vssh/libssh.c
    +++ b/vendor/curl/lib/vssh/libssh.c
    @@ -5,7 +5,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 2017 - 2021 Red Hat, Inc.
    + * Copyright (C) 2017 - 2022 Red Hat, Inc.
      *
      * Authors: Nikos Mavrogiannopoulos, Tomas Mraz, Stanislav Zidek,
      *          Robert Kolcun, Andreas Schneider
    @@ -32,10 +32,6 @@
     #include 
     #include 
     
    -#ifdef HAVE_FCNTL_H
    -#include 
    -#endif
    -
     #ifdef HAVE_NETINET_IN_H
     #include 
     #endif
    @@ -81,18 +77,22 @@
     #include "multiif.h"
     #include "select.h"
     #include "warnless.h"
    +#include "curl_path.h"
     
    -/* for permission and open flags */
    -#include 
    +#ifdef HAVE_SYS_STAT_H
     #include 
    +#endif
    +#ifdef HAVE_UNISTD_H
     #include 
    +#endif
    +#ifdef HAVE_FCNTL_H
     #include 
    +#endif
     
     /* The last 3 #include files should be in this order */
     #include "curl_printf.h"
     #include "curl_memory.h"
     #include "memdebug.h"
    -#include "curl_path.h"
     
     /* A recent macro provided by libssh. Or make our own. */
     #ifndef SSH_STRING_FREE_CHAR
    @@ -1468,8 +1468,8 @@ static CURLcode myssh_statemach_act(struct Curl_easy *data, bool *block)
               memcpy(sshc->readdir_line, sshc->readdir_longentry,
                      sshc->readdir_currLen);
               if((sshc->readdir_attrs->flags & SSH_FILEXFER_ATTR_PERMISSIONS) &&
    -             ((sshc->readdir_attrs->permissions & S_IFMT) ==
    -              S_IFLNK)) {
    +             ((sshc->readdir_attrs->permissions & SSH_S_IFMT) ==
    +              SSH_S_IFLNK)) {
                 sshc->readdir_linkPath = aprintf("%s%s", protop->path,
                                                  sshc->readdir_filename);
     
    diff --git a/vendor/curl/lib/vssh/libssh2.c b/vendor/curl/lib/vssh/libssh2.c
    index 581bc1be82..db3967f544 100644
    --- a/vendor/curl/lib/vssh/libssh2.c
    +++ b/vendor/curl/lib/vssh/libssh2.c
    @@ -5,7 +5,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2021, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -433,7 +433,9 @@ static int sshkeycallback(struct Curl_easy *easy,
      * libssh2 1.2.8 fixed the problem with 32bit ints used for sockets on win64.
      */
     #ifdef HAVE_LIBSSH2_SESSION_HANDSHAKE
    -#define libssh2_session_startup(x,y) libssh2_session_handshake(x,y)
    +#define session_startup(x,y) libssh2_session_handshake(x, y)
    +#else
    +#define session_startup(x,y) libssh2_session_startup(x, (int)y)
     #endif
     
     static CURLcode ssh_knownhost(struct Curl_easy *data)
    @@ -661,7 +663,7 @@ static CURLcode ssh_check_fingerprint(struct Curl_easy *data)
     
         /* The length of fingerprint is 32 bytes for SHA256.
          * See libssh2_hostkey_hash documentation. */
    -    if(Curl_base64_encode(data, fingerprint, 32, &fingerprint_b64,
    +    if(Curl_base64_encode(fingerprint, 32, &fingerprint_b64,
                               &fingerprint_b64_len) != CURLE_OK) {
           state(data, SSH_SESSION_FREE);
           sshc->actualcode = CURLE_PEER_FAILED_VERIFICATION;
    @@ -932,7 +934,7 @@ static CURLcode ssh_statemach_act(struct Curl_easy *data, bool *block)
           /* FALLTHROUGH */
     
         case SSH_S_STARTUP:
    -      rc = libssh2_session_startup(sshc->ssh_session, (int)sock);
    +      rc = session_startup(sshc->ssh_session, sock);
           if(rc == LIBSSH2_ERROR_EAGAIN) {
             break;
           }
    diff --git a/vendor/curl/lib/vtls/bearssl.c b/vendor/curl/lib/vtls/bearssl.c
    index 9b772d064d..77e22cf3e0 100644
    --- a/vendor/curl/lib/vtls/bearssl.c
    +++ b/vendor/curl/lib/vtls/bearssl.c
    @@ -5,7 +5,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 2019 - 2021, Michael Forney, 
    + * Copyright (C) 2019 - 2022, Michael Forney, 
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -39,8 +39,10 @@
     struct x509_context {
       const br_x509_class *vtable;
       br_x509_minimal_context minimal;
    +  br_x509_decoder_context decoder;
       bool verifyhost;
       bool verifypeer;
    +  int cert_num;
     };
     
     struct ssl_backend_data {
    @@ -159,6 +161,18 @@ static CURLcode load_cafile(struct cafile_source *source,
             if(strcmp(name, "CERTIFICATE") && strcmp(name, "X509 CERTIFICATE"))
               break;
             br_x509_decoder_init(&ca.xc, append_dn, &ca);
    +        ca.in_cert = TRUE;
    +        ca.dn_len = 0;
    +        break;
    +      case BR_PEM_END_OBJ:
    +        if(!ca.in_cert)
    +          break;
    +        ca.in_cert = FALSE;
    +        if(br_x509_decoder_last_error(&ca.xc)) {
    +          ca.err = CURLE_SSL_CACERT_BADFILE;
    +          goto fail;
    +        }
    +        /* add trust anchor */
             if(ca.anchors_len == SIZE_MAX / sizeof(ca.anchors[0])) {
               ca.err = CURLE_OUT_OF_MEMORY;
               goto fail;
    @@ -172,19 +186,8 @@ static CURLcode load_cafile(struct cafile_source *source,
             }
             ca.anchors = new_anchors;
             ca.anchors_len = new_anchors_len;
    -        ca.in_cert = TRUE;
    -        ca.dn_len = 0;
             ta = &ca.anchors[ca.anchors_len - 1];
             ta->dn.data = NULL;
    -        break;
    -      case BR_PEM_END_OBJ:
    -        if(!ca.in_cert)
    -          break;
    -        ca.in_cert = FALSE;
    -        if(br_x509_decoder_last_error(&ca.xc)) {
    -          ca.err = CURLE_SSL_CACERT_BADFILE;
    -          goto fail;
    -        }
             ta->flags = 0;
             if(br_x509_decoder_isCA(&ca.xc))
               ta->flags |= BR_X509_TA_CA;
    @@ -238,6 +241,8 @@ static CURLcode load_cafile(struct cafile_source *source,
       } while(source->type != CAFILE_SOURCE_BLOB);
       if(fp && ferror(fp))
         ca.err = CURLE_READ_ERROR;
    +  else if(ca.in_cert)
    +    ca.err = CURLE_SSL_CACERT_BADFILE;
     
     fail:
       if(fp)
    @@ -260,6 +265,11 @@ static void x509_start_chain(const br_x509_class **ctx,
     {
       struct x509_context *x509 = (struct x509_context *)ctx;
     
    +  if(!x509->verifypeer) {
    +    x509->cert_num = 0;
    +    return;
    +  }
    +
       if(!x509->verifyhost)
         server_name = NULL;
       x509->minimal.vtable->start_chain(&x509->minimal.vtable, server_name);
    @@ -269,6 +279,13 @@ static void x509_start_cert(const br_x509_class **ctx, uint32_t length)
     {
       struct x509_context *x509 = (struct x509_context *)ctx;
     
    +  if(!x509->verifypeer) {
    +    /* Only decode the first cert in the chain to obtain the public key */
    +    if(x509->cert_num == 0)
    +      br_x509_decoder_init(&x509->decoder, NULL, NULL);
    +    return;
    +  }
    +
       x509->minimal.vtable->start_cert(&x509->minimal.vtable, length);
     }
     
    @@ -277,6 +294,12 @@ static void x509_append(const br_x509_class **ctx, const unsigned char *buf,
     {
       struct x509_context *x509 = (struct x509_context *)ctx;
     
    +  if(!x509->verifypeer) {
    +    if(x509->cert_num == 0)
    +      br_x509_decoder_push(&x509->decoder, buf, len);
    +    return;
    +  }
    +
       x509->minimal.vtable->append(&x509->minimal.vtable, buf, len);
     }
     
    @@ -284,21 +307,23 @@ static void x509_end_cert(const br_x509_class **ctx)
     {
       struct x509_context *x509 = (struct x509_context *)ctx;
     
    +  if(!x509->verifypeer) {
    +    x509->cert_num++;
    +    return;
    +  }
    +
       x509->minimal.vtable->end_cert(&x509->minimal.vtable);
     }
     
     static unsigned x509_end_chain(const br_x509_class **ctx)
     {
       struct x509_context *x509 = (struct x509_context *)ctx;
    -  unsigned err;
     
    -  err = x509->minimal.vtable->end_chain(&x509->minimal.vtable);
    -  if(err && !x509->verifypeer) {
    -    /* ignore any X.509 errors */
    -    err = BR_ERR_OK;
    +  if(!x509->verifypeer) {
    +    return br_x509_decoder_last_error(&x509->decoder);
       }
     
    -  return err;
    +  return x509->minimal.vtable->end_chain(&x509->minimal.vtable);
     }
     
     static const br_x509_pkey *x509_get_pkey(const br_x509_class *const *ctx,
    @@ -306,6 +331,15 @@ static const br_x509_pkey *x509_get_pkey(const br_x509_class *const *ctx,
     {
       struct x509_context *x509 = (struct x509_context *)ctx;
     
    +  if(!x509->verifypeer) {
    +    /* Nothing in the chain is verified, just return the public key of the
    +       first certificate and allow its usage for both TLS_RSA_* and
    +       TLS_ECDHE_* */
    +    if(usages)
    +      *usages = BR_KEYTYPE_KEYX | BR_KEYTYPE_SIGN;
    +    return br_x509_decoder_get_pkey(&x509->decoder);
    +  }
    +
       return x509->minimal.vtable->get_pkey(&x509->minimal.vtable, usages);
     }
     
    @@ -339,6 +373,8 @@ static CURLcode bearssl_connect_step1(struct Curl_easy *data,
       struct in_addr addr;
     #endif
     
    +  DEBUGASSERT(backend);
    +
       switch(SSL_CONN_CONFIG(version)) {
       case CURL_SSLVERSION_SSLv2:
         failf(data, "BearSSL does not support SSLv2");
    @@ -465,8 +501,16 @@ static CURLcode bearssl_connect_step1(struct Curl_easy *data,
         }
         hostname = NULL;
       }
    +  else {
    +    char *snihost = Curl_ssl_snihost(data, hostname, NULL);
    +    if(!snihost) {
    +      failf(data, "Failed to set SNI");
    +      return CURLE_SSL_CONNECT_ERROR;
    +    }
    +    hostname = snihost;
    +  }
     
    -  if(!br_ssl_client_reset(&backend->ctx, hostname, 0))
    +  if(!br_ssl_client_reset(&backend->ctx, hostname, 1))
         return CURLE_FAILED_INIT;
       backend->active = TRUE;
     
    @@ -488,6 +532,8 @@ static CURLcode bearssl_run_until(struct Curl_easy *data,
       ssize_t ret;
       int err;
     
    +  DEBUGASSERT(backend);
    +
       for(;;) {
         state = br_ssl_engine_current_state(&backend->ctx.eng);
         if(state & BR_SSL_CLOSED) {
    @@ -560,6 +606,8 @@ static CURLcode bearssl_connect_step2(struct Curl_easy *data,
       struct ssl_backend_data *backend = connssl->backend;
       CURLcode ret;
     
    +  DEBUGASSERT(backend);
    +
       ret = bearssl_run_until(data, conn, sockindex,
                               BR_SSL_SENDAPP | BR_SSL_RECVAPP);
       if(ret == CURLE_AGAIN)
    @@ -582,6 +630,7 @@ static CURLcode bearssl_connect_step3(struct Curl_easy *data,
       CURLcode ret;
     
       DEBUGASSERT(ssl_connect_3 == connssl->connecting_state);
    +  DEBUGASSERT(backend);
     
       if(conn->bits.tls_enable_alpn) {
         const char *protocol;
    @@ -647,6 +696,8 @@ static ssize_t bearssl_send(struct Curl_easy *data, int sockindex,
       unsigned char *app;
       size_t applen;
     
    +  DEBUGASSERT(backend);
    +
       for(;;) {
         *err = bearssl_run_until(data, conn, sockindex, BR_SSL_SENDAPP);
         if (*err != CURLE_OK)
    @@ -680,6 +731,8 @@ static ssize_t bearssl_recv(struct Curl_easy *data, int sockindex,
       unsigned char *app;
       size_t applen;
     
    +  DEBUGASSERT(backend);
    +
       *err = bearssl_run_until(data, conn, sockindex, BR_SSL_RECVAPP);
       if(*err != CURLE_OK)
         return -1;
    @@ -805,6 +858,7 @@ static bool bearssl_data_pending(const struct connectdata *conn,
     {
       const struct ssl_connect_data *connssl = &conn->ssl[connindex];
       struct ssl_backend_data *backend = connssl->backend;
    +  DEBUGASSERT(backend);
       return br_ssl_engine_current_state(&backend->ctx.eng) & BR_SSL_RECVAPP;
     }
     
    @@ -854,6 +908,7 @@ static void *bearssl_get_internals(struct ssl_connect_data *connssl,
                                        CURLINFO info UNUSED_PARAM)
     {
       struct ssl_backend_data *backend = connssl->backend;
    +  DEBUGASSERT(backend);
       return &backend->ctx;
     }
     
    @@ -864,6 +919,8 @@ static void bearssl_close(struct Curl_easy *data,
       struct ssl_backend_data *backend = connssl->backend;
       size_t i;
     
    +  DEBUGASSERT(backend);
    +
       if(backend->active) {
         br_ssl_engine_close(&backend->ctx.eng);
         (void)bearssl_run_until(data, conn, sockindex, BR_SSL_CLOSED);
    diff --git a/vendor/curl/lib/vtls/gskit.c b/vendor/curl/lib/vtls/gskit.c
    index e451f6aebe..56d48497db 100644
    --- a/vendor/curl/lib/vtls/gskit.c
    +++ b/vendor/curl/lib/vtls/gskit.c
    @@ -5,7 +5,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2021, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -28,6 +28,7 @@
     #include 
     #undef HAVE_SOCKETPAIR /* because the native one isn't good enough */
     #include "socketpair.h"
    +#include "strerror.h"
     
     /* Some symbols are undefined/unsupported on OS400 versions < V7R1. */
     #ifndef GSK_SSL_EXTN_SERVERNAME_REQUEST
    @@ -247,10 +248,10 @@ static CURLcode set_enum(struct Curl_easy *data, gsk_handle h,
     
     
     static CURLcode set_buffer(struct Curl_easy *data, gsk_handle h,
    -                        GSK_BUF_ID id, const char *buffer, bool unsupported_ok)
    +                        GSK_BUF_ID id, const char *buf, bool unsupported_ok)
     {
       char buffer[STRERROR_LEN];
    -  int rc = gsk_attribute_set_buffer(h, id, buffer, 0);
    +  int rc = gsk_attribute_set_buffer(h, id, buf, 0);
     
       switch(rc) {
       case GSK_OK:
    @@ -513,6 +514,8 @@ static void cancel_async_handshake(struct connectdata *conn, int sockindex)
       struct ssl_connect_data *connssl = &conn->ssl[sockindex];
       Qso_OverlappedIO_t cstat;
     
    +  DEBUGASSERT(BACKEND);
    +
       if(QsoCancelOperation(conn->sock[sockindex], 0) > 0)
         QsoWaitForIOCompletion(BACKEND->iocport, &cstat, (struct timeval *) NULL);
     }
    @@ -520,6 +523,7 @@ static void cancel_async_handshake(struct connectdata *conn, int sockindex)
     
     static void close_async_handshake(struct ssl_connect_data *connssl)
     {
    +  DEBUGASSERT(BACKEND);
       QsoDestroyIOCompletionPort(BACKEND->iocport);
       BACKEND->iocport = -1;
     }
    @@ -530,36 +534,36 @@ static int pipe_ssloverssl(struct connectdata *conn, int sockindex,
     #ifndef CURL_DISABLE_PROXY
       struct ssl_connect_data *connssl = &conn->ssl[sockindex];
       struct ssl_connect_data *connproxyssl = &conn->proxy_ssl[sockindex];
    -  fd_set fds_read;
    -  fd_set fds_write;
    +  struct pollfd fds[2];
       int n;
       int m;
       int i;
       int ret = 0;
       char buf[CURL_MAX_WRITE_SIZE];
     
    +  DEBUGASSERT(BACKEND);
    +  DEBUGASSERT(connproxyssl->backend);
    +
       if(!connssl->use || !connproxyssl->use)
         return 0;   /* No SSL over SSL: OK. */
     
    -  FD_ZERO(&fds_read);
    -  FD_ZERO(&fds_write);
    -  n = -1;
    +  n = 1;
    +  fds[0].fd = BACKEND->remotefd;
    +  fds[1].fd = conn->sock[sockindex];
    +
       if(directions & SOS_READ) {
    -    FD_SET(BACKEND->remotefd, &fds_write);
    -    n = BACKEND->remotefd;
    +    fds[0].events |= POLLOUT;
       }
       if(directions & SOS_WRITE) {
    -    FD_SET(BACKEND->remotefd, &fds_read);
    -    n = BACKEND->remotefd;
    -    FD_SET(conn->sock[sockindex], &fds_write);
    -    if(n < conn->sock[sockindex])
    -      n = conn->sock[sockindex];
    +    n = 2;
    +    fds[0].events |= POLLIN;
    +    fds[1].events |= POLLOUT;
       }
    -  i = Curl_select(n + 1, &fds_read, &fds_write, NULL, 0);
    +  i = Curl_poll(fds, n, 0);
       if(i < 0)
         return -1;  /* Select error. */
     
    -  if(FD_ISSET(BACKEND->remotefd, &fds_write)) {
    +  if(fds[0].revents & POLLOUT) {
         /* Try getting data from HTTPS proxy and pipe it upstream. */
         n = 0;
         i = gsk_secure_soc_read(connproxyssl->backend->handle,
    @@ -581,8 +585,7 @@ static int pipe_ssloverssl(struct connectdata *conn, int sockindex,
         }
       }
     
    -  if(FD_ISSET(BACKEND->remotefd, &fds_read) &&
    -     FD_ISSET(conn->sock[sockindex], &fds_write)) {
    +  if((fds[0].revents & POLLIN) && (fds[1].revents & POLLOUT)) {
         /* Pipe data to HTTPS proxy. */
         n = read(BACKEND->remotefd, buf, sizeof(buf));
         if(n < 0)
    @@ -605,6 +608,7 @@ static int pipe_ssloverssl(struct connectdata *conn, int sockindex,
     static void close_one(struct ssl_connect_data *connssl, struct Curl_easy *data,
                           struct connectdata *conn, int sockindex)
     {
    +  DEBUGASSERT(BACKEND);
       if(BACKEND->handle) {
         gskit_status(data, gsk_secure_soc_close(&BACKEND->handle),
                   "gsk_secure_soc_close()", 0);
    @@ -636,6 +640,8 @@ static ssize_t gskit_send(struct Curl_easy *data, int sockindex,
       CURLcode cc = CURLE_SEND_ERROR;
       int written;
     
    +  DEBUGASSERT(BACKEND);
    +
       if(pipe_ssloverssl(conn, sockindex, SOS_WRITE) >= 0) {
         cc = gskit_status(data,
                           gsk_secure_soc_write(BACKEND->handle,
    @@ -661,6 +667,8 @@ static ssize_t gskit_recv(struct Curl_easy *data, int num, char *buf,
       int nread;
       CURLcode cc = CURLE_RECV_ERROR;
     
    +  DEBUGASSERT(BACKEND);
    +
       if(pipe_ssloverssl(conn, num, SOS_READ) >= 0) {
         int buffsize = buffersize > (size_t) INT_MAX? INT_MAX: (int) buffersize;
         cc = gskit_status(data, gsk_secure_soc_read(BACKEND->handle,
    @@ -734,6 +742,7 @@ static CURLcode gskit_connect_step1(struct Curl_easy *data,
     #endif
     
       /* Create SSL environment, start (preferably asynchronous) handshake. */
    +  DEBUGASSERT(BACKEND);
     
       BACKEND->handle = (gsk_handle) NULL;
       BACKEND->iocport = -1;
    @@ -830,8 +839,13 @@ static CURLcode gskit_connect_step1(struct Curl_easy *data,
     
       /* Process SNI. Ignore if not supported (on OS400 < V7R1). */
       if(sni) {
    +    char *snihost = Curl_ssl_snihost(data, sni, NULL);
    +    if(!snihost) {
    +      failf(data, "Failed to set SNI");
    +      return CURLE_SSL_CONNECT_ERROR;
    +    }
         result = set_buffer(data, BACKEND->handle,
    -                        GSK_SSL_EXTN_SERVERNAME_REQUEST, sni, TRUE);
    +                        GSK_SSL_EXTN_SERVERNAME_REQUEST, snihost, TRUE);
         if(result == CURLE_UNSUPPORTED_PROTOCOL)
           result = CURLE_OK;
       }
    @@ -958,6 +972,7 @@ static CURLcode gskit_connect_step2(struct Curl_easy *data,
       CURLcode result;
     
       /* Poll or wait for end of SSL asynchronous handshake. */
    +  DEBUGASSERT(BACKEND);
     
       for(;;) {
         timediff_t timeout_ms = nonblocking? 0: Curl_timeleft(data, NULL, TRUE);
    @@ -1014,6 +1029,7 @@ static CURLcode gskit_connect_step3(struct Curl_easy *data,
       CURLcode result;
     
       /* SSL handshake done: gather certificate info and verify host. */
    +  DEBUGASSERT(BACKEND);
     
       if(gskit_status(data, gsk_attribute_get_cert_info(BACKEND->handle,
                                                         GSK_PARTNER_CERT_INFO,
    @@ -1070,9 +1086,10 @@ static CURLcode gskit_connect_step3(struct Curl_easy *data,
       /* Check pinned public key. */
       ptr = SSL_PINNED_PUB_KEY();
       if(!result && ptr) {
    -    curl_X509certificate x509;
    -    curl_asn1Element *p;
    +    struct Curl_X509certificate x509;
    +    struct Curl_asn1Element *p;
     
    +    memset(&x509, 0, sizeof(x509));
         if(Curl_parseX509(&x509, cert, certend))
           return CURLE_SSL_PINNEDPUBKEYNOTMATCH;
         p = &x509.subjectPublicKeyInfo;
    @@ -1205,6 +1222,8 @@ static int gskit_shutdown(struct Curl_easy *data,
       char buf[120];
       int loop = 10; /* don't get stuck */
     
    +  DEBUGASSERT(BACKEND);
    +
       if(!BACKEND->handle)
         return 0;
     
    @@ -1268,6 +1287,7 @@ static int gskit_check_cxn(struct connectdata *cxn)
       int errlen;
     
       /* The only thing that can be tested here is at the socket level. */
    +  DEBUGASSERT(BACKEND);
     
       if(!BACKEND->handle)
         return 0; /* connection has been closed */
    @@ -1287,6 +1307,7 @@ static void *gskit_get_internals(struct ssl_connect_data *connssl,
                                      CURLINFO info UNUSED_PARAM)
     {
       (void)info;
    +  DEBUGASSERT(BACKEND);
       return BACKEND->handle;
     }
     
    @@ -1308,6 +1329,7 @@ const struct Curl_ssl Curl_ssl_gskit = {
       Curl_none_cert_status_request,  /* cert_status_request */
       gskit_connect,                  /* connect */
       gskit_connect_nonblocking,      /* connect_nonblocking */
    +  Curl_ssl_getsock,               /* getsock */
       gskit_get_internals,            /* get_internals */
       gskit_close,                    /* close_one */
       Curl_none_close_all,            /* close_all */
    diff --git a/vendor/curl/lib/vtls/gtls.c b/vendor/curl/lib/vtls/gtls.c
    index 18864aa4b2..57493767e5 100644
    --- a/vendor/curl/lib/vtls/gtls.c
    +++ b/vendor/curl/lib/vtls/gtls.c
    @@ -5,7 +5,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2021, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -202,9 +202,12 @@ static CURLcode handshake(struct Curl_easy *data,
     {
       struct ssl_connect_data *connssl = &conn->ssl[sockindex];
       struct ssl_backend_data *backend = connssl->backend;
    -  gnutls_session_t session = backend->session;
    +  gnutls_session_t session;
       curl_socket_t sockfd = conn->sock[sockindex];
     
    +  DEBUGASSERT(backend);
    +  session = backend->session;
    +
       for(;;) {
         timediff_t timeout_ms;
         int rc;
    @@ -406,6 +409,8 @@ gtls_connect_step1(struct Curl_easy *data,
       const char *tls13support;
       CURLcode result;
     
    +  DEBUGASSERT(backend);
    +
       if(connssl->state == ssl_connection_complete)
         /* to make us tolerant against being called more than once for the
            same connection */
    @@ -542,11 +547,15 @@ gtls_connect_step1(struct Curl_easy *data,
     #ifdef ENABLE_IPV6
          (0 == Curl_inet_pton(AF_INET6, hostname, &addr)) &&
     #endif
    -     sni &&
    -     (gnutls_server_name_set(session, GNUTLS_NAME_DNS, hostname,
    -                             strlen(hostname)) < 0))
    -    infof(data, "WARNING: failed to configure server name indication (SNI) "
    -          "TLS extension");
    +     sni) {
    +    size_t snilen;
    +    char *snihost = Curl_ssl_snihost(data, hostname, &snilen);
    +    if(!snihost || gnutls_server_name_set(session, GNUTLS_NAME_DNS, snihost,
    +                                          snilen) < 0) {
    +      failf(data, "Failed to set SNI");
    +      return CURLE_SSL_CONNECT_ERROR;
    +    }
    +  }
     
       /* Use default priorities */
       rc = gnutls_set_default_priority(session);
    @@ -697,7 +706,10 @@ gtls_connect_step1(struct Curl_easy *data,
     
     #ifndef CURL_DISABLE_PROXY
       if(conn->proxy_ssl[sockindex].use) {
    -    transport_ptr = conn->proxy_ssl[sockindex].backend->session;
    +    struct ssl_backend_data *proxy_backend;
    +    proxy_backend = conn->proxy_ssl[sockindex].backend;
    +    DEBUGASSERT(proxy_backend);
    +    transport_ptr = proxy_backend->session;
         gnutls_transport_push = gtls_push_ssl;
         gnutls_transport_pull = gtls_pull_ssl;
       }
    @@ -1352,7 +1364,9 @@ gtls_connect_common(struct Curl_easy *data,
       /* Finish connecting once the handshake is done */
       if(ssl_connect_1 == connssl->connecting_state) {
         struct ssl_backend_data *backend = connssl->backend;
    -    gnutls_session_t session = backend->session;
    +    gnutls_session_t session;
    +    DEBUGASSERT(backend);
    +    session = backend->session;
         rc = Curl_gtls_verifyserver(data, conn, session, sockindex);
         if(rc)
           return rc;
    @@ -1393,6 +1407,9 @@ static bool gtls_data_pending(const struct connectdata *conn,
       const struct ssl_connect_data *connssl = &conn->ssl[connindex];
       bool res = FALSE;
       struct ssl_backend_data *backend = connssl->backend;
    +
    +  DEBUGASSERT(backend);
    +
       if(backend->session &&
          0 != gnutls_record_check_pending(backend->session))
         res = TRUE;
    @@ -1400,6 +1417,7 @@ static bool gtls_data_pending(const struct connectdata *conn,
     #ifndef CURL_DISABLE_PROXY
       connssl = &conn->proxy_ssl[connindex];
       backend = connssl->backend;
    +  DEBUGASSERT(backend);
       if(backend->session &&
          0 != gnutls_record_check_pending(backend->session))
         res = TRUE;
    @@ -1417,7 +1435,10 @@ static ssize_t gtls_send(struct Curl_easy *data,
       struct connectdata *conn = data->conn;
       struct ssl_connect_data *connssl = &conn->ssl[sockindex];
       struct ssl_backend_data *backend = connssl->backend;
    -  ssize_t rc = gnutls_record_send(backend->session, mem, len);
    +  ssize_t rc;
    +
    +  DEBUGASSERT(backend);
    +  rc = gnutls_record_send(backend->session, mem, len);
     
       if(rc < 0) {
         *curlcode = (rc == GNUTLS_E_AGAIN)
    @@ -1433,6 +1454,8 @@ static ssize_t gtls_send(struct Curl_easy *data,
     static void close_one(struct ssl_connect_data *connssl)
     {
       struct ssl_backend_data *backend = connssl->backend;
    +  DEBUGASSERT(backend);
    +
       if(backend->session) {
         char buf[32];
         /* Maybe the server has already sent a close notify alert.
    @@ -1475,6 +1498,8 @@ static int gtls_shutdown(struct Curl_easy *data, struct connectdata *conn,
       struct ssl_backend_data *backend = connssl->backend;
       int retval = 0;
     
    +  DEBUGASSERT(backend);
    +
     #ifndef CURL_DISABLE_FTP
       /* This has only been tested on the proftpd server, and the mod_tls code
          sends a close notify alert without waiting for a close notify alert in
    @@ -1553,6 +1578,8 @@ static ssize_t gtls_recv(struct Curl_easy *data, /* connection data */
       struct ssl_backend_data *backend = connssl->backend;
       ssize_t ret;
     
    +  DEBUGASSERT(backend);
    +
       ret = gnutls_record_recv(backend->session, buf, buffersize);
       if((ret == GNUTLS_E_AGAIN) || (ret == GNUTLS_E_INTERRUPTED)) {
         *curlcode = CURLE_AGAIN;
    @@ -1624,6 +1651,7 @@ static void *gtls_get_internals(struct ssl_connect_data *connssl,
     {
       struct ssl_backend_data *backend = connssl->backend;
       (void)info;
    +  DEBUGASSERT(backend);
       return backend->session;
     }
     
    diff --git a/vendor/curl/lib/hostcheck.c b/vendor/curl/lib/vtls/hostcheck.c
    similarity index 54%
    rename from vendor/curl/lib/hostcheck.c
    rename to vendor/curl/lib/vtls/hostcheck.c
    index cd45bd07ee..8dc97a27d0 100644
    --- a/vendor/curl/lib/hostcheck.c
    +++ b/vendor/curl/lib/vtls/hostcheck.c
    @@ -5,7 +5,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2021, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -33,6 +33,7 @@
     #ifdef HAVE_NETINET_IN6_H
     #include 
     #endif
    +#include "curl_memrchr.h"
     
     #include "hostcheck.h"
     #include "strcase.h"
    @@ -42,13 +43,23 @@
     /* The last #include file should be: */
     #include "memdebug.h"
     
    +/* check the two input strings with given length, but do not
    +   assume they end in nul-bytes */
    +static bool pmatch(const char *hostname, size_t hostlen,
    +                   const char *pattern, size_t patternlen)
    +{
    +  if(hostlen != patternlen)
    +    return FALSE;
    +  return strncasecompare(hostname, pattern, hostlen);
    +}
    +
     /*
      * Match a hostname against a wildcard pattern.
      * E.g.
      *  "foo.host.com" matches "*.host.com".
      *
      * We use the matching rule described in RFC6125, section 6.4.3.
    - * https://tools.ietf.org/html/rfc6125#section-6.4.3
    + * https://datatracker.ietf.org/doc/html/rfc6125#section-6.4.3
      *
      * In addition: ignore trailing dots in the host names and wildcards, so that
      * the names are used normalized. This is what the browsers do.
    @@ -58,85 +69,72 @@
      * apparent distinction between a name and an IP. We need to detect the use of
      * an IP address and not wildcard match on such names.
      *
    - * NOTE: hostmatch() gets called with copied buffers so that it can modify the
    - * contents at will.
    + * Return TRUE on a match. FALSE if not.
      */
     
    -static int hostmatch(char *hostname, char *pattern)
    +static bool hostmatch(const char *hostname,
    +                      size_t hostlen,
    +                      const char *pattern,
    +                      size_t patternlen)
     {
    -  const char *pattern_label_end, *pattern_wildcard, *hostname_label_end;
    -  int wildcard_enabled;
    +  const char *pattern_label_end, *wildcard, *hostname_label_end;
       size_t prefixlen, suffixlen;
     
       /* normalize pattern and hostname by stripping off trailing dots */
    -  size_t len = strlen(hostname);
    -  if(hostname[len-1]=='.')
    -    hostname[len-1] = 0;
    -  len = strlen(pattern);
    -  if(pattern[len-1]=='.')
    -    pattern[len-1] = 0;
    -
    -  pattern_wildcard = strchr(pattern, '*');
    -  if(!pattern_wildcard)
    -    return strcasecompare(pattern, hostname) ?
    -      CURL_HOST_MATCH : CURL_HOST_NOMATCH;
    +  DEBUGASSERT(patternlen);
    +  if(hostname[hostlen-1]=='.')
    +    hostlen--;
    +  if(pattern[patternlen-1]=='.')
    +    patternlen--;
    +
    +  wildcard = memchr(pattern, '*', patternlen);
    +  if(!wildcard)
    +    return pmatch(hostname, hostlen, pattern, patternlen);
     
       /* detect IP address as hostname and fail the match if so */
       if(Curl_host_is_ipnum(hostname))
    -    return CURL_HOST_NOMATCH;
    +    return FALSE;
     
    -  /* We require at least 2 dots in pattern to avoid too wide wildcard
    +  /* We require at least 2 dots in the pattern to avoid too wide wildcard
          match. */
    -  wildcard_enabled = 1;
    -  pattern_label_end = strchr(pattern, '.');
    -  if(!pattern_label_end || !strchr(pattern_label_end + 1, '.') ||
    -     pattern_wildcard > pattern_label_end ||
    -     strncasecompare(pattern, "xn--", 4)) {
    -    wildcard_enabled = 0;
    +  pattern_label_end = memchr(pattern, '.', patternlen);
    +  if(!pattern_label_end ||
    +     (memrchr(pattern, '.', patternlen) == pattern_label_end) ||
    +     strncasecompare(pattern, "xn--", 4))
    +    return pmatch(hostname, hostlen, pattern, patternlen);
    +
    +  hostname_label_end = memchr(hostname, '.', hostlen);
    +  if(!hostname_label_end)
    +    return FALSE;
    +  else {
    +    size_t skiphost = hostname_label_end - hostname;
    +    size_t skiplen = pattern_label_end - pattern;
    +    if(!pmatch(hostname_label_end, hostlen - skiphost,
    +               pattern_label_end, patternlen - skiplen))
    +      return FALSE;
       }
    -  if(!wildcard_enabled)
    -    return strcasecompare(pattern, hostname) ?
    -      CURL_HOST_MATCH : CURL_HOST_NOMATCH;
    -
    -  hostname_label_end = strchr(hostname, '.');
    -  if(!hostname_label_end ||
    -     !strcasecompare(pattern_label_end, hostname_label_end))
    -    return CURL_HOST_NOMATCH;
    -
       /* The wildcard must match at least one character, so the left-most
          label of the hostname is at least as large as the left-most label
          of the pattern. */
       if(hostname_label_end - hostname < pattern_label_end - pattern)
    -    return CURL_HOST_NOMATCH;
    +    return FALSE;
     
    -  prefixlen = pattern_wildcard - pattern;
    -  suffixlen = pattern_label_end - (pattern_wildcard + 1);
    +  prefixlen = wildcard - pattern;
    +  suffixlen = pattern_label_end - (wildcard + 1);
       return strncasecompare(pattern, hostname, prefixlen) &&
    -    strncasecompare(pattern_wildcard + 1, hostname_label_end - suffixlen,
    -                    suffixlen) ?
    -    CURL_HOST_MATCH : CURL_HOST_NOMATCH;
    +    strncasecompare(wildcard + 1, hostname_label_end - suffixlen,
    +                    suffixlen) ? TRUE : FALSE;
     }
     
    -int Curl_cert_hostcheck(const char *match_pattern, const char *hostname)
    +/*
    + * Curl_cert_hostcheck() returns TRUE if a match and FALSE if not.
    + */
    +bool Curl_cert_hostcheck(const char *match, size_t matchlen,
    +                         const char *hostname, size_t hostlen)
     {
    -  int res = 0;
    -  if(!match_pattern || !*match_pattern ||
    -      !hostname || !*hostname) /* sanity check */
    -    ;
    -  else {
    -    char *matchp = strdup(match_pattern);
    -    if(matchp) {
    -      char *hostp = strdup(hostname);
    -      if(hostp) {
    -        if(hostmatch(hostp, matchp) == CURL_HOST_MATCH)
    -          res = 1;
    -        free(hostp);
    -      }
    -      free(matchp);
    -    }
    -  }
    -
    -  return res;
    +  if(match && *match && hostname && *hostname)
    +    return hostmatch(hostname, hostlen, match, matchlen);
    +  return FALSE;
     }
     
     #endif /* OPENSSL, GSKIT or schannel+wince */
    diff --git a/vendor/curl/lib/hostcheck.h b/vendor/curl/lib/vtls/hostcheck.h
    similarity index 82%
    rename from vendor/curl/lib/hostcheck.h
    rename to vendor/curl/lib/vtls/hostcheck.h
    index 52155f43b4..aa966403dd 100644
    --- a/vendor/curl/lib/hostcheck.h
    +++ b/vendor/curl/lib/vtls/hostcheck.h
    @@ -7,7 +7,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2020, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -24,8 +24,8 @@
     
     #include 
     
    -#define CURL_HOST_NOMATCH 0
    -#define CURL_HOST_MATCH   1
    -int Curl_cert_hostcheck(const char *match_pattern, const char *hostname);
    +/* returns TRUE if there's a match */
    +bool Curl_cert_hostcheck(const char *match_pattern, size_t matchlen,
    +                         const char *hostname, size_t hostlen);
     
     #endif /* HEADER_CURL_HOSTCHECK_H */
    diff --git a/vendor/curl/lib/vtls/mbedtls.c b/vendor/curl/lib/vtls/mbedtls.c
    index 1d209b2732..b9fd26acca 100644
    --- a/vendor/curl/lib/vtls/mbedtls.c
    +++ b/vendor/curl/lib/vtls/mbedtls.c
    @@ -41,9 +41,6 @@
     #include 
     #endif
     #include 
    -#if MBEDTLS_VERSION_NUMBER < 0x03000000
    -#include 
    -#endif
     #include 
     
     #include 
    @@ -80,7 +77,9 @@ struct ssl_backend_data {
       int server_fd;
       mbedtls_x509_crt cacert;
       mbedtls_x509_crt clicert;
    +#ifdef MBEDTLS_X509_CRL_PARSE_C
       mbedtls_x509_crl crl;
    +#endif
       mbedtls_pk_context pk;
       mbedtls_ssl_config config;
       const char *protocols[3];
    @@ -231,6 +230,8 @@ set_ssl_version_min_max(struct Curl_easy *data, struct connectdata *conn,
       long ssl_version_max = SSL_CONN_CONFIG(version_max);
       CURLcode result = CURLE_OK;
     
    +  DEBUGASSERT(backend);
    +
       switch(ssl_version) {
         case CURL_SSLVERSION_DEFAULT:
         case CURL_SSLVERSION_TLSv1:
    @@ -286,6 +287,8 @@ mbed_connect_step1(struct Curl_easy *data, struct connectdata *conn,
       int ret = -1;
       char errorbuf[128];
     
    +  DEBUGASSERT(backend);
    +
       if((SSL_CONN_CONFIG(version) == CURL_SSLVERSION_SSLv2) ||
          (SSL_CONN_CONFIG(version) == CURL_SSLVERSION_SSLv3)) {
         failf(data, "Not supported SSL version");
    @@ -335,11 +338,12 @@ mbed_connect_step1(struct Curl_easy *data, struct connectdata *conn,
           mbedtls_strerror(ret, errorbuf, sizeof(errorbuf));
           failf(data, "Error importing ca cert blob - mbedTLS: (-0x%04X) %s",
                 -ret, errorbuf);
    -      return ret;
    +      return CURLE_SSL_CERTPROBLEM;
         }
       }
     
       if(ssl_cafile && verifypeer) {
    +#ifdef MBEDTLS_FS_IO
         ret = mbedtls_x509_crt_parse_file(&backend->cacert, ssl_cafile);
     
         if(ret<0) {
    @@ -348,9 +352,14 @@ mbed_connect_step1(struct Curl_easy *data, struct connectdata *conn,
                 ssl_cafile, -ret, errorbuf);
           return CURLE_SSL_CACERT_BADFILE;
         }
    +#else
    +    failf(data, "mbedtls: functions that use the filesystem not built in");
    +    return CURLE_NOT_BUILT_IN;
    +#endif
       }
     
       if(ssl_capath) {
    +#ifdef MBEDTLS_FS_IO
         ret = mbedtls_x509_crt_parse_path(&backend->cacert, ssl_capath);
     
         if(ret<0) {
    @@ -361,12 +370,17 @@ mbed_connect_step1(struct Curl_easy *data, struct connectdata *conn,
           if(verifypeer)
             return CURLE_SSL_CACERT_BADFILE;
         }
    +#else
    +    failf(data, "mbedtls: functions that use the filesystem not built in");
    +    return CURLE_NOT_BUILT_IN;
    +#endif
       }
     
       /* Load the client certificate */
       mbedtls_x509_crt_init(&backend->clicert);
     
       if(ssl_cert) {
    +#ifdef MBEDTLS_FS_IO
         ret = mbedtls_x509_crt_parse_file(&backend->clicert, ssl_cert);
     
         if(ret) {
    @@ -376,6 +390,10 @@ mbed_connect_step1(struct Curl_easy *data, struct connectdata *conn,
     
           return CURLE_SSL_CERTPROBLEM;
         }
    +#else
    +    failf(data, "mbedtls: functions that use the filesystem not built in");
    +    return CURLE_NOT_BUILT_IN;
    +#endif
       }
     
       if(ssl_cert_blob) {
    @@ -388,7 +406,7 @@ mbed_connect_step1(struct Curl_easy *data, struct connectdata *conn,
         memcpy(newblob, ssl_cert_blob->data, ssl_cert_blob->len);
         newblob[ssl_cert_blob->len] = 0; /* null terminate */
         ret = mbedtls_x509_crt_parse(&backend->clicert, newblob,
    -                                 ssl_cert_blob->len);
    +                                 ssl_cert_blob->len + 1);
         free(newblob);
     
         if(ret) {
    @@ -404,6 +422,7 @@ mbed_connect_step1(struct Curl_easy *data, struct connectdata *conn,
     
       if(SSL_SET_OPTION(key) || SSL_SET_OPTION(key_blob)) {
         if(SSL_SET_OPTION(key)) {
    +#ifdef MBEDTLS_FS_IO
     #if MBEDTLS_VERSION_NUMBER >= 0x03000000
           ret = mbedtls_pk_parse_keyfile(&backend->pk, SSL_SET_OPTION(key),
                                          SSL_SET_OPTION(key_passwd),
    @@ -420,6 +439,10 @@ mbed_connect_step1(struct Curl_easy *data, struct connectdata *conn,
                   SSL_SET_OPTION(key), -ret, errorbuf);
             return CURLE_SSL_CERTPROBLEM;
           }
    +#else
    +      failf(data, "mbedtls: functions that use the filesystem not built in");
    +      return CURLE_NOT_BUILT_IN;
    +#endif
         }
         else {
           const struct curl_blob *ssl_key_blob = SSL_SET_OPTION(key_blob);
    @@ -452,9 +475,11 @@ mbed_connect_step1(struct Curl_easy *data, struct connectdata *conn,
       }
     
       /* Load the CRL */
    +#ifdef MBEDTLS_X509_CRL_PARSE_C
       mbedtls_x509_crl_init(&backend->crl);
     
       if(ssl_crlfile) {
    +#ifdef MBEDTLS_FS_IO
         ret = mbedtls_x509_crl_parse_file(&backend->crl, ssl_crlfile);
     
         if(ret) {
    @@ -464,17 +489,21 @@ mbed_connect_step1(struct Curl_easy *data, struct connectdata *conn,
     
           return CURLE_SSL_CRL_BADFILE;
         }
    +#else
    +    failf(data, "mbedtls: functions that use the filesystem not built in");
    +    return CURLE_NOT_BUILT_IN;
    +#endif
    +  }
    +#else
    +  if(ssl_crlfile) {
    +    failf(data, "mbedtls: crl support not built in");
    +    return CURLE_NOT_BUILT_IN;
       }
    +#endif
     
       infof(data, "mbedTLS: Connecting to %s:%ld", hostname, port);
     
       mbedtls_ssl_config_init(&backend->config);
    -
    -  mbedtls_ssl_init(&backend->ssl);
    -  if(mbedtls_ssl_setup(&backend->ssl, &backend->config)) {
    -    failf(data, "mbedTLS: ssl_init failed");
    -    return CURLE_SSL_CONNECT_ERROR;
    -  }
       ret = mbedtls_ssl_config_defaults(&backend->config,
                                         MBEDTLS_SSL_IS_CLIENT,
                                         MBEDTLS_SSL_TRANSPORT_STREAM,
    @@ -484,6 +513,12 @@ mbed_connect_step1(struct Curl_easy *data, struct connectdata *conn,
         return CURLE_SSL_CONNECT_ERROR;
       }
     
    +  mbedtls_ssl_init(&backend->ssl);
    +  if(mbedtls_ssl_setup(&backend->ssl, &backend->config)) {
    +    failf(data, "mbedTLS: ssl_init failed");
    +    return CURLE_SSL_CONNECT_ERROR;
    +  }
    +
       /* new profile with RSA min key len = 1024 ... */
       mbedtls_ssl_conf_cert_profile(&backend->config,
                                     &mbedtls_x509_crt_profile_fr);
    @@ -555,18 +590,25 @@ mbed_connect_step1(struct Curl_easy *data, struct connectdata *conn,
     
       mbedtls_ssl_conf_ca_chain(&backend->config,
                                 &backend->cacert,
    +#ifdef MBEDTLS_X509_CRL_PARSE_C
                                 &backend->crl);
    +#else
    +                            NULL);
    +#endif
     
       if(SSL_SET_OPTION(key) || SSL_SET_OPTION(key_blob)) {
         mbedtls_ssl_conf_own_cert(&backend->config,
                                   &backend->clicert, &backend->pk);
       }
    -  if(mbedtls_ssl_set_hostname(&backend->ssl, hostname)) {
    -    /* mbedtls_ssl_set_hostname() sets the name to use in CN/SAN checks *and*
    -       the name to set in the SNI extension. So even if curl connects to a
    -       host specified as an IP address, this function must be used. */
    -    failf(data, "couldn't set hostname in mbedTLS");
    -    return CURLE_SSL_CONNECT_ERROR;
    +  {
    +    char *snihost = Curl_ssl_snihost(data, hostname, NULL);
    +    if(!snihost || mbedtls_ssl_set_hostname(&backend->ssl, snihost)) {
    +      /* mbedtls_ssl_set_hostname() sets the name to use in CN/SAN checks and
    +         the name to set in the SNI extension. So even if curl connects to a
    +         host specified as an IP address, this function must be used. */
    +      failf(data, "Failed to set SNI");
    +      return CURLE_SSL_CONNECT_ERROR;
    +    }
       }
     
     #ifdef HAS_ALPN
    @@ -627,6 +669,8 @@ mbed_connect_step2(struct Curl_easy *data, struct connectdata *conn,
       const mbedtls_x509_crt *peercert;
       const char * const pinnedpubkey = SSL_PINNED_PUB_KEY();
     
    +  DEBUGASSERT(backend);
    +
       conn->recv[sockindex] = mbed_recv;
       conn->send[sockindex] = mbed_send;
     
    @@ -806,6 +850,7 @@ mbed_connect_step3(struct Curl_easy *data, struct connectdata *conn,
       struct ssl_backend_data *backend = connssl->backend;
     
       DEBUGASSERT(ssl_connect_3 == connssl->connecting_state);
    +  DEBUGASSERT(backend);
     
       if(SSL_SET_OPTION(primary.sessionid)) {
         int ret;
    @@ -862,6 +907,8 @@ static ssize_t mbed_send(struct Curl_easy *data, int sockindex,
       struct ssl_backend_data *backend = connssl->backend;
       int ret = -1;
     
    +  DEBUGASSERT(backend);
    +
       ret = mbedtls_ssl_write(&backend->ssl, (unsigned char *)mem, len);
     
       if(ret < 0) {
    @@ -886,6 +933,8 @@ static void mbedtls_close(struct Curl_easy *data,
       char buf[32];
       (void) data;
     
    +  DEBUGASSERT(backend);
    +
       /* Maybe the server has already sent a close notify alert.
          Read it to avoid an RST on the TCP connection. */
       (void)mbedtls_ssl_read(&backend->ssl, (unsigned char *)buf, sizeof(buf));
    @@ -893,7 +942,9 @@ static void mbedtls_close(struct Curl_easy *data,
       mbedtls_pk_free(&backend->pk);
       mbedtls_x509_crt_free(&backend->clicert);
       mbedtls_x509_crt_free(&backend->cacert);
    +#ifdef MBEDTLS_X509_CRL_PARSE_C
       mbedtls_x509_crl_free(&backend->crl);
    +#endif
       mbedtls_ssl_config_free(&backend->config);
       mbedtls_ssl_free(&backend->ssl);
       mbedtls_ctr_drbg_free(&backend->ctr_drbg);
    @@ -912,6 +963,8 @@ static ssize_t mbed_recv(struct Curl_easy *data, int num,
       int ret = -1;
       ssize_t len = -1;
     
    +  DEBUGASSERT(backend);
    +
       ret = mbedtls_ssl_read(&backend->ssl, (unsigned char *)buf,
                              buffersize);
     
    @@ -1146,6 +1199,7 @@ static bool mbedtls_data_pending(const struct connectdata *conn,
     {
       const struct ssl_connect_data *connssl = &conn->ssl[sockindex];
       struct ssl_backend_data *backend = connssl->backend;
    +  DEBUGASSERT(backend);
       return mbedtls_ssl_get_bytes_avail(&backend->ssl) != 0;
     }
     
    @@ -1175,6 +1229,7 @@ static void *mbedtls_get_internals(struct ssl_connect_data *connssl,
     {
       struct ssl_backend_data *backend = connssl->backend;
       (void)info;
    +  DEBUGASSERT(backend);
       return &backend->ssl;
     }
     
    diff --git a/vendor/curl/lib/vtls/mesalink.c b/vendor/curl/lib/vtls/mesalink.c
    deleted file mode 100644
    index 35a916586e..0000000000
    --- a/vendor/curl/lib/vtls/mesalink.c
    +++ /dev/null
    @@ -1,679 +0,0 @@
    -/***************************************************************************
    - *                                  _   _ ____  _
    - *  Project                     ___| | | |  _ \| |
    - *                             / __| | | | |_) | |
    - *                            | (__| |_| |  _ <| |___
    - *                             \___|\___/|_| \_\_____|
    - *
    - * Copyright (C) 2017 - 2018, Yiming Jing, 
    - * Copyright (C) 1998 - 2021, Daniel Stenberg, , et al.
    - *
    - * This software is licensed as described in the file COPYING, which
    - * you should have received as part of this distribution. The terms
    - * are also available at https://curl.se/docs/copyright.html.
    - *
    - * You may opt to use, copy, modify, merge, publish, distribute and/or sell
    - * copies of the Software, and permit persons to whom the Software is
    - * furnished to do so, under the terms of the COPYING file.
    - *
    - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
    - * KIND, either express or implied.
    - *
    - ***************************************************************************/
    -
    -/*
    - * Source file for all MesaLink-specific code for the TLS/SSL layer. No code
    - * but vtls.c should ever call or use these functions.
    - *
    - */
    -
    -/*
    - * Based upon the CyaSSL implementation in cyassl.c and cyassl.h:
    - *   Copyright (C) 1998 - 2017, Daniel Stenberg, , et al.
    - *
    - * Thanks for code and inspiration!
    - */
    -
    -#include "curl_setup.h"
    -
    -#ifdef USE_MESALINK
    -
    -#include 
    -#include 
    -
    -#include "urldata.h"
    -#include "sendf.h"
    -#include "inet_pton.h"
    -#include "vtls.h"
    -#include "parsedate.h"
    -#include "connect.h" /* for the connect timeout */
    -#include "select.h"
    -#include "strcase.h"
    -#include "x509asn1.h"
    -#include "curl_printf.h"
    -
    -#include "mesalink.h"
    -#include 
    -#include 
    -
    -/* The last #include files should be: */
    -#include "curl_memory.h"
    -#include "memdebug.h"
    -
    -#define MESALINK_MAX_ERROR_SZ 80
    -
    -struct ssl_backend_data
    -{
    -  SSL_CTX *ctx;
    -  SSL *handle;
    -};
    -
    -static Curl_recv mesalink_recv;
    -static Curl_send mesalink_send;
    -
    -static int do_file_type(const char *type)
    -{
    -  if(!type || !type[0])
    -    return SSL_FILETYPE_PEM;
    -  if(strcasecompare(type, "PEM"))
    -    return SSL_FILETYPE_PEM;
    -  if(strcasecompare(type, "DER"))
    -    return SSL_FILETYPE_ASN1;
    -  return -1;
    -}
    -
    -/*
    - * This function loads all the client/CA certificates and CRLs. Setup the TLS
    - * layer and do all necessary magic.
    - */
    -static CURLcode
    -mesalink_connect_step1(struct Curl_easy *data,
    -                       struct connectdata *conn, int sockindex)
    -{
    -  char *ciphers;
    -  struct ssl_connect_data *connssl = &conn->ssl[sockindex];
    -  struct in_addr addr4;
    -#ifdef ENABLE_IPV6
    -  struct in6_addr addr6;
    -#endif
    -  const char * const hostname = SSL_HOST_NAME();
    -  size_t hostname_len = strlen(hostname);
    -  SSL_METHOD *req_method = NULL;
    -  curl_socket_t sockfd = conn->sock[sockindex];
    -  struct ssl_backend_data *backend = connssl->backend;
    -
    -  if(connssl->state == ssl_connection_complete)
    -    return CURLE_OK;
    -
    -  if(SSL_CONN_CONFIG(version_max) != CURL_SSLVERSION_MAX_NONE) {
    -    failf(data, "MesaLink does not support to set maximum SSL/TLS version");
    -    return CURLE_SSL_CONNECT_ERROR;
    -  }
    -
    -  switch(SSL_CONN_CONFIG(version)) {
    -  case CURL_SSLVERSION_SSLv3:
    -  case CURL_SSLVERSION_TLSv1:
    -  case CURL_SSLVERSION_TLSv1_0:
    -  case CURL_SSLVERSION_TLSv1_1:
    -    failf(data, "MesaLink does not support SSL 3.0, TLS 1.0, or TLS 1.1");
    -    return CURLE_NOT_BUILT_IN;
    -  case CURL_SSLVERSION_DEFAULT:
    -  case CURL_SSLVERSION_TLSv1_2:
    -    req_method = TLSv1_2_client_method();
    -    break;
    -  case CURL_SSLVERSION_TLSv1_3:
    -    req_method = TLSv1_3_client_method();
    -    break;
    -  case CURL_SSLVERSION_SSLv2:
    -    failf(data, "MesaLink does not support SSLv2");
    -    return CURLE_SSL_CONNECT_ERROR;
    -  default:
    -    failf(data, "Unrecognized parameter passed via CURLOPT_SSLVERSION");
    -    return CURLE_SSL_CONNECT_ERROR;
    -  }
    -
    -  if(!req_method) {
    -    failf(data, "SSL: couldn't create a method!");
    -    return CURLE_OUT_OF_MEMORY;
    -  }
    -
    -  if(backend->ctx)
    -    SSL_CTX_free(backend->ctx);
    -  backend->ctx = SSL_CTX_new(req_method);
    -
    -  if(!backend->ctx) {
    -    failf(data, "SSL: couldn't create a context!");
    -    return CURLE_OUT_OF_MEMORY;
    -  }
    -
    -  SSL_CTX_set_verify(
    -    backend->ctx, SSL_CONN_CONFIG(verifypeer) ?
    -      SSL_VERIFY_PEER : SSL_VERIFY_NONE, NULL);
    -
    -  if(SSL_CONN_CONFIG(CAfile) || SSL_CONN_CONFIG(CApath)) {
    -    if(!SSL_CTX_load_verify_locations(backend->ctx, SSL_CONN_CONFIG(CAfile),
    -                                      SSL_CONN_CONFIG(CApath))) {
    -      if(SSL_CONN_CONFIG(verifypeer)) {
    -        failf(data,
    -              "error setting certificate verify locations: "
    -              " CAfile: %s CApath: %s",
    -              SSL_CONN_CONFIG(CAfile) ?
    -              SSL_CONN_CONFIG(CAfile) : "none",
    -              SSL_CONN_CONFIG(CApath) ?
    -              SSL_CONN_CONFIG(CApath) : "none");
    -        return CURLE_SSL_CACERT_BADFILE;
    -      }
    -      infof(data,
    -          "error setting certificate verify locations,"
    -          " continuing anyway:");
    -    }
    -    else {
    -      infof(data, "successfully set certificate verify locations:");
    -    }
    -    infof(data, " CAfile: %s",
    -          SSL_CONN_CONFIG(CAfile) ? SSL_CONN_CONFIG(CAfile): "none");
    -    infof(data, " CApath: %s",
    -          SSL_CONN_CONFIG(CApath) ? SSL_CONN_CONFIG(CApath): "none");
    -  }
    -
    -  if(SSL_SET_OPTION(primary.clientcert) && SSL_SET_OPTION(key)) {
    -    int file_type = do_file_type(SSL_SET_OPTION(cert_type));
    -
    -    if(SSL_CTX_use_certificate_chain_file(backend->ctx,
    -                                          SSL_SET_OPTION(primary.clientcert),
    -                                          file_type) != 1) {
    -      failf(data, "unable to use client certificate (no key or wrong pass"
    -            " phrase?)");
    -      return CURLE_SSL_CONNECT_ERROR;
    -    }
    -
    -    file_type = do_file_type(SSL_SET_OPTION(key_type));
    -    if(SSL_CTX_use_PrivateKey_file(backend->ctx, SSL_SET_OPTION(key),
    -                                   file_type) != 1) {
    -      failf(data, "unable to set private key");
    -      return CURLE_SSL_CONNECT_ERROR;
    -    }
    -    infof(data,
    -          "client cert: %s",
    -          SSL_CONN_CONFIG(clientcert)?
    -          SSL_CONN_CONFIG(clientcert): "none");
    -  }
    -
    -  ciphers = SSL_CONN_CONFIG(cipher_list);
    -  if(ciphers) {
    -#ifdef MESALINK_HAVE_CIPHER
    -    if(!SSL_CTX_set_cipher_list(backend->ctx, ciphers)) {
    -      failf(data, "failed setting cipher list: %s", ciphers);
    -      return CURLE_SSL_CIPHER;
    -    }
    -#endif
    -    infof(data, "Cipher selection: %s", ciphers);
    -  }
    -
    -  if(backend->handle)
    -    SSL_free(backend->handle);
    -  backend->handle = SSL_new(backend->ctx);
    -  if(!backend->handle) {
    -    failf(data, "SSL: couldn't create a context (handle)!");
    -    return CURLE_OUT_OF_MEMORY;
    -  }
    -
    -  if((hostname_len < USHRT_MAX) &&
    -     (0 == Curl_inet_pton(AF_INET, hostname, &addr4))
    -#ifdef ENABLE_IPV6
    -     && (0 == Curl_inet_pton(AF_INET6, hostname, &addr6))
    -#endif
    -  ) {
    -    /* hostname is not a valid IP address */
    -    if(SSL_set_tlsext_host_name(backend->handle, hostname) != SSL_SUCCESS) {
    -      failf(data,
    -            "WARNING: failed to configure server name indication (SNI) "
    -            "TLS extension\n");
    -      return CURLE_SSL_CONNECT_ERROR;
    -    }
    -  }
    -  else {
    -#ifdef CURLDEBUG
    -    /* Check if the hostname is 127.0.0.1 or [::1];
    -     * otherwise reject because MesaLink always wants a valid DNS Name
    -     * specified in RFC 5280 Section 7.2 */
    -    if(strncmp(hostname, "127.0.0.1", 9) == 0
    -#ifdef ENABLE_IPV6
    -       || strncmp(hostname, "[::1]", 5) == 0
    -#endif
    -    ) {
    -      SSL_set_tlsext_host_name(backend->handle, "localhost");
    -    }
    -    else
    -#endif
    -    {
    -      failf(data,
    -            "ERROR: MesaLink does not accept an IP address as a hostname\n");
    -      return CURLE_SSL_CONNECT_ERROR;
    -    }
    -  }
    -
    -#ifdef MESALINK_HAVE_SESSION
    -  if(SSL_SET_OPTION(primary.sessionid)) {
    -    void *ssl_sessionid = NULL;
    -
    -    Curl_ssl_sessionid_lock(data);
    -    if(!Curl_ssl_getsessionid(data, conn,
    -                              SSL_IS_PROXY() ? TRUE : FALSE,
    -                              &ssl_sessionid, NULL, sockindex)) {
    -      /* we got a session id, use it! */
    -      if(!SSL_set_session(backend->handle, ssl_sessionid)) {
    -        Curl_ssl_sessionid_unlock(data);
    -        failf(
    -          data,
    -          "SSL: SSL_set_session failed: %s",
    -          ERR_error_string(SSL_get_error(backend->handle, 0), error_buffer));
    -        return CURLE_SSL_CONNECT_ERROR;
    -      }
    -      /* Informational message */
    -      infof(data, "SSL re-using session ID");
    -    }
    -    Curl_ssl_sessionid_unlock(data);
    -  }
    -#endif /* MESALINK_HAVE_SESSION */
    -
    -  if(SSL_set_fd(backend->handle, (int)sockfd) != SSL_SUCCESS) {
    -    failf(data, "SSL: SSL_set_fd failed");
    -    return CURLE_SSL_CONNECT_ERROR;
    -  }
    -
    -  connssl->connecting_state = ssl_connect_2;
    -  return CURLE_OK;
    -}
    -
    -static CURLcode
    -mesalink_connect_step2(struct Curl_easy *data,
    -                       struct connectdata *conn, int sockindex)
    -{
    -  int ret = -1;
    -  struct ssl_connect_data *connssl = &conn->ssl[sockindex];
    -  struct ssl_backend_data *backend = connssl->backend;
    -
    -  conn->recv[sockindex] = mesalink_recv;
    -  conn->send[sockindex] = mesalink_send;
    -
    -  ret = SSL_connect(backend->handle);
    -  if(ret != SSL_SUCCESS) {
    -    int detail = SSL_get_error(backend->handle, ret);
    -
    -    if(SSL_ERROR_WANT_CONNECT == detail || SSL_ERROR_WANT_READ == detail) {
    -      connssl->connecting_state = ssl_connect_2_reading;
    -      return CURLE_OK;
    -    }
    -    else {
    -      char error_buffer[MESALINK_MAX_ERROR_SZ];
    -      failf(data,
    -            "SSL_connect failed with error %d: %s",
    -            detail,
    -            ERR_error_string_n(detail, error_buffer, sizeof(error_buffer)));
    -      ERR_print_errors_fp(stderr);
    -      if(detail && SSL_CONN_CONFIG(verifypeer)) {
    -        detail &= ~0xFF;
    -        if(detail == TLS_ERROR_WEBPKI_ERRORS) {
    -          failf(data, "Cert verify failed");
    -          return CURLE_PEER_FAILED_VERIFICATION;
    -        }
    -      }
    -      return CURLE_SSL_CONNECT_ERROR;
    -    }
    -  }
    -
    -  connssl->connecting_state = ssl_connect_3;
    -  infof(data,
    -        "SSL connection using %s / %s",
    -        SSL_get_version(backend->handle),
    -        SSL_get_cipher_name(backend->handle));
    -
    -  return CURLE_OK;
    -}
    -
    -static CURLcode
    -mesalink_connect_step3(struct connectdata *conn, int sockindex)
    -{
    -  CURLcode result = CURLE_OK;
    -  struct ssl_connect_data *connssl = &conn->ssl[sockindex];
    -
    -  DEBUGASSERT(ssl_connect_3 == connssl->connecting_state);
    -
    -#ifdef MESALINK_HAVE_SESSION
    -  if(SSL_SET_OPTION(primary.sessionid)) {
    -    bool incache;
    -    SSL_SESSION *our_ssl_sessionid;
    -    void *old_ssl_sessionid = NULL;
    -    bool isproxy = SSL_IS_PROXY() ? TRUE : FALSE;
    -    struct ssl_backend_data *backend = connssl->backend;
    -
    -    our_ssl_sessionid = SSL_get_session(backend->handle);
    -
    -    Curl_ssl_sessionid_lock(data);
    -    incache =
    -      !(Curl_ssl_getsessionid(data, conn, isproxy, &old_ssl_sessionid, NULL,
    -                              sockindex));
    -    if(incache) {
    -      if(old_ssl_sessionid != our_ssl_sessionid) {
    -        infof(data, "old SSL session ID is stale, removing");
    -        Curl_ssl_delsessionid(data, old_ssl_sessionid);
    -        incache = FALSE;
    -      }
    -    }
    -
    -    if(!incache) {
    -      result =
    -        Curl_ssl_addsessionid(data, conn, isproxy, our_ssl_sessionid, 0,
    -                              sockindex, NULL);
    -      if(result) {
    -        Curl_ssl_sessionid_unlock(data);
    -        failf(data, "failed to store ssl session");
    -        return result;
    -      }
    -    }
    -    Curl_ssl_sessionid_unlock(data);
    -  }
    -#endif /* MESALINK_HAVE_SESSION */
    -
    -  connssl->connecting_state = ssl_connect_done;
    -
    -  return result;
    -}
    -
    -static ssize_t
    -mesalink_send(struct Curl_easy *data, int sockindex, const void *mem,
    -              size_t len, CURLcode *curlcode)
    -{
    -  struct connectdata *conn = data->conn;
    -  struct ssl_connect_data *connssl = &conn->ssl[sockindex];
    -  struct ssl_backend_data *backend = connssl->backend;
    -  char error_buffer[MESALINK_MAX_ERROR_SZ];
    -  int memlen = (len > (size_t)INT_MAX) ? INT_MAX : (int)len;
    -  int rc = SSL_write(backend->handle, mem, memlen);
    -
    -  if(rc < 0) {
    -    int err = SSL_get_error(backend->handle, rc);
    -    switch(err) {
    -    case SSL_ERROR_WANT_READ:
    -    case SSL_ERROR_WANT_WRITE:
    -      /* there's data pending, re-invoke SSL_write() */
    -      *curlcode = CURLE_AGAIN;
    -      return -1;
    -    default:
    -      failf(data,
    -            "SSL write: %s, errno %d",
    -            ERR_error_string_n(err, error_buffer, sizeof(error_buffer)),
    -            SOCKERRNO);
    -      *curlcode = CURLE_SEND_ERROR;
    -      return -1;
    -    }
    -  }
    -  return rc;
    -}
    -
    -static void
    -mesalink_close(struct Curl_easy *data, struct connectdata *conn, int sockindex)
    -{
    -  struct ssl_connect_data *connssl = &conn->ssl[sockindex];
    -  struct ssl_backend_data *backend = connssl->backend;
    -
    -  (void) data;
    -
    -  if(backend->handle) {
    -    (void)SSL_shutdown(backend->handle);
    -    SSL_free(backend->handle);
    -    backend->handle = NULL;
    -  }
    -  if(backend->ctx) {
    -    SSL_CTX_free(backend->ctx);
    -    backend->ctx = NULL;
    -  }
    -}
    -
    -static ssize_t
    -mesalink_recv(struct Curl_easy *data, int num, char *buf, size_t buffersize,
    -              CURLcode *curlcode)
    -{
    -  struct connectdata *conn = data->conn;
    -  struct ssl_connect_data *connssl = &conn->ssl[num];
    -  struct ssl_backend_data *backend = connssl->backend;
    -  char error_buffer[MESALINK_MAX_ERROR_SZ];
    -  int buffsize = (buffersize > (size_t)INT_MAX) ? INT_MAX : (int)buffersize;
    -  int nread = SSL_read(backend->handle, buf, buffsize);
    -
    -  if(nread <= 0) {
    -    int err = SSL_get_error(backend->handle, nread);
    -
    -    switch(err) {
    -    case SSL_ERROR_ZERO_RETURN: /* no more data */
    -    case IO_ERROR_CONNECTION_ABORTED:
    -      break;
    -    case SSL_ERROR_WANT_READ:
    -    case SSL_ERROR_WANT_WRITE:
    -      /* there's data pending, re-invoke SSL_read() */
    -      *curlcode = CURLE_AGAIN;
    -      return -1;
    -    default:
    -      failf(data,
    -            "SSL read: %s, errno %d",
    -            ERR_error_string_n(err, error_buffer, sizeof(error_buffer)),
    -            SOCKERRNO);
    -      *curlcode = CURLE_RECV_ERROR;
    -      return -1;
    -    }
    -  }
    -  return nread;
    -}
    -
    -static size_t
    -mesalink_version(char *buffer, size_t size)
    -{
    -  return msnprintf(buffer, size, "MesaLink/%s", MESALINK_VERSION_STRING);
    -}
    -
    -static int
    -mesalink_init(void)
    -{
    -  return (SSL_library_init() == SSL_SUCCESS);
    -}
    -
    -/*
    - * This function is called to shut down the SSL layer but keep the
    - * socket open (CCC - Clear Command Channel)
    - */
    -static int
    -mesalink_shutdown(struct Curl_easy *data,
    -                  struct connectdata *conn, int sockindex)
    -{
    -  int retval = 0;
    -  struct ssl_connect_data *connssl = &conn->ssl[sockindex];
    -  struct ssl_backend_data *backend = connssl->backend;
    -
    -  (void) data;
    -
    -  if(backend->handle) {
    -    SSL_free(backend->handle);
    -    backend->handle = NULL;
    -  }
    -  return retval;
    -}
    -
    -static CURLcode
    -mesalink_connect_common(struct Curl_easy *data, struct connectdata *conn,
    -                        int sockindex, bool nonblocking, bool *done)
    -{
    -  CURLcode result;
    -  struct ssl_connect_data *connssl = &conn->ssl[sockindex];
    -  curl_socket_t sockfd = conn->sock[sockindex];
    -  timediff_t timeout_ms;
    -  int what;
    -
    -  /* check if the connection has already been established */
    -  if(ssl_connection_complete == connssl->state) {
    -    *done = TRUE;
    -    return CURLE_OK;
    -  }
    -
    -  if(ssl_connect_1 == connssl->connecting_state) {
    -    /* Find out how much more time we're allowed */
    -    timeout_ms = Curl_timeleft(data, NULL, TRUE);
    -
    -    if(timeout_ms < 0) {
    -      /* no need to continue if time already is up */
    -      failf(data, "SSL connection timeout");
    -      return CURLE_OPERATION_TIMEDOUT;
    -    }
    -
    -    result = mesalink_connect_step1(data, conn, sockindex);
    -    if(result)
    -      return result;
    -  }
    -
    -  while(ssl_connect_2 == connssl->connecting_state ||
    -        ssl_connect_2_reading == connssl->connecting_state ||
    -        ssl_connect_2_writing == connssl->connecting_state) {
    -
    -    /* check allowed time left */
    -    timeout_ms = Curl_timeleft(data, NULL, TRUE);
    -
    -    if(timeout_ms < 0) {
    -      /* no need to continue if time already is up */
    -      failf(data, "SSL connection timeout");
    -      return CURLE_OPERATION_TIMEDOUT;
    -    }
    -
    -    /* if ssl is expecting something, check if it's available. */
    -    if(connssl->connecting_state == ssl_connect_2_reading ||
    -       connssl->connecting_state == ssl_connect_2_writing) {
    -
    -      curl_socket_t writefd =
    -        ssl_connect_2_writing == connssl->connecting_state ? sockfd
    -                                                           : CURL_SOCKET_BAD;
    -      curl_socket_t readfd = ssl_connect_2_reading == connssl->connecting_state
    -                               ? sockfd
    -                               : CURL_SOCKET_BAD;
    -
    -      what = Curl_socket_check(readfd, CURL_SOCKET_BAD, writefd,
    -                               nonblocking ? 0 : timeout_ms);
    -      if(what < 0) {
    -        /* fatal error */
    -        failf(data, "select/poll on SSL socket, errno: %d", SOCKERRNO);
    -        return CURLE_SSL_CONNECT_ERROR;
    -      }
    -      else if(0 == what) {
    -        if(nonblocking) {
    -          *done = FALSE;
    -          return CURLE_OK;
    -        }
    -        else {
    -          /* timeout */
    -          failf(data, "SSL connection timeout");
    -          return CURLE_OPERATION_TIMEDOUT;
    -        }
    -      }
    -      /* socket is readable or writable */
    -    }
    -
    -    /* Run transaction, and return to the caller if it failed or if
    -     * this connection is part of a multi handle and this loop would
    -     * execute again. This permits the owner of a multi handle to
    -     * abort a connection attempt before step2 has completed while
    -     * ensuring that a client using select() or epoll() will always
    -     * have a valid fdset to wait on.
    -     */
    -    result = mesalink_connect_step2(data, conn, sockindex);
    -
    -    if(result ||
    -       (nonblocking && (ssl_connect_2 == connssl->connecting_state ||
    -                        ssl_connect_2_reading == connssl->connecting_state ||
    -                        ssl_connect_2_writing == connssl->connecting_state))) {
    -      return result;
    -    }
    -  } /* repeat step2 until all transactions are done. */
    -
    -  if(ssl_connect_3 == connssl->connecting_state) {
    -    result = mesalink_connect_step3(conn, sockindex);
    -    if(result)
    -      return result;
    -  }
    -
    -  if(ssl_connect_done == connssl->connecting_state) {
    -    connssl->state = ssl_connection_complete;
    -    conn->recv[sockindex] = mesalink_recv;
    -    conn->send[sockindex] = mesalink_send;
    -    *done = TRUE;
    -  }
    -  else
    -    *done = FALSE;
    -
    -  /* Reset our connect state machine */
    -  connssl->connecting_state = ssl_connect_1;
    -
    -  return CURLE_OK;
    -}
    -
    -static CURLcode
    -mesalink_connect_nonblocking(struct Curl_easy *data, struct connectdata *conn,
    -                             int sockindex, bool *done)
    -{
    -  return mesalink_connect_common(data, conn, sockindex, TRUE, done);
    -}
    -
    -static CURLcode
    -mesalink_connect(struct Curl_easy *data, struct connectdata *conn,
    -                 int sockindex)
    -{
    -  CURLcode result;
    -  bool done = FALSE;
    -
    -  result = mesalink_connect_common(data, conn, sockindex, FALSE, &done);
    -  if(result)
    -    return result;
    -
    -  DEBUGASSERT(done);
    -
    -  return CURLE_OK;
    -}
    -
    -static void *
    -mesalink_get_internals(struct ssl_connect_data *connssl,
    -                       CURLINFO info UNUSED_PARAM)
    -{
    -  struct ssl_backend_data *backend = connssl->backend;
    -  (void)info;
    -  return backend->handle;
    -}
    -
    -const struct Curl_ssl Curl_ssl_mesalink = {
    -  { CURLSSLBACKEND_MESALINK, "MesaLink" }, /* info */
    -
    -  SSLSUPP_SSL_CTX,
    -
    -  sizeof(struct ssl_backend_data),
    -
    -  mesalink_init,                 /* init */
    -  Curl_none_cleanup,             /* cleanup */
    -  mesalink_version,              /* version */
    -  Curl_none_check_cxn,           /* check_cxn */
    -  mesalink_shutdown,             /* shutdown */
    -  Curl_none_data_pending,        /* data_pending */
    -  Curl_none_random,              /* random */
    -  Curl_none_cert_status_request, /* cert_status_request */
    -  mesalink_connect,              /* connect */
    -  mesalink_connect_nonblocking,  /* connect_nonblocking */
    -  Curl_ssl_getsock,              /* getsock */
    -  mesalink_get_internals,        /* get_internals */
    -  mesalink_close,                /* close_one */
    -  Curl_none_close_all,           /* close_all */
    -  Curl_none_session_free,        /* session_free */
    -  Curl_none_set_engine,          /* set_engine */
    -  Curl_none_set_engine_default,  /* set_engine_default */
    -  Curl_none_engines_list,        /* engines_list */
    -  Curl_none_false_start,         /* false_start */
    -  NULL,                          /* sha256sum */
    -  NULL,                          /* associate_connection */
    -  NULL                           /* disassociate_connection */
    -};
    -
    -#endif
    diff --git a/vendor/curl/lib/vtls/mesalink.h b/vendor/curl/lib/vtls/mesalink.h
    deleted file mode 100644
    index 03f520c1dc..0000000000
    --- a/vendor/curl/lib/vtls/mesalink.h
    +++ /dev/null
    @@ -1,32 +0,0 @@
    -#ifndef HEADER_CURL_MESALINK_H
    -#define HEADER_CURL_MESALINK_H
    -/***************************************************************************
    - *                                  _   _ ____  _
    - *  Project                     ___| | | |  _ \| |
    - *                             / __| | | | |_) | |
    - *                            | (__| |_| |  _ <| |___
    - *                             \___|\___/|_| \_\_____|
    - *
    - * Copyright (C) 2017 - 2018, Yiming Jing, 
    - * Copyright (C) 1998 - 2020, Daniel Stenberg, , et al.
    - *
    - * This software is licensed as described in the file COPYING, which
    - * you should have received as part of this distribution. The terms
    - * are also available at https://curl.se/docs/copyright.html.
    - *
    - * You may opt to use, copy, modify, merge, publish, distribute and/or sell
    - * copies of the Software, and permit persons to whom the Software is
    - * furnished to do so, under the terms of the COPYING file.
    - *
    - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
    - * KIND, either express or implied.
    - *
    - ***************************************************************************/
    -#include "curl_setup.h"
    -
    -#ifdef USE_MESALINK
    -
    -extern const struct Curl_ssl Curl_ssl_mesalink;
    -
    -#endif /* USE_MESALINK */
    -#endif /* HEADER_CURL_MESALINK_H */
    diff --git a/vendor/curl/lib/vtls/nss.c b/vendor/curl/lib/vtls/nss.c
    index 2b44f05126..558e3bed39 100644
    --- a/vendor/curl/lib/vtls/nss.c
    +++ b/vendor/curl/lib/vtls/nss.c
    @@ -5,7 +5,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2021, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -488,6 +488,9 @@ static CURLcode nss_create_object(struct ssl_connect_data *connssl,
       const int slot_id = (cacert) ? 0 : 1;
       char *slot_name = aprintf("PEM Token #%d", slot_id);
       struct ssl_backend_data *backend = connssl->backend;
    +
    +  DEBUGASSERT(backend);
    +
       if(!slot_name)
         return CURLE_OUT_OF_MEMORY;
     
    @@ -882,8 +885,14 @@ static void HandshakeCallback(PRFileDesc *sock, void *arg)
            !memcmp(ALPN_HTTP_1_1, buf, ALPN_HTTP_1_1_LENGTH)) {
           conn->negnpn = CURL_HTTP_VERSION_1_1;
         }
    -    Curl_multiuse_state(data, conn->negnpn == CURL_HTTP_VERSION_2 ?
    -                        BUNDLE_MULTIPLEX : BUNDLE_NO_MULTIUSE);
    +
    +    /* This callback might get called when PR_Recv() is used within
    +     * close_one() during a connection shutdown. At that point there might not
    +     * be any "bundle" associated with the connection anymore.
    +     */
    +    if(conn->bundle)
    +      Curl_multiuse_state(data, conn->negnpn == CURL_HTTP_VERSION_2 ?
    +                          BUNDLE_MULTIPLEX : BUNDLE_NO_MULTIUSE);
       }
     }
     
    @@ -1105,9 +1114,12 @@ static CURLcode cmp_peer_pubkey(struct ssl_connect_data *connssl,
     {
       CURLcode result = CURLE_SSL_PINNEDPUBKEYNOTMATCH;
       struct ssl_backend_data *backend = connssl->backend;
    -  struct Curl_easy *data = backend->data;
    +  struct Curl_easy *data = NULL;
       CERTCertificate *cert;
     
    +  DEBUGASSERT(backend);
    +  data = backend->data;
    +
       if(!pinnedpubkey)
         /* no pinned public key specified */
         return CURLE_OK;
    @@ -1158,10 +1170,15 @@ static SECStatus SelectClientCert(void *arg, PRFileDesc *sock,
     {
       struct ssl_connect_data *connssl = (struct ssl_connect_data *)arg;
       struct ssl_backend_data *backend = connssl->backend;
    -  struct Curl_easy *data = backend->data;
    -  const char *nickname = backend->client_nickname;
    +  struct Curl_easy *data = NULL;
    +  const char *nickname = NULL;
       static const char pem_slotname[] = "PEM Token #1";
     
    +  DEBUGASSERT(backend);
    +
    +  data = backend->data;
    +  nickname = backend->client_nickname;
    +
       if(backend->obj_clicert) {
         /* use the cert/key provided by PEM reader */
         SECItem cert_der = { 0, NULL, 0 };
    @@ -1529,6 +1546,8 @@ static int nss_check_cxn(struct connectdata *conn)
       int rc;
       char buf;
     
    +  DEBUGASSERT(backend);
    +
       rc =
         PR_Recv(backend->handle, (void *)&buf, 1, PR_MSG_PEEK,
                 PR_SecondsToInterval(1));
    @@ -1545,7 +1564,11 @@ static void close_one(struct ssl_connect_data *connssl)
     {
       /* before the cleanup, check whether we are using a client certificate */
       struct ssl_backend_data *backend = connssl->backend;
    -  const bool client_cert = (backend->client_nickname != NULL)
    +  bool client_cert = true;
    +
    +  DEBUGASSERT(backend);
    +
    +  client_cert = (backend->client_nickname != NULL)
         || (backend->obj_clicert != NULL);
     
       if(backend->handle) {
    @@ -1587,8 +1610,13 @@ static void nss_close(struct Curl_easy *data, struct connectdata *conn,
       struct ssl_connect_data *connssl_proxy = &conn->proxy_ssl[sockindex];
     #endif
       struct ssl_backend_data *backend = connssl->backend;
    -
       (void)data;
    +
    +  DEBUGASSERT(backend);
    +#ifndef CURL_DISABLE_PROXY
    +  DEBUGASSERT(connssl_proxy->backend != NULL);
    +#endif
    +
       if(backend->handle
     #ifndef CURL_DISABLE_PROXY
         || connssl_proxy->backend->handle
    @@ -1816,6 +1844,8 @@ static CURLcode nss_fail_connect(struct ssl_connect_data *connssl,
     {
       struct ssl_backend_data *backend = connssl->backend;
     
    +  DEBUGASSERT(backend);
    +
       if(is_nss_error(curlerr)) {
         /* read NSPR error code */
         PRErrorCode err = PR_GetError();
    @@ -1842,6 +1872,9 @@ static CURLcode nss_set_blocking(struct ssl_connect_data *connssl,
     {
       PRSocketOptionData sock_opt;
       struct ssl_backend_data *backend = connssl->backend;
    +
    +  DEBUGASSERT(backend);
    +
       sock_opt.option = PR_SockOpt_Nonblocking;
       sock_opt.value.non_blocking = !blocking;
     
    @@ -1865,7 +1898,6 @@ static CURLcode nss_setup_connect(struct Curl_easy *data,
       CURLcode result;
       bool second_layer = FALSE;
       SSLVersionRange sslver_supported;
    -
       SSLVersionRange sslver = {
         SSL_LIBRARY_VERSION_TLS_1_0,  /* min */
     #ifdef SSL_LIBRARY_VERSION_TLS_1_3
    @@ -1878,6 +1910,13 @@ static CURLcode nss_setup_connect(struct Curl_easy *data,
         SSL_LIBRARY_VERSION_TLS_1_0
     #endif
       };
    +  char *snihost = Curl_ssl_snihost(data, SSL_HOST_NAME(), NULL);
    +  if(!snihost) {
    +    failf(data, "Failed to set SNI");
    +    return CURLE_SSL_CONNECT_ERROR;
    +  }
    +
    +  DEBUGASSERT(backend);
     
       backend->data = data;
     
    @@ -2028,9 +2067,12 @@ static CURLcode nss_setup_connect(struct Curl_easy *data,
     
     #ifndef CURL_DISABLE_PROXY
       if(conn->proxy_ssl[sockindex].use) {
    +    struct ssl_backend_data *proxy_backend;
    +    proxy_backend = conn->proxy_ssl[sockindex].backend;
         DEBUGASSERT(ssl_connection_complete == conn->proxy_ssl[sockindex].state);
    -    DEBUGASSERT(conn->proxy_ssl[sockindex].backend->handle != NULL);
    -    nspr_io = conn->proxy_ssl[sockindex].backend->handle;
    +    DEBUGASSERT(proxy_backend);
    +    DEBUGASSERT(proxy_backend->handle);
    +    nspr_io = proxy_backend->handle;
         second_layer = TRUE;
       }
     #endif
    @@ -2140,11 +2182,11 @@ static CURLcode nss_setup_connect(struct Curl_easy *data,
         goto error;
     
       /* propagate hostname to the TLS layer */
    -  if(SSL_SetURL(backend->handle, SSL_HOST_NAME()) != SECSuccess)
    +  if(SSL_SetURL(backend->handle, snihost) != SECSuccess)
         goto error;
     
       /* prevent NSS from re-using the session for a different hostname */
    -  if(SSL_SetSockPeerID(backend->handle, SSL_HOST_NAME()) != SECSuccess)
    +  if(SSL_SetSockPeerID(backend->handle, snihost) != SECSuccess)
         goto error;
     
       return CURLE_OK;
    @@ -2172,6 +2214,8 @@ static CURLcode nss_do_connect(struct Curl_easy *data,
         goto error;
       }
     
    +  DEBUGASSERT(backend);
    +
       /* Force the handshake now */
       timeout = PR_MillisecondsToInterval((PRUint32) time_left);
       if(SSL_ForceHandshakeWithTimeout(backend->handle, timeout) != SECSuccess) {
    @@ -2305,6 +2349,8 @@ static ssize_t nss_send(struct Curl_easy *data,    /* transfer */
       struct ssl_backend_data *backend = connssl->backend;
       ssize_t rc;
     
    +  DEBUGASSERT(backend);
    +
       /* The SelectClientCert() hook uses this for infof() and failf() but the
          handle stored in nss_setup_connect() could have already been freed. */
       backend->data = data;
    @@ -2344,6 +2390,8 @@ static ssize_t nss_recv(struct Curl_easy *data,    /* transfer */
       struct ssl_backend_data *backend = connssl->backend;
       ssize_t nread;
     
    +  DEBUGASSERT(backend);
    +
       /* The SelectClientCert() hook uses this for infof() and failf() but the
          handle stored in nss_setup_connect() could have already been freed. */
       backend->data = data;
    @@ -2442,6 +2490,7 @@ static void *nss_get_internals(struct ssl_connect_data *connssl,
     {
       struct ssl_backend_data *backend = connssl->backend;
       (void)info;
    +  DEBUGASSERT(backend);
       return backend->handle;
     }
     
    diff --git a/vendor/curl/lib/vtls/openssl.c b/vendor/curl/lib/vtls/openssl.c
    index f836c63b07..616a510b0a 100644
    --- a/vendor/curl/lib/vtls/openssl.c
    +++ b/vendor/curl/lib/vtls/openssl.c
    @@ -5,7 +5,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2021, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -91,7 +91,6 @@
     #endif
     
     #include "warnless.h"
    -#include "non-ascii.h" /* for Curl_convert_from_utf8 prototype */
     
     /* The last #include files should be: */
     #include "curl_memory.h"
    @@ -266,7 +265,7 @@ struct ssl_backend_data {
     #endif
     };
     
    -static void ossl_associate_connection(struct Curl_easy *data,
    +static bool ossl_associate_connection(struct Curl_easy *data,
                                           struct connectdata *conn,
                                           int sockindex);
     
    @@ -1432,6 +1431,9 @@ static void ossl_closeone(struct Curl_easy *data,
                               struct ssl_connect_data *connssl)
     {
       struct ssl_backend_data *backend = connssl->backend;
    +
    +  DEBUGASSERT(backend);
    +
       if(backend->handle) {
         char buf[32];
         set_logger(conn, data);
    @@ -1489,6 +1491,8 @@ static int ossl_shutdown(struct Curl_easy *data,
       struct ssl_backend_data *backend = connssl->backend;
       int loop = 10;
     
    +  DEBUGASSERT(backend);
    +
     #ifndef CURL_DISABLE_FTP
       /* This has only been tested on the proftpd server, and the mod_tls code
          sends a close notify alert without waiting for a close notify alert in
    @@ -1610,54 +1614,26 @@ static void ossl_close_all(struct Curl_easy *data)
     /* ====================================================== */
     
     /*
    - * Match subjectAltName against the host name. This requires a conversion
    - * in CURL_DOES_CONVERSIONS builds.
    + * Match subjectAltName against the host name.
      */
     static bool subj_alt_hostcheck(struct Curl_easy *data,
    -                               const char *match_pattern, const char *hostname,
    +                               const char *match_pattern,
    +                               size_t matchlen,
    +                               const char *hostname,
    +                               size_t hostlen,
                                    const char *dispname)
    -#ifdef CURL_DOES_CONVERSIONS
    -{
    -  bool res = FALSE;
    -
    -  /* Curl_cert_hostcheck uses host encoding, but we get ASCII from
    -     OpenSSl.
    -   */
    -  char *match_pattern2 = strdup(match_pattern);
    -
    -  if(match_pattern2) {
    -    if(Curl_convert_from_network(data, match_pattern2,
    -                                strlen(match_pattern2)) == CURLE_OK) {
    -      if(Curl_cert_hostcheck(match_pattern2, hostname)) {
    -        res = TRUE;
    -        infof(data,
    -                " subjectAltName: host \"%s\" matched cert's \"%s\"",
    -                dispname, match_pattern2);
    -      }
    -    }
    -    free(match_pattern2);
    -  }
    -  else {
    -    failf(data,
    -        "SSL: out of memory when allocating temporary for subjectAltName");
    -  }
    -  return res;
    -}
    -#else
     {
     #ifdef CURL_DISABLE_VERBOSE_STRINGS
       (void)dispname;
       (void)data;
     #endif
    -  if(Curl_cert_hostcheck(match_pattern, hostname)) {
    +  if(Curl_cert_hostcheck(match_pattern, matchlen, hostname, hostlen)) {
         infof(data, " subjectAltName: host \"%s\" matched cert's \"%s\"",
                       dispname, match_pattern);
         return TRUE;
       }
       return FALSE;
     }
    -#endif
    -
     
     /* Quote from RFC2818 section 3.1 "Server Identity"
     
    @@ -1698,6 +1674,7 @@ CURLcode Curl_ossl_verifyhost(struct Curl_easy *data, struct connectdata *conn,
       bool iPAddress = FALSE; /* if a iPAddress field exists in the cert */
       const char * const hostname = SSL_HOST_NAME();
       const char * const dispname = SSL_HOST_DISPNAME();
    +  size_t hostlen = strlen(hostname);
     
     #ifdef ENABLE_IPV6
       if(conn->bits.ipv6_ip &&
    @@ -1760,7 +1737,9 @@ CURLcode Curl_ossl_verifyhost(struct Curl_easy *data, struct connectdata *conn,
               if((altlen == strlen(altptr)) &&
                  /* if this isn't true, there was an embedded zero in the name
                     string and we cannot match it. */
    -             subj_alt_hostcheck(data, altptr, hostname, dispname)) {
    +             subj_alt_hostcheck(data,
    +                                altptr,
    +                                altlen, hostname, hostlen, dispname)) {
                 dnsmatched = TRUE;
               }
               break;
    @@ -1796,17 +1775,17 @@ CURLcode Curl_ossl_verifyhost(struct Curl_easy *data, struct connectdata *conn,
       else {
         /* we have to look to the last occurrence of a commonName in the
            distinguished one to get the most significant one. */
    -    int j, i = -1;
    +    int i = -1;
    +    unsigned char *peer_CN = NULL;
    +    int peerlen = 0;
     
         /* The following is done because of a bug in 0.9.6b */
    -
    -    unsigned char *nulstr = (unsigned char *)"";
    -    unsigned char *peer_CN = nulstr;
    -
         X509_NAME *name = X509_get_subject_name(server_cert);
    -    if(name)
    +    if(name) {
    +      int j;
           while((j = X509_NAME_get_index_by_NID(name, NID_commonName, i)) >= 0)
             i = j;
    +    }
     
         /* we have the name entry and we will now convert this to a string
            that we can use for comparison. Doing this we support BMPstring,
    @@ -1822,19 +1801,20 @@ CURLcode Curl_ossl_verifyhost(struct Curl_easy *data, struct connectdata *conn,
              conditional in the future when OpenSSL has been fixed. */
           if(tmp) {
             if(ASN1_STRING_type(tmp) == V_ASN1_UTF8STRING) {
    -          j = ASN1_STRING_length(tmp);
    -          if(j >= 0) {
    -            peer_CN = OPENSSL_malloc(j + 1);
    +          peerlen = ASN1_STRING_length(tmp);
    +          if(peerlen >= 0) {
    +            peer_CN = OPENSSL_malloc(peerlen + 1);
                 if(peer_CN) {
    -              memcpy(peer_CN, ASN1_STRING_get0_data(tmp), j);
    -              peer_CN[j] = '\0';
    +              memcpy(peer_CN, ASN1_STRING_get0_data(tmp), peerlen);
    +              peer_CN[peerlen] = '\0';
                 }
    +            result = CURLE_OUT_OF_MEMORY;
               }
             }
             else /* not a UTF8 name */
    -          j = ASN1_STRING_to_UTF8(&peer_CN, tmp);
    +          peerlen = ASN1_STRING_to_UTF8(&peer_CN, tmp);
     
    -        if(peer_CN && (curlx_uztosi(strlen((char *)peer_CN)) != j)) {
    +        if(peer_CN && (curlx_uztosi(strlen((char *)peer_CN)) != peerlen)) {
               /* there was a terminating zero before the end of string, this
                  cannot match and we return failure! */
               failf(data, "SSL: illegal cert name field");
    @@ -1843,19 +1823,6 @@ CURLcode Curl_ossl_verifyhost(struct Curl_easy *data, struct connectdata *conn,
           }
         }
     
    -    if(peer_CN == nulstr)
    -       peer_CN = NULL;
    -    else {
    -      /* convert peer_CN from UTF8 */
    -      CURLcode rc = Curl_convert_from_utf8(data, (char *)peer_CN,
    -                                           strlen((char *)peer_CN));
    -      /* Curl_convert_from_utf8 calls failf if unsuccessful */
    -      if(rc) {
    -        OPENSSL_free(peer_CN);
    -        return rc;
    -      }
    -    }
    -
         if(result)
           /* error already detected, pass through */
           ;
    @@ -1864,7 +1831,8 @@ CURLcode Curl_ossl_verifyhost(struct Curl_easy *data, struct connectdata *conn,
                 "SSL: unable to obtain common name from peer certificate");
           result = CURLE_PEER_FAILED_VERIFICATION;
         }
    -    else if(!Curl_cert_hostcheck((const char *)peer_CN, hostname)) {
    +    else if(!Curl_cert_hostcheck((const char *)peer_CN,
    +                                 peerlen, hostname, hostlen)) {
           failf(data, "SSL: certificate subject name '%s' does not match "
                 "target host name '%s'", peer_CN, dispname);
           result = CURLE_PEER_FAILED_VERIFICATION;
    @@ -1898,8 +1866,11 @@ static CURLcode verifystatus(struct Curl_easy *data,
       int cert_status, crl_reason;
       ASN1_GENERALIZEDTIME *rev, *thisupd, *nextupd;
       int ret;
    +  long len;
     
    -  long len = SSL_get_tlsext_status_ocsp_resp(backend->handle, &status);
    +  DEBUGASSERT(backend);
    +
    +  len = SSL_get_tlsext_status_ocsp_resp(backend->handle, &status);
     
       if(!status) {
         failf(data, "No OCSP response received");
    @@ -2158,7 +2129,10 @@ static void ossl_trace(int direction, int ssl_ver, int content_type,
       struct connectdata *conn = userp;
       struct ssl_connect_data *connssl = &conn->ssl[0];
       struct ssl_backend_data *backend = connssl->backend;
    -  struct Curl_easy *data = backend->logger;
    +  struct Curl_easy *data = NULL;
    +
    +  DEBUGASSERT(backend);
    +  data = backend->logger;
     
       if(!conn || !data || !data->set.fdebug ||
          (direction != 0 && direction != 1))
    @@ -2363,10 +2337,12 @@ set_ssl_version_min_max(SSL_CTX *ctx, struct connectdata *conn)
         case CURL_SSLVERSION_TLSv1_2:
           ossl_ssl_version_min = TLS1_2_VERSION;
           break;
    -#ifdef TLS1_3_VERSION
         case CURL_SSLVERSION_TLSv1_3:
    +#ifdef TLS1_3_VERSION
           ossl_ssl_version_min = TLS1_3_VERSION;
           break;
    +#else
    +      return CURLE_NOT_BUILT_IN;
     #endif
       }
     
    @@ -2422,6 +2398,8 @@ set_ssl_version_min_max(SSL_CTX *ctx, struct connectdata *conn)
     
     #ifdef OPENSSL_IS_BORINGSSL
     typedef uint32_t ctx_option_t;
    +#elif OPENSSL_VERSION_NUMBER >= 0x30000000L
    +typedef uint64_t ctx_option_t;
     #else
     typedef long ctx_option_t;
     #endif
    @@ -2442,6 +2420,8 @@ set_ssl_version_min_max_legacy(ctx_option_t *ctx_options,
     #ifdef TLS1_3_VERSION
         {
           struct ssl_connect_data *connssl = &conn->ssl[sockindex];
    +      struct ssl_backend_data *backend = connssl->backend;
    +      DEBUGASSERT(backend);
           SSL_CTX_set_max_proto_version(backend->ctx, TLS1_3_VERSION);
           *ctx_options |= SSL_OP_NO_TLSv1_2;
         }
    @@ -2521,13 +2501,12 @@ static int ossl_new_session_cb(SSL *ssl, SSL_SESSION *ssl_sessionid)
         return 0;
     
       conn = (struct connectdata*) SSL_get_ex_data(ssl, connectdata_idx);
    -  if(!conn)
    -    return 0;
    -
       data = (struct Curl_easy *) SSL_get_ex_data(ssl, data_idx);
    -
       /* The sockindex has been stored as a pointer to an array element */
       sockindex_ptr = (curl_socket_t*) SSL_get_ex_data(ssl, sockindex_idx);
    +  if(!conn || !data || !sockindex_ptr)
    +    return 0;
    +
       sockindex = (int)(sockindex_ptr - conn->sock);
     
       isproxy = SSL_get_ex_data(ssl, proxy_idx) ? TRUE : FALSE;
    @@ -2670,6 +2649,7 @@ static CURLcode ossl_connect_step1(struct Curl_easy *data,
       bool imported_native_ca = false;
     
       DEBUGASSERT(ssl_connect_1 == connssl->connecting_state);
    +  DEBUGASSERT(backend);
     
       /* Make funny stuff to get random input */
       result = ossl_seed(data);
    @@ -2736,8 +2716,8 @@ static CURLcode ossl_connect_step1(struct Curl_easy *data,
          implementations is desired."
     
          The "-no_ticket" option was introduced in OpenSSL 0.9.8j. It's a flag to
    -     disable "rfc4507bis session ticket support".  rfc4507bis was later turned
    -     into the proper RFC5077 it seems: https://tools.ietf.org/html/rfc5077
    +     disable "rfc4507bis session ticket support". rfc4507bis was later turned
    +     into the proper RFC5077: https://datatracker.ietf.org/doc/html/rfc5077
     
          The enabled extension concerns the session management. I wonder how often
          libcurl stops a connection and then resumes a TLS session. Also, sending
    @@ -2942,7 +2922,7 @@ static CURLcode ossl_connect_step1(struct Curl_easy *data,
       /* Import certificates from the Windows root certificate store if requested.
          https://stackoverflow.com/questions/9507184/
          https://github.com/d3x0r/SACK/blob/master/src/netlib/ssl_layer.c#L1037
    -     https://tools.ietf.org/html/rfc5280 */
    +     https://datatracker.ietf.org/doc/html/rfc5280 */
       if((SSL_CONN_CONFIG(verifypeer) || SSL_CONN_CONFIG(verifyhost)) &&
          (SSL_SET_OPTION(native_ca_store))) {
         X509_STORE *store = SSL_CTX_get_cert_store(backend->ctx);
    @@ -3243,44 +3223,48 @@ static CURLcode ossl_connect_step1(struct Curl_easy *data,
          (0 == Curl_inet_pton(AF_INET6, hostname, &addr)) &&
     #endif
          sni) {
    -    size_t nlen = strlen(hostname);
    -    if((long)nlen >= data->set.buffer_size)
    -      /* this is seriously messed up */
    +    char *snihost = Curl_ssl_snihost(data, hostname, NULL);
    +    if(!snihost || !SSL_set_tlsext_host_name(backend->handle, snihost)) {
    +      failf(data, "Failed set SNI");
           return CURLE_SSL_CONNECT_ERROR;
    -
    -    /* RFC 6066 section 3 says the SNI field is case insensitive, but browsers
    -       send the data lowercase and subsequently there are now numerous servers
    -       out there that don't work unless the name is lowercased */
    -    Curl_strntolower(data->state.buffer, hostname, nlen);
    -    data->state.buffer[nlen] = 0;
    -    if(!SSL_set_tlsext_host_name(backend->handle, data->state.buffer))
    -      infof(data, "WARNING: failed to configure server name indication (SNI) "
    -            "TLS extension");
    +    }
       }
     #endif
     
    -  ossl_associate_connection(data, conn, sockindex);
    +  if(!ossl_associate_connection(data, conn, sockindex)) {
    +    /* Maybe the internal errors of SSL_get_ex_new_index or SSL_set_ex_data */
    +    failf(data, "SSL: ossl_associate_connection failed: %s",
    +          ossl_strerror(ERR_get_error(), error_buffer,
    +                        sizeof(error_buffer)));
    +    return CURLE_SSL_CONNECT_ERROR;
    +  }
     
    -  Curl_ssl_sessionid_lock(data);
    -  if(!Curl_ssl_getsessionid(data, conn, SSL_IS_PROXY() ? TRUE : FALSE,
    -                            &ssl_sessionid, NULL, sockindex)) {
    -    /* we got a session id, use it! */
    -    if(!SSL_set_session(backend->handle, ssl_sessionid)) {
    -      Curl_ssl_sessionid_unlock(data);
    -      failf(data, "SSL: SSL_set_session failed: %s",
    -            ossl_strerror(ERR_get_error(), error_buffer,
    -                          sizeof(error_buffer)));
    -      return CURLE_SSL_CONNECT_ERROR;
    +  if(SSL_SET_OPTION(primary.sessionid)) {
    +    Curl_ssl_sessionid_lock(data);
    +    if(!Curl_ssl_getsessionid(data, conn, SSL_IS_PROXY() ? TRUE : FALSE,
    +                              &ssl_sessionid, NULL, sockindex)) {
    +      /* we got a session id, use it! */
    +      if(!SSL_set_session(backend->handle, ssl_sessionid)) {
    +        Curl_ssl_sessionid_unlock(data);
    +        failf(data, "SSL: SSL_set_session failed: %s",
    +              ossl_strerror(ERR_get_error(), error_buffer,
    +                            sizeof(error_buffer)));
    +        return CURLE_SSL_CONNECT_ERROR;
    +      }
    +      /* Informational message */
    +      infof(data, "SSL re-using session ID");
         }
    -    /* Informational message */
    -    infof(data, "SSL re-using session ID");
    +    Curl_ssl_sessionid_unlock(data);
       }
    -  Curl_ssl_sessionid_unlock(data);
     
     #ifndef CURL_DISABLE_PROXY
       if(conn->proxy_ssl[sockindex].use) {
         BIO *const bio = BIO_new(BIO_f_ssl());
    -    SSL *handle = conn->proxy_ssl[sockindex].backend->handle;
    +    struct ssl_backend_data *proxy_backend;
    +    SSL* handle = NULL;
    +    proxy_backend = conn->proxy_ssl[sockindex].backend;
    +    DEBUGASSERT(proxy_backend);
    +    handle = proxy_backend->handle;
         DEBUGASSERT(ssl_connection_complete == conn->proxy_ssl[sockindex].state);
         DEBUGASSERT(handle != NULL);
         DEBUGASSERT(bio != NULL);
    @@ -3310,6 +3294,7 @@ static CURLcode ossl_connect_step2(struct Curl_easy *data,
       DEBUGASSERT(ssl_connect_2 == connssl->connecting_state
                   || ssl_connect_2_reading == connssl->connecting_state
                   || ssl_connect_2_writing == connssl->connecting_state);
    +  DEBUGASSERT(backend);
     
       ERR_clear_error();
     
    @@ -3571,6 +3556,8 @@ static CURLcode get_cert_chain(struct Curl_easy *data,
       BIO *mem;
       struct ssl_backend_data *backend = connssl->backend;
     
    +  DEBUGASSERT(backend);
    +
       sk = SSL_get_peer_cert_chain(backend->handle);
       if(!sk) {
         return CURLE_OUT_OF_MEMORY;
    @@ -3883,6 +3870,8 @@ static CURLcode servercert(struct Curl_easy *data,
       BIO *mem = BIO_new(BIO_s_mem());
       struct ssl_backend_data *backend = connssl->backend;
     
    +  DEBUGASSERT(backend);
    +
       if(!mem) {
         failf(data,
               "BIO_new return NULL, " OSSL_PACKAGE
    @@ -3953,9 +3942,20 @@ static CURLcode servercert(struct Curl_easy *data,
     
         /* e.g. match issuer name with provided issuer certificate */
         if(SSL_CONN_CONFIG(issuercert) || SSL_CONN_CONFIG(issuercert_blob)) {
    -      if(SSL_CONN_CONFIG(issuercert_blob))
    +      if(SSL_CONN_CONFIG(issuercert_blob)) {
             fp = BIO_new_mem_buf(SSL_CONN_CONFIG(issuercert_blob)->data,
                                  (int)SSL_CONN_CONFIG(issuercert_blob)->len);
    +        if(!fp) {
    +          failf(data,
    +                "BIO_new_mem_buf NULL, " OSSL_PACKAGE
    +                " error %s",
    +                ossl_strerror(ERR_get_error(), error_buffer,
    +                              sizeof(error_buffer)) );
    +          X509_free(backend->server_cert);
    +          backend->server_cert = NULL;
    +          return CURLE_OUT_OF_MEMORY;
    +        }
    +      }
           else {
             fp = BIO_new(BIO_s_file());
             if(!fp) {
    @@ -4222,11 +4222,13 @@ static bool ossl_data_pending(const struct connectdata *conn,
                                   int connindex)
     {
       const struct ssl_connect_data *connssl = &conn->ssl[connindex];
    +  DEBUGASSERT(connssl->backend);
       if(connssl->backend->handle && SSL_pending(connssl->backend->handle))
         return TRUE;
     #ifndef CURL_DISABLE_PROXY
       {
         const struct ssl_connect_data *proxyssl = &conn->proxy_ssl[connindex];
    +    DEBUGASSERT(proxyssl->backend);
         if(proxyssl->backend->handle && SSL_pending(proxyssl->backend->handle))
           return TRUE;
       }
    @@ -4253,6 +4255,8 @@ static ssize_t ossl_send(struct Curl_easy *data,
       struct ssl_connect_data *connssl = &conn->ssl[sockindex];
       struct ssl_backend_data *backend = connssl->backend;
     
    +  DEBUGASSERT(backend);
    +
       ERR_clear_error();
     
       memlen = (len > (size_t)INT_MAX) ? INT_MAX : (int)len;
    @@ -4332,6 +4336,8 @@ static ssize_t ossl_recv(struct Curl_easy *data,   /* transfer */
       struct ssl_connect_data *connssl = &conn->ssl[num];
       struct ssl_backend_data *backend = connssl->backend;
     
    +  DEBUGASSERT(backend);
    +
       ERR_clear_error();
     
       buffsize = (buffersize > (size_t)INT_MAX) ? INT_MAX : (int)buffersize;
    @@ -4531,20 +4537,22 @@ static void *ossl_get_internals(struct ssl_connect_data *connssl,
     {
       /* Legacy: CURLINFO_TLS_SESSION must return an SSL_CTX pointer. */
       struct ssl_backend_data *backend = connssl->backend;
    +  DEBUGASSERT(backend);
       return info == CURLINFO_TLS_SESSION ?
              (void *)backend->ctx : (void *)backend->handle;
     }
     
    -static void ossl_associate_connection(struct Curl_easy *data,
    +static bool ossl_associate_connection(struct Curl_easy *data,
                                           struct connectdata *conn,
                                           int sockindex)
     {
       struct ssl_connect_data *connssl = &conn->ssl[sockindex];
       struct ssl_backend_data *backend = connssl->backend;
    +  DEBUGASSERT(backend);
     
       /* If we don't have SSL context, do nothing. */
       if(!backend->handle)
    -    return;
    +    return FALSE;
     
       if(SSL_SET_OPTION(primary.sessionid)) {
         int data_idx = ossl_get_ssl_data_index();
    @@ -4554,19 +4562,26 @@ static void ossl_associate_connection(struct Curl_easy *data,
     
         if(data_idx >= 0 && connectdata_idx >= 0 && sockindex_idx >= 0 &&
            proxy_idx >= 0) {
    +      int data_status, conn_status, sockindex_status, proxy_status;
    +
           /* Store the data needed for the "new session" callback.
            * The sockindex is stored as a pointer to an array element. */
    -      SSL_set_ex_data(backend->handle, data_idx, data);
    -      SSL_set_ex_data(backend->handle, connectdata_idx, conn);
    -      SSL_set_ex_data(backend->handle, sockindex_idx, conn->sock + sockindex);
    +      data_status = SSL_set_ex_data(backend->handle, data_idx, data);
    +      conn_status = SSL_set_ex_data(backend->handle, connectdata_idx, conn);
    +      sockindex_status = SSL_set_ex_data(backend->handle, sockindex_idx,
    +                                         conn->sock + sockindex);
     #ifndef CURL_DISABLE_PROXY
    -      SSL_set_ex_data(backend->handle, proxy_idx, SSL_IS_PROXY() ? (void *) 1:
    -                      NULL);
    +      proxy_status = SSL_set_ex_data(backend->handle, proxy_idx,
    +                                     SSL_IS_PROXY() ? (void *) 1 : NULL);
     #else
    -      SSL_set_ex_data(backend->handle, proxy_idx, NULL);
    +      proxy_status = SSL_set_ex_data(backend->handle, proxy_idx, NULL);
     #endif
    +      if(data_status && conn_status && sockindex_status && proxy_status)
    +        return TRUE;
         }
    +    return FALSE;
       }
    +  return TRUE;
     }
     
     /*
    @@ -4583,6 +4598,7 @@ static void ossl_disassociate_connection(struct Curl_easy *data,
       struct connectdata *conn = data->conn;
       struct ssl_connect_data *connssl = &conn->ssl[sockindex];
       struct ssl_backend_data *backend = connssl->backend;
    +  DEBUGASSERT(backend);
     
       /* If we don't have SSL context, do nothing. */
       if(!backend->handle)
    diff --git a/vendor/curl/lib/vtls/openssl.h b/vendor/curl/lib/vtls/openssl.h
    index 28058453c0..7df642bc9a 100644
    --- a/vendor/curl/lib/vtls/openssl.h
    +++ b/vendor/curl/lib/vtls/openssl.h
    @@ -7,7 +7,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2021, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -30,11 +30,17 @@
      * and ngtcp2.c
      */
     
    -#include 
     #include "urldata.h"
     
    +/*
    + * In an effort to avoid using 'X509 *' here, we instead use the struct
    + * x509_st version of the type so that we can forward-declare it here without
    + * having to include . Including that header causes name
    + * conflicts when libcurl is built with both Schannel and OpenSSL support.
    + */
    +struct x509_st;
     CURLcode Curl_ossl_verifyhost(struct Curl_easy *data, struct connectdata *conn,
    -                              X509 *server_cert);
    +                              struct x509_st *server_cert);
     extern const struct Curl_ssl Curl_ssl_openssl;
     
     #endif /* USE_OPENSSL */
    diff --git a/vendor/curl/lib/vtls/rustls.c b/vendor/curl/lib/vtls/rustls.c
    index 6dbb1ef3cd..0e651aed9d 100644
    --- a/vendor/curl/lib/vtls/rustls.c
    +++ b/vendor/curl/lib/vtls/rustls.c
    @@ -5,7 +5,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 2020 - 2021, Jacob Hoffman-Andrews,
    + * Copyright (C) 2020 - 2022, Jacob Hoffman-Andrews,
      * 
      *
      * This software is licensed as described in the file COPYING, which
    @@ -65,6 +65,7 @@ cr_data_pending(const struct connectdata *conn, int sockindex)
     {
       const struct ssl_connect_data *connssl = &conn->ssl[sockindex];
       struct ssl_backend_data *backend = connssl->backend;
    +  DEBUGASSERT(backend);
       return backend->data_pending;
     }
     
    @@ -118,7 +119,8 @@ cr_recv(struct Curl_easy *data, int sockindex,
       struct connectdata *conn = data->conn;
       struct ssl_connect_data *const connssl = &conn->ssl[sockindex];
       struct ssl_backend_data *const backend = connssl->backend;
    -  struct rustls_connection *const rconn = backend->conn;
    +  struct rustls_connection *rconn = NULL;
    +
       size_t n = 0;
       size_t tls_bytes_read = 0;
       size_t plain_bytes_copied = 0;
    @@ -126,6 +128,9 @@ cr_recv(struct Curl_easy *data, int sockindex,
       char errorbuf[255];
       rustls_io_result io_error;
     
    +  DEBUGASSERT(backend);
    +  rconn = backend->conn;
    +
       io_error = rustls_connection_read_tls(rconn, read_cb,
         &conn->sock[sockindex], &tls_bytes_read);
       if(io_error == EAGAIN || io_error == EWOULDBLOCK) {
    @@ -215,13 +220,16 @@ cr_send(struct Curl_easy *data, int sockindex,
       struct connectdata *conn = data->conn;
       struct ssl_connect_data *const connssl = &conn->ssl[sockindex];
       struct ssl_backend_data *const backend = connssl->backend;
    -  struct rustls_connection *const rconn = backend->conn;
    +  struct rustls_connection *rconn = NULL;
       size_t plainwritten = 0;
       size_t tlswritten = 0;
       size_t tlswritten_total = 0;
       rustls_result rresult;
       rustls_io_result io_error;
     
    +  DEBUGASSERT(backend);
    +  rconn = backend->conn;
    +
       infof(data, "cr_send %ld bytes of plaintext", plainlen);
     
       if(plainlen > 0) {
    @@ -295,9 +303,13 @@ static CURLcode
     cr_init_backend(struct Curl_easy *data, struct connectdata *conn,
                     struct ssl_backend_data *const backend)
     {
    -  struct rustls_connection *rconn = backend->conn;
    +  struct rustls_connection *rconn = NULL;
       struct rustls_client_config_builder *config_builder = NULL;
    -  const char *const ssl_cafile = SSL_CONN_CONFIG(CAfile);
    +  struct rustls_root_cert_store *roots = NULL;
    +  const struct curl_blob *ca_info_blob = SSL_CONN_CONFIG(ca_info_blob);
    +  const char * const ssl_cafile =
    +    /* CURLOPT_CAINFO_BLOB overrides CURLOPT_CAINFO */
    +    (ca_info_blob ? NULL : SSL_CONN_CONFIG(CAfile));
       const bool verifypeer = SSL_CONN_CONFIG(verifypeer);
       const char *hostname = conn->host.name;
       char errorbuf[256];
    @@ -308,6 +320,9 @@ cr_init_backend(struct Curl_easy *data, struct connectdata *conn,
         { (const uint8_t *)ALPN_H2, ALPN_H2_LENGTH },
       };
     
    +  DEBUGASSERT(backend);
    +  rconn = backend->conn;
    +
       config_builder = rustls_client_config_builder_new();
     #ifdef USE_HTTP2
       infof(data, "offering ALPN for HTTP/1.1 and HTTP/2");
    @@ -328,6 +343,29 @@ cr_init_backend(struct Curl_easy *data, struct connectdata *conn,
           hostname = "example.invalid";
         }
       }
    +  else if(ca_info_blob) {
    +    roots = rustls_root_cert_store_new();
    +
    +    /* Enable strict parsing only if verification isn't disabled. */
    +    result = rustls_root_cert_store_add_pem(roots, ca_info_blob->data,
    +                                            ca_info_blob->len, verifypeer);
    +    if(result != RUSTLS_RESULT_OK) {
    +      failf(data, "failed to parse trusted certificates from blob");
    +      rustls_root_cert_store_free(roots);
    +      rustls_client_config_free(
    +        rustls_client_config_builder_build(config_builder));
    +      return CURLE_SSL_CACERT_BADFILE;
    +    }
    +
    +    result = rustls_client_config_builder_use_roots(config_builder, roots);
    +    rustls_root_cert_store_free(roots);
    +    if(result != RUSTLS_RESULT_OK) {
    +      failf(data, "failed to load trusted certificates");
    +      rustls_client_config_free(
    +        rustls_client_config_builder_build(config_builder));
    +      return CURLE_SSL_CACERT_BADFILE;
    +    }
    +  }
       else if(ssl_cafile) {
         result = rustls_client_config_builder_load_roots_from_file(
           config_builder, ssl_cafile);
    @@ -341,7 +379,14 @@ cr_init_backend(struct Curl_easy *data, struct connectdata *conn,
     
       backend->config = rustls_client_config_builder_build(config_builder);
       DEBUGASSERT(rconn == NULL);
    -  result = rustls_client_connection_new(backend->config, hostname, &rconn);
    +  {
    +    char *snihost = Curl_ssl_snihost(data, hostname, NULL);
    +    if(!snihost) {
    +      failf(data, "Failed to set SNI");
    +      return CURLE_SSL_CONNECT_ERROR;
    +    }
    +    result = rustls_client_connection_new(backend->config, snihost, &rconn);
    +  }
       if(result != RUSTLS_RESULT_OK) {
         rustls_error(result, errorbuf, sizeof(errorbuf), &errorlen);
         failf(data, "rustls_client_connection_new: %.*s", errorlen, errorbuf);
    @@ -401,6 +446,8 @@ cr_connect_nonblocking(struct Curl_easy *data, struct connectdata *conn,
       curl_socket_t writefd;
       curl_socket_t readfd;
     
    +  DEBUGASSERT(backend);
    +
       if(ssl_connection_none == connssl->state) {
         result = cr_init_backend(data, conn, connssl->backend);
         if(result != CURLE_OK) {
    @@ -495,7 +542,10 @@ cr_getsock(struct connectdata *conn, curl_socket_t *socks)
       struct ssl_connect_data *const connssl = &conn->ssl[FIRSTSOCKET];
       curl_socket_t sockfd = conn->sock[FIRSTSOCKET];
       struct ssl_backend_data *const backend = connssl->backend;
    -  struct rustls_connection *rconn = backend->conn;
    +  struct rustls_connection *rconn = NULL;
    +
    +  DEBUGASSERT(backend);
    +  rconn = backend->conn;
     
       if(rustls_connection_wants_write(rconn)) {
         socks[0] = sockfd;
    @@ -514,6 +564,7 @@ cr_get_internals(struct ssl_connect_data *connssl,
                      CURLINFO info UNUSED_PARAM)
     {
       struct ssl_backend_data *backend = connssl->backend;
    +  DEBUGASSERT(backend);
       return &backend->conn;
     }
     
    @@ -526,6 +577,8 @@ cr_close(struct Curl_easy *data, struct connectdata *conn,
       CURLcode tmperr = CURLE_OK;
       ssize_t n = 0;
     
    +  DEBUGASSERT(backend);
    +
       if(backend->conn) {
         rustls_connection_send_close_notify(backend->conn);
         n = cr_send(data, sockindex, NULL, 0, &tmperr);
    @@ -550,7 +603,8 @@ static size_t cr_version(char *buffer, size_t size)
     
     const struct Curl_ssl Curl_ssl_rustls = {
       { CURLSSLBACKEND_RUSTLS, "rustls" },
    -  SSLSUPP_TLS13_CIPHERSUITES,      /* supports */
    +  SSLSUPP_CAINFO_BLOB |            /* supports */
    +  SSLSUPP_TLS13_CIPHERSUITES,
       sizeof(struct ssl_backend_data),
     
       Curl_none_init,                  /* init */
    diff --git a/vendor/curl/lib/vtls/schannel.c b/vendor/curl/lib/vtls/schannel.c
    index 0a8e60610d..04c8f3b6cf 100644
    --- a/vendor/curl/lib/vtls/schannel.c
    +++ b/vendor/curl/lib/vtls/schannel.c
    @@ -5,7 +5,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 2012 - 2021, Daniel Stenberg, , et al.
    + * Copyright (C) 2012 - 2022, Daniel Stenberg, , et al.
      * Copyright (C) 2012 - 2016, Marc Hoersken, 
      * Copyright (C) 2012, Mark Salisbury, 
      *
    @@ -325,13 +325,15 @@ get_alg_id_by_name(char *name)
       return 0;
     }
     
    +#define NUM_CIPHERS 47 /* There are 47 options listed above */
    +
     static CURLcode
     set_ssl_ciphers(SCHANNEL_CRED *schannel_cred, char *ciphers,
                     ALG_ID *algIds)
     {
       char *startCur = ciphers;
       int algCount = 0;
    -  while(startCur && (0 != *startCur) && (algCount < NUMOF_CIPHERS)) {
    +  while(startCur && (0 != *startCur) && (algCount < NUM_CIPHERS)) {
         long alg = strtol(startCur, 0, 0);
         if(!alg)
           alg = get_alg_id_by_name(startCur);
    @@ -418,11 +420,14 @@ schannel_acquire_credential_handle(struct Curl_easy *data,
     {
       struct ssl_connect_data *connssl = &conn->ssl[sockindex];
       SCHANNEL_CRED schannel_cred;
    +  ALG_ID algIds[NUM_CIPHERS];
       PCCERT_CONTEXT client_certs[1] = { NULL };
       SECURITY_STATUS sspi_status = SEC_E_OK;
       CURLcode result;
       struct ssl_backend_data *backend = connssl->backend;
     
    +  DEBUGASSERT(backend);
    +
       /* setup Schannel API options */
       memset(&schannel_cred, 0, sizeof(schannel_cred));
       schannel_cred.dwVersion = SCHANNEL_CRED_VERSION;
    @@ -502,7 +507,7 @@ schannel_acquire_credential_handle(struct Curl_easy *data,
     
       if(SSL_CONN_CONFIG(cipher_list)) {
         result = set_ssl_ciphers(&schannel_cred, SSL_CONN_CONFIG(cipher_list),
    -                             backend->algIds);
    +                             algIds);
         if(CURLE_OK != result) {
           failf(data, "Unable to set ciphers to passed via SSL_CONN_CONFIG");
           return result;
    @@ -765,11 +770,12 @@ schannel_connect_step1(struct Curl_easy *data, struct connectdata *conn,
     #ifdef ENABLE_IPV6
       struct in6_addr addr6;
     #endif
    -  TCHAR *host_name;
       CURLcode result;
       char * const hostname = SSL_HOST_NAME();
       struct ssl_backend_data *backend = connssl->backend;
     
    +  DEBUGASSERT(backend);
    +
       DEBUGF(infof(data,
                    "schannel: SSL/TLS connection with %s port %hu (step 1/3)",
                    hostname, conn->remote_port));
    @@ -846,10 +852,21 @@ schannel_connect_step1(struct Curl_easy *data, struct connectdata *conn,
       }
     
       if(!backend->cred) {
    +    char *snihost;
         result = schannel_acquire_credential_handle(data, conn, sockindex);
         if(result != CURLE_OK) {
           return result;
         }
    +    /* A hostname associated with the credential is needed by
    +       InitializeSecurityContext for SNI and other reasons. */
    +    snihost = Curl_ssl_snihost(data, SSL_HOST_NAME(), NULL);
    +    if(!snihost) {
    +      failf(data, "Failed to set SNI");
    +      return CURLE_SSL_CONNECT_ERROR;
    +    }
    +    backend->cred->sni_hostname = curlx_convert_UTF8_to_tchar(snihost);
    +    if(!backend->cred->sni_hostname)
    +      return CURLE_OUT_OF_MEMORY;
       }
     
       /* Warn if SNI is disabled due to use of an IP address */
    @@ -936,10 +953,6 @@ schannel_connect_step1(struct Curl_easy *data, struct connectdata *conn,
         return CURLE_OUT_OF_MEMORY;
       }
     
    -  host_name = curlx_convert_UTF8_to_tchar(hostname);
    -  if(!host_name)
    -    return CURLE_OUT_OF_MEMORY;
    -
       /* Schannel InitializeSecurityContext:
          https://msdn.microsoft.com/en-us/library/windows/desktop/aa375924.aspx
     
    @@ -948,13 +961,12 @@ schannel_connect_step1(struct Curl_easy *data, struct connectdata *conn,
          us problems with inbuf regardless. https://github.com/curl/curl/issues/983
       */
       sspi_status = s_pSecFn->InitializeSecurityContext(
    -    &backend->cred->cred_handle, NULL, host_name, backend->req_flags, 0, 0,
    +    &backend->cred->cred_handle, NULL, backend->cred->sni_hostname,
    +    backend->req_flags, 0, 0,
         (backend->use_alpn ? &inbuf_desc : NULL),
         0, &backend->ctxt->ctxt_handle,
         &outbuf_desc, &backend->ret_flags, &backend->ctxt->time_stamp);
     
    -  curlx_unicodefree(host_name);
    -
       if(sspi_status != SEC_I_CONTINUE_NEEDED) {
         char buffer[STRERROR_LEN];
         Curl_safefree(backend->ctxt);
    @@ -1027,15 +1039,16 @@ schannel_connect_step2(struct Curl_easy *data, struct connectdata *conn,
       SECURITY_STATUS sspi_status = SEC_E_OK;
       CURLcode result;
       bool doread;
    -  char * const hostname = SSL_HOST_NAME();
       const char *pubkey_ptr;
       struct ssl_backend_data *backend = connssl->backend;
     
    +  DEBUGASSERT(backend);
    +
       doread = (connssl->connecting_state != ssl_connect_2_writing) ? TRUE : FALSE;
     
       DEBUGF(infof(data,
                    "schannel: SSL/TLS connection with %s port %hu (step 2/3)",
    -               hostname, conn->remote_port));
    +               SSL_HOST_NAME(), conn->remote_port));
     
       if(!backend->cred || !backend->ctxt)
         return CURLE_SSL_CONNECT_ERROR;
    @@ -1083,7 +1096,6 @@ schannel_connect_step2(struct Curl_easy *data, struct connectdata *conn,
       }
     
       for(;;) {
    -    TCHAR *host_name;
         if(doread) {
           /* read encrypted handshake data from socket */
           result = Curl_read_plain(conn->sock[sockindex],
    @@ -1136,17 +1148,12 @@ schannel_connect_step2(struct Curl_easy *data, struct connectdata *conn,
         memcpy(inbuf[0].pvBuffer, backend->encdata_buffer,
                backend->encdata_offset);
     
    -    host_name = curlx_convert_UTF8_to_tchar(hostname);
    -    if(!host_name)
    -      return CURLE_OUT_OF_MEMORY;
    -
         sspi_status = s_pSecFn->InitializeSecurityContext(
           &backend->cred->cred_handle, &backend->ctxt->ctxt_handle,
    -      host_name, backend->req_flags, 0, 0, &inbuf_desc, 0, NULL,
    +      backend->cred->sni_hostname, backend->req_flags,
    +      0, 0, &inbuf_desc, 0, NULL,
           &outbuf_desc, &backend->ret_flags, &backend->ctxt->time_stamp);
     
    -    curlx_unicodefree(host_name);
    -
         /* free buffer for received handshake data */
         Curl_safefree(inbuf[0].pvBuffer);
     
    @@ -1370,6 +1377,7 @@ schannel_connect_step3(struct Curl_easy *data, struct connectdata *conn,
       struct ssl_backend_data *backend = connssl->backend;
     
       DEBUGASSERT(ssl_connect_3 == connssl->connecting_state);
    +  DEBUGASSERT(backend);
     
       DEBUGF(infof(data,
                    "schannel: SSL/TLS connection with %s port %hu (step 3/3)",
    @@ -1610,6 +1618,7 @@ schannel_connect_common(struct Curl_easy *data, struct connectdata *conn,
          */
         {
           struct ssl_backend_data *backend = connssl->backend;
    +      DEBUGASSERT(backend);
           conn->sslContext = &backend->ctxt->ctxt_handle;
         }
     #endif
    @@ -1640,6 +1649,8 @@ schannel_send(struct Curl_easy *data, int sockindex,
       CURLcode result;
       struct ssl_backend_data *backend = connssl->backend;
     
    +  DEBUGASSERT(backend);
    +
       /* check if the maximum stream sizes were queried */
       if(backend->stream_sizes.cbMaximumMessage == 0) {
         sspi_status = s_pSecFn->QueryContextAttributes(
    @@ -1788,6 +1799,8 @@ schannel_recv(struct Curl_easy *data, int sockindex,
       size_t min_encdata_length = len + CURL_SCHANNEL_BUFFER_FREE_SIZE;
       struct ssl_backend_data *backend = connssl->backend;
     
    +  DEBUGASSERT(backend);
    +
       /****************************************************************************
        * Don't return or set backend->recv_unrecoverable_err unless in the cleanup.
        * The pattern for return error is set *err, optional infof, goto cleanup.
    @@ -2122,6 +2135,8 @@ static bool schannel_data_pending(const struct connectdata *conn,
       const struct ssl_connect_data *connssl = &conn->ssl[sockindex];
       struct ssl_backend_data *backend = connssl->backend;
     
    +  DEBUGASSERT(backend);
    +
       if(connssl->use) /* SSL/TLS is in use */
         return (backend->decdata_offset > 0 ||
                 (backend->encdata_offset > 0 && !backend->encdata_is_incomplete));
    @@ -2138,6 +2153,7 @@ static void schannel_session_free(void *ptr)
         cred->refcount--;
         if(cred->refcount == 0) {
           s_pSecFn->FreeCredentialsHandle(&cred->cred_handle);
    +      curlx_unicodefree(cred->sni_hostname);
           Curl_safefree(cred);
         }
       }
    @@ -2157,6 +2173,7 @@ static int schannel_shutdown(struct Curl_easy *data, struct connectdata *conn,
       struct ssl_backend_data *backend = connssl->backend;
     
       DEBUGASSERT(data);
    +  DEBUGASSERT(backend);
     
       if(connssl->use) {
         infof(data, "schannel: shutting down SSL/TLS connection with %s port %hu",
    @@ -2170,7 +2187,6 @@ static int schannel_shutdown(struct Curl_easy *data, struct connectdata *conn,
         SecBuffer outbuf;
         SecBufferDesc outbuf_desc;
         CURLcode result;
    -    TCHAR *host_name;
         DWORD dwshut = SCHANNEL_SHUTDOWN;
     
         InitSecBuffer(&Buffer, SECBUFFER_TOKEN, &dwshut, sizeof(dwshut));
    @@ -2185,10 +2201,6 @@ static int schannel_shutdown(struct Curl_easy *data, struct connectdata *conn,
                 Curl_sspi_strerror(sspi_status, buffer, sizeof(buffer)));
         }
     
    -    host_name = curlx_convert_UTF8_to_tchar(hostname);
    -    if(!host_name)
    -      return CURLE_OUT_OF_MEMORY;
    -
         /* setup output buffer */
         InitSecBuffer(&outbuf, SECBUFFER_EMPTY, NULL, 0);
         InitSecBufferDesc(&outbuf_desc, &outbuf, 1);
    @@ -2196,7 +2208,7 @@ static int schannel_shutdown(struct Curl_easy *data, struct connectdata *conn,
         sspi_status = s_pSecFn->InitializeSecurityContext(
           &backend->cred->cred_handle,
           &backend->ctxt->ctxt_handle,
    -      host_name,
    +      backend->cred->sni_hostname,
           backend->req_flags,
           0,
           0,
    @@ -2207,8 +2219,6 @@ static int schannel_shutdown(struct Curl_easy *data, struct connectdata *conn,
           &backend->ret_flags,
           &backend->ctxt->time_stamp);
     
    -    curlx_unicodefree(host_name);
    -
         if((sspi_status == SEC_E_OK) || (sspi_status == SEC_I_CONTEXT_EXPIRED)) {
           /* send close message which is in output buffer */
           ssize_t written;
    @@ -2314,6 +2324,8 @@ static CURLcode pkp_pin_peer_pubkey(struct Curl_easy *data,
       /* Result is returned to caller */
       CURLcode result = CURLE_SSL_PINNEDPUBKEYNOTMATCH;
     
    +  DEBUGASSERT(backend);
    +
       /* if a path wasn't specified, don't pin */
       if(!pinnedpubkey)
         return CURLE_OK;
    @@ -2434,6 +2446,7 @@ static void *schannel_get_internals(struct ssl_connect_data *connssl,
     {
       struct ssl_backend_data *backend = connssl->backend;
       (void)info;
    +  DEBUGASSERT(backend);
       return &backend->ctxt->ctxt_handle;
     }
     
    diff --git a/vendor/curl/lib/vtls/schannel.h b/vendor/curl/lib/vtls/schannel.h
    index 77853aa30f..da60702771 100644
    --- a/vendor/curl/lib/vtls/schannel.h
    +++ b/vendor/curl/lib/vtls/schannel.h
    @@ -8,7 +8,7 @@
      *                             \___|\___/|_| \_\_____|
      *
      * Copyright (C) 2012, Marc Hoersken, , et al.
    - * Copyright (C) 2012 - 2021, Daniel Stenberg, , et al.
    + * Copyright (C) 2012 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -71,11 +71,10 @@ CURLcode Curl_verify_certificate(struct Curl_easy *data,
     #endif
     #endif
     
    -#define NUMOF_CIPHERS 45 /* There are 45 listed in the MS headers */
    -
     struct Curl_schannel_cred {
       CredHandle cred_handle;
       TimeStamp time_stamp;
    +  TCHAR *sni_hostname;
       int refcount;
     };
     
    @@ -104,7 +103,6 @@ struct ssl_backend_data {
     #ifdef HAS_MANUAL_VERIFY_API
       bool use_manual_cred_validation; /* true if manual cred validation is used */
     #endif
    -  ALG_ID algIds[NUMOF_CIPHERS];
     };
     #endif /* EXPOSE_SCHANNEL_INTERNAL_STRUCTS */
     
    diff --git a/vendor/curl/lib/vtls/schannel_verify.c b/vendor/curl/lib/vtls/schannel_verify.c
    index 4966cd4945..202a814cd9 100644
    --- a/vendor/curl/lib/vtls/schannel_verify.c
    +++ b/vendor/curl/lib/vtls/schannel_verify.c
    @@ -7,7 +7,7 @@
      *
      * Copyright (C) 2012 - 2016, Marc Hoersken, 
      * Copyright (C) 2012, Mark Salisbury, 
    - * Copyright (C) 2012 - 2021, Daniel Stenberg, , et al.
    + * Copyright (C) 2012 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -465,6 +465,7 @@ static CURLcode verify_host(struct Curl_easy *data,
       CURLcode result = CURLE_PEER_FAILED_VERIFICATION;
       TCHAR *cert_hostname_buff = NULL;
       size_t cert_hostname_buff_index = 0;
    +  size_t hostlen = strlen(conn_hostname);
       DWORD len = 0;
       DWORD actual_len = 0;
     
    @@ -520,10 +521,8 @@ static CURLcode verify_host(struct Curl_easy *data,
           result = CURLE_OUT_OF_MEMORY;
         }
         else {
    -      int match_result;
    -
    -      match_result = Curl_cert_hostcheck(cert_hostname, conn_hostname);
    -      if(match_result == CURL_HOST_MATCH) {
    +      if(Curl_cert_hostcheck(cert_hostname, strlen(cert_hostname),
    +                             conn_hostname, hostlen)) {
             infof(data,
                   "schannel: connection hostname (%s) validated "
                   "against certificate name (%s)",
    @@ -577,6 +576,8 @@ CURLcode Curl_verify_certificate(struct Curl_easy *data,
       HCERTSTORE trust_store = NULL;
       const char * const conn_hostname = SSL_HOST_NAME();
     
    +  DEBUGASSERT(BACKEND);
    +
       sspi_status =
         s_pSecFn->QueryContextAttributes(&BACKEND->ctxt->ctxt_handle,
                                          SECPKG_ATTR_REMOTE_CERT_CONTEXT,
    diff --git a/vendor/curl/lib/vtls/sectransp.c b/vendor/curl/lib/vtls/sectransp.c
    index f7a20b20b1..b2e1727278 100644
    --- a/vendor/curl/lib/vtls/sectransp.c
    +++ b/vendor/curl/lib/vtls/sectransp.c
    @@ -5,7 +5,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 2012 - 2021, Daniel Stenberg, , et al.
    + * Copyright (C) 2012 - 2022, Daniel Stenberg, , et al.
      * Copyright (C) 2012 - 2017, Nick Zitzmann, .
      *
      * This software is licensed as described in the file COPYING, which
    @@ -603,7 +603,7 @@ const static struct st_cipher ciphertable[] = {
                  CIPHER_WEAK_RC_ENCRYPTION),
       CIPHER_DEF(TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA,                 /* 0xC003 */
                  "ECDH-ECDSA-DES-CBC3-SHA",
    -             CIPHER_STRONG_ENOUGH),
    +             CIPHER_WEAK_3DES_ENCRYPTION),
       CIPHER_DEF(TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA,                  /* 0xC004 */
                  "ECDH-ECDSA-AES128-SHA",
                  CIPHER_STRONG_ENOUGH),
    @@ -837,12 +837,14 @@ static OSStatus SocketRead(SSLConnectionRef connection,
       /*int sock = *(int *)connection;*/
       struct ssl_connect_data *connssl = (struct ssl_connect_data *)connection;
       struct ssl_backend_data *backend = connssl->backend;
    -  int sock = backend->ssl_sockfd;
    +  int sock;
       OSStatus rtn = noErr;
       size_t bytesRead;
       ssize_t rrtn;
       int theErr;
     
    +  DEBUGASSERT(backend);
    +  sock = backend->ssl_sockfd;
       *dataLength = 0;
     
       for(;;) {
    @@ -898,13 +900,15 @@ static OSStatus SocketWrite(SSLConnectionRef connection,
       /*int sock = *(int *)connection;*/
       struct ssl_connect_data *connssl = (struct ssl_connect_data *)connection;
       struct ssl_backend_data *backend = connssl->backend;
    -  int sock = backend->ssl_sockfd;
    +  int sock;
       ssize_t length;
       size_t dataLen = *dataLength;
       const UInt8 *dataPtr = (UInt8 *)data;
       OSStatus ortn;
       int theErr;
     
    +  DEBUGASSERT(backend);
    +  sock = backend->ssl_sockfd;
       *dataLength = 0;
     
       do {
    @@ -1376,6 +1380,8 @@ set_ssl_version_min_max(struct Curl_easy *data, struct connectdata *conn,
       long ssl_version_max = SSL_CONN_CONFIG(version_max);
       long max_supported_version_by_os;
     
    +  DEBUGASSERT(backend);
    +
       /* macOS 10.5-10.7 supported TLS 1.0 only.
          macOS 10.8 and later, and iOS 5 and later, added TLS 1.1 and 1.2.
          macOS 10.13 and later, and iOS 11 and later, added TLS 1.3. */
    @@ -1684,6 +1690,8 @@ static CURLcode sectransp_connect_step1(struct Curl_easy *data,
     #if CURL_BUILD_MAC
       int darwinver_maj = 0, darwinver_min = 0;
     
    +  DEBUGASSERT(backend);
    +
       GetDarwinVersionNumber(&darwinver_maj, &darwinver_min);
     #endif /* CURL_BUILD_MAC */
     
    @@ -2028,8 +2036,13 @@ static CURLcode sectransp_connect_step1(struct Curl_easy *data,
        * Both hostname check and SNI require SSLSetPeerDomainName().
        * Also: the verifyhost setting influences SNI usage */
       if(conn->ssl_config.verifyhost) {
    -    err = SSLSetPeerDomainName(backend->ssl_ctx, hostname,
    -    strlen(hostname));
    +    size_t snilen;
    +    char *snihost = Curl_ssl_snihost(data, hostname, &snilen);
    +    if(!snihost) {
    +      failf(data, "Failed to set SNI");
    +      return CURLE_SSL_CONNECT_ERROR;
    +    }
    +    err = SSLSetPeerDomainName(backend->ssl_ctx, snihost, snilen);
     
         if(err != noErr) {
           infof(data, "WARNING: SSL: SSLSetPeerDomainName() failed: OSStatus %d",
    @@ -2542,6 +2555,7 @@ sectransp_connect_step2(struct Curl_easy *data, struct connectdata *conn,
       DEBUGASSERT(ssl_connect_2 == connssl->connecting_state
                   || ssl_connect_2_reading == connssl->connecting_state
                   || ssl_connect_2_writing == connssl->connecting_state);
    +  DEBUGASSERT(backend);
     
       /* Here goes nothing: */
       err = SSLHandshake(backend->ssl_ctx);
    @@ -2918,6 +2932,8 @@ collect_server_cert(struct Curl_easy *data,
       CFIndex i, count;
       SecTrustRef trust = NULL;
     
    +  DEBUGASSERT(backend);
    +
       if(!show_verbose_server_cert && !data->set.ssl.certinfo)
         return CURLE_OK;
     
    @@ -3162,6 +3178,8 @@ static void sectransp_close(struct Curl_easy *data, struct connectdata *conn,
     
       (void) data;
     
    +  DEBUGASSERT(backend);
    +
       if(backend->ssl_ctx) {
         (void)SSLClose(backend->ssl_ctx);
     #if CURL_BUILD_MAC_10_8 || CURL_BUILD_IOS
    @@ -3190,6 +3208,8 @@ static int sectransp_shutdown(struct Curl_easy *data,
       char buf[120];
       int loop = 10; /* avoid getting stuck */
     
    +  DEBUGASSERT(backend);
    +
       if(!backend->ssl_ctx)
         return 0;
     
    @@ -3269,6 +3289,8 @@ static int sectransp_check_cxn(struct connectdata *conn)
       OSStatus err;
       SSLSessionState state;
     
    +  DEBUGASSERT(backend);
    +
       if(backend->ssl_ctx) {
         err = SSLGetSessionState(backend->ssl_ctx, &state);
         if(err == noErr)
    @@ -3286,6 +3308,8 @@ static bool sectransp_data_pending(const struct connectdata *conn,
       OSStatus err;
       size_t buffer;
     
    +  DEBUGASSERT(backend);
    +
       if(backend->ssl_ctx) {  /* SSL is in use */
         err = SSLGetBufferedReadSize(backend->ssl_ctx, &buffer);
         if(err == noErr)
    @@ -3347,6 +3371,8 @@ static ssize_t sectransp_send(struct Curl_easy *data,
       size_t processed = 0UL;
       OSStatus err;
     
    +  DEBUGASSERT(backend);
    +
       /* The SSLWrite() function works a little differently than expected. The
          fourth argument (processed) is currently documented in Apple's
          documentation as: "On return, the length, in bytes, of the data actually
    @@ -3414,6 +3440,8 @@ static ssize_t sectransp_recv(struct Curl_easy *data,
       size_t processed = 0UL;
       OSStatus err;
     
    +  DEBUGASSERT(backend);
    +
       again:
       err = SSLRead(backend->ssl_ctx, buf, buffersize, &processed);
     
    @@ -3463,6 +3491,7 @@ static void *sectransp_get_internals(struct ssl_connect_data *connssl,
     {
       struct ssl_backend_data *backend = connssl->backend;
       (void)info;
    +  DEBUGASSERT(backend);
       return backend->ssl_ctx;
     }
     
    diff --git a/vendor/curl/lib/vtls/vtls.c b/vendor/curl/lib/vtls/vtls.c
    index 6007bbba0f..03b85ba065 100644
    --- a/vendor/curl/lib/vtls/vtls.c
    +++ b/vendor/curl/lib/vtls/vtls.c
    @@ -5,7 +5,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2021, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -300,6 +300,8 @@ ssl_connect_init_proxy(struct connectdata *conn, int sockindex)
         pbdata = conn->proxy_ssl[sockindex].backend;
         conn->proxy_ssl[sockindex] = conn->ssl[sockindex];
     
    +    DEBUGASSERT(pbdata != NULL);
    +
         memset(&conn->ssl[sockindex], 0, sizeof(conn->ssl[sockindex]));
         memset(pbdata, 0, Curl_ssl->sizeof_ssl_backend_data);
     
    @@ -628,7 +630,8 @@ void Curl_ssl_associate_conn(struct Curl_easy *data,
     {
       if(Curl_ssl->associate_connection) {
         Curl_ssl->associate_connection(data, conn, FIRSTSOCKET);
    -    if(conn->sock[SECONDARYSOCKET] && conn->bits.sock_accepted)
    +    if((conn->sock[SECONDARYSOCKET] != CURL_SOCKET_BAD) &&
    +       conn->bits.sock_accepted)
           Curl_ssl->associate_connection(data, conn, SECONDARYSOCKET);
       }
     }
    @@ -638,7 +641,8 @@ void Curl_ssl_detach_conn(struct Curl_easy *data,
     {
       if(Curl_ssl->disassociate_connection) {
         Curl_ssl->disassociate_connection(data, FIRSTSOCKET);
    -    if(conn->sock[SECONDARYSOCKET] && conn->bits.sock_accepted)
    +    if((conn->sock[SECONDARYSOCKET] != CURL_SOCKET_BAD) &&
    +       conn->bits.sock_accepted)
           Curl_ssl->disassociate_connection(data, SECONDARYSOCKET);
       }
     }
    @@ -871,6 +875,32 @@ CURLcode Curl_ssl_random(struct Curl_easy *data,
       return Curl_ssl->random(data, entropy, length);
     }
     
    +/*
    + * Curl_ssl_snihost() converts the input host name to a suitable SNI name put
    + * in data->state.buffer. Returns a pointer to the name (or NULL if a problem)
    + * and stores the new length in 'olen'.
    + *
    + * SNI fields must not have any trailing dot and while RFC 6066 section 3 says
    + * the SNI field is case insensitive, browsers always send the data lowercase
    + * and subsequently there are numerous servers out there that don't work
    + * unless the name is lowercased.
    + */
    +
    +char *Curl_ssl_snihost(struct Curl_easy *data, const char *host, size_t *olen)
    +{
    +  size_t len = strlen(host);
    +  if(len && (host[len-1] == '.'))
    +    len--;
    +  if((long)len >= data->set.buffer_size)
    +    return NULL;
    +
    +  Curl_strntolower(data->state.buffer, host, len);
    +  data->state.buffer[len] = 0;
    +  if(olen)
    +    *olen = len;
    +  return data->state.buffer;
    +}
    +
     /*
      * Public key pem to der conversion
      */
    @@ -969,7 +999,7 @@ CURLcode Curl_pin_peer_pubkey(struct Curl_easy *data,
         if(encode != CURLE_OK)
           return encode;
     
    -    encode = Curl_base64_encode(data, (char *)sha256sumdigest,
    +    encode = Curl_base64_encode((char *)sha256sumdigest,
                                     CURL_SHA256_DIGEST_LENGTH, &encoded,
                                     &encodedlen);
         Curl_safefree(sha256sumdigest);
    @@ -1296,8 +1326,6 @@ const struct Curl_ssl *Curl_ssl =
       &Curl_ssl_openssl;
     #elif defined(USE_SCHANNEL)
       &Curl_ssl_schannel;
    -#elif defined(USE_MESALINK)
    -  &Curl_ssl_mesalink;
     #elif defined(USE_BEARSSL)
       &Curl_ssl_bearssl;
     #else
    @@ -1329,9 +1357,6 @@ static const struct Curl_ssl *available_backends[] = {
     #if defined(USE_SCHANNEL)
       &Curl_ssl_schannel,
     #endif
    -#if defined(USE_MESALINK)
    -  &Curl_ssl_mesalink,
    -#endif
     #if defined(USE_BEARSSL)
       &Curl_ssl_bearssl,
     #endif
    diff --git a/vendor/curl/lib/vtls/vtls.h b/vendor/curl/lib/vtls/vtls.h
    index c7bbba082d..af3b8d3c94 100644
    --- a/vendor/curl/lib/vtls/vtls.h
    +++ b/vendor/curl/lib/vtls/vtls.h
    @@ -7,7 +7,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2021, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -85,7 +85,7 @@ struct Curl_ssl {
       CURLcode (*sha256sum)(const unsigned char *input, size_t inputlen,
                         unsigned char *sha256sum, size_t sha256sumlen);
     
    -  void (*associate_connection)(struct Curl_easy *data,
    +  bool (*associate_connection)(struct Curl_easy *data,
                                    struct connectdata *conn,
                                    int sockindex);
       void (*disassociate_connection)(struct Curl_easy *data, int sockindex);
    @@ -120,7 +120,6 @@ bool Curl_ssl_tls13_ciphersuites(void);
     #include "schannel.h"       /* Schannel SSPI version */
     #include "sectransp.h"      /* SecureTransport (Darwin) version */
     #include "mbedtls.h"        /* mbedTLS versions */
    -#include "mesalink.h"       /* MesaLink versions */
     #include "bearssl.h"        /* BearSSL versions */
     #include "rustls.h"         /* rustls versions */
     
    @@ -173,6 +172,7 @@ bool Curl_ssl_tls13_ciphersuites(void);
       data->set.str[STRING_SSL_PINNEDPUBLICKEY]
     #endif
     
    +char *Curl_ssl_snihost(struct Curl_easy *data, const char *host, size_t *olen);
     bool Curl_ssl_config_matches(struct ssl_primary_config *data,
                                  struct ssl_primary_config *needle);
     bool Curl_clone_primary_ssl_config(struct ssl_primary_config *source,
    diff --git a/vendor/curl/lib/vtls/wolfssl.c b/vendor/curl/lib/vtls/wolfssl.c
    index 8c5b9157b8..eae5568309 100644
    --- a/vendor/curl/lib/vtls/wolfssl.c
    +++ b/vendor/curl/lib/vtls/wolfssl.c
    @@ -5,7 +5,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2021, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -263,6 +263,8 @@ wolfssl_connect_step1(struct Curl_easy *data, struct connectdata *conn,
     #define use_sni(x)  Curl_nop_stmt
     #endif
     
    +  DEBUGASSERT(backend);
    +
       if(connssl->state == ssl_connection_complete)
         return CURLE_OK;
     
    @@ -462,12 +464,17 @@ wolfssl_connect_step1(struct Curl_easy *data, struct connectdata *conn,
         if((hostname_len < USHRT_MAX) &&
            (0 == Curl_inet_pton(AF_INET, hostname, &addr4)) &&
     #ifdef ENABLE_IPV6
    -       (0 == Curl_inet_pton(AF_INET6, hostname, &addr6)) &&
    +       (0 == Curl_inet_pton(AF_INET6, hostname, &addr6))
     #endif
    -       (wolfSSL_CTX_UseSNI(backend->ctx, WOLFSSL_SNI_HOST_NAME, hostname,
    -                          (unsigned short)hostname_len) != 1)) {
    -      infof(data, "WARNING: failed to configure server name indication (SNI) "
    -            "TLS extension");
    +      ) {
    +      size_t snilen;
    +      char *snihost = Curl_ssl_snihost(data, hostname, &snilen);
    +      if(!snihost ||
    +         wolfSSL_CTX_UseSNI(backend->ctx, WOLFSSL_SNI_HOST_NAME, snihost,
    +                            (unsigned short)snilen) != 1) {
    +        failf(data, "Failed to set SNI");
    +        return CURLE_SSL_CONNECT_ERROR;
    +      }
         }
       }
     #endif
    @@ -590,10 +597,11 @@ wolfssl_connect_step2(struct Curl_easy *data, struct connectdata *conn,
       int ret = -1;
       struct ssl_connect_data *connssl = &conn->ssl[sockindex];
       struct ssl_backend_data *backend = connssl->backend;
    -  const char * const hostname = SSL_HOST_NAME();
       const char * const dispname = SSL_HOST_DISPNAME();
       const char * const pinnedpubkey = SSL_PINNED_PUB_KEY();
     
    +  DEBUGASSERT(backend);
    +
       ERR_clear_error();
     
       conn->recv[sockindex] = wolfssl_recv;
    @@ -601,9 +609,10 @@ wolfssl_connect_step2(struct Curl_easy *data, struct connectdata *conn,
     
       /* Enable RFC2818 checks */
       if(SSL_CONN_CONFIG(verifyhost)) {
    -    ret = wolfSSL_check_domain_name(backend->handle, hostname);
    -    if(ret == SSL_FAILURE)
    -      return CURLE_OUT_OF_MEMORY;
    +    char *snihost = Curl_ssl_snihost(data, SSL_HOST_NAME(), NULL);
    +    if(!snihost ||
    +       (wolfSSL_check_domain_name(backend->handle, snihost) == SSL_FAILURE))
    +      return CURLE_SSL_CONNECT_ERROR;
       }
     
       ret = SSL_connect(backend->handle);
    @@ -797,6 +806,7 @@ wolfssl_connect_step3(struct Curl_easy *data, struct connectdata *conn,
       struct ssl_backend_data *backend = connssl->backend;
     
       DEBUGASSERT(ssl_connect_3 == connssl->connecting_state);
    +  DEBUGASSERT(backend);
     
       if(SSL_SET_OPTION(primary.sessionid)) {
         bool incache;
    @@ -848,6 +858,8 @@ static ssize_t wolfssl_send(struct Curl_easy *data,
       int memlen = (len > (size_t)INT_MAX) ? INT_MAX : (int)len;
       int rc;
     
    +  DEBUGASSERT(backend);
    +
       ERR_clear_error();
     
       rc = SSL_write(backend->handle, mem, memlen);
    @@ -880,6 +892,8 @@ static void wolfssl_close(struct Curl_easy *data, struct connectdata *conn,
     
       (void) data;
     
    +  DEBUGASSERT(backend);
    +
       if(backend->handle) {
         char buf[32];
         /* Maybe the server has already sent a close notify alert.
    @@ -908,17 +922,22 @@ static ssize_t wolfssl_recv(struct Curl_easy *data,
       int buffsize = (buffersize > (size_t)INT_MAX) ? INT_MAX : (int)buffersize;
       int nread;
     
    +  DEBUGASSERT(backend);
    +
       ERR_clear_error();
     
       nread = SSL_read(backend->handle, buf, buffsize);
     
    -  if(nread < 0) {
    +  if(nread <= 0) {
         int err = SSL_get_error(backend->handle, nread);
     
         switch(err) {
         case SSL_ERROR_ZERO_RETURN: /* no more data */
           break;
    +    case SSL_ERROR_NONE:
    +      /* FALLTHROUGH */
         case SSL_ERROR_WANT_READ:
    +      /* FALLTHROUGH */
         case SSL_ERROR_WANT_WRITE:
           /* there's data pending, re-invoke SSL_read() */
           *curlcode = CURLE_AGAIN;
    @@ -974,6 +993,7 @@ static bool wolfssl_data_pending(const struct connectdata *conn,
     {
       const struct ssl_connect_data *connssl = &conn->ssl[connindex];
       struct ssl_backend_data *backend = connssl->backend;
    +  DEBUGASSERT(backend);
       if(backend->handle)   /* SSL is in use */
         return (0 != SSL_pending(backend->handle)) ? TRUE : FALSE;
       else
    @@ -994,6 +1014,8 @@ static int wolfssl_shutdown(struct Curl_easy *data, struct connectdata *conn,
     
       (void) data;
     
    +  DEBUGASSERT(backend);
    +
       if(backend->handle) {
         ERR_clear_error();
         SSL_free(backend->handle);
    @@ -1173,6 +1195,7 @@ static void *wolfssl_get_internals(struct ssl_connect_data *connssl,
     {
       struct ssl_backend_data *backend = connssl->backend;
       (void)info;
    +  DEBUGASSERT(backend);
       return backend->handle;
     }
     
    diff --git a/vendor/curl/lib/x509asn1.c b/vendor/curl/lib/vtls/x509asn1.c
    similarity index 92%
    rename from vendor/curl/lib/x509asn1.c
    rename to vendor/curl/lib/vtls/x509asn1.c
    index 0341543a2b..f64acb83c9 100644
    --- a/vendor/curl/lib/x509asn1.c
    +++ b/vendor/curl/lib/vtls/x509asn1.c
    @@ -5,7 +5,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2021, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -22,8 +22,23 @@
     
     #include "curl_setup.h"
     
    -#if defined(USE_GSKIT) || defined(USE_NSS) || defined(USE_GNUTLS) || \
    -    defined(USE_WOLFSSL) || defined(USE_SCHANNEL) || defined(USE_SECTRANSP)
    +#if defined(USE_GSKIT) || defined(USE_NSS) || defined(USE_GNUTLS) ||    \
    +  defined(USE_WOLFSSL) || defined(USE_SCHANNEL) || defined(USE_SECTRANSP)
    +
    +#if defined(USE_GSKIT) || defined(USE_WOLFSSL) || defined(USE_SCHANNEL)
    +#define WANT_PARSEX509 /* uses Curl_parseX509() */
    +#endif
    +
    +#if defined(USE_GSKIT) || defined(USE_NSS) || defined(USE_GNUTLS) ||    \
    +  defined(USE_SCHANNEL) || defined(USE_SECTRANSP)
    +#define WANT_EXTRACT_CERTINFO /* uses Curl_extract_certinfo() */
    +#define WANT_PARSEX509 /* ... uses Curl_parseX509() */
    +#endif
    +
    +#if defined(USE_GSKIT)
    +#define WANT_VERIFYHOST /* uses Curl_verifyhost () */
    +#define WANT_PARSEX509 /* ... uses Curl_parseX509() */
    +#endif
     
     #include 
     #include "urldata.h"
    @@ -41,6 +56,56 @@
     #include "curl_memory.h"
     #include "memdebug.h"
     
    +/*
    + * Constants.
    + */
    +
    +/* Largest supported ASN.1 structure. */
    +#define CURL_ASN1_MAX                   ((size_t) 0x40000)      /* 256K */
    +
    +/* ASN.1 classes. */
    +#define CURL_ASN1_UNIVERSAL             0
    +#define CURL_ASN1_APPLICATION           1
    +#define CURL_ASN1_CONTEXT_SPECIFIC      2
    +#define CURL_ASN1_PRIVATE               3
    +
    +/* ASN.1 types. */
    +#define CURL_ASN1_BOOLEAN               1
    +#define CURL_ASN1_INTEGER               2
    +#define CURL_ASN1_BIT_STRING            3
    +#define CURL_ASN1_OCTET_STRING          4
    +#define CURL_ASN1_NULL                  5
    +#define CURL_ASN1_OBJECT_IDENTIFIER     6
    +#define CURL_ASN1_OBJECT_DESCRIPTOR     7
    +#define CURL_ASN1_INSTANCE_OF           8
    +#define CURL_ASN1_REAL                  9
    +#define CURL_ASN1_ENUMERATED            10
    +#define CURL_ASN1_EMBEDDED              11
    +#define CURL_ASN1_UTF8_STRING           12
    +#define CURL_ASN1_RELATIVE_OID          13
    +#define CURL_ASN1_SEQUENCE              16
    +#define CURL_ASN1_SET                   17
    +#define CURL_ASN1_NUMERIC_STRING        18
    +#define CURL_ASN1_PRINTABLE_STRING      19
    +#define CURL_ASN1_TELETEX_STRING        20
    +#define CURL_ASN1_VIDEOTEX_STRING       21
    +#define CURL_ASN1_IA5_STRING            22
    +#define CURL_ASN1_UTC_TIME              23
    +#define CURL_ASN1_GENERALIZED_TIME      24
    +#define CURL_ASN1_GRAPHIC_STRING        25
    +#define CURL_ASN1_VISIBLE_STRING        26
    +#define CURL_ASN1_GENERAL_STRING        27
    +#define CURL_ASN1_UNIVERSAL_STRING      28
    +#define CURL_ASN1_CHARACTER_STRING      29
    +#define CURL_ASN1_BMP_STRING            30
    +
    +#ifdef WANT_EXTRACT_CERTINFO
    +/* ASN.1 OID table entry. */
    +struct Curl_OID {
    +  const char *numoid;  /* Dotted-numeric OID. */
    +  const char *textoid; /* OID name. */
    +};
    +
     /* ASN.1 OIDs. */
     static const char       cnOID[] = "2.5.4.3";    /* Common name. */
     static const char       sanOID[] = "2.5.29.17"; /* Subject alternative name. */
    @@ -95,6 +160,8 @@ static const struct Curl_OID OIDtable[] = {
       { (const char *) NULL,        (const char *) NULL }
     };
     
    +#endif /* WANT_EXTRACT_CERTINFO */
    +
     /*
      * Lightweight ASN.1 parser.
      * In particular, it does not check for syntactic/lexical errors.
    @@ -173,6 +240,8 @@ static const char *getASN1Element(struct Curl_asn1Element *elem,
       return elem->end;
     }
     
    +#ifdef WANT_EXTRACT_CERTINFO
    +
     /*
      * Search the null terminated OID or OID identifier in local table.
      * Return the table entry pointer or NULL if not found.
    @@ -683,28 +752,9 @@ static ssize_t encodeDN(char *buf, size_t buflen, struct Curl_asn1Element *dn)
       return l;
     }
     
    -/*
    - * Convert an ASN.1 distinguished name into a printable string.
    - * Return the dynamically allocated string, or NULL if an error occurs.
    - */
    -static const char *DNtostr(struct Curl_asn1Element *dn)
    -{
    -  char *buf = NULL;
    -  ssize_t buflen = encodeDN(NULL, 0, dn);
    -
    -  if(buflen >= 0) {
    -    buf = malloc(buflen + 1);
    -    if(buf) {
    -      if(encodeDN(buf, buflen + 1, dn) == -1) {
    -        free(buf);
    -        return NULL;
    -      }
    -      buf[buflen] = '\0';
    -    }
    -  }
    -  return buf;
    -}
    +#endif /* WANT_EXTRACT_CERTINFO */
     
    +#ifdef WANT_PARSEX509
     /*
      * ASN.1 parse an X509 certificate into structure subfields.
      * Syntax is assumed to have already been checked by the SSL backend.
    @@ -824,6 +874,9 @@ int Curl_parseX509(struct Curl_X509certificate *cert,
       return 0;
     }
     
    +#endif /* WANT_PARSEX509 */
    +
    +#ifdef WANT_EXTRACT_CERTINFO
     
     /*
      * Copy at most 64-characters, terminate with a newline and returns the
    @@ -969,6 +1022,28 @@ static int do_pubkey(struct Curl_easy *data, int certnum,
       return 0;
     }
     
    +/*
    + * Convert an ASN.1 distinguished name into a printable string.
    + * Return the dynamically allocated string, or NULL if an error occurs.
    + */
    +static const char *DNtostr(struct Curl_asn1Element *dn)
    +{
    +  char *buf = NULL;
    +  ssize_t buflen = encodeDN(NULL, 0, dn);
    +
    +  if(buflen >= 0) {
    +    buf = malloc(buflen + 1);
    +    if(buf) {
    +      if(encodeDN(buf, buflen + 1, dn) == -1) {
    +        free(buf);
    +        return NULL;
    +      }
    +      buf[buflen] = '\0';
    +    }
    +  }
    +  return buf;
    +}
    +
     CURLcode Curl_extract_certinfo(struct Curl_easy *data,
                                    int certnum,
                                    const char *beg,
    @@ -1119,7 +1194,7 @@ CURLcode Curl_extract_certinfo(struct Curl_easy *data,
         return result;
     
       /* Generate PEM certificate. */
    -  result = Curl_base64_encode(data, cert.certificate.beg,
    +  result = Curl_base64_encode(cert.certificate.beg,
                                   cert.certificate.end - cert.certificate.beg,
                                   &cp1, &cl1);
       if(result)
    @@ -1153,10 +1228,12 @@ CURLcode Curl_extract_certinfo(struct Curl_easy *data,
       return result;
     }
     
    +#endif /* WANT_EXTRACT_CERTINFO */
    +
     #endif /* USE_GSKIT or USE_NSS or USE_GNUTLS or USE_WOLFSSL or USE_SCHANNEL
             * or USE_SECTRANSP */
     
    -#if defined(USE_GSKIT)
    +#ifdef WANT_VERIFYHOST
     
     static const char *checkOID(const char *beg, const char *end,
                                 const char *oid)
    @@ -1198,6 +1275,7 @@ CURLcode Curl_verifyhost(struct Curl_easy *data, struct connectdata *conn,
       ssize_t len;
       const char * const hostname = SSL_HOST_NAME();
       const char * const dispname = SSL_HOST_DISPNAME();
    +  size_t hostlen = strlen(hostname);
     #ifdef ENABLE_IPV6
       struct in6_addr addr;
     #else
    @@ -1253,7 +1331,8 @@ CURLcode Curl_verifyhost(struct Curl_easy *data, struct connectdata *conn,
               len = utf8asn1str(&dnsname, CURL_ASN1_IA5_STRING,
                                 name.beg, name.end);
               if(len > 0 && (size_t)len == strlen(dnsname))
    -            matched = Curl_cert_hostcheck(dnsname, hostname);
    +            matched = Curl_cert_hostcheck(dnsname,
    +                                          (size_t)len, hostname, hostlen);
               else
                 matched = 0;
               free(dnsname);
    @@ -1312,7 +1391,8 @@ CURLcode Curl_verifyhost(struct Curl_easy *data, struct connectdata *conn,
         }
         if(strlen(dnsname) != (size_t) len)         /* Nul byte in string ? */
           failf(data, "SSL: illegal cert name field");
    -    else if(Curl_cert_hostcheck((const char *) dnsname, hostname)) {
    +    else if(Curl_cert_hostcheck((const char *) dnsname,
    +                                len, hostname, hostlen)) {
           infof(data, "  common name: %s (matched)", dnsname);
           free(dnsname);
           return CURLE_OK;
    @@ -1326,4 +1406,4 @@ CURLcode Curl_verifyhost(struct Curl_easy *data, struct connectdata *conn,
       return CURLE_PEER_FAILED_VERIFICATION;
     }
     
    -#endif /* USE_GSKIT */
    +#endif /* WANT_VERIFYHOST */
    diff --git a/vendor/curl/lib/x509asn1.h b/vendor/curl/lib/vtls/x509asn1.h
    similarity index 58%
    rename from vendor/curl/lib/x509asn1.h
    rename to vendor/curl/lib/vtls/x509asn1.h
    index 3b51eeef8d..db7df0ef12 100644
    --- a/vendor/curl/lib/x509asn1.h
    +++ b/vendor/curl/lib/vtls/x509asn1.h
    @@ -8,7 +8,7 @@
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
    - * Copyright (C) 1998 - 2021, Daniel Stenberg, , et al.
    + * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
    @@ -30,50 +30,6 @@
     
     #include "urldata.h"
     
    -/*
    - * Constants.
    - */
    -
    -/* Largest supported ASN.1 structure. */
    -#define CURL_ASN1_MAX                   ((size_t) 0x40000)      /* 256K */
    -
    -/* ASN.1 classes. */
    -#define CURL_ASN1_UNIVERSAL             0
    -#define CURL_ASN1_APPLICATION           1
    -#define CURL_ASN1_CONTEXT_SPECIFIC      2
    -#define CURL_ASN1_PRIVATE               3
    -
    -/* ASN.1 types. */
    -#define CURL_ASN1_BOOLEAN               1
    -#define CURL_ASN1_INTEGER               2
    -#define CURL_ASN1_BIT_STRING            3
    -#define CURL_ASN1_OCTET_STRING          4
    -#define CURL_ASN1_NULL                  5
    -#define CURL_ASN1_OBJECT_IDENTIFIER     6
    -#define CURL_ASN1_OBJECT_DESCRIPTOR     7
    -#define CURL_ASN1_INSTANCE_OF           8
    -#define CURL_ASN1_REAL                  9
    -#define CURL_ASN1_ENUMERATED            10
    -#define CURL_ASN1_EMBEDDED              11
    -#define CURL_ASN1_UTF8_STRING           12
    -#define CURL_ASN1_RELATIVE_OID          13
    -#define CURL_ASN1_SEQUENCE              16
    -#define CURL_ASN1_SET                   17
    -#define CURL_ASN1_NUMERIC_STRING        18
    -#define CURL_ASN1_PRINTABLE_STRING      19
    -#define CURL_ASN1_TELETEX_STRING        20
    -#define CURL_ASN1_VIDEOTEX_STRING       21
    -#define CURL_ASN1_IA5_STRING            22
    -#define CURL_ASN1_UTC_TIME              23
    -#define CURL_ASN1_GENERALIZED_TIME      24
    -#define CURL_ASN1_GRAPHIC_STRING        25
    -#define CURL_ASN1_VISIBLE_STRING        26
    -#define CURL_ASN1_GENERAL_STRING        27
    -#define CURL_ASN1_UNIVERSAL_STRING      28
    -#define CURL_ASN1_CHARACTER_STRING      29
    -#define CURL_ASN1_BMP_STRING            30
    -
    -
     /*
      * Types.
      */
    @@ -88,14 +44,6 @@ struct Curl_asn1Element {
       bool          constructed;  /* Element is constructed. */
     };
     
    -
    -/* ASN.1 OID table entry. */
    -struct Curl_OID {
    -  const char *numoid;  /* Dotted-numeric OID. */
    -  const char *textoid; /* OID name. */
    -};
    -
    -
     /* X509 certificate: RFC 5280. */
     struct Curl_X509certificate {
       struct Curl_asn1Element certificate;
    @@ -119,10 +67,6 @@ struct Curl_X509certificate {
      * Prototypes.
      */
     
    -const char *Curl_getASN1Element(struct Curl_asn1Element *elem,
    -                                const char *beg, const char *end);
    -const char *Curl_ASN1tostr(struct Curl_asn1Element *elem, int type);
    -const char *Curl_DNtostr(struct Curl_asn1Element *dn);
     int Curl_parseX509(struct Curl_X509certificate *cert,
                        const char *beg, const char *end);
     CURLcode Curl_extract_certinfo(struct Curl_easy *data, int certnum,
    
    From 29f303860e5404aa98a2a69ca5a3b6e80eebd2df Mon Sep 17 00:00:00 2001
    From: Matheus Lima 
    Date: Fri, 8 Apr 2022 20:50:14 -0300
    Subject: [PATCH 41/49] Fix (#2558)
    
    Fixed issue #2545
    ---
     .../deathmatch/logic/CStaticFunctionDefinitions.cpp  | 12 ++++++++++--
     1 file changed, 10 insertions(+), 2 deletions(-)
    
    diff --git a/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp b/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp
    index 8b4c094b05..4355970c37 100644
    --- a/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp
    +++ b/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp
    @@ -766,8 +766,16 @@ bool CStaticFunctionDefinitions::IsElementInWater(CClientEntity& Entity, bool& b
             case CCLIENTPLAYER:
             {
                 CClientPed& Ped = static_cast(Entity);
    -            bInWater = Ped.IsInWater();
    -            break;
    +            if (Ped.GetOccupiedVehicle())
    +            {
    +                bInWater = Ped.GetOccupiedVehicle()->IsInWater();
    +                break;
    +            }
    +            else
    +            {
    +                bInWater = Ped.IsInWater();
    +                break;
    +            }
             }
             case CCLIENTVEHICLE:
             {
    
    From 5cc419ca173301b03db15b0ae122fe970e96c2ef Mon Sep 17 00:00:00 2001
    From: Pieter Dewachter 
    Date: Sat, 9 Apr 2022 01:51:51 +0200
    Subject: [PATCH 42/49] Add missing chat_text_outline CVAR to getChatboxLayout
     function (#2506)
    
    ---
     Client/mods/deathmatch/logic/luadefs/CLuaGUIDefs.cpp | 4 +++-
     Client/mods/deathmatch/logic/luadefs/CLuaGUIDefs.h   | 2 +-
     2 files changed, 4 insertions(+), 2 deletions(-)
    
    diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaGUIDefs.cpp b/Client/mods/deathmatch/logic/luadefs/CLuaGUIDefs.cpp
    index 4e53c8b84b..b2fe0989ac 100644
    --- a/Client/mods/deathmatch/logic/luadefs/CLuaGUIDefs.cpp
    +++ b/Client/mods/deathmatch/logic/luadefs/CLuaGUIDefs.cpp
    @@ -30,7 +30,8 @@ static const SFixedArray g_chatboxLayoutC
                                                                                              "chat_line_life",
                                                                                              "chat_line_fade_out",
                                                                                              "chat_use_cegui",
    -                                                                                         "text_scale"}};
    +                                                                                         "text_scale",
    +                                                                                         "chat_text_outline"}};
     
     void CLuaGUIDefs::LoadFunctions()
     {
    @@ -3645,6 +3646,7 @@ int CLuaGUIDefs::GUIGetChatboxLayout(lua_State* luaVM)
         //* chat_line_fade_out - Returns how long takes for text to fade out
         //* chat_use_cegui - Returns whether CEGUI is used to render the chatbox
         //* text_scale - Returns text scale
    +    //* chat_text_outline - Returns whether text black/white outline is used
     
         CScriptArgReader  argStream(luaVM);
         CCVarsInterface*  pCVars = g_pCore->GetCVars();
    diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaGUIDefs.h b/Client/mods/deathmatch/logic/luadefs/CLuaGUIDefs.h
    index cf5cefd4a0..a3e5f96662 100644
    --- a/Client/mods/deathmatch/logic/luadefs/CLuaGUIDefs.h
    +++ b/Client/mods/deathmatch/logic/luadefs/CLuaGUIDefs.h
    @@ -12,7 +12,7 @@
     #pragma once
     #include "CLuaDefs.h"
     
    -#define MAX_CHATBOX_LAYOUT_CVARS 20
    +#define MAX_CHATBOX_LAYOUT_CVARS 21
     
     class CLuaGUIDefs : public CLuaDefs
     {
    
    From a89d975d7b959fe6c9b0af73ef6261cdb3763715 Mon Sep 17 00:00:00 2001
    From: Uladzislau Nikalayevich 
    Date: Sat, 9 Apr 2022 03:00:31 +0300
    Subject: [PATCH 43/49] Add missing getType method for camera element (#2368)
    
    * Add missing getType method for camera element
    
    Co-authored-by: Vladislav Nikolaevich 
    Co-authored-by: Nikita Obrekht 
    ---
     Client/mods/deathmatch/logic/luadefs/CLuaCameraDefs.cpp | 7 +++++++
     Client/mods/deathmatch/logic/luadefs/CLuaCameraDefs.h   | 2 ++
     2 files changed, 9 insertions(+)
    
    diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaCameraDefs.cpp b/Client/mods/deathmatch/logic/luadefs/CLuaCameraDefs.cpp
    index 09ec1f5a21..2844554158 100644
    --- a/Client/mods/deathmatch/logic/luadefs/CLuaCameraDefs.cpp
    +++ b/Client/mods/deathmatch/logic/luadefs/CLuaCameraDefs.cpp
    @@ -65,6 +65,7 @@ void CLuaCameraDefs::AddClass(lua_State* luaVM)
         lua_classfunction(luaVM, "getClip", "getCameraClip");
         lua_classfunction(luaVM, "getFarClipDistance", "getFarClipDistance");
         lua_classfunction(luaVM, "getNearClipDistance", "getNearClipDistance");
    +    lua_classfunction(luaVM, "getType", ArgumentParser);
     
         lua_classfunction(luaVM, "setPosition", OOP_SetCameraPosition);
         lua_classfunction(luaVM, "setRotation", OOP_SetCameraRotation);
    @@ -88,6 +89,7 @@ void CLuaCameraDefs::AddClass(lua_State* luaVM)
         lua_classvariable(luaVM, "position", OOP_SetCameraPosition, OOP_GetCameraPosition);
         lua_classvariable(luaVM, "rotation", OOP_SetCameraRotation, OOP_GetCameraRotation);
         lua_classvariable(luaVM, "matrix", NULL, OOP_GetCameraMatrix);
    +    lua_classvariable(luaVM, "type", nullptr, ArgumentParser);
     
         lua_registerstaticclass(luaVM, "Camera");
     }
    @@ -595,3 +597,8 @@ int CLuaCameraDefs::OOP_SetCameraRotation(lua_State* luaVM)
         lua_pushboolean(luaVM, false);
         return 1;
     }
    +
    +const SString& CLuaCameraDefs::GetElementType()
    +{
    +    return m_pManager->GetCamera()->GetTypeName();
    +}
    diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaCameraDefs.h b/Client/mods/deathmatch/logic/luadefs/CLuaCameraDefs.h
    index 38a57a2842..c6d0ff4eae 100644
    --- a/Client/mods/deathmatch/logic/luadefs/CLuaCameraDefs.h
    +++ b/Client/mods/deathmatch/logic/luadefs/CLuaCameraDefs.h
    @@ -47,4 +47,6 @@ class CLuaCameraDefs : public CLuaDefs
         LUA_DECLARE(OOP_SetCameraPosition);
         LUA_DECLARE(OOP_GetCameraRotation);
         LUA_DECLARE(OOP_SetCameraRotation);
    +
    +    static const SString& GetElementType();
     };
    
    From 9b022b632ddcb3989311332b0c9cf41356d54f55 Mon Sep 17 00:00:00 2001
    From: starmakers <80929288+starmakers@users.noreply.github.com>
    Date: Fri, 8 Apr 2022 21:04:19 -0300
    Subject: [PATCH 44/49] GUI functions: variable set relative to false when it
     has invisible space (#2449)
    
    ---
     .../logic/luadefs/CLuaBrowserDefs.cpp         |  2 +-
     .../deathmatch/logic/luadefs/CLuaGUIDefs.cpp  | 40 +++++++++----------
     2 files changed, 21 insertions(+), 21 deletions(-)
    
    diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaBrowserDefs.cpp b/Client/mods/deathmatch/logic/luadefs/CLuaBrowserDefs.cpp
    index 6227616b57..cbd460e8d3 100644
    --- a/Client/mods/deathmatch/logic/luadefs/CLuaBrowserDefs.cpp
    +++ b/Client/mods/deathmatch/logic/luadefs/CLuaBrowserDefs.cpp
    @@ -902,7 +902,7 @@ int CLuaBrowserDefs::GUICreateBrowser(lua_State* luaVM)
         argStream.ReadVector2D(size);
         argStream.ReadBool(bIsLocal);
         argStream.ReadBool(bIsTransparent);
    -    argStream.ReadBool(bIsRelative);
    +    argStream.ReadBool(bIsRelative, false);
         argStream.ReadUserData(parent, nullptr);
     
         if (!argStream.HasErrors())
    diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaGUIDefs.cpp b/Client/mods/deathmatch/logic/luadefs/CLuaGUIDefs.cpp
    index b2fe0989ac..c1c2f50b7b 100644
    --- a/Client/mods/deathmatch/logic/luadefs/CLuaGUIDefs.cpp
    +++ b/Client/mods/deathmatch/logic/luadefs/CLuaGUIDefs.cpp
    @@ -703,7 +703,7 @@ int CLuaGUIDefs::GUICreateWindow(lua_State* luaVM)
         argStream.ReadVector2D(position);
         argStream.ReadVector2D(size);
         argStream.ReadString(titleBarText);
    -    argStream.ReadBool(relative);
    +    argStream.ReadBool(relative, false);
     
         if (!argStream.HasErrors())
         {
    @@ -737,7 +737,7 @@ int CLuaGUIDefs::GUICreateLabel(lua_State* luaVM)
         argStream.ReadVector2D(position);
         argStream.ReadVector2D(size);
         argStream.ReadString(text);
    -    argStream.ReadBool(relative);
    +    argStream.ReadBool(relative, false);
         argStream.ReadUserData(parent, NULL);
     
         if (!argStream.HasErrors())
    @@ -772,7 +772,7 @@ int CLuaGUIDefs::GUICreateStaticImage(lua_State* luaVM)
         argStream.ReadVector2D(position);
         argStream.ReadVector2D(size);
         argStream.ReadString(path);
    -    argStream.ReadBool(relative);
    +    argStream.ReadBool(relative, false);
         argStream.ReadUserData(parent, NULL);
     
         if (!argStream.HasErrors())
    @@ -824,7 +824,7 @@ int CLuaGUIDefs::GUICreateButton(lua_State* luaVM)
         argStream.ReadVector2D(position);
         argStream.ReadVector2D(size);
         argStream.ReadString(text);
    -    argStream.ReadBool(relative);
    +    argStream.ReadBool(relative, false);
         argStream.ReadUserData(parent, NULL);
     
         if (!argStream.HasErrors())
    @@ -857,7 +857,7 @@ int CLuaGUIDefs::GUICreateProgressBar(lua_State* luaVM)
         CScriptArgReader argStream(luaVM);
         argStream.ReadVector2D(position);
         argStream.ReadVector2D(size);
    -    argStream.ReadBool(relative);
    +    argStream.ReadBool(relative, false);
         argStream.ReadUserData(parent, NULL);
     
         if (!argStream.HasErrors())
    @@ -894,7 +894,7 @@ int CLuaGUIDefs::GUICreateCheckBox(lua_State* luaVM)
         argStream.ReadVector2D(size);
         argStream.ReadString(text);
         argStream.ReadBool(selected);
    -    argStream.ReadBool(relative);
    +    argStream.ReadBool(relative, false);
         argStream.ReadUserData(parent, NULL);
     
         if (!argStream.HasErrors())
    @@ -929,7 +929,7 @@ int CLuaGUIDefs::GUICreateRadioButton(lua_State* luaVM)
         argStream.ReadVector2D(position);
         argStream.ReadVector2D(size);
         argStream.ReadString(text);
    -    argStream.ReadBool(relative);
    +    argStream.ReadBool(relative, false);
         argStream.ReadUserData(parent, NULL);
     
         if (!argStream.HasErrors())
    @@ -964,7 +964,7 @@ int CLuaGUIDefs::GUICreateEdit(lua_State* luaVM)
         argStream.ReadVector2D(position);
         argStream.ReadVector2D(size);
         argStream.ReadString(text);
    -    argStream.ReadBool(relative);
    +    argStream.ReadBool(relative, false);
         argStream.ReadUserData(parent, NULL);
     
         if (!argStream.HasErrors())
    @@ -999,7 +999,7 @@ int CLuaGUIDefs::GUICreateMemo(lua_State* luaVM)
         argStream.ReadVector2D(position);
         argStream.ReadVector2D(size);
         argStream.ReadString(text);
    -    argStream.ReadBool(relative);
    +    argStream.ReadBool(relative, false);
         argStream.ReadUserData(parent, NULL);
     
         if (!argStream.HasErrors())
    @@ -1032,7 +1032,7 @@ int CLuaGUIDefs::GUICreateGridList(lua_State* luaVM)
         CScriptArgReader argStream(luaVM);
         argStream.ReadVector2D(position);
         argStream.ReadVector2D(size);
    -    argStream.ReadBool(relative);
    +    argStream.ReadBool(relative, false);
         argStream.ReadUserData(parent, NULL);
     
         if (!argStream.HasErrors())
    @@ -1065,7 +1065,7 @@ int CLuaGUIDefs::GUICreateScrollPane(lua_State* luaVM)
         CScriptArgReader argStream(luaVM);
         argStream.ReadVector2D(position);
         argStream.ReadVector2D(size);
    -    argStream.ReadBool(relative);
    +    argStream.ReadBool(relative, false);
         argStream.ReadUserData(parent, NULL);
     
         if (!argStream.HasErrors())
    @@ -1100,7 +1100,7 @@ int CLuaGUIDefs::GUICreateScrollBar(lua_State* luaVM)
         argStream.ReadVector2D(position);
         argStream.ReadVector2D(size);
         argStream.ReadBool(horizontal);
    -    argStream.ReadBool(relative);
    +    argStream.ReadBool(relative, false);
         argStream.ReadUserData(parent, NULL);
     
         if (!argStream.HasErrors())
    @@ -1133,7 +1133,7 @@ int CLuaGUIDefs::GUICreateTabPanel(lua_State* luaVM)
         CScriptArgReader argStream(luaVM);
         argStream.ReadVector2D(position);
         argStream.ReadVector2D(size);
    -    argStream.ReadBool(relative);
    +    argStream.ReadBool(relative, false);
         argStream.ReadUserData(parent, NULL);
     
         if (!argStream.HasErrors())
    @@ -1755,7 +1755,7 @@ int CLuaGUIDefs::GUIGetSize(lua_State* luaVM)
     
         CScriptArgReader argStream(luaVM);
         argStream.ReadUserData(theElement);
    -    argStream.ReadBool(relative);
    +    argStream.ReadBool(relative, false);
     
         if (!argStream.HasErrors())
         {
    @@ -1791,7 +1791,7 @@ int CLuaGUIDefs::GUIGetPosition(lua_State* luaVM)
     
         CScriptArgReader argStream(luaVM);
         argStream.ReadUserData(guiElement);
    -    argStream.ReadBool(relative);
    +    argStream.ReadBool(relative, false);
     
         if (!argStream.HasErrors())
         {
    @@ -2081,7 +2081,7 @@ int CLuaGUIDefs::GUISetSize(lua_State* luaVM)
         argStream.ReadUserData(guiElement);
         argStream.ReadNumber(width);
         argStream.ReadNumber(height);
    -    argStream.ReadBool(relative);
    +    argStream.ReadBool(relative, false);
     
         if (!argStream.HasErrors())
         {
    @@ -2109,7 +2109,7 @@ int CLuaGUIDefs::GUISetPosition(lua_State* luaVM)
         argStream.ReadUserData(guiElement);
         argStream.ReadNumber(x);
         argStream.ReadNumber(y);
    -    argStream.ReadBool(relative);
    +    argStream.ReadBool(relative, false);
     
         if (!argStream.HasErrors())
         {
    @@ -2231,7 +2231,7 @@ int CLuaGUIDefs::GUIGridListSetColumnWidth(lua_State* luaVM)
         argStream.ReadUserData(guiGridlist);
         argStream.ReadNumber(columnIndex);
         argStream.ReadNumber(width);
    -    argStream.ReadBool(relative);
    +    argStream.ReadBool(relative, false);
     
         if (!argStream.HasErrors())
         {
    @@ -2257,7 +2257,7 @@ int CLuaGUIDefs::GUIGridListGetColumnWidth(lua_State* luaVM)
         CScriptArgReader argStream(luaVM);
         argStream.ReadUserData(pGridList);
         argStream.ReadNumber(columnIndex);
    -    argStream.ReadBool(relative);
    +    argStream.ReadBool(relative, false);
     
         if (!argStream.HasErrors())
         {
    @@ -3757,7 +3757,7 @@ int CLuaGUIDefs::GUICreateComboBox(lua_State* luaVM)
         argStream.ReadVector2D(position);
         argStream.ReadVector2D(size);
         argStream.ReadString(caption);
    -    argStream.ReadBool(relative);
    +    argStream.ReadBool(relative, false);
         argStream.ReadUserData(parent, NULL);
     
         if (!argStream.HasErrors())
    
    From 796c3a1390c2704db149591524af25bbe0a8db20 Mon Sep 17 00:00:00 2001
    From: patrikjuvonen <22572159+patrikjuvonen@users.noreply.github.com>
    Date: Sat, 9 Apr 2022 04:39:47 +0300
    Subject: [PATCH 45/49] Update sqlite from 3.37.2 to 3.38.2 (#2582)
    
    ---
     vendor/sqlite/sqlite3.c    | 9668 +++++++++++++++++++++---------------
     vendor/sqlite/sqlite3.h    |  380 +-
     vendor/sqlite/sqlite3ext.h |   14 +
     3 files changed, 6145 insertions(+), 3917 deletions(-)
    
    diff --git a/vendor/sqlite/sqlite3.c b/vendor/sqlite/sqlite3.c
    index 62f197db2c..0b227f0e60 100644
    --- a/vendor/sqlite/sqlite3.c
    +++ b/vendor/sqlite/sqlite3.c
    @@ -1,6 +1,6 @@
     /******************************************************************************
     ** This file is an amalgamation of many separate C source files from SQLite
    -** version 3.37.2.  By combining all the individual C code files into this
    +** version 3.38.2.  By combining all the individual C code files into this
     ** single large file, the entire code can be compiled as a single translation
     ** unit.  This allows many compilers to do optimizations that would not be
     ** possible if the files were compiled separately.  Performance improvements
    @@ -452,9 +452,9 @@ extern "C" {
     ** [sqlite3_libversion_number()], [sqlite3_sourceid()],
     ** [sqlite_version()] and [sqlite_source_id()].
     */
    -#define SQLITE_VERSION        "3.37.2"
    -#define SQLITE_VERSION_NUMBER 3037002
    -#define SQLITE_SOURCE_ID      "2022-01-06 13:25:41 872ba256cbf61d9290b571c0e6d82a20c224ca3ad82971edc46b29818d5d17a0"
    +#define SQLITE_VERSION        "3.38.2"
    +#define SQLITE_VERSION_NUMBER 3038002
    +#define SQLITE_SOURCE_ID      "2022-03-26 13:51:10 d33c709cc0af66bc5b6dc6216eba9f1f0b40960b9ae83694c986fbf4c1d6f08f"
     
     /*
     ** CAPI3REF: Run-Time Library Version Numbers
    @@ -872,7 +872,7 @@ SQLITE_API int sqlite3_exec(
     #define SQLITE_WARNING_AUTOINDEX       (SQLITE_WARNING | (1<<8))
     #define SQLITE_AUTH_USER               (SQLITE_AUTH | (1<<8))
     #define SQLITE_OK_LOAD_PERMANENTLY     (SQLITE_OK | (1<<8))
    -#define SQLITE_OK_SYMLINK              (SQLITE_OK | (2<<8))
    +#define SQLITE_OK_SYMLINK              (SQLITE_OK | (2<<8)) /* internal use only */
     
     /*
     ** CAPI3REF: Flags For File Open Operations
    @@ -4130,13 +4130,14 @@ SQLITE_API void sqlite3_free_filename(char*);
     ** sqlite3_extended_errcode() might change with each API call.
     ** Except, there are some interfaces that are guaranteed to never
     ** change the value of the error code.  The error-code preserving
    -** interfaces are:
    +** interfaces include the following:
     **
     ** 
      **
    • sqlite3_errcode() **
    • sqlite3_extended_errcode() **
    • sqlite3_errmsg() **
    • sqlite3_errmsg16() +**
    • sqlite3_error_offset() **
    ** ** ^The sqlite3_errmsg() and sqlite3_errmsg16() return English-language @@ -4151,6 +4152,13 @@ SQLITE_API void sqlite3_free_filename(char*); ** ^(Memory to hold the error message string is managed internally ** and must not be freed by the application)^. ** +** ^If the most recent error references a specific token in the input +** SQL, the sqlite3_error_offset() interface returns the byte offset +** of the start of that token. ^The byte offset returned by +** sqlite3_error_offset() assumes that the input SQL is UTF8. +** ^If the most recent error does not reference a specific token in the input +** SQL, then the sqlite3_error_offset() function returns -1. +** ** When the serialized [threading mode] is in use, it might be the ** case that a second error occurs on a separate thread in between ** the time of the first error and the call to these interfaces. @@ -4170,6 +4178,7 @@ SQLITE_API int sqlite3_extended_errcode(sqlite3 *db); SQLITE_API const char *sqlite3_errmsg(sqlite3*); SQLITE_API const void *sqlite3_errmsg16(sqlite3*); SQLITE_API const char *sqlite3_errstr(int); +SQLITE_API int sqlite3_error_offset(sqlite3 *db); /* ** CAPI3REF: Prepared Statement Object @@ -4581,6 +4590,10 @@ SQLITE_API const char *sqlite3_normalized_sql(sqlite3_stmt *pStmt); ** be false. ^Similarly, a CREATE TABLE IF NOT EXISTS statement is a ** read-only no-op if the table already exists, but ** sqlite3_stmt_readonly() still returns false for such a statement. +** +** ^If prepared statement X is an [EXPLAIN] or [EXPLAIN QUERY PLAN] +** statement, then sqlite3_stmt_readonly(X) returns the same value as +** if the EXPLAIN or EXPLAIN QUERY PLAN prefix were omitted. */ SQLITE_API int sqlite3_stmt_readonly(sqlite3_stmt *pStmt); @@ -4649,6 +4662,8 @@ SQLITE_API int sqlite3_stmt_busy(sqlite3_stmt*); ** ** ^The sqlite3_value objects that are passed as parameters into the ** implementation of [application-defined SQL functions] are protected. +** ^The sqlite3_value objects returned by [sqlite3_vtab_rhs_value()] +** are protected. ** ^The sqlite3_value object returned by ** [sqlite3_column_value()] is unprotected. ** Unprotected sqlite3_value objects may only be used as arguments @@ -5270,6 +5285,10 @@ SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt); ** even empty strings, are always zero-terminated. ^The return ** value from sqlite3_column_blob() for a zero-length BLOB is a NULL pointer. ** +** ^Strings returned by sqlite3_column_text16() always have the endianness +** which is native to the platform, regardless of the text encoding set +** for the database. +** ** Warning: ^The object returned by [sqlite3_column_value()] is an ** [unprotected sqlite3_value] object. In a multithreaded environment, ** an unprotected sqlite3_value object may only be used safely with @@ -5283,7 +5302,7 @@ SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt); ** [application-defined SQL functions] or [virtual tables], not within ** top-level application code. ** -** The these routines may attempt to convert the datatype of the result. +** These routines may attempt to convert the datatype of the result. ** ^For example, if the internal representation is FLOAT and a text result ** is requested, [sqlite3_snprintf()] is used internally to perform the ** conversion automatically. ^(The following table details the conversions @@ -5308,7 +5327,7 @@ SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt); ** TEXT BLOB No change ** BLOB INTEGER [CAST] to INTEGER ** BLOB FLOAT [CAST] to REAL -** BLOB TEXT Add a zero terminator if needed +** BLOB TEXT [CAST] to TEXT, ensure zero terminator ** ** )^ ** @@ -7428,24 +7447,56 @@ struct sqlite3_index_info { ** ** These macros define the allowed values for the ** [sqlite3_index_info].aConstraint[].op field. Each value represents -** an operator that is part of a constraint term in the wHERE clause of +** an operator that is part of a constraint term in the WHERE clause of ** a query that uses a [virtual table]. -*/ -#define SQLITE_INDEX_CONSTRAINT_EQ 2 -#define SQLITE_INDEX_CONSTRAINT_GT 4 -#define SQLITE_INDEX_CONSTRAINT_LE 8 -#define SQLITE_INDEX_CONSTRAINT_LT 16 -#define SQLITE_INDEX_CONSTRAINT_GE 32 -#define SQLITE_INDEX_CONSTRAINT_MATCH 64 -#define SQLITE_INDEX_CONSTRAINT_LIKE 65 -#define SQLITE_INDEX_CONSTRAINT_GLOB 66 -#define SQLITE_INDEX_CONSTRAINT_REGEXP 67 -#define SQLITE_INDEX_CONSTRAINT_NE 68 -#define SQLITE_INDEX_CONSTRAINT_ISNOT 69 -#define SQLITE_INDEX_CONSTRAINT_ISNOTNULL 70 -#define SQLITE_INDEX_CONSTRAINT_ISNULL 71 -#define SQLITE_INDEX_CONSTRAINT_IS 72 -#define SQLITE_INDEX_CONSTRAINT_FUNCTION 150 +** +** ^The left-hand operand of the operator is given by the corresponding +** aConstraint[].iColumn field. ^An iColumn of -1 indicates the left-hand +** operand is the rowid. +** The SQLITE_INDEX_CONSTRAINT_LIMIT and SQLITE_INDEX_CONSTRAINT_OFFSET +** operators have no left-hand operand, and so for those operators the +** corresponding aConstraint[].iColumn is meaningless and should not be +** used. +** +** All operator values from SQLITE_INDEX_CONSTRAINT_FUNCTION through +** value 255 are reserved to represent functions that are overloaded +** by the [xFindFunction|xFindFunction method] of the virtual table +** implementation. +** +** The right-hand operands for each constraint might be accessible using +** the [sqlite3_vtab_rhs_value()] interface. Usually the right-hand +** operand is only available if it appears as a single constant literal +** in the input SQL. If the right-hand operand is another column or an +** expression (even a constant expression) or a parameter, then the +** sqlite3_vtab_rhs_value() probably will not be able to extract it. +** ^The SQLITE_INDEX_CONSTRAINT_ISNULL and +** SQLITE_INDEX_CONSTRAINT_ISNOTNULL operators have no right-hand operand +** and hence calls to sqlite3_vtab_rhs_value() for those operators will +** always return SQLITE_NOTFOUND. +** +** The collating sequence to be used for comparison can be found using +** the [sqlite3_vtab_collation()] interface. For most real-world virtual +** tables, the collating sequence of constraints does not matter (for example +** because the constraints are numeric) and so the sqlite3_vtab_collation() +** interface is no commonly needed. +*/ +#define SQLITE_INDEX_CONSTRAINT_EQ 2 +#define SQLITE_INDEX_CONSTRAINT_GT 4 +#define SQLITE_INDEX_CONSTRAINT_LE 8 +#define SQLITE_INDEX_CONSTRAINT_LT 16 +#define SQLITE_INDEX_CONSTRAINT_GE 32 +#define SQLITE_INDEX_CONSTRAINT_MATCH 64 +#define SQLITE_INDEX_CONSTRAINT_LIKE 65 +#define SQLITE_INDEX_CONSTRAINT_GLOB 66 +#define SQLITE_INDEX_CONSTRAINT_REGEXP 67 +#define SQLITE_INDEX_CONSTRAINT_NE 68 +#define SQLITE_INDEX_CONSTRAINT_ISNOT 69 +#define SQLITE_INDEX_CONSTRAINT_ISNOTNULL 70 +#define SQLITE_INDEX_CONSTRAINT_ISNULL 71 +#define SQLITE_INDEX_CONSTRAINT_IS 72 +#define SQLITE_INDEX_CONSTRAINT_LIMIT 73 +#define SQLITE_INDEX_CONSTRAINT_OFFSET 74 +#define SQLITE_INDEX_CONSTRAINT_FUNCTION 150 /* ** CAPI3REF: Register A Virtual Table Implementation @@ -7474,7 +7525,7 @@ struct sqlite3_index_info { ** destructor. ** ** ^If the third parameter (the pointer to the sqlite3_module object) is -** NULL then no new module is create and any existing modules with the +** NULL then no new module is created and any existing modules with the ** same name are dropped. ** ** See also: [sqlite3_drop_modules()] @@ -8250,7 +8301,8 @@ SQLITE_API int sqlite3_test_control(int op, ...); #define SQLITE_TESTCTRL_SEEK_COUNT 30 #define SQLITE_TESTCTRL_TRACEFLAGS 31 #define SQLITE_TESTCTRL_TUNE 32 -#define SQLITE_TESTCTRL_LAST 32 /* Largest TESTCTRL */ +#define SQLITE_TESTCTRL_LOGEST 33 +#define SQLITE_TESTCTRL_LAST 33 /* Largest TESTCTRL */ /* ** CAPI3REF: SQL Keyword Checking @@ -8773,6 +8825,16 @@ SQLITE_API int sqlite3_stmt_status(sqlite3_stmt*, int op,int resetFlg); ** The counter is incremented on the first [sqlite3_step()] call of each ** cycle. ** +** [[SQLITE_STMTSTATUS_FILTER_MISS]] +** [[SQLITE_STMTSTATUS_FILTER HIT]] +**
    SQLITE_STMTSTATUS_FILTER_HIT
    +** SQLITE_STMTSTATUS_FILTER_MISS
    +**
    ^SQLITE_STMTSTATUS_FILTER_HIT is the number of times that a join +** step was bypassed because a Bloom filter returned not-found. The +** corresponding SQLITE_STMTSTATUS_FILTER_MISS value is the number of +** times that the Bloom filter returned a find, and thus the join step +** had to be processed as normal. +** ** [[SQLITE_STMTSTATUS_MEMUSED]]
    SQLITE_STMTSTATUS_MEMUSED
    **
    ^This is the approximate number of bytes of heap memory ** used to store the prepared statement. ^This value is not actually @@ -8787,6 +8849,8 @@ SQLITE_API int sqlite3_stmt_status(sqlite3_stmt*, int op,int resetFlg); #define SQLITE_STMTSTATUS_VM_STEP 4 #define SQLITE_STMTSTATUS_REPREPARE 5 #define SQLITE_STMTSTATUS_RUN 6 +#define SQLITE_STMTSTATUS_FILTER_MISS 7 +#define SQLITE_STMTSTATUS_FILTER_HIT 8 #define SQLITE_STMTSTATUS_MEMUSED 99 /* @@ -9755,19 +9819,269 @@ SQLITE_API int sqlite3_vtab_nochange(sqlite3_context*); /* ** CAPI3REF: Determine The Collation For a Virtual Table Constraint +** METHOD: sqlite3_index_info ** ** This function may only be called from within a call to the [xBestIndex] -** method of a [virtual table]. +** method of a [virtual table]. This function returns a pointer to a string +** that is the name of the appropriate collation sequence to use for text +** comparisons on the constraint identified by its arguments. +** +** The first argument must be the pointer to the [sqlite3_index_info] object +** that is the first parameter to the xBestIndex() method. The second argument +** must be an index into the aConstraint[] array belonging to the +** sqlite3_index_info structure passed to xBestIndex. ** -** The first argument must be the sqlite3_index_info object that is the -** first parameter to the xBestIndex() method. The second argument must be -** an index into the aConstraint[] array belonging to the sqlite3_index_info -** structure passed to xBestIndex. This function returns a pointer to a buffer -** containing the name of the collation sequence for the corresponding -** constraint. +** Important: +** The first parameter must be the same pointer that is passed into the +** xBestMethod() method. The first parameter may not be a pointer to a +** different [sqlite3_index_info] object, even an exact copy. +** +** The return value is computed as follows: +** +**
      +**
    1. If the constraint comes from a WHERE clause expression that contains +** a [COLLATE operator], then the name of the collation specified by +** that COLLATE operator is returned. +**

    2. If there is no COLLATE operator, but the column that is the subject +** of the constraint specifies an alternative collating sequence via +** a [COLLATE clause] on the column definition within the CREATE TABLE +** statement that was passed into [sqlite3_declare_vtab()], then the +** name of that alternative collating sequence is returned. +**

    3. Otherwise, "BINARY" is returned. +**

    */ SQLITE_API SQLITE_EXPERIMENTAL const char *sqlite3_vtab_collation(sqlite3_index_info*,int); +/* +** CAPI3REF: Determine if a virtual table query is DISTINCT +** METHOD: sqlite3_index_info +** +** This API may only be used from within an [xBestIndex|xBestIndex method] +** of a [virtual table] implementation. The result of calling this +** interface from outside of xBestIndex() is undefined and probably harmful. +** +** ^The sqlite3_vtab_distinct() interface returns an integer that is +** either 0, 1, or 2. The integer returned by sqlite3_vtab_distinct() +** gives the virtual table additional information about how the query +** planner wants the output to be ordered. As long as the virtual table +** can meet the ordering requirements of the query planner, it may set +** the "orderByConsumed" flag. +** +**
    1. +** ^If the sqlite3_vtab_distinct() interface returns 0, that means +** that the query planner needs the virtual table to return all rows in the +** sort order defined by the "nOrderBy" and "aOrderBy" fields of the +** [sqlite3_index_info] object. This is the default expectation. If the +** virtual table outputs all rows in sorted order, then it is always safe for +** the xBestIndex method to set the "orderByConsumed" flag, regardless of +** the return value from sqlite3_vtab_distinct(). +**

    2. +** ^(If the sqlite3_vtab_distinct() interface returns 1, that means +** that the query planner does not need the rows to be returned in sorted order +** as long as all rows with the same values in all columns identified by the +** "aOrderBy" field are adjacent.)^ This mode is used when the query planner +** is doing a GROUP BY. +**

    3. +** ^(If the sqlite3_vtab_distinct() interface returns 2, that means +** that the query planner does not need the rows returned in any particular +** order, as long as rows with the same values in all "aOrderBy" columns +** are adjacent.)^ ^(Furthermore, only a single row for each particular +** combination of values in the columns identified by the "aOrderBy" field +** needs to be returned.)^ ^It is always ok for two or more rows with the same +** values in all "aOrderBy" columns to be returned, as long as all such rows +** are adjacent. ^The virtual table may, if it chooses, omit extra rows +** that have the same value for all columns identified by "aOrderBy". +** ^However omitting the extra rows is optional. +** This mode is used for a DISTINCT query. +**

    +** +** ^For the purposes of comparing virtual table output values to see if the +** values are same value for sorting purposes, two NULL values are considered +** to be the same. In other words, the comparison operator is "IS" +** (or "IS NOT DISTINCT FROM") and not "==". +** +** If a virtual table implementation is unable to meet the requirements +** specified above, then it must not set the "orderByConsumed" flag in the +** [sqlite3_index_info] object or an incorrect answer may result. +** +** ^A virtual table implementation is always free to return rows in any order +** it wants, as long as the "orderByConsumed" flag is not set. ^When the +** the "orderByConsumed" flag is unset, the query planner will add extra +** [bytecode] to ensure that the final results returned by the SQL query are +** ordered correctly. The use of the "orderByConsumed" flag and the +** sqlite3_vtab_distinct() interface is merely an optimization. ^Careful +** use of the sqlite3_vtab_distinct() interface and the "orderByConsumed" +** flag might help queries against a virtual table to run faster. Being +** overly aggressive and setting the "orderByConsumed" flag when it is not +** valid to do so, on the other hand, might cause SQLite to return incorrect +** results. +*/ +SQLITE_API int sqlite3_vtab_distinct(sqlite3_index_info*); + +/* +** CAPI3REF: Identify and handle IN constraints in xBestIndex +** +** This interface may only be used from within an +** [xBestIndex|xBestIndex() method] of a [virtual table] implementation. +** The result of invoking this interface from any other context is +** undefined and probably harmful. +** +** ^(A constraint on a virtual table of the form +** "[IN operator|column IN (...)]" is +** communicated to the xBestIndex method as a +** [SQLITE_INDEX_CONSTRAINT_EQ] constraint.)^ If xBestIndex wants to use +** this constraint, it must set the corresponding +** aConstraintUsage[].argvIndex to a postive integer. ^(Then, under +** the usual mode of handling IN operators, SQLite generates [bytecode] +** that invokes the [xFilter|xFilter() method] once for each value +** on the right-hand side of the IN operator.)^ Thus the virtual table +** only sees a single value from the right-hand side of the IN operator +** at a time. +** +** In some cases, however, it would be advantageous for the virtual +** table to see all values on the right-hand of the IN operator all at +** once. The sqlite3_vtab_in() interfaces facilitates this in two ways: +** +**
      +**
    1. +** ^A call to sqlite3_vtab_in(P,N,-1) will return true (non-zero) +** if and only if the [sqlite3_index_info|P->aConstraint][N] constraint +** is an [IN operator] that can be processed all at once. ^In other words, +** sqlite3_vtab_in() with -1 in the third argument is a mechanism +** by which the virtual table can ask SQLite if all-at-once processing +** of the IN operator is even possible. +** +**

    2. +** ^A call to sqlite3_vtab_in(P,N,F) with F==1 or F==0 indicates +** to SQLite that the virtual table does or does not want to process +** the IN operator all-at-once, respectively. ^Thus when the third +** parameter (F) is non-negative, this interface is the mechanism by +** which the virtual table tells SQLite how it wants to process the +** IN operator. +**

    +** +** ^The sqlite3_vtab_in(P,N,F) interface can be invoked multiple times +** within the same xBestIndex method call. ^For any given P,N pair, +** the return value from sqlite3_vtab_in(P,N,F) will always be the same +** within the same xBestIndex call. ^If the interface returns true +** (non-zero), that means that the constraint is an IN operator +** that can be processed all-at-once. ^If the constraint is not an IN +** operator or cannot be processed all-at-once, then the interface returns +** false. +** +** ^(All-at-once processing of the IN operator is selected if both of the +** following conditions are met: +** +**
      +**
    1. The P->aConstraintUsage[N].argvIndex value is set to a positive +** integer. This is how the virtual table tells SQLite that it wants to +** use the N-th constraint. +** +**

    2. The last call to sqlite3_vtab_in(P,N,F) for which F was +** non-negative had F>=1. +**

    )^ +** +** ^If either or both of the conditions above are false, then SQLite uses +** the traditional one-at-a-time processing strategy for the IN constraint. +** ^If both conditions are true, then the argvIndex-th parameter to the +** xFilter method will be an [sqlite3_value] that appears to be NULL, +** but which can be passed to [sqlite3_vtab_in_first()] and +** [sqlite3_vtab_in_next()] to find all values on the right-hand side +** of the IN constraint. +*/ +SQLITE_API int sqlite3_vtab_in(sqlite3_index_info*, int iCons, int bHandle); + +/* +** CAPI3REF: Find all elements on the right-hand side of an IN constraint. +** +** These interfaces are only useful from within the +** [xFilter|xFilter() method] of a [virtual table] implementation. +** The result of invoking these interfaces from any other context +** is undefined and probably harmful. +** +** The X parameter in a call to sqlite3_vtab_in_first(X,P) or +** sqlite3_vtab_in_next(X,P) must be one of the parameters to the +** xFilter method which invokes these routines, and specifically +** a parameter that was previously selected for all-at-once IN constraint +** processing use the [sqlite3_vtab_in()] interface in the +** [xBestIndex|xBestIndex method]. ^(If the X parameter is not +** an xFilter argument that was selected for all-at-once IN constraint +** processing, then these routines return [SQLITE_MISUSE])^ or perhaps +** exhibit some other undefined or harmful behavior. +** +** ^(Use these routines to access all values on the right-hand side +** of the IN constraint using code like the following: +** +**
    +**    for(rc=sqlite3_vtab_in_first(pList, &pVal);
    +**        rc==SQLITE_OK && pVal
    +**        rc=sqlite3_vtab_in_next(pList, &pVal)
    +**    ){
    +**      // do something with pVal
    +**    }
    +**    if( rc!=SQLITE_OK ){
    +**      // an error has occurred
    +**    }
    +** 
    )^ +** +** ^On success, the sqlite3_vtab_in_first(X,P) and sqlite3_vtab_in_next(X,P) +** routines return SQLITE_OK and set *P to point to the first or next value +** on the RHS of the IN constraint. ^If there are no more values on the +** right hand side of the IN constraint, then *P is set to NULL and these +** routines return [SQLITE_DONE]. ^The return value might be +** some other value, such as SQLITE_NOMEM, in the event of a malfunction. +** +** The *ppOut values returned by these routines are only valid until the +** next call to either of these routines or until the end of the xFilter +** method from which these routines were called. If the virtual table +** implementation needs to retain the *ppOut values for longer, it must make +** copies. The *ppOut values are [protected sqlite3_value|protected]. +*/ +SQLITE_API int sqlite3_vtab_in_first(sqlite3_value *pVal, sqlite3_value **ppOut); +SQLITE_API int sqlite3_vtab_in_next(sqlite3_value *pVal, sqlite3_value **ppOut); + +/* +** CAPI3REF: Constraint values in xBestIndex() +** METHOD: sqlite3_index_info +** +** This API may only be used from within the [xBestIndex|xBestIndex method] +** of a [virtual table] implementation. The result of calling this interface +** from outside of an xBestIndex method are undefined and probably harmful. +** +** ^When the sqlite3_vtab_rhs_value(P,J,V) interface is invoked from within +** the [xBestIndex] method of a [virtual table] implementation, with P being +** a copy of the [sqlite3_index_info] object pointer passed into xBestIndex and +** J being a 0-based index into P->aConstraint[], then this routine +** attempts to set *V to the value of the right-hand operand of +** that constraint if the right-hand operand is known. ^If the +** right-hand operand is not known, then *V is set to a NULL pointer. +** ^The sqlite3_vtab_rhs_value(P,J,V) interface returns SQLITE_OK if +** and only if *V is set to a value. ^The sqlite3_vtab_rhs_value(P,J,V) +** inteface returns SQLITE_NOTFOUND if the right-hand side of the J-th +** constraint is not available. ^The sqlite3_vtab_rhs_value() interface +** can return an result code other than SQLITE_OK or SQLITE_NOTFOUND if +** something goes wrong. +** +** The sqlite3_vtab_rhs_value() interface is usually only successful if +** the right-hand operand of a constraint is a literal value in the original +** SQL statement. If the right-hand operand is an expression or a reference +** to some other column or a [host parameter], then sqlite3_vtab_rhs_value() +** will probably return [SQLITE_NOTFOUND]. +** +** ^(Some constraints, such as [SQLITE_INDEX_CONSTRAINT_ISNULL] and +** [SQLITE_INDEX_CONSTRAINT_ISNOTNULL], have no right-hand operand. For such +** constraints, sqlite3_vtab_rhs_value() always returns SQLITE_NOTFOUND.)^ +** +** ^The [sqlite3_value] object returned in *V is a protected sqlite3_value +** and remains valid for the duration of the xBestIndex method call. +** ^When xBestIndex returns, the sqlite3_value object returned by +** sqlite3_vtab_rhs_value() is automatically deallocated. +** +** The "_rhs_" in the name of this routine is an abbreviation for +** "Right-Hand Side". +*/ +SQLITE_API int sqlite3_vtab_rhs_value(sqlite3_index_info*, int, sqlite3_value **ppVal); + /* ** CAPI3REF: Conflict resolution modes ** KEYWORDS: {conflict resolution mode} @@ -13621,78 +13935,79 @@ SQLITE_PRIVATE void sqlite3HashClear(Hash*); #define TK_SLASH 109 #define TK_REM 110 #define TK_CONCAT 111 -#define TK_COLLATE 112 -#define TK_BITNOT 113 -#define TK_ON 114 -#define TK_INDEXED 115 -#define TK_STRING 116 -#define TK_JOIN_KW 117 -#define TK_CONSTRAINT 118 -#define TK_DEFAULT 119 -#define TK_NULL 120 -#define TK_PRIMARY 121 -#define TK_UNIQUE 122 -#define TK_CHECK 123 -#define TK_REFERENCES 124 -#define TK_AUTOINCR 125 -#define TK_INSERT 126 -#define TK_DELETE 127 -#define TK_UPDATE 128 -#define TK_SET 129 -#define TK_DEFERRABLE 130 -#define TK_FOREIGN 131 -#define TK_DROP 132 -#define TK_UNION 133 -#define TK_ALL 134 -#define TK_EXCEPT 135 -#define TK_INTERSECT 136 -#define TK_SELECT 137 -#define TK_VALUES 138 -#define TK_DISTINCT 139 -#define TK_DOT 140 -#define TK_FROM 141 -#define TK_JOIN 142 -#define TK_USING 143 -#define TK_ORDER 144 -#define TK_GROUP 145 -#define TK_HAVING 146 -#define TK_LIMIT 147 -#define TK_WHERE 148 -#define TK_RETURNING 149 -#define TK_INTO 150 -#define TK_NOTHING 151 -#define TK_FLOAT 152 -#define TK_BLOB 153 -#define TK_INTEGER 154 -#define TK_VARIABLE 155 -#define TK_CASE 156 -#define TK_WHEN 157 -#define TK_THEN 158 -#define TK_ELSE 159 -#define TK_INDEX 160 -#define TK_ALTER 161 -#define TK_ADD 162 -#define TK_WINDOW 163 -#define TK_OVER 164 -#define TK_FILTER 165 -#define TK_COLUMN 166 -#define TK_AGG_FUNCTION 167 -#define TK_AGG_COLUMN 168 -#define TK_TRUEFALSE 169 -#define TK_ISNOT 170 -#define TK_FUNCTION 171 -#define TK_UMINUS 172 -#define TK_UPLUS 173 -#define TK_TRUTH 174 -#define TK_REGISTER 175 -#define TK_VECTOR 176 -#define TK_SELECT_COLUMN 177 -#define TK_IF_NULL_ROW 178 -#define TK_ASTERISK 179 -#define TK_SPAN 180 -#define TK_ERROR 181 -#define TK_SPACE 182 -#define TK_ILLEGAL 183 +#define TK_PTR 112 +#define TK_COLLATE 113 +#define TK_BITNOT 114 +#define TK_ON 115 +#define TK_INDEXED 116 +#define TK_STRING 117 +#define TK_JOIN_KW 118 +#define TK_CONSTRAINT 119 +#define TK_DEFAULT 120 +#define TK_NULL 121 +#define TK_PRIMARY 122 +#define TK_UNIQUE 123 +#define TK_CHECK 124 +#define TK_REFERENCES 125 +#define TK_AUTOINCR 126 +#define TK_INSERT 127 +#define TK_DELETE 128 +#define TK_UPDATE 129 +#define TK_SET 130 +#define TK_DEFERRABLE 131 +#define TK_FOREIGN 132 +#define TK_DROP 133 +#define TK_UNION 134 +#define TK_ALL 135 +#define TK_EXCEPT 136 +#define TK_INTERSECT 137 +#define TK_SELECT 138 +#define TK_VALUES 139 +#define TK_DISTINCT 140 +#define TK_DOT 141 +#define TK_FROM 142 +#define TK_JOIN 143 +#define TK_USING 144 +#define TK_ORDER 145 +#define TK_GROUP 146 +#define TK_HAVING 147 +#define TK_LIMIT 148 +#define TK_WHERE 149 +#define TK_RETURNING 150 +#define TK_INTO 151 +#define TK_NOTHING 152 +#define TK_FLOAT 153 +#define TK_BLOB 154 +#define TK_INTEGER 155 +#define TK_VARIABLE 156 +#define TK_CASE 157 +#define TK_WHEN 158 +#define TK_THEN 159 +#define TK_ELSE 160 +#define TK_INDEX 161 +#define TK_ALTER 162 +#define TK_ADD 163 +#define TK_WINDOW 164 +#define TK_OVER 165 +#define TK_FILTER 166 +#define TK_COLUMN 167 +#define TK_AGG_FUNCTION 168 +#define TK_AGG_COLUMN 169 +#define TK_TRUEFALSE 170 +#define TK_ISNOT 171 +#define TK_FUNCTION 172 +#define TK_UMINUS 173 +#define TK_UPLUS 174 +#define TK_TRUTH 175 +#define TK_REGISTER 176 +#define TK_VECTOR 177 +#define TK_SELECT_COLUMN 178 +#define TK_IF_NULL_ROW 179 +#define TK_ASTERISK 180 +#define TK_SPAN 181 +#define TK_ERROR 182 +#define TK_SPACE 183 +#define TK_ILLEGAL 184 /************** End of parse.h ***********************************************/ /************** Continuing where we left off in sqliteInt.h ******************/ @@ -14334,10 +14649,11 @@ typedef struct With With; /* ** A bit in a Bitmask */ -#define MASKBIT(n) (((Bitmask)1)<<(n)) -#define MASKBIT64(n) (((u64)1)<<(n)) -#define MASKBIT32(n) (((unsigned int)1)<<(n)) -#define ALLBITS ((Bitmask)-1) +#define MASKBIT(n) (((Bitmask)1)<<(n)) +#define MASKBIT64(n) (((u64)1)<<(n)) +#define MASKBIT32(n) (((unsigned int)1)<<(n)) +#define SMASKBIT32(n) ((n)<=31?((unsigned int)1)<<(n):0) +#define ALLBITS ((Bitmask)-1) /* A VList object records a mapping between parameters/variables/wildcards ** in the SQL statement (such as $abc, @pqr, or :xyz) and the integer @@ -15253,45 +15569,45 @@ typedef struct VdbeOpList VdbeOpList; #define OP_DecrJumpZero 60 /* jump, synopsis: if (--r[P1])==0 goto P2 */ #define OP_IncrVacuum 61 /* jump */ #define OP_VNext 62 /* jump */ -#define OP_Init 63 /* jump, synopsis: Start at P2 */ -#define OP_PureFunc 64 /* synopsis: r[P3]=func(r[P2@NP]) */ -#define OP_Function 65 /* synopsis: r[P3]=func(r[P2@NP]) */ -#define OP_Return 66 -#define OP_EndCoroutine 67 -#define OP_HaltIfNull 68 /* synopsis: if r[P3]=null halt */ -#define OP_Halt 69 -#define OP_Integer 70 /* synopsis: r[P2]=P1 */ -#define OP_Int64 71 /* synopsis: r[P2]=P4 */ -#define OP_String 72 /* synopsis: r[P2]='P4' (len=P1) */ -#define OP_Null 73 /* synopsis: r[P2..P3]=NULL */ -#define OP_SoftNull 74 /* synopsis: r[P1]=NULL */ -#define OP_Blob 75 /* synopsis: r[P2]=P4 (len=P1) */ -#define OP_Variable 76 /* synopsis: r[P2]=parameter(P1,P4) */ -#define OP_Move 77 /* synopsis: r[P2@P3]=r[P1@P3] */ -#define OP_Copy 78 /* synopsis: r[P2@P3+1]=r[P1@P3+1] */ -#define OP_SCopy 79 /* synopsis: r[P2]=r[P1] */ -#define OP_IntCopy 80 /* synopsis: r[P2]=r[P1] */ -#define OP_ChngCntRow 81 /* synopsis: output=r[P1] */ -#define OP_ResultRow 82 /* synopsis: output=r[P1@P2] */ -#define OP_CollSeq 83 -#define OP_AddImm 84 /* synopsis: r[P1]=r[P1]+P2 */ -#define OP_RealAffinity 85 -#define OP_Cast 86 /* synopsis: affinity(r[P1]) */ -#define OP_Permutation 87 -#define OP_Compare 88 /* synopsis: r[P1@P3] <-> r[P2@P3] */ -#define OP_IsTrue 89 /* synopsis: r[P2] = coalesce(r[P1]==TRUE,P3) ^ P4 */ -#define OP_ZeroOrNull 90 /* synopsis: r[P2] = 0 OR NULL */ -#define OP_Offset 91 /* synopsis: r[P3] = sqlite_offset(P1) */ -#define OP_Column 92 /* synopsis: r[P3]=PX */ -#define OP_TypeCheck 93 /* synopsis: typecheck(r[P1@P2]) */ -#define OP_Affinity 94 /* synopsis: affinity(r[P1@P2]) */ -#define OP_MakeRecord 95 /* synopsis: r[P3]=mkrec(r[P1@P2]) */ -#define OP_Count 96 /* synopsis: r[P2]=count() */ -#define OP_ReadCookie 97 -#define OP_SetCookie 98 -#define OP_ReopenIdx 99 /* synopsis: root=P2 iDb=P3 */ -#define OP_OpenRead 100 /* synopsis: root=P2 iDb=P3 */ -#define OP_OpenWrite 101 /* synopsis: root=P2 iDb=P3 */ +#define OP_Filter 63 /* jump, synopsis: if key(P3@P4) not in filter(P1) goto P2 */ +#define OP_Init 64 /* jump, synopsis: Start at P2 */ +#define OP_PureFunc 65 /* synopsis: r[P3]=func(r[P2@NP]) */ +#define OP_Function 66 /* synopsis: r[P3]=func(r[P2@NP]) */ +#define OP_Return 67 +#define OP_EndCoroutine 68 +#define OP_HaltIfNull 69 /* synopsis: if r[P3]=null halt */ +#define OP_Halt 70 +#define OP_Integer 71 /* synopsis: r[P2]=P1 */ +#define OP_Int64 72 /* synopsis: r[P2]=P4 */ +#define OP_String 73 /* synopsis: r[P2]='P4' (len=P1) */ +#define OP_Null 74 /* synopsis: r[P2..P3]=NULL */ +#define OP_SoftNull 75 /* synopsis: r[P1]=NULL */ +#define OP_Blob 76 /* synopsis: r[P2]=P4 (len=P1) */ +#define OP_Variable 77 /* synopsis: r[P2]=parameter(P1,P4) */ +#define OP_Move 78 /* synopsis: r[P2@P3]=r[P1@P3] */ +#define OP_Copy 79 /* synopsis: r[P2@P3+1]=r[P1@P3+1] */ +#define OP_SCopy 80 /* synopsis: r[P2]=r[P1] */ +#define OP_IntCopy 81 /* synopsis: r[P2]=r[P1] */ +#define OP_FkCheck 82 +#define OP_ResultRow 83 /* synopsis: output=r[P1@P2] */ +#define OP_CollSeq 84 +#define OP_AddImm 85 /* synopsis: r[P1]=r[P1]+P2 */ +#define OP_RealAffinity 86 +#define OP_Cast 87 /* synopsis: affinity(r[P1]) */ +#define OP_Permutation 88 +#define OP_Compare 89 /* synopsis: r[P1@P3] <-> r[P2@P3] */ +#define OP_IsTrue 90 /* synopsis: r[P2] = coalesce(r[P1]==TRUE,P3) ^ P4 */ +#define OP_ZeroOrNull 91 /* synopsis: r[P2] = 0 OR NULL */ +#define OP_Offset 92 /* synopsis: r[P3] = sqlite_offset(P1) */ +#define OP_Column 93 /* synopsis: r[P3]=PX */ +#define OP_TypeCheck 94 /* synopsis: typecheck(r[P1@P2]) */ +#define OP_Affinity 95 /* synopsis: affinity(r[P1@P2]) */ +#define OP_MakeRecord 96 /* synopsis: r[P3]=mkrec(r[P1@P2]) */ +#define OP_Count 97 /* synopsis: r[P2]=count() */ +#define OP_ReadCookie 98 +#define OP_SetCookie 99 +#define OP_ReopenIdx 100 /* synopsis: root=P2 iDb=P3 */ +#define OP_OpenRead 101 /* synopsis: root=P2 iDb=P3 */ #define OP_BitAnd 102 /* same as TK_BITAND, synopsis: r[P3]=r[P1]&r[P2] */ #define OP_BitOr 103 /* same as TK_BITOR, synopsis: r[P3]=r[P1]|r[P2] */ #define OP_ShiftLeft 104 /* same as TK_LSHIFT, synopsis: r[P3]=r[P2]<0 then r[P2]=r[P1]+max(0,r[P3]) else r[P2]=(-1) */ -#define OP_AggInverse 159 /* synopsis: accum=r[P3] inverse(r[P2@P5]) */ -#define OP_AggStep 160 /* synopsis: accum=r[P3] step(r[P2@P5]) */ -#define OP_AggStep1 161 /* synopsis: accum=r[P3] step(r[P2@P5]) */ -#define OP_AggValue 162 /* synopsis: r[P3]=value N=P2 */ -#define OP_AggFinal 163 /* synopsis: accum=r[P1] N=P2 */ -#define OP_Expire 164 -#define OP_CursorLock 165 -#define OP_CursorUnlock 166 -#define OP_TableLock 167 /* synopsis: iDb=P1 root=P2 write=P3 */ -#define OP_VBegin 168 -#define OP_VCreate 169 -#define OP_VDestroy 170 -#define OP_VOpen 171 -#define OP_VColumn 172 /* synopsis: r[P3]=vcolumn(P2) */ -#define OP_VRename 173 -#define OP_Pagecount 174 -#define OP_MaxPgcnt 175 -#define OP_Trace 176 -#define OP_CursorHint 177 -#define OP_ReleaseReg 178 /* synopsis: release r[P1@P2] mask P3 */ -#define OP_Noop 179 -#define OP_Explain 180 -#define OP_Abortable 181 +#define OP_OpenWrite 112 /* synopsis: root=P2 iDb=P3 */ +#define OP_OpenDup 113 +#define OP_BitNot 114 /* same as TK_BITNOT, synopsis: r[P2]= ~r[P1] */ +#define OP_OpenAutoindex 115 /* synopsis: nColumn=P2 */ +#define OP_OpenEphemeral 116 /* synopsis: nColumn=P2 */ +#define OP_String8 117 /* same as TK_STRING, synopsis: r[P2]='P4' */ +#define OP_SorterOpen 118 +#define OP_SequenceTest 119 /* synopsis: if( cursor[P1].ctr++ ) pc = P2 */ +#define OP_OpenPseudo 120 /* synopsis: P3 columns in r[P2] */ +#define OP_Close 121 +#define OP_ColumnsUsed 122 +#define OP_SeekScan 123 /* synopsis: Scan-ahead up to P1 rows */ +#define OP_SeekHit 124 /* synopsis: set P2<=seekHit<=P3 */ +#define OP_Sequence 125 /* synopsis: r[P2]=cursor[P1].ctr++ */ +#define OP_NewRowid 126 /* synopsis: r[P2]=rowid */ +#define OP_Insert 127 /* synopsis: intkey=r[P3] data=r[P2] */ +#define OP_RowCell 128 +#define OP_Delete 129 +#define OP_ResetCount 130 +#define OP_SorterCompare 131 /* synopsis: if key(P1)!=trim(r[P3],P4) goto P2 */ +#define OP_SorterData 132 /* synopsis: r[P2]=data */ +#define OP_RowData 133 /* synopsis: r[P2]=data */ +#define OP_Rowid 134 /* synopsis: r[P2]=rowid */ +#define OP_NullRow 135 +#define OP_SeekEnd 136 +#define OP_IdxInsert 137 /* synopsis: key=r[P2] */ +#define OP_SorterInsert 138 /* synopsis: key=r[P2] */ +#define OP_IdxDelete 139 /* synopsis: key=r[P2@P3] */ +#define OP_DeferredSeek 140 /* synopsis: Move P3 to P1.rowid if needed */ +#define OP_IdxRowid 141 /* synopsis: r[P2]=rowid */ +#define OP_FinishSeek 142 +#define OP_Destroy 143 +#define OP_Clear 144 +#define OP_ResetSorter 145 +#define OP_CreateBtree 146 /* synopsis: r[P2]=root iDb=P1 flags=P3 */ +#define OP_SqlExec 147 +#define OP_ParseSchema 148 +#define OP_LoadAnalysis 149 +#define OP_DropTable 150 +#define OP_DropIndex 151 +#define OP_DropTrigger 152 +#define OP_Real 153 /* same as TK_FLOAT, synopsis: r[P2]=P4 */ +#define OP_IntegrityCk 154 +#define OP_RowSetAdd 155 /* synopsis: rowset(P1)=r[P2] */ +#define OP_Param 156 +#define OP_FkCounter 157 /* synopsis: fkctr[P1]+=P2 */ +#define OP_MemMax 158 /* synopsis: r[P1]=max(r[P1],r[P2]) */ +#define OP_OffsetLimit 159 /* synopsis: if r[P1]>0 then r[P2]=r[P1]+max(0,r[P3]) else r[P2]=(-1) */ +#define OP_AggInverse 160 /* synopsis: accum=r[P3] inverse(r[P2@P5]) */ +#define OP_AggStep 161 /* synopsis: accum=r[P3] step(r[P2@P5]) */ +#define OP_AggStep1 162 /* synopsis: accum=r[P3] step(r[P2@P5]) */ +#define OP_AggValue 163 /* synopsis: r[P3]=value N=P2 */ +#define OP_AggFinal 164 /* synopsis: accum=r[P1] N=P2 */ +#define OP_Expire 165 +#define OP_CursorLock 166 +#define OP_CursorUnlock 167 +#define OP_TableLock 168 /* synopsis: iDb=P1 root=P2 write=P3 */ +#define OP_VBegin 169 +#define OP_VCreate 170 +#define OP_VDestroy 171 +#define OP_VOpen 172 +#define OP_VInitIn 173 /* synopsis: r[P2]=ValueList(P1,P3) */ +#define OP_VColumn 174 /* synopsis: r[P3]=vcolumn(P2) */ +#define OP_VRename 175 +#define OP_Pagecount 176 +#define OP_MaxPgcnt 177 +#define OP_FilterAdd 178 /* synopsis: filter(P1) += key(P3@P4) */ +#define OP_Trace 179 +#define OP_CursorHint 180 +#define OP_ReleaseReg 181 /* synopsis: release r[P1@P2] mask P3 */ +#define OP_Noop 182 +#define OP_Explain 183 +#define OP_Abortable 184 /* Properties such as "out2" or "jump" that are specified in ** comments following the "case" for each opcode in the vdbe.c @@ -15392,21 +15711,22 @@ typedef struct VdbeOpList VdbeOpList; /* 40 */ 0x01, 0x01, 0x01, 0x26, 0x26, 0x23, 0x0b, 0x01,\ /* 48 */ 0x01, 0x03, 0x03, 0x03, 0x0b, 0x0b, 0x0b, 0x0b,\ /* 56 */ 0x0b, 0x0b, 0x01, 0x03, 0x03, 0x01, 0x01, 0x01,\ -/* 64 */ 0x00, 0x00, 0x02, 0x02, 0x08, 0x00, 0x10, 0x10,\ -/* 72 */ 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x00, 0x10,\ -/* 80 */ 0x10, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x00,\ -/* 88 */ 0x00, 0x12, 0x1e, 0x20, 0x00, 0x00, 0x00, 0x00,\ -/* 96 */ 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x26, 0x26,\ +/* 64 */ 0x01, 0x00, 0x00, 0x02, 0x02, 0x08, 0x00, 0x10,\ +/* 72 */ 0x10, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x00,\ +/* 80 */ 0x10, 0x10, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02,\ +/* 88 */ 0x00, 0x00, 0x12, 0x1e, 0x20, 0x00, 0x00, 0x00,\ +/* 96 */ 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x26, 0x26,\ /* 104 */ 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26,\ -/* 112 */ 0x00, 0x12, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,\ -/* 120 */ 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00,\ -/* 128 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,\ -/* 136 */ 0x04, 0x04, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00,\ -/* 144 */ 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\ -/* 152 */ 0x10, 0x00, 0x06, 0x10, 0x00, 0x04, 0x1a, 0x00,\ +/* 112 */ 0x00, 0x00, 0x12, 0x00, 0x00, 0x10, 0x00, 0x00,\ +/* 120 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00,\ +/* 128 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00,\ +/* 136 */ 0x00, 0x04, 0x04, 0x00, 0x00, 0x10, 0x00, 0x10,\ +/* 144 */ 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,\ +/* 152 */ 0x00, 0x10, 0x00, 0x06, 0x10, 0x00, 0x04, 0x1a,\ /* 160 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\ -/* 168 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10,\ -/* 176 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,} +/* 168 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,\ +/* 176 */ 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\ +/* 184 */ 0x00,} /* The resolve3P2Values() routine is able to run faster if it knows ** the value of the largest JUMP opcode. The smaller the maximum @@ -15414,7 +15734,7 @@ typedef struct VdbeOpList VdbeOpList; ** generated this include file strives to group all JUMP opcodes ** together near the beginning of the list. */ -#define SQLITE_MX_JUMP_OPCODE 63 /* Maximum JUMP opcode */ +#define SQLITE_MX_JUMP_OPCODE 64 /* Maximum JUMP opcode */ /************** End of opcodes.h *********************************************/ /************** Continuing where we left off in vdbe.h ***********************/ @@ -16475,6 +16795,7 @@ struct sqlite3 { u32 nSchemaLock; /* Do not reset the schema when non-zero */ unsigned int openFlags; /* Flags passed to sqlite3_vfs.xOpen() */ int errCode; /* Most recent error code (SQLITE_*) */ + int errByteOffset; /* Byte offset of error in SQL statement */ int errMask; /* & result codes with this before returning */ int iSysErrno; /* Errno value from last system error */ u32 dbOptFlags; /* Flags to enable/disable optimizations */ @@ -16709,6 +17030,9 @@ struct sqlite3 { #define SQLITE_SeekScan 0x00020000 /* The OP_SeekScan optimization */ #define SQLITE_OmitOrderBy 0x00040000 /* Omit pointless ORDER BY */ /* TH3 expects this value ^^^^^^^^^^ to be 0x40000. Coordinate any change */ +#define SQLITE_BloomFilter 0x00080000 /* Use a Bloom filter on searches */ +#define SQLITE_BloomPulldown 0x00100000 /* Run Bloom filters early */ +#define SQLITE_BalancedMerge 0x00200000 /* Balance multi-way merges */ #define SQLITE_AllOpts 0xffffffff /* All optimizations */ /* @@ -16882,7 +17206,7 @@ struct FuncDestructor { ** are interpreted in the same way as the first 4 parameters to ** FUNCTION(). ** -** WFUNCTION(zName, nArg, iArg, xStep, xFinal, xValue, xInverse) +** WAGGREGATE(zName, nArg, iArg, xStep, xFinal, xValue, xInverse) ** Used to create an aggregate function definition implemented by ** the C functions xStep and xFinal. The first four parameters ** are interpreted in the same way as the first 4 parameters to @@ -16909,6 +17233,10 @@ struct FuncDestructor { #define MFUNCTION(zName, nArg, xPtr, xFunc) \ {nArg, SQLITE_FUNC_BUILTIN|SQLITE_FUNC_CONSTANT|SQLITE_UTF8, \ xPtr, 0, xFunc, 0, 0, 0, #zName, {0} } +#define JFUNCTION(zName, nArg, iArg, xFunc) \ + {nArg, SQLITE_FUNC_BUILTIN|SQLITE_DETERMINISTIC|SQLITE_INNOCUOUS|\ + SQLITE_FUNC_CONSTANT|SQLITE_UTF8, \ + SQLITE_INT_TO_PTR(iArg), 0, xFunc, 0, 0, 0, #zName, {0} } #define INLINE_FUNC(zName, nArg, iArg, mFlags) \ {nArg, SQLITE_FUNC_BUILTIN|\ SQLITE_UTF8|SQLITE_FUNC_INLINE|SQLITE_FUNC_CONSTANT|(mFlags), \ @@ -17763,7 +18091,10 @@ struct Expr { ** TK_VARIABLE: variable number (always >= 1). ** TK_SELECT_COLUMN: column of the result vector */ i16 iAgg; /* Which entry in pAggInfo->aCol[] or ->aFunc[] */ - int iRightJoinTable; /* If EP_FromJoin, the right table of the join */ + union { + int iRightJoinTable; /* If EP_FromJoin, the right table of the join */ + int iOfst; /* else: start of token from start of statement */ + } w; AggInfo *pAggInfo; /* Used by TK_AGG_COLUMN and TK_AGG_FUNCTION */ union { Table *pTab; /* TK_COLUMN: Table containing column. Can be NULL @@ -18525,6 +18856,7 @@ struct Parse { **************************************************************************/ int aTempReg[8]; /* Holding area for temporary registers */ + Parse *pOuterParse; /* Outer Parse object when nested */ Token sNameToken; /* Token with unqualified schema object name */ /************************************************************************ @@ -18575,7 +18907,8 @@ struct Parse { /* ** Sizes and pointers of various parts of the Parse object. */ -#define PARSE_HDR_SZ offsetof(Parse,aTempReg) /* Recursive part w/o aColCache*/ +#define PARSE_HDR(X) (((char*)(X))+offsetof(Parse,zErrMsg)) +#define PARSE_HDR_SZ (offsetof(Parse,aTempReg)-offsetof(Parse,zErrMsg)) /* Recursive part w/o aColCache*/ #define PARSE_RECURSE_SZ offsetof(Parse,sLastToken) /* Recursive part */ #define PARSE_TAIL_SZ (sizeof(Parse)-PARSE_RECURSE_SZ) /* Non-recursive part */ #define PARSE_TAIL(X) (((char*)(X))+PARSE_RECURSE_SZ) /* Pointer to tail */ @@ -18870,6 +19203,7 @@ struct Sqlite3Config { int (*xTestCallback)(int); /* Invoked by sqlite3FaultSim() */ #endif int bLocaltimeFault; /* True to fail localtime() calls */ + int (*xAltLocaltime)(const void*,void*); /* Alternative localtime() routine */ int iOnceResetThreshold; /* When to reset OP_Once counters */ u32 szSorterRef; /* Min size in bytes to use sorter-refs */ unsigned int iPrngSeed; /* Alternative fixed seed for the PRNG */ @@ -19350,7 +19684,7 @@ SQLITE_PRIVATE void sqlite3DequoteExpr(Expr*); SQLITE_PRIVATE void sqlite3DequoteToken(Token*); SQLITE_PRIVATE void sqlite3TokenInit(Token*,char*); SQLITE_PRIVATE int sqlite3KeywordCode(const unsigned char*, int); -SQLITE_PRIVATE int sqlite3RunParser(Parse*, const char*, char **); +SQLITE_PRIVATE int sqlite3RunParser(Parse*, const char*); SQLITE_PRIVATE void sqlite3FinishCoding(Parse*); SQLITE_PRIVATE int sqlite3GetTempReg(Parse*); SQLITE_PRIVATE void sqlite3ReleaseTempReg(Parse*,int); @@ -19511,10 +19845,12 @@ SQLITE_PRIVATE void sqlite3OpenTable(Parse*, int iCur, int iDb, Table*, int); #if defined(SQLITE_ENABLE_UPDATE_DELETE_LIMIT) && !defined(SQLITE_OMIT_SUBQUERY) SQLITE_PRIVATE Expr *sqlite3LimitWhere(Parse*,SrcList*,Expr*,ExprList*,Expr*,char*); #endif +SQLITE_PRIVATE void sqlite3CodeChangeCount(Vdbe*,int,const char*); SQLITE_PRIVATE void sqlite3DeleteFrom(Parse*, SrcList*, Expr*, ExprList*, Expr*); SQLITE_PRIVATE void sqlite3Update(Parse*, SrcList*, ExprList*,Expr*,int,ExprList*,Expr*, Upsert*); -SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin(Parse*,SrcList*,Expr*,ExprList*,ExprList*,u16,int); +SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin(Parse*,SrcList*,Expr*,ExprList*, + ExprList*,Select*,u16,int); SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo*); SQLITE_PRIVATE LogEst sqlite3WhereOutputRowCount(WhereInfo*); SQLITE_PRIVATE int sqlite3WhereIsDistinct(WhereInfo*); @@ -19629,9 +19965,14 @@ SQLITE_PRIVATE Select *sqlite3SelectDup(sqlite3*,const Select*,int); SQLITE_PRIVATE FuncDef *sqlite3FunctionSearch(int,const char*); SQLITE_PRIVATE void sqlite3InsertBuiltinFuncs(FuncDef*,int); SQLITE_PRIVATE FuncDef *sqlite3FindFunction(sqlite3*,const char*,int,u8,u8); +SQLITE_PRIVATE void sqlite3QuoteValue(StrAccum*,sqlite3_value*); SQLITE_PRIVATE void sqlite3RegisterBuiltinFunctions(void); SQLITE_PRIVATE void sqlite3RegisterDateTimeFunctions(void); +SQLITE_PRIVATE void sqlite3RegisterJsonFunctions(void); SQLITE_PRIVATE void sqlite3RegisterPerConnectionBuiltinFunctions(sqlite3*); +#if !defined(SQLITE_OMIT_VIRTUALTABLE) && !defined(SQLITE_OMIT_JSON) +SQLITE_PRIVATE int sqlite3JsonTableFunctions(sqlite3*); +#endif SQLITE_PRIVATE int sqlite3SafetyCheckOk(sqlite3*); SQLITE_PRIVATE int sqlite3SafetyCheckSickOrOk(sqlite3*); SQLITE_PRIVATE void sqlite3ChangeCookie(Parse*, int); @@ -19721,14 +20062,8 @@ SQLITE_PRIVATE int sqlite3Utf8CharLen(const char *pData, int nByte); SQLITE_PRIVATE u32 sqlite3Utf8Read(const u8**); SQLITE_PRIVATE LogEst sqlite3LogEst(u64); SQLITE_PRIVATE LogEst sqlite3LogEstAdd(LogEst,LogEst); -#ifndef SQLITE_OMIT_VIRTUALTABLE SQLITE_PRIVATE LogEst sqlite3LogEstFromDouble(double); -#endif -#if defined(SQLITE_ENABLE_STMT_SCANSTATUS) || \ - defined(SQLITE_ENABLE_STAT4) || \ - defined(SQLITE_EXPLAIN_ESTIMATED_ROWS) SQLITE_PRIVATE u64 sqlite3LogEstToInt(LogEst); -#endif SQLITE_PRIVATE VList *sqlite3VListAdd(sqlite3*,VList*,const char*,int,int); SQLITE_PRIVATE const char *sqlite3VListNumToName(VList*,int); SQLITE_PRIVATE int sqlite3VListNameToNum(VList*,const char*,int); @@ -19915,17 +20250,20 @@ SQLITE_PRIVATE int sqlite3CreateFunc(sqlite3 *, const char *, int, int, void *, FuncDestructor *pDestructor ); SQLITE_PRIVATE void sqlite3NoopDestructor(void*); -SQLITE_PRIVATE void sqlite3OomFault(sqlite3*); +SQLITE_PRIVATE void *sqlite3OomFault(sqlite3*); SQLITE_PRIVATE void sqlite3OomClear(sqlite3*); SQLITE_PRIVATE int sqlite3ApiExit(sqlite3 *db, int); SQLITE_PRIVATE int sqlite3OpenTempDatabase(Parse *); SQLITE_PRIVATE void sqlite3StrAccumInit(StrAccum*, sqlite3*, char*, int, int); +SQLITE_PRIVATE int sqlite3StrAccumEnlarge(StrAccum*, int); SQLITE_PRIVATE char *sqlite3StrAccumFinish(StrAccum*); SQLITE_PRIVATE void sqlite3StrAccumSetError(StrAccum*, u8); SQLITE_PRIVATE void sqlite3ResultStrAccum(sqlite3_context*,StrAccum*); SQLITE_PRIVATE void sqlite3SelectDestInit(SelectDest*,int,int); SQLITE_PRIVATE Expr *sqlite3CreateColumnExpr(sqlite3 *, SrcList *, int, int); +SQLITE_PRIVATE void sqlite3RecordErrorByteOffset(sqlite3*,const char*); +SQLITE_PRIVATE void sqlite3RecordErrorOffsetOfExpr(sqlite3*,const Expr*); SQLITE_PRIVATE void sqlite3BackupRestart(sqlite3_backup *); SQLITE_PRIVATE void sqlite3BackupUpdate(sqlite3_backup *, Pgno, const u8 *); @@ -20030,11 +20368,17 @@ SQLITE_PRIVATE int sqlite3VtabCallCreate(sqlite3*, int, const char *, char **); SQLITE_PRIVATE int sqlite3VtabCallConnect(Parse*, Table*); SQLITE_PRIVATE int sqlite3VtabCallDestroy(sqlite3*, int, const char *); SQLITE_PRIVATE int sqlite3VtabBegin(sqlite3 *, VTable *); + SQLITE_PRIVATE FuncDef *sqlite3VtabOverloadFunction(sqlite3 *,FuncDef*, int nArg, Expr*); +#if (defined(SQLITE_ENABLE_DBPAGE_VTAB) || defined(SQLITE_TEST)) \ + && !defined(SQLITE_OMIT_VIRTUALTABLE) +SQLITE_PRIVATE void sqlite3VtabWriteAll(sqlite3_index_info*); +#endif SQLITE_PRIVATE sqlite3_int64 sqlite3StmtCurrentTime(sqlite3_context*); SQLITE_PRIVATE int sqlite3VdbeParameterIndex(Vdbe*, const char*, int); SQLITE_PRIVATE int sqlite3TransferBindings(sqlite3_stmt *, sqlite3_stmt *); -SQLITE_PRIVATE void sqlite3ParserReset(Parse*); +SQLITE_PRIVATE void sqlite3ParseObjectInit(Parse*,sqlite3*); +SQLITE_PRIVATE void sqlite3ParseObjectReset(Parse*); SQLITE_PRIVATE void *sqlite3ParserAddCleanup(Parse*,void(*)(sqlite3*,void*),void*); #ifdef SQLITE_ENABLE_NORMALIZE SQLITE_PRIVATE char *sqlite3Normalize(Vdbe*, const char*); @@ -20467,6 +20811,14 @@ SQLITE_API extern int sqlite3_open_file_count; /************** End of os_common.h *******************************************/ /************** Begin file ctime.c *******************************************/ +/* DO NOT EDIT! +** This file is automatically generated by the script in the canonical +** SQLite source tree at tool/mkctimec.tcl. +** +** To modify this header, edit any of the various lists in that script +** which specify categories of generated conditionals in this file. +*/ + /* ** 2010 February 23 ** @@ -20515,9 +20867,6 @@ SQLITE_API extern int sqlite3_open_file_count; */ static const char * const sqlite3azCompileOpt[] = { -/* -** BEGIN CODE GENERATED BY tool/mkctime.tcl -*/ #ifdef SQLITE_32BIT_ROWID "32BIT_ROWID", #endif @@ -20726,9 +21075,6 @@ static const char * const sqlite3azCompileOpt[] = { #ifdef SQLITE_ENABLE_IOTRACE "ENABLE_IOTRACE", #endif -#ifdef SQLITE_ENABLE_JSON1 - "ENABLE_JSON1", -#endif #ifdef SQLITE_ENABLE_LOAD_EXTENSION "ENABLE_LOAD_EXTENSION", #endif @@ -21052,6 +21398,9 @@ static const char * const sqlite3azCompileOpt[] = { #ifdef SQLITE_OMIT_INTROSPECTION_PRAGMAS "OMIT_INTROSPECTION_PRAGMAS", #endif +#ifdef SQLITE_OMIT_JSON + "OMIT_JSON", +#endif #ifdef SQLITE_OMIT_LIKE_OPTIMIZATION "OMIT_LIKE_OPTIMIZATION", #endif @@ -21240,10 +21589,8 @@ static const char * const sqlite3azCompileOpt[] = { #ifdef SQLITE_ZERO_MALLOC "ZERO_MALLOC", #endif -/* -** END CODE GENERATED BY tool/mkctime.tcl -*/ -}; + +} ; SQLITE_PRIVATE const char **sqlite3CompileOptions(int *pnOpt){ *pnOpt = sizeof(sqlite3azCompileOpt) / sizeof(sqlite3azCompileOpt[0]); @@ -21542,6 +21889,7 @@ SQLITE_PRIVATE SQLITE_WSD struct Sqlite3Config sqlite3Config = { 0, /* xTestCallback */ #endif 0, /* bLocaltimeFault */ + 0, /* xAltLocaltime */ 0x7ffffffe, /* iOnceResetThreshold */ SQLITE_DEFAULT_SORTERREF_SIZE, /* szSorterRef */ 0, /* iPrngSeed */ @@ -21755,7 +22103,7 @@ typedef struct AuxData AuxData; typedef struct VdbeCursor VdbeCursor; struct VdbeCursor { u8 eCurType; /* One of the CURTYPE_* values above */ - i8 iDb; /* Index of cursor database in db->aDb[] (or -1) */ + i8 iDb; /* Index of cursor database in db->aDb[] */ u8 nullRow; /* True if pointing to a row with no data */ u8 deferredMoveto; /* A call to sqlite3BtreeMoveto() is needed */ u8 isTable; /* True for rowid tables. False for indexes */ @@ -21768,9 +22116,11 @@ struct VdbeCursor { Bool isOrdered:1; /* True if the table is not BTREE_UNORDERED */ Bool hasBeenDuped:1; /* This cursor was source or target of OP_OpenDup */ u16 seekHit; /* See the OP_SeekHit and OP_IfNoHope opcodes */ - Btree *pBtx; /* Separate file holding temporary table */ + union { /* pBtx for isEphermeral. pAltMap otherwise */ + Btree *pBtx; /* Separate file holding temporary table */ + u32 *aAltMap; /* Mapping from table to index column numbers */ + } ub; i64 seqCount; /* Sequence counter */ - u32 *aAltMap; /* Mapping from table to index column numbers */ /* Cached OP_Column parse information is only valid if cacheStatus matches ** Vdbe.cacheCtr. Vdbe.cacheCtr will never take on the value of @@ -22110,7 +22460,7 @@ struct Vdbe { bft bIsReader:1; /* True for statements that read */ yDbMask btreeMask; /* Bitmask of db->aDb[] entries referenced */ yDbMask lockMask; /* Subset of btreeMask that requires a lock */ - u32 aCounter[7]; /* Counters used by sqlite3_stmt_status() */ + u32 aCounter[9]; /* Counters used by sqlite3_stmt_status() */ char *zSql; /* Text of the SQL statement that generated this */ #ifdef SQLITE_ENABLE_NORMALIZE char *zNormSql; /* Normalization of the associated SQL statement */ @@ -22160,6 +22510,24 @@ struct PreUpdate { Index *pPk; /* PK index if pTab is WITHOUT ROWID */ }; +/* +** An instance of this object is used to pass an vector of values into +** OP_VFilter, the xFilter method of a virtual table. The vector is the +** set of values on the right-hand side of an IN constraint. +** +** The value as passed into xFilter is an sqlite3_value with a "pointer" +** type, such as is generated by sqlite3_result_pointer() and read by +** sqlite3_value_pointer. Such values have MEM_Term|MEM_Subtype|MEM_Null +** and a subtype of 'p'. The sqlite3_vtab_in_first() and _next() interfaces +** know how to use this object to step through all the values in the +** right operand of the IN constraint. +*/ +typedef struct ValueList ValueList; +struct ValueList { + BtCursor *pCsr; /* An ephemeral table holding all values */ + sqlite3_value *pOut; /* Register to hold each decoded output value */ +}; + /* ** Function prototypes */ @@ -22172,7 +22540,7 @@ SQLITE_PRIVATE int sqlite3VdbeCursorRestore(VdbeCursor*); SQLITE_PRIVATE u32 sqlite3VdbeSerialTypeLen(u32); SQLITE_PRIVATE u8 sqlite3VdbeOneByteSerialTypeLen(u8); SQLITE_PRIVATE u32 sqlite3VdbeSerialPut(unsigned char*, Mem*, u32); -SQLITE_PRIVATE u32 sqlite3VdbeSerialGet(const unsigned char*, u32, Mem*); +SQLITE_PRIVATE void sqlite3VdbeSerialGet(const unsigned char*, u32, Mem*); SQLITE_PRIVATE void sqlite3VdbeDeleteAuxData(sqlite3*, AuxData**, int, int); int sqlite2BtreeKeyCompare(BtCursor *, const void *, int, int, int *); @@ -22218,7 +22586,7 @@ SQLITE_PRIVATE int sqlite3VdbeMemSetRowSet(Mem*); SQLITE_PRIVATE int sqlite3VdbeMemMakeWriteable(Mem*); SQLITE_PRIVATE int sqlite3VdbeMemStringify(Mem*, u8, u8); SQLITE_PRIVATE int sqlite3IntFloatCompare(i64,double); -SQLITE_PRIVATE i64 sqlite3VdbeIntValue(Mem*); +SQLITE_PRIVATE i64 sqlite3VdbeIntValue(const Mem*); SQLITE_PRIVATE int sqlite3VdbeMemIntegerify(Mem*); SQLITE_PRIVATE double sqlite3VdbeRealValue(Mem*); SQLITE_PRIVATE int sqlite3VdbeBooleanValue(Mem*, int ifNull); @@ -23196,8 +23564,10 @@ static void clearYMD_HMS_TZ(DateTime *p){ ** is available. This routine returns 0 on success and ** non-zero on any kind of error. ** -** If the sqlite3GlobalConfig.bLocaltimeFault variable is true then this -** routine will always fail. +** If the sqlite3GlobalConfig.bLocaltimeFault variable is non-zero then this +** routine will always fail. If bLocaltimeFault is nonzero and +** sqlite3GlobalConfig.xAltLocaltime is not NULL, then xAltLocaltime() is +** invoked in place of the OS-defined localtime() function. ** ** EVIDENCE-OF: R-62172-00036 In this implementation, the standard C ** library function localtime_r() is used to assist in the calculation of @@ -23213,14 +23583,30 @@ static int osLocaltime(time_t *t, struct tm *pTm){ sqlite3_mutex_enter(mutex); pX = localtime(t); #ifndef SQLITE_UNTESTABLE - if( sqlite3GlobalConfig.bLocaltimeFault ) pX = 0; + if( sqlite3GlobalConfig.bLocaltimeFault ){ + if( sqlite3GlobalConfig.xAltLocaltime!=0 + && 0==sqlite3GlobalConfig.xAltLocaltime((const void*)t,(void*)pTm) + ){ + pX = pTm; + }else{ + pX = 0; + } + } #endif if( pX ) *pTm = *pX; +#if SQLITE_THREADSAFE>0 sqlite3_mutex_leave(mutex); +#endif rc = pX==0; #else #ifndef SQLITE_UNTESTABLE - if( sqlite3GlobalConfig.bLocaltimeFault ) return 1; + if( sqlite3GlobalConfig.bLocaltimeFault ){ + if( sqlite3GlobalConfig.xAltLocaltime!=0 ){ + return sqlite3GlobalConfig.xAltLocaltime((const void*)t,(void*)pTm); + }else{ + return 1; + } + } #endif #if HAVE_LOCALTIME_R rc = localtime_r(t, pTm)==0; @@ -23235,67 +23621,56 @@ static int osLocaltime(time_t *t, struct tm *pTm){ #ifndef SQLITE_OMIT_LOCALTIME /* -** Compute the difference (in milliseconds) between localtime and UTC -** (a.k.a. GMT) for the time value p where p is in UTC. If no error occurs, -** return this value and set *pRc to SQLITE_OK. -** -** Or, if an error does occur, set *pRc to SQLITE_ERROR. The returned value -** is undefined in this case. +** Assuming the input DateTime is UTC, move it to its localtime equivalent. */ -static sqlite3_int64 localtimeOffset( - DateTime *p, /* Date at which to calculate offset */ - sqlite3_context *pCtx, /* Write error here if one occurs */ - int *pRc /* OUT: Error code. SQLITE_OK or ERROR */ +static int toLocaltime( + DateTime *p, /* Date at which to calculate offset */ + sqlite3_context *pCtx /* Write error here if one occurs */ ){ - DateTime x, y; time_t t; struct tm sLocal; + int iYearDiff; /* Initialize the contents of sLocal to avoid a compiler warning. */ memset(&sLocal, 0, sizeof(sLocal)); - x = *p; - computeYMD_HMS(&x); - if( x.Y<1971 || x.Y>=2038 ){ + computeJD(p); + if( p->iJD<2108667600*(i64)100000 /* 1970-01-01 */ + || p->iJD>2130141456*(i64)100000 /* 2038-01-18 */ + ){ /* EVIDENCE-OF: R-55269-29598 The localtime_r() C function normally only ** works for years between 1970 and 2037. For dates outside this range, ** SQLite attempts to map the year into an equivalent year within this ** range, do the calculation, then map the year back. */ - x.Y = 2000; - x.M = 1; - x.D = 1; - x.h = 0; - x.m = 0; - x.s = 0.0; - } else { - int s = (int)(x.s + 0.5); - x.s = s; + DateTime x = *p; + computeYMD_HMS(&x); + iYearDiff = (2000 + x.Y%4) - x.Y; + x.Y += iYearDiff; + x.validJD = 0; + computeJD(&x); + t = (time_t)(x.iJD/1000 - 21086676*(i64)10000); + }else{ + iYearDiff = 0; + t = (time_t)(p->iJD/1000 - 21086676*(i64)10000); } - x.tz = 0; - x.validJD = 0; - computeJD(&x); - t = (time_t)(x.iJD/1000 - 21086676*(i64)10000); if( osLocaltime(&t, &sLocal) ){ sqlite3_result_error(pCtx, "local time unavailable", -1); - *pRc = SQLITE_ERROR; - return 0; + return SQLITE_ERROR; } - y.Y = sLocal.tm_year + 1900; - y.M = sLocal.tm_mon + 1; - y.D = sLocal.tm_mday; - y.h = sLocal.tm_hour; - y.m = sLocal.tm_min; - y.s = sLocal.tm_sec; - y.validYMD = 1; - y.validHMS = 1; - y.validJD = 0; - y.rawS = 0; - y.validTZ = 0; - y.isError = 0; - computeJD(&y); - *pRc = SQLITE_OK; - return y.iJD - x.iJD; + p->Y = sLocal.tm_year + 1900 - iYearDiff; + p->M = sLocal.tm_mon + 1; + p->D = sLocal.tm_mday; + p->h = sLocal.tm_hour; + p->m = sLocal.tm_min; + p->s = sLocal.tm_sec + (p->iJD%1000)*0.001; + p->validYMD = 1; + p->validHMS = 1; + p->validJD = 0; + p->rawS = 0; + p->validTZ = 0; + p->isError = 0; + return SQLITE_OK; } #endif /* SQLITE_OMIT_LOCALTIME */ @@ -23308,18 +23683,17 @@ static sqlite3_int64 localtimeOffset( ** of several units of time. */ static const struct { - u8 eType; /* Transformation type code */ - u8 nName; /* Length of th name */ - char *zName; /* Name of the transformation */ - double rLimit; /* Maximum NNN value for this transform */ - double rXform; /* Constant used for this transform */ + u8 nName; /* Length of the name */ + char zName[7]; /* Name of the transformation */ + float rLimit; /* Maximum NNN value for this transform */ + float rXform; /* Constant used for this transform */ } aXformType[] = { - { 0, 6, "second", 464269060800.0, 1000.0 }, - { 0, 6, "minute", 7737817680.0, 60000.0 }, - { 0, 4, "hour", 128963628.0, 3600000.0 }, - { 0, 3, "day", 5373485.0, 86400000.0 }, - { 1, 5, "month", 176546.0, 2592000000.0 }, - { 2, 4, "year", 14713.0, 31536000000.0 }, + { 6, "second", 4.6427e+14, 1.0 }, + { 6, "minute", 7.7379e+12, 60.0 }, + { 4, "hour", 1.2897e+11, 3600.0 }, + { 3, "day", 5373485.0, 86400.0 }, + { 5, "month", 176546.0, 2592000.0 }, + { 4, "year", 14713.0, 31536000.0 }, }; /* @@ -23350,11 +23724,55 @@ static int parseModifier( sqlite3_context *pCtx, /* Function context */ const char *z, /* The text of the modifier */ int n, /* Length of zMod in bytes */ - DateTime *p /* The date/time value to be modified */ + DateTime *p, /* The date/time value to be modified */ + int idx /* Parameter index of the modifier */ ){ int rc = 1; double r; switch(sqlite3UpperToLower[(u8)z[0]] ){ + case 'a': { + /* + ** auto + ** + ** If rawS is available, then interpret as a julian day number, or + ** a unix timestamp, depending on its magnitude. + */ + if( sqlite3_stricmp(z, "auto")==0 ){ + if( idx>1 ) return 1; /* IMP: R-33611-57934 */ + if( !p->rawS || p->validJD ){ + rc = 0; + p->rawS = 0; + }else if( p->s>=-21086676*(i64)10000 /* -4713-11-24 12:00:00 */ + && p->s<=(25340230*(i64)10000)+799 /* 9999-12-31 23:59:59 */ + ){ + r = p->s*1000.0 + 210866760000000.0; + clearYMD_HMS_TZ(p); + p->iJD = (sqlite3_int64)(r + 0.5); + p->validJD = 1; + p->rawS = 0; + rc = 0; + } + } + break; + } + case 'j': { + /* + ** julianday + ** + ** Always interpret the prior number as a julian-day value. If this + ** is not the first modifier, or if the prior argument is not a numeric + ** value in the allowed range of julian day numbers understood by + ** SQLite (0..5373484.5) then the result will be NULL. + */ + if( sqlite3_stricmp(z, "julianday")==0 ){ + if( idx>1 ) return 1; /* IMP: R-31176-64601 */ + if( p->validJD && p->rawS ){ + rc = 0; + p->rawS = 0; + } + } + break; + } #ifndef SQLITE_OMIT_LOCALTIME case 'l': { /* localtime @@ -23363,9 +23781,7 @@ static int parseModifier( ** show local time. */ if( sqlite3_stricmp(z, "localtime")==0 && sqlite3NotPureFunc(pCtx) ){ - computeJD(p); - p->iJD += localtimeOffset(p, pCtx, &rc); - clearYMD_HMS_TZ(p); + rc = toLocaltime(p, pCtx); } break; } @@ -23378,6 +23794,7 @@ static int parseModifier( ** seconds since 1970. Convert to a real julian day number. */ if( sqlite3_stricmp(z, "unixepoch")==0 && p->rawS ){ + if( idx>1 ) return 1; /* IMP: R-49255-55373 */ r = p->s*1000.0 + 210866760000000.0; if( r>=0.0 && r<464269060800000.0 ){ clearYMD_HMS_TZ(p); @@ -23390,18 +23807,31 @@ static int parseModifier( #ifndef SQLITE_OMIT_LOCALTIME else if( sqlite3_stricmp(z, "utc")==0 && sqlite3NotPureFunc(pCtx) ){ if( p->tzSet==0 ){ - sqlite3_int64 c1; + i64 iOrigJD; /* Original localtime */ + i64 iGuess; /* Guess at the corresponding utc time */ + int cnt = 0; /* Safety to prevent infinite loop */ + int iErr; /* Guess is off by this much */ + computeJD(p); - c1 = localtimeOffset(p, pCtx, &rc); - if( rc==SQLITE_OK ){ - p->iJD -= c1; - clearYMD_HMS_TZ(p); - p->iJD += c1 - localtimeOffset(p, pCtx, &rc); - } + iGuess = iOrigJD = p->iJD; + iErr = 0; + do{ + DateTime new; + memset(&new, 0, sizeof(new)); + iGuess -= iErr; + new.iJD = iGuess; + new.validJD = 1; + rc = toLocaltime(&new, pCtx); + if( rc ) return rc; + computeJD(&new); + iErr = new.iJD - iOrigJD; + }while( iErr && cnt++<3 ); + memset(p, 0, sizeof(*p)); + p->iJD = iGuess; + p->validJD = 1; p->tzSet = 1; - }else{ - rc = SQLITE_OK; } + rc = SQLITE_OK; } #endif break; @@ -23517,9 +23947,10 @@ static int parseModifier( && sqlite3_strnicmp(aXformType[i].zName, z, n)==0 && r>-aXformType[i].rLimit && rM += (int)r; x = p->M>0 ? (p->M-1)/12 : (p->M-12)/12; @@ -23529,8 +23960,9 @@ static int parseModifier( r -= (int)r; break; } - case 2: { /* Special processing to add years */ + case 5: { /* Special processing to add years */ int y = (int)r; + assert( strcmp(aXformType[i].zName,"year")==0 ); computeYMD_HMS(p); p->Y += y; p->validJD = 0; @@ -23539,7 +23971,7 @@ static int parseModifier( } } computeJD(p); - p->iJD += (sqlite3_int64)(r*aXformType[i].rXform + rRounder); + p->iJD += (sqlite3_int64)(r*1000.0*aXformType[i].rXform + rRounder); rc = 0; break; } @@ -23589,7 +24021,7 @@ static int isDate( for(i=1; iisError || !validJulianDay(p->iJD) ) return 1; @@ -23619,6 +24051,24 @@ static void juliandayFunc( } } +/* +** unixepoch( TIMESTRING, MOD, MOD, ...) +** +** Return the number of seconds (including fractional seconds) since +** the unix epoch of 1970-01-01 00:00:00 GMT. +*/ +static void unixepochFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + DateTime x; + if( isDate(context, argc, argv, &x)==0 ){ + computeJD(&x); + sqlite3_result_int64(context, x.iJD/1000 - 21086676*(i64)10000); + } +} + /* ** datetime( TIMESTRING, MOD, MOD, ...) ** @@ -23631,11 +24081,38 @@ static void datetimeFunc( ){ DateTime x; if( isDate(context, argc, argv, &x)==0 ){ - char zBuf[100]; + int Y, s; + char zBuf[24]; computeYMD_HMS(&x); - sqlite3_snprintf(sizeof(zBuf), zBuf, "%04d-%02d-%02d %02d:%02d:%02d", - x.Y, x.M, x.D, x.h, x.m, (int)(x.s)); - sqlite3_result_text(context, zBuf, -1, SQLITE_TRANSIENT); + Y = x.Y; + if( Y<0 ) Y = -Y; + zBuf[1] = '0' + (Y/1000)%10; + zBuf[2] = '0' + (Y/100)%10; + zBuf[3] = '0' + (Y/10)%10; + zBuf[4] = '0' + (Y)%10; + zBuf[5] = '-'; + zBuf[6] = '0' + (x.M/10)%10; + zBuf[7] = '0' + (x.M)%10; + zBuf[8] = '-'; + zBuf[9] = '0' + (x.D/10)%10; + zBuf[10] = '0' + (x.D)%10; + zBuf[11] = ' '; + zBuf[12] = '0' + (x.h/10)%10; + zBuf[13] = '0' + (x.h)%10; + zBuf[14] = ':'; + zBuf[15] = '0' + (x.m/10)%10; + zBuf[16] = '0' + (x.m)%10; + zBuf[17] = ':'; + s = (int)x.s; + zBuf[18] = '0' + (s/10)%10; + zBuf[19] = '0' + (s)%10; + zBuf[20] = 0; + if( x.Y<0 ){ + zBuf[0] = '-'; + sqlite3_result_text(context, zBuf, 20, SQLITE_TRANSIENT); + }else{ + sqlite3_result_text(context, &zBuf[1], 19, SQLITE_TRANSIENT); + } } } @@ -23651,10 +24128,20 @@ static void timeFunc( ){ DateTime x; if( isDate(context, argc, argv, &x)==0 ){ - char zBuf[100]; + int s; + char zBuf[16]; computeHMS(&x); - sqlite3_snprintf(sizeof(zBuf), zBuf, "%02d:%02d:%02d", x.h, x.m, (int)x.s); - sqlite3_result_text(context, zBuf, -1, SQLITE_TRANSIENT); + zBuf[0] = '0' + (x.h/10)%10; + zBuf[1] = '0' + (x.h)%10; + zBuf[2] = ':'; + zBuf[3] = '0' + (x.m/10)%10; + zBuf[4] = '0' + (x.m)%10; + zBuf[5] = ':'; + s = (int)x.s; + zBuf[6] = '0' + (s/10)%10; + zBuf[7] = '0' + (s)%10; + zBuf[8] = 0; + sqlite3_result_text(context, zBuf, 8, SQLITE_TRANSIENT); } } @@ -23670,10 +24157,28 @@ static void dateFunc( ){ DateTime x; if( isDate(context, argc, argv, &x)==0 ){ - char zBuf[100]; + int Y; + char zBuf[16]; computeYMD(&x); - sqlite3_snprintf(sizeof(zBuf), zBuf, "%04d-%02d-%02d", x.Y, x.M, x.D); - sqlite3_result_text(context, zBuf, -1, SQLITE_TRANSIENT); + Y = x.Y; + if( Y<0 ) Y = -Y; + zBuf[1] = '0' + (Y/1000)%10; + zBuf[2] = '0' + (Y/100)%10; + zBuf[3] = '0' + (Y/10)%10; + zBuf[4] = '0' + (Y)%10; + zBuf[5] = '-'; + zBuf[6] = '0' + (x.M/10)%10; + zBuf[7] = '0' + (x.M)%10; + zBuf[8] = '-'; + zBuf[9] = '0' + (x.D/10)%10; + zBuf[10] = '0' + (x.D)%10; + zBuf[11] = 0; + if( x.Y<0 ){ + zBuf[0] = '-'; + sqlite3_result_text(context, zBuf, 11, SQLITE_TRANSIENT); + }else{ + sqlite3_result_text(context, &zBuf[1], 10, SQLITE_TRANSIENT); + } } } @@ -23895,6 +24400,7 @@ SQLITE_PRIVATE void sqlite3RegisterDateTimeFunctions(void){ static FuncDef aDateTimeFuncs[] = { #ifndef SQLITE_OMIT_DATETIME_FUNCS PURE_DATE(julianday, -1, 0, 0, juliandayFunc ), + PURE_DATE(unixepoch, -1, 0, 0, unixepochFunc ), PURE_DATE(date, -1, 0, 0, dateFunc ), PURE_DATE(time, -1, 0, 0, timeFunc ), PURE_DATE(datetime, -1, 0, 0, datetimeFunc ), @@ -28840,8 +29346,15 @@ SQLITE_PRIVATE void sqlite3SetString(char **pz, sqlite3 *db, const char *zNew){ ** has happened. This routine will set db->mallocFailed, and also ** temporarily disable the lookaside memory allocator and interrupt ** any running VDBEs. +** +** Always return a NULL pointer so that this routine can be invoked using +** +** return sqlite3OomFault(db); +** +** and thereby avoid unnecessary stack frame allocations for the overwhelmingly +** common case where no OOM occurs. */ -SQLITE_PRIVATE void sqlite3OomFault(sqlite3 *db){ +SQLITE_PRIVATE void *sqlite3OomFault(sqlite3 *db){ if( db->mallocFailed==0 && db->bBenignMalloc==0 ){ db->mallocFailed = 1; if( db->nVdbeExec>0 ){ @@ -28849,9 +29362,11 @@ SQLITE_PRIVATE void sqlite3OomFault(sqlite3 *db){ } DisableLookaside; if( db->pParse ){ + sqlite3ErrorMsg(db->pParse, "out of memory"); db->pParse->rc = SQLITE_NOMEM_BKPT; } } + return 0; } /* @@ -29760,12 +30275,22 @@ SQLITE_API void sqlite3_str_vappendf( goto adjust_width_for_utf8; } case etTOKEN: { - Token *pToken; if( (pAccum->printfFlags & SQLITE_PRINTF_INTERNAL)==0 ) return; - pToken = va_arg(ap, Token*); - assert( bArgList==0 ); - if( pToken && pToken->n ){ - sqlite3_str_append(pAccum, (const char*)pToken->z, pToken->n); + if( flag_alternateform ){ + /* %#T means an Expr pointer that uses Expr.u.zToken */ + Expr *pExpr = va_arg(ap,Expr*); + if( ALWAYS(pExpr) && ALWAYS(!ExprHasProperty(pExpr,EP_IntValue)) ){ + sqlite3_str_appendall(pAccum, (const char*)pExpr->u.zToken); + sqlite3RecordErrorOffsetOfExpr(pAccum->db, pExpr); + } + }else{ + /* %T means a Token pointer */ + Token *pToken = va_arg(ap, Token*); + assert( bArgList==0 ); + if( pToken && pToken->n ){ + sqlite3_str_append(pAccum, (const char*)pToken->z, pToken->n); + sqlite3RecordErrorByteOffset(pAccum->db, pToken->z); + } } length = width = 0; break; @@ -29820,6 +30345,42 @@ SQLITE_API void sqlite3_str_vappendf( }/* End for loop over the format string */ } /* End of function */ + +/* +** The z string points to the first character of a token that is +** associated with an error. If db does not already have an error +** byte offset recorded, try to compute the error byte offset for +** z and set the error byte offset in db. +*/ +SQLITE_PRIVATE void sqlite3RecordErrorByteOffset(sqlite3 *db, const char *z){ + const Parse *pParse; + const char *zText; + const char *zEnd; + assert( z!=0 ); + if( NEVER(db==0) ) return; + if( db->errByteOffset!=(-2) ) return; + pParse = db->pParse; + if( NEVER(pParse==0) ) return; + zText =pParse->zTail; + if( NEVER(zText==0) ) return; + zEnd = &zText[strlen(zText)]; + if( SQLITE_WITHIN(z,zText,zEnd) ){ + db->errByteOffset = (int)(z-zText); + } +} + +/* +** If pExpr has a byte offset for the start of a token, record that as +** as the error offset. +*/ +SQLITE_PRIVATE void sqlite3RecordErrorOffsetOfExpr(sqlite3 *db, const Expr *pExpr){ + while( pExpr && (ExprHasProperty(pExpr,EP_FromJoin) || pExpr->w.iOfst<=0) ){ + pExpr = pExpr->pLeft; + } + if( pExpr==0 ) return; + db->errByteOffset = pExpr->w.iOfst; +} + /* ** Enlarge the memory allocation on a StrAccum object so that it is ** able to accept at least N more bytes of text. @@ -29827,7 +30388,7 @@ SQLITE_API void sqlite3_str_vappendf( ** Return the number of bytes of text that StrAccum is able to accept ** after the attempted enlargement. The value returned might be zero. */ -static int sqlite3StrAccumEnlarge(StrAccum *p, int N){ +SQLITE_PRIVATE int sqlite3StrAccumEnlarge(StrAccum *p, int N){ char *zNew; assert( p->nChar+(i64)N >= p->nAlloc ); /* Only called if really needed */ if( p->accError ){ @@ -30661,7 +31222,7 @@ SQLITE_PRIVATE void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 m sqlite3_str_appendf(&x, " fg.af=%x.%c", pExpr->flags, pExpr->affExpr ? pExpr->affExpr : 'n'); if( ExprHasProperty(pExpr, EP_FromJoin) ){ - sqlite3_str_appendf(&x, " iRJT=%d", pExpr->iRightJoinTable); + sqlite3_str_appendf(&x, " iRJT=%d", pExpr->w.iRightJoinTable); } if( ExprHasProperty(pExpr, EP_FromDDL) ){ sqlite3_str_appendf(&x, " DDL"); @@ -32143,7 +32704,11 @@ static SQLITE_NOINLINE void sqlite3ErrorFinish(sqlite3 *db, int err_code){ SQLITE_PRIVATE void sqlite3Error(sqlite3 *db, int err_code){ assert( db!=0 ); db->errCode = err_code; - if( err_code || db->pErr ) sqlite3ErrorFinish(db, err_code); + if( err_code || db->pErr ){ + sqlite3ErrorFinish(db, err_code); + }else{ + db->errByteOffset = -1; + } } /* @@ -32153,6 +32718,7 @@ SQLITE_PRIVATE void sqlite3Error(sqlite3 *db, int err_code){ SQLITE_PRIVATE void sqlite3ErrorClear(sqlite3 *db){ assert( db!=0 ); db->errCode = SQLITE_OK; + db->errByteOffset = -1; if( db->pErr ) sqlite3ValueSetNull(db->pErr); } @@ -32173,17 +32739,8 @@ SQLITE_PRIVATE void sqlite3SystemError(sqlite3 *db, int rc){ ** handle "db". The error code is set to "err_code". ** ** If it is not NULL, string zFormat specifies the format of the -** error string in the style of the printf functions: The following -** format characters are allowed: -** -** %s Insert a string -** %z A string that should be freed after use -** %d Insert an integer -** %T Insert a token -** %S Insert the first element of a SrcList -** -** zFormat and any string tokens that follow it are assumed to be -** encoded in UTF-8. +** error string. zFormat and any string tokens that follow it are +** assumed to be encoded in UTF-8. ** ** To clear the most recent error for sqlite handle "db", sqlite3Error ** should be called with err_code set to SQLITE_OK and zFormat set @@ -32207,13 +32764,6 @@ SQLITE_PRIVATE void sqlite3ErrorWithMsg(sqlite3 *db, int err_code, const char *z /* ** Add an error message to pParse->zErrMsg and increment pParse->nErr. -** The following formatting characters are allowed: -** -** %s Insert a string -** %z A string that should be freed after use -** %d Insert an integer -** %T Insert a token -** %S Insert the first element of a SrcList ** ** This function should be used to report any error that occurs while ** compiling an SQL statement (i.e. within sqlite3_prepare()). The @@ -32226,11 +32776,19 @@ SQLITE_PRIVATE void sqlite3ErrorMsg(Parse *pParse, const char *zFormat, ...){ char *zMsg; va_list ap; sqlite3 *db = pParse->db; + assert( db!=0 ); + assert( db->pParse==pParse ); + db->errByteOffset = -2; va_start(ap, zFormat); zMsg = sqlite3VMPrintf(db, zFormat, ap); va_end(ap); + if( db->errByteOffset<-1 ) db->errByteOffset = -1; if( db->suppressErr ){ sqlite3DbFree(db, zMsg); + if( db->mallocFailed ){ + pParse->nErr++; + pParse->rc = SQLITE_NOMEM; + } }else{ pParse->nErr++; sqlite3DbFree(db, pParse->zErrMsg); @@ -33612,7 +34170,6 @@ SQLITE_PRIVATE LogEst sqlite3LogEst(u64 x){ return a[x&7] + y - 10; } -#ifndef SQLITE_OMIT_VIRTUALTABLE /* ** Convert a double into a LogEst ** In other words, compute an approximation for 10*log2(x). @@ -33627,16 +34184,9 @@ SQLITE_PRIVATE LogEst sqlite3LogEstFromDouble(double x){ e = (a>>52) - 1022; return e*10; } -#endif /* SQLITE_OMIT_VIRTUALTABLE */ -#if defined(SQLITE_ENABLE_STMT_SCANSTATUS) || \ - defined(SQLITE_ENABLE_STAT4) || \ - defined(SQLITE_EXPLAIN_ESTIMATED_ROWS) /* ** Convert a LogEst into an integer. -** -** Note that this routine is only used when one or more of various -** non-standard compile-time options is enabled. */ SQLITE_PRIVATE u64 sqlite3LogEstToInt(LogEst x){ u64 n; @@ -33644,17 +34194,9 @@ SQLITE_PRIVATE u64 sqlite3LogEstToInt(LogEst x){ x /= 10; if( n>=5 ) n -= 2; else if( n>=1 ) n -= 1; -#if defined(SQLITE_ENABLE_STMT_SCANSTATUS) || \ - defined(SQLITE_EXPLAIN_ESTIMATED_ROWS) if( x>60 ) return (u64)LARGEST_INT64; -#else - /* If only SQLITE_ENABLE_STAT4 is on, then the largest input - ** possible to this routine is 310, resulting in a maximum x of 31 */ - assert( x<=60 ); -#endif return x>=3 ? (n+8)<<(x-3) : (n+8)>>(3-x); } -#endif /* defined SCANSTAT or STAT4 or ESTIMATED_ROWS */ /* ** Add a new name/number pair to a VList. This might require that the @@ -34108,45 +34650,45 @@ SQLITE_PRIVATE const char *sqlite3OpcodeName(int i){ /* 60 */ "DecrJumpZero" OpHelp("if (--r[P1])==0 goto P2"), /* 61 */ "IncrVacuum" OpHelp(""), /* 62 */ "VNext" OpHelp(""), - /* 63 */ "Init" OpHelp("Start at P2"), - /* 64 */ "PureFunc" OpHelp("r[P3]=func(r[P2@NP])"), - /* 65 */ "Function" OpHelp("r[P3]=func(r[P2@NP])"), - /* 66 */ "Return" OpHelp(""), - /* 67 */ "EndCoroutine" OpHelp(""), - /* 68 */ "HaltIfNull" OpHelp("if r[P3]=null halt"), - /* 69 */ "Halt" OpHelp(""), - /* 70 */ "Integer" OpHelp("r[P2]=P1"), - /* 71 */ "Int64" OpHelp("r[P2]=P4"), - /* 72 */ "String" OpHelp("r[P2]='P4' (len=P1)"), - /* 73 */ "Null" OpHelp("r[P2..P3]=NULL"), - /* 74 */ "SoftNull" OpHelp("r[P1]=NULL"), - /* 75 */ "Blob" OpHelp("r[P2]=P4 (len=P1)"), - /* 76 */ "Variable" OpHelp("r[P2]=parameter(P1,P4)"), - /* 77 */ "Move" OpHelp("r[P2@P3]=r[P1@P3]"), - /* 78 */ "Copy" OpHelp("r[P2@P3+1]=r[P1@P3+1]"), - /* 79 */ "SCopy" OpHelp("r[P2]=r[P1]"), - /* 80 */ "IntCopy" OpHelp("r[P2]=r[P1]"), - /* 81 */ "ChngCntRow" OpHelp("output=r[P1]"), - /* 82 */ "ResultRow" OpHelp("output=r[P1@P2]"), - /* 83 */ "CollSeq" OpHelp(""), - /* 84 */ "AddImm" OpHelp("r[P1]=r[P1]+P2"), - /* 85 */ "RealAffinity" OpHelp(""), - /* 86 */ "Cast" OpHelp("affinity(r[P1])"), - /* 87 */ "Permutation" OpHelp(""), - /* 88 */ "Compare" OpHelp("r[P1@P3] <-> r[P2@P3]"), - /* 89 */ "IsTrue" OpHelp("r[P2] = coalesce(r[P1]==TRUE,P3) ^ P4"), - /* 90 */ "ZeroOrNull" OpHelp("r[P2] = 0 OR NULL"), - /* 91 */ "Offset" OpHelp("r[P3] = sqlite_offset(P1)"), - /* 92 */ "Column" OpHelp("r[P3]=PX"), - /* 93 */ "TypeCheck" OpHelp("typecheck(r[P1@P2])"), - /* 94 */ "Affinity" OpHelp("affinity(r[P1@P2])"), - /* 95 */ "MakeRecord" OpHelp("r[P3]=mkrec(r[P1@P2])"), - /* 96 */ "Count" OpHelp("r[P2]=count()"), - /* 97 */ "ReadCookie" OpHelp(""), - /* 98 */ "SetCookie" OpHelp(""), - /* 99 */ "ReopenIdx" OpHelp("root=P2 iDb=P3"), - /* 100 */ "OpenRead" OpHelp("root=P2 iDb=P3"), - /* 101 */ "OpenWrite" OpHelp("root=P2 iDb=P3"), + /* 63 */ "Filter" OpHelp("if key(P3@P4) not in filter(P1) goto P2"), + /* 64 */ "Init" OpHelp("Start at P2"), + /* 65 */ "PureFunc" OpHelp("r[P3]=func(r[P2@NP])"), + /* 66 */ "Function" OpHelp("r[P3]=func(r[P2@NP])"), + /* 67 */ "Return" OpHelp(""), + /* 68 */ "EndCoroutine" OpHelp(""), + /* 69 */ "HaltIfNull" OpHelp("if r[P3]=null halt"), + /* 70 */ "Halt" OpHelp(""), + /* 71 */ "Integer" OpHelp("r[P2]=P1"), + /* 72 */ "Int64" OpHelp("r[P2]=P4"), + /* 73 */ "String" OpHelp("r[P2]='P4' (len=P1)"), + /* 74 */ "Null" OpHelp("r[P2..P3]=NULL"), + /* 75 */ "SoftNull" OpHelp("r[P1]=NULL"), + /* 76 */ "Blob" OpHelp("r[P2]=P4 (len=P1)"), + /* 77 */ "Variable" OpHelp("r[P2]=parameter(P1,P4)"), + /* 78 */ "Move" OpHelp("r[P2@P3]=r[P1@P3]"), + /* 79 */ "Copy" OpHelp("r[P2@P3+1]=r[P1@P3+1]"), + /* 80 */ "SCopy" OpHelp("r[P2]=r[P1]"), + /* 81 */ "IntCopy" OpHelp("r[P2]=r[P1]"), + /* 82 */ "FkCheck" OpHelp(""), + /* 83 */ "ResultRow" OpHelp("output=r[P1@P2]"), + /* 84 */ "CollSeq" OpHelp(""), + /* 85 */ "AddImm" OpHelp("r[P1]=r[P1]+P2"), + /* 86 */ "RealAffinity" OpHelp(""), + /* 87 */ "Cast" OpHelp("affinity(r[P1])"), + /* 88 */ "Permutation" OpHelp(""), + /* 89 */ "Compare" OpHelp("r[P1@P3] <-> r[P2@P3]"), + /* 90 */ "IsTrue" OpHelp("r[P2] = coalesce(r[P1]==TRUE,P3) ^ P4"), + /* 91 */ "ZeroOrNull" OpHelp("r[P2] = 0 OR NULL"), + /* 92 */ "Offset" OpHelp("r[P3] = sqlite_offset(P1)"), + /* 93 */ "Column" OpHelp("r[P3]=PX"), + /* 94 */ "TypeCheck" OpHelp("typecheck(r[P1@P2])"), + /* 95 */ "Affinity" OpHelp("affinity(r[P1@P2])"), + /* 96 */ "MakeRecord" OpHelp("r[P3]=mkrec(r[P1@P2])"), + /* 97 */ "Count" OpHelp("r[P2]=count()"), + /* 98 */ "ReadCookie" OpHelp(""), + /* 99 */ "SetCookie" OpHelp(""), + /* 100 */ "ReopenIdx" OpHelp("root=P2 iDb=P3"), + /* 101 */ "OpenRead" OpHelp("root=P2 iDb=P3"), /* 102 */ "BitAnd" OpHelp("r[P3]=r[P1]&r[P2]"), /* 103 */ "BitOr" OpHelp("r[P3]=r[P1]|r[P2]"), /* 104 */ "ShiftLeft" OpHelp("r[P3]=r[P2]<0 then r[P2]=r[P1]+max(0,r[P3]) else r[P2]=(-1)"), - /* 159 */ "AggInverse" OpHelp("accum=r[P3] inverse(r[P2@P5])"), - /* 160 */ "AggStep" OpHelp("accum=r[P3] step(r[P2@P5])"), - /* 161 */ "AggStep1" OpHelp("accum=r[P3] step(r[P2@P5])"), - /* 162 */ "AggValue" OpHelp("r[P3]=value N=P2"), - /* 163 */ "AggFinal" OpHelp("accum=r[P1] N=P2"), - /* 164 */ "Expire" OpHelp(""), - /* 165 */ "CursorLock" OpHelp(""), - /* 166 */ "CursorUnlock" OpHelp(""), - /* 167 */ "TableLock" OpHelp("iDb=P1 root=P2 write=P3"), - /* 168 */ "VBegin" OpHelp(""), - /* 169 */ "VCreate" OpHelp(""), - /* 170 */ "VDestroy" OpHelp(""), - /* 171 */ "VOpen" OpHelp(""), - /* 172 */ "VColumn" OpHelp("r[P3]=vcolumn(P2)"), - /* 173 */ "VRename" OpHelp(""), - /* 174 */ "Pagecount" OpHelp(""), - /* 175 */ "MaxPgcnt" OpHelp(""), - /* 176 */ "Trace" OpHelp(""), - /* 177 */ "CursorHint" OpHelp(""), - /* 178 */ "ReleaseReg" OpHelp("release r[P1@P2] mask P3"), - /* 179 */ "Noop" OpHelp(""), - /* 180 */ "Explain" OpHelp(""), - /* 181 */ "Abortable" OpHelp(""), + /* 112 */ "OpenWrite" OpHelp("root=P2 iDb=P3"), + /* 113 */ "OpenDup" OpHelp(""), + /* 114 */ "BitNot" OpHelp("r[P2]= ~r[P1]"), + /* 115 */ "OpenAutoindex" OpHelp("nColumn=P2"), + /* 116 */ "OpenEphemeral" OpHelp("nColumn=P2"), + /* 117 */ "String8" OpHelp("r[P2]='P4'"), + /* 118 */ "SorterOpen" OpHelp(""), + /* 119 */ "SequenceTest" OpHelp("if( cursor[P1].ctr++ ) pc = P2"), + /* 120 */ "OpenPseudo" OpHelp("P3 columns in r[P2]"), + /* 121 */ "Close" OpHelp(""), + /* 122 */ "ColumnsUsed" OpHelp(""), + /* 123 */ "SeekScan" OpHelp("Scan-ahead up to P1 rows"), + /* 124 */ "SeekHit" OpHelp("set P2<=seekHit<=P3"), + /* 125 */ "Sequence" OpHelp("r[P2]=cursor[P1].ctr++"), + /* 126 */ "NewRowid" OpHelp("r[P2]=rowid"), + /* 127 */ "Insert" OpHelp("intkey=r[P3] data=r[P2]"), + /* 128 */ "RowCell" OpHelp(""), + /* 129 */ "Delete" OpHelp(""), + /* 130 */ "ResetCount" OpHelp(""), + /* 131 */ "SorterCompare" OpHelp("if key(P1)!=trim(r[P3],P4) goto P2"), + /* 132 */ "SorterData" OpHelp("r[P2]=data"), + /* 133 */ "RowData" OpHelp("r[P2]=data"), + /* 134 */ "Rowid" OpHelp("r[P2]=rowid"), + /* 135 */ "NullRow" OpHelp(""), + /* 136 */ "SeekEnd" OpHelp(""), + /* 137 */ "IdxInsert" OpHelp("key=r[P2]"), + /* 138 */ "SorterInsert" OpHelp("key=r[P2]"), + /* 139 */ "IdxDelete" OpHelp("key=r[P2@P3]"), + /* 140 */ "DeferredSeek" OpHelp("Move P3 to P1.rowid if needed"), + /* 141 */ "IdxRowid" OpHelp("r[P2]=rowid"), + /* 142 */ "FinishSeek" OpHelp(""), + /* 143 */ "Destroy" OpHelp(""), + /* 144 */ "Clear" OpHelp(""), + /* 145 */ "ResetSorter" OpHelp(""), + /* 146 */ "CreateBtree" OpHelp("r[P2]=root iDb=P1 flags=P3"), + /* 147 */ "SqlExec" OpHelp(""), + /* 148 */ "ParseSchema" OpHelp(""), + /* 149 */ "LoadAnalysis" OpHelp(""), + /* 150 */ "DropTable" OpHelp(""), + /* 151 */ "DropIndex" OpHelp(""), + /* 152 */ "DropTrigger" OpHelp(""), + /* 153 */ "Real" OpHelp("r[P2]=P4"), + /* 154 */ "IntegrityCk" OpHelp(""), + /* 155 */ "RowSetAdd" OpHelp("rowset(P1)=r[P2]"), + /* 156 */ "Param" OpHelp(""), + /* 157 */ "FkCounter" OpHelp("fkctr[P1]+=P2"), + /* 158 */ "MemMax" OpHelp("r[P1]=max(r[P1],r[P2])"), + /* 159 */ "OffsetLimit" OpHelp("if r[P1]>0 then r[P2]=r[P1]+max(0,r[P3]) else r[P2]=(-1)"), + /* 160 */ "AggInverse" OpHelp("accum=r[P3] inverse(r[P2@P5])"), + /* 161 */ "AggStep" OpHelp("accum=r[P3] step(r[P2@P5])"), + /* 162 */ "AggStep1" OpHelp("accum=r[P3] step(r[P2@P5])"), + /* 163 */ "AggValue" OpHelp("r[P3]=value N=P2"), + /* 164 */ "AggFinal" OpHelp("accum=r[P1] N=P2"), + /* 165 */ "Expire" OpHelp(""), + /* 166 */ "CursorLock" OpHelp(""), + /* 167 */ "CursorUnlock" OpHelp(""), + /* 168 */ "TableLock" OpHelp("iDb=P1 root=P2 write=P3"), + /* 169 */ "VBegin" OpHelp(""), + /* 170 */ "VCreate" OpHelp(""), + /* 171 */ "VDestroy" OpHelp(""), + /* 172 */ "VOpen" OpHelp(""), + /* 173 */ "VInitIn" OpHelp("r[P2]=ValueList(P1,P3)"), + /* 174 */ "VColumn" OpHelp("r[P3]=vcolumn(P2)"), + /* 175 */ "VRename" OpHelp(""), + /* 176 */ "Pagecount" OpHelp(""), + /* 177 */ "MaxPgcnt" OpHelp(""), + /* 178 */ "FilterAdd" OpHelp("filter(P1) += key(P3@P4)"), + /* 179 */ "Trace" OpHelp(""), + /* 180 */ "CursorHint" OpHelp(""), + /* 181 */ "ReleaseReg" OpHelp("release r[P1@P2] mask P3"), + /* 182 */ "Noop" OpHelp(""), + /* 183 */ "Explain" OpHelp(""), + /* 184 */ "Abortable" OpHelp(""), }; return azName[i]; } @@ -39146,11 +39691,17 @@ static int unixShmLock( int flags /* What to do with the lock */ ){ unixFile *pDbFd = (unixFile*)fd; /* Connection holding shared memory */ - unixShm *p = pDbFd->pShm; /* The shared memory being locked */ - unixShmNode *pShmNode = p->pShmNode; /* The underlying file iNode */ + unixShm *p; /* The shared memory being locked */ + unixShmNode *pShmNode; /* The underlying file iNode */ int rc = SQLITE_OK; /* Result code */ u16 mask; /* Mask of locks to take or release */ - int *aLock = pShmNode->aLock; + int *aLock; + + p = pDbFd->pShm; + if( p==0 ) return SQLITE_IOERR_SHMLOCK; + pShmNode = p->pShmNode; + if( NEVER(pShmNode==0) ) return SQLITE_IOERR_SHMLOCK; + aLock = pShmNode->aLock; assert( pShmNode==pDbFd->pInode->pShmNode ); assert( pShmNode->pInode==pDbFd->pInode ); @@ -46438,10 +46989,14 @@ static int winShmLock( winFile *pDbFd = (winFile*)fd; /* Connection holding shared memory */ winShm *p = pDbFd->pShm; /* The shared memory being locked */ winShm *pX; /* For looping over all siblings */ - winShmNode *pShmNode = p->pShmNode; + winShmNode *pShmNode; int rc = SQLITE_OK; /* Result code */ u16 mask; /* Mask of locks to take or release */ + if( p==0 ) return SQLITE_IOERR_SHMLOCK; + pShmNode = p->pShmNode; + if( NEVER(pShmNode==0) ) return SQLITE_IOERR_SHMLOCK; + assert( ofst>=0 && ofst+n<=SQLITE_SHM_NLOCK ); assert( n>=1 ); assert( flags==(SQLITE_SHM_LOCK | SQLITE_SHM_SHARED) @@ -50371,7 +50926,8 @@ SQLITE_PRIVATE void sqlite3PcacheDrop(PgHdr *p){ ** make it so. */ SQLITE_PRIVATE void sqlite3PcacheMakeDirty(PgHdr *p){ - assert( p->nRef>0 ); + assert( p->nRef>0 || p->pCache->bPurgeable==0 ); + testcase( p->nRef==0 ); assert( sqlite3PcachePageSanity(p) ); if( p->flags & (PGHDR_CLEAN|PGHDR_DONT_WRITE) ){ /*OPTIMIZATION-IF-FALSE*/ p->flags &= ~PGHDR_DONT_WRITE; @@ -55503,6 +56059,9 @@ static int pager_playback(Pager *pPager, int isHot){ goto end_playback; } pPager->dbSize = mxPg; + if( pPager->mxPgnomxPgno = mxPg; + } } /* Copy original pages out of the journal and back into the @@ -56559,8 +57118,7 @@ static int pager_wait_on_lock(Pager *pPager, int locktype){ ** current database image, in pages, OR ** ** b) if the page content were written at this time, it would not -** be necessary to write the current content out to the sub-journal -** (as determined by function subjRequiresPage()). +** be necessary to write the current content out to the sub-journal. ** ** If the condition asserted by this function were not true, and the ** dirty page were to be discarded from the cache via the pagerStress() @@ -56575,8 +57133,16 @@ static int pager_wait_on_lock(Pager *pPager, int locktype){ */ #if defined(SQLITE_DEBUG) static void assertTruncateConstraintCb(PgHdr *pPg){ + Pager *pPager = pPg->pPager; assert( pPg->flags&PGHDR_DIRTY ); - assert( pPg->pgno<=pPg->pPager->dbSize || !subjRequiresPage(pPg) ); + if( pPg->pgno>pPager->dbSize ){ /* if (a) is false */ + Pgno pgno = pPg->pgno; + int i; + for(i=0; ipPager->nSavepoint; i++){ + PagerSavepoint *p = &pPager->aSavepoint[i]; + assert( p->nOrigpInSavepoint,pgno) ); + } + } } static void assertTruncateConstraint(Pager *pPager){ sqlite3PcacheIterateDirty(pPager->pPCache, assertTruncateConstraintCb); @@ -56598,7 +57164,6 @@ static void assertTruncateConstraint(Pager *pPager){ */ SQLITE_PRIVATE void sqlite3PagerTruncateImage(Pager *pPager, Pgno nPage){ assert( pPager->dbSize>=nPage || CORRUPT_DB ); - testcase( pPager->dbSizeeState>=PAGER_WRITER_CACHEMOD ); pPager->dbSize = nPage; @@ -58319,6 +58884,7 @@ SQLITE_PRIVATE int sqlite3PagerGet( DbPage **ppPage, /* Write a pointer to the page here */ int flags /* PAGER_GET_XXX flags */ ){ + /* printf("PAGE %u\n", pgno); fflush(stdout); */ return pPager->xGet(pPager, pgno, ppPage, flags); } @@ -59924,12 +60490,12 @@ SQLITE_PRIVATE int sqlite3PagerSetJournalMode(Pager *pPager, int eMode){ u8 eOld = pPager->journalMode; /* Prior journalmode */ /* The eMode parameter is always valid */ - assert( eMode==PAGER_JOURNALMODE_DELETE - || eMode==PAGER_JOURNALMODE_TRUNCATE - || eMode==PAGER_JOURNALMODE_PERSIST - || eMode==PAGER_JOURNALMODE_OFF - || eMode==PAGER_JOURNALMODE_WAL - || eMode==PAGER_JOURNALMODE_MEMORY ); + assert( eMode==PAGER_JOURNALMODE_DELETE /* 0 */ + || eMode==PAGER_JOURNALMODE_PERSIST /* 1 */ + || eMode==PAGER_JOURNALMODE_OFF /* 2 */ + || eMode==PAGER_JOURNALMODE_TRUNCATE /* 3 */ + || eMode==PAGER_JOURNALMODE_MEMORY /* 4 */ + || eMode==PAGER_JOURNALMODE_WAL /* 5 */ ); /* This routine is only called from the OP_JournalMode opcode, and ** the logic there will never allow a temporary file to be changed @@ -59966,7 +60532,6 @@ SQLITE_PRIVATE int sqlite3PagerSetJournalMode(Pager *pPager, int eMode){ assert( isOpen(pPager->fd) || pPager->exclusiveMode ); if( !pPager->exclusiveMode && (eOld & 5)==1 && (eMode & 1)==0 ){ - /* In this case we would like to delete the journal file. If it is ** not possible, then that is not a problem. Deleting the journal file ** here is an optimization only. @@ -60078,6 +60643,18 @@ SQLITE_PRIVATE int sqlite3PagerCheckpoint( int *pnCkpt /* OUT: Final number of checkpointed frames */ ){ int rc = SQLITE_OK; + if( pPager->pWal==0 && pPager->journalMode==PAGER_JOURNALMODE_WAL ){ + /* This only happens when a database file is zero bytes in size opened and + ** then "PRAGMA journal_mode=WAL" is run and then sqlite3_wal_checkpoint() + ** is invoked without any intervening transactions. We need to start + ** a transaction to initialize pWal. The PRAGMA table_list statement is + ** used for this since it starts transactions on every database file, + ** including all ATTACHed databases. This seems expensive for a single + ** sqlite3_wal_checkpoint() call, but it happens very rarely. + ** https://sqlite.org/forum/forumpost/fd0f19d229156939 + */ + sqlite3_exec(db, "PRAGMA table_list",0,0,0); + } if( pPager->pWal ){ rc = sqlite3WalCheckpoint(pPager->pWal, db, eMode, (eMode==SQLITE_CHECKPOINT_PASSIVE ? 0 : pPager->xBusyHandler), @@ -62977,7 +63554,9 @@ static int walBeginShmUnreliable(Wal *pWal, int *pChanged){ } /* Allocate a buffer to read frames into */ - szFrame = pWal->hdr.szPage + WAL_FRAME_HDRSIZE; + assert( (pWal->szPage & (pWal->szPage-1))==0 ); + assert( pWal->szPage>=512 && pWal->szPage<=65536 ); + szFrame = pWal->szPage + WAL_FRAME_HDRSIZE; aFrame = (u8 *)sqlite3_malloc64(szFrame); if( aFrame==0 ){ rc = SQLITE_NOMEM_BKPT; @@ -62991,7 +63570,7 @@ static int walBeginShmUnreliable(Wal *pWal, int *pChanged){ ** the caller. */ aSaveCksum[0] = pWal->hdr.aFrameCksum[0]; aSaveCksum[1] = pWal->hdr.aFrameCksum[1]; - for(iOffset=walFrameOffset(pWal->hdr.mxFrame+1, pWal->hdr.szPage); + for(iOffset=walFrameOffset(pWal->hdr.mxFrame+1, pWal->szPage); iOffset+szFrame<=szWal; iOffset+=szFrame ){ @@ -64842,7 +65421,9 @@ struct MemPage { u8 *apOvfl[4]; /* Pointers to the body of overflow cells */ BtShared *pBt; /* Pointer to BtShared that this page is part of */ u8 *aData; /* Pointer to disk image of the page data */ - u8 *aDataEnd; /* One byte past the end of usable data */ + u8 *aDataEnd; /* One byte past the end of the entire page - not just + ** the usable space, the entire page. Used to prevent + ** corruption-induced of buffer overflow. */ u8 *aCellIdx; /* The cell index area */ u8 *aDataOfst; /* Same as aData for leaves. aData+4 for interior */ DbPage *pDbPage; /* Pager page handle */ @@ -66799,18 +67380,32 @@ static void btreeParseCellPtr( ** ** pIter += getVarint(pIter, (u64*)&pInfo->nKey); ** - ** The code is inlined to avoid a function call. + ** The code is inlined and the loop is unrolled for performance. + ** This routine is a high-runner. */ iKey = *pIter; if( iKey>=0x80 ){ - u8 *pEnd = &pIter[7]; - iKey &= 0x7f; - while(1){ - iKey = (iKey<<7) | (*++pIter & 0x7f); - if( (*pIter)<0x80 ) break; - if( pIter>=pEnd ){ - iKey = (iKey<<8) | *++pIter; - break; + u8 x; + iKey = ((iKey&0x7f)<<7) | ((x = *++pIter) & 0x7f); + if( x>=0x80 ){ + iKey = (iKey<<7) | ((x =*++pIter) & 0x7f); + if( x>=0x80 ){ + iKey = (iKey<<7) | ((x = *++pIter) & 0x7f); + if( x>=0x80 ){ + iKey = (iKey<<7) | ((x = *++pIter) & 0x7f); + if( x>=0x80 ){ + iKey = (iKey<<7) | ((x = *++pIter) & 0x7f); + if( x>=0x80 ){ + iKey = (iKey<<7) | ((x = *++pIter) & 0x7f); + if( x>=0x80 ){ + iKey = (iKey<<7) | ((x = *++pIter) & 0x7f); + if( x>=0x80 ){ + iKey = (iKey<<8) | (*++pIter); + } + } + } + } + } } } } @@ -67342,7 +67937,7 @@ static int freeSpace(MemPage *pPage, u16 iStart, u16 iSize){ if( iFreeBlk>pPage->pBt->usableSize-4 ){ /* TH3: corrupt081.100 */ return SQLITE_CORRUPT_PAGE(pPage); } - assert( iFreeBlk>iPtr || iFreeBlk==0 ); + assert( iFreeBlk>iPtr || iFreeBlk==0 || CORRUPT_DB ); /* At this point: ** iFreeBlk: First freeblock after iStart, or zero if none @@ -67613,7 +68208,7 @@ static int btreeInitPage(MemPage *pPage){ pPage->nOverflow = 0; pPage->cellOffset = pPage->hdrOffset + 8 + pPage->childPtrSize; pPage->aCellIdx = data + pPage->childPtrSize + 8; - pPage->aDataEnd = pPage->aData + pBt->usableSize; + pPage->aDataEnd = pPage->aData + pBt->pageSize; pPage->aDataOfst = pPage->aData + pPage->childPtrSize; /* EVIDENCE-OF: R-37002-32774 The two-byte integer at offset 3 gives the ** number of cells on the page. */ @@ -67648,7 +68243,7 @@ static void zeroPage(MemPage *pPage, int flags){ u8 hdr = pPage->hdrOffset; u16 first; - assert( sqlite3PagerPagenumber(pPage->pDbPage)==pPage->pgno ); + assert( sqlite3PagerPagenumber(pPage->pDbPage)==pPage->pgno || CORRUPT_DB ); assert( sqlite3PagerGetExtra(pPage->pDbPage) == (void*)pPage ); assert( sqlite3PagerGetData(pPage->pDbPage) == data ); assert( sqlite3PagerIswriteable(pPage->pDbPage) ); @@ -67664,7 +68259,7 @@ static void zeroPage(MemPage *pPage, int flags){ pPage->nFree = (u16)(pBt->usableSize - first); decodeFlags(pPage, flags); pPage->cellOffset = first; - pPage->aDataEnd = &data[pBt->usableSize]; + pPage->aDataEnd = &data[pBt->pageSize]; pPage->aCellIdx = &data[first]; pPage->aDataOfst = &data[pPage->childPtrSize]; pPage->nOverflow = 0; @@ -67790,7 +68385,7 @@ static int getAndInitPage( goto getAndInitPage_error2; } } - assert( (*ppPage)->pgno==pgno ); + assert( (*ppPage)->pgno==pgno || CORRUPT_DB ); assert( (*ppPage)->aData==sqlite3PagerGetData(pDbPage) ); /* If obtaining a child page for a cursor, we must verify that the page is @@ -68267,30 +68862,38 @@ static int removeFromSharingList(BtShared *pBt){ ** MX_CELL_SIZE(pBt) bytes with a 4-byte prefix for a left-child ** pointer. */ -static void allocateTempSpace(BtShared *pBt){ - if( !pBt->pTmpSpace ){ - pBt->pTmpSpace = sqlite3PageMalloc( pBt->pageSize ); - - /* One of the uses of pBt->pTmpSpace is to format cells before - ** inserting them into a leaf page (function fillInCell()). If - ** a cell is less than 4 bytes in size, it is rounded up to 4 bytes - ** by the various routines that manipulate binary cells. Which - ** can mean that fillInCell() only initializes the first 2 or 3 - ** bytes of pTmpSpace, but that the first 4 bytes are copied from - ** it into a database page. This is not actually a problem, but it - ** does cause a valgrind error when the 1 or 2 bytes of unitialized - ** data is passed to system call write(). So to avoid this error, - ** zero the first 4 bytes of temp space here. - ** - ** Also: Provide four bytes of initialized space before the - ** beginning of pTmpSpace as an area available to prepend the - ** left-child pointer to the beginning of a cell. - */ - if( pBt->pTmpSpace ){ - memset(pBt->pTmpSpace, 0, 8); - pBt->pTmpSpace += 4; - } +static SQLITE_NOINLINE int allocateTempSpace(BtShared *pBt){ + assert( pBt!=0 ); + assert( pBt->pTmpSpace==0 ); + /* This routine is called only by btreeCursor() when allocating the + ** first write cursor for the BtShared object */ + assert( pBt->pCursor!=0 && (pBt->pCursor->curFlags & BTCF_WriteFlag)!=0 ); + pBt->pTmpSpace = sqlite3PageMalloc( pBt->pageSize ); + if( pBt->pTmpSpace==0 ){ + BtCursor *pCur = pBt->pCursor; + pBt->pCursor = pCur->pNext; /* Unlink the cursor */ + memset(pCur, 0, sizeof(*pCur)); + return SQLITE_NOMEM_BKPT; } + + /* One of the uses of pBt->pTmpSpace is to format cells before + ** inserting them into a leaf page (function fillInCell()). If + ** a cell is less than 4 bytes in size, it is rounded up to 4 bytes + ** by the various routines that manipulate binary cells. Which + ** can mean that fillInCell() only initializes the first 2 or 3 + ** bytes of pTmpSpace, but that the first 4 bytes are copied from + ** it into a database page. This is not actually a problem, but it + ** does cause a valgrind error when the 1 or 2 bytes of unitialized + ** data is passed to system call write(). So to avoid this error, + ** zero the first 4 bytes of temp space here. + ** + ** Also: Provide four bytes of initialized space before the + ** beginning of pTmpSpace as an area available to prepend the + ** left-child pointer to the beginning of a cell. + */ + memset(pBt->pTmpSpace, 0, 8); + pBt->pTmpSpace += 4; + return SQLITE_OK; } /* @@ -68787,9 +69390,13 @@ static int lockBtree(BtShared *pBt){ pageSize-usableSize); return rc; } - if( sqlite3WritableSchema(pBt->db)==0 && nPage>nPageFile ){ - rc = SQLITE_CORRUPT_BKPT; - goto page1_init_failed; + if( nPage>nPageFile ){ + if( sqlite3WritableSchema(pBt->db)==0 ){ + rc = SQLITE_CORRUPT_BKPT; + goto page1_init_failed; + }else{ + nPage = nPageFile; + } } /* EVIDENCE-OF: R-28312-64704 However, the usable size is not allowed to ** be less than 480. In other words, if the page size is 512, then the @@ -70031,10 +70638,6 @@ static int btreeCursor( assert( pBt->pPage1 && pBt->pPage1->aData ); assert( wrFlag==0 || (pBt->btsFlags & BTS_READ_ONLY)==0 ); - if( wrFlag ){ - allocateTempSpace(pBt); - if( pBt->pTmpSpace==0 ) return SQLITE_NOMEM_BKPT; - } if( iTable<=1 ){ if( iTable<1 ){ return SQLITE_CORRUPT_BKPT; @@ -70051,19 +70654,25 @@ static int btreeCursor( pCur->pKeyInfo = pKeyInfo; pCur->pBtree = p; pCur->pBt = pBt; - pCur->curFlags = wrFlag ? BTCF_WriteFlag : 0; - pCur->curPagerFlags = wrFlag ? 0 : PAGER_GET_READONLY; + pCur->curFlags = 0; /* If there are two or more cursors on the same btree, then all such ** cursors *must* have the BTCF_Multiple flag set. */ for(pX=pBt->pCursor; pX; pX=pX->pNext){ if( pX->pgnoRoot==iTable ){ pX->curFlags |= BTCF_Multiple; - pCur->curFlags |= BTCF_Multiple; + pCur->curFlags = BTCF_Multiple; } } + pCur->eState = CURSOR_INVALID; pCur->pNext = pBt->pCursor; pBt->pCursor = pCur; - pCur->eState = CURSOR_INVALID; + if( wrFlag ){ + pCur->curFlags |= BTCF_WriteFlag; + pCur->curPagerFlags = 0; + if( pBt->pTmpSpace==0 ) return allocateTempSpace(pBt); + }else{ + pCur->curPagerFlags = PAGER_GET_READONLY; + } return SQLITE_OK; } static int btreeCursorWithLock( @@ -70838,7 +71447,7 @@ static int moveToRoot(BtCursor *pCur){ while( --pCur->iPage ){ releasePageNotNull(pCur->apPage[pCur->iPage]); } - pCur->pPage = pCur->apPage[0]; + pRoot = pCur->pPage = pCur->apPage[0]; goto skip_init; } }else if( pCur->pgnoRoot==0 ){ @@ -70863,7 +71472,7 @@ static int moveToRoot(BtCursor *pCur){ pCur->curIntKey = pCur->pPage->intKey; } pRoot = pCur->pPage; - assert( pRoot->pgno==pCur->pgnoRoot ); + assert( pRoot->pgno==pCur->pgnoRoot || CORRUPT_DB ); /* If pCur->pKeyInfo is not NULL, then the caller that opened this cursor ** expected to open it on an index b-tree. Otherwise, if pKeyInfo is @@ -70885,7 +71494,6 @@ static int moveToRoot(BtCursor *pCur){ pCur->info.nSize = 0; pCur->curFlags &= ~(BTCF_AtLast|BTCF_ValidNKey|BTCF_ValidOvfl); - pRoot = pCur->pPage; if( pRoot->nCell>0 ){ pCur->eState = CURSOR_VALID; }else if( !pRoot->leaf ){ @@ -71126,7 +71734,6 @@ SQLITE_PRIVATE int sqlite3BtreeTableMoveto( upr = pPage->nCell-1; assert( biasRight==0 || biasRight==1 ); idx = upr>>(1-biasRight); /* idx = biasRight ? upr : (lwr+upr)/2; */ - pCur->ix = (u16)idx; for(;;){ i64 nCellKey; pCell = findCellPastPtr(pPage, idx); @@ -71268,7 +71875,6 @@ SQLITE_PRIVATE int sqlite3BtreeIndexMoveto( lwr = 0; upr = pPage->nCell-1; idx = upr>>1; /* idx = (lwr+upr)/2; */ - pCur->ix = (u16)idx; for(;;){ int nCell; /* Size of the pCell cell in bytes */ pCell = findCellPastPtr(pPage, idx); @@ -71960,7 +72566,7 @@ static int freePage2(BtShared *pBt, MemPage *pMemPage, Pgno iPage){ assert( CORRUPT_DB || iPage>1 ); assert( !pMemPage || pMemPage->pgno==iPage ); - if( NEVER(iPage<2) || iPage>pBt->nPage ){ + if( iPage<2 || iPage>pBt->nPage ){ return SQLITE_CORRUPT_BKPT; } if( pMemPage ){ @@ -72392,9 +72998,15 @@ static void dropCell(MemPage *pPage, int idx, int sz, int *pRC){ assert( pPage->nFree>=0 ); data = pPage->aData; ptr = &pPage->aCellIdx[2*idx]; - assert( pPage->pBt->usableSize > (int)(ptr-data) ); + assert( pPage->pBt->usableSize > (u32)(ptr-data) ); pc = get2byte(ptr); hdr = pPage->hdrOffset; +#if 0 /* Not required. Omit for efficiency */ + if( pcnCell*2 ){ + *pRC = SQLITE_CORRUPT_BKPT; + return; + } +#endif testcase( pc==(u32)get2byte(&data[hdr+5]) ); testcase( pc+sz==pPage->pBt->usableSize ); if( pc+sz > pPage->pBt->usableSize ){ @@ -74391,24 +75003,6 @@ SQLITE_PRIVATE int sqlite3BtreeInsert( assert( (flags & (BTREE_SAVEPOSITION|BTREE_APPEND|BTREE_PREFORMAT))==flags ); assert( (flags & BTREE_PREFORMAT)==0 || seekResult || pCur->pKeyInfo==0 ); - if( pCur->eState==CURSOR_FAULT ){ - assert( pCur->skipNext!=SQLITE_OK ); - return pCur->skipNext; - } - - assert( cursorOwnsBtShared(pCur) ); - assert( (pCur->curFlags & BTCF_WriteFlag)!=0 - && pBt->inTransaction==TRANS_WRITE - && (pBt->btsFlags & BTS_READ_ONLY)==0 ); - assert( hasSharedCacheTableLock(p, pCur->pgnoRoot, pCur->pKeyInfo!=0, 2) ); - - /* Assert that the caller has been consistent. If this cursor was opened - ** expecting an index b-tree, then the caller should be inserting blob - ** keys with no associated data. If the cursor was opened expecting an - ** intkey table, the caller should be inserting integer keys with a - ** blob of associated data. */ - assert( (flags & BTREE_PREFORMAT) || (pX->pKey==0)==(pCur->pKeyInfo==0) ); - /* Save the positions of any other cursors open on this table. ** ** In some cases, the call to btreeMoveto() below is a no-op. For @@ -74433,6 +75027,24 @@ SQLITE_PRIVATE int sqlite3BtreeInsert( } } + if( pCur->eState>=CURSOR_REQUIRESEEK ){ + rc = moveToRoot(pCur); + if( rc && rc!=SQLITE_EMPTY ) return rc; + } + + assert( cursorOwnsBtShared(pCur) ); + assert( (pCur->curFlags & BTCF_WriteFlag)!=0 + && pBt->inTransaction==TRANS_WRITE + && (pBt->btsFlags & BTS_READ_ONLY)==0 ); + assert( hasSharedCacheTableLock(p, pCur->pgnoRoot, pCur->pKeyInfo!=0, 2) ); + + /* Assert that the caller has been consistent. If this cursor was opened + ** expecting an index b-tree, then the caller should be inserting blob + ** keys with no associated data. If the cursor was opened expecting an + ** intkey table, the caller should be inserting integer keys with a + ** blob of associated data. */ + assert( (flags & BTREE_PREFORMAT) || (pX->pKey==0)==(pCur->pKeyInfo==0) ); + if( pCur->pKeyInfo==0 ){ assert( pX->pKey==0 ); /* If this is an insert into a table b-tree, invalidate any incrblob @@ -74521,14 +75133,13 @@ SQLITE_PRIVATE int sqlite3BtreeInsert( } } assert( pCur->eState==CURSOR_VALID - || (pCur->eState==CURSOR_INVALID && loc) - || CORRUPT_DB ); + || (pCur->eState==CURSOR_INVALID && loc) ); pPage = pCur->pPage; assert( pPage->intKey || pX->nKey>=0 || (flags & BTREE_PREFORMAT) ); assert( pPage->leaf || !pPage->intKey ); if( pPage->nFree<0 ){ - if( NEVER(pCur->eState>CURSOR_INVALID) ){ + if( pCur->eState>CURSOR_INVALID ){ rc = SQLITE_CORRUPT_BKPT; }else{ rc = btreeComputeFreeSpace(pPage); @@ -74794,14 +75405,13 @@ SQLITE_PRIVATE int sqlite3BtreeTransferRow(BtCursor *pDest, BtCursor *pSrc, i64 SQLITE_PRIVATE int sqlite3BtreeDelete(BtCursor *pCur, u8 flags){ Btree *p = pCur->pBtree; BtShared *pBt = p->pBt; - int rc; /* Return code */ - MemPage *pPage; /* Page to delete cell from */ - unsigned char *pCell; /* Pointer to cell to delete */ - int iCellIdx; /* Index of cell to delete */ - int iCellDepth; /* Depth of node containing pCell */ - CellInfo info; /* Size of the cell being deleted */ - int bSkipnext = 0; /* Leaf cursor in SKIPNEXT state */ - u8 bPreserve = flags & BTREE_SAVEPOSITION; /* Keep cursor valid */ + int rc; /* Return code */ + MemPage *pPage; /* Page to delete cell from */ + unsigned char *pCell; /* Pointer to cell to delete */ + int iCellIdx; /* Index of cell to delete */ + int iCellDepth; /* Depth of node containing pCell */ + CellInfo info; /* Size of the cell being deleted */ + u8 bPreserve; /* Keep cursor valid. 2 for CURSOR_SKIPNEXT */ assert( cursorOwnsBtShared(pCur) ); assert( pBt->inTransaction==TRANS_WRITE ); @@ -74810,33 +75420,45 @@ SQLITE_PRIVATE int sqlite3BtreeDelete(BtCursor *pCur, u8 flags){ assert( hasSharedCacheTableLock(p, pCur->pgnoRoot, pCur->pKeyInfo!=0, 2) ); assert( !hasReadConflicts(p, pCur->pgnoRoot) ); assert( (flags & ~(BTREE_SAVEPOSITION | BTREE_AUXDELETE))==0 ); - if( pCur->eState==CURSOR_REQUIRESEEK ){ - rc = btreeRestoreCursorPosition(pCur); - assert( rc!=SQLITE_OK || CORRUPT_DB || pCur->eState==CURSOR_VALID ); - if( rc || pCur->eState!=CURSOR_VALID ) return rc; + if( pCur->eState!=CURSOR_VALID ){ + if( pCur->eState>=CURSOR_REQUIRESEEK ){ + rc = btreeRestoreCursorPosition(pCur); + assert( rc!=SQLITE_OK || CORRUPT_DB || pCur->eState==CURSOR_VALID ); + if( rc || pCur->eState!=CURSOR_VALID ) return rc; + }else{ + return SQLITE_CORRUPT_BKPT; + } } - assert( CORRUPT_DB || pCur->eState==CURSOR_VALID ); + assert( pCur->eState==CURSOR_VALID ); iCellDepth = pCur->iPage; iCellIdx = pCur->ix; pPage = pCur->pPage; - pCell = findCell(pPage, iCellIdx); - if( pPage->nFree<0 && btreeComputeFreeSpace(pPage) ){ + if( pPage->nCell<=iCellIdx ){ return SQLITE_CORRUPT_BKPT; } - if( pPage->nCell<=iCellIdx ){ + pCell = findCell(pPage, iCellIdx); + if( pPage->nFree<0 && btreeComputeFreeSpace(pPage) ){ return SQLITE_CORRUPT_BKPT; } - /* If the bPreserve flag is set to true, then the cursor position must + /* If the BTREE_SAVEPOSITION bit is on, then the cursor position must ** be preserved following this delete operation. If the current delete ** will cause a b-tree rebalance, then this is done by saving the cursor ** key and leaving the cursor in CURSOR_REQUIRESEEK state before ** returning. ** - ** Or, if the current delete will not cause a rebalance, then the cursor + ** If the current delete will not cause a rebalance, then the cursor ** will be left in CURSOR_SKIPNEXT state pointing to the entry immediately - ** before or after the deleted entry. In this case set bSkipnext to true. */ + ** before or after the deleted entry. + ** + ** The bPreserve value records which path is required: + ** + ** bPreserve==0 Not necessary to save the cursor position + ** bPreserve==1 Use CURSOR_REQUIRESEEK to save the cursor position + ** bPreserve==2 Cursor won't move. Set CURSOR_SKIPNEXT. + */ + bPreserve = (flags & BTREE_SAVEPOSITION)!=0; if( bPreserve ){ if( !pPage->leaf || (pPage->nFree+cellSizePtr(pPage,pCell)+2)>(int)(pBt->usableSize*2/3) @@ -74847,7 +75469,7 @@ SQLITE_PRIVATE int sqlite3BtreeDelete(BtCursor *pCur, u8 flags){ rc = saveCursorKey(pCur); if( rc ) return rc; }else{ - bSkipnext = 1; + bPreserve = 2; } } @@ -74947,8 +75569,8 @@ SQLITE_PRIVATE int sqlite3BtreeDelete(BtCursor *pCur, u8 flags){ } if( rc==SQLITE_OK ){ - if( bSkipnext ){ - assert( bPreserve && (pCur->iPage==iCellDepth || CORRUPT_DB) ); + if( bPreserve>1 ){ + assert( (pCur->iPage==iCellDepth || CORRUPT_DB) ); assert( pPage==pCur->pPage || CORRUPT_DB ); assert( (pPage->nCell>0 || CORRUPT_DB) && iCellIdx<=pPage->nCell ); pCur->eState = CURSOR_SKIPNEXT; @@ -75158,7 +75780,7 @@ static int clearDatabasePage( rc = getAndInitPage(pBt, pgno, &pPage, 0, 0); if( rc ) return rc; if( (pBt->openFlags & BTREE_SINGLE)==0 - && sqlite3PagerPageRefcount(pPage->pDbPage)!=1 + && sqlite3PagerPageRefcount(pPage->pDbPage) != (1 + (pgno==1)) ){ rc = SQLITE_CORRUPT_BKPT; goto cleardatabasepage_out; @@ -76538,14 +77160,13 @@ static Btree *findBtree(sqlite3 *pErrorDb, sqlite3 *pDb, const char *zDb){ if( i==1 ){ Parse sParse; int rc = 0; - memset(&sParse, 0, sizeof(sParse)); - sParse.db = pDb; + sqlite3ParseObjectInit(&sParse,pDb); if( sqlite3OpenTempDatabase(&sParse) ){ sqlite3ErrorWithMsg(pErrorDb, sParse.rc, "%s", sParse.zErrMsg); rc = SQLITE_ERROR; } sqlite3DbFree(pErrorDb, sParse.zErrMsg); - sqlite3ParserReset(&sParse); + sqlite3ParseObjectReset(&sParse); if( rc ){ return 0; } @@ -77823,12 +78444,12 @@ static SQLITE_NOINLINE i64 doubleToInt64(double r){ ** ** If pMem represents a string value, its encoding might be changed. */ -static SQLITE_NOINLINE i64 memIntValue(Mem *pMem){ +static SQLITE_NOINLINE i64 memIntValue(const Mem *pMem){ i64 value = 0; sqlite3Atoi64(pMem->z, &value, pMem->n, pMem->enc); return value; } -SQLITE_PRIVATE i64 sqlite3VdbeIntValue(Mem *pMem){ +SQLITE_PRIVATE i64 sqlite3VdbeIntValue(const Mem *pMem){ int flags; assert( pMem!=0 ); assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) ); @@ -78143,6 +78764,7 @@ SQLITE_PRIVATE void sqlite3VdbeMemSetPointer( void (*xDestructor)(void*) ){ assert( pMem->flags==MEM_Null ); + vdbeMemClear(pMem); pMem->u.zPType = zPType ? zPType : ""; pMem->z = pPtr; pMem->flags = MEM_Null|MEM_Dyn|MEM_Subtype|MEM_Term; @@ -78757,11 +79379,7 @@ static int valueFromExpr( assert( pExpr!=0 ); while( (op = pExpr->op)==TK_UPLUS || op==TK_SPAN ) pExpr = pExpr->pLeft; -#if defined(SQLITE_ENABLE_STAT4) if( op==TK_REGISTER ) op = pExpr->op2; -#else - if( NEVER(op==TK_REGISTER) ) op = pExpr->op2; -#endif /* Compressed expressions only appear when parsing the DEFAULT clause ** on a table column definition, and hence only when pCtx==0. This @@ -78876,7 +79494,7 @@ static int valueFromExpr( no_mem: #ifdef SQLITE_ENABLE_STAT4 - if( pCtx==0 || pCtx->pParse->nErr==0 ) + if( pCtx==0 || NEVER(pCtx->pParse->nErr==0) ) #endif sqlite3OomFault(db); sqlite3DbFree(db, zVal); @@ -80554,8 +81172,7 @@ SQLITE_PRIVATE void sqlite3VdbeSetP4KeyInfo(Parse *pParse, Index *pIdx){ */ static void vdbeVComment(Vdbe *p, const char *zFormat, va_list ap){ assert( p->nOp>0 || p->aOp==0 ); - assert( p->aOp==0 || p->aOp[p->nOp-1].zComment==0 || p->db->mallocFailed - || p->pParse->nErr>0 ); + assert( p->aOp==0 || p->aOp[p->nOp-1].zComment==0 || p->pParse->nErr>0 ); if( p->nOp ){ assert( p->aOp ); sqlite3DbFree(p->db, p->aOp[p->nOp-1].zComment); @@ -81646,8 +82263,6 @@ SQLITE_PRIVATE void sqlite3VdbeFreeCursor(Vdbe *p, VdbeCursor *pCx){ if( pCx==0 ){ return; } - assert( pCx->pBtx==0 || pCx->eCurType==CURTYPE_BTREE ); - assert( pCx->pBtx==0 || pCx->isEphemeral ); switch( pCx->eCurType ){ case CURTYPE_SORTER: { sqlite3VdbeSorterClose(p->db, pCx); @@ -82428,6 +83043,7 @@ SQLITE_PRIVATE int sqlite3VdbeTransferError(Vdbe *p){ sqlite3ValueSetNull(db->pErr); } db->errCode = rc; + db->errByteOffset = -1; return rc; } @@ -82749,7 +83365,7 @@ SQLITE_PRIVATE int sqlite3VdbeCursorMoveto(VdbeCursor **pp, u32 *piCol){ if( p->deferredMoveto ){ u32 iMap; assert( !p->isEphemeral ); - if( p->aAltMap && (iMap = p->aAltMap[1+*piCol])>0 && !p->nullRow ){ + if( p->ub.aAltMap && (iMap = p->ub.aAltMap[1+*piCol])>0 && !p->nullRow ){ *pp = p->pAltCursor; *piCol = iMap - 1; return SQLITE_OK; @@ -83027,14 +83643,14 @@ SQLITE_PRIVATE u32 sqlite3VdbeSerialPut(u8 *buf, Mem *pMem, u32 serial_type){ /* ** Deserialize the data blob pointed to by buf as serial type serial_type -** and store the result in pMem. Return the number of bytes read. +** and store the result in pMem. ** ** This function is implemented as two separate routines for performance. ** The few cases that require local variables are broken out into a separate ** routine so that in most cases the overhead of moving the stack pointer ** is avoided. */ -static u32 serialGet( +static void serialGet( const unsigned char *buf, /* Buffer to deserialize from */ u32 serial_type, /* Serial type to deserialize */ Mem *pMem /* Memory cell to write value into */ @@ -83068,9 +83684,8 @@ static u32 serialGet( memcpy(&pMem->u.r, &x, sizeof(x)); pMem->flags = IsNaN(x) ? MEM_Null : MEM_Real; } - return 8; } -SQLITE_PRIVATE u32 sqlite3VdbeSerialGet( +SQLITE_PRIVATE void sqlite3VdbeSerialGet( const unsigned char *buf, /* Buffer to deserialize from */ u32 serial_type, /* Serial type to deserialize */ Mem *pMem /* Memory cell to write value into */ @@ -83081,13 +83696,13 @@ SQLITE_PRIVATE u32 sqlite3VdbeSerialGet( pMem->flags = MEM_Null|MEM_Zero; pMem->n = 0; pMem->u.nZero = 0; - break; + return; } case 11: /* Reserved for future use */ case 0: { /* Null */ /* EVIDENCE-OF: R-24078-09375 Value is a NULL. */ pMem->flags = MEM_Null; - break; + return; } case 1: { /* EVIDENCE-OF: R-44885-25196 Value is an 8-bit twos-complement @@ -83095,7 +83710,7 @@ SQLITE_PRIVATE u32 sqlite3VdbeSerialGet( pMem->u.i = ONE_BYTE_INT(buf); pMem->flags = MEM_Int; testcase( pMem->u.i<0 ); - return 1; + return; } case 2: { /* 2-byte signed integer */ /* EVIDENCE-OF: R-49794-35026 Value is a big-endian 16-bit @@ -83103,7 +83718,7 @@ SQLITE_PRIVATE u32 sqlite3VdbeSerialGet( pMem->u.i = TWO_BYTE_INT(buf); pMem->flags = MEM_Int; testcase( pMem->u.i<0 ); - return 2; + return; } case 3: { /* 3-byte signed integer */ /* EVIDENCE-OF: R-37839-54301 Value is a big-endian 24-bit @@ -83111,7 +83726,7 @@ SQLITE_PRIVATE u32 sqlite3VdbeSerialGet( pMem->u.i = THREE_BYTE_INT(buf); pMem->flags = MEM_Int; testcase( pMem->u.i<0 ); - return 3; + return; } case 4: { /* 4-byte signed integer */ /* EVIDENCE-OF: R-01849-26079 Value is a big-endian 32-bit @@ -83123,7 +83738,7 @@ SQLITE_PRIVATE u32 sqlite3VdbeSerialGet( #endif pMem->flags = MEM_Int; testcase( pMem->u.i<0 ); - return 4; + return; } case 5: { /* 6-byte signed integer */ /* EVIDENCE-OF: R-50385-09674 Value is a big-endian 48-bit @@ -83131,13 +83746,14 @@ SQLITE_PRIVATE u32 sqlite3VdbeSerialGet( pMem->u.i = FOUR_BYTE_UINT(buf+2) + (((i64)1)<<32)*TWO_BYTE_INT(buf); pMem->flags = MEM_Int; testcase( pMem->u.i<0 ); - return 6; + return; } case 6: /* 8-byte signed integer */ case 7: { /* IEEE floating point */ /* These use local variables, so do them in a separate routine ** to avoid having to move the frame pointer in the common case */ - return serialGet(buf,serial_type,pMem); + serialGet(buf,serial_type,pMem); + return; } case 8: /* Integer 0 */ case 9: { /* Integer 1 */ @@ -83145,7 +83761,7 @@ SQLITE_PRIVATE u32 sqlite3VdbeSerialGet( /* EVIDENCE-OF: R-18143-12121 Value is the integer 1. */ pMem->u.i = serial_type-8; pMem->flags = MEM_Int; - return 0; + return; } default: { /* EVIDENCE-OF: R-14606-31564 Value is a BLOB that is (N-12)/2 bytes in @@ -83156,10 +83772,10 @@ SQLITE_PRIVATE u32 sqlite3VdbeSerialGet( pMem->z = (char *)buf; pMem->n = (serial_type-12)/2; pMem->flags = aFlag[serial_type&1]; - return pMem->n; + return; } } - return 0; + return; } /* ** This routine is used to allocate sufficient space for an UnpackedRecord @@ -83222,7 +83838,8 @@ SQLITE_PRIVATE void sqlite3VdbeRecordUnpack( /* pMem->flags = 0; // sqlite3VdbeSerialGet() will set this for us */ pMem->szMalloc = 0; pMem->z = 0; - d += sqlite3VdbeSerialGet(&aKey[d], serial_type, pMem); + sqlite3VdbeSerialGet(&aKey[d], serial_type, pMem); + d += sqlite3VdbeSerialTypeLen(serial_type); pMem++; if( (++u)>=p->nField ) break; } @@ -83306,7 +83923,8 @@ static int vdbeRecordCompareDebug( /* Extract the values to be compared. */ - d1 += sqlite3VdbeSerialGet(&aKey1[d1], serial_type1, &mem1); + sqlite3VdbeSerialGet(&aKey1[d1], serial_type1, &mem1); + d1 += sqlite3VdbeSerialTypeLen(serial_type1); /* Do the comparison */ @@ -85284,6 +85902,70 @@ SQLITE_API int sqlite3_vtab_nochange(sqlite3_context *p){ return sqlite3_value_nochange(p->pOut); } +/* +** Implementation of sqlite3_vtab_in_first() (if bNext==0) and +** sqlite3_vtab_in_next() (if bNext!=0). +*/ +static int valueFromValueList( + sqlite3_value *pVal, /* Pointer to the ValueList object */ + sqlite3_value **ppOut, /* Store the next value from the list here */ + int bNext /* 1 for _next(). 0 for _first() */ +){ + int rc; + ValueList *pRhs; + + *ppOut = 0; + if( pVal==0 ) return SQLITE_MISUSE; + pRhs = (ValueList*)sqlite3_value_pointer(pVal, "ValueList"); + if( pRhs==0 ) return SQLITE_MISUSE; + if( bNext ){ + rc = sqlite3BtreeNext(pRhs->pCsr, 0); + }else{ + int dummy = 0; + rc = sqlite3BtreeFirst(pRhs->pCsr, &dummy); + assert( rc==SQLITE_OK || sqlite3BtreeEof(pRhs->pCsr) ); + if( sqlite3BtreeEof(pRhs->pCsr) ) rc = SQLITE_DONE; + } + if( rc==SQLITE_OK ){ + u32 sz; /* Size of current row in bytes */ + Mem sMem; /* Raw content of current row */ + memset(&sMem, 0, sizeof(sMem)); + sz = sqlite3BtreePayloadSize(pRhs->pCsr); + rc = sqlite3VdbeMemFromBtreeZeroOffset(pRhs->pCsr,(int)sz,&sMem); + if( rc==SQLITE_OK ){ + u8 *zBuf = (u8*)sMem.z; + u32 iSerial; + sqlite3_value *pOut = pRhs->pOut; + int iOff = 1 + getVarint32(&zBuf[1], iSerial); + sqlite3VdbeSerialGet(&zBuf[iOff], iSerial, pOut); + pOut->enc = ENC(pOut->db); + if( (pOut->flags & MEM_Ephem)!=0 && sqlite3VdbeMemMakeWriteable(pOut) ){ + rc = SQLITE_NOMEM; + }else{ + *ppOut = pOut; + } + } + sqlite3VdbeMemRelease(&sMem); + } + return rc; +} + +/* +** Set the iterator value pVal to point to the first value in the set. +** Set (*ppOut) to point to this value before returning. +*/ +SQLITE_API int sqlite3_vtab_in_first(sqlite3_value *pVal, sqlite3_value **ppOut){ + return valueFromValueList(pVal, ppOut, 0); +} + +/* +** Set the iterator value pVal to point to the next value in the set. +** Set (*ppOut) to point to this value before returning. +*/ +SQLITE_API int sqlite3_vtab_in_next(sqlite3_value *pVal, sqlite3_value **ppOut){ + return valueFromValueList(pVal, ppOut, 1); +} + /* ** Return the current time for a statement. If the current time ** is requested more than once within the same run of a single prepared @@ -85968,7 +86650,10 @@ SQLITE_API int sqlite3_bind_value(sqlite3_stmt *pStmt, int i, const sqlite3_valu break; } case SQLITE_FLOAT: { - rc = sqlite3_bind_double(pStmt, i, pValue->u.r); + assert( pValue->flags & (MEM_Real|MEM_IntReal) ); + rc = sqlite3_bind_double(pStmt, i, + (pValue->flags & MEM_Real) ? pValue->u.r : (double)pValue->u.i + ); break; } case SQLITE_BLOB: { @@ -86948,7 +87633,6 @@ static VdbeCursor *allocateCursor( Vdbe *p, /* The virtual machine */ int iCur, /* Index of the new VdbeCursor */ int nField, /* Number of fields in the table or index */ - int iDb, /* Database the cursor belongs to, or -1 */ u8 eCurType /* Type of the new cursor */ ){ /* Find the memory cell that will be used to store the blob of memory @@ -87005,7 +87689,6 @@ static VdbeCursor *allocateCursor( p->apCsr[iCur] = pCx = (VdbeCursor*)pMem->zMalloc; memset(pCx, 0, offsetof(VdbeCursor,pAltCursor)); pCx->eCurType = eCurType; - pCx->iDb = iDb; pCx->nField = nField; pCx->aOffset = &pCx->aType[nField]; if( eCurType==CURTYPE_BTREE ){ @@ -87378,6 +88061,29 @@ static Mem *out2Prerelease(Vdbe *p, VdbeOp *pOp){ } } +/* +** Compute a bloom filter hash using pOp->p4.i registers from aMem[] beginning +** with pOp->p3. Return the hash. +*/ +static u64 filterHash(const Mem *aMem, const Op *pOp){ + int i, mx; + u64 h = 0; + + assert( pOp->p4type==P4_INT32 ); + for(i=pOp->p3, mx=i+pOp->p4.i; iflags & (MEM_Int|MEM_IntReal) ){ + h += p->u.i; + }else if( p->flags & MEM_Real ){ + h += sqlite3VdbeIntValue(p); + }else if( p->flags & (MEM_Str|MEM_Blob) ){ + h += p->n; + if( p->flags & MEM_Zero ) h += p->u.nZero; + } + } + return h; +} + /* ** Return the symbolic name for the data type of a pMem */ @@ -88032,12 +88738,18 @@ case OP_SoftNull: { ** Synopsis: r[P2]=P4 (len=P1) ** ** P4 points to a blob of data P1 bytes long. Store this -** blob in register P2. +** blob in register P2. If P4 is a NULL pointer, then construct +** a zero-filled blob that is P1 bytes long in P2. */ case OP_Blob: { /* out2 */ assert( pOp->p1 <= SQLITE_MAX_LENGTH ); pOut = out2Prerelease(p, pOp); - sqlite3VdbeMemSetStr(pOut, pOp->p4.z, pOp->p1, 0, 0); + if( pOp->p4.z==0 ){ + sqlite3VdbeMemSetZeroBlob(pOut, pOp->p1); + if( sqlite3VdbeMemExpandBlob(pOut) ) goto no_mem; + }else{ + sqlite3VdbeMemSetStr(pOut, pOp->p4.z, pOp->p1, 0, 0); + } pOut->enc = encoding; UPDATE_MAX_BLOBSIZE(pOut); break; @@ -88186,24 +88898,22 @@ case OP_IntCopy: { /* out2 */ break; } -/* Opcode: ChngCntRow P1 P2 * * * -** Synopsis: output=r[P1] +/* Opcode: FkCheck * * * * * ** -** Output value in register P1 as the chance count for a DML statement, -** due to the "PRAGMA count_changes=ON" setting. Or, if there was a -** foreign key error in the statement, trigger the error now. +** Halt with an SQLITE_CONSTRAINT error if there are any unresolved +** foreign key constraint violations. If there are no foreign key +** constraint violations, this is a no-op. ** -** This opcode is a variant of OP_ResultRow that checks the foreign key -** immediate constraint count and throws an error if the count is -** non-zero. The P2 opcode must be 1. +** FK constraint violations are also checked when the prepared statement +** exits. This opcode is used to raise foreign key constraint errors prior +** to returning results such as a row change count or the result of a +** RETURNING clause. */ -case OP_ChngCntRow: { - assert( pOp->p2==1 ); +case OP_FkCheck: { if( (rc = sqlite3VdbeCheckFk(p,0))!=SQLITE_OK ){ goto abort_due_to_error; } - /* Fall through to the next case, OP_ResultRow */ - /* no break */ deliberate_fall_through + break; } /* Opcode: ResultRow P1 P2 * * * @@ -88841,7 +89551,7 @@ case OP_Ge: { /* same as TK_GE, jump, in1, in3 */ sqlite3VdbeMemStringify(pIn1, encoding, 1); testcase( (flags1&MEM_Dyn) != (pIn1->flags&MEM_Dyn) ); flags1 = (pIn1->flags & ~MEM_TypeMask) | (flags1 & MEM_TypeMask); - if( NEVER(pIn1==pIn3) ) flags3 = flags1 | MEM_Str; + if( pIn1==pIn3 ) flags3 = flags1 | MEM_Str; } if( (flags3 & MEM_Str)==0 && (flags3&(MEM_Int|MEM_Real|MEM_IntReal))!=0 ){ testcase( pIn3->flags & MEM_Int ); @@ -89309,10 +90019,18 @@ case OP_Offset: { /* out3 */ assert( pOp->p1>=0 && pOp->p1nCursor ); pC = p->apCsr[pOp->p1]; pOut = &p->aMem[pOp->p3]; - if( NEVER(pC==0) || pC->eCurType!=CURTYPE_BTREE ){ + if( pC==0 || pC->eCurType!=CURTYPE_BTREE ){ sqlite3VdbeMemSetNull(pOut); }else{ - sqlite3VdbeMemSetInt64(pOut, sqlite3BtreeOffset(pC->uc.pCursor)); + if( pC->deferredMoveto ){ + rc = sqlite3VdbeFinishMoveto(pC); + if( rc ) goto abort_due_to_error; + } + if( sqlite3BtreeEof(pC->uc.pCursor) ){ + sqlite3VdbeMemSetNull(pOut); + }else{ + sqlite3VdbeMemSetInt64(pOut, sqlite3BtreeOffset(pC->uc.pCursor)); + } } break; } @@ -89371,6 +90089,7 @@ case OP_Column: { assert( pC!=0 ); assert( p2<(u32)pC->nField ); aOffset = pC->aOffset; + assert( aOffset==pC->aType+pC->nField ); assert( pC->eCurType!=CURTYPE_VTAB ); assert( pC->eCurType!=CURTYPE_PSEUDO || pC->nullRow ); assert( pC->eCurType!=CURTYPE_SORTER ); @@ -89666,6 +90385,8 @@ case OP_TypeCheck: { break; } case COLTYPE_REAL: { + testcase( (pIn1->flags & (MEM_Real|MEM_IntReal))==MEM_Real ); + testcase( (pIn1->flags & (MEM_Real|MEM_IntReal))==MEM_IntReal ); if( pIn1->flags & MEM_Int ){ /* When applying REAL affinity, if the result is still an MEM_Int ** that will fit in 6 bytes, then change the type to MEM_IntReal @@ -89683,7 +90404,7 @@ case OP_TypeCheck: { pIn1->flags |= MEM_Real; pIn1->flags &= ~MEM_Int; } - }else if( (pIn1->flags & MEM_Real)==0 ){ + }else if( (pIn1->flags & (MEM_Real|MEM_IntReal))==0 ){ goto vdbe_type_error; } break; @@ -89922,7 +90643,7 @@ case OP_MakeRecord: { testcase( uu==127 ); testcase( uu==128 ); testcase( uu==32767 ); testcase( uu==32768 ); testcase( uu==8388607 ); testcase( uu==8388608 ); - testcase( uu==2147483647 ); testcase( uu==2147483648 ); + testcase( uu==2147483647 ); testcase( uu==2147483648LL ); testcase( uu==140737488355327LL ); testcase( uu==140737488355328LL ); if( uu<=127 ){ if( (i&1)==i && file_format>=4 ){ @@ -90050,7 +90771,7 @@ case OP_MakeRecord: { break; } -/* Opcode: Count P1 P2 p3 * * +/* Opcode: Count P1 P2 P3 * * ** Synopsis: r[P2]=count() ** ** Store the number of entries (an integer value) in the table or index @@ -90698,8 +91419,9 @@ case OP_OpenWrite: assert( pOp->p1>=0 ); assert( nField>=0 ); testcase( nField==0 ); /* Table with INTEGER PRIMARY KEY and nothing else */ - pCur = allocateCursor(p, pOp->p1, nField, iDb, CURTYPE_BTREE); + pCur = allocateCursor(p, pOp->p1, nField, CURTYPE_BTREE); if( pCur==0 ) goto no_mem; + pCur->iDb = iDb; pCur->nullRow = 1; pCur->isOrdered = 1; pCur->pgnoRoot = p2; @@ -90741,7 +91463,7 @@ case OP_OpenDup: { assert( pOrig ); assert( pOrig->isEphemeral ); /* Only ephemeral cursors can be duplicated */ - pCx = allocateCursor(p, pOp->p1, pOrig->nField, -1, CURTYPE_BTREE); + pCx = allocateCursor(p, pOp->p1, pOrig->nField, CURTYPE_BTREE); if( pCx==0 ) goto no_mem; pCx->nullRow = 1; pCx->isEphemeral = 1; @@ -90749,10 +91471,10 @@ case OP_OpenDup: { pCx->isTable = pOrig->isTable; pCx->pgnoRoot = pOrig->pgnoRoot; pCx->isOrdered = pOrig->isOrdered; - pCx->pBtx = pOrig->pBtx; + pCx->ub.pBtx = pOrig->ub.pBtx; pCx->hasBeenDuped = 1; pOrig->hasBeenDuped = 1; - rc = sqlite3BtreeCursor(pCx->pBtx, pCx->pgnoRoot, BTREE_WRCSR, + rc = sqlite3BtreeCursor(pCx->ub.pBtx, pCx->pgnoRoot, BTREE_WRCSR, pCx->pKeyInfo, pCx->uc.pCursor); /* The sqlite3BtreeCursor() routine can only fail for the first cursor ** opened for a database. Since there is already an open cursor when this @@ -90825,16 +91547,16 @@ case OP_OpenEphemeral: { assert( pCx->isEphemeral ); pCx->seqCount = 0; pCx->cacheStatus = CACHE_STALE; - rc = sqlite3BtreeClearTable(pCx->pBtx, pCx->pgnoRoot, 0); + rc = sqlite3BtreeClearTable(pCx->ub.pBtx, pCx->pgnoRoot, 0); }else{ - pCx = allocateCursor(p, pOp->p1, pOp->p2, -1, CURTYPE_BTREE); + pCx = allocateCursor(p, pOp->p1, pOp->p2, CURTYPE_BTREE); if( pCx==0 ) goto no_mem; pCx->isEphemeral = 1; - rc = sqlite3BtreeOpen(db->pVfs, 0, db, &pCx->pBtx, + rc = sqlite3BtreeOpen(db->pVfs, 0, db, &pCx->ub.pBtx, BTREE_OMIT_JOURNAL | BTREE_SINGLE | pOp->p5, vfsFlags); if( rc==SQLITE_OK ){ - rc = sqlite3BtreeBeginTrans(pCx->pBtx, 1, 0); + rc = sqlite3BtreeBeginTrans(pCx->ub.pBtx, 1, 0); if( rc==SQLITE_OK ){ /* If a transient index is required, create it by calling ** sqlite3BtreeCreateTable() with the BTREE_BLOBKEY flag before @@ -90843,26 +91565,26 @@ case OP_OpenEphemeral: { */ if( (pCx->pKeyInfo = pKeyInfo = pOp->p4.pKeyInfo)!=0 ){ assert( pOp->p4type==P4_KEYINFO ); - rc = sqlite3BtreeCreateTable(pCx->pBtx, &pCx->pgnoRoot, + rc = sqlite3BtreeCreateTable(pCx->ub.pBtx, &pCx->pgnoRoot, BTREE_BLOBKEY | pOp->p5); if( rc==SQLITE_OK ){ assert( pCx->pgnoRoot==SCHEMA_ROOT+1 ); assert( pKeyInfo->db==db ); assert( pKeyInfo->enc==ENC(db) ); - rc = sqlite3BtreeCursor(pCx->pBtx, pCx->pgnoRoot, BTREE_WRCSR, + rc = sqlite3BtreeCursor(pCx->ub.pBtx, pCx->pgnoRoot, BTREE_WRCSR, pKeyInfo, pCx->uc.pCursor); } pCx->isTable = 0; }else{ pCx->pgnoRoot = SCHEMA_ROOT; - rc = sqlite3BtreeCursor(pCx->pBtx, SCHEMA_ROOT, BTREE_WRCSR, + rc = sqlite3BtreeCursor(pCx->ub.pBtx, SCHEMA_ROOT, BTREE_WRCSR, 0, pCx->uc.pCursor); pCx->isTable = 1; } } pCx->isOrdered = (pOp->p5!=BTREE_UNORDERED); if( rc ){ - sqlite3BtreeClose(pCx->pBtx); + sqlite3BtreeClose(pCx->ub.pBtx); } } } @@ -90886,7 +91608,7 @@ case OP_SorterOpen: { assert( pOp->p1>=0 ); assert( pOp->p2>=0 ); - pCx = allocateCursor(p, pOp->p1, pOp->p2, -1, CURTYPE_SORTER); + pCx = allocateCursor(p, pOp->p1, pOp->p2, CURTYPE_SORTER); if( pCx==0 ) goto no_mem; pCx->pKeyInfo = pOp->p4.pKeyInfo; assert( pCx->pKeyInfo->db==db ); @@ -90935,7 +91657,7 @@ case OP_OpenPseudo: { assert( pOp->p1>=0 ); assert( pOp->p3>=0 ); - pCx = allocateCursor(p, pOp->p1, pOp->p3, -1, CURTYPE_PSEUDO); + pCx = allocateCursor(p, pOp->p1, pOp->p3, CURTYPE_PSEUDO); if( pCx==0 ) goto no_mem; pCx->nullRow = 1; pCx->seekResult = pOp->p2; @@ -92387,6 +93109,10 @@ case OP_Rowid: { /* out2 */ ** Move the cursor P1 to a null row. Any OP_Column operations ** that occur while the cursor is on the null row will always ** write a NULL. +** +** Or, if P1 is a Pseudo-Cursor (a cursor opened using OP_OpenPseudo) +** just reset the cache for that cursor. This causes the row of +** content held by the pseudo-cursor to be reparsed. */ case OP_NullRow: { VdbeCursor *pC; @@ -92875,9 +93601,9 @@ case OP_IdxRowid: { /* out2 */ pTabCur->movetoTarget = rowid; pTabCur->deferredMoveto = 1; assert( pOp->p4type==P4_INTARRAY || pOp->p4.ai==0 ); - pTabCur->aAltMap = pOp->p4.ai; - assert( !pC->isEphemeral ); assert( !pTabCur->isEphemeral ); + pTabCur->ub.aAltMap = pOp->p4.ai; + assert( !pC->isEphemeral ); pTabCur->pAltCursor = pC; }else{ pOut = out2Prerelease(p, pOp); @@ -94399,7 +95125,7 @@ case OP_VOpen: { pVCur->pVtab = pVtab; /* Initialize vdbe cursor object */ - pCur = allocateCursor(p, pOp->p1, 0, -1, CURTYPE_VTAB); + pCur = allocateCursor(p, pOp->p1, 0, CURTYPE_VTAB); if( pCur ){ pCur->uc.pVCur = pVCur; pVtab->nRef++; @@ -94412,6 +95138,34 @@ case OP_VOpen: { } #endif /* SQLITE_OMIT_VIRTUALTABLE */ +#ifndef SQLITE_OMIT_VIRTUALTABLE +/* Opcode: VInitIn P1 P2 P3 * * +** Synopsis: r[P2]=ValueList(P1,P3) +** +** Set register P2 to be a pointer to a ValueList object for cursor P1 +** with cache register P3 and output register P3+1. This ValueList object +** can be used as the first argument to sqlite3_vtab_in_first() and +** sqlite3_vtab_in_next() to extract all of the values stored in the P1 +** cursor. Register P3 is used to hold the values returned by +** sqlite3_vtab_in_first() and sqlite3_vtab_in_next(). +*/ +case OP_VInitIn: { /* out2 */ + VdbeCursor *pC; /* The cursor containing the RHS values */ + ValueList *pRhs; /* New ValueList object to put in reg[P2] */ + + pC = p->apCsr[pOp->p1]; + pRhs = sqlite3_malloc64( sizeof(*pRhs) ); + if( pRhs==0 ) goto no_mem; + pRhs->pCsr = pC->uc.pCursor; + pRhs->pOut = &aMem[pOp->p3]; + pOut = out2Prerelease(p, pOp); + pOut->flags = MEM_Null; + sqlite3VdbeMemSetPointer(pOut, pRhs, "ValueList", sqlite3_free); + break; +} +#endif /* SQLITE_OMIT_VIRTUALTABLE */ + + #ifndef SQLITE_OMIT_VIRTUALTABLE /* Opcode: VFilter P1 P2 P3 P4 * ** Synopsis: iplan=r[P3] zplan='P4' @@ -94837,6 +95591,77 @@ case OP_Function: { /* group */ break; } +/* Opcode: FilterAdd P1 * P3 P4 * +** Synopsis: filter(P1) += key(P3@P4) +** +** Compute a hash on the P4 registers starting with r[P3] and +** add that hash to the bloom filter contained in r[P1]. +*/ +case OP_FilterAdd: { + u64 h; + + assert( pOp->p1>0 && pOp->p1<=(p->nMem+1 - p->nCursor) ); + pIn1 = &aMem[pOp->p1]; + assert( pIn1->flags & MEM_Blob ); + assert( pIn1->n>0 ); + h = filterHash(aMem, pOp); +#ifdef SQLITE_DEBUG + if( db->flags&SQLITE_VdbeTrace ){ + int ii; + for(ii=pOp->p3; iip3+pOp->p4.i; ii++){ + registerTrace(ii, &aMem[ii]); + } + printf("hash: %llu modulo %d -> %u\n", h, pIn1->n, (int)(h%pIn1->n)); + } +#endif + h %= pIn1->n; + pIn1->z[h/8] |= 1<<(h&7); + break; +} + +/* Opcode: Filter P1 P2 P3 P4 * +** Synopsis: if key(P3@P4) not in filter(P1) goto P2 +** +** Compute a hash on the key contained in the P4 registers starting +** with r[P3]. Check to see if that hash is found in the +** bloom filter hosted by register P1. If it is not present then +** maybe jump to P2. Otherwise fall through. +** +** False negatives are harmless. It is always safe to fall through, +** even if the value is in the bloom filter. A false negative causes +** more CPU cycles to be used, but it should still yield the correct +** answer. However, an incorrect answer may well arise from a +** false positive - if the jump is taken when it should fall through. +*/ +case OP_Filter: { /* jump */ + u64 h; + + assert( pOp->p1>0 && pOp->p1<=(p->nMem+1 - p->nCursor) ); + pIn1 = &aMem[pOp->p1]; + assert( (pIn1->flags & MEM_Blob)!=0 ); + assert( pIn1->n >= 1 ); + h = filterHash(aMem, pOp); +#ifdef SQLITE_DEBUG + if( db->flags&SQLITE_VdbeTrace ){ + int ii; + for(ii=pOp->p3; iip3+pOp->p4.i; ii++){ + registerTrace(ii, &aMem[ii]); + } + printf("hash: %llu modulo %d -> %u\n", h, pIn1->n, (int)(h%pIn1->n)); + } +#endif + h %= pIn1->n; + if( (pIn1->z[h/8] & (1<<(h&7)))==0 ){ + VdbeBranchTaken(1, 2); + p->aCounter[SQLITE_STMTSTATUS_FILTER_HIT]++; + goto jump_to_p2; + }else{ + p->aCounter[SQLITE_STMTSTATUS_FILTER_MISS]++; + VdbeBranchTaken(0, 2); + } + break; +} + /* Opcode: Trace P1 P2 * P4 * ** ** Write P4 on the statement trace output if statement tracing is @@ -95327,10 +96152,9 @@ SQLITE_API int sqlite3_blob_open( sqlite3_mutex_enter(db->mutex); pBlob = (Incrblob *)sqlite3DbMallocZero(db, sizeof(Incrblob)); - do { - memset(&sParse, 0, sizeof(Parse)); + while(1){ + sqlite3ParseObjectInit(&sParse,db); if( !pBlob ) goto blob_open_out; - sParse.db = db; sqlite3DbFree(db, zErr); zErr = 0; @@ -95507,7 +96331,9 @@ SQLITE_API int sqlite3_blob_open( goto blob_open_out; } rc = blobSeekToRow(pBlob, iRow, &zErr); - } while( (++nAttempt)=SQLITE_MAX_SCHEMA_RETRY || rc!=SQLITE_SCHEMA ) break; + sqlite3ParseObjectReset(&sParse); + } blob_open_out: if( rc==SQLITE_OK && db->mallocFailed==0 ){ @@ -95518,7 +96344,7 @@ SQLITE_API int sqlite3_blob_open( } sqlite3ErrorWithMsg(db, rc, (zErr ? "%s" : 0), zErr); sqlite3DbFree(db, zErr); - sqlite3ParserReset(&sParse); + sqlite3ParseObjectReset(&sParse); rc = sqlite3ApiExit(db, rc); sqlite3_mutex_leave(db->mutex); return rc; @@ -96653,7 +97479,8 @@ SQLITE_PRIVATE int sqlite3VdbeSorterInit( } #endif - assert( pCsr->pKeyInfo && pCsr->pBtx==0 ); + assert( pCsr->pKeyInfo ); + assert( !pCsr->isEphemeral ); assert( pCsr->eCurType==CURTYPE_SORTER ); szKeyInfo = sizeof(KeyInfo) + (pCsr->pKeyInfo->nKeyField-1)*sizeof(CollSeq*); sz = sizeof(VdbeSorter) + nWorker * sizeof(SortSubtask); @@ -99066,6 +99893,9 @@ static int memjrnlCreateFile(MemJournal *p){ } +/* Forward reference */ +static int memjrnlTruncate(sqlite3_file *pJfd, sqlite_int64 size); + /* ** Write data to the file. */ @@ -99096,22 +99926,20 @@ static int memjrnlWrite( ** the in-memory journal is being used by a connection using the ** atomic-write optimization. In this case the first 28 bytes of the ** journal file may be written as part of committing the transaction. */ - assert( iOfst==p->endpoint.iOffset || iOfst==0 ); -#if defined(SQLITE_ENABLE_ATOMIC_WRITE) \ - || defined(SQLITE_ENABLE_BATCH_ATOMIC_WRITE) + assert( iOfst<=p->endpoint.iOffset ); + if( iOfst>0 && iOfst!=p->endpoint.iOffset ){ + memjrnlTruncate(pJfd, iOfst); + } if( iOfst==0 && p->pFirst ){ assert( p->nChunkSize>iAmt ); memcpy((u8*)p->pFirst->zChunk, zBuf, iAmt); - }else -#else - assert( iOfst>0 || p->pFirst==0 ); -#endif - { + }else{ while( nWrite>0 ){ FileChunk *pChunk = p->endpoint.pChunk; int iChunkOffset = (int)(p->endpoint.iOffset%p->nChunkSize); int iSpace = MIN(nWrite, p->nChunkSize - iChunkOffset); + assert( pChunk!=0 || iChunkOffset==0 ); if( iChunkOffset==0 ){ /* New chunk is required to extend the file. */ FileChunk *pNew = sqlite3_malloc(fileChunkSize(p->nChunkSize)); @@ -99126,10 +99954,11 @@ static int memjrnlWrite( assert( !p->pFirst ); p->pFirst = pNew; } - p->endpoint.pChunk = pNew; + pChunk = p->endpoint.pChunk = pNew; } - memcpy((u8*)p->endpoint.pChunk->zChunk + iChunkOffset, zWrite, iSpace); + assert( pChunk!=0 ); + memcpy((u8*)pChunk->zChunk + iChunkOffset, zWrite, iSpace); zWrite += iSpace; nWrite -= iSpace; p->endpoint.iOffset += iSpace; @@ -99907,8 +100736,9 @@ static int lookupName( } if( hit || zTab==0 ) continue; } - if( zDb && pTab->pSchema!=pSchema ){ - continue; + if( zDb ){ + if( pTab->pSchema!=pSchema ) continue; + if( pSchema==0 && strcmp(zDb,"*")!=0 ) continue; } if( zTab ){ const char *zTabName = pItem->zAlias ? pItem->zAlias : pTab->zName; @@ -100039,6 +100869,7 @@ static int lookupName( pExpr->y.pTab = pTab; if( pParse->bReturning ){ eNewExprOp = TK_REGISTER; + pExpr->op2 = TK_COLUMN; pExpr->iTable = pNC->uNC.iBaseReg + (pTab->nCol+1)*pExpr->iTable + sqlite3TableColumnToStorage(pTab, iCol) + 1; }else{ @@ -100205,6 +101036,7 @@ static int lookupName( }else{ sqlite3ErrorMsg(pParse, "%s: %s", zErr, zCol); } + sqlite3RecordErrorOffsetOfExpr(pParse->db, pExpr); pParse->checkSchema = 1; pTopNC->nNcErr++; } @@ -100313,7 +101145,8 @@ static void notValidImpl( Parse *pParse, /* Leave error message here */ NameContext *pNC, /* The name context */ const char *zMsg, /* Type of error */ - Expr *pExpr /* Invalidate this expression on error */ + Expr *pExpr, /* Invalidate this expression on error */ + Expr *pError /* Associate error with this expression */ ){ const char *zIn = "partial index WHERE clauses"; if( pNC->ncFlags & NC_IdxExpr ) zIn = "index expressions"; @@ -100325,10 +101158,11 @@ static void notValidImpl( #endif sqlite3ErrorMsg(pParse, "%s prohibited in %s", zMsg, zIn); if( pExpr ) pExpr->op = TK_NULL; + sqlite3RecordErrorOffsetOfExpr(pParse->db, pError); } -#define sqlite3ResolveNotValid(P,N,M,X,E) \ +#define sqlite3ResolveNotValid(P,N,M,X,E,R) \ assert( ((X)&~(NC_IsCheck|NC_PartIdx|NC_IdxExpr|NC_GenCol))==0 ); \ - if( ((N)->ncFlags & (X))!=0 ) notValidImpl(P,N,M,E); + if( ((N)->ncFlags & (X))!=0 ) notValidImpl(P,N,M,E,R); /* ** Expression p should encode a floating point value between 1.0 and 0.0. @@ -100463,7 +101297,7 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ testcase( pNC->ncFlags & NC_IdxExpr ); testcase( pNC->ncFlags & NC_GenCol ); sqlite3ResolveNotValid(pParse, pNC, "the \".\" operator", - NC_IdxExpr|NC_GenCol, 0); + NC_IdxExpr|NC_GenCol, 0, pExpr); pRight = pExpr->pRight; if( pRight->op==TK_ID ){ zDb = 0; @@ -100494,7 +101328,6 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ int no_such_func = 0; /* True if no such function exists */ int wrong_num_args = 0; /* True if wrong number of arguments */ int is_agg = 0; /* True if is an aggregate function */ - int nId; /* Number of characters in function name */ const char *zId; /* The function name. */ FuncDef *pDef; /* Information about the function */ u8 enc = ENC(pParse->db); /* The database encoding */ @@ -100504,7 +101337,6 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ #endif assert( !ExprHasProperty(pExpr, EP_xIsSelect|EP_IntValue) ); zId = pExpr->u.zToken; - nId = sqlite3Strlen30(zId); pDef = sqlite3FindFunction(pParse->db, zId, n, enc, 0); if( pDef==0 ){ pDef = sqlite3FindFunction(pParse->db, zId, -2, enc, 0); @@ -100521,8 +101353,8 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ pExpr->iTable = exprProbability(pList->a[1].pExpr); if( pExpr->iTable<0 ){ sqlite3ErrorMsg(pParse, - "second argument to likelihood() must be a " - "constant between 0.0 and 1.0"); + "second argument to %#T() must be a " + "constant between 0.0 and 1.0", pExpr); pNC->nNcErr++; } }else{ @@ -100543,8 +101375,8 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ int auth = sqlite3AuthCheck(pParse, SQLITE_FUNCTION, 0,pDef->zName,0); if( auth!=SQLITE_OK ){ if( auth==SQLITE_DENY ){ - sqlite3ErrorMsg(pParse, "not authorized to use function: %s", - pDef->zName); + sqlite3ErrorMsg(pParse, "not authorized to use function: %#T", + pExpr); pNC->nNcErr++; } pExpr->op = TK_NULL; @@ -100567,7 +101399,7 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ ** in a CHECK constraint. SQLServer, MySQL, and PostgreSQL all ** all this. */ sqlite3ResolveNotValid(pParse, pNC, "non-deterministic functions", - NC_IdxExpr|NC_PartIdx|NC_GenCol, 0); + NC_IdxExpr|NC_PartIdx|NC_GenCol, 0, pExpr); }else{ assert( (NC_SelfRef & 0xff)==NC_SelfRef ); /* Must fit in 8 bits */ pExpr->op2 = pNC->ncFlags & NC_SelfRef; @@ -100580,7 +101412,7 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ /* Internal-use-only functions are disallowed unless the ** SQL is being compiled using sqlite3NestedParse() or ** the SQLITE_TESTCTRL_INTERNAL_FUNCTIONS test-control has be - ** used to activate internal functionsn for testing purposes */ + ** used to activate internal functions for testing purposes */ no_such_func = 1; pDef = 0; }else @@ -100599,7 +101431,7 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ ); if( pDef && pDef->xValue==0 && pWin ){ sqlite3ErrorMsg(pParse, - "%.*s() may not be used as a window function", nId, zId + "%#T() may not be used as a window function", pExpr ); pNC->nNcErr++; }else if( @@ -100613,13 +101445,13 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ }else{ zType = "aggregate"; } - sqlite3ErrorMsg(pParse, "misuse of %s function %.*s()",zType,nId,zId); + sqlite3ErrorMsg(pParse, "misuse of %s function %#T()",zType,pExpr); pNC->nNcErr++; is_agg = 0; } #else if( (is_agg && (pNC->ncFlags & NC_AllowAgg)==0) ){ - sqlite3ErrorMsg(pParse,"misuse of aggregate function %.*s()",nId,zId); + sqlite3ErrorMsg(pParse,"misuse of aggregate function %#T()",pExpr); pNC->nNcErr++; is_agg = 0; } @@ -100629,18 +101461,18 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ && pParse->explain==0 #endif ){ - sqlite3ErrorMsg(pParse, "no such function: %.*s", nId, zId); + sqlite3ErrorMsg(pParse, "no such function: %#T", pExpr); pNC->nNcErr++; }else if( wrong_num_args ){ - sqlite3ErrorMsg(pParse,"wrong number of arguments to function %.*s()", - nId, zId); + sqlite3ErrorMsg(pParse,"wrong number of arguments to function %#T()", + pExpr); pNC->nNcErr++; } #ifndef SQLITE_OMIT_WINDOWFUNC else if( is_agg==0 && ExprHasProperty(pExpr, EP_WinFunc) ){ sqlite3ErrorMsg(pParse, - "FILTER may not be used with non-aggregate %.*s()", - nId, zId + "FILTER may not be used with non-aggregate %#T()", + pExpr ); pNC->nNcErr++; } @@ -100725,7 +101557,7 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ testcase( pNC->ncFlags & NC_IdxExpr ); testcase( pNC->ncFlags & NC_GenCol ); if( pNC->ncFlags & NC_SelfRef ){ - notValidImpl(pParse, pNC, "subqueries", pExpr); + notValidImpl(pParse, pNC, "subqueries", pExpr, pExpr); }else{ sqlite3WalkSelect(pWalker, pExpr->x.pSelect); } @@ -100743,7 +101575,7 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ testcase( pNC->ncFlags & NC_IdxExpr ); testcase( pNC->ncFlags & NC_GenCol ); sqlite3ResolveNotValid(pParse, pNC, "parameters", - NC_IsCheck|NC_PartIdx|NC_IdxExpr|NC_GenCol, pExpr); + NC_IsCheck|NC_PartIdx|NC_IdxExpr|NC_GenCol, pExpr, pExpr); break; } case TK_IS: @@ -100795,11 +101627,13 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ testcase( pExpr->op==TK_ISNOT ); testcase( pExpr->op==TK_BETWEEN ); sqlite3ErrorMsg(pParse, "row value misused"); + sqlite3RecordErrorOffsetOfExpr(pParse->db, pExpr); } break; } } - return (pParse->nErr || pParse->db->mallocFailed) ? WRC_Abort : WRC_Continue; + assert( pParse->db->mallocFailed==0 || pParse->nErr!=0 ); + return pParse->nErr ? WRC_Abort : WRC_Continue; } /* @@ -100907,11 +101741,13 @@ static void resolveOutOfRangeError( Parse *pParse, /* The error context into which to write the error */ const char *zType, /* "ORDER" or "GROUP" */ int i, /* The index (1-based) of the term out of range */ - int mx /* Largest permissible value of i */ + int mx, /* Largest permissible value of i */ + Expr *pError /* Associate the error with the expression */ ){ sqlite3ErrorMsg(pParse, "%r %s BY term out of range - should be " "between 1 and %d", i, zType, mx); + sqlite3RecordErrorOffsetOfExpr(pParse->db, pError); } /* @@ -100967,7 +101803,7 @@ static int resolveCompoundOrderBy( if( NEVER(pE==0) ) continue; if( sqlite3ExprIsInteger(pE, &iCol) ){ if( iCol<=0 || iCol>pEList->nExpr ){ - resolveOutOfRangeError(pParse, "ORDER", i+1, pEList->nExpr); + resolveOutOfRangeError(pParse, "ORDER", i+1, pEList->nExpr, pE); return 1; } }else{ @@ -101063,7 +101899,7 @@ SQLITE_PRIVATE int sqlite3ResolveOrderGroupBy( for(i=0, pItem=pOrderBy->a; inExpr; i++, pItem++){ if( pItem->u.x.iOrderByCol ){ if( pItem->u.x.iOrderByCol>pEList->nExpr ){ - resolveOutOfRangeError(pParse, zType, i+1, pEList->nExpr); + resolveOutOfRangeError(pParse, zType, i+1, pEList->nExpr, 0); return 1; } resolveAlias(pParse, pEList, pItem->u.x.iOrderByCol-1, pItem->pExpr,0); @@ -101155,7 +101991,7 @@ static int resolveOrderGroupBy( ** number so that sqlite3ResolveOrderGroupBy() will convert the ** order-by term to a copy of the result-set expression */ if( iCol<1 || iCol>0xffff ){ - resolveOutOfRangeError(pParse, zType, i+1, nResult); + resolveOutOfRangeError(pParse, zType, i+1, nResult, pE2); return 1; } pItem->u.x.iOrderByCol = (u16)iCol; @@ -101213,7 +102049,7 @@ static int resolveSelectStep(Walker *pWalker, Select *p){ */ if( (p->selFlags & SF_Expanded)==0 ){ sqlite3SelectPrep(pParse, p, pOuterNC); - return (pParse->nErr || db->mallocFailed) ? WRC_Abort : WRC_Prune; + return pParse->nErr ? WRC_Abort : WRC_Prune; } isCompound = p->pPrior!=0; @@ -101261,7 +102097,8 @@ static int resolveSelectStep(Walker *pWalker, Select *p){ if( pItem->zName ) pParse->zAuthContext = pItem->zName; sqlite3ResolveSelectNames(pParse, pItem->pSelect, pOuterNC); pParse->zAuthContext = zSavedContext; - if( pParse->nErr || db->mallocFailed ) return WRC_Abort; + if( pParse->nErr ) return WRC_Abort; + assert( db->mallocFailed==0 ); /* If the number of references to the outer context changed when ** expressions in the sub-select were resolved, the sub-select @@ -102407,9 +103244,8 @@ static void heightOfSelect(const Select *pSelect, int *pnHeight){ ** if appropriate. */ static void exprSetHeight(Expr *p){ - int nHeight = 0; - heightOfExpr(p->pLeft, &nHeight); - heightOfExpr(p->pRight, &nHeight); + int nHeight = p->pLeft ? p->pLeft->nHeight : 0; + if( p->pRight && p->pRight->nHeight>nHeight ) nHeight = p->pRight->nHeight; if( ExprUseXSelect(p) ){ heightOfSelect(p->x.pSelect, &nHeight); }else if( p->x.pList ){ @@ -102708,6 +103544,7 @@ SQLITE_PRIVATE Expr *sqlite3ExprFunction( sqlite3ExprListDelete(db, pList); /* Avoid memory leak when malloc fails */ return 0; } + pNew->w.iOfst = (int)(pToken->z - pParse->zTail); if( pList && pList->nExpr > pParse->db->aLimit[SQLITE_LIMIT_FUNCTION_ARG] && !pParse->nested @@ -102751,7 +103588,7 @@ SQLITE_PRIVATE void sqlite3ExprFunctionUsable( ** SQLITE_DBCONFIG_TRUSTED_SCHEMA is off (meaning ** that the schema is possibly tainted). */ - sqlite3ErrorMsg(pParse, "unsafe use of %s()", pDef->zName); + sqlite3ErrorMsg(pParse, "unsafe use of %#T()", pExpr); } } } @@ -102807,6 +103644,7 @@ SQLITE_PRIVATE void sqlite3ExprAssignVarNumber(Parse *pParse, Expr *pExpr, u32 n if( bOk==0 || i<1 || i>db->aLimit[SQLITE_LIMIT_VARIABLE_NUMBER] ){ sqlite3ErrorMsg(pParse, "variable number must be between ?1 and ?%d", db->aLimit[SQLITE_LIMIT_VARIABLE_NUMBER]); + sqlite3RecordErrorOffsetOfExpr(pParse->db, pExpr); return; } x = (ynVar)i; @@ -102834,6 +103672,7 @@ SQLITE_PRIVATE void sqlite3ExprAssignVarNumber(Parse *pParse, Expr *pExpr, u32 n pExpr->iColumn = x; if( x>db->aLimit[SQLITE_LIMIT_VARIABLE_NUMBER] ){ sqlite3ErrorMsg(pParse, "too many SQL variables"); + sqlite3RecordErrorOffsetOfExpr(pParse->db, pExpr); } } @@ -104441,8 +105280,7 @@ SQLITE_PRIVATE int sqlite3FindInIndex( CollSeq *pReq = sqlite3BinaryCompareCollSeq(pParse, pLhs, pRhs); int j; - assert( pReq!=0 || pRhs->iColumn==XN_ROWID - || pParse->nErr || db->mallocFailed ); + assert( pReq!=0 || pRhs->iColumn==XN_ROWID || pParse->nErr ); for(j=0; jaiColumn[j]!=pRhs->iColumn ) continue; assert( pIdx->azColl[j] ); @@ -104918,10 +105756,8 @@ SQLITE_PRIVATE int sqlite3CodeSubselect(Parse *pParse, Expr *pExpr){ } pSel->iLimit = 0; if( sqlite3Select(pParse, pSel, &dest) ){ - if( pParse->nErr ){ - pExpr->op2 = pExpr->op; - pExpr->op = TK_ERROR; - } + pExpr->op2 = pExpr->op; + pExpr->op = TK_ERROR; return 0; } pExpr->iTable = rReg = dest.iSDParm; @@ -105138,10 +105974,9 @@ static void sqlite3ExprCodeIN( }else{ destStep2 = destStep6 = sqlite3VdbeMakeLabel(pParse); } - if( pParse->nErr ) goto sqlite3ExprCodeIN_finished; for(i=0; ipLeft, i); - if( pParse->db->mallocFailed ) goto sqlite3ExprCodeIN_oom_error; + if( pParse->nErr ) goto sqlite3ExprCodeIN_oom_error; if( sqlite3ExprCanBeNull(p) ){ sqlite3VdbeAddOp2(v, OP_IsNull, rLhs+i, destStep2); VdbeCoverage(v); @@ -105279,11 +106114,12 @@ static void codeInteger(Parse *pParse, Expr *pExpr, int negFlag, int iMem){ c = sqlite3DecOrHexToI64(z, &value); if( (c==3 && !negFlag) || (c==2) || (negFlag && value==SMALLEST_INT64)){ #ifdef SQLITE_OMIT_FLOATING_POINT - sqlite3ErrorMsg(pParse, "oversized integer: %s%s", negFlag ? "-" : "", z); + sqlite3ErrorMsg(pParse, "oversized integer: %s%#T", negFlag?"-":"",pExpr); #else #ifndef SQLITE_OMIT_HEX_INTEGER if( sqlite3_strnicmp(z,"0x",2)==0 ){ - sqlite3ErrorMsg(pParse, "hex literal too big: %s%s", negFlag?"-":"",z); + sqlite3ErrorMsg(pParse, "hex literal too big: %s%#T", + negFlag?"-":"",pExpr); }else #endif { @@ -105959,7 +106795,7 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) || NEVER(pExpr->iAgg>=pInfo->nFunc) ){ assert( !ExprHasProperty(pExpr, EP_IntValue) ); - sqlite3ErrorMsg(pParse, "misuse of aggregate: %s()", pExpr->u.zToken); + sqlite3ErrorMsg(pParse, "misuse of aggregate: %#T()", pExpr); }else{ return pInfo->aFunc[pExpr->iAgg].iMem; } @@ -106000,7 +106836,7 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) } #endif if( pDef==0 || pDef->xFinalize!=0 ){ - sqlite3ErrorMsg(pParse, "unknown function: %s()", zId); + sqlite3ErrorMsg(pParse, "unknown function: %#T()", pExpr); break; } if( pDef->funcFlags & SQLITE_FUNC_INLINE ){ @@ -108316,7 +109152,9 @@ SQLITE_PRIVATE void sqlite3AlterFinishAddColumn(Parse *pParse, Token *pColDef){ int r1; /* Temporary registers */ db = pParse->db; - if( pParse->nErr || db->mallocFailed ) return; + assert( db->pParse==pParse ); + if( pParse->nErr ) return; + assert( db->mallocFailed==0 ); pNew = pParse->pNewTable; assert( pNew ); @@ -108442,7 +109280,7 @@ SQLITE_PRIVATE void sqlite3AlterFinishAddColumn(Parse *pParse, Token *pColDef){ " THEN raise(ABORT,'CHECK constraint failed')" " ELSE raise(ABORT,'NOT NULL constraint failed')" " END" - " FROM pragma_quick_check(\"%w\",\"%w\")" + " FROM pragma_quick_check(%Q,%Q)" " WHERE quick_check GLOB 'CHECK*' OR quick_check GLOB 'NULL*'", zTab, zDb ); @@ -108621,7 +109459,7 @@ SQLITE_PRIVATE void sqlite3AlterRenameColumn( if( 0==sqlite3StrICmp(pTab->aCol[iCol].zCnName, zOld) ) break; } if( iCol==pTab->nCol ){ - sqlite3ErrorMsg(pParse, "no such column: \"%s\"", zOld); + sqlite3ErrorMsg(pParse, "no such column: \"%T\"", pOld); goto exit_rename_column; } @@ -108727,7 +109565,9 @@ struct RenameCtx { ** following a valid object, it may not be used in comparison operations. */ static void renameTokenCheckAll(Parse *pParse, const void *pPtr){ - if( pParse->nErr==0 && pParse->db->mallocFailed==0 ){ + assert( pParse==pParse->db->pParse ); + assert( pParse->db->mallocFailed==0 || pParse->nErr!=0 ); + if( pParse->nErr==0 ){ const RenameToken *p; u8 i = 0; for(p=pParse->pRename; p; p=p->pNext){ @@ -109049,12 +109889,12 @@ static void renameColumnParseError( const char *zN = (const char*)sqlite3_value_text(pObject); char *zErr; - zErr = sqlite3_mprintf("error in %s %s%s%s: %s", + zErr = sqlite3MPrintf(pParse->db, "error in %s %s%s%s: %s", zT, zN, (zWhen[0] ? " " : ""), zWhen, pParse->zErrMsg ); sqlite3_result_error(pCtx, zErr, -1); - sqlite3_free(zErr); + sqlite3DbFree(pParse->db, zErr); } /* @@ -109118,24 +109958,22 @@ static int renameParseSql( int bTemp /* True if SQL is from temp schema */ ){ int rc; - char *zErr = 0; + sqlite3ParseObjectInit(p, db); + if( zSql==0 ){ + return SQLITE_NOMEM; + } + if( sqlite3StrNICmp(zSql,"CREATE ",7)!=0 ){ + return SQLITE_CORRUPT_BKPT; + } db->init.iDb = bTemp ? 1 : sqlite3FindDbName(db, zDb); - - /* Parse the SQL statement passed as the first argument. If no error - ** occurs and the parse does not result in a new table, index or - ** trigger object, the database must be corrupt. */ - memset(p, 0, sizeof(Parse)); p->eParseMode = PARSE_MODE_RENAME; p->db = db; p->nQueryLoop = 1; - rc = zSql ? sqlite3RunParser(p, zSql, &zErr) : SQLITE_NOMEM; - assert( p->zErrMsg==0 ); - assert( rc!=SQLITE_OK || zErr==0 ); - p->zErrMsg = zErr; + rc = sqlite3RunParser(p, zSql); if( db->mallocFailed ) rc = SQLITE_NOMEM; if( rc==SQLITE_OK - && p->pNewTable==0 && p->pNewIndex==0 && p->pNewTrigger==0 + && NEVER(p->pNewTable==0 && p->pNewIndex==0 && p->pNewTrigger==0) ){ rc = SQLITE_CORRUPT_BKPT; } @@ -109413,13 +110251,13 @@ static void renameParseCleanup(Parse *pParse){ sqlite3DeleteTrigger(db, pParse->pNewTrigger); sqlite3DbFree(db, pParse->zErrMsg); renameTokenFree(db, pParse->pRename); - sqlite3ParserReset(pParse); + sqlite3ParseObjectReset(pParse); } /* ** SQL function: ** -** sqlite_rename_column(zSql, iCol, bQuote, zNew, zTable, zOld) +** sqlite_rename_column(SQL,TYPE,OBJ,DB,TABLE,COL,NEWNAME,QUOTE,TEMP) ** ** 0. zSql: SQL statement to rewrite ** 1. type: Type of object ("table", "view" etc.) @@ -109437,7 +110275,8 @@ static void renameParseCleanup(Parse *pParse){ ** ** This function is used internally by the ALTER TABLE RENAME COLUMN command. ** It is only accessible to SQL created using sqlite3NestedParse(). It is -** not reachable from ordinary SQL passed into sqlite3_prepare(). +** not reachable from ordinary SQL passed into sqlite3_prepare() unless the +** SQLITE_TESTCTRL_INTERNAL_FUNCTIONS test setting is enabled. */ static void renameColumnFunc( sqlite3_context *context, @@ -109586,7 +110425,9 @@ static void renameColumnFunc( renameColumnFunc_done: if( rc!=SQLITE_OK ){ - if( sParse.zErrMsg ){ + if( rc==SQLITE_ERROR && sqlite3WritableSchema(db) ){ + sqlite3_result_value(context, argv[0]); + }else if( sParse.zErrMsg ){ renameColumnParseError(context, "", argv[1], argv[2], &sParse); }else{ sqlite3_result_error_code(context, rc); @@ -109785,7 +110626,9 @@ static void renameTableFunc( rc = renameEditSql(context, &sCtx, zInput, zNew, bQuote); } if( rc!=SQLITE_OK ){ - if( sParse.zErrMsg ){ + if( rc==SQLITE_ERROR && sqlite3WritableSchema(db) ){ + sqlite3_result_value(context, argv[3]); + }else if( sParse.zErrMsg ){ renameColumnParseError(context, "", argv[1], argv[2], &sParse); }else{ sqlite3_result_error_code(context, rc); @@ -109810,10 +110653,10 @@ static int renameQuotefixExprCb(Walker *pWalker, Expr *pExpr){ return WRC_Continue; } -/* -** The implementation of an SQL scalar function that rewrites DDL statements -** so that any string literals that use double-quotes are modified so that -** they use single quotes. +/* SQL function: sqlite_rename_quotefix(DB,SQL) +** +** Rewrite the DDL statement "SQL" so that any string literals that use +** double-quotes use single quotes instead. ** ** Two arguments must be passed: ** @@ -109832,6 +110675,10 @@ static int renameQuotefixExprCb(Walker *pWalker, Expr *pExpr){ ** returns the string: ** ** CREATE VIEW v1 AS SELECT "a", 'string' FROM t1 +** +** If there is a error in the input SQL, then raise an error, except +** if PRAGMA writable_schema=ON, then just return the input string +** unmodified following an error. */ static void renameQuotefixFunc( sqlite3_context *context, @@ -109906,7 +110753,11 @@ static void renameQuotefixFunc( renameTokenFree(db, sCtx.pList); } if( rc!=SQLITE_OK ){ - sqlite3_result_error_code(context, rc); + if( sqlite3WritableSchema(db) && rc==SQLITE_ERROR ){ + sqlite3_result_value(context, argv[1]); + }else{ + sqlite3_result_error_code(context, rc); + } } renameParseCleanup(&sParse); } @@ -109918,7 +110769,8 @@ static void renameQuotefixFunc( sqlite3BtreeLeaveAll(db); } -/* +/* Function: sqlite_rename_test(DB,SQL,TYPE,NAME,ISTEMP,WHEN,DQS) +** ** An SQL user function that checks that there are no parse or symbol ** resolution problems in a CREATE TRIGGER|TABLE|VIEW|INDEX statement. ** After an ALTER TABLE .. RENAME operation is performed and the schema @@ -109933,11 +110785,13 @@ static void renameQuotefixFunc( ** 5: "when" part of error message. ** 6: True to disable the DQS quirk when parsing SQL. ** -** Unless it finds an error, this function normally returns NULL. However, it -** returns integer value 1 if: +** The return value is computed as follows: ** -** * the SQL argument creates a trigger, and -** * the table that the trigger is attached to is in database zDb. +** A. If an error is seen and not in PRAGMA writable_schema=ON mode, +** then raise the error. +** B. Else if a trigger is created and the the table that the trigger is +** attached to is in database zDb, then return 1. +** C. Otherwise return NULL. */ static void renameTableTest( sqlite3_context *context, @@ -109982,12 +110836,16 @@ static void renameTableTest( if( rc==SQLITE_OK ){ int i1 = sqlite3SchemaToIndex(db, sParse.pNewTrigger->pTabSchema); int i2 = sqlite3FindDbName(db, zDb); - if( i1==i2 ) sqlite3_result_int(context, 1); + if( i1==i2 ){ + /* Handle output case B */ + sqlite3_result_int(context, 1); + } } } } - if( rc!=SQLITE_OK && zWhen ){ + if( rc!=SQLITE_OK && zWhen && !sqlite3WritableSchema(db) ){ + /* Output case A */ renameColumnParseError(context, zWhen, argv[2], argv[3],&sParse); } renameParseCleanup(&sParse); @@ -110103,7 +110961,7 @@ SQLITE_PRIVATE void sqlite3AlterDropColumn(Parse *pParse, SrcList *pSrc, const T } iCol = sqlite3ColumnIndex(pTab, zCol); if( iCol<0 ){ - sqlite3ErrorMsg(pParse, "no such column: \"%s\"", zCol); + sqlite3ErrorMsg(pParse, "no such column: \"%T\"", pName); goto exit_drop_column; } @@ -110127,6 +110985,12 @@ SQLITE_PRIVATE void sqlite3AlterDropColumn(Parse *pParse, SrcList *pSrc, const T iDb = sqlite3SchemaToIndex(db, pTab->pSchema); assert( iDb>=0 ); zDb = db->aDb[iDb].zDbSName; +#ifndef SQLITE_OMIT_AUTHORIZATION + /* Invoke the authorization callback. */ + if( sqlite3AuthCheck(pParse, SQLITE_ALTER_TABLE, zDb, pTab->zName, zCol) ){ + goto exit_drop_column; + } +#endif renameTestSchema(pParse, zDb, iDb==1, "", 0); renameFixQuotes(pParse, zDb, iDb==1); sqlite3NestedParse(pParse, @@ -112514,7 +113378,7 @@ static void codeAttach( } #ifndef SQLITE_OMIT_AUTHORIZATION - if( pAuthArg ){ + if( ALWAYS(pAuthArg) ){ char *zAuthArg; if( pAuthArg->op==TK_STRING ){ assert( !ExprHasProperty(pAuthArg, EP_IntValue) ); @@ -113175,11 +114039,13 @@ SQLITE_PRIVATE void sqlite3FinishCoding(Parse *pParse){ assert( pParse->pToplevel==0 ); db = pParse->db; + assert( db->pParse==pParse ); if( pParse->nested ) return; - if( db->mallocFailed || pParse->nErr ){ - if( pParse->rc==SQLITE_OK ) pParse->rc = SQLITE_ERROR; + if( pParse->nErr ){ + if( db->mallocFailed ) pParse->rc = SQLITE_NOMEM; return; } + assert( db->mallocFailed==0 ); /* Begin by generating some termination code at the end of the ** vdbe program @@ -113202,9 +114068,10 @@ SQLITE_PRIVATE void sqlite3FinishCoding(Parse *pParse){ int i; int reg; - if( pReturning->nRetCol==0 ){ + if( NEVER(pReturning->nRetCol==0) ){ assert( CORRUPT_DB ); }else{ + sqlite3VdbeAddOp0(v, OP_FkCheck); addrRewind = sqlite3VdbeAddOp1(v, OP_Rewind, pReturning->iRetCur); VdbeCoverage(v); @@ -113297,7 +114164,7 @@ SQLITE_PRIVATE void sqlite3FinishCoding(Parse *pParse){ if( pParse->bReturning ){ Returning *pRet = pParse->u1.pReturning; - if( pRet->nRetCol==0 ){ + if( NEVER(pRet->nRetCol==0) ){ assert( CORRUPT_DB ); }else{ sqlite3VdbeAddOp2(v, OP_OpenEphemeral, pRet->iRetCur, pRet->nRetCol); @@ -113311,7 +114178,9 @@ SQLITE_PRIVATE void sqlite3FinishCoding(Parse *pParse){ /* Get the VDBE program ready for execution */ - if( v && pParse->nErr==0 && !db->mallocFailed ){ + assert( v!=0 || pParse->nErr ); + assert( db->mallocFailed==0 || pParse->nErr ); + if( pParse->nErr==0 ){ /* A minimum of one cursor is required if autoincrement is used * See ticket [a696379c1f08866] */ assert( pParse->pAinc==0 || pParse->nTab>0 ); @@ -113338,7 +114207,6 @@ SQLITE_PRIVATE void sqlite3FinishCoding(Parse *pParse){ SQLITE_PRIVATE void sqlite3NestedParse(Parse *pParse, const char *zFormat, ...){ va_list ap; char *zSql; - char *zErrMsg = 0; sqlite3 *db = pParse->db; u32 savedDbFlags = db->mDbFlags; char saveBuf[PARSE_TAIL_SZ]; @@ -113360,9 +114228,10 @@ SQLITE_PRIVATE void sqlite3NestedParse(Parse *pParse, const char *zFormat, ...){ memcpy(saveBuf, PARSE_TAIL(pParse), PARSE_TAIL_SZ); memset(PARSE_TAIL(pParse), 0, PARSE_TAIL_SZ); db->mDbFlags |= DBFLAG_PreferBuiltin; - sqlite3RunParser(pParse, zSql, &zErrMsg); + sqlite3RunParser(pParse, zSql); + sqlite3DbFree(db, pParse->zErrMsg); + pParse->zErrMsg = 0; db->mDbFlags = savedDbFlags; - sqlite3DbFree(db, zErrMsg); sqlite3DbFree(db, zSql); memcpy(PARSE_TAIL(pParse), saveBuf, PARSE_TAIL_SZ); pParse->nested--; @@ -114322,7 +115191,8 @@ SQLITE_PRIVATE void sqlite3StartTable( pTable = sqlite3FindTable(db, zName, zDb); if( pTable ){ if( !noErr ){ - sqlite3ErrorMsg(pParse, "table %T already exists", pName); + sqlite3ErrorMsg(pParse, "%s %T already exists", + (IsView(pTable)? "view" : "table"), pName); }else{ assert( !db->init.busy || CORRUPT_DB ); sqlite3CodeVerifySchema(pParse, iDb); @@ -115417,10 +116287,11 @@ static void convertToWithoutRowidTable(Parse *pParse, Table *pTab){ pTab->iPKey = -1; sqlite3CreateIndex(pParse, 0, 0, 0, pList, pTab->keyConf, 0, 0, 0, 0, SQLITE_IDXTYPE_PRIMARYKEY); - if( db->mallocFailed || pParse->nErr ){ + if( pParse->nErr ){ pTab->tabFlags &= ~TF_WithoutRowid; return; } + assert( db->mallocFailed==0 ); pPk = sqlite3PrimaryKeyIndex(pTab); assert( pPk->nKeyCol==1 ); }else{ @@ -115851,6 +116722,11 @@ SQLITE_PRIVATE void sqlite3EndTable( int addrInsLoop; /* Top of the loop for inserting rows */ Table *pSelTab; /* A table that describes the SELECT results */ + if( IN_SPECIAL_PARSE ){ + pParse->rc = SQLITE_ERROR; + pParse->nErr++; + return; + } regYield = ++pParse->nMem; regRec = ++pParse->nMem; regRowid = ++pParse->nMem; @@ -116161,10 +117037,10 @@ SQLITE_PRIVATE int sqlite3ViewGetColumnNames(Parse *pParse, Table *pTable){ */ sqlite3ColumnsFromExprList(pParse, pTable->pCheck, &pTable->nCol, &pTable->aCol); - if( db->mallocFailed==0 - && pParse->nErr==0 + if( pParse->nErr==0 && pTable->nCol==pSel->pEList->nExpr ){ + assert( db->mallocFailed==0 ); sqlite3SelectAddColumnTypeAndCollation(pParse, pTable, pSel, SQLITE_AFF_NONE); } @@ -116783,7 +117659,7 @@ static void sqlite3RefillIndex(Parse *pParse, Index *pIndex, int memRootPage){ tnum = pIndex->tnum; } pKey = sqlite3KeyInfoOfIndex(pParse, pIndex); - assert( pKey!=0 || db->mallocFailed || pParse->nErr ); + assert( pKey!=0 || pParse->nErr ); /* Open the sorter cursor if we are to use one. */ iSorter = pParse->nTab++; @@ -116947,9 +117823,11 @@ SQLITE_PRIVATE void sqlite3CreateIndex( char *zExtra = 0; /* Extra space after the Index object */ Index *pPk = 0; /* PRIMARY KEY index for WITHOUT ROWID tables */ - if( db->mallocFailed || pParse->nErr>0 ){ + assert( db->pParse==pParse ); + if( pParse->nErr ){ goto exit_create_index; } + assert( db->mallocFailed==0 ); if( IN_DECLARE_VTAB && idxType!=SQLITE_IDXTYPE_PRIMARYKEY ){ goto exit_create_index; } @@ -117013,7 +117891,6 @@ SQLITE_PRIVATE void sqlite3CreateIndex( pDb = &db->aDb[iDb]; assert( pTab!=0 ); - assert( pParse->nErr==0 ); if( sqlite3StrNICmp(pTab->zName, "sqlite_", 7)==0 && db->init.busy==0 && pTblName!=0 @@ -117437,13 +118314,13 @@ SQLITE_PRIVATE void sqlite3CreateIndex( /* Add an entry in sqlite_schema for this index */ sqlite3NestedParse(pParse, - "INSERT INTO %Q." LEGACY_SCHEMA_TABLE " VALUES('index',%Q,%Q,#%d,%Q);", - db->aDb[iDb].zDbSName, - pIndex->zName, - pTab->zName, - iMem, - zStmt - ); + "INSERT INTO %Q." LEGACY_SCHEMA_TABLE " VALUES('index',%Q,%Q,#%d,%Q);", + db->aDb[iDb].zDbSName, + pIndex->zName, + pTab->zName, + iMem, + zStmt + ); sqlite3DbFree(db, zStmt); /* Fill the index with data and reparse the schema. Code an OP_Expire @@ -117577,10 +118454,10 @@ SQLITE_PRIVATE void sqlite3DropIndex(Parse *pParse, SrcList *pName, int ifExists sqlite3 *db = pParse->db; int iDb; - assert( pParse->nErr==0 ); /* Never called with prior errors */ if( db->mallocFailed ){ goto exit_drop_index; } + assert( pParse->nErr==0 ); /* Never called with prior non-OOM errors */ assert( pName->nSrc==1 ); if( SQLITE_OK!=sqlite3ReadSchema(pParse) ){ goto exit_drop_index; @@ -117991,7 +118868,7 @@ SQLITE_PRIVATE SrcList *sqlite3SrcListAppendFromTerm( pItem->pUsing = pUsing; return p; - append_from_error: +append_from_error: assert( p==0 ); sqlite3ExprDelete(db, pOn); sqlite3IdListDelete(db, pUsing); @@ -119021,7 +119898,6 @@ SQLITE_PRIVATE void sqlite3InsertBuiltinFuncs( const char *zName = aDef[i].zName; int nName = sqlite3Strlen30(zName); int h = SQLITE_FUNC_HASH(zName[0], nName); - assert( zName[0]>='a' && zName[0]<='z' ); assert( aDef[i].funcFlags & SQLITE_FUNC_BUILTIN ); pOther = sqlite3FunctionSearch(h, zName); if( pOther ){ @@ -119248,6 +120124,16 @@ SQLITE_PRIVATE Table *sqlite3SrcListLookup(Parse *pParse, SrcList *pSrc){ return pTab; } +/* Generate byte-code that will report the number of rows modified +** by a DELETE, INSERT, or UPDATE statement. +*/ +SQLITE_PRIVATE void sqlite3CodeChangeCount(Vdbe *v, int regCounter, const char *zColName){ + sqlite3VdbeAddOp0(v, OP_FkCheck); + sqlite3VdbeAddOp2(v, OP_ResultRow, regCounter, 1); + sqlite3VdbeSetNumCols(v, 1); + sqlite3VdbeSetColName(v, 0, COLNAME_NAME, zColName, SQLITE_STATIC); +} + /* Return true if table pTab is read-only. ** ** A table is read-only if any of the following are true: @@ -119487,9 +120373,11 @@ SQLITE_PRIVATE void sqlite3DeleteFrom( memset(&sContext, 0, sizeof(sContext)); db = pParse->db; - if( pParse->nErr || db->mallocFailed ){ + assert( db->pParse==pParse ); + if( pParse->nErr ){ goto delete_from_cleanup; } + assert( db->mallocFailed==0 ); assert( pTabList->nSrc==1 ); @@ -119670,7 +120558,7 @@ SQLITE_PRIVATE void sqlite3DeleteFrom( ** ONEPASS_SINGLE: One-pass approach - at most one row deleted. ** ONEPASS_MULTI: One-pass approach - any number of rows may be deleted. */ - pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere, 0, 0, wcf, iTabCur+1); + pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere, 0, 0,0,wcf,iTabCur+1); if( pWInfo==0 ) goto delete_from_cleanup; eOnePass = sqlite3WhereOkOnePass(pWInfo, aiCurOnePass); assert( IsVirtual(pTab)==0 || eOnePass!=ONEPASS_MULTI ); @@ -119823,9 +120711,7 @@ SQLITE_PRIVATE void sqlite3DeleteFrom( ** invoke the callback function. */ if( memCnt ){ - sqlite3VdbeAddOp2(v, OP_ChngCntRow, memCnt, 1); - sqlite3VdbeSetNumCols(v, 1); - sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "rows deleted", SQLITE_STATIC); + sqlite3CodeChangeCount(v, memCnt, "rows deleted"); } delete_from_cleanup: @@ -120276,6 +121162,18 @@ static void typeofFunc( sqlite3_result_text(context, azType[i], -1, SQLITE_STATIC); } +/* subtype(X) +** +** Return the subtype of X +*/ +static void subtypeFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + UNUSED_PARAMETER(argc); + sqlite3_result_int(context, sqlite3_value_subtype(argv[0])); +} /* ** Implementation of the length() function @@ -120437,7 +121335,7 @@ static void instrFunc( } /* -** Implementation of the printf() function. +** Implementation of the printf() (a.k.a. format()) SQL function. */ static void printfFunc( sqlite3_context *context, @@ -121206,39 +122104,42 @@ static const char hexdigits[] = { }; /* -** Implementation of the QUOTE() function. This function takes a single -** argument. If the argument is numeric, the return value is the same as -** the argument. If the argument is NULL, the return value is the string -** "NULL". Otherwise, the argument is enclosed in single quotes with -** single-quote escapes. +** Append to pStr text that is the SQL literal representation of the +** value contained in pValue. */ -static void quoteFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ - assert( argc==1 ); - UNUSED_PARAMETER(argc); - switch( sqlite3_value_type(argv[0]) ){ +SQLITE_PRIVATE void sqlite3QuoteValue(StrAccum *pStr, sqlite3_value *pValue){ + /* As currently implemented, the string must be initially empty. + ** we might relax this requirement in the future, but that will + ** require enhancements to the implementation. */ + assert( pStr!=0 && pStr->nChar==0 ); + + switch( sqlite3_value_type(pValue) ){ case SQLITE_FLOAT: { double r1, r2; - char zBuf[50]; - r1 = sqlite3_value_double(argv[0]); - sqlite3_snprintf(sizeof(zBuf), zBuf, "%!.15g", r1); - sqlite3AtoF(zBuf, &r2, 20, SQLITE_UTF8); - if( r1!=r2 ){ - sqlite3_snprintf(sizeof(zBuf), zBuf, "%!.20e", r1); + const char *zVal; + r1 = sqlite3_value_double(pValue); + sqlite3_str_appendf(pStr, "%!.15g", r1); + zVal = sqlite3_str_value(pStr); + if( zVal ){ + sqlite3AtoF(zVal, &r2, pStr->nChar, SQLITE_UTF8); + if( r1!=r2 ){ + sqlite3_str_reset(pStr); + sqlite3_str_appendf(pStr, "%!.20e", r1); + } } - sqlite3_result_text(context, zBuf, -1, SQLITE_TRANSIENT); break; } case SQLITE_INTEGER: { - sqlite3_result_value(context, argv[0]); + sqlite3_str_appendf(pStr, "%lld", sqlite3_value_int64(pValue)); break; } case SQLITE_BLOB: { - char *zText = 0; - char const *zBlob = sqlite3_value_blob(argv[0]); - int nBlob = sqlite3_value_bytes(argv[0]); - assert( zBlob==sqlite3_value_blob(argv[0]) ); /* No encoding change */ - zText = (char *)contextMalloc(context, (2*(i64)nBlob)+4); - if( zText ){ + char const *zBlob = sqlite3_value_blob(pValue); + int nBlob = sqlite3_value_bytes(pValue); + assert( zBlob==sqlite3_value_blob(pValue) ); /* No encoding change */ + sqlite3StrAccumEnlarge(pStr, nBlob*2 + 4); + if( pStr->accError==0 ){ + char *zText = pStr->zText; int i; for(i=0; i>4)&0x0F]; @@ -121248,42 +122149,48 @@ static void quoteFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ zText[(nBlob*2)+3] = '\0'; zText[0] = 'X'; zText[1] = '\''; - sqlite3_result_text(context, zText, -1, SQLITE_TRANSIENT); - sqlite3_free(zText); + pStr->nChar = nBlob*2 + 3; } break; } case SQLITE_TEXT: { - int i,j; - u64 n; - const unsigned char *zArg = sqlite3_value_text(argv[0]); - char *z; - - if( zArg==0 ) return; - for(i=0, n=0; zArg[i]; i++){ if( zArg[i]=='\'' ) n++; } - z = contextMalloc(context, ((i64)i)+((i64)n)+3); - if( z ){ - z[0] = '\''; - for(i=0, j=1; zArg[i]; i++){ - z[j++] = zArg[i]; - if( zArg[i]=='\'' ){ - z[j++] = '\''; - } - } - z[j++] = '\''; - z[j] = 0; - sqlite3_result_text(context, z, j, sqlite3_free); - } + const unsigned char *zArg = sqlite3_value_text(pValue); + sqlite3_str_appendf(pStr, "%Q", zArg); break; } default: { - assert( sqlite3_value_type(argv[0])==SQLITE_NULL ); - sqlite3_result_text(context, "NULL", 4, SQLITE_STATIC); + assert( sqlite3_value_type(pValue)==SQLITE_NULL ); + sqlite3_str_append(pStr, "NULL", 4); break; } } } +/* +** Implementation of the QUOTE() function. +** +** The quote(X) function returns the text of an SQL literal which is the +** value of its argument suitable for inclusion into an SQL statement. +** Strings are surrounded by single-quotes with escapes on interior quotes +** as needed. BLOBs are encoded as hexadecimal literals. Strings with +** embedded NUL characters cannot be represented as string literals in SQL +** and hence the returned string literal is truncated prior to the first NUL. +*/ +static void quoteFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ + sqlite3_str str; + sqlite3 *db = sqlite3_context_db_handle(context); + assert( argc==1 ); + UNUSED_PARAMETER(argc); + sqlite3StrAccumInit(&str, db, 0, 0, db->aLimit[SQLITE_LIMIT_LENGTH]); + sqlite3QuoteValue(&str,argv[0]); + sqlite3_result_text(context, sqlite3StrAccumFinish(&str), str.nChar, + SQLITE_DYNAMIC); + if( str.accError!=SQLITE_OK ){ + sqlite3_result_null(context); + sqlite3_result_error_code(context, str.accError); + } +} + /* ** The unicode() function. Return the integer unicode code-point value ** for the first character of the input string. @@ -122399,8 +123306,8 @@ SQLITE_PRIVATE void sqlite3RegisterBuiltinFunctions(void){ INLINE_FUNC(likelihood, 2, INLINEFUNC_unlikely, SQLITE_FUNC_UNLIKELY), INLINE_FUNC(likely, 1, INLINEFUNC_unlikely, SQLITE_FUNC_UNLIKELY), #ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC - FUNCTION2(sqlite_offset, 1, 0, 0, noopFunc, SQLITE_FUNC_OFFSET| - SQLITE_FUNC_TYPEOF), + {1, SQLITE_FUNC_BUILTIN|SQLITE_UTF8|SQLITE_FUNC_OFFSET|SQLITE_FUNC_TYPEOF, + 0, 0, noopFunc, 0, 0, 0, "sqlite_offset", {0} }, #endif FUNCTION(ltrim, 1, 1, 0, trimFunc ), FUNCTION(ltrim, 2, 1, 0, trimFunc ), @@ -122417,9 +123324,11 @@ SQLITE_PRIVATE void sqlite3RegisterBuiltinFunctions(void){ WAGGREGATE(max, 1, 1, 1, minmaxStep, minMaxFinalize, minMaxValue, 0, SQLITE_FUNC_MINMAX|SQLITE_FUNC_ANYORDER ), FUNCTION2(typeof, 1, 0, 0, typeofFunc, SQLITE_FUNC_TYPEOF), + FUNCTION2(subtype, 1, 0, 0, subtypeFunc, SQLITE_FUNC_TYPEOF), FUNCTION2(length, 1, 0, 0, lengthFunc, SQLITE_FUNC_LENGTH), FUNCTION(instr, 2, 0, 0, instrFunc ), FUNCTION(printf, -1, 0, 0, printfFunc ), + FUNCTION(format, -1, 0, 0, printfFunc ), FUNCTION(unicode, 1, 0, 0, unicodeFunc ), FUNCTION(char, -1, 0, 0, charFunc ), FUNCTION(abs, 1, 0, 0, absFunc ), @@ -122518,6 +123427,7 @@ SQLITE_PRIVATE void sqlite3RegisterBuiltinFunctions(void){ #endif sqlite3WindowFunctions(); sqlite3RegisterDateTimeFunctions(); + sqlite3RegisterJsonFunctions(); sqlite3InsertBuiltinFuncs(aBuiltinFunc, ArraySize(aBuiltinFunc)); #if 0 /* Enable to print out how the built-in functions are hashed */ @@ -123193,7 +124103,7 @@ static void fkScanChildren( ** clause. For each row found, increment either the deferred or immediate ** foreign key constraint counter. */ if( pParse->nErr==0 ){ - pWInfo = sqlite3WhereBegin(pParse, pSrc, pWhere, 0, 0, 0, 0); + pWInfo = sqlite3WhereBegin(pParse, pSrc, pWhere, 0, 0, 0, 0, 0); sqlite3VdbeAddOp2(v, OP_FkCounter, pFKey->isDeferred, nIncr); if( pWInfo ){ sqlite3WhereEnd(pWInfo); @@ -124201,7 +125111,7 @@ SQLITE_PRIVATE void sqlite3TableAffinity(Vdbe *v, Table *pTab, int iReg){ } for(i=j=0; inCol; i++){ - assert( pTab->aCol[i].affinity!=0 ); + assert( pTab->aCol[i].affinity!=0 || sqlite3VdbeParser(v)->nErr>0 ); if( (pTab->aCol[i].colFlags & COLFLAG_VIRTUAL)==0 ){ zColAff[j++] = pTab->aCol[i].affinity; } @@ -124735,9 +125645,11 @@ SQLITE_PRIVATE void sqlite3Insert( #endif db = pParse->db; - if( pParse->nErr || db->mallocFailed ){ + assert( db->pParse==pParse ); + if( pParse->nErr ){ goto insert_cleanup; } + assert( db->mallocFailed==0 ); dest.iSDParm = 0; /* Suppress a harmless compiler warning */ /* If the Select object is really just a simple VALUES() list with a @@ -124813,7 +125725,11 @@ SQLITE_PRIVATE void sqlite3Insert( ** ** This is the 2nd template. */ - if( pColumn==0 && xferOptimization(pParse, pTab, pSelect, onError, iDb) ){ + if( pColumn==0 + && pSelect!=0 + && pTrigger==0 + && xferOptimization(pParse, pTab, pSelect, onError, iDb) + ){ assert( !pTrigger ); assert( pList==0 ); goto insert_end; @@ -124913,7 +125829,9 @@ SQLITE_PRIVATE void sqlite3Insert( dest.nSdst = pTab->nCol; rc = sqlite3Select(pParse, pSelect, &dest); regFromSelect = dest.iSdst; - if( rc || db->mallocFailed || pParse->nErr ) goto insert_cleanup; + assert( db->pParse==pParse ); + if( rc || pParse->nErr ) goto insert_cleanup; + assert( db->mallocFailed==0 ); sqlite3VdbeEndCoroutine(v, regYield); sqlite3VdbeJumpHere(v, addrTop - 1); /* label B: */ assert( pSelect->pEList ); @@ -125402,9 +126320,7 @@ SQLITE_PRIVATE void sqlite3Insert( ** invoke the callback function. */ if( regRowCount ){ - sqlite3VdbeAddOp2(v, OP_ChngCntRow, regRowCount, 1); - sqlite3VdbeSetNumCols(v, 1); - sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "rows inserted", SQLITE_STATIC); + sqlite3CodeChangeCount(v, regRowCount, "rows inserted"); } insert_cleanup: @@ -126784,18 +127700,13 @@ static int xferOptimization( int destHasUniqueIdx = 0; /* True if pDest has a UNIQUE index */ int regData, regRowid; /* Registers holding data and rowid */ - if( pSelect==0 ){ - return 0; /* Must be of the form INSERT INTO ... SELECT ... */ - } + assert( pSelect!=0 ); if( pParse->pWith || pSelect->pWith ){ /* Do not attempt to process this query if there are an WITH clauses ** attached to it. Proceeding may generate a false "no such table: xxx" ** error if pSelect reads from a CTE named "xxx". */ return 0; } - if( sqlite3TriggerList(pParse, pDest) ){ - return 0; /* tab1 must not have triggers */ - } #ifndef SQLITE_OMIT_VIRTUALTABLE if( IsVirtual(pDest) ){ return 0; /* tab1 must not be a virtual table */ @@ -127658,6 +128569,13 @@ struct sqlite3_api_routines { int (*autovacuum_pages)(sqlite3*, unsigned int(*)(void*,const char*,unsigned int,unsigned int,unsigned int), void*, void(*)(void*)); + /* Version 3.38.0 and later */ + int (*error_offset)(sqlite3*); + int (*vtab_rhs_value)(sqlite3_index_info*,int,sqlite3_value**); + int (*vtab_distinct)(sqlite3_index_info*); + int (*vtab_in)(sqlite3_index_info*,int,int); + int (*vtab_in_first)(sqlite3_value*,sqlite3_value**); + int (*vtab_in_next)(sqlite3_value*,sqlite3_value**); }; /* @@ -127969,6 +128887,13 @@ typedef int (*sqlite3_loadext_entry)( #define sqlite3_total_changes64 sqlite3_api->total_changes64 /* Version 3.37.0 and later */ #define sqlite3_autovacuum_pages sqlite3_api->autovacuum_pages +/* Version 3.38.0 and later */ +#define sqlite3_error_offset sqlite3_api->error_offset +#define sqlite3_vtab_rhs_value sqlite3_api->vtab_rhs_value +#define sqlite3_vtab_distinct sqlite3_api->vtab_distinct +#define sqlite3_vtab_in sqlite3_api->vtab_in +#define sqlite3_vtab_in_first sqlite3_api->vtab_in_first +#define sqlite3_vtab_in_next sqlite3_api->vtab_in_next #endif /* !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) */ #if !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) @@ -128458,6 +129383,13 @@ static const sqlite3_api_routines sqlite3Apis = { sqlite3_total_changes64, /* Version 3.37.0 and later */ sqlite3_autovacuum_pages, + /* Version 3.38.0 and later */ + sqlite3_error_offset, + sqlite3_vtab_rhs_value, + sqlite3_vtab_distinct, + sqlite3_vtab_in, + sqlite3_vtab_in_first, + sqlite3_vtab_in_next }; /* True if x is the directory separator character @@ -130759,6 +131691,10 @@ SQLITE_PRIVATE void sqlite3Pragma( (void)sqlite3_finalize(pDummy); sqlite3DbFree(db, zSql); } + if( db->mallocFailed ){ + sqlite3ErrorMsg(db->pParse, "out of memory"); + db->pParse->rc = SQLITE_NOMEM_BKPT; + } pHash = &db->aDb[ii].pSchema->tblHash; break; } @@ -132616,7 +133552,7 @@ SQLITE_PRIVATE int sqlite3InitOne(sqlite3 *db, int iDb, char **pzErrMsg, u32 mFl sqlite3ResetAllSchemasOfConnection(db); pDb = &db->aDb[iDb]; }else - if( rc==SQLITE_OK || (db->flags&SQLITE_NoSchemaError)){ + if( rc==SQLITE_OK || ((db->flags&SQLITE_NoSchemaError) && rc!=SQLITE_NOMEM)){ /* Hack: If the SQLITE_NoSchemaError flag is set, then consider ** the schema loaded, even if errors (other than OOM) occurred. In ** this situation the current sqlite3_prepare() operation will fail, @@ -132795,8 +133731,14 @@ SQLITE_PRIVATE int sqlite3SchemaToIndex(sqlite3 *db, Schema *pSchema){ /* ** Free all memory allocations in the pParse object */ -SQLITE_PRIVATE void sqlite3ParserReset(Parse *pParse){ +SQLITE_PRIVATE void sqlite3ParseObjectReset(Parse *pParse){ sqlite3 *db = pParse->db; + assert( db!=0 ); + assert( db->pParse==pParse ); + assert( pParse->nested==0 ); +#ifndef SQLITE_OMIT_SHARED_CACHE + sqlite3DbFree(db, pParse->aTableLock); +#endif while( pParse->pCleanup ){ ParseCleanup *pCleanup = pParse->pCleanup; pParse->pCleanup = pCleanup->pNext; @@ -132807,11 +133749,12 @@ SQLITE_PRIVATE void sqlite3ParserReset(Parse *pParse){ if( pParse->pConstExpr ){ sqlite3ExprListDelete(db, pParse->pConstExpr); } - if( db ){ - assert( db->lookaside.bDisable >= pParse->disableLookaside ); - db->lookaside.bDisable -= pParse->disableLookaside; - db->lookaside.sz = db->lookaside.bDisable ? 0 : db->lookaside.szTrue; - } + assert( db->lookaside.bDisable >= pParse->disableLookaside ); + db->lookaside.bDisable -= pParse->disableLookaside; + db->lookaside.sz = db->lookaside.bDisable ? 0 : db->lookaside.szTrue; + assert( pParse->db->pParse==pParse ); + db->pParse = pParse->pOuterParse; + pParse->db = 0; pParse->disableLookaside = 0; } @@ -132824,7 +133767,7 @@ SQLITE_PRIVATE void sqlite3ParserReset(Parse *pParse){ ** cost for this mechansim (an extra malloc), so it should not be used ** for common cleanups that happen on most calls. But for less ** common cleanups, we save a single NULL-pointer comparison in -** sqlite3ParserReset(), which reduces the total CPU cycle count. +** sqlite3ParseObjectReset(), which reduces the total CPU cycle count. ** ** If a memory allocation error occurs, then the cleanup happens immediately. ** When either SQLITE_DEBUG or SQLITE_COVERAGE_TEST are defined, the @@ -132864,6 +133807,25 @@ SQLITE_PRIVATE void *sqlite3ParserAddCleanup( return pPtr; } +/* +** Turn bulk memory into a valid Parse object and link that Parse object +** into database connection db. +** +** Call sqlite3ParseObjectReset() to undo this operation. +** +** Caution: Do not confuse this routine with sqlite3ParseObjectInit() which +** is generated by Lemon. +*/ +SQLITE_PRIVATE void sqlite3ParseObjectInit(Parse *pParse, sqlite3 *db){ + memset(PARSE_HDR(pParse), 0, PARSE_HDR_SZ); + memset(PARSE_TAIL(pParse), 0, PARSE_TAIL_SZ); + assert( db->pParse!=pParse ); + pParse->pOuterParse = db->pParse; + db->pParse = pParse; + pParse->db = db; + if( db->mallocFailed ) sqlite3ErrorMsg(pParse, "out of memory"); +} + /* ** Compile the UTF-8 encoded SQL statement zSql into a statement handle. */ @@ -132876,16 +133838,19 @@ static int sqlite3Prepare( sqlite3_stmt **ppStmt, /* OUT: A pointer to the prepared statement */ const char **pzTail /* OUT: End of parsed string */ ){ - char *zErrMsg = 0; /* Error message */ int rc = SQLITE_OK; /* Result code */ int i; /* Loop counter */ Parse sParse; /* Parsing context */ - memset(&sParse, 0, PARSE_HDR_SZ); + /* sqlite3ParseObjectInit(&sParse, db); // inlined for performance */ + memset(PARSE_HDR(&sParse), 0, PARSE_HDR_SZ); memset(PARSE_TAIL(&sParse), 0, PARSE_TAIL_SZ); + sParse.pOuterParse = db->pParse; + db->pParse = &sParse; + sParse.db = db; sParse.pReprepare = pReprepare; assert( ppStmt && *ppStmt==0 ); - /* assert( !db->mallocFailed ); // not true with SQLITE_USE_ALLOCA */ + if( db->mallocFailed ) sqlite3ErrorMsg(&sParse, "out of memory"); assert( sqlite3_mutex_held(db->mutex) ); /* For a long-term use prepared statement avoid the use of @@ -132938,7 +133903,6 @@ static int sqlite3Prepare( sqlite3VtabUnlockList(db); - sParse.db = db; if( nBytes>=0 && (nBytes==0 || zSql[nBytes-1]!=0) ){ char *zSqlCopy; int mxLen = db->aLimit[SQLITE_LIMIT_SQL_LENGTH]; @@ -132951,14 +133915,14 @@ static int sqlite3Prepare( } zSqlCopy = sqlite3DbStrNDup(db, zSql, nBytes); if( zSqlCopy ){ - sqlite3RunParser(&sParse, zSqlCopy, &zErrMsg); + sqlite3RunParser(&sParse, zSqlCopy); sParse.zTail = &zSql[sParse.zTail-zSqlCopy]; sqlite3DbFree(db, zSqlCopy); }else{ sParse.zTail = &zSql[nBytes]; } }else{ - sqlite3RunParser(&sParse, zSql, &zErrMsg); + sqlite3RunParser(&sParse, zSql); } assert( 0==sParse.nQueryLoop ); @@ -132982,14 +133946,14 @@ static int sqlite3Prepare( } assert( 0==(*ppStmt) ); rc = sParse.rc; - if( zErrMsg ){ - sqlite3ErrorWithMsg(db, rc, "%s", zErrMsg); - sqlite3DbFree(db, zErrMsg); + if( sParse.zErrMsg ){ + sqlite3ErrorWithMsg(db, rc, "%s", sParse.zErrMsg); + sqlite3DbFree(db, sParse.zErrMsg); }else{ sqlite3Error(db, rc); } }else{ - assert( zErrMsg==0 ); + assert( sParse.zErrMsg==0 ); *ppStmt = (sqlite3_stmt*)sParse.pVdbe; rc = SQLITE_OK; sqlite3ErrorClear(db); @@ -133005,7 +133969,7 @@ static int sqlite3Prepare( end_prepare: - sqlite3ParserReset(&sParse); + sqlite3ParseObjectReset(&sParse); return rc; } static int sqlite3LockAndPrepare( @@ -133610,14 +134574,14 @@ static void addWhereTerm( ExprSetProperty(pEq, EP_FromJoin); assert( !ExprHasProperty(pEq, EP_TokenOnly|EP_Reduced) ); ExprSetVVAProperty(pEq, EP_NoReduce); - pEq->iRightJoinTable = pE2->iTable; + pEq->w.iRightJoinTable = pE2->iTable; } *ppWhere = sqlite3ExprAnd(pParse, *ppWhere, pEq); } /* ** Set the EP_FromJoin property on all terms of the given expression. -** And set the Expr.iRightJoinTable to iTable for every term in the +** And set the Expr.w.iRightJoinTable to iTable for every term in the ** expression. ** ** The EP_FromJoin property is used on terms of an expression to tell @@ -133627,8 +134591,8 @@ static void addWhereTerm( ** WHERE clause during join processing but we need to remember that they ** originated in the ON or USING clause. ** -** The Expr.iRightJoinTable tells the WHERE clause processing that the -** expression depends on table iRightJoinTable even if that table is not +** The Expr.w.iRightJoinTable tells the WHERE clause processing that the +** expression depends on table w.iRightJoinTable even if that table is not ** explicitly mentioned in the expression. That information is needed ** for cases like this: ** @@ -133646,7 +134610,7 @@ SQLITE_PRIVATE void sqlite3SetJoinExpr(Expr *p, int iTable){ ExprSetProperty(p, EP_FromJoin); assert( !ExprHasProperty(p, EP_TokenOnly|EP_Reduced) ); ExprSetVVAProperty(p, EP_NoReduce); - p->iRightJoinTable = iTable; + p->w.iRightJoinTable = iTable; if( p->op==TK_FUNCTION ){ assert( ExprUseXList(p) ); if( p->x.pList ){ @@ -133662,7 +134626,7 @@ SQLITE_PRIVATE void sqlite3SetJoinExpr(Expr *p, int iTable){ } /* Undo the work of sqlite3SetJoinExpr(). In the expression p, convert every -** term that is marked with EP_FromJoin and iRightJoinTable==iTable into +** term that is marked with EP_FromJoin and w.iRightJoinTable==iTable into ** an ordinary term that omits the EP_FromJoin mark. ** ** This happens when a LEFT JOIN is simplified into an ordinary JOIN. @@ -133670,7 +134634,7 @@ SQLITE_PRIVATE void sqlite3SetJoinExpr(Expr *p, int iTable){ static void unsetJoinExpr(Expr *p, int iTable){ while( p ){ if( ExprHasProperty(p, EP_FromJoin) - && (iTable<0 || p->iRightJoinTable==iTable) ){ + && (iTable<0 || p->w.iRightJoinTable==iTable) ){ ExprClearProperty(p, EP_FromJoin); } if( p->op==TK_COLUMN && p->iTable==iTable ){ @@ -134660,7 +135624,7 @@ SQLITE_PRIVATE KeyInfo *sqlite3KeyInfoAlloc(sqlite3 *db, int N, int X){ p->nRef = 1; memset(&p[1], 0, nExtra); }else{ - sqlite3OomFault(db); + return (KeyInfo*)sqlite3OomFault(db); } return p; } @@ -134831,6 +135795,9 @@ static void generateSortTail( iTab = pSort->iECursor; if( eDest==SRT_Output || eDest==SRT_Coroutine || eDest==SRT_Mem ){ + if( eDest==SRT_Mem && p->iOffset ){ + sqlite3VdbeAddOp2(v, OP_Null, 0, pDest->iSdst); + } regRowid = 0; regRow = pDest->iSdst; }else{ @@ -136552,6 +137519,8 @@ static int multiSelectOrderBy( ){ int i, j; /* Loop counters */ Select *pPrior; /* Another SELECT immediately to our left */ + Select *pSplit; /* Left-most SELECT in the right-hand group */ + int nSelect; /* Number of SELECT statements in the compound */ Vdbe *v; /* Generate code to this VDBE */ SelectDest destA; /* Destination for coroutine A */ SelectDest destB; /* Destination for coroutine B */ @@ -136597,8 +137566,7 @@ static int multiSelectOrderBy( /* Patch up the ORDER BY clause */ op = p->op; - pPrior = p->pPrior; - assert( pPrior->pOrderBy==0 ); + assert( p->pPrior->pOrderBy==0 ); pOrderBy = p->pOrderBy; assert( pOrderBy ); nOrderBy = pOrderBy->nExpr; @@ -136648,11 +137616,6 @@ static int multiSelectOrderBy( pKeyMerge = 0; } - /* Reattach the ORDER BY clause to the query. - */ - p->pOrderBy = pOrderBy; - pPrior->pOrderBy = sqlite3ExprListDup(pParse->db, pOrderBy, 0); - /* Allocate a range of temporary registers and the KeyInfo needed ** for the logic that removes duplicate result rows when the ** operator is UNION, EXCEPT, or INTERSECT (but not UNION ALL). @@ -136677,12 +137640,30 @@ static int multiSelectOrderBy( /* Separate the left and the right query from one another */ - p->pPrior = 0; + nSelect = 1; + if( (op==TK_ALL || op==TK_UNION) + && OptimizationEnabled(db, SQLITE_BalancedMerge) + ){ + for(pSplit=p; pSplit->pPrior!=0 && pSplit->op==op; pSplit=pSplit->pPrior){ + nSelect++; + assert( pSplit->pPrior->pNext==pSplit ); + } + } + if( nSelect<=3 ){ + pSplit = p; + }else{ + pSplit = p; + for(i=2; ipPrior; } + } + pPrior = pSplit->pPrior; + assert( pPrior!=0 ); + pSplit->pPrior = 0; pPrior->pNext = 0; + assert( p->pOrderBy == pOrderBy ); + assert( pOrderBy!=0 || db->mallocFailed ); + pPrior->pOrderBy = sqlite3ExprListDup(pParse->db, pOrderBy, 0); sqlite3ResolveOrderGroupBy(pParse, p, p->pOrderBy, "ORDER"); - if( pPrior->pPrior==0 ){ - sqlite3ResolveOrderGroupBy(pParse, pPrior, pPrior->pOrderBy, "ORDER"); - } + sqlite3ResolveOrderGroupBy(pParse, pPrior, pPrior->pOrderBy, "ORDER"); /* Compute the limit registers */ computeLimitRegisters(pParse, p, labelEnd); @@ -136833,12 +137814,11 @@ static int multiSelectOrderBy( /* Reassembly the compound query so that it will be freed correctly ** by the calling function */ - if( p->pPrior ){ - sqlite3SelectDelete(db, p->pPrior); + if( pSplit->pPrior ){ + sqlite3SelectDelete(db, pSplit->pPrior); } - p->pPrior = pPrior; - pPrior->pNext = p; - + pSplit->pPrior = pPrior; + pPrior->pNext = pSplit; sqlite3ExprListDelete(db, pPrior->pOrderBy); pPrior->pOrderBy = 0; @@ -136888,9 +137868,9 @@ static Expr *substExpr( ){ if( pExpr==0 ) return 0; if( ExprHasProperty(pExpr, EP_FromJoin) - && pExpr->iRightJoinTable==pSubst->iTable + && pExpr->w.iRightJoinTable==pSubst->iTable ){ - pExpr->iRightJoinTable = pSubst->iNewTable; + pExpr->w.iRightJoinTable = pSubst->iNewTable; } if( pExpr->op==TK_COLUMN && pExpr->iTable==pSubst->iTable @@ -136929,7 +137909,7 @@ static Expr *substExpr( ExprSetProperty(pNew, EP_CanBeNull); } if( ExprHasProperty(pExpr,EP_FromJoin) ){ - sqlite3SetJoinExpr(pNew, pExpr->iRightJoinTable); + sqlite3SetJoinExpr(pNew, pExpr->w.iRightJoinTable); } sqlite3ExprDelete(db, pExpr); pExpr = pNew; @@ -137094,7 +138074,7 @@ static int renumberCursorsCb(Walker *pWalker, Expr *pExpr){ renumberCursorDoMapping(pWalker, &pExpr->iTable); } if( ExprHasProperty(pExpr, EP_FromJoin) ){ - renumberCursorDoMapping(pWalker, &pExpr->iRightJoinTable); + renumberCursorDoMapping(pWalker, &pExpr->w.iRightJoinTable); } return WRC_Continue; } @@ -138104,11 +139084,13 @@ static int pushDownWhereTerms( } if( isLeftJoin && (ExprHasProperty(pWhere,EP_FromJoin)==0 - || pWhere->iRightJoinTable!=iCursor) + || pWhere->w.iRightJoinTable!=iCursor) ){ return 0; /* restriction (4) */ } - if( ExprHasProperty(pWhere,EP_FromJoin) && pWhere->iRightJoinTable!=iCursor ){ + if( ExprHasProperty(pWhere,EP_FromJoin) + && pWhere->w.iRightJoinTable!=iCursor + ){ return 0; /* restriction (5) */ } if( sqlite3ExprIsTableConstant(pWhere, iCursor) ){ @@ -138828,7 +139810,8 @@ static int selectExpander(Walker *pWalker, Select *p){ /* Process NATURAL keywords, and ON and USING clauses of joins. */ - if( pParse->nErr || db->mallocFailed || sqliteProcessJoin(pParse, p) ){ + assert( db->mallocFailed==0 || pParse->nErr!=0 ); + if( pParse->nErr || sqliteProcessJoin(pParse, p) ){ return WRC_Abort; } @@ -139125,12 +140108,13 @@ SQLITE_PRIVATE void sqlite3SelectPrep( NameContext *pOuterNC /* Name context for container */ ){ assert( p!=0 || pParse->db->mallocFailed ); + assert( pParse->db->pParse==pParse ); if( pParse->db->mallocFailed ) return; if( p->selFlags & SF_HasTypeInfo ) return; sqlite3SelectExpand(pParse, p); - if( pParse->nErr || pParse->db->mallocFailed ) return; + if( pParse->nErr ) return; sqlite3ResolveSelectNames(pParse, p, pOuterNC); - if( pParse->nErr || pParse->db->mallocFailed ) return; + if( pParse->nErr ) return; sqlite3SelectAddTypeInfo(pParse, p); } @@ -139147,8 +140131,10 @@ static void resetAccumulator(Parse *pParse, AggInfo *pAggInfo){ int i; struct AggInfo_func *pFunc; int nReg = pAggInfo->nFunc + pAggInfo->nColumn; + assert( pParse->db->pParse==pParse ); + assert( pParse->db->mallocFailed==0 || pParse->nErr!=0 ); if( nReg==0 ) return; - if( pParse->nErr || pParse->db->mallocFailed ) return; + if( pParse->nErr ) return; #ifdef SQLITE_DEBUG /* Verify that all AggInfo registers are within the range specified by ** AggInfo.mnReg..AggInfo.mxReg */ @@ -139571,10 +140557,12 @@ SQLITE_PRIVATE int sqlite3Select( u8 minMaxFlag; /* Flag for min/max queries */ db = pParse->db; + assert( pParse==db->pParse ); v = sqlite3GetVdbe(pParse); - if( p==0 || db->mallocFailed || pParse->nErr ){ + if( p==0 || pParse->nErr ){ return 1; } + assert( db->mallocFailed==0 ); if( sqlite3AuthCheck(pParse, SQLITE_SELECT, 0, 0, 0) ) return 1; #if SELECTTRACE_ENABLED SELECTTRACE(1,pParse,p, ("begin processing:\n", pParse->addrExplain)); @@ -139609,9 +140597,10 @@ SQLITE_PRIVATE int sqlite3Select( p->selFlags |= SF_NoopOrderBy; } sqlite3SelectPrep(pParse, p, 0); - if( pParse->nErr || db->mallocFailed ){ + if( pParse->nErr ){ goto select_end; } + assert( db->mallocFailed==0 ); assert( p->pEList!=0 ); #if SELECTTRACE_ENABLED if( sqlite3SelectTrace & 0x104 ){ @@ -139655,7 +140644,7 @@ SQLITE_PRIVATE int sqlite3Select( #ifndef SQLITE_OMIT_WINDOWFUNC if( sqlite3WindowRewrite(pParse, p) ){ - assert( db->mallocFailed || pParse->nErr>0 ); + assert( pParse->nErr ); goto select_end; } #if SELECTTRACE_ENABLED @@ -140131,7 +141120,7 @@ SQLITE_PRIVATE int sqlite3Select( /* Begin the database scan. */ SELECTTRACE(1,pParse,p,("WhereBegin\n")); pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere, sSort.pOrderBy, - p->pEList, wctrlFlags, p->nSelectRow); + p->pEList, p, wctrlFlags, p->nSelectRow); if( pWInfo==0 ) goto select_end; if( sqlite3WhereOutputRowCount(pWInfo) < p->nSelectRow ){ p->nSelectRow = sqlite3WhereOutputRowCount(pWInfo); @@ -140395,7 +141384,7 @@ SQLITE_PRIVATE int sqlite3Select( sqlite3VdbeAddOp2(v, OP_Gosub, regReset, addrReset); SELECTTRACE(1,pParse,p,("WhereBegin\n")); pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere, pGroupBy, pDistinct, - WHERE_GROUPBY | (orderByGrp ? WHERE_SORTBYGROUP : 0) | distFlag, 0 + 0, (WHERE_GROUPBY|(orderByGrp ? WHERE_SORTBYGROUP : 0)|distFlag), 0 ); if( pWInfo==0 ){ sqlite3ExprListDelete(db, pDistinct); @@ -140693,7 +141682,7 @@ SQLITE_PRIVATE int sqlite3Select( SELECTTRACE(1,pParse,p,("WhereBegin\n")); pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere, pMinMaxOrderBy, - pDistinct, minMaxFlag|distFlag, 0); + pDistinct, 0, minMaxFlag|distFlag, 0); if( pWInfo==0 ){ goto select_end; } @@ -140750,7 +141739,7 @@ SQLITE_PRIVATE int sqlite3Select( */ select_end: assert( db->mallocFailed==0 || db->mallocFailed==1 ); - pParse->nErr += db->mallocFailed; + assert( db->mallocFailed==0 || pParse->nErr!=0 ); sqlite3ExprListDelete(db, pMinMaxOrderBy); #ifdef SQLITE_DEBUG if( pAggInfo && !db->mallocFailed ){ @@ -141430,6 +142419,7 @@ static TriggerStep *triggerStepAllocate( sqlite3 *db = pParse->db; TriggerStep *pTriggerStep; + if( pParse->nErr ) return 0; pTriggerStep = sqlite3DbMallocZero(db, sizeof(TriggerStep) + pName->n + 1); if( pTriggerStep ){ char *z = (char*)&pTriggerStep[1]; @@ -141902,6 +142892,7 @@ static void codeReturningTrigger( assert( v!=0 ); assert( pParse->bReturning ); + assert( db->pParse==pParse ); pReturning = pParse->u1.pReturning; assert( pTrigger == &(pReturning->retTrig) ); memset(&sSelect, 0, sizeof(sSelect)); @@ -141912,7 +142903,8 @@ static void codeReturningTrigger( sFrom.a[0].pTab = pTab; sFrom.a[0].iCursor = -1; sqlite3SelectPrep(pParse, &sSelect, 0); - if( db->mallocFailed==0 && pParse->nErr==0 ){ + if( pParse->nErr==0 ){ + assert( db->mallocFailed==0 ); sqlite3GenerateColumnNames(pParse, &sSelect); } sqlite3ExprListDelete(db, sSelect.pEList); @@ -141930,7 +142922,7 @@ static void codeReturningTrigger( pParse->eTriggerOp = pTrigger->op; pParse->pTriggerTab = pTab; if( sqlite3ResolveExprListNames(&sNC, pNew)==SQLITE_OK - && !db->mallocFailed + && ALWAYS(!db->mallocFailed) ){ int i; int nCol = pNew->nExpr; @@ -141941,6 +142933,9 @@ static void codeReturningTrigger( Expr *pCol = pNew->a[i].pExpr; assert( pCol!=0 ); /* Due to !db->mallocFailed ~9 lines above */ sqlite3ExprCodeFactorable(pParse, pCol, reg+i); + if( sqlite3ExprAffinity(pCol)==SQLITE_AFF_REAL ){ + sqlite3VdbeAddOp1(v, OP_RealAffinity, reg+i); + } } sqlite3VdbeAddOp3(v, OP_MakeRecord, reg, i, reg+i); sqlite3VdbeAddOp2(v, OP_NewRowid, pReturning->iRetCur, reg+i+1); @@ -142091,8 +143086,8 @@ static TriggerPrg *codeRowTrigger( Vdbe *v; /* Temporary VM */ NameContext sNC; /* Name context for sub-vdbe */ SubProgram *pProgram = 0; /* Sub-vdbe for trigger program */ - Parse *pSubParse; /* Parse context for sub-vdbe */ int iEndTrigger = 0; /* Label to jump to if WHEN is false */ + Parse sSubParse; /* Parse context for sub-vdbe */ assert( pTrigger->zName==0 || pTab==tableOfTrigger(pTrigger) ); assert( pTop->pVdbe ); @@ -142114,19 +143109,17 @@ static TriggerPrg *codeRowTrigger( /* Allocate and populate a new Parse context to use for coding the ** trigger sub-program. */ - pSubParse = sqlite3StackAllocZero(db, sizeof(Parse)); - if( !pSubParse ) return 0; + sqlite3ParseObjectInit(&sSubParse, db); memset(&sNC, 0, sizeof(sNC)); - sNC.pParse = pSubParse; - pSubParse->db = db; - pSubParse->pTriggerTab = pTab; - pSubParse->pToplevel = pTop; - pSubParse->zAuthContext = pTrigger->zName; - pSubParse->eTriggerOp = pTrigger->op; - pSubParse->nQueryLoop = pParse->nQueryLoop; - pSubParse->disableVtab = pParse->disableVtab; - - v = sqlite3GetVdbe(pSubParse); + sNC.pParse = &sSubParse; + sSubParse.pTriggerTab = pTab; + sSubParse.pToplevel = pTop; + sSubParse.zAuthContext = pTrigger->zName; + sSubParse.eTriggerOp = pTrigger->op; + sSubParse.nQueryLoop = pParse->nQueryLoop; + sSubParse.disableVtab = pParse->disableVtab; + + v = sqlite3GetVdbe(&sSubParse); if( v ){ VdbeComment((v, "Start: %s.%s (%s %s%s%s ON %s)", pTrigger->zName, onErrorText(orconf), @@ -142152,14 +143145,14 @@ static TriggerPrg *codeRowTrigger( if( db->mallocFailed==0 && SQLITE_OK==sqlite3ResolveExprNames(&sNC, pWhen) ){ - iEndTrigger = sqlite3VdbeMakeLabel(pSubParse); - sqlite3ExprIfFalse(pSubParse, pWhen, iEndTrigger, SQLITE_JUMPIFNULL); + iEndTrigger = sqlite3VdbeMakeLabel(&sSubParse); + sqlite3ExprIfFalse(&sSubParse, pWhen, iEndTrigger, SQLITE_JUMPIFNULL); } sqlite3ExprDelete(db, pWhen); } /* Code the trigger program into the sub-vdbe. */ - codeTriggerProgram(pSubParse, pTrigger->step_list, orconf); + codeTriggerProgram(&sSubParse, pTrigger->step_list, orconf); /* Insert an OP_Halt at the end of the sub-program. */ if( iEndTrigger ){ @@ -142167,23 +143160,24 @@ static TriggerPrg *codeRowTrigger( } sqlite3VdbeAddOp0(v, OP_Halt); VdbeComment((v, "End: %s.%s", pTrigger->zName, onErrorText(orconf))); + transferParseError(pParse, &sSubParse); - transferParseError(pParse, pSubParse); - if( db->mallocFailed==0 && pParse->nErr==0 ){ + if( pParse->nErr==0 ){ + assert( db->mallocFailed==0 ); pProgram->aOp = sqlite3VdbeTakeOpArray(v, &pProgram->nOp, &pTop->nMaxArg); } - pProgram->nMem = pSubParse->nMem; - pProgram->nCsr = pSubParse->nTab; + pProgram->nMem = sSubParse.nMem; + pProgram->nCsr = sSubParse.nTab; pProgram->token = (void *)pTrigger; - pPrg->aColmask[0] = pSubParse->oldmask; - pPrg->aColmask[1] = pSubParse->newmask; + pPrg->aColmask[0] = sSubParse.oldmask; + pPrg->aColmask[1] = sSubParse.newmask; sqlite3VdbeDelete(v); + }else{ + transferParseError(pParse, &sSubParse); } - assert( !pSubParse->pTriggerPrg && !pSubParse->nMaxArg ); - sqlite3ParserReset(pSubParse); - sqlite3StackFree(db, pSubParse); - + assert( !sSubParse.pTriggerPrg && !sSubParse.nMaxArg ); + sqlite3ParseObjectReset(&sSubParse); return pPrg; } @@ -142216,6 +143210,7 @@ static TriggerPrg *getRowTrigger( /* If an existing TriggerPrg could not be located, create a new one. */ if( !pPrg ){ pPrg = codeRowTrigger(pParse, pTrigger, pTab, orconf); + pParse->db->errByteOffset = -1; } return pPrg; @@ -142238,7 +143233,7 @@ SQLITE_PRIVATE void sqlite3CodeRowTriggerDirect( Vdbe *v = sqlite3GetVdbe(pParse); /* Main VM */ TriggerPrg *pPrg; pPrg = getRowTrigger(pParse, p, pTab, orconf); - assert( pPrg || pParse->nErr || pParse->db->mallocFailed ); + assert( pPrg || pParse->nErr ); /* Code the OP_Program opcode in the parent VDBE. P4 of the OP_Program ** is a pointer to the sub-vdbe containing the trigger program. */ @@ -142756,9 +143751,11 @@ SQLITE_PRIVATE void sqlite3Update( memset(&sContext, 0, sizeof(sContext)); db = pParse->db; - if( pParse->nErr || db->mallocFailed ){ + assert( db->pParse==pParse ); + if( pParse->nErr ){ goto update_cleanup; } + assert( db->mallocFailed==0 ); /* Locate the table which we want to update. */ @@ -143130,7 +144127,7 @@ SQLITE_PRIVATE void sqlite3Update( if( !pParse->nested && !pTrigger && !hasFK && !chngKey && !bReplace ){ flags |= WHERE_ONEPASS_MULTIROW; } - pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere, 0, 0, flags,iIdxCur); + pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere,0,0,0,flags,iIdxCur); if( pWInfo==0 ) goto update_cleanup; /* A one-pass strategy that might update more than one row may not @@ -143530,9 +144527,7 @@ SQLITE_PRIVATE void sqlite3Update( ** that information. */ if( regRowCount ){ - sqlite3VdbeAddOp2(v, OP_ChngCntRow, regRowCount, 1); - sqlite3VdbeSetNumCols(v, 1); - sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "rows updated", SQLITE_STATIC); + sqlite3CodeChangeCount(v, regRowCount, "rows updated"); } update_cleanup: @@ -143654,7 +144649,9 @@ static void updateVirtualTable( regRowid = ++pParse->nMem; /* Start scanning the virtual table */ - pWInfo = sqlite3WhereBegin(pParse, pSrc,pWhere,0,0,WHERE_ONEPASS_DESIRED,0); + pWInfo = sqlite3WhereBegin( + pParse, pSrc, pWhere, 0, 0, 0, WHERE_ONEPASS_DESIRED, 0 + ); if( pWInfo==0 ) return; /* Populate the argument registers. */ @@ -145281,7 +146278,6 @@ SQLITE_API int sqlite3_declare_vtab(sqlite3 *db, const char *zCreateTable){ VtabCtx *pCtx; int rc = SQLITE_OK; Table *pTab; - char *zErr = 0; Parse sParse; int initBusy; @@ -145300,9 +146296,9 @@ SQLITE_API int sqlite3_declare_vtab(sqlite3 *db, const char *zCreateTable){ pTab = pCtx->pTab; assert( IsVirtual(pTab) ); - memset(&sParse, 0, sizeof(sParse)); + sqlite3ParseObjectInit(&sParse, db); sParse.eParseMode = PARSE_MODE_DECLARE_VTAB; - sParse.db = db; + sParse.disableTriggers = 1; /* We should never be able to reach this point while loading the ** schema. Nevertheless, defend against that (turn off db->init.busy) ** in case a bug arises. */ @@ -145310,11 +146306,12 @@ SQLITE_API int sqlite3_declare_vtab(sqlite3 *db, const char *zCreateTable){ initBusy = db->init.busy; db->init.busy = 0; sParse.nQueryLoop = 1; - if( SQLITE_OK==sqlite3RunParser(&sParse, zCreateTable, &zErr) - && sParse.pNewTable - && !db->mallocFailed + if( SQLITE_OK==sqlite3RunParser(&sParse, zCreateTable) + && ALWAYS(sParse.pNewTable!=0) + && ALWAYS(!db->mallocFailed) && IsOrdinaryTable(sParse.pNewTable) ){ + assert( sParse.zErrMsg==0 ); if( !pTab->aCol ){ Table *pNew = sParse.pNewTable; Index *pIdx; @@ -145344,8 +146341,9 @@ SQLITE_API int sqlite3_declare_vtab(sqlite3 *db, const char *zCreateTable){ } pCtx->bDeclared = 1; }else{ - sqlite3ErrorWithMsg(db, SQLITE_ERROR, (zErr ? "%s" : 0), zErr); - sqlite3DbFree(db, zErr); + sqlite3ErrorWithMsg(db, SQLITE_ERROR, + (sParse.zErrMsg ? "%s" : 0), sParse.zErrMsg); + sqlite3DbFree(db, sParse.zErrMsg); rc = SQLITE_ERROR; } sParse.eParseMode = PARSE_MODE_NORMAL; @@ -145354,7 +146352,7 @@ SQLITE_API int sqlite3_declare_vtab(sqlite3 *db, const char *zCreateTable){ sqlite3VdbeFinalize(sParse.pVdbe); } sqlite3DeleteTable(db, sParse.pNewTable); - sqlite3ParserReset(&sParse); + sqlite3ParseObjectReset(&sParse); db->init.busy = initBusy; assert( (rc&0xff)==rc ); @@ -145906,6 +146904,7 @@ struct WhereLevel { u32 iLikeRepCntr; /* LIKE range processing counter register (times 2) */ int addrLikeRep; /* LIKE range processing address */ #endif + int regFilter; /* Bloom filter */ u8 iFrom; /* Which entry in the FROM clause */ u8 op, p3, p5; /* Opcode, P3 & P5 of the opcode that ends the loop */ int p1, p2; /* Operands of the opcode used to end the loop */ @@ -145964,10 +146963,12 @@ struct WhereLoop { } btree; struct { /* Information for virtual tables */ int idxNum; /* Index number */ - u8 needFree; /* True if sqlite3_free(idxStr) is needed */ + u32 needFree : 1; /* True if sqlite3_free(idxStr) is needed */ + u32 bOmitOffset : 1; /* True to let virtual table handle offset */ i8 isOrdered; /* True if satisfies ORDER BY */ u16 omitMask; /* Terms that may be omitted */ char *idxStr; /* Index identifier string */ + u32 mHandleIn; /* Terms to handle as IN(...) instead of == */ } vtab; } u; u32 wsFlags; /* WHERE_* flags describing the plan */ @@ -146111,7 +147112,7 @@ struct WhereTerm { #define TERM_COPIED 0x0008 /* Has a child */ #define TERM_ORINFO 0x0010 /* Need to free the WhereTerm.u.pOrInfo object */ #define TERM_ANDINFO 0x0020 /* Need to free the WhereTerm.u.pAndInfo obj */ -#define TERM_OR_OK 0x0040 /* Used during OR-clause processing */ +#define TERM_OK 0x0040 /* Used during OR-clause processing */ #define TERM_VNULL 0x0080 /* Manufactured x>NULL or x<=NULL term */ #define TERM_LIKEOPT 0x0100 /* Virtual terms from the LIKE optimization */ #define TERM_LIKECOND 0x0200 /* Conditionally this LIKE operator term */ @@ -146124,6 +147125,7 @@ struct WhereTerm { #else # define TERM_HIGHTRUTH 0 /* Only used with STAT4 */ #endif +#define TERM_SLICE 0x8000 /* One slice of a row-value/vector comparison */ /* ** An instance of the WhereScan object is used as an iterator for locating @@ -146134,11 +147136,11 @@ struct WhereScan { WhereClause *pWC; /* WhereClause currently being scanned */ const char *zCollName; /* Required collating sequence, if not NULL */ Expr *pIdxExpr; /* Search for this index expression */ + int k; /* Resume scanning at this->pWC->a[this->k] */ + u32 opMask; /* Acceptable operators */ char idxaff; /* Must match this affinity, if zCollName!=NULL */ + unsigned char iEquiv; /* Current slot in aiCur[] and aiColumn[] */ unsigned char nEquiv; /* Number of entries in aiCur[] and aiColumn[] */ - unsigned char iEquiv; /* Next unused slot in aiCur[] and aiColumn[] */ - u32 opMask; /* Acceptable operators */ - int k; /* Resume scanning at this->pWC->a[this->k] */ int aiCur[11]; /* Cursors in the equivalence class */ i16 aiColumn[11]; /* Corresponding column number in the eq-class */ }; @@ -146162,6 +147164,7 @@ struct WhereClause { u8 hasOr; /* True if any a[].eOperator is WO_OR */ int nTerm; /* Number of terms */ int nSlot; /* Number of entries in a[] */ + int nBase; /* Number of terms through the last non-Virtual */ WhereTerm *a; /* Each a[] describes a term of the WHERE cluase */ #if defined(SQLITE_SMALL_STACK) WhereTerm aStatic[1]; /* Initial static space for a[] */ @@ -146219,11 +147222,6 @@ struct WhereMaskSet { int ix[BMS]; /* Cursor assigned to each bit */ }; -/* -** Initialize a WhereMaskSet object -*/ -#define initMaskSet(P) (P)->n=0 - /* ** This object is a convenience wrapper holding all information needed ** to construct WhereLoop objects for a particular query. @@ -146231,7 +147229,6 @@ struct WhereMaskSet { struct WhereLoopBuilder { WhereInfo *pWInfo; /* Information about this WHERE */ WhereClause *pWC; /* WHERE clause terms */ - ExprList *pOrderBy; /* ORDER BY clause */ WhereLoop *pNew; /* Template WhereLoop */ WhereOrSet *pOrSet; /* Record best loops here, if not NULL */ #ifdef SQLITE_ENABLE_STAT4 @@ -146299,6 +147296,9 @@ struct WhereInfo { ExprList *pOrderBy; /* The ORDER BY clause or NULL */ ExprList *pResultSet; /* Result set of the query */ Expr *pWhere; /* The complete WHERE clause */ +#ifndef SQLITE_OMIT_VIRTUALTABLE + Select *pLimit; /* Used to access LIMIT expr/registers for vtabs */ +#endif int aiCurOnePass[2]; /* OP_OpenWrite cursors for the ONEPASS opt */ int iContinue; /* Jump here to continue with next record */ int iBreak; /* Jump here to break out of the loop */ @@ -146352,8 +147352,14 @@ SQLITE_PRIVATE int sqlite3WhereExplainOneScan( WhereLevel *pLevel, /* Scan to write OP_Explain opcode for */ u16 wctrlFlags /* Flags passed to sqlite3WhereBegin() */ ); +SQLITE_PRIVATE int sqlite3WhereExplainBloomFilter( + const Parse *pParse, /* Parse context */ + const WhereInfo *pWInfo, /* WHERE clause */ + const WhereLevel *pLevel /* Bloom filter on this level */ +); #else # define sqlite3WhereExplainOneScan(u,v,w,x) 0 +# define sqlite3WhereExplainBloomFilter(u,v,w) 0 #endif /* SQLITE_OMIT_EXPLAIN */ #ifdef SQLITE_ENABLE_STMT_SCANSTATUS SQLITE_PRIVATE void sqlite3WhereAddScanStatus( @@ -146378,6 +147384,7 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( SQLITE_PRIVATE void sqlite3WhereClauseInit(WhereClause*,WhereInfo*); SQLITE_PRIVATE void sqlite3WhereClauseClear(WhereClause*); SQLITE_PRIVATE void sqlite3WhereSplit(WhereClause*,Expr*,u8); +SQLITE_PRIVATE void sqlite3WhereAddLimit(WhereClause*, Select*); SQLITE_PRIVATE Bitmask sqlite3WhereExprUsage(WhereMaskSet*, Expr*); SQLITE_PRIVATE Bitmask sqlite3WhereExprUsageNN(WhereMaskSet*, Expr*); SQLITE_PRIVATE Bitmask sqlite3WhereExprListUsage(WhereMaskSet*, ExprList*); @@ -146446,6 +147453,9 @@ SQLITE_PRIVATE void sqlite3WhereTabFuncArgs(Parse*, SrcItem*, WhereClause*); #define WHERE_BIGNULL_SORT 0x00080000 /* Column nEq of index is BIGNULL */ #define WHERE_IN_SEEKSCAN 0x00100000 /* Seek-scan optimization for IN */ #define WHERE_TRANSCONS 0x00200000 /* Uses a transitive constraint */ +#define WHERE_BLOOMFILTER 0x00400000 /* Consider using a Bloom-filter */ +#define WHERE_SELFCULL 0x00800000 /* nOut reduced by extra WHERE terms */ +#define WHERE_OMIT_OFFSET 0x01000000 /* Set offset counter to zero */ #endif /* !defined(SQLITE_WHEREINT_H) */ @@ -146608,19 +147618,27 @@ SQLITE_PRIVATE int sqlite3WhereExplainOneScan( explainIndexRange(&str, pLoop); } }else if( (flags & WHERE_IPK)!=0 && (flags & WHERE_CONSTRAINT)!=0 ){ - const char *zRangeOp; + char cRangeOp; +#if 0 /* Better output, but breaks many tests */ + const Table *pTab = pItem->pTab; + const char *zRowid = pTab->iPKey>=0 ? pTab->aCol[pTab->iPKey].zCnName: + "rowid"; +#else + const char *zRowid = "rowid"; +#endif + sqlite3_str_appendf(&str, " USING INTEGER PRIMARY KEY (%s", zRowid); if( flags&(WHERE_COLUMN_EQ|WHERE_COLUMN_IN) ){ - zRangeOp = "="; + cRangeOp = '='; }else if( (flags&WHERE_BOTH_LIMIT)==WHERE_BOTH_LIMIT ){ - zRangeOp = ">? AND rowid<"; + sqlite3_str_appendf(&str, ">? AND %s", zRowid); + cRangeOp = '<'; }else if( flags&WHERE_BTM_LIMIT ){ - zRangeOp = ">"; + cRangeOp = '>'; }else{ assert( flags&WHERE_TOP_LIMIT); - zRangeOp = "<"; + cRangeOp = '<'; } - sqlite3_str_appendf(&str, - " USING INTEGER PRIMARY KEY (rowid%s?)",zRangeOp); + sqlite3_str_appendf(&str, "%c?)", cRangeOp); } #ifndef SQLITE_OMIT_VIRTUALTABLE else if( (flags & WHERE_VIRTUALTABLE)!=0 ){ @@ -146643,6 +147661,56 @@ SQLITE_PRIVATE int sqlite3WhereExplainOneScan( } return ret; } + +/* +** Add a single OP_Explain opcode that describes a Bloom filter. +** +** Or if not processing EXPLAIN QUERY PLAN and not in a SQLITE_DEBUG and/or +** SQLITE_ENABLE_STMT_SCANSTATUS build, then OP_Explain opcodes are not +** required and this routine is a no-op. +** +** If an OP_Explain opcode is added to the VM, its address is returned. +** Otherwise, if no OP_Explain is coded, zero is returned. +*/ +SQLITE_PRIVATE int sqlite3WhereExplainBloomFilter( + const Parse *pParse, /* Parse context */ + const WhereInfo *pWInfo, /* WHERE clause */ + const WhereLevel *pLevel /* Bloom filter on this level */ +){ + int ret = 0; + SrcItem *pItem = &pWInfo->pTabList->a[pLevel->iFrom]; + Vdbe *v = pParse->pVdbe; /* VM being constructed */ + sqlite3 *db = pParse->db; /* Database handle */ + char *zMsg; /* Text to add to EQP output */ + int i; /* Loop counter */ + WhereLoop *pLoop; /* The where loop */ + StrAccum str; /* EQP output string */ + char zBuf[100]; /* Initial space for EQP output string */ + + sqlite3StrAccumInit(&str, db, zBuf, sizeof(zBuf), SQLITE_MAX_LENGTH); + str.printfFlags = SQLITE_PRINTF_INTERNAL; + sqlite3_str_appendf(&str, "BLOOM FILTER ON %S (", pItem); + pLoop = pLevel->pWLoop; + if( pLoop->wsFlags & WHERE_IPK ){ + const Table *pTab = pItem->pTab; + if( pTab->iPKey>=0 ){ + sqlite3_str_appendf(&str, "%s=?", pTab->aCol[pTab->iPKey].zCnName); + }else{ + sqlite3_str_appendf(&str, "rowid=?"); + } + }else{ + for(i=pLoop->nSkip; iu.btree.nEq; i++){ + const char *z = explainIndexColumnName(pLoop->u.btree.pIndex, i); + if( i>pLoop->nSkip ) sqlite3_str_append(&str, " AND ", 5); + sqlite3_str_appendf(&str, "%s=?", z); + } + } + sqlite3_str_append(&str, ")", 1); + zMsg = sqlite3StrAccumFinish(&str); + ret = sqlite3VdbeAddOp4(v, OP_Explain, sqlite3VdbeCurrentAddr(v), + pParse->addrExplain, 0, zMsg,P4_DYNAMIC); + return ret; +} #endif /* SQLITE_OMIT_EXPLAIN */ #ifdef SQLITE_ENABLE_STMT_SCANSTATUS @@ -147166,6 +148234,7 @@ static int codeAllEqualityTerms( VdbeCoverageIf(v, bRev!=0); VdbeComment((v, "begin skip-scan on %s", pIdx->zName)); j = sqlite3VdbeAddOp0(v, OP_Goto); + assert( pLevel->addrSkip==0 ); pLevel->addrSkip = sqlite3VdbeAddOp4Int(v, (bRev?OP_SeekLT:OP_SeekGT), iIdxCur, 0, regBase, nSkip); VdbeCoverageIf(v, bRev==0); @@ -147198,6 +148267,9 @@ static int codeAllEqualityTerms( sqlite3VdbeAddOp2(v, OP_Copy, r1, regBase+j); } } + } + for(j=nSkip; jaLTerm[j]; if( pTerm->eOperator & WO_IN ){ if( pTerm->pExpr->flags & EP_xIsSelect ){ /* No affinity ever needs to be (or should be) applied to a value @@ -147212,7 +148284,8 @@ static int codeAllEqualityTerms( sqlite3VdbeAddOp2(v, OP_IsNull, regBase+j, pLevel->addrBrk); VdbeCoverage(v); } - if( pParse->db->mallocFailed==0 && pParse->nErr==0 ){ + if( pParse->nErr==0 ){ + assert( pParse->db->mallocFailed==0 ); if( sqlite3CompareAffinity(pRight, zAff[j])==SQLITE_AFF_BLOB ){ zAff[j] = SQLITE_AFF_BLOB; } @@ -147402,7 +148475,7 @@ static void codeCursorHint( sWalker.pParse = pParse; sWalker.u.pCCurHint = &sHint; pWC = &pWInfo->sWC; - for(i=0; inTerm; i++){ + for(i=0; inBase; i++){ pTerm = &pWC->a[i]; if( pTerm->wtFlags & (TERM_VIRTUAL|TERM_CODED) ) continue; if( pTerm->prereqAll & pLevel->notReady ) continue; @@ -147432,7 +148505,7 @@ static void codeCursorHint( if( pTabItem->fg.jointype & JT_LEFT ){ Expr *pExpr = pTerm->pExpr; if( !ExprHasProperty(pExpr, EP_FromJoin) - || pExpr->iRightJoinTable!=pTabItem->iCursor + || pExpr->w.iRightJoinTable!=pTabItem->iCursor ){ sWalker.eCode = 0; sWalker.xExprCallback = codeCursorHintIsOrFunction; @@ -147733,6 +148806,65 @@ static void whereApplyPartialIndexConstraints( } } +/* +** This routine is called right after An OP_Filter has been generated and +** before the corresponding index search has been performed. This routine +** checks to see if there are additional Bloom filters in inner loops that +** can be checked prior to doing the index lookup. If there are available +** inner-loop Bloom filters, then evaluate those filters now, before the +** index lookup. The idea is that a Bloom filter check is way faster than +** an index lookup, and the Bloom filter might return false, meaning that +** the index lookup can be skipped. +** +** We know that an inner loop uses a Bloom filter because it has the +** WhereLevel.regFilter set. If an inner-loop Bloom filter is checked, +** then clear the WhereLevel.regFilter value to prevent the Bloom filter +** from being checked a second time when the inner loop is evaluated. +*/ +static SQLITE_NOINLINE void filterPullDown( + Parse *pParse, /* Parsing context */ + WhereInfo *pWInfo, /* Complete information about the WHERE clause */ + int iLevel, /* Which level of pWInfo->a[] should be coded */ + int addrNxt, /* Jump here to bypass inner loops */ + Bitmask notReady /* Loops that are not ready */ +){ + while( ++iLevel < pWInfo->nLevel ){ + WhereLevel *pLevel = &pWInfo->a[iLevel]; + WhereLoop *pLoop = pLevel->pWLoop; + if( pLevel->regFilter==0 ) continue; + if( pLevel->pWLoop->nSkip ) continue; + /* ,--- Because sqlite3ConstructBloomFilter() has will not have set + ** vvvvv--' pLevel->regFilter if this were true. */ + if( NEVER(pLoop->prereq & notReady) ) continue; + if( pLoop->wsFlags & WHERE_IPK ){ + WhereTerm *pTerm = pLoop->aLTerm[0]; + int regRowid; + assert( pTerm!=0 ); + assert( pTerm->pExpr!=0 ); + testcase( pTerm->wtFlags & TERM_VIRTUAL ); + regRowid = sqlite3GetTempReg(pParse); + regRowid = codeEqualityTerm(pParse, pTerm, pLevel, 0, 0, regRowid); + sqlite3VdbeAddOp4Int(pParse->pVdbe, OP_Filter, pLevel->regFilter, + addrNxt, regRowid, 1); + VdbeCoverage(pParse->pVdbe); + }else{ + u16 nEq = pLoop->u.btree.nEq; + int r1; + char *zStartAff; + + assert( pLoop->wsFlags & WHERE_INDEXED ); + assert( (pLoop->wsFlags & WHERE_COLUMN_IN)==0 ); + r1 = codeAllEqualityTerms(pParse,pLevel,0,0,&zStartAff); + codeApplyAffinity(pParse, r1, nEq, zStartAff); + sqlite3DbFree(pParse->db, zStartAff); + sqlite3VdbeAddOp4Int(pParse->pVdbe, OP_Filter, pLevel->regFilter, + addrNxt, r1, nEq); + VdbeCoverage(pParse->pVdbe); + } + pLevel->regFilter = 0; + } +} + /* ** Generate code for the start of the iLevel-th loop in the WHERE clause ** implementation described by pWInfo. @@ -147835,7 +148967,6 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( int iReg; /* P3 Value for OP_VFilter */ int addrNotFound; int nConstraint = pLoop->nLTerm; - int iIn; /* Counter for IN constraints */ iReg = sqlite3GetTempRange(pParse, nConstraint+2); addrNotFound = pLevel->addrBrk; @@ -147844,11 +148975,27 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( pTerm = pLoop->aLTerm[j]; if( NEVER(pTerm==0) ) continue; if( pTerm->eOperator & WO_IN ){ - codeEqualityTerm(pParse, pTerm, pLevel, j, bRev, iTarget); - addrNotFound = pLevel->addrNxt; + if( SMASKBIT32(j) & pLoop->u.vtab.mHandleIn ){ + int iTab = pParse->nTab++; + int iCache = ++pParse->nMem; + sqlite3CodeRhsOfIN(pParse, pTerm->pExpr, iTab); + sqlite3VdbeAddOp3(v, OP_VInitIn, iTab, iTarget, iCache); + }else{ + codeEqualityTerm(pParse, pTerm, pLevel, j, bRev, iTarget); + addrNotFound = pLevel->addrNxt; + } }else{ Expr *pRight = pTerm->pExpr->pRight; codeExprOrVector(pParse, pRight, iTarget, 1); + if( pTerm->eMatchOp==SQLITE_INDEX_CONSTRAINT_OFFSET + && pLoop->u.vtab.bOmitOffset + ){ + assert( pTerm->eOperator==WO_AUX ); + assert( pWInfo->pLimit!=0 ); + assert( pWInfo->pLimit->iOffset>0 ); + sqlite3VdbeAddOp2(v, OP_Integer, 0, pWInfo->pLimit->iOffset); + VdbeComment((v,"Zero OFFSET counter")); + } } } sqlite3VdbeAddOp2(v, OP_Integer, pLoop->u.vtab.idxNum, iReg); @@ -147865,44 +149012,54 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( pLevel->op = pWInfo->eOnePass ? OP_Noop : OP_VNext; pLevel->p2 = sqlite3VdbeCurrentAddr(v); assert( (pLoop->wsFlags & WHERE_MULTI_OR)==0 ); - if( pLoop->wsFlags & WHERE_IN_ABLE ){ - iIn = pLevel->u.in.nIn; - }else{ - iIn = 0; - } - for(j=nConstraint-1; j>=0; j--){ + + for(j=0; jaLTerm[j]; - if( (pTerm->eOperator & WO_IN)!=0 ) iIn--; if( j<16 && (pLoop->u.vtab.omitMask>>j)&1 ){ disableTerm(pLevel, pTerm); - }else if( (pTerm->eOperator & WO_IN)!=0 - && sqlite3ExprVectorSize(pTerm->pExpr->pLeft)==1 + continue; + } + if( (pTerm->eOperator & WO_IN)!=0 + && (SMASKBIT32(j) & pLoop->u.vtab.mHandleIn)==0 + && !db->mallocFailed ){ Expr *pCompare; /* The comparison operator */ Expr *pRight; /* RHS of the comparison */ VdbeOp *pOp; /* Opcode to access the value of the IN constraint */ + int iIn; /* IN loop corresponding to the j-th constraint */ /* Reload the constraint value into reg[iReg+j+2]. The same value ** was loaded into the same register prior to the OP_VFilter, but ** the xFilter implementation might have changed the datatype or - ** encoding of the value in the register, so it *must* be reloaded. */ - assert( pLevel->u.in.aInLoop!=0 || db->mallocFailed ); - if( !db->mallocFailed ){ - assert( iIn>=0 && iInu.in.nIn ); + ** encoding of the value in the register, so it *must* be reloaded. + */ + for(iIn=0; ALWAYS(iInu.in.nIn); iIn++){ pOp = sqlite3VdbeGetOp(v, pLevel->u.in.aInLoop[iIn].addrInTop); - assert( pOp->opcode==OP_Column || pOp->opcode==OP_Rowid ); - assert( pOp->opcode!=OP_Column || pOp->p3==iReg+j+2 ); - assert( pOp->opcode!=OP_Rowid || pOp->p2==iReg+j+2 ); - testcase( pOp->opcode==OP_Rowid ); - sqlite3VdbeAddOp3(v, pOp->opcode, pOp->p1, pOp->p2, pOp->p3); + if( (pOp->opcode==OP_Column && pOp->p3==iReg+j+2) + || (pOp->opcode==OP_Rowid && pOp->p2==iReg+j+2) + ){ + testcase( pOp->opcode==OP_Rowid ); + sqlite3VdbeAddOp3(v, pOp->opcode, pOp->p1, pOp->p2, pOp->p3); + break; + } } /* Generate code that will continue to the next row if - ** the IN constraint is not satisfied */ + ** the IN constraint is not satisfied + */ pCompare = sqlite3PExpr(pParse, TK_EQ, 0, 0); - assert( pCompare!=0 || db->mallocFailed ); - if( pCompare ){ - pCompare->pLeft = pTerm->pExpr->pLeft; + if( !db->mallocFailed ){ + int iFld = pTerm->u.x.iField; + Expr *pLeft = pTerm->pExpr->pLeft; + assert( pLeft!=0 ); + if( iFld>0 ){ + assert( pLeft->op==TK_VECTOR ); + assert( ExprUseXList(pLeft) ); + assert( iFld<=pLeft->x.pList->nExpr ); + pCompare->pLeft = pLeft->x.pList->a[iFld-1].pExpr; + }else{ + pCompare->pLeft = pLeft; + } pCompare->pRight = pRight = sqlite3Expr(db, TK_REGISTER, 0); if( pRight ){ pRight->iTable = iReg+j+2; @@ -147911,11 +149068,11 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( ); } pCompare->pLeft = 0; - sqlite3ExprDelete(db, pCompare); } + sqlite3ExprDelete(db, pCompare); } } - assert( iIn==0 || db->mallocFailed ); + /* These registers need to be preserved in case there is an IN operator ** loop. So we could deallocate the registers here (and potentially ** reuse them later) if (pLoop->wsFlags & WHERE_IN_ABLE)==0. But it seems @@ -147943,6 +149100,12 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( iRowidReg = codeEqualityTerm(pParse, pTerm, pLevel, 0, bRev, iReleaseReg); if( iRowidReg!=iReleaseReg ) sqlite3ReleaseTempReg(pParse, iReleaseReg); addrNxt = pLevel->addrNxt; + if( pLevel->regFilter ){ + sqlite3VdbeAddOp4Int(v, OP_Filter, pLevel->regFilter, addrNxt, + iRowidReg, 1); + VdbeCoverage(v); + filterPullDown(pParse, pWInfo, iLevel, addrNxt, notReady); + } sqlite3VdbeAddOp3(v, OP_SeekRowid, iCur, addrNxt, iRowidReg); VdbeCoverage(v); pLevel->op = OP_Noop; @@ -148268,6 +149431,12 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( sqlite3VdbeAddOp2(v, OP_Integer, 1, regBignull); VdbeComment((v, "NULL-scan pass ctr")); } + if( pLevel->regFilter ){ + sqlite3VdbeAddOp4Int(v, OP_Filter, pLevel->regFilter, addrNxt, + regBase, nEq); + VdbeCoverage(v); + filterPullDown(pParse, pWInfo, iLevel, addrNxt, notReady); + } op = aStartOp[(start_constraints<<2) + (startEq<<1) + bRev]; assert( op!=0 ); @@ -148595,7 +149764,7 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( iRetInit = sqlite3VdbeAddOp2(v, OP_Integer, 0, regReturn); /* If the original WHERE clause is z of the form: (x1 OR x2 OR ...) AND y - ** Then for every term xN, evaluate as the subexpression: xN AND z + ** Then for every term xN, evaluate as the subexpression: xN AND y ** That way, terms in y that are factored into the disjunction will ** be picked up by the recursive calls to sqlite3WhereBegin() below. ** @@ -148607,6 +149776,20 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( ** This optimization also only applies if the (x1 OR x2 OR ...) term ** is not contained in the ON clause of a LEFT JOIN. ** See ticket http://www.sqlite.org/src/info/f2369304e4 + ** + ** 2022-02-04: Do not push down slices of a row-value comparison. + ** In other words, "w" or "y" may not be a slice of a vector. Otherwise, + ** the initialization of the right-hand operand of the vector comparison + ** might not occur, or might occur only in an OR branch that is not + ** taken. dbsqlfuzz 80a9fade844b4fb43564efc972bcb2c68270f5d1. + ** + ** 2022-03-03: Do not push down expressions that involve subqueries. + ** The subquery might get coded as a subroutine. Any table-references + ** in the subquery might be resolved to index-references for the index on + ** the OR branch in which the subroutine is coded. But if the subroutine + ** is invoked from a different OR branch that uses a different index, such + ** index-references will not work. tag-20220303a + ** https://sqlite.org/forum/forumpost/36937b197273d403 */ if( pWC->nTerm>1 ){ int iTerm; @@ -148615,9 +149798,12 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( if( &pWC->a[iTerm] == pTerm ) continue; testcase( pWC->a[iTerm].wtFlags & TERM_VIRTUAL ); testcase( pWC->a[iTerm].wtFlags & TERM_CODED ); - if( (pWC->a[iTerm].wtFlags & (TERM_VIRTUAL|TERM_CODED))!=0 ) continue; + testcase( pWC->a[iTerm].wtFlags & TERM_SLICE ); + if( (pWC->a[iTerm].wtFlags & (TERM_VIRTUAL|TERM_CODED|TERM_SLICE))!=0 ){ + continue; + } if( (pWC->a[iTerm].eOperator & WO_ALL)==0 ) continue; - testcase( pWC->a[iTerm].wtFlags & TERM_ORINFO ); + if( ExprHasProperty(pExpr, EP_Subquery) ) continue; /* tag-20220303a */ pExpr = sqlite3ExprDup(db, pExpr, 0); pAndExpr = sqlite3ExprAnd(pParse, pAndExpr, pExpr); } @@ -148658,9 +149844,9 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( /* Loop through table entries that match term pOrTerm. */ ExplainQueryPlan((pParse, 1, "INDEX %d", ii+1)); WHERETRACE(0xffff, ("Subplan for OR-clause:\n")); - pSubWInfo = sqlite3WhereBegin(pParse, pOrTab, pOrExpr, 0, 0, + pSubWInfo = sqlite3WhereBegin(pParse, pOrTab, pOrExpr, 0, 0, 0, WHERE_OR_SUBCLAUSE, iCovCur); - assert( pSubWInfo || pParse->nErr || db->mallocFailed ); + assert( pSubWInfo || pParse->nErr ); if( pSubWInfo ){ WhereLoop *pSubLoop; int addrExplain = sqlite3WhereExplainOneScan( @@ -148899,7 +150085,7 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( ** then we cannot use the "t1.a=t2.b" constraint, but we can code ** the implied "t1.a=123" constraint. */ - for(pTerm=pWC->a, j=pWC->nTerm; j>0; j--, pTerm++){ + for(pTerm=pWC->a, j=pWC->nBase; j>0; j--, pTerm++){ Expr *pE, sEAlt; WhereTerm *pAlt; if( pTerm->wtFlags & (TERM_VIRTUAL|TERM_CODED) ) continue; @@ -148944,7 +150130,7 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( pLevel->addrFirst = sqlite3VdbeCurrentAddr(v); sqlite3VdbeAddOp2(v, OP_Integer, 1, pLevel->iLeftJoin); VdbeComment((v, "record LEFT JOIN hit")); - for(pTerm=pWC->a, j=0; jnTerm; j++, pTerm++){ + for(pTerm=pWC->a, j=0; jnBase; j++, pTerm++){ testcase( pTerm->wtFlags & TERM_VIRTUAL ); testcase( pTerm->wtFlags & TERM_CODED ); if( pTerm->wtFlags & (TERM_VIRTUAL|TERM_CODED) ) continue; @@ -149055,6 +150241,7 @@ static int whereClauseInsert(WhereClause *pWC, Expr *p, u16 wtFlags){ pWC->nSlot = sqlite3DbMallocSize(db, pWC->a)/sizeof(pWC->a[0]); } pTerm = &pWC->a[idx = pWC->nTerm++]; + if( (wtFlags & TERM_VIRTUAL)==0 ) pWC->nBase = pWC->nTerm; if( p && ExprHasProperty(p, EP_Unlikely) ){ pTerm->truthProb = sqlite3LogEst(p->iTable) - 270; }else{ @@ -149397,7 +150584,7 @@ static int isAuxiliaryVtabOperator( assert( pVtab!=0 ); assert( pVtab->pModule!=0 ); assert( !ExprHasProperty(pExpr, EP_IntValue) ); - pMod = (sqlite3_module *)pVtab->pModule; + pMod = (sqlite3_module *)pVtab->pModule; if( pMod->xFindFunction!=0 ){ i = pMod->xFindFunction(pVtab,2, pExpr->u.zToken, &xNotUsed, &pNotUsed); if( i>=SQLITE_INDEX_CONSTRAINT_FUNCTION ){ @@ -149441,7 +150628,7 @@ static int isAuxiliaryVtabOperator( static void transferJoinMarkings(Expr *pDerived, Expr *pBase){ if( pDerived ){ pDerived->flags |= pBase->flags & EP_FromJoin; - pDerived->iRightJoinTable = pBase->iRightJoinTable; + pDerived->w.iRightJoinTable = pBase->w.iRightJoinTable; } } @@ -149771,7 +150958,7 @@ static void exprAnalyzeOrTerm( pOrTerm = pOrWc->a; for(i=pOrWc->nTerm-1; i>=0; i--, pOrTerm++){ assert( pOrTerm->eOperator & WO_EQ ); - pOrTerm->wtFlags &= ~TERM_OR_OK; + pOrTerm->wtFlags &= ~TERM_OK; if( pOrTerm->leftCursor==iCursor ){ /* This is the 2-bit case and we are on the second iteration and ** current term is from the first iteration. So skip this term. */ @@ -149812,7 +150999,7 @@ static void exprAnalyzeOrTerm( assert( pOrTerm->eOperator & WO_EQ ); assert( (pOrTerm->eOperator & (WO_OR|WO_AND))==0 ); if( pOrTerm->leftCursor!=iCursor ){ - pOrTerm->wtFlags &= ~TERM_OR_OK; + pOrTerm->wtFlags &= ~TERM_OK; }else if( pOrTerm->u.x.leftColumn!=iColumn || (iColumn==XN_EXPR && sqlite3ExprCompare(pParse, pOrTerm->pExpr->pLeft, pLeft, -1) )){ @@ -149828,7 +151015,7 @@ static void exprAnalyzeOrTerm( if( affRight!=0 && affRight!=affLeft ){ okToChngToIN = 0; }else{ - pOrTerm->wtFlags |= TERM_OR_OK; + pOrTerm->wtFlags |= TERM_OK; } } } @@ -149845,7 +151032,7 @@ static void exprAnalyzeOrTerm( Expr *pNew; /* The complete IN operator */ for(i=pOrWc->nTerm-1, pOrTerm=pOrWc->a; i>=0; i--, pOrTerm++){ - if( (pOrTerm->wtFlags & TERM_OR_OK)==0 ) continue; + if( (pOrTerm->wtFlags & TERM_OK)==0 ) continue; assert( pOrTerm->eOperator & WO_EQ ); assert( (pOrTerm->eOperator & (WO_OR|WO_AND))==0 ); assert( pOrTerm->leftCursor==iCursor ); @@ -150046,10 +151233,13 @@ static void exprAnalyze( if( db->mallocFailed ){ return; } + assert( pWC->nTerm > idxTerm ); pTerm = &pWC->a[idxTerm]; pMaskSet = &pWInfo->sMaskSet; pExpr = pTerm->pExpr; + assert( pExpr!=0 ); /* Because malloc() has not failed */ assert( pExpr->op!=TK_AS && pExpr->op!=TK_COLLATE ); + pMaskSet->bVarSelect = 0; prereqLeft = sqlite3WhereExprUsage(pMaskSet, pExpr->pLeft); op = pExpr->op; if( op==TK_IN ){ @@ -150060,16 +151250,30 @@ static void exprAnalyze( }else{ pTerm->prereqRight = sqlite3WhereExprListUsage(pMaskSet, pExpr->x.pList); } - }else if( op==TK_ISNULL ){ - pTerm->prereqRight = 0; + prereqAll = prereqLeft | pTerm->prereqRight; }else{ pTerm->prereqRight = sqlite3WhereExprUsage(pMaskSet, pExpr->pRight); + if( pExpr->pLeft==0 + || ExprHasProperty(pExpr, EP_xIsSelect|EP_IfNullRow) + || pExpr->x.pList!=0 + ){ + prereqAll = sqlite3WhereExprUsageNN(pMaskSet, pExpr); + }else{ + prereqAll = prereqLeft | pTerm->prereqRight; + } } - pMaskSet->bVarSelect = 0; - prereqAll = sqlite3WhereExprUsageNN(pMaskSet, pExpr); if( pMaskSet->bVarSelect ) pTerm->wtFlags |= TERM_VARSELECT; + +#ifdef SQLITE_DEBUG + if( prereqAll!=sqlite3WhereExprUsageNN(pMaskSet, pExpr) ){ + printf("\n*** Incorrect prereqAll computed for:\n"); + sqlite3TreeViewExpr(0,pExpr,0); + abort(); + } +#endif + if( ExprHasProperty(pExpr, EP_FromJoin) ){ - Bitmask x = sqlite3WhereGetMask(pMaskSet, pExpr->iRightJoinTable); + Bitmask x = sqlite3WhereGetMask(pMaskSet, pExpr->w.iRightJoinTable); prereqAll |= x; extraRight = x-1; /* ON clause terms may not be used with an index ** on left table of a LEFT JOIN. Ticket #3015 */ @@ -150337,7 +151541,10 @@ static void exprAnalyze( ** no longer used. ** ** This is only required if at least one side of the comparison operation - ** is not a sub-select. */ + ** is not a sub-select. + ** + ** tag-20220128a + */ if( (pExpr->op==TK_EQ || pExpr->op==TK_IS) && (nLeft = sqlite3ExprVectorSize(pExpr->pLeft))>1 && sqlite3ExprVectorSize(pExpr->pRight)==nLeft @@ -150354,7 +151561,7 @@ static void exprAnalyze( pNew = sqlite3PExpr(pParse, pExpr->op, pLeft, pRight); transferJoinMarkings(pNew, pExpr); - idxNew = whereClauseInsert(pWC, pNew, TERM_DYNAMIC); + idxNew = whereClauseInsert(pWC, pNew, TERM_DYNAMIC|TERM_SLICE); exprAnalyze(pSrc, pWC, idxNew); } pTerm = &pWC->a[idxTerm]; @@ -150384,7 +151591,7 @@ static void exprAnalyze( int i; for(i=0; ipLeft); i++){ int idxNew; - idxNew = whereClauseInsert(pWC, pExpr, TERM_VIRTUAL); + idxNew = whereClauseInsert(pWC, pExpr, TERM_VIRTUAL|TERM_SLICE); pWC->a[idxNew].u.x.iField = i+1; exprAnalyze(pSrc, pWC, idxNew); markTermAsChild(pWC, idxNew, idxTerm); @@ -150417,7 +151624,7 @@ static void exprAnalyze( 0, sqlite3ExprDup(db, pRight, 0)); if( ExprHasProperty(pExpr, EP_FromJoin) && pNewExpr ){ ExprSetProperty(pNewExpr, EP_FromJoin); - pNewExpr->iRightJoinTable = pExpr->iRightJoinTable; + pNewExpr->w.iRightJoinTable = pExpr->w.iRightJoinTable; } idxNew = whereClauseInsert(pWC, pNewExpr, TERM_VIRTUAL|TERM_DYNAMIC); testcase( idxNew==0 ); @@ -150480,6 +151687,113 @@ SQLITE_PRIVATE void sqlite3WhereSplit(WhereClause *pWC, Expr *pExpr, u8 op){ } } +/* +** Add either a LIMIT (if eMatchOp==SQLITE_INDEX_CONSTRAINT_LIMIT) or +** OFFSET (if eMatchOp==SQLITE_INDEX_CONSTRAINT_OFFSET) term to the +** where-clause passed as the first argument. The value for the term +** is found in register iReg. +** +** In the common case where the value is a simple integer +** (example: "LIMIT 5 OFFSET 10") then the expression codes as a +** TK_INTEGER so that it will be available to sqlite3_vtab_rhs_value(). +** If not, then it codes as a TK_REGISTER expression. +*/ +static void whereAddLimitExpr( + WhereClause *pWC, /* Add the constraint to this WHERE clause */ + int iReg, /* Register that will hold value of the limit/offset */ + Expr *pExpr, /* Expression that defines the limit/offset */ + int iCsr, /* Cursor to which the constraint applies */ + int eMatchOp /* SQLITE_INDEX_CONSTRAINT_LIMIT or _OFFSET */ +){ + Parse *pParse = pWC->pWInfo->pParse; + sqlite3 *db = pParse->db; + Expr *pNew; + int iVal = 0; + + if( sqlite3ExprIsInteger(pExpr, &iVal) && iVal>=0 ){ + Expr *pVal = sqlite3Expr(db, TK_INTEGER, 0); + if( pVal==0 ) return; + ExprSetProperty(pVal, EP_IntValue); + pVal->u.iValue = iVal; + pNew = sqlite3PExpr(pParse, TK_MATCH, 0, pVal); + }else{ + Expr *pVal = sqlite3Expr(db, TK_REGISTER, 0); + if( pVal==0 ) return; + pVal->iTable = iReg; + pNew = sqlite3PExpr(pParse, TK_MATCH, 0, pVal); + } + if( pNew ){ + WhereTerm *pTerm; + int idx; + idx = whereClauseInsert(pWC, pNew, TERM_DYNAMIC|TERM_VIRTUAL); + pTerm = &pWC->a[idx]; + pTerm->leftCursor = iCsr; + pTerm->eOperator = WO_AUX; + pTerm->eMatchOp = eMatchOp; + } +} + +/* +** Possibly add terms corresponding to the LIMIT and OFFSET clauses of the +** SELECT statement passed as the second argument. These terms are only +** added if: +** +** 1. The SELECT statement has a LIMIT clause, and +** 2. The SELECT statement is not an aggregate or DISTINCT query, and +** 3. The SELECT statement has exactly one object in its from clause, and +** that object is a virtual table, and +** 4. There are no terms in the WHERE clause that will not be passed +** to the virtual table xBestIndex method. +** 5. The ORDER BY clause, if any, will be made available to the xBestIndex +** method. +** +** LIMIT and OFFSET terms are ignored by most of the planner code. They +** exist only so that they may be passed to the xBestIndex method of the +** single virtual table in the FROM clause of the SELECT. +*/ +SQLITE_PRIVATE void sqlite3WhereAddLimit(WhereClause *pWC, Select *p){ + assert( p==0 || (p->pGroupBy==0 && (p->selFlags & SF_Aggregate)==0) ); + if( (p && p->pLimit) /* 1 */ + && (p->selFlags & (SF_Distinct|SF_Aggregate))==0 /* 2 */ + && (p->pSrc->nSrc==1 && IsVirtual(p->pSrc->a[0].pTab)) /* 3 */ + ){ + ExprList *pOrderBy = p->pOrderBy; + int iCsr = p->pSrc->a[0].iCursor; + int ii; + + /* Check condition (4). Return early if it is not met. */ + for(ii=0; iinTerm; ii++){ + if( pWC->a[ii].wtFlags & TERM_CODED ){ + /* This term is a vector operation that has been decomposed into + ** other, subsequent terms. It can be ignored. See tag-20220128a */ + assert( pWC->a[ii].wtFlags & TERM_VIRTUAL ); + assert( pWC->a[ii].eOperator==0 ); + continue; + } + if( pWC->a[ii].leftCursor!=iCsr ) return; + } + + /* Check condition (5). Return early if it is not met. */ + if( pOrderBy ){ + for(ii=0; iinExpr; ii++){ + Expr *pExpr = pOrderBy->a[ii].pExpr; + if( pExpr->op!=TK_COLUMN ) return; + if( pExpr->iTable!=iCsr ) return; + if( pOrderBy->a[ii].sortFlags & KEYINFO_ORDER_BIGNULL ) return; + } + } + + /* All conditions are met. Add the terms to the where-clause object. */ + assert( p->pLimit->op==TK_LIMIT ); + whereAddLimitExpr(pWC, p->iLimit, p->pLimit->pLeft, + iCsr, SQLITE_INDEX_CONSTRAINT_LIMIT); + if( p->iOffset>0 ){ + whereAddLimitExpr(pWC, p->iOffset, p->pLimit->pRight, + iCsr, SQLITE_INDEX_CONSTRAINT_OFFSET); + } + } +} + /* ** Initialize a preallocated WhereClause structure. */ @@ -150491,6 +151805,7 @@ SQLITE_PRIVATE void sqlite3WhereClauseInit( pWC->hasOr = 0; pWC->pOuter = 0; pWC->nTerm = 0; + pWC->nBase = 0; pWC->nSlot = ArraySize(pWC->aStatic); pWC->a = pWC->aStatic; } @@ -150501,17 +151816,34 @@ SQLITE_PRIVATE void sqlite3WhereClauseInit( ** sqlite3WhereClauseInit(). */ SQLITE_PRIVATE void sqlite3WhereClauseClear(WhereClause *pWC){ - int i; - WhereTerm *a; sqlite3 *db = pWC->pWInfo->pParse->db; - for(i=pWC->nTerm-1, a=pWC->a; i>=0; i--, a++){ - if( a->wtFlags & TERM_DYNAMIC ){ - sqlite3ExprDelete(db, a->pExpr); + assert( pWC->nTerm>=pWC->nBase ); + if( pWC->nTerm>0 ){ + WhereTerm *a = pWC->a; + WhereTerm *aLast = &pWC->a[pWC->nTerm-1]; +#ifdef SQLITE_DEBUG + int i; + /* Verify that every term past pWC->nBase is virtual */ + for(i=pWC->nBase; inTerm; i++){ + assert( (pWC->a[i].wtFlags & TERM_VIRTUAL)!=0 ); } - if( a->wtFlags & TERM_ORINFO ){ - whereOrInfoDelete(db, a->u.pOrInfo); - }else if( a->wtFlags & TERM_ANDINFO ){ - whereAndInfoDelete(db, a->u.pAndInfo); +#endif + while(1){ + assert( a->eMatchOp==0 || a->eOperator==WO_AUX ); + if( a->wtFlags & TERM_DYNAMIC ){ + sqlite3ExprDelete(db, a->pExpr); + } + if( a->wtFlags & (TERM_ORINFO|TERM_ANDINFO) ){ + if( a->wtFlags & TERM_ORINFO ){ + assert( (a->wtFlags & TERM_ANDINFO)==0 ); + whereOrInfoDelete(db, a->u.pOrInfo); + }else{ + assert( (a->wtFlags & TERM_ANDINFO)!=0 ); + whereAndInfoDelete(db, a->u.pAndInfo); + } + } + if( a==aLast ) break; + a++; } } if( pWC->a!=pWC->aStatic ){ @@ -150524,15 +151856,38 @@ SQLITE_PRIVATE void sqlite3WhereClauseClear(WhereClause *pWC){ ** These routines walk (recursively) an expression tree and generate ** a bitmask indicating which tables are used in that expression ** tree. +** +** sqlite3WhereExprUsage(MaskSet, Expr) -> +** +** Return a Bitmask of all tables referenced by Expr. Expr can be +** be NULL, in which case 0 is returned. +** +** sqlite3WhereExprUsageNN(MaskSet, Expr) -> +** +** Same as sqlite3WhereExprUsage() except that Expr must not be +** NULL. The "NN" suffix on the name stands for "Not Null". +** +** sqlite3WhereExprListUsage(MaskSet, ExprList) -> +** +** Return a Bitmask of all tables referenced by every expression +** in the expression list ExprList. ExprList can be NULL, in which +** case 0 is returned. +** +** sqlite3WhereExprUsageFull(MaskSet, ExprList) -> +** +** Internal use only. Called only by sqlite3WhereExprUsageNN() for +** complex expressions that require pushing register values onto +** the stack. Many calls to sqlite3WhereExprUsageNN() do not need +** the more complex analysis done by this routine. Hence, the +** computations done by this routine are broken out into a separate +** "no-inline" function to avoid the stack push overhead in the +** common case where it is not needed. */ -SQLITE_PRIVATE Bitmask sqlite3WhereExprUsageNN(WhereMaskSet *pMaskSet, Expr *p){ +static SQLITE_NOINLINE Bitmask sqlite3WhereExprUsageFull( + WhereMaskSet *pMaskSet, + Expr *p +){ Bitmask mask; - if( p->op==TK_COLUMN && !ExprHasProperty(p, EP_FixedCol) ){ - return sqlite3WhereGetMask(pMaskSet, p->iTable); - }else if( ExprHasProperty(p, EP_TokenOnly|EP_Leaf) ){ - assert( p->op!=TK_IF_NULL_ROW ); - return 0; - } mask = (p->op==TK_IF_NULL_ROW) ? sqlite3WhereGetMask(pMaskSet, p->iTable) : 0; if( p->pLeft ) mask |= sqlite3WhereExprUsageNN(pMaskSet, p->pLeft); if( p->pRight ){ @@ -150554,6 +151909,15 @@ SQLITE_PRIVATE Bitmask sqlite3WhereExprUsageNN(WhereMaskSet *pMaskSet, Expr *p){ #endif return mask; } +SQLITE_PRIVATE Bitmask sqlite3WhereExprUsageNN(WhereMaskSet *pMaskSet, Expr *p){ + if( p->op==TK_COLUMN && !ExprHasProperty(p, EP_FixedCol) ){ + return sqlite3WhereGetMask(pMaskSet, p->iTable); + }else if( ExprHasProperty(p, EP_TokenOnly|EP_Leaf) ){ + assert( p->op!=TK_IF_NULL_ROW ); + return 0; + } + return sqlite3WhereExprUsageFull(pMaskSet, p); +} SQLITE_PRIVATE Bitmask sqlite3WhereExprUsage(WhereMaskSet *pMaskSet, Expr *p){ return p ? sqlite3WhereExprUsageNN(pMaskSet,p) : 0; } @@ -150623,6 +151987,7 @@ SQLITE_PRIVATE void sqlite3WhereTabFuncArgs( pColRef->iColumn = k++; assert( ExprUseYTab(pColRef) ); pColRef->y.pTab = pTab; + pItem->colUsed |= sqlite3ExprColUsed(pColRef); pRhs = sqlite3PExpr(pParse, TK_UPLUS, sqlite3ExprDup(pParse->db, pArgs->a[j].pExpr, 0), 0); pTerm = sqlite3PExpr(pParse, TK_EQ, pColRef, pRhs); @@ -150667,8 +152032,14 @@ SQLITE_PRIVATE void sqlite3WhereTabFuncArgs( */ typedef struct HiddenIndexInfo HiddenIndexInfo; struct HiddenIndexInfo { - WhereClause *pWC; /* The Where clause being analyzed */ - Parse *pParse; /* The parsing context */ + WhereClause *pWC; /* The Where clause being analyzed */ + Parse *pParse; /* The parsing context */ + int eDistinct; /* Value to return from sqlite3_vtab_distinct() */ + u32 mIn; /* Mask of terms that are IN (...) */ + u32 mHandleIn; /* Terms that vtab will handle as IN (...) */ + sqlite3_value *aRhs[1]; /* RHS values for constraints. MUST BE LAST + ** because extra space is allocated to hold up + ** to nTerm such values */ }; /* Forward declaration of methods */ @@ -150871,7 +152242,12 @@ static int whereOrInsert( SQLITE_PRIVATE Bitmask sqlite3WhereGetMask(WhereMaskSet *pMaskSet, int iCursor){ int i; assert( pMaskSet->n<=(int)sizeof(Bitmask)*8 ); - for(i=0; in; i++){ + assert( pMaskSet->n>0 || pMaskSet->ix[0]<0 ); + assert( iCursor>=-1 ); + if( pMaskSet->ix[0]==iCursor ){ + return 1; + } + for(i=1; in; i++){ if( pMaskSet->ix[i]==iCursor ){ return MASKBIT(i); } @@ -151056,16 +152432,16 @@ static WhereTerm *whereScanInit( if( pIdx ){ int j = iColumn; iColumn = pIdx->aiColumn[j]; - if( iColumn==XN_EXPR ){ - pScan->pIdxExpr = pIdx->aColExpr->a[j].pExpr; - pScan->zCollName = pIdx->azColl[j]; - pScan->aiColumn[0] = XN_EXPR; - return whereScanInitIndexExpr(pScan); - }else if( iColumn==pIdx->pTable->iPKey ){ + if( iColumn==pIdx->pTable->iPKey ){ iColumn = XN_ROWID; }else if( iColumn>=0 ){ pScan->idxaff = pIdx->pTable->aCol[iColumn].affinity; pScan->zCollName = pIdx->azColl[j]; + }else if( iColumn==XN_EXPR ){ + pScan->pIdxExpr = pIdx->aColExpr->a[j].pExpr; + pScan->zCollName = pIdx->azColl[j]; + pScan->aiColumn[0] = XN_EXPR; + return whereScanInitIndexExpr(pScan); } }else if( iColumn==XN_EXPR ){ return 0; @@ -151308,12 +152684,14 @@ static void whereTraceIndexInfoInputs(sqlite3_index_info *p){ int i; if( !sqlite3WhereTrace ) return; for(i=0; inConstraint; i++){ - sqlite3DebugPrintf(" constraint[%d]: col=%d termid=%d op=%d usabled=%d\n", + sqlite3DebugPrintf( + " constraint[%d]: col=%d termid=%d op=%d usabled=%d collseq=%s\n", i, p->aConstraint[i].iColumn, p->aConstraint[i].iTermOffset, p->aConstraint[i].op, - p->aConstraint[i].usable); + p->aConstraint[i].usable, + sqlite3_vtab_collation(p,i)); } for(i=0; inOrderBy; i++){ sqlite3DebugPrintf(" orderby[%d]: col=%d desc=%d\n", @@ -151349,9 +152727,9 @@ static void whereTraceIndexInfoOutputs(sqlite3_index_info *p){ ** index existed. */ static int termCanDriveIndex( - WhereTerm *pTerm, /* WHERE clause term to check */ - SrcItem *pSrc, /* Table we are trying to access */ - Bitmask notReady /* Tables in outer loops of the join */ + const WhereTerm *pTerm, /* WHERE clause term to check */ + const SrcItem *pSrc, /* Table we are trying to access */ + const Bitmask notReady /* Tables in outer loops of the join */ ){ char aff; if( pTerm->leftCursor!=pSrc->iCursor ) return 0; @@ -151382,11 +152760,11 @@ static int termCanDriveIndex( ** and to set up the WhereLevel object pLevel so that the code generator ** makes use of the automatic index. */ -static void constructAutomaticIndex( +static SQLITE_NOINLINE void constructAutomaticIndex( Parse *pParse, /* The parsing context */ - WhereClause *pWC, /* The WHERE clause */ - SrcItem *pSrc, /* The FROM clause term to get the next index */ - Bitmask notReady, /* Mask of cursors that are not available */ + const WhereClause *pWC, /* The WHERE clause */ + const SrcItem *pSrc, /* The FROM clause term to get the next index */ + const Bitmask notReady, /* Mask of cursors that are not available */ WhereLevel *pLevel /* Write new index here */ ){ int nKeyCol; /* Number of columns in the constructed index */ @@ -151428,13 +152806,13 @@ static void constructAutomaticIndex( idxCols = 0; for(pTerm=pWC->a; pTermpExpr; - assert( !ExprHasProperty(pExpr, EP_FromJoin) /* prereq always non-zero */ - || pExpr->iRightJoinTable!=pSrc->iCursor /* for the right-hand */ - || pLoop->prereq!=0 ); /* table of a LEFT JOIN */ - if( pLoop->prereq==0 - && (pTerm->wtFlags & TERM_VIRTUAL)==0 - && !ExprHasProperty(pExpr, EP_FromJoin) - && sqlite3ExprIsTableConstant(pExpr, pSrc->iCursor) ){ + /* Make the automatic index a partial index if there are terms in the + ** WHERE clause (or the ON clause of a LEFT join) that constrain which + ** rows of the target table (pSrc) that can be used. */ + if( (pTerm->wtFlags & TERM_VIRTUAL)==0 + && ((pSrc->fg.jointype&JT_LEFT)==0 || ExprHasProperty(pExpr,EP_FromJoin)) + && sqlite3ExprIsTableConstant(pExpr, pSrc->iCursor) + ){ pPartial = sqlite3ExprAnd(pParse, pPartial, sqlite3ExprDup(pParse->db, pExpr, 0)); } @@ -151541,6 +152919,10 @@ static void constructAutomaticIndex( sqlite3VdbeAddOp2(v, OP_OpenAutoindex, pLevel->iIdxCur, nKeyCol+1); sqlite3VdbeSetP4KeyInfo(pParse, pIdx); VdbeComment((v, "for %s", pTable->zName)); + if( OptimizationEnabled(pParse->db, SQLITE_BloomFilter) ){ + pLevel->regFilter = ++pParse->nMem; + sqlite3VdbeAddOp2(v, OP_Blob, 10000, pLevel->regFilter); + } /* Fill the automatic index with content */ pTabItem = &pWC->pWInfo->pTabList->a[pLevel->iFrom]; @@ -151563,6 +152945,10 @@ static void constructAutomaticIndex( regBase = sqlite3GenerateIndexKey( pParse, pIdx, pLevel->iTabCur, regRecord, 0, 0, 0, 0 ); + if( pLevel->regFilter ){ + sqlite3VdbeAddOp4Int(v, OP_FilterAdd, pLevel->regFilter, 0, + regBase, pLoop->u.btree.nEq); + } sqlite3VdbeAddOp2(v, OP_IdxInsert, pLevel->iIdxCur, regRecord); sqlite3VdbeChangeP5(v, OPFLAG_USESEEKRESULT); if( pPartial ) sqlite3VdbeResolveLabel(v, iContinue); @@ -151589,22 +152975,149 @@ static void constructAutomaticIndex( } #endif /* SQLITE_OMIT_AUTOMATIC_INDEX */ +/* +** Generate bytecode that will initialize a Bloom filter that is appropriate +** for pLevel. +** +** If there are inner loops within pLevel that have the WHERE_BLOOMFILTER +** flag set, initialize a Bloomfilter for them as well. Except don't do +** this recursive initialization if the SQLITE_BloomPulldown optimization has +** been turned off. +** +** When the Bloom filter is initialized, the WHERE_BLOOMFILTER flag is cleared +** from the loop, but the regFilter value is set to a register that implements +** the Bloom filter. When regFilter is positive, the +** sqlite3WhereCodeOneLoopStart() will generate code to test the Bloom filter +** and skip the subsequence B-Tree seek if the Bloom filter indicates that +** no matching rows exist. +** +** This routine may only be called if it has previously been determined that +** the loop would benefit from a Bloom filter, and the WHERE_BLOOMFILTER bit +** is set. +*/ +static SQLITE_NOINLINE void sqlite3ConstructBloomFilter( + WhereInfo *pWInfo, /* The WHERE clause */ + int iLevel, /* Index in pWInfo->a[] that is pLevel */ + WhereLevel *pLevel, /* Make a Bloom filter for this FROM term */ + Bitmask notReady /* Loops that are not ready */ +){ + int addrOnce; /* Address of opening OP_Once */ + int addrTop; /* Address of OP_Rewind */ + int addrCont; /* Jump here to skip a row */ + const WhereTerm *pTerm; /* For looping over WHERE clause terms */ + const WhereTerm *pWCEnd; /* Last WHERE clause term */ + Parse *pParse = pWInfo->pParse; /* Parsing context */ + Vdbe *v = pParse->pVdbe; /* VDBE under construction */ + WhereLoop *pLoop = pLevel->pWLoop; /* The loop being coded */ + int iCur; /* Cursor for table getting the filter */ + + assert( pLoop!=0 ); + assert( v!=0 ); + assert( pLoop->wsFlags & WHERE_BLOOMFILTER ); + + addrOnce = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v); + do{ + const SrcItem *pItem; + const Table *pTab; + u64 sz; + sqlite3WhereExplainBloomFilter(pParse, pWInfo, pLevel); + addrCont = sqlite3VdbeMakeLabel(pParse); + iCur = pLevel->iTabCur; + pLevel->regFilter = ++pParse->nMem; + + /* The Bloom filter is a Blob held in a register. Initialize it + ** to zero-filled blob of at least 80K bits, but maybe more if the + ** estimated size of the table is larger. We could actually + ** measure the size of the table at run-time using OP_Count with + ** P3==1 and use that value to initialize the blob. But that makes + ** testing complicated. By basing the blob size on the value in the + ** sqlite_stat1 table, testing is much easier. + */ + pItem = &pWInfo->pTabList->a[pLevel->iFrom]; + assert( pItem!=0 ); + pTab = pItem->pTab; + assert( pTab!=0 ); + sz = sqlite3LogEstToInt(pTab->nRowLogEst); + if( sz<10000 ){ + sz = 10000; + }else if( sz>10000000 ){ + sz = 10000000; + } + sqlite3VdbeAddOp2(v, OP_Blob, (int)sz, pLevel->regFilter); + + addrTop = sqlite3VdbeAddOp1(v, OP_Rewind, iCur); VdbeCoverage(v); + pWCEnd = &pWInfo->sWC.a[pWInfo->sWC.nTerm]; + for(pTerm=pWInfo->sWC.a; pTermpExpr; + if( (pTerm->wtFlags & TERM_VIRTUAL)==0 + && sqlite3ExprIsTableConstant(pExpr, iCur) + ){ + sqlite3ExprIfFalse(pParse, pTerm->pExpr, addrCont, SQLITE_JUMPIFNULL); + } + } + if( pLoop->wsFlags & WHERE_IPK ){ + int r1 = sqlite3GetTempReg(pParse); + sqlite3VdbeAddOp2(v, OP_Rowid, iCur, r1); + sqlite3VdbeAddOp4Int(v, OP_FilterAdd, pLevel->regFilter, 0, r1, 1); + sqlite3ReleaseTempReg(pParse, r1); + }else{ + Index *pIdx = pLoop->u.btree.pIndex; + int n = pLoop->u.btree.nEq; + int r1 = sqlite3GetTempRange(pParse, n); + int jj; + for(jj=0; jjaiColumn[jj]; + assert( pIdx->pTable==pItem->pTab ); + sqlite3ExprCodeGetColumnOfTable(v, pIdx->pTable, iCur, iCol,r1+jj); + } + sqlite3VdbeAddOp4Int(v, OP_FilterAdd, pLevel->regFilter, 0, r1, n); + sqlite3ReleaseTempRange(pParse, r1, n); + } + sqlite3VdbeResolveLabel(v, addrCont); + sqlite3VdbeAddOp2(v, OP_Next, pLevel->iTabCur, addrTop+1); + VdbeCoverage(v); + sqlite3VdbeJumpHere(v, addrTop); + pLoop->wsFlags &= ~WHERE_BLOOMFILTER; + if( OptimizationDisabled(pParse->db, SQLITE_BloomPulldown) ) break; + while( ++iLevel < pWInfo->nLevel ){ + const SrcItem *pTabItem; + pLevel = &pWInfo->a[iLevel]; + pTabItem = &pWInfo->pTabList->a[pLevel->iFrom]; + if( pTabItem->fg.jointype & JT_LEFT ) continue; + pLoop = pLevel->pWLoop; + if( NEVER(pLoop==0) ) continue; + if( pLoop->prereq & notReady ) continue; + if( (pLoop->wsFlags & (WHERE_BLOOMFILTER|WHERE_COLUMN_IN)) + ==WHERE_BLOOMFILTER + ){ + /* This is a candidate for bloom-filter pull-down (early evaluation). + ** The test that WHERE_COLUMN_IN is omitted is important, as we are + ** not able to do early evaluation of bloom filters that make use of + ** the IN operator */ + break; + } + } + }while( iLevel < pWInfo->nLevel ); + sqlite3VdbeJumpHere(v, addrOnce); +} + + #ifndef SQLITE_OMIT_VIRTUALTABLE /* ** Allocate and populate an sqlite3_index_info structure. It is the ** responsibility of the caller to eventually release the structure -** by passing the pointer returned by this function to sqlite3_free(). +** by passing the pointer returned by this function to freeIndexInfo(). */ static sqlite3_index_info *allocateIndexInfo( - Parse *pParse, /* The parsing context */ + WhereInfo *pWInfo, /* The WHERE clause */ WhereClause *pWC, /* The WHERE clause being analyzed */ Bitmask mUnusable, /* Ignore terms with these prereqs */ SrcItem *pSrc, /* The FROM clause term that is the vtab */ - ExprList *pOrderBy, /* The ORDER BY clause */ u16 *pmNoOmit /* Mask of terms not to omit */ ){ int i, j; int nTerm; + Parse *pParse = pWInfo->pParse; struct sqlite3_index_constraint *pIdxCons; struct sqlite3_index_orderby *pIdxOrderBy; struct sqlite3_index_constraint_usage *pUsage; @@ -151613,10 +153126,21 @@ static sqlite3_index_info *allocateIndexInfo( int nOrderBy; sqlite3_index_info *pIdxInfo; u16 mNoOmit = 0; + const Table *pTab; + int eDistinct = 0; + ExprList *pOrderBy = pWInfo->pOrderBy; + + assert( pSrc!=0 ); + pTab = pSrc->pTab; + assert( pTab!=0 ); + assert( IsVirtual(pTab) ); - /* Count the number of possible WHERE clause constraints referring - ** to this virtual table */ + /* Find all WHERE clause constraints referring to this virtual table. + ** Mark each term with the TERM_OK flag. Set nTerm to the number of + ** terms found. + */ for(i=nTerm=0, pTerm=pWC->a; inTerm; i++, pTerm++){ + pTerm->wtFlags &= ~TERM_OK; if( pTerm->leftCursor != pSrc->iCursor ) continue; if( pTerm->prereqRight & mUnusable ) continue; assert( IsPowerOfTwo(pTerm->eOperator & ~WO_EQUIV) ); @@ -151626,9 +153150,21 @@ static sqlite3_index_info *allocateIndexInfo( testcase( pTerm->eOperator & WO_ALL ); if( (pTerm->eOperator & ~(WO_EQUIV))==0 ) continue; if( pTerm->wtFlags & TERM_VNULL ) continue; + assert( (pTerm->eOperator & (WO_OR|WO_AND))==0 ); - assert( pTerm->u.x.leftColumn>=(-1) ); + assert( pTerm->u.x.leftColumn>=XN_ROWID ); + assert( pTerm->u.x.leftColumnnCol ); + + /* tag-20191211-002: WHERE-clause constraints are not useful to the + ** right-hand table of a LEFT JOIN. See tag-20191211-001 for the + ** equivalent restriction for ordinary tables. */ + if( (pSrc->fg.jointype & JT_LEFT)!=0 + && !ExprHasProperty(pTerm->pExpr, EP_FromJoin) + ){ + continue; + } nTerm++; + pTerm->wtFlags |= TERM_OK; } /* If the ORDER BY clause contains only columns in the current @@ -151640,11 +153176,47 @@ static sqlite3_index_info *allocateIndexInfo( int n = pOrderBy->nExpr; for(i=0; ia[i].pExpr; - if( pExpr->op!=TK_COLUMN || pExpr->iTable!=pSrc->iCursor ) break; + Expr *pE2; + + /* Skip over constant terms in the ORDER BY clause */ + if( sqlite3ExprIsConstant(pExpr) ){ + continue; + } + + /* Virtual tables are unable to deal with NULLS FIRST */ if( pOrderBy->a[i].sortFlags & KEYINFO_ORDER_BIGNULL ) break; + + /* First case - a direct column references without a COLLATE operator */ + if( pExpr->op==TK_COLUMN && pExpr->iTable==pSrc->iCursor ){ + assert( pExpr->iColumn>=XN_ROWID && pExpr->iColumnnCol ); + continue; + } + + /* 2nd case - a column reference with a COLLATE operator. Only match + ** of the COLLATE operator matches the collation of the column. */ + if( pExpr->op==TK_COLLATE + && (pE2 = pExpr->pLeft)->op==TK_COLUMN + && pE2->iTable==pSrc->iCursor + ){ + const char *zColl; /* The collating sequence name */ + assert( !ExprHasProperty(pExpr, EP_IntValue) ); + assert( pExpr->u.zToken!=0 ); + assert( pE2->iColumn>=XN_ROWID && pE2->iColumnnCol ); + pExpr->iColumn = pE2->iColumn; + if( pE2->iColumn<0 ) continue; /* Collseq does not matter for rowid */ + zColl = sqlite3ColumnColl(&pTab->aCol[pE2->iColumn]); + if( zColl==0 ) zColl = sqlite3StrBINARY; + if( sqlite3_stricmp(pExpr->u.zToken, zColl)==0 ) continue; + } + + /* No matches cause a break out of the loop */ + break; } - if( i==n){ + if( i==n ){ nOrderBy = n; + if( (pWInfo->wctrlFlags & (WHERE_GROUPBY|WHERE_DISTINCTBY)) ){ + eDistinct = 1 + ((pWInfo->wctrlFlags & WHERE_DISTINCTBY)!=0); + } } } @@ -151652,47 +153224,35 @@ static sqlite3_index_info *allocateIndexInfo( */ pIdxInfo = sqlite3DbMallocZero(pParse->db, sizeof(*pIdxInfo) + (sizeof(*pIdxCons) + sizeof(*pUsage))*nTerm - + sizeof(*pIdxOrderBy)*nOrderBy + sizeof(*pHidden) ); + + sizeof(*pIdxOrderBy)*nOrderBy + sizeof(*pHidden) + + sizeof(sqlite3_value*)*nTerm ); if( pIdxInfo==0 ){ sqlite3ErrorMsg(pParse, "out of memory"); return 0; } pHidden = (struct HiddenIndexInfo*)&pIdxInfo[1]; - pIdxCons = (struct sqlite3_index_constraint*)&pHidden[1]; + pIdxCons = (struct sqlite3_index_constraint*)&pHidden->aRhs[nTerm]; pIdxOrderBy = (struct sqlite3_index_orderby*)&pIdxCons[nTerm]; pUsage = (struct sqlite3_index_constraint_usage*)&pIdxOrderBy[nOrderBy]; - pIdxInfo->nOrderBy = nOrderBy; pIdxInfo->aConstraint = pIdxCons; pIdxInfo->aOrderBy = pIdxOrderBy; pIdxInfo->aConstraintUsage = pUsage; pHidden->pWC = pWC; pHidden->pParse = pParse; + pHidden->eDistinct = eDistinct; + pHidden->mIn = 0; for(i=j=0, pTerm=pWC->a; inTerm; i++, pTerm++){ u16 op; - if( pTerm->leftCursor != pSrc->iCursor ) continue; - if( pTerm->prereqRight & mUnusable ) continue; - assert( IsPowerOfTwo(pTerm->eOperator & ~WO_EQUIV) ); - testcase( pTerm->eOperator & WO_IN ); - testcase( pTerm->eOperator & WO_IS ); - testcase( pTerm->eOperator & WO_ISNULL ); - testcase( pTerm->eOperator & WO_ALL ); - if( (pTerm->eOperator & ~(WO_EQUIV))==0 ) continue; - if( pTerm->wtFlags & TERM_VNULL ) continue; - - /* tag-20191211-002: WHERE-clause constraints are not useful to the - ** right-hand table of a LEFT JOIN. See tag-20191211-001 for the - ** equivalent restriction for ordinary tables. */ - if( (pSrc->fg.jointype & JT_LEFT)!=0 - && !ExprHasProperty(pTerm->pExpr, EP_FromJoin) - ){ - continue; - } - assert( (pTerm->eOperator & (WO_OR|WO_AND))==0 ); - assert( pTerm->u.x.leftColumn>=(-1) ); + if( (pTerm->wtFlags & TERM_OK)==0 ) continue; pIdxCons[j].iColumn = pTerm->u.x.leftColumn; pIdxCons[j].iTermOffset = i; op = pTerm->eOperator & WO_ALL; - if( op==WO_IN ) op = WO_EQ; + if( op==WO_IN ){ + if( (pTerm->wtFlags & TERM_SLICE)==0 ){ + pHidden->mIn |= SMASKBIT32(j); + } + op = WO_EQ; + } if( op==WO_AUX ){ pIdxCons[j].op = pTerm->eMatchOp; }else if( op & (WO_ISNULL|WO_IS) ){ @@ -151725,17 +153285,42 @@ static sqlite3_index_info *allocateIndexInfo( j++; } + assert( j==nTerm ); pIdxInfo->nConstraint = j; - for(i=0; ia[i].pExpr; - pIdxOrderBy[i].iColumn = pExpr->iColumn; - pIdxOrderBy[i].desc = pOrderBy->a[i].sortFlags & KEYINFO_ORDER_DESC; + if( sqlite3ExprIsConstant(pExpr) ) continue; + assert( pExpr->op==TK_COLUMN + || (pExpr->op==TK_COLLATE && pExpr->pLeft->op==TK_COLUMN + && pExpr->iColumn==pExpr->pLeft->iColumn) ); + pIdxOrderBy[j].iColumn = pExpr->iColumn; + pIdxOrderBy[j].desc = pOrderBy->a[i].sortFlags & KEYINFO_ORDER_DESC; + j++; } + pIdxInfo->nOrderBy = j; *pmNoOmit = mNoOmit; return pIdxInfo; } +/* +** Free an sqlite3_index_info structure allocated by allocateIndexInfo() +** and possibly modified by xBestIndex methods. +*/ +static void freeIndexInfo(sqlite3 *db, sqlite3_index_info *pIdxInfo){ + HiddenIndexInfo *pHidden; + int i; + assert( pIdxInfo!=0 ); + pHidden = (HiddenIndexInfo*)&pIdxInfo[1]; + assert( pHidden->pParse!=0 ); + assert( pHidden->pParse->db==db ); + for(i=0; inConstraint; i++){ + sqlite3ValueFree(pHidden->aRhs[i]); /* IMP: R-14553-25174 */ + pHidden->aRhs[i] = 0; + } + sqlite3DbFree(db, pIdxInfo); +} + /* ** The table object reference passed as the second argument to this function ** must represent a virtual table. This function invokes the xBestIndex() @@ -151757,7 +153342,9 @@ static int vtabBestIndex(Parse *pParse, Table *pTab, sqlite3_index_info *p){ int rc; whereTraceIndexInfoInputs(p); + pParse->db->nSchemaLock++; rc = pVtab->pModule->xBestIndex(pVtab, p); + pParse->db->nSchemaLock--; whereTraceIndexInfoOutputs(p); if( rc!=SQLITE_OK && rc!=SQLITE_CONSTRAINT ){ @@ -152531,9 +154118,9 @@ SQLITE_PRIVATE void sqlite3WhereLoopPrint(WhereLoop *p, WhereClause *pWC){ sqlite3_free(z); } if( p->wsFlags & WHERE_SKIPSCAN ){ - sqlite3DebugPrintf(" f %05x %d-%d", p->wsFlags, p->nLTerm,p->nSkip); + sqlite3DebugPrintf(" f %06x %d-%d", p->wsFlags, p->nLTerm,p->nSkip); }else{ - sqlite3DebugPrintf(" f %05x N %d", p->wsFlags, p->nLTerm); + sqlite3DebugPrintf(" f %06x N %d", p->wsFlags, p->nLTerm); } sqlite3DebugPrintf(" cost %d,%d,%d\n", p->rSetup, p->rRun, p->nOut); if( p->nLTerm && (sqlite3WhereTrace & 0x100)!=0 ){ @@ -152993,11 +154580,11 @@ static void whereLoopOutputAdjust( LogEst iReduce = 0; /* pLoop->nOut should not exceed nRow-iReduce */ assert( (pLoop->wsFlags & WHERE_AUTO_INDEX)==0 ); - for(i=pWC->nTerm, pTerm=pWC->a; i>0; i--, pTerm++){ + for(i=pWC->nBase, pTerm=pWC->a; i>0; i--, pTerm++){ assert( pTerm!=0 ); - if( (pTerm->wtFlags & TERM_VIRTUAL)!=0 ) break; - if( (pTerm->prereqAll & pLoop->maskSelf)==0 ) continue; if( (pTerm->prereqAll & notAllowed)!=0 ) continue; + if( (pTerm->prereqAll & pLoop->maskSelf)==0 ) continue; + if( (pTerm->wtFlags & TERM_VIRTUAL)!=0 ) continue; for(j=pLoop->nLTerm-1; j>=0; j--){ pX = pLoop->aLTerm[j]; if( pX==0 ) continue; @@ -153005,6 +154592,22 @@ static void whereLoopOutputAdjust( if( pX->iParent>=0 && (&pWC->a[pX->iParent])==pTerm ) break; } if( j<0 ){ + if( pLoop->maskSelf==pTerm->prereqAll ){ + /* If there are extra terms in the WHERE clause not used by an index + ** that depend only on the table being scanned, and that will tend to + ** cause many rows to be omitted, then mark that table as + ** "self-culling". + ** + ** 2022-03-24: Self-culling only applies if either the extra terms + ** are straight comparison operators that are non-true with NULL + ** operand, or if the loop is not a LEFT JOIN. + */ + if( (pTerm->eOperator & 0x3f)!=0 + || (pWC->pWInfo->pTabList->a[pLoop->iTab].fg.jointype & JT_LEFT)==0 + ){ + pLoop->wsFlags |= WHERE_SELFCULL; + } + } if( pTerm->truthProb<=0 ){ /* If a truth probability is specified using the likelihood() hints, ** then use the probability provided by the application. */ @@ -153032,7 +154635,9 @@ static void whereLoopOutputAdjust( } } } - if( pLoop->nOut > nRow-iReduce ) pLoop->nOut = nRow - iReduce; + if( pLoop->nOut > nRow-iReduce ){ + pLoop->nOut = nRow - iReduce; + } } /* @@ -153577,7 +155182,7 @@ static int whereUsablePartialIndex( for(i=0, pTerm=pWC->a; inTerm; i++, pTerm++){ Expr *pExpr; pExpr = pTerm->pExpr; - if( (!ExprHasProperty(pExpr, EP_FromJoin) || pExpr->iRightJoinTable==iTab) + if( (!ExprHasProperty(pExpr, EP_FromJoin) || pExpr->w.iRightJoinTable==iTab) && (isLeft==0 || ExprHasProperty(pExpr, EP_FromJoin)) && sqlite3ExprImpliesExpr(pParse, pExpr, pWhere, iTab) && (pTerm->wtFlags & TERM_VNULL)==0 @@ -153879,6 +155484,15 @@ static int whereLoopAddBtree( #ifndef SQLITE_OMIT_VIRTUALTABLE +/* +** Return true if pTerm is a virtual table LIMIT or OFFSET term. +*/ +static int isLimitTerm(WhereTerm *pTerm){ + assert( pTerm->eOperator==WO_AUX || pTerm->eMatchOp==0 ); + return pTerm->eMatchOp>=SQLITE_INDEX_CONSTRAINT_LIMIT + && pTerm->eMatchOp<=SQLITE_INDEX_CONSTRAINT_OFFSET; +} + /* ** Argument pIdxInfo is already populated with all constraints that may ** be used by the virtual table identified by pBuilder->pNew->iTab. This @@ -153906,9 +155520,11 @@ static int whereLoopAddVirtualOne( u16 mExclude, /* Exclude terms using these operators */ sqlite3_index_info *pIdxInfo, /* Populated object for xBestIndex */ u16 mNoOmit, /* Do not omit these constraints */ - int *pbIn /* OUT: True if plan uses an IN(...) op */ + int *pbIn, /* OUT: True if plan uses an IN(...) op */ + int *pbRetryLimit /* OUT: Retry without LIMIT/OFFSET */ ){ WhereClause *pWC = pBuilder->pWC; + HiddenIndexInfo *pHidden = (HiddenIndexInfo*)&pIdxInfo[1]; struct sqlite3_index_constraint *pIdxCons; struct sqlite3_index_constraint_usage *pUsage = pIdxInfo->aConstraintUsage; int i; @@ -153931,6 +155547,7 @@ static int whereLoopAddVirtualOne( pIdxCons->usable = 0; if( (pTerm->prereqRight & mUsable)==pTerm->prereqRight && (pTerm->eOperator & mExclude)==0 + && (pbRetryLimit || !isLimitTerm(pTerm)) ){ pIdxCons->usable = 1; } @@ -153946,6 +155563,7 @@ static int whereLoopAddVirtualOne( pIdxInfo->estimatedRows = 25; pIdxInfo->idxFlags = 0; pIdxInfo->colUsed = (sqlite3_int64)pSrc->colUsed; + pHidden->mHandleIn = 0; /* Invoke the virtual table xBestIndex() method */ rc = vtabBestIndex(pParse, pSrc->pTab, pIdxInfo); @@ -153963,8 +155581,8 @@ static int whereLoopAddVirtualOne( mxTerm = -1; assert( pNew->nLSlot>=nConstraint ); - for(i=0; iaLTerm[i] = 0; - pNew->u.vtab.omitMask = 0; + memset(pNew->aLTerm, 0, sizeof(pNew->aLTerm[0])*nConstraint ); + memset(&pNew->u.vtab, 0, sizeof(pNew->u.vtab)); pIdxCons = *(struct sqlite3_index_constraint**)&pIdxInfo->aConstraint; for(i=0; ieMatchOp==SQLITE_INDEX_CONSTRAINT_OFFSET ){ + pNew->u.vtab.bOmitOffset = 1; + } } - if( (pTerm->eOperator & WO_IN)!=0 ){ + if( SMASKBIT32(i) & pHidden->mHandleIn ){ + pNew->u.vtab.mHandleIn |= MASKBIT32(iTerm); + }else if( (pTerm->eOperator & WO_IN)!=0 ){ /* A virtual table that is constrained by an IN clause may not ** consume the ORDER BY clause because (1) the order of IN terms ** is not necessarily related to the order of output terms and @@ -154009,6 +155632,21 @@ static int whereLoopAddVirtualOne( pIdxInfo->idxFlags &= ~SQLITE_INDEX_SCAN_UNIQUE; *pbIn = 1; assert( (mExclude & WO_IN)==0 ); } + + if( isLimitTerm(pTerm) && *pbIn ){ + /* If there is an IN(...) term handled as an == (separate call to + ** xFilter for each value on the RHS of the IN) and a LIMIT or + ** OFFSET term handled as well, the plan is unusable. Set output + ** variable *pbRetryLimit to true to tell the caller to retry with + ** LIMIT and OFFSET disabled. */ + if( pIdxInfo->needToFreeIdxStr ){ + sqlite3_free(pIdxInfo->idxStr); + pIdxInfo->idxStr = 0; + pIdxInfo->needToFreeIdxStr = 0; + } + *pbRetryLimit = 1; + return SQLITE_OK; + } } } @@ -154053,11 +155691,19 @@ static int whereLoopAddVirtualOne( } /* -** If this function is invoked from within an xBestIndex() callback, it -** returns a pointer to a buffer containing the name of the collation -** sequence associated with element iCons of the sqlite3_index_info.aConstraint -** array. Or, if iCons is out of range or there is no active xBestIndex -** call, return NULL. +** Return the collating sequence for a constraint passed into xBestIndex. +** +** pIdxInfo must be an sqlite3_index_info structure passed into xBestIndex. +** This routine depends on there being a HiddenIndexInfo structure immediately +** following the sqlite3_index_info structure. +** +** Return a pointer to the collation name: +** +** 1. If there is an explicit COLLATE operator on the constaint, return it. +** +** 2. Else, if the column has an alternative collation, return that. +** +** 3. Otherwise, return "BINARY". */ SQLITE_API const char *sqlite3_vtab_collation(sqlite3_index_info *pIdxInfo, int iCons){ HiddenIndexInfo *pHidden = (HiddenIndexInfo*)&pIdxInfo[1]; @@ -154074,6 +155720,88 @@ SQLITE_API const char *sqlite3_vtab_collation(sqlite3_index_info *pIdxInfo, int return zRet; } +/* +** Return true if constraint iCons is really an IN(...) constraint, or +** false otherwise. If iCons is an IN(...) constraint, set (if bHandle!=0) +** or clear (if bHandle==0) the flag to handle it using an iterator. +*/ +SQLITE_API int sqlite3_vtab_in(sqlite3_index_info *pIdxInfo, int iCons, int bHandle){ + HiddenIndexInfo *pHidden = (HiddenIndexInfo*)&pIdxInfo[1]; + u32 m = SMASKBIT32(iCons); + if( m & pHidden->mIn ){ + if( bHandle==0 ){ + pHidden->mHandleIn &= ~m; + }else if( bHandle>0 ){ + pHidden->mHandleIn |= m; + } + return 1; + } + return 0; +} + +/* +** This interface is callable from within the xBestIndex callback only. +** +** If possible, set (*ppVal) to point to an object containing the value +** on the right-hand-side of constraint iCons. +*/ +SQLITE_API int sqlite3_vtab_rhs_value( + sqlite3_index_info *pIdxInfo, /* Copy of first argument to xBestIndex */ + int iCons, /* Constraint for which RHS is wanted */ + sqlite3_value **ppVal /* Write value extracted here */ +){ + HiddenIndexInfo *pH = (HiddenIndexInfo*)&pIdxInfo[1]; + sqlite3_value *pVal = 0; + int rc = SQLITE_OK; + if( iCons<0 || iCons>=pIdxInfo->nConstraint ){ + rc = SQLITE_MISUSE; /* EV: R-30545-25046 */ + }else{ + if( pH->aRhs[iCons]==0 ){ + WhereTerm *pTerm = &pH->pWC->a[pIdxInfo->aConstraint[iCons].iTermOffset]; + rc = sqlite3ValueFromExpr( + pH->pParse->db, pTerm->pExpr->pRight, ENC(pH->pParse->db), + SQLITE_AFF_BLOB, &pH->aRhs[iCons] + ); + testcase( rc!=SQLITE_OK ); + } + pVal = pH->aRhs[iCons]; + } + *ppVal = pVal; + + if( rc==SQLITE_OK && pVal==0 ){ /* IMP: R-19933-32160 */ + rc = SQLITE_NOTFOUND; /* IMP: R-36424-56542 */ + } + + return rc; +} + +/* +** Return true if ORDER BY clause may be handled as DISTINCT. +*/ +SQLITE_API int sqlite3_vtab_distinct(sqlite3_index_info *pIdxInfo){ + HiddenIndexInfo *pHidden = (HiddenIndexInfo*)&pIdxInfo[1]; + assert( pHidden->eDistinct==0 + || pHidden->eDistinct==1 + || pHidden->eDistinct==2 ); + return pHidden->eDistinct; +} + +#if (defined(SQLITE_ENABLE_DBPAGE_VTAB) || defined(SQLITE_TEST)) \ + && !defined(SQLITE_OMIT_VIRTUALTABLE) +/* +** Cause the prepared statement that is associated with a call to +** xBestIndex to open write transactions on all attached schemas. +** This is used by the (built-in) sqlite_dbpage virtual table. +*/ +SQLITE_PRIVATE void sqlite3VtabWriteAll(sqlite3_index_info *pIdxInfo){ + HiddenIndexInfo *pHidden = (HiddenIndexInfo*)&pIdxInfo[1]; + Parse *pParse = pHidden->pParse; + int nDb = pParse->db->nDb; + int i; + for(i=0; ipNew->iTab. That table is guaranteed to be a virtual table. @@ -154115,6 +155843,7 @@ static int whereLoopAddVirtual( WhereLoop *pNew; Bitmask mBest; /* Tables used by best possible plan */ u16 mNoOmit; + int bRetry = 0; /* True to retry with LIMIT/OFFSET disabled */ assert( (mPrereq & mUnusable)==0 ); pWInfo = pBuilder->pWInfo; @@ -154123,8 +155852,7 @@ static int whereLoopAddVirtual( pNew = pBuilder->pNew; pSrc = &pWInfo->pTabList->a[pNew->iTab]; assert( IsVirtual(pSrc->pTab) ); - p = allocateIndexInfo(pParse, pWC, mUnusable, pSrc, pBuilder->pOrderBy, - &mNoOmit); + p = allocateIndexInfo(pWInfo, pWC, mUnusable, pSrc, &mNoOmit); if( p==0 ) return SQLITE_NOMEM_BKPT; pNew->rSetup = 0; pNew->wsFlags = WHERE_VIRTUALTABLE; @@ -154132,14 +155860,22 @@ static int whereLoopAddVirtual( pNew->u.vtab.needFree = 0; nConstraint = p->nConstraint; if( whereLoopResize(pParse->db, pNew, nConstraint) ){ - sqlite3DbFree(pParse->db, p); + freeIndexInfo(pParse->db, p); return SQLITE_NOMEM_BKPT; } /* First call xBestIndex() with all constraints usable. */ WHERETRACE(0x800, ("BEGIN %s.addVirtual()\n", pSrc->pTab->zName)); WHERETRACE(0x40, (" VirtualOne: all usable\n")); - rc = whereLoopAddVirtualOne(pBuilder, mPrereq, ALLBITS, 0, p, mNoOmit, &bIn); + rc = whereLoopAddVirtualOne( + pBuilder, mPrereq, ALLBITS, 0, p, mNoOmit, &bIn, &bRetry + ); + if( bRetry ){ + assert( rc==SQLITE_OK ); + rc = whereLoopAddVirtualOne( + pBuilder, mPrereq, ALLBITS, 0, p, mNoOmit, &bIn, 0 + ); + } /* If the call to xBestIndex() with all terms enabled produced a plan ** that does not require any source tables (IOW: a plan with mBest==0) @@ -154157,7 +155893,7 @@ static int whereLoopAddVirtual( if( bIn ){ WHERETRACE(0x40, (" VirtualOne: all usable w/o IN\n")); rc = whereLoopAddVirtualOne( - pBuilder, mPrereq, ALLBITS, WO_IN, p, mNoOmit, &bIn); + pBuilder, mPrereq, ALLBITS, WO_IN, p, mNoOmit, &bIn, 0); assert( bIn==0 ); mBestNoIn = pNew->prereq & ~mPrereq; if( mBestNoIn==0 ){ @@ -154184,7 +155920,7 @@ static int whereLoopAddVirtual( WHERETRACE(0x40, (" VirtualOne: mPrev=%04llx mNext=%04llx\n", (sqlite3_uint64)mPrev, (sqlite3_uint64)mNext)); rc = whereLoopAddVirtualOne( - pBuilder, mPrereq, mNext|mPrereq, 0, p, mNoOmit, &bIn); + pBuilder, mPrereq, mNext|mPrereq, 0, p, mNoOmit, &bIn, 0); if( pNew->prereq==mPrereq ){ seenZero = 1; if( bIn==0 ) seenZeroNoIN = 1; @@ -154197,7 +155933,7 @@ static int whereLoopAddVirtual( if( rc==SQLITE_OK && seenZero==0 ){ WHERETRACE(0x40, (" VirtualOne: all disabled\n")); rc = whereLoopAddVirtualOne( - pBuilder, mPrereq, mPrereq, 0, p, mNoOmit, &bIn); + pBuilder, mPrereq, mPrereq, 0, p, mNoOmit, &bIn, 0); if( bIn==0 ) seenZeroNoIN = 1; } @@ -154207,12 +155943,12 @@ static int whereLoopAddVirtual( if( rc==SQLITE_OK && seenZeroNoIN==0 ){ WHERETRACE(0x40, (" VirtualOne: all disabled and w/o IN\n")); rc = whereLoopAddVirtualOne( - pBuilder, mPrereq, mPrereq, WO_IN, p, mNoOmit, &bIn); + pBuilder, mPrereq, mPrereq, WO_IN, p, mNoOmit, &bIn, 0); } } if( p->needToFreeIdxStr ) sqlite3_free(p->idxStr); - sqlite3DbFreeNN(pParse->db, p); + freeIndexInfo(pParse->db, p); WHERETRACE(0x800, ("END %s.addVirtual(), rc=%d\n", pSrc->pTab->zName, rc)); return rc; } @@ -154256,7 +155992,6 @@ static int whereLoopAddOr( int i, j; sSubBuild = *pBuilder; - sSubBuild.pOrderBy = 0; sSubBuild.pOrSet = &sCur; WHERETRACE(0x200, ("Begin processing OR-clause %p\n", pTerm)); @@ -154268,6 +156003,7 @@ static int whereLoopAddOr( tempWC.pOuter = pWC; tempWC.op = TK_AND; tempWC.nTerm = 1; + tempWC.nBase = 1; tempWC.a = pOrTerm; sSubBuild.pWC = &tempWC; }else{ @@ -155375,6 +157111,150 @@ static void showAllWhereLoops(WhereInfo *pWInfo, WhereClause *pWC){ # define WHERETRACE_ALL_LOOPS(W,C) #endif +/* Attempt to omit tables from a join that do not affect the result. +** For a table to not affect the result, the following must be true: +** +** 1) The query must not be an aggregate. +** 2) The table must be the RHS of a LEFT JOIN. +** 3) Either the query must be DISTINCT, or else the ON or USING clause +** must contain a constraint that limits the scan of the table to +** at most a single row. +** 4) The table must not be referenced by any part of the query apart +** from its own USING or ON clause. +** +** For example, given: +** +** CREATE TABLE t1(ipk INTEGER PRIMARY KEY, v1); +** CREATE TABLE t2(ipk INTEGER PRIMARY KEY, v2); +** CREATE TABLE t3(ipk INTEGER PRIMARY KEY, v3); +** +** then table t2 can be omitted from the following: +** +** SELECT v1, v3 FROM t1 +** LEFT JOIN t2 ON (t1.ipk=t2.ipk) +** LEFT JOIN t3 ON (t1.ipk=t3.ipk) +** +** or from: +** +** SELECT DISTINCT v1, v3 FROM t1 +** LEFT JOIN t2 +** LEFT JOIN t3 ON (t1.ipk=t3.ipk) +*/ +static SQLITE_NOINLINE Bitmask whereOmitNoopJoin( + WhereInfo *pWInfo, + Bitmask notReady +){ + int i; + Bitmask tabUsed; + + /* Preconditions checked by the caller */ + assert( pWInfo->nLevel>=2 ); + assert( OptimizationEnabled(pWInfo->pParse->db, SQLITE_OmitNoopJoin) ); + + /* These two preconditions checked by the caller combine to guarantee + ** condition (1) of the header comment */ + assert( pWInfo->pResultSet!=0 ); + assert( 0==(pWInfo->wctrlFlags & WHERE_AGG_DISTINCT) ); + + tabUsed = sqlite3WhereExprListUsage(&pWInfo->sMaskSet, pWInfo->pResultSet); + if( pWInfo->pOrderBy ){ + tabUsed |= sqlite3WhereExprListUsage(&pWInfo->sMaskSet, pWInfo->pOrderBy); + } + for(i=pWInfo->nLevel-1; i>=1; i--){ + WhereTerm *pTerm, *pEnd; + SrcItem *pItem; + WhereLoop *pLoop; + pLoop = pWInfo->a[i].pWLoop; + pItem = &pWInfo->pTabList->a[pLoop->iTab]; + if( (pItem->fg.jointype & JT_LEFT)==0 ) continue; + if( (pWInfo->wctrlFlags & WHERE_WANT_DISTINCT)==0 + && (pLoop->wsFlags & WHERE_ONEROW)==0 + ){ + continue; + } + if( (tabUsed & pLoop->maskSelf)!=0 ) continue; + pEnd = pWInfo->sWC.a + pWInfo->sWC.nTerm; + for(pTerm=pWInfo->sWC.a; pTermprereqAll & pLoop->maskSelf)!=0 ){ + if( !ExprHasProperty(pTerm->pExpr, EP_FromJoin) + || pTerm->pExpr->w.iRightJoinTable!=pItem->iCursor + ){ + break; + } + } + } + if( pTerm drop loop %c not used\n", pLoop->cId)); + notReady &= ~pLoop->maskSelf; + for(pTerm=pWInfo->sWC.a; pTermprereqAll & pLoop->maskSelf)!=0 ){ + pTerm->wtFlags |= TERM_CODED; + } + } + if( i!=pWInfo->nLevel-1 ){ + int nByte = (pWInfo->nLevel-1-i) * sizeof(WhereLevel); + memmove(&pWInfo->a[i], &pWInfo->a[i+1], nByte); + } + pWInfo->nLevel--; + assert( pWInfo->nLevel>0 ); + } + return notReady; +} + +/* +** Check to see if there are any SEARCH loops that might benefit from +** using a Bloom filter. Consider a Bloom filter if: +** +** (1) The SEARCH happens more than N times where N is the number +** of rows in the table that is being considered for the Bloom +** filter. +** (2) Some searches are expected to find zero rows. (This is determined +** by the WHERE_SELFCULL flag on the term.) +** (3) Bloom-filter processing is not disabled. (Checked by the +** caller.) +** (4) The size of the table being searched is known by ANALYZE. +** +** This block of code merely checks to see if a Bloom filter would be +** appropriate, and if so sets the WHERE_BLOOMFILTER flag on the +** WhereLoop. The implementation of the Bloom filter comes further +** down where the code for each WhereLoop is generated. +*/ +static SQLITE_NOINLINE void whereCheckIfBloomFilterIsUseful( + const WhereInfo *pWInfo +){ + int i; + LogEst nSearch; + + assert( pWInfo->nLevel>=2 ); + assert( OptimizationEnabled(pWInfo->pParse->db, SQLITE_BloomFilter) ); + nSearch = pWInfo->a[0].pWLoop->nOut; + for(i=1; inLevel; i++){ + WhereLoop *pLoop = pWInfo->a[i].pWLoop; + const unsigned int reqFlags = (WHERE_SELFCULL|WHERE_COLUMN_EQ); + if( (pLoop->wsFlags & reqFlags)==reqFlags + /* vvvvvv--- Always the case if WHERE_COLUMN_EQ is defined */ + && ALWAYS((pLoop->wsFlags & (WHERE_IPK|WHERE_INDEXED))!=0) + ){ + SrcItem *pItem = &pWInfo->pTabList->a[pLoop->iTab]; + Table *pTab = pItem->pTab; + pTab->tabFlags |= TF_StatsUsed; + if( nSearch > pTab->nRowLogEst + && (pTab->tabFlags & TF_HasStat1)!=0 + ){ + testcase( pItem->fg.jointype & JT_LEFT ); + pLoop->wsFlags |= WHERE_BLOOMFILTER; + pLoop->wsFlags &= ~WHERE_IDX_ONLY; + WHERETRACE(0xffff, ( + "-> use Bloom-filter on loop %c because there are ~%.1e " + "lookups into %s which has only ~%.1e rows\n", + pLoop->cId, (double)sqlite3LogEstToInt(nSearch), pTab->zName, + (double)sqlite3LogEstToInt(pTab->nRowLogEst))); + } + } + nSearch += pLoop->nOut; + } +} + /* ** Generate the beginning of the loop used for WHERE clause processing. ** The return value is a pointer to an opaque structure that contains @@ -155469,6 +157349,7 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( Expr *pWhere, /* The WHERE clause */ ExprList *pOrderBy, /* An ORDER BY (or GROUP BY) clause, or NULL */ ExprList *pResultSet, /* Query result set. Req'd for DISTINCT */ + Select *pLimit, /* Use this LIMIT/OFFSET clause, if any */ u16 wctrlFlags, /* The WHERE_* flags defined in sqliteInt.h */ int iAuxArg /* If WHERE_OR_SUBCLAUSE is set, index cursor number ** If WHERE_USE_LIMIT, then the limit amount */ @@ -155503,13 +157384,6 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( /* An ORDER/GROUP BY clause of more than 63 terms cannot be optimized */ testcase( pOrderBy && pOrderBy->nExpr==BMS-1 ); if( pOrderBy && pOrderBy->nExpr>=BMS ) pOrderBy = 0; - sWLB.pOrderBy = pOrderBy; - - /* Disable the DISTINCT optimization if SQLITE_DistinctOpt is set via - ** sqlite3_test_ctrl(SQLITE_TESTCTRL_OPTIMIZATIONS,...) */ - if( OptimizationDisabled(db, SQLITE_DistinctOpt) ){ - wctrlFlags &= ~WHERE_WANT_DISTINCT; - } /* The number of tables in the FROM clause is limited by the number of ** bits in a Bitmask @@ -155552,11 +157426,18 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( pWInfo->wctrlFlags = wctrlFlags; pWInfo->iLimit = iAuxArg; pWInfo->savedNQueryLoop = pParse->nQueryLoop; +#ifndef SQLITE_OMIT_VIRTUALTABLE + pWInfo->pLimit = pLimit; +#endif memset(&pWInfo->nOBSat, 0, offsetof(WhereInfo,sWC) - offsetof(WhereInfo,nOBSat)); memset(&pWInfo->a[0], 0, sizeof(WhereLoop)+nTabList*sizeof(WhereLevel)); assert( pWInfo->eOnePass==ONEPASS_OFF ); /* ONEPASS defaults to OFF */ pMaskSet = &pWInfo->sMaskSet; + pMaskSet->n = 0; + pMaskSet->ix[0] = -99; /* Initialize ix[0] to a value that can never be + ** a valid cursor number, to avoid an initial + ** test for pMaskSet->n==0 in sqlite3WhereGetMask() */ sWLB.pWInfo = pWInfo; sWLB.pWC = &pWInfo->sWC; sWLB.pNew = (WhereLoop*)(((char*)pWInfo)+nByteWInfo); @@ -155569,7 +157450,6 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( /* Split the WHERE clause into separate subexpressions where each ** subexpression is separated by an AND operator. */ - initMaskSet(pMaskSet); sqlite3WhereClauseInit(&pWInfo->sWC, pWInfo); sqlite3WhereSplit(&pWInfo->sWC, pWhere, TK_AND); @@ -155577,7 +157457,9 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( */ if( nTabList==0 ){ if( pOrderBy ) pWInfo->nOBSat = pOrderBy->nExpr; - if( wctrlFlags & WHERE_WANT_DISTINCT ){ + if( (wctrlFlags & WHERE_WANT_DISTINCT)!=0 + && OptimizationEnabled(db, SQLITE_DistinctOpt) + ){ pWInfo->eDistinct = WHERE_DISTINCT_UNIQUE; } ExplainQueryPlan((pParse, 0, "SCAN CONSTANT ROW")); @@ -155615,6 +157497,7 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( /* Analyze all of the subexpressions. */ sqlite3WhereExprAnalyze(pTabList, &pWInfo->sWC); + sqlite3WhereAddLimit(&pWInfo->sWC, pLimit); if( db->mallocFailed ) goto whereBeginError; /* Special case: WHERE terms that do not refer to any tables in the join @@ -155628,7 +157511,7 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( ** FROM ... WHERE random()>0; -- eval random() once per row ** FROM ... WHERE (SELECT random())>0; -- eval random() once overall */ - for(ii=0; iinTerm; ii++){ + for(ii=0; iinBase; ii++){ WhereTerm *pT = &sWLB.pWC->a[ii]; if( pT->wtFlags & TERM_VIRTUAL ) continue; if( pT->prereqAll==0 && (nTabList==0 || exprIsDeterministic(pT->pExpr)) ){ @@ -155638,7 +157521,12 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( } if( wctrlFlags & WHERE_WANT_DISTINCT ){ - if( isDistinctRedundant(pParse, pTabList, &pWInfo->sWC, pResultSet) ){ + if( OptimizationDisabled(db, SQLITE_DistinctOpt) ){ + /* Disable the DISTINCT optimization if SQLITE_DistinctOpt is set via + ** sqlite3_test_ctrl(SQLITE_TESTCTRL_OPTIMIZATIONS,...) */ + wctrlFlags &= ~WHERE_WANT_DISTINCT; + pWInfo->wctrlFlags &= ~WHERE_WANT_DISTINCT; + }else if( isDistinctRedundant(pParse, pTabList, &pWInfo->sWC, pResultSet) ){ /* The DISTINCT marking is pointless. Ignore it. */ pWInfo->eDistinct = WHERE_DISTINCT_UNIQUE; }else if( pOrderBy==0 ){ @@ -155709,9 +157597,10 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( if( pWInfo->pOrderBy==0 && (db->flags & SQLITE_ReverseOrder)!=0 ){ pWInfo->revMask = ALLBITS; } - if( pParse->nErr || db->mallocFailed ){ + if( pParse->nErr ){ goto whereBeginError; } + assert( db->mallocFailed==0 ); #ifdef WHERETRACE_ENABLED if( sqlite3WhereTrace ){ sqlite3DebugPrintf("---- Solution nRow=%d", pWInfo->nRowOut); @@ -155739,34 +157628,15 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( } #endif - /* Attempt to omit tables from the join that do not affect the result. - ** For a table to not affect the result, the following must be true: - ** - ** 1) The query must not be an aggregate. - ** 2) The table must be the RHS of a LEFT JOIN. - ** 3) Either the query must be DISTINCT, or else the ON or USING clause - ** must contain a constraint that limits the scan of the table to - ** at most a single row. - ** 4) The table must not be referenced by any part of the query apart - ** from its own USING or ON clause. - ** - ** For example, given: + /* Attempt to omit tables from a join that do not affect the result. + ** See the comment on whereOmitNoopJoin() for further information. ** - ** CREATE TABLE t1(ipk INTEGER PRIMARY KEY, v1); - ** CREATE TABLE t2(ipk INTEGER PRIMARY KEY, v2); - ** CREATE TABLE t3(ipk INTEGER PRIMARY KEY, v3); - ** - ** then table t2 can be omitted from the following: - ** - ** SELECT v1, v3 FROM t1 - ** LEFT JOIN t2 ON (t1.ipk=t2.ipk) - ** LEFT JOIN t3 ON (t1.ipk=t3.ipk) - ** - ** or from: - ** - ** SELECT DISTINCT v1, v3 FROM t1 - ** LEFT JOIN t2 - ** LEFT JOIN t3 ON (t1.ipk=t3.ipk) + ** This query optimization is factored out into a separate "no-inline" + ** procedure to keep the sqlite3WhereBegin() procedure from becoming + ** too large. If sqlite3WhereBegin() becomes too large, that prevents + ** some C-compiler optimizers from in-lining the + ** sqlite3WhereCodeOneLoopStart() procedure, and it is important to + ** in-line sqlite3WhereCodeOneLoopStart() for performance reasons. */ notReady = ~(Bitmask)0; if( pWInfo->nLevel>=2 @@ -155774,49 +157644,20 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( && 0==(wctrlFlags & WHERE_AGG_DISTINCT) /* condition (1) above */ && OptimizationEnabled(db, SQLITE_OmitNoopJoin) ){ - int i; - Bitmask tabUsed = sqlite3WhereExprListUsage(pMaskSet, pResultSet); - if( sWLB.pOrderBy ){ - tabUsed |= sqlite3WhereExprListUsage(pMaskSet, sWLB.pOrderBy); - } - for(i=pWInfo->nLevel-1; i>=1; i--){ - WhereTerm *pTerm, *pEnd; - SrcItem *pItem; - pLoop = pWInfo->a[i].pWLoop; - pItem = &pWInfo->pTabList->a[pLoop->iTab]; - if( (pItem->fg.jointype & JT_LEFT)==0 ) continue; - if( (wctrlFlags & WHERE_WANT_DISTINCT)==0 - && (pLoop->wsFlags & WHERE_ONEROW)==0 - ){ - continue; - } - if( (tabUsed & pLoop->maskSelf)!=0 ) continue; - pEnd = sWLB.pWC->a + sWLB.pWC->nTerm; - for(pTerm=sWLB.pWC->a; pTermprereqAll & pLoop->maskSelf)!=0 ){ - if( !ExprHasProperty(pTerm->pExpr, EP_FromJoin) - || pTerm->pExpr->iRightJoinTable!=pItem->iCursor - ){ - break; - } - } - } - if( pTerm drop loop %c not used\n", pLoop->cId)); - notReady &= ~pLoop->maskSelf; - for(pTerm=sWLB.pWC->a; pTermprereqAll & pLoop->maskSelf)!=0 ){ - pTerm->wtFlags |= TERM_CODED; - } - } - if( i!=pWInfo->nLevel-1 ){ - int nByte = (pWInfo->nLevel-1-i) * sizeof(WhereLevel); - memmove(&pWInfo->a[i], &pWInfo->a[i+1], nByte); - } - pWInfo->nLevel--; - nTabList--; - } + notReady = whereOmitNoopJoin(pWInfo, notReady); + nTabList = pWInfo->nLevel; + assert( nTabList>0 ); + } + + /* Check to see if there are any SEARCH loops that might benefit from + ** using a Bloom filter. + */ + if( pWInfo->nLevel>=2 + && OptimizationEnabled(db, SQLITE_BloomFilter) + ){ + whereCheckIfBloomFilterIsUseful(pWInfo); } + #if defined(WHERETRACE_ENABLED) if( sqlite3WhereTrace & 0x100 ){ /* Display all terms of the WHERE clause */ sqlite3DebugPrintf("---- WHERE clause at end of analysis:\n"); @@ -155903,6 +157744,7 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( if( pWInfo->eOnePass==ONEPASS_OFF && pTab->nColtabFlags & (TF_HasGenerated|TF_WithoutRowid))==0 + && (pLoop->wsFlags & (WHERE_AUTO_INDEX|WHERE_BLOOMFILTER))==0 ){ /* If we know that only a prefix of the record will be used, ** it is advantageous to reduce the "column count" field in @@ -156005,13 +157847,17 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( if( pParse->nErr ) goto whereBeginError; pLevel = &pWInfo->a[ii]; wsFlags = pLevel->pWLoop->wsFlags; + if( (wsFlags & (WHERE_AUTO_INDEX|WHERE_BLOOMFILTER))!=0 ){ + if( (wsFlags & WHERE_AUTO_INDEX)!=0 ){ #ifndef SQLITE_OMIT_AUTOMATIC_INDEX - if( (pLevel->pWLoop->wsFlags & WHERE_AUTO_INDEX)!=0 ){ - constructAutomaticIndex(pParse, &pWInfo->sWC, - &pTabList->a[pLevel->iFrom], notReady, pLevel); + constructAutomaticIndex(pParse, &pWInfo->sWC, + &pTabList->a[pLevel->iFrom], notReady, pLevel); +#endif + }else{ + sqlite3ConstructBloomFilter(pWInfo, ii, pLevel, notReady); + } if( db->mallocFailed ) goto whereBeginError; } -#endif addrExplain = sqlite3WhereExplainOneScan( pParse, pTabList, pLevel, wctrlFlags ); @@ -156059,6 +157905,26 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( } #endif +#ifdef SQLITE_DEBUG +/* +** Return true if cursor iCur is opened by instruction k of the +** bytecode. Used inside of assert() only. +*/ +static int cursorIsOpen(Vdbe *v, int iCur, int k){ + while( k>=0 ){ + VdbeOp *pOp = sqlite3VdbeGetOp(v,k--); + if( pOp->p1!=iCur ) continue; + if( pOp->opcode==OP_Close ) return 0; + if( pOp->opcode==OP_OpenRead ) return 1; + if( pOp->opcode==OP_OpenWrite ) return 1; + if( pOp->opcode==OP_OpenDup ) return 1; + if( pOp->opcode==OP_OpenAutoindex ) return 1; + if( pOp->opcode==OP_OpenEphemeral ) return 1; + } + return 0; +} +#endif /* SQLITE_DEBUG */ + /* ** Generate the end of the WHERE loop. See comments on ** sqlite3WhereBegin() for additional information. @@ -156311,6 +158177,11 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){ ){ int x = pOp->p2; assert( pIdx->pTable==pTab ); +#ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC + if( pOp->opcode==OP_Offset ){ + /* Do not need to translate the column number */ + }else +#endif if( !HasRowid(pTab) ){ Index *pPk = sqlite3PrimaryKeyIndex(pTab); x = pPk->aiColumn[x]; @@ -156324,9 +158195,22 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){ pOp->p2 = x; pOp->p1 = pLevel->iIdxCur; OpcodeRewriteTrace(db, k, pOp); + }else{ + /* Unable to translate the table reference into an index + ** reference. Verify that this is harmless - that the + ** table being referenced really is open. + */ +#ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC + assert( (pLoop->wsFlags & WHERE_IDX_ONLY)==0 + || cursorIsOpen(v,pOp->p1,k) + || pOp->opcode==OP_Offset + ); +#else + assert( (pLoop->wsFlags & WHERE_IDX_ONLY)==0 + || cursorIsOpen(v,pOp->p1,k) + ); +#endif } - assert( (pLoop->wsFlags & WHERE_IDX_ONLY)==0 || x>=0 - || pWInfo->eOnePass ); }else if( pOp->opcode==OP_Rowid ){ pOp->p1 = pLevel->iIdxCur; pOp->opcode = OP_IdxRowid; @@ -157314,7 +159198,11 @@ static int disallowAggregatesInOrderByCb(Walker *pWalker, Expr *pExpr){ */ SQLITE_PRIVATE int sqlite3WindowRewrite(Parse *pParse, Select *p){ int rc = SQLITE_OK; - if( p->pWin && p->pPrior==0 && ALWAYS((p->selFlags & SF_WinRewrite)==0) ){ + if( p->pWin + && p->pPrior==0 + && ALWAYS((p->selFlags & SF_WinRewrite)==0) + && ALWAYS(!IN_RENAME_OBJECT) + ){ Vdbe *v = sqlite3GetVdbe(pParse); sqlite3 *db = pParse->db; Select *pSub = 0; /* The subquery */ @@ -157389,6 +159277,7 @@ SQLITE_PRIVATE int sqlite3WindowRewrite(Parse *pParse, Select *p){ for(pWin=pMWin; pWin; pWin=pWin->pNextWin){ ExprList *pArgs; assert( ExprUseXList(pWin->pOwner) ); + assert( pWin->pFunc!=0 ); pArgs = pWin->pOwner->x.pList; if( pWin->pFunc->funcFlags & SQLITE_FUNC_SUBTYPE ){ selectWindowRewriteEList(pParse, pMWin, pSrc, pArgs, pTab, &pSublist); @@ -157463,12 +159352,7 @@ SQLITE_PRIVATE int sqlite3WindowRewrite(Parse *pParse, Select *p){ sqlite3ParserAddCleanup(pParse, sqlite3DbFree, pTab); } - if( rc ){ - if( pParse->nErr==0 ){ - assert( pParse->db->mallocFailed ); - sqlite3ErrorToParser(pParse->db, SQLITE_NOMEM); - } - } + assert( rc==SQLITE_OK || pParse->nErr!=0 ); return rc; } @@ -159616,10 +161500,7 @@ static void updateDeleteLimitError( } - /* Construct a new Expr object from a single identifier. Use the - ** new Expr to populate pOut. Set the span of pOut to be the identifier - ** that created the expression. - */ + /* Construct a new Expr object from a single token */ static Expr *tokenExpr(Parse *pParse, int op, Token t){ Expr *p = sqlite3DbMallocRawNN(pParse->db, sizeof(Expr)+t.n+1); if( p ){ @@ -159639,6 +161520,7 @@ static void updateDeleteLimitError( p->u.zToken = (char*)&p[1]; memcpy(p->u.zToken, t.z, t.n); p->u.zToken[t.n] = 0; + p->w.iOfst = (int)(t.z - pParse->zTail); if( sqlite3Isquote(p->u.zToken[0]) ){ sqlite3DequoteExpr(p); } @@ -159805,78 +161687,79 @@ static void updateDeleteLimitError( #define TK_SLASH 109 #define TK_REM 110 #define TK_CONCAT 111 -#define TK_COLLATE 112 -#define TK_BITNOT 113 -#define TK_ON 114 -#define TK_INDEXED 115 -#define TK_STRING 116 -#define TK_JOIN_KW 117 -#define TK_CONSTRAINT 118 -#define TK_DEFAULT 119 -#define TK_NULL 120 -#define TK_PRIMARY 121 -#define TK_UNIQUE 122 -#define TK_CHECK 123 -#define TK_REFERENCES 124 -#define TK_AUTOINCR 125 -#define TK_INSERT 126 -#define TK_DELETE 127 -#define TK_UPDATE 128 -#define TK_SET 129 -#define TK_DEFERRABLE 130 -#define TK_FOREIGN 131 -#define TK_DROP 132 -#define TK_UNION 133 -#define TK_ALL 134 -#define TK_EXCEPT 135 -#define TK_INTERSECT 136 -#define TK_SELECT 137 -#define TK_VALUES 138 -#define TK_DISTINCT 139 -#define TK_DOT 140 -#define TK_FROM 141 -#define TK_JOIN 142 -#define TK_USING 143 -#define TK_ORDER 144 -#define TK_GROUP 145 -#define TK_HAVING 146 -#define TK_LIMIT 147 -#define TK_WHERE 148 -#define TK_RETURNING 149 -#define TK_INTO 150 -#define TK_NOTHING 151 -#define TK_FLOAT 152 -#define TK_BLOB 153 -#define TK_INTEGER 154 -#define TK_VARIABLE 155 -#define TK_CASE 156 -#define TK_WHEN 157 -#define TK_THEN 158 -#define TK_ELSE 159 -#define TK_INDEX 160 -#define TK_ALTER 161 -#define TK_ADD 162 -#define TK_WINDOW 163 -#define TK_OVER 164 -#define TK_FILTER 165 -#define TK_COLUMN 166 -#define TK_AGG_FUNCTION 167 -#define TK_AGG_COLUMN 168 -#define TK_TRUEFALSE 169 -#define TK_ISNOT 170 -#define TK_FUNCTION 171 -#define TK_UMINUS 172 -#define TK_UPLUS 173 -#define TK_TRUTH 174 -#define TK_REGISTER 175 -#define TK_VECTOR 176 -#define TK_SELECT_COLUMN 177 -#define TK_IF_NULL_ROW 178 -#define TK_ASTERISK 179 -#define TK_SPAN 180 -#define TK_ERROR 181 -#define TK_SPACE 182 -#define TK_ILLEGAL 183 +#define TK_PTR 112 +#define TK_COLLATE 113 +#define TK_BITNOT 114 +#define TK_ON 115 +#define TK_INDEXED 116 +#define TK_STRING 117 +#define TK_JOIN_KW 118 +#define TK_CONSTRAINT 119 +#define TK_DEFAULT 120 +#define TK_NULL 121 +#define TK_PRIMARY 122 +#define TK_UNIQUE 123 +#define TK_CHECK 124 +#define TK_REFERENCES 125 +#define TK_AUTOINCR 126 +#define TK_INSERT 127 +#define TK_DELETE 128 +#define TK_UPDATE 129 +#define TK_SET 130 +#define TK_DEFERRABLE 131 +#define TK_FOREIGN 132 +#define TK_DROP 133 +#define TK_UNION 134 +#define TK_ALL 135 +#define TK_EXCEPT 136 +#define TK_INTERSECT 137 +#define TK_SELECT 138 +#define TK_VALUES 139 +#define TK_DISTINCT 140 +#define TK_DOT 141 +#define TK_FROM 142 +#define TK_JOIN 143 +#define TK_USING 144 +#define TK_ORDER 145 +#define TK_GROUP 146 +#define TK_HAVING 147 +#define TK_LIMIT 148 +#define TK_WHERE 149 +#define TK_RETURNING 150 +#define TK_INTO 151 +#define TK_NOTHING 152 +#define TK_FLOAT 153 +#define TK_BLOB 154 +#define TK_INTEGER 155 +#define TK_VARIABLE 156 +#define TK_CASE 157 +#define TK_WHEN 158 +#define TK_THEN 159 +#define TK_ELSE 160 +#define TK_INDEX 161 +#define TK_ALTER 162 +#define TK_ADD 163 +#define TK_WINDOW 164 +#define TK_OVER 165 +#define TK_FILTER 166 +#define TK_COLUMN 167 +#define TK_AGG_FUNCTION 168 +#define TK_AGG_COLUMN 169 +#define TK_TRUEFALSE 170 +#define TK_ISNOT 171 +#define TK_FUNCTION 172 +#define TK_UMINUS 173 +#define TK_UPLUS 174 +#define TK_TRUTH 175 +#define TK_REGISTER 176 +#define TK_VECTOR 177 +#define TK_SELECT_COLUMN 178 +#define TK_IF_NULL_ROW 179 +#define TK_ASTERISK 180 +#define TK_SPAN 181 +#define TK_ERROR 182 +#define TK_SPACE 183 +#define TK_ILLEGAL 184 #endif /**************** End token definitions ***************************************/ @@ -159936,30 +161819,30 @@ static void updateDeleteLimitError( #endif /************* Begin control #defines *****************************************/ #define YYCODETYPE unsigned short int -#define YYNOCODE 318 +#define YYNOCODE 319 #define YYACTIONTYPE unsigned short int #define YYWILDCARD 101 #define sqlite3ParserTOKENTYPE Token typedef union { int yyinit; sqlite3ParserTOKENTYPE yy0; - With* yy43; - u32 yy51; - int yy64; - struct FrameBound yy81; - struct {int value; int mask;} yy83; - TriggerStep* yy95; - Upsert* yy138; - IdList* yy240; - Cte* yy255; - Select* yy303; - Window* yy375; - u8 yy534; - ExprList* yy562; - struct TrigEvent yy570; - const char* yy600; - SrcList* yy607; - Expr* yy626; + TriggerStep* yy33; + Window* yy41; + Select* yy47; + SrcList* yy131; + struct TrigEvent yy180; + struct {int value; int mask;} yy231; + IdList* yy254; + u32 yy285; + ExprList* yy322; + Cte* yy385; + int yy394; + Upsert* yy444; + u8 yy516; + With* yy521; + const char* yy522; + Expr* yy528; + struct FrameBound yy595; } YYMINORTYPE; #ifndef YYSTACKDEPTH #define YYSTACKDEPTH 100 @@ -159975,18 +161858,18 @@ typedef union { #define sqlite3ParserCTX_FETCH Parse *pParse=yypParser->pParse; #define sqlite3ParserCTX_STORE yypParser->pParse=pParse; #define YYFALLBACK 1 -#define YYNSTATE 572 -#define YYNRULE 401 -#define YYNRULE_WITH_ACTION 339 -#define YYNTOKEN 184 -#define YY_MAX_SHIFT 571 -#define YY_MIN_SHIFTREDUCE 829 -#define YY_MAX_SHIFTREDUCE 1229 -#define YY_ERROR_ACTION 1230 -#define YY_ACCEPT_ACTION 1231 -#define YY_NO_ACTION 1232 -#define YY_MIN_REDUCE 1233 -#define YY_MAX_REDUCE 1633 +#define YYNSTATE 574 +#define YYNRULE 402 +#define YYNRULE_WITH_ACTION 340 +#define YYNTOKEN 185 +#define YY_MAX_SHIFT 573 +#define YY_MIN_SHIFTREDUCE 831 +#define YY_MAX_SHIFTREDUCE 1232 +#define YY_ERROR_ACTION 1233 +#define YY_ACCEPT_ACTION 1234 +#define YY_NO_ACTION 1235 +#define YY_MIN_REDUCE 1236 +#define YY_MAX_REDUCE 1637 /************* End control #defines *******************************************/ #define YY_NLOOKAHEAD ((int)(sizeof(yy_lookahead)/sizeof(yy_lookahead[0]))) @@ -160053,606 +161936,612 @@ typedef union { ** yy_default[] Default action for each state. ** *********** Begin parsing tables **********************************************/ -#define YY_ACTTAB_COUNT (2037) +#define YY_ACTTAB_COUNT (2070) static const YYACTIONTYPE yy_action[] = { - /* 0 */ 564, 115, 112, 220, 169, 199, 115, 112, 220, 564, - /* 10 */ 375, 1266, 564, 376, 564, 270, 1309, 1309, 406, 407, - /* 20 */ 1084, 199, 1513, 41, 41, 515, 489, 521, 558, 558, - /* 30 */ 558, 965, 41, 41, 395, 41, 41, 51, 51, 966, - /* 40 */ 296, 1269, 296, 122, 123, 113, 1207, 1207, 1041, 1044, - /* 50 */ 1034, 1034, 120, 120, 121, 121, 121, 121, 564, 407, - /* 60 */ 275, 275, 275, 275, 1268, 115, 112, 220, 115, 112, - /* 70 */ 220, 1512, 846, 561, 516, 561, 115, 112, 220, 250, - /* 80 */ 217, 71, 71, 122, 123, 113, 1207, 1207, 1041, 1044, - /* 90 */ 1034, 1034, 120, 120, 121, 121, 121, 121, 440, 440, - /* 100 */ 440, 1149, 119, 119, 119, 119, 118, 118, 117, 117, - /* 110 */ 117, 116, 442, 1183, 1149, 116, 442, 1149, 546, 513, - /* 120 */ 1548, 1554, 374, 442, 6, 1183, 1154, 522, 1154, 407, - /* 130 */ 1556, 461, 373, 1554, 535, 99, 463, 332, 121, 121, - /* 140 */ 121, 121, 119, 119, 119, 119, 118, 118, 117, 117, - /* 150 */ 117, 116, 442, 122, 123, 113, 1207, 1207, 1041, 1044, - /* 160 */ 1034, 1034, 120, 120, 121, 121, 121, 121, 1257, 1183, - /* 170 */ 1184, 1185, 243, 1064, 564, 502, 499, 498, 567, 124, - /* 180 */ 567, 1183, 1184, 1185, 474, 497, 119, 119, 119, 119, - /* 190 */ 118, 118, 117, 117, 117, 116, 442, 70, 70, 407, - /* 200 */ 121, 121, 121, 121, 114, 117, 117, 117, 116, 442, - /* 210 */ 1409, 1469, 119, 119, 119, 119, 118, 118, 117, 117, - /* 220 */ 117, 116, 442, 122, 123, 113, 1207, 1207, 1041, 1044, - /* 230 */ 1034, 1034, 120, 120, 121, 121, 121, 121, 407, 1031, - /* 240 */ 1031, 1042, 1045, 81, 382, 541, 378, 80, 119, 119, - /* 250 */ 119, 119, 118, 118, 117, 117, 117, 116, 442, 381, - /* 260 */ 463, 332, 122, 123, 113, 1207, 1207, 1041, 1044, 1034, - /* 270 */ 1034, 120, 120, 121, 121, 121, 121, 262, 215, 512, - /* 280 */ 1424, 422, 119, 119, 119, 119, 118, 118, 117, 117, - /* 290 */ 117, 116, 442, 1231, 1, 1, 571, 2, 1235, 1573, - /* 300 */ 571, 2, 1235, 307, 1149, 141, 1600, 307, 407, 141, - /* 310 */ 1183, 361, 1317, 1035, 866, 531, 1317, 1149, 359, 1567, - /* 320 */ 1149, 119, 119, 119, 119, 118, 118, 117, 117, 117, - /* 330 */ 116, 442, 122, 123, 113, 1207, 1207, 1041, 1044, 1034, - /* 340 */ 1034, 120, 120, 121, 121, 121, 121, 275, 275, 1001, - /* 350 */ 426, 275, 275, 1128, 1627, 1021, 1627, 137, 542, 1541, - /* 360 */ 561, 272, 950, 950, 561, 1423, 1183, 1184, 1185, 1594, - /* 370 */ 866, 1012, 530, 315, 231, 1011, 468, 1276, 231, 119, - /* 380 */ 119, 119, 119, 118, 118, 117, 117, 117, 116, 442, - /* 390 */ 1570, 119, 119, 119, 119, 118, 118, 117, 117, 117, - /* 400 */ 116, 442, 330, 359, 1567, 564, 446, 1011, 1011, 1013, - /* 410 */ 446, 207, 564, 306, 555, 407, 363, 1021, 363, 346, - /* 420 */ 184, 118, 118, 117, 117, 117, 116, 442, 71, 71, - /* 430 */ 439, 438, 1126, 1012, 472, 71, 71, 1011, 205, 122, - /* 440 */ 123, 113, 1207, 1207, 1041, 1044, 1034, 1034, 120, 120, - /* 450 */ 121, 121, 121, 121, 219, 219, 472, 1183, 407, 570, - /* 460 */ 1183, 1235, 503, 1477, 149, 546, 307, 489, 141, 1011, - /* 470 */ 1011, 1013, 546, 140, 545, 1317, 1214, 191, 1214, 950, - /* 480 */ 950, 514, 122, 123, 113, 1207, 1207, 1041, 1044, 1034, - /* 490 */ 1034, 120, 120, 121, 121, 121, 121, 563, 119, 119, - /* 500 */ 119, 119, 118, 118, 117, 117, 117, 116, 442, 283, - /* 510 */ 275, 275, 415, 1183, 1184, 1185, 1183, 1184, 1185, 372, - /* 520 */ 1183, 243, 344, 561, 502, 499, 498, 1539, 407, 1540, - /* 530 */ 1183, 288, 870, 143, 497, 1549, 185, 231, 9, 6, - /* 540 */ 253, 119, 119, 119, 119, 118, 118, 117, 117, 117, - /* 550 */ 116, 442, 122, 123, 113, 1207, 1207, 1041, 1044, 1034, - /* 560 */ 1034, 120, 120, 121, 121, 121, 121, 407, 137, 446, - /* 570 */ 447, 863, 169, 1183, 397, 1204, 1183, 1184, 1185, 931, - /* 580 */ 526, 1001, 98, 339, 564, 342, 1183, 1184, 1185, 306, - /* 590 */ 555, 122, 123, 113, 1207, 1207, 1041, 1044, 1034, 1034, - /* 600 */ 120, 120, 121, 121, 121, 121, 452, 71, 71, 275, - /* 610 */ 275, 119, 119, 119, 119, 118, 118, 117, 117, 117, - /* 620 */ 116, 442, 561, 417, 306, 555, 1183, 1307, 1307, 1183, - /* 630 */ 1184, 1185, 1204, 1149, 330, 458, 318, 407, 363, 470, - /* 640 */ 431, 1167, 32, 541, 527, 350, 1149, 1629, 393, 1149, - /* 650 */ 119, 119, 119, 119, 118, 118, 117, 117, 117, 116, - /* 660 */ 442, 122, 123, 113, 1207, 1207, 1041, 1044, 1034, 1034, - /* 670 */ 120, 120, 121, 121, 121, 121, 407, 199, 472, 1183, - /* 680 */ 1022, 472, 1183, 1184, 1185, 386, 151, 539, 1548, 277, - /* 690 */ 400, 137, 6, 317, 5, 564, 562, 3, 920, 920, - /* 700 */ 122, 123, 113, 1207, 1207, 1041, 1044, 1034, 1034, 120, - /* 710 */ 120, 121, 121, 121, 121, 411, 505, 83, 71, 71, - /* 720 */ 119, 119, 119, 119, 118, 118, 117, 117, 117, 116, - /* 730 */ 442, 1183, 218, 428, 1183, 1183, 1184, 1185, 363, 261, - /* 740 */ 278, 358, 508, 353, 507, 248, 407, 306, 555, 1539, - /* 750 */ 1006, 349, 363, 291, 489, 302, 293, 1542, 281, 119, - /* 760 */ 119, 119, 119, 118, 118, 117, 117, 117, 116, 442, - /* 770 */ 122, 123, 113, 1207, 1207, 1041, 1044, 1034, 1034, 120, - /* 780 */ 120, 121, 121, 121, 121, 407, 148, 1183, 1184, 1185, - /* 790 */ 1183, 1184, 1185, 275, 275, 1304, 1257, 1283, 483, 1476, - /* 800 */ 150, 489, 480, 564, 1187, 1304, 561, 1587, 1255, 122, - /* 810 */ 123, 113, 1207, 1207, 1041, 1044, 1034, 1034, 120, 120, - /* 820 */ 121, 121, 121, 121, 564, 886, 13, 13, 520, 119, - /* 830 */ 119, 119, 119, 118, 118, 117, 117, 117, 116, 442, - /* 840 */ 1183, 420, 417, 564, 269, 269, 1316, 13, 13, 1539, - /* 850 */ 1546, 16, 16, 322, 6, 407, 506, 561, 1089, 1089, - /* 860 */ 486, 1187, 425, 1539, 887, 292, 71, 71, 119, 119, - /* 870 */ 119, 119, 118, 118, 117, 117, 117, 116, 442, 122, - /* 880 */ 123, 113, 1207, 1207, 1041, 1044, 1034, 1034, 120, 120, - /* 890 */ 121, 121, 121, 121, 564, 12, 1183, 1184, 1185, 407, - /* 900 */ 275, 275, 451, 303, 834, 835, 836, 417, 489, 276, - /* 910 */ 276, 1547, 284, 561, 319, 6, 321, 71, 71, 429, - /* 920 */ 451, 450, 561, 952, 101, 113, 1207, 1207, 1041, 1044, - /* 930 */ 1034, 1034, 120, 120, 121, 121, 121, 121, 119, 119, - /* 940 */ 119, 119, 118, 118, 117, 117, 117, 116, 442, 1105, - /* 950 */ 1183, 489, 564, 1312, 437, 455, 478, 564, 246, 245, - /* 960 */ 244, 1409, 1545, 547, 1106, 405, 6, 1544, 196, 1258, - /* 970 */ 413, 6, 105, 462, 103, 71, 71, 286, 564, 1107, - /* 980 */ 13, 13, 119, 119, 119, 119, 118, 118, 117, 117, - /* 990 */ 117, 116, 442, 451, 104, 427, 337, 320, 275, 275, - /* 1000 */ 906, 13, 13, 564, 1482, 1105, 1183, 1184, 1185, 126, - /* 1010 */ 907, 561, 546, 564, 407, 478, 295, 1321, 253, 200, - /* 1020 */ 1106, 548, 1482, 1484, 280, 1409, 55, 55, 1287, 561, - /* 1030 */ 478, 380, 423, 951, 407, 1107, 71, 71, 122, 123, - /* 1040 */ 113, 1207, 1207, 1041, 1044, 1034, 1034, 120, 120, 121, - /* 1050 */ 121, 121, 121, 1204, 407, 287, 552, 309, 122, 123, - /* 1060 */ 113, 1207, 1207, 1041, 1044, 1034, 1034, 120, 120, 121, - /* 1070 */ 121, 121, 121, 441, 1128, 1628, 146, 1628, 122, 111, - /* 1080 */ 113, 1207, 1207, 1041, 1044, 1034, 1034, 120, 120, 121, - /* 1090 */ 121, 121, 121, 404, 403, 1482, 424, 119, 119, 119, - /* 1100 */ 119, 118, 118, 117, 117, 117, 116, 442, 1183, 564, - /* 1110 */ 1204, 544, 1086, 858, 329, 361, 1086, 119, 119, 119, - /* 1120 */ 119, 118, 118, 117, 117, 117, 116, 442, 564, 294, - /* 1130 */ 144, 523, 56, 56, 224, 564, 510, 119, 119, 119, - /* 1140 */ 119, 118, 118, 117, 117, 117, 116, 442, 484, 1409, - /* 1150 */ 537, 15, 15, 1126, 434, 439, 438, 407, 13, 13, - /* 1160 */ 1523, 12, 926, 1211, 1183, 1184, 1185, 925, 1213, 536, - /* 1170 */ 858, 557, 413, 193, 1525, 494, 1212, 448, 1160, 1222, - /* 1180 */ 1183, 564, 123, 113, 1207, 1207, 1041, 1044, 1034, 1034, - /* 1190 */ 120, 120, 121, 121, 121, 121, 1521, 1149, 564, 965, - /* 1200 */ 564, 1214, 247, 1214, 13, 13, 1409, 966, 538, 564, - /* 1210 */ 1149, 108, 556, 1149, 4, 310, 392, 1227, 17, 194, - /* 1220 */ 485, 43, 43, 57, 57, 306, 555, 524, 559, 1160, - /* 1230 */ 464, 564, 44, 44, 392, 1127, 1183, 1184, 1185, 479, - /* 1240 */ 119, 119, 119, 119, 118, 118, 117, 117, 117, 116, - /* 1250 */ 442, 443, 564, 327, 13, 13, 564, 418, 1315, 414, - /* 1260 */ 171, 564, 311, 553, 213, 529, 1253, 564, 517, 543, - /* 1270 */ 412, 108, 556, 137, 4, 58, 58, 435, 314, 59, - /* 1280 */ 59, 274, 217, 549, 60, 60, 349, 476, 559, 1353, - /* 1290 */ 61, 61, 1021, 275, 275, 1228, 213, 564, 106, 106, - /* 1300 */ 8, 275, 275, 275, 275, 107, 561, 443, 566, 565, - /* 1310 */ 564, 443, 1011, 1228, 561, 564, 561, 564, 275, 275, - /* 1320 */ 62, 62, 1352, 553, 247, 456, 564, 98, 110, 306, - /* 1330 */ 555, 561, 564, 45, 45, 405, 1203, 533, 46, 46, - /* 1340 */ 47, 47, 532, 465, 1011, 1011, 1013, 1014, 27, 49, - /* 1350 */ 49, 564, 1021, 405, 469, 50, 50, 564, 106, 106, - /* 1360 */ 305, 564, 84, 204, 405, 107, 564, 443, 566, 565, - /* 1370 */ 405, 564, 1011, 564, 63, 63, 564, 1599, 564, 895, - /* 1380 */ 64, 64, 457, 477, 65, 65, 147, 96, 38, 14, - /* 1390 */ 14, 1528, 412, 564, 66, 66, 128, 128, 926, 67, - /* 1400 */ 67, 52, 52, 925, 1011, 1011, 1013, 1014, 27, 1572, - /* 1410 */ 1171, 445, 208, 1123, 279, 394, 68, 68, 228, 390, - /* 1420 */ 390, 389, 264, 387, 1171, 445, 843, 877, 279, 108, - /* 1430 */ 556, 453, 4, 390, 390, 389, 264, 387, 564, 225, - /* 1440 */ 843, 313, 328, 1003, 98, 252, 559, 544, 471, 312, - /* 1450 */ 252, 564, 208, 225, 564, 313, 473, 30, 252, 279, - /* 1460 */ 466, 69, 69, 312, 390, 390, 389, 264, 387, 443, - /* 1470 */ 333, 843, 98, 564, 53, 53, 323, 157, 157, 227, - /* 1480 */ 495, 553, 249, 289, 225, 564, 313, 162, 31, 1501, - /* 1490 */ 135, 564, 1500, 227, 312, 533, 158, 158, 885, 884, - /* 1500 */ 534, 162, 873, 301, 135, 564, 481, 226, 76, 76, - /* 1510 */ 1021, 347, 1071, 98, 54, 54, 106, 106, 1067, 564, - /* 1520 */ 249, 226, 519, 107, 227, 443, 566, 565, 72, 72, - /* 1530 */ 1011, 334, 162, 564, 230, 135, 108, 556, 959, 4, - /* 1540 */ 252, 408, 129, 129, 564, 1349, 306, 555, 564, 923, - /* 1550 */ 564, 110, 226, 559, 564, 408, 73, 73, 564, 873, - /* 1560 */ 306, 555, 1011, 1011, 1013, 1014, 27, 130, 130, 1071, - /* 1570 */ 449, 131, 131, 127, 127, 357, 443, 156, 156, 892, - /* 1580 */ 893, 155, 155, 338, 449, 356, 408, 564, 553, 968, - /* 1590 */ 969, 306, 555, 1015, 341, 564, 108, 556, 564, 4, - /* 1600 */ 1132, 1286, 533, 564, 856, 343, 145, 532, 345, 1300, - /* 1610 */ 136, 136, 1083, 559, 1083, 449, 564, 1021, 134, 134, - /* 1620 */ 1284, 132, 132, 106, 106, 1285, 133, 133, 564, 352, - /* 1630 */ 107, 564, 443, 566, 565, 1340, 443, 1011, 362, 75, - /* 1640 */ 75, 1082, 564, 1082, 564, 924, 1561, 110, 553, 551, - /* 1650 */ 1015, 77, 77, 1361, 74, 74, 1408, 1336, 1347, 550, - /* 1660 */ 1414, 1265, 1256, 1244, 1243, 42, 42, 48, 48, 1011, - /* 1670 */ 1011, 1013, 1014, 27, 1245, 1580, 490, 1021, 267, 202, - /* 1680 */ 1333, 365, 11, 106, 106, 930, 367, 210, 369, 391, - /* 1690 */ 107, 1395, 443, 566, 565, 223, 1390, 1011, 500, 454, - /* 1700 */ 282, 1400, 285, 108, 556, 214, 4, 325, 1383, 1283, - /* 1710 */ 475, 355, 1473, 1583, 1472, 1399, 371, 1222, 326, 398, - /* 1720 */ 559, 290, 331, 197, 100, 556, 209, 4, 198, 1011, - /* 1730 */ 1011, 1013, 1014, 27, 385, 256, 1520, 1518, 554, 1219, - /* 1740 */ 416, 559, 83, 443, 173, 206, 182, 221, 459, 167, - /* 1750 */ 177, 460, 175, 493, 233, 553, 79, 178, 1396, 179, - /* 1760 */ 35, 180, 96, 1402, 443, 396, 36, 467, 1478, 1401, - /* 1770 */ 482, 237, 1404, 399, 82, 186, 553, 1467, 89, 488, - /* 1780 */ 190, 268, 239, 491, 1021, 340, 240, 401, 1246, 1489, - /* 1790 */ 106, 106, 336, 509, 1294, 241, 1303, 107, 430, 443, - /* 1800 */ 566, 565, 1302, 91, 1011, 1021, 1598, 1301, 1273, 215, - /* 1810 */ 1597, 106, 106, 402, 877, 432, 354, 1272, 107, 1271, - /* 1820 */ 443, 566, 565, 1596, 1566, 1011, 1293, 433, 518, 299, - /* 1830 */ 300, 360, 95, 525, 1344, 364, 1011, 1011, 1013, 1014, - /* 1840 */ 27, 254, 255, 1552, 436, 1551, 125, 544, 10, 379, - /* 1850 */ 1326, 1453, 102, 97, 1345, 528, 304, 1011, 1011, 1013, - /* 1860 */ 1014, 27, 366, 377, 1343, 1342, 368, 370, 1325, 384, - /* 1870 */ 201, 383, 34, 1368, 1367, 568, 1177, 266, 263, 265, - /* 1880 */ 1505, 159, 569, 1241, 1236, 1506, 160, 142, 1504, 1503, - /* 1890 */ 297, 211, 830, 161, 212, 78, 444, 203, 308, 222, - /* 1900 */ 1081, 139, 1079, 316, 174, 163, 1203, 229, 176, 909, - /* 1910 */ 324, 232, 1095, 181, 409, 410, 172, 164, 165, 419, - /* 1920 */ 183, 85, 86, 421, 166, 87, 88, 1098, 1094, 234, - /* 1930 */ 235, 152, 18, 236, 335, 1087, 1216, 252, 187, 487, - /* 1940 */ 238, 188, 37, 845, 492, 356, 242, 496, 351, 501, - /* 1950 */ 189, 90, 19, 504, 348, 20, 875, 92, 298, 168, - /* 1960 */ 888, 153, 93, 511, 94, 1165, 154, 1047, 1134, 39, - /* 1970 */ 216, 1133, 271, 273, 958, 192, 953, 110, 1151, 1155, - /* 1980 */ 251, 7, 21, 1159, 1139, 22, 1153, 33, 23, 24, - /* 1990 */ 25, 540, 1158, 195, 98, 1062, 26, 1048, 1046, 1050, - /* 2000 */ 1104, 1051, 1103, 257, 258, 28, 40, 1173, 1016, 857, - /* 2010 */ 109, 29, 560, 388, 138, 1172, 259, 170, 260, 1232, - /* 2020 */ 1232, 919, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, - /* 2030 */ 1232, 1232, 1589, 1232, 1232, 1232, 1588, + /* 0 */ 566, 1307, 566, 1286, 201, 201, 566, 116, 112, 222, + /* 10 */ 566, 1307, 377, 566, 116, 112, 222, 397, 408, 409, + /* 20 */ 1260, 378, 1269, 41, 41, 41, 41, 1412, 1517, 71, + /* 30 */ 71, 967, 1258, 41, 41, 491, 71, 71, 272, 968, + /* 40 */ 298, 476, 298, 123, 124, 114, 1210, 1210, 1044, 1047, + /* 50 */ 1036, 1036, 121, 121, 122, 122, 122, 122, 543, 409, + /* 60 */ 1234, 1, 1, 573, 2, 1238, 548, 116, 112, 222, + /* 70 */ 309, 480, 142, 548, 1272, 524, 116, 112, 222, 1320, + /* 80 */ 417, 523, 547, 123, 124, 114, 1210, 1210, 1044, 1047, + /* 90 */ 1036, 1036, 121, 121, 122, 122, 122, 122, 424, 116, + /* 100 */ 112, 222, 120, 120, 120, 120, 119, 119, 118, 118, + /* 110 */ 118, 117, 113, 444, 277, 277, 277, 277, 560, 560, + /* 120 */ 560, 1558, 376, 1560, 1186, 375, 1157, 563, 1157, 563, + /* 130 */ 409, 1558, 537, 252, 219, 1553, 99, 141, 449, 6, + /* 140 */ 365, 233, 120, 120, 120, 120, 119, 119, 118, 118, + /* 150 */ 118, 117, 113, 444, 123, 124, 114, 1210, 1210, 1044, + /* 160 */ 1047, 1036, 1036, 121, 121, 122, 122, 122, 122, 138, + /* 170 */ 289, 1186, 1546, 448, 118, 118, 118, 117, 113, 444, + /* 180 */ 125, 1186, 1187, 1188, 144, 465, 334, 566, 150, 127, + /* 190 */ 444, 122, 122, 122, 122, 115, 120, 120, 120, 120, + /* 200 */ 119, 119, 118, 118, 118, 117, 113, 444, 454, 419, + /* 210 */ 13, 13, 215, 120, 120, 120, 120, 119, 119, 118, + /* 220 */ 118, 118, 117, 113, 444, 422, 308, 557, 1186, 1187, + /* 230 */ 1188, 441, 440, 409, 1271, 122, 122, 122, 122, 120, + /* 240 */ 120, 120, 120, 119, 119, 118, 118, 118, 117, 113, + /* 250 */ 444, 1543, 98, 1033, 1033, 1045, 1048, 123, 124, 114, + /* 260 */ 1210, 1210, 1044, 1047, 1036, 1036, 121, 121, 122, 122, + /* 270 */ 122, 122, 566, 406, 405, 1186, 566, 409, 1217, 319, + /* 280 */ 1217, 80, 81, 120, 120, 120, 120, 119, 119, 118, + /* 290 */ 118, 118, 117, 113, 444, 70, 70, 1186, 1604, 71, + /* 300 */ 71, 123, 124, 114, 1210, 1210, 1044, 1047, 1036, 1036, + /* 310 */ 121, 121, 122, 122, 122, 122, 120, 120, 120, 120, + /* 320 */ 119, 119, 118, 118, 118, 117, 113, 444, 1037, 210, + /* 330 */ 1186, 365, 1186, 1187, 1188, 245, 548, 399, 504, 501, + /* 340 */ 500, 108, 558, 138, 4, 516, 933, 433, 499, 217, + /* 350 */ 514, 522, 352, 879, 1186, 1187, 1188, 383, 561, 566, + /* 360 */ 120, 120, 120, 120, 119, 119, 118, 118, 118, 117, + /* 370 */ 113, 444, 277, 277, 16, 16, 1598, 441, 440, 153, + /* 380 */ 409, 445, 13, 13, 1279, 563, 1214, 1186, 1187, 1188, + /* 390 */ 1003, 1216, 264, 555, 1574, 186, 566, 427, 138, 1215, + /* 400 */ 308, 557, 472, 138, 123, 124, 114, 1210, 1210, 1044, + /* 410 */ 1047, 1036, 1036, 121, 121, 122, 122, 122, 122, 55, + /* 420 */ 55, 413, 1023, 507, 1217, 1186, 1217, 474, 106, 106, + /* 430 */ 1312, 1312, 1186, 171, 566, 384, 107, 380, 445, 568, + /* 440 */ 567, 430, 1543, 1013, 332, 549, 565, 263, 280, 360, + /* 450 */ 510, 355, 509, 250, 491, 308, 557, 71, 71, 351, + /* 460 */ 308, 557, 374, 120, 120, 120, 120, 119, 119, 118, + /* 470 */ 118, 118, 117, 113, 444, 1013, 1013, 1015, 1016, 27, + /* 480 */ 277, 277, 1186, 1187, 1188, 1152, 566, 528, 409, 1186, + /* 490 */ 1187, 1188, 348, 563, 548, 1260, 533, 517, 1152, 1516, + /* 500 */ 317, 1152, 285, 550, 485, 569, 566, 569, 482, 51, + /* 510 */ 51, 207, 123, 124, 114, 1210, 1210, 1044, 1047, 1036, + /* 520 */ 1036, 121, 121, 122, 122, 122, 122, 171, 1412, 13, + /* 530 */ 13, 409, 277, 277, 1186, 505, 119, 119, 118, 118, + /* 540 */ 118, 117, 113, 444, 429, 563, 518, 220, 515, 1552, + /* 550 */ 365, 546, 1186, 6, 532, 123, 124, 114, 1210, 1210, + /* 560 */ 1044, 1047, 1036, 1036, 121, 121, 122, 122, 122, 122, + /* 570 */ 145, 120, 120, 120, 120, 119, 119, 118, 118, 118, + /* 580 */ 117, 113, 444, 245, 566, 474, 504, 501, 500, 566, + /* 590 */ 1481, 1186, 1187, 1188, 1310, 1310, 499, 1186, 149, 425, + /* 600 */ 1186, 480, 409, 274, 365, 952, 872, 56, 56, 1186, + /* 610 */ 1187, 1188, 71, 71, 120, 120, 120, 120, 119, 119, + /* 620 */ 118, 118, 118, 117, 113, 444, 123, 124, 114, 1210, + /* 630 */ 1210, 1044, 1047, 1036, 1036, 121, 121, 122, 122, 122, + /* 640 */ 122, 409, 541, 1552, 83, 865, 98, 6, 928, 529, + /* 650 */ 848, 543, 151, 927, 1186, 1187, 1188, 1186, 1187, 1188, + /* 660 */ 290, 1543, 187, 1633, 395, 123, 124, 114, 1210, 1210, + /* 670 */ 1044, 1047, 1036, 1036, 121, 121, 122, 122, 122, 122, + /* 680 */ 566, 954, 566, 453, 953, 120, 120, 120, 120, 119, + /* 690 */ 119, 118, 118, 118, 117, 113, 444, 1152, 221, 1186, + /* 700 */ 331, 453, 452, 13, 13, 13, 13, 1003, 365, 463, + /* 710 */ 1152, 193, 409, 1152, 382, 1543, 1170, 32, 297, 474, + /* 720 */ 195, 1527, 5, 952, 120, 120, 120, 120, 119, 119, + /* 730 */ 118, 118, 118, 117, 113, 444, 123, 124, 114, 1210, + /* 740 */ 1210, 1044, 1047, 1036, 1036, 121, 121, 122, 122, 122, + /* 750 */ 122, 409, 1067, 419, 1186, 1024, 1186, 1187, 1188, 1186, + /* 760 */ 419, 332, 460, 320, 544, 1545, 442, 442, 442, 566, + /* 770 */ 3, 117, 113, 444, 453, 123, 124, 114, 1210, 1210, + /* 780 */ 1044, 1047, 1036, 1036, 121, 121, 122, 122, 122, 122, + /* 790 */ 1473, 566, 15, 15, 293, 120, 120, 120, 120, 119, + /* 800 */ 119, 118, 118, 118, 117, 113, 444, 1186, 566, 1486, + /* 810 */ 1412, 1186, 1187, 1188, 13, 13, 1186, 1187, 1188, 1544, + /* 820 */ 271, 271, 409, 286, 308, 557, 1008, 1486, 1488, 196, + /* 830 */ 288, 71, 71, 563, 120, 120, 120, 120, 119, 119, + /* 840 */ 118, 118, 118, 117, 113, 444, 123, 124, 114, 1210, + /* 850 */ 1210, 1044, 1047, 1036, 1036, 121, 121, 122, 122, 122, + /* 860 */ 122, 409, 201, 1087, 1186, 1187, 1188, 1324, 304, 1529, + /* 870 */ 388, 278, 278, 450, 564, 402, 922, 922, 566, 563, + /* 880 */ 566, 426, 491, 480, 563, 123, 124, 114, 1210, 1210, + /* 890 */ 1044, 1047, 1036, 1036, 121, 121, 122, 122, 122, 122, + /* 900 */ 1486, 71, 71, 13, 13, 120, 120, 120, 120, 119, + /* 910 */ 119, 118, 118, 118, 117, 113, 444, 566, 545, 566, + /* 920 */ 1577, 573, 2, 1238, 1092, 1092, 488, 1480, 309, 1525, + /* 930 */ 142, 324, 409, 836, 837, 838, 312, 1320, 305, 363, + /* 940 */ 43, 43, 57, 57, 120, 120, 120, 120, 119, 119, + /* 950 */ 118, 118, 118, 117, 113, 444, 123, 124, 114, 1210, + /* 960 */ 1210, 1044, 1047, 1036, 1036, 121, 121, 122, 122, 122, + /* 970 */ 122, 12, 277, 277, 566, 1152, 409, 572, 428, 1238, + /* 980 */ 465, 334, 296, 474, 309, 563, 142, 249, 1152, 308, + /* 990 */ 557, 1152, 321, 1320, 323, 491, 455, 71, 71, 233, + /* 1000 */ 283, 101, 114, 1210, 1210, 1044, 1047, 1036, 1036, 121, + /* 1010 */ 121, 122, 122, 122, 122, 120, 120, 120, 120, 119, + /* 1020 */ 119, 118, 118, 118, 117, 113, 444, 1108, 277, 277, + /* 1030 */ 1412, 448, 394, 1230, 439, 277, 277, 248, 247, 246, + /* 1040 */ 1319, 563, 1109, 313, 198, 294, 491, 1318, 563, 464, + /* 1050 */ 566, 1427, 394, 1130, 1023, 233, 414, 1110, 295, 120, + /* 1060 */ 120, 120, 120, 119, 119, 118, 118, 118, 117, 113, + /* 1070 */ 444, 1014, 104, 71, 71, 1013, 322, 496, 908, 566, + /* 1080 */ 277, 277, 277, 277, 1108, 1261, 415, 448, 909, 361, + /* 1090 */ 1571, 1315, 409, 563, 952, 563, 9, 202, 255, 1109, + /* 1100 */ 316, 487, 44, 44, 249, 559, 415, 1013, 1013, 1015, + /* 1110 */ 443, 1231, 409, 1603, 1110, 897, 123, 124, 114, 1210, + /* 1120 */ 1210, 1044, 1047, 1036, 1036, 121, 121, 122, 122, 122, + /* 1130 */ 122, 1231, 409, 1207, 215, 554, 123, 124, 114, 1210, + /* 1140 */ 1210, 1044, 1047, 1036, 1036, 121, 121, 122, 122, 122, + /* 1150 */ 122, 1131, 1631, 470, 1631, 255, 123, 111, 114, 1210, + /* 1160 */ 1210, 1044, 1047, 1036, 1036, 121, 121, 122, 122, 122, + /* 1170 */ 122, 1131, 1632, 414, 1632, 120, 120, 120, 120, 119, + /* 1180 */ 119, 118, 118, 118, 117, 113, 444, 221, 209, 351, + /* 1190 */ 1207, 1207, 147, 1426, 491, 120, 120, 120, 120, 119, + /* 1200 */ 119, 118, 118, 118, 117, 113, 444, 1256, 539, 519, + /* 1210 */ 888, 551, 952, 12, 566, 120, 120, 120, 120, 119, + /* 1220 */ 119, 118, 118, 118, 117, 113, 444, 538, 566, 860, + /* 1230 */ 1129, 361, 1571, 346, 1356, 409, 1163, 58, 58, 339, + /* 1240 */ 1355, 508, 277, 277, 277, 277, 277, 277, 1207, 889, + /* 1250 */ 1129, 59, 59, 459, 363, 563, 566, 563, 96, 563, + /* 1260 */ 124, 114, 1210, 1210, 1044, 1047, 1036, 1036, 121, 121, + /* 1270 */ 122, 122, 122, 122, 566, 1412, 566, 281, 1186, 60, + /* 1280 */ 60, 110, 392, 392, 391, 266, 389, 860, 1163, 845, + /* 1290 */ 566, 481, 566, 436, 341, 1152, 344, 61, 61, 62, + /* 1300 */ 62, 967, 227, 1550, 315, 431, 540, 6, 1152, 968, + /* 1310 */ 566, 1152, 314, 45, 45, 46, 46, 512, 120, 120, + /* 1320 */ 120, 120, 119, 119, 118, 118, 118, 117, 113, 444, + /* 1330 */ 416, 173, 1532, 47, 47, 1186, 1187, 1188, 108, 558, + /* 1340 */ 325, 4, 229, 1551, 928, 566, 437, 6, 566, 927, + /* 1350 */ 164, 566, 1290, 137, 1190, 561, 566, 1549, 566, 1089, + /* 1360 */ 566, 6, 566, 1089, 531, 566, 868, 8, 49, 49, + /* 1370 */ 228, 50, 50, 566, 63, 63, 566, 457, 445, 64, + /* 1380 */ 64, 65, 65, 14, 14, 66, 66, 407, 129, 129, + /* 1390 */ 555, 566, 458, 566, 1505, 486, 67, 67, 566, 52, + /* 1400 */ 52, 546, 407, 467, 535, 410, 226, 1023, 566, 534, + /* 1410 */ 308, 557, 1190, 407, 68, 68, 69, 69, 566, 1023, + /* 1420 */ 566, 53, 53, 868, 1014, 106, 106, 525, 1013, 566, + /* 1430 */ 1504, 159, 159, 107, 451, 445, 568, 567, 471, 307, + /* 1440 */ 1013, 160, 160, 76, 76, 566, 1548, 466, 407, 407, + /* 1450 */ 6, 1225, 54, 54, 478, 276, 219, 566, 887, 886, + /* 1460 */ 1013, 1013, 1015, 84, 206, 1206, 230, 282, 72, 72, + /* 1470 */ 329, 483, 1013, 1013, 1015, 1016, 27, 1576, 1174, 447, + /* 1480 */ 130, 130, 281, 148, 105, 38, 103, 392, 392, 391, + /* 1490 */ 266, 389, 566, 1126, 845, 396, 566, 108, 558, 566, + /* 1500 */ 4, 311, 566, 30, 17, 566, 279, 227, 566, 315, + /* 1510 */ 108, 558, 468, 4, 561, 73, 73, 314, 566, 157, + /* 1520 */ 157, 566, 131, 131, 526, 132, 132, 561, 128, 128, + /* 1530 */ 566, 158, 158, 566, 31, 291, 566, 445, 330, 521, + /* 1540 */ 98, 152, 152, 420, 136, 136, 1005, 229, 254, 555, + /* 1550 */ 445, 479, 336, 135, 135, 164, 133, 133, 137, 134, + /* 1560 */ 134, 875, 555, 535, 566, 473, 566, 254, 536, 475, + /* 1570 */ 335, 254, 98, 894, 895, 228, 535, 566, 1023, 566, + /* 1580 */ 1074, 534, 210, 232, 106, 106, 1352, 75, 75, 77, + /* 1590 */ 77, 1023, 107, 340, 445, 568, 567, 106, 106, 1013, + /* 1600 */ 74, 74, 42, 42, 566, 107, 343, 445, 568, 567, + /* 1610 */ 410, 497, 1013, 251, 359, 308, 557, 1135, 349, 875, + /* 1620 */ 98, 1070, 345, 251, 358, 1591, 347, 48, 48, 1017, + /* 1630 */ 1303, 1013, 1013, 1015, 1016, 27, 1289, 1287, 1074, 451, + /* 1640 */ 961, 925, 254, 110, 1013, 1013, 1015, 1016, 27, 1174, + /* 1650 */ 447, 970, 971, 281, 108, 558, 1288, 4, 392, 392, + /* 1660 */ 391, 266, 389, 1343, 1086, 845, 1086, 1085, 858, 1085, + /* 1670 */ 146, 561, 926, 354, 110, 303, 364, 553, 227, 1364, + /* 1680 */ 315, 108, 558, 1411, 4, 1339, 492, 1017, 314, 1350, + /* 1690 */ 1565, 552, 1417, 1268, 445, 204, 1259, 1247, 561, 1246, + /* 1700 */ 1248, 1584, 269, 1336, 367, 369, 555, 371, 11, 212, + /* 1710 */ 393, 225, 1393, 284, 1398, 456, 287, 327, 229, 328, + /* 1720 */ 292, 445, 1386, 216, 333, 1403, 164, 477, 373, 137, + /* 1730 */ 1402, 400, 502, 555, 1286, 1023, 357, 1477, 199, 1587, + /* 1740 */ 211, 106, 106, 932, 1476, 1225, 228, 556, 175, 107, + /* 1750 */ 200, 445, 568, 567, 258, 387, 1013, 1524, 1522, 223, + /* 1760 */ 1222, 418, 1023, 83, 208, 79, 82, 184, 106, 106, + /* 1770 */ 1482, 169, 177, 461, 179, 462, 107, 1399, 445, 568, + /* 1780 */ 567, 410, 180, 1013, 495, 181, 308, 557, 1013, 1013, + /* 1790 */ 1015, 1016, 27, 182, 35, 235, 100, 558, 398, 4, + /* 1800 */ 96, 1405, 1404, 36, 484, 469, 1407, 188, 401, 1471, + /* 1810 */ 451, 89, 1493, 561, 239, 1013, 1013, 1015, 1016, 27, + /* 1820 */ 490, 338, 270, 241, 192, 342, 493, 242, 403, 1249, + /* 1830 */ 243, 511, 432, 1297, 1306, 91, 445, 1305, 1304, 879, + /* 1840 */ 217, 434, 435, 1570, 1276, 1602, 520, 1601, 555, 301, + /* 1850 */ 527, 404, 1275, 302, 356, 1274, 1600, 95, 1347, 366, + /* 1860 */ 1296, 362, 1348, 368, 256, 257, 1556, 1555, 438, 1346, + /* 1870 */ 370, 126, 1345, 10, 1371, 546, 381, 1023, 102, 1457, + /* 1880 */ 97, 530, 34, 106, 106, 570, 1180, 372, 265, 1329, + /* 1890 */ 379, 107, 203, 445, 568, 567, 1328, 385, 1013, 1370, + /* 1900 */ 386, 267, 268, 571, 1244, 161, 1239, 162, 1509, 1510, + /* 1910 */ 1508, 143, 1507, 299, 832, 213, 214, 78, 446, 205, + /* 1920 */ 310, 306, 163, 224, 1084, 140, 1082, 318, 165, 176, + /* 1930 */ 1013, 1013, 1015, 1016, 27, 178, 1206, 231, 911, 234, + /* 1940 */ 326, 1098, 183, 421, 166, 167, 411, 185, 85, 423, + /* 1950 */ 412, 86, 174, 87, 168, 88, 1101, 236, 1097, 237, + /* 1960 */ 154, 18, 238, 254, 337, 1219, 489, 1090, 240, 190, + /* 1970 */ 37, 847, 189, 494, 358, 244, 350, 506, 191, 877, + /* 1980 */ 90, 498, 19, 20, 503, 92, 353, 890, 300, 170, + /* 1990 */ 155, 93, 513, 94, 1168, 156, 1050, 1137, 39, 218, + /* 2000 */ 273, 275, 1136, 960, 194, 955, 110, 1154, 1158, 253, + /* 2010 */ 7, 1162, 1156, 21, 22, 1161, 1142, 23, 24, 25, + /* 2020 */ 33, 542, 26, 260, 197, 98, 1065, 1051, 1049, 1053, + /* 2030 */ 1107, 1054, 1106, 259, 28, 40, 562, 1018, 859, 109, + /* 2040 */ 29, 921, 390, 1176, 172, 139, 1175, 1235, 261, 1235, + /* 2050 */ 1235, 1235, 1235, 1235, 1235, 1235, 1235, 262, 1235, 1235, + /* 2060 */ 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1593, 1592, }; static const YYCODETYPE yy_lookahead[] = { - /* 0 */ 192, 273, 274, 275, 192, 192, 273, 274, 275, 192, - /* 10 */ 218, 215, 192, 218, 192, 212, 234, 235, 205, 19, - /* 20 */ 11, 192, 294, 215, 216, 203, 192, 203, 209, 210, - /* 30 */ 211, 31, 215, 216, 205, 215, 216, 215, 216, 39, - /* 40 */ 227, 215, 229, 43, 44, 45, 46, 47, 48, 49, - /* 50 */ 50, 51, 52, 53, 54, 55, 56, 57, 192, 19, - /* 60 */ 238, 239, 238, 239, 215, 273, 274, 275, 273, 274, - /* 70 */ 275, 237, 21, 251, 252, 251, 273, 274, 275, 255, - /* 80 */ 256, 215, 216, 43, 44, 45, 46, 47, 48, 49, - /* 90 */ 50, 51, 52, 53, 54, 55, 56, 57, 209, 210, - /* 100 */ 211, 76, 102, 103, 104, 105, 106, 107, 108, 109, - /* 110 */ 110, 111, 112, 59, 89, 111, 112, 92, 252, 307, - /* 120 */ 308, 313, 314, 112, 312, 59, 86, 261, 88, 19, - /* 130 */ 313, 80, 315, 313, 314, 25, 127, 128, 54, 55, - /* 140 */ 56, 57, 102, 103, 104, 105, 106, 107, 108, 109, - /* 150 */ 110, 111, 112, 43, 44, 45, 46, 47, 48, 49, - /* 160 */ 50, 51, 52, 53, 54, 55, 56, 57, 192, 115, - /* 170 */ 116, 117, 118, 122, 192, 121, 122, 123, 202, 69, - /* 180 */ 204, 115, 116, 117, 192, 131, 102, 103, 104, 105, - /* 190 */ 106, 107, 108, 109, 110, 111, 112, 215, 216, 19, - /* 200 */ 54, 55, 56, 57, 58, 108, 109, 110, 111, 112, - /* 210 */ 192, 160, 102, 103, 104, 105, 106, 107, 108, 109, - /* 220 */ 110, 111, 112, 43, 44, 45, 46, 47, 48, 49, - /* 230 */ 50, 51, 52, 53, 54, 55, 56, 57, 19, 46, - /* 240 */ 47, 48, 49, 24, 248, 192, 250, 67, 102, 103, - /* 250 */ 104, 105, 106, 107, 108, 109, 110, 111, 112, 277, - /* 260 */ 127, 128, 43, 44, 45, 46, 47, 48, 49, 50, - /* 270 */ 51, 52, 53, 54, 55, 56, 57, 26, 164, 165, - /* 280 */ 272, 263, 102, 103, 104, 105, 106, 107, 108, 109, - /* 290 */ 110, 111, 112, 184, 185, 186, 187, 188, 189, 186, - /* 300 */ 187, 188, 189, 194, 76, 196, 229, 194, 19, 196, - /* 310 */ 59, 192, 203, 120, 59, 87, 203, 89, 310, 311, - /* 320 */ 92, 102, 103, 104, 105, 106, 107, 108, 109, 110, - /* 330 */ 111, 112, 43, 44, 45, 46, 47, 48, 49, 50, - /* 340 */ 51, 52, 53, 54, 55, 56, 57, 238, 239, 73, - /* 350 */ 231, 238, 239, 22, 23, 100, 25, 81, 305, 306, - /* 360 */ 251, 23, 25, 25, 251, 272, 115, 116, 117, 214, - /* 370 */ 115, 116, 144, 192, 265, 120, 114, 222, 265, 102, - /* 380 */ 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - /* 390 */ 192, 102, 103, 104, 105, 106, 107, 108, 109, 110, - /* 400 */ 111, 112, 126, 310, 311, 192, 297, 152, 153, 154, - /* 410 */ 297, 149, 192, 137, 138, 19, 192, 100, 192, 23, - /* 420 */ 22, 106, 107, 108, 109, 110, 111, 112, 215, 216, - /* 430 */ 106, 107, 101, 116, 192, 215, 216, 120, 149, 43, - /* 440 */ 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, - /* 450 */ 54, 55, 56, 57, 117, 117, 192, 59, 19, 187, - /* 460 */ 59, 189, 23, 282, 240, 252, 194, 192, 196, 152, - /* 470 */ 153, 154, 252, 72, 261, 203, 152, 25, 154, 142, - /* 480 */ 142, 261, 43, 44, 45, 46, 47, 48, 49, 50, - /* 490 */ 51, 52, 53, 54, 55, 56, 57, 192, 102, 103, - /* 500 */ 104, 105, 106, 107, 108, 109, 110, 111, 112, 267, - /* 510 */ 238, 239, 237, 115, 116, 117, 115, 116, 117, 192, - /* 520 */ 59, 118, 16, 251, 121, 122, 123, 303, 19, 303, - /* 530 */ 59, 267, 23, 72, 131, 308, 22, 265, 22, 312, - /* 540 */ 24, 102, 103, 104, 105, 106, 107, 108, 109, 110, - /* 550 */ 111, 112, 43, 44, 45, 46, 47, 48, 49, 50, - /* 560 */ 51, 52, 53, 54, 55, 56, 57, 19, 81, 297, - /* 570 */ 295, 23, 192, 59, 203, 59, 115, 116, 117, 108, - /* 580 */ 192, 73, 25, 77, 192, 79, 115, 116, 117, 137, - /* 590 */ 138, 43, 44, 45, 46, 47, 48, 49, 50, 51, - /* 600 */ 52, 53, 54, 55, 56, 57, 119, 215, 216, 238, - /* 610 */ 239, 102, 103, 104, 105, 106, 107, 108, 109, 110, - /* 620 */ 111, 112, 251, 192, 137, 138, 59, 234, 235, 115, - /* 630 */ 116, 117, 116, 76, 126, 127, 128, 19, 192, 268, - /* 640 */ 19, 23, 22, 192, 252, 24, 89, 300, 301, 92, - /* 650 */ 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, - /* 660 */ 112, 43, 44, 45, 46, 47, 48, 49, 50, 51, - /* 670 */ 52, 53, 54, 55, 56, 57, 19, 192, 192, 59, - /* 680 */ 23, 192, 115, 116, 117, 200, 240, 307, 308, 22, - /* 690 */ 205, 81, 312, 262, 22, 192, 133, 22, 135, 136, - /* 700 */ 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - /* 710 */ 53, 54, 55, 56, 57, 197, 95, 150, 215, 216, - /* 720 */ 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, - /* 730 */ 112, 59, 192, 112, 59, 115, 116, 117, 192, 118, - /* 740 */ 119, 120, 121, 122, 123, 124, 19, 137, 138, 303, - /* 750 */ 23, 130, 192, 267, 192, 252, 267, 306, 203, 102, - /* 760 */ 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - /* 770 */ 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - /* 780 */ 53, 54, 55, 56, 57, 19, 240, 115, 116, 117, - /* 790 */ 115, 116, 117, 238, 239, 222, 192, 224, 280, 237, - /* 800 */ 240, 192, 284, 192, 59, 232, 251, 140, 204, 43, - /* 810 */ 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, - /* 820 */ 54, 55, 56, 57, 192, 35, 215, 216, 192, 102, - /* 830 */ 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - /* 840 */ 59, 230, 192, 192, 238, 239, 237, 215, 216, 303, - /* 850 */ 308, 215, 216, 16, 312, 19, 66, 251, 126, 127, - /* 860 */ 128, 116, 230, 303, 74, 203, 215, 216, 102, 103, - /* 870 */ 104, 105, 106, 107, 108, 109, 110, 111, 112, 43, - /* 880 */ 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, - /* 890 */ 54, 55, 56, 57, 192, 212, 115, 116, 117, 19, - /* 900 */ 238, 239, 192, 252, 7, 8, 9, 192, 192, 238, - /* 910 */ 239, 308, 262, 251, 77, 312, 79, 215, 216, 129, - /* 920 */ 210, 211, 251, 142, 158, 45, 46, 47, 48, 49, - /* 930 */ 50, 51, 52, 53, 54, 55, 56, 57, 102, 103, - /* 940 */ 104, 105, 106, 107, 108, 109, 110, 111, 112, 12, - /* 950 */ 59, 192, 192, 237, 252, 243, 192, 192, 126, 127, - /* 960 */ 128, 192, 308, 203, 27, 253, 312, 308, 285, 207, - /* 970 */ 208, 312, 157, 290, 159, 215, 216, 262, 192, 42, - /* 980 */ 215, 216, 102, 103, 104, 105, 106, 107, 108, 109, - /* 990 */ 110, 111, 112, 283, 158, 230, 237, 160, 238, 239, - /* 1000 */ 63, 215, 216, 192, 192, 12, 115, 116, 117, 22, - /* 1010 */ 73, 251, 252, 192, 19, 192, 230, 239, 24, 24, - /* 1020 */ 27, 261, 210, 211, 99, 192, 215, 216, 225, 251, - /* 1030 */ 192, 192, 263, 142, 19, 42, 215, 216, 43, 44, - /* 1040 */ 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, - /* 1050 */ 55, 56, 57, 59, 19, 291, 63, 132, 43, 44, - /* 1060 */ 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, - /* 1070 */ 55, 56, 57, 252, 22, 23, 22, 25, 43, 44, - /* 1080 */ 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, - /* 1090 */ 55, 56, 57, 106, 107, 283, 263, 102, 103, 104, - /* 1100 */ 105, 106, 107, 108, 109, 110, 111, 112, 59, 192, - /* 1110 */ 116, 144, 29, 59, 291, 192, 33, 102, 103, 104, - /* 1120 */ 105, 106, 107, 108, 109, 110, 111, 112, 192, 291, - /* 1130 */ 163, 19, 215, 216, 15, 192, 108, 102, 103, 104, - /* 1140 */ 105, 106, 107, 108, 109, 110, 111, 112, 65, 192, - /* 1150 */ 66, 215, 216, 101, 231, 106, 107, 19, 215, 216, - /* 1160 */ 192, 212, 134, 114, 115, 116, 117, 139, 119, 85, - /* 1170 */ 116, 207, 208, 230, 192, 19, 127, 192, 94, 60, - /* 1180 */ 59, 192, 44, 45, 46, 47, 48, 49, 50, 51, - /* 1190 */ 52, 53, 54, 55, 56, 57, 192, 76, 192, 31, - /* 1200 */ 192, 152, 46, 154, 215, 216, 192, 39, 87, 192, - /* 1210 */ 89, 19, 20, 92, 22, 192, 22, 23, 22, 230, - /* 1220 */ 263, 215, 216, 215, 216, 137, 138, 115, 36, 145, - /* 1230 */ 128, 192, 215, 216, 22, 23, 115, 116, 117, 290, - /* 1240 */ 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, - /* 1250 */ 112, 59, 192, 151, 215, 216, 192, 61, 203, 298, - /* 1260 */ 299, 192, 192, 71, 25, 144, 203, 192, 203, 230, - /* 1270 */ 114, 19, 20, 81, 22, 215, 216, 263, 192, 215, - /* 1280 */ 216, 255, 256, 203, 215, 216, 130, 19, 36, 192, - /* 1290 */ 215, 216, 100, 238, 239, 101, 25, 192, 106, 107, - /* 1300 */ 48, 238, 239, 238, 239, 113, 251, 115, 116, 117, - /* 1310 */ 192, 59, 120, 101, 251, 192, 251, 192, 238, 239, - /* 1320 */ 215, 216, 192, 71, 46, 243, 192, 25, 25, 137, - /* 1330 */ 138, 251, 192, 215, 216, 253, 25, 85, 215, 216, - /* 1340 */ 215, 216, 90, 243, 152, 153, 154, 155, 156, 215, - /* 1350 */ 216, 192, 100, 253, 243, 215, 216, 192, 106, 107, - /* 1360 */ 243, 192, 148, 149, 253, 113, 192, 115, 116, 117, - /* 1370 */ 253, 192, 120, 192, 215, 216, 192, 23, 192, 25, - /* 1380 */ 215, 216, 192, 115, 215, 216, 22, 148, 24, 215, - /* 1390 */ 216, 192, 114, 192, 215, 216, 215, 216, 134, 215, - /* 1400 */ 216, 215, 216, 139, 152, 153, 154, 155, 156, 0, - /* 1410 */ 1, 2, 141, 23, 5, 25, 215, 216, 24, 10, - /* 1420 */ 11, 12, 13, 14, 1, 2, 17, 125, 5, 19, - /* 1430 */ 20, 268, 22, 10, 11, 12, 13, 14, 192, 30, - /* 1440 */ 17, 32, 23, 23, 25, 25, 36, 144, 23, 40, - /* 1450 */ 25, 192, 141, 30, 192, 32, 23, 22, 25, 5, - /* 1460 */ 128, 215, 216, 40, 10, 11, 12, 13, 14, 59, - /* 1470 */ 23, 17, 25, 192, 215, 216, 192, 215, 216, 70, - /* 1480 */ 23, 71, 25, 151, 30, 192, 32, 78, 53, 192, - /* 1490 */ 81, 192, 192, 70, 40, 85, 215, 216, 119, 120, - /* 1500 */ 90, 78, 59, 254, 81, 192, 192, 98, 215, 216, - /* 1510 */ 100, 23, 59, 25, 215, 216, 106, 107, 23, 192, - /* 1520 */ 25, 98, 19, 113, 70, 115, 116, 117, 215, 216, - /* 1530 */ 120, 192, 78, 192, 140, 81, 19, 20, 23, 22, - /* 1540 */ 25, 132, 215, 216, 192, 192, 137, 138, 192, 23, - /* 1550 */ 192, 25, 98, 36, 192, 132, 215, 216, 192, 116, - /* 1560 */ 137, 138, 152, 153, 154, 155, 156, 215, 216, 116, - /* 1570 */ 161, 215, 216, 215, 216, 120, 59, 215, 216, 7, - /* 1580 */ 8, 215, 216, 192, 161, 130, 132, 192, 71, 83, - /* 1590 */ 84, 137, 138, 59, 192, 192, 19, 20, 192, 22, - /* 1600 */ 97, 225, 85, 192, 23, 192, 25, 90, 192, 192, - /* 1610 */ 215, 216, 152, 36, 154, 161, 192, 100, 215, 216, - /* 1620 */ 192, 215, 216, 106, 107, 225, 215, 216, 192, 192, - /* 1630 */ 113, 192, 115, 116, 117, 257, 59, 120, 192, 215, - /* 1640 */ 216, 152, 192, 154, 192, 23, 317, 25, 71, 235, - /* 1650 */ 116, 215, 216, 192, 215, 216, 192, 192, 192, 192, - /* 1660 */ 192, 192, 192, 192, 192, 215, 216, 215, 216, 152, - /* 1670 */ 153, 154, 155, 156, 192, 192, 287, 100, 286, 241, - /* 1680 */ 254, 254, 242, 106, 107, 108, 254, 213, 254, 190, - /* 1690 */ 113, 270, 115, 116, 117, 296, 266, 120, 219, 258, - /* 1700 */ 244, 270, 258, 19, 20, 228, 22, 292, 266, 224, - /* 1710 */ 292, 218, 218, 195, 218, 270, 258, 60, 245, 270, - /* 1720 */ 36, 245, 244, 248, 19, 20, 242, 22, 248, 152, - /* 1730 */ 153, 154, 155, 156, 244, 140, 199, 199, 279, 38, - /* 1740 */ 199, 36, 150, 59, 296, 149, 22, 296, 18, 43, - /* 1750 */ 236, 199, 233, 18, 198, 71, 293, 236, 271, 236, - /* 1760 */ 269, 236, 148, 271, 59, 245, 269, 245, 282, 271, - /* 1770 */ 199, 198, 233, 245, 293, 233, 71, 245, 157, 62, - /* 1780 */ 22, 199, 198, 220, 100, 199, 198, 220, 199, 289, - /* 1790 */ 106, 107, 288, 114, 226, 198, 217, 113, 64, 115, - /* 1800 */ 116, 117, 217, 22, 120, 100, 223, 217, 217, 164, - /* 1810 */ 223, 106, 107, 220, 125, 24, 217, 219, 113, 217, - /* 1820 */ 115, 116, 117, 217, 311, 120, 226, 112, 304, 281, - /* 1830 */ 281, 220, 114, 143, 260, 259, 152, 153, 154, 155, - /* 1840 */ 156, 199, 91, 316, 82, 316, 147, 144, 22, 199, - /* 1850 */ 249, 276, 157, 146, 260, 145, 278, 152, 153, 154, - /* 1860 */ 155, 156, 259, 248, 260, 260, 259, 259, 249, 245, - /* 1870 */ 247, 246, 25, 264, 264, 201, 13, 6, 193, 193, - /* 1880 */ 212, 206, 191, 191, 191, 212, 206, 221, 212, 212, - /* 1890 */ 221, 213, 4, 206, 213, 212, 3, 22, 162, 15, - /* 1900 */ 23, 16, 23, 138, 150, 129, 25, 24, 141, 20, - /* 1910 */ 16, 143, 1, 141, 302, 302, 299, 129, 129, 61, - /* 1920 */ 150, 53, 53, 37, 129, 53, 53, 115, 1, 34, - /* 1930 */ 140, 5, 22, 114, 160, 68, 75, 25, 68, 41, - /* 1940 */ 140, 114, 24, 20, 19, 130, 124, 67, 24, 67, - /* 1950 */ 22, 22, 22, 96, 23, 22, 59, 22, 67, 37, - /* 1960 */ 28, 23, 148, 22, 25, 23, 23, 23, 23, 22, - /* 1970 */ 140, 97, 23, 23, 115, 22, 142, 25, 88, 75, - /* 1980 */ 34, 44, 34, 75, 23, 34, 86, 22, 34, 34, - /* 1990 */ 34, 24, 93, 25, 25, 23, 34, 23, 23, 23, - /* 2000 */ 23, 11, 23, 25, 22, 22, 22, 1, 23, 23, - /* 2010 */ 22, 22, 25, 15, 23, 1, 140, 25, 140, 318, - /* 2020 */ 318, 134, 318, 318, 318, 318, 318, 318, 318, 318, - /* 2030 */ 318, 318, 140, 318, 318, 318, 140, 318, 318, 318, - /* 2040 */ 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, - /* 2050 */ 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, - /* 2060 */ 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, - /* 2070 */ 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, - /* 2080 */ 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, - /* 2090 */ 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, - /* 2100 */ 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, - /* 2110 */ 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, - /* 2120 */ 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, - /* 2130 */ 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, - /* 2140 */ 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, - /* 2150 */ 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, - /* 2160 */ 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, - /* 2170 */ 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, - /* 2180 */ 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, - /* 2190 */ 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, - /* 2200 */ 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, - /* 2210 */ 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, - /* 2220 */ 318, + /* 0 */ 193, 223, 193, 225, 193, 193, 193, 274, 275, 276, + /* 10 */ 193, 233, 219, 193, 274, 275, 276, 206, 206, 19, + /* 20 */ 193, 219, 216, 216, 217, 216, 217, 193, 295, 216, + /* 30 */ 217, 31, 205, 216, 217, 193, 216, 217, 213, 39, + /* 40 */ 228, 193, 230, 43, 44, 45, 46, 47, 48, 49, + /* 50 */ 50, 51, 52, 53, 54, 55, 56, 57, 193, 19, + /* 60 */ 185, 186, 187, 188, 189, 190, 253, 274, 275, 276, + /* 70 */ 195, 193, 197, 253, 216, 262, 274, 275, 276, 204, + /* 80 */ 238, 204, 262, 43, 44, 45, 46, 47, 48, 49, + /* 90 */ 50, 51, 52, 53, 54, 55, 56, 57, 264, 274, + /* 100 */ 275, 276, 102, 103, 104, 105, 106, 107, 108, 109, + /* 110 */ 110, 111, 112, 113, 239, 240, 239, 240, 210, 211, + /* 120 */ 212, 314, 315, 314, 59, 316, 86, 252, 88, 252, + /* 130 */ 19, 314, 315, 256, 257, 309, 25, 72, 296, 313, + /* 140 */ 193, 266, 102, 103, 104, 105, 106, 107, 108, 109, + /* 150 */ 110, 111, 112, 113, 43, 44, 45, 46, 47, 48, + /* 160 */ 49, 50, 51, 52, 53, 54, 55, 56, 57, 81, + /* 170 */ 292, 59, 307, 298, 108, 109, 110, 111, 112, 113, + /* 180 */ 69, 116, 117, 118, 72, 128, 129, 193, 241, 22, + /* 190 */ 113, 54, 55, 56, 57, 58, 102, 103, 104, 105, + /* 200 */ 106, 107, 108, 109, 110, 111, 112, 113, 120, 193, + /* 210 */ 216, 217, 25, 102, 103, 104, 105, 106, 107, 108, + /* 220 */ 109, 110, 111, 112, 113, 231, 138, 139, 116, 117, + /* 230 */ 118, 106, 107, 19, 216, 54, 55, 56, 57, 102, + /* 240 */ 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + /* 250 */ 113, 304, 25, 46, 47, 48, 49, 43, 44, 45, + /* 260 */ 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + /* 270 */ 56, 57, 193, 106, 107, 59, 193, 19, 153, 263, + /* 280 */ 155, 67, 24, 102, 103, 104, 105, 106, 107, 108, + /* 290 */ 109, 110, 111, 112, 113, 216, 217, 59, 230, 216, + /* 300 */ 217, 43, 44, 45, 46, 47, 48, 49, 50, 51, + /* 310 */ 52, 53, 54, 55, 56, 57, 102, 103, 104, 105, + /* 320 */ 106, 107, 108, 109, 110, 111, 112, 113, 121, 142, + /* 330 */ 59, 193, 116, 117, 118, 119, 253, 204, 122, 123, + /* 340 */ 124, 19, 20, 81, 22, 262, 108, 19, 132, 165, + /* 350 */ 166, 193, 24, 126, 116, 117, 118, 278, 36, 193, + /* 360 */ 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, + /* 370 */ 112, 113, 239, 240, 216, 217, 215, 106, 107, 241, + /* 380 */ 19, 59, 216, 217, 223, 252, 115, 116, 117, 118, + /* 390 */ 73, 120, 26, 71, 193, 22, 193, 231, 81, 128, + /* 400 */ 138, 139, 269, 81, 43, 44, 45, 46, 47, 48, + /* 410 */ 49, 50, 51, 52, 53, 54, 55, 56, 57, 216, + /* 420 */ 217, 198, 100, 95, 153, 59, 155, 193, 106, 107, + /* 430 */ 235, 236, 59, 193, 193, 249, 114, 251, 116, 117, + /* 440 */ 118, 113, 304, 121, 127, 204, 193, 119, 120, 121, + /* 450 */ 122, 123, 124, 125, 193, 138, 139, 216, 217, 131, + /* 460 */ 138, 139, 193, 102, 103, 104, 105, 106, 107, 108, + /* 470 */ 109, 110, 111, 112, 113, 153, 154, 155, 156, 157, + /* 480 */ 239, 240, 116, 117, 118, 76, 193, 193, 19, 116, + /* 490 */ 117, 118, 23, 252, 253, 193, 87, 204, 89, 238, + /* 500 */ 193, 92, 268, 262, 281, 203, 193, 205, 285, 216, + /* 510 */ 217, 150, 43, 44, 45, 46, 47, 48, 49, 50, + /* 520 */ 51, 52, 53, 54, 55, 56, 57, 193, 193, 216, + /* 530 */ 217, 19, 239, 240, 59, 23, 106, 107, 108, 109, + /* 540 */ 110, 111, 112, 113, 231, 252, 253, 193, 308, 309, + /* 550 */ 193, 145, 59, 313, 145, 43, 44, 45, 46, 47, + /* 560 */ 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + /* 570 */ 164, 102, 103, 104, 105, 106, 107, 108, 109, 110, + /* 580 */ 111, 112, 113, 119, 193, 193, 122, 123, 124, 193, + /* 590 */ 283, 116, 117, 118, 235, 236, 132, 59, 241, 264, + /* 600 */ 59, 193, 19, 23, 193, 25, 23, 216, 217, 116, + /* 610 */ 117, 118, 216, 217, 102, 103, 104, 105, 106, 107, + /* 620 */ 108, 109, 110, 111, 112, 113, 43, 44, 45, 46, + /* 630 */ 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + /* 640 */ 57, 19, 308, 309, 151, 23, 25, 313, 135, 253, + /* 650 */ 21, 193, 241, 140, 116, 117, 118, 116, 117, 118, + /* 660 */ 268, 304, 22, 301, 302, 43, 44, 45, 46, 47, + /* 670 */ 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + /* 680 */ 193, 143, 193, 193, 143, 102, 103, 104, 105, 106, + /* 690 */ 107, 108, 109, 110, 111, 112, 113, 76, 118, 59, + /* 700 */ 292, 211, 212, 216, 217, 216, 217, 73, 193, 80, + /* 710 */ 89, 25, 19, 92, 193, 304, 23, 22, 231, 193, + /* 720 */ 231, 193, 22, 143, 102, 103, 104, 105, 106, 107, + /* 730 */ 108, 109, 110, 111, 112, 113, 43, 44, 45, 46, + /* 740 */ 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + /* 750 */ 57, 19, 123, 193, 59, 23, 116, 117, 118, 59, + /* 760 */ 193, 127, 128, 129, 306, 307, 210, 211, 212, 193, + /* 770 */ 22, 111, 112, 113, 284, 43, 44, 45, 46, 47, + /* 780 */ 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + /* 790 */ 161, 193, 216, 217, 268, 102, 103, 104, 105, 106, + /* 800 */ 107, 108, 109, 110, 111, 112, 113, 59, 193, 193, + /* 810 */ 193, 116, 117, 118, 216, 217, 116, 117, 118, 304, + /* 820 */ 239, 240, 19, 263, 138, 139, 23, 211, 212, 231, + /* 830 */ 263, 216, 217, 252, 102, 103, 104, 105, 106, 107, + /* 840 */ 108, 109, 110, 111, 112, 113, 43, 44, 45, 46, + /* 850 */ 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + /* 860 */ 57, 19, 193, 11, 116, 117, 118, 240, 253, 193, + /* 870 */ 201, 239, 240, 193, 134, 206, 136, 137, 193, 252, + /* 880 */ 193, 264, 193, 193, 252, 43, 44, 45, 46, 47, + /* 890 */ 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + /* 900 */ 284, 216, 217, 216, 217, 102, 103, 104, 105, 106, + /* 910 */ 107, 108, 109, 110, 111, 112, 113, 193, 231, 193, + /* 920 */ 187, 188, 189, 190, 127, 128, 129, 238, 195, 193, + /* 930 */ 197, 16, 19, 7, 8, 9, 193, 204, 253, 193, + /* 940 */ 216, 217, 216, 217, 102, 103, 104, 105, 106, 107, + /* 950 */ 108, 109, 110, 111, 112, 113, 43, 44, 45, 46, + /* 960 */ 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + /* 970 */ 57, 213, 239, 240, 193, 76, 19, 188, 232, 190, + /* 980 */ 128, 129, 292, 193, 195, 252, 197, 46, 89, 138, + /* 990 */ 139, 92, 77, 204, 79, 193, 269, 216, 217, 266, + /* 1000 */ 204, 159, 45, 46, 47, 48, 49, 50, 51, 52, + /* 1010 */ 53, 54, 55, 56, 57, 102, 103, 104, 105, 106, + /* 1020 */ 107, 108, 109, 110, 111, 112, 113, 12, 239, 240, + /* 1030 */ 193, 298, 22, 23, 253, 239, 240, 127, 128, 129, + /* 1040 */ 238, 252, 27, 193, 286, 204, 193, 204, 252, 291, + /* 1050 */ 193, 273, 22, 23, 100, 266, 115, 42, 268, 102, + /* 1060 */ 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + /* 1070 */ 113, 117, 159, 216, 217, 121, 161, 19, 63, 193, + /* 1080 */ 239, 240, 239, 240, 12, 208, 209, 298, 73, 311, + /* 1090 */ 312, 238, 19, 252, 25, 252, 22, 24, 24, 27, + /* 1100 */ 193, 264, 216, 217, 46, 208, 209, 153, 154, 155, + /* 1110 */ 253, 101, 19, 23, 42, 25, 43, 44, 45, 46, + /* 1120 */ 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + /* 1130 */ 57, 101, 19, 59, 25, 63, 43, 44, 45, 46, + /* 1140 */ 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + /* 1150 */ 57, 22, 23, 115, 25, 24, 43, 44, 45, 46, + /* 1160 */ 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + /* 1170 */ 57, 22, 23, 115, 25, 102, 103, 104, 105, 106, + /* 1180 */ 107, 108, 109, 110, 111, 112, 113, 118, 150, 131, + /* 1190 */ 59, 117, 22, 273, 193, 102, 103, 104, 105, 106, + /* 1200 */ 107, 108, 109, 110, 111, 112, 113, 204, 66, 204, + /* 1210 */ 35, 204, 143, 213, 193, 102, 103, 104, 105, 106, + /* 1220 */ 107, 108, 109, 110, 111, 112, 113, 85, 193, 59, + /* 1230 */ 101, 311, 312, 16, 193, 19, 94, 216, 217, 238, + /* 1240 */ 193, 66, 239, 240, 239, 240, 239, 240, 117, 74, + /* 1250 */ 101, 216, 217, 193, 193, 252, 193, 252, 149, 252, + /* 1260 */ 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + /* 1270 */ 54, 55, 56, 57, 193, 193, 193, 5, 59, 216, + /* 1280 */ 217, 25, 10, 11, 12, 13, 14, 117, 146, 17, + /* 1290 */ 193, 291, 193, 232, 77, 76, 79, 216, 217, 216, + /* 1300 */ 217, 31, 30, 309, 32, 130, 87, 313, 89, 39, + /* 1310 */ 193, 92, 40, 216, 217, 216, 217, 108, 102, 103, + /* 1320 */ 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + /* 1330 */ 299, 300, 193, 216, 217, 116, 117, 118, 19, 20, + /* 1340 */ 193, 22, 70, 309, 135, 193, 264, 313, 193, 140, + /* 1350 */ 78, 193, 226, 81, 59, 36, 193, 309, 193, 29, + /* 1360 */ 193, 313, 193, 33, 145, 193, 59, 48, 216, 217, + /* 1370 */ 98, 216, 217, 193, 216, 217, 193, 244, 59, 216, + /* 1380 */ 217, 216, 217, 216, 217, 216, 217, 254, 216, 217, + /* 1390 */ 71, 193, 244, 193, 193, 65, 216, 217, 193, 216, + /* 1400 */ 217, 145, 254, 244, 85, 133, 15, 100, 193, 90, + /* 1410 */ 138, 139, 117, 254, 216, 217, 216, 217, 193, 100, + /* 1420 */ 193, 216, 217, 116, 117, 106, 107, 19, 121, 193, + /* 1430 */ 193, 216, 217, 114, 162, 116, 117, 118, 244, 244, + /* 1440 */ 121, 216, 217, 216, 217, 193, 309, 129, 254, 254, + /* 1450 */ 313, 60, 216, 217, 19, 256, 257, 193, 120, 121, + /* 1460 */ 153, 154, 155, 149, 150, 25, 24, 99, 216, 217, + /* 1470 */ 152, 193, 153, 154, 155, 156, 157, 0, 1, 2, + /* 1480 */ 216, 217, 5, 22, 158, 24, 160, 10, 11, 12, + /* 1490 */ 13, 14, 193, 23, 17, 25, 193, 19, 20, 193, + /* 1500 */ 22, 133, 193, 22, 22, 193, 22, 30, 193, 32, + /* 1510 */ 19, 20, 129, 22, 36, 216, 217, 40, 193, 216, + /* 1520 */ 217, 193, 216, 217, 116, 216, 217, 36, 216, 217, + /* 1530 */ 193, 216, 217, 193, 53, 152, 193, 59, 23, 19, + /* 1540 */ 25, 216, 217, 61, 216, 217, 23, 70, 25, 71, + /* 1550 */ 59, 116, 193, 216, 217, 78, 216, 217, 81, 216, + /* 1560 */ 217, 59, 71, 85, 193, 23, 193, 25, 90, 23, + /* 1570 */ 23, 25, 25, 7, 8, 98, 85, 193, 100, 193, + /* 1580 */ 59, 90, 142, 141, 106, 107, 193, 216, 217, 216, + /* 1590 */ 217, 100, 114, 193, 116, 117, 118, 106, 107, 121, + /* 1600 */ 216, 217, 216, 217, 193, 114, 193, 116, 117, 118, + /* 1610 */ 133, 23, 121, 25, 121, 138, 139, 97, 23, 117, + /* 1620 */ 25, 23, 193, 25, 131, 141, 193, 216, 217, 59, + /* 1630 */ 193, 153, 154, 155, 156, 157, 226, 193, 117, 162, + /* 1640 */ 23, 23, 25, 25, 153, 154, 155, 156, 157, 1, + /* 1650 */ 2, 83, 84, 5, 19, 20, 226, 22, 10, 11, + /* 1660 */ 12, 13, 14, 258, 153, 17, 155, 153, 23, 155, + /* 1670 */ 25, 36, 23, 193, 25, 255, 193, 236, 30, 193, + /* 1680 */ 32, 19, 20, 193, 22, 193, 288, 117, 40, 193, + /* 1690 */ 318, 193, 193, 193, 59, 242, 193, 193, 36, 193, + /* 1700 */ 193, 193, 287, 255, 255, 255, 71, 255, 243, 214, + /* 1710 */ 191, 297, 267, 245, 271, 259, 259, 293, 70, 246, + /* 1720 */ 246, 59, 267, 229, 245, 271, 78, 293, 259, 81, + /* 1730 */ 271, 271, 220, 71, 225, 100, 219, 219, 249, 196, + /* 1740 */ 243, 106, 107, 108, 219, 60, 98, 280, 297, 114, + /* 1750 */ 249, 116, 117, 118, 141, 245, 121, 200, 200, 297, + /* 1760 */ 38, 200, 100, 151, 150, 294, 294, 22, 106, 107, + /* 1770 */ 283, 43, 234, 18, 237, 200, 114, 272, 116, 117, + /* 1780 */ 118, 133, 237, 121, 18, 237, 138, 139, 153, 154, + /* 1790 */ 155, 156, 157, 237, 270, 199, 19, 20, 246, 22, + /* 1800 */ 149, 272, 272, 270, 200, 246, 234, 234, 246, 246, + /* 1810 */ 162, 158, 290, 36, 199, 153, 154, 155, 156, 157, + /* 1820 */ 62, 289, 200, 199, 22, 200, 221, 199, 221, 200, + /* 1830 */ 199, 115, 64, 227, 218, 22, 59, 218, 218, 126, + /* 1840 */ 165, 24, 113, 312, 218, 224, 305, 224, 71, 282, + /* 1850 */ 144, 221, 220, 282, 218, 218, 218, 115, 261, 260, + /* 1860 */ 227, 221, 261, 260, 200, 91, 317, 317, 82, 261, + /* 1870 */ 260, 148, 261, 22, 265, 145, 200, 100, 158, 277, + /* 1880 */ 147, 146, 25, 106, 107, 202, 13, 260, 194, 250, + /* 1890 */ 249, 114, 248, 116, 117, 118, 250, 247, 121, 265, + /* 1900 */ 246, 194, 6, 192, 192, 207, 192, 207, 213, 213, + /* 1910 */ 213, 222, 213, 222, 4, 214, 214, 213, 3, 22, + /* 1920 */ 163, 279, 207, 15, 23, 16, 23, 139, 130, 151, + /* 1930 */ 153, 154, 155, 156, 157, 142, 25, 24, 20, 144, + /* 1940 */ 16, 1, 142, 61, 130, 130, 303, 151, 53, 37, + /* 1950 */ 303, 53, 300, 53, 130, 53, 116, 34, 1, 141, + /* 1960 */ 5, 22, 115, 25, 161, 75, 41, 68, 141, 115, + /* 1970 */ 24, 20, 68, 19, 131, 125, 23, 96, 22, 59, + /* 1980 */ 22, 67, 22, 22, 67, 22, 24, 28, 67, 37, + /* 1990 */ 23, 149, 22, 25, 23, 23, 23, 23, 22, 141, + /* 2000 */ 23, 23, 97, 116, 22, 143, 25, 88, 75, 34, + /* 2010 */ 44, 75, 86, 34, 34, 93, 23, 34, 34, 34, + /* 2020 */ 22, 24, 34, 22, 25, 25, 23, 23, 23, 23, + /* 2030 */ 23, 11, 23, 25, 22, 22, 25, 23, 23, 22, + /* 2040 */ 22, 135, 15, 1, 25, 23, 1, 319, 141, 319, + /* 2050 */ 319, 319, 319, 319, 319, 319, 319, 141, 319, 319, + /* 2060 */ 319, 319, 319, 319, 319, 319, 319, 319, 141, 141, + /* 2070 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, + /* 2080 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, + /* 2090 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, + /* 2100 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, + /* 2110 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, + /* 2120 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, + /* 2130 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, + /* 2140 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, + /* 2150 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, + /* 2160 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, + /* 2170 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, + /* 2180 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, + /* 2190 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, + /* 2200 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, + /* 2210 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, + /* 2220 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, + /* 2230 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, + /* 2240 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, + /* 2250 */ 319, 319, 319, 319, 319, }; -#define YY_SHIFT_COUNT (571) +#define YY_SHIFT_COUNT (573) #define YY_SHIFT_MIN (0) -#define YY_SHIFT_MAX (2014) +#define YY_SHIFT_MAX (2045) static const unsigned short int yy_shift_ofst[] = { - /* 0 */ 1423, 1409, 1454, 1192, 1192, 610, 1252, 1410, 1517, 1684, - /* 10 */ 1684, 1684, 276, 0, 0, 180, 1015, 1684, 1684, 1684, - /* 20 */ 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, - /* 30 */ 1049, 1049, 1121, 1121, 54, 487, 610, 610, 610, 610, - /* 40 */ 610, 40, 110, 219, 289, 396, 439, 509, 548, 618, - /* 50 */ 657, 727, 766, 836, 995, 1015, 1015, 1015, 1015, 1015, - /* 60 */ 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, - /* 70 */ 1015, 1015, 1015, 1035, 1015, 1138, 880, 880, 1577, 1684, - /* 80 */ 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, - /* 90 */ 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, - /* 100 */ 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, - /* 110 */ 1684, 1684, 1684, 1705, 1684, 1684, 1684, 1684, 1684, 1684, - /* 120 */ 1684, 1684, 1684, 1684, 1684, 1684, 1684, 146, 84, 84, - /* 130 */ 84, 84, 84, 277, 315, 401, 97, 461, 251, 66, - /* 140 */ 66, 51, 1156, 66, 66, 324, 324, 66, 452, 452, - /* 150 */ 452, 452, 133, 114, 114, 4, 11, 2037, 2037, 621, - /* 160 */ 621, 621, 567, 398, 398, 398, 398, 937, 937, 228, - /* 170 */ 251, 331, 1052, 66, 66, 66, 66, 66, 66, 66, - /* 180 */ 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, - /* 190 */ 66, 66, 66, 557, 557, 66, 9, 25, 25, 745, - /* 200 */ 745, 967, 1088, 2037, 2037, 2037, 2037, 2037, 2037, 2037, - /* 210 */ 255, 317, 317, 514, 403, 620, 471, 672, 781, 891, - /* 220 */ 675, 66, 66, 66, 66, 66, 66, 66, 66, 66, - /* 230 */ 66, 508, 66, 66, 66, 66, 66, 66, 66, 66, - /* 240 */ 66, 66, 66, 66, 790, 790, 790, 66, 66, 66, - /* 250 */ 338, 66, 66, 66, 516, 1084, 66, 66, 993, 66, - /* 260 */ 66, 66, 66, 66, 66, 66, 66, 732, 1083, 563, - /* 270 */ 994, 994, 994, 994, 337, 563, 563, 1028, 987, 897, - /* 280 */ 1119, 262, 1214, 1271, 1112, 1214, 1112, 1268, 1239, 262, - /* 290 */ 262, 1239, 262, 1271, 1268, 1302, 1354, 1278, 1168, 1168, - /* 300 */ 1168, 1112, 1303, 1303, 815, 1311, 1264, 1364, 1657, 1657, - /* 310 */ 1595, 1595, 1701, 1701, 1595, 1592, 1596, 1724, 1706, 1730, - /* 320 */ 1730, 1730, 1730, 1595, 1735, 1614, 1596, 1596, 1614, 1724, - /* 330 */ 1706, 1614, 1706, 1614, 1595, 1735, 1621, 1717, 1595, 1735, - /* 340 */ 1758, 1595, 1735, 1595, 1735, 1758, 1679, 1679, 1679, 1734, - /* 350 */ 1781, 1781, 1758, 1679, 1689, 1679, 1734, 1679, 1679, 1645, - /* 360 */ 1791, 1715, 1715, 1758, 1690, 1718, 1690, 1718, 1690, 1718, - /* 370 */ 1690, 1718, 1595, 1751, 1751, 1762, 1762, 1699, 1703, 1826, - /* 380 */ 1595, 1695, 1699, 1707, 1710, 1614, 1847, 1863, 1863, 1871, - /* 390 */ 1871, 1871, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, - /* 400 */ 2037, 2037, 2037, 2037, 2037, 2037, 2037, 193, 837, 1194, - /* 410 */ 1212, 506, 832, 1054, 1390, 925, 1435, 1394, 1102, 1332, - /* 420 */ 1419, 1196, 1420, 1425, 1433, 1447, 1457, 1488, 1443, 1379, - /* 430 */ 1572, 1455, 1503, 1453, 1495, 1515, 1506, 1526, 1460, 1489, - /* 440 */ 1581, 1622, 1534, 667, 1888, 1893, 1875, 1736, 1884, 1885, - /* 450 */ 1877, 1879, 1765, 1754, 1776, 1881, 1881, 1883, 1767, 1889, - /* 460 */ 1768, 1894, 1911, 1772, 1788, 1881, 1789, 1858, 1886, 1881, - /* 470 */ 1770, 1868, 1869, 1872, 1873, 1795, 1812, 1895, 1790, 1927, - /* 480 */ 1926, 1910, 1819, 1774, 1867, 1912, 1870, 1861, 1898, 1800, - /* 490 */ 1827, 1918, 1923, 1925, 1815, 1822, 1928, 1880, 1929, 1930, - /* 500 */ 1931, 1933, 1882, 1897, 1924, 1857, 1932, 1935, 1891, 1922, - /* 510 */ 1938, 1814, 1941, 1942, 1943, 1944, 1939, 1945, 1947, 1874, - /* 520 */ 1830, 1949, 1950, 1859, 1946, 1953, 1834, 1952, 1948, 1951, - /* 530 */ 1954, 1955, 1890, 1904, 1900, 1937, 1908, 1899, 1956, 1961, - /* 540 */ 1965, 1967, 1968, 1969, 1962, 1972, 1952, 1974, 1975, 1976, - /* 550 */ 1977, 1978, 1979, 1982, 1990, 1983, 1984, 1985, 1986, 1988, - /* 560 */ 1989, 1987, 1887, 1876, 1878, 1892, 1896, 1992, 1991, 1998, - /* 570 */ 2006, 2014, + /* 0 */ 1648, 1477, 1272, 322, 322, 262, 1319, 1478, 1491, 1662, + /* 10 */ 1662, 1662, 317, 0, 0, 214, 1093, 1662, 1662, 1662, + /* 20 */ 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, + /* 30 */ 271, 271, 1219, 1219, 216, 88, 262, 262, 262, 262, + /* 40 */ 262, 40, 111, 258, 361, 469, 512, 583, 622, 693, + /* 50 */ 732, 803, 842, 913, 1073, 1093, 1093, 1093, 1093, 1093, + /* 60 */ 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, + /* 70 */ 1093, 1093, 1093, 1113, 1093, 1216, 957, 957, 1635, 1662, + /* 80 */ 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, + /* 90 */ 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, + /* 100 */ 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, + /* 110 */ 1662, 1662, 1662, 1662, 1777, 1662, 1662, 1662, 1662, 1662, + /* 120 */ 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 137, 181, + /* 130 */ 181, 181, 181, 181, 94, 430, 66, 65, 112, 366, + /* 140 */ 475, 475, 629, 1058, 475, 475, 125, 125, 475, 686, + /* 150 */ 686, 686, 660, 686, 57, 184, 184, 77, 77, 2070, + /* 160 */ 2070, 328, 328, 328, 493, 373, 373, 373, 373, 1015, + /* 170 */ 1015, 409, 366, 1129, 1149, 475, 475, 475, 475, 475, + /* 180 */ 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, + /* 190 */ 475, 475, 475, 475, 475, 621, 621, 475, 852, 899, + /* 200 */ 899, 1295, 1295, 406, 851, 2070, 2070, 2070, 2070, 2070, + /* 210 */ 2070, 2070, 1307, 954, 954, 640, 464, 695, 238, 700, + /* 220 */ 538, 541, 748, 475, 475, 475, 475, 475, 475, 475, + /* 230 */ 475, 475, 475, 634, 475, 475, 475, 475, 475, 475, + /* 240 */ 475, 475, 475, 475, 475, 475, 1175, 1175, 1175, 475, + /* 250 */ 475, 475, 580, 475, 475, 475, 1074, 1142, 475, 475, + /* 260 */ 1072, 475, 475, 475, 475, 475, 475, 475, 475, 797, + /* 270 */ 1330, 740, 1131, 1131, 1131, 1131, 1069, 740, 740, 1209, + /* 280 */ 167, 926, 1391, 1038, 1314, 187, 1408, 1314, 1408, 1435, + /* 290 */ 1109, 1038, 1038, 1109, 1038, 187, 1435, 227, 1090, 941, + /* 300 */ 1270, 1270, 1270, 1408, 1256, 1256, 1326, 1440, 513, 1461, + /* 310 */ 1685, 1685, 1613, 1613, 1722, 1722, 1613, 1612, 1614, 1745, + /* 320 */ 1728, 1755, 1755, 1755, 1755, 1613, 1766, 1651, 1614, 1614, + /* 330 */ 1651, 1745, 1728, 1651, 1728, 1651, 1613, 1766, 1653, 1758, + /* 340 */ 1613, 1766, 1802, 1613, 1766, 1613, 1766, 1802, 1716, 1716, + /* 350 */ 1716, 1768, 1813, 1813, 1802, 1716, 1713, 1716, 1768, 1716, + /* 360 */ 1716, 1675, 1817, 1729, 1729, 1802, 1706, 1742, 1706, 1742, + /* 370 */ 1706, 1742, 1706, 1742, 1613, 1774, 1774, 1786, 1786, 1723, + /* 380 */ 1730, 1851, 1613, 1720, 1723, 1733, 1735, 1651, 1857, 1873, + /* 390 */ 1873, 1896, 1896, 1896, 2070, 2070, 2070, 2070, 2070, 2070, + /* 400 */ 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 207, + /* 410 */ 915, 1010, 1030, 1217, 910, 1170, 1470, 1368, 1481, 1442, + /* 420 */ 1318, 1383, 1515, 1482, 1523, 1542, 1546, 1547, 1588, 1595, + /* 430 */ 1502, 1338, 1566, 1493, 1520, 1521, 1598, 1617, 1568, 1618, + /* 440 */ 1511, 1514, 1645, 1649, 1570, 1484, 1910, 1915, 1897, 1757, + /* 450 */ 1908, 1909, 1901, 1903, 1788, 1778, 1798, 1911, 1911, 1913, + /* 460 */ 1793, 1918, 1795, 1924, 1940, 1800, 1814, 1911, 1815, 1882, + /* 470 */ 1912, 1911, 1796, 1895, 1898, 1900, 1902, 1824, 1840, 1923, + /* 480 */ 1818, 1957, 1955, 1939, 1847, 1803, 1899, 1938, 1904, 1890, + /* 490 */ 1925, 1827, 1854, 1946, 1951, 1954, 1843, 1850, 1956, 1914, + /* 500 */ 1958, 1960, 1953, 1961, 1917, 1920, 1962, 1881, 1959, 1963, + /* 510 */ 1921, 1952, 1967, 1842, 1970, 1971, 1972, 1973, 1968, 1974, + /* 520 */ 1976, 1905, 1858, 1977, 1978, 1887, 1975, 1982, 1862, 1981, + /* 530 */ 1979, 1980, 1983, 1984, 1919, 1933, 1926, 1966, 1936, 1922, + /* 540 */ 1985, 1993, 1998, 1997, 1999, 2000, 1988, 2003, 1981, 2004, + /* 550 */ 2005, 2006, 2007, 2008, 2009, 2001, 2020, 2012, 2013, 2014, + /* 560 */ 2015, 2017, 2018, 2011, 1906, 1907, 1916, 1927, 1928, 2019, + /* 570 */ 2022, 2027, 2042, 2045, }; -#define YY_REDUCE_COUNT (406) -#define YY_REDUCE_MIN (-272) -#define YY_REDUCE_MAX (1693) +#define YY_REDUCE_COUNT (408) +#define YY_REDUCE_MIN (-267) +#define YY_REDUCE_MAX (1715) static const short yy_reduce_ofst[] = { - /* 0 */ 109, 113, 272, 760, -178, -176, -192, -183, -180, -134, - /* 10 */ 213, 220, 371, -208, -205, -272, -197, 611, 632, 765, - /* 20 */ 786, 392, 943, 989, 503, 651, 1039, -18, 702, 821, - /* 30 */ 710, 812, -188, 380, -187, 555, 662, 1055, 1063, 1065, - /* 40 */ 1080, -267, -267, -267, -267, -267, -267, -267, -267, -267, - /* 50 */ -267, -267, -267, -267, -267, -267, -267, -267, -267, -267, - /* 60 */ -267, -267, -267, -267, -267, -267, -267, -267, -267, -267, - /* 70 */ -267, -267, -267, -267, -267, -267, -267, -267, 636, 811, - /* 80 */ 917, 936, 1006, 1008, 1017, 1060, 1064, 1069, 1075, 1105, - /* 90 */ 1118, 1123, 1125, 1134, 1140, 1159, 1165, 1169, 1174, 1179, - /* 100 */ 1181, 1184, 1186, 1201, 1246, 1259, 1262, 1281, 1293, 1299, - /* 110 */ 1313, 1327, 1341, 1352, 1356, 1358, 1362, 1366, 1395, 1403, - /* 120 */ 1406, 1411, 1424, 1436, 1439, 1450, 1452, -267, -267, -267, - /* 130 */ -267, -267, -267, -267, -267, 224, -267, 446, -24, 275, - /* 140 */ 546, 518, 573, 560, 53, -181, -111, 485, 606, 671, - /* 150 */ 606, 671, 683, 8, 93, -267, -267, -267, -267, 155, - /* 160 */ 155, 155, 181, 242, 264, 486, 489, -218, 393, 227, - /* 170 */ 604, 347, 347, -171, 431, 650, 715, -166, 562, 609, - /* 180 */ 716, 764, 18, 823, 769, 833, 838, 957, 759, 119, - /* 190 */ 923, 226, 1014, 542, 603, 451, 949, 654, 659, 762, - /* 200 */ 964, -4, 778, 961, 712, 1082, 1100, 1111, 1026, 1117, - /* 210 */ -204, -174, -151, -8, 77, 198, 305, 327, 388, 540, - /* 220 */ 839, 968, 982, 985, 1004, 1023, 1070, 1086, 1097, 1130, - /* 230 */ 1190, 1163, 1199, 1284, 1297, 1300, 1314, 1339, 1353, 1391, - /* 240 */ 1402, 1413, 1416, 1417, 803, 1376, 1400, 1428, 1437, 1446, - /* 250 */ 1378, 1461, 1464, 1465, 1249, 1329, 1466, 1467, 1414, 1468, - /* 260 */ 305, 1469, 1470, 1471, 1472, 1482, 1483, 1389, 1392, 1438, - /* 270 */ 1426, 1427, 1432, 1434, 1378, 1438, 1438, 1440, 1474, 1499, - /* 280 */ 1399, 1421, 1430, 1456, 1441, 1442, 1444, 1415, 1473, 1431, - /* 290 */ 1445, 1476, 1449, 1478, 1418, 1479, 1477, 1485, 1493, 1494, - /* 300 */ 1496, 1458, 1475, 1480, 1459, 1490, 1484, 1518, 1448, 1451, - /* 310 */ 1537, 1538, 1463, 1481, 1541, 1486, 1487, 1491, 1519, 1514, - /* 320 */ 1521, 1523, 1525, 1552, 1556, 1520, 1492, 1498, 1522, 1497, - /* 330 */ 1539, 1528, 1542, 1532, 1571, 1573, 1500, 1504, 1582, 1584, - /* 340 */ 1563, 1586, 1588, 1589, 1597, 1567, 1579, 1585, 1590, 1568, - /* 350 */ 1583, 1587, 1593, 1591, 1598, 1599, 1600, 1602, 1606, 1513, - /* 360 */ 1524, 1548, 1549, 1611, 1574, 1576, 1594, 1603, 1604, 1607, - /* 370 */ 1605, 1608, 1642, 1527, 1529, 1609, 1610, 1601, 1615, 1575, - /* 380 */ 1650, 1578, 1619, 1623, 1625, 1624, 1674, 1685, 1686, 1691, - /* 390 */ 1692, 1693, 1612, 1613, 1617, 1675, 1668, 1673, 1676, 1677, - /* 400 */ 1680, 1666, 1669, 1678, 1681, 1683, 1687, + /* 0 */ -125, 733, 789, 241, 293, -123, -193, -191, -183, -187, + /* 10 */ -180, 83, 133, -207, -198, -267, -175, -6, 166, 313, + /* 20 */ 487, 396, 489, 598, 615, 685, 687, 79, 781, 857, + /* 30 */ 490, 616, 240, 334, -188, 796, 841, 843, 1003, 1005, + /* 40 */ 1007, -260, -260, -260, -260, -260, -260, -260, -260, -260, + /* 50 */ -260, -260, -260, -260, -260, -260, -260, -260, -260, -260, + /* 60 */ -260, -260, -260, -260, -260, -260, -260, -260, -260, -260, + /* 70 */ -260, -260, -260, -260, -260, -260, -260, -260, 158, 203, + /* 80 */ 391, 576, 724, 726, 886, 1021, 1035, 1063, 1081, 1083, + /* 90 */ 1097, 1099, 1117, 1152, 1155, 1158, 1163, 1165, 1167, 1169, + /* 100 */ 1172, 1180, 1183, 1198, 1200, 1205, 1215, 1225, 1227, 1236, + /* 110 */ 1252, 1264, 1299, 1303, 1306, 1309, 1312, 1315, 1325, 1328, + /* 120 */ 1337, 1340, 1343, 1371, 1373, 1384, 1386, 1411, -260, -260, + /* 130 */ -260, -260, -260, -260, -260, -260, -260, -53, 138, 302, + /* 140 */ -158, 357, 223, -222, 411, 458, -92, 556, 669, 581, + /* 150 */ 632, 581, -260, 632, 758, 778, 920, -260, -260, -260, + /* 160 */ -260, 161, 161, 161, 307, 234, 392, 526, 790, 195, + /* 170 */ 359, -174, -173, 362, 362, -189, 16, 560, 567, 261, + /* 180 */ 689, 802, 853, -122, -166, 408, 335, 617, 690, 837, + /* 190 */ 1001, 746, 1061, 515, 1082, 994, 1034, -135, 1000, 1048, + /* 200 */ 1137, 877, 897, 186, 627, 1031, 1133, 1148, 1159, 1194, + /* 210 */ 1199, 1195, -194, -142, 18, -152, 68, 201, 253, 269, + /* 220 */ 294, 354, 521, 528, 676, 680, 736, 743, 850, 907, + /* 230 */ 1041, 1047, 1060, 727, 1139, 1147, 1201, 1237, 1278, 1359, + /* 240 */ 1393, 1400, 1413, 1429, 1433, 1437, 1126, 1410, 1430, 1444, + /* 250 */ 1480, 1483, 1405, 1486, 1490, 1492, 1420, 1372, 1496, 1498, + /* 260 */ 1441, 1499, 253, 1500, 1503, 1504, 1506, 1507, 1508, 1398, + /* 270 */ 1415, 1453, 1448, 1449, 1450, 1452, 1405, 1453, 1453, 1465, + /* 280 */ 1495, 1519, 1414, 1443, 1445, 1468, 1456, 1455, 1457, 1424, + /* 290 */ 1473, 1454, 1459, 1474, 1460, 1479, 1434, 1512, 1494, 1509, + /* 300 */ 1517, 1518, 1525, 1469, 1489, 1501, 1467, 1510, 1497, 1543, + /* 310 */ 1451, 1462, 1557, 1558, 1471, 1472, 1561, 1487, 1505, 1524, + /* 320 */ 1538, 1537, 1545, 1548, 1556, 1575, 1596, 1552, 1529, 1530, + /* 330 */ 1559, 1533, 1572, 1562, 1573, 1563, 1604, 1615, 1522, 1532, + /* 340 */ 1622, 1624, 1605, 1625, 1628, 1629, 1631, 1607, 1616, 1619, + /* 350 */ 1620, 1606, 1621, 1623, 1630, 1626, 1632, 1636, 1633, 1637, + /* 360 */ 1638, 1531, 1541, 1567, 1571, 1640, 1597, 1599, 1601, 1603, + /* 370 */ 1608, 1610, 1611, 1627, 1664, 1549, 1550, 1609, 1634, 1639, + /* 380 */ 1641, 1602, 1676, 1642, 1646, 1644, 1650, 1654, 1683, 1694, + /* 390 */ 1707, 1711, 1712, 1714, 1643, 1647, 1652, 1698, 1695, 1696, + /* 400 */ 1697, 1699, 1700, 1689, 1691, 1701, 1702, 1704, 1715, }; static const YYACTIONTYPE yy_default[] = { - /* 0 */ 1633, 1633, 1633, 1462, 1230, 1341, 1230, 1230, 1230, 1462, - /* 10 */ 1462, 1462, 1230, 1371, 1371, 1515, 1263, 1230, 1230, 1230, - /* 20 */ 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1461, 1230, 1230, - /* 30 */ 1230, 1230, 1550, 1550, 1230, 1230, 1230, 1230, 1230, 1230, - /* 40 */ 1230, 1230, 1380, 1230, 1387, 1230, 1230, 1230, 1230, 1230, - /* 50 */ 1463, 1464, 1230, 1230, 1230, 1514, 1516, 1479, 1394, 1393, - /* 60 */ 1392, 1391, 1497, 1358, 1385, 1378, 1382, 1457, 1458, 1456, - /* 70 */ 1460, 1464, 1463, 1230, 1381, 1428, 1442, 1427, 1230, 1230, - /* 80 */ 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, - /* 90 */ 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, - /* 100 */ 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, - /* 110 */ 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, - /* 120 */ 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1436, 1441, 1447, - /* 130 */ 1440, 1437, 1430, 1429, 1431, 1230, 1432, 1230, 1254, 1230, - /* 140 */ 1230, 1251, 1305, 1230, 1230, 1230, 1230, 1230, 1534, 1533, - /* 150 */ 1230, 1230, 1263, 1422, 1421, 1433, 1434, 1444, 1443, 1522, - /* 160 */ 1586, 1585, 1480, 1230, 1230, 1230, 1230, 1230, 1230, 1550, - /* 170 */ 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, - /* 180 */ 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, - /* 190 */ 1230, 1230, 1230, 1550, 1550, 1230, 1263, 1550, 1550, 1259, - /* 200 */ 1259, 1365, 1230, 1529, 1332, 1332, 1332, 1332, 1341, 1332, - /* 210 */ 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, - /* 220 */ 1230, 1230, 1230, 1230, 1230, 1519, 1517, 1230, 1230, 1230, - /* 230 */ 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, - /* 240 */ 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, - /* 250 */ 1230, 1230, 1230, 1230, 1337, 1230, 1230, 1230, 1230, 1230, - /* 260 */ 1230, 1230, 1230, 1230, 1230, 1230, 1579, 1230, 1492, 1319, - /* 270 */ 1337, 1337, 1337, 1337, 1339, 1320, 1318, 1331, 1264, 1237, - /* 280 */ 1625, 1397, 1386, 1338, 1360, 1386, 1360, 1622, 1384, 1397, - /* 290 */ 1397, 1384, 1397, 1338, 1622, 1280, 1602, 1275, 1371, 1371, - /* 300 */ 1371, 1360, 1365, 1365, 1459, 1338, 1331, 1230, 1625, 1625, - /* 310 */ 1346, 1346, 1624, 1624, 1346, 1480, 1609, 1406, 1308, 1314, - /* 320 */ 1314, 1314, 1314, 1346, 1248, 1384, 1609, 1609, 1384, 1406, - /* 330 */ 1308, 1384, 1308, 1384, 1346, 1248, 1496, 1619, 1346, 1248, - /* 340 */ 1470, 1346, 1248, 1346, 1248, 1470, 1306, 1306, 1306, 1295, - /* 350 */ 1230, 1230, 1470, 1306, 1280, 1306, 1295, 1306, 1306, 1568, - /* 360 */ 1230, 1474, 1474, 1470, 1364, 1359, 1364, 1359, 1364, 1359, - /* 370 */ 1364, 1359, 1346, 1560, 1560, 1374, 1374, 1379, 1365, 1465, - /* 380 */ 1346, 1230, 1379, 1377, 1375, 1384, 1298, 1582, 1582, 1578, - /* 390 */ 1578, 1578, 1630, 1630, 1529, 1595, 1263, 1263, 1263, 1263, - /* 400 */ 1595, 1282, 1282, 1264, 1264, 1263, 1595, 1230, 1230, 1230, - /* 410 */ 1230, 1230, 1230, 1590, 1230, 1524, 1481, 1350, 1230, 1230, - /* 420 */ 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, - /* 430 */ 1230, 1230, 1535, 1230, 1230, 1230, 1230, 1230, 1230, 1230, - /* 440 */ 1230, 1230, 1230, 1411, 1230, 1233, 1526, 1230, 1230, 1230, - /* 450 */ 1230, 1230, 1230, 1230, 1230, 1388, 1389, 1351, 1230, 1230, - /* 460 */ 1230, 1230, 1230, 1230, 1230, 1403, 1230, 1230, 1230, 1398, - /* 470 */ 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1621, 1230, - /* 480 */ 1230, 1230, 1230, 1230, 1230, 1495, 1494, 1230, 1230, 1348, - /* 490 */ 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, - /* 500 */ 1230, 1230, 1230, 1278, 1230, 1230, 1230, 1230, 1230, 1230, - /* 510 */ 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, - /* 520 */ 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1376, 1230, 1230, - /* 530 */ 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, - /* 540 */ 1230, 1230, 1565, 1366, 1230, 1230, 1612, 1230, 1230, 1230, - /* 550 */ 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, - /* 560 */ 1230, 1606, 1322, 1413, 1230, 1412, 1416, 1252, 1230, 1242, - /* 570 */ 1230, 1230, + /* 0 */ 1637, 1637, 1637, 1466, 1233, 1344, 1233, 1233, 1233, 1466, + /* 10 */ 1466, 1466, 1233, 1374, 1374, 1519, 1266, 1233, 1233, 1233, + /* 20 */ 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1465, 1233, 1233, + /* 30 */ 1233, 1233, 1554, 1554, 1233, 1233, 1233, 1233, 1233, 1233, + /* 40 */ 1233, 1233, 1383, 1233, 1390, 1233, 1233, 1233, 1233, 1233, + /* 50 */ 1467, 1468, 1233, 1233, 1233, 1518, 1520, 1483, 1397, 1396, + /* 60 */ 1395, 1394, 1501, 1361, 1388, 1381, 1385, 1461, 1462, 1460, + /* 70 */ 1464, 1468, 1467, 1233, 1384, 1431, 1445, 1430, 1233, 1233, + /* 80 */ 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, + /* 90 */ 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, + /* 100 */ 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, + /* 110 */ 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, + /* 120 */ 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1439, 1444, + /* 130 */ 1451, 1443, 1440, 1433, 1432, 1434, 1435, 1233, 1233, 1257, + /* 140 */ 1233, 1233, 1254, 1308, 1233, 1233, 1233, 1233, 1233, 1538, + /* 150 */ 1537, 1233, 1436, 1233, 1266, 1425, 1424, 1448, 1437, 1447, + /* 160 */ 1446, 1526, 1590, 1589, 1484, 1233, 1233, 1233, 1233, 1233, + /* 170 */ 1233, 1554, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, + /* 180 */ 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, + /* 190 */ 1233, 1233, 1233, 1233, 1233, 1554, 1554, 1233, 1266, 1554, + /* 200 */ 1554, 1262, 1262, 1368, 1233, 1533, 1335, 1335, 1335, 1335, + /* 210 */ 1344, 1335, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, + /* 220 */ 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1523, 1521, 1233, + /* 230 */ 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, + /* 240 */ 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, + /* 250 */ 1233, 1233, 1233, 1233, 1233, 1233, 1340, 1233, 1233, 1233, + /* 260 */ 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1583, 1233, + /* 270 */ 1496, 1322, 1340, 1340, 1340, 1340, 1342, 1323, 1321, 1334, + /* 280 */ 1267, 1240, 1629, 1400, 1389, 1341, 1363, 1389, 1363, 1626, + /* 290 */ 1387, 1400, 1400, 1387, 1400, 1341, 1626, 1283, 1606, 1278, + /* 300 */ 1374, 1374, 1374, 1363, 1368, 1368, 1463, 1341, 1334, 1233, + /* 310 */ 1629, 1629, 1349, 1349, 1628, 1628, 1349, 1484, 1613, 1409, + /* 320 */ 1311, 1317, 1317, 1317, 1317, 1349, 1251, 1387, 1613, 1613, + /* 330 */ 1387, 1409, 1311, 1387, 1311, 1387, 1349, 1251, 1500, 1623, + /* 340 */ 1349, 1251, 1474, 1349, 1251, 1349, 1251, 1474, 1309, 1309, + /* 350 */ 1309, 1298, 1233, 1233, 1474, 1309, 1283, 1309, 1298, 1309, + /* 360 */ 1309, 1572, 1233, 1478, 1478, 1474, 1367, 1362, 1367, 1362, + /* 370 */ 1367, 1362, 1367, 1362, 1349, 1564, 1564, 1377, 1377, 1382, + /* 380 */ 1368, 1469, 1349, 1233, 1382, 1380, 1378, 1387, 1301, 1586, + /* 390 */ 1586, 1582, 1582, 1582, 1634, 1634, 1533, 1599, 1266, 1266, + /* 400 */ 1266, 1266, 1599, 1285, 1285, 1267, 1267, 1266, 1599, 1233, + /* 410 */ 1233, 1233, 1233, 1233, 1233, 1594, 1233, 1528, 1485, 1353, + /* 420 */ 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, + /* 430 */ 1233, 1233, 1233, 1233, 1539, 1233, 1233, 1233, 1233, 1233, + /* 440 */ 1233, 1233, 1233, 1233, 1233, 1414, 1233, 1236, 1530, 1233, + /* 450 */ 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1391, 1392, 1354, + /* 460 */ 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1406, 1233, 1233, + /* 470 */ 1233, 1401, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, + /* 480 */ 1625, 1233, 1233, 1233, 1233, 1233, 1233, 1499, 1498, 1233, + /* 490 */ 1233, 1351, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, + /* 500 */ 1233, 1233, 1233, 1233, 1233, 1281, 1233, 1233, 1233, 1233, + /* 510 */ 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, + /* 520 */ 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1379, + /* 530 */ 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, + /* 540 */ 1233, 1233, 1233, 1233, 1569, 1369, 1233, 1233, 1616, 1233, + /* 550 */ 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, + /* 560 */ 1233, 1233, 1233, 1610, 1325, 1416, 1233, 1415, 1419, 1255, + /* 570 */ 1233, 1245, 1233, 1233, }; /********** End of lemon-generated parsing tables *****************************/ @@ -160784,6 +162673,7 @@ static const YYCODETYPE yyFallback[] = { 0, /* SLASH => nothing */ 0, /* REM => nothing */ 0, /* CONCAT => nothing */ + 0, /* PTR => nothing */ 0, /* COLLATE => nothing */ 0, /* BITNOT => nothing */ 0, /* ON => nothing */ @@ -161056,212 +162946,213 @@ static const char *const yyTokenName[] = { /* 109 */ "SLASH", /* 110 */ "REM", /* 111 */ "CONCAT", - /* 112 */ "COLLATE", - /* 113 */ "BITNOT", - /* 114 */ "ON", - /* 115 */ "INDEXED", - /* 116 */ "STRING", - /* 117 */ "JOIN_KW", - /* 118 */ "CONSTRAINT", - /* 119 */ "DEFAULT", - /* 120 */ "NULL", - /* 121 */ "PRIMARY", - /* 122 */ "UNIQUE", - /* 123 */ "CHECK", - /* 124 */ "REFERENCES", - /* 125 */ "AUTOINCR", - /* 126 */ "INSERT", - /* 127 */ "DELETE", - /* 128 */ "UPDATE", - /* 129 */ "SET", - /* 130 */ "DEFERRABLE", - /* 131 */ "FOREIGN", - /* 132 */ "DROP", - /* 133 */ "UNION", - /* 134 */ "ALL", - /* 135 */ "EXCEPT", - /* 136 */ "INTERSECT", - /* 137 */ "SELECT", - /* 138 */ "VALUES", - /* 139 */ "DISTINCT", - /* 140 */ "DOT", - /* 141 */ "FROM", - /* 142 */ "JOIN", - /* 143 */ "USING", - /* 144 */ "ORDER", - /* 145 */ "GROUP", - /* 146 */ "HAVING", - /* 147 */ "LIMIT", - /* 148 */ "WHERE", - /* 149 */ "RETURNING", - /* 150 */ "INTO", - /* 151 */ "NOTHING", - /* 152 */ "FLOAT", - /* 153 */ "BLOB", - /* 154 */ "INTEGER", - /* 155 */ "VARIABLE", - /* 156 */ "CASE", - /* 157 */ "WHEN", - /* 158 */ "THEN", - /* 159 */ "ELSE", - /* 160 */ "INDEX", - /* 161 */ "ALTER", - /* 162 */ "ADD", - /* 163 */ "WINDOW", - /* 164 */ "OVER", - /* 165 */ "FILTER", - /* 166 */ "COLUMN", - /* 167 */ "AGG_FUNCTION", - /* 168 */ "AGG_COLUMN", - /* 169 */ "TRUEFALSE", - /* 170 */ "ISNOT", - /* 171 */ "FUNCTION", - /* 172 */ "UMINUS", - /* 173 */ "UPLUS", - /* 174 */ "TRUTH", - /* 175 */ "REGISTER", - /* 176 */ "VECTOR", - /* 177 */ "SELECT_COLUMN", - /* 178 */ "IF_NULL_ROW", - /* 179 */ "ASTERISK", - /* 180 */ "SPAN", - /* 181 */ "ERROR", - /* 182 */ "SPACE", - /* 183 */ "ILLEGAL", - /* 184 */ "input", - /* 185 */ "cmdlist", - /* 186 */ "ecmd", - /* 187 */ "cmdx", - /* 188 */ "explain", - /* 189 */ "cmd", - /* 190 */ "transtype", - /* 191 */ "trans_opt", - /* 192 */ "nm", - /* 193 */ "savepoint_opt", - /* 194 */ "create_table", - /* 195 */ "create_table_args", - /* 196 */ "createkw", - /* 197 */ "temp", - /* 198 */ "ifnotexists", - /* 199 */ "dbnm", - /* 200 */ "columnlist", - /* 201 */ "conslist_opt", - /* 202 */ "table_option_set", - /* 203 */ "select", - /* 204 */ "table_option", - /* 205 */ "columnname", - /* 206 */ "carglist", - /* 207 */ "typetoken", - /* 208 */ "typename", - /* 209 */ "signed", - /* 210 */ "plus_num", - /* 211 */ "minus_num", - /* 212 */ "scanpt", - /* 213 */ "scantok", - /* 214 */ "ccons", - /* 215 */ "term", - /* 216 */ "expr", - /* 217 */ "onconf", - /* 218 */ "sortorder", - /* 219 */ "autoinc", - /* 220 */ "eidlist_opt", - /* 221 */ "refargs", - /* 222 */ "defer_subclause", - /* 223 */ "generated", - /* 224 */ "refarg", - /* 225 */ "refact", - /* 226 */ "init_deferred_pred_opt", - /* 227 */ "conslist", - /* 228 */ "tconscomma", - /* 229 */ "tcons", - /* 230 */ "sortlist", - /* 231 */ "eidlist", - /* 232 */ "defer_subclause_opt", - /* 233 */ "orconf", - /* 234 */ "resolvetype", - /* 235 */ "raisetype", - /* 236 */ "ifexists", - /* 237 */ "fullname", - /* 238 */ "selectnowith", - /* 239 */ "oneselect", - /* 240 */ "wqlist", - /* 241 */ "multiselect_op", - /* 242 */ "distinct", - /* 243 */ "selcollist", - /* 244 */ "from", - /* 245 */ "where_opt", - /* 246 */ "groupby_opt", - /* 247 */ "having_opt", - /* 248 */ "orderby_opt", - /* 249 */ "limit_opt", - /* 250 */ "window_clause", - /* 251 */ "values", - /* 252 */ "nexprlist", - /* 253 */ "sclp", - /* 254 */ "as", - /* 255 */ "seltablist", - /* 256 */ "stl_prefix", - /* 257 */ "joinop", - /* 258 */ "indexed_opt", - /* 259 */ "on_opt", - /* 260 */ "using_opt", - /* 261 */ "exprlist", - /* 262 */ "xfullname", - /* 263 */ "idlist", - /* 264 */ "nulls", - /* 265 */ "with", - /* 266 */ "where_opt_ret", - /* 267 */ "setlist", - /* 268 */ "insert_cmd", - /* 269 */ "idlist_opt", - /* 270 */ "upsert", - /* 271 */ "returning", - /* 272 */ "filter_over", - /* 273 */ "likeop", - /* 274 */ "between_op", - /* 275 */ "in_op", - /* 276 */ "paren_exprlist", - /* 277 */ "case_operand", - /* 278 */ "case_exprlist", - /* 279 */ "case_else", - /* 280 */ "uniqueflag", - /* 281 */ "collate", - /* 282 */ "vinto", - /* 283 */ "nmnum", - /* 284 */ "trigger_decl", - /* 285 */ "trigger_cmd_list", - /* 286 */ "trigger_time", - /* 287 */ "trigger_event", - /* 288 */ "foreach_clause", - /* 289 */ "when_clause", - /* 290 */ "trigger_cmd", - /* 291 */ "trnm", - /* 292 */ "tridxby", - /* 293 */ "database_kw_opt", - /* 294 */ "key_opt", - /* 295 */ "add_column_fullname", - /* 296 */ "kwcolumn_opt", - /* 297 */ "create_vtab", - /* 298 */ "vtabarglist", - /* 299 */ "vtabarg", - /* 300 */ "vtabargtoken", - /* 301 */ "lp", - /* 302 */ "anylist", - /* 303 */ "wqitem", - /* 304 */ "wqas", - /* 305 */ "windowdefn_list", - /* 306 */ "windowdefn", - /* 307 */ "window", - /* 308 */ "frame_opt", - /* 309 */ "part_opt", - /* 310 */ "filter_clause", - /* 311 */ "over_clause", - /* 312 */ "range_or_rows", - /* 313 */ "frame_bound", - /* 314 */ "frame_bound_s", - /* 315 */ "frame_bound_e", - /* 316 */ "frame_exclude_opt", - /* 317 */ "frame_exclude", + /* 112 */ "PTR", + /* 113 */ "COLLATE", + /* 114 */ "BITNOT", + /* 115 */ "ON", + /* 116 */ "INDEXED", + /* 117 */ "STRING", + /* 118 */ "JOIN_KW", + /* 119 */ "CONSTRAINT", + /* 120 */ "DEFAULT", + /* 121 */ "NULL", + /* 122 */ "PRIMARY", + /* 123 */ "UNIQUE", + /* 124 */ "CHECK", + /* 125 */ "REFERENCES", + /* 126 */ "AUTOINCR", + /* 127 */ "INSERT", + /* 128 */ "DELETE", + /* 129 */ "UPDATE", + /* 130 */ "SET", + /* 131 */ "DEFERRABLE", + /* 132 */ "FOREIGN", + /* 133 */ "DROP", + /* 134 */ "UNION", + /* 135 */ "ALL", + /* 136 */ "EXCEPT", + /* 137 */ "INTERSECT", + /* 138 */ "SELECT", + /* 139 */ "VALUES", + /* 140 */ "DISTINCT", + /* 141 */ "DOT", + /* 142 */ "FROM", + /* 143 */ "JOIN", + /* 144 */ "USING", + /* 145 */ "ORDER", + /* 146 */ "GROUP", + /* 147 */ "HAVING", + /* 148 */ "LIMIT", + /* 149 */ "WHERE", + /* 150 */ "RETURNING", + /* 151 */ "INTO", + /* 152 */ "NOTHING", + /* 153 */ "FLOAT", + /* 154 */ "BLOB", + /* 155 */ "INTEGER", + /* 156 */ "VARIABLE", + /* 157 */ "CASE", + /* 158 */ "WHEN", + /* 159 */ "THEN", + /* 160 */ "ELSE", + /* 161 */ "INDEX", + /* 162 */ "ALTER", + /* 163 */ "ADD", + /* 164 */ "WINDOW", + /* 165 */ "OVER", + /* 166 */ "FILTER", + /* 167 */ "COLUMN", + /* 168 */ "AGG_FUNCTION", + /* 169 */ "AGG_COLUMN", + /* 170 */ "TRUEFALSE", + /* 171 */ "ISNOT", + /* 172 */ "FUNCTION", + /* 173 */ "UMINUS", + /* 174 */ "UPLUS", + /* 175 */ "TRUTH", + /* 176 */ "REGISTER", + /* 177 */ "VECTOR", + /* 178 */ "SELECT_COLUMN", + /* 179 */ "IF_NULL_ROW", + /* 180 */ "ASTERISK", + /* 181 */ "SPAN", + /* 182 */ "ERROR", + /* 183 */ "SPACE", + /* 184 */ "ILLEGAL", + /* 185 */ "input", + /* 186 */ "cmdlist", + /* 187 */ "ecmd", + /* 188 */ "cmdx", + /* 189 */ "explain", + /* 190 */ "cmd", + /* 191 */ "transtype", + /* 192 */ "trans_opt", + /* 193 */ "nm", + /* 194 */ "savepoint_opt", + /* 195 */ "create_table", + /* 196 */ "create_table_args", + /* 197 */ "createkw", + /* 198 */ "temp", + /* 199 */ "ifnotexists", + /* 200 */ "dbnm", + /* 201 */ "columnlist", + /* 202 */ "conslist_opt", + /* 203 */ "table_option_set", + /* 204 */ "select", + /* 205 */ "table_option", + /* 206 */ "columnname", + /* 207 */ "carglist", + /* 208 */ "typetoken", + /* 209 */ "typename", + /* 210 */ "signed", + /* 211 */ "plus_num", + /* 212 */ "minus_num", + /* 213 */ "scanpt", + /* 214 */ "scantok", + /* 215 */ "ccons", + /* 216 */ "term", + /* 217 */ "expr", + /* 218 */ "onconf", + /* 219 */ "sortorder", + /* 220 */ "autoinc", + /* 221 */ "eidlist_opt", + /* 222 */ "refargs", + /* 223 */ "defer_subclause", + /* 224 */ "generated", + /* 225 */ "refarg", + /* 226 */ "refact", + /* 227 */ "init_deferred_pred_opt", + /* 228 */ "conslist", + /* 229 */ "tconscomma", + /* 230 */ "tcons", + /* 231 */ "sortlist", + /* 232 */ "eidlist", + /* 233 */ "defer_subclause_opt", + /* 234 */ "orconf", + /* 235 */ "resolvetype", + /* 236 */ "raisetype", + /* 237 */ "ifexists", + /* 238 */ "fullname", + /* 239 */ "selectnowith", + /* 240 */ "oneselect", + /* 241 */ "wqlist", + /* 242 */ "multiselect_op", + /* 243 */ "distinct", + /* 244 */ "selcollist", + /* 245 */ "from", + /* 246 */ "where_opt", + /* 247 */ "groupby_opt", + /* 248 */ "having_opt", + /* 249 */ "orderby_opt", + /* 250 */ "limit_opt", + /* 251 */ "window_clause", + /* 252 */ "values", + /* 253 */ "nexprlist", + /* 254 */ "sclp", + /* 255 */ "as", + /* 256 */ "seltablist", + /* 257 */ "stl_prefix", + /* 258 */ "joinop", + /* 259 */ "indexed_opt", + /* 260 */ "on_opt", + /* 261 */ "using_opt", + /* 262 */ "exprlist", + /* 263 */ "xfullname", + /* 264 */ "idlist", + /* 265 */ "nulls", + /* 266 */ "with", + /* 267 */ "where_opt_ret", + /* 268 */ "setlist", + /* 269 */ "insert_cmd", + /* 270 */ "idlist_opt", + /* 271 */ "upsert", + /* 272 */ "returning", + /* 273 */ "filter_over", + /* 274 */ "likeop", + /* 275 */ "between_op", + /* 276 */ "in_op", + /* 277 */ "paren_exprlist", + /* 278 */ "case_operand", + /* 279 */ "case_exprlist", + /* 280 */ "case_else", + /* 281 */ "uniqueflag", + /* 282 */ "collate", + /* 283 */ "vinto", + /* 284 */ "nmnum", + /* 285 */ "trigger_decl", + /* 286 */ "trigger_cmd_list", + /* 287 */ "trigger_time", + /* 288 */ "trigger_event", + /* 289 */ "foreach_clause", + /* 290 */ "when_clause", + /* 291 */ "trigger_cmd", + /* 292 */ "trnm", + /* 293 */ "tridxby", + /* 294 */ "database_kw_opt", + /* 295 */ "key_opt", + /* 296 */ "add_column_fullname", + /* 297 */ "kwcolumn_opt", + /* 298 */ "create_vtab", + /* 299 */ "vtabarglist", + /* 300 */ "vtabarg", + /* 301 */ "vtabargtoken", + /* 302 */ "lp", + /* 303 */ "anylist", + /* 304 */ "wqitem", + /* 305 */ "wqas", + /* 306 */ "windowdefn_list", + /* 307 */ "windowdefn", + /* 308 */ "window", + /* 309 */ "frame_opt", + /* 310 */ "part_opt", + /* 311 */ "filter_clause", + /* 312 */ "over_clause", + /* 313 */ "range_or_rows", + /* 314 */ "frame_bound", + /* 315 */ "frame_bound_s", + /* 316 */ "frame_bound_e", + /* 317 */ "frame_exclude_opt", + /* 318 */ "frame_exclude", }; #endif /* defined(YYCOVERAGE) || !defined(NDEBUG) */ @@ -161481,195 +163372,196 @@ static const char *const yyRuleName[] = { /* 209 */ "expr ::= NOT expr", /* 210 */ "expr ::= BITNOT expr", /* 211 */ "expr ::= PLUS|MINUS expr", - /* 212 */ "between_op ::= BETWEEN", - /* 213 */ "between_op ::= NOT BETWEEN", - /* 214 */ "expr ::= expr between_op expr AND expr", - /* 215 */ "in_op ::= IN", - /* 216 */ "in_op ::= NOT IN", - /* 217 */ "expr ::= expr in_op LP exprlist RP", - /* 218 */ "expr ::= LP select RP", - /* 219 */ "expr ::= expr in_op LP select RP", - /* 220 */ "expr ::= expr in_op nm dbnm paren_exprlist", - /* 221 */ "expr ::= EXISTS LP select RP", - /* 222 */ "expr ::= CASE case_operand case_exprlist case_else END", - /* 223 */ "case_exprlist ::= case_exprlist WHEN expr THEN expr", - /* 224 */ "case_exprlist ::= WHEN expr THEN expr", - /* 225 */ "case_else ::= ELSE expr", - /* 226 */ "case_else ::=", - /* 227 */ "case_operand ::= expr", - /* 228 */ "case_operand ::=", - /* 229 */ "exprlist ::=", - /* 230 */ "nexprlist ::= nexprlist COMMA expr", - /* 231 */ "nexprlist ::= expr", - /* 232 */ "paren_exprlist ::=", - /* 233 */ "paren_exprlist ::= LP exprlist RP", - /* 234 */ "cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt", - /* 235 */ "uniqueflag ::= UNIQUE", - /* 236 */ "uniqueflag ::=", - /* 237 */ "eidlist_opt ::=", - /* 238 */ "eidlist_opt ::= LP eidlist RP", - /* 239 */ "eidlist ::= eidlist COMMA nm collate sortorder", - /* 240 */ "eidlist ::= nm collate sortorder", - /* 241 */ "collate ::=", - /* 242 */ "collate ::= COLLATE ID|STRING", - /* 243 */ "cmd ::= DROP INDEX ifexists fullname", - /* 244 */ "cmd ::= VACUUM vinto", - /* 245 */ "cmd ::= VACUUM nm vinto", - /* 246 */ "vinto ::= INTO expr", - /* 247 */ "vinto ::=", - /* 248 */ "cmd ::= PRAGMA nm dbnm", - /* 249 */ "cmd ::= PRAGMA nm dbnm EQ nmnum", - /* 250 */ "cmd ::= PRAGMA nm dbnm LP nmnum RP", - /* 251 */ "cmd ::= PRAGMA nm dbnm EQ minus_num", - /* 252 */ "cmd ::= PRAGMA nm dbnm LP minus_num RP", - /* 253 */ "plus_num ::= PLUS INTEGER|FLOAT", - /* 254 */ "minus_num ::= MINUS INTEGER|FLOAT", - /* 255 */ "cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END", - /* 256 */ "trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause", - /* 257 */ "trigger_time ::= BEFORE|AFTER", - /* 258 */ "trigger_time ::= INSTEAD OF", - /* 259 */ "trigger_time ::=", - /* 260 */ "trigger_event ::= DELETE|INSERT", - /* 261 */ "trigger_event ::= UPDATE", - /* 262 */ "trigger_event ::= UPDATE OF idlist", - /* 263 */ "when_clause ::=", - /* 264 */ "when_clause ::= WHEN expr", - /* 265 */ "trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI", - /* 266 */ "trigger_cmd_list ::= trigger_cmd SEMI", - /* 267 */ "trnm ::= nm DOT nm", - /* 268 */ "tridxby ::= INDEXED BY nm", - /* 269 */ "tridxby ::= NOT INDEXED", - /* 270 */ "trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist from where_opt scanpt", - /* 271 */ "trigger_cmd ::= scanpt insert_cmd INTO trnm idlist_opt select upsert scanpt", - /* 272 */ "trigger_cmd ::= DELETE FROM trnm tridxby where_opt scanpt", - /* 273 */ "trigger_cmd ::= scanpt select scanpt", - /* 274 */ "expr ::= RAISE LP IGNORE RP", - /* 275 */ "expr ::= RAISE LP raisetype COMMA nm RP", - /* 276 */ "raisetype ::= ROLLBACK", - /* 277 */ "raisetype ::= ABORT", - /* 278 */ "raisetype ::= FAIL", - /* 279 */ "cmd ::= DROP TRIGGER ifexists fullname", - /* 280 */ "cmd ::= ATTACH database_kw_opt expr AS expr key_opt", - /* 281 */ "cmd ::= DETACH database_kw_opt expr", - /* 282 */ "key_opt ::=", - /* 283 */ "key_opt ::= KEY expr", - /* 284 */ "cmd ::= REINDEX", - /* 285 */ "cmd ::= REINDEX nm dbnm", - /* 286 */ "cmd ::= ANALYZE", - /* 287 */ "cmd ::= ANALYZE nm dbnm", - /* 288 */ "cmd ::= ALTER TABLE fullname RENAME TO nm", - /* 289 */ "cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist", - /* 290 */ "cmd ::= ALTER TABLE fullname DROP kwcolumn_opt nm", - /* 291 */ "add_column_fullname ::= fullname", - /* 292 */ "cmd ::= ALTER TABLE fullname RENAME kwcolumn_opt nm TO nm", - /* 293 */ "cmd ::= create_vtab", - /* 294 */ "cmd ::= create_vtab LP vtabarglist RP", - /* 295 */ "create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm", - /* 296 */ "vtabarg ::=", - /* 297 */ "vtabargtoken ::= ANY", - /* 298 */ "vtabargtoken ::= lp anylist RP", - /* 299 */ "lp ::= LP", - /* 300 */ "with ::= WITH wqlist", - /* 301 */ "with ::= WITH RECURSIVE wqlist", - /* 302 */ "wqas ::= AS", - /* 303 */ "wqas ::= AS MATERIALIZED", - /* 304 */ "wqas ::= AS NOT MATERIALIZED", - /* 305 */ "wqitem ::= nm eidlist_opt wqas LP select RP", - /* 306 */ "wqlist ::= wqitem", - /* 307 */ "wqlist ::= wqlist COMMA wqitem", - /* 308 */ "windowdefn_list ::= windowdefn", - /* 309 */ "windowdefn_list ::= windowdefn_list COMMA windowdefn", - /* 310 */ "windowdefn ::= nm AS LP window RP", - /* 311 */ "window ::= PARTITION BY nexprlist orderby_opt frame_opt", - /* 312 */ "window ::= nm PARTITION BY nexprlist orderby_opt frame_opt", - /* 313 */ "window ::= ORDER BY sortlist frame_opt", - /* 314 */ "window ::= nm ORDER BY sortlist frame_opt", - /* 315 */ "window ::= frame_opt", - /* 316 */ "window ::= nm frame_opt", - /* 317 */ "frame_opt ::=", - /* 318 */ "frame_opt ::= range_or_rows frame_bound_s frame_exclude_opt", - /* 319 */ "frame_opt ::= range_or_rows BETWEEN frame_bound_s AND frame_bound_e frame_exclude_opt", - /* 320 */ "range_or_rows ::= RANGE|ROWS|GROUPS", - /* 321 */ "frame_bound_s ::= frame_bound", - /* 322 */ "frame_bound_s ::= UNBOUNDED PRECEDING", - /* 323 */ "frame_bound_e ::= frame_bound", - /* 324 */ "frame_bound_e ::= UNBOUNDED FOLLOWING", - /* 325 */ "frame_bound ::= expr PRECEDING|FOLLOWING", - /* 326 */ "frame_bound ::= CURRENT ROW", - /* 327 */ "frame_exclude_opt ::=", - /* 328 */ "frame_exclude_opt ::= EXCLUDE frame_exclude", - /* 329 */ "frame_exclude ::= NO OTHERS", - /* 330 */ "frame_exclude ::= CURRENT ROW", - /* 331 */ "frame_exclude ::= GROUP|TIES", - /* 332 */ "window_clause ::= WINDOW windowdefn_list", - /* 333 */ "filter_over ::= filter_clause over_clause", - /* 334 */ "filter_over ::= over_clause", - /* 335 */ "filter_over ::= filter_clause", - /* 336 */ "over_clause ::= OVER LP window RP", - /* 337 */ "over_clause ::= OVER nm", - /* 338 */ "filter_clause ::= FILTER LP WHERE expr RP", - /* 339 */ "input ::= cmdlist", - /* 340 */ "cmdlist ::= cmdlist ecmd", - /* 341 */ "cmdlist ::= ecmd", - /* 342 */ "ecmd ::= SEMI", - /* 343 */ "ecmd ::= cmdx SEMI", - /* 344 */ "ecmd ::= explain cmdx SEMI", - /* 345 */ "trans_opt ::=", - /* 346 */ "trans_opt ::= TRANSACTION", - /* 347 */ "trans_opt ::= TRANSACTION nm", - /* 348 */ "savepoint_opt ::= SAVEPOINT", - /* 349 */ "savepoint_opt ::=", - /* 350 */ "cmd ::= create_table create_table_args", - /* 351 */ "table_option_set ::= table_option", - /* 352 */ "columnlist ::= columnlist COMMA columnname carglist", - /* 353 */ "columnlist ::= columnname carglist", - /* 354 */ "nm ::= ID|INDEXED", - /* 355 */ "nm ::= STRING", - /* 356 */ "nm ::= JOIN_KW", - /* 357 */ "typetoken ::= typename", - /* 358 */ "typename ::= ID|STRING", - /* 359 */ "signed ::= plus_num", - /* 360 */ "signed ::= minus_num", - /* 361 */ "carglist ::= carglist ccons", - /* 362 */ "carglist ::=", - /* 363 */ "ccons ::= NULL onconf", - /* 364 */ "ccons ::= GENERATED ALWAYS AS generated", - /* 365 */ "ccons ::= AS generated", - /* 366 */ "conslist_opt ::= COMMA conslist", - /* 367 */ "conslist ::= conslist tconscomma tcons", - /* 368 */ "conslist ::= tcons", - /* 369 */ "tconscomma ::=", - /* 370 */ "defer_subclause_opt ::= defer_subclause", - /* 371 */ "resolvetype ::= raisetype", - /* 372 */ "selectnowith ::= oneselect", - /* 373 */ "oneselect ::= values", - /* 374 */ "sclp ::= selcollist COMMA", - /* 375 */ "as ::= ID|STRING", - /* 376 */ "returning ::=", - /* 377 */ "expr ::= term", - /* 378 */ "likeop ::= LIKE_KW|MATCH", - /* 379 */ "exprlist ::= nexprlist", - /* 380 */ "nmnum ::= plus_num", - /* 381 */ "nmnum ::= nm", - /* 382 */ "nmnum ::= ON", - /* 383 */ "nmnum ::= DELETE", - /* 384 */ "nmnum ::= DEFAULT", - /* 385 */ "plus_num ::= INTEGER|FLOAT", - /* 386 */ "foreach_clause ::=", - /* 387 */ "foreach_clause ::= FOR EACH ROW", - /* 388 */ "trnm ::= nm", - /* 389 */ "tridxby ::=", - /* 390 */ "database_kw_opt ::= DATABASE", - /* 391 */ "database_kw_opt ::=", - /* 392 */ "kwcolumn_opt ::=", - /* 393 */ "kwcolumn_opt ::= COLUMNKW", - /* 394 */ "vtabarglist ::= vtabarg", - /* 395 */ "vtabarglist ::= vtabarglist COMMA vtabarg", - /* 396 */ "vtabarg ::= vtabarg vtabargtoken", - /* 397 */ "anylist ::=", - /* 398 */ "anylist ::= anylist LP anylist RP", - /* 399 */ "anylist ::= anylist ANY", - /* 400 */ "with ::=", + /* 212 */ "expr ::= expr PTR expr", + /* 213 */ "between_op ::= BETWEEN", + /* 214 */ "between_op ::= NOT BETWEEN", + /* 215 */ "expr ::= expr between_op expr AND expr", + /* 216 */ "in_op ::= IN", + /* 217 */ "in_op ::= NOT IN", + /* 218 */ "expr ::= expr in_op LP exprlist RP", + /* 219 */ "expr ::= LP select RP", + /* 220 */ "expr ::= expr in_op LP select RP", + /* 221 */ "expr ::= expr in_op nm dbnm paren_exprlist", + /* 222 */ "expr ::= EXISTS LP select RP", + /* 223 */ "expr ::= CASE case_operand case_exprlist case_else END", + /* 224 */ "case_exprlist ::= case_exprlist WHEN expr THEN expr", + /* 225 */ "case_exprlist ::= WHEN expr THEN expr", + /* 226 */ "case_else ::= ELSE expr", + /* 227 */ "case_else ::=", + /* 228 */ "case_operand ::= expr", + /* 229 */ "case_operand ::=", + /* 230 */ "exprlist ::=", + /* 231 */ "nexprlist ::= nexprlist COMMA expr", + /* 232 */ "nexprlist ::= expr", + /* 233 */ "paren_exprlist ::=", + /* 234 */ "paren_exprlist ::= LP exprlist RP", + /* 235 */ "cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt", + /* 236 */ "uniqueflag ::= UNIQUE", + /* 237 */ "uniqueflag ::=", + /* 238 */ "eidlist_opt ::=", + /* 239 */ "eidlist_opt ::= LP eidlist RP", + /* 240 */ "eidlist ::= eidlist COMMA nm collate sortorder", + /* 241 */ "eidlist ::= nm collate sortorder", + /* 242 */ "collate ::=", + /* 243 */ "collate ::= COLLATE ID|STRING", + /* 244 */ "cmd ::= DROP INDEX ifexists fullname", + /* 245 */ "cmd ::= VACUUM vinto", + /* 246 */ "cmd ::= VACUUM nm vinto", + /* 247 */ "vinto ::= INTO expr", + /* 248 */ "vinto ::=", + /* 249 */ "cmd ::= PRAGMA nm dbnm", + /* 250 */ "cmd ::= PRAGMA nm dbnm EQ nmnum", + /* 251 */ "cmd ::= PRAGMA nm dbnm LP nmnum RP", + /* 252 */ "cmd ::= PRAGMA nm dbnm EQ minus_num", + /* 253 */ "cmd ::= PRAGMA nm dbnm LP minus_num RP", + /* 254 */ "plus_num ::= PLUS INTEGER|FLOAT", + /* 255 */ "minus_num ::= MINUS INTEGER|FLOAT", + /* 256 */ "cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END", + /* 257 */ "trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause", + /* 258 */ "trigger_time ::= BEFORE|AFTER", + /* 259 */ "trigger_time ::= INSTEAD OF", + /* 260 */ "trigger_time ::=", + /* 261 */ "trigger_event ::= DELETE|INSERT", + /* 262 */ "trigger_event ::= UPDATE", + /* 263 */ "trigger_event ::= UPDATE OF idlist", + /* 264 */ "when_clause ::=", + /* 265 */ "when_clause ::= WHEN expr", + /* 266 */ "trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI", + /* 267 */ "trigger_cmd_list ::= trigger_cmd SEMI", + /* 268 */ "trnm ::= nm DOT nm", + /* 269 */ "tridxby ::= INDEXED BY nm", + /* 270 */ "tridxby ::= NOT INDEXED", + /* 271 */ "trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist from where_opt scanpt", + /* 272 */ "trigger_cmd ::= scanpt insert_cmd INTO trnm idlist_opt select upsert scanpt", + /* 273 */ "trigger_cmd ::= DELETE FROM trnm tridxby where_opt scanpt", + /* 274 */ "trigger_cmd ::= scanpt select scanpt", + /* 275 */ "expr ::= RAISE LP IGNORE RP", + /* 276 */ "expr ::= RAISE LP raisetype COMMA nm RP", + /* 277 */ "raisetype ::= ROLLBACK", + /* 278 */ "raisetype ::= ABORT", + /* 279 */ "raisetype ::= FAIL", + /* 280 */ "cmd ::= DROP TRIGGER ifexists fullname", + /* 281 */ "cmd ::= ATTACH database_kw_opt expr AS expr key_opt", + /* 282 */ "cmd ::= DETACH database_kw_opt expr", + /* 283 */ "key_opt ::=", + /* 284 */ "key_opt ::= KEY expr", + /* 285 */ "cmd ::= REINDEX", + /* 286 */ "cmd ::= REINDEX nm dbnm", + /* 287 */ "cmd ::= ANALYZE", + /* 288 */ "cmd ::= ANALYZE nm dbnm", + /* 289 */ "cmd ::= ALTER TABLE fullname RENAME TO nm", + /* 290 */ "cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist", + /* 291 */ "cmd ::= ALTER TABLE fullname DROP kwcolumn_opt nm", + /* 292 */ "add_column_fullname ::= fullname", + /* 293 */ "cmd ::= ALTER TABLE fullname RENAME kwcolumn_opt nm TO nm", + /* 294 */ "cmd ::= create_vtab", + /* 295 */ "cmd ::= create_vtab LP vtabarglist RP", + /* 296 */ "create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm", + /* 297 */ "vtabarg ::=", + /* 298 */ "vtabargtoken ::= ANY", + /* 299 */ "vtabargtoken ::= lp anylist RP", + /* 300 */ "lp ::= LP", + /* 301 */ "with ::= WITH wqlist", + /* 302 */ "with ::= WITH RECURSIVE wqlist", + /* 303 */ "wqas ::= AS", + /* 304 */ "wqas ::= AS MATERIALIZED", + /* 305 */ "wqas ::= AS NOT MATERIALIZED", + /* 306 */ "wqitem ::= nm eidlist_opt wqas LP select RP", + /* 307 */ "wqlist ::= wqitem", + /* 308 */ "wqlist ::= wqlist COMMA wqitem", + /* 309 */ "windowdefn_list ::= windowdefn", + /* 310 */ "windowdefn_list ::= windowdefn_list COMMA windowdefn", + /* 311 */ "windowdefn ::= nm AS LP window RP", + /* 312 */ "window ::= PARTITION BY nexprlist orderby_opt frame_opt", + /* 313 */ "window ::= nm PARTITION BY nexprlist orderby_opt frame_opt", + /* 314 */ "window ::= ORDER BY sortlist frame_opt", + /* 315 */ "window ::= nm ORDER BY sortlist frame_opt", + /* 316 */ "window ::= frame_opt", + /* 317 */ "window ::= nm frame_opt", + /* 318 */ "frame_opt ::=", + /* 319 */ "frame_opt ::= range_or_rows frame_bound_s frame_exclude_opt", + /* 320 */ "frame_opt ::= range_or_rows BETWEEN frame_bound_s AND frame_bound_e frame_exclude_opt", + /* 321 */ "range_or_rows ::= RANGE|ROWS|GROUPS", + /* 322 */ "frame_bound_s ::= frame_bound", + /* 323 */ "frame_bound_s ::= UNBOUNDED PRECEDING", + /* 324 */ "frame_bound_e ::= frame_bound", + /* 325 */ "frame_bound_e ::= UNBOUNDED FOLLOWING", + /* 326 */ "frame_bound ::= expr PRECEDING|FOLLOWING", + /* 327 */ "frame_bound ::= CURRENT ROW", + /* 328 */ "frame_exclude_opt ::=", + /* 329 */ "frame_exclude_opt ::= EXCLUDE frame_exclude", + /* 330 */ "frame_exclude ::= NO OTHERS", + /* 331 */ "frame_exclude ::= CURRENT ROW", + /* 332 */ "frame_exclude ::= GROUP|TIES", + /* 333 */ "window_clause ::= WINDOW windowdefn_list", + /* 334 */ "filter_over ::= filter_clause over_clause", + /* 335 */ "filter_over ::= over_clause", + /* 336 */ "filter_over ::= filter_clause", + /* 337 */ "over_clause ::= OVER LP window RP", + /* 338 */ "over_clause ::= OVER nm", + /* 339 */ "filter_clause ::= FILTER LP WHERE expr RP", + /* 340 */ "input ::= cmdlist", + /* 341 */ "cmdlist ::= cmdlist ecmd", + /* 342 */ "cmdlist ::= ecmd", + /* 343 */ "ecmd ::= SEMI", + /* 344 */ "ecmd ::= cmdx SEMI", + /* 345 */ "ecmd ::= explain cmdx SEMI", + /* 346 */ "trans_opt ::=", + /* 347 */ "trans_opt ::= TRANSACTION", + /* 348 */ "trans_opt ::= TRANSACTION nm", + /* 349 */ "savepoint_opt ::= SAVEPOINT", + /* 350 */ "savepoint_opt ::=", + /* 351 */ "cmd ::= create_table create_table_args", + /* 352 */ "table_option_set ::= table_option", + /* 353 */ "columnlist ::= columnlist COMMA columnname carglist", + /* 354 */ "columnlist ::= columnname carglist", + /* 355 */ "nm ::= ID|INDEXED", + /* 356 */ "nm ::= STRING", + /* 357 */ "nm ::= JOIN_KW", + /* 358 */ "typetoken ::= typename", + /* 359 */ "typename ::= ID|STRING", + /* 360 */ "signed ::= plus_num", + /* 361 */ "signed ::= minus_num", + /* 362 */ "carglist ::= carglist ccons", + /* 363 */ "carglist ::=", + /* 364 */ "ccons ::= NULL onconf", + /* 365 */ "ccons ::= GENERATED ALWAYS AS generated", + /* 366 */ "ccons ::= AS generated", + /* 367 */ "conslist_opt ::= COMMA conslist", + /* 368 */ "conslist ::= conslist tconscomma tcons", + /* 369 */ "conslist ::= tcons", + /* 370 */ "tconscomma ::=", + /* 371 */ "defer_subclause_opt ::= defer_subclause", + /* 372 */ "resolvetype ::= raisetype", + /* 373 */ "selectnowith ::= oneselect", + /* 374 */ "oneselect ::= values", + /* 375 */ "sclp ::= selcollist COMMA", + /* 376 */ "as ::= ID|STRING", + /* 377 */ "returning ::=", + /* 378 */ "expr ::= term", + /* 379 */ "likeop ::= LIKE_KW|MATCH", + /* 380 */ "exprlist ::= nexprlist", + /* 381 */ "nmnum ::= plus_num", + /* 382 */ "nmnum ::= nm", + /* 383 */ "nmnum ::= ON", + /* 384 */ "nmnum ::= DELETE", + /* 385 */ "nmnum ::= DEFAULT", + /* 386 */ "plus_num ::= INTEGER|FLOAT", + /* 387 */ "foreach_clause ::=", + /* 388 */ "foreach_clause ::= FOR EACH ROW", + /* 389 */ "trnm ::= nm", + /* 390 */ "tridxby ::=", + /* 391 */ "database_kw_opt ::= DATABASE", + /* 392 */ "database_kw_opt ::=", + /* 393 */ "kwcolumn_opt ::=", + /* 394 */ "kwcolumn_opt ::= COLUMNKW", + /* 395 */ "vtabarglist ::= vtabarg", + /* 396 */ "vtabarglist ::= vtabarglist COMMA vtabarg", + /* 397 */ "vtabarg ::= vtabarg vtabargtoken", + /* 398 */ "anylist ::=", + /* 399 */ "anylist ::= anylist LP anylist RP", + /* 400 */ "anylist ::= anylist ANY", + /* 401 */ "with ::=", }; #endif /* NDEBUG */ @@ -161795,99 +163687,99 @@ static void yy_destructor( ** inside the C code. */ /********* Begin destructor definitions ***************************************/ - case 203: /* select */ - case 238: /* selectnowith */ - case 239: /* oneselect */ - case 251: /* values */ + case 204: /* select */ + case 239: /* selectnowith */ + case 240: /* oneselect */ + case 252: /* values */ { -sqlite3SelectDelete(pParse->db, (yypminor->yy303)); -} - break; - case 215: /* term */ - case 216: /* expr */ - case 245: /* where_opt */ - case 247: /* having_opt */ - case 259: /* on_opt */ - case 266: /* where_opt_ret */ - case 277: /* case_operand */ - case 279: /* case_else */ - case 282: /* vinto */ - case 289: /* when_clause */ - case 294: /* key_opt */ - case 310: /* filter_clause */ +sqlite3SelectDelete(pParse->db, (yypminor->yy47)); +} + break; + case 216: /* term */ + case 217: /* expr */ + case 246: /* where_opt */ + case 248: /* having_opt */ + case 260: /* on_opt */ + case 267: /* where_opt_ret */ + case 278: /* case_operand */ + case 280: /* case_else */ + case 283: /* vinto */ + case 290: /* when_clause */ + case 295: /* key_opt */ + case 311: /* filter_clause */ { -sqlite3ExprDelete(pParse->db, (yypminor->yy626)); -} - break; - case 220: /* eidlist_opt */ - case 230: /* sortlist */ - case 231: /* eidlist */ - case 243: /* selcollist */ - case 246: /* groupby_opt */ - case 248: /* orderby_opt */ - case 252: /* nexprlist */ - case 253: /* sclp */ - case 261: /* exprlist */ - case 267: /* setlist */ - case 276: /* paren_exprlist */ - case 278: /* case_exprlist */ - case 309: /* part_opt */ +sqlite3ExprDelete(pParse->db, (yypminor->yy528)); +} + break; + case 221: /* eidlist_opt */ + case 231: /* sortlist */ + case 232: /* eidlist */ + case 244: /* selcollist */ + case 247: /* groupby_opt */ + case 249: /* orderby_opt */ + case 253: /* nexprlist */ + case 254: /* sclp */ + case 262: /* exprlist */ + case 268: /* setlist */ + case 277: /* paren_exprlist */ + case 279: /* case_exprlist */ + case 310: /* part_opt */ { -sqlite3ExprListDelete(pParse->db, (yypminor->yy562)); +sqlite3ExprListDelete(pParse->db, (yypminor->yy322)); } break; - case 237: /* fullname */ - case 244: /* from */ - case 255: /* seltablist */ - case 256: /* stl_prefix */ - case 262: /* xfullname */ + case 238: /* fullname */ + case 245: /* from */ + case 256: /* seltablist */ + case 257: /* stl_prefix */ + case 263: /* xfullname */ { -sqlite3SrcListDelete(pParse->db, (yypminor->yy607)); +sqlite3SrcListDelete(pParse->db, (yypminor->yy131)); } break; - case 240: /* wqlist */ + case 241: /* wqlist */ { -sqlite3WithDelete(pParse->db, (yypminor->yy43)); +sqlite3WithDelete(pParse->db, (yypminor->yy521)); } break; - case 250: /* window_clause */ - case 305: /* windowdefn_list */ + case 251: /* window_clause */ + case 306: /* windowdefn_list */ { -sqlite3WindowListDelete(pParse->db, (yypminor->yy375)); +sqlite3WindowListDelete(pParse->db, (yypminor->yy41)); } break; - case 260: /* using_opt */ - case 263: /* idlist */ - case 269: /* idlist_opt */ + case 261: /* using_opt */ + case 264: /* idlist */ + case 270: /* idlist_opt */ { -sqlite3IdListDelete(pParse->db, (yypminor->yy240)); +sqlite3IdListDelete(pParse->db, (yypminor->yy254)); } break; - case 272: /* filter_over */ - case 306: /* windowdefn */ - case 307: /* window */ - case 308: /* frame_opt */ - case 311: /* over_clause */ + case 273: /* filter_over */ + case 307: /* windowdefn */ + case 308: /* window */ + case 309: /* frame_opt */ + case 312: /* over_clause */ { -sqlite3WindowDelete(pParse->db, (yypminor->yy375)); +sqlite3WindowDelete(pParse->db, (yypminor->yy41)); } break; - case 285: /* trigger_cmd_list */ - case 290: /* trigger_cmd */ + case 286: /* trigger_cmd_list */ + case 291: /* trigger_cmd */ { -sqlite3DeleteTriggerStep(pParse->db, (yypminor->yy95)); +sqlite3DeleteTriggerStep(pParse->db, (yypminor->yy33)); } break; - case 287: /* trigger_event */ + case 288: /* trigger_event */ { -sqlite3IdListDelete(pParse->db, (yypminor->yy570).b); +sqlite3IdListDelete(pParse->db, (yypminor->yy180).b); } break; - case 313: /* frame_bound */ - case 314: /* frame_bound_s */ - case 315: /* frame_bound_e */ + case 314: /* frame_bound */ + case 315: /* frame_bound_s */ + case 316: /* frame_bound_e */ { -sqlite3ExprDelete(pParse->db, (yypminor->yy81).pExpr); +sqlite3ExprDelete(pParse->db, (yypminor->yy595).pExpr); } break; /********* End destructor definitions *****************************************/ @@ -162178,407 +164070,408 @@ static void yy_shift( /* For rule J, yyRuleInfoLhs[J] contains the symbol on the left-hand side ** of that rule */ static const YYCODETYPE yyRuleInfoLhs[] = { - 188, /* (0) explain ::= EXPLAIN */ - 188, /* (1) explain ::= EXPLAIN QUERY PLAN */ - 187, /* (2) cmdx ::= cmd */ - 189, /* (3) cmd ::= BEGIN transtype trans_opt */ - 190, /* (4) transtype ::= */ - 190, /* (5) transtype ::= DEFERRED */ - 190, /* (6) transtype ::= IMMEDIATE */ - 190, /* (7) transtype ::= EXCLUSIVE */ - 189, /* (8) cmd ::= COMMIT|END trans_opt */ - 189, /* (9) cmd ::= ROLLBACK trans_opt */ - 189, /* (10) cmd ::= SAVEPOINT nm */ - 189, /* (11) cmd ::= RELEASE savepoint_opt nm */ - 189, /* (12) cmd ::= ROLLBACK trans_opt TO savepoint_opt nm */ - 194, /* (13) create_table ::= createkw temp TABLE ifnotexists nm dbnm */ - 196, /* (14) createkw ::= CREATE */ - 198, /* (15) ifnotexists ::= */ - 198, /* (16) ifnotexists ::= IF NOT EXISTS */ - 197, /* (17) temp ::= TEMP */ - 197, /* (18) temp ::= */ - 195, /* (19) create_table_args ::= LP columnlist conslist_opt RP table_option_set */ - 195, /* (20) create_table_args ::= AS select */ - 202, /* (21) table_option_set ::= */ - 202, /* (22) table_option_set ::= table_option_set COMMA table_option */ - 204, /* (23) table_option ::= WITHOUT nm */ - 204, /* (24) table_option ::= nm */ - 205, /* (25) columnname ::= nm typetoken */ - 207, /* (26) typetoken ::= */ - 207, /* (27) typetoken ::= typename LP signed RP */ - 207, /* (28) typetoken ::= typename LP signed COMMA signed RP */ - 208, /* (29) typename ::= typename ID|STRING */ - 212, /* (30) scanpt ::= */ - 213, /* (31) scantok ::= */ - 214, /* (32) ccons ::= CONSTRAINT nm */ - 214, /* (33) ccons ::= DEFAULT scantok term */ - 214, /* (34) ccons ::= DEFAULT LP expr RP */ - 214, /* (35) ccons ::= DEFAULT PLUS scantok term */ - 214, /* (36) ccons ::= DEFAULT MINUS scantok term */ - 214, /* (37) ccons ::= DEFAULT scantok ID|INDEXED */ - 214, /* (38) ccons ::= NOT NULL onconf */ - 214, /* (39) ccons ::= PRIMARY KEY sortorder onconf autoinc */ - 214, /* (40) ccons ::= UNIQUE onconf */ - 214, /* (41) ccons ::= CHECK LP expr RP */ - 214, /* (42) ccons ::= REFERENCES nm eidlist_opt refargs */ - 214, /* (43) ccons ::= defer_subclause */ - 214, /* (44) ccons ::= COLLATE ID|STRING */ - 223, /* (45) generated ::= LP expr RP */ - 223, /* (46) generated ::= LP expr RP ID */ - 219, /* (47) autoinc ::= */ - 219, /* (48) autoinc ::= AUTOINCR */ - 221, /* (49) refargs ::= */ - 221, /* (50) refargs ::= refargs refarg */ - 224, /* (51) refarg ::= MATCH nm */ - 224, /* (52) refarg ::= ON INSERT refact */ - 224, /* (53) refarg ::= ON DELETE refact */ - 224, /* (54) refarg ::= ON UPDATE refact */ - 225, /* (55) refact ::= SET NULL */ - 225, /* (56) refact ::= SET DEFAULT */ - 225, /* (57) refact ::= CASCADE */ - 225, /* (58) refact ::= RESTRICT */ - 225, /* (59) refact ::= NO ACTION */ - 222, /* (60) defer_subclause ::= NOT DEFERRABLE init_deferred_pred_opt */ - 222, /* (61) defer_subclause ::= DEFERRABLE init_deferred_pred_opt */ - 226, /* (62) init_deferred_pred_opt ::= */ - 226, /* (63) init_deferred_pred_opt ::= INITIALLY DEFERRED */ - 226, /* (64) init_deferred_pred_opt ::= INITIALLY IMMEDIATE */ - 201, /* (65) conslist_opt ::= */ - 228, /* (66) tconscomma ::= COMMA */ - 229, /* (67) tcons ::= CONSTRAINT nm */ - 229, /* (68) tcons ::= PRIMARY KEY LP sortlist autoinc RP onconf */ - 229, /* (69) tcons ::= UNIQUE LP sortlist RP onconf */ - 229, /* (70) tcons ::= CHECK LP expr RP onconf */ - 229, /* (71) tcons ::= FOREIGN KEY LP eidlist RP REFERENCES nm eidlist_opt refargs defer_subclause_opt */ - 232, /* (72) defer_subclause_opt ::= */ - 217, /* (73) onconf ::= */ - 217, /* (74) onconf ::= ON CONFLICT resolvetype */ - 233, /* (75) orconf ::= */ - 233, /* (76) orconf ::= OR resolvetype */ - 234, /* (77) resolvetype ::= IGNORE */ - 234, /* (78) resolvetype ::= REPLACE */ - 189, /* (79) cmd ::= DROP TABLE ifexists fullname */ - 236, /* (80) ifexists ::= IF EXISTS */ - 236, /* (81) ifexists ::= */ - 189, /* (82) cmd ::= createkw temp VIEW ifnotexists nm dbnm eidlist_opt AS select */ - 189, /* (83) cmd ::= DROP VIEW ifexists fullname */ - 189, /* (84) cmd ::= select */ - 203, /* (85) select ::= WITH wqlist selectnowith */ - 203, /* (86) select ::= WITH RECURSIVE wqlist selectnowith */ - 203, /* (87) select ::= selectnowith */ - 238, /* (88) selectnowith ::= selectnowith multiselect_op oneselect */ - 241, /* (89) multiselect_op ::= UNION */ - 241, /* (90) multiselect_op ::= UNION ALL */ - 241, /* (91) multiselect_op ::= EXCEPT|INTERSECT */ - 239, /* (92) oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt orderby_opt limit_opt */ - 239, /* (93) oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt window_clause orderby_opt limit_opt */ - 251, /* (94) values ::= VALUES LP nexprlist RP */ - 251, /* (95) values ::= values COMMA LP nexprlist RP */ - 242, /* (96) distinct ::= DISTINCT */ - 242, /* (97) distinct ::= ALL */ - 242, /* (98) distinct ::= */ - 253, /* (99) sclp ::= */ - 243, /* (100) selcollist ::= sclp scanpt expr scanpt as */ - 243, /* (101) selcollist ::= sclp scanpt STAR */ - 243, /* (102) selcollist ::= sclp scanpt nm DOT STAR */ - 254, /* (103) as ::= AS nm */ - 254, /* (104) as ::= */ - 244, /* (105) from ::= */ - 244, /* (106) from ::= FROM seltablist */ - 256, /* (107) stl_prefix ::= seltablist joinop */ - 256, /* (108) stl_prefix ::= */ - 255, /* (109) seltablist ::= stl_prefix nm dbnm as indexed_opt on_opt using_opt */ - 255, /* (110) seltablist ::= stl_prefix nm dbnm LP exprlist RP as on_opt using_opt */ - 255, /* (111) seltablist ::= stl_prefix LP select RP as on_opt using_opt */ - 255, /* (112) seltablist ::= stl_prefix LP seltablist RP as on_opt using_opt */ - 199, /* (113) dbnm ::= */ - 199, /* (114) dbnm ::= DOT nm */ - 237, /* (115) fullname ::= nm */ - 237, /* (116) fullname ::= nm DOT nm */ - 262, /* (117) xfullname ::= nm */ - 262, /* (118) xfullname ::= nm DOT nm */ - 262, /* (119) xfullname ::= nm DOT nm AS nm */ - 262, /* (120) xfullname ::= nm AS nm */ - 257, /* (121) joinop ::= COMMA|JOIN */ - 257, /* (122) joinop ::= JOIN_KW JOIN */ - 257, /* (123) joinop ::= JOIN_KW nm JOIN */ - 257, /* (124) joinop ::= JOIN_KW nm nm JOIN */ - 259, /* (125) on_opt ::= ON expr */ - 259, /* (126) on_opt ::= */ - 258, /* (127) indexed_opt ::= */ - 258, /* (128) indexed_opt ::= INDEXED BY nm */ - 258, /* (129) indexed_opt ::= NOT INDEXED */ - 260, /* (130) using_opt ::= USING LP idlist RP */ - 260, /* (131) using_opt ::= */ - 248, /* (132) orderby_opt ::= */ - 248, /* (133) orderby_opt ::= ORDER BY sortlist */ - 230, /* (134) sortlist ::= sortlist COMMA expr sortorder nulls */ - 230, /* (135) sortlist ::= expr sortorder nulls */ - 218, /* (136) sortorder ::= ASC */ - 218, /* (137) sortorder ::= DESC */ - 218, /* (138) sortorder ::= */ - 264, /* (139) nulls ::= NULLS FIRST */ - 264, /* (140) nulls ::= NULLS LAST */ - 264, /* (141) nulls ::= */ - 246, /* (142) groupby_opt ::= */ - 246, /* (143) groupby_opt ::= GROUP BY nexprlist */ - 247, /* (144) having_opt ::= */ - 247, /* (145) having_opt ::= HAVING expr */ - 249, /* (146) limit_opt ::= */ - 249, /* (147) limit_opt ::= LIMIT expr */ - 249, /* (148) limit_opt ::= LIMIT expr OFFSET expr */ - 249, /* (149) limit_opt ::= LIMIT expr COMMA expr */ - 189, /* (150) cmd ::= with DELETE FROM xfullname indexed_opt where_opt_ret */ - 245, /* (151) where_opt ::= */ - 245, /* (152) where_opt ::= WHERE expr */ - 266, /* (153) where_opt_ret ::= */ - 266, /* (154) where_opt_ret ::= WHERE expr */ - 266, /* (155) where_opt_ret ::= RETURNING selcollist */ - 266, /* (156) where_opt_ret ::= WHERE expr RETURNING selcollist */ - 189, /* (157) cmd ::= with UPDATE orconf xfullname indexed_opt SET setlist from where_opt_ret */ - 267, /* (158) setlist ::= setlist COMMA nm EQ expr */ - 267, /* (159) setlist ::= setlist COMMA LP idlist RP EQ expr */ - 267, /* (160) setlist ::= nm EQ expr */ - 267, /* (161) setlist ::= LP idlist RP EQ expr */ - 189, /* (162) cmd ::= with insert_cmd INTO xfullname idlist_opt select upsert */ - 189, /* (163) cmd ::= with insert_cmd INTO xfullname idlist_opt DEFAULT VALUES returning */ - 270, /* (164) upsert ::= */ - 270, /* (165) upsert ::= RETURNING selcollist */ - 270, /* (166) upsert ::= ON CONFLICT LP sortlist RP where_opt DO UPDATE SET setlist where_opt upsert */ - 270, /* (167) upsert ::= ON CONFLICT LP sortlist RP where_opt DO NOTHING upsert */ - 270, /* (168) upsert ::= ON CONFLICT DO NOTHING returning */ - 270, /* (169) upsert ::= ON CONFLICT DO UPDATE SET setlist where_opt returning */ - 271, /* (170) returning ::= RETURNING selcollist */ - 268, /* (171) insert_cmd ::= INSERT orconf */ - 268, /* (172) insert_cmd ::= REPLACE */ - 269, /* (173) idlist_opt ::= */ - 269, /* (174) idlist_opt ::= LP idlist RP */ - 263, /* (175) idlist ::= idlist COMMA nm */ - 263, /* (176) idlist ::= nm */ - 216, /* (177) expr ::= LP expr RP */ - 216, /* (178) expr ::= ID|INDEXED */ - 216, /* (179) expr ::= JOIN_KW */ - 216, /* (180) expr ::= nm DOT nm */ - 216, /* (181) expr ::= nm DOT nm DOT nm */ - 215, /* (182) term ::= NULL|FLOAT|BLOB */ - 215, /* (183) term ::= STRING */ - 215, /* (184) term ::= INTEGER */ - 216, /* (185) expr ::= VARIABLE */ - 216, /* (186) expr ::= expr COLLATE ID|STRING */ - 216, /* (187) expr ::= CAST LP expr AS typetoken RP */ - 216, /* (188) expr ::= ID|INDEXED LP distinct exprlist RP */ - 216, /* (189) expr ::= ID|INDEXED LP STAR RP */ - 216, /* (190) expr ::= ID|INDEXED LP distinct exprlist RP filter_over */ - 216, /* (191) expr ::= ID|INDEXED LP STAR RP filter_over */ - 215, /* (192) term ::= CTIME_KW */ - 216, /* (193) expr ::= LP nexprlist COMMA expr RP */ - 216, /* (194) expr ::= expr AND expr */ - 216, /* (195) expr ::= expr OR expr */ - 216, /* (196) expr ::= expr LT|GT|GE|LE expr */ - 216, /* (197) expr ::= expr EQ|NE expr */ - 216, /* (198) expr ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr */ - 216, /* (199) expr ::= expr PLUS|MINUS expr */ - 216, /* (200) expr ::= expr STAR|SLASH|REM expr */ - 216, /* (201) expr ::= expr CONCAT expr */ - 273, /* (202) likeop ::= NOT LIKE_KW|MATCH */ - 216, /* (203) expr ::= expr likeop expr */ - 216, /* (204) expr ::= expr likeop expr ESCAPE expr */ - 216, /* (205) expr ::= expr ISNULL|NOTNULL */ - 216, /* (206) expr ::= expr NOT NULL */ - 216, /* (207) expr ::= expr IS expr */ - 216, /* (208) expr ::= expr IS NOT expr */ - 216, /* (209) expr ::= NOT expr */ - 216, /* (210) expr ::= BITNOT expr */ - 216, /* (211) expr ::= PLUS|MINUS expr */ - 274, /* (212) between_op ::= BETWEEN */ - 274, /* (213) between_op ::= NOT BETWEEN */ - 216, /* (214) expr ::= expr between_op expr AND expr */ - 275, /* (215) in_op ::= IN */ - 275, /* (216) in_op ::= NOT IN */ - 216, /* (217) expr ::= expr in_op LP exprlist RP */ - 216, /* (218) expr ::= LP select RP */ - 216, /* (219) expr ::= expr in_op LP select RP */ - 216, /* (220) expr ::= expr in_op nm dbnm paren_exprlist */ - 216, /* (221) expr ::= EXISTS LP select RP */ - 216, /* (222) expr ::= CASE case_operand case_exprlist case_else END */ - 278, /* (223) case_exprlist ::= case_exprlist WHEN expr THEN expr */ - 278, /* (224) case_exprlist ::= WHEN expr THEN expr */ - 279, /* (225) case_else ::= ELSE expr */ - 279, /* (226) case_else ::= */ - 277, /* (227) case_operand ::= expr */ - 277, /* (228) case_operand ::= */ - 261, /* (229) exprlist ::= */ - 252, /* (230) nexprlist ::= nexprlist COMMA expr */ - 252, /* (231) nexprlist ::= expr */ - 276, /* (232) paren_exprlist ::= */ - 276, /* (233) paren_exprlist ::= LP exprlist RP */ - 189, /* (234) cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt */ - 280, /* (235) uniqueflag ::= UNIQUE */ - 280, /* (236) uniqueflag ::= */ - 220, /* (237) eidlist_opt ::= */ - 220, /* (238) eidlist_opt ::= LP eidlist RP */ - 231, /* (239) eidlist ::= eidlist COMMA nm collate sortorder */ - 231, /* (240) eidlist ::= nm collate sortorder */ - 281, /* (241) collate ::= */ - 281, /* (242) collate ::= COLLATE ID|STRING */ - 189, /* (243) cmd ::= DROP INDEX ifexists fullname */ - 189, /* (244) cmd ::= VACUUM vinto */ - 189, /* (245) cmd ::= VACUUM nm vinto */ - 282, /* (246) vinto ::= INTO expr */ - 282, /* (247) vinto ::= */ - 189, /* (248) cmd ::= PRAGMA nm dbnm */ - 189, /* (249) cmd ::= PRAGMA nm dbnm EQ nmnum */ - 189, /* (250) cmd ::= PRAGMA nm dbnm LP nmnum RP */ - 189, /* (251) cmd ::= PRAGMA nm dbnm EQ minus_num */ - 189, /* (252) cmd ::= PRAGMA nm dbnm LP minus_num RP */ - 210, /* (253) plus_num ::= PLUS INTEGER|FLOAT */ - 211, /* (254) minus_num ::= MINUS INTEGER|FLOAT */ - 189, /* (255) cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END */ - 284, /* (256) trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause */ - 286, /* (257) trigger_time ::= BEFORE|AFTER */ - 286, /* (258) trigger_time ::= INSTEAD OF */ - 286, /* (259) trigger_time ::= */ - 287, /* (260) trigger_event ::= DELETE|INSERT */ - 287, /* (261) trigger_event ::= UPDATE */ - 287, /* (262) trigger_event ::= UPDATE OF idlist */ - 289, /* (263) when_clause ::= */ - 289, /* (264) when_clause ::= WHEN expr */ - 285, /* (265) trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI */ - 285, /* (266) trigger_cmd_list ::= trigger_cmd SEMI */ - 291, /* (267) trnm ::= nm DOT nm */ - 292, /* (268) tridxby ::= INDEXED BY nm */ - 292, /* (269) tridxby ::= NOT INDEXED */ - 290, /* (270) trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist from where_opt scanpt */ - 290, /* (271) trigger_cmd ::= scanpt insert_cmd INTO trnm idlist_opt select upsert scanpt */ - 290, /* (272) trigger_cmd ::= DELETE FROM trnm tridxby where_opt scanpt */ - 290, /* (273) trigger_cmd ::= scanpt select scanpt */ - 216, /* (274) expr ::= RAISE LP IGNORE RP */ - 216, /* (275) expr ::= RAISE LP raisetype COMMA nm RP */ - 235, /* (276) raisetype ::= ROLLBACK */ - 235, /* (277) raisetype ::= ABORT */ - 235, /* (278) raisetype ::= FAIL */ - 189, /* (279) cmd ::= DROP TRIGGER ifexists fullname */ - 189, /* (280) cmd ::= ATTACH database_kw_opt expr AS expr key_opt */ - 189, /* (281) cmd ::= DETACH database_kw_opt expr */ - 294, /* (282) key_opt ::= */ - 294, /* (283) key_opt ::= KEY expr */ - 189, /* (284) cmd ::= REINDEX */ - 189, /* (285) cmd ::= REINDEX nm dbnm */ - 189, /* (286) cmd ::= ANALYZE */ - 189, /* (287) cmd ::= ANALYZE nm dbnm */ - 189, /* (288) cmd ::= ALTER TABLE fullname RENAME TO nm */ - 189, /* (289) cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist */ - 189, /* (290) cmd ::= ALTER TABLE fullname DROP kwcolumn_opt nm */ - 295, /* (291) add_column_fullname ::= fullname */ - 189, /* (292) cmd ::= ALTER TABLE fullname RENAME kwcolumn_opt nm TO nm */ - 189, /* (293) cmd ::= create_vtab */ - 189, /* (294) cmd ::= create_vtab LP vtabarglist RP */ - 297, /* (295) create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm */ - 299, /* (296) vtabarg ::= */ - 300, /* (297) vtabargtoken ::= ANY */ - 300, /* (298) vtabargtoken ::= lp anylist RP */ - 301, /* (299) lp ::= LP */ - 265, /* (300) with ::= WITH wqlist */ - 265, /* (301) with ::= WITH RECURSIVE wqlist */ - 304, /* (302) wqas ::= AS */ - 304, /* (303) wqas ::= AS MATERIALIZED */ - 304, /* (304) wqas ::= AS NOT MATERIALIZED */ - 303, /* (305) wqitem ::= nm eidlist_opt wqas LP select RP */ - 240, /* (306) wqlist ::= wqitem */ - 240, /* (307) wqlist ::= wqlist COMMA wqitem */ - 305, /* (308) windowdefn_list ::= windowdefn */ - 305, /* (309) windowdefn_list ::= windowdefn_list COMMA windowdefn */ - 306, /* (310) windowdefn ::= nm AS LP window RP */ - 307, /* (311) window ::= PARTITION BY nexprlist orderby_opt frame_opt */ - 307, /* (312) window ::= nm PARTITION BY nexprlist orderby_opt frame_opt */ - 307, /* (313) window ::= ORDER BY sortlist frame_opt */ - 307, /* (314) window ::= nm ORDER BY sortlist frame_opt */ - 307, /* (315) window ::= frame_opt */ - 307, /* (316) window ::= nm frame_opt */ - 308, /* (317) frame_opt ::= */ - 308, /* (318) frame_opt ::= range_or_rows frame_bound_s frame_exclude_opt */ - 308, /* (319) frame_opt ::= range_or_rows BETWEEN frame_bound_s AND frame_bound_e frame_exclude_opt */ - 312, /* (320) range_or_rows ::= RANGE|ROWS|GROUPS */ - 314, /* (321) frame_bound_s ::= frame_bound */ - 314, /* (322) frame_bound_s ::= UNBOUNDED PRECEDING */ - 315, /* (323) frame_bound_e ::= frame_bound */ - 315, /* (324) frame_bound_e ::= UNBOUNDED FOLLOWING */ - 313, /* (325) frame_bound ::= expr PRECEDING|FOLLOWING */ - 313, /* (326) frame_bound ::= CURRENT ROW */ - 316, /* (327) frame_exclude_opt ::= */ - 316, /* (328) frame_exclude_opt ::= EXCLUDE frame_exclude */ - 317, /* (329) frame_exclude ::= NO OTHERS */ - 317, /* (330) frame_exclude ::= CURRENT ROW */ - 317, /* (331) frame_exclude ::= GROUP|TIES */ - 250, /* (332) window_clause ::= WINDOW windowdefn_list */ - 272, /* (333) filter_over ::= filter_clause over_clause */ - 272, /* (334) filter_over ::= over_clause */ - 272, /* (335) filter_over ::= filter_clause */ - 311, /* (336) over_clause ::= OVER LP window RP */ - 311, /* (337) over_clause ::= OVER nm */ - 310, /* (338) filter_clause ::= FILTER LP WHERE expr RP */ - 184, /* (339) input ::= cmdlist */ - 185, /* (340) cmdlist ::= cmdlist ecmd */ - 185, /* (341) cmdlist ::= ecmd */ - 186, /* (342) ecmd ::= SEMI */ - 186, /* (343) ecmd ::= cmdx SEMI */ - 186, /* (344) ecmd ::= explain cmdx SEMI */ - 191, /* (345) trans_opt ::= */ - 191, /* (346) trans_opt ::= TRANSACTION */ - 191, /* (347) trans_opt ::= TRANSACTION nm */ - 193, /* (348) savepoint_opt ::= SAVEPOINT */ - 193, /* (349) savepoint_opt ::= */ - 189, /* (350) cmd ::= create_table create_table_args */ - 202, /* (351) table_option_set ::= table_option */ - 200, /* (352) columnlist ::= columnlist COMMA columnname carglist */ - 200, /* (353) columnlist ::= columnname carglist */ - 192, /* (354) nm ::= ID|INDEXED */ - 192, /* (355) nm ::= STRING */ - 192, /* (356) nm ::= JOIN_KW */ - 207, /* (357) typetoken ::= typename */ - 208, /* (358) typename ::= ID|STRING */ - 209, /* (359) signed ::= plus_num */ - 209, /* (360) signed ::= minus_num */ - 206, /* (361) carglist ::= carglist ccons */ - 206, /* (362) carglist ::= */ - 214, /* (363) ccons ::= NULL onconf */ - 214, /* (364) ccons ::= GENERATED ALWAYS AS generated */ - 214, /* (365) ccons ::= AS generated */ - 201, /* (366) conslist_opt ::= COMMA conslist */ - 227, /* (367) conslist ::= conslist tconscomma tcons */ - 227, /* (368) conslist ::= tcons */ - 228, /* (369) tconscomma ::= */ - 232, /* (370) defer_subclause_opt ::= defer_subclause */ - 234, /* (371) resolvetype ::= raisetype */ - 238, /* (372) selectnowith ::= oneselect */ - 239, /* (373) oneselect ::= values */ - 253, /* (374) sclp ::= selcollist COMMA */ - 254, /* (375) as ::= ID|STRING */ - 271, /* (376) returning ::= */ - 216, /* (377) expr ::= term */ - 273, /* (378) likeop ::= LIKE_KW|MATCH */ - 261, /* (379) exprlist ::= nexprlist */ - 283, /* (380) nmnum ::= plus_num */ - 283, /* (381) nmnum ::= nm */ - 283, /* (382) nmnum ::= ON */ - 283, /* (383) nmnum ::= DELETE */ - 283, /* (384) nmnum ::= DEFAULT */ - 210, /* (385) plus_num ::= INTEGER|FLOAT */ - 288, /* (386) foreach_clause ::= */ - 288, /* (387) foreach_clause ::= FOR EACH ROW */ - 291, /* (388) trnm ::= nm */ - 292, /* (389) tridxby ::= */ - 293, /* (390) database_kw_opt ::= DATABASE */ - 293, /* (391) database_kw_opt ::= */ - 296, /* (392) kwcolumn_opt ::= */ - 296, /* (393) kwcolumn_opt ::= COLUMNKW */ - 298, /* (394) vtabarglist ::= vtabarg */ - 298, /* (395) vtabarglist ::= vtabarglist COMMA vtabarg */ - 299, /* (396) vtabarg ::= vtabarg vtabargtoken */ - 302, /* (397) anylist ::= */ - 302, /* (398) anylist ::= anylist LP anylist RP */ - 302, /* (399) anylist ::= anylist ANY */ - 265, /* (400) with ::= */ + 189, /* (0) explain ::= EXPLAIN */ + 189, /* (1) explain ::= EXPLAIN QUERY PLAN */ + 188, /* (2) cmdx ::= cmd */ + 190, /* (3) cmd ::= BEGIN transtype trans_opt */ + 191, /* (4) transtype ::= */ + 191, /* (5) transtype ::= DEFERRED */ + 191, /* (6) transtype ::= IMMEDIATE */ + 191, /* (7) transtype ::= EXCLUSIVE */ + 190, /* (8) cmd ::= COMMIT|END trans_opt */ + 190, /* (9) cmd ::= ROLLBACK trans_opt */ + 190, /* (10) cmd ::= SAVEPOINT nm */ + 190, /* (11) cmd ::= RELEASE savepoint_opt nm */ + 190, /* (12) cmd ::= ROLLBACK trans_opt TO savepoint_opt nm */ + 195, /* (13) create_table ::= createkw temp TABLE ifnotexists nm dbnm */ + 197, /* (14) createkw ::= CREATE */ + 199, /* (15) ifnotexists ::= */ + 199, /* (16) ifnotexists ::= IF NOT EXISTS */ + 198, /* (17) temp ::= TEMP */ + 198, /* (18) temp ::= */ + 196, /* (19) create_table_args ::= LP columnlist conslist_opt RP table_option_set */ + 196, /* (20) create_table_args ::= AS select */ + 203, /* (21) table_option_set ::= */ + 203, /* (22) table_option_set ::= table_option_set COMMA table_option */ + 205, /* (23) table_option ::= WITHOUT nm */ + 205, /* (24) table_option ::= nm */ + 206, /* (25) columnname ::= nm typetoken */ + 208, /* (26) typetoken ::= */ + 208, /* (27) typetoken ::= typename LP signed RP */ + 208, /* (28) typetoken ::= typename LP signed COMMA signed RP */ + 209, /* (29) typename ::= typename ID|STRING */ + 213, /* (30) scanpt ::= */ + 214, /* (31) scantok ::= */ + 215, /* (32) ccons ::= CONSTRAINT nm */ + 215, /* (33) ccons ::= DEFAULT scantok term */ + 215, /* (34) ccons ::= DEFAULT LP expr RP */ + 215, /* (35) ccons ::= DEFAULT PLUS scantok term */ + 215, /* (36) ccons ::= DEFAULT MINUS scantok term */ + 215, /* (37) ccons ::= DEFAULT scantok ID|INDEXED */ + 215, /* (38) ccons ::= NOT NULL onconf */ + 215, /* (39) ccons ::= PRIMARY KEY sortorder onconf autoinc */ + 215, /* (40) ccons ::= UNIQUE onconf */ + 215, /* (41) ccons ::= CHECK LP expr RP */ + 215, /* (42) ccons ::= REFERENCES nm eidlist_opt refargs */ + 215, /* (43) ccons ::= defer_subclause */ + 215, /* (44) ccons ::= COLLATE ID|STRING */ + 224, /* (45) generated ::= LP expr RP */ + 224, /* (46) generated ::= LP expr RP ID */ + 220, /* (47) autoinc ::= */ + 220, /* (48) autoinc ::= AUTOINCR */ + 222, /* (49) refargs ::= */ + 222, /* (50) refargs ::= refargs refarg */ + 225, /* (51) refarg ::= MATCH nm */ + 225, /* (52) refarg ::= ON INSERT refact */ + 225, /* (53) refarg ::= ON DELETE refact */ + 225, /* (54) refarg ::= ON UPDATE refact */ + 226, /* (55) refact ::= SET NULL */ + 226, /* (56) refact ::= SET DEFAULT */ + 226, /* (57) refact ::= CASCADE */ + 226, /* (58) refact ::= RESTRICT */ + 226, /* (59) refact ::= NO ACTION */ + 223, /* (60) defer_subclause ::= NOT DEFERRABLE init_deferred_pred_opt */ + 223, /* (61) defer_subclause ::= DEFERRABLE init_deferred_pred_opt */ + 227, /* (62) init_deferred_pred_opt ::= */ + 227, /* (63) init_deferred_pred_opt ::= INITIALLY DEFERRED */ + 227, /* (64) init_deferred_pred_opt ::= INITIALLY IMMEDIATE */ + 202, /* (65) conslist_opt ::= */ + 229, /* (66) tconscomma ::= COMMA */ + 230, /* (67) tcons ::= CONSTRAINT nm */ + 230, /* (68) tcons ::= PRIMARY KEY LP sortlist autoinc RP onconf */ + 230, /* (69) tcons ::= UNIQUE LP sortlist RP onconf */ + 230, /* (70) tcons ::= CHECK LP expr RP onconf */ + 230, /* (71) tcons ::= FOREIGN KEY LP eidlist RP REFERENCES nm eidlist_opt refargs defer_subclause_opt */ + 233, /* (72) defer_subclause_opt ::= */ + 218, /* (73) onconf ::= */ + 218, /* (74) onconf ::= ON CONFLICT resolvetype */ + 234, /* (75) orconf ::= */ + 234, /* (76) orconf ::= OR resolvetype */ + 235, /* (77) resolvetype ::= IGNORE */ + 235, /* (78) resolvetype ::= REPLACE */ + 190, /* (79) cmd ::= DROP TABLE ifexists fullname */ + 237, /* (80) ifexists ::= IF EXISTS */ + 237, /* (81) ifexists ::= */ + 190, /* (82) cmd ::= createkw temp VIEW ifnotexists nm dbnm eidlist_opt AS select */ + 190, /* (83) cmd ::= DROP VIEW ifexists fullname */ + 190, /* (84) cmd ::= select */ + 204, /* (85) select ::= WITH wqlist selectnowith */ + 204, /* (86) select ::= WITH RECURSIVE wqlist selectnowith */ + 204, /* (87) select ::= selectnowith */ + 239, /* (88) selectnowith ::= selectnowith multiselect_op oneselect */ + 242, /* (89) multiselect_op ::= UNION */ + 242, /* (90) multiselect_op ::= UNION ALL */ + 242, /* (91) multiselect_op ::= EXCEPT|INTERSECT */ + 240, /* (92) oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt orderby_opt limit_opt */ + 240, /* (93) oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt window_clause orderby_opt limit_opt */ + 252, /* (94) values ::= VALUES LP nexprlist RP */ + 252, /* (95) values ::= values COMMA LP nexprlist RP */ + 243, /* (96) distinct ::= DISTINCT */ + 243, /* (97) distinct ::= ALL */ + 243, /* (98) distinct ::= */ + 254, /* (99) sclp ::= */ + 244, /* (100) selcollist ::= sclp scanpt expr scanpt as */ + 244, /* (101) selcollist ::= sclp scanpt STAR */ + 244, /* (102) selcollist ::= sclp scanpt nm DOT STAR */ + 255, /* (103) as ::= AS nm */ + 255, /* (104) as ::= */ + 245, /* (105) from ::= */ + 245, /* (106) from ::= FROM seltablist */ + 257, /* (107) stl_prefix ::= seltablist joinop */ + 257, /* (108) stl_prefix ::= */ + 256, /* (109) seltablist ::= stl_prefix nm dbnm as indexed_opt on_opt using_opt */ + 256, /* (110) seltablist ::= stl_prefix nm dbnm LP exprlist RP as on_opt using_opt */ + 256, /* (111) seltablist ::= stl_prefix LP select RP as on_opt using_opt */ + 256, /* (112) seltablist ::= stl_prefix LP seltablist RP as on_opt using_opt */ + 200, /* (113) dbnm ::= */ + 200, /* (114) dbnm ::= DOT nm */ + 238, /* (115) fullname ::= nm */ + 238, /* (116) fullname ::= nm DOT nm */ + 263, /* (117) xfullname ::= nm */ + 263, /* (118) xfullname ::= nm DOT nm */ + 263, /* (119) xfullname ::= nm DOT nm AS nm */ + 263, /* (120) xfullname ::= nm AS nm */ + 258, /* (121) joinop ::= COMMA|JOIN */ + 258, /* (122) joinop ::= JOIN_KW JOIN */ + 258, /* (123) joinop ::= JOIN_KW nm JOIN */ + 258, /* (124) joinop ::= JOIN_KW nm nm JOIN */ + 260, /* (125) on_opt ::= ON expr */ + 260, /* (126) on_opt ::= */ + 259, /* (127) indexed_opt ::= */ + 259, /* (128) indexed_opt ::= INDEXED BY nm */ + 259, /* (129) indexed_opt ::= NOT INDEXED */ + 261, /* (130) using_opt ::= USING LP idlist RP */ + 261, /* (131) using_opt ::= */ + 249, /* (132) orderby_opt ::= */ + 249, /* (133) orderby_opt ::= ORDER BY sortlist */ + 231, /* (134) sortlist ::= sortlist COMMA expr sortorder nulls */ + 231, /* (135) sortlist ::= expr sortorder nulls */ + 219, /* (136) sortorder ::= ASC */ + 219, /* (137) sortorder ::= DESC */ + 219, /* (138) sortorder ::= */ + 265, /* (139) nulls ::= NULLS FIRST */ + 265, /* (140) nulls ::= NULLS LAST */ + 265, /* (141) nulls ::= */ + 247, /* (142) groupby_opt ::= */ + 247, /* (143) groupby_opt ::= GROUP BY nexprlist */ + 248, /* (144) having_opt ::= */ + 248, /* (145) having_opt ::= HAVING expr */ + 250, /* (146) limit_opt ::= */ + 250, /* (147) limit_opt ::= LIMIT expr */ + 250, /* (148) limit_opt ::= LIMIT expr OFFSET expr */ + 250, /* (149) limit_opt ::= LIMIT expr COMMA expr */ + 190, /* (150) cmd ::= with DELETE FROM xfullname indexed_opt where_opt_ret */ + 246, /* (151) where_opt ::= */ + 246, /* (152) where_opt ::= WHERE expr */ + 267, /* (153) where_opt_ret ::= */ + 267, /* (154) where_opt_ret ::= WHERE expr */ + 267, /* (155) where_opt_ret ::= RETURNING selcollist */ + 267, /* (156) where_opt_ret ::= WHERE expr RETURNING selcollist */ + 190, /* (157) cmd ::= with UPDATE orconf xfullname indexed_opt SET setlist from where_opt_ret */ + 268, /* (158) setlist ::= setlist COMMA nm EQ expr */ + 268, /* (159) setlist ::= setlist COMMA LP idlist RP EQ expr */ + 268, /* (160) setlist ::= nm EQ expr */ + 268, /* (161) setlist ::= LP idlist RP EQ expr */ + 190, /* (162) cmd ::= with insert_cmd INTO xfullname idlist_opt select upsert */ + 190, /* (163) cmd ::= with insert_cmd INTO xfullname idlist_opt DEFAULT VALUES returning */ + 271, /* (164) upsert ::= */ + 271, /* (165) upsert ::= RETURNING selcollist */ + 271, /* (166) upsert ::= ON CONFLICT LP sortlist RP where_opt DO UPDATE SET setlist where_opt upsert */ + 271, /* (167) upsert ::= ON CONFLICT LP sortlist RP where_opt DO NOTHING upsert */ + 271, /* (168) upsert ::= ON CONFLICT DO NOTHING returning */ + 271, /* (169) upsert ::= ON CONFLICT DO UPDATE SET setlist where_opt returning */ + 272, /* (170) returning ::= RETURNING selcollist */ + 269, /* (171) insert_cmd ::= INSERT orconf */ + 269, /* (172) insert_cmd ::= REPLACE */ + 270, /* (173) idlist_opt ::= */ + 270, /* (174) idlist_opt ::= LP idlist RP */ + 264, /* (175) idlist ::= idlist COMMA nm */ + 264, /* (176) idlist ::= nm */ + 217, /* (177) expr ::= LP expr RP */ + 217, /* (178) expr ::= ID|INDEXED */ + 217, /* (179) expr ::= JOIN_KW */ + 217, /* (180) expr ::= nm DOT nm */ + 217, /* (181) expr ::= nm DOT nm DOT nm */ + 216, /* (182) term ::= NULL|FLOAT|BLOB */ + 216, /* (183) term ::= STRING */ + 216, /* (184) term ::= INTEGER */ + 217, /* (185) expr ::= VARIABLE */ + 217, /* (186) expr ::= expr COLLATE ID|STRING */ + 217, /* (187) expr ::= CAST LP expr AS typetoken RP */ + 217, /* (188) expr ::= ID|INDEXED LP distinct exprlist RP */ + 217, /* (189) expr ::= ID|INDEXED LP STAR RP */ + 217, /* (190) expr ::= ID|INDEXED LP distinct exprlist RP filter_over */ + 217, /* (191) expr ::= ID|INDEXED LP STAR RP filter_over */ + 216, /* (192) term ::= CTIME_KW */ + 217, /* (193) expr ::= LP nexprlist COMMA expr RP */ + 217, /* (194) expr ::= expr AND expr */ + 217, /* (195) expr ::= expr OR expr */ + 217, /* (196) expr ::= expr LT|GT|GE|LE expr */ + 217, /* (197) expr ::= expr EQ|NE expr */ + 217, /* (198) expr ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr */ + 217, /* (199) expr ::= expr PLUS|MINUS expr */ + 217, /* (200) expr ::= expr STAR|SLASH|REM expr */ + 217, /* (201) expr ::= expr CONCAT expr */ + 274, /* (202) likeop ::= NOT LIKE_KW|MATCH */ + 217, /* (203) expr ::= expr likeop expr */ + 217, /* (204) expr ::= expr likeop expr ESCAPE expr */ + 217, /* (205) expr ::= expr ISNULL|NOTNULL */ + 217, /* (206) expr ::= expr NOT NULL */ + 217, /* (207) expr ::= expr IS expr */ + 217, /* (208) expr ::= expr IS NOT expr */ + 217, /* (209) expr ::= NOT expr */ + 217, /* (210) expr ::= BITNOT expr */ + 217, /* (211) expr ::= PLUS|MINUS expr */ + 217, /* (212) expr ::= expr PTR expr */ + 275, /* (213) between_op ::= BETWEEN */ + 275, /* (214) between_op ::= NOT BETWEEN */ + 217, /* (215) expr ::= expr between_op expr AND expr */ + 276, /* (216) in_op ::= IN */ + 276, /* (217) in_op ::= NOT IN */ + 217, /* (218) expr ::= expr in_op LP exprlist RP */ + 217, /* (219) expr ::= LP select RP */ + 217, /* (220) expr ::= expr in_op LP select RP */ + 217, /* (221) expr ::= expr in_op nm dbnm paren_exprlist */ + 217, /* (222) expr ::= EXISTS LP select RP */ + 217, /* (223) expr ::= CASE case_operand case_exprlist case_else END */ + 279, /* (224) case_exprlist ::= case_exprlist WHEN expr THEN expr */ + 279, /* (225) case_exprlist ::= WHEN expr THEN expr */ + 280, /* (226) case_else ::= ELSE expr */ + 280, /* (227) case_else ::= */ + 278, /* (228) case_operand ::= expr */ + 278, /* (229) case_operand ::= */ + 262, /* (230) exprlist ::= */ + 253, /* (231) nexprlist ::= nexprlist COMMA expr */ + 253, /* (232) nexprlist ::= expr */ + 277, /* (233) paren_exprlist ::= */ + 277, /* (234) paren_exprlist ::= LP exprlist RP */ + 190, /* (235) cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt */ + 281, /* (236) uniqueflag ::= UNIQUE */ + 281, /* (237) uniqueflag ::= */ + 221, /* (238) eidlist_opt ::= */ + 221, /* (239) eidlist_opt ::= LP eidlist RP */ + 232, /* (240) eidlist ::= eidlist COMMA nm collate sortorder */ + 232, /* (241) eidlist ::= nm collate sortorder */ + 282, /* (242) collate ::= */ + 282, /* (243) collate ::= COLLATE ID|STRING */ + 190, /* (244) cmd ::= DROP INDEX ifexists fullname */ + 190, /* (245) cmd ::= VACUUM vinto */ + 190, /* (246) cmd ::= VACUUM nm vinto */ + 283, /* (247) vinto ::= INTO expr */ + 283, /* (248) vinto ::= */ + 190, /* (249) cmd ::= PRAGMA nm dbnm */ + 190, /* (250) cmd ::= PRAGMA nm dbnm EQ nmnum */ + 190, /* (251) cmd ::= PRAGMA nm dbnm LP nmnum RP */ + 190, /* (252) cmd ::= PRAGMA nm dbnm EQ minus_num */ + 190, /* (253) cmd ::= PRAGMA nm dbnm LP minus_num RP */ + 211, /* (254) plus_num ::= PLUS INTEGER|FLOAT */ + 212, /* (255) minus_num ::= MINUS INTEGER|FLOAT */ + 190, /* (256) cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END */ + 285, /* (257) trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause */ + 287, /* (258) trigger_time ::= BEFORE|AFTER */ + 287, /* (259) trigger_time ::= INSTEAD OF */ + 287, /* (260) trigger_time ::= */ + 288, /* (261) trigger_event ::= DELETE|INSERT */ + 288, /* (262) trigger_event ::= UPDATE */ + 288, /* (263) trigger_event ::= UPDATE OF idlist */ + 290, /* (264) when_clause ::= */ + 290, /* (265) when_clause ::= WHEN expr */ + 286, /* (266) trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI */ + 286, /* (267) trigger_cmd_list ::= trigger_cmd SEMI */ + 292, /* (268) trnm ::= nm DOT nm */ + 293, /* (269) tridxby ::= INDEXED BY nm */ + 293, /* (270) tridxby ::= NOT INDEXED */ + 291, /* (271) trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist from where_opt scanpt */ + 291, /* (272) trigger_cmd ::= scanpt insert_cmd INTO trnm idlist_opt select upsert scanpt */ + 291, /* (273) trigger_cmd ::= DELETE FROM trnm tridxby where_opt scanpt */ + 291, /* (274) trigger_cmd ::= scanpt select scanpt */ + 217, /* (275) expr ::= RAISE LP IGNORE RP */ + 217, /* (276) expr ::= RAISE LP raisetype COMMA nm RP */ + 236, /* (277) raisetype ::= ROLLBACK */ + 236, /* (278) raisetype ::= ABORT */ + 236, /* (279) raisetype ::= FAIL */ + 190, /* (280) cmd ::= DROP TRIGGER ifexists fullname */ + 190, /* (281) cmd ::= ATTACH database_kw_opt expr AS expr key_opt */ + 190, /* (282) cmd ::= DETACH database_kw_opt expr */ + 295, /* (283) key_opt ::= */ + 295, /* (284) key_opt ::= KEY expr */ + 190, /* (285) cmd ::= REINDEX */ + 190, /* (286) cmd ::= REINDEX nm dbnm */ + 190, /* (287) cmd ::= ANALYZE */ + 190, /* (288) cmd ::= ANALYZE nm dbnm */ + 190, /* (289) cmd ::= ALTER TABLE fullname RENAME TO nm */ + 190, /* (290) cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist */ + 190, /* (291) cmd ::= ALTER TABLE fullname DROP kwcolumn_opt nm */ + 296, /* (292) add_column_fullname ::= fullname */ + 190, /* (293) cmd ::= ALTER TABLE fullname RENAME kwcolumn_opt nm TO nm */ + 190, /* (294) cmd ::= create_vtab */ + 190, /* (295) cmd ::= create_vtab LP vtabarglist RP */ + 298, /* (296) create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm */ + 300, /* (297) vtabarg ::= */ + 301, /* (298) vtabargtoken ::= ANY */ + 301, /* (299) vtabargtoken ::= lp anylist RP */ + 302, /* (300) lp ::= LP */ + 266, /* (301) with ::= WITH wqlist */ + 266, /* (302) with ::= WITH RECURSIVE wqlist */ + 305, /* (303) wqas ::= AS */ + 305, /* (304) wqas ::= AS MATERIALIZED */ + 305, /* (305) wqas ::= AS NOT MATERIALIZED */ + 304, /* (306) wqitem ::= nm eidlist_opt wqas LP select RP */ + 241, /* (307) wqlist ::= wqitem */ + 241, /* (308) wqlist ::= wqlist COMMA wqitem */ + 306, /* (309) windowdefn_list ::= windowdefn */ + 306, /* (310) windowdefn_list ::= windowdefn_list COMMA windowdefn */ + 307, /* (311) windowdefn ::= nm AS LP window RP */ + 308, /* (312) window ::= PARTITION BY nexprlist orderby_opt frame_opt */ + 308, /* (313) window ::= nm PARTITION BY nexprlist orderby_opt frame_opt */ + 308, /* (314) window ::= ORDER BY sortlist frame_opt */ + 308, /* (315) window ::= nm ORDER BY sortlist frame_opt */ + 308, /* (316) window ::= frame_opt */ + 308, /* (317) window ::= nm frame_opt */ + 309, /* (318) frame_opt ::= */ + 309, /* (319) frame_opt ::= range_or_rows frame_bound_s frame_exclude_opt */ + 309, /* (320) frame_opt ::= range_or_rows BETWEEN frame_bound_s AND frame_bound_e frame_exclude_opt */ + 313, /* (321) range_or_rows ::= RANGE|ROWS|GROUPS */ + 315, /* (322) frame_bound_s ::= frame_bound */ + 315, /* (323) frame_bound_s ::= UNBOUNDED PRECEDING */ + 316, /* (324) frame_bound_e ::= frame_bound */ + 316, /* (325) frame_bound_e ::= UNBOUNDED FOLLOWING */ + 314, /* (326) frame_bound ::= expr PRECEDING|FOLLOWING */ + 314, /* (327) frame_bound ::= CURRENT ROW */ + 317, /* (328) frame_exclude_opt ::= */ + 317, /* (329) frame_exclude_opt ::= EXCLUDE frame_exclude */ + 318, /* (330) frame_exclude ::= NO OTHERS */ + 318, /* (331) frame_exclude ::= CURRENT ROW */ + 318, /* (332) frame_exclude ::= GROUP|TIES */ + 251, /* (333) window_clause ::= WINDOW windowdefn_list */ + 273, /* (334) filter_over ::= filter_clause over_clause */ + 273, /* (335) filter_over ::= over_clause */ + 273, /* (336) filter_over ::= filter_clause */ + 312, /* (337) over_clause ::= OVER LP window RP */ + 312, /* (338) over_clause ::= OVER nm */ + 311, /* (339) filter_clause ::= FILTER LP WHERE expr RP */ + 185, /* (340) input ::= cmdlist */ + 186, /* (341) cmdlist ::= cmdlist ecmd */ + 186, /* (342) cmdlist ::= ecmd */ + 187, /* (343) ecmd ::= SEMI */ + 187, /* (344) ecmd ::= cmdx SEMI */ + 187, /* (345) ecmd ::= explain cmdx SEMI */ + 192, /* (346) trans_opt ::= */ + 192, /* (347) trans_opt ::= TRANSACTION */ + 192, /* (348) trans_opt ::= TRANSACTION nm */ + 194, /* (349) savepoint_opt ::= SAVEPOINT */ + 194, /* (350) savepoint_opt ::= */ + 190, /* (351) cmd ::= create_table create_table_args */ + 203, /* (352) table_option_set ::= table_option */ + 201, /* (353) columnlist ::= columnlist COMMA columnname carglist */ + 201, /* (354) columnlist ::= columnname carglist */ + 193, /* (355) nm ::= ID|INDEXED */ + 193, /* (356) nm ::= STRING */ + 193, /* (357) nm ::= JOIN_KW */ + 208, /* (358) typetoken ::= typename */ + 209, /* (359) typename ::= ID|STRING */ + 210, /* (360) signed ::= plus_num */ + 210, /* (361) signed ::= minus_num */ + 207, /* (362) carglist ::= carglist ccons */ + 207, /* (363) carglist ::= */ + 215, /* (364) ccons ::= NULL onconf */ + 215, /* (365) ccons ::= GENERATED ALWAYS AS generated */ + 215, /* (366) ccons ::= AS generated */ + 202, /* (367) conslist_opt ::= COMMA conslist */ + 228, /* (368) conslist ::= conslist tconscomma tcons */ + 228, /* (369) conslist ::= tcons */ + 229, /* (370) tconscomma ::= */ + 233, /* (371) defer_subclause_opt ::= defer_subclause */ + 235, /* (372) resolvetype ::= raisetype */ + 239, /* (373) selectnowith ::= oneselect */ + 240, /* (374) oneselect ::= values */ + 254, /* (375) sclp ::= selcollist COMMA */ + 255, /* (376) as ::= ID|STRING */ + 272, /* (377) returning ::= */ + 217, /* (378) expr ::= term */ + 274, /* (379) likeop ::= LIKE_KW|MATCH */ + 262, /* (380) exprlist ::= nexprlist */ + 284, /* (381) nmnum ::= plus_num */ + 284, /* (382) nmnum ::= nm */ + 284, /* (383) nmnum ::= ON */ + 284, /* (384) nmnum ::= DELETE */ + 284, /* (385) nmnum ::= DEFAULT */ + 211, /* (386) plus_num ::= INTEGER|FLOAT */ + 289, /* (387) foreach_clause ::= */ + 289, /* (388) foreach_clause ::= FOR EACH ROW */ + 292, /* (389) trnm ::= nm */ + 293, /* (390) tridxby ::= */ + 294, /* (391) database_kw_opt ::= DATABASE */ + 294, /* (392) database_kw_opt ::= */ + 297, /* (393) kwcolumn_opt ::= */ + 297, /* (394) kwcolumn_opt ::= COLUMNKW */ + 299, /* (395) vtabarglist ::= vtabarg */ + 299, /* (396) vtabarglist ::= vtabarglist COMMA vtabarg */ + 300, /* (397) vtabarg ::= vtabarg vtabargtoken */ + 303, /* (398) anylist ::= */ + 303, /* (399) anylist ::= anylist LP anylist RP */ + 303, /* (400) anylist ::= anylist ANY */ + 266, /* (401) with ::= */ }; /* For rule J, yyRuleInfoNRhs[J] contains the negative of the number @@ -162796,195 +164689,196 @@ static const signed char yyRuleInfoNRhs[] = { -2, /* (209) expr ::= NOT expr */ -2, /* (210) expr ::= BITNOT expr */ -2, /* (211) expr ::= PLUS|MINUS expr */ - -1, /* (212) between_op ::= BETWEEN */ - -2, /* (213) between_op ::= NOT BETWEEN */ - -5, /* (214) expr ::= expr between_op expr AND expr */ - -1, /* (215) in_op ::= IN */ - -2, /* (216) in_op ::= NOT IN */ - -5, /* (217) expr ::= expr in_op LP exprlist RP */ - -3, /* (218) expr ::= LP select RP */ - -5, /* (219) expr ::= expr in_op LP select RP */ - -5, /* (220) expr ::= expr in_op nm dbnm paren_exprlist */ - -4, /* (221) expr ::= EXISTS LP select RP */ - -5, /* (222) expr ::= CASE case_operand case_exprlist case_else END */ - -5, /* (223) case_exprlist ::= case_exprlist WHEN expr THEN expr */ - -4, /* (224) case_exprlist ::= WHEN expr THEN expr */ - -2, /* (225) case_else ::= ELSE expr */ - 0, /* (226) case_else ::= */ - -1, /* (227) case_operand ::= expr */ - 0, /* (228) case_operand ::= */ - 0, /* (229) exprlist ::= */ - -3, /* (230) nexprlist ::= nexprlist COMMA expr */ - -1, /* (231) nexprlist ::= expr */ - 0, /* (232) paren_exprlist ::= */ - -3, /* (233) paren_exprlist ::= LP exprlist RP */ - -12, /* (234) cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt */ - -1, /* (235) uniqueflag ::= UNIQUE */ - 0, /* (236) uniqueflag ::= */ - 0, /* (237) eidlist_opt ::= */ - -3, /* (238) eidlist_opt ::= LP eidlist RP */ - -5, /* (239) eidlist ::= eidlist COMMA nm collate sortorder */ - -3, /* (240) eidlist ::= nm collate sortorder */ - 0, /* (241) collate ::= */ - -2, /* (242) collate ::= COLLATE ID|STRING */ - -4, /* (243) cmd ::= DROP INDEX ifexists fullname */ - -2, /* (244) cmd ::= VACUUM vinto */ - -3, /* (245) cmd ::= VACUUM nm vinto */ - -2, /* (246) vinto ::= INTO expr */ - 0, /* (247) vinto ::= */ - -3, /* (248) cmd ::= PRAGMA nm dbnm */ - -5, /* (249) cmd ::= PRAGMA nm dbnm EQ nmnum */ - -6, /* (250) cmd ::= PRAGMA nm dbnm LP nmnum RP */ - -5, /* (251) cmd ::= PRAGMA nm dbnm EQ minus_num */ - -6, /* (252) cmd ::= PRAGMA nm dbnm LP minus_num RP */ - -2, /* (253) plus_num ::= PLUS INTEGER|FLOAT */ - -2, /* (254) minus_num ::= MINUS INTEGER|FLOAT */ - -5, /* (255) cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END */ - -11, /* (256) trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause */ - -1, /* (257) trigger_time ::= BEFORE|AFTER */ - -2, /* (258) trigger_time ::= INSTEAD OF */ - 0, /* (259) trigger_time ::= */ - -1, /* (260) trigger_event ::= DELETE|INSERT */ - -1, /* (261) trigger_event ::= UPDATE */ - -3, /* (262) trigger_event ::= UPDATE OF idlist */ - 0, /* (263) when_clause ::= */ - -2, /* (264) when_clause ::= WHEN expr */ - -3, /* (265) trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI */ - -2, /* (266) trigger_cmd_list ::= trigger_cmd SEMI */ - -3, /* (267) trnm ::= nm DOT nm */ - -3, /* (268) tridxby ::= INDEXED BY nm */ - -2, /* (269) tridxby ::= NOT INDEXED */ - -9, /* (270) trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist from where_opt scanpt */ - -8, /* (271) trigger_cmd ::= scanpt insert_cmd INTO trnm idlist_opt select upsert scanpt */ - -6, /* (272) trigger_cmd ::= DELETE FROM trnm tridxby where_opt scanpt */ - -3, /* (273) trigger_cmd ::= scanpt select scanpt */ - -4, /* (274) expr ::= RAISE LP IGNORE RP */ - -6, /* (275) expr ::= RAISE LP raisetype COMMA nm RP */ - -1, /* (276) raisetype ::= ROLLBACK */ - -1, /* (277) raisetype ::= ABORT */ - -1, /* (278) raisetype ::= FAIL */ - -4, /* (279) cmd ::= DROP TRIGGER ifexists fullname */ - -6, /* (280) cmd ::= ATTACH database_kw_opt expr AS expr key_opt */ - -3, /* (281) cmd ::= DETACH database_kw_opt expr */ - 0, /* (282) key_opt ::= */ - -2, /* (283) key_opt ::= KEY expr */ - -1, /* (284) cmd ::= REINDEX */ - -3, /* (285) cmd ::= REINDEX nm dbnm */ - -1, /* (286) cmd ::= ANALYZE */ - -3, /* (287) cmd ::= ANALYZE nm dbnm */ - -6, /* (288) cmd ::= ALTER TABLE fullname RENAME TO nm */ - -7, /* (289) cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist */ - -6, /* (290) cmd ::= ALTER TABLE fullname DROP kwcolumn_opt nm */ - -1, /* (291) add_column_fullname ::= fullname */ - -8, /* (292) cmd ::= ALTER TABLE fullname RENAME kwcolumn_opt nm TO nm */ - -1, /* (293) cmd ::= create_vtab */ - -4, /* (294) cmd ::= create_vtab LP vtabarglist RP */ - -8, /* (295) create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm */ - 0, /* (296) vtabarg ::= */ - -1, /* (297) vtabargtoken ::= ANY */ - -3, /* (298) vtabargtoken ::= lp anylist RP */ - -1, /* (299) lp ::= LP */ - -2, /* (300) with ::= WITH wqlist */ - -3, /* (301) with ::= WITH RECURSIVE wqlist */ - -1, /* (302) wqas ::= AS */ - -2, /* (303) wqas ::= AS MATERIALIZED */ - -3, /* (304) wqas ::= AS NOT MATERIALIZED */ - -6, /* (305) wqitem ::= nm eidlist_opt wqas LP select RP */ - -1, /* (306) wqlist ::= wqitem */ - -3, /* (307) wqlist ::= wqlist COMMA wqitem */ - -1, /* (308) windowdefn_list ::= windowdefn */ - -3, /* (309) windowdefn_list ::= windowdefn_list COMMA windowdefn */ - -5, /* (310) windowdefn ::= nm AS LP window RP */ - -5, /* (311) window ::= PARTITION BY nexprlist orderby_opt frame_opt */ - -6, /* (312) window ::= nm PARTITION BY nexprlist orderby_opt frame_opt */ - -4, /* (313) window ::= ORDER BY sortlist frame_opt */ - -5, /* (314) window ::= nm ORDER BY sortlist frame_opt */ - -1, /* (315) window ::= frame_opt */ - -2, /* (316) window ::= nm frame_opt */ - 0, /* (317) frame_opt ::= */ - -3, /* (318) frame_opt ::= range_or_rows frame_bound_s frame_exclude_opt */ - -6, /* (319) frame_opt ::= range_or_rows BETWEEN frame_bound_s AND frame_bound_e frame_exclude_opt */ - -1, /* (320) range_or_rows ::= RANGE|ROWS|GROUPS */ - -1, /* (321) frame_bound_s ::= frame_bound */ - -2, /* (322) frame_bound_s ::= UNBOUNDED PRECEDING */ - -1, /* (323) frame_bound_e ::= frame_bound */ - -2, /* (324) frame_bound_e ::= UNBOUNDED FOLLOWING */ - -2, /* (325) frame_bound ::= expr PRECEDING|FOLLOWING */ - -2, /* (326) frame_bound ::= CURRENT ROW */ - 0, /* (327) frame_exclude_opt ::= */ - -2, /* (328) frame_exclude_opt ::= EXCLUDE frame_exclude */ - -2, /* (329) frame_exclude ::= NO OTHERS */ - -2, /* (330) frame_exclude ::= CURRENT ROW */ - -1, /* (331) frame_exclude ::= GROUP|TIES */ - -2, /* (332) window_clause ::= WINDOW windowdefn_list */ - -2, /* (333) filter_over ::= filter_clause over_clause */ - -1, /* (334) filter_over ::= over_clause */ - -1, /* (335) filter_over ::= filter_clause */ - -4, /* (336) over_clause ::= OVER LP window RP */ - -2, /* (337) over_clause ::= OVER nm */ - -5, /* (338) filter_clause ::= FILTER LP WHERE expr RP */ - -1, /* (339) input ::= cmdlist */ - -2, /* (340) cmdlist ::= cmdlist ecmd */ - -1, /* (341) cmdlist ::= ecmd */ - -1, /* (342) ecmd ::= SEMI */ - -2, /* (343) ecmd ::= cmdx SEMI */ - -3, /* (344) ecmd ::= explain cmdx SEMI */ - 0, /* (345) trans_opt ::= */ - -1, /* (346) trans_opt ::= TRANSACTION */ - -2, /* (347) trans_opt ::= TRANSACTION nm */ - -1, /* (348) savepoint_opt ::= SAVEPOINT */ - 0, /* (349) savepoint_opt ::= */ - -2, /* (350) cmd ::= create_table create_table_args */ - -1, /* (351) table_option_set ::= table_option */ - -4, /* (352) columnlist ::= columnlist COMMA columnname carglist */ - -2, /* (353) columnlist ::= columnname carglist */ - -1, /* (354) nm ::= ID|INDEXED */ - -1, /* (355) nm ::= STRING */ - -1, /* (356) nm ::= JOIN_KW */ - -1, /* (357) typetoken ::= typename */ - -1, /* (358) typename ::= ID|STRING */ - -1, /* (359) signed ::= plus_num */ - -1, /* (360) signed ::= minus_num */ - -2, /* (361) carglist ::= carglist ccons */ - 0, /* (362) carglist ::= */ - -2, /* (363) ccons ::= NULL onconf */ - -4, /* (364) ccons ::= GENERATED ALWAYS AS generated */ - -2, /* (365) ccons ::= AS generated */ - -2, /* (366) conslist_opt ::= COMMA conslist */ - -3, /* (367) conslist ::= conslist tconscomma tcons */ - -1, /* (368) conslist ::= tcons */ - 0, /* (369) tconscomma ::= */ - -1, /* (370) defer_subclause_opt ::= defer_subclause */ - -1, /* (371) resolvetype ::= raisetype */ - -1, /* (372) selectnowith ::= oneselect */ - -1, /* (373) oneselect ::= values */ - -2, /* (374) sclp ::= selcollist COMMA */ - -1, /* (375) as ::= ID|STRING */ - 0, /* (376) returning ::= */ - -1, /* (377) expr ::= term */ - -1, /* (378) likeop ::= LIKE_KW|MATCH */ - -1, /* (379) exprlist ::= nexprlist */ - -1, /* (380) nmnum ::= plus_num */ - -1, /* (381) nmnum ::= nm */ - -1, /* (382) nmnum ::= ON */ - -1, /* (383) nmnum ::= DELETE */ - -1, /* (384) nmnum ::= DEFAULT */ - -1, /* (385) plus_num ::= INTEGER|FLOAT */ - 0, /* (386) foreach_clause ::= */ - -3, /* (387) foreach_clause ::= FOR EACH ROW */ - -1, /* (388) trnm ::= nm */ - 0, /* (389) tridxby ::= */ - -1, /* (390) database_kw_opt ::= DATABASE */ - 0, /* (391) database_kw_opt ::= */ - 0, /* (392) kwcolumn_opt ::= */ - -1, /* (393) kwcolumn_opt ::= COLUMNKW */ - -1, /* (394) vtabarglist ::= vtabarg */ - -3, /* (395) vtabarglist ::= vtabarglist COMMA vtabarg */ - -2, /* (396) vtabarg ::= vtabarg vtabargtoken */ - 0, /* (397) anylist ::= */ - -4, /* (398) anylist ::= anylist LP anylist RP */ - -2, /* (399) anylist ::= anylist ANY */ - 0, /* (400) with ::= */ + -3, /* (212) expr ::= expr PTR expr */ + -1, /* (213) between_op ::= BETWEEN */ + -2, /* (214) between_op ::= NOT BETWEEN */ + -5, /* (215) expr ::= expr between_op expr AND expr */ + -1, /* (216) in_op ::= IN */ + -2, /* (217) in_op ::= NOT IN */ + -5, /* (218) expr ::= expr in_op LP exprlist RP */ + -3, /* (219) expr ::= LP select RP */ + -5, /* (220) expr ::= expr in_op LP select RP */ + -5, /* (221) expr ::= expr in_op nm dbnm paren_exprlist */ + -4, /* (222) expr ::= EXISTS LP select RP */ + -5, /* (223) expr ::= CASE case_operand case_exprlist case_else END */ + -5, /* (224) case_exprlist ::= case_exprlist WHEN expr THEN expr */ + -4, /* (225) case_exprlist ::= WHEN expr THEN expr */ + -2, /* (226) case_else ::= ELSE expr */ + 0, /* (227) case_else ::= */ + -1, /* (228) case_operand ::= expr */ + 0, /* (229) case_operand ::= */ + 0, /* (230) exprlist ::= */ + -3, /* (231) nexprlist ::= nexprlist COMMA expr */ + -1, /* (232) nexprlist ::= expr */ + 0, /* (233) paren_exprlist ::= */ + -3, /* (234) paren_exprlist ::= LP exprlist RP */ + -12, /* (235) cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt */ + -1, /* (236) uniqueflag ::= UNIQUE */ + 0, /* (237) uniqueflag ::= */ + 0, /* (238) eidlist_opt ::= */ + -3, /* (239) eidlist_opt ::= LP eidlist RP */ + -5, /* (240) eidlist ::= eidlist COMMA nm collate sortorder */ + -3, /* (241) eidlist ::= nm collate sortorder */ + 0, /* (242) collate ::= */ + -2, /* (243) collate ::= COLLATE ID|STRING */ + -4, /* (244) cmd ::= DROP INDEX ifexists fullname */ + -2, /* (245) cmd ::= VACUUM vinto */ + -3, /* (246) cmd ::= VACUUM nm vinto */ + -2, /* (247) vinto ::= INTO expr */ + 0, /* (248) vinto ::= */ + -3, /* (249) cmd ::= PRAGMA nm dbnm */ + -5, /* (250) cmd ::= PRAGMA nm dbnm EQ nmnum */ + -6, /* (251) cmd ::= PRAGMA nm dbnm LP nmnum RP */ + -5, /* (252) cmd ::= PRAGMA nm dbnm EQ minus_num */ + -6, /* (253) cmd ::= PRAGMA nm dbnm LP minus_num RP */ + -2, /* (254) plus_num ::= PLUS INTEGER|FLOAT */ + -2, /* (255) minus_num ::= MINUS INTEGER|FLOAT */ + -5, /* (256) cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END */ + -11, /* (257) trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause */ + -1, /* (258) trigger_time ::= BEFORE|AFTER */ + -2, /* (259) trigger_time ::= INSTEAD OF */ + 0, /* (260) trigger_time ::= */ + -1, /* (261) trigger_event ::= DELETE|INSERT */ + -1, /* (262) trigger_event ::= UPDATE */ + -3, /* (263) trigger_event ::= UPDATE OF idlist */ + 0, /* (264) when_clause ::= */ + -2, /* (265) when_clause ::= WHEN expr */ + -3, /* (266) trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI */ + -2, /* (267) trigger_cmd_list ::= trigger_cmd SEMI */ + -3, /* (268) trnm ::= nm DOT nm */ + -3, /* (269) tridxby ::= INDEXED BY nm */ + -2, /* (270) tridxby ::= NOT INDEXED */ + -9, /* (271) trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist from where_opt scanpt */ + -8, /* (272) trigger_cmd ::= scanpt insert_cmd INTO trnm idlist_opt select upsert scanpt */ + -6, /* (273) trigger_cmd ::= DELETE FROM trnm tridxby where_opt scanpt */ + -3, /* (274) trigger_cmd ::= scanpt select scanpt */ + -4, /* (275) expr ::= RAISE LP IGNORE RP */ + -6, /* (276) expr ::= RAISE LP raisetype COMMA nm RP */ + -1, /* (277) raisetype ::= ROLLBACK */ + -1, /* (278) raisetype ::= ABORT */ + -1, /* (279) raisetype ::= FAIL */ + -4, /* (280) cmd ::= DROP TRIGGER ifexists fullname */ + -6, /* (281) cmd ::= ATTACH database_kw_opt expr AS expr key_opt */ + -3, /* (282) cmd ::= DETACH database_kw_opt expr */ + 0, /* (283) key_opt ::= */ + -2, /* (284) key_opt ::= KEY expr */ + -1, /* (285) cmd ::= REINDEX */ + -3, /* (286) cmd ::= REINDEX nm dbnm */ + -1, /* (287) cmd ::= ANALYZE */ + -3, /* (288) cmd ::= ANALYZE nm dbnm */ + -6, /* (289) cmd ::= ALTER TABLE fullname RENAME TO nm */ + -7, /* (290) cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist */ + -6, /* (291) cmd ::= ALTER TABLE fullname DROP kwcolumn_opt nm */ + -1, /* (292) add_column_fullname ::= fullname */ + -8, /* (293) cmd ::= ALTER TABLE fullname RENAME kwcolumn_opt nm TO nm */ + -1, /* (294) cmd ::= create_vtab */ + -4, /* (295) cmd ::= create_vtab LP vtabarglist RP */ + -8, /* (296) create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm */ + 0, /* (297) vtabarg ::= */ + -1, /* (298) vtabargtoken ::= ANY */ + -3, /* (299) vtabargtoken ::= lp anylist RP */ + -1, /* (300) lp ::= LP */ + -2, /* (301) with ::= WITH wqlist */ + -3, /* (302) with ::= WITH RECURSIVE wqlist */ + -1, /* (303) wqas ::= AS */ + -2, /* (304) wqas ::= AS MATERIALIZED */ + -3, /* (305) wqas ::= AS NOT MATERIALIZED */ + -6, /* (306) wqitem ::= nm eidlist_opt wqas LP select RP */ + -1, /* (307) wqlist ::= wqitem */ + -3, /* (308) wqlist ::= wqlist COMMA wqitem */ + -1, /* (309) windowdefn_list ::= windowdefn */ + -3, /* (310) windowdefn_list ::= windowdefn_list COMMA windowdefn */ + -5, /* (311) windowdefn ::= nm AS LP window RP */ + -5, /* (312) window ::= PARTITION BY nexprlist orderby_opt frame_opt */ + -6, /* (313) window ::= nm PARTITION BY nexprlist orderby_opt frame_opt */ + -4, /* (314) window ::= ORDER BY sortlist frame_opt */ + -5, /* (315) window ::= nm ORDER BY sortlist frame_opt */ + -1, /* (316) window ::= frame_opt */ + -2, /* (317) window ::= nm frame_opt */ + 0, /* (318) frame_opt ::= */ + -3, /* (319) frame_opt ::= range_or_rows frame_bound_s frame_exclude_opt */ + -6, /* (320) frame_opt ::= range_or_rows BETWEEN frame_bound_s AND frame_bound_e frame_exclude_opt */ + -1, /* (321) range_or_rows ::= RANGE|ROWS|GROUPS */ + -1, /* (322) frame_bound_s ::= frame_bound */ + -2, /* (323) frame_bound_s ::= UNBOUNDED PRECEDING */ + -1, /* (324) frame_bound_e ::= frame_bound */ + -2, /* (325) frame_bound_e ::= UNBOUNDED FOLLOWING */ + -2, /* (326) frame_bound ::= expr PRECEDING|FOLLOWING */ + -2, /* (327) frame_bound ::= CURRENT ROW */ + 0, /* (328) frame_exclude_opt ::= */ + -2, /* (329) frame_exclude_opt ::= EXCLUDE frame_exclude */ + -2, /* (330) frame_exclude ::= NO OTHERS */ + -2, /* (331) frame_exclude ::= CURRENT ROW */ + -1, /* (332) frame_exclude ::= GROUP|TIES */ + -2, /* (333) window_clause ::= WINDOW windowdefn_list */ + -2, /* (334) filter_over ::= filter_clause over_clause */ + -1, /* (335) filter_over ::= over_clause */ + -1, /* (336) filter_over ::= filter_clause */ + -4, /* (337) over_clause ::= OVER LP window RP */ + -2, /* (338) over_clause ::= OVER nm */ + -5, /* (339) filter_clause ::= FILTER LP WHERE expr RP */ + -1, /* (340) input ::= cmdlist */ + -2, /* (341) cmdlist ::= cmdlist ecmd */ + -1, /* (342) cmdlist ::= ecmd */ + -1, /* (343) ecmd ::= SEMI */ + -2, /* (344) ecmd ::= cmdx SEMI */ + -3, /* (345) ecmd ::= explain cmdx SEMI */ + 0, /* (346) trans_opt ::= */ + -1, /* (347) trans_opt ::= TRANSACTION */ + -2, /* (348) trans_opt ::= TRANSACTION nm */ + -1, /* (349) savepoint_opt ::= SAVEPOINT */ + 0, /* (350) savepoint_opt ::= */ + -2, /* (351) cmd ::= create_table create_table_args */ + -1, /* (352) table_option_set ::= table_option */ + -4, /* (353) columnlist ::= columnlist COMMA columnname carglist */ + -2, /* (354) columnlist ::= columnname carglist */ + -1, /* (355) nm ::= ID|INDEXED */ + -1, /* (356) nm ::= STRING */ + -1, /* (357) nm ::= JOIN_KW */ + -1, /* (358) typetoken ::= typename */ + -1, /* (359) typename ::= ID|STRING */ + -1, /* (360) signed ::= plus_num */ + -1, /* (361) signed ::= minus_num */ + -2, /* (362) carglist ::= carglist ccons */ + 0, /* (363) carglist ::= */ + -2, /* (364) ccons ::= NULL onconf */ + -4, /* (365) ccons ::= GENERATED ALWAYS AS generated */ + -2, /* (366) ccons ::= AS generated */ + -2, /* (367) conslist_opt ::= COMMA conslist */ + -3, /* (368) conslist ::= conslist tconscomma tcons */ + -1, /* (369) conslist ::= tcons */ + 0, /* (370) tconscomma ::= */ + -1, /* (371) defer_subclause_opt ::= defer_subclause */ + -1, /* (372) resolvetype ::= raisetype */ + -1, /* (373) selectnowith ::= oneselect */ + -1, /* (374) oneselect ::= values */ + -2, /* (375) sclp ::= selcollist COMMA */ + -1, /* (376) as ::= ID|STRING */ + 0, /* (377) returning ::= */ + -1, /* (378) expr ::= term */ + -1, /* (379) likeop ::= LIKE_KW|MATCH */ + -1, /* (380) exprlist ::= nexprlist */ + -1, /* (381) nmnum ::= plus_num */ + -1, /* (382) nmnum ::= nm */ + -1, /* (383) nmnum ::= ON */ + -1, /* (384) nmnum ::= DELETE */ + -1, /* (385) nmnum ::= DEFAULT */ + -1, /* (386) plus_num ::= INTEGER|FLOAT */ + 0, /* (387) foreach_clause ::= */ + -3, /* (388) foreach_clause ::= FOR EACH ROW */ + -1, /* (389) trnm ::= nm */ + 0, /* (390) tridxby ::= */ + -1, /* (391) database_kw_opt ::= DATABASE */ + 0, /* (392) database_kw_opt ::= */ + 0, /* (393) kwcolumn_opt ::= */ + -1, /* (394) kwcolumn_opt ::= COLUMNKW */ + -1, /* (395) vtabarglist ::= vtabarg */ + -3, /* (396) vtabarglist ::= vtabarglist COMMA vtabarg */ + -2, /* (397) vtabarg ::= vtabarg vtabargtoken */ + 0, /* (398) anylist ::= */ + -4, /* (399) anylist ::= anylist LP anylist RP */ + -2, /* (400) anylist ::= anylist ANY */ + 0, /* (401) with ::= */ }; static void yy_accept(yyParser*); /* Forward Declaration */ @@ -163036,16 +164930,16 @@ static YYACTIONTYPE yy_reduce( { sqlite3FinishCoding(pParse); } break; case 3: /* cmd ::= BEGIN transtype trans_opt */ -{sqlite3BeginTransaction(pParse, yymsp[-1].minor.yy64);} +{sqlite3BeginTransaction(pParse, yymsp[-1].minor.yy394);} break; case 4: /* transtype ::= */ -{yymsp[1].minor.yy64 = TK_DEFERRED;} +{yymsp[1].minor.yy394 = TK_DEFERRED;} break; case 5: /* transtype ::= DEFERRED */ case 6: /* transtype ::= IMMEDIATE */ yytestcase(yyruleno==6); case 7: /* transtype ::= EXCLUSIVE */ yytestcase(yyruleno==7); - case 320: /* range_or_rows ::= RANGE|ROWS|GROUPS */ yytestcase(yyruleno==320); -{yymsp[0].minor.yy64 = yymsp[0].major; /*A-overwrites-X*/} + case 321: /* range_or_rows ::= RANGE|ROWS|GROUPS */ yytestcase(yyruleno==321); +{yymsp[0].minor.yy394 = yymsp[0].major; /*A-overwrites-X*/} break; case 8: /* cmd ::= COMMIT|END trans_opt */ case 9: /* cmd ::= ROLLBACK trans_opt */ yytestcase(yyruleno==9); @@ -163068,7 +164962,7 @@ static YYACTIONTYPE yy_reduce( break; case 13: /* create_table ::= createkw temp TABLE ifnotexists nm dbnm */ { - sqlite3StartTable(pParse,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0,yymsp[-4].minor.yy64,0,0,yymsp[-2].minor.yy64); + sqlite3StartTable(pParse,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0,yymsp[-4].minor.yy394,0,0,yymsp[-2].minor.yy394); } break; case 14: /* createkw ::= CREATE */ @@ -163081,39 +164975,39 @@ static YYACTIONTYPE yy_reduce( case 72: /* defer_subclause_opt ::= */ yytestcase(yyruleno==72); case 81: /* ifexists ::= */ yytestcase(yyruleno==81); case 98: /* distinct ::= */ yytestcase(yyruleno==98); - case 241: /* collate ::= */ yytestcase(yyruleno==241); -{yymsp[1].minor.yy64 = 0;} + case 242: /* collate ::= */ yytestcase(yyruleno==242); +{yymsp[1].minor.yy394 = 0;} break; case 16: /* ifnotexists ::= IF NOT EXISTS */ -{yymsp[-2].minor.yy64 = 1;} +{yymsp[-2].minor.yy394 = 1;} break; case 17: /* temp ::= TEMP */ -{yymsp[0].minor.yy64 = pParse->db->init.busy==0;} +{yymsp[0].minor.yy394 = pParse->db->init.busy==0;} break; case 19: /* create_table_args ::= LP columnlist conslist_opt RP table_option_set */ { - sqlite3EndTable(pParse,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0,yymsp[0].minor.yy51,0); + sqlite3EndTable(pParse,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0,yymsp[0].minor.yy285,0); } break; case 20: /* create_table_args ::= AS select */ { - sqlite3EndTable(pParse,0,0,0,yymsp[0].minor.yy303); - sqlite3SelectDelete(pParse->db, yymsp[0].minor.yy303); + sqlite3EndTable(pParse,0,0,0,yymsp[0].minor.yy47); + sqlite3SelectDelete(pParse->db, yymsp[0].minor.yy47); } break; case 21: /* table_option_set ::= */ -{yymsp[1].minor.yy51 = 0;} +{yymsp[1].minor.yy285 = 0;} break; case 22: /* table_option_set ::= table_option_set COMMA table_option */ -{yylhsminor.yy51 = yymsp[-2].minor.yy51|yymsp[0].minor.yy51;} - yymsp[-2].minor.yy51 = yylhsminor.yy51; +{yylhsminor.yy285 = yymsp[-2].minor.yy285|yymsp[0].minor.yy285;} + yymsp[-2].minor.yy285 = yylhsminor.yy285; break; case 23: /* table_option ::= WITHOUT nm */ { if( yymsp[0].minor.yy0.n==5 && sqlite3_strnicmp(yymsp[0].minor.yy0.z,"rowid",5)==0 ){ - yymsp[-1].minor.yy51 = TF_WithoutRowid | TF_NoVisibleRowid; + yymsp[-1].minor.yy285 = TF_WithoutRowid | TF_NoVisibleRowid; }else{ - yymsp[-1].minor.yy51 = 0; + yymsp[-1].minor.yy285 = 0; sqlite3ErrorMsg(pParse, "unknown table option: %.*s", yymsp[0].minor.yy0.n, yymsp[0].minor.yy0.z); } } @@ -163121,13 +165015,13 @@ static YYACTIONTYPE yy_reduce( case 24: /* table_option ::= nm */ { if( yymsp[0].minor.yy0.n==6 && sqlite3_strnicmp(yymsp[0].minor.yy0.z,"strict",6)==0 ){ - yylhsminor.yy51 = TF_Strict; + yylhsminor.yy285 = TF_Strict; }else{ - yylhsminor.yy51 = 0; + yylhsminor.yy285 = 0; sqlite3ErrorMsg(pParse, "unknown table option: %.*s", yymsp[0].minor.yy0.n, yymsp[0].minor.yy0.z); } } - yymsp[0].minor.yy51 = yylhsminor.yy51; + yymsp[0].minor.yy285 = yylhsminor.yy285; break; case 25: /* columnname ::= nm typetoken */ {sqlite3AddColumn(pParse,yymsp[-1].minor.yy0,yymsp[0].minor.yy0);} @@ -163153,7 +165047,7 @@ static YYACTIONTYPE yy_reduce( case 30: /* scanpt ::= */ { assert( yyLookahead!=YYNOCODE ); - yymsp[1].minor.yy600 = yyLookaheadToken.z; + yymsp[1].minor.yy522 = yyLookaheadToken.z; } break; case 31: /* scantok ::= */ @@ -163167,17 +165061,17 @@ static YYACTIONTYPE yy_reduce( {pParse->constraintName = yymsp[0].minor.yy0;} break; case 33: /* ccons ::= DEFAULT scantok term */ -{sqlite3AddDefaultValue(pParse,yymsp[0].minor.yy626,yymsp[-1].minor.yy0.z,&yymsp[-1].minor.yy0.z[yymsp[-1].minor.yy0.n]);} +{sqlite3AddDefaultValue(pParse,yymsp[0].minor.yy528,yymsp[-1].minor.yy0.z,&yymsp[-1].minor.yy0.z[yymsp[-1].minor.yy0.n]);} break; case 34: /* ccons ::= DEFAULT LP expr RP */ -{sqlite3AddDefaultValue(pParse,yymsp[-1].minor.yy626,yymsp[-2].minor.yy0.z+1,yymsp[0].minor.yy0.z);} +{sqlite3AddDefaultValue(pParse,yymsp[-1].minor.yy528,yymsp[-2].minor.yy0.z+1,yymsp[0].minor.yy0.z);} break; case 35: /* ccons ::= DEFAULT PLUS scantok term */ -{sqlite3AddDefaultValue(pParse,yymsp[0].minor.yy626,yymsp[-2].minor.yy0.z,&yymsp[-1].minor.yy0.z[yymsp[-1].minor.yy0.n]);} +{sqlite3AddDefaultValue(pParse,yymsp[0].minor.yy528,yymsp[-2].minor.yy0.z,&yymsp[-1].minor.yy0.z[yymsp[-1].minor.yy0.n]);} break; case 36: /* ccons ::= DEFAULT MINUS scantok term */ { - Expr *p = sqlite3PExpr(pParse, TK_UMINUS, yymsp[0].minor.yy626, 0); + Expr *p = sqlite3PExpr(pParse, TK_UMINUS, yymsp[0].minor.yy528, 0); sqlite3AddDefaultValue(pParse,p,yymsp[-2].minor.yy0.z,&yymsp[-1].minor.yy0.z[yymsp[-1].minor.yy0.n]); } break; @@ -163192,161 +165086,161 @@ static YYACTIONTYPE yy_reduce( } break; case 38: /* ccons ::= NOT NULL onconf */ -{sqlite3AddNotNull(pParse, yymsp[0].minor.yy64);} +{sqlite3AddNotNull(pParse, yymsp[0].minor.yy394);} break; case 39: /* ccons ::= PRIMARY KEY sortorder onconf autoinc */ -{sqlite3AddPrimaryKey(pParse,0,yymsp[-1].minor.yy64,yymsp[0].minor.yy64,yymsp[-2].minor.yy64);} +{sqlite3AddPrimaryKey(pParse,0,yymsp[-1].minor.yy394,yymsp[0].minor.yy394,yymsp[-2].minor.yy394);} break; case 40: /* ccons ::= UNIQUE onconf */ -{sqlite3CreateIndex(pParse,0,0,0,0,yymsp[0].minor.yy64,0,0,0,0, +{sqlite3CreateIndex(pParse,0,0,0,0,yymsp[0].minor.yy394,0,0,0,0, SQLITE_IDXTYPE_UNIQUE);} break; case 41: /* ccons ::= CHECK LP expr RP */ -{sqlite3AddCheckConstraint(pParse,yymsp[-1].minor.yy626,yymsp[-2].minor.yy0.z,yymsp[0].minor.yy0.z);} +{sqlite3AddCheckConstraint(pParse,yymsp[-1].minor.yy528,yymsp[-2].minor.yy0.z,yymsp[0].minor.yy0.z);} break; case 42: /* ccons ::= REFERENCES nm eidlist_opt refargs */ -{sqlite3CreateForeignKey(pParse,0,&yymsp[-2].minor.yy0,yymsp[-1].minor.yy562,yymsp[0].minor.yy64);} +{sqlite3CreateForeignKey(pParse,0,&yymsp[-2].minor.yy0,yymsp[-1].minor.yy322,yymsp[0].minor.yy394);} break; case 43: /* ccons ::= defer_subclause */ -{sqlite3DeferForeignKey(pParse,yymsp[0].minor.yy64);} +{sqlite3DeferForeignKey(pParse,yymsp[0].minor.yy394);} break; case 44: /* ccons ::= COLLATE ID|STRING */ {sqlite3AddCollateType(pParse, &yymsp[0].minor.yy0);} break; case 45: /* generated ::= LP expr RP */ -{sqlite3AddGenerated(pParse,yymsp[-1].minor.yy626,0);} +{sqlite3AddGenerated(pParse,yymsp[-1].minor.yy528,0);} break; case 46: /* generated ::= LP expr RP ID */ -{sqlite3AddGenerated(pParse,yymsp[-2].minor.yy626,&yymsp[0].minor.yy0);} +{sqlite3AddGenerated(pParse,yymsp[-2].minor.yy528,&yymsp[0].minor.yy0);} break; case 48: /* autoinc ::= AUTOINCR */ -{yymsp[0].minor.yy64 = 1;} +{yymsp[0].minor.yy394 = 1;} break; case 49: /* refargs ::= */ -{ yymsp[1].minor.yy64 = OE_None*0x0101; /* EV: R-19803-45884 */} +{ yymsp[1].minor.yy394 = OE_None*0x0101; /* EV: R-19803-45884 */} break; case 50: /* refargs ::= refargs refarg */ -{ yymsp[-1].minor.yy64 = (yymsp[-1].minor.yy64 & ~yymsp[0].minor.yy83.mask) | yymsp[0].minor.yy83.value; } +{ yymsp[-1].minor.yy394 = (yymsp[-1].minor.yy394 & ~yymsp[0].minor.yy231.mask) | yymsp[0].minor.yy231.value; } break; case 51: /* refarg ::= MATCH nm */ -{ yymsp[-1].minor.yy83.value = 0; yymsp[-1].minor.yy83.mask = 0x000000; } +{ yymsp[-1].minor.yy231.value = 0; yymsp[-1].minor.yy231.mask = 0x000000; } break; case 52: /* refarg ::= ON INSERT refact */ -{ yymsp[-2].minor.yy83.value = 0; yymsp[-2].minor.yy83.mask = 0x000000; } +{ yymsp[-2].minor.yy231.value = 0; yymsp[-2].minor.yy231.mask = 0x000000; } break; case 53: /* refarg ::= ON DELETE refact */ -{ yymsp[-2].minor.yy83.value = yymsp[0].minor.yy64; yymsp[-2].minor.yy83.mask = 0x0000ff; } +{ yymsp[-2].minor.yy231.value = yymsp[0].minor.yy394; yymsp[-2].minor.yy231.mask = 0x0000ff; } break; case 54: /* refarg ::= ON UPDATE refact */ -{ yymsp[-2].minor.yy83.value = yymsp[0].minor.yy64<<8; yymsp[-2].minor.yy83.mask = 0x00ff00; } +{ yymsp[-2].minor.yy231.value = yymsp[0].minor.yy394<<8; yymsp[-2].minor.yy231.mask = 0x00ff00; } break; case 55: /* refact ::= SET NULL */ -{ yymsp[-1].minor.yy64 = OE_SetNull; /* EV: R-33326-45252 */} +{ yymsp[-1].minor.yy394 = OE_SetNull; /* EV: R-33326-45252 */} break; case 56: /* refact ::= SET DEFAULT */ -{ yymsp[-1].minor.yy64 = OE_SetDflt; /* EV: R-33326-45252 */} +{ yymsp[-1].minor.yy394 = OE_SetDflt; /* EV: R-33326-45252 */} break; case 57: /* refact ::= CASCADE */ -{ yymsp[0].minor.yy64 = OE_Cascade; /* EV: R-33326-45252 */} +{ yymsp[0].minor.yy394 = OE_Cascade; /* EV: R-33326-45252 */} break; case 58: /* refact ::= RESTRICT */ -{ yymsp[0].minor.yy64 = OE_Restrict; /* EV: R-33326-45252 */} +{ yymsp[0].minor.yy394 = OE_Restrict; /* EV: R-33326-45252 */} break; case 59: /* refact ::= NO ACTION */ -{ yymsp[-1].minor.yy64 = OE_None; /* EV: R-33326-45252 */} +{ yymsp[-1].minor.yy394 = OE_None; /* EV: R-33326-45252 */} break; case 60: /* defer_subclause ::= NOT DEFERRABLE init_deferred_pred_opt */ -{yymsp[-2].minor.yy64 = 0;} +{yymsp[-2].minor.yy394 = 0;} break; case 61: /* defer_subclause ::= DEFERRABLE init_deferred_pred_opt */ case 76: /* orconf ::= OR resolvetype */ yytestcase(yyruleno==76); case 171: /* insert_cmd ::= INSERT orconf */ yytestcase(yyruleno==171); -{yymsp[-1].minor.yy64 = yymsp[0].minor.yy64;} +{yymsp[-1].minor.yy394 = yymsp[0].minor.yy394;} break; case 63: /* init_deferred_pred_opt ::= INITIALLY DEFERRED */ case 80: /* ifexists ::= IF EXISTS */ yytestcase(yyruleno==80); - case 213: /* between_op ::= NOT BETWEEN */ yytestcase(yyruleno==213); - case 216: /* in_op ::= NOT IN */ yytestcase(yyruleno==216); - case 242: /* collate ::= COLLATE ID|STRING */ yytestcase(yyruleno==242); -{yymsp[-1].minor.yy64 = 1;} + case 214: /* between_op ::= NOT BETWEEN */ yytestcase(yyruleno==214); + case 217: /* in_op ::= NOT IN */ yytestcase(yyruleno==217); + case 243: /* collate ::= COLLATE ID|STRING */ yytestcase(yyruleno==243); +{yymsp[-1].minor.yy394 = 1;} break; case 64: /* init_deferred_pred_opt ::= INITIALLY IMMEDIATE */ -{yymsp[-1].minor.yy64 = 0;} +{yymsp[-1].minor.yy394 = 0;} break; case 66: /* tconscomma ::= COMMA */ {pParse->constraintName.n = 0;} break; case 68: /* tcons ::= PRIMARY KEY LP sortlist autoinc RP onconf */ -{sqlite3AddPrimaryKey(pParse,yymsp[-3].minor.yy562,yymsp[0].minor.yy64,yymsp[-2].minor.yy64,0);} +{sqlite3AddPrimaryKey(pParse,yymsp[-3].minor.yy322,yymsp[0].minor.yy394,yymsp[-2].minor.yy394,0);} break; case 69: /* tcons ::= UNIQUE LP sortlist RP onconf */ -{sqlite3CreateIndex(pParse,0,0,0,yymsp[-2].minor.yy562,yymsp[0].minor.yy64,0,0,0,0, +{sqlite3CreateIndex(pParse,0,0,0,yymsp[-2].minor.yy322,yymsp[0].minor.yy394,0,0,0,0, SQLITE_IDXTYPE_UNIQUE);} break; case 70: /* tcons ::= CHECK LP expr RP onconf */ -{sqlite3AddCheckConstraint(pParse,yymsp[-2].minor.yy626,yymsp[-3].minor.yy0.z,yymsp[-1].minor.yy0.z);} +{sqlite3AddCheckConstraint(pParse,yymsp[-2].minor.yy528,yymsp[-3].minor.yy0.z,yymsp[-1].minor.yy0.z);} break; case 71: /* tcons ::= FOREIGN KEY LP eidlist RP REFERENCES nm eidlist_opt refargs defer_subclause_opt */ { - sqlite3CreateForeignKey(pParse, yymsp[-6].minor.yy562, &yymsp[-3].minor.yy0, yymsp[-2].minor.yy562, yymsp[-1].minor.yy64); - sqlite3DeferForeignKey(pParse, yymsp[0].minor.yy64); + sqlite3CreateForeignKey(pParse, yymsp[-6].minor.yy322, &yymsp[-3].minor.yy0, yymsp[-2].minor.yy322, yymsp[-1].minor.yy394); + sqlite3DeferForeignKey(pParse, yymsp[0].minor.yy394); } break; case 73: /* onconf ::= */ case 75: /* orconf ::= */ yytestcase(yyruleno==75); -{yymsp[1].minor.yy64 = OE_Default;} +{yymsp[1].minor.yy394 = OE_Default;} break; case 74: /* onconf ::= ON CONFLICT resolvetype */ -{yymsp[-2].minor.yy64 = yymsp[0].minor.yy64;} +{yymsp[-2].minor.yy394 = yymsp[0].minor.yy394;} break; case 77: /* resolvetype ::= IGNORE */ -{yymsp[0].minor.yy64 = OE_Ignore;} +{yymsp[0].minor.yy394 = OE_Ignore;} break; case 78: /* resolvetype ::= REPLACE */ case 172: /* insert_cmd ::= REPLACE */ yytestcase(yyruleno==172); -{yymsp[0].minor.yy64 = OE_Replace;} +{yymsp[0].minor.yy394 = OE_Replace;} break; case 79: /* cmd ::= DROP TABLE ifexists fullname */ { - sqlite3DropTable(pParse, yymsp[0].minor.yy607, 0, yymsp[-1].minor.yy64); + sqlite3DropTable(pParse, yymsp[0].minor.yy131, 0, yymsp[-1].minor.yy394); } break; case 82: /* cmd ::= createkw temp VIEW ifnotexists nm dbnm eidlist_opt AS select */ { - sqlite3CreateView(pParse, &yymsp[-8].minor.yy0, &yymsp[-4].minor.yy0, &yymsp[-3].minor.yy0, yymsp[-2].minor.yy562, yymsp[0].minor.yy303, yymsp[-7].minor.yy64, yymsp[-5].minor.yy64); + sqlite3CreateView(pParse, &yymsp[-8].minor.yy0, &yymsp[-4].minor.yy0, &yymsp[-3].minor.yy0, yymsp[-2].minor.yy322, yymsp[0].minor.yy47, yymsp[-7].minor.yy394, yymsp[-5].minor.yy394); } break; case 83: /* cmd ::= DROP VIEW ifexists fullname */ { - sqlite3DropTable(pParse, yymsp[0].minor.yy607, 1, yymsp[-1].minor.yy64); + sqlite3DropTable(pParse, yymsp[0].minor.yy131, 1, yymsp[-1].minor.yy394); } break; case 84: /* cmd ::= select */ { SelectDest dest = {SRT_Output, 0, 0, 0, 0, 0, 0}; - sqlite3Select(pParse, yymsp[0].minor.yy303, &dest); - sqlite3SelectDelete(pParse->db, yymsp[0].minor.yy303); + sqlite3Select(pParse, yymsp[0].minor.yy47, &dest); + sqlite3SelectDelete(pParse->db, yymsp[0].minor.yy47); } break; case 85: /* select ::= WITH wqlist selectnowith */ -{yymsp[-2].minor.yy303 = attachWithToSelect(pParse,yymsp[0].minor.yy303,yymsp[-1].minor.yy43);} +{yymsp[-2].minor.yy47 = attachWithToSelect(pParse,yymsp[0].minor.yy47,yymsp[-1].minor.yy521);} break; case 86: /* select ::= WITH RECURSIVE wqlist selectnowith */ -{yymsp[-3].minor.yy303 = attachWithToSelect(pParse,yymsp[0].minor.yy303,yymsp[-1].minor.yy43);} +{yymsp[-3].minor.yy47 = attachWithToSelect(pParse,yymsp[0].minor.yy47,yymsp[-1].minor.yy521);} break; case 87: /* select ::= selectnowith */ { - Select *p = yymsp[0].minor.yy303; + Select *p = yymsp[0].minor.yy47; if( p ){ parserDoubleLinkSelect(pParse, p); } - yymsp[0].minor.yy303 = p; /*A-overwrites-X*/ + yymsp[0].minor.yy47 = p; /*A-overwrites-X*/ } break; case 88: /* selectnowith ::= selectnowith multiselect_op oneselect */ { - Select *pRhs = yymsp[0].minor.yy303; - Select *pLhs = yymsp[-2].minor.yy303; + Select *pRhs = yymsp[0].minor.yy47; + Select *pLhs = yymsp[-2].minor.yy47; if( pRhs && pRhs->pPrior ){ SrcList *pFrom; Token x; @@ -163356,140 +165250,140 @@ static YYACTIONTYPE yy_reduce( pRhs = sqlite3SelectNew(pParse,0,pFrom,0,0,0,0,0,0); } if( pRhs ){ - pRhs->op = (u8)yymsp[-1].minor.yy64; + pRhs->op = (u8)yymsp[-1].minor.yy394; pRhs->pPrior = pLhs; if( ALWAYS(pLhs) ) pLhs->selFlags &= ~SF_MultiValue; pRhs->selFlags &= ~SF_MultiValue; - if( yymsp[-1].minor.yy64!=TK_ALL ) pParse->hasCompound = 1; + if( yymsp[-1].minor.yy394!=TK_ALL ) pParse->hasCompound = 1; }else{ sqlite3SelectDelete(pParse->db, pLhs); } - yymsp[-2].minor.yy303 = pRhs; + yymsp[-2].minor.yy47 = pRhs; } break; case 89: /* multiselect_op ::= UNION */ case 91: /* multiselect_op ::= EXCEPT|INTERSECT */ yytestcase(yyruleno==91); -{yymsp[0].minor.yy64 = yymsp[0].major; /*A-overwrites-OP*/} +{yymsp[0].minor.yy394 = yymsp[0].major; /*A-overwrites-OP*/} break; case 90: /* multiselect_op ::= UNION ALL */ -{yymsp[-1].minor.yy64 = TK_ALL;} +{yymsp[-1].minor.yy394 = TK_ALL;} break; case 92: /* oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt orderby_opt limit_opt */ { - yymsp[-8].minor.yy303 = sqlite3SelectNew(pParse,yymsp[-6].minor.yy562,yymsp[-5].minor.yy607,yymsp[-4].minor.yy626,yymsp[-3].minor.yy562,yymsp[-2].minor.yy626,yymsp[-1].minor.yy562,yymsp[-7].minor.yy64,yymsp[0].minor.yy626); + yymsp[-8].minor.yy47 = sqlite3SelectNew(pParse,yymsp[-6].minor.yy322,yymsp[-5].minor.yy131,yymsp[-4].minor.yy528,yymsp[-3].minor.yy322,yymsp[-2].minor.yy528,yymsp[-1].minor.yy322,yymsp[-7].minor.yy394,yymsp[0].minor.yy528); } break; case 93: /* oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt window_clause orderby_opt limit_opt */ { - yymsp[-9].minor.yy303 = sqlite3SelectNew(pParse,yymsp[-7].minor.yy562,yymsp[-6].minor.yy607,yymsp[-5].minor.yy626,yymsp[-4].minor.yy562,yymsp[-3].minor.yy626,yymsp[-1].minor.yy562,yymsp[-8].minor.yy64,yymsp[0].minor.yy626); - if( yymsp[-9].minor.yy303 ){ - yymsp[-9].minor.yy303->pWinDefn = yymsp[-2].minor.yy375; + yymsp[-9].minor.yy47 = sqlite3SelectNew(pParse,yymsp[-7].minor.yy322,yymsp[-6].minor.yy131,yymsp[-5].minor.yy528,yymsp[-4].minor.yy322,yymsp[-3].minor.yy528,yymsp[-1].minor.yy322,yymsp[-8].minor.yy394,yymsp[0].minor.yy528); + if( yymsp[-9].minor.yy47 ){ + yymsp[-9].minor.yy47->pWinDefn = yymsp[-2].minor.yy41; }else{ - sqlite3WindowListDelete(pParse->db, yymsp[-2].minor.yy375); + sqlite3WindowListDelete(pParse->db, yymsp[-2].minor.yy41); } } break; case 94: /* values ::= VALUES LP nexprlist RP */ { - yymsp[-3].minor.yy303 = sqlite3SelectNew(pParse,yymsp[-1].minor.yy562,0,0,0,0,0,SF_Values,0); + yymsp[-3].minor.yy47 = sqlite3SelectNew(pParse,yymsp[-1].minor.yy322,0,0,0,0,0,SF_Values,0); } break; case 95: /* values ::= values COMMA LP nexprlist RP */ { - Select *pRight, *pLeft = yymsp[-4].minor.yy303; - pRight = sqlite3SelectNew(pParse,yymsp[-1].minor.yy562,0,0,0,0,0,SF_Values|SF_MultiValue,0); + Select *pRight, *pLeft = yymsp[-4].minor.yy47; + pRight = sqlite3SelectNew(pParse,yymsp[-1].minor.yy322,0,0,0,0,0,SF_Values|SF_MultiValue,0); if( ALWAYS(pLeft) ) pLeft->selFlags &= ~SF_MultiValue; if( pRight ){ pRight->op = TK_ALL; pRight->pPrior = pLeft; - yymsp[-4].minor.yy303 = pRight; + yymsp[-4].minor.yy47 = pRight; }else{ - yymsp[-4].minor.yy303 = pLeft; + yymsp[-4].minor.yy47 = pLeft; } } break; case 96: /* distinct ::= DISTINCT */ -{yymsp[0].minor.yy64 = SF_Distinct;} +{yymsp[0].minor.yy394 = SF_Distinct;} break; case 97: /* distinct ::= ALL */ -{yymsp[0].minor.yy64 = SF_All;} +{yymsp[0].minor.yy394 = SF_All;} break; case 99: /* sclp ::= */ case 132: /* orderby_opt ::= */ yytestcase(yyruleno==132); case 142: /* groupby_opt ::= */ yytestcase(yyruleno==142); - case 229: /* exprlist ::= */ yytestcase(yyruleno==229); - case 232: /* paren_exprlist ::= */ yytestcase(yyruleno==232); - case 237: /* eidlist_opt ::= */ yytestcase(yyruleno==237); -{yymsp[1].minor.yy562 = 0;} + case 230: /* exprlist ::= */ yytestcase(yyruleno==230); + case 233: /* paren_exprlist ::= */ yytestcase(yyruleno==233); + case 238: /* eidlist_opt ::= */ yytestcase(yyruleno==238); +{yymsp[1].minor.yy322 = 0;} break; case 100: /* selcollist ::= sclp scanpt expr scanpt as */ { - yymsp[-4].minor.yy562 = sqlite3ExprListAppend(pParse, yymsp[-4].minor.yy562, yymsp[-2].minor.yy626); - if( yymsp[0].minor.yy0.n>0 ) sqlite3ExprListSetName(pParse, yymsp[-4].minor.yy562, &yymsp[0].minor.yy0, 1); - sqlite3ExprListSetSpan(pParse,yymsp[-4].minor.yy562,yymsp[-3].minor.yy600,yymsp[-1].minor.yy600); + yymsp[-4].minor.yy322 = sqlite3ExprListAppend(pParse, yymsp[-4].minor.yy322, yymsp[-2].minor.yy528); + if( yymsp[0].minor.yy0.n>0 ) sqlite3ExprListSetName(pParse, yymsp[-4].minor.yy322, &yymsp[0].minor.yy0, 1); + sqlite3ExprListSetSpan(pParse,yymsp[-4].minor.yy322,yymsp[-3].minor.yy522,yymsp[-1].minor.yy522); } break; case 101: /* selcollist ::= sclp scanpt STAR */ { Expr *p = sqlite3Expr(pParse->db, TK_ASTERISK, 0); - yymsp[-2].minor.yy562 = sqlite3ExprListAppend(pParse, yymsp[-2].minor.yy562, p); + yymsp[-2].minor.yy322 = sqlite3ExprListAppend(pParse, yymsp[-2].minor.yy322, p); } break; case 102: /* selcollist ::= sclp scanpt nm DOT STAR */ { Expr *pRight = sqlite3PExpr(pParse, TK_ASTERISK, 0, 0); - Expr *pLeft = sqlite3ExprAlloc(pParse->db, TK_ID, &yymsp[-2].minor.yy0, 1); + Expr *pLeft = tokenExpr(pParse, TK_ID, yymsp[-2].minor.yy0); Expr *pDot = sqlite3PExpr(pParse, TK_DOT, pLeft, pRight); - yymsp[-4].minor.yy562 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy562, pDot); + yymsp[-4].minor.yy322 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy322, pDot); } break; case 103: /* as ::= AS nm */ case 114: /* dbnm ::= DOT nm */ yytestcase(yyruleno==114); - case 253: /* plus_num ::= PLUS INTEGER|FLOAT */ yytestcase(yyruleno==253); - case 254: /* minus_num ::= MINUS INTEGER|FLOAT */ yytestcase(yyruleno==254); + case 254: /* plus_num ::= PLUS INTEGER|FLOAT */ yytestcase(yyruleno==254); + case 255: /* minus_num ::= MINUS INTEGER|FLOAT */ yytestcase(yyruleno==255); {yymsp[-1].minor.yy0 = yymsp[0].minor.yy0;} break; case 105: /* from ::= */ case 108: /* stl_prefix ::= */ yytestcase(yyruleno==108); -{yymsp[1].minor.yy607 = 0;} +{yymsp[1].minor.yy131 = 0;} break; case 106: /* from ::= FROM seltablist */ { - yymsp[-1].minor.yy607 = yymsp[0].minor.yy607; - sqlite3SrcListShiftJoinType(yymsp[-1].minor.yy607); + yymsp[-1].minor.yy131 = yymsp[0].minor.yy131; + sqlite3SrcListShiftJoinType(yymsp[-1].minor.yy131); } break; case 107: /* stl_prefix ::= seltablist joinop */ { - if( ALWAYS(yymsp[-1].minor.yy607 && yymsp[-1].minor.yy607->nSrc>0) ) yymsp[-1].minor.yy607->a[yymsp[-1].minor.yy607->nSrc-1].fg.jointype = (u8)yymsp[0].minor.yy64; + if( ALWAYS(yymsp[-1].minor.yy131 && yymsp[-1].minor.yy131->nSrc>0) ) yymsp[-1].minor.yy131->a[yymsp[-1].minor.yy131->nSrc-1].fg.jointype = (u8)yymsp[0].minor.yy394; } break; case 109: /* seltablist ::= stl_prefix nm dbnm as indexed_opt on_opt using_opt */ { - yymsp[-6].minor.yy607 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy607,&yymsp[-5].minor.yy0,&yymsp[-4].minor.yy0,&yymsp[-3].minor.yy0,0,yymsp[-1].minor.yy626,yymsp[0].minor.yy240); - sqlite3SrcListIndexedBy(pParse, yymsp[-6].minor.yy607, &yymsp[-2].minor.yy0); + yymsp[-6].minor.yy131 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy131,&yymsp[-5].minor.yy0,&yymsp[-4].minor.yy0,&yymsp[-3].minor.yy0,0,yymsp[-1].minor.yy528,yymsp[0].minor.yy254); + sqlite3SrcListIndexedBy(pParse, yymsp[-6].minor.yy131, &yymsp[-2].minor.yy0); } break; case 110: /* seltablist ::= stl_prefix nm dbnm LP exprlist RP as on_opt using_opt */ { - yymsp[-8].minor.yy607 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-8].minor.yy607,&yymsp[-7].minor.yy0,&yymsp[-6].minor.yy0,&yymsp[-2].minor.yy0,0,yymsp[-1].minor.yy626,yymsp[0].minor.yy240); - sqlite3SrcListFuncArgs(pParse, yymsp[-8].minor.yy607, yymsp[-4].minor.yy562); + yymsp[-8].minor.yy131 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-8].minor.yy131,&yymsp[-7].minor.yy0,&yymsp[-6].minor.yy0,&yymsp[-2].minor.yy0,0,yymsp[-1].minor.yy528,yymsp[0].minor.yy254); + sqlite3SrcListFuncArgs(pParse, yymsp[-8].minor.yy131, yymsp[-4].minor.yy322); } break; case 111: /* seltablist ::= stl_prefix LP select RP as on_opt using_opt */ { - yymsp[-6].minor.yy607 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy607,0,0,&yymsp[-2].minor.yy0,yymsp[-4].minor.yy303,yymsp[-1].minor.yy626,yymsp[0].minor.yy240); + yymsp[-6].minor.yy131 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy131,0,0,&yymsp[-2].minor.yy0,yymsp[-4].minor.yy47,yymsp[-1].minor.yy528,yymsp[0].minor.yy254); } break; case 112: /* seltablist ::= stl_prefix LP seltablist RP as on_opt using_opt */ { - if( yymsp[-6].minor.yy607==0 && yymsp[-2].minor.yy0.n==0 && yymsp[-1].minor.yy626==0 && yymsp[0].minor.yy240==0 ){ - yymsp[-6].minor.yy607 = yymsp[-4].minor.yy607; - }else if( yymsp[-4].minor.yy607->nSrc==1 ){ - yymsp[-6].minor.yy607 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy607,0,0,&yymsp[-2].minor.yy0,0,yymsp[-1].minor.yy626,yymsp[0].minor.yy240); - if( yymsp[-6].minor.yy607 ){ - SrcItem *pNew = &yymsp[-6].minor.yy607->a[yymsp[-6].minor.yy607->nSrc-1]; - SrcItem *pOld = yymsp[-4].minor.yy607->a; + if( yymsp[-6].minor.yy131==0 && yymsp[-2].minor.yy0.n==0 && yymsp[-1].minor.yy528==0 && yymsp[0].minor.yy254==0 ){ + yymsp[-6].minor.yy131 = yymsp[-4].minor.yy131; + }else if( yymsp[-4].minor.yy131->nSrc==1 ){ + yymsp[-6].minor.yy131 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy131,0,0,&yymsp[-2].minor.yy0,0,yymsp[-1].minor.yy528,yymsp[0].minor.yy254); + if( yymsp[-6].minor.yy131 ){ + SrcItem *pNew = &yymsp[-6].minor.yy131->a[yymsp[-6].minor.yy131->nSrc-1]; + SrcItem *pOld = yymsp[-4].minor.yy131->a; pNew->zName = pOld->zName; pNew->zDatabase = pOld->zDatabase; pNew->pSelect = pOld->pSelect; @@ -163502,12 +165396,12 @@ static YYACTIONTYPE yy_reduce( pOld->zName = pOld->zDatabase = 0; pOld->pSelect = 0; } - sqlite3SrcListDelete(pParse->db, yymsp[-4].minor.yy607); + sqlite3SrcListDelete(pParse->db, yymsp[-4].minor.yy131); }else{ Select *pSubquery; - sqlite3SrcListShiftJoinType(yymsp[-4].minor.yy607); - pSubquery = sqlite3SelectNew(pParse,0,yymsp[-4].minor.yy607,0,0,0,0,SF_NestedFrom,0); - yymsp[-6].minor.yy607 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy607,0,0,&yymsp[-2].minor.yy0,pSubquery,yymsp[-1].minor.yy626,yymsp[0].minor.yy240); + sqlite3SrcListShiftJoinType(yymsp[-4].minor.yy131); + pSubquery = sqlite3SelectNew(pParse,0,yymsp[-4].minor.yy131,0,0,0,0,SF_NestedFrom,0); + yymsp[-6].minor.yy131 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy131,0,0,&yymsp[-2].minor.yy0,pSubquery,yymsp[-1].minor.yy528,yymsp[0].minor.yy254); } } break; @@ -163517,65 +165411,65 @@ static YYACTIONTYPE yy_reduce( break; case 115: /* fullname ::= nm */ { - yylhsminor.yy607 = sqlite3SrcListAppend(pParse,0,&yymsp[0].minor.yy0,0); - if( IN_RENAME_OBJECT && yylhsminor.yy607 ) sqlite3RenameTokenMap(pParse, yylhsminor.yy607->a[0].zName, &yymsp[0].minor.yy0); + yylhsminor.yy131 = sqlite3SrcListAppend(pParse,0,&yymsp[0].minor.yy0,0); + if( IN_RENAME_OBJECT && yylhsminor.yy131 ) sqlite3RenameTokenMap(pParse, yylhsminor.yy131->a[0].zName, &yymsp[0].minor.yy0); } - yymsp[0].minor.yy607 = yylhsminor.yy607; + yymsp[0].minor.yy131 = yylhsminor.yy131; break; case 116: /* fullname ::= nm DOT nm */ { - yylhsminor.yy607 = sqlite3SrcListAppend(pParse,0,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0); - if( IN_RENAME_OBJECT && yylhsminor.yy607 ) sqlite3RenameTokenMap(pParse, yylhsminor.yy607->a[0].zName, &yymsp[0].minor.yy0); + yylhsminor.yy131 = sqlite3SrcListAppend(pParse,0,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0); + if( IN_RENAME_OBJECT && yylhsminor.yy131 ) sqlite3RenameTokenMap(pParse, yylhsminor.yy131->a[0].zName, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy607 = yylhsminor.yy607; + yymsp[-2].minor.yy131 = yylhsminor.yy131; break; case 117: /* xfullname ::= nm */ -{yymsp[0].minor.yy607 = sqlite3SrcListAppend(pParse,0,&yymsp[0].minor.yy0,0); /*A-overwrites-X*/} +{yymsp[0].minor.yy131 = sqlite3SrcListAppend(pParse,0,&yymsp[0].minor.yy0,0); /*A-overwrites-X*/} break; case 118: /* xfullname ::= nm DOT nm */ -{yymsp[-2].minor.yy607 = sqlite3SrcListAppend(pParse,0,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0); /*A-overwrites-X*/} +{yymsp[-2].minor.yy131 = sqlite3SrcListAppend(pParse,0,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0); /*A-overwrites-X*/} break; case 119: /* xfullname ::= nm DOT nm AS nm */ { - yymsp[-4].minor.yy607 = sqlite3SrcListAppend(pParse,0,&yymsp[-4].minor.yy0,&yymsp[-2].minor.yy0); /*A-overwrites-X*/ - if( yymsp[-4].minor.yy607 ) yymsp[-4].minor.yy607->a[0].zAlias = sqlite3NameFromToken(pParse->db, &yymsp[0].minor.yy0); + yymsp[-4].minor.yy131 = sqlite3SrcListAppend(pParse,0,&yymsp[-4].minor.yy0,&yymsp[-2].minor.yy0); /*A-overwrites-X*/ + if( yymsp[-4].minor.yy131 ) yymsp[-4].minor.yy131->a[0].zAlias = sqlite3NameFromToken(pParse->db, &yymsp[0].minor.yy0); } break; case 120: /* xfullname ::= nm AS nm */ { - yymsp[-2].minor.yy607 = sqlite3SrcListAppend(pParse,0,&yymsp[-2].minor.yy0,0); /*A-overwrites-X*/ - if( yymsp[-2].minor.yy607 ) yymsp[-2].minor.yy607->a[0].zAlias = sqlite3NameFromToken(pParse->db, &yymsp[0].minor.yy0); + yymsp[-2].minor.yy131 = sqlite3SrcListAppend(pParse,0,&yymsp[-2].minor.yy0,0); /*A-overwrites-X*/ + if( yymsp[-2].minor.yy131 ) yymsp[-2].minor.yy131->a[0].zAlias = sqlite3NameFromToken(pParse->db, &yymsp[0].minor.yy0); } break; case 121: /* joinop ::= COMMA|JOIN */ -{ yymsp[0].minor.yy64 = JT_INNER; } +{ yymsp[0].minor.yy394 = JT_INNER; } break; case 122: /* joinop ::= JOIN_KW JOIN */ -{yymsp[-1].minor.yy64 = sqlite3JoinType(pParse,&yymsp[-1].minor.yy0,0,0); /*X-overwrites-A*/} +{yymsp[-1].minor.yy394 = sqlite3JoinType(pParse,&yymsp[-1].minor.yy0,0,0); /*X-overwrites-A*/} break; case 123: /* joinop ::= JOIN_KW nm JOIN */ -{yymsp[-2].minor.yy64 = sqlite3JoinType(pParse,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0,0); /*X-overwrites-A*/} +{yymsp[-2].minor.yy394 = sqlite3JoinType(pParse,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0,0); /*X-overwrites-A*/} break; case 124: /* joinop ::= JOIN_KW nm nm JOIN */ -{yymsp[-3].minor.yy64 = sqlite3JoinType(pParse,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0);/*X-overwrites-A*/} +{yymsp[-3].minor.yy394 = sqlite3JoinType(pParse,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0);/*X-overwrites-A*/} break; case 125: /* on_opt ::= ON expr */ case 145: /* having_opt ::= HAVING expr */ yytestcase(yyruleno==145); case 152: /* where_opt ::= WHERE expr */ yytestcase(yyruleno==152); case 154: /* where_opt_ret ::= WHERE expr */ yytestcase(yyruleno==154); - case 225: /* case_else ::= ELSE expr */ yytestcase(yyruleno==225); - case 246: /* vinto ::= INTO expr */ yytestcase(yyruleno==246); -{yymsp[-1].minor.yy626 = yymsp[0].minor.yy626;} + case 226: /* case_else ::= ELSE expr */ yytestcase(yyruleno==226); + case 247: /* vinto ::= INTO expr */ yytestcase(yyruleno==247); +{yymsp[-1].minor.yy528 = yymsp[0].minor.yy528;} break; case 126: /* on_opt ::= */ case 144: /* having_opt ::= */ yytestcase(yyruleno==144); case 146: /* limit_opt ::= */ yytestcase(yyruleno==146); case 151: /* where_opt ::= */ yytestcase(yyruleno==151); case 153: /* where_opt_ret ::= */ yytestcase(yyruleno==153); - case 226: /* case_else ::= */ yytestcase(yyruleno==226); - case 228: /* case_operand ::= */ yytestcase(yyruleno==228); - case 247: /* vinto ::= */ yytestcase(yyruleno==247); -{yymsp[1].minor.yy626 = 0;} + case 227: /* case_else ::= */ yytestcase(yyruleno==227); + case 229: /* case_operand ::= */ yytestcase(yyruleno==229); + case 248: /* vinto ::= */ yytestcase(yyruleno==248); +{yymsp[1].minor.yy528 = 0;} break; case 128: /* indexed_opt ::= INDEXED BY nm */ {yymsp[-2].minor.yy0 = yymsp[0].minor.yy0;} @@ -163584,185 +165478,181 @@ static YYACTIONTYPE yy_reduce( {yymsp[-1].minor.yy0.z=0; yymsp[-1].minor.yy0.n=1;} break; case 130: /* using_opt ::= USING LP idlist RP */ -{yymsp[-3].minor.yy240 = yymsp[-1].minor.yy240;} +{yymsp[-3].minor.yy254 = yymsp[-1].minor.yy254;} break; case 131: /* using_opt ::= */ case 173: /* idlist_opt ::= */ yytestcase(yyruleno==173); -{yymsp[1].minor.yy240 = 0;} +{yymsp[1].minor.yy254 = 0;} break; case 133: /* orderby_opt ::= ORDER BY sortlist */ case 143: /* groupby_opt ::= GROUP BY nexprlist */ yytestcase(yyruleno==143); -{yymsp[-2].minor.yy562 = yymsp[0].minor.yy562;} +{yymsp[-2].minor.yy322 = yymsp[0].minor.yy322;} break; case 134: /* sortlist ::= sortlist COMMA expr sortorder nulls */ { - yymsp[-4].minor.yy562 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy562,yymsp[-2].minor.yy626); - sqlite3ExprListSetSortOrder(yymsp[-4].minor.yy562,yymsp[-1].minor.yy64,yymsp[0].minor.yy64); + yymsp[-4].minor.yy322 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy322,yymsp[-2].minor.yy528); + sqlite3ExprListSetSortOrder(yymsp[-4].minor.yy322,yymsp[-1].minor.yy394,yymsp[0].minor.yy394); } break; case 135: /* sortlist ::= expr sortorder nulls */ { - yymsp[-2].minor.yy562 = sqlite3ExprListAppend(pParse,0,yymsp[-2].minor.yy626); /*A-overwrites-Y*/ - sqlite3ExprListSetSortOrder(yymsp[-2].minor.yy562,yymsp[-1].minor.yy64,yymsp[0].minor.yy64); + yymsp[-2].minor.yy322 = sqlite3ExprListAppend(pParse,0,yymsp[-2].minor.yy528); /*A-overwrites-Y*/ + sqlite3ExprListSetSortOrder(yymsp[-2].minor.yy322,yymsp[-1].minor.yy394,yymsp[0].minor.yy394); } break; case 136: /* sortorder ::= ASC */ -{yymsp[0].minor.yy64 = SQLITE_SO_ASC;} +{yymsp[0].minor.yy394 = SQLITE_SO_ASC;} break; case 137: /* sortorder ::= DESC */ -{yymsp[0].minor.yy64 = SQLITE_SO_DESC;} +{yymsp[0].minor.yy394 = SQLITE_SO_DESC;} break; case 138: /* sortorder ::= */ case 141: /* nulls ::= */ yytestcase(yyruleno==141); -{yymsp[1].minor.yy64 = SQLITE_SO_UNDEFINED;} +{yymsp[1].minor.yy394 = SQLITE_SO_UNDEFINED;} break; case 139: /* nulls ::= NULLS FIRST */ -{yymsp[-1].minor.yy64 = SQLITE_SO_ASC;} +{yymsp[-1].minor.yy394 = SQLITE_SO_ASC;} break; case 140: /* nulls ::= NULLS LAST */ -{yymsp[-1].minor.yy64 = SQLITE_SO_DESC;} +{yymsp[-1].minor.yy394 = SQLITE_SO_DESC;} break; case 147: /* limit_opt ::= LIMIT expr */ -{yymsp[-1].minor.yy626 = sqlite3PExpr(pParse,TK_LIMIT,yymsp[0].minor.yy626,0);} +{yymsp[-1].minor.yy528 = sqlite3PExpr(pParse,TK_LIMIT,yymsp[0].minor.yy528,0);} break; case 148: /* limit_opt ::= LIMIT expr OFFSET expr */ -{yymsp[-3].minor.yy626 = sqlite3PExpr(pParse,TK_LIMIT,yymsp[-2].minor.yy626,yymsp[0].minor.yy626);} +{yymsp[-3].minor.yy528 = sqlite3PExpr(pParse,TK_LIMIT,yymsp[-2].minor.yy528,yymsp[0].minor.yy528);} break; case 149: /* limit_opt ::= LIMIT expr COMMA expr */ -{yymsp[-3].minor.yy626 = sqlite3PExpr(pParse,TK_LIMIT,yymsp[0].minor.yy626,yymsp[-2].minor.yy626);} +{yymsp[-3].minor.yy528 = sqlite3PExpr(pParse,TK_LIMIT,yymsp[0].minor.yy528,yymsp[-2].minor.yy528);} break; case 150: /* cmd ::= with DELETE FROM xfullname indexed_opt where_opt_ret */ { - sqlite3SrcListIndexedBy(pParse, yymsp[-2].minor.yy607, &yymsp[-1].minor.yy0); - sqlite3DeleteFrom(pParse,yymsp[-2].minor.yy607,yymsp[0].minor.yy626,0,0); + sqlite3SrcListIndexedBy(pParse, yymsp[-2].minor.yy131, &yymsp[-1].minor.yy0); + sqlite3DeleteFrom(pParse,yymsp[-2].minor.yy131,yymsp[0].minor.yy528,0,0); } break; case 155: /* where_opt_ret ::= RETURNING selcollist */ -{sqlite3AddReturning(pParse,yymsp[0].minor.yy562); yymsp[-1].minor.yy626 = 0;} +{sqlite3AddReturning(pParse,yymsp[0].minor.yy322); yymsp[-1].minor.yy528 = 0;} break; case 156: /* where_opt_ret ::= WHERE expr RETURNING selcollist */ -{sqlite3AddReturning(pParse,yymsp[0].minor.yy562); yymsp[-3].minor.yy626 = yymsp[-2].minor.yy626;} +{sqlite3AddReturning(pParse,yymsp[0].minor.yy322); yymsp[-3].minor.yy528 = yymsp[-2].minor.yy528;} break; case 157: /* cmd ::= with UPDATE orconf xfullname indexed_opt SET setlist from where_opt_ret */ { - sqlite3SrcListIndexedBy(pParse, yymsp[-5].minor.yy607, &yymsp[-4].minor.yy0); - sqlite3ExprListCheckLength(pParse,yymsp[-2].minor.yy562,"set list"); - yymsp[-5].minor.yy607 = sqlite3SrcListAppendList(pParse, yymsp[-5].minor.yy607, yymsp[-1].minor.yy607); - sqlite3Update(pParse,yymsp[-5].minor.yy607,yymsp[-2].minor.yy562,yymsp[0].minor.yy626,yymsp[-6].minor.yy64,0,0,0); + sqlite3SrcListIndexedBy(pParse, yymsp[-5].minor.yy131, &yymsp[-4].minor.yy0); + sqlite3ExprListCheckLength(pParse,yymsp[-2].minor.yy322,"set list"); + yymsp[-5].minor.yy131 = sqlite3SrcListAppendList(pParse, yymsp[-5].minor.yy131, yymsp[-1].minor.yy131); + sqlite3Update(pParse,yymsp[-5].minor.yy131,yymsp[-2].minor.yy322,yymsp[0].minor.yy528,yymsp[-6].minor.yy394,0,0,0); } break; case 158: /* setlist ::= setlist COMMA nm EQ expr */ { - yymsp[-4].minor.yy562 = sqlite3ExprListAppend(pParse, yymsp[-4].minor.yy562, yymsp[0].minor.yy626); - sqlite3ExprListSetName(pParse, yymsp[-4].minor.yy562, &yymsp[-2].minor.yy0, 1); + yymsp[-4].minor.yy322 = sqlite3ExprListAppend(pParse, yymsp[-4].minor.yy322, yymsp[0].minor.yy528); + sqlite3ExprListSetName(pParse, yymsp[-4].minor.yy322, &yymsp[-2].minor.yy0, 1); } break; case 159: /* setlist ::= setlist COMMA LP idlist RP EQ expr */ { - yymsp[-6].minor.yy562 = sqlite3ExprListAppendVector(pParse, yymsp[-6].minor.yy562, yymsp[-3].minor.yy240, yymsp[0].minor.yy626); + yymsp[-6].minor.yy322 = sqlite3ExprListAppendVector(pParse, yymsp[-6].minor.yy322, yymsp[-3].minor.yy254, yymsp[0].minor.yy528); } break; case 160: /* setlist ::= nm EQ expr */ { - yylhsminor.yy562 = sqlite3ExprListAppend(pParse, 0, yymsp[0].minor.yy626); - sqlite3ExprListSetName(pParse, yylhsminor.yy562, &yymsp[-2].minor.yy0, 1); + yylhsminor.yy322 = sqlite3ExprListAppend(pParse, 0, yymsp[0].minor.yy528); + sqlite3ExprListSetName(pParse, yylhsminor.yy322, &yymsp[-2].minor.yy0, 1); } - yymsp[-2].minor.yy562 = yylhsminor.yy562; + yymsp[-2].minor.yy322 = yylhsminor.yy322; break; case 161: /* setlist ::= LP idlist RP EQ expr */ { - yymsp[-4].minor.yy562 = sqlite3ExprListAppendVector(pParse, 0, yymsp[-3].minor.yy240, yymsp[0].minor.yy626); + yymsp[-4].minor.yy322 = sqlite3ExprListAppendVector(pParse, 0, yymsp[-3].minor.yy254, yymsp[0].minor.yy528); } break; case 162: /* cmd ::= with insert_cmd INTO xfullname idlist_opt select upsert */ { - sqlite3Insert(pParse, yymsp[-3].minor.yy607, yymsp[-1].minor.yy303, yymsp[-2].minor.yy240, yymsp[-5].minor.yy64, yymsp[0].minor.yy138); + sqlite3Insert(pParse, yymsp[-3].minor.yy131, yymsp[-1].minor.yy47, yymsp[-2].minor.yy254, yymsp[-5].minor.yy394, yymsp[0].minor.yy444); } break; case 163: /* cmd ::= with insert_cmd INTO xfullname idlist_opt DEFAULT VALUES returning */ { - sqlite3Insert(pParse, yymsp[-4].minor.yy607, 0, yymsp[-3].minor.yy240, yymsp[-6].minor.yy64, 0); + sqlite3Insert(pParse, yymsp[-4].minor.yy131, 0, yymsp[-3].minor.yy254, yymsp[-6].minor.yy394, 0); } break; case 164: /* upsert ::= */ -{ yymsp[1].minor.yy138 = 0; } +{ yymsp[1].minor.yy444 = 0; } break; case 165: /* upsert ::= RETURNING selcollist */ -{ yymsp[-1].minor.yy138 = 0; sqlite3AddReturning(pParse,yymsp[0].minor.yy562); } +{ yymsp[-1].minor.yy444 = 0; sqlite3AddReturning(pParse,yymsp[0].minor.yy322); } break; case 166: /* upsert ::= ON CONFLICT LP sortlist RP where_opt DO UPDATE SET setlist where_opt upsert */ -{ yymsp[-11].minor.yy138 = sqlite3UpsertNew(pParse->db,yymsp[-8].minor.yy562,yymsp[-6].minor.yy626,yymsp[-2].minor.yy562,yymsp[-1].minor.yy626,yymsp[0].minor.yy138);} +{ yymsp[-11].minor.yy444 = sqlite3UpsertNew(pParse->db,yymsp[-8].minor.yy322,yymsp[-6].minor.yy528,yymsp[-2].minor.yy322,yymsp[-1].minor.yy528,yymsp[0].minor.yy444);} break; case 167: /* upsert ::= ON CONFLICT LP sortlist RP where_opt DO NOTHING upsert */ -{ yymsp[-8].minor.yy138 = sqlite3UpsertNew(pParse->db,yymsp[-5].minor.yy562,yymsp[-3].minor.yy626,0,0,yymsp[0].minor.yy138); } +{ yymsp[-8].minor.yy444 = sqlite3UpsertNew(pParse->db,yymsp[-5].minor.yy322,yymsp[-3].minor.yy528,0,0,yymsp[0].minor.yy444); } break; case 168: /* upsert ::= ON CONFLICT DO NOTHING returning */ -{ yymsp[-4].minor.yy138 = sqlite3UpsertNew(pParse->db,0,0,0,0,0); } +{ yymsp[-4].minor.yy444 = sqlite3UpsertNew(pParse->db,0,0,0,0,0); } break; case 169: /* upsert ::= ON CONFLICT DO UPDATE SET setlist where_opt returning */ -{ yymsp[-7].minor.yy138 = sqlite3UpsertNew(pParse->db,0,0,yymsp[-2].minor.yy562,yymsp[-1].minor.yy626,0);} +{ yymsp[-7].minor.yy444 = sqlite3UpsertNew(pParse->db,0,0,yymsp[-2].minor.yy322,yymsp[-1].minor.yy528,0);} break; case 170: /* returning ::= RETURNING selcollist */ -{sqlite3AddReturning(pParse,yymsp[0].minor.yy562);} +{sqlite3AddReturning(pParse,yymsp[0].minor.yy322);} break; case 174: /* idlist_opt ::= LP idlist RP */ -{yymsp[-2].minor.yy240 = yymsp[-1].minor.yy240;} +{yymsp[-2].minor.yy254 = yymsp[-1].minor.yy254;} break; case 175: /* idlist ::= idlist COMMA nm */ -{yymsp[-2].minor.yy240 = sqlite3IdListAppend(pParse,yymsp[-2].minor.yy240,&yymsp[0].minor.yy0);} +{yymsp[-2].minor.yy254 = sqlite3IdListAppend(pParse,yymsp[-2].minor.yy254,&yymsp[0].minor.yy0);} break; case 176: /* idlist ::= nm */ -{yymsp[0].minor.yy240 = sqlite3IdListAppend(pParse,0,&yymsp[0].minor.yy0); /*A-overwrites-Y*/} +{yymsp[0].minor.yy254 = sqlite3IdListAppend(pParse,0,&yymsp[0].minor.yy0); /*A-overwrites-Y*/} break; case 177: /* expr ::= LP expr RP */ -{yymsp[-2].minor.yy626 = yymsp[-1].minor.yy626;} +{yymsp[-2].minor.yy528 = yymsp[-1].minor.yy528;} break; case 178: /* expr ::= ID|INDEXED */ case 179: /* expr ::= JOIN_KW */ yytestcase(yyruleno==179); -{yymsp[0].minor.yy626=tokenExpr(pParse,TK_ID,yymsp[0].minor.yy0); /*A-overwrites-X*/} +{yymsp[0].minor.yy528=tokenExpr(pParse,TK_ID,yymsp[0].minor.yy0); /*A-overwrites-X*/} break; case 180: /* expr ::= nm DOT nm */ { - Expr *temp1 = sqlite3ExprAlloc(pParse->db, TK_ID, &yymsp[-2].minor.yy0, 1); - Expr *temp2 = sqlite3ExprAlloc(pParse->db, TK_ID, &yymsp[0].minor.yy0, 1); - if( IN_RENAME_OBJECT ){ - sqlite3RenameTokenMap(pParse, (void*)temp2, &yymsp[0].minor.yy0); - sqlite3RenameTokenMap(pParse, (void*)temp1, &yymsp[-2].minor.yy0); - } - yylhsminor.yy626 = sqlite3PExpr(pParse, TK_DOT, temp1, temp2); + Expr *temp1 = tokenExpr(pParse,TK_ID,yymsp[-2].minor.yy0); + Expr *temp2 = tokenExpr(pParse,TK_ID,yymsp[0].minor.yy0); + yylhsminor.yy528 = sqlite3PExpr(pParse, TK_DOT, temp1, temp2); } - yymsp[-2].minor.yy626 = yylhsminor.yy626; + yymsp[-2].minor.yy528 = yylhsminor.yy528; break; case 181: /* expr ::= nm DOT nm DOT nm */ { - Expr *temp1 = sqlite3ExprAlloc(pParse->db, TK_ID, &yymsp[-4].minor.yy0, 1); - Expr *temp2 = sqlite3ExprAlloc(pParse->db, TK_ID, &yymsp[-2].minor.yy0, 1); - Expr *temp3 = sqlite3ExprAlloc(pParse->db, TK_ID, &yymsp[0].minor.yy0, 1); + Expr *temp1 = tokenExpr(pParse,TK_ID,yymsp[-4].minor.yy0); + Expr *temp2 = tokenExpr(pParse,TK_ID,yymsp[-2].minor.yy0); + Expr *temp3 = tokenExpr(pParse,TK_ID,yymsp[0].minor.yy0); Expr *temp4 = sqlite3PExpr(pParse, TK_DOT, temp2, temp3); if( IN_RENAME_OBJECT ){ - sqlite3RenameTokenMap(pParse, (void*)temp3, &yymsp[0].minor.yy0); - sqlite3RenameTokenMap(pParse, (void*)temp2, &yymsp[-2].minor.yy0); + sqlite3RenameTokenRemap(pParse, 0, temp1); } - yylhsminor.yy626 = sqlite3PExpr(pParse, TK_DOT, temp1, temp4); + yylhsminor.yy528 = sqlite3PExpr(pParse, TK_DOT, temp1, temp4); } - yymsp[-4].minor.yy626 = yylhsminor.yy626; + yymsp[-4].minor.yy528 = yylhsminor.yy528; break; case 182: /* term ::= NULL|FLOAT|BLOB */ case 183: /* term ::= STRING */ yytestcase(yyruleno==183); -{yymsp[0].minor.yy626=tokenExpr(pParse,yymsp[0].major,yymsp[0].minor.yy0); /*A-overwrites-X*/} +{yymsp[0].minor.yy528=tokenExpr(pParse,yymsp[0].major,yymsp[0].minor.yy0); /*A-overwrites-X*/} break; case 184: /* term ::= INTEGER */ { - yylhsminor.yy626 = sqlite3ExprAlloc(pParse->db, TK_INTEGER, &yymsp[0].minor.yy0, 1); + yylhsminor.yy528 = sqlite3ExprAlloc(pParse->db, TK_INTEGER, &yymsp[0].minor.yy0, 1); + if( yylhsminor.yy528 ) yylhsminor.yy528->w.iOfst = (int)(yymsp[0].minor.yy0.z - pParse->zTail); } - yymsp[0].minor.yy626 = yylhsminor.yy626; + yymsp[0].minor.yy528 = yylhsminor.yy528; break; case 185: /* expr ::= VARIABLE */ { if( !(yymsp[0].minor.yy0.z[0]=='#' && sqlite3Isdigit(yymsp[0].minor.yy0.z[1])) ){ u32 n = yymsp[0].minor.yy0.n; - yymsp[0].minor.yy626 = tokenExpr(pParse, TK_VARIABLE, yymsp[0].minor.yy0); - sqlite3ExprAssignVarNumber(pParse, yymsp[0].minor.yy626, n); + yymsp[0].minor.yy528 = tokenExpr(pParse, TK_VARIABLE, yymsp[0].minor.yy0); + sqlite3ExprAssignVarNumber(pParse, yymsp[0].minor.yy528, n); }else{ /* When doing a nested parse, one can include terms in an expression ** that look like this: #1 #2 ... These terms refer to registers @@ -163771,65 +165661,65 @@ static YYACTIONTYPE yy_reduce( assert( t.n>=2 ); if( pParse->nested==0 ){ sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &t); - yymsp[0].minor.yy626 = 0; + yymsp[0].minor.yy528 = 0; }else{ - yymsp[0].minor.yy626 = sqlite3PExpr(pParse, TK_REGISTER, 0, 0); - if( yymsp[0].minor.yy626 ) sqlite3GetInt32(&t.z[1], &yymsp[0].minor.yy626->iTable); + yymsp[0].minor.yy528 = sqlite3PExpr(pParse, TK_REGISTER, 0, 0); + if( yymsp[0].minor.yy528 ) sqlite3GetInt32(&t.z[1], &yymsp[0].minor.yy528->iTable); } } } break; case 186: /* expr ::= expr COLLATE ID|STRING */ { - yymsp[-2].minor.yy626 = sqlite3ExprAddCollateToken(pParse, yymsp[-2].minor.yy626, &yymsp[0].minor.yy0, 1); + yymsp[-2].minor.yy528 = sqlite3ExprAddCollateToken(pParse, yymsp[-2].minor.yy528, &yymsp[0].minor.yy0, 1); } break; case 187: /* expr ::= CAST LP expr AS typetoken RP */ { - yymsp[-5].minor.yy626 = sqlite3ExprAlloc(pParse->db, TK_CAST, &yymsp[-1].minor.yy0, 1); - sqlite3ExprAttachSubtrees(pParse->db, yymsp[-5].minor.yy626, yymsp[-3].minor.yy626, 0); + yymsp[-5].minor.yy528 = sqlite3ExprAlloc(pParse->db, TK_CAST, &yymsp[-1].minor.yy0, 1); + sqlite3ExprAttachSubtrees(pParse->db, yymsp[-5].minor.yy528, yymsp[-3].minor.yy528, 0); } break; case 188: /* expr ::= ID|INDEXED LP distinct exprlist RP */ { - yylhsminor.yy626 = sqlite3ExprFunction(pParse, yymsp[-1].minor.yy562, &yymsp[-4].minor.yy0, yymsp[-2].minor.yy64); + yylhsminor.yy528 = sqlite3ExprFunction(pParse, yymsp[-1].minor.yy322, &yymsp[-4].minor.yy0, yymsp[-2].minor.yy394); } - yymsp[-4].minor.yy626 = yylhsminor.yy626; + yymsp[-4].minor.yy528 = yylhsminor.yy528; break; case 189: /* expr ::= ID|INDEXED LP STAR RP */ { - yylhsminor.yy626 = sqlite3ExprFunction(pParse, 0, &yymsp[-3].minor.yy0, 0); + yylhsminor.yy528 = sqlite3ExprFunction(pParse, 0, &yymsp[-3].minor.yy0, 0); } - yymsp[-3].minor.yy626 = yylhsminor.yy626; + yymsp[-3].minor.yy528 = yylhsminor.yy528; break; case 190: /* expr ::= ID|INDEXED LP distinct exprlist RP filter_over */ { - yylhsminor.yy626 = sqlite3ExprFunction(pParse, yymsp[-2].minor.yy562, &yymsp[-5].minor.yy0, yymsp[-3].minor.yy64); - sqlite3WindowAttach(pParse, yylhsminor.yy626, yymsp[0].minor.yy375); + yylhsminor.yy528 = sqlite3ExprFunction(pParse, yymsp[-2].minor.yy322, &yymsp[-5].minor.yy0, yymsp[-3].minor.yy394); + sqlite3WindowAttach(pParse, yylhsminor.yy528, yymsp[0].minor.yy41); } - yymsp[-5].minor.yy626 = yylhsminor.yy626; + yymsp[-5].minor.yy528 = yylhsminor.yy528; break; case 191: /* expr ::= ID|INDEXED LP STAR RP filter_over */ { - yylhsminor.yy626 = sqlite3ExprFunction(pParse, 0, &yymsp[-4].minor.yy0, 0); - sqlite3WindowAttach(pParse, yylhsminor.yy626, yymsp[0].minor.yy375); + yylhsminor.yy528 = sqlite3ExprFunction(pParse, 0, &yymsp[-4].minor.yy0, 0); + sqlite3WindowAttach(pParse, yylhsminor.yy528, yymsp[0].minor.yy41); } - yymsp[-4].minor.yy626 = yylhsminor.yy626; + yymsp[-4].minor.yy528 = yylhsminor.yy528; break; case 192: /* term ::= CTIME_KW */ { - yylhsminor.yy626 = sqlite3ExprFunction(pParse, 0, &yymsp[0].minor.yy0, 0); + yylhsminor.yy528 = sqlite3ExprFunction(pParse, 0, &yymsp[0].minor.yy0, 0); } - yymsp[0].minor.yy626 = yylhsminor.yy626; + yymsp[0].minor.yy528 = yylhsminor.yy528; break; case 193: /* expr ::= LP nexprlist COMMA expr RP */ { - ExprList *pList = sqlite3ExprListAppend(pParse, yymsp[-3].minor.yy562, yymsp[-1].minor.yy626); - yymsp[-4].minor.yy626 = sqlite3PExpr(pParse, TK_VECTOR, 0, 0); - if( yymsp[-4].minor.yy626 ){ - yymsp[-4].minor.yy626->x.pList = pList; + ExprList *pList = sqlite3ExprListAppend(pParse, yymsp[-3].minor.yy322, yymsp[-1].minor.yy528); + yymsp[-4].minor.yy528 = sqlite3PExpr(pParse, TK_VECTOR, 0, 0); + if( yymsp[-4].minor.yy528 ){ + yymsp[-4].minor.yy528->x.pList = pList; if( ALWAYS(pList->nExpr) ){ - yymsp[-4].minor.yy626->flags |= pList->a[0].pExpr->flags & EP_Propagate; + yymsp[-4].minor.yy528->flags |= pList->a[0].pExpr->flags & EP_Propagate; } }else{ sqlite3ExprListDelete(pParse->db, pList); @@ -163837,7 +165727,7 @@ static YYACTIONTYPE yy_reduce( } break; case 194: /* expr ::= expr AND expr */ -{yymsp[-2].minor.yy626=sqlite3ExprAnd(pParse,yymsp[-2].minor.yy626,yymsp[0].minor.yy626);} +{yymsp[-2].minor.yy528=sqlite3ExprAnd(pParse,yymsp[-2].minor.yy528,yymsp[0].minor.yy528);} break; case 195: /* expr ::= expr OR expr */ case 196: /* expr ::= expr LT|GT|GE|LE expr */ yytestcase(yyruleno==196); @@ -163846,7 +165736,7 @@ static YYACTIONTYPE yy_reduce( case 199: /* expr ::= expr PLUS|MINUS expr */ yytestcase(yyruleno==199); case 200: /* expr ::= expr STAR|SLASH|REM expr */ yytestcase(yyruleno==200); case 201: /* expr ::= expr CONCAT expr */ yytestcase(yyruleno==201); -{yymsp[-2].minor.yy626=sqlite3PExpr(pParse,yymsp[-1].major,yymsp[-2].minor.yy626,yymsp[0].minor.yy626);} +{yymsp[-2].minor.yy528=sqlite3PExpr(pParse,yymsp[-1].major,yymsp[-2].minor.yy528,yymsp[0].minor.yy528);} break; case 202: /* likeop ::= NOT LIKE_KW|MATCH */ {yymsp[-1].minor.yy0=yymsp[0].minor.yy0; yymsp[-1].minor.yy0.n|=0x80000000; /*yymsp[-1].minor.yy0-overwrite-yymsp[0].minor.yy0*/} @@ -163856,11 +165746,11 @@ static YYACTIONTYPE yy_reduce( ExprList *pList; int bNot = yymsp[-1].minor.yy0.n & 0x80000000; yymsp[-1].minor.yy0.n &= 0x7fffffff; - pList = sqlite3ExprListAppend(pParse,0, yymsp[0].minor.yy626); - pList = sqlite3ExprListAppend(pParse,pList, yymsp[-2].minor.yy626); - yymsp[-2].minor.yy626 = sqlite3ExprFunction(pParse, pList, &yymsp[-1].minor.yy0, 0); - if( bNot ) yymsp[-2].minor.yy626 = sqlite3PExpr(pParse, TK_NOT, yymsp[-2].minor.yy626, 0); - if( yymsp[-2].minor.yy626 ) yymsp[-2].minor.yy626->flags |= EP_InfixFunc; + pList = sqlite3ExprListAppend(pParse,0, yymsp[0].minor.yy528); + pList = sqlite3ExprListAppend(pParse,pList, yymsp[-2].minor.yy528); + yymsp[-2].minor.yy528 = sqlite3ExprFunction(pParse, pList, &yymsp[-1].minor.yy0, 0); + if( bNot ) yymsp[-2].minor.yy528 = sqlite3PExpr(pParse, TK_NOT, yymsp[-2].minor.yy528, 0); + if( yymsp[-2].minor.yy528 ) yymsp[-2].minor.yy528->flags |= EP_InfixFunc; } break; case 204: /* expr ::= expr likeop expr ESCAPE expr */ @@ -163868,62 +165758,70 @@ static YYACTIONTYPE yy_reduce( ExprList *pList; int bNot = yymsp[-3].minor.yy0.n & 0x80000000; yymsp[-3].minor.yy0.n &= 0x7fffffff; - pList = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy626); - pList = sqlite3ExprListAppend(pParse,pList, yymsp[-4].minor.yy626); - pList = sqlite3ExprListAppend(pParse,pList, yymsp[0].minor.yy626); - yymsp[-4].minor.yy626 = sqlite3ExprFunction(pParse, pList, &yymsp[-3].minor.yy0, 0); - if( bNot ) yymsp[-4].minor.yy626 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy626, 0); - if( yymsp[-4].minor.yy626 ) yymsp[-4].minor.yy626->flags |= EP_InfixFunc; + pList = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy528); + pList = sqlite3ExprListAppend(pParse,pList, yymsp[-4].minor.yy528); + pList = sqlite3ExprListAppend(pParse,pList, yymsp[0].minor.yy528); + yymsp[-4].minor.yy528 = sqlite3ExprFunction(pParse, pList, &yymsp[-3].minor.yy0, 0); + if( bNot ) yymsp[-4].minor.yy528 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy528, 0); + if( yymsp[-4].minor.yy528 ) yymsp[-4].minor.yy528->flags |= EP_InfixFunc; } break; case 205: /* expr ::= expr ISNULL|NOTNULL */ -{yymsp[-1].minor.yy626 = sqlite3PExpr(pParse,yymsp[0].major,yymsp[-1].minor.yy626,0);} +{yymsp[-1].minor.yy528 = sqlite3PExpr(pParse,yymsp[0].major,yymsp[-1].minor.yy528,0);} break; case 206: /* expr ::= expr NOT NULL */ -{yymsp[-2].minor.yy626 = sqlite3PExpr(pParse,TK_NOTNULL,yymsp[-2].minor.yy626,0);} +{yymsp[-2].minor.yy528 = sqlite3PExpr(pParse,TK_NOTNULL,yymsp[-2].minor.yy528,0);} break; case 207: /* expr ::= expr IS expr */ { - yymsp[-2].minor.yy626 = sqlite3PExpr(pParse,TK_IS,yymsp[-2].minor.yy626,yymsp[0].minor.yy626); - binaryToUnaryIfNull(pParse, yymsp[0].minor.yy626, yymsp[-2].minor.yy626, TK_ISNULL); + yymsp[-2].minor.yy528 = sqlite3PExpr(pParse,TK_IS,yymsp[-2].minor.yy528,yymsp[0].minor.yy528); + binaryToUnaryIfNull(pParse, yymsp[0].minor.yy528, yymsp[-2].minor.yy528, TK_ISNULL); } break; case 208: /* expr ::= expr IS NOT expr */ { - yymsp[-3].minor.yy626 = sqlite3PExpr(pParse,TK_ISNOT,yymsp[-3].minor.yy626,yymsp[0].minor.yy626); - binaryToUnaryIfNull(pParse, yymsp[0].minor.yy626, yymsp[-3].minor.yy626, TK_NOTNULL); + yymsp[-3].minor.yy528 = sqlite3PExpr(pParse,TK_ISNOT,yymsp[-3].minor.yy528,yymsp[0].minor.yy528); + binaryToUnaryIfNull(pParse, yymsp[0].minor.yy528, yymsp[-3].minor.yy528, TK_NOTNULL); } break; case 209: /* expr ::= NOT expr */ case 210: /* expr ::= BITNOT expr */ yytestcase(yyruleno==210); -{yymsp[-1].minor.yy626 = sqlite3PExpr(pParse, yymsp[-1].major, yymsp[0].minor.yy626, 0);/*A-overwrites-B*/} +{yymsp[-1].minor.yy528 = sqlite3PExpr(pParse, yymsp[-1].major, yymsp[0].minor.yy528, 0);/*A-overwrites-B*/} break; case 211: /* expr ::= PLUS|MINUS expr */ { - yymsp[-1].minor.yy626 = sqlite3PExpr(pParse, yymsp[-1].major==TK_PLUS ? TK_UPLUS : TK_UMINUS, yymsp[0].minor.yy626, 0); + yymsp[-1].minor.yy528 = sqlite3PExpr(pParse, yymsp[-1].major==TK_PLUS ? TK_UPLUS : TK_UMINUS, yymsp[0].minor.yy528, 0); /*A-overwrites-B*/ } break; - case 212: /* between_op ::= BETWEEN */ - case 215: /* in_op ::= IN */ yytestcase(yyruleno==215); -{yymsp[0].minor.yy64 = 0;} + case 212: /* expr ::= expr PTR expr */ +{ + ExprList *pList = sqlite3ExprListAppend(pParse, 0, yymsp[-2].minor.yy528); + pList = sqlite3ExprListAppend(pParse, pList, yymsp[0].minor.yy528); + yylhsminor.yy528 = sqlite3ExprFunction(pParse, pList, &yymsp[-1].minor.yy0, 0); +} + yymsp[-2].minor.yy528 = yylhsminor.yy528; + break; + case 213: /* between_op ::= BETWEEN */ + case 216: /* in_op ::= IN */ yytestcase(yyruleno==216); +{yymsp[0].minor.yy394 = 0;} break; - case 214: /* expr ::= expr between_op expr AND expr */ + case 215: /* expr ::= expr between_op expr AND expr */ { - ExprList *pList = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy626); - pList = sqlite3ExprListAppend(pParse,pList, yymsp[0].minor.yy626); - yymsp[-4].minor.yy626 = sqlite3PExpr(pParse, TK_BETWEEN, yymsp[-4].minor.yy626, 0); - if( yymsp[-4].minor.yy626 ){ - yymsp[-4].minor.yy626->x.pList = pList; + ExprList *pList = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy528); + pList = sqlite3ExprListAppend(pParse,pList, yymsp[0].minor.yy528); + yymsp[-4].minor.yy528 = sqlite3PExpr(pParse, TK_BETWEEN, yymsp[-4].minor.yy528, 0); + if( yymsp[-4].minor.yy528 ){ + yymsp[-4].minor.yy528->x.pList = pList; }else{ sqlite3ExprListDelete(pParse->db, pList); } - if( yymsp[-3].minor.yy64 ) yymsp[-4].minor.yy626 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy626, 0); + if( yymsp[-3].minor.yy394 ) yymsp[-4].minor.yy528 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy528, 0); } break; - case 217: /* expr ::= expr in_op LP exprlist RP */ + case 218: /* expr ::= expr in_op LP exprlist RP */ { - if( yymsp[-1].minor.yy562==0 ){ + if( yymsp[-1].minor.yy322==0 ){ /* Expressions of the form ** ** expr1 IN () @@ -163932,205 +165830,205 @@ static YYACTIONTYPE yy_reduce( ** simplify to constants 0 (false) and 1 (true), respectively, ** regardless of the value of expr1. */ - sqlite3ExprUnmapAndDelete(pParse, yymsp[-4].minor.yy626); - yymsp[-4].minor.yy626 = sqlite3Expr(pParse->db, TK_INTEGER, yymsp[-3].minor.yy64 ? "1" : "0"); + sqlite3ExprUnmapAndDelete(pParse, yymsp[-4].minor.yy528); + yymsp[-4].minor.yy528 = sqlite3Expr(pParse->db, TK_INTEGER, yymsp[-3].minor.yy394 ? "1" : "0"); }else{ - Expr *pRHS = yymsp[-1].minor.yy562->a[0].pExpr; - if( yymsp[-1].minor.yy562->nExpr==1 && sqlite3ExprIsConstant(pRHS) && yymsp[-4].minor.yy626->op!=TK_VECTOR ){ - yymsp[-1].minor.yy562->a[0].pExpr = 0; - sqlite3ExprListDelete(pParse->db, yymsp[-1].minor.yy562); + Expr *pRHS = yymsp[-1].minor.yy322->a[0].pExpr; + if( yymsp[-1].minor.yy322->nExpr==1 && sqlite3ExprIsConstant(pRHS) && yymsp[-4].minor.yy528->op!=TK_VECTOR ){ + yymsp[-1].minor.yy322->a[0].pExpr = 0; + sqlite3ExprListDelete(pParse->db, yymsp[-1].minor.yy322); pRHS = sqlite3PExpr(pParse, TK_UPLUS, pRHS, 0); - yymsp[-4].minor.yy626 = sqlite3PExpr(pParse, TK_EQ, yymsp[-4].minor.yy626, pRHS); + yymsp[-4].minor.yy528 = sqlite3PExpr(pParse, TK_EQ, yymsp[-4].minor.yy528, pRHS); }else{ - yymsp[-4].minor.yy626 = sqlite3PExpr(pParse, TK_IN, yymsp[-4].minor.yy626, 0); - if( yymsp[-4].minor.yy626==0 ){ - sqlite3ExprListDelete(pParse->db, yymsp[-1].minor.yy562); - }else if( yymsp[-4].minor.yy626->pLeft->op==TK_VECTOR ){ - int nExpr = yymsp[-4].minor.yy626->pLeft->x.pList->nExpr; - Select *pSelectRHS = sqlite3ExprListToValues(pParse, nExpr, yymsp[-1].minor.yy562); + yymsp[-4].minor.yy528 = sqlite3PExpr(pParse, TK_IN, yymsp[-4].minor.yy528, 0); + if( yymsp[-4].minor.yy528==0 ){ + sqlite3ExprListDelete(pParse->db, yymsp[-1].minor.yy322); + }else if( yymsp[-4].minor.yy528->pLeft->op==TK_VECTOR ){ + int nExpr = yymsp[-4].minor.yy528->pLeft->x.pList->nExpr; + Select *pSelectRHS = sqlite3ExprListToValues(pParse, nExpr, yymsp[-1].minor.yy322); if( pSelectRHS ){ parserDoubleLinkSelect(pParse, pSelectRHS); - sqlite3PExprAddSelect(pParse, yymsp[-4].minor.yy626, pSelectRHS); + sqlite3PExprAddSelect(pParse, yymsp[-4].minor.yy528, pSelectRHS); } }else{ - yymsp[-4].minor.yy626->x.pList = yymsp[-1].minor.yy562; - sqlite3ExprSetHeightAndFlags(pParse, yymsp[-4].minor.yy626); + yymsp[-4].minor.yy528->x.pList = yymsp[-1].minor.yy322; + sqlite3ExprSetHeightAndFlags(pParse, yymsp[-4].minor.yy528); } } - if( yymsp[-3].minor.yy64 ) yymsp[-4].minor.yy626 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy626, 0); + if( yymsp[-3].minor.yy394 ) yymsp[-4].minor.yy528 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy528, 0); } } break; - case 218: /* expr ::= LP select RP */ + case 219: /* expr ::= LP select RP */ { - yymsp[-2].minor.yy626 = sqlite3PExpr(pParse, TK_SELECT, 0, 0); - sqlite3PExprAddSelect(pParse, yymsp[-2].minor.yy626, yymsp[-1].minor.yy303); + yymsp[-2].minor.yy528 = sqlite3PExpr(pParse, TK_SELECT, 0, 0); + sqlite3PExprAddSelect(pParse, yymsp[-2].minor.yy528, yymsp[-1].minor.yy47); } break; - case 219: /* expr ::= expr in_op LP select RP */ + case 220: /* expr ::= expr in_op LP select RP */ { - yymsp[-4].minor.yy626 = sqlite3PExpr(pParse, TK_IN, yymsp[-4].minor.yy626, 0); - sqlite3PExprAddSelect(pParse, yymsp[-4].minor.yy626, yymsp[-1].minor.yy303); - if( yymsp[-3].minor.yy64 ) yymsp[-4].minor.yy626 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy626, 0); + yymsp[-4].minor.yy528 = sqlite3PExpr(pParse, TK_IN, yymsp[-4].minor.yy528, 0); + sqlite3PExprAddSelect(pParse, yymsp[-4].minor.yy528, yymsp[-1].minor.yy47); + if( yymsp[-3].minor.yy394 ) yymsp[-4].minor.yy528 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy528, 0); } break; - case 220: /* expr ::= expr in_op nm dbnm paren_exprlist */ + case 221: /* expr ::= expr in_op nm dbnm paren_exprlist */ { SrcList *pSrc = sqlite3SrcListAppend(pParse, 0,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0); Select *pSelect = sqlite3SelectNew(pParse, 0,pSrc,0,0,0,0,0,0); - if( yymsp[0].minor.yy562 ) sqlite3SrcListFuncArgs(pParse, pSelect ? pSrc : 0, yymsp[0].minor.yy562); - yymsp[-4].minor.yy626 = sqlite3PExpr(pParse, TK_IN, yymsp[-4].minor.yy626, 0); - sqlite3PExprAddSelect(pParse, yymsp[-4].minor.yy626, pSelect); - if( yymsp[-3].minor.yy64 ) yymsp[-4].minor.yy626 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy626, 0); + if( yymsp[0].minor.yy322 ) sqlite3SrcListFuncArgs(pParse, pSelect ? pSrc : 0, yymsp[0].minor.yy322); + yymsp[-4].minor.yy528 = sqlite3PExpr(pParse, TK_IN, yymsp[-4].minor.yy528, 0); + sqlite3PExprAddSelect(pParse, yymsp[-4].minor.yy528, pSelect); + if( yymsp[-3].minor.yy394 ) yymsp[-4].minor.yy528 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy528, 0); } break; - case 221: /* expr ::= EXISTS LP select RP */ + case 222: /* expr ::= EXISTS LP select RP */ { Expr *p; - p = yymsp[-3].minor.yy626 = sqlite3PExpr(pParse, TK_EXISTS, 0, 0); - sqlite3PExprAddSelect(pParse, p, yymsp[-1].minor.yy303); + p = yymsp[-3].minor.yy528 = sqlite3PExpr(pParse, TK_EXISTS, 0, 0); + sqlite3PExprAddSelect(pParse, p, yymsp[-1].minor.yy47); } break; - case 222: /* expr ::= CASE case_operand case_exprlist case_else END */ + case 223: /* expr ::= CASE case_operand case_exprlist case_else END */ { - yymsp[-4].minor.yy626 = sqlite3PExpr(pParse, TK_CASE, yymsp[-3].minor.yy626, 0); - if( yymsp[-4].minor.yy626 ){ - yymsp[-4].minor.yy626->x.pList = yymsp[-1].minor.yy626 ? sqlite3ExprListAppend(pParse,yymsp[-2].minor.yy562,yymsp[-1].minor.yy626) : yymsp[-2].minor.yy562; - sqlite3ExprSetHeightAndFlags(pParse, yymsp[-4].minor.yy626); + yymsp[-4].minor.yy528 = sqlite3PExpr(pParse, TK_CASE, yymsp[-3].minor.yy528, 0); + if( yymsp[-4].minor.yy528 ){ + yymsp[-4].minor.yy528->x.pList = yymsp[-1].minor.yy528 ? sqlite3ExprListAppend(pParse,yymsp[-2].minor.yy322,yymsp[-1].minor.yy528) : yymsp[-2].minor.yy322; + sqlite3ExprSetHeightAndFlags(pParse, yymsp[-4].minor.yy528); }else{ - sqlite3ExprListDelete(pParse->db, yymsp[-2].minor.yy562); - sqlite3ExprDelete(pParse->db, yymsp[-1].minor.yy626); + sqlite3ExprListDelete(pParse->db, yymsp[-2].minor.yy322); + sqlite3ExprDelete(pParse->db, yymsp[-1].minor.yy528); } } break; - case 223: /* case_exprlist ::= case_exprlist WHEN expr THEN expr */ + case 224: /* case_exprlist ::= case_exprlist WHEN expr THEN expr */ { - yymsp[-4].minor.yy562 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy562, yymsp[-2].minor.yy626); - yymsp[-4].minor.yy562 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy562, yymsp[0].minor.yy626); + yymsp[-4].minor.yy322 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy322, yymsp[-2].minor.yy528); + yymsp[-4].minor.yy322 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy322, yymsp[0].minor.yy528); } break; - case 224: /* case_exprlist ::= WHEN expr THEN expr */ + case 225: /* case_exprlist ::= WHEN expr THEN expr */ { - yymsp[-3].minor.yy562 = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy626); - yymsp[-3].minor.yy562 = sqlite3ExprListAppend(pParse,yymsp[-3].minor.yy562, yymsp[0].minor.yy626); + yymsp[-3].minor.yy322 = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy528); + yymsp[-3].minor.yy322 = sqlite3ExprListAppend(pParse,yymsp[-3].minor.yy322, yymsp[0].minor.yy528); } break; - case 227: /* case_operand ::= expr */ -{yymsp[0].minor.yy626 = yymsp[0].minor.yy626; /*A-overwrites-X*/} + case 228: /* case_operand ::= expr */ +{yymsp[0].minor.yy528 = yymsp[0].minor.yy528; /*A-overwrites-X*/} break; - case 230: /* nexprlist ::= nexprlist COMMA expr */ -{yymsp[-2].minor.yy562 = sqlite3ExprListAppend(pParse,yymsp[-2].minor.yy562,yymsp[0].minor.yy626);} + case 231: /* nexprlist ::= nexprlist COMMA expr */ +{yymsp[-2].minor.yy322 = sqlite3ExprListAppend(pParse,yymsp[-2].minor.yy322,yymsp[0].minor.yy528);} break; - case 231: /* nexprlist ::= expr */ -{yymsp[0].minor.yy562 = sqlite3ExprListAppend(pParse,0,yymsp[0].minor.yy626); /*A-overwrites-Y*/} + case 232: /* nexprlist ::= expr */ +{yymsp[0].minor.yy322 = sqlite3ExprListAppend(pParse,0,yymsp[0].minor.yy528); /*A-overwrites-Y*/} break; - case 233: /* paren_exprlist ::= LP exprlist RP */ - case 238: /* eidlist_opt ::= LP eidlist RP */ yytestcase(yyruleno==238); -{yymsp[-2].minor.yy562 = yymsp[-1].minor.yy562;} + case 234: /* paren_exprlist ::= LP exprlist RP */ + case 239: /* eidlist_opt ::= LP eidlist RP */ yytestcase(yyruleno==239); +{yymsp[-2].minor.yy322 = yymsp[-1].minor.yy322;} break; - case 234: /* cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt */ + case 235: /* cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt */ { sqlite3CreateIndex(pParse, &yymsp[-7].minor.yy0, &yymsp[-6].minor.yy0, - sqlite3SrcListAppend(pParse,0,&yymsp[-4].minor.yy0,0), yymsp[-2].minor.yy562, yymsp[-10].minor.yy64, - &yymsp[-11].minor.yy0, yymsp[0].minor.yy626, SQLITE_SO_ASC, yymsp[-8].minor.yy64, SQLITE_IDXTYPE_APPDEF); + sqlite3SrcListAppend(pParse,0,&yymsp[-4].minor.yy0,0), yymsp[-2].minor.yy322, yymsp[-10].minor.yy394, + &yymsp[-11].minor.yy0, yymsp[0].minor.yy528, SQLITE_SO_ASC, yymsp[-8].minor.yy394, SQLITE_IDXTYPE_APPDEF); if( IN_RENAME_OBJECT && pParse->pNewIndex ){ sqlite3RenameTokenMap(pParse, pParse->pNewIndex->zName, &yymsp[-4].minor.yy0); } } break; - case 235: /* uniqueflag ::= UNIQUE */ - case 277: /* raisetype ::= ABORT */ yytestcase(yyruleno==277); -{yymsp[0].minor.yy64 = OE_Abort;} + case 236: /* uniqueflag ::= UNIQUE */ + case 278: /* raisetype ::= ABORT */ yytestcase(yyruleno==278); +{yymsp[0].minor.yy394 = OE_Abort;} break; - case 236: /* uniqueflag ::= */ -{yymsp[1].minor.yy64 = OE_None;} + case 237: /* uniqueflag ::= */ +{yymsp[1].minor.yy394 = OE_None;} break; - case 239: /* eidlist ::= eidlist COMMA nm collate sortorder */ + case 240: /* eidlist ::= eidlist COMMA nm collate sortorder */ { - yymsp[-4].minor.yy562 = parserAddExprIdListTerm(pParse, yymsp[-4].minor.yy562, &yymsp[-2].minor.yy0, yymsp[-1].minor.yy64, yymsp[0].minor.yy64); + yymsp[-4].minor.yy322 = parserAddExprIdListTerm(pParse, yymsp[-4].minor.yy322, &yymsp[-2].minor.yy0, yymsp[-1].minor.yy394, yymsp[0].minor.yy394); } break; - case 240: /* eidlist ::= nm collate sortorder */ + case 241: /* eidlist ::= nm collate sortorder */ { - yymsp[-2].minor.yy562 = parserAddExprIdListTerm(pParse, 0, &yymsp[-2].minor.yy0, yymsp[-1].minor.yy64, yymsp[0].minor.yy64); /*A-overwrites-Y*/ + yymsp[-2].minor.yy322 = parserAddExprIdListTerm(pParse, 0, &yymsp[-2].minor.yy0, yymsp[-1].minor.yy394, yymsp[0].minor.yy394); /*A-overwrites-Y*/ } break; - case 243: /* cmd ::= DROP INDEX ifexists fullname */ -{sqlite3DropIndex(pParse, yymsp[0].minor.yy607, yymsp[-1].minor.yy64);} + case 244: /* cmd ::= DROP INDEX ifexists fullname */ +{sqlite3DropIndex(pParse, yymsp[0].minor.yy131, yymsp[-1].minor.yy394);} break; - case 244: /* cmd ::= VACUUM vinto */ -{sqlite3Vacuum(pParse,0,yymsp[0].minor.yy626);} + case 245: /* cmd ::= VACUUM vinto */ +{sqlite3Vacuum(pParse,0,yymsp[0].minor.yy528);} break; - case 245: /* cmd ::= VACUUM nm vinto */ -{sqlite3Vacuum(pParse,&yymsp[-1].minor.yy0,yymsp[0].minor.yy626);} + case 246: /* cmd ::= VACUUM nm vinto */ +{sqlite3Vacuum(pParse,&yymsp[-1].minor.yy0,yymsp[0].minor.yy528);} break; - case 248: /* cmd ::= PRAGMA nm dbnm */ + case 249: /* cmd ::= PRAGMA nm dbnm */ {sqlite3Pragma(pParse,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0,0,0);} break; - case 249: /* cmd ::= PRAGMA nm dbnm EQ nmnum */ + case 250: /* cmd ::= PRAGMA nm dbnm EQ nmnum */ {sqlite3Pragma(pParse,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0,0);} break; - case 250: /* cmd ::= PRAGMA nm dbnm LP nmnum RP */ + case 251: /* cmd ::= PRAGMA nm dbnm LP nmnum RP */ {sqlite3Pragma(pParse,&yymsp[-4].minor.yy0,&yymsp[-3].minor.yy0,&yymsp[-1].minor.yy0,0);} break; - case 251: /* cmd ::= PRAGMA nm dbnm EQ minus_num */ + case 252: /* cmd ::= PRAGMA nm dbnm EQ minus_num */ {sqlite3Pragma(pParse,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0,1);} break; - case 252: /* cmd ::= PRAGMA nm dbnm LP minus_num RP */ + case 253: /* cmd ::= PRAGMA nm dbnm LP minus_num RP */ {sqlite3Pragma(pParse,&yymsp[-4].minor.yy0,&yymsp[-3].minor.yy0,&yymsp[-1].minor.yy0,1);} break; - case 255: /* cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END */ + case 256: /* cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END */ { Token all; all.z = yymsp[-3].minor.yy0.z; all.n = (int)(yymsp[0].minor.yy0.z - yymsp[-3].minor.yy0.z) + yymsp[0].minor.yy0.n; - sqlite3FinishTrigger(pParse, yymsp[-1].minor.yy95, &all); + sqlite3FinishTrigger(pParse, yymsp[-1].minor.yy33, &all); } break; - case 256: /* trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause */ + case 257: /* trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause */ { - sqlite3BeginTrigger(pParse, &yymsp[-7].minor.yy0, &yymsp[-6].minor.yy0, yymsp[-5].minor.yy64, yymsp[-4].minor.yy570.a, yymsp[-4].minor.yy570.b, yymsp[-2].minor.yy607, yymsp[0].minor.yy626, yymsp[-10].minor.yy64, yymsp[-8].minor.yy64); + sqlite3BeginTrigger(pParse, &yymsp[-7].minor.yy0, &yymsp[-6].minor.yy0, yymsp[-5].minor.yy394, yymsp[-4].minor.yy180.a, yymsp[-4].minor.yy180.b, yymsp[-2].minor.yy131, yymsp[0].minor.yy528, yymsp[-10].minor.yy394, yymsp[-8].minor.yy394); yymsp[-10].minor.yy0 = (yymsp[-6].minor.yy0.n==0?yymsp[-7].minor.yy0:yymsp[-6].minor.yy0); /*A-overwrites-T*/ } break; - case 257: /* trigger_time ::= BEFORE|AFTER */ -{ yymsp[0].minor.yy64 = yymsp[0].major; /*A-overwrites-X*/ } + case 258: /* trigger_time ::= BEFORE|AFTER */ +{ yymsp[0].minor.yy394 = yymsp[0].major; /*A-overwrites-X*/ } break; - case 258: /* trigger_time ::= INSTEAD OF */ -{ yymsp[-1].minor.yy64 = TK_INSTEAD;} + case 259: /* trigger_time ::= INSTEAD OF */ +{ yymsp[-1].minor.yy394 = TK_INSTEAD;} break; - case 259: /* trigger_time ::= */ -{ yymsp[1].minor.yy64 = TK_BEFORE; } + case 260: /* trigger_time ::= */ +{ yymsp[1].minor.yy394 = TK_BEFORE; } break; - case 260: /* trigger_event ::= DELETE|INSERT */ - case 261: /* trigger_event ::= UPDATE */ yytestcase(yyruleno==261); -{yymsp[0].minor.yy570.a = yymsp[0].major; /*A-overwrites-X*/ yymsp[0].minor.yy570.b = 0;} + case 261: /* trigger_event ::= DELETE|INSERT */ + case 262: /* trigger_event ::= UPDATE */ yytestcase(yyruleno==262); +{yymsp[0].minor.yy180.a = yymsp[0].major; /*A-overwrites-X*/ yymsp[0].minor.yy180.b = 0;} break; - case 262: /* trigger_event ::= UPDATE OF idlist */ -{yymsp[-2].minor.yy570.a = TK_UPDATE; yymsp[-2].minor.yy570.b = yymsp[0].minor.yy240;} + case 263: /* trigger_event ::= UPDATE OF idlist */ +{yymsp[-2].minor.yy180.a = TK_UPDATE; yymsp[-2].minor.yy180.b = yymsp[0].minor.yy254;} break; - case 263: /* when_clause ::= */ - case 282: /* key_opt ::= */ yytestcase(yyruleno==282); -{ yymsp[1].minor.yy626 = 0; } + case 264: /* when_clause ::= */ + case 283: /* key_opt ::= */ yytestcase(yyruleno==283); +{ yymsp[1].minor.yy528 = 0; } break; - case 264: /* when_clause ::= WHEN expr */ - case 283: /* key_opt ::= KEY expr */ yytestcase(yyruleno==283); -{ yymsp[-1].minor.yy626 = yymsp[0].minor.yy626; } + case 265: /* when_clause ::= WHEN expr */ + case 284: /* key_opt ::= KEY expr */ yytestcase(yyruleno==284); +{ yymsp[-1].minor.yy528 = yymsp[0].minor.yy528; } break; - case 265: /* trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI */ + case 266: /* trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI */ { - assert( yymsp[-2].minor.yy95!=0 ); - yymsp[-2].minor.yy95->pLast->pNext = yymsp[-1].minor.yy95; - yymsp[-2].minor.yy95->pLast = yymsp[-1].minor.yy95; + assert( yymsp[-2].minor.yy33!=0 ); + yymsp[-2].minor.yy33->pLast->pNext = yymsp[-1].minor.yy33; + yymsp[-2].minor.yy33->pLast = yymsp[-1].minor.yy33; } break; - case 266: /* trigger_cmd_list ::= trigger_cmd SEMI */ + case 267: /* trigger_cmd_list ::= trigger_cmd SEMI */ { - assert( yymsp[-1].minor.yy95!=0 ); - yymsp[-1].minor.yy95->pLast = yymsp[-1].minor.yy95; + assert( yymsp[-1].minor.yy33!=0 ); + yymsp[-1].minor.yy33->pLast = yymsp[-1].minor.yy33; } break; - case 267: /* trnm ::= nm DOT nm */ + case 268: /* trnm ::= nm DOT nm */ { yymsp[-2].minor.yy0 = yymsp[0].minor.yy0; sqlite3ErrorMsg(pParse, @@ -164138,369 +166036,369 @@ static YYACTIONTYPE yy_reduce( "statements within triggers"); } break; - case 268: /* tridxby ::= INDEXED BY nm */ + case 269: /* tridxby ::= INDEXED BY nm */ { sqlite3ErrorMsg(pParse, "the INDEXED BY clause is not allowed on UPDATE or DELETE statements " "within triggers"); } break; - case 269: /* tridxby ::= NOT INDEXED */ + case 270: /* tridxby ::= NOT INDEXED */ { sqlite3ErrorMsg(pParse, "the NOT INDEXED clause is not allowed on UPDATE or DELETE statements " "within triggers"); } break; - case 270: /* trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist from where_opt scanpt */ -{yylhsminor.yy95 = sqlite3TriggerUpdateStep(pParse, &yymsp[-6].minor.yy0, yymsp[-2].minor.yy607, yymsp[-3].minor.yy562, yymsp[-1].minor.yy626, yymsp[-7].minor.yy64, yymsp[-8].minor.yy0.z, yymsp[0].minor.yy600);} - yymsp[-8].minor.yy95 = yylhsminor.yy95; + case 271: /* trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist from where_opt scanpt */ +{yylhsminor.yy33 = sqlite3TriggerUpdateStep(pParse, &yymsp[-6].minor.yy0, yymsp[-2].minor.yy131, yymsp[-3].minor.yy322, yymsp[-1].minor.yy528, yymsp[-7].minor.yy394, yymsp[-8].minor.yy0.z, yymsp[0].minor.yy522);} + yymsp[-8].minor.yy33 = yylhsminor.yy33; break; - case 271: /* trigger_cmd ::= scanpt insert_cmd INTO trnm idlist_opt select upsert scanpt */ + case 272: /* trigger_cmd ::= scanpt insert_cmd INTO trnm idlist_opt select upsert scanpt */ { - yylhsminor.yy95 = sqlite3TriggerInsertStep(pParse,&yymsp[-4].minor.yy0,yymsp[-3].minor.yy240,yymsp[-2].minor.yy303,yymsp[-6].minor.yy64,yymsp[-1].minor.yy138,yymsp[-7].minor.yy600,yymsp[0].minor.yy600);/*yylhsminor.yy95-overwrites-yymsp[-6].minor.yy64*/ + yylhsminor.yy33 = sqlite3TriggerInsertStep(pParse,&yymsp[-4].minor.yy0,yymsp[-3].minor.yy254,yymsp[-2].minor.yy47,yymsp[-6].minor.yy394,yymsp[-1].minor.yy444,yymsp[-7].minor.yy522,yymsp[0].minor.yy522);/*yylhsminor.yy33-overwrites-yymsp[-6].minor.yy394*/ } - yymsp[-7].minor.yy95 = yylhsminor.yy95; + yymsp[-7].minor.yy33 = yylhsminor.yy33; break; - case 272: /* trigger_cmd ::= DELETE FROM trnm tridxby where_opt scanpt */ -{yylhsminor.yy95 = sqlite3TriggerDeleteStep(pParse, &yymsp[-3].minor.yy0, yymsp[-1].minor.yy626, yymsp[-5].minor.yy0.z, yymsp[0].minor.yy600);} - yymsp[-5].minor.yy95 = yylhsminor.yy95; + case 273: /* trigger_cmd ::= DELETE FROM trnm tridxby where_opt scanpt */ +{yylhsminor.yy33 = sqlite3TriggerDeleteStep(pParse, &yymsp[-3].minor.yy0, yymsp[-1].minor.yy528, yymsp[-5].minor.yy0.z, yymsp[0].minor.yy522);} + yymsp[-5].minor.yy33 = yylhsminor.yy33; break; - case 273: /* trigger_cmd ::= scanpt select scanpt */ -{yylhsminor.yy95 = sqlite3TriggerSelectStep(pParse->db, yymsp[-1].minor.yy303, yymsp[-2].minor.yy600, yymsp[0].minor.yy600); /*yylhsminor.yy95-overwrites-yymsp[-1].minor.yy303*/} - yymsp[-2].minor.yy95 = yylhsminor.yy95; + case 274: /* trigger_cmd ::= scanpt select scanpt */ +{yylhsminor.yy33 = sqlite3TriggerSelectStep(pParse->db, yymsp[-1].minor.yy47, yymsp[-2].minor.yy522, yymsp[0].minor.yy522); /*yylhsminor.yy33-overwrites-yymsp[-1].minor.yy47*/} + yymsp[-2].minor.yy33 = yylhsminor.yy33; break; - case 274: /* expr ::= RAISE LP IGNORE RP */ + case 275: /* expr ::= RAISE LP IGNORE RP */ { - yymsp[-3].minor.yy626 = sqlite3PExpr(pParse, TK_RAISE, 0, 0); - if( yymsp[-3].minor.yy626 ){ - yymsp[-3].minor.yy626->affExpr = OE_Ignore; + yymsp[-3].minor.yy528 = sqlite3PExpr(pParse, TK_RAISE, 0, 0); + if( yymsp[-3].minor.yy528 ){ + yymsp[-3].minor.yy528->affExpr = OE_Ignore; } } break; - case 275: /* expr ::= RAISE LP raisetype COMMA nm RP */ + case 276: /* expr ::= RAISE LP raisetype COMMA nm RP */ { - yymsp[-5].minor.yy626 = sqlite3ExprAlloc(pParse->db, TK_RAISE, &yymsp[-1].minor.yy0, 1); - if( yymsp[-5].minor.yy626 ) { - yymsp[-5].minor.yy626->affExpr = (char)yymsp[-3].minor.yy64; + yymsp[-5].minor.yy528 = sqlite3ExprAlloc(pParse->db, TK_RAISE, &yymsp[-1].minor.yy0, 1); + if( yymsp[-5].minor.yy528 ) { + yymsp[-5].minor.yy528->affExpr = (char)yymsp[-3].minor.yy394; } } break; - case 276: /* raisetype ::= ROLLBACK */ -{yymsp[0].minor.yy64 = OE_Rollback;} + case 277: /* raisetype ::= ROLLBACK */ +{yymsp[0].minor.yy394 = OE_Rollback;} break; - case 278: /* raisetype ::= FAIL */ -{yymsp[0].minor.yy64 = OE_Fail;} + case 279: /* raisetype ::= FAIL */ +{yymsp[0].minor.yy394 = OE_Fail;} break; - case 279: /* cmd ::= DROP TRIGGER ifexists fullname */ + case 280: /* cmd ::= DROP TRIGGER ifexists fullname */ { - sqlite3DropTrigger(pParse,yymsp[0].minor.yy607,yymsp[-1].minor.yy64); + sqlite3DropTrigger(pParse,yymsp[0].minor.yy131,yymsp[-1].minor.yy394); } break; - case 280: /* cmd ::= ATTACH database_kw_opt expr AS expr key_opt */ + case 281: /* cmd ::= ATTACH database_kw_opt expr AS expr key_opt */ { - sqlite3Attach(pParse, yymsp[-3].minor.yy626, yymsp[-1].minor.yy626, yymsp[0].minor.yy626); + sqlite3Attach(pParse, yymsp[-3].minor.yy528, yymsp[-1].minor.yy528, yymsp[0].minor.yy528); } break; - case 281: /* cmd ::= DETACH database_kw_opt expr */ + case 282: /* cmd ::= DETACH database_kw_opt expr */ { - sqlite3Detach(pParse, yymsp[0].minor.yy626); + sqlite3Detach(pParse, yymsp[0].minor.yy528); } break; - case 284: /* cmd ::= REINDEX */ + case 285: /* cmd ::= REINDEX */ {sqlite3Reindex(pParse, 0, 0);} break; - case 285: /* cmd ::= REINDEX nm dbnm */ + case 286: /* cmd ::= REINDEX nm dbnm */ {sqlite3Reindex(pParse, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0);} break; - case 286: /* cmd ::= ANALYZE */ + case 287: /* cmd ::= ANALYZE */ {sqlite3Analyze(pParse, 0, 0);} break; - case 287: /* cmd ::= ANALYZE nm dbnm */ + case 288: /* cmd ::= ANALYZE nm dbnm */ {sqlite3Analyze(pParse, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0);} break; - case 288: /* cmd ::= ALTER TABLE fullname RENAME TO nm */ + case 289: /* cmd ::= ALTER TABLE fullname RENAME TO nm */ { - sqlite3AlterRenameTable(pParse,yymsp[-3].minor.yy607,&yymsp[0].minor.yy0); + sqlite3AlterRenameTable(pParse,yymsp[-3].minor.yy131,&yymsp[0].minor.yy0); } break; - case 289: /* cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist */ + case 290: /* cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist */ { yymsp[-1].minor.yy0.n = (int)(pParse->sLastToken.z-yymsp[-1].minor.yy0.z) + pParse->sLastToken.n; sqlite3AlterFinishAddColumn(pParse, &yymsp[-1].minor.yy0); } break; - case 290: /* cmd ::= ALTER TABLE fullname DROP kwcolumn_opt nm */ + case 291: /* cmd ::= ALTER TABLE fullname DROP kwcolumn_opt nm */ { - sqlite3AlterDropColumn(pParse, yymsp[-3].minor.yy607, &yymsp[0].minor.yy0); + sqlite3AlterDropColumn(pParse, yymsp[-3].minor.yy131, &yymsp[0].minor.yy0); } break; - case 291: /* add_column_fullname ::= fullname */ + case 292: /* add_column_fullname ::= fullname */ { disableLookaside(pParse); - sqlite3AlterBeginAddColumn(pParse, yymsp[0].minor.yy607); + sqlite3AlterBeginAddColumn(pParse, yymsp[0].minor.yy131); } break; - case 292: /* cmd ::= ALTER TABLE fullname RENAME kwcolumn_opt nm TO nm */ + case 293: /* cmd ::= ALTER TABLE fullname RENAME kwcolumn_opt nm TO nm */ { - sqlite3AlterRenameColumn(pParse, yymsp[-5].minor.yy607, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0); + sqlite3AlterRenameColumn(pParse, yymsp[-5].minor.yy131, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0); } break; - case 293: /* cmd ::= create_vtab */ + case 294: /* cmd ::= create_vtab */ {sqlite3VtabFinishParse(pParse,0);} break; - case 294: /* cmd ::= create_vtab LP vtabarglist RP */ + case 295: /* cmd ::= create_vtab LP vtabarglist RP */ {sqlite3VtabFinishParse(pParse,&yymsp[0].minor.yy0);} break; - case 295: /* create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm */ + case 296: /* create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm */ { - sqlite3VtabBeginParse(pParse, &yymsp[-3].minor.yy0, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, yymsp[-4].minor.yy64); + sqlite3VtabBeginParse(pParse, &yymsp[-3].minor.yy0, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, yymsp[-4].minor.yy394); } break; - case 296: /* vtabarg ::= */ + case 297: /* vtabarg ::= */ {sqlite3VtabArgInit(pParse);} break; - case 297: /* vtabargtoken ::= ANY */ - case 298: /* vtabargtoken ::= lp anylist RP */ yytestcase(yyruleno==298); - case 299: /* lp ::= LP */ yytestcase(yyruleno==299); + case 298: /* vtabargtoken ::= ANY */ + case 299: /* vtabargtoken ::= lp anylist RP */ yytestcase(yyruleno==299); + case 300: /* lp ::= LP */ yytestcase(yyruleno==300); {sqlite3VtabArgExtend(pParse,&yymsp[0].minor.yy0);} break; - case 300: /* with ::= WITH wqlist */ - case 301: /* with ::= WITH RECURSIVE wqlist */ yytestcase(yyruleno==301); -{ sqlite3WithPush(pParse, yymsp[0].minor.yy43, 1); } + case 301: /* with ::= WITH wqlist */ + case 302: /* with ::= WITH RECURSIVE wqlist */ yytestcase(yyruleno==302); +{ sqlite3WithPush(pParse, yymsp[0].minor.yy521, 1); } break; - case 302: /* wqas ::= AS */ -{yymsp[0].minor.yy534 = M10d_Any;} + case 303: /* wqas ::= AS */ +{yymsp[0].minor.yy516 = M10d_Any;} break; - case 303: /* wqas ::= AS MATERIALIZED */ -{yymsp[-1].minor.yy534 = M10d_Yes;} + case 304: /* wqas ::= AS MATERIALIZED */ +{yymsp[-1].minor.yy516 = M10d_Yes;} break; - case 304: /* wqas ::= AS NOT MATERIALIZED */ -{yymsp[-2].minor.yy534 = M10d_No;} + case 305: /* wqas ::= AS NOT MATERIALIZED */ +{yymsp[-2].minor.yy516 = M10d_No;} break; - case 305: /* wqitem ::= nm eidlist_opt wqas LP select RP */ + case 306: /* wqitem ::= nm eidlist_opt wqas LP select RP */ { - yymsp[-5].minor.yy255 = sqlite3CteNew(pParse, &yymsp[-5].minor.yy0, yymsp[-4].minor.yy562, yymsp[-1].minor.yy303, yymsp[-3].minor.yy534); /*A-overwrites-X*/ + yymsp[-5].minor.yy385 = sqlite3CteNew(pParse, &yymsp[-5].minor.yy0, yymsp[-4].minor.yy322, yymsp[-1].minor.yy47, yymsp[-3].minor.yy516); /*A-overwrites-X*/ } break; - case 306: /* wqlist ::= wqitem */ + case 307: /* wqlist ::= wqitem */ { - yymsp[0].minor.yy43 = sqlite3WithAdd(pParse, 0, yymsp[0].minor.yy255); /*A-overwrites-X*/ + yymsp[0].minor.yy521 = sqlite3WithAdd(pParse, 0, yymsp[0].minor.yy385); /*A-overwrites-X*/ } break; - case 307: /* wqlist ::= wqlist COMMA wqitem */ + case 308: /* wqlist ::= wqlist COMMA wqitem */ { - yymsp[-2].minor.yy43 = sqlite3WithAdd(pParse, yymsp[-2].minor.yy43, yymsp[0].minor.yy255); + yymsp[-2].minor.yy521 = sqlite3WithAdd(pParse, yymsp[-2].minor.yy521, yymsp[0].minor.yy385); } break; - case 308: /* windowdefn_list ::= windowdefn */ -{ yylhsminor.yy375 = yymsp[0].minor.yy375; } - yymsp[0].minor.yy375 = yylhsminor.yy375; + case 309: /* windowdefn_list ::= windowdefn */ +{ yylhsminor.yy41 = yymsp[0].minor.yy41; } + yymsp[0].minor.yy41 = yylhsminor.yy41; break; - case 309: /* windowdefn_list ::= windowdefn_list COMMA windowdefn */ + case 310: /* windowdefn_list ::= windowdefn_list COMMA windowdefn */ { - assert( yymsp[0].minor.yy375!=0 ); - sqlite3WindowChain(pParse, yymsp[0].minor.yy375, yymsp[-2].minor.yy375); - yymsp[0].minor.yy375->pNextWin = yymsp[-2].minor.yy375; - yylhsminor.yy375 = yymsp[0].minor.yy375; + assert( yymsp[0].minor.yy41!=0 ); + sqlite3WindowChain(pParse, yymsp[0].minor.yy41, yymsp[-2].minor.yy41); + yymsp[0].minor.yy41->pNextWin = yymsp[-2].minor.yy41; + yylhsminor.yy41 = yymsp[0].minor.yy41; } - yymsp[-2].minor.yy375 = yylhsminor.yy375; + yymsp[-2].minor.yy41 = yylhsminor.yy41; break; - case 310: /* windowdefn ::= nm AS LP window RP */ + case 311: /* windowdefn ::= nm AS LP window RP */ { - if( ALWAYS(yymsp[-1].minor.yy375) ){ - yymsp[-1].minor.yy375->zName = sqlite3DbStrNDup(pParse->db, yymsp[-4].minor.yy0.z, yymsp[-4].minor.yy0.n); + if( ALWAYS(yymsp[-1].minor.yy41) ){ + yymsp[-1].minor.yy41->zName = sqlite3DbStrNDup(pParse->db, yymsp[-4].minor.yy0.z, yymsp[-4].minor.yy0.n); } - yylhsminor.yy375 = yymsp[-1].minor.yy375; + yylhsminor.yy41 = yymsp[-1].minor.yy41; } - yymsp[-4].minor.yy375 = yylhsminor.yy375; + yymsp[-4].minor.yy41 = yylhsminor.yy41; break; - case 311: /* window ::= PARTITION BY nexprlist orderby_opt frame_opt */ + case 312: /* window ::= PARTITION BY nexprlist orderby_opt frame_opt */ { - yymsp[-4].minor.yy375 = sqlite3WindowAssemble(pParse, yymsp[0].minor.yy375, yymsp[-2].minor.yy562, yymsp[-1].minor.yy562, 0); + yymsp[-4].minor.yy41 = sqlite3WindowAssemble(pParse, yymsp[0].minor.yy41, yymsp[-2].minor.yy322, yymsp[-1].minor.yy322, 0); } break; - case 312: /* window ::= nm PARTITION BY nexprlist orderby_opt frame_opt */ + case 313: /* window ::= nm PARTITION BY nexprlist orderby_opt frame_opt */ { - yylhsminor.yy375 = sqlite3WindowAssemble(pParse, yymsp[0].minor.yy375, yymsp[-2].minor.yy562, yymsp[-1].minor.yy562, &yymsp[-5].minor.yy0); + yylhsminor.yy41 = sqlite3WindowAssemble(pParse, yymsp[0].minor.yy41, yymsp[-2].minor.yy322, yymsp[-1].minor.yy322, &yymsp[-5].minor.yy0); } - yymsp[-5].minor.yy375 = yylhsminor.yy375; + yymsp[-5].minor.yy41 = yylhsminor.yy41; break; - case 313: /* window ::= ORDER BY sortlist frame_opt */ + case 314: /* window ::= ORDER BY sortlist frame_opt */ { - yymsp[-3].minor.yy375 = sqlite3WindowAssemble(pParse, yymsp[0].minor.yy375, 0, yymsp[-1].minor.yy562, 0); + yymsp[-3].minor.yy41 = sqlite3WindowAssemble(pParse, yymsp[0].minor.yy41, 0, yymsp[-1].minor.yy322, 0); } break; - case 314: /* window ::= nm ORDER BY sortlist frame_opt */ + case 315: /* window ::= nm ORDER BY sortlist frame_opt */ { - yylhsminor.yy375 = sqlite3WindowAssemble(pParse, yymsp[0].minor.yy375, 0, yymsp[-1].minor.yy562, &yymsp[-4].minor.yy0); + yylhsminor.yy41 = sqlite3WindowAssemble(pParse, yymsp[0].minor.yy41, 0, yymsp[-1].minor.yy322, &yymsp[-4].minor.yy0); } - yymsp[-4].minor.yy375 = yylhsminor.yy375; + yymsp[-4].minor.yy41 = yylhsminor.yy41; break; - case 315: /* window ::= frame_opt */ - case 334: /* filter_over ::= over_clause */ yytestcase(yyruleno==334); + case 316: /* window ::= frame_opt */ + case 335: /* filter_over ::= over_clause */ yytestcase(yyruleno==335); { - yylhsminor.yy375 = yymsp[0].minor.yy375; + yylhsminor.yy41 = yymsp[0].minor.yy41; } - yymsp[0].minor.yy375 = yylhsminor.yy375; + yymsp[0].minor.yy41 = yylhsminor.yy41; break; - case 316: /* window ::= nm frame_opt */ + case 317: /* window ::= nm frame_opt */ { - yylhsminor.yy375 = sqlite3WindowAssemble(pParse, yymsp[0].minor.yy375, 0, 0, &yymsp[-1].minor.yy0); + yylhsminor.yy41 = sqlite3WindowAssemble(pParse, yymsp[0].minor.yy41, 0, 0, &yymsp[-1].minor.yy0); } - yymsp[-1].minor.yy375 = yylhsminor.yy375; + yymsp[-1].minor.yy41 = yylhsminor.yy41; break; - case 317: /* frame_opt ::= */ + case 318: /* frame_opt ::= */ { - yymsp[1].minor.yy375 = sqlite3WindowAlloc(pParse, 0, TK_UNBOUNDED, 0, TK_CURRENT, 0, 0); + yymsp[1].minor.yy41 = sqlite3WindowAlloc(pParse, 0, TK_UNBOUNDED, 0, TK_CURRENT, 0, 0); } break; - case 318: /* frame_opt ::= range_or_rows frame_bound_s frame_exclude_opt */ + case 319: /* frame_opt ::= range_or_rows frame_bound_s frame_exclude_opt */ { - yylhsminor.yy375 = sqlite3WindowAlloc(pParse, yymsp[-2].minor.yy64, yymsp[-1].minor.yy81.eType, yymsp[-1].minor.yy81.pExpr, TK_CURRENT, 0, yymsp[0].minor.yy534); + yylhsminor.yy41 = sqlite3WindowAlloc(pParse, yymsp[-2].minor.yy394, yymsp[-1].minor.yy595.eType, yymsp[-1].minor.yy595.pExpr, TK_CURRENT, 0, yymsp[0].minor.yy516); } - yymsp[-2].minor.yy375 = yylhsminor.yy375; + yymsp[-2].minor.yy41 = yylhsminor.yy41; break; - case 319: /* frame_opt ::= range_or_rows BETWEEN frame_bound_s AND frame_bound_e frame_exclude_opt */ + case 320: /* frame_opt ::= range_or_rows BETWEEN frame_bound_s AND frame_bound_e frame_exclude_opt */ { - yylhsminor.yy375 = sqlite3WindowAlloc(pParse, yymsp[-5].minor.yy64, yymsp[-3].minor.yy81.eType, yymsp[-3].minor.yy81.pExpr, yymsp[-1].minor.yy81.eType, yymsp[-1].minor.yy81.pExpr, yymsp[0].minor.yy534); + yylhsminor.yy41 = sqlite3WindowAlloc(pParse, yymsp[-5].minor.yy394, yymsp[-3].minor.yy595.eType, yymsp[-3].minor.yy595.pExpr, yymsp[-1].minor.yy595.eType, yymsp[-1].minor.yy595.pExpr, yymsp[0].minor.yy516); } - yymsp[-5].minor.yy375 = yylhsminor.yy375; + yymsp[-5].minor.yy41 = yylhsminor.yy41; break; - case 321: /* frame_bound_s ::= frame_bound */ - case 323: /* frame_bound_e ::= frame_bound */ yytestcase(yyruleno==323); -{yylhsminor.yy81 = yymsp[0].minor.yy81;} - yymsp[0].minor.yy81 = yylhsminor.yy81; + case 322: /* frame_bound_s ::= frame_bound */ + case 324: /* frame_bound_e ::= frame_bound */ yytestcase(yyruleno==324); +{yylhsminor.yy595 = yymsp[0].minor.yy595;} + yymsp[0].minor.yy595 = yylhsminor.yy595; break; - case 322: /* frame_bound_s ::= UNBOUNDED PRECEDING */ - case 324: /* frame_bound_e ::= UNBOUNDED FOLLOWING */ yytestcase(yyruleno==324); - case 326: /* frame_bound ::= CURRENT ROW */ yytestcase(yyruleno==326); -{yylhsminor.yy81.eType = yymsp[-1].major; yylhsminor.yy81.pExpr = 0;} - yymsp[-1].minor.yy81 = yylhsminor.yy81; + case 323: /* frame_bound_s ::= UNBOUNDED PRECEDING */ + case 325: /* frame_bound_e ::= UNBOUNDED FOLLOWING */ yytestcase(yyruleno==325); + case 327: /* frame_bound ::= CURRENT ROW */ yytestcase(yyruleno==327); +{yylhsminor.yy595.eType = yymsp[-1].major; yylhsminor.yy595.pExpr = 0;} + yymsp[-1].minor.yy595 = yylhsminor.yy595; break; - case 325: /* frame_bound ::= expr PRECEDING|FOLLOWING */ -{yylhsminor.yy81.eType = yymsp[0].major; yylhsminor.yy81.pExpr = yymsp[-1].minor.yy626;} - yymsp[-1].minor.yy81 = yylhsminor.yy81; + case 326: /* frame_bound ::= expr PRECEDING|FOLLOWING */ +{yylhsminor.yy595.eType = yymsp[0].major; yylhsminor.yy595.pExpr = yymsp[-1].minor.yy528;} + yymsp[-1].minor.yy595 = yylhsminor.yy595; break; - case 327: /* frame_exclude_opt ::= */ -{yymsp[1].minor.yy534 = 0;} + case 328: /* frame_exclude_opt ::= */ +{yymsp[1].minor.yy516 = 0;} break; - case 328: /* frame_exclude_opt ::= EXCLUDE frame_exclude */ -{yymsp[-1].minor.yy534 = yymsp[0].minor.yy534;} + case 329: /* frame_exclude_opt ::= EXCLUDE frame_exclude */ +{yymsp[-1].minor.yy516 = yymsp[0].minor.yy516;} break; - case 329: /* frame_exclude ::= NO OTHERS */ - case 330: /* frame_exclude ::= CURRENT ROW */ yytestcase(yyruleno==330); -{yymsp[-1].minor.yy534 = yymsp[-1].major; /*A-overwrites-X*/} + case 330: /* frame_exclude ::= NO OTHERS */ + case 331: /* frame_exclude ::= CURRENT ROW */ yytestcase(yyruleno==331); +{yymsp[-1].minor.yy516 = yymsp[-1].major; /*A-overwrites-X*/} break; - case 331: /* frame_exclude ::= GROUP|TIES */ -{yymsp[0].minor.yy534 = yymsp[0].major; /*A-overwrites-X*/} + case 332: /* frame_exclude ::= GROUP|TIES */ +{yymsp[0].minor.yy516 = yymsp[0].major; /*A-overwrites-X*/} break; - case 332: /* window_clause ::= WINDOW windowdefn_list */ -{ yymsp[-1].minor.yy375 = yymsp[0].minor.yy375; } + case 333: /* window_clause ::= WINDOW windowdefn_list */ +{ yymsp[-1].minor.yy41 = yymsp[0].minor.yy41; } break; - case 333: /* filter_over ::= filter_clause over_clause */ + case 334: /* filter_over ::= filter_clause over_clause */ { - if( yymsp[0].minor.yy375 ){ - yymsp[0].minor.yy375->pFilter = yymsp[-1].minor.yy626; + if( yymsp[0].minor.yy41 ){ + yymsp[0].minor.yy41->pFilter = yymsp[-1].minor.yy528; }else{ - sqlite3ExprDelete(pParse->db, yymsp[-1].minor.yy626); + sqlite3ExprDelete(pParse->db, yymsp[-1].minor.yy528); } - yylhsminor.yy375 = yymsp[0].minor.yy375; + yylhsminor.yy41 = yymsp[0].minor.yy41; } - yymsp[-1].minor.yy375 = yylhsminor.yy375; + yymsp[-1].minor.yy41 = yylhsminor.yy41; break; - case 335: /* filter_over ::= filter_clause */ + case 336: /* filter_over ::= filter_clause */ { - yylhsminor.yy375 = (Window*)sqlite3DbMallocZero(pParse->db, sizeof(Window)); - if( yylhsminor.yy375 ){ - yylhsminor.yy375->eFrmType = TK_FILTER; - yylhsminor.yy375->pFilter = yymsp[0].minor.yy626; + yylhsminor.yy41 = (Window*)sqlite3DbMallocZero(pParse->db, sizeof(Window)); + if( yylhsminor.yy41 ){ + yylhsminor.yy41->eFrmType = TK_FILTER; + yylhsminor.yy41->pFilter = yymsp[0].minor.yy528; }else{ - sqlite3ExprDelete(pParse->db, yymsp[0].minor.yy626); + sqlite3ExprDelete(pParse->db, yymsp[0].minor.yy528); } } - yymsp[0].minor.yy375 = yylhsminor.yy375; + yymsp[0].minor.yy41 = yylhsminor.yy41; break; - case 336: /* over_clause ::= OVER LP window RP */ + case 337: /* over_clause ::= OVER LP window RP */ { - yymsp[-3].minor.yy375 = yymsp[-1].minor.yy375; - assert( yymsp[-3].minor.yy375!=0 ); + yymsp[-3].minor.yy41 = yymsp[-1].minor.yy41; + assert( yymsp[-3].minor.yy41!=0 ); } break; - case 337: /* over_clause ::= OVER nm */ + case 338: /* over_clause ::= OVER nm */ { - yymsp[-1].minor.yy375 = (Window*)sqlite3DbMallocZero(pParse->db, sizeof(Window)); - if( yymsp[-1].minor.yy375 ){ - yymsp[-1].minor.yy375->zName = sqlite3DbStrNDup(pParse->db, yymsp[0].minor.yy0.z, yymsp[0].minor.yy0.n); + yymsp[-1].minor.yy41 = (Window*)sqlite3DbMallocZero(pParse->db, sizeof(Window)); + if( yymsp[-1].minor.yy41 ){ + yymsp[-1].minor.yy41->zName = sqlite3DbStrNDup(pParse->db, yymsp[0].minor.yy0.z, yymsp[0].minor.yy0.n); } } break; - case 338: /* filter_clause ::= FILTER LP WHERE expr RP */ -{ yymsp[-4].minor.yy626 = yymsp[-1].minor.yy626; } + case 339: /* filter_clause ::= FILTER LP WHERE expr RP */ +{ yymsp[-4].minor.yy528 = yymsp[-1].minor.yy528; } break; default: - /* (339) input ::= cmdlist */ yytestcase(yyruleno==339); - /* (340) cmdlist ::= cmdlist ecmd */ yytestcase(yyruleno==340); - /* (341) cmdlist ::= ecmd (OPTIMIZED OUT) */ assert(yyruleno!=341); - /* (342) ecmd ::= SEMI */ yytestcase(yyruleno==342); - /* (343) ecmd ::= cmdx SEMI */ yytestcase(yyruleno==343); - /* (344) ecmd ::= explain cmdx SEMI (NEVER REDUCES) */ assert(yyruleno!=344); - /* (345) trans_opt ::= */ yytestcase(yyruleno==345); - /* (346) trans_opt ::= TRANSACTION */ yytestcase(yyruleno==346); - /* (347) trans_opt ::= TRANSACTION nm */ yytestcase(yyruleno==347); - /* (348) savepoint_opt ::= SAVEPOINT */ yytestcase(yyruleno==348); - /* (349) savepoint_opt ::= */ yytestcase(yyruleno==349); - /* (350) cmd ::= create_table create_table_args */ yytestcase(yyruleno==350); - /* (351) table_option_set ::= table_option (OPTIMIZED OUT) */ assert(yyruleno!=351); - /* (352) columnlist ::= columnlist COMMA columnname carglist */ yytestcase(yyruleno==352); - /* (353) columnlist ::= columnname carglist */ yytestcase(yyruleno==353); - /* (354) nm ::= ID|INDEXED */ yytestcase(yyruleno==354); - /* (355) nm ::= STRING */ yytestcase(yyruleno==355); - /* (356) nm ::= JOIN_KW */ yytestcase(yyruleno==356); - /* (357) typetoken ::= typename */ yytestcase(yyruleno==357); - /* (358) typename ::= ID|STRING */ yytestcase(yyruleno==358); - /* (359) signed ::= plus_num (OPTIMIZED OUT) */ assert(yyruleno!=359); - /* (360) signed ::= minus_num (OPTIMIZED OUT) */ assert(yyruleno!=360); - /* (361) carglist ::= carglist ccons */ yytestcase(yyruleno==361); - /* (362) carglist ::= */ yytestcase(yyruleno==362); - /* (363) ccons ::= NULL onconf */ yytestcase(yyruleno==363); - /* (364) ccons ::= GENERATED ALWAYS AS generated */ yytestcase(yyruleno==364); - /* (365) ccons ::= AS generated */ yytestcase(yyruleno==365); - /* (366) conslist_opt ::= COMMA conslist */ yytestcase(yyruleno==366); - /* (367) conslist ::= conslist tconscomma tcons */ yytestcase(yyruleno==367); - /* (368) conslist ::= tcons (OPTIMIZED OUT) */ assert(yyruleno!=368); - /* (369) tconscomma ::= */ yytestcase(yyruleno==369); - /* (370) defer_subclause_opt ::= defer_subclause (OPTIMIZED OUT) */ assert(yyruleno!=370); - /* (371) resolvetype ::= raisetype (OPTIMIZED OUT) */ assert(yyruleno!=371); - /* (372) selectnowith ::= oneselect (OPTIMIZED OUT) */ assert(yyruleno!=372); - /* (373) oneselect ::= values */ yytestcase(yyruleno==373); - /* (374) sclp ::= selcollist COMMA */ yytestcase(yyruleno==374); - /* (375) as ::= ID|STRING */ yytestcase(yyruleno==375); - /* (376) returning ::= */ yytestcase(yyruleno==376); - /* (377) expr ::= term (OPTIMIZED OUT) */ assert(yyruleno!=377); - /* (378) likeop ::= LIKE_KW|MATCH */ yytestcase(yyruleno==378); - /* (379) exprlist ::= nexprlist */ yytestcase(yyruleno==379); - /* (380) nmnum ::= plus_num (OPTIMIZED OUT) */ assert(yyruleno!=380); - /* (381) nmnum ::= nm (OPTIMIZED OUT) */ assert(yyruleno!=381); - /* (382) nmnum ::= ON */ yytestcase(yyruleno==382); - /* (383) nmnum ::= DELETE */ yytestcase(yyruleno==383); - /* (384) nmnum ::= DEFAULT */ yytestcase(yyruleno==384); - /* (385) plus_num ::= INTEGER|FLOAT */ yytestcase(yyruleno==385); - /* (386) foreach_clause ::= */ yytestcase(yyruleno==386); - /* (387) foreach_clause ::= FOR EACH ROW */ yytestcase(yyruleno==387); - /* (388) trnm ::= nm */ yytestcase(yyruleno==388); - /* (389) tridxby ::= */ yytestcase(yyruleno==389); - /* (390) database_kw_opt ::= DATABASE */ yytestcase(yyruleno==390); - /* (391) database_kw_opt ::= */ yytestcase(yyruleno==391); - /* (392) kwcolumn_opt ::= */ yytestcase(yyruleno==392); - /* (393) kwcolumn_opt ::= COLUMNKW */ yytestcase(yyruleno==393); - /* (394) vtabarglist ::= vtabarg */ yytestcase(yyruleno==394); - /* (395) vtabarglist ::= vtabarglist COMMA vtabarg */ yytestcase(yyruleno==395); - /* (396) vtabarg ::= vtabarg vtabargtoken */ yytestcase(yyruleno==396); - /* (397) anylist ::= */ yytestcase(yyruleno==397); - /* (398) anylist ::= anylist LP anylist RP */ yytestcase(yyruleno==398); - /* (399) anylist ::= anylist ANY */ yytestcase(yyruleno==399); - /* (400) with ::= */ yytestcase(yyruleno==400); + /* (340) input ::= cmdlist */ yytestcase(yyruleno==340); + /* (341) cmdlist ::= cmdlist ecmd */ yytestcase(yyruleno==341); + /* (342) cmdlist ::= ecmd (OPTIMIZED OUT) */ assert(yyruleno!=342); + /* (343) ecmd ::= SEMI */ yytestcase(yyruleno==343); + /* (344) ecmd ::= cmdx SEMI */ yytestcase(yyruleno==344); + /* (345) ecmd ::= explain cmdx SEMI (NEVER REDUCES) */ assert(yyruleno!=345); + /* (346) trans_opt ::= */ yytestcase(yyruleno==346); + /* (347) trans_opt ::= TRANSACTION */ yytestcase(yyruleno==347); + /* (348) trans_opt ::= TRANSACTION nm */ yytestcase(yyruleno==348); + /* (349) savepoint_opt ::= SAVEPOINT */ yytestcase(yyruleno==349); + /* (350) savepoint_opt ::= */ yytestcase(yyruleno==350); + /* (351) cmd ::= create_table create_table_args */ yytestcase(yyruleno==351); + /* (352) table_option_set ::= table_option (OPTIMIZED OUT) */ assert(yyruleno!=352); + /* (353) columnlist ::= columnlist COMMA columnname carglist */ yytestcase(yyruleno==353); + /* (354) columnlist ::= columnname carglist */ yytestcase(yyruleno==354); + /* (355) nm ::= ID|INDEXED */ yytestcase(yyruleno==355); + /* (356) nm ::= STRING */ yytestcase(yyruleno==356); + /* (357) nm ::= JOIN_KW */ yytestcase(yyruleno==357); + /* (358) typetoken ::= typename */ yytestcase(yyruleno==358); + /* (359) typename ::= ID|STRING */ yytestcase(yyruleno==359); + /* (360) signed ::= plus_num (OPTIMIZED OUT) */ assert(yyruleno!=360); + /* (361) signed ::= minus_num (OPTIMIZED OUT) */ assert(yyruleno!=361); + /* (362) carglist ::= carglist ccons */ yytestcase(yyruleno==362); + /* (363) carglist ::= */ yytestcase(yyruleno==363); + /* (364) ccons ::= NULL onconf */ yytestcase(yyruleno==364); + /* (365) ccons ::= GENERATED ALWAYS AS generated */ yytestcase(yyruleno==365); + /* (366) ccons ::= AS generated */ yytestcase(yyruleno==366); + /* (367) conslist_opt ::= COMMA conslist */ yytestcase(yyruleno==367); + /* (368) conslist ::= conslist tconscomma tcons */ yytestcase(yyruleno==368); + /* (369) conslist ::= tcons (OPTIMIZED OUT) */ assert(yyruleno!=369); + /* (370) tconscomma ::= */ yytestcase(yyruleno==370); + /* (371) defer_subclause_opt ::= defer_subclause (OPTIMIZED OUT) */ assert(yyruleno!=371); + /* (372) resolvetype ::= raisetype (OPTIMIZED OUT) */ assert(yyruleno!=372); + /* (373) selectnowith ::= oneselect (OPTIMIZED OUT) */ assert(yyruleno!=373); + /* (374) oneselect ::= values */ yytestcase(yyruleno==374); + /* (375) sclp ::= selcollist COMMA */ yytestcase(yyruleno==375); + /* (376) as ::= ID|STRING */ yytestcase(yyruleno==376); + /* (377) returning ::= */ yytestcase(yyruleno==377); + /* (378) expr ::= term (OPTIMIZED OUT) */ assert(yyruleno!=378); + /* (379) likeop ::= LIKE_KW|MATCH */ yytestcase(yyruleno==379); + /* (380) exprlist ::= nexprlist */ yytestcase(yyruleno==380); + /* (381) nmnum ::= plus_num (OPTIMIZED OUT) */ assert(yyruleno!=381); + /* (382) nmnum ::= nm (OPTIMIZED OUT) */ assert(yyruleno!=382); + /* (383) nmnum ::= ON */ yytestcase(yyruleno==383); + /* (384) nmnum ::= DELETE */ yytestcase(yyruleno==384); + /* (385) nmnum ::= DEFAULT */ yytestcase(yyruleno==385); + /* (386) plus_num ::= INTEGER|FLOAT */ yytestcase(yyruleno==386); + /* (387) foreach_clause ::= */ yytestcase(yyruleno==387); + /* (388) foreach_clause ::= FOR EACH ROW */ yytestcase(yyruleno==388); + /* (389) trnm ::= nm */ yytestcase(yyruleno==389); + /* (390) tridxby ::= */ yytestcase(yyruleno==390); + /* (391) database_kw_opt ::= DATABASE */ yytestcase(yyruleno==391); + /* (392) database_kw_opt ::= */ yytestcase(yyruleno==392); + /* (393) kwcolumn_opt ::= */ yytestcase(yyruleno==393); + /* (394) kwcolumn_opt ::= COLUMNKW */ yytestcase(yyruleno==394); + /* (395) vtabarglist ::= vtabarg */ yytestcase(yyruleno==395); + /* (396) vtabarglist ::= vtabarglist COMMA vtabarg */ yytestcase(yyruleno==396); + /* (397) vtabarg ::= vtabarg vtabargtoken */ yytestcase(yyruleno==397); + /* (398) anylist ::= */ yytestcase(yyruleno==398); + /* (399) anylist ::= anylist LP anylist RP */ yytestcase(yyruleno==399); + /* (400) anylist ::= anylist ANY */ yytestcase(yyruleno==400); + /* (401) with ::= */ yytestcase(yyruleno==401); break; /********** End reduce actions ************************************************/ }; @@ -165623,6 +167521,9 @@ SQLITE_PRIVATE int sqlite3GetToken(const unsigned char *z, int *tokenType){ for(i=2; (c=z[i])!=0 && c!='\n'; i++){} *tokenType = TK_SPACE; /* IMP: R-22934-25134 */ return i; + }else if( z[1]=='>' ){ + *tokenType = TK_PTR; + return 2 + (z[2]=='>'); } *tokenType = TK_MINUS; return 1; @@ -165892,13 +167793,9 @@ SQLITE_PRIVATE int sqlite3GetToken(const unsigned char *z, int *tokenType){ } /* -** Run the parser on the given SQL string. The parser structure is -** passed in. An SQLITE_ status code is returned. If an error occurs -** then an and attempt is made to write an error message into -** memory obtained from sqlite3_malloc() and to make *pzErrMsg point to that -** error message. +** Run the parser on the given SQL string. */ -SQLITE_PRIVATE int sqlite3RunParser(Parse *pParse, const char *zSql, char **pzErrMsg){ +SQLITE_PRIVATE int sqlite3RunParser(Parse *pParse, const char *zSql){ int nErr = 0; /* Number of errors encountered */ void *pEngine; /* The LEMON-generated LALR(1) parser */ int n = 0; /* Length of the next token token */ @@ -165919,7 +167816,6 @@ SQLITE_PRIVATE int sqlite3RunParser(Parse *pParse, const char *zSql, char **pzEr } pParse->rc = SQLITE_OK; pParse->zTail = zSql; - assert( pzErrMsg!=0 ); #ifdef SQLITE_DEBUG if( db->flags & SQLITE_ParserTrace ){ printf("parser: [[[%s]]]\n", zSql); @@ -165962,6 +167858,7 @@ SQLITE_PRIVATE int sqlite3RunParser(Parse *pParse, const char *zSql, char **pzEr #endif /* SQLITE_OMIT_WINDOWFUNC */ if( AtomicLoad(&db->u1.isInterrupted) ){ pParse->rc = SQLITE_INTERRUPT; + pParse->nErr++; break; } if( tokenType==TK_SPACE ){ @@ -165991,7 +167888,10 @@ SQLITE_PRIVATE int sqlite3RunParser(Parse *pParse, const char *zSql, char **pzEr tokenType = analyzeFilterKeyword((const u8*)&zSql[6], lastTokenParsed); #endif /* SQLITE_OMIT_WINDOWFUNC */ }else{ - sqlite3ErrorMsg(pParse, "unrecognized token: \"%.*s\"", n, zSql); + Token x; + x.z = zSql; + x.n = n; + sqlite3ErrorMsg(pParse, "unrecognized token: \"%T\"", &x); break; } } @@ -166019,41 +167919,26 @@ SQLITE_PRIVATE int sqlite3RunParser(Parse *pParse, const char *zSql, char **pzEr if( db->mallocFailed ){ pParse->rc = SQLITE_NOMEM_BKPT; } - if( pParse->rc!=SQLITE_OK && pParse->rc!=SQLITE_DONE && pParse->zErrMsg==0 ){ - pParse->zErrMsg = sqlite3MPrintf(db, "%s", sqlite3ErrStr(pParse->rc)); - } - assert( pzErrMsg!=0 ); - if( pParse->zErrMsg ){ - *pzErrMsg = pParse->zErrMsg; - sqlite3_log(pParse->rc, "%s in \"%s\"", - *pzErrMsg, pParse->zTail); - pParse->zErrMsg = 0; + if( pParse->zErrMsg || (pParse->rc!=SQLITE_OK && pParse->rc!=SQLITE_DONE) ){ + if( pParse->zErrMsg==0 ){ + pParse->zErrMsg = sqlite3MPrintf(db, "%s", sqlite3ErrStr(pParse->rc)); + } + sqlite3_log(pParse->rc, "%s in \"%s\"", pParse->zErrMsg, pParse->zTail); nErr++; } pParse->zTail = zSql; - if( pParse->pVdbe && pParse->nErr>0 && pParse->nested==0 ){ - sqlite3VdbeDelete(pParse->pVdbe); - pParse->pVdbe = 0; - } -#ifndef SQLITE_OMIT_SHARED_CACHE - if( pParse->nested==0 ){ - sqlite3DbFree(db, pParse->aTableLock); - pParse->aTableLock = 0; - pParse->nTableLock = 0; - } -#endif #ifndef SQLITE_OMIT_VIRTUALTABLE sqlite3_free(pParse->apVtabLock); #endif - if( !IN_SPECIAL_PARSE ){ + if( pParse->pNewTable && !IN_SPECIAL_PARSE ){ /* If the pParse->declareVtab flag is set, do not delete any table ** structure built up in pParse->pNewTable. The calling code (see vtab.c) ** will take responsibility for freeing the Table structure. */ sqlite3DeleteTable(db, pParse->pNewTable); } - if( !IN_RENAME_OBJECT ){ + if( pParse->pNewTrigger && !IN_RENAME_OBJECT ){ sqlite3DeleteTrigger(db, pParse->pNewTrigger); } sqlite3DbFree(db, pParse->pVList); @@ -166638,9 +168523,6 @@ SQLITE_PRIVATE int sqlite3Fts2Init(sqlite3*); #ifdef SQLITE_ENABLE_FTS5 SQLITE_PRIVATE int sqlite3Fts5Init(sqlite3*); #endif -#ifdef SQLITE_ENABLE_JSON1 -SQLITE_PRIVATE int sqlite3Json1Init(sqlite3*); -#endif #ifdef SQLITE_ENABLE_STMTVTAB SQLITE_PRIVATE int sqlite3StmtVtabInit(sqlite3*); #endif @@ -166675,8 +168557,8 @@ static int (*const sqlite3BuiltinExtensions[])(sqlite3*) = { sqlite3DbstatRegister, #endif sqlite3TestExtInit, -#ifdef SQLITE_ENABLE_JSON1 - sqlite3Json1Init, +#if !defined(SQLITE_OMIT_VIRTUALTABLE) && !defined(SQLITE_OMIT_JSON) + sqlite3JsonTableFunctions, #endif #ifdef SQLITE_ENABLE_STMTVTAB sqlite3StmtVtabInit, @@ -169185,6 +171067,19 @@ SQLITE_API const char *sqlite3_errmsg(sqlite3 *db){ return z; } +/* +** Return the byte offset of the most recent error +*/ +SQLITE_API int sqlite3_error_offset(sqlite3 *db){ + int iOffset = -1; + if( db && sqlite3SafetyCheckSickOrOk(db) && db->errCode ){ + sqlite3_mutex_enter(db->mutex); + iOffset = db->errByteOffset; + sqlite3_mutex_leave(db->mutex); + } + return iOffset; +} + #ifndef SQLITE_OMIT_UTF16 /* ** Return UTF-16 encoded English language explanation of the most recent @@ -170607,12 +172502,16 @@ SQLITE_API int sqlite3_test_control(int op, ...){ ** sqlite3_test_control(). */ case SQLITE_TESTCTRL_FAULT_INSTALL: { - /* MSVC is picky about pulling func ptrs from va lists. - ** http://support.microsoft.com/kb/47961 + /* A bug in MSVC prevents it from understanding pointers to functions + ** types in the second argument to va_arg(). Work around the problem + ** using a typedef. + ** http://support.microsoft.com/kb/47961 <-- dead hyperlink + ** Search at http://web.archive.org/ to find the 2015-03-16 archive + ** of the link above to see the original text. ** sqlite3GlobalConfig.xTestCallback = va_arg(ap, int(*)(int)); */ - typedef int(*TESTCALLBACKFUNC_t)(int); - sqlite3GlobalConfig.xTestCallback = va_arg(ap, TESTCALLBACKFUNC_t); + typedef int(*sqlite3FaultFuncType)(int); + sqlite3GlobalConfig.xTestCallback = va_arg(ap, sqlite3FaultFuncType); rc = sqlite3FaultSim(0); break; } @@ -170739,13 +172638,27 @@ SQLITE_API int sqlite3_test_control(int op, ...){ break; } - /* sqlite3_test_control(SQLITE_TESTCTRL_LOCALTIME_FAULT, int onoff); + /* sqlite3_test_control(SQLITE_TESTCTRL_LOCALTIME_FAULT, onoff, xAlt); + ** + ** If parameter onoff is 1, subsequent calls to localtime() fail. + ** If 2, then invoke xAlt() instead of localtime(). If 0, normal + ** processing. ** - ** If parameter onoff is non-zero, subsequent calls to localtime() - ** and its variants fail. If onoff is zero, undo this setting. + ** xAlt arguments are void pointers, but they really want to be: + ** + ** int xAlt(const time_t*, struct tm*); + ** + ** xAlt should write results in to struct tm object of its 2nd argument + ** and return zero on success, or return non-zero on failure. */ case SQLITE_TESTCTRL_LOCALTIME_FAULT: { sqlite3GlobalConfig.bLocaltimeFault = va_arg(ap, int); + if( sqlite3GlobalConfig.bLocaltimeFault==2 ){ + typedef int(*sqlite3LocaltimeType)(const void*,void*); + sqlite3GlobalConfig.xAltLocaltime = va_arg(ap, sqlite3LocaltimeType); + }else{ + sqlite3GlobalConfig.xAltLocaltime = 0; + } break; } @@ -170935,6 +172848,26 @@ SQLITE_API int sqlite3_test_control(int op, ...){ break; } + /* sqlite3_test_control(SQLITE_TESTCTRL_LOGEST, + ** double fIn, // Input value + ** int *pLogEst, // sqlite3LogEstFromDouble(fIn) + ** u64 *pInt, // sqlite3LogEstToInt(*pLogEst) + ** int *pLogEst2 // sqlite3LogEst(*pInt) + ** ); + ** + ** Test access for the LogEst conversion routines. + */ + case SQLITE_TESTCTRL_LOGEST: { + double rIn = va_arg(ap, double); + LogEst rLogEst = sqlite3LogEstFromDouble(rIn); + u64 iInt = sqlite3LogEstToInt(rLogEst); + va_arg(ap, int*)[0] = rLogEst; + va_arg(ap, u64*)[0] = iInt; + va_arg(ap, int*)[0] = sqlite3LogEst(iInt); + break; + } + + #if defined(SQLITE_DEBUG) && !defined(SQLITE_OMIT_WSD) /* sqlite3_test_control(SQLITE_TESTCTRL_TUNE, id, *piValue) ** @@ -172915,7 +174848,7 @@ SQLITE_PRIVATE int sqlite3Fts3MsrOvfl(Fts3Cursor *, Fts3MultiSegReader *, int *) SQLITE_PRIVATE int sqlite3Fts3MsrIncrRestart(Fts3MultiSegReader *pCsr); /* fts3_tokenize_vtab.c */ -SQLITE_PRIVATE int sqlite3Fts3InitTok(sqlite3*, Fts3Hash *); +SQLITE_PRIVATE int sqlite3Fts3InitTok(sqlite3*, Fts3Hash *, void(*xDestroy)(void*)); /* fts3_unicode2.c (functions generated by parsing unicode text files) */ #ifndef SQLITE_DISABLE_FTS3_UNICODE @@ -172948,6 +174881,12 @@ SQLITE_PRIVATE int sqlite3FtsUnicodeIsdiacritic(int); SQLITE_EXTENSION_INIT1 #endif +typedef struct Fts3HashWrapper Fts3HashWrapper; +struct Fts3HashWrapper { + Fts3Hash hash; /* Hash table */ + int nRef; /* Number of pointers to this object */ +}; + static int fts3EvalNext(Fts3Cursor *pCsr); static int fts3EvalStart(Fts3Cursor *pCsr); static int fts3TermSegReaderCursor( @@ -173812,7 +175751,7 @@ static int fts3InitVtab( sqlite3_vtab **ppVTab, /* Write the resulting vtab structure here */ char **pzErr /* Write any error message here */ ){ - Fts3Hash *pHash = (Fts3Hash *)pAux; + Fts3Hash *pHash = &((Fts3HashWrapper*)pAux)->hash; Fts3Table *p = 0; /* Pointer to allocated vtab */ int rc = SQLITE_OK; /* Return code */ int i; /* Iterator variable */ @@ -176647,9 +178586,12 @@ static const sqlite3_module fts3Module = { ** allocated for the tokenizer hash table. */ static void hashDestroy(void *p){ - Fts3Hash *pHash = (Fts3Hash *)p; - sqlite3Fts3HashClear(pHash); - sqlite3_free(pHash); + Fts3HashWrapper *pHash = (Fts3HashWrapper *)p; + pHash->nRef--; + if( pHash->nRef<=0 ){ + sqlite3Fts3HashClear(&pHash->hash); + sqlite3_free(pHash); + } } /* @@ -176679,7 +178621,7 @@ SQLITE_PRIVATE void sqlite3Fts3IcuTokenizerModule(sqlite3_tokenizer_module const */ SQLITE_PRIVATE int sqlite3Fts3Init(sqlite3 *db){ int rc = SQLITE_OK; - Fts3Hash *pHash = 0; + Fts3HashWrapper *pHash = 0; const sqlite3_tokenizer_module *pSimple = 0; const sqlite3_tokenizer_module *pPorter = 0; #ifndef SQLITE_DISABLE_FTS3_UNICODE @@ -176707,23 +178649,24 @@ SQLITE_PRIVATE int sqlite3Fts3Init(sqlite3 *db){ sqlite3Fts3PorterTokenizerModule(&pPorter); /* Allocate and initialize the hash-table used to store tokenizers. */ - pHash = sqlite3_malloc(sizeof(Fts3Hash)); + pHash = sqlite3_malloc(sizeof(Fts3HashWrapper)); if( !pHash ){ rc = SQLITE_NOMEM; }else{ - sqlite3Fts3HashInit(pHash, FTS3_HASH_STRING, 1); + sqlite3Fts3HashInit(&pHash->hash, FTS3_HASH_STRING, 1); + pHash->nRef = 0; } /* Load the built-in tokenizers into the hash table */ if( rc==SQLITE_OK ){ - if( sqlite3Fts3HashInsert(pHash, "simple", 7, (void *)pSimple) - || sqlite3Fts3HashInsert(pHash, "porter", 7, (void *)pPorter) + if( sqlite3Fts3HashInsert(&pHash->hash, "simple", 7, (void *)pSimple) + || sqlite3Fts3HashInsert(&pHash->hash, "porter", 7, (void *)pPorter) #ifndef SQLITE_DISABLE_FTS3_UNICODE - || sqlite3Fts3HashInsert(pHash, "unicode61", 10, (void *)pUnicode) + || sqlite3Fts3HashInsert(&pHash->hash, "unicode61", 10, (void *)pUnicode) #endif #ifdef SQLITE_ENABLE_ICU - || (pIcu && sqlite3Fts3HashInsert(pHash, "icu", 4, (void *)pIcu)) + || (pIcu && sqlite3Fts3HashInsert(&pHash->hash, "icu", 4, (void *)pIcu)) #endif ){ rc = SQLITE_NOMEM; @@ -176732,7 +178675,7 @@ SQLITE_PRIVATE int sqlite3Fts3Init(sqlite3 *db){ #ifdef SQLITE_TEST if( rc==SQLITE_OK ){ - rc = sqlite3Fts3ExprInitTestInterface(db, pHash); + rc = sqlite3Fts3ExprInitTestInterface(db, &pHash->hash); } #endif @@ -176741,23 +178684,26 @@ SQLITE_PRIVATE int sqlite3Fts3Init(sqlite3 *db){ ** module with sqlite. */ if( SQLITE_OK==rc - && SQLITE_OK==(rc = sqlite3Fts3InitHashTable(db, pHash, "fts3_tokenizer")) + && SQLITE_OK==(rc=sqlite3Fts3InitHashTable(db,&pHash->hash,"fts3_tokenizer")) && SQLITE_OK==(rc = sqlite3_overload_function(db, "snippet", -1)) && SQLITE_OK==(rc = sqlite3_overload_function(db, "offsets", 1)) && SQLITE_OK==(rc = sqlite3_overload_function(db, "matchinfo", 1)) && SQLITE_OK==(rc = sqlite3_overload_function(db, "matchinfo", 2)) && SQLITE_OK==(rc = sqlite3_overload_function(db, "optimize", 1)) ){ + pHash->nRef++; rc = sqlite3_create_module_v2( db, "fts3", &fts3Module, (void *)pHash, hashDestroy ); if( rc==SQLITE_OK ){ + pHash->nRef++; rc = sqlite3_create_module_v2( - db, "fts4", &fts3Module, (void *)pHash, 0 + db, "fts4", &fts3Module, (void *)pHash, hashDestroy ); } if( rc==SQLITE_OK ){ - rc = sqlite3Fts3InitTok(db, (void *)pHash); + pHash->nRef++; + rc = sqlite3Fts3InitTok(db, (void *)pHash, hashDestroy); } return rc; } @@ -176766,7 +178712,7 @@ SQLITE_PRIVATE int sqlite3Fts3Init(sqlite3 *db){ /* An error has occurred. Delete the hash table and return the error code. */ assert( rc!=SQLITE_OK ); if( pHash ){ - sqlite3Fts3HashClear(pHash); + sqlite3Fts3HashClear(&pHash->hash); sqlite3_free(pHash); } return rc; @@ -182830,7 +184776,7 @@ static int fts3tokRowidMethod( ** Register the fts3tok module with database connection db. Return SQLITE_OK ** if successful or an error code if sqlite3_create_module() fails. */ -SQLITE_PRIVATE int sqlite3Fts3InitTok(sqlite3 *db, Fts3Hash *pHash){ +SQLITE_PRIVATE int sqlite3Fts3InitTok(sqlite3 *db, Fts3Hash *pHash, void(*xDestroy)(void*)){ static const sqlite3_module fts3tok_module = { 0, /* iVersion */ fts3tokConnectMethod, /* xCreate */ @@ -182859,7 +184805,9 @@ SQLITE_PRIVATE int sqlite3Fts3InitTok(sqlite3 *db, Fts3Hash *pHash){ }; int rc; /* Return code */ - rc = sqlite3_create_module(db, "fts3tokenize", &fts3tok_module, (void*)pHash); + rc = sqlite3_create_module_v2( + db, "fts3tokenize", &fts3tok_module, (void*)pHash, xDestroy + ); return rc; } @@ -191218,7 +193166,7 @@ SQLITE_PRIVATE int sqlite3FtsUnicodeFold(int c, int eRemoveDiacritic){ #endif /* !defined(SQLITE_DISABLE_FTS3_UNICODE) */ /************** End of fts3_unicode2.c ***************************************/ -/************** Begin file json1.c *******************************************/ +/************** Begin file json.c ********************************************/ /* ** 2015-08-12 ** @@ -191231,10 +193179,10 @@ SQLITE_PRIVATE int sqlite3FtsUnicodeFold(int c, int eRemoveDiacritic){ ** ****************************************************************************** ** -** This SQLite extension implements JSON functions. The interface is -** modeled after MySQL JSON functions: +** This SQLite JSON functions. ** -** https://dev.mysql.com/doc/refman/5.7/en/json.html +** This file began as an extension in ext/misc/json1.c in 2015. That +** extension proved so useful that it has now been moved into the core. ** ** For the time being, all JSON is stored as pure text. (We might add ** a JSONB type in the future which stores a binary encoding of JSON in @@ -191242,48 +193190,8 @@ SQLITE_PRIVATE int sqlite3FtsUnicodeFold(int c, int eRemoveDiacritic){ ** This implementation parses JSON text at 250 MB/s, so it is hard to see ** how JSONB might improve on that.) */ -#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_JSON1) -#if !defined(SQLITEINT_H) -/* #include "sqlite3ext.h" */ -#endif -SQLITE_EXTENSION_INIT1 -/* #include */ -/* #include */ -/* #include */ -/* #include */ - -/* Mark a function parameter as unused, to suppress nuisance compiler -** warnings. */ -#ifndef UNUSED_PARAM -# define UNUSED_PARAM(X) (void)(X) -#endif - -#ifndef LARGEST_INT64 -# define LARGEST_INT64 (0xffffffff|(((sqlite3_int64)0x7fffffff)<<32)) -# define SMALLEST_INT64 (((sqlite3_int64)-1) - LARGEST_INT64) -#endif - -#ifndef deliberate_fall_through -# define deliberate_fall_through -#endif - -/* -** Versions of isspace(), isalnum() and isdigit() to which it is safe -** to pass signed char values. -*/ -#ifdef sqlite3Isdigit - /* Use the SQLite core versions if this routine is part of the - ** SQLite amalgamation */ -# define safe_isdigit(x) sqlite3Isdigit(x) -# define safe_isalnum(x) sqlite3Isalnum(x) -# define safe_isxdigit(x) sqlite3Isxdigit(x) -#else - /* Use the standard library for separate compilation */ -#include /* amalgamator: keep */ -# define safe_isdigit(x) isdigit((unsigned char)(x)) -# define safe_isalnum(x) isalnum((unsigned char)(x)) -# define safe_isxdigit(x) isxdigit((unsigned char)(x)) -#endif +#ifndef SQLITE_OMIT_JSON +/* #include "sqliteInt.h" */ /* ** Growing our own isspace() routine this way is twice as fast as @@ -191308,44 +193216,14 @@ static const char jsonIsSpace[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; -#define safe_isspace(x) (jsonIsSpace[(unsigned char)x]) +#define fast_isspace(x) (jsonIsSpace[(unsigned char)x]) -#ifndef SQLITE_AMALGAMATION - /* Unsigned integer types. These are already defined in the sqliteInt.h, - ** but the definitions need to be repeated for separate compilation. */ - typedef sqlite3_uint64 u64; - typedef unsigned int u32; - typedef unsigned short int u16; - typedef unsigned char u8; -# if defined(SQLITE_COVERAGE_TEST) || defined(SQLITE_MUTATION_TEST) -# define SQLITE_OMIT_AUXILIARY_SAFETY_CHECKS 1 -# endif -# if defined(SQLITE_OMIT_AUXILIARY_SAFETY_CHECKS) -# define ALWAYS(X) (1) -# define NEVER(X) (0) -# elif !defined(NDEBUG) -# define ALWAYS(X) ((X)?1:(assert(0),0)) -# define NEVER(X) ((X)?(assert(0),1):0) -# else -# define ALWAYS(X) (X) -# define NEVER(X) (X) -# endif -# define testcase(X) -#endif #if !defined(SQLITE_DEBUG) && !defined(SQLITE_COVERAGE_TEST) # define VVA(X) #else # define VVA(X) X #endif -/* -** Some of the testcase() macros in this file are problematic for gcov -** in that they generate false-miss errors randomly. This is a gcov problem, -** not a problem in this case. But to work around it, we disable the -** problematic test cases for production builds. -*/ -#define json_testcase(X) - /* Objects */ typedef struct JsonString JsonString; typedef struct JsonNode JsonNode; @@ -191803,10 +193681,10 @@ static u8 jsonHexToInt(int h){ */ static u32 jsonHexToInt4(const char *z){ u32 v; - assert( safe_isxdigit(z[0]) ); - assert( safe_isxdigit(z[1]) ); - assert( safe_isxdigit(z[2]) ); - assert( safe_isxdigit(z[3]) ); + assert( sqlite3Isxdigit(z[0]) ); + assert( sqlite3Isxdigit(z[1]) ); + assert( sqlite3Isxdigit(z[2]) ); + assert( sqlite3Isxdigit(z[3]) ); v = (jsonHexToInt(z[0])<<12) + (jsonHexToInt(z[1])<<8) + (jsonHexToInt(z[2])<<4) @@ -192041,7 +193919,7 @@ static int jsonParseAddNode( */ static int jsonIs4Hex(const char *z){ int i; - for(i=0; i<4; i++) if( !safe_isxdigit(z[i]) ) return 0; + for(i=0; i<4; i++) if( !sqlite3Isxdigit(z[i]) ) return 0; return 1; } @@ -192060,13 +193938,13 @@ static int jsonParseValue(JsonParse *pParse, u32 i){ int x; JsonNode *pNode; const char *z = pParse->zJson; - while( safe_isspace(z[i]) ){ i++; } + while( fast_isspace(z[i]) ){ i++; } if( (c = z[i])=='{' ){ /* Parse object */ iThis = jsonParseAddNode(pParse, JSON_OBJECT, 0, 0); if( iThis<0 ) return -1; for(j=i+1;;j++){ - while( safe_isspace(z[j]) ){ j++; } + while( fast_isspace(z[j]) ){ j++; } if( ++pParse->iDepth > JSON_MAX_DEPTH ) return -1; x = jsonParseValue(pParse, j); if( x<0 ){ @@ -192079,14 +193957,14 @@ static int jsonParseValue(JsonParse *pParse, u32 i){ if( pNode->eType!=JSON_STRING ) return -1; pNode->jnFlags |= JNODE_LABEL; j = x; - while( safe_isspace(z[j]) ){ j++; } + while( fast_isspace(z[j]) ){ j++; } if( z[j]!=':' ) return -1; j++; x = jsonParseValue(pParse, j); pParse->iDepth--; if( x<0 ) return -1; j = x; - while( safe_isspace(z[j]) ){ j++; } + while( fast_isspace(z[j]) ){ j++; } c = z[j]; if( c==',' ) continue; if( c!='}' ) return -1; @@ -192100,7 +193978,7 @@ static int jsonParseValue(JsonParse *pParse, u32 i){ if( iThis<0 ) return -1; memset(&pParse->aNode[iThis].u, 0, sizeof(pParse->aNode[iThis].u)); for(j=i+1;;j++){ - while( safe_isspace(z[j]) ){ j++; } + while( fast_isspace(z[j]) ){ j++; } if( ++pParse->iDepth > JSON_MAX_DEPTH ) return -1; x = jsonParseValue(pParse, j); pParse->iDepth--; @@ -192109,7 +193987,7 @@ static int jsonParseValue(JsonParse *pParse, u32 i){ return -1; } j = x; - while( safe_isspace(z[j]) ){ j++; } + while( fast_isspace(z[j]) ){ j++; } c = z[j]; if( c==',' ) continue; if( c!=']' ) return -1; @@ -192146,17 +194024,17 @@ static int jsonParseValue(JsonParse *pParse, u32 i){ return j+1; }else if( c=='n' && strncmp(z+i,"null",4)==0 - && !safe_isalnum(z[i+4]) ){ + && !sqlite3Isalnum(z[i+4]) ){ jsonParseAddNode(pParse, JSON_NULL, 0, 0); return i+4; }else if( c=='t' && strncmp(z+i,"true",4)==0 - && !safe_isalnum(z[i+4]) ){ + && !sqlite3Isalnum(z[i+4]) ){ jsonParseAddNode(pParse, JSON_TRUE, 0, 0); return i+4; }else if( c=='f' && strncmp(z+i,"false",5)==0 - && !safe_isalnum(z[i+5]) ){ + && !sqlite3Isalnum(z[i+5]) ){ jsonParseAddNode(pParse, JSON_FALSE, 0, 0); return i+5; }else if( c=='-' || (c>='0' && c<='9') ){ @@ -192227,7 +194105,7 @@ static int jsonParse( if( pParse->oom ) i = -1; if( i>0 ){ assert( pParse->iDepth==0 ); - while( safe_isspace(zJson[i]) ) i++; + while( fast_isspace(zJson[i]) ) i++; if( zJson[i] ) i = -1; } if( i<=0 ){ @@ -192455,7 +194333,7 @@ static JsonNode *jsonLookupStep( }else if( zPath[0]=='[' ){ i = 0; j = 1; - while( safe_isdigit(zPath[j]) ){ + while( sqlite3Isdigit(zPath[j]) ){ i = i*10 + zPath[j] - '0'; j++; } @@ -192476,13 +194354,13 @@ static JsonNode *jsonLookupStep( j = 1; } j = 2; - if( zPath[2]=='-' && safe_isdigit(zPath[3]) ){ + if( zPath[2]=='-' && sqlite3Isdigit(zPath[3]) ){ unsigned int x = 0; j = 3; do{ x = x*10 + zPath[j] - '0'; j++; - }while( safe_isdigit(zPath[j]) ); + }while( sqlite3Isdigit(zPath[j]) ); if( x>i ) return 0; i -= x; } @@ -192701,7 +194579,7 @@ static void jsonTest1Func( int argc, sqlite3_value **argv ){ - UNUSED_PARAM(argc); + UNUSED_PARAMETER(argc); sqlite3_result_int(ctx, sqlite3_value_subtype(argv[0])==JSON_SUBTYPE); } #endif /* SQLITE_DEBUG */ @@ -192722,7 +194600,7 @@ static void jsonQuoteFunc( sqlite3_value **argv ){ JsonString jx; - UNUSED_PARAM(argc); + UNUSED_PARAMETER(argc); jsonInit(&jx, ctx); jsonAppendValue(&jx, argv[0]); @@ -192793,13 +194671,34 @@ static void jsonArrayLengthFunc( sqlite3_result_int64(ctx, n); } +/* +** Bit values for the flags passed into jsonExtractFunc() or +** jsonSetFunc() via the user-data value. +*/ +#define JSON_JSON 0x01 /* Result is always JSON */ +#define JSON_SQL 0x02 /* Result is always SQL */ +#define JSON_ABPATH 0x03 /* Allow abbreviated JSON path specs */ +#define JSON_ISSET 0x04 /* json_set(), not json_insert() */ + /* ** json_extract(JSON, PATH, ...) +** "->"(JSON,PATH) +** "->>"(JSON,PATH) +** +** Return the element described by PATH. Return NULL if that PATH element +** is not found. ** -** Return the element described by PATH. Return NULL if there is no -** PATH element. If there are multiple PATHs, then return a JSON array -** with the result from each path. Throw an error if the JSON or any PATH -** is malformed. +** If JSON_JSON is set or if more that one PATH argument is supplied then +** always return a JSON representation of the result. If JSON_SQL is set, +** then always return an SQL representation of the result. If neither flag +** is present and argc==2, then return JSON for objects and arrays and SQL +** for all other values. +** +** When multiple PATH arguments are supplied, the result is a JSON array +** containing the result of each PATH. +** +** Abbreviated JSON path expressions are allows if JSON_ABPATH, for +** compatibility with PG. */ static void jsonExtractFunc( sqlite3_context *ctx, @@ -192809,35 +194708,77 @@ static void jsonExtractFunc( JsonParse *p; /* The parse */ JsonNode *pNode; const char *zPath; + int flags = SQLITE_PTR_TO_INT(sqlite3_user_data(ctx)); JsonString jx; - int i; if( argc<2 ) return; p = jsonParseCached(ctx, argv, ctx); if( p==0 ) return; - jsonInit(&jx, ctx); - jsonAppendChar(&jx, '['); - for(i=1; inErr ) break; - if( argc>2 ){ + if( argc==2 ){ + /* With a single PATH argument */ + zPath = (const char*)sqlite3_value_text(argv[1]); + if( zPath==0 ) return; + if( flags & JSON_ABPATH ){ + if( zPath[0]!='$' ){ + /* The -> and ->> operators accept abbreviated PATH arguments. This + ** is mostly for compatibility with PostgreSQL, but also for + ** convenience. + ** + ** NUMBER ==> $[NUMBER] // PG compatible + ** LABEL ==> $.LABEL // PG compatible + ** [NUMBER] ==> $[NUMBER] // Not PG. Purely for convenience + */ + jsonInit(&jx, ctx); + if( sqlite3Isdigit(zPath[0]) ){ + jsonAppendRaw(&jx, "$[", 2); + jsonAppendRaw(&jx, zPath, (int)strlen(zPath)); + jsonAppendRaw(&jx, "]", 2); + }else{ + jsonAppendRaw(&jx, "$.", 1 + (zPath[0]!='[')); + jsonAppendRaw(&jx, zPath, (int)strlen(zPath)); + jsonAppendChar(&jx, 0); + } + pNode = jx.bErr ? 0 : jsonLookup(p, jx.zBuf, 0, ctx); + jsonReset(&jx); + }else{ + pNode = jsonLookup(p, zPath, 0, ctx); + } + if( pNode ){ + if( flags & JSON_JSON ){ + jsonReturnJson(pNode, ctx, 0); + }else{ + jsonReturn(pNode, ctx, 0); + sqlite3_result_subtype(ctx, 0); + } + } + }else{ + pNode = jsonLookup(p, zPath, 0, ctx); + if( p->nErr==0 && pNode ) jsonReturn(pNode, ctx, 0); + } + }else{ + /* Two or more PATH arguments results in a JSON array with each + ** element of the array being the value selected by one of the PATHs */ + int i; + jsonInit(&jx, ctx); + jsonAppendChar(&jx, '['); + for(i=1; inErr ) break; jsonAppendSeparator(&jx); if( pNode ){ jsonRenderNode(pNode, &jx, 0); }else{ jsonAppendRaw(&jx, "null", 4); } - }else if( pNode ){ - jsonReturn(pNode, ctx, 0); } + if( i==argc ){ + jsonAppendChar(&jx, ']'); + jsonResult(&jx); + sqlite3_result_subtype(ctx, JSON_SUBTYPE); + } + jsonReset(&jx); } - if( argc>2 && i==argc ){ - jsonAppendChar(&jx, ']'); - jsonResult(&jx); - sqlite3_result_subtype(ctx, JSON_SUBTYPE); - } - jsonReset(&jx); } /* This is the RFC 7396 MergePatch algorithm. @@ -192933,7 +194874,7 @@ static void jsonPatchFunc( JsonParse y; /* The patch */ JsonNode *pResult; /* The result of the merge */ - UNUSED_PARAM(argc); + UNUSED_PARAMETER(argc); if( jsonParse(&x, ctx, (const char*)sqlite3_value_text(argv[0])) ) return; if( jsonParse(&y, ctx, (const char*)sqlite3_value_text(argv[1])) ){ jsonParseReset(&x); @@ -193054,7 +194995,7 @@ static void jsonReplaceFunc( if( x.nErr ) goto replace_err; if( pNode ){ assert( pNode->eU==0 || pNode->eU==1 || pNode->eU==4 ); - json_testcase( pNode->eU!=0 && pNode->eU!=1 ); + testcase( pNode->eU!=0 && pNode->eU!=1 ); pNode->jnFlags |= (u8)JNODE_REPLACE; VVA( pNode->eU = 4 ); pNode->u.iReplace = i + 1; @@ -193070,6 +195011,7 @@ static void jsonReplaceFunc( jsonParseReset(&x); } + /* ** json_set(JSON, PATH, VALUE, ...) ** @@ -193092,7 +195034,7 @@ static void jsonSetFunc( const char *zPath; u32 i; int bApnd; - int bIsSet = *(int*)sqlite3_user_data(ctx); + int bIsSet = sqlite3_user_data(ctx)!=0; if( argc<1 ) return; if( (argc&1)==0 ) { @@ -193111,8 +195053,8 @@ static void jsonSetFunc( }else if( x.nErr ){ goto jsonSetDone; }else if( pNode && (bApnd || bIsSet) ){ - json_testcase( pNode->eU!=0 && pNode->eU!=1 && pNode->eU!=4 ); - assert( pNode->eU!=3 || pNode->eU!=5 ); + testcase( pNode->eU!=0 && pNode->eU!=1 ); + assert( pNode->eU!=3 && pNode->eU!=5 ); VVA( pNode->eU = 4 ); pNode->jnFlags |= (u8)JNODE_REPLACE; pNode->u.iReplace = i + 1; @@ -193132,8 +195074,8 @@ static void jsonSetFunc( ** json_type(JSON) ** json_type(JSON, PATH) ** -** Return the top-level "type" of a JSON string. Throw an error if -** either the JSON or PATH inputs are not well-formed. +** Return the top-level "type" of a JSON string. json_type() raises an +** error if either the JSON or PATH inputs are not well-formed. */ static void jsonTypeFunc( sqlite3_context *ctx, @@ -193169,7 +195111,7 @@ static void jsonValidFunc( sqlite3_value **argv ){ JsonParse *p; /* The parse */ - UNUSED_PARAM(argc); + UNUSED_PARAMETER(argc); p = jsonParseCached(ctx, argv, 0); sqlite3_result_int(ctx, p!=0); } @@ -193189,7 +195131,7 @@ static void jsonArrayStep( sqlite3_value **argv ){ JsonString *pStr; - UNUSED_PARAM(argc); + UNUSED_PARAMETER(argc); pStr = (JsonString*)sqlite3_aggregate_context(ctx, sizeof(*pStr)); if( pStr ){ if( pStr->zBuf==0 ){ @@ -193249,8 +195191,8 @@ static void jsonGroupInverse( char *z; char c; JsonString *pStr; - UNUSED_PARAM(argc); - UNUSED_PARAM(argv); + UNUSED_PARAMETER(argc); + UNUSED_PARAMETER(argv); pStr = (JsonString*)sqlite3_aggregate_context(ctx, 0); #ifdef NEVER /* pStr is always non-NULL since jsonArrayStep() or jsonObjectStep() will @@ -193294,7 +195236,7 @@ static void jsonObjectStep( JsonString *pStr; const char *z; u32 n; - UNUSED_PARAM(argc); + UNUSED_PARAMETER(argc); pStr = (JsonString*)sqlite3_aggregate_context(ctx, sizeof(*pStr)); if( pStr ){ if( pStr->zBuf==0 ){ @@ -193385,10 +195327,10 @@ static int jsonEachConnect( #define JEACH_JSON 8 #define JEACH_ROOT 9 - UNUSED_PARAM(pzErr); - UNUSED_PARAM(argv); - UNUSED_PARAM(argc); - UNUSED_PARAM(pAux); + UNUSED_PARAMETER(pzErr); + UNUSED_PARAMETER(argv); + UNUSED_PARAMETER(argc); + UNUSED_PARAMETER(pAux); rc = sqlite3_declare_vtab(db, "CREATE TABLE x(key,value,type,atom,id,parent,fullkey,path," "json HIDDEN,root HIDDEN)"); @@ -193411,7 +195353,7 @@ static int jsonEachDisconnect(sqlite3_vtab *pVtab){ static int jsonEachOpenEach(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){ JsonEachCursor *pCur; - UNUSED_PARAM(p); + UNUSED_PARAMETER(p); pCur = sqlite3_malloc( sizeof(*pCur) ); if( pCur==0 ) return SQLITE_NOMEM; memset(pCur, 0, sizeof(*pCur)); @@ -193471,7 +195413,7 @@ static int jsonEachNext(sqlite3_vtab_cursor *cur){ p->eType = pUp->eType; if( pUp->eType==JSON_ARRAY ){ assert( pUp->eU==0 || pUp->eU==3 ); - json_testcase( pUp->eU==3 ); + testcase( pUp->eU==3 ); VVA( pUp->eU = 3 ); if( iUp==p->i-1 ){ pUp->u.iKey = 0; @@ -193658,7 +195600,7 @@ static int jsonEachBestIndex( /* This implementation assumes that JSON and ROOT are the last two ** columns in the table */ assert( JEACH_ROOT == JEACH_JSON+1 ); - UNUSED_PARAM(tab); + UNUSED_PARAMETER(tab); aIdx[0] = aIdx[1] = -1; pConstraint = pIdxInfo->aConstraint; for(i=0; inConstraint; i++, pConstraint++){ @@ -193714,8 +195656,8 @@ static int jsonEachFilter( const char *zRoot = 0; sqlite3_int64 n; - UNUSED_PARAM(idxStr); - UNUSED_PARAM(argc); + UNUSED_PARAMETER(idxStr); + UNUSED_PARAMETER(argc); jsonEachCursorReset(p); if( idxNum==0 ) return SQLITE_OK; z = (const char*)sqlite3_value_text(argv[0]); @@ -193840,108 +195782,68 @@ static sqlite3_module jsonTreeModule = { 0 /* xShadowName */ }; #endif /* SQLITE_OMIT_VIRTUALTABLE */ - -/**************************************************************************** -** The following routines are the only publically visible identifiers in this -** file. Call the following routines in order to register the various SQL -** functions and the virtual table implemented by this file. -****************************************************************************/ - -SQLITE_PRIVATE int sqlite3Json1Init(sqlite3 *db){ - int rc = SQLITE_OK; - unsigned int i; - static const struct { - const char *zName; - int nArg; - int flag; - void (*xFunc)(sqlite3_context*,int,sqlite3_value**); - } aFunc[] = { - { "json", 1, 0, jsonRemoveFunc }, - { "json_array", -1, 0, jsonArrayFunc }, - { "json_array_length", 1, 0, jsonArrayLengthFunc }, - { "json_array_length", 2, 0, jsonArrayLengthFunc }, - { "json_extract", -1, 0, jsonExtractFunc }, - { "json_insert", -1, 0, jsonSetFunc }, - { "json_object", -1, 0, jsonObjectFunc }, - { "json_patch", 2, 0, jsonPatchFunc }, - { "json_quote", 1, 0, jsonQuoteFunc }, - { "json_remove", -1, 0, jsonRemoveFunc }, - { "json_replace", -1, 0, jsonReplaceFunc }, - { "json_set", -1, 1, jsonSetFunc }, - { "json_type", 1, 0, jsonTypeFunc }, - { "json_type", 2, 0, jsonTypeFunc }, - { "json_valid", 1, 0, jsonValidFunc }, - +#endif /* !defined(SQLITE_OMIT_JSON) */ + +/* +** Register JSON functions. +*/ +SQLITE_PRIVATE void sqlite3RegisterJsonFunctions(void){ +#ifndef SQLITE_OMIT_JSON + static FuncDef aJsonFunc[] = { + JFUNCTION(json, 1, 0, jsonRemoveFunc), + JFUNCTION(json_array, -1, 0, jsonArrayFunc), + JFUNCTION(json_array_length, 1, 0, jsonArrayLengthFunc), + JFUNCTION(json_array_length, 2, 0, jsonArrayLengthFunc), + JFUNCTION(json_extract, -1, 0, jsonExtractFunc), + JFUNCTION(->, 2, JSON_JSON, jsonExtractFunc), + JFUNCTION(->>, 2, JSON_SQL, jsonExtractFunc), + JFUNCTION(json_insert, -1, 0, jsonSetFunc), + JFUNCTION(json_object, -1, 0, jsonObjectFunc), + JFUNCTION(json_patch, 2, 0, jsonPatchFunc), + JFUNCTION(json_quote, 1, 0, jsonQuoteFunc), + JFUNCTION(json_remove, -1, 0, jsonRemoveFunc), + JFUNCTION(json_replace, -1, 0, jsonReplaceFunc), + JFUNCTION(json_set, -1, JSON_ISSET, jsonSetFunc), + JFUNCTION(json_type, 1, 0, jsonTypeFunc), + JFUNCTION(json_type, 2, 0, jsonTypeFunc), + JFUNCTION(json_valid, 1, 0, jsonValidFunc), #if SQLITE_DEBUG - /* DEBUG and TESTING functions */ - { "json_parse", 1, 0, jsonParseFunc }, - { "json_test1", 1, 0, jsonTest1Func }, -#endif - }; - static const struct { - const char *zName; - int nArg; - void (*xStep)(sqlite3_context*,int,sqlite3_value**); - void (*xFinal)(sqlite3_context*); - void (*xValue)(sqlite3_context*); - } aAgg[] = { - { "json_group_array", 1, - jsonArrayStep, jsonArrayFinal, jsonArrayValue }, - { "json_group_object", 2, - jsonObjectStep, jsonObjectFinal, jsonObjectValue }, + JFUNCTION(json_parse, 1, 0, jsonParseFunc), + JFUNCTION(json_test1, 1, 0, jsonTest1Func), +#endif + WAGGREGATE(json_group_array, 1, 0, 0, + jsonArrayStep, jsonArrayFinal, jsonArrayValue, jsonGroupInverse, + SQLITE_SUBTYPE|SQLITE_UTF8|SQLITE_DETERMINISTIC|SQLITE_INNOCUOUS), + WAGGREGATE(json_group_object, 2, 0, 0, + jsonObjectStep, jsonObjectFinal, jsonObjectValue, jsonGroupInverse, + SQLITE_SUBTYPE|SQLITE_UTF8|SQLITE_DETERMINISTIC|SQLITE_INNOCUOUS) }; -#ifndef SQLITE_OMIT_VIRTUALTABLE + sqlite3InsertBuiltinFuncs(aJsonFunc, ArraySize(aJsonFunc)); +#endif +} + +#if !defined(SQLITE_OMIT_VIRTUALTABLE) && !defined(SQLITE_OMIT_JSON) +/* +** Register the JSON table-valued functions +*/ +SQLITE_PRIVATE int sqlite3JsonTableFunctions(sqlite3 *db){ + int rc = SQLITE_OK; static const struct { - const char *zName; - sqlite3_module *pModule; + const char *zName; + sqlite3_module *pModule; } aMod[] = { { "json_each", &jsonEachModule }, { "json_tree", &jsonTreeModule }, }; -#endif - static const int enc = - SQLITE_UTF8 | - SQLITE_DETERMINISTIC | - SQLITE_INNOCUOUS; - for(i=0; iz[0]) ) p->z++; + while( fast_isspace(p->z[0]) ) p->z++; return p->z[0]; } @@ -203345,7 +205244,7 @@ static char *rbuVacuumTableStart( ** the caller has to use an OFFSET clause to extract only the required ** rows from the sourct table, just as it does for an RBU update operation. */ -char *rbuVacuumIndexStart( +static char *rbuVacuumIndexStart( sqlite3rbu *p, /* RBU handle */ RbuObjIter *pIter /* RBU iterator object */ ){ @@ -208190,6 +210089,7 @@ static int dbpageBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo){ ){ pIdxInfo->orderByConsumed = 1; } + sqlite3VtabWriteAll(pIdxInfo); return SQLITE_OK; } @@ -228485,7 +230385,7 @@ static int sqlite3Fts5IndexQuery( if( sqlite3Fts5BufferSize(&p->rc, &buf, nToken+1)==0 ){ int iIdx = 0; /* Index to search */ int iPrefixIdx = 0; /* +1 prefix index */ - if( nToken ) memcpy(&buf.p[1], pToken, nToken); + if( nToken>0 ) memcpy(&buf.p[1], pToken, nToken); /* Figure out which index to search and set iIdx accordingly. If this ** is a prefix query for which there is no prefix index, set iIdx to @@ -230544,7 +232444,7 @@ static int fts5SorterNext(Fts5Cursor *pCsr){ rc = sqlite3_step(pSorter->pStmt); if( rc==SQLITE_DONE ){ rc = SQLITE_OK; - CsrFlagSet(pCsr, FTS5CSR_EOF); + CsrFlagSet(pCsr, FTS5CSR_EOF|FTS5CSR_REQUIRE_CONTENT); }else if( rc==SQLITE_ROW ){ const u8 *a; const u8 *aBlob; @@ -232533,7 +234433,7 @@ static void fts5SourceIdFunc( ){ assert( nArg==0 ); UNUSED_PARAM2(nArg, apUnused); - sqlite3_result_text(pCtx, "fts5: 2022-01-06 13:25:41 872ba256cbf61d9290b571c0e6d82a20c224ca3ad82971edc46b29818d5d17a0", -1, SQLITE_TRANSIENT); + sqlite3_result_text(pCtx, "fts5: 2022-03-26 13:51:10 d33c709cc0af66bc5b6dc6216eba9f1f0b40960b9ae83694c986fbf4c1d6f08f", -1, SQLITE_TRANSIENT); } /* diff --git a/vendor/sqlite/sqlite3.h b/vendor/sqlite/sqlite3.h index 33c2c48caf..33dbec2c09 100644 --- a/vendor/sqlite/sqlite3.h +++ b/vendor/sqlite/sqlite3.h @@ -146,9 +146,9 @@ extern "C" { ** [sqlite3_libversion_number()], [sqlite3_sourceid()], ** [sqlite_version()] and [sqlite_source_id()]. */ -#define SQLITE_VERSION "3.37.2" -#define SQLITE_VERSION_NUMBER 3037002 -#define SQLITE_SOURCE_ID "2022-01-06 13:25:41 872ba256cbf61d9290b571c0e6d82a20c224ca3ad82971edc46b29818d5d17a0" +#define SQLITE_VERSION "3.38.2" +#define SQLITE_VERSION_NUMBER 3038002 +#define SQLITE_SOURCE_ID "2022-03-26 13:51:10 d33c709cc0af66bc5b6dc6216eba9f1f0b40960b9ae83694c986fbf4c1d6f08f" /* ** CAPI3REF: Run-Time Library Version Numbers @@ -566,7 +566,7 @@ SQLITE_API int sqlite3_exec( #define SQLITE_WARNING_AUTOINDEX (SQLITE_WARNING | (1<<8)) #define SQLITE_AUTH_USER (SQLITE_AUTH | (1<<8)) #define SQLITE_OK_LOAD_PERMANENTLY (SQLITE_OK | (1<<8)) -#define SQLITE_OK_SYMLINK (SQLITE_OK | (2<<8)) +#define SQLITE_OK_SYMLINK (SQLITE_OK | (2<<8)) /* internal use only */ /* ** CAPI3REF: Flags For File Open Operations @@ -3824,13 +3824,14 @@ SQLITE_API void sqlite3_free_filename(char*); ** sqlite3_extended_errcode() might change with each API call. ** Except, there are some interfaces that are guaranteed to never ** change the value of the error code. The error-code preserving -** interfaces are: +** interfaces include the following: ** **
      **
    • sqlite3_errcode() **
    • sqlite3_extended_errcode() **
    • sqlite3_errmsg() **
    • sqlite3_errmsg16() +**
    • sqlite3_error_offset() **
    ** ** ^The sqlite3_errmsg() and sqlite3_errmsg16() return English-language @@ -3845,6 +3846,13 @@ SQLITE_API void sqlite3_free_filename(char*); ** ^(Memory to hold the error message string is managed internally ** and must not be freed by the application)^. ** +** ^If the most recent error references a specific token in the input +** SQL, the sqlite3_error_offset() interface returns the byte offset +** of the start of that token. ^The byte offset returned by +** sqlite3_error_offset() assumes that the input SQL is UTF8. +** ^If the most recent error does not reference a specific token in the input +** SQL, then the sqlite3_error_offset() function returns -1. +** ** When the serialized [threading mode] is in use, it might be the ** case that a second error occurs on a separate thread in between ** the time of the first error and the call to these interfaces. @@ -3864,6 +3872,7 @@ SQLITE_API int sqlite3_extended_errcode(sqlite3 *db); SQLITE_API const char *sqlite3_errmsg(sqlite3*); SQLITE_API const void *sqlite3_errmsg16(sqlite3*); SQLITE_API const char *sqlite3_errstr(int); +SQLITE_API int sqlite3_error_offset(sqlite3 *db); /* ** CAPI3REF: Prepared Statement Object @@ -4275,6 +4284,10 @@ SQLITE_API const char *sqlite3_normalized_sql(sqlite3_stmt *pStmt); ** be false. ^Similarly, a CREATE TABLE IF NOT EXISTS statement is a ** read-only no-op if the table already exists, but ** sqlite3_stmt_readonly() still returns false for such a statement. +** +** ^If prepared statement X is an [EXPLAIN] or [EXPLAIN QUERY PLAN] +** statement, then sqlite3_stmt_readonly(X) returns the same value as +** if the EXPLAIN or EXPLAIN QUERY PLAN prefix were omitted. */ SQLITE_API int sqlite3_stmt_readonly(sqlite3_stmt *pStmt); @@ -4343,6 +4356,8 @@ SQLITE_API int sqlite3_stmt_busy(sqlite3_stmt*); ** ** ^The sqlite3_value objects that are passed as parameters into the ** implementation of [application-defined SQL functions] are protected. +** ^The sqlite3_value objects returned by [sqlite3_vtab_rhs_value()] +** are protected. ** ^The sqlite3_value object returned by ** [sqlite3_column_value()] is unprotected. ** Unprotected sqlite3_value objects may only be used as arguments @@ -4964,6 +4979,10 @@ SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt); ** even empty strings, are always zero-terminated. ^The return ** value from sqlite3_column_blob() for a zero-length BLOB is a NULL pointer. ** +** ^Strings returned by sqlite3_column_text16() always have the endianness +** which is native to the platform, regardless of the text encoding set +** for the database. +** ** Warning: ^The object returned by [sqlite3_column_value()] is an ** [unprotected sqlite3_value] object. In a multithreaded environment, ** an unprotected sqlite3_value object may only be used safely with @@ -4977,7 +4996,7 @@ SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt); ** [application-defined SQL functions] or [virtual tables], not within ** top-level application code. ** -** The these routines may attempt to convert the datatype of the result. +** These routines may attempt to convert the datatype of the result. ** ^For example, if the internal representation is FLOAT and a text result ** is requested, [sqlite3_snprintf()] is used internally to perform the ** conversion automatically. ^(The following table details the conversions @@ -5002,7 +5021,7 @@ SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt); ** TEXT BLOB No change ** BLOB INTEGER [CAST] to INTEGER ** BLOB FLOAT [CAST] to REAL -** BLOB TEXT Add a zero terminator if needed +** BLOB TEXT [CAST] to TEXT, ensure zero terminator ** ** )^ ** @@ -7122,24 +7141,56 @@ struct sqlite3_index_info { ** ** These macros define the allowed values for the ** [sqlite3_index_info].aConstraint[].op field. Each value represents -** an operator that is part of a constraint term in the wHERE clause of +** an operator that is part of a constraint term in the WHERE clause of ** a query that uses a [virtual table]. -*/ -#define SQLITE_INDEX_CONSTRAINT_EQ 2 -#define SQLITE_INDEX_CONSTRAINT_GT 4 -#define SQLITE_INDEX_CONSTRAINT_LE 8 -#define SQLITE_INDEX_CONSTRAINT_LT 16 -#define SQLITE_INDEX_CONSTRAINT_GE 32 -#define SQLITE_INDEX_CONSTRAINT_MATCH 64 -#define SQLITE_INDEX_CONSTRAINT_LIKE 65 -#define SQLITE_INDEX_CONSTRAINT_GLOB 66 -#define SQLITE_INDEX_CONSTRAINT_REGEXP 67 -#define SQLITE_INDEX_CONSTRAINT_NE 68 -#define SQLITE_INDEX_CONSTRAINT_ISNOT 69 -#define SQLITE_INDEX_CONSTRAINT_ISNOTNULL 70 -#define SQLITE_INDEX_CONSTRAINT_ISNULL 71 -#define SQLITE_INDEX_CONSTRAINT_IS 72 -#define SQLITE_INDEX_CONSTRAINT_FUNCTION 150 +** +** ^The left-hand operand of the operator is given by the corresponding +** aConstraint[].iColumn field. ^An iColumn of -1 indicates the left-hand +** operand is the rowid. +** The SQLITE_INDEX_CONSTRAINT_LIMIT and SQLITE_INDEX_CONSTRAINT_OFFSET +** operators have no left-hand operand, and so for those operators the +** corresponding aConstraint[].iColumn is meaningless and should not be +** used. +** +** All operator values from SQLITE_INDEX_CONSTRAINT_FUNCTION through +** value 255 are reserved to represent functions that are overloaded +** by the [xFindFunction|xFindFunction method] of the virtual table +** implementation. +** +** The right-hand operands for each constraint might be accessible using +** the [sqlite3_vtab_rhs_value()] interface. Usually the right-hand +** operand is only available if it appears as a single constant literal +** in the input SQL. If the right-hand operand is another column or an +** expression (even a constant expression) or a parameter, then the +** sqlite3_vtab_rhs_value() probably will not be able to extract it. +** ^The SQLITE_INDEX_CONSTRAINT_ISNULL and +** SQLITE_INDEX_CONSTRAINT_ISNOTNULL operators have no right-hand operand +** and hence calls to sqlite3_vtab_rhs_value() for those operators will +** always return SQLITE_NOTFOUND. +** +** The collating sequence to be used for comparison can be found using +** the [sqlite3_vtab_collation()] interface. For most real-world virtual +** tables, the collating sequence of constraints does not matter (for example +** because the constraints are numeric) and so the sqlite3_vtab_collation() +** interface is no commonly needed. +*/ +#define SQLITE_INDEX_CONSTRAINT_EQ 2 +#define SQLITE_INDEX_CONSTRAINT_GT 4 +#define SQLITE_INDEX_CONSTRAINT_LE 8 +#define SQLITE_INDEX_CONSTRAINT_LT 16 +#define SQLITE_INDEX_CONSTRAINT_GE 32 +#define SQLITE_INDEX_CONSTRAINT_MATCH 64 +#define SQLITE_INDEX_CONSTRAINT_LIKE 65 +#define SQLITE_INDEX_CONSTRAINT_GLOB 66 +#define SQLITE_INDEX_CONSTRAINT_REGEXP 67 +#define SQLITE_INDEX_CONSTRAINT_NE 68 +#define SQLITE_INDEX_CONSTRAINT_ISNOT 69 +#define SQLITE_INDEX_CONSTRAINT_ISNOTNULL 70 +#define SQLITE_INDEX_CONSTRAINT_ISNULL 71 +#define SQLITE_INDEX_CONSTRAINT_IS 72 +#define SQLITE_INDEX_CONSTRAINT_LIMIT 73 +#define SQLITE_INDEX_CONSTRAINT_OFFSET 74 +#define SQLITE_INDEX_CONSTRAINT_FUNCTION 150 /* ** CAPI3REF: Register A Virtual Table Implementation @@ -7168,7 +7219,7 @@ struct sqlite3_index_info { ** destructor. ** ** ^If the third parameter (the pointer to the sqlite3_module object) is -** NULL then no new module is create and any existing modules with the +** NULL then no new module is created and any existing modules with the ** same name are dropped. ** ** See also: [sqlite3_drop_modules()] @@ -7944,7 +7995,8 @@ SQLITE_API int sqlite3_test_control(int op, ...); #define SQLITE_TESTCTRL_SEEK_COUNT 30 #define SQLITE_TESTCTRL_TRACEFLAGS 31 #define SQLITE_TESTCTRL_TUNE 32 -#define SQLITE_TESTCTRL_LAST 32 /* Largest TESTCTRL */ +#define SQLITE_TESTCTRL_LOGEST 33 +#define SQLITE_TESTCTRL_LAST 33 /* Largest TESTCTRL */ /* ** CAPI3REF: SQL Keyword Checking @@ -8467,6 +8519,16 @@ SQLITE_API int sqlite3_stmt_status(sqlite3_stmt*, int op,int resetFlg); ** The counter is incremented on the first [sqlite3_step()] call of each ** cycle. ** +** [[SQLITE_STMTSTATUS_FILTER_MISS]] +** [[SQLITE_STMTSTATUS_FILTER HIT]] +**
    SQLITE_STMTSTATUS_FILTER_HIT
    +** SQLITE_STMTSTATUS_FILTER_MISS
    +**
    ^SQLITE_STMTSTATUS_FILTER_HIT is the number of times that a join +** step was bypassed because a Bloom filter returned not-found. The +** corresponding SQLITE_STMTSTATUS_FILTER_MISS value is the number of +** times that the Bloom filter returned a find, and thus the join step +** had to be processed as normal. +** ** [[SQLITE_STMTSTATUS_MEMUSED]]
    SQLITE_STMTSTATUS_MEMUSED
    **
    ^This is the approximate number of bytes of heap memory ** used to store the prepared statement. ^This value is not actually @@ -8481,6 +8543,8 @@ SQLITE_API int sqlite3_stmt_status(sqlite3_stmt*, int op,int resetFlg); #define SQLITE_STMTSTATUS_VM_STEP 4 #define SQLITE_STMTSTATUS_REPREPARE 5 #define SQLITE_STMTSTATUS_RUN 6 +#define SQLITE_STMTSTATUS_FILTER_MISS 7 +#define SQLITE_STMTSTATUS_FILTER_HIT 8 #define SQLITE_STMTSTATUS_MEMUSED 99 /* @@ -9449,19 +9513,269 @@ SQLITE_API int sqlite3_vtab_nochange(sqlite3_context*); /* ** CAPI3REF: Determine The Collation For a Virtual Table Constraint +** METHOD: sqlite3_index_info ** ** This function may only be called from within a call to the [xBestIndex] -** method of a [virtual table]. +** method of a [virtual table]. This function returns a pointer to a string +** that is the name of the appropriate collation sequence to use for text +** comparisons on the constraint identified by its arguments. +** +** The first argument must be the pointer to the [sqlite3_index_info] object +** that is the first parameter to the xBestIndex() method. The second argument +** must be an index into the aConstraint[] array belonging to the +** sqlite3_index_info structure passed to xBestIndex. +** +** Important: +** The first parameter must be the same pointer that is passed into the +** xBestMethod() method. The first parameter may not be a pointer to a +** different [sqlite3_index_info] object, even an exact copy. +** +** The return value is computed as follows: ** -** The first argument must be the sqlite3_index_info object that is the -** first parameter to the xBestIndex() method. The second argument must be -** an index into the aConstraint[] array belonging to the sqlite3_index_info -** structure passed to xBestIndex. This function returns a pointer to a buffer -** containing the name of the collation sequence for the corresponding -** constraint. +**
      +**
    1. If the constraint comes from a WHERE clause expression that contains +** a [COLLATE operator], then the name of the collation specified by +** that COLLATE operator is returned. +**

    2. If there is no COLLATE operator, but the column that is the subject +** of the constraint specifies an alternative collating sequence via +** a [COLLATE clause] on the column definition within the CREATE TABLE +** statement that was passed into [sqlite3_declare_vtab()], then the +** name of that alternative collating sequence is returned. +**

    3. Otherwise, "BINARY" is returned. +**

    */ SQLITE_API SQLITE_EXPERIMENTAL const char *sqlite3_vtab_collation(sqlite3_index_info*,int); +/* +** CAPI3REF: Determine if a virtual table query is DISTINCT +** METHOD: sqlite3_index_info +** +** This API may only be used from within an [xBestIndex|xBestIndex method] +** of a [virtual table] implementation. The result of calling this +** interface from outside of xBestIndex() is undefined and probably harmful. +** +** ^The sqlite3_vtab_distinct() interface returns an integer that is +** either 0, 1, or 2. The integer returned by sqlite3_vtab_distinct() +** gives the virtual table additional information about how the query +** planner wants the output to be ordered. As long as the virtual table +** can meet the ordering requirements of the query planner, it may set +** the "orderByConsumed" flag. +** +**
    1. +** ^If the sqlite3_vtab_distinct() interface returns 0, that means +** that the query planner needs the virtual table to return all rows in the +** sort order defined by the "nOrderBy" and "aOrderBy" fields of the +** [sqlite3_index_info] object. This is the default expectation. If the +** virtual table outputs all rows in sorted order, then it is always safe for +** the xBestIndex method to set the "orderByConsumed" flag, regardless of +** the return value from sqlite3_vtab_distinct(). +**

    2. +** ^(If the sqlite3_vtab_distinct() interface returns 1, that means +** that the query planner does not need the rows to be returned in sorted order +** as long as all rows with the same values in all columns identified by the +** "aOrderBy" field are adjacent.)^ This mode is used when the query planner +** is doing a GROUP BY. +**

    3. +** ^(If the sqlite3_vtab_distinct() interface returns 2, that means +** that the query planner does not need the rows returned in any particular +** order, as long as rows with the same values in all "aOrderBy" columns +** are adjacent.)^ ^(Furthermore, only a single row for each particular +** combination of values in the columns identified by the "aOrderBy" field +** needs to be returned.)^ ^It is always ok for two or more rows with the same +** values in all "aOrderBy" columns to be returned, as long as all such rows +** are adjacent. ^The virtual table may, if it chooses, omit extra rows +** that have the same value for all columns identified by "aOrderBy". +** ^However omitting the extra rows is optional. +** This mode is used for a DISTINCT query. +**

    +** +** ^For the purposes of comparing virtual table output values to see if the +** values are same value for sorting purposes, two NULL values are considered +** to be the same. In other words, the comparison operator is "IS" +** (or "IS NOT DISTINCT FROM") and not "==". +** +** If a virtual table implementation is unable to meet the requirements +** specified above, then it must not set the "orderByConsumed" flag in the +** [sqlite3_index_info] object or an incorrect answer may result. +** +** ^A virtual table implementation is always free to return rows in any order +** it wants, as long as the "orderByConsumed" flag is not set. ^When the +** the "orderByConsumed" flag is unset, the query planner will add extra +** [bytecode] to ensure that the final results returned by the SQL query are +** ordered correctly. The use of the "orderByConsumed" flag and the +** sqlite3_vtab_distinct() interface is merely an optimization. ^Careful +** use of the sqlite3_vtab_distinct() interface and the "orderByConsumed" +** flag might help queries against a virtual table to run faster. Being +** overly aggressive and setting the "orderByConsumed" flag when it is not +** valid to do so, on the other hand, might cause SQLite to return incorrect +** results. +*/ +SQLITE_API int sqlite3_vtab_distinct(sqlite3_index_info*); + +/* +** CAPI3REF: Identify and handle IN constraints in xBestIndex +** +** This interface may only be used from within an +** [xBestIndex|xBestIndex() method] of a [virtual table] implementation. +** The result of invoking this interface from any other context is +** undefined and probably harmful. +** +** ^(A constraint on a virtual table of the form +** "[IN operator|column IN (...)]" is +** communicated to the xBestIndex method as a +** [SQLITE_INDEX_CONSTRAINT_EQ] constraint.)^ If xBestIndex wants to use +** this constraint, it must set the corresponding +** aConstraintUsage[].argvIndex to a postive integer. ^(Then, under +** the usual mode of handling IN operators, SQLite generates [bytecode] +** that invokes the [xFilter|xFilter() method] once for each value +** on the right-hand side of the IN operator.)^ Thus the virtual table +** only sees a single value from the right-hand side of the IN operator +** at a time. +** +** In some cases, however, it would be advantageous for the virtual +** table to see all values on the right-hand of the IN operator all at +** once. The sqlite3_vtab_in() interfaces facilitates this in two ways: +** +**
      +**
    1. +** ^A call to sqlite3_vtab_in(P,N,-1) will return true (non-zero) +** if and only if the [sqlite3_index_info|P->aConstraint][N] constraint +** is an [IN operator] that can be processed all at once. ^In other words, +** sqlite3_vtab_in() with -1 in the third argument is a mechanism +** by which the virtual table can ask SQLite if all-at-once processing +** of the IN operator is even possible. +** +**

    2. +** ^A call to sqlite3_vtab_in(P,N,F) with F==1 or F==0 indicates +** to SQLite that the virtual table does or does not want to process +** the IN operator all-at-once, respectively. ^Thus when the third +** parameter (F) is non-negative, this interface is the mechanism by +** which the virtual table tells SQLite how it wants to process the +** IN operator. +**

    +** +** ^The sqlite3_vtab_in(P,N,F) interface can be invoked multiple times +** within the same xBestIndex method call. ^For any given P,N pair, +** the return value from sqlite3_vtab_in(P,N,F) will always be the same +** within the same xBestIndex call. ^If the interface returns true +** (non-zero), that means that the constraint is an IN operator +** that can be processed all-at-once. ^If the constraint is not an IN +** operator or cannot be processed all-at-once, then the interface returns +** false. +** +** ^(All-at-once processing of the IN operator is selected if both of the +** following conditions are met: +** +**
      +**
    1. The P->aConstraintUsage[N].argvIndex value is set to a positive +** integer. This is how the virtual table tells SQLite that it wants to +** use the N-th constraint. +** +**

    2. The last call to sqlite3_vtab_in(P,N,F) for which F was +** non-negative had F>=1. +**

    )^ +** +** ^If either or both of the conditions above are false, then SQLite uses +** the traditional one-at-a-time processing strategy for the IN constraint. +** ^If both conditions are true, then the argvIndex-th parameter to the +** xFilter method will be an [sqlite3_value] that appears to be NULL, +** but which can be passed to [sqlite3_vtab_in_first()] and +** [sqlite3_vtab_in_next()] to find all values on the right-hand side +** of the IN constraint. +*/ +SQLITE_API int sqlite3_vtab_in(sqlite3_index_info*, int iCons, int bHandle); + +/* +** CAPI3REF: Find all elements on the right-hand side of an IN constraint. +** +** These interfaces are only useful from within the +** [xFilter|xFilter() method] of a [virtual table] implementation. +** The result of invoking these interfaces from any other context +** is undefined and probably harmful. +** +** The X parameter in a call to sqlite3_vtab_in_first(X,P) or +** sqlite3_vtab_in_next(X,P) must be one of the parameters to the +** xFilter method which invokes these routines, and specifically +** a parameter that was previously selected for all-at-once IN constraint +** processing use the [sqlite3_vtab_in()] interface in the +** [xBestIndex|xBestIndex method]. ^(If the X parameter is not +** an xFilter argument that was selected for all-at-once IN constraint +** processing, then these routines return [SQLITE_MISUSE])^ or perhaps +** exhibit some other undefined or harmful behavior. +** +** ^(Use these routines to access all values on the right-hand side +** of the IN constraint using code like the following: +** +**
    +**    for(rc=sqlite3_vtab_in_first(pList, &pVal);
    +**        rc==SQLITE_OK && pVal
    +**        rc=sqlite3_vtab_in_next(pList, &pVal)
    +**    ){
    +**      // do something with pVal
    +**    }
    +**    if( rc!=SQLITE_OK ){
    +**      // an error has occurred
    +**    }
    +** 
    )^ +** +** ^On success, the sqlite3_vtab_in_first(X,P) and sqlite3_vtab_in_next(X,P) +** routines return SQLITE_OK and set *P to point to the first or next value +** on the RHS of the IN constraint. ^If there are no more values on the +** right hand side of the IN constraint, then *P is set to NULL and these +** routines return [SQLITE_DONE]. ^The return value might be +** some other value, such as SQLITE_NOMEM, in the event of a malfunction. +** +** The *ppOut values returned by these routines are only valid until the +** next call to either of these routines or until the end of the xFilter +** method from which these routines were called. If the virtual table +** implementation needs to retain the *ppOut values for longer, it must make +** copies. The *ppOut values are [protected sqlite3_value|protected]. +*/ +SQLITE_API int sqlite3_vtab_in_first(sqlite3_value *pVal, sqlite3_value **ppOut); +SQLITE_API int sqlite3_vtab_in_next(sqlite3_value *pVal, sqlite3_value **ppOut); + +/* +** CAPI3REF: Constraint values in xBestIndex() +** METHOD: sqlite3_index_info +** +** This API may only be used from within the [xBestIndex|xBestIndex method] +** of a [virtual table] implementation. The result of calling this interface +** from outside of an xBestIndex method are undefined and probably harmful. +** +** ^When the sqlite3_vtab_rhs_value(P,J,V) interface is invoked from within +** the [xBestIndex] method of a [virtual table] implementation, with P being +** a copy of the [sqlite3_index_info] object pointer passed into xBestIndex and +** J being a 0-based index into P->aConstraint[], then this routine +** attempts to set *V to the value of the right-hand operand of +** that constraint if the right-hand operand is known. ^If the +** right-hand operand is not known, then *V is set to a NULL pointer. +** ^The sqlite3_vtab_rhs_value(P,J,V) interface returns SQLITE_OK if +** and only if *V is set to a value. ^The sqlite3_vtab_rhs_value(P,J,V) +** inteface returns SQLITE_NOTFOUND if the right-hand side of the J-th +** constraint is not available. ^The sqlite3_vtab_rhs_value() interface +** can return an result code other than SQLITE_OK or SQLITE_NOTFOUND if +** something goes wrong. +** +** The sqlite3_vtab_rhs_value() interface is usually only successful if +** the right-hand operand of a constraint is a literal value in the original +** SQL statement. If the right-hand operand is an expression or a reference +** to some other column or a [host parameter], then sqlite3_vtab_rhs_value() +** will probably return [SQLITE_NOTFOUND]. +** +** ^(Some constraints, such as [SQLITE_INDEX_CONSTRAINT_ISNULL] and +** [SQLITE_INDEX_CONSTRAINT_ISNOTNULL], have no right-hand operand. For such +** constraints, sqlite3_vtab_rhs_value() always returns SQLITE_NOTFOUND.)^ +** +** ^The [sqlite3_value] object returned in *V is a protected sqlite3_value +** and remains valid for the duration of the xBestIndex method call. +** ^When xBestIndex returns, the sqlite3_value object returned by +** sqlite3_vtab_rhs_value() is automatically deallocated. +** +** The "_rhs_" in the name of this routine is an abbreviation for +** "Right-Hand Side". +*/ +SQLITE_API int sqlite3_vtab_rhs_value(sqlite3_index_info*, int, sqlite3_value **ppVal); + /* ** CAPI3REF: Conflict resolution modes ** KEYWORDS: {conflict resolution mode} diff --git a/vendor/sqlite/sqlite3ext.h b/vendor/sqlite/sqlite3ext.h index 9767daa01d..2eac4f3f05 100644 --- a/vendor/sqlite/sqlite3ext.h +++ b/vendor/sqlite/sqlite3ext.h @@ -344,6 +344,13 @@ struct sqlite3_api_routines { int (*autovacuum_pages)(sqlite3*, unsigned int(*)(void*,const char*,unsigned int,unsigned int,unsigned int), void*, void(*)(void*)); + /* Version 3.38.0 and later */ + int (*error_offset)(sqlite3*); + int (*vtab_rhs_value)(sqlite3_index_info*,int,sqlite3_value**); + int (*vtab_distinct)(sqlite3_index_info*); + int (*vtab_in)(sqlite3_index_info*,int,int); + int (*vtab_in_first)(sqlite3_value*,sqlite3_value**); + int (*vtab_in_next)(sqlite3_value*,sqlite3_value**); }; /* @@ -655,6 +662,13 @@ typedef int (*sqlite3_loadext_entry)( #define sqlite3_total_changes64 sqlite3_api->total_changes64 /* Version 3.37.0 and later */ #define sqlite3_autovacuum_pages sqlite3_api->autovacuum_pages +/* Version 3.38.0 and later */ +#define sqlite3_error_offset sqlite3_api->error_offset +#define sqlite3_vtab_rhs_value sqlite3_api->vtab_rhs_value +#define sqlite3_vtab_distinct sqlite3_api->vtab_distinct +#define sqlite3_vtab_in sqlite3_api->vtab_in +#define sqlite3_vtab_in_first sqlite3_api->vtab_in_first +#define sqlite3_vtab_in_next sqlite3_api->vtab_in_next #endif /* !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) */ #if !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) From 66a16ff78331f5b632be63d010ee666d01681ba0 Mon Sep 17 00:00:00 2001 From: patrikjuvonen <22572159+patrikjuvonen@users.noreply.github.com> Date: Sat, 9 Apr 2022 05:05:56 +0300 Subject: [PATCH 46/49] Update unrar from 6.02 to 6.11 (#2583) --- vendor/unrar/acknow.txt | 92 ------------------------------- vendor/unrar/archive.cpp | 2 +- vendor/unrar/arcread.cpp | 14 ++++- vendor/unrar/cmddata.cpp | 26 ++++++++- vendor/unrar/cmddata.hpp | 2 +- vendor/unrar/cmdfilter.cpp | 2 + vendor/unrar/cmdmix.cpp | 16 +++--- vendor/unrar/consio.cpp | 61 +++++++++++++++++--- vendor/unrar/consio.hpp | 1 + vendor/unrar/crc.cpp | 10 ++++ vendor/unrar/encname.cpp | 2 - vendor/unrar/encname.hpp | 3 +- vendor/unrar/extract.cpp | 71 +++++++++++++----------- vendor/unrar/file.cpp | 59 ++++++++++++++++++-- vendor/unrar/file.hpp | 17 +++++- vendor/unrar/filefn.cpp | 18 +++++- vendor/unrar/filefn.hpp | 1 + vendor/unrar/find.cpp | 6 ++ vendor/unrar/global.cpp | 2 +- vendor/unrar/isnt.cpp | 94 ++++++++++++++++++++++++++++++- vendor/unrar/isnt.hpp | 3 + vendor/unrar/list.cpp | 28 +++++----- vendor/unrar/loclang.hpp | 13 ++++- vendor/unrar/options.hpp | 10 +++- vendor/unrar/os.hpp | 17 +++--- vendor/unrar/pathfn.cpp | 78 +++++++++++++++++++++++--- vendor/unrar/pathfn.hpp | 3 +- vendor/unrar/rar.hpp | 2 +- vendor/unrar/rdwrfn.cpp | 91 +++++++++++++++--------------- vendor/unrar/rdwrfn.hpp | 9 ++- vendor/unrar/recvol5.cpp | 31 ++++++++--- vendor/unrar/rijndael.cpp | 110 ++++++++++++++++++++----------------- vendor/unrar/rijndael.hpp | 6 +- vendor/unrar/rs16.cpp | 4 +- vendor/unrar/strfn.cpp | 50 +++++------------ vendor/unrar/strfn.hpp | 8 +-- vendor/unrar/timefn.cpp | 4 +- vendor/unrar/ui.hpp | 3 +- vendor/unrar/uiconsole.cpp | 18 +++++- vendor/unrar/unicode.cpp | 53 ------------------ vendor/unrar/unicode.hpp | 19 +------ vendor/unrar/unpack.hpp | 4 +- vendor/unrar/version.hpp | 8 +-- vendor/unrar/volume.cpp | 70 +++++++++-------------- 44 files changed, 669 insertions(+), 472 deletions(-) delete mode 100644 vendor/unrar/acknow.txt diff --git a/vendor/unrar/acknow.txt b/vendor/unrar/acknow.txt deleted file mode 100644 index b5d2695b08..0000000000 --- a/vendor/unrar/acknow.txt +++ /dev/null @@ -1,92 +0,0 @@ - ACKNOWLEDGMENTS - -* We used "Screaming Fast Galois Field Arithmetic Using Intel - SIMD Instructions" paper by James S. Plank, Kevin M. Greenan - and Ethan L. Miller to improve Reed-Solomon coding performance. - Also we are grateful to Artem Drobanov and Bulat Ziganshin - for samples and ideas allowed to make Reed-Solomon coding - more efficient. - -* RAR text compression algorithm is based on Dmitry Shkarin PPMII - and Dmitry Subbotin carryless rangecoder public domain source code. - You may find it in ftp.elf.stuba.sk/pub/pc/pack. - -* RAR encryption includes parts of code from Szymon Stefanek - and Brian Gladman AES implementations also as Steve Reid SHA-1 source. - - --------------------------------------------------------------------------- - Copyright (c) 2002, Dr Brian Gladman < >, Worcester, UK. - All rights reserved. - - LICENSE TERMS - - The free distribution and use of this software in both source and binary - form is allowed (with or without changes) provided that: - - 1. distributions of this source code include the above copyright - notice, this list of conditions and the following disclaimer; - - 2. distributions in binary form include the above copyright - notice, this list of conditions and the following disclaimer - in the documentation and/or other associated materials; - - 3. the copyright holder's name is not used to endorse products - built using this software without specific written permission. - - ALTERNATIVELY, provided that this notice is retained in full, this product - may be distributed under the terms of the GNU General Public License (GPL), - in which case the provisions of the GPL apply INSTEAD OF those given above. - - DISCLAIMER - - This software is provided 'as is' with no explicit or implied warranties - in respect of its properties, including, but not limited to, correctness - and/or fitness for purpose. - --------------------------------------------------------------------------- - - Source code of this package also as other cryptographic technology - and computing project related links are available on Brian Gladman's - web site: http://www.gladman.me.uk - -* RAR uses CRC32 function based on Intel Slicing-by-8 algorithm. - Original Intel Slicing-by-8 code is available here: - - https://sourceforge.net/projects/slicing-by-8/ - - Original Intel Slicing-by-8 code is licensed under BSD License - available at http://www.opensource.org/licenses/bsd-license.html - - Copyright (c) 2004-2006 Intel Corporation. - 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 - HOLDER 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. - -* RAR archives may optionally include BLAKE2sp hash ( https://blake2.net ), - designed by Jean-Philippe Aumasson, Samuel Neves, Zooko Wilcox-O'Hearn - and Christian Winnerlein. - -* Useful hints provided by Alexander Khoroshev and Bulat Ziganshin allowed - to significantly improve RAR compression and speed. diff --git a/vendor/unrar/archive.cpp b/vendor/unrar/archive.cpp index 8c5a1da81d..0f5de946f7 100644 --- a/vendor/unrar/archive.cpp +++ b/vendor/unrar/archive.cpp @@ -231,7 +231,7 @@ bool Archive::IsArchive(bool EnableBroken) // first file header to set "comment" flag when reading service header. // Unless we are in silent mode, we need to know about presence of comment // immediately after IsArchive call. - if (HeadersLeft && (!SilentOpen || !Encrypted)) + if (HeadersLeft && (!SilentOpen || !Encrypted) && IsSeekable()) { int64 SavePos=Tell(); int64 SaveCurBlockPos=CurBlockPos,SaveNextBlockPos=NextBlockPos; diff --git a/vendor/unrar/arcread.cpp b/vendor/unrar/arcread.cpp index d1df6c0410..1a401f48d3 100644 --- a/vendor/unrar/arcread.cpp +++ b/vendor/unrar/arcread.cpp @@ -558,6 +558,13 @@ size_t Archive::ReadHeader50() return 0; #else + if (Cmd->SkipEncrypted) + { + uiMsg(UIMSG_SKIPENCARC,FileName); + FailedHeaderDecryption=true; // Suppress error messages and quit quietly. + return 0; + } + byte HeadersInitV[SIZE_INITV]; if (Read(HeadersInitV,SIZE_INITV)!=SIZE_INITV) { @@ -876,7 +883,12 @@ size_t Archive::ReadHeader50() // code to shell extension, which is not done now. if (!FileBlock && hd->CmpName(SUBHEAD_TYPE_RR) && hd->SubData.Size()>0) { - RecoveryPercent=hd->SubData[0]; + // It is stored as a single byte up to RAR 6.02 and as vint since + // 6.10, where we extended the maximum RR size from 99% to 1000%. + RawRead RawPercent; + RawPercent.Read(&hd->SubData[0],hd->SubData.Size()); + RecoveryPercent=(int)RawPercent.GetV(); + RSBlockHeader Header; GetRRInfo(this,&Header); RecoverySize=Header.RecSectionSize*Header.RecCount; diff --git a/vendor/unrar/cmddata.cpp b/vendor/unrar/cmddata.cpp index 455a07b2cf..82d24f44f0 100644 --- a/vendor/unrar/cmddata.cpp +++ b/vendor/unrar/cmddata.cpp @@ -108,6 +108,11 @@ void CommandData::ParseArg(wchar *Arg) // 'S' can contain SFX name, which case is important in Unix. if (*Command!='I' && *Command!='S') wcsupper(Command); + if (*Command=='P') // Enforce -idq for print command. + { + MsgStream=MSG_ERRONLY; + SetConsoleMsgStream(MSG_ERRONLY); + } } else if (*ArcName==0) @@ -373,6 +378,9 @@ void CommandData::ProcessSwitch(const wchar *Switch) case '3': ExclPath=EXCL_ABSPATH; break; + case '4': + wcsncpyz(ExclArcPath,Switch+3,ASIZE(ExclArcPath)); + break; } break; default: @@ -399,6 +407,8 @@ void CommandData::ProcessSwitch(const wchar *Switch) EncryptHeaders=true; if (Switch[2]!=0) { + if (wcslen(Switch+2)>=MAXPASSWORD) + uiMsg(UIERROR_TRUNCPSW,MAXPASSWORD-1); Password.Set(Switch+2); cleandata((void *)Switch,wcslen(Switch)*sizeof(Switch[0])); } @@ -561,6 +571,10 @@ void CommandData::ProcessSwitch(const wchar *Switch) break; case 'D': break; + case 'E': + if (toupperw(Switch[2])=='S' && Switch[3]==0) + SkipEncrypted=true; + break; case 'S': { wchar StoreNames[1024]; @@ -648,6 +662,10 @@ void CommandData::ProcessSwitch(const wchar *Switch) AllowIncompatNames=true; break; #endif + case 'P': + wcsncpyz(ExtrPath,Switch+2,ASIZE(ExtrPath)); + AddEndSlash(ExtrPath,ASIZE(ExtrPath)); + break; case 'R': Overwrite=OVERWRITE_AUTORENAME; break; @@ -672,6 +690,8 @@ void CommandData::ProcessSwitch(const wchar *Switch) } else { + if (wcslen(Switch+1)>=MAXPASSWORD) + uiMsg(UIERROR_TRUNCPSW,MAXPASSWORD-1); Password.Set(Switch+1); cleandata((void *)Switch,wcslen(Switch)*sizeof(Switch[0])); } @@ -752,6 +772,10 @@ void CommandData::ProcessSwitch(const wchar *Switch) case 'D': Solid|=SOLID_VOLUME_DEPENDENT; break; + case 'I': + ProhibitConsoleInput(); + wcsncpyz(UseStdin,Switch[2] ? Switch+2:L"stdin",ASIZE(UseStdin)); + break; case 'L': if (IsDigit(Switch[2])) FileSizeLess=atoilw(Switch+2); @@ -935,7 +959,7 @@ void CommandData::ProcessCommand() wcsncpyz(ArcName,Name,ASIZE(ArcName)); } - if (wcschr(L"AFUMD",*Command)==NULL) + if (wcschr(L"AFUMD",*Command)==NULL && *UseStdin==0) { if (GenerateArcName) { diff --git a/vendor/unrar/cmddata.hpp b/vendor/unrar/cmddata.hpp index 719b4007e6..2a21922006 100644 --- a/vendor/unrar/cmddata.hpp +++ b/vendor/unrar/cmddata.hpp @@ -50,7 +50,7 @@ class CommandData:public RAROptions bool GetArcName(wchar *Name,int MaxSize); bool CheckWinSize(); - int GetRecoverySize(const wchar *Str,int DefSize); + int GetRecoverySize(const wchar *CmdStr,const wchar *Value,int DefSize); #ifndef SFX_MODULE void ReportWrongSwitches(RARFORMAT Format); diff --git a/vendor/unrar/cmdfilter.cpp b/vendor/unrar/cmdfilter.cpp index d6517ceb79..d098d1088c 100644 --- a/vendor/unrar/cmdfilter.cpp +++ b/vendor/unrar/cmdfilter.cpp @@ -262,6 +262,8 @@ bool CommandData::TimeCheck(RarTime &ftm,RarTime &ftc,RarTime &fta) // Return 'true' if we need to exclude the file from processing. bool CommandData::SizeCheck(int64 Size) { + if (Size==INT64NDF) // If called from archive formats like bzip2, not storing the file size. + return false; if (FileSizeLess!=INT64NDF && Size>=FileSizeLess) return true; if (FileSizeMore!=INT64NDF && Size<=FileSizeMore) diff --git a/vendor/unrar/cmdmix.cpp b/vendor/unrar/cmdmix.cpp index 3990cc1891..1fc4b8caff 100644 --- a/vendor/unrar/cmdmix.cpp +++ b/vendor/unrar/cmdmix.cpp @@ -61,14 +61,14 @@ void CommandData::OutHelp(RAR_EXIT ExitCode) MUNRARTitle1,MRARTitle2,MCHelpCmd,MCHelpCmdE,MCHelpCmdL, MCHelpCmdP,MCHelpCmdT,MCHelpCmdV,MCHelpCmdX,MCHelpSw,MCHelpSwm, MCHelpSwAT,MCHelpSwAC,MCHelpSwAD,MCHelpSwAG,MCHelpSwAI,MCHelpSwAP, - MCHelpSwCm,MCHelpSwCFGm,MCHelpSwCL,MCHelpSwCU, - MCHelpSwDH,MCHelpSwEP,MCHelpSwEP3,MCHelpSwF,MCHelpSwIDP,MCHelpSwIERR, - MCHelpSwINUL,MCHelpSwIOFF,MCHelpSwKB,MCHelpSwN,MCHelpSwNa,MCHelpSwNal, - MCHelpSwO,MCHelpSwOC,MCHelpSwOL,MCHelpSwOR,MCHelpSwOW,MCHelpSwP, - MCHelpSwPm,MCHelpSwR,MCHelpSwRI,MCHelpSwSC,MCHelpSwSL,MCHelpSwSM, - MCHelpSwTA,MCHelpSwTB,MCHelpSwTN,MCHelpSwTO,MCHelpSwTS,MCHelpSwU, - MCHelpSwVUnr,MCHelpSwVER,MCHelpSwVP,MCHelpSwX,MCHelpSwXa,MCHelpSwXal, - MCHelpSwY + MCHelpSwCm,MCHelpSwCFGm,MCHelpSwCL,MCHelpSwCU,MCHelpSwDH,MCHelpSwEP, + MCHelpSwEP3,MCHelpSwEP4,MCHelpSwF,MCHelpSwIDP,MCHelpSwIERR, + MCHelpSwINUL,MCHelpSwIOFF,MCHelpSwKB,MCHelpSwME,MCHelpSwN,MCHelpSwNa, + MCHelpSwNal,MCHelpSwO,MCHelpSwOC,MCHelpSwOL,MCHelpSwOP,MCHelpSwOR, + MCHelpSwOW,MCHelpSwP,MCHelpSwR,MCHelpSwRI,MCHelpSwSC,MCHelpSwSI, + MCHelpSwSL,MCHelpSwSM,MCHelpSwTA,MCHelpSwTB,MCHelpSwTN,MCHelpSwTO, + MCHelpSwTS,MCHelpSwU,MCHelpSwVUnr,MCHelpSwVER,MCHelpSwVP,MCHelpSwX, + MCHelpSwXa,MCHelpSwXal,MCHelpSwY #endif }; diff --git a/vendor/unrar/consio.cpp b/vendor/unrar/consio.cpp index fedd5c05c5..fa35d6146f 100644 --- a/vendor/unrar/consio.cpp +++ b/vendor/unrar/consio.cpp @@ -3,6 +3,7 @@ static MESSAGE_TYPE MsgStream=MSG_STDOUT; static RAR_CHARSET RedirectCharset=RCH_DEFAULT; +static bool ProhibitInput=false; const int MaxMsgSize=2*NM+2048; @@ -61,6 +62,12 @@ void SetConsoleRedirectCharset(RAR_CHARSET RedirectCharset) } +void ProhibitConsoleInput() +{ + ProhibitInput=true; +} + + #ifndef SILENT static void cvt_wprintf(FILE *dest,const wchar *fmt,va_list arglist) { @@ -141,28 +148,56 @@ void eprintf(const wchar *fmt,...) #ifndef SILENT +static void QuitIfInputProhibited() +{ + // We cannot handle user prompts if -si is used to read file or archive data + // from stdin. + if (ProhibitInput) + { + mprintf(St(MStdinNoInput)); + ErrHandler.Exit(RARX_FATAL); + } +} + + static void GetPasswordText(wchar *Str,uint MaxLength) { if (MaxLength==0) return; + QuitIfInputProhibited(); if (StdinRedirected) getwstr(Str,MaxLength); // Read from pipe or redirected file. else { #ifdef _WIN_ALL HANDLE hConIn=GetStdHandle(STD_INPUT_HANDLE); - HANDLE hConOut=GetStdHandle(STD_OUTPUT_HANDLE); - DWORD ConInMode,ConOutMode; - DWORD Read=0; + DWORD ConInMode; GetConsoleMode(hConIn,&ConInMode); - GetConsoleMode(hConOut,&ConOutMode); - SetConsoleMode(hConIn,ENABLE_LINE_INPUT); - SetConsoleMode(hConOut,ENABLE_PROCESSED_OUTPUT|ENABLE_WRAP_AT_EOL_OUTPUT); + SetConsoleMode(hConIn,ENABLE_LINE_INPUT); // Remove ENABLE_ECHO_INPUT. + // We prefer ReadConsole to ReadFile, so we can read Unicode input. + DWORD Read=0; ReadConsole(hConIn,Str,MaxLength-1,&Read,NULL); Str[Read]=0; SetConsoleMode(hConIn,ConInMode); - SetConsoleMode(hConOut,ConOutMode); + + // If entered password is longer than MAXPASSWORD and truncated, + // read its unread part anyway, so it isn't read later as the second + // password for -p switch. Low level FlushConsoleInputBuffer doesn't help + // for high level ReadConsole, which in line input mode seems to store + // the rest of string in its own internal buffer. + if (wcschr(Str,'\r')==NULL) // If '\r' is missing, the password was truncated. + while (true) + { + wchar Trail[64]; + DWORD TrailRead=0; + // Use ASIZE(Trail)-1 to reserve the space for trailing 0. + ReadConsole(hConIn,Trail,ASIZE(Trail)-1,&TrailRead,NULL); + Trail[TrailRead]=0; + if (TrailRead==0 || wcschr(Trail,'\r')!=NULL) + break; + } + #else char StrA[MAXPASSWORD*4]; // "*4" for multibyte UTF-8 characters. #if defined(_EMX) || defined (__VMS) @@ -190,16 +225,21 @@ bool GetConsolePassword(UIPASSWORD_TYPE Type,const wchar *FileName,SecPassword * while (true) { - if (!StdinRedirected) +// if (!StdinRedirected) if (Type==UIPASSWORD_GLOBAL) eprintf(L"\n%s: ",St(MAskPsw)); else eprintf(St(MAskPswFor),FileName); - wchar PlainPsw[MAXPASSWORD]; + wchar PlainPsw[MAXPASSWORD+1]; GetPasswordText(PlainPsw,ASIZE(PlainPsw)); if (*PlainPsw==0 && Type==UIPASSWORD_GLOBAL) return false; + if (wcslen(PlainPsw)>=MAXPASSWORD) + { + PlainPsw[MAXPASSWORD-1]=0; + uiMsg(UIERROR_TRUNCPSW,MAXPASSWORD-1); + } if (!StdinRedirected && Type==UIPASSWORD_GLOBAL) { eprintf(St(MReAskPsw)); @@ -229,6 +269,8 @@ bool getwstr(wchar *str,size_t n) // Print buffered prompt title function before waiting for input. fflush(stderr); + QuitIfInputProhibited(); + *str=0; #if defined(_WIN_ALL) // fgetws does not work well with non-English text in Windows, @@ -240,6 +282,7 @@ bool getwstr(wchar *str,size_t n) Array StrA(n*4); // Up to 4 UTF-8 characters per wchar_t. File SrcFile; SrcFile.SetHandleType(FILE_HANDLESTD); + SrcFile.SetLineInputMode(true); int ReadSize=SrcFile.Read(&StrA[0],StrA.Size()-1); if (ReadSize<=0) { diff --git a/vendor/unrar/consio.hpp b/vendor/unrar/consio.hpp index 903dc21a46..bf97289e7c 100644 --- a/vendor/unrar/consio.hpp +++ b/vendor/unrar/consio.hpp @@ -4,6 +4,7 @@ void InitConsole(); void SetConsoleMsgStream(MESSAGE_TYPE MsgStream); void SetConsoleRedirectCharset(RAR_CHARSET RedirectCharset); +void ProhibitConsoleInput(); void OutComment(const wchar *Comment,size_t Size); #ifndef SILENT diff --git a/vendor/unrar/crc.cpp b/vendor/unrar/crc.cpp index cf23bbf4f2..0e5e13206f 100644 --- a/vendor/unrar/crc.cpp +++ b/vendor/unrar/crc.cpp @@ -14,6 +14,12 @@ #include "rar.hpp" +#ifndef SFX_MODULE +// User suggested to avoid BSD license in SFX module, so they do not need +// to include the license to SFX archive. +#define USE_SLICING +#endif + static uint crc_tables[8][256]; // Tables for Slicing-by-8. @@ -37,6 +43,7 @@ static void InitTables() { InitCRC32(crc_tables[0]); +#ifdef USE_SLICING for (uint I=0;I<256;I++) // Build additional lookup tables. { uint C=crc_tables[0][I]; @@ -46,6 +53,7 @@ static void InitTables() crc_tables[J][I]=C; } } +#endif } @@ -55,6 +63,7 @@ uint CRC32(uint StartCRC,const void *Addr,size_t Size) { byte *Data=(byte *)Addr; +#ifdef USE_SLICING // Align Data to 8 for better performance. for (;Size>0 && ((size_t)Data & 7);Size--,Data++) StartCRC=crc_tables[0][(byte)(StartCRC^Data[0])]^(StartCRC>>8); @@ -77,6 +86,7 @@ uint CRC32(uint StartCRC,const void *Addr,size_t Size) crc_tables[1][(byte)(NextData >> 16)] ^ crc_tables[0][(byte)(NextData >> 24)]; } +#endif for (;Size>0;Size--,Data++) // Process left data. StartCRC=crc_tables[0][(byte)(StartCRC^Data[0])]^(StartCRC>>8); diff --git a/vendor/unrar/encname.cpp b/vendor/unrar/encname.cpp index 84731a71e3..e1ba1ed70f 100644 --- a/vendor/unrar/encname.cpp +++ b/vendor/unrar/encname.cpp @@ -20,8 +20,6 @@ void EncodeFileName::Decode(char *Name,size_t NameSize,byte *EncName,size_t EncS { if (FlagBits==0) { - if (EncPos>=EncSize) - break; Flags=EncName[EncPos++]; FlagBits=8; } diff --git a/vendor/unrar/encname.hpp b/vendor/unrar/encname.hpp index 538bcb699a..c6b4ed44d7 100644 --- a/vendor/unrar/encname.hpp +++ b/vendor/unrar/encname.hpp @@ -4,9 +4,8 @@ class EncodeFileName { private: - void AddFlags(int Value); + void AddFlags(byte Value,byte *EncName); - byte *EncName; byte Flags; uint FlagBits; size_t FlagsPos; diff --git a/vendor/unrar/extract.cpp b/vendor/unrar/extract.cpp index 6c3e214aec..dc109b9d90 100644 --- a/vendor/unrar/extract.cpp +++ b/vendor/unrar/extract.cpp @@ -49,8 +49,7 @@ void CmdExtract::DoExtract() if (Code!=EXTRACT_ARC_REPEAT) break; } - if (FindFile::FastFind(ArcName,&FD)) - DataIO.ProcessedArcSize+=FD.Size; + DataIO.ProcessedArcSize+=DataIO.LastArcSize; } // Clean user entered password. Not really required, just for extra safety. @@ -82,7 +81,7 @@ void CmdExtract::DoExtract() void CmdExtract::ExtractArchiveInit(Archive &Arc) { - DataIO.UnpArcSize=Arc.FileLength(); + DataIO.AdjustTotalArcSize(&Arc); FileCount=0; MatchedArgs=0; @@ -105,8 +104,22 @@ void CmdExtract::ExtractArchiveInit(Archive &Arc) EXTRACT_ARC_CODE CmdExtract::ExtractArchive() { Archive Arc(Cmd); - if (!Arc.WOpen(ArcName)) - return EXTRACT_ARC_NEXT; + if (*Cmd->UseStdin!=0) + { + Arc.SetHandleType(FILE_HANDLESTD); +#ifdef USE_QOPEN + Arc.SetProhibitQOpen(true); +#endif + } + else + { +#if defined(_WIN_ALL) && !defined(SFX_MODULE) // WinRAR GUI code also resets the cache. + if (*Cmd->Command=='T' || Cmd->Test) + ResetFileCache(ArcName); // Reset the file cache when testing an archive. +#endif + if (!Arc.WOpen(ArcName)) + return EXTRACT_ARC_NEXT; + } if (!Arc.IsArchive(true)) { @@ -216,14 +229,11 @@ EXTRACT_ARC_CODE CmdExtract::ExtractArchive() if (Repeat) { // If we started extraction from not first volume and need to - // restart it from first, we must correct DataIO.TotalArcSize - // for correct total progress display. We subtract the size - // of current volume and all volumes after it and add the size - // of new (first) volume. - FindData OldArc,NewArc; - if (FindFile::FastFind(Arc.FileName,&OldArc) && - FindFile::FastFind(ArcName,&NewArc)) - DataIO.TotalArcSize-=VolumeSetSize+OldArc.Size-NewArc.Size; + // restart it from first, we must set DataIO.TotalArcSize to size + // of new first volume to display the total progress correctly. + FindData NewArc; + if (FindFile::FastFind(ArcName,&NewArc)) + DataIO.TotalArcSize=NewArc.Size; return EXTRACT_ARC_REPEAT; } else @@ -403,6 +413,12 @@ bool CmdExtract::ExtractCurrentFile(Archive &Arc,size_t HeaderSize,bool &Repeat) FirstFile=false; #endif + if (Arc.FileHead.Encrypted && Cmd->SkipEncrypted) + if (Arc.Solid) + return false; // Abort the entire extraction for solid archive. + else + MatchFound=false; // Skip only the current file for non-solid archive. + if (MatchFound || (SkipSolid=Arc.Solid)!=0) { // First common call of uiStartFileExtract. It is done before overwrite @@ -632,7 +648,7 @@ bool CmdExtract::ExtractCurrentFile(Archive &Arc,size_t HeaderSize,bool &Repeat) uint64 Preallocated=0; if (!TestMode && !Arc.BrokenHeader && Arc.FileHead.UnpSize>1000000 && - Arc.FileHead.PackSize*1024>Arc.FileHead.UnpSize && + Arc.FileHead.PackSize*1024>Arc.FileHead.UnpSize && Arc.IsSeekable() && (Arc.FileHead.UnpSize<100000000 || Arc.FileLength()>Arc.FileHead.PackSize)) { CurFile.Prealloc(Arc.FileHead.UnpSize); @@ -650,8 +666,11 @@ bool CmdExtract::ExtractCurrentFile(Archive &Arc,size_t HeaderSize,bool &Repeat) if (Type==FSREDIR_HARDLINK || Type==FSREDIR_FILECOPY) { + wchar RedirName[NM]; + ConvertPath(Arc.FileHead.RedirName,RedirName,ASIZE(RedirName)); + wchar NameExisting[NM]; - ExtrPrepareName(Arc,Arc.FileHead.RedirName,NameExisting,ASIZE(NameExisting)); + ExtrPrepareName(Arc,RedirName,NameExisting,ASIZE(NameExisting)); if (FileCreateMode && *NameExisting!=0) // *NameExisting can be 0 in case of excessive -ap switch. if (Type==FSREDIR_HARDLINK) LinkSuccess=ExtractHardlink(Cmd,DestFileName,NameExisting,ASIZE(NameExisting)); @@ -921,19 +940,13 @@ void CmdExtract::ExtrPrepareName(Archive &Arc,const wchar *ArcFileName,wchar *De #endif #ifndef SFX_MODULE - size_t ArcPathLength=wcslen(Cmd->ArcPath); + wchar *ArcPath=*Cmd->ExclArcPath!=0 ? Cmd->ExclArcPath:Cmd->ArcPath; + size_t ArcPathLength=wcslen(ArcPath); if (ArcPathLength>0) { size_t NameLength=wcslen(ArcFileName); - - // Earlier we compared lengths only here, but then noticed a cosmetic bug - // in WinRAR. When extracting a file reference from subfolder with - // "Extract relative paths", so WinRAR sets ArcPath, if reference target - // is missing, error message removed ArcPath both from reference and target - // names. If target was stored in another folder, its name looked wrong. - if (NameLength>=ArcPathLength && - wcsnicompc(Cmd->ArcPath,ArcFileName,ArcPathLength)==0 && - (IsPathDiv(Cmd->ArcPath[ArcPathLength-1]) || + if (NameLength>=ArcPathLength && wcsnicompc(ArcPath,ArcFileName,ArcPathLength)==0 && + (IsPathDiv(ArcPath[ArcPathLength-1]) || IsPathDiv(ArcFileName[ArcPathLength]) || ArcFileName[ArcPathLength]==0)) { ArcFileName+=Min(ArcPathLength,NameLength); @@ -966,7 +979,7 @@ void CmdExtract::ExtrPrepareName(Archive &Arc,const wchar *ArcFileName,wchar *De // Must do after Cmd->ArcPath processing above, so file name and arc path // trailing spaces are in sync. if (!Cmd->AllowIncompatNames) - MakeNameCompatible(DestName); + MakeNameCompatible(DestName,DestSize); #endif wchar DiskLetter=toupperw(DestName[0]); @@ -1027,11 +1040,7 @@ bool CmdExtract::ExtrGetPassword(Archive &Arc,const wchar *ArcFileName) if (!uiGetPassword(UIPASSWORD_FILE,ArcFileName,&Cmd->Password)/* || !Cmd->Password.IsSet()*/) { // Suppress "test is ok" message if user cancelled the password prompt. -// 2019.03.23: If some archives are tested ok and prompt is cancelled for others, -// do we really need to suppress "test is ok"? Also if we set an empty password -// and "Use for all archives" in WinRAR Ctrl+P and skip some encrypted archives. -// We commented out this UIERROR_INCERRCOUNT for now. -// uiMsg(UIERROR_INCERRCOUNT); + uiMsg(UIERROR_INCERRCOUNT); return false; } Cmd->ManualPassword=true; diff --git a/vendor/unrar/file.cpp b/vendor/unrar/file.cpp index 5a8099ec5b..e7b584da6b 100644 --- a/vendor/unrar/file.cpp +++ b/vendor/unrar/file.cpp @@ -7,6 +7,7 @@ File::File() NewFile=false; LastWrite=false; HandleType=FILE_HANDLENORMAL; + LineInput=false; SkipClose=false; ErrorType=FILE_SUCCESS; OpenShared=false; @@ -14,11 +15,11 @@ File::File() AllowExceptions=true; PreserveAtime=false; #ifdef _WIN_ALL - NoSequentialRead=false; CreateMode=FMF_UNDEFINED; #endif ReadErrorMode=FREM_ASK; TruncatedAfterReadError=false; + CurFilePos=0; } @@ -58,7 +59,7 @@ bool File::Open(const wchar *Name,uint Mode) uint ShareMode=(Mode & FMF_OPENEXCLUSIVE) ? 0 : FILE_SHARE_READ; if (OpenShared) ShareMode|=FILE_SHARE_WRITE; - uint Flags=NoSequentialRead ? 0:FILE_FLAG_SEQUENTIAL_SCAN; + uint Flags=FILE_FLAG_SEQUENTIAL_SCAN; FindData FD; if (PreserveAtime) Access|=FILE_WRITE_ATTRIBUTES; // Needed to preserve atime. @@ -379,10 +380,11 @@ int File::Read(void *Data,size_t Size) if (ReadErrorMode==FREM_IGNORE) FilePos=Tell(); - int ReadSize; + int TotalRead=0; while (true) { - ReadSize=DirectRead(Data,Size); + int ReadSize=DirectRead(Data,Size); + if (ReadSize==-1) { ErrorType=FILE_READERROR; @@ -396,6 +398,8 @@ int File::Read(void *Data,size_t Size) size_t SizeToRead=Min(Size-I,512); int ReadCode=DirectRead(Data,SizeToRead); ReadSize+=(ReadCode==-1) ? 512:ReadCode; + if (ReadSize!=-1) + TotalRead+=ReadSize; } } else @@ -415,9 +419,28 @@ int File::Read(void *Data,size_t Size) ErrHandler.ReadError(FileName); } } + TotalRead+=ReadSize; // If ReadSize is -1, TotalRead is also set to -1 here. + + if (HandleType==FILE_HANDLESTD && !LineInput && ReadSize>0 && (uint)ReadSize0) // Can be -1 for error and AllowExceptions disabled. + CurFilePos+=TotalRead; + return TotalRead; // It can return -1 only if AllowExceptions is disabled. } @@ -499,6 +522,30 @@ bool File::RawSeek(int64 Offset,int Method) { if (hFile==FILE_BAD_HANDLE) return true; + if (!IsSeekable()) + { + if (Method==SEEK_CUR) + { + Offset+=CurFilePos; + Method=SEEK_SET; + } + if (Method==SEEK_SET && Offset>=CurFilePos) // Reading for seek forward. + { + uint64 SkipSize=Offset-CurFilePos; + while (SkipSize>0) + { + byte Buf[4096]; + int ReadSize=Read(Buf,(size_t)Min(SkipSize,ASIZE(Buf))); + if (ReadSize<=0) + return false; + SkipSize-=ReadSize; + } + CurFilePos=Offset; + return true; + } + + return false; // Backward or end of file seek on unseekable file. + } if (Offset<0 && Method!=SEEK_SET) { Offset=(Method==SEEK_CUR ? Tell():FileLength())+Offset; @@ -533,6 +580,8 @@ int64 File::Tell() ErrHandler.SeekError(FileName); else return -1; + if (!IsSeekable()) + return CurFilePos; #ifdef _WIN_ALL LONG HighDist=0; uint LowDist=SetFilePointer(hFile,0,&HighDist,FILE_CURRENT); diff --git a/vendor/unrar/file.hpp b/vendor/unrar/file.hpp index 1c436d4ef7..1de5fe6df3 100644 --- a/vendor/unrar/file.hpp +++ b/vendor/unrar/file.hpp @@ -59,6 +59,16 @@ class File FileHandle hFile; bool LastWrite; FILE_HANDLETYPE HandleType; + + // If we read the user input in console prompts from stdin, we shall + // process the available line immediately, not waiting for rest of data. + // Otherwise apps piping user responses to multiple Ask() prompts can + // hang if no more data is available yet and pipe isn't closed. + // If we read RAR archive or other file data from stdin, we shall collect + // the entire requested block as long as pipe isn't closed, so we get + // complete archive headers, not split between different reads. + bool LineInput; + bool SkipClose; FILE_READ_ERROR_MODE ReadErrorMode; bool NewFile; @@ -70,6 +80,8 @@ class File #endif bool PreserveAtime; bool TruncatedAfterReadError; + + int64 CurFilePos; // Used for forward seeks in stdin files. protected: bool OpenShared; // Set by 'Archive' class. public: @@ -110,7 +122,9 @@ class File virtual bool IsOpened() {return hFile!=FILE_BAD_HANDLE;} // 'virtual' for MultiFile class. int64 FileLength(); void SetHandleType(FILE_HANDLETYPE Type) {HandleType=Type;} + void SetLineInputMode(bool Mode) {LineInput=Mode;} FILE_HANDLETYPE GetHandleType() {return HandleType;} + bool IsSeekable() {return HandleType!=FILE_HANDLESTD;} bool IsDevice(); static bool RemoveCreated(); FileHandle GetHandle() {return hFile;} @@ -119,9 +133,6 @@ class File int64 Copy(File &Dest,int64 Length=INT64NDF); void SetAllowDelete(bool Allow) {AllowDelete=Allow;} void SetExceptions(bool Allow) {AllowExceptions=Allow;} -#ifdef _WIN_ALL - void RemoveSequentialFlag() {NoSequentialRead=true;} -#endif void SetPreserveAtime(bool Preserve) {PreserveAtime=Preserve;} bool IsTruncatedAfterReadError() {return TruncatedAfterReadError;} #ifdef _UNIX diff --git a/vendor/unrar/filefn.cpp b/vendor/unrar/filefn.cpp index bab7c73848..883c26e2bc 100644 --- a/vendor/unrar/filefn.cpp +++ b/vendor/unrar/filefn.cpp @@ -397,7 +397,11 @@ void CalcFileSum(File *SrcFile,uint *CRC32,byte *Blake2,uint Threads,int64 Size, { #ifndef SILENT if ((Flags & CALCFSUM_SHOWPROGRESS)!=0) - uiExtractProgress(TotalRead,FileLength,TotalRead,FileLength); + { + // Update only the current file progress in WinRAR, set the total to 0 + // to keep it as is. It looks better for WinRAR, + uiExtractProgress(TotalRead,FileLength,0,0); + } else { if ((Flags & CALCFSUM_SHOWPERCENT)!=0) @@ -517,6 +521,18 @@ bool SetFileCompression(const wchar *Name,bool State) CloseHandle(hFile); return RetCode!=0; } + + +void ResetFileCache(const wchar *Name) +{ + // To reset file cache in Windows it is enough to open it with + // FILE_FLAG_NO_BUFFERING and then close it. + HANDLE hSrc=CreateFile(Name,GENERIC_READ, + FILE_SHARE_READ|FILE_SHARE_WRITE, + NULL,OPEN_EXISTING,FILE_FLAG_NO_BUFFERING,NULL); + if (hSrc!=INVALID_HANDLE_VALUE) + CloseHandle(hSrc); +} #endif diff --git a/vendor/unrar/filefn.hpp b/vendor/unrar/filefn.hpp index 78735fee9e..36dc703953 100644 --- a/vendor/unrar/filefn.hpp +++ b/vendor/unrar/filefn.hpp @@ -41,6 +41,7 @@ bool DelDir(const wchar *Name); #if defined(_WIN_ALL) && !defined(SFX_MODULE) bool SetFileCompression(const wchar *Name,bool State); +void ResetFileCache(const wchar *Name); #endif diff --git a/vendor/unrar/find.cpp b/vendor/unrar/find.cpp index b22f82d8f2..04702ab87e 100644 --- a/vendor/unrar/find.cpp +++ b/vendor/unrar/find.cpp @@ -144,9 +144,15 @@ bool FindFile::FastFind(const wchar *FindMask,FindData *fd,bool GetSymLink) fd->Size=st.st_size; #ifdef UNIX_TIME_NS +#if defined(_APPLE) + fd->mtime.SetUnixNS(st.st_mtimespec.tv_sec*(uint64)1000000000+st.st_mtimespec.tv_nsec); + fd->atime.SetUnixNS(st.st_atimespec.tv_sec*(uint64)1000000000+st.st_atimespec.tv_nsec); + fd->ctime.SetUnixNS(st.st_ctimespec.tv_sec*(uint64)1000000000+st.st_ctimespec.tv_nsec); +#else fd->mtime.SetUnixNS(st.st_mtim.tv_sec*(uint64)1000000000+st.st_mtim.tv_nsec); fd->atime.SetUnixNS(st.st_atim.tv_sec*(uint64)1000000000+st.st_atim.tv_nsec); fd->ctime.SetUnixNS(st.st_ctim.tv_sec*(uint64)1000000000+st.st_ctim.tv_nsec); +#endif #else fd->mtime.SetUnix(st.st_mtime); fd->atime.SetUnix(st.st_atime); diff --git a/vendor/unrar/global.cpp b/vendor/unrar/global.cpp index 3975813a97..771f000161 100644 --- a/vendor/unrar/global.cpp +++ b/vendor/unrar/global.cpp @@ -1,6 +1,6 @@ #define INCLUDEGLOBAL -#if defined(__BORLANDC__) || defined(_MSC_VER) +#ifdef _MSC_VER #pragma hdrstop #endif diff --git a/vendor/unrar/isnt.cpp b/vendor/unrar/isnt.cpp index 6fadec049f..f85472c350 100644 --- a/vendor/unrar/isnt.cpp +++ b/vendor/unrar/isnt.cpp @@ -1,6 +1,5 @@ #include "rar.hpp" -#ifdef _WIN_ALL DWORD WinNT() { static int dwPlatformId=-1; @@ -13,6 +12,7 @@ DWORD WinNT() dwPlatformId=WinVer.dwPlatformId; dwMajorVersion=WinVer.dwMajorVersion; dwMinorVersion=WinVer.dwMinorVersion; + } DWORD Result=0; if (dwPlatformId==VER_PLATFORM_WIN32_NT) @@ -21,4 +21,94 @@ DWORD WinNT() return Result; } -#endif + + +// Replace it with documented Windows 11 check when available. +#include +#include +#pragma comment(lib, "wbemuuid.lib") + +static bool WMI_IsWindows10() +{ + IWbemLocator *pLoc = NULL; + + HRESULT hres = CoCreateInstance(CLSID_WbemLocator,0,CLSCTX_INPROC_SERVER, + IID_IWbemLocator,(LPVOID *)&pLoc); + + if (FAILED(hres)) + return false; + + IWbemServices *pSvc = NULL; + + hres = pLoc->ConnectServer(_bstr_t(L"ROOT\\CIMV2"),NULL,NULL,0,NULL,0,0,&pSvc); + + if (FAILED(hres)) + { + pLoc->Release(); + return false; + } + + hres = CoSetProxyBlanket(pSvc,RPC_C_AUTHN_WINNT,RPC_C_AUTHZ_NONE,NULL, + RPC_C_AUTHN_LEVEL_CALL,RPC_C_IMP_LEVEL_IMPERSONATE,NULL,EOAC_NONE); + + if (FAILED(hres)) + { + pSvc->Release(); + pLoc->Release(); + return false; + } + + IEnumWbemClassObject *pEnumerator = NULL; + hres = pSvc->ExecQuery(bstr_t("WQL"), bstr_t("SELECT * FROM Win32_OperatingSystem"), + WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator); + + if (FAILED(hres)) + { + pSvc->Release(); + pLoc->Release(); + return false; + } + + IWbemClassObject *pclsObj = NULL; + ULONG uReturn = 0; + + bool Win10=false; + while (pEnumerator!=NULL) + { + HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn); + + if (uReturn==0) + break; + + VARIANT vtProp; + + hr = pclsObj->Get(L"Name", 0, &vtProp, 0, 0); + Win10|=wcsstr(vtProp.bstrVal,L"Windows 10")!=NULL; + VariantClear(&vtProp); + + pclsObj->Release(); + } + + pSvc->Release(); + pLoc->Release(); + pEnumerator->Release(); + + return Win10; +} + + +// Replace it with actual check when available. +bool IsWindows11OrGreater() +{ + static bool IsSet=false,IsWin11=false; + if (!IsSet) + { + OSVERSIONINFO WinVer; + WinVer.dwOSVersionInfoSize=sizeof(WinVer); + GetVersionEx(&WinVer); + IsWin11=WinVer.dwMajorVersion>10 || + WinVer.dwMajorVersion==10 && WinVer.dwBuildNumber >= 22000 && !WMI_IsWindows10(); + IsSet=true; + } + return IsWin11; +} diff --git a/vendor/unrar/isnt.hpp b/vendor/unrar/isnt.hpp index 85790da462..fed0b51737 100644 --- a/vendor/unrar/isnt.hpp +++ b/vendor/unrar/isnt.hpp @@ -10,4 +10,7 @@ enum WINNT_VERSION { DWORD WinNT(); +// Replace it with actual check when available. +bool IsWindows11OrGreater(); + #endif diff --git a/vendor/unrar/list.cpp b/vendor/unrar/list.cpp index 9b6521859b..e5052c0177 100644 --- a/vendor/unrar/list.cpp +++ b/vendor/unrar/list.cpp @@ -22,9 +22,6 @@ void ListArchive(CommandData *Cmd) Cmd->Password.Clean(); // Clean user entered password before processing next archive. Archive Arc(Cmd); -#ifdef _WIN_ALL - Arc.RemoveSequentialFlag(); -#endif if (!Arc.WOpen(ArcName)) continue; bool FileMatched=true; @@ -310,17 +307,21 @@ void ListFileHeader(Archive &Arc,FileHeader &hd,bool &TitleShown,bool Verbose,bo mprintf(L"\n%12ls: %ls",St(MListPacked),PackSizeText); mprintf(L"\n%12ls: %ls",St(MListRatio),RatioStr); } + bool WinTitles=false; +#ifdef _WIN_ALL + WinTitles=true; +#endif if (hd.mtime.IsSet()) - mprintf(L"\n%12ls: %ls",St(MListMtime),DateStr); + mprintf(L"\n%12ls: %ls",St(WinTitles ? MListModified:MListMtime),DateStr); if (hd.ctime.IsSet()) { hd.ctime.GetText(DateStr,ASIZE(DateStr),true); - mprintf(L"\n%12ls: %ls",St(MListCtime),DateStr); + mprintf(L"\n%12ls: %ls",St(WinTitles ? MListCreated:MListCtime),DateStr); } if (hd.atime.IsSet()) { hd.atime.GetText(DateStr,ASIZE(DateStr),true); - mprintf(L"\n%12ls: %ls",St(MListAtime),DateStr); + mprintf(L"\n%12ls: %ls",St(WinTitles ? MListAccessed:MListAtime),DateStr); } mprintf(L"\n%12ls: %ls",St(MListAttr),AttrStr); if (hd.FileHash.Type==HASH_CRC32) @@ -376,15 +377,16 @@ void ListFileHeader(Archive &Arc,FileHeader &hd,bool &TitleShown,bool Verbose,bo { mprintf(L"\n%12ls: ",L"Unix owner"); if (*hd.UnixOwnerName!=0) - mprintf(L"%ls:",GetWide(hd.UnixOwnerName)); + mprintf(L"%ls",GetWide(hd.UnixOwnerName)); + else + if (hd.UnixOwnerNumeric) + mprintf(L"#%d",hd.UnixOwnerID); + mprintf(L":"); if (*hd.UnixGroupName!=0) mprintf(L"%ls",GetWide(hd.UnixGroupName)); - if ((*hd.UnixOwnerName!=0 || *hd.UnixGroupName!=0) && (hd.UnixOwnerNumeric || hd.UnixGroupNumeric)) - mprintf(L" "); - if (hd.UnixOwnerNumeric) - mprintf(L"#%d:",hd.UnixOwnerID); - if (hd.UnixGroupNumeric) - mprintf(L"#%d:",hd.UnixGroupID); + else + if (hd.UnixGroupNumeric) + mprintf(L"#%d",hd.UnixGroupID); } mprintf(L"\n"); diff --git a/vendor/unrar/loclang.hpp b/vendor/unrar/loclang.hpp index a1cd544a34..ad7d0c9249 100644 --- a/vendor/unrar/loclang.hpp +++ b/vendor/unrar/loclang.hpp @@ -72,11 +72,11 @@ #define MCHelpSwDW L"\n dw Wipe files after archiving" #define MCHelpSwEa L"\n e[+] Set file exclude and include attributes" #define MCHelpSwED L"\n ed Do not add empty directories" -#define MCHelpSwEN L"\n en Do not put 'end of archive' block" #define MCHelpSwEP L"\n ep Exclude paths from names" #define MCHelpSwEP1 L"\n ep1 Exclude base directory from names" #define MCHelpSwEP2 L"\n ep2 Expand paths to full" #define MCHelpSwEP3 L"\n ep3 Expand paths to full including the drive letter" +#define MCHelpSwEP4 L"\n ep4 Exclude the path prefix from names" #define MCHelpSwF L"\n f Freshen files" #define MCHelpSwHP L"\n hp[password] Encrypt both file data and headers" #define MCHelpSwHT L"\n ht[b|c] Select hash type [BLAKE2,CRC32] for file checksum" @@ -95,6 +95,7 @@ #define MCHelpSwMA L"\n ma[4|5] Specify a version of archiving format" #define MCHelpSwMC L"\n mc Set advanced compression parameters" #define MCHelpSwMD L"\n md[k,m,g] Dictionary size in KB, MB or GB" +#define MCHelpSwME L"\n me[par] Set encryption parameters" #define MCHelpSwMS L"\n ms[ext;ext] Specify file types to store" #define MCHelpSwMT L"\n mt Set the number of threads" #define MCHelpSwN L"\n n Additionally filter included files" @@ -106,11 +107,11 @@ #define MCHelpSwOI L"\n oi[0-4][:min] Save identical files as references" #define MCHelpSwOL L"\n ol[a] Process symbolic links as the link [absolute paths]" #define MCHelpSwONI L"\n oni Allow potentially incompatible names" +#define MCHelpSwOP L"\n op Set the output path for extracted files" #define MCHelpSwOR L"\n or Rename files automatically" #define MCHelpSwOS L"\n os Save NTFS streams" #define MCHelpSwOW L"\n ow Save or restore file owner and group" #define MCHelpSwP L"\n p[password] Set password" -#define MCHelpSwPm L"\n p- Do not query password" #define MCHelpSwQO L"\n qo[-|+] Add quick open information [none|force]" #define MCHelpSwR L"\n r Recurse subdirectories" #define MCHelpSwRm L"\n r- Disable recursion" @@ -272,6 +273,9 @@ #define MListMtime L"mtime" #define MListCtime L"ctime" #define MListAtime L"atime" +#define MListModified L"Modified" +#define MListCreated L"Created" +#define MListAccessed L"Accessed" #define MListAttr L"Attributes" #define MListFlags L"Flags" #define MListCompInfo L"Compression" @@ -385,3 +389,8 @@ #define MErrReadTrunc L"\n%s is archived incompletely because of read error.\n" #define MErrReadCount L"\n%u files are archived incompletely because of read errors." #define MDirNameExists L"\nDirectory with such name already exists" +#define MStdinNoInput L"\nKeyboard input is not allowed when reading data from stdin" +#define MTruncPsw L"\nPassword exceeds the maximum allowed length of %u characters and will be truncated." +#define MAdjustValue L"\nAdjusting %s value to %s." +#define MOpFailed L"\nOperation failed" +#define MSkipEncArc L"\nSkipping the encrypted archive %s" diff --git a/vendor/unrar/options.hpp b/vendor/unrar/options.hpp index 993b219633..113195828b 100644 --- a/vendor/unrar/options.hpp +++ b/vendor/unrar/options.hpp @@ -116,9 +116,11 @@ class RAROptions RAR_CHARSET ErrlogCharset; RAR_CHARSET RedirectCharset; - wchar ArcPath[NM]; + wchar ArcPath[NM]; // For -ap. + wchar ExclArcPath[NM]; // For -ep4 switch. SecPassword Password; bool EncryptHeaders; + bool SkipEncrypted; bool ManualPassword; // Password entered manually during operation, might need to clean for next archive. @@ -195,7 +197,11 @@ class RAROptions EXTTIME_MODE xctime; EXTTIME_MODE xatime; bool PreserveAtime; - wchar CompressStdin[NM]; + + // Read data from stdin and store in archive under a name specified here + // when archiving. Read an archive from stdin if any non-empty string + // is specified here when extracting. + wchar UseStdin[NM]; uint Threads; // We use it to init hash even if RAR_SMP is not defined. diff --git a/vendor/unrar/os.hpp b/vendor/unrar/os.hpp index b69f34878b..7df3c6c0da 100644 --- a/vendor/unrar/os.hpp +++ b/vendor/unrar/os.hpp @@ -36,12 +36,11 @@ // re-definition warnings in third party projects. #ifndef UNICODE #define UNICODE +#define _UNICODE // Set _T() macro to convert from narrow to wide strings. #endif -#undef WINVER -#undef _WIN32_WINNT -#define WINVER 0x0501 -#define _WIN32_WINNT 0x0501 +#define WINVER _WIN32_WINNT_WINXP +#define _WIN32_WINNT _WIN32_WINNT_WINXP #if !defined(ZIPSFX) #define RAR_SMP @@ -79,8 +78,11 @@ #include #include - #define USE_SSE - #define SSE_ALIGNMENT 16 + // Use SSE only for x86/x64, not ARM Windows. + #if defined(_M_IX86) || defined(_M_X64) + #define USE_SSE + #define SSE_ALIGNMENT 16 + #endif #else #include #endif // _MSC_VER @@ -212,7 +214,8 @@ #endif #endif -#if _POSIX_C_SOURCE >= 200809L +// Unlike Apple x64, utimensat shall be available in all Apple M1 systems. +#if _POSIX_C_SOURCE >= 200809L || defined(__APPLE__) && defined(__arm64__) #define UNIX_TIME_NS // Nanosecond time precision in Unix. #endif diff --git a/vendor/unrar/pathfn.cpp b/vendor/unrar/pathfn.cpp index 18f70982e3..983bd74379 100644 --- a/vendor/unrar/pathfn.cpp +++ b/vendor/unrar/pathfn.cpp @@ -5,7 +5,7 @@ wchar* PointToName(const wchar *Path) for (int I=(int)wcslen(Path)-1;I>=0;I--) if (IsPathDiv(Path[I])) return (wchar*)&Path[I+1]; - return (wchar*)((*Path && IsDriveDiv(Path[1])) ? Path+2:Path); + return (wchar*)((*Path!=0 && IsDriveDiv(Path[1])) ? Path+2:Path); } @@ -319,6 +319,9 @@ void GetConfigName(const wchar *Name,wchar *FullName,size_t MaxSize,bool CheckEx // of file name if numeric part is missing. wchar* GetVolNumPart(const wchar *ArcName) { + // We do not want to increment any characters in path component. + ArcName=PointToName(ArcName); + if (*ArcName==0) return (wchar *)ArcName; @@ -342,7 +345,7 @@ wchar* GetVolNumPart(const wchar *ArcName) { // Validate the first numeric part only if it has a dot somewhere // before it. - wchar *Dot=wcschr(PointToName(ArcName),'.'); + const wchar *Dot=wcschr(ArcName,'.'); if (Dot!=NULL && Dot0 && CurChar=='M') { // Replace minutes with 'I'. We use 'M' both for months and minutes, - // so we treat as minutes only those 'M' which are found after hours. + // so we treat as minutes only those 'M', which are found after hours. Mask[I]='I'; + MAsMinutes--; } if (CurChar=='N') { @@ -776,7 +783,9 @@ static void GenArcName(wchar *ArcName,size_t MaxSize,const wchar *GenerateMask,u const wchar *MaskChars=L"YMDHISWAEN"; + // How many times every modifier character was encountered in the mask. int CField[sizeof(Field)/sizeof(Field[0])]; + memset(CField,0,sizeof(CField)); QuoteMode=false; for (uint I=0;Mask[I]!=0;I++) @@ -818,13 +827,22 @@ static void GenArcName(wchar *ArcName,size_t MaxSize,const wchar *GenerateMask,u { size_t FieldPos=ChPtr-MaskChars; int CharPos=(int)strlen(Field[FieldPos])-CField[FieldPos]--; - if (FieldPos==1 && toupperw(Mask[I+1])=='M' && toupperw(Mask[I+2])=='M') + + // CField[FieldPos] shall have exactly 3 "MMM" symbols, so we do not + // repeat the month name in case "MMMMMMMM" mask. But since we + // decremented CField[FieldPos] above, we compared it with 2. + if (FieldPos==1 && CField[FieldPos]==2 && + toupperw(Mask[I+1])=='M' && toupperw(Mask[I+2])=='M') { wcsncpyz(DateText+J,GetMonthName(rlt.Month-1),ASIZE(DateText)-J); J=wcslen(DateText); I+=2; continue; } + // If CharPos is negative, we have more modifier characters than + // matching time data. We prefer to issue a modifier character + // instead of repeating time data from beginning, so user can notice + // excessive modifiers added by mistake. if (CharPos<0) DateText[J]=Mask[I]; else @@ -987,9 +1005,9 @@ void ConvertToPrecomposed(wchar *Name,size_t NameSize) } -// Remove trailing spaces and dots in file name and in dir names in path. -void MakeNameCompatible(wchar *Name) +void MakeNameCompatible(wchar *Name,size_t MaxSize) { + // Remove trailing spaces and dots in file name and in dir names in path. int Src=0,Dest=0; while (true) { @@ -1007,5 +1025,47 @@ void MakeNameCompatible(wchar *Name) Src++; Dest++; } + + // Rename reserved device names, such as aux.txt to _aux.txt. + // We check them in path components too, where they are also prohibited. + for (uint I=0;Name[I]!=0;I++) + if (I==0 || I>0 && IsPathDiv(Name[I-1])) + { + static const wchar *Devices[]={L"CON",L"PRN",L"AUX",L"NUL",L"COM#",L"LPT#"}; + wchar *s=Name+I; + bool MatchFound=false; + for (uint J=0;JI+1) // I+1, because we do not move the trailing 0. + memmove(s+1,s,(MaxSize-I-1)*sizeof(*s)); + *s='_'; +#ifndef SFX_MODULE + uiMsg(UIMSG_CORRECTINGNAME,nullptr); + uiMsg(UIERROR_RENAMING,nullptr,OrigName,Name); +#endif + } + } } #endif + + diff --git a/vendor/unrar/pathfn.hpp b/vendor/unrar/pathfn.hpp index 63813d8a40..efb283301d 100644 --- a/vendor/unrar/pathfn.hpp +++ b/vendor/unrar/pathfn.hpp @@ -70,7 +70,8 @@ void GenerateArchiveName(wchar *ArcName,size_t MaxSize,const wchar *GenerateMask #ifdef _WIN_ALL bool GetWinLongPath(const wchar *Src,wchar *Dest,size_t MaxSize); void ConvertToPrecomposed(wchar *Name,size_t NameSize); -void MakeNameCompatible(wchar *Name); +void MakeNameCompatible(wchar *Name,size_t MaxSize); #endif + #endif diff --git a/vendor/unrar/rar.hpp b/vendor/unrar/rar.hpp index 3f7414c87d..20e32fb238 100644 --- a/vendor/unrar/rar.hpp +++ b/vendor/unrar/rar.hpp @@ -16,6 +16,7 @@ #include "errhnd.hpp" #include "secpassword.hpp" #include "array.hpp" +#include "strlist.hpp" #include "timefn.hpp" #include "sha1.hpp" #include "sha256.hpp" @@ -28,7 +29,6 @@ #include "headers.hpp" #include "pathfn.hpp" #include "strfn.hpp" -#include "strlist.hpp" #ifdef _WIN_ALL #include "isnt.hpp" #endif diff --git a/vendor/unrar/rdwrfn.cpp b/vendor/unrar/rdwrfn.cpp index 66a68fc749..5e13ae6547 100644 --- a/vendor/unrar/rdwrfn.cpp +++ b/vendor/unrar/rdwrfn.cpp @@ -16,6 +16,7 @@ void ComprDataIO::Init() UnpackFromMemory=false; UnpackToMemory=false; UnpPackedSize=0; + UnpPackedLeft=0; ShowProgress=true; TestMode=false; SkipUnpCRC=false; @@ -35,7 +36,9 @@ void ComprDataIO::Init() SubHead=NULL; SubHeadPos=NULL; CurrentCommand=0; - ProcessedArcSize=TotalArcSize=0; + ProcessedArcSize=0; + LastArcSize=0; + TotalArcSize=0; } @@ -75,10 +78,10 @@ int ComprDataIO::UnpRead(byte *Addr,size_t Count) } else { - size_t SizeToRead=((int64)Count>UnpPackedSize) ? (size_t)UnpPackedSize:Count; + size_t SizeToRead=((int64)Count>UnpPackedLeft) ? (size_t)UnpPackedLeft:Count; if (SizeToRead > 0) { - if (UnpVolume && Decryption && (int64)Count>UnpPackedSize) + if (UnpVolume && Decryption && (int64)Count>UnpPackedLeft) { // We need aligned blocks for decryption and we want "Keep broken // files" to work efficiently with missing encrypted volumes. @@ -109,7 +112,7 @@ int ComprDataIO::UnpRead(byte *Addr,size_t Count) ReadAddr+=ReadSize; Count-=ReadSize; #endif - UnpPackedSize-=ReadSize; + UnpPackedLeft-=ReadSize; // Do not ask for next volume if we read something from current volume. // If next volume is missing, we need to process all data from current @@ -118,7 +121,7 @@ int ComprDataIO::UnpRead(byte *Addr,size_t Count) // we ask for next volume also if we have non-aligned encryption block. // Since we adjust data size for decryption earlier above, // it does not hurt "Keep broken files" mode efficiency. - if (UnpVolume && UnpPackedSize == 0 && + if (UnpVolume && UnpPackedLeft == 0 && (ReadSize==0 || Decryption && (TotalRead & CRYPT_BLOCK_MASK) != 0) ) { #ifndef NOVOLUME @@ -134,7 +137,7 @@ int ComprDataIO::UnpRead(byte *Addr,size_t Count) } Archive *SrcArc=(Archive *)SrcFile; if (SrcArc!=NULL) - ShowUnpRead(SrcArc->CurBlockPos+CurUnpRead,UnpArcSize); + ShowUnpRead(SrcArc->NextBlockPos-UnpPackedSize+CurUnpRead,TotalArcSize); if (ReadSize!=-1) { ReadSize=TotalRead; @@ -148,13 +151,6 @@ int ComprDataIO::UnpRead(byte *Addr,size_t Count) } -#if defined(RARDLL) && defined(_MSC_VER) && !defined(_WIN_64) -// Disable the run time stack check for unrar.dll, so we can manipulate -// with ProcessDataProc call type below. Run time check would intercept -// a wrong ESP before we restore it. -#pragma runtime_checks( "s", off ) -#endif - void ComprDataIO::UnpWrite(byte *Addr,size_t Count) { @@ -167,28 +163,7 @@ void ComprDataIO::UnpWrite(byte *Addr,size_t Count) ErrHandler.Exit(RARX_USERBREAK); if (Cmd->ProcessDataProc!=NULL) { - // Here we preserve ESP value. It is necessary for those developers, - // who still define ProcessDataProc callback as "C" type function, - // even though in year 2001 we announced in unrar.dll whatsnew.txt - // that it will be PASCAL type (for compatibility with Visual Basic). -#if defined(_MSC_VER) -#ifndef _WIN_64 - __asm mov ebx,esp -#endif -#elif defined(_WIN_ALL) && defined(__BORLANDC__) - _EBX=_ESP; -#endif int RetCode=Cmd->ProcessDataProc(Addr,(int)Count); - - // Restore ESP after ProcessDataProc with wrongly defined calling - // convention broken it. -#if defined(_MSC_VER) -#ifndef _WIN_64 - __asm mov esp,ebx -#endif -#elif defined(_WIN_ALL) && defined(__BORLANDC__) - _ESP=_EBX; -#endif if (RetCode==0) ErrHandler.Exit(RARX_USERBREAK); } @@ -216,11 +191,6 @@ void ComprDataIO::UnpWrite(byte *Addr,size_t Count) Wait(); } -#if defined(RARDLL) && defined(_MSC_VER) && !defined(_WIN_64) -// Restore the run time stack check for unrar.dll. -#pragma runtime_checks( "s", restore ) -#endif - @@ -230,12 +200,8 @@ void ComprDataIO::ShowUnpRead(int64 ArcPos,int64 ArcSize) { if (ShowProgress && SrcFile!=NULL) { - if (TotalArcSize!=0) - { - // important when processing several archives or multivolume archive - ArcSize=TotalArcSize; - ArcPos+=ProcessedArcSize; - } + // Important when processing several archives or multivolume archive. + ArcPos+=ProcessedArcSize; Archive *SrcArc=(Archive *)SrcFile; RAROptions *Cmd=SrcArc->GetRAROptions(); @@ -319,3 +285,38 @@ void ComprDataIO::SetUnpackToMemory(byte *Addr,uint Size) UnpackToMemoryAddr=Addr; UnpackToMemorySize=Size; } + + +// Extraction progress is based on the position in archive and we adjust +// the total archives size here, so trailing blocks do not prevent progress +// reaching 100% at the end of extraction. Alternatively we could print "100%" +// after completing the entire archive extraction, but then we would need +// to take into account possible messages like the checksum error after +// last file percent progress. +void ComprDataIO::AdjustTotalArcSize(Archive *Arc) +{ + // If we know a position of QO or RR blocks, use them to adjust the total + // packed size to beginning of these blocks. Earlier we already calculated + // the total size based on entire archive sizes. We also set LastArcSize + // to start of first trailing block, to add it later to ProcessedArcSize. + int64 ArcLength=Arc->IsSeekable() ? Arc->FileLength() : 0; + if (Arc->MainHead.QOpenOffset!=0) // QO is always preceding RR record. + LastArcSize=Arc->MainHead.QOpenOffset; + else + if (Arc->MainHead.RROffset!=0) + LastArcSize=Arc->MainHead.RROffset; + else + { + // If neither QO nor RR are found, exclude the approximate size of + // end of archive block. + // We select EndBlock to be larger than typical 8 bytes HEAD_ENDARC, + // but to not exceed the smallest 22 bytes HEAD_FILE with 1 byte file + // name, so we do not have two files with 100% at the end of archive. + const uint EndBlock=23; + + if (ArcLength>EndBlock) + LastArcSize=ArcLength-EndBlock; + } + + TotalArcSize-=ArcLength-LastArcSize; +} diff --git a/vendor/unrar/rdwrfn.hpp b/vendor/unrar/rdwrfn.hpp index fc38fd3092..3060a0ff3f 100644 --- a/vendor/unrar/rdwrfn.hpp +++ b/vendor/unrar/rdwrfn.hpp @@ -1,6 +1,7 @@ #ifndef _RAR_DATAIO_ #define _RAR_DATAIO_ +class Archive; class CmdAdd; class Unpack; class ArcFileSearch; @@ -29,6 +30,7 @@ class ComprDataIO byte *UnpWrAddr; int64 UnpPackedSize; + int64 UnpPackedLeft; bool ShowProgress; bool TestMode; @@ -61,7 +63,7 @@ class ComprDataIO void UnpWrite(byte *Addr,size_t Count); void EnableShowProgress(bool Show) {ShowProgress=Show;} void GetUnpackedData(byte **Data,size_t *Size); - void SetPackedSizeToRead(int64 Size) {UnpPackedSize=Size;} + void SetPackedSizeToRead(int64 Size) {UnpPackedSize=UnpPackedLeft=Size;} void SetTestMode(bool Mode) {TestMode=Mode;} void SetSkipUnpCRC(bool Skip) {SkipUnpCRC=Skip;} void SetNoFileHeader(bool Mode) {NoFileHeader=Mode;} @@ -74,12 +76,12 @@ class ComprDataIO void SetCmt13Encryption(); void SetUnpackToMemory(byte *Addr,uint Size); void SetCurrentCommand(wchar Cmd) {CurrentCommand=Cmd;} + void AdjustTotalArcSize(Archive *Arc); bool PackVolume; bool UnpVolume; bool NextVolumeMissing; - int64 UnpArcSize; int64 CurPackRead,CurPackWrite,CurUnpRead,CurUnpWrite; @@ -87,6 +89,9 @@ class ComprDataIO // Used to calculate the total operation progress. int64 ProcessedArcSize; + // Last extracted archive size up to QO or RR block. + int64 LastArcSize; + int64 TotalArcSize; DataHash PackedDataHash; // Packed write and unpack read hash. diff --git a/vendor/unrar/recvol5.cpp b/vendor/unrar/recvol5.cpp index 3c524d8ee0..596ea06f10 100644 --- a/vendor/unrar/recvol5.cpp +++ b/vendor/unrar/recvol5.cpp @@ -1,5 +1,9 @@ static const uint MaxVolumes=65535; +// We select this limit arbitrarily, to prevent user creating too many +// rev files by mistake. +#define MAX_REV_TO_DATA_RATIO 10 // 1000% of rev files. + RecVolumes5::RecVolumes5(RAROptions *Cmd,bool TestOnly) { RealBuf=NULL; @@ -145,13 +149,16 @@ bool RecVolumes5::Restore(RAROptions *Cmd,const wchar *Name,bool Silent) wchar *Num=GetVolNumPart(ArcName); while (Num>ArcName && IsDigit(*(Num-1))) Num--; - if (Num==ArcName) + if (Num<=PointToName(ArcName)) return false; // Numeric part is missing or entire volume name is numeric, not possible for RAR or REV volume. wcsncpyz(Num,L"*.*",ASIZE(ArcName)-(Num-ArcName)); wchar FirstVolName[NM]; *FirstVolName=0; + wchar LongestRevName[NM]; + *LongestRevName=0; + int64 RecFileSize=0; FindFile VolFind; @@ -164,7 +171,7 @@ bool RecVolumes5::Restore(RAROptions *Cmd,const wchar *Name,bool Silent) Archive *Vol=new Archive(Cmd); int ItemPos=-1; - if (Vol->WOpen(fd.Name)) + if (!fd.IsDir && Vol->WOpen(fd.Name)) { if (CmpExt(fd.Name,L"rev")) { @@ -176,6 +183,9 @@ bool RecVolumes5::Restore(RAROptions *Cmd,const wchar *Name,bool Silent) ItemPos=RecNum; FoundRecVolumes++; + + if (wcslen(fd.Name)>wcslen(LongestRevName)) + wcsncpyz(LongestRevName,fd.Name,ASIZE(LongestRevName)); } } else @@ -231,6 +241,15 @@ bool RecVolumes5::Restore(RAROptions *Cmd,const wchar *Name,bool Silent) if (FoundRecVolumes==0) return false; + // If we did not find even a single .rar volume, create .rar volume name + // based on the longest .rev file name. Use longest .rev, so we have + // enough space for volume number. + if (*FirstVolName==0) + { + SetExt(LongestRevName,L"rar",ASIZE(LongestRevName)); + VolNameToFirstName(LongestRevName,FirstVolName,ASIZE(FirstVolName),true); + } + uiMsg(UIMSG_RECVOLCALCCHECKSUM); MissingVolumes=0; @@ -301,7 +320,7 @@ bool RecVolumes5::Restore(RAROptions *Cmd,const wchar *Name,bool Silent) Item->f=NULL; } - if ((Item->New=(Item->f==NULL))) // Additional parentheses to avoid GCC warning. + if ((Item->New=(Item->f==NULL))==true) { wcsncpyz(Item->Name,FirstVolName,ASIZE(Item->Name)); uiMsg(UIMSG_CREATING,Item->Name); @@ -316,7 +335,6 @@ bool RecVolumes5::Restore(RAROptions *Cmd,const wchar *Name,bool Silent) } NewVol->Prealloc(Item->FileSize); Item->f=NewVol; - Item->New=true; } NextVolumeName(FirstVolName,ASIZE(FirstVolName),false); } @@ -346,13 +364,11 @@ bool RecVolumes5::Restore(RAROptions *Cmd,const wchar *Name,bool Silent) RecBufferSize&=~(SSE_ALIGNMENT-1); // Align for SSE. #endif - uint *Data=new uint[TotalCount]; - RSCoder16 RS; if (!RS.Init(DataCount,RecCount,ValidFlags)) { + uiMsg(UIERROR_OPFAILED); delete[] ValidFlags; - delete[] Data; return false; // Should not happen, we check parameter validity above. } @@ -415,7 +431,6 @@ bool RecVolumes5::Restore(RAROptions *Cmd,const wchar *Name,bool Silent) RecItems[I].f->Close(); delete[] ValidFlags; - delete[] Data; #if !defined(SILENT) if (!Cmd->DisablePercentage) mprintf(L"\b\b\b\b100%%"); diff --git a/vendor/unrar/rijndael.cpp b/vendor/unrar/rijndael.cpp index dd19750a39..48ac1723bc 100644 --- a/vendor/unrar/rijndael.cpp +++ b/vendor/unrar/rijndael.cpp @@ -1,22 +1,41 @@ -/*************************************************************************** - * This code is based on public domain Szymon Stefanek AES implementation: * - * http://www.pragmaware.net/software/rijndael/index.php * - * * - * Dynamic tables generation is based on the Brian Gladman work: * - * http://fp.gladman.plus.com/cryptography_technology/rijndael * - ***************************************************************************/ +/************************************************************************** + * This code is based on Szymon Stefanek public domain AES implementation * + **************************************************************************/ #include "rar.hpp" #ifdef USE_SSE #include #endif -static byte S[256],S5[256],rcon[30]; +static byte S[256]= +{ + 99, 124, 119, 123, 242, 107, 111, 197, 48, 1, 103, 43, 254, 215, 171, 118, + 202, 130, 201, 125, 250, 89, 71, 240, 173, 212, 162, 175, 156, 164, 114, 192, + 183, 253, 147, 38, 54, 63, 247, 204, 52, 165, 229, 241, 113, 216, 49, 21, + 4, 199, 35, 195, 24, 150, 5, 154, 7, 18, 128, 226, 235, 39, 178, 117, + 9, 131, 44, 26, 27, 110, 90, 160, 82, 59, 214, 179, 41, 227, 47, 132, + 83, 209, 0, 237, 32, 252, 177, 91, 106, 203, 190, 57, 74, 76, 88, 207, + 208, 239, 170, 251, 67, 77, 51, 133, 69, 249, 2, 127, 80, 60, 159, 168, + 81, 163, 64, 143, 146, 157, 56, 245, 188, 182, 218, 33, 16, 255, 243, 210, + 205, 12, 19, 236, 95, 151, 68, 23, 196, 167, 126, 61, 100, 93, 25, 115, + 96, 129, 79, 220, 34, 42, 144, 136, 70, 238, 184, 20, 222, 94, 11, 219, + 224, 50, 58, 10, 73, 6, 36, 92, 194, 211, 172, 98, 145, 149, 228, 121, + 231, 200, 55, 109, 141, 213, 78, 169, 108, 86, 244, 234, 101, 122, 174, 8, + 186, 120, 37, 46, 28, 166, 180, 198, 232, 221, 116, 31, 75, 189, 139, 138, + 112, 62, 181, 102, 72, 3, 246, 14, 97, 53, 87, 185, 134, 193, 29, 158, + 225, 248, 152, 17, 105, 217, 142, 148, 155, 30, 135, 233, 206, 85, 40, 223, + 140, 161, 137, 13, 191, 230, 66, 104, 65, 153, 45, 15, 176, 84, 187, 22 +}; + +static byte S5[256]; + +// Round constants. 10 items are used by AES-128, 8 by AES-192, 7 by AES-256. +static byte rcon[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x1b,0x36}; + static byte T1[256][4],T2[256][4],T3[256][4],T4[256][4]; static byte T5[256][4],T6[256][4],T7[256][4],T8[256][4]; static byte U1[256][4],U2[256][4],U3[256][4],U4[256][4]; - inline void Xor128(void *dest,const void *arg1,const void *arg2) { #ifdef ALLOW_MISALIGNED @@ -63,7 +82,7 @@ inline void Copy128(byte *dest,const byte *src) Rijndael::Rijndael() { - if (S[0]==0) + if (S5[0]==0) GenerateTables(); CBCMode = true; // Always true for RAR. } @@ -82,7 +101,7 @@ void Rijndael::Init(bool Encrypt,const byte *key,uint keyLen,const byte * initVe AES_NI=(CPUInfo[2] & 0x2000000)!=0; } else - AES_NI=0; + AES_NI=false; #endif // Other developers asked us to initialize it to suppress "may be used @@ -416,51 +435,40 @@ void Rijndael::keyEncToDec() } -#define ff_poly 0x011b -#define ff_hi 0x80 - -#define FFinv(x) ((x) ? pow[255 - log[x]]: 0) - -#define FFmul02(x) (x ? pow[log[x] + 0x19] : 0) -#define FFmul03(x) (x ? pow[log[x] + 0x01] : 0) -#define FFmul09(x) (x ? pow[log[x] + 0xc7] : 0) -#define FFmul0b(x) (x ? pow[log[x] + 0x68] : 0) -#define FFmul0d(x) (x ? pow[log[x] + 0xee] : 0) -#define FFmul0e(x) (x ? pow[log[x] + 0xdf] : 0) -#define fwd_affine(x) \ - (w = (uint)x, w ^= (w<<1)^(w<<2)^(w<<3)^(w<<4), (byte)(0x63^(w^(w>>8)))) +static byte gmul(byte a, byte b) // Galois field "peasant's algorithm" multiplication. +{ + const byte poly=0x1b; // Lower byte of AES 0x11b irreducible polynomial. + byte result = 0; + while (b>0) + { + if ((b & 1) != 0) + result ^= a; + a = (a & 0x80) ? (a<<1)^poly : a<<1; + b >>= 1; + } + return result; +} -#define inv_affine(x) \ - (w = (uint)x, w = (w<<1)^(w<<3)^(w<<6), (byte)(0x05^(w^(w>>8)))) +// 2021-09-24: changed to slower and simpler code without interim tables. +// It is still fast enough for our purpose. void Rijndael::GenerateTables() { - unsigned char pow[512],log[256]; - int i = 0, w = 1; - do - { - pow[i] = (byte)w; - pow[i + 255] = (byte)w; - log[w] = (byte)i++; - w ^= (w << 1) ^ (w & ff_hi ? ff_poly : 0); - } while (w != 1); - - for (int i = 0,w = 1; i < sizeof(rcon)/sizeof(rcon[0]); i++) - { - rcon[i] = w; - w = (w << 1) ^ (w & ff_hi ? ff_poly : 0); - } - for(int i = 0; i < 256; ++i) + for (int I=0;I<256;I++) + S5[S[I]]=I; + + for (int I=0;I<256;I++) { - unsigned char b=S[i]=fwd_affine(FFinv((byte)i)); - T1[i][1]=T1[i][2]=T2[i][2]=T2[i][3]=T3[i][0]=T3[i][3]=T4[i][0]=T4[i][1]=b; - T1[i][0]=T2[i][1]=T3[i][2]=T4[i][3]=FFmul02(b); - T1[i][3]=T2[i][0]=T3[i][1]=T4[i][2]=FFmul03(b); - S5[i] = b = FFinv(inv_affine((byte)i)); - U1[b][3]=U2[b][0]=U3[b][1]=U4[b][2]=T5[i][3]=T6[i][0]=T7[i][1]=T8[i][2]=FFmul0b(b); - U1[b][1]=U2[b][2]=U3[b][3]=U4[b][0]=T5[i][1]=T6[i][2]=T7[i][3]=T8[i][0]=FFmul09(b); - U1[b][2]=U2[b][3]=U3[b][0]=U4[b][1]=T5[i][2]=T6[i][3]=T7[i][0]=T8[i][1]=FFmul0d(b); - U1[b][0]=U2[b][1]=U3[b][2]=U4[b][3]=T5[i][0]=T6[i][1]=T7[i][2]=T8[i][3]=FFmul0e(b); + byte s=S[I]; + T1[I][1]=T1[I][2]=T2[I][2]=T2[I][3]=T3[I][0]=T3[I][3]=T4[I][0]=T4[I][1]=s; + T1[I][0]=T2[I][1]=T3[I][2]=T4[I][3]=gmul(s,2); + T1[I][3]=T2[I][0]=T3[I][1]=T4[I][2]=gmul(s,3); + + byte b=S5[I]; + U1[b][3]=U2[b][0]=U3[b][1]=U4[b][2]=T5[I][3]=T6[I][0]=T7[I][1]=T8[I][2]=gmul(b,0xb); + U1[b][1]=U2[b][2]=U3[b][3]=U4[b][0]=T5[I][1]=T6[I][2]=T7[I][3]=T8[I][0]=gmul(b,0x9); + U1[b][2]=U2[b][3]=U3[b][0]=U4[b][1]=T5[I][2]=T6[I][3]=T7[I][0]=T8[I][1]=gmul(b,0xd); + U1[b][0]=U2[b][1]=U3[b][2]=U4[b][3]=T5[I][0]=T6[I][1]=T7[I][2]=T8[I][3]=gmul(b,0xe); } } diff --git a/vendor/unrar/rijndael.hpp b/vendor/unrar/rijndael.hpp index 2144e02e5f..797899ffb7 100644 --- a/vendor/unrar/rijndael.hpp +++ b/vendor/unrar/rijndael.hpp @@ -2,11 +2,7 @@ #define _RIJNDAEL_H_ /************************************************************************** - * This code is based on Szymon Stefanek AES implementation: * - * http://www.esat.kuleuven.ac.be/~rijmen/rijndael/rijndael-cpplib.tar.gz * - * * - * Dynamic tables generation is based on the Brian Gladman's work: * - * http://fp.gladman.plus.com/cryptography_technology/rijndael * + * This code is based on Szymon Stefanek public domain AES implementation * **************************************************************************/ #define _MAX_KEY_COLUMNS (256/32) diff --git a/vendor/unrar/rs16.cpp b/vendor/unrar/rs16.cpp index bc8dd09379..f5c7ccac18 100644 --- a/vendor/unrar/rs16.cpp +++ b/vendor/unrar/rs16.cpp @@ -95,7 +95,9 @@ bool RSCoder16::Init(uint DataCount, uint RecCount, bool *ValidityFlags) if (NE > ValidECC || NE == 0 || ValidECC == 0) return false; } - if (ND + NR > gfSize || NR > ND || ND == 0 || NR == 0) + + // 2021.09.01 - we allowed RR and REV >100%, so no more NR > ND check. + if (ND + NR > gfSize || /*NR > ND ||*/ ND == 0 || NR == 0) return false; delete[] MX; diff --git a/vendor/unrar/strfn.cpp b/vendor/unrar/strfn.cpp index 8904b9072e..f53c826ace 100644 --- a/vendor/unrar/strfn.cpp +++ b/vendor/unrar/strfn.cpp @@ -121,48 +121,26 @@ wchar* RemoveLF(wchar *Str) } -unsigned char loctolower(unsigned char ch) -{ -#if defined(_WIN_ALL) - // Convert to LPARAM first to avoid a warning in 64 bit mode. - // Convert to uintptr_t to avoid Clang/win error: cast to 'char *' from smaller integer type 'unsigned char' [-Werror,-Wint-to-pointer-cast] - return (int)(LPARAM)CharLowerA((LPSTR)(uintptr_t)ch); -#else - return tolower(ch); -#endif -} - - -unsigned char loctoupper(unsigned char ch) -{ -#if defined(_WIN_ALL) - // Convert to LPARAM first to avoid a warning in 64 bit mode. - // Convert to uintptr_t to avoid Clang/win error: cast to 'char *' from smaller integer type 'unsigned char' [-Werror,-Wint-to-pointer-cast] - return (int)(LPARAM)CharUpperA((LPSTR)(uintptr_t)ch); -#else - return toupper(ch); -#endif -} - - -// toupper with English only results if English input is provided. -// It avoids Turkish (small i) -> (big I with dot) conversion problem. -// We do not define 'ch' as 'int' to avoid necessity to cast all +#if defined(SFX_MODULE) +// char version of etoupperw. Used in console SFX module only. +// Fast toupper for English only input and output. Additionally to speed, +// it also avoids Turkish small i to big I with dot conversion problem. +// We do not define 'c' as 'int' to avoid necessity to cast all // signed chars passed to this function to unsigned char. -unsigned char etoupper(unsigned char ch) +unsigned char etoupper(unsigned char c) { - if (ch=='i') - return 'I'; - return toupper(ch); + return c>='a' && c<='z' ? c-'a'+'A' : c; } +#endif -// Unicode version of etoupper. -wchar etoupperw(wchar ch) +// Fast toupper for English only input and output. Additionally to speed, +// it also avoids Turkish small i to big I with dot conversion problem. +// We do not define 'c' as 'int' to avoid necessity to cast all +// signed wchars passed to this function to unsigned char. +wchar etoupperw(wchar c) { - if (ch=='i') - return 'I'; - return toupperw(ch); + return c>='a' && c<='z' ? c-'a'+'A' : c; } diff --git a/vendor/unrar/strfn.hpp b/vendor/unrar/strfn.hpp index 2984f8c334..324703102c 100644 --- a/vendor/unrar/strfn.hpp +++ b/vendor/unrar/strfn.hpp @@ -13,16 +13,16 @@ int stricomp(const char *s1,const char *s2); int strnicomp(const char *s1,const char *s2,size_t n); wchar* RemoveEOL(wchar *Str); wchar* RemoveLF(wchar *Str); -unsigned char loctolower(unsigned char ch); -unsigned char loctoupper(unsigned char ch); void strncpyz(char *dest, const char *src, size_t maxlen); void wcsncpyz(wchar *dest, const wchar *src, size_t maxlen); void strncatz(char* dest, const char* src, size_t maxlen); void wcsncatz(wchar* dest, const wchar* src, size_t maxlen); -unsigned char etoupper(unsigned char ch); -wchar etoupperw(wchar ch); +#if defined(SFX_MODULE) +unsigned char etoupper(unsigned char c); +#endif +wchar etoupperw(wchar c); bool IsDigit(int ch); bool IsSpace(int ch); diff --git a/vendor/unrar/timefn.cpp b/vendor/unrar/timefn.cpp index e86d41a11e..0abf49de97 100644 --- a/vendor/unrar/timefn.cpp +++ b/vendor/unrar/timefn.cpp @@ -273,12 +273,12 @@ void RarTime::SetAgeText(const wchar *TimeText) uint Seconds=0,Value=0; for (uint I=0;TimeText[I]!=0;I++) { - int Ch=TimeText[I]; + wchar Ch=TimeText[I]; if (IsDigit(Ch)) Value=Value*10+Ch-'0'; else { - switch(etoupper(Ch)) + switch(etoupperw(Ch)) { case 'D': Seconds+=Value*24*3600; diff --git a/vendor/unrar/ui.hpp b/vendor/unrar/ui.hpp index 2654387c28..8fc76aa800 100644 --- a/vendor/unrar/ui.hpp +++ b/vendor/unrar/ui.hpp @@ -39,7 +39,7 @@ enum UIMESSAGE_CODE { UIERROR_UOWNERBROKEN, UIERROR_UOWNERGETOWNERID, UIERROR_UOWNERGETGROUPID, UIERROR_UOWNERSET, UIERROR_ULINKREAD, UIERROR_ULINKEXIST, UIERROR_OPENPRESERVEATIME, UIERROR_READERRTRUNCATED, UIERROR_READERRCOUNT, - UIERROR_DIRNAMEEXISTS, + UIERROR_DIRNAMEEXISTS,UIERROR_TRUNCPSW,UIERROR_ADJUSTVALUE, UIMSG_FIRST, UIMSG_STRING, UIMSG_BUILD, UIMSG_RRSEARCH, UIMSG_ANALYZEFILEDATA, @@ -49,6 +49,7 @@ enum UIMESSAGE_CODE { UIMSG_CORRECTINGNAME, UIMSG_BADARCHIVE, UIMSG_CREATING, UIMSG_RENAMING, UIMSG_RECVOLCALCCHECKSUM, UIMSG_RECVOLFOUND, UIMSG_RECVOLMISSING, UIMSG_MISSINGVOL, UIMSG_RECONSTRUCTING, UIMSG_CHECKSUM, UIMSG_FAT32SIZE, + UIMSG_SKIPENCARC, UIWAIT_FIRST, UIWAIT_DISKFULLNEXT, UIWAIT_FCREATEERROR, UIWAIT_BADPSW, diff --git a/vendor/unrar/uiconsole.cpp b/vendor/unrar/uiconsole.cpp index ceae1a7c53..d713fac0b6 100644 --- a/vendor/unrar/uiconsole.cpp +++ b/vendor/unrar/uiconsole.cpp @@ -71,7 +71,10 @@ bool uiStartFileExtract(const wchar *FileName,bool Extract,bool Test,bool Skip) void uiExtractProgress(int64 CurFileSize,int64 TotalFileSize,int64 CurSize,int64 TotalSize) { - int CurPercent=ToPercent(CurSize,TotalSize); + // We set the total size to 0 to update only the current progress and keep + // the total progress intact in WinRAR. Unlike WinRAR, console RAR has only + // the total progress and updates it with current values in such case. + int CurPercent=TotalSize!=0 ? ToPercent(CurSize,TotalSize) : ToPercent(CurFileSize,TotalFileSize); mprintf(L"\b\b\b\b%3d%%",CurPercent); } @@ -247,6 +250,9 @@ void uiMsgStore::Msg() mprintf(L"\n"); // Needed when called from CmdExtract::ExtractCurrentFile. break; #ifndef SFX_MODULE + case UIERROR_OPFAILED: + Log(NULL,St(MOpFailed)); + break; case UIERROR_NEWRARFORMAT: Log(Str[0],St(MNewRarFormat)); break; @@ -329,6 +335,13 @@ void uiMsgStore::Msg() case UIERROR_DIRNAMEEXISTS: Log(NULL,St(MDirNameExists)); break; + case UIERROR_TRUNCPSW: + eprintf(St(MTruncPsw),Num[0]); + eprintf(L"\n"); + break; + case UIERROR_ADJUSTVALUE: + Log(NULL,St(MAdjustValue),Str[0],Str[1]); + break; #ifndef SFX_MODULE case UIMSG_STRING: @@ -369,6 +382,9 @@ void uiMsgStore::Msg() mprintf(St(MFAT32Size)); mprintf(L" "); // For progress percent. break; + case UIMSG_SKIPENCARC: + Log(NULL,St(MSkipEncArc),Str[0]); + break; diff --git a/vendor/unrar/unicode.cpp b/vendor/unrar/unicode.cpp index 641f6c892a..5421923ff3 100644 --- a/vendor/unrar/unicode.cpp +++ b/vendor/unrar/unicode.cpp @@ -601,59 +601,6 @@ char* SupportDBCS::charnext(const char *s) // to break string processing loops. return (char *)(IsLeadByte[(byte)*s] && s[1]!=0 ? s+2:s+1); } - - -size_t SupportDBCS::strlend(const char *s) -{ - size_t Length=0; - while (*s!=0) - { - if (IsLeadByte[(byte)*s]) - s+=2; - else - s++; - Length++; - } - return(Length); -} - - -char* SupportDBCS::strchrd(const char *s, int c) -{ - while (*s!=0) - if (IsLeadByte[(byte)*s]) - s+=2; - else - if (*s==c) - return((char *)s); - else - s++; - return(NULL); -} - - -void SupportDBCS::copychrd(char *dest,const char *src) -{ - dest[0]=src[0]; - if (IsLeadByte[(byte)src[0]]) - dest[1]=src[1]; -} - - -char* SupportDBCS::strrchrd(const char *s, int c) -{ - const char *found=NULL; - while (*s!=0) - if (IsLeadByte[(byte)*s]) - s+=2; - else - { - if (*s==c) - found=s; - s++; - } - return((char *)found); -} #endif diff --git a/vendor/unrar/unicode.hpp b/vendor/unrar/unicode.hpp index 031ac09ab9..8d433c1b6b 100644 --- a/vendor/unrar/unicode.hpp +++ b/vendor/unrar/unicode.hpp @@ -33,34 +33,19 @@ class SupportDBCS public: SupportDBCS(); void Init(); - char* charnext(const char *s); - size_t strlend(const char *s); - char *strchrd(const char *s, int c); - char *strrchrd(const char *s, int c); - void copychrd(char *dest,const char *src); bool IsLeadByte[256]; bool DBCSMode; }; - extern SupportDBCS gdbcs; inline char* charnext(const char *s) {return (char *)(gdbcs.DBCSMode ? gdbcs.charnext(s):s+1);} -inline size_t strlend(const char *s) {return (uint)(gdbcs.DBCSMode ? gdbcs.strlend(s):strlen(s));} -inline char* strchrd(const char *s, int c) {return (char *)(gdbcs.DBCSMode ? gdbcs.strchrd(s,c):strchr(s,c));} -inline char* strrchrd(const char *s, int c) {return (char *)(gdbcs.DBCSMode ? gdbcs.strrchrd(s,c):strrchr(s,c));} -inline void copychrd(char *dest,const char *src) {if (gdbcs.DBCSMode) gdbcs.copychrd(dest,src); else *dest=*src;} -inline bool IsDBCSMode() {return(gdbcs.DBCSMode);} -inline void InitDBCS() {gdbcs.Init();} +inline bool IsDBCSMode() {return gdbcs.DBCSMode;} #else #define charnext(s) ((s)+1) -#define strlend strlen -#define strchrd strchr -#define strrchrd strrchr -#define IsDBCSMode() (true) -inline void copychrd(char *dest,const char *src) {*dest=*src;} +#define IsDBCSMode() (false) #endif diff --git a/vendor/unrar/unpack.hpp b/vendor/unrar/unpack.hpp index 75dadb0e0e..30a9a2ee77 100644 --- a/vendor/unrar/unpack.hpp +++ b/vendor/unrar/unpack.hpp @@ -23,8 +23,8 @@ // allocation. Must be equal or larger than MAX_ANALYZE_SIZE. #define MAX_FILTER_BLOCK_SIZE 0x400000 -// Write data in 4 MB or smaller blocks. Must not exceed PACK_MAX_WRITE, -// so we keep a number of buffered filters in unpacker reasonable. +// Write data in 4 MB or smaller blocks. Must not exceed PACK_MAX_READ, +// so we keep the number of buffered filters in unpacker reasonable. #define UNPACK_MAX_WRITE 0x400000 // Decode compressed bit fields to alphabet numbers. diff --git a/vendor/unrar/version.hpp b/vendor/unrar/version.hpp index cf1c77cb1c..72df1f8470 100644 --- a/vendor/unrar/version.hpp +++ b/vendor/unrar/version.hpp @@ -1,6 +1,6 @@ #define RARVER_MAJOR 6 -#define RARVER_MINOR 2 +#define RARVER_MINOR 11 #define RARVER_BETA 0 -#define RARVER_DAY 11 -#define RARVER_MONTH 6 -#define RARVER_YEAR 2021 +#define RARVER_DAY 3 +#define RARVER_MONTH 3 +#define RARVER_YEAR 2022 diff --git a/vendor/unrar/volume.cpp b/vendor/unrar/volume.cpp index 001a9673ae..917851de40 100644 --- a/vendor/unrar/volume.cpp +++ b/vendor/unrar/volume.cpp @@ -25,10 +25,12 @@ bool MergeArchive(Archive &Arc,ComprDataIO *DataIO,bool ShowFileName,wchar Comma uiMsg(UIERROR_CHECKSUMPACKED, Arc.FileName, hd->FileName); } + bool PrevVolEncrypted=Arc.Encrypted; + int64 PosBeforeClose=Arc.Tell(); if (DataIO!=NULL) - DataIO->ProcessedArcSize+=Arc.FileLength(); + DataIO->ProcessedArcSize+=DataIO->LastArcSize; Arc.Close(); @@ -40,12 +42,20 @@ bool MergeArchive(Archive &Arc,ComprDataIO *DataIO,bool ShowFileName,wchar Comma #if !defined(SFX_MODULE) && !defined(RARDLL) bool RecoveryDone=false; #endif - bool FailedOpen=false,OldSchemeTested=false; + bool OldSchemeTested=false; + bool FailedOpen=false; // No more next volume open attempts if true. #if !defined(SILENT) // In -vp mode we force the pause before next volume even if it is present // and even if we are on the hard disk. It is important when user does not // want to process partially downloaded volumes preliminary. + // 2022.01.11: In WinRAR 6.10 beta versions we tried to ignore VolumePause + // if we could open the next volume with FMF_OPENEXCLUSIVE. But another + // developer asked us to return the previous behavior and always prompt + // for confirmation. They want to control when unrar continues, because + // the next file might not be fully decoded yet. They write chunks of data + // and then close the file again until the next chunk comes in. + if (Cmd->VolumePause && !uiAskNextVolume(NextName,ASIZE(NextName))) FailedOpen=true; #endif @@ -127,6 +137,16 @@ bool MergeArchive(Archive &Arc,ComprDataIO *DataIO,bool ShowFileName,wchar Comma return false; #endif + if (Arc.Encrypted!=PrevVolEncrypted) + { + // There is no legitimate reason for encrypted header state to be + // changed in the middle of volume sequence. So we abort here to prevent + // replacing an encrypted header volume to unencrypted and adding + // unexpected files by third party to encrypted extraction. + uiMsg(UIERROR_BADARCHIVE,Arc.FileName); + ErrHandler.Exit(RARX_FATAL); + } + if (SplitHeader) Arc.SearchBlock(HeaderType); else @@ -151,10 +171,9 @@ bool MergeArchive(Archive &Arc,ComprDataIO *DataIO,bool ShowFileName,wchar Comma DataIO->UnpVolume=hd->SplitAfter; DataIO->SetPackedSizeToRead(hd->PackSize); } -#ifdef SFX_MODULE - DataIO->UnpArcSize=Arc.FileLength(); -#endif - + + DataIO->AdjustTotalArcSize(&Arc); + // Reset the size of packed data read from current volume. It is used // to display the total progress and preceding volumes are already // compensated with ProcessedArcSize, so we need to reset this variable. @@ -171,13 +190,6 @@ bool MergeArchive(Archive &Arc,ComprDataIO *DataIO,bool ShowFileName,wchar Comma #ifdef RARDLL -#if defined(RARDLL) && defined(_MSC_VER) && !defined(_WIN_64) -// Disable the run time stack check for unrar.dll, so we can manipulate -// with ChangeVolProc call type below. Run time check would intercept -// a wrong ESP before we restore it. -#pragma runtime_checks( "s", off ) -#endif - bool DllVolChange(RAROptions *Cmd,wchar *NextName,size_t NameSize) { bool DllVolChanged=false,DllVolAborted=false; @@ -212,28 +224,7 @@ bool DllVolChange(RAROptions *Cmd,wchar *NextName,size_t NameSize) { char NextNameA[NM]; WideToChar(NextName,NextNameA,ASIZE(NextNameA)); - // Here we preserve ESP value. It is necessary for those developers, - // who still define ChangeVolProc callback as "C" type function, - // even though in year 2001 we announced in unrar.dll whatsnew.txt - // that it will be PASCAL type (for compatibility with Visual Basic). -#if defined(_MSC_VER) -#ifndef _WIN_64 - __asm mov ebx,esp -#endif -#elif defined(_WIN_ALL) && defined(__BORLANDC__) - _EBX=_ESP; -#endif int RetCode=Cmd->ChangeVolProc(NextNameA,RAR_VOL_ASK); - - // Restore ESP after ChangeVolProc with wrongly defined calling - // convention broken it. -#if defined(_MSC_VER) -#ifndef _WIN_64 - __asm mov esp,ebx -#endif -#elif defined(_WIN_ALL) && defined(__BORLANDC__) - _ESP=_EBX; -#endif if (RetCode==0) DllVolAborted=true; else @@ -268,21 +259,10 @@ bool DllVolNotify(RAROptions *Cmd,wchar *NextName) } if (Cmd->ChangeVolProc!=NULL) { -#if defined(_WIN_ALL) && !defined(_MSC_VER) && !defined(__MINGW32__) - _EBX=_ESP; -#endif int RetCode=Cmd->ChangeVolProc(NextNameA,RAR_VOL_NOTIFY); -#if defined(_WIN_ALL) && !defined(_MSC_VER) && !defined(__MINGW32__) - _ESP=_EBX; -#endif if (RetCode==0) return false; } return true; } - -#if defined(RARDLL) && defined(_MSC_VER) && !defined(_WIN_64) -// Restore the run time stack check for unrar.dll. -#pragma runtime_checks( "s", restore ) -#endif #endif From 66017cd0ec47b7bcc64dc7be8d27234517dccc17 Mon Sep 17 00:00:00 2001 From: Lpsd <40902730+Lpsd@users.noreply.github.com> Date: Sat, 9 Apr 2022 06:45:56 -0700 Subject: [PATCH 47/49] Fix build failing since 66a16ff (unrar update) (PR #2594) --- vendor/unrar/premake5.lua | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/vendor/unrar/premake5.lua b/vendor/unrar/premake5.lua index c9b20f51be..317ffdd424 100644 --- a/vendor/unrar/premake5.lua +++ b/vendor/unrar/premake5.lua @@ -34,7 +34,6 @@ project "unrar" "find.cpp", "getbits.cpp", "global.cpp", - "isnt.cpp", "list.cpp", "match.cpp", "options.cpp", @@ -67,3 +66,6 @@ project "unrar" "threadpool.cpp", "ui.cpp" } + + filter "system:Windows*" + files { "isnt.cpp" } \ No newline at end of file From 65a2f677e418fb0489321de5ead80fe1fe101ead Mon Sep 17 00:00:00 2001 From: Pot Bot Date: Sat, 9 Apr 2022 14:32:47 +0000 Subject: [PATCH 48/49] Update client en_US pot [ci skip] --- .../MTA/locale/en_US/client.pot | 212 +++++++++--------- 1 file changed, 101 insertions(+), 111 deletions(-) diff --git a/Shared/data/MTA San Andreas/MTA/locale/en_US/client.pot b/Shared/data/MTA San Andreas/MTA/locale/en_US/client.pot index 7dffe2ada1..37ff36fef3 100644 --- a/Shared/data/MTA San Andreas/MTA/locale/en_US/client.pot +++ b/Shared/data/MTA San Andreas/MTA/locale/en_US/client.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: MTA San Andreas 1.x\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-04-02 16:58+0000\n" +"POT-Creation-Date: 2022-04-09 14:32+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -92,7 +92,7 @@ msgstr "" msgid "Unknown command or cvar: " msgstr "" -#: Client\core\CConnectManager.cpp:80 +#: Client\core\CConnectManager.cpp:79 msgid "Connecting failed. Invalid nick provided!" msgstr "" @@ -100,14 +100,14 @@ msgstr "" #. Show failed message and abort the attempt #. Show timeout message and disconnect #. Display an error, reset the error status and exit -#: Client\core\CConnectManager.cpp:81 Client\core\CConnectManager.cpp:117 -#: Client\core\CConnectManager.cpp:133 Client\core\CConnectManager.cpp:269 -#: Client\core\CConnectManager.cpp:327 Client\core\CConnectManager.cpp:410 -#: Client\core\CConnectManager.cpp:417 Client\core\CConnectManager.cpp:427 -#: Client\core\CCore.cpp:1200 Client\core\CCore.cpp:1213 +#: Client\core\CConnectManager.cpp:80 Client\core\CConnectManager.cpp:111 +#: Client\core\CConnectManager.cpp:127 Client\core\CConnectManager.cpp:263 +#: Client\core\CConnectManager.cpp:321 Client\core\CConnectManager.cpp:404 +#: Client\core\CConnectManager.cpp:411 Client\core\CConnectManager.cpp:421 +#: Client\core\CCore.cpp:1190 Client\core\CCore.cpp:1203 #: Client\core\CGUI.cpp:87 Client\core\CSettings.cpp:2888 #: Client\core\CSettings.cpp:4062 Client\core\CSettings.cpp:4090 -#: Client\core\CSettings.cpp:4621 Client\core\DXHook\CDirect3DHook9.cpp:127 +#: Client\core\CSettings.cpp:4621 Client\core\DXHook\CDirect3DHook9.cpp:126 #: Client\core\ServerBrowser\CServerBrowser.cpp:1273 #: Client\core\ServerBrowser\CServerBrowser.cpp:1295 #: Client\core\ServerBrowser\CServerBrowser.cpp:1352 @@ -134,78 +134,78 @@ msgstr "" msgid "Error" msgstr "" -#: Client\core\CConnectManager.cpp:116 +#: Client\core\CConnectManager.cpp:110 msgid "Connecting failed. Invalid host provided!" msgstr "" -#: Client\core\CConnectManager.cpp:132 +#: Client\core\CConnectManager.cpp:126 #, c-format msgid "Connecting to %s at port %u failed!" msgstr "" #. Display the status box -#: Client\core\CConnectManager.cpp:153 +#: Client\core\CConnectManager.cpp:147 #, c-format msgid "Connecting to %s:%u ..." msgstr "" #. Display the status box -#: Client\core\CConnectManager.cpp:154 +#: Client\core\CConnectManager.cpp:148 #: Client\mods\deathmatch\logic\CClientGame.cpp:584 msgid "CONNECTING" msgstr "" -#: Client\core\CConnectManager.cpp:269 +#: Client\core\CConnectManager.cpp:263 #: Client\mods\deathmatch\logic\CClientGame.cpp:1163 msgid "Connection timed out" msgstr "" -#: Client\core\CConnectManager.cpp:283 Client\core\CConnectManager.cpp:287 +#: Client\core\CConnectManager.cpp:277 Client\core\CConnectManager.cpp:281 #: Client\mods\deathmatch\logic\CClientGame.cpp:1208 msgid "Disconnected: unknown protocol error" msgstr "" -#: Client\core\CConnectManager.cpp:291 +#: Client\core\CConnectManager.cpp:285 #: Client\mods\deathmatch\logic\CClientGame.cpp:1212 msgid "Disconnected: disconnected remotely" msgstr "" -#: Client\core\CConnectManager.cpp:295 +#: Client\core\CConnectManager.cpp:289 #: Client\mods\deathmatch\logic\CClientGame.cpp:1216 msgid "Disconnected: connection lost remotely" msgstr "" -#: Client\core\CConnectManager.cpp:299 +#: Client\core\CConnectManager.cpp:293 #: Client\mods\deathmatch\logic\CClientGame.cpp:1220 msgid "Disconnected: you are banned from this server" msgstr "" -#: Client\core\CConnectManager.cpp:306 +#: Client\core\CConnectManager.cpp:300 #: Client\mods\deathmatch\logic\CClientGame.cpp:1228 msgid "Disconnected: disconnected from the server" msgstr "" -#: Client\core\CConnectManager.cpp:310 +#: Client\core\CConnectManager.cpp:304 #: Client\mods\deathmatch\logic\CClientGame.cpp:1232 msgid "Disconnected: connection to the server was lost" msgstr "" -#: Client\core\CConnectManager.cpp:317 +#: Client\core\CConnectManager.cpp:311 #: Client\mods\deathmatch\logic\CClientGame.cpp:1240 msgid "Disconnected: connection was refused" msgstr "" #. Failed loading the mod -#: Client\core\CConnectManager.cpp:409 +#: Client\core\CConnectManager.cpp:403 #, c-format msgid "No such mod installed (%s)" msgstr "" -#: Client\core\CConnectManager.cpp:417 +#: Client\core\CConnectManager.cpp:411 msgid "Bad server response (2)" msgstr "" -#: Client\core\CConnectManager.cpp:427 +#: Client\core\CConnectManager.cpp:421 msgid "Bad server response (1)" msgstr "" @@ -214,116 +214,116 @@ msgstr "" msgid "CONSOLE" msgstr "" -#: Client\core\CCore.cpp:727 Client\loader\CInstallManager.cpp:756 +#: Client\core\CCore.cpp:718 Client\loader\CInstallManager.cpp:756 #, c-format msgid "MTA:SA cannot continue because drive %s does not have enough space." msgstr "" -#: Client\core\CCore.cpp:729 Shared\mods\deathmatch\logic\Utils.cpp:102 +#: Client\core\CCore.cpp:720 Shared\mods\deathmatch\logic\Utils.cpp:102 msgid "Fatal error" msgstr "" -#: Client\core\CCore.cpp:855 +#: Client\core\CCore.cpp:845 msgid "TO FIX, REMOVE THIS FILE:" msgstr "" -#: Client\core\CCore.cpp:887 +#: Client\core\CCore.cpp:877 #, c-format msgid "%s module is incorrect!" msgstr "" -#: Client\core\CCore.cpp:1200 +#: Client\core\CCore.cpp:1190 msgid "Error executing URL" msgstr "" -#: Client\core\CCore.cpp:1212 +#: Client\core\CCore.cpp:1202 #, c-format msgid "Error running mod specified in command line ('%s')" msgstr "" #. m_pCommands->Add ( "e", CCommandFuncs::Editor ); #. m_pCommands->Add ( "clear", CCommandFuncs::Clear ); -#: Client\core\CCore.cpp:1297 +#: Client\core\CCore.cpp:1287 msgid "this help screen" msgstr "" -#: Client\core\CCore.cpp:1298 Client\core\CCore.cpp:1299 +#: Client\core\CCore.cpp:1288 Client\core\CCore.cpp:1289 msgid "exits the application" msgstr "" -#: Client\core\CCore.cpp:1300 +#: Client\core\CCore.cpp:1290 msgid "shows the version" msgstr "" -#: Client\core\CCore.cpp:1301 +#: Client\core\CCore.cpp:1291 msgid "shows the time" msgstr "" -#: Client\core\CCore.cpp:1302 +#: Client\core\CCore.cpp:1292 msgid "shows the hud" msgstr "" -#: Client\core\CCore.cpp:1303 +#: Client\core\CCore.cpp:1293 msgid "shows all the binds" msgstr "" -#: Client\core\CCore.cpp:1304 +#: Client\core\CCore.cpp:1294 msgid "shows your serial" msgstr "" -#: Client\core\CCore.cpp:1313 +#: Client\core\CCore.cpp:1303 msgid "connects to a server (host port nick pass)" msgstr "" -#: Client\core\CCore.cpp:1314 +#: Client\core\CCore.cpp:1304 msgid "connects to a previous server" msgstr "" -#: Client\core\CCore.cpp:1315 +#: Client\core\CCore.cpp:1305 msgid "binds a key (key control)" msgstr "" -#: Client\core\CCore.cpp:1316 +#: Client\core\CCore.cpp:1306 msgid "unbinds a key (key)" msgstr "" -#: Client\core\CCore.cpp:1317 +#: Client\core\CCore.cpp:1307 msgid "copies the default gta controls" msgstr "" -#: Client\core\CCore.cpp:1318 +#: Client\core\CCore.cpp:1308 msgid "outputs a screenshot" msgstr "" -#: Client\core\CCore.cpp:1319 +#: Client\core\CCore.cpp:1309 msgid "immediately saves the config" msgstr "" -#: Client\core\CCore.cpp:1321 +#: Client\core\CCore.cpp:1311 msgid "clears the debug view" msgstr "" -#: Client\core\CCore.cpp:1322 +#: Client\core\CCore.cpp:1312 msgid "scrolls the chatbox upwards" msgstr "" -#: Client\core\CCore.cpp:1323 +#: Client\core\CCore.cpp:1313 msgid "scrolls the chatbox downwards" msgstr "" -#: Client\core\CCore.cpp:1324 +#: Client\core\CCore.cpp:1314 msgid "scrolls the debug view upwards" msgstr "" -#: Client\core\CCore.cpp:1325 +#: Client\core\CCore.cpp:1315 msgid "scrolls the debug view downwards" msgstr "" -#: Client\core\CCore.cpp:1328 +#: Client\core\CCore.cpp:1318 msgid "shows the memory statistics" msgstr "" -#: Client\core\CCore.cpp:1329 +#: Client\core\CCore.cpp:1319 msgid "shows the frame timing graph" msgstr "" @@ -570,23 +570,23 @@ msgid "" "Upgrade Windows to play on the latest servers." msgstr "" -#: Client\core\CMainMenu.cpp:1148 +#: Client\core\CMainMenu.cpp:1141 msgid "" "This will disconnect you from the current server.\n" "\n" "Are you sure you want to disconnect?" msgstr "" -#: Client\core\CMainMenu.cpp:1152 +#: Client\core\CMainMenu.cpp:1145 msgid "DISCONNECT WARNING" msgstr "" -#: Client\core\CMainMenu.cpp:1154 Client\core\CQuestionBox.cpp:194 +#: Client\core\CMainMenu.cpp:1147 Client\core\CQuestionBox.cpp:194 #: Client\core\CSettings.cpp:1357 Client\core\CSettings.cpp:1381 #: Client\core\CSettings.cpp:4382 Client\core\CSettings.cpp:4449 -#: Client\core\CSettings.cpp:4498 Client\core\CVersionUpdater.cpp:1569 -#: Client\core\CVersionUpdater.cpp:1587 Client\core\CVersionUpdater.cpp:1856 -#: Client\core\CVersionUpdater.cpp:1875 +#: Client\core\CSettings.cpp:4498 Client\core\CVersionUpdater.cpp:1568 +#: Client\core\CVersionUpdater.cpp:1586 Client\core\CVersionUpdater.cpp:1855 +#: Client\core\CVersionUpdater.cpp:1874 #: Client\core\ServerBrowser\CServerInfo.cpp:479 Client\loader\Dialogs.cpp:32 msgid "No" msgstr "" @@ -597,12 +597,12 @@ msgstr "" #. #. #. ///////////////////////////////////////////////////////////////////////// -#: Client\core\CMainMenu.cpp:1155 Client\core\CQuestionBox.cpp:195 +#: Client\core\CMainMenu.cpp:1148 Client\core\CQuestionBox.cpp:195 #: Client\core\CSettings.cpp:1358 Client\core\CSettings.cpp:1382 #: Client\core\CSettings.cpp:4383 Client\core\CSettings.cpp:4450 -#: Client\core\CSettings.cpp:4499 Client\core\CVersionUpdater.cpp:1570 -#: Client\core\CVersionUpdater.cpp:1588 Client\core\CVersionUpdater.cpp:1857 -#: Client\core\CVersionUpdater.cpp:1876 +#: Client\core\CSettings.cpp:4499 Client\core\CVersionUpdater.cpp:1569 +#: Client\core\CVersionUpdater.cpp:1587 Client\core\CVersionUpdater.cpp:1856 +#: Client\core\CVersionUpdater.cpp:1875 #: Client\core\ServerBrowser\CServerInfo.cpp:479 #: Client\gui\CGUIMessageBox_Impl.cpp:72 Client\loader\Dialogs.cpp:31 msgid "Yes" @@ -667,19 +667,19 @@ msgstr "" #. Create buttons #. OK button #: Client\core\CSettings.cpp:126 Client\core\CSettings.cpp:4642 -#: Client\core\CVersionUpdater.cpp:1605 Client\core\CVersionUpdater.cpp:1821 -#: Client\core\CVersionUpdater.cpp:1914 Client\core\CVersionUpdater.cpp:1936 -#: Client\core\CVersionUpdater.cpp:1954 Client\core\CVersionUpdater.cpp:1966 -#: Client\core\CVersionUpdater.cpp:2118 Client\core\CVersionUpdater.cpp:2127 -#: Client\core\CVersionUpdater.cpp:2136 Client\core\CVersionUpdater.cpp:2150 +#: Client\core\CVersionUpdater.cpp:1604 Client\core\CVersionUpdater.cpp:1820 +#: Client\core\CVersionUpdater.cpp:1913 Client\core\CVersionUpdater.cpp:1935 +#: Client\core\CVersionUpdater.cpp:1953 Client\core\CVersionUpdater.cpp:1965 +#: Client\core\CVersionUpdater.cpp:2117 Client\core\CVersionUpdater.cpp:2126 +#: Client\core\CVersionUpdater.cpp:2135 Client\core\CVersionUpdater.cpp:2149 #: Client\gui\CGUIMessageBox_Impl.cpp:64 Client\loader\Dialogs.cpp:33 msgid "OK" msgstr "" #. Cancel button #: Client\core\CSettings.cpp:131 Client\core\CSettings.cpp:4641 -#: Client\core\CVersionUpdater.cpp:1788 Client\core\CVersionUpdater.cpp:1804 -#: Client\core\CVersionUpdater.cpp:1839 Client\gui\CGUIMessageBox_Impl.cpp:68 +#: Client\core\CVersionUpdater.cpp:1787 Client\core\CVersionUpdater.cpp:1803 +#: Client\core\CVersionUpdater.cpp:1838 Client\gui\CGUIMessageBox_Impl.cpp:68 #: Client\loader\Dialogs.cpp:36 #: Client\mods\deathmatch\logic\CLocalServer.cpp:123 msgid "Cancel" @@ -1513,7 +1513,7 @@ msgid "" "Are you sure you want to use them?" msgstr "" -#: Client\core\CSettings.cpp:4447 Client\core\CVersionUpdater.cpp:2079 +#: Client\core\CSettings.cpp:4447 Client\core\CVersionUpdater.cpp:2078 msgid "CUSTOMIZED GTA:SA FILES" msgstr "" @@ -1600,21 +1600,21 @@ msgstr "" msgid "Mouse movement fix - May need PC restart" msgstr "" -#: Client\core\CVersionUpdater.cpp:624 +#: Client\core\CVersionUpdater.cpp:623 msgid "Busy" msgstr "" -#: Client\core\CVersionUpdater.cpp:624 +#: Client\core\CVersionUpdater.cpp:623 msgid "Can't check for updates right now" msgstr "" -#: Client\core\CVersionUpdater.cpp:1565 Client\core\CVersionUpdater.cpp:1585 -#: Client\core\CVersionUpdater.cpp:1603 +#: Client\core\CVersionUpdater.cpp:1564 Client\core\CVersionUpdater.cpp:1584 +#: Client\core\CVersionUpdater.cpp:1602 #, c-format msgid "MTA:SA %s required" msgstr "" -#: Client\core\CVersionUpdater.cpp:1566 +#: Client\core\CVersionUpdater.cpp:1565 #, c-format msgid "" "An updated version of MTA:SA %s is required to join the selected server.\n" @@ -1622,113 +1622,113 @@ msgid "" "Do you want to download and install MTA:SA %s ?" msgstr "" -#: Client\core\CVersionUpdater.cpp:1586 +#: Client\core\CVersionUpdater.cpp:1585 #, c-format msgid "Do you want to launch MTA:SA %s and connect to this server ?" msgstr "" -#: Client\core\CVersionUpdater.cpp:1604 +#: Client\core\CVersionUpdater.cpp:1603 msgid "" "It is not possible to connect at this time.\n" "\n" "Please try later." msgstr "" -#: Client\core\CVersionUpdater.cpp:1786 +#: Client\core\CVersionUpdater.cpp:1785 msgid "Connecting" msgstr "" -#: Client\core\CVersionUpdater.cpp:1787 Client\core\CVersionUpdater.cpp:1803 +#: Client\core\CVersionUpdater.cpp:1786 Client\core\CVersionUpdater.cpp:1802 msgid "Please wait..." msgstr "" -#: Client\core\CVersionUpdater.cpp:1802 +#: Client\core\CVersionUpdater.cpp:1801 msgid "CHECKING" msgstr "" -#: Client\core\CVersionUpdater.cpp:1819 Client\core\CVersionUpdater.cpp:1912 +#: Client\core\CVersionUpdater.cpp:1818 Client\core\CVersionUpdater.cpp:1911 msgid "UPDATE CHECK" msgstr "" -#: Client\core\CVersionUpdater.cpp:1820 +#: Client\core\CVersionUpdater.cpp:1819 msgid "No update needed" msgstr "" -#: Client\core\CVersionUpdater.cpp:1837 +#: Client\core\CVersionUpdater.cpp:1836 msgid "DOWNLOADING" msgstr "" -#: Client\core\CVersionUpdater.cpp:1838 +#: Client\core\CVersionUpdater.cpp:1837 msgid "waiting..." msgstr "" -#: Client\core\CVersionUpdater.cpp:1854 +#: Client\core\CVersionUpdater.cpp:1853 msgid "MANDATORY UPDATE" msgstr "" -#: Client\core\CVersionUpdater.cpp:1855 +#: Client\core\CVersionUpdater.cpp:1854 msgid "" "To join this server, you must update MTA.\n" "\n" " Do you want to update now ?" msgstr "" -#: Client\core\CVersionUpdater.cpp:1873 +#: Client\core\CVersionUpdater.cpp:1872 msgid "OPTIONAL UPDATE" msgstr "" -#: Client\core\CVersionUpdater.cpp:1874 +#: Client\core\CVersionUpdater.cpp:1873 msgid "" "Server says an update is recommended, but not essential.\n" "\n" " Do you want to update now ?" msgstr "" -#: Client\core\CVersionUpdater.cpp:1913 +#: Client\core\CVersionUpdater.cpp:1912 msgid "" "Update not currently avalable.\n" "\n" "Please check www.mtasa.com" msgstr "" -#: Client\core\CVersionUpdater.cpp:1934 Client\core\CVersionUpdater.cpp:2116 +#: Client\core\CVersionUpdater.cpp:1933 Client\core\CVersionUpdater.cpp:2115 msgid "ERROR SAVING" msgstr "" -#: Client\core\CVersionUpdater.cpp:1935 Client\core\CVersionUpdater.cpp:2117 +#: Client\core\CVersionUpdater.cpp:1934 Client\core\CVersionUpdater.cpp:2116 msgid "Unable to create the file." msgstr "" -#: Client\core\CVersionUpdater.cpp:1943 Client\core\CVersionUpdater.cpp:1952 -#: Client\core\CVersionUpdater.cpp:2125 Client\core\CVersionUpdater.cpp:2134 +#: Client\core\CVersionUpdater.cpp:1942 Client\core\CVersionUpdater.cpp:1951 +#: Client\core\CVersionUpdater.cpp:2124 Client\core\CVersionUpdater.cpp:2133 msgid "ERROR DOWNLOADING" msgstr "" -#: Client\core\CVersionUpdater.cpp:1944 Client\core\CVersionUpdater.cpp:2126 +#: Client\core\CVersionUpdater.cpp:1943 Client\core\CVersionUpdater.cpp:2125 msgid "The downloaded file appears to be incorrect." msgstr "" -#: Client\core\CVersionUpdater.cpp:1953 Client\core\CVersionUpdater.cpp:2135 +#: Client\core\CVersionUpdater.cpp:1952 Client\core\CVersionUpdater.cpp:2134 msgid "For some reason." msgstr "" -#: Client\core\CVersionUpdater.cpp:1964 Client\core\CVersionUpdater.cpp:2148 +#: Client\core\CVersionUpdater.cpp:1963 Client\core\CVersionUpdater.cpp:2147 msgid "DOWNLOAD COMPLETE" msgstr "" -#: Client\core\CVersionUpdater.cpp:1988 +#: Client\core\CVersionUpdater.cpp:1987 msgid " - Unknown problem in _DialogUpdateResult" msgstr "" -#: Client\core\CVersionUpdater.cpp:2086 Client\core\CVersionUpdater.cpp:2096 +#: Client\core\CVersionUpdater.cpp:2085 Client\core\CVersionUpdater.cpp:2095 msgid "Ok" msgstr "" -#: Client\core\CVersionUpdater.cpp:2094 +#: Client\core\CVersionUpdater.cpp:2093 msgid "ERROR" msgstr "" -#: Client\core\CVersionUpdater.cpp:2095 +#: Client\core\CVersionUpdater.cpp:2094 msgid "" "Some MTA:SA data files are missing.\n" "\n" @@ -1736,12 +1736,12 @@ msgid "" "Please reinstall MTA:SA" msgstr "" -#: Client\core\CVersionUpdater.cpp:2722 +#: Client\core\CVersionUpdater.cpp:2721 #, c-format msgid "%3d %% completed" msgstr "" -#: Client\core\CVersionUpdater.cpp:2724 +#: Client\core\CVersionUpdater.cpp:2723 #, c-format msgid "" "\n" @@ -1749,16 +1749,6 @@ msgid "" "Waiting for response - %-3d" msgstr "" -#: Client\core\CVersionUpdater.cpp:3399 -msgid "" -"We've reset your update preferences back to Default, please go change your " -"settings again if you want Nightly updates.\n" -msgstr "" - -#: Client\core\CVersionUpdater.cpp:3400 -msgid "VERSION UPDATE INFORMATION" -msgstr "" - #: Client\core\DXHook\CDirect3DEvents9.cpp:230 #, c-format msgid "Screenshot got %d bytes, but expected %d" @@ -1768,7 +1758,7 @@ msgstr "" msgid "Screenshot failed" msgstr "" -#: Client\core\DXHook\CDirect3DHook9.cpp:124 +#: Client\core\DXHook\CDirect3DHook9.cpp:123 msgid "" "Could not initialize Direct3D9.\n" "\n" From 73563ed18da633f006c9c3a6515f8eb86603a2a7 Mon Sep 17 00:00:00 2001 From: Pot Bot Date: Sat, 9 Apr 2022 14:32:47 +0000 Subject: [PATCH 49/49] Update installer en_US pot [ci skip] --- Shared/installer/locale/en_US.pot | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Shared/installer/locale/en_US.pot b/Shared/installer/locale/en_US.pot index 944d6e88b1..48d8d4edec 100644 --- a/Shared/installer/locale/en_US.pot +++ b/Shared/installer/locale/en_US.pot @@ -3,7 +3,7 @@ msgid "" msgstr "" "Project-Id-Version: MTA San Andreas Installer 1.x\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-04-02 16:58\n" +"POT-Creation-Date: 2022-04-09 14:32\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n"

    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 aB(!s1lwd(oY{axT*(=o#K6tS?1^f?fm4#;j delta 24126 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 XpY^I3Xf7)#3u_mj-1l|zx|i`k3oO0m diff --git a/vendor/bass/bass.h b/vendor/bass/bass.h index 9ade3ac568..1782457e53 100644 --- a/vendor/bass/bass.h +++ b/vendor/bass/bass.h @@ -1,6 +1,6 @@ /* BASS 2.4 C/C++ header file - Copyright (c) 1999-2021 Un4seen Developments Ltd. + Copyright (c) 1999-2022 Un4seen Developments Ltd. See the BASS.CHM file for more detailed documentation */ @@ -104,6 +104,7 @@ typedef DWORD HPLUGIN; // plugin handle #define BASS_ERROR_BUSY 46 // the device is busy #define BASS_ERROR_UNSTREAMABLE 47 // unstreamable file #define BASS_ERROR_PROTOCOL 48 // unsupported protocol +#define BASS_ERROR_DENIED 49 // access denied #define BASS_ERROR_UNKNOWN -1 // some other mystery problem // BASS_SetConfig options @@ -158,7 +159,6 @@ typedef DWORD HPLUGIN; // plugin handle #define BASS_CONFIG_REC_WASAPI 66 #define BASS_CONFIG_ANDROID_AAUDIO 67 #define BASS_CONFIG_SAMPLE_ONEHANDLE 69 -#define BASS_CONFIG_DEV_TIMEOUT 70 #define BASS_CONFIG_NET_META 71 #define BASS_CONFIG_NET_RESTRATE 72 #define BASS_CONFIG_REC_DEFAULT 73 @@ -177,6 +177,10 @@ typedef DWORD HPLUGIN; // plugin handle #define BASS_IOS_SESSION_AMBIENT 4 #define BASS_IOS_SESSION_SPEAKER 8 #define BASS_IOS_SESSION_DISABLE 16 +#define BASS_IOS_SESSION_DEACTIVATE 32 +#define BASS_IOS_SESSION_AIRPLAY 64 +#define BASS_IOS_SESSION_BTHFP 128 +#define BASS_IOS_SESSION_BTA2DP 0x100 // BASS_Init flags #define BASS_DEVICE_8BITS 1 // unused From 7ead65dcf207befd0eafadbaff3ac5aae62b0a08 Mon Sep 17 00:00:00 2001 From: Merlin Date: Fri, 25 Feb 2022 18:37:47 +0100 Subject: [PATCH 20/49] Skip check for disabled HUD (#2460) --- Client/multiplayer_sa/CMultiplayerSA.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Client/multiplayer_sa/CMultiplayerSA.cpp b/Client/multiplayer_sa/CMultiplayerSA.cpp index 880a3f6134..b2fa00f4a9 100644 --- a/Client/multiplayer_sa/CMultiplayerSA.cpp +++ b/Client/multiplayer_sa/CMultiplayerSA.cpp @@ -1538,6 +1538,9 @@ void CMultiplayerSA::InitHooks() for (auto uiAddr : shadowAddr) MemPut(uiAddr, &m_fShadowsOffset); + // Skip check for disabled HUD + MemSet((void*)0x58FBC4, 0x90, 9); + InitHooks_CrashFixHacks(); // Init our 1.3 hooks. From 4d6f0ca02aaabb2a65684f5e1e55723cedeb098e Mon Sep 17 00:00:00 2001 From: MTABot Date: Wed, 9 Mar 2022 08:08:31 +0000 Subject: [PATCH 21/49] Visual Studio Update VS2019: 16.11.32126.315 => 16.11.32228.343 VS2022: 17.1.32210.238 => 17.1.32228.430 This is an automated commit to keep track of toolchain changes on the build server. It applies to every MTA build after this commit until further notice. From 4a08d638529eb70e04000d42c06bbd7e667fccb5 Mon Sep 17 00:00:00 2001 From: Dutchman101 <12105539+Dutchman101@users.noreply.github.com> Date: Fri, 18 Mar 2022 23:20:20 +0100 Subject: [PATCH 22/49] Update CEF to 99.2.12+g2977b3a+chromium-99.0.4844.74 --- utils/buildactions/install_cef.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/utils/buildactions/install_cef.lua b/utils/buildactions/install_cef.lua index fa957e61f7..03882990e2 100644 --- a/utils/buildactions/install_cef.lua +++ b/utils/buildactions/install_cef.lua @@ -9,8 +9,8 @@ local CEF_URL_PREFIX = "https://cef-builds.spotifycdn.com/cef_binary_" local CEF_URL_SUFFIX = "_windows32_minimal.tar.bz2" -- Change here to update CEF version -local CEF_VERSION = "98.1.21+g9782362+chromium-98.0.4758.102" -local CEF_HASH = "e5c0aadf0620262dfd6a91022bb91b286134aa91ca0a46ed68ffd147d77267b0" +local CEF_VERSION = "99.2.12+g2977b3a+chromium-99.0.4844.74" +local CEF_HASH = "d097b0f6660ea7d6be5c460b1c483714e99b0994171b75a3d0aa31f8973736db" function make_cef_download_url() return CEF_URL_PREFIX..http.escapeUrlParam(CEF_VERSION)..CEF_URL_SUFFIX From be94535edb9e2ff88c435e46c9a944b79441d3cd Mon Sep 17 00:00:00 2001 From: MTABot Date: Wed, 23 Mar 2022 08:04:12 +0000 Subject: [PATCH 23/49] Visual Studio Update VS2022: 17.1.32228.430 => 17.1.32319.34 This is an automated commit to keep track of toolchain changes on the build server. It applies to every MTA build after this commit until further notice. From b26cb9f6fc4cca42e455b2a553a1364a40ff4d72 Mon Sep 17 00:00:00 2001 From: Dutchman101 <12105539+Dutchman101@users.noreply.github.com> Date: Sat, 26 Mar 2022 03:42:11 +0100 Subject: [PATCH 24/49] Update CEF to 99.2.13+gd9af866+chromium-99.0.4844.83 If server scripts relied on getting a players' screen content (input fields, states) there will be bugs on 99.2.12+g2977b3a+chromium-99.0.4844.74. Potentially even worse ones if the user is on macOS --- utils/buildactions/install_cef.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/utils/buildactions/install_cef.lua b/utils/buildactions/install_cef.lua index 03882990e2..e218dc06da 100644 --- a/utils/buildactions/install_cef.lua +++ b/utils/buildactions/install_cef.lua @@ -9,8 +9,8 @@ local CEF_URL_PREFIX = "https://cef-builds.spotifycdn.com/cef_binary_" local CEF_URL_SUFFIX = "_windows32_minimal.tar.bz2" -- Change here to update CEF version -local CEF_VERSION = "99.2.12+g2977b3a+chromium-99.0.4844.74" -local CEF_HASH = "d097b0f6660ea7d6be5c460b1c483714e99b0994171b75a3d0aa31f8973736db" +local CEF_VERSION = "99.2.13+gd9af866+chromium-99.0.4844.83" +local CEF_HASH = "f6b4ed7b6b1fa15e34f8dc12cd25a330933d3140f1e9264452fd73b67411d005" function make_cef_download_url() return CEF_URL_PREFIX..http.escapeUrlParam(CEF_VERSION)..CEF_URL_SUFFIX From 4e70aaff9be955fae004b6432bb0fc80a7f75ad4 Mon Sep 17 00:00:00 2001 From: patrikjuvonen <22572159+patrikjuvonen@users.noreply.github.com> Date: Thu, 31 Mar 2022 20:01:30 +0300 Subject: [PATCH 25/49] Update CEF from 99.2.13+gd9af866+chromium-99.0.4844.83 to 99.2.14+g3f796b8+chromium-99.0.4844.84 --- utils/buildactions/install_cef.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/utils/buildactions/install_cef.lua b/utils/buildactions/install_cef.lua index e218dc06da..881f59f7c3 100644 --- a/utils/buildactions/install_cef.lua +++ b/utils/buildactions/install_cef.lua @@ -9,8 +9,8 @@ local CEF_URL_PREFIX = "https://cef-builds.spotifycdn.com/cef_binary_" local CEF_URL_SUFFIX = "_windows32_minimal.tar.bz2" -- Change here to update CEF version -local CEF_VERSION = "99.2.13+gd9af866+chromium-99.0.4844.83" -local CEF_HASH = "f6b4ed7b6b1fa15e34f8dc12cd25a330933d3140f1e9264452fd73b67411d005" +local CEF_VERSION = "99.2.14+g3f796b8+chromium-99.0.4844.84" +local CEF_HASH = "4984FDF52356D152426969DD6CB12588AFBA16390A93B35D49C404A7C6C81A7D" function make_cef_download_url() return CEF_URL_PREFIX..http.escapeUrlParam(CEF_VERSION)..CEF_URL_SUFFIX From 1134f2843832e048060458454c9db3352213daed Mon Sep 17 00:00:00 2001 From: patrikjuvonen <22572159+patrikjuvonen@users.noreply.github.com> Date: Thu, 31 Mar 2022 20:03:15 +0300 Subject: [PATCH 26/49] Addendum to 4e70aaf: Convert hash to lowercase --- utils/buildactions/install_cef.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/buildactions/install_cef.lua b/utils/buildactions/install_cef.lua index 881f59f7c3..8168ed1edd 100644 --- a/utils/buildactions/install_cef.lua +++ b/utils/buildactions/install_cef.lua @@ -10,7 +10,7 @@ local CEF_URL_SUFFIX = "_windows32_minimal.tar.bz2" -- Change here to update CEF version local CEF_VERSION = "99.2.14+g3f796b8+chromium-99.0.4844.84" -local CEF_HASH = "4984FDF52356D152426969DD6CB12588AFBA16390A93B35D49C404A7C6C81A7D" +local CEF_HASH = "4984fdf52356d152426969dd6cb12588afba16390a93b35d49c404a7c6c81a7d" function make_cef_download_url() return CEF_URL_PREFIX..http.escapeUrlParam(CEF_VERSION)..CEF_URL_SUFFIX From 30c68a8754f87cdb0fa13c20e1cf6e6038a498b3 Mon Sep 17 00:00:00 2001 From: patrikjuvonen <22572159+patrikjuvonen@users.noreply.github.com> Date: Thu, 31 Mar 2022 20:19:03 +0300 Subject: [PATCH 27/49] Update zlib from 1.2.11 to 1.2.12 --- vendor/libpng/pnglibconf.h | 2 +- vendor/zlib/crc32.c | 1258 +++-- vendor/zlib/crc32.h | 9877 ++++++++++++++++++++++++++++++++++-- vendor/zlib/deflate.c | 108 +- vendor/zlib/deflate.h | 27 +- vendor/zlib/gzguts.h | 5 +- vendor/zlib/gzlib.c | 12 +- vendor/zlib/gzread.c | 16 +- vendor/zlib/gzwrite.c | 42 +- vendor/zlib/infback.c | 3 +- vendor/zlib/inffast.c | 28 +- vendor/zlib/inflate.c | 47 +- vendor/zlib/inflate.h | 5 +- vendor/zlib/inftrees.c | 6 +- vendor/zlib/trees.c | 75 +- vendor/zlib/zconf.h | 2 - vendor/zlib/zlib.h | 223 +- vendor/zlib/zutil.c | 4 +- vendor/zlib/zutil.h | 21 +- 19 files changed, 10761 insertions(+), 1000 deletions(-) diff --git a/vendor/libpng/pnglibconf.h b/vendor/libpng/pnglibconf.h index 7f6a817984..c3fb56c890 100644 --- a/vendor/libpng/pnglibconf.h +++ b/vendor/libpng/pnglibconf.h @@ -209,7 +209,7 @@ #define PNG_USER_HEIGHT_MAX 1000000 #define PNG_USER_WIDTH_MAX 1000000 #define PNG_ZBUF_SIZE 8192 -#define PNG_ZLIB_VERNUM 0x12b0 +#define PNG_ZLIB_VERNUM 0x12c0 /* this was manually incremented from 0x12b0 by MTA for newer zlib support */ #define PNG_Z_DEFAULT_COMPRESSION (-1) #define PNG_Z_DEFAULT_NOFILTER_STRATEGY 0 #define PNG_Z_DEFAULT_STRATEGY 1 diff --git a/vendor/zlib/crc32.c b/vendor/zlib/crc32.c index 9580440c0e..a1bdce5c23 100644 --- a/vendor/zlib/crc32.c +++ b/vendor/zlib/crc32.c @@ -1,12 +1,10 @@ /* crc32.c -- compute the CRC-32 of a data stream - * Copyright (C) 1995-2006, 2010, 2011, 2012, 2016 Mark Adler + * Copyright (C) 1995-2022 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h * - * Thanks to Rodney Brown for his contribution of faster - * CRC methods: exclusive-oring 32 bits of data at a time, and pre-computing - * tables for updating the shift register in one step with three exclusive-ors - * instead of four steps with four exclusive-ors. This results in about a - * factor of two increase in speed on a Power PC G4 (PPC7455) using gcc -O3. + * This interleaved implementation of a CRC makes use of pipelined multiple + * arithmetic-logic units, commonly found in modern CPU cores. It is due to + * Kadatch and Jenkins (2010). See doc/crc-doc.1.0.pdf in this distribution. */ /* @(#) $Id$ */ @@ -14,11 +12,12 @@ /* Note on the use of DYNAMIC_CRC_TABLE: there is no mutex or semaphore protection on the static variables used to control the first-use generation - of the crc tables. Therefore, if you #define DYNAMIC_CRC_TABLE, you should + of the crc tables. Therefore, if you #define DYNAMIC_CRC_TABLE, you should first call get_crc_table() to initialize the tables before allowing more than one thread to use crc32(). - DYNAMIC_CRC_TABLE and MAKECRCH can be #defined to write out crc32.h. + MAKECRCH can be #defined to write out crc32.h. A main() routine is also + produced, so that this one source file can be compiled to an executable. */ #ifdef MAKECRCH @@ -28,415 +27,1090 @@ # endif /* !DYNAMIC_CRC_TABLE */ #endif /* MAKECRCH */ -#include "zutil.h" /* for STDC and FAR definitions */ +#include "zutil.h" /* for Z_U4, Z_U8, z_crc_t, and FAR definitions */ -/* Definitions for doing the crc four data bytes at a time. */ -#if !defined(NOBYFOUR) && defined(Z_U4) -# define BYFOUR + /* + A CRC of a message is computed on N braids of words in the message, where + each word consists of W bytes (4 or 8). If N is 3, for example, then three + running sparse CRCs are calculated respectively on each braid, at these + indices in the array of words: 0, 3, 6, ..., 1, 4, 7, ..., and 2, 5, 8, ... + This is done starting at a word boundary, and continues until as many blocks + of N * W bytes as are available have been processed. The results are combined + into a single CRC at the end. For this code, N must be in the range 1..6 and + W must be 4 or 8. The upper limit on N can be increased if desired by adding + more #if blocks, extending the patterns apparent in the code. In addition, + crc32.h would need to be regenerated, if the maximum N value is increased. + + N and W are chosen empirically by benchmarking the execution time on a given + processor. The choices for N and W below were based on testing on Intel Kaby + Lake i7, AMD Ryzen 7, ARM Cortex-A57, Sparc64-VII, PowerPC POWER9, and MIPS64 + Octeon II processors. The Intel, AMD, and ARM processors were all fastest + with N=5, W=8. The Sparc, PowerPC, and MIPS64 were all fastest at N=5, W=4. + They were all tested with either gcc or clang, all using the -O3 optimization + level. Your mileage may vary. + */ + +/* Define N */ +#ifdef Z_TESTN +# define N Z_TESTN +#else +# define N 5 +#endif +#if N < 1 || N > 6 +# error N must be in 1..6 #endif -#ifdef BYFOUR - local unsigned long crc32_little OF((unsigned long, - const unsigned char FAR *, z_size_t)); - local unsigned long crc32_big OF((unsigned long, - const unsigned char FAR *, z_size_t)); -# define TBLS 8 + +/* + z_crc_t must be at least 32 bits. z_word_t must be at least as long as + z_crc_t. It is assumed here that z_word_t is either 32 bits or 64 bits, and + that bytes are eight bits. + */ + +/* + Define W and the associated z_word_t type. If W is not defined, then a + braided calculation is not used, and the associated tables and code are not + compiled. + */ +#ifdef Z_TESTW +# if Z_TESTW-1 != -1 +# define W Z_TESTW +# endif #else -# define TBLS 1 -#endif /* BYFOUR */ +# ifdef MAKECRCH +# define W 8 /* required for MAKECRCH */ +# else +# if defined(__x86_64__) || defined(__aarch64__) +# define W 8 +# else +# define W 4 +# endif +# endif +#endif +#ifdef W +# if W == 8 && defined(Z_U8) + typedef Z_U8 z_word_t; +# elif defined(Z_U4) +# undef W +# define W 4 + typedef Z_U4 z_word_t; +# else +# undef W +# endif +#endif -/* Local functions for crc concatenation */ -local unsigned long gf2_matrix_times OF((unsigned long *mat, - unsigned long vec)); -local void gf2_matrix_square OF((unsigned long *square, unsigned long *mat)); -local uLong crc32_combine_ OF((uLong crc1, uLong crc2, z_off64_t len2)); +/* Local functions. */ +local z_crc_t multmodp OF((z_crc_t a, z_crc_t b)); +local z_crc_t x2nmodp OF((z_off64_t n, unsigned k)); +/* If available, use the ARM processor CRC32 instruction. */ +#if defined(__aarch64__) && defined(__ARM_FEATURE_CRC32) && W == 8 +# define ARMCRC32 +#endif + +#if defined(W) && (!defined(ARMCRC32) || defined(DYNAMIC_CRC_TABLE)) +/* + Swap the bytes in a z_word_t to convert between little and big endian. Any + self-respecting compiler will optimize this to a single machine byte-swap + instruction, if one is available. This assumes that word_t is either 32 bits + or 64 bits. + */ +local z_word_t byte_swap(word) + z_word_t word; +{ +# if W == 8 + return + (word & 0xff00000000000000) >> 56 | + (word & 0xff000000000000) >> 40 | + (word & 0xff0000000000) >> 24 | + (word & 0xff00000000) >> 8 | + (word & 0xff000000) << 8 | + (word & 0xff0000) << 24 | + (word & 0xff00) << 40 | + (word & 0xff) << 56; +# else /* W == 4 */ + return + (word & 0xff000000) >> 24 | + (word & 0xff0000) >> 8 | + (word & 0xff00) << 8 | + (word & 0xff) << 24; +# endif +} +#endif + +/* CRC polynomial. */ +#define POLY 0xedb88320 /* p(x) reflected, with x^32 implied */ #ifdef DYNAMIC_CRC_TABLE -local volatile int crc_table_empty = 1; -local z_crc_t FAR crc_table[TBLS][256]; +local z_crc_t FAR crc_table[256]; +local z_crc_t FAR x2n_table[32]; local void make_crc_table OF((void)); +#ifdef W + local z_word_t FAR crc_big_table[256]; + local z_crc_t FAR crc_braid_table[W][256]; + local z_word_t FAR crc_braid_big_table[W][256]; + local void braid OF((z_crc_t [][256], z_word_t [][256], int, int)); +#endif #ifdef MAKECRCH - local void write_table OF((FILE *, const z_crc_t FAR *)); + local void write_table OF((FILE *, const z_crc_t FAR *, int)); + local void write_table32hi OF((FILE *, const z_word_t FAR *, int)); + local void write_table64 OF((FILE *, const z_word_t FAR *, int)); #endif /* MAKECRCH */ + +/* + Define a once() function depending on the availability of atomics. If this is + compiled with DYNAMIC_CRC_TABLE defined, and if CRCs will be computed in + multiple threads, and if atomics are not available, then get_crc_table() must + be called to initialize the tables and must return before any threads are + allowed to compute or combine CRCs. + */ + +/* Definition of once functionality. */ +typedef struct once_s once_t; +local void once OF((once_t *, void (*)(void))); + +/* Check for the availability of atomics. */ +#if defined(__STDC__) && __STDC_VERSION__ >= 201112L && \ + !defined(__STDC_NO_ATOMICS__) + +#include + +/* Structure for once(), which must be initialized with ONCE_INIT. */ +struct once_s { + atomic_flag begun; + atomic_int done; +}; +#define ONCE_INIT {ATOMIC_FLAG_INIT, 0} + +/* + Run the provided init() function exactly once, even if multiple threads + invoke once() at the same time. The state must be a once_t initialized with + ONCE_INIT. + */ +local void once(state, init) + once_t *state; + void (*init)(void); +{ + if (!atomic_load(&state->done)) { + if (atomic_flag_test_and_set(&state->begun)) + while (!atomic_load(&state->done)) + ; + else { + init(); + atomic_store(&state->done, 1); + } + } +} + +#else /* no atomics */ + +/* Structure for once(), which must be initialized with ONCE_INIT. */ +struct once_s { + volatile int begun; + volatile int done; +}; +#define ONCE_INIT {0, 0} + +/* Test and set. Alas, not atomic, but tries to minimize the period of + vulnerability. */ +local int test_and_set OF((int volatile *)); +local int test_and_set(flag) + int volatile *flag; +{ + int was; + + was = *flag; + *flag = 1; + return was; +} + +/* Run the provided init() function once. This is not thread-safe. */ +local void once(state, init) + once_t *state; + void (*init)(void); +{ + if (!state->done) { + if (test_and_set(&state->begun)) + while (!state->done) + ; + else { + init(); + state->done = 1; + } + } +} + +#endif + +/* State for once(). */ +local once_t made = ONCE_INIT; + /* Generate tables for a byte-wise 32-bit CRC calculation on the polynomial: x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1. Polynomials over GF(2) are represented in binary, one bit per coefficient, - with the lowest powers in the most significant bit. Then adding polynomials + with the lowest powers in the most significant bit. Then adding polynomials is just exclusive-or, and multiplying a polynomial by x is a right shift by - one. If we call the above polynomial p, and represent a byte as the + one. If we call the above polynomial p, and represent a byte as the polynomial q, also with the lowest power in the most significant bit (so the - byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p, + byte 0xb1 is the polynomial x^7+x^3+x^2+1), then the CRC is (q*x^32) mod p, where a mod b means the remainder after dividing a by b. This calculation is done using the shift-register method of multiplying and - taking the remainder. The register is initialized to zero, and for each + taking the remainder. The register is initialized to zero, and for each incoming bit, x^32 is added mod p to the register if the bit is a one (where - x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by - x (which is shifting right by one and adding x^32 mod p if the bit shifted - out is a one). We start with the highest power (least significant bit) of - q and repeat for all eight bits of q. - - The first table is simply the CRC of all possible eight bit values. This is - all the information needed to generate CRCs on data a byte at a time for all - combinations of CRC register values and incoming bytes. The remaining tables - allow for word-at-a-time CRC calculation for both big-endian and little- - endian machines, where a word is four bytes. -*/ + x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by x + (which is shifting right by one and adding x^32 mod p if the bit shifted out + is a one). We start with the highest power (least significant bit) of q and + repeat for all eight bits of q. + + The table is simply the CRC of all possible eight bit values. This is all the + information needed to generate CRCs on data a byte at a time for all + combinations of CRC register values and incoming bytes. + */ + local void make_crc_table() { - z_crc_t c; - int n, k; - z_crc_t poly; /* polynomial exclusive-or pattern */ - /* terms of polynomial defining this crc (except x^32): */ - static volatile int first = 1; /* flag to limit concurrent making */ - static const unsigned char p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26}; - - /* See if another task is already doing this (not thread-safe, but better - than nothing -- significantly reduces duration of vulnerability in - case the advice about DYNAMIC_CRC_TABLE is ignored) */ - if (first) { - first = 0; - - /* make exclusive-or pattern from polynomial (0xedb88320UL) */ - poly = 0; - for (n = 0; n < (int)(sizeof(p)/sizeof(unsigned char)); n++) - poly |= (z_crc_t)1 << (31 - p[n]); - - /* generate a crc for every 8-bit value */ - for (n = 0; n < 256; n++) { - c = (z_crc_t)n; - for (k = 0; k < 8; k++) - c = c & 1 ? poly ^ (c >> 1) : c >> 1; - crc_table[0][n] = c; - } + unsigned i, j, n; + z_crc_t p; -#ifdef BYFOUR - /* generate crc for each value followed by one, two, and three zeros, - and then the byte reversal of those as well as the first table */ - for (n = 0; n < 256; n++) { - c = crc_table[0][n]; - crc_table[4][n] = ZSWAP32(c); - for (k = 1; k < 4; k++) { - c = crc_table[0][c & 0xff] ^ (c >> 8); - crc_table[k][n] = c; - crc_table[k + 4][n] = ZSWAP32(c); - } - } -#endif /* BYFOUR */ - - crc_table_empty = 0; - } - else { /* not first */ - /* wait for the other guy to finish (not efficient, but rare) */ - while (crc_table_empty) - ; + /* initialize the CRC of bytes tables */ + for (i = 0; i < 256; i++) { + p = i; + for (j = 0; j < 8; j++) + p = p & 1 ? (p >> 1) ^ POLY : p >> 1; + crc_table[i] = p; +#ifdef W + crc_big_table[i] = byte_swap(p); +#endif } + /* initialize the x^2^n mod p(x) table */ + p = (z_crc_t)1 << 30; /* x^1 */ + x2n_table[0] = p; + for (n = 1; n < 32; n++) + x2n_table[n] = p = multmodp(p, p); + +#ifdef W + /* initialize the braiding tables -- needs x2n_table[] */ + braid(crc_braid_table, crc_braid_big_table, N, W); +#endif + #ifdef MAKECRCH - /* write out CRC tables to crc32.h */ { + /* + The crc32.h header file contains tables for both 32-bit and 64-bit + z_word_t's, and so requires a 64-bit type be available. In that case, + z_word_t must be defined to be 64-bits. This code then also generates + and writes out the tables for the case that z_word_t is 32 bits. + */ +#if !defined(W) || W != 8 +# error Need a 64-bit integer type in order to generate crc32.h. +#endif FILE *out; + int k, n; + z_crc_t ltl[8][256]; + z_word_t big[8][256]; out = fopen("crc32.h", "w"); if (out == NULL) return; - fprintf(out, "/* crc32.h -- tables for rapid CRC calculation\n"); - fprintf(out, " * Generated automatically by crc32.c\n */\n\n"); - fprintf(out, "local const z_crc_t FAR "); - fprintf(out, "crc_table[TBLS][256] =\n{\n {\n"); - write_table(out, crc_table[0]); -# ifdef BYFOUR - fprintf(out, "#ifdef BYFOUR\n"); - for (k = 1; k < 8; k++) { - fprintf(out, " },\n {\n"); - write_table(out, crc_table[k]); + + /* write out little-endian CRC table to crc32.h */ + fprintf(out, + "/* crc32.h -- tables for rapid CRC calculation\n" + " * Generated automatically by crc32.c\n */\n" + "\n" + "local const z_crc_t FAR crc_table[] = {\n" + " "); + write_table(out, crc_table, 256); + fprintf(out, + "};\n"); + + /* write out big-endian CRC table for 64-bit z_word_t to crc32.h */ + fprintf(out, + "\n" + "#ifdef W\n" + "\n" + "#if W == 8\n" + "\n" + "local const z_word_t FAR crc_big_table[] = {\n" + " "); + write_table64(out, crc_big_table, 256); + fprintf(out, + "};\n"); + + /* write out big-endian CRC table for 32-bit z_word_t to crc32.h */ + fprintf(out, + "\n" + "#else /* W == 4 */\n" + "\n" + "local const z_word_t FAR crc_big_table[] = {\n" + " "); + write_table32hi(out, crc_big_table, 256); + fprintf(out, + "};\n" + "\n" + "#endif\n"); + + /* write out braid tables for each value of N */ + for (n = 1; n <= 6; n++) { + fprintf(out, + "\n" + "#if N == %d\n", n); + + /* compute braid tables for this N and 64-bit word_t */ + braid(ltl, big, n, 8); + + /* write out braid tables for 64-bit z_word_t to crc32.h */ + fprintf(out, + "\n" + "#if W == 8\n" + "\n" + "local const z_crc_t FAR crc_braid_table[][256] = {\n"); + for (k = 0; k < 8; k++) { + fprintf(out, " {"); + write_table(out, ltl[k], 256); + fprintf(out, "}%s", k < 7 ? ",\n" : ""); + } + fprintf(out, + "};\n" + "\n" + "local const z_word_t FAR crc_braid_big_table[][256] = {\n"); + for (k = 0; k < 8; k++) { + fprintf(out, " {"); + write_table64(out, big[k], 256); + fprintf(out, "}%s", k < 7 ? ",\n" : ""); + } + fprintf(out, + "};\n"); + + /* compute braid tables for this N and 32-bit word_t */ + braid(ltl, big, n, 4); + + /* write out braid tables for 32-bit z_word_t to crc32.h */ + fprintf(out, + "\n" + "#else /* W == 4 */\n" + "\n" + "local const z_crc_t FAR crc_braid_table[][256] = {\n"); + for (k = 0; k < 4; k++) { + fprintf(out, " {"); + write_table(out, ltl[k], 256); + fprintf(out, "}%s", k < 3 ? ",\n" : ""); + } + fprintf(out, + "};\n" + "\n" + "local const z_word_t FAR crc_braid_big_table[][256] = {\n"); + for (k = 0; k < 4; k++) { + fprintf(out, " {"); + write_table32hi(out, big[k], 256); + fprintf(out, "}%s", k < 3 ? ",\n" : ""); + } + fprintf(out, + "};\n" + "\n" + "#endif\n" + "\n" + "#endif\n"); } - fprintf(out, "#endif\n"); -# endif /* BYFOUR */ - fprintf(out, " }\n};\n"); + fprintf(out, + "\n" + "#endif\n"); + + /* write out zeros operator table to crc32.h */ + fprintf(out, + "\n" + "local const z_crc_t FAR x2n_table[] = {\n" + " "); + write_table(out, x2n_table, 32); + fprintf(out, + "};\n"); fclose(out); } #endif /* MAKECRCH */ } #ifdef MAKECRCH -local void write_table(out, table) + +/* + Write the 32-bit values in table[0..k-1] to out, five per line in + hexadecimal separated by commas. + */ +local void write_table(out, table, k) FILE *out; const z_crc_t FAR *table; + int k; { int n; - for (n = 0; n < 256; n++) - fprintf(out, "%s0x%08lxUL%s", n % 5 ? "" : " ", + for (n = 0; n < k; n++) + fprintf(out, "%s0x%08lx%s", n == 0 || n % 5 ? "" : " ", (unsigned long)(table[n]), - n == 255 ? "\n" : (n % 5 == 4 ? ",\n" : ", ")); + n == k - 1 ? "" : (n % 5 == 4 ? ",\n" : ", ")); } + +/* + Write the high 32-bits of each value in table[0..k-1] to out, five per line + in hexadecimal separated by commas. + */ +local void write_table32hi(out, table, k) +FILE *out; +const z_word_t FAR *table; +int k; +{ + int n; + + for (n = 0; n < k; n++) + fprintf(out, "%s0x%08lx%s", n == 0 || n % 5 ? "" : " ", + (unsigned long)(table[n] >> 32), + n == k - 1 ? "" : (n % 5 == 4 ? ",\n" : ", ")); +} + +/* + Write the 64-bit values in table[0..k-1] to out, three per line in + hexadecimal separated by commas. This assumes that if there is a 64-bit + type, then there is also a long long integer type, and it is at least 64 + bits. If not, then the type cast and format string can be adjusted + accordingly. + */ +local void write_table64(out, table, k) + FILE *out; + const z_word_t FAR *table; + int k; +{ + int n; + + for (n = 0; n < k; n++) + fprintf(out, "%s0x%016llx%s", n == 0 || n % 3 ? "" : " ", + (unsigned long long)(table[n]), + n == k - 1 ? "" : (n % 3 == 2 ? ",\n" : ", ")); +} + +/* Actually do the deed. */ +int main() +{ + make_crc_table(); + return 0; +} + #endif /* MAKECRCH */ +#ifdef W +/* + Generate the little and big-endian braid tables for the given n and z_word_t + size w. Each array must have room for w blocks of 256 elements. + */ +local void braid(ltl, big, n, w) + z_crc_t ltl[][256]; + z_word_t big[][256]; + int n; + int w; +{ + int k; + z_crc_t i, p, q; + for (k = 0; k < w; k++) { + p = x2nmodp((n * w + 3 - k) << 3, 0); + ltl[k][0] = 0; + big[w - 1 - k][0] = 0; + for (i = 1; i < 256; i++) { + ltl[k][i] = q = multmodp(i << 24, p); + big[w - 1 - k][i] = byte_swap(q); + } + } +} +#endif + #else /* !DYNAMIC_CRC_TABLE */ /* ======================================================================== - * Tables of CRC-32s of all single-byte values, made by make_crc_table(). + * Tables for byte-wise and braided CRC-32 calculations, and a table of powers + * of x for combining CRC-32s, all made by make_crc_table(). */ #include "crc32.h" #endif /* DYNAMIC_CRC_TABLE */ +/* ======================================================================== + * Routines used for CRC calculation. Some are also required for the table + * generation above. + */ + +/* + Return a(x) multiplied by b(x) modulo p(x), where p(x) is the CRC polynomial, + reflected. For speed, this requires that a not be zero. + */ +local z_crc_t multmodp(a, b) + z_crc_t a; + z_crc_t b; +{ + z_crc_t m, p; + + m = (z_crc_t)1 << 31; + p = 0; + for (;;) { + if (a & m) { + p ^= b; + if ((a & (m - 1)) == 0) + break; + } + m >>= 1; + b = b & 1 ? (b >> 1) ^ POLY : b >> 1; + } + return p; +} + +/* + Return x^(n * 2^k) modulo p(x). Requires that x2n_table[] has been + initialized. + */ +local z_crc_t x2nmodp(n, k) + z_off64_t n; + unsigned k; +{ + z_crc_t p; + + p = (z_crc_t)1 << 31; /* x^0 == 1 */ + while (n) { + if (n & 1) + p = multmodp(x2n_table[k & 31], p); + n >>= 1; + k++; + } + return p; +} + /* ========================================================================= - * This function can be used by asm versions of crc32() + * This function can be used by asm versions of crc32(), and to force the + * generation of the CRC tables in a threaded application. */ const z_crc_t FAR * ZEXPORT get_crc_table() { #ifdef DYNAMIC_CRC_TABLE - if (crc_table_empty) - make_crc_table(); + once(&made, make_crc_table); #endif /* DYNAMIC_CRC_TABLE */ return (const z_crc_t FAR *)crc_table; } -/* ========================================================================= */ -#define DO1 crc = crc_table[0][((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8) -#define DO8 DO1; DO1; DO1; DO1; DO1; DO1; DO1; DO1 +/* ========================================================================= + * Use ARM machine instructions if available. This will compute the CRC about + * ten times faster than the braided calculation. This code does not check for + * the presence of the CRC instruction at run time. __ARM_FEATURE_CRC32 will + * only be defined if the compilation specifies an ARM processor architecture + * that has the instructions. For example, compiling with -march=armv8.1-a or + * -march=armv8-a+crc, or -march=native if the compile machine has the crc32 + * instructions. + */ +#ifdef ARMCRC32 + +/* + Constants empirically determined to maximize speed. These values are from + measurements on a Cortex-A57. Your mileage may vary. + */ +#define Z_BATCH 3990 /* number of words in a batch */ +#define Z_BATCH_ZEROS 0xa10d3d0c /* computed from Z_BATCH = 3990 */ +#define Z_BATCH_MIN 800 /* fewest words in a final batch */ -/* ========================================================================= */ unsigned long ZEXPORT crc32_z(crc, buf, len) unsigned long crc; const unsigned char FAR *buf; z_size_t len; { - if (buf == Z_NULL) return 0UL; + z_crc_t val; + z_word_t crc1, crc2; + const z_word_t *word; + z_word_t val0, val1, val2; + z_size_t last, last2, i; + z_size_t num; + + /* Return initial CRC, if requested. */ + if (buf == Z_NULL) return 0; #ifdef DYNAMIC_CRC_TABLE - if (crc_table_empty) - make_crc_table(); + once(&made, make_crc_table); #endif /* DYNAMIC_CRC_TABLE */ -#ifdef BYFOUR - if (sizeof(void *) == sizeof(ptrdiff_t)) { - z_crc_t endian; + /* Pre-condition the CRC */ + crc ^= 0xffffffff; - endian = 1; - if (*((unsigned char *)(&endian))) - return crc32_little(crc, buf, len); - else - return crc32_big(crc, buf, len); + /* Compute the CRC up to a word boundary. */ + while (len && ((z_size_t)buf & 7) != 0) { + len--; + val = *buf++; + __asm__ volatile("crc32b %w0, %w0, %w1" : "+r"(crc) : "r"(val)); } -#endif /* BYFOUR */ - crc = crc ^ 0xffffffffUL; - while (len >= 8) { - DO8; - len -= 8; + + /* Prepare to compute the CRC on full 64-bit words word[0..num-1]. */ + word = (z_word_t const *)buf; + num = len >> 3; + len &= 7; + + /* Do three interleaved CRCs to realize the throughput of one crc32x + instruction per cycle. Each CRC is calcuated on Z_BATCH words. The three + CRCs are combined into a single CRC after each set of batches. */ + while (num >= 3 * Z_BATCH) { + crc1 = 0; + crc2 = 0; + for (i = 0; i < Z_BATCH; i++) { + val0 = word[i]; + val1 = word[i + Z_BATCH]; + val2 = word[i + 2 * Z_BATCH]; + __asm__ volatile("crc32x %w0, %w0, %x1" : "+r"(crc) : "r"(val0)); + __asm__ volatile("crc32x %w0, %w0, %x1" : "+r"(crc1) : "r"(val1)); + __asm__ volatile("crc32x %w0, %w0, %x1" : "+r"(crc2) : "r"(val2)); + } + word += 3 * Z_BATCH; + num -= 3 * Z_BATCH; + crc = multmodp(Z_BATCH_ZEROS, crc) ^ crc1; + crc = multmodp(Z_BATCH_ZEROS, crc) ^ crc2; } - if (len) do { - DO1; - } while (--len); - return crc ^ 0xffffffffUL; -} -/* ========================================================================= */ -unsigned long ZEXPORT crc32(crc, buf, len) - unsigned long crc; - const unsigned char FAR *buf; - uInt len; -{ - return crc32_z(crc, buf, len); + /* Do one last smaller batch with the remaining words, if there are enough + to pay for the combination of CRCs. */ + last = num / 3; + if (last >= Z_BATCH_MIN) { + last2 = last << 1; + crc1 = 0; + crc2 = 0; + for (i = 0; i < last; i++) { + val0 = word[i]; + val1 = word[i + last]; + val2 = word[i + last2]; + __asm__ volatile("crc32x %w0, %w0, %x1" : "+r"(crc) : "r"(val0)); + __asm__ volatile("crc32x %w0, %w0, %x1" : "+r"(crc1) : "r"(val1)); + __asm__ volatile("crc32x %w0, %w0, %x1" : "+r"(crc2) : "r"(val2)); + } + word += 3 * last; + num -= 3 * last; + val = x2nmodp(last, 6); + crc = multmodp(val, crc) ^ crc1; + crc = multmodp(val, crc) ^ crc2; + } + + /* Compute the CRC on any remaining words. */ + for (i = 0; i < num; i++) { + val0 = word[i]; + __asm__ volatile("crc32x %w0, %w0, %x1" : "+r"(crc) : "r"(val0)); + } + word += num; + + /* Complete the CRC on any remaining bytes. */ + buf = (const unsigned char FAR *)word; + while (len) { + len--; + val = *buf++; + __asm__ volatile("crc32b %w0, %w0, %w1" : "+r"(crc) : "r"(val)); + } + + /* Return the CRC, post-conditioned. */ + return crc ^ 0xffffffff; } -#ifdef BYFOUR +#else + +#ifdef W /* - This BYFOUR code accesses the passed unsigned char * buffer with a 32-bit - integer pointer type. This violates the strict aliasing rule, where a - compiler can assume, for optimization purposes, that two pointers to - fundamentally different types won't ever point to the same memory. This can - manifest as a problem only if one of the pointers is written to. This code - only reads from those pointers. So long as this code remains isolated in - this compilation unit, there won't be a problem. For this reason, this code - should not be copied and pasted into a compilation unit in which other code - writes to the buffer that is passed to these routines. + Return the CRC of the W bytes in the word_t data, taking the + least-significant byte of the word as the first byte of data, without any pre + or post conditioning. This is used to combine the CRCs of each braid. */ +local z_crc_t crc_word(data) + z_word_t data; +{ + int k; + for (k = 0; k < W; k++) + data = (data >> 8) ^ crc_table[data & 0xff]; + return (z_crc_t)data; +} -/* ========================================================================= */ -#define DOLIT4 c ^= *buf4++; \ - c = crc_table[3][c & 0xff] ^ crc_table[2][(c >> 8) & 0xff] ^ \ - crc_table[1][(c >> 16) & 0xff] ^ crc_table[0][c >> 24] -#define DOLIT32 DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4 +local z_word_t crc_word_big(data) + z_word_t data; +{ + int k; + for (k = 0; k < W; k++) + data = (data << 8) ^ + crc_big_table[(data >> ((W - 1) << 3)) & 0xff]; + return data; +} + +#endif /* ========================================================================= */ -local unsigned long crc32_little(crc, buf, len) +unsigned long ZEXPORT crc32_z(crc, buf, len) unsigned long crc; const unsigned char FAR *buf; z_size_t len; { - register z_crc_t c; - register const z_crc_t FAR *buf4; + /* Return initial CRC, if requested. */ + if (buf == Z_NULL) return 0; - c = (z_crc_t)crc; - c = ~c; - while (len && ((ptrdiff_t)buf & 3)) { - c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8); - len--; - } +#ifdef DYNAMIC_CRC_TABLE + once(&made, make_crc_table); +#endif /* DYNAMIC_CRC_TABLE */ - buf4 = (const z_crc_t FAR *)(const void FAR *)buf; - while (len >= 32) { - DOLIT32; - len -= 32; - } - while (len >= 4) { - DOLIT4; - len -= 4; - } - buf = (const unsigned char FAR *)buf4; + /* Pre-condition the CRC */ + crc ^= 0xffffffff; - if (len) do { - c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8); - } while (--len); - c = ~c; - return (unsigned long)c; -} +#ifdef W -/* ========================================================================= */ -#define DOBIG4 c ^= *buf4++; \ - c = crc_table[4][c & 0xff] ^ crc_table[5][(c >> 8) & 0xff] ^ \ - crc_table[6][(c >> 16) & 0xff] ^ crc_table[7][c >> 24] -#define DOBIG32 DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4 + /* If provided enough bytes, do a braided CRC calculation. */ + if (len >= N * W + W - 1) { + z_size_t blks; + z_word_t const *words; + unsigned endian; + int k; -/* ========================================================================= */ -local unsigned long crc32_big(crc, buf, len) - unsigned long crc; - const unsigned char FAR *buf; - z_size_t len; -{ - register z_crc_t c; - register const z_crc_t FAR *buf4; + /* Compute the CRC up to a z_word_t boundary. */ + while (len && ((z_size_t)buf & (W - 1)) != 0) { + len--; + crc = (crc >> 8) ^ crc_table[(crc ^ *buf++) & 0xff]; + } - c = ZSWAP32((z_crc_t)crc); - c = ~c; - while (len && ((ptrdiff_t)buf & 3)) { - c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); - len--; + /* Compute the CRC on as many N z_word_t blocks as are available. */ + blks = len / (N * W); + len -= blks * N * W; + words = (z_word_t const *)buf; + + /* Do endian check at execution time instead of compile time, since ARM + processors can change the endianess at execution time. If the + compiler knows what the endianess will be, it can optimize out the + check and the unused branch. */ + endian = 1; + if (*(unsigned char *)&endian) { + /* Little endian. */ + + z_crc_t crc0; + z_word_t word0; +#if N > 1 + z_crc_t crc1; + z_word_t word1; +#if N > 2 + z_crc_t crc2; + z_word_t word2; +#if N > 3 + z_crc_t crc3; + z_word_t word3; +#if N > 4 + z_crc_t crc4; + z_word_t word4; +#if N > 5 + z_crc_t crc5; + z_word_t word5; +#endif +#endif +#endif +#endif +#endif + + /* Initialize the CRC for each braid. */ + crc0 = crc; +#if N > 1 + crc1 = 0; +#if N > 2 + crc2 = 0; +#if N > 3 + crc3 = 0; +#if N > 4 + crc4 = 0; +#if N > 5 + crc5 = 0; +#endif +#endif +#endif +#endif +#endif + + /* + Process the first blks-1 blocks, computing the CRCs on each braid + independently. + */ + while (--blks) { + /* Load the word for each braid into registers. */ + word0 = crc0 ^ words[0]; +#if N > 1 + word1 = crc1 ^ words[1]; +#if N > 2 + word2 = crc2 ^ words[2]; +#if N > 3 + word3 = crc3 ^ words[3]; +#if N > 4 + word4 = crc4 ^ words[4]; +#if N > 5 + word5 = crc5 ^ words[5]; +#endif +#endif +#endif +#endif +#endif + words += N; + + /* Compute and update the CRC for each word. The loop should + get unrolled. */ + crc0 = crc_braid_table[0][word0 & 0xff]; +#if N > 1 + crc1 = crc_braid_table[0][word1 & 0xff]; +#if N > 2 + crc2 = crc_braid_table[0][word2 & 0xff]; +#if N > 3 + crc3 = crc_braid_table[0][word3 & 0xff]; +#if N > 4 + crc4 = crc_braid_table[0][word4 & 0xff]; +#if N > 5 + crc5 = crc_braid_table[0][word5 & 0xff]; +#endif +#endif +#endif +#endif +#endif + for (k = 1; k < W; k++) { + crc0 ^= crc_braid_table[k][(word0 >> (k << 3)) & 0xff]; +#if N > 1 + crc1 ^= crc_braid_table[k][(word1 >> (k << 3)) & 0xff]; +#if N > 2 + crc2 ^= crc_braid_table[k][(word2 >> (k << 3)) & 0xff]; +#if N > 3 + crc3 ^= crc_braid_table[k][(word3 >> (k << 3)) & 0xff]; +#if N > 4 + crc4 ^= crc_braid_table[k][(word4 >> (k << 3)) & 0xff]; +#if N > 5 + crc5 ^= crc_braid_table[k][(word5 >> (k << 3)) & 0xff]; +#endif +#endif +#endif +#endif +#endif + } + } + + /* + Process the last block, combining the CRCs of the N braids at the + same time. + */ + crc = crc_word(crc0 ^ words[0]); +#if N > 1 + crc = crc_word(crc1 ^ words[1] ^ crc); +#if N > 2 + crc = crc_word(crc2 ^ words[2] ^ crc); +#if N > 3 + crc = crc_word(crc3 ^ words[3] ^ crc); +#if N > 4 + crc = crc_word(crc4 ^ words[4] ^ crc); +#if N > 5 + crc = crc_word(crc5 ^ words[5] ^ crc); +#endif +#endif +#endif +#endif +#endif + words += N; + } + else { + /* Big endian. */ + + z_word_t crc0, word0, comb; +#if N > 1 + z_word_t crc1, word1; +#if N > 2 + z_word_t crc2, word2; +#if N > 3 + z_word_t crc3, word3; +#if N > 4 + z_word_t crc4, word4; +#if N > 5 + z_word_t crc5, word5; +#endif +#endif +#endif +#endif +#endif + + /* Initialize the CRC for each braid. */ + crc0 = byte_swap(crc); +#if N > 1 + crc1 = 0; +#if N > 2 + crc2 = 0; +#if N > 3 + crc3 = 0; +#if N > 4 + crc4 = 0; +#if N > 5 + crc5 = 0; +#endif +#endif +#endif +#endif +#endif + + /* + Process the first blks-1 blocks, computing the CRCs on each braid + independently. + */ + while (--blks) { + /* Load the word for each braid into registers. */ + word0 = crc0 ^ words[0]; +#if N > 1 + word1 = crc1 ^ words[1]; +#if N > 2 + word2 = crc2 ^ words[2]; +#if N > 3 + word3 = crc3 ^ words[3]; +#if N > 4 + word4 = crc4 ^ words[4]; +#if N > 5 + word5 = crc5 ^ words[5]; +#endif +#endif +#endif +#endif +#endif + words += N; + + /* Compute and update the CRC for each word. The loop should + get unrolled. */ + crc0 = crc_braid_big_table[0][word0 & 0xff]; +#if N > 1 + crc1 = crc_braid_big_table[0][word1 & 0xff]; +#if N > 2 + crc2 = crc_braid_big_table[0][word2 & 0xff]; +#if N > 3 + crc3 = crc_braid_big_table[0][word3 & 0xff]; +#if N > 4 + crc4 = crc_braid_big_table[0][word4 & 0xff]; +#if N > 5 + crc5 = crc_braid_big_table[0][word5 & 0xff]; +#endif +#endif +#endif +#endif +#endif + for (k = 1; k < W; k++) { + crc0 ^= crc_braid_big_table[k][(word0 >> (k << 3)) & 0xff]; +#if N > 1 + crc1 ^= crc_braid_big_table[k][(word1 >> (k << 3)) & 0xff]; +#if N > 2 + crc2 ^= crc_braid_big_table[k][(word2 >> (k << 3)) & 0xff]; +#if N > 3 + crc3 ^= crc_braid_big_table[k][(word3 >> (k << 3)) & 0xff]; +#if N > 4 + crc4 ^= crc_braid_big_table[k][(word4 >> (k << 3)) & 0xff]; +#if N > 5 + crc5 ^= crc_braid_big_table[k][(word5 >> (k << 3)) & 0xff]; +#endif +#endif +#endif +#endif +#endif + } + } + + /* + Process the last block, combining the CRCs of the N braids at the + same time. + */ + comb = crc_word_big(crc0 ^ words[0]); +#if N > 1 + comb = crc_word_big(crc1 ^ words[1] ^ comb); +#if N > 2 + comb = crc_word_big(crc2 ^ words[2] ^ comb); +#if N > 3 + comb = crc_word_big(crc3 ^ words[3] ^ comb); +#if N > 4 + comb = crc_word_big(crc4 ^ words[4] ^ comb); +#if N > 5 + comb = crc_word_big(crc5 ^ words[5] ^ comb); +#endif +#endif +#endif +#endif +#endif + words += N; + crc = byte_swap(comb); + } + + /* + Update the pointer to the remaining bytes to process. + */ + buf = (unsigned char const *)words; } - buf4 = (const z_crc_t FAR *)(const void FAR *)buf; - while (len >= 32) { - DOBIG32; - len -= 32; +#endif /* W */ + + /* Complete the computation of the CRC on any remaining bytes. */ + while (len >= 8) { + len -= 8; + crc = (crc >> 8) ^ crc_table[(crc ^ *buf++) & 0xff]; + crc = (crc >> 8) ^ crc_table[(crc ^ *buf++) & 0xff]; + crc = (crc >> 8) ^ crc_table[(crc ^ *buf++) & 0xff]; + crc = (crc >> 8) ^ crc_table[(crc ^ *buf++) & 0xff]; + crc = (crc >> 8) ^ crc_table[(crc ^ *buf++) & 0xff]; + crc = (crc >> 8) ^ crc_table[(crc ^ *buf++) & 0xff]; + crc = (crc >> 8) ^ crc_table[(crc ^ *buf++) & 0xff]; + crc = (crc >> 8) ^ crc_table[(crc ^ *buf++) & 0xff]; } - while (len >= 4) { - DOBIG4; - len -= 4; + while (len) { + len--; + crc = (crc >> 8) ^ crc_table[(crc ^ *buf++) & 0xff]; } - buf = (const unsigned char FAR *)buf4; - if (len) do { - c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); - } while (--len); - c = ~c; - return (unsigned long)(ZSWAP32(c)); + /* Return the CRC, post-conditioned. */ + return crc ^ 0xffffffff; } -#endif /* BYFOUR */ - -#define GF2_DIM 32 /* dimension of GF(2) vectors (length of CRC) */ +#endif /* ========================================================================= */ -local unsigned long gf2_matrix_times(mat, vec) - unsigned long *mat; - unsigned long vec; +unsigned long ZEXPORT crc32(crc, buf, len) + unsigned long crc; + const unsigned char FAR *buf; + uInt len; { - unsigned long sum; - - sum = 0; - while (vec) { - if (vec & 1) - sum ^= *mat; - vec >>= 1; - mat++; - } - return sum; + return crc32_z(crc, buf, len); } /* ========================================================================= */ -local void gf2_matrix_square(square, mat) - unsigned long *square; - unsigned long *mat; +uLong ZEXPORT crc32_combine64(crc1, crc2, len2) + uLong crc1; + uLong crc2; + z_off64_t len2; { - int n; - - for (n = 0; n < GF2_DIM; n++) - square[n] = gf2_matrix_times(mat, mat[n]); +#ifdef DYNAMIC_CRC_TABLE + once(&made, make_crc_table); +#endif /* DYNAMIC_CRC_TABLE */ + return multmodp(x2nmodp(len2, 3), crc1) ^ crc2; } /* ========================================================================= */ -local uLong crc32_combine_(crc1, crc2, len2) +uLong ZEXPORT crc32_combine(crc1, crc2, len2) uLong crc1; uLong crc2; - z_off64_t len2; + z_off_t len2; { - int n; - unsigned long row; - unsigned long even[GF2_DIM]; /* even-power-of-two zeros operator */ - unsigned long odd[GF2_DIM]; /* odd-power-of-two zeros operator */ - - /* degenerate case (also disallow negative lengths) */ - if (len2 <= 0) - return crc1; - - /* put operator for one zero bit in odd */ - odd[0] = 0xedb88320UL; /* CRC-32 polynomial */ - row = 1; - for (n = 1; n < GF2_DIM; n++) { - odd[n] = row; - row <<= 1; - } + return crc32_combine64(crc1, crc2, len2); +} - /* put operator for two zero bits in even */ - gf2_matrix_square(even, odd); - - /* put operator for four zero bits in odd */ - gf2_matrix_square(odd, even); - - /* apply len2 zeros to crc1 (first square will put the operator for one - zero byte, eight zero bits, in even) */ - do { - /* apply zeros operator for this bit of len2 */ - gf2_matrix_square(even, odd); - if (len2 & 1) - crc1 = gf2_matrix_times(even, crc1); - len2 >>= 1; - - /* if no more bits set, then done */ - if (len2 == 0) - break; - - /* another iteration of the loop with odd and even swapped */ - gf2_matrix_square(odd, even); - if (len2 & 1) - crc1 = gf2_matrix_times(odd, crc1); - len2 >>= 1; - - /* if no more bits set, then done */ - } while (len2 != 0); - - /* return combined crc */ - crc1 ^= crc2; - return crc1; +/* ========================================================================= */ +uLong ZEXPORT crc32_combine_gen64(len2) + z_off64_t len2; +{ +#ifdef DYNAMIC_CRC_TABLE + once(&made, make_crc_table); +#endif /* DYNAMIC_CRC_TABLE */ + return x2nmodp(len2, 3); } /* ========================================================================= */ -uLong ZEXPORT crc32_combine(crc1, crc2, len2) - uLong crc1; - uLong crc2; +uLong ZEXPORT crc32_combine_gen(len2) z_off_t len2; { - return crc32_combine_(crc1, crc2, len2); + return crc32_combine_gen64(len2); } -uLong ZEXPORT crc32_combine64(crc1, crc2, len2) +/* ========================================================================= */ +uLong crc32_combine_op(crc1, crc2, op) uLong crc1; uLong crc2; - z_off64_t len2; + uLong op; { - return crc32_combine_(crc1, crc2, len2); + return multmodp(op, crc1) ^ crc2; } diff --git a/vendor/zlib/crc32.h b/vendor/zlib/crc32.h index 9e0c778102..137df68d61 100644 --- a/vendor/zlib/crc32.h +++ b/vendor/zlib/crc32.h @@ -2,440 +2,9445 @@ * Generated automatically by crc32.c */ -local const z_crc_t FAR crc_table[TBLS][256] = -{ - { - 0x00000000UL, 0x77073096UL, 0xee0e612cUL, 0x990951baUL, 0x076dc419UL, - 0x706af48fUL, 0xe963a535UL, 0x9e6495a3UL, 0x0edb8832UL, 0x79dcb8a4UL, - 0xe0d5e91eUL, 0x97d2d988UL, 0x09b64c2bUL, 0x7eb17cbdUL, 0xe7b82d07UL, - 0x90bf1d91UL, 0x1db71064UL, 0x6ab020f2UL, 0xf3b97148UL, 0x84be41deUL, - 0x1adad47dUL, 0x6ddde4ebUL, 0xf4d4b551UL, 0x83d385c7UL, 0x136c9856UL, - 0x646ba8c0UL, 0xfd62f97aUL, 0x8a65c9ecUL, 0x14015c4fUL, 0x63066cd9UL, - 0xfa0f3d63UL, 0x8d080df5UL, 0x3b6e20c8UL, 0x4c69105eUL, 0xd56041e4UL, - 0xa2677172UL, 0x3c03e4d1UL, 0x4b04d447UL, 0xd20d85fdUL, 0xa50ab56bUL, - 0x35b5a8faUL, 0x42b2986cUL, 0xdbbbc9d6UL, 0xacbcf940UL, 0x32d86ce3UL, - 0x45df5c75UL, 0xdcd60dcfUL, 0xabd13d59UL, 0x26d930acUL, 0x51de003aUL, - 0xc8d75180UL, 0xbfd06116UL, 0x21b4f4b5UL, 0x56b3c423UL, 0xcfba9599UL, - 0xb8bda50fUL, 0x2802b89eUL, 0x5f058808UL, 0xc60cd9b2UL, 0xb10be924UL, - 0x2f6f7c87UL, 0x58684c11UL, 0xc1611dabUL, 0xb6662d3dUL, 0x76dc4190UL, - 0x01db7106UL, 0x98d220bcUL, 0xefd5102aUL, 0x71b18589UL, 0x06b6b51fUL, - 0x9fbfe4a5UL, 0xe8b8d433UL, 0x7807c9a2UL, 0x0f00f934UL, 0x9609a88eUL, - 0xe10e9818UL, 0x7f6a0dbbUL, 0x086d3d2dUL, 0x91646c97UL, 0xe6635c01UL, - 0x6b6b51f4UL, 0x1c6c6162UL, 0x856530d8UL, 0xf262004eUL, 0x6c0695edUL, - 0x1b01a57bUL, 0x8208f4c1UL, 0xf50fc457UL, 0x65b0d9c6UL, 0x12b7e950UL, - 0x8bbeb8eaUL, 0xfcb9887cUL, 0x62dd1ddfUL, 0x15da2d49UL, 0x8cd37cf3UL, - 0xfbd44c65UL, 0x4db26158UL, 0x3ab551ceUL, 0xa3bc0074UL, 0xd4bb30e2UL, - 0x4adfa541UL, 0x3dd895d7UL, 0xa4d1c46dUL, 0xd3d6f4fbUL, 0x4369e96aUL, - 0x346ed9fcUL, 0xad678846UL, 0xda60b8d0UL, 0x44042d73UL, 0x33031de5UL, - 0xaa0a4c5fUL, 0xdd0d7cc9UL, 0x5005713cUL, 0x270241aaUL, 0xbe0b1010UL, - 0xc90c2086UL, 0x5768b525UL, 0x206f85b3UL, 0xb966d409UL, 0xce61e49fUL, - 0x5edef90eUL, 0x29d9c998UL, 0xb0d09822UL, 0xc7d7a8b4UL, 0x59b33d17UL, - 0x2eb40d81UL, 0xb7bd5c3bUL, 0xc0ba6cadUL, 0xedb88320UL, 0x9abfb3b6UL, - 0x03b6e20cUL, 0x74b1d29aUL, 0xead54739UL, 0x9dd277afUL, 0x04db2615UL, - 0x73dc1683UL, 0xe3630b12UL, 0x94643b84UL, 0x0d6d6a3eUL, 0x7a6a5aa8UL, - 0xe40ecf0bUL, 0x9309ff9dUL, 0x0a00ae27UL, 0x7d079eb1UL, 0xf00f9344UL, - 0x8708a3d2UL, 0x1e01f268UL, 0x6906c2feUL, 0xf762575dUL, 0x806567cbUL, - 0x196c3671UL, 0x6e6b06e7UL, 0xfed41b76UL, 0x89d32be0UL, 0x10da7a5aUL, - 0x67dd4accUL, 0xf9b9df6fUL, 0x8ebeeff9UL, 0x17b7be43UL, 0x60b08ed5UL, - 0xd6d6a3e8UL, 0xa1d1937eUL, 0x38d8c2c4UL, 0x4fdff252UL, 0xd1bb67f1UL, - 0xa6bc5767UL, 0x3fb506ddUL, 0x48b2364bUL, 0xd80d2bdaUL, 0xaf0a1b4cUL, - 0x36034af6UL, 0x41047a60UL, 0xdf60efc3UL, 0xa867df55UL, 0x316e8eefUL, - 0x4669be79UL, 0xcb61b38cUL, 0xbc66831aUL, 0x256fd2a0UL, 0x5268e236UL, - 0xcc0c7795UL, 0xbb0b4703UL, 0x220216b9UL, 0x5505262fUL, 0xc5ba3bbeUL, - 0xb2bd0b28UL, 0x2bb45a92UL, 0x5cb36a04UL, 0xc2d7ffa7UL, 0xb5d0cf31UL, - 0x2cd99e8bUL, 0x5bdeae1dUL, 0x9b64c2b0UL, 0xec63f226UL, 0x756aa39cUL, - 0x026d930aUL, 0x9c0906a9UL, 0xeb0e363fUL, 0x72076785UL, 0x05005713UL, - 0x95bf4a82UL, 0xe2b87a14UL, 0x7bb12baeUL, 0x0cb61b38UL, 0x92d28e9bUL, - 0xe5d5be0dUL, 0x7cdcefb7UL, 0x0bdbdf21UL, 0x86d3d2d4UL, 0xf1d4e242UL, - 0x68ddb3f8UL, 0x1fda836eUL, 0x81be16cdUL, 0xf6b9265bUL, 0x6fb077e1UL, - 0x18b74777UL, 0x88085ae6UL, 0xff0f6a70UL, 0x66063bcaUL, 0x11010b5cUL, - 0x8f659effUL, 0xf862ae69UL, 0x616bffd3UL, 0x166ccf45UL, 0xa00ae278UL, - 0xd70dd2eeUL, 0x4e048354UL, 0x3903b3c2UL, 0xa7672661UL, 0xd06016f7UL, - 0x4969474dUL, 0x3e6e77dbUL, 0xaed16a4aUL, 0xd9d65adcUL, 0x40df0b66UL, - 0x37d83bf0UL, 0xa9bcae53UL, 0xdebb9ec5UL, 0x47b2cf7fUL, 0x30b5ffe9UL, - 0xbdbdf21cUL, 0xcabac28aUL, 0x53b39330UL, 0x24b4a3a6UL, 0xbad03605UL, - 0xcdd70693UL, 0x54de5729UL, 0x23d967bfUL, 0xb3667a2eUL, 0xc4614ab8UL, - 0x5d681b02UL, 0x2a6f2b94UL, 0xb40bbe37UL, 0xc30c8ea1UL, 0x5a05df1bUL, - 0x2d02ef8dUL -#ifdef BYFOUR - }, - { - 0x00000000UL, 0x191b3141UL, 0x32366282UL, 0x2b2d53c3UL, 0x646cc504UL, - 0x7d77f445UL, 0x565aa786UL, 0x4f4196c7UL, 0xc8d98a08UL, 0xd1c2bb49UL, - 0xfaefe88aUL, 0xe3f4d9cbUL, 0xacb54f0cUL, 0xb5ae7e4dUL, 0x9e832d8eUL, - 0x87981ccfUL, 0x4ac21251UL, 0x53d92310UL, 0x78f470d3UL, 0x61ef4192UL, - 0x2eaed755UL, 0x37b5e614UL, 0x1c98b5d7UL, 0x05838496UL, 0x821b9859UL, - 0x9b00a918UL, 0xb02dfadbUL, 0xa936cb9aUL, 0xe6775d5dUL, 0xff6c6c1cUL, - 0xd4413fdfUL, 0xcd5a0e9eUL, 0x958424a2UL, 0x8c9f15e3UL, 0xa7b24620UL, - 0xbea97761UL, 0xf1e8e1a6UL, 0xe8f3d0e7UL, 0xc3de8324UL, 0xdac5b265UL, - 0x5d5daeaaUL, 0x44469febUL, 0x6f6bcc28UL, 0x7670fd69UL, 0x39316baeUL, - 0x202a5aefUL, 0x0b07092cUL, 0x121c386dUL, 0xdf4636f3UL, 0xc65d07b2UL, - 0xed705471UL, 0xf46b6530UL, 0xbb2af3f7UL, 0xa231c2b6UL, 0x891c9175UL, - 0x9007a034UL, 0x179fbcfbUL, 0x0e848dbaUL, 0x25a9de79UL, 0x3cb2ef38UL, - 0x73f379ffUL, 0x6ae848beUL, 0x41c51b7dUL, 0x58de2a3cUL, 0xf0794f05UL, - 0xe9627e44UL, 0xc24f2d87UL, 0xdb541cc6UL, 0x94158a01UL, 0x8d0ebb40UL, - 0xa623e883UL, 0xbf38d9c2UL, 0x38a0c50dUL, 0x21bbf44cUL, 0x0a96a78fUL, - 0x138d96ceUL, 0x5ccc0009UL, 0x45d73148UL, 0x6efa628bUL, 0x77e153caUL, - 0xbabb5d54UL, 0xa3a06c15UL, 0x888d3fd6UL, 0x91960e97UL, 0xded79850UL, - 0xc7cca911UL, 0xece1fad2UL, 0xf5facb93UL, 0x7262d75cUL, 0x6b79e61dUL, - 0x4054b5deUL, 0x594f849fUL, 0x160e1258UL, 0x0f152319UL, 0x243870daUL, - 0x3d23419bUL, 0x65fd6ba7UL, 0x7ce65ae6UL, 0x57cb0925UL, 0x4ed03864UL, - 0x0191aea3UL, 0x188a9fe2UL, 0x33a7cc21UL, 0x2abcfd60UL, 0xad24e1afUL, - 0xb43fd0eeUL, 0x9f12832dUL, 0x8609b26cUL, 0xc94824abUL, 0xd05315eaUL, - 0xfb7e4629UL, 0xe2657768UL, 0x2f3f79f6UL, 0x362448b7UL, 0x1d091b74UL, - 0x04122a35UL, 0x4b53bcf2UL, 0x52488db3UL, 0x7965de70UL, 0x607eef31UL, - 0xe7e6f3feUL, 0xfefdc2bfUL, 0xd5d0917cUL, 0xcccba03dUL, 0x838a36faUL, - 0x9a9107bbUL, 0xb1bc5478UL, 0xa8a76539UL, 0x3b83984bUL, 0x2298a90aUL, - 0x09b5fac9UL, 0x10aecb88UL, 0x5fef5d4fUL, 0x46f46c0eUL, 0x6dd93fcdUL, - 0x74c20e8cUL, 0xf35a1243UL, 0xea412302UL, 0xc16c70c1UL, 0xd8774180UL, - 0x9736d747UL, 0x8e2de606UL, 0xa500b5c5UL, 0xbc1b8484UL, 0x71418a1aUL, - 0x685abb5bUL, 0x4377e898UL, 0x5a6cd9d9UL, 0x152d4f1eUL, 0x0c367e5fUL, - 0x271b2d9cUL, 0x3e001cddUL, 0xb9980012UL, 0xa0833153UL, 0x8bae6290UL, - 0x92b553d1UL, 0xddf4c516UL, 0xc4eff457UL, 0xefc2a794UL, 0xf6d996d5UL, - 0xae07bce9UL, 0xb71c8da8UL, 0x9c31de6bUL, 0x852aef2aUL, 0xca6b79edUL, - 0xd37048acUL, 0xf85d1b6fUL, 0xe1462a2eUL, 0x66de36e1UL, 0x7fc507a0UL, - 0x54e85463UL, 0x4df36522UL, 0x02b2f3e5UL, 0x1ba9c2a4UL, 0x30849167UL, - 0x299fa026UL, 0xe4c5aeb8UL, 0xfdde9ff9UL, 0xd6f3cc3aUL, 0xcfe8fd7bUL, - 0x80a96bbcUL, 0x99b25afdUL, 0xb29f093eUL, 0xab84387fUL, 0x2c1c24b0UL, - 0x350715f1UL, 0x1e2a4632UL, 0x07317773UL, 0x4870e1b4UL, 0x516bd0f5UL, - 0x7a468336UL, 0x635db277UL, 0xcbfad74eUL, 0xd2e1e60fUL, 0xf9ccb5ccUL, - 0xe0d7848dUL, 0xaf96124aUL, 0xb68d230bUL, 0x9da070c8UL, 0x84bb4189UL, - 0x03235d46UL, 0x1a386c07UL, 0x31153fc4UL, 0x280e0e85UL, 0x674f9842UL, - 0x7e54a903UL, 0x5579fac0UL, 0x4c62cb81UL, 0x8138c51fUL, 0x9823f45eUL, - 0xb30ea79dUL, 0xaa1596dcUL, 0xe554001bUL, 0xfc4f315aUL, 0xd7626299UL, - 0xce7953d8UL, 0x49e14f17UL, 0x50fa7e56UL, 0x7bd72d95UL, 0x62cc1cd4UL, - 0x2d8d8a13UL, 0x3496bb52UL, 0x1fbbe891UL, 0x06a0d9d0UL, 0x5e7ef3ecUL, - 0x4765c2adUL, 0x6c48916eUL, 0x7553a02fUL, 0x3a1236e8UL, 0x230907a9UL, - 0x0824546aUL, 0x113f652bUL, 0x96a779e4UL, 0x8fbc48a5UL, 0xa4911b66UL, - 0xbd8a2a27UL, 0xf2cbbce0UL, 0xebd08da1UL, 0xc0fdde62UL, 0xd9e6ef23UL, - 0x14bce1bdUL, 0x0da7d0fcUL, 0x268a833fUL, 0x3f91b27eUL, 0x70d024b9UL, - 0x69cb15f8UL, 0x42e6463bUL, 0x5bfd777aUL, 0xdc656bb5UL, 0xc57e5af4UL, - 0xee530937UL, 0xf7483876UL, 0xb809aeb1UL, 0xa1129ff0UL, 0x8a3fcc33UL, - 0x9324fd72UL - }, - { - 0x00000000UL, 0x01c26a37UL, 0x0384d46eUL, 0x0246be59UL, 0x0709a8dcUL, - 0x06cbc2ebUL, 0x048d7cb2UL, 0x054f1685UL, 0x0e1351b8UL, 0x0fd13b8fUL, - 0x0d9785d6UL, 0x0c55efe1UL, 0x091af964UL, 0x08d89353UL, 0x0a9e2d0aUL, - 0x0b5c473dUL, 0x1c26a370UL, 0x1de4c947UL, 0x1fa2771eUL, 0x1e601d29UL, - 0x1b2f0bacUL, 0x1aed619bUL, 0x18abdfc2UL, 0x1969b5f5UL, 0x1235f2c8UL, - 0x13f798ffUL, 0x11b126a6UL, 0x10734c91UL, 0x153c5a14UL, 0x14fe3023UL, - 0x16b88e7aUL, 0x177ae44dUL, 0x384d46e0UL, 0x398f2cd7UL, 0x3bc9928eUL, - 0x3a0bf8b9UL, 0x3f44ee3cUL, 0x3e86840bUL, 0x3cc03a52UL, 0x3d025065UL, - 0x365e1758UL, 0x379c7d6fUL, 0x35dac336UL, 0x3418a901UL, 0x3157bf84UL, - 0x3095d5b3UL, 0x32d36beaUL, 0x331101ddUL, 0x246be590UL, 0x25a98fa7UL, - 0x27ef31feUL, 0x262d5bc9UL, 0x23624d4cUL, 0x22a0277bUL, 0x20e69922UL, - 0x2124f315UL, 0x2a78b428UL, 0x2bbade1fUL, 0x29fc6046UL, 0x283e0a71UL, - 0x2d711cf4UL, 0x2cb376c3UL, 0x2ef5c89aUL, 0x2f37a2adUL, 0x709a8dc0UL, - 0x7158e7f7UL, 0x731e59aeUL, 0x72dc3399UL, 0x7793251cUL, 0x76514f2bUL, - 0x7417f172UL, 0x75d59b45UL, 0x7e89dc78UL, 0x7f4bb64fUL, 0x7d0d0816UL, - 0x7ccf6221UL, 0x798074a4UL, 0x78421e93UL, 0x7a04a0caUL, 0x7bc6cafdUL, - 0x6cbc2eb0UL, 0x6d7e4487UL, 0x6f38fadeUL, 0x6efa90e9UL, 0x6bb5866cUL, - 0x6a77ec5bUL, 0x68315202UL, 0x69f33835UL, 0x62af7f08UL, 0x636d153fUL, - 0x612bab66UL, 0x60e9c151UL, 0x65a6d7d4UL, 0x6464bde3UL, 0x662203baUL, - 0x67e0698dUL, 0x48d7cb20UL, 0x4915a117UL, 0x4b531f4eUL, 0x4a917579UL, - 0x4fde63fcUL, 0x4e1c09cbUL, 0x4c5ab792UL, 0x4d98dda5UL, 0x46c49a98UL, - 0x4706f0afUL, 0x45404ef6UL, 0x448224c1UL, 0x41cd3244UL, 0x400f5873UL, - 0x4249e62aUL, 0x438b8c1dUL, 0x54f16850UL, 0x55330267UL, 0x5775bc3eUL, - 0x56b7d609UL, 0x53f8c08cUL, 0x523aaabbUL, 0x507c14e2UL, 0x51be7ed5UL, - 0x5ae239e8UL, 0x5b2053dfUL, 0x5966ed86UL, 0x58a487b1UL, 0x5deb9134UL, - 0x5c29fb03UL, 0x5e6f455aUL, 0x5fad2f6dUL, 0xe1351b80UL, 0xe0f771b7UL, - 0xe2b1cfeeUL, 0xe373a5d9UL, 0xe63cb35cUL, 0xe7fed96bUL, 0xe5b86732UL, - 0xe47a0d05UL, 0xef264a38UL, 0xeee4200fUL, 0xeca29e56UL, 0xed60f461UL, - 0xe82fe2e4UL, 0xe9ed88d3UL, 0xebab368aUL, 0xea695cbdUL, 0xfd13b8f0UL, - 0xfcd1d2c7UL, 0xfe976c9eUL, 0xff5506a9UL, 0xfa1a102cUL, 0xfbd87a1bUL, - 0xf99ec442UL, 0xf85cae75UL, 0xf300e948UL, 0xf2c2837fUL, 0xf0843d26UL, - 0xf1465711UL, 0xf4094194UL, 0xf5cb2ba3UL, 0xf78d95faUL, 0xf64fffcdUL, - 0xd9785d60UL, 0xd8ba3757UL, 0xdafc890eUL, 0xdb3ee339UL, 0xde71f5bcUL, - 0xdfb39f8bUL, 0xddf521d2UL, 0xdc374be5UL, 0xd76b0cd8UL, 0xd6a966efUL, - 0xd4efd8b6UL, 0xd52db281UL, 0xd062a404UL, 0xd1a0ce33UL, 0xd3e6706aUL, - 0xd2241a5dUL, 0xc55efe10UL, 0xc49c9427UL, 0xc6da2a7eUL, 0xc7184049UL, - 0xc25756ccUL, 0xc3953cfbUL, 0xc1d382a2UL, 0xc011e895UL, 0xcb4dafa8UL, - 0xca8fc59fUL, 0xc8c97bc6UL, 0xc90b11f1UL, 0xcc440774UL, 0xcd866d43UL, - 0xcfc0d31aUL, 0xce02b92dUL, 0x91af9640UL, 0x906dfc77UL, 0x922b422eUL, - 0x93e92819UL, 0x96a63e9cUL, 0x976454abUL, 0x9522eaf2UL, 0x94e080c5UL, - 0x9fbcc7f8UL, 0x9e7eadcfUL, 0x9c381396UL, 0x9dfa79a1UL, 0x98b56f24UL, - 0x99770513UL, 0x9b31bb4aUL, 0x9af3d17dUL, 0x8d893530UL, 0x8c4b5f07UL, - 0x8e0de15eUL, 0x8fcf8b69UL, 0x8a809decUL, 0x8b42f7dbUL, 0x89044982UL, - 0x88c623b5UL, 0x839a6488UL, 0x82580ebfUL, 0x801eb0e6UL, 0x81dcdad1UL, - 0x8493cc54UL, 0x8551a663UL, 0x8717183aUL, 0x86d5720dUL, 0xa9e2d0a0UL, - 0xa820ba97UL, 0xaa6604ceUL, 0xaba46ef9UL, 0xaeeb787cUL, 0xaf29124bUL, - 0xad6fac12UL, 0xacadc625UL, 0xa7f18118UL, 0xa633eb2fUL, 0xa4755576UL, - 0xa5b73f41UL, 0xa0f829c4UL, 0xa13a43f3UL, 0xa37cfdaaUL, 0xa2be979dUL, - 0xb5c473d0UL, 0xb40619e7UL, 0xb640a7beUL, 0xb782cd89UL, 0xb2cddb0cUL, - 0xb30fb13bUL, 0xb1490f62UL, 0xb08b6555UL, 0xbbd72268UL, 0xba15485fUL, - 0xb853f606UL, 0xb9919c31UL, 0xbcde8ab4UL, 0xbd1ce083UL, 0xbf5a5edaUL, - 0xbe9834edUL - }, - { - 0x00000000UL, 0xb8bc6765UL, 0xaa09c88bUL, 0x12b5afeeUL, 0x8f629757UL, - 0x37def032UL, 0x256b5fdcUL, 0x9dd738b9UL, 0xc5b428efUL, 0x7d084f8aUL, - 0x6fbde064UL, 0xd7018701UL, 0x4ad6bfb8UL, 0xf26ad8ddUL, 0xe0df7733UL, - 0x58631056UL, 0x5019579fUL, 0xe8a530faUL, 0xfa109f14UL, 0x42acf871UL, - 0xdf7bc0c8UL, 0x67c7a7adUL, 0x75720843UL, 0xcdce6f26UL, 0x95ad7f70UL, - 0x2d111815UL, 0x3fa4b7fbUL, 0x8718d09eUL, 0x1acfe827UL, 0xa2738f42UL, - 0xb0c620acUL, 0x087a47c9UL, 0xa032af3eUL, 0x188ec85bUL, 0x0a3b67b5UL, - 0xb28700d0UL, 0x2f503869UL, 0x97ec5f0cUL, 0x8559f0e2UL, 0x3de59787UL, - 0x658687d1UL, 0xdd3ae0b4UL, 0xcf8f4f5aUL, 0x7733283fUL, 0xeae41086UL, - 0x525877e3UL, 0x40edd80dUL, 0xf851bf68UL, 0xf02bf8a1UL, 0x48979fc4UL, - 0x5a22302aUL, 0xe29e574fUL, 0x7f496ff6UL, 0xc7f50893UL, 0xd540a77dUL, - 0x6dfcc018UL, 0x359fd04eUL, 0x8d23b72bUL, 0x9f9618c5UL, 0x272a7fa0UL, - 0xbafd4719UL, 0x0241207cUL, 0x10f48f92UL, 0xa848e8f7UL, 0x9b14583dUL, - 0x23a83f58UL, 0x311d90b6UL, 0x89a1f7d3UL, 0x1476cf6aUL, 0xaccaa80fUL, - 0xbe7f07e1UL, 0x06c36084UL, 0x5ea070d2UL, 0xe61c17b7UL, 0xf4a9b859UL, - 0x4c15df3cUL, 0xd1c2e785UL, 0x697e80e0UL, 0x7bcb2f0eUL, 0xc377486bUL, - 0xcb0d0fa2UL, 0x73b168c7UL, 0x6104c729UL, 0xd9b8a04cUL, 0x446f98f5UL, - 0xfcd3ff90UL, 0xee66507eUL, 0x56da371bUL, 0x0eb9274dUL, 0xb6054028UL, - 0xa4b0efc6UL, 0x1c0c88a3UL, 0x81dbb01aUL, 0x3967d77fUL, 0x2bd27891UL, - 0x936e1ff4UL, 0x3b26f703UL, 0x839a9066UL, 0x912f3f88UL, 0x299358edUL, - 0xb4446054UL, 0x0cf80731UL, 0x1e4da8dfUL, 0xa6f1cfbaUL, 0xfe92dfecUL, - 0x462eb889UL, 0x549b1767UL, 0xec277002UL, 0x71f048bbUL, 0xc94c2fdeUL, - 0xdbf98030UL, 0x6345e755UL, 0x6b3fa09cUL, 0xd383c7f9UL, 0xc1366817UL, - 0x798a0f72UL, 0xe45d37cbUL, 0x5ce150aeUL, 0x4e54ff40UL, 0xf6e89825UL, - 0xae8b8873UL, 0x1637ef16UL, 0x048240f8UL, 0xbc3e279dUL, 0x21e91f24UL, - 0x99557841UL, 0x8be0d7afUL, 0x335cb0caUL, 0xed59b63bUL, 0x55e5d15eUL, - 0x47507eb0UL, 0xffec19d5UL, 0x623b216cUL, 0xda874609UL, 0xc832e9e7UL, - 0x708e8e82UL, 0x28ed9ed4UL, 0x9051f9b1UL, 0x82e4565fUL, 0x3a58313aUL, - 0xa78f0983UL, 0x1f336ee6UL, 0x0d86c108UL, 0xb53aa66dUL, 0xbd40e1a4UL, - 0x05fc86c1UL, 0x1749292fUL, 0xaff54e4aUL, 0x322276f3UL, 0x8a9e1196UL, - 0x982bbe78UL, 0x2097d91dUL, 0x78f4c94bUL, 0xc048ae2eUL, 0xd2fd01c0UL, - 0x6a4166a5UL, 0xf7965e1cUL, 0x4f2a3979UL, 0x5d9f9697UL, 0xe523f1f2UL, - 0x4d6b1905UL, 0xf5d77e60UL, 0xe762d18eUL, 0x5fdeb6ebUL, 0xc2098e52UL, - 0x7ab5e937UL, 0x680046d9UL, 0xd0bc21bcUL, 0x88df31eaUL, 0x3063568fUL, - 0x22d6f961UL, 0x9a6a9e04UL, 0x07bda6bdUL, 0xbf01c1d8UL, 0xadb46e36UL, - 0x15080953UL, 0x1d724e9aUL, 0xa5ce29ffUL, 0xb77b8611UL, 0x0fc7e174UL, - 0x9210d9cdUL, 0x2aacbea8UL, 0x38191146UL, 0x80a57623UL, 0xd8c66675UL, - 0x607a0110UL, 0x72cfaefeUL, 0xca73c99bUL, 0x57a4f122UL, 0xef189647UL, - 0xfdad39a9UL, 0x45115eccUL, 0x764dee06UL, 0xcef18963UL, 0xdc44268dUL, - 0x64f841e8UL, 0xf92f7951UL, 0x41931e34UL, 0x5326b1daUL, 0xeb9ad6bfUL, - 0xb3f9c6e9UL, 0x0b45a18cUL, 0x19f00e62UL, 0xa14c6907UL, 0x3c9b51beUL, - 0x842736dbUL, 0x96929935UL, 0x2e2efe50UL, 0x2654b999UL, 0x9ee8defcUL, - 0x8c5d7112UL, 0x34e11677UL, 0xa9362eceUL, 0x118a49abUL, 0x033fe645UL, - 0xbb838120UL, 0xe3e09176UL, 0x5b5cf613UL, 0x49e959fdUL, 0xf1553e98UL, - 0x6c820621UL, 0xd43e6144UL, 0xc68bceaaUL, 0x7e37a9cfUL, 0xd67f4138UL, - 0x6ec3265dUL, 0x7c7689b3UL, 0xc4caeed6UL, 0x591dd66fUL, 0xe1a1b10aUL, - 0xf3141ee4UL, 0x4ba87981UL, 0x13cb69d7UL, 0xab770eb2UL, 0xb9c2a15cUL, - 0x017ec639UL, 0x9ca9fe80UL, 0x241599e5UL, 0x36a0360bUL, 0x8e1c516eUL, - 0x866616a7UL, 0x3eda71c2UL, 0x2c6fde2cUL, 0x94d3b949UL, 0x090481f0UL, - 0xb1b8e695UL, 0xa30d497bUL, 0x1bb12e1eUL, 0x43d23e48UL, 0xfb6e592dUL, - 0xe9dbf6c3UL, 0x516791a6UL, 0xccb0a91fUL, 0x740cce7aUL, 0x66b96194UL, - 0xde0506f1UL - }, - { - 0x00000000UL, 0x96300777UL, 0x2c610eeeUL, 0xba510999UL, 0x19c46d07UL, - 0x8ff46a70UL, 0x35a563e9UL, 0xa395649eUL, 0x3288db0eUL, 0xa4b8dc79UL, - 0x1ee9d5e0UL, 0x88d9d297UL, 0x2b4cb609UL, 0xbd7cb17eUL, 0x072db8e7UL, - 0x911dbf90UL, 0x6410b71dUL, 0xf220b06aUL, 0x4871b9f3UL, 0xde41be84UL, - 0x7dd4da1aUL, 0xebe4dd6dUL, 0x51b5d4f4UL, 0xc785d383UL, 0x56986c13UL, - 0xc0a86b64UL, 0x7af962fdUL, 0xecc9658aUL, 0x4f5c0114UL, 0xd96c0663UL, - 0x633d0ffaUL, 0xf50d088dUL, 0xc8206e3bUL, 0x5e10694cUL, 0xe44160d5UL, - 0x727167a2UL, 0xd1e4033cUL, 0x47d4044bUL, 0xfd850dd2UL, 0x6bb50aa5UL, - 0xfaa8b535UL, 0x6c98b242UL, 0xd6c9bbdbUL, 0x40f9bcacUL, 0xe36cd832UL, - 0x755cdf45UL, 0xcf0dd6dcUL, 0x593dd1abUL, 0xac30d926UL, 0x3a00de51UL, - 0x8051d7c8UL, 0x1661d0bfUL, 0xb5f4b421UL, 0x23c4b356UL, 0x9995bacfUL, - 0x0fa5bdb8UL, 0x9eb80228UL, 0x0888055fUL, 0xb2d90cc6UL, 0x24e90bb1UL, - 0x877c6f2fUL, 0x114c6858UL, 0xab1d61c1UL, 0x3d2d66b6UL, 0x9041dc76UL, - 0x0671db01UL, 0xbc20d298UL, 0x2a10d5efUL, 0x8985b171UL, 0x1fb5b606UL, - 0xa5e4bf9fUL, 0x33d4b8e8UL, 0xa2c90778UL, 0x34f9000fUL, 0x8ea80996UL, - 0x18980ee1UL, 0xbb0d6a7fUL, 0x2d3d6d08UL, 0x976c6491UL, 0x015c63e6UL, - 0xf4516b6bUL, 0x62616c1cUL, 0xd8306585UL, 0x4e0062f2UL, 0xed95066cUL, - 0x7ba5011bUL, 0xc1f40882UL, 0x57c40ff5UL, 0xc6d9b065UL, 0x50e9b712UL, - 0xeab8be8bUL, 0x7c88b9fcUL, 0xdf1ddd62UL, 0x492dda15UL, 0xf37cd38cUL, - 0x654cd4fbUL, 0x5861b24dUL, 0xce51b53aUL, 0x7400bca3UL, 0xe230bbd4UL, - 0x41a5df4aUL, 0xd795d83dUL, 0x6dc4d1a4UL, 0xfbf4d6d3UL, 0x6ae96943UL, - 0xfcd96e34UL, 0x468867adUL, 0xd0b860daUL, 0x732d0444UL, 0xe51d0333UL, - 0x5f4c0aaaUL, 0xc97c0dddUL, 0x3c710550UL, 0xaa410227UL, 0x10100bbeUL, - 0x86200cc9UL, 0x25b56857UL, 0xb3856f20UL, 0x09d466b9UL, 0x9fe461ceUL, - 0x0ef9de5eUL, 0x98c9d929UL, 0x2298d0b0UL, 0xb4a8d7c7UL, 0x173db359UL, - 0x810db42eUL, 0x3b5cbdb7UL, 0xad6cbac0UL, 0x2083b8edUL, 0xb6b3bf9aUL, - 0x0ce2b603UL, 0x9ad2b174UL, 0x3947d5eaUL, 0xaf77d29dUL, 0x1526db04UL, - 0x8316dc73UL, 0x120b63e3UL, 0x843b6494UL, 0x3e6a6d0dUL, 0xa85a6a7aUL, - 0x0bcf0ee4UL, 0x9dff0993UL, 0x27ae000aUL, 0xb19e077dUL, 0x44930ff0UL, - 0xd2a30887UL, 0x68f2011eUL, 0xfec20669UL, 0x5d5762f7UL, 0xcb676580UL, - 0x71366c19UL, 0xe7066b6eUL, 0x761bd4feUL, 0xe02bd389UL, 0x5a7ada10UL, - 0xcc4add67UL, 0x6fdfb9f9UL, 0xf9efbe8eUL, 0x43beb717UL, 0xd58eb060UL, - 0xe8a3d6d6UL, 0x7e93d1a1UL, 0xc4c2d838UL, 0x52f2df4fUL, 0xf167bbd1UL, - 0x6757bca6UL, 0xdd06b53fUL, 0x4b36b248UL, 0xda2b0dd8UL, 0x4c1b0aafUL, - 0xf64a0336UL, 0x607a0441UL, 0xc3ef60dfUL, 0x55df67a8UL, 0xef8e6e31UL, - 0x79be6946UL, 0x8cb361cbUL, 0x1a8366bcUL, 0xa0d26f25UL, 0x36e26852UL, - 0x95770cccUL, 0x03470bbbUL, 0xb9160222UL, 0x2f260555UL, 0xbe3bbac5UL, - 0x280bbdb2UL, 0x925ab42bUL, 0x046ab35cUL, 0xa7ffd7c2UL, 0x31cfd0b5UL, - 0x8b9ed92cUL, 0x1daede5bUL, 0xb0c2649bUL, 0x26f263ecUL, 0x9ca36a75UL, - 0x0a936d02UL, 0xa906099cUL, 0x3f360eebUL, 0x85670772UL, 0x13570005UL, - 0x824abf95UL, 0x147ab8e2UL, 0xae2bb17bUL, 0x381bb60cUL, 0x9b8ed292UL, - 0x0dbed5e5UL, 0xb7efdc7cUL, 0x21dfdb0bUL, 0xd4d2d386UL, 0x42e2d4f1UL, - 0xf8b3dd68UL, 0x6e83da1fUL, 0xcd16be81UL, 0x5b26b9f6UL, 0xe177b06fUL, - 0x7747b718UL, 0xe65a0888UL, 0x706a0fffUL, 0xca3b0666UL, 0x5c0b0111UL, - 0xff9e658fUL, 0x69ae62f8UL, 0xd3ff6b61UL, 0x45cf6c16UL, 0x78e20aa0UL, - 0xeed20dd7UL, 0x5483044eUL, 0xc2b30339UL, 0x612667a7UL, 0xf71660d0UL, - 0x4d476949UL, 0xdb776e3eUL, 0x4a6ad1aeUL, 0xdc5ad6d9UL, 0x660bdf40UL, - 0xf03bd837UL, 0x53aebca9UL, 0xc59ebbdeUL, 0x7fcfb247UL, 0xe9ffb530UL, - 0x1cf2bdbdUL, 0x8ac2bacaUL, 0x3093b353UL, 0xa6a3b424UL, 0x0536d0baUL, - 0x9306d7cdUL, 0x2957de54UL, 0xbf67d923UL, 0x2e7a66b3UL, 0xb84a61c4UL, - 0x021b685dUL, 0x942b6f2aUL, 0x37be0bb4UL, 0xa18e0cc3UL, 0x1bdf055aUL, - 0x8def022dUL - }, - { - 0x00000000UL, 0x41311b19UL, 0x82623632UL, 0xc3532d2bUL, 0x04c56c64UL, - 0x45f4777dUL, 0x86a75a56UL, 0xc796414fUL, 0x088ad9c8UL, 0x49bbc2d1UL, - 0x8ae8effaUL, 0xcbd9f4e3UL, 0x0c4fb5acUL, 0x4d7eaeb5UL, 0x8e2d839eUL, - 0xcf1c9887UL, 0x5112c24aUL, 0x1023d953UL, 0xd370f478UL, 0x9241ef61UL, - 0x55d7ae2eUL, 0x14e6b537UL, 0xd7b5981cUL, 0x96848305UL, 0x59981b82UL, - 0x18a9009bUL, 0xdbfa2db0UL, 0x9acb36a9UL, 0x5d5d77e6UL, 0x1c6c6cffUL, - 0xdf3f41d4UL, 0x9e0e5acdUL, 0xa2248495UL, 0xe3159f8cUL, 0x2046b2a7UL, - 0x6177a9beUL, 0xa6e1e8f1UL, 0xe7d0f3e8UL, 0x2483dec3UL, 0x65b2c5daUL, - 0xaaae5d5dUL, 0xeb9f4644UL, 0x28cc6b6fUL, 0x69fd7076UL, 0xae6b3139UL, - 0xef5a2a20UL, 0x2c09070bUL, 0x6d381c12UL, 0xf33646dfUL, 0xb2075dc6UL, - 0x715470edUL, 0x30656bf4UL, 0xf7f32abbUL, 0xb6c231a2UL, 0x75911c89UL, - 0x34a00790UL, 0xfbbc9f17UL, 0xba8d840eUL, 0x79dea925UL, 0x38efb23cUL, - 0xff79f373UL, 0xbe48e86aUL, 0x7d1bc541UL, 0x3c2ade58UL, 0x054f79f0UL, - 0x447e62e9UL, 0x872d4fc2UL, 0xc61c54dbUL, 0x018a1594UL, 0x40bb0e8dUL, - 0x83e823a6UL, 0xc2d938bfUL, 0x0dc5a038UL, 0x4cf4bb21UL, 0x8fa7960aUL, - 0xce968d13UL, 0x0900cc5cUL, 0x4831d745UL, 0x8b62fa6eUL, 0xca53e177UL, - 0x545dbbbaUL, 0x156ca0a3UL, 0xd63f8d88UL, 0x970e9691UL, 0x5098d7deUL, - 0x11a9ccc7UL, 0xd2fae1ecUL, 0x93cbfaf5UL, 0x5cd76272UL, 0x1de6796bUL, - 0xdeb55440UL, 0x9f844f59UL, 0x58120e16UL, 0x1923150fUL, 0xda703824UL, - 0x9b41233dUL, 0xa76bfd65UL, 0xe65ae67cUL, 0x2509cb57UL, 0x6438d04eUL, - 0xa3ae9101UL, 0xe29f8a18UL, 0x21cca733UL, 0x60fdbc2aUL, 0xafe124adUL, - 0xeed03fb4UL, 0x2d83129fUL, 0x6cb20986UL, 0xab2448c9UL, 0xea1553d0UL, - 0x29467efbUL, 0x687765e2UL, 0xf6793f2fUL, 0xb7482436UL, 0x741b091dUL, - 0x352a1204UL, 0xf2bc534bUL, 0xb38d4852UL, 0x70de6579UL, 0x31ef7e60UL, - 0xfef3e6e7UL, 0xbfc2fdfeUL, 0x7c91d0d5UL, 0x3da0cbccUL, 0xfa368a83UL, - 0xbb07919aUL, 0x7854bcb1UL, 0x3965a7a8UL, 0x4b98833bUL, 0x0aa99822UL, - 0xc9fab509UL, 0x88cbae10UL, 0x4f5def5fUL, 0x0e6cf446UL, 0xcd3fd96dUL, - 0x8c0ec274UL, 0x43125af3UL, 0x022341eaUL, 0xc1706cc1UL, 0x804177d8UL, - 0x47d73697UL, 0x06e62d8eUL, 0xc5b500a5UL, 0x84841bbcUL, 0x1a8a4171UL, - 0x5bbb5a68UL, 0x98e87743UL, 0xd9d96c5aUL, 0x1e4f2d15UL, 0x5f7e360cUL, - 0x9c2d1b27UL, 0xdd1c003eUL, 0x120098b9UL, 0x533183a0UL, 0x9062ae8bUL, - 0xd153b592UL, 0x16c5f4ddUL, 0x57f4efc4UL, 0x94a7c2efUL, 0xd596d9f6UL, - 0xe9bc07aeUL, 0xa88d1cb7UL, 0x6bde319cUL, 0x2aef2a85UL, 0xed796bcaUL, - 0xac4870d3UL, 0x6f1b5df8UL, 0x2e2a46e1UL, 0xe136de66UL, 0xa007c57fUL, - 0x6354e854UL, 0x2265f34dUL, 0xe5f3b202UL, 0xa4c2a91bUL, 0x67918430UL, - 0x26a09f29UL, 0xb8aec5e4UL, 0xf99fdefdUL, 0x3accf3d6UL, 0x7bfde8cfUL, - 0xbc6ba980UL, 0xfd5ab299UL, 0x3e099fb2UL, 0x7f3884abUL, 0xb0241c2cUL, - 0xf1150735UL, 0x32462a1eUL, 0x73773107UL, 0xb4e17048UL, 0xf5d06b51UL, - 0x3683467aUL, 0x77b25d63UL, 0x4ed7facbUL, 0x0fe6e1d2UL, 0xccb5ccf9UL, - 0x8d84d7e0UL, 0x4a1296afUL, 0x0b238db6UL, 0xc870a09dUL, 0x8941bb84UL, - 0x465d2303UL, 0x076c381aUL, 0xc43f1531UL, 0x850e0e28UL, 0x42984f67UL, - 0x03a9547eUL, 0xc0fa7955UL, 0x81cb624cUL, 0x1fc53881UL, 0x5ef42398UL, - 0x9da70eb3UL, 0xdc9615aaUL, 0x1b0054e5UL, 0x5a314ffcUL, 0x996262d7UL, - 0xd85379ceUL, 0x174fe149UL, 0x567efa50UL, 0x952dd77bUL, 0xd41ccc62UL, - 0x138a8d2dUL, 0x52bb9634UL, 0x91e8bb1fUL, 0xd0d9a006UL, 0xecf37e5eUL, - 0xadc26547UL, 0x6e91486cUL, 0x2fa05375UL, 0xe836123aUL, 0xa9070923UL, - 0x6a542408UL, 0x2b653f11UL, 0xe479a796UL, 0xa548bc8fUL, 0x661b91a4UL, - 0x272a8abdUL, 0xe0bccbf2UL, 0xa18dd0ebUL, 0x62defdc0UL, 0x23efe6d9UL, - 0xbde1bc14UL, 0xfcd0a70dUL, 0x3f838a26UL, 0x7eb2913fUL, 0xb924d070UL, - 0xf815cb69UL, 0x3b46e642UL, 0x7a77fd5bUL, 0xb56b65dcUL, 0xf45a7ec5UL, - 0x370953eeUL, 0x763848f7UL, 0xb1ae09b8UL, 0xf09f12a1UL, 0x33cc3f8aUL, - 0x72fd2493UL - }, - { - 0x00000000UL, 0x376ac201UL, 0x6ed48403UL, 0x59be4602UL, 0xdca80907UL, - 0xebc2cb06UL, 0xb27c8d04UL, 0x85164f05UL, 0xb851130eUL, 0x8f3bd10fUL, - 0xd685970dUL, 0xe1ef550cUL, 0x64f91a09UL, 0x5393d808UL, 0x0a2d9e0aUL, - 0x3d475c0bUL, 0x70a3261cUL, 0x47c9e41dUL, 0x1e77a21fUL, 0x291d601eUL, - 0xac0b2f1bUL, 0x9b61ed1aUL, 0xc2dfab18UL, 0xf5b56919UL, 0xc8f23512UL, - 0xff98f713UL, 0xa626b111UL, 0x914c7310UL, 0x145a3c15UL, 0x2330fe14UL, - 0x7a8eb816UL, 0x4de47a17UL, 0xe0464d38UL, 0xd72c8f39UL, 0x8e92c93bUL, - 0xb9f80b3aUL, 0x3cee443fUL, 0x0b84863eUL, 0x523ac03cUL, 0x6550023dUL, - 0x58175e36UL, 0x6f7d9c37UL, 0x36c3da35UL, 0x01a91834UL, 0x84bf5731UL, - 0xb3d59530UL, 0xea6bd332UL, 0xdd011133UL, 0x90e56b24UL, 0xa78fa925UL, - 0xfe31ef27UL, 0xc95b2d26UL, 0x4c4d6223UL, 0x7b27a022UL, 0x2299e620UL, - 0x15f32421UL, 0x28b4782aUL, 0x1fdeba2bUL, 0x4660fc29UL, 0x710a3e28UL, - 0xf41c712dUL, 0xc376b32cUL, 0x9ac8f52eUL, 0xada2372fUL, 0xc08d9a70UL, - 0xf7e75871UL, 0xae591e73UL, 0x9933dc72UL, 0x1c259377UL, 0x2b4f5176UL, - 0x72f11774UL, 0x459bd575UL, 0x78dc897eUL, 0x4fb64b7fUL, 0x16080d7dUL, - 0x2162cf7cUL, 0xa4748079UL, 0x931e4278UL, 0xcaa0047aUL, 0xfdcac67bUL, - 0xb02ebc6cUL, 0x87447e6dUL, 0xdefa386fUL, 0xe990fa6eUL, 0x6c86b56bUL, - 0x5bec776aUL, 0x02523168UL, 0x3538f369UL, 0x087faf62UL, 0x3f156d63UL, - 0x66ab2b61UL, 0x51c1e960UL, 0xd4d7a665UL, 0xe3bd6464UL, 0xba032266UL, - 0x8d69e067UL, 0x20cbd748UL, 0x17a11549UL, 0x4e1f534bUL, 0x7975914aUL, - 0xfc63de4fUL, 0xcb091c4eUL, 0x92b75a4cUL, 0xa5dd984dUL, 0x989ac446UL, - 0xaff00647UL, 0xf64e4045UL, 0xc1248244UL, 0x4432cd41UL, 0x73580f40UL, - 0x2ae64942UL, 0x1d8c8b43UL, 0x5068f154UL, 0x67023355UL, 0x3ebc7557UL, - 0x09d6b756UL, 0x8cc0f853UL, 0xbbaa3a52UL, 0xe2147c50UL, 0xd57ebe51UL, - 0xe839e25aUL, 0xdf53205bUL, 0x86ed6659UL, 0xb187a458UL, 0x3491eb5dUL, - 0x03fb295cUL, 0x5a456f5eUL, 0x6d2fad5fUL, 0x801b35e1UL, 0xb771f7e0UL, - 0xeecfb1e2UL, 0xd9a573e3UL, 0x5cb33ce6UL, 0x6bd9fee7UL, 0x3267b8e5UL, - 0x050d7ae4UL, 0x384a26efUL, 0x0f20e4eeUL, 0x569ea2ecUL, 0x61f460edUL, - 0xe4e22fe8UL, 0xd388ede9UL, 0x8a36abebUL, 0xbd5c69eaUL, 0xf0b813fdUL, - 0xc7d2d1fcUL, 0x9e6c97feUL, 0xa90655ffUL, 0x2c101afaUL, 0x1b7ad8fbUL, - 0x42c49ef9UL, 0x75ae5cf8UL, 0x48e900f3UL, 0x7f83c2f2UL, 0x263d84f0UL, - 0x115746f1UL, 0x944109f4UL, 0xa32bcbf5UL, 0xfa958df7UL, 0xcdff4ff6UL, - 0x605d78d9UL, 0x5737bad8UL, 0x0e89fcdaUL, 0x39e33edbUL, 0xbcf571deUL, - 0x8b9fb3dfUL, 0xd221f5ddUL, 0xe54b37dcUL, 0xd80c6bd7UL, 0xef66a9d6UL, - 0xb6d8efd4UL, 0x81b22dd5UL, 0x04a462d0UL, 0x33cea0d1UL, 0x6a70e6d3UL, - 0x5d1a24d2UL, 0x10fe5ec5UL, 0x27949cc4UL, 0x7e2adac6UL, 0x494018c7UL, - 0xcc5657c2UL, 0xfb3c95c3UL, 0xa282d3c1UL, 0x95e811c0UL, 0xa8af4dcbUL, - 0x9fc58fcaUL, 0xc67bc9c8UL, 0xf1110bc9UL, 0x740744ccUL, 0x436d86cdUL, - 0x1ad3c0cfUL, 0x2db902ceUL, 0x4096af91UL, 0x77fc6d90UL, 0x2e422b92UL, - 0x1928e993UL, 0x9c3ea696UL, 0xab546497UL, 0xf2ea2295UL, 0xc580e094UL, - 0xf8c7bc9fUL, 0xcfad7e9eUL, 0x9613389cUL, 0xa179fa9dUL, 0x246fb598UL, - 0x13057799UL, 0x4abb319bUL, 0x7dd1f39aUL, 0x3035898dUL, 0x075f4b8cUL, - 0x5ee10d8eUL, 0x698bcf8fUL, 0xec9d808aUL, 0xdbf7428bUL, 0x82490489UL, - 0xb523c688UL, 0x88649a83UL, 0xbf0e5882UL, 0xe6b01e80UL, 0xd1dadc81UL, - 0x54cc9384UL, 0x63a65185UL, 0x3a181787UL, 0x0d72d586UL, 0xa0d0e2a9UL, - 0x97ba20a8UL, 0xce0466aaUL, 0xf96ea4abUL, 0x7c78ebaeUL, 0x4b1229afUL, - 0x12ac6fadUL, 0x25c6adacUL, 0x1881f1a7UL, 0x2feb33a6UL, 0x765575a4UL, - 0x413fb7a5UL, 0xc429f8a0UL, 0xf3433aa1UL, 0xaafd7ca3UL, 0x9d97bea2UL, - 0xd073c4b5UL, 0xe71906b4UL, 0xbea740b6UL, 0x89cd82b7UL, 0x0cdbcdb2UL, - 0x3bb10fb3UL, 0x620f49b1UL, 0x55658bb0UL, 0x6822d7bbUL, 0x5f4815baUL, - 0x06f653b8UL, 0x319c91b9UL, 0xb48adebcUL, 0x83e01cbdUL, 0xda5e5abfUL, - 0xed3498beUL - }, - { - 0x00000000UL, 0x6567bcb8UL, 0x8bc809aaUL, 0xeeafb512UL, 0x5797628fUL, - 0x32f0de37UL, 0xdc5f6b25UL, 0xb938d79dUL, 0xef28b4c5UL, 0x8a4f087dUL, - 0x64e0bd6fUL, 0x018701d7UL, 0xb8bfd64aUL, 0xddd86af2UL, 0x3377dfe0UL, - 0x56106358UL, 0x9f571950UL, 0xfa30a5e8UL, 0x149f10faUL, 0x71f8ac42UL, - 0xc8c07bdfUL, 0xada7c767UL, 0x43087275UL, 0x266fcecdUL, 0x707fad95UL, - 0x1518112dUL, 0xfbb7a43fUL, 0x9ed01887UL, 0x27e8cf1aUL, 0x428f73a2UL, - 0xac20c6b0UL, 0xc9477a08UL, 0x3eaf32a0UL, 0x5bc88e18UL, 0xb5673b0aUL, - 0xd00087b2UL, 0x6938502fUL, 0x0c5fec97UL, 0xe2f05985UL, 0x8797e53dUL, - 0xd1878665UL, 0xb4e03addUL, 0x5a4f8fcfUL, 0x3f283377UL, 0x8610e4eaUL, - 0xe3775852UL, 0x0dd8ed40UL, 0x68bf51f8UL, 0xa1f82bf0UL, 0xc49f9748UL, - 0x2a30225aUL, 0x4f579ee2UL, 0xf66f497fUL, 0x9308f5c7UL, 0x7da740d5UL, - 0x18c0fc6dUL, 0x4ed09f35UL, 0x2bb7238dUL, 0xc518969fUL, 0xa07f2a27UL, - 0x1947fdbaUL, 0x7c204102UL, 0x928ff410UL, 0xf7e848a8UL, 0x3d58149bUL, - 0x583fa823UL, 0xb6901d31UL, 0xd3f7a189UL, 0x6acf7614UL, 0x0fa8caacUL, - 0xe1077fbeUL, 0x8460c306UL, 0xd270a05eUL, 0xb7171ce6UL, 0x59b8a9f4UL, - 0x3cdf154cUL, 0x85e7c2d1UL, 0xe0807e69UL, 0x0e2fcb7bUL, 0x6b4877c3UL, - 0xa20f0dcbUL, 0xc768b173UL, 0x29c70461UL, 0x4ca0b8d9UL, 0xf5986f44UL, - 0x90ffd3fcUL, 0x7e5066eeUL, 0x1b37da56UL, 0x4d27b90eUL, 0x284005b6UL, - 0xc6efb0a4UL, 0xa3880c1cUL, 0x1ab0db81UL, 0x7fd76739UL, 0x9178d22bUL, - 0xf41f6e93UL, 0x03f7263bUL, 0x66909a83UL, 0x883f2f91UL, 0xed589329UL, - 0x546044b4UL, 0x3107f80cUL, 0xdfa84d1eUL, 0xbacff1a6UL, 0xecdf92feUL, - 0x89b82e46UL, 0x67179b54UL, 0x027027ecUL, 0xbb48f071UL, 0xde2f4cc9UL, - 0x3080f9dbUL, 0x55e74563UL, 0x9ca03f6bUL, 0xf9c783d3UL, 0x176836c1UL, - 0x720f8a79UL, 0xcb375de4UL, 0xae50e15cUL, 0x40ff544eUL, 0x2598e8f6UL, - 0x73888baeUL, 0x16ef3716UL, 0xf8408204UL, 0x9d273ebcUL, 0x241fe921UL, - 0x41785599UL, 0xafd7e08bUL, 0xcab05c33UL, 0x3bb659edUL, 0x5ed1e555UL, - 0xb07e5047UL, 0xd519ecffUL, 0x6c213b62UL, 0x094687daUL, 0xe7e932c8UL, - 0x828e8e70UL, 0xd49eed28UL, 0xb1f95190UL, 0x5f56e482UL, 0x3a31583aUL, - 0x83098fa7UL, 0xe66e331fUL, 0x08c1860dUL, 0x6da63ab5UL, 0xa4e140bdUL, - 0xc186fc05UL, 0x2f294917UL, 0x4a4ef5afUL, 0xf3762232UL, 0x96119e8aUL, - 0x78be2b98UL, 0x1dd99720UL, 0x4bc9f478UL, 0x2eae48c0UL, 0xc001fdd2UL, - 0xa566416aUL, 0x1c5e96f7UL, 0x79392a4fUL, 0x97969f5dUL, 0xf2f123e5UL, - 0x05196b4dUL, 0x607ed7f5UL, 0x8ed162e7UL, 0xebb6de5fUL, 0x528e09c2UL, - 0x37e9b57aUL, 0xd9460068UL, 0xbc21bcd0UL, 0xea31df88UL, 0x8f566330UL, - 0x61f9d622UL, 0x049e6a9aUL, 0xbda6bd07UL, 0xd8c101bfUL, 0x366eb4adUL, - 0x53090815UL, 0x9a4e721dUL, 0xff29cea5UL, 0x11867bb7UL, 0x74e1c70fUL, - 0xcdd91092UL, 0xa8beac2aUL, 0x46111938UL, 0x2376a580UL, 0x7566c6d8UL, - 0x10017a60UL, 0xfeaecf72UL, 0x9bc973caUL, 0x22f1a457UL, 0x479618efUL, - 0xa939adfdUL, 0xcc5e1145UL, 0x06ee4d76UL, 0x6389f1ceUL, 0x8d2644dcUL, - 0xe841f864UL, 0x51792ff9UL, 0x341e9341UL, 0xdab12653UL, 0xbfd69aebUL, - 0xe9c6f9b3UL, 0x8ca1450bUL, 0x620ef019UL, 0x07694ca1UL, 0xbe519b3cUL, - 0xdb362784UL, 0x35999296UL, 0x50fe2e2eUL, 0x99b95426UL, 0xfcdee89eUL, - 0x12715d8cUL, 0x7716e134UL, 0xce2e36a9UL, 0xab498a11UL, 0x45e63f03UL, - 0x208183bbUL, 0x7691e0e3UL, 0x13f65c5bUL, 0xfd59e949UL, 0x983e55f1UL, - 0x2106826cUL, 0x44613ed4UL, 0xaace8bc6UL, 0xcfa9377eUL, 0x38417fd6UL, - 0x5d26c36eUL, 0xb389767cUL, 0xd6eecac4UL, 0x6fd61d59UL, 0x0ab1a1e1UL, - 0xe41e14f3UL, 0x8179a84bUL, 0xd769cb13UL, 0xb20e77abUL, 0x5ca1c2b9UL, - 0x39c67e01UL, 0x80fea99cUL, 0xe5991524UL, 0x0b36a036UL, 0x6e511c8eUL, - 0xa7166686UL, 0xc271da3eUL, 0x2cde6f2cUL, 0x49b9d394UL, 0xf0810409UL, - 0x95e6b8b1UL, 0x7b490da3UL, 0x1e2eb11bUL, 0x483ed243UL, 0x2d596efbUL, - 0xc3f6dbe9UL, 0xa6916751UL, 0x1fa9b0ccUL, 0x7ace0c74UL, 0x9461b966UL, - 0xf10605deUL +local const z_crc_t FAR crc_table[] = { + 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, + 0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, + 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, + 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, + 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856, + 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, + 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, + 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, + 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, + 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a, + 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, + 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, + 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, + 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, + 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e, + 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, + 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, + 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, + 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, + 0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, + 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, + 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, + 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010, + 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, + 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, + 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, + 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615, + 0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, + 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344, + 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, + 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, + 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, + 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, + 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c, + 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, + 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, + 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, + 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, + 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c, + 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, + 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, + 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, + 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, + 0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, + 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278, + 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, + 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66, + 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, + 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, + 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, + 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, + 0x2d02ef8d}; + +#ifdef W + +#if W == 8 + +local const z_word_t FAR crc_big_table[] = { + 0x0000000000000000, 0x9630077700000000, 0x2c610eee00000000, + 0xba51099900000000, 0x19c46d0700000000, 0x8ff46a7000000000, + 0x35a563e900000000, 0xa395649e00000000, 0x3288db0e00000000, + 0xa4b8dc7900000000, 0x1ee9d5e000000000, 0x88d9d29700000000, + 0x2b4cb60900000000, 0xbd7cb17e00000000, 0x072db8e700000000, + 0x911dbf9000000000, 0x6410b71d00000000, 0xf220b06a00000000, + 0x4871b9f300000000, 0xde41be8400000000, 0x7dd4da1a00000000, + 0xebe4dd6d00000000, 0x51b5d4f400000000, 0xc785d38300000000, + 0x56986c1300000000, 0xc0a86b6400000000, 0x7af962fd00000000, + 0xecc9658a00000000, 0x4f5c011400000000, 0xd96c066300000000, + 0x633d0ffa00000000, 0xf50d088d00000000, 0xc8206e3b00000000, + 0x5e10694c00000000, 0xe44160d500000000, 0x727167a200000000, + 0xd1e4033c00000000, 0x47d4044b00000000, 0xfd850dd200000000, + 0x6bb50aa500000000, 0xfaa8b53500000000, 0x6c98b24200000000, + 0xd6c9bbdb00000000, 0x40f9bcac00000000, 0xe36cd83200000000, + 0x755cdf4500000000, 0xcf0dd6dc00000000, 0x593dd1ab00000000, + 0xac30d92600000000, 0x3a00de5100000000, 0x8051d7c800000000, + 0x1661d0bf00000000, 0xb5f4b42100000000, 0x23c4b35600000000, + 0x9995bacf00000000, 0x0fa5bdb800000000, 0x9eb8022800000000, + 0x0888055f00000000, 0xb2d90cc600000000, 0x24e90bb100000000, + 0x877c6f2f00000000, 0x114c685800000000, 0xab1d61c100000000, + 0x3d2d66b600000000, 0x9041dc7600000000, 0x0671db0100000000, + 0xbc20d29800000000, 0x2a10d5ef00000000, 0x8985b17100000000, + 0x1fb5b60600000000, 0xa5e4bf9f00000000, 0x33d4b8e800000000, + 0xa2c9077800000000, 0x34f9000f00000000, 0x8ea8099600000000, + 0x18980ee100000000, 0xbb0d6a7f00000000, 0x2d3d6d0800000000, + 0x976c649100000000, 0x015c63e600000000, 0xf4516b6b00000000, + 0x62616c1c00000000, 0xd830658500000000, 0x4e0062f200000000, + 0xed95066c00000000, 0x7ba5011b00000000, 0xc1f4088200000000, + 0x57c40ff500000000, 0xc6d9b06500000000, 0x50e9b71200000000, + 0xeab8be8b00000000, 0x7c88b9fc00000000, 0xdf1ddd6200000000, + 0x492dda1500000000, 0xf37cd38c00000000, 0x654cd4fb00000000, + 0x5861b24d00000000, 0xce51b53a00000000, 0x7400bca300000000, + 0xe230bbd400000000, 0x41a5df4a00000000, 0xd795d83d00000000, + 0x6dc4d1a400000000, 0xfbf4d6d300000000, 0x6ae9694300000000, + 0xfcd96e3400000000, 0x468867ad00000000, 0xd0b860da00000000, + 0x732d044400000000, 0xe51d033300000000, 0x5f4c0aaa00000000, + 0xc97c0ddd00000000, 0x3c71055000000000, 0xaa41022700000000, + 0x10100bbe00000000, 0x86200cc900000000, 0x25b5685700000000, + 0xb3856f2000000000, 0x09d466b900000000, 0x9fe461ce00000000, + 0x0ef9de5e00000000, 0x98c9d92900000000, 0x2298d0b000000000, + 0xb4a8d7c700000000, 0x173db35900000000, 0x810db42e00000000, + 0x3b5cbdb700000000, 0xad6cbac000000000, 0x2083b8ed00000000, + 0xb6b3bf9a00000000, 0x0ce2b60300000000, 0x9ad2b17400000000, + 0x3947d5ea00000000, 0xaf77d29d00000000, 0x1526db0400000000, + 0x8316dc7300000000, 0x120b63e300000000, 0x843b649400000000, + 0x3e6a6d0d00000000, 0xa85a6a7a00000000, 0x0bcf0ee400000000, + 0x9dff099300000000, 0x27ae000a00000000, 0xb19e077d00000000, + 0x44930ff000000000, 0xd2a3088700000000, 0x68f2011e00000000, + 0xfec2066900000000, 0x5d5762f700000000, 0xcb67658000000000, + 0x71366c1900000000, 0xe7066b6e00000000, 0x761bd4fe00000000, + 0xe02bd38900000000, 0x5a7ada1000000000, 0xcc4add6700000000, + 0x6fdfb9f900000000, 0xf9efbe8e00000000, 0x43beb71700000000, + 0xd58eb06000000000, 0xe8a3d6d600000000, 0x7e93d1a100000000, + 0xc4c2d83800000000, 0x52f2df4f00000000, 0xf167bbd100000000, + 0x6757bca600000000, 0xdd06b53f00000000, 0x4b36b24800000000, + 0xda2b0dd800000000, 0x4c1b0aaf00000000, 0xf64a033600000000, + 0x607a044100000000, 0xc3ef60df00000000, 0x55df67a800000000, + 0xef8e6e3100000000, 0x79be694600000000, 0x8cb361cb00000000, + 0x1a8366bc00000000, 0xa0d26f2500000000, 0x36e2685200000000, + 0x95770ccc00000000, 0x03470bbb00000000, 0xb916022200000000, + 0x2f26055500000000, 0xbe3bbac500000000, 0x280bbdb200000000, + 0x925ab42b00000000, 0x046ab35c00000000, 0xa7ffd7c200000000, + 0x31cfd0b500000000, 0x8b9ed92c00000000, 0x1daede5b00000000, + 0xb0c2649b00000000, 0x26f263ec00000000, 0x9ca36a7500000000, + 0x0a936d0200000000, 0xa906099c00000000, 0x3f360eeb00000000, + 0x8567077200000000, 0x1357000500000000, 0x824abf9500000000, + 0x147ab8e200000000, 0xae2bb17b00000000, 0x381bb60c00000000, + 0x9b8ed29200000000, 0x0dbed5e500000000, 0xb7efdc7c00000000, + 0x21dfdb0b00000000, 0xd4d2d38600000000, 0x42e2d4f100000000, + 0xf8b3dd6800000000, 0x6e83da1f00000000, 0xcd16be8100000000, + 0x5b26b9f600000000, 0xe177b06f00000000, 0x7747b71800000000, + 0xe65a088800000000, 0x706a0fff00000000, 0xca3b066600000000, + 0x5c0b011100000000, 0xff9e658f00000000, 0x69ae62f800000000, + 0xd3ff6b6100000000, 0x45cf6c1600000000, 0x78e20aa000000000, + 0xeed20dd700000000, 0x5483044e00000000, 0xc2b3033900000000, + 0x612667a700000000, 0xf71660d000000000, 0x4d47694900000000, + 0xdb776e3e00000000, 0x4a6ad1ae00000000, 0xdc5ad6d900000000, + 0x660bdf4000000000, 0xf03bd83700000000, 0x53aebca900000000, + 0xc59ebbde00000000, 0x7fcfb24700000000, 0xe9ffb53000000000, + 0x1cf2bdbd00000000, 0x8ac2baca00000000, 0x3093b35300000000, + 0xa6a3b42400000000, 0x0536d0ba00000000, 0x9306d7cd00000000, + 0x2957de5400000000, 0xbf67d92300000000, 0x2e7a66b300000000, + 0xb84a61c400000000, 0x021b685d00000000, 0x942b6f2a00000000, + 0x37be0bb400000000, 0xa18e0cc300000000, 0x1bdf055a00000000, + 0x8def022d00000000}; + +#else /* W == 4 */ + +local const z_word_t FAR crc_big_table[] = { + 0x00000000, 0x96300777, 0x2c610eee, 0xba510999, 0x19c46d07, + 0x8ff46a70, 0x35a563e9, 0xa395649e, 0x3288db0e, 0xa4b8dc79, + 0x1ee9d5e0, 0x88d9d297, 0x2b4cb609, 0xbd7cb17e, 0x072db8e7, + 0x911dbf90, 0x6410b71d, 0xf220b06a, 0x4871b9f3, 0xde41be84, + 0x7dd4da1a, 0xebe4dd6d, 0x51b5d4f4, 0xc785d383, 0x56986c13, + 0xc0a86b64, 0x7af962fd, 0xecc9658a, 0x4f5c0114, 0xd96c0663, + 0x633d0ffa, 0xf50d088d, 0xc8206e3b, 0x5e10694c, 0xe44160d5, + 0x727167a2, 0xd1e4033c, 0x47d4044b, 0xfd850dd2, 0x6bb50aa5, + 0xfaa8b535, 0x6c98b242, 0xd6c9bbdb, 0x40f9bcac, 0xe36cd832, + 0x755cdf45, 0xcf0dd6dc, 0x593dd1ab, 0xac30d926, 0x3a00de51, + 0x8051d7c8, 0x1661d0bf, 0xb5f4b421, 0x23c4b356, 0x9995bacf, + 0x0fa5bdb8, 0x9eb80228, 0x0888055f, 0xb2d90cc6, 0x24e90bb1, + 0x877c6f2f, 0x114c6858, 0xab1d61c1, 0x3d2d66b6, 0x9041dc76, + 0x0671db01, 0xbc20d298, 0x2a10d5ef, 0x8985b171, 0x1fb5b606, + 0xa5e4bf9f, 0x33d4b8e8, 0xa2c90778, 0x34f9000f, 0x8ea80996, + 0x18980ee1, 0xbb0d6a7f, 0x2d3d6d08, 0x976c6491, 0x015c63e6, + 0xf4516b6b, 0x62616c1c, 0xd8306585, 0x4e0062f2, 0xed95066c, + 0x7ba5011b, 0xc1f40882, 0x57c40ff5, 0xc6d9b065, 0x50e9b712, + 0xeab8be8b, 0x7c88b9fc, 0xdf1ddd62, 0x492dda15, 0xf37cd38c, + 0x654cd4fb, 0x5861b24d, 0xce51b53a, 0x7400bca3, 0xe230bbd4, + 0x41a5df4a, 0xd795d83d, 0x6dc4d1a4, 0xfbf4d6d3, 0x6ae96943, + 0xfcd96e34, 0x468867ad, 0xd0b860da, 0x732d0444, 0xe51d0333, + 0x5f4c0aaa, 0xc97c0ddd, 0x3c710550, 0xaa410227, 0x10100bbe, + 0x86200cc9, 0x25b56857, 0xb3856f20, 0x09d466b9, 0x9fe461ce, + 0x0ef9de5e, 0x98c9d929, 0x2298d0b0, 0xb4a8d7c7, 0x173db359, + 0x810db42e, 0x3b5cbdb7, 0xad6cbac0, 0x2083b8ed, 0xb6b3bf9a, + 0x0ce2b603, 0x9ad2b174, 0x3947d5ea, 0xaf77d29d, 0x1526db04, + 0x8316dc73, 0x120b63e3, 0x843b6494, 0x3e6a6d0d, 0xa85a6a7a, + 0x0bcf0ee4, 0x9dff0993, 0x27ae000a, 0xb19e077d, 0x44930ff0, + 0xd2a30887, 0x68f2011e, 0xfec20669, 0x5d5762f7, 0xcb676580, + 0x71366c19, 0xe7066b6e, 0x761bd4fe, 0xe02bd389, 0x5a7ada10, + 0xcc4add67, 0x6fdfb9f9, 0xf9efbe8e, 0x43beb717, 0xd58eb060, + 0xe8a3d6d6, 0x7e93d1a1, 0xc4c2d838, 0x52f2df4f, 0xf167bbd1, + 0x6757bca6, 0xdd06b53f, 0x4b36b248, 0xda2b0dd8, 0x4c1b0aaf, + 0xf64a0336, 0x607a0441, 0xc3ef60df, 0x55df67a8, 0xef8e6e31, + 0x79be6946, 0x8cb361cb, 0x1a8366bc, 0xa0d26f25, 0x36e26852, + 0x95770ccc, 0x03470bbb, 0xb9160222, 0x2f260555, 0xbe3bbac5, + 0x280bbdb2, 0x925ab42b, 0x046ab35c, 0xa7ffd7c2, 0x31cfd0b5, + 0x8b9ed92c, 0x1daede5b, 0xb0c2649b, 0x26f263ec, 0x9ca36a75, + 0x0a936d02, 0xa906099c, 0x3f360eeb, 0x85670772, 0x13570005, + 0x824abf95, 0x147ab8e2, 0xae2bb17b, 0x381bb60c, 0x9b8ed292, + 0x0dbed5e5, 0xb7efdc7c, 0x21dfdb0b, 0xd4d2d386, 0x42e2d4f1, + 0xf8b3dd68, 0x6e83da1f, 0xcd16be81, 0x5b26b9f6, 0xe177b06f, + 0x7747b718, 0xe65a0888, 0x706a0fff, 0xca3b0666, 0x5c0b0111, + 0xff9e658f, 0x69ae62f8, 0xd3ff6b61, 0x45cf6c16, 0x78e20aa0, + 0xeed20dd7, 0x5483044e, 0xc2b30339, 0x612667a7, 0xf71660d0, + 0x4d476949, 0xdb776e3e, 0x4a6ad1ae, 0xdc5ad6d9, 0x660bdf40, + 0xf03bd837, 0x53aebca9, 0xc59ebbde, 0x7fcfb247, 0xe9ffb530, + 0x1cf2bdbd, 0x8ac2baca, 0x3093b353, 0xa6a3b424, 0x0536d0ba, + 0x9306d7cd, 0x2957de54, 0xbf67d923, 0x2e7a66b3, 0xb84a61c4, + 0x021b685d, 0x942b6f2a, 0x37be0bb4, 0xa18e0cc3, 0x1bdf055a, + 0x8def022d}; + +#endif + +#if N == 1 + +#if W == 8 + +local const z_crc_t FAR crc_braid_table[][256] = { + {0x00000000, 0xccaa009e, 0x4225077d, 0x8e8f07e3, 0x844a0efa, + 0x48e00e64, 0xc66f0987, 0x0ac50919, 0xd3e51bb5, 0x1f4f1b2b, + 0x91c01cc8, 0x5d6a1c56, 0x57af154f, 0x9b0515d1, 0x158a1232, + 0xd92012ac, 0x7cbb312b, 0xb01131b5, 0x3e9e3656, 0xf23436c8, + 0xf8f13fd1, 0x345b3f4f, 0xbad438ac, 0x767e3832, 0xaf5e2a9e, + 0x63f42a00, 0xed7b2de3, 0x21d12d7d, 0x2b142464, 0xe7be24fa, + 0x69312319, 0xa59b2387, 0xf9766256, 0x35dc62c8, 0xbb53652b, + 0x77f965b5, 0x7d3c6cac, 0xb1966c32, 0x3f196bd1, 0xf3b36b4f, + 0x2a9379e3, 0xe639797d, 0x68b67e9e, 0xa41c7e00, 0xaed97719, + 0x62737787, 0xecfc7064, 0x205670fa, 0x85cd537d, 0x496753e3, + 0xc7e85400, 0x0b42549e, 0x01875d87, 0xcd2d5d19, 0x43a25afa, + 0x8f085a64, 0x562848c8, 0x9a824856, 0x140d4fb5, 0xd8a74f2b, + 0xd2624632, 0x1ec846ac, 0x9047414f, 0x5ced41d1, 0x299dc2ed, + 0xe537c273, 0x6bb8c590, 0xa712c50e, 0xadd7cc17, 0x617dcc89, + 0xeff2cb6a, 0x2358cbf4, 0xfa78d958, 0x36d2d9c6, 0xb85dde25, + 0x74f7debb, 0x7e32d7a2, 0xb298d73c, 0x3c17d0df, 0xf0bdd041, + 0x5526f3c6, 0x998cf358, 0x1703f4bb, 0xdba9f425, 0xd16cfd3c, + 0x1dc6fda2, 0x9349fa41, 0x5fe3fadf, 0x86c3e873, 0x4a69e8ed, + 0xc4e6ef0e, 0x084cef90, 0x0289e689, 0xce23e617, 0x40ace1f4, + 0x8c06e16a, 0xd0eba0bb, 0x1c41a025, 0x92cea7c6, 0x5e64a758, + 0x54a1ae41, 0x980baedf, 0x1684a93c, 0xda2ea9a2, 0x030ebb0e, + 0xcfa4bb90, 0x412bbc73, 0x8d81bced, 0x8744b5f4, 0x4beeb56a, + 0xc561b289, 0x09cbb217, 0xac509190, 0x60fa910e, 0xee7596ed, + 0x22df9673, 0x281a9f6a, 0xe4b09ff4, 0x6a3f9817, 0xa6959889, + 0x7fb58a25, 0xb31f8abb, 0x3d908d58, 0xf13a8dc6, 0xfbff84df, + 0x37558441, 0xb9da83a2, 0x7570833c, 0x533b85da, 0x9f918544, + 0x111e82a7, 0xddb48239, 0xd7718b20, 0x1bdb8bbe, 0x95548c5d, + 0x59fe8cc3, 0x80de9e6f, 0x4c749ef1, 0xc2fb9912, 0x0e51998c, + 0x04949095, 0xc83e900b, 0x46b197e8, 0x8a1b9776, 0x2f80b4f1, + 0xe32ab46f, 0x6da5b38c, 0xa10fb312, 0xabcaba0b, 0x6760ba95, + 0xe9efbd76, 0x2545bde8, 0xfc65af44, 0x30cfafda, 0xbe40a839, + 0x72eaa8a7, 0x782fa1be, 0xb485a120, 0x3a0aa6c3, 0xf6a0a65d, + 0xaa4de78c, 0x66e7e712, 0xe868e0f1, 0x24c2e06f, 0x2e07e976, + 0xe2ade9e8, 0x6c22ee0b, 0xa088ee95, 0x79a8fc39, 0xb502fca7, + 0x3b8dfb44, 0xf727fbda, 0xfde2f2c3, 0x3148f25d, 0xbfc7f5be, + 0x736df520, 0xd6f6d6a7, 0x1a5cd639, 0x94d3d1da, 0x5879d144, + 0x52bcd85d, 0x9e16d8c3, 0x1099df20, 0xdc33dfbe, 0x0513cd12, + 0xc9b9cd8c, 0x4736ca6f, 0x8b9ccaf1, 0x8159c3e8, 0x4df3c376, + 0xc37cc495, 0x0fd6c40b, 0x7aa64737, 0xb60c47a9, 0x3883404a, + 0xf42940d4, 0xfeec49cd, 0x32464953, 0xbcc94eb0, 0x70634e2e, + 0xa9435c82, 0x65e95c1c, 0xeb665bff, 0x27cc5b61, 0x2d095278, + 0xe1a352e6, 0x6f2c5505, 0xa386559b, 0x061d761c, 0xcab77682, + 0x44387161, 0x889271ff, 0x825778e6, 0x4efd7878, 0xc0727f9b, + 0x0cd87f05, 0xd5f86da9, 0x19526d37, 0x97dd6ad4, 0x5b776a4a, + 0x51b26353, 0x9d1863cd, 0x1397642e, 0xdf3d64b0, 0x83d02561, + 0x4f7a25ff, 0xc1f5221c, 0x0d5f2282, 0x079a2b9b, 0xcb302b05, + 0x45bf2ce6, 0x89152c78, 0x50353ed4, 0x9c9f3e4a, 0x121039a9, + 0xdeba3937, 0xd47f302e, 0x18d530b0, 0x965a3753, 0x5af037cd, + 0xff6b144a, 0x33c114d4, 0xbd4e1337, 0x71e413a9, 0x7b211ab0, + 0xb78b1a2e, 0x39041dcd, 0xf5ae1d53, 0x2c8e0fff, 0xe0240f61, + 0x6eab0882, 0xa201081c, 0xa8c40105, 0x646e019b, 0xeae10678, + 0x264b06e6}, + {0x00000000, 0xa6770bb4, 0x979f1129, 0x31e81a9d, 0xf44f2413, + 0x52382fa7, 0x63d0353a, 0xc5a73e8e, 0x33ef4e67, 0x959845d3, + 0xa4705f4e, 0x020754fa, 0xc7a06a74, 0x61d761c0, 0x503f7b5d, + 0xf64870e9, 0x67de9cce, 0xc1a9977a, 0xf0418de7, 0x56368653, + 0x9391b8dd, 0x35e6b369, 0x040ea9f4, 0xa279a240, 0x5431d2a9, + 0xf246d91d, 0xc3aec380, 0x65d9c834, 0xa07ef6ba, 0x0609fd0e, + 0x37e1e793, 0x9196ec27, 0xcfbd399c, 0x69ca3228, 0x582228b5, + 0xfe552301, 0x3bf21d8f, 0x9d85163b, 0xac6d0ca6, 0x0a1a0712, + 0xfc5277fb, 0x5a257c4f, 0x6bcd66d2, 0xcdba6d66, 0x081d53e8, + 0xae6a585c, 0x9f8242c1, 0x39f54975, 0xa863a552, 0x0e14aee6, + 0x3ffcb47b, 0x998bbfcf, 0x5c2c8141, 0xfa5b8af5, 0xcbb39068, + 0x6dc49bdc, 0x9b8ceb35, 0x3dfbe081, 0x0c13fa1c, 0xaa64f1a8, + 0x6fc3cf26, 0xc9b4c492, 0xf85cde0f, 0x5e2bd5bb, 0x440b7579, + 0xe27c7ecd, 0xd3946450, 0x75e36fe4, 0xb044516a, 0x16335ade, + 0x27db4043, 0x81ac4bf7, 0x77e43b1e, 0xd19330aa, 0xe07b2a37, + 0x460c2183, 0x83ab1f0d, 0x25dc14b9, 0x14340e24, 0xb2430590, + 0x23d5e9b7, 0x85a2e203, 0xb44af89e, 0x123df32a, 0xd79acda4, + 0x71edc610, 0x4005dc8d, 0xe672d739, 0x103aa7d0, 0xb64dac64, + 0x87a5b6f9, 0x21d2bd4d, 0xe47583c3, 0x42028877, 0x73ea92ea, + 0xd59d995e, 0x8bb64ce5, 0x2dc14751, 0x1c295dcc, 0xba5e5678, + 0x7ff968f6, 0xd98e6342, 0xe86679df, 0x4e11726b, 0xb8590282, + 0x1e2e0936, 0x2fc613ab, 0x89b1181f, 0x4c162691, 0xea612d25, + 0xdb8937b8, 0x7dfe3c0c, 0xec68d02b, 0x4a1fdb9f, 0x7bf7c102, + 0xdd80cab6, 0x1827f438, 0xbe50ff8c, 0x8fb8e511, 0x29cfeea5, + 0xdf879e4c, 0x79f095f8, 0x48188f65, 0xee6f84d1, 0x2bc8ba5f, + 0x8dbfb1eb, 0xbc57ab76, 0x1a20a0c2, 0x8816eaf2, 0x2e61e146, + 0x1f89fbdb, 0xb9fef06f, 0x7c59cee1, 0xda2ec555, 0xebc6dfc8, + 0x4db1d47c, 0xbbf9a495, 0x1d8eaf21, 0x2c66b5bc, 0x8a11be08, + 0x4fb68086, 0xe9c18b32, 0xd82991af, 0x7e5e9a1b, 0xefc8763c, + 0x49bf7d88, 0x78576715, 0xde206ca1, 0x1b87522f, 0xbdf0599b, + 0x8c184306, 0x2a6f48b2, 0xdc27385b, 0x7a5033ef, 0x4bb82972, + 0xedcf22c6, 0x28681c48, 0x8e1f17fc, 0xbff70d61, 0x198006d5, + 0x47abd36e, 0xe1dcd8da, 0xd034c247, 0x7643c9f3, 0xb3e4f77d, + 0x1593fcc9, 0x247be654, 0x820cede0, 0x74449d09, 0xd23396bd, + 0xe3db8c20, 0x45ac8794, 0x800bb91a, 0x267cb2ae, 0x1794a833, + 0xb1e3a387, 0x20754fa0, 0x86024414, 0xb7ea5e89, 0x119d553d, + 0xd43a6bb3, 0x724d6007, 0x43a57a9a, 0xe5d2712e, 0x139a01c7, + 0xb5ed0a73, 0x840510ee, 0x22721b5a, 0xe7d525d4, 0x41a22e60, + 0x704a34fd, 0xd63d3f49, 0xcc1d9f8b, 0x6a6a943f, 0x5b828ea2, + 0xfdf58516, 0x3852bb98, 0x9e25b02c, 0xafcdaab1, 0x09baa105, + 0xfff2d1ec, 0x5985da58, 0x686dc0c5, 0xce1acb71, 0x0bbdf5ff, + 0xadcafe4b, 0x9c22e4d6, 0x3a55ef62, 0xabc30345, 0x0db408f1, + 0x3c5c126c, 0x9a2b19d8, 0x5f8c2756, 0xf9fb2ce2, 0xc813367f, + 0x6e643dcb, 0x982c4d22, 0x3e5b4696, 0x0fb35c0b, 0xa9c457bf, + 0x6c636931, 0xca146285, 0xfbfc7818, 0x5d8b73ac, 0x03a0a617, + 0xa5d7ada3, 0x943fb73e, 0x3248bc8a, 0xf7ef8204, 0x519889b0, + 0x6070932d, 0xc6079899, 0x304fe870, 0x9638e3c4, 0xa7d0f959, + 0x01a7f2ed, 0xc400cc63, 0x6277c7d7, 0x539fdd4a, 0xf5e8d6fe, + 0x647e3ad9, 0xc209316d, 0xf3e12bf0, 0x55962044, 0x90311eca, + 0x3646157e, 0x07ae0fe3, 0xa1d90457, 0x579174be, 0xf1e67f0a, + 0xc00e6597, 0x66796e23, 0xa3de50ad, 0x05a95b19, 0x34414184, + 0x92364a30}, + {0x00000000, 0xcb5cd3a5, 0x4dc8a10b, 0x869472ae, 0x9b914216, + 0x50cd91b3, 0xd659e31d, 0x1d0530b8, 0xec53826d, 0x270f51c8, + 0xa19b2366, 0x6ac7f0c3, 0x77c2c07b, 0xbc9e13de, 0x3a0a6170, + 0xf156b2d5, 0x03d6029b, 0xc88ad13e, 0x4e1ea390, 0x85427035, + 0x9847408d, 0x531b9328, 0xd58fe186, 0x1ed33223, 0xef8580f6, + 0x24d95353, 0xa24d21fd, 0x6911f258, 0x7414c2e0, 0xbf481145, + 0x39dc63eb, 0xf280b04e, 0x07ac0536, 0xccf0d693, 0x4a64a43d, + 0x81387798, 0x9c3d4720, 0x57619485, 0xd1f5e62b, 0x1aa9358e, + 0xebff875b, 0x20a354fe, 0xa6372650, 0x6d6bf5f5, 0x706ec54d, + 0xbb3216e8, 0x3da66446, 0xf6fab7e3, 0x047a07ad, 0xcf26d408, + 0x49b2a6a6, 0x82ee7503, 0x9feb45bb, 0x54b7961e, 0xd223e4b0, + 0x197f3715, 0xe82985c0, 0x23755665, 0xa5e124cb, 0x6ebdf76e, + 0x73b8c7d6, 0xb8e41473, 0x3e7066dd, 0xf52cb578, 0x0f580a6c, + 0xc404d9c9, 0x4290ab67, 0x89cc78c2, 0x94c9487a, 0x5f959bdf, + 0xd901e971, 0x125d3ad4, 0xe30b8801, 0x28575ba4, 0xaec3290a, + 0x659ffaaf, 0x789aca17, 0xb3c619b2, 0x35526b1c, 0xfe0eb8b9, + 0x0c8e08f7, 0xc7d2db52, 0x4146a9fc, 0x8a1a7a59, 0x971f4ae1, + 0x5c439944, 0xdad7ebea, 0x118b384f, 0xe0dd8a9a, 0x2b81593f, + 0xad152b91, 0x6649f834, 0x7b4cc88c, 0xb0101b29, 0x36846987, + 0xfdd8ba22, 0x08f40f5a, 0xc3a8dcff, 0x453cae51, 0x8e607df4, + 0x93654d4c, 0x58399ee9, 0xdeadec47, 0x15f13fe2, 0xe4a78d37, + 0x2ffb5e92, 0xa96f2c3c, 0x6233ff99, 0x7f36cf21, 0xb46a1c84, + 0x32fe6e2a, 0xf9a2bd8f, 0x0b220dc1, 0xc07ede64, 0x46eaacca, + 0x8db67f6f, 0x90b34fd7, 0x5bef9c72, 0xdd7beedc, 0x16273d79, + 0xe7718fac, 0x2c2d5c09, 0xaab92ea7, 0x61e5fd02, 0x7ce0cdba, + 0xb7bc1e1f, 0x31286cb1, 0xfa74bf14, 0x1eb014d8, 0xd5ecc77d, + 0x5378b5d3, 0x98246676, 0x852156ce, 0x4e7d856b, 0xc8e9f7c5, + 0x03b52460, 0xf2e396b5, 0x39bf4510, 0xbf2b37be, 0x7477e41b, + 0x6972d4a3, 0xa22e0706, 0x24ba75a8, 0xefe6a60d, 0x1d661643, + 0xd63ac5e6, 0x50aeb748, 0x9bf264ed, 0x86f75455, 0x4dab87f0, + 0xcb3ff55e, 0x006326fb, 0xf135942e, 0x3a69478b, 0xbcfd3525, + 0x77a1e680, 0x6aa4d638, 0xa1f8059d, 0x276c7733, 0xec30a496, + 0x191c11ee, 0xd240c24b, 0x54d4b0e5, 0x9f886340, 0x828d53f8, + 0x49d1805d, 0xcf45f2f3, 0x04192156, 0xf54f9383, 0x3e134026, + 0xb8873288, 0x73dbe12d, 0x6eded195, 0xa5820230, 0x2316709e, + 0xe84aa33b, 0x1aca1375, 0xd196c0d0, 0x5702b27e, 0x9c5e61db, + 0x815b5163, 0x4a0782c6, 0xcc93f068, 0x07cf23cd, 0xf6999118, + 0x3dc542bd, 0xbb513013, 0x700de3b6, 0x6d08d30e, 0xa65400ab, + 0x20c07205, 0xeb9ca1a0, 0x11e81eb4, 0xdab4cd11, 0x5c20bfbf, + 0x977c6c1a, 0x8a795ca2, 0x41258f07, 0xc7b1fda9, 0x0ced2e0c, + 0xfdbb9cd9, 0x36e74f7c, 0xb0733dd2, 0x7b2fee77, 0x662adecf, + 0xad760d6a, 0x2be27fc4, 0xe0beac61, 0x123e1c2f, 0xd962cf8a, + 0x5ff6bd24, 0x94aa6e81, 0x89af5e39, 0x42f38d9c, 0xc467ff32, + 0x0f3b2c97, 0xfe6d9e42, 0x35314de7, 0xb3a53f49, 0x78f9ecec, + 0x65fcdc54, 0xaea00ff1, 0x28347d5f, 0xe368aefa, 0x16441b82, + 0xdd18c827, 0x5b8cba89, 0x90d0692c, 0x8dd55994, 0x46898a31, + 0xc01df89f, 0x0b412b3a, 0xfa1799ef, 0x314b4a4a, 0xb7df38e4, + 0x7c83eb41, 0x6186dbf9, 0xaada085c, 0x2c4e7af2, 0xe712a957, + 0x15921919, 0xdececabc, 0x585ab812, 0x93066bb7, 0x8e035b0f, + 0x455f88aa, 0xc3cbfa04, 0x089729a1, 0xf9c19b74, 0x329d48d1, + 0xb4093a7f, 0x7f55e9da, 0x6250d962, 0xa90c0ac7, 0x2f987869, + 0xe4c4abcc}, + {0x00000000, 0x3d6029b0, 0x7ac05360, 0x47a07ad0, 0xf580a6c0, + 0xc8e08f70, 0x8f40f5a0, 0xb220dc10, 0x30704bc1, 0x0d106271, + 0x4ab018a1, 0x77d03111, 0xc5f0ed01, 0xf890c4b1, 0xbf30be61, + 0x825097d1, 0x60e09782, 0x5d80be32, 0x1a20c4e2, 0x2740ed52, + 0x95603142, 0xa80018f2, 0xefa06222, 0xd2c04b92, 0x5090dc43, + 0x6df0f5f3, 0x2a508f23, 0x1730a693, 0xa5107a83, 0x98705333, + 0xdfd029e3, 0xe2b00053, 0xc1c12f04, 0xfca106b4, 0xbb017c64, + 0x866155d4, 0x344189c4, 0x0921a074, 0x4e81daa4, 0x73e1f314, + 0xf1b164c5, 0xccd14d75, 0x8b7137a5, 0xb6111e15, 0x0431c205, + 0x3951ebb5, 0x7ef19165, 0x4391b8d5, 0xa121b886, 0x9c419136, + 0xdbe1ebe6, 0xe681c256, 0x54a11e46, 0x69c137f6, 0x2e614d26, + 0x13016496, 0x9151f347, 0xac31daf7, 0xeb91a027, 0xd6f18997, + 0x64d15587, 0x59b17c37, 0x1e1106e7, 0x23712f57, 0x58f35849, + 0x659371f9, 0x22330b29, 0x1f532299, 0xad73fe89, 0x9013d739, + 0xd7b3ade9, 0xead38459, 0x68831388, 0x55e33a38, 0x124340e8, + 0x2f236958, 0x9d03b548, 0xa0639cf8, 0xe7c3e628, 0xdaa3cf98, + 0x3813cfcb, 0x0573e67b, 0x42d39cab, 0x7fb3b51b, 0xcd93690b, + 0xf0f340bb, 0xb7533a6b, 0x8a3313db, 0x0863840a, 0x3503adba, + 0x72a3d76a, 0x4fc3feda, 0xfde322ca, 0xc0830b7a, 0x872371aa, + 0xba43581a, 0x9932774d, 0xa4525efd, 0xe3f2242d, 0xde920d9d, + 0x6cb2d18d, 0x51d2f83d, 0x167282ed, 0x2b12ab5d, 0xa9423c8c, + 0x9422153c, 0xd3826fec, 0xeee2465c, 0x5cc29a4c, 0x61a2b3fc, + 0x2602c92c, 0x1b62e09c, 0xf9d2e0cf, 0xc4b2c97f, 0x8312b3af, + 0xbe729a1f, 0x0c52460f, 0x31326fbf, 0x7692156f, 0x4bf23cdf, + 0xc9a2ab0e, 0xf4c282be, 0xb362f86e, 0x8e02d1de, 0x3c220dce, + 0x0142247e, 0x46e25eae, 0x7b82771e, 0xb1e6b092, 0x8c869922, + 0xcb26e3f2, 0xf646ca42, 0x44661652, 0x79063fe2, 0x3ea64532, + 0x03c66c82, 0x8196fb53, 0xbcf6d2e3, 0xfb56a833, 0xc6368183, + 0x74165d93, 0x49767423, 0x0ed60ef3, 0x33b62743, 0xd1062710, + 0xec660ea0, 0xabc67470, 0x96a65dc0, 0x248681d0, 0x19e6a860, + 0x5e46d2b0, 0x6326fb00, 0xe1766cd1, 0xdc164561, 0x9bb63fb1, + 0xa6d61601, 0x14f6ca11, 0x2996e3a1, 0x6e369971, 0x5356b0c1, + 0x70279f96, 0x4d47b626, 0x0ae7ccf6, 0x3787e546, 0x85a73956, + 0xb8c710e6, 0xff676a36, 0xc2074386, 0x4057d457, 0x7d37fde7, + 0x3a978737, 0x07f7ae87, 0xb5d77297, 0x88b75b27, 0xcf1721f7, + 0xf2770847, 0x10c70814, 0x2da721a4, 0x6a075b74, 0x576772c4, + 0xe547aed4, 0xd8278764, 0x9f87fdb4, 0xa2e7d404, 0x20b743d5, + 0x1dd76a65, 0x5a7710b5, 0x67173905, 0xd537e515, 0xe857cca5, + 0xaff7b675, 0x92979fc5, 0xe915e8db, 0xd475c16b, 0x93d5bbbb, + 0xaeb5920b, 0x1c954e1b, 0x21f567ab, 0x66551d7b, 0x5b3534cb, + 0xd965a31a, 0xe4058aaa, 0xa3a5f07a, 0x9ec5d9ca, 0x2ce505da, + 0x11852c6a, 0x562556ba, 0x6b457f0a, 0x89f57f59, 0xb49556e9, + 0xf3352c39, 0xce550589, 0x7c75d999, 0x4115f029, 0x06b58af9, + 0x3bd5a349, 0xb9853498, 0x84e51d28, 0xc34567f8, 0xfe254e48, + 0x4c059258, 0x7165bbe8, 0x36c5c138, 0x0ba5e888, 0x28d4c7df, + 0x15b4ee6f, 0x521494bf, 0x6f74bd0f, 0xdd54611f, 0xe03448af, + 0xa794327f, 0x9af41bcf, 0x18a48c1e, 0x25c4a5ae, 0x6264df7e, + 0x5f04f6ce, 0xed242ade, 0xd044036e, 0x97e479be, 0xaa84500e, + 0x4834505d, 0x755479ed, 0x32f4033d, 0x0f942a8d, 0xbdb4f69d, + 0x80d4df2d, 0xc774a5fd, 0xfa148c4d, 0x78441b9c, 0x4524322c, + 0x028448fc, 0x3fe4614c, 0x8dc4bd5c, 0xb0a494ec, 0xf704ee3c, + 0xca64c78c}, + {0x00000000, 0xb8bc6765, 0xaa09c88b, 0x12b5afee, 0x8f629757, + 0x37def032, 0x256b5fdc, 0x9dd738b9, 0xc5b428ef, 0x7d084f8a, + 0x6fbde064, 0xd7018701, 0x4ad6bfb8, 0xf26ad8dd, 0xe0df7733, + 0x58631056, 0x5019579f, 0xe8a530fa, 0xfa109f14, 0x42acf871, + 0xdf7bc0c8, 0x67c7a7ad, 0x75720843, 0xcdce6f26, 0x95ad7f70, + 0x2d111815, 0x3fa4b7fb, 0x8718d09e, 0x1acfe827, 0xa2738f42, + 0xb0c620ac, 0x087a47c9, 0xa032af3e, 0x188ec85b, 0x0a3b67b5, + 0xb28700d0, 0x2f503869, 0x97ec5f0c, 0x8559f0e2, 0x3de59787, + 0x658687d1, 0xdd3ae0b4, 0xcf8f4f5a, 0x7733283f, 0xeae41086, + 0x525877e3, 0x40edd80d, 0xf851bf68, 0xf02bf8a1, 0x48979fc4, + 0x5a22302a, 0xe29e574f, 0x7f496ff6, 0xc7f50893, 0xd540a77d, + 0x6dfcc018, 0x359fd04e, 0x8d23b72b, 0x9f9618c5, 0x272a7fa0, + 0xbafd4719, 0x0241207c, 0x10f48f92, 0xa848e8f7, 0x9b14583d, + 0x23a83f58, 0x311d90b6, 0x89a1f7d3, 0x1476cf6a, 0xaccaa80f, + 0xbe7f07e1, 0x06c36084, 0x5ea070d2, 0xe61c17b7, 0xf4a9b859, + 0x4c15df3c, 0xd1c2e785, 0x697e80e0, 0x7bcb2f0e, 0xc377486b, + 0xcb0d0fa2, 0x73b168c7, 0x6104c729, 0xd9b8a04c, 0x446f98f5, + 0xfcd3ff90, 0xee66507e, 0x56da371b, 0x0eb9274d, 0xb6054028, + 0xa4b0efc6, 0x1c0c88a3, 0x81dbb01a, 0x3967d77f, 0x2bd27891, + 0x936e1ff4, 0x3b26f703, 0x839a9066, 0x912f3f88, 0x299358ed, + 0xb4446054, 0x0cf80731, 0x1e4da8df, 0xa6f1cfba, 0xfe92dfec, + 0x462eb889, 0x549b1767, 0xec277002, 0x71f048bb, 0xc94c2fde, + 0xdbf98030, 0x6345e755, 0x6b3fa09c, 0xd383c7f9, 0xc1366817, + 0x798a0f72, 0xe45d37cb, 0x5ce150ae, 0x4e54ff40, 0xf6e89825, + 0xae8b8873, 0x1637ef16, 0x048240f8, 0xbc3e279d, 0x21e91f24, + 0x99557841, 0x8be0d7af, 0x335cb0ca, 0xed59b63b, 0x55e5d15e, + 0x47507eb0, 0xffec19d5, 0x623b216c, 0xda874609, 0xc832e9e7, + 0x708e8e82, 0x28ed9ed4, 0x9051f9b1, 0x82e4565f, 0x3a58313a, + 0xa78f0983, 0x1f336ee6, 0x0d86c108, 0xb53aa66d, 0xbd40e1a4, + 0x05fc86c1, 0x1749292f, 0xaff54e4a, 0x322276f3, 0x8a9e1196, + 0x982bbe78, 0x2097d91d, 0x78f4c94b, 0xc048ae2e, 0xd2fd01c0, + 0x6a4166a5, 0xf7965e1c, 0x4f2a3979, 0x5d9f9697, 0xe523f1f2, + 0x4d6b1905, 0xf5d77e60, 0xe762d18e, 0x5fdeb6eb, 0xc2098e52, + 0x7ab5e937, 0x680046d9, 0xd0bc21bc, 0x88df31ea, 0x3063568f, + 0x22d6f961, 0x9a6a9e04, 0x07bda6bd, 0xbf01c1d8, 0xadb46e36, + 0x15080953, 0x1d724e9a, 0xa5ce29ff, 0xb77b8611, 0x0fc7e174, + 0x9210d9cd, 0x2aacbea8, 0x38191146, 0x80a57623, 0xd8c66675, + 0x607a0110, 0x72cfaefe, 0xca73c99b, 0x57a4f122, 0xef189647, + 0xfdad39a9, 0x45115ecc, 0x764dee06, 0xcef18963, 0xdc44268d, + 0x64f841e8, 0xf92f7951, 0x41931e34, 0x5326b1da, 0xeb9ad6bf, + 0xb3f9c6e9, 0x0b45a18c, 0x19f00e62, 0xa14c6907, 0x3c9b51be, + 0x842736db, 0x96929935, 0x2e2efe50, 0x2654b999, 0x9ee8defc, + 0x8c5d7112, 0x34e11677, 0xa9362ece, 0x118a49ab, 0x033fe645, + 0xbb838120, 0xe3e09176, 0x5b5cf613, 0x49e959fd, 0xf1553e98, + 0x6c820621, 0xd43e6144, 0xc68bceaa, 0x7e37a9cf, 0xd67f4138, + 0x6ec3265d, 0x7c7689b3, 0xc4caeed6, 0x591dd66f, 0xe1a1b10a, + 0xf3141ee4, 0x4ba87981, 0x13cb69d7, 0xab770eb2, 0xb9c2a15c, + 0x017ec639, 0x9ca9fe80, 0x241599e5, 0x36a0360b, 0x8e1c516e, + 0x866616a7, 0x3eda71c2, 0x2c6fde2c, 0x94d3b949, 0x090481f0, + 0xb1b8e695, 0xa30d497b, 0x1bb12e1e, 0x43d23e48, 0xfb6e592d, + 0xe9dbf6c3, 0x516791a6, 0xccb0a91f, 0x740cce7a, 0x66b96194, + 0xde0506f1}, + {0x00000000, 0x01c26a37, 0x0384d46e, 0x0246be59, 0x0709a8dc, + 0x06cbc2eb, 0x048d7cb2, 0x054f1685, 0x0e1351b8, 0x0fd13b8f, + 0x0d9785d6, 0x0c55efe1, 0x091af964, 0x08d89353, 0x0a9e2d0a, + 0x0b5c473d, 0x1c26a370, 0x1de4c947, 0x1fa2771e, 0x1e601d29, + 0x1b2f0bac, 0x1aed619b, 0x18abdfc2, 0x1969b5f5, 0x1235f2c8, + 0x13f798ff, 0x11b126a6, 0x10734c91, 0x153c5a14, 0x14fe3023, + 0x16b88e7a, 0x177ae44d, 0x384d46e0, 0x398f2cd7, 0x3bc9928e, + 0x3a0bf8b9, 0x3f44ee3c, 0x3e86840b, 0x3cc03a52, 0x3d025065, + 0x365e1758, 0x379c7d6f, 0x35dac336, 0x3418a901, 0x3157bf84, + 0x3095d5b3, 0x32d36bea, 0x331101dd, 0x246be590, 0x25a98fa7, + 0x27ef31fe, 0x262d5bc9, 0x23624d4c, 0x22a0277b, 0x20e69922, + 0x2124f315, 0x2a78b428, 0x2bbade1f, 0x29fc6046, 0x283e0a71, + 0x2d711cf4, 0x2cb376c3, 0x2ef5c89a, 0x2f37a2ad, 0x709a8dc0, + 0x7158e7f7, 0x731e59ae, 0x72dc3399, 0x7793251c, 0x76514f2b, + 0x7417f172, 0x75d59b45, 0x7e89dc78, 0x7f4bb64f, 0x7d0d0816, + 0x7ccf6221, 0x798074a4, 0x78421e93, 0x7a04a0ca, 0x7bc6cafd, + 0x6cbc2eb0, 0x6d7e4487, 0x6f38fade, 0x6efa90e9, 0x6bb5866c, + 0x6a77ec5b, 0x68315202, 0x69f33835, 0x62af7f08, 0x636d153f, + 0x612bab66, 0x60e9c151, 0x65a6d7d4, 0x6464bde3, 0x662203ba, + 0x67e0698d, 0x48d7cb20, 0x4915a117, 0x4b531f4e, 0x4a917579, + 0x4fde63fc, 0x4e1c09cb, 0x4c5ab792, 0x4d98dda5, 0x46c49a98, + 0x4706f0af, 0x45404ef6, 0x448224c1, 0x41cd3244, 0x400f5873, + 0x4249e62a, 0x438b8c1d, 0x54f16850, 0x55330267, 0x5775bc3e, + 0x56b7d609, 0x53f8c08c, 0x523aaabb, 0x507c14e2, 0x51be7ed5, + 0x5ae239e8, 0x5b2053df, 0x5966ed86, 0x58a487b1, 0x5deb9134, + 0x5c29fb03, 0x5e6f455a, 0x5fad2f6d, 0xe1351b80, 0xe0f771b7, + 0xe2b1cfee, 0xe373a5d9, 0xe63cb35c, 0xe7fed96b, 0xe5b86732, + 0xe47a0d05, 0xef264a38, 0xeee4200f, 0xeca29e56, 0xed60f461, + 0xe82fe2e4, 0xe9ed88d3, 0xebab368a, 0xea695cbd, 0xfd13b8f0, + 0xfcd1d2c7, 0xfe976c9e, 0xff5506a9, 0xfa1a102c, 0xfbd87a1b, + 0xf99ec442, 0xf85cae75, 0xf300e948, 0xf2c2837f, 0xf0843d26, + 0xf1465711, 0xf4094194, 0xf5cb2ba3, 0xf78d95fa, 0xf64fffcd, + 0xd9785d60, 0xd8ba3757, 0xdafc890e, 0xdb3ee339, 0xde71f5bc, + 0xdfb39f8b, 0xddf521d2, 0xdc374be5, 0xd76b0cd8, 0xd6a966ef, + 0xd4efd8b6, 0xd52db281, 0xd062a404, 0xd1a0ce33, 0xd3e6706a, + 0xd2241a5d, 0xc55efe10, 0xc49c9427, 0xc6da2a7e, 0xc7184049, + 0xc25756cc, 0xc3953cfb, 0xc1d382a2, 0xc011e895, 0xcb4dafa8, + 0xca8fc59f, 0xc8c97bc6, 0xc90b11f1, 0xcc440774, 0xcd866d43, + 0xcfc0d31a, 0xce02b92d, 0x91af9640, 0x906dfc77, 0x922b422e, + 0x93e92819, 0x96a63e9c, 0x976454ab, 0x9522eaf2, 0x94e080c5, + 0x9fbcc7f8, 0x9e7eadcf, 0x9c381396, 0x9dfa79a1, 0x98b56f24, + 0x99770513, 0x9b31bb4a, 0x9af3d17d, 0x8d893530, 0x8c4b5f07, + 0x8e0de15e, 0x8fcf8b69, 0x8a809dec, 0x8b42f7db, 0x89044982, + 0x88c623b5, 0x839a6488, 0x82580ebf, 0x801eb0e6, 0x81dcdad1, + 0x8493cc54, 0x8551a663, 0x8717183a, 0x86d5720d, 0xa9e2d0a0, + 0xa820ba97, 0xaa6604ce, 0xaba46ef9, 0xaeeb787c, 0xaf29124b, + 0xad6fac12, 0xacadc625, 0xa7f18118, 0xa633eb2f, 0xa4755576, + 0xa5b73f41, 0xa0f829c4, 0xa13a43f3, 0xa37cfdaa, 0xa2be979d, + 0xb5c473d0, 0xb40619e7, 0xb640a7be, 0xb782cd89, 0xb2cddb0c, + 0xb30fb13b, 0xb1490f62, 0xb08b6555, 0xbbd72268, 0xba15485f, + 0xb853f606, 0xb9919c31, 0xbcde8ab4, 0xbd1ce083, 0xbf5a5eda, + 0xbe9834ed}, + {0x00000000, 0x191b3141, 0x32366282, 0x2b2d53c3, 0x646cc504, + 0x7d77f445, 0x565aa786, 0x4f4196c7, 0xc8d98a08, 0xd1c2bb49, + 0xfaefe88a, 0xe3f4d9cb, 0xacb54f0c, 0xb5ae7e4d, 0x9e832d8e, + 0x87981ccf, 0x4ac21251, 0x53d92310, 0x78f470d3, 0x61ef4192, + 0x2eaed755, 0x37b5e614, 0x1c98b5d7, 0x05838496, 0x821b9859, + 0x9b00a918, 0xb02dfadb, 0xa936cb9a, 0xe6775d5d, 0xff6c6c1c, + 0xd4413fdf, 0xcd5a0e9e, 0x958424a2, 0x8c9f15e3, 0xa7b24620, + 0xbea97761, 0xf1e8e1a6, 0xe8f3d0e7, 0xc3de8324, 0xdac5b265, + 0x5d5daeaa, 0x44469feb, 0x6f6bcc28, 0x7670fd69, 0x39316bae, + 0x202a5aef, 0x0b07092c, 0x121c386d, 0xdf4636f3, 0xc65d07b2, + 0xed705471, 0xf46b6530, 0xbb2af3f7, 0xa231c2b6, 0x891c9175, + 0x9007a034, 0x179fbcfb, 0x0e848dba, 0x25a9de79, 0x3cb2ef38, + 0x73f379ff, 0x6ae848be, 0x41c51b7d, 0x58de2a3c, 0xf0794f05, + 0xe9627e44, 0xc24f2d87, 0xdb541cc6, 0x94158a01, 0x8d0ebb40, + 0xa623e883, 0xbf38d9c2, 0x38a0c50d, 0x21bbf44c, 0x0a96a78f, + 0x138d96ce, 0x5ccc0009, 0x45d73148, 0x6efa628b, 0x77e153ca, + 0xbabb5d54, 0xa3a06c15, 0x888d3fd6, 0x91960e97, 0xded79850, + 0xc7cca911, 0xece1fad2, 0xf5facb93, 0x7262d75c, 0x6b79e61d, + 0x4054b5de, 0x594f849f, 0x160e1258, 0x0f152319, 0x243870da, + 0x3d23419b, 0x65fd6ba7, 0x7ce65ae6, 0x57cb0925, 0x4ed03864, + 0x0191aea3, 0x188a9fe2, 0x33a7cc21, 0x2abcfd60, 0xad24e1af, + 0xb43fd0ee, 0x9f12832d, 0x8609b26c, 0xc94824ab, 0xd05315ea, + 0xfb7e4629, 0xe2657768, 0x2f3f79f6, 0x362448b7, 0x1d091b74, + 0x04122a35, 0x4b53bcf2, 0x52488db3, 0x7965de70, 0x607eef31, + 0xe7e6f3fe, 0xfefdc2bf, 0xd5d0917c, 0xcccba03d, 0x838a36fa, + 0x9a9107bb, 0xb1bc5478, 0xa8a76539, 0x3b83984b, 0x2298a90a, + 0x09b5fac9, 0x10aecb88, 0x5fef5d4f, 0x46f46c0e, 0x6dd93fcd, + 0x74c20e8c, 0xf35a1243, 0xea412302, 0xc16c70c1, 0xd8774180, + 0x9736d747, 0x8e2de606, 0xa500b5c5, 0xbc1b8484, 0x71418a1a, + 0x685abb5b, 0x4377e898, 0x5a6cd9d9, 0x152d4f1e, 0x0c367e5f, + 0x271b2d9c, 0x3e001cdd, 0xb9980012, 0xa0833153, 0x8bae6290, + 0x92b553d1, 0xddf4c516, 0xc4eff457, 0xefc2a794, 0xf6d996d5, + 0xae07bce9, 0xb71c8da8, 0x9c31de6b, 0x852aef2a, 0xca6b79ed, + 0xd37048ac, 0xf85d1b6f, 0xe1462a2e, 0x66de36e1, 0x7fc507a0, + 0x54e85463, 0x4df36522, 0x02b2f3e5, 0x1ba9c2a4, 0x30849167, + 0x299fa026, 0xe4c5aeb8, 0xfdde9ff9, 0xd6f3cc3a, 0xcfe8fd7b, + 0x80a96bbc, 0x99b25afd, 0xb29f093e, 0xab84387f, 0x2c1c24b0, + 0x350715f1, 0x1e2a4632, 0x07317773, 0x4870e1b4, 0x516bd0f5, + 0x7a468336, 0x635db277, 0xcbfad74e, 0xd2e1e60f, 0xf9ccb5cc, + 0xe0d7848d, 0xaf96124a, 0xb68d230b, 0x9da070c8, 0x84bb4189, + 0x03235d46, 0x1a386c07, 0x31153fc4, 0x280e0e85, 0x674f9842, + 0x7e54a903, 0x5579fac0, 0x4c62cb81, 0x8138c51f, 0x9823f45e, + 0xb30ea79d, 0xaa1596dc, 0xe554001b, 0xfc4f315a, 0xd7626299, + 0xce7953d8, 0x49e14f17, 0x50fa7e56, 0x7bd72d95, 0x62cc1cd4, + 0x2d8d8a13, 0x3496bb52, 0x1fbbe891, 0x06a0d9d0, 0x5e7ef3ec, + 0x4765c2ad, 0x6c48916e, 0x7553a02f, 0x3a1236e8, 0x230907a9, + 0x0824546a, 0x113f652b, 0x96a779e4, 0x8fbc48a5, 0xa4911b66, + 0xbd8a2a27, 0xf2cbbce0, 0xebd08da1, 0xc0fdde62, 0xd9e6ef23, + 0x14bce1bd, 0x0da7d0fc, 0x268a833f, 0x3f91b27e, 0x70d024b9, + 0x69cb15f8, 0x42e6463b, 0x5bfd777a, 0xdc656bb5, 0xc57e5af4, + 0xee530937, 0xf7483876, 0xb809aeb1, 0xa1129ff0, 0x8a3fcc33, + 0x9324fd72}, + {0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, + 0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, + 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, + 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, + 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856, + 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, + 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, + 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, + 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, + 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a, + 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, + 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, + 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, + 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, + 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e, + 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, + 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, + 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, + 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, + 0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, + 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, + 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, + 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010, + 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, + 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, + 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, + 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615, + 0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, + 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344, + 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, + 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, + 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, + 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, + 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c, + 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, + 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, + 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, + 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, + 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c, + 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, + 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, + 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, + 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, + 0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, + 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278, + 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, + 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66, + 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, + 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, + 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, + 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, + 0x2d02ef8d}}; + +local const z_word_t FAR crc_braid_big_table[][256] = { + {0x0000000000000000, 0x9630077700000000, 0x2c610eee00000000, + 0xba51099900000000, 0x19c46d0700000000, 0x8ff46a7000000000, + 0x35a563e900000000, 0xa395649e00000000, 0x3288db0e00000000, + 0xa4b8dc7900000000, 0x1ee9d5e000000000, 0x88d9d29700000000, + 0x2b4cb60900000000, 0xbd7cb17e00000000, 0x072db8e700000000, + 0x911dbf9000000000, 0x6410b71d00000000, 0xf220b06a00000000, + 0x4871b9f300000000, 0xde41be8400000000, 0x7dd4da1a00000000, + 0xebe4dd6d00000000, 0x51b5d4f400000000, 0xc785d38300000000, + 0x56986c1300000000, 0xc0a86b6400000000, 0x7af962fd00000000, + 0xecc9658a00000000, 0x4f5c011400000000, 0xd96c066300000000, + 0x633d0ffa00000000, 0xf50d088d00000000, 0xc8206e3b00000000, + 0x5e10694c00000000, 0xe44160d500000000, 0x727167a200000000, + 0xd1e4033c00000000, 0x47d4044b00000000, 0xfd850dd200000000, + 0x6bb50aa500000000, 0xfaa8b53500000000, 0x6c98b24200000000, + 0xd6c9bbdb00000000, 0x40f9bcac00000000, 0xe36cd83200000000, + 0x755cdf4500000000, 0xcf0dd6dc00000000, 0x593dd1ab00000000, + 0xac30d92600000000, 0x3a00de5100000000, 0x8051d7c800000000, + 0x1661d0bf00000000, 0xb5f4b42100000000, 0x23c4b35600000000, + 0x9995bacf00000000, 0x0fa5bdb800000000, 0x9eb8022800000000, + 0x0888055f00000000, 0xb2d90cc600000000, 0x24e90bb100000000, + 0x877c6f2f00000000, 0x114c685800000000, 0xab1d61c100000000, + 0x3d2d66b600000000, 0x9041dc7600000000, 0x0671db0100000000, + 0xbc20d29800000000, 0x2a10d5ef00000000, 0x8985b17100000000, + 0x1fb5b60600000000, 0xa5e4bf9f00000000, 0x33d4b8e800000000, + 0xa2c9077800000000, 0x34f9000f00000000, 0x8ea8099600000000, + 0x18980ee100000000, 0xbb0d6a7f00000000, 0x2d3d6d0800000000, + 0x976c649100000000, 0x015c63e600000000, 0xf4516b6b00000000, + 0x62616c1c00000000, 0xd830658500000000, 0x4e0062f200000000, + 0xed95066c00000000, 0x7ba5011b00000000, 0xc1f4088200000000, + 0x57c40ff500000000, 0xc6d9b06500000000, 0x50e9b71200000000, + 0xeab8be8b00000000, 0x7c88b9fc00000000, 0xdf1ddd6200000000, + 0x492dda1500000000, 0xf37cd38c00000000, 0x654cd4fb00000000, + 0x5861b24d00000000, 0xce51b53a00000000, 0x7400bca300000000, + 0xe230bbd400000000, 0x41a5df4a00000000, 0xd795d83d00000000, + 0x6dc4d1a400000000, 0xfbf4d6d300000000, 0x6ae9694300000000, + 0xfcd96e3400000000, 0x468867ad00000000, 0xd0b860da00000000, + 0x732d044400000000, 0xe51d033300000000, 0x5f4c0aaa00000000, + 0xc97c0ddd00000000, 0x3c71055000000000, 0xaa41022700000000, + 0x10100bbe00000000, 0x86200cc900000000, 0x25b5685700000000, + 0xb3856f2000000000, 0x09d466b900000000, 0x9fe461ce00000000, + 0x0ef9de5e00000000, 0x98c9d92900000000, 0x2298d0b000000000, + 0xb4a8d7c700000000, 0x173db35900000000, 0x810db42e00000000, + 0x3b5cbdb700000000, 0xad6cbac000000000, 0x2083b8ed00000000, + 0xb6b3bf9a00000000, 0x0ce2b60300000000, 0x9ad2b17400000000, + 0x3947d5ea00000000, 0xaf77d29d00000000, 0x1526db0400000000, + 0x8316dc7300000000, 0x120b63e300000000, 0x843b649400000000, + 0x3e6a6d0d00000000, 0xa85a6a7a00000000, 0x0bcf0ee400000000, + 0x9dff099300000000, 0x27ae000a00000000, 0xb19e077d00000000, + 0x44930ff000000000, 0xd2a3088700000000, 0x68f2011e00000000, + 0xfec2066900000000, 0x5d5762f700000000, 0xcb67658000000000, + 0x71366c1900000000, 0xe7066b6e00000000, 0x761bd4fe00000000, + 0xe02bd38900000000, 0x5a7ada1000000000, 0xcc4add6700000000, + 0x6fdfb9f900000000, 0xf9efbe8e00000000, 0x43beb71700000000, + 0xd58eb06000000000, 0xe8a3d6d600000000, 0x7e93d1a100000000, + 0xc4c2d83800000000, 0x52f2df4f00000000, 0xf167bbd100000000, + 0x6757bca600000000, 0xdd06b53f00000000, 0x4b36b24800000000, + 0xda2b0dd800000000, 0x4c1b0aaf00000000, 0xf64a033600000000, + 0x607a044100000000, 0xc3ef60df00000000, 0x55df67a800000000, + 0xef8e6e3100000000, 0x79be694600000000, 0x8cb361cb00000000, + 0x1a8366bc00000000, 0xa0d26f2500000000, 0x36e2685200000000, + 0x95770ccc00000000, 0x03470bbb00000000, 0xb916022200000000, + 0x2f26055500000000, 0xbe3bbac500000000, 0x280bbdb200000000, + 0x925ab42b00000000, 0x046ab35c00000000, 0xa7ffd7c200000000, + 0x31cfd0b500000000, 0x8b9ed92c00000000, 0x1daede5b00000000, + 0xb0c2649b00000000, 0x26f263ec00000000, 0x9ca36a7500000000, + 0x0a936d0200000000, 0xa906099c00000000, 0x3f360eeb00000000, + 0x8567077200000000, 0x1357000500000000, 0x824abf9500000000, + 0x147ab8e200000000, 0xae2bb17b00000000, 0x381bb60c00000000, + 0x9b8ed29200000000, 0x0dbed5e500000000, 0xb7efdc7c00000000, + 0x21dfdb0b00000000, 0xd4d2d38600000000, 0x42e2d4f100000000, + 0xf8b3dd6800000000, 0x6e83da1f00000000, 0xcd16be8100000000, + 0x5b26b9f600000000, 0xe177b06f00000000, 0x7747b71800000000, + 0xe65a088800000000, 0x706a0fff00000000, 0xca3b066600000000, + 0x5c0b011100000000, 0xff9e658f00000000, 0x69ae62f800000000, + 0xd3ff6b6100000000, 0x45cf6c1600000000, 0x78e20aa000000000, + 0xeed20dd700000000, 0x5483044e00000000, 0xc2b3033900000000, + 0x612667a700000000, 0xf71660d000000000, 0x4d47694900000000, + 0xdb776e3e00000000, 0x4a6ad1ae00000000, 0xdc5ad6d900000000, + 0x660bdf4000000000, 0xf03bd83700000000, 0x53aebca900000000, + 0xc59ebbde00000000, 0x7fcfb24700000000, 0xe9ffb53000000000, + 0x1cf2bdbd00000000, 0x8ac2baca00000000, 0x3093b35300000000, + 0xa6a3b42400000000, 0x0536d0ba00000000, 0x9306d7cd00000000, + 0x2957de5400000000, 0xbf67d92300000000, 0x2e7a66b300000000, + 0xb84a61c400000000, 0x021b685d00000000, 0x942b6f2a00000000, + 0x37be0bb400000000, 0xa18e0cc300000000, 0x1bdf055a00000000, + 0x8def022d00000000}, + {0x0000000000000000, 0x41311b1900000000, 0x8262363200000000, + 0xc3532d2b00000000, 0x04c56c6400000000, 0x45f4777d00000000, + 0x86a75a5600000000, 0xc796414f00000000, 0x088ad9c800000000, + 0x49bbc2d100000000, 0x8ae8effa00000000, 0xcbd9f4e300000000, + 0x0c4fb5ac00000000, 0x4d7eaeb500000000, 0x8e2d839e00000000, + 0xcf1c988700000000, 0x5112c24a00000000, 0x1023d95300000000, + 0xd370f47800000000, 0x9241ef6100000000, 0x55d7ae2e00000000, + 0x14e6b53700000000, 0xd7b5981c00000000, 0x9684830500000000, + 0x59981b8200000000, 0x18a9009b00000000, 0xdbfa2db000000000, + 0x9acb36a900000000, 0x5d5d77e600000000, 0x1c6c6cff00000000, + 0xdf3f41d400000000, 0x9e0e5acd00000000, 0xa224849500000000, + 0xe3159f8c00000000, 0x2046b2a700000000, 0x6177a9be00000000, + 0xa6e1e8f100000000, 0xe7d0f3e800000000, 0x2483dec300000000, + 0x65b2c5da00000000, 0xaaae5d5d00000000, 0xeb9f464400000000, + 0x28cc6b6f00000000, 0x69fd707600000000, 0xae6b313900000000, + 0xef5a2a2000000000, 0x2c09070b00000000, 0x6d381c1200000000, + 0xf33646df00000000, 0xb2075dc600000000, 0x715470ed00000000, + 0x30656bf400000000, 0xf7f32abb00000000, 0xb6c231a200000000, + 0x75911c8900000000, 0x34a0079000000000, 0xfbbc9f1700000000, + 0xba8d840e00000000, 0x79dea92500000000, 0x38efb23c00000000, + 0xff79f37300000000, 0xbe48e86a00000000, 0x7d1bc54100000000, + 0x3c2ade5800000000, 0x054f79f000000000, 0x447e62e900000000, + 0x872d4fc200000000, 0xc61c54db00000000, 0x018a159400000000, + 0x40bb0e8d00000000, 0x83e823a600000000, 0xc2d938bf00000000, + 0x0dc5a03800000000, 0x4cf4bb2100000000, 0x8fa7960a00000000, + 0xce968d1300000000, 0x0900cc5c00000000, 0x4831d74500000000, + 0x8b62fa6e00000000, 0xca53e17700000000, 0x545dbbba00000000, + 0x156ca0a300000000, 0xd63f8d8800000000, 0x970e969100000000, + 0x5098d7de00000000, 0x11a9ccc700000000, 0xd2fae1ec00000000, + 0x93cbfaf500000000, 0x5cd7627200000000, 0x1de6796b00000000, + 0xdeb5544000000000, 0x9f844f5900000000, 0x58120e1600000000, + 0x1923150f00000000, 0xda70382400000000, 0x9b41233d00000000, + 0xa76bfd6500000000, 0xe65ae67c00000000, 0x2509cb5700000000, + 0x6438d04e00000000, 0xa3ae910100000000, 0xe29f8a1800000000, + 0x21cca73300000000, 0x60fdbc2a00000000, 0xafe124ad00000000, + 0xeed03fb400000000, 0x2d83129f00000000, 0x6cb2098600000000, + 0xab2448c900000000, 0xea1553d000000000, 0x29467efb00000000, + 0x687765e200000000, 0xf6793f2f00000000, 0xb748243600000000, + 0x741b091d00000000, 0x352a120400000000, 0xf2bc534b00000000, + 0xb38d485200000000, 0x70de657900000000, 0x31ef7e6000000000, + 0xfef3e6e700000000, 0xbfc2fdfe00000000, 0x7c91d0d500000000, + 0x3da0cbcc00000000, 0xfa368a8300000000, 0xbb07919a00000000, + 0x7854bcb100000000, 0x3965a7a800000000, 0x4b98833b00000000, + 0x0aa9982200000000, 0xc9fab50900000000, 0x88cbae1000000000, + 0x4f5def5f00000000, 0x0e6cf44600000000, 0xcd3fd96d00000000, + 0x8c0ec27400000000, 0x43125af300000000, 0x022341ea00000000, + 0xc1706cc100000000, 0x804177d800000000, 0x47d7369700000000, + 0x06e62d8e00000000, 0xc5b500a500000000, 0x84841bbc00000000, + 0x1a8a417100000000, 0x5bbb5a6800000000, 0x98e8774300000000, + 0xd9d96c5a00000000, 0x1e4f2d1500000000, 0x5f7e360c00000000, + 0x9c2d1b2700000000, 0xdd1c003e00000000, 0x120098b900000000, + 0x533183a000000000, 0x9062ae8b00000000, 0xd153b59200000000, + 0x16c5f4dd00000000, 0x57f4efc400000000, 0x94a7c2ef00000000, + 0xd596d9f600000000, 0xe9bc07ae00000000, 0xa88d1cb700000000, + 0x6bde319c00000000, 0x2aef2a8500000000, 0xed796bca00000000, + 0xac4870d300000000, 0x6f1b5df800000000, 0x2e2a46e100000000, + 0xe136de6600000000, 0xa007c57f00000000, 0x6354e85400000000, + 0x2265f34d00000000, 0xe5f3b20200000000, 0xa4c2a91b00000000, + 0x6791843000000000, 0x26a09f2900000000, 0xb8aec5e400000000, + 0xf99fdefd00000000, 0x3accf3d600000000, 0x7bfde8cf00000000, + 0xbc6ba98000000000, 0xfd5ab29900000000, 0x3e099fb200000000, + 0x7f3884ab00000000, 0xb0241c2c00000000, 0xf115073500000000, + 0x32462a1e00000000, 0x7377310700000000, 0xb4e1704800000000, + 0xf5d06b5100000000, 0x3683467a00000000, 0x77b25d6300000000, + 0x4ed7facb00000000, 0x0fe6e1d200000000, 0xccb5ccf900000000, + 0x8d84d7e000000000, 0x4a1296af00000000, 0x0b238db600000000, + 0xc870a09d00000000, 0x8941bb8400000000, 0x465d230300000000, + 0x076c381a00000000, 0xc43f153100000000, 0x850e0e2800000000, + 0x42984f6700000000, 0x03a9547e00000000, 0xc0fa795500000000, + 0x81cb624c00000000, 0x1fc5388100000000, 0x5ef4239800000000, + 0x9da70eb300000000, 0xdc9615aa00000000, 0x1b0054e500000000, + 0x5a314ffc00000000, 0x996262d700000000, 0xd85379ce00000000, + 0x174fe14900000000, 0x567efa5000000000, 0x952dd77b00000000, + 0xd41ccc6200000000, 0x138a8d2d00000000, 0x52bb963400000000, + 0x91e8bb1f00000000, 0xd0d9a00600000000, 0xecf37e5e00000000, + 0xadc2654700000000, 0x6e91486c00000000, 0x2fa0537500000000, + 0xe836123a00000000, 0xa907092300000000, 0x6a54240800000000, + 0x2b653f1100000000, 0xe479a79600000000, 0xa548bc8f00000000, + 0x661b91a400000000, 0x272a8abd00000000, 0xe0bccbf200000000, + 0xa18dd0eb00000000, 0x62defdc000000000, 0x23efe6d900000000, + 0xbde1bc1400000000, 0xfcd0a70d00000000, 0x3f838a2600000000, + 0x7eb2913f00000000, 0xb924d07000000000, 0xf815cb6900000000, + 0x3b46e64200000000, 0x7a77fd5b00000000, 0xb56b65dc00000000, + 0xf45a7ec500000000, 0x370953ee00000000, 0x763848f700000000, + 0xb1ae09b800000000, 0xf09f12a100000000, 0x33cc3f8a00000000, + 0x72fd249300000000}, + {0x0000000000000000, 0x376ac20100000000, 0x6ed4840300000000, + 0x59be460200000000, 0xdca8090700000000, 0xebc2cb0600000000, + 0xb27c8d0400000000, 0x85164f0500000000, 0xb851130e00000000, + 0x8f3bd10f00000000, 0xd685970d00000000, 0xe1ef550c00000000, + 0x64f91a0900000000, 0x5393d80800000000, 0x0a2d9e0a00000000, + 0x3d475c0b00000000, 0x70a3261c00000000, 0x47c9e41d00000000, + 0x1e77a21f00000000, 0x291d601e00000000, 0xac0b2f1b00000000, + 0x9b61ed1a00000000, 0xc2dfab1800000000, 0xf5b5691900000000, + 0xc8f2351200000000, 0xff98f71300000000, 0xa626b11100000000, + 0x914c731000000000, 0x145a3c1500000000, 0x2330fe1400000000, + 0x7a8eb81600000000, 0x4de47a1700000000, 0xe0464d3800000000, + 0xd72c8f3900000000, 0x8e92c93b00000000, 0xb9f80b3a00000000, + 0x3cee443f00000000, 0x0b84863e00000000, 0x523ac03c00000000, + 0x6550023d00000000, 0x58175e3600000000, 0x6f7d9c3700000000, + 0x36c3da3500000000, 0x01a9183400000000, 0x84bf573100000000, + 0xb3d5953000000000, 0xea6bd33200000000, 0xdd01113300000000, + 0x90e56b2400000000, 0xa78fa92500000000, 0xfe31ef2700000000, + 0xc95b2d2600000000, 0x4c4d622300000000, 0x7b27a02200000000, + 0x2299e62000000000, 0x15f3242100000000, 0x28b4782a00000000, + 0x1fdeba2b00000000, 0x4660fc2900000000, 0x710a3e2800000000, + 0xf41c712d00000000, 0xc376b32c00000000, 0x9ac8f52e00000000, + 0xada2372f00000000, 0xc08d9a7000000000, 0xf7e7587100000000, + 0xae591e7300000000, 0x9933dc7200000000, 0x1c25937700000000, + 0x2b4f517600000000, 0x72f1177400000000, 0x459bd57500000000, + 0x78dc897e00000000, 0x4fb64b7f00000000, 0x16080d7d00000000, + 0x2162cf7c00000000, 0xa474807900000000, 0x931e427800000000, + 0xcaa0047a00000000, 0xfdcac67b00000000, 0xb02ebc6c00000000, + 0x87447e6d00000000, 0xdefa386f00000000, 0xe990fa6e00000000, + 0x6c86b56b00000000, 0x5bec776a00000000, 0x0252316800000000, + 0x3538f36900000000, 0x087faf6200000000, 0x3f156d6300000000, + 0x66ab2b6100000000, 0x51c1e96000000000, 0xd4d7a66500000000, + 0xe3bd646400000000, 0xba03226600000000, 0x8d69e06700000000, + 0x20cbd74800000000, 0x17a1154900000000, 0x4e1f534b00000000, + 0x7975914a00000000, 0xfc63de4f00000000, 0xcb091c4e00000000, + 0x92b75a4c00000000, 0xa5dd984d00000000, 0x989ac44600000000, + 0xaff0064700000000, 0xf64e404500000000, 0xc124824400000000, + 0x4432cd4100000000, 0x73580f4000000000, 0x2ae6494200000000, + 0x1d8c8b4300000000, 0x5068f15400000000, 0x6702335500000000, + 0x3ebc755700000000, 0x09d6b75600000000, 0x8cc0f85300000000, + 0xbbaa3a5200000000, 0xe2147c5000000000, 0xd57ebe5100000000, + 0xe839e25a00000000, 0xdf53205b00000000, 0x86ed665900000000, + 0xb187a45800000000, 0x3491eb5d00000000, 0x03fb295c00000000, + 0x5a456f5e00000000, 0x6d2fad5f00000000, 0x801b35e100000000, + 0xb771f7e000000000, 0xeecfb1e200000000, 0xd9a573e300000000, + 0x5cb33ce600000000, 0x6bd9fee700000000, 0x3267b8e500000000, + 0x050d7ae400000000, 0x384a26ef00000000, 0x0f20e4ee00000000, + 0x569ea2ec00000000, 0x61f460ed00000000, 0xe4e22fe800000000, + 0xd388ede900000000, 0x8a36abeb00000000, 0xbd5c69ea00000000, + 0xf0b813fd00000000, 0xc7d2d1fc00000000, 0x9e6c97fe00000000, + 0xa90655ff00000000, 0x2c101afa00000000, 0x1b7ad8fb00000000, + 0x42c49ef900000000, 0x75ae5cf800000000, 0x48e900f300000000, + 0x7f83c2f200000000, 0x263d84f000000000, 0x115746f100000000, + 0x944109f400000000, 0xa32bcbf500000000, 0xfa958df700000000, + 0xcdff4ff600000000, 0x605d78d900000000, 0x5737bad800000000, + 0x0e89fcda00000000, 0x39e33edb00000000, 0xbcf571de00000000, + 0x8b9fb3df00000000, 0xd221f5dd00000000, 0xe54b37dc00000000, + 0xd80c6bd700000000, 0xef66a9d600000000, 0xb6d8efd400000000, + 0x81b22dd500000000, 0x04a462d000000000, 0x33cea0d100000000, + 0x6a70e6d300000000, 0x5d1a24d200000000, 0x10fe5ec500000000, + 0x27949cc400000000, 0x7e2adac600000000, 0x494018c700000000, + 0xcc5657c200000000, 0xfb3c95c300000000, 0xa282d3c100000000, + 0x95e811c000000000, 0xa8af4dcb00000000, 0x9fc58fca00000000, + 0xc67bc9c800000000, 0xf1110bc900000000, 0x740744cc00000000, + 0x436d86cd00000000, 0x1ad3c0cf00000000, 0x2db902ce00000000, + 0x4096af9100000000, 0x77fc6d9000000000, 0x2e422b9200000000, + 0x1928e99300000000, 0x9c3ea69600000000, 0xab54649700000000, + 0xf2ea229500000000, 0xc580e09400000000, 0xf8c7bc9f00000000, + 0xcfad7e9e00000000, 0x9613389c00000000, 0xa179fa9d00000000, + 0x246fb59800000000, 0x1305779900000000, 0x4abb319b00000000, + 0x7dd1f39a00000000, 0x3035898d00000000, 0x075f4b8c00000000, + 0x5ee10d8e00000000, 0x698bcf8f00000000, 0xec9d808a00000000, + 0xdbf7428b00000000, 0x8249048900000000, 0xb523c68800000000, + 0x88649a8300000000, 0xbf0e588200000000, 0xe6b01e8000000000, + 0xd1dadc8100000000, 0x54cc938400000000, 0x63a6518500000000, + 0x3a18178700000000, 0x0d72d58600000000, 0xa0d0e2a900000000, + 0x97ba20a800000000, 0xce0466aa00000000, 0xf96ea4ab00000000, + 0x7c78ebae00000000, 0x4b1229af00000000, 0x12ac6fad00000000, + 0x25c6adac00000000, 0x1881f1a700000000, 0x2feb33a600000000, + 0x765575a400000000, 0x413fb7a500000000, 0xc429f8a000000000, + 0xf3433aa100000000, 0xaafd7ca300000000, 0x9d97bea200000000, + 0xd073c4b500000000, 0xe71906b400000000, 0xbea740b600000000, + 0x89cd82b700000000, 0x0cdbcdb200000000, 0x3bb10fb300000000, + 0x620f49b100000000, 0x55658bb000000000, 0x6822d7bb00000000, + 0x5f4815ba00000000, 0x06f653b800000000, 0x319c91b900000000, + 0xb48adebc00000000, 0x83e01cbd00000000, 0xda5e5abf00000000, + 0xed3498be00000000}, + {0x0000000000000000, 0x6567bcb800000000, 0x8bc809aa00000000, + 0xeeafb51200000000, 0x5797628f00000000, 0x32f0de3700000000, + 0xdc5f6b2500000000, 0xb938d79d00000000, 0xef28b4c500000000, + 0x8a4f087d00000000, 0x64e0bd6f00000000, 0x018701d700000000, + 0xb8bfd64a00000000, 0xddd86af200000000, 0x3377dfe000000000, + 0x5610635800000000, 0x9f57195000000000, 0xfa30a5e800000000, + 0x149f10fa00000000, 0x71f8ac4200000000, 0xc8c07bdf00000000, + 0xada7c76700000000, 0x4308727500000000, 0x266fcecd00000000, + 0x707fad9500000000, 0x1518112d00000000, 0xfbb7a43f00000000, + 0x9ed0188700000000, 0x27e8cf1a00000000, 0x428f73a200000000, + 0xac20c6b000000000, 0xc9477a0800000000, 0x3eaf32a000000000, + 0x5bc88e1800000000, 0xb5673b0a00000000, 0xd00087b200000000, + 0x6938502f00000000, 0x0c5fec9700000000, 0xe2f0598500000000, + 0x8797e53d00000000, 0xd187866500000000, 0xb4e03add00000000, + 0x5a4f8fcf00000000, 0x3f28337700000000, 0x8610e4ea00000000, + 0xe377585200000000, 0x0dd8ed4000000000, 0x68bf51f800000000, + 0xa1f82bf000000000, 0xc49f974800000000, 0x2a30225a00000000, + 0x4f579ee200000000, 0xf66f497f00000000, 0x9308f5c700000000, + 0x7da740d500000000, 0x18c0fc6d00000000, 0x4ed09f3500000000, + 0x2bb7238d00000000, 0xc518969f00000000, 0xa07f2a2700000000, + 0x1947fdba00000000, 0x7c20410200000000, 0x928ff41000000000, + 0xf7e848a800000000, 0x3d58149b00000000, 0x583fa82300000000, + 0xb6901d3100000000, 0xd3f7a18900000000, 0x6acf761400000000, + 0x0fa8caac00000000, 0xe1077fbe00000000, 0x8460c30600000000, + 0xd270a05e00000000, 0xb7171ce600000000, 0x59b8a9f400000000, + 0x3cdf154c00000000, 0x85e7c2d100000000, 0xe0807e6900000000, + 0x0e2fcb7b00000000, 0x6b4877c300000000, 0xa20f0dcb00000000, + 0xc768b17300000000, 0x29c7046100000000, 0x4ca0b8d900000000, + 0xf5986f4400000000, 0x90ffd3fc00000000, 0x7e5066ee00000000, + 0x1b37da5600000000, 0x4d27b90e00000000, 0x284005b600000000, + 0xc6efb0a400000000, 0xa3880c1c00000000, 0x1ab0db8100000000, + 0x7fd7673900000000, 0x9178d22b00000000, 0xf41f6e9300000000, + 0x03f7263b00000000, 0x66909a8300000000, 0x883f2f9100000000, + 0xed58932900000000, 0x546044b400000000, 0x3107f80c00000000, + 0xdfa84d1e00000000, 0xbacff1a600000000, 0xecdf92fe00000000, + 0x89b82e4600000000, 0x67179b5400000000, 0x027027ec00000000, + 0xbb48f07100000000, 0xde2f4cc900000000, 0x3080f9db00000000, + 0x55e7456300000000, 0x9ca03f6b00000000, 0xf9c783d300000000, + 0x176836c100000000, 0x720f8a7900000000, 0xcb375de400000000, + 0xae50e15c00000000, 0x40ff544e00000000, 0x2598e8f600000000, + 0x73888bae00000000, 0x16ef371600000000, 0xf840820400000000, + 0x9d273ebc00000000, 0x241fe92100000000, 0x4178559900000000, + 0xafd7e08b00000000, 0xcab05c3300000000, 0x3bb659ed00000000, + 0x5ed1e55500000000, 0xb07e504700000000, 0xd519ecff00000000, + 0x6c213b6200000000, 0x094687da00000000, 0xe7e932c800000000, + 0x828e8e7000000000, 0xd49eed2800000000, 0xb1f9519000000000, + 0x5f56e48200000000, 0x3a31583a00000000, 0x83098fa700000000, + 0xe66e331f00000000, 0x08c1860d00000000, 0x6da63ab500000000, + 0xa4e140bd00000000, 0xc186fc0500000000, 0x2f29491700000000, + 0x4a4ef5af00000000, 0xf376223200000000, 0x96119e8a00000000, + 0x78be2b9800000000, 0x1dd9972000000000, 0x4bc9f47800000000, + 0x2eae48c000000000, 0xc001fdd200000000, 0xa566416a00000000, + 0x1c5e96f700000000, 0x79392a4f00000000, 0x97969f5d00000000, + 0xf2f123e500000000, 0x05196b4d00000000, 0x607ed7f500000000, + 0x8ed162e700000000, 0xebb6de5f00000000, 0x528e09c200000000, + 0x37e9b57a00000000, 0xd946006800000000, 0xbc21bcd000000000, + 0xea31df8800000000, 0x8f56633000000000, 0x61f9d62200000000, + 0x049e6a9a00000000, 0xbda6bd0700000000, 0xd8c101bf00000000, + 0x366eb4ad00000000, 0x5309081500000000, 0x9a4e721d00000000, + 0xff29cea500000000, 0x11867bb700000000, 0x74e1c70f00000000, + 0xcdd9109200000000, 0xa8beac2a00000000, 0x4611193800000000, + 0x2376a58000000000, 0x7566c6d800000000, 0x10017a6000000000, + 0xfeaecf7200000000, 0x9bc973ca00000000, 0x22f1a45700000000, + 0x479618ef00000000, 0xa939adfd00000000, 0xcc5e114500000000, + 0x06ee4d7600000000, 0x6389f1ce00000000, 0x8d2644dc00000000, + 0xe841f86400000000, 0x51792ff900000000, 0x341e934100000000, + 0xdab1265300000000, 0xbfd69aeb00000000, 0xe9c6f9b300000000, + 0x8ca1450b00000000, 0x620ef01900000000, 0x07694ca100000000, + 0xbe519b3c00000000, 0xdb36278400000000, 0x3599929600000000, + 0x50fe2e2e00000000, 0x99b9542600000000, 0xfcdee89e00000000, + 0x12715d8c00000000, 0x7716e13400000000, 0xce2e36a900000000, + 0xab498a1100000000, 0x45e63f0300000000, 0x208183bb00000000, + 0x7691e0e300000000, 0x13f65c5b00000000, 0xfd59e94900000000, + 0x983e55f100000000, 0x2106826c00000000, 0x44613ed400000000, + 0xaace8bc600000000, 0xcfa9377e00000000, 0x38417fd600000000, + 0x5d26c36e00000000, 0xb389767c00000000, 0xd6eecac400000000, + 0x6fd61d5900000000, 0x0ab1a1e100000000, 0xe41e14f300000000, + 0x8179a84b00000000, 0xd769cb1300000000, 0xb20e77ab00000000, + 0x5ca1c2b900000000, 0x39c67e0100000000, 0x80fea99c00000000, + 0xe599152400000000, 0x0b36a03600000000, 0x6e511c8e00000000, + 0xa716668600000000, 0xc271da3e00000000, 0x2cde6f2c00000000, + 0x49b9d39400000000, 0xf081040900000000, 0x95e6b8b100000000, + 0x7b490da300000000, 0x1e2eb11b00000000, 0x483ed24300000000, + 0x2d596efb00000000, 0xc3f6dbe900000000, 0xa691675100000000, + 0x1fa9b0cc00000000, 0x7ace0c7400000000, 0x9461b96600000000, + 0xf10605de00000000}, + {0x0000000000000000, 0xb029603d00000000, 0x6053c07a00000000, + 0xd07aa04700000000, 0xc0a680f500000000, 0x708fe0c800000000, + 0xa0f5408f00000000, 0x10dc20b200000000, 0xc14b703000000000, + 0x7162100d00000000, 0xa118b04a00000000, 0x1131d07700000000, + 0x01edf0c500000000, 0xb1c490f800000000, 0x61be30bf00000000, + 0xd197508200000000, 0x8297e06000000000, 0x32be805d00000000, + 0xe2c4201a00000000, 0x52ed402700000000, 0x4231609500000000, + 0xf21800a800000000, 0x2262a0ef00000000, 0x924bc0d200000000, + 0x43dc905000000000, 0xf3f5f06d00000000, 0x238f502a00000000, + 0x93a6301700000000, 0x837a10a500000000, 0x3353709800000000, + 0xe329d0df00000000, 0x5300b0e200000000, 0x042fc1c100000000, + 0xb406a1fc00000000, 0x647c01bb00000000, 0xd455618600000000, + 0xc489413400000000, 0x74a0210900000000, 0xa4da814e00000000, + 0x14f3e17300000000, 0xc564b1f100000000, 0x754dd1cc00000000, + 0xa537718b00000000, 0x151e11b600000000, 0x05c2310400000000, + 0xb5eb513900000000, 0x6591f17e00000000, 0xd5b8914300000000, + 0x86b821a100000000, 0x3691419c00000000, 0xe6ebe1db00000000, + 0x56c281e600000000, 0x461ea15400000000, 0xf637c16900000000, + 0x264d612e00000000, 0x9664011300000000, 0x47f3519100000000, + 0xf7da31ac00000000, 0x27a091eb00000000, 0x9789f1d600000000, + 0x8755d16400000000, 0x377cb15900000000, 0xe706111e00000000, + 0x572f712300000000, 0x4958f35800000000, 0xf971936500000000, + 0x290b332200000000, 0x9922531f00000000, 0x89fe73ad00000000, + 0x39d7139000000000, 0xe9adb3d700000000, 0x5984d3ea00000000, + 0x8813836800000000, 0x383ae35500000000, 0xe840431200000000, + 0x5869232f00000000, 0x48b5039d00000000, 0xf89c63a000000000, + 0x28e6c3e700000000, 0x98cfa3da00000000, 0xcbcf133800000000, + 0x7be6730500000000, 0xab9cd34200000000, 0x1bb5b37f00000000, + 0x0b6993cd00000000, 0xbb40f3f000000000, 0x6b3a53b700000000, + 0xdb13338a00000000, 0x0a84630800000000, 0xbaad033500000000, + 0x6ad7a37200000000, 0xdafec34f00000000, 0xca22e3fd00000000, + 0x7a0b83c000000000, 0xaa71238700000000, 0x1a5843ba00000000, + 0x4d77329900000000, 0xfd5e52a400000000, 0x2d24f2e300000000, + 0x9d0d92de00000000, 0x8dd1b26c00000000, 0x3df8d25100000000, + 0xed82721600000000, 0x5dab122b00000000, 0x8c3c42a900000000, + 0x3c15229400000000, 0xec6f82d300000000, 0x5c46e2ee00000000, + 0x4c9ac25c00000000, 0xfcb3a26100000000, 0x2cc9022600000000, + 0x9ce0621b00000000, 0xcfe0d2f900000000, 0x7fc9b2c400000000, + 0xafb3128300000000, 0x1f9a72be00000000, 0x0f46520c00000000, + 0xbf6f323100000000, 0x6f15927600000000, 0xdf3cf24b00000000, + 0x0eaba2c900000000, 0xbe82c2f400000000, 0x6ef862b300000000, + 0xded1028e00000000, 0xce0d223c00000000, 0x7e24420100000000, + 0xae5ee24600000000, 0x1e77827b00000000, 0x92b0e6b100000000, + 0x2299868c00000000, 0xf2e326cb00000000, 0x42ca46f600000000, + 0x5216664400000000, 0xe23f067900000000, 0x3245a63e00000000, + 0x826cc60300000000, 0x53fb968100000000, 0xe3d2f6bc00000000, + 0x33a856fb00000000, 0x838136c600000000, 0x935d167400000000, + 0x2374764900000000, 0xf30ed60e00000000, 0x4327b63300000000, + 0x102706d100000000, 0xa00e66ec00000000, 0x7074c6ab00000000, + 0xc05da69600000000, 0xd081862400000000, 0x60a8e61900000000, + 0xb0d2465e00000000, 0x00fb266300000000, 0xd16c76e100000000, + 0x614516dc00000000, 0xb13fb69b00000000, 0x0116d6a600000000, + 0x11caf61400000000, 0xa1e3962900000000, 0x7199366e00000000, + 0xc1b0565300000000, 0x969f277000000000, 0x26b6474d00000000, + 0xf6cce70a00000000, 0x46e5873700000000, 0x5639a78500000000, + 0xe610c7b800000000, 0x366a67ff00000000, 0x864307c200000000, + 0x57d4574000000000, 0xe7fd377d00000000, 0x3787973a00000000, + 0x87aef70700000000, 0x9772d7b500000000, 0x275bb78800000000, + 0xf72117cf00000000, 0x470877f200000000, 0x1408c71000000000, + 0xa421a72d00000000, 0x745b076a00000000, 0xc472675700000000, + 0xd4ae47e500000000, 0x648727d800000000, 0xb4fd879f00000000, + 0x04d4e7a200000000, 0xd543b72000000000, 0x656ad71d00000000, + 0xb510775a00000000, 0x0539176700000000, 0x15e537d500000000, + 0xa5cc57e800000000, 0x75b6f7af00000000, 0xc59f979200000000, + 0xdbe815e900000000, 0x6bc175d400000000, 0xbbbbd59300000000, + 0x0b92b5ae00000000, 0x1b4e951c00000000, 0xab67f52100000000, + 0x7b1d556600000000, 0xcb34355b00000000, 0x1aa365d900000000, + 0xaa8a05e400000000, 0x7af0a5a300000000, 0xcad9c59e00000000, + 0xda05e52c00000000, 0x6a2c851100000000, 0xba56255600000000, + 0x0a7f456b00000000, 0x597ff58900000000, 0xe95695b400000000, + 0x392c35f300000000, 0x890555ce00000000, 0x99d9757c00000000, + 0x29f0154100000000, 0xf98ab50600000000, 0x49a3d53b00000000, + 0x983485b900000000, 0x281de58400000000, 0xf86745c300000000, + 0x484e25fe00000000, 0x5892054c00000000, 0xe8bb657100000000, + 0x38c1c53600000000, 0x88e8a50b00000000, 0xdfc7d42800000000, + 0x6feeb41500000000, 0xbf94145200000000, 0x0fbd746f00000000, + 0x1f6154dd00000000, 0xaf4834e000000000, 0x7f3294a700000000, + 0xcf1bf49a00000000, 0x1e8ca41800000000, 0xaea5c42500000000, + 0x7edf646200000000, 0xcef6045f00000000, 0xde2a24ed00000000, + 0x6e0344d000000000, 0xbe79e49700000000, 0x0e5084aa00000000, + 0x5d50344800000000, 0xed79547500000000, 0x3d03f43200000000, + 0x8d2a940f00000000, 0x9df6b4bd00000000, 0x2ddfd48000000000, + 0xfda574c700000000, 0x4d8c14fa00000000, 0x9c1b447800000000, + 0x2c32244500000000, 0xfc48840200000000, 0x4c61e43f00000000, + 0x5cbdc48d00000000, 0xec94a4b000000000, 0x3cee04f700000000, + 0x8cc764ca00000000}, + {0x0000000000000000, 0xa5d35ccb00000000, 0x0ba1c84d00000000, + 0xae72948600000000, 0x1642919b00000000, 0xb391cd5000000000, + 0x1de359d600000000, 0xb830051d00000000, 0x6d8253ec00000000, + 0xc8510f2700000000, 0x66239ba100000000, 0xc3f0c76a00000000, + 0x7bc0c27700000000, 0xde139ebc00000000, 0x70610a3a00000000, + 0xd5b256f100000000, 0x9b02d60300000000, 0x3ed18ac800000000, + 0x90a31e4e00000000, 0x3570428500000000, 0x8d40479800000000, + 0x28931b5300000000, 0x86e18fd500000000, 0x2332d31e00000000, + 0xf68085ef00000000, 0x5353d92400000000, 0xfd214da200000000, + 0x58f2116900000000, 0xe0c2147400000000, 0x451148bf00000000, + 0xeb63dc3900000000, 0x4eb080f200000000, 0x3605ac0700000000, + 0x93d6f0cc00000000, 0x3da4644a00000000, 0x9877388100000000, + 0x20473d9c00000000, 0x8594615700000000, 0x2be6f5d100000000, + 0x8e35a91a00000000, 0x5b87ffeb00000000, 0xfe54a32000000000, + 0x502637a600000000, 0xf5f56b6d00000000, 0x4dc56e7000000000, + 0xe81632bb00000000, 0x4664a63d00000000, 0xe3b7faf600000000, + 0xad077a0400000000, 0x08d426cf00000000, 0xa6a6b24900000000, + 0x0375ee8200000000, 0xbb45eb9f00000000, 0x1e96b75400000000, + 0xb0e423d200000000, 0x15377f1900000000, 0xc08529e800000000, + 0x6556752300000000, 0xcb24e1a500000000, 0x6ef7bd6e00000000, + 0xd6c7b87300000000, 0x7314e4b800000000, 0xdd66703e00000000, + 0x78b52cf500000000, 0x6c0a580f00000000, 0xc9d904c400000000, + 0x67ab904200000000, 0xc278cc8900000000, 0x7a48c99400000000, + 0xdf9b955f00000000, 0x71e901d900000000, 0xd43a5d1200000000, + 0x01880be300000000, 0xa45b572800000000, 0x0a29c3ae00000000, + 0xaffa9f6500000000, 0x17ca9a7800000000, 0xb219c6b300000000, + 0x1c6b523500000000, 0xb9b80efe00000000, 0xf7088e0c00000000, + 0x52dbd2c700000000, 0xfca9464100000000, 0x597a1a8a00000000, + 0xe14a1f9700000000, 0x4499435c00000000, 0xeaebd7da00000000, + 0x4f388b1100000000, 0x9a8adde000000000, 0x3f59812b00000000, + 0x912b15ad00000000, 0x34f8496600000000, 0x8cc84c7b00000000, + 0x291b10b000000000, 0x8769843600000000, 0x22bad8fd00000000, + 0x5a0ff40800000000, 0xffdca8c300000000, 0x51ae3c4500000000, + 0xf47d608e00000000, 0x4c4d659300000000, 0xe99e395800000000, + 0x47ecadde00000000, 0xe23ff11500000000, 0x378da7e400000000, + 0x925efb2f00000000, 0x3c2c6fa900000000, 0x99ff336200000000, + 0x21cf367f00000000, 0x841c6ab400000000, 0x2a6efe3200000000, + 0x8fbda2f900000000, 0xc10d220b00000000, 0x64de7ec000000000, + 0xcaacea4600000000, 0x6f7fb68d00000000, 0xd74fb39000000000, + 0x729cef5b00000000, 0xdcee7bdd00000000, 0x793d271600000000, + 0xac8f71e700000000, 0x095c2d2c00000000, 0xa72eb9aa00000000, + 0x02fde56100000000, 0xbacde07c00000000, 0x1f1ebcb700000000, + 0xb16c283100000000, 0x14bf74fa00000000, 0xd814b01e00000000, + 0x7dc7ecd500000000, 0xd3b5785300000000, 0x7666249800000000, + 0xce56218500000000, 0x6b857d4e00000000, 0xc5f7e9c800000000, + 0x6024b50300000000, 0xb596e3f200000000, 0x1045bf3900000000, + 0xbe372bbf00000000, 0x1be4777400000000, 0xa3d4726900000000, + 0x06072ea200000000, 0xa875ba2400000000, 0x0da6e6ef00000000, + 0x4316661d00000000, 0xe6c53ad600000000, 0x48b7ae5000000000, + 0xed64f29b00000000, 0x5554f78600000000, 0xf087ab4d00000000, + 0x5ef53fcb00000000, 0xfb26630000000000, 0x2e9435f100000000, + 0x8b47693a00000000, 0x2535fdbc00000000, 0x80e6a17700000000, + 0x38d6a46a00000000, 0x9d05f8a100000000, 0x33776c2700000000, + 0x96a430ec00000000, 0xee111c1900000000, 0x4bc240d200000000, + 0xe5b0d45400000000, 0x4063889f00000000, 0xf8538d8200000000, + 0x5d80d14900000000, 0xf3f245cf00000000, 0x5621190400000000, + 0x83934ff500000000, 0x2640133e00000000, 0x883287b800000000, + 0x2de1db7300000000, 0x95d1de6e00000000, 0x300282a500000000, + 0x9e70162300000000, 0x3ba34ae800000000, 0x7513ca1a00000000, + 0xd0c096d100000000, 0x7eb2025700000000, 0xdb615e9c00000000, + 0x63515b8100000000, 0xc682074a00000000, 0x68f093cc00000000, + 0xcd23cf0700000000, 0x189199f600000000, 0xbd42c53d00000000, + 0x133051bb00000000, 0xb6e30d7000000000, 0x0ed3086d00000000, + 0xab0054a600000000, 0x0572c02000000000, 0xa0a19ceb00000000, + 0xb41ee81100000000, 0x11cdb4da00000000, 0xbfbf205c00000000, + 0x1a6c7c9700000000, 0xa25c798a00000000, 0x078f254100000000, + 0xa9fdb1c700000000, 0x0c2eed0c00000000, 0xd99cbbfd00000000, + 0x7c4fe73600000000, 0xd23d73b000000000, 0x77ee2f7b00000000, + 0xcfde2a6600000000, 0x6a0d76ad00000000, 0xc47fe22b00000000, + 0x61acbee000000000, 0x2f1c3e1200000000, 0x8acf62d900000000, + 0x24bdf65f00000000, 0x816eaa9400000000, 0x395eaf8900000000, + 0x9c8df34200000000, 0x32ff67c400000000, 0x972c3b0f00000000, + 0x429e6dfe00000000, 0xe74d313500000000, 0x493fa5b300000000, + 0xececf97800000000, 0x54dcfc6500000000, 0xf10fa0ae00000000, + 0x5f7d342800000000, 0xfaae68e300000000, 0x821b441600000000, + 0x27c818dd00000000, 0x89ba8c5b00000000, 0x2c69d09000000000, + 0x9459d58d00000000, 0x318a894600000000, 0x9ff81dc000000000, + 0x3a2b410b00000000, 0xef9917fa00000000, 0x4a4a4b3100000000, + 0xe438dfb700000000, 0x41eb837c00000000, 0xf9db866100000000, + 0x5c08daaa00000000, 0xf27a4e2c00000000, 0x57a912e700000000, + 0x1919921500000000, 0xbccacede00000000, 0x12b85a5800000000, + 0xb76b069300000000, 0x0f5b038e00000000, 0xaa885f4500000000, + 0x04facbc300000000, 0xa129970800000000, 0x749bc1f900000000, + 0xd1489d3200000000, 0x7f3a09b400000000, 0xdae9557f00000000, + 0x62d9506200000000, 0xc70a0ca900000000, 0x6978982f00000000, + 0xccabc4e400000000}, + {0x0000000000000000, 0xb40b77a600000000, 0x29119f9700000000, + 0x9d1ae83100000000, 0x13244ff400000000, 0xa72f385200000000, + 0x3a35d06300000000, 0x8e3ea7c500000000, 0x674eef3300000000, + 0xd345989500000000, 0x4e5f70a400000000, 0xfa54070200000000, + 0x746aa0c700000000, 0xc061d76100000000, 0x5d7b3f5000000000, + 0xe97048f600000000, 0xce9cde6700000000, 0x7a97a9c100000000, + 0xe78d41f000000000, 0x5386365600000000, 0xddb8919300000000, + 0x69b3e63500000000, 0xf4a90e0400000000, 0x40a279a200000000, + 0xa9d2315400000000, 0x1dd946f200000000, 0x80c3aec300000000, + 0x34c8d96500000000, 0xbaf67ea000000000, 0x0efd090600000000, + 0x93e7e13700000000, 0x27ec969100000000, 0x9c39bdcf00000000, + 0x2832ca6900000000, 0xb528225800000000, 0x012355fe00000000, + 0x8f1df23b00000000, 0x3b16859d00000000, 0xa60c6dac00000000, + 0x12071a0a00000000, 0xfb7752fc00000000, 0x4f7c255a00000000, + 0xd266cd6b00000000, 0x666dbacd00000000, 0xe8531d0800000000, + 0x5c586aae00000000, 0xc142829f00000000, 0x7549f53900000000, + 0x52a563a800000000, 0xe6ae140e00000000, 0x7bb4fc3f00000000, + 0xcfbf8b9900000000, 0x41812c5c00000000, 0xf58a5bfa00000000, + 0x6890b3cb00000000, 0xdc9bc46d00000000, 0x35eb8c9b00000000, + 0x81e0fb3d00000000, 0x1cfa130c00000000, 0xa8f164aa00000000, + 0x26cfc36f00000000, 0x92c4b4c900000000, 0x0fde5cf800000000, + 0xbbd52b5e00000000, 0x79750b4400000000, 0xcd7e7ce200000000, + 0x506494d300000000, 0xe46fe37500000000, 0x6a5144b000000000, + 0xde5a331600000000, 0x4340db2700000000, 0xf74bac8100000000, + 0x1e3be47700000000, 0xaa3093d100000000, 0x372a7be000000000, + 0x83210c4600000000, 0x0d1fab8300000000, 0xb914dc2500000000, + 0x240e341400000000, 0x900543b200000000, 0xb7e9d52300000000, + 0x03e2a28500000000, 0x9ef84ab400000000, 0x2af33d1200000000, + 0xa4cd9ad700000000, 0x10c6ed7100000000, 0x8ddc054000000000, + 0x39d772e600000000, 0xd0a73a1000000000, 0x64ac4db600000000, + 0xf9b6a58700000000, 0x4dbdd22100000000, 0xc38375e400000000, + 0x7788024200000000, 0xea92ea7300000000, 0x5e999dd500000000, + 0xe54cb68b00000000, 0x5147c12d00000000, 0xcc5d291c00000000, + 0x78565eba00000000, 0xf668f97f00000000, 0x42638ed900000000, + 0xdf7966e800000000, 0x6b72114e00000000, 0x820259b800000000, + 0x36092e1e00000000, 0xab13c62f00000000, 0x1f18b18900000000, + 0x9126164c00000000, 0x252d61ea00000000, 0xb83789db00000000, + 0x0c3cfe7d00000000, 0x2bd068ec00000000, 0x9fdb1f4a00000000, + 0x02c1f77b00000000, 0xb6ca80dd00000000, 0x38f4271800000000, + 0x8cff50be00000000, 0x11e5b88f00000000, 0xa5eecf2900000000, + 0x4c9e87df00000000, 0xf895f07900000000, 0x658f184800000000, + 0xd1846fee00000000, 0x5fbac82b00000000, 0xebb1bf8d00000000, + 0x76ab57bc00000000, 0xc2a0201a00000000, 0xf2ea168800000000, + 0x46e1612e00000000, 0xdbfb891f00000000, 0x6ff0feb900000000, + 0xe1ce597c00000000, 0x55c52eda00000000, 0xc8dfc6eb00000000, + 0x7cd4b14d00000000, 0x95a4f9bb00000000, 0x21af8e1d00000000, + 0xbcb5662c00000000, 0x08be118a00000000, 0x8680b64f00000000, + 0x328bc1e900000000, 0xaf9129d800000000, 0x1b9a5e7e00000000, + 0x3c76c8ef00000000, 0x887dbf4900000000, 0x1567577800000000, + 0xa16c20de00000000, 0x2f52871b00000000, 0x9b59f0bd00000000, + 0x0643188c00000000, 0xb2486f2a00000000, 0x5b3827dc00000000, + 0xef33507a00000000, 0x7229b84b00000000, 0xc622cfed00000000, + 0x481c682800000000, 0xfc171f8e00000000, 0x610df7bf00000000, + 0xd506801900000000, 0x6ed3ab4700000000, 0xdad8dce100000000, + 0x47c234d000000000, 0xf3c9437600000000, 0x7df7e4b300000000, + 0xc9fc931500000000, 0x54e67b2400000000, 0xe0ed0c8200000000, + 0x099d447400000000, 0xbd9633d200000000, 0x208cdbe300000000, + 0x9487ac4500000000, 0x1ab90b8000000000, 0xaeb27c2600000000, + 0x33a8941700000000, 0x87a3e3b100000000, 0xa04f752000000000, + 0x1444028600000000, 0x895eeab700000000, 0x3d559d1100000000, + 0xb36b3ad400000000, 0x07604d7200000000, 0x9a7aa54300000000, + 0x2e71d2e500000000, 0xc7019a1300000000, 0x730aedb500000000, + 0xee10058400000000, 0x5a1b722200000000, 0xd425d5e700000000, + 0x602ea24100000000, 0xfd344a7000000000, 0x493f3dd600000000, + 0x8b9f1dcc00000000, 0x3f946a6a00000000, 0xa28e825b00000000, + 0x1685f5fd00000000, 0x98bb523800000000, 0x2cb0259e00000000, + 0xb1aacdaf00000000, 0x05a1ba0900000000, 0xecd1f2ff00000000, + 0x58da855900000000, 0xc5c06d6800000000, 0x71cb1ace00000000, + 0xfff5bd0b00000000, 0x4bfecaad00000000, 0xd6e4229c00000000, + 0x62ef553a00000000, 0x4503c3ab00000000, 0xf108b40d00000000, + 0x6c125c3c00000000, 0xd8192b9a00000000, 0x56278c5f00000000, + 0xe22cfbf900000000, 0x7f3613c800000000, 0xcb3d646e00000000, + 0x224d2c9800000000, 0x96465b3e00000000, 0x0b5cb30f00000000, + 0xbf57c4a900000000, 0x3169636c00000000, 0x856214ca00000000, + 0x1878fcfb00000000, 0xac738b5d00000000, 0x17a6a00300000000, + 0xa3add7a500000000, 0x3eb73f9400000000, 0x8abc483200000000, + 0x0482eff700000000, 0xb089985100000000, 0x2d93706000000000, + 0x999807c600000000, 0x70e84f3000000000, 0xc4e3389600000000, + 0x59f9d0a700000000, 0xedf2a70100000000, 0x63cc00c400000000, + 0xd7c7776200000000, 0x4add9f5300000000, 0xfed6e8f500000000, + 0xd93a7e6400000000, 0x6d3109c200000000, 0xf02be1f300000000, + 0x4420965500000000, 0xca1e319000000000, 0x7e15463600000000, + 0xe30fae0700000000, 0x5704d9a100000000, 0xbe74915700000000, + 0x0a7fe6f100000000, 0x97650ec000000000, 0x236e796600000000, + 0xad50dea300000000, 0x195ba90500000000, 0x8441413400000000, + 0x304a369200000000}, + {0x0000000000000000, 0x9e00aacc00000000, 0x7d07254200000000, + 0xe3078f8e00000000, 0xfa0e4a8400000000, 0x640ee04800000000, + 0x87096fc600000000, 0x1909c50a00000000, 0xb51be5d300000000, + 0x2b1b4f1f00000000, 0xc81cc09100000000, 0x561c6a5d00000000, + 0x4f15af5700000000, 0xd115059b00000000, 0x32128a1500000000, + 0xac1220d900000000, 0x2b31bb7c00000000, 0xb53111b000000000, + 0x56369e3e00000000, 0xc83634f200000000, 0xd13ff1f800000000, + 0x4f3f5b3400000000, 0xac38d4ba00000000, 0x32387e7600000000, + 0x9e2a5eaf00000000, 0x002af46300000000, 0xe32d7bed00000000, + 0x7d2dd12100000000, 0x6424142b00000000, 0xfa24bee700000000, + 0x1923316900000000, 0x87239ba500000000, 0x566276f900000000, + 0xc862dc3500000000, 0x2b6553bb00000000, 0xb565f97700000000, + 0xac6c3c7d00000000, 0x326c96b100000000, 0xd16b193f00000000, + 0x4f6bb3f300000000, 0xe379932a00000000, 0x7d7939e600000000, + 0x9e7eb66800000000, 0x007e1ca400000000, 0x1977d9ae00000000, + 0x8777736200000000, 0x6470fcec00000000, 0xfa70562000000000, + 0x7d53cd8500000000, 0xe353674900000000, 0x0054e8c700000000, + 0x9e54420b00000000, 0x875d870100000000, 0x195d2dcd00000000, + 0xfa5aa24300000000, 0x645a088f00000000, 0xc848285600000000, + 0x5648829a00000000, 0xb54f0d1400000000, 0x2b4fa7d800000000, + 0x324662d200000000, 0xac46c81e00000000, 0x4f41479000000000, + 0xd141ed5c00000000, 0xedc29d2900000000, 0x73c237e500000000, + 0x90c5b86b00000000, 0x0ec512a700000000, 0x17ccd7ad00000000, + 0x89cc7d6100000000, 0x6acbf2ef00000000, 0xf4cb582300000000, + 0x58d978fa00000000, 0xc6d9d23600000000, 0x25de5db800000000, + 0xbbdef77400000000, 0xa2d7327e00000000, 0x3cd798b200000000, + 0xdfd0173c00000000, 0x41d0bdf000000000, 0xc6f3265500000000, + 0x58f38c9900000000, 0xbbf4031700000000, 0x25f4a9db00000000, + 0x3cfd6cd100000000, 0xa2fdc61d00000000, 0x41fa499300000000, + 0xdffae35f00000000, 0x73e8c38600000000, 0xede8694a00000000, + 0x0eefe6c400000000, 0x90ef4c0800000000, 0x89e6890200000000, + 0x17e623ce00000000, 0xf4e1ac4000000000, 0x6ae1068c00000000, + 0xbba0ebd000000000, 0x25a0411c00000000, 0xc6a7ce9200000000, + 0x58a7645e00000000, 0x41aea15400000000, 0xdfae0b9800000000, + 0x3ca9841600000000, 0xa2a92eda00000000, 0x0ebb0e0300000000, + 0x90bba4cf00000000, 0x73bc2b4100000000, 0xedbc818d00000000, + 0xf4b5448700000000, 0x6ab5ee4b00000000, 0x89b261c500000000, + 0x17b2cb0900000000, 0x909150ac00000000, 0x0e91fa6000000000, + 0xed9675ee00000000, 0x7396df2200000000, 0x6a9f1a2800000000, + 0xf49fb0e400000000, 0x17983f6a00000000, 0x899895a600000000, + 0x258ab57f00000000, 0xbb8a1fb300000000, 0x588d903d00000000, + 0xc68d3af100000000, 0xdf84fffb00000000, 0x4184553700000000, + 0xa283dab900000000, 0x3c83707500000000, 0xda853b5300000000, + 0x4485919f00000000, 0xa7821e1100000000, 0x3982b4dd00000000, + 0x208b71d700000000, 0xbe8bdb1b00000000, 0x5d8c549500000000, + 0xc38cfe5900000000, 0x6f9ede8000000000, 0xf19e744c00000000, + 0x1299fbc200000000, 0x8c99510e00000000, 0x9590940400000000, + 0x0b903ec800000000, 0xe897b14600000000, 0x76971b8a00000000, + 0xf1b4802f00000000, 0x6fb42ae300000000, 0x8cb3a56d00000000, + 0x12b30fa100000000, 0x0bbacaab00000000, 0x95ba606700000000, + 0x76bdefe900000000, 0xe8bd452500000000, 0x44af65fc00000000, + 0xdaafcf3000000000, 0x39a840be00000000, 0xa7a8ea7200000000, + 0xbea12f7800000000, 0x20a185b400000000, 0xc3a60a3a00000000, + 0x5da6a0f600000000, 0x8ce74daa00000000, 0x12e7e76600000000, + 0xf1e068e800000000, 0x6fe0c22400000000, 0x76e9072e00000000, + 0xe8e9ade200000000, 0x0bee226c00000000, 0x95ee88a000000000, + 0x39fca87900000000, 0xa7fc02b500000000, 0x44fb8d3b00000000, + 0xdafb27f700000000, 0xc3f2e2fd00000000, 0x5df2483100000000, + 0xbef5c7bf00000000, 0x20f56d7300000000, 0xa7d6f6d600000000, + 0x39d65c1a00000000, 0xdad1d39400000000, 0x44d1795800000000, + 0x5dd8bc5200000000, 0xc3d8169e00000000, 0x20df991000000000, + 0xbedf33dc00000000, 0x12cd130500000000, 0x8ccdb9c900000000, + 0x6fca364700000000, 0xf1ca9c8b00000000, 0xe8c3598100000000, + 0x76c3f34d00000000, 0x95c47cc300000000, 0x0bc4d60f00000000, + 0x3747a67a00000000, 0xa9470cb600000000, 0x4a40833800000000, + 0xd44029f400000000, 0xcd49ecfe00000000, 0x5349463200000000, + 0xb04ec9bc00000000, 0x2e4e637000000000, 0x825c43a900000000, + 0x1c5ce96500000000, 0xff5b66eb00000000, 0x615bcc2700000000, + 0x7852092d00000000, 0xe652a3e100000000, 0x05552c6f00000000, + 0x9b5586a300000000, 0x1c761d0600000000, 0x8276b7ca00000000, + 0x6171384400000000, 0xff71928800000000, 0xe678578200000000, + 0x7878fd4e00000000, 0x9b7f72c000000000, 0x057fd80c00000000, + 0xa96df8d500000000, 0x376d521900000000, 0xd46add9700000000, + 0x4a6a775b00000000, 0x5363b25100000000, 0xcd63189d00000000, + 0x2e64971300000000, 0xb0643ddf00000000, 0x6125d08300000000, + 0xff257a4f00000000, 0x1c22f5c100000000, 0x82225f0d00000000, + 0x9b2b9a0700000000, 0x052b30cb00000000, 0xe62cbf4500000000, + 0x782c158900000000, 0xd43e355000000000, 0x4a3e9f9c00000000, + 0xa939101200000000, 0x3739bade00000000, 0x2e307fd400000000, + 0xb030d51800000000, 0x53375a9600000000, 0xcd37f05a00000000, + 0x4a146bff00000000, 0xd414c13300000000, 0x37134ebd00000000, + 0xa913e47100000000, 0xb01a217b00000000, 0x2e1a8bb700000000, + 0xcd1d043900000000, 0x531daef500000000, 0xff0f8e2c00000000, + 0x610f24e000000000, 0x8208ab6e00000000, 0x1c0801a200000000, + 0x0501c4a800000000, 0x9b016e6400000000, 0x7806e1ea00000000, + 0xe6064b2600000000}}; + +#else /* W == 4 */ + +local const z_crc_t FAR crc_braid_table[][256] = { + {0x00000000, 0xb8bc6765, 0xaa09c88b, 0x12b5afee, 0x8f629757, + 0x37def032, 0x256b5fdc, 0x9dd738b9, 0xc5b428ef, 0x7d084f8a, + 0x6fbde064, 0xd7018701, 0x4ad6bfb8, 0xf26ad8dd, 0xe0df7733, + 0x58631056, 0x5019579f, 0xe8a530fa, 0xfa109f14, 0x42acf871, + 0xdf7bc0c8, 0x67c7a7ad, 0x75720843, 0xcdce6f26, 0x95ad7f70, + 0x2d111815, 0x3fa4b7fb, 0x8718d09e, 0x1acfe827, 0xa2738f42, + 0xb0c620ac, 0x087a47c9, 0xa032af3e, 0x188ec85b, 0x0a3b67b5, + 0xb28700d0, 0x2f503869, 0x97ec5f0c, 0x8559f0e2, 0x3de59787, + 0x658687d1, 0xdd3ae0b4, 0xcf8f4f5a, 0x7733283f, 0xeae41086, + 0x525877e3, 0x40edd80d, 0xf851bf68, 0xf02bf8a1, 0x48979fc4, + 0x5a22302a, 0xe29e574f, 0x7f496ff6, 0xc7f50893, 0xd540a77d, + 0x6dfcc018, 0x359fd04e, 0x8d23b72b, 0x9f9618c5, 0x272a7fa0, + 0xbafd4719, 0x0241207c, 0x10f48f92, 0xa848e8f7, 0x9b14583d, + 0x23a83f58, 0x311d90b6, 0x89a1f7d3, 0x1476cf6a, 0xaccaa80f, + 0xbe7f07e1, 0x06c36084, 0x5ea070d2, 0xe61c17b7, 0xf4a9b859, + 0x4c15df3c, 0xd1c2e785, 0x697e80e0, 0x7bcb2f0e, 0xc377486b, + 0xcb0d0fa2, 0x73b168c7, 0x6104c729, 0xd9b8a04c, 0x446f98f5, + 0xfcd3ff90, 0xee66507e, 0x56da371b, 0x0eb9274d, 0xb6054028, + 0xa4b0efc6, 0x1c0c88a3, 0x81dbb01a, 0x3967d77f, 0x2bd27891, + 0x936e1ff4, 0x3b26f703, 0x839a9066, 0x912f3f88, 0x299358ed, + 0xb4446054, 0x0cf80731, 0x1e4da8df, 0xa6f1cfba, 0xfe92dfec, + 0x462eb889, 0x549b1767, 0xec277002, 0x71f048bb, 0xc94c2fde, + 0xdbf98030, 0x6345e755, 0x6b3fa09c, 0xd383c7f9, 0xc1366817, + 0x798a0f72, 0xe45d37cb, 0x5ce150ae, 0x4e54ff40, 0xf6e89825, + 0xae8b8873, 0x1637ef16, 0x048240f8, 0xbc3e279d, 0x21e91f24, + 0x99557841, 0x8be0d7af, 0x335cb0ca, 0xed59b63b, 0x55e5d15e, + 0x47507eb0, 0xffec19d5, 0x623b216c, 0xda874609, 0xc832e9e7, + 0x708e8e82, 0x28ed9ed4, 0x9051f9b1, 0x82e4565f, 0x3a58313a, + 0xa78f0983, 0x1f336ee6, 0x0d86c108, 0xb53aa66d, 0xbd40e1a4, + 0x05fc86c1, 0x1749292f, 0xaff54e4a, 0x322276f3, 0x8a9e1196, + 0x982bbe78, 0x2097d91d, 0x78f4c94b, 0xc048ae2e, 0xd2fd01c0, + 0x6a4166a5, 0xf7965e1c, 0x4f2a3979, 0x5d9f9697, 0xe523f1f2, + 0x4d6b1905, 0xf5d77e60, 0xe762d18e, 0x5fdeb6eb, 0xc2098e52, + 0x7ab5e937, 0x680046d9, 0xd0bc21bc, 0x88df31ea, 0x3063568f, + 0x22d6f961, 0x9a6a9e04, 0x07bda6bd, 0xbf01c1d8, 0xadb46e36, + 0x15080953, 0x1d724e9a, 0xa5ce29ff, 0xb77b8611, 0x0fc7e174, + 0x9210d9cd, 0x2aacbea8, 0x38191146, 0x80a57623, 0xd8c66675, + 0x607a0110, 0x72cfaefe, 0xca73c99b, 0x57a4f122, 0xef189647, + 0xfdad39a9, 0x45115ecc, 0x764dee06, 0xcef18963, 0xdc44268d, + 0x64f841e8, 0xf92f7951, 0x41931e34, 0x5326b1da, 0xeb9ad6bf, + 0xb3f9c6e9, 0x0b45a18c, 0x19f00e62, 0xa14c6907, 0x3c9b51be, + 0x842736db, 0x96929935, 0x2e2efe50, 0x2654b999, 0x9ee8defc, + 0x8c5d7112, 0x34e11677, 0xa9362ece, 0x118a49ab, 0x033fe645, + 0xbb838120, 0xe3e09176, 0x5b5cf613, 0x49e959fd, 0xf1553e98, + 0x6c820621, 0xd43e6144, 0xc68bceaa, 0x7e37a9cf, 0xd67f4138, + 0x6ec3265d, 0x7c7689b3, 0xc4caeed6, 0x591dd66f, 0xe1a1b10a, + 0xf3141ee4, 0x4ba87981, 0x13cb69d7, 0xab770eb2, 0xb9c2a15c, + 0x017ec639, 0x9ca9fe80, 0x241599e5, 0x36a0360b, 0x8e1c516e, + 0x866616a7, 0x3eda71c2, 0x2c6fde2c, 0x94d3b949, 0x090481f0, + 0xb1b8e695, 0xa30d497b, 0x1bb12e1e, 0x43d23e48, 0xfb6e592d, + 0xe9dbf6c3, 0x516791a6, 0xccb0a91f, 0x740cce7a, 0x66b96194, + 0xde0506f1}, + {0x00000000, 0x01c26a37, 0x0384d46e, 0x0246be59, 0x0709a8dc, + 0x06cbc2eb, 0x048d7cb2, 0x054f1685, 0x0e1351b8, 0x0fd13b8f, + 0x0d9785d6, 0x0c55efe1, 0x091af964, 0x08d89353, 0x0a9e2d0a, + 0x0b5c473d, 0x1c26a370, 0x1de4c947, 0x1fa2771e, 0x1e601d29, + 0x1b2f0bac, 0x1aed619b, 0x18abdfc2, 0x1969b5f5, 0x1235f2c8, + 0x13f798ff, 0x11b126a6, 0x10734c91, 0x153c5a14, 0x14fe3023, + 0x16b88e7a, 0x177ae44d, 0x384d46e0, 0x398f2cd7, 0x3bc9928e, + 0x3a0bf8b9, 0x3f44ee3c, 0x3e86840b, 0x3cc03a52, 0x3d025065, + 0x365e1758, 0x379c7d6f, 0x35dac336, 0x3418a901, 0x3157bf84, + 0x3095d5b3, 0x32d36bea, 0x331101dd, 0x246be590, 0x25a98fa7, + 0x27ef31fe, 0x262d5bc9, 0x23624d4c, 0x22a0277b, 0x20e69922, + 0x2124f315, 0x2a78b428, 0x2bbade1f, 0x29fc6046, 0x283e0a71, + 0x2d711cf4, 0x2cb376c3, 0x2ef5c89a, 0x2f37a2ad, 0x709a8dc0, + 0x7158e7f7, 0x731e59ae, 0x72dc3399, 0x7793251c, 0x76514f2b, + 0x7417f172, 0x75d59b45, 0x7e89dc78, 0x7f4bb64f, 0x7d0d0816, + 0x7ccf6221, 0x798074a4, 0x78421e93, 0x7a04a0ca, 0x7bc6cafd, + 0x6cbc2eb0, 0x6d7e4487, 0x6f38fade, 0x6efa90e9, 0x6bb5866c, + 0x6a77ec5b, 0x68315202, 0x69f33835, 0x62af7f08, 0x636d153f, + 0x612bab66, 0x60e9c151, 0x65a6d7d4, 0x6464bde3, 0x662203ba, + 0x67e0698d, 0x48d7cb20, 0x4915a117, 0x4b531f4e, 0x4a917579, + 0x4fde63fc, 0x4e1c09cb, 0x4c5ab792, 0x4d98dda5, 0x46c49a98, + 0x4706f0af, 0x45404ef6, 0x448224c1, 0x41cd3244, 0x400f5873, + 0x4249e62a, 0x438b8c1d, 0x54f16850, 0x55330267, 0x5775bc3e, + 0x56b7d609, 0x53f8c08c, 0x523aaabb, 0x507c14e2, 0x51be7ed5, + 0x5ae239e8, 0x5b2053df, 0x5966ed86, 0x58a487b1, 0x5deb9134, + 0x5c29fb03, 0x5e6f455a, 0x5fad2f6d, 0xe1351b80, 0xe0f771b7, + 0xe2b1cfee, 0xe373a5d9, 0xe63cb35c, 0xe7fed96b, 0xe5b86732, + 0xe47a0d05, 0xef264a38, 0xeee4200f, 0xeca29e56, 0xed60f461, + 0xe82fe2e4, 0xe9ed88d3, 0xebab368a, 0xea695cbd, 0xfd13b8f0, + 0xfcd1d2c7, 0xfe976c9e, 0xff5506a9, 0xfa1a102c, 0xfbd87a1b, + 0xf99ec442, 0xf85cae75, 0xf300e948, 0xf2c2837f, 0xf0843d26, + 0xf1465711, 0xf4094194, 0xf5cb2ba3, 0xf78d95fa, 0xf64fffcd, + 0xd9785d60, 0xd8ba3757, 0xdafc890e, 0xdb3ee339, 0xde71f5bc, + 0xdfb39f8b, 0xddf521d2, 0xdc374be5, 0xd76b0cd8, 0xd6a966ef, + 0xd4efd8b6, 0xd52db281, 0xd062a404, 0xd1a0ce33, 0xd3e6706a, + 0xd2241a5d, 0xc55efe10, 0xc49c9427, 0xc6da2a7e, 0xc7184049, + 0xc25756cc, 0xc3953cfb, 0xc1d382a2, 0xc011e895, 0xcb4dafa8, + 0xca8fc59f, 0xc8c97bc6, 0xc90b11f1, 0xcc440774, 0xcd866d43, + 0xcfc0d31a, 0xce02b92d, 0x91af9640, 0x906dfc77, 0x922b422e, + 0x93e92819, 0x96a63e9c, 0x976454ab, 0x9522eaf2, 0x94e080c5, + 0x9fbcc7f8, 0x9e7eadcf, 0x9c381396, 0x9dfa79a1, 0x98b56f24, + 0x99770513, 0x9b31bb4a, 0x9af3d17d, 0x8d893530, 0x8c4b5f07, + 0x8e0de15e, 0x8fcf8b69, 0x8a809dec, 0x8b42f7db, 0x89044982, + 0x88c623b5, 0x839a6488, 0x82580ebf, 0x801eb0e6, 0x81dcdad1, + 0x8493cc54, 0x8551a663, 0x8717183a, 0x86d5720d, 0xa9e2d0a0, + 0xa820ba97, 0xaa6604ce, 0xaba46ef9, 0xaeeb787c, 0xaf29124b, + 0xad6fac12, 0xacadc625, 0xa7f18118, 0xa633eb2f, 0xa4755576, + 0xa5b73f41, 0xa0f829c4, 0xa13a43f3, 0xa37cfdaa, 0xa2be979d, + 0xb5c473d0, 0xb40619e7, 0xb640a7be, 0xb782cd89, 0xb2cddb0c, + 0xb30fb13b, 0xb1490f62, 0xb08b6555, 0xbbd72268, 0xba15485f, + 0xb853f606, 0xb9919c31, 0xbcde8ab4, 0xbd1ce083, 0xbf5a5eda, + 0xbe9834ed}, + {0x00000000, 0x191b3141, 0x32366282, 0x2b2d53c3, 0x646cc504, + 0x7d77f445, 0x565aa786, 0x4f4196c7, 0xc8d98a08, 0xd1c2bb49, + 0xfaefe88a, 0xe3f4d9cb, 0xacb54f0c, 0xb5ae7e4d, 0x9e832d8e, + 0x87981ccf, 0x4ac21251, 0x53d92310, 0x78f470d3, 0x61ef4192, + 0x2eaed755, 0x37b5e614, 0x1c98b5d7, 0x05838496, 0x821b9859, + 0x9b00a918, 0xb02dfadb, 0xa936cb9a, 0xe6775d5d, 0xff6c6c1c, + 0xd4413fdf, 0xcd5a0e9e, 0x958424a2, 0x8c9f15e3, 0xa7b24620, + 0xbea97761, 0xf1e8e1a6, 0xe8f3d0e7, 0xc3de8324, 0xdac5b265, + 0x5d5daeaa, 0x44469feb, 0x6f6bcc28, 0x7670fd69, 0x39316bae, + 0x202a5aef, 0x0b07092c, 0x121c386d, 0xdf4636f3, 0xc65d07b2, + 0xed705471, 0xf46b6530, 0xbb2af3f7, 0xa231c2b6, 0x891c9175, + 0x9007a034, 0x179fbcfb, 0x0e848dba, 0x25a9de79, 0x3cb2ef38, + 0x73f379ff, 0x6ae848be, 0x41c51b7d, 0x58de2a3c, 0xf0794f05, + 0xe9627e44, 0xc24f2d87, 0xdb541cc6, 0x94158a01, 0x8d0ebb40, + 0xa623e883, 0xbf38d9c2, 0x38a0c50d, 0x21bbf44c, 0x0a96a78f, + 0x138d96ce, 0x5ccc0009, 0x45d73148, 0x6efa628b, 0x77e153ca, + 0xbabb5d54, 0xa3a06c15, 0x888d3fd6, 0x91960e97, 0xded79850, + 0xc7cca911, 0xece1fad2, 0xf5facb93, 0x7262d75c, 0x6b79e61d, + 0x4054b5de, 0x594f849f, 0x160e1258, 0x0f152319, 0x243870da, + 0x3d23419b, 0x65fd6ba7, 0x7ce65ae6, 0x57cb0925, 0x4ed03864, + 0x0191aea3, 0x188a9fe2, 0x33a7cc21, 0x2abcfd60, 0xad24e1af, + 0xb43fd0ee, 0x9f12832d, 0x8609b26c, 0xc94824ab, 0xd05315ea, + 0xfb7e4629, 0xe2657768, 0x2f3f79f6, 0x362448b7, 0x1d091b74, + 0x04122a35, 0x4b53bcf2, 0x52488db3, 0x7965de70, 0x607eef31, + 0xe7e6f3fe, 0xfefdc2bf, 0xd5d0917c, 0xcccba03d, 0x838a36fa, + 0x9a9107bb, 0xb1bc5478, 0xa8a76539, 0x3b83984b, 0x2298a90a, + 0x09b5fac9, 0x10aecb88, 0x5fef5d4f, 0x46f46c0e, 0x6dd93fcd, + 0x74c20e8c, 0xf35a1243, 0xea412302, 0xc16c70c1, 0xd8774180, + 0x9736d747, 0x8e2de606, 0xa500b5c5, 0xbc1b8484, 0x71418a1a, + 0x685abb5b, 0x4377e898, 0x5a6cd9d9, 0x152d4f1e, 0x0c367e5f, + 0x271b2d9c, 0x3e001cdd, 0xb9980012, 0xa0833153, 0x8bae6290, + 0x92b553d1, 0xddf4c516, 0xc4eff457, 0xefc2a794, 0xf6d996d5, + 0xae07bce9, 0xb71c8da8, 0x9c31de6b, 0x852aef2a, 0xca6b79ed, + 0xd37048ac, 0xf85d1b6f, 0xe1462a2e, 0x66de36e1, 0x7fc507a0, + 0x54e85463, 0x4df36522, 0x02b2f3e5, 0x1ba9c2a4, 0x30849167, + 0x299fa026, 0xe4c5aeb8, 0xfdde9ff9, 0xd6f3cc3a, 0xcfe8fd7b, + 0x80a96bbc, 0x99b25afd, 0xb29f093e, 0xab84387f, 0x2c1c24b0, + 0x350715f1, 0x1e2a4632, 0x07317773, 0x4870e1b4, 0x516bd0f5, + 0x7a468336, 0x635db277, 0xcbfad74e, 0xd2e1e60f, 0xf9ccb5cc, + 0xe0d7848d, 0xaf96124a, 0xb68d230b, 0x9da070c8, 0x84bb4189, + 0x03235d46, 0x1a386c07, 0x31153fc4, 0x280e0e85, 0x674f9842, + 0x7e54a903, 0x5579fac0, 0x4c62cb81, 0x8138c51f, 0x9823f45e, + 0xb30ea79d, 0xaa1596dc, 0xe554001b, 0xfc4f315a, 0xd7626299, + 0xce7953d8, 0x49e14f17, 0x50fa7e56, 0x7bd72d95, 0x62cc1cd4, + 0x2d8d8a13, 0x3496bb52, 0x1fbbe891, 0x06a0d9d0, 0x5e7ef3ec, + 0x4765c2ad, 0x6c48916e, 0x7553a02f, 0x3a1236e8, 0x230907a9, + 0x0824546a, 0x113f652b, 0x96a779e4, 0x8fbc48a5, 0xa4911b66, + 0xbd8a2a27, 0xf2cbbce0, 0xebd08da1, 0xc0fdde62, 0xd9e6ef23, + 0x14bce1bd, 0x0da7d0fc, 0x268a833f, 0x3f91b27e, 0x70d024b9, + 0x69cb15f8, 0x42e6463b, 0x5bfd777a, 0xdc656bb5, 0xc57e5af4, + 0xee530937, 0xf7483876, 0xb809aeb1, 0xa1129ff0, 0x8a3fcc33, + 0x9324fd72}, + {0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, + 0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, + 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, + 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, + 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856, + 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, + 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, + 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, + 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, + 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a, + 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, + 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, + 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, + 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, + 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e, + 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, + 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, + 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, + 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, + 0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, + 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, + 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, + 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010, + 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, + 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, + 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, + 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615, + 0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, + 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344, + 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, + 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, + 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, + 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, + 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c, + 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, + 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, + 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, + 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, + 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c, + 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, + 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, + 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, + 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, + 0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, + 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278, + 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, + 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66, + 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, + 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, + 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, + 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, + 0x2d02ef8d}}; + +local const z_word_t FAR crc_braid_big_table[][256] = { + {0x00000000, 0x96300777, 0x2c610eee, 0xba510999, 0x19c46d07, + 0x8ff46a70, 0x35a563e9, 0xa395649e, 0x3288db0e, 0xa4b8dc79, + 0x1ee9d5e0, 0x88d9d297, 0x2b4cb609, 0xbd7cb17e, 0x072db8e7, + 0x911dbf90, 0x6410b71d, 0xf220b06a, 0x4871b9f3, 0xde41be84, + 0x7dd4da1a, 0xebe4dd6d, 0x51b5d4f4, 0xc785d383, 0x56986c13, + 0xc0a86b64, 0x7af962fd, 0xecc9658a, 0x4f5c0114, 0xd96c0663, + 0x633d0ffa, 0xf50d088d, 0xc8206e3b, 0x5e10694c, 0xe44160d5, + 0x727167a2, 0xd1e4033c, 0x47d4044b, 0xfd850dd2, 0x6bb50aa5, + 0xfaa8b535, 0x6c98b242, 0xd6c9bbdb, 0x40f9bcac, 0xe36cd832, + 0x755cdf45, 0xcf0dd6dc, 0x593dd1ab, 0xac30d926, 0x3a00de51, + 0x8051d7c8, 0x1661d0bf, 0xb5f4b421, 0x23c4b356, 0x9995bacf, + 0x0fa5bdb8, 0x9eb80228, 0x0888055f, 0xb2d90cc6, 0x24e90bb1, + 0x877c6f2f, 0x114c6858, 0xab1d61c1, 0x3d2d66b6, 0x9041dc76, + 0x0671db01, 0xbc20d298, 0x2a10d5ef, 0x8985b171, 0x1fb5b606, + 0xa5e4bf9f, 0x33d4b8e8, 0xa2c90778, 0x34f9000f, 0x8ea80996, + 0x18980ee1, 0xbb0d6a7f, 0x2d3d6d08, 0x976c6491, 0x015c63e6, + 0xf4516b6b, 0x62616c1c, 0xd8306585, 0x4e0062f2, 0xed95066c, + 0x7ba5011b, 0xc1f40882, 0x57c40ff5, 0xc6d9b065, 0x50e9b712, + 0xeab8be8b, 0x7c88b9fc, 0xdf1ddd62, 0x492dda15, 0xf37cd38c, + 0x654cd4fb, 0x5861b24d, 0xce51b53a, 0x7400bca3, 0xe230bbd4, + 0x41a5df4a, 0xd795d83d, 0x6dc4d1a4, 0xfbf4d6d3, 0x6ae96943, + 0xfcd96e34, 0x468867ad, 0xd0b860da, 0x732d0444, 0xe51d0333, + 0x5f4c0aaa, 0xc97c0ddd, 0x3c710550, 0xaa410227, 0x10100bbe, + 0x86200cc9, 0x25b56857, 0xb3856f20, 0x09d466b9, 0x9fe461ce, + 0x0ef9de5e, 0x98c9d929, 0x2298d0b0, 0xb4a8d7c7, 0x173db359, + 0x810db42e, 0x3b5cbdb7, 0xad6cbac0, 0x2083b8ed, 0xb6b3bf9a, + 0x0ce2b603, 0x9ad2b174, 0x3947d5ea, 0xaf77d29d, 0x1526db04, + 0x8316dc73, 0x120b63e3, 0x843b6494, 0x3e6a6d0d, 0xa85a6a7a, + 0x0bcf0ee4, 0x9dff0993, 0x27ae000a, 0xb19e077d, 0x44930ff0, + 0xd2a30887, 0x68f2011e, 0xfec20669, 0x5d5762f7, 0xcb676580, + 0x71366c19, 0xe7066b6e, 0x761bd4fe, 0xe02bd389, 0x5a7ada10, + 0xcc4add67, 0x6fdfb9f9, 0xf9efbe8e, 0x43beb717, 0xd58eb060, + 0xe8a3d6d6, 0x7e93d1a1, 0xc4c2d838, 0x52f2df4f, 0xf167bbd1, + 0x6757bca6, 0xdd06b53f, 0x4b36b248, 0xda2b0dd8, 0x4c1b0aaf, + 0xf64a0336, 0x607a0441, 0xc3ef60df, 0x55df67a8, 0xef8e6e31, + 0x79be6946, 0x8cb361cb, 0x1a8366bc, 0xa0d26f25, 0x36e26852, + 0x95770ccc, 0x03470bbb, 0xb9160222, 0x2f260555, 0xbe3bbac5, + 0x280bbdb2, 0x925ab42b, 0x046ab35c, 0xa7ffd7c2, 0x31cfd0b5, + 0x8b9ed92c, 0x1daede5b, 0xb0c2649b, 0x26f263ec, 0x9ca36a75, + 0x0a936d02, 0xa906099c, 0x3f360eeb, 0x85670772, 0x13570005, + 0x824abf95, 0x147ab8e2, 0xae2bb17b, 0x381bb60c, 0x9b8ed292, + 0x0dbed5e5, 0xb7efdc7c, 0x21dfdb0b, 0xd4d2d386, 0x42e2d4f1, + 0xf8b3dd68, 0x6e83da1f, 0xcd16be81, 0x5b26b9f6, 0xe177b06f, + 0x7747b718, 0xe65a0888, 0x706a0fff, 0xca3b0666, 0x5c0b0111, + 0xff9e658f, 0x69ae62f8, 0xd3ff6b61, 0x45cf6c16, 0x78e20aa0, + 0xeed20dd7, 0x5483044e, 0xc2b30339, 0x612667a7, 0xf71660d0, + 0x4d476949, 0xdb776e3e, 0x4a6ad1ae, 0xdc5ad6d9, 0x660bdf40, + 0xf03bd837, 0x53aebca9, 0xc59ebbde, 0x7fcfb247, 0xe9ffb530, + 0x1cf2bdbd, 0x8ac2baca, 0x3093b353, 0xa6a3b424, 0x0536d0ba, + 0x9306d7cd, 0x2957de54, 0xbf67d923, 0x2e7a66b3, 0xb84a61c4, + 0x021b685d, 0x942b6f2a, 0x37be0bb4, 0xa18e0cc3, 0x1bdf055a, + 0x8def022d}, + {0x00000000, 0x41311b19, 0x82623632, 0xc3532d2b, 0x04c56c64, + 0x45f4777d, 0x86a75a56, 0xc796414f, 0x088ad9c8, 0x49bbc2d1, + 0x8ae8effa, 0xcbd9f4e3, 0x0c4fb5ac, 0x4d7eaeb5, 0x8e2d839e, + 0xcf1c9887, 0x5112c24a, 0x1023d953, 0xd370f478, 0x9241ef61, + 0x55d7ae2e, 0x14e6b537, 0xd7b5981c, 0x96848305, 0x59981b82, + 0x18a9009b, 0xdbfa2db0, 0x9acb36a9, 0x5d5d77e6, 0x1c6c6cff, + 0xdf3f41d4, 0x9e0e5acd, 0xa2248495, 0xe3159f8c, 0x2046b2a7, + 0x6177a9be, 0xa6e1e8f1, 0xe7d0f3e8, 0x2483dec3, 0x65b2c5da, + 0xaaae5d5d, 0xeb9f4644, 0x28cc6b6f, 0x69fd7076, 0xae6b3139, + 0xef5a2a20, 0x2c09070b, 0x6d381c12, 0xf33646df, 0xb2075dc6, + 0x715470ed, 0x30656bf4, 0xf7f32abb, 0xb6c231a2, 0x75911c89, + 0x34a00790, 0xfbbc9f17, 0xba8d840e, 0x79dea925, 0x38efb23c, + 0xff79f373, 0xbe48e86a, 0x7d1bc541, 0x3c2ade58, 0x054f79f0, + 0x447e62e9, 0x872d4fc2, 0xc61c54db, 0x018a1594, 0x40bb0e8d, + 0x83e823a6, 0xc2d938bf, 0x0dc5a038, 0x4cf4bb21, 0x8fa7960a, + 0xce968d13, 0x0900cc5c, 0x4831d745, 0x8b62fa6e, 0xca53e177, + 0x545dbbba, 0x156ca0a3, 0xd63f8d88, 0x970e9691, 0x5098d7de, + 0x11a9ccc7, 0xd2fae1ec, 0x93cbfaf5, 0x5cd76272, 0x1de6796b, + 0xdeb55440, 0x9f844f59, 0x58120e16, 0x1923150f, 0xda703824, + 0x9b41233d, 0xa76bfd65, 0xe65ae67c, 0x2509cb57, 0x6438d04e, + 0xa3ae9101, 0xe29f8a18, 0x21cca733, 0x60fdbc2a, 0xafe124ad, + 0xeed03fb4, 0x2d83129f, 0x6cb20986, 0xab2448c9, 0xea1553d0, + 0x29467efb, 0x687765e2, 0xf6793f2f, 0xb7482436, 0x741b091d, + 0x352a1204, 0xf2bc534b, 0xb38d4852, 0x70de6579, 0x31ef7e60, + 0xfef3e6e7, 0xbfc2fdfe, 0x7c91d0d5, 0x3da0cbcc, 0xfa368a83, + 0xbb07919a, 0x7854bcb1, 0x3965a7a8, 0x4b98833b, 0x0aa99822, + 0xc9fab509, 0x88cbae10, 0x4f5def5f, 0x0e6cf446, 0xcd3fd96d, + 0x8c0ec274, 0x43125af3, 0x022341ea, 0xc1706cc1, 0x804177d8, + 0x47d73697, 0x06e62d8e, 0xc5b500a5, 0x84841bbc, 0x1a8a4171, + 0x5bbb5a68, 0x98e87743, 0xd9d96c5a, 0x1e4f2d15, 0x5f7e360c, + 0x9c2d1b27, 0xdd1c003e, 0x120098b9, 0x533183a0, 0x9062ae8b, + 0xd153b592, 0x16c5f4dd, 0x57f4efc4, 0x94a7c2ef, 0xd596d9f6, + 0xe9bc07ae, 0xa88d1cb7, 0x6bde319c, 0x2aef2a85, 0xed796bca, + 0xac4870d3, 0x6f1b5df8, 0x2e2a46e1, 0xe136de66, 0xa007c57f, + 0x6354e854, 0x2265f34d, 0xe5f3b202, 0xa4c2a91b, 0x67918430, + 0x26a09f29, 0xb8aec5e4, 0xf99fdefd, 0x3accf3d6, 0x7bfde8cf, + 0xbc6ba980, 0xfd5ab299, 0x3e099fb2, 0x7f3884ab, 0xb0241c2c, + 0xf1150735, 0x32462a1e, 0x73773107, 0xb4e17048, 0xf5d06b51, + 0x3683467a, 0x77b25d63, 0x4ed7facb, 0x0fe6e1d2, 0xccb5ccf9, + 0x8d84d7e0, 0x4a1296af, 0x0b238db6, 0xc870a09d, 0x8941bb84, + 0x465d2303, 0x076c381a, 0xc43f1531, 0x850e0e28, 0x42984f67, + 0x03a9547e, 0xc0fa7955, 0x81cb624c, 0x1fc53881, 0x5ef42398, + 0x9da70eb3, 0xdc9615aa, 0x1b0054e5, 0x5a314ffc, 0x996262d7, + 0xd85379ce, 0x174fe149, 0x567efa50, 0x952dd77b, 0xd41ccc62, + 0x138a8d2d, 0x52bb9634, 0x91e8bb1f, 0xd0d9a006, 0xecf37e5e, + 0xadc26547, 0x6e91486c, 0x2fa05375, 0xe836123a, 0xa9070923, + 0x6a542408, 0x2b653f11, 0xe479a796, 0xa548bc8f, 0x661b91a4, + 0x272a8abd, 0xe0bccbf2, 0xa18dd0eb, 0x62defdc0, 0x23efe6d9, + 0xbde1bc14, 0xfcd0a70d, 0x3f838a26, 0x7eb2913f, 0xb924d070, + 0xf815cb69, 0x3b46e642, 0x7a77fd5b, 0xb56b65dc, 0xf45a7ec5, + 0x370953ee, 0x763848f7, 0xb1ae09b8, 0xf09f12a1, 0x33cc3f8a, + 0x72fd2493}, + {0x00000000, 0x376ac201, 0x6ed48403, 0x59be4602, 0xdca80907, + 0xebc2cb06, 0xb27c8d04, 0x85164f05, 0xb851130e, 0x8f3bd10f, + 0xd685970d, 0xe1ef550c, 0x64f91a09, 0x5393d808, 0x0a2d9e0a, + 0x3d475c0b, 0x70a3261c, 0x47c9e41d, 0x1e77a21f, 0x291d601e, + 0xac0b2f1b, 0x9b61ed1a, 0xc2dfab18, 0xf5b56919, 0xc8f23512, + 0xff98f713, 0xa626b111, 0x914c7310, 0x145a3c15, 0x2330fe14, + 0x7a8eb816, 0x4de47a17, 0xe0464d38, 0xd72c8f39, 0x8e92c93b, + 0xb9f80b3a, 0x3cee443f, 0x0b84863e, 0x523ac03c, 0x6550023d, + 0x58175e36, 0x6f7d9c37, 0x36c3da35, 0x01a91834, 0x84bf5731, + 0xb3d59530, 0xea6bd332, 0xdd011133, 0x90e56b24, 0xa78fa925, + 0xfe31ef27, 0xc95b2d26, 0x4c4d6223, 0x7b27a022, 0x2299e620, + 0x15f32421, 0x28b4782a, 0x1fdeba2b, 0x4660fc29, 0x710a3e28, + 0xf41c712d, 0xc376b32c, 0x9ac8f52e, 0xada2372f, 0xc08d9a70, + 0xf7e75871, 0xae591e73, 0x9933dc72, 0x1c259377, 0x2b4f5176, + 0x72f11774, 0x459bd575, 0x78dc897e, 0x4fb64b7f, 0x16080d7d, + 0x2162cf7c, 0xa4748079, 0x931e4278, 0xcaa0047a, 0xfdcac67b, + 0xb02ebc6c, 0x87447e6d, 0xdefa386f, 0xe990fa6e, 0x6c86b56b, + 0x5bec776a, 0x02523168, 0x3538f369, 0x087faf62, 0x3f156d63, + 0x66ab2b61, 0x51c1e960, 0xd4d7a665, 0xe3bd6464, 0xba032266, + 0x8d69e067, 0x20cbd748, 0x17a11549, 0x4e1f534b, 0x7975914a, + 0xfc63de4f, 0xcb091c4e, 0x92b75a4c, 0xa5dd984d, 0x989ac446, + 0xaff00647, 0xf64e4045, 0xc1248244, 0x4432cd41, 0x73580f40, + 0x2ae64942, 0x1d8c8b43, 0x5068f154, 0x67023355, 0x3ebc7557, + 0x09d6b756, 0x8cc0f853, 0xbbaa3a52, 0xe2147c50, 0xd57ebe51, + 0xe839e25a, 0xdf53205b, 0x86ed6659, 0xb187a458, 0x3491eb5d, + 0x03fb295c, 0x5a456f5e, 0x6d2fad5f, 0x801b35e1, 0xb771f7e0, + 0xeecfb1e2, 0xd9a573e3, 0x5cb33ce6, 0x6bd9fee7, 0x3267b8e5, + 0x050d7ae4, 0x384a26ef, 0x0f20e4ee, 0x569ea2ec, 0x61f460ed, + 0xe4e22fe8, 0xd388ede9, 0x8a36abeb, 0xbd5c69ea, 0xf0b813fd, + 0xc7d2d1fc, 0x9e6c97fe, 0xa90655ff, 0x2c101afa, 0x1b7ad8fb, + 0x42c49ef9, 0x75ae5cf8, 0x48e900f3, 0x7f83c2f2, 0x263d84f0, + 0x115746f1, 0x944109f4, 0xa32bcbf5, 0xfa958df7, 0xcdff4ff6, + 0x605d78d9, 0x5737bad8, 0x0e89fcda, 0x39e33edb, 0xbcf571de, + 0x8b9fb3df, 0xd221f5dd, 0xe54b37dc, 0xd80c6bd7, 0xef66a9d6, + 0xb6d8efd4, 0x81b22dd5, 0x04a462d0, 0x33cea0d1, 0x6a70e6d3, + 0x5d1a24d2, 0x10fe5ec5, 0x27949cc4, 0x7e2adac6, 0x494018c7, + 0xcc5657c2, 0xfb3c95c3, 0xa282d3c1, 0x95e811c0, 0xa8af4dcb, + 0x9fc58fca, 0xc67bc9c8, 0xf1110bc9, 0x740744cc, 0x436d86cd, + 0x1ad3c0cf, 0x2db902ce, 0x4096af91, 0x77fc6d90, 0x2e422b92, + 0x1928e993, 0x9c3ea696, 0xab546497, 0xf2ea2295, 0xc580e094, + 0xf8c7bc9f, 0xcfad7e9e, 0x9613389c, 0xa179fa9d, 0x246fb598, + 0x13057799, 0x4abb319b, 0x7dd1f39a, 0x3035898d, 0x075f4b8c, + 0x5ee10d8e, 0x698bcf8f, 0xec9d808a, 0xdbf7428b, 0x82490489, + 0xb523c688, 0x88649a83, 0xbf0e5882, 0xe6b01e80, 0xd1dadc81, + 0x54cc9384, 0x63a65185, 0x3a181787, 0x0d72d586, 0xa0d0e2a9, + 0x97ba20a8, 0xce0466aa, 0xf96ea4ab, 0x7c78ebae, 0x4b1229af, + 0x12ac6fad, 0x25c6adac, 0x1881f1a7, 0x2feb33a6, 0x765575a4, + 0x413fb7a5, 0xc429f8a0, 0xf3433aa1, 0xaafd7ca3, 0x9d97bea2, + 0xd073c4b5, 0xe71906b4, 0xbea740b6, 0x89cd82b7, 0x0cdbcdb2, + 0x3bb10fb3, 0x620f49b1, 0x55658bb0, 0x6822d7bb, 0x5f4815ba, + 0x06f653b8, 0x319c91b9, 0xb48adebc, 0x83e01cbd, 0xda5e5abf, + 0xed3498be}, + {0x00000000, 0x6567bcb8, 0x8bc809aa, 0xeeafb512, 0x5797628f, + 0x32f0de37, 0xdc5f6b25, 0xb938d79d, 0xef28b4c5, 0x8a4f087d, + 0x64e0bd6f, 0x018701d7, 0xb8bfd64a, 0xddd86af2, 0x3377dfe0, + 0x56106358, 0x9f571950, 0xfa30a5e8, 0x149f10fa, 0x71f8ac42, + 0xc8c07bdf, 0xada7c767, 0x43087275, 0x266fcecd, 0x707fad95, + 0x1518112d, 0xfbb7a43f, 0x9ed01887, 0x27e8cf1a, 0x428f73a2, + 0xac20c6b0, 0xc9477a08, 0x3eaf32a0, 0x5bc88e18, 0xb5673b0a, + 0xd00087b2, 0x6938502f, 0x0c5fec97, 0xe2f05985, 0x8797e53d, + 0xd1878665, 0xb4e03add, 0x5a4f8fcf, 0x3f283377, 0x8610e4ea, + 0xe3775852, 0x0dd8ed40, 0x68bf51f8, 0xa1f82bf0, 0xc49f9748, + 0x2a30225a, 0x4f579ee2, 0xf66f497f, 0x9308f5c7, 0x7da740d5, + 0x18c0fc6d, 0x4ed09f35, 0x2bb7238d, 0xc518969f, 0xa07f2a27, + 0x1947fdba, 0x7c204102, 0x928ff410, 0xf7e848a8, 0x3d58149b, + 0x583fa823, 0xb6901d31, 0xd3f7a189, 0x6acf7614, 0x0fa8caac, + 0xe1077fbe, 0x8460c306, 0xd270a05e, 0xb7171ce6, 0x59b8a9f4, + 0x3cdf154c, 0x85e7c2d1, 0xe0807e69, 0x0e2fcb7b, 0x6b4877c3, + 0xa20f0dcb, 0xc768b173, 0x29c70461, 0x4ca0b8d9, 0xf5986f44, + 0x90ffd3fc, 0x7e5066ee, 0x1b37da56, 0x4d27b90e, 0x284005b6, + 0xc6efb0a4, 0xa3880c1c, 0x1ab0db81, 0x7fd76739, 0x9178d22b, + 0xf41f6e93, 0x03f7263b, 0x66909a83, 0x883f2f91, 0xed589329, + 0x546044b4, 0x3107f80c, 0xdfa84d1e, 0xbacff1a6, 0xecdf92fe, + 0x89b82e46, 0x67179b54, 0x027027ec, 0xbb48f071, 0xde2f4cc9, + 0x3080f9db, 0x55e74563, 0x9ca03f6b, 0xf9c783d3, 0x176836c1, + 0x720f8a79, 0xcb375de4, 0xae50e15c, 0x40ff544e, 0x2598e8f6, + 0x73888bae, 0x16ef3716, 0xf8408204, 0x9d273ebc, 0x241fe921, + 0x41785599, 0xafd7e08b, 0xcab05c33, 0x3bb659ed, 0x5ed1e555, + 0xb07e5047, 0xd519ecff, 0x6c213b62, 0x094687da, 0xe7e932c8, + 0x828e8e70, 0xd49eed28, 0xb1f95190, 0x5f56e482, 0x3a31583a, + 0x83098fa7, 0xe66e331f, 0x08c1860d, 0x6da63ab5, 0xa4e140bd, + 0xc186fc05, 0x2f294917, 0x4a4ef5af, 0xf3762232, 0x96119e8a, + 0x78be2b98, 0x1dd99720, 0x4bc9f478, 0x2eae48c0, 0xc001fdd2, + 0xa566416a, 0x1c5e96f7, 0x79392a4f, 0x97969f5d, 0xf2f123e5, + 0x05196b4d, 0x607ed7f5, 0x8ed162e7, 0xebb6de5f, 0x528e09c2, + 0x37e9b57a, 0xd9460068, 0xbc21bcd0, 0xea31df88, 0x8f566330, + 0x61f9d622, 0x049e6a9a, 0xbda6bd07, 0xd8c101bf, 0x366eb4ad, + 0x53090815, 0x9a4e721d, 0xff29cea5, 0x11867bb7, 0x74e1c70f, + 0xcdd91092, 0xa8beac2a, 0x46111938, 0x2376a580, 0x7566c6d8, + 0x10017a60, 0xfeaecf72, 0x9bc973ca, 0x22f1a457, 0x479618ef, + 0xa939adfd, 0xcc5e1145, 0x06ee4d76, 0x6389f1ce, 0x8d2644dc, + 0xe841f864, 0x51792ff9, 0x341e9341, 0xdab12653, 0xbfd69aeb, + 0xe9c6f9b3, 0x8ca1450b, 0x620ef019, 0x07694ca1, 0xbe519b3c, + 0xdb362784, 0x35999296, 0x50fe2e2e, 0x99b95426, 0xfcdee89e, + 0x12715d8c, 0x7716e134, 0xce2e36a9, 0xab498a11, 0x45e63f03, + 0x208183bb, 0x7691e0e3, 0x13f65c5b, 0xfd59e949, 0x983e55f1, + 0x2106826c, 0x44613ed4, 0xaace8bc6, 0xcfa9377e, 0x38417fd6, + 0x5d26c36e, 0xb389767c, 0xd6eecac4, 0x6fd61d59, 0x0ab1a1e1, + 0xe41e14f3, 0x8179a84b, 0xd769cb13, 0xb20e77ab, 0x5ca1c2b9, + 0x39c67e01, 0x80fea99c, 0xe5991524, 0x0b36a036, 0x6e511c8e, + 0xa7166686, 0xc271da3e, 0x2cde6f2c, 0x49b9d394, 0xf0810409, + 0x95e6b8b1, 0x7b490da3, 0x1e2eb11b, 0x483ed243, 0x2d596efb, + 0xc3f6dbe9, 0xa6916751, 0x1fa9b0cc, 0x7ace0c74, 0x9461b966, + 0xf10605de}}; + +#endif + +#endif + +#if N == 2 + +#if W == 8 + +local const z_crc_t FAR crc_braid_table[][256] = { + {0x00000000, 0xae689191, 0x87a02563, 0x29c8b4f2, 0xd4314c87, + 0x7a59dd16, 0x539169e4, 0xfdf9f875, 0x73139f4f, 0xdd7b0ede, + 0xf4b3ba2c, 0x5adb2bbd, 0xa722d3c8, 0x094a4259, 0x2082f6ab, + 0x8eea673a, 0xe6273e9e, 0x484faf0f, 0x61871bfd, 0xcfef8a6c, + 0x32167219, 0x9c7ee388, 0xb5b6577a, 0x1bdec6eb, 0x9534a1d1, + 0x3b5c3040, 0x129484b2, 0xbcfc1523, 0x4105ed56, 0xef6d7cc7, + 0xc6a5c835, 0x68cd59a4, 0x173f7b7d, 0xb957eaec, 0x909f5e1e, + 0x3ef7cf8f, 0xc30e37fa, 0x6d66a66b, 0x44ae1299, 0xeac68308, + 0x642ce432, 0xca4475a3, 0xe38cc151, 0x4de450c0, 0xb01da8b5, + 0x1e753924, 0x37bd8dd6, 0x99d51c47, 0xf11845e3, 0x5f70d472, + 0x76b86080, 0xd8d0f111, 0x25290964, 0x8b4198f5, 0xa2892c07, + 0x0ce1bd96, 0x820bdaac, 0x2c634b3d, 0x05abffcf, 0xabc36e5e, + 0x563a962b, 0xf85207ba, 0xd19ab348, 0x7ff222d9, 0x2e7ef6fa, + 0x8016676b, 0xa9ded399, 0x07b64208, 0xfa4fba7d, 0x54272bec, + 0x7def9f1e, 0xd3870e8f, 0x5d6d69b5, 0xf305f824, 0xdacd4cd6, + 0x74a5dd47, 0x895c2532, 0x2734b4a3, 0x0efc0051, 0xa09491c0, + 0xc859c864, 0x663159f5, 0x4ff9ed07, 0xe1917c96, 0x1c6884e3, + 0xb2001572, 0x9bc8a180, 0x35a03011, 0xbb4a572b, 0x1522c6ba, + 0x3cea7248, 0x9282e3d9, 0x6f7b1bac, 0xc1138a3d, 0xe8db3ecf, + 0x46b3af5e, 0x39418d87, 0x97291c16, 0xbee1a8e4, 0x10893975, + 0xed70c100, 0x43185091, 0x6ad0e463, 0xc4b875f2, 0x4a5212c8, + 0xe43a8359, 0xcdf237ab, 0x639aa63a, 0x9e635e4f, 0x300bcfde, + 0x19c37b2c, 0xb7abeabd, 0xdf66b319, 0x710e2288, 0x58c6967a, + 0xf6ae07eb, 0x0b57ff9e, 0xa53f6e0f, 0x8cf7dafd, 0x229f4b6c, + 0xac752c56, 0x021dbdc7, 0x2bd50935, 0x85bd98a4, 0x784460d1, + 0xd62cf140, 0xffe445b2, 0x518cd423, 0x5cfdedf4, 0xf2957c65, + 0xdb5dc897, 0x75355906, 0x88cca173, 0x26a430e2, 0x0f6c8410, + 0xa1041581, 0x2fee72bb, 0x8186e32a, 0xa84e57d8, 0x0626c649, + 0xfbdf3e3c, 0x55b7afad, 0x7c7f1b5f, 0xd2178ace, 0xbadad36a, + 0x14b242fb, 0x3d7af609, 0x93126798, 0x6eeb9fed, 0xc0830e7c, + 0xe94bba8e, 0x47232b1f, 0xc9c94c25, 0x67a1ddb4, 0x4e696946, + 0xe001f8d7, 0x1df800a2, 0xb3909133, 0x9a5825c1, 0x3430b450, + 0x4bc29689, 0xe5aa0718, 0xcc62b3ea, 0x620a227b, 0x9ff3da0e, + 0x319b4b9f, 0x1853ff6d, 0xb63b6efc, 0x38d109c6, 0x96b99857, + 0xbf712ca5, 0x1119bd34, 0xece04541, 0x4288d4d0, 0x6b406022, + 0xc528f1b3, 0xade5a817, 0x038d3986, 0x2a458d74, 0x842d1ce5, + 0x79d4e490, 0xd7bc7501, 0xfe74c1f3, 0x501c5062, 0xdef63758, + 0x709ea6c9, 0x5956123b, 0xf73e83aa, 0x0ac77bdf, 0xa4afea4e, + 0x8d675ebc, 0x230fcf2d, 0x72831b0e, 0xdceb8a9f, 0xf5233e6d, + 0x5b4baffc, 0xa6b25789, 0x08dac618, 0x211272ea, 0x8f7ae37b, + 0x01908441, 0xaff815d0, 0x8630a122, 0x285830b3, 0xd5a1c8c6, + 0x7bc95957, 0x5201eda5, 0xfc697c34, 0x94a42590, 0x3accb401, + 0x130400f3, 0xbd6c9162, 0x40956917, 0xeefdf886, 0xc7354c74, + 0x695ddde5, 0xe7b7badf, 0x49df2b4e, 0x60179fbc, 0xce7f0e2d, + 0x3386f658, 0x9dee67c9, 0xb426d33b, 0x1a4e42aa, 0x65bc6073, + 0xcbd4f1e2, 0xe21c4510, 0x4c74d481, 0xb18d2cf4, 0x1fe5bd65, + 0x362d0997, 0x98459806, 0x16afff3c, 0xb8c76ead, 0x910fda5f, + 0x3f674bce, 0xc29eb3bb, 0x6cf6222a, 0x453e96d8, 0xeb560749, + 0x839b5eed, 0x2df3cf7c, 0x043b7b8e, 0xaa53ea1f, 0x57aa126a, + 0xf9c283fb, 0xd00a3709, 0x7e62a698, 0xf088c1a2, 0x5ee05033, + 0x7728e4c1, 0xd9407550, 0x24b98d25, 0x8ad11cb4, 0xa319a846, + 0x0d7139d7}, + {0x00000000, 0xb9fbdbe8, 0xa886b191, 0x117d6a79, 0x8a7c6563, + 0x3387be8b, 0x22fad4f2, 0x9b010f1a, 0xcf89cc87, 0x7672176f, + 0x670f7d16, 0xdef4a6fe, 0x45f5a9e4, 0xfc0e720c, 0xed731875, + 0x5488c39d, 0x44629f4f, 0xfd9944a7, 0xece42ede, 0x551ff536, + 0xce1efa2c, 0x77e521c4, 0x66984bbd, 0xdf639055, 0x8beb53c8, + 0x32108820, 0x236de259, 0x9a9639b1, 0x019736ab, 0xb86ced43, + 0xa911873a, 0x10ea5cd2, 0x88c53e9e, 0x313ee576, 0x20438f0f, + 0x99b854e7, 0x02b95bfd, 0xbb428015, 0xaa3fea6c, 0x13c43184, + 0x474cf219, 0xfeb729f1, 0xefca4388, 0x56319860, 0xcd30977a, + 0x74cb4c92, 0x65b626eb, 0xdc4dfd03, 0xcca7a1d1, 0x755c7a39, + 0x64211040, 0xdddacba8, 0x46dbc4b2, 0xff201f5a, 0xee5d7523, + 0x57a6aecb, 0x032e6d56, 0xbad5b6be, 0xaba8dcc7, 0x1253072f, + 0x89520835, 0x30a9d3dd, 0x21d4b9a4, 0x982f624c, 0xcafb7b7d, + 0x7300a095, 0x627dcaec, 0xdb861104, 0x40871e1e, 0xf97cc5f6, + 0xe801af8f, 0x51fa7467, 0x0572b7fa, 0xbc896c12, 0xadf4066b, + 0x140fdd83, 0x8f0ed299, 0x36f50971, 0x27886308, 0x9e73b8e0, + 0x8e99e432, 0x37623fda, 0x261f55a3, 0x9fe48e4b, 0x04e58151, + 0xbd1e5ab9, 0xac6330c0, 0x1598eb28, 0x411028b5, 0xf8ebf35d, + 0xe9969924, 0x506d42cc, 0xcb6c4dd6, 0x7297963e, 0x63eafc47, + 0xda1127af, 0x423e45e3, 0xfbc59e0b, 0xeab8f472, 0x53432f9a, + 0xc8422080, 0x71b9fb68, 0x60c49111, 0xd93f4af9, 0x8db78964, + 0x344c528c, 0x253138f5, 0x9ccae31d, 0x07cbec07, 0xbe3037ef, + 0xaf4d5d96, 0x16b6867e, 0x065cdaac, 0xbfa70144, 0xaeda6b3d, + 0x1721b0d5, 0x8c20bfcf, 0x35db6427, 0x24a60e5e, 0x9d5dd5b6, + 0xc9d5162b, 0x702ecdc3, 0x6153a7ba, 0xd8a87c52, 0x43a97348, + 0xfa52a8a0, 0xeb2fc2d9, 0x52d41931, 0x4e87f0bb, 0xf77c2b53, + 0xe601412a, 0x5ffa9ac2, 0xc4fb95d8, 0x7d004e30, 0x6c7d2449, + 0xd586ffa1, 0x810e3c3c, 0x38f5e7d4, 0x29888dad, 0x90735645, + 0x0b72595f, 0xb28982b7, 0xa3f4e8ce, 0x1a0f3326, 0x0ae56ff4, + 0xb31eb41c, 0xa263de65, 0x1b98058d, 0x80990a97, 0x3962d17f, + 0x281fbb06, 0x91e460ee, 0xc56ca373, 0x7c97789b, 0x6dea12e2, + 0xd411c90a, 0x4f10c610, 0xf6eb1df8, 0xe7967781, 0x5e6dac69, + 0xc642ce25, 0x7fb915cd, 0x6ec47fb4, 0xd73fa45c, 0x4c3eab46, + 0xf5c570ae, 0xe4b81ad7, 0x5d43c13f, 0x09cb02a2, 0xb030d94a, + 0xa14db333, 0x18b668db, 0x83b767c1, 0x3a4cbc29, 0x2b31d650, + 0x92ca0db8, 0x8220516a, 0x3bdb8a82, 0x2aa6e0fb, 0x935d3b13, + 0x085c3409, 0xb1a7efe1, 0xa0da8598, 0x19215e70, 0x4da99ded, + 0xf4524605, 0xe52f2c7c, 0x5cd4f794, 0xc7d5f88e, 0x7e2e2366, + 0x6f53491f, 0xd6a892f7, 0x847c8bc6, 0x3d87502e, 0x2cfa3a57, + 0x9501e1bf, 0x0e00eea5, 0xb7fb354d, 0xa6865f34, 0x1f7d84dc, + 0x4bf54741, 0xf20e9ca9, 0xe373f6d0, 0x5a882d38, 0xc1892222, + 0x7872f9ca, 0x690f93b3, 0xd0f4485b, 0xc01e1489, 0x79e5cf61, + 0x6898a518, 0xd1637ef0, 0x4a6271ea, 0xf399aa02, 0xe2e4c07b, + 0x5b1f1b93, 0x0f97d80e, 0xb66c03e6, 0xa711699f, 0x1eeab277, + 0x85ebbd6d, 0x3c106685, 0x2d6d0cfc, 0x9496d714, 0x0cb9b558, + 0xb5426eb0, 0xa43f04c9, 0x1dc4df21, 0x86c5d03b, 0x3f3e0bd3, + 0x2e4361aa, 0x97b8ba42, 0xc33079df, 0x7acba237, 0x6bb6c84e, + 0xd24d13a6, 0x494c1cbc, 0xf0b7c754, 0xe1caad2d, 0x583176c5, + 0x48db2a17, 0xf120f1ff, 0xe05d9b86, 0x59a6406e, 0xc2a74f74, + 0x7b5c949c, 0x6a21fee5, 0xd3da250d, 0x8752e690, 0x3ea93d78, + 0x2fd45701, 0x962f8ce9, 0x0d2e83f3, 0xb4d5581b, 0xa5a83262, + 0x1c53e98a}, + {0x00000000, 0x9d0fe176, 0xe16ec4ad, 0x7c6125db, 0x19ac8f1b, + 0x84a36e6d, 0xf8c24bb6, 0x65cdaac0, 0x33591e36, 0xae56ff40, + 0xd237da9b, 0x4f383bed, 0x2af5912d, 0xb7fa705b, 0xcb9b5580, + 0x5694b4f6, 0x66b23c6c, 0xfbbddd1a, 0x87dcf8c1, 0x1ad319b7, + 0x7f1eb377, 0xe2115201, 0x9e7077da, 0x037f96ac, 0x55eb225a, + 0xc8e4c32c, 0xb485e6f7, 0x298a0781, 0x4c47ad41, 0xd1484c37, + 0xad2969ec, 0x3026889a, 0xcd6478d8, 0x506b99ae, 0x2c0abc75, + 0xb1055d03, 0xd4c8f7c3, 0x49c716b5, 0x35a6336e, 0xa8a9d218, + 0xfe3d66ee, 0x63328798, 0x1f53a243, 0x825c4335, 0xe791e9f5, + 0x7a9e0883, 0x06ff2d58, 0x9bf0cc2e, 0xabd644b4, 0x36d9a5c2, + 0x4ab88019, 0xd7b7616f, 0xb27acbaf, 0x2f752ad9, 0x53140f02, + 0xce1bee74, 0x988f5a82, 0x0580bbf4, 0x79e19e2f, 0xe4ee7f59, + 0x8123d599, 0x1c2c34ef, 0x604d1134, 0xfd42f042, 0x41b9f7f1, + 0xdcb61687, 0xa0d7335c, 0x3dd8d22a, 0x581578ea, 0xc51a999c, + 0xb97bbc47, 0x24745d31, 0x72e0e9c7, 0xefef08b1, 0x938e2d6a, + 0x0e81cc1c, 0x6b4c66dc, 0xf64387aa, 0x8a22a271, 0x172d4307, + 0x270bcb9d, 0xba042aeb, 0xc6650f30, 0x5b6aee46, 0x3ea74486, + 0xa3a8a5f0, 0xdfc9802b, 0x42c6615d, 0x1452d5ab, 0x895d34dd, + 0xf53c1106, 0x6833f070, 0x0dfe5ab0, 0x90f1bbc6, 0xec909e1d, + 0x719f7f6b, 0x8cdd8f29, 0x11d26e5f, 0x6db34b84, 0xf0bcaaf2, + 0x95710032, 0x087ee144, 0x741fc49f, 0xe91025e9, 0xbf84911f, + 0x228b7069, 0x5eea55b2, 0xc3e5b4c4, 0xa6281e04, 0x3b27ff72, + 0x4746daa9, 0xda493bdf, 0xea6fb345, 0x77605233, 0x0b0177e8, + 0x960e969e, 0xf3c33c5e, 0x6eccdd28, 0x12adf8f3, 0x8fa21985, + 0xd936ad73, 0x44394c05, 0x385869de, 0xa55788a8, 0xc09a2268, + 0x5d95c31e, 0x21f4e6c5, 0xbcfb07b3, 0x8373efe2, 0x1e7c0e94, + 0x621d2b4f, 0xff12ca39, 0x9adf60f9, 0x07d0818f, 0x7bb1a454, + 0xe6be4522, 0xb02af1d4, 0x2d2510a2, 0x51443579, 0xcc4bd40f, + 0xa9867ecf, 0x34899fb9, 0x48e8ba62, 0xd5e75b14, 0xe5c1d38e, + 0x78ce32f8, 0x04af1723, 0x99a0f655, 0xfc6d5c95, 0x6162bde3, + 0x1d039838, 0x800c794e, 0xd698cdb8, 0x4b972cce, 0x37f60915, + 0xaaf9e863, 0xcf3442a3, 0x523ba3d5, 0x2e5a860e, 0xb3556778, + 0x4e17973a, 0xd318764c, 0xaf795397, 0x3276b2e1, 0x57bb1821, + 0xcab4f957, 0xb6d5dc8c, 0x2bda3dfa, 0x7d4e890c, 0xe041687a, + 0x9c204da1, 0x012facd7, 0x64e20617, 0xf9ede761, 0x858cc2ba, + 0x188323cc, 0x28a5ab56, 0xb5aa4a20, 0xc9cb6ffb, 0x54c48e8d, + 0x3109244d, 0xac06c53b, 0xd067e0e0, 0x4d680196, 0x1bfcb560, + 0x86f35416, 0xfa9271cd, 0x679d90bb, 0x02503a7b, 0x9f5fdb0d, + 0xe33efed6, 0x7e311fa0, 0xc2ca1813, 0x5fc5f965, 0x23a4dcbe, + 0xbeab3dc8, 0xdb669708, 0x4669767e, 0x3a0853a5, 0xa707b2d3, + 0xf1930625, 0x6c9ce753, 0x10fdc288, 0x8df223fe, 0xe83f893e, + 0x75306848, 0x09514d93, 0x945eace5, 0xa478247f, 0x3977c509, + 0x4516e0d2, 0xd81901a4, 0xbdd4ab64, 0x20db4a12, 0x5cba6fc9, + 0xc1b58ebf, 0x97213a49, 0x0a2edb3f, 0x764ffee4, 0xeb401f92, + 0x8e8db552, 0x13825424, 0x6fe371ff, 0xf2ec9089, 0x0fae60cb, + 0x92a181bd, 0xeec0a466, 0x73cf4510, 0x1602efd0, 0x8b0d0ea6, + 0xf76c2b7d, 0x6a63ca0b, 0x3cf77efd, 0xa1f89f8b, 0xdd99ba50, + 0x40965b26, 0x255bf1e6, 0xb8541090, 0xc435354b, 0x593ad43d, + 0x691c5ca7, 0xf413bdd1, 0x8872980a, 0x157d797c, 0x70b0d3bc, + 0xedbf32ca, 0x91de1711, 0x0cd1f667, 0x5a454291, 0xc74aa3e7, + 0xbb2b863c, 0x2624674a, 0x43e9cd8a, 0xdee62cfc, 0xa2870927, + 0x3f88e851}, + {0x00000000, 0xdd96d985, 0x605cb54b, 0xbdca6cce, 0xc0b96a96, + 0x1d2fb313, 0xa0e5dfdd, 0x7d730658, 0x5a03d36d, 0x87950ae8, + 0x3a5f6626, 0xe7c9bfa3, 0x9abab9fb, 0x472c607e, 0xfae60cb0, + 0x2770d535, 0xb407a6da, 0x69917f5f, 0xd45b1391, 0x09cdca14, + 0x74becc4c, 0xa92815c9, 0x14e27907, 0xc974a082, 0xee0475b7, + 0x3392ac32, 0x8e58c0fc, 0x53ce1979, 0x2ebd1f21, 0xf32bc6a4, + 0x4ee1aa6a, 0x937773ef, 0xb37e4bf5, 0x6ee89270, 0xd322febe, + 0x0eb4273b, 0x73c72163, 0xae51f8e6, 0x139b9428, 0xce0d4dad, + 0xe97d9898, 0x34eb411d, 0x89212dd3, 0x54b7f456, 0x29c4f20e, + 0xf4522b8b, 0x49984745, 0x940e9ec0, 0x0779ed2f, 0xdaef34aa, + 0x67255864, 0xbab381e1, 0xc7c087b9, 0x1a565e3c, 0xa79c32f2, + 0x7a0aeb77, 0x5d7a3e42, 0x80ece7c7, 0x3d268b09, 0xe0b0528c, + 0x9dc354d4, 0x40558d51, 0xfd9fe19f, 0x2009381a, 0xbd8d91ab, + 0x601b482e, 0xddd124e0, 0x0047fd65, 0x7d34fb3d, 0xa0a222b8, + 0x1d684e76, 0xc0fe97f3, 0xe78e42c6, 0x3a189b43, 0x87d2f78d, + 0x5a442e08, 0x27372850, 0xfaa1f1d5, 0x476b9d1b, 0x9afd449e, + 0x098a3771, 0xd41ceef4, 0x69d6823a, 0xb4405bbf, 0xc9335de7, + 0x14a58462, 0xa96fe8ac, 0x74f93129, 0x5389e41c, 0x8e1f3d99, + 0x33d55157, 0xee4388d2, 0x93308e8a, 0x4ea6570f, 0xf36c3bc1, + 0x2efae244, 0x0ef3da5e, 0xd36503db, 0x6eaf6f15, 0xb339b690, + 0xce4ab0c8, 0x13dc694d, 0xae160583, 0x7380dc06, 0x54f00933, + 0x8966d0b6, 0x34acbc78, 0xe93a65fd, 0x944963a5, 0x49dfba20, + 0xf415d6ee, 0x29830f6b, 0xbaf47c84, 0x6762a501, 0xdaa8c9cf, + 0x073e104a, 0x7a4d1612, 0xa7dbcf97, 0x1a11a359, 0xc7877adc, + 0xe0f7afe9, 0x3d61766c, 0x80ab1aa2, 0x5d3dc327, 0x204ec57f, + 0xfdd81cfa, 0x40127034, 0x9d84a9b1, 0xa06a2517, 0x7dfcfc92, + 0xc036905c, 0x1da049d9, 0x60d34f81, 0xbd459604, 0x008ffaca, + 0xdd19234f, 0xfa69f67a, 0x27ff2fff, 0x9a354331, 0x47a39ab4, + 0x3ad09cec, 0xe7464569, 0x5a8c29a7, 0x871af022, 0x146d83cd, + 0xc9fb5a48, 0x74313686, 0xa9a7ef03, 0xd4d4e95b, 0x094230de, + 0xb4885c10, 0x691e8595, 0x4e6e50a0, 0x93f88925, 0x2e32e5eb, + 0xf3a43c6e, 0x8ed73a36, 0x5341e3b3, 0xee8b8f7d, 0x331d56f8, + 0x13146ee2, 0xce82b767, 0x7348dba9, 0xaede022c, 0xd3ad0474, + 0x0e3bddf1, 0xb3f1b13f, 0x6e6768ba, 0x4917bd8f, 0x9481640a, + 0x294b08c4, 0xf4ddd141, 0x89aed719, 0x54380e9c, 0xe9f26252, + 0x3464bbd7, 0xa713c838, 0x7a8511bd, 0xc74f7d73, 0x1ad9a4f6, + 0x67aaa2ae, 0xba3c7b2b, 0x07f617e5, 0xda60ce60, 0xfd101b55, + 0x2086c2d0, 0x9d4cae1e, 0x40da779b, 0x3da971c3, 0xe03fa846, + 0x5df5c488, 0x80631d0d, 0x1de7b4bc, 0xc0716d39, 0x7dbb01f7, + 0xa02dd872, 0xdd5ede2a, 0x00c807af, 0xbd026b61, 0x6094b2e4, + 0x47e467d1, 0x9a72be54, 0x27b8d29a, 0xfa2e0b1f, 0x875d0d47, + 0x5acbd4c2, 0xe701b80c, 0x3a976189, 0xa9e01266, 0x7476cbe3, + 0xc9bca72d, 0x142a7ea8, 0x695978f0, 0xb4cfa175, 0x0905cdbb, + 0xd493143e, 0xf3e3c10b, 0x2e75188e, 0x93bf7440, 0x4e29adc5, + 0x335aab9d, 0xeecc7218, 0x53061ed6, 0x8e90c753, 0xae99ff49, + 0x730f26cc, 0xcec54a02, 0x13539387, 0x6e2095df, 0xb3b64c5a, + 0x0e7c2094, 0xd3eaf911, 0xf49a2c24, 0x290cf5a1, 0x94c6996f, + 0x495040ea, 0x342346b2, 0xe9b59f37, 0x547ff3f9, 0x89e92a7c, + 0x1a9e5993, 0xc7088016, 0x7ac2ecd8, 0xa754355d, 0xda273305, + 0x07b1ea80, 0xba7b864e, 0x67ed5fcb, 0x409d8afe, 0x9d0b537b, + 0x20c13fb5, 0xfd57e630, 0x8024e068, 0x5db239ed, 0xe0785523, + 0x3dee8ca6}, + {0x00000000, 0x9ba54c6f, 0xec3b9e9f, 0x779ed2f0, 0x03063b7f, + 0x98a37710, 0xef3da5e0, 0x7498e98f, 0x060c76fe, 0x9da93a91, + 0xea37e861, 0x7192a40e, 0x050a4d81, 0x9eaf01ee, 0xe931d31e, + 0x72949f71, 0x0c18edfc, 0x97bda193, 0xe0237363, 0x7b863f0c, + 0x0f1ed683, 0x94bb9aec, 0xe325481c, 0x78800473, 0x0a149b02, + 0x91b1d76d, 0xe62f059d, 0x7d8a49f2, 0x0912a07d, 0x92b7ec12, + 0xe5293ee2, 0x7e8c728d, 0x1831dbf8, 0x83949797, 0xf40a4567, + 0x6faf0908, 0x1b37e087, 0x8092ace8, 0xf70c7e18, 0x6ca93277, + 0x1e3dad06, 0x8598e169, 0xf2063399, 0x69a37ff6, 0x1d3b9679, + 0x869eda16, 0xf10008e6, 0x6aa54489, 0x14293604, 0x8f8c7a6b, + 0xf812a89b, 0x63b7e4f4, 0x172f0d7b, 0x8c8a4114, 0xfb1493e4, + 0x60b1df8b, 0x122540fa, 0x89800c95, 0xfe1ede65, 0x65bb920a, + 0x11237b85, 0x8a8637ea, 0xfd18e51a, 0x66bda975, 0x3063b7f0, + 0xabc6fb9f, 0xdc58296f, 0x47fd6500, 0x33658c8f, 0xa8c0c0e0, + 0xdf5e1210, 0x44fb5e7f, 0x366fc10e, 0xadca8d61, 0xda545f91, + 0x41f113fe, 0x3569fa71, 0xaeccb61e, 0xd95264ee, 0x42f72881, + 0x3c7b5a0c, 0xa7de1663, 0xd040c493, 0x4be588fc, 0x3f7d6173, + 0xa4d82d1c, 0xd346ffec, 0x48e3b383, 0x3a772cf2, 0xa1d2609d, + 0xd64cb26d, 0x4de9fe02, 0x3971178d, 0xa2d45be2, 0xd54a8912, + 0x4eefc57d, 0x28526c08, 0xb3f72067, 0xc469f297, 0x5fccbef8, + 0x2b545777, 0xb0f11b18, 0xc76fc9e8, 0x5cca8587, 0x2e5e1af6, + 0xb5fb5699, 0xc2658469, 0x59c0c806, 0x2d582189, 0xb6fd6de6, + 0xc163bf16, 0x5ac6f379, 0x244a81f4, 0xbfefcd9b, 0xc8711f6b, + 0x53d45304, 0x274cba8b, 0xbce9f6e4, 0xcb772414, 0x50d2687b, + 0x2246f70a, 0xb9e3bb65, 0xce7d6995, 0x55d825fa, 0x2140cc75, + 0xbae5801a, 0xcd7b52ea, 0x56de1e85, 0x60c76fe0, 0xfb62238f, + 0x8cfcf17f, 0x1759bd10, 0x63c1549f, 0xf86418f0, 0x8ffaca00, + 0x145f866f, 0x66cb191e, 0xfd6e5571, 0x8af08781, 0x1155cbee, + 0x65cd2261, 0xfe686e0e, 0x89f6bcfe, 0x1253f091, 0x6cdf821c, + 0xf77ace73, 0x80e41c83, 0x1b4150ec, 0x6fd9b963, 0xf47cf50c, + 0x83e227fc, 0x18476b93, 0x6ad3f4e2, 0xf176b88d, 0x86e86a7d, + 0x1d4d2612, 0x69d5cf9d, 0xf27083f2, 0x85ee5102, 0x1e4b1d6d, + 0x78f6b418, 0xe353f877, 0x94cd2a87, 0x0f6866e8, 0x7bf08f67, + 0xe055c308, 0x97cb11f8, 0x0c6e5d97, 0x7efac2e6, 0xe55f8e89, + 0x92c15c79, 0x09641016, 0x7dfcf999, 0xe659b5f6, 0x91c76706, + 0x0a622b69, 0x74ee59e4, 0xef4b158b, 0x98d5c77b, 0x03708b14, + 0x77e8629b, 0xec4d2ef4, 0x9bd3fc04, 0x0076b06b, 0x72e22f1a, + 0xe9476375, 0x9ed9b185, 0x057cfdea, 0x71e41465, 0xea41580a, + 0x9ddf8afa, 0x067ac695, 0x50a4d810, 0xcb01947f, 0xbc9f468f, + 0x273a0ae0, 0x53a2e36f, 0xc807af00, 0xbf997df0, 0x243c319f, + 0x56a8aeee, 0xcd0de281, 0xba933071, 0x21367c1e, 0x55ae9591, + 0xce0bd9fe, 0xb9950b0e, 0x22304761, 0x5cbc35ec, 0xc7197983, + 0xb087ab73, 0x2b22e71c, 0x5fba0e93, 0xc41f42fc, 0xb381900c, + 0x2824dc63, 0x5ab04312, 0xc1150f7d, 0xb68bdd8d, 0x2d2e91e2, + 0x59b6786d, 0xc2133402, 0xb58de6f2, 0x2e28aa9d, 0x489503e8, + 0xd3304f87, 0xa4ae9d77, 0x3f0bd118, 0x4b933897, 0xd03674f8, + 0xa7a8a608, 0x3c0dea67, 0x4e997516, 0xd53c3979, 0xa2a2eb89, + 0x3907a7e6, 0x4d9f4e69, 0xd63a0206, 0xa1a4d0f6, 0x3a019c99, + 0x448dee14, 0xdf28a27b, 0xa8b6708b, 0x33133ce4, 0x478bd56b, + 0xdc2e9904, 0xabb04bf4, 0x3015079b, 0x428198ea, 0xd924d485, + 0xaeba0675, 0x351f4a1a, 0x4187a395, 0xda22effa, 0xadbc3d0a, + 0x36197165}, + {0x00000000, 0xc18edfc0, 0x586cb9c1, 0x99e26601, 0xb0d97382, + 0x7157ac42, 0xe8b5ca43, 0x293b1583, 0xbac3e145, 0x7b4d3e85, + 0xe2af5884, 0x23218744, 0x0a1a92c7, 0xcb944d07, 0x52762b06, + 0x93f8f4c6, 0xaef6c4cb, 0x6f781b0b, 0xf69a7d0a, 0x3714a2ca, + 0x1e2fb749, 0xdfa16889, 0x46430e88, 0x87cdd148, 0x1435258e, + 0xd5bbfa4e, 0x4c599c4f, 0x8dd7438f, 0xa4ec560c, 0x656289cc, + 0xfc80efcd, 0x3d0e300d, 0x869c8fd7, 0x47125017, 0xdef03616, + 0x1f7ee9d6, 0x3645fc55, 0xf7cb2395, 0x6e294594, 0xafa79a54, + 0x3c5f6e92, 0xfdd1b152, 0x6433d753, 0xa5bd0893, 0x8c861d10, + 0x4d08c2d0, 0xd4eaa4d1, 0x15647b11, 0x286a4b1c, 0xe9e494dc, + 0x7006f2dd, 0xb1882d1d, 0x98b3389e, 0x593de75e, 0xc0df815f, + 0x01515e9f, 0x92a9aa59, 0x53277599, 0xcac51398, 0x0b4bcc58, + 0x2270d9db, 0xe3fe061b, 0x7a1c601a, 0xbb92bfda, 0xd64819ef, + 0x17c6c62f, 0x8e24a02e, 0x4faa7fee, 0x66916a6d, 0xa71fb5ad, + 0x3efdd3ac, 0xff730c6c, 0x6c8bf8aa, 0xad05276a, 0x34e7416b, + 0xf5699eab, 0xdc528b28, 0x1ddc54e8, 0x843e32e9, 0x45b0ed29, + 0x78bedd24, 0xb93002e4, 0x20d264e5, 0xe15cbb25, 0xc867aea6, + 0x09e97166, 0x900b1767, 0x5185c8a7, 0xc27d3c61, 0x03f3e3a1, + 0x9a1185a0, 0x5b9f5a60, 0x72a44fe3, 0xb32a9023, 0x2ac8f622, + 0xeb4629e2, 0x50d49638, 0x915a49f8, 0x08b82ff9, 0xc936f039, + 0xe00de5ba, 0x21833a7a, 0xb8615c7b, 0x79ef83bb, 0xea17777d, + 0x2b99a8bd, 0xb27bcebc, 0x73f5117c, 0x5ace04ff, 0x9b40db3f, + 0x02a2bd3e, 0xc32c62fe, 0xfe2252f3, 0x3fac8d33, 0xa64eeb32, + 0x67c034f2, 0x4efb2171, 0x8f75feb1, 0x169798b0, 0xd7194770, + 0x44e1b3b6, 0x856f6c76, 0x1c8d0a77, 0xdd03d5b7, 0xf438c034, + 0x35b61ff4, 0xac5479f5, 0x6ddaa635, 0x77e1359f, 0xb66fea5f, + 0x2f8d8c5e, 0xee03539e, 0xc738461d, 0x06b699dd, 0x9f54ffdc, + 0x5eda201c, 0xcd22d4da, 0x0cac0b1a, 0x954e6d1b, 0x54c0b2db, + 0x7dfba758, 0xbc757898, 0x25971e99, 0xe419c159, 0xd917f154, + 0x18992e94, 0x817b4895, 0x40f59755, 0x69ce82d6, 0xa8405d16, + 0x31a23b17, 0xf02ce4d7, 0x63d41011, 0xa25acfd1, 0x3bb8a9d0, + 0xfa367610, 0xd30d6393, 0x1283bc53, 0x8b61da52, 0x4aef0592, + 0xf17dba48, 0x30f36588, 0xa9110389, 0x689fdc49, 0x41a4c9ca, + 0x802a160a, 0x19c8700b, 0xd846afcb, 0x4bbe5b0d, 0x8a3084cd, + 0x13d2e2cc, 0xd25c3d0c, 0xfb67288f, 0x3ae9f74f, 0xa30b914e, + 0x62854e8e, 0x5f8b7e83, 0x9e05a143, 0x07e7c742, 0xc6691882, + 0xef520d01, 0x2edcd2c1, 0xb73eb4c0, 0x76b06b00, 0xe5489fc6, + 0x24c64006, 0xbd242607, 0x7caaf9c7, 0x5591ec44, 0x941f3384, + 0x0dfd5585, 0xcc738a45, 0xa1a92c70, 0x6027f3b0, 0xf9c595b1, + 0x384b4a71, 0x11705ff2, 0xd0fe8032, 0x491ce633, 0x889239f3, + 0x1b6acd35, 0xdae412f5, 0x430674f4, 0x8288ab34, 0xabb3beb7, + 0x6a3d6177, 0xf3df0776, 0x3251d8b6, 0x0f5fe8bb, 0xced1377b, + 0x5733517a, 0x96bd8eba, 0xbf869b39, 0x7e0844f9, 0xe7ea22f8, + 0x2664fd38, 0xb59c09fe, 0x7412d63e, 0xedf0b03f, 0x2c7e6fff, + 0x05457a7c, 0xc4cba5bc, 0x5d29c3bd, 0x9ca71c7d, 0x2735a3a7, + 0xe6bb7c67, 0x7f591a66, 0xbed7c5a6, 0x97ecd025, 0x56620fe5, + 0xcf8069e4, 0x0e0eb624, 0x9df642e2, 0x5c789d22, 0xc59afb23, + 0x041424e3, 0x2d2f3160, 0xeca1eea0, 0x754388a1, 0xb4cd5761, + 0x89c3676c, 0x484db8ac, 0xd1afdead, 0x1021016d, 0x391a14ee, + 0xf894cb2e, 0x6176ad2f, 0xa0f872ef, 0x33008629, 0xf28e59e9, + 0x6b6c3fe8, 0xaae2e028, 0x83d9f5ab, 0x42572a6b, 0xdbb54c6a, + 0x1a3b93aa}, + {0x00000000, 0xefc26b3e, 0x04f5d03d, 0xeb37bb03, 0x09eba07a, + 0xe629cb44, 0x0d1e7047, 0xe2dc1b79, 0x13d740f4, 0xfc152bca, + 0x172290c9, 0xf8e0fbf7, 0x1a3ce08e, 0xf5fe8bb0, 0x1ec930b3, + 0xf10b5b8d, 0x27ae81e8, 0xc86cead6, 0x235b51d5, 0xcc993aeb, + 0x2e452192, 0xc1874aac, 0x2ab0f1af, 0xc5729a91, 0x3479c11c, + 0xdbbbaa22, 0x308c1121, 0xdf4e7a1f, 0x3d926166, 0xd2500a58, + 0x3967b15b, 0xd6a5da65, 0x4f5d03d0, 0xa09f68ee, 0x4ba8d3ed, + 0xa46ab8d3, 0x46b6a3aa, 0xa974c894, 0x42437397, 0xad8118a9, + 0x5c8a4324, 0xb348281a, 0x587f9319, 0xb7bdf827, 0x5561e35e, + 0xbaa38860, 0x51943363, 0xbe56585d, 0x68f38238, 0x8731e906, + 0x6c065205, 0x83c4393b, 0x61182242, 0x8eda497c, 0x65edf27f, + 0x8a2f9941, 0x7b24c2cc, 0x94e6a9f2, 0x7fd112f1, 0x901379cf, + 0x72cf62b6, 0x9d0d0988, 0x763ab28b, 0x99f8d9b5, 0x9eba07a0, + 0x71786c9e, 0x9a4fd79d, 0x758dbca3, 0x9751a7da, 0x7893cce4, + 0x93a477e7, 0x7c661cd9, 0x8d6d4754, 0x62af2c6a, 0x89989769, + 0x665afc57, 0x8486e72e, 0x6b448c10, 0x80733713, 0x6fb15c2d, + 0xb9148648, 0x56d6ed76, 0xbde15675, 0x52233d4b, 0xb0ff2632, + 0x5f3d4d0c, 0xb40af60f, 0x5bc89d31, 0xaac3c6bc, 0x4501ad82, + 0xae361681, 0x41f47dbf, 0xa32866c6, 0x4cea0df8, 0xa7ddb6fb, + 0x481fddc5, 0xd1e70470, 0x3e256f4e, 0xd512d44d, 0x3ad0bf73, + 0xd80ca40a, 0x37cecf34, 0xdcf97437, 0x333b1f09, 0xc2304484, + 0x2df22fba, 0xc6c594b9, 0x2907ff87, 0xcbdbe4fe, 0x24198fc0, + 0xcf2e34c3, 0x20ec5ffd, 0xf6498598, 0x198beea6, 0xf2bc55a5, + 0x1d7e3e9b, 0xffa225e2, 0x10604edc, 0xfb57f5df, 0x14959ee1, + 0xe59ec56c, 0x0a5cae52, 0xe16b1551, 0x0ea97e6f, 0xec756516, + 0x03b70e28, 0xe880b52b, 0x0742de15, 0xe6050901, 0x09c7623f, + 0xe2f0d93c, 0x0d32b202, 0xefeea97b, 0x002cc245, 0xeb1b7946, + 0x04d91278, 0xf5d249f5, 0x1a1022cb, 0xf12799c8, 0x1ee5f2f6, + 0xfc39e98f, 0x13fb82b1, 0xf8cc39b2, 0x170e528c, 0xc1ab88e9, + 0x2e69e3d7, 0xc55e58d4, 0x2a9c33ea, 0xc8402893, 0x278243ad, + 0xccb5f8ae, 0x23779390, 0xd27cc81d, 0x3dbea323, 0xd6891820, + 0x394b731e, 0xdb976867, 0x34550359, 0xdf62b85a, 0x30a0d364, + 0xa9580ad1, 0x469a61ef, 0xadaddaec, 0x426fb1d2, 0xa0b3aaab, + 0x4f71c195, 0xa4467a96, 0x4b8411a8, 0xba8f4a25, 0x554d211b, + 0xbe7a9a18, 0x51b8f126, 0xb364ea5f, 0x5ca68161, 0xb7913a62, + 0x5853515c, 0x8ef68b39, 0x6134e007, 0x8a035b04, 0x65c1303a, + 0x871d2b43, 0x68df407d, 0x83e8fb7e, 0x6c2a9040, 0x9d21cbcd, + 0x72e3a0f3, 0x99d41bf0, 0x761670ce, 0x94ca6bb7, 0x7b080089, + 0x903fbb8a, 0x7ffdd0b4, 0x78bf0ea1, 0x977d659f, 0x7c4ade9c, + 0x9388b5a2, 0x7154aedb, 0x9e96c5e5, 0x75a17ee6, 0x9a6315d8, + 0x6b684e55, 0x84aa256b, 0x6f9d9e68, 0x805ff556, 0x6283ee2f, + 0x8d418511, 0x66763e12, 0x89b4552c, 0x5f118f49, 0xb0d3e477, + 0x5be45f74, 0xb426344a, 0x56fa2f33, 0xb938440d, 0x520fff0e, + 0xbdcd9430, 0x4cc6cfbd, 0xa304a483, 0x48331f80, 0xa7f174be, + 0x452d6fc7, 0xaaef04f9, 0x41d8bffa, 0xae1ad4c4, 0x37e20d71, + 0xd820664f, 0x3317dd4c, 0xdcd5b672, 0x3e09ad0b, 0xd1cbc635, + 0x3afc7d36, 0xd53e1608, 0x24354d85, 0xcbf726bb, 0x20c09db8, + 0xcf02f686, 0x2ddeedff, 0xc21c86c1, 0x292b3dc2, 0xc6e956fc, + 0x104c8c99, 0xff8ee7a7, 0x14b95ca4, 0xfb7b379a, 0x19a72ce3, + 0xf66547dd, 0x1d52fcde, 0xf29097e0, 0x039bcc6d, 0xec59a753, + 0x076e1c50, 0xe8ac776e, 0x0a706c17, 0xe5b20729, 0x0e85bc2a, + 0xe147d714}, + {0x00000000, 0x177b1443, 0x2ef62886, 0x398d3cc5, 0x5dec510c, + 0x4a97454f, 0x731a798a, 0x64616dc9, 0xbbd8a218, 0xaca3b65b, + 0x952e8a9e, 0x82559edd, 0xe634f314, 0xf14fe757, 0xc8c2db92, + 0xdfb9cfd1, 0xacc04271, 0xbbbb5632, 0x82366af7, 0x954d7eb4, + 0xf12c137d, 0xe657073e, 0xdfda3bfb, 0xc8a12fb8, 0x1718e069, + 0x0063f42a, 0x39eec8ef, 0x2e95dcac, 0x4af4b165, 0x5d8fa526, + 0x640299e3, 0x73798da0, 0x82f182a3, 0x958a96e0, 0xac07aa25, + 0xbb7cbe66, 0xdf1dd3af, 0xc866c7ec, 0xf1ebfb29, 0xe690ef6a, + 0x392920bb, 0x2e5234f8, 0x17df083d, 0x00a41c7e, 0x64c571b7, + 0x73be65f4, 0x4a335931, 0x5d484d72, 0x2e31c0d2, 0x394ad491, + 0x00c7e854, 0x17bcfc17, 0x73dd91de, 0x64a6859d, 0x5d2bb958, + 0x4a50ad1b, 0x95e962ca, 0x82927689, 0xbb1f4a4c, 0xac645e0f, + 0xc80533c6, 0xdf7e2785, 0xe6f31b40, 0xf1880f03, 0xde920307, + 0xc9e91744, 0xf0642b81, 0xe71f3fc2, 0x837e520b, 0x94054648, + 0xad887a8d, 0xbaf36ece, 0x654aa11f, 0x7231b55c, 0x4bbc8999, + 0x5cc79dda, 0x38a6f013, 0x2fdde450, 0x1650d895, 0x012bccd6, + 0x72524176, 0x65295535, 0x5ca469f0, 0x4bdf7db3, 0x2fbe107a, + 0x38c50439, 0x014838fc, 0x16332cbf, 0xc98ae36e, 0xdef1f72d, + 0xe77ccbe8, 0xf007dfab, 0x9466b262, 0x831da621, 0xba909ae4, + 0xadeb8ea7, 0x5c6381a4, 0x4b1895e7, 0x7295a922, 0x65eebd61, + 0x018fd0a8, 0x16f4c4eb, 0x2f79f82e, 0x3802ec6d, 0xe7bb23bc, + 0xf0c037ff, 0xc94d0b3a, 0xde361f79, 0xba5772b0, 0xad2c66f3, + 0x94a15a36, 0x83da4e75, 0xf0a3c3d5, 0xe7d8d796, 0xde55eb53, + 0xc92eff10, 0xad4f92d9, 0xba34869a, 0x83b9ba5f, 0x94c2ae1c, + 0x4b7b61cd, 0x5c00758e, 0x658d494b, 0x72f65d08, 0x169730c1, + 0x01ec2482, 0x38611847, 0x2f1a0c04, 0x6655004f, 0x712e140c, + 0x48a328c9, 0x5fd83c8a, 0x3bb95143, 0x2cc24500, 0x154f79c5, + 0x02346d86, 0xdd8da257, 0xcaf6b614, 0xf37b8ad1, 0xe4009e92, + 0x8061f35b, 0x971ae718, 0xae97dbdd, 0xb9eccf9e, 0xca95423e, + 0xddee567d, 0xe4636ab8, 0xf3187efb, 0x97791332, 0x80020771, + 0xb98f3bb4, 0xaef42ff7, 0x714de026, 0x6636f465, 0x5fbbc8a0, + 0x48c0dce3, 0x2ca1b12a, 0x3bdaa569, 0x025799ac, 0x152c8def, + 0xe4a482ec, 0xf3df96af, 0xca52aa6a, 0xdd29be29, 0xb948d3e0, + 0xae33c7a3, 0x97befb66, 0x80c5ef25, 0x5f7c20f4, 0x480734b7, + 0x718a0872, 0x66f11c31, 0x029071f8, 0x15eb65bb, 0x2c66597e, + 0x3b1d4d3d, 0x4864c09d, 0x5f1fd4de, 0x6692e81b, 0x71e9fc58, + 0x15889191, 0x02f385d2, 0x3b7eb917, 0x2c05ad54, 0xf3bc6285, + 0xe4c776c6, 0xdd4a4a03, 0xca315e40, 0xae503389, 0xb92b27ca, + 0x80a61b0f, 0x97dd0f4c, 0xb8c70348, 0xafbc170b, 0x96312bce, + 0x814a3f8d, 0xe52b5244, 0xf2504607, 0xcbdd7ac2, 0xdca66e81, + 0x031fa150, 0x1464b513, 0x2de989d6, 0x3a929d95, 0x5ef3f05c, + 0x4988e41f, 0x7005d8da, 0x677ecc99, 0x14074139, 0x037c557a, + 0x3af169bf, 0x2d8a7dfc, 0x49eb1035, 0x5e900476, 0x671d38b3, + 0x70662cf0, 0xafdfe321, 0xb8a4f762, 0x8129cba7, 0x9652dfe4, + 0xf233b22d, 0xe548a66e, 0xdcc59aab, 0xcbbe8ee8, 0x3a3681eb, + 0x2d4d95a8, 0x14c0a96d, 0x03bbbd2e, 0x67dad0e7, 0x70a1c4a4, + 0x492cf861, 0x5e57ec22, 0x81ee23f3, 0x969537b0, 0xaf180b75, + 0xb8631f36, 0xdc0272ff, 0xcb7966bc, 0xf2f45a79, 0xe58f4e3a, + 0x96f6c39a, 0x818dd7d9, 0xb800eb1c, 0xaf7bff5f, 0xcb1a9296, + 0xdc6186d5, 0xe5ecba10, 0xf297ae53, 0x2d2e6182, 0x3a5575c1, + 0x03d84904, 0x14a35d47, 0x70c2308e, 0x67b924cd, 0x5e341808, + 0x494f0c4b}}; + +local const z_word_t FAR crc_braid_big_table[][256] = { + {0x0000000000000000, 0x43147b1700000000, 0x8628f62e00000000, + 0xc53c8d3900000000, 0x0c51ec5d00000000, 0x4f45974a00000000, + 0x8a791a7300000000, 0xc96d616400000000, 0x18a2d8bb00000000, + 0x5bb6a3ac00000000, 0x9e8a2e9500000000, 0xdd9e558200000000, + 0x14f334e600000000, 0x57e74ff100000000, 0x92dbc2c800000000, + 0xd1cfb9df00000000, 0x7142c0ac00000000, 0x3256bbbb00000000, + 0xf76a368200000000, 0xb47e4d9500000000, 0x7d132cf100000000, + 0x3e0757e600000000, 0xfb3bdadf00000000, 0xb82fa1c800000000, + 0x69e0181700000000, 0x2af4630000000000, 0xefc8ee3900000000, + 0xacdc952e00000000, 0x65b1f44a00000000, 0x26a58f5d00000000, + 0xe399026400000000, 0xa08d797300000000, 0xa382f18200000000, + 0xe0968a9500000000, 0x25aa07ac00000000, 0x66be7cbb00000000, + 0xafd31ddf00000000, 0xecc766c800000000, 0x29fbebf100000000, + 0x6aef90e600000000, 0xbb20293900000000, 0xf834522e00000000, + 0x3d08df1700000000, 0x7e1ca40000000000, 0xb771c56400000000, + 0xf465be7300000000, 0x3159334a00000000, 0x724d485d00000000, + 0xd2c0312e00000000, 0x91d44a3900000000, 0x54e8c70000000000, + 0x17fcbc1700000000, 0xde91dd7300000000, 0x9d85a66400000000, + 0x58b92b5d00000000, 0x1bad504a00000000, 0xca62e99500000000, + 0x8976928200000000, 0x4c4a1fbb00000000, 0x0f5e64ac00000000, + 0xc63305c800000000, 0x85277edf00000000, 0x401bf3e600000000, + 0x030f88f100000000, 0x070392de00000000, 0x4417e9c900000000, + 0x812b64f000000000, 0xc23f1fe700000000, 0x0b527e8300000000, + 0x4846059400000000, 0x8d7a88ad00000000, 0xce6ef3ba00000000, + 0x1fa14a6500000000, 0x5cb5317200000000, 0x9989bc4b00000000, + 0xda9dc75c00000000, 0x13f0a63800000000, 0x50e4dd2f00000000, + 0x95d8501600000000, 0xd6cc2b0100000000, 0x7641527200000000, + 0x3555296500000000, 0xf069a45c00000000, 0xb37ddf4b00000000, + 0x7a10be2f00000000, 0x3904c53800000000, 0xfc38480100000000, + 0xbf2c331600000000, 0x6ee38ac900000000, 0x2df7f1de00000000, + 0xe8cb7ce700000000, 0xabdf07f000000000, 0x62b2669400000000, + 0x21a61d8300000000, 0xe49a90ba00000000, 0xa78eebad00000000, + 0xa481635c00000000, 0xe795184b00000000, 0x22a9957200000000, + 0x61bdee6500000000, 0xa8d08f0100000000, 0xebc4f41600000000, + 0x2ef8792f00000000, 0x6dec023800000000, 0xbc23bbe700000000, + 0xff37c0f000000000, 0x3a0b4dc900000000, 0x791f36de00000000, + 0xb07257ba00000000, 0xf3662cad00000000, 0x365aa19400000000, + 0x754eda8300000000, 0xd5c3a3f000000000, 0x96d7d8e700000000, + 0x53eb55de00000000, 0x10ff2ec900000000, 0xd9924fad00000000, + 0x9a8634ba00000000, 0x5fbab98300000000, 0x1caec29400000000, + 0xcd617b4b00000000, 0x8e75005c00000000, 0x4b498d6500000000, + 0x085df67200000000, 0xc130971600000000, 0x8224ec0100000000, + 0x4718613800000000, 0x040c1a2f00000000, 0x4f00556600000000, + 0x0c142e7100000000, 0xc928a34800000000, 0x8a3cd85f00000000, + 0x4351b93b00000000, 0x0045c22c00000000, 0xc5794f1500000000, + 0x866d340200000000, 0x57a28ddd00000000, 0x14b6f6ca00000000, + 0xd18a7bf300000000, 0x929e00e400000000, 0x5bf3618000000000, + 0x18e71a9700000000, 0xdddb97ae00000000, 0x9ecfecb900000000, + 0x3e4295ca00000000, 0x7d56eedd00000000, 0xb86a63e400000000, + 0xfb7e18f300000000, 0x3213799700000000, 0x7107028000000000, + 0xb43b8fb900000000, 0xf72ff4ae00000000, 0x26e04d7100000000, + 0x65f4366600000000, 0xa0c8bb5f00000000, 0xe3dcc04800000000, + 0x2ab1a12c00000000, 0x69a5da3b00000000, 0xac99570200000000, + 0xef8d2c1500000000, 0xec82a4e400000000, 0xaf96dff300000000, + 0x6aaa52ca00000000, 0x29be29dd00000000, 0xe0d348b900000000, + 0xa3c733ae00000000, 0x66fbbe9700000000, 0x25efc58000000000, + 0xf4207c5f00000000, 0xb734074800000000, 0x72088a7100000000, + 0x311cf16600000000, 0xf871900200000000, 0xbb65eb1500000000, + 0x7e59662c00000000, 0x3d4d1d3b00000000, 0x9dc0644800000000, + 0xded41f5f00000000, 0x1be8926600000000, 0x58fce97100000000, + 0x9191881500000000, 0xd285f30200000000, 0x17b97e3b00000000, + 0x54ad052c00000000, 0x8562bcf300000000, 0xc676c7e400000000, + 0x034a4add00000000, 0x405e31ca00000000, 0x893350ae00000000, + 0xca272bb900000000, 0x0f1ba68000000000, 0x4c0fdd9700000000, + 0x4803c7b800000000, 0x0b17bcaf00000000, 0xce2b319600000000, + 0x8d3f4a8100000000, 0x44522be500000000, 0x074650f200000000, + 0xc27addcb00000000, 0x816ea6dc00000000, 0x50a11f0300000000, + 0x13b5641400000000, 0xd689e92d00000000, 0x959d923a00000000, + 0x5cf0f35e00000000, 0x1fe4884900000000, 0xdad8057000000000, + 0x99cc7e6700000000, 0x3941071400000000, 0x7a557c0300000000, + 0xbf69f13a00000000, 0xfc7d8a2d00000000, 0x3510eb4900000000, + 0x7604905e00000000, 0xb3381d6700000000, 0xf02c667000000000, + 0x21e3dfaf00000000, 0x62f7a4b800000000, 0xa7cb298100000000, + 0xe4df529600000000, 0x2db233f200000000, 0x6ea648e500000000, + 0xab9ac5dc00000000, 0xe88ebecb00000000, 0xeb81363a00000000, + 0xa8954d2d00000000, 0x6da9c01400000000, 0x2ebdbb0300000000, + 0xe7d0da6700000000, 0xa4c4a17000000000, 0x61f82c4900000000, + 0x22ec575e00000000, 0xf323ee8100000000, 0xb037959600000000, + 0x750b18af00000000, 0x361f63b800000000, 0xff7202dc00000000, + 0xbc6679cb00000000, 0x795af4f200000000, 0x3a4e8fe500000000, + 0x9ac3f69600000000, 0xd9d78d8100000000, 0x1ceb00b800000000, + 0x5fff7baf00000000, 0x96921acb00000000, 0xd58661dc00000000, + 0x10baece500000000, 0x53ae97f200000000, 0x82612e2d00000000, + 0xc175553a00000000, 0x0449d80300000000, 0x475da31400000000, + 0x8e30c27000000000, 0xcd24b96700000000, 0x0818345e00000000, + 0x4b0c4f4900000000}, + {0x0000000000000000, 0x3e6bc2ef00000000, 0x3dd0f50400000000, + 0x03bb37eb00000000, 0x7aa0eb0900000000, 0x44cb29e600000000, + 0x47701e0d00000000, 0x791bdce200000000, 0xf440d71300000000, + 0xca2b15fc00000000, 0xc990221700000000, 0xf7fbe0f800000000, + 0x8ee03c1a00000000, 0xb08bfef500000000, 0xb330c91e00000000, + 0x8d5b0bf100000000, 0xe881ae2700000000, 0xd6ea6cc800000000, + 0xd5515b2300000000, 0xeb3a99cc00000000, 0x9221452e00000000, + 0xac4a87c100000000, 0xaff1b02a00000000, 0x919a72c500000000, + 0x1cc1793400000000, 0x22aabbdb00000000, 0x21118c3000000000, + 0x1f7a4edf00000000, 0x6661923d00000000, 0x580a50d200000000, + 0x5bb1673900000000, 0x65daa5d600000000, 0xd0035d4f00000000, + 0xee689fa000000000, 0xedd3a84b00000000, 0xd3b86aa400000000, + 0xaaa3b64600000000, 0x94c874a900000000, 0x9773434200000000, + 0xa91881ad00000000, 0x24438a5c00000000, 0x1a2848b300000000, + 0x19937f5800000000, 0x27f8bdb700000000, 0x5ee3615500000000, + 0x6088a3ba00000000, 0x6333945100000000, 0x5d5856be00000000, + 0x3882f36800000000, 0x06e9318700000000, 0x0552066c00000000, + 0x3b39c48300000000, 0x4222186100000000, 0x7c49da8e00000000, + 0x7ff2ed6500000000, 0x41992f8a00000000, 0xccc2247b00000000, + 0xf2a9e69400000000, 0xf112d17f00000000, 0xcf79139000000000, + 0xb662cf7200000000, 0x88090d9d00000000, 0x8bb23a7600000000, + 0xb5d9f89900000000, 0xa007ba9e00000000, 0x9e6c787100000000, + 0x9dd74f9a00000000, 0xa3bc8d7500000000, 0xdaa7519700000000, + 0xe4cc937800000000, 0xe777a49300000000, 0xd91c667c00000000, + 0x54476d8d00000000, 0x6a2caf6200000000, 0x6997988900000000, + 0x57fc5a6600000000, 0x2ee7868400000000, 0x108c446b00000000, + 0x1337738000000000, 0x2d5cb16f00000000, 0x488614b900000000, + 0x76edd65600000000, 0x7556e1bd00000000, 0x4b3d235200000000, + 0x3226ffb000000000, 0x0c4d3d5f00000000, 0x0ff60ab400000000, + 0x319dc85b00000000, 0xbcc6c3aa00000000, 0x82ad014500000000, + 0x811636ae00000000, 0xbf7df44100000000, 0xc66628a300000000, + 0xf80dea4c00000000, 0xfbb6dda700000000, 0xc5dd1f4800000000, + 0x7004e7d100000000, 0x4e6f253e00000000, 0x4dd412d500000000, + 0x73bfd03a00000000, 0x0aa40cd800000000, 0x34cfce3700000000, + 0x3774f9dc00000000, 0x091f3b3300000000, 0x844430c200000000, + 0xba2ff22d00000000, 0xb994c5c600000000, 0x87ff072900000000, + 0xfee4dbcb00000000, 0xc08f192400000000, 0xc3342ecf00000000, + 0xfd5fec2000000000, 0x988549f600000000, 0xa6ee8b1900000000, + 0xa555bcf200000000, 0x9b3e7e1d00000000, 0xe225a2ff00000000, + 0xdc4e601000000000, 0xdff557fb00000000, 0xe19e951400000000, + 0x6cc59ee500000000, 0x52ae5c0a00000000, 0x51156be100000000, + 0x6f7ea90e00000000, 0x166575ec00000000, 0x280eb70300000000, + 0x2bb580e800000000, 0x15de420700000000, 0x010905e600000000, + 0x3f62c70900000000, 0x3cd9f0e200000000, 0x02b2320d00000000, + 0x7ba9eeef00000000, 0x45c22c0000000000, 0x46791beb00000000, + 0x7812d90400000000, 0xf549d2f500000000, 0xcb22101a00000000, + 0xc89927f100000000, 0xf6f2e51e00000000, 0x8fe939fc00000000, + 0xb182fb1300000000, 0xb239ccf800000000, 0x8c520e1700000000, + 0xe988abc100000000, 0xd7e3692e00000000, 0xd4585ec500000000, + 0xea339c2a00000000, 0x932840c800000000, 0xad43822700000000, + 0xaef8b5cc00000000, 0x9093772300000000, 0x1dc87cd200000000, + 0x23a3be3d00000000, 0x201889d600000000, 0x1e734b3900000000, + 0x676897db00000000, 0x5903553400000000, 0x5ab862df00000000, + 0x64d3a03000000000, 0xd10a58a900000000, 0xef619a4600000000, + 0xecdaadad00000000, 0xd2b16f4200000000, 0xabaab3a000000000, + 0x95c1714f00000000, 0x967a46a400000000, 0xa811844b00000000, + 0x254a8fba00000000, 0x1b214d5500000000, 0x189a7abe00000000, + 0x26f1b85100000000, 0x5fea64b300000000, 0x6181a65c00000000, + 0x623a91b700000000, 0x5c51535800000000, 0x398bf68e00000000, + 0x07e0346100000000, 0x045b038a00000000, 0x3a30c16500000000, + 0x432b1d8700000000, 0x7d40df6800000000, 0x7efbe88300000000, + 0x40902a6c00000000, 0xcdcb219d00000000, 0xf3a0e37200000000, + 0xf01bd49900000000, 0xce70167600000000, 0xb76bca9400000000, + 0x8900087b00000000, 0x8abb3f9000000000, 0xb4d0fd7f00000000, + 0xa10ebf7800000000, 0x9f657d9700000000, 0x9cde4a7c00000000, + 0xa2b5889300000000, 0xdbae547100000000, 0xe5c5969e00000000, + 0xe67ea17500000000, 0xd815639a00000000, 0x554e686b00000000, + 0x6b25aa8400000000, 0x689e9d6f00000000, 0x56f55f8000000000, + 0x2fee836200000000, 0x1185418d00000000, 0x123e766600000000, + 0x2c55b48900000000, 0x498f115f00000000, 0x77e4d3b000000000, + 0x745fe45b00000000, 0x4a3426b400000000, 0x332ffa5600000000, + 0x0d4438b900000000, 0x0eff0f5200000000, 0x3094cdbd00000000, + 0xbdcfc64c00000000, 0x83a404a300000000, 0x801f334800000000, + 0xbe74f1a700000000, 0xc76f2d4500000000, 0xf904efaa00000000, + 0xfabfd84100000000, 0xc4d41aae00000000, 0x710de23700000000, + 0x4f6620d800000000, 0x4cdd173300000000, 0x72b6d5dc00000000, + 0x0bad093e00000000, 0x35c6cbd100000000, 0x367dfc3a00000000, + 0x08163ed500000000, 0x854d352400000000, 0xbb26f7cb00000000, + 0xb89dc02000000000, 0x86f602cf00000000, 0xffedde2d00000000, + 0xc1861cc200000000, 0xc23d2b2900000000, 0xfc56e9c600000000, + 0x998c4c1000000000, 0xa7e78eff00000000, 0xa45cb91400000000, + 0x9a377bfb00000000, 0xe32ca71900000000, 0xdd4765f600000000, + 0xdefc521d00000000, 0xe09790f200000000, 0x6dcc9b0300000000, + 0x53a759ec00000000, 0x501c6e0700000000, 0x6e77ace800000000, + 0x176c700a00000000, 0x2907b2e500000000, 0x2abc850e00000000, + 0x14d747e100000000}, + {0x0000000000000000, 0xc0df8ec100000000, 0xc1b96c5800000000, + 0x0166e29900000000, 0x8273d9b000000000, 0x42ac577100000000, + 0x43cab5e800000000, 0x83153b2900000000, 0x45e1c3ba00000000, + 0x853e4d7b00000000, 0x8458afe200000000, 0x4487212300000000, + 0xc7921a0a00000000, 0x074d94cb00000000, 0x062b765200000000, + 0xc6f4f89300000000, 0xcbc4f6ae00000000, 0x0b1b786f00000000, + 0x0a7d9af600000000, 0xcaa2143700000000, 0x49b72f1e00000000, + 0x8968a1df00000000, 0x880e434600000000, 0x48d1cd8700000000, + 0x8e25351400000000, 0x4efabbd500000000, 0x4f9c594c00000000, + 0x8f43d78d00000000, 0x0c56eca400000000, 0xcc89626500000000, + 0xcdef80fc00000000, 0x0d300e3d00000000, 0xd78f9c8600000000, + 0x1750124700000000, 0x1636f0de00000000, 0xd6e97e1f00000000, + 0x55fc453600000000, 0x9523cbf700000000, 0x9445296e00000000, + 0x549aa7af00000000, 0x926e5f3c00000000, 0x52b1d1fd00000000, + 0x53d7336400000000, 0x9308bda500000000, 0x101d868c00000000, + 0xd0c2084d00000000, 0xd1a4ead400000000, 0x117b641500000000, + 0x1c4b6a2800000000, 0xdc94e4e900000000, 0xddf2067000000000, + 0x1d2d88b100000000, 0x9e38b39800000000, 0x5ee73d5900000000, + 0x5f81dfc000000000, 0x9f5e510100000000, 0x59aaa99200000000, + 0x9975275300000000, 0x9813c5ca00000000, 0x58cc4b0b00000000, + 0xdbd9702200000000, 0x1b06fee300000000, 0x1a601c7a00000000, + 0xdabf92bb00000000, 0xef1948d600000000, 0x2fc6c61700000000, + 0x2ea0248e00000000, 0xee7faa4f00000000, 0x6d6a916600000000, + 0xadb51fa700000000, 0xacd3fd3e00000000, 0x6c0c73ff00000000, + 0xaaf88b6c00000000, 0x6a2705ad00000000, 0x6b41e73400000000, + 0xab9e69f500000000, 0x288b52dc00000000, 0xe854dc1d00000000, + 0xe9323e8400000000, 0x29edb04500000000, 0x24ddbe7800000000, + 0xe40230b900000000, 0xe564d22000000000, 0x25bb5ce100000000, + 0xa6ae67c800000000, 0x6671e90900000000, 0x67170b9000000000, + 0xa7c8855100000000, 0x613c7dc200000000, 0xa1e3f30300000000, + 0xa085119a00000000, 0x605a9f5b00000000, 0xe34fa47200000000, + 0x23902ab300000000, 0x22f6c82a00000000, 0xe22946eb00000000, + 0x3896d45000000000, 0xf8495a9100000000, 0xf92fb80800000000, + 0x39f036c900000000, 0xbae50de000000000, 0x7a3a832100000000, + 0x7b5c61b800000000, 0xbb83ef7900000000, 0x7d7717ea00000000, + 0xbda8992b00000000, 0xbcce7bb200000000, 0x7c11f57300000000, + 0xff04ce5a00000000, 0x3fdb409b00000000, 0x3ebda20200000000, + 0xfe622cc300000000, 0xf35222fe00000000, 0x338dac3f00000000, + 0x32eb4ea600000000, 0xf234c06700000000, 0x7121fb4e00000000, + 0xb1fe758f00000000, 0xb098971600000000, 0x704719d700000000, + 0xb6b3e14400000000, 0x766c6f8500000000, 0x770a8d1c00000000, + 0xb7d503dd00000000, 0x34c038f400000000, 0xf41fb63500000000, + 0xf57954ac00000000, 0x35a6da6d00000000, 0x9f35e17700000000, + 0x5fea6fb600000000, 0x5e8c8d2f00000000, 0x9e5303ee00000000, + 0x1d4638c700000000, 0xdd99b60600000000, 0xdcff549f00000000, + 0x1c20da5e00000000, 0xdad422cd00000000, 0x1a0bac0c00000000, + 0x1b6d4e9500000000, 0xdbb2c05400000000, 0x58a7fb7d00000000, + 0x987875bc00000000, 0x991e972500000000, 0x59c119e400000000, + 0x54f117d900000000, 0x942e991800000000, 0x95487b8100000000, + 0x5597f54000000000, 0xd682ce6900000000, 0x165d40a800000000, + 0x173ba23100000000, 0xd7e42cf000000000, 0x1110d46300000000, + 0xd1cf5aa200000000, 0xd0a9b83b00000000, 0x107636fa00000000, + 0x93630dd300000000, 0x53bc831200000000, 0x52da618b00000000, + 0x9205ef4a00000000, 0x48ba7df100000000, 0x8865f33000000000, + 0x890311a900000000, 0x49dc9f6800000000, 0xcac9a44100000000, + 0x0a162a8000000000, 0x0b70c81900000000, 0xcbaf46d800000000, + 0x0d5bbe4b00000000, 0xcd84308a00000000, 0xcce2d21300000000, + 0x0c3d5cd200000000, 0x8f2867fb00000000, 0x4ff7e93a00000000, + 0x4e910ba300000000, 0x8e4e856200000000, 0x837e8b5f00000000, + 0x43a1059e00000000, 0x42c7e70700000000, 0x821869c600000000, + 0x010d52ef00000000, 0xc1d2dc2e00000000, 0xc0b43eb700000000, + 0x006bb07600000000, 0xc69f48e500000000, 0x0640c62400000000, + 0x072624bd00000000, 0xc7f9aa7c00000000, 0x44ec915500000000, + 0x84331f9400000000, 0x8555fd0d00000000, 0x458a73cc00000000, + 0x702ca9a100000000, 0xb0f3276000000000, 0xb195c5f900000000, + 0x714a4b3800000000, 0xf25f701100000000, 0x3280fed000000000, + 0x33e61c4900000000, 0xf339928800000000, 0x35cd6a1b00000000, + 0xf512e4da00000000, 0xf474064300000000, 0x34ab888200000000, + 0xb7beb3ab00000000, 0x77613d6a00000000, 0x7607dff300000000, + 0xb6d8513200000000, 0xbbe85f0f00000000, 0x7b37d1ce00000000, + 0x7a51335700000000, 0xba8ebd9600000000, 0x399b86bf00000000, + 0xf944087e00000000, 0xf822eae700000000, 0x38fd642600000000, + 0xfe099cb500000000, 0x3ed6127400000000, 0x3fb0f0ed00000000, + 0xff6f7e2c00000000, 0x7c7a450500000000, 0xbca5cbc400000000, + 0xbdc3295d00000000, 0x7d1ca79c00000000, 0xa7a3352700000000, + 0x677cbbe600000000, 0x661a597f00000000, 0xa6c5d7be00000000, + 0x25d0ec9700000000, 0xe50f625600000000, 0xe46980cf00000000, + 0x24b60e0e00000000, 0xe242f69d00000000, 0x229d785c00000000, + 0x23fb9ac500000000, 0xe324140400000000, 0x60312f2d00000000, + 0xa0eea1ec00000000, 0xa188437500000000, 0x6157cdb400000000, + 0x6c67c38900000000, 0xacb84d4800000000, 0xaddeafd100000000, + 0x6d01211000000000, 0xee141a3900000000, 0x2ecb94f800000000, + 0x2fad766100000000, 0xef72f8a000000000, 0x2986003300000000, + 0xe9598ef200000000, 0xe83f6c6b00000000, 0x28e0e2aa00000000, + 0xabf5d98300000000, 0x6b2a574200000000, 0x6a4cb5db00000000, + 0xaa933b1a00000000}, + {0x0000000000000000, 0x6f4ca59b00000000, 0x9f9e3bec00000000, + 0xf0d29e7700000000, 0x7f3b060300000000, 0x1077a39800000000, + 0xe0a53def00000000, 0x8fe9987400000000, 0xfe760c0600000000, + 0x913aa99d00000000, 0x61e837ea00000000, 0x0ea4927100000000, + 0x814d0a0500000000, 0xee01af9e00000000, 0x1ed331e900000000, + 0x719f947200000000, 0xfced180c00000000, 0x93a1bd9700000000, + 0x637323e000000000, 0x0c3f867b00000000, 0x83d61e0f00000000, + 0xec9abb9400000000, 0x1c4825e300000000, 0x7304807800000000, + 0x029b140a00000000, 0x6dd7b19100000000, 0x9d052fe600000000, + 0xf2498a7d00000000, 0x7da0120900000000, 0x12ecb79200000000, + 0xe23e29e500000000, 0x8d728c7e00000000, 0xf8db311800000000, + 0x9797948300000000, 0x67450af400000000, 0x0809af6f00000000, + 0x87e0371b00000000, 0xe8ac928000000000, 0x187e0cf700000000, + 0x7732a96c00000000, 0x06ad3d1e00000000, 0x69e1988500000000, + 0x993306f200000000, 0xf67fa36900000000, 0x79963b1d00000000, + 0x16da9e8600000000, 0xe60800f100000000, 0x8944a56a00000000, + 0x0436291400000000, 0x6b7a8c8f00000000, 0x9ba812f800000000, + 0xf4e4b76300000000, 0x7b0d2f1700000000, 0x14418a8c00000000, + 0xe49314fb00000000, 0x8bdfb16000000000, 0xfa40251200000000, + 0x950c808900000000, 0x65de1efe00000000, 0x0a92bb6500000000, + 0x857b231100000000, 0xea37868a00000000, 0x1ae518fd00000000, + 0x75a9bd6600000000, 0xf0b7633000000000, 0x9ffbc6ab00000000, + 0x6f2958dc00000000, 0x0065fd4700000000, 0x8f8c653300000000, + 0xe0c0c0a800000000, 0x10125edf00000000, 0x7f5efb4400000000, + 0x0ec16f3600000000, 0x618dcaad00000000, 0x915f54da00000000, + 0xfe13f14100000000, 0x71fa693500000000, 0x1eb6ccae00000000, + 0xee6452d900000000, 0x8128f74200000000, 0x0c5a7b3c00000000, + 0x6316dea700000000, 0x93c440d000000000, 0xfc88e54b00000000, + 0x73617d3f00000000, 0x1c2dd8a400000000, 0xecff46d300000000, + 0x83b3e34800000000, 0xf22c773a00000000, 0x9d60d2a100000000, + 0x6db24cd600000000, 0x02fee94d00000000, 0x8d17713900000000, + 0xe25bd4a200000000, 0x12894ad500000000, 0x7dc5ef4e00000000, + 0x086c522800000000, 0x6720f7b300000000, 0x97f269c400000000, + 0xf8becc5f00000000, 0x7757542b00000000, 0x181bf1b000000000, + 0xe8c96fc700000000, 0x8785ca5c00000000, 0xf61a5e2e00000000, + 0x9956fbb500000000, 0x698465c200000000, 0x06c8c05900000000, + 0x8921582d00000000, 0xe66dfdb600000000, 0x16bf63c100000000, + 0x79f3c65a00000000, 0xf4814a2400000000, 0x9bcdefbf00000000, + 0x6b1f71c800000000, 0x0453d45300000000, 0x8bba4c2700000000, + 0xe4f6e9bc00000000, 0x142477cb00000000, 0x7b68d25000000000, + 0x0af7462200000000, 0x65bbe3b900000000, 0x95697dce00000000, + 0xfa25d85500000000, 0x75cc402100000000, 0x1a80e5ba00000000, + 0xea527bcd00000000, 0x851ede5600000000, 0xe06fc76000000000, + 0x8f2362fb00000000, 0x7ff1fc8c00000000, 0x10bd591700000000, + 0x9f54c16300000000, 0xf01864f800000000, 0x00cafa8f00000000, + 0x6f865f1400000000, 0x1e19cb6600000000, 0x71556efd00000000, + 0x8187f08a00000000, 0xeecb551100000000, 0x6122cd6500000000, + 0x0e6e68fe00000000, 0xfebcf68900000000, 0x91f0531200000000, + 0x1c82df6c00000000, 0x73ce7af700000000, 0x831ce48000000000, + 0xec50411b00000000, 0x63b9d96f00000000, 0x0cf57cf400000000, + 0xfc27e28300000000, 0x936b471800000000, 0xe2f4d36a00000000, + 0x8db876f100000000, 0x7d6ae88600000000, 0x12264d1d00000000, + 0x9dcfd56900000000, 0xf28370f200000000, 0x0251ee8500000000, + 0x6d1d4b1e00000000, 0x18b4f67800000000, 0x77f853e300000000, + 0x872acd9400000000, 0xe866680f00000000, 0x678ff07b00000000, + 0x08c355e000000000, 0xf811cb9700000000, 0x975d6e0c00000000, + 0xe6c2fa7e00000000, 0x898e5fe500000000, 0x795cc19200000000, + 0x1610640900000000, 0x99f9fc7d00000000, 0xf6b559e600000000, + 0x0667c79100000000, 0x692b620a00000000, 0xe459ee7400000000, + 0x8b154bef00000000, 0x7bc7d59800000000, 0x148b700300000000, + 0x9b62e87700000000, 0xf42e4dec00000000, 0x04fcd39b00000000, + 0x6bb0760000000000, 0x1a2fe27200000000, 0x756347e900000000, + 0x85b1d99e00000000, 0xeafd7c0500000000, 0x6514e47100000000, + 0x0a5841ea00000000, 0xfa8adf9d00000000, 0x95c67a0600000000, + 0x10d8a45000000000, 0x7f9401cb00000000, 0x8f469fbc00000000, + 0xe00a3a2700000000, 0x6fe3a25300000000, 0x00af07c800000000, + 0xf07d99bf00000000, 0x9f313c2400000000, 0xeeaea85600000000, + 0x81e20dcd00000000, 0x713093ba00000000, 0x1e7c362100000000, + 0x9195ae5500000000, 0xfed90bce00000000, 0x0e0b95b900000000, + 0x6147302200000000, 0xec35bc5c00000000, 0x837919c700000000, + 0x73ab87b000000000, 0x1ce7222b00000000, 0x930eba5f00000000, + 0xfc421fc400000000, 0x0c9081b300000000, 0x63dc242800000000, + 0x1243b05a00000000, 0x7d0f15c100000000, 0x8ddd8bb600000000, + 0xe2912e2d00000000, 0x6d78b65900000000, 0x023413c200000000, + 0xf2e68db500000000, 0x9daa282e00000000, 0xe803954800000000, + 0x874f30d300000000, 0x779daea400000000, 0x18d10b3f00000000, + 0x9738934b00000000, 0xf87436d000000000, 0x08a6a8a700000000, + 0x67ea0d3c00000000, 0x1675994e00000000, 0x79393cd500000000, + 0x89eba2a200000000, 0xe6a7073900000000, 0x694e9f4d00000000, + 0x06023ad600000000, 0xf6d0a4a100000000, 0x999c013a00000000, + 0x14ee8d4400000000, 0x7ba228df00000000, 0x8b70b6a800000000, + 0xe43c133300000000, 0x6bd58b4700000000, 0x04992edc00000000, + 0xf44bb0ab00000000, 0x9b07153000000000, 0xea98814200000000, + 0x85d424d900000000, 0x7506baae00000000, 0x1a4a1f3500000000, + 0x95a3874100000000, 0xfaef22da00000000, 0x0a3dbcad00000000, + 0x6571193600000000}, + {0x0000000000000000, 0x85d996dd00000000, 0x4bb55c6000000000, + 0xce6ccabd00000000, 0x966ab9c000000000, 0x13b32f1d00000000, + 0xdddfe5a000000000, 0x5806737d00000000, 0x6dd3035a00000000, + 0xe80a958700000000, 0x26665f3a00000000, 0xa3bfc9e700000000, + 0xfbb9ba9a00000000, 0x7e602c4700000000, 0xb00ce6fa00000000, + 0x35d5702700000000, 0xdaa607b400000000, 0x5f7f916900000000, + 0x91135bd400000000, 0x14cacd0900000000, 0x4cccbe7400000000, + 0xc91528a900000000, 0x0779e21400000000, 0x82a074c900000000, + 0xb77504ee00000000, 0x32ac923300000000, 0xfcc0588e00000000, + 0x7919ce5300000000, 0x211fbd2e00000000, 0xa4c62bf300000000, + 0x6aaae14e00000000, 0xef73779300000000, 0xf54b7eb300000000, + 0x7092e86e00000000, 0xbefe22d300000000, 0x3b27b40e00000000, + 0x6321c77300000000, 0xe6f851ae00000000, 0x28949b1300000000, + 0xad4d0dce00000000, 0x98987de900000000, 0x1d41eb3400000000, + 0xd32d218900000000, 0x56f4b75400000000, 0x0ef2c42900000000, + 0x8b2b52f400000000, 0x4547984900000000, 0xc09e0e9400000000, + 0x2fed790700000000, 0xaa34efda00000000, 0x6458256700000000, + 0xe181b3ba00000000, 0xb987c0c700000000, 0x3c5e561a00000000, + 0xf2329ca700000000, 0x77eb0a7a00000000, 0x423e7a5d00000000, + 0xc7e7ec8000000000, 0x098b263d00000000, 0x8c52b0e000000000, + 0xd454c39d00000000, 0x518d554000000000, 0x9fe19ffd00000000, + 0x1a38092000000000, 0xab918dbd00000000, 0x2e481b6000000000, + 0xe024d1dd00000000, 0x65fd470000000000, 0x3dfb347d00000000, + 0xb822a2a000000000, 0x764e681d00000000, 0xf397fec000000000, + 0xc6428ee700000000, 0x439b183a00000000, 0x8df7d28700000000, + 0x082e445a00000000, 0x5028372700000000, 0xd5f1a1fa00000000, + 0x1b9d6b4700000000, 0x9e44fd9a00000000, 0x71378a0900000000, + 0xf4ee1cd400000000, 0x3a82d66900000000, 0xbf5b40b400000000, + 0xe75d33c900000000, 0x6284a51400000000, 0xace86fa900000000, + 0x2931f97400000000, 0x1ce4895300000000, 0x993d1f8e00000000, + 0x5751d53300000000, 0xd28843ee00000000, 0x8a8e309300000000, + 0x0f57a64e00000000, 0xc13b6cf300000000, 0x44e2fa2e00000000, + 0x5edaf30e00000000, 0xdb0365d300000000, 0x156faf6e00000000, + 0x90b639b300000000, 0xc8b04ace00000000, 0x4d69dc1300000000, + 0x830516ae00000000, 0x06dc807300000000, 0x3309f05400000000, + 0xb6d0668900000000, 0x78bcac3400000000, 0xfd653ae900000000, + 0xa563499400000000, 0x20badf4900000000, 0xeed615f400000000, + 0x6b0f832900000000, 0x847cf4ba00000000, 0x01a5626700000000, + 0xcfc9a8da00000000, 0x4a103e0700000000, 0x12164d7a00000000, + 0x97cfdba700000000, 0x59a3111a00000000, 0xdc7a87c700000000, + 0xe9aff7e000000000, 0x6c76613d00000000, 0xa21aab8000000000, + 0x27c33d5d00000000, 0x7fc54e2000000000, 0xfa1cd8fd00000000, + 0x3470124000000000, 0xb1a9849d00000000, 0x17256aa000000000, + 0x92fcfc7d00000000, 0x5c9036c000000000, 0xd949a01d00000000, + 0x814fd36000000000, 0x049645bd00000000, 0xcafa8f0000000000, + 0x4f2319dd00000000, 0x7af669fa00000000, 0xff2fff2700000000, + 0x3143359a00000000, 0xb49aa34700000000, 0xec9cd03a00000000, + 0x694546e700000000, 0xa7298c5a00000000, 0x22f01a8700000000, + 0xcd836d1400000000, 0x485afbc900000000, 0x8636317400000000, + 0x03efa7a900000000, 0x5be9d4d400000000, 0xde30420900000000, + 0x105c88b400000000, 0x95851e6900000000, 0xa0506e4e00000000, + 0x2589f89300000000, 0xebe5322e00000000, 0x6e3ca4f300000000, + 0x363ad78e00000000, 0xb3e3415300000000, 0x7d8f8bee00000000, + 0xf8561d3300000000, 0xe26e141300000000, 0x67b782ce00000000, + 0xa9db487300000000, 0x2c02deae00000000, 0x7404add300000000, + 0xf1dd3b0e00000000, 0x3fb1f1b300000000, 0xba68676e00000000, + 0x8fbd174900000000, 0x0a64819400000000, 0xc4084b2900000000, + 0x41d1ddf400000000, 0x19d7ae8900000000, 0x9c0e385400000000, + 0x5262f2e900000000, 0xd7bb643400000000, 0x38c813a700000000, + 0xbd11857a00000000, 0x737d4fc700000000, 0xf6a4d91a00000000, + 0xaea2aa6700000000, 0x2b7b3cba00000000, 0xe517f60700000000, + 0x60ce60da00000000, 0x551b10fd00000000, 0xd0c2862000000000, + 0x1eae4c9d00000000, 0x9b77da4000000000, 0xc371a93d00000000, + 0x46a83fe000000000, 0x88c4f55d00000000, 0x0d1d638000000000, + 0xbcb4e71d00000000, 0x396d71c000000000, 0xf701bb7d00000000, + 0x72d82da000000000, 0x2ade5edd00000000, 0xaf07c80000000000, + 0x616b02bd00000000, 0xe4b2946000000000, 0xd167e44700000000, + 0x54be729a00000000, 0x9ad2b82700000000, 0x1f0b2efa00000000, + 0x470d5d8700000000, 0xc2d4cb5a00000000, 0x0cb801e700000000, + 0x8961973a00000000, 0x6612e0a900000000, 0xe3cb767400000000, + 0x2da7bcc900000000, 0xa87e2a1400000000, 0xf078596900000000, + 0x75a1cfb400000000, 0xbbcd050900000000, 0x3e1493d400000000, + 0x0bc1e3f300000000, 0x8e18752e00000000, 0x4074bf9300000000, + 0xc5ad294e00000000, 0x9dab5a3300000000, 0x1872ccee00000000, + 0xd61e065300000000, 0x53c7908e00000000, 0x49ff99ae00000000, + 0xcc260f7300000000, 0x024ac5ce00000000, 0x8793531300000000, + 0xdf95206e00000000, 0x5a4cb6b300000000, 0x94207c0e00000000, + 0x11f9ead300000000, 0x242c9af400000000, 0xa1f50c2900000000, + 0x6f99c69400000000, 0xea40504900000000, 0xb246233400000000, + 0x379fb5e900000000, 0xf9f37f5400000000, 0x7c2ae98900000000, + 0x93599e1a00000000, 0x168008c700000000, 0xd8ecc27a00000000, + 0x5d3554a700000000, 0x053327da00000000, 0x80eab10700000000, + 0x4e867bba00000000, 0xcb5fed6700000000, 0xfe8a9d4000000000, + 0x7b530b9d00000000, 0xb53fc12000000000, 0x30e657fd00000000, + 0x68e0248000000000, 0xed39b25d00000000, 0x235578e000000000, + 0xa68cee3d00000000}, + {0x0000000000000000, 0x76e10f9d00000000, 0xadc46ee100000000, + 0xdb25617c00000000, 0x1b8fac1900000000, 0x6d6ea38400000000, + 0xb64bc2f800000000, 0xc0aacd6500000000, 0x361e593300000000, + 0x40ff56ae00000000, 0x9bda37d200000000, 0xed3b384f00000000, + 0x2d91f52a00000000, 0x5b70fab700000000, 0x80559bcb00000000, + 0xf6b4945600000000, 0x6c3cb26600000000, 0x1addbdfb00000000, + 0xc1f8dc8700000000, 0xb719d31a00000000, 0x77b31e7f00000000, + 0x015211e200000000, 0xda77709e00000000, 0xac967f0300000000, + 0x5a22eb5500000000, 0x2cc3e4c800000000, 0xf7e685b400000000, + 0x81078a2900000000, 0x41ad474c00000000, 0x374c48d100000000, + 0xec6929ad00000000, 0x9a88263000000000, 0xd87864cd00000000, + 0xae996b5000000000, 0x75bc0a2c00000000, 0x035d05b100000000, + 0xc3f7c8d400000000, 0xb516c74900000000, 0x6e33a63500000000, + 0x18d2a9a800000000, 0xee663dfe00000000, 0x9887326300000000, + 0x43a2531f00000000, 0x35435c8200000000, 0xf5e991e700000000, + 0x83089e7a00000000, 0x582dff0600000000, 0x2eccf09b00000000, + 0xb444d6ab00000000, 0xc2a5d93600000000, 0x1980b84a00000000, + 0x6f61b7d700000000, 0xafcb7ab200000000, 0xd92a752f00000000, + 0x020f145300000000, 0x74ee1bce00000000, 0x825a8f9800000000, + 0xf4bb800500000000, 0x2f9ee17900000000, 0x597feee400000000, + 0x99d5238100000000, 0xef342c1c00000000, 0x34114d6000000000, + 0x42f042fd00000000, 0xf1f7b94100000000, 0x8716b6dc00000000, + 0x5c33d7a000000000, 0x2ad2d83d00000000, 0xea78155800000000, + 0x9c991ac500000000, 0x47bc7bb900000000, 0x315d742400000000, + 0xc7e9e07200000000, 0xb108efef00000000, 0x6a2d8e9300000000, + 0x1ccc810e00000000, 0xdc664c6b00000000, 0xaa8743f600000000, + 0x71a2228a00000000, 0x07432d1700000000, 0x9dcb0b2700000000, + 0xeb2a04ba00000000, 0x300f65c600000000, 0x46ee6a5b00000000, + 0x8644a73e00000000, 0xf0a5a8a300000000, 0x2b80c9df00000000, + 0x5d61c64200000000, 0xabd5521400000000, 0xdd345d8900000000, + 0x06113cf500000000, 0x70f0336800000000, 0xb05afe0d00000000, + 0xc6bbf19000000000, 0x1d9e90ec00000000, 0x6b7f9f7100000000, + 0x298fdd8c00000000, 0x5f6ed21100000000, 0x844bb36d00000000, + 0xf2aabcf000000000, 0x3200719500000000, 0x44e17e0800000000, + 0x9fc41f7400000000, 0xe92510e900000000, 0x1f9184bf00000000, + 0x69708b2200000000, 0xb255ea5e00000000, 0xc4b4e5c300000000, + 0x041e28a600000000, 0x72ff273b00000000, 0xa9da464700000000, + 0xdf3b49da00000000, 0x45b36fea00000000, 0x3352607700000000, + 0xe877010b00000000, 0x9e960e9600000000, 0x5e3cc3f300000000, + 0x28ddcc6e00000000, 0xf3f8ad1200000000, 0x8519a28f00000000, + 0x73ad36d900000000, 0x054c394400000000, 0xde69583800000000, + 0xa88857a500000000, 0x68229ac000000000, 0x1ec3955d00000000, + 0xc5e6f42100000000, 0xb307fbbc00000000, 0xe2ef738300000000, + 0x940e7c1e00000000, 0x4f2b1d6200000000, 0x39ca12ff00000000, + 0xf960df9a00000000, 0x8f81d00700000000, 0x54a4b17b00000000, + 0x2245bee600000000, 0xd4f12ab000000000, 0xa210252d00000000, + 0x7935445100000000, 0x0fd44bcc00000000, 0xcf7e86a900000000, + 0xb99f893400000000, 0x62bae84800000000, 0x145be7d500000000, + 0x8ed3c1e500000000, 0xf832ce7800000000, 0x2317af0400000000, + 0x55f6a09900000000, 0x955c6dfc00000000, 0xe3bd626100000000, + 0x3898031d00000000, 0x4e790c8000000000, 0xb8cd98d600000000, + 0xce2c974b00000000, 0x1509f63700000000, 0x63e8f9aa00000000, + 0xa34234cf00000000, 0xd5a33b5200000000, 0x0e865a2e00000000, + 0x786755b300000000, 0x3a97174e00000000, 0x4c7618d300000000, + 0x975379af00000000, 0xe1b2763200000000, 0x2118bb5700000000, + 0x57f9b4ca00000000, 0x8cdcd5b600000000, 0xfa3dda2b00000000, + 0x0c894e7d00000000, 0x7a6841e000000000, 0xa14d209c00000000, + 0xd7ac2f0100000000, 0x1706e26400000000, 0x61e7edf900000000, + 0xbac28c8500000000, 0xcc23831800000000, 0x56aba52800000000, + 0x204aaab500000000, 0xfb6fcbc900000000, 0x8d8ec45400000000, + 0x4d24093100000000, 0x3bc506ac00000000, 0xe0e067d000000000, + 0x9601684d00000000, 0x60b5fc1b00000000, 0x1654f38600000000, + 0xcd7192fa00000000, 0xbb909d6700000000, 0x7b3a500200000000, + 0x0ddb5f9f00000000, 0xd6fe3ee300000000, 0xa01f317e00000000, + 0x1318cac200000000, 0x65f9c55f00000000, 0xbedca42300000000, + 0xc83dabbe00000000, 0x089766db00000000, 0x7e76694600000000, + 0xa553083a00000000, 0xd3b207a700000000, 0x250693f100000000, + 0x53e79c6c00000000, 0x88c2fd1000000000, 0xfe23f28d00000000, + 0x3e893fe800000000, 0x4868307500000000, 0x934d510900000000, + 0xe5ac5e9400000000, 0x7f2478a400000000, 0x09c5773900000000, + 0xd2e0164500000000, 0xa40119d800000000, 0x64abd4bd00000000, + 0x124adb2000000000, 0xc96fba5c00000000, 0xbf8eb5c100000000, + 0x493a219700000000, 0x3fdb2e0a00000000, 0xe4fe4f7600000000, + 0x921f40eb00000000, 0x52b58d8e00000000, 0x2454821300000000, + 0xff71e36f00000000, 0x8990ecf200000000, 0xcb60ae0f00000000, + 0xbd81a19200000000, 0x66a4c0ee00000000, 0x1045cf7300000000, + 0xd0ef021600000000, 0xa60e0d8b00000000, 0x7d2b6cf700000000, + 0x0bca636a00000000, 0xfd7ef73c00000000, 0x8b9ff8a100000000, + 0x50ba99dd00000000, 0x265b964000000000, 0xe6f15b2500000000, + 0x901054b800000000, 0x4b3535c400000000, 0x3dd43a5900000000, + 0xa75c1c6900000000, 0xd1bd13f400000000, 0x0a98728800000000, + 0x7c797d1500000000, 0xbcd3b07000000000, 0xca32bfed00000000, + 0x1117de9100000000, 0x67f6d10c00000000, 0x9142455a00000000, + 0xe7a34ac700000000, 0x3c862bbb00000000, 0x4a67242600000000, + 0x8acde94300000000, 0xfc2ce6de00000000, 0x270987a200000000, + 0x51e8883f00000000}, + {0x0000000000000000, 0xe8dbfbb900000000, 0x91b186a800000000, + 0x796a7d1100000000, 0x63657c8a00000000, 0x8bbe873300000000, + 0xf2d4fa2200000000, 0x1a0f019b00000000, 0x87cc89cf00000000, + 0x6f17727600000000, 0x167d0f6700000000, 0xfea6f4de00000000, + 0xe4a9f54500000000, 0x0c720efc00000000, 0x751873ed00000000, + 0x9dc3885400000000, 0x4f9f624400000000, 0xa74499fd00000000, + 0xde2ee4ec00000000, 0x36f51f5500000000, 0x2cfa1ece00000000, + 0xc421e57700000000, 0xbd4b986600000000, 0x559063df00000000, + 0xc853eb8b00000000, 0x2088103200000000, 0x59e26d2300000000, + 0xb139969a00000000, 0xab36970100000000, 0x43ed6cb800000000, + 0x3a8711a900000000, 0xd25cea1000000000, 0x9e3ec58800000000, + 0x76e53e3100000000, 0x0f8f432000000000, 0xe754b89900000000, + 0xfd5bb90200000000, 0x158042bb00000000, 0x6cea3faa00000000, + 0x8431c41300000000, 0x19f24c4700000000, 0xf129b7fe00000000, + 0x8843caef00000000, 0x6098315600000000, 0x7a9730cd00000000, + 0x924ccb7400000000, 0xeb26b66500000000, 0x03fd4ddc00000000, + 0xd1a1a7cc00000000, 0x397a5c7500000000, 0x4010216400000000, + 0xa8cbdadd00000000, 0xb2c4db4600000000, 0x5a1f20ff00000000, + 0x23755dee00000000, 0xcbaea65700000000, 0x566d2e0300000000, + 0xbeb6d5ba00000000, 0xc7dca8ab00000000, 0x2f07531200000000, + 0x3508528900000000, 0xddd3a93000000000, 0xa4b9d42100000000, + 0x4c622f9800000000, 0x7d7bfbca00000000, 0x95a0007300000000, + 0xecca7d6200000000, 0x041186db00000000, 0x1e1e874000000000, + 0xf6c57cf900000000, 0x8faf01e800000000, 0x6774fa5100000000, + 0xfab7720500000000, 0x126c89bc00000000, 0x6b06f4ad00000000, + 0x83dd0f1400000000, 0x99d20e8f00000000, 0x7109f53600000000, + 0x0863882700000000, 0xe0b8739e00000000, 0x32e4998e00000000, + 0xda3f623700000000, 0xa3551f2600000000, 0x4b8ee49f00000000, + 0x5181e50400000000, 0xb95a1ebd00000000, 0xc03063ac00000000, + 0x28eb981500000000, 0xb528104100000000, 0x5df3ebf800000000, + 0x249996e900000000, 0xcc426d5000000000, 0xd64d6ccb00000000, + 0x3e96977200000000, 0x47fcea6300000000, 0xaf2711da00000000, + 0xe3453e4200000000, 0x0b9ec5fb00000000, 0x72f4b8ea00000000, + 0x9a2f435300000000, 0x802042c800000000, 0x68fbb97100000000, + 0x1191c46000000000, 0xf94a3fd900000000, 0x6489b78d00000000, + 0x8c524c3400000000, 0xf538312500000000, 0x1de3ca9c00000000, + 0x07eccb0700000000, 0xef3730be00000000, 0x965d4daf00000000, + 0x7e86b61600000000, 0xacda5c0600000000, 0x4401a7bf00000000, + 0x3d6bdaae00000000, 0xd5b0211700000000, 0xcfbf208c00000000, + 0x2764db3500000000, 0x5e0ea62400000000, 0xb6d55d9d00000000, + 0x2b16d5c900000000, 0xc3cd2e7000000000, 0xbaa7536100000000, + 0x527ca8d800000000, 0x4873a94300000000, 0xa0a852fa00000000, + 0xd9c22feb00000000, 0x3119d45200000000, 0xbbf0874e00000000, + 0x532b7cf700000000, 0x2a4101e600000000, 0xc29afa5f00000000, + 0xd895fbc400000000, 0x304e007d00000000, 0x49247d6c00000000, + 0xa1ff86d500000000, 0x3c3c0e8100000000, 0xd4e7f53800000000, + 0xad8d882900000000, 0x4556739000000000, 0x5f59720b00000000, + 0xb78289b200000000, 0xcee8f4a300000000, 0x26330f1a00000000, + 0xf46fe50a00000000, 0x1cb41eb300000000, 0x65de63a200000000, + 0x8d05981b00000000, 0x970a998000000000, 0x7fd1623900000000, + 0x06bb1f2800000000, 0xee60e49100000000, 0x73a36cc500000000, + 0x9b78977c00000000, 0xe212ea6d00000000, 0x0ac911d400000000, + 0x10c6104f00000000, 0xf81debf600000000, 0x817796e700000000, + 0x69ac6d5e00000000, 0x25ce42c600000000, 0xcd15b97f00000000, + 0xb47fc46e00000000, 0x5ca43fd700000000, 0x46ab3e4c00000000, + 0xae70c5f500000000, 0xd71ab8e400000000, 0x3fc1435d00000000, + 0xa202cb0900000000, 0x4ad930b000000000, 0x33b34da100000000, + 0xdb68b61800000000, 0xc167b78300000000, 0x29bc4c3a00000000, + 0x50d6312b00000000, 0xb80dca9200000000, 0x6a51208200000000, + 0x828adb3b00000000, 0xfbe0a62a00000000, 0x133b5d9300000000, + 0x09345c0800000000, 0xe1efa7b100000000, 0x9885daa000000000, + 0x705e211900000000, 0xed9da94d00000000, 0x054652f400000000, + 0x7c2c2fe500000000, 0x94f7d45c00000000, 0x8ef8d5c700000000, + 0x66232e7e00000000, 0x1f49536f00000000, 0xf792a8d600000000, + 0xc68b7c8400000000, 0x2e50873d00000000, 0x573afa2c00000000, + 0xbfe1019500000000, 0xa5ee000e00000000, 0x4d35fbb700000000, + 0x345f86a600000000, 0xdc847d1f00000000, 0x4147f54b00000000, + 0xa99c0ef200000000, 0xd0f673e300000000, 0x382d885a00000000, + 0x222289c100000000, 0xcaf9727800000000, 0xb3930f6900000000, + 0x5b48f4d000000000, 0x89141ec000000000, 0x61cfe57900000000, + 0x18a5986800000000, 0xf07e63d100000000, 0xea71624a00000000, + 0x02aa99f300000000, 0x7bc0e4e200000000, 0x931b1f5b00000000, + 0x0ed8970f00000000, 0xe6036cb600000000, 0x9f6911a700000000, + 0x77b2ea1e00000000, 0x6dbdeb8500000000, 0x8566103c00000000, + 0xfc0c6d2d00000000, 0x14d7969400000000, 0x58b5b90c00000000, + 0xb06e42b500000000, 0xc9043fa400000000, 0x21dfc41d00000000, + 0x3bd0c58600000000, 0xd30b3e3f00000000, 0xaa61432e00000000, + 0x42bab89700000000, 0xdf7930c300000000, 0x37a2cb7a00000000, + 0x4ec8b66b00000000, 0xa6134dd200000000, 0xbc1c4c4900000000, + 0x54c7b7f000000000, 0x2dadcae100000000, 0xc576315800000000, + 0x172adb4800000000, 0xfff120f100000000, 0x869b5de000000000, + 0x6e40a65900000000, 0x744fa7c200000000, 0x9c945c7b00000000, + 0xe5fe216a00000000, 0x0d25dad300000000, 0x90e6528700000000, + 0x783da93e00000000, 0x0157d42f00000000, 0xe98c2f9600000000, + 0xf3832e0d00000000, 0x1b58d5b400000000, 0x6232a8a500000000, + 0x8ae9531c00000000}, + {0x0000000000000000, 0x919168ae00000000, 0x6325a08700000000, + 0xf2b4c82900000000, 0x874c31d400000000, 0x16dd597a00000000, + 0xe469915300000000, 0x75f8f9fd00000000, 0x4f9f137300000000, + 0xde0e7bdd00000000, 0x2cbab3f400000000, 0xbd2bdb5a00000000, + 0xc8d322a700000000, 0x59424a0900000000, 0xabf6822000000000, + 0x3a67ea8e00000000, 0x9e3e27e600000000, 0x0faf4f4800000000, + 0xfd1b876100000000, 0x6c8aefcf00000000, 0x1972163200000000, + 0x88e37e9c00000000, 0x7a57b6b500000000, 0xebc6de1b00000000, + 0xd1a1349500000000, 0x40305c3b00000000, 0xb284941200000000, + 0x2315fcbc00000000, 0x56ed054100000000, 0xc77c6def00000000, + 0x35c8a5c600000000, 0xa459cd6800000000, 0x7d7b3f1700000000, + 0xecea57b900000000, 0x1e5e9f9000000000, 0x8fcff73e00000000, + 0xfa370ec300000000, 0x6ba6666d00000000, 0x9912ae4400000000, + 0x0883c6ea00000000, 0x32e42c6400000000, 0xa37544ca00000000, + 0x51c18ce300000000, 0xc050e44d00000000, 0xb5a81db000000000, + 0x2439751e00000000, 0xd68dbd3700000000, 0x471cd59900000000, + 0xe34518f100000000, 0x72d4705f00000000, 0x8060b87600000000, + 0x11f1d0d800000000, 0x6409292500000000, 0xf598418b00000000, + 0x072c89a200000000, 0x96bde10c00000000, 0xacda0b8200000000, + 0x3d4b632c00000000, 0xcfffab0500000000, 0x5e6ec3ab00000000, + 0x2b963a5600000000, 0xba0752f800000000, 0x48b39ad100000000, + 0xd922f27f00000000, 0xfaf67e2e00000000, 0x6b67168000000000, + 0x99d3dea900000000, 0x0842b60700000000, 0x7dba4ffa00000000, + 0xec2b275400000000, 0x1e9fef7d00000000, 0x8f0e87d300000000, + 0xb5696d5d00000000, 0x24f805f300000000, 0xd64ccdda00000000, + 0x47dda57400000000, 0x32255c8900000000, 0xa3b4342700000000, + 0x5100fc0e00000000, 0xc09194a000000000, 0x64c859c800000000, + 0xf559316600000000, 0x07edf94f00000000, 0x967c91e100000000, + 0xe384681c00000000, 0x721500b200000000, 0x80a1c89b00000000, + 0x1130a03500000000, 0x2b574abb00000000, 0xbac6221500000000, + 0x4872ea3c00000000, 0xd9e3829200000000, 0xac1b7b6f00000000, + 0x3d8a13c100000000, 0xcf3edbe800000000, 0x5eafb34600000000, + 0x878d413900000000, 0x161c299700000000, 0xe4a8e1be00000000, + 0x7539891000000000, 0x00c170ed00000000, 0x9150184300000000, + 0x63e4d06a00000000, 0xf275b8c400000000, 0xc812524a00000000, + 0x59833ae400000000, 0xab37f2cd00000000, 0x3aa69a6300000000, + 0x4f5e639e00000000, 0xdecf0b3000000000, 0x2c7bc31900000000, + 0xbdeaabb700000000, 0x19b366df00000000, 0x88220e7100000000, + 0x7a96c65800000000, 0xeb07aef600000000, 0x9eff570b00000000, + 0x0f6e3fa500000000, 0xfddaf78c00000000, 0x6c4b9f2200000000, + 0x562c75ac00000000, 0xc7bd1d0200000000, 0x3509d52b00000000, + 0xa498bd8500000000, 0xd160447800000000, 0x40f12cd600000000, + 0xb245e4ff00000000, 0x23d48c5100000000, 0xf4edfd5c00000000, + 0x657c95f200000000, 0x97c85ddb00000000, 0x0659357500000000, + 0x73a1cc8800000000, 0xe230a42600000000, 0x10846c0f00000000, + 0x811504a100000000, 0xbb72ee2f00000000, 0x2ae3868100000000, + 0xd8574ea800000000, 0x49c6260600000000, 0x3c3edffb00000000, + 0xadafb75500000000, 0x5f1b7f7c00000000, 0xce8a17d200000000, + 0x6ad3daba00000000, 0xfb42b21400000000, 0x09f67a3d00000000, + 0x9867129300000000, 0xed9feb6e00000000, 0x7c0e83c000000000, + 0x8eba4be900000000, 0x1f2b234700000000, 0x254cc9c900000000, + 0xb4dda16700000000, 0x4669694e00000000, 0xd7f801e000000000, + 0xa200f81d00000000, 0x339190b300000000, 0xc125589a00000000, + 0x50b4303400000000, 0x8996c24b00000000, 0x1807aae500000000, + 0xeab362cc00000000, 0x7b220a6200000000, 0x0edaf39f00000000, + 0x9f4b9b3100000000, 0x6dff531800000000, 0xfc6e3bb600000000, + 0xc609d13800000000, 0x5798b99600000000, 0xa52c71bf00000000, + 0x34bd191100000000, 0x4145e0ec00000000, 0xd0d4884200000000, + 0x2260406b00000000, 0xb3f128c500000000, 0x17a8e5ad00000000, + 0x86398d0300000000, 0x748d452a00000000, 0xe51c2d8400000000, + 0x90e4d47900000000, 0x0175bcd700000000, 0xf3c174fe00000000, + 0x62501c5000000000, 0x5837f6de00000000, 0xc9a69e7000000000, + 0x3b12565900000000, 0xaa833ef700000000, 0xdf7bc70a00000000, + 0x4eeaafa400000000, 0xbc5e678d00000000, 0x2dcf0f2300000000, + 0x0e1b837200000000, 0x9f8aebdc00000000, 0x6d3e23f500000000, + 0xfcaf4b5b00000000, 0x8957b2a600000000, 0x18c6da0800000000, + 0xea72122100000000, 0x7be37a8f00000000, 0x4184900100000000, + 0xd015f8af00000000, 0x22a1308600000000, 0xb330582800000000, + 0xc6c8a1d500000000, 0x5759c97b00000000, 0xa5ed015200000000, + 0x347c69fc00000000, 0x9025a49400000000, 0x01b4cc3a00000000, + 0xf300041300000000, 0x62916cbd00000000, 0x1769954000000000, + 0x86f8fdee00000000, 0x744c35c700000000, 0xe5dd5d6900000000, + 0xdfbab7e700000000, 0x4e2bdf4900000000, 0xbc9f176000000000, + 0x2d0e7fce00000000, 0x58f6863300000000, 0xc967ee9d00000000, + 0x3bd326b400000000, 0xaa424e1a00000000, 0x7360bc6500000000, + 0xe2f1d4cb00000000, 0x10451ce200000000, 0x81d4744c00000000, + 0xf42c8db100000000, 0x65bde51f00000000, 0x97092d3600000000, + 0x0698459800000000, 0x3cffaf1600000000, 0xad6ec7b800000000, + 0x5fda0f9100000000, 0xce4b673f00000000, 0xbbb39ec200000000, + 0x2a22f66c00000000, 0xd8963e4500000000, 0x490756eb00000000, + 0xed5e9b8300000000, 0x7ccff32d00000000, 0x8e7b3b0400000000, + 0x1fea53aa00000000, 0x6a12aa5700000000, 0xfb83c2f900000000, + 0x09370ad000000000, 0x98a6627e00000000, 0xa2c188f000000000, + 0x3350e05e00000000, 0xc1e4287700000000, 0x507540d900000000, + 0x258db92400000000, 0xb41cd18a00000000, 0x46a819a300000000, + 0xd739710d00000000}}; + +#else /* W == 4 */ + +local const z_crc_t FAR crc_braid_table[][256] = { + {0x00000000, 0xccaa009e, 0x4225077d, 0x8e8f07e3, 0x844a0efa, + 0x48e00e64, 0xc66f0987, 0x0ac50919, 0xd3e51bb5, 0x1f4f1b2b, + 0x91c01cc8, 0x5d6a1c56, 0x57af154f, 0x9b0515d1, 0x158a1232, + 0xd92012ac, 0x7cbb312b, 0xb01131b5, 0x3e9e3656, 0xf23436c8, + 0xf8f13fd1, 0x345b3f4f, 0xbad438ac, 0x767e3832, 0xaf5e2a9e, + 0x63f42a00, 0xed7b2de3, 0x21d12d7d, 0x2b142464, 0xe7be24fa, + 0x69312319, 0xa59b2387, 0xf9766256, 0x35dc62c8, 0xbb53652b, + 0x77f965b5, 0x7d3c6cac, 0xb1966c32, 0x3f196bd1, 0xf3b36b4f, + 0x2a9379e3, 0xe639797d, 0x68b67e9e, 0xa41c7e00, 0xaed97719, + 0x62737787, 0xecfc7064, 0x205670fa, 0x85cd537d, 0x496753e3, + 0xc7e85400, 0x0b42549e, 0x01875d87, 0xcd2d5d19, 0x43a25afa, + 0x8f085a64, 0x562848c8, 0x9a824856, 0x140d4fb5, 0xd8a74f2b, + 0xd2624632, 0x1ec846ac, 0x9047414f, 0x5ced41d1, 0x299dc2ed, + 0xe537c273, 0x6bb8c590, 0xa712c50e, 0xadd7cc17, 0x617dcc89, + 0xeff2cb6a, 0x2358cbf4, 0xfa78d958, 0x36d2d9c6, 0xb85dde25, + 0x74f7debb, 0x7e32d7a2, 0xb298d73c, 0x3c17d0df, 0xf0bdd041, + 0x5526f3c6, 0x998cf358, 0x1703f4bb, 0xdba9f425, 0xd16cfd3c, + 0x1dc6fda2, 0x9349fa41, 0x5fe3fadf, 0x86c3e873, 0x4a69e8ed, + 0xc4e6ef0e, 0x084cef90, 0x0289e689, 0xce23e617, 0x40ace1f4, + 0x8c06e16a, 0xd0eba0bb, 0x1c41a025, 0x92cea7c6, 0x5e64a758, + 0x54a1ae41, 0x980baedf, 0x1684a93c, 0xda2ea9a2, 0x030ebb0e, + 0xcfa4bb90, 0x412bbc73, 0x8d81bced, 0x8744b5f4, 0x4beeb56a, + 0xc561b289, 0x09cbb217, 0xac509190, 0x60fa910e, 0xee7596ed, + 0x22df9673, 0x281a9f6a, 0xe4b09ff4, 0x6a3f9817, 0xa6959889, + 0x7fb58a25, 0xb31f8abb, 0x3d908d58, 0xf13a8dc6, 0xfbff84df, + 0x37558441, 0xb9da83a2, 0x7570833c, 0x533b85da, 0x9f918544, + 0x111e82a7, 0xddb48239, 0xd7718b20, 0x1bdb8bbe, 0x95548c5d, + 0x59fe8cc3, 0x80de9e6f, 0x4c749ef1, 0xc2fb9912, 0x0e51998c, + 0x04949095, 0xc83e900b, 0x46b197e8, 0x8a1b9776, 0x2f80b4f1, + 0xe32ab46f, 0x6da5b38c, 0xa10fb312, 0xabcaba0b, 0x6760ba95, + 0xe9efbd76, 0x2545bde8, 0xfc65af44, 0x30cfafda, 0xbe40a839, + 0x72eaa8a7, 0x782fa1be, 0xb485a120, 0x3a0aa6c3, 0xf6a0a65d, + 0xaa4de78c, 0x66e7e712, 0xe868e0f1, 0x24c2e06f, 0x2e07e976, + 0xe2ade9e8, 0x6c22ee0b, 0xa088ee95, 0x79a8fc39, 0xb502fca7, + 0x3b8dfb44, 0xf727fbda, 0xfde2f2c3, 0x3148f25d, 0xbfc7f5be, + 0x736df520, 0xd6f6d6a7, 0x1a5cd639, 0x94d3d1da, 0x5879d144, + 0x52bcd85d, 0x9e16d8c3, 0x1099df20, 0xdc33dfbe, 0x0513cd12, + 0xc9b9cd8c, 0x4736ca6f, 0x8b9ccaf1, 0x8159c3e8, 0x4df3c376, + 0xc37cc495, 0x0fd6c40b, 0x7aa64737, 0xb60c47a9, 0x3883404a, + 0xf42940d4, 0xfeec49cd, 0x32464953, 0xbcc94eb0, 0x70634e2e, + 0xa9435c82, 0x65e95c1c, 0xeb665bff, 0x27cc5b61, 0x2d095278, + 0xe1a352e6, 0x6f2c5505, 0xa386559b, 0x061d761c, 0xcab77682, + 0x44387161, 0x889271ff, 0x825778e6, 0x4efd7878, 0xc0727f9b, + 0x0cd87f05, 0xd5f86da9, 0x19526d37, 0x97dd6ad4, 0x5b776a4a, + 0x51b26353, 0x9d1863cd, 0x1397642e, 0xdf3d64b0, 0x83d02561, + 0x4f7a25ff, 0xc1f5221c, 0x0d5f2282, 0x079a2b9b, 0xcb302b05, + 0x45bf2ce6, 0x89152c78, 0x50353ed4, 0x9c9f3e4a, 0x121039a9, + 0xdeba3937, 0xd47f302e, 0x18d530b0, 0x965a3753, 0x5af037cd, + 0xff6b144a, 0x33c114d4, 0xbd4e1337, 0x71e413a9, 0x7b211ab0, + 0xb78b1a2e, 0x39041dcd, 0xf5ae1d53, 0x2c8e0fff, 0xe0240f61, + 0x6eab0882, 0xa201081c, 0xa8c40105, 0x646e019b, 0xeae10678, + 0x264b06e6}, + {0x00000000, 0xa6770bb4, 0x979f1129, 0x31e81a9d, 0xf44f2413, + 0x52382fa7, 0x63d0353a, 0xc5a73e8e, 0x33ef4e67, 0x959845d3, + 0xa4705f4e, 0x020754fa, 0xc7a06a74, 0x61d761c0, 0x503f7b5d, + 0xf64870e9, 0x67de9cce, 0xc1a9977a, 0xf0418de7, 0x56368653, + 0x9391b8dd, 0x35e6b369, 0x040ea9f4, 0xa279a240, 0x5431d2a9, + 0xf246d91d, 0xc3aec380, 0x65d9c834, 0xa07ef6ba, 0x0609fd0e, + 0x37e1e793, 0x9196ec27, 0xcfbd399c, 0x69ca3228, 0x582228b5, + 0xfe552301, 0x3bf21d8f, 0x9d85163b, 0xac6d0ca6, 0x0a1a0712, + 0xfc5277fb, 0x5a257c4f, 0x6bcd66d2, 0xcdba6d66, 0x081d53e8, + 0xae6a585c, 0x9f8242c1, 0x39f54975, 0xa863a552, 0x0e14aee6, + 0x3ffcb47b, 0x998bbfcf, 0x5c2c8141, 0xfa5b8af5, 0xcbb39068, + 0x6dc49bdc, 0x9b8ceb35, 0x3dfbe081, 0x0c13fa1c, 0xaa64f1a8, + 0x6fc3cf26, 0xc9b4c492, 0xf85cde0f, 0x5e2bd5bb, 0x440b7579, + 0xe27c7ecd, 0xd3946450, 0x75e36fe4, 0xb044516a, 0x16335ade, + 0x27db4043, 0x81ac4bf7, 0x77e43b1e, 0xd19330aa, 0xe07b2a37, + 0x460c2183, 0x83ab1f0d, 0x25dc14b9, 0x14340e24, 0xb2430590, + 0x23d5e9b7, 0x85a2e203, 0xb44af89e, 0x123df32a, 0xd79acda4, + 0x71edc610, 0x4005dc8d, 0xe672d739, 0x103aa7d0, 0xb64dac64, + 0x87a5b6f9, 0x21d2bd4d, 0xe47583c3, 0x42028877, 0x73ea92ea, + 0xd59d995e, 0x8bb64ce5, 0x2dc14751, 0x1c295dcc, 0xba5e5678, + 0x7ff968f6, 0xd98e6342, 0xe86679df, 0x4e11726b, 0xb8590282, + 0x1e2e0936, 0x2fc613ab, 0x89b1181f, 0x4c162691, 0xea612d25, + 0xdb8937b8, 0x7dfe3c0c, 0xec68d02b, 0x4a1fdb9f, 0x7bf7c102, + 0xdd80cab6, 0x1827f438, 0xbe50ff8c, 0x8fb8e511, 0x29cfeea5, + 0xdf879e4c, 0x79f095f8, 0x48188f65, 0xee6f84d1, 0x2bc8ba5f, + 0x8dbfb1eb, 0xbc57ab76, 0x1a20a0c2, 0x8816eaf2, 0x2e61e146, + 0x1f89fbdb, 0xb9fef06f, 0x7c59cee1, 0xda2ec555, 0xebc6dfc8, + 0x4db1d47c, 0xbbf9a495, 0x1d8eaf21, 0x2c66b5bc, 0x8a11be08, + 0x4fb68086, 0xe9c18b32, 0xd82991af, 0x7e5e9a1b, 0xefc8763c, + 0x49bf7d88, 0x78576715, 0xde206ca1, 0x1b87522f, 0xbdf0599b, + 0x8c184306, 0x2a6f48b2, 0xdc27385b, 0x7a5033ef, 0x4bb82972, + 0xedcf22c6, 0x28681c48, 0x8e1f17fc, 0xbff70d61, 0x198006d5, + 0x47abd36e, 0xe1dcd8da, 0xd034c247, 0x7643c9f3, 0xb3e4f77d, + 0x1593fcc9, 0x247be654, 0x820cede0, 0x74449d09, 0xd23396bd, + 0xe3db8c20, 0x45ac8794, 0x800bb91a, 0x267cb2ae, 0x1794a833, + 0xb1e3a387, 0x20754fa0, 0x86024414, 0xb7ea5e89, 0x119d553d, + 0xd43a6bb3, 0x724d6007, 0x43a57a9a, 0xe5d2712e, 0x139a01c7, + 0xb5ed0a73, 0x840510ee, 0x22721b5a, 0xe7d525d4, 0x41a22e60, + 0x704a34fd, 0xd63d3f49, 0xcc1d9f8b, 0x6a6a943f, 0x5b828ea2, + 0xfdf58516, 0x3852bb98, 0x9e25b02c, 0xafcdaab1, 0x09baa105, + 0xfff2d1ec, 0x5985da58, 0x686dc0c5, 0xce1acb71, 0x0bbdf5ff, + 0xadcafe4b, 0x9c22e4d6, 0x3a55ef62, 0xabc30345, 0x0db408f1, + 0x3c5c126c, 0x9a2b19d8, 0x5f8c2756, 0xf9fb2ce2, 0xc813367f, + 0x6e643dcb, 0x982c4d22, 0x3e5b4696, 0x0fb35c0b, 0xa9c457bf, + 0x6c636931, 0xca146285, 0xfbfc7818, 0x5d8b73ac, 0x03a0a617, + 0xa5d7ada3, 0x943fb73e, 0x3248bc8a, 0xf7ef8204, 0x519889b0, + 0x6070932d, 0xc6079899, 0x304fe870, 0x9638e3c4, 0xa7d0f959, + 0x01a7f2ed, 0xc400cc63, 0x6277c7d7, 0x539fdd4a, 0xf5e8d6fe, + 0x647e3ad9, 0xc209316d, 0xf3e12bf0, 0x55962044, 0x90311eca, + 0x3646157e, 0x07ae0fe3, 0xa1d90457, 0x579174be, 0xf1e67f0a, + 0xc00e6597, 0x66796e23, 0xa3de50ad, 0x05a95b19, 0x34414184, + 0x92364a30}, + {0x00000000, 0xcb5cd3a5, 0x4dc8a10b, 0x869472ae, 0x9b914216, + 0x50cd91b3, 0xd659e31d, 0x1d0530b8, 0xec53826d, 0x270f51c8, + 0xa19b2366, 0x6ac7f0c3, 0x77c2c07b, 0xbc9e13de, 0x3a0a6170, + 0xf156b2d5, 0x03d6029b, 0xc88ad13e, 0x4e1ea390, 0x85427035, + 0x9847408d, 0x531b9328, 0xd58fe186, 0x1ed33223, 0xef8580f6, + 0x24d95353, 0xa24d21fd, 0x6911f258, 0x7414c2e0, 0xbf481145, + 0x39dc63eb, 0xf280b04e, 0x07ac0536, 0xccf0d693, 0x4a64a43d, + 0x81387798, 0x9c3d4720, 0x57619485, 0xd1f5e62b, 0x1aa9358e, + 0xebff875b, 0x20a354fe, 0xa6372650, 0x6d6bf5f5, 0x706ec54d, + 0xbb3216e8, 0x3da66446, 0xf6fab7e3, 0x047a07ad, 0xcf26d408, + 0x49b2a6a6, 0x82ee7503, 0x9feb45bb, 0x54b7961e, 0xd223e4b0, + 0x197f3715, 0xe82985c0, 0x23755665, 0xa5e124cb, 0x6ebdf76e, + 0x73b8c7d6, 0xb8e41473, 0x3e7066dd, 0xf52cb578, 0x0f580a6c, + 0xc404d9c9, 0x4290ab67, 0x89cc78c2, 0x94c9487a, 0x5f959bdf, + 0xd901e971, 0x125d3ad4, 0xe30b8801, 0x28575ba4, 0xaec3290a, + 0x659ffaaf, 0x789aca17, 0xb3c619b2, 0x35526b1c, 0xfe0eb8b9, + 0x0c8e08f7, 0xc7d2db52, 0x4146a9fc, 0x8a1a7a59, 0x971f4ae1, + 0x5c439944, 0xdad7ebea, 0x118b384f, 0xe0dd8a9a, 0x2b81593f, + 0xad152b91, 0x6649f834, 0x7b4cc88c, 0xb0101b29, 0x36846987, + 0xfdd8ba22, 0x08f40f5a, 0xc3a8dcff, 0x453cae51, 0x8e607df4, + 0x93654d4c, 0x58399ee9, 0xdeadec47, 0x15f13fe2, 0xe4a78d37, + 0x2ffb5e92, 0xa96f2c3c, 0x6233ff99, 0x7f36cf21, 0xb46a1c84, + 0x32fe6e2a, 0xf9a2bd8f, 0x0b220dc1, 0xc07ede64, 0x46eaacca, + 0x8db67f6f, 0x90b34fd7, 0x5bef9c72, 0xdd7beedc, 0x16273d79, + 0xe7718fac, 0x2c2d5c09, 0xaab92ea7, 0x61e5fd02, 0x7ce0cdba, + 0xb7bc1e1f, 0x31286cb1, 0xfa74bf14, 0x1eb014d8, 0xd5ecc77d, + 0x5378b5d3, 0x98246676, 0x852156ce, 0x4e7d856b, 0xc8e9f7c5, + 0x03b52460, 0xf2e396b5, 0x39bf4510, 0xbf2b37be, 0x7477e41b, + 0x6972d4a3, 0xa22e0706, 0x24ba75a8, 0xefe6a60d, 0x1d661643, + 0xd63ac5e6, 0x50aeb748, 0x9bf264ed, 0x86f75455, 0x4dab87f0, + 0xcb3ff55e, 0x006326fb, 0xf135942e, 0x3a69478b, 0xbcfd3525, + 0x77a1e680, 0x6aa4d638, 0xa1f8059d, 0x276c7733, 0xec30a496, + 0x191c11ee, 0xd240c24b, 0x54d4b0e5, 0x9f886340, 0x828d53f8, + 0x49d1805d, 0xcf45f2f3, 0x04192156, 0xf54f9383, 0x3e134026, + 0xb8873288, 0x73dbe12d, 0x6eded195, 0xa5820230, 0x2316709e, + 0xe84aa33b, 0x1aca1375, 0xd196c0d0, 0x5702b27e, 0x9c5e61db, + 0x815b5163, 0x4a0782c6, 0xcc93f068, 0x07cf23cd, 0xf6999118, + 0x3dc542bd, 0xbb513013, 0x700de3b6, 0x6d08d30e, 0xa65400ab, + 0x20c07205, 0xeb9ca1a0, 0x11e81eb4, 0xdab4cd11, 0x5c20bfbf, + 0x977c6c1a, 0x8a795ca2, 0x41258f07, 0xc7b1fda9, 0x0ced2e0c, + 0xfdbb9cd9, 0x36e74f7c, 0xb0733dd2, 0x7b2fee77, 0x662adecf, + 0xad760d6a, 0x2be27fc4, 0xe0beac61, 0x123e1c2f, 0xd962cf8a, + 0x5ff6bd24, 0x94aa6e81, 0x89af5e39, 0x42f38d9c, 0xc467ff32, + 0x0f3b2c97, 0xfe6d9e42, 0x35314de7, 0xb3a53f49, 0x78f9ecec, + 0x65fcdc54, 0xaea00ff1, 0x28347d5f, 0xe368aefa, 0x16441b82, + 0xdd18c827, 0x5b8cba89, 0x90d0692c, 0x8dd55994, 0x46898a31, + 0xc01df89f, 0x0b412b3a, 0xfa1799ef, 0x314b4a4a, 0xb7df38e4, + 0x7c83eb41, 0x6186dbf9, 0xaada085c, 0x2c4e7af2, 0xe712a957, + 0x15921919, 0xdececabc, 0x585ab812, 0x93066bb7, 0x8e035b0f, + 0x455f88aa, 0xc3cbfa04, 0x089729a1, 0xf9c19b74, 0x329d48d1, + 0xb4093a7f, 0x7f55e9da, 0x6250d962, 0xa90c0ac7, 0x2f987869, + 0xe4c4abcc}, + {0x00000000, 0x3d6029b0, 0x7ac05360, 0x47a07ad0, 0xf580a6c0, + 0xc8e08f70, 0x8f40f5a0, 0xb220dc10, 0x30704bc1, 0x0d106271, + 0x4ab018a1, 0x77d03111, 0xc5f0ed01, 0xf890c4b1, 0xbf30be61, + 0x825097d1, 0x60e09782, 0x5d80be32, 0x1a20c4e2, 0x2740ed52, + 0x95603142, 0xa80018f2, 0xefa06222, 0xd2c04b92, 0x5090dc43, + 0x6df0f5f3, 0x2a508f23, 0x1730a693, 0xa5107a83, 0x98705333, + 0xdfd029e3, 0xe2b00053, 0xc1c12f04, 0xfca106b4, 0xbb017c64, + 0x866155d4, 0x344189c4, 0x0921a074, 0x4e81daa4, 0x73e1f314, + 0xf1b164c5, 0xccd14d75, 0x8b7137a5, 0xb6111e15, 0x0431c205, + 0x3951ebb5, 0x7ef19165, 0x4391b8d5, 0xa121b886, 0x9c419136, + 0xdbe1ebe6, 0xe681c256, 0x54a11e46, 0x69c137f6, 0x2e614d26, + 0x13016496, 0x9151f347, 0xac31daf7, 0xeb91a027, 0xd6f18997, + 0x64d15587, 0x59b17c37, 0x1e1106e7, 0x23712f57, 0x58f35849, + 0x659371f9, 0x22330b29, 0x1f532299, 0xad73fe89, 0x9013d739, + 0xd7b3ade9, 0xead38459, 0x68831388, 0x55e33a38, 0x124340e8, + 0x2f236958, 0x9d03b548, 0xa0639cf8, 0xe7c3e628, 0xdaa3cf98, + 0x3813cfcb, 0x0573e67b, 0x42d39cab, 0x7fb3b51b, 0xcd93690b, + 0xf0f340bb, 0xb7533a6b, 0x8a3313db, 0x0863840a, 0x3503adba, + 0x72a3d76a, 0x4fc3feda, 0xfde322ca, 0xc0830b7a, 0x872371aa, + 0xba43581a, 0x9932774d, 0xa4525efd, 0xe3f2242d, 0xde920d9d, + 0x6cb2d18d, 0x51d2f83d, 0x167282ed, 0x2b12ab5d, 0xa9423c8c, + 0x9422153c, 0xd3826fec, 0xeee2465c, 0x5cc29a4c, 0x61a2b3fc, + 0x2602c92c, 0x1b62e09c, 0xf9d2e0cf, 0xc4b2c97f, 0x8312b3af, + 0xbe729a1f, 0x0c52460f, 0x31326fbf, 0x7692156f, 0x4bf23cdf, + 0xc9a2ab0e, 0xf4c282be, 0xb362f86e, 0x8e02d1de, 0x3c220dce, + 0x0142247e, 0x46e25eae, 0x7b82771e, 0xb1e6b092, 0x8c869922, + 0xcb26e3f2, 0xf646ca42, 0x44661652, 0x79063fe2, 0x3ea64532, + 0x03c66c82, 0x8196fb53, 0xbcf6d2e3, 0xfb56a833, 0xc6368183, + 0x74165d93, 0x49767423, 0x0ed60ef3, 0x33b62743, 0xd1062710, + 0xec660ea0, 0xabc67470, 0x96a65dc0, 0x248681d0, 0x19e6a860, + 0x5e46d2b0, 0x6326fb00, 0xe1766cd1, 0xdc164561, 0x9bb63fb1, + 0xa6d61601, 0x14f6ca11, 0x2996e3a1, 0x6e369971, 0x5356b0c1, + 0x70279f96, 0x4d47b626, 0x0ae7ccf6, 0x3787e546, 0x85a73956, + 0xb8c710e6, 0xff676a36, 0xc2074386, 0x4057d457, 0x7d37fde7, + 0x3a978737, 0x07f7ae87, 0xb5d77297, 0x88b75b27, 0xcf1721f7, + 0xf2770847, 0x10c70814, 0x2da721a4, 0x6a075b74, 0x576772c4, + 0xe547aed4, 0xd8278764, 0x9f87fdb4, 0xa2e7d404, 0x20b743d5, + 0x1dd76a65, 0x5a7710b5, 0x67173905, 0xd537e515, 0xe857cca5, + 0xaff7b675, 0x92979fc5, 0xe915e8db, 0xd475c16b, 0x93d5bbbb, + 0xaeb5920b, 0x1c954e1b, 0x21f567ab, 0x66551d7b, 0x5b3534cb, + 0xd965a31a, 0xe4058aaa, 0xa3a5f07a, 0x9ec5d9ca, 0x2ce505da, + 0x11852c6a, 0x562556ba, 0x6b457f0a, 0x89f57f59, 0xb49556e9, + 0xf3352c39, 0xce550589, 0x7c75d999, 0x4115f029, 0x06b58af9, + 0x3bd5a349, 0xb9853498, 0x84e51d28, 0xc34567f8, 0xfe254e48, + 0x4c059258, 0x7165bbe8, 0x36c5c138, 0x0ba5e888, 0x28d4c7df, + 0x15b4ee6f, 0x521494bf, 0x6f74bd0f, 0xdd54611f, 0xe03448af, + 0xa794327f, 0x9af41bcf, 0x18a48c1e, 0x25c4a5ae, 0x6264df7e, + 0x5f04f6ce, 0xed242ade, 0xd044036e, 0x97e479be, 0xaa84500e, + 0x4834505d, 0x755479ed, 0x32f4033d, 0x0f942a8d, 0xbdb4f69d, + 0x80d4df2d, 0xc774a5fd, 0xfa148c4d, 0x78441b9c, 0x4524322c, + 0x028448fc, 0x3fe4614c, 0x8dc4bd5c, 0xb0a494ec, 0xf704ee3c, + 0xca64c78c}}; + +local const z_word_t FAR crc_braid_big_table[][256] = { + {0x00000000, 0xb029603d, 0x6053c07a, 0xd07aa047, 0xc0a680f5, + 0x708fe0c8, 0xa0f5408f, 0x10dc20b2, 0xc14b7030, 0x7162100d, + 0xa118b04a, 0x1131d077, 0x01edf0c5, 0xb1c490f8, 0x61be30bf, + 0xd1975082, 0x8297e060, 0x32be805d, 0xe2c4201a, 0x52ed4027, + 0x42316095, 0xf21800a8, 0x2262a0ef, 0x924bc0d2, 0x43dc9050, + 0xf3f5f06d, 0x238f502a, 0x93a63017, 0x837a10a5, 0x33537098, + 0xe329d0df, 0x5300b0e2, 0x042fc1c1, 0xb406a1fc, 0x647c01bb, + 0xd4556186, 0xc4894134, 0x74a02109, 0xa4da814e, 0x14f3e173, + 0xc564b1f1, 0x754dd1cc, 0xa537718b, 0x151e11b6, 0x05c23104, + 0xb5eb5139, 0x6591f17e, 0xd5b89143, 0x86b821a1, 0x3691419c, + 0xe6ebe1db, 0x56c281e6, 0x461ea154, 0xf637c169, 0x264d612e, + 0x96640113, 0x47f35191, 0xf7da31ac, 0x27a091eb, 0x9789f1d6, + 0x8755d164, 0x377cb159, 0xe706111e, 0x572f7123, 0x4958f358, + 0xf9719365, 0x290b3322, 0x9922531f, 0x89fe73ad, 0x39d71390, + 0xe9adb3d7, 0x5984d3ea, 0x88138368, 0x383ae355, 0xe8404312, + 0x5869232f, 0x48b5039d, 0xf89c63a0, 0x28e6c3e7, 0x98cfa3da, + 0xcbcf1338, 0x7be67305, 0xab9cd342, 0x1bb5b37f, 0x0b6993cd, + 0xbb40f3f0, 0x6b3a53b7, 0xdb13338a, 0x0a846308, 0xbaad0335, + 0x6ad7a372, 0xdafec34f, 0xca22e3fd, 0x7a0b83c0, 0xaa712387, + 0x1a5843ba, 0x4d773299, 0xfd5e52a4, 0x2d24f2e3, 0x9d0d92de, + 0x8dd1b26c, 0x3df8d251, 0xed827216, 0x5dab122b, 0x8c3c42a9, + 0x3c152294, 0xec6f82d3, 0x5c46e2ee, 0x4c9ac25c, 0xfcb3a261, + 0x2cc90226, 0x9ce0621b, 0xcfe0d2f9, 0x7fc9b2c4, 0xafb31283, + 0x1f9a72be, 0x0f46520c, 0xbf6f3231, 0x6f159276, 0xdf3cf24b, + 0x0eaba2c9, 0xbe82c2f4, 0x6ef862b3, 0xded1028e, 0xce0d223c, + 0x7e244201, 0xae5ee246, 0x1e77827b, 0x92b0e6b1, 0x2299868c, + 0xf2e326cb, 0x42ca46f6, 0x52166644, 0xe23f0679, 0x3245a63e, + 0x826cc603, 0x53fb9681, 0xe3d2f6bc, 0x33a856fb, 0x838136c6, + 0x935d1674, 0x23747649, 0xf30ed60e, 0x4327b633, 0x102706d1, + 0xa00e66ec, 0x7074c6ab, 0xc05da696, 0xd0818624, 0x60a8e619, + 0xb0d2465e, 0x00fb2663, 0xd16c76e1, 0x614516dc, 0xb13fb69b, + 0x0116d6a6, 0x11caf614, 0xa1e39629, 0x7199366e, 0xc1b05653, + 0x969f2770, 0x26b6474d, 0xf6cce70a, 0x46e58737, 0x5639a785, + 0xe610c7b8, 0x366a67ff, 0x864307c2, 0x57d45740, 0xe7fd377d, + 0x3787973a, 0x87aef707, 0x9772d7b5, 0x275bb788, 0xf72117cf, + 0x470877f2, 0x1408c710, 0xa421a72d, 0x745b076a, 0xc4726757, + 0xd4ae47e5, 0x648727d8, 0xb4fd879f, 0x04d4e7a2, 0xd543b720, + 0x656ad71d, 0xb510775a, 0x05391767, 0x15e537d5, 0xa5cc57e8, + 0x75b6f7af, 0xc59f9792, 0xdbe815e9, 0x6bc175d4, 0xbbbbd593, + 0x0b92b5ae, 0x1b4e951c, 0xab67f521, 0x7b1d5566, 0xcb34355b, + 0x1aa365d9, 0xaa8a05e4, 0x7af0a5a3, 0xcad9c59e, 0xda05e52c, + 0x6a2c8511, 0xba562556, 0x0a7f456b, 0x597ff589, 0xe95695b4, + 0x392c35f3, 0x890555ce, 0x99d9757c, 0x29f01541, 0xf98ab506, + 0x49a3d53b, 0x983485b9, 0x281de584, 0xf86745c3, 0x484e25fe, + 0x5892054c, 0xe8bb6571, 0x38c1c536, 0x88e8a50b, 0xdfc7d428, + 0x6feeb415, 0xbf941452, 0x0fbd746f, 0x1f6154dd, 0xaf4834e0, + 0x7f3294a7, 0xcf1bf49a, 0x1e8ca418, 0xaea5c425, 0x7edf6462, + 0xcef6045f, 0xde2a24ed, 0x6e0344d0, 0xbe79e497, 0x0e5084aa, + 0x5d503448, 0xed795475, 0x3d03f432, 0x8d2a940f, 0x9df6b4bd, + 0x2ddfd480, 0xfda574c7, 0x4d8c14fa, 0x9c1b4478, 0x2c322445, + 0xfc488402, 0x4c61e43f, 0x5cbdc48d, 0xec94a4b0, 0x3cee04f7, + 0x8cc764ca}, + {0x00000000, 0xa5d35ccb, 0x0ba1c84d, 0xae729486, 0x1642919b, + 0xb391cd50, 0x1de359d6, 0xb830051d, 0x6d8253ec, 0xc8510f27, + 0x66239ba1, 0xc3f0c76a, 0x7bc0c277, 0xde139ebc, 0x70610a3a, + 0xd5b256f1, 0x9b02d603, 0x3ed18ac8, 0x90a31e4e, 0x35704285, + 0x8d404798, 0x28931b53, 0x86e18fd5, 0x2332d31e, 0xf68085ef, + 0x5353d924, 0xfd214da2, 0x58f21169, 0xe0c21474, 0x451148bf, + 0xeb63dc39, 0x4eb080f2, 0x3605ac07, 0x93d6f0cc, 0x3da4644a, + 0x98773881, 0x20473d9c, 0x85946157, 0x2be6f5d1, 0x8e35a91a, + 0x5b87ffeb, 0xfe54a320, 0x502637a6, 0xf5f56b6d, 0x4dc56e70, + 0xe81632bb, 0x4664a63d, 0xe3b7faf6, 0xad077a04, 0x08d426cf, + 0xa6a6b249, 0x0375ee82, 0xbb45eb9f, 0x1e96b754, 0xb0e423d2, + 0x15377f19, 0xc08529e8, 0x65567523, 0xcb24e1a5, 0x6ef7bd6e, + 0xd6c7b873, 0x7314e4b8, 0xdd66703e, 0x78b52cf5, 0x6c0a580f, + 0xc9d904c4, 0x67ab9042, 0xc278cc89, 0x7a48c994, 0xdf9b955f, + 0x71e901d9, 0xd43a5d12, 0x01880be3, 0xa45b5728, 0x0a29c3ae, + 0xaffa9f65, 0x17ca9a78, 0xb219c6b3, 0x1c6b5235, 0xb9b80efe, + 0xf7088e0c, 0x52dbd2c7, 0xfca94641, 0x597a1a8a, 0xe14a1f97, + 0x4499435c, 0xeaebd7da, 0x4f388b11, 0x9a8adde0, 0x3f59812b, + 0x912b15ad, 0x34f84966, 0x8cc84c7b, 0x291b10b0, 0x87698436, + 0x22bad8fd, 0x5a0ff408, 0xffdca8c3, 0x51ae3c45, 0xf47d608e, + 0x4c4d6593, 0xe99e3958, 0x47ecadde, 0xe23ff115, 0x378da7e4, + 0x925efb2f, 0x3c2c6fa9, 0x99ff3362, 0x21cf367f, 0x841c6ab4, + 0x2a6efe32, 0x8fbda2f9, 0xc10d220b, 0x64de7ec0, 0xcaacea46, + 0x6f7fb68d, 0xd74fb390, 0x729cef5b, 0xdcee7bdd, 0x793d2716, + 0xac8f71e7, 0x095c2d2c, 0xa72eb9aa, 0x02fde561, 0xbacde07c, + 0x1f1ebcb7, 0xb16c2831, 0x14bf74fa, 0xd814b01e, 0x7dc7ecd5, + 0xd3b57853, 0x76662498, 0xce562185, 0x6b857d4e, 0xc5f7e9c8, + 0x6024b503, 0xb596e3f2, 0x1045bf39, 0xbe372bbf, 0x1be47774, + 0xa3d47269, 0x06072ea2, 0xa875ba24, 0x0da6e6ef, 0x4316661d, + 0xe6c53ad6, 0x48b7ae50, 0xed64f29b, 0x5554f786, 0xf087ab4d, + 0x5ef53fcb, 0xfb266300, 0x2e9435f1, 0x8b47693a, 0x2535fdbc, + 0x80e6a177, 0x38d6a46a, 0x9d05f8a1, 0x33776c27, 0x96a430ec, + 0xee111c19, 0x4bc240d2, 0xe5b0d454, 0x4063889f, 0xf8538d82, + 0x5d80d149, 0xf3f245cf, 0x56211904, 0x83934ff5, 0x2640133e, + 0x883287b8, 0x2de1db73, 0x95d1de6e, 0x300282a5, 0x9e701623, + 0x3ba34ae8, 0x7513ca1a, 0xd0c096d1, 0x7eb20257, 0xdb615e9c, + 0x63515b81, 0xc682074a, 0x68f093cc, 0xcd23cf07, 0x189199f6, + 0xbd42c53d, 0x133051bb, 0xb6e30d70, 0x0ed3086d, 0xab0054a6, + 0x0572c020, 0xa0a19ceb, 0xb41ee811, 0x11cdb4da, 0xbfbf205c, + 0x1a6c7c97, 0xa25c798a, 0x078f2541, 0xa9fdb1c7, 0x0c2eed0c, + 0xd99cbbfd, 0x7c4fe736, 0xd23d73b0, 0x77ee2f7b, 0xcfde2a66, + 0x6a0d76ad, 0xc47fe22b, 0x61acbee0, 0x2f1c3e12, 0x8acf62d9, + 0x24bdf65f, 0x816eaa94, 0x395eaf89, 0x9c8df342, 0x32ff67c4, + 0x972c3b0f, 0x429e6dfe, 0xe74d3135, 0x493fa5b3, 0xececf978, + 0x54dcfc65, 0xf10fa0ae, 0x5f7d3428, 0xfaae68e3, 0x821b4416, + 0x27c818dd, 0x89ba8c5b, 0x2c69d090, 0x9459d58d, 0x318a8946, + 0x9ff81dc0, 0x3a2b410b, 0xef9917fa, 0x4a4a4b31, 0xe438dfb7, + 0x41eb837c, 0xf9db8661, 0x5c08daaa, 0xf27a4e2c, 0x57a912e7, + 0x19199215, 0xbccacede, 0x12b85a58, 0xb76b0693, 0x0f5b038e, + 0xaa885f45, 0x04facbc3, 0xa1299708, 0x749bc1f9, 0xd1489d32, + 0x7f3a09b4, 0xdae9557f, 0x62d95062, 0xc70a0ca9, 0x6978982f, + 0xccabc4e4}, + {0x00000000, 0xb40b77a6, 0x29119f97, 0x9d1ae831, 0x13244ff4, + 0xa72f3852, 0x3a35d063, 0x8e3ea7c5, 0x674eef33, 0xd3459895, + 0x4e5f70a4, 0xfa540702, 0x746aa0c7, 0xc061d761, 0x5d7b3f50, + 0xe97048f6, 0xce9cde67, 0x7a97a9c1, 0xe78d41f0, 0x53863656, + 0xddb89193, 0x69b3e635, 0xf4a90e04, 0x40a279a2, 0xa9d23154, + 0x1dd946f2, 0x80c3aec3, 0x34c8d965, 0xbaf67ea0, 0x0efd0906, + 0x93e7e137, 0x27ec9691, 0x9c39bdcf, 0x2832ca69, 0xb5282258, + 0x012355fe, 0x8f1df23b, 0x3b16859d, 0xa60c6dac, 0x12071a0a, + 0xfb7752fc, 0x4f7c255a, 0xd266cd6b, 0x666dbacd, 0xe8531d08, + 0x5c586aae, 0xc142829f, 0x7549f539, 0x52a563a8, 0xe6ae140e, + 0x7bb4fc3f, 0xcfbf8b99, 0x41812c5c, 0xf58a5bfa, 0x6890b3cb, + 0xdc9bc46d, 0x35eb8c9b, 0x81e0fb3d, 0x1cfa130c, 0xa8f164aa, + 0x26cfc36f, 0x92c4b4c9, 0x0fde5cf8, 0xbbd52b5e, 0x79750b44, + 0xcd7e7ce2, 0x506494d3, 0xe46fe375, 0x6a5144b0, 0xde5a3316, + 0x4340db27, 0xf74bac81, 0x1e3be477, 0xaa3093d1, 0x372a7be0, + 0x83210c46, 0x0d1fab83, 0xb914dc25, 0x240e3414, 0x900543b2, + 0xb7e9d523, 0x03e2a285, 0x9ef84ab4, 0x2af33d12, 0xa4cd9ad7, + 0x10c6ed71, 0x8ddc0540, 0x39d772e6, 0xd0a73a10, 0x64ac4db6, + 0xf9b6a587, 0x4dbdd221, 0xc38375e4, 0x77880242, 0xea92ea73, + 0x5e999dd5, 0xe54cb68b, 0x5147c12d, 0xcc5d291c, 0x78565eba, + 0xf668f97f, 0x42638ed9, 0xdf7966e8, 0x6b72114e, 0x820259b8, + 0x36092e1e, 0xab13c62f, 0x1f18b189, 0x9126164c, 0x252d61ea, + 0xb83789db, 0x0c3cfe7d, 0x2bd068ec, 0x9fdb1f4a, 0x02c1f77b, + 0xb6ca80dd, 0x38f42718, 0x8cff50be, 0x11e5b88f, 0xa5eecf29, + 0x4c9e87df, 0xf895f079, 0x658f1848, 0xd1846fee, 0x5fbac82b, + 0xebb1bf8d, 0x76ab57bc, 0xc2a0201a, 0xf2ea1688, 0x46e1612e, + 0xdbfb891f, 0x6ff0feb9, 0xe1ce597c, 0x55c52eda, 0xc8dfc6eb, + 0x7cd4b14d, 0x95a4f9bb, 0x21af8e1d, 0xbcb5662c, 0x08be118a, + 0x8680b64f, 0x328bc1e9, 0xaf9129d8, 0x1b9a5e7e, 0x3c76c8ef, + 0x887dbf49, 0x15675778, 0xa16c20de, 0x2f52871b, 0x9b59f0bd, + 0x0643188c, 0xb2486f2a, 0x5b3827dc, 0xef33507a, 0x7229b84b, + 0xc622cfed, 0x481c6828, 0xfc171f8e, 0x610df7bf, 0xd5068019, + 0x6ed3ab47, 0xdad8dce1, 0x47c234d0, 0xf3c94376, 0x7df7e4b3, + 0xc9fc9315, 0x54e67b24, 0xe0ed0c82, 0x099d4474, 0xbd9633d2, + 0x208cdbe3, 0x9487ac45, 0x1ab90b80, 0xaeb27c26, 0x33a89417, + 0x87a3e3b1, 0xa04f7520, 0x14440286, 0x895eeab7, 0x3d559d11, + 0xb36b3ad4, 0x07604d72, 0x9a7aa543, 0x2e71d2e5, 0xc7019a13, + 0x730aedb5, 0xee100584, 0x5a1b7222, 0xd425d5e7, 0x602ea241, + 0xfd344a70, 0x493f3dd6, 0x8b9f1dcc, 0x3f946a6a, 0xa28e825b, + 0x1685f5fd, 0x98bb5238, 0x2cb0259e, 0xb1aacdaf, 0x05a1ba09, + 0xecd1f2ff, 0x58da8559, 0xc5c06d68, 0x71cb1ace, 0xfff5bd0b, + 0x4bfecaad, 0xd6e4229c, 0x62ef553a, 0x4503c3ab, 0xf108b40d, + 0x6c125c3c, 0xd8192b9a, 0x56278c5f, 0xe22cfbf9, 0x7f3613c8, + 0xcb3d646e, 0x224d2c98, 0x96465b3e, 0x0b5cb30f, 0xbf57c4a9, + 0x3169636c, 0x856214ca, 0x1878fcfb, 0xac738b5d, 0x17a6a003, + 0xa3add7a5, 0x3eb73f94, 0x8abc4832, 0x0482eff7, 0xb0899851, + 0x2d937060, 0x999807c6, 0x70e84f30, 0xc4e33896, 0x59f9d0a7, + 0xedf2a701, 0x63cc00c4, 0xd7c77762, 0x4add9f53, 0xfed6e8f5, + 0xd93a7e64, 0x6d3109c2, 0xf02be1f3, 0x44209655, 0xca1e3190, + 0x7e154636, 0xe30fae07, 0x5704d9a1, 0xbe749157, 0x0a7fe6f1, + 0x97650ec0, 0x236e7966, 0xad50dea3, 0x195ba905, 0x84414134, + 0x304a3692}, + {0x00000000, 0x9e00aacc, 0x7d072542, 0xe3078f8e, 0xfa0e4a84, + 0x640ee048, 0x87096fc6, 0x1909c50a, 0xb51be5d3, 0x2b1b4f1f, + 0xc81cc091, 0x561c6a5d, 0x4f15af57, 0xd115059b, 0x32128a15, + 0xac1220d9, 0x2b31bb7c, 0xb53111b0, 0x56369e3e, 0xc83634f2, + 0xd13ff1f8, 0x4f3f5b34, 0xac38d4ba, 0x32387e76, 0x9e2a5eaf, + 0x002af463, 0xe32d7bed, 0x7d2dd121, 0x6424142b, 0xfa24bee7, + 0x19233169, 0x87239ba5, 0x566276f9, 0xc862dc35, 0x2b6553bb, + 0xb565f977, 0xac6c3c7d, 0x326c96b1, 0xd16b193f, 0x4f6bb3f3, + 0xe379932a, 0x7d7939e6, 0x9e7eb668, 0x007e1ca4, 0x1977d9ae, + 0x87777362, 0x6470fcec, 0xfa705620, 0x7d53cd85, 0xe3536749, + 0x0054e8c7, 0x9e54420b, 0x875d8701, 0x195d2dcd, 0xfa5aa243, + 0x645a088f, 0xc8482856, 0x5648829a, 0xb54f0d14, 0x2b4fa7d8, + 0x324662d2, 0xac46c81e, 0x4f414790, 0xd141ed5c, 0xedc29d29, + 0x73c237e5, 0x90c5b86b, 0x0ec512a7, 0x17ccd7ad, 0x89cc7d61, + 0x6acbf2ef, 0xf4cb5823, 0x58d978fa, 0xc6d9d236, 0x25de5db8, + 0xbbdef774, 0xa2d7327e, 0x3cd798b2, 0xdfd0173c, 0x41d0bdf0, + 0xc6f32655, 0x58f38c99, 0xbbf40317, 0x25f4a9db, 0x3cfd6cd1, + 0xa2fdc61d, 0x41fa4993, 0xdffae35f, 0x73e8c386, 0xede8694a, + 0x0eefe6c4, 0x90ef4c08, 0x89e68902, 0x17e623ce, 0xf4e1ac40, + 0x6ae1068c, 0xbba0ebd0, 0x25a0411c, 0xc6a7ce92, 0x58a7645e, + 0x41aea154, 0xdfae0b98, 0x3ca98416, 0xa2a92eda, 0x0ebb0e03, + 0x90bba4cf, 0x73bc2b41, 0xedbc818d, 0xf4b54487, 0x6ab5ee4b, + 0x89b261c5, 0x17b2cb09, 0x909150ac, 0x0e91fa60, 0xed9675ee, + 0x7396df22, 0x6a9f1a28, 0xf49fb0e4, 0x17983f6a, 0x899895a6, + 0x258ab57f, 0xbb8a1fb3, 0x588d903d, 0xc68d3af1, 0xdf84fffb, + 0x41845537, 0xa283dab9, 0x3c837075, 0xda853b53, 0x4485919f, + 0xa7821e11, 0x3982b4dd, 0x208b71d7, 0xbe8bdb1b, 0x5d8c5495, + 0xc38cfe59, 0x6f9ede80, 0xf19e744c, 0x1299fbc2, 0x8c99510e, + 0x95909404, 0x0b903ec8, 0xe897b146, 0x76971b8a, 0xf1b4802f, + 0x6fb42ae3, 0x8cb3a56d, 0x12b30fa1, 0x0bbacaab, 0x95ba6067, + 0x76bdefe9, 0xe8bd4525, 0x44af65fc, 0xdaafcf30, 0x39a840be, + 0xa7a8ea72, 0xbea12f78, 0x20a185b4, 0xc3a60a3a, 0x5da6a0f6, + 0x8ce74daa, 0x12e7e766, 0xf1e068e8, 0x6fe0c224, 0x76e9072e, + 0xe8e9ade2, 0x0bee226c, 0x95ee88a0, 0x39fca879, 0xa7fc02b5, + 0x44fb8d3b, 0xdafb27f7, 0xc3f2e2fd, 0x5df24831, 0xbef5c7bf, + 0x20f56d73, 0xa7d6f6d6, 0x39d65c1a, 0xdad1d394, 0x44d17958, + 0x5dd8bc52, 0xc3d8169e, 0x20df9910, 0xbedf33dc, 0x12cd1305, + 0x8ccdb9c9, 0x6fca3647, 0xf1ca9c8b, 0xe8c35981, 0x76c3f34d, + 0x95c47cc3, 0x0bc4d60f, 0x3747a67a, 0xa9470cb6, 0x4a408338, + 0xd44029f4, 0xcd49ecfe, 0x53494632, 0xb04ec9bc, 0x2e4e6370, + 0x825c43a9, 0x1c5ce965, 0xff5b66eb, 0x615bcc27, 0x7852092d, + 0xe652a3e1, 0x05552c6f, 0x9b5586a3, 0x1c761d06, 0x8276b7ca, + 0x61713844, 0xff719288, 0xe6785782, 0x7878fd4e, 0x9b7f72c0, + 0x057fd80c, 0xa96df8d5, 0x376d5219, 0xd46add97, 0x4a6a775b, + 0x5363b251, 0xcd63189d, 0x2e649713, 0xb0643ddf, 0x6125d083, + 0xff257a4f, 0x1c22f5c1, 0x82225f0d, 0x9b2b9a07, 0x052b30cb, + 0xe62cbf45, 0x782c1589, 0xd43e3550, 0x4a3e9f9c, 0xa9391012, + 0x3739bade, 0x2e307fd4, 0xb030d518, 0x53375a96, 0xcd37f05a, + 0x4a146bff, 0xd414c133, 0x37134ebd, 0xa913e471, 0xb01a217b, + 0x2e1a8bb7, 0xcd1d0439, 0x531daef5, 0xff0f8e2c, 0x610f24e0, + 0x8208ab6e, 0x1c0801a2, 0x0501c4a8, 0x9b016e64, 0x7806e1ea, + 0xe6064b26}}; + #endif - } -}; + +#endif + +#if N == 3 + +#if W == 8 + +local const z_crc_t FAR crc_braid_table[][256] = { + {0x00000000, 0x81256527, 0xd93bcc0f, 0x581ea928, 0x69069e5f, + 0xe823fb78, 0xb03d5250, 0x31183777, 0xd20d3cbe, 0x53285999, + 0x0b36f0b1, 0x8a139596, 0xbb0ba2e1, 0x3a2ec7c6, 0x62306eee, + 0xe3150bc9, 0x7f6b7f3d, 0xfe4e1a1a, 0xa650b332, 0x2775d615, + 0x166de162, 0x97488445, 0xcf562d6d, 0x4e73484a, 0xad664383, + 0x2c4326a4, 0x745d8f8c, 0xf578eaab, 0xc460dddc, 0x4545b8fb, + 0x1d5b11d3, 0x9c7e74f4, 0xfed6fe7a, 0x7ff39b5d, 0x27ed3275, + 0xa6c85752, 0x97d06025, 0x16f50502, 0x4eebac2a, 0xcfcec90d, + 0x2cdbc2c4, 0xadfea7e3, 0xf5e00ecb, 0x74c56bec, 0x45dd5c9b, + 0xc4f839bc, 0x9ce69094, 0x1dc3f5b3, 0x81bd8147, 0x0098e460, + 0x58864d48, 0xd9a3286f, 0xe8bb1f18, 0x699e7a3f, 0x3180d317, + 0xb0a5b630, 0x53b0bdf9, 0xd295d8de, 0x8a8b71f6, 0x0bae14d1, + 0x3ab623a6, 0xbb934681, 0xe38defa9, 0x62a88a8e, 0x26dcfab5, + 0xa7f99f92, 0xffe736ba, 0x7ec2539d, 0x4fda64ea, 0xceff01cd, + 0x96e1a8e5, 0x17c4cdc2, 0xf4d1c60b, 0x75f4a32c, 0x2dea0a04, + 0xaccf6f23, 0x9dd75854, 0x1cf23d73, 0x44ec945b, 0xc5c9f17c, + 0x59b78588, 0xd892e0af, 0x808c4987, 0x01a92ca0, 0x30b11bd7, + 0xb1947ef0, 0xe98ad7d8, 0x68afb2ff, 0x8bbab936, 0x0a9fdc11, + 0x52817539, 0xd3a4101e, 0xe2bc2769, 0x6399424e, 0x3b87eb66, + 0xbaa28e41, 0xd80a04cf, 0x592f61e8, 0x0131c8c0, 0x8014ade7, + 0xb10c9a90, 0x3029ffb7, 0x6837569f, 0xe91233b8, 0x0a073871, + 0x8b225d56, 0xd33cf47e, 0x52199159, 0x6301a62e, 0xe224c309, + 0xba3a6a21, 0x3b1f0f06, 0xa7617bf2, 0x26441ed5, 0x7e5ab7fd, + 0xff7fd2da, 0xce67e5ad, 0x4f42808a, 0x175c29a2, 0x96794c85, + 0x756c474c, 0xf449226b, 0xac578b43, 0x2d72ee64, 0x1c6ad913, + 0x9d4fbc34, 0xc551151c, 0x4474703b, 0x4db9f56a, 0xcc9c904d, + 0x94823965, 0x15a75c42, 0x24bf6b35, 0xa59a0e12, 0xfd84a73a, + 0x7ca1c21d, 0x9fb4c9d4, 0x1e91acf3, 0x468f05db, 0xc7aa60fc, + 0xf6b2578b, 0x779732ac, 0x2f899b84, 0xaeacfea3, 0x32d28a57, + 0xb3f7ef70, 0xebe94658, 0x6acc237f, 0x5bd41408, 0xdaf1712f, + 0x82efd807, 0x03cabd20, 0xe0dfb6e9, 0x61fad3ce, 0x39e47ae6, + 0xb8c11fc1, 0x89d928b6, 0x08fc4d91, 0x50e2e4b9, 0xd1c7819e, + 0xb36f0b10, 0x324a6e37, 0x6a54c71f, 0xeb71a238, 0xda69954f, + 0x5b4cf068, 0x03525940, 0x82773c67, 0x616237ae, 0xe0475289, + 0xb859fba1, 0x397c9e86, 0x0864a9f1, 0x8941ccd6, 0xd15f65fe, + 0x507a00d9, 0xcc04742d, 0x4d21110a, 0x153fb822, 0x941add05, + 0xa502ea72, 0x24278f55, 0x7c39267d, 0xfd1c435a, 0x1e094893, + 0x9f2c2db4, 0xc732849c, 0x4617e1bb, 0x770fd6cc, 0xf62ab3eb, + 0xae341ac3, 0x2f117fe4, 0x6b650fdf, 0xea406af8, 0xb25ec3d0, + 0x337ba6f7, 0x02639180, 0x8346f4a7, 0xdb585d8f, 0x5a7d38a8, + 0xb9683361, 0x384d5646, 0x6053ff6e, 0xe1769a49, 0xd06ead3e, + 0x514bc819, 0x09556131, 0x88700416, 0x140e70e2, 0x952b15c5, + 0xcd35bced, 0x4c10d9ca, 0x7d08eebd, 0xfc2d8b9a, 0xa43322b2, + 0x25164795, 0xc6034c5c, 0x4726297b, 0x1f388053, 0x9e1de574, + 0xaf05d203, 0x2e20b724, 0x763e1e0c, 0xf71b7b2b, 0x95b3f1a5, + 0x14969482, 0x4c883daa, 0xcdad588d, 0xfcb56ffa, 0x7d900add, + 0x258ea3f5, 0xa4abc6d2, 0x47becd1b, 0xc69ba83c, 0x9e850114, + 0x1fa06433, 0x2eb85344, 0xaf9d3663, 0xf7839f4b, 0x76a6fa6c, + 0xead88e98, 0x6bfdebbf, 0x33e34297, 0xb2c627b0, 0x83de10c7, + 0x02fb75e0, 0x5ae5dcc8, 0xdbc0b9ef, 0x38d5b226, 0xb9f0d701, + 0xe1ee7e29, 0x60cb1b0e, 0x51d32c79, 0xd0f6495e, 0x88e8e076, + 0x09cd8551}, + {0x00000000, 0x9b73ead4, 0xed96d3e9, 0x76e5393d, 0x005ca193, + 0x9b2f4b47, 0xedca727a, 0x76b998ae, 0x00b94326, 0x9bcaa9f2, + 0xed2f90cf, 0x765c7a1b, 0x00e5e2b5, 0x9b960861, 0xed73315c, + 0x7600db88, 0x0172864c, 0x9a016c98, 0xece455a5, 0x7797bf71, + 0x012e27df, 0x9a5dcd0b, 0xecb8f436, 0x77cb1ee2, 0x01cbc56a, + 0x9ab82fbe, 0xec5d1683, 0x772efc57, 0x019764f9, 0x9ae48e2d, + 0xec01b710, 0x77725dc4, 0x02e50c98, 0x9996e64c, 0xef73df71, + 0x740035a5, 0x02b9ad0b, 0x99ca47df, 0xef2f7ee2, 0x745c9436, + 0x025c4fbe, 0x992fa56a, 0xefca9c57, 0x74b97683, 0x0200ee2d, + 0x997304f9, 0xef963dc4, 0x74e5d710, 0x03978ad4, 0x98e46000, + 0xee01593d, 0x7572b3e9, 0x03cb2b47, 0x98b8c193, 0xee5df8ae, + 0x752e127a, 0x032ec9f2, 0x985d2326, 0xeeb81a1b, 0x75cbf0cf, + 0x03726861, 0x980182b5, 0xeee4bb88, 0x7597515c, 0x05ca1930, + 0x9eb9f3e4, 0xe85ccad9, 0x732f200d, 0x0596b8a3, 0x9ee55277, + 0xe8006b4a, 0x7373819e, 0x05735a16, 0x9e00b0c2, 0xe8e589ff, + 0x7396632b, 0x052ffb85, 0x9e5c1151, 0xe8b9286c, 0x73cac2b8, + 0x04b89f7c, 0x9fcb75a8, 0xe92e4c95, 0x725da641, 0x04e43eef, + 0x9f97d43b, 0xe972ed06, 0x720107d2, 0x0401dc5a, 0x9f72368e, + 0xe9970fb3, 0x72e4e567, 0x045d7dc9, 0x9f2e971d, 0xe9cbae20, + 0x72b844f4, 0x072f15a8, 0x9c5cff7c, 0xeab9c641, 0x71ca2c95, + 0x0773b43b, 0x9c005eef, 0xeae567d2, 0x71968d06, 0x0796568e, + 0x9ce5bc5a, 0xea008567, 0x71736fb3, 0x07caf71d, 0x9cb91dc9, + 0xea5c24f4, 0x712fce20, 0x065d93e4, 0x9d2e7930, 0xebcb400d, + 0x70b8aad9, 0x06013277, 0x9d72d8a3, 0xeb97e19e, 0x70e40b4a, + 0x06e4d0c2, 0x9d973a16, 0xeb72032b, 0x7001e9ff, 0x06b87151, + 0x9dcb9b85, 0xeb2ea2b8, 0x705d486c, 0x0b943260, 0x90e7d8b4, + 0xe602e189, 0x7d710b5d, 0x0bc893f3, 0x90bb7927, 0xe65e401a, + 0x7d2daace, 0x0b2d7146, 0x905e9b92, 0xe6bba2af, 0x7dc8487b, + 0x0b71d0d5, 0x90023a01, 0xe6e7033c, 0x7d94e9e8, 0x0ae6b42c, + 0x91955ef8, 0xe77067c5, 0x7c038d11, 0x0aba15bf, 0x91c9ff6b, + 0xe72cc656, 0x7c5f2c82, 0x0a5ff70a, 0x912c1dde, 0xe7c924e3, + 0x7cbace37, 0x0a035699, 0x9170bc4d, 0xe7958570, 0x7ce66fa4, + 0x09713ef8, 0x9202d42c, 0xe4e7ed11, 0x7f9407c5, 0x092d9f6b, + 0x925e75bf, 0xe4bb4c82, 0x7fc8a656, 0x09c87dde, 0x92bb970a, + 0xe45eae37, 0x7f2d44e3, 0x0994dc4d, 0x92e73699, 0xe4020fa4, + 0x7f71e570, 0x0803b8b4, 0x93705260, 0xe5956b5d, 0x7ee68189, + 0x085f1927, 0x932cf3f3, 0xe5c9cace, 0x7eba201a, 0x08bafb92, + 0x93c91146, 0xe52c287b, 0x7e5fc2af, 0x08e65a01, 0x9395b0d5, + 0xe57089e8, 0x7e03633c, 0x0e5e2b50, 0x952dc184, 0xe3c8f8b9, + 0x78bb126d, 0x0e028ac3, 0x95716017, 0xe394592a, 0x78e7b3fe, + 0x0ee76876, 0x959482a2, 0xe371bb9f, 0x7802514b, 0x0ebbc9e5, + 0x95c82331, 0xe32d1a0c, 0x785ef0d8, 0x0f2cad1c, 0x945f47c8, + 0xe2ba7ef5, 0x79c99421, 0x0f700c8f, 0x9403e65b, 0xe2e6df66, + 0x799535b2, 0x0f95ee3a, 0x94e604ee, 0xe2033dd3, 0x7970d707, + 0x0fc94fa9, 0x94baa57d, 0xe25f9c40, 0x792c7694, 0x0cbb27c8, + 0x97c8cd1c, 0xe12df421, 0x7a5e1ef5, 0x0ce7865b, 0x97946c8f, + 0xe17155b2, 0x7a02bf66, 0x0c0264ee, 0x97718e3a, 0xe194b707, + 0x7ae75dd3, 0x0c5ec57d, 0x972d2fa9, 0xe1c81694, 0x7abbfc40, + 0x0dc9a184, 0x96ba4b50, 0xe05f726d, 0x7b2c98b9, 0x0d950017, + 0x96e6eac3, 0xe003d3fe, 0x7b70392a, 0x0d70e2a2, 0x96030876, + 0xe0e6314b, 0x7b95db9f, 0x0d2c4331, 0x965fa9e5, 0xe0ba90d8, + 0x7bc97a0c}, + {0x00000000, 0x172864c0, 0x2e50c980, 0x3978ad40, 0x5ca19300, + 0x4b89f7c0, 0x72f15a80, 0x65d93e40, 0xb9432600, 0xae6b42c0, + 0x9713ef80, 0x803b8b40, 0xe5e2b500, 0xf2cad1c0, 0xcbb27c80, + 0xdc9a1840, 0xa9f74a41, 0xbedf2e81, 0x87a783c1, 0x908fe701, + 0xf556d941, 0xe27ebd81, 0xdb0610c1, 0xcc2e7401, 0x10b46c41, + 0x079c0881, 0x3ee4a5c1, 0x29ccc101, 0x4c15ff41, 0x5b3d9b81, + 0x624536c1, 0x756d5201, 0x889f92c3, 0x9fb7f603, 0xa6cf5b43, + 0xb1e73f83, 0xd43e01c3, 0xc3166503, 0xfa6ec843, 0xed46ac83, + 0x31dcb4c3, 0x26f4d003, 0x1f8c7d43, 0x08a41983, 0x6d7d27c3, + 0x7a554303, 0x432dee43, 0x54058a83, 0x2168d882, 0x3640bc42, + 0x0f381102, 0x181075c2, 0x7dc94b82, 0x6ae12f42, 0x53998202, + 0x44b1e6c2, 0x982bfe82, 0x8f039a42, 0xb67b3702, 0xa15353c2, + 0xc48a6d82, 0xd3a20942, 0xeadaa402, 0xfdf2c0c2, 0xca4e23c7, + 0xdd664707, 0xe41eea47, 0xf3368e87, 0x96efb0c7, 0x81c7d407, + 0xb8bf7947, 0xaf971d87, 0x730d05c7, 0x64256107, 0x5d5dcc47, + 0x4a75a887, 0x2fac96c7, 0x3884f207, 0x01fc5f47, 0x16d43b87, + 0x63b96986, 0x74910d46, 0x4de9a006, 0x5ac1c4c6, 0x3f18fa86, + 0x28309e46, 0x11483306, 0x066057c6, 0xdafa4f86, 0xcdd22b46, + 0xf4aa8606, 0xe382e2c6, 0x865bdc86, 0x9173b846, 0xa80b1506, + 0xbf2371c6, 0x42d1b104, 0x55f9d5c4, 0x6c817884, 0x7ba91c44, + 0x1e702204, 0x095846c4, 0x3020eb84, 0x27088f44, 0xfb929704, + 0xecbaf3c4, 0xd5c25e84, 0xc2ea3a44, 0xa7330404, 0xb01b60c4, + 0x8963cd84, 0x9e4ba944, 0xeb26fb45, 0xfc0e9f85, 0xc57632c5, + 0xd25e5605, 0xb7876845, 0xa0af0c85, 0x99d7a1c5, 0x8effc505, + 0x5265dd45, 0x454db985, 0x7c3514c5, 0x6b1d7005, 0x0ec44e45, + 0x19ec2a85, 0x209487c5, 0x37bce305, 0x4fed41cf, 0x58c5250f, + 0x61bd884f, 0x7695ec8f, 0x134cd2cf, 0x0464b60f, 0x3d1c1b4f, + 0x2a347f8f, 0xf6ae67cf, 0xe186030f, 0xd8feae4f, 0xcfd6ca8f, + 0xaa0ff4cf, 0xbd27900f, 0x845f3d4f, 0x9377598f, 0xe61a0b8e, + 0xf1326f4e, 0xc84ac20e, 0xdf62a6ce, 0xbabb988e, 0xad93fc4e, + 0x94eb510e, 0x83c335ce, 0x5f592d8e, 0x4871494e, 0x7109e40e, + 0x662180ce, 0x03f8be8e, 0x14d0da4e, 0x2da8770e, 0x3a8013ce, + 0xc772d30c, 0xd05ab7cc, 0xe9221a8c, 0xfe0a7e4c, 0x9bd3400c, + 0x8cfb24cc, 0xb583898c, 0xa2abed4c, 0x7e31f50c, 0x691991cc, + 0x50613c8c, 0x4749584c, 0x2290660c, 0x35b802cc, 0x0cc0af8c, + 0x1be8cb4c, 0x6e85994d, 0x79adfd8d, 0x40d550cd, 0x57fd340d, + 0x32240a4d, 0x250c6e8d, 0x1c74c3cd, 0x0b5ca70d, 0xd7c6bf4d, + 0xc0eedb8d, 0xf99676cd, 0xeebe120d, 0x8b672c4d, 0x9c4f488d, + 0xa537e5cd, 0xb21f810d, 0x85a36208, 0x928b06c8, 0xabf3ab88, + 0xbcdbcf48, 0xd902f108, 0xce2a95c8, 0xf7523888, 0xe07a5c48, + 0x3ce04408, 0x2bc820c8, 0x12b08d88, 0x0598e948, 0x6041d708, + 0x7769b3c8, 0x4e111e88, 0x59397a48, 0x2c542849, 0x3b7c4c89, + 0x0204e1c9, 0x152c8509, 0x70f5bb49, 0x67dddf89, 0x5ea572c9, + 0x498d1609, 0x95170e49, 0x823f6a89, 0xbb47c7c9, 0xac6fa309, + 0xc9b69d49, 0xde9ef989, 0xe7e654c9, 0xf0ce3009, 0x0d3cf0cb, + 0x1a14940b, 0x236c394b, 0x34445d8b, 0x519d63cb, 0x46b5070b, + 0x7fcdaa4b, 0x68e5ce8b, 0xb47fd6cb, 0xa357b20b, 0x9a2f1f4b, + 0x8d077b8b, 0xe8de45cb, 0xfff6210b, 0xc68e8c4b, 0xd1a6e88b, + 0xa4cbba8a, 0xb3e3de4a, 0x8a9b730a, 0x9db317ca, 0xf86a298a, + 0xef424d4a, 0xd63ae00a, 0xc11284ca, 0x1d889c8a, 0x0aa0f84a, + 0x33d8550a, 0x24f031ca, 0x41290f8a, 0x56016b4a, 0x6f79c60a, + 0x7851a2ca}, + {0x00000000, 0x9fda839e, 0xe4c4017d, 0x7b1e82e3, 0x12f904bb, + 0x8d238725, 0xf63d05c6, 0x69e78658, 0x25f20976, 0xba288ae8, + 0xc136080b, 0x5eec8b95, 0x370b0dcd, 0xa8d18e53, 0xd3cf0cb0, + 0x4c158f2e, 0x4be412ec, 0xd43e9172, 0xaf201391, 0x30fa900f, + 0x591d1657, 0xc6c795c9, 0xbdd9172a, 0x220394b4, 0x6e161b9a, + 0xf1cc9804, 0x8ad21ae7, 0x15089979, 0x7cef1f21, 0xe3359cbf, + 0x982b1e5c, 0x07f19dc2, 0x97c825d8, 0x0812a646, 0x730c24a5, + 0xecd6a73b, 0x85312163, 0x1aeba2fd, 0x61f5201e, 0xfe2fa380, + 0xb23a2cae, 0x2de0af30, 0x56fe2dd3, 0xc924ae4d, 0xa0c32815, + 0x3f19ab8b, 0x44072968, 0xdbddaaf6, 0xdc2c3734, 0x43f6b4aa, + 0x38e83649, 0xa732b5d7, 0xced5338f, 0x510fb011, 0x2a1132f2, + 0xb5cbb16c, 0xf9de3e42, 0x6604bddc, 0x1d1a3f3f, 0x82c0bca1, + 0xeb273af9, 0x74fdb967, 0x0fe33b84, 0x9039b81a, 0xf4e14df1, + 0x6b3bce6f, 0x10254c8c, 0x8fffcf12, 0xe618494a, 0x79c2cad4, + 0x02dc4837, 0x9d06cba9, 0xd1134487, 0x4ec9c719, 0x35d745fa, + 0xaa0dc664, 0xc3ea403c, 0x5c30c3a2, 0x272e4141, 0xb8f4c2df, + 0xbf055f1d, 0x20dfdc83, 0x5bc15e60, 0xc41bddfe, 0xadfc5ba6, + 0x3226d838, 0x49385adb, 0xd6e2d945, 0x9af7566b, 0x052dd5f5, + 0x7e335716, 0xe1e9d488, 0x880e52d0, 0x17d4d14e, 0x6cca53ad, + 0xf310d033, 0x63296829, 0xfcf3ebb7, 0x87ed6954, 0x1837eaca, + 0x71d06c92, 0xee0aef0c, 0x95146def, 0x0aceee71, 0x46db615f, + 0xd901e2c1, 0xa21f6022, 0x3dc5e3bc, 0x542265e4, 0xcbf8e67a, + 0xb0e66499, 0x2f3ce707, 0x28cd7ac5, 0xb717f95b, 0xcc097bb8, + 0x53d3f826, 0x3a347e7e, 0xa5eefde0, 0xdef07f03, 0x412afc9d, + 0x0d3f73b3, 0x92e5f02d, 0xe9fb72ce, 0x7621f150, 0x1fc67708, + 0x801cf496, 0xfb027675, 0x64d8f5eb, 0x32b39da3, 0xad691e3d, + 0xd6779cde, 0x49ad1f40, 0x204a9918, 0xbf901a86, 0xc48e9865, + 0x5b541bfb, 0x174194d5, 0x889b174b, 0xf38595a8, 0x6c5f1636, + 0x05b8906e, 0x9a6213f0, 0xe17c9113, 0x7ea6128d, 0x79578f4f, + 0xe68d0cd1, 0x9d938e32, 0x02490dac, 0x6bae8bf4, 0xf474086a, + 0x8f6a8a89, 0x10b00917, 0x5ca58639, 0xc37f05a7, 0xb8618744, + 0x27bb04da, 0x4e5c8282, 0xd186011c, 0xaa9883ff, 0x35420061, + 0xa57bb87b, 0x3aa13be5, 0x41bfb906, 0xde653a98, 0xb782bcc0, + 0x28583f5e, 0x5346bdbd, 0xcc9c3e23, 0x8089b10d, 0x1f533293, + 0x644db070, 0xfb9733ee, 0x9270b5b6, 0x0daa3628, 0x76b4b4cb, + 0xe96e3755, 0xee9faa97, 0x71452909, 0x0a5babea, 0x95812874, + 0xfc66ae2c, 0x63bc2db2, 0x18a2af51, 0x87782ccf, 0xcb6da3e1, + 0x54b7207f, 0x2fa9a29c, 0xb0732102, 0xd994a75a, 0x464e24c4, + 0x3d50a627, 0xa28a25b9, 0xc652d052, 0x598853cc, 0x2296d12f, + 0xbd4c52b1, 0xd4abd4e9, 0x4b715777, 0x306fd594, 0xafb5560a, + 0xe3a0d924, 0x7c7a5aba, 0x0764d859, 0x98be5bc7, 0xf159dd9f, + 0x6e835e01, 0x159ddce2, 0x8a475f7c, 0x8db6c2be, 0x126c4120, + 0x6972c3c3, 0xf6a8405d, 0x9f4fc605, 0x0095459b, 0x7b8bc778, + 0xe45144e6, 0xa844cbc8, 0x379e4856, 0x4c80cab5, 0xd35a492b, + 0xbabdcf73, 0x25674ced, 0x5e79ce0e, 0xc1a34d90, 0x519af58a, + 0xce407614, 0xb55ef4f7, 0x2a847769, 0x4363f131, 0xdcb972af, + 0xa7a7f04c, 0x387d73d2, 0x7468fcfc, 0xebb27f62, 0x90acfd81, + 0x0f767e1f, 0x6691f847, 0xf94b7bd9, 0x8255f93a, 0x1d8f7aa4, + 0x1a7ee766, 0x85a464f8, 0xfebae61b, 0x61606585, 0x0887e3dd, + 0x975d6043, 0xec43e2a0, 0x7399613e, 0x3f8cee10, 0xa0566d8e, + 0xdb48ef6d, 0x44926cf3, 0x2d75eaab, 0xb2af6935, 0xc9b1ebd6, + 0x566b6848}, + {0x00000000, 0x65673b46, 0xcace768c, 0xafa94dca, 0x4eedeb59, + 0x2b8ad01f, 0x84239dd5, 0xe144a693, 0x9ddbd6b2, 0xf8bcedf4, + 0x5715a03e, 0x32729b78, 0xd3363deb, 0xb65106ad, 0x19f84b67, + 0x7c9f7021, 0xe0c6ab25, 0x85a19063, 0x2a08dda9, 0x4f6fe6ef, + 0xae2b407c, 0xcb4c7b3a, 0x64e536f0, 0x01820db6, 0x7d1d7d97, + 0x187a46d1, 0xb7d30b1b, 0xd2b4305d, 0x33f096ce, 0x5697ad88, + 0xf93ee042, 0x9c59db04, 0x1afc500b, 0x7f9b6b4d, 0xd0322687, + 0xb5551dc1, 0x5411bb52, 0x31768014, 0x9edfcdde, 0xfbb8f698, + 0x872786b9, 0xe240bdff, 0x4de9f035, 0x288ecb73, 0xc9ca6de0, + 0xacad56a6, 0x03041b6c, 0x6663202a, 0xfa3afb2e, 0x9f5dc068, + 0x30f48da2, 0x5593b6e4, 0xb4d71077, 0xd1b02b31, 0x7e1966fb, + 0x1b7e5dbd, 0x67e12d9c, 0x028616da, 0xad2f5b10, 0xc8486056, + 0x290cc6c5, 0x4c6bfd83, 0xe3c2b049, 0x86a58b0f, 0x35f8a016, + 0x509f9b50, 0xff36d69a, 0x9a51eddc, 0x7b154b4f, 0x1e727009, + 0xb1db3dc3, 0xd4bc0685, 0xa82376a4, 0xcd444de2, 0x62ed0028, + 0x078a3b6e, 0xe6ce9dfd, 0x83a9a6bb, 0x2c00eb71, 0x4967d037, + 0xd53e0b33, 0xb0593075, 0x1ff07dbf, 0x7a9746f9, 0x9bd3e06a, + 0xfeb4db2c, 0x511d96e6, 0x347aada0, 0x48e5dd81, 0x2d82e6c7, + 0x822bab0d, 0xe74c904b, 0x060836d8, 0x636f0d9e, 0xccc64054, + 0xa9a17b12, 0x2f04f01d, 0x4a63cb5b, 0xe5ca8691, 0x80adbdd7, + 0x61e91b44, 0x048e2002, 0xab276dc8, 0xce40568e, 0xb2df26af, + 0xd7b81de9, 0x78115023, 0x1d766b65, 0xfc32cdf6, 0x9955f6b0, + 0x36fcbb7a, 0x539b803c, 0xcfc25b38, 0xaaa5607e, 0x050c2db4, + 0x606b16f2, 0x812fb061, 0xe4488b27, 0x4be1c6ed, 0x2e86fdab, + 0x52198d8a, 0x377eb6cc, 0x98d7fb06, 0xfdb0c040, 0x1cf466d3, + 0x79935d95, 0xd63a105f, 0xb35d2b19, 0x6bf1402c, 0x0e967b6a, + 0xa13f36a0, 0xc4580de6, 0x251cab75, 0x407b9033, 0xefd2ddf9, + 0x8ab5e6bf, 0xf62a969e, 0x934dadd8, 0x3ce4e012, 0x5983db54, + 0xb8c77dc7, 0xdda04681, 0x72090b4b, 0x176e300d, 0x8b37eb09, + 0xee50d04f, 0x41f99d85, 0x249ea6c3, 0xc5da0050, 0xa0bd3b16, + 0x0f1476dc, 0x6a734d9a, 0x16ec3dbb, 0x738b06fd, 0xdc224b37, + 0xb9457071, 0x5801d6e2, 0x3d66eda4, 0x92cfa06e, 0xf7a89b28, + 0x710d1027, 0x146a2b61, 0xbbc366ab, 0xdea45ded, 0x3fe0fb7e, + 0x5a87c038, 0xf52e8df2, 0x9049b6b4, 0xecd6c695, 0x89b1fdd3, + 0x2618b019, 0x437f8b5f, 0xa23b2dcc, 0xc75c168a, 0x68f55b40, + 0x0d926006, 0x91cbbb02, 0xf4ac8044, 0x5b05cd8e, 0x3e62f6c8, + 0xdf26505b, 0xba416b1d, 0x15e826d7, 0x708f1d91, 0x0c106db0, + 0x697756f6, 0xc6de1b3c, 0xa3b9207a, 0x42fd86e9, 0x279abdaf, + 0x8833f065, 0xed54cb23, 0x5e09e03a, 0x3b6edb7c, 0x94c796b6, + 0xf1a0adf0, 0x10e40b63, 0x75833025, 0xda2a7def, 0xbf4d46a9, + 0xc3d23688, 0xa6b50dce, 0x091c4004, 0x6c7b7b42, 0x8d3fddd1, + 0xe858e697, 0x47f1ab5d, 0x2296901b, 0xbecf4b1f, 0xdba87059, + 0x74013d93, 0x116606d5, 0xf022a046, 0x95459b00, 0x3aecd6ca, + 0x5f8bed8c, 0x23149dad, 0x4673a6eb, 0xe9daeb21, 0x8cbdd067, + 0x6df976f4, 0x089e4db2, 0xa7370078, 0xc2503b3e, 0x44f5b031, + 0x21928b77, 0x8e3bc6bd, 0xeb5cfdfb, 0x0a185b68, 0x6f7f602e, + 0xc0d62de4, 0xa5b116a2, 0xd92e6683, 0xbc495dc5, 0x13e0100f, + 0x76872b49, 0x97c38dda, 0xf2a4b69c, 0x5d0dfb56, 0x386ac010, + 0xa4331b14, 0xc1542052, 0x6efd6d98, 0x0b9a56de, 0xeadef04d, + 0x8fb9cb0b, 0x201086c1, 0x4577bd87, 0x39e8cda6, 0x5c8ff6e0, + 0xf326bb2a, 0x9641806c, 0x770526ff, 0x12621db9, 0xbdcb5073, + 0xd8ac6b35}, + {0x00000000, 0xd7e28058, 0x74b406f1, 0xa35686a9, 0xe9680de2, + 0x3e8a8dba, 0x9ddc0b13, 0x4a3e8b4b, 0x09a11d85, 0xde439ddd, + 0x7d151b74, 0xaaf79b2c, 0xe0c91067, 0x372b903f, 0x947d1696, + 0x439f96ce, 0x13423b0a, 0xc4a0bb52, 0x67f63dfb, 0xb014bda3, + 0xfa2a36e8, 0x2dc8b6b0, 0x8e9e3019, 0x597cb041, 0x1ae3268f, + 0xcd01a6d7, 0x6e57207e, 0xb9b5a026, 0xf38b2b6d, 0x2469ab35, + 0x873f2d9c, 0x50ddadc4, 0x26847614, 0xf166f64c, 0x523070e5, + 0x85d2f0bd, 0xcfec7bf6, 0x180efbae, 0xbb587d07, 0x6cbafd5f, + 0x2f256b91, 0xf8c7ebc9, 0x5b916d60, 0x8c73ed38, 0xc64d6673, + 0x11afe62b, 0xb2f96082, 0x651be0da, 0x35c64d1e, 0xe224cd46, + 0x41724bef, 0x9690cbb7, 0xdcae40fc, 0x0b4cc0a4, 0xa81a460d, + 0x7ff8c655, 0x3c67509b, 0xeb85d0c3, 0x48d3566a, 0x9f31d632, + 0xd50f5d79, 0x02eddd21, 0xa1bb5b88, 0x7659dbd0, 0x4d08ec28, + 0x9aea6c70, 0x39bcead9, 0xee5e6a81, 0xa460e1ca, 0x73826192, + 0xd0d4e73b, 0x07366763, 0x44a9f1ad, 0x934b71f5, 0x301df75c, + 0xe7ff7704, 0xadc1fc4f, 0x7a237c17, 0xd975fabe, 0x0e977ae6, + 0x5e4ad722, 0x89a8577a, 0x2afed1d3, 0xfd1c518b, 0xb722dac0, + 0x60c05a98, 0xc396dc31, 0x14745c69, 0x57ebcaa7, 0x80094aff, + 0x235fcc56, 0xf4bd4c0e, 0xbe83c745, 0x6961471d, 0xca37c1b4, + 0x1dd541ec, 0x6b8c9a3c, 0xbc6e1a64, 0x1f389ccd, 0xc8da1c95, + 0x82e497de, 0x55061786, 0xf650912f, 0x21b21177, 0x622d87b9, + 0xb5cf07e1, 0x16998148, 0xc17b0110, 0x8b458a5b, 0x5ca70a03, + 0xfff18caa, 0x28130cf2, 0x78cea136, 0xaf2c216e, 0x0c7aa7c7, + 0xdb98279f, 0x91a6acd4, 0x46442c8c, 0xe512aa25, 0x32f02a7d, + 0x716fbcb3, 0xa68d3ceb, 0x05dbba42, 0xd2393a1a, 0x9807b151, + 0x4fe53109, 0xecb3b7a0, 0x3b5137f8, 0x9a11d850, 0x4df35808, + 0xeea5dea1, 0x39475ef9, 0x7379d5b2, 0xa49b55ea, 0x07cdd343, + 0xd02f531b, 0x93b0c5d5, 0x4452458d, 0xe704c324, 0x30e6437c, + 0x7ad8c837, 0xad3a486f, 0x0e6ccec6, 0xd98e4e9e, 0x8953e35a, + 0x5eb16302, 0xfde7e5ab, 0x2a0565f3, 0x603beeb8, 0xb7d96ee0, + 0x148fe849, 0xc36d6811, 0x80f2fedf, 0x57107e87, 0xf446f82e, + 0x23a47876, 0x699af33d, 0xbe787365, 0x1d2ef5cc, 0xcacc7594, + 0xbc95ae44, 0x6b772e1c, 0xc821a8b5, 0x1fc328ed, 0x55fda3a6, + 0x821f23fe, 0x2149a557, 0xf6ab250f, 0xb534b3c1, 0x62d63399, + 0xc180b530, 0x16623568, 0x5c5cbe23, 0x8bbe3e7b, 0x28e8b8d2, + 0xff0a388a, 0xafd7954e, 0x78351516, 0xdb6393bf, 0x0c8113e7, + 0x46bf98ac, 0x915d18f4, 0x320b9e5d, 0xe5e91e05, 0xa67688cb, + 0x71940893, 0xd2c28e3a, 0x05200e62, 0x4f1e8529, 0x98fc0571, + 0x3baa83d8, 0xec480380, 0xd7193478, 0x00fbb420, 0xa3ad3289, + 0x744fb2d1, 0x3e71399a, 0xe993b9c2, 0x4ac53f6b, 0x9d27bf33, + 0xdeb829fd, 0x095aa9a5, 0xaa0c2f0c, 0x7deeaf54, 0x37d0241f, + 0xe032a447, 0x436422ee, 0x9486a2b6, 0xc45b0f72, 0x13b98f2a, + 0xb0ef0983, 0x670d89db, 0x2d330290, 0xfad182c8, 0x59870461, + 0x8e658439, 0xcdfa12f7, 0x1a1892af, 0xb94e1406, 0x6eac945e, + 0x24921f15, 0xf3709f4d, 0x502619e4, 0x87c499bc, 0xf19d426c, + 0x267fc234, 0x8529449d, 0x52cbc4c5, 0x18f54f8e, 0xcf17cfd6, + 0x6c41497f, 0xbba3c927, 0xf83c5fe9, 0x2fdedfb1, 0x8c885918, + 0x5b6ad940, 0x1154520b, 0xc6b6d253, 0x65e054fa, 0xb202d4a2, + 0xe2df7966, 0x353df93e, 0x966b7f97, 0x4189ffcf, 0x0bb77484, + 0xdc55f4dc, 0x7f037275, 0xa8e1f22d, 0xeb7e64e3, 0x3c9ce4bb, + 0x9fca6212, 0x4828e24a, 0x02166901, 0xd5f4e959, 0x76a26ff0, + 0xa140efa8}, + {0x00000000, 0xef52b6e1, 0x05d46b83, 0xea86dd62, 0x0ba8d706, + 0xe4fa61e7, 0x0e7cbc85, 0xe12e0a64, 0x1751ae0c, 0xf80318ed, + 0x1285c58f, 0xfdd7736e, 0x1cf9790a, 0xf3abcfeb, 0x192d1289, + 0xf67fa468, 0x2ea35c18, 0xc1f1eaf9, 0x2b77379b, 0xc425817a, + 0x250b8b1e, 0xca593dff, 0x20dfe09d, 0xcf8d567c, 0x39f2f214, + 0xd6a044f5, 0x3c269997, 0xd3742f76, 0x325a2512, 0xdd0893f3, + 0x378e4e91, 0xd8dcf870, 0x5d46b830, 0xb2140ed1, 0x5892d3b3, + 0xb7c06552, 0x56ee6f36, 0xb9bcd9d7, 0x533a04b5, 0xbc68b254, + 0x4a17163c, 0xa545a0dd, 0x4fc37dbf, 0xa091cb5e, 0x41bfc13a, + 0xaeed77db, 0x446baab9, 0xab391c58, 0x73e5e428, 0x9cb752c9, + 0x76318fab, 0x9963394a, 0x784d332e, 0x971f85cf, 0x7d9958ad, + 0x92cbee4c, 0x64b44a24, 0x8be6fcc5, 0x616021a7, 0x8e329746, + 0x6f1c9d22, 0x804e2bc3, 0x6ac8f6a1, 0x859a4040, 0xba8d7060, + 0x55dfc681, 0xbf591be3, 0x500bad02, 0xb125a766, 0x5e771187, + 0xb4f1cce5, 0x5ba37a04, 0xaddcde6c, 0x428e688d, 0xa808b5ef, + 0x475a030e, 0xa674096a, 0x4926bf8b, 0xa3a062e9, 0x4cf2d408, + 0x942e2c78, 0x7b7c9a99, 0x91fa47fb, 0x7ea8f11a, 0x9f86fb7e, + 0x70d44d9f, 0x9a5290fd, 0x7500261c, 0x837f8274, 0x6c2d3495, + 0x86abe9f7, 0x69f95f16, 0x88d75572, 0x6785e393, 0x8d033ef1, + 0x62518810, 0xe7cbc850, 0x08997eb1, 0xe21fa3d3, 0x0d4d1532, + 0xec631f56, 0x0331a9b7, 0xe9b774d5, 0x06e5c234, 0xf09a665c, + 0x1fc8d0bd, 0xf54e0ddf, 0x1a1cbb3e, 0xfb32b15a, 0x146007bb, + 0xfee6dad9, 0x11b46c38, 0xc9689448, 0x263a22a9, 0xccbcffcb, + 0x23ee492a, 0xc2c0434e, 0x2d92f5af, 0xc71428cd, 0x28469e2c, + 0xde393a44, 0x316b8ca5, 0xdbed51c7, 0x34bfe726, 0xd591ed42, + 0x3ac35ba3, 0xd04586c1, 0x3f173020, 0xae6be681, 0x41395060, + 0xabbf8d02, 0x44ed3be3, 0xa5c33187, 0x4a918766, 0xa0175a04, + 0x4f45ece5, 0xb93a488d, 0x5668fe6c, 0xbcee230e, 0x53bc95ef, + 0xb2929f8b, 0x5dc0296a, 0xb746f408, 0x581442e9, 0x80c8ba99, + 0x6f9a0c78, 0x851cd11a, 0x6a4e67fb, 0x8b606d9f, 0x6432db7e, + 0x8eb4061c, 0x61e6b0fd, 0x97991495, 0x78cba274, 0x924d7f16, + 0x7d1fc9f7, 0x9c31c393, 0x73637572, 0x99e5a810, 0x76b71ef1, + 0xf32d5eb1, 0x1c7fe850, 0xf6f93532, 0x19ab83d3, 0xf88589b7, + 0x17d73f56, 0xfd51e234, 0x120354d5, 0xe47cf0bd, 0x0b2e465c, + 0xe1a89b3e, 0x0efa2ddf, 0xefd427bb, 0x0086915a, 0xea004c38, + 0x0552fad9, 0xdd8e02a9, 0x32dcb448, 0xd85a692a, 0x3708dfcb, + 0xd626d5af, 0x3974634e, 0xd3f2be2c, 0x3ca008cd, 0xcadfaca5, + 0x258d1a44, 0xcf0bc726, 0x205971c7, 0xc1777ba3, 0x2e25cd42, + 0xc4a31020, 0x2bf1a6c1, 0x14e696e1, 0xfbb42000, 0x1132fd62, + 0xfe604b83, 0x1f4e41e7, 0xf01cf706, 0x1a9a2a64, 0xf5c89c85, + 0x03b738ed, 0xece58e0c, 0x0663536e, 0xe931e58f, 0x081fefeb, + 0xe74d590a, 0x0dcb8468, 0xe2993289, 0x3a45caf9, 0xd5177c18, + 0x3f91a17a, 0xd0c3179b, 0x31ed1dff, 0xdebfab1e, 0x3439767c, + 0xdb6bc09d, 0x2d1464f5, 0xc246d214, 0x28c00f76, 0xc792b997, + 0x26bcb3f3, 0xc9ee0512, 0x2368d870, 0xcc3a6e91, 0x49a02ed1, + 0xa6f29830, 0x4c744552, 0xa326f3b3, 0x4208f9d7, 0xad5a4f36, + 0x47dc9254, 0xa88e24b5, 0x5ef180dd, 0xb1a3363c, 0x5b25eb5e, + 0xb4775dbf, 0x555957db, 0xba0be13a, 0x508d3c58, 0xbfdf8ab9, + 0x670372c9, 0x8851c428, 0x62d7194a, 0x8d85afab, 0x6caba5cf, + 0x83f9132e, 0x697fce4c, 0x862d78ad, 0x7052dcc5, 0x9f006a24, + 0x7586b746, 0x9ad401a7, 0x7bfa0bc3, 0x94a8bd22, 0x7e2e6040, + 0x917cd6a1}, + {0x00000000, 0x87a6cb43, 0xd43c90c7, 0x539a5b84, 0x730827cf, + 0xf4aeec8c, 0xa734b708, 0x20927c4b, 0xe6104f9e, 0x61b684dd, + 0x322cdf59, 0xb58a141a, 0x95186851, 0x12bea312, 0x4124f896, + 0xc68233d5, 0x1751997d, 0x90f7523e, 0xc36d09ba, 0x44cbc2f9, + 0x6459beb2, 0xe3ff75f1, 0xb0652e75, 0x37c3e536, 0xf141d6e3, + 0x76e71da0, 0x257d4624, 0xa2db8d67, 0x8249f12c, 0x05ef3a6f, + 0x567561eb, 0xd1d3aaa8, 0x2ea332fa, 0xa905f9b9, 0xfa9fa23d, + 0x7d39697e, 0x5dab1535, 0xda0dde76, 0x899785f2, 0x0e314eb1, + 0xc8b37d64, 0x4f15b627, 0x1c8feda3, 0x9b2926e0, 0xbbbb5aab, + 0x3c1d91e8, 0x6f87ca6c, 0xe821012f, 0x39f2ab87, 0xbe5460c4, + 0xedce3b40, 0x6a68f003, 0x4afa8c48, 0xcd5c470b, 0x9ec61c8f, + 0x1960d7cc, 0xdfe2e419, 0x58442f5a, 0x0bde74de, 0x8c78bf9d, + 0xaceac3d6, 0x2b4c0895, 0x78d65311, 0xff709852, 0x5d4665f4, + 0xdae0aeb7, 0x897af533, 0x0edc3e70, 0x2e4e423b, 0xa9e88978, + 0xfa72d2fc, 0x7dd419bf, 0xbb562a6a, 0x3cf0e129, 0x6f6abaad, + 0xe8cc71ee, 0xc85e0da5, 0x4ff8c6e6, 0x1c629d62, 0x9bc45621, + 0x4a17fc89, 0xcdb137ca, 0x9e2b6c4e, 0x198da70d, 0x391fdb46, + 0xbeb91005, 0xed234b81, 0x6a8580c2, 0xac07b317, 0x2ba17854, + 0x783b23d0, 0xff9de893, 0xdf0f94d8, 0x58a95f9b, 0x0b33041f, + 0x8c95cf5c, 0x73e5570e, 0xf4439c4d, 0xa7d9c7c9, 0x207f0c8a, + 0x00ed70c1, 0x874bbb82, 0xd4d1e006, 0x53772b45, 0x95f51890, + 0x1253d3d3, 0x41c98857, 0xc66f4314, 0xe6fd3f5f, 0x615bf41c, + 0x32c1af98, 0xb56764db, 0x64b4ce73, 0xe3120530, 0xb0885eb4, + 0x372e95f7, 0x17bce9bc, 0x901a22ff, 0xc380797b, 0x4426b238, + 0x82a481ed, 0x05024aae, 0x5698112a, 0xd13eda69, 0xf1aca622, + 0x760a6d61, 0x259036e5, 0xa236fda6, 0xba8ccbe8, 0x3d2a00ab, + 0x6eb05b2f, 0xe916906c, 0xc984ec27, 0x4e222764, 0x1db87ce0, + 0x9a1eb7a3, 0x5c9c8476, 0xdb3a4f35, 0x88a014b1, 0x0f06dff2, + 0x2f94a3b9, 0xa83268fa, 0xfba8337e, 0x7c0ef83d, 0xaddd5295, + 0x2a7b99d6, 0x79e1c252, 0xfe470911, 0xded5755a, 0x5973be19, + 0x0ae9e59d, 0x8d4f2ede, 0x4bcd1d0b, 0xcc6bd648, 0x9ff18dcc, + 0x1857468f, 0x38c53ac4, 0xbf63f187, 0xecf9aa03, 0x6b5f6140, + 0x942ff912, 0x13893251, 0x401369d5, 0xc7b5a296, 0xe727dedd, + 0x6081159e, 0x331b4e1a, 0xb4bd8559, 0x723fb68c, 0xf5997dcf, + 0xa603264b, 0x21a5ed08, 0x01379143, 0x86915a00, 0xd50b0184, + 0x52adcac7, 0x837e606f, 0x04d8ab2c, 0x5742f0a8, 0xd0e43beb, + 0xf07647a0, 0x77d08ce3, 0x244ad767, 0xa3ec1c24, 0x656e2ff1, + 0xe2c8e4b2, 0xb152bf36, 0x36f47475, 0x1666083e, 0x91c0c37d, + 0xc25a98f9, 0x45fc53ba, 0xe7caae1c, 0x606c655f, 0x33f63edb, + 0xb450f598, 0x94c289d3, 0x13644290, 0x40fe1914, 0xc758d257, + 0x01dae182, 0x867c2ac1, 0xd5e67145, 0x5240ba06, 0x72d2c64d, + 0xf5740d0e, 0xa6ee568a, 0x21489dc9, 0xf09b3761, 0x773dfc22, + 0x24a7a7a6, 0xa3016ce5, 0x839310ae, 0x0435dbed, 0x57af8069, + 0xd0094b2a, 0x168b78ff, 0x912db3bc, 0xc2b7e838, 0x4511237b, + 0x65835f30, 0xe2259473, 0xb1bfcff7, 0x361904b4, 0xc9699ce6, + 0x4ecf57a5, 0x1d550c21, 0x9af3c762, 0xba61bb29, 0x3dc7706a, + 0x6e5d2bee, 0xe9fbe0ad, 0x2f79d378, 0xa8df183b, 0xfb4543bf, + 0x7ce388fc, 0x5c71f4b7, 0xdbd73ff4, 0x884d6470, 0x0febaf33, + 0xde38059b, 0x599eced8, 0x0a04955c, 0x8da25e1f, 0xad302254, + 0x2a96e917, 0x790cb293, 0xfeaa79d0, 0x38284a05, 0xbf8e8146, + 0xec14dac2, 0x6bb21181, 0x4b206dca, 0xcc86a689, 0x9f1cfd0d, + 0x18ba364e}}; + +local const z_word_t FAR crc_braid_big_table[][256] = { + {0x0000000000000000, 0x43cba68700000000, 0xc7903cd400000000, + 0x845b9a5300000000, 0xcf27087300000000, 0x8cecaef400000000, + 0x08b734a700000000, 0x4b7c922000000000, 0x9e4f10e600000000, + 0xdd84b66100000000, 0x59df2c3200000000, 0x1a148ab500000000, + 0x5168189500000000, 0x12a3be1200000000, 0x96f8244100000000, + 0xd53382c600000000, 0x7d99511700000000, 0x3e52f79000000000, + 0xba096dc300000000, 0xf9c2cb4400000000, 0xb2be596400000000, + 0xf175ffe300000000, 0x752e65b000000000, 0x36e5c33700000000, + 0xe3d641f100000000, 0xa01de77600000000, 0x24467d2500000000, + 0x678ddba200000000, 0x2cf1498200000000, 0x6f3aef0500000000, + 0xeb61755600000000, 0xa8aad3d100000000, 0xfa32a32e00000000, + 0xb9f905a900000000, 0x3da29ffa00000000, 0x7e69397d00000000, + 0x3515ab5d00000000, 0x76de0dda00000000, 0xf285978900000000, + 0xb14e310e00000000, 0x647db3c800000000, 0x27b6154f00000000, + 0xa3ed8f1c00000000, 0xe026299b00000000, 0xab5abbbb00000000, + 0xe8911d3c00000000, 0x6cca876f00000000, 0x2f0121e800000000, + 0x87abf23900000000, 0xc46054be00000000, 0x403bceed00000000, + 0x03f0686a00000000, 0x488cfa4a00000000, 0x0b475ccd00000000, + 0x8f1cc69e00000000, 0xccd7601900000000, 0x19e4e2df00000000, + 0x5a2f445800000000, 0xde74de0b00000000, 0x9dbf788c00000000, + 0xd6c3eaac00000000, 0x95084c2b00000000, 0x1153d67800000000, + 0x529870ff00000000, 0xf465465d00000000, 0xb7aee0da00000000, + 0x33f57a8900000000, 0x703edc0e00000000, 0x3b424e2e00000000, + 0x7889e8a900000000, 0xfcd272fa00000000, 0xbf19d47d00000000, + 0x6a2a56bb00000000, 0x29e1f03c00000000, 0xadba6a6f00000000, + 0xee71cce800000000, 0xa50d5ec800000000, 0xe6c6f84f00000000, + 0x629d621c00000000, 0x2156c49b00000000, 0x89fc174a00000000, + 0xca37b1cd00000000, 0x4e6c2b9e00000000, 0x0da78d1900000000, + 0x46db1f3900000000, 0x0510b9be00000000, 0x814b23ed00000000, + 0xc280856a00000000, 0x17b307ac00000000, 0x5478a12b00000000, + 0xd0233b7800000000, 0x93e89dff00000000, 0xd8940fdf00000000, + 0x9b5fa95800000000, 0x1f04330b00000000, 0x5ccf958c00000000, + 0x0e57e57300000000, 0x4d9c43f400000000, 0xc9c7d9a700000000, + 0x8a0c7f2000000000, 0xc170ed0000000000, 0x82bb4b8700000000, + 0x06e0d1d400000000, 0x452b775300000000, 0x9018f59500000000, + 0xd3d3531200000000, 0x5788c94100000000, 0x14436fc600000000, + 0x5f3ffde600000000, 0x1cf45b6100000000, 0x98afc13200000000, + 0xdb6467b500000000, 0x73ceb46400000000, 0x300512e300000000, + 0xb45e88b000000000, 0xf7952e3700000000, 0xbce9bc1700000000, + 0xff221a9000000000, 0x7b7980c300000000, 0x38b2264400000000, + 0xed81a48200000000, 0xae4a020500000000, 0x2a11985600000000, + 0x69da3ed100000000, 0x22a6acf100000000, 0x616d0a7600000000, + 0xe536902500000000, 0xa6fd36a200000000, 0xe8cb8cba00000000, + 0xab002a3d00000000, 0x2f5bb06e00000000, 0x6c9016e900000000, + 0x27ec84c900000000, 0x6427224e00000000, 0xe07cb81d00000000, + 0xa3b71e9a00000000, 0x76849c5c00000000, 0x354f3adb00000000, + 0xb114a08800000000, 0xf2df060f00000000, 0xb9a3942f00000000, + 0xfa6832a800000000, 0x7e33a8fb00000000, 0x3df80e7c00000000, + 0x9552ddad00000000, 0xd6997b2a00000000, 0x52c2e17900000000, + 0x110947fe00000000, 0x5a75d5de00000000, 0x19be735900000000, + 0x9de5e90a00000000, 0xde2e4f8d00000000, 0x0b1dcd4b00000000, + 0x48d66bcc00000000, 0xcc8df19f00000000, 0x8f46571800000000, + 0xc43ac53800000000, 0x87f163bf00000000, 0x03aaf9ec00000000, + 0x40615f6b00000000, 0x12f92f9400000000, 0x5132891300000000, + 0xd569134000000000, 0x96a2b5c700000000, 0xddde27e700000000, + 0x9e15816000000000, 0x1a4e1b3300000000, 0x5985bdb400000000, + 0x8cb63f7200000000, 0xcf7d99f500000000, 0x4b2603a600000000, + 0x08eda52100000000, 0x4391370100000000, 0x005a918600000000, + 0x84010bd500000000, 0xc7caad5200000000, 0x6f607e8300000000, + 0x2cabd80400000000, 0xa8f0425700000000, 0xeb3be4d000000000, + 0xa04776f000000000, 0xe38cd07700000000, 0x67d74a2400000000, + 0x241ceca300000000, 0xf12f6e6500000000, 0xb2e4c8e200000000, + 0x36bf52b100000000, 0x7574f43600000000, 0x3e08661600000000, + 0x7dc3c09100000000, 0xf9985ac200000000, 0xba53fc4500000000, + 0x1caecae700000000, 0x5f656c6000000000, 0xdb3ef63300000000, + 0x98f550b400000000, 0xd389c29400000000, 0x9042641300000000, + 0x1419fe4000000000, 0x57d258c700000000, 0x82e1da0100000000, + 0xc12a7c8600000000, 0x4571e6d500000000, 0x06ba405200000000, + 0x4dc6d27200000000, 0x0e0d74f500000000, 0x8a56eea600000000, + 0xc99d482100000000, 0x61379bf000000000, 0x22fc3d7700000000, + 0xa6a7a72400000000, 0xe56c01a300000000, 0xae10938300000000, + 0xeddb350400000000, 0x6980af5700000000, 0x2a4b09d000000000, + 0xff788b1600000000, 0xbcb32d9100000000, 0x38e8b7c200000000, + 0x7b23114500000000, 0x305f836500000000, 0x739425e200000000, + 0xf7cfbfb100000000, 0xb404193600000000, 0xe69c69c900000000, + 0xa557cf4e00000000, 0x210c551d00000000, 0x62c7f39a00000000, + 0x29bb61ba00000000, 0x6a70c73d00000000, 0xee2b5d6e00000000, + 0xade0fbe900000000, 0x78d3792f00000000, 0x3b18dfa800000000, + 0xbf4345fb00000000, 0xfc88e37c00000000, 0xb7f4715c00000000, + 0xf43fd7db00000000, 0x70644d8800000000, 0x33afeb0f00000000, + 0x9b0538de00000000, 0xd8ce9e5900000000, 0x5c95040a00000000, + 0x1f5ea28d00000000, 0x542230ad00000000, 0x17e9962a00000000, + 0x93b20c7900000000, 0xd079aafe00000000, 0x054a283800000000, + 0x46818ebf00000000, 0xc2da14ec00000000, 0x8111b26b00000000, + 0xca6d204b00000000, 0x89a686cc00000000, 0x0dfd1c9f00000000, + 0x4e36ba1800000000}, + {0x0000000000000000, 0xe1b652ef00000000, 0x836bd40500000000, + 0x62dd86ea00000000, 0x06d7a80b00000000, 0xe761fae400000000, + 0x85bc7c0e00000000, 0x640a2ee100000000, 0x0cae511700000000, + 0xed1803f800000000, 0x8fc5851200000000, 0x6e73d7fd00000000, + 0x0a79f91c00000000, 0xebcfabf300000000, 0x89122d1900000000, + 0x68a47ff600000000, 0x185ca32e00000000, 0xf9eaf1c100000000, + 0x9b37772b00000000, 0x7a8125c400000000, 0x1e8b0b2500000000, + 0xff3d59ca00000000, 0x9de0df2000000000, 0x7c568dcf00000000, + 0x14f2f23900000000, 0xf544a0d600000000, 0x9799263c00000000, + 0x762f74d300000000, 0x12255a3200000000, 0xf39308dd00000000, + 0x914e8e3700000000, 0x70f8dcd800000000, 0x30b8465d00000000, + 0xd10e14b200000000, 0xb3d3925800000000, 0x5265c0b700000000, + 0x366fee5600000000, 0xd7d9bcb900000000, 0xb5043a5300000000, + 0x54b268bc00000000, 0x3c16174a00000000, 0xdda045a500000000, + 0xbf7dc34f00000000, 0x5ecb91a000000000, 0x3ac1bf4100000000, + 0xdb77edae00000000, 0xb9aa6b4400000000, 0x581c39ab00000000, + 0x28e4e57300000000, 0xc952b79c00000000, 0xab8f317600000000, + 0x4a39639900000000, 0x2e334d7800000000, 0xcf851f9700000000, + 0xad58997d00000000, 0x4ceecb9200000000, 0x244ab46400000000, + 0xc5fce68b00000000, 0xa721606100000000, 0x4697328e00000000, + 0x229d1c6f00000000, 0xc32b4e8000000000, 0xa1f6c86a00000000, + 0x40409a8500000000, 0x60708dba00000000, 0x81c6df5500000000, + 0xe31b59bf00000000, 0x02ad0b5000000000, 0x66a725b100000000, + 0x8711775e00000000, 0xe5ccf1b400000000, 0x047aa35b00000000, + 0x6cdedcad00000000, 0x8d688e4200000000, 0xefb508a800000000, + 0x0e035a4700000000, 0x6a0974a600000000, 0x8bbf264900000000, + 0xe962a0a300000000, 0x08d4f24c00000000, 0x782c2e9400000000, + 0x999a7c7b00000000, 0xfb47fa9100000000, 0x1af1a87e00000000, + 0x7efb869f00000000, 0x9f4dd47000000000, 0xfd90529a00000000, + 0x1c26007500000000, 0x74827f8300000000, 0x95342d6c00000000, + 0xf7e9ab8600000000, 0x165ff96900000000, 0x7255d78800000000, + 0x93e3856700000000, 0xf13e038d00000000, 0x1088516200000000, + 0x50c8cbe700000000, 0xb17e990800000000, 0xd3a31fe200000000, + 0x32154d0d00000000, 0x561f63ec00000000, 0xb7a9310300000000, + 0xd574b7e900000000, 0x34c2e50600000000, 0x5c669af000000000, + 0xbdd0c81f00000000, 0xdf0d4ef500000000, 0x3ebb1c1a00000000, + 0x5ab132fb00000000, 0xbb07601400000000, 0xd9dae6fe00000000, + 0x386cb41100000000, 0x489468c900000000, 0xa9223a2600000000, + 0xcbffbccc00000000, 0x2a49ee2300000000, 0x4e43c0c200000000, + 0xaff5922d00000000, 0xcd2814c700000000, 0x2c9e462800000000, + 0x443a39de00000000, 0xa58c6b3100000000, 0xc751eddb00000000, + 0x26e7bf3400000000, 0x42ed91d500000000, 0xa35bc33a00000000, + 0xc18645d000000000, 0x2030173f00000000, 0x81e66bae00000000, + 0x6050394100000000, 0x028dbfab00000000, 0xe33bed4400000000, + 0x8731c3a500000000, 0x6687914a00000000, 0x045a17a000000000, + 0xe5ec454f00000000, 0x8d483ab900000000, 0x6cfe685600000000, + 0x0e23eebc00000000, 0xef95bc5300000000, 0x8b9f92b200000000, + 0x6a29c05d00000000, 0x08f446b700000000, 0xe942145800000000, + 0x99bac88000000000, 0x780c9a6f00000000, 0x1ad11c8500000000, + 0xfb674e6a00000000, 0x9f6d608b00000000, 0x7edb326400000000, + 0x1c06b48e00000000, 0xfdb0e66100000000, 0x9514999700000000, + 0x74a2cb7800000000, 0x167f4d9200000000, 0xf7c91f7d00000000, + 0x93c3319c00000000, 0x7275637300000000, 0x10a8e59900000000, + 0xf11eb77600000000, 0xb15e2df300000000, 0x50e87f1c00000000, + 0x3235f9f600000000, 0xd383ab1900000000, 0xb78985f800000000, + 0x563fd71700000000, 0x34e251fd00000000, 0xd554031200000000, + 0xbdf07ce400000000, 0x5c462e0b00000000, 0x3e9ba8e100000000, + 0xdf2dfa0e00000000, 0xbb27d4ef00000000, 0x5a91860000000000, + 0x384c00ea00000000, 0xd9fa520500000000, 0xa9028edd00000000, + 0x48b4dc3200000000, 0x2a695ad800000000, 0xcbdf083700000000, + 0xafd526d600000000, 0x4e63743900000000, 0x2cbef2d300000000, + 0xcd08a03c00000000, 0xa5acdfca00000000, 0x441a8d2500000000, + 0x26c70bcf00000000, 0xc771592000000000, 0xa37b77c100000000, + 0x42cd252e00000000, 0x2010a3c400000000, 0xc1a6f12b00000000, + 0xe196e61400000000, 0x0020b4fb00000000, 0x62fd321100000000, + 0x834b60fe00000000, 0xe7414e1f00000000, 0x06f71cf000000000, + 0x642a9a1a00000000, 0x859cc8f500000000, 0xed38b70300000000, + 0x0c8ee5ec00000000, 0x6e53630600000000, 0x8fe531e900000000, + 0xebef1f0800000000, 0x0a594de700000000, 0x6884cb0d00000000, + 0x893299e200000000, 0xf9ca453a00000000, 0x187c17d500000000, + 0x7aa1913f00000000, 0x9b17c3d000000000, 0xff1ded3100000000, + 0x1eabbfde00000000, 0x7c76393400000000, 0x9dc06bdb00000000, + 0xf564142d00000000, 0x14d246c200000000, 0x760fc02800000000, + 0x97b992c700000000, 0xf3b3bc2600000000, 0x1205eec900000000, + 0x70d8682300000000, 0x916e3acc00000000, 0xd12ea04900000000, + 0x3098f2a600000000, 0x5245744c00000000, 0xb3f326a300000000, + 0xd7f9084200000000, 0x364f5aad00000000, 0x5492dc4700000000, + 0xb5248ea800000000, 0xdd80f15e00000000, 0x3c36a3b100000000, + 0x5eeb255b00000000, 0xbf5d77b400000000, 0xdb57595500000000, + 0x3ae10bba00000000, 0x583c8d5000000000, 0xb98adfbf00000000, + 0xc972036700000000, 0x28c4518800000000, 0x4a19d76200000000, + 0xabaf858d00000000, 0xcfa5ab6c00000000, 0x2e13f98300000000, + 0x4cce7f6900000000, 0xad782d8600000000, 0xc5dc527000000000, + 0x246a009f00000000, 0x46b7867500000000, 0xa701d49a00000000, + 0xc30bfa7b00000000, 0x22bda89400000000, 0x40602e7e00000000, + 0xa1d67c9100000000}, + {0x0000000000000000, 0x5880e2d700000000, 0xf106b47400000000, + 0xa98656a300000000, 0xe20d68e900000000, 0xba8d8a3e00000000, + 0x130bdc9d00000000, 0x4b8b3e4a00000000, 0x851da10900000000, + 0xdd9d43de00000000, 0x741b157d00000000, 0x2c9bf7aa00000000, + 0x6710c9e000000000, 0x3f902b3700000000, 0x96167d9400000000, + 0xce969f4300000000, 0x0a3b421300000000, 0x52bba0c400000000, + 0xfb3df66700000000, 0xa3bd14b000000000, 0xe8362afa00000000, + 0xb0b6c82d00000000, 0x19309e8e00000000, 0x41b07c5900000000, + 0x8f26e31a00000000, 0xd7a601cd00000000, 0x7e20576e00000000, + 0x26a0b5b900000000, 0x6d2b8bf300000000, 0x35ab692400000000, + 0x9c2d3f8700000000, 0xc4addd5000000000, 0x1476842600000000, + 0x4cf666f100000000, 0xe570305200000000, 0xbdf0d28500000000, + 0xf67beccf00000000, 0xaefb0e1800000000, 0x077d58bb00000000, + 0x5ffdba6c00000000, 0x916b252f00000000, 0xc9ebc7f800000000, + 0x606d915b00000000, 0x38ed738c00000000, 0x73664dc600000000, + 0x2be6af1100000000, 0x8260f9b200000000, 0xdae01b6500000000, + 0x1e4dc63500000000, 0x46cd24e200000000, 0xef4b724100000000, + 0xb7cb909600000000, 0xfc40aedc00000000, 0xa4c04c0b00000000, + 0x0d461aa800000000, 0x55c6f87f00000000, 0x9b50673c00000000, + 0xc3d085eb00000000, 0x6a56d34800000000, 0x32d6319f00000000, + 0x795d0fd500000000, 0x21dded0200000000, 0x885bbba100000000, + 0xd0db597600000000, 0x28ec084d00000000, 0x706cea9a00000000, + 0xd9eabc3900000000, 0x816a5eee00000000, 0xcae160a400000000, + 0x9261827300000000, 0x3be7d4d000000000, 0x6367360700000000, + 0xadf1a94400000000, 0xf5714b9300000000, 0x5cf71d3000000000, + 0x0477ffe700000000, 0x4ffcc1ad00000000, 0x177c237a00000000, + 0xbefa75d900000000, 0xe67a970e00000000, 0x22d74a5e00000000, + 0x7a57a88900000000, 0xd3d1fe2a00000000, 0x8b511cfd00000000, + 0xc0da22b700000000, 0x985ac06000000000, 0x31dc96c300000000, + 0x695c741400000000, 0xa7caeb5700000000, 0xff4a098000000000, + 0x56cc5f2300000000, 0x0e4cbdf400000000, 0x45c783be00000000, + 0x1d47616900000000, 0xb4c137ca00000000, 0xec41d51d00000000, + 0x3c9a8c6b00000000, 0x641a6ebc00000000, 0xcd9c381f00000000, + 0x951cdac800000000, 0xde97e48200000000, 0x8617065500000000, + 0x2f9150f600000000, 0x7711b22100000000, 0xb9872d6200000000, + 0xe107cfb500000000, 0x4881991600000000, 0x10017bc100000000, + 0x5b8a458b00000000, 0x030aa75c00000000, 0xaa8cf1ff00000000, + 0xf20c132800000000, 0x36a1ce7800000000, 0x6e212caf00000000, + 0xc7a77a0c00000000, 0x9f2798db00000000, 0xd4aca69100000000, + 0x8c2c444600000000, 0x25aa12e500000000, 0x7d2af03200000000, + 0xb3bc6f7100000000, 0xeb3c8da600000000, 0x42badb0500000000, + 0x1a3a39d200000000, 0x51b1079800000000, 0x0931e54f00000000, + 0xa0b7b3ec00000000, 0xf837513b00000000, 0x50d8119a00000000, + 0x0858f34d00000000, 0xa1dea5ee00000000, 0xf95e473900000000, + 0xb2d5797300000000, 0xea559ba400000000, 0x43d3cd0700000000, + 0x1b532fd000000000, 0xd5c5b09300000000, 0x8d45524400000000, + 0x24c304e700000000, 0x7c43e63000000000, 0x37c8d87a00000000, + 0x6f483aad00000000, 0xc6ce6c0e00000000, 0x9e4e8ed900000000, + 0x5ae3538900000000, 0x0263b15e00000000, 0xabe5e7fd00000000, + 0xf365052a00000000, 0xb8ee3b6000000000, 0xe06ed9b700000000, + 0x49e88f1400000000, 0x11686dc300000000, 0xdffef28000000000, + 0x877e105700000000, 0x2ef846f400000000, 0x7678a42300000000, + 0x3df39a6900000000, 0x657378be00000000, 0xccf52e1d00000000, + 0x9475ccca00000000, 0x44ae95bc00000000, 0x1c2e776b00000000, + 0xb5a821c800000000, 0xed28c31f00000000, 0xa6a3fd5500000000, + 0xfe231f8200000000, 0x57a5492100000000, 0x0f25abf600000000, + 0xc1b334b500000000, 0x9933d66200000000, 0x30b580c100000000, + 0x6835621600000000, 0x23be5c5c00000000, 0x7b3ebe8b00000000, + 0xd2b8e82800000000, 0x8a380aff00000000, 0x4e95d7af00000000, + 0x1615357800000000, 0xbf9363db00000000, 0xe713810c00000000, + 0xac98bf4600000000, 0xf4185d9100000000, 0x5d9e0b3200000000, + 0x051ee9e500000000, 0xcb8876a600000000, 0x9308947100000000, + 0x3a8ec2d200000000, 0x620e200500000000, 0x29851e4f00000000, + 0x7105fc9800000000, 0xd883aa3b00000000, 0x800348ec00000000, + 0x783419d700000000, 0x20b4fb0000000000, 0x8932ada300000000, + 0xd1b24f7400000000, 0x9a39713e00000000, 0xc2b993e900000000, + 0x6b3fc54a00000000, 0x33bf279d00000000, 0xfd29b8de00000000, + 0xa5a95a0900000000, 0x0c2f0caa00000000, 0x54afee7d00000000, + 0x1f24d03700000000, 0x47a432e000000000, 0xee22644300000000, + 0xb6a2869400000000, 0x720f5bc400000000, 0x2a8fb91300000000, + 0x8309efb000000000, 0xdb890d6700000000, 0x9002332d00000000, + 0xc882d1fa00000000, 0x6104875900000000, 0x3984658e00000000, + 0xf712facd00000000, 0xaf92181a00000000, 0x06144eb900000000, + 0x5e94ac6e00000000, 0x151f922400000000, 0x4d9f70f300000000, + 0xe419265000000000, 0xbc99c48700000000, 0x6c429df100000000, + 0x34c27f2600000000, 0x9d44298500000000, 0xc5c4cb5200000000, + 0x8e4ff51800000000, 0xd6cf17cf00000000, 0x7f49416c00000000, + 0x27c9a3bb00000000, 0xe95f3cf800000000, 0xb1dfde2f00000000, + 0x1859888c00000000, 0x40d96a5b00000000, 0x0b52541100000000, + 0x53d2b6c600000000, 0xfa54e06500000000, 0xa2d402b200000000, + 0x6679dfe200000000, 0x3ef93d3500000000, 0x977f6b9600000000, + 0xcfff894100000000, 0x8474b70b00000000, 0xdcf455dc00000000, + 0x7572037f00000000, 0x2df2e1a800000000, 0xe3647eeb00000000, + 0xbbe49c3c00000000, 0x1262ca9f00000000, 0x4ae2284800000000, + 0x0169160200000000, 0x59e9f4d500000000, 0xf06fa27600000000, + 0xa8ef40a100000000}, + {0x0000000000000000, 0x463b676500000000, 0x8c76ceca00000000, + 0xca4da9af00000000, 0x59ebed4e00000000, 0x1fd08a2b00000000, + 0xd59d238400000000, 0x93a644e100000000, 0xb2d6db9d00000000, + 0xf4edbcf800000000, 0x3ea0155700000000, 0x789b723200000000, + 0xeb3d36d300000000, 0xad0651b600000000, 0x674bf81900000000, + 0x21709f7c00000000, 0x25abc6e000000000, 0x6390a18500000000, + 0xa9dd082a00000000, 0xefe66f4f00000000, 0x7c402bae00000000, + 0x3a7b4ccb00000000, 0xf036e56400000000, 0xb60d820100000000, + 0x977d1d7d00000000, 0xd1467a1800000000, 0x1b0bd3b700000000, + 0x5d30b4d200000000, 0xce96f03300000000, 0x88ad975600000000, + 0x42e03ef900000000, 0x04db599c00000000, 0x0b50fc1a00000000, + 0x4d6b9b7f00000000, 0x872632d000000000, 0xc11d55b500000000, + 0x52bb115400000000, 0x1480763100000000, 0xdecddf9e00000000, + 0x98f6b8fb00000000, 0xb986278700000000, 0xffbd40e200000000, + 0x35f0e94d00000000, 0x73cb8e2800000000, 0xe06dcac900000000, + 0xa656adac00000000, 0x6c1b040300000000, 0x2a20636600000000, + 0x2efb3afa00000000, 0x68c05d9f00000000, 0xa28df43000000000, + 0xe4b6935500000000, 0x7710d7b400000000, 0x312bb0d100000000, + 0xfb66197e00000000, 0xbd5d7e1b00000000, 0x9c2de16700000000, + 0xda16860200000000, 0x105b2fad00000000, 0x566048c800000000, + 0xc5c60c2900000000, 0x83fd6b4c00000000, 0x49b0c2e300000000, + 0x0f8ba58600000000, 0x16a0f83500000000, 0x509b9f5000000000, + 0x9ad636ff00000000, 0xdced519a00000000, 0x4f4b157b00000000, + 0x0970721e00000000, 0xc33ddbb100000000, 0x8506bcd400000000, + 0xa47623a800000000, 0xe24d44cd00000000, 0x2800ed6200000000, + 0x6e3b8a0700000000, 0xfd9dcee600000000, 0xbba6a98300000000, + 0x71eb002c00000000, 0x37d0674900000000, 0x330b3ed500000000, + 0x753059b000000000, 0xbf7df01f00000000, 0xf946977a00000000, + 0x6ae0d39b00000000, 0x2cdbb4fe00000000, 0xe6961d5100000000, + 0xa0ad7a3400000000, 0x81dde54800000000, 0xc7e6822d00000000, + 0x0dab2b8200000000, 0x4b904ce700000000, 0xd836080600000000, + 0x9e0d6f6300000000, 0x5440c6cc00000000, 0x127ba1a900000000, + 0x1df0042f00000000, 0x5bcb634a00000000, 0x9186cae500000000, + 0xd7bdad8000000000, 0x441be96100000000, 0x02208e0400000000, + 0xc86d27ab00000000, 0x8e5640ce00000000, 0xaf26dfb200000000, + 0xe91db8d700000000, 0x2350117800000000, 0x656b761d00000000, + 0xf6cd32fc00000000, 0xb0f6559900000000, 0x7abbfc3600000000, + 0x3c809b5300000000, 0x385bc2cf00000000, 0x7e60a5aa00000000, + 0xb42d0c0500000000, 0xf2166b6000000000, 0x61b02f8100000000, + 0x278b48e400000000, 0xedc6e14b00000000, 0xabfd862e00000000, + 0x8a8d195200000000, 0xccb67e3700000000, 0x06fbd79800000000, + 0x40c0b0fd00000000, 0xd366f41c00000000, 0x955d937900000000, + 0x5f103ad600000000, 0x192b5db300000000, 0x2c40f16b00000000, + 0x6a7b960e00000000, 0xa0363fa100000000, 0xe60d58c400000000, + 0x75ab1c2500000000, 0x33907b4000000000, 0xf9ddd2ef00000000, + 0xbfe6b58a00000000, 0x9e962af600000000, 0xd8ad4d9300000000, + 0x12e0e43c00000000, 0x54db835900000000, 0xc77dc7b800000000, + 0x8146a0dd00000000, 0x4b0b097200000000, 0x0d306e1700000000, + 0x09eb378b00000000, 0x4fd050ee00000000, 0x859df94100000000, + 0xc3a69e2400000000, 0x5000dac500000000, 0x163bbda000000000, + 0xdc76140f00000000, 0x9a4d736a00000000, 0xbb3dec1600000000, + 0xfd068b7300000000, 0x374b22dc00000000, 0x717045b900000000, + 0xe2d6015800000000, 0xa4ed663d00000000, 0x6ea0cf9200000000, + 0x289ba8f700000000, 0x27100d7100000000, 0x612b6a1400000000, + 0xab66c3bb00000000, 0xed5da4de00000000, 0x7efbe03f00000000, + 0x38c0875a00000000, 0xf28d2ef500000000, 0xb4b6499000000000, + 0x95c6d6ec00000000, 0xd3fdb18900000000, 0x19b0182600000000, + 0x5f8b7f4300000000, 0xcc2d3ba200000000, 0x8a165cc700000000, + 0x405bf56800000000, 0x0660920d00000000, 0x02bbcb9100000000, + 0x4480acf400000000, 0x8ecd055b00000000, 0xc8f6623e00000000, + 0x5b5026df00000000, 0x1d6b41ba00000000, 0xd726e81500000000, + 0x911d8f7000000000, 0xb06d100c00000000, 0xf656776900000000, + 0x3c1bdec600000000, 0x7a20b9a300000000, 0xe986fd4200000000, + 0xafbd9a2700000000, 0x65f0338800000000, 0x23cb54ed00000000, + 0x3ae0095e00000000, 0x7cdb6e3b00000000, 0xb696c79400000000, + 0xf0ada0f100000000, 0x630be41000000000, 0x2530837500000000, + 0xef7d2ada00000000, 0xa9464dbf00000000, 0x8836d2c300000000, + 0xce0db5a600000000, 0x04401c0900000000, 0x427b7b6c00000000, + 0xd1dd3f8d00000000, 0x97e658e800000000, 0x5dabf14700000000, + 0x1b90962200000000, 0x1f4bcfbe00000000, 0x5970a8db00000000, + 0x933d017400000000, 0xd506661100000000, 0x46a022f000000000, + 0x009b459500000000, 0xcad6ec3a00000000, 0x8ced8b5f00000000, + 0xad9d142300000000, 0xeba6734600000000, 0x21ebdae900000000, + 0x67d0bd8c00000000, 0xf476f96d00000000, 0xb24d9e0800000000, + 0x780037a700000000, 0x3e3b50c200000000, 0x31b0f54400000000, + 0x778b922100000000, 0xbdc63b8e00000000, 0xfbfd5ceb00000000, + 0x685b180a00000000, 0x2e607f6f00000000, 0xe42dd6c000000000, + 0xa216b1a500000000, 0x83662ed900000000, 0xc55d49bc00000000, + 0x0f10e01300000000, 0x492b877600000000, 0xda8dc39700000000, + 0x9cb6a4f200000000, 0x56fb0d5d00000000, 0x10c06a3800000000, + 0x141b33a400000000, 0x522054c100000000, 0x986dfd6e00000000, + 0xde569a0b00000000, 0x4df0deea00000000, 0x0bcbb98f00000000, + 0xc186102000000000, 0x87bd774500000000, 0xa6cde83900000000, + 0xe0f68f5c00000000, 0x2abb26f300000000, 0x6c80419600000000, + 0xff26057700000000, 0xb91d621200000000, 0x7350cbbd00000000, + 0x356bacd800000000}, + {0x0000000000000000, 0x9e83da9f00000000, 0x7d01c4e400000000, + 0xe3821e7b00000000, 0xbb04f91200000000, 0x2587238d00000000, + 0xc6053df600000000, 0x5886e76900000000, 0x7609f22500000000, + 0xe88a28ba00000000, 0x0b0836c100000000, 0x958bec5e00000000, + 0xcd0d0b3700000000, 0x538ed1a800000000, 0xb00ccfd300000000, + 0x2e8f154c00000000, 0xec12e44b00000000, 0x72913ed400000000, + 0x911320af00000000, 0x0f90fa3000000000, 0x57161d5900000000, + 0xc995c7c600000000, 0x2a17d9bd00000000, 0xb494032200000000, + 0x9a1b166e00000000, 0x0498ccf100000000, 0xe71ad28a00000000, + 0x7999081500000000, 0x211fef7c00000000, 0xbf9c35e300000000, + 0x5c1e2b9800000000, 0xc29df10700000000, 0xd825c89700000000, + 0x46a6120800000000, 0xa5240c7300000000, 0x3ba7d6ec00000000, + 0x6321318500000000, 0xfda2eb1a00000000, 0x1e20f56100000000, + 0x80a32ffe00000000, 0xae2c3ab200000000, 0x30afe02d00000000, + 0xd32dfe5600000000, 0x4dae24c900000000, 0x1528c3a000000000, + 0x8bab193f00000000, 0x6829074400000000, 0xf6aadddb00000000, + 0x34372cdc00000000, 0xaab4f64300000000, 0x4936e83800000000, + 0xd7b532a700000000, 0x8f33d5ce00000000, 0x11b00f5100000000, + 0xf232112a00000000, 0x6cb1cbb500000000, 0x423edef900000000, + 0xdcbd046600000000, 0x3f3f1a1d00000000, 0xa1bcc08200000000, + 0xf93a27eb00000000, 0x67b9fd7400000000, 0x843be30f00000000, + 0x1ab8399000000000, 0xf14de1f400000000, 0x6fce3b6b00000000, + 0x8c4c251000000000, 0x12cfff8f00000000, 0x4a4918e600000000, + 0xd4cac27900000000, 0x3748dc0200000000, 0xa9cb069d00000000, + 0x874413d100000000, 0x19c7c94e00000000, 0xfa45d73500000000, + 0x64c60daa00000000, 0x3c40eac300000000, 0xa2c3305c00000000, + 0x41412e2700000000, 0xdfc2f4b800000000, 0x1d5f05bf00000000, + 0x83dcdf2000000000, 0x605ec15b00000000, 0xfedd1bc400000000, + 0xa65bfcad00000000, 0x38d8263200000000, 0xdb5a384900000000, + 0x45d9e2d600000000, 0x6b56f79a00000000, 0xf5d52d0500000000, + 0x1657337e00000000, 0x88d4e9e100000000, 0xd0520e8800000000, + 0x4ed1d41700000000, 0xad53ca6c00000000, 0x33d010f300000000, + 0x2968296300000000, 0xb7ebf3fc00000000, 0x5469ed8700000000, + 0xcaea371800000000, 0x926cd07100000000, 0x0cef0aee00000000, + 0xef6d149500000000, 0x71eece0a00000000, 0x5f61db4600000000, + 0xc1e201d900000000, 0x22601fa200000000, 0xbce3c53d00000000, + 0xe465225400000000, 0x7ae6f8cb00000000, 0x9964e6b000000000, + 0x07e73c2f00000000, 0xc57acd2800000000, 0x5bf917b700000000, + 0xb87b09cc00000000, 0x26f8d35300000000, 0x7e7e343a00000000, + 0xe0fdeea500000000, 0x037ff0de00000000, 0x9dfc2a4100000000, + 0xb3733f0d00000000, 0x2df0e59200000000, 0xce72fbe900000000, + 0x50f1217600000000, 0x0877c61f00000000, 0x96f41c8000000000, + 0x757602fb00000000, 0xebf5d86400000000, 0xa39db33200000000, + 0x3d1e69ad00000000, 0xde9c77d600000000, 0x401fad4900000000, + 0x18994a2000000000, 0x861a90bf00000000, 0x65988ec400000000, + 0xfb1b545b00000000, 0xd594411700000000, 0x4b179b8800000000, + 0xa89585f300000000, 0x36165f6c00000000, 0x6e90b80500000000, + 0xf013629a00000000, 0x13917ce100000000, 0x8d12a67e00000000, + 0x4f8f577900000000, 0xd10c8de600000000, 0x328e939d00000000, + 0xac0d490200000000, 0xf48bae6b00000000, 0x6a0874f400000000, + 0x898a6a8f00000000, 0x1709b01000000000, 0x3986a55c00000000, + 0xa7057fc300000000, 0x448761b800000000, 0xda04bb2700000000, + 0x82825c4e00000000, 0x1c0186d100000000, 0xff8398aa00000000, + 0x6100423500000000, 0x7bb87ba500000000, 0xe53ba13a00000000, + 0x06b9bf4100000000, 0x983a65de00000000, 0xc0bc82b700000000, + 0x5e3f582800000000, 0xbdbd465300000000, 0x233e9ccc00000000, + 0x0db1898000000000, 0x9332531f00000000, 0x70b04d6400000000, + 0xee3397fb00000000, 0xb6b5709200000000, 0x2836aa0d00000000, + 0xcbb4b47600000000, 0x55376ee900000000, 0x97aa9fee00000000, + 0x0929457100000000, 0xeaab5b0a00000000, 0x7428819500000000, + 0x2cae66fc00000000, 0xb22dbc6300000000, 0x51afa21800000000, + 0xcf2c788700000000, 0xe1a36dcb00000000, 0x7f20b75400000000, + 0x9ca2a92f00000000, 0x022173b000000000, 0x5aa794d900000000, + 0xc4244e4600000000, 0x27a6503d00000000, 0xb9258aa200000000, + 0x52d052c600000000, 0xcc53885900000000, 0x2fd1962200000000, + 0xb1524cbd00000000, 0xe9d4abd400000000, 0x7757714b00000000, + 0x94d56f3000000000, 0x0a56b5af00000000, 0x24d9a0e300000000, + 0xba5a7a7c00000000, 0x59d8640700000000, 0xc75bbe9800000000, + 0x9fdd59f100000000, 0x015e836e00000000, 0xe2dc9d1500000000, + 0x7c5f478a00000000, 0xbec2b68d00000000, 0x20416c1200000000, + 0xc3c3726900000000, 0x5d40a8f600000000, 0x05c64f9f00000000, + 0x9b45950000000000, 0x78c78b7b00000000, 0xe64451e400000000, + 0xc8cb44a800000000, 0x56489e3700000000, 0xb5ca804c00000000, + 0x2b495ad300000000, 0x73cfbdba00000000, 0xed4c672500000000, + 0x0ece795e00000000, 0x904da3c100000000, 0x8af59a5100000000, + 0x147640ce00000000, 0xf7f45eb500000000, 0x6977842a00000000, + 0x31f1634300000000, 0xaf72b9dc00000000, 0x4cf0a7a700000000, + 0xd2737d3800000000, 0xfcfc687400000000, 0x627fb2eb00000000, + 0x81fdac9000000000, 0x1f7e760f00000000, 0x47f8916600000000, + 0xd97b4bf900000000, 0x3af9558200000000, 0xa47a8f1d00000000, + 0x66e77e1a00000000, 0xf864a48500000000, 0x1be6bafe00000000, + 0x8565606100000000, 0xdde3870800000000, 0x43605d9700000000, + 0xa0e243ec00000000, 0x3e61997300000000, 0x10ee8c3f00000000, + 0x8e6d56a000000000, 0x6def48db00000000, 0xf36c924400000000, + 0xabea752d00000000, 0x3569afb200000000, 0xd6ebb1c900000000, + 0x48686b5600000000}, + {0x0000000000000000, 0xc064281700000000, 0x80c9502e00000000, + 0x40ad783900000000, 0x0093a15c00000000, 0xc0f7894b00000000, + 0x805af17200000000, 0x403ed96500000000, 0x002643b900000000, + 0xc0426bae00000000, 0x80ef139700000000, 0x408b3b8000000000, + 0x00b5e2e500000000, 0xc0d1caf200000000, 0x807cb2cb00000000, + 0x40189adc00000000, 0x414af7a900000000, 0x812edfbe00000000, + 0xc183a78700000000, 0x01e78f9000000000, 0x41d956f500000000, + 0x81bd7ee200000000, 0xc11006db00000000, 0x01742ecc00000000, + 0x416cb41000000000, 0x81089c0700000000, 0xc1a5e43e00000000, + 0x01c1cc2900000000, 0x41ff154c00000000, 0x819b3d5b00000000, + 0xc136456200000000, 0x01526d7500000000, 0xc3929f8800000000, + 0x03f6b79f00000000, 0x435bcfa600000000, 0x833fe7b100000000, + 0xc3013ed400000000, 0x036516c300000000, 0x43c86efa00000000, + 0x83ac46ed00000000, 0xc3b4dc3100000000, 0x03d0f42600000000, + 0x437d8c1f00000000, 0x8319a40800000000, 0xc3277d6d00000000, + 0x0343557a00000000, 0x43ee2d4300000000, 0x838a055400000000, + 0x82d8682100000000, 0x42bc403600000000, 0x0211380f00000000, + 0xc275101800000000, 0x824bc97d00000000, 0x422fe16a00000000, + 0x0282995300000000, 0xc2e6b14400000000, 0x82fe2b9800000000, + 0x429a038f00000000, 0x02377bb600000000, 0xc25353a100000000, + 0x826d8ac400000000, 0x4209a2d300000000, 0x02a4daea00000000, + 0xc2c0f2fd00000000, 0xc7234eca00000000, 0x074766dd00000000, + 0x47ea1ee400000000, 0x878e36f300000000, 0xc7b0ef9600000000, + 0x07d4c78100000000, 0x4779bfb800000000, 0x871d97af00000000, + 0xc7050d7300000000, 0x0761256400000000, 0x47cc5d5d00000000, + 0x87a8754a00000000, 0xc796ac2f00000000, 0x07f2843800000000, + 0x475ffc0100000000, 0x873bd41600000000, 0x8669b96300000000, + 0x460d917400000000, 0x06a0e94d00000000, 0xc6c4c15a00000000, + 0x86fa183f00000000, 0x469e302800000000, 0x0633481100000000, + 0xc657600600000000, 0x864ffada00000000, 0x462bd2cd00000000, + 0x0686aaf400000000, 0xc6e282e300000000, 0x86dc5b8600000000, + 0x46b8739100000000, 0x06150ba800000000, 0xc67123bf00000000, + 0x04b1d14200000000, 0xc4d5f95500000000, 0x8478816c00000000, + 0x441ca97b00000000, 0x0422701e00000000, 0xc446580900000000, + 0x84eb203000000000, 0x448f082700000000, 0x049792fb00000000, + 0xc4f3baec00000000, 0x845ec2d500000000, 0x443aeac200000000, + 0x040433a700000000, 0xc4601bb000000000, 0x84cd638900000000, + 0x44a94b9e00000000, 0x45fb26eb00000000, 0x859f0efc00000000, + 0xc53276c500000000, 0x05565ed200000000, 0x456887b700000000, + 0x850cafa000000000, 0xc5a1d79900000000, 0x05c5ff8e00000000, + 0x45dd655200000000, 0x85b94d4500000000, 0xc514357c00000000, + 0x05701d6b00000000, 0x454ec40e00000000, 0x852aec1900000000, + 0xc587942000000000, 0x05e3bc3700000000, 0xcf41ed4f00000000, + 0x0f25c55800000000, 0x4f88bd6100000000, 0x8fec957600000000, + 0xcfd24c1300000000, 0x0fb6640400000000, 0x4f1b1c3d00000000, + 0x8f7f342a00000000, 0xcf67aef600000000, 0x0f0386e100000000, + 0x4faefed800000000, 0x8fcad6cf00000000, 0xcff40faa00000000, + 0x0f9027bd00000000, 0x4f3d5f8400000000, 0x8f59779300000000, + 0x8e0b1ae600000000, 0x4e6f32f100000000, 0x0ec24ac800000000, + 0xcea662df00000000, 0x8e98bbba00000000, 0x4efc93ad00000000, + 0x0e51eb9400000000, 0xce35c38300000000, 0x8e2d595f00000000, + 0x4e49714800000000, 0x0ee4097100000000, 0xce80216600000000, + 0x8ebef80300000000, 0x4edad01400000000, 0x0e77a82d00000000, + 0xce13803a00000000, 0x0cd372c700000000, 0xccb75ad000000000, + 0x8c1a22e900000000, 0x4c7e0afe00000000, 0x0c40d39b00000000, + 0xcc24fb8c00000000, 0x8c8983b500000000, 0x4cedaba200000000, + 0x0cf5317e00000000, 0xcc91196900000000, 0x8c3c615000000000, + 0x4c58494700000000, 0x0c66902200000000, 0xcc02b83500000000, + 0x8cafc00c00000000, 0x4ccbe81b00000000, 0x4d99856e00000000, + 0x8dfdad7900000000, 0xcd50d54000000000, 0x0d34fd5700000000, + 0x4d0a243200000000, 0x8d6e0c2500000000, 0xcdc3741c00000000, + 0x0da75c0b00000000, 0x4dbfc6d700000000, 0x8ddbeec000000000, + 0xcd7696f900000000, 0x0d12beee00000000, 0x4d2c678b00000000, + 0x8d484f9c00000000, 0xcde537a500000000, 0x0d811fb200000000, + 0x0862a38500000000, 0xc8068b9200000000, 0x88abf3ab00000000, + 0x48cfdbbc00000000, 0x08f102d900000000, 0xc8952ace00000000, + 0x883852f700000000, 0x485c7ae000000000, 0x0844e03c00000000, + 0xc820c82b00000000, 0x888db01200000000, 0x48e9980500000000, + 0x08d7416000000000, 0xc8b3697700000000, 0x881e114e00000000, + 0x487a395900000000, 0x4928542c00000000, 0x894c7c3b00000000, + 0xc9e1040200000000, 0x09852c1500000000, 0x49bbf57000000000, + 0x89dfdd6700000000, 0xc972a55e00000000, 0x09168d4900000000, + 0x490e179500000000, 0x896a3f8200000000, 0xc9c747bb00000000, + 0x09a36fac00000000, 0x499db6c900000000, 0x89f99ede00000000, + 0xc954e6e700000000, 0x0930cef000000000, 0xcbf03c0d00000000, + 0x0b94141a00000000, 0x4b396c2300000000, 0x8b5d443400000000, + 0xcb639d5100000000, 0x0b07b54600000000, 0x4baacd7f00000000, + 0x8bcee56800000000, 0xcbd67fb400000000, 0x0bb257a300000000, + 0x4b1f2f9a00000000, 0x8b7b078d00000000, 0xcb45dee800000000, + 0x0b21f6ff00000000, 0x4b8c8ec600000000, 0x8be8a6d100000000, + 0x8abacba400000000, 0x4adee3b300000000, 0x0a739b8a00000000, + 0xca17b39d00000000, 0x8a296af800000000, 0x4a4d42ef00000000, + 0x0ae03ad600000000, 0xca8412c100000000, 0x8a9c881d00000000, + 0x4af8a00a00000000, 0x0a55d83300000000, 0xca31f02400000000, + 0x8a0f294100000000, 0x4a6b015600000000, 0x0ac6796f00000000, + 0xcaa2517800000000}, + {0x0000000000000000, 0xd4ea739b00000000, 0xe9d396ed00000000, + 0x3d39e57600000000, 0x93a15c0000000000, 0x474b2f9b00000000, + 0x7a72caed00000000, 0xae98b97600000000, 0x2643b90000000000, + 0xf2a9ca9b00000000, 0xcf902fed00000000, 0x1b7a5c7600000000, + 0xb5e2e50000000000, 0x6108969b00000000, 0x5c3173ed00000000, + 0x88db007600000000, 0x4c86720100000000, 0x986c019a00000000, + 0xa555e4ec00000000, 0x71bf977700000000, 0xdf272e0100000000, + 0x0bcd5d9a00000000, 0x36f4b8ec00000000, 0xe21ecb7700000000, + 0x6ac5cb0100000000, 0xbe2fb89a00000000, 0x83165dec00000000, + 0x57fc2e7700000000, 0xf964970100000000, 0x2d8ee49a00000000, + 0x10b701ec00000000, 0xc45d727700000000, 0x980ce50200000000, + 0x4ce6969900000000, 0x71df73ef00000000, 0xa535007400000000, + 0x0badb90200000000, 0xdf47ca9900000000, 0xe27e2fef00000000, + 0x36945c7400000000, 0xbe4f5c0200000000, 0x6aa52f9900000000, + 0x579ccaef00000000, 0x8376b97400000000, 0x2dee000200000000, + 0xf904739900000000, 0xc43d96ef00000000, 0x10d7e57400000000, + 0xd48a970300000000, 0x0060e49800000000, 0x3d5901ee00000000, + 0xe9b3727500000000, 0x472bcb0300000000, 0x93c1b89800000000, + 0xaef85dee00000000, 0x7a122e7500000000, 0xf2c92e0300000000, + 0x26235d9800000000, 0x1b1ab8ee00000000, 0xcff0cb7500000000, + 0x6168720300000000, 0xb582019800000000, 0x88bbe4ee00000000, + 0x5c51977500000000, 0x3019ca0500000000, 0xe4f3b99e00000000, + 0xd9ca5ce800000000, 0x0d202f7300000000, 0xa3b8960500000000, + 0x7752e59e00000000, 0x4a6b00e800000000, 0x9e81737300000000, + 0x165a730500000000, 0xc2b0009e00000000, 0xff89e5e800000000, + 0x2b63967300000000, 0x85fb2f0500000000, 0x51115c9e00000000, + 0x6c28b9e800000000, 0xb8c2ca7300000000, 0x7c9fb80400000000, + 0xa875cb9f00000000, 0x954c2ee900000000, 0x41a65d7200000000, + 0xef3ee40400000000, 0x3bd4979f00000000, 0x06ed72e900000000, + 0xd207017200000000, 0x5adc010400000000, 0x8e36729f00000000, + 0xb30f97e900000000, 0x67e5e47200000000, 0xc97d5d0400000000, + 0x1d972e9f00000000, 0x20aecbe900000000, 0xf444b87200000000, + 0xa8152f0700000000, 0x7cff5c9c00000000, 0x41c6b9ea00000000, + 0x952cca7100000000, 0x3bb4730700000000, 0xef5e009c00000000, + 0xd267e5ea00000000, 0x068d967100000000, 0x8e56960700000000, + 0x5abce59c00000000, 0x678500ea00000000, 0xb36f737100000000, + 0x1df7ca0700000000, 0xc91db99c00000000, 0xf4245cea00000000, + 0x20ce2f7100000000, 0xe4935d0600000000, 0x30792e9d00000000, + 0x0d40cbeb00000000, 0xd9aab87000000000, 0x7732010600000000, + 0xa3d8729d00000000, 0x9ee197eb00000000, 0x4a0be47000000000, + 0xc2d0e40600000000, 0x163a979d00000000, 0x2b0372eb00000000, + 0xffe9017000000000, 0x5171b80600000000, 0x859bcb9d00000000, + 0xb8a22eeb00000000, 0x6c485d7000000000, 0x6032940b00000000, + 0xb4d8e79000000000, 0x89e102e600000000, 0x5d0b717d00000000, + 0xf393c80b00000000, 0x2779bb9000000000, 0x1a405ee600000000, + 0xceaa2d7d00000000, 0x46712d0b00000000, 0x929b5e9000000000, + 0xafa2bbe600000000, 0x7b48c87d00000000, 0xd5d0710b00000000, + 0x013a029000000000, 0x3c03e7e600000000, 0xe8e9947d00000000, + 0x2cb4e60a00000000, 0xf85e959100000000, 0xc56770e700000000, + 0x118d037c00000000, 0xbf15ba0a00000000, 0x6bffc99100000000, + 0x56c62ce700000000, 0x822c5f7c00000000, 0x0af75f0a00000000, + 0xde1d2c9100000000, 0xe324c9e700000000, 0x37ceba7c00000000, + 0x9956030a00000000, 0x4dbc709100000000, 0x708595e700000000, + 0xa46fe67c00000000, 0xf83e710900000000, 0x2cd4029200000000, + 0x11ede7e400000000, 0xc507947f00000000, 0x6b9f2d0900000000, + 0xbf755e9200000000, 0x824cbbe400000000, 0x56a6c87f00000000, + 0xde7dc80900000000, 0x0a97bb9200000000, 0x37ae5ee400000000, + 0xe3442d7f00000000, 0x4ddc940900000000, 0x9936e79200000000, + 0xa40f02e400000000, 0x70e5717f00000000, 0xb4b8030800000000, + 0x6052709300000000, 0x5d6b95e500000000, 0x8981e67e00000000, + 0x27195f0800000000, 0xf3f32c9300000000, 0xcecac9e500000000, + 0x1a20ba7e00000000, 0x92fbba0800000000, 0x4611c99300000000, + 0x7b282ce500000000, 0xafc25f7e00000000, 0x015ae60800000000, + 0xd5b0959300000000, 0xe88970e500000000, 0x3c63037e00000000, + 0x502b5e0e00000000, 0x84c12d9500000000, 0xb9f8c8e300000000, + 0x6d12bb7800000000, 0xc38a020e00000000, 0x1760719500000000, + 0x2a5994e300000000, 0xfeb3e77800000000, 0x7668e70e00000000, + 0xa282949500000000, 0x9fbb71e300000000, 0x4b51027800000000, + 0xe5c9bb0e00000000, 0x3123c89500000000, 0x0c1a2de300000000, + 0xd8f05e7800000000, 0x1cad2c0f00000000, 0xc8475f9400000000, + 0xf57ebae200000000, 0x2194c97900000000, 0x8f0c700f00000000, + 0x5be6039400000000, 0x66dfe6e200000000, 0xb235957900000000, + 0x3aee950f00000000, 0xee04e69400000000, 0xd33d03e200000000, + 0x07d7707900000000, 0xa94fc90f00000000, 0x7da5ba9400000000, + 0x409c5fe200000000, 0x94762c7900000000, 0xc827bb0c00000000, + 0x1ccdc89700000000, 0x21f42de100000000, 0xf51e5e7a00000000, + 0x5b86e70c00000000, 0x8f6c949700000000, 0xb25571e100000000, + 0x66bf027a00000000, 0xee64020c00000000, 0x3a8e719700000000, + 0x07b794e100000000, 0xd35de77a00000000, 0x7dc55e0c00000000, + 0xa92f2d9700000000, 0x9416c8e100000000, 0x40fcbb7a00000000, + 0x84a1c90d00000000, 0x504bba9600000000, 0x6d725fe000000000, + 0xb9982c7b00000000, 0x1700950d00000000, 0xc3eae69600000000, + 0xfed303e000000000, 0x2a39707b00000000, 0xa2e2700d00000000, + 0x7608039600000000, 0x4b31e6e000000000, 0x9fdb957b00000000, + 0x31432c0d00000000, 0xe5a95f9600000000, 0xd890bae000000000, + 0x0c7ac97b00000000}, + {0x0000000000000000, 0x2765258100000000, 0x0fcc3bd900000000, + 0x28a91e5800000000, 0x5f9e066900000000, 0x78fb23e800000000, + 0x50523db000000000, 0x7737183100000000, 0xbe3c0dd200000000, + 0x9959285300000000, 0xb1f0360b00000000, 0x9695138a00000000, + 0xe1a20bbb00000000, 0xc6c72e3a00000000, 0xee6e306200000000, + 0xc90b15e300000000, 0x3d7f6b7f00000000, 0x1a1a4efe00000000, + 0x32b350a600000000, 0x15d6752700000000, 0x62e16d1600000000, + 0x4584489700000000, 0x6d2d56cf00000000, 0x4a48734e00000000, + 0x834366ad00000000, 0xa426432c00000000, 0x8c8f5d7400000000, + 0xabea78f500000000, 0xdcdd60c400000000, 0xfbb8454500000000, + 0xd3115b1d00000000, 0xf4747e9c00000000, 0x7afed6fe00000000, + 0x5d9bf37f00000000, 0x7532ed2700000000, 0x5257c8a600000000, + 0x2560d09700000000, 0x0205f51600000000, 0x2aaceb4e00000000, + 0x0dc9cecf00000000, 0xc4c2db2c00000000, 0xe3a7fead00000000, + 0xcb0ee0f500000000, 0xec6bc57400000000, 0x9b5cdd4500000000, + 0xbc39f8c400000000, 0x9490e69c00000000, 0xb3f5c31d00000000, + 0x4781bd8100000000, 0x60e4980000000000, 0x484d865800000000, + 0x6f28a3d900000000, 0x181fbbe800000000, 0x3f7a9e6900000000, + 0x17d3803100000000, 0x30b6a5b000000000, 0xf9bdb05300000000, + 0xded895d200000000, 0xf6718b8a00000000, 0xd114ae0b00000000, + 0xa623b63a00000000, 0x814693bb00000000, 0xa9ef8de300000000, + 0x8e8aa86200000000, 0xb5fadc2600000000, 0x929ff9a700000000, + 0xba36e7ff00000000, 0x9d53c27e00000000, 0xea64da4f00000000, + 0xcd01ffce00000000, 0xe5a8e19600000000, 0xc2cdc41700000000, + 0x0bc6d1f400000000, 0x2ca3f47500000000, 0x040aea2d00000000, + 0x236fcfac00000000, 0x5458d79d00000000, 0x733df21c00000000, + 0x5b94ec4400000000, 0x7cf1c9c500000000, 0x8885b75900000000, + 0xafe092d800000000, 0x87498c8000000000, 0xa02ca90100000000, + 0xd71bb13000000000, 0xf07e94b100000000, 0xd8d78ae900000000, + 0xffb2af6800000000, 0x36b9ba8b00000000, 0x11dc9f0a00000000, + 0x3975815200000000, 0x1e10a4d300000000, 0x6927bce200000000, + 0x4e42996300000000, 0x66eb873b00000000, 0x418ea2ba00000000, + 0xcf040ad800000000, 0xe8612f5900000000, 0xc0c8310100000000, + 0xe7ad148000000000, 0x909a0cb100000000, 0xb7ff293000000000, + 0x9f56376800000000, 0xb83312e900000000, 0x7138070a00000000, + 0x565d228b00000000, 0x7ef43cd300000000, 0x5991195200000000, + 0x2ea6016300000000, 0x09c324e200000000, 0x216a3aba00000000, + 0x060f1f3b00000000, 0xf27b61a700000000, 0xd51e442600000000, + 0xfdb75a7e00000000, 0xdad27fff00000000, 0xade567ce00000000, + 0x8a80424f00000000, 0xa2295c1700000000, 0x854c799600000000, + 0x4c476c7500000000, 0x6b2249f400000000, 0x438b57ac00000000, + 0x64ee722d00000000, 0x13d96a1c00000000, 0x34bc4f9d00000000, + 0x1c1551c500000000, 0x3b70744400000000, 0x6af5b94d00000000, + 0x4d909ccc00000000, 0x6539829400000000, 0x425ca71500000000, + 0x356bbf2400000000, 0x120e9aa500000000, 0x3aa784fd00000000, + 0x1dc2a17c00000000, 0xd4c9b49f00000000, 0xf3ac911e00000000, + 0xdb058f4600000000, 0xfc60aac700000000, 0x8b57b2f600000000, + 0xac32977700000000, 0x849b892f00000000, 0xa3feacae00000000, + 0x578ad23200000000, 0x70eff7b300000000, 0x5846e9eb00000000, + 0x7f23cc6a00000000, 0x0814d45b00000000, 0x2f71f1da00000000, + 0x07d8ef8200000000, 0x20bdca0300000000, 0xe9b6dfe000000000, + 0xced3fa6100000000, 0xe67ae43900000000, 0xc11fc1b800000000, + 0xb628d98900000000, 0x914dfc0800000000, 0xb9e4e25000000000, + 0x9e81c7d100000000, 0x100b6fb300000000, 0x376e4a3200000000, + 0x1fc7546a00000000, 0x38a271eb00000000, 0x4f9569da00000000, + 0x68f04c5b00000000, 0x4059520300000000, 0x673c778200000000, + 0xae37626100000000, 0x895247e000000000, 0xa1fb59b800000000, + 0x869e7c3900000000, 0xf1a9640800000000, 0xd6cc418900000000, + 0xfe655fd100000000, 0xd9007a5000000000, 0x2d7404cc00000000, + 0x0a11214d00000000, 0x22b83f1500000000, 0x05dd1a9400000000, + 0x72ea02a500000000, 0x558f272400000000, 0x7d26397c00000000, + 0x5a431cfd00000000, 0x9348091e00000000, 0xb42d2c9f00000000, + 0x9c8432c700000000, 0xbbe1174600000000, 0xccd60f7700000000, + 0xebb32af600000000, 0xc31a34ae00000000, 0xe47f112f00000000, + 0xdf0f656b00000000, 0xf86a40ea00000000, 0xd0c35eb200000000, + 0xf7a67b3300000000, 0x8091630200000000, 0xa7f4468300000000, + 0x8f5d58db00000000, 0xa8387d5a00000000, 0x613368b900000000, + 0x46564d3800000000, 0x6eff536000000000, 0x499a76e100000000, + 0x3ead6ed000000000, 0x19c84b5100000000, 0x3161550900000000, + 0x1604708800000000, 0xe2700e1400000000, 0xc5152b9500000000, + 0xedbc35cd00000000, 0xcad9104c00000000, 0xbdee087d00000000, + 0x9a8b2dfc00000000, 0xb22233a400000000, 0x9547162500000000, + 0x5c4c03c600000000, 0x7b29264700000000, 0x5380381f00000000, + 0x74e51d9e00000000, 0x03d205af00000000, 0x24b7202e00000000, + 0x0c1e3e7600000000, 0x2b7b1bf700000000, 0xa5f1b39500000000, + 0x8294961400000000, 0xaa3d884c00000000, 0x8d58adcd00000000, + 0xfa6fb5fc00000000, 0xdd0a907d00000000, 0xf5a38e2500000000, + 0xd2c6aba400000000, 0x1bcdbe4700000000, 0x3ca89bc600000000, + 0x1401859e00000000, 0x3364a01f00000000, 0x4453b82e00000000, + 0x63369daf00000000, 0x4b9f83f700000000, 0x6cfaa67600000000, + 0x988ed8ea00000000, 0xbfebfd6b00000000, 0x9742e33300000000, + 0xb027c6b200000000, 0xc710de8300000000, 0xe075fb0200000000, + 0xc8dce55a00000000, 0xefb9c0db00000000, 0x26b2d53800000000, + 0x01d7f0b900000000, 0x297eeee100000000, 0x0e1bcb6000000000, + 0x792cd35100000000, 0x5e49f6d000000000, 0x76e0e88800000000, + 0x5185cd0900000000}}; + +#else /* W == 4 */ + +local const z_crc_t FAR crc_braid_table[][256] = { + {0x00000000, 0x9ba54c6f, 0xec3b9e9f, 0x779ed2f0, 0x03063b7f, + 0x98a37710, 0xef3da5e0, 0x7498e98f, 0x060c76fe, 0x9da93a91, + 0xea37e861, 0x7192a40e, 0x050a4d81, 0x9eaf01ee, 0xe931d31e, + 0x72949f71, 0x0c18edfc, 0x97bda193, 0xe0237363, 0x7b863f0c, + 0x0f1ed683, 0x94bb9aec, 0xe325481c, 0x78800473, 0x0a149b02, + 0x91b1d76d, 0xe62f059d, 0x7d8a49f2, 0x0912a07d, 0x92b7ec12, + 0xe5293ee2, 0x7e8c728d, 0x1831dbf8, 0x83949797, 0xf40a4567, + 0x6faf0908, 0x1b37e087, 0x8092ace8, 0xf70c7e18, 0x6ca93277, + 0x1e3dad06, 0x8598e169, 0xf2063399, 0x69a37ff6, 0x1d3b9679, + 0x869eda16, 0xf10008e6, 0x6aa54489, 0x14293604, 0x8f8c7a6b, + 0xf812a89b, 0x63b7e4f4, 0x172f0d7b, 0x8c8a4114, 0xfb1493e4, + 0x60b1df8b, 0x122540fa, 0x89800c95, 0xfe1ede65, 0x65bb920a, + 0x11237b85, 0x8a8637ea, 0xfd18e51a, 0x66bda975, 0x3063b7f0, + 0xabc6fb9f, 0xdc58296f, 0x47fd6500, 0x33658c8f, 0xa8c0c0e0, + 0xdf5e1210, 0x44fb5e7f, 0x366fc10e, 0xadca8d61, 0xda545f91, + 0x41f113fe, 0x3569fa71, 0xaeccb61e, 0xd95264ee, 0x42f72881, + 0x3c7b5a0c, 0xa7de1663, 0xd040c493, 0x4be588fc, 0x3f7d6173, + 0xa4d82d1c, 0xd346ffec, 0x48e3b383, 0x3a772cf2, 0xa1d2609d, + 0xd64cb26d, 0x4de9fe02, 0x3971178d, 0xa2d45be2, 0xd54a8912, + 0x4eefc57d, 0x28526c08, 0xb3f72067, 0xc469f297, 0x5fccbef8, + 0x2b545777, 0xb0f11b18, 0xc76fc9e8, 0x5cca8587, 0x2e5e1af6, + 0xb5fb5699, 0xc2658469, 0x59c0c806, 0x2d582189, 0xb6fd6de6, + 0xc163bf16, 0x5ac6f379, 0x244a81f4, 0xbfefcd9b, 0xc8711f6b, + 0x53d45304, 0x274cba8b, 0xbce9f6e4, 0xcb772414, 0x50d2687b, + 0x2246f70a, 0xb9e3bb65, 0xce7d6995, 0x55d825fa, 0x2140cc75, + 0xbae5801a, 0xcd7b52ea, 0x56de1e85, 0x60c76fe0, 0xfb62238f, + 0x8cfcf17f, 0x1759bd10, 0x63c1549f, 0xf86418f0, 0x8ffaca00, + 0x145f866f, 0x66cb191e, 0xfd6e5571, 0x8af08781, 0x1155cbee, + 0x65cd2261, 0xfe686e0e, 0x89f6bcfe, 0x1253f091, 0x6cdf821c, + 0xf77ace73, 0x80e41c83, 0x1b4150ec, 0x6fd9b963, 0xf47cf50c, + 0x83e227fc, 0x18476b93, 0x6ad3f4e2, 0xf176b88d, 0x86e86a7d, + 0x1d4d2612, 0x69d5cf9d, 0xf27083f2, 0x85ee5102, 0x1e4b1d6d, + 0x78f6b418, 0xe353f877, 0x94cd2a87, 0x0f6866e8, 0x7bf08f67, + 0xe055c308, 0x97cb11f8, 0x0c6e5d97, 0x7efac2e6, 0xe55f8e89, + 0x92c15c79, 0x09641016, 0x7dfcf999, 0xe659b5f6, 0x91c76706, + 0x0a622b69, 0x74ee59e4, 0xef4b158b, 0x98d5c77b, 0x03708b14, + 0x77e8629b, 0xec4d2ef4, 0x9bd3fc04, 0x0076b06b, 0x72e22f1a, + 0xe9476375, 0x9ed9b185, 0x057cfdea, 0x71e41465, 0xea41580a, + 0x9ddf8afa, 0x067ac695, 0x50a4d810, 0xcb01947f, 0xbc9f468f, + 0x273a0ae0, 0x53a2e36f, 0xc807af00, 0xbf997df0, 0x243c319f, + 0x56a8aeee, 0xcd0de281, 0xba933071, 0x21367c1e, 0x55ae9591, + 0xce0bd9fe, 0xb9950b0e, 0x22304761, 0x5cbc35ec, 0xc7197983, + 0xb087ab73, 0x2b22e71c, 0x5fba0e93, 0xc41f42fc, 0xb381900c, + 0x2824dc63, 0x5ab04312, 0xc1150f7d, 0xb68bdd8d, 0x2d2e91e2, + 0x59b6786d, 0xc2133402, 0xb58de6f2, 0x2e28aa9d, 0x489503e8, + 0xd3304f87, 0xa4ae9d77, 0x3f0bd118, 0x4b933897, 0xd03674f8, + 0xa7a8a608, 0x3c0dea67, 0x4e997516, 0xd53c3979, 0xa2a2eb89, + 0x3907a7e6, 0x4d9f4e69, 0xd63a0206, 0xa1a4d0f6, 0x3a019c99, + 0x448dee14, 0xdf28a27b, 0xa8b6708b, 0x33133ce4, 0x478bd56b, + 0xdc2e9904, 0xabb04bf4, 0x3015079b, 0x428198ea, 0xd924d485, + 0xaeba0675, 0x351f4a1a, 0x4187a395, 0xda22effa, 0xadbc3d0a, + 0x36197165}, + {0x00000000, 0xc18edfc0, 0x586cb9c1, 0x99e26601, 0xb0d97382, + 0x7157ac42, 0xe8b5ca43, 0x293b1583, 0xbac3e145, 0x7b4d3e85, + 0xe2af5884, 0x23218744, 0x0a1a92c7, 0xcb944d07, 0x52762b06, + 0x93f8f4c6, 0xaef6c4cb, 0x6f781b0b, 0xf69a7d0a, 0x3714a2ca, + 0x1e2fb749, 0xdfa16889, 0x46430e88, 0x87cdd148, 0x1435258e, + 0xd5bbfa4e, 0x4c599c4f, 0x8dd7438f, 0xa4ec560c, 0x656289cc, + 0xfc80efcd, 0x3d0e300d, 0x869c8fd7, 0x47125017, 0xdef03616, + 0x1f7ee9d6, 0x3645fc55, 0xf7cb2395, 0x6e294594, 0xafa79a54, + 0x3c5f6e92, 0xfdd1b152, 0x6433d753, 0xa5bd0893, 0x8c861d10, + 0x4d08c2d0, 0xd4eaa4d1, 0x15647b11, 0x286a4b1c, 0xe9e494dc, + 0x7006f2dd, 0xb1882d1d, 0x98b3389e, 0x593de75e, 0xc0df815f, + 0x01515e9f, 0x92a9aa59, 0x53277599, 0xcac51398, 0x0b4bcc58, + 0x2270d9db, 0xe3fe061b, 0x7a1c601a, 0xbb92bfda, 0xd64819ef, + 0x17c6c62f, 0x8e24a02e, 0x4faa7fee, 0x66916a6d, 0xa71fb5ad, + 0x3efdd3ac, 0xff730c6c, 0x6c8bf8aa, 0xad05276a, 0x34e7416b, + 0xf5699eab, 0xdc528b28, 0x1ddc54e8, 0x843e32e9, 0x45b0ed29, + 0x78bedd24, 0xb93002e4, 0x20d264e5, 0xe15cbb25, 0xc867aea6, + 0x09e97166, 0x900b1767, 0x5185c8a7, 0xc27d3c61, 0x03f3e3a1, + 0x9a1185a0, 0x5b9f5a60, 0x72a44fe3, 0xb32a9023, 0x2ac8f622, + 0xeb4629e2, 0x50d49638, 0x915a49f8, 0x08b82ff9, 0xc936f039, + 0xe00de5ba, 0x21833a7a, 0xb8615c7b, 0x79ef83bb, 0xea17777d, + 0x2b99a8bd, 0xb27bcebc, 0x73f5117c, 0x5ace04ff, 0x9b40db3f, + 0x02a2bd3e, 0xc32c62fe, 0xfe2252f3, 0x3fac8d33, 0xa64eeb32, + 0x67c034f2, 0x4efb2171, 0x8f75feb1, 0x169798b0, 0xd7194770, + 0x44e1b3b6, 0x856f6c76, 0x1c8d0a77, 0xdd03d5b7, 0xf438c034, + 0x35b61ff4, 0xac5479f5, 0x6ddaa635, 0x77e1359f, 0xb66fea5f, + 0x2f8d8c5e, 0xee03539e, 0xc738461d, 0x06b699dd, 0x9f54ffdc, + 0x5eda201c, 0xcd22d4da, 0x0cac0b1a, 0x954e6d1b, 0x54c0b2db, + 0x7dfba758, 0xbc757898, 0x25971e99, 0xe419c159, 0xd917f154, + 0x18992e94, 0x817b4895, 0x40f59755, 0x69ce82d6, 0xa8405d16, + 0x31a23b17, 0xf02ce4d7, 0x63d41011, 0xa25acfd1, 0x3bb8a9d0, + 0xfa367610, 0xd30d6393, 0x1283bc53, 0x8b61da52, 0x4aef0592, + 0xf17dba48, 0x30f36588, 0xa9110389, 0x689fdc49, 0x41a4c9ca, + 0x802a160a, 0x19c8700b, 0xd846afcb, 0x4bbe5b0d, 0x8a3084cd, + 0x13d2e2cc, 0xd25c3d0c, 0xfb67288f, 0x3ae9f74f, 0xa30b914e, + 0x62854e8e, 0x5f8b7e83, 0x9e05a143, 0x07e7c742, 0xc6691882, + 0xef520d01, 0x2edcd2c1, 0xb73eb4c0, 0x76b06b00, 0xe5489fc6, + 0x24c64006, 0xbd242607, 0x7caaf9c7, 0x5591ec44, 0x941f3384, + 0x0dfd5585, 0xcc738a45, 0xa1a92c70, 0x6027f3b0, 0xf9c595b1, + 0x384b4a71, 0x11705ff2, 0xd0fe8032, 0x491ce633, 0x889239f3, + 0x1b6acd35, 0xdae412f5, 0x430674f4, 0x8288ab34, 0xabb3beb7, + 0x6a3d6177, 0xf3df0776, 0x3251d8b6, 0x0f5fe8bb, 0xced1377b, + 0x5733517a, 0x96bd8eba, 0xbf869b39, 0x7e0844f9, 0xe7ea22f8, + 0x2664fd38, 0xb59c09fe, 0x7412d63e, 0xedf0b03f, 0x2c7e6fff, + 0x05457a7c, 0xc4cba5bc, 0x5d29c3bd, 0x9ca71c7d, 0x2735a3a7, + 0xe6bb7c67, 0x7f591a66, 0xbed7c5a6, 0x97ecd025, 0x56620fe5, + 0xcf8069e4, 0x0e0eb624, 0x9df642e2, 0x5c789d22, 0xc59afb23, + 0x041424e3, 0x2d2f3160, 0xeca1eea0, 0x754388a1, 0xb4cd5761, + 0x89c3676c, 0x484db8ac, 0xd1afdead, 0x1021016d, 0x391a14ee, + 0xf894cb2e, 0x6176ad2f, 0xa0f872ef, 0x33008629, 0xf28e59e9, + 0x6b6c3fe8, 0xaae2e028, 0x83d9f5ab, 0x42572a6b, 0xdbb54c6a, + 0x1a3b93aa}, + {0x00000000, 0xefc26b3e, 0x04f5d03d, 0xeb37bb03, 0x09eba07a, + 0xe629cb44, 0x0d1e7047, 0xe2dc1b79, 0x13d740f4, 0xfc152bca, + 0x172290c9, 0xf8e0fbf7, 0x1a3ce08e, 0xf5fe8bb0, 0x1ec930b3, + 0xf10b5b8d, 0x27ae81e8, 0xc86cead6, 0x235b51d5, 0xcc993aeb, + 0x2e452192, 0xc1874aac, 0x2ab0f1af, 0xc5729a91, 0x3479c11c, + 0xdbbbaa22, 0x308c1121, 0xdf4e7a1f, 0x3d926166, 0xd2500a58, + 0x3967b15b, 0xd6a5da65, 0x4f5d03d0, 0xa09f68ee, 0x4ba8d3ed, + 0xa46ab8d3, 0x46b6a3aa, 0xa974c894, 0x42437397, 0xad8118a9, + 0x5c8a4324, 0xb348281a, 0x587f9319, 0xb7bdf827, 0x5561e35e, + 0xbaa38860, 0x51943363, 0xbe56585d, 0x68f38238, 0x8731e906, + 0x6c065205, 0x83c4393b, 0x61182242, 0x8eda497c, 0x65edf27f, + 0x8a2f9941, 0x7b24c2cc, 0x94e6a9f2, 0x7fd112f1, 0x901379cf, + 0x72cf62b6, 0x9d0d0988, 0x763ab28b, 0x99f8d9b5, 0x9eba07a0, + 0x71786c9e, 0x9a4fd79d, 0x758dbca3, 0x9751a7da, 0x7893cce4, + 0x93a477e7, 0x7c661cd9, 0x8d6d4754, 0x62af2c6a, 0x89989769, + 0x665afc57, 0x8486e72e, 0x6b448c10, 0x80733713, 0x6fb15c2d, + 0xb9148648, 0x56d6ed76, 0xbde15675, 0x52233d4b, 0xb0ff2632, + 0x5f3d4d0c, 0xb40af60f, 0x5bc89d31, 0xaac3c6bc, 0x4501ad82, + 0xae361681, 0x41f47dbf, 0xa32866c6, 0x4cea0df8, 0xa7ddb6fb, + 0x481fddc5, 0xd1e70470, 0x3e256f4e, 0xd512d44d, 0x3ad0bf73, + 0xd80ca40a, 0x37cecf34, 0xdcf97437, 0x333b1f09, 0xc2304484, + 0x2df22fba, 0xc6c594b9, 0x2907ff87, 0xcbdbe4fe, 0x24198fc0, + 0xcf2e34c3, 0x20ec5ffd, 0xf6498598, 0x198beea6, 0xf2bc55a5, + 0x1d7e3e9b, 0xffa225e2, 0x10604edc, 0xfb57f5df, 0x14959ee1, + 0xe59ec56c, 0x0a5cae52, 0xe16b1551, 0x0ea97e6f, 0xec756516, + 0x03b70e28, 0xe880b52b, 0x0742de15, 0xe6050901, 0x09c7623f, + 0xe2f0d93c, 0x0d32b202, 0xefeea97b, 0x002cc245, 0xeb1b7946, + 0x04d91278, 0xf5d249f5, 0x1a1022cb, 0xf12799c8, 0x1ee5f2f6, + 0xfc39e98f, 0x13fb82b1, 0xf8cc39b2, 0x170e528c, 0xc1ab88e9, + 0x2e69e3d7, 0xc55e58d4, 0x2a9c33ea, 0xc8402893, 0x278243ad, + 0xccb5f8ae, 0x23779390, 0xd27cc81d, 0x3dbea323, 0xd6891820, + 0x394b731e, 0xdb976867, 0x34550359, 0xdf62b85a, 0x30a0d364, + 0xa9580ad1, 0x469a61ef, 0xadaddaec, 0x426fb1d2, 0xa0b3aaab, + 0x4f71c195, 0xa4467a96, 0x4b8411a8, 0xba8f4a25, 0x554d211b, + 0xbe7a9a18, 0x51b8f126, 0xb364ea5f, 0x5ca68161, 0xb7913a62, + 0x5853515c, 0x8ef68b39, 0x6134e007, 0x8a035b04, 0x65c1303a, + 0x871d2b43, 0x68df407d, 0x83e8fb7e, 0x6c2a9040, 0x9d21cbcd, + 0x72e3a0f3, 0x99d41bf0, 0x761670ce, 0x94ca6bb7, 0x7b080089, + 0x903fbb8a, 0x7ffdd0b4, 0x78bf0ea1, 0x977d659f, 0x7c4ade9c, + 0x9388b5a2, 0x7154aedb, 0x9e96c5e5, 0x75a17ee6, 0x9a6315d8, + 0x6b684e55, 0x84aa256b, 0x6f9d9e68, 0x805ff556, 0x6283ee2f, + 0x8d418511, 0x66763e12, 0x89b4552c, 0x5f118f49, 0xb0d3e477, + 0x5be45f74, 0xb426344a, 0x56fa2f33, 0xb938440d, 0x520fff0e, + 0xbdcd9430, 0x4cc6cfbd, 0xa304a483, 0x48331f80, 0xa7f174be, + 0x452d6fc7, 0xaaef04f9, 0x41d8bffa, 0xae1ad4c4, 0x37e20d71, + 0xd820664f, 0x3317dd4c, 0xdcd5b672, 0x3e09ad0b, 0xd1cbc635, + 0x3afc7d36, 0xd53e1608, 0x24354d85, 0xcbf726bb, 0x20c09db8, + 0xcf02f686, 0x2ddeedff, 0xc21c86c1, 0x292b3dc2, 0xc6e956fc, + 0x104c8c99, 0xff8ee7a7, 0x14b95ca4, 0xfb7b379a, 0x19a72ce3, + 0xf66547dd, 0x1d52fcde, 0xf29097e0, 0x039bcc6d, 0xec59a753, + 0x076e1c50, 0xe8ac776e, 0x0a706c17, 0xe5b20729, 0x0e85bc2a, + 0xe147d714}, + {0x00000000, 0x177b1443, 0x2ef62886, 0x398d3cc5, 0x5dec510c, + 0x4a97454f, 0x731a798a, 0x64616dc9, 0xbbd8a218, 0xaca3b65b, + 0x952e8a9e, 0x82559edd, 0xe634f314, 0xf14fe757, 0xc8c2db92, + 0xdfb9cfd1, 0xacc04271, 0xbbbb5632, 0x82366af7, 0x954d7eb4, + 0xf12c137d, 0xe657073e, 0xdfda3bfb, 0xc8a12fb8, 0x1718e069, + 0x0063f42a, 0x39eec8ef, 0x2e95dcac, 0x4af4b165, 0x5d8fa526, + 0x640299e3, 0x73798da0, 0x82f182a3, 0x958a96e0, 0xac07aa25, + 0xbb7cbe66, 0xdf1dd3af, 0xc866c7ec, 0xf1ebfb29, 0xe690ef6a, + 0x392920bb, 0x2e5234f8, 0x17df083d, 0x00a41c7e, 0x64c571b7, + 0x73be65f4, 0x4a335931, 0x5d484d72, 0x2e31c0d2, 0x394ad491, + 0x00c7e854, 0x17bcfc17, 0x73dd91de, 0x64a6859d, 0x5d2bb958, + 0x4a50ad1b, 0x95e962ca, 0x82927689, 0xbb1f4a4c, 0xac645e0f, + 0xc80533c6, 0xdf7e2785, 0xe6f31b40, 0xf1880f03, 0xde920307, + 0xc9e91744, 0xf0642b81, 0xe71f3fc2, 0x837e520b, 0x94054648, + 0xad887a8d, 0xbaf36ece, 0x654aa11f, 0x7231b55c, 0x4bbc8999, + 0x5cc79dda, 0x38a6f013, 0x2fdde450, 0x1650d895, 0x012bccd6, + 0x72524176, 0x65295535, 0x5ca469f0, 0x4bdf7db3, 0x2fbe107a, + 0x38c50439, 0x014838fc, 0x16332cbf, 0xc98ae36e, 0xdef1f72d, + 0xe77ccbe8, 0xf007dfab, 0x9466b262, 0x831da621, 0xba909ae4, + 0xadeb8ea7, 0x5c6381a4, 0x4b1895e7, 0x7295a922, 0x65eebd61, + 0x018fd0a8, 0x16f4c4eb, 0x2f79f82e, 0x3802ec6d, 0xe7bb23bc, + 0xf0c037ff, 0xc94d0b3a, 0xde361f79, 0xba5772b0, 0xad2c66f3, + 0x94a15a36, 0x83da4e75, 0xf0a3c3d5, 0xe7d8d796, 0xde55eb53, + 0xc92eff10, 0xad4f92d9, 0xba34869a, 0x83b9ba5f, 0x94c2ae1c, + 0x4b7b61cd, 0x5c00758e, 0x658d494b, 0x72f65d08, 0x169730c1, + 0x01ec2482, 0x38611847, 0x2f1a0c04, 0x6655004f, 0x712e140c, + 0x48a328c9, 0x5fd83c8a, 0x3bb95143, 0x2cc24500, 0x154f79c5, + 0x02346d86, 0xdd8da257, 0xcaf6b614, 0xf37b8ad1, 0xe4009e92, + 0x8061f35b, 0x971ae718, 0xae97dbdd, 0xb9eccf9e, 0xca95423e, + 0xddee567d, 0xe4636ab8, 0xf3187efb, 0x97791332, 0x80020771, + 0xb98f3bb4, 0xaef42ff7, 0x714de026, 0x6636f465, 0x5fbbc8a0, + 0x48c0dce3, 0x2ca1b12a, 0x3bdaa569, 0x025799ac, 0x152c8def, + 0xe4a482ec, 0xf3df96af, 0xca52aa6a, 0xdd29be29, 0xb948d3e0, + 0xae33c7a3, 0x97befb66, 0x80c5ef25, 0x5f7c20f4, 0x480734b7, + 0x718a0872, 0x66f11c31, 0x029071f8, 0x15eb65bb, 0x2c66597e, + 0x3b1d4d3d, 0x4864c09d, 0x5f1fd4de, 0x6692e81b, 0x71e9fc58, + 0x15889191, 0x02f385d2, 0x3b7eb917, 0x2c05ad54, 0xf3bc6285, + 0xe4c776c6, 0xdd4a4a03, 0xca315e40, 0xae503389, 0xb92b27ca, + 0x80a61b0f, 0x97dd0f4c, 0xb8c70348, 0xafbc170b, 0x96312bce, + 0x814a3f8d, 0xe52b5244, 0xf2504607, 0xcbdd7ac2, 0xdca66e81, + 0x031fa150, 0x1464b513, 0x2de989d6, 0x3a929d95, 0x5ef3f05c, + 0x4988e41f, 0x7005d8da, 0x677ecc99, 0x14074139, 0x037c557a, + 0x3af169bf, 0x2d8a7dfc, 0x49eb1035, 0x5e900476, 0x671d38b3, + 0x70662cf0, 0xafdfe321, 0xb8a4f762, 0x8129cba7, 0x9652dfe4, + 0xf233b22d, 0xe548a66e, 0xdcc59aab, 0xcbbe8ee8, 0x3a3681eb, + 0x2d4d95a8, 0x14c0a96d, 0x03bbbd2e, 0x67dad0e7, 0x70a1c4a4, + 0x492cf861, 0x5e57ec22, 0x81ee23f3, 0x969537b0, 0xaf180b75, + 0xb8631f36, 0xdc0272ff, 0xcb7966bc, 0xf2f45a79, 0xe58f4e3a, + 0x96f6c39a, 0x818dd7d9, 0xb800eb1c, 0xaf7bff5f, 0xcb1a9296, + 0xdc6186d5, 0xe5ecba10, 0xf297ae53, 0x2d2e6182, 0x3a5575c1, + 0x03d84904, 0x14a35d47, 0x70c2308e, 0x67b924cd, 0x5e341808, + 0x494f0c4b}}; + +local const z_word_t FAR crc_braid_big_table[][256] = { + {0x00000000, 0x43147b17, 0x8628f62e, 0xc53c8d39, 0x0c51ec5d, + 0x4f45974a, 0x8a791a73, 0xc96d6164, 0x18a2d8bb, 0x5bb6a3ac, + 0x9e8a2e95, 0xdd9e5582, 0x14f334e6, 0x57e74ff1, 0x92dbc2c8, + 0xd1cfb9df, 0x7142c0ac, 0x3256bbbb, 0xf76a3682, 0xb47e4d95, + 0x7d132cf1, 0x3e0757e6, 0xfb3bdadf, 0xb82fa1c8, 0x69e01817, + 0x2af46300, 0xefc8ee39, 0xacdc952e, 0x65b1f44a, 0x26a58f5d, + 0xe3990264, 0xa08d7973, 0xa382f182, 0xe0968a95, 0x25aa07ac, + 0x66be7cbb, 0xafd31ddf, 0xecc766c8, 0x29fbebf1, 0x6aef90e6, + 0xbb202939, 0xf834522e, 0x3d08df17, 0x7e1ca400, 0xb771c564, + 0xf465be73, 0x3159334a, 0x724d485d, 0xd2c0312e, 0x91d44a39, + 0x54e8c700, 0x17fcbc17, 0xde91dd73, 0x9d85a664, 0x58b92b5d, + 0x1bad504a, 0xca62e995, 0x89769282, 0x4c4a1fbb, 0x0f5e64ac, + 0xc63305c8, 0x85277edf, 0x401bf3e6, 0x030f88f1, 0x070392de, + 0x4417e9c9, 0x812b64f0, 0xc23f1fe7, 0x0b527e83, 0x48460594, + 0x8d7a88ad, 0xce6ef3ba, 0x1fa14a65, 0x5cb53172, 0x9989bc4b, + 0xda9dc75c, 0x13f0a638, 0x50e4dd2f, 0x95d85016, 0xd6cc2b01, + 0x76415272, 0x35552965, 0xf069a45c, 0xb37ddf4b, 0x7a10be2f, + 0x3904c538, 0xfc384801, 0xbf2c3316, 0x6ee38ac9, 0x2df7f1de, + 0xe8cb7ce7, 0xabdf07f0, 0x62b26694, 0x21a61d83, 0xe49a90ba, + 0xa78eebad, 0xa481635c, 0xe795184b, 0x22a99572, 0x61bdee65, + 0xa8d08f01, 0xebc4f416, 0x2ef8792f, 0x6dec0238, 0xbc23bbe7, + 0xff37c0f0, 0x3a0b4dc9, 0x791f36de, 0xb07257ba, 0xf3662cad, + 0x365aa194, 0x754eda83, 0xd5c3a3f0, 0x96d7d8e7, 0x53eb55de, + 0x10ff2ec9, 0xd9924fad, 0x9a8634ba, 0x5fbab983, 0x1caec294, + 0xcd617b4b, 0x8e75005c, 0x4b498d65, 0x085df672, 0xc1309716, + 0x8224ec01, 0x47186138, 0x040c1a2f, 0x4f005566, 0x0c142e71, + 0xc928a348, 0x8a3cd85f, 0x4351b93b, 0x0045c22c, 0xc5794f15, + 0x866d3402, 0x57a28ddd, 0x14b6f6ca, 0xd18a7bf3, 0x929e00e4, + 0x5bf36180, 0x18e71a97, 0xdddb97ae, 0x9ecfecb9, 0x3e4295ca, + 0x7d56eedd, 0xb86a63e4, 0xfb7e18f3, 0x32137997, 0x71070280, + 0xb43b8fb9, 0xf72ff4ae, 0x26e04d71, 0x65f43666, 0xa0c8bb5f, + 0xe3dcc048, 0x2ab1a12c, 0x69a5da3b, 0xac995702, 0xef8d2c15, + 0xec82a4e4, 0xaf96dff3, 0x6aaa52ca, 0x29be29dd, 0xe0d348b9, + 0xa3c733ae, 0x66fbbe97, 0x25efc580, 0xf4207c5f, 0xb7340748, + 0x72088a71, 0x311cf166, 0xf8719002, 0xbb65eb15, 0x7e59662c, + 0x3d4d1d3b, 0x9dc06448, 0xded41f5f, 0x1be89266, 0x58fce971, + 0x91918815, 0xd285f302, 0x17b97e3b, 0x54ad052c, 0x8562bcf3, + 0xc676c7e4, 0x034a4add, 0x405e31ca, 0x893350ae, 0xca272bb9, + 0x0f1ba680, 0x4c0fdd97, 0x4803c7b8, 0x0b17bcaf, 0xce2b3196, + 0x8d3f4a81, 0x44522be5, 0x074650f2, 0xc27addcb, 0x816ea6dc, + 0x50a11f03, 0x13b56414, 0xd689e92d, 0x959d923a, 0x5cf0f35e, + 0x1fe48849, 0xdad80570, 0x99cc7e67, 0x39410714, 0x7a557c03, + 0xbf69f13a, 0xfc7d8a2d, 0x3510eb49, 0x7604905e, 0xb3381d67, + 0xf02c6670, 0x21e3dfaf, 0x62f7a4b8, 0xa7cb2981, 0xe4df5296, + 0x2db233f2, 0x6ea648e5, 0xab9ac5dc, 0xe88ebecb, 0xeb81363a, + 0xa8954d2d, 0x6da9c014, 0x2ebdbb03, 0xe7d0da67, 0xa4c4a170, + 0x61f82c49, 0x22ec575e, 0xf323ee81, 0xb0379596, 0x750b18af, + 0x361f63b8, 0xff7202dc, 0xbc6679cb, 0x795af4f2, 0x3a4e8fe5, + 0x9ac3f696, 0xd9d78d81, 0x1ceb00b8, 0x5fff7baf, 0x96921acb, + 0xd58661dc, 0x10baece5, 0x53ae97f2, 0x82612e2d, 0xc175553a, + 0x0449d803, 0x475da314, 0x8e30c270, 0xcd24b967, 0x0818345e, + 0x4b0c4f49}, + {0x00000000, 0x3e6bc2ef, 0x3dd0f504, 0x03bb37eb, 0x7aa0eb09, + 0x44cb29e6, 0x47701e0d, 0x791bdce2, 0xf440d713, 0xca2b15fc, + 0xc9902217, 0xf7fbe0f8, 0x8ee03c1a, 0xb08bfef5, 0xb330c91e, + 0x8d5b0bf1, 0xe881ae27, 0xd6ea6cc8, 0xd5515b23, 0xeb3a99cc, + 0x9221452e, 0xac4a87c1, 0xaff1b02a, 0x919a72c5, 0x1cc17934, + 0x22aabbdb, 0x21118c30, 0x1f7a4edf, 0x6661923d, 0x580a50d2, + 0x5bb16739, 0x65daa5d6, 0xd0035d4f, 0xee689fa0, 0xedd3a84b, + 0xd3b86aa4, 0xaaa3b646, 0x94c874a9, 0x97734342, 0xa91881ad, + 0x24438a5c, 0x1a2848b3, 0x19937f58, 0x27f8bdb7, 0x5ee36155, + 0x6088a3ba, 0x63339451, 0x5d5856be, 0x3882f368, 0x06e93187, + 0x0552066c, 0x3b39c483, 0x42221861, 0x7c49da8e, 0x7ff2ed65, + 0x41992f8a, 0xccc2247b, 0xf2a9e694, 0xf112d17f, 0xcf791390, + 0xb662cf72, 0x88090d9d, 0x8bb23a76, 0xb5d9f899, 0xa007ba9e, + 0x9e6c7871, 0x9dd74f9a, 0xa3bc8d75, 0xdaa75197, 0xe4cc9378, + 0xe777a493, 0xd91c667c, 0x54476d8d, 0x6a2caf62, 0x69979889, + 0x57fc5a66, 0x2ee78684, 0x108c446b, 0x13377380, 0x2d5cb16f, + 0x488614b9, 0x76edd656, 0x7556e1bd, 0x4b3d2352, 0x3226ffb0, + 0x0c4d3d5f, 0x0ff60ab4, 0x319dc85b, 0xbcc6c3aa, 0x82ad0145, + 0x811636ae, 0xbf7df441, 0xc66628a3, 0xf80dea4c, 0xfbb6dda7, + 0xc5dd1f48, 0x7004e7d1, 0x4e6f253e, 0x4dd412d5, 0x73bfd03a, + 0x0aa40cd8, 0x34cfce37, 0x3774f9dc, 0x091f3b33, 0x844430c2, + 0xba2ff22d, 0xb994c5c6, 0x87ff0729, 0xfee4dbcb, 0xc08f1924, + 0xc3342ecf, 0xfd5fec20, 0x988549f6, 0xa6ee8b19, 0xa555bcf2, + 0x9b3e7e1d, 0xe225a2ff, 0xdc4e6010, 0xdff557fb, 0xe19e9514, + 0x6cc59ee5, 0x52ae5c0a, 0x51156be1, 0x6f7ea90e, 0x166575ec, + 0x280eb703, 0x2bb580e8, 0x15de4207, 0x010905e6, 0x3f62c709, + 0x3cd9f0e2, 0x02b2320d, 0x7ba9eeef, 0x45c22c00, 0x46791beb, + 0x7812d904, 0xf549d2f5, 0xcb22101a, 0xc89927f1, 0xf6f2e51e, + 0x8fe939fc, 0xb182fb13, 0xb239ccf8, 0x8c520e17, 0xe988abc1, + 0xd7e3692e, 0xd4585ec5, 0xea339c2a, 0x932840c8, 0xad438227, + 0xaef8b5cc, 0x90937723, 0x1dc87cd2, 0x23a3be3d, 0x201889d6, + 0x1e734b39, 0x676897db, 0x59035534, 0x5ab862df, 0x64d3a030, + 0xd10a58a9, 0xef619a46, 0xecdaadad, 0xd2b16f42, 0xabaab3a0, + 0x95c1714f, 0x967a46a4, 0xa811844b, 0x254a8fba, 0x1b214d55, + 0x189a7abe, 0x26f1b851, 0x5fea64b3, 0x6181a65c, 0x623a91b7, + 0x5c515358, 0x398bf68e, 0x07e03461, 0x045b038a, 0x3a30c165, + 0x432b1d87, 0x7d40df68, 0x7efbe883, 0x40902a6c, 0xcdcb219d, + 0xf3a0e372, 0xf01bd499, 0xce701676, 0xb76bca94, 0x8900087b, + 0x8abb3f90, 0xb4d0fd7f, 0xa10ebf78, 0x9f657d97, 0x9cde4a7c, + 0xa2b58893, 0xdbae5471, 0xe5c5969e, 0xe67ea175, 0xd815639a, + 0x554e686b, 0x6b25aa84, 0x689e9d6f, 0x56f55f80, 0x2fee8362, + 0x1185418d, 0x123e7666, 0x2c55b489, 0x498f115f, 0x77e4d3b0, + 0x745fe45b, 0x4a3426b4, 0x332ffa56, 0x0d4438b9, 0x0eff0f52, + 0x3094cdbd, 0xbdcfc64c, 0x83a404a3, 0x801f3348, 0xbe74f1a7, + 0xc76f2d45, 0xf904efaa, 0xfabfd841, 0xc4d41aae, 0x710de237, + 0x4f6620d8, 0x4cdd1733, 0x72b6d5dc, 0x0bad093e, 0x35c6cbd1, + 0x367dfc3a, 0x08163ed5, 0x854d3524, 0xbb26f7cb, 0xb89dc020, + 0x86f602cf, 0xffedde2d, 0xc1861cc2, 0xc23d2b29, 0xfc56e9c6, + 0x998c4c10, 0xa7e78eff, 0xa45cb914, 0x9a377bfb, 0xe32ca719, + 0xdd4765f6, 0xdefc521d, 0xe09790f2, 0x6dcc9b03, 0x53a759ec, + 0x501c6e07, 0x6e77ace8, 0x176c700a, 0x2907b2e5, 0x2abc850e, + 0x14d747e1}, + {0x00000000, 0xc0df8ec1, 0xc1b96c58, 0x0166e299, 0x8273d9b0, + 0x42ac5771, 0x43cab5e8, 0x83153b29, 0x45e1c3ba, 0x853e4d7b, + 0x8458afe2, 0x44872123, 0xc7921a0a, 0x074d94cb, 0x062b7652, + 0xc6f4f893, 0xcbc4f6ae, 0x0b1b786f, 0x0a7d9af6, 0xcaa21437, + 0x49b72f1e, 0x8968a1df, 0x880e4346, 0x48d1cd87, 0x8e253514, + 0x4efabbd5, 0x4f9c594c, 0x8f43d78d, 0x0c56eca4, 0xcc896265, + 0xcdef80fc, 0x0d300e3d, 0xd78f9c86, 0x17501247, 0x1636f0de, + 0xd6e97e1f, 0x55fc4536, 0x9523cbf7, 0x9445296e, 0x549aa7af, + 0x926e5f3c, 0x52b1d1fd, 0x53d73364, 0x9308bda5, 0x101d868c, + 0xd0c2084d, 0xd1a4ead4, 0x117b6415, 0x1c4b6a28, 0xdc94e4e9, + 0xddf20670, 0x1d2d88b1, 0x9e38b398, 0x5ee73d59, 0x5f81dfc0, + 0x9f5e5101, 0x59aaa992, 0x99752753, 0x9813c5ca, 0x58cc4b0b, + 0xdbd97022, 0x1b06fee3, 0x1a601c7a, 0xdabf92bb, 0xef1948d6, + 0x2fc6c617, 0x2ea0248e, 0xee7faa4f, 0x6d6a9166, 0xadb51fa7, + 0xacd3fd3e, 0x6c0c73ff, 0xaaf88b6c, 0x6a2705ad, 0x6b41e734, + 0xab9e69f5, 0x288b52dc, 0xe854dc1d, 0xe9323e84, 0x29edb045, + 0x24ddbe78, 0xe40230b9, 0xe564d220, 0x25bb5ce1, 0xa6ae67c8, + 0x6671e909, 0x67170b90, 0xa7c88551, 0x613c7dc2, 0xa1e3f303, + 0xa085119a, 0x605a9f5b, 0xe34fa472, 0x23902ab3, 0x22f6c82a, + 0xe22946eb, 0x3896d450, 0xf8495a91, 0xf92fb808, 0x39f036c9, + 0xbae50de0, 0x7a3a8321, 0x7b5c61b8, 0xbb83ef79, 0x7d7717ea, + 0xbda8992b, 0xbcce7bb2, 0x7c11f573, 0xff04ce5a, 0x3fdb409b, + 0x3ebda202, 0xfe622cc3, 0xf35222fe, 0x338dac3f, 0x32eb4ea6, + 0xf234c067, 0x7121fb4e, 0xb1fe758f, 0xb0989716, 0x704719d7, + 0xb6b3e144, 0x766c6f85, 0x770a8d1c, 0xb7d503dd, 0x34c038f4, + 0xf41fb635, 0xf57954ac, 0x35a6da6d, 0x9f35e177, 0x5fea6fb6, + 0x5e8c8d2f, 0x9e5303ee, 0x1d4638c7, 0xdd99b606, 0xdcff549f, + 0x1c20da5e, 0xdad422cd, 0x1a0bac0c, 0x1b6d4e95, 0xdbb2c054, + 0x58a7fb7d, 0x987875bc, 0x991e9725, 0x59c119e4, 0x54f117d9, + 0x942e9918, 0x95487b81, 0x5597f540, 0xd682ce69, 0x165d40a8, + 0x173ba231, 0xd7e42cf0, 0x1110d463, 0xd1cf5aa2, 0xd0a9b83b, + 0x107636fa, 0x93630dd3, 0x53bc8312, 0x52da618b, 0x9205ef4a, + 0x48ba7df1, 0x8865f330, 0x890311a9, 0x49dc9f68, 0xcac9a441, + 0x0a162a80, 0x0b70c819, 0xcbaf46d8, 0x0d5bbe4b, 0xcd84308a, + 0xcce2d213, 0x0c3d5cd2, 0x8f2867fb, 0x4ff7e93a, 0x4e910ba3, + 0x8e4e8562, 0x837e8b5f, 0x43a1059e, 0x42c7e707, 0x821869c6, + 0x010d52ef, 0xc1d2dc2e, 0xc0b43eb7, 0x006bb076, 0xc69f48e5, + 0x0640c624, 0x072624bd, 0xc7f9aa7c, 0x44ec9155, 0x84331f94, + 0x8555fd0d, 0x458a73cc, 0x702ca9a1, 0xb0f32760, 0xb195c5f9, + 0x714a4b38, 0xf25f7011, 0x3280fed0, 0x33e61c49, 0xf3399288, + 0x35cd6a1b, 0xf512e4da, 0xf4740643, 0x34ab8882, 0xb7beb3ab, + 0x77613d6a, 0x7607dff3, 0xb6d85132, 0xbbe85f0f, 0x7b37d1ce, + 0x7a513357, 0xba8ebd96, 0x399b86bf, 0xf944087e, 0xf822eae7, + 0x38fd6426, 0xfe099cb5, 0x3ed61274, 0x3fb0f0ed, 0xff6f7e2c, + 0x7c7a4505, 0xbca5cbc4, 0xbdc3295d, 0x7d1ca79c, 0xa7a33527, + 0x677cbbe6, 0x661a597f, 0xa6c5d7be, 0x25d0ec97, 0xe50f6256, + 0xe46980cf, 0x24b60e0e, 0xe242f69d, 0x229d785c, 0x23fb9ac5, + 0xe3241404, 0x60312f2d, 0xa0eea1ec, 0xa1884375, 0x6157cdb4, + 0x6c67c389, 0xacb84d48, 0xaddeafd1, 0x6d012110, 0xee141a39, + 0x2ecb94f8, 0x2fad7661, 0xef72f8a0, 0x29860033, 0xe9598ef2, + 0xe83f6c6b, 0x28e0e2aa, 0xabf5d983, 0x6b2a5742, 0x6a4cb5db, + 0xaa933b1a}, + {0x00000000, 0x6f4ca59b, 0x9f9e3bec, 0xf0d29e77, 0x7f3b0603, + 0x1077a398, 0xe0a53def, 0x8fe99874, 0xfe760c06, 0x913aa99d, + 0x61e837ea, 0x0ea49271, 0x814d0a05, 0xee01af9e, 0x1ed331e9, + 0x719f9472, 0xfced180c, 0x93a1bd97, 0x637323e0, 0x0c3f867b, + 0x83d61e0f, 0xec9abb94, 0x1c4825e3, 0x73048078, 0x029b140a, + 0x6dd7b191, 0x9d052fe6, 0xf2498a7d, 0x7da01209, 0x12ecb792, + 0xe23e29e5, 0x8d728c7e, 0xf8db3118, 0x97979483, 0x67450af4, + 0x0809af6f, 0x87e0371b, 0xe8ac9280, 0x187e0cf7, 0x7732a96c, + 0x06ad3d1e, 0x69e19885, 0x993306f2, 0xf67fa369, 0x79963b1d, + 0x16da9e86, 0xe60800f1, 0x8944a56a, 0x04362914, 0x6b7a8c8f, + 0x9ba812f8, 0xf4e4b763, 0x7b0d2f17, 0x14418a8c, 0xe49314fb, + 0x8bdfb160, 0xfa402512, 0x950c8089, 0x65de1efe, 0x0a92bb65, + 0x857b2311, 0xea37868a, 0x1ae518fd, 0x75a9bd66, 0xf0b76330, + 0x9ffbc6ab, 0x6f2958dc, 0x0065fd47, 0x8f8c6533, 0xe0c0c0a8, + 0x10125edf, 0x7f5efb44, 0x0ec16f36, 0x618dcaad, 0x915f54da, + 0xfe13f141, 0x71fa6935, 0x1eb6ccae, 0xee6452d9, 0x8128f742, + 0x0c5a7b3c, 0x6316dea7, 0x93c440d0, 0xfc88e54b, 0x73617d3f, + 0x1c2dd8a4, 0xecff46d3, 0x83b3e348, 0xf22c773a, 0x9d60d2a1, + 0x6db24cd6, 0x02fee94d, 0x8d177139, 0xe25bd4a2, 0x12894ad5, + 0x7dc5ef4e, 0x086c5228, 0x6720f7b3, 0x97f269c4, 0xf8becc5f, + 0x7757542b, 0x181bf1b0, 0xe8c96fc7, 0x8785ca5c, 0xf61a5e2e, + 0x9956fbb5, 0x698465c2, 0x06c8c059, 0x8921582d, 0xe66dfdb6, + 0x16bf63c1, 0x79f3c65a, 0xf4814a24, 0x9bcdefbf, 0x6b1f71c8, + 0x0453d453, 0x8bba4c27, 0xe4f6e9bc, 0x142477cb, 0x7b68d250, + 0x0af74622, 0x65bbe3b9, 0x95697dce, 0xfa25d855, 0x75cc4021, + 0x1a80e5ba, 0xea527bcd, 0x851ede56, 0xe06fc760, 0x8f2362fb, + 0x7ff1fc8c, 0x10bd5917, 0x9f54c163, 0xf01864f8, 0x00cafa8f, + 0x6f865f14, 0x1e19cb66, 0x71556efd, 0x8187f08a, 0xeecb5511, + 0x6122cd65, 0x0e6e68fe, 0xfebcf689, 0x91f05312, 0x1c82df6c, + 0x73ce7af7, 0x831ce480, 0xec50411b, 0x63b9d96f, 0x0cf57cf4, + 0xfc27e283, 0x936b4718, 0xe2f4d36a, 0x8db876f1, 0x7d6ae886, + 0x12264d1d, 0x9dcfd569, 0xf28370f2, 0x0251ee85, 0x6d1d4b1e, + 0x18b4f678, 0x77f853e3, 0x872acd94, 0xe866680f, 0x678ff07b, + 0x08c355e0, 0xf811cb97, 0x975d6e0c, 0xe6c2fa7e, 0x898e5fe5, + 0x795cc192, 0x16106409, 0x99f9fc7d, 0xf6b559e6, 0x0667c791, + 0x692b620a, 0xe459ee74, 0x8b154bef, 0x7bc7d598, 0x148b7003, + 0x9b62e877, 0xf42e4dec, 0x04fcd39b, 0x6bb07600, 0x1a2fe272, + 0x756347e9, 0x85b1d99e, 0xeafd7c05, 0x6514e471, 0x0a5841ea, + 0xfa8adf9d, 0x95c67a06, 0x10d8a450, 0x7f9401cb, 0x8f469fbc, + 0xe00a3a27, 0x6fe3a253, 0x00af07c8, 0xf07d99bf, 0x9f313c24, + 0xeeaea856, 0x81e20dcd, 0x713093ba, 0x1e7c3621, 0x9195ae55, + 0xfed90bce, 0x0e0b95b9, 0x61473022, 0xec35bc5c, 0x837919c7, + 0x73ab87b0, 0x1ce7222b, 0x930eba5f, 0xfc421fc4, 0x0c9081b3, + 0x63dc2428, 0x1243b05a, 0x7d0f15c1, 0x8ddd8bb6, 0xe2912e2d, + 0x6d78b659, 0x023413c2, 0xf2e68db5, 0x9daa282e, 0xe8039548, + 0x874f30d3, 0x779daea4, 0x18d10b3f, 0x9738934b, 0xf87436d0, + 0x08a6a8a7, 0x67ea0d3c, 0x1675994e, 0x79393cd5, 0x89eba2a2, + 0xe6a70739, 0x694e9f4d, 0x06023ad6, 0xf6d0a4a1, 0x999c013a, + 0x14ee8d44, 0x7ba228df, 0x8b70b6a8, 0xe43c1333, 0x6bd58b47, + 0x04992edc, 0xf44bb0ab, 0x9b071530, 0xea988142, 0x85d424d9, + 0x7506baae, 0x1a4a1f35, 0x95a38741, 0xfaef22da, 0x0a3dbcad, + 0x65711936}}; + +#endif + +#endif + +#if N == 4 + +#if W == 8 + +local const z_crc_t FAR crc_braid_table[][256] = { + {0x00000000, 0xf1da05aa, 0x38c50d15, 0xc91f08bf, 0x718a1a2a, + 0x80501f80, 0x494f173f, 0xb8951295, 0xe3143454, 0x12ce31fe, + 0xdbd13941, 0x2a0b3ceb, 0x929e2e7e, 0x63442bd4, 0xaa5b236b, + 0x5b8126c1, 0x1d596ee9, 0xec836b43, 0x259c63fc, 0xd4466656, + 0x6cd374c3, 0x9d097169, 0x541679d6, 0xa5cc7c7c, 0xfe4d5abd, + 0x0f975f17, 0xc68857a8, 0x37525202, 0x8fc74097, 0x7e1d453d, + 0xb7024d82, 0x46d84828, 0x3ab2ddd2, 0xcb68d878, 0x0277d0c7, + 0xf3add56d, 0x4b38c7f8, 0xbae2c252, 0x73fdcaed, 0x8227cf47, + 0xd9a6e986, 0x287cec2c, 0xe163e493, 0x10b9e139, 0xa82cf3ac, + 0x59f6f606, 0x90e9feb9, 0x6133fb13, 0x27ebb33b, 0xd631b691, + 0x1f2ebe2e, 0xeef4bb84, 0x5661a911, 0xa7bbacbb, 0x6ea4a404, + 0x9f7ea1ae, 0xc4ff876f, 0x352582c5, 0xfc3a8a7a, 0x0de08fd0, + 0xb5759d45, 0x44af98ef, 0x8db09050, 0x7c6a95fa, 0x7565bba4, + 0x84bfbe0e, 0x4da0b6b1, 0xbc7ab31b, 0x04efa18e, 0xf535a424, + 0x3c2aac9b, 0xcdf0a931, 0x96718ff0, 0x67ab8a5a, 0xaeb482e5, + 0x5f6e874f, 0xe7fb95da, 0x16219070, 0xdf3e98cf, 0x2ee49d65, + 0x683cd54d, 0x99e6d0e7, 0x50f9d858, 0xa123ddf2, 0x19b6cf67, + 0xe86ccacd, 0x2173c272, 0xd0a9c7d8, 0x8b28e119, 0x7af2e4b3, + 0xb3edec0c, 0x4237e9a6, 0xfaa2fb33, 0x0b78fe99, 0xc267f626, + 0x33bdf38c, 0x4fd76676, 0xbe0d63dc, 0x77126b63, 0x86c86ec9, + 0x3e5d7c5c, 0xcf8779f6, 0x06987149, 0xf74274e3, 0xacc35222, + 0x5d195788, 0x94065f37, 0x65dc5a9d, 0xdd494808, 0x2c934da2, + 0xe58c451d, 0x145640b7, 0x528e089f, 0xa3540d35, 0x6a4b058a, + 0x9b910020, 0x230412b5, 0xd2de171f, 0x1bc11fa0, 0xea1b1a0a, + 0xb19a3ccb, 0x40403961, 0x895f31de, 0x78853474, 0xc01026e1, + 0x31ca234b, 0xf8d52bf4, 0x090f2e5e, 0xeacb7748, 0x1b1172e2, + 0xd20e7a5d, 0x23d47ff7, 0x9b416d62, 0x6a9b68c8, 0xa3846077, + 0x525e65dd, 0x09df431c, 0xf80546b6, 0x311a4e09, 0xc0c04ba3, + 0x78555936, 0x898f5c9c, 0x40905423, 0xb14a5189, 0xf79219a1, + 0x06481c0b, 0xcf5714b4, 0x3e8d111e, 0x8618038b, 0x77c20621, + 0xbedd0e9e, 0x4f070b34, 0x14862df5, 0xe55c285f, 0x2c4320e0, + 0xdd99254a, 0x650c37df, 0x94d63275, 0x5dc93aca, 0xac133f60, + 0xd079aa9a, 0x21a3af30, 0xe8bca78f, 0x1966a225, 0xa1f3b0b0, + 0x5029b51a, 0x9936bda5, 0x68ecb80f, 0x336d9ece, 0xc2b79b64, + 0x0ba893db, 0xfa729671, 0x42e784e4, 0xb33d814e, 0x7a2289f1, + 0x8bf88c5b, 0xcd20c473, 0x3cfac1d9, 0xf5e5c966, 0x043fcccc, + 0xbcaade59, 0x4d70dbf3, 0x846fd34c, 0x75b5d6e6, 0x2e34f027, + 0xdfeef58d, 0x16f1fd32, 0xe72bf898, 0x5fbeea0d, 0xae64efa7, + 0x677be718, 0x96a1e2b2, 0x9faeccec, 0x6e74c946, 0xa76bc1f9, + 0x56b1c453, 0xee24d6c6, 0x1ffed36c, 0xd6e1dbd3, 0x273bde79, + 0x7cbaf8b8, 0x8d60fd12, 0x447ff5ad, 0xb5a5f007, 0x0d30e292, + 0xfceae738, 0x35f5ef87, 0xc42fea2d, 0x82f7a205, 0x732da7af, + 0xba32af10, 0x4be8aaba, 0xf37db82f, 0x02a7bd85, 0xcbb8b53a, + 0x3a62b090, 0x61e39651, 0x903993fb, 0x59269b44, 0xa8fc9eee, + 0x10698c7b, 0xe1b389d1, 0x28ac816e, 0xd97684c4, 0xa51c113e, + 0x54c61494, 0x9dd91c2b, 0x6c031981, 0xd4960b14, 0x254c0ebe, + 0xec530601, 0x1d8903ab, 0x4608256a, 0xb7d220c0, 0x7ecd287f, + 0x8f172dd5, 0x37823f40, 0xc6583aea, 0x0f473255, 0xfe9d37ff, + 0xb8457fd7, 0x499f7a7d, 0x808072c2, 0x715a7768, 0xc9cf65fd, + 0x38156057, 0xf10a68e8, 0x00d06d42, 0x5b514b83, 0xaa8b4e29, + 0x63944696, 0x924e433c, 0x2adb51a9, 0xdb015403, 0x121e5cbc, + 0xe3c45916}, + {0x00000000, 0x0ee7e8d1, 0x1dcfd1a2, 0x13283973, 0x3b9fa344, + 0x35784b95, 0x265072e6, 0x28b79a37, 0x773f4688, 0x79d8ae59, + 0x6af0972a, 0x64177ffb, 0x4ca0e5cc, 0x42470d1d, 0x516f346e, + 0x5f88dcbf, 0xee7e8d10, 0xe09965c1, 0xf3b15cb2, 0xfd56b463, + 0xd5e12e54, 0xdb06c685, 0xc82efff6, 0xc6c91727, 0x9941cb98, + 0x97a62349, 0x848e1a3a, 0x8a69f2eb, 0xa2de68dc, 0xac39800d, + 0xbf11b97e, 0xb1f651af, 0x078c1c61, 0x096bf4b0, 0x1a43cdc3, + 0x14a42512, 0x3c13bf25, 0x32f457f4, 0x21dc6e87, 0x2f3b8656, + 0x70b35ae9, 0x7e54b238, 0x6d7c8b4b, 0x639b639a, 0x4b2cf9ad, + 0x45cb117c, 0x56e3280f, 0x5804c0de, 0xe9f29171, 0xe71579a0, + 0xf43d40d3, 0xfadaa802, 0xd26d3235, 0xdc8adae4, 0xcfa2e397, + 0xc1450b46, 0x9ecdd7f9, 0x902a3f28, 0x8302065b, 0x8de5ee8a, + 0xa55274bd, 0xabb59c6c, 0xb89da51f, 0xb67a4dce, 0x0f1838c2, + 0x01ffd013, 0x12d7e960, 0x1c3001b1, 0x34879b86, 0x3a607357, + 0x29484a24, 0x27afa2f5, 0x78277e4a, 0x76c0969b, 0x65e8afe8, + 0x6b0f4739, 0x43b8dd0e, 0x4d5f35df, 0x5e770cac, 0x5090e47d, + 0xe166b5d2, 0xef815d03, 0xfca96470, 0xf24e8ca1, 0xdaf91696, + 0xd41efe47, 0xc736c734, 0xc9d12fe5, 0x9659f35a, 0x98be1b8b, + 0x8b9622f8, 0x8571ca29, 0xadc6501e, 0xa321b8cf, 0xb00981bc, + 0xbeee696d, 0x089424a3, 0x0673cc72, 0x155bf501, 0x1bbc1dd0, + 0x330b87e7, 0x3dec6f36, 0x2ec45645, 0x2023be94, 0x7fab622b, + 0x714c8afa, 0x6264b389, 0x6c835b58, 0x4434c16f, 0x4ad329be, + 0x59fb10cd, 0x571cf81c, 0xe6eaa9b3, 0xe80d4162, 0xfb257811, + 0xf5c290c0, 0xdd750af7, 0xd392e226, 0xc0badb55, 0xce5d3384, + 0x91d5ef3b, 0x9f3207ea, 0x8c1a3e99, 0x82fdd648, 0xaa4a4c7f, + 0xa4ada4ae, 0xb7859ddd, 0xb962750c, 0x1e307184, 0x10d79955, + 0x03ffa026, 0x0d1848f7, 0x25afd2c0, 0x2b483a11, 0x38600362, + 0x3687ebb3, 0x690f370c, 0x67e8dfdd, 0x74c0e6ae, 0x7a270e7f, + 0x52909448, 0x5c777c99, 0x4f5f45ea, 0x41b8ad3b, 0xf04efc94, + 0xfea91445, 0xed812d36, 0xe366c5e7, 0xcbd15fd0, 0xc536b701, + 0xd61e8e72, 0xd8f966a3, 0x8771ba1c, 0x899652cd, 0x9abe6bbe, + 0x9459836f, 0xbcee1958, 0xb209f189, 0xa121c8fa, 0xafc6202b, + 0x19bc6de5, 0x175b8534, 0x0473bc47, 0x0a945496, 0x2223cea1, + 0x2cc42670, 0x3fec1f03, 0x310bf7d2, 0x6e832b6d, 0x6064c3bc, + 0x734cfacf, 0x7dab121e, 0x551c8829, 0x5bfb60f8, 0x48d3598b, + 0x4634b15a, 0xf7c2e0f5, 0xf9250824, 0xea0d3157, 0xe4ead986, + 0xcc5d43b1, 0xc2baab60, 0xd1929213, 0xdf757ac2, 0x80fda67d, + 0x8e1a4eac, 0x9d3277df, 0x93d59f0e, 0xbb620539, 0xb585ede8, + 0xa6add49b, 0xa84a3c4a, 0x11284946, 0x1fcfa197, 0x0ce798e4, + 0x02007035, 0x2ab7ea02, 0x245002d3, 0x37783ba0, 0x399fd371, + 0x66170fce, 0x68f0e71f, 0x7bd8de6c, 0x753f36bd, 0x5d88ac8a, + 0x536f445b, 0x40477d28, 0x4ea095f9, 0xff56c456, 0xf1b12c87, + 0xe29915f4, 0xec7efd25, 0xc4c96712, 0xca2e8fc3, 0xd906b6b0, + 0xd7e15e61, 0x886982de, 0x868e6a0f, 0x95a6537c, 0x9b41bbad, + 0xb3f6219a, 0xbd11c94b, 0xae39f038, 0xa0de18e9, 0x16a45527, + 0x1843bdf6, 0x0b6b8485, 0x058c6c54, 0x2d3bf663, 0x23dc1eb2, + 0x30f427c1, 0x3e13cf10, 0x619b13af, 0x6f7cfb7e, 0x7c54c20d, + 0x72b32adc, 0x5a04b0eb, 0x54e3583a, 0x47cb6149, 0x492c8998, + 0xf8dad837, 0xf63d30e6, 0xe5150995, 0xebf2e144, 0xc3457b73, + 0xcda293a2, 0xde8aaad1, 0xd06d4200, 0x8fe59ebf, 0x8102766e, + 0x922a4f1d, 0x9ccda7cc, 0xb47a3dfb, 0xba9dd52a, 0xa9b5ec59, + 0xa7520488}, + {0x00000000, 0x3c60e308, 0x78c1c610, 0x44a12518, 0xf1838c20, + 0xcde36f28, 0x89424a30, 0xb522a938, 0x38761e01, 0x0416fd09, + 0x40b7d811, 0x7cd73b19, 0xc9f59221, 0xf5957129, 0xb1345431, + 0x8d54b739, 0x70ec3c02, 0x4c8cdf0a, 0x082dfa12, 0x344d191a, + 0x816fb022, 0xbd0f532a, 0xf9ae7632, 0xc5ce953a, 0x489a2203, + 0x74fac10b, 0x305be413, 0x0c3b071b, 0xb919ae23, 0x85794d2b, + 0xc1d86833, 0xfdb88b3b, 0xe1d87804, 0xddb89b0c, 0x9919be14, + 0xa5795d1c, 0x105bf424, 0x2c3b172c, 0x689a3234, 0x54fad13c, + 0xd9ae6605, 0xe5ce850d, 0xa16fa015, 0x9d0f431d, 0x282dea25, + 0x144d092d, 0x50ec2c35, 0x6c8ccf3d, 0x91344406, 0xad54a70e, + 0xe9f58216, 0xd595611e, 0x60b7c826, 0x5cd72b2e, 0x18760e36, + 0x2416ed3e, 0xa9425a07, 0x9522b90f, 0xd1839c17, 0xede37f1f, + 0x58c1d627, 0x64a1352f, 0x20001037, 0x1c60f33f, 0x18c1f649, + 0x24a11541, 0x60003059, 0x5c60d351, 0xe9427a69, 0xd5229961, + 0x9183bc79, 0xade35f71, 0x20b7e848, 0x1cd70b40, 0x58762e58, + 0x6416cd50, 0xd1346468, 0xed548760, 0xa9f5a278, 0x95954170, + 0x682dca4b, 0x544d2943, 0x10ec0c5b, 0x2c8cef53, 0x99ae466b, + 0xa5cea563, 0xe16f807b, 0xdd0f6373, 0x505bd44a, 0x6c3b3742, + 0x289a125a, 0x14faf152, 0xa1d8586a, 0x9db8bb62, 0xd9199e7a, + 0xe5797d72, 0xf9198e4d, 0xc5796d45, 0x81d8485d, 0xbdb8ab55, + 0x089a026d, 0x34fae165, 0x705bc47d, 0x4c3b2775, 0xc16f904c, + 0xfd0f7344, 0xb9ae565c, 0x85ceb554, 0x30ec1c6c, 0x0c8cff64, + 0x482dda7c, 0x744d3974, 0x89f5b24f, 0xb5955147, 0xf134745f, + 0xcd549757, 0x78763e6f, 0x4416dd67, 0x00b7f87f, 0x3cd71b77, + 0xb183ac4e, 0x8de34f46, 0xc9426a5e, 0xf5228956, 0x4000206e, + 0x7c60c366, 0x38c1e67e, 0x04a10576, 0x3183ec92, 0x0de30f9a, + 0x49422a82, 0x7522c98a, 0xc00060b2, 0xfc6083ba, 0xb8c1a6a2, + 0x84a145aa, 0x09f5f293, 0x3595119b, 0x71343483, 0x4d54d78b, + 0xf8767eb3, 0xc4169dbb, 0x80b7b8a3, 0xbcd75bab, 0x416fd090, + 0x7d0f3398, 0x39ae1680, 0x05cef588, 0xb0ec5cb0, 0x8c8cbfb8, + 0xc82d9aa0, 0xf44d79a8, 0x7919ce91, 0x45792d99, 0x01d80881, + 0x3db8eb89, 0x889a42b1, 0xb4faa1b9, 0xf05b84a1, 0xcc3b67a9, + 0xd05b9496, 0xec3b779e, 0xa89a5286, 0x94fab18e, 0x21d818b6, + 0x1db8fbbe, 0x5919dea6, 0x65793dae, 0xe82d8a97, 0xd44d699f, + 0x90ec4c87, 0xac8caf8f, 0x19ae06b7, 0x25cee5bf, 0x616fc0a7, + 0x5d0f23af, 0xa0b7a894, 0x9cd74b9c, 0xd8766e84, 0xe4168d8c, + 0x513424b4, 0x6d54c7bc, 0x29f5e2a4, 0x159501ac, 0x98c1b695, + 0xa4a1559d, 0xe0007085, 0xdc60938d, 0x69423ab5, 0x5522d9bd, + 0x1183fca5, 0x2de31fad, 0x29421adb, 0x1522f9d3, 0x5183dccb, + 0x6de33fc3, 0xd8c196fb, 0xe4a175f3, 0xa00050eb, 0x9c60b3e3, + 0x113404da, 0x2d54e7d2, 0x69f5c2ca, 0x559521c2, 0xe0b788fa, + 0xdcd76bf2, 0x98764eea, 0xa416ade2, 0x59ae26d9, 0x65cec5d1, + 0x216fe0c9, 0x1d0f03c1, 0xa82daaf9, 0x944d49f1, 0xd0ec6ce9, + 0xec8c8fe1, 0x61d838d8, 0x5db8dbd0, 0x1919fec8, 0x25791dc0, + 0x905bb4f8, 0xac3b57f0, 0xe89a72e8, 0xd4fa91e0, 0xc89a62df, + 0xf4fa81d7, 0xb05ba4cf, 0x8c3b47c7, 0x3919eeff, 0x05790df7, + 0x41d828ef, 0x7db8cbe7, 0xf0ec7cde, 0xcc8c9fd6, 0x882dbace, + 0xb44d59c6, 0x016ff0fe, 0x3d0f13f6, 0x79ae36ee, 0x45ced5e6, + 0xb8765edd, 0x8416bdd5, 0xc0b798cd, 0xfcd77bc5, 0x49f5d2fd, + 0x759531f5, 0x313414ed, 0x0d54f7e5, 0x800040dc, 0xbc60a3d4, + 0xf8c186cc, 0xc4a165c4, 0x7183ccfc, 0x4de32ff4, 0x09420aec, + 0x3522e9e4}, + {0x00000000, 0x6307d924, 0xc60fb248, 0xa5086b6c, 0x576e62d1, + 0x3469bbf5, 0x9161d099, 0xf26609bd, 0xaedcc5a2, 0xcddb1c86, + 0x68d377ea, 0x0bd4aece, 0xf9b2a773, 0x9ab57e57, 0x3fbd153b, + 0x5cbacc1f, 0x86c88d05, 0xe5cf5421, 0x40c73f4d, 0x23c0e669, + 0xd1a6efd4, 0xb2a136f0, 0x17a95d9c, 0x74ae84b8, 0x281448a7, + 0x4b139183, 0xee1bfaef, 0x8d1c23cb, 0x7f7a2a76, 0x1c7df352, + 0xb975983e, 0xda72411a, 0xd6e01c4b, 0xb5e7c56f, 0x10efae03, + 0x73e87727, 0x818e7e9a, 0xe289a7be, 0x4781ccd2, 0x248615f6, + 0x783cd9e9, 0x1b3b00cd, 0xbe336ba1, 0xdd34b285, 0x2f52bb38, + 0x4c55621c, 0xe95d0970, 0x8a5ad054, 0x5028914e, 0x332f486a, + 0x96272306, 0xf520fa22, 0x0746f39f, 0x64412abb, 0xc14941d7, + 0xa24e98f3, 0xfef454ec, 0x9df38dc8, 0x38fbe6a4, 0x5bfc3f80, + 0xa99a363d, 0xca9def19, 0x6f958475, 0x0c925d51, 0x76b13ed7, + 0x15b6e7f3, 0xb0be8c9f, 0xd3b955bb, 0x21df5c06, 0x42d88522, + 0xe7d0ee4e, 0x84d7376a, 0xd86dfb75, 0xbb6a2251, 0x1e62493d, + 0x7d659019, 0x8f0399a4, 0xec044080, 0x490c2bec, 0x2a0bf2c8, + 0xf079b3d2, 0x937e6af6, 0x3676019a, 0x5571d8be, 0xa717d103, + 0xc4100827, 0x6118634b, 0x021fba6f, 0x5ea57670, 0x3da2af54, + 0x98aac438, 0xfbad1d1c, 0x09cb14a1, 0x6acccd85, 0xcfc4a6e9, + 0xacc37fcd, 0xa051229c, 0xc356fbb8, 0x665e90d4, 0x055949f0, + 0xf73f404d, 0x94389969, 0x3130f205, 0x52372b21, 0x0e8de73e, + 0x6d8a3e1a, 0xc8825576, 0xab858c52, 0x59e385ef, 0x3ae45ccb, + 0x9fec37a7, 0xfcebee83, 0x2699af99, 0x459e76bd, 0xe0961dd1, + 0x8391c4f5, 0x71f7cd48, 0x12f0146c, 0xb7f87f00, 0xd4ffa624, + 0x88456a3b, 0xeb42b31f, 0x4e4ad873, 0x2d4d0157, 0xdf2b08ea, + 0xbc2cd1ce, 0x1924baa2, 0x7a236386, 0xed627dae, 0x8e65a48a, + 0x2b6dcfe6, 0x486a16c2, 0xba0c1f7f, 0xd90bc65b, 0x7c03ad37, + 0x1f047413, 0x43beb80c, 0x20b96128, 0x85b10a44, 0xe6b6d360, + 0x14d0dadd, 0x77d703f9, 0xd2df6895, 0xb1d8b1b1, 0x6baaf0ab, + 0x08ad298f, 0xada542e3, 0xcea29bc7, 0x3cc4927a, 0x5fc34b5e, + 0xfacb2032, 0x99ccf916, 0xc5763509, 0xa671ec2d, 0x03798741, + 0x607e5e65, 0x921857d8, 0xf11f8efc, 0x5417e590, 0x37103cb4, + 0x3b8261e5, 0x5885b8c1, 0xfd8dd3ad, 0x9e8a0a89, 0x6cec0334, + 0x0febda10, 0xaae3b17c, 0xc9e46858, 0x955ea447, 0xf6597d63, + 0x5351160f, 0x3056cf2b, 0xc230c696, 0xa1371fb2, 0x043f74de, + 0x6738adfa, 0xbd4aece0, 0xde4d35c4, 0x7b455ea8, 0x1842878c, + 0xea248e31, 0x89235715, 0x2c2b3c79, 0x4f2ce55d, 0x13962942, + 0x7091f066, 0xd5999b0a, 0xb69e422e, 0x44f84b93, 0x27ff92b7, + 0x82f7f9db, 0xe1f020ff, 0x9bd34379, 0xf8d49a5d, 0x5ddcf131, + 0x3edb2815, 0xccbd21a8, 0xafbaf88c, 0x0ab293e0, 0x69b54ac4, + 0x350f86db, 0x56085fff, 0xf3003493, 0x9007edb7, 0x6261e40a, + 0x01663d2e, 0xa46e5642, 0xc7698f66, 0x1d1bce7c, 0x7e1c1758, + 0xdb147c34, 0xb813a510, 0x4a75acad, 0x29727589, 0x8c7a1ee5, + 0xef7dc7c1, 0xb3c70bde, 0xd0c0d2fa, 0x75c8b996, 0x16cf60b2, + 0xe4a9690f, 0x87aeb02b, 0x22a6db47, 0x41a10263, 0x4d335f32, + 0x2e348616, 0x8b3ced7a, 0xe83b345e, 0x1a5d3de3, 0x795ae4c7, + 0xdc528fab, 0xbf55568f, 0xe3ef9a90, 0x80e843b4, 0x25e028d8, + 0x46e7f1fc, 0xb481f841, 0xd7862165, 0x728e4a09, 0x1189932d, + 0xcbfbd237, 0xa8fc0b13, 0x0df4607f, 0x6ef3b95b, 0x9c95b0e6, + 0xff9269c2, 0x5a9a02ae, 0x399ddb8a, 0x65271795, 0x0620ceb1, + 0xa328a5dd, 0xc02f7cf9, 0x32497544, 0x514eac60, 0xf446c70c, + 0x97411e28}, + {0x00000000, 0x01b5fd1d, 0x036bfa3a, 0x02de0727, 0x06d7f474, + 0x07620969, 0x05bc0e4e, 0x0409f353, 0x0dafe8e8, 0x0c1a15f5, + 0x0ec412d2, 0x0f71efcf, 0x0b781c9c, 0x0acde181, 0x0813e6a6, + 0x09a61bbb, 0x1b5fd1d0, 0x1aea2ccd, 0x18342bea, 0x1981d6f7, + 0x1d8825a4, 0x1c3dd8b9, 0x1ee3df9e, 0x1f562283, 0x16f03938, + 0x1745c425, 0x159bc302, 0x142e3e1f, 0x1027cd4c, 0x11923051, + 0x134c3776, 0x12f9ca6b, 0x36bfa3a0, 0x370a5ebd, 0x35d4599a, + 0x3461a487, 0x306857d4, 0x31ddaac9, 0x3303adee, 0x32b650f3, + 0x3b104b48, 0x3aa5b655, 0x387bb172, 0x39ce4c6f, 0x3dc7bf3c, + 0x3c724221, 0x3eac4506, 0x3f19b81b, 0x2de07270, 0x2c558f6d, + 0x2e8b884a, 0x2f3e7557, 0x2b378604, 0x2a827b19, 0x285c7c3e, + 0x29e98123, 0x204f9a98, 0x21fa6785, 0x232460a2, 0x22919dbf, + 0x26986eec, 0x272d93f1, 0x25f394d6, 0x244669cb, 0x6d7f4740, + 0x6ccaba5d, 0x6e14bd7a, 0x6fa14067, 0x6ba8b334, 0x6a1d4e29, + 0x68c3490e, 0x6976b413, 0x60d0afa8, 0x616552b5, 0x63bb5592, + 0x620ea88f, 0x66075bdc, 0x67b2a6c1, 0x656ca1e6, 0x64d95cfb, + 0x76209690, 0x77956b8d, 0x754b6caa, 0x74fe91b7, 0x70f762e4, + 0x71429ff9, 0x739c98de, 0x722965c3, 0x7b8f7e78, 0x7a3a8365, + 0x78e48442, 0x7951795f, 0x7d588a0c, 0x7ced7711, 0x7e337036, + 0x7f868d2b, 0x5bc0e4e0, 0x5a7519fd, 0x58ab1eda, 0x591ee3c7, + 0x5d171094, 0x5ca2ed89, 0x5e7ceaae, 0x5fc917b3, 0x566f0c08, + 0x57daf115, 0x5504f632, 0x54b10b2f, 0x50b8f87c, 0x510d0561, + 0x53d30246, 0x5266ff5b, 0x409f3530, 0x412ac82d, 0x43f4cf0a, + 0x42413217, 0x4648c144, 0x47fd3c59, 0x45233b7e, 0x4496c663, + 0x4d30ddd8, 0x4c8520c5, 0x4e5b27e2, 0x4feedaff, 0x4be729ac, + 0x4a52d4b1, 0x488cd396, 0x49392e8b, 0xdafe8e80, 0xdb4b739d, + 0xd99574ba, 0xd82089a7, 0xdc297af4, 0xdd9c87e9, 0xdf4280ce, + 0xdef77dd3, 0xd7516668, 0xd6e49b75, 0xd43a9c52, 0xd58f614f, + 0xd186921c, 0xd0336f01, 0xd2ed6826, 0xd358953b, 0xc1a15f50, + 0xc014a24d, 0xc2caa56a, 0xc37f5877, 0xc776ab24, 0xc6c35639, + 0xc41d511e, 0xc5a8ac03, 0xcc0eb7b8, 0xcdbb4aa5, 0xcf654d82, + 0xced0b09f, 0xcad943cc, 0xcb6cbed1, 0xc9b2b9f6, 0xc80744eb, + 0xec412d20, 0xedf4d03d, 0xef2ad71a, 0xee9f2a07, 0xea96d954, + 0xeb232449, 0xe9fd236e, 0xe848de73, 0xe1eec5c8, 0xe05b38d5, + 0xe2853ff2, 0xe330c2ef, 0xe73931bc, 0xe68ccca1, 0xe452cb86, + 0xe5e7369b, 0xf71efcf0, 0xf6ab01ed, 0xf47506ca, 0xf5c0fbd7, + 0xf1c90884, 0xf07cf599, 0xf2a2f2be, 0xf3170fa3, 0xfab11418, + 0xfb04e905, 0xf9daee22, 0xf86f133f, 0xfc66e06c, 0xfdd31d71, + 0xff0d1a56, 0xfeb8e74b, 0xb781c9c0, 0xb63434dd, 0xb4ea33fa, + 0xb55fcee7, 0xb1563db4, 0xb0e3c0a9, 0xb23dc78e, 0xb3883a93, + 0xba2e2128, 0xbb9bdc35, 0xb945db12, 0xb8f0260f, 0xbcf9d55c, + 0xbd4c2841, 0xbf922f66, 0xbe27d27b, 0xacde1810, 0xad6be50d, + 0xafb5e22a, 0xae001f37, 0xaa09ec64, 0xabbc1179, 0xa962165e, + 0xa8d7eb43, 0xa171f0f8, 0xa0c40de5, 0xa21a0ac2, 0xa3aff7df, + 0xa7a6048c, 0xa613f991, 0xa4cdfeb6, 0xa57803ab, 0x813e6a60, + 0x808b977d, 0x8255905a, 0x83e06d47, 0x87e99e14, 0x865c6309, + 0x8482642e, 0x85379933, 0x8c918288, 0x8d247f95, 0x8ffa78b2, + 0x8e4f85af, 0x8a4676fc, 0x8bf38be1, 0x892d8cc6, 0x889871db, + 0x9a61bbb0, 0x9bd446ad, 0x990a418a, 0x98bfbc97, 0x9cb64fc4, + 0x9d03b2d9, 0x9fddb5fe, 0x9e6848e3, 0x97ce5358, 0x967bae45, + 0x94a5a962, 0x9510547f, 0x9119a72c, 0x90ac5a31, 0x92725d16, + 0x93c7a00b}, + {0x00000000, 0x6e8c1b41, 0xdd183682, 0xb3942dc3, 0x61416b45, + 0x0fcd7004, 0xbc595dc7, 0xd2d54686, 0xc282d68a, 0xac0ecdcb, + 0x1f9ae008, 0x7116fb49, 0xa3c3bdcf, 0xcd4fa68e, 0x7edb8b4d, + 0x1057900c, 0x5e74ab55, 0x30f8b014, 0x836c9dd7, 0xede08696, + 0x3f35c010, 0x51b9db51, 0xe22df692, 0x8ca1edd3, 0x9cf67ddf, + 0xf27a669e, 0x41ee4b5d, 0x2f62501c, 0xfdb7169a, 0x933b0ddb, + 0x20af2018, 0x4e233b59, 0xbce956aa, 0xd2654deb, 0x61f16028, + 0x0f7d7b69, 0xdda83def, 0xb32426ae, 0x00b00b6d, 0x6e3c102c, + 0x7e6b8020, 0x10e79b61, 0xa373b6a2, 0xcdffade3, 0x1f2aeb65, + 0x71a6f024, 0xc232dde7, 0xacbec6a6, 0xe29dfdff, 0x8c11e6be, + 0x3f85cb7d, 0x5109d03c, 0x83dc96ba, 0xed508dfb, 0x5ec4a038, + 0x3048bb79, 0x201f2b75, 0x4e933034, 0xfd071df7, 0x938b06b6, + 0x415e4030, 0x2fd25b71, 0x9c4676b2, 0xf2ca6df3, 0xa2a3ab15, + 0xcc2fb054, 0x7fbb9d97, 0x113786d6, 0xc3e2c050, 0xad6edb11, + 0x1efaf6d2, 0x7076ed93, 0x60217d9f, 0x0ead66de, 0xbd394b1d, + 0xd3b5505c, 0x016016da, 0x6fec0d9b, 0xdc782058, 0xb2f43b19, + 0xfcd70040, 0x925b1b01, 0x21cf36c2, 0x4f432d83, 0x9d966b05, + 0xf31a7044, 0x408e5d87, 0x2e0246c6, 0x3e55d6ca, 0x50d9cd8b, + 0xe34de048, 0x8dc1fb09, 0x5f14bd8f, 0x3198a6ce, 0x820c8b0d, + 0xec80904c, 0x1e4afdbf, 0x70c6e6fe, 0xc352cb3d, 0xadded07c, + 0x7f0b96fa, 0x11878dbb, 0xa213a078, 0xcc9fbb39, 0xdcc82b35, + 0xb2443074, 0x01d01db7, 0x6f5c06f6, 0xbd894070, 0xd3055b31, + 0x609176f2, 0x0e1d6db3, 0x403e56ea, 0x2eb24dab, 0x9d266068, + 0xf3aa7b29, 0x217f3daf, 0x4ff326ee, 0xfc670b2d, 0x92eb106c, + 0x82bc8060, 0xec309b21, 0x5fa4b6e2, 0x3128ada3, 0xe3fdeb25, + 0x8d71f064, 0x3ee5dda7, 0x5069c6e6, 0x9e36506b, 0xf0ba4b2a, + 0x432e66e9, 0x2da27da8, 0xff773b2e, 0x91fb206f, 0x226f0dac, + 0x4ce316ed, 0x5cb486e1, 0x32389da0, 0x81acb063, 0xef20ab22, + 0x3df5eda4, 0x5379f6e5, 0xe0eddb26, 0x8e61c067, 0xc042fb3e, + 0xaecee07f, 0x1d5acdbc, 0x73d6d6fd, 0xa103907b, 0xcf8f8b3a, + 0x7c1ba6f9, 0x1297bdb8, 0x02c02db4, 0x6c4c36f5, 0xdfd81b36, + 0xb1540077, 0x638146f1, 0x0d0d5db0, 0xbe997073, 0xd0156b32, + 0x22df06c1, 0x4c531d80, 0xffc73043, 0x914b2b02, 0x439e6d84, + 0x2d1276c5, 0x9e865b06, 0xf00a4047, 0xe05dd04b, 0x8ed1cb0a, + 0x3d45e6c9, 0x53c9fd88, 0x811cbb0e, 0xef90a04f, 0x5c048d8c, + 0x328896cd, 0x7cabad94, 0x1227b6d5, 0xa1b39b16, 0xcf3f8057, + 0x1deac6d1, 0x7366dd90, 0xc0f2f053, 0xae7eeb12, 0xbe297b1e, + 0xd0a5605f, 0x63314d9c, 0x0dbd56dd, 0xdf68105b, 0xb1e40b1a, + 0x027026d9, 0x6cfc3d98, 0x3c95fb7e, 0x5219e03f, 0xe18dcdfc, + 0x8f01d6bd, 0x5dd4903b, 0x33588b7a, 0x80cca6b9, 0xee40bdf8, + 0xfe172df4, 0x909b36b5, 0x230f1b76, 0x4d830037, 0x9f5646b1, + 0xf1da5df0, 0x424e7033, 0x2cc26b72, 0x62e1502b, 0x0c6d4b6a, + 0xbff966a9, 0xd1757de8, 0x03a03b6e, 0x6d2c202f, 0xdeb80dec, + 0xb03416ad, 0xa06386a1, 0xceef9de0, 0x7d7bb023, 0x13f7ab62, + 0xc122ede4, 0xafaef6a5, 0x1c3adb66, 0x72b6c027, 0x807cadd4, + 0xeef0b695, 0x5d649b56, 0x33e88017, 0xe13dc691, 0x8fb1ddd0, + 0x3c25f013, 0x52a9eb52, 0x42fe7b5e, 0x2c72601f, 0x9fe64ddc, + 0xf16a569d, 0x23bf101b, 0x4d330b5a, 0xfea72699, 0x902b3dd8, + 0xde080681, 0xb0841dc0, 0x03103003, 0x6d9c2b42, 0xbf496dc4, + 0xd1c57685, 0x62515b46, 0x0cdd4007, 0x1c8ad00b, 0x7206cb4a, + 0xc192e689, 0xaf1efdc8, 0x7dcbbb4e, 0x1347a00f, 0xa0d38dcc, + 0xce5f968d}, + {0x00000000, 0xe71da697, 0x154a4b6f, 0xf257edf8, 0x2a9496de, + 0xcd893049, 0x3fdeddb1, 0xd8c37b26, 0x55292dbc, 0xb2348b2b, + 0x406366d3, 0xa77ec044, 0x7fbdbb62, 0x98a01df5, 0x6af7f00d, + 0x8dea569a, 0xaa525b78, 0x4d4ffdef, 0xbf181017, 0x5805b680, + 0x80c6cda6, 0x67db6b31, 0x958c86c9, 0x7291205e, 0xff7b76c4, + 0x1866d053, 0xea313dab, 0x0d2c9b3c, 0xd5efe01a, 0x32f2468d, + 0xc0a5ab75, 0x27b80de2, 0x8fd5b0b1, 0x68c81626, 0x9a9ffbde, + 0x7d825d49, 0xa541266f, 0x425c80f8, 0xb00b6d00, 0x5716cb97, + 0xdafc9d0d, 0x3de13b9a, 0xcfb6d662, 0x28ab70f5, 0xf0680bd3, + 0x1775ad44, 0xe52240bc, 0x023fe62b, 0x2587ebc9, 0xc29a4d5e, + 0x30cda0a6, 0xd7d00631, 0x0f137d17, 0xe80edb80, 0x1a593678, + 0xfd4490ef, 0x70aec675, 0x97b360e2, 0x65e48d1a, 0x82f92b8d, + 0x5a3a50ab, 0xbd27f63c, 0x4f701bc4, 0xa86dbd53, 0xc4da6723, + 0x23c7c1b4, 0xd1902c4c, 0x368d8adb, 0xee4ef1fd, 0x0953576a, + 0xfb04ba92, 0x1c191c05, 0x91f34a9f, 0x76eeec08, 0x84b901f0, + 0x63a4a767, 0xbb67dc41, 0x5c7a7ad6, 0xae2d972e, 0x493031b9, + 0x6e883c5b, 0x89959acc, 0x7bc27734, 0x9cdfd1a3, 0x441caa85, + 0xa3010c12, 0x5156e1ea, 0xb64b477d, 0x3ba111e7, 0xdcbcb770, + 0x2eeb5a88, 0xc9f6fc1f, 0x11358739, 0xf62821ae, 0x047fcc56, + 0xe3626ac1, 0x4b0fd792, 0xac127105, 0x5e459cfd, 0xb9583a6a, + 0x619b414c, 0x8686e7db, 0x74d10a23, 0x93ccacb4, 0x1e26fa2e, + 0xf93b5cb9, 0x0b6cb141, 0xec7117d6, 0x34b26cf0, 0xd3afca67, + 0x21f8279f, 0xc6e58108, 0xe15d8cea, 0x06402a7d, 0xf417c785, + 0x130a6112, 0xcbc91a34, 0x2cd4bca3, 0xde83515b, 0x399ef7cc, + 0xb474a156, 0x536907c1, 0xa13eea39, 0x46234cae, 0x9ee03788, + 0x79fd911f, 0x8baa7ce7, 0x6cb7da70, 0x52c5c807, 0xb5d86e90, + 0x478f8368, 0xa09225ff, 0x78515ed9, 0x9f4cf84e, 0x6d1b15b6, + 0x8a06b321, 0x07ece5bb, 0xe0f1432c, 0x12a6aed4, 0xf5bb0843, + 0x2d787365, 0xca65d5f2, 0x3832380a, 0xdf2f9e9d, 0xf897937f, + 0x1f8a35e8, 0xedddd810, 0x0ac07e87, 0xd20305a1, 0x351ea336, + 0xc7494ece, 0x2054e859, 0xadbebec3, 0x4aa31854, 0xb8f4f5ac, + 0x5fe9533b, 0x872a281d, 0x60378e8a, 0x92606372, 0x757dc5e5, + 0xdd1078b6, 0x3a0dde21, 0xc85a33d9, 0x2f47954e, 0xf784ee68, + 0x109948ff, 0xe2cea507, 0x05d30390, 0x8839550a, 0x6f24f39d, + 0x9d731e65, 0x7a6eb8f2, 0xa2adc3d4, 0x45b06543, 0xb7e788bb, + 0x50fa2e2c, 0x774223ce, 0x905f8559, 0x620868a1, 0x8515ce36, + 0x5dd6b510, 0xbacb1387, 0x489cfe7f, 0xaf8158e8, 0x226b0e72, + 0xc576a8e5, 0x3721451d, 0xd03ce38a, 0x08ff98ac, 0xefe23e3b, + 0x1db5d3c3, 0xfaa87554, 0x961faf24, 0x710209b3, 0x8355e44b, + 0x644842dc, 0xbc8b39fa, 0x5b969f6d, 0xa9c17295, 0x4edcd402, + 0xc3368298, 0x242b240f, 0xd67cc9f7, 0x31616f60, 0xe9a21446, + 0x0ebfb2d1, 0xfce85f29, 0x1bf5f9be, 0x3c4df45c, 0xdb5052cb, + 0x2907bf33, 0xce1a19a4, 0x16d96282, 0xf1c4c415, 0x039329ed, + 0xe48e8f7a, 0x6964d9e0, 0x8e797f77, 0x7c2e928f, 0x9b333418, + 0x43f04f3e, 0xa4ede9a9, 0x56ba0451, 0xb1a7a2c6, 0x19ca1f95, + 0xfed7b902, 0x0c8054fa, 0xeb9df26d, 0x335e894b, 0xd4432fdc, + 0x2614c224, 0xc10964b3, 0x4ce33229, 0xabfe94be, 0x59a97946, + 0xbeb4dfd1, 0x6677a4f7, 0x816a0260, 0x733def98, 0x9420490f, + 0xb39844ed, 0x5485e27a, 0xa6d20f82, 0x41cfa915, 0x990cd233, + 0x7e1174a4, 0x8c46995c, 0x6b5b3fcb, 0xe6b16951, 0x01accfc6, + 0xf3fb223e, 0x14e684a9, 0xcc25ff8f, 0x2b385918, 0xd96fb4e0, + 0x3e721277}, + {0x00000000, 0xa58b900e, 0x9066265d, 0x35edb653, 0xfbbd4afb, + 0x5e36daf5, 0x6bdb6ca6, 0xce50fca8, 0x2c0b93b7, 0x898003b9, + 0xbc6db5ea, 0x19e625e4, 0xd7b6d94c, 0x723d4942, 0x47d0ff11, + 0xe25b6f1f, 0x5817276e, 0xfd9cb760, 0xc8710133, 0x6dfa913d, + 0xa3aa6d95, 0x0621fd9b, 0x33cc4bc8, 0x9647dbc6, 0x741cb4d9, + 0xd19724d7, 0xe47a9284, 0x41f1028a, 0x8fa1fe22, 0x2a2a6e2c, + 0x1fc7d87f, 0xba4c4871, 0xb02e4edc, 0x15a5ded2, 0x20486881, + 0x85c3f88f, 0x4b930427, 0xee189429, 0xdbf5227a, 0x7e7eb274, + 0x9c25dd6b, 0x39ae4d65, 0x0c43fb36, 0xa9c86b38, 0x67989790, + 0xc213079e, 0xf7feb1cd, 0x527521c3, 0xe83969b2, 0x4db2f9bc, + 0x785f4fef, 0xddd4dfe1, 0x13842349, 0xb60fb347, 0x83e20514, + 0x2669951a, 0xc432fa05, 0x61b96a0b, 0x5454dc58, 0xf1df4c56, + 0x3f8fb0fe, 0x9a0420f0, 0xafe996a3, 0x0a6206ad, 0xbb2d9bf9, + 0x1ea60bf7, 0x2b4bbda4, 0x8ec02daa, 0x4090d102, 0xe51b410c, + 0xd0f6f75f, 0x757d6751, 0x9726084e, 0x32ad9840, 0x07402e13, + 0xa2cbbe1d, 0x6c9b42b5, 0xc910d2bb, 0xfcfd64e8, 0x5976f4e6, + 0xe33abc97, 0x46b12c99, 0x735c9aca, 0xd6d70ac4, 0x1887f66c, + 0xbd0c6662, 0x88e1d031, 0x2d6a403f, 0xcf312f20, 0x6ababf2e, + 0x5f57097d, 0xfadc9973, 0x348c65db, 0x9107f5d5, 0xa4ea4386, + 0x0161d388, 0x0b03d525, 0xae88452b, 0x9b65f378, 0x3eee6376, + 0xf0be9fde, 0x55350fd0, 0x60d8b983, 0xc553298d, 0x27084692, + 0x8283d69c, 0xb76e60cf, 0x12e5f0c1, 0xdcb50c69, 0x793e9c67, + 0x4cd32a34, 0xe958ba3a, 0x5314f24b, 0xf69f6245, 0xc372d416, + 0x66f94418, 0xa8a9b8b0, 0x0d2228be, 0x38cf9eed, 0x9d440ee3, + 0x7f1f61fc, 0xda94f1f2, 0xef7947a1, 0x4af2d7af, 0x84a22b07, + 0x2129bb09, 0x14c40d5a, 0xb14f9d54, 0xad2a31b3, 0x08a1a1bd, + 0x3d4c17ee, 0x98c787e0, 0x56977b48, 0xf31ceb46, 0xc6f15d15, + 0x637acd1b, 0x8121a204, 0x24aa320a, 0x11478459, 0xb4cc1457, + 0x7a9ce8ff, 0xdf1778f1, 0xeafacea2, 0x4f715eac, 0xf53d16dd, + 0x50b686d3, 0x655b3080, 0xc0d0a08e, 0x0e805c26, 0xab0bcc28, + 0x9ee67a7b, 0x3b6dea75, 0xd936856a, 0x7cbd1564, 0x4950a337, + 0xecdb3339, 0x228bcf91, 0x87005f9f, 0xb2ede9cc, 0x176679c2, + 0x1d047f6f, 0xb88fef61, 0x8d625932, 0x28e9c93c, 0xe6b93594, + 0x4332a59a, 0x76df13c9, 0xd35483c7, 0x310fecd8, 0x94847cd6, + 0xa169ca85, 0x04e25a8b, 0xcab2a623, 0x6f39362d, 0x5ad4807e, + 0xff5f1070, 0x45135801, 0xe098c80f, 0xd5757e5c, 0x70feee52, + 0xbeae12fa, 0x1b2582f4, 0x2ec834a7, 0x8b43a4a9, 0x6918cbb6, + 0xcc935bb8, 0xf97eedeb, 0x5cf57de5, 0x92a5814d, 0x372e1143, + 0x02c3a710, 0xa748371e, 0x1607aa4a, 0xb38c3a44, 0x86618c17, + 0x23ea1c19, 0xedbae0b1, 0x483170bf, 0x7ddcc6ec, 0xd85756e2, + 0x3a0c39fd, 0x9f87a9f3, 0xaa6a1fa0, 0x0fe18fae, 0xc1b17306, + 0x643ae308, 0x51d7555b, 0xf45cc555, 0x4e108d24, 0xeb9b1d2a, + 0xde76ab79, 0x7bfd3b77, 0xb5adc7df, 0x102657d1, 0x25cbe182, + 0x8040718c, 0x621b1e93, 0xc7908e9d, 0xf27d38ce, 0x57f6a8c0, + 0x99a65468, 0x3c2dc466, 0x09c07235, 0xac4be23b, 0xa629e496, + 0x03a27498, 0x364fc2cb, 0x93c452c5, 0x5d94ae6d, 0xf81f3e63, + 0xcdf28830, 0x6879183e, 0x8a227721, 0x2fa9e72f, 0x1a44517c, + 0xbfcfc172, 0x719f3dda, 0xd414add4, 0xe1f91b87, 0x44728b89, + 0xfe3ec3f8, 0x5bb553f6, 0x6e58e5a5, 0xcbd375ab, 0x05838903, + 0xa008190d, 0x95e5af5e, 0x306e3f50, 0xd235504f, 0x77bec041, + 0x42537612, 0xe7d8e61c, 0x29881ab4, 0x8c038aba, 0xb9ee3ce9, + 0x1c65ace7}}; + +local const z_word_t FAR crc_braid_big_table[][256] = { + {0x0000000000000000, 0x0e908ba500000000, 0x5d26669000000000, + 0x53b6ed3500000000, 0xfb4abdfb00000000, 0xf5da365e00000000, + 0xa66cdb6b00000000, 0xa8fc50ce00000000, 0xb7930b2c00000000, + 0xb903808900000000, 0xeab56dbc00000000, 0xe425e61900000000, + 0x4cd9b6d700000000, 0x42493d7200000000, 0x11ffd04700000000, + 0x1f6f5be200000000, 0x6e27175800000000, 0x60b79cfd00000000, + 0x330171c800000000, 0x3d91fa6d00000000, 0x956daaa300000000, + 0x9bfd210600000000, 0xc84bcc3300000000, 0xc6db479600000000, + 0xd9b41c7400000000, 0xd72497d100000000, 0x84927ae400000000, + 0x8a02f14100000000, 0x22fea18f00000000, 0x2c6e2a2a00000000, + 0x7fd8c71f00000000, 0x71484cba00000000, 0xdc4e2eb000000000, + 0xd2dea51500000000, 0x8168482000000000, 0x8ff8c38500000000, + 0x2704934b00000000, 0x299418ee00000000, 0x7a22f5db00000000, + 0x74b27e7e00000000, 0x6bdd259c00000000, 0x654dae3900000000, + 0x36fb430c00000000, 0x386bc8a900000000, 0x9097986700000000, + 0x9e0713c200000000, 0xcdb1fef700000000, 0xc321755200000000, + 0xb26939e800000000, 0xbcf9b24d00000000, 0xef4f5f7800000000, + 0xe1dfd4dd00000000, 0x4923841300000000, 0x47b30fb600000000, + 0x1405e28300000000, 0x1a95692600000000, 0x05fa32c400000000, + 0x0b6ab96100000000, 0x58dc545400000000, 0x564cdff100000000, + 0xfeb08f3f00000000, 0xf020049a00000000, 0xa396e9af00000000, + 0xad06620a00000000, 0xf99b2dbb00000000, 0xf70ba61e00000000, + 0xa4bd4b2b00000000, 0xaa2dc08e00000000, 0x02d1904000000000, + 0x0c411be500000000, 0x5ff7f6d000000000, 0x51677d7500000000, + 0x4e08269700000000, 0x4098ad3200000000, 0x132e400700000000, + 0x1dbecba200000000, 0xb5429b6c00000000, 0xbbd210c900000000, + 0xe864fdfc00000000, 0xe6f4765900000000, 0x97bc3ae300000000, + 0x992cb14600000000, 0xca9a5c7300000000, 0xc40ad7d600000000, + 0x6cf6871800000000, 0x62660cbd00000000, 0x31d0e18800000000, + 0x3f406a2d00000000, 0x202f31cf00000000, 0x2ebfba6a00000000, + 0x7d09575f00000000, 0x7399dcfa00000000, 0xdb658c3400000000, + 0xd5f5079100000000, 0x8643eaa400000000, 0x88d3610100000000, + 0x25d5030b00000000, 0x2b4588ae00000000, 0x78f3659b00000000, + 0x7663ee3e00000000, 0xde9fbef000000000, 0xd00f355500000000, + 0x83b9d86000000000, 0x8d2953c500000000, 0x9246082700000000, + 0x9cd6838200000000, 0xcf606eb700000000, 0xc1f0e51200000000, + 0x690cb5dc00000000, 0x679c3e7900000000, 0x342ad34c00000000, + 0x3aba58e900000000, 0x4bf2145300000000, 0x45629ff600000000, + 0x16d472c300000000, 0x1844f96600000000, 0xb0b8a9a800000000, + 0xbe28220d00000000, 0xed9ecf3800000000, 0xe30e449d00000000, + 0xfc611f7f00000000, 0xf2f194da00000000, 0xa14779ef00000000, + 0xafd7f24a00000000, 0x072ba28400000000, 0x09bb292100000000, + 0x5a0dc41400000000, 0x549d4fb100000000, 0xb3312aad00000000, + 0xbda1a10800000000, 0xee174c3d00000000, 0xe087c79800000000, + 0x487b975600000000, 0x46eb1cf300000000, 0x155df1c600000000, + 0x1bcd7a6300000000, 0x04a2218100000000, 0x0a32aa2400000000, + 0x5984471100000000, 0x5714ccb400000000, 0xffe89c7a00000000, + 0xf17817df00000000, 0xa2cefaea00000000, 0xac5e714f00000000, + 0xdd163df500000000, 0xd386b65000000000, 0x80305b6500000000, + 0x8ea0d0c000000000, 0x265c800e00000000, 0x28cc0bab00000000, + 0x7b7ae69e00000000, 0x75ea6d3b00000000, 0x6a8536d900000000, + 0x6415bd7c00000000, 0x37a3504900000000, 0x3933dbec00000000, + 0x91cf8b2200000000, 0x9f5f008700000000, 0xcce9edb200000000, + 0xc279661700000000, 0x6f7f041d00000000, 0x61ef8fb800000000, + 0x3259628d00000000, 0x3cc9e92800000000, 0x9435b9e600000000, + 0x9aa5324300000000, 0xc913df7600000000, 0xc78354d300000000, + 0xd8ec0f3100000000, 0xd67c849400000000, 0x85ca69a100000000, + 0x8b5ae20400000000, 0x23a6b2ca00000000, 0x2d36396f00000000, + 0x7e80d45a00000000, 0x70105fff00000000, 0x0158134500000000, + 0x0fc898e000000000, 0x5c7e75d500000000, 0x52eefe7000000000, + 0xfa12aebe00000000, 0xf482251b00000000, 0xa734c82e00000000, + 0xa9a4438b00000000, 0xb6cb186900000000, 0xb85b93cc00000000, + 0xebed7ef900000000, 0xe57df55c00000000, 0x4d81a59200000000, + 0x43112e3700000000, 0x10a7c30200000000, 0x1e3748a700000000, + 0x4aaa071600000000, 0x443a8cb300000000, 0x178c618600000000, + 0x191cea2300000000, 0xb1e0baed00000000, 0xbf70314800000000, + 0xecc6dc7d00000000, 0xe25657d800000000, 0xfd390c3a00000000, + 0xf3a9879f00000000, 0xa01f6aaa00000000, 0xae8fe10f00000000, + 0x0673b1c100000000, 0x08e33a6400000000, 0x5b55d75100000000, + 0x55c55cf400000000, 0x248d104e00000000, 0x2a1d9beb00000000, + 0x79ab76de00000000, 0x773bfd7b00000000, 0xdfc7adb500000000, + 0xd157261000000000, 0x82e1cb2500000000, 0x8c71408000000000, + 0x931e1b6200000000, 0x9d8e90c700000000, 0xce387df200000000, + 0xc0a8f65700000000, 0x6854a69900000000, 0x66c42d3c00000000, + 0x3572c00900000000, 0x3be24bac00000000, 0x96e429a600000000, + 0x9874a20300000000, 0xcbc24f3600000000, 0xc552c49300000000, + 0x6dae945d00000000, 0x633e1ff800000000, 0x3088f2cd00000000, + 0x3e18796800000000, 0x2177228a00000000, 0x2fe7a92f00000000, + 0x7c51441a00000000, 0x72c1cfbf00000000, 0xda3d9f7100000000, + 0xd4ad14d400000000, 0x871bf9e100000000, 0x898b724400000000, + 0xf8c33efe00000000, 0xf653b55b00000000, 0xa5e5586e00000000, + 0xab75d3cb00000000, 0x0389830500000000, 0x0d1908a000000000, + 0x5eafe59500000000, 0x503f6e3000000000, 0x4f5035d200000000, + 0x41c0be7700000000, 0x1276534200000000, 0x1ce6d8e700000000, + 0xb41a882900000000, 0xba8a038c00000000, 0xe93ceeb900000000, + 0xe7ac651c00000000}, + {0x0000000000000000, 0x97a61de700000000, 0x6f4b4a1500000000, + 0xf8ed57f200000000, 0xde96942a00000000, 0x493089cd00000000, + 0xb1ddde3f00000000, 0x267bc3d800000000, 0xbc2d295500000000, + 0x2b8b34b200000000, 0xd366634000000000, 0x44c07ea700000000, + 0x62bbbd7f00000000, 0xf51da09800000000, 0x0df0f76a00000000, + 0x9a56ea8d00000000, 0x785b52aa00000000, 0xeffd4f4d00000000, + 0x171018bf00000000, 0x80b6055800000000, 0xa6cdc68000000000, + 0x316bdb6700000000, 0xc9868c9500000000, 0x5e20917200000000, + 0xc4767bff00000000, 0x53d0661800000000, 0xab3d31ea00000000, + 0x3c9b2c0d00000000, 0x1ae0efd500000000, 0x8d46f23200000000, + 0x75aba5c000000000, 0xe20db82700000000, 0xb1b0d58f00000000, + 0x2616c86800000000, 0xdefb9f9a00000000, 0x495d827d00000000, + 0x6f2641a500000000, 0xf8805c4200000000, 0x006d0bb000000000, + 0x97cb165700000000, 0x0d9dfcda00000000, 0x9a3be13d00000000, + 0x62d6b6cf00000000, 0xf570ab2800000000, 0xd30b68f000000000, + 0x44ad751700000000, 0xbc4022e500000000, 0x2be63f0200000000, + 0xc9eb872500000000, 0x5e4d9ac200000000, 0xa6a0cd3000000000, + 0x3106d0d700000000, 0x177d130f00000000, 0x80db0ee800000000, + 0x7836591a00000000, 0xef9044fd00000000, 0x75c6ae7000000000, + 0xe260b39700000000, 0x1a8de46500000000, 0x8d2bf98200000000, + 0xab503a5a00000000, 0x3cf627bd00000000, 0xc41b704f00000000, + 0x53bd6da800000000, 0x2367dac400000000, 0xb4c1c72300000000, + 0x4c2c90d100000000, 0xdb8a8d3600000000, 0xfdf14eee00000000, + 0x6a57530900000000, 0x92ba04fb00000000, 0x051c191c00000000, + 0x9f4af39100000000, 0x08ecee7600000000, 0xf001b98400000000, + 0x67a7a46300000000, 0x41dc67bb00000000, 0xd67a7a5c00000000, + 0x2e972dae00000000, 0xb931304900000000, 0x5b3c886e00000000, + 0xcc9a958900000000, 0x3477c27b00000000, 0xa3d1df9c00000000, + 0x85aa1c4400000000, 0x120c01a300000000, 0xeae1565100000000, + 0x7d474bb600000000, 0xe711a13b00000000, 0x70b7bcdc00000000, + 0x885aeb2e00000000, 0x1ffcf6c900000000, 0x3987351100000000, + 0xae2128f600000000, 0x56cc7f0400000000, 0xc16a62e300000000, + 0x92d70f4b00000000, 0x057112ac00000000, 0xfd9c455e00000000, + 0x6a3a58b900000000, 0x4c419b6100000000, 0xdbe7868600000000, + 0x230ad17400000000, 0xb4accc9300000000, 0x2efa261e00000000, + 0xb95c3bf900000000, 0x41b16c0b00000000, 0xd61771ec00000000, + 0xf06cb23400000000, 0x67caafd300000000, 0x9f27f82100000000, + 0x0881e5c600000000, 0xea8c5de100000000, 0x7d2a400600000000, + 0x85c717f400000000, 0x12610a1300000000, 0x341ac9cb00000000, + 0xa3bcd42c00000000, 0x5b5183de00000000, 0xccf79e3900000000, + 0x56a174b400000000, 0xc107695300000000, 0x39ea3ea100000000, + 0xae4c234600000000, 0x8837e09e00000000, 0x1f91fd7900000000, + 0xe77caa8b00000000, 0x70dab76c00000000, 0x07c8c55200000000, + 0x906ed8b500000000, 0x68838f4700000000, 0xff2592a000000000, + 0xd95e517800000000, 0x4ef84c9f00000000, 0xb6151b6d00000000, + 0x21b3068a00000000, 0xbbe5ec0700000000, 0x2c43f1e000000000, + 0xd4aea61200000000, 0x4308bbf500000000, 0x6573782d00000000, + 0xf2d565ca00000000, 0x0a38323800000000, 0x9d9e2fdf00000000, + 0x7f9397f800000000, 0xe8358a1f00000000, 0x10d8dded00000000, + 0x877ec00a00000000, 0xa10503d200000000, 0x36a31e3500000000, + 0xce4e49c700000000, 0x59e8542000000000, 0xc3bebead00000000, + 0x5418a34a00000000, 0xacf5f4b800000000, 0x3b53e95f00000000, + 0x1d282a8700000000, 0x8a8e376000000000, 0x7263609200000000, + 0xe5c57d7500000000, 0xb67810dd00000000, 0x21de0d3a00000000, + 0xd9335ac800000000, 0x4e95472f00000000, 0x68ee84f700000000, + 0xff48991000000000, 0x07a5cee200000000, 0x9003d30500000000, + 0x0a55398800000000, 0x9df3246f00000000, 0x651e739d00000000, + 0xf2b86e7a00000000, 0xd4c3ada200000000, 0x4365b04500000000, + 0xbb88e7b700000000, 0x2c2efa5000000000, 0xce23427700000000, + 0x59855f9000000000, 0xa168086200000000, 0x36ce158500000000, + 0x10b5d65d00000000, 0x8713cbba00000000, 0x7ffe9c4800000000, + 0xe85881af00000000, 0x720e6b2200000000, 0xe5a876c500000000, + 0x1d45213700000000, 0x8ae33cd000000000, 0xac98ff0800000000, + 0x3b3ee2ef00000000, 0xc3d3b51d00000000, 0x5475a8fa00000000, + 0x24af1f9600000000, 0xb309027100000000, 0x4be4558300000000, + 0xdc42486400000000, 0xfa398bbc00000000, 0x6d9f965b00000000, + 0x9572c1a900000000, 0x02d4dc4e00000000, 0x988236c300000000, + 0x0f242b2400000000, 0xf7c97cd600000000, 0x606f613100000000, + 0x4614a2e900000000, 0xd1b2bf0e00000000, 0x295fe8fc00000000, + 0xbef9f51b00000000, 0x5cf44d3c00000000, 0xcb5250db00000000, + 0x33bf072900000000, 0xa4191ace00000000, 0x8262d91600000000, + 0x15c4c4f100000000, 0xed29930300000000, 0x7a8f8ee400000000, + 0xe0d9646900000000, 0x777f798e00000000, 0x8f922e7c00000000, + 0x1834339b00000000, 0x3e4ff04300000000, 0xa9e9eda400000000, + 0x5104ba5600000000, 0xc6a2a7b100000000, 0x951fca1900000000, + 0x02b9d7fe00000000, 0xfa54800c00000000, 0x6df29deb00000000, + 0x4b895e3300000000, 0xdc2f43d400000000, 0x24c2142600000000, + 0xb36409c100000000, 0x2932e34c00000000, 0xbe94feab00000000, + 0x4679a95900000000, 0xd1dfb4be00000000, 0xf7a4776600000000, + 0x60026a8100000000, 0x98ef3d7300000000, 0x0f49209400000000, + 0xed4498b300000000, 0x7ae2855400000000, 0x820fd2a600000000, + 0x15a9cf4100000000, 0x33d20c9900000000, 0xa474117e00000000, + 0x5c99468c00000000, 0xcb3f5b6b00000000, 0x5169b1e600000000, + 0xc6cfac0100000000, 0x3e22fbf300000000, 0xa984e61400000000, + 0x8fff25cc00000000, 0x1859382b00000000, 0xe0b46fd900000000, + 0x7712723e00000000}, + {0x0000000000000000, 0x411b8c6e00000000, 0x823618dd00000000, + 0xc32d94b300000000, 0x456b416100000000, 0x0470cd0f00000000, + 0xc75d59bc00000000, 0x8646d5d200000000, 0x8ad682c200000000, + 0xcbcd0eac00000000, 0x08e09a1f00000000, 0x49fb167100000000, + 0xcfbdc3a300000000, 0x8ea64fcd00000000, 0x4d8bdb7e00000000, + 0x0c90571000000000, 0x55ab745e00000000, 0x14b0f83000000000, + 0xd79d6c8300000000, 0x9686e0ed00000000, 0x10c0353f00000000, + 0x51dbb95100000000, 0x92f62de200000000, 0xd3eda18c00000000, + 0xdf7df69c00000000, 0x9e667af200000000, 0x5d4bee4100000000, + 0x1c50622f00000000, 0x9a16b7fd00000000, 0xdb0d3b9300000000, + 0x1820af2000000000, 0x593b234e00000000, 0xaa56e9bc00000000, + 0xeb4d65d200000000, 0x2860f16100000000, 0x697b7d0f00000000, + 0xef3da8dd00000000, 0xae2624b300000000, 0x6d0bb00000000000, + 0x2c103c6e00000000, 0x20806b7e00000000, 0x619be71000000000, + 0xa2b673a300000000, 0xe3adffcd00000000, 0x65eb2a1f00000000, + 0x24f0a67100000000, 0xe7dd32c200000000, 0xa6c6beac00000000, + 0xfffd9de200000000, 0xbee6118c00000000, 0x7dcb853f00000000, + 0x3cd0095100000000, 0xba96dc8300000000, 0xfb8d50ed00000000, + 0x38a0c45e00000000, 0x79bb483000000000, 0x752b1f2000000000, + 0x3430934e00000000, 0xf71d07fd00000000, 0xb6068b9300000000, + 0x30405e4100000000, 0x715bd22f00000000, 0xb276469c00000000, + 0xf36dcaf200000000, 0x15aba3a200000000, 0x54b02fcc00000000, + 0x979dbb7f00000000, 0xd686371100000000, 0x50c0e2c300000000, + 0x11db6ead00000000, 0xd2f6fa1e00000000, 0x93ed767000000000, + 0x9f7d216000000000, 0xde66ad0e00000000, 0x1d4b39bd00000000, + 0x5c50b5d300000000, 0xda16600100000000, 0x9b0dec6f00000000, + 0x582078dc00000000, 0x193bf4b200000000, 0x4000d7fc00000000, + 0x011b5b9200000000, 0xc236cf2100000000, 0x832d434f00000000, + 0x056b969d00000000, 0x44701af300000000, 0x875d8e4000000000, + 0xc646022e00000000, 0xcad6553e00000000, 0x8bcdd95000000000, + 0x48e04de300000000, 0x09fbc18d00000000, 0x8fbd145f00000000, + 0xcea6983100000000, 0x0d8b0c8200000000, 0x4c9080ec00000000, + 0xbffd4a1e00000000, 0xfee6c67000000000, 0x3dcb52c300000000, + 0x7cd0dead00000000, 0xfa960b7f00000000, 0xbb8d871100000000, + 0x78a013a200000000, 0x39bb9fcc00000000, 0x352bc8dc00000000, + 0x743044b200000000, 0xb71dd00100000000, 0xf6065c6f00000000, + 0x704089bd00000000, 0x315b05d300000000, 0xf276916000000000, + 0xb36d1d0e00000000, 0xea563e4000000000, 0xab4db22e00000000, + 0x6860269d00000000, 0x297baaf300000000, 0xaf3d7f2100000000, + 0xee26f34f00000000, 0x2d0b67fc00000000, 0x6c10eb9200000000, + 0x6080bc8200000000, 0x219b30ec00000000, 0xe2b6a45f00000000, + 0xa3ad283100000000, 0x25ebfde300000000, 0x64f0718d00000000, + 0xa7dde53e00000000, 0xe6c6695000000000, 0x6b50369e00000000, + 0x2a4bbaf000000000, 0xe9662e4300000000, 0xa87da22d00000000, + 0x2e3b77ff00000000, 0x6f20fb9100000000, 0xac0d6f2200000000, + 0xed16e34c00000000, 0xe186b45c00000000, 0xa09d383200000000, + 0x63b0ac8100000000, 0x22ab20ef00000000, 0xa4edf53d00000000, + 0xe5f6795300000000, 0x26dbede000000000, 0x67c0618e00000000, + 0x3efb42c000000000, 0x7fe0ceae00000000, 0xbccd5a1d00000000, + 0xfdd6d67300000000, 0x7b9003a100000000, 0x3a8b8fcf00000000, + 0xf9a61b7c00000000, 0xb8bd971200000000, 0xb42dc00200000000, + 0xf5364c6c00000000, 0x361bd8df00000000, 0x770054b100000000, + 0xf146816300000000, 0xb05d0d0d00000000, 0x737099be00000000, + 0x326b15d000000000, 0xc106df2200000000, 0x801d534c00000000, + 0x4330c7ff00000000, 0x022b4b9100000000, 0x846d9e4300000000, + 0xc576122d00000000, 0x065b869e00000000, 0x47400af000000000, + 0x4bd05de000000000, 0x0acbd18e00000000, 0xc9e6453d00000000, + 0x88fdc95300000000, 0x0ebb1c8100000000, 0x4fa090ef00000000, + 0x8c8d045c00000000, 0xcd96883200000000, 0x94adab7c00000000, + 0xd5b6271200000000, 0x169bb3a100000000, 0x57803fcf00000000, + 0xd1c6ea1d00000000, 0x90dd667300000000, 0x53f0f2c000000000, + 0x12eb7eae00000000, 0x1e7b29be00000000, 0x5f60a5d000000000, + 0x9c4d316300000000, 0xdd56bd0d00000000, 0x5b1068df00000000, + 0x1a0be4b100000000, 0xd926700200000000, 0x983dfc6c00000000, + 0x7efb953c00000000, 0x3fe0195200000000, 0xfccd8de100000000, + 0xbdd6018f00000000, 0x3b90d45d00000000, 0x7a8b583300000000, + 0xb9a6cc8000000000, 0xf8bd40ee00000000, 0xf42d17fe00000000, + 0xb5369b9000000000, 0x761b0f2300000000, 0x3700834d00000000, + 0xb146569f00000000, 0xf05ddaf100000000, 0x33704e4200000000, + 0x726bc22c00000000, 0x2b50e16200000000, 0x6a4b6d0c00000000, + 0xa966f9bf00000000, 0xe87d75d100000000, 0x6e3ba00300000000, + 0x2f202c6d00000000, 0xec0db8de00000000, 0xad1634b000000000, + 0xa18663a000000000, 0xe09defce00000000, 0x23b07b7d00000000, + 0x62abf71300000000, 0xe4ed22c100000000, 0xa5f6aeaf00000000, + 0x66db3a1c00000000, 0x27c0b67200000000, 0xd4ad7c8000000000, + 0x95b6f0ee00000000, 0x569b645d00000000, 0x1780e83300000000, + 0x91c63de100000000, 0xd0ddb18f00000000, 0x13f0253c00000000, + 0x52eba95200000000, 0x5e7bfe4200000000, 0x1f60722c00000000, + 0xdc4de69f00000000, 0x9d566af100000000, 0x1b10bf2300000000, + 0x5a0b334d00000000, 0x9926a7fe00000000, 0xd83d2b9000000000, + 0x810608de00000000, 0xc01d84b000000000, 0x0330100300000000, + 0x422b9c6d00000000, 0xc46d49bf00000000, 0x8576c5d100000000, + 0x465b516200000000, 0x0740dd0c00000000, 0x0bd08a1c00000000, + 0x4acb067200000000, 0x89e692c100000000, 0xc8fd1eaf00000000, + 0x4ebbcb7d00000000, 0x0fa0471300000000, 0xcc8dd3a000000000, + 0x8d965fce00000000}, + {0x0000000000000000, 0x1dfdb50100000000, 0x3afa6b0300000000, + 0x2707de0200000000, 0x74f4d70600000000, 0x6909620700000000, + 0x4e0ebc0500000000, 0x53f3090400000000, 0xe8e8af0d00000000, + 0xf5151a0c00000000, 0xd212c40e00000000, 0xcfef710f00000000, + 0x9c1c780b00000000, 0x81e1cd0a00000000, 0xa6e6130800000000, + 0xbb1ba60900000000, 0xd0d15f1b00000000, 0xcd2cea1a00000000, + 0xea2b341800000000, 0xf7d6811900000000, 0xa425881d00000000, + 0xb9d83d1c00000000, 0x9edfe31e00000000, 0x8322561f00000000, + 0x3839f01600000000, 0x25c4451700000000, 0x02c39b1500000000, + 0x1f3e2e1400000000, 0x4ccd271000000000, 0x5130921100000000, + 0x76374c1300000000, 0x6bcaf91200000000, 0xa0a3bf3600000000, + 0xbd5e0a3700000000, 0x9a59d43500000000, 0x87a4613400000000, + 0xd457683000000000, 0xc9aadd3100000000, 0xeead033300000000, + 0xf350b63200000000, 0x484b103b00000000, 0x55b6a53a00000000, + 0x72b17b3800000000, 0x6f4cce3900000000, 0x3cbfc73d00000000, + 0x2142723c00000000, 0x0645ac3e00000000, 0x1bb8193f00000000, + 0x7072e02d00000000, 0x6d8f552c00000000, 0x4a888b2e00000000, + 0x57753e2f00000000, 0x0486372b00000000, 0x197b822a00000000, + 0x3e7c5c2800000000, 0x2381e92900000000, 0x989a4f2000000000, + 0x8567fa2100000000, 0xa260242300000000, 0xbf9d912200000000, + 0xec6e982600000000, 0xf1932d2700000000, 0xd694f32500000000, + 0xcb69462400000000, 0x40477f6d00000000, 0x5dbaca6c00000000, + 0x7abd146e00000000, 0x6740a16f00000000, 0x34b3a86b00000000, + 0x294e1d6a00000000, 0x0e49c36800000000, 0x13b4766900000000, + 0xa8afd06000000000, 0xb552656100000000, 0x9255bb6300000000, + 0x8fa80e6200000000, 0xdc5b076600000000, 0xc1a6b26700000000, + 0xe6a16c6500000000, 0xfb5cd96400000000, 0x9096207600000000, + 0x8d6b957700000000, 0xaa6c4b7500000000, 0xb791fe7400000000, + 0xe462f77000000000, 0xf99f427100000000, 0xde989c7300000000, + 0xc365297200000000, 0x787e8f7b00000000, 0x65833a7a00000000, + 0x4284e47800000000, 0x5f79517900000000, 0x0c8a587d00000000, + 0x1177ed7c00000000, 0x3670337e00000000, 0x2b8d867f00000000, + 0xe0e4c05b00000000, 0xfd19755a00000000, 0xda1eab5800000000, + 0xc7e31e5900000000, 0x9410175d00000000, 0x89eda25c00000000, + 0xaeea7c5e00000000, 0xb317c95f00000000, 0x080c6f5600000000, + 0x15f1da5700000000, 0x32f6045500000000, 0x2f0bb15400000000, + 0x7cf8b85000000000, 0x61050d5100000000, 0x4602d35300000000, + 0x5bff665200000000, 0x30359f4000000000, 0x2dc82a4100000000, + 0x0acff44300000000, 0x1732414200000000, 0x44c1484600000000, + 0x593cfd4700000000, 0x7e3b234500000000, 0x63c6964400000000, + 0xd8dd304d00000000, 0xc520854c00000000, 0xe2275b4e00000000, + 0xffdaee4f00000000, 0xac29e74b00000000, 0xb1d4524a00000000, + 0x96d38c4800000000, 0x8b2e394900000000, 0x808efeda00000000, + 0x9d734bdb00000000, 0xba7495d900000000, 0xa78920d800000000, + 0xf47a29dc00000000, 0xe9879cdd00000000, 0xce8042df00000000, + 0xd37df7de00000000, 0x686651d700000000, 0x759be4d600000000, + 0x529c3ad400000000, 0x4f618fd500000000, 0x1c9286d100000000, + 0x016f33d000000000, 0x2668edd200000000, 0x3b9558d300000000, + 0x505fa1c100000000, 0x4da214c000000000, 0x6aa5cac200000000, + 0x77587fc300000000, 0x24ab76c700000000, 0x3956c3c600000000, + 0x1e511dc400000000, 0x03aca8c500000000, 0xb8b70ecc00000000, + 0xa54abbcd00000000, 0x824d65cf00000000, 0x9fb0d0ce00000000, + 0xcc43d9ca00000000, 0xd1be6ccb00000000, 0xf6b9b2c900000000, + 0xeb4407c800000000, 0x202d41ec00000000, 0x3dd0f4ed00000000, + 0x1ad72aef00000000, 0x072a9fee00000000, 0x54d996ea00000000, + 0x492423eb00000000, 0x6e23fde900000000, 0x73de48e800000000, + 0xc8c5eee100000000, 0xd5385be000000000, 0xf23f85e200000000, + 0xefc230e300000000, 0xbc3139e700000000, 0xa1cc8ce600000000, + 0x86cb52e400000000, 0x9b36e7e500000000, 0xf0fc1ef700000000, + 0xed01abf600000000, 0xca0675f400000000, 0xd7fbc0f500000000, + 0x8408c9f100000000, 0x99f57cf000000000, 0xbef2a2f200000000, + 0xa30f17f300000000, 0x1814b1fa00000000, 0x05e904fb00000000, + 0x22eedaf900000000, 0x3f136ff800000000, 0x6ce066fc00000000, + 0x711dd3fd00000000, 0x561a0dff00000000, 0x4be7b8fe00000000, + 0xc0c981b700000000, 0xdd3434b600000000, 0xfa33eab400000000, + 0xe7ce5fb500000000, 0xb43d56b100000000, 0xa9c0e3b000000000, + 0x8ec73db200000000, 0x933a88b300000000, 0x28212eba00000000, + 0x35dc9bbb00000000, 0x12db45b900000000, 0x0f26f0b800000000, + 0x5cd5f9bc00000000, 0x41284cbd00000000, 0x662f92bf00000000, + 0x7bd227be00000000, 0x1018deac00000000, 0x0de56bad00000000, + 0x2ae2b5af00000000, 0x371f00ae00000000, 0x64ec09aa00000000, + 0x7911bcab00000000, 0x5e1662a900000000, 0x43ebd7a800000000, + 0xf8f071a100000000, 0xe50dc4a000000000, 0xc20a1aa200000000, + 0xdff7afa300000000, 0x8c04a6a700000000, 0x91f913a600000000, + 0xb6fecda400000000, 0xab0378a500000000, 0x606a3e8100000000, + 0x7d978b8000000000, 0x5a90558200000000, 0x476de08300000000, + 0x149ee98700000000, 0x09635c8600000000, 0x2e64828400000000, + 0x3399378500000000, 0x8882918c00000000, 0x957f248d00000000, + 0xb278fa8f00000000, 0xaf854f8e00000000, 0xfc76468a00000000, + 0xe18bf38b00000000, 0xc68c2d8900000000, 0xdb71988800000000, + 0xb0bb619a00000000, 0xad46d49b00000000, 0x8a410a9900000000, + 0x97bcbf9800000000, 0xc44fb69c00000000, 0xd9b2039d00000000, + 0xfeb5dd9f00000000, 0xe348689e00000000, 0x5853ce9700000000, + 0x45ae7b9600000000, 0x62a9a59400000000, 0x7f54109500000000, + 0x2ca7199100000000, 0x315aac9000000000, 0x165d729200000000, + 0x0ba0c79300000000}, + {0x0000000000000000, 0x24d9076300000000, 0x48b20fc600000000, + 0x6c6b08a500000000, 0xd1626e5700000000, 0xf5bb693400000000, + 0x99d0619100000000, 0xbd0966f200000000, 0xa2c5dcae00000000, + 0x861cdbcd00000000, 0xea77d36800000000, 0xceaed40b00000000, + 0x73a7b2f900000000, 0x577eb59a00000000, 0x3b15bd3f00000000, + 0x1fccba5c00000000, 0x058dc88600000000, 0x2154cfe500000000, + 0x4d3fc74000000000, 0x69e6c02300000000, 0xd4efa6d100000000, + 0xf036a1b200000000, 0x9c5da91700000000, 0xb884ae7400000000, + 0xa748142800000000, 0x8391134b00000000, 0xeffa1bee00000000, + 0xcb231c8d00000000, 0x762a7a7f00000000, 0x52f37d1c00000000, + 0x3e9875b900000000, 0x1a4172da00000000, 0x4b1ce0d600000000, + 0x6fc5e7b500000000, 0x03aeef1000000000, 0x2777e87300000000, + 0x9a7e8e8100000000, 0xbea789e200000000, 0xd2cc814700000000, + 0xf615862400000000, 0xe9d93c7800000000, 0xcd003b1b00000000, + 0xa16b33be00000000, 0x85b234dd00000000, 0x38bb522f00000000, + 0x1c62554c00000000, 0x70095de900000000, 0x54d05a8a00000000, + 0x4e91285000000000, 0x6a482f3300000000, 0x0623279600000000, + 0x22fa20f500000000, 0x9ff3460700000000, 0xbb2a416400000000, + 0xd74149c100000000, 0xf3984ea200000000, 0xec54f4fe00000000, + 0xc88df39d00000000, 0xa4e6fb3800000000, 0x803ffc5b00000000, + 0x3d369aa900000000, 0x19ef9dca00000000, 0x7584956f00000000, + 0x515d920c00000000, 0xd73eb17600000000, 0xf3e7b61500000000, + 0x9f8cbeb000000000, 0xbb55b9d300000000, 0x065cdf2100000000, + 0x2285d84200000000, 0x4eeed0e700000000, 0x6a37d78400000000, + 0x75fb6dd800000000, 0x51226abb00000000, 0x3d49621e00000000, + 0x1990657d00000000, 0xa499038f00000000, 0x804004ec00000000, + 0xec2b0c4900000000, 0xc8f20b2a00000000, 0xd2b379f000000000, + 0xf66a7e9300000000, 0x9a01763600000000, 0xbed8715500000000, + 0x03d117a700000000, 0x270810c400000000, 0x4b63186100000000, + 0x6fba1f0200000000, 0x7076a55e00000000, 0x54afa23d00000000, + 0x38c4aa9800000000, 0x1c1dadfb00000000, 0xa114cb0900000000, + 0x85cdcc6a00000000, 0xe9a6c4cf00000000, 0xcd7fc3ac00000000, + 0x9c2251a000000000, 0xb8fb56c300000000, 0xd4905e6600000000, + 0xf049590500000000, 0x4d403ff700000000, 0x6999389400000000, + 0x05f2303100000000, 0x212b375200000000, 0x3ee78d0e00000000, + 0x1a3e8a6d00000000, 0x765582c800000000, 0x528c85ab00000000, + 0xef85e35900000000, 0xcb5ce43a00000000, 0xa737ec9f00000000, + 0x83eeebfc00000000, 0x99af992600000000, 0xbd769e4500000000, + 0xd11d96e000000000, 0xf5c4918300000000, 0x48cdf77100000000, + 0x6c14f01200000000, 0x007ff8b700000000, 0x24a6ffd400000000, + 0x3b6a458800000000, 0x1fb342eb00000000, 0x73d84a4e00000000, + 0x57014d2d00000000, 0xea082bdf00000000, 0xced12cbc00000000, + 0xa2ba241900000000, 0x8663237a00000000, 0xae7d62ed00000000, + 0x8aa4658e00000000, 0xe6cf6d2b00000000, 0xc2166a4800000000, + 0x7f1f0cba00000000, 0x5bc60bd900000000, 0x37ad037c00000000, + 0x1374041f00000000, 0x0cb8be4300000000, 0x2861b92000000000, + 0x440ab18500000000, 0x60d3b6e600000000, 0xdddad01400000000, + 0xf903d77700000000, 0x9568dfd200000000, 0xb1b1d8b100000000, + 0xabf0aa6b00000000, 0x8f29ad0800000000, 0xe342a5ad00000000, + 0xc79ba2ce00000000, 0x7a92c43c00000000, 0x5e4bc35f00000000, + 0x3220cbfa00000000, 0x16f9cc9900000000, 0x093576c500000000, + 0x2dec71a600000000, 0x4187790300000000, 0x655e7e6000000000, + 0xd857189200000000, 0xfc8e1ff100000000, 0x90e5175400000000, + 0xb43c103700000000, 0xe561823b00000000, 0xc1b8855800000000, + 0xadd38dfd00000000, 0x890a8a9e00000000, 0x3403ec6c00000000, + 0x10daeb0f00000000, 0x7cb1e3aa00000000, 0x5868e4c900000000, + 0x47a45e9500000000, 0x637d59f600000000, 0x0f16515300000000, + 0x2bcf563000000000, 0x96c630c200000000, 0xb21f37a100000000, + 0xde743f0400000000, 0xfaad386700000000, 0xe0ec4abd00000000, + 0xc4354dde00000000, 0xa85e457b00000000, 0x8c87421800000000, + 0x318e24ea00000000, 0x1557238900000000, 0x793c2b2c00000000, + 0x5de52c4f00000000, 0x4229961300000000, 0x66f0917000000000, + 0x0a9b99d500000000, 0x2e429eb600000000, 0x934bf84400000000, + 0xb792ff2700000000, 0xdbf9f78200000000, 0xff20f0e100000000, + 0x7943d39b00000000, 0x5d9ad4f800000000, 0x31f1dc5d00000000, + 0x1528db3e00000000, 0xa821bdcc00000000, 0x8cf8baaf00000000, + 0xe093b20a00000000, 0xc44ab56900000000, 0xdb860f3500000000, + 0xff5f085600000000, 0x933400f300000000, 0xb7ed079000000000, + 0x0ae4616200000000, 0x2e3d660100000000, 0x42566ea400000000, + 0x668f69c700000000, 0x7cce1b1d00000000, 0x58171c7e00000000, + 0x347c14db00000000, 0x10a513b800000000, 0xadac754a00000000, + 0x8975722900000000, 0xe51e7a8c00000000, 0xc1c77def00000000, + 0xde0bc7b300000000, 0xfad2c0d000000000, 0x96b9c87500000000, + 0xb260cf1600000000, 0x0f69a9e400000000, 0x2bb0ae8700000000, + 0x47dba62200000000, 0x6302a14100000000, 0x325f334d00000000, + 0x1686342e00000000, 0x7aed3c8b00000000, 0x5e343be800000000, + 0xe33d5d1a00000000, 0xc7e45a7900000000, 0xab8f52dc00000000, + 0x8f5655bf00000000, 0x909aefe300000000, 0xb443e88000000000, + 0xd828e02500000000, 0xfcf1e74600000000, 0x41f881b400000000, + 0x652186d700000000, 0x094a8e7200000000, 0x2d93891100000000, + 0x37d2fbcb00000000, 0x130bfca800000000, 0x7f60f40d00000000, + 0x5bb9f36e00000000, 0xe6b0959c00000000, 0xc26992ff00000000, + 0xae029a5a00000000, 0x8adb9d3900000000, 0x9517276500000000, + 0xb1ce200600000000, 0xdda528a300000000, 0xf97c2fc000000000, + 0x4475493200000000, 0x60ac4e5100000000, 0x0cc746f400000000, + 0x281e419700000000}, + {0x0000000000000000, 0x08e3603c00000000, 0x10c6c17800000000, + 0x1825a14400000000, 0x208c83f100000000, 0x286fe3cd00000000, + 0x304a428900000000, 0x38a922b500000000, 0x011e763800000000, + 0x09fd160400000000, 0x11d8b74000000000, 0x193bd77c00000000, + 0x2192f5c900000000, 0x297195f500000000, 0x315434b100000000, + 0x39b7548d00000000, 0x023cec7000000000, 0x0adf8c4c00000000, + 0x12fa2d0800000000, 0x1a194d3400000000, 0x22b06f8100000000, + 0x2a530fbd00000000, 0x3276aef900000000, 0x3a95cec500000000, + 0x03229a4800000000, 0x0bc1fa7400000000, 0x13e45b3000000000, + 0x1b073b0c00000000, 0x23ae19b900000000, 0x2b4d798500000000, + 0x3368d8c100000000, 0x3b8bb8fd00000000, 0x0478d8e100000000, + 0x0c9bb8dd00000000, 0x14be199900000000, 0x1c5d79a500000000, + 0x24f45b1000000000, 0x2c173b2c00000000, 0x34329a6800000000, + 0x3cd1fa5400000000, 0x0566aed900000000, 0x0d85cee500000000, + 0x15a06fa100000000, 0x1d430f9d00000000, 0x25ea2d2800000000, + 0x2d094d1400000000, 0x352cec5000000000, 0x3dcf8c6c00000000, + 0x0644349100000000, 0x0ea754ad00000000, 0x1682f5e900000000, + 0x1e6195d500000000, 0x26c8b76000000000, 0x2e2bd75c00000000, + 0x360e761800000000, 0x3eed162400000000, 0x075a42a900000000, + 0x0fb9229500000000, 0x179c83d100000000, 0x1f7fe3ed00000000, + 0x27d6c15800000000, 0x2f35a16400000000, 0x3710002000000000, + 0x3ff3601c00000000, 0x49f6c11800000000, 0x4115a12400000000, + 0x5930006000000000, 0x51d3605c00000000, 0x697a42e900000000, + 0x619922d500000000, 0x79bc839100000000, 0x715fe3ad00000000, + 0x48e8b72000000000, 0x400bd71c00000000, 0x582e765800000000, + 0x50cd166400000000, 0x686434d100000000, 0x608754ed00000000, + 0x78a2f5a900000000, 0x7041959500000000, 0x4bca2d6800000000, + 0x43294d5400000000, 0x5b0cec1000000000, 0x53ef8c2c00000000, + 0x6b46ae9900000000, 0x63a5cea500000000, 0x7b806fe100000000, + 0x73630fdd00000000, 0x4ad45b5000000000, 0x42373b6c00000000, + 0x5a129a2800000000, 0x52f1fa1400000000, 0x6a58d8a100000000, + 0x62bbb89d00000000, 0x7a9e19d900000000, 0x727d79e500000000, + 0x4d8e19f900000000, 0x456d79c500000000, 0x5d48d88100000000, + 0x55abb8bd00000000, 0x6d029a0800000000, 0x65e1fa3400000000, + 0x7dc45b7000000000, 0x75273b4c00000000, 0x4c906fc100000000, + 0x44730ffd00000000, 0x5c56aeb900000000, 0x54b5ce8500000000, + 0x6c1cec3000000000, 0x64ff8c0c00000000, 0x7cda2d4800000000, + 0x74394d7400000000, 0x4fb2f58900000000, 0x475195b500000000, + 0x5f7434f100000000, 0x579754cd00000000, 0x6f3e767800000000, + 0x67dd164400000000, 0x7ff8b70000000000, 0x771bd73c00000000, + 0x4eac83b100000000, 0x464fe38d00000000, 0x5e6a42c900000000, + 0x568922f500000000, 0x6e20004000000000, 0x66c3607c00000000, + 0x7ee6c13800000000, 0x7605a10400000000, 0x92ec833100000000, + 0x9a0fe30d00000000, 0x822a424900000000, 0x8ac9227500000000, + 0xb26000c000000000, 0xba8360fc00000000, 0xa2a6c1b800000000, + 0xaa45a18400000000, 0x93f2f50900000000, 0x9b11953500000000, + 0x8334347100000000, 0x8bd7544d00000000, 0xb37e76f800000000, + 0xbb9d16c400000000, 0xa3b8b78000000000, 0xab5bd7bc00000000, + 0x90d06f4100000000, 0x98330f7d00000000, 0x8016ae3900000000, + 0x88f5ce0500000000, 0xb05cecb000000000, 0xb8bf8c8c00000000, + 0xa09a2dc800000000, 0xa8794df400000000, 0x91ce197900000000, + 0x992d794500000000, 0x8108d80100000000, 0x89ebb83d00000000, + 0xb1429a8800000000, 0xb9a1fab400000000, 0xa1845bf000000000, + 0xa9673bcc00000000, 0x96945bd000000000, 0x9e773bec00000000, + 0x86529aa800000000, 0x8eb1fa9400000000, 0xb618d82100000000, + 0xbefbb81d00000000, 0xa6de195900000000, 0xae3d796500000000, + 0x978a2de800000000, 0x9f694dd400000000, 0x874cec9000000000, + 0x8faf8cac00000000, 0xb706ae1900000000, 0xbfe5ce2500000000, + 0xa7c06f6100000000, 0xaf230f5d00000000, 0x94a8b7a000000000, + 0x9c4bd79c00000000, 0x846e76d800000000, 0x8c8d16e400000000, + 0xb424345100000000, 0xbcc7546d00000000, 0xa4e2f52900000000, + 0xac01951500000000, 0x95b6c19800000000, 0x9d55a1a400000000, + 0x857000e000000000, 0x8d9360dc00000000, 0xb53a426900000000, + 0xbdd9225500000000, 0xa5fc831100000000, 0xad1fe32d00000000, + 0xdb1a422900000000, 0xd3f9221500000000, 0xcbdc835100000000, + 0xc33fe36d00000000, 0xfb96c1d800000000, 0xf375a1e400000000, + 0xeb5000a000000000, 0xe3b3609c00000000, 0xda04341100000000, + 0xd2e7542d00000000, 0xcac2f56900000000, 0xc221955500000000, + 0xfa88b7e000000000, 0xf26bd7dc00000000, 0xea4e769800000000, + 0xe2ad16a400000000, 0xd926ae5900000000, 0xd1c5ce6500000000, + 0xc9e06f2100000000, 0xc1030f1d00000000, 0xf9aa2da800000000, + 0xf1494d9400000000, 0xe96cecd000000000, 0xe18f8cec00000000, + 0xd838d86100000000, 0xd0dbb85d00000000, 0xc8fe191900000000, + 0xc01d792500000000, 0xf8b45b9000000000, 0xf0573bac00000000, + 0xe8729ae800000000, 0xe091fad400000000, 0xdf629ac800000000, + 0xd781faf400000000, 0xcfa45bb000000000, 0xc7473b8c00000000, + 0xffee193900000000, 0xf70d790500000000, 0xef28d84100000000, + 0xe7cbb87d00000000, 0xde7cecf000000000, 0xd69f8ccc00000000, + 0xceba2d8800000000, 0xc6594db400000000, 0xfef06f0100000000, + 0xf6130f3d00000000, 0xee36ae7900000000, 0xe6d5ce4500000000, + 0xdd5e76b800000000, 0xd5bd168400000000, 0xcd98b7c000000000, + 0xc57bd7fc00000000, 0xfdd2f54900000000, 0xf531957500000000, + 0xed14343100000000, 0xe5f7540d00000000, 0xdc40008000000000, + 0xd4a360bc00000000, 0xcc86c1f800000000, 0xc465a1c400000000, + 0xfccc837100000000, 0xf42fe34d00000000, 0xec0a420900000000, + 0xe4e9223500000000}, + {0x0000000000000000, 0xd1e8e70e00000000, 0xa2d1cf1d00000000, + 0x7339281300000000, 0x44a39f3b00000000, 0x954b783500000000, + 0xe672502600000000, 0x379ab72800000000, 0x88463f7700000000, + 0x59aed87900000000, 0x2a97f06a00000000, 0xfb7f176400000000, + 0xcce5a04c00000000, 0x1d0d474200000000, 0x6e346f5100000000, + 0xbfdc885f00000000, 0x108d7eee00000000, 0xc16599e000000000, + 0xb25cb1f300000000, 0x63b456fd00000000, 0x542ee1d500000000, + 0x85c606db00000000, 0xf6ff2ec800000000, 0x2717c9c600000000, + 0x98cb419900000000, 0x4923a69700000000, 0x3a1a8e8400000000, + 0xebf2698a00000000, 0xdc68dea200000000, 0x0d8039ac00000000, + 0x7eb911bf00000000, 0xaf51f6b100000000, 0x611c8c0700000000, + 0xb0f46b0900000000, 0xc3cd431a00000000, 0x1225a41400000000, + 0x25bf133c00000000, 0xf457f43200000000, 0x876edc2100000000, + 0x56863b2f00000000, 0xe95ab37000000000, 0x38b2547e00000000, + 0x4b8b7c6d00000000, 0x9a639b6300000000, 0xadf92c4b00000000, + 0x7c11cb4500000000, 0x0f28e35600000000, 0xdec0045800000000, + 0x7191f2e900000000, 0xa07915e700000000, 0xd3403df400000000, + 0x02a8dafa00000000, 0x35326dd200000000, 0xe4da8adc00000000, + 0x97e3a2cf00000000, 0x460b45c100000000, 0xf9d7cd9e00000000, + 0x283f2a9000000000, 0x5b06028300000000, 0x8aeee58d00000000, + 0xbd7452a500000000, 0x6c9cb5ab00000000, 0x1fa59db800000000, + 0xce4d7ab600000000, 0xc238180f00000000, 0x13d0ff0100000000, + 0x60e9d71200000000, 0xb101301c00000000, 0x869b873400000000, + 0x5773603a00000000, 0x244a482900000000, 0xf5a2af2700000000, + 0x4a7e277800000000, 0x9b96c07600000000, 0xe8afe86500000000, + 0x39470f6b00000000, 0x0eddb84300000000, 0xdf355f4d00000000, + 0xac0c775e00000000, 0x7de4905000000000, 0xd2b566e100000000, + 0x035d81ef00000000, 0x7064a9fc00000000, 0xa18c4ef200000000, + 0x9616f9da00000000, 0x47fe1ed400000000, 0x34c736c700000000, + 0xe52fd1c900000000, 0x5af3599600000000, 0x8b1bbe9800000000, + 0xf822968b00000000, 0x29ca718500000000, 0x1e50c6ad00000000, + 0xcfb821a300000000, 0xbc8109b000000000, 0x6d69eebe00000000, + 0xa324940800000000, 0x72cc730600000000, 0x01f55b1500000000, + 0xd01dbc1b00000000, 0xe7870b3300000000, 0x366fec3d00000000, + 0x4556c42e00000000, 0x94be232000000000, 0x2b62ab7f00000000, + 0xfa8a4c7100000000, 0x89b3646200000000, 0x585b836c00000000, + 0x6fc1344400000000, 0xbe29d34a00000000, 0xcd10fb5900000000, + 0x1cf81c5700000000, 0xb3a9eae600000000, 0x62410de800000000, + 0x117825fb00000000, 0xc090c2f500000000, 0xf70a75dd00000000, + 0x26e292d300000000, 0x55dbbac000000000, 0x84335dce00000000, + 0x3befd59100000000, 0xea07329f00000000, 0x993e1a8c00000000, + 0x48d6fd8200000000, 0x7f4c4aaa00000000, 0xaea4ada400000000, + 0xdd9d85b700000000, 0x0c7562b900000000, 0x8471301e00000000, + 0x5599d71000000000, 0x26a0ff0300000000, 0xf748180d00000000, + 0xc0d2af2500000000, 0x113a482b00000000, 0x6203603800000000, + 0xb3eb873600000000, 0x0c370f6900000000, 0xdddfe86700000000, + 0xaee6c07400000000, 0x7f0e277a00000000, 0x4894905200000000, + 0x997c775c00000000, 0xea455f4f00000000, 0x3badb84100000000, + 0x94fc4ef000000000, 0x4514a9fe00000000, 0x362d81ed00000000, + 0xe7c566e300000000, 0xd05fd1cb00000000, 0x01b736c500000000, + 0x728e1ed600000000, 0xa366f9d800000000, 0x1cba718700000000, + 0xcd52968900000000, 0xbe6bbe9a00000000, 0x6f83599400000000, + 0x5819eebc00000000, 0x89f109b200000000, 0xfac821a100000000, + 0x2b20c6af00000000, 0xe56dbc1900000000, 0x34855b1700000000, + 0x47bc730400000000, 0x9654940a00000000, 0xa1ce232200000000, + 0x7026c42c00000000, 0x031fec3f00000000, 0xd2f70b3100000000, + 0x6d2b836e00000000, 0xbcc3646000000000, 0xcffa4c7300000000, + 0x1e12ab7d00000000, 0x29881c5500000000, 0xf860fb5b00000000, + 0x8b59d34800000000, 0x5ab1344600000000, 0xf5e0c2f700000000, + 0x240825f900000000, 0x57310dea00000000, 0x86d9eae400000000, + 0xb1435dcc00000000, 0x60abbac200000000, 0x139292d100000000, + 0xc27a75df00000000, 0x7da6fd8000000000, 0xac4e1a8e00000000, + 0xdf77329d00000000, 0x0e9fd59300000000, 0x390562bb00000000, + 0xe8ed85b500000000, 0x9bd4ada600000000, 0x4a3c4aa800000000, + 0x4649281100000000, 0x97a1cf1f00000000, 0xe498e70c00000000, + 0x3570000200000000, 0x02eab72a00000000, 0xd302502400000000, + 0xa03b783700000000, 0x71d39f3900000000, 0xce0f176600000000, + 0x1fe7f06800000000, 0x6cded87b00000000, 0xbd363f7500000000, + 0x8aac885d00000000, 0x5b446f5300000000, 0x287d474000000000, + 0xf995a04e00000000, 0x56c456ff00000000, 0x872cb1f100000000, + 0xf41599e200000000, 0x25fd7eec00000000, 0x1267c9c400000000, + 0xc38f2eca00000000, 0xb0b606d900000000, 0x615ee1d700000000, + 0xde82698800000000, 0x0f6a8e8600000000, 0x7c53a69500000000, + 0xadbb419b00000000, 0x9a21f6b300000000, 0x4bc911bd00000000, + 0x38f039ae00000000, 0xe918dea000000000, 0x2755a41600000000, + 0xf6bd431800000000, 0x85846b0b00000000, 0x546c8c0500000000, + 0x63f63b2d00000000, 0xb21edc2300000000, 0xc127f43000000000, + 0x10cf133e00000000, 0xaf139b6100000000, 0x7efb7c6f00000000, + 0x0dc2547c00000000, 0xdc2ab37200000000, 0xebb0045a00000000, + 0x3a58e35400000000, 0x4961cb4700000000, 0x98892c4900000000, + 0x37d8daf800000000, 0xe6303df600000000, 0x950915e500000000, + 0x44e1f2eb00000000, 0x737b45c300000000, 0xa293a2cd00000000, + 0xd1aa8ade00000000, 0x00426dd000000000, 0xbf9ee58f00000000, + 0x6e76028100000000, 0x1d4f2a9200000000, 0xcca7cd9c00000000, + 0xfb3d7ab400000000, 0x2ad59dba00000000, 0x59ecb5a900000000, + 0x880452a700000000}, + {0x0000000000000000, 0xaa05daf100000000, 0x150dc53800000000, + 0xbf081fc900000000, 0x2a1a8a7100000000, 0x801f508000000000, + 0x3f174f4900000000, 0x951295b800000000, 0x543414e300000000, + 0xfe31ce1200000000, 0x4139d1db00000000, 0xeb3c0b2a00000000, + 0x7e2e9e9200000000, 0xd42b446300000000, 0x6b235baa00000000, + 0xc126815b00000000, 0xe96e591d00000000, 0x436b83ec00000000, + 0xfc639c2500000000, 0x566646d400000000, 0xc374d36c00000000, + 0x6971099d00000000, 0xd679165400000000, 0x7c7ccca500000000, + 0xbd5a4dfe00000000, 0x175f970f00000000, 0xa85788c600000000, + 0x0252523700000000, 0x9740c78f00000000, 0x3d451d7e00000000, + 0x824d02b700000000, 0x2848d84600000000, 0xd2ddb23a00000000, + 0x78d868cb00000000, 0xc7d0770200000000, 0x6dd5adf300000000, + 0xf8c7384b00000000, 0x52c2e2ba00000000, 0xedcafd7300000000, + 0x47cf278200000000, 0x86e9a6d900000000, 0x2cec7c2800000000, + 0x93e463e100000000, 0x39e1b91000000000, 0xacf32ca800000000, + 0x06f6f65900000000, 0xb9fee99000000000, 0x13fb336100000000, + 0x3bb3eb2700000000, 0x91b631d600000000, 0x2ebe2e1f00000000, + 0x84bbf4ee00000000, 0x11a9615600000000, 0xbbacbba700000000, + 0x04a4a46e00000000, 0xaea17e9f00000000, 0x6f87ffc400000000, + 0xc582253500000000, 0x7a8a3afc00000000, 0xd08fe00d00000000, + 0x459d75b500000000, 0xef98af4400000000, 0x5090b08d00000000, + 0xfa956a7c00000000, 0xa4bb657500000000, 0x0ebebf8400000000, + 0xb1b6a04d00000000, 0x1bb37abc00000000, 0x8ea1ef0400000000, + 0x24a435f500000000, 0x9bac2a3c00000000, 0x31a9f0cd00000000, + 0xf08f719600000000, 0x5a8aab6700000000, 0xe582b4ae00000000, + 0x4f876e5f00000000, 0xda95fbe700000000, 0x7090211600000000, + 0xcf983edf00000000, 0x659de42e00000000, 0x4dd53c6800000000, + 0xe7d0e69900000000, 0x58d8f95000000000, 0xf2dd23a100000000, + 0x67cfb61900000000, 0xcdca6ce800000000, 0x72c2732100000000, + 0xd8c7a9d000000000, 0x19e1288b00000000, 0xb3e4f27a00000000, + 0x0cecedb300000000, 0xa6e9374200000000, 0x33fba2fa00000000, + 0x99fe780b00000000, 0x26f667c200000000, 0x8cf3bd3300000000, + 0x7666d74f00000000, 0xdc630dbe00000000, 0x636b127700000000, + 0xc96ec88600000000, 0x5c7c5d3e00000000, 0xf67987cf00000000, + 0x4971980600000000, 0xe37442f700000000, 0x2252c3ac00000000, + 0x8857195d00000000, 0x375f069400000000, 0x9d5adc6500000000, + 0x084849dd00000000, 0xa24d932c00000000, 0x1d458ce500000000, + 0xb740561400000000, 0x9f088e5200000000, 0x350d54a300000000, + 0x8a054b6a00000000, 0x2000919b00000000, 0xb512042300000000, + 0x1f17ded200000000, 0xa01fc11b00000000, 0x0a1a1bea00000000, + 0xcb3c9ab100000000, 0x6139404000000000, 0xde315f8900000000, + 0x7434857800000000, 0xe12610c000000000, 0x4b23ca3100000000, + 0xf42bd5f800000000, 0x5e2e0f0900000000, 0x4877cbea00000000, + 0xe272111b00000000, 0x5d7a0ed200000000, 0xf77fd42300000000, + 0x626d419b00000000, 0xc8689b6a00000000, 0x776084a300000000, + 0xdd655e5200000000, 0x1c43df0900000000, 0xb64605f800000000, + 0x094e1a3100000000, 0xa34bc0c000000000, 0x3659557800000000, + 0x9c5c8f8900000000, 0x2354904000000000, 0x89514ab100000000, + 0xa11992f700000000, 0x0b1c480600000000, 0xb41457cf00000000, + 0x1e118d3e00000000, 0x8b03188600000000, 0x2106c27700000000, + 0x9e0eddbe00000000, 0x340b074f00000000, 0xf52d861400000000, + 0x5f285ce500000000, 0xe020432c00000000, 0x4a2599dd00000000, + 0xdf370c6500000000, 0x7532d69400000000, 0xca3ac95d00000000, + 0x603f13ac00000000, 0x9aaa79d000000000, 0x30afa32100000000, + 0x8fa7bce800000000, 0x25a2661900000000, 0xb0b0f3a100000000, + 0x1ab5295000000000, 0xa5bd369900000000, 0x0fb8ec6800000000, + 0xce9e6d3300000000, 0x649bb7c200000000, 0xdb93a80b00000000, + 0x719672fa00000000, 0xe484e74200000000, 0x4e813db300000000, + 0xf189227a00000000, 0x5b8cf88b00000000, 0x73c420cd00000000, + 0xd9c1fa3c00000000, 0x66c9e5f500000000, 0xcccc3f0400000000, + 0x59deaabc00000000, 0xf3db704d00000000, 0x4cd36f8400000000, + 0xe6d6b57500000000, 0x27f0342e00000000, 0x8df5eedf00000000, + 0x32fdf11600000000, 0x98f82be700000000, 0x0deabe5f00000000, + 0xa7ef64ae00000000, 0x18e77b6700000000, 0xb2e2a19600000000, + 0xecccae9f00000000, 0x46c9746e00000000, 0xf9c16ba700000000, + 0x53c4b15600000000, 0xc6d624ee00000000, 0x6cd3fe1f00000000, + 0xd3dbe1d600000000, 0x79de3b2700000000, 0xb8f8ba7c00000000, + 0x12fd608d00000000, 0xadf57f4400000000, 0x07f0a5b500000000, + 0x92e2300d00000000, 0x38e7eafc00000000, 0x87eff53500000000, + 0x2dea2fc400000000, 0x05a2f78200000000, 0xafa72d7300000000, + 0x10af32ba00000000, 0xbaaae84b00000000, 0x2fb87df300000000, + 0x85bda70200000000, 0x3ab5b8cb00000000, 0x90b0623a00000000, + 0x5196e36100000000, 0xfb93399000000000, 0x449b265900000000, + 0xee9efca800000000, 0x7b8c691000000000, 0xd189b3e100000000, + 0x6e81ac2800000000, 0xc48476d900000000, 0x3e111ca500000000, + 0x9414c65400000000, 0x2b1cd99d00000000, 0x8119036c00000000, + 0x140b96d400000000, 0xbe0e4c2500000000, 0x010653ec00000000, + 0xab03891d00000000, 0x6a25084600000000, 0xc020d2b700000000, + 0x7f28cd7e00000000, 0xd52d178f00000000, 0x403f823700000000, + 0xea3a58c600000000, 0x5532470f00000000, 0xff379dfe00000000, + 0xd77f45b800000000, 0x7d7a9f4900000000, 0xc272808000000000, + 0x68775a7100000000, 0xfd65cfc900000000, 0x5760153800000000, + 0xe8680af100000000, 0x426dd00000000000, 0x834b515b00000000, + 0x294e8baa00000000, 0x9646946300000000, 0x3c434e9200000000, + 0xa951db2a00000000, 0x035401db00000000, 0xbc5c1e1200000000, + 0x1659c4e300000000}}; + +#else /* W == 4 */ + +local const z_crc_t FAR crc_braid_table[][256] = { + {0x00000000, 0xae689191, 0x87a02563, 0x29c8b4f2, 0xd4314c87, + 0x7a59dd16, 0x539169e4, 0xfdf9f875, 0x73139f4f, 0xdd7b0ede, + 0xf4b3ba2c, 0x5adb2bbd, 0xa722d3c8, 0x094a4259, 0x2082f6ab, + 0x8eea673a, 0xe6273e9e, 0x484faf0f, 0x61871bfd, 0xcfef8a6c, + 0x32167219, 0x9c7ee388, 0xb5b6577a, 0x1bdec6eb, 0x9534a1d1, + 0x3b5c3040, 0x129484b2, 0xbcfc1523, 0x4105ed56, 0xef6d7cc7, + 0xc6a5c835, 0x68cd59a4, 0x173f7b7d, 0xb957eaec, 0x909f5e1e, + 0x3ef7cf8f, 0xc30e37fa, 0x6d66a66b, 0x44ae1299, 0xeac68308, + 0x642ce432, 0xca4475a3, 0xe38cc151, 0x4de450c0, 0xb01da8b5, + 0x1e753924, 0x37bd8dd6, 0x99d51c47, 0xf11845e3, 0x5f70d472, + 0x76b86080, 0xd8d0f111, 0x25290964, 0x8b4198f5, 0xa2892c07, + 0x0ce1bd96, 0x820bdaac, 0x2c634b3d, 0x05abffcf, 0xabc36e5e, + 0x563a962b, 0xf85207ba, 0xd19ab348, 0x7ff222d9, 0x2e7ef6fa, + 0x8016676b, 0xa9ded399, 0x07b64208, 0xfa4fba7d, 0x54272bec, + 0x7def9f1e, 0xd3870e8f, 0x5d6d69b5, 0xf305f824, 0xdacd4cd6, + 0x74a5dd47, 0x895c2532, 0x2734b4a3, 0x0efc0051, 0xa09491c0, + 0xc859c864, 0x663159f5, 0x4ff9ed07, 0xe1917c96, 0x1c6884e3, + 0xb2001572, 0x9bc8a180, 0x35a03011, 0xbb4a572b, 0x1522c6ba, + 0x3cea7248, 0x9282e3d9, 0x6f7b1bac, 0xc1138a3d, 0xe8db3ecf, + 0x46b3af5e, 0x39418d87, 0x97291c16, 0xbee1a8e4, 0x10893975, + 0xed70c100, 0x43185091, 0x6ad0e463, 0xc4b875f2, 0x4a5212c8, + 0xe43a8359, 0xcdf237ab, 0x639aa63a, 0x9e635e4f, 0x300bcfde, + 0x19c37b2c, 0xb7abeabd, 0xdf66b319, 0x710e2288, 0x58c6967a, + 0xf6ae07eb, 0x0b57ff9e, 0xa53f6e0f, 0x8cf7dafd, 0x229f4b6c, + 0xac752c56, 0x021dbdc7, 0x2bd50935, 0x85bd98a4, 0x784460d1, + 0xd62cf140, 0xffe445b2, 0x518cd423, 0x5cfdedf4, 0xf2957c65, + 0xdb5dc897, 0x75355906, 0x88cca173, 0x26a430e2, 0x0f6c8410, + 0xa1041581, 0x2fee72bb, 0x8186e32a, 0xa84e57d8, 0x0626c649, + 0xfbdf3e3c, 0x55b7afad, 0x7c7f1b5f, 0xd2178ace, 0xbadad36a, + 0x14b242fb, 0x3d7af609, 0x93126798, 0x6eeb9fed, 0xc0830e7c, + 0xe94bba8e, 0x47232b1f, 0xc9c94c25, 0x67a1ddb4, 0x4e696946, + 0xe001f8d7, 0x1df800a2, 0xb3909133, 0x9a5825c1, 0x3430b450, + 0x4bc29689, 0xe5aa0718, 0xcc62b3ea, 0x620a227b, 0x9ff3da0e, + 0x319b4b9f, 0x1853ff6d, 0xb63b6efc, 0x38d109c6, 0x96b99857, + 0xbf712ca5, 0x1119bd34, 0xece04541, 0x4288d4d0, 0x6b406022, + 0xc528f1b3, 0xade5a817, 0x038d3986, 0x2a458d74, 0x842d1ce5, + 0x79d4e490, 0xd7bc7501, 0xfe74c1f3, 0x501c5062, 0xdef63758, + 0x709ea6c9, 0x5956123b, 0xf73e83aa, 0x0ac77bdf, 0xa4afea4e, + 0x8d675ebc, 0x230fcf2d, 0x72831b0e, 0xdceb8a9f, 0xf5233e6d, + 0x5b4baffc, 0xa6b25789, 0x08dac618, 0x211272ea, 0x8f7ae37b, + 0x01908441, 0xaff815d0, 0x8630a122, 0x285830b3, 0xd5a1c8c6, + 0x7bc95957, 0x5201eda5, 0xfc697c34, 0x94a42590, 0x3accb401, + 0x130400f3, 0xbd6c9162, 0x40956917, 0xeefdf886, 0xc7354c74, + 0x695ddde5, 0xe7b7badf, 0x49df2b4e, 0x60179fbc, 0xce7f0e2d, + 0x3386f658, 0x9dee67c9, 0xb426d33b, 0x1a4e42aa, 0x65bc6073, + 0xcbd4f1e2, 0xe21c4510, 0x4c74d481, 0xb18d2cf4, 0x1fe5bd65, + 0x362d0997, 0x98459806, 0x16afff3c, 0xb8c76ead, 0x910fda5f, + 0x3f674bce, 0xc29eb3bb, 0x6cf6222a, 0x453e96d8, 0xeb560749, + 0x839b5eed, 0x2df3cf7c, 0x043b7b8e, 0xaa53ea1f, 0x57aa126a, + 0xf9c283fb, 0xd00a3709, 0x7e62a698, 0xf088c1a2, 0x5ee05033, + 0x7728e4c1, 0xd9407550, 0x24b98d25, 0x8ad11cb4, 0xa319a846, + 0x0d7139d7}, + {0x00000000, 0xb9fbdbe8, 0xa886b191, 0x117d6a79, 0x8a7c6563, + 0x3387be8b, 0x22fad4f2, 0x9b010f1a, 0xcf89cc87, 0x7672176f, + 0x670f7d16, 0xdef4a6fe, 0x45f5a9e4, 0xfc0e720c, 0xed731875, + 0x5488c39d, 0x44629f4f, 0xfd9944a7, 0xece42ede, 0x551ff536, + 0xce1efa2c, 0x77e521c4, 0x66984bbd, 0xdf639055, 0x8beb53c8, + 0x32108820, 0x236de259, 0x9a9639b1, 0x019736ab, 0xb86ced43, + 0xa911873a, 0x10ea5cd2, 0x88c53e9e, 0x313ee576, 0x20438f0f, + 0x99b854e7, 0x02b95bfd, 0xbb428015, 0xaa3fea6c, 0x13c43184, + 0x474cf219, 0xfeb729f1, 0xefca4388, 0x56319860, 0xcd30977a, + 0x74cb4c92, 0x65b626eb, 0xdc4dfd03, 0xcca7a1d1, 0x755c7a39, + 0x64211040, 0xdddacba8, 0x46dbc4b2, 0xff201f5a, 0xee5d7523, + 0x57a6aecb, 0x032e6d56, 0xbad5b6be, 0xaba8dcc7, 0x1253072f, + 0x89520835, 0x30a9d3dd, 0x21d4b9a4, 0x982f624c, 0xcafb7b7d, + 0x7300a095, 0x627dcaec, 0xdb861104, 0x40871e1e, 0xf97cc5f6, + 0xe801af8f, 0x51fa7467, 0x0572b7fa, 0xbc896c12, 0xadf4066b, + 0x140fdd83, 0x8f0ed299, 0x36f50971, 0x27886308, 0x9e73b8e0, + 0x8e99e432, 0x37623fda, 0x261f55a3, 0x9fe48e4b, 0x04e58151, + 0xbd1e5ab9, 0xac6330c0, 0x1598eb28, 0x411028b5, 0xf8ebf35d, + 0xe9969924, 0x506d42cc, 0xcb6c4dd6, 0x7297963e, 0x63eafc47, + 0xda1127af, 0x423e45e3, 0xfbc59e0b, 0xeab8f472, 0x53432f9a, + 0xc8422080, 0x71b9fb68, 0x60c49111, 0xd93f4af9, 0x8db78964, + 0x344c528c, 0x253138f5, 0x9ccae31d, 0x07cbec07, 0xbe3037ef, + 0xaf4d5d96, 0x16b6867e, 0x065cdaac, 0xbfa70144, 0xaeda6b3d, + 0x1721b0d5, 0x8c20bfcf, 0x35db6427, 0x24a60e5e, 0x9d5dd5b6, + 0xc9d5162b, 0x702ecdc3, 0x6153a7ba, 0xd8a87c52, 0x43a97348, + 0xfa52a8a0, 0xeb2fc2d9, 0x52d41931, 0x4e87f0bb, 0xf77c2b53, + 0xe601412a, 0x5ffa9ac2, 0xc4fb95d8, 0x7d004e30, 0x6c7d2449, + 0xd586ffa1, 0x810e3c3c, 0x38f5e7d4, 0x29888dad, 0x90735645, + 0x0b72595f, 0xb28982b7, 0xa3f4e8ce, 0x1a0f3326, 0x0ae56ff4, + 0xb31eb41c, 0xa263de65, 0x1b98058d, 0x80990a97, 0x3962d17f, + 0x281fbb06, 0x91e460ee, 0xc56ca373, 0x7c97789b, 0x6dea12e2, + 0xd411c90a, 0x4f10c610, 0xf6eb1df8, 0xe7967781, 0x5e6dac69, + 0xc642ce25, 0x7fb915cd, 0x6ec47fb4, 0xd73fa45c, 0x4c3eab46, + 0xf5c570ae, 0xe4b81ad7, 0x5d43c13f, 0x09cb02a2, 0xb030d94a, + 0xa14db333, 0x18b668db, 0x83b767c1, 0x3a4cbc29, 0x2b31d650, + 0x92ca0db8, 0x8220516a, 0x3bdb8a82, 0x2aa6e0fb, 0x935d3b13, + 0x085c3409, 0xb1a7efe1, 0xa0da8598, 0x19215e70, 0x4da99ded, + 0xf4524605, 0xe52f2c7c, 0x5cd4f794, 0xc7d5f88e, 0x7e2e2366, + 0x6f53491f, 0xd6a892f7, 0x847c8bc6, 0x3d87502e, 0x2cfa3a57, + 0x9501e1bf, 0x0e00eea5, 0xb7fb354d, 0xa6865f34, 0x1f7d84dc, + 0x4bf54741, 0xf20e9ca9, 0xe373f6d0, 0x5a882d38, 0xc1892222, + 0x7872f9ca, 0x690f93b3, 0xd0f4485b, 0xc01e1489, 0x79e5cf61, + 0x6898a518, 0xd1637ef0, 0x4a6271ea, 0xf399aa02, 0xe2e4c07b, + 0x5b1f1b93, 0x0f97d80e, 0xb66c03e6, 0xa711699f, 0x1eeab277, + 0x85ebbd6d, 0x3c106685, 0x2d6d0cfc, 0x9496d714, 0x0cb9b558, + 0xb5426eb0, 0xa43f04c9, 0x1dc4df21, 0x86c5d03b, 0x3f3e0bd3, + 0x2e4361aa, 0x97b8ba42, 0xc33079df, 0x7acba237, 0x6bb6c84e, + 0xd24d13a6, 0x494c1cbc, 0xf0b7c754, 0xe1caad2d, 0x583176c5, + 0x48db2a17, 0xf120f1ff, 0xe05d9b86, 0x59a6406e, 0xc2a74f74, + 0x7b5c949c, 0x6a21fee5, 0xd3da250d, 0x8752e690, 0x3ea93d78, + 0x2fd45701, 0x962f8ce9, 0x0d2e83f3, 0xb4d5581b, 0xa5a83262, + 0x1c53e98a}, + {0x00000000, 0x9d0fe176, 0xe16ec4ad, 0x7c6125db, 0x19ac8f1b, + 0x84a36e6d, 0xf8c24bb6, 0x65cdaac0, 0x33591e36, 0xae56ff40, + 0xd237da9b, 0x4f383bed, 0x2af5912d, 0xb7fa705b, 0xcb9b5580, + 0x5694b4f6, 0x66b23c6c, 0xfbbddd1a, 0x87dcf8c1, 0x1ad319b7, + 0x7f1eb377, 0xe2115201, 0x9e7077da, 0x037f96ac, 0x55eb225a, + 0xc8e4c32c, 0xb485e6f7, 0x298a0781, 0x4c47ad41, 0xd1484c37, + 0xad2969ec, 0x3026889a, 0xcd6478d8, 0x506b99ae, 0x2c0abc75, + 0xb1055d03, 0xd4c8f7c3, 0x49c716b5, 0x35a6336e, 0xa8a9d218, + 0xfe3d66ee, 0x63328798, 0x1f53a243, 0x825c4335, 0xe791e9f5, + 0x7a9e0883, 0x06ff2d58, 0x9bf0cc2e, 0xabd644b4, 0x36d9a5c2, + 0x4ab88019, 0xd7b7616f, 0xb27acbaf, 0x2f752ad9, 0x53140f02, + 0xce1bee74, 0x988f5a82, 0x0580bbf4, 0x79e19e2f, 0xe4ee7f59, + 0x8123d599, 0x1c2c34ef, 0x604d1134, 0xfd42f042, 0x41b9f7f1, + 0xdcb61687, 0xa0d7335c, 0x3dd8d22a, 0x581578ea, 0xc51a999c, + 0xb97bbc47, 0x24745d31, 0x72e0e9c7, 0xefef08b1, 0x938e2d6a, + 0x0e81cc1c, 0x6b4c66dc, 0xf64387aa, 0x8a22a271, 0x172d4307, + 0x270bcb9d, 0xba042aeb, 0xc6650f30, 0x5b6aee46, 0x3ea74486, + 0xa3a8a5f0, 0xdfc9802b, 0x42c6615d, 0x1452d5ab, 0x895d34dd, + 0xf53c1106, 0x6833f070, 0x0dfe5ab0, 0x90f1bbc6, 0xec909e1d, + 0x719f7f6b, 0x8cdd8f29, 0x11d26e5f, 0x6db34b84, 0xf0bcaaf2, + 0x95710032, 0x087ee144, 0x741fc49f, 0xe91025e9, 0xbf84911f, + 0x228b7069, 0x5eea55b2, 0xc3e5b4c4, 0xa6281e04, 0x3b27ff72, + 0x4746daa9, 0xda493bdf, 0xea6fb345, 0x77605233, 0x0b0177e8, + 0x960e969e, 0xf3c33c5e, 0x6eccdd28, 0x12adf8f3, 0x8fa21985, + 0xd936ad73, 0x44394c05, 0x385869de, 0xa55788a8, 0xc09a2268, + 0x5d95c31e, 0x21f4e6c5, 0xbcfb07b3, 0x8373efe2, 0x1e7c0e94, + 0x621d2b4f, 0xff12ca39, 0x9adf60f9, 0x07d0818f, 0x7bb1a454, + 0xe6be4522, 0xb02af1d4, 0x2d2510a2, 0x51443579, 0xcc4bd40f, + 0xa9867ecf, 0x34899fb9, 0x48e8ba62, 0xd5e75b14, 0xe5c1d38e, + 0x78ce32f8, 0x04af1723, 0x99a0f655, 0xfc6d5c95, 0x6162bde3, + 0x1d039838, 0x800c794e, 0xd698cdb8, 0x4b972cce, 0x37f60915, + 0xaaf9e863, 0xcf3442a3, 0x523ba3d5, 0x2e5a860e, 0xb3556778, + 0x4e17973a, 0xd318764c, 0xaf795397, 0x3276b2e1, 0x57bb1821, + 0xcab4f957, 0xb6d5dc8c, 0x2bda3dfa, 0x7d4e890c, 0xe041687a, + 0x9c204da1, 0x012facd7, 0x64e20617, 0xf9ede761, 0x858cc2ba, + 0x188323cc, 0x28a5ab56, 0xb5aa4a20, 0xc9cb6ffb, 0x54c48e8d, + 0x3109244d, 0xac06c53b, 0xd067e0e0, 0x4d680196, 0x1bfcb560, + 0x86f35416, 0xfa9271cd, 0x679d90bb, 0x02503a7b, 0x9f5fdb0d, + 0xe33efed6, 0x7e311fa0, 0xc2ca1813, 0x5fc5f965, 0x23a4dcbe, + 0xbeab3dc8, 0xdb669708, 0x4669767e, 0x3a0853a5, 0xa707b2d3, + 0xf1930625, 0x6c9ce753, 0x10fdc288, 0x8df223fe, 0xe83f893e, + 0x75306848, 0x09514d93, 0x945eace5, 0xa478247f, 0x3977c509, + 0x4516e0d2, 0xd81901a4, 0xbdd4ab64, 0x20db4a12, 0x5cba6fc9, + 0xc1b58ebf, 0x97213a49, 0x0a2edb3f, 0x764ffee4, 0xeb401f92, + 0x8e8db552, 0x13825424, 0x6fe371ff, 0xf2ec9089, 0x0fae60cb, + 0x92a181bd, 0xeec0a466, 0x73cf4510, 0x1602efd0, 0x8b0d0ea6, + 0xf76c2b7d, 0x6a63ca0b, 0x3cf77efd, 0xa1f89f8b, 0xdd99ba50, + 0x40965b26, 0x255bf1e6, 0xb8541090, 0xc435354b, 0x593ad43d, + 0x691c5ca7, 0xf413bdd1, 0x8872980a, 0x157d797c, 0x70b0d3bc, + 0xedbf32ca, 0x91de1711, 0x0cd1f667, 0x5a454291, 0xc74aa3e7, + 0xbb2b863c, 0x2624674a, 0x43e9cd8a, 0xdee62cfc, 0xa2870927, + 0x3f88e851}, + {0x00000000, 0xdd96d985, 0x605cb54b, 0xbdca6cce, 0xc0b96a96, + 0x1d2fb313, 0xa0e5dfdd, 0x7d730658, 0x5a03d36d, 0x87950ae8, + 0x3a5f6626, 0xe7c9bfa3, 0x9abab9fb, 0x472c607e, 0xfae60cb0, + 0x2770d535, 0xb407a6da, 0x69917f5f, 0xd45b1391, 0x09cdca14, + 0x74becc4c, 0xa92815c9, 0x14e27907, 0xc974a082, 0xee0475b7, + 0x3392ac32, 0x8e58c0fc, 0x53ce1979, 0x2ebd1f21, 0xf32bc6a4, + 0x4ee1aa6a, 0x937773ef, 0xb37e4bf5, 0x6ee89270, 0xd322febe, + 0x0eb4273b, 0x73c72163, 0xae51f8e6, 0x139b9428, 0xce0d4dad, + 0xe97d9898, 0x34eb411d, 0x89212dd3, 0x54b7f456, 0x29c4f20e, + 0xf4522b8b, 0x49984745, 0x940e9ec0, 0x0779ed2f, 0xdaef34aa, + 0x67255864, 0xbab381e1, 0xc7c087b9, 0x1a565e3c, 0xa79c32f2, + 0x7a0aeb77, 0x5d7a3e42, 0x80ece7c7, 0x3d268b09, 0xe0b0528c, + 0x9dc354d4, 0x40558d51, 0xfd9fe19f, 0x2009381a, 0xbd8d91ab, + 0x601b482e, 0xddd124e0, 0x0047fd65, 0x7d34fb3d, 0xa0a222b8, + 0x1d684e76, 0xc0fe97f3, 0xe78e42c6, 0x3a189b43, 0x87d2f78d, + 0x5a442e08, 0x27372850, 0xfaa1f1d5, 0x476b9d1b, 0x9afd449e, + 0x098a3771, 0xd41ceef4, 0x69d6823a, 0xb4405bbf, 0xc9335de7, + 0x14a58462, 0xa96fe8ac, 0x74f93129, 0x5389e41c, 0x8e1f3d99, + 0x33d55157, 0xee4388d2, 0x93308e8a, 0x4ea6570f, 0xf36c3bc1, + 0x2efae244, 0x0ef3da5e, 0xd36503db, 0x6eaf6f15, 0xb339b690, + 0xce4ab0c8, 0x13dc694d, 0xae160583, 0x7380dc06, 0x54f00933, + 0x8966d0b6, 0x34acbc78, 0xe93a65fd, 0x944963a5, 0x49dfba20, + 0xf415d6ee, 0x29830f6b, 0xbaf47c84, 0x6762a501, 0xdaa8c9cf, + 0x073e104a, 0x7a4d1612, 0xa7dbcf97, 0x1a11a359, 0xc7877adc, + 0xe0f7afe9, 0x3d61766c, 0x80ab1aa2, 0x5d3dc327, 0x204ec57f, + 0xfdd81cfa, 0x40127034, 0x9d84a9b1, 0xa06a2517, 0x7dfcfc92, + 0xc036905c, 0x1da049d9, 0x60d34f81, 0xbd459604, 0x008ffaca, + 0xdd19234f, 0xfa69f67a, 0x27ff2fff, 0x9a354331, 0x47a39ab4, + 0x3ad09cec, 0xe7464569, 0x5a8c29a7, 0x871af022, 0x146d83cd, + 0xc9fb5a48, 0x74313686, 0xa9a7ef03, 0xd4d4e95b, 0x094230de, + 0xb4885c10, 0x691e8595, 0x4e6e50a0, 0x93f88925, 0x2e32e5eb, + 0xf3a43c6e, 0x8ed73a36, 0x5341e3b3, 0xee8b8f7d, 0x331d56f8, + 0x13146ee2, 0xce82b767, 0x7348dba9, 0xaede022c, 0xd3ad0474, + 0x0e3bddf1, 0xb3f1b13f, 0x6e6768ba, 0x4917bd8f, 0x9481640a, + 0x294b08c4, 0xf4ddd141, 0x89aed719, 0x54380e9c, 0xe9f26252, + 0x3464bbd7, 0xa713c838, 0x7a8511bd, 0xc74f7d73, 0x1ad9a4f6, + 0x67aaa2ae, 0xba3c7b2b, 0x07f617e5, 0xda60ce60, 0xfd101b55, + 0x2086c2d0, 0x9d4cae1e, 0x40da779b, 0x3da971c3, 0xe03fa846, + 0x5df5c488, 0x80631d0d, 0x1de7b4bc, 0xc0716d39, 0x7dbb01f7, + 0xa02dd872, 0xdd5ede2a, 0x00c807af, 0xbd026b61, 0x6094b2e4, + 0x47e467d1, 0x9a72be54, 0x27b8d29a, 0xfa2e0b1f, 0x875d0d47, + 0x5acbd4c2, 0xe701b80c, 0x3a976189, 0xa9e01266, 0x7476cbe3, + 0xc9bca72d, 0x142a7ea8, 0x695978f0, 0xb4cfa175, 0x0905cdbb, + 0xd493143e, 0xf3e3c10b, 0x2e75188e, 0x93bf7440, 0x4e29adc5, + 0x335aab9d, 0xeecc7218, 0x53061ed6, 0x8e90c753, 0xae99ff49, + 0x730f26cc, 0xcec54a02, 0x13539387, 0x6e2095df, 0xb3b64c5a, + 0x0e7c2094, 0xd3eaf911, 0xf49a2c24, 0x290cf5a1, 0x94c6996f, + 0x495040ea, 0x342346b2, 0xe9b59f37, 0x547ff3f9, 0x89e92a7c, + 0x1a9e5993, 0xc7088016, 0x7ac2ecd8, 0xa754355d, 0xda273305, + 0x07b1ea80, 0xba7b864e, 0x67ed5fcb, 0x409d8afe, 0x9d0b537b, + 0x20c13fb5, 0xfd57e630, 0x8024e068, 0x5db239ed, 0xe0785523, + 0x3dee8ca6}}; + +local const z_word_t FAR crc_braid_big_table[][256] = { + {0x00000000, 0x85d996dd, 0x4bb55c60, 0xce6ccabd, 0x966ab9c0, + 0x13b32f1d, 0xdddfe5a0, 0x5806737d, 0x6dd3035a, 0xe80a9587, + 0x26665f3a, 0xa3bfc9e7, 0xfbb9ba9a, 0x7e602c47, 0xb00ce6fa, + 0x35d57027, 0xdaa607b4, 0x5f7f9169, 0x91135bd4, 0x14cacd09, + 0x4cccbe74, 0xc91528a9, 0x0779e214, 0x82a074c9, 0xb77504ee, + 0x32ac9233, 0xfcc0588e, 0x7919ce53, 0x211fbd2e, 0xa4c62bf3, + 0x6aaae14e, 0xef737793, 0xf54b7eb3, 0x7092e86e, 0xbefe22d3, + 0x3b27b40e, 0x6321c773, 0xe6f851ae, 0x28949b13, 0xad4d0dce, + 0x98987de9, 0x1d41eb34, 0xd32d2189, 0x56f4b754, 0x0ef2c429, + 0x8b2b52f4, 0x45479849, 0xc09e0e94, 0x2fed7907, 0xaa34efda, + 0x64582567, 0xe181b3ba, 0xb987c0c7, 0x3c5e561a, 0xf2329ca7, + 0x77eb0a7a, 0x423e7a5d, 0xc7e7ec80, 0x098b263d, 0x8c52b0e0, + 0xd454c39d, 0x518d5540, 0x9fe19ffd, 0x1a380920, 0xab918dbd, + 0x2e481b60, 0xe024d1dd, 0x65fd4700, 0x3dfb347d, 0xb822a2a0, + 0x764e681d, 0xf397fec0, 0xc6428ee7, 0x439b183a, 0x8df7d287, + 0x082e445a, 0x50283727, 0xd5f1a1fa, 0x1b9d6b47, 0x9e44fd9a, + 0x71378a09, 0xf4ee1cd4, 0x3a82d669, 0xbf5b40b4, 0xe75d33c9, + 0x6284a514, 0xace86fa9, 0x2931f974, 0x1ce48953, 0x993d1f8e, + 0x5751d533, 0xd28843ee, 0x8a8e3093, 0x0f57a64e, 0xc13b6cf3, + 0x44e2fa2e, 0x5edaf30e, 0xdb0365d3, 0x156faf6e, 0x90b639b3, + 0xc8b04ace, 0x4d69dc13, 0x830516ae, 0x06dc8073, 0x3309f054, + 0xb6d06689, 0x78bcac34, 0xfd653ae9, 0xa5634994, 0x20badf49, + 0xeed615f4, 0x6b0f8329, 0x847cf4ba, 0x01a56267, 0xcfc9a8da, + 0x4a103e07, 0x12164d7a, 0x97cfdba7, 0x59a3111a, 0xdc7a87c7, + 0xe9aff7e0, 0x6c76613d, 0xa21aab80, 0x27c33d5d, 0x7fc54e20, + 0xfa1cd8fd, 0x34701240, 0xb1a9849d, 0x17256aa0, 0x92fcfc7d, + 0x5c9036c0, 0xd949a01d, 0x814fd360, 0x049645bd, 0xcafa8f00, + 0x4f2319dd, 0x7af669fa, 0xff2fff27, 0x3143359a, 0xb49aa347, + 0xec9cd03a, 0x694546e7, 0xa7298c5a, 0x22f01a87, 0xcd836d14, + 0x485afbc9, 0x86363174, 0x03efa7a9, 0x5be9d4d4, 0xde304209, + 0x105c88b4, 0x95851e69, 0xa0506e4e, 0x2589f893, 0xebe5322e, + 0x6e3ca4f3, 0x363ad78e, 0xb3e34153, 0x7d8f8bee, 0xf8561d33, + 0xe26e1413, 0x67b782ce, 0xa9db4873, 0x2c02deae, 0x7404add3, + 0xf1dd3b0e, 0x3fb1f1b3, 0xba68676e, 0x8fbd1749, 0x0a648194, + 0xc4084b29, 0x41d1ddf4, 0x19d7ae89, 0x9c0e3854, 0x5262f2e9, + 0xd7bb6434, 0x38c813a7, 0xbd11857a, 0x737d4fc7, 0xf6a4d91a, + 0xaea2aa67, 0x2b7b3cba, 0xe517f607, 0x60ce60da, 0x551b10fd, + 0xd0c28620, 0x1eae4c9d, 0x9b77da40, 0xc371a93d, 0x46a83fe0, + 0x88c4f55d, 0x0d1d6380, 0xbcb4e71d, 0x396d71c0, 0xf701bb7d, + 0x72d82da0, 0x2ade5edd, 0xaf07c800, 0x616b02bd, 0xe4b29460, + 0xd167e447, 0x54be729a, 0x9ad2b827, 0x1f0b2efa, 0x470d5d87, + 0xc2d4cb5a, 0x0cb801e7, 0x8961973a, 0x6612e0a9, 0xe3cb7674, + 0x2da7bcc9, 0xa87e2a14, 0xf0785969, 0x75a1cfb4, 0xbbcd0509, + 0x3e1493d4, 0x0bc1e3f3, 0x8e18752e, 0x4074bf93, 0xc5ad294e, + 0x9dab5a33, 0x1872ccee, 0xd61e0653, 0x53c7908e, 0x49ff99ae, + 0xcc260f73, 0x024ac5ce, 0x87935313, 0xdf95206e, 0x5a4cb6b3, + 0x94207c0e, 0x11f9ead3, 0x242c9af4, 0xa1f50c29, 0x6f99c694, + 0xea405049, 0xb2462334, 0x379fb5e9, 0xf9f37f54, 0x7c2ae989, + 0x93599e1a, 0x168008c7, 0xd8ecc27a, 0x5d3554a7, 0x053327da, + 0x80eab107, 0x4e867bba, 0xcb5fed67, 0xfe8a9d40, 0x7b530b9d, + 0xb53fc120, 0x30e657fd, 0x68e02480, 0xed39b25d, 0x235578e0, + 0xa68cee3d}, + {0x00000000, 0x76e10f9d, 0xadc46ee1, 0xdb25617c, 0x1b8fac19, + 0x6d6ea384, 0xb64bc2f8, 0xc0aacd65, 0x361e5933, 0x40ff56ae, + 0x9bda37d2, 0xed3b384f, 0x2d91f52a, 0x5b70fab7, 0x80559bcb, + 0xf6b49456, 0x6c3cb266, 0x1addbdfb, 0xc1f8dc87, 0xb719d31a, + 0x77b31e7f, 0x015211e2, 0xda77709e, 0xac967f03, 0x5a22eb55, + 0x2cc3e4c8, 0xf7e685b4, 0x81078a29, 0x41ad474c, 0x374c48d1, + 0xec6929ad, 0x9a882630, 0xd87864cd, 0xae996b50, 0x75bc0a2c, + 0x035d05b1, 0xc3f7c8d4, 0xb516c749, 0x6e33a635, 0x18d2a9a8, + 0xee663dfe, 0x98873263, 0x43a2531f, 0x35435c82, 0xf5e991e7, + 0x83089e7a, 0x582dff06, 0x2eccf09b, 0xb444d6ab, 0xc2a5d936, + 0x1980b84a, 0x6f61b7d7, 0xafcb7ab2, 0xd92a752f, 0x020f1453, + 0x74ee1bce, 0x825a8f98, 0xf4bb8005, 0x2f9ee179, 0x597feee4, + 0x99d52381, 0xef342c1c, 0x34114d60, 0x42f042fd, 0xf1f7b941, + 0x8716b6dc, 0x5c33d7a0, 0x2ad2d83d, 0xea781558, 0x9c991ac5, + 0x47bc7bb9, 0x315d7424, 0xc7e9e072, 0xb108efef, 0x6a2d8e93, + 0x1ccc810e, 0xdc664c6b, 0xaa8743f6, 0x71a2228a, 0x07432d17, + 0x9dcb0b27, 0xeb2a04ba, 0x300f65c6, 0x46ee6a5b, 0x8644a73e, + 0xf0a5a8a3, 0x2b80c9df, 0x5d61c642, 0xabd55214, 0xdd345d89, + 0x06113cf5, 0x70f03368, 0xb05afe0d, 0xc6bbf190, 0x1d9e90ec, + 0x6b7f9f71, 0x298fdd8c, 0x5f6ed211, 0x844bb36d, 0xf2aabcf0, + 0x32007195, 0x44e17e08, 0x9fc41f74, 0xe92510e9, 0x1f9184bf, + 0x69708b22, 0xb255ea5e, 0xc4b4e5c3, 0x041e28a6, 0x72ff273b, + 0xa9da4647, 0xdf3b49da, 0x45b36fea, 0x33526077, 0xe877010b, + 0x9e960e96, 0x5e3cc3f3, 0x28ddcc6e, 0xf3f8ad12, 0x8519a28f, + 0x73ad36d9, 0x054c3944, 0xde695838, 0xa88857a5, 0x68229ac0, + 0x1ec3955d, 0xc5e6f421, 0xb307fbbc, 0xe2ef7383, 0x940e7c1e, + 0x4f2b1d62, 0x39ca12ff, 0xf960df9a, 0x8f81d007, 0x54a4b17b, + 0x2245bee6, 0xd4f12ab0, 0xa210252d, 0x79354451, 0x0fd44bcc, + 0xcf7e86a9, 0xb99f8934, 0x62bae848, 0x145be7d5, 0x8ed3c1e5, + 0xf832ce78, 0x2317af04, 0x55f6a099, 0x955c6dfc, 0xe3bd6261, + 0x3898031d, 0x4e790c80, 0xb8cd98d6, 0xce2c974b, 0x1509f637, + 0x63e8f9aa, 0xa34234cf, 0xd5a33b52, 0x0e865a2e, 0x786755b3, + 0x3a97174e, 0x4c7618d3, 0x975379af, 0xe1b27632, 0x2118bb57, + 0x57f9b4ca, 0x8cdcd5b6, 0xfa3dda2b, 0x0c894e7d, 0x7a6841e0, + 0xa14d209c, 0xd7ac2f01, 0x1706e264, 0x61e7edf9, 0xbac28c85, + 0xcc238318, 0x56aba528, 0x204aaab5, 0xfb6fcbc9, 0x8d8ec454, + 0x4d240931, 0x3bc506ac, 0xe0e067d0, 0x9601684d, 0x60b5fc1b, + 0x1654f386, 0xcd7192fa, 0xbb909d67, 0x7b3a5002, 0x0ddb5f9f, + 0xd6fe3ee3, 0xa01f317e, 0x1318cac2, 0x65f9c55f, 0xbedca423, + 0xc83dabbe, 0x089766db, 0x7e766946, 0xa553083a, 0xd3b207a7, + 0x250693f1, 0x53e79c6c, 0x88c2fd10, 0xfe23f28d, 0x3e893fe8, + 0x48683075, 0x934d5109, 0xe5ac5e94, 0x7f2478a4, 0x09c57739, + 0xd2e01645, 0xa40119d8, 0x64abd4bd, 0x124adb20, 0xc96fba5c, + 0xbf8eb5c1, 0x493a2197, 0x3fdb2e0a, 0xe4fe4f76, 0x921f40eb, + 0x52b58d8e, 0x24548213, 0xff71e36f, 0x8990ecf2, 0xcb60ae0f, + 0xbd81a192, 0x66a4c0ee, 0x1045cf73, 0xd0ef0216, 0xa60e0d8b, + 0x7d2b6cf7, 0x0bca636a, 0xfd7ef73c, 0x8b9ff8a1, 0x50ba99dd, + 0x265b9640, 0xe6f15b25, 0x901054b8, 0x4b3535c4, 0x3dd43a59, + 0xa75c1c69, 0xd1bd13f4, 0x0a987288, 0x7c797d15, 0xbcd3b070, + 0xca32bfed, 0x1117de91, 0x67f6d10c, 0x9142455a, 0xe7a34ac7, + 0x3c862bbb, 0x4a672426, 0x8acde943, 0xfc2ce6de, 0x270987a2, + 0x51e8883f}, + {0x00000000, 0xe8dbfbb9, 0x91b186a8, 0x796a7d11, 0x63657c8a, + 0x8bbe8733, 0xf2d4fa22, 0x1a0f019b, 0x87cc89cf, 0x6f177276, + 0x167d0f67, 0xfea6f4de, 0xe4a9f545, 0x0c720efc, 0x751873ed, + 0x9dc38854, 0x4f9f6244, 0xa74499fd, 0xde2ee4ec, 0x36f51f55, + 0x2cfa1ece, 0xc421e577, 0xbd4b9866, 0x559063df, 0xc853eb8b, + 0x20881032, 0x59e26d23, 0xb139969a, 0xab369701, 0x43ed6cb8, + 0x3a8711a9, 0xd25cea10, 0x9e3ec588, 0x76e53e31, 0x0f8f4320, + 0xe754b899, 0xfd5bb902, 0x158042bb, 0x6cea3faa, 0x8431c413, + 0x19f24c47, 0xf129b7fe, 0x8843caef, 0x60983156, 0x7a9730cd, + 0x924ccb74, 0xeb26b665, 0x03fd4ddc, 0xd1a1a7cc, 0x397a5c75, + 0x40102164, 0xa8cbdadd, 0xb2c4db46, 0x5a1f20ff, 0x23755dee, + 0xcbaea657, 0x566d2e03, 0xbeb6d5ba, 0xc7dca8ab, 0x2f075312, + 0x35085289, 0xddd3a930, 0xa4b9d421, 0x4c622f98, 0x7d7bfbca, + 0x95a00073, 0xecca7d62, 0x041186db, 0x1e1e8740, 0xf6c57cf9, + 0x8faf01e8, 0x6774fa51, 0xfab77205, 0x126c89bc, 0x6b06f4ad, + 0x83dd0f14, 0x99d20e8f, 0x7109f536, 0x08638827, 0xe0b8739e, + 0x32e4998e, 0xda3f6237, 0xa3551f26, 0x4b8ee49f, 0x5181e504, + 0xb95a1ebd, 0xc03063ac, 0x28eb9815, 0xb5281041, 0x5df3ebf8, + 0x249996e9, 0xcc426d50, 0xd64d6ccb, 0x3e969772, 0x47fcea63, + 0xaf2711da, 0xe3453e42, 0x0b9ec5fb, 0x72f4b8ea, 0x9a2f4353, + 0x802042c8, 0x68fbb971, 0x1191c460, 0xf94a3fd9, 0x6489b78d, + 0x8c524c34, 0xf5383125, 0x1de3ca9c, 0x07eccb07, 0xef3730be, + 0x965d4daf, 0x7e86b616, 0xacda5c06, 0x4401a7bf, 0x3d6bdaae, + 0xd5b02117, 0xcfbf208c, 0x2764db35, 0x5e0ea624, 0xb6d55d9d, + 0x2b16d5c9, 0xc3cd2e70, 0xbaa75361, 0x527ca8d8, 0x4873a943, + 0xa0a852fa, 0xd9c22feb, 0x3119d452, 0xbbf0874e, 0x532b7cf7, + 0x2a4101e6, 0xc29afa5f, 0xd895fbc4, 0x304e007d, 0x49247d6c, + 0xa1ff86d5, 0x3c3c0e81, 0xd4e7f538, 0xad8d8829, 0x45567390, + 0x5f59720b, 0xb78289b2, 0xcee8f4a3, 0x26330f1a, 0xf46fe50a, + 0x1cb41eb3, 0x65de63a2, 0x8d05981b, 0x970a9980, 0x7fd16239, + 0x06bb1f28, 0xee60e491, 0x73a36cc5, 0x9b78977c, 0xe212ea6d, + 0x0ac911d4, 0x10c6104f, 0xf81debf6, 0x817796e7, 0x69ac6d5e, + 0x25ce42c6, 0xcd15b97f, 0xb47fc46e, 0x5ca43fd7, 0x46ab3e4c, + 0xae70c5f5, 0xd71ab8e4, 0x3fc1435d, 0xa202cb09, 0x4ad930b0, + 0x33b34da1, 0xdb68b618, 0xc167b783, 0x29bc4c3a, 0x50d6312b, + 0xb80dca92, 0x6a512082, 0x828adb3b, 0xfbe0a62a, 0x133b5d93, + 0x09345c08, 0xe1efa7b1, 0x9885daa0, 0x705e2119, 0xed9da94d, + 0x054652f4, 0x7c2c2fe5, 0x94f7d45c, 0x8ef8d5c7, 0x66232e7e, + 0x1f49536f, 0xf792a8d6, 0xc68b7c84, 0x2e50873d, 0x573afa2c, + 0xbfe10195, 0xa5ee000e, 0x4d35fbb7, 0x345f86a6, 0xdc847d1f, + 0x4147f54b, 0xa99c0ef2, 0xd0f673e3, 0x382d885a, 0x222289c1, + 0xcaf97278, 0xb3930f69, 0x5b48f4d0, 0x89141ec0, 0x61cfe579, + 0x18a59868, 0xf07e63d1, 0xea71624a, 0x02aa99f3, 0x7bc0e4e2, + 0x931b1f5b, 0x0ed8970f, 0xe6036cb6, 0x9f6911a7, 0x77b2ea1e, + 0x6dbdeb85, 0x8566103c, 0xfc0c6d2d, 0x14d79694, 0x58b5b90c, + 0xb06e42b5, 0xc9043fa4, 0x21dfc41d, 0x3bd0c586, 0xd30b3e3f, + 0xaa61432e, 0x42bab897, 0xdf7930c3, 0x37a2cb7a, 0x4ec8b66b, + 0xa6134dd2, 0xbc1c4c49, 0x54c7b7f0, 0x2dadcae1, 0xc5763158, + 0x172adb48, 0xfff120f1, 0x869b5de0, 0x6e40a659, 0x744fa7c2, + 0x9c945c7b, 0xe5fe216a, 0x0d25dad3, 0x90e65287, 0x783da93e, + 0x0157d42f, 0xe98c2f96, 0xf3832e0d, 0x1b58d5b4, 0x6232a8a5, + 0x8ae9531c}, + {0x00000000, 0x919168ae, 0x6325a087, 0xf2b4c829, 0x874c31d4, + 0x16dd597a, 0xe4699153, 0x75f8f9fd, 0x4f9f1373, 0xde0e7bdd, + 0x2cbab3f4, 0xbd2bdb5a, 0xc8d322a7, 0x59424a09, 0xabf68220, + 0x3a67ea8e, 0x9e3e27e6, 0x0faf4f48, 0xfd1b8761, 0x6c8aefcf, + 0x19721632, 0x88e37e9c, 0x7a57b6b5, 0xebc6de1b, 0xd1a13495, + 0x40305c3b, 0xb2849412, 0x2315fcbc, 0x56ed0541, 0xc77c6def, + 0x35c8a5c6, 0xa459cd68, 0x7d7b3f17, 0xecea57b9, 0x1e5e9f90, + 0x8fcff73e, 0xfa370ec3, 0x6ba6666d, 0x9912ae44, 0x0883c6ea, + 0x32e42c64, 0xa37544ca, 0x51c18ce3, 0xc050e44d, 0xb5a81db0, + 0x2439751e, 0xd68dbd37, 0x471cd599, 0xe34518f1, 0x72d4705f, + 0x8060b876, 0x11f1d0d8, 0x64092925, 0xf598418b, 0x072c89a2, + 0x96bde10c, 0xacda0b82, 0x3d4b632c, 0xcfffab05, 0x5e6ec3ab, + 0x2b963a56, 0xba0752f8, 0x48b39ad1, 0xd922f27f, 0xfaf67e2e, + 0x6b671680, 0x99d3dea9, 0x0842b607, 0x7dba4ffa, 0xec2b2754, + 0x1e9fef7d, 0x8f0e87d3, 0xb5696d5d, 0x24f805f3, 0xd64ccdda, + 0x47dda574, 0x32255c89, 0xa3b43427, 0x5100fc0e, 0xc09194a0, + 0x64c859c8, 0xf5593166, 0x07edf94f, 0x967c91e1, 0xe384681c, + 0x721500b2, 0x80a1c89b, 0x1130a035, 0x2b574abb, 0xbac62215, + 0x4872ea3c, 0xd9e38292, 0xac1b7b6f, 0x3d8a13c1, 0xcf3edbe8, + 0x5eafb346, 0x878d4139, 0x161c2997, 0xe4a8e1be, 0x75398910, + 0x00c170ed, 0x91501843, 0x63e4d06a, 0xf275b8c4, 0xc812524a, + 0x59833ae4, 0xab37f2cd, 0x3aa69a63, 0x4f5e639e, 0xdecf0b30, + 0x2c7bc319, 0xbdeaabb7, 0x19b366df, 0x88220e71, 0x7a96c658, + 0xeb07aef6, 0x9eff570b, 0x0f6e3fa5, 0xfddaf78c, 0x6c4b9f22, + 0x562c75ac, 0xc7bd1d02, 0x3509d52b, 0xa498bd85, 0xd1604478, + 0x40f12cd6, 0xb245e4ff, 0x23d48c51, 0xf4edfd5c, 0x657c95f2, + 0x97c85ddb, 0x06593575, 0x73a1cc88, 0xe230a426, 0x10846c0f, + 0x811504a1, 0xbb72ee2f, 0x2ae38681, 0xd8574ea8, 0x49c62606, + 0x3c3edffb, 0xadafb755, 0x5f1b7f7c, 0xce8a17d2, 0x6ad3daba, + 0xfb42b214, 0x09f67a3d, 0x98671293, 0xed9feb6e, 0x7c0e83c0, + 0x8eba4be9, 0x1f2b2347, 0x254cc9c9, 0xb4dda167, 0x4669694e, + 0xd7f801e0, 0xa200f81d, 0x339190b3, 0xc125589a, 0x50b43034, + 0x8996c24b, 0x1807aae5, 0xeab362cc, 0x7b220a62, 0x0edaf39f, + 0x9f4b9b31, 0x6dff5318, 0xfc6e3bb6, 0xc609d138, 0x5798b996, + 0xa52c71bf, 0x34bd1911, 0x4145e0ec, 0xd0d48842, 0x2260406b, + 0xb3f128c5, 0x17a8e5ad, 0x86398d03, 0x748d452a, 0xe51c2d84, + 0x90e4d479, 0x0175bcd7, 0xf3c174fe, 0x62501c50, 0x5837f6de, + 0xc9a69e70, 0x3b125659, 0xaa833ef7, 0xdf7bc70a, 0x4eeaafa4, + 0xbc5e678d, 0x2dcf0f23, 0x0e1b8372, 0x9f8aebdc, 0x6d3e23f5, + 0xfcaf4b5b, 0x8957b2a6, 0x18c6da08, 0xea721221, 0x7be37a8f, + 0x41849001, 0xd015f8af, 0x22a13086, 0xb3305828, 0xc6c8a1d5, + 0x5759c97b, 0xa5ed0152, 0x347c69fc, 0x9025a494, 0x01b4cc3a, + 0xf3000413, 0x62916cbd, 0x17699540, 0x86f8fdee, 0x744c35c7, + 0xe5dd5d69, 0xdfbab7e7, 0x4e2bdf49, 0xbc9f1760, 0x2d0e7fce, + 0x58f68633, 0xc967ee9d, 0x3bd326b4, 0xaa424e1a, 0x7360bc65, + 0xe2f1d4cb, 0x10451ce2, 0x81d4744c, 0xf42c8db1, 0x65bde51f, + 0x97092d36, 0x06984598, 0x3cffaf16, 0xad6ec7b8, 0x5fda0f91, + 0xce4b673f, 0xbbb39ec2, 0x2a22f66c, 0xd8963e45, 0x490756eb, + 0xed5e9b83, 0x7ccff32d, 0x8e7b3b04, 0x1fea53aa, 0x6a12aa57, + 0xfb83c2f9, 0x09370ad0, 0x98a6627e, 0xa2c188f0, 0x3350e05e, + 0xc1e42877, 0x507540d9, 0x258db924, 0xb41cd18a, 0x46a819a3, + 0xd739710d}}; + +#endif + +#endif + +#if N == 5 + +#if W == 8 + +local const z_crc_t FAR crc_braid_table[][256] = { + {0x00000000, 0xaf449247, 0x85f822cf, 0x2abcb088, 0xd08143df, + 0x7fc5d198, 0x55796110, 0xfa3df357, 0x7a7381ff, 0xd53713b8, + 0xff8ba330, 0x50cf3177, 0xaaf2c220, 0x05b65067, 0x2f0ae0ef, + 0x804e72a8, 0xf4e703fe, 0x5ba391b9, 0x711f2131, 0xde5bb376, + 0x24664021, 0x8b22d266, 0xa19e62ee, 0x0edaf0a9, 0x8e948201, + 0x21d01046, 0x0b6ca0ce, 0xa4283289, 0x5e15c1de, 0xf1515399, + 0xdbede311, 0x74a97156, 0x32bf01bd, 0x9dfb93fa, 0xb7472372, + 0x1803b135, 0xe23e4262, 0x4d7ad025, 0x67c660ad, 0xc882f2ea, + 0x48cc8042, 0xe7881205, 0xcd34a28d, 0x627030ca, 0x984dc39d, + 0x370951da, 0x1db5e152, 0xb2f17315, 0xc6580243, 0x691c9004, + 0x43a0208c, 0xece4b2cb, 0x16d9419c, 0xb99dd3db, 0x93216353, + 0x3c65f114, 0xbc2b83bc, 0x136f11fb, 0x39d3a173, 0x96973334, + 0x6caac063, 0xc3ee5224, 0xe952e2ac, 0x461670eb, 0x657e037a, + 0xca3a913d, 0xe08621b5, 0x4fc2b3f2, 0xb5ff40a5, 0x1abbd2e2, + 0x3007626a, 0x9f43f02d, 0x1f0d8285, 0xb04910c2, 0x9af5a04a, + 0x35b1320d, 0xcf8cc15a, 0x60c8531d, 0x4a74e395, 0xe53071d2, + 0x91990084, 0x3edd92c3, 0x1461224b, 0xbb25b00c, 0x4118435b, + 0xee5cd11c, 0xc4e06194, 0x6ba4f3d3, 0xebea817b, 0x44ae133c, + 0x6e12a3b4, 0xc15631f3, 0x3b6bc2a4, 0x942f50e3, 0xbe93e06b, + 0x11d7722c, 0x57c102c7, 0xf8859080, 0xd2392008, 0x7d7db24f, + 0x87404118, 0x2804d35f, 0x02b863d7, 0xadfcf190, 0x2db28338, + 0x82f6117f, 0xa84aa1f7, 0x070e33b0, 0xfd33c0e7, 0x527752a0, + 0x78cbe228, 0xd78f706f, 0xa3260139, 0x0c62937e, 0x26de23f6, + 0x899ab1b1, 0x73a742e6, 0xdce3d0a1, 0xf65f6029, 0x591bf26e, + 0xd95580c6, 0x76111281, 0x5cada209, 0xf3e9304e, 0x09d4c319, + 0xa690515e, 0x8c2ce1d6, 0x23687391, 0xcafc06f4, 0x65b894b3, + 0x4f04243b, 0xe040b67c, 0x1a7d452b, 0xb539d76c, 0x9f8567e4, + 0x30c1f5a3, 0xb08f870b, 0x1fcb154c, 0x3577a5c4, 0x9a333783, + 0x600ec4d4, 0xcf4a5693, 0xe5f6e61b, 0x4ab2745c, 0x3e1b050a, + 0x915f974d, 0xbbe327c5, 0x14a7b582, 0xee9a46d5, 0x41ded492, + 0x6b62641a, 0xc426f65d, 0x446884f5, 0xeb2c16b2, 0xc190a63a, + 0x6ed4347d, 0x94e9c72a, 0x3bad556d, 0x1111e5e5, 0xbe5577a2, + 0xf8430749, 0x5707950e, 0x7dbb2586, 0xd2ffb7c1, 0x28c24496, + 0x8786d6d1, 0xad3a6659, 0x027ef41e, 0x823086b6, 0x2d7414f1, + 0x07c8a479, 0xa88c363e, 0x52b1c569, 0xfdf5572e, 0xd749e7a6, + 0x780d75e1, 0x0ca404b7, 0xa3e096f0, 0x895c2678, 0x2618b43f, + 0xdc254768, 0x7361d52f, 0x59dd65a7, 0xf699f7e0, 0x76d78548, + 0xd993170f, 0xf32fa787, 0x5c6b35c0, 0xa656c697, 0x091254d0, + 0x23aee458, 0x8cea761f, 0xaf82058e, 0x00c697c9, 0x2a7a2741, + 0x853eb506, 0x7f034651, 0xd047d416, 0xfafb649e, 0x55bff6d9, + 0xd5f18471, 0x7ab51636, 0x5009a6be, 0xff4d34f9, 0x0570c7ae, + 0xaa3455e9, 0x8088e561, 0x2fcc7726, 0x5b650670, 0xf4219437, + 0xde9d24bf, 0x71d9b6f8, 0x8be445af, 0x24a0d7e8, 0x0e1c6760, + 0xa158f527, 0x2116878f, 0x8e5215c8, 0xa4eea540, 0x0baa3707, + 0xf197c450, 0x5ed35617, 0x746fe69f, 0xdb2b74d8, 0x9d3d0433, + 0x32799674, 0x18c526fc, 0xb781b4bb, 0x4dbc47ec, 0xe2f8d5ab, + 0xc8446523, 0x6700f764, 0xe74e85cc, 0x480a178b, 0x62b6a703, + 0xcdf23544, 0x37cfc613, 0x988b5454, 0xb237e4dc, 0x1d73769b, + 0x69da07cd, 0xc69e958a, 0xec222502, 0x4366b745, 0xb95b4412, + 0x161fd655, 0x3ca366dd, 0x93e7f49a, 0x13a98632, 0xbced1475, + 0x9651a4fd, 0x391536ba, 0xc328c5ed, 0x6c6c57aa, 0x46d0e722, + 0xe9947565}, + {0x00000000, 0x4e890ba9, 0x9d121752, 0xd39b1cfb, 0xe15528e5, + 0xafdc234c, 0x7c473fb7, 0x32ce341e, 0x19db578b, 0x57525c22, + 0x84c940d9, 0xca404b70, 0xf88e7f6e, 0xb60774c7, 0x659c683c, + 0x2b156395, 0x33b6af16, 0x7d3fa4bf, 0xaea4b844, 0xe02db3ed, + 0xd2e387f3, 0x9c6a8c5a, 0x4ff190a1, 0x01789b08, 0x2a6df89d, + 0x64e4f334, 0xb77fefcf, 0xf9f6e466, 0xcb38d078, 0x85b1dbd1, + 0x562ac72a, 0x18a3cc83, 0x676d5e2c, 0x29e45585, 0xfa7f497e, + 0xb4f642d7, 0x863876c9, 0xc8b17d60, 0x1b2a619b, 0x55a36a32, + 0x7eb609a7, 0x303f020e, 0xe3a41ef5, 0xad2d155c, 0x9fe32142, + 0xd16a2aeb, 0x02f13610, 0x4c783db9, 0x54dbf13a, 0x1a52fa93, + 0xc9c9e668, 0x8740edc1, 0xb58ed9df, 0xfb07d276, 0x289cce8d, + 0x6615c524, 0x4d00a6b1, 0x0389ad18, 0xd012b1e3, 0x9e9bba4a, + 0xac558e54, 0xe2dc85fd, 0x31479906, 0x7fce92af, 0xcedabc58, + 0x8053b7f1, 0x53c8ab0a, 0x1d41a0a3, 0x2f8f94bd, 0x61069f14, + 0xb29d83ef, 0xfc148846, 0xd701ebd3, 0x9988e07a, 0x4a13fc81, + 0x049af728, 0x3654c336, 0x78ddc89f, 0xab46d464, 0xe5cfdfcd, + 0xfd6c134e, 0xb3e518e7, 0x607e041c, 0x2ef70fb5, 0x1c393bab, + 0x52b03002, 0x812b2cf9, 0xcfa22750, 0xe4b744c5, 0xaa3e4f6c, + 0x79a55397, 0x372c583e, 0x05e26c20, 0x4b6b6789, 0x98f07b72, + 0xd67970db, 0xa9b7e274, 0xe73ee9dd, 0x34a5f526, 0x7a2cfe8f, + 0x48e2ca91, 0x066bc138, 0xd5f0ddc3, 0x9b79d66a, 0xb06cb5ff, + 0xfee5be56, 0x2d7ea2ad, 0x63f7a904, 0x51399d1a, 0x1fb096b3, + 0xcc2b8a48, 0x82a281e1, 0x9a014d62, 0xd48846cb, 0x07135a30, + 0x499a5199, 0x7b546587, 0x35dd6e2e, 0xe64672d5, 0xa8cf797c, + 0x83da1ae9, 0xcd531140, 0x1ec80dbb, 0x50410612, 0x628f320c, + 0x2c0639a5, 0xff9d255e, 0xb1142ef7, 0x46c47ef1, 0x084d7558, + 0xdbd669a3, 0x955f620a, 0xa7915614, 0xe9185dbd, 0x3a834146, + 0x740a4aef, 0x5f1f297a, 0x119622d3, 0xc20d3e28, 0x8c843581, + 0xbe4a019f, 0xf0c30a36, 0x235816cd, 0x6dd11d64, 0x7572d1e7, + 0x3bfbda4e, 0xe860c6b5, 0xa6e9cd1c, 0x9427f902, 0xdaaef2ab, + 0x0935ee50, 0x47bce5f9, 0x6ca9866c, 0x22208dc5, 0xf1bb913e, + 0xbf329a97, 0x8dfcae89, 0xc375a520, 0x10eeb9db, 0x5e67b272, + 0x21a920dd, 0x6f202b74, 0xbcbb378f, 0xf2323c26, 0xc0fc0838, + 0x8e750391, 0x5dee1f6a, 0x136714c3, 0x38727756, 0x76fb7cff, + 0xa5606004, 0xebe96bad, 0xd9275fb3, 0x97ae541a, 0x443548e1, + 0x0abc4348, 0x121f8fcb, 0x5c968462, 0x8f0d9899, 0xc1849330, + 0xf34aa72e, 0xbdc3ac87, 0x6e58b07c, 0x20d1bbd5, 0x0bc4d840, + 0x454dd3e9, 0x96d6cf12, 0xd85fc4bb, 0xea91f0a5, 0xa418fb0c, + 0x7783e7f7, 0x390aec5e, 0x881ec2a9, 0xc697c900, 0x150cd5fb, + 0x5b85de52, 0x694bea4c, 0x27c2e1e5, 0xf459fd1e, 0xbad0f6b7, + 0x91c59522, 0xdf4c9e8b, 0x0cd78270, 0x425e89d9, 0x7090bdc7, + 0x3e19b66e, 0xed82aa95, 0xa30ba13c, 0xbba86dbf, 0xf5216616, + 0x26ba7aed, 0x68337144, 0x5afd455a, 0x14744ef3, 0xc7ef5208, + 0x896659a1, 0xa2733a34, 0xecfa319d, 0x3f612d66, 0x71e826cf, + 0x432612d1, 0x0daf1978, 0xde340583, 0x90bd0e2a, 0xef739c85, + 0xa1fa972c, 0x72618bd7, 0x3ce8807e, 0x0e26b460, 0x40afbfc9, + 0x9334a332, 0xddbda89b, 0xf6a8cb0e, 0xb821c0a7, 0x6bbadc5c, + 0x2533d7f5, 0x17fde3eb, 0x5974e842, 0x8aeff4b9, 0xc466ff10, + 0xdcc53393, 0x924c383a, 0x41d724c1, 0x0f5e2f68, 0x3d901b76, + 0x731910df, 0xa0820c24, 0xee0b078d, 0xc51e6418, 0x8b976fb1, + 0x580c734a, 0x168578e3, 0x244b4cfd, 0x6ac24754, 0xb9595baf, + 0xf7d05006}, + {0x00000000, 0x8d88fde2, 0xc060fd85, 0x4de80067, 0x5bb0fd4b, + 0xd63800a9, 0x9bd000ce, 0x1658fd2c, 0xb761fa96, 0x3ae90774, + 0x77010713, 0xfa89faf1, 0xecd107dd, 0x6159fa3f, 0x2cb1fa58, + 0xa13907ba, 0xb5b2f36d, 0x383a0e8f, 0x75d20ee8, 0xf85af30a, + 0xee020e26, 0x638af3c4, 0x2e62f3a3, 0xa3ea0e41, 0x02d309fb, + 0x8f5bf419, 0xc2b3f47e, 0x4f3b099c, 0x5963f4b0, 0xd4eb0952, + 0x99030935, 0x148bf4d7, 0xb014e09b, 0x3d9c1d79, 0x70741d1e, + 0xfdfce0fc, 0xeba41dd0, 0x662ce032, 0x2bc4e055, 0xa64c1db7, + 0x07751a0d, 0x8afde7ef, 0xc715e788, 0x4a9d1a6a, 0x5cc5e746, + 0xd14d1aa4, 0x9ca51ac3, 0x112de721, 0x05a613f6, 0x882eee14, + 0xc5c6ee73, 0x484e1391, 0x5e16eebd, 0xd39e135f, 0x9e761338, + 0x13feeeda, 0xb2c7e960, 0x3f4f1482, 0x72a714e5, 0xff2fe907, + 0xe977142b, 0x64ffe9c9, 0x2917e9ae, 0xa49f144c, 0xbb58c777, + 0x36d03a95, 0x7b383af2, 0xf6b0c710, 0xe0e83a3c, 0x6d60c7de, + 0x2088c7b9, 0xad003a5b, 0x0c393de1, 0x81b1c003, 0xcc59c064, + 0x41d13d86, 0x5789c0aa, 0xda013d48, 0x97e93d2f, 0x1a61c0cd, + 0x0eea341a, 0x8362c9f8, 0xce8ac99f, 0x4302347d, 0x555ac951, + 0xd8d234b3, 0x953a34d4, 0x18b2c936, 0xb98bce8c, 0x3403336e, + 0x79eb3309, 0xf463ceeb, 0xe23b33c7, 0x6fb3ce25, 0x225bce42, + 0xafd333a0, 0x0b4c27ec, 0x86c4da0e, 0xcb2cda69, 0x46a4278b, + 0x50fcdaa7, 0xdd742745, 0x909c2722, 0x1d14dac0, 0xbc2ddd7a, + 0x31a52098, 0x7c4d20ff, 0xf1c5dd1d, 0xe79d2031, 0x6a15ddd3, + 0x27fdddb4, 0xaa752056, 0xbefed481, 0x33762963, 0x7e9e2904, + 0xf316d4e6, 0xe54e29ca, 0x68c6d428, 0x252ed44f, 0xa8a629ad, + 0x099f2e17, 0x8417d3f5, 0xc9ffd392, 0x44772e70, 0x522fd35c, + 0xdfa72ebe, 0x924f2ed9, 0x1fc7d33b, 0xadc088af, 0x2048754d, + 0x6da0752a, 0xe02888c8, 0xf67075e4, 0x7bf88806, 0x36108861, + 0xbb987583, 0x1aa17239, 0x97298fdb, 0xdac18fbc, 0x5749725e, + 0x41118f72, 0xcc997290, 0x817172f7, 0x0cf98f15, 0x18727bc2, + 0x95fa8620, 0xd8128647, 0x559a7ba5, 0x43c28689, 0xce4a7b6b, + 0x83a27b0c, 0x0e2a86ee, 0xaf138154, 0x229b7cb6, 0x6f737cd1, + 0xe2fb8133, 0xf4a37c1f, 0x792b81fd, 0x34c3819a, 0xb94b7c78, + 0x1dd46834, 0x905c95d6, 0xddb495b1, 0x503c6853, 0x4664957f, + 0xcbec689d, 0x860468fa, 0x0b8c9518, 0xaab592a2, 0x273d6f40, + 0x6ad56f27, 0xe75d92c5, 0xf1056fe9, 0x7c8d920b, 0x3165926c, + 0xbced6f8e, 0xa8669b59, 0x25ee66bb, 0x680666dc, 0xe58e9b3e, + 0xf3d66612, 0x7e5e9bf0, 0x33b69b97, 0xbe3e6675, 0x1f0761cf, + 0x928f9c2d, 0xdf679c4a, 0x52ef61a8, 0x44b79c84, 0xc93f6166, + 0x84d76101, 0x095f9ce3, 0x16984fd8, 0x9b10b23a, 0xd6f8b25d, + 0x5b704fbf, 0x4d28b293, 0xc0a04f71, 0x8d484f16, 0x00c0b2f4, + 0xa1f9b54e, 0x2c7148ac, 0x619948cb, 0xec11b529, 0xfa494805, + 0x77c1b5e7, 0x3a29b580, 0xb7a14862, 0xa32abcb5, 0x2ea24157, + 0x634a4130, 0xeec2bcd2, 0xf89a41fe, 0x7512bc1c, 0x38fabc7b, + 0xb5724199, 0x144b4623, 0x99c3bbc1, 0xd42bbba6, 0x59a34644, + 0x4ffbbb68, 0xc273468a, 0x8f9b46ed, 0x0213bb0f, 0xa68caf43, + 0x2b0452a1, 0x66ec52c6, 0xeb64af24, 0xfd3c5208, 0x70b4afea, + 0x3d5caf8d, 0xb0d4526f, 0x11ed55d5, 0x9c65a837, 0xd18da850, + 0x5c0555b2, 0x4a5da89e, 0xc7d5557c, 0x8a3d551b, 0x07b5a8f9, + 0x133e5c2e, 0x9eb6a1cc, 0xd35ea1ab, 0x5ed65c49, 0x488ea165, + 0xc5065c87, 0x88ee5ce0, 0x0566a102, 0xa45fa6b8, 0x29d75b5a, + 0x643f5b3d, 0xe9b7a6df, 0xffef5bf3, 0x7267a611, 0x3f8fa676, + 0xb2075b94}, + {0x00000000, 0x80f0171f, 0xda91287f, 0x5a613f60, 0x6e5356bf, + 0xeea341a0, 0xb4c27ec0, 0x343269df, 0xdca6ad7e, 0x5c56ba61, + 0x06378501, 0x86c7921e, 0xb2f5fbc1, 0x3205ecde, 0x6864d3be, + 0xe894c4a1, 0x623c5cbd, 0xe2cc4ba2, 0xb8ad74c2, 0x385d63dd, + 0x0c6f0a02, 0x8c9f1d1d, 0xd6fe227d, 0x560e3562, 0xbe9af1c3, + 0x3e6ae6dc, 0x640bd9bc, 0xe4fbcea3, 0xd0c9a77c, 0x5039b063, + 0x0a588f03, 0x8aa8981c, 0xc478b97a, 0x4488ae65, 0x1ee99105, + 0x9e19861a, 0xaa2befc5, 0x2adbf8da, 0x70bac7ba, 0xf04ad0a5, + 0x18de1404, 0x982e031b, 0xc24f3c7b, 0x42bf2b64, 0x768d42bb, + 0xf67d55a4, 0xac1c6ac4, 0x2cec7ddb, 0xa644e5c7, 0x26b4f2d8, + 0x7cd5cdb8, 0xfc25daa7, 0xc817b378, 0x48e7a467, 0x12869b07, + 0x92768c18, 0x7ae248b9, 0xfa125fa6, 0xa07360c6, 0x208377d9, + 0x14b11e06, 0x94410919, 0xce203679, 0x4ed02166, 0x538074b5, + 0xd37063aa, 0x89115cca, 0x09e14bd5, 0x3dd3220a, 0xbd233515, + 0xe7420a75, 0x67b21d6a, 0x8f26d9cb, 0x0fd6ced4, 0x55b7f1b4, + 0xd547e6ab, 0xe1758f74, 0x6185986b, 0x3be4a70b, 0xbb14b014, + 0x31bc2808, 0xb14c3f17, 0xeb2d0077, 0x6bdd1768, 0x5fef7eb7, + 0xdf1f69a8, 0x857e56c8, 0x058e41d7, 0xed1a8576, 0x6dea9269, + 0x378bad09, 0xb77bba16, 0x8349d3c9, 0x03b9c4d6, 0x59d8fbb6, + 0xd928eca9, 0x97f8cdcf, 0x1708dad0, 0x4d69e5b0, 0xcd99f2af, + 0xf9ab9b70, 0x795b8c6f, 0x233ab30f, 0xa3caa410, 0x4b5e60b1, + 0xcbae77ae, 0x91cf48ce, 0x113f5fd1, 0x250d360e, 0xa5fd2111, + 0xff9c1e71, 0x7f6c096e, 0xf5c49172, 0x7534866d, 0x2f55b90d, + 0xafa5ae12, 0x9b97c7cd, 0x1b67d0d2, 0x4106efb2, 0xc1f6f8ad, + 0x29623c0c, 0xa9922b13, 0xf3f31473, 0x7303036c, 0x47316ab3, + 0xc7c17dac, 0x9da042cc, 0x1d5055d3, 0xa700e96a, 0x27f0fe75, + 0x7d91c115, 0xfd61d60a, 0xc953bfd5, 0x49a3a8ca, 0x13c297aa, + 0x933280b5, 0x7ba64414, 0xfb56530b, 0xa1376c6b, 0x21c77b74, + 0x15f512ab, 0x950505b4, 0xcf643ad4, 0x4f942dcb, 0xc53cb5d7, + 0x45cca2c8, 0x1fad9da8, 0x9f5d8ab7, 0xab6fe368, 0x2b9ff477, + 0x71fecb17, 0xf10edc08, 0x199a18a9, 0x996a0fb6, 0xc30b30d6, + 0x43fb27c9, 0x77c94e16, 0xf7395909, 0xad586669, 0x2da87176, + 0x63785010, 0xe388470f, 0xb9e9786f, 0x39196f70, 0x0d2b06af, + 0x8ddb11b0, 0xd7ba2ed0, 0x574a39cf, 0xbfdefd6e, 0x3f2eea71, + 0x654fd511, 0xe5bfc20e, 0xd18dabd1, 0x517dbcce, 0x0b1c83ae, + 0x8bec94b1, 0x01440cad, 0x81b41bb2, 0xdbd524d2, 0x5b2533cd, + 0x6f175a12, 0xefe74d0d, 0xb586726d, 0x35766572, 0xdde2a1d3, + 0x5d12b6cc, 0x077389ac, 0x87839eb3, 0xb3b1f76c, 0x3341e073, + 0x6920df13, 0xe9d0c80c, 0xf4809ddf, 0x74708ac0, 0x2e11b5a0, + 0xaee1a2bf, 0x9ad3cb60, 0x1a23dc7f, 0x4042e31f, 0xc0b2f400, + 0x282630a1, 0xa8d627be, 0xf2b718de, 0x72470fc1, 0x4675661e, + 0xc6857101, 0x9ce44e61, 0x1c14597e, 0x96bcc162, 0x164cd67d, + 0x4c2de91d, 0xccddfe02, 0xf8ef97dd, 0x781f80c2, 0x227ebfa2, + 0xa28ea8bd, 0x4a1a6c1c, 0xcaea7b03, 0x908b4463, 0x107b537c, + 0x24493aa3, 0xa4b92dbc, 0xfed812dc, 0x7e2805c3, 0x30f824a5, + 0xb00833ba, 0xea690cda, 0x6a991bc5, 0x5eab721a, 0xde5b6505, + 0x843a5a65, 0x04ca4d7a, 0xec5e89db, 0x6cae9ec4, 0x36cfa1a4, + 0xb63fb6bb, 0x820ddf64, 0x02fdc87b, 0x589cf71b, 0xd86ce004, + 0x52c47818, 0xd2346f07, 0x88555067, 0x08a54778, 0x3c972ea7, + 0xbc6739b8, 0xe60606d8, 0x66f611c7, 0x8e62d566, 0x0e92c279, + 0x54f3fd19, 0xd403ea06, 0xe03183d9, 0x60c194c6, 0x3aa0aba6, + 0xba50bcb9}, + {0x00000000, 0x9570d495, 0xf190af6b, 0x64e07bfe, 0x38505897, + 0xad208c02, 0xc9c0f7fc, 0x5cb02369, 0x70a0b12e, 0xe5d065bb, + 0x81301e45, 0x1440cad0, 0x48f0e9b9, 0xdd803d2c, 0xb96046d2, + 0x2c109247, 0xe141625c, 0x7431b6c9, 0x10d1cd37, 0x85a119a2, + 0xd9113acb, 0x4c61ee5e, 0x288195a0, 0xbdf14135, 0x91e1d372, + 0x049107e7, 0x60717c19, 0xf501a88c, 0xa9b18be5, 0x3cc15f70, + 0x5821248e, 0xcd51f01b, 0x19f3c2f9, 0x8c83166c, 0xe8636d92, + 0x7d13b907, 0x21a39a6e, 0xb4d34efb, 0xd0333505, 0x4543e190, + 0x695373d7, 0xfc23a742, 0x98c3dcbc, 0x0db30829, 0x51032b40, + 0xc473ffd5, 0xa093842b, 0x35e350be, 0xf8b2a0a5, 0x6dc27430, + 0x09220fce, 0x9c52db5b, 0xc0e2f832, 0x55922ca7, 0x31725759, + 0xa40283cc, 0x8812118b, 0x1d62c51e, 0x7982bee0, 0xecf26a75, + 0xb042491c, 0x25329d89, 0x41d2e677, 0xd4a232e2, 0x33e785f2, + 0xa6975167, 0xc2772a99, 0x5707fe0c, 0x0bb7dd65, 0x9ec709f0, + 0xfa27720e, 0x6f57a69b, 0x434734dc, 0xd637e049, 0xb2d79bb7, + 0x27a74f22, 0x7b176c4b, 0xee67b8de, 0x8a87c320, 0x1ff717b5, + 0xd2a6e7ae, 0x47d6333b, 0x233648c5, 0xb6469c50, 0xeaf6bf39, + 0x7f866bac, 0x1b661052, 0x8e16c4c7, 0xa2065680, 0x37768215, + 0x5396f9eb, 0xc6e62d7e, 0x9a560e17, 0x0f26da82, 0x6bc6a17c, + 0xfeb675e9, 0x2a14470b, 0xbf64939e, 0xdb84e860, 0x4ef43cf5, + 0x12441f9c, 0x8734cb09, 0xe3d4b0f7, 0x76a46462, 0x5ab4f625, + 0xcfc422b0, 0xab24594e, 0x3e548ddb, 0x62e4aeb2, 0xf7947a27, + 0x937401d9, 0x0604d54c, 0xcb552557, 0x5e25f1c2, 0x3ac58a3c, + 0xafb55ea9, 0xf3057dc0, 0x6675a955, 0x0295d2ab, 0x97e5063e, + 0xbbf59479, 0x2e8540ec, 0x4a653b12, 0xdf15ef87, 0x83a5ccee, + 0x16d5187b, 0x72356385, 0xe745b710, 0x67cf0be4, 0xf2bfdf71, + 0x965fa48f, 0x032f701a, 0x5f9f5373, 0xcaef87e6, 0xae0ffc18, + 0x3b7f288d, 0x176fbaca, 0x821f6e5f, 0xe6ff15a1, 0x738fc134, + 0x2f3fe25d, 0xba4f36c8, 0xdeaf4d36, 0x4bdf99a3, 0x868e69b8, + 0x13febd2d, 0x771ec6d3, 0xe26e1246, 0xbede312f, 0x2baee5ba, + 0x4f4e9e44, 0xda3e4ad1, 0xf62ed896, 0x635e0c03, 0x07be77fd, + 0x92cea368, 0xce7e8001, 0x5b0e5494, 0x3fee2f6a, 0xaa9efbff, + 0x7e3cc91d, 0xeb4c1d88, 0x8fac6676, 0x1adcb2e3, 0x466c918a, + 0xd31c451f, 0xb7fc3ee1, 0x228cea74, 0x0e9c7833, 0x9becaca6, + 0xff0cd758, 0x6a7c03cd, 0x36cc20a4, 0xa3bcf431, 0xc75c8fcf, + 0x522c5b5a, 0x9f7dab41, 0x0a0d7fd4, 0x6eed042a, 0xfb9dd0bf, + 0xa72df3d6, 0x325d2743, 0x56bd5cbd, 0xc3cd8828, 0xefdd1a6f, + 0x7aadcefa, 0x1e4db504, 0x8b3d6191, 0xd78d42f8, 0x42fd966d, + 0x261ded93, 0xb36d3906, 0x54288e16, 0xc1585a83, 0xa5b8217d, + 0x30c8f5e8, 0x6c78d681, 0xf9080214, 0x9de879ea, 0x0898ad7f, + 0x24883f38, 0xb1f8ebad, 0xd5189053, 0x406844c6, 0x1cd867af, + 0x89a8b33a, 0xed48c8c4, 0x78381c51, 0xb569ec4a, 0x201938df, + 0x44f94321, 0xd18997b4, 0x8d39b4dd, 0x18496048, 0x7ca91bb6, + 0xe9d9cf23, 0xc5c95d64, 0x50b989f1, 0x3459f20f, 0xa129269a, + 0xfd9905f3, 0x68e9d166, 0x0c09aa98, 0x99797e0d, 0x4ddb4cef, + 0xd8ab987a, 0xbc4be384, 0x293b3711, 0x758b1478, 0xe0fbc0ed, + 0x841bbb13, 0x116b6f86, 0x3d7bfdc1, 0xa80b2954, 0xcceb52aa, + 0x599b863f, 0x052ba556, 0x905b71c3, 0xf4bb0a3d, 0x61cbdea8, + 0xac9a2eb3, 0x39eafa26, 0x5d0a81d8, 0xc87a554d, 0x94ca7624, + 0x01baa2b1, 0x655ad94f, 0xf02a0dda, 0xdc3a9f9d, 0x494a4b08, + 0x2daa30f6, 0xb8dae463, 0xe46ac70a, 0x711a139f, 0x15fa6861, + 0x808abcf4}, + {0x00000000, 0xcf9e17c8, 0x444d29d1, 0x8bd33e19, 0x889a53a2, + 0x4704446a, 0xccd77a73, 0x03496dbb, 0xca45a105, 0x05dbb6cd, + 0x8e0888d4, 0x41969f1c, 0x42dff2a7, 0x8d41e56f, 0x0692db76, + 0xc90cccbe, 0x4ffa444b, 0x80645383, 0x0bb76d9a, 0xc4297a52, + 0xc76017e9, 0x08fe0021, 0x832d3e38, 0x4cb329f0, 0x85bfe54e, + 0x4a21f286, 0xc1f2cc9f, 0x0e6cdb57, 0x0d25b6ec, 0xc2bba124, + 0x49689f3d, 0x86f688f5, 0x9ff48896, 0x506a9f5e, 0xdbb9a147, + 0x1427b68f, 0x176edb34, 0xd8f0ccfc, 0x5323f2e5, 0x9cbde52d, + 0x55b12993, 0x9a2f3e5b, 0x11fc0042, 0xde62178a, 0xdd2b7a31, + 0x12b56df9, 0x996653e0, 0x56f84428, 0xd00eccdd, 0x1f90db15, + 0x9443e50c, 0x5bddf2c4, 0x58949f7f, 0x970a88b7, 0x1cd9b6ae, + 0xd347a166, 0x1a4b6dd8, 0xd5d57a10, 0x5e064409, 0x919853c1, + 0x92d13e7a, 0x5d4f29b2, 0xd69c17ab, 0x19020063, 0xe498176d, + 0x2b0600a5, 0xa0d53ebc, 0x6f4b2974, 0x6c0244cf, 0xa39c5307, + 0x284f6d1e, 0xe7d17ad6, 0x2eddb668, 0xe143a1a0, 0x6a909fb9, + 0xa50e8871, 0xa647e5ca, 0x69d9f202, 0xe20acc1b, 0x2d94dbd3, + 0xab625326, 0x64fc44ee, 0xef2f7af7, 0x20b16d3f, 0x23f80084, + 0xec66174c, 0x67b52955, 0xa82b3e9d, 0x6127f223, 0xaeb9e5eb, + 0x256adbf2, 0xeaf4cc3a, 0xe9bda181, 0x2623b649, 0xadf08850, + 0x626e9f98, 0x7b6c9ffb, 0xb4f28833, 0x3f21b62a, 0xf0bfa1e2, + 0xf3f6cc59, 0x3c68db91, 0xb7bbe588, 0x7825f240, 0xb1293efe, + 0x7eb72936, 0xf564172f, 0x3afa00e7, 0x39b36d5c, 0xf62d7a94, + 0x7dfe448d, 0xb2605345, 0x3496dbb0, 0xfb08cc78, 0x70dbf261, + 0xbf45e5a9, 0xbc0c8812, 0x73929fda, 0xf841a1c3, 0x37dfb60b, + 0xfed37ab5, 0x314d6d7d, 0xba9e5364, 0x750044ac, 0x76492917, + 0xb9d73edf, 0x320400c6, 0xfd9a170e, 0x1241289b, 0xdddf3f53, + 0x560c014a, 0x99921682, 0x9adb7b39, 0x55456cf1, 0xde9652e8, + 0x11084520, 0xd804899e, 0x179a9e56, 0x9c49a04f, 0x53d7b787, + 0x509eda3c, 0x9f00cdf4, 0x14d3f3ed, 0xdb4de425, 0x5dbb6cd0, + 0x92257b18, 0x19f64501, 0xd66852c9, 0xd5213f72, 0x1abf28ba, + 0x916c16a3, 0x5ef2016b, 0x97fecdd5, 0x5860da1d, 0xd3b3e404, + 0x1c2df3cc, 0x1f649e77, 0xd0fa89bf, 0x5b29b7a6, 0x94b7a06e, + 0x8db5a00d, 0x422bb7c5, 0xc9f889dc, 0x06669e14, 0x052ff3af, + 0xcab1e467, 0x4162da7e, 0x8efccdb6, 0x47f00108, 0x886e16c0, + 0x03bd28d9, 0xcc233f11, 0xcf6a52aa, 0x00f44562, 0x8b277b7b, + 0x44b96cb3, 0xc24fe446, 0x0dd1f38e, 0x8602cd97, 0x499cda5f, + 0x4ad5b7e4, 0x854ba02c, 0x0e989e35, 0xc10689fd, 0x080a4543, + 0xc794528b, 0x4c476c92, 0x83d97b5a, 0x809016e1, 0x4f0e0129, + 0xc4dd3f30, 0x0b4328f8, 0xf6d93ff6, 0x3947283e, 0xb2941627, + 0x7d0a01ef, 0x7e436c54, 0xb1dd7b9c, 0x3a0e4585, 0xf590524d, + 0x3c9c9ef3, 0xf302893b, 0x78d1b722, 0xb74fa0ea, 0xb406cd51, + 0x7b98da99, 0xf04be480, 0x3fd5f348, 0xb9237bbd, 0x76bd6c75, + 0xfd6e526c, 0x32f045a4, 0x31b9281f, 0xfe273fd7, 0x75f401ce, + 0xba6a1606, 0x7366dab8, 0xbcf8cd70, 0x372bf369, 0xf8b5e4a1, + 0xfbfc891a, 0x34629ed2, 0xbfb1a0cb, 0x702fb703, 0x692db760, + 0xa6b3a0a8, 0x2d609eb1, 0xe2fe8979, 0xe1b7e4c2, 0x2e29f30a, + 0xa5facd13, 0x6a64dadb, 0xa3681665, 0x6cf601ad, 0xe7253fb4, + 0x28bb287c, 0x2bf245c7, 0xe46c520f, 0x6fbf6c16, 0xa0217bde, + 0x26d7f32b, 0xe949e4e3, 0x629adafa, 0xad04cd32, 0xae4da089, + 0x61d3b741, 0xea008958, 0x259e9e90, 0xec92522e, 0x230c45e6, + 0xa8df7bff, 0x67416c37, 0x6408018c, 0xab961644, 0x2045285d, + 0xefdb3f95}, + {0x00000000, 0x24825136, 0x4904a26c, 0x6d86f35a, 0x920944d8, + 0xb68b15ee, 0xdb0de6b4, 0xff8fb782, 0xff638ff1, 0xdbe1dec7, + 0xb6672d9d, 0x92e57cab, 0x6d6acb29, 0x49e89a1f, 0x246e6945, + 0x00ec3873, 0x25b619a3, 0x01344895, 0x6cb2bbcf, 0x4830eaf9, + 0xb7bf5d7b, 0x933d0c4d, 0xfebbff17, 0xda39ae21, 0xdad59652, + 0xfe57c764, 0x93d1343e, 0xb7536508, 0x48dcd28a, 0x6c5e83bc, + 0x01d870e6, 0x255a21d0, 0x4b6c3346, 0x6fee6270, 0x0268912a, + 0x26eac01c, 0xd965779e, 0xfde726a8, 0x9061d5f2, 0xb4e384c4, + 0xb40fbcb7, 0x908ded81, 0xfd0b1edb, 0xd9894fed, 0x2606f86f, + 0x0284a959, 0x6f025a03, 0x4b800b35, 0x6eda2ae5, 0x4a587bd3, + 0x27de8889, 0x035cd9bf, 0xfcd36e3d, 0xd8513f0b, 0xb5d7cc51, + 0x91559d67, 0x91b9a514, 0xb53bf422, 0xd8bd0778, 0xfc3f564e, + 0x03b0e1cc, 0x2732b0fa, 0x4ab443a0, 0x6e361296, 0x96d8668c, + 0xb25a37ba, 0xdfdcc4e0, 0xfb5e95d6, 0x04d12254, 0x20537362, + 0x4dd58038, 0x6957d10e, 0x69bbe97d, 0x4d39b84b, 0x20bf4b11, + 0x043d1a27, 0xfbb2ada5, 0xdf30fc93, 0xb2b60fc9, 0x96345eff, + 0xb36e7f2f, 0x97ec2e19, 0xfa6add43, 0xdee88c75, 0x21673bf7, + 0x05e56ac1, 0x6863999b, 0x4ce1c8ad, 0x4c0df0de, 0x688fa1e8, + 0x050952b2, 0x218b0384, 0xde04b406, 0xfa86e530, 0x9700166a, + 0xb382475c, 0xddb455ca, 0xf93604fc, 0x94b0f7a6, 0xb032a690, + 0x4fbd1112, 0x6b3f4024, 0x06b9b37e, 0x223be248, 0x22d7da3b, + 0x06558b0d, 0x6bd37857, 0x4f512961, 0xb0de9ee3, 0x945ccfd5, + 0xf9da3c8f, 0xdd586db9, 0xf8024c69, 0xdc801d5f, 0xb106ee05, + 0x9584bf33, 0x6a0b08b1, 0x4e895987, 0x230faadd, 0x078dfbeb, + 0x0761c398, 0x23e392ae, 0x4e6561f4, 0x6ae730c2, 0x95688740, + 0xb1ead676, 0xdc6c252c, 0xf8ee741a, 0xf6c1cb59, 0xd2439a6f, + 0xbfc56935, 0x9b473803, 0x64c88f81, 0x404adeb7, 0x2dcc2ded, + 0x094e7cdb, 0x09a244a8, 0x2d20159e, 0x40a6e6c4, 0x6424b7f2, + 0x9bab0070, 0xbf295146, 0xd2afa21c, 0xf62df32a, 0xd377d2fa, + 0xf7f583cc, 0x9a737096, 0xbef121a0, 0x417e9622, 0x65fcc714, + 0x087a344e, 0x2cf86578, 0x2c145d0b, 0x08960c3d, 0x6510ff67, + 0x4192ae51, 0xbe1d19d3, 0x9a9f48e5, 0xf719bbbf, 0xd39bea89, + 0xbdadf81f, 0x992fa929, 0xf4a95a73, 0xd02b0b45, 0x2fa4bcc7, + 0x0b26edf1, 0x66a01eab, 0x42224f9d, 0x42ce77ee, 0x664c26d8, + 0x0bcad582, 0x2f4884b4, 0xd0c73336, 0xf4456200, 0x99c3915a, + 0xbd41c06c, 0x981be1bc, 0xbc99b08a, 0xd11f43d0, 0xf59d12e6, + 0x0a12a564, 0x2e90f452, 0x43160708, 0x6794563e, 0x67786e4d, + 0x43fa3f7b, 0x2e7ccc21, 0x0afe9d17, 0xf5712a95, 0xd1f37ba3, + 0xbc7588f9, 0x98f7d9cf, 0x6019add5, 0x449bfce3, 0x291d0fb9, + 0x0d9f5e8f, 0xf210e90d, 0xd692b83b, 0xbb144b61, 0x9f961a57, + 0x9f7a2224, 0xbbf87312, 0xd67e8048, 0xf2fcd17e, 0x0d7366fc, + 0x29f137ca, 0x4477c490, 0x60f595a6, 0x45afb476, 0x612de540, + 0x0cab161a, 0x2829472c, 0xd7a6f0ae, 0xf324a198, 0x9ea252c2, + 0xba2003f4, 0xbacc3b87, 0x9e4e6ab1, 0xf3c899eb, 0xd74ac8dd, + 0x28c57f5f, 0x0c472e69, 0x61c1dd33, 0x45438c05, 0x2b759e93, + 0x0ff7cfa5, 0x62713cff, 0x46f36dc9, 0xb97cda4b, 0x9dfe8b7d, + 0xf0787827, 0xd4fa2911, 0xd4161162, 0xf0944054, 0x9d12b30e, + 0xb990e238, 0x461f55ba, 0x629d048c, 0x0f1bf7d6, 0x2b99a6e0, + 0x0ec38730, 0x2a41d606, 0x47c7255c, 0x6345746a, 0x9ccac3e8, + 0xb84892de, 0xd5ce6184, 0xf14c30b2, 0xf1a008c1, 0xd52259f7, + 0xb8a4aaad, 0x9c26fb9b, 0x63a94c19, 0x472b1d2f, 0x2aadee75, + 0x0e2fbf43}, + {0x00000000, 0x36f290f3, 0x6de521e6, 0x5b17b115, 0xdbca43cc, + 0xed38d33f, 0xb62f622a, 0x80ddf2d9, 0x6ce581d9, 0x5a17112a, + 0x0100a03f, 0x37f230cc, 0xb72fc215, 0x81dd52e6, 0xdacae3f3, + 0xec387300, 0xd9cb03b2, 0xef399341, 0xb42e2254, 0x82dcb2a7, + 0x0201407e, 0x34f3d08d, 0x6fe46198, 0x5916f16b, 0xb52e826b, + 0x83dc1298, 0xd8cba38d, 0xee39337e, 0x6ee4c1a7, 0x58165154, + 0x0301e041, 0x35f370b2, 0x68e70125, 0x5e1591d6, 0x050220c3, + 0x33f0b030, 0xb32d42e9, 0x85dfd21a, 0xdec8630f, 0xe83af3fc, + 0x040280fc, 0x32f0100f, 0x69e7a11a, 0x5f1531e9, 0xdfc8c330, + 0xe93a53c3, 0xb22de2d6, 0x84df7225, 0xb12c0297, 0x87de9264, + 0xdcc92371, 0xea3bb382, 0x6ae6415b, 0x5c14d1a8, 0x070360bd, + 0x31f1f04e, 0xddc9834e, 0xeb3b13bd, 0xb02ca2a8, 0x86de325b, + 0x0603c082, 0x30f15071, 0x6be6e164, 0x5d147197, 0xd1ce024a, + 0xe73c92b9, 0xbc2b23ac, 0x8ad9b35f, 0x0a044186, 0x3cf6d175, + 0x67e16060, 0x5113f093, 0xbd2b8393, 0x8bd91360, 0xd0cea275, + 0xe63c3286, 0x66e1c05f, 0x501350ac, 0x0b04e1b9, 0x3df6714a, + 0x080501f8, 0x3ef7910b, 0x65e0201e, 0x5312b0ed, 0xd3cf4234, + 0xe53dd2c7, 0xbe2a63d2, 0x88d8f321, 0x64e08021, 0x521210d2, + 0x0905a1c7, 0x3ff73134, 0xbf2ac3ed, 0x89d8531e, 0xd2cfe20b, + 0xe43d72f8, 0xb929036f, 0x8fdb939c, 0xd4cc2289, 0xe23eb27a, + 0x62e340a3, 0x5411d050, 0x0f066145, 0x39f4f1b6, 0xd5cc82b6, + 0xe33e1245, 0xb829a350, 0x8edb33a3, 0x0e06c17a, 0x38f45189, + 0x63e3e09c, 0x5511706f, 0x60e200dd, 0x5610902e, 0x0d07213b, + 0x3bf5b1c8, 0xbb284311, 0x8ddad3e2, 0xd6cd62f7, 0xe03ff204, + 0x0c078104, 0x3af511f7, 0x61e2a0e2, 0x57103011, 0xd7cdc2c8, + 0xe13f523b, 0xba28e32e, 0x8cda73dd, 0x78ed02d5, 0x4e1f9226, + 0x15082333, 0x23fab3c0, 0xa3274119, 0x95d5d1ea, 0xcec260ff, + 0xf830f00c, 0x1408830c, 0x22fa13ff, 0x79eda2ea, 0x4f1f3219, + 0xcfc2c0c0, 0xf9305033, 0xa227e126, 0x94d571d5, 0xa1260167, + 0x97d49194, 0xccc32081, 0xfa31b072, 0x7aec42ab, 0x4c1ed258, + 0x1709634d, 0x21fbf3be, 0xcdc380be, 0xfb31104d, 0xa026a158, + 0x96d431ab, 0x1609c372, 0x20fb5381, 0x7bece294, 0x4d1e7267, + 0x100a03f0, 0x26f89303, 0x7def2216, 0x4b1db2e5, 0xcbc0403c, + 0xfd32d0cf, 0xa62561da, 0x90d7f129, 0x7cef8229, 0x4a1d12da, + 0x110aa3cf, 0x27f8333c, 0xa725c1e5, 0x91d75116, 0xcac0e003, + 0xfc3270f0, 0xc9c10042, 0xff3390b1, 0xa42421a4, 0x92d6b157, + 0x120b438e, 0x24f9d37d, 0x7fee6268, 0x491cf29b, 0xa524819b, + 0x93d61168, 0xc8c1a07d, 0xfe33308e, 0x7eeec257, 0x481c52a4, + 0x130be3b1, 0x25f97342, 0xa923009f, 0x9fd1906c, 0xc4c62179, + 0xf234b18a, 0x72e94353, 0x441bd3a0, 0x1f0c62b5, 0x29fef246, + 0xc5c68146, 0xf33411b5, 0xa823a0a0, 0x9ed13053, 0x1e0cc28a, + 0x28fe5279, 0x73e9e36c, 0x451b739f, 0x70e8032d, 0x461a93de, + 0x1d0d22cb, 0x2bffb238, 0xab2240e1, 0x9dd0d012, 0xc6c76107, + 0xf035f1f4, 0x1c0d82f4, 0x2aff1207, 0x71e8a312, 0x471a33e1, + 0xc7c7c138, 0xf13551cb, 0xaa22e0de, 0x9cd0702d, 0xc1c401ba, + 0xf7369149, 0xac21205c, 0x9ad3b0af, 0x1a0e4276, 0x2cfcd285, + 0x77eb6390, 0x4119f363, 0xad218063, 0x9bd31090, 0xc0c4a185, + 0xf6363176, 0x76ebc3af, 0x4019535c, 0x1b0ee249, 0x2dfc72ba, + 0x180f0208, 0x2efd92fb, 0x75ea23ee, 0x4318b31d, 0xc3c541c4, + 0xf537d137, 0xae206022, 0x98d2f0d1, 0x74ea83d1, 0x42181322, + 0x190fa237, 0x2ffd32c4, 0xaf20c01d, 0x99d250ee, 0xc2c5e1fb, + 0xf4377108}}; + +local const z_word_t FAR crc_braid_big_table[][256] = { + {0x0000000000000000, 0xf390f23600000000, 0xe621e56d00000000, + 0x15b1175b00000000, 0xcc43cadb00000000, 0x3fd338ed00000000, + 0x2a622fb600000000, 0xd9f2dd8000000000, 0xd981e56c00000000, + 0x2a11175a00000000, 0x3fa0000100000000, 0xcc30f23700000000, + 0x15c22fb700000000, 0xe652dd8100000000, 0xf3e3cada00000000, + 0x007338ec00000000, 0xb203cbd900000000, 0x419339ef00000000, + 0x54222eb400000000, 0xa7b2dc8200000000, 0x7e40010200000000, + 0x8dd0f33400000000, 0x9861e46f00000000, 0x6bf1165900000000, + 0x6b822eb500000000, 0x9812dc8300000000, 0x8da3cbd800000000, + 0x7e3339ee00000000, 0xa7c1e46e00000000, 0x5451165800000000, + 0x41e0010300000000, 0xb270f33500000000, 0x2501e76800000000, + 0xd691155e00000000, 0xc320020500000000, 0x30b0f03300000000, + 0xe9422db300000000, 0x1ad2df8500000000, 0x0f63c8de00000000, + 0xfcf33ae800000000, 0xfc80020400000000, 0x0f10f03200000000, + 0x1aa1e76900000000, 0xe931155f00000000, 0x30c3c8df00000000, + 0xc3533ae900000000, 0xd6e22db200000000, 0x2572df8400000000, + 0x97022cb100000000, 0x6492de8700000000, 0x7123c9dc00000000, + 0x82b33bea00000000, 0x5b41e66a00000000, 0xa8d1145c00000000, + 0xbd60030700000000, 0x4ef0f13100000000, 0x4e83c9dd00000000, + 0xbd133beb00000000, 0xa8a22cb000000000, 0x5b32de8600000000, + 0x82c0030600000000, 0x7150f13000000000, 0x64e1e66b00000000, + 0x9771145d00000000, 0x4a02ced100000000, 0xb9923ce700000000, + 0xac232bbc00000000, 0x5fb3d98a00000000, 0x8641040a00000000, + 0x75d1f63c00000000, 0x6060e16700000000, 0x93f0135100000000, + 0x93832bbd00000000, 0x6013d98b00000000, 0x75a2ced000000000, + 0x86323ce600000000, 0x5fc0e16600000000, 0xac50135000000000, + 0xb9e1040b00000000, 0x4a71f63d00000000, 0xf801050800000000, + 0x0b91f73e00000000, 0x1e20e06500000000, 0xedb0125300000000, + 0x3442cfd300000000, 0xc7d23de500000000, 0xd2632abe00000000, + 0x21f3d88800000000, 0x2180e06400000000, 0xd210125200000000, + 0xc7a1050900000000, 0x3431f73f00000000, 0xedc32abf00000000, + 0x1e53d88900000000, 0x0be2cfd200000000, 0xf8723de400000000, + 0x6f0329b900000000, 0x9c93db8f00000000, 0x8922ccd400000000, + 0x7ab23ee200000000, 0xa340e36200000000, 0x50d0115400000000, + 0x4561060f00000000, 0xb6f1f43900000000, 0xb682ccd500000000, + 0x45123ee300000000, 0x50a329b800000000, 0xa333db8e00000000, + 0x7ac1060e00000000, 0x8951f43800000000, 0x9ce0e36300000000, + 0x6f70115500000000, 0xdd00e26000000000, 0x2e90105600000000, + 0x3b21070d00000000, 0xc8b1f53b00000000, 0x114328bb00000000, + 0xe2d3da8d00000000, 0xf762cdd600000000, 0x04f23fe000000000, + 0x0481070c00000000, 0xf711f53a00000000, 0xe2a0e26100000000, + 0x1130105700000000, 0xc8c2cdd700000000, 0x3b523fe100000000, + 0x2ee328ba00000000, 0xdd73da8c00000000, 0xd502ed7800000000, + 0x26921f4e00000000, 0x3323081500000000, 0xc0b3fa2300000000, + 0x194127a300000000, 0xead1d59500000000, 0xff60c2ce00000000, + 0x0cf030f800000000, 0x0c83081400000000, 0xff13fa2200000000, + 0xeaa2ed7900000000, 0x19321f4f00000000, 0xc0c0c2cf00000000, + 0x335030f900000000, 0x26e127a200000000, 0xd571d59400000000, + 0x670126a100000000, 0x9491d49700000000, 0x8120c3cc00000000, + 0x72b031fa00000000, 0xab42ec7a00000000, 0x58d21e4c00000000, + 0x4d63091700000000, 0xbef3fb2100000000, 0xbe80c3cd00000000, + 0x4d1031fb00000000, 0x58a126a000000000, 0xab31d49600000000, + 0x72c3091600000000, 0x8153fb2000000000, 0x94e2ec7b00000000, + 0x67721e4d00000000, 0xf0030a1000000000, 0x0393f82600000000, + 0x1622ef7d00000000, 0xe5b21d4b00000000, 0x3c40c0cb00000000, + 0xcfd032fd00000000, 0xda6125a600000000, 0x29f1d79000000000, + 0x2982ef7c00000000, 0xda121d4a00000000, 0xcfa30a1100000000, + 0x3c33f82700000000, 0xe5c125a700000000, 0x1651d79100000000, + 0x03e0c0ca00000000, 0xf07032fc00000000, 0x4200c1c900000000, + 0xb19033ff00000000, 0xa42124a400000000, 0x57b1d69200000000, + 0x8e430b1200000000, 0x7dd3f92400000000, 0x6862ee7f00000000, + 0x9bf21c4900000000, 0x9b8124a500000000, 0x6811d69300000000, + 0x7da0c1c800000000, 0x8e3033fe00000000, 0x57c2ee7e00000000, + 0xa4521c4800000000, 0xb1e30b1300000000, 0x4273f92500000000, + 0x9f0023a900000000, 0x6c90d19f00000000, 0x7921c6c400000000, + 0x8ab134f200000000, 0x5343e97200000000, 0xa0d31b4400000000, + 0xb5620c1f00000000, 0x46f2fe2900000000, 0x4681c6c500000000, + 0xb51134f300000000, 0xa0a023a800000000, 0x5330d19e00000000, + 0x8ac20c1e00000000, 0x7952fe2800000000, 0x6ce3e97300000000, + 0x9f731b4500000000, 0x2d03e87000000000, 0xde931a4600000000, + 0xcb220d1d00000000, 0x38b2ff2b00000000, 0xe14022ab00000000, + 0x12d0d09d00000000, 0x0761c7c600000000, 0xf4f135f000000000, + 0xf4820d1c00000000, 0x0712ff2a00000000, 0x12a3e87100000000, + 0xe1331a4700000000, 0x38c1c7c700000000, 0xcb5135f100000000, + 0xdee022aa00000000, 0x2d70d09c00000000, 0xba01c4c100000000, + 0x499136f700000000, 0x5c2021ac00000000, 0xafb0d39a00000000, + 0x76420e1a00000000, 0x85d2fc2c00000000, 0x9063eb7700000000, + 0x63f3194100000000, 0x638021ad00000000, 0x9010d39b00000000, + 0x85a1c4c000000000, 0x763136f600000000, 0xafc3eb7600000000, + 0x5c53194000000000, 0x49e20e1b00000000, 0xba72fc2d00000000, + 0x08020f1800000000, 0xfb92fd2e00000000, 0xee23ea7500000000, + 0x1db3184300000000, 0xc441c5c300000000, 0x37d137f500000000, + 0x226020ae00000000, 0xd1f0d29800000000, 0xd183ea7400000000, + 0x2213184200000000, 0x37a20f1900000000, 0xc432fd2f00000000, + 0x1dc020af00000000, 0xee50d29900000000, 0xfbe1c5c200000000, + 0x087137f400000000}, + {0x0000000000000000, 0x3651822400000000, 0x6ca2044900000000, + 0x5af3866d00000000, 0xd844099200000000, 0xee158bb600000000, + 0xb4e60ddb00000000, 0x82b78fff00000000, 0xf18f63ff00000000, + 0xc7dee1db00000000, 0x9d2d67b600000000, 0xab7ce59200000000, + 0x29cb6a6d00000000, 0x1f9ae84900000000, 0x45696e2400000000, + 0x7338ec0000000000, 0xa319b62500000000, 0x9548340100000000, + 0xcfbbb26c00000000, 0xf9ea304800000000, 0x7b5dbfb700000000, + 0x4d0c3d9300000000, 0x17ffbbfe00000000, 0x21ae39da00000000, + 0x5296d5da00000000, 0x64c757fe00000000, 0x3e34d19300000000, + 0x086553b700000000, 0x8ad2dc4800000000, 0xbc835e6c00000000, + 0xe670d80100000000, 0xd0215a2500000000, 0x46336c4b00000000, + 0x7062ee6f00000000, 0x2a91680200000000, 0x1cc0ea2600000000, + 0x9e7765d900000000, 0xa826e7fd00000000, 0xf2d5619000000000, + 0xc484e3b400000000, 0xb7bc0fb400000000, 0x81ed8d9000000000, + 0xdb1e0bfd00000000, 0xed4f89d900000000, 0x6ff8062600000000, + 0x59a9840200000000, 0x035a026f00000000, 0x350b804b00000000, + 0xe52ada6e00000000, 0xd37b584a00000000, 0x8988de2700000000, + 0xbfd95c0300000000, 0x3d6ed3fc00000000, 0x0b3f51d800000000, + 0x51ccd7b500000000, 0x679d559100000000, 0x14a5b99100000000, + 0x22f43bb500000000, 0x7807bdd800000000, 0x4e563ffc00000000, + 0xcce1b00300000000, 0xfab0322700000000, 0xa043b44a00000000, + 0x9612366e00000000, 0x8c66d89600000000, 0xba375ab200000000, + 0xe0c4dcdf00000000, 0xd6955efb00000000, 0x5422d10400000000, + 0x6273532000000000, 0x3880d54d00000000, 0x0ed1576900000000, + 0x7de9bb6900000000, 0x4bb8394d00000000, 0x114bbf2000000000, + 0x271a3d0400000000, 0xa5adb2fb00000000, 0x93fc30df00000000, + 0xc90fb6b200000000, 0xff5e349600000000, 0x2f7f6eb300000000, + 0x192eec9700000000, 0x43dd6afa00000000, 0x758ce8de00000000, + 0xf73b672100000000, 0xc16ae50500000000, 0x9b99636800000000, + 0xadc8e14c00000000, 0xdef00d4c00000000, 0xe8a18f6800000000, + 0xb252090500000000, 0x84038b2100000000, 0x06b404de00000000, + 0x30e586fa00000000, 0x6a16009700000000, 0x5c4782b300000000, + 0xca55b4dd00000000, 0xfc0436f900000000, 0xa6f7b09400000000, + 0x90a632b000000000, 0x1211bd4f00000000, 0x24403f6b00000000, + 0x7eb3b90600000000, 0x48e23b2200000000, 0x3bdad72200000000, + 0x0d8b550600000000, 0x5778d36b00000000, 0x6129514f00000000, + 0xe39edeb000000000, 0xd5cf5c9400000000, 0x8f3cdaf900000000, + 0xb96d58dd00000000, 0x694c02f800000000, 0x5f1d80dc00000000, + 0x05ee06b100000000, 0x33bf849500000000, 0xb1080b6a00000000, + 0x8759894e00000000, 0xddaa0f2300000000, 0xebfb8d0700000000, + 0x98c3610700000000, 0xae92e32300000000, 0xf461654e00000000, + 0xc230e76a00000000, 0x4087689500000000, 0x76d6eab100000000, + 0x2c256cdc00000000, 0x1a74eef800000000, 0x59cbc1f600000000, + 0x6f9a43d200000000, 0x3569c5bf00000000, 0x0338479b00000000, + 0x818fc86400000000, 0xb7de4a4000000000, 0xed2dcc2d00000000, + 0xdb7c4e0900000000, 0xa844a20900000000, 0x9e15202d00000000, + 0xc4e6a64000000000, 0xf2b7246400000000, 0x7000ab9b00000000, + 0x465129bf00000000, 0x1ca2afd200000000, 0x2af32df600000000, + 0xfad277d300000000, 0xcc83f5f700000000, 0x9670739a00000000, + 0xa021f1be00000000, 0x22967e4100000000, 0x14c7fc6500000000, + 0x4e347a0800000000, 0x7865f82c00000000, 0x0b5d142c00000000, + 0x3d0c960800000000, 0x67ff106500000000, 0x51ae924100000000, + 0xd3191dbe00000000, 0xe5489f9a00000000, 0xbfbb19f700000000, + 0x89ea9bd300000000, 0x1ff8adbd00000000, 0x29a92f9900000000, + 0x735aa9f400000000, 0x450b2bd000000000, 0xc7bca42f00000000, + 0xf1ed260b00000000, 0xab1ea06600000000, 0x9d4f224200000000, + 0xee77ce4200000000, 0xd8264c6600000000, 0x82d5ca0b00000000, + 0xb484482f00000000, 0x3633c7d000000000, 0x006245f400000000, + 0x5a91c39900000000, 0x6cc041bd00000000, 0xbce11b9800000000, + 0x8ab099bc00000000, 0xd0431fd100000000, 0xe6129df500000000, + 0x64a5120a00000000, 0x52f4902e00000000, 0x0807164300000000, + 0x3e56946700000000, 0x4d6e786700000000, 0x7b3ffa4300000000, + 0x21cc7c2e00000000, 0x179dfe0a00000000, 0x952a71f500000000, + 0xa37bf3d100000000, 0xf98875bc00000000, 0xcfd9f79800000000, + 0xd5ad196000000000, 0xe3fc9b4400000000, 0xb90f1d2900000000, + 0x8f5e9f0d00000000, 0x0de910f200000000, 0x3bb892d600000000, + 0x614b14bb00000000, 0x571a969f00000000, 0x24227a9f00000000, + 0x1273f8bb00000000, 0x48807ed600000000, 0x7ed1fcf200000000, + 0xfc66730d00000000, 0xca37f12900000000, 0x90c4774400000000, + 0xa695f56000000000, 0x76b4af4500000000, 0x40e52d6100000000, + 0x1a16ab0c00000000, 0x2c47292800000000, 0xaef0a6d700000000, + 0x98a124f300000000, 0xc252a29e00000000, 0xf40320ba00000000, + 0x873bccba00000000, 0xb16a4e9e00000000, 0xeb99c8f300000000, + 0xddc84ad700000000, 0x5f7fc52800000000, 0x692e470c00000000, + 0x33ddc16100000000, 0x058c434500000000, 0x939e752b00000000, + 0xa5cff70f00000000, 0xff3c716200000000, 0xc96df34600000000, + 0x4bda7cb900000000, 0x7d8bfe9d00000000, 0x277878f000000000, + 0x1129fad400000000, 0x621116d400000000, 0x544094f000000000, + 0x0eb3129d00000000, 0x38e290b900000000, 0xba551f4600000000, + 0x8c049d6200000000, 0xd6f71b0f00000000, 0xe0a6992b00000000, + 0x3087c30e00000000, 0x06d6412a00000000, 0x5c25c74700000000, + 0x6a74456300000000, 0xe8c3ca9c00000000, 0xde9248b800000000, + 0x8461ced500000000, 0xb2304cf100000000, 0xc108a0f100000000, + 0xf75922d500000000, 0xadaaa4b800000000, 0x9bfb269c00000000, + 0x194ca96300000000, 0x2f1d2b4700000000, 0x75eead2a00000000, + 0x43bf2f0e00000000}, + {0x0000000000000000, 0xc8179ecf00000000, 0xd1294d4400000000, + 0x193ed38b00000000, 0xa2539a8800000000, 0x6a44044700000000, + 0x737ad7cc00000000, 0xbb6d490300000000, 0x05a145ca00000000, + 0xcdb6db0500000000, 0xd488088e00000000, 0x1c9f964100000000, + 0xa7f2df4200000000, 0x6fe5418d00000000, 0x76db920600000000, + 0xbecc0cc900000000, 0x4b44fa4f00000000, 0x8353648000000000, + 0x9a6db70b00000000, 0x527a29c400000000, 0xe91760c700000000, + 0x2100fe0800000000, 0x383e2d8300000000, 0xf029b34c00000000, + 0x4ee5bf8500000000, 0x86f2214a00000000, 0x9fccf2c100000000, + 0x57db6c0e00000000, 0xecb6250d00000000, 0x24a1bbc200000000, + 0x3d9f684900000000, 0xf588f68600000000, 0x9688f49f00000000, + 0x5e9f6a5000000000, 0x47a1b9db00000000, 0x8fb6271400000000, + 0x34db6e1700000000, 0xfcccf0d800000000, 0xe5f2235300000000, + 0x2de5bd9c00000000, 0x9329b15500000000, 0x5b3e2f9a00000000, + 0x4200fc1100000000, 0x8a1762de00000000, 0x317a2bdd00000000, + 0xf96db51200000000, 0xe053669900000000, 0x2844f85600000000, + 0xddcc0ed000000000, 0x15db901f00000000, 0x0ce5439400000000, + 0xc4f2dd5b00000000, 0x7f9f945800000000, 0xb7880a9700000000, + 0xaeb6d91c00000000, 0x66a147d300000000, 0xd86d4b1a00000000, + 0x107ad5d500000000, 0x0944065e00000000, 0xc153989100000000, + 0x7a3ed19200000000, 0xb2294f5d00000000, 0xab179cd600000000, + 0x6300021900000000, 0x6d1798e400000000, 0xa500062b00000000, + 0xbc3ed5a000000000, 0x74294b6f00000000, 0xcf44026c00000000, + 0x07539ca300000000, 0x1e6d4f2800000000, 0xd67ad1e700000000, + 0x68b6dd2e00000000, 0xa0a143e100000000, 0xb99f906a00000000, + 0x71880ea500000000, 0xcae547a600000000, 0x02f2d96900000000, + 0x1bcc0ae200000000, 0xd3db942d00000000, 0x265362ab00000000, + 0xee44fc6400000000, 0xf77a2fef00000000, 0x3f6db12000000000, + 0x8400f82300000000, 0x4c1766ec00000000, 0x5529b56700000000, + 0x9d3e2ba800000000, 0x23f2276100000000, 0xebe5b9ae00000000, + 0xf2db6a2500000000, 0x3accf4ea00000000, 0x81a1bde900000000, + 0x49b6232600000000, 0x5088f0ad00000000, 0x989f6e6200000000, + 0xfb9f6c7b00000000, 0x3388f2b400000000, 0x2ab6213f00000000, + 0xe2a1bff000000000, 0x59ccf6f300000000, 0x91db683c00000000, + 0x88e5bbb700000000, 0x40f2257800000000, 0xfe3e29b100000000, + 0x3629b77e00000000, 0x2f1764f500000000, 0xe700fa3a00000000, + 0x5c6db33900000000, 0x947a2df600000000, 0x8d44fe7d00000000, + 0x455360b200000000, 0xb0db963400000000, 0x78cc08fb00000000, + 0x61f2db7000000000, 0xa9e545bf00000000, 0x12880cbc00000000, + 0xda9f927300000000, 0xc3a141f800000000, 0x0bb6df3700000000, + 0xb57ad3fe00000000, 0x7d6d4d3100000000, 0x64539eba00000000, + 0xac44007500000000, 0x1729497600000000, 0xdf3ed7b900000000, + 0xc600043200000000, 0x0e179afd00000000, 0x9b28411200000000, + 0x533fdfdd00000000, 0x4a010c5600000000, 0x8216929900000000, + 0x397bdb9a00000000, 0xf16c455500000000, 0xe85296de00000000, + 0x2045081100000000, 0x9e8904d800000000, 0x569e9a1700000000, + 0x4fa0499c00000000, 0x87b7d75300000000, 0x3cda9e5000000000, + 0xf4cd009f00000000, 0xedf3d31400000000, 0x25e44ddb00000000, + 0xd06cbb5d00000000, 0x187b259200000000, 0x0145f61900000000, + 0xc95268d600000000, 0x723f21d500000000, 0xba28bf1a00000000, + 0xa3166c9100000000, 0x6b01f25e00000000, 0xd5cdfe9700000000, + 0x1dda605800000000, 0x04e4b3d300000000, 0xccf32d1c00000000, + 0x779e641f00000000, 0xbf89fad000000000, 0xa6b7295b00000000, + 0x6ea0b79400000000, 0x0da0b58d00000000, 0xc5b72b4200000000, + 0xdc89f8c900000000, 0x149e660600000000, 0xaff32f0500000000, + 0x67e4b1ca00000000, 0x7eda624100000000, 0xb6cdfc8e00000000, + 0x0801f04700000000, 0xc0166e8800000000, 0xd928bd0300000000, + 0x113f23cc00000000, 0xaa526acf00000000, 0x6245f40000000000, + 0x7b7b278b00000000, 0xb36cb94400000000, 0x46e44fc200000000, + 0x8ef3d10d00000000, 0x97cd028600000000, 0x5fda9c4900000000, + 0xe4b7d54a00000000, 0x2ca04b8500000000, 0x359e980e00000000, + 0xfd8906c100000000, 0x43450a0800000000, 0x8b5294c700000000, + 0x926c474c00000000, 0x5a7bd98300000000, 0xe116908000000000, + 0x29010e4f00000000, 0x303fddc400000000, 0xf828430b00000000, + 0xf63fd9f600000000, 0x3e28473900000000, 0x271694b200000000, + 0xef010a7d00000000, 0x546c437e00000000, 0x9c7bddb100000000, + 0x85450e3a00000000, 0x4d5290f500000000, 0xf39e9c3c00000000, + 0x3b8902f300000000, 0x22b7d17800000000, 0xeaa04fb700000000, + 0x51cd06b400000000, 0x99da987b00000000, 0x80e44bf000000000, + 0x48f3d53f00000000, 0xbd7b23b900000000, 0x756cbd7600000000, + 0x6c526efd00000000, 0xa445f03200000000, 0x1f28b93100000000, + 0xd73f27fe00000000, 0xce01f47500000000, 0x06166aba00000000, + 0xb8da667300000000, 0x70cdf8bc00000000, 0x69f32b3700000000, + 0xa1e4b5f800000000, 0x1a89fcfb00000000, 0xd29e623400000000, + 0xcba0b1bf00000000, 0x03b72f7000000000, 0x60b72d6900000000, + 0xa8a0b3a600000000, 0xb19e602d00000000, 0x7989fee200000000, + 0xc2e4b7e100000000, 0x0af3292e00000000, 0x13cdfaa500000000, + 0xdbda646a00000000, 0x651668a300000000, 0xad01f66c00000000, + 0xb43f25e700000000, 0x7c28bb2800000000, 0xc745f22b00000000, + 0x0f526ce400000000, 0x166cbf6f00000000, 0xde7b21a000000000, + 0x2bf3d72600000000, 0xe3e449e900000000, 0xfada9a6200000000, + 0x32cd04ad00000000, 0x89a04dae00000000, 0x41b7d36100000000, + 0x588900ea00000000, 0x909e9e2500000000, 0x2e5292ec00000000, + 0xe6450c2300000000, 0xff7bdfa800000000, 0x376c416700000000, + 0x8c01086400000000, 0x441696ab00000000, 0x5d28452000000000, + 0x953fdbef00000000}, + {0x0000000000000000, 0x95d4709500000000, 0x6baf90f100000000, + 0xfe7be06400000000, 0x9758503800000000, 0x028c20ad00000000, + 0xfcf7c0c900000000, 0x6923b05c00000000, 0x2eb1a07000000000, + 0xbb65d0e500000000, 0x451e308100000000, 0xd0ca401400000000, + 0xb9e9f04800000000, 0x2c3d80dd00000000, 0xd24660b900000000, + 0x4792102c00000000, 0x5c6241e100000000, 0xc9b6317400000000, + 0x37cdd11000000000, 0xa219a18500000000, 0xcb3a11d900000000, + 0x5eee614c00000000, 0xa095812800000000, 0x3541f1bd00000000, + 0x72d3e19100000000, 0xe707910400000000, 0x197c716000000000, + 0x8ca801f500000000, 0xe58bb1a900000000, 0x705fc13c00000000, + 0x8e24215800000000, 0x1bf051cd00000000, 0xf9c2f31900000000, + 0x6c16838c00000000, 0x926d63e800000000, 0x07b9137d00000000, + 0x6e9aa32100000000, 0xfb4ed3b400000000, 0x053533d000000000, + 0x90e1434500000000, 0xd773536900000000, 0x42a723fc00000000, + 0xbcdcc39800000000, 0x2908b30d00000000, 0x402b035100000000, + 0xd5ff73c400000000, 0x2b8493a000000000, 0xbe50e33500000000, + 0xa5a0b2f800000000, 0x3074c26d00000000, 0xce0f220900000000, + 0x5bdb529c00000000, 0x32f8e2c000000000, 0xa72c925500000000, + 0x5957723100000000, 0xcc8302a400000000, 0x8b11128800000000, + 0x1ec5621d00000000, 0xe0be827900000000, 0x756af2ec00000000, + 0x1c4942b000000000, 0x899d322500000000, 0x77e6d24100000000, + 0xe232a2d400000000, 0xf285e73300000000, 0x675197a600000000, + 0x992a77c200000000, 0x0cfe075700000000, 0x65ddb70b00000000, + 0xf009c79e00000000, 0x0e7227fa00000000, 0x9ba6576f00000000, + 0xdc34474300000000, 0x49e037d600000000, 0xb79bd7b200000000, + 0x224fa72700000000, 0x4b6c177b00000000, 0xdeb867ee00000000, + 0x20c3878a00000000, 0xb517f71f00000000, 0xaee7a6d200000000, + 0x3b33d64700000000, 0xc548362300000000, 0x509c46b600000000, + 0x39bff6ea00000000, 0xac6b867f00000000, 0x5210661b00000000, + 0xc7c4168e00000000, 0x805606a200000000, 0x1582763700000000, + 0xebf9965300000000, 0x7e2de6c600000000, 0x170e569a00000000, + 0x82da260f00000000, 0x7ca1c66b00000000, 0xe975b6fe00000000, + 0x0b47142a00000000, 0x9e9364bf00000000, 0x60e884db00000000, + 0xf53cf44e00000000, 0x9c1f441200000000, 0x09cb348700000000, + 0xf7b0d4e300000000, 0x6264a47600000000, 0x25f6b45a00000000, + 0xb022c4cf00000000, 0x4e5924ab00000000, 0xdb8d543e00000000, + 0xb2aee46200000000, 0x277a94f700000000, 0xd901749300000000, + 0x4cd5040600000000, 0x572555cb00000000, 0xc2f1255e00000000, + 0x3c8ac53a00000000, 0xa95eb5af00000000, 0xc07d05f300000000, + 0x55a9756600000000, 0xabd2950200000000, 0x3e06e59700000000, + 0x7994f5bb00000000, 0xec40852e00000000, 0x123b654a00000000, + 0x87ef15df00000000, 0xeecca58300000000, 0x7b18d51600000000, + 0x8563357200000000, 0x10b745e700000000, 0xe40bcf6700000000, + 0x71dfbff200000000, 0x8fa45f9600000000, 0x1a702f0300000000, + 0x73539f5f00000000, 0xe687efca00000000, 0x18fc0fae00000000, + 0x8d287f3b00000000, 0xcaba6f1700000000, 0x5f6e1f8200000000, + 0xa115ffe600000000, 0x34c18f7300000000, 0x5de23f2f00000000, + 0xc8364fba00000000, 0x364dafde00000000, 0xa399df4b00000000, + 0xb8698e8600000000, 0x2dbdfe1300000000, 0xd3c61e7700000000, + 0x46126ee200000000, 0x2f31debe00000000, 0xbae5ae2b00000000, + 0x449e4e4f00000000, 0xd14a3eda00000000, 0x96d82ef600000000, + 0x030c5e6300000000, 0xfd77be0700000000, 0x68a3ce9200000000, + 0x01807ece00000000, 0x94540e5b00000000, 0x6a2fee3f00000000, + 0xfffb9eaa00000000, 0x1dc93c7e00000000, 0x881d4ceb00000000, + 0x7666ac8f00000000, 0xe3b2dc1a00000000, 0x8a916c4600000000, + 0x1f451cd300000000, 0xe13efcb700000000, 0x74ea8c2200000000, + 0x33789c0e00000000, 0xa6acec9b00000000, 0x58d70cff00000000, + 0xcd037c6a00000000, 0xa420cc3600000000, 0x31f4bca300000000, + 0xcf8f5cc700000000, 0x5a5b2c5200000000, 0x41ab7d9f00000000, + 0xd47f0d0a00000000, 0x2a04ed6e00000000, 0xbfd09dfb00000000, + 0xd6f32da700000000, 0x43275d3200000000, 0xbd5cbd5600000000, + 0x2888cdc300000000, 0x6f1addef00000000, 0xfacead7a00000000, + 0x04b54d1e00000000, 0x91613d8b00000000, 0xf8428dd700000000, + 0x6d96fd4200000000, 0x93ed1d2600000000, 0x06396db300000000, + 0x168e285400000000, 0x835a58c100000000, 0x7d21b8a500000000, + 0xe8f5c83000000000, 0x81d6786c00000000, 0x140208f900000000, + 0xea79e89d00000000, 0x7fad980800000000, 0x383f882400000000, + 0xadebf8b100000000, 0x539018d500000000, 0xc644684000000000, + 0xaf67d81c00000000, 0x3ab3a88900000000, 0xc4c848ed00000000, + 0x511c387800000000, 0x4aec69b500000000, 0xdf38192000000000, + 0x2143f94400000000, 0xb49789d100000000, 0xddb4398d00000000, + 0x4860491800000000, 0xb61ba97c00000000, 0x23cfd9e900000000, + 0x645dc9c500000000, 0xf189b95000000000, 0x0ff2593400000000, + 0x9a2629a100000000, 0xf30599fd00000000, 0x66d1e96800000000, + 0x98aa090c00000000, 0x0d7e799900000000, 0xef4cdb4d00000000, + 0x7a98abd800000000, 0x84e34bbc00000000, 0x11373b2900000000, + 0x78148b7500000000, 0xedc0fbe000000000, 0x13bb1b8400000000, + 0x866f6b1100000000, 0xc1fd7b3d00000000, 0x54290ba800000000, + 0xaa52ebcc00000000, 0x3f869b5900000000, 0x56a52b0500000000, + 0xc3715b9000000000, 0x3d0abbf400000000, 0xa8decb6100000000, + 0xb32e9aac00000000, 0x26faea3900000000, 0xd8810a5d00000000, + 0x4d557ac800000000, 0x2476ca9400000000, 0xb1a2ba0100000000, + 0x4fd95a6500000000, 0xda0d2af000000000, 0x9d9f3adc00000000, + 0x084b4a4900000000, 0xf630aa2d00000000, 0x63e4dab800000000, + 0x0ac76ae400000000, 0x9f131a7100000000, 0x6168fa1500000000, + 0xf4bc8a8000000000}, + {0x0000000000000000, 0x1f17f08000000000, 0x7f2891da00000000, + 0x603f615a00000000, 0xbf56536e00000000, 0xa041a3ee00000000, + 0xc07ec2b400000000, 0xdf69323400000000, 0x7eada6dc00000000, + 0x61ba565c00000000, 0x0185370600000000, 0x1e92c78600000000, + 0xc1fbf5b200000000, 0xdeec053200000000, 0xbed3646800000000, + 0xa1c494e800000000, 0xbd5c3c6200000000, 0xa24bcce200000000, + 0xc274adb800000000, 0xdd635d3800000000, 0x020a6f0c00000000, + 0x1d1d9f8c00000000, 0x7d22fed600000000, 0x62350e5600000000, + 0xc3f19abe00000000, 0xdce66a3e00000000, 0xbcd90b6400000000, + 0xa3cefbe400000000, 0x7ca7c9d000000000, 0x63b0395000000000, + 0x038f580a00000000, 0x1c98a88a00000000, 0x7ab978c400000000, + 0x65ae884400000000, 0x0591e91e00000000, 0x1a86199e00000000, + 0xc5ef2baa00000000, 0xdaf8db2a00000000, 0xbac7ba7000000000, + 0xa5d04af000000000, 0x0414de1800000000, 0x1b032e9800000000, + 0x7b3c4fc200000000, 0x642bbf4200000000, 0xbb428d7600000000, + 0xa4557df600000000, 0xc46a1cac00000000, 0xdb7dec2c00000000, + 0xc7e544a600000000, 0xd8f2b42600000000, 0xb8cdd57c00000000, + 0xa7da25fc00000000, 0x78b317c800000000, 0x67a4e74800000000, + 0x079b861200000000, 0x188c769200000000, 0xb948e27a00000000, + 0xa65f12fa00000000, 0xc66073a000000000, 0xd977832000000000, + 0x061eb11400000000, 0x1909419400000000, 0x793620ce00000000, + 0x6621d04e00000000, 0xb574805300000000, 0xaa6370d300000000, + 0xca5c118900000000, 0xd54be10900000000, 0x0a22d33d00000000, + 0x153523bd00000000, 0x750a42e700000000, 0x6a1db26700000000, + 0xcbd9268f00000000, 0xd4ced60f00000000, 0xb4f1b75500000000, + 0xabe647d500000000, 0x748f75e100000000, 0x6b98856100000000, + 0x0ba7e43b00000000, 0x14b014bb00000000, 0x0828bc3100000000, + 0x173f4cb100000000, 0x77002deb00000000, 0x6817dd6b00000000, + 0xb77eef5f00000000, 0xa8691fdf00000000, 0xc8567e8500000000, + 0xd7418e0500000000, 0x76851aed00000000, 0x6992ea6d00000000, + 0x09ad8b3700000000, 0x16ba7bb700000000, 0xc9d3498300000000, + 0xd6c4b90300000000, 0xb6fbd85900000000, 0xa9ec28d900000000, + 0xcfcdf89700000000, 0xd0da081700000000, 0xb0e5694d00000000, + 0xaff299cd00000000, 0x709babf900000000, 0x6f8c5b7900000000, + 0x0fb33a2300000000, 0x10a4caa300000000, 0xb1605e4b00000000, + 0xae77aecb00000000, 0xce48cf9100000000, 0xd15f3f1100000000, + 0x0e360d2500000000, 0x1121fda500000000, 0x711e9cff00000000, + 0x6e096c7f00000000, 0x7291c4f500000000, 0x6d86347500000000, + 0x0db9552f00000000, 0x12aea5af00000000, 0xcdc7979b00000000, + 0xd2d0671b00000000, 0xb2ef064100000000, 0xadf8f6c100000000, + 0x0c3c622900000000, 0x132b92a900000000, 0x7314f3f300000000, + 0x6c03037300000000, 0xb36a314700000000, 0xac7dc1c700000000, + 0xcc42a09d00000000, 0xd355501d00000000, 0x6ae900a700000000, + 0x75fef02700000000, 0x15c1917d00000000, 0x0ad661fd00000000, + 0xd5bf53c900000000, 0xcaa8a34900000000, 0xaa97c21300000000, + 0xb580329300000000, 0x1444a67b00000000, 0x0b5356fb00000000, + 0x6b6c37a100000000, 0x747bc72100000000, 0xab12f51500000000, + 0xb405059500000000, 0xd43a64cf00000000, 0xcb2d944f00000000, + 0xd7b53cc500000000, 0xc8a2cc4500000000, 0xa89dad1f00000000, + 0xb78a5d9f00000000, 0x68e36fab00000000, 0x77f49f2b00000000, + 0x17cbfe7100000000, 0x08dc0ef100000000, 0xa9189a1900000000, + 0xb60f6a9900000000, 0xd6300bc300000000, 0xc927fb4300000000, + 0x164ec97700000000, 0x095939f700000000, 0x696658ad00000000, + 0x7671a82d00000000, 0x1050786300000000, 0x0f4788e300000000, + 0x6f78e9b900000000, 0x706f193900000000, 0xaf062b0d00000000, + 0xb011db8d00000000, 0xd02ebad700000000, 0xcf394a5700000000, + 0x6efddebf00000000, 0x71ea2e3f00000000, 0x11d54f6500000000, + 0x0ec2bfe500000000, 0xd1ab8dd100000000, 0xcebc7d5100000000, + 0xae831c0b00000000, 0xb194ec8b00000000, 0xad0c440100000000, + 0xb21bb48100000000, 0xd224d5db00000000, 0xcd33255b00000000, + 0x125a176f00000000, 0x0d4de7ef00000000, 0x6d7286b500000000, + 0x7265763500000000, 0xd3a1e2dd00000000, 0xccb6125d00000000, + 0xac89730700000000, 0xb39e838700000000, 0x6cf7b1b300000000, + 0x73e0413300000000, 0x13df206900000000, 0x0cc8d0e900000000, + 0xdf9d80f400000000, 0xc08a707400000000, 0xa0b5112e00000000, + 0xbfa2e1ae00000000, 0x60cbd39a00000000, 0x7fdc231a00000000, + 0x1fe3424000000000, 0x00f4b2c000000000, 0xa130262800000000, + 0xbe27d6a800000000, 0xde18b7f200000000, 0xc10f477200000000, + 0x1e66754600000000, 0x017185c600000000, 0x614ee49c00000000, + 0x7e59141c00000000, 0x62c1bc9600000000, 0x7dd64c1600000000, + 0x1de92d4c00000000, 0x02feddcc00000000, 0xdd97eff800000000, + 0xc2801f7800000000, 0xa2bf7e2200000000, 0xbda88ea200000000, + 0x1c6c1a4a00000000, 0x037beaca00000000, 0x63448b9000000000, + 0x7c537b1000000000, 0xa33a492400000000, 0xbc2db9a400000000, + 0xdc12d8fe00000000, 0xc305287e00000000, 0xa524f83000000000, + 0xba3308b000000000, 0xda0c69ea00000000, 0xc51b996a00000000, + 0x1a72ab5e00000000, 0x05655bde00000000, 0x655a3a8400000000, + 0x7a4dca0400000000, 0xdb895eec00000000, 0xc49eae6c00000000, + 0xa4a1cf3600000000, 0xbbb63fb600000000, 0x64df0d8200000000, + 0x7bc8fd0200000000, 0x1bf79c5800000000, 0x04e06cd800000000, + 0x1878c45200000000, 0x076f34d200000000, 0x6750558800000000, + 0x7847a50800000000, 0xa72e973c00000000, 0xb83967bc00000000, + 0xd80606e600000000, 0xc711f66600000000, 0x66d5628e00000000, + 0x79c2920e00000000, 0x19fdf35400000000, 0x06ea03d400000000, + 0xd98331e000000000, 0xc694c16000000000, 0xa6aba03a00000000, + 0xb9bc50ba00000000}, + {0x0000000000000000, 0xe2fd888d00000000, 0x85fd60c000000000, + 0x6700e84d00000000, 0x4bfdb05b00000000, 0xa90038d600000000, + 0xce00d09b00000000, 0x2cfd581600000000, 0x96fa61b700000000, + 0x7407e93a00000000, 0x1307017700000000, 0xf1fa89fa00000000, + 0xdd07d1ec00000000, 0x3ffa596100000000, 0x58fab12c00000000, + 0xba0739a100000000, 0x6df3b2b500000000, 0x8f0e3a3800000000, + 0xe80ed27500000000, 0x0af35af800000000, 0x260e02ee00000000, + 0xc4f38a6300000000, 0xa3f3622e00000000, 0x410eeaa300000000, + 0xfb09d30200000000, 0x19f45b8f00000000, 0x7ef4b3c200000000, + 0x9c093b4f00000000, 0xb0f4635900000000, 0x5209ebd400000000, + 0x3509039900000000, 0xd7f48b1400000000, 0x9be014b000000000, + 0x791d9c3d00000000, 0x1e1d747000000000, 0xfce0fcfd00000000, + 0xd01da4eb00000000, 0x32e02c6600000000, 0x55e0c42b00000000, + 0xb71d4ca600000000, 0x0d1a750700000000, 0xefe7fd8a00000000, + 0x88e715c700000000, 0x6a1a9d4a00000000, 0x46e7c55c00000000, + 0xa41a4dd100000000, 0xc31aa59c00000000, 0x21e72d1100000000, + 0xf613a60500000000, 0x14ee2e8800000000, 0x73eec6c500000000, + 0x91134e4800000000, 0xbdee165e00000000, 0x5f139ed300000000, + 0x3813769e00000000, 0xdaeefe1300000000, 0x60e9c7b200000000, + 0x82144f3f00000000, 0xe514a77200000000, 0x07e92fff00000000, + 0x2b1477e900000000, 0xc9e9ff6400000000, 0xaee9172900000000, + 0x4c149fa400000000, 0x77c758bb00000000, 0x953ad03600000000, + 0xf23a387b00000000, 0x10c7b0f600000000, 0x3c3ae8e000000000, + 0xdec7606d00000000, 0xb9c7882000000000, 0x5b3a00ad00000000, + 0xe13d390c00000000, 0x03c0b18100000000, 0x64c059cc00000000, + 0x863dd14100000000, 0xaac0895700000000, 0x483d01da00000000, + 0x2f3de99700000000, 0xcdc0611a00000000, 0x1a34ea0e00000000, + 0xf8c9628300000000, 0x9fc98ace00000000, 0x7d34024300000000, + 0x51c95a5500000000, 0xb334d2d800000000, 0xd4343a9500000000, + 0x36c9b21800000000, 0x8cce8bb900000000, 0x6e33033400000000, + 0x0933eb7900000000, 0xebce63f400000000, 0xc7333be200000000, + 0x25ceb36f00000000, 0x42ce5b2200000000, 0xa033d3af00000000, + 0xec274c0b00000000, 0x0edac48600000000, 0x69da2ccb00000000, + 0x8b27a44600000000, 0xa7dafc5000000000, 0x452774dd00000000, + 0x22279c9000000000, 0xc0da141d00000000, 0x7add2dbc00000000, + 0x9820a53100000000, 0xff204d7c00000000, 0x1dddc5f100000000, + 0x31209de700000000, 0xd3dd156a00000000, 0xb4ddfd2700000000, + 0x562075aa00000000, 0x81d4febe00000000, 0x6329763300000000, + 0x04299e7e00000000, 0xe6d416f300000000, 0xca294ee500000000, + 0x28d4c66800000000, 0x4fd42e2500000000, 0xad29a6a800000000, + 0x172e9f0900000000, 0xf5d3178400000000, 0x92d3ffc900000000, + 0x702e774400000000, 0x5cd32f5200000000, 0xbe2ea7df00000000, + 0xd92e4f9200000000, 0x3bd3c71f00000000, 0xaf88c0ad00000000, + 0x4d75482000000000, 0x2a75a06d00000000, 0xc88828e000000000, + 0xe47570f600000000, 0x0688f87b00000000, 0x6188103600000000, + 0x837598bb00000000, 0x3972a11a00000000, 0xdb8f299700000000, + 0xbc8fc1da00000000, 0x5e72495700000000, 0x728f114100000000, + 0x907299cc00000000, 0xf772718100000000, 0x158ff90c00000000, + 0xc27b721800000000, 0x2086fa9500000000, 0x478612d800000000, + 0xa57b9a5500000000, 0x8986c24300000000, 0x6b7b4ace00000000, + 0x0c7ba28300000000, 0xee862a0e00000000, 0x548113af00000000, + 0xb67c9b2200000000, 0xd17c736f00000000, 0x3381fbe200000000, + 0x1f7ca3f400000000, 0xfd812b7900000000, 0x9a81c33400000000, + 0x787c4bb900000000, 0x3468d41d00000000, 0xd6955c9000000000, + 0xb195b4dd00000000, 0x53683c5000000000, 0x7f95644600000000, + 0x9d68eccb00000000, 0xfa68048600000000, 0x18958c0b00000000, + 0xa292b5aa00000000, 0x406f3d2700000000, 0x276fd56a00000000, + 0xc5925de700000000, 0xe96f05f100000000, 0x0b928d7c00000000, + 0x6c92653100000000, 0x8e6fedbc00000000, 0x599b66a800000000, + 0xbb66ee2500000000, 0xdc66066800000000, 0x3e9b8ee500000000, + 0x1266d6f300000000, 0xf09b5e7e00000000, 0x979bb63300000000, + 0x75663ebe00000000, 0xcf61071f00000000, 0x2d9c8f9200000000, + 0x4a9c67df00000000, 0xa861ef5200000000, 0x849cb74400000000, + 0x66613fc900000000, 0x0161d78400000000, 0xe39c5f0900000000, + 0xd84f981600000000, 0x3ab2109b00000000, 0x5db2f8d600000000, + 0xbf4f705b00000000, 0x93b2284d00000000, 0x714fa0c000000000, + 0x164f488d00000000, 0xf4b2c00000000000, 0x4eb5f9a100000000, + 0xac48712c00000000, 0xcb48996100000000, 0x29b511ec00000000, + 0x054849fa00000000, 0xe7b5c17700000000, 0x80b5293a00000000, + 0x6248a1b700000000, 0xb5bc2aa300000000, 0x5741a22e00000000, + 0x30414a6300000000, 0xd2bcc2ee00000000, 0xfe419af800000000, + 0x1cbc127500000000, 0x7bbcfa3800000000, 0x994172b500000000, + 0x23464b1400000000, 0xc1bbc39900000000, 0xa6bb2bd400000000, + 0x4446a35900000000, 0x68bbfb4f00000000, 0x8a4673c200000000, + 0xed469b8f00000000, 0x0fbb130200000000, 0x43af8ca600000000, + 0xa152042b00000000, 0xc652ec6600000000, 0x24af64eb00000000, + 0x08523cfd00000000, 0xeaafb47000000000, 0x8daf5c3d00000000, + 0x6f52d4b000000000, 0xd555ed1100000000, 0x37a8659c00000000, + 0x50a88dd100000000, 0xb255055c00000000, 0x9ea85d4a00000000, + 0x7c55d5c700000000, 0x1b553d8a00000000, 0xf9a8b50700000000, + 0x2e5c3e1300000000, 0xcca1b69e00000000, 0xaba15ed300000000, + 0x495cd65e00000000, 0x65a18e4800000000, 0x875c06c500000000, + 0xe05cee8800000000, 0x02a1660500000000, 0xb8a65fa400000000, + 0x5a5bd72900000000, 0x3d5b3f6400000000, 0xdfa6b7e900000000, + 0xf35befff00000000, 0x11a6677200000000, 0x76a68f3f00000000, + 0x945b07b200000000}, + {0x0000000000000000, 0xa90b894e00000000, 0x5217129d00000000, + 0xfb1c9bd300000000, 0xe52855e100000000, 0x4c23dcaf00000000, + 0xb73f477c00000000, 0x1e34ce3200000000, 0x8b57db1900000000, + 0x225c525700000000, 0xd940c98400000000, 0x704b40ca00000000, + 0x6e7f8ef800000000, 0xc77407b600000000, 0x3c689c6500000000, + 0x9563152b00000000, 0x16afb63300000000, 0xbfa43f7d00000000, + 0x44b8a4ae00000000, 0xedb32de000000000, 0xf387e3d200000000, + 0x5a8c6a9c00000000, 0xa190f14f00000000, 0x089b780100000000, + 0x9df86d2a00000000, 0x34f3e46400000000, 0xcfef7fb700000000, + 0x66e4f6f900000000, 0x78d038cb00000000, 0xd1dbb18500000000, + 0x2ac72a5600000000, 0x83cca31800000000, 0x2c5e6d6700000000, + 0x8555e42900000000, 0x7e497ffa00000000, 0xd742f6b400000000, + 0xc976388600000000, 0x607db1c800000000, 0x9b612a1b00000000, + 0x326aa35500000000, 0xa709b67e00000000, 0x0e023f3000000000, + 0xf51ea4e300000000, 0x5c152dad00000000, 0x4221e39f00000000, + 0xeb2a6ad100000000, 0x1036f10200000000, 0xb93d784c00000000, + 0x3af1db5400000000, 0x93fa521a00000000, 0x68e6c9c900000000, + 0xc1ed408700000000, 0xdfd98eb500000000, 0x76d207fb00000000, + 0x8dce9c2800000000, 0x24c5156600000000, 0xb1a6004d00000000, + 0x18ad890300000000, 0xe3b112d000000000, 0x4aba9b9e00000000, + 0x548e55ac00000000, 0xfd85dce200000000, 0x0699473100000000, + 0xaf92ce7f00000000, 0x58bcdace00000000, 0xf1b7538000000000, + 0x0aabc85300000000, 0xa3a0411d00000000, 0xbd948f2f00000000, + 0x149f066100000000, 0xef839db200000000, 0x468814fc00000000, + 0xd3eb01d700000000, 0x7ae0889900000000, 0x81fc134a00000000, + 0x28f79a0400000000, 0x36c3543600000000, 0x9fc8dd7800000000, + 0x64d446ab00000000, 0xcddfcfe500000000, 0x4e136cfd00000000, + 0xe718e5b300000000, 0x1c047e6000000000, 0xb50ff72e00000000, + 0xab3b391c00000000, 0x0230b05200000000, 0xf92c2b8100000000, + 0x5027a2cf00000000, 0xc544b7e400000000, 0x6c4f3eaa00000000, + 0x9753a57900000000, 0x3e582c3700000000, 0x206ce20500000000, + 0x89676b4b00000000, 0x727bf09800000000, 0xdb7079d600000000, + 0x74e2b7a900000000, 0xdde93ee700000000, 0x26f5a53400000000, + 0x8ffe2c7a00000000, 0x91cae24800000000, 0x38c16b0600000000, + 0xc3ddf0d500000000, 0x6ad6799b00000000, 0xffb56cb000000000, + 0x56bee5fe00000000, 0xada27e2d00000000, 0x04a9f76300000000, + 0x1a9d395100000000, 0xb396b01f00000000, 0x488a2bcc00000000, + 0xe181a28200000000, 0x624d019a00000000, 0xcb4688d400000000, + 0x305a130700000000, 0x99519a4900000000, 0x8765547b00000000, + 0x2e6edd3500000000, 0xd57246e600000000, 0x7c79cfa800000000, + 0xe91ada8300000000, 0x401153cd00000000, 0xbb0dc81e00000000, + 0x1206415000000000, 0x0c328f6200000000, 0xa539062c00000000, + 0x5e259dff00000000, 0xf72e14b100000000, 0xf17ec44600000000, + 0x58754d0800000000, 0xa369d6db00000000, 0x0a625f9500000000, + 0x145691a700000000, 0xbd5d18e900000000, 0x4641833a00000000, + 0xef4a0a7400000000, 0x7a291f5f00000000, 0xd322961100000000, + 0x283e0dc200000000, 0x8135848c00000000, 0x9f014abe00000000, + 0x360ac3f000000000, 0xcd16582300000000, 0x641dd16d00000000, + 0xe7d1727500000000, 0x4edafb3b00000000, 0xb5c660e800000000, + 0x1ccde9a600000000, 0x02f9279400000000, 0xabf2aeda00000000, + 0x50ee350900000000, 0xf9e5bc4700000000, 0x6c86a96c00000000, + 0xc58d202200000000, 0x3e91bbf100000000, 0x979a32bf00000000, + 0x89aefc8d00000000, 0x20a575c300000000, 0xdbb9ee1000000000, + 0x72b2675e00000000, 0xdd20a92100000000, 0x742b206f00000000, + 0x8f37bbbc00000000, 0x263c32f200000000, 0x3808fcc000000000, + 0x9103758e00000000, 0x6a1fee5d00000000, 0xc314671300000000, + 0x5677723800000000, 0xff7cfb7600000000, 0x046060a500000000, + 0xad6be9eb00000000, 0xb35f27d900000000, 0x1a54ae9700000000, + 0xe148354400000000, 0x4843bc0a00000000, 0xcb8f1f1200000000, + 0x6284965c00000000, 0x99980d8f00000000, 0x309384c100000000, + 0x2ea74af300000000, 0x87acc3bd00000000, 0x7cb0586e00000000, + 0xd5bbd12000000000, 0x40d8c40b00000000, 0xe9d34d4500000000, + 0x12cfd69600000000, 0xbbc45fd800000000, 0xa5f091ea00000000, + 0x0cfb18a400000000, 0xf7e7837700000000, 0x5eec0a3900000000, + 0xa9c21e8800000000, 0x00c997c600000000, 0xfbd50c1500000000, + 0x52de855b00000000, 0x4cea4b6900000000, 0xe5e1c22700000000, + 0x1efd59f400000000, 0xb7f6d0ba00000000, 0x2295c59100000000, + 0x8b9e4cdf00000000, 0x7082d70c00000000, 0xd9895e4200000000, + 0xc7bd907000000000, 0x6eb6193e00000000, 0x95aa82ed00000000, + 0x3ca10ba300000000, 0xbf6da8bb00000000, 0x166621f500000000, + 0xed7aba2600000000, 0x4471336800000000, 0x5a45fd5a00000000, + 0xf34e741400000000, 0x0852efc700000000, 0xa159668900000000, + 0x343a73a200000000, 0x9d31faec00000000, 0x662d613f00000000, + 0xcf26e87100000000, 0xd112264300000000, 0x7819af0d00000000, + 0x830534de00000000, 0x2a0ebd9000000000, 0x859c73ef00000000, + 0x2c97faa100000000, 0xd78b617200000000, 0x7e80e83c00000000, + 0x60b4260e00000000, 0xc9bfaf4000000000, 0x32a3349300000000, + 0x9ba8bddd00000000, 0x0ecba8f600000000, 0xa7c021b800000000, + 0x5cdcba6b00000000, 0xf5d7332500000000, 0xebe3fd1700000000, + 0x42e8745900000000, 0xb9f4ef8a00000000, 0x10ff66c400000000, + 0x9333c5dc00000000, 0x3a384c9200000000, 0xc124d74100000000, + 0x682f5e0f00000000, 0x761b903d00000000, 0xdf10197300000000, + 0x240c82a000000000, 0x8d070bee00000000, 0x18641ec500000000, + 0xb16f978b00000000, 0x4a730c5800000000, 0xe378851600000000, + 0xfd4c4b2400000000, 0x5447c26a00000000, 0xaf5b59b900000000, + 0x0650d0f700000000}, + {0x0000000000000000, 0x479244af00000000, 0xcf22f88500000000, + 0x88b0bc2a00000000, 0xdf4381d000000000, 0x98d1c57f00000000, + 0x1061795500000000, 0x57f33dfa00000000, 0xff81737a00000000, + 0xb81337d500000000, 0x30a38bff00000000, 0x7731cf5000000000, + 0x20c2f2aa00000000, 0x6750b60500000000, 0xefe00a2f00000000, + 0xa8724e8000000000, 0xfe03e7f400000000, 0xb991a35b00000000, + 0x31211f7100000000, 0x76b35bde00000000, 0x2140662400000000, + 0x66d2228b00000000, 0xee629ea100000000, 0xa9f0da0e00000000, + 0x0182948e00000000, 0x4610d02100000000, 0xcea06c0b00000000, + 0x893228a400000000, 0xdec1155e00000000, 0x995351f100000000, + 0x11e3eddb00000000, 0x5671a97400000000, 0xbd01bf3200000000, + 0xfa93fb9d00000000, 0x722347b700000000, 0x35b1031800000000, + 0x62423ee200000000, 0x25d07a4d00000000, 0xad60c66700000000, + 0xeaf282c800000000, 0x4280cc4800000000, 0x051288e700000000, + 0x8da234cd00000000, 0xca30706200000000, 0x9dc34d9800000000, + 0xda51093700000000, 0x52e1b51d00000000, 0x1573f1b200000000, + 0x430258c600000000, 0x04901c6900000000, 0x8c20a04300000000, + 0xcbb2e4ec00000000, 0x9c41d91600000000, 0xdbd39db900000000, + 0x5363219300000000, 0x14f1653c00000000, 0xbc832bbc00000000, + 0xfb116f1300000000, 0x73a1d33900000000, 0x3433979600000000, + 0x63c0aa6c00000000, 0x2452eec300000000, 0xace252e900000000, + 0xeb70164600000000, 0x7a037e6500000000, 0x3d913aca00000000, + 0xb52186e000000000, 0xf2b3c24f00000000, 0xa540ffb500000000, + 0xe2d2bb1a00000000, 0x6a62073000000000, 0x2df0439f00000000, + 0x85820d1f00000000, 0xc21049b000000000, 0x4aa0f59a00000000, + 0x0d32b13500000000, 0x5ac18ccf00000000, 0x1d53c86000000000, + 0x95e3744a00000000, 0xd27130e500000000, 0x8400999100000000, + 0xc392dd3e00000000, 0x4b22611400000000, 0x0cb025bb00000000, + 0x5b43184100000000, 0x1cd15cee00000000, 0x9461e0c400000000, + 0xd3f3a46b00000000, 0x7b81eaeb00000000, 0x3c13ae4400000000, + 0xb4a3126e00000000, 0xf33156c100000000, 0xa4c26b3b00000000, + 0xe3502f9400000000, 0x6be093be00000000, 0x2c72d71100000000, + 0xc702c15700000000, 0x809085f800000000, 0x082039d200000000, + 0x4fb27d7d00000000, 0x1841408700000000, 0x5fd3042800000000, + 0xd763b80200000000, 0x90f1fcad00000000, 0x3883b22d00000000, + 0x7f11f68200000000, 0xf7a14aa800000000, 0xb0330e0700000000, + 0xe7c033fd00000000, 0xa052775200000000, 0x28e2cb7800000000, + 0x6f708fd700000000, 0x390126a300000000, 0x7e93620c00000000, + 0xf623de2600000000, 0xb1b19a8900000000, 0xe642a77300000000, + 0xa1d0e3dc00000000, 0x29605ff600000000, 0x6ef21b5900000000, + 0xc68055d900000000, 0x8112117600000000, 0x09a2ad5c00000000, + 0x4e30e9f300000000, 0x19c3d40900000000, 0x5e5190a600000000, + 0xd6e12c8c00000000, 0x9173682300000000, 0xf406fcca00000000, + 0xb394b86500000000, 0x3b24044f00000000, 0x7cb640e000000000, + 0x2b457d1a00000000, 0x6cd739b500000000, 0xe467859f00000000, + 0xa3f5c13000000000, 0x0b878fb000000000, 0x4c15cb1f00000000, + 0xc4a5773500000000, 0x8337339a00000000, 0xd4c40e6000000000, + 0x93564acf00000000, 0x1be6f6e500000000, 0x5c74b24a00000000, + 0x0a051b3e00000000, 0x4d975f9100000000, 0xc527e3bb00000000, + 0x82b5a71400000000, 0xd5469aee00000000, 0x92d4de4100000000, + 0x1a64626b00000000, 0x5df626c400000000, 0xf584684400000000, + 0xb2162ceb00000000, 0x3aa690c100000000, 0x7d34d46e00000000, + 0x2ac7e99400000000, 0x6d55ad3b00000000, 0xe5e5111100000000, + 0xa27755be00000000, 0x490743f800000000, 0x0e95075700000000, + 0x8625bb7d00000000, 0xc1b7ffd200000000, 0x9644c22800000000, + 0xd1d6868700000000, 0x59663aad00000000, 0x1ef47e0200000000, + 0xb686308200000000, 0xf114742d00000000, 0x79a4c80700000000, + 0x3e368ca800000000, 0x69c5b15200000000, 0x2e57f5fd00000000, + 0xa6e749d700000000, 0xe1750d7800000000, 0xb704a40c00000000, + 0xf096e0a300000000, 0x78265c8900000000, 0x3fb4182600000000, + 0x684725dc00000000, 0x2fd5617300000000, 0xa765dd5900000000, + 0xe0f799f600000000, 0x4885d77600000000, 0x0f1793d900000000, + 0x87a72ff300000000, 0xc0356b5c00000000, 0x97c656a600000000, + 0xd054120900000000, 0x58e4ae2300000000, 0x1f76ea8c00000000, + 0x8e0582af00000000, 0xc997c60000000000, 0x41277a2a00000000, + 0x06b53e8500000000, 0x5146037f00000000, 0x16d447d000000000, + 0x9e64fbfa00000000, 0xd9f6bf5500000000, 0x7184f1d500000000, + 0x3616b57a00000000, 0xbea6095000000000, 0xf9344dff00000000, + 0xaec7700500000000, 0xe95534aa00000000, 0x61e5888000000000, + 0x2677cc2f00000000, 0x7006655b00000000, 0x379421f400000000, + 0xbf249dde00000000, 0xf8b6d97100000000, 0xaf45e48b00000000, + 0xe8d7a02400000000, 0x60671c0e00000000, 0x27f558a100000000, + 0x8f87162100000000, 0xc815528e00000000, 0x40a5eea400000000, + 0x0737aa0b00000000, 0x50c497f100000000, 0x1756d35e00000000, + 0x9fe66f7400000000, 0xd8742bdb00000000, 0x33043d9d00000000, + 0x7496793200000000, 0xfc26c51800000000, 0xbbb481b700000000, + 0xec47bc4d00000000, 0xabd5f8e200000000, 0x236544c800000000, + 0x64f7006700000000, 0xcc854ee700000000, 0x8b170a4800000000, + 0x03a7b66200000000, 0x4435f2cd00000000, 0x13c6cf3700000000, + 0x54548b9800000000, 0xdce437b200000000, 0x9b76731d00000000, + 0xcd07da6900000000, 0x8a959ec600000000, 0x022522ec00000000, + 0x45b7664300000000, 0x12445bb900000000, 0x55d61f1600000000, + 0xdd66a33c00000000, 0x9af4e79300000000, 0x3286a91300000000, + 0x7514edbc00000000, 0xfda4519600000000, 0xba36153900000000, + 0xedc528c300000000, 0xaa576c6c00000000, 0x22e7d04600000000, + 0x657594e900000000}}; + +#else /* W == 4 */ + +local const z_crc_t FAR crc_braid_table[][256] = { + {0x00000000, 0x65673b46, 0xcace768c, 0xafa94dca, 0x4eedeb59, + 0x2b8ad01f, 0x84239dd5, 0xe144a693, 0x9ddbd6b2, 0xf8bcedf4, + 0x5715a03e, 0x32729b78, 0xd3363deb, 0xb65106ad, 0x19f84b67, + 0x7c9f7021, 0xe0c6ab25, 0x85a19063, 0x2a08dda9, 0x4f6fe6ef, + 0xae2b407c, 0xcb4c7b3a, 0x64e536f0, 0x01820db6, 0x7d1d7d97, + 0x187a46d1, 0xb7d30b1b, 0xd2b4305d, 0x33f096ce, 0x5697ad88, + 0xf93ee042, 0x9c59db04, 0x1afc500b, 0x7f9b6b4d, 0xd0322687, + 0xb5551dc1, 0x5411bb52, 0x31768014, 0x9edfcdde, 0xfbb8f698, + 0x872786b9, 0xe240bdff, 0x4de9f035, 0x288ecb73, 0xc9ca6de0, + 0xacad56a6, 0x03041b6c, 0x6663202a, 0xfa3afb2e, 0x9f5dc068, + 0x30f48da2, 0x5593b6e4, 0xb4d71077, 0xd1b02b31, 0x7e1966fb, + 0x1b7e5dbd, 0x67e12d9c, 0x028616da, 0xad2f5b10, 0xc8486056, + 0x290cc6c5, 0x4c6bfd83, 0xe3c2b049, 0x86a58b0f, 0x35f8a016, + 0x509f9b50, 0xff36d69a, 0x9a51eddc, 0x7b154b4f, 0x1e727009, + 0xb1db3dc3, 0xd4bc0685, 0xa82376a4, 0xcd444de2, 0x62ed0028, + 0x078a3b6e, 0xe6ce9dfd, 0x83a9a6bb, 0x2c00eb71, 0x4967d037, + 0xd53e0b33, 0xb0593075, 0x1ff07dbf, 0x7a9746f9, 0x9bd3e06a, + 0xfeb4db2c, 0x511d96e6, 0x347aada0, 0x48e5dd81, 0x2d82e6c7, + 0x822bab0d, 0xe74c904b, 0x060836d8, 0x636f0d9e, 0xccc64054, + 0xa9a17b12, 0x2f04f01d, 0x4a63cb5b, 0xe5ca8691, 0x80adbdd7, + 0x61e91b44, 0x048e2002, 0xab276dc8, 0xce40568e, 0xb2df26af, + 0xd7b81de9, 0x78115023, 0x1d766b65, 0xfc32cdf6, 0x9955f6b0, + 0x36fcbb7a, 0x539b803c, 0xcfc25b38, 0xaaa5607e, 0x050c2db4, + 0x606b16f2, 0x812fb061, 0xe4488b27, 0x4be1c6ed, 0x2e86fdab, + 0x52198d8a, 0x377eb6cc, 0x98d7fb06, 0xfdb0c040, 0x1cf466d3, + 0x79935d95, 0xd63a105f, 0xb35d2b19, 0x6bf1402c, 0x0e967b6a, + 0xa13f36a0, 0xc4580de6, 0x251cab75, 0x407b9033, 0xefd2ddf9, + 0x8ab5e6bf, 0xf62a969e, 0x934dadd8, 0x3ce4e012, 0x5983db54, + 0xb8c77dc7, 0xdda04681, 0x72090b4b, 0x176e300d, 0x8b37eb09, + 0xee50d04f, 0x41f99d85, 0x249ea6c3, 0xc5da0050, 0xa0bd3b16, + 0x0f1476dc, 0x6a734d9a, 0x16ec3dbb, 0x738b06fd, 0xdc224b37, + 0xb9457071, 0x5801d6e2, 0x3d66eda4, 0x92cfa06e, 0xf7a89b28, + 0x710d1027, 0x146a2b61, 0xbbc366ab, 0xdea45ded, 0x3fe0fb7e, + 0x5a87c038, 0xf52e8df2, 0x9049b6b4, 0xecd6c695, 0x89b1fdd3, + 0x2618b019, 0x437f8b5f, 0xa23b2dcc, 0xc75c168a, 0x68f55b40, + 0x0d926006, 0x91cbbb02, 0xf4ac8044, 0x5b05cd8e, 0x3e62f6c8, + 0xdf26505b, 0xba416b1d, 0x15e826d7, 0x708f1d91, 0x0c106db0, + 0x697756f6, 0xc6de1b3c, 0xa3b9207a, 0x42fd86e9, 0x279abdaf, + 0x8833f065, 0xed54cb23, 0x5e09e03a, 0x3b6edb7c, 0x94c796b6, + 0xf1a0adf0, 0x10e40b63, 0x75833025, 0xda2a7def, 0xbf4d46a9, + 0xc3d23688, 0xa6b50dce, 0x091c4004, 0x6c7b7b42, 0x8d3fddd1, + 0xe858e697, 0x47f1ab5d, 0x2296901b, 0xbecf4b1f, 0xdba87059, + 0x74013d93, 0x116606d5, 0xf022a046, 0x95459b00, 0x3aecd6ca, + 0x5f8bed8c, 0x23149dad, 0x4673a6eb, 0xe9daeb21, 0x8cbdd067, + 0x6df976f4, 0x089e4db2, 0xa7370078, 0xc2503b3e, 0x44f5b031, + 0x21928b77, 0x8e3bc6bd, 0xeb5cfdfb, 0x0a185b68, 0x6f7f602e, + 0xc0d62de4, 0xa5b116a2, 0xd92e6683, 0xbc495dc5, 0x13e0100f, + 0x76872b49, 0x97c38dda, 0xf2a4b69c, 0x5d0dfb56, 0x386ac010, + 0xa4331b14, 0xc1542052, 0x6efd6d98, 0x0b9a56de, 0xeadef04d, + 0x8fb9cb0b, 0x201086c1, 0x4577bd87, 0x39e8cda6, 0x5c8ff6e0, + 0xf326bb2a, 0x9641806c, 0x770526ff, 0x12621db9, 0xbdcb5073, + 0xd8ac6b35}, + {0x00000000, 0xd7e28058, 0x74b406f1, 0xa35686a9, 0xe9680de2, + 0x3e8a8dba, 0x9ddc0b13, 0x4a3e8b4b, 0x09a11d85, 0xde439ddd, + 0x7d151b74, 0xaaf79b2c, 0xe0c91067, 0x372b903f, 0x947d1696, + 0x439f96ce, 0x13423b0a, 0xc4a0bb52, 0x67f63dfb, 0xb014bda3, + 0xfa2a36e8, 0x2dc8b6b0, 0x8e9e3019, 0x597cb041, 0x1ae3268f, + 0xcd01a6d7, 0x6e57207e, 0xb9b5a026, 0xf38b2b6d, 0x2469ab35, + 0x873f2d9c, 0x50ddadc4, 0x26847614, 0xf166f64c, 0x523070e5, + 0x85d2f0bd, 0xcfec7bf6, 0x180efbae, 0xbb587d07, 0x6cbafd5f, + 0x2f256b91, 0xf8c7ebc9, 0x5b916d60, 0x8c73ed38, 0xc64d6673, + 0x11afe62b, 0xb2f96082, 0x651be0da, 0x35c64d1e, 0xe224cd46, + 0x41724bef, 0x9690cbb7, 0xdcae40fc, 0x0b4cc0a4, 0xa81a460d, + 0x7ff8c655, 0x3c67509b, 0xeb85d0c3, 0x48d3566a, 0x9f31d632, + 0xd50f5d79, 0x02eddd21, 0xa1bb5b88, 0x7659dbd0, 0x4d08ec28, + 0x9aea6c70, 0x39bcead9, 0xee5e6a81, 0xa460e1ca, 0x73826192, + 0xd0d4e73b, 0x07366763, 0x44a9f1ad, 0x934b71f5, 0x301df75c, + 0xe7ff7704, 0xadc1fc4f, 0x7a237c17, 0xd975fabe, 0x0e977ae6, + 0x5e4ad722, 0x89a8577a, 0x2afed1d3, 0xfd1c518b, 0xb722dac0, + 0x60c05a98, 0xc396dc31, 0x14745c69, 0x57ebcaa7, 0x80094aff, + 0x235fcc56, 0xf4bd4c0e, 0xbe83c745, 0x6961471d, 0xca37c1b4, + 0x1dd541ec, 0x6b8c9a3c, 0xbc6e1a64, 0x1f389ccd, 0xc8da1c95, + 0x82e497de, 0x55061786, 0xf650912f, 0x21b21177, 0x622d87b9, + 0xb5cf07e1, 0x16998148, 0xc17b0110, 0x8b458a5b, 0x5ca70a03, + 0xfff18caa, 0x28130cf2, 0x78cea136, 0xaf2c216e, 0x0c7aa7c7, + 0xdb98279f, 0x91a6acd4, 0x46442c8c, 0xe512aa25, 0x32f02a7d, + 0x716fbcb3, 0xa68d3ceb, 0x05dbba42, 0xd2393a1a, 0x9807b151, + 0x4fe53109, 0xecb3b7a0, 0x3b5137f8, 0x9a11d850, 0x4df35808, + 0xeea5dea1, 0x39475ef9, 0x7379d5b2, 0xa49b55ea, 0x07cdd343, + 0xd02f531b, 0x93b0c5d5, 0x4452458d, 0xe704c324, 0x30e6437c, + 0x7ad8c837, 0xad3a486f, 0x0e6ccec6, 0xd98e4e9e, 0x8953e35a, + 0x5eb16302, 0xfde7e5ab, 0x2a0565f3, 0x603beeb8, 0xb7d96ee0, + 0x148fe849, 0xc36d6811, 0x80f2fedf, 0x57107e87, 0xf446f82e, + 0x23a47876, 0x699af33d, 0xbe787365, 0x1d2ef5cc, 0xcacc7594, + 0xbc95ae44, 0x6b772e1c, 0xc821a8b5, 0x1fc328ed, 0x55fda3a6, + 0x821f23fe, 0x2149a557, 0xf6ab250f, 0xb534b3c1, 0x62d63399, + 0xc180b530, 0x16623568, 0x5c5cbe23, 0x8bbe3e7b, 0x28e8b8d2, + 0xff0a388a, 0xafd7954e, 0x78351516, 0xdb6393bf, 0x0c8113e7, + 0x46bf98ac, 0x915d18f4, 0x320b9e5d, 0xe5e91e05, 0xa67688cb, + 0x71940893, 0xd2c28e3a, 0x05200e62, 0x4f1e8529, 0x98fc0571, + 0x3baa83d8, 0xec480380, 0xd7193478, 0x00fbb420, 0xa3ad3289, + 0x744fb2d1, 0x3e71399a, 0xe993b9c2, 0x4ac53f6b, 0x9d27bf33, + 0xdeb829fd, 0x095aa9a5, 0xaa0c2f0c, 0x7deeaf54, 0x37d0241f, + 0xe032a447, 0x436422ee, 0x9486a2b6, 0xc45b0f72, 0x13b98f2a, + 0xb0ef0983, 0x670d89db, 0x2d330290, 0xfad182c8, 0x59870461, + 0x8e658439, 0xcdfa12f7, 0x1a1892af, 0xb94e1406, 0x6eac945e, + 0x24921f15, 0xf3709f4d, 0x502619e4, 0x87c499bc, 0xf19d426c, + 0x267fc234, 0x8529449d, 0x52cbc4c5, 0x18f54f8e, 0xcf17cfd6, + 0x6c41497f, 0xbba3c927, 0xf83c5fe9, 0x2fdedfb1, 0x8c885918, + 0x5b6ad940, 0x1154520b, 0xc6b6d253, 0x65e054fa, 0xb202d4a2, + 0xe2df7966, 0x353df93e, 0x966b7f97, 0x4189ffcf, 0x0bb77484, + 0xdc55f4dc, 0x7f037275, 0xa8e1f22d, 0xeb7e64e3, 0x3c9ce4bb, + 0x9fca6212, 0x4828e24a, 0x02166901, 0xd5f4e959, 0x76a26ff0, + 0xa140efa8}, + {0x00000000, 0xef52b6e1, 0x05d46b83, 0xea86dd62, 0x0ba8d706, + 0xe4fa61e7, 0x0e7cbc85, 0xe12e0a64, 0x1751ae0c, 0xf80318ed, + 0x1285c58f, 0xfdd7736e, 0x1cf9790a, 0xf3abcfeb, 0x192d1289, + 0xf67fa468, 0x2ea35c18, 0xc1f1eaf9, 0x2b77379b, 0xc425817a, + 0x250b8b1e, 0xca593dff, 0x20dfe09d, 0xcf8d567c, 0x39f2f214, + 0xd6a044f5, 0x3c269997, 0xd3742f76, 0x325a2512, 0xdd0893f3, + 0x378e4e91, 0xd8dcf870, 0x5d46b830, 0xb2140ed1, 0x5892d3b3, + 0xb7c06552, 0x56ee6f36, 0xb9bcd9d7, 0x533a04b5, 0xbc68b254, + 0x4a17163c, 0xa545a0dd, 0x4fc37dbf, 0xa091cb5e, 0x41bfc13a, + 0xaeed77db, 0x446baab9, 0xab391c58, 0x73e5e428, 0x9cb752c9, + 0x76318fab, 0x9963394a, 0x784d332e, 0x971f85cf, 0x7d9958ad, + 0x92cbee4c, 0x64b44a24, 0x8be6fcc5, 0x616021a7, 0x8e329746, + 0x6f1c9d22, 0x804e2bc3, 0x6ac8f6a1, 0x859a4040, 0xba8d7060, + 0x55dfc681, 0xbf591be3, 0x500bad02, 0xb125a766, 0x5e771187, + 0xb4f1cce5, 0x5ba37a04, 0xaddcde6c, 0x428e688d, 0xa808b5ef, + 0x475a030e, 0xa674096a, 0x4926bf8b, 0xa3a062e9, 0x4cf2d408, + 0x942e2c78, 0x7b7c9a99, 0x91fa47fb, 0x7ea8f11a, 0x9f86fb7e, + 0x70d44d9f, 0x9a5290fd, 0x7500261c, 0x837f8274, 0x6c2d3495, + 0x86abe9f7, 0x69f95f16, 0x88d75572, 0x6785e393, 0x8d033ef1, + 0x62518810, 0xe7cbc850, 0x08997eb1, 0xe21fa3d3, 0x0d4d1532, + 0xec631f56, 0x0331a9b7, 0xe9b774d5, 0x06e5c234, 0xf09a665c, + 0x1fc8d0bd, 0xf54e0ddf, 0x1a1cbb3e, 0xfb32b15a, 0x146007bb, + 0xfee6dad9, 0x11b46c38, 0xc9689448, 0x263a22a9, 0xccbcffcb, + 0x23ee492a, 0xc2c0434e, 0x2d92f5af, 0xc71428cd, 0x28469e2c, + 0xde393a44, 0x316b8ca5, 0xdbed51c7, 0x34bfe726, 0xd591ed42, + 0x3ac35ba3, 0xd04586c1, 0x3f173020, 0xae6be681, 0x41395060, + 0xabbf8d02, 0x44ed3be3, 0xa5c33187, 0x4a918766, 0xa0175a04, + 0x4f45ece5, 0xb93a488d, 0x5668fe6c, 0xbcee230e, 0x53bc95ef, + 0xb2929f8b, 0x5dc0296a, 0xb746f408, 0x581442e9, 0x80c8ba99, + 0x6f9a0c78, 0x851cd11a, 0x6a4e67fb, 0x8b606d9f, 0x6432db7e, + 0x8eb4061c, 0x61e6b0fd, 0x97991495, 0x78cba274, 0x924d7f16, + 0x7d1fc9f7, 0x9c31c393, 0x73637572, 0x99e5a810, 0x76b71ef1, + 0xf32d5eb1, 0x1c7fe850, 0xf6f93532, 0x19ab83d3, 0xf88589b7, + 0x17d73f56, 0xfd51e234, 0x120354d5, 0xe47cf0bd, 0x0b2e465c, + 0xe1a89b3e, 0x0efa2ddf, 0xefd427bb, 0x0086915a, 0xea004c38, + 0x0552fad9, 0xdd8e02a9, 0x32dcb448, 0xd85a692a, 0x3708dfcb, + 0xd626d5af, 0x3974634e, 0xd3f2be2c, 0x3ca008cd, 0xcadfaca5, + 0x258d1a44, 0xcf0bc726, 0x205971c7, 0xc1777ba3, 0x2e25cd42, + 0xc4a31020, 0x2bf1a6c1, 0x14e696e1, 0xfbb42000, 0x1132fd62, + 0xfe604b83, 0x1f4e41e7, 0xf01cf706, 0x1a9a2a64, 0xf5c89c85, + 0x03b738ed, 0xece58e0c, 0x0663536e, 0xe931e58f, 0x081fefeb, + 0xe74d590a, 0x0dcb8468, 0xe2993289, 0x3a45caf9, 0xd5177c18, + 0x3f91a17a, 0xd0c3179b, 0x31ed1dff, 0xdebfab1e, 0x3439767c, + 0xdb6bc09d, 0x2d1464f5, 0xc246d214, 0x28c00f76, 0xc792b997, + 0x26bcb3f3, 0xc9ee0512, 0x2368d870, 0xcc3a6e91, 0x49a02ed1, + 0xa6f29830, 0x4c744552, 0xa326f3b3, 0x4208f9d7, 0xad5a4f36, + 0x47dc9254, 0xa88e24b5, 0x5ef180dd, 0xb1a3363c, 0x5b25eb5e, + 0xb4775dbf, 0x555957db, 0xba0be13a, 0x508d3c58, 0xbfdf8ab9, + 0x670372c9, 0x8851c428, 0x62d7194a, 0x8d85afab, 0x6caba5cf, + 0x83f9132e, 0x697fce4c, 0x862d78ad, 0x7052dcc5, 0x9f006a24, + 0x7586b746, 0x9ad401a7, 0x7bfa0bc3, 0x94a8bd22, 0x7e2e6040, + 0x917cd6a1}, + {0x00000000, 0x87a6cb43, 0xd43c90c7, 0x539a5b84, 0x730827cf, + 0xf4aeec8c, 0xa734b708, 0x20927c4b, 0xe6104f9e, 0x61b684dd, + 0x322cdf59, 0xb58a141a, 0x95186851, 0x12bea312, 0x4124f896, + 0xc68233d5, 0x1751997d, 0x90f7523e, 0xc36d09ba, 0x44cbc2f9, + 0x6459beb2, 0xe3ff75f1, 0xb0652e75, 0x37c3e536, 0xf141d6e3, + 0x76e71da0, 0x257d4624, 0xa2db8d67, 0x8249f12c, 0x05ef3a6f, + 0x567561eb, 0xd1d3aaa8, 0x2ea332fa, 0xa905f9b9, 0xfa9fa23d, + 0x7d39697e, 0x5dab1535, 0xda0dde76, 0x899785f2, 0x0e314eb1, + 0xc8b37d64, 0x4f15b627, 0x1c8feda3, 0x9b2926e0, 0xbbbb5aab, + 0x3c1d91e8, 0x6f87ca6c, 0xe821012f, 0x39f2ab87, 0xbe5460c4, + 0xedce3b40, 0x6a68f003, 0x4afa8c48, 0xcd5c470b, 0x9ec61c8f, + 0x1960d7cc, 0xdfe2e419, 0x58442f5a, 0x0bde74de, 0x8c78bf9d, + 0xaceac3d6, 0x2b4c0895, 0x78d65311, 0xff709852, 0x5d4665f4, + 0xdae0aeb7, 0x897af533, 0x0edc3e70, 0x2e4e423b, 0xa9e88978, + 0xfa72d2fc, 0x7dd419bf, 0xbb562a6a, 0x3cf0e129, 0x6f6abaad, + 0xe8cc71ee, 0xc85e0da5, 0x4ff8c6e6, 0x1c629d62, 0x9bc45621, + 0x4a17fc89, 0xcdb137ca, 0x9e2b6c4e, 0x198da70d, 0x391fdb46, + 0xbeb91005, 0xed234b81, 0x6a8580c2, 0xac07b317, 0x2ba17854, + 0x783b23d0, 0xff9de893, 0xdf0f94d8, 0x58a95f9b, 0x0b33041f, + 0x8c95cf5c, 0x73e5570e, 0xf4439c4d, 0xa7d9c7c9, 0x207f0c8a, + 0x00ed70c1, 0x874bbb82, 0xd4d1e006, 0x53772b45, 0x95f51890, + 0x1253d3d3, 0x41c98857, 0xc66f4314, 0xe6fd3f5f, 0x615bf41c, + 0x32c1af98, 0xb56764db, 0x64b4ce73, 0xe3120530, 0xb0885eb4, + 0x372e95f7, 0x17bce9bc, 0x901a22ff, 0xc380797b, 0x4426b238, + 0x82a481ed, 0x05024aae, 0x5698112a, 0xd13eda69, 0xf1aca622, + 0x760a6d61, 0x259036e5, 0xa236fda6, 0xba8ccbe8, 0x3d2a00ab, + 0x6eb05b2f, 0xe916906c, 0xc984ec27, 0x4e222764, 0x1db87ce0, + 0x9a1eb7a3, 0x5c9c8476, 0xdb3a4f35, 0x88a014b1, 0x0f06dff2, + 0x2f94a3b9, 0xa83268fa, 0xfba8337e, 0x7c0ef83d, 0xaddd5295, + 0x2a7b99d6, 0x79e1c252, 0xfe470911, 0xded5755a, 0x5973be19, + 0x0ae9e59d, 0x8d4f2ede, 0x4bcd1d0b, 0xcc6bd648, 0x9ff18dcc, + 0x1857468f, 0x38c53ac4, 0xbf63f187, 0xecf9aa03, 0x6b5f6140, + 0x942ff912, 0x13893251, 0x401369d5, 0xc7b5a296, 0xe727dedd, + 0x6081159e, 0x331b4e1a, 0xb4bd8559, 0x723fb68c, 0xf5997dcf, + 0xa603264b, 0x21a5ed08, 0x01379143, 0x86915a00, 0xd50b0184, + 0x52adcac7, 0x837e606f, 0x04d8ab2c, 0x5742f0a8, 0xd0e43beb, + 0xf07647a0, 0x77d08ce3, 0x244ad767, 0xa3ec1c24, 0x656e2ff1, + 0xe2c8e4b2, 0xb152bf36, 0x36f47475, 0x1666083e, 0x91c0c37d, + 0xc25a98f9, 0x45fc53ba, 0xe7caae1c, 0x606c655f, 0x33f63edb, + 0xb450f598, 0x94c289d3, 0x13644290, 0x40fe1914, 0xc758d257, + 0x01dae182, 0x867c2ac1, 0xd5e67145, 0x5240ba06, 0x72d2c64d, + 0xf5740d0e, 0xa6ee568a, 0x21489dc9, 0xf09b3761, 0x773dfc22, + 0x24a7a7a6, 0xa3016ce5, 0x839310ae, 0x0435dbed, 0x57af8069, + 0xd0094b2a, 0x168b78ff, 0x912db3bc, 0xc2b7e838, 0x4511237b, + 0x65835f30, 0xe2259473, 0xb1bfcff7, 0x361904b4, 0xc9699ce6, + 0x4ecf57a5, 0x1d550c21, 0x9af3c762, 0xba61bb29, 0x3dc7706a, + 0x6e5d2bee, 0xe9fbe0ad, 0x2f79d378, 0xa8df183b, 0xfb4543bf, + 0x7ce388fc, 0x5c71f4b7, 0xdbd73ff4, 0x884d6470, 0x0febaf33, + 0xde38059b, 0x599eced8, 0x0a04955c, 0x8da25e1f, 0xad302254, + 0x2a96e917, 0x790cb293, 0xfeaa79d0, 0x38284a05, 0xbf8e8146, + 0xec14dac2, 0x6bb21181, 0x4b206dca, 0xcc86a689, 0x9f1cfd0d, + 0x18ba364e}}; + +local const z_word_t FAR crc_braid_big_table[][256] = { + {0x00000000, 0x43cba687, 0xc7903cd4, 0x845b9a53, 0xcf270873, + 0x8cecaef4, 0x08b734a7, 0x4b7c9220, 0x9e4f10e6, 0xdd84b661, + 0x59df2c32, 0x1a148ab5, 0x51681895, 0x12a3be12, 0x96f82441, + 0xd53382c6, 0x7d995117, 0x3e52f790, 0xba096dc3, 0xf9c2cb44, + 0xb2be5964, 0xf175ffe3, 0x752e65b0, 0x36e5c337, 0xe3d641f1, + 0xa01de776, 0x24467d25, 0x678ddba2, 0x2cf14982, 0x6f3aef05, + 0xeb617556, 0xa8aad3d1, 0xfa32a32e, 0xb9f905a9, 0x3da29ffa, + 0x7e69397d, 0x3515ab5d, 0x76de0dda, 0xf2859789, 0xb14e310e, + 0x647db3c8, 0x27b6154f, 0xa3ed8f1c, 0xe026299b, 0xab5abbbb, + 0xe8911d3c, 0x6cca876f, 0x2f0121e8, 0x87abf239, 0xc46054be, + 0x403bceed, 0x03f0686a, 0x488cfa4a, 0x0b475ccd, 0x8f1cc69e, + 0xccd76019, 0x19e4e2df, 0x5a2f4458, 0xde74de0b, 0x9dbf788c, + 0xd6c3eaac, 0x95084c2b, 0x1153d678, 0x529870ff, 0xf465465d, + 0xb7aee0da, 0x33f57a89, 0x703edc0e, 0x3b424e2e, 0x7889e8a9, + 0xfcd272fa, 0xbf19d47d, 0x6a2a56bb, 0x29e1f03c, 0xadba6a6f, + 0xee71cce8, 0xa50d5ec8, 0xe6c6f84f, 0x629d621c, 0x2156c49b, + 0x89fc174a, 0xca37b1cd, 0x4e6c2b9e, 0x0da78d19, 0x46db1f39, + 0x0510b9be, 0x814b23ed, 0xc280856a, 0x17b307ac, 0x5478a12b, + 0xd0233b78, 0x93e89dff, 0xd8940fdf, 0x9b5fa958, 0x1f04330b, + 0x5ccf958c, 0x0e57e573, 0x4d9c43f4, 0xc9c7d9a7, 0x8a0c7f20, + 0xc170ed00, 0x82bb4b87, 0x06e0d1d4, 0x452b7753, 0x9018f595, + 0xd3d35312, 0x5788c941, 0x14436fc6, 0x5f3ffde6, 0x1cf45b61, + 0x98afc132, 0xdb6467b5, 0x73ceb464, 0x300512e3, 0xb45e88b0, + 0xf7952e37, 0xbce9bc17, 0xff221a90, 0x7b7980c3, 0x38b22644, + 0xed81a482, 0xae4a0205, 0x2a119856, 0x69da3ed1, 0x22a6acf1, + 0x616d0a76, 0xe5369025, 0xa6fd36a2, 0xe8cb8cba, 0xab002a3d, + 0x2f5bb06e, 0x6c9016e9, 0x27ec84c9, 0x6427224e, 0xe07cb81d, + 0xa3b71e9a, 0x76849c5c, 0x354f3adb, 0xb114a088, 0xf2df060f, + 0xb9a3942f, 0xfa6832a8, 0x7e33a8fb, 0x3df80e7c, 0x9552ddad, + 0xd6997b2a, 0x52c2e179, 0x110947fe, 0x5a75d5de, 0x19be7359, + 0x9de5e90a, 0xde2e4f8d, 0x0b1dcd4b, 0x48d66bcc, 0xcc8df19f, + 0x8f465718, 0xc43ac538, 0x87f163bf, 0x03aaf9ec, 0x40615f6b, + 0x12f92f94, 0x51328913, 0xd5691340, 0x96a2b5c7, 0xddde27e7, + 0x9e158160, 0x1a4e1b33, 0x5985bdb4, 0x8cb63f72, 0xcf7d99f5, + 0x4b2603a6, 0x08eda521, 0x43913701, 0x005a9186, 0x84010bd5, + 0xc7caad52, 0x6f607e83, 0x2cabd804, 0xa8f04257, 0xeb3be4d0, + 0xa04776f0, 0xe38cd077, 0x67d74a24, 0x241ceca3, 0xf12f6e65, + 0xb2e4c8e2, 0x36bf52b1, 0x7574f436, 0x3e086616, 0x7dc3c091, + 0xf9985ac2, 0xba53fc45, 0x1caecae7, 0x5f656c60, 0xdb3ef633, + 0x98f550b4, 0xd389c294, 0x90426413, 0x1419fe40, 0x57d258c7, + 0x82e1da01, 0xc12a7c86, 0x4571e6d5, 0x06ba4052, 0x4dc6d272, + 0x0e0d74f5, 0x8a56eea6, 0xc99d4821, 0x61379bf0, 0x22fc3d77, + 0xa6a7a724, 0xe56c01a3, 0xae109383, 0xeddb3504, 0x6980af57, + 0x2a4b09d0, 0xff788b16, 0xbcb32d91, 0x38e8b7c2, 0x7b231145, + 0x305f8365, 0x739425e2, 0xf7cfbfb1, 0xb4041936, 0xe69c69c9, + 0xa557cf4e, 0x210c551d, 0x62c7f39a, 0x29bb61ba, 0x6a70c73d, + 0xee2b5d6e, 0xade0fbe9, 0x78d3792f, 0x3b18dfa8, 0xbf4345fb, + 0xfc88e37c, 0xb7f4715c, 0xf43fd7db, 0x70644d88, 0x33afeb0f, + 0x9b0538de, 0xd8ce9e59, 0x5c95040a, 0x1f5ea28d, 0x542230ad, + 0x17e9962a, 0x93b20c79, 0xd079aafe, 0x054a2838, 0x46818ebf, + 0xc2da14ec, 0x8111b26b, 0xca6d204b, 0x89a686cc, 0x0dfd1c9f, + 0x4e36ba18}, + {0x00000000, 0xe1b652ef, 0x836bd405, 0x62dd86ea, 0x06d7a80b, + 0xe761fae4, 0x85bc7c0e, 0x640a2ee1, 0x0cae5117, 0xed1803f8, + 0x8fc58512, 0x6e73d7fd, 0x0a79f91c, 0xebcfabf3, 0x89122d19, + 0x68a47ff6, 0x185ca32e, 0xf9eaf1c1, 0x9b37772b, 0x7a8125c4, + 0x1e8b0b25, 0xff3d59ca, 0x9de0df20, 0x7c568dcf, 0x14f2f239, + 0xf544a0d6, 0x9799263c, 0x762f74d3, 0x12255a32, 0xf39308dd, + 0x914e8e37, 0x70f8dcd8, 0x30b8465d, 0xd10e14b2, 0xb3d39258, + 0x5265c0b7, 0x366fee56, 0xd7d9bcb9, 0xb5043a53, 0x54b268bc, + 0x3c16174a, 0xdda045a5, 0xbf7dc34f, 0x5ecb91a0, 0x3ac1bf41, + 0xdb77edae, 0xb9aa6b44, 0x581c39ab, 0x28e4e573, 0xc952b79c, + 0xab8f3176, 0x4a396399, 0x2e334d78, 0xcf851f97, 0xad58997d, + 0x4ceecb92, 0x244ab464, 0xc5fce68b, 0xa7216061, 0x4697328e, + 0x229d1c6f, 0xc32b4e80, 0xa1f6c86a, 0x40409a85, 0x60708dba, + 0x81c6df55, 0xe31b59bf, 0x02ad0b50, 0x66a725b1, 0x8711775e, + 0xe5ccf1b4, 0x047aa35b, 0x6cdedcad, 0x8d688e42, 0xefb508a8, + 0x0e035a47, 0x6a0974a6, 0x8bbf2649, 0xe962a0a3, 0x08d4f24c, + 0x782c2e94, 0x999a7c7b, 0xfb47fa91, 0x1af1a87e, 0x7efb869f, + 0x9f4dd470, 0xfd90529a, 0x1c260075, 0x74827f83, 0x95342d6c, + 0xf7e9ab86, 0x165ff969, 0x7255d788, 0x93e38567, 0xf13e038d, + 0x10885162, 0x50c8cbe7, 0xb17e9908, 0xd3a31fe2, 0x32154d0d, + 0x561f63ec, 0xb7a93103, 0xd574b7e9, 0x34c2e506, 0x5c669af0, + 0xbdd0c81f, 0xdf0d4ef5, 0x3ebb1c1a, 0x5ab132fb, 0xbb076014, + 0xd9dae6fe, 0x386cb411, 0x489468c9, 0xa9223a26, 0xcbffbccc, + 0x2a49ee23, 0x4e43c0c2, 0xaff5922d, 0xcd2814c7, 0x2c9e4628, + 0x443a39de, 0xa58c6b31, 0xc751eddb, 0x26e7bf34, 0x42ed91d5, + 0xa35bc33a, 0xc18645d0, 0x2030173f, 0x81e66bae, 0x60503941, + 0x028dbfab, 0xe33bed44, 0x8731c3a5, 0x6687914a, 0x045a17a0, + 0xe5ec454f, 0x8d483ab9, 0x6cfe6856, 0x0e23eebc, 0xef95bc53, + 0x8b9f92b2, 0x6a29c05d, 0x08f446b7, 0xe9421458, 0x99bac880, + 0x780c9a6f, 0x1ad11c85, 0xfb674e6a, 0x9f6d608b, 0x7edb3264, + 0x1c06b48e, 0xfdb0e661, 0x95149997, 0x74a2cb78, 0x167f4d92, + 0xf7c91f7d, 0x93c3319c, 0x72756373, 0x10a8e599, 0xf11eb776, + 0xb15e2df3, 0x50e87f1c, 0x3235f9f6, 0xd383ab19, 0xb78985f8, + 0x563fd717, 0x34e251fd, 0xd5540312, 0xbdf07ce4, 0x5c462e0b, + 0x3e9ba8e1, 0xdf2dfa0e, 0xbb27d4ef, 0x5a918600, 0x384c00ea, + 0xd9fa5205, 0xa9028edd, 0x48b4dc32, 0x2a695ad8, 0xcbdf0837, + 0xafd526d6, 0x4e637439, 0x2cbef2d3, 0xcd08a03c, 0xa5acdfca, + 0x441a8d25, 0x26c70bcf, 0xc7715920, 0xa37b77c1, 0x42cd252e, + 0x2010a3c4, 0xc1a6f12b, 0xe196e614, 0x0020b4fb, 0x62fd3211, + 0x834b60fe, 0xe7414e1f, 0x06f71cf0, 0x642a9a1a, 0x859cc8f5, + 0xed38b703, 0x0c8ee5ec, 0x6e536306, 0x8fe531e9, 0xebef1f08, + 0x0a594de7, 0x6884cb0d, 0x893299e2, 0xf9ca453a, 0x187c17d5, + 0x7aa1913f, 0x9b17c3d0, 0xff1ded31, 0x1eabbfde, 0x7c763934, + 0x9dc06bdb, 0xf564142d, 0x14d246c2, 0x760fc028, 0x97b992c7, + 0xf3b3bc26, 0x1205eec9, 0x70d86823, 0x916e3acc, 0xd12ea049, + 0x3098f2a6, 0x5245744c, 0xb3f326a3, 0xd7f90842, 0x364f5aad, + 0x5492dc47, 0xb5248ea8, 0xdd80f15e, 0x3c36a3b1, 0x5eeb255b, + 0xbf5d77b4, 0xdb575955, 0x3ae10bba, 0x583c8d50, 0xb98adfbf, + 0xc9720367, 0x28c45188, 0x4a19d762, 0xabaf858d, 0xcfa5ab6c, + 0x2e13f983, 0x4cce7f69, 0xad782d86, 0xc5dc5270, 0x246a009f, + 0x46b78675, 0xa701d49a, 0xc30bfa7b, 0x22bda894, 0x40602e7e, + 0xa1d67c91}, + {0x00000000, 0x5880e2d7, 0xf106b474, 0xa98656a3, 0xe20d68e9, + 0xba8d8a3e, 0x130bdc9d, 0x4b8b3e4a, 0x851da109, 0xdd9d43de, + 0x741b157d, 0x2c9bf7aa, 0x6710c9e0, 0x3f902b37, 0x96167d94, + 0xce969f43, 0x0a3b4213, 0x52bba0c4, 0xfb3df667, 0xa3bd14b0, + 0xe8362afa, 0xb0b6c82d, 0x19309e8e, 0x41b07c59, 0x8f26e31a, + 0xd7a601cd, 0x7e20576e, 0x26a0b5b9, 0x6d2b8bf3, 0x35ab6924, + 0x9c2d3f87, 0xc4addd50, 0x14768426, 0x4cf666f1, 0xe5703052, + 0xbdf0d285, 0xf67beccf, 0xaefb0e18, 0x077d58bb, 0x5ffdba6c, + 0x916b252f, 0xc9ebc7f8, 0x606d915b, 0x38ed738c, 0x73664dc6, + 0x2be6af11, 0x8260f9b2, 0xdae01b65, 0x1e4dc635, 0x46cd24e2, + 0xef4b7241, 0xb7cb9096, 0xfc40aedc, 0xa4c04c0b, 0x0d461aa8, + 0x55c6f87f, 0x9b50673c, 0xc3d085eb, 0x6a56d348, 0x32d6319f, + 0x795d0fd5, 0x21dded02, 0x885bbba1, 0xd0db5976, 0x28ec084d, + 0x706cea9a, 0xd9eabc39, 0x816a5eee, 0xcae160a4, 0x92618273, + 0x3be7d4d0, 0x63673607, 0xadf1a944, 0xf5714b93, 0x5cf71d30, + 0x0477ffe7, 0x4ffcc1ad, 0x177c237a, 0xbefa75d9, 0xe67a970e, + 0x22d74a5e, 0x7a57a889, 0xd3d1fe2a, 0x8b511cfd, 0xc0da22b7, + 0x985ac060, 0x31dc96c3, 0x695c7414, 0xa7caeb57, 0xff4a0980, + 0x56cc5f23, 0x0e4cbdf4, 0x45c783be, 0x1d476169, 0xb4c137ca, + 0xec41d51d, 0x3c9a8c6b, 0x641a6ebc, 0xcd9c381f, 0x951cdac8, + 0xde97e482, 0x86170655, 0x2f9150f6, 0x7711b221, 0xb9872d62, + 0xe107cfb5, 0x48819916, 0x10017bc1, 0x5b8a458b, 0x030aa75c, + 0xaa8cf1ff, 0xf20c1328, 0x36a1ce78, 0x6e212caf, 0xc7a77a0c, + 0x9f2798db, 0xd4aca691, 0x8c2c4446, 0x25aa12e5, 0x7d2af032, + 0xb3bc6f71, 0xeb3c8da6, 0x42badb05, 0x1a3a39d2, 0x51b10798, + 0x0931e54f, 0xa0b7b3ec, 0xf837513b, 0x50d8119a, 0x0858f34d, + 0xa1dea5ee, 0xf95e4739, 0xb2d57973, 0xea559ba4, 0x43d3cd07, + 0x1b532fd0, 0xd5c5b093, 0x8d455244, 0x24c304e7, 0x7c43e630, + 0x37c8d87a, 0x6f483aad, 0xc6ce6c0e, 0x9e4e8ed9, 0x5ae35389, + 0x0263b15e, 0xabe5e7fd, 0xf365052a, 0xb8ee3b60, 0xe06ed9b7, + 0x49e88f14, 0x11686dc3, 0xdffef280, 0x877e1057, 0x2ef846f4, + 0x7678a423, 0x3df39a69, 0x657378be, 0xccf52e1d, 0x9475ccca, + 0x44ae95bc, 0x1c2e776b, 0xb5a821c8, 0xed28c31f, 0xa6a3fd55, + 0xfe231f82, 0x57a54921, 0x0f25abf6, 0xc1b334b5, 0x9933d662, + 0x30b580c1, 0x68356216, 0x23be5c5c, 0x7b3ebe8b, 0xd2b8e828, + 0x8a380aff, 0x4e95d7af, 0x16153578, 0xbf9363db, 0xe713810c, + 0xac98bf46, 0xf4185d91, 0x5d9e0b32, 0x051ee9e5, 0xcb8876a6, + 0x93089471, 0x3a8ec2d2, 0x620e2005, 0x29851e4f, 0x7105fc98, + 0xd883aa3b, 0x800348ec, 0x783419d7, 0x20b4fb00, 0x8932ada3, + 0xd1b24f74, 0x9a39713e, 0xc2b993e9, 0x6b3fc54a, 0x33bf279d, + 0xfd29b8de, 0xa5a95a09, 0x0c2f0caa, 0x54afee7d, 0x1f24d037, + 0x47a432e0, 0xee226443, 0xb6a28694, 0x720f5bc4, 0x2a8fb913, + 0x8309efb0, 0xdb890d67, 0x9002332d, 0xc882d1fa, 0x61048759, + 0x3984658e, 0xf712facd, 0xaf92181a, 0x06144eb9, 0x5e94ac6e, + 0x151f9224, 0x4d9f70f3, 0xe4192650, 0xbc99c487, 0x6c429df1, + 0x34c27f26, 0x9d442985, 0xc5c4cb52, 0x8e4ff518, 0xd6cf17cf, + 0x7f49416c, 0x27c9a3bb, 0xe95f3cf8, 0xb1dfde2f, 0x1859888c, + 0x40d96a5b, 0x0b525411, 0x53d2b6c6, 0xfa54e065, 0xa2d402b2, + 0x6679dfe2, 0x3ef93d35, 0x977f6b96, 0xcfff8941, 0x8474b70b, + 0xdcf455dc, 0x7572037f, 0x2df2e1a8, 0xe3647eeb, 0xbbe49c3c, + 0x1262ca9f, 0x4ae22848, 0x01691602, 0x59e9f4d5, 0xf06fa276, + 0xa8ef40a1}, + {0x00000000, 0x463b6765, 0x8c76ceca, 0xca4da9af, 0x59ebed4e, + 0x1fd08a2b, 0xd59d2384, 0x93a644e1, 0xb2d6db9d, 0xf4edbcf8, + 0x3ea01557, 0x789b7232, 0xeb3d36d3, 0xad0651b6, 0x674bf819, + 0x21709f7c, 0x25abc6e0, 0x6390a185, 0xa9dd082a, 0xefe66f4f, + 0x7c402bae, 0x3a7b4ccb, 0xf036e564, 0xb60d8201, 0x977d1d7d, + 0xd1467a18, 0x1b0bd3b7, 0x5d30b4d2, 0xce96f033, 0x88ad9756, + 0x42e03ef9, 0x04db599c, 0x0b50fc1a, 0x4d6b9b7f, 0x872632d0, + 0xc11d55b5, 0x52bb1154, 0x14807631, 0xdecddf9e, 0x98f6b8fb, + 0xb9862787, 0xffbd40e2, 0x35f0e94d, 0x73cb8e28, 0xe06dcac9, + 0xa656adac, 0x6c1b0403, 0x2a206366, 0x2efb3afa, 0x68c05d9f, + 0xa28df430, 0xe4b69355, 0x7710d7b4, 0x312bb0d1, 0xfb66197e, + 0xbd5d7e1b, 0x9c2de167, 0xda168602, 0x105b2fad, 0x566048c8, + 0xc5c60c29, 0x83fd6b4c, 0x49b0c2e3, 0x0f8ba586, 0x16a0f835, + 0x509b9f50, 0x9ad636ff, 0xdced519a, 0x4f4b157b, 0x0970721e, + 0xc33ddbb1, 0x8506bcd4, 0xa47623a8, 0xe24d44cd, 0x2800ed62, + 0x6e3b8a07, 0xfd9dcee6, 0xbba6a983, 0x71eb002c, 0x37d06749, + 0x330b3ed5, 0x753059b0, 0xbf7df01f, 0xf946977a, 0x6ae0d39b, + 0x2cdbb4fe, 0xe6961d51, 0xa0ad7a34, 0x81dde548, 0xc7e6822d, + 0x0dab2b82, 0x4b904ce7, 0xd8360806, 0x9e0d6f63, 0x5440c6cc, + 0x127ba1a9, 0x1df0042f, 0x5bcb634a, 0x9186cae5, 0xd7bdad80, + 0x441be961, 0x02208e04, 0xc86d27ab, 0x8e5640ce, 0xaf26dfb2, + 0xe91db8d7, 0x23501178, 0x656b761d, 0xf6cd32fc, 0xb0f65599, + 0x7abbfc36, 0x3c809b53, 0x385bc2cf, 0x7e60a5aa, 0xb42d0c05, + 0xf2166b60, 0x61b02f81, 0x278b48e4, 0xedc6e14b, 0xabfd862e, + 0x8a8d1952, 0xccb67e37, 0x06fbd798, 0x40c0b0fd, 0xd366f41c, + 0x955d9379, 0x5f103ad6, 0x192b5db3, 0x2c40f16b, 0x6a7b960e, + 0xa0363fa1, 0xe60d58c4, 0x75ab1c25, 0x33907b40, 0xf9ddd2ef, + 0xbfe6b58a, 0x9e962af6, 0xd8ad4d93, 0x12e0e43c, 0x54db8359, + 0xc77dc7b8, 0x8146a0dd, 0x4b0b0972, 0x0d306e17, 0x09eb378b, + 0x4fd050ee, 0x859df941, 0xc3a69e24, 0x5000dac5, 0x163bbda0, + 0xdc76140f, 0x9a4d736a, 0xbb3dec16, 0xfd068b73, 0x374b22dc, + 0x717045b9, 0xe2d60158, 0xa4ed663d, 0x6ea0cf92, 0x289ba8f7, + 0x27100d71, 0x612b6a14, 0xab66c3bb, 0xed5da4de, 0x7efbe03f, + 0x38c0875a, 0xf28d2ef5, 0xb4b64990, 0x95c6d6ec, 0xd3fdb189, + 0x19b01826, 0x5f8b7f43, 0xcc2d3ba2, 0x8a165cc7, 0x405bf568, + 0x0660920d, 0x02bbcb91, 0x4480acf4, 0x8ecd055b, 0xc8f6623e, + 0x5b5026df, 0x1d6b41ba, 0xd726e815, 0x911d8f70, 0xb06d100c, + 0xf6567769, 0x3c1bdec6, 0x7a20b9a3, 0xe986fd42, 0xafbd9a27, + 0x65f03388, 0x23cb54ed, 0x3ae0095e, 0x7cdb6e3b, 0xb696c794, + 0xf0ada0f1, 0x630be410, 0x25308375, 0xef7d2ada, 0xa9464dbf, + 0x8836d2c3, 0xce0db5a6, 0x04401c09, 0x427b7b6c, 0xd1dd3f8d, + 0x97e658e8, 0x5dabf147, 0x1b909622, 0x1f4bcfbe, 0x5970a8db, + 0x933d0174, 0xd5066611, 0x46a022f0, 0x009b4595, 0xcad6ec3a, + 0x8ced8b5f, 0xad9d1423, 0xeba67346, 0x21ebdae9, 0x67d0bd8c, + 0xf476f96d, 0xb24d9e08, 0x780037a7, 0x3e3b50c2, 0x31b0f544, + 0x778b9221, 0xbdc63b8e, 0xfbfd5ceb, 0x685b180a, 0x2e607f6f, + 0xe42dd6c0, 0xa216b1a5, 0x83662ed9, 0xc55d49bc, 0x0f10e013, + 0x492b8776, 0xda8dc397, 0x9cb6a4f2, 0x56fb0d5d, 0x10c06a38, + 0x141b33a4, 0x522054c1, 0x986dfd6e, 0xde569a0b, 0x4df0deea, + 0x0bcbb98f, 0xc1861020, 0x87bd7745, 0xa6cde839, 0xe0f68f5c, + 0x2abb26f3, 0x6c804196, 0xff260577, 0xb91d6212, 0x7350cbbd, + 0x356bacd8}}; + +#endif + +#endif + +#if N == 6 + +#if W == 8 + +local const z_crc_t FAR crc_braid_table[][256] = { + {0x00000000, 0x3db1ecdc, 0x7b63d9b8, 0x46d23564, 0xf6c7b370, + 0xcb765fac, 0x8da46ac8, 0xb0158614, 0x36fe60a1, 0x0b4f8c7d, + 0x4d9db919, 0x702c55c5, 0xc039d3d1, 0xfd883f0d, 0xbb5a0a69, + 0x86ebe6b5, 0x6dfcc142, 0x504d2d9e, 0x169f18fa, 0x2b2ef426, + 0x9b3b7232, 0xa68a9eee, 0xe058ab8a, 0xdde94756, 0x5b02a1e3, + 0x66b34d3f, 0x2061785b, 0x1dd09487, 0xadc51293, 0x9074fe4f, + 0xd6a6cb2b, 0xeb1727f7, 0xdbf98284, 0xe6486e58, 0xa09a5b3c, + 0x9d2bb7e0, 0x2d3e31f4, 0x108fdd28, 0x565de84c, 0x6bec0490, + 0xed07e225, 0xd0b60ef9, 0x96643b9d, 0xabd5d741, 0x1bc05155, + 0x2671bd89, 0x60a388ed, 0x5d126431, 0xb60543c6, 0x8bb4af1a, + 0xcd669a7e, 0xf0d776a2, 0x40c2f0b6, 0x7d731c6a, 0x3ba1290e, + 0x0610c5d2, 0x80fb2367, 0xbd4acfbb, 0xfb98fadf, 0xc6291603, + 0x763c9017, 0x4b8d7ccb, 0x0d5f49af, 0x30eea573, 0x6c820349, + 0x5133ef95, 0x17e1daf1, 0x2a50362d, 0x9a45b039, 0xa7f45ce5, + 0xe1266981, 0xdc97855d, 0x5a7c63e8, 0x67cd8f34, 0x211fba50, + 0x1cae568c, 0xacbbd098, 0x910a3c44, 0xd7d80920, 0xea69e5fc, + 0x017ec20b, 0x3ccf2ed7, 0x7a1d1bb3, 0x47acf76f, 0xf7b9717b, + 0xca089da7, 0x8cdaa8c3, 0xb16b441f, 0x3780a2aa, 0x0a314e76, + 0x4ce37b12, 0x715297ce, 0xc14711da, 0xfcf6fd06, 0xba24c862, + 0x879524be, 0xb77b81cd, 0x8aca6d11, 0xcc185875, 0xf1a9b4a9, + 0x41bc32bd, 0x7c0dde61, 0x3adfeb05, 0x076e07d9, 0x8185e16c, + 0xbc340db0, 0xfae638d4, 0xc757d408, 0x7742521c, 0x4af3bec0, + 0x0c218ba4, 0x31906778, 0xda87408f, 0xe736ac53, 0xa1e49937, + 0x9c5575eb, 0x2c40f3ff, 0x11f11f23, 0x57232a47, 0x6a92c69b, + 0xec79202e, 0xd1c8ccf2, 0x971af996, 0xaaab154a, 0x1abe935e, + 0x270f7f82, 0x61dd4ae6, 0x5c6ca63a, 0xd9040692, 0xe4b5ea4e, + 0xa267df2a, 0x9fd633f6, 0x2fc3b5e2, 0x1272593e, 0x54a06c5a, + 0x69118086, 0xeffa6633, 0xd24b8aef, 0x9499bf8b, 0xa9285357, + 0x193dd543, 0x248c399f, 0x625e0cfb, 0x5fefe027, 0xb4f8c7d0, + 0x89492b0c, 0xcf9b1e68, 0xf22af2b4, 0x423f74a0, 0x7f8e987c, + 0x395cad18, 0x04ed41c4, 0x8206a771, 0xbfb74bad, 0xf9657ec9, + 0xc4d49215, 0x74c11401, 0x4970f8dd, 0x0fa2cdb9, 0x32132165, + 0x02fd8416, 0x3f4c68ca, 0x799e5dae, 0x442fb172, 0xf43a3766, + 0xc98bdbba, 0x8f59eede, 0xb2e80202, 0x3403e4b7, 0x09b2086b, + 0x4f603d0f, 0x72d1d1d3, 0xc2c457c7, 0xff75bb1b, 0xb9a78e7f, + 0x841662a3, 0x6f014554, 0x52b0a988, 0x14629cec, 0x29d37030, + 0x99c6f624, 0xa4771af8, 0xe2a52f9c, 0xdf14c340, 0x59ff25f5, + 0x644ec929, 0x229cfc4d, 0x1f2d1091, 0xaf389685, 0x92897a59, + 0xd45b4f3d, 0xe9eaa3e1, 0xb58605db, 0x8837e907, 0xcee5dc63, + 0xf35430bf, 0x4341b6ab, 0x7ef05a77, 0x38226f13, 0x059383cf, + 0x8378657a, 0xbec989a6, 0xf81bbcc2, 0xc5aa501e, 0x75bfd60a, + 0x480e3ad6, 0x0edc0fb2, 0x336de36e, 0xd87ac499, 0xe5cb2845, + 0xa3191d21, 0x9ea8f1fd, 0x2ebd77e9, 0x130c9b35, 0x55deae51, + 0x686f428d, 0xee84a438, 0xd33548e4, 0x95e77d80, 0xa856915c, + 0x18431748, 0x25f2fb94, 0x6320cef0, 0x5e91222c, 0x6e7f875f, + 0x53ce6b83, 0x151c5ee7, 0x28adb23b, 0x98b8342f, 0xa509d8f3, + 0xe3dbed97, 0xde6a014b, 0x5881e7fe, 0x65300b22, 0x23e23e46, + 0x1e53d29a, 0xae46548e, 0x93f7b852, 0xd5258d36, 0xe89461ea, + 0x0383461d, 0x3e32aac1, 0x78e09fa5, 0x45517379, 0xf544f56d, + 0xc8f519b1, 0x8e272cd5, 0xb396c009, 0x357d26bc, 0x08ccca60, + 0x4e1eff04, 0x73af13d8, 0xc3ba95cc, 0xfe0b7910, 0xb8d94c74, + 0x8568a0a8}, + {0x00000000, 0x69790b65, 0xd2f216ca, 0xbb8b1daf, 0x7e952bd5, + 0x17ec20b0, 0xac673d1f, 0xc51e367a, 0xfd2a57aa, 0x94535ccf, + 0x2fd84160, 0x46a14a05, 0x83bf7c7f, 0xeac6771a, 0x514d6ab5, + 0x383461d0, 0x2125a915, 0x485ca270, 0xf3d7bfdf, 0x9aaeb4ba, + 0x5fb082c0, 0x36c989a5, 0x8d42940a, 0xe43b9f6f, 0xdc0ffebf, + 0xb576f5da, 0x0efde875, 0x6784e310, 0xa29ad56a, 0xcbe3de0f, + 0x7068c3a0, 0x1911c8c5, 0x424b522a, 0x2b32594f, 0x90b944e0, + 0xf9c04f85, 0x3cde79ff, 0x55a7729a, 0xee2c6f35, 0x87556450, + 0xbf610580, 0xd6180ee5, 0x6d93134a, 0x04ea182f, 0xc1f42e55, + 0xa88d2530, 0x1306389f, 0x7a7f33fa, 0x636efb3f, 0x0a17f05a, + 0xb19cedf5, 0xd8e5e690, 0x1dfbd0ea, 0x7482db8f, 0xcf09c620, + 0xa670cd45, 0x9e44ac95, 0xf73da7f0, 0x4cb6ba5f, 0x25cfb13a, + 0xe0d18740, 0x89a88c25, 0x3223918a, 0x5b5a9aef, 0x8496a454, + 0xedefaf31, 0x5664b29e, 0x3f1db9fb, 0xfa038f81, 0x937a84e4, + 0x28f1994b, 0x4188922e, 0x79bcf3fe, 0x10c5f89b, 0xab4ee534, + 0xc237ee51, 0x0729d82b, 0x6e50d34e, 0xd5dbcee1, 0xbca2c584, + 0xa5b30d41, 0xccca0624, 0x77411b8b, 0x1e3810ee, 0xdb262694, + 0xb25f2df1, 0x09d4305e, 0x60ad3b3b, 0x58995aeb, 0x31e0518e, + 0x8a6b4c21, 0xe3124744, 0x260c713e, 0x4f757a5b, 0xf4fe67f4, + 0x9d876c91, 0xc6ddf67e, 0xafa4fd1b, 0x142fe0b4, 0x7d56ebd1, + 0xb848ddab, 0xd131d6ce, 0x6abacb61, 0x03c3c004, 0x3bf7a1d4, + 0x528eaab1, 0xe905b71e, 0x807cbc7b, 0x45628a01, 0x2c1b8164, + 0x97909ccb, 0xfee997ae, 0xe7f85f6b, 0x8e81540e, 0x350a49a1, + 0x5c7342c4, 0x996d74be, 0xf0147fdb, 0x4b9f6274, 0x22e66911, + 0x1ad208c1, 0x73ab03a4, 0xc8201e0b, 0xa159156e, 0x64472314, + 0x0d3e2871, 0xb6b535de, 0xdfcc3ebb, 0xd25c4ee9, 0xbb25458c, + 0x00ae5823, 0x69d75346, 0xacc9653c, 0xc5b06e59, 0x7e3b73f6, + 0x17427893, 0x2f761943, 0x460f1226, 0xfd840f89, 0x94fd04ec, + 0x51e33296, 0x389a39f3, 0x8311245c, 0xea682f39, 0xf379e7fc, + 0x9a00ec99, 0x218bf136, 0x48f2fa53, 0x8deccc29, 0xe495c74c, + 0x5f1edae3, 0x3667d186, 0x0e53b056, 0x672abb33, 0xdca1a69c, + 0xb5d8adf9, 0x70c69b83, 0x19bf90e6, 0xa2348d49, 0xcb4d862c, + 0x90171cc3, 0xf96e17a6, 0x42e50a09, 0x2b9c016c, 0xee823716, + 0x87fb3c73, 0x3c7021dc, 0x55092ab9, 0x6d3d4b69, 0x0444400c, + 0xbfcf5da3, 0xd6b656c6, 0x13a860bc, 0x7ad16bd9, 0xc15a7676, + 0xa8237d13, 0xb132b5d6, 0xd84bbeb3, 0x63c0a31c, 0x0ab9a879, + 0xcfa79e03, 0xa6de9566, 0x1d5588c9, 0x742c83ac, 0x4c18e27c, + 0x2561e919, 0x9eeaf4b6, 0xf793ffd3, 0x328dc9a9, 0x5bf4c2cc, + 0xe07fdf63, 0x8906d406, 0x56caeabd, 0x3fb3e1d8, 0x8438fc77, + 0xed41f712, 0x285fc168, 0x4126ca0d, 0xfaadd7a2, 0x93d4dcc7, + 0xabe0bd17, 0xc299b672, 0x7912abdd, 0x106ba0b8, 0xd57596c2, + 0xbc0c9da7, 0x07878008, 0x6efe8b6d, 0x77ef43a8, 0x1e9648cd, + 0xa51d5562, 0xcc645e07, 0x097a687d, 0x60036318, 0xdb887eb7, + 0xb2f175d2, 0x8ac51402, 0xe3bc1f67, 0x583702c8, 0x314e09ad, + 0xf4503fd7, 0x9d2934b2, 0x26a2291d, 0x4fdb2278, 0x1481b897, + 0x7df8b3f2, 0xc673ae5d, 0xaf0aa538, 0x6a149342, 0x036d9827, + 0xb8e68588, 0xd19f8eed, 0xe9abef3d, 0x80d2e458, 0x3b59f9f7, + 0x5220f292, 0x973ec4e8, 0xfe47cf8d, 0x45ccd222, 0x2cb5d947, + 0x35a41182, 0x5cdd1ae7, 0xe7560748, 0x8e2f0c2d, 0x4b313a57, + 0x22483132, 0x99c32c9d, 0xf0ba27f8, 0xc88e4628, 0xa1f74d4d, + 0x1a7c50e2, 0x73055b87, 0xb61b6dfd, 0xdf626698, 0x64e97b37, + 0x0d907052}, + {0x00000000, 0x7fc99b93, 0xff933726, 0x805aacb5, 0x2457680d, + 0x5b9ef39e, 0xdbc45f2b, 0xa40dc4b8, 0x48aed01a, 0x37674b89, + 0xb73de73c, 0xc8f47caf, 0x6cf9b817, 0x13302384, 0x936a8f31, + 0xeca314a2, 0x915da034, 0xee943ba7, 0x6ece9712, 0x11070c81, + 0xb50ac839, 0xcac353aa, 0x4a99ff1f, 0x3550648c, 0xd9f3702e, + 0xa63aebbd, 0x26604708, 0x59a9dc9b, 0xfda41823, 0x826d83b0, + 0x02372f05, 0x7dfeb496, 0xf9ca4629, 0x8603ddba, 0x0659710f, + 0x7990ea9c, 0xdd9d2e24, 0xa254b5b7, 0x220e1902, 0x5dc78291, + 0xb1649633, 0xcead0da0, 0x4ef7a115, 0x313e3a86, 0x9533fe3e, + 0xeafa65ad, 0x6aa0c918, 0x1569528b, 0x6897e61d, 0x175e7d8e, + 0x9704d13b, 0xe8cd4aa8, 0x4cc08e10, 0x33091583, 0xb353b936, + 0xcc9a22a5, 0x20393607, 0x5ff0ad94, 0xdfaa0121, 0xa0639ab2, + 0x046e5e0a, 0x7ba7c599, 0xfbfd692c, 0x8434f2bf, 0x28e58a13, + 0x572c1180, 0xd776bd35, 0xa8bf26a6, 0x0cb2e21e, 0x737b798d, + 0xf321d538, 0x8ce84eab, 0x604b5a09, 0x1f82c19a, 0x9fd86d2f, + 0xe011f6bc, 0x441c3204, 0x3bd5a997, 0xbb8f0522, 0xc4469eb1, + 0xb9b82a27, 0xc671b1b4, 0x462b1d01, 0x39e28692, 0x9def422a, + 0xe226d9b9, 0x627c750c, 0x1db5ee9f, 0xf116fa3d, 0x8edf61ae, + 0x0e85cd1b, 0x714c5688, 0xd5419230, 0xaa8809a3, 0x2ad2a516, + 0x551b3e85, 0xd12fcc3a, 0xaee657a9, 0x2ebcfb1c, 0x5175608f, + 0xf578a437, 0x8ab13fa4, 0x0aeb9311, 0x75220882, 0x99811c20, + 0xe64887b3, 0x66122b06, 0x19dbb095, 0xbdd6742d, 0xc21fefbe, + 0x4245430b, 0x3d8cd898, 0x40726c0e, 0x3fbbf79d, 0xbfe15b28, + 0xc028c0bb, 0x64250403, 0x1bec9f90, 0x9bb63325, 0xe47fa8b6, + 0x08dcbc14, 0x77152787, 0xf74f8b32, 0x888610a1, 0x2c8bd419, + 0x53424f8a, 0xd318e33f, 0xacd178ac, 0x51cb1426, 0x2e028fb5, + 0xae582300, 0xd191b893, 0x759c7c2b, 0x0a55e7b8, 0x8a0f4b0d, + 0xf5c6d09e, 0x1965c43c, 0x66ac5faf, 0xe6f6f31a, 0x993f6889, + 0x3d32ac31, 0x42fb37a2, 0xc2a19b17, 0xbd680084, 0xc096b412, + 0xbf5f2f81, 0x3f058334, 0x40cc18a7, 0xe4c1dc1f, 0x9b08478c, + 0x1b52eb39, 0x649b70aa, 0x88386408, 0xf7f1ff9b, 0x77ab532e, + 0x0862c8bd, 0xac6f0c05, 0xd3a69796, 0x53fc3b23, 0x2c35a0b0, + 0xa801520f, 0xd7c8c99c, 0x57926529, 0x285bfeba, 0x8c563a02, + 0xf39fa191, 0x73c50d24, 0x0c0c96b7, 0xe0af8215, 0x9f661986, + 0x1f3cb533, 0x60f52ea0, 0xc4f8ea18, 0xbb31718b, 0x3b6bdd3e, + 0x44a246ad, 0x395cf23b, 0x469569a8, 0xc6cfc51d, 0xb9065e8e, + 0x1d0b9a36, 0x62c201a5, 0xe298ad10, 0x9d513683, 0x71f22221, + 0x0e3bb9b2, 0x8e611507, 0xf1a88e94, 0x55a54a2c, 0x2a6cd1bf, + 0xaa367d0a, 0xd5ffe699, 0x792e9e35, 0x06e705a6, 0x86bda913, + 0xf9743280, 0x5d79f638, 0x22b06dab, 0xa2eac11e, 0xdd235a8d, + 0x31804e2f, 0x4e49d5bc, 0xce137909, 0xb1dae29a, 0x15d72622, + 0x6a1ebdb1, 0xea441104, 0x958d8a97, 0xe8733e01, 0x97baa592, + 0x17e00927, 0x682992b4, 0xcc24560c, 0xb3edcd9f, 0x33b7612a, + 0x4c7efab9, 0xa0ddee1b, 0xdf147588, 0x5f4ed93d, 0x208742ae, + 0x848a8616, 0xfb431d85, 0x7b19b130, 0x04d02aa3, 0x80e4d81c, + 0xff2d438f, 0x7f77ef3a, 0x00be74a9, 0xa4b3b011, 0xdb7a2b82, + 0x5b208737, 0x24e91ca4, 0xc84a0806, 0xb7839395, 0x37d93f20, + 0x4810a4b3, 0xec1d600b, 0x93d4fb98, 0x138e572d, 0x6c47ccbe, + 0x11b97828, 0x6e70e3bb, 0xee2a4f0e, 0x91e3d49d, 0x35ee1025, + 0x4a278bb6, 0xca7d2703, 0xb5b4bc90, 0x5917a832, 0x26de33a1, + 0xa6849f14, 0xd94d0487, 0x7d40c03f, 0x02895bac, 0x82d3f719, + 0xfd1a6c8a}, + {0x00000000, 0xa396284c, 0x9c5d56d9, 0x3fcb7e95, 0xe3cbabf3, + 0x405d83bf, 0x7f96fd2a, 0xdc00d566, 0x1ce651a7, 0xbf7079eb, + 0x80bb077e, 0x232d2f32, 0xff2dfa54, 0x5cbbd218, 0x6370ac8d, + 0xc0e684c1, 0x39cca34e, 0x9a5a8b02, 0xa591f597, 0x0607dddb, + 0xda0708bd, 0x799120f1, 0x465a5e64, 0xe5cc7628, 0x252af2e9, + 0x86bcdaa5, 0xb977a430, 0x1ae18c7c, 0xc6e1591a, 0x65777156, + 0x5abc0fc3, 0xf92a278f, 0x7399469c, 0xd00f6ed0, 0xefc41045, + 0x4c523809, 0x9052ed6f, 0x33c4c523, 0x0c0fbbb6, 0xaf9993fa, + 0x6f7f173b, 0xcce93f77, 0xf32241e2, 0x50b469ae, 0x8cb4bcc8, + 0x2f229484, 0x10e9ea11, 0xb37fc25d, 0x4a55e5d2, 0xe9c3cd9e, + 0xd608b30b, 0x759e9b47, 0xa99e4e21, 0x0a08666d, 0x35c318f8, + 0x965530b4, 0x56b3b475, 0xf5259c39, 0xcaeee2ac, 0x6978cae0, + 0xb5781f86, 0x16ee37ca, 0x2925495f, 0x8ab36113, 0xe7328d38, + 0x44a4a574, 0x7b6fdbe1, 0xd8f9f3ad, 0x04f926cb, 0xa76f0e87, + 0x98a47012, 0x3b32585e, 0xfbd4dc9f, 0x5842f4d3, 0x67898a46, + 0xc41fa20a, 0x181f776c, 0xbb895f20, 0x844221b5, 0x27d409f9, + 0xdefe2e76, 0x7d68063a, 0x42a378af, 0xe13550e3, 0x3d358585, + 0x9ea3adc9, 0xa168d35c, 0x02fefb10, 0xc2187fd1, 0x618e579d, + 0x5e452908, 0xfdd30144, 0x21d3d422, 0x8245fc6e, 0xbd8e82fb, + 0x1e18aab7, 0x94abcba4, 0x373de3e8, 0x08f69d7d, 0xab60b531, + 0x77606057, 0xd4f6481b, 0xeb3d368e, 0x48ab1ec2, 0x884d9a03, + 0x2bdbb24f, 0x1410ccda, 0xb786e496, 0x6b8631f0, 0xc81019bc, + 0xf7db6729, 0x544d4f65, 0xad6768ea, 0x0ef140a6, 0x313a3e33, + 0x92ac167f, 0x4eacc319, 0xed3aeb55, 0xd2f195c0, 0x7167bd8c, + 0xb181394d, 0x12171101, 0x2ddc6f94, 0x8e4a47d8, 0x524a92be, + 0xf1dcbaf2, 0xce17c467, 0x6d81ec2b, 0x15141c31, 0xb682347d, + 0x89494ae8, 0x2adf62a4, 0xf6dfb7c2, 0x55499f8e, 0x6a82e11b, + 0xc914c957, 0x09f24d96, 0xaa6465da, 0x95af1b4f, 0x36393303, + 0xea39e665, 0x49afce29, 0x7664b0bc, 0xd5f298f0, 0x2cd8bf7f, + 0x8f4e9733, 0xb085e9a6, 0x1313c1ea, 0xcf13148c, 0x6c853cc0, + 0x534e4255, 0xf0d86a19, 0x303eeed8, 0x93a8c694, 0xac63b801, + 0x0ff5904d, 0xd3f5452b, 0x70636d67, 0x4fa813f2, 0xec3e3bbe, + 0x668d5aad, 0xc51b72e1, 0xfad00c74, 0x59462438, 0x8546f15e, + 0x26d0d912, 0x191ba787, 0xba8d8fcb, 0x7a6b0b0a, 0xd9fd2346, + 0xe6365dd3, 0x45a0759f, 0x99a0a0f9, 0x3a3688b5, 0x05fdf620, + 0xa66bde6c, 0x5f41f9e3, 0xfcd7d1af, 0xc31caf3a, 0x608a8776, + 0xbc8a5210, 0x1f1c7a5c, 0x20d704c9, 0x83412c85, 0x43a7a844, + 0xe0318008, 0xdffafe9d, 0x7c6cd6d1, 0xa06c03b7, 0x03fa2bfb, + 0x3c31556e, 0x9fa77d22, 0xf2269109, 0x51b0b945, 0x6e7bc7d0, + 0xcdedef9c, 0x11ed3afa, 0xb27b12b6, 0x8db06c23, 0x2e26446f, + 0xeec0c0ae, 0x4d56e8e2, 0x729d9677, 0xd10bbe3b, 0x0d0b6b5d, + 0xae9d4311, 0x91563d84, 0x32c015c8, 0xcbea3247, 0x687c1a0b, + 0x57b7649e, 0xf4214cd2, 0x282199b4, 0x8bb7b1f8, 0xb47ccf6d, + 0x17eae721, 0xd70c63e0, 0x749a4bac, 0x4b513539, 0xe8c71d75, + 0x34c7c813, 0x9751e05f, 0xa89a9eca, 0x0b0cb686, 0x81bfd795, + 0x2229ffd9, 0x1de2814c, 0xbe74a900, 0x62747c66, 0xc1e2542a, + 0xfe292abf, 0x5dbf02f3, 0x9d598632, 0x3ecfae7e, 0x0104d0eb, + 0xa292f8a7, 0x7e922dc1, 0xdd04058d, 0xe2cf7b18, 0x41595354, + 0xb87374db, 0x1be55c97, 0x242e2202, 0x87b80a4e, 0x5bb8df28, + 0xf82ef764, 0xc7e589f1, 0x6473a1bd, 0xa495257c, 0x07030d30, + 0x38c873a5, 0x9b5e5be9, 0x475e8e8f, 0xe4c8a6c3, 0xdb03d856, + 0x7895f01a}, + {0x00000000, 0x2a283862, 0x545070c4, 0x7e7848a6, 0xa8a0e188, + 0x8288d9ea, 0xfcf0914c, 0xd6d8a92e, 0x8a30c551, 0xa018fd33, + 0xde60b595, 0xf4488df7, 0x229024d9, 0x08b81cbb, 0x76c0541d, + 0x5ce86c7f, 0xcf108ce3, 0xe538b481, 0x9b40fc27, 0xb168c445, + 0x67b06d6b, 0x4d985509, 0x33e01daf, 0x19c825cd, 0x452049b2, + 0x6f0871d0, 0x11703976, 0x3b580114, 0xed80a83a, 0xc7a89058, + 0xb9d0d8fe, 0x93f8e09c, 0x45501f87, 0x6f7827e5, 0x11006f43, + 0x3b285721, 0xedf0fe0f, 0xc7d8c66d, 0xb9a08ecb, 0x9388b6a9, + 0xcf60dad6, 0xe548e2b4, 0x9b30aa12, 0xb1189270, 0x67c03b5e, + 0x4de8033c, 0x33904b9a, 0x19b873f8, 0x8a409364, 0xa068ab06, + 0xde10e3a0, 0xf438dbc2, 0x22e072ec, 0x08c84a8e, 0x76b00228, + 0x5c983a4a, 0x00705635, 0x2a586e57, 0x542026f1, 0x7e081e93, + 0xa8d0b7bd, 0x82f88fdf, 0xfc80c779, 0xd6a8ff1b, 0x8aa03f0e, + 0xa088076c, 0xdef04fca, 0xf4d877a8, 0x2200de86, 0x0828e6e4, + 0x7650ae42, 0x5c789620, 0x0090fa5f, 0x2ab8c23d, 0x54c08a9b, + 0x7ee8b2f9, 0xa8301bd7, 0x821823b5, 0xfc606b13, 0xd6485371, + 0x45b0b3ed, 0x6f988b8f, 0x11e0c329, 0x3bc8fb4b, 0xed105265, + 0xc7386a07, 0xb94022a1, 0x93681ac3, 0xcf8076bc, 0xe5a84ede, + 0x9bd00678, 0xb1f83e1a, 0x67209734, 0x4d08af56, 0x3370e7f0, + 0x1958df92, 0xcff02089, 0xe5d818eb, 0x9ba0504d, 0xb188682f, + 0x6750c101, 0x4d78f963, 0x3300b1c5, 0x192889a7, 0x45c0e5d8, + 0x6fe8ddba, 0x1190951c, 0x3bb8ad7e, 0xed600450, 0xc7483c32, + 0xb9307494, 0x93184cf6, 0x00e0ac6a, 0x2ac89408, 0x54b0dcae, + 0x7e98e4cc, 0xa8404de2, 0x82687580, 0xfc103d26, 0xd6380544, + 0x8ad0693b, 0xa0f85159, 0xde8019ff, 0xf4a8219d, 0x227088b3, + 0x0858b0d1, 0x7620f877, 0x5c08c015, 0xce31785d, 0xe419403f, + 0x9a610899, 0xb04930fb, 0x669199d5, 0x4cb9a1b7, 0x32c1e911, + 0x18e9d173, 0x4401bd0c, 0x6e29856e, 0x1051cdc8, 0x3a79f5aa, + 0xeca15c84, 0xc68964e6, 0xb8f12c40, 0x92d91422, 0x0121f4be, + 0x2b09ccdc, 0x5571847a, 0x7f59bc18, 0xa9811536, 0x83a92d54, + 0xfdd165f2, 0xd7f95d90, 0x8b1131ef, 0xa139098d, 0xdf41412b, + 0xf5697949, 0x23b1d067, 0x0999e805, 0x77e1a0a3, 0x5dc998c1, + 0x8b6167da, 0xa1495fb8, 0xdf31171e, 0xf5192f7c, 0x23c18652, + 0x09e9be30, 0x7791f696, 0x5db9cef4, 0x0151a28b, 0x2b799ae9, + 0x5501d24f, 0x7f29ea2d, 0xa9f14303, 0x83d97b61, 0xfda133c7, + 0xd7890ba5, 0x4471eb39, 0x6e59d35b, 0x10219bfd, 0x3a09a39f, + 0xecd10ab1, 0xc6f932d3, 0xb8817a75, 0x92a94217, 0xce412e68, + 0xe469160a, 0x9a115eac, 0xb03966ce, 0x66e1cfe0, 0x4cc9f782, + 0x32b1bf24, 0x18998746, 0x44914753, 0x6eb97f31, 0x10c13797, + 0x3ae90ff5, 0xec31a6db, 0xc6199eb9, 0xb861d61f, 0x9249ee7d, + 0xcea18202, 0xe489ba60, 0x9af1f2c6, 0xb0d9caa4, 0x6601638a, + 0x4c295be8, 0x3251134e, 0x18792b2c, 0x8b81cbb0, 0xa1a9f3d2, + 0xdfd1bb74, 0xf5f98316, 0x23212a38, 0x0909125a, 0x77715afc, + 0x5d59629e, 0x01b10ee1, 0x2b993683, 0x55e17e25, 0x7fc94647, + 0xa911ef69, 0x8339d70b, 0xfd419fad, 0xd769a7cf, 0x01c158d4, + 0x2be960b6, 0x55912810, 0x7fb91072, 0xa961b95c, 0x8349813e, + 0xfd31c998, 0xd719f1fa, 0x8bf19d85, 0xa1d9a5e7, 0xdfa1ed41, + 0xf589d523, 0x23517c0d, 0x0979446f, 0x77010cc9, 0x5d2934ab, + 0xced1d437, 0xe4f9ec55, 0x9a81a4f3, 0xb0a99c91, 0x667135bf, + 0x4c590ddd, 0x3221457b, 0x18097d19, 0x44e11166, 0x6ec92904, + 0x10b161a2, 0x3a9959c0, 0xec41f0ee, 0xc669c88c, 0xb811802a, + 0x9239b848}, + {0x00000000, 0x4713f6fb, 0x8e27edf6, 0xc9341b0d, 0xc73eddad, + 0x802d2b56, 0x4919305b, 0x0e0ac6a0, 0x550cbd1b, 0x121f4be0, + 0xdb2b50ed, 0x9c38a616, 0x923260b6, 0xd521964d, 0x1c158d40, + 0x5b067bbb, 0xaa197a36, 0xed0a8ccd, 0x243e97c0, 0x632d613b, + 0x6d27a79b, 0x2a345160, 0xe3004a6d, 0xa413bc96, 0xff15c72d, + 0xb80631d6, 0x71322adb, 0x3621dc20, 0x382b1a80, 0x7f38ec7b, + 0xb60cf776, 0xf11f018d, 0x8f43f22d, 0xc85004d6, 0x01641fdb, + 0x4677e920, 0x487d2f80, 0x0f6ed97b, 0xc65ac276, 0x8149348d, + 0xda4f4f36, 0x9d5cb9cd, 0x5468a2c0, 0x137b543b, 0x1d71929b, + 0x5a626460, 0x93567f6d, 0xd4458996, 0x255a881b, 0x62497ee0, + 0xab7d65ed, 0xec6e9316, 0xe26455b6, 0xa577a34d, 0x6c43b840, + 0x2b504ebb, 0x70563500, 0x3745c3fb, 0xfe71d8f6, 0xb9622e0d, + 0xb768e8ad, 0xf07b1e56, 0x394f055b, 0x7e5cf3a0, 0xc5f6e21b, + 0x82e514e0, 0x4bd10fed, 0x0cc2f916, 0x02c83fb6, 0x45dbc94d, + 0x8cefd240, 0xcbfc24bb, 0x90fa5f00, 0xd7e9a9fb, 0x1eddb2f6, + 0x59ce440d, 0x57c482ad, 0x10d77456, 0xd9e36f5b, 0x9ef099a0, + 0x6fef982d, 0x28fc6ed6, 0xe1c875db, 0xa6db8320, 0xa8d14580, + 0xefc2b37b, 0x26f6a876, 0x61e55e8d, 0x3ae32536, 0x7df0d3cd, + 0xb4c4c8c0, 0xf3d73e3b, 0xfdddf89b, 0xbace0e60, 0x73fa156d, + 0x34e9e396, 0x4ab51036, 0x0da6e6cd, 0xc492fdc0, 0x83810b3b, + 0x8d8bcd9b, 0xca983b60, 0x03ac206d, 0x44bfd696, 0x1fb9ad2d, + 0x58aa5bd6, 0x919e40db, 0xd68db620, 0xd8877080, 0x9f94867b, + 0x56a09d76, 0x11b36b8d, 0xe0ac6a00, 0xa7bf9cfb, 0x6e8b87f6, + 0x2998710d, 0x2792b7ad, 0x60814156, 0xa9b55a5b, 0xeea6aca0, + 0xb5a0d71b, 0xf2b321e0, 0x3b873aed, 0x7c94cc16, 0x729e0ab6, + 0x358dfc4d, 0xfcb9e740, 0xbbaa11bb, 0x509cc277, 0x178f348c, + 0xdebb2f81, 0x99a8d97a, 0x97a21fda, 0xd0b1e921, 0x1985f22c, + 0x5e9604d7, 0x05907f6c, 0x42838997, 0x8bb7929a, 0xcca46461, + 0xc2aea2c1, 0x85bd543a, 0x4c894f37, 0x0b9ab9cc, 0xfa85b841, + 0xbd964eba, 0x74a255b7, 0x33b1a34c, 0x3dbb65ec, 0x7aa89317, + 0xb39c881a, 0xf48f7ee1, 0xaf89055a, 0xe89af3a1, 0x21aee8ac, + 0x66bd1e57, 0x68b7d8f7, 0x2fa42e0c, 0xe6903501, 0xa183c3fa, + 0xdfdf305a, 0x98ccc6a1, 0x51f8ddac, 0x16eb2b57, 0x18e1edf7, + 0x5ff21b0c, 0x96c60001, 0xd1d5f6fa, 0x8ad38d41, 0xcdc07bba, + 0x04f460b7, 0x43e7964c, 0x4ded50ec, 0x0afea617, 0xc3cabd1a, + 0x84d94be1, 0x75c64a6c, 0x32d5bc97, 0xfbe1a79a, 0xbcf25161, + 0xb2f897c1, 0xf5eb613a, 0x3cdf7a37, 0x7bcc8ccc, 0x20caf777, + 0x67d9018c, 0xaeed1a81, 0xe9feec7a, 0xe7f42ada, 0xa0e7dc21, + 0x69d3c72c, 0x2ec031d7, 0x956a206c, 0xd279d697, 0x1b4dcd9a, + 0x5c5e3b61, 0x5254fdc1, 0x15470b3a, 0xdc731037, 0x9b60e6cc, + 0xc0669d77, 0x87756b8c, 0x4e417081, 0x0952867a, 0x075840da, + 0x404bb621, 0x897fad2c, 0xce6c5bd7, 0x3f735a5a, 0x7860aca1, + 0xb154b7ac, 0xf6474157, 0xf84d87f7, 0xbf5e710c, 0x766a6a01, + 0x31799cfa, 0x6a7fe741, 0x2d6c11ba, 0xe4580ab7, 0xa34bfc4c, + 0xad413aec, 0xea52cc17, 0x2366d71a, 0x647521e1, 0x1a29d241, + 0x5d3a24ba, 0x940e3fb7, 0xd31dc94c, 0xdd170fec, 0x9a04f917, + 0x5330e21a, 0x142314e1, 0x4f256f5a, 0x083699a1, 0xc10282ac, + 0x86117457, 0x881bb2f7, 0xcf08440c, 0x063c5f01, 0x412fa9fa, + 0xb030a877, 0xf7235e8c, 0x3e174581, 0x7904b37a, 0x770e75da, + 0x301d8321, 0xf929982c, 0xbe3a6ed7, 0xe53c156c, 0xa22fe397, + 0x6b1bf89a, 0x2c080e61, 0x2202c8c1, 0x65113e3a, 0xac252537, + 0xeb36d3cc}, + {0x00000000, 0xa13984ee, 0x99020f9d, 0x383b8b73, 0xe975197b, + 0x484c9d95, 0x707716e6, 0xd14e9208, 0x099b34b7, 0xa8a2b059, + 0x90993b2a, 0x31a0bfc4, 0xe0ee2dcc, 0x41d7a922, 0x79ec2251, + 0xd8d5a6bf, 0x1336696e, 0xb20fed80, 0x8a3466f3, 0x2b0de21d, + 0xfa437015, 0x5b7af4fb, 0x63417f88, 0xc278fb66, 0x1aad5dd9, + 0xbb94d937, 0x83af5244, 0x2296d6aa, 0xf3d844a2, 0x52e1c04c, + 0x6ada4b3f, 0xcbe3cfd1, 0x266cd2dc, 0x87555632, 0xbf6edd41, + 0x1e5759af, 0xcf19cba7, 0x6e204f49, 0x561bc43a, 0xf72240d4, + 0x2ff7e66b, 0x8ece6285, 0xb6f5e9f6, 0x17cc6d18, 0xc682ff10, + 0x67bb7bfe, 0x5f80f08d, 0xfeb97463, 0x355abbb2, 0x94633f5c, + 0xac58b42f, 0x0d6130c1, 0xdc2fa2c9, 0x7d162627, 0x452dad54, + 0xe41429ba, 0x3cc18f05, 0x9df80beb, 0xa5c38098, 0x04fa0476, + 0xd5b4967e, 0x748d1290, 0x4cb699e3, 0xed8f1d0d, 0x4cd9a5b8, + 0xede02156, 0xd5dbaa25, 0x74e22ecb, 0xa5acbcc3, 0x0495382d, + 0x3caeb35e, 0x9d9737b0, 0x4542910f, 0xe47b15e1, 0xdc409e92, + 0x7d791a7c, 0xac378874, 0x0d0e0c9a, 0x353587e9, 0x940c0307, + 0x5fefccd6, 0xfed64838, 0xc6edc34b, 0x67d447a5, 0xb69ad5ad, + 0x17a35143, 0x2f98da30, 0x8ea15ede, 0x5674f861, 0xf74d7c8f, + 0xcf76f7fc, 0x6e4f7312, 0xbf01e11a, 0x1e3865f4, 0x2603ee87, + 0x873a6a69, 0x6ab57764, 0xcb8cf38a, 0xf3b778f9, 0x528efc17, + 0x83c06e1f, 0x22f9eaf1, 0x1ac26182, 0xbbfbe56c, 0x632e43d3, + 0xc217c73d, 0xfa2c4c4e, 0x5b15c8a0, 0x8a5b5aa8, 0x2b62de46, + 0x13595535, 0xb260d1db, 0x79831e0a, 0xd8ba9ae4, 0xe0811197, + 0x41b89579, 0x90f60771, 0x31cf839f, 0x09f408ec, 0xa8cd8c02, + 0x70182abd, 0xd121ae53, 0xe91a2520, 0x4823a1ce, 0x996d33c6, + 0x3854b728, 0x006f3c5b, 0xa156b8b5, 0x99b34b70, 0x388acf9e, + 0x00b144ed, 0xa188c003, 0x70c6520b, 0xd1ffd6e5, 0xe9c45d96, + 0x48fdd978, 0x90287fc7, 0x3111fb29, 0x092a705a, 0xa813f4b4, + 0x795d66bc, 0xd864e252, 0xe05f6921, 0x4166edcf, 0x8a85221e, + 0x2bbca6f0, 0x13872d83, 0xb2bea96d, 0x63f03b65, 0xc2c9bf8b, + 0xfaf234f8, 0x5bcbb016, 0x831e16a9, 0x22279247, 0x1a1c1934, + 0xbb259dda, 0x6a6b0fd2, 0xcb528b3c, 0xf369004f, 0x525084a1, + 0xbfdf99ac, 0x1ee61d42, 0x26dd9631, 0x87e412df, 0x56aa80d7, + 0xf7930439, 0xcfa88f4a, 0x6e910ba4, 0xb644ad1b, 0x177d29f5, + 0x2f46a286, 0x8e7f2668, 0x5f31b460, 0xfe08308e, 0xc633bbfd, + 0x670a3f13, 0xace9f0c2, 0x0dd0742c, 0x35ebff5f, 0x94d27bb1, + 0x459ce9b9, 0xe4a56d57, 0xdc9ee624, 0x7da762ca, 0xa572c475, + 0x044b409b, 0x3c70cbe8, 0x9d494f06, 0x4c07dd0e, 0xed3e59e0, + 0xd505d293, 0x743c567d, 0xd56aeec8, 0x74536a26, 0x4c68e155, + 0xed5165bb, 0x3c1ff7b3, 0x9d26735d, 0xa51df82e, 0x04247cc0, + 0xdcf1da7f, 0x7dc85e91, 0x45f3d5e2, 0xe4ca510c, 0x3584c304, + 0x94bd47ea, 0xac86cc99, 0x0dbf4877, 0xc65c87a6, 0x67650348, + 0x5f5e883b, 0xfe670cd5, 0x2f299edd, 0x8e101a33, 0xb62b9140, + 0x171215ae, 0xcfc7b311, 0x6efe37ff, 0x56c5bc8c, 0xf7fc3862, + 0x26b2aa6a, 0x878b2e84, 0xbfb0a5f7, 0x1e892119, 0xf3063c14, + 0x523fb8fa, 0x6a043389, 0xcb3db767, 0x1a73256f, 0xbb4aa181, + 0x83712af2, 0x2248ae1c, 0xfa9d08a3, 0x5ba48c4d, 0x639f073e, + 0xc2a683d0, 0x13e811d8, 0xb2d19536, 0x8aea1e45, 0x2bd39aab, + 0xe030557a, 0x4109d194, 0x79325ae7, 0xd80bde09, 0x09454c01, + 0xa87cc8ef, 0x9047439c, 0x317ec772, 0xe9ab61cd, 0x4892e523, + 0x70a96e50, 0xd190eabe, 0x00de78b6, 0xa1e7fc58, 0x99dc772b, + 0x38e5f3c5}, + {0x00000000, 0xe81790a1, 0x0b5e2703, 0xe349b7a2, 0x16bc4e06, + 0xfeabdea7, 0x1de26905, 0xf5f5f9a4, 0x2d789c0c, 0xc56f0cad, + 0x2626bb0f, 0xce312bae, 0x3bc4d20a, 0xd3d342ab, 0x309af509, + 0xd88d65a8, 0x5af13818, 0xb2e6a8b9, 0x51af1f1b, 0xb9b88fba, + 0x4c4d761e, 0xa45ae6bf, 0x4713511d, 0xaf04c1bc, 0x7789a414, + 0x9f9e34b5, 0x7cd78317, 0x94c013b6, 0x6135ea12, 0x89227ab3, + 0x6a6bcd11, 0x827c5db0, 0xb5e27030, 0x5df5e091, 0xbebc5733, + 0x56abc792, 0xa35e3e36, 0x4b49ae97, 0xa8001935, 0x40178994, + 0x989aec3c, 0x708d7c9d, 0x93c4cb3f, 0x7bd35b9e, 0x8e26a23a, + 0x6631329b, 0x85788539, 0x6d6f1598, 0xef134828, 0x0704d889, + 0xe44d6f2b, 0x0c5aff8a, 0xf9af062e, 0x11b8968f, 0xf2f1212d, + 0x1ae6b18c, 0xc26bd424, 0x2a7c4485, 0xc935f327, 0x21226386, + 0xd4d79a22, 0x3cc00a83, 0xdf89bd21, 0x379e2d80, 0xb0b5e621, + 0x58a27680, 0xbbebc122, 0x53fc5183, 0xa609a827, 0x4e1e3886, + 0xad578f24, 0x45401f85, 0x9dcd7a2d, 0x75daea8c, 0x96935d2e, + 0x7e84cd8f, 0x8b71342b, 0x6366a48a, 0x802f1328, 0x68388389, + 0xea44de39, 0x02534e98, 0xe11af93a, 0x090d699b, 0xfcf8903f, + 0x14ef009e, 0xf7a6b73c, 0x1fb1279d, 0xc73c4235, 0x2f2bd294, + 0xcc626536, 0x2475f597, 0xd1800c33, 0x39979c92, 0xdade2b30, + 0x32c9bb91, 0x05579611, 0xed4006b0, 0x0e09b112, 0xe61e21b3, + 0x13ebd817, 0xfbfc48b6, 0x18b5ff14, 0xf0a26fb5, 0x282f0a1d, + 0xc0389abc, 0x23712d1e, 0xcb66bdbf, 0x3e93441b, 0xd684d4ba, + 0x35cd6318, 0xdddaf3b9, 0x5fa6ae09, 0xb7b13ea8, 0x54f8890a, + 0xbcef19ab, 0x491ae00f, 0xa10d70ae, 0x4244c70c, 0xaa5357ad, + 0x72de3205, 0x9ac9a2a4, 0x79801506, 0x919785a7, 0x64627c03, + 0x8c75eca2, 0x6f3c5b00, 0x872bcba1, 0xba1aca03, 0x520d5aa2, + 0xb144ed00, 0x59537da1, 0xaca68405, 0x44b114a4, 0xa7f8a306, + 0x4fef33a7, 0x9762560f, 0x7f75c6ae, 0x9c3c710c, 0x742be1ad, + 0x81de1809, 0x69c988a8, 0x8a803f0a, 0x6297afab, 0xe0ebf21b, + 0x08fc62ba, 0xebb5d518, 0x03a245b9, 0xf657bc1d, 0x1e402cbc, + 0xfd099b1e, 0x151e0bbf, 0xcd936e17, 0x2584feb6, 0xc6cd4914, + 0x2edad9b5, 0xdb2f2011, 0x3338b0b0, 0xd0710712, 0x386697b3, + 0x0ff8ba33, 0xe7ef2a92, 0x04a69d30, 0xecb10d91, 0x1944f435, + 0xf1536494, 0x121ad336, 0xfa0d4397, 0x2280263f, 0xca97b69e, + 0x29de013c, 0xc1c9919d, 0x343c6839, 0xdc2bf898, 0x3f624f3a, + 0xd775df9b, 0x5509822b, 0xbd1e128a, 0x5e57a528, 0xb6403589, + 0x43b5cc2d, 0xaba25c8c, 0x48ebeb2e, 0xa0fc7b8f, 0x78711e27, + 0x90668e86, 0x732f3924, 0x9b38a985, 0x6ecd5021, 0x86dac080, + 0x65937722, 0x8d84e783, 0x0aaf2c22, 0xe2b8bc83, 0x01f10b21, + 0xe9e69b80, 0x1c136224, 0xf404f285, 0x174d4527, 0xff5ad586, + 0x27d7b02e, 0xcfc0208f, 0x2c89972d, 0xc49e078c, 0x316bfe28, + 0xd97c6e89, 0x3a35d92b, 0xd222498a, 0x505e143a, 0xb849849b, + 0x5b003339, 0xb317a398, 0x46e25a3c, 0xaef5ca9d, 0x4dbc7d3f, + 0xa5abed9e, 0x7d268836, 0x95311897, 0x7678af35, 0x9e6f3f94, + 0x6b9ac630, 0x838d5691, 0x60c4e133, 0x88d37192, 0xbf4d5c12, + 0x575accb3, 0xb4137b11, 0x5c04ebb0, 0xa9f11214, 0x41e682b5, + 0xa2af3517, 0x4ab8a5b6, 0x9235c01e, 0x7a2250bf, 0x996be71d, + 0x717c77bc, 0x84898e18, 0x6c9e1eb9, 0x8fd7a91b, 0x67c039ba, + 0xe5bc640a, 0x0dabf4ab, 0xeee24309, 0x06f5d3a8, 0xf3002a0c, + 0x1b17baad, 0xf85e0d0f, 0x10499dae, 0xc8c4f806, 0x20d368a7, + 0xc39adf05, 0x2b8d4fa4, 0xde78b600, 0x366f26a1, 0xd5269103, + 0x3d3101a2}}; + +local const z_word_t FAR crc_braid_big_table[][256] = { + {0x0000000000000000, 0xa19017e800000000, 0x03275e0b00000000, + 0xa2b749e300000000, 0x064ebc1600000000, 0xa7deabfe00000000, + 0x0569e21d00000000, 0xa4f9f5f500000000, 0x0c9c782d00000000, + 0xad0c6fc500000000, 0x0fbb262600000000, 0xae2b31ce00000000, + 0x0ad2c43b00000000, 0xab42d3d300000000, 0x09f59a3000000000, + 0xa8658dd800000000, 0x1838f15a00000000, 0xb9a8e6b200000000, + 0x1b1faf5100000000, 0xba8fb8b900000000, 0x1e764d4c00000000, + 0xbfe65aa400000000, 0x1d51134700000000, 0xbcc104af00000000, + 0x14a4897700000000, 0xb5349e9f00000000, 0x1783d77c00000000, + 0xb613c09400000000, 0x12ea356100000000, 0xb37a228900000000, + 0x11cd6b6a00000000, 0xb05d7c8200000000, 0x3070e2b500000000, + 0x91e0f55d00000000, 0x3357bcbe00000000, 0x92c7ab5600000000, + 0x363e5ea300000000, 0x97ae494b00000000, 0x351900a800000000, + 0x9489174000000000, 0x3cec9a9800000000, 0x9d7c8d7000000000, + 0x3fcbc49300000000, 0x9e5bd37b00000000, 0x3aa2268e00000000, + 0x9b32316600000000, 0x3985788500000000, 0x98156f6d00000000, + 0x284813ef00000000, 0x89d8040700000000, 0x2b6f4de400000000, + 0x8aff5a0c00000000, 0x2e06aff900000000, 0x8f96b81100000000, + 0x2d21f1f200000000, 0x8cb1e61a00000000, 0x24d46bc200000000, + 0x85447c2a00000000, 0x27f335c900000000, 0x8663222100000000, + 0x229ad7d400000000, 0x830ac03c00000000, 0x21bd89df00000000, + 0x802d9e3700000000, 0x21e6b5b000000000, 0x8076a25800000000, + 0x22c1ebbb00000000, 0x8351fc5300000000, 0x27a809a600000000, + 0x86381e4e00000000, 0x248f57ad00000000, 0x851f404500000000, + 0x2d7acd9d00000000, 0x8ceada7500000000, 0x2e5d939600000000, + 0x8fcd847e00000000, 0x2b34718b00000000, 0x8aa4666300000000, + 0x28132f8000000000, 0x8983386800000000, 0x39de44ea00000000, + 0x984e530200000000, 0x3af91ae100000000, 0x9b690d0900000000, + 0x3f90f8fc00000000, 0x9e00ef1400000000, 0x3cb7a6f700000000, + 0x9d27b11f00000000, 0x35423cc700000000, 0x94d22b2f00000000, + 0x366562cc00000000, 0x97f5752400000000, 0x330c80d100000000, + 0x929c973900000000, 0x302bdeda00000000, 0x91bbc93200000000, + 0x1196570500000000, 0xb00640ed00000000, 0x12b1090e00000000, + 0xb3211ee600000000, 0x17d8eb1300000000, 0xb648fcfb00000000, + 0x14ffb51800000000, 0xb56fa2f000000000, 0x1d0a2f2800000000, + 0xbc9a38c000000000, 0x1e2d712300000000, 0xbfbd66cb00000000, + 0x1b44933e00000000, 0xbad484d600000000, 0x1863cd3500000000, + 0xb9f3dadd00000000, 0x09aea65f00000000, 0xa83eb1b700000000, + 0x0a89f85400000000, 0xab19efbc00000000, 0x0fe01a4900000000, + 0xae700da100000000, 0x0cc7444200000000, 0xad5753aa00000000, + 0x0532de7200000000, 0xa4a2c99a00000000, 0x0615807900000000, + 0xa785979100000000, 0x037c626400000000, 0xa2ec758c00000000, + 0x005b3c6f00000000, 0xa1cb2b8700000000, 0x03ca1aba00000000, + 0xa25a0d5200000000, 0x00ed44b100000000, 0xa17d535900000000, + 0x0584a6ac00000000, 0xa414b14400000000, 0x06a3f8a700000000, + 0xa733ef4f00000000, 0x0f56629700000000, 0xaec6757f00000000, + 0x0c713c9c00000000, 0xade12b7400000000, 0x0918de8100000000, + 0xa888c96900000000, 0x0a3f808a00000000, 0xabaf976200000000, + 0x1bf2ebe000000000, 0xba62fc0800000000, 0x18d5b5eb00000000, + 0xb945a20300000000, 0x1dbc57f600000000, 0xbc2c401e00000000, + 0x1e9b09fd00000000, 0xbf0b1e1500000000, 0x176e93cd00000000, + 0xb6fe842500000000, 0x1449cdc600000000, 0xb5d9da2e00000000, + 0x11202fdb00000000, 0xb0b0383300000000, 0x120771d000000000, + 0xb397663800000000, 0x33baf80f00000000, 0x922aefe700000000, + 0x309da60400000000, 0x910db1ec00000000, 0x35f4441900000000, + 0x946453f100000000, 0x36d31a1200000000, 0x97430dfa00000000, + 0x3f26802200000000, 0x9eb697ca00000000, 0x3c01de2900000000, + 0x9d91c9c100000000, 0x39683c3400000000, 0x98f82bdc00000000, + 0x3a4f623f00000000, 0x9bdf75d700000000, 0x2b82095500000000, + 0x8a121ebd00000000, 0x28a5575e00000000, 0x893540b600000000, + 0x2dccb54300000000, 0x8c5ca2ab00000000, 0x2eebeb4800000000, + 0x8f7bfca000000000, 0x271e717800000000, 0x868e669000000000, + 0x24392f7300000000, 0x85a9389b00000000, 0x2150cd6e00000000, + 0x80c0da8600000000, 0x2277936500000000, 0x83e7848d00000000, + 0x222caf0a00000000, 0x83bcb8e200000000, 0x210bf10100000000, + 0x809be6e900000000, 0x2462131c00000000, 0x85f204f400000000, + 0x27454d1700000000, 0x86d55aff00000000, 0x2eb0d72700000000, + 0x8f20c0cf00000000, 0x2d97892c00000000, 0x8c079ec400000000, + 0x28fe6b3100000000, 0x896e7cd900000000, 0x2bd9353a00000000, + 0x8a4922d200000000, 0x3a145e5000000000, 0x9b8449b800000000, + 0x3933005b00000000, 0x98a317b300000000, 0x3c5ae24600000000, + 0x9dcaf5ae00000000, 0x3f7dbc4d00000000, 0x9eedaba500000000, + 0x3688267d00000000, 0x9718319500000000, 0x35af787600000000, + 0x943f6f9e00000000, 0x30c69a6b00000000, 0x91568d8300000000, + 0x33e1c46000000000, 0x9271d38800000000, 0x125c4dbf00000000, + 0xb3cc5a5700000000, 0x117b13b400000000, 0xb0eb045c00000000, + 0x1412f1a900000000, 0xb582e64100000000, 0x1735afa200000000, + 0xb6a5b84a00000000, 0x1ec0359200000000, 0xbf50227a00000000, + 0x1de76b9900000000, 0xbc777c7100000000, 0x188e898400000000, + 0xb91e9e6c00000000, 0x1ba9d78f00000000, 0xba39c06700000000, + 0x0a64bce500000000, 0xabf4ab0d00000000, 0x0943e2ee00000000, + 0xa8d3f50600000000, 0x0c2a00f300000000, 0xadba171b00000000, + 0x0f0d5ef800000000, 0xae9d491000000000, 0x06f8c4c800000000, + 0xa768d32000000000, 0x05df9ac300000000, 0xa44f8d2b00000000, + 0x00b678de00000000, 0xa1266f3600000000, 0x039126d500000000, + 0xa201313d00000000}, + {0x0000000000000000, 0xee8439a100000000, 0x9d0f029900000000, + 0x738b3b3800000000, 0x7b1975e900000000, 0x959d4c4800000000, + 0xe616777000000000, 0x08924ed100000000, 0xb7349b0900000000, + 0x59b0a2a800000000, 0x2a3b999000000000, 0xc4bfa03100000000, + 0xcc2deee000000000, 0x22a9d74100000000, 0x5122ec7900000000, + 0xbfa6d5d800000000, 0x6e69361300000000, 0x80ed0fb200000000, + 0xf366348a00000000, 0x1de20d2b00000000, 0x157043fa00000000, + 0xfbf47a5b00000000, 0x887f416300000000, 0x66fb78c200000000, + 0xd95dad1a00000000, 0x37d994bb00000000, 0x4452af8300000000, + 0xaad6962200000000, 0xa244d8f300000000, 0x4cc0e15200000000, + 0x3f4bda6a00000000, 0xd1cfe3cb00000000, 0xdcd26c2600000000, + 0x3256558700000000, 0x41dd6ebf00000000, 0xaf59571e00000000, + 0xa7cb19cf00000000, 0x494f206e00000000, 0x3ac41b5600000000, + 0xd44022f700000000, 0x6be6f72f00000000, 0x8562ce8e00000000, + 0xf6e9f5b600000000, 0x186dcc1700000000, 0x10ff82c600000000, + 0xfe7bbb6700000000, 0x8df0805f00000000, 0x6374b9fe00000000, + 0xb2bb5a3500000000, 0x5c3f639400000000, 0x2fb458ac00000000, + 0xc130610d00000000, 0xc9a22fdc00000000, 0x2726167d00000000, + 0x54ad2d4500000000, 0xba2914e400000000, 0x058fc13c00000000, + 0xeb0bf89d00000000, 0x9880c3a500000000, 0x7604fa0400000000, + 0x7e96b4d500000000, 0x90128d7400000000, 0xe399b64c00000000, + 0x0d1d8fed00000000, 0xb8a5d94c00000000, 0x5621e0ed00000000, + 0x25aadbd500000000, 0xcb2ee27400000000, 0xc3bcaca500000000, + 0x2d38950400000000, 0x5eb3ae3c00000000, 0xb037979d00000000, + 0x0f91424500000000, 0xe1157be400000000, 0x929e40dc00000000, + 0x7c1a797d00000000, 0x748837ac00000000, 0x9a0c0e0d00000000, + 0xe987353500000000, 0x07030c9400000000, 0xd6ccef5f00000000, + 0x3848d6fe00000000, 0x4bc3edc600000000, 0xa547d46700000000, + 0xadd59ab600000000, 0x4351a31700000000, 0x30da982f00000000, + 0xde5ea18e00000000, 0x61f8745600000000, 0x8f7c4df700000000, + 0xfcf776cf00000000, 0x12734f6e00000000, 0x1ae101bf00000000, + 0xf465381e00000000, 0x87ee032600000000, 0x696a3a8700000000, + 0x6477b56a00000000, 0x8af38ccb00000000, 0xf978b7f300000000, + 0x17fc8e5200000000, 0x1f6ec08300000000, 0xf1eaf92200000000, + 0x8261c21a00000000, 0x6ce5fbbb00000000, 0xd3432e6300000000, + 0x3dc717c200000000, 0x4e4c2cfa00000000, 0xa0c8155b00000000, + 0xa85a5b8a00000000, 0x46de622b00000000, 0x3555591300000000, + 0xdbd160b200000000, 0x0a1e837900000000, 0xe49abad800000000, + 0x971181e000000000, 0x7995b84100000000, 0x7107f69000000000, + 0x9f83cf3100000000, 0xec08f40900000000, 0x028ccda800000000, + 0xbd2a187000000000, 0x53ae21d100000000, 0x20251ae900000000, + 0xcea1234800000000, 0xc6336d9900000000, 0x28b7543800000000, + 0x5b3c6f0000000000, 0xb5b856a100000000, 0x704bb39900000000, + 0x9ecf8a3800000000, 0xed44b10000000000, 0x03c088a100000000, + 0x0b52c67000000000, 0xe5d6ffd100000000, 0x965dc4e900000000, + 0x78d9fd4800000000, 0xc77f289000000000, 0x29fb113100000000, + 0x5a702a0900000000, 0xb4f413a800000000, 0xbc665d7900000000, + 0x52e264d800000000, 0x21695fe000000000, 0xcfed664100000000, + 0x1e22858a00000000, 0xf0a6bc2b00000000, 0x832d871300000000, + 0x6da9beb200000000, 0x653bf06300000000, 0x8bbfc9c200000000, + 0xf834f2fa00000000, 0x16b0cb5b00000000, 0xa9161e8300000000, + 0x4792272200000000, 0x34191c1a00000000, 0xda9d25bb00000000, + 0xd20f6b6a00000000, 0x3c8b52cb00000000, 0x4f0069f300000000, + 0xa184505200000000, 0xac99dfbf00000000, 0x421de61e00000000, + 0x3196dd2600000000, 0xdf12e48700000000, 0xd780aa5600000000, + 0x390493f700000000, 0x4a8fa8cf00000000, 0xa40b916e00000000, + 0x1bad44b600000000, 0xf5297d1700000000, 0x86a2462f00000000, + 0x68267f8e00000000, 0x60b4315f00000000, 0x8e3008fe00000000, + 0xfdbb33c600000000, 0x133f0a6700000000, 0xc2f0e9ac00000000, + 0x2c74d00d00000000, 0x5fffeb3500000000, 0xb17bd29400000000, + 0xb9e99c4500000000, 0x576da5e400000000, 0x24e69edc00000000, + 0xca62a77d00000000, 0x75c472a500000000, 0x9b404b0400000000, + 0xe8cb703c00000000, 0x064f499d00000000, 0x0edd074c00000000, + 0xe0593eed00000000, 0x93d205d500000000, 0x7d563c7400000000, + 0xc8ee6ad500000000, 0x266a537400000000, 0x55e1684c00000000, + 0xbb6551ed00000000, 0xb3f71f3c00000000, 0x5d73269d00000000, + 0x2ef81da500000000, 0xc07c240400000000, 0x7fdaf1dc00000000, + 0x915ec87d00000000, 0xe2d5f34500000000, 0x0c51cae400000000, + 0x04c3843500000000, 0xea47bd9400000000, 0x99cc86ac00000000, + 0x7748bf0d00000000, 0xa6875cc600000000, 0x4803656700000000, + 0x3b885e5f00000000, 0xd50c67fe00000000, 0xdd9e292f00000000, + 0x331a108e00000000, 0x40912bb600000000, 0xae15121700000000, + 0x11b3c7cf00000000, 0xff37fe6e00000000, 0x8cbcc55600000000, + 0x6238fcf700000000, 0x6aaab22600000000, 0x842e8b8700000000, + 0xf7a5b0bf00000000, 0x1921891e00000000, 0x143c06f300000000, + 0xfab83f5200000000, 0x8933046a00000000, 0x67b73dcb00000000, + 0x6f25731a00000000, 0x81a14abb00000000, 0xf22a718300000000, + 0x1cae482200000000, 0xa3089dfa00000000, 0x4d8ca45b00000000, + 0x3e079f6300000000, 0xd083a6c200000000, 0xd811e81300000000, + 0x3695d1b200000000, 0x451eea8a00000000, 0xab9ad32b00000000, + 0x7a5530e000000000, 0x94d1094100000000, 0xe75a327900000000, + 0x09de0bd800000000, 0x014c450900000000, 0xefc87ca800000000, + 0x9c43479000000000, 0x72c77e3100000000, 0xcd61abe900000000, + 0x23e5924800000000, 0x506ea97000000000, 0xbeea90d100000000, + 0xb678de0000000000, 0x58fce7a100000000, 0x2b77dc9900000000, + 0xc5f3e53800000000}, + {0x0000000000000000, 0xfbf6134700000000, 0xf6ed278e00000000, + 0x0d1b34c900000000, 0xaddd3ec700000000, 0x562b2d8000000000, + 0x5b30194900000000, 0xa0c60a0e00000000, 0x1bbd0c5500000000, + 0xe04b1f1200000000, 0xed502bdb00000000, 0x16a6389c00000000, + 0xb660329200000000, 0x4d9621d500000000, 0x408d151c00000000, + 0xbb7b065b00000000, 0x367a19aa00000000, 0xcd8c0aed00000000, + 0xc0973e2400000000, 0x3b612d6300000000, 0x9ba7276d00000000, + 0x6051342a00000000, 0x6d4a00e300000000, 0x96bc13a400000000, + 0x2dc715ff00000000, 0xd63106b800000000, 0xdb2a327100000000, + 0x20dc213600000000, 0x801a2b3800000000, 0x7bec387f00000000, + 0x76f70cb600000000, 0x8d011ff100000000, 0x2df2438f00000000, + 0xd60450c800000000, 0xdb1f640100000000, 0x20e9774600000000, + 0x802f7d4800000000, 0x7bd96e0f00000000, 0x76c25ac600000000, + 0x8d34498100000000, 0x364f4fda00000000, 0xcdb95c9d00000000, + 0xc0a2685400000000, 0x3b547b1300000000, 0x9b92711d00000000, + 0x6064625a00000000, 0x6d7f569300000000, 0x968945d400000000, + 0x1b885a2500000000, 0xe07e496200000000, 0xed657dab00000000, + 0x16936eec00000000, 0xb65564e200000000, 0x4da377a500000000, + 0x40b8436c00000000, 0xbb4e502b00000000, 0x0035567000000000, + 0xfbc3453700000000, 0xf6d871fe00000000, 0x0d2e62b900000000, + 0xade868b700000000, 0x561e7bf000000000, 0x5b054f3900000000, + 0xa0f35c7e00000000, 0x1be2f6c500000000, 0xe014e58200000000, + 0xed0fd14b00000000, 0x16f9c20c00000000, 0xb63fc80200000000, + 0x4dc9db4500000000, 0x40d2ef8c00000000, 0xbb24fccb00000000, + 0x005ffa9000000000, 0xfba9e9d700000000, 0xf6b2dd1e00000000, + 0x0d44ce5900000000, 0xad82c45700000000, 0x5674d71000000000, + 0x5b6fe3d900000000, 0xa099f09e00000000, 0x2d98ef6f00000000, + 0xd66efc2800000000, 0xdb75c8e100000000, 0x2083dba600000000, + 0x8045d1a800000000, 0x7bb3c2ef00000000, 0x76a8f62600000000, + 0x8d5ee56100000000, 0x3625e33a00000000, 0xcdd3f07d00000000, + 0xc0c8c4b400000000, 0x3b3ed7f300000000, 0x9bf8ddfd00000000, + 0x600eceba00000000, 0x6d15fa7300000000, 0x96e3e93400000000, + 0x3610b54a00000000, 0xcde6a60d00000000, 0xc0fd92c400000000, + 0x3b0b818300000000, 0x9bcd8b8d00000000, 0x603b98ca00000000, + 0x6d20ac0300000000, 0x96d6bf4400000000, 0x2dadb91f00000000, + 0xd65baa5800000000, 0xdb409e9100000000, 0x20b68dd600000000, + 0x807087d800000000, 0x7b86949f00000000, 0x769da05600000000, + 0x8d6bb31100000000, 0x006aace000000000, 0xfb9cbfa700000000, + 0xf6878b6e00000000, 0x0d71982900000000, 0xadb7922700000000, + 0x5641816000000000, 0x5b5ab5a900000000, 0xa0aca6ee00000000, + 0x1bd7a0b500000000, 0xe021b3f200000000, 0xed3a873b00000000, + 0x16cc947c00000000, 0xb60a9e7200000000, 0x4dfc8d3500000000, + 0x40e7b9fc00000000, 0xbb11aabb00000000, 0x77c29c5000000000, + 0x8c348f1700000000, 0x812fbbde00000000, 0x7ad9a89900000000, + 0xda1fa29700000000, 0x21e9b1d000000000, 0x2cf2851900000000, + 0xd704965e00000000, 0x6c7f900500000000, 0x9789834200000000, + 0x9a92b78b00000000, 0x6164a4cc00000000, 0xc1a2aec200000000, + 0x3a54bd8500000000, 0x374f894c00000000, 0xccb99a0b00000000, + 0x41b885fa00000000, 0xba4e96bd00000000, 0xb755a27400000000, + 0x4ca3b13300000000, 0xec65bb3d00000000, 0x1793a87a00000000, + 0x1a889cb300000000, 0xe17e8ff400000000, 0x5a0589af00000000, + 0xa1f39ae800000000, 0xace8ae2100000000, 0x571ebd6600000000, + 0xf7d8b76800000000, 0x0c2ea42f00000000, 0x013590e600000000, + 0xfac383a100000000, 0x5a30dfdf00000000, 0xa1c6cc9800000000, + 0xacddf85100000000, 0x572beb1600000000, 0xf7ede11800000000, + 0x0c1bf25f00000000, 0x0100c69600000000, 0xfaf6d5d100000000, + 0x418dd38a00000000, 0xba7bc0cd00000000, 0xb760f40400000000, + 0x4c96e74300000000, 0xec50ed4d00000000, 0x17a6fe0a00000000, + 0x1abdcac300000000, 0xe14bd98400000000, 0x6c4ac67500000000, + 0x97bcd53200000000, 0x9aa7e1fb00000000, 0x6151f2bc00000000, + 0xc197f8b200000000, 0x3a61ebf500000000, 0x377adf3c00000000, + 0xcc8ccc7b00000000, 0x77f7ca2000000000, 0x8c01d96700000000, + 0x811aedae00000000, 0x7aecfee900000000, 0xda2af4e700000000, + 0x21dce7a000000000, 0x2cc7d36900000000, 0xd731c02e00000000, + 0x6c206a9500000000, 0x97d679d200000000, 0x9acd4d1b00000000, + 0x613b5e5c00000000, 0xc1fd545200000000, 0x3a0b471500000000, + 0x371073dc00000000, 0xcce6609b00000000, 0x779d66c000000000, + 0x8c6b758700000000, 0x8170414e00000000, 0x7a86520900000000, + 0xda40580700000000, 0x21b64b4000000000, 0x2cad7f8900000000, + 0xd75b6cce00000000, 0x5a5a733f00000000, 0xa1ac607800000000, + 0xacb754b100000000, 0x574147f600000000, 0xf7874df800000000, + 0x0c715ebf00000000, 0x016a6a7600000000, 0xfa9c793100000000, + 0x41e77f6a00000000, 0xba116c2d00000000, 0xb70a58e400000000, + 0x4cfc4ba300000000, 0xec3a41ad00000000, 0x17cc52ea00000000, + 0x1ad7662300000000, 0xe121756400000000, 0x41d2291a00000000, + 0xba243a5d00000000, 0xb73f0e9400000000, 0x4cc91dd300000000, + 0xec0f17dd00000000, 0x17f9049a00000000, 0x1ae2305300000000, + 0xe114231400000000, 0x5a6f254f00000000, 0xa199360800000000, + 0xac8202c100000000, 0x5774118600000000, 0xf7b21b8800000000, + 0x0c4408cf00000000, 0x015f3c0600000000, 0xfaa92f4100000000, + 0x77a830b000000000, 0x8c5e23f700000000, 0x8145173e00000000, + 0x7ab3047900000000, 0xda750e7700000000, 0x21831d3000000000, + 0x2c9829f900000000, 0xd76e3abe00000000, 0x6c153ce500000000, + 0x97e32fa200000000, 0x9af81b6b00000000, 0x610e082c00000000, + 0xc1c8022200000000, 0x3a3e116500000000, 0x372525ac00000000, + 0xccd336eb00000000}, + {0x0000000000000000, 0x6238282a00000000, 0xc470505400000000, + 0xa648787e00000000, 0x88e1a0a800000000, 0xead9888200000000, + 0x4c91f0fc00000000, 0x2ea9d8d600000000, 0x51c5308a00000000, + 0x33fd18a000000000, 0x95b560de00000000, 0xf78d48f400000000, + 0xd924902200000000, 0xbb1cb80800000000, 0x1d54c07600000000, + 0x7f6ce85c00000000, 0xe38c10cf00000000, 0x81b438e500000000, + 0x27fc409b00000000, 0x45c468b100000000, 0x6b6db06700000000, + 0x0955984d00000000, 0xaf1de03300000000, 0xcd25c81900000000, + 0xb249204500000000, 0xd071086f00000000, 0x7639701100000000, + 0x1401583b00000000, 0x3aa880ed00000000, 0x5890a8c700000000, + 0xfed8d0b900000000, 0x9ce0f89300000000, 0x871f504500000000, + 0xe527786f00000000, 0x436f001100000000, 0x2157283b00000000, + 0x0ffef0ed00000000, 0x6dc6d8c700000000, 0xcb8ea0b900000000, + 0xa9b6889300000000, 0xd6da60cf00000000, 0xb4e248e500000000, + 0x12aa309b00000000, 0x709218b100000000, 0x5e3bc06700000000, + 0x3c03e84d00000000, 0x9a4b903300000000, 0xf873b81900000000, + 0x6493408a00000000, 0x06ab68a000000000, 0xa0e310de00000000, + 0xc2db38f400000000, 0xec72e02200000000, 0x8e4ac80800000000, + 0x2802b07600000000, 0x4a3a985c00000000, 0x3556700000000000, + 0x576e582a00000000, 0xf126205400000000, 0x931e087e00000000, + 0xbdb7d0a800000000, 0xdf8ff88200000000, 0x79c780fc00000000, + 0x1bffa8d600000000, 0x0e3fa08a00000000, 0x6c0788a000000000, + 0xca4ff0de00000000, 0xa877d8f400000000, 0x86de002200000000, + 0xe4e6280800000000, 0x42ae507600000000, 0x2096785c00000000, + 0x5ffa900000000000, 0x3dc2b82a00000000, 0x9b8ac05400000000, + 0xf9b2e87e00000000, 0xd71b30a800000000, 0xb523188200000000, + 0x136b60fc00000000, 0x715348d600000000, 0xedb3b04500000000, + 0x8f8b986f00000000, 0x29c3e01100000000, 0x4bfbc83b00000000, + 0x655210ed00000000, 0x076a38c700000000, 0xa12240b900000000, + 0xc31a689300000000, 0xbc7680cf00000000, 0xde4ea8e500000000, + 0x7806d09b00000000, 0x1a3ef8b100000000, 0x3497206700000000, + 0x56af084d00000000, 0xf0e7703300000000, 0x92df581900000000, + 0x8920f0cf00000000, 0xeb18d8e500000000, 0x4d50a09b00000000, + 0x2f6888b100000000, 0x01c1506700000000, 0x63f9784d00000000, + 0xc5b1003300000000, 0xa789281900000000, 0xd8e5c04500000000, + 0xbadde86f00000000, 0x1c95901100000000, 0x7eadb83b00000000, + 0x500460ed00000000, 0x323c48c700000000, 0x947430b900000000, + 0xf64c189300000000, 0x6aace00000000000, 0x0894c82a00000000, + 0xaedcb05400000000, 0xcce4987e00000000, 0xe24d40a800000000, + 0x8075688200000000, 0x263d10fc00000000, 0x440538d600000000, + 0x3b69d08a00000000, 0x5951f8a000000000, 0xff1980de00000000, + 0x9d21a8f400000000, 0xb388702200000000, 0xd1b0580800000000, + 0x77f8207600000000, 0x15c0085c00000000, 0x5d7831ce00000000, + 0x3f4019e400000000, 0x9908619a00000000, 0xfb3049b000000000, + 0xd599916600000000, 0xb7a1b94c00000000, 0x11e9c13200000000, + 0x73d1e91800000000, 0x0cbd014400000000, 0x6e85296e00000000, + 0xc8cd511000000000, 0xaaf5793a00000000, 0x845ca1ec00000000, + 0xe66489c600000000, 0x402cf1b800000000, 0x2214d99200000000, + 0xbef4210100000000, 0xdccc092b00000000, 0x7a84715500000000, + 0x18bc597f00000000, 0x361581a900000000, 0x542da98300000000, + 0xf265d1fd00000000, 0x905df9d700000000, 0xef31118b00000000, + 0x8d0939a100000000, 0x2b4141df00000000, 0x497969f500000000, + 0x67d0b12300000000, 0x05e8990900000000, 0xa3a0e17700000000, + 0xc198c95d00000000, 0xda67618b00000000, 0xb85f49a100000000, + 0x1e1731df00000000, 0x7c2f19f500000000, 0x5286c12300000000, + 0x30bee90900000000, 0x96f6917700000000, 0xf4ceb95d00000000, + 0x8ba2510100000000, 0xe99a792b00000000, 0x4fd2015500000000, + 0x2dea297f00000000, 0x0343f1a900000000, 0x617bd98300000000, + 0xc733a1fd00000000, 0xa50b89d700000000, 0x39eb714400000000, + 0x5bd3596e00000000, 0xfd9b211000000000, 0x9fa3093a00000000, + 0xb10ad1ec00000000, 0xd332f9c600000000, 0x757a81b800000000, + 0x1742a99200000000, 0x682e41ce00000000, 0x0a1669e400000000, + 0xac5e119a00000000, 0xce6639b000000000, 0xe0cfe16600000000, + 0x82f7c94c00000000, 0x24bfb13200000000, 0x4687991800000000, + 0x5347914400000000, 0x317fb96e00000000, 0x9737c11000000000, + 0xf50fe93a00000000, 0xdba631ec00000000, 0xb99e19c600000000, + 0x1fd661b800000000, 0x7dee499200000000, 0x0282a1ce00000000, + 0x60ba89e400000000, 0xc6f2f19a00000000, 0xa4cad9b000000000, + 0x8a63016600000000, 0xe85b294c00000000, 0x4e13513200000000, + 0x2c2b791800000000, 0xb0cb818b00000000, 0xd2f3a9a100000000, + 0x74bbd1df00000000, 0x1683f9f500000000, 0x382a212300000000, + 0x5a12090900000000, 0xfc5a717700000000, 0x9e62595d00000000, + 0xe10eb10100000000, 0x8336992b00000000, 0x257ee15500000000, + 0x4746c97f00000000, 0x69ef11a900000000, 0x0bd7398300000000, + 0xad9f41fd00000000, 0xcfa769d700000000, 0xd458c10100000000, + 0xb660e92b00000000, 0x1028915500000000, 0x7210b97f00000000, + 0x5cb961a900000000, 0x3e81498300000000, 0x98c931fd00000000, + 0xfaf119d700000000, 0x859df18b00000000, 0xe7a5d9a100000000, + 0x41eda1df00000000, 0x23d589f500000000, 0x0d7c512300000000, + 0x6f44790900000000, 0xc90c017700000000, 0xab34295d00000000, + 0x37d4d1ce00000000, 0x55ecf9e400000000, 0xf3a4819a00000000, + 0x919ca9b000000000, 0xbf35716600000000, 0xdd0d594c00000000, + 0x7b45213200000000, 0x197d091800000000, 0x6611e14400000000, + 0x0429c96e00000000, 0xa261b11000000000, 0xc059993a00000000, + 0xeef041ec00000000, 0x8cc869c600000000, 0x2a8011b800000000, + 0x48b8399200000000}, + {0x0000000000000000, 0x4c2896a300000000, 0xd9565d9c00000000, + 0x957ecb3f00000000, 0xf3abcbe300000000, 0xbf835d4000000000, + 0x2afd967f00000000, 0x66d500dc00000000, 0xa751e61c00000000, + 0xeb7970bf00000000, 0x7e07bb8000000000, 0x322f2d2300000000, + 0x54fa2dff00000000, 0x18d2bb5c00000000, 0x8dac706300000000, + 0xc184e6c000000000, 0x4ea3cc3900000000, 0x028b5a9a00000000, + 0x97f591a500000000, 0xdbdd070600000000, 0xbd0807da00000000, + 0xf120917900000000, 0x645e5a4600000000, 0x2876cce500000000, + 0xe9f22a2500000000, 0xa5dabc8600000000, 0x30a477b900000000, + 0x7c8ce11a00000000, 0x1a59e1c600000000, 0x5671776500000000, + 0xc30fbc5a00000000, 0x8f272af900000000, 0x9c46997300000000, + 0xd06e0fd000000000, 0x4510c4ef00000000, 0x0938524c00000000, + 0x6fed529000000000, 0x23c5c43300000000, 0xb6bb0f0c00000000, + 0xfa9399af00000000, 0x3b177f6f00000000, 0x773fe9cc00000000, + 0xe24122f300000000, 0xae69b45000000000, 0xc8bcb48c00000000, + 0x8494222f00000000, 0x11eae91000000000, 0x5dc27fb300000000, + 0xd2e5554a00000000, 0x9ecdc3e900000000, 0x0bb308d600000000, + 0x479b9e7500000000, 0x214e9ea900000000, 0x6d66080a00000000, + 0xf818c33500000000, 0xb430559600000000, 0x75b4b35600000000, + 0x399c25f500000000, 0xace2eeca00000000, 0xe0ca786900000000, + 0x861f78b500000000, 0xca37ee1600000000, 0x5f49252900000000, + 0x1361b38a00000000, 0x388d32e700000000, 0x74a5a44400000000, + 0xe1db6f7b00000000, 0xadf3f9d800000000, 0xcb26f90400000000, + 0x870e6fa700000000, 0x1270a49800000000, 0x5e58323b00000000, + 0x9fdcd4fb00000000, 0xd3f4425800000000, 0x468a896700000000, + 0x0aa21fc400000000, 0x6c771f1800000000, 0x205f89bb00000000, + 0xb521428400000000, 0xf909d42700000000, 0x762efede00000000, + 0x3a06687d00000000, 0xaf78a34200000000, 0xe35035e100000000, + 0x8585353d00000000, 0xc9ada39e00000000, 0x5cd368a100000000, + 0x10fbfe0200000000, 0xd17f18c200000000, 0x9d578e6100000000, + 0x0829455e00000000, 0x4401d3fd00000000, 0x22d4d32100000000, + 0x6efc458200000000, 0xfb828ebd00000000, 0xb7aa181e00000000, + 0xa4cbab9400000000, 0xe8e33d3700000000, 0x7d9df60800000000, + 0x31b560ab00000000, 0x5760607700000000, 0x1b48f6d400000000, + 0x8e363deb00000000, 0xc21eab4800000000, 0x039a4d8800000000, + 0x4fb2db2b00000000, 0xdacc101400000000, 0x96e486b700000000, + 0xf031866b00000000, 0xbc1910c800000000, 0x2967dbf700000000, + 0x654f4d5400000000, 0xea6867ad00000000, 0xa640f10e00000000, + 0x333e3a3100000000, 0x7f16ac9200000000, 0x19c3ac4e00000000, + 0x55eb3aed00000000, 0xc095f1d200000000, 0x8cbd677100000000, + 0x4d3981b100000000, 0x0111171200000000, 0x946fdc2d00000000, + 0xd8474a8e00000000, 0xbe924a5200000000, 0xf2badcf100000000, + 0x67c417ce00000000, 0x2bec816d00000000, 0x311c141500000000, + 0x7d3482b600000000, 0xe84a498900000000, 0xa462df2a00000000, + 0xc2b7dff600000000, 0x8e9f495500000000, 0x1be1826a00000000, + 0x57c914c900000000, 0x964df20900000000, 0xda6564aa00000000, + 0x4f1baf9500000000, 0x0333393600000000, 0x65e639ea00000000, + 0x29ceaf4900000000, 0xbcb0647600000000, 0xf098f2d500000000, + 0x7fbfd82c00000000, 0x33974e8f00000000, 0xa6e985b000000000, + 0xeac1131300000000, 0x8c1413cf00000000, 0xc03c856c00000000, + 0x55424e5300000000, 0x196ad8f000000000, 0xd8ee3e3000000000, + 0x94c6a89300000000, 0x01b863ac00000000, 0x4d90f50f00000000, + 0x2b45f5d300000000, 0x676d637000000000, 0xf213a84f00000000, + 0xbe3b3eec00000000, 0xad5a8d6600000000, 0xe1721bc500000000, + 0x740cd0fa00000000, 0x3824465900000000, 0x5ef1468500000000, + 0x12d9d02600000000, 0x87a71b1900000000, 0xcb8f8dba00000000, + 0x0a0b6b7a00000000, 0x4623fdd900000000, 0xd35d36e600000000, + 0x9f75a04500000000, 0xf9a0a09900000000, 0xb588363a00000000, + 0x20f6fd0500000000, 0x6cde6ba600000000, 0xe3f9415f00000000, + 0xafd1d7fc00000000, 0x3aaf1cc300000000, 0x76878a6000000000, + 0x10528abc00000000, 0x5c7a1c1f00000000, 0xc904d72000000000, + 0x852c418300000000, 0x44a8a74300000000, 0x088031e000000000, + 0x9dfefadf00000000, 0xd1d66c7c00000000, 0xb7036ca000000000, + 0xfb2bfa0300000000, 0x6e55313c00000000, 0x227da79f00000000, + 0x099126f200000000, 0x45b9b05100000000, 0xd0c77b6e00000000, + 0x9cefedcd00000000, 0xfa3aed1100000000, 0xb6127bb200000000, + 0x236cb08d00000000, 0x6f44262e00000000, 0xaec0c0ee00000000, + 0xe2e8564d00000000, 0x77969d7200000000, 0x3bbe0bd100000000, + 0x5d6b0b0d00000000, 0x11439dae00000000, 0x843d569100000000, + 0xc815c03200000000, 0x4732eacb00000000, 0x0b1a7c6800000000, + 0x9e64b75700000000, 0xd24c21f400000000, 0xb499212800000000, + 0xf8b1b78b00000000, 0x6dcf7cb400000000, 0x21e7ea1700000000, + 0xe0630cd700000000, 0xac4b9a7400000000, 0x3935514b00000000, + 0x751dc7e800000000, 0x13c8c73400000000, 0x5fe0519700000000, + 0xca9e9aa800000000, 0x86b60c0b00000000, 0x95d7bf8100000000, + 0xd9ff292200000000, 0x4c81e21d00000000, 0x00a974be00000000, + 0x667c746200000000, 0x2a54e2c100000000, 0xbf2a29fe00000000, + 0xf302bf5d00000000, 0x3286599d00000000, 0x7eaecf3e00000000, + 0xebd0040100000000, 0xa7f892a200000000, 0xc12d927e00000000, + 0x8d0504dd00000000, 0x187bcfe200000000, 0x5453594100000000, + 0xdb7473b800000000, 0x975ce51b00000000, 0x02222e2400000000, + 0x4e0ab88700000000, 0x28dfb85b00000000, 0x64f72ef800000000, + 0xf189e5c700000000, 0xbda1736400000000, 0x7c2595a400000000, + 0x300d030700000000, 0xa573c83800000000, 0xe95b5e9b00000000, + 0x8f8e5e4700000000, 0xc3a6c8e400000000, 0x56d803db00000000, + 0x1af0957800000000}, + {0x0000000000000000, 0x939bc97f00000000, 0x263793ff00000000, + 0xb5ac5a8000000000, 0x0d68572400000000, 0x9ef39e5b00000000, + 0x2b5fc4db00000000, 0xb8c40da400000000, 0x1ad0ae4800000000, + 0x894b673700000000, 0x3ce73db700000000, 0xaf7cf4c800000000, + 0x17b8f96c00000000, 0x8423301300000000, 0x318f6a9300000000, + 0xa214a3ec00000000, 0x34a05d9100000000, 0xa73b94ee00000000, + 0x1297ce6e00000000, 0x810c071100000000, 0x39c80ab500000000, + 0xaa53c3ca00000000, 0x1fff994a00000000, 0x8c64503500000000, + 0x2e70f3d900000000, 0xbdeb3aa600000000, 0x0847602600000000, + 0x9bdca95900000000, 0x2318a4fd00000000, 0xb0836d8200000000, + 0x052f370200000000, 0x96b4fe7d00000000, 0x2946caf900000000, + 0xbadd038600000000, 0x0f71590600000000, 0x9cea907900000000, + 0x242e9ddd00000000, 0xb7b554a200000000, 0x02190e2200000000, + 0x9182c75d00000000, 0x339664b100000000, 0xa00dadce00000000, + 0x15a1f74e00000000, 0x863a3e3100000000, 0x3efe339500000000, + 0xad65faea00000000, 0x18c9a06a00000000, 0x8b52691500000000, + 0x1de6976800000000, 0x8e7d5e1700000000, 0x3bd1049700000000, + 0xa84acde800000000, 0x108ec04c00000000, 0x8315093300000000, + 0x36b953b300000000, 0xa5229acc00000000, 0x0736392000000000, + 0x94adf05f00000000, 0x2101aadf00000000, 0xb29a63a000000000, + 0x0a5e6e0400000000, 0x99c5a77b00000000, 0x2c69fdfb00000000, + 0xbff2348400000000, 0x138ae52800000000, 0x80112c5700000000, + 0x35bd76d700000000, 0xa626bfa800000000, 0x1ee2b20c00000000, + 0x8d797b7300000000, 0x38d521f300000000, 0xab4ee88c00000000, + 0x095a4b6000000000, 0x9ac1821f00000000, 0x2f6dd89f00000000, + 0xbcf611e000000000, 0x04321c4400000000, 0x97a9d53b00000000, + 0x22058fbb00000000, 0xb19e46c400000000, 0x272ab8b900000000, + 0xb4b171c600000000, 0x011d2b4600000000, 0x9286e23900000000, + 0x2a42ef9d00000000, 0xb9d926e200000000, 0x0c757c6200000000, + 0x9feeb51d00000000, 0x3dfa16f100000000, 0xae61df8e00000000, + 0x1bcd850e00000000, 0x88564c7100000000, 0x309241d500000000, + 0xa30988aa00000000, 0x16a5d22a00000000, 0x853e1b5500000000, + 0x3acc2fd100000000, 0xa957e6ae00000000, 0x1cfbbc2e00000000, + 0x8f60755100000000, 0x37a478f500000000, 0xa43fb18a00000000, + 0x1193eb0a00000000, 0x8208227500000000, 0x201c819900000000, + 0xb38748e600000000, 0x062b126600000000, 0x95b0db1900000000, + 0x2d74d6bd00000000, 0xbeef1fc200000000, 0x0b43454200000000, + 0x98d88c3d00000000, 0x0e6c724000000000, 0x9df7bb3f00000000, + 0x285be1bf00000000, 0xbbc028c000000000, 0x0304256400000000, + 0x909fec1b00000000, 0x2533b69b00000000, 0xb6a87fe400000000, + 0x14bcdc0800000000, 0x8727157700000000, 0x328b4ff700000000, + 0xa110868800000000, 0x19d48b2c00000000, 0x8a4f425300000000, + 0x3fe318d300000000, 0xac78d1ac00000000, 0x2614cb5100000000, + 0xb58f022e00000000, 0x002358ae00000000, 0x93b891d100000000, + 0x2b7c9c7500000000, 0xb8e7550a00000000, 0x0d4b0f8a00000000, + 0x9ed0c6f500000000, 0x3cc4651900000000, 0xaf5fac6600000000, + 0x1af3f6e600000000, 0x89683f9900000000, 0x31ac323d00000000, + 0xa237fb4200000000, 0x179ba1c200000000, 0x840068bd00000000, + 0x12b496c000000000, 0x812f5fbf00000000, 0x3483053f00000000, + 0xa718cc4000000000, 0x1fdcc1e400000000, 0x8c47089b00000000, + 0x39eb521b00000000, 0xaa709b6400000000, 0x0864388800000000, + 0x9bfff1f700000000, 0x2e53ab7700000000, 0xbdc8620800000000, + 0x050c6fac00000000, 0x9697a6d300000000, 0x233bfc5300000000, + 0xb0a0352c00000000, 0x0f5201a800000000, 0x9cc9c8d700000000, + 0x2965925700000000, 0xbafe5b2800000000, 0x023a568c00000000, + 0x91a19ff300000000, 0x240dc57300000000, 0xb7960c0c00000000, + 0x1582afe000000000, 0x8619669f00000000, 0x33b53c1f00000000, + 0xa02ef56000000000, 0x18eaf8c400000000, 0x8b7131bb00000000, + 0x3edd6b3b00000000, 0xad46a24400000000, 0x3bf25c3900000000, + 0xa869954600000000, 0x1dc5cfc600000000, 0x8e5e06b900000000, + 0x369a0b1d00000000, 0xa501c26200000000, 0x10ad98e200000000, + 0x8336519d00000000, 0x2122f27100000000, 0xb2b93b0e00000000, + 0x0715618e00000000, 0x948ea8f100000000, 0x2c4aa55500000000, + 0xbfd16c2a00000000, 0x0a7d36aa00000000, 0x99e6ffd500000000, + 0x359e2e7900000000, 0xa605e70600000000, 0x13a9bd8600000000, + 0x803274f900000000, 0x38f6795d00000000, 0xab6db02200000000, + 0x1ec1eaa200000000, 0x8d5a23dd00000000, 0x2f4e803100000000, + 0xbcd5494e00000000, 0x097913ce00000000, 0x9ae2dab100000000, + 0x2226d71500000000, 0xb1bd1e6a00000000, 0x041144ea00000000, + 0x978a8d9500000000, 0x013e73e800000000, 0x92a5ba9700000000, + 0x2709e01700000000, 0xb492296800000000, 0x0c5624cc00000000, + 0x9fcdedb300000000, 0x2a61b73300000000, 0xb9fa7e4c00000000, + 0x1beedda000000000, 0x887514df00000000, 0x3dd94e5f00000000, + 0xae42872000000000, 0x16868a8400000000, 0x851d43fb00000000, + 0x30b1197b00000000, 0xa32ad00400000000, 0x1cd8e48000000000, + 0x8f432dff00000000, 0x3aef777f00000000, 0xa974be0000000000, + 0x11b0b3a400000000, 0x822b7adb00000000, 0x3787205b00000000, + 0xa41ce92400000000, 0x06084ac800000000, 0x959383b700000000, + 0x203fd93700000000, 0xb3a4104800000000, 0x0b601dec00000000, + 0x98fbd49300000000, 0x2d578e1300000000, 0xbecc476c00000000, + 0x2878b91100000000, 0xbbe3706e00000000, 0x0e4f2aee00000000, + 0x9dd4e39100000000, 0x2510ee3500000000, 0xb68b274a00000000, + 0x03277dca00000000, 0x90bcb4b500000000, 0x32a8175900000000, + 0xa133de2600000000, 0x149f84a600000000, 0x87044dd900000000, + 0x3fc0407d00000000, 0xac5b890200000000, 0x19f7d38200000000, + 0x8a6c1afd00000000}, + {0x0000000000000000, 0x650b796900000000, 0xca16f2d200000000, + 0xaf1d8bbb00000000, 0xd52b957e00000000, 0xb020ec1700000000, + 0x1f3d67ac00000000, 0x7a361ec500000000, 0xaa572afd00000000, + 0xcf5c539400000000, 0x6041d82f00000000, 0x054aa14600000000, + 0x7f7cbf8300000000, 0x1a77c6ea00000000, 0xb56a4d5100000000, + 0xd061343800000000, 0x15a9252100000000, 0x70a25c4800000000, + 0xdfbfd7f300000000, 0xbab4ae9a00000000, 0xc082b05f00000000, + 0xa589c93600000000, 0x0a94428d00000000, 0x6f9f3be400000000, + 0xbffe0fdc00000000, 0xdaf576b500000000, 0x75e8fd0e00000000, + 0x10e3846700000000, 0x6ad59aa200000000, 0x0fdee3cb00000000, + 0xa0c3687000000000, 0xc5c8111900000000, 0x2a524b4200000000, + 0x4f59322b00000000, 0xe044b99000000000, 0x854fc0f900000000, + 0xff79de3c00000000, 0x9a72a75500000000, 0x356f2cee00000000, + 0x5064558700000000, 0x800561bf00000000, 0xe50e18d600000000, + 0x4a13936d00000000, 0x2f18ea0400000000, 0x552ef4c100000000, + 0x30258da800000000, 0x9f38061300000000, 0xfa337f7a00000000, + 0x3ffb6e6300000000, 0x5af0170a00000000, 0xf5ed9cb100000000, + 0x90e6e5d800000000, 0xead0fb1d00000000, 0x8fdb827400000000, + 0x20c609cf00000000, 0x45cd70a600000000, 0x95ac449e00000000, + 0xf0a73df700000000, 0x5fbab64c00000000, 0x3ab1cf2500000000, + 0x4087d1e000000000, 0x258ca88900000000, 0x8a91233200000000, + 0xef9a5a5b00000000, 0x54a4968400000000, 0x31afefed00000000, + 0x9eb2645600000000, 0xfbb91d3f00000000, 0x818f03fa00000000, + 0xe4847a9300000000, 0x4b99f12800000000, 0x2e92884100000000, + 0xfef3bc7900000000, 0x9bf8c51000000000, 0x34e54eab00000000, + 0x51ee37c200000000, 0x2bd8290700000000, 0x4ed3506e00000000, + 0xe1cedbd500000000, 0x84c5a2bc00000000, 0x410db3a500000000, + 0x2406cacc00000000, 0x8b1b417700000000, 0xee10381e00000000, + 0x942626db00000000, 0xf12d5fb200000000, 0x5e30d40900000000, + 0x3b3bad6000000000, 0xeb5a995800000000, 0x8e51e03100000000, + 0x214c6b8a00000000, 0x444712e300000000, 0x3e710c2600000000, + 0x5b7a754f00000000, 0xf467fef400000000, 0x916c879d00000000, + 0x7ef6ddc600000000, 0x1bfda4af00000000, 0xb4e02f1400000000, + 0xd1eb567d00000000, 0xabdd48b800000000, 0xced631d100000000, + 0x61cbba6a00000000, 0x04c0c30300000000, 0xd4a1f73b00000000, + 0xb1aa8e5200000000, 0x1eb705e900000000, 0x7bbc7c8000000000, + 0x018a624500000000, 0x64811b2c00000000, 0xcb9c909700000000, + 0xae97e9fe00000000, 0x6b5ff8e700000000, 0x0e54818e00000000, + 0xa1490a3500000000, 0xc442735c00000000, 0xbe746d9900000000, + 0xdb7f14f000000000, 0x74629f4b00000000, 0x1169e62200000000, + 0xc108d21a00000000, 0xa403ab7300000000, 0x0b1e20c800000000, + 0x6e1559a100000000, 0x1423476400000000, 0x71283e0d00000000, + 0xde35b5b600000000, 0xbb3eccdf00000000, 0xe94e5cd200000000, + 0x8c4525bb00000000, 0x2358ae0000000000, 0x4653d76900000000, + 0x3c65c9ac00000000, 0x596eb0c500000000, 0xf6733b7e00000000, + 0x9378421700000000, 0x4319762f00000000, 0x26120f4600000000, + 0x890f84fd00000000, 0xec04fd9400000000, 0x9632e35100000000, + 0xf3399a3800000000, 0x5c24118300000000, 0x392f68ea00000000, + 0xfce779f300000000, 0x99ec009a00000000, 0x36f18b2100000000, + 0x53faf24800000000, 0x29ccec8d00000000, 0x4cc795e400000000, + 0xe3da1e5f00000000, 0x86d1673600000000, 0x56b0530e00000000, + 0x33bb2a6700000000, 0x9ca6a1dc00000000, 0xf9add8b500000000, + 0x839bc67000000000, 0xe690bf1900000000, 0x498d34a200000000, + 0x2c864dcb00000000, 0xc31c179000000000, 0xa6176ef900000000, + 0x090ae54200000000, 0x6c019c2b00000000, 0x163782ee00000000, + 0x733cfb8700000000, 0xdc21703c00000000, 0xb92a095500000000, + 0x694b3d6d00000000, 0x0c40440400000000, 0xa35dcfbf00000000, + 0xc656b6d600000000, 0xbc60a81300000000, 0xd96bd17a00000000, + 0x76765ac100000000, 0x137d23a800000000, 0xd6b532b100000000, + 0xb3be4bd800000000, 0x1ca3c06300000000, 0x79a8b90a00000000, + 0x039ea7cf00000000, 0x6695dea600000000, 0xc988551d00000000, + 0xac832c7400000000, 0x7ce2184c00000000, 0x19e9612500000000, + 0xb6f4ea9e00000000, 0xd3ff93f700000000, 0xa9c98d3200000000, + 0xccc2f45b00000000, 0x63df7fe000000000, 0x06d4068900000000, + 0xbdeaca5600000000, 0xd8e1b33f00000000, 0x77fc388400000000, + 0x12f741ed00000000, 0x68c15f2800000000, 0x0dca264100000000, + 0xa2d7adfa00000000, 0xc7dcd49300000000, 0x17bde0ab00000000, + 0x72b699c200000000, 0xddab127900000000, 0xb8a06b1000000000, + 0xc29675d500000000, 0xa79d0cbc00000000, 0x0880870700000000, + 0x6d8bfe6e00000000, 0xa843ef7700000000, 0xcd48961e00000000, + 0x62551da500000000, 0x075e64cc00000000, 0x7d687a0900000000, + 0x1863036000000000, 0xb77e88db00000000, 0xd275f1b200000000, + 0x0214c58a00000000, 0x671fbce300000000, 0xc802375800000000, + 0xad094e3100000000, 0xd73f50f400000000, 0xb234299d00000000, + 0x1d29a22600000000, 0x7822db4f00000000, 0x97b8811400000000, + 0xf2b3f87d00000000, 0x5dae73c600000000, 0x38a50aaf00000000, + 0x4293146a00000000, 0x27986d0300000000, 0x8885e6b800000000, + 0xed8e9fd100000000, 0x3defabe900000000, 0x58e4d28000000000, + 0xf7f9593b00000000, 0x92f2205200000000, 0xe8c43e9700000000, + 0x8dcf47fe00000000, 0x22d2cc4500000000, 0x47d9b52c00000000, + 0x8211a43500000000, 0xe71add5c00000000, 0x480756e700000000, + 0x2d0c2f8e00000000, 0x573a314b00000000, 0x3231482200000000, + 0x9d2cc39900000000, 0xf827baf000000000, 0x28468ec800000000, + 0x4d4df7a100000000, 0xe2507c1a00000000, 0x875b057300000000, + 0xfd6d1bb600000000, 0x986662df00000000, 0x377be96400000000, + 0x5270900d00000000}, + {0x0000000000000000, 0xdcecb13d00000000, 0xb8d9637b00000000, + 0x6435d24600000000, 0x70b3c7f600000000, 0xac5f76cb00000000, + 0xc86aa48d00000000, 0x148615b000000000, 0xa160fe3600000000, + 0x7d8c4f0b00000000, 0x19b99d4d00000000, 0xc5552c7000000000, + 0xd1d339c000000000, 0x0d3f88fd00000000, 0x690a5abb00000000, + 0xb5e6eb8600000000, 0x42c1fc6d00000000, 0x9e2d4d5000000000, + 0xfa189f1600000000, 0x26f42e2b00000000, 0x32723b9b00000000, + 0xee9e8aa600000000, 0x8aab58e000000000, 0x5647e9dd00000000, + 0xe3a1025b00000000, 0x3f4db36600000000, 0x5b78612000000000, + 0x8794d01d00000000, 0x9312c5ad00000000, 0x4ffe749000000000, + 0x2bcba6d600000000, 0xf72717eb00000000, 0x8482f9db00000000, + 0x586e48e600000000, 0x3c5b9aa000000000, 0xe0b72b9d00000000, + 0xf4313e2d00000000, 0x28dd8f1000000000, 0x4ce85d5600000000, + 0x9004ec6b00000000, 0x25e207ed00000000, 0xf90eb6d000000000, + 0x9d3b649600000000, 0x41d7d5ab00000000, 0x5551c01b00000000, + 0x89bd712600000000, 0xed88a36000000000, 0x3164125d00000000, + 0xc64305b600000000, 0x1aafb48b00000000, 0x7e9a66cd00000000, + 0xa276d7f000000000, 0xb6f0c24000000000, 0x6a1c737d00000000, + 0x0e29a13b00000000, 0xd2c5100600000000, 0x6723fb8000000000, + 0xbbcf4abd00000000, 0xdffa98fb00000000, 0x031629c600000000, + 0x17903c7600000000, 0xcb7c8d4b00000000, 0xaf495f0d00000000, + 0x73a5ee3000000000, 0x4903826c00000000, 0x95ef335100000000, + 0xf1dae11700000000, 0x2d36502a00000000, 0x39b0459a00000000, + 0xe55cf4a700000000, 0x816926e100000000, 0x5d8597dc00000000, + 0xe8637c5a00000000, 0x348fcd6700000000, 0x50ba1f2100000000, + 0x8c56ae1c00000000, 0x98d0bbac00000000, 0x443c0a9100000000, + 0x2009d8d700000000, 0xfce569ea00000000, 0x0bc27e0100000000, + 0xd72ecf3c00000000, 0xb31b1d7a00000000, 0x6ff7ac4700000000, + 0x7b71b9f700000000, 0xa79d08ca00000000, 0xc3a8da8c00000000, + 0x1f446bb100000000, 0xaaa2803700000000, 0x764e310a00000000, + 0x127be34c00000000, 0xce97527100000000, 0xda1147c100000000, + 0x06fdf6fc00000000, 0x62c824ba00000000, 0xbe24958700000000, + 0xcd817bb700000000, 0x116dca8a00000000, 0x755818cc00000000, + 0xa9b4a9f100000000, 0xbd32bc4100000000, 0x61de0d7c00000000, + 0x05ebdf3a00000000, 0xd9076e0700000000, 0x6ce1858100000000, + 0xb00d34bc00000000, 0xd438e6fa00000000, 0x08d457c700000000, + 0x1c52427700000000, 0xc0bef34a00000000, 0xa48b210c00000000, + 0x7867903100000000, 0x8f4087da00000000, 0x53ac36e700000000, + 0x3799e4a100000000, 0xeb75559c00000000, 0xfff3402c00000000, + 0x231ff11100000000, 0x472a235700000000, 0x9bc6926a00000000, + 0x2e2079ec00000000, 0xf2ccc8d100000000, 0x96f91a9700000000, + 0x4a15abaa00000000, 0x5e93be1a00000000, 0x827f0f2700000000, + 0xe64add6100000000, 0x3aa66c5c00000000, 0x920604d900000000, + 0x4eeab5e400000000, 0x2adf67a200000000, 0xf633d69f00000000, + 0xe2b5c32f00000000, 0x3e59721200000000, 0x5a6ca05400000000, + 0x8680116900000000, 0x3366faef00000000, 0xef8a4bd200000000, + 0x8bbf999400000000, 0x575328a900000000, 0x43d53d1900000000, + 0x9f398c2400000000, 0xfb0c5e6200000000, 0x27e0ef5f00000000, + 0xd0c7f8b400000000, 0x0c2b498900000000, 0x681e9bcf00000000, + 0xb4f22af200000000, 0xa0743f4200000000, 0x7c988e7f00000000, + 0x18ad5c3900000000, 0xc441ed0400000000, 0x71a7068200000000, + 0xad4bb7bf00000000, 0xc97e65f900000000, 0x1592d4c400000000, + 0x0114c17400000000, 0xddf8704900000000, 0xb9cda20f00000000, + 0x6521133200000000, 0x1684fd0200000000, 0xca684c3f00000000, + 0xae5d9e7900000000, 0x72b12f4400000000, 0x66373af400000000, + 0xbadb8bc900000000, 0xdeee598f00000000, 0x0202e8b200000000, + 0xb7e4033400000000, 0x6b08b20900000000, 0x0f3d604f00000000, + 0xd3d1d17200000000, 0xc757c4c200000000, 0x1bbb75ff00000000, + 0x7f8ea7b900000000, 0xa362168400000000, 0x5445016f00000000, + 0x88a9b05200000000, 0xec9c621400000000, 0x3070d32900000000, + 0x24f6c69900000000, 0xf81a77a400000000, 0x9c2fa5e200000000, + 0x40c314df00000000, 0xf525ff5900000000, 0x29c94e6400000000, + 0x4dfc9c2200000000, 0x91102d1f00000000, 0x859638af00000000, + 0x597a899200000000, 0x3d4f5bd400000000, 0xe1a3eae900000000, + 0xdb0586b500000000, 0x07e9378800000000, 0x63dce5ce00000000, + 0xbf3054f300000000, 0xabb6414300000000, 0x775af07e00000000, + 0x136f223800000000, 0xcf83930500000000, 0x7a65788300000000, + 0xa689c9be00000000, 0xc2bc1bf800000000, 0x1e50aac500000000, + 0x0ad6bf7500000000, 0xd63a0e4800000000, 0xb20fdc0e00000000, + 0x6ee36d3300000000, 0x99c47ad800000000, 0x4528cbe500000000, + 0x211d19a300000000, 0xfdf1a89e00000000, 0xe977bd2e00000000, + 0x359b0c1300000000, 0x51aede5500000000, 0x8d426f6800000000, + 0x38a484ee00000000, 0xe44835d300000000, 0x807de79500000000, + 0x5c9156a800000000, 0x4817431800000000, 0x94fbf22500000000, + 0xf0ce206300000000, 0x2c22915e00000000, 0x5f877f6e00000000, + 0x836bce5300000000, 0xe75e1c1500000000, 0x3bb2ad2800000000, + 0x2f34b89800000000, 0xf3d809a500000000, 0x97eddbe300000000, + 0x4b016ade00000000, 0xfee7815800000000, 0x220b306500000000, + 0x463ee22300000000, 0x9ad2531e00000000, 0x8e5446ae00000000, + 0x52b8f79300000000, 0x368d25d500000000, 0xea6194e800000000, + 0x1d46830300000000, 0xc1aa323e00000000, 0xa59fe07800000000, + 0x7973514500000000, 0x6df544f500000000, 0xb119f5c800000000, + 0xd52c278e00000000, 0x09c096b300000000, 0xbc267d3500000000, + 0x60cacc0800000000, 0x04ff1e4e00000000, 0xd813af7300000000, + 0xcc95bac300000000, 0x10790bfe00000000, 0x744cd9b800000000, + 0xa8a0688500000000}}; + +#else /* W == 4 */ + +local const z_crc_t FAR crc_braid_table[][256] = { + {0x00000000, 0x81256527, 0xd93bcc0f, 0x581ea928, 0x69069e5f, + 0xe823fb78, 0xb03d5250, 0x31183777, 0xd20d3cbe, 0x53285999, + 0x0b36f0b1, 0x8a139596, 0xbb0ba2e1, 0x3a2ec7c6, 0x62306eee, + 0xe3150bc9, 0x7f6b7f3d, 0xfe4e1a1a, 0xa650b332, 0x2775d615, + 0x166de162, 0x97488445, 0xcf562d6d, 0x4e73484a, 0xad664383, + 0x2c4326a4, 0x745d8f8c, 0xf578eaab, 0xc460dddc, 0x4545b8fb, + 0x1d5b11d3, 0x9c7e74f4, 0xfed6fe7a, 0x7ff39b5d, 0x27ed3275, + 0xa6c85752, 0x97d06025, 0x16f50502, 0x4eebac2a, 0xcfcec90d, + 0x2cdbc2c4, 0xadfea7e3, 0xf5e00ecb, 0x74c56bec, 0x45dd5c9b, + 0xc4f839bc, 0x9ce69094, 0x1dc3f5b3, 0x81bd8147, 0x0098e460, + 0x58864d48, 0xd9a3286f, 0xe8bb1f18, 0x699e7a3f, 0x3180d317, + 0xb0a5b630, 0x53b0bdf9, 0xd295d8de, 0x8a8b71f6, 0x0bae14d1, + 0x3ab623a6, 0xbb934681, 0xe38defa9, 0x62a88a8e, 0x26dcfab5, + 0xa7f99f92, 0xffe736ba, 0x7ec2539d, 0x4fda64ea, 0xceff01cd, + 0x96e1a8e5, 0x17c4cdc2, 0xf4d1c60b, 0x75f4a32c, 0x2dea0a04, + 0xaccf6f23, 0x9dd75854, 0x1cf23d73, 0x44ec945b, 0xc5c9f17c, + 0x59b78588, 0xd892e0af, 0x808c4987, 0x01a92ca0, 0x30b11bd7, + 0xb1947ef0, 0xe98ad7d8, 0x68afb2ff, 0x8bbab936, 0x0a9fdc11, + 0x52817539, 0xd3a4101e, 0xe2bc2769, 0x6399424e, 0x3b87eb66, + 0xbaa28e41, 0xd80a04cf, 0x592f61e8, 0x0131c8c0, 0x8014ade7, + 0xb10c9a90, 0x3029ffb7, 0x6837569f, 0xe91233b8, 0x0a073871, + 0x8b225d56, 0xd33cf47e, 0x52199159, 0x6301a62e, 0xe224c309, + 0xba3a6a21, 0x3b1f0f06, 0xa7617bf2, 0x26441ed5, 0x7e5ab7fd, + 0xff7fd2da, 0xce67e5ad, 0x4f42808a, 0x175c29a2, 0x96794c85, + 0x756c474c, 0xf449226b, 0xac578b43, 0x2d72ee64, 0x1c6ad913, + 0x9d4fbc34, 0xc551151c, 0x4474703b, 0x4db9f56a, 0xcc9c904d, + 0x94823965, 0x15a75c42, 0x24bf6b35, 0xa59a0e12, 0xfd84a73a, + 0x7ca1c21d, 0x9fb4c9d4, 0x1e91acf3, 0x468f05db, 0xc7aa60fc, + 0xf6b2578b, 0x779732ac, 0x2f899b84, 0xaeacfea3, 0x32d28a57, + 0xb3f7ef70, 0xebe94658, 0x6acc237f, 0x5bd41408, 0xdaf1712f, + 0x82efd807, 0x03cabd20, 0xe0dfb6e9, 0x61fad3ce, 0x39e47ae6, + 0xb8c11fc1, 0x89d928b6, 0x08fc4d91, 0x50e2e4b9, 0xd1c7819e, + 0xb36f0b10, 0x324a6e37, 0x6a54c71f, 0xeb71a238, 0xda69954f, + 0x5b4cf068, 0x03525940, 0x82773c67, 0x616237ae, 0xe0475289, + 0xb859fba1, 0x397c9e86, 0x0864a9f1, 0x8941ccd6, 0xd15f65fe, + 0x507a00d9, 0xcc04742d, 0x4d21110a, 0x153fb822, 0x941add05, + 0xa502ea72, 0x24278f55, 0x7c39267d, 0xfd1c435a, 0x1e094893, + 0x9f2c2db4, 0xc732849c, 0x4617e1bb, 0x770fd6cc, 0xf62ab3eb, + 0xae341ac3, 0x2f117fe4, 0x6b650fdf, 0xea406af8, 0xb25ec3d0, + 0x337ba6f7, 0x02639180, 0x8346f4a7, 0xdb585d8f, 0x5a7d38a8, + 0xb9683361, 0x384d5646, 0x6053ff6e, 0xe1769a49, 0xd06ead3e, + 0x514bc819, 0x09556131, 0x88700416, 0x140e70e2, 0x952b15c5, + 0xcd35bced, 0x4c10d9ca, 0x7d08eebd, 0xfc2d8b9a, 0xa43322b2, + 0x25164795, 0xc6034c5c, 0x4726297b, 0x1f388053, 0x9e1de574, + 0xaf05d203, 0x2e20b724, 0x763e1e0c, 0xf71b7b2b, 0x95b3f1a5, + 0x14969482, 0x4c883daa, 0xcdad588d, 0xfcb56ffa, 0x7d900add, + 0x258ea3f5, 0xa4abc6d2, 0x47becd1b, 0xc69ba83c, 0x9e850114, + 0x1fa06433, 0x2eb85344, 0xaf9d3663, 0xf7839f4b, 0x76a6fa6c, + 0xead88e98, 0x6bfdebbf, 0x33e34297, 0xb2c627b0, 0x83de10c7, + 0x02fb75e0, 0x5ae5dcc8, 0xdbc0b9ef, 0x38d5b226, 0xb9f0d701, + 0xe1ee7e29, 0x60cb1b0e, 0x51d32c79, 0xd0f6495e, 0x88e8e076, + 0x09cd8551}, + {0x00000000, 0x9b73ead4, 0xed96d3e9, 0x76e5393d, 0x005ca193, + 0x9b2f4b47, 0xedca727a, 0x76b998ae, 0x00b94326, 0x9bcaa9f2, + 0xed2f90cf, 0x765c7a1b, 0x00e5e2b5, 0x9b960861, 0xed73315c, + 0x7600db88, 0x0172864c, 0x9a016c98, 0xece455a5, 0x7797bf71, + 0x012e27df, 0x9a5dcd0b, 0xecb8f436, 0x77cb1ee2, 0x01cbc56a, + 0x9ab82fbe, 0xec5d1683, 0x772efc57, 0x019764f9, 0x9ae48e2d, + 0xec01b710, 0x77725dc4, 0x02e50c98, 0x9996e64c, 0xef73df71, + 0x740035a5, 0x02b9ad0b, 0x99ca47df, 0xef2f7ee2, 0x745c9436, + 0x025c4fbe, 0x992fa56a, 0xefca9c57, 0x74b97683, 0x0200ee2d, + 0x997304f9, 0xef963dc4, 0x74e5d710, 0x03978ad4, 0x98e46000, + 0xee01593d, 0x7572b3e9, 0x03cb2b47, 0x98b8c193, 0xee5df8ae, + 0x752e127a, 0x032ec9f2, 0x985d2326, 0xeeb81a1b, 0x75cbf0cf, + 0x03726861, 0x980182b5, 0xeee4bb88, 0x7597515c, 0x05ca1930, + 0x9eb9f3e4, 0xe85ccad9, 0x732f200d, 0x0596b8a3, 0x9ee55277, + 0xe8006b4a, 0x7373819e, 0x05735a16, 0x9e00b0c2, 0xe8e589ff, + 0x7396632b, 0x052ffb85, 0x9e5c1151, 0xe8b9286c, 0x73cac2b8, + 0x04b89f7c, 0x9fcb75a8, 0xe92e4c95, 0x725da641, 0x04e43eef, + 0x9f97d43b, 0xe972ed06, 0x720107d2, 0x0401dc5a, 0x9f72368e, + 0xe9970fb3, 0x72e4e567, 0x045d7dc9, 0x9f2e971d, 0xe9cbae20, + 0x72b844f4, 0x072f15a8, 0x9c5cff7c, 0xeab9c641, 0x71ca2c95, + 0x0773b43b, 0x9c005eef, 0xeae567d2, 0x71968d06, 0x0796568e, + 0x9ce5bc5a, 0xea008567, 0x71736fb3, 0x07caf71d, 0x9cb91dc9, + 0xea5c24f4, 0x712fce20, 0x065d93e4, 0x9d2e7930, 0xebcb400d, + 0x70b8aad9, 0x06013277, 0x9d72d8a3, 0xeb97e19e, 0x70e40b4a, + 0x06e4d0c2, 0x9d973a16, 0xeb72032b, 0x7001e9ff, 0x06b87151, + 0x9dcb9b85, 0xeb2ea2b8, 0x705d486c, 0x0b943260, 0x90e7d8b4, + 0xe602e189, 0x7d710b5d, 0x0bc893f3, 0x90bb7927, 0xe65e401a, + 0x7d2daace, 0x0b2d7146, 0x905e9b92, 0xe6bba2af, 0x7dc8487b, + 0x0b71d0d5, 0x90023a01, 0xe6e7033c, 0x7d94e9e8, 0x0ae6b42c, + 0x91955ef8, 0xe77067c5, 0x7c038d11, 0x0aba15bf, 0x91c9ff6b, + 0xe72cc656, 0x7c5f2c82, 0x0a5ff70a, 0x912c1dde, 0xe7c924e3, + 0x7cbace37, 0x0a035699, 0x9170bc4d, 0xe7958570, 0x7ce66fa4, + 0x09713ef8, 0x9202d42c, 0xe4e7ed11, 0x7f9407c5, 0x092d9f6b, + 0x925e75bf, 0xe4bb4c82, 0x7fc8a656, 0x09c87dde, 0x92bb970a, + 0xe45eae37, 0x7f2d44e3, 0x0994dc4d, 0x92e73699, 0xe4020fa4, + 0x7f71e570, 0x0803b8b4, 0x93705260, 0xe5956b5d, 0x7ee68189, + 0x085f1927, 0x932cf3f3, 0xe5c9cace, 0x7eba201a, 0x08bafb92, + 0x93c91146, 0xe52c287b, 0x7e5fc2af, 0x08e65a01, 0x9395b0d5, + 0xe57089e8, 0x7e03633c, 0x0e5e2b50, 0x952dc184, 0xe3c8f8b9, + 0x78bb126d, 0x0e028ac3, 0x95716017, 0xe394592a, 0x78e7b3fe, + 0x0ee76876, 0x959482a2, 0xe371bb9f, 0x7802514b, 0x0ebbc9e5, + 0x95c82331, 0xe32d1a0c, 0x785ef0d8, 0x0f2cad1c, 0x945f47c8, + 0xe2ba7ef5, 0x79c99421, 0x0f700c8f, 0x9403e65b, 0xe2e6df66, + 0x799535b2, 0x0f95ee3a, 0x94e604ee, 0xe2033dd3, 0x7970d707, + 0x0fc94fa9, 0x94baa57d, 0xe25f9c40, 0x792c7694, 0x0cbb27c8, + 0x97c8cd1c, 0xe12df421, 0x7a5e1ef5, 0x0ce7865b, 0x97946c8f, + 0xe17155b2, 0x7a02bf66, 0x0c0264ee, 0x97718e3a, 0xe194b707, + 0x7ae75dd3, 0x0c5ec57d, 0x972d2fa9, 0xe1c81694, 0x7abbfc40, + 0x0dc9a184, 0x96ba4b50, 0xe05f726d, 0x7b2c98b9, 0x0d950017, + 0x96e6eac3, 0xe003d3fe, 0x7b70392a, 0x0d70e2a2, 0x96030876, + 0xe0e6314b, 0x7b95db9f, 0x0d2c4331, 0x965fa9e5, 0xe0ba90d8, + 0x7bc97a0c}, + {0x00000000, 0x172864c0, 0x2e50c980, 0x3978ad40, 0x5ca19300, + 0x4b89f7c0, 0x72f15a80, 0x65d93e40, 0xb9432600, 0xae6b42c0, + 0x9713ef80, 0x803b8b40, 0xe5e2b500, 0xf2cad1c0, 0xcbb27c80, + 0xdc9a1840, 0xa9f74a41, 0xbedf2e81, 0x87a783c1, 0x908fe701, + 0xf556d941, 0xe27ebd81, 0xdb0610c1, 0xcc2e7401, 0x10b46c41, + 0x079c0881, 0x3ee4a5c1, 0x29ccc101, 0x4c15ff41, 0x5b3d9b81, + 0x624536c1, 0x756d5201, 0x889f92c3, 0x9fb7f603, 0xa6cf5b43, + 0xb1e73f83, 0xd43e01c3, 0xc3166503, 0xfa6ec843, 0xed46ac83, + 0x31dcb4c3, 0x26f4d003, 0x1f8c7d43, 0x08a41983, 0x6d7d27c3, + 0x7a554303, 0x432dee43, 0x54058a83, 0x2168d882, 0x3640bc42, + 0x0f381102, 0x181075c2, 0x7dc94b82, 0x6ae12f42, 0x53998202, + 0x44b1e6c2, 0x982bfe82, 0x8f039a42, 0xb67b3702, 0xa15353c2, + 0xc48a6d82, 0xd3a20942, 0xeadaa402, 0xfdf2c0c2, 0xca4e23c7, + 0xdd664707, 0xe41eea47, 0xf3368e87, 0x96efb0c7, 0x81c7d407, + 0xb8bf7947, 0xaf971d87, 0x730d05c7, 0x64256107, 0x5d5dcc47, + 0x4a75a887, 0x2fac96c7, 0x3884f207, 0x01fc5f47, 0x16d43b87, + 0x63b96986, 0x74910d46, 0x4de9a006, 0x5ac1c4c6, 0x3f18fa86, + 0x28309e46, 0x11483306, 0x066057c6, 0xdafa4f86, 0xcdd22b46, + 0xf4aa8606, 0xe382e2c6, 0x865bdc86, 0x9173b846, 0xa80b1506, + 0xbf2371c6, 0x42d1b104, 0x55f9d5c4, 0x6c817884, 0x7ba91c44, + 0x1e702204, 0x095846c4, 0x3020eb84, 0x27088f44, 0xfb929704, + 0xecbaf3c4, 0xd5c25e84, 0xc2ea3a44, 0xa7330404, 0xb01b60c4, + 0x8963cd84, 0x9e4ba944, 0xeb26fb45, 0xfc0e9f85, 0xc57632c5, + 0xd25e5605, 0xb7876845, 0xa0af0c85, 0x99d7a1c5, 0x8effc505, + 0x5265dd45, 0x454db985, 0x7c3514c5, 0x6b1d7005, 0x0ec44e45, + 0x19ec2a85, 0x209487c5, 0x37bce305, 0x4fed41cf, 0x58c5250f, + 0x61bd884f, 0x7695ec8f, 0x134cd2cf, 0x0464b60f, 0x3d1c1b4f, + 0x2a347f8f, 0xf6ae67cf, 0xe186030f, 0xd8feae4f, 0xcfd6ca8f, + 0xaa0ff4cf, 0xbd27900f, 0x845f3d4f, 0x9377598f, 0xe61a0b8e, + 0xf1326f4e, 0xc84ac20e, 0xdf62a6ce, 0xbabb988e, 0xad93fc4e, + 0x94eb510e, 0x83c335ce, 0x5f592d8e, 0x4871494e, 0x7109e40e, + 0x662180ce, 0x03f8be8e, 0x14d0da4e, 0x2da8770e, 0x3a8013ce, + 0xc772d30c, 0xd05ab7cc, 0xe9221a8c, 0xfe0a7e4c, 0x9bd3400c, + 0x8cfb24cc, 0xb583898c, 0xa2abed4c, 0x7e31f50c, 0x691991cc, + 0x50613c8c, 0x4749584c, 0x2290660c, 0x35b802cc, 0x0cc0af8c, + 0x1be8cb4c, 0x6e85994d, 0x79adfd8d, 0x40d550cd, 0x57fd340d, + 0x32240a4d, 0x250c6e8d, 0x1c74c3cd, 0x0b5ca70d, 0xd7c6bf4d, + 0xc0eedb8d, 0xf99676cd, 0xeebe120d, 0x8b672c4d, 0x9c4f488d, + 0xa537e5cd, 0xb21f810d, 0x85a36208, 0x928b06c8, 0xabf3ab88, + 0xbcdbcf48, 0xd902f108, 0xce2a95c8, 0xf7523888, 0xe07a5c48, + 0x3ce04408, 0x2bc820c8, 0x12b08d88, 0x0598e948, 0x6041d708, + 0x7769b3c8, 0x4e111e88, 0x59397a48, 0x2c542849, 0x3b7c4c89, + 0x0204e1c9, 0x152c8509, 0x70f5bb49, 0x67dddf89, 0x5ea572c9, + 0x498d1609, 0x95170e49, 0x823f6a89, 0xbb47c7c9, 0xac6fa309, + 0xc9b69d49, 0xde9ef989, 0xe7e654c9, 0xf0ce3009, 0x0d3cf0cb, + 0x1a14940b, 0x236c394b, 0x34445d8b, 0x519d63cb, 0x46b5070b, + 0x7fcdaa4b, 0x68e5ce8b, 0xb47fd6cb, 0xa357b20b, 0x9a2f1f4b, + 0x8d077b8b, 0xe8de45cb, 0xfff6210b, 0xc68e8c4b, 0xd1a6e88b, + 0xa4cbba8a, 0xb3e3de4a, 0x8a9b730a, 0x9db317ca, 0xf86a298a, + 0xef424d4a, 0xd63ae00a, 0xc11284ca, 0x1d889c8a, 0x0aa0f84a, + 0x33d8550a, 0x24f031ca, 0x41290f8a, 0x56016b4a, 0x6f79c60a, + 0x7851a2ca}, + {0x00000000, 0x9fda839e, 0xe4c4017d, 0x7b1e82e3, 0x12f904bb, + 0x8d238725, 0xf63d05c6, 0x69e78658, 0x25f20976, 0xba288ae8, + 0xc136080b, 0x5eec8b95, 0x370b0dcd, 0xa8d18e53, 0xd3cf0cb0, + 0x4c158f2e, 0x4be412ec, 0xd43e9172, 0xaf201391, 0x30fa900f, + 0x591d1657, 0xc6c795c9, 0xbdd9172a, 0x220394b4, 0x6e161b9a, + 0xf1cc9804, 0x8ad21ae7, 0x15089979, 0x7cef1f21, 0xe3359cbf, + 0x982b1e5c, 0x07f19dc2, 0x97c825d8, 0x0812a646, 0x730c24a5, + 0xecd6a73b, 0x85312163, 0x1aeba2fd, 0x61f5201e, 0xfe2fa380, + 0xb23a2cae, 0x2de0af30, 0x56fe2dd3, 0xc924ae4d, 0xa0c32815, + 0x3f19ab8b, 0x44072968, 0xdbddaaf6, 0xdc2c3734, 0x43f6b4aa, + 0x38e83649, 0xa732b5d7, 0xced5338f, 0x510fb011, 0x2a1132f2, + 0xb5cbb16c, 0xf9de3e42, 0x6604bddc, 0x1d1a3f3f, 0x82c0bca1, + 0xeb273af9, 0x74fdb967, 0x0fe33b84, 0x9039b81a, 0xf4e14df1, + 0x6b3bce6f, 0x10254c8c, 0x8fffcf12, 0xe618494a, 0x79c2cad4, + 0x02dc4837, 0x9d06cba9, 0xd1134487, 0x4ec9c719, 0x35d745fa, + 0xaa0dc664, 0xc3ea403c, 0x5c30c3a2, 0x272e4141, 0xb8f4c2df, + 0xbf055f1d, 0x20dfdc83, 0x5bc15e60, 0xc41bddfe, 0xadfc5ba6, + 0x3226d838, 0x49385adb, 0xd6e2d945, 0x9af7566b, 0x052dd5f5, + 0x7e335716, 0xe1e9d488, 0x880e52d0, 0x17d4d14e, 0x6cca53ad, + 0xf310d033, 0x63296829, 0xfcf3ebb7, 0x87ed6954, 0x1837eaca, + 0x71d06c92, 0xee0aef0c, 0x95146def, 0x0aceee71, 0x46db615f, + 0xd901e2c1, 0xa21f6022, 0x3dc5e3bc, 0x542265e4, 0xcbf8e67a, + 0xb0e66499, 0x2f3ce707, 0x28cd7ac5, 0xb717f95b, 0xcc097bb8, + 0x53d3f826, 0x3a347e7e, 0xa5eefde0, 0xdef07f03, 0x412afc9d, + 0x0d3f73b3, 0x92e5f02d, 0xe9fb72ce, 0x7621f150, 0x1fc67708, + 0x801cf496, 0xfb027675, 0x64d8f5eb, 0x32b39da3, 0xad691e3d, + 0xd6779cde, 0x49ad1f40, 0x204a9918, 0xbf901a86, 0xc48e9865, + 0x5b541bfb, 0x174194d5, 0x889b174b, 0xf38595a8, 0x6c5f1636, + 0x05b8906e, 0x9a6213f0, 0xe17c9113, 0x7ea6128d, 0x79578f4f, + 0xe68d0cd1, 0x9d938e32, 0x02490dac, 0x6bae8bf4, 0xf474086a, + 0x8f6a8a89, 0x10b00917, 0x5ca58639, 0xc37f05a7, 0xb8618744, + 0x27bb04da, 0x4e5c8282, 0xd186011c, 0xaa9883ff, 0x35420061, + 0xa57bb87b, 0x3aa13be5, 0x41bfb906, 0xde653a98, 0xb782bcc0, + 0x28583f5e, 0x5346bdbd, 0xcc9c3e23, 0x8089b10d, 0x1f533293, + 0x644db070, 0xfb9733ee, 0x9270b5b6, 0x0daa3628, 0x76b4b4cb, + 0xe96e3755, 0xee9faa97, 0x71452909, 0x0a5babea, 0x95812874, + 0xfc66ae2c, 0x63bc2db2, 0x18a2af51, 0x87782ccf, 0xcb6da3e1, + 0x54b7207f, 0x2fa9a29c, 0xb0732102, 0xd994a75a, 0x464e24c4, + 0x3d50a627, 0xa28a25b9, 0xc652d052, 0x598853cc, 0x2296d12f, + 0xbd4c52b1, 0xd4abd4e9, 0x4b715777, 0x306fd594, 0xafb5560a, + 0xe3a0d924, 0x7c7a5aba, 0x0764d859, 0x98be5bc7, 0xf159dd9f, + 0x6e835e01, 0x159ddce2, 0x8a475f7c, 0x8db6c2be, 0x126c4120, + 0x6972c3c3, 0xf6a8405d, 0x9f4fc605, 0x0095459b, 0x7b8bc778, + 0xe45144e6, 0xa844cbc8, 0x379e4856, 0x4c80cab5, 0xd35a492b, + 0xbabdcf73, 0x25674ced, 0x5e79ce0e, 0xc1a34d90, 0x519af58a, + 0xce407614, 0xb55ef4f7, 0x2a847769, 0x4363f131, 0xdcb972af, + 0xa7a7f04c, 0x387d73d2, 0x7468fcfc, 0xebb27f62, 0x90acfd81, + 0x0f767e1f, 0x6691f847, 0xf94b7bd9, 0x8255f93a, 0x1d8f7aa4, + 0x1a7ee766, 0x85a464f8, 0xfebae61b, 0x61606585, 0x0887e3dd, + 0x975d6043, 0xec43e2a0, 0x7399613e, 0x3f8cee10, 0xa0566d8e, + 0xdb48ef6d, 0x44926cf3, 0x2d75eaab, 0xb2af6935, 0xc9b1ebd6, + 0x566b6848}}; + +local const z_word_t FAR crc_braid_big_table[][256] = { + {0x00000000, 0x9e83da9f, 0x7d01c4e4, 0xe3821e7b, 0xbb04f912, + 0x2587238d, 0xc6053df6, 0x5886e769, 0x7609f225, 0xe88a28ba, + 0x0b0836c1, 0x958bec5e, 0xcd0d0b37, 0x538ed1a8, 0xb00ccfd3, + 0x2e8f154c, 0xec12e44b, 0x72913ed4, 0x911320af, 0x0f90fa30, + 0x57161d59, 0xc995c7c6, 0x2a17d9bd, 0xb4940322, 0x9a1b166e, + 0x0498ccf1, 0xe71ad28a, 0x79990815, 0x211fef7c, 0xbf9c35e3, + 0x5c1e2b98, 0xc29df107, 0xd825c897, 0x46a61208, 0xa5240c73, + 0x3ba7d6ec, 0x63213185, 0xfda2eb1a, 0x1e20f561, 0x80a32ffe, + 0xae2c3ab2, 0x30afe02d, 0xd32dfe56, 0x4dae24c9, 0x1528c3a0, + 0x8bab193f, 0x68290744, 0xf6aadddb, 0x34372cdc, 0xaab4f643, + 0x4936e838, 0xd7b532a7, 0x8f33d5ce, 0x11b00f51, 0xf232112a, + 0x6cb1cbb5, 0x423edef9, 0xdcbd0466, 0x3f3f1a1d, 0xa1bcc082, + 0xf93a27eb, 0x67b9fd74, 0x843be30f, 0x1ab83990, 0xf14de1f4, + 0x6fce3b6b, 0x8c4c2510, 0x12cfff8f, 0x4a4918e6, 0xd4cac279, + 0x3748dc02, 0xa9cb069d, 0x874413d1, 0x19c7c94e, 0xfa45d735, + 0x64c60daa, 0x3c40eac3, 0xa2c3305c, 0x41412e27, 0xdfc2f4b8, + 0x1d5f05bf, 0x83dcdf20, 0x605ec15b, 0xfedd1bc4, 0xa65bfcad, + 0x38d82632, 0xdb5a3849, 0x45d9e2d6, 0x6b56f79a, 0xf5d52d05, + 0x1657337e, 0x88d4e9e1, 0xd0520e88, 0x4ed1d417, 0xad53ca6c, + 0x33d010f3, 0x29682963, 0xb7ebf3fc, 0x5469ed87, 0xcaea3718, + 0x926cd071, 0x0cef0aee, 0xef6d1495, 0x71eece0a, 0x5f61db46, + 0xc1e201d9, 0x22601fa2, 0xbce3c53d, 0xe4652254, 0x7ae6f8cb, + 0x9964e6b0, 0x07e73c2f, 0xc57acd28, 0x5bf917b7, 0xb87b09cc, + 0x26f8d353, 0x7e7e343a, 0xe0fdeea5, 0x037ff0de, 0x9dfc2a41, + 0xb3733f0d, 0x2df0e592, 0xce72fbe9, 0x50f12176, 0x0877c61f, + 0x96f41c80, 0x757602fb, 0xebf5d864, 0xa39db332, 0x3d1e69ad, + 0xde9c77d6, 0x401fad49, 0x18994a20, 0x861a90bf, 0x65988ec4, + 0xfb1b545b, 0xd5944117, 0x4b179b88, 0xa89585f3, 0x36165f6c, + 0x6e90b805, 0xf013629a, 0x13917ce1, 0x8d12a67e, 0x4f8f5779, + 0xd10c8de6, 0x328e939d, 0xac0d4902, 0xf48bae6b, 0x6a0874f4, + 0x898a6a8f, 0x1709b010, 0x3986a55c, 0xa7057fc3, 0x448761b8, + 0xda04bb27, 0x82825c4e, 0x1c0186d1, 0xff8398aa, 0x61004235, + 0x7bb87ba5, 0xe53ba13a, 0x06b9bf41, 0x983a65de, 0xc0bc82b7, + 0x5e3f5828, 0xbdbd4653, 0x233e9ccc, 0x0db18980, 0x9332531f, + 0x70b04d64, 0xee3397fb, 0xb6b57092, 0x2836aa0d, 0xcbb4b476, + 0x55376ee9, 0x97aa9fee, 0x09294571, 0xeaab5b0a, 0x74288195, + 0x2cae66fc, 0xb22dbc63, 0x51afa218, 0xcf2c7887, 0xe1a36dcb, + 0x7f20b754, 0x9ca2a92f, 0x022173b0, 0x5aa794d9, 0xc4244e46, + 0x27a6503d, 0xb9258aa2, 0x52d052c6, 0xcc538859, 0x2fd19622, + 0xb1524cbd, 0xe9d4abd4, 0x7757714b, 0x94d56f30, 0x0a56b5af, + 0x24d9a0e3, 0xba5a7a7c, 0x59d86407, 0xc75bbe98, 0x9fdd59f1, + 0x015e836e, 0xe2dc9d15, 0x7c5f478a, 0xbec2b68d, 0x20416c12, + 0xc3c37269, 0x5d40a8f6, 0x05c64f9f, 0x9b459500, 0x78c78b7b, + 0xe64451e4, 0xc8cb44a8, 0x56489e37, 0xb5ca804c, 0x2b495ad3, + 0x73cfbdba, 0xed4c6725, 0x0ece795e, 0x904da3c1, 0x8af59a51, + 0x147640ce, 0xf7f45eb5, 0x6977842a, 0x31f16343, 0xaf72b9dc, + 0x4cf0a7a7, 0xd2737d38, 0xfcfc6874, 0x627fb2eb, 0x81fdac90, + 0x1f7e760f, 0x47f89166, 0xd97b4bf9, 0x3af95582, 0xa47a8f1d, + 0x66e77e1a, 0xf864a485, 0x1be6bafe, 0x85656061, 0xdde38708, + 0x43605d97, 0xa0e243ec, 0x3e619973, 0x10ee8c3f, 0x8e6d56a0, + 0x6def48db, 0xf36c9244, 0xabea752d, 0x3569afb2, 0xd6ebb1c9, + 0x48686b56}, + {0x00000000, 0xc0642817, 0x80c9502e, 0x40ad7839, 0x0093a15c, + 0xc0f7894b, 0x805af172, 0x403ed965, 0x002643b9, 0xc0426bae, + 0x80ef1397, 0x408b3b80, 0x00b5e2e5, 0xc0d1caf2, 0x807cb2cb, + 0x40189adc, 0x414af7a9, 0x812edfbe, 0xc183a787, 0x01e78f90, + 0x41d956f5, 0x81bd7ee2, 0xc11006db, 0x01742ecc, 0x416cb410, + 0x81089c07, 0xc1a5e43e, 0x01c1cc29, 0x41ff154c, 0x819b3d5b, + 0xc1364562, 0x01526d75, 0xc3929f88, 0x03f6b79f, 0x435bcfa6, + 0x833fe7b1, 0xc3013ed4, 0x036516c3, 0x43c86efa, 0x83ac46ed, + 0xc3b4dc31, 0x03d0f426, 0x437d8c1f, 0x8319a408, 0xc3277d6d, + 0x0343557a, 0x43ee2d43, 0x838a0554, 0x82d86821, 0x42bc4036, + 0x0211380f, 0xc2751018, 0x824bc97d, 0x422fe16a, 0x02829953, + 0xc2e6b144, 0x82fe2b98, 0x429a038f, 0x02377bb6, 0xc25353a1, + 0x826d8ac4, 0x4209a2d3, 0x02a4daea, 0xc2c0f2fd, 0xc7234eca, + 0x074766dd, 0x47ea1ee4, 0x878e36f3, 0xc7b0ef96, 0x07d4c781, + 0x4779bfb8, 0x871d97af, 0xc7050d73, 0x07612564, 0x47cc5d5d, + 0x87a8754a, 0xc796ac2f, 0x07f28438, 0x475ffc01, 0x873bd416, + 0x8669b963, 0x460d9174, 0x06a0e94d, 0xc6c4c15a, 0x86fa183f, + 0x469e3028, 0x06334811, 0xc6576006, 0x864ffada, 0x462bd2cd, + 0x0686aaf4, 0xc6e282e3, 0x86dc5b86, 0x46b87391, 0x06150ba8, + 0xc67123bf, 0x04b1d142, 0xc4d5f955, 0x8478816c, 0x441ca97b, + 0x0422701e, 0xc4465809, 0x84eb2030, 0x448f0827, 0x049792fb, + 0xc4f3baec, 0x845ec2d5, 0x443aeac2, 0x040433a7, 0xc4601bb0, + 0x84cd6389, 0x44a94b9e, 0x45fb26eb, 0x859f0efc, 0xc53276c5, + 0x05565ed2, 0x456887b7, 0x850cafa0, 0xc5a1d799, 0x05c5ff8e, + 0x45dd6552, 0x85b94d45, 0xc514357c, 0x05701d6b, 0x454ec40e, + 0x852aec19, 0xc5879420, 0x05e3bc37, 0xcf41ed4f, 0x0f25c558, + 0x4f88bd61, 0x8fec9576, 0xcfd24c13, 0x0fb66404, 0x4f1b1c3d, + 0x8f7f342a, 0xcf67aef6, 0x0f0386e1, 0x4faefed8, 0x8fcad6cf, + 0xcff40faa, 0x0f9027bd, 0x4f3d5f84, 0x8f597793, 0x8e0b1ae6, + 0x4e6f32f1, 0x0ec24ac8, 0xcea662df, 0x8e98bbba, 0x4efc93ad, + 0x0e51eb94, 0xce35c383, 0x8e2d595f, 0x4e497148, 0x0ee40971, + 0xce802166, 0x8ebef803, 0x4edad014, 0x0e77a82d, 0xce13803a, + 0x0cd372c7, 0xccb75ad0, 0x8c1a22e9, 0x4c7e0afe, 0x0c40d39b, + 0xcc24fb8c, 0x8c8983b5, 0x4cedaba2, 0x0cf5317e, 0xcc911969, + 0x8c3c6150, 0x4c584947, 0x0c669022, 0xcc02b835, 0x8cafc00c, + 0x4ccbe81b, 0x4d99856e, 0x8dfdad79, 0xcd50d540, 0x0d34fd57, + 0x4d0a2432, 0x8d6e0c25, 0xcdc3741c, 0x0da75c0b, 0x4dbfc6d7, + 0x8ddbeec0, 0xcd7696f9, 0x0d12beee, 0x4d2c678b, 0x8d484f9c, + 0xcde537a5, 0x0d811fb2, 0x0862a385, 0xc8068b92, 0x88abf3ab, + 0x48cfdbbc, 0x08f102d9, 0xc8952ace, 0x883852f7, 0x485c7ae0, + 0x0844e03c, 0xc820c82b, 0x888db012, 0x48e99805, 0x08d74160, + 0xc8b36977, 0x881e114e, 0x487a3959, 0x4928542c, 0x894c7c3b, + 0xc9e10402, 0x09852c15, 0x49bbf570, 0x89dfdd67, 0xc972a55e, + 0x09168d49, 0x490e1795, 0x896a3f82, 0xc9c747bb, 0x09a36fac, + 0x499db6c9, 0x89f99ede, 0xc954e6e7, 0x0930cef0, 0xcbf03c0d, + 0x0b94141a, 0x4b396c23, 0x8b5d4434, 0xcb639d51, 0x0b07b546, + 0x4baacd7f, 0x8bcee568, 0xcbd67fb4, 0x0bb257a3, 0x4b1f2f9a, + 0x8b7b078d, 0xcb45dee8, 0x0b21f6ff, 0x4b8c8ec6, 0x8be8a6d1, + 0x8abacba4, 0x4adee3b3, 0x0a739b8a, 0xca17b39d, 0x8a296af8, + 0x4a4d42ef, 0x0ae03ad6, 0xca8412c1, 0x8a9c881d, 0x4af8a00a, + 0x0a55d833, 0xca31f024, 0x8a0f2941, 0x4a6b0156, 0x0ac6796f, + 0xcaa25178}, + {0x00000000, 0xd4ea739b, 0xe9d396ed, 0x3d39e576, 0x93a15c00, + 0x474b2f9b, 0x7a72caed, 0xae98b976, 0x2643b900, 0xf2a9ca9b, + 0xcf902fed, 0x1b7a5c76, 0xb5e2e500, 0x6108969b, 0x5c3173ed, + 0x88db0076, 0x4c867201, 0x986c019a, 0xa555e4ec, 0x71bf9777, + 0xdf272e01, 0x0bcd5d9a, 0x36f4b8ec, 0xe21ecb77, 0x6ac5cb01, + 0xbe2fb89a, 0x83165dec, 0x57fc2e77, 0xf9649701, 0x2d8ee49a, + 0x10b701ec, 0xc45d7277, 0x980ce502, 0x4ce69699, 0x71df73ef, + 0xa5350074, 0x0badb902, 0xdf47ca99, 0xe27e2fef, 0x36945c74, + 0xbe4f5c02, 0x6aa52f99, 0x579ccaef, 0x8376b974, 0x2dee0002, + 0xf9047399, 0xc43d96ef, 0x10d7e574, 0xd48a9703, 0x0060e498, + 0x3d5901ee, 0xe9b37275, 0x472bcb03, 0x93c1b898, 0xaef85dee, + 0x7a122e75, 0xf2c92e03, 0x26235d98, 0x1b1ab8ee, 0xcff0cb75, + 0x61687203, 0xb5820198, 0x88bbe4ee, 0x5c519775, 0x3019ca05, + 0xe4f3b99e, 0xd9ca5ce8, 0x0d202f73, 0xa3b89605, 0x7752e59e, + 0x4a6b00e8, 0x9e817373, 0x165a7305, 0xc2b0009e, 0xff89e5e8, + 0x2b639673, 0x85fb2f05, 0x51115c9e, 0x6c28b9e8, 0xb8c2ca73, + 0x7c9fb804, 0xa875cb9f, 0x954c2ee9, 0x41a65d72, 0xef3ee404, + 0x3bd4979f, 0x06ed72e9, 0xd2070172, 0x5adc0104, 0x8e36729f, + 0xb30f97e9, 0x67e5e472, 0xc97d5d04, 0x1d972e9f, 0x20aecbe9, + 0xf444b872, 0xa8152f07, 0x7cff5c9c, 0x41c6b9ea, 0x952cca71, + 0x3bb47307, 0xef5e009c, 0xd267e5ea, 0x068d9671, 0x8e569607, + 0x5abce59c, 0x678500ea, 0xb36f7371, 0x1df7ca07, 0xc91db99c, + 0xf4245cea, 0x20ce2f71, 0xe4935d06, 0x30792e9d, 0x0d40cbeb, + 0xd9aab870, 0x77320106, 0xa3d8729d, 0x9ee197eb, 0x4a0be470, + 0xc2d0e406, 0x163a979d, 0x2b0372eb, 0xffe90170, 0x5171b806, + 0x859bcb9d, 0xb8a22eeb, 0x6c485d70, 0x6032940b, 0xb4d8e790, + 0x89e102e6, 0x5d0b717d, 0xf393c80b, 0x2779bb90, 0x1a405ee6, + 0xceaa2d7d, 0x46712d0b, 0x929b5e90, 0xafa2bbe6, 0x7b48c87d, + 0xd5d0710b, 0x013a0290, 0x3c03e7e6, 0xe8e9947d, 0x2cb4e60a, + 0xf85e9591, 0xc56770e7, 0x118d037c, 0xbf15ba0a, 0x6bffc991, + 0x56c62ce7, 0x822c5f7c, 0x0af75f0a, 0xde1d2c91, 0xe324c9e7, + 0x37ceba7c, 0x9956030a, 0x4dbc7091, 0x708595e7, 0xa46fe67c, + 0xf83e7109, 0x2cd40292, 0x11ede7e4, 0xc507947f, 0x6b9f2d09, + 0xbf755e92, 0x824cbbe4, 0x56a6c87f, 0xde7dc809, 0x0a97bb92, + 0x37ae5ee4, 0xe3442d7f, 0x4ddc9409, 0x9936e792, 0xa40f02e4, + 0x70e5717f, 0xb4b80308, 0x60527093, 0x5d6b95e5, 0x8981e67e, + 0x27195f08, 0xf3f32c93, 0xcecac9e5, 0x1a20ba7e, 0x92fbba08, + 0x4611c993, 0x7b282ce5, 0xafc25f7e, 0x015ae608, 0xd5b09593, + 0xe88970e5, 0x3c63037e, 0x502b5e0e, 0x84c12d95, 0xb9f8c8e3, + 0x6d12bb78, 0xc38a020e, 0x17607195, 0x2a5994e3, 0xfeb3e778, + 0x7668e70e, 0xa2829495, 0x9fbb71e3, 0x4b510278, 0xe5c9bb0e, + 0x3123c895, 0x0c1a2de3, 0xd8f05e78, 0x1cad2c0f, 0xc8475f94, + 0xf57ebae2, 0x2194c979, 0x8f0c700f, 0x5be60394, 0x66dfe6e2, + 0xb2359579, 0x3aee950f, 0xee04e694, 0xd33d03e2, 0x07d77079, + 0xa94fc90f, 0x7da5ba94, 0x409c5fe2, 0x94762c79, 0xc827bb0c, + 0x1ccdc897, 0x21f42de1, 0xf51e5e7a, 0x5b86e70c, 0x8f6c9497, + 0xb25571e1, 0x66bf027a, 0xee64020c, 0x3a8e7197, 0x07b794e1, + 0xd35de77a, 0x7dc55e0c, 0xa92f2d97, 0x9416c8e1, 0x40fcbb7a, + 0x84a1c90d, 0x504bba96, 0x6d725fe0, 0xb9982c7b, 0x1700950d, + 0xc3eae696, 0xfed303e0, 0x2a39707b, 0xa2e2700d, 0x76080396, + 0x4b31e6e0, 0x9fdb957b, 0x31432c0d, 0xe5a95f96, 0xd890bae0, + 0x0c7ac97b}, + {0x00000000, 0x27652581, 0x0fcc3bd9, 0x28a91e58, 0x5f9e0669, + 0x78fb23e8, 0x50523db0, 0x77371831, 0xbe3c0dd2, 0x99592853, + 0xb1f0360b, 0x9695138a, 0xe1a20bbb, 0xc6c72e3a, 0xee6e3062, + 0xc90b15e3, 0x3d7f6b7f, 0x1a1a4efe, 0x32b350a6, 0x15d67527, + 0x62e16d16, 0x45844897, 0x6d2d56cf, 0x4a48734e, 0x834366ad, + 0xa426432c, 0x8c8f5d74, 0xabea78f5, 0xdcdd60c4, 0xfbb84545, + 0xd3115b1d, 0xf4747e9c, 0x7afed6fe, 0x5d9bf37f, 0x7532ed27, + 0x5257c8a6, 0x2560d097, 0x0205f516, 0x2aaceb4e, 0x0dc9cecf, + 0xc4c2db2c, 0xe3a7fead, 0xcb0ee0f5, 0xec6bc574, 0x9b5cdd45, + 0xbc39f8c4, 0x9490e69c, 0xb3f5c31d, 0x4781bd81, 0x60e49800, + 0x484d8658, 0x6f28a3d9, 0x181fbbe8, 0x3f7a9e69, 0x17d38031, + 0x30b6a5b0, 0xf9bdb053, 0xded895d2, 0xf6718b8a, 0xd114ae0b, + 0xa623b63a, 0x814693bb, 0xa9ef8de3, 0x8e8aa862, 0xb5fadc26, + 0x929ff9a7, 0xba36e7ff, 0x9d53c27e, 0xea64da4f, 0xcd01ffce, + 0xe5a8e196, 0xc2cdc417, 0x0bc6d1f4, 0x2ca3f475, 0x040aea2d, + 0x236fcfac, 0x5458d79d, 0x733df21c, 0x5b94ec44, 0x7cf1c9c5, + 0x8885b759, 0xafe092d8, 0x87498c80, 0xa02ca901, 0xd71bb130, + 0xf07e94b1, 0xd8d78ae9, 0xffb2af68, 0x36b9ba8b, 0x11dc9f0a, + 0x39758152, 0x1e10a4d3, 0x6927bce2, 0x4e429963, 0x66eb873b, + 0x418ea2ba, 0xcf040ad8, 0xe8612f59, 0xc0c83101, 0xe7ad1480, + 0x909a0cb1, 0xb7ff2930, 0x9f563768, 0xb83312e9, 0x7138070a, + 0x565d228b, 0x7ef43cd3, 0x59911952, 0x2ea60163, 0x09c324e2, + 0x216a3aba, 0x060f1f3b, 0xf27b61a7, 0xd51e4426, 0xfdb75a7e, + 0xdad27fff, 0xade567ce, 0x8a80424f, 0xa2295c17, 0x854c7996, + 0x4c476c75, 0x6b2249f4, 0x438b57ac, 0x64ee722d, 0x13d96a1c, + 0x34bc4f9d, 0x1c1551c5, 0x3b707444, 0x6af5b94d, 0x4d909ccc, + 0x65398294, 0x425ca715, 0x356bbf24, 0x120e9aa5, 0x3aa784fd, + 0x1dc2a17c, 0xd4c9b49f, 0xf3ac911e, 0xdb058f46, 0xfc60aac7, + 0x8b57b2f6, 0xac329777, 0x849b892f, 0xa3feacae, 0x578ad232, + 0x70eff7b3, 0x5846e9eb, 0x7f23cc6a, 0x0814d45b, 0x2f71f1da, + 0x07d8ef82, 0x20bdca03, 0xe9b6dfe0, 0xced3fa61, 0xe67ae439, + 0xc11fc1b8, 0xb628d989, 0x914dfc08, 0xb9e4e250, 0x9e81c7d1, + 0x100b6fb3, 0x376e4a32, 0x1fc7546a, 0x38a271eb, 0x4f9569da, + 0x68f04c5b, 0x40595203, 0x673c7782, 0xae376261, 0x895247e0, + 0xa1fb59b8, 0x869e7c39, 0xf1a96408, 0xd6cc4189, 0xfe655fd1, + 0xd9007a50, 0x2d7404cc, 0x0a11214d, 0x22b83f15, 0x05dd1a94, + 0x72ea02a5, 0x558f2724, 0x7d26397c, 0x5a431cfd, 0x9348091e, + 0xb42d2c9f, 0x9c8432c7, 0xbbe11746, 0xccd60f77, 0xebb32af6, + 0xc31a34ae, 0xe47f112f, 0xdf0f656b, 0xf86a40ea, 0xd0c35eb2, + 0xf7a67b33, 0x80916302, 0xa7f44683, 0x8f5d58db, 0xa8387d5a, + 0x613368b9, 0x46564d38, 0x6eff5360, 0x499a76e1, 0x3ead6ed0, + 0x19c84b51, 0x31615509, 0x16047088, 0xe2700e14, 0xc5152b95, + 0xedbc35cd, 0xcad9104c, 0xbdee087d, 0x9a8b2dfc, 0xb22233a4, + 0x95471625, 0x5c4c03c6, 0x7b292647, 0x5380381f, 0x74e51d9e, + 0x03d205af, 0x24b7202e, 0x0c1e3e76, 0x2b7b1bf7, 0xa5f1b395, + 0x82949614, 0xaa3d884c, 0x8d58adcd, 0xfa6fb5fc, 0xdd0a907d, + 0xf5a38e25, 0xd2c6aba4, 0x1bcdbe47, 0x3ca89bc6, 0x1401859e, + 0x3364a01f, 0x4453b82e, 0x63369daf, 0x4b9f83f7, 0x6cfaa676, + 0x988ed8ea, 0xbfebfd6b, 0x9742e333, 0xb027c6b2, 0xc710de83, + 0xe075fb02, 0xc8dce55a, 0xefb9c0db, 0x26b2d538, 0x01d7f0b9, + 0x297eeee1, 0x0e1bcb60, 0x792cd351, 0x5e49f6d0, 0x76e0e888, + 0x5185cd09}}; + +#endif + +#endif + +#endif + +local const z_crc_t FAR x2n_table[] = { + 0x40000000, 0x20000000, 0x08000000, 0x00800000, 0x00008000, + 0xedb88320, 0xb1e6b092, 0xa06a2517, 0xed627dae, 0x88d14467, + 0xd7bbfe6a, 0xec447f11, 0x8e7ea170, 0x6427800e, 0x4d47bae0, + 0x09fe548f, 0x83852d0f, 0x30362f1a, 0x7b5a9cc3, 0x31fec169, + 0x9fec022a, 0x6c8dedc4, 0x15d6874d, 0x5fde7a4e, 0xbad90e37, + 0x2e4e5eef, 0x4eaba214, 0xa8a472c0, 0x429a969e, 0x148d302a, + 0xc40ba6d0, 0xc4e22c3c}; diff --git a/vendor/zlib/deflate.c b/vendor/zlib/deflate.c index 1ec761448d..799fb93cc0 100644 --- a/vendor/zlib/deflate.c +++ b/vendor/zlib/deflate.c @@ -1,5 +1,5 @@ /* deflate.c -- compress data using the deflation algorithm - * Copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler + * Copyright (C) 1995-2022 Jean-loup Gailly and Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -52,7 +52,7 @@ #include "deflate.h" const char deflate_copyright[] = - " deflate 1.2.11 Copyright 1995-2017 Jean-loup Gailly and Mark Adler "; + " deflate 1.2.12 Copyright 1995-2022 Jean-loup Gailly and Mark Adler "; /* If you use the zlib library in a product, an acknowledgment is welcome in the documentation of your product. If for some reason you cannot @@ -190,8 +190,11 @@ local const config configuration_table[10] = { * prev[] will be initialized on the fly. */ #define CLEAR_HASH(s) \ - s->head[s->hash_size-1] = NIL; \ - zmemzero((Bytef *)s->head, (unsigned)(s->hash_size-1)*sizeof(*s->head)); + do { \ + s->head[s->hash_size-1] = NIL; \ + zmemzero((Bytef *)s->head, \ + (unsigned)(s->hash_size-1)*sizeof(*s->head)); \ + } while (0) /* =========================================================================== * Slide the hash table when sliding the window down (could be avoided with 32 @@ -252,11 +255,6 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, int wrap = 1; static const char my_version[] = ZLIB_VERSION; - ushf *overlay; - /* We overlay pending_buf and d_buf+l_buf. This works since the average - * output size for (length,distance) codes is <= 24 bits. - */ - if (version == Z_NULL || version[0] != my_version[0] || stream_size != sizeof(z_stream)) { return Z_VERSION_ERROR; @@ -326,9 +324,47 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, s->lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */ - overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2); - s->pending_buf = (uchf *) overlay; - s->pending_buf_size = (ulg)s->lit_bufsize * (sizeof(ush)+2L); + /* We overlay pending_buf and sym_buf. This works since the average size + * for length/distance pairs over any compressed block is assured to be 31 + * bits or less. + * + * Analysis: The longest fixed codes are a length code of 8 bits plus 5 + * extra bits, for lengths 131 to 257. The longest fixed distance codes are + * 5 bits plus 13 extra bits, for distances 16385 to 32768. The longest + * possible fixed-codes length/distance pair is then 31 bits total. + * + * sym_buf starts one-fourth of the way into pending_buf. So there are + * three bytes in sym_buf for every four bytes in pending_buf. Each symbol + * in sym_buf is three bytes -- two for the distance and one for the + * literal/length. As each symbol is consumed, the pointer to the next + * sym_buf value to read moves forward three bytes. From that symbol, up to + * 31 bits are written to pending_buf. The closest the written pending_buf + * bits gets to the next sym_buf symbol to read is just before the last + * code is written. At that time, 31*(n-2) bits have been written, just + * after 24*(n-2) bits have been consumed from sym_buf. sym_buf starts at + * 8*n bits into pending_buf. (Note that the symbol buffer fills when n-1 + * symbols are written.) The closest the writing gets to what is unread is + * then n+14 bits. Here n is lit_bufsize, which is 16384 by default, and + * can range from 128 to 32768. + * + * Therefore, at a minimum, there are 142 bits of space between what is + * written and what is read in the overlain buffers, so the symbols cannot + * be overwritten by the compressed data. That space is actually 139 bits, + * due to the three-bit fixed-code block header. + * + * That covers the case where either Z_FIXED is specified, forcing fixed + * codes, or when the use of fixed codes is chosen, because that choice + * results in a smaller compressed block than dynamic codes. That latter + * condition then assures that the above analysis also covers all dynamic + * blocks. A dynamic-code block will only be chosen to be emitted if it has + * fewer bits than a fixed-code block would for the same set of symbols. + * Therefore its average symbol length is assured to be less than 31. So + * the compressed data for a dynamic block also cannot overwrite the + * symbols from which it is being constructed. + */ + + s->pending_buf = (uchf *) ZALLOC(strm, s->lit_bufsize, 4); + s->pending_buf_size = (ulg)s->lit_bufsize * 4; if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL || s->pending_buf == Z_NULL) { @@ -337,8 +373,12 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, deflateEnd (strm); return Z_MEM_ERROR; } - s->d_buf = overlay + s->lit_bufsize/sizeof(ush); - s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize; + s->sym_buf = s->pending_buf + s->lit_bufsize; + s->sym_end = (s->lit_bufsize - 1) * 3; + /* We avoid equality with lit_bufsize*3 because of wraparound at 64K + * on 16 bit machines and because stored blocks are restricted to + * 64K-1 bytes. + */ s->level = level; s->strategy = strategy; @@ -488,13 +528,13 @@ int ZEXPORT deflateResetKeep (strm) #ifdef GZIP s->wrap == 2 ? GZIP_STATE : #endif - s->wrap ? INIT_STATE : BUSY_STATE; + INIT_STATE; strm->adler = #ifdef GZIP s->wrap == 2 ? crc32(0L, Z_NULL, 0) : #endif adler32(0L, Z_NULL, 0); - s->last_flush = Z_NO_FLUSH; + s->last_flush = -2; _tr_init(s); @@ -549,7 +589,8 @@ int ZEXPORT deflatePrime (strm, bits, value) if (deflateStateCheck(strm)) return Z_STREAM_ERROR; s = strm->state; - if ((Bytef *)(s->d_buf) < s->pending_out + ((Buf_size + 7) >> 3)) + if (bits < 0 || bits > 16 || + s->sym_buf < s->pending_out + ((Buf_size + 7) >> 3)) return Z_BUF_ERROR; do { put = Buf_size - s->bi_valid; @@ -587,12 +628,12 @@ int ZEXPORT deflateParams(strm, level, strategy) func = configuration_table[s->level].func; if ((strategy != s->strategy || func != configuration_table[level].func) && - s->high_water) { + s->last_flush != -2) { /* Flush the last buffer: */ int err = deflate(strm, Z_BLOCK); if (err == Z_STREAM_ERROR) return err; - if (strm->avail_out == 0) + if (strm->avail_in || (s->strstart - s->block_start) + s->lookahead) return Z_BUF_ERROR; } if (s->level != level) { @@ -811,6 +852,8 @@ int ZEXPORT deflate (strm, flush) } /* Write the header */ + if (s->status == INIT_STATE && s->wrap == 0) + s->status = BUSY_STATE; if (s->status == INIT_STATE) { /* zlib header */ uInt header = (Z_DEFLATED + ((s->w_bits-8)<<4)) << 8; @@ -1108,7 +1151,6 @@ int ZEXPORT deflateCopy (dest, source) #else deflate_state *ds; deflate_state *ss; - ushf *overlay; if (deflateStateCheck(source) || dest == Z_NULL) { @@ -1128,8 +1170,7 @@ int ZEXPORT deflateCopy (dest, source) ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte)); ds->prev = (Posf *) ZALLOC(dest, ds->w_size, sizeof(Pos)); ds->head = (Posf *) ZALLOC(dest, ds->hash_size, sizeof(Pos)); - overlay = (ushf *) ZALLOC(dest, ds->lit_bufsize, sizeof(ush)+2); - ds->pending_buf = (uchf *) overlay; + ds->pending_buf = (uchf *) ZALLOC(dest, ds->lit_bufsize, 4); if (ds->window == Z_NULL || ds->prev == Z_NULL || ds->head == Z_NULL || ds->pending_buf == Z_NULL) { @@ -1143,8 +1184,7 @@ int ZEXPORT deflateCopy (dest, source) zmemcpy(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size); ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf); - ds->d_buf = overlay + ds->lit_bufsize/sizeof(ush); - ds->l_buf = ds->pending_buf + (1+sizeof(ush))*ds->lit_bufsize; + ds->sym_buf = ds->pending_buf + ds->lit_bufsize; ds->l_desc.dyn_tree = ds->dyn_ltree; ds->d_desc.dyn_tree = ds->dyn_dtree; @@ -1513,6 +1553,8 @@ local void fill_window(s) s->match_start -= wsize; s->strstart -= wsize; /* we now have strstart >= MAX_DIST */ s->block_start -= (long) wsize; + if (s->insert > s->strstart) + s->insert = s->strstart; slide_hash(s); more += wsize; } @@ -1742,6 +1784,7 @@ local block_state deflate_stored(s, flush) s->matches = 2; /* clear hash */ zmemcpy(s->window, s->strm->next_in - s->w_size, s->w_size); s->strstart = s->w_size; + s->insert = s->strstart; } else { if (s->window_size - s->strstart <= used) { @@ -1750,12 +1793,14 @@ local block_state deflate_stored(s, flush) zmemcpy(s->window, s->window + s->w_size, s->strstart); if (s->matches < 2) s->matches++; /* add a pending slide_hash() */ + if (s->insert > s->strstart) + s->insert = s->strstart; } zmemcpy(s->window + s->strstart, s->strm->next_in - used, used); s->strstart += used; + s->insert += MIN(used, s->w_size - s->insert); } s->block_start = s->strstart; - s->insert += MIN(used, s->w_size - s->insert); } if (s->high_water < s->strstart) s->high_water = s->strstart; @@ -1770,7 +1815,7 @@ local block_state deflate_stored(s, flush) return block_done; /* Fill the window with any remaining input. */ - have = s->window_size - s->strstart - 1; + have = s->window_size - s->strstart; if (s->strm->avail_in > have && s->block_start >= (long)s->w_size) { /* Slide the window down. */ s->block_start -= s->w_size; @@ -1779,12 +1824,15 @@ local block_state deflate_stored(s, flush) if (s->matches < 2) s->matches++; /* add a pending slide_hash() */ have += s->w_size; /* more space now */ + if (s->insert > s->strstart) + s->insert = s->strstart; } if (have > s->strm->avail_in) have = s->strm->avail_in; if (have) { read_buf(s->strm, s->window + s->strstart, have); s->strstart += have; + s->insert += MIN(have, s->w_size - s->insert); } if (s->high_water < s->strstart) s->high_water = s->strstart; @@ -1912,7 +1960,7 @@ local block_state deflate_fast(s, flush) FLUSH_BLOCK(s, 1); return finish_done; } - if (s->last_lit) + if (s->sym_next) FLUSH_BLOCK(s, 0); return block_done; } @@ -2043,7 +2091,7 @@ local block_state deflate_slow(s, flush) FLUSH_BLOCK(s, 1); return finish_done; } - if (s->last_lit) + if (s->sym_next) FLUSH_BLOCK(s, 0); return block_done; } @@ -2118,7 +2166,7 @@ local block_state deflate_rle(s, flush) FLUSH_BLOCK(s, 1); return finish_done; } - if (s->last_lit) + if (s->sym_next) FLUSH_BLOCK(s, 0); return block_done; } @@ -2157,7 +2205,7 @@ local block_state deflate_huff(s, flush) FLUSH_BLOCK(s, 1); return finish_done; } - if (s->last_lit) + if (s->sym_next) FLUSH_BLOCK(s, 0); return block_done; } diff --git a/vendor/zlib/deflate.h b/vendor/zlib/deflate.h index 23ecdd312b..17c226113b 100644 --- a/vendor/zlib/deflate.h +++ b/vendor/zlib/deflate.h @@ -1,5 +1,5 @@ /* deflate.h -- internal compression state - * Copyright (C) 1995-2016 Jean-loup Gailly + * Copyright (C) 1995-2018 Jean-loup Gailly * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -217,7 +217,7 @@ typedef struct internal_state { /* Depth of each subtree used as tie breaker for trees of equal frequency */ - uchf *l_buf; /* buffer for literals or lengths */ + uchf *sym_buf; /* buffer for distances and literals/lengths */ uInt lit_bufsize; /* Size of match buffer for literals/lengths. There are 4 reasons for @@ -239,13 +239,8 @@ typedef struct internal_state { * - I can't count above 4 */ - uInt last_lit; /* running index in l_buf */ - - ushf *d_buf; - /* Buffer for distances. To simplify the code, d_buf and l_buf have - * the same number of elements. To use different lengths, an extra flag - * array would be necessary. - */ + uInt sym_next; /* running index in sym_buf */ + uInt sym_end; /* symbol table full when sym_next reaches this */ ulg opt_len; /* bit length of current block with optimal trees */ ulg static_len; /* bit length of current block with static trees */ @@ -325,20 +320,22 @@ void ZLIB_INTERNAL _tr_stored_block OF((deflate_state *s, charf *buf, # define _tr_tally_lit(s, c, flush) \ { uch cc = (c); \ - s->d_buf[s->last_lit] = 0; \ - s->l_buf[s->last_lit++] = cc; \ + s->sym_buf[s->sym_next++] = 0; \ + s->sym_buf[s->sym_next++] = 0; \ + s->sym_buf[s->sym_next++] = cc; \ s->dyn_ltree[cc].Freq++; \ - flush = (s->last_lit == s->lit_bufsize-1); \ + flush = (s->sym_next == s->sym_end); \ } # define _tr_tally_dist(s, distance, length, flush) \ { uch len = (uch)(length); \ ush dist = (ush)(distance); \ - s->d_buf[s->last_lit] = dist; \ - s->l_buf[s->last_lit++] = len; \ + s->sym_buf[s->sym_next++] = dist; \ + s->sym_buf[s->sym_next++] = dist >> 8; \ + s->sym_buf[s->sym_next++] = len; \ dist--; \ s->dyn_ltree[_length_code[len]+LITERALS+1].Freq++; \ s->dyn_dtree[d_code(dist)].Freq++; \ - flush = (s->last_lit == s->lit_bufsize-1); \ + flush = (s->sym_next == s->sym_end); \ } #else # define _tr_tally_lit(s, c, flush) flush = _tr_tally(s, 0, c) diff --git a/vendor/zlib/gzguts.h b/vendor/zlib/gzguts.h index 990a4d2514..57faf37165 100644 --- a/vendor/zlib/gzguts.h +++ b/vendor/zlib/gzguts.h @@ -1,5 +1,5 @@ /* gzguts.h -- zlib internal header definitions for gz* operations - * Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013, 2016 Mark Adler + * Copyright (C) 2004-2019 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -39,7 +39,7 @@ # include #endif -#if defined(_WIN32) || defined(__CYGWIN__) +#if defined(_WIN32) # define WIDECHAR #endif @@ -190,6 +190,7 @@ typedef struct { /* just for writing */ int level; /* compression level */ int strategy; /* compression strategy */ + int reset; /* true if a reset is pending after a Z_FINISH */ /* seek request */ z_off64_t skip; /* amount to skip (already rewound if backwards) */ int seek; /* true if seek request pending */ diff --git a/vendor/zlib/gzlib.c b/vendor/zlib/gzlib.c index 1d91814e1d..dddaf26873 100644 --- a/vendor/zlib/gzlib.c +++ b/vendor/zlib/gzlib.c @@ -1,15 +1,11 @@ /* gzlib.c -- zlib functions common to reading and writing gzip files - * Copyright (C) 2004-2017 Mark Adler + * Copyright (C) 2004-2019 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ -#ifdef __APPLE__ - #include -#endif - #include "gzguts.h" -#if defined(_WIN32) && !defined(__BORLANDC__) && !defined(__MINGW32__) +#if defined(_WIN32) && !defined(__BORLANDC__) # define LSEEK _lseeki64 #else #if defined(_LARGEFILE64_SOURCE) && _LFS64_LARGEFILE-0 @@ -85,6 +81,8 @@ local void gz_reset(state) state->past = 0; /* have not read past end yet */ state->how = LOOK; /* look for gzip header */ } + else /* for writing ... */ + state->reset = 0; /* no deflateReset pending */ state->seek = 0; /* no seek request pending */ gz_error(state, Z_OK, NULL); /* clear error */ state->x.pos = 0; /* no uncompressed data yet */ @@ -401,7 +399,7 @@ z_off64_t ZEXPORT gzseek64(file, offset, whence) /* if within raw area while reading, just go there */ if (state->mode == GZ_READ && state->how == COPY && state->x.pos + offset >= 0) { - ret = LSEEK(state->fd, offset - state->x.have, SEEK_CUR); + ret = LSEEK(state->fd, offset - (z_off64_t)state->x.have, SEEK_CUR); if (ret == -1) return -1; state->x.have = 0; diff --git a/vendor/zlib/gzread.c b/vendor/zlib/gzread.c index d7424a23f7..884c9bfe4c 100644 --- a/vendor/zlib/gzread.c +++ b/vendor/zlib/gzread.c @@ -1,12 +1,8 @@ /* gzread.c -- zlib functions for reading gzip files - * Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013, 2016 Mark Adler + * Copyright (C) 2004-2017 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ -#ifdef __APPLE__ - #include -#endif - #include "gzguts.h" /* Local functions */ @@ -318,9 +314,9 @@ local z_size_t gz_read(state, buf, len) got = 0; do { /* set n to the maximum amount of len that fits in an unsigned int */ - n = -1; + n = (unsigned)-1; if (n > len) - n = len; + n = (unsigned)len; /* first just try copying data from the output buffer */ if (state->x.have) { @@ -401,7 +397,7 @@ int ZEXPORT gzread(file, buf, len) } /* read len or fewer bytes to buf */ - len = gz_read(state, buf, len); + len = (unsigned)gz_read(state, buf, len); /* check for an error */ if (len == 0 && state->err != Z_OK && state->err != Z_BUF_ERROR) @@ -451,7 +447,6 @@ z_size_t ZEXPORT gzfread(buf, size, nitems, file) int ZEXPORT gzgetc(file) gzFile file; { - int ret; unsigned char buf[1]; gz_statep state; @@ -473,8 +468,7 @@ int ZEXPORT gzgetc(file) } /* nothing there -- try gz_read() */ - ret = gz_read(state, buf, 1); - return ret < 1 ? -1 : buf[0]; + return gz_read(state, buf, 1) < 1 ? -1 : buf[0]; } int ZEXPORT gzgetc_(file) diff --git a/vendor/zlib/gzwrite.c b/vendor/zlib/gzwrite.c index 5b7b42294b..a8ffc8f53d 100644 --- a/vendor/zlib/gzwrite.c +++ b/vendor/zlib/gzwrite.c @@ -1,12 +1,8 @@ /* gzwrite.c -- zlib functions for writing gzip files - * Copyright (C) 2004-2017 Mark Adler + * Copyright (C) 2004-2019 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ -#ifdef __APPLE__ - #include -#endif - #include "gzguts.h" /* Local functions */ @@ -101,6 +97,15 @@ local int gz_comp(state, flush) return 0; } + /* check for a pending reset */ + if (state->reset) { + /* don't start a new gzip member unless there is data to write */ + if (strm->avail_in == 0) + return 0; + deflateReset(strm); + state->reset = 0; + } + /* run deflate() on provided input until it produces no more output */ ret = Z_OK; do { @@ -138,7 +143,7 @@ local int gz_comp(state, flush) /* if that completed a deflate stream, allow another to start */ if (flush == Z_FINISH) - deflateReset(strm); + state->reset = 1; /* all done, no errors */ return 0; @@ -213,7 +218,7 @@ local z_size_t gz_write(state, buf, len) state->in); copy = state->size - have; if (copy > len) - copy = len; + copy = (unsigned)len; memcpy(state->in + have, buf, copy); state->strm.avail_in += copy; state->x.pos += copy; @@ -233,7 +238,7 @@ local z_size_t gz_write(state, buf, len) do { unsigned n = (unsigned)-1; if (n > len) - n = len; + n = (unsigned)len; state->strm.avail_in = n; state->x.pos += n; if (gz_comp(state, Z_NO_FLUSH) == -1) @@ -353,12 +358,11 @@ int ZEXPORT gzputc(file, c) } /* -- see zlib.h -- */ -int ZEXPORT gzputs(file, str) +int ZEXPORT gzputs(file, s) gzFile file; - const char *str; + const char *s; { - int ret; - z_size_t len; + z_size_t len, put; gz_statep state; /* get internal structure */ @@ -371,9 +375,13 @@ int ZEXPORT gzputs(file, str) return -1; /* write string */ - len = strlen(str); - ret = gz_write(state, str, len); - return ret == 0 && len != 0 ? -1 : ret; + len = strlen(s); + if ((int)len < 0 || (unsigned)len != len) { + gz_error(state, Z_STREAM_ERROR, "string length does not fit in int"); + return -1; + } + put = gz_write(state, s, len); + return put < len ? -1 : (int)len; } #if defined(STDC) || defined(Z_HAVE_STDARG_H) @@ -445,7 +453,7 @@ int ZEXPORTVA gzvprintf(gzFile file, const char *format, va_list va) strm->avail_in = state->size; if (gz_comp(state, Z_NO_FLUSH) == -1) return state->err; - memcpy(state->in, state->in + state->size, left); + memmove(state->in, state->in + state->size, left); strm->next_in = state->in; strm->avail_in = left; } @@ -544,7 +552,7 @@ int ZEXPORTVA gzprintf (file, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, strm->avail_in = state->size; if (gz_comp(state, Z_NO_FLUSH) == -1) return state->err; - memcpy(state->in, state->in + state->size, left); + memmove(state->in, state->in + state->size, left); strm->next_in = state->in; strm->avail_in = left; } diff --git a/vendor/zlib/infback.c b/vendor/zlib/infback.c index 59679ecbfc..a390c58e81 100644 --- a/vendor/zlib/infback.c +++ b/vendor/zlib/infback.c @@ -1,5 +1,5 @@ /* infback.c -- inflate using a call-back interface - * Copyright (C) 1995-2016 Mark Adler + * Copyright (C) 1995-2022 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -477,6 +477,7 @@ void FAR *out_desc; } Tracev((stderr, "inflate: codes ok\n")); state->mode = LEN; + /* fallthrough */ case LEN: /* use inflate_fast() if we have enough input and output */ diff --git a/vendor/zlib/inffast.c b/vendor/zlib/inffast.c index 0dbd1dbc09..1fec7f363f 100644 --- a/vendor/zlib/inffast.c +++ b/vendor/zlib/inffast.c @@ -70,7 +70,7 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ code const FAR *dcode; /* local strm->distcode */ unsigned lmask; /* mask for first level of length codes */ unsigned dmask; /* mask for first level of distance codes */ - code here; /* retrieved table entry */ + code const *here; /* retrieved table entry */ unsigned op; /* code bits, operation, extra bits, or */ /* window position, window bytes to copy */ unsigned len; /* match length, unused bytes */ @@ -107,20 +107,20 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ hold += (unsigned long)(*in++) << bits; bits += 8; } - here = lcode[hold & lmask]; + here = lcode + (hold & lmask); dolen: - op = (unsigned)(here.bits); + op = (unsigned)(here->bits); hold >>= op; bits -= op; - op = (unsigned)(here.op); + op = (unsigned)(here->op); if (op == 0) { /* literal */ - Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? + Tracevv((stderr, here->val >= 0x20 && here->val < 0x7f ? "inflate: literal '%c'\n" : - "inflate: literal 0x%02x\n", here.val)); - *out++ = (unsigned char)(here.val); + "inflate: literal 0x%02x\n", here->val)); + *out++ = (unsigned char)(here->val); } else if (op & 16) { /* length base */ - len = (unsigned)(here.val); + len = (unsigned)(here->val); op &= 15; /* number of extra bits */ if (op) { if (bits < op) { @@ -138,14 +138,14 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ hold += (unsigned long)(*in++) << bits; bits += 8; } - here = dcode[hold & dmask]; + here = dcode + (hold & dmask); dodist: - op = (unsigned)(here.bits); + op = (unsigned)(here->bits); hold >>= op; bits -= op; - op = (unsigned)(here.op); + op = (unsigned)(here->op); if (op & 16) { /* distance base */ - dist = (unsigned)(here.val); + dist = (unsigned)(here->val); op &= 15; /* number of extra bits */ if (bits < op) { hold += (unsigned long)(*in++) << bits; @@ -264,7 +264,7 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ } } else if ((op & 64) == 0) { /* 2nd level distance code */ - here = dcode[here.val + (hold & ((1U << op) - 1))]; + here = dcode + here->val + (hold & ((1U << op) - 1)); goto dodist; } else { @@ -274,7 +274,7 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ } } else if ((op & 64) == 0) { /* 2nd level length code */ - here = lcode[here.val + (hold & ((1U << op) - 1))]; + here = lcode + here->val + (hold & ((1U << op) - 1)); goto dolen; } else if (op & 32) { /* end-of-block */ diff --git a/vendor/zlib/inflate.c b/vendor/zlib/inflate.c index ac333e8c2e..7be8c63662 100644 --- a/vendor/zlib/inflate.c +++ b/vendor/zlib/inflate.c @@ -1,5 +1,5 @@ /* inflate.c -- zlib decompression - * Copyright (C) 1995-2016 Mark Adler + * Copyright (C) 1995-2022 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -130,6 +130,7 @@ z_streamp strm; state->mode = HEAD; state->last = 0; state->havedict = 0; + state->flags = -1; state->dmax = 32768U; state->head = Z_NULL; state->hold = 0; @@ -447,10 +448,10 @@ unsigned copy; /* check function to use adler32() for zlib or crc32() for gzip */ #ifdef GUNZIP -# define UPDATE(check, buf, len) \ +# define UPDATE_CHECK(check, buf, len) \ (state->flags ? crc32(check, buf, len) : adler32(check, buf, len)) #else -# define UPDATE(check, buf, len) adler32(check, buf, len) +# define UPDATE_CHECK(check, buf, len) adler32(check, buf, len) #endif /* check macros for header crc */ @@ -670,7 +671,6 @@ int flush; state->mode = FLAGS; break; } - state->flags = 0; /* expect zlib header */ if (state->head != Z_NULL) state->head->done = -1; if (!(state->wrap & 1) || /* check if zlib header allowed */ @@ -697,6 +697,7 @@ int flush; break; } state->dmax = 1U << len; + state->flags = 0; /* indicate zlib header */ Tracev((stderr, "inflate: zlib header ok\n")); strm->adler = state->check = adler32(0L, Z_NULL, 0); state->mode = hold & 0x200 ? DICTID : TYPE; @@ -722,6 +723,7 @@ int flush; CRC2(state->check, hold); INITBITS(); state->mode = TIME; + /* fallthrough */ case TIME: NEEDBITS(32); if (state->head != Z_NULL) @@ -730,6 +732,7 @@ int flush; CRC4(state->check, hold); INITBITS(); state->mode = OS; + /* fallthrough */ case OS: NEEDBITS(16); if (state->head != Z_NULL) { @@ -740,6 +743,7 @@ int flush; CRC2(state->check, hold); INITBITS(); state->mode = EXLEN; + /* fallthrough */ case EXLEN: if (state->flags & 0x0400) { NEEDBITS(16); @@ -753,6 +757,7 @@ int flush; else if (state->head != Z_NULL) state->head->extra = Z_NULL; state->mode = EXTRA; + /* fallthrough */ case EXTRA: if (state->flags & 0x0400) { copy = state->length; @@ -775,6 +780,7 @@ int flush; } state->length = 0; state->mode = NAME; + /* fallthrough */ case NAME: if (state->flags & 0x0800) { if (have == 0) goto inf_leave; @@ -796,6 +802,7 @@ int flush; state->head->name = Z_NULL; state->length = 0; state->mode = COMMENT; + /* fallthrough */ case COMMENT: if (state->flags & 0x1000) { if (have == 0) goto inf_leave; @@ -816,6 +823,7 @@ int flush; else if (state->head != Z_NULL) state->head->comment = Z_NULL; state->mode = HCRC; + /* fallthrough */ case HCRC: if (state->flags & 0x0200) { NEEDBITS(16); @@ -839,6 +847,7 @@ int flush; strm->adler = state->check = ZSWAP32(hold); INITBITS(); state->mode = DICT; + /* fallthrough */ case DICT: if (state->havedict == 0) { RESTORE(); @@ -846,8 +855,10 @@ int flush; } strm->adler = state->check = adler32(0L, Z_NULL, 0); state->mode = TYPE; + /* fallthrough */ case TYPE: if (flush == Z_BLOCK || flush == Z_TREES) goto inf_leave; + /* fallthrough */ case TYPEDO: if (state->last) { BYTEBITS(); @@ -898,8 +909,10 @@ int flush; INITBITS(); state->mode = COPY_; if (flush == Z_TREES) goto inf_leave; + /* fallthrough */ case COPY_: state->mode = COPY; + /* fallthrough */ case COPY: copy = state->length; if (copy) { @@ -935,6 +948,7 @@ int flush; Tracev((stderr, "inflate: table sizes ok\n")); state->have = 0; state->mode = LENLENS; + /* fallthrough */ case LENLENS: while (state->have < state->ncode) { NEEDBITS(3); @@ -956,6 +970,7 @@ int flush; Tracev((stderr, "inflate: code lengths ok\n")); state->have = 0; state->mode = CODELENS; + /* fallthrough */ case CODELENS: while (state->have < state->nlen + state->ndist) { for (;;) { @@ -1039,8 +1054,10 @@ int flush; Tracev((stderr, "inflate: codes ok\n")); state->mode = LEN_; if (flush == Z_TREES) goto inf_leave; + /* fallthrough */ case LEN_: state->mode = LEN; + /* fallthrough */ case LEN: if (have >= 6 && left >= 258) { RESTORE(); @@ -1090,6 +1107,7 @@ int flush; } state->extra = (unsigned)(here.op) & 15; state->mode = LENEXT; + /* fallthrough */ case LENEXT: if (state->extra) { NEEDBITS(state->extra); @@ -1100,6 +1118,7 @@ int flush; Tracevv((stderr, "inflate: length %u\n", state->length)); state->was = state->length; state->mode = DIST; + /* fallthrough */ case DIST: for (;;) { here = state->distcode[BITS(state->distbits)]; @@ -1127,6 +1146,7 @@ int flush; state->offset = (unsigned)here.val; state->extra = (unsigned)(here.op) & 15; state->mode = DISTEXT; + /* fallthrough */ case DISTEXT: if (state->extra) { NEEDBITS(state->extra); @@ -1143,6 +1163,7 @@ int flush; #endif Tracevv((stderr, "inflate: distance %u\n", state->offset)); state->mode = MATCH; + /* fallthrough */ case MATCH: if (left == 0) goto inf_leave; copy = out - left; @@ -1202,7 +1223,7 @@ int flush; state->total += out; if ((state->wrap & 4) && out) strm->adler = state->check = - UPDATE(state->check, put - out, out); + UPDATE_CHECK(state->check, put - out, out); out = left; if ((state->wrap & 4) && ( #ifdef GUNZIP @@ -1218,10 +1239,11 @@ int flush; } #ifdef GUNZIP state->mode = LENGTH; + /* fallthrough */ case LENGTH: if (state->wrap && state->flags) { NEEDBITS(32); - if (hold != (state->total & 0xffffffffUL)) { + if ((state->wrap & 4) && hold != (state->total & 0xffffffff)) { strm->msg = (char *)"incorrect length check"; state->mode = BAD; break; @@ -1231,6 +1253,7 @@ int flush; } #endif state->mode = DONE; + /* fallthrough */ case DONE: ret = Z_STREAM_END; goto inf_leave; @@ -1240,6 +1263,7 @@ int flush; case MEM: return Z_MEM_ERROR; case SYNC: + /* fallthrough */ default: return Z_STREAM_ERROR; } @@ -1265,7 +1289,7 @@ int flush; state->total += out; if ((state->wrap & 4) && out) strm->adler = state->check = - UPDATE(state->check, strm->next_out - out, out); + UPDATE_CHECK(state->check, strm->next_out - out, out); strm->data_type = (int)state->bits + (state->last ? 64 : 0) + (state->mode == TYPE ? 128 : 0) + (state->mode == LEN_ || state->mode == COPY_ ? 256 : 0); @@ -1401,6 +1425,7 @@ int ZEXPORT inflateSync(strm) z_streamp strm; { unsigned len; /* number of bytes to look at or looked at */ + int flags; /* temporary to save header status */ unsigned long in, out; /* temporary to save total_in and total_out */ unsigned char buf[4]; /* to restore bit buffer to byte string */ struct inflate_state FAR *state; @@ -1433,9 +1458,15 @@ z_streamp strm; /* return no joy or set up to restart inflate() on a new block */ if (state->have != 4) return Z_DATA_ERROR; + if (state->flags == -1) + state->wrap = 0; /* if no header yet, treat as raw */ + else + state->wrap &= ~4; /* no point in computing a check value now */ + flags = state->flags; in = strm->total_in; out = strm->total_out; inflateReset(strm); strm->total_in = in; strm->total_out = out; + state->flags = flags; state->mode = TYPE; return Z_OK; } @@ -1531,7 +1562,7 @@ int check; if (inflateStateCheck(strm)) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; - if (check) + if (check && state->wrap) state->wrap |= 4; else state->wrap &= ~4; diff --git a/vendor/zlib/inflate.h b/vendor/zlib/inflate.h index a46cce6b6d..f127b6b1fa 100644 --- a/vendor/zlib/inflate.h +++ b/vendor/zlib/inflate.h @@ -1,5 +1,5 @@ /* inflate.h -- internal inflate state definition - * Copyright (C) 1995-2016 Mark Adler + * Copyright (C) 1995-2019 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -86,7 +86,8 @@ struct inflate_state { int wrap; /* bit 0 true for zlib, bit 1 true for gzip, bit 2 true to validate check value */ int havedict; /* true if dictionary provided */ - int flags; /* gzip header method and flags (0 if zlib) */ + int flags; /* gzip header method and flags, 0 if zlib, or + -1 if raw or no header yet */ unsigned dmax; /* zlib header max distance (INFLATE_STRICT) */ unsigned long check; /* protected copy of check value */ unsigned long total; /* protected copy of output count */ diff --git a/vendor/zlib/inftrees.c b/vendor/zlib/inftrees.c index 2ea08fc13e..09462a740b 100644 --- a/vendor/zlib/inftrees.c +++ b/vendor/zlib/inftrees.c @@ -1,5 +1,5 @@ /* inftrees.c -- generate Huffman trees for efficient decoding - * Copyright (C) 1995-2017 Mark Adler + * Copyright (C) 1995-2022 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -9,7 +9,7 @@ #define MAXBITS 15 const char inflate_copyright[] = - " inflate 1.2.11 Copyright 1995-2017 Mark Adler "; + " inflate 1.2.12 Copyright 1995-2022 Mark Adler "; /* If you use the zlib library in a product, an acknowledgment is welcome in the documentation of your product. If for some reason you cannot @@ -62,7 +62,7 @@ unsigned short FAR *work; 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; static const unsigned short lext[31] = { /* Length codes 257..285 extra */ 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, - 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 77, 202}; + 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 199, 202}; static const unsigned short dbase[32] = { /* Distance codes 0..29 base */ 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, diff --git a/vendor/zlib/trees.c b/vendor/zlib/trees.c index 50cf4b4571..f73fd99c37 100644 --- a/vendor/zlib/trees.c +++ b/vendor/zlib/trees.c @@ -1,5 +1,5 @@ /* trees.c -- output deflated data using Huffman coding - * Copyright (C) 1995-2017 Jean-loup Gailly + * Copyright (C) 1995-2021 Jean-loup Gailly * detect_data_type() function provided freely by Cosmin Truta, 2006 * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -149,7 +149,7 @@ local void send_all_trees OF((deflate_state *s, int lcodes, int dcodes, local void compress_block OF((deflate_state *s, const ct_data *ltree, const ct_data *dtree)); local int detect_data_type OF((deflate_state *s)); -local unsigned bi_reverse OF((unsigned value, int length)); +local unsigned bi_reverse OF((unsigned code, int len)); local void bi_windup OF((deflate_state *s)); local void bi_flush OF((deflate_state *s)); @@ -416,7 +416,7 @@ local void init_block(s) s->dyn_ltree[END_BLOCK].Freq = 1; s->opt_len = s->static_len = 0L; - s->last_lit = s->matches = 0; + s->sym_next = s->matches = 0; } #define SMALLEST 1 @@ -870,7 +870,8 @@ void ZLIB_INTERNAL _tr_stored_block(s, buf, stored_len, last) bi_windup(s); /* align on byte boundary */ put_short(s, (ush)stored_len); put_short(s, (ush)~stored_len); - zmemcpy(s->pending_buf + s->pending, (Bytef *)buf, stored_len); + if (stored_len) + zmemcpy(s->pending_buf + s->pending, (Bytef *)buf, stored_len); s->pending += stored_len; #ifdef ZLIB_DEBUG s->compressed_len = (s->compressed_len + 3 + 7) & (ulg)~7L; @@ -947,7 +948,7 @@ void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last) Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ", opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len, - s->last_lit)); + s->sym_next / 3)); if (static_lenb <= opt_lenb) opt_lenb = static_lenb; @@ -1016,8 +1017,9 @@ int ZLIB_INTERNAL _tr_tally (s, dist, lc) unsigned dist; /* distance of matched string */ unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */ { - s->d_buf[s->last_lit] = (ush)dist; - s->l_buf[s->last_lit++] = (uch)lc; + s->sym_buf[s->sym_next++] = dist; + s->sym_buf[s->sym_next++] = dist >> 8; + s->sym_buf[s->sym_next++] = lc; if (dist == 0) { /* lc is the unmatched char */ s->dyn_ltree[lc].Freq++; @@ -1032,30 +1034,7 @@ int ZLIB_INTERNAL _tr_tally (s, dist, lc) s->dyn_ltree[_length_code[lc]+LITERALS+1].Freq++; s->dyn_dtree[d_code(dist)].Freq++; } - -#ifdef TRUNCATE_BLOCK - /* Try to guess if it is profitable to stop the current block here */ - if ((s->last_lit & 0x1fff) == 0 && s->level > 2) { - /* Compute an upper bound for the compressed length */ - ulg out_length = (ulg)s->last_lit*8L; - ulg in_length = (ulg)((long)s->strstart - s->block_start); - int dcode; - for (dcode = 0; dcode < D_CODES; dcode++) { - out_length += (ulg)s->dyn_dtree[dcode].Freq * - (5L+extra_dbits[dcode]); - } - out_length >>= 3; - Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ", - s->last_lit, in_length, out_length, - 100L - out_length*100L/in_length)); - if (s->matches < s->last_lit/2 && out_length < in_length/2) return 1; - } -#endif - return (s->last_lit == s->lit_bufsize-1); - /* We avoid equality with lit_bufsize because of wraparound at 64K - * on 16 bit machines and because stored blocks are restricted to - * 64K-1 bytes. - */ + return (s->sym_next == s->sym_end); } /* =========================================================================== @@ -1068,13 +1047,14 @@ local void compress_block(s, ltree, dtree) { unsigned dist; /* distance of matched string */ int lc; /* match length or unmatched char (if dist == 0) */ - unsigned lx = 0; /* running index in l_buf */ + unsigned sx = 0; /* running index in sym_buf */ unsigned code; /* the code to send */ int extra; /* number of extra bits to send */ - if (s->last_lit != 0) do { - dist = s->d_buf[lx]; - lc = s->l_buf[lx++]; + if (s->sym_next != 0) do { + dist = s->sym_buf[sx++] & 0xff; + dist += (unsigned)(s->sym_buf[sx++] & 0xff) << 8; + lc = s->sym_buf[sx++]; if (dist == 0) { send_code(s, lc, ltree); /* send a literal byte */ Tracecv(isgraph(lc), (stderr," '%c' ", lc)); @@ -1099,11 +1079,10 @@ local void compress_block(s, ltree, dtree) } } /* literal or match pair ? */ - /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */ - Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx, - "pendingBuf overflow"); + /* Check that the overlay between pending_buf and sym_buf is ok: */ + Assert(s->pending < s->lit_bufsize + sx, "pendingBuf overflow"); - } while (lx < s->last_lit); + } while (sx < s->sym_next); send_code(s, END_BLOCK, ltree); } @@ -1112,9 +1091,9 @@ local void compress_block(s, ltree, dtree) * Check if the data type is TEXT or BINARY, using the following algorithm: * - TEXT if the two conditions below are satisfied: * a) There are no non-portable control characters belonging to the - * "black list" (0..6, 14..25, 28..31). + * "block list" (0..6, 14..25, 28..31). * b) There is at least one printable character belonging to the - * "white list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255). + * "allow list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255). * - BINARY otherwise. * - The following partially-portable control characters form a * "gray list" that is ignored in this detection algorithm: @@ -1124,19 +1103,19 @@ local void compress_block(s, ltree, dtree) local int detect_data_type(s) deflate_state *s; { - /* black_mask is the bit mask of black-listed bytes + /* block_mask is the bit mask of block-listed bytes * set bits 0..6, 14..25, and 28..31 * 0xf3ffc07f = binary 11110011111111111100000001111111 */ - unsigned long black_mask = 0xf3ffc07fUL; + unsigned long block_mask = 0xf3ffc07fUL; int n; - /* Check for non-textual ("black-listed") bytes. */ - for (n = 0; n <= 31; n++, black_mask >>= 1) - if ((black_mask & 1) && (s->dyn_ltree[n].Freq != 0)) + /* Check for non-textual ("block-listed") bytes. */ + for (n = 0; n <= 31; n++, block_mask >>= 1) + if ((block_mask & 1) && (s->dyn_ltree[n].Freq != 0)) return Z_BINARY; - /* Check for textual ("white-listed") bytes. */ + /* Check for textual ("allow-listed") bytes. */ if (s->dyn_ltree[9].Freq != 0 || s->dyn_ltree[10].Freq != 0 || s->dyn_ltree[13].Freq != 0) return Z_TEXT; @@ -1144,7 +1123,7 @@ local int detect_data_type(s) if (s->dyn_ltree[n].Freq != 0) return Z_TEXT; - /* There are no "black-listed" or "white-listed" bytes: + /* There are no "block-listed" or "allow-listed" bytes: * this stream either is empty or has tolerated ("gray-listed") bytes only. */ return Z_BINARY; diff --git a/vendor/zlib/zconf.h b/vendor/zlib/zconf.h index 352f552b8f..5e1d68a004 100644 --- a/vendor/zlib/zconf.h +++ b/vendor/zlib/zconf.h @@ -7,8 +7,6 @@ #ifndef ZCONF_H #define ZCONF_H -/* #undef Z_PREFIX */ -/* #undef Z_HAVE_UNISTD_H */ /* * If you *really* need a unique prefix for all types and library functions, diff --git a/vendor/zlib/zlib.h b/vendor/zlib/zlib.h index f09cdaf1e0..4a98e38bf3 100644 --- a/vendor/zlib/zlib.h +++ b/vendor/zlib/zlib.h @@ -1,7 +1,7 @@ /* zlib.h -- interface of the 'zlib' general purpose compression library - version 1.2.11, January 15th, 2017 + version 1.2.12, March 11th, 2022 - Copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler + Copyright (C) 1995-2022 Jean-loup Gailly and Mark Adler This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -37,11 +37,11 @@ extern "C" { #endif -#define ZLIB_VERSION "1.2.11" -#define ZLIB_VERNUM 0x12b0 +#define ZLIB_VERSION "1.2.12" +#define ZLIB_VERNUM 0x12c0 #define ZLIB_VER_MAJOR 1 #define ZLIB_VER_MINOR 2 -#define ZLIB_VER_REVISION 11 +#define ZLIB_VER_REVISION 12 #define ZLIB_VER_SUBREVISION 0 /* @@ -543,8 +543,7 @@ ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm, int strategy)); This is another version of deflateInit with more compression options. The - fields next_in, zalloc, zfree and opaque must be initialized before by the - caller. + fields zalloc, zfree and opaque must be initialized before by the caller. The method parameter is the compression method. It must be Z_DEFLATED in this version of the library. @@ -712,11 +711,12 @@ ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm, used to switch between compression and straight copy of the input data, or to switch to a different kind of input data requiring a different strategy. If the compression approach (which is a function of the level) or the - strategy is changed, and if any input has been consumed in a previous - deflate() call, then the input available so far is compressed with the old - level and strategy using deflate(strm, Z_BLOCK). There are three approaches - for the compression levels 0, 1..3, and 4..9 respectively. The new level - and strategy will take effect at the next call of deflate(). + strategy is changed, and if there have been any deflate() calls since the + state was initialized or reset, then the input available so far is + compressed with the old level and strategy using deflate(strm, Z_BLOCK). + There are three approaches for the compression levels 0, 1..3, and 4..9 + respectively. The new level and strategy will take effect at the next call + of deflate(). If a deflate(strm, Z_BLOCK) is performed by deflateParams(), and it does not have enough output space to complete, then the parameter change will not @@ -865,9 +865,11 @@ ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm, detection, or add 16 to decode only the gzip format (the zlib format will return a Z_DATA_ERROR). If a gzip stream is being decoded, strm->adler is a CRC-32 instead of an Adler-32. Unlike the gunzip utility and gzread() (see - below), inflate() will not automatically decode concatenated gzip streams. - inflate() will return Z_STREAM_END at the end of the gzip stream. The state - would need to be reset to continue decoding a subsequent gzip stream. + below), inflate() will *not* automatically decode concatenated gzip members. + inflate() will return Z_STREAM_END at the end of the gzip member. The state + would need to be reset to continue decoding a subsequent gzip member. This + *must* be done if there is more data after a gzip member, in order for the + decompression to be compliant with the gzip standard (RFC 1952). inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_VERSION_ERROR if the zlib library version is incompatible with the @@ -1302,14 +1304,14 @@ typedef struct gzFile_s *gzFile; /* semi-opaque gzip file descriptor */ /* ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode)); - Opens a gzip (.gz) file for reading or writing. The mode parameter is as - in fopen ("rb" or "wb") but can also include a compression level ("wb9") or - a strategy: 'f' for filtered data as in "wb6f", 'h' for Huffman-only - compression as in "wb1h", 'R' for run-length encoding as in "wb1R", or 'F' - for fixed code compression as in "wb9F". (See the description of - deflateInit2 for more information about the strategy parameter.) 'T' will - request transparent writing or appending with no compression and not using - the gzip format. + Open the gzip (.gz) file at path for reading and decompressing, or + compressing and writing. The mode parameter is as in fopen ("rb" or "wb") + but can also include a compression level ("wb9") or a strategy: 'f' for + filtered data as in "wb6f", 'h' for Huffman-only compression as in "wb1h", + 'R' for run-length encoding as in "wb1R", or 'F' for fixed code compression + as in "wb9F". (See the description of deflateInit2 for more information + about the strategy parameter.) 'T' will request transparent writing or + appending with no compression and not using the gzip format. "a" can be used instead of "w" to request that the gzip stream that will be written be appended to the file. "+" will result in an error, since @@ -1339,9 +1341,9 @@ ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode)); ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode)); /* - gzdopen associates a gzFile with the file descriptor fd. File descriptors - are obtained from calls like open, dup, creat, pipe or fileno (if the file - has been previously opened with fopen). The mode parameter is as in gzopen. + Associate a gzFile with the file descriptor fd. File descriptors are + obtained from calls like open, dup, creat, pipe or fileno (if the file has + been previously opened with fopen). The mode parameter is as in gzopen. The next call of gzclose on the returned gzFile will also close the file descriptor fd, just like fclose(fdopen(fd, mode)) closes the file descriptor @@ -1362,13 +1364,13 @@ ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode)); ZEXTERN int ZEXPORT gzbuffer OF((gzFile file, unsigned size)); /* - Set the internal buffer size used by this library's functions. The - default buffer size is 8192 bytes. This function must be called after - gzopen() or gzdopen(), and before any other calls that read or write the - file. The buffer memory allocation is always deferred to the first read or - write. Three times that size in buffer space is allocated. A larger buffer - size of, for example, 64K or 128K bytes will noticeably increase the speed - of decompression (reading). + Set the internal buffer size used by this library's functions for file to + size. The default buffer size is 8192 bytes. This function must be called + after gzopen() or gzdopen(), and before any other calls that read or write + the file. The buffer memory allocation is always deferred to the first read + or write. Three times that size in buffer space is allocated. A larger + buffer size of, for example, 64K or 128K bytes will noticeably increase the + speed of decompression (reading). The new buffer size also affects the maximum length for gzprintf(). @@ -1378,9 +1380,9 @@ ZEXTERN int ZEXPORT gzbuffer OF((gzFile file, unsigned size)); ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy)); /* - Dynamically update the compression level or strategy. See the description - of deflateInit2 for the meaning of these parameters. Previously provided - data is flushed before the parameter change. + Dynamically update the compression level and strategy for file. See the + description of deflateInit2 for the meaning of these parameters. Previously + provided data is flushed before applying the parameter changes. gzsetparams returns Z_OK if success, Z_STREAM_ERROR if the file was not opened for writing, Z_ERRNO if there is an error writing the flushed data, @@ -1389,7 +1391,7 @@ ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy)); ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len)); /* - Reads the given number of uncompressed bytes from the compressed file. If + Read and decompress up to len uncompressed bytes from file into buf. If the input file is not in gzip format, gzread copies the given number of bytes into the buffer directly from the file. @@ -1420,11 +1422,11 @@ ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len)); ZEXTERN z_size_t ZEXPORT gzfread OF((voidp buf, z_size_t size, z_size_t nitems, gzFile file)); /* - Read up to nitems items of size size from file to buf, otherwise operating - as gzread() does. This duplicates the interface of stdio's fread(), with - size_t request and return types. If the library defines size_t, then - z_size_t is identical to size_t. If not, then z_size_t is an unsigned - integer type that can contain a pointer. + Read and decompress up to nitems items of size size from file into buf, + otherwise operating as gzread() does. This duplicates the interface of + stdio's fread(), with size_t request and return types. If the library + defines size_t, then z_size_t is identical to size_t. If not, then z_size_t + is an unsigned integer type that can contain a pointer. gzfread() returns the number of full items read of size size, or zero if the end of the file was reached and a full item could not be read, or if @@ -1443,18 +1445,16 @@ ZEXTERN z_size_t ZEXPORT gzfread OF((voidp buf, z_size_t size, z_size_t nitems, file, reseting and retrying on end-of-file, when size is not 1. */ -ZEXTERN int ZEXPORT gzwrite OF((gzFile file, - voidpc buf, unsigned len)); +ZEXTERN int ZEXPORT gzwrite OF((gzFile file, voidpc buf, unsigned len)); /* - Writes the given number of uncompressed bytes into the compressed file. - gzwrite returns the number of uncompressed bytes written or 0 in case of - error. + Compress and write the len uncompressed bytes at buf to file. gzwrite + returns the number of uncompressed bytes written or 0 in case of error. */ ZEXTERN z_size_t ZEXPORT gzfwrite OF((voidpc buf, z_size_t size, z_size_t nitems, gzFile file)); /* - gzfwrite() writes nitems items of size size from buf to file, duplicating + Compress and write nitems items of size size from buf to file, duplicating the interface of stdio's fwrite(), with size_t request and return types. If the library defines size_t, then z_size_t is identical to size_t. If not, then z_size_t is an unsigned integer type that can contain a pointer. @@ -1467,22 +1467,22 @@ ZEXTERN z_size_t ZEXPORT gzfwrite OF((voidpc buf, z_size_t size, ZEXTERN int ZEXPORTVA gzprintf Z_ARG((gzFile file, const char *format, ...)); /* - Converts, formats, and writes the arguments to the compressed file under - control of the format string, as in fprintf. gzprintf returns the number of + Convert, format, compress, and write the arguments (...) to file under + control of the string format, as in fprintf. gzprintf returns the number of uncompressed bytes actually written, or a negative zlib error code in case of error. The number of uncompressed bytes written is limited to 8191, or one less than the buffer size given to gzbuffer(). The caller should assure that this limit is not exceeded. If it is exceeded, then gzprintf() will return an error (0) with nothing written. In this case, there may also be a buffer overflow with unpredictable consequences, which is possible only if - zlib was compiled with the insecure functions sprintf() or vsprintf() + zlib was compiled with the insecure functions sprintf() or vsprintf(), because the secure snprintf() or vsnprintf() functions were not available. This can be determined using zlibCompileFlags(). */ ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s)); /* - Writes the given null-terminated string to the compressed file, excluding + Compress and write the given null-terminated string s to file, excluding the terminating null character. gzputs returns the number of characters written, or -1 in case of error. @@ -1490,11 +1490,12 @@ ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s)); ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len)); /* - Reads bytes from the compressed file until len-1 characters are read, or a - newline character is read and transferred to buf, or an end-of-file - condition is encountered. If any characters are read or if len == 1, the - string is terminated with a null character. If no characters are read due - to an end-of-file or len < 1, then the buffer is left untouched. + Read and decompress bytes from file into buf, until len-1 characters are + read, or until a newline character is read and transferred to buf, or an + end-of-file condition is encountered. If any characters are read or if len + is one, the string is terminated with a null character. If no characters + are read due to an end-of-file or len is less than one, then the buffer is + left untouched. gzgets returns buf which is a null-terminated string, or it returns NULL for end-of-file or in case of error. If there was an error, the contents at @@ -1503,13 +1504,13 @@ ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len)); ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c)); /* - Writes c, converted to an unsigned char, into the compressed file. gzputc + Compress and write c, converted to an unsigned char, into file. gzputc returns the value that was written, or -1 in case of error. */ ZEXTERN int ZEXPORT gzgetc OF((gzFile file)); /* - Reads one byte from the compressed file. gzgetc returns this byte or -1 + Read and decompress one byte from file. gzgetc returns this byte or -1 in case of end of file or error. This is implemented as a macro for speed. As such, it does not do all of the checking the other functions do. I.e. it does not check to see if file is NULL, nor whether the structure file @@ -1518,8 +1519,8 @@ ZEXTERN int ZEXPORT gzgetc OF((gzFile file)); ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file)); /* - Push one character back onto the stream to be read as the first character - on the next read. At least one character of push-back is allowed. + Push c back onto the stream for file to be read as the first character on + the next read. At least one character of push-back is always allowed. gzungetc() returns the character pushed, or -1 on failure. gzungetc() will fail if c is -1, and may fail if a character has been pushed but not read yet. If gzungetc is used immediately after gzopen or gzdopen, at least the @@ -1530,9 +1531,9 @@ ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file)); ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush)); /* - Flushes all pending output into the compressed file. The parameter flush - is as in the deflate() function. The return value is the zlib error number - (see function gzerror below). gzflush is only permitted when writing. + Flush all pending output to file. The parameter flush is as in the + deflate() function. The return value is the zlib error number (see function + gzerror below). gzflush is only permitted when writing. If the flush parameter is Z_FINISH, the remaining data is written and the gzip stream is completed in the output. If gzwrite() is called again, a new @@ -1547,8 +1548,8 @@ ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush)); ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file, z_off_t offset, int whence)); - Sets the starting position for the next gzread or gzwrite on the given - compressed file. The offset represents a number of bytes in the + Set the starting position to offset relative to whence for the next gzread + or gzwrite on file. The offset represents a number of bytes in the uncompressed data stream. The whence parameter is defined as in lseek(2); the value SEEK_END is not supported. @@ -1565,18 +1566,18 @@ ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file, ZEXTERN int ZEXPORT gzrewind OF((gzFile file)); /* - Rewinds the given file. This function is supported only for reading. + Rewind file. This function is supported only for reading. - gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET) + gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET). */ /* ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file)); - Returns the starting position for the next gzread or gzwrite on the given - compressed file. This position represents a number of bytes in the - uncompressed data stream, and is zero when starting, even if appending or - reading a gzip stream from the middle of a file using gzdopen(). + Return the starting position for the next gzread or gzwrite on file. + This position represents a number of bytes in the uncompressed data stream, + and is zero when starting, even if appending or reading a gzip stream from + the middle of a file using gzdopen(). gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR) */ @@ -1584,22 +1585,22 @@ ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file)); /* ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile file)); - Returns the current offset in the file being read or written. This offset - includes the count of bytes that precede the gzip stream, for example when - appending or when using gzdopen() for reading. When reading, the offset - does not include as yet unused buffered input. This information can be used - for a progress indicator. On error, gzoffset() returns -1. + Return the current compressed (actual) read or write offset of file. This + offset includes the count of bytes that precede the gzip stream, for example + when appending or when using gzdopen() for reading. When reading, the + offset does not include as yet unused buffered input. This information can + be used for a progress indicator. On error, gzoffset() returns -1. */ ZEXTERN int ZEXPORT gzeof OF((gzFile file)); /* - Returns true (1) if the end-of-file indicator has been set while reading, - false (0) otherwise. Note that the end-of-file indicator is set only if the - read tried to go past the end of the input, but came up short. Therefore, - just like feof(), gzeof() may return false even if there is no more data to - read, in the event that the last read request was for the exact number of - bytes remaining in the input file. This will happen if the input file size - is an exact multiple of the buffer size. + Return true (1) if the end-of-file indicator for file has been set while + reading, false (0) otherwise. Note that the end-of-file indicator is set + only if the read tried to go past the end of the input, but came up short. + Therefore, just like feof(), gzeof() may return false even if there is no + more data to read, in the event that the last read request was for the exact + number of bytes remaining in the input file. This will happen if the input + file size is an exact multiple of the buffer size. If gzeof() returns true, then the read functions will return no more data, unless the end-of-file indicator is reset by gzclearerr() and the input file @@ -1608,7 +1609,7 @@ ZEXTERN int ZEXPORT gzeof OF((gzFile file)); ZEXTERN int ZEXPORT gzdirect OF((gzFile file)); /* - Returns true (1) if file is being copied directly while reading, or false + Return true (1) if file is being copied directly while reading, or false (0) if file is a gzip stream being decompressed. If the input file is empty, gzdirect() will return true, since the input @@ -1629,8 +1630,8 @@ ZEXTERN int ZEXPORT gzdirect OF((gzFile file)); ZEXTERN int ZEXPORT gzclose OF((gzFile file)); /* - Flushes all pending output if necessary, closes the compressed file and - deallocates the (de)compression state. Note that once file is closed, you + Flush all pending output for file, if necessary, close file and + deallocate the (de)compression state. Note that once file is closed, you cannot call gzerror with file, since its structures have been deallocated. gzclose must not be called more than once on the same file, just as free must not be called more than once on the same allocation. @@ -1654,10 +1655,10 @@ ZEXTERN int ZEXPORT gzclose_w OF((gzFile file)); ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum)); /* - Returns the error message for the last error which occurred on the given - compressed file. errnum is set to zlib error number. If an error occurred - in the file system and not in the compression library, errnum is set to - Z_ERRNO and the application may consult errno to get the exact error code. + Return the error message for the last error which occurred on file. + errnum is set to zlib error number. If an error occurred in the file system + and not in the compression library, errnum is set to Z_ERRNO and the + application may consult errno to get the exact error code. The application must not modify the returned string. Future calls to this function may invalidate the previously returned string. If file is @@ -1670,7 +1671,7 @@ ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum)); ZEXTERN void ZEXPORT gzclearerr OF((gzFile file)); /* - Clears the error and end-of-file flags for file. This is analogous to the + Clear the error and end-of-file flags for file. This is analogous to the clearerr() function in stdio. This is useful for continuing to read a gzip file that is being written concurrently. */ @@ -1688,8 +1689,9 @@ ZEXTERN void ZEXPORT gzclearerr OF((gzFile file)); ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len)); /* Update a running Adler-32 checksum with the bytes buf[0..len-1] and - return the updated checksum. If buf is Z_NULL, this function returns the - required initial value for the checksum. + return the updated checksum. An Adler-32 value is in the range of a 32-bit + unsigned integer. If buf is Z_NULL, this function returns the required + initial value for the checksum. An Adler-32 checksum is almost as reliable as a CRC-32 but can be computed much faster. @@ -1722,12 +1724,13 @@ ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2, negative, the result has no meaning or utility. */ -ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len)); +ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len)); /* Update a running CRC-32 with the bytes buf[0..len-1] and return the - updated CRC-32. If buf is Z_NULL, this function returns the required - initial value for the crc. Pre- and post-conditioning (one's complement) is - performed within this function so it shouldn't be done by the application. + updated CRC-32. A CRC-32 value is in the range of a 32-bit unsigned integer. + If buf is Z_NULL, this function returns the required initial value for the + crc. Pre- and post-conditioning (one's complement) is performed within this + function so it shouldn't be done by the application. Usage example: @@ -1739,7 +1742,7 @@ ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len)); if (crc != original_crc) error(); */ -ZEXTERN uLong ZEXPORT crc32_z OF((uLong adler, const Bytef *buf, +ZEXTERN uLong ZEXPORT crc32_z OF((uLong crc, const Bytef *buf, z_size_t len)); /* Same as crc32(), but with a size_t length. @@ -1755,6 +1758,20 @@ ZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2)); len2. */ +/* +ZEXTERN uLong ZEXPORT crc32_combine_gen OF((z_off_t len2)); + + Return the operator corresponding to length len2, to be used with + crc32_combine_op(). +*/ + +ZEXTERN uLong ZEXPORT crc32_combine_op OF((uLong crc1, uLong crc2, uLong op)); +/* + Give the same result as crc32_combine(), using op in place of len2. op is + is generated from len2 by crc32_combine_gen(). This will be faster than + crc32_combine() if the generated op is used more than once. +*/ + /* various hacks, don't look :) */ @@ -1842,6 +1859,7 @@ ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */ ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile)); ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off64_t)); ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off64_t)); + ZEXTERN uLong ZEXPORT crc32_combine_gen64 OF((z_off64_t)); #endif #if !defined(ZLIB_INTERNAL) && defined(Z_WANT64) @@ -1852,6 +1870,7 @@ ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */ # define z_gzoffset z_gzoffset64 # define z_adler32_combine z_adler32_combine64 # define z_crc32_combine z_crc32_combine64 +# define z_crc32_combine_gen z_crc32_combine_gen64 # else # define gzopen gzopen64 # define gzseek gzseek64 @@ -1859,6 +1878,7 @@ ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */ # define gzoffset gzoffset64 # define adler32_combine adler32_combine64 # define crc32_combine crc32_combine64 +# define crc32_combine_gen crc32_combine_gen64 # endif # ifndef Z_LARGE64 ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); @@ -1867,6 +1887,7 @@ ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */ ZEXTERN z_off_t ZEXPORT gzoffset64 OF((gzFile)); ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t)); ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT crc32_combine_gen64 OF((z_off_t)); # endif #else ZEXTERN gzFile ZEXPORT gzopen OF((const char *, const char *)); @@ -1875,12 +1896,14 @@ ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */ ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile)); ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t)); ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT crc32_combine_gen OF((z_off_t)); #endif #else /* Z_SOLO */ ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t)); ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT crc32_combine_gen OF((z_off_t)); #endif /* !Z_SOLO */ @@ -1893,7 +1916,7 @@ ZEXTERN int ZEXPORT inflateValidate OF((z_streamp, int)); ZEXTERN unsigned long ZEXPORT inflateCodesUsed OF ((z_streamp)); ZEXTERN int ZEXPORT inflateResetKeep OF((z_streamp)); ZEXTERN int ZEXPORT deflateResetKeep OF((z_streamp)); -#if (defined(_WIN32) || defined(__CYGWIN__)) && !defined(Z_SOLO) +#if defined(_WIN32) && !defined(Z_SOLO) ZEXTERN gzFile ZEXPORT gzopen_w OF((const wchar_t *path, const char *mode)); #endif diff --git a/vendor/zlib/zutil.c b/vendor/zlib/zutil.c index a76c6b0c7e..dcab28a0d5 100644 --- a/vendor/zlib/zutil.c +++ b/vendor/zlib/zutil.c @@ -136,8 +136,8 @@ const char * ZEXPORT zError(err) return ERR_MSG(err); } -#if defined(_WIN32_WCE) - /* The Microsoft C Run-Time Library for Windows CE doesn't have +#if defined(_WIN32_WCE) && _WIN32_WCE < 0x800 + /* The older Microsoft C Run-Time Library for Windows CE doesn't have * errno. We define it as a global variable to simplify porting. * Its value is always 0 and should not be used. */ diff --git a/vendor/zlib/zutil.h b/vendor/zlib/zutil.h index b079ea6a80..d9a20ae1bf 100644 --- a/vendor/zlib/zutil.h +++ b/vendor/zlib/zutil.h @@ -1,5 +1,5 @@ /* zutil.h -- internal interface and configuration of the compression library - * Copyright (C) 1995-2016 Jean-loup Gailly, Mark Adler + * Copyright (C) 1995-2022 Jean-loup Gailly, Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -29,10 +29,6 @@ # include #endif -#ifdef Z_SOLO - typedef long ptrdiff_t; /* guess -- will be caught if guess is wrong */ -#endif - #ifndef local # define local static #endif @@ -46,6 +42,17 @@ typedef unsigned short ush; typedef ush FAR ushf; typedef unsigned long ulg; +#if !defined(Z_U8) && !defined(Z_SOLO) && defined(STDC) +# include +# if (ULONG_MAX == 0xffffffffffffffff) +# define Z_U8 unsigned long +# elif (ULLONG_MAX == 0xffffffffffffffff) +# define Z_U8 unsigned long long +# elif (UINT_MAX == 0xffffffffffffffff) +# define Z_U8 unsigned +# endif +#endif + extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ /* (size given to avoid silly warnings with Visual C++) */ @@ -170,10 +177,6 @@ extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ #if (defined(_MSC_VER) && (_MSC_VER > 600)) && !defined __INTERIX # if defined(_WIN32_WCE) # define fdopen(fd,mode) NULL /* No fdopen() */ -# ifndef _PTRDIFF_T_DEFINED - typedef int ptrdiff_t; -# define _PTRDIFF_T_DEFINED -# endif # else # define fdopen(fd,type) _fdopen(fd,type) # endif From c6aafc659bf93fa9875c25683b63c27379ec2a0c Mon Sep 17 00:00:00 2001 From: patrikjuvonen <22572159+patrikjuvonen@users.noreply.github.com> Date: Thu, 31 Mar 2022 20:33:05 +0300 Subject: [PATCH 28/49] Update jpeg from 9d to 9e --- Client/core/premake5.lua | 2 +- premake5.lua | 2 +- vendor/{jpeg-9d => jpeg-9e}/cderror.h | 3 +- vendor/{jpeg-9d => jpeg-9e}/cdjpeg.c | 0 vendor/{jpeg-9d => jpeg-9e}/cdjpeg.h | 0 vendor/{jpeg-9d => jpeg-9e}/cjpeg.c | 0 vendor/{jpeg-9d => jpeg-9e}/ckconfig.c | 0 vendor/{jpeg-9d => jpeg-9e}/djpeg.c | 0 vendor/{jpeg-9d => jpeg-9e}/example.c | 0 vendor/{jpeg-9d => jpeg-9e}/jaricom.c | 0 vendor/{jpeg-9d => jpeg-9e}/jcapimin.c | 0 vendor/{jpeg-9d => jpeg-9e}/jcapistd.c | 0 vendor/{jpeg-9d => jpeg-9e}/jcarith.c | 12 +- vendor/{jpeg-9d => jpeg-9e}/jccoefct.c | 148 ++++++++++++----------- vendor/{jpeg-9d => jpeg-9e}/jccolor.c | 0 vendor/{jpeg-9d => jpeg-9e}/jcdctmgr.c | 29 ++--- vendor/{jpeg-9d => jpeg-9e}/jchuff.c | 14 +-- vendor/{jpeg-9d => jpeg-9e}/jcinit.c | 0 vendor/{jpeg-9d => jpeg-9e}/jcmainct.c | 0 vendor/{jpeg-9d => jpeg-9e}/jcmarker.c | 0 vendor/{jpeg-9d => jpeg-9e}/jcmaster.c | 28 ++--- vendor/{jpeg-9d => jpeg-9e}/jcomapi.c | 0 vendor/{jpeg-9d => jpeg-9e}/jconfig.h | 0 vendor/{jpeg-9d => jpeg-9e}/jcparam.c | 21 ++-- vendor/{jpeg-9d => jpeg-9e}/jcprepct.c | 22 ++-- vendor/{jpeg-9d => jpeg-9e}/jcsample.c | 10 +- vendor/{jpeg-9d => jpeg-9e}/jctrans.c | 56 ++++----- vendor/{jpeg-9d => jpeg-9e}/jdapimin.c | 35 ++++-- vendor/{jpeg-9d => jpeg-9e}/jdapistd.c | 0 vendor/{jpeg-9d => jpeg-9e}/jdarith.c | 12 +- vendor/{jpeg-9d => jpeg-9e}/jdatadst.c | 0 vendor/{jpeg-9d => jpeg-9e}/jdatasrc.c | 0 vendor/{jpeg-9d => jpeg-9e}/jdcoefct.c | 113 ++++++++--------- vendor/{jpeg-9d => jpeg-9e}/jdcolor.c | 107 ++++++++++++---- vendor/{jpeg-9d => jpeg-9e}/jdct.h | 0 vendor/{jpeg-9d => jpeg-9e}/jddctmgr.c | 0 vendor/{jpeg-9d => jpeg-9e}/jdhuff.c | 14 +-- vendor/{jpeg-9d => jpeg-9e}/jdinput.c | 39 +++--- vendor/{jpeg-9d => jpeg-9e}/jdmainct.c | 48 ++++---- vendor/{jpeg-9d => jpeg-9e}/jdmarker.c | 0 vendor/{jpeg-9d => jpeg-9e}/jdmaster.c | 29 ++--- vendor/{jpeg-9d => jpeg-9e}/jdmerge.c | 4 +- vendor/{jpeg-9d => jpeg-9e}/jdpostct.c | 0 vendor/{jpeg-9d => jpeg-9e}/jdsample.c | 75 +++++------- vendor/{jpeg-9d => jpeg-9e}/jdtrans.c | 0 vendor/{jpeg-9d => jpeg-9e}/jerror.c | 0 vendor/{jpeg-9d => jpeg-9e}/jerror.h | 0 vendor/{jpeg-9d => jpeg-9e}/jfdctflt.c | 0 vendor/{jpeg-9d => jpeg-9e}/jfdctfst.c | 0 vendor/{jpeg-9d => jpeg-9e}/jfdctint.c | 0 vendor/{jpeg-9d => jpeg-9e}/jidctflt.c | 0 vendor/{jpeg-9d => jpeg-9e}/jidctfst.c | 0 vendor/{jpeg-9d => jpeg-9e}/jidctint.c | 0 vendor/{jpeg-9d => jpeg-9e}/jinclude.h | 0 vendor/{jpeg-9d => jpeg-9e}/jmemansi.c | 0 vendor/{jpeg-9d => jpeg-9e}/jmemdos.c | 0 vendor/{jpeg-9d => jpeg-9e}/jmemmac.c | 0 vendor/{jpeg-9d => jpeg-9e}/jmemmgr.c | 0 vendor/{jpeg-9d => jpeg-9e}/jmemname.c | 0 vendor/{jpeg-9d => jpeg-9e}/jmemnobs.c | 0 vendor/{jpeg-9d => jpeg-9e}/jmemsys.h | 0 vendor/{jpeg-9d => jpeg-9e}/jmorecfg.h | 0 vendor/{jpeg-9d => jpeg-9e}/jpegint.h | 13 +- vendor/{jpeg-9d => jpeg-9e}/jpeglib.h | 4 +- vendor/{jpeg-9d => jpeg-9e}/jpegtran.c | 0 vendor/{jpeg-9d => jpeg-9e}/jquant1.c | 32 ++--- vendor/{jpeg-9d => jpeg-9e}/jquant2.c | 18 +-- vendor/{jpeg-9d => jpeg-9e}/jutils.c | 99 ++++++++------- vendor/{jpeg-9d => jpeg-9e}/jversion.h | 6 +- vendor/{jpeg-9d => jpeg-9e}/premake5.lua | 0 vendor/{jpeg-9d => jpeg-9e}/rdbmp.c | 0 vendor/{jpeg-9d => jpeg-9e}/rdcolmap.c | 0 vendor/{jpeg-9d => jpeg-9e}/rdgif.c | 4 +- vendor/{jpeg-9d => jpeg-9e}/rdjpgcom.c | 0 vendor/{jpeg-9d => jpeg-9e}/rdppm.c | 33 ++--- vendor/{jpeg-9d => jpeg-9e}/rdrle.c | 0 vendor/{jpeg-9d => jpeg-9e}/rdswitch.c | 11 +- vendor/{jpeg-9d => jpeg-9e}/rdtarga.c | 0 vendor/{jpeg-9d => jpeg-9e}/transupp.c | 0 vendor/{jpeg-9d => jpeg-9e}/transupp.h | 0 vendor/{jpeg-9d => jpeg-9e}/wrbmp.c | 0 vendor/{jpeg-9d => jpeg-9e}/wrgif.c | 0 vendor/{jpeg-9d => jpeg-9e}/wrjpgcom.c | 0 vendor/{jpeg-9d => jpeg-9e}/wrppm.c | 21 ++-- vendor/{jpeg-9d => jpeg-9e}/wrrle.c | 0 vendor/{jpeg-9d => jpeg-9e}/wrtarga.c | 0 86 files changed, 547 insertions(+), 517 deletions(-) rename vendor/{jpeg-9d => jpeg-9e}/cderror.h (97%) rename vendor/{jpeg-9d => jpeg-9e}/cdjpeg.c (100%) rename vendor/{jpeg-9d => jpeg-9e}/cdjpeg.h (100%) rename vendor/{jpeg-9d => jpeg-9e}/cjpeg.c (100%) rename vendor/{jpeg-9d => jpeg-9e}/ckconfig.c (100%) rename vendor/{jpeg-9d => jpeg-9e}/djpeg.c (100%) rename vendor/{jpeg-9d => jpeg-9e}/example.c (100%) rename vendor/{jpeg-9d => jpeg-9e}/jaricom.c (100%) rename vendor/{jpeg-9d => jpeg-9e}/jcapimin.c (100%) rename vendor/{jpeg-9d => jpeg-9e}/jcapistd.c (100%) rename vendor/{jpeg-9d => jpeg-9e}/jcarith.c (98%) rename vendor/{jpeg-9d => jpeg-9e}/jccoefct.c (81%) rename vendor/{jpeg-9d => jpeg-9e}/jccolor.c (100%) rename vendor/{jpeg-9d => jpeg-9e}/jcdctmgr.c (95%) rename vendor/{jpeg-9d => jpeg-9e}/jchuff.c (99%) rename vendor/{jpeg-9d => jpeg-9e}/jcinit.c (100%) rename vendor/{jpeg-9d => jpeg-9e}/jcmainct.c (100%) rename vendor/{jpeg-9d => jpeg-9e}/jcmarker.c (100%) rename vendor/{jpeg-9d => jpeg-9e}/jcmaster.c (98%) rename vendor/{jpeg-9d => jpeg-9e}/jcomapi.c (100%) rename vendor/{jpeg-9d => jpeg-9e}/jconfig.h (100%) rename vendor/{jpeg-9d => jpeg-9e}/jcparam.c (96%) rename vendor/{jpeg-9d => jpeg-9e}/jcprepct.c (95%) rename vendor/{jpeg-9d => jpeg-9e}/jcsample.c (98%) rename vendor/{jpeg-9d => jpeg-9e}/jctrans.c (92%) rename vendor/{jpeg-9d => jpeg-9e}/jdapimin.c (92%) rename vendor/{jpeg-9d => jpeg-9e}/jdapistd.c (100%) rename vendor/{jpeg-9d => jpeg-9e}/jdarith.c (98%) rename vendor/{jpeg-9d => jpeg-9e}/jdatadst.c (100%) rename vendor/{jpeg-9d => jpeg-9e}/jdatasrc.c (100%) rename vendor/{jpeg-9d => jpeg-9e}/jdcoefct.c (91%) rename vendor/{jpeg-9d => jpeg-9e}/jdcolor.c (88%) rename vendor/{jpeg-9d => jpeg-9e}/jdct.h (100%) rename vendor/{jpeg-9d => jpeg-9e}/jddctmgr.c (100%) rename vendor/{jpeg-9d => jpeg-9e}/jdhuff.c (99%) rename vendor/{jpeg-9d => jpeg-9e}/jdinput.c (97%) rename vendor/{jpeg-9d => jpeg-9e}/jdmainct.c (93%) rename vendor/{jpeg-9d => jpeg-9e}/jdmarker.c (100%) rename vendor/{jpeg-9d => jpeg-9e}/jdmaster.c (97%) rename vendor/{jpeg-9d => jpeg-9e}/jdmerge.c (99%) rename vendor/{jpeg-9d => jpeg-9e}/jdpostct.c (100%) rename vendor/{jpeg-9d => jpeg-9e}/jdsample.c (86%) rename vendor/{jpeg-9d => jpeg-9e}/jdtrans.c (100%) rename vendor/{jpeg-9d => jpeg-9e}/jerror.c (100%) rename vendor/{jpeg-9d => jpeg-9e}/jerror.h (100%) rename vendor/{jpeg-9d => jpeg-9e}/jfdctflt.c (100%) rename vendor/{jpeg-9d => jpeg-9e}/jfdctfst.c (100%) rename vendor/{jpeg-9d => jpeg-9e}/jfdctint.c (100%) rename vendor/{jpeg-9d => jpeg-9e}/jidctflt.c (100%) rename vendor/{jpeg-9d => jpeg-9e}/jidctfst.c (100%) rename vendor/{jpeg-9d => jpeg-9e}/jidctint.c (100%) rename vendor/{jpeg-9d => jpeg-9e}/jinclude.h (100%) rename vendor/{jpeg-9d => jpeg-9e}/jmemansi.c (100%) rename vendor/{jpeg-9d => jpeg-9e}/jmemdos.c (100%) rename vendor/{jpeg-9d => jpeg-9e}/jmemmac.c (100%) rename vendor/{jpeg-9d => jpeg-9e}/jmemmgr.c (100%) rename vendor/{jpeg-9d => jpeg-9e}/jmemname.c (100%) rename vendor/{jpeg-9d => jpeg-9e}/jmemnobs.c (100%) rename vendor/{jpeg-9d => jpeg-9e}/jmemsys.h (100%) rename vendor/{jpeg-9d => jpeg-9e}/jmorecfg.h (100%) rename vendor/{jpeg-9d => jpeg-9e}/jpegint.h (97%) rename vendor/{jpeg-9d => jpeg-9e}/jpeglib.h (99%) rename vendor/{jpeg-9d => jpeg-9e}/jpegtran.c (100%) rename vendor/{jpeg-9d => jpeg-9e}/jquant1.c (97%) rename vendor/{jpeg-9d => jpeg-9e}/jquant2.c (99%) rename vendor/{jpeg-9d => jpeg-9e}/jutils.c (71%) rename vendor/{jpeg-9d => jpeg-9e}/jversion.h (59%) rename vendor/{jpeg-9d => jpeg-9e}/premake5.lua (100%) rename vendor/{jpeg-9d => jpeg-9e}/rdbmp.c (100%) rename vendor/{jpeg-9d => jpeg-9e}/rdcolmap.c (100%) rename vendor/{jpeg-9d => jpeg-9e}/rdgif.c (99%) rename vendor/{jpeg-9d => jpeg-9e}/rdjpgcom.c (100%) rename vendor/{jpeg-9d => jpeg-9e}/rdppm.c (95%) rename vendor/{jpeg-9d => jpeg-9e}/rdrle.c (100%) rename vendor/{jpeg-9d => jpeg-9e}/rdswitch.c (97%) rename vendor/{jpeg-9d => jpeg-9e}/rdtarga.c (100%) rename vendor/{jpeg-9d => jpeg-9e}/transupp.c (100%) rename vendor/{jpeg-9d => jpeg-9e}/transupp.h (100%) rename vendor/{jpeg-9d => jpeg-9e}/wrbmp.c (100%) rename vendor/{jpeg-9d => jpeg-9e}/wrgif.c (100%) rename vendor/{jpeg-9d => jpeg-9e}/wrjpgcom.c (100%) rename vendor/{jpeg-9d => jpeg-9e}/wrppm.c (94%) rename vendor/{jpeg-9d => jpeg-9e}/wrrle.c (100%) rename vendor/{jpeg-9d => jpeg-9e}/wrtarga.c (100%) diff --git a/Client/core/premake5.lua b/Client/core/premake5.lua index a172f0bd5b..2654dbf9e3 100644 --- a/Client/core/premake5.lua +++ b/Client/core/premake5.lua @@ -16,7 +16,7 @@ project "Client Core" "../sdk", "../../vendor/tinygettext", "../../vendor/zlib", - "../../vendor/jpeg-9d", + "../../vendor/jpeg-9e", "../../vendor/pthreads/include", "../../vendor/sparsehash/src/", "../../vendor/detours/4.0.1/src", diff --git a/premake5.lua b/premake5.lua index 4e269fb88b..2d9aa658f7 100644 --- a/premake5.lua +++ b/premake5.lua @@ -131,7 +131,7 @@ workspace "MTASA" include "vendor/portaudio" include "vendor/cef3" include "vendor/freetype" - include "vendor/jpeg-9d" + include "vendor/jpeg-9e" include "vendor/ksignals" include "vendor/libpng" include "vendor/tinygettext" diff --git a/vendor/jpeg-9d/cderror.h b/vendor/jpeg-9e/cderror.h similarity index 97% rename from vendor/jpeg-9d/cderror.h rename to vendor/jpeg-9e/cderror.h index fd1884f182..bb45b06647 100644 --- a/vendor/jpeg-9d/cderror.h +++ b/vendor/jpeg-9e/cderror.h @@ -2,7 +2,7 @@ * cderror.h * * Copyright (C) 1994-1997, Thomas G. Lane. - * Modified 2009-2017 by Guido Vollbeding. + * Modified 2009-2020 by Guido Vollbeding. * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * @@ -60,6 +60,7 @@ JMESSAGE(JERR_GIF_CODESIZE, "Bogus GIF codesize %d") JMESSAGE(JERR_GIF_COLORSPACE, "GIF output must be grayscale or RGB") JMESSAGE(JERR_GIF_IMAGENOTFOUND, "Too few images in GIF file") JMESSAGE(JERR_GIF_NOT, "Not a GIF file") +JMESSAGE(JERR_GIF_OUTOFRANGE, "Numeric value out of range in GIF file") JMESSAGE(JTRC_GIF, "%ux%ux%d GIF image") JMESSAGE(JTRC_GIF_BADVERSION, "Warning: unexpected GIF version number '%c%c%c'") diff --git a/vendor/jpeg-9d/cdjpeg.c b/vendor/jpeg-9e/cdjpeg.c similarity index 100% rename from vendor/jpeg-9d/cdjpeg.c rename to vendor/jpeg-9e/cdjpeg.c diff --git a/vendor/jpeg-9d/cdjpeg.h b/vendor/jpeg-9e/cdjpeg.h similarity index 100% rename from vendor/jpeg-9d/cdjpeg.h rename to vendor/jpeg-9e/cdjpeg.h diff --git a/vendor/jpeg-9d/cjpeg.c b/vendor/jpeg-9e/cjpeg.c similarity index 100% rename from vendor/jpeg-9d/cjpeg.c rename to vendor/jpeg-9e/cjpeg.c diff --git a/vendor/jpeg-9d/ckconfig.c b/vendor/jpeg-9e/ckconfig.c similarity index 100% rename from vendor/jpeg-9d/ckconfig.c rename to vendor/jpeg-9e/ckconfig.c diff --git a/vendor/jpeg-9d/djpeg.c b/vendor/jpeg-9e/djpeg.c similarity index 100% rename from vendor/jpeg-9d/djpeg.c rename to vendor/jpeg-9e/djpeg.c diff --git a/vendor/jpeg-9d/example.c b/vendor/jpeg-9e/example.c similarity index 100% rename from vendor/jpeg-9d/example.c rename to vendor/jpeg-9e/example.c diff --git a/vendor/jpeg-9d/jaricom.c b/vendor/jpeg-9e/jaricom.c similarity index 100% rename from vendor/jpeg-9d/jaricom.c rename to vendor/jpeg-9e/jaricom.c diff --git a/vendor/jpeg-9d/jcapimin.c b/vendor/jpeg-9e/jcapimin.c similarity index 100% rename from vendor/jpeg-9d/jcapimin.c rename to vendor/jpeg-9e/jcapimin.c diff --git a/vendor/jpeg-9d/jcapistd.c b/vendor/jpeg-9e/jcapistd.c similarity index 100% rename from vendor/jpeg-9d/jcapistd.c rename to vendor/jpeg-9e/jcapistd.c diff --git a/vendor/jpeg-9d/jcarith.c b/vendor/jpeg-9e/jcarith.c similarity index 98% rename from vendor/jpeg-9d/jcarith.c rename to vendor/jpeg-9e/jcarith.c index 46ce6c6a39..1b45089a3a 100644 --- a/vendor/jpeg-9d/jcarith.c +++ b/vendor/jpeg-9e/jcarith.c @@ -1,7 +1,7 @@ /* * jcarith.c * - * Developed 1997-2019 by Guido Vollbeding. + * Developed 1997-2020 by Guido Vollbeding. * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * @@ -361,7 +361,7 @@ emit_restart (j_compress_ptr cinfo, int restart_num) */ METHODDEF(boolean) -encode_mcu_DC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data) +encode_mcu_DC_first (j_compress_ptr cinfo, JBLOCKARRAY MCU_data) { arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy; unsigned char *st; @@ -450,7 +450,7 @@ encode_mcu_DC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data) */ METHODDEF(boolean) -encode_mcu_AC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data) +encode_mcu_AC_first (j_compress_ptr cinfo, JBLOCKARRAY MCU_data) { arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy; const int * natural_order; @@ -557,7 +557,7 @@ encode_mcu_AC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data) */ METHODDEF(boolean) -encode_mcu_DC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data) +encode_mcu_DC_refine (j_compress_ptr cinfo, JBLOCKARRAY MCU_data) { arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy; unsigned char *st; @@ -592,7 +592,7 @@ encode_mcu_DC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data) */ METHODDEF(boolean) -encode_mcu_AC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data) +encode_mcu_AC_refine (j_compress_ptr cinfo, JBLOCKARRAY MCU_data) { arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy; const int * natural_order; @@ -691,7 +691,7 @@ encode_mcu_AC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data) */ METHODDEF(boolean) -encode_mcu (j_compress_ptr cinfo, JBLOCKROW *MCU_data) +encode_mcu (j_compress_ptr cinfo, JBLOCKARRAY MCU_data) { arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy; const int * natural_order; diff --git a/vendor/jpeg-9d/jccoefct.c b/vendor/jpeg-9e/jccoefct.c similarity index 81% rename from vendor/jpeg-9d/jccoefct.c rename to vendor/jpeg-9e/jccoefct.c index 924a703dda..77851f390e 100644 --- a/vendor/jpeg-9d/jccoefct.c +++ b/vendor/jpeg-9e/jccoefct.c @@ -2,7 +2,7 @@ * jccoefct.c * * Copyright (C) 1994-1997, Thomas G. Lane. - * Modified 2003-2011 by Guido Vollbeding. + * Modified 2003-2020 by Guido Vollbeding. * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * @@ -36,16 +36,14 @@ typedef struct { struct jpeg_c_coef_controller pub; /* public fields */ JDIMENSION iMCU_row_num; /* iMCU row # within image */ - JDIMENSION mcu_ctr; /* counts MCUs processed in current row */ + JDIMENSION MCU_ctr; /* counts MCUs processed in current row */ int MCU_vert_offset; /* counts MCU rows within iMCU row */ int MCU_rows_per_iMCU_row; /* number of such rows needed */ /* For single-pass compression, it's sufficient to buffer just one MCU - * (although this may prove a bit slow in practice). We allocate a - * workspace of C_MAX_BLOCKS_IN_MCU coefficient blocks, and reuse it for each - * MCU constructed and sent. (On 80x86, the workspace is FAR even though - * it's not really very big; this is to keep the module interfaces unchanged - * when a large coefficient buffer is necessary.) + * (although this may prove a bit slow in practice). We append a + * workspace of C_MAX_BLOCKS_IN_MCU coefficient blocks, and reuse it + * for each MCU constructed and sent. * In multi-pass modes, this array points to the current MCU's blocks * within the virtual arrays. */ @@ -53,6 +51,9 @@ typedef struct { /* In multi-pass modes, we need a virtual block array for each component. */ jvirt_barray_ptr whole_image[MAX_COMPONENTS]; + + /* Workspace for single-pass compression (omitted otherwise). */ + JBLOCK blk_buffer[C_MAX_BLOCKS_IN_MCU]; } my_coef_controller; typedef my_coef_controller * my_coef_ptr; @@ -88,7 +89,7 @@ start_iMCU_row (j_compress_ptr cinfo) coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->last_row_height; } - coef->mcu_ctr = 0; + coef->MCU_ctr = 0; coef->MCU_vert_offset = 0; } @@ -125,7 +126,6 @@ start_pass_coef (j_compress_ptr cinfo, J_BUF_MODE pass_mode) #endif default: ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); - break; } } @@ -147,59 +147,56 @@ compress_data (j_compress_ptr cinfo, JSAMPIMAGE input_buf) JDIMENSION MCU_col_num; /* index of current MCU within row */ JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1; JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1; - int blkn, bi, ci, yindex, yoffset, blockcnt; - JDIMENSION ypos, xpos; + int ci, xindex, yindex, yoffset, blockcnt; + JBLOCKROW blkp; + JSAMPARRAY input_ptr; + JDIMENSION xpos; jpeg_component_info *compptr; forward_DCT_ptr forward_DCT; /* Loop to write as much as one whole iMCU row */ for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row; yoffset++) { - for (MCU_col_num = coef->mcu_ctr; MCU_col_num <= last_MCU_col; + for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col; MCU_col_num++) { /* Determine where data comes from in input_buf and do the DCT thing. - * Each call on forward_DCT processes a horizontal row of DCT blocks - * as wide as an MCU; we rely on having allocated the MCU_buffer[] blocks - * sequentially. Dummy blocks at the right or bottom edge are filled in + * Each call on forward_DCT processes a horizontal row of DCT blocks as + * wide as an MCU. Dummy blocks at the right or bottom edge are filled in * specially. The data in them does not matter for image reconstruction, * so we fill them with values that will encode to the smallest amount of * data, viz: all zeroes in the AC entries, DC entries equal to previous * block's DC value. (Thanks to Thomas Kinsman for this idea.) */ - blkn = 0; + blkp = coef->blk_buffer; /* pointer to current DCT block within MCU */ for (ci = 0; ci < cinfo->comps_in_scan; ci++) { compptr = cinfo->cur_comp_info[ci]; forward_DCT = cinfo->fdct->forward_DCT[compptr->component_index]; + input_ptr = input_buf[compptr->component_index] + + yoffset * compptr->DCT_v_scaled_size; + /* ypos == (yoffset + yindex) * compptr->DCT_v_scaled_size */ blockcnt = (MCU_col_num < last_MCU_col) ? compptr->MCU_width : compptr->last_col_width; xpos = MCU_col_num * compptr->MCU_sample_width; - ypos = yoffset * compptr->DCT_v_scaled_size; - /* ypos == (yoffset+yindex) * DCTSIZE */ for (yindex = 0; yindex < compptr->MCU_height; yindex++) { if (coef->iMCU_row_num < last_iMCU_row || - yoffset+yindex < compptr->last_row_height) { - (*forward_DCT) (cinfo, compptr, - input_buf[compptr->component_index], - coef->MCU_buffer[blkn], - ypos, xpos, (JDIMENSION) blockcnt); - if (blockcnt < compptr->MCU_width) { - /* Create some dummy blocks at the right edge of the image. */ - FMEMZERO((void FAR *) coef->MCU_buffer[blkn + blockcnt], - (compptr->MCU_width - blockcnt) * SIZEOF(JBLOCK)); - for (bi = blockcnt; bi < compptr->MCU_width; bi++) { - coef->MCU_buffer[blkn+bi][0][0] = coef->MCU_buffer[blkn+bi-1][0][0]; - } - } + yoffset + yindex < compptr->last_row_height) { + (*forward_DCT) (cinfo, compptr, input_ptr, blkp, + xpos, (JDIMENSION) blockcnt); + input_ptr += compptr->DCT_v_scaled_size; + blkp += blockcnt; + /* Dummy blocks at right edge */ + if ((xindex = compptr->MCU_width - blockcnt) == 0) + continue; } else { - /* Create a row of dummy blocks at the bottom of the image. */ - FMEMZERO((void FAR *) coef->MCU_buffer[blkn], - compptr->MCU_width * SIZEOF(JBLOCK)); - for (bi = 0; bi < compptr->MCU_width; bi++) { - coef->MCU_buffer[blkn+bi][0][0] = coef->MCU_buffer[blkn-1][0][0]; - } + /* At bottom of image, need a whole row of dummy blocks */ + xindex = compptr->MCU_width; } - blkn += compptr->MCU_width; - ypos += compptr->DCT_v_scaled_size; + /* Fill in any dummy blocks needed in this row */ + MEMZERO(blkp, xindex * SIZEOF(JBLOCK)); + do { + blkp[0][0] = blkp[-1][0]; + blkp++; + } while (--xindex); } } /* Try to write the MCU. In event of a suspension failure, we will @@ -208,12 +205,12 @@ compress_data (j_compress_ptr cinfo, JSAMPIMAGE input_buf) if (! (*cinfo->entropy->encode_mcu) (cinfo, coef->MCU_buffer)) { /* Suspension forced; update state counters and exit */ coef->MCU_vert_offset = yoffset; - coef->mcu_ctr = MCU_col_num; + coef->MCU_ctr = MCU_col_num; return FALSE; } } /* Completed an MCU row, but perhaps not an iMCU row */ - coef->mcu_ctr = 0; + coef->MCU_ctr = 0; } /* Completed the iMCU row, advance counters for next one */ coef->iMCU_row_num++; @@ -256,6 +253,7 @@ compress_first_pass (j_compress_ptr cinfo, JSAMPIMAGE input_buf) jpeg_component_info *compptr; JBLOCKARRAY buffer; JBLOCKROW thisblockrow, lastblockrow; + JSAMPARRAY input_ptr; forward_DCT_ptr forward_DCT; for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; @@ -280,14 +278,15 @@ compress_first_pass (j_compress_ptr cinfo, JSAMPIMAGE input_buf) if (ndummy > 0) ndummy = h_samp_factor - ndummy; forward_DCT = cinfo->fdct->forward_DCT[ci]; + input_ptr = input_buf[ci]; /* Perform DCT for all non-dummy blocks in this iMCU row. Each call * on forward_DCT processes a complete horizontal row of DCT blocks. */ for (block_row = 0; block_row < block_rows; block_row++) { thisblockrow = buffer[block_row]; - (*forward_DCT) (cinfo, compptr, input_buf[ci], thisblockrow, - (JDIMENSION) (block_row * compptr->DCT_v_scaled_size), + (*forward_DCT) (cinfo, compptr, input_ptr, thisblockrow, (JDIMENSION) 0, blocks_across); + input_ptr += compptr->DCT_v_scaled_size; if (ndummy > 0) { /* Create dummy blocks at the right edge of the image. */ thisblockrow += blocks_across; /* => first dummy block */ @@ -303,15 +302,14 @@ compress_first_pass (j_compress_ptr cinfo, JSAMPIMAGE input_buf) * of the dummy blocks to match the last real block's DC value. * This squeezes a few more bytes out of the resulting file... */ - if (coef->iMCU_row_num == last_iMCU_row) { + if (block_row < compptr->v_samp_factor) { blocks_across += ndummy; /* include lower right corner */ MCUs_across = blocks_across / h_samp_factor; - for (block_row = block_rows; block_row < compptr->v_samp_factor; - block_row++) { + do { thisblockrow = buffer[block_row]; lastblockrow = buffer[block_row-1]; FMEMZERO((void FAR *) thisblockrow, - (size_t) (blocks_across * SIZEOF(JBLOCK))); + (size_t) blocks_across * SIZEOF(JBLOCK)); for (MCUindex = 0; MCUindex < MCUs_across; MCUindex++) { lastDC = lastblockrow[h_samp_factor-1][0]; for (bi = 0; bi < h_samp_factor; bi++) { @@ -320,7 +318,7 @@ compress_first_pass (j_compress_ptr cinfo, JSAMPIMAGE input_buf) thisblockrow += h_samp_factor; /* advance to next MCU in row */ lastblockrow += h_samp_factor; } - } + } while (++block_row < compptr->v_samp_factor); } } /* NB: compress_output will increment iMCU_row_num if successful. @@ -347,8 +345,9 @@ compress_output (j_compress_ptr cinfo, JSAMPIMAGE input_buf) { my_coef_ptr coef = (my_coef_ptr) cinfo->coef; JDIMENSION MCU_col_num; /* index of current MCU within row */ - int blkn, ci, xindex, yindex, yoffset; + int ci, xindex, yindex, yoffset; JDIMENSION start_col; + JBLOCKARRAY blkp; JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN]; JBLOCKROW buffer_ptr; jpeg_component_info *compptr; @@ -368,30 +367,31 @@ compress_output (j_compress_ptr cinfo, JSAMPIMAGE input_buf) /* Loop to process one whole iMCU row */ for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row; yoffset++) { - for (MCU_col_num = coef->mcu_ctr; MCU_col_num < cinfo->MCUs_per_row; + for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row; MCU_col_num++) { /* Construct list of pointers to DCT blocks belonging to this MCU */ - blkn = 0; /* index of current DCT block within MCU */ + blkp = coef->MCU_buffer; /* pointer to current DCT block within MCU */ for (ci = 0; ci < cinfo->comps_in_scan; ci++) { compptr = cinfo->cur_comp_info[ci]; start_col = MCU_col_num * compptr->MCU_width; for (yindex = 0; yindex < compptr->MCU_height; yindex++) { - buffer_ptr = buffer[ci][yindex+yoffset] + start_col; - for (xindex = 0; xindex < compptr->MCU_width; xindex++) { - coef->MCU_buffer[blkn++] = buffer_ptr++; - } + buffer_ptr = buffer[ci][yoffset + yindex] + start_col; + xindex = compptr->MCU_width; + do { + *blkp++ = buffer_ptr++; + } while (--xindex); } } /* Try to write the MCU. */ if (! (*cinfo->entropy->encode_mcu) (cinfo, coef->MCU_buffer)) { /* Suspension forced; update state counters and exit */ coef->MCU_vert_offset = yoffset; - coef->mcu_ctr = MCU_col_num; + coef->MCU_ctr = MCU_col_num; return FALSE; } } /* Completed an MCU row, but perhaps not an iMCU row */ - coef->mcu_ctr = 0; + coef->MCU_ctr = 0; } /* Completed the iMCU row, advance counters for next one */ coef->iMCU_row_num++; @@ -411,13 +411,6 @@ jinit_c_coef_controller (j_compress_ptr cinfo, boolean need_full_buffer) { my_coef_ptr coef; - coef = (my_coef_ptr) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - SIZEOF(my_coef_controller)); - cinfo->coef = (struct jpeg_c_coef_controller *) coef; - coef->pub.start_pass = start_pass_coef; - - /* Create the coefficient buffer. */ if (need_full_buffer) { #ifdef FULL_COEF_BUFFER_SUPPORTED /* Allocate a full-image virtual array for each component, */ @@ -425,6 +418,9 @@ jinit_c_coef_controller (j_compress_ptr cinfo, boolean need_full_buffer) int ci; jpeg_component_info *compptr; + coef = (my_coef_ptr) (*cinfo->mem->alloc_small) + ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(my_coef_controller) - SIZEOF(coef->blk_buffer)); for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; ci++, compptr++) { coef->whole_image[ci] = (*cinfo->mem->request_virt_barray) @@ -440,15 +436,21 @@ jinit_c_coef_controller (j_compress_ptr cinfo, boolean need_full_buffer) #endif } else { /* We only need a single-MCU buffer. */ - JBLOCKROW buffer; - int i; - - buffer = (JBLOCKROW) - (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE, - C_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK)); - for (i = 0; i < C_MAX_BLOCKS_IN_MCU; i++) { - coef->MCU_buffer[i] = buffer + i; - } + JBLOCKARRAY blkp; + JBLOCKROW buffer_ptr; + int bi; + + coef = (my_coef_ptr) (*cinfo->mem->alloc_small) + ((j_common_ptr) cinfo, JPOOL_IMAGE, SIZEOF(my_coef_controller)); + blkp = coef->MCU_buffer; + buffer_ptr = coef->blk_buffer; + bi = C_MAX_BLOCKS_IN_MCU; + do { + *blkp++ = buffer_ptr++; + } while (--bi); coef->whole_image[0] = NULL; /* flag for no virtual arrays */ } + + coef->pub.start_pass = start_pass_coef; + cinfo->coef = &coef->pub; } diff --git a/vendor/jpeg-9d/jccolor.c b/vendor/jpeg-9e/jccolor.c similarity index 100% rename from vendor/jpeg-9d/jccolor.c rename to vendor/jpeg-9e/jccolor.c diff --git a/vendor/jpeg-9d/jcdctmgr.c b/vendor/jpeg-9e/jcdctmgr.c similarity index 95% rename from vendor/jpeg-9d/jcdctmgr.c rename to vendor/jpeg-9e/jcdctmgr.c index fafab91c69..a48ccd8147 100644 --- a/vendor/jpeg-9d/jcdctmgr.c +++ b/vendor/jpeg-9e/jcdctmgr.c @@ -2,7 +2,7 @@ * jcdctmgr.c * * Copyright (C) 1994-1996, Thomas G. Lane. - * Modified 2003-2013 by Guido Vollbeding. + * Modified 2003-2020 by Guido Vollbeding. * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * @@ -66,15 +66,14 @@ typedef union { * Perform forward DCT on one or more blocks of a component. * * The input samples are taken from the sample_data[] array starting at - * position start_row/start_col, and moving to the right for any additional - * blocks. The quantized coefficients are returned in coef_blocks[]. + * position start_col, and moving to the right for any additional blocks. + * The quantized coefficients are returned in coef_blocks[]. */ METHODDEF(void) forward_DCT (j_compress_ptr cinfo, jpeg_component_info * compptr, JSAMPARRAY sample_data, JBLOCKROW coef_blocks, - JDIMENSION start_row, JDIMENSION start_col, - JDIMENSION num_blocks) + JDIMENSION start_col, JDIMENSION num_blocks) /* This version is used for integer DCT implementations. */ { /* This routine is heavily used, so it's worth coding it tightly. */ @@ -84,8 +83,6 @@ forward_DCT (j_compress_ptr cinfo, jpeg_component_info * compptr, DCTELEM workspace[DCTSIZE2]; /* work area for FDCT subroutine */ JDIMENSION bi; - sample_data += start_row; /* fold in the vertical offset once */ - for (bi = 0; bi < num_blocks; bi++, start_col += compptr->DCT_h_scaled_size) { /* Perform the DCT */ (*do_dct) (workspace, sample_data, start_col); @@ -136,8 +133,7 @@ forward_DCT (j_compress_ptr cinfo, jpeg_component_info * compptr, METHODDEF(void) forward_DCT_float (j_compress_ptr cinfo, jpeg_component_info * compptr, JSAMPARRAY sample_data, JBLOCKROW coef_blocks, - JDIMENSION start_row, JDIMENSION start_col, - JDIMENSION num_blocks) + JDIMENSION start_col, JDIMENSION num_blocks) /* This version is used for floating-point DCT implementations. */ { /* This routine is heavily used, so it's worth coding it tightly. */ @@ -147,8 +143,6 @@ forward_DCT_float (j_compress_ptr cinfo, jpeg_component_info * compptr, FAST_FLOAT workspace[DCTSIZE2]; /* work area for FDCT subroutine */ JDIMENSION bi; - sample_data += start_row; /* fold in the vertical offset once */ - for (bi = 0; bi < num_blocks; bi++, start_col += compptr->DCT_h_scaled_size) { /* Perform the DCT */ (*do_dct) (workspace, sample_data, start_col); @@ -347,13 +341,11 @@ start_pass_fdctmgr (j_compress_ptr cinfo) #endif default: ERREXIT(cinfo, JERR_NOT_COMPILED); - break; } break; default: ERREXIT2(cinfo, JERR_BAD_DCTSIZE, compptr->DCT_h_scaled_size, compptr->DCT_v_scaled_size); - break; } qtblno = compptr->quant_tbl_no; /* Make sure specified quantization table is present */ @@ -444,7 +436,6 @@ start_pass_fdctmgr (j_compress_ptr cinfo) #endif default: ERREXIT(cinfo, JERR_NOT_COMPILED); - break; } } } @@ -461,17 +452,15 @@ jinit_forward_dct (j_compress_ptr cinfo) int ci; jpeg_component_info *compptr; - fdct = (my_fdct_ptr) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - SIZEOF(my_fdct_controller)); + fdct = (my_fdct_ptr) (*cinfo->mem->alloc_small) + ((j_common_ptr) cinfo, JPOOL_IMAGE, SIZEOF(my_fdct_controller)); cinfo->fdct = &fdct->pub; fdct->pub.start_pass = start_pass_fdctmgr; for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; ci++, compptr++) { /* Allocate a divisor table for each component */ - compptr->dct_table = - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - SIZEOF(divisor_table)); + compptr->dct_table = (*cinfo->mem->alloc_small) + ((j_common_ptr) cinfo, JPOOL_IMAGE, SIZEOF(divisor_table)); } } diff --git a/vendor/jpeg-9d/jchuff.c b/vendor/jpeg-9e/jchuff.c similarity index 99% rename from vendor/jpeg-9d/jchuff.c rename to vendor/jpeg-9e/jchuff.c index 02fc275b7a..f3272c9fa6 100644 --- a/vendor/jpeg-9d/jchuff.c +++ b/vendor/jpeg-9e/jchuff.c @@ -2,7 +2,7 @@ * jchuff.c * * Copyright (C) 1991-1997, Thomas G. Lane. - * Modified 2006-2019 by Guido Vollbeding. + * Modified 2006-2020 by Guido Vollbeding. * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * @@ -542,7 +542,7 @@ emit_restart_e (huff_entropy_ptr entropy, int restart_num) */ METHODDEF(boolean) -encode_mcu_DC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data) +encode_mcu_DC_first (j_compress_ptr cinfo, JBLOCKARRAY MCU_data) { huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; register int temp, temp2; @@ -625,7 +625,7 @@ encode_mcu_DC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data) */ METHODDEF(boolean) -encode_mcu_AC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data) +encode_mcu_AC_first (j_compress_ptr cinfo, JBLOCKARRAY MCU_data) { huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; const int * natural_order; @@ -736,7 +736,7 @@ encode_mcu_AC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data) */ METHODDEF(boolean) -encode_mcu_DC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data) +encode_mcu_DC_refine (j_compress_ptr cinfo, JBLOCKARRAY MCU_data) { huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; int Al, blkn; @@ -779,7 +779,7 @@ encode_mcu_DC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data) */ METHODDEF(boolean) -encode_mcu_AC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data) +encode_mcu_AC_refine (j_compress_ptr cinfo, JBLOCKARRAY MCU_data) { huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; const int * natural_order; @@ -1009,7 +1009,7 @@ encode_one_block (working_state * state, JCOEFPTR block, int last_dc_val, */ METHODDEF(boolean) -encode_mcu_huff (j_compress_ptr cinfo, JBLOCKROW *MCU_data) +encode_mcu_huff (j_compress_ptr cinfo, JBLOCKARRAY MCU_data) { huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; working_state state; @@ -1190,7 +1190,7 @@ htest_one_block (j_compress_ptr cinfo, JCOEFPTR block, int last_dc_val, */ METHODDEF(boolean) -encode_mcu_gather (j_compress_ptr cinfo, JBLOCKROW *MCU_data) +encode_mcu_gather (j_compress_ptr cinfo, JBLOCKARRAY MCU_data) { huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; int blkn, ci; diff --git a/vendor/jpeg-9d/jcinit.c b/vendor/jpeg-9e/jcinit.c similarity index 100% rename from vendor/jpeg-9d/jcinit.c rename to vendor/jpeg-9e/jcinit.c diff --git a/vendor/jpeg-9d/jcmainct.c b/vendor/jpeg-9e/jcmainct.c similarity index 100% rename from vendor/jpeg-9d/jcmainct.c rename to vendor/jpeg-9e/jcmainct.c diff --git a/vendor/jpeg-9d/jcmarker.c b/vendor/jpeg-9e/jcmarker.c similarity index 100% rename from vendor/jpeg-9d/jcmarker.c rename to vendor/jpeg-9e/jcmarker.c diff --git a/vendor/jpeg-9d/jcmaster.c b/vendor/jpeg-9e/jcmaster.c similarity index 98% rename from vendor/jpeg-9d/jcmaster.c rename to vendor/jpeg-9e/jcmaster.c index 89dcf78c2a..a70af0c020 100644 --- a/vendor/jpeg-9d/jcmaster.c +++ b/vendor/jpeg-9e/jcmaster.c @@ -2,7 +2,7 @@ * jcmaster.c * * Copyright (C) 1991-1997, Thomas G. Lane. - * Modified 2003-2019 by Guido Vollbeding. + * Modified 2003-2020 by Guido Vollbeding. * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * @@ -391,16 +391,16 @@ per_scan_setup (j_compress_ptr cinfo) { int ci, mcublks, tmp; jpeg_component_info *compptr; - + if (cinfo->comps_in_scan == 1) { - + /* Noninterleaved (single-component) scan */ compptr = cinfo->cur_comp_info[0]; - + /* Overall image size in MCUs */ cinfo->MCUs_per_row = compptr->width_in_blocks; cinfo->MCU_rows_in_scan = compptr->height_in_blocks; - + /* For noninterleaved scan, always one block per MCU */ compptr->MCU_width = 1; compptr->MCU_height = 1; @@ -413,28 +413,26 @@ per_scan_setup (j_compress_ptr cinfo) tmp = (int) (compptr->height_in_blocks % compptr->v_samp_factor); if (tmp == 0) tmp = compptr->v_samp_factor; compptr->last_row_height = tmp; - + /* Prepare array describing MCU composition */ cinfo->blocks_in_MCU = 1; cinfo->MCU_membership[0] = 0; - + } else { - + /* Interleaved (multi-component) scan */ if (cinfo->comps_in_scan <= 0 || cinfo->comps_in_scan > MAX_COMPS_IN_SCAN) ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->comps_in_scan, MAX_COMPS_IN_SCAN); - + /* Overall image size in MCUs */ cinfo->MCUs_per_row = (JDIMENSION) jdiv_round_up((long) cinfo->jpeg_width, (long) (cinfo->max_h_samp_factor * cinfo->block_size)); - cinfo->MCU_rows_in_scan = (JDIMENSION) - jdiv_round_up((long) cinfo->jpeg_height, - (long) (cinfo->max_v_samp_factor * cinfo->block_size)); - + cinfo->MCU_rows_in_scan = cinfo->total_iMCU_rows; + cinfo->blocks_in_MCU = 0; - + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { compptr = cinfo->cur_comp_info[ci]; /* Sampling factors give # of blocks of component in each MCU */ @@ -457,7 +455,7 @@ per_scan_setup (j_compress_ptr cinfo) cinfo->MCU_membership[cinfo->blocks_in_MCU++] = ci; } } - + } /* Convert restart specified in rows to actual MCU count. */ diff --git a/vendor/jpeg-9d/jcomapi.c b/vendor/jpeg-9e/jcomapi.c similarity index 100% rename from vendor/jpeg-9d/jcomapi.c rename to vendor/jpeg-9e/jcomapi.c diff --git a/vendor/jpeg-9d/jconfig.h b/vendor/jpeg-9e/jconfig.h similarity index 100% rename from vendor/jpeg-9d/jconfig.h rename to vendor/jpeg-9e/jconfig.h diff --git a/vendor/jpeg-9d/jcparam.c b/vendor/jpeg-9e/jcparam.c similarity index 96% rename from vendor/jpeg-9d/jcparam.c rename to vendor/jpeg-9e/jcparam.c index 3b7014ff2c..261ae86ca0 100644 --- a/vendor/jpeg-9d/jcparam.c +++ b/vendor/jpeg-9e/jcparam.c @@ -2,7 +2,7 @@ * jcparam.c * * Copyright (C) 1991-1998, Thomas G. Lane. - * Modified 2003-2019 by Guido Vollbeding. + * Modified 2003-2022 by Guido Vollbeding. * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * @@ -62,8 +62,9 @@ jpeg_add_quant_table (j_compress_ptr cinfo, int which_tbl, /* These are the sample quantization tables given in JPEG spec section K.1. - * The spec says that the values given produce "good" quality, and - * when divided by 2, "very good" quality. + * NOTE: chrominance DC value is changed from 17 to 16 for lossless support. + * The spec says that the values given produce "good" quality, + * and when divided by 2, "very good" quality. */ static const unsigned int std_luminance_quant_tbl[DCTSIZE2] = { 16, 11, 10, 16, 24, 40, 51, 61, @@ -76,7 +77,7 @@ static const unsigned int std_luminance_quant_tbl[DCTSIZE2] = { 72, 92, 95, 98, 112, 100, 103, 99 }; static const unsigned int std_chrominance_quant_tbl[DCTSIZE2] = { - 17, 18, 24, 47, 99, 99, 99, 99, + 16, 18, 24, 47, 99, 99, 99, 99, 18, 21, 26, 66, 99, 99, 99, 99, 24, 26, 56, 99, 99, 99, 99, 99, 47, 66, 99, 99, 99, 99, 99, 99, @@ -379,11 +380,13 @@ jpeg_set_colorspace (j_compress_ptr cinfo, J_COLOR_SPACE colorspace) case JCS_RGB: cinfo->write_Adobe_marker = TRUE; /* write Adobe marker to flag RGB */ cinfo->num_components = 3; - SET_COMP(0, 0x52 /* 'R' */, 1,1, 0, + SET_COMP(0, 0x52 /* 'R' */, 1,1, + cinfo->color_transform == JCT_SUBTRACT_GREEN ? 1 : 0, cinfo->color_transform == JCT_SUBTRACT_GREEN ? 1 : 0, cinfo->color_transform == JCT_SUBTRACT_GREEN ? 1 : 0); SET_COMP(1, 0x47 /* 'G' */, 1,1, 0, 0,0); - SET_COMP(2, 0x42 /* 'B' */, 1,1, 0, + SET_COMP(2, 0x42 /* 'B' */, 1,1, + cinfo->color_transform == JCT_SUBTRACT_GREEN ? 1 : 0, cinfo->color_transform == JCT_SUBTRACT_GREEN ? 1 : 0, cinfo->color_transform == JCT_SUBTRACT_GREEN ? 1 : 0); break; @@ -417,11 +420,13 @@ jpeg_set_colorspace (j_compress_ptr cinfo, J_COLOR_SPACE colorspace) cinfo->JFIF_major_version = 2; /* Set JFIF major version = 2 */ cinfo->num_components = 3; /* Add offset 0x20 to the normal R/G/B component IDs */ - SET_COMP(0, 0x72 /* 'r' */, 1,1, 0, + SET_COMP(0, 0x72 /* 'r' */, 1,1, + cinfo->color_transform == JCT_SUBTRACT_GREEN ? 1 : 0, cinfo->color_transform == JCT_SUBTRACT_GREEN ? 1 : 0, cinfo->color_transform == JCT_SUBTRACT_GREEN ? 1 : 0); SET_COMP(1, 0x67 /* 'g' */, 1,1, 0, 0,0); - SET_COMP(2, 0x62 /* 'b' */, 1,1, 0, + SET_COMP(2, 0x62 /* 'b' */, 1,1, + cinfo->color_transform == JCT_SUBTRACT_GREEN ? 1 : 0, cinfo->color_transform == JCT_SUBTRACT_GREEN ? 1 : 0, cinfo->color_transform == JCT_SUBTRACT_GREEN ? 1 : 0); break; diff --git a/vendor/jpeg-9d/jcprepct.c b/vendor/jpeg-9e/jcprepct.c similarity index 95% rename from vendor/jpeg-9d/jcprepct.c rename to vendor/jpeg-9e/jcprepct.c index be44cc4b45..586964bd44 100644 --- a/vendor/jpeg-9d/jcprepct.c +++ b/vendor/jpeg-9e/jcprepct.c @@ -2,6 +2,7 @@ * jcprepct.c * * Copyright (C) 1994-1996, Thomas G. Lane. + * Modified 2003-2020 by Guido Vollbeding. * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * @@ -109,7 +110,8 @@ expand_bottom_edge (JSAMPARRAY image_data, JDIMENSION num_cols, register int row; for (row = input_rows; row < output_rows; row++) { - jcopy_sample_rows(image_data, input_rows-1, image_data, row, + jcopy_sample_rows(image_data + input_rows - 1, + image_data + row, 1, num_cols); } } @@ -220,8 +222,8 @@ pre_process_context (j_compress_ptr cinfo, for (ci = 0; ci < cinfo->num_components; ci++) { int row; for (row = 1; row <= cinfo->max_v_samp_factor; row++) { - jcopy_sample_rows(prep->color_buf[ci], 0, - prep->color_buf[ci], -row, + jcopy_sample_rows(prep->color_buf[ci], + prep->color_buf[ci] - row, 1, cinfo->image_width); } } @@ -277,10 +279,9 @@ create_context_buffer (j_compress_ptr cinfo) /* Grab enough space for fake row pointers for all the components; * we need five row groups' worth of pointers for each component. */ - fake_buffer = (JSAMPARRAY) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - (cinfo->num_components * 5 * rgroup_height) * - SIZEOF(JSAMPROW)); + fake_buffer = (JSAMPARRAY) (*cinfo->mem->alloc_small) + ((j_common_ptr) cinfo, JPOOL_IMAGE, + (cinfo->num_components * 5 * rgroup_height) * SIZEOF(JSAMPROW)); for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; ci++, compptr++) { @@ -324,10 +325,9 @@ jinit_c_prep_controller (j_compress_ptr cinfo, boolean need_full_buffer) if (need_full_buffer) /* safety check */ ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); - prep = (my_prep_ptr) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - SIZEOF(my_prep_controller)); - cinfo->prep = (struct jpeg_c_prep_controller *) prep; + prep = (my_prep_ptr) (*cinfo->mem->alloc_small) + ((j_common_ptr) cinfo, JPOOL_IMAGE, SIZEOF(my_prep_controller)); + cinfo->prep = &prep->pub; prep->pub.start_pass = start_pass_prep; /* Allocate the color conversion buffer. diff --git a/vendor/jpeg-9d/jcsample.c b/vendor/jpeg-9e/jcsample.c similarity index 98% rename from vendor/jpeg-9d/jcsample.c rename to vendor/jpeg-9e/jcsample.c index 4d36f85f35..2372c4173f 100644 --- a/vendor/jpeg-9d/jcsample.c +++ b/vendor/jpeg-9e/jcsample.c @@ -2,6 +2,7 @@ * jcsample.c * * Copyright (C) 1991-1996, Thomas G. Lane. + * Modified 2003-2020 by Guido Vollbeding. * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * @@ -200,7 +201,7 @@ fullsize_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr, JSAMPARRAY input_data, JSAMPARRAY output_data) { /* Copy the data */ - jcopy_sample_rows(input_data, 0, output_data, 0, + jcopy_sample_rows(input_data, output_data, cinfo->max_v_samp_factor, cinfo->image_width); /* Edge-expand */ expand_right_edge(output_data, cinfo->max_v_samp_factor, cinfo->image_width, @@ -483,10 +484,9 @@ jinit_downsampler (j_compress_ptr cinfo) boolean smoothok = TRUE; int h_in_group, v_in_group, h_out_group, v_out_group; - downsample = (my_downsample_ptr) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - SIZEOF(my_downsampler)); - cinfo->downsample = (struct jpeg_downsampler *) downsample; + downsample = (my_downsample_ptr) (*cinfo->mem->alloc_small) + ((j_common_ptr) cinfo, JPOOL_IMAGE, SIZEOF(my_downsampler)); + cinfo->downsample = &downsample->pub; downsample->pub.start_pass = start_pass_downsample; downsample->pub.downsample = sep_downsample; downsample->pub.need_context_rows = FALSE; diff --git a/vendor/jpeg-9d/jctrans.c b/vendor/jpeg-9e/jctrans.c similarity index 92% rename from vendor/jpeg-9d/jctrans.c rename to vendor/jpeg-9e/jctrans.c index 5780de42e2..261dd2996e 100644 --- a/vendor/jpeg-9d/jctrans.c +++ b/vendor/jpeg-9e/jctrans.c @@ -2,7 +2,7 @@ * jctrans.c * * Copyright (C) 1995-1998, Thomas G. Lane. - * Modified 2000-2017 by Guido Vollbeding. + * Modified 2000-2020 by Guido Vollbeding. * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * @@ -224,7 +224,7 @@ typedef struct { struct jpeg_c_coef_controller pub; /* public fields */ JDIMENSION iMCU_row_num; /* iMCU row # within image */ - JDIMENSION mcu_ctr; /* counts MCUs processed in current row */ + JDIMENSION MCU_ctr; /* counts MCUs processed in current row */ int MCU_vert_offset; /* counts MCU rows within iMCU row */ int MCU_rows_per_iMCU_row; /* number of such rows needed */ @@ -232,7 +232,7 @@ typedef struct { jvirt_barray_ptr * whole_image; /* Workspace for constructing dummy blocks at right/bottom edges. */ - JBLOCKROW dummy_buffer[C_MAX_BLOCKS_IN_MCU]; + JBLOCK dummy_buffer[C_MAX_BLOCKS_IN_MCU]; } my_coef_controller; typedef my_coef_controller * my_coef_ptr; @@ -257,7 +257,7 @@ start_iMCU_row (j_compress_ptr cinfo) coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->last_row_height; } - coef->mcu_ctr = 0; + coef->MCU_ctr = 0; coef->MCU_vert_offset = 0; } @@ -315,25 +315,30 @@ compress_output (j_compress_ptr cinfo, JSAMPIMAGE input_buf) /* Loop to process one whole iMCU row */ for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row; yoffset++) { - for (MCU_col_num = coef->mcu_ctr; MCU_col_num < cinfo->MCUs_per_row; + for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col; MCU_col_num++) { /* Construct list of pointers to DCT blocks belonging to this MCU */ blkn = 0; /* index of current DCT block within MCU */ for (ci = 0; ci < cinfo->comps_in_scan; ci++) { compptr = cinfo->cur_comp_info[ci]; - start_col = MCU_col_num * compptr->MCU_width; blockcnt = (MCU_col_num < last_MCU_col) ? compptr->MCU_width : compptr->last_col_width; + start_col = MCU_col_num * compptr->MCU_width; for (yindex = 0; yindex < compptr->MCU_height; yindex++) { if (coef->iMCU_row_num < last_iMCU_row || - yindex+yoffset < compptr->last_row_height) { + yoffset + yindex < compptr->last_row_height) { /* Fill in pointers to real blocks in this row */ - buffer_ptr = buffer[ci][yindex+yoffset] + start_col; - for (xindex = 0; xindex < blockcnt; xindex++) + buffer_ptr = buffer[ci][yoffset + yindex] + start_col; + xindex = blockcnt; + do { MCU_buffer[blkn++] = buffer_ptr++; + } while (--xindex); + /* Dummy blocks at right edge */ + if ((xindex = compptr->MCU_width - blockcnt) == 0) + continue; } else { /* At bottom of image, need a whole row of dummy blocks */ - xindex = 0; + xindex = compptr->MCU_width; } /* Fill in any dummy blocks needed in this row. * Dummy blocks are filled in the same way as in jccoefct.c: @@ -341,23 +346,23 @@ compress_output (j_compress_ptr cinfo, JSAMPIMAGE input_buf) * block's DC value. The init routine has already zeroed the * AC entries, so we need only set the DC entries correctly. */ - for (; xindex < compptr->MCU_width; xindex++) { - MCU_buffer[blkn] = coef->dummy_buffer[blkn]; - MCU_buffer[blkn][0][0] = MCU_buffer[blkn-1][0][0]; - blkn++; - } + buffer_ptr = coef->dummy_buffer + blkn; + do { + buffer_ptr[0][0] = MCU_buffer[blkn-1][0][0]; + MCU_buffer[blkn++] = buffer_ptr++; + } while (--xindex); } } /* Try to write the MCU. */ if (! (*cinfo->entropy->encode_mcu) (cinfo, MCU_buffer)) { /* Suspension forced; update state counters and exit */ coef->MCU_vert_offset = yoffset; - coef->mcu_ctr = MCU_col_num; + coef->MCU_ctr = MCU_col_num; return FALSE; } } /* Completed an MCU row, but perhaps not an iMCU row */ - coef->mcu_ctr = 0; + coef->MCU_ctr = 0; } /* Completed the iMCU row, advance counters for next one */ coef->iMCU_row_num++; @@ -379,12 +384,9 @@ transencode_coef_controller (j_compress_ptr cinfo, jvirt_barray_ptr * coef_arrays) { my_coef_ptr coef; - JBLOCKROW buffer; - int i; - coef = (my_coef_ptr) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - SIZEOF(my_coef_controller)); + coef = (my_coef_ptr) (*cinfo->mem->alloc_small) + ((j_common_ptr) cinfo, JPOOL_IMAGE, SIZEOF(my_coef_controller)); cinfo->coef = &coef->pub; coef->pub.start_pass = start_pass_coef; coef->pub.compress_data = compress_output; @@ -392,12 +394,6 @@ transencode_coef_controller (j_compress_ptr cinfo, /* Save pointer to virtual arrays */ coef->whole_image = coef_arrays; - /* Allocate and pre-zero space for dummy DCT blocks. */ - buffer = (JBLOCKROW) - (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE, - C_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK)); - FMEMZERO((void FAR *) buffer, C_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK)); - for (i = 0; i < C_MAX_BLOCKS_IN_MCU; i++) { - coef->dummy_buffer[i] = buffer + i; - } + /* Pre-zero space for dummy DCT blocks */ + MEMZERO(coef->dummy_buffer, SIZEOF(coef->dummy_buffer)); } diff --git a/vendor/jpeg-9d/jdapimin.c b/vendor/jpeg-9e/jdapimin.c similarity index 92% rename from vendor/jpeg-9d/jdapimin.c rename to vendor/jpeg-9e/jdapimin.c index a6e0dd9fb8..785e527226 100644 --- a/vendor/jpeg-9d/jdapimin.c +++ b/vendor/jpeg-9e/jdapimin.c @@ -2,7 +2,7 @@ * jdapimin.c * * Copyright (C) 1994-1998, Thomas G. Lane. - * Modified 2009-2013 by Guido Vollbeding. + * Modified 2009-2020 by Guido Vollbeding. * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * @@ -114,7 +114,7 @@ jpeg_abort_decompress (j_decompress_ptr cinfo) LOCAL(void) default_decompress_parms (j_decompress_ptr cinfo) { - int cid0, cid1, cid2; + int cid0, cid1, cid2, cid3; /* Guess the input colorspace, and set output colorspace accordingly. */ /* Note application may override our guesses. */ @@ -123,13 +123,16 @@ default_decompress_parms (j_decompress_ptr cinfo) cinfo->jpeg_color_space = JCS_GRAYSCALE; cinfo->out_color_space = JCS_GRAYSCALE; break; - + case 3: cid0 = cinfo->comp_info[0].component_id; cid1 = cinfo->comp_info[1].component_id; cid2 = cinfo->comp_info[2].component_id; - /* First try to guess from the component IDs */ + /* For robust detection of standard colorspaces + * regardless of the presence of special markers, + * check component IDs from SOF marker first. + */ if (cid0 == 0x01 && cid1 == 0x02 && cid2 == 0x03) cinfo->jpeg_color_space = JCS_YCbCr; else if (cid0 == 0x01 && cid1 == 0x22 && cid2 == 0x23) @@ -151,7 +154,6 @@ default_decompress_parms (j_decompress_ptr cinfo) default: WARNMS1(cinfo, JWRN_ADOBE_XFORM, cinfo->Adobe_transform); cinfo->jpeg_color_space = JCS_YCbCr; /* assume it's YCbCr */ - break; } } else { TRACEMS3(cinfo, 1, JTRC_UNKNOWN_IDS, cid0, cid1, cid2); @@ -160,9 +162,22 @@ default_decompress_parms (j_decompress_ptr cinfo) /* Always guess RGB is proper output colorspace. */ cinfo->out_color_space = JCS_RGB; break; - + case 4: - if (cinfo->saw_Adobe_marker) { + cid0 = cinfo->comp_info[0].component_id; + cid1 = cinfo->comp_info[1].component_id; + cid2 = cinfo->comp_info[2].component_id; + cid3 = cinfo->comp_info[3].component_id; + + /* For robust detection of standard colorspaces + * regardless of the presence of special markers, + * check component IDs from SOF marker first. + */ + if (cid0 == 0x01 && cid1 == 0x02 && cid2 == 0x03 && cid3 == 0x04) + cinfo->jpeg_color_space = JCS_YCCK; + else if (cid0 == 0x43 && cid1 == 0x4D && cid2 == 0x59 && cid3 == 0x4B) + cinfo->jpeg_color_space = JCS_CMYK; /* ASCII 'C', 'M', 'Y', 'K' */ + else if (cinfo->saw_Adobe_marker) { switch (cinfo->Adobe_transform) { case 0: cinfo->jpeg_color_space = JCS_CMYK; @@ -173,19 +188,17 @@ default_decompress_parms (j_decompress_ptr cinfo) default: WARNMS1(cinfo, JWRN_ADOBE_XFORM, cinfo->Adobe_transform); cinfo->jpeg_color_space = JCS_YCCK; /* assume it's YCCK */ - break; } } else { - /* No special markers, assume straight CMYK. */ + /* Unknown IDs and no special markers, assume straight CMYK. */ cinfo->jpeg_color_space = JCS_CMYK; } cinfo->out_color_space = JCS_CMYK; break; - + default: cinfo->jpeg_color_space = JCS_UNKNOWN; cinfo->out_color_space = JCS_UNKNOWN; - break; } /* Set defaults for other decompression parameters. */ diff --git a/vendor/jpeg-9d/jdapistd.c b/vendor/jpeg-9e/jdapistd.c similarity index 100% rename from vendor/jpeg-9d/jdapistd.c rename to vendor/jpeg-9e/jdapistd.c diff --git a/vendor/jpeg-9d/jdarith.c b/vendor/jpeg-9e/jdarith.c similarity index 98% rename from vendor/jpeg-9d/jdarith.c rename to vendor/jpeg-9e/jdarith.c index 9e4dfdf76d..2c9abe23f2 100644 --- a/vendor/jpeg-9d/jdarith.c +++ b/vendor/jpeg-9e/jdarith.c @@ -1,7 +1,7 @@ /* * jdarith.c * - * Developed 1997-2019 by Guido Vollbeding. + * Developed 1997-2020 by Guido Vollbeding. * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * @@ -239,7 +239,7 @@ process_restart (j_decompress_ptr cinfo) */ METHODDEF(boolean) -decode_mcu_DC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) +decode_mcu_DC_first (j_decompress_ptr cinfo, JBLOCKARRAY MCU_data) { arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy; JBLOCKROW block; @@ -318,7 +318,7 @@ decode_mcu_DC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) */ METHODDEF(boolean) -decode_mcu_AC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) +decode_mcu_AC_first (j_decompress_ptr cinfo, JBLOCKARRAY MCU_data) { arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy; JBLOCKROW block; @@ -400,7 +400,7 @@ decode_mcu_AC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) */ METHODDEF(boolean) -decode_mcu_DC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) +decode_mcu_DC_refine (j_decompress_ptr cinfo, JBLOCKARRAY MCU_data) { arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy; unsigned char *st; @@ -434,7 +434,7 @@ decode_mcu_DC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) */ METHODDEF(boolean) -decode_mcu_AC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) +decode_mcu_AC_refine (j_decompress_ptr cinfo, JBLOCKARRAY MCU_data) { arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy; JBLOCKROW block; @@ -509,7 +509,7 @@ decode_mcu_AC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) */ METHODDEF(boolean) -decode_mcu (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) +decode_mcu (j_decompress_ptr cinfo, JBLOCKARRAY MCU_data) { arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy; jpeg_component_info * compptr; diff --git a/vendor/jpeg-9d/jdatadst.c b/vendor/jpeg-9e/jdatadst.c similarity index 100% rename from vendor/jpeg-9d/jdatadst.c rename to vendor/jpeg-9e/jdatadst.c diff --git a/vendor/jpeg-9d/jdatasrc.c b/vendor/jpeg-9e/jdatasrc.c similarity index 100% rename from vendor/jpeg-9d/jdatasrc.c rename to vendor/jpeg-9e/jdatasrc.c diff --git a/vendor/jpeg-9d/jdcoefct.c b/vendor/jpeg-9e/jdcoefct.c similarity index 91% rename from vendor/jpeg-9d/jdcoefct.c rename to vendor/jpeg-9e/jdcoefct.c index ed02fc378f..79ba420140 100644 --- a/vendor/jpeg-9d/jdcoefct.c +++ b/vendor/jpeg-9e/jdcoefct.c @@ -2,7 +2,7 @@ * jdcoefct.c * * Copyright (C) 1994-1997, Thomas G. Lane. - * Modified 2002-2011 by Guido Vollbeding. + * Modified 2002-2020 by Guido Vollbeding. * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * @@ -19,11 +19,13 @@ #include "jinclude.h" #include "jpeglib.h" + /* Block smoothing is only applicable for progressive JPEG, so: */ #ifndef D_PROGRESSIVE_SUPPORTED #undef BLOCK_SMOOTHING_SUPPORTED #endif + /* Private buffer controller object */ typedef struct { @@ -38,11 +40,8 @@ typedef struct { /* The output side's location is represented by cinfo->output_iMCU_row. */ /* In single-pass modes, it's sufficient to buffer just one MCU. - * We allocate a workspace of D_MAX_BLOCKS_IN_MCU coefficient blocks, + * We append a workspace of D_MAX_BLOCKS_IN_MCU coefficient blocks, * and let the entropy decoder write into that workspace each time. - * (On 80x86, the workspace is FAR even though it's not really very big; - * this is to keep the module interfaces unchanged when a large coefficient - * buffer is necessary.) * In multi-pass modes, this array points to the current MCU's blocks * within the virtual arrays; it is used only by the input side. */ @@ -58,10 +57,14 @@ typedef struct { int * coef_bits_latch; #define SAVED_COEFS 6 /* we save coef_bits[0..5] */ #endif + + /* Workspace for single-pass modes (omitted otherwise). */ + JBLOCK blk_buffer[D_MAX_BLOCKS_IN_MCU]; } my_coef_controller; typedef my_coef_controller * my_coef_ptr; + /* Forward declarations */ METHODDEF(int) decompress_onepass JPP((j_decompress_ptr cinfo, JSAMPIMAGE output_buf)); @@ -151,7 +154,8 @@ decompress_onepass (j_decompress_ptr cinfo, JSAMPIMAGE output_buf) JDIMENSION MCU_col_num; /* index of current MCU within row */ JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1; JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1; - int blkn, ci, xindex, yindex, yoffset, useful_width; + int ci, xindex, yindex, yoffset, useful_width; + JBLOCKROW blkp; JSAMPARRAY output_ptr; JDIMENSION start_col, output_col; jpeg_component_info *compptr; @@ -162,10 +166,10 @@ decompress_onepass (j_decompress_ptr cinfo, JSAMPIMAGE output_buf) yoffset++) { for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col; MCU_col_num++) { + blkp = coef->blk_buffer; /* pointer to current DCT block within MCU */ /* Try to fetch an MCU. Entropy decoder expects buffer to be zeroed. */ if (cinfo->lim_Se) /* can bypass in DC only case */ - FMEMZERO((void FAR *) coef->MCU_buffer[0], - (size_t) (cinfo->blocks_in_MCU * SIZEOF(JBLOCK))); + MEMZERO(blkp, cinfo->blocks_in_MCU * SIZEOF(JBLOCK)); if (! (*cinfo->entropy->decode_mcu) (cinfo, coef->MCU_buffer)) { /* Suspension forced; update state counters and exit */ coef->MCU_vert_offset = yoffset; @@ -173,37 +177,34 @@ decompress_onepass (j_decompress_ptr cinfo, JSAMPIMAGE output_buf) return JPEG_SUSPENDED; } /* Determine where data should go in output_buf and do the IDCT thing. - * We skip dummy blocks at the right and bottom edges (but blkn gets - * incremented past them!). Note the inner loop relies on having - * allocated the MCU_buffer[] blocks sequentially. + * We skip dummy blocks at the right and bottom edges (but blkp gets + * incremented past them!). */ - blkn = 0; /* index of current DCT block within MCU */ for (ci = 0; ci < cinfo->comps_in_scan; ci++) { compptr = cinfo->cur_comp_info[ci]; /* Don't bother to IDCT an uninteresting component. */ if (! compptr->component_needed) { - blkn += compptr->MCU_blocks; + blkp += compptr->MCU_blocks; continue; } inverse_DCT = cinfo->idct->inverse_DCT[compptr->component_index]; - useful_width = (MCU_col_num < last_MCU_col) ? compptr->MCU_width - : compptr->last_col_width; output_ptr = output_buf[compptr->component_index] + yoffset * compptr->DCT_v_scaled_size; + useful_width = (MCU_col_num < last_MCU_col) ? compptr->MCU_width + : compptr->last_col_width; start_col = MCU_col_num * compptr->MCU_sample_width; for (yindex = 0; yindex < compptr->MCU_height; yindex++) { if (cinfo->input_iMCU_row < last_iMCU_row || - yoffset+yindex < compptr->last_row_height) { + yoffset + yindex < compptr->last_row_height) { output_col = start_col; for (xindex = 0; xindex < useful_width; xindex++) { - (*inverse_DCT) (cinfo, compptr, - (JCOEFPTR) coef->MCU_buffer[blkn+xindex], + (*inverse_DCT) (cinfo, compptr, (JCOEFPTR) (blkp + xindex), output_ptr, output_col); output_col += compptr->DCT_h_scaled_size; } + output_ptr += compptr->DCT_v_scaled_size; } - blkn += compptr->MCU_width; - output_ptr += compptr->DCT_v_scaled_size; + blkp += compptr->MCU_width; } } } @@ -212,7 +213,7 @@ decompress_onepass (j_decompress_ptr cinfo, JSAMPIMAGE output_buf) } /* Completed the iMCU row, advance counters for next one */ cinfo->output_iMCU_row++; - if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) { + if (++(cinfo->input_iMCU_row) <= last_iMCU_row) { start_iMCU_row(cinfo); return JPEG_ROW_COMPLETED; } @@ -247,8 +248,9 @@ consume_data (j_decompress_ptr cinfo) { my_coef_ptr coef = (my_coef_ptr) cinfo->coef; JDIMENSION MCU_col_num; /* index of current MCU within row */ - int blkn, ci, xindex, yindex, yoffset; + int ci, xindex, yindex, yoffset; JDIMENSION start_col; + JBLOCKARRAY blkp; JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN]; JBLOCKROW buffer_ptr; jpeg_component_info *compptr; @@ -272,15 +274,16 @@ consume_data (j_decompress_ptr cinfo) for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row; MCU_col_num++) { /* Construct list of pointers to DCT blocks belonging to this MCU */ - blkn = 0; /* index of current DCT block within MCU */ + blkp = coef->MCU_buffer; /* pointer to current DCT block within MCU */ for (ci = 0; ci < cinfo->comps_in_scan; ci++) { compptr = cinfo->cur_comp_info[ci]; start_col = MCU_col_num * compptr->MCU_width; for (yindex = 0; yindex < compptr->MCU_height; yindex++) { - buffer_ptr = buffer[ci][yindex+yoffset] + start_col; - for (xindex = 0; xindex < compptr->MCU_width; xindex++) { - coef->MCU_buffer[blkn++] = buffer_ptr++; - } + buffer_ptr = buffer[ci][yoffset + yindex] + start_col; + xindex = compptr->MCU_width; + do { + *blkp++ = buffer_ptr++; + } while (--xindex); } } /* Try to fetch the MCU. */ @@ -370,7 +373,7 @@ decompress_data (j_decompress_ptr cinfo, JSAMPIMAGE output_buf) } } - if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows) + if (++(cinfo->output_iMCU_row) <= last_iMCU_row) return JPEG_ROW_COMPLETED; return JPEG_SCAN_COMPLETED; } @@ -419,10 +422,9 @@ smoothing_ok (j_decompress_ptr cinfo) /* Allocate latch area if not already done */ if (coef->coef_bits_latch == NULL) - coef->coef_bits_latch = (int *) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - cinfo->num_components * - (SAVED_COEFS * SIZEOF(int))); + coef->coef_bits_latch = (int *) (*cinfo->mem->alloc_small) + ((j_common_ptr) cinfo, JPOOL_IMAGE, + cinfo->num_components * (SAVED_COEFS * SIZEOF(int))); coef_bits_latch = coef->coef_bits_latch; for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; @@ -662,7 +664,7 @@ decompress_smooth_data (j_decompress_ptr cinfo, JSAMPIMAGE output_buf) } } - if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows) + if (++(cinfo->output_iMCU_row) <= last_iMCU_row) return JPEG_ROW_COMPLETED; return JPEG_SCAN_COMPLETED; } @@ -679,17 +681,6 @@ jinit_d_coef_controller (j_decompress_ptr cinfo, boolean need_full_buffer) { my_coef_ptr coef; - coef = (my_coef_ptr) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - SIZEOF(my_coef_controller)); - cinfo->coef = (struct jpeg_d_coef_controller *) coef; - coef->pub.start_input_pass = start_input_pass; - coef->pub.start_output_pass = start_output_pass; -#ifdef BLOCK_SMOOTHING_SUPPORTED - coef->coef_bits_latch = NULL; -#endif - - /* Create the coefficient buffer. */ if (need_full_buffer) { #ifdef D_MULTISCAN_FILES_SUPPORTED /* Allocate a full-image virtual array for each component, */ @@ -698,6 +689,9 @@ jinit_d_coef_controller (j_decompress_ptr cinfo, boolean need_full_buffer) int ci, access_rows; jpeg_component_info *compptr; + coef = (my_coef_ptr) (*cinfo->mem->alloc_small) + ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(my_coef_controller) - SIZEOF(coef->blk_buffer)); for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; ci++, compptr++) { access_rows = compptr->v_samp_factor; @@ -722,20 +716,29 @@ jinit_d_coef_controller (j_decompress_ptr cinfo, boolean need_full_buffer) #endif } else { /* We only need a single-MCU buffer. */ - JBLOCKROW buffer; - int i; - - buffer = (JBLOCKROW) - (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE, - D_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK)); - for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) { - coef->MCU_buffer[i] = buffer + i; - } + JBLOCKARRAY blkp; + JBLOCKROW buffer_ptr; + int bi; + + coef = (my_coef_ptr) (*cinfo->mem->alloc_small) + ((j_common_ptr) cinfo, JPOOL_IMAGE, SIZEOF(my_coef_controller)); + buffer_ptr = coef->blk_buffer; if (cinfo->lim_Se == 0) /* DC only case: want to bypass later */ - FMEMZERO((void FAR *) buffer, - (size_t) (D_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK))); + MEMZERO(buffer_ptr, SIZEOF(coef->blk_buffer)); + blkp = coef->MCU_buffer; + bi = D_MAX_BLOCKS_IN_MCU; + do { + *blkp++ = buffer_ptr++; + } while (--bi); coef->pub.consume_data = dummy_consume_data; coef->pub.decompress_data = decompress_onepass; coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */ } + + coef->pub.start_input_pass = start_input_pass; + coef->pub.start_output_pass = start_output_pass; +#ifdef BLOCK_SMOOTHING_SUPPORTED + coef->coef_bits_latch = NULL; +#endif + cinfo->coef = &coef->pub; } diff --git a/vendor/jpeg-9d/jdcolor.c b/vendor/jpeg-9e/jdcolor.c similarity index 88% rename from vendor/jpeg-9d/jdcolor.c rename to vendor/jpeg-9e/jdcolor.c index 3746c2e973..7750df125a 100644 --- a/vendor/jpeg-9d/jdcolor.c +++ b/vendor/jpeg-9e/jdcolor.c @@ -2,7 +2,7 @@ * jdcolor.c * * Copyright (C) 1991-1997, Thomas G. Lane. - * Modified 2011-2019 by Guido Vollbeding. + * Modified 2011-2020 by Guido Vollbeding. * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * @@ -420,7 +420,7 @@ rgb_convert (j_decompress_ptr cinfo, /* * Color conversion for no colorspace change: just copy the data, * converting from separate-planes to interleaved representation. - * We assume out_color_components == num_components. + * Note: Omit uninteresting components in output buffer. */ METHODDEF(void) @@ -431,22 +431,27 @@ null_convert (j_decompress_ptr cinfo, register JSAMPROW outptr; register JSAMPROW inptr; register JDIMENSION count; - register int num_comps = cinfo->num_components; + register int out_comps = cinfo->out_color_components; JDIMENSION num_cols = cinfo->output_width; + JSAMPROW startptr; int ci; + jpeg_component_info *compptr; while (--num_rows >= 0) { /* It seems fastest to make a separate pass for each component. */ - for (ci = 0; ci < num_comps; ci++) { + startptr = *output_buf++; + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + if (! compptr->component_needed) + continue; /* skip uninteresting component */ inptr = input_buf[ci][input_row]; - outptr = output_buf[0] + ci; + outptr = startptr++; for (count = num_cols; count > 0; count--) { *outptr = *inptr++; /* don't need GETJSAMPLE() here */ - outptr += num_comps; + outptr += out_comps; } } input_row++; - output_buf++; } } @@ -462,7 +467,7 @@ grayscale_convert (j_decompress_ptr cinfo, JSAMPIMAGE input_buf, JDIMENSION input_row, JSAMPARRAY output_buf, int num_rows) { - jcopy_sample_rows(input_buf[0], (int) input_row, output_buf, 0, + jcopy_sample_rows(input_buf[0] + input_row, output_buf, num_rows, cinfo->output_width); } @@ -549,6 +554,47 @@ ycck_cmyk_convert (j_decompress_ptr cinfo, } +/* + * Convert CMYK to YK part of YCCK for colorless output. + * We assume build_rgb_y_table has been called. + */ + +METHODDEF(void) +cmyk_yk_convert (j_decompress_ptr cinfo, + JSAMPIMAGE input_buf, JDIMENSION input_row, + JSAMPARRAY output_buf, int num_rows) +{ + my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert; + register int r, g, b; + register INT32 * ctab = cconvert->rgb_y_tab; + register JSAMPROW outptr; + register JSAMPROW inptr0, inptr1, inptr2, inptr3; + register JDIMENSION col; + JDIMENSION num_cols = cinfo->output_width; + + while (--num_rows >= 0) { + inptr0 = input_buf[0][input_row]; + inptr1 = input_buf[1][input_row]; + inptr2 = input_buf[2][input_row]; + inptr3 = input_buf[3][input_row]; + input_row++; + outptr = *output_buf++; + for (col = 0; col < num_cols; col++) { + r = MAXJSAMPLE - GETJSAMPLE(inptr0[col]); + g = MAXJSAMPLE - GETJSAMPLE(inptr1[col]); + b = MAXJSAMPLE - GETJSAMPLE(inptr2[col]); + /* Y */ + outptr[0] = (JSAMPLE) + ((ctab[r+R_Y_OFF] + ctab[g+G_Y_OFF] + ctab[b+B_Y_OFF]) + >> SCALEBITS); + /* K passes through unchanged */ + outptr[1] = inptr3[col]; /* don't need GETJSAMPLE here */ + outptr += 2; + } + } +} + + /* * Empty method for start_pass. */ @@ -568,7 +614,7 @@ GLOBAL(void) jinit_color_deconverter (j_decompress_ptr cinfo) { my_cconvert_ptr cconvert; - int ci; + int ci, i; cconvert = (my_cconvert_ptr) (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, SIZEOF(my_color_deconverter)); @@ -608,7 +654,7 @@ jinit_color_deconverter (j_decompress_ptr cinfo) ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL); /* Set out_color_components and conversion method based on requested space. - * Also clear the component_needed flags for any unused components, + * Also adjust the component_needed flags for any unused components, * so that earlier pipeline stages can avoid useless computation. */ @@ -674,9 +720,9 @@ jinit_color_deconverter (j_decompress_ptr cinfo) break; case JCS_BG_RGB: - cinfo->out_color_components = RGB_PIXELSIZE; if (cinfo->jpeg_color_space != JCS_BG_RGB) ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL); + cinfo->out_color_components = RGB_PIXELSIZE; switch (cinfo->color_transform) { case JCT_NONE: cconvert->pub.color_convert = rgb_convert; @@ -690,25 +736,38 @@ jinit_color_deconverter (j_decompress_ptr cinfo) break; case JCS_CMYK: + if (cinfo->jpeg_color_space != JCS_YCCK) + goto def_label; cinfo->out_color_components = 4; - switch (cinfo->jpeg_color_space) { - case JCS_YCCK: - cconvert->pub.color_convert = ycck_cmyk_convert; - build_ycc_rgb_table(cinfo); - break; - case JCS_CMYK: - cconvert->pub.color_convert = null_convert; - break; - default: - ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL); - } + cconvert->pub.color_convert = ycck_cmyk_convert; + build_ycc_rgb_table(cinfo); + break; + + case JCS_YCCK: + if (cinfo->jpeg_color_space != JCS_CMYK || + /* Support only YK part of YCCK for colorless output */ + ! cinfo->comp_info[0].component_needed || + cinfo->comp_info[1].component_needed || + cinfo->comp_info[2].component_needed || + ! cinfo->comp_info[3].component_needed) + goto def_label; + cinfo->out_color_components = 2; + /* Need all components on input side */ + cinfo->comp_info[1].component_needed = TRUE; + cinfo->comp_info[2].component_needed = TRUE; + cconvert->pub.color_convert = cmyk_yk_convert; + build_rgb_y_table(cinfo); break; - default: /* permit null conversion to same output space */ + default: def_label: /* permit null conversion to same output space */ if (cinfo->out_color_space != cinfo->jpeg_color_space) /* unsupported non-null conversion */ ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL); - cinfo->out_color_components = cinfo->num_components; + i = 0; + for (ci = 0; ci < cinfo->num_components; ci++) + if (cinfo->comp_info[ci].component_needed) + i++; /* count output color components */ + cinfo->out_color_components = i; cconvert->pub.color_convert = null_convert; } diff --git a/vendor/jpeg-9d/jdct.h b/vendor/jpeg-9e/jdct.h similarity index 100% rename from vendor/jpeg-9d/jdct.h rename to vendor/jpeg-9e/jdct.h diff --git a/vendor/jpeg-9d/jddctmgr.c b/vendor/jpeg-9e/jddctmgr.c similarity index 100% rename from vendor/jpeg-9d/jddctmgr.c rename to vendor/jpeg-9e/jddctmgr.c diff --git a/vendor/jpeg-9d/jdhuff.c b/vendor/jpeg-9e/jdhuff.c similarity index 99% rename from vendor/jpeg-9d/jdhuff.c rename to vendor/jpeg-9e/jdhuff.c index aea06f6039..f175f0c323 100644 --- a/vendor/jpeg-9d/jdhuff.c +++ b/vendor/jpeg-9e/jdhuff.c @@ -2,7 +2,7 @@ * jdhuff.c * * Copyright (C) 1991-1997, Thomas G. Lane. - * Modified 2006-2019 by Guido Vollbeding. + * Modified 2006-2020 by Guido Vollbeding. * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * @@ -704,7 +704,7 @@ process_restart (j_decompress_ptr cinfo) */ METHODDEF(boolean) -decode_mcu_DC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) +decode_mcu_DC_first (j_decompress_ptr cinfo, JBLOCKARRAY MCU_data) { huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; int Al = cinfo->Al; @@ -776,7 +776,7 @@ decode_mcu_DC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) */ METHODDEF(boolean) -decode_mcu_AC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) +decode_mcu_AC_first (j_decompress_ptr cinfo, JBLOCKARRAY MCU_data) { huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; register int s, k, r; @@ -864,7 +864,7 @@ decode_mcu_AC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) */ METHODDEF(boolean) -decode_mcu_DC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) +decode_mcu_DC_refine (j_decompress_ptr cinfo, JBLOCKARRAY MCU_data) { huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; JCOEF p1; @@ -913,7 +913,7 @@ decode_mcu_DC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) */ METHODDEF(boolean) -decode_mcu_AC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) +decode_mcu_AC_refine (j_decompress_ptr cinfo, JBLOCKARRAY MCU_data) { huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; register int s, k, r; @@ -1072,7 +1072,7 @@ decode_mcu_AC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) */ METHODDEF(boolean) -decode_mcu_sub (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) +decode_mcu_sub (j_decompress_ptr cinfo, JBLOCKARRAY MCU_data) { huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; const int * natural_order; @@ -1201,7 +1201,7 @@ decode_mcu_sub (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) */ METHODDEF(boolean) -decode_mcu (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) +decode_mcu (j_decompress_ptr cinfo, JBLOCKARRAY MCU_data) { huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; int blkn; diff --git a/vendor/jpeg-9d/jdinput.c b/vendor/jpeg-9e/jdinput.c similarity index 97% rename from vendor/jpeg-9d/jdinput.c rename to vendor/jpeg-9e/jdinput.c index 0199553e89..29fbef90bf 100644 --- a/vendor/jpeg-9d/jdinput.c +++ b/vendor/jpeg-9e/jdinput.c @@ -2,7 +2,7 @@ * jdinput.c * * Copyright (C) 1991-1997, Thomas G. Lane. - * Modified 2002-2013 by Guido Vollbeding. + * Modified 2002-2020 by Guido Vollbeding. * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * @@ -330,7 +330,6 @@ initial_setup (j_decompress_ptr cinfo) default: ERREXIT4(cinfo, JERR_BAD_PROGRESSION, cinfo->Ss, cinfo->Se, cinfo->Ah, cinfo->Al); - break; } /* We initialize DCT_scaled_size and min_DCT_scaled_size to block_size. @@ -391,16 +390,16 @@ per_scan_setup (j_decompress_ptr cinfo) { int ci, mcublks, tmp; jpeg_component_info *compptr; - + if (cinfo->comps_in_scan == 1) { - + /* Noninterleaved (single-component) scan */ compptr = cinfo->cur_comp_info[0]; - + /* Overall image size in MCUs */ cinfo->MCUs_per_row = compptr->width_in_blocks; cinfo->MCU_rows_in_scan = compptr->height_in_blocks; - + /* For noninterleaved scan, always one block per MCU */ compptr->MCU_width = 1; compptr->MCU_height = 1; @@ -413,28 +412,26 @@ per_scan_setup (j_decompress_ptr cinfo) tmp = (int) (compptr->height_in_blocks % compptr->v_samp_factor); if (tmp == 0) tmp = compptr->v_samp_factor; compptr->last_row_height = tmp; - + /* Prepare array describing MCU composition */ cinfo->blocks_in_MCU = 1; cinfo->MCU_membership[0] = 0; - + } else { - + /* Interleaved (multi-component) scan */ if (cinfo->comps_in_scan <= 0 || cinfo->comps_in_scan > MAX_COMPS_IN_SCAN) ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->comps_in_scan, MAX_COMPS_IN_SCAN); - + /* Overall image size in MCUs */ cinfo->MCUs_per_row = (JDIMENSION) jdiv_round_up((long) cinfo->image_width, (long) (cinfo->max_h_samp_factor * cinfo->block_size)); - cinfo->MCU_rows_in_scan = (JDIMENSION) - jdiv_round_up((long) cinfo->image_height, - (long) (cinfo->max_v_samp_factor * cinfo->block_size)); - + cinfo->MCU_rows_in_scan = cinfo->total_iMCU_rows; + cinfo->blocks_in_MCU = 0; - + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { compptr = cinfo->cur_comp_info[ci]; /* Sampling factors give # of blocks of component in each MCU */ @@ -457,7 +454,7 @@ per_scan_setup (j_decompress_ptr cinfo) cinfo->MCU_membership[cinfo->blocks_in_MCU++] = ci; } } - + } } @@ -501,9 +498,8 @@ latch_quant_tables (j_decompress_ptr cinfo) cinfo->quant_tbl_ptrs[qtblno] == NULL) ERREXIT1(cinfo, JERR_NO_QUANT_TABLE, qtblno); /* OK, save away the quantization table */ - qtbl = (JQUANT_TBL *) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - SIZEOF(JQUANT_TBL)); + qtbl = (JQUANT_TBL *) (*cinfo->mem->alloc_small) + ((j_common_ptr) cinfo, JPOOL_IMAGE, SIZEOF(JQUANT_TBL)); MEMCOPY(qtbl, cinfo->quant_tbl_ptrs[qtblno], SIZEOF(JQUANT_TBL)); compptr->quant_table = qtbl; } @@ -644,9 +640,8 @@ jinit_input_controller (j_decompress_ptr cinfo) my_inputctl_ptr inputctl; /* Create subobject in permanent pool */ - inputctl = (my_inputctl_ptr) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT, - SIZEOF(my_input_controller)); + inputctl = (my_inputctl_ptr) (*cinfo->mem->alloc_small) + ((j_common_ptr) cinfo, JPOOL_PERMANENT, SIZEOF(my_input_controller)); cinfo->inputctl = &inputctl->pub; /* Initialize method pointers */ inputctl->pub.consume_input = consume_markers; diff --git a/vendor/jpeg-9d/jdmainct.c b/vendor/jpeg-9e/jdmainct.c similarity index 93% rename from vendor/jpeg-9d/jdmainct.c rename to vendor/jpeg-9e/jdmainct.c index 4d738fbaed..1cd66d853b 100644 --- a/vendor/jpeg-9d/jdmainct.c +++ b/vendor/jpeg-9e/jdmainct.c @@ -2,7 +2,7 @@ * jdmainct.c * * Copyright (C) 1994-1996, Thomas G. Lane. - * Modified 2002-2016 by Guido Vollbeding. + * Modified 2002-2020 by Guido Vollbeding. * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * @@ -170,21 +170,22 @@ alloc_funny_pointers (j_decompress_ptr cinfo) /* Get top-level space for component array pointers. * We alloc both arrays with one call to save a few cycles. */ - mainp->xbuffer[0] = (JSAMPIMAGE) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - cinfo->num_components * 2 * SIZEOF(JSAMPARRAY)); + mainp->xbuffer[0] = (JSAMPIMAGE) (*cinfo->mem->alloc_small) + ((j_common_ptr) cinfo, JPOOL_IMAGE, + cinfo->num_components * 2 * SIZEOF(JSAMPARRAY)); mainp->xbuffer[1] = mainp->xbuffer[0] + cinfo->num_components; for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; ci++, compptr++) { + if (! compptr->component_needed) + continue; /* skip uninteresting component */ rgroup = (compptr->v_samp_factor * compptr->DCT_v_scaled_size) / cinfo->min_DCT_v_scaled_size; /* height of a row group of component */ /* Get space for pointer lists --- M+4 row groups in each list. * We alloc both pointer lists with one call to save a few cycles. */ - xbuf = (JSAMPARRAY) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - 2 * (rgroup * (M + 4)) * SIZEOF(JSAMPROW)); + xbuf = (JSAMPARRAY) (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, + JPOOL_IMAGE, 2 * (rgroup * (M + 4)) * SIZEOF(JSAMPROW)); xbuf += rgroup; /* want one row group at negative offsets */ mainp->xbuffer[0][ci] = xbuf; xbuf += rgroup * (M + 4); @@ -210,6 +211,8 @@ make_funny_pointers (j_decompress_ptr cinfo) for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; ci++, compptr++) { + if (! compptr->component_needed) + continue; /* skip uninteresting component */ rgroup = (compptr->v_samp_factor * compptr->DCT_v_scaled_size) / cinfo->min_DCT_v_scaled_size; /* height of a row group of component */ xbuf0 = mainp->xbuffer[0][ci]; @@ -250,6 +253,8 @@ set_wraparound_pointers (j_decompress_ptr cinfo) for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; ci++, compptr++) { + if (! compptr->component_needed) + continue; /* skip uninteresting component */ rgroup = (compptr->v_samp_factor * compptr->DCT_v_scaled_size) / cinfo->min_DCT_v_scaled_size; /* height of a row group of component */ xbuf0 = mainp->xbuffer[0][ci]; @@ -278,6 +283,8 @@ set_bottom_pointers (j_decompress_ptr cinfo) for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; ci++, compptr++) { + if (! compptr->component_needed) + continue; /* skip uninteresting component */ /* Count sample rows in one iMCU row and in one row group */ iMCUheight = compptr->v_samp_factor * compptr->DCT_v_scaled_size; rgroup = iMCUheight / cinfo->min_DCT_v_scaled_size; @@ -333,7 +340,6 @@ start_pass_main (j_decompress_ptr cinfo, J_BUF_MODE pass_mode) #endif default: ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); - break; } } @@ -344,9 +350,8 @@ start_pass_main (j_decompress_ptr cinfo, J_BUF_MODE pass_mode) */ METHODDEF(void) -process_data_simple_main (j_decompress_ptr cinfo, - JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, - JDIMENSION out_rows_avail) +process_data_simple_main (j_decompress_ptr cinfo, JSAMPARRAY output_buf, + JDIMENSION *out_row_ctr, JDIMENSION out_rows_avail) { my_main_ptr mainp = (my_main_ptr) cinfo->main; @@ -375,9 +380,8 @@ process_data_simple_main (j_decompress_ptr cinfo, */ METHODDEF(void) -process_data_context_main (j_decompress_ptr cinfo, - JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, - JDIMENSION out_rows_avail) +process_data_context_main (j_decompress_ptr cinfo, JSAMPARRAY output_buf, + JDIMENSION *out_row_ctr, JDIMENSION out_rows_avail) { my_main_ptr mainp = (my_main_ptr) cinfo->main; @@ -449,13 +453,12 @@ process_data_context_main (j_decompress_ptr cinfo, #ifdef QUANT_2PASS_SUPPORTED METHODDEF(void) -process_data_crank_post (j_decompress_ptr cinfo, - JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, - JDIMENSION out_rows_avail) +process_data_crank_post (j_decompress_ptr cinfo, JSAMPARRAY output_buf, + JDIMENSION *out_row_ctr, JDIMENSION out_rows_avail) { (*cinfo->post->post_process_data) (cinfo, (JSAMPIMAGE) NULL, - (JDIMENSION *) NULL, (JDIMENSION) 0, - output_buf, out_row_ctr, out_rows_avail); + (JDIMENSION *) NULL, (JDIMENSION) 0, + output_buf, out_row_ctr, out_rows_avail); } #endif /* QUANT_2PASS_SUPPORTED */ @@ -472,9 +475,8 @@ jinit_d_main_controller (j_decompress_ptr cinfo, boolean need_full_buffer) int ci, rgroup, ngroups; jpeg_component_info *compptr; - mainp = (my_main_ptr) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - SIZEOF(my_main_controller)); + mainp = (my_main_ptr) (*cinfo->mem->alloc_small) + ((j_common_ptr) cinfo, JPOOL_IMAGE, SIZEOF(my_main_controller)); cinfo->main = &mainp->pub; mainp->pub.start_pass = start_pass_main; @@ -497,6 +499,8 @@ jinit_d_main_controller (j_decompress_ptr cinfo, boolean need_full_buffer) for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; ci++, compptr++) { + if (! compptr->component_needed) + continue; /* skip uninteresting component */ rgroup = (compptr->v_samp_factor * compptr->DCT_v_scaled_size) / cinfo->min_DCT_v_scaled_size; /* height of a row group of component */ mainp->buffer[ci] = (*cinfo->mem->alloc_sarray) diff --git a/vendor/jpeg-9d/jdmarker.c b/vendor/jpeg-9e/jdmarker.c similarity index 100% rename from vendor/jpeg-9d/jdmarker.c rename to vendor/jpeg-9e/jdmarker.c diff --git a/vendor/jpeg-9d/jdmaster.c b/vendor/jpeg-9e/jdmaster.c similarity index 97% rename from vendor/jpeg-9d/jdmaster.c rename to vendor/jpeg-9e/jdmaster.c index c309f7629f..3070b7bb41 100644 --- a/vendor/jpeg-9d/jdmaster.c +++ b/vendor/jpeg-9e/jdmaster.c @@ -2,7 +2,7 @@ * jdmaster.c * * Copyright (C) 1991-1997, Thomas G. Lane. - * Modified 2002-2019 by Guido Vollbeding. + * Modified 2002-2020 by Guido Vollbeding. * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * @@ -103,10 +103,8 @@ jpeg_calc_output_dimensions (j_decompress_ptr cinfo) * This function is used for full decompression. */ { -#ifdef IDCT_SCALING_SUPPORTED - int ci, ssize; + int ci, i; jpeg_component_info *compptr; -#endif /* Prevent application from calling me at wrong times */ if (cinfo->global_state != DSTATE_READY) @@ -124,7 +122,7 @@ jpeg_calc_output_dimensions (j_decompress_ptr cinfo) */ for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; ci++, compptr++) { - ssize = 1; + int ssize = 1; if (! cinfo->raw_data_out) while (cinfo->min_DCT_h_scaled_size * ssize <= (cinfo->do_fancy_upsampling ? DCTSIZE : DCTSIZE / 2) && @@ -166,27 +164,22 @@ jpeg_calc_output_dimensions (j_decompress_ptr cinfo) #endif /* IDCT_SCALING_SUPPORTED */ /* Report number of components in selected colorspace. */ - /* Probably this should be in the color conversion module... */ + /* This should correspond to the actual code in the color conversion module. */ switch (cinfo->out_color_space) { case JCS_GRAYSCALE: cinfo->out_color_components = 1; break; case JCS_RGB: case JCS_BG_RGB: -#if RGB_PIXELSIZE != 3 cinfo->out_color_components = RGB_PIXELSIZE; break; -#endif /* else share code with YCbCr */ - case JCS_YCbCr: - case JCS_BG_YCC: - cinfo->out_color_components = 3; - break; - case JCS_CMYK: - case JCS_YCCK: - cinfo->out_color_components = 4; - break; - default: /* else must be same colorspace as in file */ - cinfo->out_color_components = cinfo->num_components; + default: /* YCCK <=> CMYK conversion or same colorspace as in file */ + i = 0; + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) + if (compptr->component_needed) + i++; /* count output color components */ + cinfo->out_color_components = i; } cinfo->output_components = (cinfo->quantize_colors ? 1 : cinfo->out_color_components); diff --git a/vendor/jpeg-9d/jdmerge.c b/vendor/jpeg-9e/jdmerge.c similarity index 99% rename from vendor/jpeg-9d/jdmerge.c rename to vendor/jpeg-9e/jdmerge.c index 8b5c899cce..8ff13143af 100644 --- a/vendor/jpeg-9d/jdmerge.c +++ b/vendor/jpeg-9e/jdmerge.c @@ -2,7 +2,7 @@ * jdmerge.c * * Copyright (C) 1994-1996, Thomas G. Lane. - * Modified 2013-2019 by Guido Vollbeding. + * Modified 2013-2020 by Guido Vollbeding. * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * @@ -190,7 +190,7 @@ merged_2v_upsample (j_decompress_ptr cinfo, if (upsample->spare_full) { /* If we have a spare row saved from a previous cycle, just return it. */ - jcopy_sample_rows(& upsample->spare_row, 0, output_buf + *out_row_ctr, 0, + jcopy_sample_rows(& upsample->spare_row, output_buf + *out_row_ctr, 1, upsample->out_row_width); num_rows = 1; upsample->spare_full = FALSE; diff --git a/vendor/jpeg-9d/jdpostct.c b/vendor/jpeg-9e/jdpostct.c similarity index 100% rename from vendor/jpeg-9d/jdpostct.c rename to vendor/jpeg-9e/jdpostct.c diff --git a/vendor/jpeg-9d/jdsample.c b/vendor/jpeg-9e/jdsample.c similarity index 86% rename from vendor/jpeg-9d/jdsample.c rename to vendor/jpeg-9e/jdsample.c index fd9907e20c..15afeafe3d 100644 --- a/vendor/jpeg-9d/jdsample.c +++ b/vendor/jpeg-9e/jdsample.c @@ -2,7 +2,7 @@ * jdsample.c * * Copyright (C) 1991-1996, Thomas G. Lane. - * Modified 2002-2015 by Guido Vollbeding. + * Modified 2002-2020 by Guido Vollbeding. * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * @@ -27,7 +27,7 @@ /* Pointer to routine to upsample a single component */ typedef JMETHOD(void, upsample1_ptr, (j_decompress_ptr cinfo, jpeg_component_info * compptr, - JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr)); + JSAMPARRAY input_data, JSAMPIMAGE output_data_ptr)); /* Private subobject */ @@ -102,6 +102,9 @@ sep_upsample (j_decompress_ptr cinfo, if (upsample->next_row_out >= cinfo->max_v_samp_factor) { for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; ci++, compptr++) { + /* Don't bother to upsample an uninteresting component. */ + if (! compptr->component_needed) + continue; /* Invoke per-component upsample method. Notice we pass a POINTER * to color_buf[ci], so that fullsize_upsample can change it. */ @@ -156,25 +159,12 @@ sep_upsample (j_decompress_ptr cinfo, METHODDEF(void) fullsize_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr, - JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr) + JSAMPARRAY input_data, JSAMPIMAGE output_data_ptr) { *output_data_ptr = input_data; } -/* - * This is a no-op version used for "uninteresting" components. - * These components will not be referenced by color conversion. - */ - -METHODDEF(void) -noop_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr, - JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr) -{ - *output_data_ptr = NULL; /* safety check */ -} - - /* * This version handles any integral sampling ratios. * This is not used for typical JPEG files, so it need not be fast. @@ -188,25 +178,25 @@ noop_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr, METHODDEF(void) int_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr, - JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr) + JSAMPARRAY input_data, JSAMPIMAGE output_data_ptr) { my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; - JSAMPARRAY output_data = *output_data_ptr; + JSAMPARRAY output_data, output_end; register JSAMPROW inptr, outptr; register JSAMPLE invalue; register int h; JSAMPROW outend; int h_expand, v_expand; - int inrow, outrow; h_expand = upsample->h_expand[compptr->component_index]; v_expand = upsample->v_expand[compptr->component_index]; - inrow = outrow = 0; - while (outrow < cinfo->max_v_samp_factor) { + output_data = *output_data_ptr; + output_end = output_data + cinfo->max_v_samp_factor; + for (; output_data < output_end; output_data += v_expand) { /* Generate one output row with proper horizontal expansion */ - inptr = input_data[inrow]; - outptr = output_data[outrow]; + inptr = *input_data++; + outptr = *output_data; outend = outptr + cinfo->output_width; while (outptr < outend) { invalue = *inptr++; /* don't need GETJSAMPLE() here */ @@ -216,11 +206,9 @@ int_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr, } /* Generate any additional output rows by duplicating the first one */ if (v_expand > 1) { - jcopy_sample_rows(output_data, outrow, output_data, outrow+1, - v_expand-1, cinfo->output_width); + jcopy_sample_rows(output_data, output_data + 1, + v_expand - 1, cinfo->output_width); } - inrow++; - outrow += v_expand; } } @@ -232,7 +220,7 @@ int_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr, METHODDEF(void) h2v1_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr, - JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr) + JSAMPARRAY input_data, JSAMPIMAGE output_data_ptr) { JSAMPARRAY output_data = *output_data_ptr; register JSAMPROW inptr, outptr; @@ -260,28 +248,26 @@ h2v1_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr, METHODDEF(void) h2v2_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr, - JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr) + JSAMPARRAY input_data, JSAMPIMAGE output_data_ptr) { - JSAMPARRAY output_data = *output_data_ptr; + JSAMPARRAY output_data, output_end; register JSAMPROW inptr, outptr; register JSAMPLE invalue; JSAMPROW outend; - int inrow, outrow; - inrow = outrow = 0; - while (outrow < cinfo->max_v_samp_factor) { - inptr = input_data[inrow]; - outptr = output_data[outrow]; + output_data = *output_data_ptr; + output_end = output_data + cinfo->max_v_samp_factor; + for (; output_data < output_end; output_data += 2) { + inptr = *input_data++; + outptr = *output_data; outend = outptr + cinfo->output_width; while (outptr < outend) { invalue = *inptr++; /* don't need GETJSAMPLE() here */ *outptr++ = invalue; *outptr++ = invalue; } - jcopy_sample_rows(output_data, outrow, output_data, outrow+1, + jcopy_sample_rows(output_data, output_data + 1, 1, cinfo->output_width); - inrow++; - outrow += 2; } } @@ -298,9 +284,8 @@ jinit_upsampler (j_decompress_ptr cinfo) jpeg_component_info * compptr; int h_in_group, v_in_group, h_out_group, v_out_group; - upsample = (my_upsample_ptr) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - SIZEOF(my_upsampler)); + upsample = (my_upsample_ptr) (*cinfo->mem->alloc_small) + ((j_common_ptr) cinfo, JPOOL_IMAGE, SIZEOF(my_upsampler)); cinfo->upsample = &upsample->pub; upsample->pub.start_pass = start_pass_upsample; upsample->pub.upsample = sep_upsample; @@ -314,6 +299,9 @@ jinit_upsampler (j_decompress_ptr cinfo) */ for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; ci++, compptr++) { + /* Don't bother to upsample an uninteresting component. */ + if (! compptr->component_needed) + continue; /* Compute size of an "input group" after IDCT scaling. This many samples * are to be converted to max_h_samp_factor * max_v_samp_factor pixels. */ @@ -324,11 +312,6 @@ jinit_upsampler (j_decompress_ptr cinfo) h_out_group = cinfo->max_h_samp_factor; v_out_group = cinfo->max_v_samp_factor; upsample->rowgroup_height[ci] = v_in_group; /* save for use later */ - if (! compptr->component_needed) { - /* Don't bother to upsample an uninteresting component. */ - upsample->methods[ci] = noop_upsample; - continue; /* don't need to allocate buffer */ - } if (h_in_group == h_out_group && v_in_group == v_out_group) { /* Fullsize components can be processed without any work. */ upsample->methods[ci] = fullsize_upsample; diff --git a/vendor/jpeg-9d/jdtrans.c b/vendor/jpeg-9e/jdtrans.c similarity index 100% rename from vendor/jpeg-9d/jdtrans.c rename to vendor/jpeg-9e/jdtrans.c diff --git a/vendor/jpeg-9d/jerror.c b/vendor/jpeg-9e/jerror.c similarity index 100% rename from vendor/jpeg-9d/jerror.c rename to vendor/jpeg-9e/jerror.c diff --git a/vendor/jpeg-9d/jerror.h b/vendor/jpeg-9e/jerror.h similarity index 100% rename from vendor/jpeg-9d/jerror.h rename to vendor/jpeg-9e/jerror.h diff --git a/vendor/jpeg-9d/jfdctflt.c b/vendor/jpeg-9e/jfdctflt.c similarity index 100% rename from vendor/jpeg-9d/jfdctflt.c rename to vendor/jpeg-9e/jfdctflt.c diff --git a/vendor/jpeg-9d/jfdctfst.c b/vendor/jpeg-9e/jfdctfst.c similarity index 100% rename from vendor/jpeg-9d/jfdctfst.c rename to vendor/jpeg-9e/jfdctfst.c diff --git a/vendor/jpeg-9d/jfdctint.c b/vendor/jpeg-9e/jfdctint.c similarity index 100% rename from vendor/jpeg-9d/jfdctint.c rename to vendor/jpeg-9e/jfdctint.c diff --git a/vendor/jpeg-9d/jidctflt.c b/vendor/jpeg-9e/jidctflt.c similarity index 100% rename from vendor/jpeg-9d/jidctflt.c rename to vendor/jpeg-9e/jidctflt.c diff --git a/vendor/jpeg-9d/jidctfst.c b/vendor/jpeg-9e/jidctfst.c similarity index 100% rename from vendor/jpeg-9d/jidctfst.c rename to vendor/jpeg-9e/jidctfst.c diff --git a/vendor/jpeg-9d/jidctint.c b/vendor/jpeg-9e/jidctint.c similarity index 100% rename from vendor/jpeg-9d/jidctint.c rename to vendor/jpeg-9e/jidctint.c diff --git a/vendor/jpeg-9d/jinclude.h b/vendor/jpeg-9e/jinclude.h similarity index 100% rename from vendor/jpeg-9d/jinclude.h rename to vendor/jpeg-9e/jinclude.h diff --git a/vendor/jpeg-9d/jmemansi.c b/vendor/jpeg-9e/jmemansi.c similarity index 100% rename from vendor/jpeg-9d/jmemansi.c rename to vendor/jpeg-9e/jmemansi.c diff --git a/vendor/jpeg-9d/jmemdos.c b/vendor/jpeg-9e/jmemdos.c similarity index 100% rename from vendor/jpeg-9d/jmemdos.c rename to vendor/jpeg-9e/jmemdos.c diff --git a/vendor/jpeg-9d/jmemmac.c b/vendor/jpeg-9e/jmemmac.c similarity index 100% rename from vendor/jpeg-9d/jmemmac.c rename to vendor/jpeg-9e/jmemmac.c diff --git a/vendor/jpeg-9d/jmemmgr.c b/vendor/jpeg-9e/jmemmgr.c similarity index 100% rename from vendor/jpeg-9d/jmemmgr.c rename to vendor/jpeg-9e/jmemmgr.c diff --git a/vendor/jpeg-9d/jmemname.c b/vendor/jpeg-9e/jmemname.c similarity index 100% rename from vendor/jpeg-9d/jmemname.c rename to vendor/jpeg-9e/jmemname.c diff --git a/vendor/jpeg-9d/jmemnobs.c b/vendor/jpeg-9e/jmemnobs.c similarity index 100% rename from vendor/jpeg-9d/jmemnobs.c rename to vendor/jpeg-9e/jmemnobs.c diff --git a/vendor/jpeg-9d/jmemsys.h b/vendor/jpeg-9e/jmemsys.h similarity index 100% rename from vendor/jpeg-9d/jmemsys.h rename to vendor/jpeg-9e/jmemsys.h diff --git a/vendor/jpeg-9d/jmorecfg.h b/vendor/jpeg-9e/jmorecfg.h similarity index 100% rename from vendor/jpeg-9d/jmorecfg.h rename to vendor/jpeg-9e/jmorecfg.h diff --git a/vendor/jpeg-9d/jpegint.h b/vendor/jpeg-9e/jpegint.h similarity index 97% rename from vendor/jpeg-9d/jpegint.h rename to vendor/jpeg-9e/jpegint.h index 52c708d4e3..3528bff5b7 100644 --- a/vendor/jpeg-9d/jpegint.h +++ b/vendor/jpeg-9e/jpegint.h @@ -2,7 +2,7 @@ * jpegint.h * * Copyright (C) 1991-1997, Thomas G. Lane. - * Modified 1997-2019 by Guido Vollbeding. + * Modified 1997-2020 by Guido Vollbeding. * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * @@ -103,8 +103,7 @@ struct jpeg_downsampler { typedef JMETHOD(void, forward_DCT_ptr, (j_compress_ptr cinfo, jpeg_component_info * compptr, JSAMPARRAY sample_data, JBLOCKROW coef_blocks, - JDIMENSION start_row, JDIMENSION start_col, - JDIMENSION num_blocks)); + JDIMENSION start_col, JDIMENSION num_blocks)); struct jpeg_forward_dct { JMETHOD(void, start_pass, (j_compress_ptr cinfo)); @@ -115,7 +114,7 @@ struct jpeg_forward_dct { /* Entropy encoding */ struct jpeg_entropy_encoder { JMETHOD(void, start_pass, (j_compress_ptr cinfo, boolean gather_statistics)); - JMETHOD(boolean, encode_mcu, (j_compress_ptr cinfo, JBLOCKROW *MCU_data)); + JMETHOD(boolean, encode_mcu, (j_compress_ptr cinfo, JBLOCKARRAY MCU_data)); JMETHOD(void, finish_pass, (j_compress_ptr cinfo)); }; @@ -211,7 +210,7 @@ struct jpeg_marker_reader { /* Entropy decoding */ struct jpeg_entropy_decoder { JMETHOD(void, start_pass, (j_decompress_ptr cinfo)); - JMETHOD(boolean, decode_mcu, (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)); + JMETHOD(boolean, decode_mcu, (j_decompress_ptr cinfo, JBLOCKARRAY MCU_data)); JMETHOD(void, finish_pass, (j_decompress_ptr cinfo)); }; @@ -416,8 +415,8 @@ EXTERN(void) jinit_memory_mgr JPP((j_common_ptr cinfo)); /* Utility routines in jutils.c */ EXTERN(long) jdiv_round_up JPP((long a, long b)); EXTERN(long) jround_up JPP((long a, long b)); -EXTERN(void) jcopy_sample_rows JPP((JSAMPARRAY input_array, int source_row, - JSAMPARRAY output_array, int dest_row, +EXTERN(void) jcopy_sample_rows JPP((JSAMPARRAY input_array, + JSAMPARRAY output_array, int num_rows, JDIMENSION num_cols)); EXTERN(void) jcopy_block_row JPP((JBLOCKROW input_row, JBLOCKROW output_row, JDIMENSION num_blocks)); diff --git a/vendor/jpeg-9d/jpeglib.h b/vendor/jpeg-9e/jpeglib.h similarity index 99% rename from vendor/jpeg-9d/jpeglib.h rename to vendor/jpeg-9e/jpeglib.h index 591a2cb605..b1fa8ea9ad 100644 --- a/vendor/jpeg-9d/jpeglib.h +++ b/vendor/jpeg-9e/jpeglib.h @@ -2,7 +2,7 @@ * jpeglib.h * * Copyright (C) 1991-1998, Thomas G. Lane. - * Modified 2002-2019 by Guido Vollbeding. + * Modified 2002-2020 by Guido Vollbeding. * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * @@ -39,7 +39,7 @@ extern "C" { #define JPEG_LIB_VERSION 90 /* Compatibility version 9.0 */ #define JPEG_LIB_VERSION_MAJOR 9 -#define JPEG_LIB_VERSION_MINOR 4 +#define JPEG_LIB_VERSION_MINOR 5 /* Various constants determining the sizes of things. diff --git a/vendor/jpeg-9d/jpegtran.c b/vendor/jpeg-9e/jpegtran.c similarity index 100% rename from vendor/jpeg-9d/jpegtran.c rename to vendor/jpeg-9e/jpegtran.c diff --git a/vendor/jpeg-9d/jquant1.c b/vendor/jpeg-9e/jquant1.c similarity index 97% rename from vendor/jpeg-9d/jquant1.c rename to vendor/jpeg-9e/jquant1.c index 9d11f70669..60b1843e73 100644 --- a/vendor/jpeg-9d/jquant1.c +++ b/vendor/jpeg-9e/jquant1.c @@ -2,7 +2,7 @@ * jquant1.c * * Copyright (C) 1991-1996, Thomas G. Lane. - * Modified 2011 by Guido Vollbeding. + * Modified 2011-2020 by Guido Vollbeding. * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * @@ -293,8 +293,7 @@ create_colormap (j_decompress_ptr cinfo) /* The colors are ordered in the map in standard row-major order, */ /* i.e. rightmost (highest-indexed) color changes most rapidly. */ - colormap = (*cinfo->mem->alloc_sarray) - ((j_common_ptr) cinfo, JPOOL_IMAGE, + colormap = (*cinfo->mem->alloc_sarray) ((j_common_ptr) cinfo, JPOOL_IMAGE, (JDIMENSION) total_colors, (JDIMENSION) cinfo->out_color_components); /* blksize is number of adjacent repeated entries for a component */ @@ -400,9 +399,8 @@ make_odither_array (j_decompress_ptr cinfo, int ncolors) int j,k; INT32 num,den; - odither = (ODITHER_MATRIX_PTR) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - SIZEOF(ODITHER_MATRIX)); + odither = (ODITHER_MATRIX_PTR) (*cinfo->mem->alloc_small) + ((j_common_ptr) cinfo, JPOOL_IMAGE, SIZEOF(ODITHER_MATRIX)); /* The inter-value distance for this color is MAXJSAMPLE/(ncolors-1). * Hence the dither value for the matrix cell with fill order f * (f=0..N-1) should be (N-1-2*f)/(2*N) * MAXJSAMPLE/(ncolors-1). @@ -531,8 +529,7 @@ quantize_ord_dither (j_decompress_ptr cinfo, JSAMPARRAY input_buf, for (row = 0; row < num_rows; row++) { /* Initialize output values to 0 so can process components separately */ - FMEMZERO((void FAR *) output_buf[row], - (size_t) (width * SIZEOF(JSAMPLE))); + FMEMZERO((void FAR *) output_buf[row], (size_t) width * SIZEOF(JSAMPLE)); row_index = cquantize->row_index; for (ci = 0; ci < nc; ci++) { input_ptr = input_buf[row] + ci; @@ -636,8 +633,7 @@ quantize_fs_dither (j_decompress_ptr cinfo, JSAMPARRAY input_buf, for (row = 0; row < num_rows; row++) { /* Initialize output values to 0 so can process components separately */ - FMEMZERO((void FAR *) output_buf[row], - (size_t) (width * SIZEOF(JSAMPLE))); + FMEMZERO((void FAR *) output_buf[row], (size_t) width * SIZEOF(JSAMPLE)); for (ci = 0; ci < nc; ci++) { input_ptr = input_buf[row] + ci; output_ptr = output_buf[row]; @@ -726,10 +722,10 @@ alloc_fs_workspace (j_decompress_ptr cinfo) size_t arraysize; int i; - arraysize = (size_t) ((cinfo->output_width + 2) * SIZEOF(FSERROR)); + arraysize = ((size_t) cinfo->output_width + (size_t) 2) * SIZEOF(FSERROR); for (i = 0; i < cinfo->out_color_components; i++) { - cquantize->fserrors[i] = (FSERRPTR) - (*cinfo->mem->alloc_large)((j_common_ptr) cinfo, JPOOL_IMAGE, arraysize); + cquantize->fserrors[i] = (FSERRPTR) (*cinfo->mem->alloc_large) + ((j_common_ptr) cinfo, JPOOL_IMAGE, arraysize); } } @@ -780,13 +776,12 @@ start_pass_1_quant (j_decompress_ptr cinfo, boolean is_pre_scan) if (cquantize->fserrors[0] == NULL) alloc_fs_workspace(cinfo); /* Initialize the propagated errors to zero. */ - arraysize = (size_t) ((cinfo->output_width + 2) * SIZEOF(FSERROR)); + arraysize = ((size_t) cinfo->output_width + (size_t) 2) * SIZEOF(FSERROR); for (i = 0; i < cinfo->out_color_components; i++) FMEMZERO((void FAR *) cquantize->fserrors[i], arraysize); break; default: ERREXIT(cinfo, JERR_NOT_COMPILED); - break; } } @@ -823,10 +818,9 @@ jinit_1pass_quantizer (j_decompress_ptr cinfo) { my_cquantize_ptr cquantize; - cquantize = (my_cquantize_ptr) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - SIZEOF(my_cquantizer)); - cinfo->cquantize = (struct jpeg_color_quantizer *) cquantize; + cquantize = (my_cquantize_ptr) (*cinfo->mem->alloc_small) + ((j_common_ptr) cinfo, JPOOL_IMAGE, SIZEOF(my_cquantizer)); + cinfo->cquantize = &cquantize->pub; cquantize->pub.start_pass = start_pass_1_quant; cquantize->pub.finish_pass = finish_pass_1_quant; cquantize->pub.new_color_map = new_color_map_1_quant; diff --git a/vendor/jpeg-9d/jquant2.c b/vendor/jpeg-9e/jquant2.c similarity index 99% rename from vendor/jpeg-9d/jquant2.c rename to vendor/jpeg-9e/jquant2.c index 38fc2af7a5..662b9bcef3 100644 --- a/vendor/jpeg-9d/jquant2.c +++ b/vendor/jpeg-9e/jquant2.c @@ -2,7 +2,7 @@ * jquant2.c * * Copyright (C) 1991-1996, Thomas G. Lane. - * Modified 2011 by Guido Vollbeding. + * Modified 2011-2020 by Guido Vollbeding. * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * @@ -1197,8 +1197,8 @@ start_pass_2_quant (j_decompress_ptr cinfo, boolean is_pre_scan) ERREXIT1(cinfo, JERR_QUANT_MANY_COLORS, MAXNUMCOLORS); if (cinfo->dither_mode == JDITHER_FS) { - size_t arraysize = (size_t) ((cinfo->output_width + 2) * - (3 * SIZEOF(FSERROR))); + size_t arraysize = ((size_t) cinfo->output_width + (size_t) 2) + * (3 * SIZEOF(FSERROR)); /* Allocate Floyd-Steinberg workspace if we didn't already. */ if (cquantize->fserrors == NULL) cquantize->fserrors = (FSERRPTR) (*cinfo->mem->alloc_large) @@ -1247,10 +1247,9 @@ jinit_2pass_quantizer (j_decompress_ptr cinfo) my_cquantize_ptr cquantize; int i; - cquantize = (my_cquantize_ptr) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - SIZEOF(my_cquantizer)); - cinfo->cquantize = (struct jpeg_color_quantizer *) cquantize; + cquantize = (my_cquantize_ptr) (*cinfo->mem->alloc_small) + ((j_common_ptr) cinfo, JPOOL_IMAGE, SIZEOF(my_cquantizer)); + cinfo->cquantize = &cquantize->pub; cquantize->pub.start_pass = start_pass_2_quant; cquantize->pub.new_color_map = new_color_map_2_quant; cquantize->fserrors = NULL; /* flag optional arrays not allocated */ @@ -1284,7 +1283,8 @@ jinit_2pass_quantizer (j_decompress_ptr cinfo) if (desired > MAXNUMCOLORS) ERREXIT1(cinfo, JERR_QUANT_MANY_COLORS, MAXNUMCOLORS); cquantize->sv_colormap = (*cinfo->mem->alloc_sarray) - ((j_common_ptr) cinfo,JPOOL_IMAGE, (JDIMENSION) desired, (JDIMENSION) 3); + ((j_common_ptr) cinfo, JPOOL_IMAGE, + (JDIMENSION) desired, (JDIMENSION) 3); cquantize->desired = desired; } else cquantize->sv_colormap = NULL; @@ -1302,7 +1302,7 @@ jinit_2pass_quantizer (j_decompress_ptr cinfo) if (cinfo->dither_mode == JDITHER_FS) { cquantize->fserrors = (FSERRPTR) (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE, - (size_t) ((cinfo->output_width + 2) * (3 * SIZEOF(FSERROR)))); + ((size_t) cinfo->output_width + (size_t) 2) * (3 * SIZEOF(FSERROR))); /* Might as well create the error-limiting table too. */ init_error_limit(cinfo); } diff --git a/vendor/jpeg-9d/jutils.c b/vendor/jpeg-9e/jutils.c similarity index 71% rename from vendor/jpeg-9d/jutils.c rename to vendor/jpeg-9e/jutils.c index 1e2dfb017b..31e16dfb53 100644 --- a/vendor/jpeg-9d/jutils.c +++ b/vendor/jpeg-9e/jutils.c @@ -2,7 +2,7 @@ * jutils.c * * Copyright (C) 1991-1996, Thomas G. Lane. - * Modified 2009-2019 by Guido Vollbeding. + * Modified 2009-2020 by Guido Vollbeding. * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * @@ -52,67 +52,67 @@ const int jpeg_zigzag_order[DCTSIZE2] = { */ const int jpeg_natural_order[DCTSIZE2+16] = { - 0, 1, 8, 16, 9, 2, 3, 10, - 17, 24, 32, 25, 18, 11, 4, 5, - 12, 19, 26, 33, 40, 48, 41, 34, - 27, 20, 13, 6, 7, 14, 21, 28, - 35, 42, 49, 56, 57, 50, 43, 36, - 29, 22, 15, 23, 30, 37, 44, 51, - 58, 59, 52, 45, 38, 31, 39, 46, - 53, 60, 61, 54, 47, 55, 62, 63, - 63, 63, 63, 63, 63, 63, 63, 63, /* extra entries for safety in decoder */ - 63, 63, 63, 63, 63, 63, 63, 63 + 0, 1, 8, 16, 9, 2, 3, 10, + 17, 24, 32, 25, 18, 11, 4, 5, + 12, 19, 26, 33, 40, 48, 41, 34, + 27, 20, 13, 6, 7, 14, 21, 28, + 35, 42, 49, 56, 57, 50, 43, 36, + 29, 22, 15, 23, 30, 37, 44, 51, + 58, 59, 52, 45, 38, 31, 39, 46, + 53, 60, 61, 54, 47, 55, 62, 63, + 63, 63, 63, 63, 63, 63, 63, 63, /* extra entries for safety in decoder */ + 63, 63, 63, 63, 63, 63, 63, 63 }; const int jpeg_natural_order7[7*7+16] = { - 0, 1, 8, 16, 9, 2, 3, 10, - 17, 24, 32, 25, 18, 11, 4, 5, - 12, 19, 26, 33, 40, 48, 41, 34, - 27, 20, 13, 6, 14, 21, 28, 35, - 42, 49, 50, 43, 36, 29, 22, 30, - 37, 44, 51, 52, 45, 38, 46, 53, - 54, - 63, 63, 63, 63, 63, 63, 63, 63, /* extra entries for safety in decoder */ - 63, 63, 63, 63, 63, 63, 63, 63 + 0, 1, 8, 16, 9, 2, 3, 10, + 17, 24, 32, 25, 18, 11, 4, 5, + 12, 19, 26, 33, 40, 48, 41, 34, + 27, 20, 13, 6, 14, 21, 28, 35, + 42, 49, 50, 43, 36, 29, 22, 30, + 37, 44, 51, 52, 45, 38, 46, 53, + 54, + 63, 63, 63, 63, 63, 63, 63, 63, /* extra entries for safety in decoder */ + 63, 63, 63, 63, 63, 63, 63, 63 }; const int jpeg_natural_order6[6*6+16] = { - 0, 1, 8, 16, 9, 2, 3, 10, - 17, 24, 32, 25, 18, 11, 4, 5, - 12, 19, 26, 33, 40, 41, 34, 27, - 20, 13, 21, 28, 35, 42, 43, 36, - 29, 37, 44, 45, - 63, 63, 63, 63, 63, 63, 63, 63, /* extra entries for safety in decoder */ - 63, 63, 63, 63, 63, 63, 63, 63 + 0, 1, 8, 16, 9, 2, 3, 10, + 17, 24, 32, 25, 18, 11, 4, 5, + 12, 19, 26, 33, 40, 41, 34, 27, + 20, 13, 21, 28, 35, 42, 43, 36, + 29, 37, 44, 45, + 63, 63, 63, 63, 63, 63, 63, 63, /* extra entries for safety in decoder */ + 63, 63, 63, 63, 63, 63, 63, 63 }; const int jpeg_natural_order5[5*5+16] = { - 0, 1, 8, 16, 9, 2, 3, 10, - 17, 24, 32, 25, 18, 11, 4, 12, - 19, 26, 33, 34, 27, 20, 28, 35, - 36, - 63, 63, 63, 63, 63, 63, 63, 63, /* extra entries for safety in decoder */ - 63, 63, 63, 63, 63, 63, 63, 63 + 0, 1, 8, 16, 9, 2, 3, 10, + 17, 24, 32, 25, 18, 11, 4, 12, + 19, 26, 33, 34, 27, 20, 28, 35, + 36, + 63, 63, 63, 63, 63, 63, 63, 63, /* extra entries for safety in decoder */ + 63, 63, 63, 63, 63, 63, 63, 63 }; const int jpeg_natural_order4[4*4+16] = { - 0, 1, 8, 16, 9, 2, 3, 10, - 17, 24, 25, 18, 11, 19, 26, 27, - 63, 63, 63, 63, 63, 63, 63, 63, /* extra entries for safety in decoder */ - 63, 63, 63, 63, 63, 63, 63, 63 + 0, 1, 8, 16, 9, 2, 3, 10, + 17, 24, 25, 18, 11, 19, 26, 27, + 63, 63, 63, 63, 63, 63, 63, 63, /* extra entries for safety in decoder */ + 63, 63, 63, 63, 63, 63, 63, 63 }; const int jpeg_natural_order3[3*3+16] = { - 0, 1, 8, 16, 9, 2, 10, 17, - 18, - 63, 63, 63, 63, 63, 63, 63, 63, /* extra entries for safety in decoder */ - 63, 63, 63, 63, 63, 63, 63, 63 + 0, 1, 8, 16, 9, 2, 10, 17, + 18, + 63, 63, 63, 63, 63, 63, 63, 63, /* extra entries for safety in decoder */ + 63, 63, 63, 63, 63, 63, 63, 63 }; const int jpeg_natural_order2[2*2+16] = { - 0, 1, 8, 9, - 63, 63, 63, 63, 63, 63, 63, 63, /* extra entries for safety in decoder */ - 63, 63, 63, 63, 63, 63, 63, 63 + 0, 1, 8, 9, + 63, 63, 63, 63, 63, 63, 63, 63, /* extra entries for safety in decoder */ + 63, 63, 63, 63, 63, 63, 63, 63 }; @@ -174,12 +174,12 @@ jzero_far (void FAR * target, size_t bytestozero) GLOBAL(void) -jcopy_sample_rows (JSAMPARRAY input_array, int source_row, - JSAMPARRAY output_array, int dest_row, +jcopy_sample_rows (JSAMPARRAY input_array, + JSAMPARRAY output_array, int num_rows, JDIMENSION num_cols) /* Copy some rows of samples from one place to another. - * num_rows rows are copied from input_array[source_row++] - * to output_array[dest_row++]; these areas may overlap for duplication. + * num_rows rows are copied from *input_array++ to *output_array++; + * these areas may overlap for duplication. * The source and destination arrays must be at least as wide as num_cols. */ { @@ -191,9 +191,6 @@ jcopy_sample_rows (JSAMPARRAY input_array, int source_row, #endif register int row; - input_array += source_row; - output_array += dest_row; - for (row = num_rows; row > 0; row--) { inptr = *input_array++; outptr = *output_array++; diff --git a/vendor/jpeg-9d/jversion.h b/vendor/jpeg-9e/jversion.h similarity index 59% rename from vendor/jpeg-9d/jversion.h rename to vendor/jpeg-9e/jversion.h index c9befacde2..17134b7a5b 100644 --- a/vendor/jpeg-9d/jversion.h +++ b/vendor/jpeg-9e/jversion.h @@ -1,7 +1,7 @@ /* * jversion.h * - * Copyright (C) 1991-2020, Thomas G. Lane, Guido Vollbeding. + * Copyright (C) 1991-2022, Thomas G. Lane, Guido Vollbeding. * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * @@ -9,6 +9,6 @@ */ -#define JVERSION "9d 12-Jan-2020" +#define JVERSION "9e 16-Jan-2022" -#define JCOPYRIGHT "Copyright (C) 2020, Thomas G. Lane, Guido Vollbeding" +#define JCOPYRIGHT "Copyright (C) 2022, Thomas G. Lane, Guido Vollbeding" diff --git a/vendor/jpeg-9d/premake5.lua b/vendor/jpeg-9e/premake5.lua similarity index 100% rename from vendor/jpeg-9d/premake5.lua rename to vendor/jpeg-9e/premake5.lua diff --git a/vendor/jpeg-9d/rdbmp.c b/vendor/jpeg-9e/rdbmp.c similarity index 100% rename from vendor/jpeg-9d/rdbmp.c rename to vendor/jpeg-9e/rdbmp.c diff --git a/vendor/jpeg-9d/rdcolmap.c b/vendor/jpeg-9e/rdcolmap.c similarity index 100% rename from vendor/jpeg-9d/rdcolmap.c rename to vendor/jpeg-9e/rdcolmap.c diff --git a/vendor/jpeg-9d/rdgif.c b/vendor/jpeg-9e/rdgif.c similarity index 99% rename from vendor/jpeg-9d/rdgif.c rename to vendor/jpeg-9e/rdgif.c index 08803ae263..5d2339ca2b 100644 --- a/vendor/jpeg-9d/rdgif.c +++ b/vendor/jpeg-9e/rdgif.c @@ -2,7 +2,7 @@ * rdgif.c * * Copyright (C) 1991-1996, Thomas G. Lane. - * Modified 2019 by Guido Vollbeding. + * Modified 2019-2020 by Guido Vollbeding. * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * @@ -454,6 +454,8 @@ start_input_gif (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) /* we ignore top/left position info, also sort flag */ width = LM_to_uint(hdrbuf, 4); height = LM_to_uint(hdrbuf, 6); + if (width <= 0 || height <= 0) + ERREXIT(cinfo, JERR_GIF_OUTOFRANGE); source->is_interlaced = (BitSet(hdrbuf[8], INTERLACE) != 0); /* Read local colormap if header indicates it is present */ diff --git a/vendor/jpeg-9d/rdjpgcom.c b/vendor/jpeg-9e/rdjpgcom.c similarity index 100% rename from vendor/jpeg-9d/rdjpgcom.c rename to vendor/jpeg-9e/rdjpgcom.c diff --git a/vendor/jpeg-9d/rdppm.c b/vendor/jpeg-9e/rdppm.c similarity index 95% rename from vendor/jpeg-9d/rdppm.c rename to vendor/jpeg-9e/rdppm.c index 33e469ac9f..ca6386786d 100644 --- a/vendor/jpeg-9d/rdppm.c +++ b/vendor/jpeg-9e/rdppm.c @@ -2,7 +2,7 @@ * rdppm.c * * Copyright (C) 1991-1997, Thomas G. Lane. - * Modified 2009-2019 by Bill Allombert, Guido Vollbeding. + * Modified 2009-2020 by Bill Allombert, Guido Vollbeding. * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * @@ -70,8 +70,9 @@ typedef char U_CHAR; typedef struct { struct cjpeg_source_struct pub; /* public fields */ - U_CHAR *iobuffer; /* non-FAR pointer to I/O buffer */ - JSAMPROW pixrow; /* FAR pointer to same */ + /* Usually these two pointers point to the same place: */ + U_CHAR *iobuffer; /* fread's I/O buffer */ + JSAMPROW pixrow; /* compressor input buffer */ size_t buffer_width; /* width of I/O buffer */ JSAMPLE *rescale; /* => maxval-remapping array, or NULL */ unsigned int maxval; @@ -148,7 +149,7 @@ get_text_gray_row (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) unsigned int maxval = source->maxval; JDIMENSION col; - ptr = source->pub.buffer[0]; + ptr = source->pixrow; for (col = cinfo->image_width; col > 0; col--) { register unsigned int temp; temp = read_pbm_integer(cinfo, infile); @@ -171,7 +172,7 @@ get_text_rgb_row (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) unsigned int maxval = source->maxval; JDIMENSION col; - ptr = source->pub.buffer[0]; + ptr = source->pixrow; for (col = cinfo->image_width; col > 0; col--) { register unsigned int temp; temp = read_pbm_integer(cinfo, infile); @@ -204,7 +205,7 @@ get_scaled_gray_row (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) if (! ReadOK(source->pub.input_file, source->iobuffer, source->buffer_width)) ERREXIT(cinfo, JERR_INPUT_EOF); - ptr = source->pub.buffer[0]; + ptr = source->pixrow; bufferptr = source->iobuffer; for (col = cinfo->image_width; col > 0; col--) { register unsigned int temp; @@ -230,7 +231,7 @@ get_scaled_rgb_row (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) if (! ReadOK(source->pub.input_file, source->iobuffer, source->buffer_width)) ERREXIT(cinfo, JERR_INPUT_EOF); - ptr = source->pub.buffer[0]; + ptr = source->pixrow; bufferptr = source->iobuffer; for (col = cinfo->image_width; col > 0; col--) { register unsigned int temp; @@ -279,7 +280,7 @@ get_word_gray_row (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) if (! ReadOK(source->pub.input_file, source->iobuffer, source->buffer_width)) ERREXIT(cinfo, JERR_INPUT_EOF); - ptr = source->pub.buffer[0]; + ptr = source->pixrow; bufferptr = source->iobuffer; for (col = cinfo->image_width; col > 0; col--) { register unsigned int temp; @@ -306,7 +307,7 @@ get_word_rgb_row (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) if (! ReadOK(source->pub.input_file, source->iobuffer, source->buffer_width)) ERREXIT(cinfo, JERR_INPUT_EOF); - ptr = source->pub.buffer[0]; + ptr = source->pixrow; bufferptr = source->iobuffer; for (col = cinfo->image_width; col > 0; col--) { register unsigned int temp; @@ -430,7 +431,7 @@ start_input_ppm (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) /* Allocate space for I/O buffer: 1 or 3 bytes or words/pixel. */ if (need_iobuffer) { - source->buffer_width = (size_t) w * cinfo->input_components * + source->buffer_width = (size_t) w * (size_t) cinfo->input_components * ((maxval <= 255) ? SIZEOF(U_CHAR) : (2 * SIZEOF(U_CHAR))); source->iobuffer = (U_CHAR *) (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, source->buffer_width); @@ -439,17 +440,17 @@ start_input_ppm (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) /* Create compressor input buffer. */ if (use_raw_buffer) { /* For unscaled raw-input case, we can just map it onto the I/O buffer. */ - /* Synthesize a JSAMPARRAY pointer structure */ /* Cast here implies near->far pointer conversion on PCs */ source->pixrow = (JSAMPROW) source->iobuffer; - source->pub.buffer = & source->pixrow; - source->pub.buffer_height = 1; } else { /* Need to translate anyway, so make a separate sample buffer. */ - source->pub.buffer = (*cinfo->mem->alloc_sarray) ((j_common_ptr) cinfo, - JPOOL_IMAGE, (JDIMENSION) w * cinfo->input_components, (JDIMENSION) 1); - source->pub.buffer_height = 1; + source->pixrow = (JSAMPROW) (*cinfo->mem->alloc_large) + ((j_common_ptr) cinfo, JPOOL_IMAGE, (size_t) w * + (size_t) cinfo->input_components * SIZEOF(JSAMPLE)); } + /* Synthesize a JSAMPARRAY pointer structure */ + source->pub.buffer = & source->pixrow; + source->pub.buffer_height = 1; /* Compute the rescaling array if required. */ if (need_rescale) { diff --git a/vendor/jpeg-9d/rdrle.c b/vendor/jpeg-9e/rdrle.c similarity index 100% rename from vendor/jpeg-9d/rdrle.c rename to vendor/jpeg-9e/rdrle.c diff --git a/vendor/jpeg-9d/rdswitch.c b/vendor/jpeg-9e/rdswitch.c similarity index 97% rename from vendor/jpeg-9d/rdswitch.c rename to vendor/jpeg-9e/rdswitch.c index c0f7fed8cc..8a6675dbc6 100644 --- a/vendor/jpeg-9d/rdswitch.c +++ b/vendor/jpeg-9e/rdswitch.c @@ -2,7 +2,7 @@ * rdswitch.c * * Copyright (C) 1991-1996, Thomas G. Lane. - * Modified 2003-2019 by Guido Vollbeding. + * Modified 2003-2020 by Guido Vollbeding. * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * @@ -283,8 +283,7 @@ set_quality_ratings (j_compress_ptr cinfo, char *arg, boolean force_baseline) return FALSE; /* Convert user 0-100 rating to percentage scaling */ cinfo->q_scale_factor[tblno] = jpeg_quality_scaling(val); - while (*arg && *arg++ != ',') /* advance to next segment of arg string */ - ; + while (*arg && *arg++ != ','); /* advance to next segment of arg string */ } else { /* reached end of parameter, set remaining factors to last value */ cinfo->q_scale_factor[tblno] = jpeg_quality_scaling(val); @@ -319,8 +318,7 @@ set_quant_slots (j_compress_ptr cinfo, char *arg) return FALSE; } cinfo->comp_info[ci].quant_tbl_no = val; - while (*arg && *arg++ != ',') /* advance to next segment of arg string */ - ; + while (*arg && *arg++ != ','); /* advance to next segment of arg string */ } else { /* reached end of parameter, set remaining components to last table */ cinfo->comp_info[ci].quant_tbl_no = val; @@ -354,8 +352,7 @@ set_sample_factors (j_compress_ptr cinfo, char *arg) } cinfo->comp_info[ci].h_samp_factor = val1; cinfo->comp_info[ci].v_samp_factor = val2; - while (*arg && *arg++ != ',') /* advance to next segment of arg string */ - ; + while (*arg && *arg++ != ','); /* advance to next segment of arg string */ } else { /* reached end of parameter, set remaining components to 1x1 sampling */ cinfo->comp_info[ci].h_samp_factor = 1; diff --git a/vendor/jpeg-9d/rdtarga.c b/vendor/jpeg-9e/rdtarga.c similarity index 100% rename from vendor/jpeg-9d/rdtarga.c rename to vendor/jpeg-9e/rdtarga.c diff --git a/vendor/jpeg-9d/transupp.c b/vendor/jpeg-9e/transupp.c similarity index 100% rename from vendor/jpeg-9d/transupp.c rename to vendor/jpeg-9e/transupp.c diff --git a/vendor/jpeg-9d/transupp.h b/vendor/jpeg-9e/transupp.h similarity index 100% rename from vendor/jpeg-9d/transupp.h rename to vendor/jpeg-9e/transupp.h diff --git a/vendor/jpeg-9d/wrbmp.c b/vendor/jpeg-9e/wrbmp.c similarity index 100% rename from vendor/jpeg-9d/wrbmp.c rename to vendor/jpeg-9e/wrbmp.c diff --git a/vendor/jpeg-9d/wrgif.c b/vendor/jpeg-9e/wrgif.c similarity index 100% rename from vendor/jpeg-9d/wrgif.c rename to vendor/jpeg-9e/wrgif.c diff --git a/vendor/jpeg-9d/wrjpgcom.c b/vendor/jpeg-9e/wrjpgcom.c similarity index 100% rename from vendor/jpeg-9d/wrjpgcom.c rename to vendor/jpeg-9e/wrjpgcom.c diff --git a/vendor/jpeg-9d/wrppm.c b/vendor/jpeg-9e/wrppm.c similarity index 94% rename from vendor/jpeg-9d/wrppm.c rename to vendor/jpeg-9e/wrppm.c index eb8bdf40d7..c9e03ad10d 100644 --- a/vendor/jpeg-9d/wrppm.c +++ b/vendor/jpeg-9e/wrppm.c @@ -2,7 +2,7 @@ * wrppm.c * * Copyright (C) 1991-1996, Thomas G. Lane. - * Modified 2009-2019 by Guido Vollbeding. + * Modified 2009-2020 by Guido Vollbeding. * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * @@ -111,7 +111,7 @@ copy_pixel_rows (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo, register JSAMPROW ptr; register JDIMENSION col; - ptr = dest->pub.buffer[0]; + ptr = dest->pixrow; bufferptr = dest->iobuffer; for (col = dest->samples_per_row; col > 0; col--) { PUTPPMSAMPLE(bufferptr, GETJSAMPLE(*ptr++)); @@ -138,7 +138,7 @@ put_demapped_rgb (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo, register JSAMPROW color_map2 = cinfo->colormap[2]; register JDIMENSION col; - ptr = dest->pub.buffer[0]; + ptr = dest->pixrow; bufferptr = dest->iobuffer; for (col = cinfo->output_width; col > 0; col--) { pixval = GETJSAMPLE(*ptr++); @@ -159,7 +159,7 @@ put_demapped_gray (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo, register JSAMPROW color_map0 = cinfo->colormap[0]; register JDIMENSION col; - ptr = dest->pub.buffer[0]; + ptr = dest->pixrow; bufferptr = dest->iobuffer; for (col = cinfo->output_width; col > 0; col--) { PUTPPMSAMPLE(bufferptr, GETJSAMPLE(color_map0[GETJSAMPLE(*ptr++)])); @@ -239,10 +239,9 @@ jinit_write_ppm (j_decompress_ptr cinfo) * that's separate from the physical I/O buffer. We also need a * separate buffer if pixel format translation must take place. */ - dest->pub.buffer = (*cinfo->mem->alloc_sarray) - ((j_common_ptr) cinfo, JPOOL_IMAGE, - cinfo->output_width * cinfo->output_components, (JDIMENSION) 1); - dest->pub.buffer_height = 1; + dest->pixrow = (JSAMPROW) (*cinfo->mem->alloc_large) + ((j_common_ptr) cinfo, JPOOL_IMAGE, (size_t) cinfo->output_width * + (size_t) cinfo->output_components * SIZEOF(JSAMPLE)); if (! cinfo->quantize_colors) dest->pub.put_pixel_rows = copy_pixel_rows; else if (cinfo->out_color_space == JCS_GRAYSCALE) @@ -251,13 +250,13 @@ jinit_write_ppm (j_decompress_ptr cinfo) dest->pub.put_pixel_rows = put_demapped_rgb; } else { /* We will fwrite() directly from decompressor output buffer. */ - /* Synthesize a JSAMPARRAY pointer structure */ /* Cast here implies near->far pointer conversion on PCs */ dest->pixrow = (JSAMPROW) dest->iobuffer; - dest->pub.buffer = & dest->pixrow; - dest->pub.buffer_height = 1; dest->pub.put_pixel_rows = put_pixel_rows; } + /* Synthesize a JSAMPARRAY pointer structure */ + dest->pub.buffer = & dest->pixrow; + dest->pub.buffer_height = 1; return &dest->pub; } diff --git a/vendor/jpeg-9d/wrrle.c b/vendor/jpeg-9e/wrrle.c similarity index 100% rename from vendor/jpeg-9d/wrrle.c rename to vendor/jpeg-9e/wrrle.c diff --git a/vendor/jpeg-9d/wrtarga.c b/vendor/jpeg-9e/wrtarga.c similarity index 100% rename from vendor/jpeg-9d/wrtarga.c rename to vendor/jpeg-9e/wrtarga.c From e467585d70058551ba9e69beaf86c782c374115c Mon Sep 17 00:00:00 2001 From: Lpsd <40902730+Lpsd@users.noreply.github.com> Date: Sat, 2 Apr 2022 09:57:05 -0700 Subject: [PATCH 29/49] Define "HAVE_UNISTD_H" in zlib on Mac systems (#2585) (#2587) * Define "HAVE_UNISTD_H" on Mac systems --- vendor/zlib/premake5.lua | 3 +++ 1 file changed, 3 insertions(+) diff --git a/vendor/zlib/premake5.lua b/vendor/zlib/premake5.lua index fc1d64dd3d..4e17389378 100644 --- a/vendor/zlib/premake5.lua +++ b/vendor/zlib/premake5.lua @@ -20,3 +20,6 @@ project "zlib" } defines { "verbose=-1" } -- Stop "bit length overflow" warning + + filter "system:Mac*" + defines { "HAVE_UNISTD_H" } \ No newline at end of file From b2647ec6a851c5cee7a0cc889591ba94eb6cace1 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 2 Apr 2022 20:42:56 +0300 Subject: [PATCH 30/49] Update pot files (#2508) * Update client en_US pot * Update installer en_US pot --- .../MTA/locale/en_US/client.pot | 1599 ++++++++--------- Shared/installer/locale/en_US.pot | 142 +- 2 files changed, 858 insertions(+), 883 deletions(-) diff --git a/Shared/data/MTA San Andreas/MTA/locale/en_US/client.pot b/Shared/data/MTA San Andreas/MTA/locale/en_US/client.pot index 8b0475a086..7dffe2ada1 100644 --- a/Shared/data/MTA San Andreas/MTA/locale/en_US/client.pot +++ b/Shared/data/MTA San Andreas/MTA/locale/en_US/client.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: MTA San Andreas 1.x\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-01-08 17:25+0200\n" +"POT-Creation-Date: 2022-04-02 16:58+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,82 +17,82 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" -#: ..\Client\cefweb\CWebsiteRequests.cpp:19 +#: Client\cefweb\CWebsiteRequests.cpp:19 msgid "Website requests" msgstr "" -#: ..\Client\cefweb\CWebsiteRequests.cpp:27 +#: Client\cefweb\CWebsiteRequests.cpp:27 msgid "" "The server requests the following websites in order to load them (later):" msgstr "" -#: ..\Client\cefweb\CWebsiteRequests.cpp:33 +#: Client\cefweb\CWebsiteRequests.cpp:33 msgid "NEVER ENTER SENSITIVE DATA TO PROTECT THEM FROM BEING STOLEN" msgstr "" -#: ..\Client\cefweb\CWebsiteRequests.cpp:46 +#: Client\cefweb\CWebsiteRequests.cpp:46 msgid "Remember decision" msgstr "" -#: ..\Client\cefweb\CWebsiteRequests.cpp:51 ..\Client\core\CSettings.cpp:929 +#: Client\cefweb\CWebsiteRequests.cpp:51 Client\core\CSettings.cpp:943 msgid "Allow" msgstr "" -#: ..\Client\cefweb\CWebsiteRequests.cpp:57 +#: Client\cefweb\CWebsiteRequests.cpp:57 msgid "Deny" msgstr "" -#: ..\Client\core\CCommandFuncs.cpp:29 +#: Client\core\CCommandFuncs.cpp:29 msgid "***[ COMMAND HELP ]***\n" msgstr "" -#: ..\Client\core\CCommandFuncs.cpp:167 +#: Client\core\CCommandFuncs.cpp:167 #, c-format msgid "* The time is %d:%02d:%02d" msgstr "" -#: ..\Client\core\CCommandFuncs.cpp:251 +#: Client\core\CCommandFuncs.cpp:251 msgid "connect: Syntax is 'connect [ ]'" msgstr "" -#: ..\Client\core\CCommandFuncs.cpp:259 ..\Client\core\CCommandFuncs.cpp:327 +#: Client\core\CCommandFuncs.cpp:259 Client\core\CCommandFuncs.cpp:327 msgid "connect: Bad port number" msgstr "" -#: ..\Client\core\CCommandFuncs.cpp:281 ..\Client\core\CCommandFuncs.cpp:342 +#: Client\core\CCommandFuncs.cpp:281 Client\core\CCommandFuncs.cpp:342 #, c-format msgid "connect: Connecting to %s:%u..." msgstr "" -#: ..\Client\core\CCommandFuncs.cpp:285 ..\Client\core\CCommandFuncs.cpp:346 +#: Client\core\CCommandFuncs.cpp:285 Client\core\CCommandFuncs.cpp:346 #, c-format msgid "connect: could not connect to %s:%u!" msgstr "" -#: ..\Client\core\CCommandFuncs.cpp:290 +#: Client\core\CCommandFuncs.cpp:290 msgid "connect: Failed to unload current mod" msgstr "" -#: ..\Client\core\CCommandFuncs.cpp:380 +#: Client\core\CCommandFuncs.cpp:380 msgid "Bound all controls from GTA" msgstr "" -#: ..\Client\core\CCommandFuncs.cpp:394 +#: Client\core\CCommandFuncs.cpp:394 msgid "Saved configuration file" msgstr "" #. Print it -#: ..\Client\core\CCommandFuncs.cpp:460 +#: Client\core\CCommandFuncs.cpp:460 #, c-format msgid "* Your serial is: %s" msgstr "" #. Unknown command -#: ..\Client\core\CCommands.cpp:209 +#: Client\core\CCommands.cpp:209 msgid "Unknown command or cvar: " msgstr "" -#: ..\Client\core\CConnectManager.cpp:80 +#: Client\core\CConnectManager.cpp:80 msgid "Connecting failed. Invalid nick provided!" msgstr "" @@ -100,504 +100,494 @@ msgstr "" #. Show failed message and abort the attempt #. Show timeout message and disconnect #. Display an error, reset the error status and exit -#: ..\Client\core\CConnectManager.cpp:81 -#: ..\Client\core\CConnectManager.cpp:117 -#: ..\Client\core\CConnectManager.cpp:133 -#: ..\Client\core\CConnectManager.cpp:269 -#: ..\Client\core\CConnectManager.cpp:327 -#: ..\Client\core\CConnectManager.cpp:410 -#: ..\Client\core\CConnectManager.cpp:417 -#: ..\Client\core\CConnectManager.cpp:427 ..\Client\core\CCore.cpp:1200 -#: ..\Client\core\CCore.cpp:1213 ..\Client\core\CGUI.cpp:87 -#: ..\Client\core\CSettings.cpp:2870 ..\Client\core\CSettings.cpp:4044 -#: ..\Client\core\CSettings.cpp:4072 ..\Client\core\CSettings.cpp:4577 -#: ..\Client\core\DXHook\CDirect3DHook9.cpp:127 -#: ..\Client\core\ServerBrowser\CServerBrowser.cpp:1273 -#: ..\Client\core\ServerBrowser\CServerBrowser.cpp:1295 -#: ..\Client\core\ServerBrowser\CServerBrowser.cpp:1352 -#: ..\Client\core\ServerBrowser\CServerBrowser.cpp:1401 -#: ..\Client\loader\CInstallManager.cpp:520 -#: ..\Client\loader\CInstallManager.cpp:529 -#: ..\Client\loader\CInstallManager.cpp:618 -#: ..\Client\loader\MainFunctions.cpp:245 -#: ..\Client\loader\MainFunctions.cpp:260 -#: ..\Client\loader\MainFunctions.cpp:262 -#: ..\Client\loader\MainFunctions.cpp:815 -#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:568 -#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:642 -#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:666 -#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:688 -#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:1004 -#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:1084 -#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:1094 -#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:1163 -#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:1197 -#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:1246 -#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:1258 -#: ..\Client\mods\deathmatch\logic\CResourceFileDownloadManager.cpp:145 -#: ..\Client\mods\deathmatch\logic\CServer.cpp:181 -#: ..\Shared\mods\deathmatch\logic\CLatentTransferManager.cpp:358 -#: ..\Shared\sdk\SharedUtil.Misc.hpp:140 +#: Client\core\CConnectManager.cpp:81 Client\core\CConnectManager.cpp:117 +#: Client\core\CConnectManager.cpp:133 Client\core\CConnectManager.cpp:269 +#: Client\core\CConnectManager.cpp:327 Client\core\CConnectManager.cpp:410 +#: Client\core\CConnectManager.cpp:417 Client\core\CConnectManager.cpp:427 +#: Client\core\CCore.cpp:1200 Client\core\CCore.cpp:1213 +#: Client\core\CGUI.cpp:87 Client\core\CSettings.cpp:2888 +#: Client\core\CSettings.cpp:4062 Client\core\CSettings.cpp:4090 +#: Client\core\CSettings.cpp:4621 Client\core\DXHook\CDirect3DHook9.cpp:127 +#: Client\core\ServerBrowser\CServerBrowser.cpp:1273 +#: Client\core\ServerBrowser\CServerBrowser.cpp:1295 +#: Client\core\ServerBrowser\CServerBrowser.cpp:1352 +#: Client\core\ServerBrowser\CServerBrowser.cpp:1401 +#: Client\loader\CInstallManager.cpp:520 Client\loader\CInstallManager.cpp:529 +#: Client\loader\CInstallManager.cpp:618 Client\loader\MainFunctions.cpp:245 +#: Client\loader\MainFunctions.cpp:260 Client\loader\MainFunctions.cpp:262 +#: Client\loader\MainFunctions.cpp:815 +#: Client\mods\deathmatch\logic\CClientGame.cpp:568 +#: Client\mods\deathmatch\logic\CClientGame.cpp:642 +#: Client\mods\deathmatch\logic\CClientGame.cpp:666 +#: Client\mods\deathmatch\logic\CClientGame.cpp:688 +#: Client\mods\deathmatch\logic\CClientGame.cpp:1004 +#: Client\mods\deathmatch\logic\CClientGame.cpp:1084 +#: Client\mods\deathmatch\logic\CClientGame.cpp:1094 +#: Client\mods\deathmatch\logic\CClientGame.cpp:1163 +#: Client\mods\deathmatch\logic\CClientGame.cpp:1197 +#: Client\mods\deathmatch\logic\CClientGame.cpp:1246 +#: Client\mods\deathmatch\logic\CClientGame.cpp:1258 +#: Client\mods\deathmatch\logic\CResourceFileDownloadManager.cpp:145 +#: Client\mods\deathmatch\logic\CServer.cpp:181 +#: Shared\mods\deathmatch\logic\CLatentTransferManager.cpp:358 +#: Shared\sdk\SharedUtil.Misc.hpp:140 msgid "Error" msgstr "" -#: ..\Client\core\CConnectManager.cpp:116 +#: Client\core\CConnectManager.cpp:116 msgid "Connecting failed. Invalid host provided!" msgstr "" -#: ..\Client\core\CConnectManager.cpp:132 +#: Client\core\CConnectManager.cpp:132 #, c-format msgid "Connecting to %s at port %u failed!" msgstr "" #. Display the status box -#: ..\Client\core\CConnectManager.cpp:153 +#: Client\core\CConnectManager.cpp:153 #, c-format msgid "Connecting to %s:%u ..." msgstr "" #. Display the status box -#: ..\Client\core\CConnectManager.cpp:154 -#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:584 +#: Client\core\CConnectManager.cpp:154 +#: Client\mods\deathmatch\logic\CClientGame.cpp:584 msgid "CONNECTING" msgstr "" -#: ..\Client\core\CConnectManager.cpp:269 -#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:1163 +#: Client\core\CConnectManager.cpp:269 +#: Client\mods\deathmatch\logic\CClientGame.cpp:1163 msgid "Connection timed out" msgstr "" -#: ..\Client\core\CConnectManager.cpp:283 -#: ..\Client\core\CConnectManager.cpp:287 -#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:1208 +#: Client\core\CConnectManager.cpp:283 Client\core\CConnectManager.cpp:287 +#: Client\mods\deathmatch\logic\CClientGame.cpp:1208 msgid "Disconnected: unknown protocol error" msgstr "" -#: ..\Client\core\CConnectManager.cpp:291 -#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:1212 +#: Client\core\CConnectManager.cpp:291 +#: Client\mods\deathmatch\logic\CClientGame.cpp:1212 msgid "Disconnected: disconnected remotely" msgstr "" -#: ..\Client\core\CConnectManager.cpp:295 -#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:1216 +#: Client\core\CConnectManager.cpp:295 +#: Client\mods\deathmatch\logic\CClientGame.cpp:1216 msgid "Disconnected: connection lost remotely" msgstr "" -#: ..\Client\core\CConnectManager.cpp:299 -#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:1220 +#: Client\core\CConnectManager.cpp:299 +#: Client\mods\deathmatch\logic\CClientGame.cpp:1220 msgid "Disconnected: you are banned from this server" msgstr "" -#: ..\Client\core\CConnectManager.cpp:306 -#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:1228 +#: Client\core\CConnectManager.cpp:306 +#: Client\mods\deathmatch\logic\CClientGame.cpp:1228 msgid "Disconnected: disconnected from the server" msgstr "" -#: ..\Client\core\CConnectManager.cpp:310 -#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:1232 +#: Client\core\CConnectManager.cpp:310 +#: Client\mods\deathmatch\logic\CClientGame.cpp:1232 msgid "Disconnected: connection to the server was lost" msgstr "" -#: ..\Client\core\CConnectManager.cpp:317 -#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:1240 +#: Client\core\CConnectManager.cpp:317 +#: Client\mods\deathmatch\logic\CClientGame.cpp:1240 msgid "Disconnected: connection was refused" msgstr "" #. Failed loading the mod -#: ..\Client\core\CConnectManager.cpp:409 +#: Client\core\CConnectManager.cpp:409 #, c-format msgid "No such mod installed (%s)" msgstr "" -#: ..\Client\core\CConnectManager.cpp:417 +#: Client\core\CConnectManager.cpp:417 msgid "Bad server response (2)" msgstr "" -#: ..\Client\core\CConnectManager.cpp:427 +#: Client\core\CConnectManager.cpp:427 msgid "Bad server response (1)" msgstr "" #. Create window -#: ..\Client\core\CConsole.cpp:417 +#: Client\core\CConsole.cpp:417 msgid "CONSOLE" msgstr "" -#: ..\Client\core\CCore.cpp:727 ..\Client\loader\CInstallManager.cpp:756 +#: Client\core\CCore.cpp:727 Client\loader\CInstallManager.cpp:756 #, c-format msgid "MTA:SA cannot continue because drive %s does not have enough space." msgstr "" -#: ..\Client\core\CCore.cpp:729 ..\Shared\mods\deathmatch\logic\Utils.cpp:102 +#: Client\core\CCore.cpp:729 Shared\mods\deathmatch\logic\Utils.cpp:102 msgid "Fatal error" msgstr "" -#: ..\Client\core\CCore.cpp:855 +#: Client\core\CCore.cpp:855 msgid "TO FIX, REMOVE THIS FILE:" msgstr "" -#: ..\Client\core\CCore.cpp:887 +#: Client\core\CCore.cpp:887 #, c-format msgid "%s module is incorrect!" msgstr "" -#: ..\Client\core\CCore.cpp:1200 +#: Client\core\CCore.cpp:1200 msgid "Error executing URL" msgstr "" -#: ..\Client\core\CCore.cpp:1212 +#: Client\core\CCore.cpp:1212 #, c-format msgid "Error running mod specified in command line ('%s')" msgstr "" #. m_pCommands->Add ( "e", CCommandFuncs::Editor ); #. m_pCommands->Add ( "clear", CCommandFuncs::Clear ); -#: ..\Client\core\CCore.cpp:1297 +#: Client\core\CCore.cpp:1297 msgid "this help screen" msgstr "" -#: ..\Client\core\CCore.cpp:1298 ..\Client\core\CCore.cpp:1299 +#: Client\core\CCore.cpp:1298 Client\core\CCore.cpp:1299 msgid "exits the application" msgstr "" -#: ..\Client\core\CCore.cpp:1300 +#: Client\core\CCore.cpp:1300 msgid "shows the version" msgstr "" -#: ..\Client\core\CCore.cpp:1301 +#: Client\core\CCore.cpp:1301 msgid "shows the time" msgstr "" -#: ..\Client\core\CCore.cpp:1302 +#: Client\core\CCore.cpp:1302 msgid "shows the hud" msgstr "" -#: ..\Client\core\CCore.cpp:1303 +#: Client\core\CCore.cpp:1303 msgid "shows all the binds" msgstr "" -#: ..\Client\core\CCore.cpp:1304 +#: Client\core\CCore.cpp:1304 msgid "shows your serial" msgstr "" -#: ..\Client\core\CCore.cpp:1313 +#: Client\core\CCore.cpp:1313 msgid "connects to a server (host port nick pass)" msgstr "" -#: ..\Client\core\CCore.cpp:1314 +#: Client\core\CCore.cpp:1314 msgid "connects to a previous server" msgstr "" -#: ..\Client\core\CCore.cpp:1315 +#: Client\core\CCore.cpp:1315 msgid "binds a key (key control)" msgstr "" -#: ..\Client\core\CCore.cpp:1316 +#: Client\core\CCore.cpp:1316 msgid "unbinds a key (key)" msgstr "" -#: ..\Client\core\CCore.cpp:1317 +#: Client\core\CCore.cpp:1317 msgid "copies the default gta controls" msgstr "" -#: ..\Client\core\CCore.cpp:1318 +#: Client\core\CCore.cpp:1318 msgid "outputs a screenshot" msgstr "" -#: ..\Client\core\CCore.cpp:1319 +#: Client\core\CCore.cpp:1319 msgid "immediately saves the config" msgstr "" -#: ..\Client\core\CCore.cpp:1321 +#: Client\core\CCore.cpp:1321 msgid "clears the debug view" msgstr "" -#: ..\Client\core\CCore.cpp:1322 +#: Client\core\CCore.cpp:1322 msgid "scrolls the chatbox upwards" msgstr "" -#: ..\Client\core\CCore.cpp:1323 +#: Client\core\CCore.cpp:1323 msgid "scrolls the chatbox downwards" msgstr "" -#: ..\Client\core\CCore.cpp:1324 +#: Client\core\CCore.cpp:1324 msgid "scrolls the debug view upwards" msgstr "" -#: ..\Client\core\CCore.cpp:1325 +#: Client\core\CCore.cpp:1325 msgid "scrolls the debug view downwards" msgstr "" -#: ..\Client\core\CCore.cpp:1328 +#: Client\core\CCore.cpp:1328 msgid "shows the memory statistics" msgstr "" -#: ..\Client\core\CCore.cpp:1329 +#: Client\core\CCore.cpp:1329 msgid "shows the frame timing graph" msgstr "" -#: ..\Client\core\CCredits.cpp:32 +#: Client\core\CCredits.cpp:32 msgid "Programming" msgstr "" -#: ..\Client\core\CCredits.cpp:61 +#: Client\core\CCredits.cpp:61 msgid "Contributors" msgstr "" -#: ..\Client\core\CCredits.cpp:82 +#: Client\core\CCredits.cpp:82 msgid "Game Design / Scripting" msgstr "" -#: ..\Client\core\CCredits.cpp:102 +#: Client\core\CCredits.cpp:102 msgid "Language Localization" msgstr "" -#: ..\Client\core\CCredits.cpp:108 +#: Client\core\CCredits.cpp:108 msgid "Patch contributors" msgstr "" -#: ..\Client\core\CCredits.cpp:216 +#: Client\core\CCredits.cpp:216 msgid "Special Thanks" msgstr "" -#: ..\Client\core\CCredits.cpp:245 +#: Client\core\CCredits.cpp:245 msgid "This software makes use of the following libraries and software:" msgstr "" #. Even the default skin doesn't work, so give up -#: ..\Client\core\CGUI.cpp:86 +#: Client\core\CGUI.cpp:86 msgid "" "The skin you selected could not be loaded, and the default skin also could " "not be loaded, please reinstall MTA." msgstr "" -#: ..\Client\core\CJoystickManager.cpp:1578 +#: Client\core\CJoystickManager.cpp:1578 msgid "Accelerate Axis" msgstr "" -#: ..\Client\core\CJoystickManager.cpp:1580 +#: Client\core\CJoystickManager.cpp:1580 msgid "Brake Axis" msgstr "" -#: ..\Client\core\CKeyBinds.cpp:181 +#: Client\core\CKeyBinds.cpp:181 msgid "Fire" msgstr "" -#: ..\Client\core\CKeyBinds.cpp:182 +#: Client\core\CKeyBinds.cpp:182 msgid "Next weapon" msgstr "" -#: ..\Client\core\CKeyBinds.cpp:183 +#: Client\core\CKeyBinds.cpp:183 msgid "Previous weapon" msgstr "" -#: ..\Client\core\CKeyBinds.cpp:184 +#: Client\core\CKeyBinds.cpp:184 msgid "Forwards" msgstr "" -#: ..\Client\core\CKeyBinds.cpp:185 +#: Client\core\CKeyBinds.cpp:185 msgid "Backwards" msgstr "" -#: ..\Client\core\CKeyBinds.cpp:186 ..\Client\core\CSettings.cpp:2169 -#: ..\Client\core\CSettings.cpp:2197 +#: Client\core\CKeyBinds.cpp:186 Client\core\CSettings.cpp:2187 +#: Client\core\CSettings.cpp:2215 msgid "Left" msgstr "" -#: ..\Client\core\CKeyBinds.cpp:187 ..\Client\core\CSettings.cpp:2171 -#: ..\Client\core\CSettings.cpp:2198 +#: Client\core\CKeyBinds.cpp:187 Client\core\CSettings.cpp:2189 +#: Client\core\CSettings.cpp:2216 msgid "Right" msgstr "" -#: ..\Client\core\CKeyBinds.cpp:188 +#: Client\core\CKeyBinds.cpp:188 msgid "Zoom in" msgstr "" -#: ..\Client\core\CKeyBinds.cpp:189 +#: Client\core\CKeyBinds.cpp:189 msgid "Zoom out" msgstr "" -#: ..\Client\core\CKeyBinds.cpp:190 +#: Client\core\CKeyBinds.cpp:190 msgid "Enter/Exit" msgstr "" -#: ..\Client\core\CKeyBinds.cpp:191 +#: Client\core\CKeyBinds.cpp:191 msgid "Change camera" msgstr "" #. 10 -#: ..\Client\core\CKeyBinds.cpp:192 +#: Client\core\CKeyBinds.cpp:192 msgid "Jump" msgstr "" -#: ..\Client\core\CKeyBinds.cpp:193 +#: Client\core\CKeyBinds.cpp:193 msgid "Sprint" msgstr "" -#: ..\Client\core\CKeyBinds.cpp:194 +#: Client\core\CKeyBinds.cpp:194 msgid "Look behind" msgstr "" -#: ..\Client\core\CKeyBinds.cpp:195 +#: Client\core\CKeyBinds.cpp:195 msgid "Crouch" msgstr "" -#: ..\Client\core\CKeyBinds.cpp:196 +#: Client\core\CKeyBinds.cpp:196 msgid "Action" msgstr "" -#: ..\Client\core\CKeyBinds.cpp:197 +#: Client\core\CKeyBinds.cpp:197 msgid "Walk" msgstr "" -#: ..\Client\core\CKeyBinds.cpp:198 +#: Client\core\CKeyBinds.cpp:198 msgid "Vehicle fire" msgstr "" -#: ..\Client\core\CKeyBinds.cpp:199 +#: Client\core\CKeyBinds.cpp:199 msgid "Vehicle secondary fire" msgstr "" -#: ..\Client\core\CKeyBinds.cpp:200 +#: Client\core\CKeyBinds.cpp:200 msgid "Vehicle left" msgstr "" -#: ..\Client\core\CKeyBinds.cpp:201 +#: Client\core\CKeyBinds.cpp:201 msgid "Vehicle right" msgstr "" #. 20 -#: ..\Client\core\CKeyBinds.cpp:202 +#: Client\core\CKeyBinds.cpp:202 msgid "Steer forwards/down" msgstr "" -#: ..\Client\core\CKeyBinds.cpp:203 +#: Client\core\CKeyBinds.cpp:203 msgid "Steer backwards/up" msgstr "" -#: ..\Client\core\CKeyBinds.cpp:204 +#: Client\core\CKeyBinds.cpp:204 msgid "Accelerate" msgstr "" -#: ..\Client\core\CKeyBinds.cpp:205 +#: Client\core\CKeyBinds.cpp:205 msgid "Brake/Reverse" msgstr "" -#: ..\Client\core\CKeyBinds.cpp:206 +#: Client\core\CKeyBinds.cpp:206 msgid "Radio next" msgstr "" -#: ..\Client\core\CKeyBinds.cpp:207 +#: Client\core\CKeyBinds.cpp:207 msgid "Radio previous" msgstr "" -#: ..\Client\core\CKeyBinds.cpp:208 +#: Client\core\CKeyBinds.cpp:208 msgid "Radio user track skip" msgstr "" -#: ..\Client\core\CKeyBinds.cpp:209 +#: Client\core\CKeyBinds.cpp:209 msgid "Horn" msgstr "" -#: ..\Client\core\CKeyBinds.cpp:210 +#: Client\core\CKeyBinds.cpp:210 msgid "Sub-mission" msgstr "" -#: ..\Client\core\CKeyBinds.cpp:211 +#: Client\core\CKeyBinds.cpp:211 msgid "Handbrake" msgstr "" #. 30 -#: ..\Client\core\CKeyBinds.cpp:212 +#: Client\core\CKeyBinds.cpp:212 msgid "Vehicle look left" msgstr "" -#: ..\Client\core\CKeyBinds.cpp:213 +#: Client\core\CKeyBinds.cpp:213 msgid "Vehicle look right" msgstr "" -#: ..\Client\core\CKeyBinds.cpp:214 +#: Client\core\CKeyBinds.cpp:214 msgid "Vehicle look behind" msgstr "" -#: ..\Client\core\CKeyBinds.cpp:215 +#: Client\core\CKeyBinds.cpp:215 msgid "Vehicle mouse look" msgstr "" -#: ..\Client\core\CKeyBinds.cpp:216 +#: Client\core\CKeyBinds.cpp:216 msgid "Special control left" msgstr "" -#: ..\Client\core\CKeyBinds.cpp:217 +#: Client\core\CKeyBinds.cpp:217 msgid "Special control right" msgstr "" -#: ..\Client\core\CKeyBinds.cpp:218 +#: Client\core\CKeyBinds.cpp:218 msgid "Special control down" msgstr "" -#: ..\Client\core\CKeyBinds.cpp:219 +#: Client\core\CKeyBinds.cpp:219 msgid "Special control up" msgstr "" -#: ..\Client\core\CKeyBinds.cpp:220 +#: Client\core\CKeyBinds.cpp:220 msgid "Aim weapon" msgstr "" -#: ..\Client\core\CKeyBinds.cpp:221 +#: Client\core\CKeyBinds.cpp:221 msgid "Conversation yes" msgstr "" #. 40 -#: ..\Client\core\CKeyBinds.cpp:222 +#: Client\core\CKeyBinds.cpp:222 msgid "Conversation no" msgstr "" -#: ..\Client\core\CKeyBinds.cpp:223 +#: Client\core\CKeyBinds.cpp:223 msgid "Group control forwards" msgstr "" -#: ..\Client\core\CKeyBinds.cpp:224 +#: Client\core\CKeyBinds.cpp:224 msgid "Group control backwards" msgstr "" #. TRANSLATORS: Replace with your language native name -#: ..\Client\core\CLocalization.cpp:16 +#: Client\core\CLocalization.cpp:16 msgid "English" msgstr "" -#: ..\Client\core\CMainMenu.cpp:315 +#: Client\core\CMainMenu.cpp:315 msgid "" "You are using a feature-branch build! This is a test build only which cannot " "be used to connect to public servers!" msgstr "" -#: ..\Client\core\CMainMenu.cpp:334 +#: Client\core\CMainMenu.cpp:334 msgid "" "MTA will not receive updates on XP/Vista after July 2019.\n" "\n" "Upgrade Windows to play on the latest servers." msgstr "" -#: ..\Client\core\CMainMenu.cpp:1148 +#: Client\core\CMainMenu.cpp:1148 msgid "" "This will disconnect you from the current server.\n" "\n" "Are you sure you want to disconnect?" msgstr "" -#: ..\Client\core\CMainMenu.cpp:1152 +#: Client\core\CMainMenu.cpp:1152 msgid "DISCONNECT WARNING" msgstr "" -#: ..\Client\core\CMainMenu.cpp:1154 ..\Client\core\CQuestionBox.cpp:194 -#: ..\Client\core\CSettings.cpp:1339 ..\Client\core\CSettings.cpp:1363 -#: ..\Client\core\CSettings.cpp:4364 ..\Client\core\CSettings.cpp:4431 -#: ..\Client\core\CSettings.cpp:4480 ..\Client\core\CVersionUpdater.cpp:1569 -#: ..\Client\core\CVersionUpdater.cpp:1587 -#: ..\Client\core\CVersionUpdater.cpp:1856 -#: ..\Client\core\CVersionUpdater.cpp:1875 -#: ..\Client\core\ServerBrowser\CServerInfo.cpp:479 -#: ..\Client\loader\Dialogs.cpp:32 +#: Client\core\CMainMenu.cpp:1154 Client\core\CQuestionBox.cpp:194 +#: Client\core\CSettings.cpp:1357 Client\core\CSettings.cpp:1381 +#: Client\core\CSettings.cpp:4382 Client\core\CSettings.cpp:4449 +#: Client\core\CSettings.cpp:4498 Client\core\CVersionUpdater.cpp:1569 +#: Client\core\CVersionUpdater.cpp:1587 Client\core\CVersionUpdater.cpp:1856 +#: Client\core\CVersionUpdater.cpp:1875 +#: Client\core\ServerBrowser\CServerInfo.cpp:479 Client\loader\Dialogs.cpp:32 msgid "No" msgstr "" @@ -607,817 +597,815 @@ msgstr "" #. #. #. ///////////////////////////////////////////////////////////////////////// -#: ..\Client\core\CMainMenu.cpp:1155 ..\Client\core\CQuestionBox.cpp:195 -#: ..\Client\core\CSettings.cpp:1340 ..\Client\core\CSettings.cpp:1364 -#: ..\Client\core\CSettings.cpp:4365 ..\Client\core\CSettings.cpp:4432 -#: ..\Client\core\CSettings.cpp:4481 ..\Client\core\CVersionUpdater.cpp:1570 -#: ..\Client\core\CVersionUpdater.cpp:1588 -#: ..\Client\core\CVersionUpdater.cpp:1857 -#: ..\Client\core\CVersionUpdater.cpp:1876 -#: ..\Client\core\ServerBrowser\CServerInfo.cpp:479 -#: ..\Client\gui\CGUIMessageBox_Impl.cpp:72 ..\Client\loader\Dialogs.cpp:31 +#: Client\core\CMainMenu.cpp:1155 Client\core\CQuestionBox.cpp:195 +#: Client\core\CSettings.cpp:1358 Client\core\CSettings.cpp:1382 +#: Client\core\CSettings.cpp:4383 Client\core\CSettings.cpp:4450 +#: Client\core\CSettings.cpp:4499 Client\core\CVersionUpdater.cpp:1570 +#: Client\core\CVersionUpdater.cpp:1588 Client\core\CVersionUpdater.cpp:1857 +#: Client\core\CVersionUpdater.cpp:1876 +#: Client\core\ServerBrowser\CServerInfo.cpp:479 +#: Client\gui\CGUIMessageBox_Impl.cpp:72 Client\loader\Dialogs.cpp:31 msgid "Yes" msgstr "" +#. Create the window +#: Client\core\CNewsBrowser.cpp:153 +msgid "NEWS" +msgstr "" + #. News link -#: ..\Client\core\CNewsBrowser.cpp:171 +#: Client\core\CNewsBrowser.cpp:171 msgid "Visit latest news article" msgstr "" -#: ..\Client\core\CQuestionBox.cpp:192 ..\Shared\sdk\SharedUtil.Misc.hpp:696 +#: Client\core\CQuestionBox.cpp:192 Shared\sdk\SharedUtil.Misc.hpp:696 msgid "Do you want to see some on-line help about this problem ?" msgstr "" -#: ..\Client\core\CScreenShot.cpp:53 +#: Client\core\CScreenShot.cpp:53 #, c-format msgid "Screenshot taken: '%s'" msgstr "" #. Create window (with frame) if it will fit inside the screen resolution -#: ..\Client\core\CSettings.cpp:83 +#: Client\core\CSettings.cpp:83 msgid "SETTINGS" msgstr "" -#: ..\Client\core\CSettings.cpp:115 +#: Client\core\CSettings.cpp:115 msgid "Multiplayer" msgstr "" -#: ..\Client\core\CSettings.cpp:116 +#: Client\core\CSettings.cpp:116 msgid "Video" msgstr "" -#: ..\Client\core\CSettings.cpp:117 +#: Client\core\CSettings.cpp:117 msgid "Audio" msgstr "" -#: ..\Client\core\CSettings.cpp:118 +#: Client\core\CSettings.cpp:118 msgid "Binds" msgstr "" -#: ..\Client\core\CSettings.cpp:119 +#: Client\core\CSettings.cpp:119 msgid "Controls" msgstr "" -#: ..\Client\core\CSettings.cpp:120 +#: Client\core\CSettings.cpp:120 msgid "Interface" msgstr "" -#: ..\Client\core\CSettings.cpp:121 +#: Client\core\CSettings.cpp:121 msgid "Web Browser" msgstr "" -#: ..\Client\core\CSettings.cpp:122 +#: Client\core\CSettings.cpp:122 msgid "Advanced" msgstr "" #. Create buttons #. OK button -#: ..\Client\core\CSettings.cpp:126 ..\Client\core\CSettings.cpp:4598 -#: ..\Client\core\CVersionUpdater.cpp:1605 -#: ..\Client\core\CVersionUpdater.cpp:1821 -#: ..\Client\core\CVersionUpdater.cpp:1914 -#: ..\Client\core\CVersionUpdater.cpp:1936 -#: ..\Client\core\CVersionUpdater.cpp:1954 -#: ..\Client\core\CVersionUpdater.cpp:1966 -#: ..\Client\core\CVersionUpdater.cpp:2118 -#: ..\Client\core\CVersionUpdater.cpp:2127 -#: ..\Client\core\CVersionUpdater.cpp:2136 -#: ..\Client\core\CVersionUpdater.cpp:2150 -#: ..\Client\gui\CGUIMessageBox_Impl.cpp:64 ..\Client\loader\Dialogs.cpp:33 +#: Client\core\CSettings.cpp:126 Client\core\CSettings.cpp:4642 +#: Client\core\CVersionUpdater.cpp:1605 Client\core\CVersionUpdater.cpp:1821 +#: Client\core\CVersionUpdater.cpp:1914 Client\core\CVersionUpdater.cpp:1936 +#: Client\core\CVersionUpdater.cpp:1954 Client\core\CVersionUpdater.cpp:1966 +#: Client\core\CVersionUpdater.cpp:2118 Client\core\CVersionUpdater.cpp:2127 +#: Client\core\CVersionUpdater.cpp:2136 Client\core\CVersionUpdater.cpp:2150 +#: Client\gui\CGUIMessageBox_Impl.cpp:64 Client\loader\Dialogs.cpp:33 msgid "OK" msgstr "" #. Cancel button -#: ..\Client\core\CSettings.cpp:131 ..\Client\core\CSettings.cpp:4597 -#: ..\Client\core\CVersionUpdater.cpp:1788 -#: ..\Client\core\CVersionUpdater.cpp:1804 -#: ..\Client\core\CVersionUpdater.cpp:1839 -#: ..\Client\gui\CGUIMessageBox_Impl.cpp:68 ..\Client\loader\Dialogs.cpp:36 -#: ..\Client\mods\deathmatch\logic\CLocalServer.cpp:123 +#: Client\core\CSettings.cpp:131 Client\core\CSettings.cpp:4641 +#: Client\core\CVersionUpdater.cpp:1788 Client\core\CVersionUpdater.cpp:1804 +#: Client\core\CVersionUpdater.cpp:1839 Client\gui\CGUIMessageBox_Impl.cpp:68 +#: Client\loader\Dialogs.cpp:36 +#: Client\mods\deathmatch\logic\CLocalServer.cpp:123 msgid "Cancel" msgstr "" -#: ..\Client\core\CSettings.cpp:146 ..\Client\core\CSettings.cpp:337 -#: ..\Client\core\CSettings.cpp:599 ..\Client\core\CSettings.cpp:858 +#: Client\core\CSettings.cpp:146 Client\core\CSettings.cpp:337 +#: Client\core\CSettings.cpp:599 Client\core\CSettings.cpp:858 msgid "Load defaults" msgstr "" #. * #. * Controls tab #. * -#: ..\Client\core\CSettings.cpp:156 ..\Client\core\CSettings.cpp:180 +#: Client\core\CSettings.cpp:156 Client\core\CSettings.cpp:180 msgid "Mouse sensitivity:" msgstr "" #. VerticalAimSensitivity -#: ..\Client\core\CSettings.cpp:156 ..\Client\core\CSettings.cpp:198 +#: Client\core\CSettings.cpp:156 Client\core\CSettings.cpp:198 msgid "Vertical aim sensitivity:" msgstr "" #. Mouse Options -#: ..\Client\core\CSettings.cpp:159 +#: Client\core\CSettings.cpp:159 msgid "Mouse options" msgstr "" -#: ..\Client\core\CSettings.cpp:166 +#: Client\core\CSettings.cpp:166 msgid "Invert mouse vertically" msgstr "" -#: ..\Client\core\CSettings.cpp:170 +#: Client\core\CSettings.cpp:170 msgid "Steer with mouse" msgstr "" -#: ..\Client\core\CSettings.cpp:174 +#: Client\core\CSettings.cpp:174 msgid "Fly with mouse" msgstr "" #. Joypad options -#: ..\Client\core\CSettings.cpp:216 +#: Client\core\CSettings.cpp:216 msgid "Joypad options" msgstr "" -#: ..\Client\core\CSettings.cpp:229 +#: Client\core\CSettings.cpp:229 msgid "Standard controls (Mouse + Keyboard)" msgstr "" -#: ..\Client\core\CSettings.cpp:236 +#: Client\core\CSettings.cpp:236 msgid "Classic controls (Joypad)" msgstr "" -#: ..\Client\core\CSettings.cpp:273 +#: Client\core\CSettings.cpp:273 msgid "Dead Zone" msgstr "" -#: ..\Client\core\CSettings.cpp:278 +#: Client\core\CSettings.cpp:278 msgid "Saturation" msgstr "" -#: ..\Client\core\CSettings.cpp:284 +#: Client\core\CSettings.cpp:284 msgid "Use the 'Binds' tab for joypad buttons." msgstr "" -#: ..\Client\core\CSettings.cpp:323 +#: Client\core\CSettings.cpp:323 msgid "Left Stick" msgstr "" -#: ..\Client\core\CSettings.cpp:329 +#: Client\core\CSettings.cpp:329 msgid "Right Stick" msgstr "" -#: ..\Client\core\CSettings.cpp:344 +#: Client\core\CSettings.cpp:344 msgid "DESCRIPTION" msgstr "" -#: ..\Client\core\CSettings.cpp:345 +#: Client\core\CSettings.cpp:345 msgid "KEY" msgstr "" -#: ..\Client\core\CSettings.cpp:347 +#: Client\core\CSettings.cpp:347 msgid "ALT. KEY" msgstr "" #. * #. * Multiplayer tab #. * -#: ..\Client\core\CSettings.cpp:352 ..\Client\core\CSettings.cpp:355 +#: Client\core\CSettings.cpp:352 Client\core\CSettings.cpp:355 msgid "Nick:" msgstr "" -#: ..\Client\core\CSettings.cpp:365 +#: Client\core\CSettings.cpp:365 msgid "Save server passwords" msgstr "" -#: ..\Client\core\CSettings.cpp:370 +#: Client\core\CSettings.cpp:370 msgid "Auto-refresh server browser" msgstr "" -#: ..\Client\core\CSettings.cpp:375 +#: Client\core\CSettings.cpp:375 msgid "Allow screen upload" msgstr "" -#: ..\Client\core\CSettings.cpp:380 +#: Client\core\CSettings.cpp:380 msgid "Allow external sounds" msgstr "" -#: ..\Client\core\CSettings.cpp:385 +#: Client\core\CSettings.cpp:385 msgid "Always show download window" msgstr "" -#: ..\Client\core\CSettings.cpp:390 +#: Client\core\CSettings.cpp:390 msgid "Use customized GTA:SA files" msgstr "" -#: ..\Client\core\CSettings.cpp:395 +#: Client\core\CSettings.cpp:395 msgid "Map rendering options" msgstr "" -#: ..\Client\core\CSettings.cpp:401 ..\Client\core\CSettings.cpp:610 +#: Client\core\CSettings.cpp:401 Client\core\CSettings.cpp:610 msgid "Opacity:" msgstr "" #. * #. * Audio tab #. * -#: ..\Client\core\CSettings.cpp:421 ..\Client\core\CSettings.cpp:430 +#: Client\core\CSettings.cpp:421 Client\core\CSettings.cpp:430 msgid "Master volume:" msgstr "" -#: ..\Client\core\CSettings.cpp:421 ..\Client\core\CSettings.cpp:449 +#: Client\core\CSettings.cpp:421 Client\core\CSettings.cpp:449 msgid "Radio volume:" msgstr "" -#: ..\Client\core\CSettings.cpp:421 ..\Client\core\CSettings.cpp:468 +#: Client\core\CSettings.cpp:421 Client\core\CSettings.cpp:468 msgid "SFX volume:" msgstr "" -#: ..\Client\core\CSettings.cpp:421 ..\Client\core\CSettings.cpp:487 +#: Client\core\CSettings.cpp:421 Client\core\CSettings.cpp:487 msgid "MTA volume:" msgstr "" -#: ..\Client\core\CSettings.cpp:422 ..\Client\core\CSettings.cpp:506 +#: Client\core\CSettings.cpp:422 Client\core\CSettings.cpp:506 msgid "Voice volume:" msgstr "" -#: ..\Client\core\CSettings.cpp:422 ..\Client\core\CSettings.cpp:547 +#: Client\core\CSettings.cpp:422 Client\core\CSettings.cpp:547 msgid "Play mode:" msgstr "" #. * #. * Webbrowser tab #. * -#: ..\Client\core\CSettings.cpp:424 ..\Client\core\CSettings.cpp:612 -#: ..\Client\core\CSettings.cpp:873 ..\Client\core\CSettings.cpp:1947 -#: ..\Client\mods\deathmatch\logic\CLocalServer.cpp:51 +#: Client\core\CSettings.cpp:424 Client\core\CSettings.cpp:612 +#: Client\core\CSettings.cpp:873 Client\core\CSettings.cpp:1965 +#: Client\mods\deathmatch\logic\CLocalServer.cpp:51 msgid "General" msgstr "" -#: ..\Client\core\CSettings.cpp:525 +#: Client\core\CSettings.cpp:525 msgid "Radio options" msgstr "" -#: ..\Client\core\CSettings.cpp:531 +#: Client\core\CSettings.cpp:531 msgid "Radio Equalizer" msgstr "" -#: ..\Client\core\CSettings.cpp:536 +#: Client\core\CSettings.cpp:536 msgid "Radio Auto-tune" msgstr "" -#: ..\Client\core\CSettings.cpp:541 +#: Client\core\CSettings.cpp:541 msgid "Usertrack options" msgstr "" -#: ..\Client\core\CSettings.cpp:555 ..\Client\core\CSettings.cpp:3005 +#: Client\core\CSettings.cpp:555 Client\core\CSettings.cpp:3023 msgid "Radio" msgstr "" -#: ..\Client\core\CSettings.cpp:556 ..\Client\core\CSettings.cpp:3007 +#: Client\core\CSettings.cpp:556 Client\core\CSettings.cpp:3025 msgid "Random" msgstr "" -#: ..\Client\core\CSettings.cpp:557 ..\Client\core\CSettings.cpp:3009 +#: Client\core\CSettings.cpp:557 Client\core\CSettings.cpp:3027 msgid "Sequential" msgstr "" -#: ..\Client\core\CSettings.cpp:560 +#: Client\core\CSettings.cpp:560 msgid "Automatic Media Scan" msgstr "" -#: ..\Client\core\CSettings.cpp:567 +#: Client\core\CSettings.cpp:567 msgid "Mute options" msgstr "" -#: ..\Client\core\CSettings.cpp:573 +#: Client\core\CSettings.cpp:573 msgid "Mute All sounds when minimized" msgstr "" -#: ..\Client\core\CSettings.cpp:578 +#: Client\core\CSettings.cpp:578 msgid "Mute Radio sounds when minimized" msgstr "" -#: ..\Client\core\CSettings.cpp:583 +#: Client\core\CSettings.cpp:583 msgid "Mute SFX sounds when minimized" msgstr "" -#: ..\Client\core\CSettings.cpp:588 +#: Client\core\CSettings.cpp:588 msgid "Mute MTA sounds when minimized" msgstr "" -#: ..\Client\core\CSettings.cpp:593 +#: Client\core\CSettings.cpp:593 msgid "Mute Voice sounds when minimized" msgstr "" #. * #. * Video tab #. * -#: ..\Client\core\CSettings.cpp:609 ..\Client\core\CSettings.cpp:618 +#: Client\core\CSettings.cpp:609 Client\core\CSettings.cpp:618 msgid "Resolution:" msgstr "" -#: ..\Client\core\CSettings.cpp:609 ..\Client\core\CSettings.cpp:665 +#: Client\core\CSettings.cpp:609 Client\core\CSettings.cpp:665 msgid "FOV:" msgstr "" -#: ..\Client\core\CSettings.cpp:609 ..\Client\core\CSettings.cpp:681 +#: Client\core\CSettings.cpp:609 Client\core\CSettings.cpp:681 msgid "Draw Distance:" msgstr "" -#: ..\Client\core\CSettings.cpp:609 ..\Client\core\CSettings.cpp:699 +#: Client\core\CSettings.cpp:609 Client\core\CSettings.cpp:699 msgid "Brightness:" msgstr "" -#: ..\Client\core\CSettings.cpp:609 ..\Client\core\CSettings.cpp:717 +#: Client\core\CSettings.cpp:609 Client\core\CSettings.cpp:717 msgid "FX Quality:" msgstr "" -#: ..\Client\core\CSettings.cpp:610 ..\Client\core\CSettings.cpp:731 +#: Client\core\CSettings.cpp:610 Client\core\CSettings.cpp:731 msgid "Anisotropic filtering:" msgstr "" -#: ..\Client\core\CSettings.cpp:610 ..\Client\core\CSettings.cpp:758 +#: Client\core\CSettings.cpp:610 Client\core\CSettings.cpp:758 msgid "Anti-aliasing:" msgstr "" -#: ..\Client\core\CSettings.cpp:610 ..\Client\core\CSettings.cpp:772 +#: Client\core\CSettings.cpp:610 Client\core\CSettings.cpp:772 msgid "Aspect Ratio:" msgstr "" -#: ..\Client\core\CSettings.cpp:630 +#: Client\core\CSettings.cpp:630 msgid "Windowed" msgstr "" -#: ..\Client\core\CSettings.cpp:636 +#: Client\core\CSettings.cpp:636 msgid "DPI aware" msgstr "" -#: ..\Client\core\CSettings.cpp:644 ..\Client\core\CSettings.cpp:959 -#: ..\Client\loader\MainFunctions.cpp:380 +#: Client\core\CSettings.cpp:644 Client\core\CSettings.cpp:973 +#: Client\loader\MainFunctions.cpp:380 msgid "Fullscreen mode:" msgstr "" -#: ..\Client\core\CSettings.cpp:651 ..\Client\core\CSettings.cpp:1546 +#: Client\core\CSettings.cpp:651 Client\core\CSettings.cpp:1564 msgid "Standard" msgstr "" -#: ..\Client\core\CSettings.cpp:652 ..\Client\core\CSettings.cpp:1548 -#: ..\Client\loader\MainFunctions.cpp:380 +#: Client\core\CSettings.cpp:652 Client\core\CSettings.cpp:1566 +#: Client\loader\MainFunctions.cpp:380 msgid "Borderless window" msgstr "" -#: ..\Client\core\CSettings.cpp:653 ..\Client\core\CSettings.cpp:1550 +#: Client\core\CSettings.cpp:653 Client\core\CSettings.cpp:1568 msgid "Borderless keep res" msgstr "" -#: ..\Client\core\CSettings.cpp:657 +#: Client\core\CSettings.cpp:657 msgid "Mip Mapping" msgstr "" -#: ..\Client\core\CSettings.cpp:725 ..\Client\core\CSettings.cpp:1468 +#: Client\core\CSettings.cpp:725 Client\core\CSettings.cpp:1486 msgid "Low" msgstr "" -#: ..\Client\core\CSettings.cpp:726 ..\Client\core\CSettings.cpp:1470 +#: Client\core\CSettings.cpp:726 Client\core\CSettings.cpp:1488 msgid "Medium" msgstr "" -#: ..\Client\core\CSettings.cpp:727 ..\Client\core\CSettings.cpp:1041 -#: ..\Client\core\CSettings.cpp:1472 ..\Client\core\CSettings.cpp:3063 +#: Client\core\CSettings.cpp:727 Client\core\CSettings.cpp:1055 +#: Client\core\CSettings.cpp:1490 Client\core\CSettings.cpp:3081 msgid "High" msgstr "" -#: ..\Client\core\CSettings.cpp:728 ..\Client\core\CSettings.cpp:1474 +#: Client\core\CSettings.cpp:728 Client\core\CSettings.cpp:1492 msgid "Very high" msgstr "" -#: ..\Client\core\CSettings.cpp:743 ..\Client\core\CSettings.cpp:766 -#: ..\Client\core\CSettings.cpp:972 ..\Client\core\CSettings.cpp:1026 -#: ..\Client\core\CSettings.cpp:1157 ..\Client\core\CSettings.cpp:1478 -#: ..\Client\core\CSettings.cpp:3070 ..\Client\core\CSettings.cpp:3102 -#: ..\Client\core\CSettings.cpp:3124 ..\Client\core\CSettings.cpp:4112 +#: Client\core\CSettings.cpp:743 Client\core\CSettings.cpp:766 +#: Client\core\CSettings.cpp:986 Client\core\CSettings.cpp:1040 +#: Client\core\CSettings.cpp:1171 Client\core\CSettings.cpp:1496 +#: Client\core\CSettings.cpp:3088 Client\core\CSettings.cpp:3120 +#: Client\core\CSettings.cpp:3142 Client\core\CSettings.cpp:4130 msgid "Off" msgstr "" -#: ..\Client\core\CSettings.cpp:767 ..\Client\core\CSettings.cpp:1480 +#: Client\core\CSettings.cpp:767 Client\core\CSettings.cpp:1498 msgid "1x" msgstr "" -#: ..\Client\core\CSettings.cpp:768 ..\Client\core\CSettings.cpp:1482 +#: Client\core\CSettings.cpp:768 Client\core\CSettings.cpp:1500 msgid "2x" msgstr "" -#: ..\Client\core\CSettings.cpp:769 ..\Client\core\CSettings.cpp:1484 +#: Client\core\CSettings.cpp:769 Client\core\CSettings.cpp:1502 msgid "3x" msgstr "" -#: ..\Client\core\CSettings.cpp:782 ..\Client\core\CSettings.cpp:974 -#: ..\Client\core\CSettings.cpp:1490 ..\Client\core\CSettings.cpp:3072 +#: Client\core\CSettings.cpp:782 Client\core\CSettings.cpp:988 +#: Client\core\CSettings.cpp:1508 Client\core\CSettings.cpp:3090 msgid "Auto" msgstr "" -#: ..\Client\core\CSettings.cpp:783 ..\Client\core\CSettings.cpp:1492 +#: Client\core\CSettings.cpp:783 Client\core\CSettings.cpp:1510 msgid "4:3" msgstr "" -#: ..\Client\core\CSettings.cpp:784 ..\Client\core\CSettings.cpp:1494 +#: Client\core\CSettings.cpp:784 Client\core\CSettings.cpp:1512 msgid "16:10" msgstr "" -#: ..\Client\core\CSettings.cpp:785 ..\Client\core\CSettings.cpp:1496 +#: Client\core\CSettings.cpp:785 Client\core\CSettings.cpp:1514 msgid "16:9" msgstr "" -#: ..\Client\core\CSettings.cpp:788 +#: Client\core\CSettings.cpp:788 msgid "HUD Match Aspect Ratio" msgstr "" -#: ..\Client\core\CSettings.cpp:794 +#: Client\core\CSettings.cpp:794 msgid "Volumetric Shadows" msgstr "" -#: ..\Client\core\CSettings.cpp:798 +#: Client\core\CSettings.cpp:798 msgid "Grass effect" msgstr "" -#: ..\Client\core\CSettings.cpp:802 +#: Client\core\CSettings.cpp:802 msgid "Heat haze" msgstr "" -#: ..\Client\core\CSettings.cpp:806 +#: Client\core\CSettings.cpp:806 msgid "Tyre Smoke etc" msgstr "" -#: ..\Client\core\CSettings.cpp:810 +#: Client\core\CSettings.cpp:810 msgid "Render vehicles always in high detail" msgstr "" -#: ..\Client\core\CSettings.cpp:814 +#: Client\core\CSettings.cpp:814 msgid "Render peds always in high detail" msgstr "" -#: ..\Client\core\CSettings.cpp:819 +#: Client\core\CSettings.cpp:819 msgid "Full Screen Minimize" msgstr "" -#: ..\Client\core\CSettings.cpp:831 +#: Client\core\CSettings.cpp:831 msgid "Enable Device Selection Dialog" msgstr "" -#: ..\Client\core\CSettings.cpp:843 +#: Client\core\CSettings.cpp:843 msgid "Show unsafe resolutions" msgstr "" -#: ..\Client\core\CSettings.cpp:879 +#: Client\core\CSettings.cpp:879 msgid "Enable remote websites" msgstr "" -#: ..\Client\core\CSettings.cpp:884 +#: Client\core\CSettings.cpp:884 msgid "Enable Javascript on remote websites" msgstr "" -#: ..\Client\core\CSettings.cpp:889 +#: Client\core\CSettings.cpp:889 msgid "Custom blacklist" msgstr "" -#: ..\Client\core\CSettings.cpp:899 ..\Client\core\CSettings.cpp:927 +#: Client\core\CSettings.cpp:900 Client\core\CSettings.cpp:935 msgid "Enter a domain e.g. google.com" msgstr "" -#: ..\Client\core\CSettings.cpp:901 +#: Client\core\CSettings.cpp:908 msgid "Block" msgstr "" -#: ..\Client\core\CSettings.cpp:909 ..\Client\core\CSettings.cpp:937 +#: Client\core\CSettings.cpp:916 Client\core\CSettings.cpp:951 msgid "Domain" msgstr "" -#: ..\Client\core\CSettings.cpp:911 ..\Client\core\CSettings.cpp:939 +#: Client\core\CSettings.cpp:918 Client\core\CSettings.cpp:953 msgid "Remove domain" msgstr "" #. Reset vecTemp -#: ..\Client\core\CSettings.cpp:917 +#: Client\core\CSettings.cpp:924 msgid "Custom whitelist" msgstr "" #. Misc section label -#: ..\Client\core\CSettings.cpp:952 +#: Client\core\CSettings.cpp:966 msgid "Misc" msgstr "" #. Fast clothes loading -#: ..\Client\core\CSettings.cpp:958 ..\Client\core\CSettings.cpp:965 -#: ..\Client\core\CSettings.cpp:4616 +#: Client\core\CSettings.cpp:972 Client\core\CSettings.cpp:979 +#: Client\core\CSettings.cpp:4660 msgid "Fast CJ clothes loading:" msgstr "" #. Browser scan speed -#: ..\Client\core\CSettings.cpp:958 ..\Client\core\CSettings.cpp:979 -#: ..\Client\core\CSettings.cpp:4618 +#: Client\core\CSettings.cpp:972 Client\core\CSettings.cpp:993 +#: Client\core\CSettings.cpp:4662 msgid "Browser speed:" msgstr "" #. Single download -#: ..\Client\core\CSettings.cpp:958 ..\Client\core\CSettings.cpp:993 -#: ..\Client\core\CSettings.cpp:4620 +#: Client\core\CSettings.cpp:972 Client\core\CSettings.cpp:1007 +#: Client\core\CSettings.cpp:4664 msgid "Single connection:" msgstr "" #. Packet tag -#: ..\Client\core\CSettings.cpp:958 ..\Client\core\CSettings.cpp:1006 -#: ..\Client\core\CSettings.cpp:4622 +#: Client\core\CSettings.cpp:972 Client\core\CSettings.cpp:1020 +#: Client\core\CSettings.cpp:4666 msgid "Packet tag:" msgstr "" #. Progress animation -#: ..\Client\core\CSettings.cpp:959 ..\Client\core\CSettings.cpp:1019 -#: ..\Client\core\CSettings.cpp:4624 +#: Client\core\CSettings.cpp:973 Client\core\CSettings.cpp:1033 +#: Client\core\CSettings.cpp:4668 msgid "Progress animation:" msgstr "" #. Process priority -#: ..\Client\core\CSettings.cpp:959 ..\Client\core\CSettings.cpp:1032 -#: ..\Client\core\CSettings.cpp:4614 +#: Client\core\CSettings.cpp:973 Client\core\CSettings.cpp:1046 +#: Client\core\CSettings.cpp:4658 msgid "Process priority:" msgstr "" #. Debug setting -#: ..\Client\core\CSettings.cpp:959 ..\Client\core\CSettings.cpp:1046 -#: ..\Client\core\CSettings.cpp:4626 +#: Client\core\CSettings.cpp:973 Client\core\CSettings.cpp:1060 +#: Client\core\CSettings.cpp:4670 msgid "Debug setting:" msgstr "" #. Streaming memory -#: ..\Client\core\CSettings.cpp:960 ..\Client\core\CSettings.cpp:1069 -#: ..\Client\core\CSettings.cpp:4628 +#: Client\core\CSettings.cpp:974 Client\core\CSettings.cpp:1083 +#: Client\core\CSettings.cpp:4672 msgid "Streaming memory:" msgstr "" #. Update build type -#: ..\Client\core\CSettings.cpp:960 ..\Client\core\CSettings.cpp:1171 +#: Client\core\CSettings.cpp:974 Client\core\CSettings.cpp:1185 msgid "Update build type:" msgstr "" #. UpdateAutoInstall -#: ..\Client\core\CSettings.cpp:960 ..\Client\core\CSettings.cpp:1150 +#: Client\core\CSettings.cpp:974 Client\core\CSettings.cpp:1164 msgid "Install important updates:" msgstr "" -#: ..\Client\core\CSettings.cpp:973 ..\Client\core\CSettings.cpp:1001 -#: ..\Client\core\CSettings.cpp:1014 ..\Client\core\CSettings.cpp:3074 -#: ..\Client\core\CSettings.cpp:3090 ..\Client\core\CSettings.cpp:3097 +#: Client\core\CSettings.cpp:987 Client\core\CSettings.cpp:1015 +#: Client\core\CSettings.cpp:1028 Client\core\CSettings.cpp:3092 +#: Client\core\CSettings.cpp:3108 Client\core\CSettings.cpp:3115 msgid "On" msgstr "" -#: ..\Client\core\CSettings.cpp:986 ..\Client\core\CSettings.cpp:3079 +#: Client\core\CSettings.cpp:1000 Client\core\CSettings.cpp:3097 msgid "Very slow" msgstr "" -#: ..\Client\core\CSettings.cpp:987 ..\Client\core\CSettings.cpp:1000 -#: ..\Client\core\CSettings.cpp:1013 ..\Client\core\CSettings.cpp:1027 -#: ..\Client\core\CSettings.cpp:1053 ..\Client\core\CSettings.cpp:1065 -#: ..\Client\core\CSettings.cpp:1158 ..\Client\core\CSettings.cpp:1178 -#: ..\Client\core\CSettings.cpp:3081 ..\Client\core\CSettings.cpp:3088 -#: ..\Client\core\CSettings.cpp:3095 ..\Client\core\CSettings.cpp:3104 -#: ..\Client\core\CSettings.cpp:3117 +#: Client\core\CSettings.cpp:1001 Client\core\CSettings.cpp:1014 +#: Client\core\CSettings.cpp:1027 Client\core\CSettings.cpp:1041 +#: Client\core\CSettings.cpp:1067 Client\core\CSettings.cpp:1079 +#: Client\core\CSettings.cpp:1172 Client\core\CSettings.cpp:1192 +#: Client\core\CSettings.cpp:3099 Client\core\CSettings.cpp:3106 +#: Client\core\CSettings.cpp:3113 Client\core\CSettings.cpp:3122 +#: Client\core\CSettings.cpp:3135 msgid "Default" msgstr "" -#: ..\Client\core\CSettings.cpp:988 ..\Client\core\CSettings.cpp:3083 +#: Client\core\CSettings.cpp:1002 Client\core\CSettings.cpp:3101 msgid "Fast" msgstr "" -#: ..\Client\core\CSettings.cpp:1039 ..\Client\core\CSettings.cpp:3059 +#: Client\core\CSettings.cpp:1053 Client\core\CSettings.cpp:3077 msgid "Normal" msgstr "" -#: ..\Client\core\CSettings.cpp:1040 ..\Client\core\CSettings.cpp:3061 +#: Client\core\CSettings.cpp:1054 Client\core\CSettings.cpp:3079 msgid "Above normal" msgstr "" -#: ..\Client\core\CSettings.cpp:1076 +#: Client\core\CSettings.cpp:1090 msgid "Min" msgstr "" -#: ..\Client\core\CSettings.cpp:1089 +#: Client\core\CSettings.cpp:1103 msgid "Max" msgstr "" #. Windows 8 compatibility -#: ..\Client\core\CSettings.cpp:1096 +#: Client\core\CSettings.cpp:1110 msgid "Windows 8 compatibility:" msgstr "" -#: ..\Client\core\CSettings.cpp:1101 +#: Client\core\CSettings.cpp:1115 msgid "16-bit color" msgstr "" -#: ..\Client\core\CSettings.cpp:1106 +#: Client\core\CSettings.cpp:1120 msgid "Mouse fix" msgstr "" #. Cache path info -#: ..\Client\core\CSettings.cpp:1124 +#: Client\core\CSettings.cpp:1138 msgid "Client resource files:" msgstr "" -#: ..\Client\core\CSettings.cpp:1128 +#: Client\core\CSettings.cpp:1142 msgid "Show in Explorer" msgstr "" #. Auto updater section label -#: ..\Client\core\CSettings.cpp:1143 ..\Client\core\CSettings.cpp:1146 +#: Client\core\CSettings.cpp:1157 Client\core\CSettings.cpp:1160 msgid "Auto updater" msgstr "" #. Check for updates -#: ..\Client\core\CSettings.cpp:1184 +#: Client\core\CSettings.cpp:1198 msgid "Check for update now" msgstr "" -#: ..\Client\core\CSettings.cpp:1333 +#: Client\core\CSettings.cpp:1351 msgid "Some settings will be changed when you next start MTA" msgstr "" -#: ..\Client\core\CSettings.cpp:1334 +#: Client\core\CSettings.cpp:1352 msgid "" "\n" "\n" "Do you want to restart now?" msgstr "" -#: ..\Client\core\CSettings.cpp:1337 +#: Client\core\CSettings.cpp:1355 msgid "RESTART REQUIRED" msgstr "" -#: ..\Client\core\CSettings.cpp:1357 +#: Client\core\CSettings.cpp:1375 msgid "Some settings will be changed when you disconnect the current server" msgstr "" -#: ..\Client\core\CSettings.cpp:1358 +#: Client\core\CSettings.cpp:1376 msgid "" "\n" "\n" "Do you want to disconnect now?" msgstr "" -#: ..\Client\core\CSettings.cpp:1361 +#: Client\core\CSettings.cpp:1379 msgid "DISCONNECT REQUIRED" msgstr "" #. Update the joystick name -#: ..\Client\core\CSettings.cpp:1670 +#: Client\core\CSettings.cpp:1688 msgid "Joypad not detected - Check connections and restart game" msgstr "" -#: ..\Client\core\CSettings.cpp:1861 +#: Client\core\CSettings.cpp:1879 msgid "Binding axis" msgstr "" -#: ..\Client\core\CSettings.cpp:1861 +#: Client\core\CSettings.cpp:1879 msgid "Move an axis to bind, or escape to clear" msgstr "" -#: ..\Client\core\CSettings.cpp:1938 +#: Client\core\CSettings.cpp:1956 msgid "Language:" msgstr "" -#: ..\Client\core\CSettings.cpp:1938 +#: Client\core\CSettings.cpp:1956 msgid "Skin:" msgstr "" -#: ..\Client\core\CSettings.cpp:1938 +#: Client\core\CSettings.cpp:1956 msgid "Presets:" msgstr "" -#: ..\Client\core\CSettings.cpp:1987 +#: Client\core\CSettings.cpp:2005 msgid "Chat" msgstr "" -#: ..\Client\core\CSettings.cpp:2004 +#: Client\core\CSettings.cpp:2022 msgid "Load" msgstr "" -#: ..\Client\core\CSettings.cpp:2016 +#: Client\core\CSettings.cpp:2034 msgid "Colors" msgstr "" -#: ..\Client\core\CSettings.cpp:2017 +#: Client\core\CSettings.cpp:2035 msgid "Layout" msgstr "" -#: ..\Client\core\CSettings.cpp:2018 ..\Client\core\CSettings.cpp:2264 +#: Client\core\CSettings.cpp:2036 Client\core\CSettings.cpp:2282 msgid "Options" msgstr "" -#: ..\Client\core\CSettings.cpp:2024 +#: Client\core\CSettings.cpp:2042 msgid "Chat Background" msgstr "" -#: ..\Client\core\CSettings.cpp:2024 +#: Client\core\CSettings.cpp:2042 msgid "Chat Text" msgstr "" -#: ..\Client\core\CSettings.cpp:2024 +#: Client\core\CSettings.cpp:2042 msgid "Input Background" msgstr "" -#: ..\Client\core\CSettings.cpp:2024 +#: Client\core\CSettings.cpp:2042 msgid "Input Text" msgstr "" -#: ..\Client\core\CSettings.cpp:2047 +#: Client\core\CSettings.cpp:2065 msgid "Lines:" msgstr "" -#: ..\Client\core\CSettings.cpp:2047 +#: Client\core\CSettings.cpp:2065 msgid "Scale:" msgstr "" -#: ..\Client\core\CSettings.cpp:2047 +#: Client\core\CSettings.cpp:2065 msgid "Width:" msgstr "" -#: ..\Client\core\CSettings.cpp:2050 +#: Client\core\CSettings.cpp:2068 msgid "Size" msgstr "" -#: ..\Client\core\CSettings.cpp:2099 +#: Client\core\CSettings.cpp:2117 msgid "after" msgstr "" -#: ..\Client\core\CSettings.cpp:2099 +#: Client\core\CSettings.cpp:2117 msgid "for" msgstr "" -#: ..\Client\core\CSettings.cpp:2099 +#: Client\core\CSettings.cpp:2117 msgid "sec" msgstr "" -#: ..\Client\core\CSettings.cpp:2102 +#: Client\core\CSettings.cpp:2120 msgid "Fading" msgstr "" -#: ..\Client\core\CSettings.cpp:2108 +#: Client\core\CSettings.cpp:2126 msgid "Fade out old lines" msgstr "" -#: ..\Client\core\CSettings.cpp:2148 +#: Client\core\CSettings.cpp:2166 msgid "Horizontal:" msgstr "" -#: ..\Client\core\CSettings.cpp:2148 +#: Client\core\CSettings.cpp:2166 msgid "Vertical:" msgstr "" -#: ..\Client\core\CSettings.cpp:2148 +#: Client\core\CSettings.cpp:2166 msgid "Text-Align:" msgstr "" -#: ..\Client\core\CSettings.cpp:2148 +#: Client\core\CSettings.cpp:2166 msgid "X-Offset:" msgstr "" -#: ..\Client\core\CSettings.cpp:2149 +#: Client\core\CSettings.cpp:2167 msgid "Y-Offset:" msgstr "" -#: ..\Client\core\CSettings.cpp:2155 +#: Client\core\CSettings.cpp:2173 msgid "Position" msgstr "" -#: ..\Client\core\CSettings.cpp:2170 ..\Client\core\CSettings.cpp:2184 +#: Client\core\CSettings.cpp:2188 Client\core\CSettings.cpp:2202 msgid "Center" msgstr "" -#: ..\Client\core\CSettings.cpp:2183 +#: Client\core\CSettings.cpp:2201 msgid "Top" msgstr "" -#: ..\Client\core\CSettings.cpp:2185 +#: Client\core\CSettings.cpp:2203 msgid "Bottom" msgstr "" -#: ..\Client\core\CSettings.cpp:2233 +#: Client\core\CSettings.cpp:2251 msgid "Font" msgstr "" -#: ..\Client\core\CSettings.cpp:2270 +#: Client\core\CSettings.cpp:2288 msgid "Hide background when not typing" msgstr "" -#: ..\Client\core\CSettings.cpp:2275 +#: Client\core\CSettings.cpp:2293 msgid "Nickname completion using the \"Tab\" key" msgstr "" -#: ..\Client\core\CSettings.cpp:2280 +#: Client\core\CSettings.cpp:2298 msgid "Allow server to flash the window" msgstr "" -#: ..\Client\core\CSettings.cpp:2285 +#: Client\core\CSettings.cpp:2303 msgid "Allow tray balloon notifications" msgstr "" -#: ..\Client\core\CSettings.cpp:2290 +#: Client\core\CSettings.cpp:2308 msgid "Chat text black/white outline" msgstr "" @@ -1425,85 +1413,85 @@ msgstr "" #. SString strText = SString::Printf ( "Press a key to bind to '%s'", pItemBind->GetText ().c_str () ); #. Create a messagebox to notify the user #. sSString strText = SString::Printf ( "Press a key to bind to '%s'", pItemBind->GetText ().c_str () ); -#: ..\Client\core\CSettings.cpp:2539 ..\Client\core\CSettings.cpp:2546 +#: Client\core\CSettings.cpp:2557 Client\core\CSettings.cpp:2564 msgid "Press a key to bind, or escape to clear" msgstr "" -#: ..\Client\core\CSettings.cpp:2540 +#: Client\core\CSettings.cpp:2558 msgid "Binding a primary key" msgstr "" -#: ..\Client\core\CSettings.cpp:2547 +#: Client\core\CSettings.cpp:2565 msgid "Binding a secondary key" msgstr "" -#: ..\Client\core\CSettings.cpp:2623 +#: Client\core\CSettings.cpp:2641 msgid "GTA GAME CONTROLS" msgstr "" -#: ..\Client\core\CSettings.cpp:2625 +#: Client\core\CSettings.cpp:2643 msgid "MULTIPLAYER CONTROLS" msgstr "" -#: ..\Client\core\CSettings.cpp:2870 ..\Client\core\CSettings.cpp:4577 +#: Client\core\CSettings.cpp:2888 Client\core\CSettings.cpp:4621 msgid "Your nickname contains invalid characters!" msgstr "" -#: ..\Client\core\CSettings.cpp:3656 +#: Client\core\CSettings.cpp:3674 msgid "Red:" msgstr "" -#: ..\Client\core\CSettings.cpp:3656 +#: Client\core\CSettings.cpp:3674 msgid "Green:" msgstr "" -#: ..\Client\core\CSettings.cpp:3656 +#: Client\core\CSettings.cpp:3674 msgid "Blue:" msgstr "" -#: ..\Client\core\CSettings.cpp:3656 +#: Client\core\CSettings.cpp:3674 msgid "Transparency:" msgstr "" -#: ..\Client\core\CSettings.cpp:3659 +#: Client\core\CSettings.cpp:3677 msgid "Color" msgstr "" -#: ..\Client\core\CSettings.cpp:3736 +#: Client\core\CSettings.cpp:3754 msgid "Preview" msgstr "" -#: ..\Client\core\CSettings.cpp:4044 +#: Client\core\CSettings.cpp:4062 msgid "Please disconnect before changing language" msgstr "" -#: ..\Client\core\CSettings.cpp:4072 +#: Client\core\CSettings.cpp:4090 msgid "Please disconnect before changing skin" msgstr "" -#: ..\Client\core\CSettings.cpp:4358 +#: Client\core\CSettings.cpp:4376 msgid "" "Volmetric shadows can cause some systems to slow down.\n" "\n" "Are you sure you want to enable them?" msgstr "" -#: ..\Client\core\CSettings.cpp:4362 +#: Client\core\CSettings.cpp:4380 msgid "PERFORMANCE WARNING" msgstr "" -#: ..\Client\core\CSettings.cpp:4382 +#: Client\core\CSettings.cpp:4400 msgid "" "Screen upload is required by some servers for anti-cheat purposes.\n" "\n" "(The chat box and GUI is excluded from the upload)\n" msgstr "" -#: ..\Client\core\CSettings.cpp:4384 +#: Client\core\CSettings.cpp:4402 msgid "SCREEN UPLOAD INFORMATION" msgstr "" -#: ..\Client\core\CSettings.cpp:4399 +#: Client\core\CSettings.cpp:4417 msgid "" "Some scripts may play sounds, such as radio, from the internet.\n" "\n" @@ -1511,11 +1499,11 @@ msgid "" "bandwidth consumption.\n" msgstr "" -#: ..\Client\core\CSettings.cpp:4402 +#: Client\core\CSettings.cpp:4420 msgid "EXTERNAL SOUNDS" msgstr "" -#: ..\Client\core\CSettings.cpp:4423 +#: Client\core\CSettings.cpp:4441 msgid "" "Some files in your GTA:SA data directory are customized.\n" "MTA will only use these modified files if this check box is ticked.\n" @@ -1525,11 +1513,11 @@ msgid "" "Are you sure you want to use them?" msgstr "" -#: ..\Client\core\CSettings.cpp:4429 ..\Client\core\CVersionUpdater.cpp:2079 +#: Client\core\CSettings.cpp:4447 Client\core\CVersionUpdater.cpp:2079 msgid "CUSTOMIZED GTA:SA FILES" msgstr "" -#: ..\Client\core\CSettings.cpp:4472 +#: Client\core\CSettings.cpp:4490 msgid "" "Enabling DPI awareness is an experimental feature and\n" "we only recommend it when you play MTA:SA on a scaled monitor.\n" @@ -1538,96 +1526,95 @@ msgid "" "Are you sure you want to enable this option?" msgstr "" -#: ..\Client\core\CSettings.cpp:4478 +#: Client\core\CSettings.cpp:4496 msgid "EXPERIMENTAL FEATURE" msgstr "" -#: ..\Client\core\CSettings.cpp:4595 +#: Client\core\CSettings.cpp:4639 msgid "Please enter a nickname" msgstr "" -#: ..\Client\core\CSettings.cpp:4596 +#: Client\core\CSettings.cpp:4640 msgid "" "Please enter a nickname to be used ingame. \n" "This will be your name when you connect to and play in a server" msgstr "" -#: ..\Client\core\CSettings.cpp:4614 +#: Client\core\CSettings.cpp:4658 msgid "Very experimental feature." msgstr "" -#: ..\Client\core\CSettings.cpp:4616 +#: Client\core\CSettings.cpp:4660 msgid "Stops stalls with CJ variations (Uses 65MB more RAM)" msgstr "" -#: ..\Client\core\CSettings.cpp:4618 +#: Client\core\CSettings.cpp:4662 msgid "Older routers may require a slower scan speed." msgstr "" -#: ..\Client\core\CSettings.cpp:4620 +#: Client\core\CSettings.cpp:4664 msgid "Switch on to use only one connection when downloading." msgstr "" -#: ..\Client\core\CSettings.cpp:4622 +#: Client\core\CSettings.cpp:4666 msgid "Tag network packets to help ISPs identify MTA traffic." msgstr "" -#: ..\Client\core\CSettings.cpp:4624 +#: Client\core\CSettings.cpp:4668 msgid "Spinning circle animation at the bottom of the screen" msgstr "" -#: ..\Client\core\CSettings.cpp:4626 +#: Client\core\CSettings.cpp:4670 msgid "Select default always. (This setting is not saved)" msgstr "" -#: ..\Client\core\CSettings.cpp:4628 +#: Client\core\CSettings.cpp:4672 msgid "Maximum is usually best" msgstr "" -#: ..\Client\core\CSettings.cpp:4630 ..\Client\core\CSettings.cpp:4632 +#: Client\core\CSettings.cpp:4674 Client\core\CSettings.cpp:4676 msgid "Auto updater:" msgstr "" -#: ..\Client\core\CSettings.cpp:4630 +#: Client\core\CSettings.cpp:4674 msgid "Select default unless you like filling out bug reports." msgstr "" -#: ..\Client\core\CSettings.cpp:4632 +#: Client\core\CSettings.cpp:4676 msgid "Select default to automatically install important updates." msgstr "" -#: ..\Client\core\CSettings.cpp:4634 +#: Client\core\CSettings.cpp:4678 msgid "16-bit color:" msgstr "" -#: ..\Client\core\CSettings.cpp:4634 +#: Client\core\CSettings.cpp:4678 msgid "Enable 16 bit color modes - Requires MTA restart" msgstr "" -#: ..\Client\core\CSettings.cpp:4636 +#: Client\core\CSettings.cpp:4680 msgid "Mouse fix:" msgstr "" -#: ..\Client\core\CSettings.cpp:4636 +#: Client\core\CSettings.cpp:4680 msgid "Mouse movement fix - May need PC restart" msgstr "" -#: ..\Client\core\CVersionUpdater.cpp:624 +#: Client\core\CVersionUpdater.cpp:624 msgid "Busy" msgstr "" -#: ..\Client\core\CVersionUpdater.cpp:624 +#: Client\core\CVersionUpdater.cpp:624 msgid "Can't check for updates right now" msgstr "" -#: ..\Client\core\CVersionUpdater.cpp:1565 -#: ..\Client\core\CVersionUpdater.cpp:1585 -#: ..\Client\core\CVersionUpdater.cpp:1603 +#: Client\core\CVersionUpdater.cpp:1565 Client\core\CVersionUpdater.cpp:1585 +#: Client\core\CVersionUpdater.cpp:1603 #, c-format msgid "MTA:SA %s required" msgstr "" -#: ..\Client\core\CVersionUpdater.cpp:1566 +#: Client\core\CVersionUpdater.cpp:1566 #, c-format msgid "" "An updated version of MTA:SA %s is required to join the selected server.\n" @@ -1635,123 +1622,113 @@ msgid "" "Do you want to download and install MTA:SA %s ?" msgstr "" -#: ..\Client\core\CVersionUpdater.cpp:1586 +#: Client\core\CVersionUpdater.cpp:1586 #, c-format msgid "Do you want to launch MTA:SA %s and connect to this server ?" msgstr "" -#: ..\Client\core\CVersionUpdater.cpp:1604 +#: Client\core\CVersionUpdater.cpp:1604 msgid "" "It is not possible to connect at this time.\n" "\n" "Please try later." msgstr "" -#: ..\Client\core\CVersionUpdater.cpp:1786 +#: Client\core\CVersionUpdater.cpp:1786 msgid "Connecting" msgstr "" -#: ..\Client\core\CVersionUpdater.cpp:1787 -#: ..\Client\core\CVersionUpdater.cpp:1803 +#: Client\core\CVersionUpdater.cpp:1787 Client\core\CVersionUpdater.cpp:1803 msgid "Please wait..." msgstr "" -#: ..\Client\core\CVersionUpdater.cpp:1802 +#: Client\core\CVersionUpdater.cpp:1802 msgid "CHECKING" msgstr "" -#: ..\Client\core\CVersionUpdater.cpp:1819 -#: ..\Client\core\CVersionUpdater.cpp:1912 +#: Client\core\CVersionUpdater.cpp:1819 Client\core\CVersionUpdater.cpp:1912 msgid "UPDATE CHECK" msgstr "" -#: ..\Client\core\CVersionUpdater.cpp:1820 +#: Client\core\CVersionUpdater.cpp:1820 msgid "No update needed" msgstr "" -#: ..\Client\core\CVersionUpdater.cpp:1837 +#: Client\core\CVersionUpdater.cpp:1837 msgid "DOWNLOADING" msgstr "" -#: ..\Client\core\CVersionUpdater.cpp:1838 +#: Client\core\CVersionUpdater.cpp:1838 msgid "waiting..." msgstr "" -#: ..\Client\core\CVersionUpdater.cpp:1854 +#: Client\core\CVersionUpdater.cpp:1854 msgid "MANDATORY UPDATE" msgstr "" -#: ..\Client\core\CVersionUpdater.cpp:1855 +#: Client\core\CVersionUpdater.cpp:1855 msgid "" "To join this server, you must update MTA.\n" "\n" " Do you want to update now ?" msgstr "" -#: ..\Client\core\CVersionUpdater.cpp:1873 +#: Client\core\CVersionUpdater.cpp:1873 msgid "OPTIONAL UPDATE" msgstr "" -#: ..\Client\core\CVersionUpdater.cpp:1874 +#: Client\core\CVersionUpdater.cpp:1874 msgid "" "Server says an update is recommended, but not essential.\n" "\n" " Do you want to update now ?" msgstr "" -#: ..\Client\core\CVersionUpdater.cpp:1913 +#: Client\core\CVersionUpdater.cpp:1913 msgid "" "Update not currently avalable.\n" "\n" "Please check www.mtasa.com" msgstr "" -#: ..\Client\core\CVersionUpdater.cpp:1934 -#: ..\Client\core\CVersionUpdater.cpp:2116 +#: Client\core\CVersionUpdater.cpp:1934 Client\core\CVersionUpdater.cpp:2116 msgid "ERROR SAVING" msgstr "" -#: ..\Client\core\CVersionUpdater.cpp:1935 -#: ..\Client\core\CVersionUpdater.cpp:2117 +#: Client\core\CVersionUpdater.cpp:1935 Client\core\CVersionUpdater.cpp:2117 msgid "Unable to create the file." msgstr "" -#: ..\Client\core\CVersionUpdater.cpp:1943 -#: ..\Client\core\CVersionUpdater.cpp:1952 -#: ..\Client\core\CVersionUpdater.cpp:2125 -#: ..\Client\core\CVersionUpdater.cpp:2134 +#: Client\core\CVersionUpdater.cpp:1943 Client\core\CVersionUpdater.cpp:1952 +#: Client\core\CVersionUpdater.cpp:2125 Client\core\CVersionUpdater.cpp:2134 msgid "ERROR DOWNLOADING" msgstr "" -#: ..\Client\core\CVersionUpdater.cpp:1944 -#: ..\Client\core\CVersionUpdater.cpp:2126 +#: Client\core\CVersionUpdater.cpp:1944 Client\core\CVersionUpdater.cpp:2126 msgid "The downloaded file appears to be incorrect." msgstr "" -#: ..\Client\core\CVersionUpdater.cpp:1953 -#: ..\Client\core\CVersionUpdater.cpp:2135 +#: Client\core\CVersionUpdater.cpp:1953 Client\core\CVersionUpdater.cpp:2135 msgid "For some reason." msgstr "" -#: ..\Client\core\CVersionUpdater.cpp:1964 -#: ..\Client\core\CVersionUpdater.cpp:2148 +#: Client\core\CVersionUpdater.cpp:1964 Client\core\CVersionUpdater.cpp:2148 msgid "DOWNLOAD COMPLETE" msgstr "" -#: ..\Client\core\CVersionUpdater.cpp:1988 +#: Client\core\CVersionUpdater.cpp:1988 msgid " - Unknown problem in _DialogUpdateResult" msgstr "" -#: ..\Client\core\CVersionUpdater.cpp:2086 -#: ..\Client\core\CVersionUpdater.cpp:2096 +#: Client\core\CVersionUpdater.cpp:2086 Client\core\CVersionUpdater.cpp:2096 msgid "Ok" msgstr "" -#: ..\Client\core\CVersionUpdater.cpp:2094 +#: Client\core\CVersionUpdater.cpp:2094 msgid "ERROR" msgstr "" -#: ..\Client\core\CVersionUpdater.cpp:2095 +#: Client\core\CVersionUpdater.cpp:2095 msgid "" "Some MTA:SA data files are missing.\n" "\n" @@ -1759,12 +1736,12 @@ msgid "" "Please reinstall MTA:SA" msgstr "" -#: ..\Client\core\CVersionUpdater.cpp:2722 +#: Client\core\CVersionUpdater.cpp:2722 #, c-format msgid "%3d %% completed" msgstr "" -#: ..\Client\core\CVersionUpdater.cpp:2724 +#: Client\core\CVersionUpdater.cpp:2724 #, c-format msgid "" "\n" @@ -1772,26 +1749,26 @@ msgid "" "Waiting for response - %-3d" msgstr "" -#: ..\Client\core\CVersionUpdater.cpp:3399 +#: Client\core\CVersionUpdater.cpp:3399 msgid "" "We've reset your update preferences back to Default, please go change your " "settings again if you want Nightly updates.\n" msgstr "" -#: ..\Client\core\CVersionUpdater.cpp:3400 +#: Client\core\CVersionUpdater.cpp:3400 msgid "VERSION UPDATE INFORMATION" msgstr "" -#: ..\Client\core\DXHook\CDirect3DEvents9.cpp:230 +#: Client\core\DXHook\CDirect3DEvents9.cpp:230 #, c-format msgid "Screenshot got %d bytes, but expected %d" msgstr "" -#: ..\Client\core\DXHook\CDirect3DEvents9.cpp:236 +#: Client\core\DXHook\CDirect3DEvents9.cpp:236 msgid "Screenshot failed" msgstr "" -#: ..\Client\core\DXHook\CDirect3DHook9.cpp:124 +#: Client\core\DXHook\CDirect3DHook9.cpp:124 msgid "" "Could not initialize Direct3D9.\n" "\n" @@ -1800,29 +1777,29 @@ msgid "" msgstr "" #. Create the window -#: ..\Client\core\ServerBrowser\CServerBrowser.cpp:85 +#: Client\core\ServerBrowser\CServerBrowser.cpp:85 msgid "SERVER BROWSER" msgstr "" #. Create the tabs -#: ..\Client\core\ServerBrowser\CServerBrowser.cpp:133 -#: ..\Client\mods\deathmatch\logic\CLocalServer.cpp:90 +#: Client\core\ServerBrowser\CServerBrowser.cpp:133 +#: Client\mods\deathmatch\logic\CLocalServer.cpp:90 msgid "Internet" msgstr "" -#: ..\Client\core\ServerBrowser\CServerBrowser.cpp:134 +#: Client\core\ServerBrowser\CServerBrowser.cpp:134 msgid "Local" msgstr "" -#: ..\Client\core\ServerBrowser\CServerBrowser.cpp:135 +#: Client\core\ServerBrowser\CServerBrowser.cpp:135 msgid "Favourites" msgstr "" -#: ..\Client\core\ServerBrowser\CServerBrowser.cpp:136 +#: Client\core\ServerBrowser\CServerBrowser.cpp:136 msgid "Recent" msgstr "" -#: ..\Client\core\ServerBrowser\CServerBrowser.cpp:191 +#: Client\core\ServerBrowser\CServerBrowser.cpp:191 msgid "" "FOR QUICK CONNECT:\n" "\n" @@ -1830,325 +1807,324 @@ msgid "" "Or select a server from the history list and press 'Connect'" msgstr "" -#: ..\Client\core\ServerBrowser\CServerBrowser.cpp:203 +#: Client\core\ServerBrowser\CServerBrowser.cpp:203 msgid "HELP" msgstr "" -#: ..\Client\core\ServerBrowser\CServerBrowser.cpp:212 -#: ..\Client\core\ServerBrowser\CServerBrowser.cpp:252 +#: Client\core\ServerBrowser\CServerBrowser.cpp:212 +#: Client\core\ServerBrowser\CServerBrowser.cpp:252 msgid "Refresh" msgstr "" -#: ..\Client\core\ServerBrowser\CServerBrowser.cpp:212 -#: ..\Client\core\ServerBrowser\CServerBrowser.cpp:253 +#: Client\core\ServerBrowser\CServerBrowser.cpp:212 +#: Client\core\ServerBrowser\CServerBrowser.cpp:253 msgid "Add Favorite" msgstr "" -#: ..\Client\core\ServerBrowser\CServerBrowser.cpp:212 -#: ..\Client\core\ServerBrowser\CServerBrowser.cpp:254 -#: ..\Client\core\ServerBrowser\CServerBrowser.cpp:301 -#: ..\Client\core\ServerBrowser\CServerBrowser.cpp:372 +#: Client\core\ServerBrowser\CServerBrowser.cpp:212 +#: Client\core\ServerBrowser\CServerBrowser.cpp:254 +#: Client\core\ServerBrowser\CServerBrowser.cpp:301 +#: Client\core\ServerBrowser\CServerBrowser.cpp:372 msgid "Connect" msgstr "" -#: ..\Client\core\ServerBrowser\CServerBrowser.cpp:212 -#: ..\Client\core\ServerBrowser\CServerBrowser.cpp:255 +#: Client\core\ServerBrowser\CServerBrowser.cpp:212 +#: Client\core\ServerBrowser\CServerBrowser.cpp:255 msgid "Server information" msgstr "" -#: ..\Client\core\ServerBrowser\CServerBrowser.cpp:213 -#: ..\Client\core\ServerBrowser\CServerBrowser.cpp:256 +#: Client\core\ServerBrowser\CServerBrowser.cpp:213 +#: Client\core\ServerBrowser\CServerBrowser.cpp:256 msgid "Search servers" msgstr "" -#: ..\Client\core\ServerBrowser\CServerBrowser.cpp:213 -#: ..\Client\core\ServerBrowser\CServerBrowser.cpp:257 +#: Client\core\ServerBrowser\CServerBrowser.cpp:213 +#: Client\core\ServerBrowser\CServerBrowser.cpp:257 msgid "Search players" msgstr "" -#: ..\Client\core\ServerBrowser\CServerBrowser.cpp:213 -#: ..\Client\core\ServerBrowser\CServerBrowser.cpp:258 +#: Client\core\ServerBrowser\CServerBrowser.cpp:213 +#: Client\core\ServerBrowser\CServerBrowser.cpp:258 msgid "Start search" msgstr "" -#: ..\Client\core\ServerBrowser\CServerBrowser.cpp:299 -#: ..\Client\core\ServerBrowser\CServerBrowser.cpp:1692 +#: Client\core\ServerBrowser\CServerBrowser.cpp:299 +#: Client\core\ServerBrowser\CServerBrowser.cpp:1692 msgid "Search players..." msgstr "" -#: ..\Client\core\ServerBrowser\CServerBrowser.cpp:422 -#: ..\Client\core\ServerBrowser\CServerBrowser.cpp:1690 +#: Client\core\ServerBrowser\CServerBrowser.cpp:422 +#: Client\core\ServerBrowser\CServerBrowser.cpp:1690 msgid "Search servers..." msgstr "" -#: ..\Client\core\ServerBrowser\CServerBrowser.cpp:453 +#: Client\core\ServerBrowser\CServerBrowser.cpp:453 msgid "Name" msgstr "" -#: ..\Client\core\ServerBrowser\CServerBrowser.cpp:454 +#: Client\core\ServerBrowser\CServerBrowser.cpp:454 msgid "Players" msgstr "" -#: ..\Client\core\ServerBrowser\CServerBrowser.cpp:455 +#: Client\core\ServerBrowser\CServerBrowser.cpp:455 msgid "Ping" msgstr "" -#: ..\Client\core\ServerBrowser\CServerBrowser.cpp:456 +#: Client\core\ServerBrowser\CServerBrowser.cpp:456 msgid "Gamemode" msgstr "" #. Player List Columns #. Column for player names -#: ..\Client\core\ServerBrowser\CServerBrowser.cpp:478 -#: ..\Client\core\ServerBrowser\CServerInfo.cpp:138 +#: Client\core\ServerBrowser\CServerBrowser.cpp:478 +#: Client\core\ServerBrowser\CServerInfo.cpp:138 msgid "Player list" msgstr "" #. Include label -#: ..\Client\core\ServerBrowser\CServerBrowser.cpp:486 +#: Client\core\ServerBrowser\CServerBrowser.cpp:486 msgid "Include:" msgstr "" -#: ..\Client\core\ServerBrowser\CServerBrowser.cpp:492 +#: Client\core\ServerBrowser\CServerBrowser.cpp:492 msgid "Empty" msgstr "" -#: ..\Client\core\ServerBrowser\CServerBrowser.cpp:498 +#: Client\core\ServerBrowser\CServerBrowser.cpp:498 msgid "Full" msgstr "" -#: ..\Client\core\ServerBrowser\CServerBrowser.cpp:504 +#: Client\core\ServerBrowser\CServerBrowser.cpp:504 msgid "Locked" msgstr "" -#: ..\Client\core\ServerBrowser\CServerBrowser.cpp:516 +#: Client\core\ServerBrowser\CServerBrowser.cpp:516 msgid "Offline" msgstr "" -#: ..\Client\core\ServerBrowser\CServerBrowser.cpp:529 +#: Client\core\ServerBrowser\CServerBrowser.cpp:529 msgid "Other Versions" msgstr "" -#: ..\Client\core\ServerBrowser\CServerBrowser.cpp:550 +#: Client\core\ServerBrowser\CServerBrowser.cpp:550 msgid "Back" msgstr "" -#: ..\Client\core\ServerBrowser\CServerBrowser.cpp:556 -#: ..\Client\loader\Dialogs.cpp:35 +#: Client\core\ServerBrowser\CServerBrowser.cpp:556 +#: Client\loader\Dialogs.cpp:35 msgid "Help" msgstr "" -#: ..\Client\core\ServerBrowser\CServerBrowser.cpp:741 +#: Client\core\ServerBrowser\CServerBrowser.cpp:741 msgid "Loading..." msgstr "" -#: ..\Client\core\ServerBrowser\CServerBrowser.cpp:1235 -#: ..\Client\core\ServerBrowser\CServerBrowser.cpp:2177 +#: Client\core\ServerBrowser\CServerBrowser.cpp:1235 +#: Client\core\ServerBrowser\CServerBrowser.cpp:2177 msgid " ..loading.." msgstr "" -#: ..\Client\core\ServerBrowser\CServerBrowser.cpp:1273 -#: ..\Client\core\ServerBrowser\CServerBrowser.cpp:1401 +#: Client\core\ServerBrowser\CServerBrowser.cpp:1273 +#: Client\core\ServerBrowser\CServerBrowser.cpp:1401 msgid "No address specified!" msgstr "" -#: ..\Client\core\ServerBrowser\CServerBrowser.cpp:1286 +#: Client\core\ServerBrowser\CServerBrowser.cpp:1286 msgid "Unknown protocol" msgstr "" -#: ..\Client\core\ServerBrowser\CServerBrowser.cpp:1286 +#: Client\core\ServerBrowser\CServerBrowser.cpp:1286 msgid "Please use the mtasa:// protocol!" msgstr "" -#: ..\Client\core\ServerBrowser\CServerBrowser.cpp:1295 -#: ..\Client\core\ServerBrowser\CServerBrowser.cpp:1352 -#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:568 -#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:666 +#: Client\core\ServerBrowser\CServerBrowser.cpp:1295 +#: Client\core\ServerBrowser\CServerBrowser.cpp:1352 +#: Client\mods\deathmatch\logic\CClientGame.cpp:568 +#: Client\mods\deathmatch\logic\CClientGame.cpp:666 msgid "Invalid nickname! Please go to Settings and set a new one!" msgstr "" -#: ..\Client\core\ServerBrowser\CServerBrowser.cpp:1375 -#: ..\Client\core\ServerBrowser\CServerInfo.cpp:319 -#: ..\Client\loader\MainFunctions.cpp:594 -#: ..\Client\loader\MainFunctions.cpp:601 -#: ..\Client\loader\MainFunctions.cpp:1204 +#: Client\core\ServerBrowser\CServerBrowser.cpp:1375 +#: Client\core\ServerBrowser\CServerInfo.cpp:319 +#: Client\loader\MainFunctions.cpp:594 Client\loader\MainFunctions.cpp:601 +#: Client\loader\MainFunctions.cpp:1196 msgid "Information" msgstr "" -#: ..\Client\core\ServerBrowser\CServerBrowser.cpp:1375 +#: Client\core\ServerBrowser\CServerBrowser.cpp:1375 msgid "You have to select a server to connect to." msgstr "" #. Create queue window -#: ..\Client\core\ServerBrowser\CServerInfo.cpp:32 -#: ..\Client\core\ServerBrowser\CServerInfo.cpp:302 +#: Client\core\ServerBrowser\CServerInfo.cpp:32 +#: Client\core\ServerBrowser\CServerInfo.cpp:302 msgid "SERVER IS FULL" msgstr "" #. Determine our label draw position for L10n #. Start position #. Server Name -#: ..\Client\core\ServerBrowser\CServerInfo.cpp:44 -#: ..\Client\core\ServerBrowser\CServerInfo.cpp:53 +#: Client\core\ServerBrowser\CServerInfo.cpp:44 +#: Client\core\ServerBrowser\CServerInfo.cpp:53 msgid "Name:" msgstr "" #. Server IP -#: ..\Client\core\ServerBrowser\CServerInfo.cpp:44 -#: ..\Client\core\ServerBrowser\CServerInfo.cpp:64 +#: Client\core\ServerBrowser\CServerInfo.cpp:44 +#: Client\core\ServerBrowser\CServerInfo.cpp:64 msgid "Server Address:" msgstr "" #. Gamemode -#: ..\Client\core\ServerBrowser\CServerInfo.cpp:44 -#: ..\Client\core\ServerBrowser\CServerInfo.cpp:75 +#: Client\core\ServerBrowser\CServerInfo.cpp:44 +#: Client\core\ServerBrowser\CServerInfo.cpp:75 msgid "Gamemode:" msgstr "" #. Map -#: ..\Client\core\ServerBrowser\CServerInfo.cpp:44 -#: ..\Client\core\ServerBrowser\CServerInfo.cpp:86 +#: Client\core\ServerBrowser\CServerInfo.cpp:44 +#: Client\core\ServerBrowser\CServerInfo.cpp:86 msgid "Map:" msgstr "" #. Players -#: ..\Client\core\ServerBrowser\CServerInfo.cpp:45 -#: ..\Client\core\ServerBrowser\CServerInfo.cpp:97 +#: Client\core\ServerBrowser\CServerInfo.cpp:45 +#: Client\core\ServerBrowser\CServerInfo.cpp:97 msgid "Players:" msgstr "" #. Passworded -#: ..\Client\core\ServerBrowser\CServerInfo.cpp:45 -#: ..\Client\core\ServerBrowser\CServerInfo.cpp:108 +#: Client\core\ServerBrowser\CServerInfo.cpp:45 +#: Client\core\ServerBrowser\CServerInfo.cpp:108 msgid "Passworded:" msgstr "" #. Latency -#: ..\Client\core\ServerBrowser\CServerInfo.cpp:45 -#: ..\Client\core\ServerBrowser\CServerInfo.cpp:119 +#: Client\core\ServerBrowser\CServerInfo.cpp:45 +#: Client\core\ServerBrowser\CServerInfo.cpp:119 msgid "Latency:" msgstr "" #. Close button -#: ..\Client\core\ServerBrowser\CServerInfo.cpp:144 +#: Client\core\ServerBrowser\CServerInfo.cpp:144 msgid "Close" msgstr "" #. Join Game button -#: ..\Client\core\ServerBrowser\CServerInfo.cpp:152 +#: Client\core\ServerBrowser\CServerInfo.cpp:152 msgid "Join Game" msgstr "" #. Please enter password label -#: ..\Client\core\ServerBrowser\CServerInfo.cpp:166 +#: Client\core\ServerBrowser\CServerInfo.cpp:166 msgid "Please enter the password to the server:" msgstr "" -#: ..\Client\core\ServerBrowser\CServerInfo.cpp:177 +#: Client\core\ServerBrowser\CServerInfo.cpp:177 msgid "Join the server as soon as a player slot is available." msgstr "" -#: ..\Client\core\ServerBrowser\CServerInfo.cpp:310 +#: Client\core\ServerBrowser\CServerInfo.cpp:310 msgid "PLEASE ENTER SERVER PASSWORD" msgstr "" #. The server has timed out -#: ..\Client\core\ServerBrowser\CServerInfo.cpp:402 +#: Client\core\ServerBrowser\CServerInfo.cpp:402 msgid "Timed Out" msgstr "" #. Set every GUI elements text to blank -#: ..\Client\core\ServerBrowser\CServerInfo.cpp:431 +#: Client\core\ServerBrowser\CServerInfo.cpp:431 msgid "Querying..." msgstr "" -#: ..\Client\core\ServerBrowser\CServerList.cpp:25 +#: Client\core\ServerBrowser\CServerList.cpp:25 msgid "Idle" msgstr "" -#: ..\Client\core\ServerBrowser\CServerList.cpp:150 +#: Client\core\ServerBrowser\CServerList.cpp:150 msgid "player" msgid_plural "players" msgstr[0] "" msgstr[1] "" -#: ..\Client\core\ServerBrowser\CServerList.cpp:151 +#: Client\core\ServerBrowser\CServerList.cpp:151 msgid "on" msgstr "" -#: ..\Client\core\ServerBrowser\CServerList.cpp:154 +#: Client\core\ServerBrowser\CServerList.cpp:154 msgid "server" msgid_plural "servers" msgstr[0] "" msgstr[1] "" #. We are polling for the master server list (first pass) -#: ..\Client\core\ServerBrowser\CServerList.cpp:238 +#: Client\core\ServerBrowser\CServerList.cpp:238 #, c-format msgid "Requesting master server list (%lu ms elapsed)" msgstr "" #. Abort -#: ..\Client\core\ServerBrowser\CServerList.cpp:254 +#: Client\core\ServerBrowser\CServerList.cpp:254 msgid "Master server list could not be parsed." msgstr "" #. Abort -#: ..\Client\core\ServerBrowser\CServerList.cpp:264 +#: Client\core\ServerBrowser\CServerList.cpp:264 msgid "Master server list could not be retrieved." msgstr "" -#: ..\Client\core\ServerBrowser\CServerList.cpp:274 +#: Client\core\ServerBrowser\CServerList.cpp:274 msgid "(Backup server list)" msgstr "" -#: ..\Client\core\ServerBrowser\CServerList.cpp:326 +#: Client\core\ServerBrowser\CServerList.cpp:326 msgid "Cannot bind LAN-broadcast socket" msgstr "" -#: ..\Client\core\ServerBrowser\CServerList.cpp:345 +#: Client\core\ServerBrowser\CServerList.cpp:345 msgid "Attempting to discover LAN servers" msgstr "" -#: ..\Client\game_sa\CSettingsSA.cpp:800 +#: Client\game_sa\CSettingsSA.cpp:800 msgid "Can't find valid screen resolution." msgstr "" #. Confirm that res should be used -#: ..\Client\game_sa\CSettingsSA.cpp:876 +#: Client\game_sa\CSettingsSA.cpp:876 msgid "Are you sure you want to use this screen resolution?" msgstr "" -#: ..\Client\game_sa\CSettingsSA.cpp:878 ..\Client\loader\Dialogs.cpp:98 +#: Client\game_sa\CSettingsSA.cpp:878 Client\loader\Dialogs.cpp:98 msgid "MTA: San Andreas" msgstr "" -#: ..\Client\loader\CExePatchedStatus.cpp:153 +#: Client\loader\CExePatchedStatus.cpp:153 msgid "Update Aero setting" msgstr "" -#: ..\Client\loader\CExePatchedStatus.cpp:155 +#: Client\loader\CExePatchedStatus.cpp:155 msgid "Update Large Memory setting" msgstr "" -#: ..\Client\loader\CExePatchedStatus.cpp:157 +#: Client\loader\CExePatchedStatus.cpp:157 msgid "Update DEP setting" msgstr "" -#: ..\Client\loader\CExePatchedStatus.cpp:159 +#: Client\loader\CExePatchedStatus.cpp:159 msgid "Update graphics driver compliance" msgstr "" -#: ..\Client\loader\CExePatchedStatus.cpp:161 -#: ..\Client\loader\CExePatchedStatus.cpp:163 +#: Client\loader\CExePatchedStatus.cpp:161 +#: Client\loader\CExePatchedStatus.cpp:163 msgid "Fix file issues" msgstr "" -#: ..\Client\loader\CExePatchedStatus.cpp:164 +#: Client\loader\CExePatchedStatus.cpp:164 msgid "Copy main executable to avoid graphic driver issues" msgstr "" -#: ..\Client\loader\CInstallManager.cpp:329 ..\Client\loader\Utils.cpp:1182 +#: Client\loader\CInstallManager.cpp:329 Client\loader\Utils.cpp:1182 #, c-format msgid "" "MTA:SA needs Administrator access for the following task:\n" @@ -2158,7 +2134,7 @@ msgid "" "Please confirm in the next window." msgstr "" -#: ..\Client\loader\CInstallManager.cpp:344 +#: Client\loader\CInstallManager.cpp:344 #, c-format msgid "" "MTA:SA could not complete the following task:\n" @@ -2166,89 +2142,88 @@ msgid "" " '%s'\n" msgstr "" -#: ..\Client\loader\CInstallManager.cpp:394 +#: Client\loader\CInstallManager.cpp:394 msgid "" "** The crash was caused by a graphics driver error **\n" "\n" "** Please update your graphics drivers **" msgstr "" -#: ..\Client\loader\CInstallManager.cpp:500 +#: Client\loader\CInstallManager.cpp:500 msgid "Install updated MTA:SA files" msgstr "" -#: ..\Client\loader\CInstallManager.cpp:520 +#: Client\loader\CInstallManager.cpp:520 msgid "" "Could not update due to file conflicts. Please close other applications and " "retry" msgstr "" -#: ..\Client\loader\CInstallManager.cpp:529 +#: Client\loader\CInstallManager.cpp:529 #, c-format msgid "Multi Theft Auto has not been installed properly, please reinstall. %s" msgstr "" -#: ..\Client\loader\CInstallManager.cpp:584 -#: ..\Client\loader\CInstallManager.cpp:616 +#: Client\loader\CInstallManager.cpp:584 Client\loader\CInstallManager.cpp:616 msgid "MTA:SA cannot continue because the following files are incorrect:" msgstr "" -#: ..\Client\loader\CInstallManager.cpp:609 +#: Client\loader\CInstallManager.cpp:609 msgid "Patch GTA" msgstr "" -#: ..\Client\loader\CInstallManager.cpp:812 +#: Client\loader\CInstallManager.cpp:812 msgid "Missing file:" msgstr "" -#: ..\Client\loader\CInstallManager.cpp:816 +#: Client\loader\CInstallManager.cpp:816 msgid "If MTA fails to load, please re-install GTA:SA" msgstr "" -#: ..\Client\loader\CInstallManager.cpp:937 +#: Client\loader\CInstallManager.cpp:937 msgid "Update install settings" msgstr "" -#: ..\Client\loader\CInstallManager.cpp:1070 +#: Client\loader\CInstallManager.cpp:1070 msgid "Update compatibility settings" msgstr "" -#: ..\Client\loader\Dialogs.cpp:34 +#: Client\loader\Dialogs.cpp:34 msgid "Quit" msgstr "" -#: ..\Client\loader\Dialogs.cpp:51 +#: Client\loader\Dialogs.cpp:51 msgid "MTA: San Andreas has encountered a problem" msgstr "" -#: ..\Client\loader\Dialogs.cpp:52 +#: Client\loader\Dialogs.cpp:52 msgid "Crash information" msgstr "" -#: ..\Client\loader\Dialogs.cpp:53 +#: Client\loader\Dialogs.cpp:53 msgid "" "Tick the check box to send this crash info to MTA devs using the 'internet'" msgstr "" -#: ..\Client\loader\Dialogs.cpp:54 +#: Client\loader\Dialogs.cpp:54 msgid "Doing so will increase the chance of this crash being fixed." msgstr "" -#: ..\Client\loader\Dialogs.cpp:55 +#: Client\loader\Dialogs.cpp:55 msgid "Do you want to restart MTA: San Andreas ?" msgstr "" -#: ..\Client\loader\Dialogs.cpp:62 +#: Client\loader\Dialogs.cpp:62 msgid "MTA: San Andreas - Warning" msgstr "" -#: ..\Client\loader\Dialogs.cpp:63 +#: Client\loader\Dialogs.cpp:63 msgid "" "Your Grand Theft Auto: San Andreas install directory contains a d3d9.dll " "file:" msgstr "" -#: ..\Client\loader\Dialogs.cpp:65 +#: Client\loader\Dialogs.cpp:65 msgid "" "The file is not required and may interfere with the graphical features in " "this version of MTA:SA.\n" @@ -2256,91 +2231,91 @@ msgid "" "It is recommended that you remove or rename d3d9.dll" msgstr "" -#: ..\Client\loader\Dialogs.cpp:67 +#: Client\loader\Dialogs.cpp:67 msgid "Use this d3d9.dll, but also show this warning on next start" msgstr "" -#: ..\Client\loader\Dialogs.cpp:68 +#: Client\loader\Dialogs.cpp:68 msgid "Do not tell me about this d3d9.dll again" msgstr "" -#: ..\Client\loader\Dialogs.cpp:69 +#: Client\loader\Dialogs.cpp:69 msgid "Rename this d3d9.dll to d3d9.dll.bak" msgstr "" -#: ..\Client\loader\Dialogs.cpp:70 +#: Client\loader\Dialogs.cpp:70 msgid "Show me the file" msgstr "" -#: ..\Client\loader\Dialogs.cpp:71 +#: Client\loader\Dialogs.cpp:71 msgid "Play MTA:SA" msgstr "" -#: ..\Client\loader\Dialogs.cpp:77 +#: Client\loader\Dialogs.cpp:77 msgid "MTA: San Andreas - Confusing options" msgstr "" -#: ..\Client\loader\Dialogs.cpp:78 +#: Client\loader\Dialogs.cpp:78 msgid "NVidia Optimus detected!" msgstr "" -#: ..\Client\loader\Dialogs.cpp:79 +#: Client\loader\Dialogs.cpp:79 msgid "Try each option and see what works:" msgstr "" -#: ..\Client\loader\Dialogs.cpp:80 +#: Client\loader\Dialogs.cpp:80 msgid "A - Standard NVidia" msgstr "" -#: ..\Client\loader\Dialogs.cpp:81 +#: Client\loader\Dialogs.cpp:81 msgid "B - Alternate NVidia" msgstr "" -#: ..\Client\loader\Dialogs.cpp:82 +#: Client\loader\Dialogs.cpp:82 msgid "C - Standard NVidia with exe rename" msgstr "" -#: ..\Client\loader\Dialogs.cpp:83 +#: Client\loader\Dialogs.cpp:83 msgid "D - Alternate NVidia with exe rename" msgstr "" -#: ..\Client\loader\Dialogs.cpp:84 +#: Client\loader\Dialogs.cpp:84 msgid "E - Standard Intel" msgstr "" -#: ..\Client\loader\Dialogs.cpp:85 +#: Client\loader\Dialogs.cpp:85 msgid "F - Alternate Intel" msgstr "" -#: ..\Client\loader\Dialogs.cpp:86 +#: Client\loader\Dialogs.cpp:86 msgid "G - Standard Intel with exe rename" msgstr "" -#: ..\Client\loader\Dialogs.cpp:87 +#: Client\loader\Dialogs.cpp:87 msgid "H - Alternate Intel with exe rename" msgstr "" -#: ..\Client\loader\Dialogs.cpp:88 +#: Client\loader\Dialogs.cpp:88 msgid "If you get desperate, this might help:" msgstr "" -#: ..\Client\loader\Dialogs.cpp:89 +#: Client\loader\Dialogs.cpp:89 msgid "If you have already selected an option that works, this might help:" msgstr "" -#: ..\Client\loader\Dialogs.cpp:90 +#: Client\loader\Dialogs.cpp:90 msgid "Force windowed mode" msgstr "" -#: ..\Client\loader\Dialogs.cpp:91 +#: Client\loader\Dialogs.cpp:91 msgid "Don't show again" msgstr "" -#: ..\Client\loader\Dialogs.cpp:99 +#: Client\loader\Dialogs.cpp:99 msgid "Warning: Could not detect anti-virus product" msgstr "" -#: ..\Client\loader\Dialogs.cpp:101 +#: Client\loader\Dialogs.cpp:101 msgid "" "MTA could not detect an anti-virus on your PC.\n" "\n" @@ -2349,53 +2324,53 @@ msgid "" "Press 'Help' for more information." msgstr "" -#: ..\Client\loader\Dialogs.cpp:104 +#: Client\loader\Dialogs.cpp:104 msgid "I have already installed an anti-virus" msgstr "" -#: ..\Client\loader\Dialogs.cpp:106 +#: Client\loader\Dialogs.cpp:106 msgid "" "I will not install an anti-virus.\n" "I want my PC to lag and be part of a botnet." msgstr "" -#: ..\Client\loader\Dialogs.cpp:717 ..\Client\loader\Utils.cpp:747 +#: Client\loader\Dialogs.cpp:717 Client\loader\Utils.cpp:747 msgid "Searching for Grand Theft Auto San Andreas" msgstr "" -#: ..\Client\loader\Dialogs.cpp:720 ..\Client\loader\Utils.cpp:749 +#: Client\loader\Dialogs.cpp:720 Client\loader\Utils.cpp:749 msgid "Please start Grand Theft Auto San Andreas" msgstr "" -#: ..\Client\loader\Dialogs.cpp:728 ..\Client\loader\Install.cpp:187 +#: Client\loader\Dialogs.cpp:728 Client\loader\Install.cpp:187 msgid "Installing update..." msgstr "" -#: ..\Client\loader\Dialogs.cpp:736 ..\Client\loader\Install.cpp:287 +#: Client\loader\Dialogs.cpp:736 Client\loader\Install.cpp:287 msgid "Extracting files..." msgstr "" -#: ..\Client\loader\Dialogs.cpp:741 ..\Client\loader\Utils.cpp:1605 +#: Client\loader\Dialogs.cpp:741 Client\loader\Utils.cpp:1605 msgid "Copying files..." msgstr "" -#: ..\Client\loader\Dialogs.cpp:746 ..\Client\loader\Utils.cpp:1665 +#: Client\loader\Dialogs.cpp:746 Client\loader\Utils.cpp:1665 msgid "Copy finished early. Everything OK." msgstr "" -#: ..\Client\loader\Dialogs.cpp:751 ..\Client\loader\Utils.cpp:1671 +#: Client\loader\Dialogs.cpp:751 Client\loader\Utils.cpp:1671 msgid "Finishing..." msgstr "" -#: ..\Client\loader\Dialogs.cpp:755 ..\Client\loader\Utils.cpp:1673 +#: Client\loader\Dialogs.cpp:755 Client\loader\Utils.cpp:1673 msgid "Done!" msgstr "" -#: ..\Client\loader\Install.cpp:92 +#: Client\loader\Install.cpp:92 msgid "Do you want to terminate the MTA Server and continue updating?" msgstr "" -#: ..\Client\loader\MainFunctions.cpp:241 +#: Client\loader\MainFunctions.cpp:241 msgid "" "Trouble restarting MTA:SA\n" "\n" @@ -2406,28 +2381,28 @@ msgid "" "Try to launch MTA:SA again?" msgstr "" -#: ..\Client\loader\MainFunctions.cpp:259 +#: Client\loader\MainFunctions.cpp:259 msgid "" "Another instance of MTA is already running.\n" "\n" "If this problem persists, please restart your computer" msgstr "" -#: ..\Client\loader\MainFunctions.cpp:262 +#: Client\loader\MainFunctions.cpp:262 msgid "" "Another instance of MTA is already running.\n" "\n" "Do you want to terminate it?" msgstr "" -#: ..\Client\loader\MainFunctions.cpp:286 +#: Client\loader\MainFunctions.cpp:286 msgid "" "Are you having problems running MTA:SA?.\n" "\n" "Do you want to revert to an earlier version?" msgstr "" -#: ..\Client\loader\MainFunctions.cpp:315 +#: Client\loader\MainFunctions.cpp:315 msgid "" "There seems to be a problem launching MTA:SA.\n" "Resetting GTA settings can sometimes fix this problem.\n" @@ -2435,20 +2410,20 @@ msgid "" "Do you want to reset GTA settings now?" msgstr "" -#: ..\Client\loader\MainFunctions.cpp:330 +#: Client\loader\MainFunctions.cpp:330 msgid "" "GTA settings have been reset.\n" "\n" "Press OK to continue." msgstr "" -#: ..\Client\loader\MainFunctions.cpp:335 +#: Client\loader\MainFunctions.cpp:335 #, c-format msgid "File could not be deleted: '%s'" msgstr "" #. No settings to delete, or can't find them -#: ..\Client\loader\MainFunctions.cpp:343 +#: Client\loader\MainFunctions.cpp:343 msgid "" "Are you having problems running MTA:SA?.\n" "\n" @@ -2456,21 +2431,21 @@ msgid "" msgstr "" #. Inform user -#: ..\Client\loader\MainFunctions.cpp:379 +#: Client\loader\MainFunctions.cpp:379 msgid "" "Are you having problems running MTA:SA?.\n" "\n" "Do you want to change the following setting?" msgstr "" -#: ..\Client\loader\MainFunctions.cpp:422 +#: Client\loader\MainFunctions.cpp:422 msgid "" "Are you having problems running MTA:SA?.\n" "\n" "Try disabling the following products for GTA and MTA:" msgstr "" -#: ..\Client\loader\MainFunctions.cpp:456 +#: Client\loader\MainFunctions.cpp:456 msgid "" "WARNING\n" "\n" @@ -2479,29 +2454,29 @@ msgid "" "\n" msgstr "" -#: ..\Client\loader\MainFunctions.cpp:459 +#: Client\loader\MainFunctions.cpp:459 #, c-format msgid "The detected file was: %s\n" msgstr "" -#: ..\Client\loader\MainFunctions.cpp:593 +#: Client\loader\MainFunctions.cpp:593 msgid "" "An instance of GTA: San Andreas is already running. It needs to be " "terminated before MTA:SA can be started. Do you want to do that now?" msgstr "" -#: ..\Client\loader\MainFunctions.cpp:600 +#: Client\loader\MainFunctions.cpp:600 msgid "" "Unable to terminate GTA: San Andreas. If the problem persists, please " "restart your computer." msgstr "" -#: ..\Client\loader\MainFunctions.cpp:623 +#: Client\loader\MainFunctions.cpp:623 msgid "" "Registry entries are missing. Please reinstall Multi Theft Auto: San Andreas." msgstr "" -#: ..\Client\loader\MainFunctions.cpp:629 +#: Client\loader\MainFunctions.cpp:629 msgid "" "The path to your installation of GTA: San Andreas contains unsupported " "(unicode) characters. Please move your Grand Theft Auto: San Andreas " @@ -2509,7 +2484,7 @@ msgid "" "characters and reinstall Multi Theft Auto: San Andreas." msgstr "" -#: ..\Client\loader\MainFunctions.cpp:639 +#: Client\loader\MainFunctions.cpp:639 msgid "" "The path to your installation of 'MTA:SA' or 'GTA: San Andreas'\n" "contains a ';' (semicolon).\n" @@ -2518,48 +2493,48 @@ msgid "" " move your installation(s) to a path that does not contain a semicolon." msgstr "" -#: ..\Client\loader\MainFunctions.cpp:779 +#: Client\loader\MainFunctions.cpp:779 msgid "" "Load failed. Please ensure that the latest data files have been installed " "correctly." msgstr "" -#: ..\Client\loader\MainFunctions.cpp:788 +#: Client\loader\MainFunctions.cpp:788 #, c-format msgid "Load failed. Please ensure that %s is installed correctly." msgstr "" -#: ..\Client\loader\MainFunctions.cpp:795 +#: Client\loader\MainFunctions.cpp:795 #, c-format msgid "Load failed. Could not find gta_sa.exe in %s." msgstr "" -#: ..\Client\loader\MainFunctions.cpp:805 +#: Client\loader\MainFunctions.cpp:805 #, c-format msgid "" "Load failed. %s exists in the GTA directory. Please delete before continuing." msgstr "" -#: ..\Client\loader\MainFunctions.cpp:814 +#: Client\loader\MainFunctions.cpp:814 #, c-format msgid "Main file has an incorrect name (%s)" msgstr "" -#: ..\Client\loader\MainFunctions.cpp:825 +#: Client\loader\MainFunctions.cpp:825 msgid "" "Main file is unsigned. Possible virus activity.\n" "\n" "See online help if MTA does not work correctly." msgstr "" -#: ..\Client\loader\MainFunctions.cpp:856 +#: Client\loader\MainFunctions.cpp:848 msgid "" "Data files modified. Possible virus activity.\n" "\n" "See online help if MTA does not work correctly." msgstr "" -#: ..\Client\loader\MainFunctions.cpp:868 +#: Client\loader\MainFunctions.cpp:860 msgid "" ".asi files are in the 'MTA:SA' or 'GTA: San Andreas' installation " "directory.\n" @@ -2567,32 +2542,32 @@ msgid "" "Remove these .asi files if you experience problems with MTA:SA." msgstr "" -#: ..\Client\loader\MainFunctions.cpp:933 +#: Client\loader\MainFunctions.cpp:925 msgid "" "File version mismatch error. Reinstall MTA:SA if you experience problems.\n" msgstr "" -#: ..\Client\loader\MainFunctions.cpp:942 +#: Client\loader\MainFunctions.cpp:934 msgid "Some files are missing. Reinstall MTA:SA if you experience problems.\n" msgstr "" -#: ..\Client\loader\MainFunctions.cpp:954 +#: Client\loader\MainFunctions.cpp:946 msgid "" "MTA:SA is not compatible with Windows 'Safe Mode'.\n" "\n" "Please restart your PC.\n" msgstr "" -#: ..\Client\loader\MainFunctions.cpp:1090 +#: Client\loader\MainFunctions.cpp:1082 msgid "Fix configuration issue" msgstr "" #. Try to relaunch as admin if not done so already -#: ..\Client\loader\MainFunctions.cpp:1132 +#: Client\loader\MainFunctions.cpp:1124 msgid "Fix elevation required error" msgstr "" -#: ..\Client\loader\MainFunctions.cpp:1139 +#: Client\loader\MainFunctions.cpp:1131 #, c-format msgid "" "Could not start Grand Theft Auto: San Andreas. Please try restarting, or if " @@ -2601,22 +2576,22 @@ msgid "" "[%s]" msgstr "" -#: ..\Client\loader\MainFunctions.cpp:1204 +#: Client\loader\MainFunctions.cpp:1196 msgid "" "GTA: San Andreas may not have launched correctly. Do you want to terminate " "it?" msgstr "" -#: ..\Client\loader\Utils.cpp:813 +#: Client\loader\Utils.cpp:813 msgid "Select your Grand Theft Auto: San Andreas Installation Directory" msgstr "" -#: ..\Client\loader\Utils.cpp:1283 +#: Client\loader\Utils.cpp:1283 #, c-format msgid "Error loading %s module! (%s)" msgstr "" -#: ..\Client\loader\Utils.cpp:1713 +#: Client\loader\Utils.cpp:1713 #, c-format msgid "" "New installation of %s detected.\n" @@ -2624,442 +2599,442 @@ msgid "" "Do you want to copy your settings from %s ?" msgstr "" -#: ..\Client\loader\Utils.cpp:1752 +#: Client\loader\Utils.cpp:1752 #, c-format msgid "GTA:SA had trouble opening the file '%s'" msgstr "" -#: ..\Client\loader\Utils.cpp:1774 +#: Client\loader\Utils.cpp:1774 #, c-format msgid "GTA:SA is missing the file '%s'." msgstr "" -#: ..\Client\loader\Utils.cpp:1799 +#: Client\loader\Utils.cpp:1799 msgid "GTA:SA had trouble loading a model." msgstr "" -#: ..\Client\loader\Utils.cpp:1801 +#: Client\loader\Utils.cpp:1801 msgid "If you recently modified gta3.img, then try reinstalling GTA:SA." msgstr "" -#: ..\Client\loader\Utils.cpp:1826 +#: Client\loader\Utils.cpp:1826 msgid "GTA:SA had trouble adding an upgrade to a vehicle." msgstr "" -#: ..\Client\loader\Utils.cpp:1845 +#: Client\loader\Utils.cpp:1845 #, c-format msgid "GTA:SA found errors in the file '%s'" msgstr "" -#: ..\Client\loader\Utils.cpp:1918 +#: Client\loader\Utils.cpp:1918 msgid "Did your computer restart when playing MTA:SA?" msgstr "" -#: ..\Client\loader\Utils.cpp:1983 +#: Client\loader\Utils.cpp:1983 msgid "Please terminate the following programs before continuing:" msgstr "" -#: ..\Client\mods\deathmatch\CClient.cpp:36 +#: Client\mods\deathmatch\CClient.cpp:36 msgid "This version has expired." msgstr "" -#: ..\Client\mods\deathmatch\CClient.cpp:56 +#: Client\mods\deathmatch\CClient.cpp:56 msgid "disconnect from the game" msgstr "" -#: ..\Client\mods\deathmatch\CClient.cpp:57 +#: Client\mods\deathmatch\CClient.cpp:57 msgid "shows the nametags" msgstr "" -#: ..\Client\mods\deathmatch\CClient.cpp:58 +#: Client\mods\deathmatch\CClient.cpp:58 msgid "shows the chatbox" msgstr "" -#: ..\Client\mods\deathmatch\CClient.cpp:59 +#: Client\mods\deathmatch\CClient.cpp:59 msgid "shows the network statistics" msgstr "" #. Key commands (registered as 'mod commands', can be disabled) -#: ..\Client\mods\deathmatch\CClient.cpp:63 +#: Client\mods\deathmatch\CClient.cpp:63 msgid "open the chat input" msgstr "" -#: ..\Client\mods\deathmatch\CClient.cpp:64 +#: Client\mods\deathmatch\CClient.cpp:64 msgid "transmits voice to other players" msgstr "" -#: ..\Client\mods\deathmatch\CClient.cpp:65 +#: Client\mods\deathmatch\CClient.cpp:65 msgid "enters a car as passenger" msgstr "" -#: ..\Client\mods\deathmatch\CClient.cpp:66 +#: Client\mods\deathmatch\CClient.cpp:66 msgid "next radio channel" msgstr "" -#: ..\Client\mods\deathmatch\CClient.cpp:67 +#: Client\mods\deathmatch\CClient.cpp:67 msgid "previous radio channel" msgstr "" -#: ..\Client\mods\deathmatch\CClient.cpp:68 +#: Client\mods\deathmatch\CClient.cpp:68 msgid "enables the radar view" msgstr "" -#: ..\Client\mods\deathmatch\CClient.cpp:69 +#: Client\mods\deathmatch\CClient.cpp:69 msgid "zooms the radar in" msgstr "" -#: ..\Client\mods\deathmatch\CClient.cpp:70 +#: Client\mods\deathmatch\CClient.cpp:70 msgid "zooms the radar out" msgstr "" -#: ..\Client\mods\deathmatch\CClient.cpp:71 +#: Client\mods\deathmatch\CClient.cpp:71 msgid "moves the radar north" msgstr "" -#: ..\Client\mods\deathmatch\CClient.cpp:72 +#: Client\mods\deathmatch\CClient.cpp:72 msgid "moves the radar south" msgstr "" -#: ..\Client\mods\deathmatch\CClient.cpp:73 +#: Client\mods\deathmatch\CClient.cpp:73 msgid "moves the radar east" msgstr "" -#: ..\Client\mods\deathmatch\CClient.cpp:74 +#: Client\mods\deathmatch\CClient.cpp:74 msgid "moves the radar west" msgstr "" -#: ..\Client\mods\deathmatch\CClient.cpp:75 +#: Client\mods\deathmatch\CClient.cpp:75 msgid "attaches the radar" msgstr "" -#: ..\Client\mods\deathmatch\CClient.cpp:76 +#: Client\mods\deathmatch\CClient.cpp:76 msgid "reduces radar opacity" msgstr "" -#: ..\Client\mods\deathmatch\CClient.cpp:77 +#: Client\mods\deathmatch\CClient.cpp:77 msgid "increases radar opacity" msgstr "" -#: ..\Client\mods\deathmatch\CClient.cpp:78 +#: Client\mods\deathmatch\CClient.cpp:78 msgid "toggles radar help text" msgstr "" -#: ..\Client\mods\deathmatch\CClient.cpp:79 +#: Client\mods\deathmatch\CClient.cpp:79 msgid "sends a message to the targetted player" msgstr "" -#: ..\Client\mods\deathmatch\CClient.cpp:80 +#: Client\mods\deathmatch\CClient.cpp:80 msgid "changes to the next weapon whilst in a vehicle" msgstr "" -#: ..\Client\mods\deathmatch\CClient.cpp:81 +#: Client\mods\deathmatch\CClient.cpp:81 msgid "changes to the previous weapon whilst in a vehicle" msgstr "" -#: ..\Client\mods\deathmatch\CClient.cpp:82 +#: Client\mods\deathmatch\CClient.cpp:82 msgid "outputs info about the current server" msgstr "" #. ACHTUNG" Should this be handled by the atomic cvar setter? -#: ..\Client\mods\deathmatch\CClient.cpp:85 +#: Client\mods\deathmatch\CClient.cpp:85 msgid "defines the scale multiplier of all text-displays" msgstr "" #. Development mode -#: ..\Client\mods\deathmatch\CClient.cpp:92 +#: Client\mods\deathmatch\CClient.cpp:92 msgid "(Development mode) shows the colshapes" msgstr "" -#: ..\Client\mods\deathmatch\CClient.cpp:93 +#: Client\mods\deathmatch\CClient.cpp:93 msgid "(Development mode) prints world sound ids into the debug window" msgstr "" -#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:584 +#: Client\mods\deathmatch\logic\CClientGame.cpp:584 msgid "Entering the game ..." msgstr "" -#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:642 +#: Client\mods\deathmatch\logic\CClientGame.cpp:642 msgid "" "Not connected; please use Quick Connect or the 'connect' command to connect " "to a server." msgstr "" -#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:688 +#: Client\mods\deathmatch\logic\CClientGame.cpp:688 msgid "The server is not installed" msgstr "" -#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:698 -#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:1073 +#: Client\mods\deathmatch\logic\CClientGame.cpp:698 +#: Client\mods\deathmatch\logic\CClientGame.cpp:1073 msgid "Local Server" msgstr "" -#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:698 +#: Client\mods\deathmatch\logic\CClientGame.cpp:698 msgid "Starting local server ..." msgstr "" -#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:1004 +#: Client\mods\deathmatch\logic\CClientGame.cpp:1004 #, c-format msgid "You were kicked from the game ( %s )" msgstr "" -#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:1073 +#: Client\mods\deathmatch\logic\CClientGame.cpp:1073 msgid "Connecting to local server..." msgstr "" -#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:1084 +#: Client\mods\deathmatch\logic\CClientGame.cpp:1084 msgid "Error connecting to server." msgstr "" -#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:1094 +#: Client\mods\deathmatch\logic\CClientGame.cpp:1094 msgid "Connecting to local server timed out. See console for details." msgstr "" -#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:1197 +#: Client\mods\deathmatch\logic\CClientGame.cpp:1197 msgid "Connection with the server was lost" msgstr "" -#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:1224 +#: Client\mods\deathmatch\logic\CClientGame.cpp:1224 msgid "Disconnected: the server is currently full" msgstr "" -#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:1236 +#: Client\mods\deathmatch\logic\CClientGame.cpp:1236 msgid "Disconnected: invalid password specified" msgstr "" -#: ..\Client\mods\deathmatch\logic\CClientGame.cpp:1258 +#: Client\mods\deathmatch\logic\CClientGame.cpp:1258 msgid "MTA Client verification failed!" msgstr "" -#: ..\Client\mods\deathmatch\logic\CLocalServer.cpp:37 +#: Client\mods\deathmatch\logic\CLocalServer.cpp:37 msgid "HOST GAME" msgstr "" #. m_pTabs->CreateTab ( "Gamemode" ); -#: ..\Client\mods\deathmatch\logic\CLocalServer.cpp:53 +#: Client\mods\deathmatch\logic\CLocalServer.cpp:53 msgid "Resources" msgstr "" -#: ..\Client\mods\deathmatch\logic\CLocalServer.cpp:55 -#: ..\Client\mods\deathmatch\logic\CLocalServer.cpp:57 +#: Client\mods\deathmatch\logic\CLocalServer.cpp:55 +#: Client\mods\deathmatch\logic\CLocalServer.cpp:57 msgid "Server name:" msgstr "" -#: ..\Client\mods\deathmatch\logic\CLocalServer.cpp:64 -#: ..\Client\mods\deathmatch\logic\CLocalServer.cpp:66 +#: Client\mods\deathmatch\logic\CLocalServer.cpp:64 +#: Client\mods\deathmatch\logic\CLocalServer.cpp:66 msgid "Password:" msgstr "" -#: ..\Client\mods\deathmatch\logic\CLocalServer.cpp:73 -#: ..\Client\mods\deathmatch\logic\CLocalServer.cpp:75 +#: Client\mods\deathmatch\logic\CLocalServer.cpp:73 +#: Client\mods\deathmatch\logic\CLocalServer.cpp:75 msgid "Max players:" msgstr "" -#: ..\Client\mods\deathmatch\logic\CLocalServer.cpp:82 -#: ..\Client\mods\deathmatch\logic\CLocalServer.cpp:84 +#: Client\mods\deathmatch\logic\CLocalServer.cpp:82 +#: Client\mods\deathmatch\logic\CLocalServer.cpp:84 msgid "Broadcast:" msgstr "" -#: ..\Client\mods\deathmatch\logic\CLocalServer.cpp:86 +#: Client\mods\deathmatch\logic\CLocalServer.cpp:86 msgid "LAN" msgstr "" -#: ..\Client\mods\deathmatch\logic\CLocalServer.cpp:99 +#: Client\mods\deathmatch\logic\CLocalServer.cpp:99 msgid "Selected" msgstr "" -#: ..\Client\mods\deathmatch\logic\CLocalServer.cpp:116 +#: Client\mods\deathmatch\logic\CLocalServer.cpp:116 msgid "All" msgstr "" -#: ..\Client\mods\deathmatch\logic\CLocalServer.cpp:118 +#: Client\mods\deathmatch\logic\CLocalServer.cpp:118 msgid "Start" msgstr "" -#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:475 +#: Client\mods\deathmatch\logic\CPacketHandler.cpp:475 msgid "Disconnected: Invalid nickname" msgstr "" -#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:479 +#: Client\mods\deathmatch\logic\CPacketHandler.cpp:479 msgid "Disconnect from server" msgstr "" -#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:483 +#: Client\mods\deathmatch\logic\CPacketHandler.cpp:483 #, c-format msgid "" "Disconnected: Serial is banned.\n" "Reason: %s" msgstr "" -#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:489 +#: Client\mods\deathmatch\logic\CPacketHandler.cpp:489 #, c-format msgid "" "Disconnected: You are banned.\n" "Reason: %s" msgstr "" -#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:495 +#: Client\mods\deathmatch\logic\CPacketHandler.cpp:495 #, c-format msgid "" "Disconnected: Account is banned.\n" "Reason: %s" msgstr "" -#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:500 +#: Client\mods\deathmatch\logic\CPacketHandler.cpp:500 msgid "Disconnected: Version mismatch" msgstr "" -#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:504 +#: Client\mods\deathmatch\logic\CPacketHandler.cpp:504 msgid "Disconnected: Join flood. Please wait a minute, then reconnect." msgstr "" -#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:508 +#: Client\mods\deathmatch\logic\CPacketHandler.cpp:508 #, c-format msgid "" "Disconnected: Server from different branch.\n" "Information: %s" msgstr "" -#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:513 +#: Client\mods\deathmatch\logic\CPacketHandler.cpp:513 #, c-format msgid "" "Disconnected: Bad version.\n" "Information: %s" msgstr "" -#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:518 +#: Client\mods\deathmatch\logic\CPacketHandler.cpp:518 #, c-format msgid "" "Disconnected: Server is running a newer build.\n" "Information: %s" msgstr "" -#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:523 +#: Client\mods\deathmatch\logic\CPacketHandler.cpp:523 #, c-format msgid "" "Disconnected: Server is running an older build.\n" "Information: %s" msgstr "" -#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:528 +#: Client\mods\deathmatch\logic\CPacketHandler.cpp:528 msgid "Disconnected: Nick already in use" msgstr "" -#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:532 +#: Client\mods\deathmatch\logic\CPacketHandler.cpp:532 msgid "Disconnected: Player element could not be created." msgstr "" -#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:536 +#: Client\mods\deathmatch\logic\CPacketHandler.cpp:536 #, c-format msgid "Disconnected: Server refused the connection: %s" msgstr "" -#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:541 +#: Client\mods\deathmatch\logic\CPacketHandler.cpp:541 msgid "Disconnected: Serial verification failed" msgstr "" -#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:545 +#: Client\mods\deathmatch\logic\CPacketHandler.cpp:545 #, c-format msgid "Disconnected: Connection desync %s" msgstr "" -#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:554 +#: Client\mods\deathmatch\logic\CPacketHandler.cpp:554 #, c-format msgid "Disconnected: You were kicked by %s" msgstr "" -#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:559 +#: Client\mods\deathmatch\logic\CPacketHandler.cpp:559 #, c-format msgid "Disconnected: You were banned by %s" msgstr "" -#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:570 +#: Client\mods\deathmatch\logic\CPacketHandler.cpp:570 msgid "Disconnected: Server shutdown or restarting" msgstr "" -#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:590 +#: Client\mods\deathmatch\logic\CPacketHandler.cpp:590 msgid "You were kicked from the game" msgstr "" -#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:591 -#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:602 +#: Client\mods\deathmatch\logic\CPacketHandler.cpp:591 +#: Client\mods\deathmatch\logic\CPacketHandler.cpp:602 msgid "This server requires a non-modifed gta_sa.exe" msgstr "" -#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:592 -#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:603 +#: Client\mods\deathmatch\logic\CPacketHandler.cpp:592 +#: Client\mods\deathmatch\logic\CPacketHandler.cpp:603 msgid "Please replace gta_sa.exe" msgstr "" -#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:593 +#: Client\mods\deathmatch\logic\CPacketHandler.cpp:593 msgid "This server does not allow custom D3D9.DLLs" msgstr "" -#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:594 +#: Client\mods\deathmatch\logic\CPacketHandler.cpp:594 msgid "Remove D3D9.DLL from your GTA install directory and restart MTA" msgstr "" -#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:595 +#: Client\mods\deathmatch\logic\CPacketHandler.cpp:595 msgid "This server does not allow virtual machines" msgstr "" -#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:596 +#: Client\mods\deathmatch\logic\CPacketHandler.cpp:596 msgid "This server requires driver signing to be enabled" msgstr "" -#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:597 +#: Client\mods\deathmatch\logic\CPacketHandler.cpp:597 msgid "Please restart your PC" msgstr "" -#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:598 +#: Client\mods\deathmatch\logic\CPacketHandler.cpp:598 msgid "This server has detected missing anti-cheat components" msgstr "" -#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:599 +#: Client\mods\deathmatch\logic\CPacketHandler.cpp:599 msgid "Try restarting MTA" msgstr "" -#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:600 +#: Client\mods\deathmatch\logic\CPacketHandler.cpp:600 msgid "This server requires a non-modifed gta3.img and gta_int.img" msgstr "" -#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:601 +#: Client\mods\deathmatch\logic\CPacketHandler.cpp:601 msgid "Please replace gta3.img or gta_int.img" msgstr "" -#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:604 +#: Client\mods\deathmatch\logic\CPacketHandler.cpp:604 msgid "This server does not allow Wine" msgstr "" -#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:605 +#: Client\mods\deathmatch\logic\CPacketHandler.cpp:605 msgid "Ensure no other program is modifying MTA:SA" msgstr "" -#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:619 +#: Client\mods\deathmatch\logic\CPacketHandler.cpp:619 msgid "Time Remaining: " msgstr "" -#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:629 +#: Client\mods\deathmatch\logic\CPacketHandler.cpp:629 #, c-format msgid "%d day" msgid_plural "%d days" msgstr[0] "" msgstr[1] "" -#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:631 +#: Client\mods\deathmatch\logic\CPacketHandler.cpp:631 #, c-format msgid "%d hour" msgid_plural "%d hours" msgstr[0] "" msgstr[1] "" -#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:633 +#: Client\mods\deathmatch\logic\CPacketHandler.cpp:633 #, c-format msgid "%d minute" msgid_plural "%d minutes" msgstr[0] "" msgstr[1] "" -#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:635 +#: Client\mods\deathmatch\logic\CPacketHandler.cpp:635 #, c-format msgid "%d second" msgid_plural "%d seconds" @@ -3067,52 +3042,52 @@ msgstr[0] "" msgstr[1] "" #. Display the error -#: ..\Client\mods\deathmatch\logic\CPacketHandler.cpp:639 +#: Client\mods\deathmatch\logic\CPacketHandler.cpp:639 msgid "Disconnected" msgstr "" #. Throw the error and disconnect -#: ..\Client\mods\deathmatch\logic\CResourceFileDownloadManager.cpp:141 +#: Client\mods\deathmatch\logic\CResourceFileDownloadManager.cpp:141 #, c-format msgid "Download error: %s" msgstr "" -#: ..\Client\mods\deathmatch\logic\CServer.cpp:181 +#: Client\mods\deathmatch\logic\CServer.cpp:181 msgid "Could not start the local server. See console for details." msgstr "" -#: ..\Client\mods\deathmatch\logic\CServer.cpp:182 +#: Client\mods\deathmatch\logic\CServer.cpp:182 #, c-format msgid "Error: Could not start local server. [%s]" msgstr "" -#: ..\Client\mods\deathmatch\logic\CTransferBox.cpp:25 +#: Client\mods\deathmatch\logic\CTransferBox.cpp:25 msgid "Map download progress:" msgstr "" -#: ..\Client\mods\deathmatch\logic\CTransferBox.cpp:28 +#: Client\mods\deathmatch\logic\CTransferBox.cpp:28 msgid "Download Progress:" msgstr "" #. Find our largest piece of text, so we can size accordingly -#: ..\Client\mods\deathmatch\logic\CTransferBox.cpp:42 -#: ..\Client\mods\deathmatch\logic\CTransferBox.cpp:105 +#: Client\mods\deathmatch\logic\CTransferBox.cpp:42 +#: Client\mods\deathmatch\logic\CTransferBox.cpp:105 #, c-format msgid "%s of %s" msgstr "" -#: ..\Client\mods\deathmatch\logic\CTransferBox.cpp:44 -#: ..\Client\mods\deathmatch\logic\CTransferBox.cpp:65 +#: Client\mods\deathmatch\logic\CTransferBox.cpp:44 +#: Client\mods\deathmatch\logic\CTransferBox.cpp:65 msgid "Disconnect to cancel download" msgstr "" #. Couldn't create render target for CPostEffects -#: ..\Client\multiplayer_sa\CMultiplayerSA_CrashFixHacks.cpp:1378 +#: Client\multiplayer_sa\CMultiplayerSA_CrashFixHacks.cpp:1378 msgid "Problem with graphics driver" msgstr "" #. Populate the message and show the box -#: ..\Shared\mods\deathmatch\logic\Utils.cpp:100 +#: Shared\mods\deathmatch\logic\Utils.cpp:100 #, c-format msgid "" "Fatal error (%u). If this problem persists, please check out mtasa.com for " @@ -3123,22 +3098,22 @@ msgstr "" #. assert ( 0 ); #. #endif #. Populate the message and show the box -#: ..\Shared\mods\deathmatch\logic\Utils.cpp:116 +#: Shared\mods\deathmatch\logic\Utils.cpp:116 #, c-format msgid "" "Protocol error (%u). If this problem persists, please check out mtasa.com " "for support." msgstr "" -#: ..\Shared\mods\deathmatch\logic\Utils.cpp:118 +#: Shared\mods\deathmatch\logic\Utils.cpp:118 msgid "Connection error" msgstr "" -#: ..\Shared\sdk\SharedUtil.Misc.hpp:140 +#: Shared\sdk\SharedUtil.Misc.hpp:140 msgid "Multi Theft Auto has not been installed properly, please reinstall." msgstr "" -#: ..\Shared\sdk\SharedUtil.Misc.hpp:710 +#: Shared\sdk\SharedUtil.Misc.hpp:710 msgid "" "Your browser will now display a web page with some help infomation.\n" "\n" diff --git a/Shared/installer/locale/en_US.pot b/Shared/installer/locale/en_US.pot index 7e4b185572..944d6e88b1 100644 --- a/Shared/installer/locale/en_US.pot +++ b/Shared/installer/locale/en_US.pot @@ -1,33 +1,33 @@ -# +# msgid "" msgstr "" "Project-Id-Version: MTA San Andreas Installer 1.x\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-12-21 17:13\n" +"POT-Creation-Date: 2022-04-02 16:58\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" +"Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: \n" #. GET_XPVISTA_PLEASE -#: ../Shared/installer/nightly.nsi:188 +#: Shared/installer/nightly.nsi:188 msgid "" "The version of MTA:SA you've downloaded does not support Windows XP or " "Vista. Please download an alternative version from www.mtasa.com." msgstr "" #. GET_MASTER_PLEASE -#: ../Shared/installer/nightly.nsi:189 +#: Shared/installer/nightly.nsi:189 msgid "" "The version of MTA:SA is designed for old versions of Windows. Please " "download the newest version from www.mtasa.com." msgstr "" #. WELCOME_TEXT -#: ../Shared/installer/nightly.nsi:193 +#: Shared/installer/nightly.nsi:193 msgid "" "This wizard will guide you through the installation or update of $(^Name) ${REVISION_TAG}\n" "\n" @@ -39,17 +39,17 @@ msgid "" msgstr "" #. HEADER_Text -#: ../Shared/installer/nightly.nsi:194 +#: Shared/installer/nightly.nsi:194 msgid "Grand Theft Auto: San Andreas location" msgstr "" #. DIRECTORY_Text_Dest -#: ../Shared/installer/nightly.nsi:195 +#: Shared/installer/nightly.nsi:195 msgid "Grand Theft Auto: San Andreas folder" msgstr "" #. DIRECTORY_Text_Top -#: ../Shared/installer/nightly.nsi:196 +#: Shared/installer/nightly.nsi:196 msgid "" "Please select your Grand Theft Auto: San Andreas folder.$\n" "$\n" @@ -59,160 +59,160 @@ msgid "" msgstr "" #. DESC_Section10 -#: ../Shared/installer/nightly.nsi:199 +#: Shared/installer/nightly.nsi:199 msgid "Create a Start Menu group for installed applications" msgstr "" #. DESC_Section11 -#: ../Shared/installer/nightly.nsi:200 +#: Shared/installer/nightly.nsi:200 msgid "Create a Desktop Shortcut for the MTA:SA Client." msgstr "" #. DESC_Section12 -#: ../Shared/installer/nightly.nsi:201 +#: Shared/installer/nightly.nsi:201 msgid "Register mtasa:// protocol for browser clickable-ness." msgstr "" #. DESC_Section13 -#: ../Shared/installer/nightly.nsi:202 +#: Shared/installer/nightly.nsi:202 msgid "Add to Windows Games Explorer (if present)." msgstr "" #. DESC_DirectX -#: ../Shared/installer/nightly.nsi:203 +#: Shared/installer/nightly.nsi:203 msgid "Install or update DirectX (if required)." msgstr "" #. DESC_Section1 -#: ../Shared/installer/nightly.nsi:204 +#: Shared/installer/nightly.nsi:204 msgid "The core components required to run Multi Theft Auto." msgstr "" #. DESC_Section2 -#: ../Shared/installer/nightly.nsi:205 +#: Shared/installer/nightly.nsi:205 msgid "The MTA:SA modification, allowing you to play online." msgstr "" #. DESC_SectionGroupServer -#: ../Shared/installer/nightly.nsi:208 +#: Shared/installer/nightly.nsi:208 msgid "" "The Multi Theft Auto Server. This allows you to host games from your " "computer. This requires a fast internet connection." msgstr "" #. DESC_Section4 -#: ../Shared/installer/nightly.nsi:209 +#: Shared/installer/nightly.nsi:209 msgid "The Multi Theft Auto server. This is a required component." msgstr "" #. DESC_Section5 -#: ../Shared/installer/nightly.nsi:210 +#: Shared/installer/nightly.nsi:210 msgid "The MTA:SA modification for the server." msgstr "" #. DESC_Section6 -#: ../Shared/installer/nightly.nsi:211 +#: Shared/installer/nightly.nsi:211 msgid "This is a set of required resources for your server." msgstr "" #. DESC_Section7 -#: ../Shared/installer/nightly.nsi:212 +#: Shared/installer/nightly.nsi:212 msgid "This is an optional set of gamemodes and maps for your server." msgstr "" #. DESC_Section8 -#: ../Shared/installer/nightly.nsi:213 +#: Shared/installer/nightly.nsi:213 msgid "" "The MTA:SA 1.0 Map Editor. This can be used to create your very own maps " "for use in gamemodes for MTA." msgstr "" #. DESC_Section9 -#: ../Shared/installer/nightly.nsi:214 +#: Shared/installer/nightly.nsi:214 msgid "" "This is the SDK for creating binary modules for the MTA server. Only install" " if you have a good understanding of C++!" msgstr "" #. DESC_SectionGroupDev -#: ../Shared/installer/nightly.nsi:216 +#: Shared/installer/nightly.nsi:216 msgid "" "Development code and tools that aid in the creation of mods for Multi Theft " "Auto" msgstr "" #. DESC_SectionGroupClient -#: ../Shared/installer/nightly.nsi:217 +#: Shared/installer/nightly.nsi:217 msgid "The client is the program you run to play on a Multi Theft Auto server" msgstr "" #. INST_CLIENTSERVER -#: ../Shared/installer/nightly.nsi:417 +#: Shared/installer/nightly.nsi:417 msgid "Client and Server" msgstr "" #. INST_SERVER -#: ../Shared/installer/nightly.nsi:418 +#: Shared/installer/nightly.nsi:418 msgid "Server only" msgstr "" #. INST_STARTMENU_GROUP -#: ../Shared/installer/nightly.nsi:432 +#: Shared/installer/nightly.nsi:432 msgid "Start menu group" msgstr "" #. INST_DESKTOP_ICON -#: ../Shared/installer/nightly.nsi:433 +#: Shared/installer/nightly.nsi:433 msgid "Desktop icon" msgstr "" #. INST_PROTOCOL -#: ../Shared/installer/nightly.nsi:434 +#: Shared/installer/nightly.nsi:434 msgid "Register mtasa:// protocol" msgstr "" #. INST_GAMES_EXPLORER -#: ../Shared/installer/nightly.nsi:435 +#: Shared/installer/nightly.nsi:435 msgid "Add to Games Explorer" msgstr "" #. INST_DIRECTX -#: ../Shared/installer/nightly.nsi:436 +#: Shared/installer/nightly.nsi:436 msgid "Install DirectX" msgstr "" #. INST_SEC_CLIENT -#: ../Shared/installer/nightly.nsi:470 +#: Shared/installer/nightly.nsi:470 msgid "Game client" msgstr "" #. INST_SEC_SERVER -#: ../Shared/installer/nightly.nsi:471 +#: Shared/installer/nightly.nsi:471 msgid "Dedicated server" msgstr "" #. INST_SEC_CORE -#: ../Shared/installer/nightly.nsi:472 +#: Shared/installer/nightly.nsi:472 msgid "Core components" msgstr "" #. INST_SEC_GAME -#: ../Shared/installer/nightly.nsi:473 +#: Shared/installer/nightly.nsi:473 msgid "Game module" msgstr "" #. INFO_INPLACE_UPGRADE -#: ../Shared/installer/nightly.nsi:475 +#: Shared/installer/nightly.nsi:475 msgid "Performing in-place upgrade..." msgstr "" #. INFO_UPDATE_PERMISSIONS -#: ../Shared/installer/nightly.nsi:476 +#: Shared/installer/nightly.nsi:476 msgid "Updating permissions. This could take a few minutes..." msgstr "" #. MSGBOX_INVALID_GTASA -#: ../Shared/installer/nightly.nsi:479 +#: Shared/installer/nightly.nsi:479 msgid "" "A valid Windows version of Grand Theft Auto: San Andreas was not detected.$\r" "$\n" @@ -222,44 +222,44 @@ msgid "" msgstr "" #. INST_SEC_CORE_RESOURCES -#: ../Shared/installer/nightly.nsi:480 +#: Shared/installer/nightly.nsi:480 msgid "Core Resources" msgstr "" #. INST_SEC_OPTIONAL_RESOURCES -#: ../Shared/installer/nightly.nsi:481 +#: Shared/installer/nightly.nsi:481 msgid "Optional Resources" msgstr "" #. INST_SEC_EDITOR -#: ../Shared/installer/nightly.nsi:482 +#: Shared/installer/nightly.nsi:482 msgid "Editor" msgstr "" #. INST_SEC_DEVELOPER -#: ../Shared/installer/nightly.nsi:957 +#: Shared/installer/nightly.nsi:957 msgid "Development" msgstr "" #. UNINST_SUCCESS -#: ../Shared/installer/nightly.nsi:1005 +#: Shared/installer/nightly.nsi:1005 msgid "$(^Name) was successfully removed from your computer." msgstr "" #. UNINST_FAIL -#: ../Shared/installer/nightly.nsi:1012 +#: Shared/installer/nightly.nsi:1012 msgid "Uninstallation has failed!" msgstr "" #. UNINST_REQUEST -#: ../Shared/installer/nightly.nsi:1020 +#: Shared/installer/nightly.nsi:1020 msgid "" "Are you sure you want to completely remove $(^Name) and all of its " "components?" msgstr "" #. UNINST_REQUEST_NOTE -#: ../Shared/installer/nightly.nsi:1023 +#: Shared/installer/nightly.nsi:1023 msgid "" "Uninstalling before update?$\r" "$\n" @@ -269,7 +269,7 @@ msgid "" msgstr "" #. UNINST_DATA_REQUEST -#: ../Shared/installer/nightly.nsi:1034 +#: Shared/installer/nightly.nsi:1034 msgid "" "Would you like to keep your data files (such as resources, screenshots and " "server configuration)? If you click no, any resources, configurations or " @@ -277,27 +277,27 @@ msgid "" msgstr "" #. UAC_RIGHTS1 -#: ../Shared/installer/nightly.nsi:1132 +#: Shared/installer/nightly.nsi:1132 msgid "This installer requires admin access, try again" msgstr "" #. UAC_RIGHTS_UN -#: ../Shared/installer/nightly.nsi:1133 +#: Shared/installer/nightly.nsi:1133 msgid "This uninstaller requires admin access, try again" msgstr "" #. UAC_RIGHTS3 -#: ../Shared/installer/nightly.nsi:1134 +#: Shared/installer/nightly.nsi:1134 msgid "Logon service not running, aborting!" msgstr "" #. UAC_RIGHTS4 -#: ../Shared/installer/nightly.nsi:1135 +#: Shared/installer/nightly.nsi:1135 msgid "Unable to elevate" msgstr "" #. INST_MTA_CONFLICT -#: ../Shared/installer/nightly.nsi:1734 +#: Shared/installer/nightly.nsi:1734 msgid "" "A different major version of MTA ($1) already exists at that path.$\n" "$\n" @@ -306,7 +306,7 @@ msgid "" msgstr "" #. INST_GTA_CONFLICT -#: ../Shared/installer/nightly.nsi:1737 +#: Shared/installer/nightly.nsi:1737 msgid "" "MTA cannot be installed into the same directory as GTA:SA.$\n" "$\n" @@ -315,7 +315,7 @@ msgid "" msgstr "" #. INST_GTA_ERROR1 -#: ../Shared/installer/nightly.nsi:1739 +#: Shared/installer/nightly.nsi:1739 msgid "" "The selected directory does not exist.$\n" "$\n" @@ -323,7 +323,7 @@ msgid "" msgstr "" #. INST_GTA_ERROR2 -#: ../Shared/installer/nightly.nsi:1741 +#: Shared/installer/nightly.nsi:1741 msgid "" "Could not find GTA:SA installed at $GTA_DIR $\n" "$\n" @@ -331,19 +331,19 @@ msgid "" msgstr "" #. INST_CHOOSE_LOC_TOP -#: ../Shared/installer/nightly.nsi:1858 +#: Shared/installer/nightly.nsi:1858 msgid "Choose Install Location" msgstr "" #. INST_CHOOSE_LOC -#: ../Shared/installer/nightly.nsi:1859 +#: Shared/installer/nightly.nsi:1859 msgid "" "Choose the folder in which to install ${PRODUCT_NAME_NO_VER} " "${PRODUCT_VERSION}" msgstr "" #. INST_CHOOSE_LOC2 -#: ../Shared/installer/nightly.nsi:1861 +#: Shared/installer/nightly.nsi:1861 msgid "" "${PRODUCT_NAME_NO_VER} ${PRODUCT_VERSION} will be installed in the following folder.$\n" "To install in a different folder, click Browse and select another folder.$\n" @@ -352,63 +352,63 @@ msgid "" msgstr "" #. INST_CHOOSE_LOC3 -#: ../Shared/installer/nightly.nsi:1862 +#: Shared/installer/nightly.nsi:1862 msgid "Destination Folder" msgstr "" #. INST_CHOOSE_LOC_BROWSE -#: ../Shared/installer/nightly.nsi:1863 +#: Shared/installer/nightly.nsi:1863 msgid "Browse..." msgstr "" #. INST_CHOOSE_LOC_DEFAULT -#: ../Shared/installer/nightly.nsi:1864 +#: Shared/installer/nightly.nsi:1864 msgid "Default" msgstr "" #. INST_CHOOSE_LOC_LAST_USED -#: ../Shared/installer/nightly.nsi:1865 +#: Shared/installer/nightly.nsi:1865 msgid "Last used" msgstr "" #. INST_CHOOSE_LOC_CUSTOM -#: ../Shared/installer/nightly.nsi:1866 +#: Shared/installer/nightly.nsi:1866 msgid "Custom" msgstr "" #. INST_CHOOSE_LOC4 -#: ../Shared/installer/nightly.nsi:2044 +#: Shared/installer/nightly.nsi:2044 msgid "" "Select the folder to install ${PRODUCT_NAME_NO_VER} ${PRODUCT_VERSION} in:" msgstr "" #. INST_LOC_OW -#: ../Shared/installer/nightly.nsi:2062 +#: Shared/installer/nightly.nsi:2062 msgid "" "Warning: A different major version of MTA ($1) already exists at that path." msgstr "" #. INST_LOC_UPGRADE -#: ../Shared/installer/nightly.nsi:2063 +#: Shared/installer/nightly.nsi:2063 msgid "Installation type: Upgrade" msgstr "" #. NETTEST_TITLE1 -#: ../Shared/installer/nightly.nsi:2306 +#: Shared/installer/nightly.nsi:2306 msgid "Online update" msgstr "" #. NETTEST_TITLE2 -#: ../Shared/installer/nightly.nsi:2307 +#: Shared/installer/nightly.nsi:2307 msgid "Checking for update information" msgstr "" #. NETTEST_STATUS1 -#: ../Shared/installer/nightly.nsi:2308 +#: Shared/installer/nightly.nsi:2308 msgid "Checking for installer update information..." msgstr "" #. NETTEST_STATUS2 -#: ../Shared/installer/nightly.nsi:2309 +#: Shared/installer/nightly.nsi:2309 msgid "Please ensure your firewall is not blocking" msgstr "" From 3635e33ff232e3dc5af89808d7538c2f976e6bdf Mon Sep 17 00:00:00 2001 From: patrikjuvonen <22572159+patrikjuvonen@users.noreply.github.com> Date: Sat, 2 Apr 2022 21:13:04 +0300 Subject: [PATCH 31/49] Update lunasvg from 2.2.0 to 2.3.1 (#2584) --- vendor/lunasvg/README.md | 8 +++++--- vendor/lunasvg/include/lunasvg.h | 12 ++++++------ vendor/lunasvg/source/parser.cpp | 20 ++++++++++---------- 3 files changed, 21 insertions(+), 19 deletions(-) diff --git a/vendor/lunasvg/README.md b/vendor/lunasvg/README.md index 8af0ab6d36..75d8808f5f 100644 --- a/vendor/lunasvg/README.md +++ b/vendor/lunasvg/README.md @@ -1,4 +1,4 @@ -[![Releases](https://img.shields.io/badge/Version-2.2.0-orange.svg)](https://github.com/sammycage/lunasvg/releases) +[![Releases](https://img.shields.io/badge/Version-2.3.1-orange.svg)](https://github.com/sammycage/lunasvg/releases) [![License](https://img.shields.io/badge/License-MIT-blue.svg)](https://github.com/sammycage/lunasvg/blob/master/LICENSE) [![Build Status](https://github.com/sammycage/lunasvg/actions/workflows/ci.yml/badge.svg)](https://github.com/sammycage/lunasvg/actions) @@ -9,7 +9,7 @@ ## Example ```cpp -#include +#include using namespace lunasvg; @@ -76,7 +76,9 @@ svg2png [filename] [resolution] [bgColor] - [PICsimLab](https://github.com/lcgamboa/picsimlab) - [MoneyManagerEx](https://github.com/moneymanagerex/moneymanagerex) - [RmlUi](https://github.com/mikke89/RmlUi) -- [EKA2L1](https://github.com/EKA2L1/EKA2L1) +- [EKA2L1](https://github.com/EKA2L/EKA2L1) +- [ObEngine](https://github.com/ObEngine/ObEngine) +- [OTTO](https://github.com/bitfieldaudio/OTTO) ## Support Me diff --git a/vendor/lunasvg/include/lunasvg.h b/vendor/lunasvg/include/lunasvg.h index 3a3f028a0f..8aab4a969d 100644 --- a/vendor/lunasvg/include/lunasvg.h +++ b/vendor/lunasvg/include/lunasvg.h @@ -129,14 +129,14 @@ class LUNASVG_API Document static std::unique_ptr loadFromData(const char* data); /** - * @brief Rotates the document matrix clockwise around the current origin + * @brief Pre-Rotates the document matrix clockwise around the current origin * @param angle - rotation angle, in degrees * @return this */ Document* rotate(double angle); /** - * @brief Rotates the document matrix clockwise around the given point + * @brief Pre-Rotates the document matrix clockwise around the given point * @param angle - rotation angle, in degrees * @param cx - horizontal translation * @param cy - vertical translation @@ -145,7 +145,7 @@ class LUNASVG_API Document Document* rotate(double angle, double cx, double cy); /** - * @brief Scales the document matrix by sx horizontally and sy vertically + * @brief Pre-Scales the document matrix by sx horizontally and sy vertically * @param sx - horizontal scale factor * @param sy - vertical scale factor * @return this @@ -153,7 +153,7 @@ class LUNASVG_API Document Document* scale(double sx, double sy); /** - * @brief Shears the document matrix by shx horizontally and shy vertically + * @brief Pre-Shears the document matrix by shx horizontally and shy vertically * @param shx - horizontal skew factor, in degree * @param shy - vertical skew factor, in degree * @return this @@ -161,7 +161,7 @@ class LUNASVG_API Document Document* shear(double shx, double shy); /** - * @brief Translates the document matrix by tx horizontally and ty vertically + * @brief Pre-Translates the document matrix by tx horizontally and ty vertically * @param tx - horizontal translation * @param ty - vertical translation * @return this @@ -169,7 +169,7 @@ class LUNASVG_API Document Document* translate(double tx, double ty); /** - * @brief Multiplies the document matrix by Matrix(a, b, c, d, e, f) + * @brief Pre-Multiplies the document matrix by Matrix(a, b, c, d, e, f) * @param a - horizontal scale factor * @param b - horizontal skew factor * @param c - vertical skew factor diff --git a/vendor/lunasvg/source/parser.cpp b/vendor/lunasvg/source/parser.cpp index b66892d15f..a3f0720800 100644 --- a/vendor/lunasvg/source/parser.cpp +++ b/vendor/lunasvg/source/parser.cpp @@ -188,7 +188,7 @@ Path Parser::parsePath(const std::string& string) case 'M': case 'm': if(!parseNumberList(ptr, end, c, 2)) - break; + return path; if(command == 'm') { @@ -204,7 +204,7 @@ Path Parser::parsePath(const std::string& string) case 'L': case 'l': if(!parseNumberList(ptr, end, c, 2)) - break; + return path; if(command == 'l') { @@ -219,7 +219,7 @@ Path Parser::parsePath(const std::string& string) case 'Q': case 'q': if(!parseNumberList(ptr, end, c, 4)) - break; + return path; if(command == 'q') { @@ -238,7 +238,7 @@ Path Parser::parsePath(const std::string& string) case 'C': case 'c': if(!parseNumberList(ptr, end, c, 6)) - break; + return path; if(command == 'c') { @@ -261,7 +261,7 @@ Path Parser::parsePath(const std::string& string) c[0] = 2 * currentPoint.x - controlPoint.x; c[1] = 2 * currentPoint.y - controlPoint.y; if(!parseNumberList(ptr, end, c + 2, 2)) - break; + return path; if(command == 't') { @@ -280,7 +280,7 @@ Path Parser::parsePath(const std::string& string) c[0] = 2 * currentPoint.x - controlPoint.x; c[1] = 2 * currentPoint.y - controlPoint.y; if(!parseNumberList(ptr, end, c + 2, 4)) - break; + return path; if(command == 's') { @@ -299,7 +299,7 @@ Path Parser::parsePath(const std::string& string) case 'H': case 'h': if(!parseNumberList(ptr, end, c, 1)) - break; + return path; if(command == 'h') c[0] += currentPoint.x; @@ -310,7 +310,7 @@ Path Parser::parsePath(const std::string& string) case 'V': case 'v': if(!parseNumberList(ptr, end, c + 1, 1)) - break; + return path; if(command == 'v') c[1] += currentPoint.y; @@ -324,7 +324,7 @@ Path Parser::parsePath(const std::string& string) || !parseArcFlag(ptr, end, f[0]) || !parseArcFlag(ptr, end, f[1]) || !parseNumberList(ptr, end, c + 3, 2)) - break; + return path; if(command == 'a') { @@ -343,7 +343,7 @@ Path Parser::parsePath(const std::string& string) currentPoint.y = controlPoint.y = startPoint.y; break; default: - break; + return path; } Utils::skipWsComma(ptr, end); From 9b2dbbb8ad81edfc0d0837d43e2a9af57bfb8e8a Mon Sep 17 00:00:00 2001 From: patrikjuvonen <22572159+patrikjuvonen@users.noreply.github.com> Date: Sun, 3 Apr 2022 14:29:48 +0300 Subject: [PATCH 32/49] Convert bug report issue template to the new beta form template https://docs.github.com/en/communities/using-templates-to-encourage-useful-issues-and-pull-requests/configuring-issue-templates-for-your-repository#creating-issue-forms --- .github/ISSUE_TEMPLATE/bug_report.md | 57 ---------------------- .github/ISSUE_TEMPLATE/bug_report.yml | 69 +++++++++++++++++++++++++++ 2 files changed, 69 insertions(+), 57 deletions(-) delete mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/bug_report.yml diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md deleted file mode 100644 index 0b0bfe1656..0000000000 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ /dev/null @@ -1,57 +0,0 @@ ---- -name: Bug report -about: Create a report to help us improve -labels: bug - ---- - - - -**Describe the bug** - - -**To reproduce** - - -**Expected behaviour** - - -**Screenshots** - - -**Version** - - -**Additional context** - diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 0000000000..6ba31be38c --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,69 @@ +name: Bug report +description: Create a report to help us improve +labels: bug +body: + - type: markdown + attributes: + value: | + # Stop right now if you're reporting a cheat or security vulnerability! + + **Please read our [Security Policy](https://github.com/multitheftauto/mtasa-blue/security/policy) to learn where to responsibly report security issues. Thank you.** + - type: textarea + id: what-happened + attributes: + label: Describe the bug + description: Please provide us a clear and concise description of what the bug is. + placeholder: Tell us what you see! + validations: + required: true + - type: textarea + id: to-reproduce + attributes: + label: Steps to reproduce + description: Please provide us clear steps to reproduce the behaviour. + placeholder: | + 1. Go to '...' + 2. Click on '...' + 3. Scroll down to '...' + 4. See error + validations: + required: true + - type: textarea + id: version + attributes: + label: Version + description: | + Please provide us the version of the MTA client and/or server you are running. + + Client: You can open the client console using the `F8` key on your keyboard and using the `ver` command to get the version. + Server: You can use the `ver` command in the server console to get the version. + + If you are running Wine, please say so, and say if you're using Linux or MacOS. + + Which operating system the server is running on, if relevant. + placeholder: | + Client: v1.5.9-release-21140 (Windows 10, 64-bit) + Server: v1.5.9-release-21140 (Debian 10, 64-bit) + - type: textarea + id: additional-context + attributes: + label: Additional context + description: | + If available, please provide any other additional context, such as screenshots or videos, or links to other relevant issues, pull requests or documents about the problem here that can help us troubleshoot your issue more accurately. + - type: textarea + id: logs + attributes: + label: Relevant log output + description: | + Please copy and paste any relevant log output. This will be automatically formatted into code, so no need for backticks. + + **Warning!** Do not post any personal information or sensitive logs here. You are responsible for redacting any personal information from the logs. If you need to post sensitive logs, you can use our [private log uploader](https://upload.mtasa.com/) which will only allow MTA staff to access the file, just paste the link to it here. + render: shell + - type: checkboxes + id: terms + attributes: + label: Security Policy + description: By submitting this issue, you express that you have read and understood our [Security Policy](https://github.com/multitheftauto/mtasa-blue/security/policy) and that this issue is not security related. + options: + - label: I have read and understood the Security Policy and this issue is not security related. + required: true From 70e59bb576dad330de243243791a1cb5bf441f91 Mon Sep 17 00:00:00 2001 From: patrikjuvonen <22572159+patrikjuvonen@users.noreply.github.com> Date: Sun, 3 Apr 2022 15:59:05 +0300 Subject: [PATCH 33/49] Convert feature request issue template to the new beta form template https://docs.github.com/en/communities/using-templates-to-encourage-useful-issues-and-pull-requests/configuring-issue-templates-for-your-repository#creating-issue-forms --- .github/ISSUE_TEMPLATE/feature_request.md | 18 --------- .github/ISSUE_TEMPLATE/feature_request.yml | 44 ++++++++++++++++++++++ 2 files changed, 44 insertions(+), 18 deletions(-) delete mode 100644 .github/ISSUE_TEMPLATE/feature_request.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.yml diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md deleted file mode 100644 index 16c2ab1335..0000000000 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -name: Feature request -about: Suggest an idea for this project -labels: enhancement - ---- - -**Is your feature request related to a problem? Please describe.** - - -**Describe the solution you'd like** - - -**Describe alternatives you've considered** - - -**Additional context** - diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml new file mode 100644 index 0000000000..96ec0eb2b3 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -0,0 +1,44 @@ +name: Feature request +description: Suggest an idea for this project +labels: enhancement +body: + - type: markdown + attributes: + value: | + # Stop right now if you're reporting a cheat or security vulnerability! + + **Please read our [Security Policy](https://github.com/multitheftauto/mtasa-blue/security/policy) to learn where to responsibly report security issues. Thank you.** + + This template is only for suggesting features. If you have a bug report, please use the [bug report template](https://github.com/multitheftauto/mtasa-blue/issues/new?assignees=&labels=bug&template=bug_report.yml). + - type: textarea + id: description + attributes: + label: Is your feature request related to a problem? Please describe. + description: | + Please provide a clear and concise description of what the problem is. For example: I'm always frustrated when [...] + - type: textarea + id: solution + attributes: + label: Describe the solution you'd like + description: Please provide a clear and concise description of what you want to happen. + validations: + required: true + - type: textarea + id: alternatives + attributes: + label: Describe alternatives you've considered + description: Please provide a clear and concise description of any alternative solutions or features you've considered. + - type: textarea + id: additional-context + attributes: + label: Additional context + description: | + If available, please provide any other additional context, such as screenshots or videos, or links to other relevant issues, pull requests or documents that can help others better understand your request. + - type: checkboxes + id: terms + attributes: + label: Security Policy + description: By submitting this issue, you express that you have read and understood our [Security Policy](https://github.com/multitheftauto/mtasa-blue/security/policy) and that this issue is not about a cheat or security vulnerability. + options: + - label: I have read and understood the Security Policy and this issue is not about a cheat or security vulnerability. + required: true From 07204d2a989ad882950bcb66d0bb8ef5293089d5 Mon Sep 17 00:00:00 2001 From: patrikjuvonen <22572159+patrikjuvonen@users.noreply.github.com> Date: Sun, 3 Apr 2022 15:59:25 +0300 Subject: [PATCH 34/49] Tweak bug report issue template - Added a link to feature request template - Tweaked some text to be more "inclusive" --- .github/ISSUE_TEMPLATE/bug_report.yml | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 6ba31be38c..9dd8d8fd7e 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -8,11 +8,13 @@ body: # Stop right now if you're reporting a cheat or security vulnerability! **Please read our [Security Policy](https://github.com/multitheftauto/mtasa-blue/security/policy) to learn where to responsibly report security issues. Thank you.** + + This template is only for reporting bugs. If you have a feature request, please use the [feature request template](https://github.com/multitheftauto/mtasa-blue/issues/new?assignees=&labels=enhancement&template=feature_request.yml). - type: textarea id: what-happened attributes: label: Describe the bug - description: Please provide us a clear and concise description of what the bug is. + description: Please provide a clear and concise description of what the bug is. placeholder: Tell us what you see! validations: required: true @@ -20,7 +22,7 @@ body: id: to-reproduce attributes: label: Steps to reproduce - description: Please provide us clear steps to reproduce the behaviour. + description: Please provide clear steps to reproduce the behaviour. placeholder: | 1. Go to '...' 2. Click on '...' @@ -33,7 +35,7 @@ body: attributes: label: Version description: | - Please provide us the version of the MTA client and/or server you are running. + Please provide the version of the MTA client and/or server you are running. Client: You can open the client console using the `F8` key on your keyboard and using the `ver` command to get the version. Server: You can use the `ver` command in the server console to get the version. @@ -49,7 +51,7 @@ body: attributes: label: Additional context description: | - If available, please provide any other additional context, such as screenshots or videos, or links to other relevant issues, pull requests or documents about the problem here that can help us troubleshoot your issue more accurately. + If available, please provide any other additional context, such as screenshots or videos, or links to other relevant issues, pull requests or documents that can help others troubleshoot your issue more accurately and efficiently. - type: textarea id: logs attributes: From 41c99ae3502f45e76f5ee0a1a8942a66a2e00544 Mon Sep 17 00:00:00 2001 From: MTABot Date: Wed, 6 Apr 2022 08:03:00 +0000 Subject: [PATCH 35/49] Visual Studio Update VS2022: 17.1.32319.34 => 17.1.32328.378 This is an automated commit to keep track of toolchain changes on the build server. It applies to every MTA build after this commit until further notice. From 9708440462cd5ee815769bf5dfbdbe90d704cd26 Mon Sep 17 00:00:00 2001 From: Lpsd <40902730+Lpsd@users.noreply.github.com> Date: Thu, 7 Apr 2022 08:23:29 -0700 Subject: [PATCH 36/49] Remove leftover Discord implementation (#2499) * Remove discord stuff * Revert accidental commit * Revert enum removals * Revert accidental commit in CClientGame.cpp * Bump bitstream * Write empty string to bitstream if server using old Discord implementation * "Deprecate" functions instead of removing Co-authored-by: patrikjuvonen <22572159+patrikjuvonen@users.noreply.github.com> --- Client/core/CClientVariables.cpp | 1 - Client/core/CConnectManager.cpp | 15 +- Client/core/CConnectManager.h | 6 +- Client/core/CCore.cpp | 34 +---- Client/core/CCore.h | 5 - Client/core/CDiscordManager.cpp | 103 -------------- Client/core/CDiscordManager.h | 70 ---------- Client/core/CMainMenu.cpp | 7 - Client/core/CVersionUpdater.cpp | 23 ---- Client/core/CVersionUpdater.h | 1 - Client/core/DXHook/CDirect3DHook9.cpp | 1 - Client/mods/deathmatch/CClient.cpp | 9 +- Client/mods/deathmatch/CClient.h | 2 - Client/mods/deathmatch/StdInc.h | 1 - Client/mods/deathmatch/logic/CClientGame.cpp | 33 +---- Client/mods/deathmatch/logic/CClientGame.h | 5 +- .../mods/deathmatch/logic/CPacketHandler.cpp | 4 - Client/mods/deathmatch/logic/CServerInfo.cpp | 1 - .../mods/deathmatch/logic/rpc/CWorldRPCs.cpp | 17 --- Client/mods/deathmatch/logic/rpc/CWorldRPCs.h | 1 - Client/sdk/core/CClientBase.h | 2 - Client/sdk/core/CCoreInterface.h | 3 - Client/sdk/core/CDiscordManagerInterface.h | 113 --------------- Server/mods/deathmatch/StdInc.h | 1 - Server/mods/deathmatch/logic/CGame.cpp | 33 ----- Server/mods/deathmatch/logic/CGame.h | 1 - .../deathmatch/logic/CPacketTranslator.cpp | 4 - Server/mods/deathmatch/logic/CPlayer.h | 3 - .../deathmatch/logic/CResourceChecker.Data.h | 3 + .../logic/CStaticFunctionDefinitions.cpp | 29 ---- .../logic/CStaticFunctionDefinitions.h | 1 - .../logic/luadefs/CLuaCompatibilityDefs.cpp | 130 ++++++++++-------- .../logic/luadefs/CLuaPlayerDefs.cpp | 34 ----- .../deathmatch/logic/luadefs/CLuaPlayerDefs.h | 1 - .../logic/packets/CDiscordJoinPacket.cpp | 16 --- .../logic/packets/CDiscordJoinPacket.h | 30 ---- .../logic/packets/CPlayerJoinDataPacket.cpp | 6 - .../logic/packets/CPlayerJoinDataPacket.h | 3 - Shared/sdk/net/bitstream.h | 4 + premake5.lua | 1 - utils/buildactions/install_discord.lua | 52 ------- 41 files changed, 86 insertions(+), 723 deletions(-) delete mode 100644 Client/core/CDiscordManager.cpp delete mode 100644 Client/core/CDiscordManager.h delete mode 100644 Client/sdk/core/CDiscordManagerInterface.h delete mode 100644 Server/mods/deathmatch/logic/packets/CDiscordJoinPacket.cpp delete mode 100644 Server/mods/deathmatch/logic/packets/CDiscordJoinPacket.h delete mode 100644 utils/buildactions/install_discord.lua diff --git a/Client/core/CClientVariables.cpp b/Client/core/CClientVariables.cpp index 2ebb5f7418..f65f1ce841 100644 --- a/Client/core/CClientVariables.cpp +++ b/Client/core/CClientVariables.cpp @@ -350,7 +350,6 @@ void CClientVariables::LoadDefaults() DEFAULT("browser_remote_websites", true); // Load remote websites? DEFAULT("browser_remote_javascript", true); // Execute javascript on remote websites? DEFAULT("filter_duplicate_log_lines", true); // Filter duplicate log lines for debug view and clientscript.log - DEFAULT("discord_rich_presence", true); // Enable Discord Game SDK DEFAULT("always_show_transferbox", false); // Should the transfer box always be visible for downloads? (and ignore scripted control) DEFAULT("_beta_qc_rightclick_command", _S("reconnect")); // Command to run when right clicking quick connect (beta - can be removed at any time) diff --git a/Client/core/CConnectManager.cpp b/Client/core/CConnectManager.cpp index 66b7515766..d53cdc8934 100644 --- a/Client/core/CConnectManager.cpp +++ b/Client/core/CConnectManager.cpp @@ -46,8 +46,7 @@ CConnectManager::~CConnectManager() g_pConnectManager = NULL; } -bool CConnectManager::Connect(const char* szHost, unsigned short usPort, const char* szNick, const char* szPassword, bool bNotifyServerBrowser, - const char* szSecret) +bool CConnectManager::Connect(const char* szHost, unsigned short usPort, const char* szNick, const char* szPassword, bool bNotifyServerBrowser) { assert(szHost); assert(szNick); @@ -101,11 +100,6 @@ bool CConnectManager::Connect(const char* szHost, unsigned short usPort, const c m_usPort = usPort; m_bSave = true; - if (szSecret) - m_strDiscordSecretJoin = szSecret; - else - m_strDiscordSecretJoin.clear(); - m_strLastHost = m_strHost; m_usLastPort = m_usPort; m_strLastPassword = m_strPassword; @@ -495,10 +489,3 @@ void CConnectManager::OpenServerFirewall(in_addr Address, ushort usHttpPort, boo g_pCore->GetNetwork()->GetHTTPDownloadManager(EDownloadMode::CONNECT_TCP_SEND)->QueueFile(strDummyUrl, NULL, NULL, NULL, options); } } - -SString CConnectManager::GetJoinSecret() -{ - SString dummy = m_strDiscordSecretJoin; - m_strDiscordSecretJoin.clear(); - return dummy; -} diff --git a/Client/core/CConnectManager.h b/Client/core/CConnectManager.h index d2df4dd355..58b924fcff 100644 --- a/Client/core/CConnectManager.h +++ b/Client/core/CConnectManager.h @@ -21,8 +21,7 @@ class CConnectManager CConnectManager(); ~CConnectManager(); - bool Connect(const char* szHost, unsigned short usPort, const char* szNick, const char* szPassword, bool bNotifyServerBrowser = false, - const char* szSecret = nullptr); + bool Connect(const char* szHost, unsigned short usPort, const char* szNick, const char* szPassword, bool bNotifyServerBrowser = false); bool Reconnect(const char* szHost, unsigned short usPort, const char* szPassword, bool bSave = true); bool Abort(); @@ -35,8 +34,6 @@ class CConnectManager static bool StaticProcessPacket(unsigned char ucPacketID, class NetBitStreamInterface& bitStream); - SString GetJoinSecret(); - std::string m_strLastHost; unsigned short m_usLastPort; std::string m_strLastPassword; @@ -55,7 +52,6 @@ class CConnectManager bool m_bSave; time_t m_tConnectStarted; bool m_bHasTriedSecondConnect; - SString m_strDiscordSecretJoin; GUI_CALLBACK* m_pOnCancelClick; diff --git a/Client/core/CCore.cpp b/Client/core/CCore.cpp index d650e7bffd..3c1a90cee3 100644 --- a/Client/core/CCore.cpp +++ b/Client/core/CCore.cpp @@ -21,7 +21,6 @@ #include "CModelCacheManager.h" #include #include -#include "CDiscordManager.h" using SharedUtil::CalcMTASAPath; using namespace std; @@ -46,7 +45,7 @@ static HMODULE WINAPI SkipDirectPlay_LoadLibraryA(LPCSTR fileName) return Win32LoadLibraryA("d3d8.dll"); } -CCore::CCore() : m_DiscordManager(new CDiscordManager()) +CCore::CCore() { // Initialize the global pointer g_pCore = this; @@ -68,9 +67,6 @@ CCore::CCore() : m_DiscordManager(new CDiscordManager()) ApplyCoreInitSettings(); g_pLocalization = new CLocalization; - // Initialize discord manager - m_DiscordManager->Initialize(); - // Create a logger instance. m_pConsoleLogger = new CConsoleLogger(); @@ -589,11 +585,6 @@ void CCore::SetConnected(bool bConnected) { m_pLocalGUI->GetMainMenu()->SetIsIngame(bConnected); UpdateIsWindowMinimized(); // Force update of stuff - - if (bConnected) - m_DiscordManager->RegisterPlay(true); - else - ResetDiscordRichPresence(); } bool CCore::IsConnected() @@ -790,7 +781,6 @@ void CCore::ApplyHooks2() CCore::GetSingleton().CreateMultiplayer(); CCore::GetSingleton().CreateXML(); CCore::GetSingleton().CreateGUI(); - CCore::GetSingleton().ResetDiscordRichPresence(); } } } @@ -1995,28 +1985,6 @@ uint CCore::GetMaxStreamingMemory() return m_fMaxStreamingMemory; } -// -// ResetDiscordRichPresence -// -void CCore::ResetDiscordRichPresence() -{ - time_t currentTime; - time(¤tTime); - - // Set default parameters - SDiscordActivity activity; - activity.m_details = "In Main Menu"; - activity.m_startTimestamp = currentTime; - - m_DiscordManager->UpdateActivity(activity, [](EDiscordRes res) { - if (res == DiscordRes_Ok) - WriteDebugEvent("[DISCORD]: Rich presence default parameters reset."); - else - WriteErrorEvent("[DISCORD]: Unable to reset rich presence default parameters."); - }); - m_DiscordManager->RegisterPlay(false); -} - // // OnCrashAverted // diff --git a/Client/core/CCore.h b/Client/core/CCore.h index ae11544caf..051344f4ec 100644 --- a/Client/core/CCore.h +++ b/Client/core/CCore.h @@ -101,7 +101,6 @@ class CCore : public CCoreInterface, public CSingleton CLocalizationInterface* GetLocalization() { return g_pLocalization; }; CWebCoreInterface* GetWebCore(); CTrayIconInterface* GetTrayIcon() { return m_pTrayIcon; }; - CDiscordManagerInterface* GetDiscordManager() { return reinterpret_cast(m_DiscordManager.get()); } void SaveConfig(bool bWaitUntilFinished = false); @@ -227,8 +226,6 @@ class CCore : public CCoreInterface, public CSingleton uint GetMinStreamingMemory(); uint GetMaxStreamingMemory(); - void ResetDiscordRichPresence(); - SString GetConnectCommandFromURI(const char* szURI); void GetConnectParametersFromURI(const char* szURI, std::string& strHost, unsigned short& usPort, std::string& strNick, std::string& strPassword); bool bScreenShot; @@ -298,8 +295,6 @@ class CCore : public CCoreInterface, public CSingleton CWebCoreInterface* m_pWebCore = nullptr; CTrayIcon* m_pTrayIcon; - std::unique_ptr m_DiscordManager; - // Hook interfaces. CMessageLoopHook* m_pMessageLoopHook; CDirectInputHookManager* m_pDirectInputHookManager; diff --git a/Client/core/CDiscordManager.cpp b/Client/core/CDiscordManager.cpp deleted file mode 100644 index 60824e44f4..0000000000 --- a/Client/core/CDiscordManager.cpp +++ /dev/null @@ -1,103 +0,0 @@ -/***************************************************************************** - * - * PROJECT: Multi Theft Auto - * LICENSE: See LICENSE in the top level directory - * FILE: Client/core/CDiscordManager.cpp - * - * Multi Theft Auto is available from http://www.multitheftauto.com/ - * - *****************************************************************************/ - -#include "StdInc.h" -#include "SharedUtil.Thread.h" -#include "CDiscordManager.h" - -#ifndef DISCORD_CLIENT_ID - #define DISCORD_CLIENT_ID 468493322583801867 -#endif - -CDiscordManager::~CDiscordManager() -{ -} - -void CDiscordManager::Initialize() -{ -} - -// Establish connection with discord -void CDiscordManager::Reconnect(bool bOnInitialization) -{ -} - -void CDiscordManager::DiscordLogCallback(discord::LogLevel level, const char* message) -{ -} - -void CDiscordManager::OnActivityJoin(const char* joinSecret) -{ -} - -void* CDiscordManager::DiscordThread(void* arg) -{ - return nullptr; -} - -// Called from separate thread so the unnecessary load won't affect the main thread, -// establishing connection with discord is sometimes time-consuming, especially when it's not running -void CDiscordManager::DoPulse() -{ -} - -void CDiscordManager::UpdateActivity(SDiscordActivity& activity, std::function callback) -{ -} - -void CDiscordManager::UpdateActivity(std::function callback) -{ -} - -void CDiscordManager::SetType(EDiscordActivityT type, std::function callback) -{ -} - -void CDiscordManager::SetName(char const* name, std::function callback) -{ -} - -void CDiscordManager::SetState(char const* state, std::function callback) -{ -} - -void CDiscordManager::SetDetails(char const* details, std::function callback) -{ -} - -void CDiscordManager::SetStartEndTimestamp(int64 start, int64 end, std::function callback) -{ -} - -void CDiscordManager::SetJoinParameters(const char* joinSecret, const char* partyId, uint partySize, uint partyMax, std::function callback) -{ -} - -void CDiscordManager::SetSpectateSecret(const char* spectateSecret, std::function callback) -{ -} - -// Default rich presence settings -void CDiscordManager::RegisterPlay(bool connected) -{ -} - -void CDiscordManager::Restore() -{ -} - -void CDiscordManager::Disconnect() -{ -} - -SString CDiscordManager::GetJoinSecret() -{ - return CCore::GetSingleton().GetConnectManager()->GetJoinSecret(); -} diff --git a/Client/core/CDiscordManager.h b/Client/core/CDiscordManager.h deleted file mode 100644 index 8956330c8a..0000000000 --- a/Client/core/CDiscordManager.h +++ /dev/null @@ -1,70 +0,0 @@ -/***************************************************************************** - * - * PROJECT: Multi Theft Auto - * LICENSE: See LICENSE in the top level directory - * FILE: Client/core/CDiscordManager.h - * - * Multi Theft Auto is available from http://www.multitheftauto.com/ - * - *****************************************************************************/ - -#pragma once - -#include -#include "SharedUtil.Thread.h" - -namespace discord -{ - enum class LogLevel; - class Core; - class Activity; -} // namespace discord - -class CDiscordManager : public CDiscordManagerInterface -{ -public: - ~CDiscordManager(); - - void Initialize(); - - // ActivityManager - void UpdateActivity(SDiscordActivity& activity, std::function callback); // Change it all, or ... - void UpdateActivity(std::function callback); // Change it all, or ... - void SetType(EDiscordActivityT type, std::function callback); // Singular modifications - void SetName(char const* name, std::function callback); - void SetState(char const* state, std::function callback); - void SetDetails(char const* details, std::function callback); - void SetStartEndTimestamp(int64 start, int64 end, std::function callback); - void SetJoinParameters(const char* joinSecret, const char* partyId, uint partySize, uint partyMax, std::function callback); - void SetSpectateSecret(const char* spectateSecret, std::function callback); - void RegisterPlay(bool connected); - void Disconnect(); - - SString GetJoinSecret(); - -private: - void Reconnect(bool bOnInitialization = false); - void DoPulse(); - void Restore(); - - static void DiscordLogCallback(discord::LogLevel level, const char* message); - static void OnActivityJoin(const char* joinSecret); - static void* DiscordThread(void* arg); - - bool NeedsSuicide() const { return m_Suicide; } - void SetDead() { m_Suicide = false; } - - discord::Core* m_DiscordCore = nullptr; - discord::Activity* m_StoredActivity; - - bool m_WaitingForServerName = false; - bool m_Initialized = false; - - volatile bool m_Suicide = false; // Thread kill command - - std::mutex m_ThreadSafety; - SharedUtil::CThreadHandle* m_Thread = nullptr; - - CElapsedTime m_TimeForReconnection; - CQueryReceiver m_QueryReceiver; -}; diff --git a/Client/core/CMainMenu.cpp b/Client/core/CMainMenu.cpp index e8216d35d1..ecae73af6a 100644 --- a/Client/core/CMainMenu.cpp +++ b/Client/core/CMainMenu.cpp @@ -450,13 +450,6 @@ void CMainMenu::Update() if (m_bIsFullyVisible) { - static bool versionUpdaterChecked = false; - if (!versionUpdaterChecked) - { - versionUpdaterChecked = true; - GetVersionUpdater()->OnMainMenuFullyVisible(); - } - // Grab our cursor position tagPOINT cursor; GetCursorPos(&cursor); diff --git a/Client/core/CVersionUpdater.cpp b/Client/core/CVersionUpdater.cpp index d542ccad61..9de113d71a 100644 --- a/Client/core/CVersionUpdater.cpp +++ b/Client/core/CVersionUpdater.cpp @@ -130,7 +130,6 @@ class CVersionUpdater : public CVersionUpdaterInterface int DoPollDownload(); int DoSendPostToNextServer(); int DoPollPost(); - void OnMainMenuFullyVisible(); static void* StaticThreadProc(void* pContext); void* ThreadProc(); @@ -3379,25 +3378,3 @@ int CVersionUpdater::DoPollPost() } return RES_OK; } - -// Issue: #1708 -// Set the update settings to stable build if the user is on 1.5.8. -// We do this only once, this is why we need to write to registry. -void CVersionUpdater::OnMainMenuFullyVisible() -{ - if (MTASA_VERSION_BUILD != 20670) // 20670 is the build number with PR #1712 merged. - return; - const std::string requiredValue = "discord-rich-presence"; - const std::string lastSubKey = "version-revert-reason"; - if (GetApplicationSetting(lastSubKey) != requiredValue) - { - SetApplicationSetting(lastSubKey, requiredValue); - // check if the MTA client version is 1.5.8 - if (MTASA_VERSION_MAJOR == 1 && MTASA_VERSION_MINOR == 5 && MTASA_VERSION_MAINTENANCE == 8) - { - CVARS_SET("update_build_type", 0); - std::string message = _("We've reset your update preferences back to Default, please go change your settings again if you want Nightly updates.\n"); - g_pCore->ShowMessageBox(_("VERSION UPDATE INFORMATION"), message.c_str(), MB_BUTTON_OK | MB_ICON_INFO); - } - } -} diff --git a/Client/core/CVersionUpdater.h b/Client/core/CVersionUpdater.h index 09565405de..94f466bb3a 100644 --- a/Client/core/CVersionUpdater.h +++ b/Client/core/CVersionUpdater.h @@ -28,7 +28,6 @@ class CVersionUpdaterInterface virtual void GetBrowseVersionMaps(std::map& outBlockedVersionMap, std::map& outAllowedVersionMap) = 0; virtual void GetNewsSettings(SString& strOutOldestPost, uint& uiOutMaxHistoryLength) = 0; virtual const SString& GetDebugFilterString() = 0; - virtual void OnMainMenuFullyVisible() = 0; }; CVersionUpdaterInterface* GetVersionUpdater(); diff --git a/Client/core/DXHook/CDirect3DHook9.cpp b/Client/core/DXHook/CDirect3DHook9.cpp index c1f587189f..8717cdf2af 100644 --- a/Client/core/DXHook/CDirect3DHook9.cpp +++ b/Client/core/DXHook/CDirect3DHook9.cpp @@ -84,7 +84,6 @@ IDirect3D9* CDirect3DHook9::API_Direct3DCreate9(UINT SDKVersion) CCore::GetSingleton().CreateMultiplayer(); CCore::GetSingleton().CreateXML(); CCore::GetSingleton().CreateGUI(); - CCore::GetSingleton().ResetDiscordRichPresence(); } // D3DX_SDK_VERSION checks diff --git a/Client/mods/deathmatch/CClient.cpp b/Client/mods/deathmatch/CClient.cpp index c88de73846..e2930e962f 100644 --- a/Client/mods/deathmatch/CClient.cpp +++ b/Client/mods/deathmatch/CClient.cpp @@ -177,10 +177,8 @@ int CClient::ClientInitialize(const char* szArguments, CCoreInterface* pCore) // g_pClientGame->EnablePacketRecorder ( "log.rec" ); // g_pCore->GetConsole ()->Echo ( "Packetlogger is logging to log.rec" ); - SString secret = g_pCore->GetDiscordManager()->GetJoinSecret(); - // Start the game - g_pClientGame->StartGame(arguments.nickname.c_str(), arguments.password.c_str(), CClientGame::SERVER_TYPE_NORMAL, *secret); + g_pClientGame->StartGame(arguments.nickname.c_str(), arguments.password.c_str()); } else { @@ -315,11 +313,6 @@ void CClient::GetPlayerNames(std::vector& vPlayerNames) } } -void CClient::TriggerDiscordJoin(SString strSecret) -{ - g_pClientGame->TriggerDiscordJoin(strSecret); -} - CClient::InitializeArguments CClient::ExtractInitializeArguments(const char* arguments) { // Format: "nickname [password]" diff --git a/Client/mods/deathmatch/CClient.h b/Client/mods/deathmatch/CClient.h index 0f9090c1ea..d8cdaa9668 100644 --- a/Client/mods/deathmatch/CClient.h +++ b/Client/mods/deathmatch/CClient.h @@ -32,8 +32,6 @@ class CClient : public CClientBase bool HandleException(CExceptionInformation* pExceptionInformation); void GetPlayerNames(std::vector& vPlayerNames); - void TriggerDiscordJoin(SString strSecret); - private: struct InitializeArguments { diff --git a/Client/mods/deathmatch/StdInc.h b/Client/mods/deathmatch/StdInc.h index 143e7a3498..61479914fd 100644 --- a/Client/mods/deathmatch/StdInc.h +++ b/Client/mods/deathmatch/StdInc.h @@ -28,7 +28,6 @@ // SDK includes #include #include -#include #include #include #include diff --git a/Client/mods/deathmatch/logic/CClientGame.cpp b/Client/mods/deathmatch/logic/CClientGame.cpp index 886af5017d..34e199fd44 100644 --- a/Client/mods/deathmatch/logic/CClientGame.cpp +++ b/Client/mods/deathmatch/logic/CClientGame.cpp @@ -552,7 +552,7 @@ void CClientGame::StartPlayback() } } -bool CClientGame::StartGame(const char* szNick, const char* szPassword, eServerType Type, const char* szSecret) +bool CClientGame::StartGame(const char* szNick, const char* szPassword, eServerType Type) { m_ServerType = Type; // int dbg = _CrtSetDbgFlag ( _CRTDBG_REPORT_FLAG ); @@ -624,10 +624,10 @@ bool CClientGame::StartGame(const char* szNick, const char* szPassword, eServerT std::string strUser; pBitStream->Write(strUser.c_str(), MAX_SERIAL_LENGTH); - if (g_pNet->CanServerBitStream(eBitStreamVersion::Discord_InitialImplementation)) + // Send an empty string if server still has old Discord implementation (#2499) + if (g_pNet->CanServerBitStream(eBitStreamVersion::Discord_InitialImplementation) && !g_pNet->CanServerBitStream(eBitStreamVersion::Discord_Cleanup)) { - SString joinSecret = SStringX(szSecret); - pBitStream->WriteString(joinSecret); + pBitStream->WriteString(""); } // Send the packet as joindata @@ -6537,17 +6537,6 @@ void CClientGame::RestreamWorld() g_pGame->GetStreaming()->ReinitStreaming(); } -void CClientGame::TriggerDiscordJoin(SString strSecret) -{ - if (!g_pNet->CanServerBitStream(eBitStreamVersion::Discord_InitialImplementation)) - return; - - NetBitStreamInterface* pBitStream = g_pNet->AllocateNetBitStream(); - pBitStream->WriteString(strSecret); - g_pNet->SendPacket(PACKET_ID_DISCORD_JOIN, pBitStream, PACKET_PRIORITY_LOW, PACKET_RELIABILITY_RELIABLE_ORDERED, PACKET_ORDERING_DEFAULT); - g_pNet->DeallocateNetBitStream(pBitStream); -} - void CClientGame::InsertIFPPointerToMap(const unsigned int u32BlockNameHash, const std::shared_ptr& pIFP) { m_mapOfIfpPointers[u32BlockNameHash] = pIFP; @@ -6712,17 +6701,3 @@ void CClientGame::AudioZoneRadioSwitchHandler(DWORD dwStationID) g_pGame->GetAudioEngine()->StartRadio(dwStationID); } } - -void CClientGame::UpdateDiscordState() -{ - // Set discord state to players[/slot] count - uint playerCount = g_pClientGame->GetPlayerManager()->Count(); - uint playerSlot = g_pClientGame->GetServerInfo()->GetMaxPlayers(); - SString state(std::to_string(playerCount)); - - if (g_pCore->GetNetwork()->CanServerBitStream(eBitStreamVersion::Discord_InitialImplementation)) - state += "/" + std::to_string(playerSlot); - - state += (playerCount == 1 && (!playerSlot || playerSlot == 1) ? " Player" : " Players"); - g_pCore->GetDiscordManager()->SetState(state, [](EDiscordRes) {}); -} diff --git a/Client/mods/deathmatch/logic/CClientGame.h b/Client/mods/deathmatch/logic/CClientGame.h index 9bcd7c06f6..6b362e6e02 100644 --- a/Client/mods/deathmatch/logic/CClientGame.h +++ b/Client/mods/deathmatch/logic/CClientGame.h @@ -229,7 +229,7 @@ class CClientGame CClientGame(bool bLocalPlay = false); ~CClientGame(); - bool StartGame(const char* szNick, const char* szPassword, eServerType Type = SERVER_TYPE_NORMAL, const char* szSecret = nullptr); + bool StartGame(const char* szNick, const char* szPassword, eServerType Type = SERVER_TYPE_NORMAL); bool StartLocalGame(eServerType Type, const char* szPassword = NULL); void SetupLocalGame(eServerType Type); // bool StartGame ( void ); @@ -438,8 +438,6 @@ class CClientGame void RestreamModel(unsigned short usModel); void RestreamWorld(); - void TriggerDiscordJoin(SString strSecret); - private: // CGUI Callbacks bool OnKeyDown(CGUIKeyEventArgs Args); @@ -807,7 +805,6 @@ class CClientGame // Debug class. Empty in release. public: CFoo m_Foo; - void UpdateDiscordState(); // If netc allows this function not to be here it would be better private: CEvents m_Events; diff --git a/Client/mods/deathmatch/logic/CPacketHandler.cpp b/Client/mods/deathmatch/logic/CPacketHandler.cpp index 55e8e14b05..822a206dbd 100644 --- a/Client/mods/deathmatch/logic/CPacketHandler.cpp +++ b/Client/mods/deathmatch/logic/CPacketHandler.cpp @@ -989,8 +989,6 @@ void CPacketHandler::Packet_PlayerList(NetBitStreamInterface& bitStream) pPlayer->CallEvent("onClientPlayerJoin", Arguments, true); } } - - g_pClientGame->UpdateDiscordState(); } void CPacketHandler::Packet_PlayerQuit(NetBitStreamInterface& bitStream) @@ -1022,8 +1020,6 @@ void CPacketHandler::Packet_PlayerQuit(NetBitStreamInterface& bitStream) { RaiseProtocolError(15); } - - g_pClientGame->UpdateDiscordState(); } void CPacketHandler::Packet_PlayerSpawn(NetBitStreamInterface& bitStream) diff --git a/Client/mods/deathmatch/logic/CServerInfo.cpp b/Client/mods/deathmatch/logic/CServerInfo.cpp index f4f280fd36..d8b0eec4c5 100644 --- a/Client/mods/deathmatch/logic/CServerInfo.cpp +++ b/Client/mods/deathmatch/logic/CServerInfo.cpp @@ -18,5 +18,4 @@ CServerInfo::CServerInfo() : m_MaxPlayersCount(0) void CServerInfo::SetMaxPlayers(uint set) { m_MaxPlayersCount = set; - g_pClientGame->UpdateDiscordState(); } diff --git a/Client/mods/deathmatch/logic/rpc/CWorldRPCs.cpp b/Client/mods/deathmatch/logic/rpc/CWorldRPCs.cpp index 61e3feffc8..c5276e663f 100644 --- a/Client/mods/deathmatch/logic/rpc/CWorldRPCs.cpp +++ b/Client/mods/deathmatch/logic/rpc/CWorldRPCs.cpp @@ -61,8 +61,6 @@ void CWorldRPCs::LoadFunctions() AddHandler(SET_MOON_SIZE, SetMoonSize, "SetMoonSize"); AddHandler(RESET_MOON_SIZE, ResetMoonSize, "ResetMoonSize"); - - AddHandler(SET_DISCORD_JOIN_PARAMETERS, SetDiscordJoinParams, "SetDiscordJoinParams"); } void CWorldRPCs::SetTime(NetBitStreamInterface& bitStream) @@ -624,18 +622,3 @@ void CWorldRPCs::ResetMoonSize(NetBitStreamInterface& bitStream) { g_pMultiplayer->ResetMoonSize(); } - -void CWorldRPCs::SetDiscordJoinParams(NetBitStreamInterface& bitStream) -{ - SString strKey, strPartyId; - uint uiPartySize, uiPartyMax; - - if (bitStream.ReadString(strKey) && bitStream.ReadString(strPartyId) && bitStream.Read(uiPartySize) && bitStream.Read(uiPartyMax)) - { - if (strKey.length() > 64 || strPartyId.length() > 64 || uiPartySize > uiPartyMax || strKey.find(' ') != SString::npos || - strPartyId.find(' ') != SString::npos) - return; - - g_pCore->GetDiscordManager()->SetJoinParameters(strKey, strPartyId, uiPartySize, uiPartyMax, [](EDiscordRes res) {}); - } -} diff --git a/Client/mods/deathmatch/logic/rpc/CWorldRPCs.h b/Client/mods/deathmatch/logic/rpc/CWorldRPCs.h index df0722f155..01d48efd43 100644 --- a/Client/mods/deathmatch/logic/rpc/CWorldRPCs.h +++ b/Client/mods/deathmatch/logic/rpc/CWorldRPCs.h @@ -64,5 +64,4 @@ class CWorldRPCs : public CRPCFunctions DECLARE_RPC(SetMoonSize); DECLARE_RPC(ResetMoonSize); DECLARE_RPC(SetSyncIntervals); - DECLARE_RPC(SetDiscordJoinParams); }; diff --git a/Client/sdk/core/CClientBase.h b/Client/sdk/core/CClientBase.h index 3acfcd8fac..acae1a75d1 100644 --- a/Client/sdk/core/CClientBase.h +++ b/Client/sdk/core/CClientBase.h @@ -32,6 +32,4 @@ class CClientBase virtual bool HandleException(CExceptionInformation* pExceptionInformation) = 0; virtual void GetPlayerNames(std::vector& vPlayerNames) = 0; - - virtual void TriggerDiscordJoin(SString strSecret) = 0; }; diff --git a/Client/sdk/core/CCoreInterface.h b/Client/sdk/core/CCoreInterface.h index e6e7065e52..d9b7cf3855 100644 --- a/Client/sdk/core/CCoreInterface.h +++ b/Client/sdk/core/CCoreInterface.h @@ -23,7 +23,6 @@ #include "CWebCoreInterface.h" #include "CTrayIconInterface.h" #include "CChatInterface.h" -#include "CDiscordManagerInterface.h" #include "xml/CXML.h" #include @@ -175,8 +174,6 @@ class CCoreInterface virtual bool ClearChat() = 0; virtual void OnGameTimerUpdate() = 0; - virtual CDiscordManagerInterface* GetDiscordManager() = 0; - virtual bool IsChatInputBlocked() = 0; }; diff --git a/Client/sdk/core/CDiscordManagerInterface.h b/Client/sdk/core/CDiscordManagerInterface.h deleted file mode 100644 index fe0b4926b3..0000000000 --- a/Client/sdk/core/CDiscordManagerInterface.h +++ /dev/null @@ -1,113 +0,0 @@ -/***************************************************************************** - * - * PROJECT: Multi Theft Auto - * (Shared logic for modifications) - * LICENSE: See LICENSE in the top level directory - * FILE: sdk/core/CDiscordManagerInterface.h - * - *****************************************************************************/ - -// -// Some enums are redefined so the interface won't require discord's header -// - -#pragma once - -#include - -enum EDiscordActivityT -{ - EDiscordActivityT_Playing, - EDiscordActivityT_Streaming, - EDiscordActivityT_Listening, - EDiscordActivityT_Watching -}; - -enum EDiscordRes -{ - DiscordRes_Ok = 0, - DiscordRes_ServiceUnavailable = 1, - DiscordRes_InvalidVersion = 2, - DiscordRes_LockFailed = 3, - DiscordRes_InternalError = 4, - DiscordRes_InvalidPayload = 5, - DiscordRes_InvalidCommand = 6, - DiscordRes_InvalidPermissions = 7, - DiscordRes_NotFetched = 8, - DiscordRes_NotFound = 9, - DiscordRes_Conflict = 10, - DiscordRes_InvalidSecret = 11, - DiscordRes_InvalidJoinSecret = 12, - DiscordRes_NoEligibleActivity = 13, - DiscordRes_InvalidInvite = 14, - DiscordRes_NotAuthenticated = 15, - DiscordRes_InvalidAccessToken = 16, - DiscordRes_ApplicationMismatch = 17, - DiscordRes_InvalidDataUrl = 18, - DiscordRes_InvalidBase64 = 19, - DiscordRes_NotFiltered = 20, - DiscordRes_LobbyFull = 21, - DiscordRes_InvalidLobbySecret = 22, - DiscordRes_InvalidFilename = 23, - DiscordRes_InvalidFileSize = 24, - DiscordRes_InvalidEntitlement = 25, - DiscordRes_NotInstalled = 26, - DiscordRes_NotRunning = 27, - DiscordRes_InsufficientBuffer = 28, - DiscordRes_PurchaseCanceled = 29, - DiscordRes_InvalidGuild = 30, - DiscordRes_InvalidEvent = 31, - DiscordRes_InvalidChannel = 32, - DiscordRes_InvalidOrigin = 33, - DiscordRes_RateLimited = 34, - DiscordRes_OAuth2Error = 35, - DiscordRes_SelectChannelTimeout = 36, - DiscordRes_GetGuildTimeout = 37, - DiscordRes_SelectVoiceForceRequired = 38, - DiscordRes_CaptureShortcutAlreadyListening = 39, - DiscordRes_UnauthorizedForAchievement = 40, - DiscordRes_InvalidGiftCode = 41, - DiscordRes_PurchaseError = 42, - DiscordRes_TransactionAborted = 43, -}; - -struct SDiscordActivity -{ - SDiscordActivity() - : m_activityType(EDiscordActivityT_Playing), - m_startTimestamp(0), - m_endTimestamp(0), - m_name(""), - m_state(""), - m_details(""), - m_joinSecret(""), - m_spectateSecret("") - { - } - - int64 m_startTimestamp; - int64 m_endTimestamp; - const char* m_name; - const char* m_state; - const char* m_details; - const char* m_joinSecret; - const char* m_spectateSecret; - EDiscordActivityT m_activityType; -}; - -class CDiscordManagerInterface -{ -public: - virtual void UpdateActivity(SDiscordActivity& activity, std::function callback) = 0; - virtual void SetType(EDiscordActivityT type, std::function callback) = 0; - virtual void SetName(char const* name, std::function callback) = 0; - virtual void SetState(char const* state, std::function callback) = 0; - virtual void SetDetails(char const* details, std::function callback) = 0; - virtual void SetStartEndTimestamp(int64 start, int64 end, std::function callback) = 0; - virtual void SetJoinParameters(const char* joinSecret, const char* partyId, uint partySize, uint partyMax, std::function callback) = 0; - virtual void SetSpectateSecret(const char* spectateSecret, std::function callback) = 0; - virtual void RegisterPlay(bool connected) = 0; - virtual void Disconnect() = 0; - - virtual SString GetJoinSecret() = 0; -}; diff --git a/Server/mods/deathmatch/StdInc.h b/Server/mods/deathmatch/StdInc.h index 53a0aaaf5f..bbaede124f 100644 --- a/Server/mods/deathmatch/StdInc.h +++ b/Server/mods/deathmatch/StdInc.h @@ -111,7 +111,6 @@ struct SAclRequest; #include "packets/CVoiceDataPacket.h" #include "packets/CVoiceEndPacket.h" #include "packets/CServerInfoSyncPacket.h" -#include "packets/CDiscordJoinPacket.h" #include "packets/CPlayerResourceStartPacket.h" // has to be included early to prevent "unknown type name 'CRemoteCall'" in CLuaFunctionParser.h diff --git a/Server/mods/deathmatch/logic/CGame.cpp b/Server/mods/deathmatch/logic/CGame.cpp index e8d88cf2c7..093670a857 100644 --- a/Server/mods/deathmatch/logic/CGame.cpp +++ b/Server/mods/deathmatch/logic/CGame.cpp @@ -1198,12 +1198,6 @@ bool CGame::ProcessPacket(CPacket& Packet) return true; } - case PACKET_ID_DISCORD_JOIN: - { - Packet_DiscordJoin(static_cast(Packet)); - return true; - } - case PACKET_ID_PLAYER_RESOURCE_START: { Packet_PlayerResourceStart(static_cast(Packet)); @@ -1245,10 +1239,6 @@ void CGame::JoinPlayer(CPlayer& Player) marker.Set("CPlayerJoinCompletePacket"); - // Sync up server info on entry - if (Player.CanBitStream(eBitStreamVersion::Discord_InitialImplementation)) - Player.Send(CServerInfoSyncPacket(SERVER_INFO_FLAG_ALL)); - // Add debug info if wanted if (CPerfStatDebugInfo::GetSingleton()->IsActive("PlayerInGameNotice")) CPerfStatDebugInfo::GetSingleton()->AddLine("PlayerInGameNotice", marker.GetString()); @@ -1364,15 +1354,6 @@ void CGame::InitialDataStream(CPlayer& Player) marker.Set("onPlayerJoin"); - SString joinSecret = Player.GetDiscordJoinSecret(); - if (joinSecret.length()) - { - CLuaArguments Arguments; - Arguments.PushBoolean(true); - Arguments.PushString(joinSecret); - Player.CallEvent("onPlayerDiscordJoin", Arguments); - } - // Register them on the lightweight sync manager. m_lightsyncManager.RegisterPlayer(&Player); @@ -1527,7 +1508,6 @@ void CGame::AddBuiltInEvents() m_Events.AddEvent("onPlayerACInfo", "aclist, size, md5, sha256", NULL, false); m_Events.AddEvent("onPlayerNetworkStatus", "type, ticks", NULL, false); m_Events.AddEvent("onPlayerScreenShot", "resource, status, file_data, timestamp, tag", NULL, false); - m_Events.AddEvent("onPlayerDiscordJoin", "justConnected, secret", NULL, false); m_Events.AddEvent("onPlayerResourceStart", "resource", NULL, false); // Ped events @@ -1752,7 +1732,6 @@ void CGame::Packet_PlayerJoinData(CPlayerJoinDataPacket& Packet) pPlayer->SetSerial(strSerial, 0); pPlayer->SetSerial(strExtra, 1); pPlayer->SetPlayerVersion(strPlayerVersion); - pPlayer->SetDiscordJoinSecret(Packet.GetDiscordJoinSecret()); // Check if client must update if (IsBelowMinimumClient(pPlayer->GetPlayerVersion()) && !pPlayer->ShouldIgnoreMinClientVersionChecks()) @@ -4006,18 +3985,6 @@ void CGame::Packet_PlayerNetworkStatus(CPlayerNetworkStatusPacket& Packet) } } -void CGame::Packet_DiscordJoin(CDiscordJoinPacket& Packet) -{ - CPlayer* pPlayer = Packet.GetSourcePlayer(); - if (pPlayer) - { - CLuaArguments Arguments; - Arguments.PushBoolean(false); - Arguments.PushString(Packet.GetSecret()); - pPlayer->CallEvent("onPlayerDiscordJoin", Arguments, NULL); - } -} - void CGame::Packet_PlayerResourceStart(CPlayerResourceStartPacket& Packet) { CPlayer* pPlayer = Packet.GetSourcePlayer(); diff --git a/Server/mods/deathmatch/logic/CGame.h b/Server/mods/deathmatch/logic/CGame.h index ec70b9abc9..a44f6c2224 100644 --- a/Server/mods/deathmatch/logic/CGame.h +++ b/Server/mods/deathmatch/logic/CGame.h @@ -501,7 +501,6 @@ class CGame void Packet_PlayerScreenShot(class CPlayerScreenShotPacket& Packet); void Packet_PlayerNoSocket(class CPlayerNoSocketPacket& Packet); void Packet_PlayerNetworkStatus(class CPlayerNetworkStatusPacket& Packet); - void Packet_DiscordJoin(class CDiscordJoinPacket& Packet); void Packet_PlayerResourceStart(class CPlayerResourceStartPacket& Packet); static void PlayerCompleteConnect(CPlayer* pPlayer); diff --git a/Server/mods/deathmatch/logic/CPacketTranslator.cpp b/Server/mods/deathmatch/logic/CPacketTranslator.cpp index 2c18ac3476..78fed1669a 100644 --- a/Server/mods/deathmatch/logic/CPacketTranslator.cpp +++ b/Server/mods/deathmatch/logic/CPacketTranslator.cpp @@ -170,10 +170,6 @@ CPacket* CPacketTranslator::Translate(const NetServerPlayerID& Socket, ePacketID pTemp = new CPlayerNetworkStatusPacket; break; - case PACKET_ID_DISCORD_JOIN: - pTemp = new CDiscordJoinPacket; - break; - case PACKET_ID_PLAYER_RESOURCE_START: pTemp = new CPlayerResourceStartPacket; break; diff --git a/Server/mods/deathmatch/logic/CPlayer.h b/Server/mods/deathmatch/logic/CPlayer.h index 53d180fc0e..845d32403e 100644 --- a/Server/mods/deathmatch/logic/CPlayer.h +++ b/Server/mods/deathmatch/logic/CPlayer.h @@ -98,8 +98,6 @@ class CPlayer final : public CPed, public CClient void SetPlayerVersion(const CMtaVersion& strPlayerVersion); const CMtaVersion& GetPlayerVersion() { return m_strPlayerVersion; }; bool ShouldIgnoreMinClientVersionChecks(); - void SetDiscordJoinSecret(const SString& joinSecret) { m_strDiscordJoinSecret = joinSecret; } - SString GetDiscordJoinSecret() const { return m_strDiscordJoinSecret; } bool IsMuted() { return m_bIsMuted; }; void SetMuted(bool bSetMuted) { m_bIsMuted = bSetMuted; }; @@ -362,7 +360,6 @@ class CPlayer final : public CPed, public CClient bool m_bIsMuted; bool m_bIsLeavingServer; bool m_bIsJoined; - SString m_strDiscordJoinSecret; bool m_bNametagColorOverridden; diff --git a/Server/mods/deathmatch/logic/CResourceChecker.Data.h b/Server/mods/deathmatch/logic/CResourceChecker.Data.h index 2318b6facd..70905be079 100644 --- a/Server/mods/deathmatch/logic/CResourceChecker.Data.h +++ b/Server/mods/deathmatch/logic/CResourceChecker.Data.h @@ -595,5 +595,8 @@ namespace {true, "unbanSerial", "Please manually update this. Refer to the wiki for details"}, {true, "getBansXML", "Please manually update this. Refer to the wiki for details"}, {true, "canPlayerUseFunction", "Please manually update this. Refer to the wiki for details"}, + + // Old Discord implementation (see #2499) + {true, "setPlayerDiscordJoinParams", "See GitHub PR #2499 for more details"}, }; } // namespace diff --git a/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp b/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp index 8953de8c1a..8da6fe22f7 100644 --- a/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp +++ b/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp @@ -3346,35 +3346,6 @@ bool CStaticFunctionDefinitions::SetPlayerBlurLevel(CElement* pElement, unsigned return false; } -bool CStaticFunctionDefinitions::SetPlayerDiscordJoinParams(CElement* pElement, SString& strKey, SString& strPartyId, uint uiPartySize, uint uiPartyMax) -{ - assert(pElement); - - if (uiPartyMax > m_pMainConfig->GetMaxPlayers() || uiPartySize > uiPartyMax || strKey.length() > 64 || strPartyId.length() > 64 || - strKey.find(' ') != SString::npos || strPartyId.find(' ') != SString::npos) - return false; - - RUN_CHILDREN(SetPlayerDiscordJoinParams(*iter, strKey, strPartyId, uiPartySize, uiPartyMax)) - - if (IS_PLAYER(pElement)) - { - CPlayer* pPlayer = static_cast(pElement); - - if (!pPlayer->CanBitStream(eBitStreamVersion::Discord_InitialImplementation)) - return false; - - CBitStream bitStream; - bitStream.pBitStream->WriteString(strKey); - bitStream.pBitStream->WriteString(strPartyId); - bitStream.pBitStream->Write(uiPartySize); - bitStream.pBitStream->Write(uiPartyMax); - pPlayer->Send(CLuaPacket(SET_DISCORD_JOIN_PARAMETERS, *bitStream.pBitStream)); - - return true; - } - return false; -} - bool CStaticFunctionDefinitions::RedirectPlayer(CElement* pElement, const char* szHost, unsigned short usPort, const char* szPassword) { if (IS_PLAYER(pElement)) diff --git a/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.h b/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.h index f87e5c06eb..4b72a81536 100644 --- a/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.h +++ b/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.h @@ -145,7 +145,6 @@ class CStaticFunctionDefinitions unsigned short usDimension, CTeam* pTeam = NULL); static bool SetPlayerMuted(CElement* pElement, bool bMuted); static bool SetPlayerBlurLevel(CElement* pElement, unsigned char ucLevel); - static bool SetPlayerDiscordJoinParams(CElement* pElement, SString& strKey, SString& strPartyId, uint uiPartySize, uint uiPartyMax); static bool RedirectPlayer(CElement* pElement, const char* szHost, unsigned short usPort, const char* szPassword); static bool SetPlayerName(CElement* pElement, const char* szName); static bool DetonateSatchels(CElement* pElement); diff --git a/Server/mods/deathmatch/logic/luadefs/CLuaCompatibilityDefs.cpp b/Server/mods/deathmatch/logic/luadefs/CLuaCompatibilityDefs.cpp index a20bf09aa3..70acdc424c 100644 --- a/Server/mods/deathmatch/logic/luadefs/CLuaCompatibilityDefs.cpp +++ b/Server/mods/deathmatch/logic/luadefs/CLuaCompatibilityDefs.cpp @@ -13,67 +13,77 @@ void CLuaCompatibilityDefs::LoadFunctions() { // Backwards compatibility functions - constexpr static const std::pair functions[]{{"getPlayerSkin", CLuaElementDefs::getElementModel}, - {"setPlayerSkin", CLuaElementDefs::setElementModel}, - {"getVehicleModel", CLuaElementDefs::getElementModel}, - {"setVehicleModel", CLuaElementDefs::setElementModel}, - {"getObjectModel", CLuaElementDefs::getElementModel}, - {"setObjectModel", CLuaElementDefs::setElementModel}, - {"getVehicleID", CLuaElementDefs::getElementModel}, - {"getVehicleIDFromName", CLuaVehicleDefs::GetVehicleModelFromName}, - {"getVehicleNameFromID", CLuaVehicleDefs::GetVehicleNameFromModel}, - {"getPlayerWeaponSlot", CLuaPedDefs::GetPedWeaponSlot}, - {"getPlayerArmor", CLuaPedDefs::GetPedArmor}, - {"getPlayerRotation", CLuaPedDefs::GetPedRotation}, - {"isPlayerChoking", CLuaPedDefs::IsPedChoking}, - {"isPlayerDead", CLuaPedDefs::IsPedDead}, - {"isPlayerDucked", CLuaPedDefs::IsPedDucked}, - {"getPlayerStat", CLuaPedDefs::GetPedStat}, - {"getPlayerTarget", CLuaPedDefs::GetPedTarget}, - {"getPlayerClothes", CLuaPedDefs::GetPedClothes}, - {"doesPlayerHaveJetPack", CLuaPedDefs::DoesPedHaveJetPack}, - {"isPlayerInWater", CLuaElementDefs::isElementInWater}, - {"isPedInWater", CLuaElementDefs::isElementInWater}, - {"isPlayerOnGround", CLuaPedDefs::IsPedOnGround}, - {"getPlayerFightingStyle", CLuaPedDefs::GetPedFightingStyle}, - {"getPlayerGravity", CLuaPedDefs::GetPedGravity}, - {"getPlayerContactElement", CLuaPedDefs::GetPedContactElement}, - {"setPlayerArmor", CLuaPedDefs::SetPedArmor}, - {"setPlayerWeaponSlot", CLuaPedDefs::SetPedWeaponSlot}, - {"killPlayer", CLuaPedDefs::KillPed}, - {"setPlayerRotation", CLuaPedDefs::SetPedRotation}, - {"setPlayerStat", CLuaPedDefs::SetPedStat}, - {"addPlayerClothes", CLuaPedDefs::AddPedClothes}, - {"removePlayerClothes", CLuaPedDefs::RemovePedClothes}, - {"givePlayerJetPack", CLuaPedDefs::GivePedJetPack}, - {"removePlayerJetPack", CLuaPedDefs::RemovePedJetPack}, - {"setPlayerFightingStyle", CLuaPedDefs::SetPedFightingStyle}, - {"setPlayerGravity", CLuaPedDefs::SetPedGravity}, - {"setPlayerChoking", CLuaPedDefs::SetPedChoking}, - {"warpPlayerIntoVehicle", CLuaPedDefs::WarpPedIntoVehicle}, - {"removePlayerFromVehicle", CLuaPedDefs::RemovePedFromVehicle}, - {"getPlayerOccupiedVehicle", CLuaPedDefs::GetPedOccupiedVehicle}, - {"getPlayerOccupiedVehicleSeat", CLuaPedDefs::GetPedOccupiedVehicleSeat}, - {"isPlayerInVehicle", CLuaPedDefs::IsPedInVehicle}, - {"getClientName", CLuaPlayerDefs::GetPlayerName}, - {"getClientIP", CLuaPlayerDefs::GetPlayerIP}, - {"getClientAccount", CLuaPlayerDefs::GetPlayerAccount}, - {"setClientName", CLuaPlayerDefs::SetPlayerName}, - {"getPlayerWeapon", CLuaPedDefs::GetPedWeapon}, - {"getPlayerTotalAmmo", CLuaPedDefs::GetPedTotalAmmo}, - {"getPlayerAmmoInClip", CLuaPedDefs::GetPedAmmoInClip}, - {"getPedSkin", CLuaElementDefs::getElementModel}, - {"setPedSkin", CLuaElementDefs::setElementModel}, - {"xmlNodeGetSubNodes", CLuaXMLDefs::xmlNodeGetChildren}, - {"xmlCreateSubNode", CLuaXMLDefs::xmlCreateChild}, - {"xmlFindSubNode", CLuaXMLDefs::xmlNodeFindChild}, - {"attachElementToElement", CLuaElementDefs::attachElements}, - {"detachElementFromElement", CLuaElementDefs::detachElements}, + constexpr static const std::pair functions[]{ + {"getPlayerSkin", CLuaElementDefs::getElementModel}, + {"setPlayerSkin", CLuaElementDefs::setElementModel}, + {"getVehicleModel", CLuaElementDefs::getElementModel}, + {"setVehicleModel", CLuaElementDefs::setElementModel}, + {"getObjectModel", CLuaElementDefs::getElementModel}, + {"setObjectModel", CLuaElementDefs::setElementModel}, + {"getVehicleID", CLuaElementDefs::getElementModel}, + {"getVehicleIDFromName", CLuaVehicleDefs::GetVehicleModelFromName}, + {"getVehicleNameFromID", CLuaVehicleDefs::GetVehicleNameFromModel}, + {"getPlayerWeaponSlot", CLuaPedDefs::GetPedWeaponSlot}, + {"getPlayerArmor", CLuaPedDefs::GetPedArmor}, + {"getPlayerRotation", CLuaPedDefs::GetPedRotation}, + {"isPlayerChoking", CLuaPedDefs::IsPedChoking}, + {"isPlayerDead", CLuaPedDefs::IsPedDead}, + {"isPlayerDucked", CLuaPedDefs::IsPedDucked}, + {"getPlayerStat", CLuaPedDefs::GetPedStat}, + {"getPlayerTarget", CLuaPedDefs::GetPedTarget}, + {"getPlayerClothes", CLuaPedDefs::GetPedClothes}, + {"doesPlayerHaveJetPack", CLuaPedDefs::DoesPedHaveJetPack}, + {"isPlayerInWater", CLuaElementDefs::isElementInWater}, + {"isPedInWater", CLuaElementDefs::isElementInWater}, + {"isPlayerOnGround", CLuaPedDefs::IsPedOnGround}, + {"getPlayerFightingStyle", CLuaPedDefs::GetPedFightingStyle}, + {"getPlayerGravity", CLuaPedDefs::GetPedGravity}, + {"getPlayerContactElement", CLuaPedDefs::GetPedContactElement}, + {"setPlayerArmor", CLuaPedDefs::SetPedArmor}, + {"setPlayerWeaponSlot", CLuaPedDefs::SetPedWeaponSlot}, + {"killPlayer", CLuaPedDefs::KillPed}, + {"setPlayerRotation", CLuaPedDefs::SetPedRotation}, + {"setPlayerStat", CLuaPedDefs::SetPedStat}, + {"addPlayerClothes", CLuaPedDefs::AddPedClothes}, + {"removePlayerClothes", CLuaPedDefs::RemovePedClothes}, + {"givePlayerJetPack", CLuaPedDefs::GivePedJetPack}, + {"removePlayerJetPack", CLuaPedDefs::RemovePedJetPack}, + {"setPlayerFightingStyle", CLuaPedDefs::SetPedFightingStyle}, + {"setPlayerGravity", CLuaPedDefs::SetPedGravity}, + {"setPlayerChoking", CLuaPedDefs::SetPedChoking}, + {"warpPlayerIntoVehicle", CLuaPedDefs::WarpPedIntoVehicle}, + {"removePlayerFromVehicle", CLuaPedDefs::RemovePedFromVehicle}, + {"getPlayerOccupiedVehicle", CLuaPedDefs::GetPedOccupiedVehicle}, + {"getPlayerOccupiedVehicleSeat", CLuaPedDefs::GetPedOccupiedVehicleSeat}, + {"isPlayerInVehicle", CLuaPedDefs::IsPedInVehicle}, + {"getClientName", CLuaPlayerDefs::GetPlayerName}, + {"getClientIP", CLuaPlayerDefs::GetPlayerIP}, + {"getClientAccount", CLuaPlayerDefs::GetPlayerAccount}, + {"setClientName", CLuaPlayerDefs::SetPlayerName}, + {"getPlayerWeapon", CLuaPedDefs::GetPedWeapon}, + {"getPlayerTotalAmmo", CLuaPedDefs::GetPedTotalAmmo}, + {"getPlayerAmmoInClip", CLuaPedDefs::GetPedAmmoInClip}, + {"getPedSkin", CLuaElementDefs::getElementModel}, + {"setPedSkin", CLuaElementDefs::setElementModel}, + {"xmlNodeGetSubNodes", CLuaXMLDefs::xmlNodeGetChildren}, + {"xmlCreateSubNode", CLuaXMLDefs::xmlCreateChild}, + {"xmlFindSubNode", CLuaXMLDefs::xmlNodeFindChild}, + {"attachElementToElement", CLuaElementDefs::attachElements}, + {"detachElementFromElement", CLuaElementDefs::detachElements}, - // Deprecated since 1.5.5-9.13846 - {"doesPedHaveJetPack", CLuaPedDefs::DoesPedHaveJetPack}, - {"givePedJetPack", CLuaPedDefs::GivePedJetPack}, - {"removePedJetPack", CLuaPedDefs::RemovePedJetPack}}; + // Deprecated since 1.5.5-9.13846 + {"doesPedHaveJetPack", CLuaPedDefs::DoesPedHaveJetPack}, + {"givePedJetPack", CLuaPedDefs::GivePedJetPack}, + {"removePedJetPack", CLuaPedDefs::RemovePedJetPack}, + + // Old Discord implementation (see #2499) + {"setPlayerDiscordJoinParams", + [](lua_State* luaVM) -> int + { + lua_pushboolean(luaVM, false); + return 1; + }}, + }; // Add functions for (const auto& [name, func] : functions) diff --git a/Server/mods/deathmatch/logic/luadefs/CLuaPlayerDefs.cpp b/Server/mods/deathmatch/logic/luadefs/CLuaPlayerDefs.cpp index 25382c3ca8..85f8df249f 100644 --- a/Server/mods/deathmatch/logic/luadefs/CLuaPlayerDefs.cpp +++ b/Server/mods/deathmatch/logic/luadefs/CLuaPlayerDefs.cpp @@ -61,7 +61,6 @@ void CLuaPlayerDefs::LoadFunctions() {"setPlayerNametagShowing", SetPlayerNametagShowing}, {"setPlayerMuted", SetPlayerMuted}, {"setPlayerBlurLevel", SetPlayerBlurLevel}, - {"setPlayerDiscordJoinParams", SetPlayerDiscordJoinParams}, {"redirectPlayer", RedirectPlayer}, {"setPlayerName", SetPlayerName}, {"detonateSatchels", DetonateSatchels}, @@ -141,7 +140,6 @@ void CLuaPlayerDefs::AddClass(lua_State* luaVM) lua_classfunction(luaVM, "setMuted", "setPlayerMuted"); lua_classfunction(luaVM, "setName", "setPlayerName"); lua_classfunction(luaVM, "setBlurLevel", "setPlayerBlurLevel"); - lua_classfunction(luaVM, "setDiscordJoinParams", "setPlayerDiscordJoinParams"); lua_classfunction(luaVM, "setWantedLevel", "setPlayerWantedLevel"); lua_classfunction(luaVM, "setMoney", "setPlayerMoney"); lua_classfunction(luaVM, "setNametagText", "setPlayerNametagText"); @@ -1160,38 +1158,6 @@ int CLuaPlayerDefs::SetPlayerBlurLevel(lua_State* luaVM) return 1; } -int CLuaPlayerDefs::SetPlayerDiscordJoinParams(lua_State* luaVM) -{ - CElement* pElement; - SString strKey; - SString strPartyId; - uint uiPartySize; - uint uiPartyMax; - - CScriptArgReader argStream(luaVM); - argStream.ReadUserData(pElement); - argStream.ReadString(strKey); - argStream.ReadString(strPartyId); - argStream.ReadNumber(uiPartySize); - argStream.ReadNumber(uiPartyMax); - - if (!argStream.HasErrors()) - { - LogWarningIfPlayerHasNotJoinedYet(luaVM, pElement); - - if (CStaticFunctionDefinitions::SetPlayerDiscordJoinParams(pElement, strKey, strPartyId, uiPartySize, uiPartyMax)) - { - lua_pushboolean(luaVM, true); - return 1; - } - } - else - return luaL_error(luaVM, argStream.GetFullErrorMessage()); - - lua_pushboolean(luaVM, false); - return 1; -} - int CLuaPlayerDefs::RedirectPlayer(lua_State* luaVM) { CPlayer* pElement; diff --git a/Server/mods/deathmatch/logic/luadefs/CLuaPlayerDefs.h b/Server/mods/deathmatch/logic/luadefs/CLuaPlayerDefs.h index 9325333883..ce94a9e4c7 100644 --- a/Server/mods/deathmatch/logic/luadefs/CLuaPlayerDefs.h +++ b/Server/mods/deathmatch/logic/luadefs/CLuaPlayerDefs.h @@ -61,7 +61,6 @@ class CLuaPlayerDefs : public CLuaDefs LUA_DECLARE(SetPlayerNametagShowing); LUA_DECLARE(SetPlayerMuted); LUA_DECLARE(SetPlayerBlurLevel); - LUA_DECLARE(SetPlayerDiscordJoinParams); LUA_DECLARE(RedirectPlayer); LUA_DECLARE(SetPlayerName); LUA_DECLARE(DetonateSatchels); diff --git a/Server/mods/deathmatch/logic/packets/CDiscordJoinPacket.cpp b/Server/mods/deathmatch/logic/packets/CDiscordJoinPacket.cpp deleted file mode 100644 index c3be7b72dd..0000000000 --- a/Server/mods/deathmatch/logic/packets/CDiscordJoinPacket.cpp +++ /dev/null @@ -1,16 +0,0 @@ -/***************************************************************************** - * - * PROJECT: Multi Theft Auto - * LICENSE: See LICENSE in the top level directory - * FILE: mods/deathmatch/logic/packets/CDiscordJoinPacket.cpp - * - * Multi Theft Auto is available from http://www.multitheftauto.com/ - * - *****************************************************************************/ - -#include "StdInc.h" - -bool CDiscordJoinPacket::Read(NetBitStreamInterface& BitStream) -{ - return BitStream.ReadString(m_secretKey); -} diff --git a/Server/mods/deathmatch/logic/packets/CDiscordJoinPacket.h b/Server/mods/deathmatch/logic/packets/CDiscordJoinPacket.h deleted file mode 100644 index b198961ed7..0000000000 --- a/Server/mods/deathmatch/logic/packets/CDiscordJoinPacket.h +++ /dev/null @@ -1,30 +0,0 @@ -/***************************************************************************** - * - * PROJECT: Multi Theft Auto - * LICENSE: See LICENSE in the top level directory - * FILE: mods/deathmatch/logic/packets/CDiscordJoinPacket.h - * - * Multi Theft Auto is available from http://www.multitheftauto.com/ - * - *****************************************************************************/ - -#pragma once - -#include "CPacket.h" - -class CDiscordJoinPacket final : public CPacket -{ -public: - CDiscordJoinPacket() {} - - ePacketID GetPacketID() const { return PACKET_ID_DISCORD_JOIN; } - unsigned long GetFlags() const { return PACKET_LOW_PRIORITY | PACKET_RELIABLE | PACKET_SEQUENCED; } - virtual ePacketOrdering GetPacketOrdering() const { return PACKET_ORDERING_DEFAULT; } - - bool Read(NetBitStreamInterface& BitStream); - - SString GetSecret() const { return m_secretKey; } - -private: - SString m_secretKey; -}; diff --git a/Server/mods/deathmatch/logic/packets/CPlayerJoinDataPacket.cpp b/Server/mods/deathmatch/logic/packets/CPlayerJoinDataPacket.cpp index e6492adc5e..397ded61fa 100644 --- a/Server/mods/deathmatch/logic/packets/CPlayerJoinDataPacket.cpp +++ b/Server/mods/deathmatch/logic/packets/CPlayerJoinDataPacket.cpp @@ -31,12 +31,6 @@ bool CPlayerJoinDataPacket::Read(NetBitStreamInterface& BitStream) m_strNick = *m_strNick; m_strSerialUser = *m_strSerialUser; - if (static_cast(m_usBitStreamVersion) >= eBitStreamVersion::Discord_InitialImplementation) - { - if (!BitStream.ReadString(m_strDiscordSecret)) - return false; - } - return true; } return false; diff --git a/Server/mods/deathmatch/logic/packets/CPlayerJoinDataPacket.h b/Server/mods/deathmatch/logic/packets/CPlayerJoinDataPacket.h index a8a4974752..2e851ea3b6 100644 --- a/Server/mods/deathmatch/logic/packets/CPlayerJoinDataPacket.h +++ b/Server/mods/deathmatch/logic/packets/CPlayerJoinDataPacket.h @@ -42,8 +42,6 @@ class CPlayerJoinDataPacket final : public CPacket const char* GetSerialUser() { return m_strSerialUser; } void SetSerialUser(const char* szSerialUser) { m_strSerialUser.AssignLeft(szSerialUser, MAX_SERIAL_LENGTH); } - const char* GetDiscordJoinSecret() const { return (m_strDiscordSecret.length() > 64 ? "" : m_strDiscordSecret); } - bool IsOptionalUpdateInfoRequired() { return m_bOptionalUpdateInfoRequired; } private: @@ -56,5 +54,4 @@ class CPlayerJoinDataPacket final : public CPacket MD5 m_Password; SString m_strSerialUser; CMtaVersion m_strPlayerVersion; - SString m_strDiscordSecret; }; diff --git a/Shared/sdk/net/bitstream.h b/Shared/sdk/net/bitstream.h index 069b84158e..a820de67d0 100644 --- a/Shared/sdk/net/bitstream.h +++ b/Shared/sdk/net/bitstream.h @@ -473,6 +473,10 @@ enum class eBitStreamVersion : unsigned short // 2021-08-30 0x75 OnPlayerResourceStart, + // Remove "old" Discord implementation (#2499) + // 2022-01-16 0x76 + Discord_Cleanup, + // This allows us to automatically increment the BitStreamVersion when things are added to this enum. // Make sure you only add things above this comment. Next, diff --git a/premake5.lua b/premake5.lua index 2d9aa658f7..59de731d89 100644 --- a/premake5.lua +++ b/premake5.lua @@ -4,7 +4,6 @@ require "compose_files" require "install_data" require "install_resources" require "install_cef" -require "install_discord" require "install_unifont" -- Set CI Build global diff --git a/utils/buildactions/install_discord.lua b/utils/buildactions/install_discord.lua deleted file mode 100644 index 41ce522370..0000000000 --- a/utils/buildactions/install_discord.lua +++ /dev/null @@ -1,52 +0,0 @@ -require 'utils' - -premake.modules.install_discord = {} - --- Config variables -local DISCORD_BASEURL = "https://github.com/multitheftauto/discord_game_sdk/releases/download/" -local DISCORD_FILENAME = "cpp_x86.zip" -local DISCORD_VENDOR = "vendor/discordgsdk" - --- Change these to update the version -local DISCORD_TAG = "v2020-11-02_21-48-56" -local DISCORD_HASH = "4cceeed0d8b41bdc67c44a6ddcccf42288af933e1f7284c591327178c391aa39" - -newaction { - trigger = "install_discord", - description = "Downloads and installs Discord SDK", - - execute = function() - -- Only execute on Windows - if os.host() ~= "windows" then return end - - -- Check file hash - local archive_path = DISCORD_VENDOR.."/"..DISCORD_FILENAME - if os.isfile(archive_path) and os.sha256_file(archive_path) == DISCORD_HASH then - print("Discord Game SDK is up to date.") - return - end - - -- Download Discord - print("Downloading Discord Game SDK...") - if not http.download_print_errors(DISCORD_BASEURL..DISCORD_TAG.."/"..DISCORD_FILENAME, archive_path) then - return - end - - -- Delete old stuff - os.rmdir(DISCORD_VENDOR.."/cpp") - os.rmdir(DISCORD_VENDOR.."/lib") - os.remove("Shared/data/MTA San Andreas/MTA/discord_game_sdk.dll") - - -- We cannot use zip.extract here because it ends up being read only - -- see https://github.com/premake/premake-core/blob/master/src/host/zip_extract.c#L206-L210 - os.executef("powershell -Command Expand-Archive \"%s\" \"%s\"", archive_path, DISCORD_VENDOR) - - -- Move DLL to shared data folder - os.copyfile(DISCORD_VENDOR.."/lib/x86/discord_game_sdk.dll", "Shared/data/MTA San Andreas/MTA/discord_game_sdk.dll") - os.remove(DISCORD_VENDOR.."lib/x86/discord_game_sdk.dll") - - print("Discord Game SDK updated. Don't forget to run win-install-data.bat.") - end -} - -return premake.modules.install_discord From 8754bbba974fd1471e1d32e23bcd395a62bd3804 Mon Sep 17 00:00:00 2001 From: Dutchman101 <12105539+Dutchman101@users.noreply.github.com> Date: Fri, 8 Apr 2022 17:43:51 +0200 Subject: [PATCH 37/49] Update CEF to 100.0.14+g4e5ba66+chromium-100.0.4896.75 I don't think that the CEF user agent thing from https://developer.chrome.com/blog/deps-rems-100/ is relevant for MTA --- utils/buildactions/install_cef.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/utils/buildactions/install_cef.lua b/utils/buildactions/install_cef.lua index 8168ed1edd..94a4566435 100644 --- a/utils/buildactions/install_cef.lua +++ b/utils/buildactions/install_cef.lua @@ -9,8 +9,8 @@ local CEF_URL_PREFIX = "https://cef-builds.spotifycdn.com/cef_binary_" local CEF_URL_SUFFIX = "_windows32_minimal.tar.bz2" -- Change here to update CEF version -local CEF_VERSION = "99.2.14+g3f796b8+chromium-99.0.4844.84" -local CEF_HASH = "4984fdf52356d152426969dd6cb12588afba16390a93b35d49c404a7c6c81a7d" +local CEF_VERSION = "100.0.14+g4e5ba66+chromium-100.0.4896.75" +local CEF_HASH = "985ebe9df76fe803c1dfa84632eb6c07536e5d0ecaca9e4be10440e8e4c72145" function make_cef_download_url() return CEF_URL_PREFIX..http.escapeUrlParam(CEF_VERSION)..CEF_URL_SUFFIX From acdb3cbf0bd6d829bf739efc52b50fd222c158d5 Mon Sep 17 00:00:00 2001 From: Lpsd <40902730+Lpsd@users.noreply.github.com> Date: Fri, 8 Apr 2022 14:58:36 -0700 Subject: [PATCH 38/49] Remove CefBrowserSettings.plugins definition (#2593) to fix CEF update --- Client/cefweb/CWebView.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/Client/cefweb/CWebView.cpp b/Client/cefweb/CWebView.cpp index 58b45f53ed..58a75fc48e 100644 --- a/Client/cefweb/CWebView.cpp +++ b/Client/cefweb/CWebView.cpp @@ -54,7 +54,6 @@ void CWebView::Initialise() browserSettings.javascript_dom_paste = cef_state_t::STATE_DISABLED; browserSettings.webgl = cef_state_t::STATE_ENABLED; - browserSettings.plugins = cef_state_t::STATE_DISABLED; if (!m_bIsLocal) { bool bEnabledJavascript = g_pCore->GetWebCore()->GetRemoteJavascriptEnabled(); From 31579051cc046bc5cb55c59fc4e9e70ec1bdce34 Mon Sep 17 00:00:00 2001 From: Lpsd <40902730+Lpsd@users.noreply.github.com> Date: Fri, 8 Apr 2022 15:11:39 -0700 Subject: [PATCH 39/49] Remove async tasks in SVG and update callback usage (PR #2589) --- .../deathmatch/logic/CClientVectorGraphic.cpp | 38 +++ .../deathmatch/logic/CClientVectorGraphic.h | 8 + .../logic/CClientVectorGraphicDisplay.cpp | 5 +- .../logic/luadefs/CLuaVectorGraphicDefs.cpp | 226 ++++++++---------- .../logic/luadefs/CLuaVectorGraphicDefs.h | 19 +- 5 files changed, 158 insertions(+), 138 deletions(-) diff --git a/Client/mods/deathmatch/logic/CClientVectorGraphic.cpp b/Client/mods/deathmatch/logic/CClientVectorGraphic.cpp index f737b6d6b3..bb2f078b1a 100644 --- a/Client/mods/deathmatch/logic/CClientVectorGraphic.cpp +++ b/Client/mods/deathmatch/logic/CClientVectorGraphic.cpp @@ -60,6 +60,44 @@ bool CClientVectorGraphic::SetDocument(CXMLNode* node) return true; } +bool CClientVectorGraphic::SetUpdateCallback(CLuaFunctionRef& funcRef) +{ + if (!VERIFY_FUNCTION(funcRef)) + return false; + + m_updateCallbackRef = funcRef; + return true; +} + +bool CClientVectorGraphic::RemoveUpdateCallback() +{ + if (!std::holds_alternative(m_updateCallbackRef)) + return false; + + m_updateCallbackRef = false; + return true; +} + +void CClientVectorGraphic::OnUpdate() +{ + m_pVectorGraphicDisplay->UpdateTexture(); + + if (std::holds_alternative(m_updateCallbackRef)) + { + auto func = std::get(m_updateCallbackRef); + auto state = func.GetLuaVM(); + + if (VERIFY_FUNCTION(func) && state != NULL) + { + CLuaMain& luaMain = lua_getownercluamain(state); + + CLuaArguments arguments; + arguments.PushElement(this); + arguments.Call(&luaMain, func); + } + } +} + void CClientVectorGraphic::Unlink() { m_bIsDestroyed = true; diff --git a/Client/mods/deathmatch/logic/CClientVectorGraphic.h b/Client/mods/deathmatch/logic/CClientVectorGraphic.h index 4267dde31b..d1d0493a7f 100644 --- a/Client/mods/deathmatch/logic/CClientVectorGraphic.h +++ b/Client/mods/deathmatch/logic/CClientVectorGraphic.h @@ -43,6 +43,12 @@ class CClientVectorGraphic final : public CClientTexture bool SetDocument(CXMLNode* node); + bool SetUpdateCallback(CLuaFunctionRef& funcRef); + std::variant GetUpdateCallback() const { return m_updateCallbackRef; } + bool RemoveUpdateCallback(); + + void OnUpdate(); + private: CResource* m_pResource = nullptr; CClientManager* m_pManager; @@ -53,5 +59,7 @@ class CClientVectorGraphic final : public CClientTexture std::unique_ptr m_pVectorGraphicDisplay; + std::variant m_updateCallbackRef = false; + bool m_bIsDestroyed = false; }; diff --git a/Client/mods/deathmatch/logic/CClientVectorGraphicDisplay.cpp b/Client/mods/deathmatch/logic/CClientVectorGraphicDisplay.cpp index 098b77c69c..1625403685 100644 --- a/Client/mods/deathmatch/logic/CClientVectorGraphicDisplay.cpp +++ b/Client/mods/deathmatch/logic/CClientVectorGraphicDisplay.cpp @@ -40,7 +40,10 @@ void CClientVectorGraphicDisplay::Render() m_bIsCleared = false; if (HasUpdated()) - UpdateTexture(); + { + m_pVectorGraphic->OnUpdate(); + } + } void CClientVectorGraphicDisplay::UpdateTexture() diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaVectorGraphicDefs.cpp b/Client/mods/deathmatch/logic/luadefs/CLuaVectorGraphicDefs.cpp index 86cfe97666..c9f6683f8f 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaVectorGraphicDefs.cpp +++ b/Client/mods/deathmatch/logic/luadefs/CLuaVectorGraphicDefs.cpp @@ -19,6 +19,8 @@ void CLuaVectorGraphicDefs::LoadFunctions() {"svgSetDocumentXML", ArgumentParser}, {"svgGetSize", ArgumentParser}, {"svgSetSize", ArgumentParser}, + {"svgSetUpdateCallback", ArgumentParser}, + }; // Add functions @@ -40,15 +42,13 @@ void CLuaVectorGraphicDefs::AddClass(lua_State* luaVM) lua_registerclass(luaVM, "SVG"); } -bool CLuaVectorGraphicDefs::LoadFromData(lua_State* luaVM, CClientVectorGraphic* pVectorGraphic, std::string strRawData) +bool CLuaVectorGraphicDefs::LoadFromData(lua_State* luaVM, CClientVectorGraphic* vectorGraphic, std::string rawData) { - if (!luaVM || !pVectorGraphic) + if (!luaVM || !vectorGraphic) return false; - if (!pVectorGraphic->LoadFromString(strRawData)) + if (!vectorGraphic->LoadFromString(rawData)) { - delete pVectorGraphic; - m_pScriptDebugging->LogCustom(luaVM, "Unable to load SVG data (check for XML syntax errors)"); return false; } @@ -56,39 +56,32 @@ bool CLuaVectorGraphicDefs::LoadFromData(lua_State* luaVM, CClientVectorGraphic* return true; } -bool CLuaVectorGraphicDefs::SetDocument(CClientVectorGraphic* pVectorGraphic, CXMLNode* pXMLNode) +bool CLuaVectorGraphicDefs::SetDocument(CClientVectorGraphic* vectorGraphic, CXMLNode* xmlNode) { - if (!pVectorGraphic || !pXMLNode || !pXMLNode->IsValid()) + if (!vectorGraphic || !xmlNode || !xmlNode->IsValid()) return false; - return pVectorGraphic->SetDocument(pXMLNode); + return vectorGraphic->SetDocument(xmlNode); } -bool CLuaVectorGraphicDefs::LoadFromFile(lua_State* luaVM, CClientVectorGraphic* pVectorGraphic, CScriptFile* pFile, std::string strPath, - CResource* pParentResource) +bool CLuaVectorGraphicDefs::LoadFromFile(lua_State* luaVM, CClientVectorGraphic* vectorGraphic, CScriptFile* file, std::string path, CResource* parentResource) { - if (!luaVM || !pVectorGraphic || !pFile || !pParentResource) + if (!luaVM || !vectorGraphic || !file || !parentResource) return false; - if (!pFile->Load(pParentResource, CScriptFile::MODE_READ)) + if (!file->Load(parentResource, CScriptFile::MODE_READ)) { - delete pVectorGraphic; - delete pFile; - - m_pScriptDebugging->LogCustom(luaVM, SString("Unable to load SVG (file doesn't exist) [%s]", strPath.c_str())); + m_pScriptDebugging->LogCustom(luaVM, SString("Unable to load SVG (file doesn't exist) [%s]", path.c_str())); return false; } else { SString strXmlData; - pFile->Read(pFile->GetSize(), strXmlData); - - // We don't need the file handler anymore - delete pFile; + file->Read(file->GetSize(), strXmlData); - if (strXmlData.empty() || !pVectorGraphic->LoadFromString(strXmlData)) + if (strXmlData.empty() || !vectorGraphic->LoadFromString(strXmlData)) { - delete pVectorGraphic; + delete vectorGraphic; m_pScriptDebugging->LogCustom(luaVM, "Unable to load SVG file (check for XML syntax errors)"); return false; @@ -98,22 +91,22 @@ bool CLuaVectorGraphicDefs::LoadFromFile(lua_State* luaVM, CClientVectorGraphic* return true; } -bool CLuaVectorGraphicDefs::SetSize(CClientVectorGraphic* pVectorGraphic, CVector2D size) +bool CLuaVectorGraphicDefs::SetSize(CClientVectorGraphic* vectorGraphic, CVector2D size) { - if (!pVectorGraphic) + if (!vectorGraphic) return false; - CVectorGraphicItem* pVectorGraphicItem = pVectorGraphic->GetRenderItem(); + CVectorGraphicItem* vectorGraphicItem = vectorGraphic->GetRenderItem(); - if (!pVectorGraphicItem) + if (!vectorGraphicItem) return false; - pVectorGraphicItem->Resize(size); + vectorGraphicItem->Resize(size); - if ((int)pVectorGraphicItem->m_uiSizeX != size.fX || (int)pVectorGraphicItem->m_uiSizeY != size.fY) + if ((int)vectorGraphicItem->m_uiSizeX != size.fX || (int)vectorGraphicItem->m_uiSizeY != size.fY) return false; // failed to resize - pVectorGraphic->GetDisplay()->Update(); + vectorGraphic->GetDisplay()->Update(); return true; } @@ -126,101 +119,70 @@ CClientVectorGraphic* CLuaVectorGraphicDefs::SVGCreate(lua_State* luaVM, CVector if (size.fX > 4096 || size.fY > 4096) throw std::invalid_argument("A vector graphic cannot exceed 4096x4096 in size."); - CLuaMain& pLuaMain = lua_getownercluamain(luaVM); - CResource* pParentResource = pLuaMain.GetResource(); + CLuaMain& luaMain = lua_getownercluamain(luaVM); + CResource* parentResource = luaMain.GetResource(); - CClientVectorGraphic* pVectorGraphic = + CClientVectorGraphic* vectorGraphic = g_pClientGame->GetManager()->GetRenderElementManager()->CreateVectorGraphic(static_cast(size.fX), static_cast(size.fY)); - if (!pVectorGraphic) + if (!vectorGraphic) return false; if (pathOrRawData.has_value()) { - std::string& strRawData = pathOrRawData.value(); - std::size_t szCharPos = strRawData.find_first_not_of(" \t\n\r\f\v", 0); + std::string& rawData = pathOrRawData.value(); + std::size_t charPos = rawData.find_first_not_of(" \t\n\r\f\v", 0); char charAuto = 0; - if (szCharPos != std::string::npos) - charAuto = strRawData.at(szCharPos); + if (charPos != std::string::npos) + charAuto = rawData.at(charPos); if (charAuto && charAuto == '<') { + bool didLoad = LoadFromData(luaVM, vectorGraphic, pathOrRawData.value()); + + // Retain support for callback functions (#2589) if (luaFunctionRef.has_value() && VERIFY_FUNCTION(luaFunctionRef.value())) { - CLuaFunctionRef funcRef = luaFunctionRef.value(); - - CLuaShared::GetAsyncTaskScheduler()->PushTask( - [funcRef, pVectorGraphic, strRawData] { return LoadFromData(funcRef.GetLuaVM(), pVectorGraphic, strRawData); }, - [funcRef](const bool didLoad) { - CLuaMain* pLuaMain = m_pLuaManager->GetVirtualMachine(funcRef.GetLuaVM()); - if (pLuaMain) - { - CLuaArguments arguments; - arguments.PushBoolean(didLoad); - arguments.Call(pLuaMain, funcRef); - } - }); + vectorGraphic->SetUpdateCallback(luaFunctionRef.value()); } - else + + if (!didLoad) { - if (!LoadFromData(luaVM, pVectorGraphic, pathOrRawData.value())) - { - return false; - } + delete vectorGraphic; + return false; } } else { - std::string strPath; - std::string strMetaPath; + std::string path; + std::string metaPath; - if (CResourceManager::ParseResourcePathInput(pathOrRawData.value(), pParentResource, &strPath, &strMetaPath)) + if (CResourceManager::ParseResourcePathInput(pathOrRawData.value(), parentResource, &path, &metaPath)) { - eAccessType accessType = strPath[0] == '@' ? eAccessType::ACCESS_PRIVATE : eAccessType::ACCESS_PUBLIC; - CScriptFile* pFile = new CScriptFile(pParentResource->GetScriptID(), strMetaPath.c_str(), 52428800, accessType); + eAccessType accessType = path[0] == '@' ? eAccessType::ACCESS_PRIVATE : eAccessType::ACCESS_PUBLIC; + CScriptFile* file = new CScriptFile(parentResource->GetScriptID(), metaPath.c_str(), 52428800, accessType); + + bool didLoad = LoadFromFile(luaVM, vectorGraphic, file, pathOrRawData.value(), parentResource); + delete file; + + // Retain support for callback functions (#2589) if (luaFunctionRef.has_value() && VERIFY_FUNCTION(luaFunctionRef.value())) { - CLuaFunctionRef funcRef = luaFunctionRef.value(); - std::string path = pathOrRawData.value(); - - CLuaShared::GetAsyncTaskScheduler()->PushTask( - [funcRef, pFile, pVectorGraphic, path] { - lua_State* luaVM = funcRef.GetLuaVM(); - - if (!luaVM) - return false; - - CLuaMain* pLuaMain = m_pLuaManager->GetVirtualMachine(luaVM); - - if (!pLuaMain) - return false; - - return LoadFromFile(luaVM, pVectorGraphic, pFile, path, pLuaMain->GetResource()); - }, - [funcRef](const bool isLoaded) { - CLuaMain* pLuaMain = m_pLuaManager->GetVirtualMachine(funcRef.GetLuaVM()); - if (pLuaMain) - { - CLuaArguments arguments; - arguments.PushBoolean(isLoaded); - arguments.Call(pLuaMain, funcRef); - } - }); + vectorGraphic->SetUpdateCallback(luaFunctionRef.value()); } - else + + if (!didLoad) { - if (!LoadFromFile(luaVM, pVectorGraphic, pFile, pathOrRawData.value(), pParentResource)) - { - return false; - } + delete vectorGraphic; + return false; } } else { - delete pVectorGraphic; + delete vectorGraphic; m_pScriptDebugging->LogCustom(luaVM, SString("Unable to load SVG (invalid file path) [%s]", pathOrRawData.value().c_str())); return false; @@ -229,48 +191,38 @@ CClientVectorGraphic* CLuaVectorGraphicDefs::SVGCreate(lua_State* luaVM, CVector } // Make our element a child of the resource's file root - pVectorGraphic->SetParent(pParentResource->GetResourceDynamicEntity()); + vectorGraphic->SetParent(parentResource->GetResourceDynamicEntity()); // Set our owner resource - pVectorGraphic->SetResource(pParentResource); + vectorGraphic->SetResource(parentResource); - return pVectorGraphic; + return vectorGraphic; } -CXMLNode* CLuaVectorGraphicDefs::SVGGetDocumentXML(CClientVectorGraphic* pVectorGraphic) +CXMLNode* CLuaVectorGraphicDefs::SVGGetDocumentXML(CClientVectorGraphic* vectorGraphic) { - return pVectorGraphic->GetXMLDocument(); + return vectorGraphic->GetXMLDocument(); } -bool CLuaVectorGraphicDefs::SVGSetDocumentXML(CClientVectorGraphic* pVectorGraphic, CXMLNode* pXMLNode, std::optional luaFunctionRef) +bool CLuaVectorGraphicDefs::SVGSetDocumentXML(CClientVectorGraphic* vectorGraphic, CXMLNode* xmlNode, std::optional luaFunctionRef) { + bool didLoad = SetDocument(vectorGraphic, xmlNode); + + // Retain support for callback functions (#2589) if (luaFunctionRef.has_value() && VERIFY_FUNCTION(luaFunctionRef.value())) { - CLuaFunctionRef funcRef = luaFunctionRef.value(); - - CLuaShared::GetAsyncTaskScheduler()->PushTask([pVectorGraphic, pXMLNode] { return SetDocument(pVectorGraphic, pXMLNode); }, - [funcRef](const bool didLoad) { - CLuaMain* pLuaMain = m_pLuaManager->GetVirtualMachine(funcRef.GetLuaVM()); - if (pLuaMain) - { - CLuaArguments arguments; - arguments.PushBoolean(didLoad); - arguments.Call(pLuaMain, funcRef); - } - }); - - return true; + vectorGraphic->SetUpdateCallback(luaFunctionRef.value()); } - return SetDocument(pVectorGraphic, pXMLNode); + return didLoad; } -CLuaMultiReturn CLuaVectorGraphicDefs::SVGGetSize(CClientVectorGraphic* pVectorGraphic) +CLuaMultiReturn CLuaVectorGraphicDefs::SVGGetSize(CClientVectorGraphic* vectorGraphic) { - return {(int)pVectorGraphic->GetRenderItem()->m_uiSizeX, (int)pVectorGraphic->GetRenderItem()->m_uiSizeY}; + return {(int)vectorGraphic->GetRenderItem()->m_uiSizeX, (int)vectorGraphic->GetRenderItem()->m_uiSizeY}; } -bool CLuaVectorGraphicDefs::SVGSetSize(CClientVectorGraphic* pVectorGraphic, CVector2D size, std::optional luaFunctionRef) +bool CLuaVectorGraphicDefs::SVGSetSize(CClientVectorGraphic* vectorGraphic, CVector2D size, std::optional luaFunctionRef) { if (size.fX <= 0 || size.fY <= 0) throw std::invalid_argument("A vector graphic must be atleast 1x1 in size."); @@ -278,23 +230,39 @@ bool CLuaVectorGraphicDefs::SVGSetSize(CClientVectorGraphic* pVectorGraphic, CVe if (size.fX > 4096 || size.fY > 4096) throw std::invalid_argument("A vector graphic cannot exceed 4096x4096 in size."); + bool didLoad = SetSize(vectorGraphic, size); + + // Retain support for callback functions (#2589) if (luaFunctionRef.has_value() && VERIFY_FUNCTION(luaFunctionRef.value())) { - CLuaFunctionRef funcRef = luaFunctionRef.value(); - - CLuaShared::GetAsyncTaskScheduler()->PushTask([pVectorGraphic, size] { return SetSize(pVectorGraphic, size); }, - [funcRef](const bool didLoad) { - CLuaMain* pLuaMain = m_pLuaManager->GetVirtualMachine(funcRef.GetLuaVM()); - if (pLuaMain) - { - CLuaArguments arguments; - arguments.PushBoolean(didLoad); - arguments.Call(pLuaMain, funcRef); - } - }); + vectorGraphic->SetUpdateCallback(luaFunctionRef.value()); + } + return didLoad; +} + +bool CLuaVectorGraphicDefs::SVGSetUpdateCallback(CClientVectorGraphic* vectorGraphic, std::variant luaFunctionRef) +{ + if (std::holds_alternative(luaFunctionRef)) + { + vectorGraphic->SetUpdateCallback(std::get(luaFunctionRef)); return true; } + else if (std::get(luaFunctionRef) == false) + { + vectorGraphic->RemoveUpdateCallback(); + return true; + } + + return false; +} + +std::variant CLuaVectorGraphicDefs::SVGGetUpdateCallback(CClientVectorGraphic* vectorGraphic) +{ + auto func = vectorGraphic->GetUpdateCallback(); + + if (std::holds_alternative(func)) + return func; - return SetSize(pVectorGraphic, size); + return false; } diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaVectorGraphicDefs.h b/Client/mods/deathmatch/logic/luadefs/CLuaVectorGraphicDefs.h index f96541308e..6d549d652c 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaVectorGraphicDefs.h +++ b/Client/mods/deathmatch/logic/luadefs/CLuaVectorGraphicDefs.h @@ -20,16 +20,19 @@ class CLuaVectorGraphicDefs : public CLuaDefs static CClientVectorGraphic* SVGCreate(lua_State* luaVM, CVector2D size, std::optional pathOrRawData, std::optional luaFunctionRef); - static CXMLNode* SVGGetDocumentXML(CClientVectorGraphic* pVectorGraphic); - static bool SVGSetDocumentXML(CClientVectorGraphic* pVectorGraphic, CXMLNode* pXMLNode, std::optional luaFunctionRef); + static CXMLNode* SVGGetDocumentXML(CClientVectorGraphic* vectorGraphic); + static bool SVGSetDocumentXML(CClientVectorGraphic* vectorGraphic, CXMLNode* xmlNode, std::optional luaFunctionRef); - static CLuaMultiReturn SVGGetSize(CClientVectorGraphic* pVectorGraphic); - static bool SVGSetSize(CClientVectorGraphic* pVectorGraphic, CVector2D size, std::optional luaFunctionRef); + static CLuaMultiReturn SVGGetSize(CClientVectorGraphic* vectorGraphic); + static bool SVGSetSize(CClientVectorGraphic* vectorGraphic, CVector2D size, std::optional luaFunctionRef); private: - static bool LoadFromData(lua_State* luaVM, CClientVectorGraphic* pVectorGraphic, std::string strRawData); - static bool LoadFromFile(lua_State* luaVM, CClientVectorGraphic* pVectorGraphic, CScriptFile* pFile, std::string strPath, CResource* pParentResource); + static bool LoadFromData(lua_State* luaVM, CClientVectorGraphic* vectorGraphic, std::string rawData); + static bool LoadFromFile(lua_State* luaVM, CClientVectorGraphic* vectorGraphic, CScriptFile* file, std::string path, CResource* parentResource); - static bool SetDocument(CClientVectorGraphic* pVectorGraphic, CXMLNode* pXMLNode); - static bool SetSize(CClientVectorGraphic* pVectorGraphic, CVector2D size); + static bool SetDocument(CClientVectorGraphic* vectorGraphic, CXMLNode* xmlNode); + static bool SetSize(CClientVectorGraphic* vectorGraphic, CVector2D size); + + static bool SVGSetUpdateCallback(CClientVectorGraphic* vectorGraphic, std::variant luaFunctionRef); + static std::variant SVGGetUpdateCallback(CClientVectorGraphic* vectorGraphic); }; From 92cdb3a74bd8dc0ab8dd7e95f573c76d79eb99e2 Mon Sep 17 00:00:00 2001 From: patrikjuvonen <22572159+patrikjuvonen@users.noreply.github.com> Date: Sat, 9 Apr 2022 02:30:47 +0300 Subject: [PATCH 40/49] Update curl from 7.81.0 to 7.82.0 (#2581) --- vendor/curl/CHANGES | 10506 +++++++++++------------ vendor/curl/RELEASE-NOTES | 596 +- vendor/curl/include/curl/curl.h | 29 +- vendor/curl/include/curl/curlver.h | 12 +- vendor/curl/include/curl/system.h | 18 +- vendor/curl/lib/altsvc.c | 4 +- vendor/curl/lib/base64.c | 35 +- vendor/curl/lib/c-hyper.c | 15 +- vendor/curl/lib/config-dos.h | 7 +- vendor/curl/lib/config-linux.h | 12 +- vendor/curl/lib/config-macos.h | 14 +- vendor/curl/lib/config-tpf.h | 680 -- vendor/curl/lib/config-vxworks.h | 811 -- vendor/curl/lib/config-win32.h | 24 +- vendor/curl/lib/config-win32ce.h | 8 +- vendor/curl/lib/conncache.c | 20 +- vendor/curl/lib/connect.c | 12 +- vendor/curl/lib/curl_base64.h | 9 +- vendor/curl/lib/curl_ctype.c | 5 +- vendor/curl/lib/curl_ctype.h | 30 +- vendor/curl/lib/curl_des.c | 11 +- vendor/curl/lib/curl_des.h | 11 +- vendor/curl/lib/curl_ntlm_core.c | 46 +- vendor/curl/lib/curl_ntlm_core.h | 31 +- vendor/curl/lib/curl_path.c | 4 +- vendor/curl/lib/curl_sasl.c | 18 +- vendor/curl/lib/curl_sasl.h | 4 +- vendor/curl/lib/curl_setup.h | 41 +- vendor/curl/lib/curl_sha256.h | 4 +- vendor/curl/lib/dict.c | 14 +- vendor/curl/lib/doh.c | 6 +- vendor/curl/lib/dotdot.c | 4 +- vendor/curl/lib/easy.c | 11 +- vendor/curl/lib/escape.c | 37 +- vendor/curl/lib/escape.h | 5 +- vendor/curl/lib/file.c | 4 +- vendor/curl/lib/formdata.c | 23 +- vendor/curl/lib/ftp.c | 16 +- vendor/curl/lib/gopher.c | 4 +- vendor/curl/lib/h2h3.c | 310 + vendor/curl/lib/h2h3.h | 59 + vendor/curl/lib/hostip.c | 3 +- vendor/curl/lib/hsts.c | 4 +- vendor/curl/lib/http.c | 233 +- vendor/curl/lib/http.h | 9 +- vendor/curl/lib/http2.c | 299 +- vendor/curl/lib/http_aws_sigv4.c | 6 +- vendor/curl/lib/http_chunks.c | 31 +- vendor/curl/lib/http_negotiate.c | 4 +- vendor/curl/lib/http_ntlm.c | 8 +- vendor/curl/lib/http_proxy.c | 36 +- vendor/curl/lib/if2ip.c | 46 +- vendor/curl/lib/if2ip.h | 14 +- vendor/curl/lib/imap.c | 16 +- vendor/curl/lib/krb5.c | 12 +- vendor/curl/lib/ldap.c | 21 +- vendor/curl/lib/md5.c | 158 +- vendor/curl/lib/mime.c | 123 +- vendor/curl/lib/mime.h | 9 +- vendor/curl/lib/mprintf.c | 5 +- vendor/curl/lib/mqtt.c | 21 +- vendor/curl/lib/multi.c | 39 +- vendor/curl/lib/non-ascii.c | 336 - vendor/curl/lib/non-ascii.h | 61 - vendor/curl/lib/nonblock.c | 8 +- vendor/curl/lib/nwlib.c | 327 - vendor/curl/lib/nwos.c | 88 - vendor/curl/lib/openldap.c | 373 +- vendor/curl/lib/pingpong.c | 13 +- vendor/curl/lib/pop3.c | 12 +- vendor/curl/lib/rtsp.c | 39 +- vendor/curl/lib/select.c | 31 +- vendor/curl/lib/select.h | 17 +- vendor/curl/lib/sendf.c | 61 +- vendor/curl/lib/setopt.c | 47 +- vendor/curl/lib/sha256.c | 12 +- vendor/curl/lib/smb.c | 23 +- vendor/curl/lib/smtp.c | 11 +- vendor/curl/lib/strcase.c | 130 +- vendor/curl/lib/strcase.h | 9 +- vendor/curl/lib/strerror.c | 29 +- vendor/curl/lib/telnet.c | 4 +- vendor/curl/lib/tftp.c | 8 +- vendor/curl/lib/transfer.c | 50 +- vendor/curl/lib/transfer.h | 5 +- vendor/curl/lib/url.c | 204 +- vendor/curl/lib/url.h | 6 +- vendor/curl/lib/urlapi.c | 85 +- vendor/curl/lib/urldata.h | 31 +- vendor/curl/lib/vauth/digest.c | 25 +- vendor/curl/lib/vauth/ntlm.c | 99 +- vendor/curl/lib/vauth/spnego_gssapi.c | 8 +- vendor/curl/lib/vauth/spnego_sspi.c | 24 +- vendor/curl/lib/vauth/vauth.h | 5 +- vendor/curl/lib/version.c | 33 +- vendor/curl/lib/version_win32.c | 4 +- vendor/curl/lib/vquic/ngtcp2.c | 175 +- vendor/curl/lib/vquic/quiche.c | 313 +- vendor/curl/lib/vquic/quiche.h | 6 +- vendor/curl/lib/vquic/vquic.c | 4 +- vendor/curl/lib/vquic/vquic.h | 2 +- vendor/curl/lib/vssh/libssh.c | 20 +- vendor/curl/lib/vssh/libssh2.c | 10 +- vendor/curl/lib/vtls/bearssl.c | 95 +- vendor/curl/lib/vtls/gskit.c | 66 +- vendor/curl/lib/vtls/gtls.c | 48 +- vendor/curl/lib/{ => vtls}/hostcheck.c | 118 +- vendor/curl/lib/{ => vtls}/hostcheck.h | 8 +- vendor/curl/lib/vtls/mbedtls.c | 89 +- vendor/curl/lib/vtls/mesalink.c | 679 -- vendor/curl/lib/vtls/mesalink.h | 32 - vendor/curl/lib/vtls/nss.c | 75 +- vendor/curl/lib/vtls/openssl.c | 238 +- vendor/curl/lib/vtls/openssl.h | 12 +- vendor/curl/lib/vtls/rustls.c | 70 +- vendor/curl/lib/vtls/schannel.c | 71 +- vendor/curl/lib/vtls/schannel.h | 6 +- vendor/curl/lib/vtls/schannel_verify.c | 11 +- vendor/curl/lib/vtls/sectransp.c | 41 +- vendor/curl/lib/vtls/vtls.c | 43 +- vendor/curl/lib/vtls/vtls.h | 6 +- vendor/curl/lib/vtls/wolfssl.c | 45 +- vendor/curl/lib/{ => vtls}/x509asn1.c | 138 +- vendor/curl/lib/{ => vtls}/x509asn1.h | 58 +- 124 files changed, 8063 insertions(+), 11241 deletions(-) delete mode 100644 vendor/curl/lib/config-tpf.h delete mode 100644 vendor/curl/lib/config-vxworks.h create mode 100644 vendor/curl/lib/h2h3.c create mode 100644 vendor/curl/lib/h2h3.h delete mode 100644 vendor/curl/lib/non-ascii.c delete mode 100644 vendor/curl/lib/non-ascii.h delete mode 100644 vendor/curl/lib/nwlib.c delete mode 100644 vendor/curl/lib/nwos.c rename vendor/curl/lib/{ => vtls}/hostcheck.c (54%) rename vendor/curl/lib/{ => vtls}/hostcheck.h (82%) delete mode 100644 vendor/curl/lib/vtls/mesalink.c delete mode 100644 vendor/curl/lib/vtls/mesalink.h rename vendor/curl/lib/{ => vtls}/x509asn1.c (92%) rename vendor/curl/lib/{ => vtls}/x509asn1.h (58%) diff --git a/vendor/curl/CHANGES b/vendor/curl/CHANGES index 692f78f2bb..2e6456681a 100644 --- a/vendor/curl/CHANGES +++ b/vendor/curl/CHANGES @@ -6,7935 +6,7727 @@ Changelog -Version 7.81.0 (5 Jan 2022) +Version 7.82.0 (5 Mar 2022) -Daniel Stenberg (5 Jan 2022) +Daniel Stenberg (5 Mar 2022) - RELEASE-NOTES: synced - curl 7.81.0 release + The 7.82.0 release -- THANKS: add names from 7.81.0 release +- THANKS: updates from the 7.82.0 release notes -- curl_multi_init.3: fix the copyright year range +- misc: update copyright year ranges -- test719-721: require "proxy" feature present to run - - Bug: https://github.com/curl/curl/pull/8223#issuecomment-1005188696 - Reported-by: Marc Hörsken +Jay Satiro (5 Mar 2022) +- unit1610: init SSL library before calling SHA256 functions - Closes #8226 - -- test719: require ipv6 support to run + The SSL library must be initialized (via global initialization) because + libcurl's SHA256 functions may call SHA256 functions in the SSL library. - Follow-up to effd2bd7ba2a5fd244 - Reported-by: Marc Hörsken - Bug: https://github.com/curl/curl/pull/8217#issuecomment-1004681145 + Reported-by: Gisle Vanem - Closes #8223 + Fixes https://github.com/curl/curl/issues/8538 + Closes https://github.com/curl/curl/pull/8540 -- test719-721: verify SOCKS details +- examples/curlx: support building with OpenSSL 1.1.0+ - Using the new verify/socks details - -- runtests: add verify/socks check + - Access members of X509_STORE_CTX in OpenSSL 1.1.0+ by using API + functions. - If used, this data is compared with the data in log/socksd-request.log - which the socksd server logs. + The X509_STORE_CTX struct has been opaque since OpenSSL 1.1.0. - Added to FILEFORMAT.md + Ref: https://curl.se/mail/lib-2022-03/0004.html + + Closes https://github.com/curl/curl/pull/8529 -- server/socksd: log atyp + address in a separate log +- h2h3: fix typo - To allow the test suite to verify that the right data arrived + Bug: https://github.com/curl/curl/issues/8381#issuecomment-1055440241 + Reported-by: Michael Kaufmann -- socks5: use appropriate ATYP for numerical IP address host names +- [Farzin brought this change] + + CURLOPT_XFERINFOFUNCTION.3: fix example struct assignment - When not resolving the address locallly (known as socks5h). + Closes https://github.com/curl/curl/pull/8519 + +Daniel Stenberg (26 Feb 2022) +- azure-pipelines: add a build on Windows with libssh - Add test 719 and 720 to verify. + Closes #8511 + +- runtests: make 'oldlibssh' be before 0.9.5 - Reported-by: Peter Piekarski - Fixes #8216 - Closes #8217 + Closes #8511 -Jay Satiro (3 Jan 2022) -- curl_multi_init.3: fix EXAMPLE formatting +- libssh: fix include files and defines use for Windows builds + + Reported-by: 梦终无痕 + Bug: https://curl.se/mail/lib-2022-02/0131.html + Closes #8511 -Daniel Stenberg (3 Jan 2022) - RELEASE-NOTES: synced -- libtest: avoid "assignment within conditional expression" - - In lib530, lib540 and lib582 +- [illusory-dream brought this change] + + winbuild: add parameter WITH_SSH - Closes #8218 + For building with libssh + Closes #8514 -- ftp: disable warning 4706 in MSVC +- configure: change output for cross-compiled alt-svc support - Follow-up to 21248e052d + It said 'no', while it actually is 'yes' - Disabling "assignment within conditional expression" for MSVC needs to - be done before the function starts, for it to take effect. + Closes #8512 + +- gha: add a macOS CI job with libssh - Closes #8218 + Closes #8513 -- tool_operate: warn if too many output arguments were found +- TODO: remove "Bring back libssh tests on Travis" - More output instructions than URLs is likely a user error. + The job was added to Circle CI in d8ddd0e7536 + +- TODO: remove "better persistency for HTTP/1.0" - Add test case 371 to verify + Let's not bother. + +- TODO: remove "Option to ignore private IP" - Closes #8210 + ... as curl ignores the IP entirely by default these days. -- .github/workflows/mbedtls.yml: bump to mbedtls 3.1.0 +- TODO: remove "hardcode the "localhost" addresses" - Closes #8215 + This is implmented since 1a0ebf6632f88 -- zuul: remove the mbedtls jobs +- TODO: 1.24 was a dupe of 1.1 + +- TODO: remove "Typesafe curl_easy_setopt()" - Now running as github workflows + I don't consider this a serious TODO item + +- KNOWN_BUGS: remove "Uploading HTTP/3 files gets interrupted" - Closes #8215 + This works now -- github/workflows: add mbedtls and mbedtls-clang +- KNOWN_BUGS: remove "HTTP/3 multipart POST with quiche fails" - Closes #8215 + It works now -- [Valentin Richter brought this change] +- quiche: remove two leftover debug infof() outputs - mbedtls: fix private member designations for v3.1.0 - - "As a last resort, you can access the field foo of a structure bar by - writing bar.MBEDTLS_PRIVATE(foo). Note that you do so at your own risk, - since such code is likely to break in a future minor version of Mbed - TLS." - - https://github.com/ARMmbed/mbedtls/blob/f2d1199edc5834df4297f247f213e614f7782d1d/docs/3.0-migration-guide.md - - That future minor version is v3.1.0. I set the >= to == for the version - checks because v3.1.0 is a release, and I am not sure when the private - designation was reverted after v3.0.0. +- [Tatsuhiro Tsujikawa brought this change] + + ngtcp2: Reset dynbuf when it is fully drained - Closes #8214 + Reported-by: vl409 on github + Fixes #7351 + Closes #8504 -- [Valentin Richter brought this change] +- [Stewart Gebbie brought this change] - cmake: prevent dev warning due to mismatched arg + hostip: avoid unused parameter error in Curl_resolv_check - -- curl version=[7.81.0-DEV] - CMake Warning (dev) at /usr/share/cmake-3.22.1/Modules/FindPackageHandleStandardArgs.cmake:438 (message): - The package name passed to `find_package_handle_standard_args` (MBEDTLS) - does not match the name of the calling package (MbedTLS). This can lead to - problems in calling code that expects `find_package` result variables - (e.g., `_FOUND`) to follow a certain pattern. - Call Stack (most recent call first): - deps/curl/CMake/FindMbedTLS.cmake:31 (find_package_handle_standard_args) - deps/curl/CMakeLists.txt:473 (find_package) - This warning is for project developers. Use -Wno-dev to suppress it. + When built without DNS-over-HTTP and without asynchronous resolvers, + neither the dns nor the data parameters are used. - Closes #8207 + That is Curl_resolv_check appears to call + Curl_resolver_is_resolved(data, dns). But, + with CURL_DISABLE_DOH without CURLRES_ASYNCH, the call is actually + elided via a macro definition. + + This fix resolves the resultant: "unused parameter 'data'" error. + + Closes #8505 -- urlapi: if possible, shorten given numerical IPv6 addresses +- http2: move two infof calls to debug-h2-only - Extended test 1560 to verify + and remove a superflous one - Closes #8206 + Ref: https://github.com/curl/curl/discussions/8498 + Closes #8502 -- [Michał Antoniak brought this change] +- [Jean-Philippe Menil brought this change] - url: reduce ssl backend count for CURL_DISABLE_PROXY builds + quiche: fix upload for bigger content-length - Closes #8212 + Signed-off-by: Jean-Philippe Menil + Closes #8421 -- KNOWN_BUGS: "Trying local ports fails on Windows" +Jay Satiro (23 Feb 2022) +- [Farzin brought this change] + + CURLOPT_PROGRESSFUNCTION.3: fix example struct assignment - Reported-by: gclinch on github - Closes #8112 + Closes https://github.com/curl/curl/pull/8500 -- misc: update copyright year range +Daniel Stenberg (22 Feb 2022) +- [Rob Boeckermann brought this change] -- zuul: remove the wolfssl even more + OS400/README: clarify compilation steps - Follow-up to 1914465cf180d32b3d + Closes #8494 -- examples/multi-single.c: remove WAITMS() +- [Rob Boeckermann brought this change] + + OS400: fix typos in rpg include file - As it isn't used. + This resolves issues compiling rpg code that includes the curl header + file. - Reported-by: Melroy van den Berg - Fixes #8200 - Closes #8201 + Closes #8494 -- gtls: add gnutls include for the session type - - Follow-up to 8fbd6feddfa5 to make it build more universally +- [Michał Antoniak brought this change] -- m4/curl-compilers: tell clang -Wno-pointer-bool-conversion + vtls: fix socket check conditions - To hush compiler warnings we don't care for: error: address of function - 'X' will always evaluate to 'true' + fix condition to check the second socket during associate and + disassociate connection - Fixes #8197 - Closes #8198 + Closes #8493 -- http_proxy: don't close the socket (too early) +- libssh2: don't typecast socket to int for libssh2_session_handshake - ... and double-check in the OpenSSL shutdown that the socket is actually - still there before it is used. + Since libssh2_socket_t uses SOCKET on windows which can be larger than + int. - Fixes #8193 - Closes #8195 + Closes #8492 + +- RELEASE-NOTES: fix typo and make one desc shorter + +- RELEASE-NOTES: synced + +- CURLOPT_XFERINFOFUNCTION.3: fix typo in example - Reported-by: Leszek Kubik + Reported-by: coralw on github + Fixes #8487 + Closes #8488 -- ngtcp2: verify the server certificate for the gnutls case +- README: disable linkchecks for the sponsor links - Closes #8178 + Closes #8489 -- ngtcp2: verify the server cert on connect (quictls) +Jay Satiro (21 Feb 2022) +- openssl: check if sessionid flag is enabled before retrieving session - Make ngtcp2+quictls correctly acknowledge `CURLOPT_SSL_VERIFYPEER` and - `CURLOPT_SSL_VERIFYHOST`. + Ideally, Curl_ssl_getsessionid should not be called unless sessionid + caching is enabled. There is a debug assertion in the function to help + ensure that. Therefore, the pattern in all vtls is basically: - The name check now uses a function from lib/vtls/openssl.c which will - need attention for when TLS is not done by OpenSSL or is disabled while - QUIC is enabled. + if(primary.sessionid) {lock(); Curl_ssl_getsessionid(...); unlock();} - Possibly the servercert() function in openssl.c should be adjusted to be - able to use for both regular TLS and QUIC. + There was one instance in openssl.c where sessionid was not checked + beforehand and this change fixes that. - Ref: #8173 - Closes #8178 + Prior to this change an assertion would occur in openssl debug builds + during connection stage if session caching was disabled. + + Reported-by: Jim Beveridge + + Fixes https://github.com/curl/curl/issues/8472 + Closes https://github.com/curl/curl/pull/8484 -- zuul: remove the wolfssl build +- multi: allow user callbacks to call curl_multi_assign + + Several years ago a change was made to block user callbacks from calling + back into the API when not supported (recursive calls). One of the calls + blocked was curl_multi_assign. Recently the blocking was extended to the + multi interface API, however curl_multi_assign may need to be called + from within those user callbacks (eg CURLMOPT_SOCKETFUNCTION). + + I can't think of any callback where it would be unsafe to call + curl_multi_assign so I removed the restriction entirely. + + Reported-by: Michael Wallner + + Ref: https://github.com/curl/curl/commit/b46cfbc + Ref: https://github.com/curl/curl/commit/340bb19 + + Fixes https://github.com/curl/curl/issues/8480 + Closes https://github.com/curl/curl/pull/8483 -- github workflow: add wolfssl +Daniel Stenberg (21 Feb 2022) +- [Michał Antoniak brought this change] + + ssl: reduce allocated space for ssl backend when FTP is disabled - Closes #8196 + Add assert() for the backend pointer in many places + + Closes #8471 -- [Nicolas Sterchele brought this change] +- [Michał Antoniak brought this change] - zuul: fix quiche build pointing to wrong Cargo + checkprefix: remove strlen calls - Fixes #8184 - Closes #8189 + Closes #8481 -- checksrc: detect more kinds of NULL comparisons we avoid +Jay Satiro (20 Feb 2022) +- [1337vt brought this change] + + curl.h: fix typo - Co-authored-by: Jay Satiro - Closes #8180 + Closes https://github.com/curl/curl/pull/8482 -- RELEASE-NOTES: synced +- [Jan Venekamp brought this change] -- mesalink: remove the BACKEND define kludge + sectransp: mark a 3DES cipher as weak - Closes #8183 + - Change TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA strength to weak. + + All other 3DES ciphers are already marked as weak. + + Closes https://github.com/curl/curl/pull/8479 -- schannel: remove the BACKEND define kludge +- [Jan Venekamp brought this change] + + bearssl: fix EXC_BAD_ACCESS on incomplete CA cert - Closes #8182 + - Do not create trust anchor object for a CA certificate until after it + is processed. + + Prior to this change the object was created at state BR_PEM_BEGIN_OBJ + (certificate processing begin state). An incomplete certificate (for + example missing a newline at the end) never reaches BR_PEM_END_OBJ + (certificate processing end state) and therefore the trust anchor data + was not set in those objects, which caused EXC_BAD_ACCESS. + + Ref: https://github.com/curl/curl/pull/8106 + + Closes https://github.com/curl/curl/pull/8476 -- gtls: check return code for gnutls_alpn_set_protocols +- [Jan Venekamp brought this change] + + bearssl: fix connect error on expired cert and no verify - Closes #8181 + - When peer verification is disabled use the x509_decode engine instead + of the x509_minimal engine to parse and extract the public key from + the first cert of the chain. + + Prior to this change in such a case no key was extracted and that caused + CURLE_SSL_CONNECT_ERROR. The x509_minimal engine will stop parsing if + any validity check fails but the x509_decode won't. + + Ref: https://github.com/curl/curl/pull/8106 + + Closes https://github.com/curl/curl/pull/8475 -- [Stefan Huber brought this change] +- [Jan Venekamp brought this change] - README: label the link to the support document + bearssl: fix session resumption (session id) - Closes #8185 + Prior to this change br_ssl_client_reset was mistakenly called with + resume_session param set to 0, which disabled session resumption. + + Ref: https://github.com/curl/curl/pull/8106 + + Closes https://github.com/curl/curl/pull/8474 -- docs/HTTP3: describe how to setup a h3 reverse-proxy for testing +Daniel Stenberg (18 Feb 2022) +- [Michał Antoniak brought this change] + + openssl: fix build for version < 1.1.0 - Assisted-by: Matt Holt + Closes #8470 + +- [Joel Depooter brought this change] + + schannel: move the algIds array out of schannel.h - Closes #8177 + This array is only used by the SCHANNEL_CRED struct in the + schannel_acquire_credential_handle function. It can therefore be kept as + a local variable. This is a minor update to + bbb71507b7bab52002f9b1e0880bed6a32834511. + + This change also updates the NUM_CIPHERS value to accurately count the + number of ciphers options listed in schannel.c, which is 47 instead of + 45. It is unlikely that anyone tries to set all 47 values, but if they + had tried, the last two would not have been set. + + Closes #8469 -- libcurl-multi.3: "SOCKS proxy handshakes" are not blocking +- [Alejandro R. Sedeño brought this change] + + configure.ac: use user-specified gssapi dir when using pkg-config - Since 4a4b63daaa0 + Using the system pkg-config path in the face of a user-specified + library path is asking to link the wrong library. + + Reported-by: Michael Kaufmann + Fixes #8289 + Closes #8456 -- [Vladimir Panteleev brought this change] +- [Kevin Adler brought this change] - tests: Add test for CURLOPT_HTTP200ALIASES + os400: Add link to QADRT devkit to README.OS400 + + Closes #8455 -- [Vladimir Panteleev brought this change] +- [Kevin Adler brought this change] - http: Fix CURLOPT_HTTP200ALIASES + os400: Add function wrapper for system command - The httpcode < 100 check was also triggered when none of the fields were - parsed, thus making the if(!nc) block unreachable. + The wrapper will exit if the system command failed instead of blindly + continuing on. - Closes #8171 + In addition, only copy docs which exist, since now the copy failure will + cause the build to stop. + + Closes #8455 -- RELEASE-NOTES: synced +- [Kevin Adler brought this change] -- language: "email" + os400: Default build to target current release - Missed three occurrences. + V6R1M0 is not available as a target release since IBM i 7.2. To keep + from having to keep this up to date in git, default to the current + release. Users can configure this to whatever release they want to + actually build for. - Follow-up to 7a92f86 + Closes #8455 -- nss:set_cipher don't clobber the cipher list +- docs/INTERNALS.md: clean up, refer to the book - The string is set by the user and needs to remain intact for proper - connection reuse etc. + The explanatory parts are now in the everything curl book (which can + also use images etc). This document now refers to that resource and only + leaves listings of supported versions of libs, tools and operating + systems. See https://everything.curl.dev/internals - Reported-by: Eric Musser - Fixes #8160 - Closes #8161 + Closes #8467 -- misc: s/e-mail/email +Marcel Raad (17 Feb 2022) +- des: fix compile break for OpenSSL without DES - Consistency is king. Following the lead in everything curl. + When `USE_OPENSSL` was defined but OpenSSL had no DES support and a + different crypto library was used for that, `Curl_des_set_odd_parity` + was called but not defined. This could for example happen on Windows + and macOS when using OpenSSL v3 with deprecated features disabled. - Closes #8159 + Use the same condition for the function definition as used at the + caller side, but leaving out the OpenSSL part to avoid including + OpenSSL headers. + + Closes https://github.com/curl/curl/pull/8459 -- [Tobias Nießen brought this change] +Daniel Stenberg (17 Feb 2022) +- RELEASE-NOTES: synced - docs: fix typo in OpenSSL 3 build instructions +- docs/DEPRECATE: remove NPN support in August 2022 - Closes #8162 + Closes #8458 -- linkcheck.yml: add CI job that checks markdown links +- ftp: provide error message for control bytes in path - Closes #8158 - -- RELEASE-PROCEDURE.md: remove ICAL link and old release dates + Closes #8460 -- BINDINGS.md: "markdown-link-check-disable" +- http: fix "unused parameter ‘conn’" warning - It feels a bit unfortunate to litter an ugly tag for this functionality, - but if we get link scans of all markdown files, this might be worth the - price. + Follow-up from 7d600ad1c395 + + Spotted on appveyor + + Closes #8465 -- docs: fix dead links, remove ECH.md +Jay Satiro (17 Feb 2022) +- [Alejandro R. Sedeño brought this change] -Jay Satiro (16 Dec 2021) -- openssl: define HAVE_OPENSSL_VERSION for OpenSSL 1.1.0+ + sha256: Fix minimum OpenSSL version - Prior to this change OpenSSL_version was only detected in configure - builds. For other builds the old version parsing code was used which - would result in incorrect versioning for OpenSSL 3: + - Change the minimum OpenSSL version for using their SHA256 + implementation from 0.9.7 to 0.9.8. - Before: + EVP_sha256() does not appear in the OpenSSL source before 0.9.7h, and + does not get built by default until 0.9.8, so trying to use it for all + 0.9.7 is wrong, and before 0.9.8 is unreliable. - curl 7.80.0 (i386-pc-win32) libcurl/7.80.0 OpenSSL/3.0.0a zlib/1.2.11 - WinIDN libssh2/1.9.0 + Closes https://github.com/curl/curl/pull/8464 + +Daniel Stenberg (16 Feb 2022) +- KNOWN_BUGS: remove "slow connect to localhost on Windows" - After: + localhost is not resolved anymore since 1a0ebf6632f88 + +- KNOWN_BUGS: remove "HTTP/3 download is 5x times slower than HTTP/2" - curl 7.80.0 (i386-pc-win32) libcurl/7.80.0 OpenSSL/3.0.1 zlib/1.2.11 - WinIDN libssh2/1.9.0 + It's not actually a bug. More like room for improvement. + +- KNOWN_BUGS: remove "HTTP/3 download with quiche halts after a while" - Reported-by: lllaffer@users.noreply.github.com - - Fixes https://github.com/curl/curl/issues/8154 - Closes https://github.com/curl/curl/pull/8155 + Follow-up to 96f85a0fef694 -Daniel Stenberg (16 Dec 2021) -- [James Fuller brought this change] - - docs: add known bugs list to HTTP3.md +- KNOWN_BUGS: remove "pulseUI vpn" as a problem - Closes #8156 - -Dan Fandrich (15 Dec 2021) -- BINDINGS: add one from Everything curl and update a link + We haven't heard about this for a long time and rumours have it they + might have fixed it. -- libcurl-security.3: mention address and URL mitigations +- urldata: remove conn->bits.user_passwd - The new CURLOPT_PREREQFUNCTION callback is another way to sanitize - addresses. - Using the curl_url API is a way to mitigate against attacks relying on - URL parsing differences. + The authentication status should be told by the transfer and not the + connection. + + Reported-by: John H. Ayad + Fixes #8449 + Closes #8451 -Daniel Stenberg (15 Dec 2021) -- RELEASE-NOTES: synced +- [Kevin Adler brought this change] -- x509asn1: return early on errors + gskit: Convert to using Curl_poll - Overhaul to make sure functions that detect errors bail out early with - error rather than trying to continue and risk hiding the problem. + As mentioned in 32766cb, gskit was the last user of Curl_select which is + now gone. Convert to using Curl_poll to allow build to work on IBM i. - Closes #8147 + Closes #8454 -- [Patrick Monnerat brought this change] +- [Kevin Adler brought this change] - openldap: several minor improvements + gskit: Fix initialization of Curl_ssl_gskit struct - - Early check proper LDAP URL syntax. Reject URLs with a userinfo part. - - Use dynamic memory for ldap_init_fd() URL rather than a - stack-allocated buffer. - - Never chase referrals: supporting it would require additional parallel - connections and alternate authentication credentials. - - Do not wait 1 microsecond while polling/reading query response data. - - Store last received server code for retrieval with CURLINFO_RESPONSE_CODE. + In c30bf22, Curl_ssl_getsock was factored out in to a member of + struct Curl_ssl but the gskit initialization was not updated to reflect + this new member. - Closes #8140 + Closes #8454 -- [Michał Antoniak brought this change] +- [Kevin Adler brought this change] - misc: remove unused doh flags when CURL_DISABLE_DOH is defined + gskit: Fix errors from Curl_strerror refactor - Closes #8148 - -- mbedtls: fix CURLOPT_SSLCERT_BLOB + 2f0bb864c1 replaced sterror with Curl_strerror, but the strerror buffer + shadows the set_buffer "buffer" parameter. To keep consistency with the + other functions that use Curl_strerror, rename the parameter. - The memory passed to mbedTLS for this needs to be null terminated. + In addition, strerror.h is needed for the definition of STRERROR_LEN. - Reported-by: Florian Van Heghe - Closes #8146 + Closes #8454 -- asyn-ares: ares_getaddrinfo needs no happy eyeballs timer +Marcel Raad (15 Feb 2022) +- ntlm: remove unused feature defines - Closes #8142 - -- mailmap: add Yongkang Huang + They're not used anymore and always supported. - From #8141 + Closes https://github.com/curl/curl/pull/8453 -- [Yongkang Huang brought this change] - - check ssl_config when re-use proxy connection +Daniel Stenberg (15 Feb 2022) +- [Kantanat Wannapaka brought this change] -- mbedtls: do a separate malloc for ca_info_blob + README.md: fix link and layout - Since the mbedTLS API requires the data to the null terminated. - - Follow-up to 456c53730d21b1fad0c7f72c1817 + replace tags and tags - Fixes #8139 - Closes #8145 + Closes #8448 -Marc Hoersken (14 Dec 2021) -- CI: build examples for additional code verification - - Some CIs already build them, let's do it on more of them. - - Reviewed-by: Daniel Stenberg - - Follow up to #7690 and 77311f420a541a0de5b3014e0e40ff8b4205d4af - Replaces #7591 - Closes #7922 +- KNOWN_BUGS: fix typo "libpsl" -- docs/examples: workaround broken -Wno-pedantic-ms-format +Jay Satiro (14 Feb 2022) +- h2h3: fix compiler warning due to function prototype mismatch - Avoid CURL_FORMAT_CURL_OFF_T by using unsigned long instead. - Improve size_t to long conversion in imap-append.c example. + - Add missing const qualifier in Curl_pseudo_headers declaration. + +Daniel Stenberg (14 Feb 2022) +- [Stefan Eissing brought this change] + + urlapi: handle "redirects" smarter - Ref: https://github.com/curl/curl/issues/6079 - Ref: https://github.com/curl/curl/pull/6082 - Assisted-by: Jay Satiro - Reviewed-by: Daniel Stenberg + - avoid one malloc when setting a new url via curl_url_set() + and CURLUPART_URL. + - extract common pattern into a new static function. - Preparation of #7922 + Closes #8450 -- tests/data/test302[12]: fix MSYS2 path conversion of hostpubsha256 - - Ref: https://www.msys2.org/wiki/Porting/#filesystem-namespaces +- cijobs: pick up circleci configure lines better + +- circleci: add a job using wolfSSH - Reviewed-by: Marcel Raad - Reviewed-by: Jay Satiro + Build only, no tests. - Fixes #8084 - Closes #8138 + Closes #8445 -Daniel Stenberg (13 Dec 2021) -- [Patrick Monnerat brought this change] +- scripts/ciconfig.pl: show used options not available - openldap: simplify ldif generation code +- circleci: add a job using libssh - and take care of zero-length values, avoiding conversion to base64 - and/or trailing spaces. + Closes #8444 + +- runtests: set 'oldlibssh' for libssh versions before 0.9.6 - Closes #8136 + ... and make test 1459 check for the different return code then. + + Closes #8444 -- example/progressfunc: remove code for old libcurls +Jay Satiro (13 Feb 2022) +- Makefile.am: Generate VS 2022 projects - 7.61.0 is over three years old now, remove all #ifdefs for handling - ancient libcurl versions so that the example gets easier to read and - understand + Follow-up to f13d4d0 which added VS 2022 project support. - Closes #8137 + Ref: https://github.com/curl/curl/pull/8438 -- [x2018 brought this change] +- [Daniel Stenberg brought this change] - sha256/md5: return errors when init fails + projects: remove support for MSVC before VC10 (Visual Studio 2010) - Closes #8133 + - Remove Visual Studio project files for VC6, VC7, VC7.1, VC8 and VC9. + + Those versions are too old to be maintained any longer. + + Closes https://github.com/curl/curl/pull/8442 -- TODO: 13.3 Defeat TLS fingerprinting +- [Stav Nir brought this change] + + projects: add support for Visual Studio 17 (2022) - Closes #8119 + Closes https://github.com/curl/curl/pull/8438 +Daniel Stenberg (13 Feb 2022) - RELEASE-NOTES: synced -- [Patrick Monnerat brought this change] +- connect: follow-up fix the copyright year - openldap: process search query response messages one by one +- [Michał Antoniak brought this change] + + misc: remove unused data when IPv6 is not supported - Upon receiving large result sets, this reduces memory consumption and - allows starting to output results while the transfer is still in - progress. + Closes #8430 + +- scripts/ciconfig: show CI job config info - Closes #8101 + Closes #8446 -- hash: lazy-alloc the table in Curl_hash_add() +- quiche: handle stream reset - This makes Curl_hash_init() infallible which saves error paths. + A stream reset now causes a CURLE_PARTIAL_FILE error. I'm not convinced + this is the right action nor the right error code. - Closes #8132 + Reported-by: Lucas Pardue + Fixes #8437 + Closes #8440 -- multi: cleanup the socket hash when destroying it +- mime: use a define instead of the magic number 24 - Since each socket hash entry may themselves have a hash table in them, - the destroying of the socket hash needs to make sure all the subhashes - are also correctly destroyed to avoid leaking memory. + MIME_BOUNDARY_DASHES is now the number of leading dashes in the + generated boundary string. - Fixes #8129 - Closes #8131 + Closes #8441 -- test1156: fixup the stdout check for Windows - - It is not text mode. +- [Henrik Holst brought this change] + + hostcheck: reduce strlen calls on chained certificates - Follow-up to 6f73e68d182 + Closes #8428 + +- [Patrick Monnerat brought this change] + + mime: some more strlen() call removals. - Closes #8134 + Closes #8423 -- test1528: enable for hyper +- scripts/cijobs.pl: detect zuul cmake jobs better + +- url: exclude zonefrom_url when no ipv6 is available - Closes #8128 + Closes #8439 -- test1527: enable for hyper +- if2ip: make Curl_ipv6_scope a blank macro when IPv6-disabled - Closes #8128 + Closes #8439 -- test1526: enable for hyper +- [Henrik Holst brought this change] + + mprintf: remove strlen calls on empty strings in dprintf_formatf - Closes #8128 + Turns out that in dprintf_formatf we did a strlen on empty strings, a + bit strange is how common this actually is, 24 alone when doing a simple + GET from https://curl.se + + Closes #8427 -- test1525: slightly tweaked for hyper +- wolfssl: return CURLE_AGAIN for the SSL_ERROR_NONE case - Closes #8128 + Closes #8431 -- test1156: enable for hyper +- wolfssl: when SSL_read() returns zero, check the error - Minor reorg of the lib1156 code and it works fine for hyper. + Returning zero indicates end of connection, so if there's no data read + but the connection is alive, it needs to return -1 with CURLE_AGAIN. - Closes #8127 + Closes #8431 -- test661: enable for hyper +- quiche: after leaving h3_recving state, poll again - Closes #8126 + This could otherwise easily leave libcurl "hanging" after the entire + transfer is done but without noticing the end-of-transfer signal. + + Assisted-by: Lucas Pardue + Closes #8436 -- docs: fix proselint nits +- quiche: when *recv_body() returns data, drain it before polling again - - remove a lot of exclamation marks - - use consistent spaces (1, not 2) - - use better words at some places + Assisted-by: Lucas Pardue - Closes #8123 + Closes #8429 -- [RekGRpth brought this change] +- [gaoxingwang on github brought this change] - BINDINGS.md: add cURL client for PostgreSQL + configure: fix '--enable-code-coverage' typo - Closes #8125 - -- [RekGRpth brought this change] + Fixes #8425 + Closes #8426 - CURLSHOPT_USERDATA.3: fix copy-paste mistake +- lib/h2h3: #ifdef on ENABLE_QUIC, not the wrong define - Closes #8124 + Otherwise the build fails when H3 is enabled but the build doesn't + include nghttp2. + + Closes #8424 -- docs: fix minor nroff format nits +- hostcheck: pass in pattern length too, to avoid a strlen call - Repairs test 1140 + Removes one strlen() call per SAN name in a cert-check. - Follow-up to 436cdf82041 + Closes #8418 -- docs/URL-SYNTAX.md: space is not fine in a given URL +- [Henrik Holst brought this change] -- curl_multi_perform/socket_action.3: clarify what errors mean + misc: remove strlen for Curl_checkheaders + Curl_checkProxyheaders - An error returned from one of these funtions mean that ALL still ongoing - transfers are to be considered failed. - - Ref: #8114 - Closes #8120 + Closes #8409 -- libcurl-errors.3: add CURLM_ABORTED_BY_CALLBACK +- configure: requires --with-nss-deprecated to build with NSS - Follow-up to #8089 (2b3dd01) + Add deprecation plans to docs/DEPRECATE.md - Closes #8116 + Closes #8395 -- hash: add asserts to help detect bad usage +- mqtt: free 'sendleftovers' in disconnect - For example trying to add entries after the hash has been "cleaned up" + Fix a memory-leak - Closes #8115 + Bug: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=43646 + Closes #8415 -- lib530: abort on curl_multi errors +- [Patrick Monnerat brought this change] + + openldap: pass string length arguments to client_write() - This makes torture tests run more proper. + This uses the new STRCONST() macro and saves 2 strlen() calls on short + string constants per LDIF output line. - Also add an assert to trap situations where it would end up with no - sockets to wait for. + Closes #8404 + +- [Henrik Holst brought this change] + + misc: reduce strlen() calls with Curl_dyn_add() - Closes #8121 + Use STRCONST() to switch from Curl_dyn_add() to Curl_dyn_addn() for + string literals. + + Closes #8398 -- FAQ: we never pronounced it "see URL", we say "kurl" +- http2: fix the array copy to nghttp2_nv + + Bug: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=44517 + Follow-up to 9f985a11e794 + Closes #8414 - RELEASE-NOTES: synced -- CURLOPT_RESOLVE.3: minor polish +- scripts/cijobs.pl: output data about all currect CI jobs - Minor rephrasing for some explanations. + This script parses the config files for all the CI services currently in + use and output the information in a uniform way. The idea is that the + output from this script should be possible to massage into informational + tables or graphs to help us visualize what they are all testing and NOT + testing. - Put the format strings in stand-alone lines with .nf/.fi to be easier to spot. + Closes #8408 + +- maketgz: return error if 'make dist' fails - Move "added in" to AVAILABILITY + To better detect this problem in CI jobs - Closed #8110 + Reported-by: Marcel Raad + Bug: https://curl.se/mail/lib-2022-02/0070.html + Closes #8402 -- test1556: adjust for hyper +- h2h3: pass correct argument types to infof() - Closes #8105 + Detected by Coverity. CID 1497993 + + Closes #8401 -- test1554: adjust for hyper +- lib/Makefile: remove config-tpf.h from the dist - Closes #8104 + Follow-up from da15443dddea2bfb. Missed before because the 'distcheck' + CI job was not working as intended. + + Reported-by: Marcel Raad + Bug: https://curl.se/mail/lib-2022-02/0070.html + Closes #8403 -- retry-all-errors.d: make the example complete +- configure: remove support for "embedded ares" - ... as it needs --retry too to work + In March 2010 (commit 4259d2df7dd) we removed the embedded 'ares' + directory from the curl source tree but we have since supported + especially detecting and using that build directory. The time has come + to remove that kludge and ask users to specify the c-ares dir correctly + with --enable-ares. + + Closes #8397 -- TODO: 5.7 Require HTTP version X or higher +- [Sebastian Sterk brought this change] + + github/workflows/mbedtls: fix indent & remove unnecessary line breaks - Closes #7980 + Closes #8399 -- CURLOPT_STDERR.3: does not work with libcurl as a win32 DLL +- CI: move the NSS job from zuul to GHA - This is the exact same limitation already documented for - CURLOPT_WRITEDATA but should be clarified here. It also has a different - work-around. + Closes #8396 + +- tests/unit/Makefile.am: add NSS_LIBS to build with NSS fine - Reported-by: Stephane Pellegrino - Bug: https://github.com/curl/curl/issues/8102 - Closes #8103 + Closes #8396 -- multi: handle errors returned from socket/timer callbacks +Marcel Raad (7 Feb 2022) +- curl-openssl: fix SRP check for OpenSSL 3.0 - The callbacks were partially documented to support this. Now the - behavior is documented and returning error from either of these - callbacks will effectively kill all currently ongoing transfers. + When OpenSSL 3.0 is built with `--api=3.0` and `no-deprecated`, the SRP + functions exist in the library, but are disabled for user code. Check + if they are actually usable instead of only if they exist. Also, check + for the functions actually required for TLS-SRP. - Added test 530 to verify + TLS-SRP support is still enabled if OpenSSL is configured with just + `--api=3.0` or with `--api=1.1.1 no-deprecated`. - Reported-by: Marcelo Juchem - Fixes #8083 - Closes #8089 + Closes https://github.com/curl/curl/pull/8394 -- http2:set_transfer_url() return early on OOM +Daniel Stenberg (7 Feb 2022) +- [Henrik Holst brought this change] + + http: make Curl_compareheader() take string length arguments too - If curl_url() returns NULL this should return early to avoid mistakes - - even if right now the subsequent function invokes are all OK. + Also add STRCONST, a macro that returns a string literal and it's length + for functions that take "string,len" - Coverity (wrongly) pointed out this as a NULL deref. + Removes unnecesary calls to strlen(). - Closes #8100 + Closes #8391 -- tool_parsecfg: use correct free() call to free memory +- vquic/vquic.h: removed the unused H3 psuedo defines + +- ngtcp2: use Curl_pseudo_headers + +- quiche: use Curl_pseudo_headers + +- http2: use Curl_pseudo_headers + +- h2h3: added Curl_pseudo_headers() - Detected by Coverity. CID 1494642. - Follow-up from 2be1aa619bca + For use with both http2 and http3 requests. + +- ngtcp2/quiche: make :scheme possible to set + +- http2: allow CURLOPT_HTTPHEADER change ":scheme" - Closes #8099 + The only h2 psuedo header that wasn't previously possible to change by a + user. This change also makes it impossible to send a HTTP/1 header that + starts with a colon, which I don't think anyone does anyway. + + The other pseudo headers are possible to change indirectly by doing the + rightly crafted request. + + Reported-by: siddharthchhabrap on github + Fixes #8381 + Closes #8393 -- tool_operate: fix potential memory-leak +- h2/h3: provide and refer to pseudo headers as defines - A 'CURLU *' would leak if url_proto() is called with no URL. + ... and do sizeof() on the defines to use constants better. - Detected by Coverity. CID 1494643. - Follow-up to 18270893abdb19 - Closes #8098 + Closes #8389 -- [Patrick Monnerat brought this change] +- [Michał Antoniak brought this change] - openldap: implement STARTTLS + smb: passing a socket for writing and reading data instead of FIRSTSOCKET - As this introduces use of CURLOPT_USE_SSL option for LDAP, also check - this option in ldap.c as it is not supported by this backend. + Closes #8383 + +- x509asn1: toggle off functions not needed for diff tls backends - Closes #8065 + ... and clean the header file from private defines/structs (move to C + file) and unused function prototypes. + + Closes #8386 -- [Jun Tseng brought this change] +- lib: move hostcheck and x509sn1 sources to vtls/ + + ... since they are used strictly by TLS code. + + Closes #8386 - curl_easy_unescape.3: call curl_easy_cleanup in example +Marcel Raad (4 Feb 2022) +- version_win32: fix warning for `CURL_WINDOWS_APP` - Closes #8097 + The build version is not supported by the UWP code. + + Closes https://github.com/curl/curl/pull/8385 -- [Jun Tseng brought this change] +Daniel Stenberg (4 Feb 2022) +- tests/disable-scan.pl: properly detect multiple symbols per line + + Test 1165 would fail on some systems because it didn't detect + CURL_DISABLE_* symbols that were used to the right of another one on the + same line! The script would only detect and extract the first one. + + Reported-by: Marcel Raad + Fixes #8384 + Closes #8388 - curl_easy_escape.3: call curl_easy_cleanup in example +Jay Satiro (4 Feb 2022) +- config.d: Clarify _curlrc filename is still valid on Windows - Closes #8097 + Recent changes added support for filename .curlrc on Windows, and + when it's not found curl falls back on the original Windows filename + _curlrc. _curlrc was removed from the doc, however it is still valid. + + Closes https://github.com/curl/curl/pull/8382 -- tool_listhelp: sync +Daniel Stenberg (4 Feb 2022) +- lib: remove support for CURL_DOES_CONVERSIONS - Follow-up to 172068b76f + TPF was the only user and support for that was dropped. + + Closes #8378 -- [Damien Walsh brought this change] +- TPF: drop support + + There has been no TPF related changes done since September 2010 (commit + 7e1a45e224e57) and since this is a platform that is relatively different + than many others (== needs attention), I draw the conclusion that this + build is broken since a long time. + + Closes #8378 - request.d: refer to 'method' rather than 'command' +- scripts/delta: check the file delta for current branch - Closes #8094 + ... also polish the output style a little bit -- RELEASE-NOTES: synced +Jay Satiro (3 Feb 2022) +- [Fabian Keil brought this change] -- writeout: fix %{http_version} for HTTP/3 + runtests.pl: tolerate test directories without Makefile.inc - Output "3" properly when HTTP/3 was used. + Silences the following warnings when using a Makefile.inc-free + TESTDIR using the "-o" argument: - Reported-by: Bernat Mut - Fixes #8072 - Closes #8092 - -- urlapi: accept port number zero + readline() on closed filehandle D at ./runtests.pl line 592. + Use of uninitialized value $disttests in pattern match (m//) at + ./runtests.pl line 3602. - This is a regression since 7.62.0 (fb30ac5a2d). + Closes https://github.com/curl/curl/pull/8379 + +Daniel Stenberg (3 Feb 2022) +- [Henrik Holst brought this change] + + setopt: do bounds-check before strdup - Updated test 1560 accordingly + Curl_setstropt() allocated memory for the string before checking if the + string was within bounds. The bounds check should be done first. - Reported-by: Brad Fitzpatrick - Fixes #8090 - Closes #8091 + Closes #8377 -- [Mark Dodgson brought this change] +- [Michał Antoniak brought this change] - lift: ignore is a deprecated config option, use ignoreRules + mbedtls: enable use of mbedtls without filesystem functions support - Closes #8082 + Closes #8376 -- [Alessandro Ghedini brought this change] +- [Bernhard Walle brought this change] - HTTP3: update quiche build instructions + configure: support specification of a nghttp2 library path - The repo repo was re-organized a bit, so the build instructions need to - be updated. + This enables using --with-nghttp2=