extra log info # specific errors during session firmware epd

This commit is contained in:
luc 2026-09-03 17:19:53 +02:00
parent 8b58693de8
commit c771a01186
14 changed files with 224 additions and 87 deletions

View file

@ -38,11 +38,30 @@ constexpr int SleepAfterClear = 2000;
bool g_EnableReleaseLogging;
Epd3Base::Epd3U* current;
void Epd3Base::Epd3U::resetErrors()
{
errorm009 = errorm007 = errorm102 = errorm202 = error_other = 0;
}
void Epd3Base::Epd3U::incrementError(int rv)
{
switch (rv) {
case 0: break;
case -7: errorm007++; break;
case -9: errorm009++; break;
case -102: errorm102++; break;
case -202: errorm202++; break;
case -999: error_other++; break;
default: error_other++; break;
}
}
void Epd3Base::Epd3U::ResetStepReturnValues()
{
CurrentStep = -1;
HasStepError = 0;
for (int i = MaxSteps - 1; i >= 0; --i) for (int j = 0; j < 4; j++) StepReturnValues[i][j] = 0;
resetErrors();
}
int Epd3Base::Epd3U::SetFunctionReturnValue(enum eFunctions f, BYTE CanIgnore)
@ -197,7 +216,7 @@ Epd3Base::Epd3U::Epd3U(int _comport)
hasAlarm = hasFault = 0;
ErrorSource = ErrorReason = ErrorData = 0;
HardVersion = HardVersionMinor = SoftVersion = FunctionFlags = 0;
HardVersion = HardVersionMinor = HardVersionBuild = HardVersionRevision = SoftVersion = SoftVersionMinor = SoftVersionBuild = SoftVersionPatch = FunctionFlags = 0;
K1 = K2 = K3 = K4 = K4 = K6 = 0.0F;
HG = SG = BC = FB = 0;
@ -236,7 +255,6 @@ int Epd3Base::Epd3U::DisconnectAndConnect()
int rv = 0;
rv = Disconnect(epdComsHandle);
Sleep(200);
//rv = SetConnectCallback(epdComsHandle, connectcallback);
int tries = 3; rv = 1;
while (rv && --tries>=0) {
rv = Connect3(epdComsHandle, Epd, true);
@ -296,6 +314,11 @@ DWORD Epd3Base::Epd3U::StartCom()
}
if (epdComsHandle != nullptr) {
Dll3RV = SetConnectCallback(epdComsHandle, connectcallback);
Dll3RV = SetDisconnectCallback(epdComsHandle, disconnectcallback);
Dll3RV = SetMultipleDiscoveryMode(epdComsHandle, false);
Dll3RV = SetResponseTimeout(epdComsHandle, ResponseTimeout); //initial
step = 4;
SetFunctionReturnValue(fOpenReader, 0);
Dll3RV = OpenReader(epdComsHandle, comPort); //-6 = r_OperationFailed
@ -311,8 +334,6 @@ DWORD Epd3Base::Epd3U::StartCom()
{
step = 7;
CommsInitialized = 1;
Dll3RV = SetMultipleDiscoveryMode(epdComsHandle, false);
Dll3RV = SetResponseTimeout(epdComsHandle, ResponseTimeout);
EPDStepResult = EpdStepResults::OK;
}
}
@ -377,8 +398,8 @@ int Epd3Base::Epd3U::StartDiscover(int tokentimeout)
DeviceIDs[0] = 768;
return 0;
}
Dll3RV = SetConnectCallback(epdComsHandle, connectcallback);
Dll3RV = SetDisconnectCallback(epdComsHandle, disconnectcallback);
//Dll3RV = SetConnectCallback(epdComsHandle, connectcallback);
//Dll3RV = SetDisconnectCallback(epdComsHandle, disconnectcallback);
current = this;
//Dll3RV = SetDiscoveryCacheTimeout(epdComsHandle, tokentimeout);
DeviceCount = 0;
@ -436,7 +457,7 @@ int Epd3Base::Epd3U::OpenDev(DiscoveryId DeviceID)
if (epdComsHandle != nullptr)
{
Dll3RV = Connect3(epdComsHandle, DeviceID, true);
//SetDisconnectCallback(epdComsHandle, disconnectcallback); in startdiscover
OutputDebugStringA("**** Connect EPD ****\n");
}
else {
@ -452,16 +473,22 @@ int Epd3Base::Epd3U::ReConnect()
{
Dll3RV = Connect3(epdComsHandle, Epd, true);
if (Dll3RV) {
DebugWrite("**** Connect3 rv {} ****\n", Dll3RV);
//r_OperationTimeout == -9
incrementError(Dll3RV);
DebugWrite("**** Connect3 rv {} ****\n", Dll3RV); // r_operationtimeout
Sleep(50);
Dll3RV = Connect3(epdComsHandle, Epd, true);
Dll3RV = DisconnectAndConnect();
//Dll3RV = Connect3(epdComsHandle, Epd, true);
}
DebugWrite("**** ReConnect rv {} v {} ****\n", Dll3RV, HardVersionMinor);
DebugWrite("**** ReConnect rv {} v {}.{}.{}.{} ****\n", Dll3RV, HardVersion, HardVersionMinor, HardVersionBuild, HardVersionRevision );
}
else {
OutputDebugStringA("**** ReOpen no epdComsHandle ****\n");
Dll3RV = r_InvalidCommsHandle;
}
if (Dll3RV) {
incrementError(Dll3RV);
}
return Dll3RV;
}
@ -485,9 +512,8 @@ int Epd3Base::Epd3U::DisCon(UINT16 alarm)
ResetEvent(hCompletion);
current = this;
step = 1;
//Dll3RV = SetDisconnectCallback(epdComsHandle, disconnectcallback); //in start
if (alarm) {
DebugWrite("**** DisconnectAndNotify({}) HardVersionMinor: {} ****\n", EndNotifyAlarm, HardVersionMinor);
DebugWrite("**** DisconnectAndNotify({}) HardVersionMinor:{} {} {} {}****\n", EndNotifyAlarm, HardVersion, HardVersionMinor,HardVersionBuild,HardVersionRevision);
/*if (HardVersionMinor > 0) {
SetFunctionReturnValue(TestVibe, 0);
@ -673,15 +699,24 @@ void WINAPI ReadStatusCompletion(CommsHandle hComms, CompletionToken token)
int Epd3Base::Epd3U::ReadStatusOnly()
{
EPDStep = EpdSteps::StepReadStatus;
int rv = 0, rv2;
int rv=0, rv1 = 0, rv2, rv3, rv4;
ResetEvent(hCompletion);
SetFunctionReturnValue(eFunctions::ReadStatus, 0);
current->StatusDecoded = false;
if (!isConnected) rv = ReConnect();
if (!isConnected) rv1 = ReConnect();
if (!rv1) {
}
token = BeginReadStatus(epdComsHandle, nullptr);
rv = CommitAndSetRV();
rv = EndReadStatus(epdComsHandle, token, &epd3status);
rv2 = SetEndReturnValue(rv);
rv2 = CommitAndSetRV();
if (!rv1) {
}
rv3 = EndReadStatus(epdComsHandle, token, &epd3status);
if (!rv3) {
}
rv4 = SetEndReturnValue(rv3);
return rv;
}
/// <summary>
@ -701,7 +736,7 @@ int Epd3Base::Epd3U::ReadStatus(bool onlyStatus)
countsRead = 0; utc = 0; seconds = 0;
memset(WearerID, 0, WearerIDLength + 1);
memset(WearerName, 0, WearerNameLength + 1);
//rv = SetResponseTimeout(epdComsHandle, ResponseTimeout);
Error = 0;
if (port == 0) {
EpdID = 4567;
@ -723,7 +758,7 @@ int Epd3Base::Epd3U::ReadStatus(bool onlyStatus)
IssueCount = OtherAlarms = EEPROMBadSectors = 0;
RealTime = EpdClock = OffTime = EpdID = 0;
ErrorSource = ErrorReason = ErrorData = 0;
HardVersion = HardVersionMinor = SoftVersion = FunctionFlags = 0;
HardVersion = HardVersionMinor = HardVersionBuild = HardVersionRevision = SoftVersion =SoftVersionMinor = SoftVersionBuild = SoftVersionPatch = FunctionFlags = 0;
memset(&epd3status, 0, sizeof(StatusData_t));
@ -800,9 +835,14 @@ int Epd3Base::Epd3U::ReadStatus(bool onlyStatus)
isNG = (EpdType == EpdTypes::Mk2Neutron) || (EpdType == EpdTypes::Mk3Neutron);
HardVersion = MarkNumber.Major;
HardVersionMinor = MarkNumber.Minor;
SoftVersion = VersionNumber.Major;
VersionOK = true;
HardVersionBuild = MarkNumber.Build;
HardVersionRevision = MarkNumber.Revision;
SoftVersion = VersionNumber.Major;
SoftVersionMinor = VersionNumber.Minor;
SoftVersionPatch = VersionNumber.Patch ;
SoftVersionBuild = VersionNumber.Build;
VersionOK = true;
step = 4;
EPDStep = EpdSteps::StepReadCounts;
@ -1513,10 +1553,12 @@ WORD Epd3Base::Epd3U::PrepareForIssue()
EPDSubStep = 5;
EPDStepResult = EpdStepResults::OK;
OutputDebugStringA("**** After clear ****\n");
//if (isConnected && epdComsHandle) Disconnect(epdComsHandle);
if (isConnected && epdComsHandle) Disconnect(epdComsHandle);
isConnected = false;
Sleep(SleepAfterClear);
if (progressCallback) progressCallback(EPDStep, EPDStepResult);
Sleep(SleepAfterClear);
return rv;
error:
@ -1543,7 +1585,7 @@ WORD Epd3Base::Epd3U::ReadAlarmTresholds() {
uint8_t measID;
uint32_t r;
//SetResponseTimeout(epdComsHandle, ResponseTimeout);
if (isNeutron) measID = (uint8_t)MeasurementId::Meas_Hp10N; else measID = (uint8_t)MeasurementId::Meas_Hp07;
hp07tresholds.MeasId = measID;
@ -1687,7 +1729,14 @@ WORD Epd3Base::Epd3U::WriteWearer() {
SetFunctionReturnValue(eFunctions::WriteWearerId,0);
token = BeginWriteWearerId(epdComsHandle, mk3WearerID, nullptr);
r = CommitAndEnd2RV(EndWriteWearerId, token);
//r = Commit3(epdComsHandle); SetCommitReturnValue(r); r = EndWriteWearerId(epdComsHandle, token); SetEndReturnValue(r);
if (r) {
incrementError(r);
ReConnect();
SetFunctionReturnValue(eFunctions::WriteWearerId, 0);
token = BeginWriteWearerId(epdComsHandle, mk3WearerID, nullptr);
r = CommitAndEnd2RV(EndWriteWearerId, token);
}
if (r != 0)
goto error;
@ -1698,7 +1747,14 @@ WORD Epd3Base::Epd3U::WriteWearer() {
SetFunctionReturnValue(eFunctions::WriteWearerId,0);
token = BeginWriteWearerId(epdComsHandle, mk3WearerID, nullptr);
r = CommitAndEnd2RV(EndWriteWearerId, token);
//r = Commit3(epdComsHandle); SetCommitReturnValue(r); r = EndWriteWearerId(epdComsHandle, token); SetEndReturnValue(r);
if (r) {
incrementError(r);
ReConnect();
SetFunctionReturnValue(eFunctions::WriteWearerId, 0);
token = BeginWriteWearerId(epdComsHandle, mk3WearerID, nullptr);
r = CommitAndEnd2RV(EndWriteWearerId, token);
}
if (r != 0)
goto error;
@ -1984,13 +2040,13 @@ int Epd3Base::Epd3U::IssueAndCheck(float gain, float ChirpRate)
rv = ReConnect();
rv = ReadStatusOnly();
if (rv)
/*if (rv)
rv2=1;
wrv= WaitForSingleObject(hCompletion, 2000);
if (wrv == WAIT_OBJECT_0) rv = 0;
else if (wrv == WAIT_TIMEOUT) {
rv = 1;
}
}*/
//rv1 = StepReturnValues[CurrentStep][1];
//rv2 = StepReturnValues[CurrentStep][2];
@ -2001,9 +2057,8 @@ int Epd3Base::Epd3U::IssueAndCheck(float gain, float ChirpRate)
float kx = gain/100;
rv = ReadCal();
if (rv != 0 ) { //K6 test op 1310 || K6 != 1310 ??
rv = 1;
EPDStepResult = EpdStepResults::Error;
goto error;
@ -2062,7 +2117,7 @@ int Epd3Base::Epd3U::WriteConfig(void)
int32_t r = 0;
ECLen = 32;
DebugWrite("**** WriteCfg v {}.{} ****\n", HardVersion, HardVersionMinor);
DebugWrite("**** WriteCfg v {}.{} {} {} ****\n", HardVersion, HardVersionMinor, HardVersionBuild, HardVersionRevision);
if (!isConnected) r = ReConnect();
// Become admin
SetFunctionReturnValue(eFunctions::WriteAccessLevelAdmin,0);

View file

@ -27,6 +27,7 @@
#define DiagnosticsWriteSize 256
namespace Epd3Base {
enum eFunctions {
ReadSensitivities,
ReadGains,
@ -97,6 +98,11 @@ namespace Epd3Base {
WORD DeviceCount = 0;
DWORD DeviceIDs[10];
int32_t StepReturnValues[MaxSteps][4];
int16_t errorm009 = 0; //error -9 r_OperationTimeout
int16_t errorm007 = 0; //error -7 r_InvalidState
int16_t errorm102 = 0; //error -102 r_InsufficientPriv
int16_t errorm202 = 0; //error -202 r_ErrorNotConnected
int16_t error_other = 0; //other errors
int CurrentStep;
BYTE HasStepError = 0;
@ -207,8 +213,8 @@ namespace Epd3Base {
//Identification
DWORD EpdID = 0;
WORD HardVersion, HardVersionMinor;
WORD SoftVersion;
WORD HardVersion, HardVersionMinor, HardVersionBuild, HardVersionRevision;
WORD SoftVersion, SoftVersionMinor, SoftVersionBuild, SoftVersionPatch;
WORD FunctionFlags;
DWORD EpdClock;
@ -406,6 +412,8 @@ namespace Epd3Base {
WORD PrepareForIssue();
private:
int WriteConfig(void);
void resetErrors();
void incrementError(int rv);
void ResetStepReturnValues();
public:

View file

@ -9,12 +9,14 @@ void EpdBaseClr::Epd2::OnCancelRequested()
{
if (epd3 != nullptr) epd3->CancelAll();
if (epd != nullptr) epd->CancelAll();
}
bool EpdBaseClr::Epd2::HasStepError()
{
return (bool)epd3->HasStepError;
}
int EpdBaseClr::Epd2::SetEndNotifyAlarm(UInt16 NotifyAlarm, UINT16 NotifyAlarmDuration)
{
if (epd3) {
@ -50,6 +52,21 @@ int EpdBaseClr::Epd2::GetSteps()
return nsteps;
}
int EpdBaseClr::Epd2::GetErrors()
{
if (epd3->errorm009 > 0 || epd3->errorm007 > 0 || epd3->errorm102 > 0 || epd3->errorm202 > 0 || epd3->error_other > 0) {
ErrorReturnValues = gcnew System::Collections::Generic::Dictionary<int, int>(5);
ErrorReturnValues->Add(-9, epd3->errorm009);
ErrorReturnValues->Add(-7, epd3->errorm007);
ErrorReturnValues->Add(-102, epd3->errorm102);
ErrorReturnValues->Add(-202, epd3->errorm202);
ErrorReturnValues->Add(-999, epd3->error_other);
}
else if (ErrorReturnValues != nullptr) ErrorReturnValues->Clear();
return 1;
}
void EpdBaseClr::Epd2::OnProgress(EpdSteps step, EpdStepResults result)
{
// Handle the progress info here (e.g., print or log it)
@ -270,6 +287,11 @@ int EpdBaseClr::Epd2::AfterGetStatus(EpdBase::Epd2U *epd)
HardVersion = epd->HardVersion / 100;
HardVersionMinor = epd->HardVersion % 100;
SoftVersion = epd->SoftVersion;
int VersionMajor = 1;
int VersionMinor = 5;
// Formats as "1.5"
FirmwareVersion = String::Format("{0}", epd->SoftVersion);
FunctionFlags = epd->FunctionFlags;
CountsClock = epd->EpdClock;
DecodeStatus(epd);
@ -301,6 +323,7 @@ int EpdBaseClr::Epd2::AfterGetStatus(Epd3Base::Epd3U* epd)
FunctionFlags = epd->FunctionFlags;
CountsClock = epd->EpdClock;
//hier nodig ?
FirmwareVersion = String::Format("{0}.{1}.{2}.{3}", epd->SoftVersion, epd->SoftVersionMinor,epd->SoftVersionPatch,epd->SoftVersionBuild);
DecodeStatus( epd); // zet hasAlarm
return 0;
}

View file

@ -294,6 +294,7 @@ namespace EpdBaseClr {
unsigned int EpdID ;
int HardVersion, HardVersionMinor;
int SoftVersion ;
String^ FirmwareVersion;
int FunctionFlags ;
unsigned short BatADC;
@ -355,6 +356,7 @@ namespace EpdBaseClr {
//int StepReturnMax;
//array<cStepValues^> StepReturnValues;
System::Collections::Generic::List<cStepValues^>^ StepReturnValues;
System::Collections::Generic::Dictionary<int, int>^ ErrorReturnValues ;
int SetFeedbackSound(byte sound, UINT16 sound3);
@ -404,6 +406,7 @@ namespace EpdBaseClr {
int IssueAndCheck(float gain, float ChirpRate, bool WriteConfig);
int GetSteps();
int GetErrors();
bool HasStepError();
int SetEndNotifyAlarm(UInt16 NotifyAlarm, UINT16 NotifyAlarmDuration);

View file

@ -7,7 +7,7 @@
#define VERSION_REVISION 0
// Strings voor de tekstuele weergave
#define VERSION_STRING "3.5.0.0"
#define VERSION_STRING "3.6.0.0"
#define COPYRIGHT_STRING "Copyright (c) 2019-2026 LSW-Tech Luc Vandenbroucke"
#define COMPANY_STRING "LSW-Tech"
#define PRODUCT_STRING "EpdBaseClr"

View file

@ -103,6 +103,7 @@ namespace eDosStation
case -201: rv = "r_ErrorNotProcessed"; break; //command not processed due to previous failure
case -202: rv = "r_ErrorNotConnected"; break;
case -203: rv = "r_ErrorUserCancelled"; break;
case -999: rv = "r_Other"; break;
default: rv = rval.ToString(); break;
}
return rv;
@ -128,7 +129,7 @@ namespace eDosStation
public static void logsteps(string module, System.Collections.Generic.List<EpdBaseClr.cStepValues> Lst, cspl spl)
{
if (Lst != null)
if (Lst != null && Lst.Count > 0)
for (int s = 0; s < Lst.Count; s++)
{
string msg = $"{s} {GetName(Lst[s].func)} commit: {Getresult(Lst[s].commitrv)} end : {Getresult(Lst[s].endrv)} ({Lst[s].endrv})";
@ -136,5 +137,16 @@ namespace eDosStation
}
}
public static void logerrors(string module, System.Collections.Generic.Dictionary<int, int> Lst, cspl spl)
{
if (Lst != null && Lst.Count > 0)
foreach (int s in Lst.Keys) {
{
string msg = $"{s} {Getresult(s)} = {Lst[s]}";
spl?.WriteSplunkLog(module, null, Lst[s] ==0 ? cspl.iseverity.info : cspl.iseverity.err, msg);
}
}
}
}
}

View file

@ -349,6 +349,12 @@ namespace eDosStation
if (rv != 0) MessageBox.Show(DecodeResults.decodesteps(ep.StepReturnValues));
DecodeResults.logsteps(module, ep.StepReturnValues, thisStation.splunkLog);
}
if (rv != 0 || thisStation.LogAll || ep.HasStepError()) {
ep.GetErrors();
DecodeResults.logerrors(module, ep.ErrorReturnValues, thisStation.splunkLog);
}
lbHP07.Text = ep.Hp07Name;
lbHP10.Text = ep.Hp10Name;
@ -450,16 +456,35 @@ namespace eDosStation
}
private void GetEPD()
{
const string module = "EntryBadge.getEPD";
const string module = "EntryBadge.GetEPD";
string step = string.Empty;
if (ep == null)
{
thisStation.splunkLog.WriteSplunkLog(module,step, LSWLib.CLog.iseverity.err, lresultMessage: $"ep is null");
return;
}
thisStation.splunkLog.WriteSplunkLog(module,step, LSWLib.CLog.iseverity.info, lresultMessage: $"{ep.EpdID} fw {ep.FirmwareVersion}");
if (thisStation.LogAll || ep.HasStepError())
{
var s = ep.GetSteps();
DecodeResults.logsteps(module, ep.StepReturnValues, thisStation.splunkLog);
var t = ep.GetErrors();
DecodeResults.logerrors(module, ep.ErrorReturnValues, thisStation.splunkLog);
}
if (ep.DeviceCount == 1 && ep.EpdID > 0)
{
statusEPD.Text = "Found Device : writing config";
// thisStation.splunkLog?.WriteSplunkLog(module, "Found EPD", LSWLib.CLog.iseverity.info, lresultMessage: $"EPD {ep.EpdID} Type:{ep.epdType} FW:{ep.FirmwareVersion}");
Dispatcher.InvokeAsync(() => { DoEPD(); });
}
else

View file

@ -156,10 +156,15 @@ namespace eDosStation
EpdVisitID = 0;
if (epdDevice == null) return;
thisStation.splunkLog.WriteSplunkLog(module, null, LSWLib.CLog.iseverity.info, lresultMessage: $"{epdDevice.EpdID} fw {epdDevice.FirmwareVersion}");
if (thisStation.LogAll || epdDevice.HasStepError())
{
var s = epdDevice.GetSteps();
DecodeResults.logsteps(module, epdDevice.StepReturnValues, thisStation.splunkLog);
var t = epdDevice.GetErrors();
if (t>0) DecodeResults.logerrors(module, epdDevice.ErrorReturnValues, thisStation.splunkLog);
}
if (epdDevice == null || !epdDevice.EPDIssued)
@ -228,6 +233,12 @@ namespace eDosStation
epdDevice.GetSteps();
if (rv != 0) MessageBox.Show(DecodeResults.decodesteps(epdDevice.StepReturnValues));
DecodeResults.logsteps(module, epdDevice.StepReturnValues, thisStation.splunkLog);
var t = epdDevice.GetErrors();
if (t > 0)
{
DecodeResults.logerrors(module, epdDevice.ErrorReturnValues, thisStation.splunkLog);
}
}

View file

@ -74,5 +74,5 @@ using System.Windows;
//2026-08-07 3.00 optimized
//2026-08-17 3.01 telerik upgrade, cleanup old files
//2026-08-17 3.03 reconnect,issuewithalarms
[assembly: AssemblyVersion("3.3.8.0")]
[assembly: AssemblyFileVersion("3.3.8.0")]
[assembly: AssemblyVersion("3.3.9.0")]
[assembly: AssemblyFileVersion("3.3.9.0")]

View file

@ -1 +1 @@
02/09/2026 20:48:01,64
03/09/2026 13:12:23,94

View file

@ -208,17 +208,17 @@ exit
# RGlnaUNlcnQsIEluYy4xQTA/BgNVBAMTOERpZ2lDZXJ0IFRydXN0ZWQgRzQgVGlt
# ZVN0YW1waW5nIFJTQTQwOTYgU0hBMjU2IDIwMjUgQ0ExAhAKgO8YS43xBYLRxHan
# lXRoMA0GCWCGSAFlAwQCAQUAoGkwGAYJKoZIhvcNAQkDMQsGCSqGSIb3DQEHATAc
# BgkqhkiG9w0BCQUxDxcNMjYwOTAyMTg0ODEzWjAvBgkqhkiG9w0BCQQxIgQgwGts
# BgkqhkiG9w0BCQUxDxcNMjYwOTAzMTExMjUyWjAvBgkqhkiG9w0BCQQxIgQgwGts
# hmgwg+1No3Bfq4IiEmxiCsjb9Jy7A/l9sT7ewm0wDQYJKoZIhvcNAQEBBQAEggIA
# hYetPLEBYeaJFb/T/xp+jU00TsYm9va8RWXhcXFJSW/D07Nx8qZc0OHsW3Z/yJXV
# /NpYYvfkYkDqtl3TgxmRipM45pYITd48t3pFEJ3XC1RlJ+j663QI9Z07K0ckOsZg
# BvDi/i9GIwKh2qJRWvgsN/bTTVOhM/wSjBRcTd8AOo2Z+iUtvmWtWDRzdCf/+paJ
# dV2vpOutbDiQcHLXXrkSNFWa/4sQ0lWLEP5CGSm/FWgEYz+sFCtt7xPH9fBr/BXW
# AzI5Ar/sGUT3/tTobhiuDGKskj5n2wKe9HpGwtAgvlRiuEBk8RgFR475l7IGa+Cx
# iudDU/G+93QAodMEWuNX2ZNQ9IwIBGMNByFH5CMl0RhYtNC0eFObXiRqbozpOAmP
# LQby4qFTFlFApSESiPXbL7j2naw3uPoOa6QK/bqP7VHx0CkOaudlP7JNfgFPencY
# QEcnOhVXVrgHnUYFrzSzx+iCyjVb3kW/Q1ZoThL6IIhDFiHFCgQGd18ltYdG4D7P
# LokzMFNaAGpkriFyeSAI4sK3fB2QzzLk+CbKxpTCKOZc3KMZaBOlINaNT22dPDLy
# DguhJIzh9R+O4q+gglcMoA4JX18cKQ/G5UOf1QfciNDPXdAQjBxB+xrhYuN/rlGe
# apzAwbmawiyaovhN3Luex6+o2opNW55rbH6B0nWrWuk=
# NuNcTJaodoszSWkFpEdBJlem+R1QClcLkL7+stSu6oKixILsaiUl98LQu0xARXr2
# uQlqGgz1jGYtCAUftA3+9eGv5pM2ipddSCQQDwtg1CZix2liuiYObDomCFhtr7A0
# 1HdwN5hzJQnv2tP5WAK/OmG/qUXSjOOI5Xf/nfkIOYYfeZj1mqee079O55az9oto
# SIspIow+bzddzCuWYknBSgoSAfjdnWhV227RurIXvp6Ab63AmyK6d8D4CS1Oio2A
# suCpFbFStx9fncwH8P/HJzYyqB5Ql+yBg0CbGfD64tnRk4A1VRCgUJV7YTtXNupf
# y3tApn/BpMVMo7/nWawcwKQLeDfoGWqlBDwEhjlDlsmLxrzaOeY+GlZvmZIbi4aj
# /JDHYwFKUCNxtsOMFiiM7KWFxcLKV53j0TGMsWDz1aRsG/wakdXT2CvhuaF/G1L2
# GwAy6r66hpgNjNO27bOjIDExGyswUFNQDofvGnL1ytzjCN3Fbj3D5KOy9JfyrRfe
# XPTP/SCDK4FyuHlV9mxuZUOyo0bsGvJ6c45jgzQpha0PNU1EmQLsohAiq37WHM6h
# umZIXA5Y/JcMICArf5Dok9WeIawsMlFxmsJaS20nI32pbZn0/yy9NJlneAkPQBXX
# m5NTSgK8f3m3AulzQnxViSeIC72pNnjz15opKFLhafQ=
# SIG # End signature block

View file

@ -326,17 +326,17 @@ exit
# RGlnaUNlcnQsIEluYy4xQTA/BgNVBAMTOERpZ2lDZXJ0IFRydXN0ZWQgRzQgVGlt
# ZVN0YW1waW5nIFJTQTQwOTYgU0hBMjU2IDIwMjUgQ0ExAhAKgO8YS43xBYLRxHan
# lXRoMA0GCWCGSAFlAwQCAQUAoGkwGAYJKoZIhvcNAQkDMQsGCSqGSIb3DQEHATAc
# BgkqhkiG9w0BCQUxDxcNMjYwOTAyMTg0ODEzWjAvBgkqhkiG9w0BCQQxIgQgTGPs
# BgkqhkiG9w0BCQUxDxcNMjYwOTAzMTExMjUyWjAvBgkqhkiG9w0BCQQxIgQgTGPs
# FQqQd9/aeqf+k/SnUJpze+872YJTIc/3H1ODCfAwDQYJKoZIhvcNAQEBBQAEggIA
# yTpx3i4sPQ5A2FrxMCwxQgeUiWzUAeLlxfYs3ChYqN2WitQO0Bhuk+u+bg0n26UH
# 62EF4SqLNaUnjm4rDxmRIVAJeRPX5Af65TIlhFRn/5Gnqz9+kHXkY7gdbeslfM2Z
# uOaoA/AaZ3Q9vm0cJht4MOG9YpW/mlUrIfD8R0cMDe82FPJa46B4glfnVpGRuP0y
# wyynMTb2ciWF+BKW6Yx6pMjuBgG3jJ0M0NEmDiyAu5u9gvetqr6QbqTKr3PqMCPV
# 8yGZZpBtttRX2++UW0+k7p7JRfsfZ6HBoSE478g8rTNqM9LELgGmt6NLKgTMwl+1
# 5kTfYqxloQY7KYMT9mp6cdpqBWffanQebnEbBD12PqkMVvxbK6or4aTW8GgTJgUc
# M+P/Ay6PUMfqhDCRqg+wtV1wOlWffqvcwhGhOSwrMBXgnPdm4ZTcJ+O6QbmXPTkV
# KGs/1HcBBcEwSVGE3/IJE2NRlPioZzV5+xwuKmuG34WBiY+6ekLgWpMD+V3Rx8S1
# IDlzVTiCKxhgAM8uBkdHkfCXOA3jach9hYkkDOllyLahwQcOwRzJhtVVD3rN6rtQ
# 3wEY7Su+Utn285wYRVGrRRC9bZwfrEBVhrMLAuLMAyIXkkG+1N+f/2eEmHeWIQA9
# CJt6VWbLP8wxkxFDXWURsQui5asPy6Er7sh6hRhe6YE=
# r3SpDQuigHX+t7efNOKBspol4EpBrrj5PWAHMs4tBQJv519iH9wFOPDQVlDY+qJ4
# xahckV+a1qW0+W0IE/oVNwOHA7mSabQ9u7Uw3pv3s88WSKL5C9VFipvWqJ0p93wa
# u7Lusg3vLyLiph9kluG28AYKBHNeeABrd8o33qZkwokg2JNKhEasCj4ZTNaDhmyo
# W7FoQkJuIJN/RzLFFQfGy72L+jlckE1H7hdxucP0/+Mz5dNtMBrajA3A1DPqGq7Z
# ICn7vzvqgtuvtsLD5rVq7QmUNRfwIvB25PUi/W6YWruA2ZfpDYhCQb6WgekBH440
# Xt9YgnMAp4qEHuY8P5ncYfC7EM4WhjGG6RN9/6H/vQXhlXbj9PEyhEzKrVuItkAF
# m/gdAJq9LLyJp+rcphKXDVIxpnjVU6cjVdnddDq12ENxvftOUC4IwC8k+IlyCU2g
# I59AkiuQh1LMnINviFCvkva7pfVITCaL8xp5iUM31L3ZRl0WHlPb/RsrbfYd0IKX
# tePVzNxPcxt2PvoJ4X2AxN3na7pci83vjI4q+IJCCp9PVRiuYysBzHekATZC6pRm
# j8HW8G5C8x065B5UyS+RmKkmEZm2s4zltpJdGFblUK0R4eODwjl9pPZ0wUHYtw73
# BJZFdKyygfl9b4Cfpu3HB0pqbOXvQuQLH17iURzu2XE=
# SIG # End signature block

View file

@ -329,17 +329,17 @@ exit
# RGlnaUNlcnQsIEluYy4xQTA/BgNVBAMTOERpZ2lDZXJ0IFRydXN0ZWQgRzQgVGlt
# ZVN0YW1waW5nIFJTQTQwOTYgU0hBMjU2IDIwMjUgQ0ExAhAKgO8YS43xBYLRxHan
# lXRoMA0GCWCGSAFlAwQCAQUAoGkwGAYJKoZIhvcNAQkDMQsGCSqGSIb3DQEHATAc
# BgkqhkiG9w0BCQUxDxcNMjYwOTAyMTg0ODEzWjAvBgkqhkiG9w0BCQQxIgQgGtui
# BgkqhkiG9w0BCQUxDxcNMjYwOTAzMTExMjUzWjAvBgkqhkiG9w0BCQQxIgQgGtui
# 82paX11KDIN86kiIL1XH+uGmvG+Fu6AqHv/faOkwDQYJKoZIhvcNAQEBBQAEggIA
# gZK8Kxr/mPqKaRxtTRr4pQ9paKyvzbkLvrttmgoZUL2F6ecMz3paNA+XNjtrFqlo
# JFPFgz5fOHUSqjrMtzDuW0uW+RQ+qhq3dcAwq+b7OQSyvQvHvKRiqngVO5iauIqc
# Lc66yE1wrEMDzNiGZ9NlS3BDsaYpkZcG1aVXf/0HkSnKV3eygR2CWFmpc9e0nnsz
# XDKBx49yIbnUZZz35+1K9YvHSNuU9YkfTb+ToLDhkS1c/5tSZX5/nwCx/dgomdrw
# KOJedJedPO8EWfySO1dQIp2cB6TbFCX/kcYi9UNRtQQivHQIK1jr8O0RrlJtCPIb
# XN56szrUAOpdCl/Nso7H3FXQX8JM67dFkEUex4/rp69u/bwcGJ2276YCnKub0GFP
# ZqSspdmes68jw4rp+KkX3Fy8hf68bSPu0IU1n508mqqlxmBNgfg8bAv0kaIlRQGK
# kOshJz7nVP2BEjzFFHdnoJyNZSnUA/esBrQ2KU1QFl8pJy34/SDcW+c5+K9xkhSz
# KIVXkrGx3T+NBWKvLSfjdI+XaDERZ7X5bbw7HfrfT9XfPULZuzrODviaOQJ/yK45
# kqko0KrCHO48Oh1ppqXG8JapezX0g1D3ER6w+ek4Ac2Pv5ipSrykBUXW9StTwt5d
# POZFDuSu/yMu7j/259ERgvpJnN1F4ayxSe3ASwSkTOM=
# EaQLB1KDPg5SGxkGaMC32sRDEEweBP08TDdvhEkDmvGUv+fcumFVQ0ir/Zj5TX+2
# koEf6POY3C69MmzbQfbs0iDtKUrgDGnhfNEU+/IMXZq8F3BrTCwlOfgTEAKJHmJD
# u+jaflhbZOW/WFpqxFfkhNVZxeqsbvfiMzwYINoGsl82b993c9QLEJk9nv6d5ZcS
# fJ/CAnEXdUvM5EwSwIUXrTlms2ruUi16xK8PP66jWhRg6EaVcfXR/eoBVvTwdZi4
# aStUp5PatYHXXG8TU0QLdtS3/mb5qni2Xbo/QEC5kWC7VnfpxO7DcFWUMydPGdg7
# N6/+HAcfrlISC/ZGvBWUgfHb0zxzLLvkDSvIvBgYdbDimKgG3r11DjUhlmKsI8Vv
# 9Sz8jrx+uRFeEACJ4DfFLcl1AtfDcYEeEuL8XJfCKNQv+Dr/k0n2x3Cl17rIG9IA
# HV6LVQ3Zxqbb0BNMJ3Sl9h74VNwYooMoJlEB9lDoriy/3L0R3Qt55NhWBisITLdc
# QVlt41+GmAXsenRExnaV/irsN2p/Y03kLgMCucQSeEc4SKVIJAsMkeI3sjbB1D8w
# uMChkY+Z6Rjol4gu/sVPeHG6g7PmTQfzpLZI4DnzOTSBRLd1b3o6ODJXQM/A7qiz
# ow52qCBsIjHW3ElD75F/O45IzKts1X5ttcx0vkoA5hc=
# SIG # End signature block

View file

@ -193,17 +193,17 @@ exit
# RGlnaUNlcnQsIEluYy4xQTA/BgNVBAMTOERpZ2lDZXJ0IFRydXN0ZWQgRzQgVGlt
# ZVN0YW1waW5nIFJTQTQwOTYgU0hBMjU2IDIwMjUgQ0ExAhAKgO8YS43xBYLRxHan
# lXRoMA0GCWCGSAFlAwQCAQUAoGkwGAYJKoZIhvcNAQkDMQsGCSqGSIb3DQEHATAc
# BgkqhkiG9w0BCQUxDxcNMjYwOTAyMTg0ODEzWjAvBgkqhkiG9w0BCQQxIgQg6Tgk
# BgkqhkiG9w0BCQUxDxcNMjYwOTAzMTExMjUzWjAvBgkqhkiG9w0BCQQxIgQg6Tgk
# d9vgRJTrKaa/aNqr0ugqtMxl17/Df7q35ywcJSEwDQYJKoZIhvcNAQEBBQAEggIA
# CpS8eVFj0nqMd404Jx0rnDpS2ALR/LeNa3Qy6qgoDeAyjyeIiprcHONa4W3myGcZ
# 3Tr1gEeUxDkjBhU2amYeKFMUVkuSP2lUHdpBQlykwqtyVBt4TzxTZQ4gSsTNBVJT
# Zu7Ljgqu1zirAepEvqwLBOsQ3ugJBWnQHL3QfnZW8dtM6e9oC3jIhE2BY9Llabcs
# WnueqUIct5SSp8Xwf/bjjbzMDJ5WViIGfiHHgvc6k/hRJNXSTbN7e3KPIooLdVFD
# pqGDM2VSnHRitPvHSE/57VGDVya6GUewxlxALl3U3bQKLE2mIFm8r50Ro3DRaue4
# g2sdiNnstrmww5lxCEJymA6Ixg9piUMC4eg9UwfOUqsApC3uuIpMK82v/IJfsNBA
# kBpy29eMGP91rVMmDeRzW0kO/QFPHo5xMkH1mFNBkLENxybdVZ3bRYMyUIA4rAAt
# Y++IfS+MLfSonIs0Iqask/cvLYU+quTOKb+VKo078q8EGFdYsOAe0tLoABtdL/F5
# eLRF1xzJCEQ0nqUVkFYNdBY7pW9h/xwstz/OC8NpMRZY5sdwNB2L58t7t9cAbq+2
# 2v9ozP9odA5SfLpqFoq1JxdrHL7a4/TGFeB4H9529PPqSt6jjyr+ZJ0nrsKprD/n
# w3t4GIC8ghKh0kAMp4/jX+DWdTxnmQQ8nde+hpg0diU=
# tyaGUCGWqWMV8PeXbu3yHvT4lZSWml67+MsfID7dW0/sW80hv20sQ+ZOqxwh2Luy
# 590Na+bdqLlx8HIkdZ1jVMI72Orh86kSv7D2lwpnOplbpyYv63ktDVJJQMzkIOS7
# KEuZf9NjjKpRXg4OemhLdXG6AH7Pv7ECN9AVCIEAyoL6Hm9ZbRYztJyNwOoZyItC
# TjOvoM69AEelwdWRymLMBt7v+H6leukG7UcT709NQtqbY4oZiqt3V/XQrYvl4cLV
# 55gJJ7LA3LFEW7WZ0+sJPTyXhpcyTwZ2JExJSre26eNSSqL6+nG2B5cSwcsdKHkn
# D30+GAPW94sjfz3nBomV29lC2c52GV72VVKZ5z0Sv+vng2DnYNZV5xeTl5GPmDQ2
# LyPoIQzBmwrvZEvihhrMUeBt0iQb+d4jUxsluLFDRHhTvAYqX0cAxmd7C9cJAosO
# dP9iN1Czb96NLkkl5u5nppJqodqj3jnXuSkQECmkcj1sq/JicxwydFJu29FYiyud
# EmURQrvWbRNABm/e8SoPv5y467nEWmh7ilLb1CoRWgABxeRTnpU+BvYjsflUNFv/
# UChDj4sBMGluvRMPnFH7biVkpRYsw/6B6WRphxjMV8YgauyHq8CkPAxdbovUyIOl
# PJxWg50AbqWcFZMNGeHLDbjh4JmHH/zlN8e3Ix9THGc=
# SIG # End signature block