From 4f776e714b27f65dff76decda160a4f50ddfa64c Mon Sep 17 00:00:00 2001 From: Ingo Huerner Date: Tue, 29 Apr 2014 09:42:54 +0200 Subject: [PATCH] Added use of default data for files; added test data that can be used by PAS installation process; started to implement persclient_tools; updates after interface review --- Makefile.am | 2 +- configure.ac | 1 + include/persistence_client_library.h | 29 +++++-- include/persistence_client_library_error_def.h | 11 ++- include/persistence_client_library_file.h | 2 +- include/persistence_client_library_key.h | 5 -- persclient_tool/Makefile.am | 14 +++ persclient_tool/persistence_client_tool.c | 94 +++++++++++++++++++++ src/persistence_client_library.c | 10 +-- src/persistence_client_library_data_organization.c | 9 +- src/persistence_client_library_data_organization.h | 14 ++- src/persistence_client_library_db_access.c | 16 ++-- src/persistence_client_library_dbus_cmd.c | 22 +++-- src/persistence_client_library_file.c | 39 ++++++++- src/persistence_client_library_prct_access.c | 7 +- test/data/Data.tar.gz | Bin 58780 -> 37294 bytes test/data/PAS_data.tar.gz | Bin 0 -> 4615 bytes test/persistence_client_library_test.c | 70 +++++---------- 18 files changed, 251 insertions(+), 94 deletions(-) create mode 100644 persclient_tool/Makefile.am create mode 100644 persclient_tool/persistence_client_tool.c create mode 100644 test/data/PAS_data.tar.gz diff --git a/Makefile.am b/Makefile.am index c36060a..6435d05 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,4 +1,4 @@ -SUBDIRS=src +SUBDIRS=src persclient_tool if WANT_TESTS SUBDIRS+=test diff --git a/configure.ac b/configure.ac index 3e68985..92a4483 100644 --- a/configure.ac +++ b/configure.ac @@ -154,6 +154,7 @@ AM_CONDITIONAL(DEBUG, test x"$debug" = x"true") AC_CONFIG_FILES([Makefile persistence_client_library.pc src/Makefile + persclient_tool/Makefile test/Makefile]) AC_OUTPUT diff --git a/include/persistence_client_library.h b/include/persistence_client_library.h index 29bbcb1..1e6b085 100644 --- a/include/persistence_client_library.h +++ b/include/persistence_client_library.h @@ -20,11 +20,11 @@ * \par change history * Date Author Version * 25/06/13 Ingo Hürner 1.0.0 - Rework of Init functions - * 04/11/13 Ingo Hürner 2.0.0 - Added define for shutdown type none + * 04/11/13 Ingo Hürner 1.3.0 - Added define for shutdown type none * */ /** \ingroup GEN_PERS */ -/** \defgroup PERS_CLIENT Client: initialisation access +/** \defgroup PERS_CLIENT Client: initialization access * \{ */ /** \defgroup PERS_CLIENT_INTERFACE API document @@ -44,21 +44,29 @@ extern "C" { /** \} */ -/** \defgroup PCL_OVERALL functions for Library Initialisation - * The following functions have to be called to allow intialisation of the internal interfaces. +/** \defgroup SHUTDOWN_TYPE notifications type definitions + * according to Node State Manager Component * \{ */ -#define PCL_SHUTDOWN 1 /// trigger shutdown -#define PCL_SHUTDOWN_CANEL 0 // cancel shutdown - #define PCL_SHUTDOWN_TYPE_FAST 2 /// Client registered for fast lifecycle shutdown #define PCL_SHUTDOWN_TYPE_NORMAL 1 /// Client registered for normal lifecycle shutdown #define PCL_SHUTDOWN_TYPE_NONE 0 /// Client does not register to lifecycle shutdown +/** \} */ + + +/** \defgroup PCL_OVERALL functions for Library initialization + * The following functions have to be called for library initialization + * \{ + */ + + +#define PCL_SHUTDOWN 1 /// trigger shutdown +#define PCL_SHUTDOWN_CANEL 0 /// cancel shutdown /** - * @brief initalize client library. + * @brief initialize client library. * This function will be called by the process using the PCL during startup phase. * * @attention This function is currently N O T part of the GENIVI compliance specification @@ -96,6 +104,11 @@ int pclDeinitLibrary(void); * @attention This function is currently N O T part of the GENIVI compliance specification * @attention In order to prevent misuse of this function the cancel shutdown request * can only be called 3 times per lifecycle. + * If this function has been called by an application more then 3 times the application + * will not be able to store it's data anymore during the current lifecycle. + * The application isn't fully operable in this lifecycle anymore. + * In the next lifecycle the application can store data again until the limit above + * has been reached. * * @parm PCL_SHUTDOWN for write back data when shutdown is requested, * and PCL_SHUTDOWN_CANEL when shutdown cancel request has been received. diff --git a/include/persistence_client_library_error_def.h b/include/persistence_client_library_error_def.h index d8de109..e88efa5 100644 --- a/include/persistence_client_library_error_def.h +++ b/include/persistence_client_library_error_def.h @@ -16,8 +16,13 @@ * @ingroup Persistence client library * @author Ingo Huerner * @brief Error definition header - * @see + * + * @par change history + * Date Author Version + * 29/04/14 Ingo Huerner 1.0.0 - Added cancel shutdown errors + * */ + /** \ingroup GEN_PERS */ /** \defgroup PERS_GEN_ERROR Client Library: Generic errors * \{ @@ -108,9 +113,9 @@ extern "C" { /// write to requested resource failed, read only resource #define EPERS_RESOURCE_READ_ONLY (-39) /// max numbers of cancel shutdown exceeded -#define EPERS_SHTDWN_MAX_CANCEL (-40) +#define EPERS_SHUTDOWN_MAX_CANCEL (-40) /// not permitted to use this function -#define EPERS_SHTDWN_NO_PERMIT (-42) +#define EPERS_SHUTDOWN_NO_PERMIT (-42) #ifdef __cplusplus } diff --git a/include/persistence_client_library_file.h b/include/persistence_client_library_file.h index 2cdbccd..e116dd6 100644 --- a/include/persistence_client_library_file.h +++ b/include/persistence_client_library_file.h @@ -216,7 +216,7 @@ int pclFileCreatePath(unsigned int ldbid, const char* resource_id, unsigned int * ::EPERS_LOCKFS or ::EPERS_COMMON * If ::EPERS_COMMON will be returned errno will be set. */ -int pclFileReleasePath(int pathPandle); +int pclFileReleasePath(int pathHandle); /** \} */ diff --git a/include/persistence_client_library_key.h b/include/persistence_client_library_key.h index 52e4aa6..46d0e8c 100644 --- a/include/persistence_client_library_key.h +++ b/include/persistence_client_library_key.h @@ -71,15 +71,10 @@ typedef struct _pclNotification_s unsigned int seat_no; /// seat id } pclNotification_s; -/** \defgroup SHUTDOWN_TYPE shutdown notification type definitions - * according to Node State Manager component - * \{ - */ /** \} */ -/** \} */ /** definition of the change callback * diff --git a/persclient_tool/Makefile.am b/persclient_tool/Makefile.am new file mode 100644 index 0000000..43de4a7 --- /dev/null +++ b/persclient_tool/Makefile.am @@ -0,0 +1,14 @@ +AUTOMAKE_OPTIONS = foreign + +if DEBUG +AM_CFLAGS =$(DEPS_CFLAGS) $(CHECK_CFLAGS) -g +else +AM_CFLAGS = $(DEPS_CFLAGS) $(CHECK_CFLAGS) +#AM_CFLAGS = -fprofile-arcs -ftest-coverage $(DEPS_CFLAGS) $(CHECK_CFLAGS) +endif + +noinst_PROGRAMS = persistence_client_tool + +persistence_client_tool_SOURCES = persistence_client_tool.c +persistence_client_tool_LDADD = $(DEPS_LIBS) + diff --git a/persclient_tool/persistence_client_tool.c b/persclient_tool/persistence_client_tool.c new file mode 100644 index 0000000..7e35113 --- /dev/null +++ b/persclient_tool/persistence_client_tool.c @@ -0,0 +1,94 @@ +/****************************************************************************** + * Project Persistency + * (c) copyright 2012 + * Company XS Embedded GmbH + *****************************************************************************/ +/****************************************************************************** + * This Source Code Form is subject to the terms of the + * Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed + * with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +******************************************************************************/ + /** + * @file persistence_client_tool.c + * @ingroup Persistence client library test tool + * @author Ingo Huerner + * @brief Persistence Client Library Test Tool + * @see + */ + + +#include +#include +#include + + +#define PCLT_VERSION "0.1" + + +void printHelp(); + + + +int main(int argc, char *argv[]) +{ + int opt; + + while ((opt = getopt(argc, argv, "hv")) != -1) + { + switch (opt) { + case 'h': + printHelp(); + break; + case 'v': + printf("Version: %s\n", PCLT_VERSION); + break; + default: /* '?' */ + fprintf(stderr, "Usage: %s [-t nsecs] [-n] name\n", argv[0]); + printHelp(); + exit(EXIT_FAILURE); + } + } + + return 0; +} + + + +void printHelp() +{ + printf("Usage: persclient_tool [-o ] [-a ] [-r ] [-l ]\n"); + printf(" [-u ] [-s ] [-f ] [-p ] [-H] [-h] [-v]\n"); + + printf("\n"); + printf("-o, --option= The possible actions are:\n"); + printf(" readkey - read out the given key\n"); + printf(" writekey - write something to a key\n"); + printf(" deletekey - delete a key\n"); + printf(" getkeysize - get the size of a key\n"); + printf("-a, --appname= The Application Name used for the initialization of the PCL\n"); + printf("-f, --file= The file for data import or export\n"); + printf("-p, --payload= The data to be written to a key if no file is specified as source.\n"); + printf("-r, --resource_id= The resource ID is the name of the key to process\n"); + printf("-l, --ldbid= Logical Database ID in hex notation! e.g. 0xFF. If not specified the default value '0xFF' is used\n"); + printf("-u, --user_no= The user number. If not specified the default value '0' is used\n"); + printf("-s, --seat_no= The seat number. If not specified the default value '0' is used\n"); + printf("-H, --forcehexdump Force print out a HexDump of the written/read data\n"); + printf("-h, --help Print help message\n"); + printf("-V, --version Print program version\n"); + + printf("\n"); + printf("Examples:\n"); + printf("1.) Read a Key and show value as HexDump:\n"); + printf(" persclient_tool -o readkey -a MyApplication -r MyKey optional parameters: [-l 0xFF -u 0 -s 0]\n"); + printf("2.) Read a Key into a file:\n"); + printf(" persclient_tool -o readkey -a MyApplication -r MyKey -f outfile.bin optional parameters: [-l 0xFF -u 0 -s 0 -H]\n"); + printf("3.) Write a Key and use the as the data source.:\n"); + printf(" persclient_tool -o writekey -a MyApplication -r MyKey -p 'Hello World' optional parameters: [-l 0xFF -u 0 -s 0 -H]\n"); + printf("4.) Write a Key and use a file as the data source.:\n"); + printf(" persclient_tool -o writekey -a MyApplication -r MyKey -f infile.bin optional parameters: [-l 0xFF -u 0 -s 0 -H]\n"); + printf("5.) Get the size of a key [bytes]:\n"); + printf(" persclient_tool -o getkeysize -a MyApplication -r MyKey optional parameters: [-l 0xFF -u 0 -s 0]\n"); + printf("6.) Delete a key:\n"); + printf(" persclient_tool -o deletekey -a MyApplication -r MyKey optional parameters: [-l 0xFF -u 0 -s 0]\n"); +} + diff --git a/src/persistence_client_library.c b/src/persistence_client_library.c index dead553..46e6722 100644 --- a/src/persistence_client_library.c +++ b/src/persistence_client_library.c @@ -225,7 +225,7 @@ int pclDeinitLibrary(void) } } - process_prepare_shutdown(Shutdown_Full); // close all db and fd's and block access + process_prepare_shutdown(Shutdown_Full); // close all db's and fd's and block access // end dbus library bContinue = 0; @@ -266,7 +266,7 @@ int pclLifecycleSet(int shutdown) { if(PCL_SHUTDOWN) { - process_prepare_shutdown(Shutdown_Partial); // close all db and fd's and block access + process_prepare_shutdown(Shutdown_Partial); // close all db's and fd's and block access } else if(PCL_SHUTDOWN_CANEL) { @@ -276,7 +276,7 @@ int pclLifecycleSet(int shutdown) } else { - rval = EPERS_SHTDWN_MAX_CANCEL; + rval = EPERS_SHUTDOWN_MAX_CANCEL; } } else @@ -286,10 +286,10 @@ int pclLifecycleSet(int shutdown) } else { - rval = EPERS_SHTDWN_NO_PERMIT; + rval = EPERS_SHUTDOWN_NO_PERMIT; } -return rval; + return rval; } diff --git a/src/persistence_client_library_data_organization.c b/src/persistence_client_library_data_organization.c index 4ea78db..81d7d6d 100644 --- a/src/persistence_client_library_data_organization.c +++ b/src/persistence_client_library_data_organization.c @@ -37,13 +37,14 @@ const char* gWt = "/wt.itz"; const char* gCached = "/cached.itz"; -/// directory structure node name defintion +/// directory structure node name definition const char* gNode = "/node"; -/// directory structure user name defintion +/// directory structure user name definition const char* gUser = "/user/"; -/// directory structure seat name defintion +/// directory structure seat name definition const char* gSeat = "/seat/"; - +/// default data folder name definition +const char* gDefDataFolder = "/defaultData/"; /// cached path location #define CACHEPREFIX "/Data/mnt-c/" diff --git a/src/persistence_client_library_data_organization.h b/src/persistence_client_library_data_organization.h index 22852b5..f6c8144 100644 --- a/src/persistence_client_library_data_organization.h +++ b/src/persistence_client_library_data_organization.h @@ -105,7 +105,7 @@ enum _PersistenceConstantDef Shutdown_MaxCount = 3, /// max number of shutdown cancel calls NsmShutdownNormal = 1, /// lifecycle shutdown normal - NsmErrorStatus_OK = 1, /// lifecycle return OK idicator + NsmErrorStatus_OK = 1, /// lifecycle return OK indicator NsmErrorStatus_Fail = -1, /// lifecycle return failed indicator ChecksumBufSize = 64, /// max checksum size @@ -163,16 +163,22 @@ extern const char* gCached; extern const char* gWt; -/// directory structure node name defintion +/// directory structure node name definition extern const char* gNode; -/// directory structure user name defintion +/// directory structure user name definition extern const char* gUser; -/// directory structure seat name defintion +/// directory structure seat name definition extern const char* gSeat; +/// default data folder name definition +extern const char* gDefDataFolder; + +/// path for the backup location extern const char* gBackupPrefix; +/// size of cached prefix string extern const int gCPathPrefixSize; +/// size of write through prefix string extern const int gWTPathPrefixSize; /// path prefix for local cached database: /Data/mnt_c// diff --git a/src/persistence_client_library_db_access.c b/src/persistence_client_library_db_access.c index 5ecbfac..a102607 100644 --- a/src/persistence_client_library_db_access.c +++ b/src/persistence_client_library_db_access.c @@ -619,16 +619,20 @@ int pers_send_Notification_Signal(const char* key, PersistenceDbContext_s* conte void pers_rct_close_all() { - int i = 0, rval = 0; + int i = 0; // close open persistence resource configuration table for(i=0; i< PrctDbTableSize; i++) { - rval = persComRctClose(i); - if (rval != 0) - { - DLT_LOG(gPclDLTContext, DLT_LOG_ERROR, DLT_STRING("process_prepare_shutdown => failed to close db:"), DLT_INT(rval)); - } + if(gResource_table[i] != 0) + { + if(persComRctClose(i) != 0) + { + DLT_LOG(gPclDLTContext, DLT_LOG_ERROR, DLT_STRING("process_prepare_shutdown => failed to close db => index:"), DLT_INT(i)); + } + + gResource_table[i] = 0; + } } } diff --git a/src/persistence_client_library_dbus_cmd.c b/src/persistence_client_library_dbus_cmd.c index 56ca999..f410e75 100644 --- a/src/persistence_client_library_dbus_cmd.c +++ b/src/persistence_client_library_dbus_cmd.c @@ -179,17 +179,27 @@ void process_prepare_shutdown(int complete) // flush open files to disk for(i=0; i 0) + if(complete == Shutdown_Full) + { + rval = close(i); + } + else if(complete == Shutdown_Partial) { - rval = close(tmp); + fsync(i); } #endif if(rval == -1) diff --git a/src/persistence_client_library_file.c b/src/persistence_client_library_file.c index 2bf14bf..8d433b1 100644 --- a/src/persistence_client_library_file.c +++ b/src/persistence_client_library_file.c @@ -212,10 +212,47 @@ int pclFileOpen(unsigned int ldbid, const char* resource_id, unsigned int user_n if(handle == -1 && errno == ENOENT) // file does not exist, create file and folder { - if( (handle = pclCreateFile(dbPath)) == -1) + + if((handle = pclCreateFile(dbPath)) == -1) { DLT_LOG(gPclDLTContext, DLT_LOG_ERROR, DLT_STRING("pclFileOpen: error => failed to create file: "), DLT_STRING(dbPath)); } + else + { + // check if there is default data available + char pathPrefix[DbPathMaxLen] = {0}; + char defaultPath[DbPathMaxLen] = {0}; + int defaultHandle = -1; + + // create path to default data + if(dbContext.configKey.policy == PersistencePolicy_wc) + { + snprintf(pathPrefix, DbPathMaxLen, gLocalCachePath, gAppId); + } + else if(dbContext.configKey.policy == PersistencePolicy_wt) + { + snprintf(pathPrefix, DbPathMaxLen, gLocalWtPath, gAppId); + } + + snprintf(defaultPath, DbPathMaxLen, "%s%s%s", pathPrefix, gDefDataFolder, resource_id); + printf("=> => => => defaultPath: %s => resourceID: %s\n", defaultPath, resource_id); + + defaultHandle = open(defaultPath, O_RDONLY); + if(defaultHandle != -1) // check if default data is available + { + // copy default data + struct stat buf; + memset(&buf, 0, sizeof(buf)); + + fstat(defaultHandle, &buf); + sendfile(handle, defaultHandle, 0, buf.st_size); + close(defaultHandle); + } + else + { + printf(" = = = = Failed to open file: %d => %s\n", defaultHandle, strerror(errno)); + } + } } if(handle < MaxPersHandle && handle > 0 ) diff --git a/src/persistence_client_library_prct_access.c b/src/persistence_client_library_prct_access.c index 5fffc3c..d8a0671 100644 --- a/src/persistence_client_library_prct_access.c +++ b/src/persistence_client_library_prct_access.c @@ -119,11 +119,13 @@ int get_resource_cfg_table(PersistenceRCT_e rct, int group) break; } + gResource_table[arrayIdx] = persComRctOpen(filename, 0x00); + DLT_LOG(gPclDLTContext, DLT_LOG_INFO, DLT_STRING("get_resource_cfg_table => filename: "), DLT_STRING(filename), DLT_INT(arrayIdx)); - gResource_table[arrayIdx] = persComRctOpen(filename, 0x00) ; if(gResource_table[arrayIdx] < 0) { - DLT_LOG(gPclDLTContext, DLT_LOG_ERROR, DLT_STRING("get_resource_cfg_table => RCT problem")); + gResourceOpen[arrayIdx] = 0; + DLT_LOG(gPclDLTContext, DLT_LOG_ERROR, DLT_STRING("get_resource_cfg_table => RCT problem"), DLT_INT(gResource_table[arrayIdx] )); } else { @@ -187,6 +189,7 @@ int get_db_context(PersistenceInfo_s* dbContext, const char* resource_id, unsign if(resourceFound == 0) { + DLT_LOG(gPclDLTContext, DLT_LOG_INFO, DLT_STRING("get_db_context => resource in rct table not found: "), DLT_STRING(resource_id) ); // // resource NOT found in resource table ==> default is local cached key // diff --git a/test/data/Data.tar.gz b/test/data/Data.tar.gz index 121ec26798f23fc6deb95474744f27983e5a9b19..0e5e7c9c397cda9d65a178eec4049e65ab32eb9d 100644 GIT binary patch literal 37294 zcmeFad0bOTx(4jral~m6v|CwaaRnQYMP!Ez+CbB45EYO`5P=|z1dx469BH8&1eC}k z5Kur+LI4SyK!{2MvI{X_h+#3Z69R;=BqZlM!S0^vqxQYu?|1L_P2W5Ip`M(obE+zD zRlV=?JoQE)Ve2LhyxqA?f1ahE#>h^jDoz)?=(oX5`B=0Dy_rk8_w7;b(HxaKo4))p z`JHbk;z>-r1Vt`Tzo2)^oxe3I?mYe{%FFLPBA6a!p7|NT$e3!wVzDIq#JJ1kq2l;` zxC>_IAADh%5S4T3%bUqRMf$@L`~JRJEQFxtGuzWnb4gFUaxyd3xrktJm1EE)X_fn< zgQelrQi|W8WgY^Dt#+_}OSS!*x`TvA^$(0Ii|*1AgmOJr$V@4aGZ_6qKwexny|4?D zCrYrEx>bnLP!S=w`QK5?5oD&R59UicBz?uhK^GW9Z1sTqV4e=JOgBWoOHAUys(IE`;UD3Pb zPFpXc%+aehyZ8+TD;%VPIA=le%FoqFGrORj zV!pGYqSyPB5}_=v}3G>O0|*drr-XVzhRSm zqsn+|3bUnLGF~gEtD|kz%gLxsVsA3Lq_f&k`M1S4`M=E)5q}E8mN6zgS$n9sA6Dx{W z1|*u;@|!t{e}&x54nm3FsH~RCSyBAdo7s^&fW^VodmgM%EblRR+RL z|4}!*y)DZ2gxJrfijo>mfF*`9tlo))GQ`P(TtKQOlXQ#5H#EdLDl{vU9{H9$eFJOQ zHHVjZ_aDCV&tJFHqXT~ zOP zx71EZUA?Pd)uG?5iu}E*SZ1q#G1#pAka5^lB)6=1LBh57%CY#{sgyRuJlv$@ za4bW9bK)=}p=JHP(HDwknve!i`g z7`8k=rKedz?}m-+-xlj1fYcA0iJGtbGvvcR{AFWJBfhOQ(ghX5z$$a!_14FcMTXxR z?crf3(Zqp_F7_+E49P?<+q*IQRGNYe4xg|-_lq_AalB>3Ap;Obb+I|;X8*leK1KPs ztxify5gW~)6*wnq&YoUwBHA}*rBdmu{S$k0Z|>{KX|d$NdGJ2phYQSFN+Zp3?htlW z*Gi(s`_^{IbB84G19Fhh{(bpBJOcAAG+ZIfI6{}Z0`PQuYaEvrhSGECVM_6hk6O6z z!WuSKzLFNCYC`#yN*S}4?dE;ISj%*>rT)F1EeUIvq!9T^j_uF=Y!Lz0M-CBM1N4*G z;ZB_^C!+M;qpDZEgV&<=D12|W+bY=g2Me-gM(RS4mXmuzQ7FUgs$B z1v$`7onrGu!`BmBd=Cdf`X1)?zV~3njsvtGA0)|dCjC(6bGLat+j>bKQf?%Y3Cr8I zq`1m`^q1$=m-QOhra7t9YI8`jP5t4px-jt@?k6=TO`-S7hNX?S#%rmho4KKOAY!6S z9OmNepHhC~kl@9j3vl)fVyQ&Lv@ZjWaM`^vqbRvm&His=My|Y{ueYR19T{hr6# z-GsgmNhBqJo4asAIVAFLTUF3Uu~8S!iMASVZ9jAOSmIVlh3w^lUV{8)W{Y-~u`?q1 zgj=PP>Wh*+M)j9EHumlb%O{;V-%q)BG(lGMO`fZkLZ>N?s+!yX=Esp*k>^dT&g)(c zvgj{iwYa^|;;(067Cn(WcI{P>waiy01lsS>-It;8JykI`IgRIP>vuSo5V1oWm8Dkv zyrb#O79Q32-f5BiDR-Dk6MwD5sk10lY;hrNA7q8UUekk4&fzG2D{G&le%x9+r*oxg zWc8GsuNJnIUC#<-e_|CF=>)Ob|KmrHF?EGkCZo z5zcNVd*<1uEMtB_pIX#(D523&hWLTA1OoBA3cmlKhU)O%Ut2q zJr44rR}JkXj$4C)t6Sm@dmqC35x#16yg+kVP8$FiM0Eu-U6fQVD(TS?V74VunX7D& znKvoYE15i$D4547bHjt@uwdMR6_jKy=jBh7H-+O=Y-?Oj_Z)GdS3gmGk=N_@!D7Ed zJyn%Q5Tayq)SM{AB;$HkCe z9Y`ntdlAv(RckB*YXr@Xgt&!xm{o`)+m?}|7J`CLm(^)`A7mDgPxg7oXIj<_ ze3w@nE+_7f{gi1ZuQW#OqOZC}MNo@>Yl|3CavpI0;xc>Mi5DhVT3zy_RMHF`mc=Lj z5kf0byh0~36`qObO|qK{L<3TMBP6qW!V6NxTJ1yid>`_il?t$<8a{{ks$Mr6=*U8P zFngsm(iEM8S?0>-US;biFPS%uDqo%ZzPB5G?d_m6hnw&0nNf3`U2D4el>#GAX z)5FB)MdBt3>+Bdnv$m$5cPX@dMLmWXC%&bAWqFRzAiBWxLItu#-2lsRc+8#oW`Y{k zy`SNF?KQj)g`>iH?r=k&H=T`S1Uq)e}>3{hGW9Q|58slW7It5;Y?*P_=O#iK>( z7#q0!&8U>-w!w&OPq0U#yf%%Q#1y}xqhiDYOl3t#pX_om<~(>Y`r+#FCS54Q@NE3tp`pp%i<$?mU$){$AHk+W2lEm2Wa;HB z`yquxO(?0j*=c?IP!Z%gcw^(6%ZobW?#y-MWq9KkRw4s+$%|3Ifs1Gc;i}2R9oHg^ zE~fI{p?tW(T=1f*?A-S#w2^$QUme*+7x-m&)pqG_pMD&u-P3fi#YIht)evTyis4aw z?yL#Qa&3E>dFjzcD$V3P>+gF5cj`n=y>81~yW;u!be&iK%pn|+8Uk~-EF1KodW}=- z)_OYIE(NVVI#MBuR8eZ(>3jF?)$#ZH)D5e%Fz?lmC`nSWZ~fqdXjA>aQZI9tjx)eg zaXWoi;hkxL6$%o`xQTb1aH<15$E@7cxis^uO`8OZlwhOPrGOfMy<*Wy_cQNVd6+z` zte_^D(4@;vR(Iw}b)$0|sup$;rV*TBRnN|(cOvI^0JlTH%PM_XuPDK zib+hm<;>G8ETA{GYo<;I^IPjf8U2Mw>74d9bBl&jLnWKz4tDzHJXIwhad7s=r9pii{CIfXxK-dyNA3}jc*&uQqaG8afa#^1%(g<0c%5AKx04U?0WvL? z5`6*RhE|l&dK~Q4eL~}!0;)q~BljuAA-OI`G|OIEvMQ3t?sZKx$SVbENvRzVd0Nu2 z(9t$BL%E@KrTR!tYRw^~AF~_oVycCIEit==KnpT?Aowklx-w#$YaA(%uI`Wzh@AV0 z_a62%mT}l_{cmgV8hwXozdGzgykAbC>zh3x7DSYRpI9h&CRtN1TM)#jya?ZK;`Sj> znoswoumU)A0xY_k?&e>VT#s*Yl#AriCU3c&lAJ?@BBhL4h4huA;7tC3%6g)E5%#7vL3g@_bNt<11D9@?KV?#1U$pL7iw^K_r*Sm9-u|AO!SPZ7C$>1I) zvGFgF&DB-bM`xGV4Z89NyPRQiH{lWyL{!l|PAoGh>_N}7?9`vjR*Txb&Hg6en{42_ zve-aja$fjrcNTY9);qu#jUM+^EYk!N@7>wu@NxHiWWUS8%&PUZY~3uT>q`SXVvreo zz-QdDC_T8(TIJTj$~_|`rL4GMEhX9LlQZ!y%y0{W51;_|g+m6(2{fhhzLMHo1RD;kT+(5?5W+4gH2 zJSi$ByDcn>q>G#Ls|ega7bRp-*VnMFkiMy)D#nvwH(!o&8ZamJ8CC-59K8rtVOyaDg_=_l|4aor#Ug zPNYr22WOIw>(08{tJ!bmI8@O8Uv;wIhLn=I|rdI3HFbJN+)^V z7rqgzD$Tf?pY5dmXLZA)O6g9y!;@p~F=|W|RFNCQGZ|b!0x8*>oYJq#`$YE6pt7BE zPYMK#g`v(-CrNoXj!H7oc_MolZFHVEWN8cIz40w%KDt*xcUB*q-Co}j(SZgQQaC_e z!!uTN&T{cEFnfquu+qmu+p16U1)ge0*t}d9BQPFqDoa8EY?53L0LbN*g8z*{`sJ+h zdnimh^3Xys&g7>=AK*`~I@Y3)JM1)_q8Lzg*r|S{_;D}pA>pT|Vv#$RGCu~ze1hJ@ z-2WNkZUGm*;wz^Jd3#C(B}%a%EE?w)JAAsm#a}ZQeJt7l=jjjejYeKs<$nbRiMLY| zZM*PW;T*-)8jr1n%N=fzU}uvO|7y_RJo4Ec;7j7G znETOi@f&Kb<qG_k-(1OzY@UAlP`R!wrgfS%BjewL3>Fq6@^MUBQP-$&{%< zBhau8dP(80;iqteY$iXyk`u?he1W4F<`0-g{~0TBq{pCR&Ekx$(ZS2rjVF+J-j z411?#p$>XjTV$CbWF-FZmm`rgw9Kf6l`&7PXRnrSOJ`_?N2Ns)kJc@0>B&(c}(8@~dIqBxLn zaXuXbG09Dy5xSsBK5z0(vud(dx-mUlklpEd>?hFl=QSE7(K4)-T##;QQ7GiY08PJR zXz3bWXox|LNj%Ky;_X7pUkpPt>5j)XL+3v7-T?>l299nE0@r(>tb|@ua^5i^C)GNC zS^S1fEOY{NmxE||Bu}#eTpwabA%lGVXbIEwHi(H!f}^Oh2Xfax79_h2Xvw3^@|%x| zLMLvvD~OoSExUz10b%b?Kr_96d;$eB9-CH&J|a{UqOP(1XQ%TXeQe$jE;@>t49k9? z*!~82*2qB?h&=1`oM2pX-T-{G3+=7NiV2uNtz1sELKDa(B>vwRRLH>m%Uy;sm^S2G zd7>asR!5It!&hc5=iQf$Qo(c(0J%1EFrAac!4iKiB9qw<_`?8`HU&|+Lsbmtd@k^V++qOo8+i36DZpo zb50de!(<5&m~3W_7W$F#5L25?Tc$yo+=>5Y~5Bt ze=3e2vp8jI0e!9WSXrJYxNPQwYkA8*k#eB_p|y*46^hqyYUqpnEJzJ*D(mcm3ka(h zK^0?ARQEc8uN?98!?xfv`we6_@ctHR?;KwJBuKjNbNATqwadfy2*?jAc5YdVs(dR> z2*hcE@7h49_jWX0_zXgA%YZ!ddJQ$MSKoN+26*T_^-Z}hReS}p22vcMjNc&^8A4)l z@GNv!nAhxtM=kf_=t`9N95YMkflA61wnC0y#TaKou)@g@*4Pxu(`{yU^u&m3n- z=IWq>C4^TVJ^AW+@qdQjtB2E}-y`Ii|NmbOtAHS1vu5Z&G&Nq~JVn)bOY2w=cQ6++ zMll~|lL$C*TEM8sN?u)(>Ms-0q~{3lXo?IQV|d#}5WA-oyDU#8FMERoi`cw)Vbn(^5sa1`IL#F9OEFZQP#m@UY+~J^qimp?$>yX5~Xc zRjoTe-Ry#|Ezn)Z)phi$xyT734-4g2&N9EU*Fb`w&B^PlvV>wKQh-Pp=;XZ z`;vy$Lbx$WqCxnr6%? z>rI^|DJ-^S_6YEM`q9h@(x7FL9iC4tC`K0za0E!T(g%V#fF)pz%z)r!3}OauVx-?v z{EY4wf#MtDDHA|nL6){7j#lMJ`Eo~dm%*3wAbOv-I~oWUX}5J6<^p}*05*6Ajk^a9 z6ve}`hCW?t0??-_@j&nur|3VGd#%dX3nqYNN)8a&l|KQLa!6v5_(!ShT|xXAbVL=0 zgn0v$^_r=8^U+5yHgRDtr{u+*Ir~Pwu~Qu$We05Z}ZC zih*UO@x5IE9QA~_js-o{cY*Q>e# zl@)rXm-$6b%f7c+?C{u7wD{Nh%c-C1>Q9qr&BdVWRCDM?1LK+h2X69QLj)3 zy7HV;>z|!G?e9|eCFQqaJT7#;c-KI~*9#)OG2G;eUd-*`dv{5sH&VF&2qiCdazk-- zD|J)C<2Fg4#`=%h7!TW3XAjkQJs zLwu0%Sm+HK4aHO}AUk#-n$zN-fuVEx^f_U0S3#FrK5pGY2-lZ}B_=3Q_q`7QH3A_b z(DLwAuchOlyb$yRs`vb&|8oWIN7aozfP8h=uf4tHJZE}4dk)lK`H4n8P-ajYvTx zdqJ7wk{Iixr7XAC6%?`=meB+xoHJmo+%>-S0P?ZNNR;WKr zEn7eZE^wY@Wg$3w_)?#+Q=yP>dD-n%4CJ|+oJk-i;ytBKR}-P%nPi#^t)BjzgKnE_jA%jCOF@O>kQ8N`;rp)@(Gi+khsuA z*V96A%9V8;N9}QuG3!m?iI7>bX;beoaSqbTKm6r&79Q!d_^T)^Y-w&(s1z4(MJaJz zervp3x3lnZ!eF5P&nt197tn*g<=ExY!W3Y!-T35p;&ze+Uct}1v4|DhtAB!w-!sQa zh2qB>;tlT);*I)q*F`rw>);0&A)HmsTR`Th1}Q)W_&T1=K|wzI z_vQcW2wb8q7f)FUr8#^+aC(U;5&bKiUHqg`Po4!bH|7BH80r(EQLKK(Y+NKEN>_zY zzknxtC@;=>z4fL~y|v85heR3rRk5nc^76V^~a zh{wI{k#NBu$xUX&ls|g+_=xDj6@$MLv~u9F3BC(Uehpjg8|zR;F0-CE*(l?CaGc=} z9cS+DO-3&ysNIAj&d6Ivb>DzmLqpBiy)h$_3&DvM8M#N}O`!g9R2knw$Q8LLR4Kl( z6^#ouc}dWs^+Q+2X9g?_NpKJLJ-o#jdT)edm@i^#jTo!A(kcGJ_jZp(2VX;_M&_5{ z+3;Q{e}|0E^=tH7LP4GkxosA=aTcJQOQ;sg(Dx+nLFpcrZEB7ZP?n}js-d*Z2!18B z7d*8f)P~}oC@fl58#Z9Xed2`_gmipG;ZDf6cAYFRi0F^GPtQOQT03R~uG~sXFara8 zPf1^Wp}re1I-EwuXkdNA^&o8=5rzE-dRX&9@x6@UPH;I6`zN*iF{qmRdM1D3x3Cby zeDgmD*LJmLe_QbzEl7gdv9NF{+9g<)8e!^^Hg?w2qZXE%ny|LiZE7-f_8Ukm=9kx4 zLRiade+S!4Ilcw6hLYNo`*^>w?LT8V#XWzsMue|fudl7Ql_*QvTYq0mFWxT!c~F=m z|Adev5lS&*|4aP|b`FI+<6r*r*-CfKvG9OS5I2?K5f+yRJlq_HK%DgQ*}JYfU&QnV zeTf*mWFUQ{qM2-J;v^BHwd-dVGpr#)U3`n>HRcAgGxX2MPT9Q>8WH~GF&aKZJ@MW9 zZY<-8Oq|=XBO3h=)e^KEe+tkJuMkbJzmOeTA3T7zy7)jK(lHvORrgFv_BDwzo%0B| z*;=Q~AqDZ-8r^A>M7H;kA!c!9=GPNdsfBdEs*0KvPyul8!}+V4tf0KGZ9cq?--I$f zJ1Jwi^xBT5kMg4+K`=tmiC0`A%mNzmvK|nF&u5< zOx0lG23mQ(O+CGNgZ(0m6;lV_G3e3rRx2oW+t4N4M}AZp=+i#|;amx~)l!k?Iv*We za-QPme-K2TwWXIC-7Z^h0n@H|02_gpt4^9VXs^^rJPTAO*;|s7s5tf5f zA^C{DnJSF3pYvzp@abPAv(DAUzXgHbv+^flHtFC=zX6jRn6U}p{upyPDUIJ0KK!E? zl9aieRK~Lm9;81V7nzSy=0<5AK9PMOYp8krn!MM;rhtAqF-I@bz+b&Q^*S>xVJ98- zB3H7!Lh0+o8Ru8I69q&;izf|~st|kq^}fq8bgd+i_tb=#69tb3q{s2EW|J_sp7ixd zahQN}pBsvtpNi=b0oF&*qI1kSlQ(j+{Ekbk(U|9RL}DZm#u^as#sV#m*#NIURNvlk zIUH0!y$pM^rwUU!?9GWV^nxiooa)vK!VF#UeAB+zU$;guD$^mFG1{VFqDehYh;`ZC z#|`H@+Hf^%xGp}9MF?&lJ0P1xv#c@fKJJ+@8&scte z3E*+a_UF$VGVWs5e9JS$V{KA%OR|86*$t9rxd;;0sM|L5E9BB-X-10jdq%(iYXy!W z6Vz2tiSoKsS>hO1*sT*Goa~bNn3}^%E-t>B;j-5%LIk>+N-j5xVtnWp;f?5&Qqlrd zI1uIJwk*rRQy6O{xfO%(wC$nCNiccw6T0-NvMh9Fm%KWm^?_!lx~B){yng1y=$DML zG)$;-!~OO){&dyLC}6+}ln(McOmb4+dG#v4xbk#s7BOhry(_Bn==34F_DnE_GUQvY zP*GsVteDki`_k7v$K5pyqRva&$JV4`7+ZC|YuC9Jcqd(s)@8W}%FPmH;eNVGOw#@A z?|n6+BOWY(rJAQluNS}E5SxDCE)N4~;(J!!DV2KSSnBAe0Rl$6OK-EDva6;!nI1B-QF_- zbeYToAD8lMp&Ze?j4ySr&(CEn<2z2BfI+Vh@FCZTT8+8q?{^-+V!qys$L-0FPQz4* z6!iprtt9(!x$as8cmCUnFId}P9c_cU=$`Wv1YLabkmY=5=F005(N+*tPU6z}a)r1vr-A;)V!7ie! z{D*$%dGi5LSU>24SOMou7+~XlSef?$9`5Hsx|G_RqA~- zSSdy$8X7eS8QjS`EXy|JG=V4?(Rofb0spcq9$v3hX)j-PL^Slwa;tc z*xtd`5Kx6FKI0D8;fBoHkj`dv9J@x9yIL&kX{_Kn`?BHLW8`TseTDI^xk2WOU)x~M ziMMLD?(>TEUbw<6X<+|W??W^)(-b&Ok zJtxu}lufV_!NQt)Ji)M1wE@?UK?wC|r@IuXh= zp;^Oog12S%w1i7}c6d=6MsjBDdCM!fdg)ntx>dGQdh+E4V0QY9aGvg;E~lj=)6>?pfuo#0dVBmWe z08ax;IxHk#EEZrZ9RRYnHORo71w3|2q?e*SFY>eSm9$d9j9fp-jpve(IFsuf_1D@< ze7h>-K`&1mz^?ZkdGa0I*L*Agq1$1G5+mz?j8oxet|Sf`NC%oZ&$MiBEC> zD-F~FxreX?RKJziBy+nmptsDb(fd{tw~W7TS2bNj4k^m|1}A=l1M*)I12%vif10yF z75afEf|jV<+>kzZ&RP%U@(xh&t1rn;8z2QN{AHwJkOb5z{5h+BnoGj3pfinW;J7*g z3A+Su%vpe*;M@lH$pS8bEd+bTB}_hI@e-n`c0V6AT7Dg8Q96j2?F&&@CliOGDs&%hxxjz= z&>G@|UbkBd2wDI=_q5BP=WZG()t+V!iHbKlkG1|cVc*w*Tq4iQk72^zJQR4)*(#4} zd761X<=!AZsl&1D?$zM@-qjP#gEDu{1tpH1);~p^*;f2_f$2BWoAv&-KPj*~pgS^v z8Tm3mTz^bEE_yHfNW=D&if`g~9k_k{@)Y}U&0g(StHxnmmKSto0 z4=YRU>5mSf3B}(g9iqg!*tD&eXWZ0!`eT-{5JAZiwc9IZM)aYFA z3@|J2*aI~GF>X(vENwHqAMFXw90VTDpG4-C0ID^Dns?zd=rf{XC&E3?^92!Zs&@W{ zJ?a+$W&|;GaBYp_0^9A*VWT6ChAylP&2xa>=aS-ij>F07bB?dsFk-MuyvYynB4w`g z(ppRnNHJ^0qa1R1&D2F8EQE`Rh+xgodTTlwcVnH<`f}M9L+VXV*M(PP#M!4DWS=>2 zxnDZ@kV`ivK(h=~gZr%thDf1kbeUvsk|avEI0b$2dyRX@unYefxsCsg9PY@zkt)5J zity3f%Kkd%6s~vPIx6$&&U7;y-;guV(%A|YRvtUF%U&wJ@!!6}q7M(xG>=Z!MpTYI zfE2y1@-``_OY!9q#13s;$0pMZy9IZL#MtC_Yv2h-4<`wmCsb3&T)ln`wZ}Ns^mZ;- z1+4Zy3vapwQe;y@gp%}T#^ptSYa`LNOLZCN2^PfXm7+A65#ZXNt=Ro*D>2xL_M@RzIIT*OHegVlFrN2FQrg!quj zJ;8Y^R&=ysogAMPn$lJ&+O`msb1Na7k|k*)m26>?fqX3Tv!x|=r+viQ<#6mcOINo% zM`<2z9o7EvzKLP6Ik`>3Tdza$O){%F_ow=W)`cPZD!+j@0c%NIng}37dKPi!L>71* z(&5fMZ=PbRhv~;JLPmD}ke8W?)>fIUvQgETk%b@D#y=wMj&Q9j_r)mEqPA;&gcVa9 z@0q@O`?)*iH^12=4dnpmr}3SNSFSe3Zj;{Z_)$)f+AAJgOe5LHoWPm);v>$^Oy%fS z1F)&bw>+0Hhd%g-1K1XN)OJa&t<@U)ApP|3Z5O?P?Hcgk8*^#fM+rkDvF(3{?~0{QJ&F+g9>s{ z3sd+S@Z_loGWQf{xIFjSnmm9F*SeRsS3l>&`pbctQ?3|L9mK)xH6+qN!f;PLTHyBf zTeQ4xeQ1aS3$=qp%DywfxrH_K;?eQDpWc+5`yduJGCWFw%E1iQGA$lmpLXb z;8gBMjcY9B|?{Lq0>?$k08J2+bzDr$-w|@VTv=_U~ z>fPqPBPv+NwEVFQ+^@k7^cf!SgmnD64QdB5Y>R320~vQHgZ2y;3hv1bUl%tU-II^A zEXx*?uy8$lwK5hIfv{Mdcm6?6#)Ff8gFNwBs-H#j(XAEkMwwCiRxQm9(`vxeDw%Gr zt#Au5lB|s-S_g~LM`=?XpxMMg$eK3^z7hOd`@T&&uK#riFSK2dCftf1y=WNh`*_)g z-IDj*p$)oh;kC;0vF_y=T`vlzjdPxi3STGi(017s=V~-K|B)L1AZnL!mT9@msrCg4 z%vP}MG9z+9X~Azjpdr*w5$ZGfQqhT^|IvBE`k=j5S-iIw!e;SZSu^n1lQ-&o7 z5%bdp)kD^r_PZEEmy8U)F7`(oJVuZgu#CXk2l0?`8tG!g@>-=gho8MWrrJ5tHoBy| z)ZOiyFWeezarc7X@yk1)^ z{r#wKogTbG`*2hFgqhzthupM+RDk?zs@dP?z#&%cq z4lLYyi74E&EYPbSyZDtREB(~PWGnPpE0NwQou~@m=;w>vj;V$9v0zNIQD+K5OWZ8g z-IBiUtvRfIXiU#&XsEAc3yU>31RLgcwTciE#h{`)qXF?e$qvPrIv1L1q&H{nfo^JH zr3wwx&`SU6-`gL(eb)zubR7e~s+yCqxwGeVu{fzXWg`Gv6h^p8_L-e8qUtiXzlgKx zRfrQ8X^In?p9|_%Wq&vO=fL@*bKhh2TQc@XeS#|*C|=)q+2$gwvxk0?bMp99@SGo` zF8@tUqk_xZ>gl!Ip}O5>3f~l++ZC;DupXz(Rp&J1_D^Jbc1(b>>BmL%?x|{Y#jIm* z8z-IooazB9wxSv8Mu{|nG*6eg%?|`$de#MW+quLBnCc)OwVxFN5@j5oS!QrT$jW%phcCz$(C7Dadp z{5m@zv}~nq$dibs@?40K_4SeU#2A2T_-1&9Ib>M70usf<(6PmuBiR6ng`#0n-CR8Q z2d%dArtaSxqnqcGscrRRianvR53s>o4Eg5PI<{&qcRl!bjjY6qEFOf0jC-_@c3+%4 zNyLJ4I=RW$B-74SYb)`2*seo1$Pb&Q^X_p98%YT0Virt_XW7>qs~*SYGAn5@+GV;J z6k&K;ER+Ad-D2Ecb~(XPU(6?H{9Q=JY+KBkq7Z^W zRDNOTR6{?p9&s}7jF>FnH1yTgVZ+4l0(iJ@sz|SeE`@8OAB^Tlw#Nwf4 z_p!w?H>*a`8RiVP$P9Ni<9W-K^93%wmfxewR!!?na? znpI0yiq7G_?RegOA6v!FBX_4o61x19E8xVA3QSsa@t8W(66qgU=Ikyzbl$4_>kGKU zS+i{k>(nRI9Cvhparhm2Ti0^In&fNDna-AE=PT={IqwT@92@?Tdd4d0#jGpep`lJ) zcBYN-MgL?+aO8h%dgju2RZhGy>@5@EH%$f9(0Vb^Qv}_1kp$}O`$PeOs={iburRv) zCV4d*Ux2E@oM?PQulGad80~#xWmc6#qTfBHC}FgCtTn$a-IK*u1Hy@y({h&FnfuLV z)WfTzY(H%(b=0knL(;VX7P=$;NGt%#axwkVpeR)`5^VKxC8Q`@qci@t_=(1IyO@5x$_8cxI!inuwdcu1 zMBri}&~a>B-*~EFHagswe-PR7G-qiG;Y@>*oih*2DL@H4G4(J}lGQFt#+BW?%UD);{&5Lx*F>xzmnsIpV5<#V*+t_|Zd3@$ICfxewLfHA6>G4BRLo1#G zf|fyWb@<`|1@0I=#EgX>?c#RjUHrZues4R?kdF$x!&vonQF3No5qKDfM;O{qM27jG z!&#?Pn1~0|Id{XZeWHEc_ftdJ{r87^7DH6NPt6+LZETNb8v}3bXLg3s#T6=#JB%|& z@6-H1mbWBVyuL{Q$I(P%qKbN5?%4;KS@o;WL|OH7C1#Jg`Q&TQ26a>%-Q(^B_Ww9; zD;8dpDuG2EWszQaUOF<<#`VCm+8laB2cisq+`>8ML!ut;Fs~>7m2XOVlnc+~gq%&Y zr>CWYyhWbUOnPvml20^2km=Hz+~<0)unVQ^kf@EUIbmDi(LcQlAN6W$6Gb0mx8%;R z=w5NhBfT!NaTl$9JYRK(rakWoN1ur`zY;{&rca5>#At7iNnK&a=ajhgujQ0*m?JZ& zhqaSBeF8=GSbGAUSvhD{lois~fU-Zr^B8nqYw-W2XAw5U@sj~}tNP9$i9j zqgFG5g02#Z_su%Z8NZ)f`Y_#TWkTElYf8YTKA?$VD^P#=x{hAy0>g;1OR^-#+FPH2 zBTFjT##^2_U{+f7>RcZ}>8b?B&yh5DikRyH^NWwLK)>pYcO{XyPmT&bTC2iV*FKe^ zm}cvYlGV-3@SfS$mf<;C88MjvT71YBj#%{m0({^F(X2K2keB#z!`WS6p3UvdRGx2< zad@_bHdeGlLsf$Db@X#%YR58@HK0qT856O3k!z_adXL(K*B!Aq{&IP4XrJq3O^5kp zI!AySnswjXFcK1IY2|$RB0Wr}+vTj4bD*q!ov-23mP3Jg0bPaJ%kRw$=SxmTE~X?; z41i|ExVNlNB0pKiwSv}I=V!Iaul-PRl`+$1*vhY)jRF>Y2gcriJs|D2rjm?>&%}ew znl(VgJhZRJ6ow!Dj-cH`zCzTUb?%oH@REBR0T-JY{?LS350Bpy(%)$yi3SM0ZP!S^ z)7|P|#*bWBm?5`G-3kq`6?)RpQFZJ5o|VSN=(!bG`hW{u#4}y(+7B36FyBWyn`)|F z>Qmd#hAKS$jajeH^-;g8_$d{xwbkIUDAa`uy9s{&3lPodecutTb!6NIxz@vc?Vn=m zuZ38pKl+YKm|E&s$ZreT0+nXM*Yyn2O*KGwQ@eVP8HhuTxJd3jH7+av(b)+WD^Kzz z=wCWE-4wmC;l;4D#NLJl5v|V#oLSjOpIkR!Ff;rOS4` z1Q7ae7QHc!5S9Z2L?KlE;n5qdAZ|~F9wg4@B74tCZ(j4-V#>I@#k7$slLLlgpJ)UK zRBy!N+;(rhHbp)B-f#~yh&%aAb}q#D;HThh*L$Yrp=e~}N69{VR;_w%q&FwxDgJ4u zXgjc-)Yn`qI79l9;%Jcdp-VAvYIf8c%O8^mtj*AJZciu`t9ZesY8+i$!nr_isSR zL)Rh0@$6`6H<%sfv%`BJ=8~4$i9jQ)663NnXBvI0xHqVxN+wNuGi!n_Otw(~OU|Mj z8sbA?KMcEczhppCrnGw22T6 z2+%vd?@>>Z@Rc`(ul%PtT9%X>D$F%G)an}vu=RKyHknY;d+rbLc(88(rw&)NNn#iI+)86m_tH+*{e2rJ6@nPh1c8qBvs zfQ#a30m9W&zKx)TJ(q}s9*jD&Fi=+a#~Zajc8f=y=!H|3YtHjKG$c4vD;7cLonf%#fKnM=65 zJn3fy{se_WPhr#4?4t|LqqyEMr{TXj-3;H|zUm1k^UH%QoFm81nX6+>Z_|Ue(_SjB z+BYnG4qf)#K$rd5$Fkr0mZ=uM8%N4Qj3!JI_JgxdjAH%5{|k5-+*$(k3`*s%20?!& zV)oecFcllRvMZQ+yKj>qSOTkh7w^(D|25Q zfV}5A^H<;+loAv_l3=?>>^VdXG`O(mre#&Huz79B1bbum;Ik)Lk1|x_1CSc>a=UG6 zVc7G8snzZP{kK=3d0*xaMZ)SpGb3f(Wt6A>7n(3*4x;Xh1cdzlFyVG9f&n4XPd5se1H3!Ny&d|MkJ-#&f?59!rA<&wHDiOD2<>{G=oj z0)hiM=|TjV?4@QUi?!u0O}Sa`@8~O`Tarr}ozsE`6P5kwPCjMT8FtO8N%_5_`#KM~ zhEO=R7X@;h1`h0A+UP^O<%7=N{F=o_jg`F>pt8kG0Z>RQvf8AO#`%v8jPUZUu`m24 z)*jA~?o2R4l*$Is9{@tXfn=az=u(~@{S6V-F54)8fn>jF&Tbzq|uhq;oBvuVrT~gu%?Z7t1VpSbo${PfM5k}~6y1S-0q2S&Id2v>k zHh^3aa45m`|lXHF}i1)KbpU) zeQp1dgyJ`|_o1crVM#gdidUTPfPv>PWN%Y%0Ov~638)?0)yjcX;q8l{)9hCr8>3P7 zuB}pLyF&8@{Zy-3e3|f3_JoObJurM$gmo!iaq3ijsp}Z?am>#FWB!)r_oI1XQYp`a zG#?|9BVxRytL=oRAy-yDgjOHxs8(Wxp;b%2cUTG-yJ|w(dYz4u`Z;z5V`tjO$rD)9 zV5I)p%3xgfvgY>`Tt2_2;Hvy=)s?3IQxUTvcbIhm<0YNKm@<-hR@K&->sw{U2MpCa!u(fss1K3%osV{7jNsnLtDqC$$rao#!hxuG8EBp zTFSp-1_}VyKINg+d|_Tk6+jj(|!)*KZ&*dL$3jU>bf_!DY~cQ z{ziIKwBdi;+3-L5hNywtKc~&1&9;#Avn@Z$oRIkM%n1-<{~y1+L>8N#vJxLk5-?!` z9WEl~AA(cPh1}f472y^RI3?%)s%<=Q64aqilX)Vv+2@nWZ?o>!o7ucg95%l2eYm|* zylkQ&-q3#VN{d2E;y4|F((QQ%D(;5pmpvd|nIHc)&r@rwkQ~JZB^>+N>~gnf`v$l} zijF)X{RpCadcRQ&PIVO$Q5m9Qy62nxtamRoWF{UGXL!q`lfz7mzgTFyZP7g2F}6OX zVIoGT%ZWhzAi}WDIKL3~I(Ik0B9vjT+&(t;$sn0_W(xB9`9bCUbRn32u1QC0D@tPc zwK8F9cmB(de)P$ZIh+ro?yJ+>KlDM+c3+lK*$!fu!JvRf-&n~m>^3{ZR`I(#HRS!R2 zwoy{XAf|ihR~%k5>!u|o(#Wkz_`3CuD~-xxO<|RzqmUO}Ke?_Pq4Occ1w&1+>}>1G zJF9o}RYn-A^lwm}p5&pY^kMO9`$^T(6;MomN!4q7EYbv$ntsQuVv zz4*KFxMtP6Z3}rY`RyrMq6y8l-13sL0Pp|@iqA{!9}I6ax*Fs#MK1E%-$P@<<&RY$ z`lsE)arC6Vk~>uu%J4GUE6FFH3Z#EM-Ql;Nvu=f?$LERXkq^f=N=6Gtm|$YITX~=o zX2`%%urOscJ*8+skF`p}t6y+N>l^2g8vHiYzo$0TzmKzA)W$aejaEme!8ap(I-NHW zNm^UIU(;&}`4+EFfEfxegQV6LpH1c~+kP3^L>|bFd&}@wXvLmQgkC_aL&tsXz z0XxiqhdC=`t`pmLZCx18R?_t8%T{Ush-WQ0UXc^AtY<5ElLYFcF9Oo=kzawzmEt=q zac1?y$oF)(%6mMD^ew^f&avav*~0Kh$|5#v=vD4g!BcK~x+AF9!kUs`FUeSqH&n~G zM679%;bbM(V}AkDwf_p0fFdJTn4C7Dfp#Uxz%aaK&-=A*jY>lIrJ`XleQohr zLPbgL-CvZb4V|ksdE25N*I)uTqX8LR7VNK2ZF!(8l?+O36D|1mnvt(@FB&2QS9MCC zVt4UfkNVWanO)%!upyDR$2o{T}a>%>8Uc% zYSZtsc%GESN$6Jesc~p})#hNIe+7X>6``bp4Z6xJl;V`SRw*A2vl!-dZ*VNa4W5`L zZl?yEvI2jYz$$(?NnWBO>&Jn*&;eh|UG1*<|4(~o9@SKmE^yy#MaM?KX*Z-<>`|cG z1zDOUA!ah8*e-zB4H`r+v@8)!5LqNFvB8#kAfm(;Bm`WcH9#a`69|Dui2+$7#1NA} z69U;l5+Edy+_|`PzZ2)3^Zs~$%$#}uBOA+|YN8>qts z-r%PVPF+UXR|*OKZf|U7MdXdV!-A*9DF;V=EHp_bF^~71>9Z**Eww5t-0WJzlf;047=E zGdYkQ-A0tMkSn6T4kLi%6&&iyBgh>p?Hs7kC){EeARYI|Ebe^Yr#Xy=#YNve7DF8^ zq%6MzSb0eHF?HDYu%w{Y&8bg7AY$2kXI;f;>&Dzh9Ru$Un@oV>s1B)fUYb*mL{d{9 z-ZgnFwO*U5Y#-V`^X>zTwUH3l-2yAB=_$mf>j|^~a^FrG3FR78vj{p5N_lGY7@TtK zML(gqJoSF0Zd=dIo-D*fK02yb0>)rhcSIita{Np(6-_h(WieyyFTR5iC)_BrfEuoX zFu#*BWbh%nh1+0i=bNQVzs9p+4=wuZyB&v^Fl17Ub~T7*1w>&R?7&t5b8<9w1U#(~ zPp!XtGgl`P0gXUhnVcbC!U^}xrcfu(WG!huA<98nT}G}|qMj#a-R1Axyss>>c0q@# zQhLk<`T7WE@K4%3%j`(`bcb9JuIqB=5Co?-WaY~`q8Ox^=0J=+y?XlBlS$v>@+2&0 z7+MPcu!Qnr(Dc0#U+`!0t?;H84VPwDf=cH83FBLoT(Y>|Eyi=K(Ar*zF3T7jFD331 zMCK=1Y0(VWM4SpWB$QO{X^%^pX3uiAkJrp!fxR`OEg{q}!Kkt^0QH%I%3JqvpI zkns4Db=Xopgx=oM$nQm$A{of)?B1a-X{h8fp{Yac=YU-HRA$-5D7W*)+R0K(u?mMN z68ZsuhYODsU531b7&5O`Vg#FK7LWqWkB?)Wn?U{v+dOU!je`9rWnm;E;G51S*ynM) z98!4ktO}L*N{EgpqOMK3Xtz6OS5CYKtAy$F@aVHQE|W0Ggv%K_6mcp<=}pG-HS>LC%z-@vM!6;Ww5+s`PBhcw+z^Bz;C z9lfh^FomU19pd|IrKrcs=97Jd*-nU%P}6Lg!l$g;$oCqu7CqY?Roh4kXq<>+`xJ5< zI>Q);dD}}i{`O{+N1T)|uTldxOS|q>(H8qd$kAdnzohzBO<=_lw{X7VJp(qAC(|z? z%A6x>X-;vxJKqjc{=Bb_I46t9LlwuX?gnW#)xRanP{K6Q{pU3sa0iFv_q*;2&dNBX zhia9K>FqZ)VOofEl&g=y6U6?0JH@OS_rticxX13R3G2bN45n^@YZ>rT7i!e!z!Lwm z`?lZ?_ENRKNjAz^$bu>mk(s2sk<|@%=&>O9YM0ASFD0PNFFy+ndf-rRm&|R}>9pav z#^KNjw%rL5J@{OZG7#sOTs!-PPXW2*Bp|v z4q^UuDF3V-=ha>xmrCvpc5zeW%HnvmZ?JNDF%WAP<;mVNo(LICn_XgyIf_5DcymQn zwPkea0;}tZR&C9AG^nF9!Hr`Vauwyb;*0epV{gH_WXz$)fD zu*&*3uqtv1ta|<)tokMxZ5X=p=5jJP7vCL_x2-ZR57B!d%^A3pv5mKX*6XWv<(BJySZ(34#jCLAk896(jTsZqz) zY~1=jo$$-WeM$c`|Gud5%mLf8+19f8q>EKgw>(g93(;#_Z1Eo)q?XlPPOB#4Y3D4x zkaiX(9aw2}0mmD!JzHcIZoZsWIO3aO%d_wwaBCwt`JDTZ>iz#I@i>cd+U(^PEHy!7 zpPmm!tn4b z2I~6goILUoy)bZ8n^A=5J&7@;ys$YQd)7c~_$3(cNsQ?iMpu+)f@6+oQ*KA0fy_nq zYX$4(8kO=?k@cl$#^(I4iTjL@^;?3MbW!xwjeZo+w`<-n77Rd!2AYE1vgy@^UBiv9 z4}$T>6MJP~u&GV3p-(@Yeu9iKP~l(x@InMESCq}CFdC*2d7h~$=WBIg)Kn#3A)33N z8C{USa&*z=^uj=Ww3nSu_h=PAvaXfDPixR=5}MKtUcO~TT^`wK6|N5lMq2&t*oSKL zL8^WjoHodbgn|9@rymXR1?}#%u_u3Vn(0qkqiT@&Hk-R-Ji0R2=8`dtQ42zVqS_M- zAI?+-e=2nmjZ18}$0Nz>8G}Rf?tyL}9`OGEO`6s}c1y|FTOIWYp>tyrC_oaPMvpk4Phb^E;Vn@RWA9&WV4}`T@_hzmcDe*PS22=pZK< zbqNghbeV)Nxr#}oj_L!WMn_k98`Pbaz6-bL&?fM@#6rYsh ztYI(!m!#&sA@VfcK#pmiNOFIWO~aL>BtkVYN8$hYQ>t&`Ej+o3vbCKbRl546`drWW zA8Xc4#O}&A`>2Tc=R{Wiy(7lT3VKbb!_lQSNS>>)CtoG9rTd;r4Kl3dWe)*tg&|xp zmb~pv4&N&J~yGOpM75f%POn|$XrylKv=R%z=i3wN)}!Vd(4Cg{8Z_VLj3K;zbo+ZbhdP{hDF`-Ocq@I9-;XfLgb<#X(qxYtEHY7D7Y za03pX;L~PtKH$O}Tt9mw&7dH#YU9HtoBEk_%*fCcSw@N5o&SY}c~zFQc*cf|FO0<;C!bdJ{E2VH5w+Wko$-I+Sw$gn;3mvMjYl}95( z=cc0{rW$;JmIXN`7UbiXS|PJ-|8=Sm@tCmZFynAt|9;8bCqFDV5H}OjMc^c>TW5CY zIw=HNe)TVaeD9Sd7mY5!ML6^Sz%Kfsft4+0&m4$9KGy*HEjVG zZsulo$$z2X>4BdSiF65PE}RmtmwkGmk&TXbbv;qhEs7;|w|m(gNan=1HFwlwlzxS_ z8Exk_{e+4e7!#9#s|`4PnExfWO(2^UrKe+@Jn9CV0sG2gpx)$OR1qF4SUh2&$mte) z)xk*kM!plUN&JG5Y^lDuVqAD8(TzvKU?G4HXB3|GL`C_lplOUWTr)1bRm4E)9e20_ zb;+AAWN0Y9!A39O>CeOrE4)4!xOY5Sub5DUs28oDg{r2WmH?$1=I#hRR{az&&KU$i zi2^9#UjZbGt=mFXA+1`W)*{;(>ovlXygPUI{sUlrY9BPNEYxA zni{BSw4?xjO@hS;0HfmsR;eLhmwqC6H4*FqB#;+=ofazMp#%*jF_18ek3t^PHmOte zTn)74u}1EGMT+2GiiOXpGc%63>PAk1OJ@3Ly?-WlPOgU|XXA&vcFxU*v`&{)jxS{; zpfCc}z6#6(CGO&Gygw7~sb9*T?e6-~c`T?degzZ%IglM%rJ)Q1co?w1>eb@0$NI!Y zFhlkL3&?ZY{}}GcVm;#+bpcHQIo#=z$uTB=h(FohE}oh1!Iilo=hUvQrA)kQSqX4{ zF+$V)N~b*+JDMr!ELmG32c+#eTQx2o{5;W07Mtlt0Ce7Yi%ikWl@V~@SDAw?4->03 zpX2uUbQc7tHPBzd>GDI^?YCafchw76ouQk;)%7%JAenw&)>xzCWis&9ypnYVX^r>4 zGN|t@w5AO0WbK#N+S`X(S1_SRXr Si1!7S{mh>>TlQ*f+1~*SjL>!f literal 58780 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

SWKR-PaWAyDbr>M+g%c7rl#Qb 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 diff --git a/test/data/PAS_data.tar.gz b/test/data/PAS_data.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..baea65f842020a6d4883eed513e6477b3fee83ea GIT binary patch literal 4615 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 0, "Failed to open handle ==> /posHandle/last_position"); ret = pclKeyHandleReadData(handle, buffer, READ_SIZE); + printf("* * * * * => => => B U F F E R : \"%s\"\n", buffer); x_fail_unless(strncmp((char*)buffer, "WT_ H A N D L E: +48° 10' 38.95\", +8° 44' 39.06\"", ret-1) == 0, "Buffer not correctly read => 1"); size = pclKeyHandleGetSize(handle); @@ -217,7 +218,6 @@ START_TEST (test_GetDataHandle) x_fail_unless(handle2 >= 0, "Failed to open handle /statusHandle/open_document"); size = pclKeyHandleWriteData(handle2, (unsigned char*)sysTimeBuffer, strlen(sysTimeBuffer)); - printf("pclKeyHandleWriteData: Soll: %d | ist:%d\n", strlen(sysTimeBuffer), size); x_fail_unless(size == strlen(sysTimeBuffer)); // close ret = pclKeyHandleClose(handle2); @@ -296,6 +296,23 @@ START_TEST(test_SetData) ret = pclInitLibrary(gTheAppId, shutdownReg); x_fail_unless(ret <= 1, "Failed to init PCL"); + +#if 1 + /** + * Logical DB ID: 0xFF with user 3 and seat 2 + * ==> local USER value (user 3, seat 2) + */ + ret = pclKeyWriteData(0xFF, "status/open_document", 3, 2, "WT_ /var/opt/user_manual_climateControl.pdf", strlen("WT_ /var/opt/user_manual_climateControl.pdf")); + x_fail_unless(ret == strlen("WT_ /var/opt/user_manual_climateControl.pdf"), "Wrong write size"); + + + ret = pclKeyWriteData(0x84, "links/last_link", 2, 1, "CACHE_ /last_exit/queens", strlen("CACHE_ /last_exit/queens")); + x_fail_unless(ret == strlen("CACHE_ /last_exit/queens"), "Wrong write size"); + + ret = pclKeyWriteData(0xFF, "posHandle/last_position", 0, 0, "WT_ H A N D L E: +48° 10' 38.95\", +8° 44' 39.06\"", strlen("WT_ H A N D L E: +48° 10' 38.95\", +8° 44' 39.06\"")); + x_fail_unless(ret == strlen("WT_ H A N D L E: +48° 10' 38.95\", +8° 44' 39.06\""), "Wrong write size"); +#endif + #if 1 time_t t = time(0); @@ -481,7 +498,6 @@ START_TEST(test_GetDataSize) * ==> shared user value accessible by A GROUP (user 2 and seat 1) */ size = pclKeyGetSize(0x84, "links/last_link", 2, 1); - printf("=>=>=>=> soll: %d | ist: %d\n", strlen("CACHE_ /last_exit/queens"), size); x_fail_unless(size == strlen("CACHE_ /last_exit/queens"), "Invalid size"); #endif pclDeinitLibrary(); @@ -731,17 +747,18 @@ START_TEST(test_DataHandle) handleArray[3] = pclFileOpen(0xFF, "media/mediaDB_write_04.db", 1, 1); x_fail_unless(handle1 != -1, "Could not open file ==> /media/mediaDB_write_04.db"); - (void)pclFileReadData(handleArray[0], buffer, READ_SIZE); + ret = pclFileReadData(handleArray[0], buffer, READ_SIZE); + x_fail_unless(ret >= 0, "Failed to read handle idx \"0\"!!"); x_fail_unless(strncmp((char*)buffer, "/user/1/seat/1/media/mediaDB_write_01.db", strlen("/user/1/seat/1/media/mediaDB_write_01.db")) == 0, "Buffer not correctly read => mediaDB_write_01.db"); - (void)pclFileReadData(handleArray[1], buffer, READ_SIZE); + ret = pclFileReadData(handleArray[1], buffer, READ_SIZE); x_fail_unless(strncmp((char*)buffer, "/user/1/seat/1/media/mediaDB_write_02.db", strlen("/user/1/seat/1/media/mediaDB_write_02.db")) == 0, "Buffer not correctly read => mediaDB_write_02.db"); - (void)pclFileReadData(handleArray[2], buffer, READ_SIZE); + ret = pclFileReadData(handleArray[2], buffer, READ_SIZE); x_fail_unless(strncmp((char*)buffer, "/user/1/seat/1/media/mediaDB_write_03.db", strlen("/user/1/seat/1/media/mediaDB_write_03.db")) == 0, "Buffer not correctly read => mediaDB_write_03.db"); @@ -1079,45 +1096,6 @@ END_TEST -START_TEST(test_FileOpenCreate) -{ - int handle = -1, ret = 0; - unsigned int shutdownReg = PCL_SHUTDOWN_TYPE_FAST | PCL_SHUTDOWN_TYPE_NORMAL; - char buffer[128] = {0}; - char* writeBuffer = "test_FileOpenCreate: write some data to the file!"; - - (void)pclInitLibrary(gTheAppId, shutdownReg); - - // remove file - remove("/Data/mnt-wt/lt-persistence_client_library_test/user/1/seat/1/media/mediaDBWrite.db"); - - handle = pclFileOpen(0xFF, "media/mediaDBWrite.db", 1, 1); - x_fail_unless(handle != -1, "Could not open file ==> /media/mediaDBWrite.db"); - - - ret = pclFileWriteData(handle, writeBuffer, strlen(writeBuffer)); - x_fail_unless(ret == strlen(writeBuffer), "pclKeyHandleWriteData => error writing data"); - - /* - ret = pclFileSeek(handle, 0, SEEK_SET); - x_fail_unless(ret <= 0, "pclFileSeek => failed to position fd"); - - - ret = pclFileReadData(handle, buffer, 128); - x_fail_unless(ret == strlen(writeBuffer), "pclKeyHandleReadData => error read data"); - x_fail_unless(strncmp(buffer, writeBuffer, strlen(writeBuffer)) == 0, "pclKeyHandleReadData => Buffer not correctly read"); - - ret = pclFileClose(handle); - x_fail_unless(ret <= 0, "pclKeyHandleClose => failed to close"); - */ - - - // remove file - remove("/Data/mnt-wt/lt-persistence_client_library_test/user/1/seat/1/media/mediaDBWrite.db"); - - pclDeinitLibrary(); -} -END_TEST @@ -1173,9 +1151,6 @@ static Suite * persistencyClientLib_suite() TCase * tc_NegHandle = tcase_create("NegHandle"); tcase_add_test(tc_NegHandle, test_NegHandle); - TCase * tc_FileOpenCreate = tcase_create("FileOpenCreate"); - tcase_add_test(tc_FileOpenCreate, test_FileOpenCreate); - suite_add_tcase(s, tc_persSetData); suite_add_tcase(s, tc_persGetData); suite_add_tcase(s, tc_persSetDataNoPRCT); @@ -1191,7 +1166,6 @@ static Suite * persistencyClientLib_suite() suite_add_tcase(s, tc_GetPath); suite_add_tcase(s, tc_InitDeinit); suite_add_tcase(s, tc_NegHandle); - suite_add_tcase(s, tc_FileOpenCreate); //suite_add_tcase(s, tc_Plugin); // activate only if the plugins are available -- 2.7.4