From 3c646c35452e536dba5dcfa01cd6f62425cb286b Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Thu, 27 Oct 2016 07:26:47 +0200 Subject: [PATCH] untangled moench from jungfrau, quite a few changes --- .../commonFiles/communication_funcs.c | 2 +- .../jungfrauDetectorServer/.gitignore | 1 + .../jungfrauDetectorServer/Makefile | 12 +- .../jungfrauDetectorServer/firmware_funcs.c | 3569 ++++++--------- .../jungfrauDetectorServer/firmware_funcs.h | 10 +- .../{gitInfoMoench.h => gitInfoJungfrau.h} | 0 ...itInfoMoenchTmp.h => gitInfoJungfrauTmp.h} | 0 .../jungfrauDetectorServerv2.2.1 | Bin 136036 -> 125624 bytes .../jungfrauDetectorServer/mcb_funcs.c | 921 +--- .../jungfrauDetectorServer/registers_m.h | 19 +- .../jungfrauDetectorServer/server.c | 22 +- .../jungfrauDetectorServer/server_defs.h | 26 +- .../jungfrauDetectorServer/server_funcs.c | 3870 ++++++++--------- .../jungfrauDetectorServer/server_funcs.h | 2 +- .../jungfrauDetectorServer/sharedmemory.c | 39 - .../jungfrauDetectorServer/sharedmemory.h | 48 - 16 files changed, 3222 insertions(+), 5319 deletions(-) create mode 100644 slsDetectorSoftware/jungfrauDetectorServer/.gitignore rename slsDetectorSoftware/jungfrauDetectorServer/{gitInfoMoench.h => gitInfoJungfrau.h} (100%) rename slsDetectorSoftware/jungfrauDetectorServer/{gitInfoMoenchTmp.h => gitInfoJungfrauTmp.h} (100%) delete mode 100755 slsDetectorSoftware/jungfrauDetectorServer/sharedmemory.c delete mode 100755 slsDetectorSoftware/jungfrauDetectorServer/sharedmemory.h diff --git a/slsDetectorSoftware/commonFiles/communication_funcs.c b/slsDetectorSoftware/commonFiles/communication_funcs.c index a42371570..54ee6bb14 100755 --- a/slsDetectorSoftware/commonFiles/communication_funcs.c +++ b/slsDetectorSoftware/commonFiles/communication_funcs.c @@ -137,7 +137,7 @@ int acceptConnection(int socketDescriptor) { //socklen_t address_length; - size_t address_length=sizeof(struct sockaddr_in); + socklen_t address_length=sizeof(struct sockaddr_in); if (socketDescriptor<0) return -1; diff --git a/slsDetectorSoftware/jungfrauDetectorServer/.gitignore b/slsDetectorSoftware/jungfrauDetectorServer/.gitignore new file mode 100644 index 000000000..0173208ed --- /dev/null +++ b/slsDetectorSoftware/jungfrauDetectorServer/.gitignore @@ -0,0 +1 @@ +*.gdb diff --git a/slsDetectorSoftware/jungfrauDetectorServer/Makefile b/slsDetectorSoftware/jungfrauDetectorServer/Makefile index 6b3fc4bd4..7e7dd500a 100755 --- a/slsDetectorSoftware/jungfrauDetectorServer/Makefile +++ b/slsDetectorSoftware/jungfrauDetectorServer/Makefile @@ -6,17 +6,17 @@ CROSS = bfin-uclinux- CC = $(CROSS)gcc -CFLAGS += -Wall -DMOENCHD -DMCB_FUNCS -DDACS_INT -DDEBUG -DV1 #-DVERBOSE #-DVERYVERBOSE #-DVIRTUAL #-DDACS_INT_CSERVER +CFLAGS += -Wall -DJUNGFRAUD -DMCB_FUNCS -DDACS_INT -DDEBUG -DV1 #-DVERBOSE #-DVERYVERBOSE #-DVIRTUAL -PROGS= jungfrauDetectorServerTest +PROGS= jungfrauDetectorServer INSTDIR= /tftpboot INSTMODE= 0777 BINS = testlib_sharedlibc -SRCS = server.c server_funcs.c communication_funcs.c firmware_funcs.c mcb_funcs.c sharedmemory.c +SRCS = server.c server_funcs.c communication_funcs.c firmware_funcs.c mcb_funcs.c OBJS = $(SRCS:%.c=%.o) @@ -27,15 +27,11 @@ test: clean jungfrauADCTEst boot: $(OBJS) -jungfrauDetectorServerTest: $(OBJS) - echo $(OBJS) - $(CC) $(CFLAGS) -o $@ $^ $(LDLIBS_$@) $(LDFLAGS_$@) - - jungfrauDetectorServer: $(OBJS) echo $(OBJS) $(CC) $(CFLAGS) -o $@ $^ $(LDLIBS_$@) $(LDFLAGS_$@) + jungfrauADCTEst: $(OBJS) echo $(OBJS) $(CC) $(CFLAGS) -o $@ $^ $(LDLIBS_$@) $(LDFLAGS_$@) -DTESTADC diff --git a/slsDetectorSoftware/jungfrauDetectorServer/firmware_funcs.c b/slsDetectorSoftware/jungfrauDetectorServer/firmware_funcs.c index bfcb0c995..83b7e212e 100755 --- a/slsDetectorSoftware/jungfrauDetectorServer/firmware_funcs.c +++ b/slsDetectorSoftware/jungfrauDetectorServer/firmware_funcs.c @@ -47,63 +47,57 @@ #include #include + +extern enum detectorType myDetectorType; + typedef struct ip_header_struct { - u_int16_t ip_len; - u_int8_t ip_tos; - u_int8_t ip_ihl:4 ,ip_ver:4; - u_int16_t ip_offset:13,ip_flag:3; - u_int16_t ip_ident; - u_int16_t ip_chksum; - u_int8_t ip_protocol; - u_int8_t ip_ttl; - u_int32_t ip_sourceip; - u_int32_t ip_destip; + u_int16_t ip_len; + u_int8_t ip_tos; + u_int8_t ip_ihl:4 ,ip_ver:4; + u_int16_t ip_offset:13,ip_flag:3; + u_int16_t ip_ident; + u_int16_t ip_chksum; + u_int8_t ip_protocol; + u_int8_t ip_ttl; + u_int32_t ip_sourceip; + u_int32_t ip_destip; } ip_header; struct timeval tss,tse,tsss; //for timing -//for memory mapping + u_int32_t CSP0BASE; - - FILE *debugfp, *datafp; - int fr; int wait_time; int *fifocntrl; - -//int *statusreg; commented out by dhanya const int nModY=1; int nModBoard; int nModX=NMAXMOD; -int dynamicRange=16;//32; +int dynamicRange=16; int nSamples=1; - -int dataBytes=NMAXMOD*NCHIP*NCHAN*2; - +size_t dataBytes=NMAXMOD*NCHIP*NCHAN*2; int storeInRAM=0; int ROI_flag=0; int adcConfigured=-1; -u_int16_t *ram_values=NULL; -char volatile *now_ptr=NULL; -u_int32_t volatile *values; int ram_size=0; int64_t totalTime=1; u_int32_t progressMask=0; - int phase_shift=0;//DEFAULT_PHASE_SHIFT; int ipPacketSize=DEFAULT_IP_PACKETSIZE; int udpPacketSize=DEFAULT_UDP_PACKETSIZE; - +int clockdivider; +/* #ifndef NEW_PLL_RECONFIG u_int32_t clkDivider[2]={32,16}; #else u_int32_t clkDivider[2]={40,20}; #endif -static const int JUNGFRAU_CLOCK = 1; + */ + int32_t clkPhase[2]={0,0}; u_int32_t adcDisableMask=0; @@ -114,106 +108,89 @@ int masterMode=NO_MASTER, syncMode=NO_SYNCHRONIZATION, timingMode=AUTO_TIMING; enum externalSignalFlag signals[4]={EXT_SIG_OFF, EXT_SIG_OFF, EXT_SIG_OFF, EXT_SIG_OFF}; -int withGotthard = 0; char mtdvalue[10]; -/**is not const because this value will change after initDetector, is removed from mcb_funcs.c cuz its not used anywhere - * why is this used anywhere instead of macro*/ -int nChans=NCHAN; -int nChips=NCHIP; -int nDacs=NDAC; -int nAdcs=NADC; -extern enum detectorType myDetectorType; -/** for jungfrau reinitializing macro later in server_funcs.c in initDetector*/ -extern int N_CHAN; -extern int N_CHIP; -extern int N_DAC; -extern int N_ADC; -extern int N_CHANS; + int mapCSP0(void) { - printf("Mapping memory\n"); + //printf("Mapping memory\n"); #ifndef VIRTUAL - int fd; - fd = open("/dev/mem", O_RDWR | O_SYNC, 0); - if (fd == -1) { - printf("\nCan't find /dev/mem!\n"); - return FAIL; - } - printf("/dev/mem opened\n"); + int fd; + fd = open("/dev/mem", O_RDWR | O_SYNC, 0); + if (fd == -1) { + printf("\nCan't find /dev/mem!\n"); + return FAIL; + } + //printf("/dev/mem opened\n"); - CSP0BASE = (u_int32_t)mmap(0, MEM_SIZE, PROT_READ|PROT_WRITE, MAP_FILE|MAP_SHARED, fd, CSP0); - if (CSP0BASE == (u_int32_t)MAP_FAILED) { - printf("\nCan't map memmory area!!\n"); - return FAIL; - } - printf("CSP0 mapped\n"); + CSP0BASE = (u_int32_t)mmap(0, MEM_SIZE, PROT_READ|PROT_WRITE, MAP_FILE|MAP_SHARED, fd, CSP0); + if (CSP0BASE == (u_int32_t)MAP_FAILED) { + printf("\nCan't map memmory area!!\n"); + return FAIL; + } + //printf("CSP0 mapped\n"); #endif #ifdef VIRTUAL - CSP0BASE = malloc(MEM_SIZE); - printf("memory allocated\n"); + CSP0BASE = malloc(MEM_SIZE); + printf("memory allocated\n"); #endif #ifdef SHAREDMEMORY - if ( (res=inism(SMSV))<0) { - printf("error attaching shared memory! %i",res); - return FAIL; - } + if ( (res=inism(SMSV))<0) { + printf("error attaching shared memory! %i",res); + return FAIL; + } #endif - printf("CSPObase is 0x%08x \n",CSP0BASE); - printf("CSPOBASE=from %08x to %08x\n",CSP0BASE,CSP0BASE+MEM_SIZE); + //printf("CSPObase is 0x%08x \n",CSP0BASE); + printf("CSPOBASE mapped from %08x to %08x\n",CSP0BASE,CSP0BASE+MEM_SIZE); - u_int32_t address; - address = FIFO_DATA_REG;//_OFF; - values=(u_int32_t*)(CSP0BASE+address*2); - printf("statusreg=%08x\n",bus_r(STATUS_REG)); - printf("\n\n"); - return OK; + printf("statusreg=%08x\n",bus_r(STATUS_REG)); + return OK; } u_int16_t bus_r16(u_int32_t offset){ - volatile u_int16_t *ptr1; - ptr1=(u_int16_t*)(CSP0BASE+offset*2); - return *ptr1; + volatile u_int16_t *ptr1; + ptr1=(u_int16_t*)(CSP0BASE+offset*2); + return *ptr1; } u_int16_t bus_w16(u_int32_t offset, u_int16_t data) { - volatile u_int16_t *ptr1; - ptr1=(u_int16_t*)(CSP0BASE+offset*2); - *ptr1=data; - return OK; + volatile u_int16_t *ptr1; + ptr1=(u_int16_t*)(CSP0BASE+offset*2); + *ptr1=data; + return OK; } /** ramType is DARK_IMAGE_REG or GAIN_IMAGE_REG */ u_int16_t ram_w16(u_int32_t ramType, int adc, int adcCh, int Ch, u_int16_t data) { - unsigned int adr = (ramType | adc << 8 | adcCh << 5 | Ch ); - // printf("Writing to addr:%x\n",adr); - return bus_w16(adr,data); + unsigned int adr = (ramType | adc << 8 | adcCh << 5 | Ch ); + // printf("Writing to addr:%x\n",adr); + return bus_w16(adr,data); } /** ramType is DARK_IMAGE_REG or GAIN_IMAGE_REG */ u_int16_t ram_r16(u_int32_t ramType, int adc, int adcCh, int Ch){ - unsigned int adr = (ramType | adc << 8 | adcCh << 5 | Ch ); - // printf("Reading from addr:%x\n",adr); - return bus_r16(adr); + unsigned int adr = (ramType | adc << 8 | adcCh << 5 | Ch ); + // printf("Reading from addr:%x\n",adr); + return bus_r16(adr); } u_int32_t bus_w(u_int32_t offset, u_int32_t data) { - volatile u_int32_t *ptr1; + volatile u_int32_t *ptr1; - ptr1=(u_int32_t*)(CSP0BASE+offset*2); - *ptr1=data; + ptr1=(u_int32_t*)(CSP0BASE+offset*2); + *ptr1=data; - return OK; + return OK; } u_int32_t bus_r(u_int32_t offset) { - volatile u_int32_t *ptr1; - ptr1=(u_int32_t*)(CSP0BASE+offset*2); - return *ptr1; + volatile u_int32_t *ptr1; + ptr1=(u_int32_t*)(CSP0BASE+offset*2); + return *ptr1; } @@ -240,102 +217,41 @@ int setPhaseShiftOnce(){ printf("Multipupose reg now:%x\n",bus_r(addr)); #endif } - return OK; } int cleanFifo(){ -/* u_int32_t addr, reg, val, adc_sync; */ -/* printf("Cleaning FIFO\n"); */ -/* addr=ADC_SYNC_REG; */ - -/* if(withGotthard) */ -/* adc_sync = GOTTHARD_ADCSYNC_VAL; */ -/* else */ -/* adc_sync = ADCSYNC_VAL; */ - - -/* reg = bus_r(addr) & CLEAN_FIFO_MASK; */ - -/* //only for start up */ -/* if(!reg) reg = adc_sync; */ - -/* // 88 3 02111 */ -/* if (ROI_flag==0) { */ -/* val=reg | ADCSYNC_CLEAN_FIFO_BITS | TOKEN_RESTART_DELAY; */ -/* bus_w(addr,val); */ -/* // 88 0 02111 */ -/* val=reg | TOKEN_RESTART_DELAY; */ -/* bus_w(addr,val); */ -/* } */ -/* else { */ -/* //1b332214 */ -/* val=reg | ADCSYNC_CLEAN_FIFO_BITS | TOKEN_RESTART_DELAY_ROI; */ -/* bus_w(addr,val); */ -/* //1b032214 */ -/* val=reg | TOKEN_RESTART_DELAY_ROI; */ -/* bus_w(addr,val); */ - -/* } */ -/* reg=bus_r(addr); */ -/* //#ifdef DDEBUG */ -/* printf("ADC SYNC reg 0x19:%x\n",reg); */ -/* //#endif */ return OK; } -int setDAQRegister() -{ -/* u_int32_t addr, reg, val; */ -/* addr=CONFGAIN_REG; */ - -/* //depended on adcval */ -/* int packetlength=0x7f; */ -/* if(!ROI_flag) packetlength=0x13f; */ - -/* //depended on pcb rev */ -/* int tokenTiming = TOKEN_TIMING_REV2; */ -/* if((bus_r(PCB_REV_REG)&BOARD_REVISION_MASK)==1) */ -/* tokenTiming= TOKEN_TIMING_REV1; */ - - -/* val = (packetlength<<16) + tokenTiming; */ -/* //val=34+(42<<8)+(packetlength<<16); */ - -/* reg=bus_r(addr); */ -/* bus_w(addr,val); */ -/* reg=bus_r(addr); */ -/* //#ifdef VERBOSE */ -/* printf("DAQ reg 0x15:%x\n",reg); */ -/* //#endif */ - +int setDAQRegister(){ return OK; } // direct pattern output u_int32_t putout(char *s, int modnum) { - int i; - u_int32_t pat; - int addr; + int i; + u_int32_t pat; + int addr; - if (strlen(s)<16) { - fprintf(stdout," *** putout error: incorrect pattern length ***\n"); - fprintf(stdout," %s \n",s); - return FAIL; - } + if (strlen(s)<16) { + fprintf(stdout," *** putout error: incorrect pattern length ***\n"); + fprintf(stdout," %s \n",s); + return FAIL; + } - pat=0; - for (i=0;i<16;i++) { - if (s[i]=='1') pat=pat+(1<<(15-i)); - } - //addr=DAC_REG+(modnum<<4); - addr=DAC_REG;//+(modnum<2*l) { - h=l+1; - odd=1; - } - printf("Counter %d: Low is %d, High is %d\n",i, l,h); - - - val= (i<<18)| (odd<<17) | l | (h<<8); - - printf("Counter %d, val: %08x\n", i, val); - setPllReconfigReg(PLL_C_COUNTER_REG, val,0); - // usleep(20); - //change sync at the same time as - if (i>0) { - val= (2<<18)| (odd<<17) | l | (h<<8); - - printf("Counter %d, val: %08x\n", i, val); - setPllReconfigReg(PLL_C_COUNTER_REG, val,0); - - } - - } else { - // if (mode==1) { - // } else { - printf("phase in %d\n",clkPhase[1]); - - if (clkPhase[1]>0) { - inv=0; - phase=clkPhase[1]; - } else { - inv=1; - phase=-1*clkPhase[1]; - } - - printf("phase out %d %08x\n",phase,phase); - if (inv) { - val=phase | (1<<16);// | (inv<<21); - printf("**************** phase word %08x\n",val); - - // printf("Phase, val: %08x\n", val); - setPllReconfigReg(PLL_PHASE_SHIFT_REG,val,0); //shifts counter 0 - } else { - - - val=phase ;// | (inv<<21); - printf("**************** phase word %08x\n",val); - - // printf("Phase, val: %08x\n", val); - setPllReconfigReg(PLL_PHASE_SHIFT_REG,val,0); //shifts counter 0 -#ifndef NEW_PLL_RECONFIG - printf("Start reconfig\n"); setPllReconfigReg(PLL_START_REG, 1,0); - - // bus_w(PLL_CNTRL_REG, 0); - printf("Status register\n"); getPllReconfigReg(PLL_STATUS_REG,0); - // sleep(1); - - printf("PLL mode\n"); setPllReconfigReg(PLL_MODE_REG,1,0); - // usleep(10000); - -#endif - printf("**************** phase word %08x\n",val); - - val=phase | (2<<16);// | (inv<<21); - // printf("Phase, val: %08x\n", val); - setPllReconfigReg(PLL_PHASE_SHIFT_REG,val,0); //shifts counter 0 - } - - - } - -#ifndef NEW_PLL_RECONFIG - printf("Start reconfig\n"); setPllReconfigReg(PLL_START_REG, 1,0); - - // bus_w(PLL_CNTRL_REG, 0); - printf("Status register\n"); getPllReconfigReg(PLL_STATUS_REG,0); - // sleep(1); -#endif - // printf("PLL mode\n"); setPllReconfigReg(PLL_MODE_REG,0,0); - usleep(10000); - if (i<2) { - printf("reset pll\n"); - bus_w(PLL_CNTRL_REG,((1<2*l) { + h=l+1; + odd=1; + } + printf("Counter %d: Low is %d, High is %d\n",i, l,h); + val= (i<<18)| (odd<<17) | l | (h<<8); + printf("Counter %d, val: %08x\n", i, val); + setPllReconfigReg(PLL_C_COUNTER_REG, val,0); + // usleep(20); + //change sync at the same time as + if (i>0) { + val= (2<<18)| (odd<<17) | l | (h<<8); + printf("Counter %d, val: %08x\n", i, val); + setPllReconfigReg(PLL_C_COUNTER_REG, val,0); } - getClockDivider(ic); + } else { + // if (mode==1) { + // } else { + printf("phase in %d\n",clkPhase[1]); + + if (clkPhase[1]>0) { + inv=0; + phase=clkPhase[1]; + } else { + inv=1; + phase=-1*clkPhase[1]; + } + + printf("phase out %d %08x\n",phase,phase); + if (inv) { + val=phase | (1<<16);// | (inv<<21); + printf("**************** phase word %08x\n",val); + + // printf("Phase, val: %08x\n", val); + setPllReconfigReg(PLL_PHASE_SHIFT_REG,val,0); //shifts counter 0 + } else { + + + val=phase ;// | (inv<<21); + printf("**************** phase word %08x\n",val); + + // printf("Phase, val: %08x\n", val); + setPllReconfigReg(PLL_PHASE_SHIFT_REG,val,0); //shifts counter 0 +#ifndef NEW_PLL_RECONFIG + printf("Start reconfig\n"); setPllReconfigReg(PLL_START_REG, 1,0); + + // bus_w(PLL_CNTRL_REG, 0); + printf("Status register\n"); getPllReconfigReg(PLL_STATUS_REG,0); + // sleep(1); + + printf("PLL mode\n"); setPllReconfigReg(PLL_MODE_REG,1,0); + // usleep(10000); + +#endif + printf("**************** phase word %08x\n",val); + + val=phase | (2<<16);// | (inv<<21); + // printf("Phase, val: %08x\n", val); + setPllReconfigReg(PLL_PHASE_SHIFT_REG,val,0); //shifts counter 0 + } } +#ifndef NEW_PLL_RECONFIG + printf("Start reconfig\n"); setPllReconfigReg(PLL_START_REG, 1,0); - - - //u_int32_t l=0x0c; - //u_int32_t h=0x0d; - - u_int32_t tot= PLL_VCO_FREQ_MHZ/d; - - // int ic=0 is run clk; ic=1 is adc clk - printf("set clk divider %d to %d\n", ic, d); - if (ic>1) - return -1; - - if (ic==1 && d>40) - return -1; - - if (d>160) - return -1; - - if (tot>510) - return -1; - - if (tot<1) - return -1; - - - - clkDivider[ic]=d; - configurePll(ic); - - - - return clkDivider[ic]; + // bus_w(PLL_CNTRL_REG, 0); + printf("Status register\n"); getPllReconfigReg(PLL_STATUS_REG,0); + // sleep(1); +#endif + // printf("PLL mode\n"); setPllReconfigReg(PLL_MODE_REG,0,0); + usleep(10000); + if (i<2) { + printf("reset pll\n"); + bus_w(PLL_CNTRL_REG,((1<65535 || st<-65535) - return clkPhase[0]; + printf("\nSetting ADC Phase to %d\n",st); + if (st>65535 || st<-65535) + return clkPhase[0]; #ifdef NEW_PLL_RECONFIG - printf("reset pll\n"); - bus_w(PLL_CNTRL_REG,((1<1) - return -1; - return clkDivider[ic]; - - -/* int ic=0; */ -/* u_int32_t val; */ -/* u_int32_t l,h; */ - -/* printf("get clk divider\n"); */ - - -/* setPllReconfigReg(PLL_MODE_REG,1,0); */ -/* getPllReconfigReg(PLL_MODE_REG,0); */ - -/* u_int32_t addr=0xa; //c0 */ -/* if (ic>0) */ -/* addr=0xb; //c1 */ - -/* val=getPllReconfigReg(PLL_N_COUNTER_REG,0); */ -/* printf("Getting N counter %08x\n",val); */ - -/* l=val&0xff; */ -/* h=(val>>8)&0xff; */ - -/* //getPllReconfigReg(PLL_STATUS_REG,0); */ -/* val=getPllReconfigReg(addr,0); */ -/* printf("Getting C counter %08x\n",val); */ - - - -/* return 800/(l+h); */ - } u_int32_t adcPipeline(int d) { - if(myDetectorType == JUNGFRAU){ - if (d>=0) - bus_w(ADC_PIPELINE_REG, d); - return bus_r(ADC_PIPELINE_REG); - } - if (d>=0) - bus_w(DAQ_REG, d); - return bus_r(DAQ_REG)&0xff; + if (d>=0){ + printf("Setting ADC Pipeline to 0x%x\n",d); + bus_w(ADC_PIPELINE_REG, d); + clockdivider = d; + } + return bus_r(ADC_PIPELINE_REG); + } u_int32_t dbitPipeline(int d){ - if(myDetectorType != JUNGFRAU) - return 0; - if (d>=0) - bus_w(DBIT_PIPELINE_REG, d); - return bus_r(DBIT_PIPELINE_REG); + if (d>=0){ + printf("Setting DBIT Pipeline to 0x%x\n",d); + bus_w(DBIT_PIPELINE_REG, d); + } + return bus_r(DBIT_PIPELINE_REG); } u_int32_t setSetLength(int d) { - return 0; + return 0; } u_int32_t getSetLength() { - return 0; + return 0; } u_int32_t setOversampling(int d) { - if (d>=0 && d<=255) - bus_w(OVERSAMPLING_REG, d); + if (d>=0 && d<=255) + bus_w(OVERSAMPLING_REG, d); - return bus_r(OVERSAMPLING_REG); + return bus_r(OVERSAMPLING_REG); } u_int32_t setWaitStates(int d1) { - return 0; + return 0; } u_int32_t getWaitStates() { - return 0; + return 0; } u_int32_t setTotClockDivider(int d) { - return 0; + return 0; } u_int32_t getTotClockDivider() { - return 0; + return 0; } u_int32_t setTotDutyCycle(int d) { - return 0; + return 0; } u_int32_t getTotDutyCycle() { - return 0; + return 0; } u_int32_t setExtSignal(int d, enum externalSignalFlag mode) { - //int modes[]={EXT_SIG_OFF, EXT_GATE_IN_ACTIVEHIGH, EXT_GATE_IN_ACTIVELOW,EXT_TRIG_IN_RISING,EXT_TRIG_IN_FALLING,EXT_RO_TRIG_IN_RISING, EXT_RO_TRIG_IN_FALLING,EXT_GATE_OUT_ACTIVEHIGH, EXT_GATE_OUT_ACTIVELOW, EXT_TRIG_OUT_RISING, EXT_TRIG_OUT_FALLING, EXT_RO_TRIG_OUT_RISING, EXT_RO_TRIG_OUT_FALLING}; - // int off=d*SIGNAL_OFFSET; - u_int32_t c; c=bus_r(EXT_SIGNAL_REG); @@ -833,12 +604,7 @@ u_int32_t setExtSignal(int d, enum externalSignalFlag mode) { setTiming(GET_EXTERNAL_COMMUNICATION_MODE); } - -// if (mode<=RO_TRIGGER_OUT_FALLING_EDGE && mode>=0) -// bus_w(EXT_SIGNAL_REG,((modes[mode])<=0) { + if (mode<=RO_TRIGGER_OUT_FALLING_EDGE && mode>=0) { #ifdef VERBOSE - printf("writing signal register number %d mode %04x\n",d, modes[mode]); + printf("writing signal register number %d mode %04x\n",d, modes[mode]); #endif - bus_w(EXT_SIGNAL_REG,((modes[mode])<>off); - - if (mode=0 && d<4) { #ifdef VERBOSE printf("gettings signal variable number %d value %04x\n", d, signals[d]); @@ -883,27 +639,25 @@ int getExtSignal(int d) { return signals[d]; } else return -1; - - } int getFPGASignal(int d) { - int modes[]={SIGNAL_OFF, GATE_IN_ACTIVE_HIGH, GATE_IN_ACTIVE_LOW,TRIGGER_IN_RISING_EDGE, TRIGGER_IN_FALLING_EDGE,RO_TRIGGER_IN_RISING_EDGE, RO_TRIGGER_IN_FALLING_EDGE, GATE_OUT_ACTIVE_HIGH, GATE_OUT_ACTIVE_LOW, TRIGGER_OUT_RISING_EDGE, TRIGGER_OUT_FALLING_EDGE, RO_TRIGGER_OUT_RISING_EDGE,RO_TRIGGER_OUT_FALLING_EDGE}; + int modes[]={SIGNAL_OFF, GATE_IN_ACTIVE_HIGH, GATE_IN_ACTIVE_LOW,TRIGGER_IN_RISING_EDGE, TRIGGER_IN_FALLING_EDGE,RO_TRIGGER_IN_RISING_EDGE, RO_TRIGGER_IN_FALLING_EDGE, GATE_OUT_ACTIVE_HIGH, GATE_OUT_ACTIVE_LOW, TRIGGER_OUT_RISING_EDGE, TRIGGER_OUT_FALLING_EDGE, RO_TRIGGER_OUT_RISING_EDGE,RO_TRIGGER_OUT_FALLING_EDGE}; - int off=d*SIGNAL_OFFSET; - int mode=((bus_r(EXT_SIGNAL_REG)&(SIGNAL_MASK<>off); + int off=d*SIGNAL_OFFSET; + int mode=((bus_r(EXT_SIGNAL_REG)&(SIGNAL_MASK<>off); - if (mode<=RO_TRIGGER_OUT_FALLING_EDGE) { - if (modes[mode]!=SIGNAL_OFF && signals[d]!=MASTER_SLAVE_SYNCHRONIZATION) - signals[d]=modes[mode]; + if (mode<=RO_TRIGGER_OUT_FALLING_EDGE) { + if (modes[mode]!=SIGNAL_OFF && signals[d]!=MASTER_SLAVE_SYNCHRONIZATION) + signals[d]=modes[mode]; #ifdef VERYVERBOSE - printf("gettings signal register number %d value %04x\n", d, modes[mode]); + printf("gettings signal register number %d value %04x\n", d, modes[mode]); #endif - return modes[mode]; - } else - return -1; + return modes[mode]; + } else + return -1; } @@ -924,118 +678,122 @@ enum externalCommunicationMode{ GATE_WITH_START_TRIGGER, GATE_COINCIDENCE_WITH_INTERNAL_ENABLE }; -*/ + */ int setTiming(int ti) { + int ret=GET_EXTERNAL_COMMUNICATION_MODE; - int ret=GET_EXTERNAL_COMMUNICATION_MODE; + int g=-1, t=-1, rot=-1; - int g=-1, t=-1, rot=-1; + int i; - int i; + switch (ti) { + case AUTO_TIMING: + printf("\nSetting timing to auto\n"); + timingMode=ti; + // disable all gates/triggers in except if used for master/slave synchronization + for (i=0; i<4; i++) { + if (getFPGASignal(i)>0 && getFPGASignal(i)0 && getFPGASignal(i)=0 && t>=0 && rot<0) { - ret=GATE_WITH_START_TRIGGER; - } else if (g<0 && t>=0 && rot<0) { - ret=TRIGGER_EXPOSURE; - } else if (g>=0 && t<0 && rot<0) { - ret=GATE_FIX_NUMBER; - } else if (g<0 && t<0 && rot>0) { - ret=TRIGGER_READOUT; - } else if (g<0 && t<0 && rot<0) { - ret=AUTO_TIMING; - } + if (g>=0 && t>=0 && rot<0) { + ret=GATE_WITH_START_TRIGGER; + } else if (g<0 && t>=0 && rot<0) { + ret=TRIGGER_EXPOSURE; + } else if (g>=0 && t<0 && rot<0) { + ret=GATE_FIX_NUMBER; + } else if (g<0 && t<0 && rot>0) { + ret=TRIGGER_READOUT; + } else if (g<0 && t<0 && rot<0) { + ret=AUTO_TIMING; + } - // timingMode=ret; + // timingMode=ret; - return ret; + return ret; } @@ -1043,94 +801,68 @@ int setTiming(int ti) { int setConfigurationRegister(int d) { #ifdef VERBOSE - printf("Setting configuration register to %x",d); + printf("Setting configuration register to %x",d); #endif - if (d>=0) { - bus_w(CONFIG_REG,d); - } + if (d>=0) { + bus_w(CONFIG_REG,d); + } #ifdef VERBOSE - printf("configuration register is %x", bus_r(CONFIG_REG)); + printf("configuration register is %x", bus_r(CONFIG_REG)); #endif - return bus_r(CONFIG_REG); + return bus_r(CONFIG_REG); } int setToT(int d) { - //int ret=0; - int reg; + //int ret=0; + int reg; #ifdef VERBOSE - printf("Setting ToT to %d\n",d); + printf("Setting ToT to %d\n",d); #endif - reg=bus_r(CONFIG_REG); + reg=bus_r(CONFIG_REG); #ifdef VERBOSE - printf("Before: ToT is %x\n", reg); + printf("Before: ToT is %x\n", reg); #endif - if (d>0) { - bus_w(CONFIG_REG,reg|TOT_ENABLE_BIT); - } else if (d==0) { - bus_w(CONFIG_REG,reg&(~TOT_ENABLE_BIT)); - } - reg=bus_r(CONFIG_REG); + if (d>0) { + bus_w(CONFIG_REG,reg|TOT_ENABLE_BIT); + } else if (d==0) { + bus_w(CONFIG_REG,reg&(~TOT_ENABLE_BIT)); + } + reg=bus_r(CONFIG_REG); #ifdef VERBOSE - printf("ToT is %x\n", reg); + printf("ToT is %x\n", reg); #endif - if (reg&TOT_ENABLE_BIT) - return 1; - else - return 0; + if (reg&TOT_ENABLE_BIT) + return 1; + else + return 0; } int setContinousReadOut(int d) { - //int ret=0; - int reg; + //int ret=0; + int reg; #ifdef VERBOSE - printf("Setting Continous readout to %d\n",d); + printf("Setting Continous readout to %d\n",d); #endif - reg=bus_r(CONFIG_REG); + reg=bus_r(CONFIG_REG); #ifdef VERBOSE - printf("Before: Continous readout is %x\n", reg); + printf("Before: Continous readout is %x\n", reg); #endif - if (d>0) { - bus_w(CONFIG_REG,reg|CONT_RO_ENABLE_BIT); - } else if (d==0) { - bus_w(CONFIG_REG,reg&(~CONT_RO_ENABLE_BIT)); - } - reg=bus_r(CONFIG_REG); + if (d>0) { + bus_w(CONFIG_REG,reg|CONT_RO_ENABLE_BIT); + } else if (d==0) { + bus_w(CONFIG_REG,reg&(~CONT_RO_ENABLE_BIT)); + } + reg=bus_r(CONFIG_REG); #ifdef VERBOSE - printf("Continous readout is %x\n", reg); + printf("Continous readout is %x\n", reg); #endif - if (reg&CONT_RO_ENABLE_BIT) - return 1; - else - return 0; + if (reg&CONT_RO_ENABLE_BIT) + return 1; + else + return 0; } -int startReceiver(int start) { - u_int32_t addr=CONFIG_REG; -#ifdef VERBOSE - if(start) - printf("Setting up detector to send to Receiver\n"); - else - printf("Setting up detector to send to CPU\n"); -#endif - int reg=bus_r(addr); - //for start recever, write 0 and for stop, write 1 - if (!start) - bus_w(CONFIG_REG,reg&(~GB10_NOT_CPU_BIT)); - else - bus_w(CONFIG_REG,reg|GB10_NOT_CPU_BIT); - - reg=bus_r(addr); -//#ifdef VERBOSE - printf("Config Reg %x\n", reg); -//#endif - int d =reg&GB10_NOT_CPU_BIT; - if(d!=0) d=1; - if(d!=start) - return OK; - else - return FAIL; -} u_int64_t getDetectorNumber() { @@ -1151,245 +883,205 @@ u_int64_t getDetectorNumber() { } u_int32_t getFirmwareVersion() { - return bus_r(FPGA_VERSION_REG); + return bus_r(FPGA_VERSION_REG); } u_int32_t getFirmwareSVNVersion(){ - return bus_r(FPGA_SVN_REG); + return bus_r(FPGA_SVN_REG); } // for fpga test u_int32_t testFpga(void) { - printf("Testing FPGA:\n"); - volatile u_int32_t val,addr,val2; - int result=OK,i; - //fixed pattern - val=bus_r(FIX_PATT_REG); - if (val==FIXED_PATT_VAL) { - printf("fixed pattern ok!! %08x\n",val); - } else { - printf("fixed pattern wrong!! %08x\n",val); - result=FAIL; - } + printf("Testing FPGA:\n"); + volatile u_int32_t val,addr,val2; + int result=OK,i; + //fixed pattern + val=bus_r(FIX_PATT_REG); + if (val==FIXED_PATT_VAL) { + printf("fixed pattern ok!! %08x\n",val); + } else { + printf("fixed pattern wrong!! %08x\n",val); + result=FAIL; + } - //dummy register - addr = DUMMY_REG; - for(i=0;i<1000000;i++) - { - val=0x5A5A5A5A-i; - bus_w(addr, val); - val=bus_r(addr); - if (val!=0x5A5A5A5A-i) { - printf("ATTEMPT:%d:\tFPGA dummy register wrong!! %x instead of %x \n",i,val,0x5A5A5A5A-i); - result=FAIL; - } - val=(i+(i<<10)+(i<<20)); - bus_w(addr, val); - val2=bus_r(addr); - if (val2!=val) { - printf("ATTEMPT:%d:\tFPGA dummy register wrong!! read %x instead of %x.\n",i,val2,val); - result=FAIL; - } - val=0x0F0F0F0F; - bus_w(addr, val); - val=bus_r(addr); - if (val!=0x0F0F0F0F) { - printf("ATTEMPT:%d:\tFPGA dummy register wrong!! %x instead of 0x0F0F0F0F \n",i,val); - result=FAIL; - } - val=0xF0F0F0F0; - bus_w(addr, val); - val=bus_r(addr); - if (val!=0xF0F0F0F0) { - printf("ATTEMPT:%d:\tFPGA dummy register wrong!! %x instead of 0xF0F0F0F0 \n\n",i,val); - result=FAIL; - } - } - if(result==OK) - { - printf("----------------------------------------------------------------------------------------------"); - printf("\nATTEMPT 1000000: FPGA DUMMY REGISTER OK!!!\n"); - printf("----------------------------------------------------------------------------------------------"); - } - printf("\n"); - return result; + //dummy register + addr = DUMMY_REG; + for(i=0;i<1000000;i++) + { + val=0x5A5A5A5A-i; + bus_w(addr, val); + val=bus_r(addr); + if (val!=0x5A5A5A5A-i) { + printf("ATTEMPT:%d:\tFPGA dummy register wrong!! %x instead of %x \n",i,val,0x5A5A5A5A-i); + result=FAIL; + } + val=(i+(i<<10)+(i<<20)); + bus_w(addr, val); + val2=bus_r(addr); + if (val2!=val) { + printf("ATTEMPT:%d:\tFPGA dummy register wrong!! read %x instead of %x.\n",i,val2,val); + result=FAIL; + } + val=0x0F0F0F0F; + bus_w(addr, val); + val=bus_r(addr); + if (val!=0x0F0F0F0F) { + printf("ATTEMPT:%d:\tFPGA dummy register wrong!! %x instead of 0x0F0F0F0F \n",i,val); + result=FAIL; + } + val=0xF0F0F0F0; + bus_w(addr, val); + val=bus_r(addr); + if (val!=0xF0F0F0F0) { + printf("ATTEMPT:%d:\tFPGA dummy register wrong!! %x instead of 0xF0F0F0F0 \n\n",i,val); + result=FAIL; + } + } + if(result==OK) + { + printf("----------------------------------------------------------------------------------------------"); + printf("\nATTEMPT 1000000: FPGA DUMMY REGISTER OK!!!\n"); + printf("----------------------------------------------------------------------------------------------"); + } + printf("\n"); + return result; } -// for fpga test u_int32_t testRAM(void) { - int result=OK; - - printf("TestRAM not implemented\n"); - -/* int i=0; - allocateRAM(); - // while(i<100000) { - memcpy(ram_values, values, dataBytes); - printf ("Testing RAM:\t%d: copied fifo %x to memory %x size %d\n",i++, (unsigned int)(values), (unsigned int)(ram_values), dataBytes); - // } - * -*/ - return result; + int result=OK; + printf("TestRAM not implemented\n"); + return result; } int getNModBoard() { -if(myDetectorType == JUNGFRAU) return 1; -else - return 32;//nModX; } int setNMod(int n) { - -/* printf("Writin ADC disable register %08x\n",n); */ -/* bus_w(ADC_LATCH_DISABLE_REG,n); */ - return getNMod(); + return 1; } int getNMod() { -/* u_int32_t reg; */ -/* int i; */ -/* reg=bus_r(ADC_LATCH_DISABLE_REG); */ - -/* printf("Read ADC disable register %08x\n",reg); */ -/* nModX=32; */ -/* for (i=0; i<32; i++) { */ -/* if (reg & (1<> 32; - vMSB=v64&(0xffffffff); - bus_w(aMSB,vMSB); - } - return get64BitReg(aLSB, aMSB); + int64_t v64; + u_int32_t vLSB,vMSB; + if (value!=-1) { + vLSB=value&(0xffffffff); + bus_w(aLSB,vLSB); + v64=value>> 32; + vMSB=v64&(0xffffffff); + bus_w(aMSB,vMSB); + } + return get64BitReg(aLSB, aMSB); } int64_t get64BitReg(int aLSB, int aMSB){ - int64_t v64; - u_int32_t vLSB,vMSB; - vLSB=bus_r(aLSB); - vMSB=bus_r(aMSB); - v64=vMSB; - v64=(v64<<32) | vLSB; + int64_t v64; + u_int32_t vLSB,vMSB; + vLSB=bus_r(aLSB); + vMSB=bus_r(aMSB); + v64=vMSB; + v64=(v64<<32) | vLSB; - printf("reg64(%x,%x) %x %x %llx\n", aLSB, aMSB, vLSB, vMSB, v64); + printf("reg64(%x,%x) %x %x %llx\n", aLSB, aMSB, vLSB, vMSB, v64); - return v64; + return v64; } int64_t setFrames(int64_t value){ - return set64BitReg(value, SET_FRAMES_LSB_REG, SET_FRAMES_MSB_REG); + if(value!=-1) + printf("\nSetting number of frames to %lld\n",(long long int)value); + return set64BitReg(value, SET_FRAMES_LSB_REG, SET_FRAMES_MSB_REG); } int64_t getFrames(){ - /*printf("gf");*/ - return get64BitReg(GET_FRAMES_LSB_REG, GET_FRAMES_MSB_REG); + return get64BitReg(GET_FRAMES_LSB_REG, GET_FRAMES_MSB_REG); } int64_t setExposureTime(int64_t value){ - /* time is in ns */ - if (value!=-1) - value*=(1E-3*clkDivider[0]);//(1E-9*CLK_FREQ); - return set64BitReg(value,SET_EXPTIME_LSB_REG, SET_EXPTIME_MSB_REG)/(1E-3*clkDivider[0]);//(1E-9*CLK_FREQ); + if (value!=-1){ + printf("\nSetting exptime to %lld\n",(long long int)value); + value*=(1E-3*clockdivider); + } + return set64BitReg(value,SET_EXPTIME_LSB_REG, SET_EXPTIME_MSB_REG)/(1E-3*clockdivider);//(1E-9*CLK_FREQ); } int64_t getExposureTime(){ - return get64BitReg(GET_EXPTIME_LSB_REG, GET_EXPTIME_MSB_REG)/(1E-3*clkDivider[0]);//(1E-9*CLK_FREQ); + return get64BitReg(GET_EXPTIME_LSB_REG, GET_EXPTIME_MSB_REG)/(1E-3*clockdivider);//(1E-9*CLK_FREQ); } int64_t setGates(int64_t value){ - return set64BitReg(value, SET_GATES_LSB_REG, SET_GATES_MSB_REG); + if(value!=-1) + printf("\nSetting number of gates to %lld\n",(long long int)value); + return set64BitReg(value, SET_GATES_LSB_REG, SET_GATES_MSB_REG); } int64_t getGates(){ - return get64BitReg(GET_GATES_LSB_REG, GET_GATES_MSB_REG); + return get64BitReg(GET_GATES_LSB_REG, GET_GATES_MSB_REG); } int64_t setPeriod(int64_t value){ - /* time is in ns */ - if (value!=-1) { - // value*=(1E-9*CLK_FREQ); - value*=(1E-3*clkDivider[1]); - } - if (value%2==0) { - - printf("Adding one to period: was %08llx ", value); - value+=1; - printf("now is %08llx\n ", value); - - - } else - printf("Period already even is %08llx\n ", value); - - - return set64BitReg(value,SET_PERIOD_LSB_REG, SET_PERIOD_MSB_REG)/(1E-3*clkDivider[0]);//(1E-9*CLK_FREQ); + if (value!=-1){ + printf("\nSetting period to %lld\n",(long long int)value); + value*=(1E-3*clockdivider); + } + return set64BitReg(value,SET_PERIOD_LSB_REG, SET_PERIOD_MSB_REG)/(1E-3*clockdivider);//(1E-9*CLK_FREQ); } int64_t getPeriod(){ - return get64BitReg(GET_PERIOD_LSB_REG, GET_PERIOD_MSB_REG)/(1E-3*clkDivider[0]);//(1E-9*CLK_FREQ); + return get64BitReg(GET_PERIOD_LSB_REG, GET_PERIOD_MSB_REG)/(1E-3*clockdivider);//(1E-9*CLK_FREQ); } int64_t setDelay(int64_t value){ - /* time is in ns */ - if (value!=-1) { - value*=(1E-3*clkDivider[1]);//(1E-9*CLK_FREQ); - } - return set64BitReg(value,SET_DELAY_LSB_REG, SET_DELAY_MSB_REG)/(1E-3*clkDivider[0]);//(1E-9*CLK_FREQ); + if (value!=-1){ + printf("\nSetting delay to %lld\n",(long long int)value); + value*=(1E-3*clockdivider); + } + return set64BitReg(value,SET_DELAY_LSB_REG, SET_DELAY_MSB_REG)/(1E-3*clockdivider);//(1E-9*CLK_FREQ); } int64_t getDelay(){ - return get64BitReg(GET_DELAY_LSB_REG, GET_DELAY_MSB_REG)/(1E-3*clkDivider[0]);//(1E-9*CLK_FREQ); + return get64BitReg(GET_DELAY_LSB_REG, GET_DELAY_MSB_REG)/(1E-3*clockdivider);//(1E-9*CLK_FREQ); } int64_t setTrains(int64_t value){ - return set64BitReg(value, SET_CYCLES_LSB_REG, SET_CYCLES_MSB_REG); + if(value!=-1) + printf("\nSetting number of cycles to %lld\n",(long long int)value); + return set64BitReg(value, SET_CYCLES_LSB_REG, SET_CYCLES_MSB_REG); } int64_t getTrains(){ - return get64BitReg(GET_CYCLES_LSB_REG, GET_CYCLES_MSB_REG); + return get64BitReg(GET_CYCLES_LSB_REG, GET_CYCLES_MSB_REG); } int64_t setProbes(int64_t value){ - return 0; + return 0; } int64_t setProgress() { - - //????? eventually call after setting the registers - -return 0; + return 0; } @@ -1397,337 +1089,235 @@ return 0; int64_t getProgress() { - //should be done in firmware!!!! + //should be done in firmware!!!! return 0; } int64_t getActualTime(){ - return get64BitReg(GET_ACTUAL_TIME_LSB_REG, GET_ACTUAL_TIME_MSB_REG)/(1E-9*CLK_FREQ); + return get64BitReg(GET_ACTUAL_TIME_LSB_REG, GET_ACTUAL_TIME_MSB_REG)/(1E-9*CLK_FREQ); } int64_t getMeasurementTime(){ - int64_t v=get64BitReg(GET_MEASUREMENT_TIME_LSB_REG, GET_MEASUREMENT_TIME_MSB_REG); - // int64_t mask=0x8000000000000000; - // if (v & mask ) { - //#ifdef VERBOSE - // printf("no measurement time left\n"); - //#endif - // return -1E+9; - // } else - return v/(1E-9*CLK_FREQ); + int64_t v=get64BitReg(GET_MEASUREMENT_TIME_LSB_REG, GET_MEASUREMENT_TIME_MSB_REG); + return v/(1E-9*CLK_FREQ); } int64_t getFramesFromStart(){ - int64_t v=get64BitReg(FRAMES_FROM_START_LSB_REG, FRAMES_FROM_START_MSB_REG); - int64_t v1=get64BitReg(FRAMES_FROM_START_PG_LSB_REG, FRAMES_FROM_START_PG_MSB_REG); + int64_t v=get64BitReg(FRAMES_FROM_START_LSB_REG, FRAMES_FROM_START_MSB_REG); + int64_t v1=get64BitReg(FRAMES_FROM_START_PG_LSB_REG, FRAMES_FROM_START_PG_MSB_REG); - printf("Frames from start data streaming %lld\n",v); - printf("Frames from start run control %lld\n",v1); + printf("Frames from start data streaming %lld\n",v); + printf("Frames from start run control %lld\n",v1); - // int64_t mask=0x8000000000000000; - // if (v & mask ) { - //#ifdef VERBOSE - // printf("no measurement time left\n"); - //#endif - // return -1E+9; - // } else - return v; + return v; } ROI *setROI(int nroi,ROI* arg,int *retvalsize, int *ret) { - - if(myDetectorType == JUNGFRAU) - cprintf(RED,"ROI Not implemented for Jungfrau yet\n"); - return NULL; - - - ROI retval[MAX_ROIS]; - int i, ich; - adcDisableMask=0xfffffffff; /*warning: integer constant is too large for ‘long’ type,warning: large integer implicitly truncated to unsigned type*/ - - printf("Setting ROI\n"); - if (nroi>=0) { - if (nroi==0) { - adcDisableMask=0; - } else { - for (i=0; i=0 && ichMAX_ROIS) { - *retvalsize-=1; - break; - } - retval[*retvalsize-1].xmin=ich; - retval[*retvalsize-1].xmax=ich; - } else { - if ((adcDisableMask)&(1<<(ich-1))) { - *retvalsize+=1; - if (*retvalsize>MAX_ROIS) { - *retvalsize-=1; - break; - } - retval[*retvalsize-1].xmin=ich; - } - retval[*retvalsize-1].xmax=ich; - } - } - } - getDynamicRange(); - return retval;/*warning: function returns address of local variable*/ - + cprintf(RED,"ROI Not implemented yet\n"); + return NULL; } int loadImage(int index, short int ImageVals[]){ - printf("loadImage Not implemented yet\n"); - - /* - u_int32_t address; - switch (index) { - case DARK_IMAGE : - address = DARK_IMAGE_REG; - break; - case GAIN_IMAGE : - address = GAIN_IMAGE_REG; - break; - } - volatile u_int16_t *ptr; - ptr=(u_int16_t*)(CSP0BASE+address*2); -#ifdef VERBOSE - int i; - for(i=0;i<6;i++) - printf("%d:%d\t",i,ImageVals[i]); -#endif - memcpy(ptr,ImageVals ,dataBytes); -#ifdef VERBOSE - printf("\nLoaded x%08x address with image of index %d\n",(unsigned int)(ptr),index); -#endif - */ - return OK; } int64_t getProbes(){ - return 0; + return 0; } int setDACRegister(int idac, int val, int imod) { - u_int32_t addr, reg, mask; - int off; + u_int32_t addr, reg, mask; + int off; #ifdef VERBOSE - if(val==-1) - printf("Getting dac register%d module %d\n",idac,imod); - else - printf("Setting dac register %d module %d to %d\n",idac,imod,val); + if(val==-1) + printf("Getting dac register%d module %d\n",idac,imod); + else + printf("Setting dac register %d module %d to %d\n",idac,imod,val); #endif - switch(idac){ - case 0: - case 1: - case 2: - addr=MOD_DACS1_REG; - break; - case 3: - case 4: - case 5: - addr=MOD_DACS2_REG; - break; - case 6: - case 7: - addr=MOD_DACS3_REG; - break; - default: - printf("weird idac value %d\n",idac); - return -1; - break; - } - //saving only the msb - val=val>>2; + switch(idac){ + case 0: + case 1: + case 2: + addr=MOD_DACS1_REG; + break; + case 3: + case 4: + case 5: + addr=MOD_DACS2_REG; + break; + case 6: + case 7: + addr=MOD_DACS3_REG; + break; + default: + printf("weird idac value %d\n",idac); + return -1; + break; + } + //saving only the msb + val=val>>2; - off=(idac%3)*10; - mask=~((0x3ff)<=0 && val>off)&0x3ff; - //since we saved only the msb - val=val<<2; + if (val>=0 && val>off)&0x3ff; + //since we saved only the msb + val=val<<2; - //val=(bus_r(addr)>>off)&0x3ff; + //val=(bus_r(addr)>>off)&0x3ff; #ifdef VERBOSE - printf("Dac %d module %d register is %d\n\n",idac,imod,val); + printf("Dac %d module %d register is %d\n\n",idac,imod,val); #endif - return val; + return val; } int getTemperature(int tempSensor, int imod){ - int val; - imod=0;//ignoring more than 1 mod for now - int i,j,repeats=6; - u_int32_t tempVal=0; + int val; + imod=0;//ignoring more than 1 mod for now + int i,j,repeats=6; + u_int32_t tempVal=0; #ifdef VERBOSE - char cTempSensor[2][100]={"ADCs/ASICs","VRs/FPGAs"}; - printf("Getting Temperature of module:%d for the %s for tempsensor:%d\n",imod,cTempSensor[tempSensor],tempSensor); + char cTempSensor[2][100]={"ADCs/ASICs","VRs/FPGAs"}; + printf("Getting Temperature of module:%d for the %s for tempsensor:%d\n",imod,cTempSensor[tempSensor],tempSensor); #endif - bus_w(TEMP_IN_REG,(T1_CLK_BIT)|(T1_CS_BIT)|(T2_CLK_BIT)|(T2_CS_BIT));//standby - bus_w(TEMP_IN_REG,((T1_CLK_BIT)&~(T1_CS_BIT))|(T2_CLK_BIT));//high clk low cs + bus_w(TEMP_IN_REG,(T1_CLK_BIT)|(T1_CS_BIT)|(T2_CLK_BIT)|(T2_CS_BIT));//standby + bus_w(TEMP_IN_REG,((T1_CLK_BIT)&~(T1_CS_BIT))|(T2_CLK_BIT));//high clk low cs - for(i=0;i<20;i++) { - //repeats is number of register writes for delay - for(j=0;j>1);//fpga - } - } + if(i<=10){//only the first time + if(!tempSensor) + tempVal= (tempVal<<1) + (bus_r(TEMP_OUT_REG) & (1));//adc + else + tempVal= (tempVal<<1) + ((bus_r(TEMP_OUT_REG) & (2))>>1);//fpga + } + } - bus_w(TEMP_IN_REG,(T1_CLK_BIT)|(T1_CS_BIT)|(T2_CLK_BIT)|(T2_CS_BIT));//standby - val=((int)tempVal)/4.0; + bus_w(TEMP_IN_REG,(T1_CLK_BIT)|(T1_CS_BIT)|(T2_CLK_BIT)|(T2_CS_BIT));//standby + val=((int)tempVal)/4.0; #ifdef VERBOSE - printf("Temperature of module:%d for the %s is %.2fC\n",imod,cTempSensor[tempSensor],val); + printf("Temperature of module:%d for the %s is %.2fC\n",imod,cTempSensor[tempSensor],val); #endif - return val; + return val; } int initHighVoltage(int val, int imod){ - - u_int32_t offw,codata; - u_int16_t valw, dacvalue; - int iru,i,ddx,csdx,cdx; - float alpha=0.55, fval=val; - if (val>=0) { - - if (val<60) { - dacvalue=0; - val=60; - } else if (val>=200) { - dacvalue=0x1; - val=200; - } else { - dacvalue=1.+(200.-val)/alpha; - val=200.-(dacvalue-1)*alpha; - } - printf ("****************************** setting val %d, dacval %d\n",val, dacvalue); - offw=DAC_REG; - - ddx=8; csdx=10; cdx=9; - codata=((dacvalue)&0xff); - + u_int32_t offw,codata; + u_int16_t valw, dacvalue; + int i,ddx,csdx,cdx; + float alpha=0.55; - - - valw=0xffff; bus_w(offw,(valw)); // start point - valw=((valw&(~(0x1<>(7-i))&0x1)<=0) { + if (val<60) { + dacvalue=0; + val=60; + } else if (val>=200) { + dacvalue=0x1; + val=200; + } else { + dacvalue=1.+(200.-val)/alpha; + val=200.-(dacvalue-1)*alpha; + } + printf ("****************************** setting val %d, dacval %d\n",val, dacvalue); + offw=DAC_REG; - - valw=0xffff; bus_w(offw,(valw)); // stop point =start point of course */ - - - printf("Writing %d in HVDAC \n",dacvalue); - - bus_w(HV_REG,val); - } + ddx=8; csdx=10; cdx=9; + codata=((dacvalue)&0xff); - return bus_r(HV_REG); + + valw=0xffff; bus_w(offw,(valw)); // start point + valw=((valw&(~(0x1<>(7-i))&0x1)<>JUNGFRAU_SPEED_GAIN_OFFSET); + retval=((bus_r(addr)&SPEED_GAIN_MASK)>>SPEED_GAIN_OFFSET); //#ifdef VERBOSE - printf("Value read from Speed of Gain reg is %d\n",retval); - printf("Gain Reg Value is %d\n",bus_r(addr)); + printf("Value read from Speed of Gain reg is 0x%x\n",retval); + printf("Gain Reg Value is 0x%x\n",bus_r(addr)); //#endif return retval; } @@ -1742,36 +1332,14 @@ int setADC(int adc){ // setDAQRegister();//token timing cleanFifo();//adc sync - //with gotthard module - if(withGotthard){ - //set packet size - ipPacketSize= DEFAULT_IP_PACKETSIZE; - udpPacketSize=DEFAULT_UDP_PACKETSIZE; - //set channel mask - nchips = GOTTHARDNCHIP; - nchans = GOTTHARDNCHAN; - mask = ACTIVE_ADC_MASK; - } - //with moench module all adc - else{/* if(adc==-1){*/ - //set packet size - ipPacketSize= DEFAULT_IP_PACKETSIZE; - udpPacketSize=DEFAULT_UDP_PACKETSIZE; - //set channel mask - nchips = N_CHIP; - nchans = N_CHANS; - mask = ACTIVE_ADC_MASK; - }/* - //with moench module 1 adc -- NOT IMPLEMENTED - else{ - ipPacketSize= ADC1_IP_PACKETSIZE; - udpPacketSize=ADC1_UDP_PACKETSIZE; - //set channel mask - nchips = NCHIPS_PER_ADC; - nchans = GOTTHARDNCHAN; - mask = 1< 1 ) { - sum += *addr++; - count -= 2; - } - if( count > 0 ) sum += *addr; // Add left-over byte, if any - while (sum>>16) sum = (sum & 0xffff) + (sum >> 16);// Fold 32-bit sum to 16 bits - checksum = (~sum)&0xffff; + count=sizeof(ip); + addr=&(ip); /* warning: assignment from incompatible pointer type */ + while( count > 1 ) { + sum += *addr++; + count -= 2; + } + if( count > 0 ) sum += *addr; // Add left-over byte, if any + while (sum>>16) sum = (sum & 0xffff) + (sum >> 16);// Fold 32-bit sum to 16 bits + checksum = (~sum)&0xffff; - printf("IP checksum is 0x%lx\n",checksum); + printf("IP checksum is 0x%lx\n",checksum); - return checksum; + return checksum; } #ifdef NEW_GBE_INTERFACE int writeGbeReg(int ivar, uint32_t val, int addr, int interface) { -/* #define GBE_CTRL_WSTROBE 0 */ -/* #define GBE_CTRL_VAR_OFFSET 16 */ -/* #define GBE_CTRL_VAR_MASK 0XF */ -/* #define GBE_CTRL_RAMADDR_OFFSET 24 */ -/* #define GBE_CTRL_RAMADDR_MASK 0X3F */ -/* #define GBE_CTRL_INTERFACE 23 */ - uint32_t ctrl=((ivar&GBE_CTRL_VAR_MASK)<>32)&0xFFFFFFFF; - vals[IPCHECKSUM_ADDR]=checksum; - vals[GBE_DELAY_ADDR]=0; - vals[GBE_RESERVED1_ADDR]=sourceport; - vals[GBE_RESERVED2_ADDR]=interface; - vals[DETECTOR_MAC_L_ADDR]=(sourcemac)&0xFFFFFFFF; - vals[DETECTOR_MAC_H_ADDR]=(sourcemac>>32)&0xFFFFFFFF; - vals[DETECTOR_IP_ADDR]=sourceip; + printf("Configure interface %d\n",interface); + const int nvar=12; + uint32_t vals[nvar]; + int ivar; + int addr=0; + vals[RX_UDP_IP_ADDR]=destip; + vals[RX_UDP_PORTS_ADDR]=destport; + vals[RX_UDP_MAC_L_ADDR]=(destmac)&0xFFFFFFFF; + vals[RX_UDP_MAC_H_ADDR]=(destmac>>32)&0xFFFFFFFF; + vals[IPCHECKSUM_ADDR]=checksum; + vals[GBE_DELAY_ADDR]=0; + vals[GBE_RESERVED1_ADDR]=sourceport; + vals[GBE_RESERVED2_ADDR]=interface; + vals[DETECTOR_MAC_L_ADDR]=(sourcemac)&0xFFFFFFFF; + vals[DETECTOR_MAC_H_ADDR]=(sourcemac>>32)&0xFFFFFFFF; + vals[DETECTOR_IP_ADDR]=sourceip; + + for (ivar=0; ivar>32)&0xFFFFFFFF);//rx_udpmacH_AReg_c - bus_w(RX_UDPMACL_AREG,(destmac)&0xFFFFFFFF);//rx_udpmacL_AReg_c - bus_w(DETECTORMACH_AREG,(sourcemac>>32)&0xFFFFFFFF);//detectormacH_AReg_c - bus_w(DETECTORMACL_AREG,(sourcemac)&0xFFFFFFFF);//detectormacL_AReg_c - bus_w(UDPPORTS_AREG,((sourceport&0xFFFF)<<16)+(destport&0xFFFF));//udpports_AReg_c - bus_w(IPCHKSUM_AREG,(checksum&0xFFFF));//ipchksum_AReg_c + bus_w(RX_UDPMACH_AREG,(destmac>>32)&0xFFFFFFFF);//rx_udpmacH_AReg_c + bus_w(RX_UDPMACL_AREG,(destmac)&0xFFFFFFFF);//rx_udpmacL_AReg_c + bus_w(DETECTORMACH_AREG,(sourcemac>>32)&0xFFFFFFFF);//detectormacH_AReg_c + bus_w(DETECTORMACL_AREG,(sourcemac)&0xFFFFFFFF);//detectormacL_AReg_c + bus_w(UDPPORTS_AREG,((sourceport&0xFFFF)<<16)+(destport&0xFFFF));//udpports_AReg_c + bus_w(IPCHKSUM_AREG,(checksum&0xFFFF));//ipchksum_AReg_c #endif - bus_w(CONTROL_REG,GB10_RESET_BIT); - sleep(1); - bus_w(CONTROL_REG,0); - usleep(10000); - bus_w(CONFIG_REG,conf | GB10_NOT_CPU_BIT); - printf("System status register is %08x\n",bus_r(SYSTEM_STATUS_REG)); + bus_w(CONTROL_REG,GB10_RESET_BIT); + sleep(1); + bus_w(CONTROL_REG,0); + usleep(10000); + bus_w(CONFIG_REG,conf | GB10_NOT_CPU_BIT); + printf("System status register is %08x\n",bus_r(SYSTEM_STATUS_REG)); -return 0; //any value doesnt matter - dhanya + return 0; //any value doesnt matter - dhanya } @@ -1915,35 +1483,30 @@ return 0; //any value doesnt matter - dhanya int configureMAC(uint32_t destip,uint64_t destmac,uint64_t sourcemac,int sourceip,int ival,uint32_t destport) { -//int configureMAC(int ipad,long long int macad,long long int detectormacad, int detipad, int ival, int udpport){ - - uint32_t sourceport = 0x7e9a; // 0xE185; - int interface=0; - int ngb; -volatile u_int32_t conf= bus_r(CONFIG_REG); - - - + //int configureMAC(int ipad,long long int macad,long long int detectormacad, int detipad, int ival, int udpport){ + uint32_t sourceport = 0x7e9a; // 0xE185; + int interface=0; + int ngb; + volatile u_int32_t conf= bus_r(CONFIG_REG); #ifdef NEW_GBE_INTERFACE - ngb=2; - printf("--------- New XGB interface\n"); + ngb=2; + printf("--------- New XGB interface\n"); #else - ngb=1; - printf("********* Old XGB interface\n"); + ngb=1; + printf("********* Old XGB interface\n"); #endif - for (interface=0; interface >((i)*2))==3) { *\/ */ -/* /\* i++; *\/ */ -/* /\* if (i>15) *\/ */ -/* /\* break; *\/ */ -/* /\* } *\/ */ -/* /\* if (i<16) { *\/ */ -/* bus_w16(DUMMY_REG,i); */ -/* } */ -/* val=*values; */ - - - // bus_w16(DUMMY_REG,0); // - for (i=0; i<16; i++) { - - - // bus_w16(DUMMY_REG,i); - // bus_r16(DUMMY_REG); -/* dum=(((u_int16_t*)(now_ptr))+i); */ -/* *dum=bus_r16(FIFO_DATA_REG); */ -/* a=bus_r16(FIFO_DATA_REG); */ - //dum=(((u_int32_t*)(now_ptr))+i); - - // a=*values;//bus_r(FIFO_DATA_REG); - // if ((adcDisableMask&(3<<(i*2)))==0) { - *((u_int32_t*)now_ptr)=*values;//bus_r(FIFO_DATA_REG); - - - if (i!=0 || ns!=0) { - a=0; - while (*((u_int32_t*)now_ptr)==*((u_int32_t*)(now_ptr)-1) && a++<10) { - - // printf("******************** %d: fifo %d: new %08x old %08x\n ",ns, i, *((u_int32_t*)now_ptr),*((u_int32_t*)(now_ptr)-1)); - *((u_int32_t*)now_ptr)=*values; - // printf("%d-",i); - - } - } - now_ptr+=4; - // } -/* while (((adcDisableMask&(3<<((i+1)*2)))>>((i+1)*2))==3) { */ -/* i++; */ -/* } */ - - // if (((adcDisableMask&(3<<((i+1)*2)))>>((i+1)*2))!=3) { - - bus_w16(DUMMY_REG,i+1); - // } - // *(((u_int16_t*)(now_ptr))+i)=bus_r16(FIFO_DATA_REG); - } - // bus_w16(DUMMY_REG,0); // -/* #ifdef TIMEDBG */ - -/* gettimeofday(&tss,NULL); */ -/* printf("read data loop = %ld usec\n",(tss.tv_usec) - (tse.tv_usec)); */ - -/* #endif */ -#ifdef VERBOSE - printf("*"); -#endif - return ram_values; } -u_int16_t* fifo_read_frame() -{ -#ifdef TIMEDBG - gettimeofday(&tsss,NULL); -#endif - - // u_int16_t *dum; - int ns=0; - now_ptr=(char*)ram_values; - while(ns>(ipos))&0x1; - ichan++; - } - } - break; - case 4: - for (ibyte=0; ibyte>(ipos*4))&0xf; - ichan++; - } - } - break; - case 8: - for (ichan=0; ichan>(ipos))&0x1; + ichan++; + } + } + break; + case 4: + for (ibyte=0; ibyte>(ipos*4))&0xf; + ichan++; + } + } + break; + case 8: + for (ichan=0; ichan0) { - dynamicRange=16; - nSamples=dr/16; - bus_w(NSAMPLES_REG,nSamples); - } - getDynamicRange(); - allocateRAM(); - printf("Setting dataBytes to %d: dr %d; samples %d\n",dataBytes, dynamicRange, nSamples); - return getDynamicRange(); + return dynamicRange; } - - - - int getDynamicRange() { - if(myDetectorType == JUNGFRAU){ - dynamicRange=16; - return dynamicRange; - } - - nSamples=bus_r(NSAMPLES_REG); - getChannels(); - dataBytes=nModX*N_CHIP*getChannels()*2; - return dynamicRange*bus_r(NSAMPLES_REG);//nSamples; + return dynamicRange; } int testBus() { - u_int32_t j; - u_int64_t i, n, nt; - // char cmd[100]; - u_int32_t val=0x0; - int ifail=OK; - // printf("%s\n",cmd); - // system(cmd); - i=0; + u_int32_t j; + u_int64_t i, n, nt; + // char cmd[100]; + u_int32_t val=0x0; + int ifail=OK; + // printf("%s\n",cmd); + // system(cmd); + i=0; - n=1000000; - nt=n/100; - printf("testing bus %d times\n",(int)n); - while (i0) - storeInRAM=1; - else - storeInRAM=0; - return allocateRAM(); + if (b>0) + storeInRAM=1; + else + storeInRAM=0; + return OK; } int getChannels() { - int nch=32; - int i; - for (i=0; i1) { - - clearRAM(); - ram_values=malloc(size); - // ram_values=realloc(ram_values,size)+2; - // if (ram_values) - // break; - // nSamples--; - //} - - if (ram_values) { - now_ptr=(char*)ram_values; - - //#ifdef VERBOSE - printf("ram allocated 0x%x of size %d to %x\n",(int)now_ptr,(unsigned int) size,(unsigned int)(now_ptr+size)); - //#endif - ram_size=size; - return OK; - } - - - printf("Fatal error: there must be a memory leak somewhere! You can't allocate even one frame!\n"); - return FAIL; - - - - + return OK; } int writeADC(int addr, int val) { - u_int32_t valw,codata,csmask; - int i,cdx,ddx; - cdx=0; ddx=1; - csmask=0xfc; // 1111100 - - codata=val + (addr<< 8); - printf("***** ADC SPI WRITE TO REGISTER %04X value %04X\n",addr,val); + u_int32_t valw,codata,csmask; + int i,cdx,ddx; + cdx=0; ddx=1; + csmask=0xfc; // 1111100 + + codata=val + (addr<< 8); + printf("***** ADC SPI WRITE TO REGISTER %04X value %04X\n",addr,val); // start point - valw=0xff; - bus_w16(ADC_WRITE_REG,(valw)); - - //chip sel bar down - valw=((0xffffffff&(~csmask))); - bus_w16(ADC_WRITE_REG,valw); + valw=0xff; + bus_w16(ADC_WRITE_REG,(valw)); - for (i=0;i<24;i++) { - //cldwn - valw=valw&(~(0x1<>(23-i))&0x1)<>(23-i))&0x1)<> 8); - // printf("%i: %i %i\n",a, frame[a],v); - avg[a] += ((double)frame[a])/(double)frames; - //if(frame[a] == 8191) - // printf("ch %i: %u\n",a,frame[a]); - } - // printf("********\n"); - numberFrames++; - } - - //no more data or no data - else { - if(getFrames()>-2) { - dataret=FAIL; - printf("no data and run stopped: %d frames left\n",(int)(getFrames()+2)); - - } else { - dataret=FINISHED; - printf("acquisition successfully finished\n"); - - } - printf("dataret %d\n",dataret); - } - } - - - - //double nf = (double)numberFrames; - for(i =0; i < 1280; i++){ - adc = i / 256; - adcCh = (i - adc * 256) / 32; - Ch = i - adc * 256 - adcCh * 32; - adc--; - double v2 = avg[i]; - avg[i] = avg[i]/ ((double)numberFrames/(double)frames); - unsigned short v = (unsigned short)avg[i]; - printf("setting avg for channel %i(%i,%i,%i): %i (double= %f (%f))\t", i,adc,adcCh,Ch, v,avg[i],v2); - v=i*100; - ram_w16(DARK_IMAGE_REG,adc,adcCh,Ch,v-4096); - if(ram_r16(DARK_IMAGE_REG,adc,adcCh,Ch) != v-4096){ - printf("value is wrong (%i,%i,%i): %i \n",adc,adcCh,Ch, ram_r16(DARK_IMAGE_REG,adc,adcCh,Ch)); - } - } - - /*for(adc = 1; adc < 5; adc++){ - for(adcCh = 0; adcCh < 8; adcCh++){ - for(Ch=0 ; Ch < 32; Ch++){ - int channel = (adc+1) * 32 * 8 + adcCh * 32 + Ch; - double v2 = avg[channel]; - avg[channel] = avg[channel]/ ((double)numberFrames/(double)frames); - unsigned short v = (unsigned short)avg[channel]; - printf("setting avg for channel %i: %i (double= %f (%f))\t", channel, v,avg[channel],v2); - ram_w16(DARK_IMAGE_REG,adc,adcCh,Ch,v-4096); - if(ram_r16(DARK_IMAGE_REG,adc,adcCh,Ch) != v-4096){ - printf("value is wrong (%i,%i,%i): %i \n",adc,adcCh,Ch, ram_r16(DARK_IMAGE_REG,adc,adcCh,Ch)); + avg[i] = 0.0; + } + + startStateMachine(); + + while(dataret==OK){ + //got data + waitForAcquisitionEnd(); + if (getFrames()>-2) { + dataret=FAIL; + printf("no data and run stopped: %d frames left\n",(int)(getFrames()+2)); + } else { + dataret=FINISHED; + printf("acquisition successfully finished\n"); + } } - } - } - }*/ - printf("frames: %i\n",numberFrames); - printf("corrected avg by: %f\n",(double)numberFrames/(double)frames); - - printf("restoring previous condition\n"); - setFrames(framesBefore); - setPeriod(periodBefore); - - printf("---------------------------\n"); - return 0; + //double nf = (double)numberFrames; + for(i =0; i < 1280; i++){ + adc = i / 256; + adcCh = (i - adc * 256) / 32; + Ch = i - adc * 256 - adcCh * 32; + adc--; + double v2 = avg[i]; + avg[i] = avg[i]/ ((double)numberFrames/(double)frames); + unsigned short v = (unsigned short)avg[i]; + printf("setting avg for channel %i(%i,%i,%i): %i (double= %f (%f))\t", i,adc,adcCh,Ch, v,avg[i],v2); + v=i*100; + ram_w16(DARK_IMAGE_REG,adc,adcCh,Ch,v-4096); + if(ram_r16(DARK_IMAGE_REG,adc,adcCh,Ch) != v-4096){ + printf("value is wrong (%i,%i,%i): %i \n",adc,adcCh,Ch, ram_r16(DARK_IMAGE_REG,adc,adcCh,Ch)); + } + } + + + + printf("frames: %i\n",numberFrames); + printf("corrected avg by: %f\n",(double)numberFrames/(double)frames); + + printf("restoring previous condition\n"); + setFrames(framesBefore); + setPeriod(periodBefore); + + printf("---------------------------\n"); + return 0; } -uint64_t readPatternWord(int addr) { - uint64_t word=0; - int cntrl=0; - if (addr>=MAX_PATTERN_LENGTH) - return -1; - - - printf("read %x\n",addr); - cntrl= (addr&APATTERN_MASK) << PATTERN_CTRL_ADDR_OFFSET; - bus_w(PATTERN_CNTRL_REG, cntrl); - usleep(1000); - bus_w(PATTERN_CNTRL_REG, cntrl | (1<< PATTERN_CTRL_READ_BIT) ); - usleep(1000); - printf("reading\n"); - word=get64BitReg(PATTERN_OUT_LSB_REG,PATTERN_OUT_MSB_REG); - printf("read %llx\n", word); - usleep(1000); - bus_w(PATTERN_CNTRL_REG, cntrl); - printf("done\n"); - - return word; + + + +uint64_t readPatternWord(int addr) { + uint64_t word=0; + int cntrl=0; + + if (addr>=MAX_PATTERN_LENGTH) + return -1; + + + printf("read %x\n",addr); + cntrl= (addr&APATTERN_MASK) << PATTERN_CTRL_ADDR_OFFSET; + bus_w(PATTERN_CNTRL_REG, cntrl); + usleep(1000); + bus_w(PATTERN_CNTRL_REG, cntrl | (1<< PATTERN_CTRL_READ_BIT) ); + usleep(1000); + printf("reading\n"); + word=get64BitReg(PATTERN_OUT_LSB_REG,PATTERN_OUT_MSB_REG); + printf("read %llx\n", word); + usleep(1000); + bus_w(PATTERN_CNTRL_REG, cntrl); + printf("done\n"); + + return word; } uint64_t writePatternWord(int addr, uint64_t word) { - - int cntrl=0; - if (addr>=MAX_PATTERN_LENGTH) - return -1; - printf("write %x %llx\n",addr, word); - if (word!=-1){ - - set64BitReg(word,PATTERN_IN_REG_LSB,PATTERN_IN_REG_MSB); + int cntrl=0; + if (addr>=MAX_PATTERN_LENGTH) + return -1; - - cntrl= (addr&APATTERN_MASK) << PATTERN_CTRL_ADDR_OFFSET; - bus_w(PATTERN_CNTRL_REG, cntrl); - usleep(1000); - bus_w(PATTERN_CNTRL_REG, cntrl | (1<< PATTERN_CTRL_WRITE_BIT) ); - usleep(1000); - bus_w(PATTERN_CNTRL_REG, cntrl); - return word; - } else - return readPatternWord(addr); + printf("write %x %llx\n",addr, word); + if (word!=-1){ + + set64BitReg(word,PATTERN_IN_REG_LSB,PATTERN_IN_REG_MSB); + + + cntrl= (addr&APATTERN_MASK) << PATTERN_CTRL_ADDR_OFFSET; + bus_w(PATTERN_CNTRL_REG, cntrl); + usleep(1000); + bus_w(PATTERN_CNTRL_REG, cntrl | (1<< PATTERN_CTRL_WRITE_BIT) ); + usleep(1000); + bus_w(PATTERN_CNTRL_REG, cntrl); + return word; + } else + return readPatternWord(addr); } + uint64_t writePatternIOControl(uint64_t word) { - if (word!=0xffffffffffffffff) { /*warning: integer constant is too large for ‘long’ type*/ - // printf("%llx %llx %lld",get64BitReg(PATTERN_IOCTRL_REG_LSB,PATTERN_IOCTRL_REG_MSB),word); - set64BitReg(word,PATTERN_IOCTRL_REG_LSB,PATTERN_IOCTRL_REG_MSB); - // printf("************ write IOCTRL (%x)\n",PATTERN_IOCTRL_REG_MSB); - } - return get64BitReg(PATTERN_IOCTRL_REG_LSB,PATTERN_IOCTRL_REG_MSB); - + return FAIL; } + uint64_t writePatternClkControl(uint64_t word) { - if (word!=0xffffffffffffffff) set64BitReg(word,PATTERN_IOCLKCTRL_REG_LSB,PATTERN_IOCLKCTRL_REG_MSB);/*warning: integer constant is too large for ‘long’ type*/ - return get64BitReg(PATTERN_IOCLKCTRL_REG_LSB,PATTERN_IOCLKCTRL_REG_MSB); - + return FAIL; } int setPatternLoop(int level, int *start, int *stop, int *n) { - int ret=OK; - int lval=0; + int ret=OK; + int lval=0; - int nreg; - int areg; + int nreg; + int areg; - switch (level ) { - case 0: - nreg=PATTERN_N_LOOP0_REG; - areg=PATTERN_LOOP0_AREG; - break; - case 1: - nreg=PATTERN_N_LOOP1_REG; - areg=PATTERN_LOOP1_AREG; - break; - case 2: - nreg=PATTERN_N_LOOP2_REG; - areg=PATTERN_LOOP2_AREG; - break; - case -1: - nreg=-1; - areg=PATTERN_LIMITS_AREG; - break; - default: - return FAIL; - } + switch (level ) { + case 0: + nreg=PATTERN_N_LOOP0_REG; + areg=PATTERN_LOOP0_AREG; + break; + case 1: + nreg=PATTERN_N_LOOP1_REG; + areg=PATTERN_LOOP1_AREG; + break; + case 2: + nreg=PATTERN_N_LOOP2_REG; + areg=PATTERN_LOOP2_AREG; + break; + case -1: + nreg=-1; + areg=PATTERN_LIMITS_AREG; + break; + default: + return FAIL; + } - printf("level %d start %x stop %x nl %d\n",level, *start, *stop, *n); - if (nreg>=0) { - if ((*n)>=0) bus_w(nreg, *n); - printf ("n %d\n",*n); - *n=bus_r(nreg); - printf ("n %d\n",*n); + printf("level %d start %x stop %x nl %d\n",level, *start, *stop, *n); + if (nreg>=0) { + if ((*n)>=0) bus_w(nreg, *n); + printf ("n %d\n",*n); + *n=bus_r(nreg); + printf ("n %d\n",*n); - } + } - printf("level %d start %x stop %x nl %d\n",level, *start, *stop, *n); - lval=bus_r(areg); -/* printf("l=%x\n",bus_r16(areg)); */ -/* printf("m=%x\n",bus_r16_m(areg)); */ - + printf("level %d start %x stop %x nl %d\n",level, *start, *stop, *n); + lval=bus_r(areg); + /* printf("l=%x\n",bus_r16(areg)); */ + /* printf("m=%x\n",bus_r16_m(areg)); */ - printf("lval %x\n",lval); - if (*start==-1) *start=(lval>> ASTART_OFFSET) & APATTERN_MASK; - printf("start %x\n",*start); - - if (*stop==-1) *stop=(lval>> ASTOP_OFFSET) & APATTERN_MASK; - printf("stop %x\n",*stop); - - lval= ((*start & APATTERN_MASK) << ASTART_OFFSET) | ((*stop & APATTERN_MASK) << ASTOP_OFFSET); - printf("lval %x\n",lval); - - bus_w(areg,lval); - printf("lval %x\n",lval); + printf("lval %x\n",lval); + if (*start==-1) *start=(lval>> ASTART_OFFSET) & APATTERN_MASK; + printf("start %x\n",*start); - return ret; + if (*stop==-1) *stop=(lval>> ASTOP_OFFSET) & APATTERN_MASK; + printf("stop %x\n",*stop); + + lval= ((*start & APATTERN_MASK) << ASTART_OFFSET) | ((*stop & APATTERN_MASK) << ASTOP_OFFSET); + printf("lval %x\n",lval); + + bus_w(areg,lval); + printf("lval %x\n",lval); + + + return ret; } -int setPatternWaitAddress(int level, int addr) { - int reg; +int setPatternWaitAddress(int level, int addr) { + int reg; - switch (level) { - case 0: - reg=PATTERN_WAIT0_AREG; - break; - case 1: - reg=PATTERN_WAIT1_AREG; - break; - case 2: - reg=PATTERN_WAIT2_AREG; - break; - default: - return -1; - }; - // printf("BEFORE *********PATTERN IOCTRL IS %llx (%x)\n",writePatternIOControl(-1), PATTERN_IOCTRL_REG_MSB); + switch (level) { + case 0: + reg=PATTERN_WAIT0_AREG; + break; + case 1: + reg=PATTERN_WAIT1_AREG; + break; + case 2: + reg=PATTERN_WAIT2_AREG; + break; + default: + return -1; + }; + // printf("BEFORE *********PATTERN IOCTRL IS %llx (%x)\n",writePatternIOControl(-1), PATTERN_IOCTRL_REG_MSB); - // printf ("%d addr %x (%x)\n",level,addr,reg); - if (addr>=0) bus_w(reg, addr); - // printf ("%d addr %x %x (%x) \n",level,addr, bus_r(reg), reg); + // printf ("%d addr %x (%x)\n",level,addr,reg); + if (addr>=0) bus_w(reg, addr); + // printf ("%d addr %x %x (%x) \n",level,addr, bus_r(reg), reg); - // printf("AFTER *********PATTERN IOCTRL IS %llx (%x)\n",writePatternIOControl(-1), PATTERN_IOCTRL_REG_MSB); + // printf("AFTER *********PATTERN IOCTRL IS %llx (%x)\n",writePatternIOControl(-1), PATTERN_IOCTRL_REG_MSB); - return bus_r(reg); + return bus_r(reg); } -uint64_t setPatternWaitTime(int level, uint64_t t) { - int reglsb; - int regmsb; +uint64_t setPatternWaitTime(int level, uint64_t t) { + int reglsb; + int regmsb; - switch (level) { - case 0: - reglsb=PATTERN_WAIT0_TIME_REG_LSB; - regmsb=PATTERN_WAIT0_TIME_REG_MSB; - break; - case 1: - reglsb=PATTERN_WAIT1_TIME_REG_LSB; - regmsb=PATTERN_WAIT1_TIME_REG_MSB; - break; - case 2: - reglsb=PATTERN_WAIT2_TIME_REG_LSB; - regmsb=PATTERN_WAIT2_TIME_REG_MSB; - break; - default: - return -1; - } + switch (level) { + case 0: + reglsb=PATTERN_WAIT0_TIME_REG_LSB; + regmsb=PATTERN_WAIT0_TIME_REG_MSB; + break; + case 1: + reglsb=PATTERN_WAIT1_TIME_REG_LSB; + regmsb=PATTERN_WAIT1_TIME_REG_MSB; + break; + case 2: + reglsb=PATTERN_WAIT2_TIME_REG_LSB; + regmsb=PATTERN_WAIT2_TIME_REG_MSB; + break; + default: + return -1; + } - if (t>=0) set64BitReg(t,reglsb,regmsb); - return get64BitReg(reglsb,regmsb); + if (t>=0) set64BitReg(t,reglsb,regmsb); + return get64BitReg(reglsb,regmsb); } void initDac(int dacnum) { + printf("\nInitializing dac for %d\n",dacnum); + + u_int32_t offw,codata; + u_int16_t valw; + int i,ddx,csdx,cdx; - u_int32_t offw,codata; - u_int16_t valw; - int i,ddx,csdx,cdx; - - - //setting int reference - offw=DAC_REG; - - - ddx=0; cdx=1; - csdx=dacnum/8+2; + //setting int reference + offw=DAC_REG; - printf("data bit=%d, clkbit=%d, csbit=%d",ddx,cdx,csdx); - codata=((((0x6)<<4)+((0xf))<<16)+((0x0<<4)&0xfff0)); /*warning: suggest parentheses around + or - inside shift*/ - - valw=0xffff; bus_w(offw,(valw)); // start point - valw=((valw&(~(0x1<>(24-i))&0x1)<>(24-i))&0x1)); - - valw=((valw&(~(0x1<>(24-i))&0x1)<>(24-i))&0x1)); + + + valw=((valw&(~(0x1<>16)&0xffff; + else + return retval&0xffff; - retval=bus_r((DAC_REG_OFF+dacnum/2)<<11); - printf("Dac register %x read %08x\n",(DAC_REG_OFF+dacnum/2)<<11,retval); - if (dacnum%2) - return (retval>>16)&0xffff; - else - return retval&0xffff; - } -int setDac(int dacnum,int dacvalue){ +int setDac(int dacnum,int dacvalue){ + printf("\nSetting of DAC %d with value %d\n",dacnum,dacvalue); - u_int32_t offw,codata; - u_int16_t valw; - int i,ddx,csdx,cdx; + u_int32_t offw,codata; + u_int16_t valw; + int i,ddx,csdx,cdx; - int dacch=0; + int dacch=0; - if (dacvalue>=0) { - - //setting int reference - offw=DAC_REG; - - - ddx=0; cdx=1; - csdx=dacnum/8+2; + if (dacvalue>=0) { - dacch=dacnum%8; - - printf("data bit=%d, clkbit=%d, csbit=%d",ddx,cdx,csdx); - - //modified to power down single channels - - // codata=((((0x2)<<4)+((dacch)&0xf))<<16)+((dacvalue<<4)&0xfff0); - codata=((((0x3)<<4)+((dacch)&0xf))<<16)+((dacvalue<<4)&0xfff0); - valw=0xffff; bus_w(offw,(valw)); // start point - valw=((valw&(~(0x1<>(24-i))&0x1)<>(24-i))&0x1)); - - - valw=((valw&(~(0x1<>(24-i))&0x1)<>(24-i))&0x1)); + valw=((valw&(~(0x1<>(24-i))&0x1)<>(24-i))&0x1)); + valw=((valw&(~(0x1<>(24-i))&0x1)<>(24-i))&0x1)); - - - valw=((valw&(~(0x1<ouEu=jog|bLPyMGiT;5xMoHb$8p^drg4t>NzSpghI70b;y8h0&z#U7X^y!<%Lx4M z^sndQNixSxMz{)L3c@wx93j8wlI1-E+kbgq^He!FKNsQi=v4VxJUu)AJIy}Xt~^$zR35#R$~o|V0e7vucD@sVZ{l3N+Myw_&_Qa5K~g)9-%QE=KaDrp{Z1k&vzhjO4|m`b(xToc#pHD zCG6mP2|oGV`5Xl$@E9NPwyw?m9i{mid-)?Me`J1{9N3zJz$te=!?{MGYzk!&l(NU1 zffAIBcYrJe9I_DLl%E4~K^A0pfRhoFi#5m*200ZwF13Uk_#YRwgoXTZ?sQlfS5`}{ zn1s3}A^#(&>k>hfBR#`0N*%^hRUB{flr7?v3xFTBtsD>#loOAt_|=JAAR3EEK6w>V z5R`8{HcS-dFlsurt*~j7eDcf-x0K480cmr9Af%#Y9!?qa7?o*383d)*V`@H1IsO8V z8lw`YlyhMzUdAcmZzWQO1)KXa9GOh)Y9dZ-(dp)z_NuqY*y&H0nc88Xx6Y-+2$M&8S>a*PUw{ z&Uu?r&luj72U@tQISNYcqdZFV+~|#Pu6={JKr-ePWy#?YDtSNkI(Vj%_qYSWN=|uq z42Qh`7?Yju)zaS|(~}?I?ke@2F@nb@4+q@g)qOy#<&P%8S=72xxew=%r3uDgXO|PhO801m!xkmQ$V^Yxre&~pw5~#o%;JR(gp`zuIy}8l z^O{HWo-PUS&K*TQc^)W%pj`S$eRZJHiPr!4Qj9{xA}GTi@dXAU?%h&ffGD%KG#nTz z`#4T{r&J8AM$E5Eiv#WG`&g+@UWZZ$O3z2)fdZs8BW@$&5R^0PM0qNDvQ)nEYKQ#N zD9EZyIh0!gURnDPr#yxKrKtC_%Y1SaWe^kvWwhS+ams8w6Vr>s6uBf%#>2Q%iUOmx^K5aPh)E$tQC)90ldRbtx$x zi%aG_<={9#EP$N1*MX7Z!boum8))vKx>T4)iYfpn55Xq~kR#v{T1R7U)#F}A-0LW1 z#<+T;p5CFT852fKxOc)5bFvRcY#*W7%##p6H^Fa-;R?})!jL8Ab;P`0n6Sif{g9`h zu-&Xj9LUMyz|d=EOp6i|pK{^6Xwf4I;($P!n43ApMK zp>?n&ZZqOGBW{Q#P8@-Dju2XlEOFC{IeA*K(0ZXIP8i9_!bqX@B1_x>#2rAKXo=f0 zij%jD5?Y5^;`)t7J4Oqw7hB?9x|EY&x>RT#Zi#yxajzq8m?du77~nESX#JKYuF8Y? z#3Qs`Vu?$S<>d5Op>>2MPWTRR{*KT((h_$PaVHTs$`Tj9oRj013$4YLxPDgv=PQKP zZ(HJ4A#N4oF15t1pMaTcg3x-IB`#0`{w@(($5`T06QN&C6k0u&xPDgx#+5?rSWDcy zS3yQyCA5yS#07nv9P|mT-?79kF6HFKr9$g?OPs%qll^5v>*bcX`l*~;KUHYG!V(vl z2K=T8tZgA6o=3>no7$%grrQ(hY` zLWjz((=74waI6YyuquGuDr(egEtO{g){L4pfOY!G>^dK})p^R%0u9{T>O4y`G0C}6 zvT*u^TUx>u9u0K*430@ zKFL9#T6Z)QiF)cwNPP+Qm7%^h8jda_bu&^oBlQ$g?|O2SJRCT%7URABVxj?IWzygn z;<9P58+Giic^f4vEHu#jst5X?sL2HqF_UfwQ073*L6q^JjjGltG$o;Vn=Q;0+$dwt zZ_O9;9?UQP6y`AA<#Jbgc4_>w*+}UvX7}>d}#WZKyd)dJDai|+n76_3 zqNMlsgD80@=o78IJJ{B{{jt{aq7IW{_Fm?c-9f7PLd?aSGJ0GXl-ssB522umw7+f) zdcHs{w9>Q(Xc~&;id44JGgPBrH?%RN(X>>HJ2i~=fX@CztRqd27-=DcraYsmwU2Ai z)|%V%puJrMdNyeF9vG%_Q14Dh(a7)d=<~S5)?`>qM}bujH!ng5ADfKvz&jc1&VDJM zy=4hdJ)37<0JLmwc?#I47$0?P*+WK}!7b3Wbbc{=V?Elo{`MTSE%AiOE6awdywZ8w zVo&e^mFL31w8Y>R>ggT=tr_Qx4#h45SLkCvl^m-6N0Or_avev$wcifKiY(m2x%z?6 z!WLf6=9X6F@%0A-MS9Evm`KddQl5E)A_HY~ipva7!H< z6|X!-qaw|;kE<^t{V?e2d`5W|me(*wMI5uYeKvI4xVZq_Y=xE0%|BjC5`VlqF3qhZ zX*@Epx{~L6LWdX%%gW7ob_xk;S6K=@earB8Svb~1+$Yi74~MIB$^hsq9ZU5@EbI~} z5yh-c&o2&-#+oI}tvu-_q_voHotw=>{nX(Yt6Gcu!G*jByC7I0iKTyITuwXfhwU`0K8fU%7maLL$gOo8dL9|v*bmrq#rh? zV!$n4^tSW?I3Xo@njM}zPharDu=}xA8ck!+;mifCLQG@tCIsb7hG227XDvDpdcih2 zNY;let;-%AeeSwr$2bVDn~@ZQ4^)G**aOA4jb{QJ%Q* zp>oJJ(I;<49h(>JLQHTC(dk=)+R}?yO9#10kJybo2+Hy`&60@r?DY+mU+`glSWS8j ztd>YeQ0A}cA(F0>%YH-P+X6tNk^J$Z9E5kIKiNj`^feuMI0UX3s*PZ2a1wpTy9QvT zr;qCY9juRPbM*hjh%@G3E{>(L*rwo24&-CjUj zOgY)Y#$FGDLMHW)!sKMSNT;?cCj}-G)VV8Zq1;?xI(P98K&@**IqE;iOKnVdbCdQ* zs}G_h=PDB31fKsl>M=eS8WZ6|dkpGxNNT`{)!(9^pgM-5tmLTkjA1KA*<<+9)x9tR zQqcsYMo5ZC+kwM(%Y&Br2kT5)gE5^r2`=2FapAp1w4PVz7KavB3%aDTR**W!-DadE zO^$<3EOeM#YC*MHMzvo&3=Y2oc6d;52H>T-obg|Lm}UYGq^J*4)DL?@6gc;0^8<0I z(~Z4{QPgXYgrK~-j&`wh;>e!hOGa;SpqiG?(&9+t-H<#g{f*Q@VY(*{ZKwqD!pd1a zurgO^Wu0}B7o>m>_7TW7gZ6OB9Y;ZHJME5oloDIj#kKDW%A@C z_S$IAgU3!LY3dZ$hPY4BH>HfjJ{fH0Bx$FY5}Jq(<~yqev!$NSqgL~c*3}m>o@^NT z7)Gd>LiwybsB&s{4wEW8>akjM2I9>M(;V5^-1+zW1nkzNqDgRP7!s4leA{(u=|gBU z;cMzif(1v_o@l~x+uD{U+a-9aANs}2BQ)_Yy$-5f&*d`7o2*Z5RseEO{m;+^nmz0vBpMRzY|I#Ce&wzR`p z_Xw>eu`mCKy3QrZp2pta9pj=5>u!Vr>Na~nh;biWOzYq64d8CHh;z|=A=q-ggj_GN zT>ryzaRCu}E~v(}3_sFNQY#EJlt6Qe)K7UKb_uVUs*N>~NeH@rY zf!Ug!w=90VWkri)JonP}WR94-mvi&aaxd}EhFT&m+ksU@Whi#M1v5086SAc;;X`)4 zAb3lcz(03~(JI|a1ujL)BW~V<+07re^rX(e8;rC##+K_5o#vd<1AE;>fBY)kBPsTb zU**)gpiO>X!1z0)_4+;QsMpONN3Ey>zqUR!d-|6_(lH^45W4C|(-u zR}h+32v7%LRD@z-XPmB7uS+m0;8(eIok`Ujv5!pD!LL%ePSwLy ze=FJ>ARWLQ8y|z~KVD2W!r?*F^8fZgRg$3@(jdk5foV5!d5#;z3R zW3pFw1-tbjb-lj;Enjy|*!z%Ehh5zX?3+4;-HY)O&74DlcNw6}8h9?N$B!RUSCpg= zlO)&Y0^UWt2D*Ki#~2T>T?2KssN12k$LA}nE`kk2MsJLs8jtOgQrdn2NdVFc1n6qi zqop#p1eUrb2c^$3H|cAw+Er2Xrqzb5+7YdKz<~h?rU vistX19VGCFW7u^`^j!2 zHmb>4uB|(xk(D>Rz{b0T@KVX+c zZ1OIu>8X{btWDpA{m#2iAoj;AJMw#iG&xPGp6r)IUGVVh!0(^*(^rVr@qECDP3WVb zjby!*)335gt_gVa!c)lmDrwy&j@hI4THr6#!o#Chmn`tfT3L#6kPWY@qw`1o^fY~* zdaj>d`|PH_#MWTUEF8@#V}~bW$Jtt|mvCGvaSg%x@AyJKuN(e*Tm!ITFfjt}4Hs(2 zA5xd9gKM!mujLeOv#Hdkwno~ZnqnHOl0dwBH*hZbfu$t|Y z0ivJd33byw8F5!_PfCrgPV^6w{(NV9do&rvSbrS_a&L)wjucJ^Be zPpqZbyQ+(#e{aR8Cwpcf;K(Z%BCJ2wBFEaLdVj#uhIa&I>vFVdSUk2b<^%se#-6Uk z)Abiq+!c8GCwm%;r{A;G(RlhZtoi$5Bk(kuJq^Rt)$C~qp32#i8&C7uQ(ru-VNcXE z(N25j?d60y52{ZCW(dl6mv@xp(by*vSqG=e^Ooi!zCC6|)c_u1-> zw6j_bRsd778g%5`8l(_q^!aig%W3L=st;5Wb^%&3rYxAA2K3WQcLMsh)n@sMbJFAm zScBmUV_P@%Tjr4aEnA7XW<4y()0Tl7mg(b*Q=VOh*1H6Y1mj>K!>$GLAt+_b+^Eg$ zlhZ<~!z$_o;;cF?2l)(L$k1`sHBB6Cq?Ld!oe!f_*S$LqEg=f)bbIfdxrN_-8z7`BW&?t`%g$pLLFNSYNt#yu9cxKOMKalAW(TKc)0q=Nhc zVF<>dmCF``=8KmNljm`q@`rjFrE%LR-Hr6!pzg7y3Gm)k?n2ZH9njq|=iuegB_LD& zvXojUYLbX>3NxH~xSb-Wd;qIJA^!gc|GTcEWvRKYa)X|ob8Ii95XV+)8eT5Tsr4pX zdl7$`{*?~s9s20<0$cC$Tfl3x>&>1%*hl9#UF-UDA1lA8>uoFjYEVzja^l%Bs7J@- z-99QmEWnu9gXabf!|fgF|5=~7t}S3aua7a4n_lUo@?Jj+?xw%y$@_frbIUmj%G5lYeP7kVM~;J;pi`C!h_qPVFdjMj<5+-j3zKtNabn9P|=dZgWiPK6&YdDfFdI z$)Y~A_61*eN|(i;%g3M#f^r4uLhAs%Z_f5USIO&8@-#{!D1%r@vwfZIxh5>M$(GnR z)?SQVMC_2}^3DQbyG1Jz>m0IJhyDLrKU)0fRfOR#?C1DoZyiTLDXNXKlU%Vpwg2;B z3$uDhaIP`XSQ4>sqkj@HYuz(Y_YBl9pqBPM@x zUJULi26r@qRt1PLMx^G`Nbq-oUjq)7qZ)Lq++ejJNfTj44&uf}hsbZACx5au3cYo`u(SggnnrahRWh z5lN@cy?~y%hh`osbJH!Q@^h%?xw=tu3N@5^W_vj0?v-kNWuDOOrSe9kZ$x?<(kZn@ zOBLlBuEOK+n>8HJa@=6#_`a4yuOq4DC^K^G&8p*LEyviEpeXaXqO*Zvj1~mtnmbDl zy#*S?@s6Neb*C5a@$0=F`X8Km%~bmDn^~&9;W* z@Xj9TdBpdqE5}ps>prKKr^Hv*<5AbOJ<4#7i(7%yLMvQ=_1Th?=1n&eJJUiOnj)-$1wS62TXPVY7Np6loytege+f) z{Xe#kulmNsne12h)swM_4EH*es9Ql6;RlwG1~Nr}t!o(hu;W|?Rx+v%Ve;xrE3h}U zVk>6uS*s}j#RBzHF?wxhrUW$hdK}}tph5{+S>WM4R~_1s(fhw|lNT_LN5?ha+x%K{ zs<}IQ&=0Ck8isY%Fd7pCjr`5P5K(RksOjtobg_=OmCY896Hz2Cm@CNbe$5Hv7EY|uKL+$x3d=QtX-Ld(b;Her+ChGF8%+c zoolpq3YT==&V;k8cD{oYYdd2sr`}F|3?9g4@4|Pf_loUg%Yo+fQQj61R_FXK-<1-?BFCsGH3IcBIw!N3Lu+KsBjypv2iV z*MHkcGc-EO8p!1NEuhYpl?OqcwJS`Xzu=tIS!7UW_<3Z3wI8y1e$^c+&!-qK*mn#& zQsf<8rAWsewH>@p1*4_L`qXUaZnSgvO0u={Xs13}Hlo(-Rq4|Vl3ka!uhY!B4#IA! z*R`^fx)x{ErP{w#JCBK58*pn|c>;Z~6ZJJ{GHou(cFmzbsna?1oAkl<+q**^!~XNN z`oO_j)7dW1$)0*2&@N9zYr#K_Sfgi{f8YQ<4Q)7^3jEy;nZKJXT@x4;(oFJw*fWLI zn@<++#);&+;V*W3T=KRa`?BQFu`h@Aezt)A(@BqwNZ)w3ZixjBn&rQAY}Oq`n-BbAn#{$4NYaJgab@KyfhE6zhZ25A?Q_y^%Mr>JxZo1f^21tN7iA z8fm1OdIaK`P4rHq^~;8u{`&Kc*oBB~(6C&9`(W`UOYY58h8Xxm-ezrJ)l=qQR zixdRq>Kf`Vlit5Z+0OCaZb06_cu;NUD@N?kE%O`+ZD@bM|m^aH)7e%ojfw=|tQ}Sy8?(CFF)B=HX(J7NCysim@T^&xD{0XJ3 zbg&J5EbiT2?)c6zojzHc!8w! zbt{N3LI}h|K});0L3VDtdnI`9MOb%-E~;m1oC)2jyQ>yhQ0H5B--#J>`O=Pi>Z=z}X~Kr2s|xRUw=tZd6N3@ockfgIcA4w zbx@PQ37HUfM0vc2(dU<(M^gz~sF}@07cJ;1HlpA6p%1aGu9g0uLchNz5zooQMjZ9v<3H~WH> zsc23h*F%}H5l$IqSw0%ZjTIW~Y8APq6 zqj;AaYiGTeC#}MrTdOM2%WG>p_VT0E)XQcMb6xiE=ec?hCjq6l4zS?SM-Zz5VaDC# zL+ZUWy*ck2B|oW6@9rn{D_)+`=))}mbqilh1kj7aQ{ zO4B{TMX9J5pwm6hKq2xsEf)gyttt2iKzCRcig|y+DI=HFw;s=sOioCRh@Z7Q$ZpBf z>-%$n_S%+0KOc$Ixyw0MH8^AjEKoDHlF#%&z)rpaub4N~xuF;KfsRY+jX2=74VZ&) zGBYW)F-`S_qGA9U5O_ zJX0)g^O^AmynT%vg-uufq*Pvqo?5pmVezzkGvGDpxS=O@@;8E72+Gz#0%uCw|x}X5*v>pxy0lFdWzk)L z#Nqal@7FOoq~i?#6WlvjhWt5H4!3fV&$W6Ai~9BOZ3LBeL45KSV2Ysh4~!d1TJ8XW zQ!bxRx7pzo6VA$FABDZ)+*U2|_gl!1piB;2fc#wkK-_GWh~*6>%9jF~1HnpnM^&E3 z;Uixx-&D@^xm)j{jycsHicf9ConmUL*+(Qx6VRvLhUfSN%c#GDt`~u6@;1U0yv=ai z58M!xW4I~r1Ei1z^9bS)l*5So9m~z*_L5TQ7(?aTIX-WxP|7?A-ns|vx<}Vrq37Zq zL3w=s0`%v2ydfx!^KZr5B)lOg_s_4w+YG!RD68hr#9I~K5R|3!uff|qydfxe%%6g{ z8oVJW^XGfC?n>l7q&z%7omqP;ypvb8D4OP_l+PpLjXT~P@C*@ z+{ot}H*ACy;I^`!yLrywz749}H{KaHVn%QtElf(JUzuw<)yD~Z?xtOpGxJ))osC~9 ztdC!nJJc~?az|J7efVG2N7MrLnhZ)WGM+c6kZ6wpJ3Gzo%@en`L=v%<2zG@cB%k83 z{Gr}WG;8v%Vs}(ppWhw7f@`7sG-lbxJ$xf*71d)&n@MRINC~>F5A|&@(^Wjoyp4N; z>&#TDIe0ylNJo;u;71GtcO&LU4FmNVGPLQ2aO0k`XBziRZLFMwry$vqb&MQ0>Q7}i zQtkFq?>ybO=k11`DD@7^{3Qmik5=he|F){%obLjQYolgq6?1z{je!3!gWniLOY$GB zY~0h(=dnt&l#c1cPc-gnZ0HV{59hvJ_J3sq=FI;Z_0tUwgrT)Qp=nlF@C@=a?#T^0 z0(AESoq8r*(~&r6MiM^V9LF4m{ksU4f1;2$NVQiJ@3%)MHn)c-Mu__dSneUEeJXpJ zeV)+EPK>mNsq8iL%rVeYD@$^j<`5BcNE|m7R>+H2{~&Gw z<&>Y@s?G^6cS!^@(rj-tof~)f6EWOhnSZcv0GaGKPEyW7A$d*!V!Kk;9a%x*a#B4*3 zE&kNDP*{KjP}4KY=V$e{8`wfOQ2U(vJ1@W~-F0rkZ73?Q(20Ok+Y;e8ena5|e*KV3 zr?v@@OjgS7M(vPKe%$(zMcFrPDb^NlwWU~F_#<0NgQe{uTS~-|@~|ysmnG$1Bjwb# zeG#|84R>1N3pSbYw;A!^Qdf~17Xovqw#~BSm}%rVwXMk#Uuwh?6{>Gn>m*(oZ%c_- zQbrglgk1_+sM%+OENKOslD4#7MjByxk%490mMeWm?-#-pdZ(rKPmQ$bdH7dBPLj|# z+m_Y4AK6k$EmZ%VEu~sZAzHj;q!^sY{1Mut#8*)^;}N$dZ5$RsDabrOWL_2y&)HI} zI6P)c(QzP2u*OKSkD+Cjc+9cQD%bDB`p_{u1;5b*tP12ETy-Bbvisn(aSQ3I{n&vf zs>x2_=|*jFc$bcZ_r6exd!Clim`X|^w6`E)@6|Cz3Cb&Ynk9Yw4mDDuSa)q*qMixY z_eUg#Gj!4&s-3Kpo}Q@qO?#IG_a_urr(b zAKFr^)Zc4Mu~I)~OKGrh%`a>z5lc$Mma@x|@|=-EBgmA8>n-sGo6PvNM!bD|n>p?> za?q$Tsd8t+FF0 zA3zQSWy;NQaB_c*llMi!Hd%4-E4}}T-@omi1ig)TIkkv5D#}L6z6kzX8j4G2H z1~12q6b`&R4ZF|DojXK~hAav7ijj|c>f6F5Z3Mlsh&UK}Kd6~47oRf9s3WMrfEqMX z1VD8%sP~HjORHyX^4VIj$S4tFtu8@sYV|#fXzci<1V-?zO@3RMnMN7PD|m()@O?&# z2>8ESM6JFOt!~;>XRBefk#Ce3V(=y}qEQ-T5~FET(3ZQuk(=@gp0Nfz-bnEPUK4|t zE2dhKJCiNC+~7Ir(e=>r>xarY0&ZYgRt6`&2Z(b2)hhs}+ z9jutnK&0{llnTtLkb}76GPr{*8`@KoTFY?Mf}r$fwG4ySrl$98(w_>NAk8Wp{IFah zudkkNp`I{TlyMoq@(@Q_e+}Xhl+km^ex5YuE7kTvYaqQY*qks=osxv-^)^x-ho^=7 z;5y0I@-yKD^Bjz-zfEjziPX2A&ZNV%3Tg?L&hbWyD@*6pM;xHe>O-gDy^~S)8~$A! zJ3m9Zb>}50_s{j*ZG=xdG}6wn!HxLZJkk7NpD{d+_y?LwT$x54AF*jv0X!~ zGy_}7TCobWLr|W+3H=A(;RLJ{LyIvFXXr`9)0=1y-4F(SS}T>3*7HY-47xy5gc4-> zduPA1^R(0^thX1?T{#!Q-lkhB;dNFIud{mEfp7*IVU7IVd~52vNPV|{C(2d=!+5M1 z>l?C#Ct?F|&r}Qh4ubzhZYteilP9bW;128AWOvigo+X$?I6-&xINOSlQb`;vgC5tx zYG_#%Fs#XoN246x%{5VRpuRGrjLTqkgYw5EQJ#gH$TP~wjELL6IpqfOw(=BI=fxI;wr+j+}aX_#!9j>o*%;77nd5)dUF4cNgEhWI0 z%$oBrXUQhBA3cnq{Ado1nT&GyER9P#CwQW7$`~uToQlJ>(0_iV)z`LIjdLLG^|L1K z~dg<(xc%?L^l$SgJ1 zk2>=-KVdy44*zP^S4)oxPK^Vv@hClh^)7Zx$Ke|j7;OdaxD;gY%aK;Tns$~yzOh;I zFpU3r_Cm~+gq@lCJ0mrI)*Amy*fQ3mCcSJkdWm?i|6-y$S*>dU0YO=OquOt!pvlK) zRNlz3^yPbJ%)TTZZwY%{*TNn~BLk;sKtBO~&?#Vl6>6wSi*oO-re43|Mtn(x-ALmUTEfmiDW2Cu0?>L)@44Acr*MO& zNtXjvCS7J|bh&qt$>U{b^pY)MKkRWPSF`~xg7Q_B0GbBR>S_3n31&1kA3-z6lZgf9 z9LxGYjr%{UT&g7Qf$wY7OKL@qv@fC7CBtkv*gWT-CApMPYD0&F01#CJu zNyL|Sz^i541jrCQ4?I+1iPGP!CB|?UYb8c<7g|aPxN$?Ra|lB}c7$Cx&M zGj(=T9`HYPS6+pbR@51_RO zN@%vuFEoD1E_o5wG8yIG40gL9hsicM7WxZ)Wl6_N>`a_1+D z-o+l?NkBkQ=68TF9}u$Za^v(;$5`Uv-W?zlXJnM$ob`565BWiKtcSQ<#dGV~A)Sv!`TU)V0*qcde08-q*T`w z)>}B(*1}IQdrd+M5tIkMaSL_&e|lz0C%ARhqOR!j+cW=N3x9sbc0zaBS+VBJRVx1Dk0b^?03`3#L(oZN(O zjY;i2MRDw6=V3>jZu?8(x0@ishVOw6NRo~zb&;NK(mrM~?c>q3{`5lHsw?TSPo`-;CoLRpso>!Yqn5if z?Gh1>6CsHAIA`ebw;A;oBU^;~a?ddUS!rs;gGo$3w_!iwT`77;fVFz!4mW7nHnUdBAaFQjA@esbh zR8HKFbEOy;^|+~cl$^$Sl!H>4hcqot={6U1SDbz|zEs|iy!-DjgKcEsycF(fLOfvL z{%^z#zEw{roxLa0Nw+`Nm-5_nOR4-Z%6@!5&V|tz^4PhsMK{s+=1LAdVAv&cfqO>z z?U#E09)tEdIe5+hcLe2a*G22v&ZZN_VMBAxD<%h8H9(zsW%aRbes%B8BJhQ)FV=0NAK)k`k?Wy(;2A-= z70-J7^VgGa*flqq_A-3d6S4_+{~SIMZzQACeUU^y@X8m&@v5DI_R{J531~IjJ%2m)L99$Z z@<0y4{Sor;q}!v3$LgA!aie%igl>_}%%m8ih5j7_b-iI?OLr#l4{``n_!P9^)|n!_ zeQ;-bv?bgg{(az1jFqSL(FAJcazUAk;-09MjPg?>UiAU(1|LwVxjsUaXu+=sb&p2f zqaR!y*@@P+%&d<{`2Xa!iVZzCRmKSw_OGu3C1E3^6) zwwH2>TuzWgc?rXmYP~bC5}1}`a9>D=+Q*->_I;(++HbiEcT<%U#We3fPH!99oj|)k z&M2b*WmE?!j&nl!u?@-yKzYatMYGx2`=uPTE7$tv0`$vWM!#&WUVzrVZLw{!en|qq zwv6%@BVNb7W53j*?pm#1j?7T|C0?H0FE30#SHFz6wdqpyOMk6j78(8W1BU6+v#`~7 zsD1G{YwvEW{prcz&FNkAOC0Uq3q1l*ZtDQ$@^eCY-)HUpTLI-Y3zV+uw;uFcuhDOY zMnACw>@Tl57yX{I!G6kzJ(%e#UsoISyCBerp8mrbeAjh)cJJ&xXYIG!YCk#&GSkvB z&dS#z&~GE=L_qmf2Pn^<6UsOnlo+7&wLfQ?{%O>d%qUBNF?j>`#LgeBlgyOBiN-x?+?uYYsXlXY=|$8N zE7Gy_o`9~byg5zv!FO~ETll+eBByw!>1`e#QqRJuvM!&^;m~TQaPlACC4D96>OZJH z^5<&aNq79$x1P)-tLvL9L^>()TTXEDSf5a=DDOqts}K)=-)X8;*PO&o?y)J6C<{iOlLlCo*;5mB?`?cHm4a zVg2C~8Ap{hN9Z`M2xr3HO_n;cERr>`W4^VhDc+$b!BY~5Vuvp%xjonU;P(hGdp%c< z-wJ0Q%6EhyV2@F^725MpJ01nMQD2sz|C@`b9ohI%X}xv!(%}MYH}blJ1Z`D$I-IQZf*Ui+PSnG`(A~#THJ!ozA%pviRPuU)I}N3#1qtrW z4DKcy+)53u`V9{9C#AOW*h{Q}1-xo2`EZg)r}{?zov=NoD&)O5NwRmdC=csS`!Mg~ z?OnX}#+wg(O6zfWrGZ6M{&ZM<6a;E-pDzkXz;z~NzBFa9lrS+4{dX#Eqxldq+ zGYrX&(^eRZbjBhP%NPFwe}-LU*kgsAAR!4j0fiOPB5Et2f1+<3_8EbB09y0)6qERB zQxep0pcMV*TwnIZ>A0!!GFk&ZiPk?EBw5ig-MR|YeIRt3$*+!~)!{T&Sr263^%)W6 z>lhEebWD`5#*-AzDBnLeF@o>W!C#s8ln3fS>8Fmh!}>Fw<$UbeP9wEgwdo&Qje4$S zsrAQNHqlOa{ib+Xso%}gmmNz1_l=nQGscb;UF85!V9lZQB_OXHjEnodNXGIZX`ct2mdN^{U5k8py;%~55PHPTN1 zi!?Egx2JU%Mfs!ywvo9Rr9W=;ZSSjia*sD4y*ijU3V z9Of*oT^;L@`-XIhz_^!AE~#8%ND&sF9jmSf@;RaatphMh0zurUAj;0ko=OM!u{rj# z^tyz!=rD|5)n+w*G_CU@u$%fZ{t%RsX;|t?WFLn8?+D|2jKrEFYRtVy$QKrrKkc17CF+E178}IZvCM;FpTG#RQ@4Hyj3qMoGLPCnc6JRHFdObI-IaF*qw&%-Ft@P;$JN5xk z06}@H%%sy=j`V>z)MN4l@N2=Hv`*IuH#~iD&n?|gyA67B9k`&5>B%&<`eB`$ zy}M8Qi~26}Kac7h;?Do9=t*eSYI)*8DnGG{^4|s|)hA_k(+^@Hc#F{uxX%3ULI}GK zPInPbvlqbcBP6-u`9@e!i?<)`gQpTay?QhcPuJpU%TfC3=goL}*@DY&imowmp&RqR zE-qWa7lccM;S$zx!A;%3C2Yf`mf=Euw20wCy|;kj!urvMi%ylRWmzx3#}M*Qt8egTWGK601p1I*|vx@JHB0<y!+jy7?x6f4p%1*&;;~B@+;1J_u}4t={4Qkh)E(*zj=Hs2 z+*FRd0>dcZg3GUqOxpe)^S#OO>e`QHf2Zp*cN}wbcVQRk?R3YnyDYfox_9Aw+3VdB z_(bJIRZ^ax=a>J>q{U}NFB;`_o*&T#UFhBsb#%~I7RbYZIJx{^E|XK61Q(4g;;Km& zC?6NyVL;Kj`RhZWQPRH?D8#2u8)W=^R%FU?l;E|4PAt)amF)8*jdQ2br zo$+#%@$wYL%Xhnfh8~w=TNuAx)&*Tf8(s52zl?I`h|c%P*yA?((jI?C`PUKRHz(?* zaiaS=C5lKculSFl?Kz^3CIO{qcLHt45tWZ+*e0`~P5h6cJ#$1IqjZaNQ76zIV$cSm zZLSW`av43Xvp9_t^(<+MESk0x4oS=-gWGYdJJxE;+VRarCP&7L>U!YJtc;S6)b_r# zqyP6$NXu6>*TSZBm@G7_DiY+)K7-O*K7nos+jT}6*q%|2r|Fz6tm>E%5tQ#tArJFz zjT{AK^b{KH#%N}`1zG#_`U{$(sQs(!^;HM07(2uLSAase3mWcW%ttEj{{!6r7pW@l zLEz3Xg0hBj{8h`52enmHfD8ZV}~o|HO}bg87388)iiz|F9B@OR(X0!9P+BL+da?y5S-dKyph*kNFWyVCxRyVCyM03ISuiJnXSC5Xk%Y5(@k zWOw0v;`o{|orOWq`*A}X(vAV29>C|=zuRj{w3yE>qvSdGew2_r)9U zx!Pl|y9SXVufl?FKC(_o-V)C*b`xo^gLE#sb~})19!t) z;6yXsHs#sAVtY?dZ%==~RVHKZVmmane#B}RcD=Ki)rZf*w#TI${#|9yN-twQN%u-| z0s3M!_9zcGNt;+4arME&Z53E-CD6F#j(#_AV{<`AVFUKv@Lkvq|(#SSQ;N{OTyd z#JUk_{)hKT2hrN1$!bmaSL$__AI6<2$bq1|JBe~N$KJ*+0Q$|a*{HI1B6_GZ{NIl$ zv1`Psa?QiJ2OVzTI>)5_fHQ|efweuadLp}6tBooi-`wK+|~VESn_PE3Yt6YakRFe z{Yx78w00vqGwIQ!KXcH*!Z`Ie)ICBBLodunoB&-`gjBu}ZAr$qU^Sk?tR~7gvG=*? zw^Xbz-syZnGBy`h-xPK<$tzlvZ=m+axML7B;PURe;y^s)rp2Cvbx| zodP1?o6<>1coGh07HrBBgf7T&2PJyuJvkULcN|*tDxGE9h<-#+ictbS(})!|*i(uo zoex^xB+@f(IFtbAgi&7@oP+iMl{iC-6N}y9+ZZpy^9GzP1;lO0fuJ0_aw4!%(}UOJ zdBa48Q47)$lz*`DyUHk65NDX|wI{AjF`u@aLspo-xspx>MJ;{VgY{7hBqC-#cDJ2? zzDS^#dJBsg#q&Y&TN!nEv4!|7w!Aw{M^4Nhhb461!0LKPt*pfq=vqc<(?_P zK8Sm&z&Xi>-^UjzRa*~1!nZfB6y@Cd;!5nAV5jm6>{Nb{2?6p9#cmC#Kl}yTsWfw3 zsnF_+b}DuIgSu0hoo@tcvhNjA4#Bev`bta^N~={vZAbP#r&&62urp}Z`hR`UPN_E!sysq>Ja)r=UVdw*lWIm>p6#w`Y>O^DVK4ykK>KR%jleJJ8VqO2Hfj| z+k!;7o^$vc_soT9v)ek%H|xk-t$w})}t5~XpW(FEz zpJESxePs~bO1ndJ0)*~jBW_&*Ze4+A;?@N4@dnZrj;cUxfz$|pkcHA$ix$S>3#)O; zu^MrCH49=3rOyqnep^x`vQ_F|T79$RIGr4;3f``s5)~^!Rey-__(|~i$xIM*`iq>+ znI{>Kn>l_blMGgO<4r4E{o(9dEnKJRXS>kHhCkN1@fpzWSoy1!ubk-`P zJa+aINY0DF?QZ@cY{K=(Q@@UMlrOwEBN+3uzMX}>orPz6-}+)@tZ%2HZ>OSfOVPKb zh|8-f!#%#A8$3ciS&Ea1J~jq|jp=abz4>|ae7$)v`Sp79J=F9~dh-`3|DW{c_mkhG zH}C5dnzi@tNZNbzwxqo`MX%bM;WN~ypXuIjZBw~XGKV|WOXbiy2Lf)z-GN(icaYEg zFt3_M&qvC!LyVqBPuSzp>_@d=bZtu zZQZy4r~I<4qYwY((`aq1eqSbq`Vo|0PT+Ay;Fp=3pew7j(C+-0sW{X52+njqf_ox& z;GW1GoU&yC{Dl#RpgaxSXW$t@S&!#hJR>NLc;1L-1Z6FrcjFmBxfjnmjz=DG$VU*@ zW5P~oJP0^H*9W5@g}f;XygCiDJYY8XQLGUjh5!EqI_vPujQ7wlb?@djq8C|e=*&hB zcz5G|!7Ehn`SB=)piF=t2yWhYlLk5*war8Pyhlyiem)_ElMwU;oD-6M65^pLpp>$1 zf*KFY=A#aTn>?EqQQzfEA^qsDSos7|7lQKVE1S6oPUBE$HlC&F&oZ(zXLhQSP?xDmb}MRUZ6k+kB?fbA|AIIMIcpnhekzX10$>U+%u1$vS5v%Yl3ETOF< zroqRTXF4Kb!d5#tX@(s~j-CMv>mon&Bt6a_M(d&zU)_iQ2@T`5z!*X44vgcm9pc1S zn~<8_o-f8z>MKYsh@jqx+S=VHi=ceMQa2)X7E=9LsUNe{$B`;f*=FEGx$r+hcmSUe zL8Sli+SG9kAx{W-KG@XnWwg$?iCHP8JSe-V;ANBsA5MJrhL@kS<=Lm@@xR=JJj9D6 z;f4T%eGzzUX|xSu&x~kAH&v;z&T;k}`mQ{+8Z>t%`%-^VJ?c$IY9E>P=&@9f{%q|< zq7U_A61^D5I*hn!d<|0o(+q2fU7}kqMM$-0c5Q|>Hw*ZL7D?d>+rUYy;b7POe;6w z(!2m4FD8rr1InYFbiN510w8Q;5H37GBbt2Dw;^sDi|cm)_P83-RIrcY{2X(vnZE}x zGJ7ENS1V7LGW0*jtOH)}|5e8;4!q(Fuf2cm8n2yywc_;}@G?2@o8YDLs@eWW0cSrj z+Rre02ybRuJ)ml^7+-u7xav8yG)CwM+(l=+jK_4C`H7r&JeshMpJDZ%HDRsN&aIoURBr$8V3DnXe2>Z2K=(-KS`^(RyPoeU zltc)A;*(@-7_5jX%vi@Iiuvs)UeeG4IMek>Pre&$%t_dvRBkZqp!=)Ziqw3+KppD( zo-7Gp53bOb4Yy~T4mYRm>%l$R1>7|__ZP(Omx*mXTFj%xYgn7l0`|99oBN3+krS-d zCjp%(l7n_1HQ*O^+V0jOJ?EcMli6}iJ8W#xZXbC+wSjlrz`LB%Fm|YD+E1_tn;}aH zSubeh2VuQ9F10VhjWr98V}(mM*N{v&4u2`N4o(S-HP=k)IT_~N4ejIzpd4XPt{hTQsmQ(kF@gGH~l0{*whd2mc4+ ze-Hd83p96865sT}|0zi(zg#HqdYoF;4>04gYWOvrVypeD;K6)cioouT`|faFcLeO* z?8)hZ{d*`N@z{T%CkLMTyDx?{9I+Siyqm>xQ+R#=d+NbX`}P&-Te263(0YMUIez^Z@nTiA0F z&;FUXEe3qqU7+){<4<=N>D+Bb`4VzKkNwV>?vOeZyW`C2$R_DE>9-Qutgzl_PHCrU zdwB+8O?HAaeFL$N`59Re;nQ$h{r}EsT|$#of}Q$f!k#!txApbJ+_V!KVIsB@x^WV} zLKCgD)O8W9Qg5=1p9DsGCG7S=*9^q!D+rwCHC9K3E5Kj$78t|&ARTT>i?>oorqPG*`it4 z55G#L`vx7(>o78cu5t^uQrO-a$Tp|9%XDjNvP)8HEKyOgBy8|*I@dg-&rStcW$AM=?$d>z72OdRtc=Dk!|GO@ z!6=Wu{&L{%9z9-Yat0bIc_*D5(PvoNiKaT}cAnlw4MI~G9HZwUTcfU@+2K>!IK2E4 zu`wvC&S`e&B&&5TuM~O^!PehZ*m1z7@ovV)4QSv7*n@Q{*6<99p1>3mrg&tQ-m}0I5&sW@Zfs^^fhmfJn*xLSjC=zRqTn9O&KNr5pImfTQPf+KI#K4R@F@@wHc|CkUEK_ZvDuM6NGfm$;=V9 z<#-WqX4$xQw)UgqfG_3@_@o9O#&MM&He(f*ndeSh`GvOf^B61> zb`?@h%xB`wOuObI_jzHBx52v92J4b6SQpx04Ya`$J`&Cg>+FZtKKK%EW}8zV5)Dn< z+mLFuOU9d-_LmR&^TOI|gSE>BYiAa$?KW6Hx53){A$ML_&)Q&p&jxE<7Ob^4Sohdq zE&H&(1K-uy@_*Nse-5kLq~Y~QHFHJy@AgQL>U)a3o3PK{gMJHpTCr*ZRsp72`XNR9Oo}|VKY+4VN}jSsv`^-TP&C(I<_? zQ%O6$k4}?U*B=-l6p>;$Hedov}jMy^6G_ zKft_`|9x}bLEO3z3{J$`19;QM1m5mt^$#-T9^z_|L*sqC-HtbnYw&iP0lNv@co?f! zK7W8YOCiThTj^_TrKbQpAuIpow)|sk`9~nXJ1hSXTmAvI{C$vrDDbjl)Xi4n%=^~% zeDOZ*0?|Bc(&PwoXd@TxIgB?m?eFhf8sl8-0I(bh*F5hxNoE-Nvill>oa7ZXr5_(dmFU!Y+K-$`cz4FaLgS z4{oyTE{w$~iC*pjqKBP8bRl*mPCN8+=fit71#f8)zfP>OQ}BZe;y0K1X48#c>Pg(~ z(mT?)Irrn{=w0y6#m7?F`CMykeWYWY!L85{|7Rb~JQityxaarj^Fv1&{}{_(CKgot z;2!~>5Zp)Jj+?9G*lW^meC4)p)j_EW{u58k$+3Pb+blyJ87(i+j zQq8$?Cf>|h<{AUL0%*=}6agz6S5CAR z(6Q{eDheS@U*&{j-+V-n=S2NCeV|$jVhntO*^<8dJ4*^{BVvi7jtKp(EV}E4<|JD0bYm;fIA#iUe}g>uZc6y% z8fY6ePtcp+_I54a%$#KjlCyL>Sv~UCv;5u!@sauNv6UE!H#2RREv+b_Qw8(MhI8AE z^_(4h&%UPp=DqiIyiX&e`vA=z&=dN{q5p7aG=XdePhk~*1;5Wuu>o_F>G_~x3<63O> zZI>p+luJS^@A?M}cs@HX9<%b&KJ+blj_-oLuzz@T6li3INeJPC&o=sQNbA}GFP+hk zyJ&0R^Y4pFlN}hFkD!&)8AY#u5%rSB?m?!Qz^HHV-1rZHCK=T<&qZWp`@1lc*7lKf zB#&IwH%@x2z80qQR$2>P^$PV8NrSi0{#f5ZbGf%P%UeXNzc zV*nQSAQ$2ur2KW?fORf^<#)iEHUP^7SS}4#_IJRVFbI~upNMo)56XKUJONxry#g77 z)YV#QI8x`nxgxOjHJ_uHC+Gb9`Z*!gn?KZ~u_ikK$FITp`fum=RIf`it&_72E9YQv7d4PX{oN7bQFUvG{1rjN7UKKiyE z-}G7+pwYqUQo|FZ9Z^~(WR%K&Sc2J5E-u=F;@!kQfei}q0L04BPB{LVi8 z?>lGpzh|%t*BQJMqoz}d?lr$2C+of+`WvP0l`?Tp59;zWWS7!Bf@6ES*whwJ<_Dzg(? z$tV8@j8QDcpX^8UJNl;MLA?b>2c_TJ-wBwcRT5Xee^BXHkUJLIp8e;>oX(?{L*WGC zIy!~YI!PkdNoaiaUVQmeMDn5b=Rkdk|Gb#`>Q;Ft?n}}mo0S1eMaS;fs883-^z_3> z>$Z!YUNR{C%R%{nHYok${d6a<&SP{4vydY;eG}5Uwx@qD8lz;M|^fmjVV`7I! z*fuajbZ8mquN}eX2H|kgew^@xRYL6X*-!h`4g?p$`*HyOOX&TjoKul@VAm_%B{NPu z_r3wUcl8xQJ^DEg(a$GpZ^sJZ?N}kCC}`ccn;rV+gGM|(-EV4sh6eZ3RrrqvSgm%xzr)2;i(zytRA29rYQ4D-2 za#z>J2IJFm9zJJA>G&K#Zt@=x*SQ1_*4~MC^!LKT4QXgVH0Aj?JI^*YrU=M?j9)8EhVu zKK=6fbM%XsJJ6T3&!`)Hxdpv(59+@sQvcDH3G0SIb-X7dX~P$>8qDD-0KT&r>W1E^I0)>x+h!e02&>`==xBc9i~|AZdu>%20C3XP)<0mnn2 zAW*#4cXWf6U4`cE12;hpBc%Tp=3D7H%uYb27KM1)tEoz6$%dqm(g> zc-=$LARf{wLq=^Lq&<%B_zy3>f7SVU!z6HsYH1~RT2Motn(j>HOeF zm|o&^0T%li8_KZX_nO@P7wK7R|n>(o3^6ixG3-}&=y%|5-%@9C5lwMmap z_(FeI3pj^@*%7GyAJZxB7o8#vV?3fIq8{s=u&dy=R=WoNK)UXtoW#Sam1KN1n>z>wpVjaO3 zz~2gEWQcwa(SW7|TSt#Q9(WT;)4ot$bK-E`G3|ni%AG#QoxVPjJLZS6bL(N^Ms;a= zkI3lpSe@+jUfKmOU{>q4j?Np7@12h}kfuO<@H5b8Y?;G*&mV!e2Vm%ac^$^z2Vmr* z9|%S)x7?wXxf*f-bfj}_*qY}{v)`efSn2m0q+_Ms<9mt6#bUMsIbu2XLrBMdUp#;l zNjKtfE?9l82Xu^ohTO6G;*XJz{XSd6*^N45TQU>5V)cy@q+`F|Fi_`e^uyud)Zb%9 zrJ~)20I!{X$>B~8iZ{VccNnjWAJ(z)0#0mt^q_PaupvK(E@|uc(tga&U}Z$oLe?Ov zs1Z8cPDn_2HGK{SiiTErF`}V3AqRUkcXW?udwhfQknGKT*ocQ@?^m52=V@HIBXxSF zI4e$&an{lQ50vx>6rF$T=ew@QX#5oI|7oQC&+a)tyPUZK#2?2Zwr#CT++ni|U}?lo`)zGUJ~p|4&V36uQsnp1r#-BrD$89mU{6 zvSR=4^YPt103%jbbPvF|kgV9GmHBR2u?qFX%8C}GV`WA2?!mI+KIDj%6+cHhR#wa# z!0AG=LPhRaSuq{ySXtrMa2_lxCL>quXkLSK>}XywQ0F;WaX`MXtcb-m6>z@5xP1|s zH;IGNcBEtT8-QIyun9VlEE+8eZ8$@bv5FFeDu#d+Q>23Tc1+8}I9p69*#R z!OXSf9ZYPE>dBayTl%zE5QBD$t>YuI$!`1N0AwVMae4^%a@*e?&_=1x_EWo|sh;xz zQWX9R&`|nVBEHU zNVuhaq4QAPPI?WvgnM2+O8+nGrT@SDqC@3+=3h>p>~POIEj8zIz2+idptp;3CGt~D zVe0H~&lO)1?o%{uuaPOzMvwNTn3E`Wh|=)$%DHcxlAXJ<@|GX#`{<~z%OmY`|CfF4 z|1h>iJ1^L~zrWyH@;Wtu7Vz|xq@L63V`-%s-|_S;#COmt#)r-#`s49fnmN%MOEcTG ze!TVb|BiA#`5@Z2-=Ai-fo2W_yR=n>E6$^p&R%`Qeg<5~L;d|}#jeruZ$2Peu%iv+ z@i|8;-=y1@hU*s2vq$v5bB^kNU;UiuXxe31gV1cld$n}#We2+T^q5|qc2d5ee!W4% zKI{LRb}}RFJqt?yuJ)p?3(k#<527ul8T$MMspVPNkg?Q1Ifi;BV4t>b74Dnflw;d% zWSp0xJSBg`b_MBL1*<-RA_oOy8?YV1_QE-cvJ)GINM{F?d9%de*@Vp@1 zU%14y?vPRDvmJXxt}$n)U_jV6uTrjPieOsy7|j>$9%gOYvv6sWLSOknf1bTy-64x? z-fdW9v|+t{hhvY#(cfrEgM%|R<}B1;)*5_9Eo=zGas$F)-RdG50;NX?gDC z*0F5Tld_V|jKVCJ)A5j-M%Cglj5t}HjnmJP9S!PERkS5q5$A2QFuxCehtQ2J4m=N3 zitUX7qae7sDuLa|?qOn})tBR2>09B8s~C-*SlsAQKFCg0%&Y)0_CHO|Wcsi4$_YYM$oTuR7apY|A$^O1U$-Q z;VsuQCC9RxURiuUJb7GPouIYx16L-~fBo8pTN4zrD9`VgGxPL*NkhNrIsZOT<{sCs z?*FM@CbNd3o#iF0-7BLfjE*doQ>iC*s$3OsyIXr}(caQH>u(?TrX#O&&|A(MhhDkU z%i~lOlnpppman*cj8ei@_?liZ?>~xm5hb+xt_K~&mEXqh#jV7P3&Yue3Ocpc-T}<@ zUumu_XsHaVIZ6W#cNr5w1xAMjRA6$St`+^wC3^1ifpR9TT+=Ju?$5h9PNxQg!|J}5 zW%^In+8m4A%_T$$*%gPo4`hFk4JusTRG7}v*o(ebeY<@(K$b3Q%uxpJwk3>Z8FAjK&|5cqVBh zctC4aCMequ%07h=)Z27wo(FBx%YB>_9r^a8o#+c{(`zwpqLL?x!nNKwSxY5zFw1Vj zcs}7XmXB5>y`^|nsfD<+(o9fUX3&$uQX0HpH zF>4#pt^&+-u4i1*I#8!h%~Q%9nB{Z)PKOyajq&r=*2pZc)AG}NPuBA5bDZ)&;9iI^ zS}qb#GC5izSS6h|+f3i!N&0MC?RwH~cGFz8i__TCfg1xivNk(sG?a`|axtFKd2Jk+ z*KZ8*FrE9&{@(4Uc^w*<*U<7gQ)FJB84?}cO+y~}&R)=|;pjmAN3{IY!0Gm7f3w#T z10`s&ezqO)CEGwtXvW43nz6TEa2~JG-Z}>56}@q+5fop>S^`b4Sa$3}YryZzCFLgc zS1xP!QR*?@q2TMmTy_InrOo+18}n*UIPTKofb$C=7Gi zgcsp=eXBf4nHqX@xgAddE1ceXbD-6r1RzgSRZ;D*t+iIEK209It5YS;nz8A1JWO>o z`8oApUYnNNU_I#lL!Qa~r@TM8Cxh1Rly3rE(k~vTiSy1!B~e%`Nx~fLg7yKU#!{@F zPnXa!q?HUyqrS$`VlSXo?jw?PKq{;**dT&ASrQoAxYSN|du~S1Q-M zt3_V6YZXx$DCyPWNdvSLf@E3Rz=Nh(lig@A9w^Kz$D2lzpJBh(!8|J@i=otB7+;fD zE(3!l#a3sTL?@VyQbitn7i)OyLA2%IwD_8fLT9;=cAtAXyObof`jj^n?Q*ge-V@ba z9rbM@ZmHOsPc3OG)pNCZM>4CDz!rKf;G7?dZ`CgLd1}%_4}=XRG%8nkby)X#n_jW) zz}Z`1{cj@I(nv1zem<8ZD5rY8obYT~t+#2<_=cuEU5lr)Szer~6?hAGo>-;nY`&N3 z`Lma+5(9K{S)7qG7W=Zw&u`1Cc^2RwkG{M<29j014m3u-FcZf!PPjoL>aYq8Ihodp zHXAU1NK6ks&NT+)(62e8{dy@q)Xq8Vg4-}Fje*L2xEnB>U^M!3d{?;z~BG>{N9o%Lyfbdh8FTmP(+&w1s))_6aA}jZ>Olsao8%j^pOC zO_(?K#c4&OlmsP{9V{JQbga-+Zk)g=X+^X64bpP~qcdHy3U9bFaZkr*?vu4f;fdrK z>}fWi1p{{mhB+jR$j-p!Y!VCRO&OtMys*qFT@OlQ*rRKBs~g}l2)%wf+4CONh+$@r51z1ye|RIBiA8p-EBCGc!#?MXG! zUXhx{cFbPrv#CzIko=UkfinuZ}F` zo$qL4n!xQWTU`bnjh(8d{_QCEcWFnFRIa5!!@qf0D$Ojf&gq|as%TZYMU#*YMsuF} z@(uK5jT<9vGxK*#d8|9%puAW$%x)S{$F8B9P(Tg5?RK`s-_EA{w?b#w>DT+V-R&d_ zv03<{R9&%qH+RND>R?o0ONT#@bt4XH~^M zG1XEvmj6o9duTpe;)fKSq|t%r^Ag(22o;0K}m30GIP}MUMK2(Db*-kDdF7e>L!8ET$wW;7! zwqagBn}l3?-_KwV2A*b<18o^b;dkQY%vo~>y8@$sqeOYH;9I0DHU({Mv~OX*M_WmM zKZ$Waxzt{m%ywb~Udfm~EfF1G9%*%6gpO&HrlZXzzUgRlU&j4x21`Zx`&~oPN^13V_DBX{IDvm_ zXn~h#raA)=hF-I9O-ghe(!eEY9KvqQHUB2GfHVHYztbPg>vf~ora9Fi>bwlIkmcIK zrm}eC-0jl)W^>v`WjeE92K@*v5(5dq>j$jDXE!bZZ~S3-iEkffm_zkv%wp6Y8sF&y zIj1wbaiOomcU8H;m{;zDrcj`beU|HK)I%c_)Y?I<@B-_L(LSAWRF{r%yz5l;To%HN zyN@H-W_3&k(NP9}Y$#zCr71Ck=<)NEIm`!2dp0mV@c951^MS<@U~%mL7Sl4cxy{d$ zo@USIJ16X@GTQHRolqV2HQFd_h|HC5qrGm>!F2yNZI%+YmR=7CxTmclq!hyk=o@`9{SG&Ld$i4{OBp@V@eBtDYLC_rgUO zx90<6LF+VfHwShGf_d5QX9GSq$uVE!q&ou}l}Xw-Jvff|Ks^8Jlykk)IF3`_&Y(F+ zV|Dj9>Z?yuX0SS7_k@44f6c&*)$wn^IqrYbWH0ddwX-?eIF|V?(|WKGR9&LKH11#GHE`FYS(H$)~$SjJx= zJq3MnM8gM#d63?Q(-d>-#?7jxy0V%5)svp2S-PvN=@m!A2}nbnhzs4z(Kw#Tib=S{ zm4KRWb=!mkBS@0{e4yTwsn?>`r9P`x>stYXI#MPqMchpU-W~L*Rq85RyOmRAo5!|a z>5zcnIvtP#0GR@x5-a6{CMEz`Ew zYgerpg%|Pn_Mlm{s2A1U<)wPebyU+|y^ldRd?N4HBb=-~|M{bb!V}mCd1*I!S>{7) zTN%6ry6dswymM=+DEw}?Bp6*oM(I4yTuN{@L3cb0y*`1nKu@7wHk49Z9`_p9qruTE z%XT@qUmX1~+`Ma{eDBeZ!^?IpMu{cx=;RHu{$7Oj*O%Q`{DghGJB|O7 zWZr*OZYSV(mRL3Em7z41{DNJ}TT*v+lg6{(ft%0ZD0>BDVGiV_W~_04!}QjAiL53ynVU*8vbXJH6QZNBr2|% zxz4*`kyuNykCnGc@zBP$fRCDs$Ftp_zTMM=`mv$2wo>~qhc@l`5BTB7O^wjTrZuRA zL}7Pj7|2o ziuUeW?Ol=Y&59*HW5!tiSjyMk3647lEOH z{T>$9rx=e9weiT0jEA|da~$af@sJa4_+v=k8;n0FFNI#V%c5mM8%=mD4F2OC(1l*b?J%1kqU!0NPyqCraLtF;o<1|>%z>#uh!A|GZ6W#zD>o}QG$$o2pCyl;=zYoCq zeOh1jYhHpwzg~ge*<)c$ipVuXDM>UtBpWne5rxqpBBDE@>25JC`XYP2OZe%1O%mL1UdulX4~eRnlbEkxv%h zNLYBfoHN&rQHB?N9DJ?PSl3^DohIpQkaP(RXLU)3c+rH$3`jboFxE8z^%uC!!s8=e z3%;!RQ8{4nvWCN9HO2m3>LrkPi+mOhgDyzCG+D=5mw6#g=C#;bA@d~LMo1XaJskWn zX+30~yJ3We8?VW{Cdj-y*p`Z+kag}BJDz*shbMWrcZO|3fFoRVsGRDt$+iz6r7Wsh z?e#j;!$Fg3sT)F55NIux!_*;M$8DsbrSF809t?qQ1Mm z#pI#4`K1ZRvhQSHW-nmNc0F%sEE=sC{CBb?g$tNCA)7VtdI8=V3*^BPLoT=>K^Y98 z6l*Mc&C7OO!g0#7U5^=>cU?+eAJqJ~>{4)|Xz{2huFAT~nXHK|EPTs0 zp7Jc%EcuO7i*|ye-q4s|)KtEM-B9#mIeAx_D)#2Zx$SBpqKeN#2E)>9ve!3PBoykL zySOsT`S=Am_g--Bz2Mw?r`a{mU2Jb~w za5W2Y+*#6bxO4WK4*7L&0c%H{kLLZ_{Z+Sh!Vj?K^B?cFqo>1Pb`Mbwbz8JIypRO{ z+{N(EjevjdU&D2cWN+CYp^cO(xf8BnS3{rqG{pd3Xj6adO+iV5bOgT)jK2Qc8*Rs< z;K%o*{TqHQ>kiCRO!Hf9+^pBS$7ImVAqicL^vm6^b>EVq%dJl}K3UYzw5MZvi*gSn zz|@EY@VUs|yFugOuwBF2?1 zsP}1Z#QXG)=6zaVje4J|V!Tf-&HF^Yl^vR|;*;;`eR?#;`}CqenepnKu;Q&{&uz`Fgb1}t0M|I{(yf12@~{-=jEzffAra7_jXd|^y2Z7$MUu1mF6Dg3Dj#gk=8 zo;vby%m9DVJsgYV1?TypR>2Q78&bG{8Onlr^CG^e*%4pV9Is9zy_z>_4}1ns_`BF@ z`|a$P;ElQm?Fnx)Zh9wg)UFXTG%v_~$qU%30ndS=c_bcl>mC6)wE^n@+=QJ~4*QRi zPpQM~d$bXLEi%H*8rIVz-l%5at^3cG2WG$)&xzRLb2V?&)&Xx6r+K6P0&i5NG#fVUtH9;vHRI$56PUy|L$n(vK+hwuqMjaV1@@|S~rQZ<@SDq7}6mtN+X zw7JR*&680&;N!WFPik_EPpW7j=Zy1wQd#h2XBMAPM<>; z!;kespn-h(5t-bp2kgu>7lbGvR52-tBcdD0$R7ZK1U9XFdOZ5H|Z1M z`>cMl3Fu24lS4l+i-A+>+I-3G#E2y!l?5(m6+*))S3?fvo8ps0pPVxK8+{4opL?Tq zx0YSF?l^Z2>=XMeIW*FYcr82cG6_S)bNHBq1Q*pCkF{I9W+A5LPrOubfA!#cL*6<~ zj%Q+hY$C0XJ!sL^$H-H1)|igEvamY#12Z2ui5)JNYY_RsQeRYuB3{&3W>VuQYUMju zM53N4L&P)XK@XVF>lXE}m)5$dFAV-EgCPIYOZ(tV9O0KL!s0_*l1dJNG=<%6Rl)N!IP*=~n7A1%Udl+@c~9ZtM+oDc%c|D)q2^ld|AGQ!ehSl zij}@gtP6z{Hq@Fe9857X4qEYgtj*UX)Ky$& zy_7Wx%Y3(3Kih6p^;=DEHt^_T0Tg==J6(~3*rmy^Xs{*)KdlfgWj+X-8VJk_(M;56vr(8WJ$GE_M0 zY2EQAHVWU8O3%#Wop}SA-(+?`>lMUcf(C5BCU)k1QxlBNJ9CUj7#e&)Fxgefcsyt@ zcIE6VQJ6knW72N$UJ5_bqR4!_9^>&s1$l7w5!tELz1J&14kpFuFgLL!Wv^-9y5UKt zG1Ik~t+3Eujf|odwiWz2)pZt%D%ht*Y)s9u*AUmq%b{6*0;|I#z=b|tCWjhKX@xue zQEzu9Y=tKu*4J1`zm2vkYAF&oF(78dhVyEzSbsW#s12J2DXow+x_7-l)a=c-yhKT@ zoXGspY!W3S+gNK=$?DR1!A{WK{U$L$a(rLuPVaQg*aSoxB45o9v10lOEGCM!%>(Sg zv9=eBI4xH~ysgo+I~B3E#yxz)`LVVl_fB?_!Uygz+=WOL$Kw8}(MVk5o?(k9l2-JK zu%G_h*juz6QMV$Tem*VU_Sr%4wj{lVvAfr{+7qNi#H6jV$4L^RS9Kqk$cdU%Lu78` zuc*bMQ7NM%1sv#`k(-r1y5mTX#U)-x@wkS7$Z4_=r6_VY8u9vJgom@b4scExH}TpK zjYsE_i%M5cxLRz}$#&ZpmajT69-+r+UH7A&`uaQUYckreYC#LjQC(EFPxU1KB zLOZxqYqMDg=h2{AG^l%#Z)46GK-JgYuV|Ujf|hCf@=ct??%py!&m@Ab0Fnv1r{6PjSSciq+NPOUv3=i9yoXNv2v zaFd>ul`)FKvIUdNtd7PW)dbGfdL&rZ!G*5Nwm2krR%mz*S{qvUFWk91I+Lv|9PK}Z z+YHaW6-Vp0WAF9dTO#9j-IpIEbeyw_qRQI>nx&yWDh}24$QmuM!#IM?Qj`ob!*AxqPvih@5 zql$an4SElLsr6qnH(9W|>)LU%oBR6E{Pk9Pz#P+Wci`D);sW|wBj85u&5L< z!|YKM8Pkfpr3JPHH~+5xs?)~GKs7&I&-F~_2>KsT>n9dE@0+~T4*V@^^{^kWvtp#~ z{hlLb0VN?$-I2*M1&7-Yi=FG4=g0)@hO3QoLXB0hqc5r5)Sr60_4&U!(q_m3oDNG^ z@EE&)uCHKX>n*s^)M1L!5b=jeTPj!+-iEa~3CcoWP1=&kidbXK@lM39^;oqw=`_0+ z@+FB&aC}}p(V7%o;J+wzfcr)7p|BhrAM^$NK{a?ge9I0tg>75AFv!iu-Rve2`in!# z>Sj27&Ez^!n-$E*z8rB4VPRxM;a_5Y@*G1co$@+1QM=Syo%T8~&N}7M`zYmgY`TS; z8tU3)$CKZhjq&q$Fy88-JxX(xM7d1ixU$yCkY(YXss9lv% z?>bGuVi{K0I&3~NXYZj`66 z9ksY`Hi;7+6WhBB*z%i);Kua_f{r>z?n>?V-9fq=aCMRz1TS~Z$F84#oM()EV5b+! zQ$ih^Yp$-QJzg^X_a!k>DJJAq4ZUr*Wz! zdcJE@S*r~_Hy3wSgnM?Jz72hPBIWMQSOedJb2!%H{>Js$q2~3UZO4fm>v5CgdLvS} z7f_^#Nv`L%A@h{U^N1@<9^eWDf6Zx|^HOO>H;wpY%pUp5<(+f8qpe6``P+#G^pU4g zk8-dX-BG+~q>I}KY7J+XRlxlD89z=mT;ep=&5i8h-LB1rMCBt;SRCY2dgu<$-#$z^ zvySISNTV=PB5!tG3W<~=r-!OI+zw1BvxpJ9{tQt~jv%(Z=9X5}q`(>-z zdenfm+EJlfxI~_>X|c5+J);Vv?Xu>_*W?I^koG>b{$+voq&x?UgOjC|oVuzrhxulK zp18&2MOT~it)+ZTLd}BGn>xd_2L7d#{+v-E&McNP$ZMP1f+!%a=SM?0p$lHS<|13^ zl8SiQ%B~Tb^O=>Xb5!V$*co)?>FJ#f!sg)*=b@$sqbgccS5Td!0V}KYY}wx{Qq_3W z#7~!t_Ex-Ek+u^1B~N>l=^Yv1WPft_iZaWkl^JcTaO&m|;LaJio_c|2t2*fvPD&g6 zZ*@v5=I2W*jq+Qa`6214RUNCgytPHzGJT5!DY13>R_di|-9Kkb1|$fLJ2)}Mk2tz6 z6MXnpfHzJ&9DdK@&T;=^pq^vv!N>5e2D0YZdJfMl$e1JG!$;POt2 zi{MPjjIl38O*M(U@O9eRk{|Md>k5=Jfu~x5M?9miWr=%>b=j!vUOlL@kQ*C1bauhk zl$m4TRm(-L&kPNa&(|I43X^SP;(2gLi`ZYC+54yPyXiJ|H_p&!i6^QjBK^rKh)6b!1F-milgChvFgO#WTQhBoKv2Jl4HSZ zD!8huOxr|oA|)>~KhruV-tL+K9p%qeR(UEU+m)(G-kfu@nt7x<3<)Zk=9uMeN542b zOrfvfD`uO#^yb7PyTbULU?@#yA#m{Fi4@H?g?-ui!!2Eqi8m!qIR}g3UE8v~0bA zXI$MB*#H=px*WNTB|3a=z$lp}-(6Si7=|&S@yo{kfWFQTaiiFcDY$7dg>6}|F0nPx zfwj)W2BA|rM+58S2T*QFPmJK7h5oP+rv^`vdC4@?7M~;wYg`P zreMdWT_u`+DuEZiO1mcD;U@zc&ZKF@88xkam~)U_Sn<>6&Las88icDa0AY~^;p%|Q zU+f}{ya2O{ATLOOZ;K!1`u4hO2kN%Dt~uHjE@0PWU`A)0tfpB>v`xH@;`cc24EP+p zYs9Y+S-XmZonYCxw!e1cmIB4wmUWv?&9B>f$SCuVq$nYy5)T|1^XiL*H!@Z@dWQrEe$^HYuY+PG)8 z5Jr@jS6(uccc2+}k2H6bxyX}=6XIQtqe^3ylBtjkiJ^*rx!^LBz{bBV%mNpz;VC#nLp9BcvNv6633#QG%^9?a>9 zH9YTdWotF=LXE{8Tw7MBO+JSM*XFC|xR*D-&L2n{ChK_GUCl=>=JIN!B2HL z!jI?a%Ox>i@;cE*oC$7sHRLpR@@u7hZW_OZtIE@Qf+P@z!Xl&J>>P*F6FU(H;}2cD z;Xv?EaKqZFR<4db+()ZLyekE@7ASe`#WYu?If?_?&@tNirOr{D^-olay=TG()d7id zHo;)WzDst<*D%}fch;{`DqH75_gj6VxI)V7OKApA6P3&6R02-1GD(&ZFCH%%oPxVR zvDe##iK#n-w%rrsjj|1}1=;3gi3N_6X?g8URU-e@@M6V=_?`UFA@E2%>YR4}Dg*RK zXZ>sCU&2F2lwpz_MPIXXR`8CT7fUyyR-&xOQ*gU;djOD9;B8BQ4LSIp^ zL@nacn&p*=y(hyKP}yAmGjXm${caTm*Bw=L?a*7@2IXwE6>^9E{>(cb)?hPmX>R2> z;L=Xkmb0Ep6DD7!;G`tX%jQzx?emZNrf%zTST9&L9|4ee{ST5S0~w=<Zyxu(Okv~MSXg@Do=qn?oLVy_I66qYcdg0h zXPQ+$h5bAjj~zK=k&o52Kky$~v$DbN=7bEKD|ZCC_L22g@QtBLndVix_Ivs&Xl)|P zkjX4U{5O0O7R*nsN5NNJ10xUfQOj6O-}JEbh`u@Ld)8#ZF4i)@>jJ#*)+|Y{=HjdrV;sQf%<=<2c0k4Ha{ z59c9Zewn88pKqx*)TY2oLw=4}Yj-ddYXr(%K)JB@hkOxVpzU#7)SJRRMOIit#G5kM z3gcj-kR?Vo)_@;RxE}L8>R;oW*Fn~kot{nhO$5%d^%t_wid!vpOG2#S7A0ARHnoD4 zCcx4rJ}t(Y^nl|`J zefUkb8Cho3D>bn_0?#JdonpK%tKtVDZ+%Ij7u!O$&MDyv(pC9QgXt2$2cL2Hm; zuT653{j6KfqToc_c+`8Vk5USog&6x9E(RtPJt{ix#l24GObrzNu z$F1ss4Zea+lUByUw7UmW2geQnU5>CL1^3vTO+q=c8{=VX;qKjj9U70f8#`co0-9%~ zRn)MTC)_bNyqoGn^RVMR*Ze#mnXRwXgIjE??1=) z1my3p^=xtCQk_3Tr=5)Ge+Rg+39wDlf}AKPCLN70a=h@z}*gJ*?yW6TlrQS`n0PgO{6cc zGdbw(&pwOOS}Wyy;Gwa6p|92G>q)v__XY!}q$)#{N%4|on6R__^CHfaEWVn1V%~6d zb?Fer@F>ot5l#Cz$?%BbQNttI!Yaig{se0`*@8t{cgQ5Ct}?8qH2wk30Y5>Snlnso zDK#QC;MLrwJz0y4yA#c$b|>a0DFn^G@mbsyJc)dQc%qcs zF9}0hfQ{+kboy<_Z`ovq^i8iHRljrIu6Ye1jY~?@zqm4&~ivIuOV* z8O0&1?#G^z#DJ{P5$V$+!wx0Rzlsyiql+GeOXJHXPmrJG4%^?ZaM^ikWyKWlHGm*_=>AL!x2}h0mJs z3wc{I{Sv;OO3P<0SicR`f}&iB*jiv$nql3;KY$e0Nwl;vk``-tEp0;jUn$64LpbVd zKeX=}T!X>d6gl-;IS=~_`m1?c5=#S4Lln~Oypp44l7`duz-bCF8KPK$lMTN{%7hj3 zXX1MbVkZcz!@w#Tzdx*PIeI2c^TAQm0$($Sl?M71#xIMM$PkTf52ZOAMw`JZ1qdgK zd!e-}-HPIRt_PnwhwEsXboqul-s$GrMWw3M)82Yx@d{CCz0toS zD}Y_tn58~oZTNLNDH`%75+AyrTm$w3~kdnoi>AkUlB`(9>!y|5l;gAsZY;foCR)- zQUM>eq4Y4mAF*b#`Q4tjhVHt~mhO!>W%gKS7xoEl>=n6(>WgsV#GKmI;6we126e6) z?iqGg9}D7Ik$-?~-h*B)jMhRUgBTM0-?(RIW8bax~5^RL46KU3~iipTUn<0FHNDCh}`c@G(2;FR7br zzgUceO?o@*p)}D1k2v08w}ZVtVU0-z-k8DfrBpf--9?CDBaIn+^9&E`4!-{5q9Vg% zPb=9*S?7?X`;c#s=eoC^+$svopvAZ!ao`bGEa?3zJcZ4#HK=#1wHT>|XDq6vuBJ9w z>Hb|-=%ZpoC~fhbEODmX&h?Ct1jSR>FsrdDzUG5U30#5a<#x9#E3|*VA@sNXT#q1S zvb4hca_9|uU3+Jgq{3o#pKou;(phP1uFGktvhjD?hRHwmj{!ABOMaU2&5}n`&Xx48 ziLaU9_b8*=V`2X@rC5~;3AUB-HA`oC*W~&W6_0Xzm9u7qGjWZx{?W7wrE=b;N?KVn zqkT`FnfN4+eR$!X!+oN1NR5;G*9myP_zbN^y@hvr@990K`$zN`F;8fcA$Bc4+_Mw8 z2S*r0^IkP5?{B{&uMc@S++rt3Vi&?azq&wf4(t3h?>(U@hSO_hM6~8+F8vzszvzdg1*q9r_QY`9>SWoFZAwH zMW8qif3as3+IBP#hrAAGe7A5m;X2S4zuAGOuREo+3pQn@zrVISXI~j#bs%5oEAzJ` zuwkIviJ#)GKH)OhSr@7+1)gfXuHPEYuY2OR)NOUA;DkmI^4*3N&c07YMMYGHv5w|; zHq-gE?$w4YHAQy;co6|=|mLEGkG0IN&Zf&oDawjJfz1*e&Non1XlrS zapD=%Ye>1pR#a= zuQgLUX>~&1n;}E?TF}Rp@T|hWjQ-YRFQ2l655IlZqhNMbPpoMyo32_Ns+x?xWwxX9 zG8|XpY~aCTJ(<<{|D)lA-Uep4e+@ciG~YR#Y>|EyC2I3a zkl~yXswPR{X_ad7N~fy^w2QZ8x2DS+H>C9e`*62`sk55wqO16sER1?fM>9sf6)VI@ zNqL>%$88Q~k{toDt&$}L)S5AEwE7-+CL6m1b&jKX{S;lhsa3OEFO~0LNv&xCtDkp_ zbb;TxhSeOZ&Mtk>K3t;O7TOcOr8a?TljBfVD#>}RmbX((+FG4Sn+YFjzC{j^m6p0H ztY&91wZ;bCI7gWZ{7j9Y2L2bq_G2syQK;8=vMg!*C&Th(QO?b7N zav2kvRa$8|8{c0&88m&7%b>yeD&C+$`3!#v#((1J?uNl@{pYXr*Kqnu{{o|q%Rl3F zOb*1;37$pp`-EzZfaNx2VuyPlcApa_JL7dso{!ft>5lIkxZ#1?Xv4gSdL2&xhGGG9 z+t?U7{Ttm+;=`|VT>JEI$ZK%=83&#Kjgp&edff`9{Nyn}{8P^v$@Zg6pM zh2c=d_4w@y#luc+8P5*a+thr-%OupK*Py4RMCF7x0TGrd4F=#oI+0U~lu&)RR#dEQ z6GCP#Yr?4dhR2X@v%$v551Anq%$qIPoiPOKX|HQBM`R&#+~;Upopz2AVg=M?GB;-& zR%#I;V07AQ2*JAnH=^%lhv4E z>_V!Nfea0P6C~bx3BP;Z`5g7MSxQ4gWK1-=oLsER!kzj$-l< z!^g0)jCJKCip_gJavtUNNzs@*84-Cel-%(hsS`2!*j;M z!}c@5=iQeuMzLZ|D?xb(yJtzRpTr0X7(rn(Q4&!}en>=G)Y2A-X5;gafBIhF2#x4HjGDyw7Hh2QD0>BlO0pgtatP=CwKS#5J$6?V;&r{@)8Mc}EMv)jTw zUEz4hdDjMDw1G!7Q~{!TT)1J-xU9h>X6W~+A8)*YsX%yXOl*>??uzA6g z)H`C^4d}@@Jk+z)t2ZDL-GZ|u`w}ejZ_%61dXhk0_LFHA%t)tF#eM%0SbdJi>T^8& z78n6o^je=qd+FRe0WHzzTRdi4F010gJ%`SCLN9O~=zU!`?4Q#yNb{`t=-YJK>2>F8 zzu6ba8RZuqoR((68E)rFoJb4zjL}MnZJ)yjqSt@-mQG+W3VLrQ6E!_HCd}X$;zhY@&iOIJ;hu*sP(IoxcW`70#Nz$4 z3*^QGfmLc!Kkp3p9MM*OY0k{IjMqGinJg8WcvqOBC@DVV>rRU93-=uVnC6(SGkuC`B>0l!aXNG;e^o=gWuv>>$QQ&#gv1z{=LXCT)Nkv z6?nMBvle?xwzy>S1six?GNRmjC`aBByB66qRKs^OwBK99=lmMcSfjBk#^wp2mJJ_> zN*-n`v`F-gXJvo&SXoky@InoD56Me(%~?x6Ta(LyUGjlE9w%mr@T?HeKIG(ZQbefQ zvm&c>W5*c8Ls2voxTI;!it+h;>6n$I`y7L(I!2S!IB=rUBn*+J=M8aTrWr&&vDM_7 znq!rbGK&1ZY##k*P?P29IOhZzh})f?S!%2DTlgA8l0I|SLIoQ z5kt?A_kiS*m&<&1!B%RkuOqYf^>9{eV}~4?#dY-_3mcdxzq?lrbBJ$**M<)sRm0^3HybVoVrQ92g6tO zzKwX5gW;^u%B+5@vMqWu6K{_Xv?~MH(RZl`_7Nm}?kXNn0c)=GLq{jc7w(z+UVi9r zS&q=GzsYP2qdiw#&k&Rw<;pzzcG#3F%N))N$z5gFN;bxneDB~?)N4nrRPs1V;;xBz z!ROqQQ1Z1(lU&1YgBExYzG1s`u`&+PRd0vw1rvewQ(hlxFt`?}VLn9>z##&3rTb3K~#9b3lJ~qEZ#x1L20Mrn;`)SHs2d8&xR7<{1#hw!CunkJnZq;z-kmPtHRWho4p@DB|SA@V{0` z_ODW=D9u04#`#n;8DDRfXR^2&zvgi^aB~&Hj4*W8<0uZ-lS0ObEM~G_mMjG_d*29; z27ZnRmS*YC$SbGQ{|g1P*gvnKidz$>@Sxr)>`?8fP$xGD)GTiEts>7Z7ISjD5L;8g zcH&MmqV?OEye)6r!~9TpeBhdGoYUeuaqHO7uflP%y3H5*!72_+FEkxt6n#KH6W&zaP_p!>D;(|R{gorvtZ`#Kz&K> z;y~t+H^Pm4d<4cMq#S|s;bi7qioU}_khDis%A z6tPJoRU4#gxM%d=8)luJC$G^{`(KH#$z&si<7u4Gmr|-ch4q1x^L~Z@3A>Z?JZ(Sj z+ywl_h8ke0k!+fH1pG5_OZ`Of(GTrkgEITWINQNE1yZPk+fiE_xT^Qv@TA`N!kNAQ z3LBim-P9fl(lpxsS;}S9>du<_czNQp3#<6G5@ZP1#rwH!X4!#AzxTqkVDHTj+tiAg z3!dEwE;6Qd!MeE}DmSMCtM-WHwaByT|6Y95emqV0j}fOg)DfS4G-EWz$53}nJC9z5 zesw2yt&I)&fX_j+VLThAWJB7Hs)Aj4+^qP1=VO`gF9-KXc3nNN-mTm9WS`S2`rzG4 zbnA!!KL3(|Q!^C8H(tFzoyY81q|Kql;qId$M8NQ+UA>{OwrB3XJj94`+vW#({LN|| z({4~25%1;66S3CK*A(F7AP-ifTD5myr*x@Ubq1ABmOWJlermF_-qTLeSr%8PO7F+Z z9%@nLHSfP0_5qXsAV&CxR9@*i0t|$LndxrghzyclYRv>EyQp45yw#-l(E~R(JSJk6 zn`QD3z z^Ks|(L++>L4!{`Un#U5%Iq-mbaQ9E@?Qt3Y}B zhymWKn>afh--+&x@ZC1U-_0ZXcZ{OL+gLed4d33#f1O5ghjSFqDlzh<1z!lZ2l1hA zr06Y4k|%cS<(jdRlk`+8&RvhTj#sF4g4Vhfh$Q_mGL}E#Y@R!^e)MABCi|e@&Jlv|f5Fbc!jAoYy_55t8Suw0g&EvHc@3!LX@?qc}-uI5!}aFyL=aM?p)T03j$#mN9iXl{OUPZ?np)$v5d4qivPaBJs* z&X(R}j$Z*y4f-rJHLm%niEBZusxPz*+)1k$+@FHw!IhxFg z(6p%LWX|6qw%IkmI%3(7KG4x$d!RF_dy`$!uUTZCHjfsy(I6zbHv$4qGH^ZpjD2l0 zqEIY|77_fMoKBoWhNJxOwwF1a45!rSZ>OXz7#FMg)G|HzTbd))f$$ytXlDXXxb;|MMY| zyfueOGfhA&XJA0wfJ&L^46>+4B_NQ|;fdt&X^o}4M-vGwNTVdqd*06@@x{KGXOK#tQa#rT~@Ff;2?+fA1+M8KC3*_@C>rC(T zQ}vHferL4IJC}|nw%(nw&T7wi<-ppf*ZCD*+48!se670~zNC>l;9AMc{nY8OF5y$@ z$7#&I=F|V#c|PB*TrIvi_{^j3sxONE zcOFN+rrtj*>}kZ3f3u;bu_*l6k%g`6tXL;+rFb&hHrlS~U6^lww6LitobhdU>Pgk_ z%yl;wy3#sZl?>wdi%A;q`c3+`qi$VqEYkl~$&*2RD)#GrgQ!){$K~5bo;ym9$T;^( z_|#@AR2!V@?pElh2icXM*qh##>ibJlm#BJL&#*G*VD&q5SBh<3sV(5sz6~v=g!dU~ z`05|3zUz|F?{1_wbl9hNMbXZ4XogX=rLc=0Q$FHPAG$Mm%Y)T6vn4ZaYFaKj&VA+g zYnQL1&CgRQxV%NpYpYplSq)j`_E1*Qk%~ZlU$3XUMOftl{_3E}eXF=bv(^ z2Sb0*Ei#VhDt9|YMzlN{_(^CgEr?3T!GD~OdlG$Ft$jk3KFrj;@sIE&O+`1#=z|+N z3DL7{N#{Ob&k_6b7%OOoPP!GU5PtoSJM@kkR{H(G{Z0D$gGWEV@7pCKHncqLNm}$} zyoaL#`K-2>tnLg226Mb=J}ah|vCzxSoj9NT1>e4C)>o()tN#(Pg!hbOsTM*DiCWRs z`8R&!U^IIS|Axi>t@%-_GjtU56AtOUM2*5jtiwb5896rs(p8_)lAG~{M2eE&PI) zeAeF@{p`#Z(*jhgKfck~u>Oy3T=wn%P`y)g9!l*Z+(^67KeBgWG<(cB-)-z3ywpj8 zGHDs^eePsxAT1)l)|PLLS9Rwzla`$GlW5LpZlpD|*oI>vF>A`#s2&FIp5dUrjj;>A z-OgNAw612O)Ld2vGs^7U$gP$!7qk15B{y% zZ|L1?_z=%DdRJ~*U~}KMw;k#cpPA;zTQ}C8?xg!S-$A~JF!wFVNEyOhX1p<*IszU1 z{onu7bFR&tyDVg1R)j4#SGCZ63TLJT=wFpt;@N$rN|Y^6|9hD~aSlW7FMIj3yOQ~` z{mJYA;=P=6=0BEx=H~3tXDm;?nXa*StP{Pc5LlDJMZ-mWH?V9*(A)35K z?@~QC^`Q19sdpW*E1oym`h~`^2UofLU8i?gV^urm{6p0mm3bF)pf7@dYLSRe(a(0$ zjkSgqQ$6p~P`irwBXr)Ut1Dfm+PadW40b1d)yq6xp@nmv!FDyyOo4L$cjG*G7E(m9 z^4pu|gU{5te?KYeOruyAt6o_etIC<=V)(yDpXN$r%jP`5r}OJ|;W z@RG76!Y~;N4t&msNPN{(v1x27A{@Y+qIIVOF%$~h4sifMpxE~*G{vbsJlPg zd&+E4htkR}Vs-MXs*q>Ds#2+W><1%B$7s&EsoA&@^l0y5pUIIOT=9R_Rncrf;hAx0 zrHe|%>D|AW)Pq}qN;IYZT+e0KThJofV8Bvz9a&V~?+TO=O&CrKV)AH{8FxlYU3JI(gjHsoC^w z>?*RSEu5Y2<0L`?g8}@W4QN6{(F68)0OV#?~+4raNPwoA?yj%C=Uyw6n$${NP&-adRHgfQqk%NKZ z<>aFlu4di4=+^QJY6iai&%1-1e&y;-{wH_;W7=T-CzQiZ<^G&p=p4$*W}501aU#e$ zuY7bsL@0432aqB)S8C3A{^saN_K7Q(jr`K?wG-aCV&1Rvo|^Xzauz;sNwdVi`&zg$ zD-oXYyI$4E5fF0XwPb9kmea98&QEs#CGICdIiVlF#v8LkQ_oCX|1kS#{a~l^E_{oy z{V-n2?{G%xf$>)7lap3VQZ?FL#_smlPpICf`?ITub$&-ShCM@CWN+KwAGw$H;)&}6 z`E0`V>bCp?$?d}FG``n$e&#s5ZyA3ypB z27~tY`d9tw^05J(Bd@J(VE@CWN!MTh^ffdTJ}~{OwWDn*xnFHHRtO^b6+_}pqsJj> z{pfwDF?f3X>OUE8N}#`CHAdl#atb@?*J;B83$4x!b`3v9U9X?Xx0t8*u5o&AVs3!* zk>~G@_^0l=oR%`B=&eyi8T_$D@$Y;6!5|kDB)!HX%Gh*U3_B=MG zF@9tub`LYr;@7$G7vsWd&3XSRGkW| z;Qs8j57aq`(d=VtTN^NaZ~j2#xBAZhP~=c=9vSe7vgD9wZ|qhj!aw}0*HYMP)z!CZ z!f!QD?{uafW}THDTQqC>(d-c@j<*B_M_To)GefvD#JHpO(&=33FLvVF0KN@)vHOy# z@vjAR525A>cYk)~a@@1lqRU%&KOt*l-kpaxPU^-u*L)X-cRf1#%%{?EMf&g`zIn|! z`b^8$)?atr);+W3tiX2XB>DBR@|nxnBcaOYUySxpoi;PySTyoG&H>U3dvVi?A23%n ziuHs|o5%CZ6yt4A({HLyyUrUk{6h!7JdodiZ{N%NJMB(insx4}k#k1x(2ev~)Xd{3 zHFvOjBc}*so>Tq20K1w!w8qE$;+aXy&(r^VE`+l$Y6nWE+suWut#+#PsC`(o*G9*m z*?nbqn6W}W6pd^tRBz(S(&e^qW-{N#a=W=sB`xPgj1xHn|EN}$g4rRj`ipPUU(TRy zy))drQfsg13v>P=81Pjcq7Yhb7ZML);-6}??eSL?SHqeZpYR4+9o-rOw}5FcLH-RNEWhw?^A zU7e}mtzeN$R{N9w@oPfX_~ku0zT1+=skwt~kE{;&`)aJ8A3OE(x;~q+C7fBCaC(pr z2Kq(rNSjL^jNdgssrDs5A|aj~^X8r@ue`rreR1{tJojg7+`nEO^KwdVMZ5FEUN_N< zJk|Ph86kCCf9|2%m>pN^;Pt0e54i2DlhVDAMzhyo_QT)SLf8SIZ28KT+|@Blrmkil zTArlOqSg}HT$Xq0jm6U+;XKA9dbZ3%dHUNA>H+qV^tJ!9mufph3IgbDH#Uu?mpw-H zvLEY2FPn3!mPu*&UfhM=bu_)}AJes4{z-;b?O)GnJ};&0A&5LX2y( zznwzwL7m((`{RG;mBJ`N^^uh3I?5KIGPSEzYhH~AV z>&sl<GJZ6);TWO@mQ~f|?RIajoQPY_*1)ZmnaUY_&{O-<8Xsx5^0hypTGh zcvQWQU%kJ52EQsH2WG4l8L>8yJ;hDD-+e{CdVA+r>i0aJ;+NgRKS)(?vh2>u z=U!glXM5%G z-cboU-Ro1vE2oTeTDQujr21#SBQnDGJ0fAk7Rg+xUr=90`|9^U`uToGS46Z2O%`C8a;_AZ^;8*l6`rzfWfI zQ={*@8+$UIHGhrsp288<5Bv7y{icET-P)k}J92kMl3QR?@=% zV{r4!xN#-Bna{agI5F=*+qJ?svMd4Nyd&FUjSBC{dx@HpzbFmCjxLvQ0?hB>ze+BkH=-6Nq8ZEPayNH zZ}Zj*e)E7ij*9rVtBU2~;+dS(Q#Rq51L3K6oJX-??CsBZc6F}%GgdlrMOiZLJeF%- zx%o5PeZ&8TR+ksmI%>-+O6w%2N^iT;%POWjT(SD-hKjlhR~bv0GSDtkQdRG?>#nLg z-R>xmXsNZ+c0U%T54QuG@rHTUS+G>!_LTsA(T=Rkg#Vt4F%| zEJ?3-O>0QtDtqw^hx#g3K50JPR2Eh1m5$1)ni=ZZ zT|c;QSY>K`t)8zmGCD7BTwap?cuiHEL$@^yY#5@~IEw7X*TB1eV5`J^!m!Hx@`_rW z|CFkW^sIVUS!qpCy+>L-+Tp6NOd4p9F?|?uBvb|l4*qZc-QMFZvEDB1+k3p7%UkYw z1V=Z>J*J|j^6{b?hhE^Qsl`~50!(#Gs4A_y<^DjYvjO)F4!fRPR9EMy!Li46YE@B< zUC(n&uQ0>#-2R`6D0z-rN1ZAJdTw?$`I+g$qKljrGu5qhN1dajt_l;D2_9GJj?$uf zXPus2RH9EWa@IR)`3*T`G)ZKi8IYYv*kox@h0|dl;xUGSd^1eJG+PPGt$N&1qawiy z>&hK^NqI#z@dUOBl#)&lM457FMOnS!w4laON_>Idm~f$Ix+r5xCtknGIQ7aR!gD$F z(u&e5eE6Q#)Vox%Ri!}0USC-`1Lw81MP&}$xT;(V28Tf-UAm*eQBrScNQqfm?IM!7OoB)fy$&D9Ew5TzkV-8d0uFYpN>s+NzRijyn8K zs4ppTIP4Bpz`a?ZJJnOWUOYn|$hmSEV`w+9UAaUK2i2OX%&N-DBA4=Srs44#qoUL6 zsywksT9NCXI&!40zQ#p$XXdkBH>27?n8q{gLZ=`WJ8JZ*QoXXuUhj0Mn7v`%Ms`%9 zo}2zl%8OiO4v$A~NEJj@QR#5048yfIt}^1PENbw&x+T6gc^nO@P!u`!+KMuTQfE<_ zHw-1O?|BIdsCQMA6d8Gi@Fc5ank$Uz6Z`*heMJq5^;X0cb~9sr>8N$M>}QAdQT z-ZykG*3gG?YOkm*D#p^4EtqwAd&j8Q6M<>?4WS~zVIrY?BKZv9GlWk9A2XdQugJwJ ze3n(zl3pXe$J%nxd*7%=JjJYiovRnutDN;#yWVh(J6^v=nBE-p#bj1Y=)|;2ujBR+ zDUWUWk)D#q4R3MeN-4ybd+LI8@c$vo3>%>k2v*d(U96q zv!O#|Xv=Gr=C;^qH$9bLk=>{S+lTGRs`mD(%81M1G}B0VROO)UUR!^p$Vu@p!YmNk zEQ7asMwI3=k8OGiFM6)4s?wcBHIzmpEhTOGtShgfgH%Pgr?jeussqQ~$^gBq5^Ppt zM$KN^A#1-;RYLfrrM9k!UP@63=3i^{lFU55^{!7V)R`WC^nW^dGkQer?zHpb^P}QY zxl>hdmd^=BJf1u4JfLBtE>{f!64uqDGWuNkDfy31cyOR?L<3R|{pWuZ^2g=oj!yq( zhnV(v2`6uKO1eHaB`qT}XSAOB=!EZoTZrHM%=aWSJ$tn8;#ptEjS~M6XeukB7WzP$}>5 zM46|dj}CX+)e~*w9sI^A9n@4+;44QBS*oj@bS-G~<0>kvoeuglb&lKApehoxZ>%KC z8<#m$6KwqDP{%FZGuYa=Ye-8I7+)>hl>+3aW2^Qoz*tTZ~sx3)+=eHu0WE&XOaTBR^X>DL@Q>qSl#{ft|C z&fnI5jjmQbU=@hjZ&m?(EuLx`RwJH#)vQ)MZVtyit*y75d4}k1eHh>PxtQ)k+Xz0_ z9LoEI#o7$pOfz)IP{kPhI8+;9+#lFLpNV0jN@t*_qxmD%EB#S%MIB|{GqFHE1V~^- zb&;L!Y(oI$8z&VmvpZZ-t-3?lfcHQBL9>fT3=Eu#>`BHzRDIWr>~s)}IR?C_5j|zR z-d=4aAW2>0$J=92qb{Fk3xa43KgqGx2* zRz}+Q58Ld$vPgCAjUfzukhc4^Gh8L*HC2o#+YesyutZW*Pfb&!7aN7y7m+b!{)UID zzG`2ge65>D0@~`j5=Q>THL9aYTZY9Hsjg|e=c*p9HfJVy;Q40u?G1|x6sKdl!>Lq+ zXEjOHz!&;+(4}sx;N8TX_ zX{zAUomAOg?Fro+WAnh*PPZGEjZxtNn>C z&=s2WRwbosWU7R9sQDJv?mE@@&_z4uWSS;A#%M})#!*~kFI6%s zUq!{#ZVqEkz??SXeg%^+>Uo8W=_6QK$}|zA$eFCFQ;ElkIL77XjLV|fB%18@BJsT9r-8Ezl*H%za@<3Z+WJ|PV_wA0L`M@Hm~Fv?bc#i#`Kk)8E5ZT zPq}aJxT2aK)VDl0hSRE(^^I=S2>RQet5G!1Eqvnaj_GmCCi0beNTWff$8OiX_toUM z=e}oBT+NE>MHJzF>RH-^+;OQX6Gqc6s7iHG*Qv_Mu=gYy{*tO1((J3A>6^RCD9boC>NiS1Ew`xtc#@7o zqp4+%qn25G>VKnI8OZP@oBoVZl@HM~D$1BiQEfjS+uRIM^S;y?ru?Ra)F&R<%xfhX zHJ8Ut+Z>Jg&6BLhtC-RDI3d4`w#7-6;G3VxP~F=JM!z^Z!KRPRm>F~1XYt?iY?$X+ zhdJY1wJzlAnu#g1nE-m~#`r}|H04%QJDh43nT~{~tK*A5JvB4`b`C~WaQ>v+{G5d9 z6U06BQO~~Z6U%e;r)eiGg7~Pv|EeFKJ{Wr`OCyOz zSXA5GdfRS5q*^=T&4|IAy9~E3NR(@_w@$vk@}-51zP5 zCoO`DPc8-$Pl*hrt*I#Wn6aa-+@{ac%W53edd6c$&tjI&q`f}Wu1E22XsJGI7^o<8o8e$>1wU-MGN-a43; zF)Rj|E4OMoxm~ZA%9_kdOo(Q|a$rM@(zE(ct;S&%ZMNLj5_zUKC^fiJ^`p<;DJ5z; z!>C=%M{UpA{HwB{=4HL!+uT&MDpqCAn|r*sJ+nKUMKjub`QmH~w`4{Mt2Av+WDK2R zZkP*9Mv*e6t!nEqD5KzeITyd7dEW1&oA9CRB;=<;z# z1+{*KntC^u554Wit!+fdYr3RnwTvHp3{mso=2w+L-aa@j4h>O8ftr(7cI~Z#9;Rn% z_H0$lW!B^cYVDGSkWyvn#&ClXs0Pnl*BkfpxMw={J@M(?Y?~;{KHo;w)fNkLYq!Mn zbuYePnQv!gPH35`HO7W@;!g66k1}&v7;uzKtF5o}h-ez;gc(#QtQ{It*`&u@GBTQN zqk;D6Q6I-7|HOw=Q4yh+7L_=>YbO(wS*UuDFVxUu&81V1M`iz>uWA~;`rF)@{uwkI zORpZ0R0qQBDu|k3Zm zmQ0tP<{L!kdIr&i^Z)65G2wX&MA39sj~NYm`qBEpis*qALyZ5_(5^y{raflrkmc%9 zJ$hhiOiX~7>Lp`LZQtS{P|V6r`DR|i>{ik)s+fvraJN(`P}ygdp}*=HHYHS%r8LIo zb{HP>+-R>1U90cpyXT%+tJ*zl?dIsXt+xFx^9SC}rjvwFQ5$h!ZN_wiy70_6821A^ zY-mu`j?$Ld*E4EDrp+EyHA;zdn(u3^`Ar3ojt^g{LQGUf88I#T)@Np#O)K@)5tL`o zx~R8qP^N8+<2%+{9#=$Ki%V68n0_cNH5N5Z_r?Uqj~q2cwGI{p>Cq#fagR{|_l$9N z(c{zfdj=#t_@Ev&If`VcQFU}}bw$kNs3`qks>!iBeZa7v+@r@ar%@7DS%)uUJVRJU z{oXbiq$a(2Zk8Nx{T^t{a_IINwbh`MfrDD|pcFew%B%F@`Y1iFc1CSn2~#1pab?vN zRdK4<$kry~`N)6roND?uE>tkXzqeoa+oLQRp> zJi5`BWT>K7R~UOg>Z^^-9p1?(quny(z-GQt|Mf0U4tU($E)Uwdxy1&|gd2j?R@JLz z3lw9o~R`H*Q#pHl$ zK05@|77k_Kc>K@8@w)2}4Cfa-f1duQvKe*9xa@e(yy|$*>)W8|*W;kQJI{ABP=0wr z#WCzQ?u>}Njy>*_EMB*KH{&3ruieAnE%%hI`RXfA!$RZ0B(2#}sM^PvH%!uvoqIkf zS}rWUcL!^p9iK@JmKZFh&0{u znZ$K5pQ(Im_{`)(!DWHfx1&Psoia@i<&06|`h4H+2h~fl>-yv6RF}-R7>f(V4!zh> z_qc;Cn>J&{Kk>eP)ntCr>)wGoPq?6FePYtW!x! zDKy&zPrkI(+UU#EWVCI)yJatnPk4{{`r>RSviDv)Q)y>YZ6SEwd4e(?nDzwNxz_}R@lINHFDaT~VXF>;kQm4vorw3YE&?D38gSJpRtO&w;t&@N9^+Q%7g zza`nXH8EovparqTrHBU8 z=a%$(;__v%3U>@{ar)m%kRg)_;9G?9t~#n7FS{*kt7>9nV~N*0Mri+>esQ&Wy7A8< zD?Fb`7g=NQd`3aMv#p37Z&!6V`>vYRs=YR6o<$w6cIo$uF zf6A`Be`@a9`**Jl6%721{p)!D z_E&|LR_)vVov?oWUq|;JS=;`-ZT)Wl+J|u5+V*e1^}GG^`WLli^MCbUqx(sBll!Oc zIqsji=enPA&vQTRp6~v-dx85I_d@p~_hR=F_fq$>?q%-h+{@j+a5uZ3cdu~&t9zyU zm+n>W|K(ooUgKWtUguu#{*`-!`vvz#_pjZX+`n;ecE9Lualho=;(pn^)%}Wln|r%^ zhx=9cPWNl>UGClPJ?`JSUw6OZZgs!u-s^tLz0du&d%yb~_W}32?t||4+=txnyAQj6 z=RV^8zJ|22u}T*tT_sq$vCX5q^pKtsDtAhl^pbGtEfI2;M9SULNBUCl^^+*+ zF9T$t43c{!T4H3d+$%$<6JsS#Y%)yZxyOlMtTB(zIna+$ygUpbb@&lPHKa?r*BPslE`TrN0 zB|nkb@`N*ZInL0*uJ@@v^7zmd)IqO{0MvPE8&t@4U&lkKuYUX`8l zn(UI@vPXU^uge?KDsReOc}w=m+p=HYkpuFs9F+Iuki0L4<#%#KK9HmGp&XNs+*NGA^(t@;+6_msbuDi5m%8*a#C{0vmu`PU_i3@<@+Y*y=8FD?|+dZ zji-mtcq=8Xm#fqE?K__x^S7@a`m_JI5o6=;wtbcHc+;c@-l%=z({Xp!tNzen+A2?5 z=xYjT32)QBxk_q(fHl$t_UL&hmK8$o%;NuxvAt!Uc9m`K=AT5nDx5KdkJ#+OVZ_Xy z0OJf&ZLM$uk^Nw5?~fYkb5U8r!8E%%1If;~a@KRzw$vIXTP8n`X4klByPTluS(Dl+;vItJ7;pM7NPO1CL0KT8_AQr?VWD%ulis zz;^6a78j@m8 zq8a-x#walz4ea4kN@A*oqemq*RkgK4Jt467VA?G@;S!Ug5(v9SxhEwk-JY-CZ<^r{NZ*D(u3{A?Ik)0!TW!dR3O z)atVZ@3FqGEhwjZjox^IB~fyG3O80V%o)cSmBm%;7{_>3%9N5khYmf{mBs-ywewgq zv8uX?(h9a))NsajIx>0(spiyG$CPCoyDj65=-c*<;>mn)pUw_(Ra(85Xva|}*@)qr zgf;bODk_)7jj9sP4I9(@HAb-P_GCeiFpxTJLMAJXHT5N&8g#T%kXH;(Y+hq_G^n{? zj#heas3KvE!Q0B_Xpb8XR#GPrN0EzJ_OJO+$FY4kYn@ef{9=wO=^W)WjnS+Gyk*TO zx=K_QxmBRX3_)9l<{Re?m={-ySHpFc52kCi5zQ>5wc=R`Rg0-AKy^@o6QC~U1gmPM zNp4ZeG_~JXJyKIeR23?);;CvE7G6~TvA^F?wwlB*RuhS}WSELG#SZH#*o9`M(4+Drr|MdQ8r< zBJC@(#*~J42G`J&VTd`ZP^hGFijquIiT5VlC^T)=D~Z?H^ojncFDPp&)!rJ>Se7h9 zCaP1@nvBygR9PQi;4MR+V<2 zb4f8Zp+aGrRFyd;qDrt)5q5~Og0{d@)vNOdMBCx<3{Oq#oZ&M*8YQ*aPVLeoos~-c z#WVQE{l}?ORElegN@()%aodKk-Sjf1rj{+y&jiC%)k;sb*Cc!u2|I3UYGneI5>vY@ zN_pC2qe*rR_3RW*H|E03mfF)CVS(n+QyEJWs!Y|$bk%P9jL2L8Ryl6ifhREEW1}4T z>cI}TYwN4k!k&`dl*|Z3d1!mmvGdS&-xp9Rdr)WwI{Hd6+k7_CfBm7F!>{&~01Ae-uz?*l0(9V63`7s=53{O%mS>+sGV0YNW1HLPIFV+sTDxqZ98qD+P$eZ zG<%E=)tfb`?+kxQk+Cnjof~8CGutM8o(vy`{0@wRN~yTMw3K?j)@U!=RZi5!wZ@)r zihFgHTChb@ZyG%@p!WRRx>KrbbK@~>;|Oz6Ddx!Ony-akTV7vhD8grPZ1bj;a?yQD zqOWEizEww_&~00K)biNPr;mJridDAhvhtI*QxX-i>xDC*}!*8 zmy^w??Ve1al6B}g)Ne)ygvP~AMp1S=Et0BK*oWYB6sfmnpkvinnm9TqbE476vut7* zI*q>4zxkln!S3AhDq?Qepk=CFmFgF?_u{GAGULX1YSr|L+G+Za>#H~hNKl5upwyk*p^?B`Sigg{0MW?#FL8aJrFB%Qs9wd!A>#Boe0uC`qGPllH8 zUMEij>;E&qIVwKoHkr@jbJ#9M{%vjt;Erv< zvibsRz+`%AaQHKw7x+Re2>- z5Iz@pzLgEvgu`>gZ~O2J**?MD$}7fu9KTgI9d}j|)O?MftLJ-aa0p?BFY3I`C!Z1C z5ZuiAiZd%_T081vl1EGUS29k-?c|#x#|#-m2`_R{mvx<=X$z6Ej=M(O**aMm`LmBH z*s9V%Vv!!)Ano29Mh-&sdT@{_%S4Z4+|&6q;3i|Tg*m3%>sz^5iJQ~7IsYwgT5)sWhv=`P?B!nB z@ye=!v88;JCSAT{{oxvm2fWF{8UY8xSoi=;hB+_~7D78@JGyl`oCD`U#I>$~8{uZS z3%(8y!6Wb#JPR+wFEt53x`57b6ikK08$i4P9E%DlfW#j_`~jtKDx3*t!-a4uTnjhA z9dH*s2oFQz2_T*TtUKVUCV^O4U?7ZueIQd&f$=aEj)4Vm5}XQMa5ij$OW|_30d9h% zCy?|69)?HZS$G~^h1WH?Bajmf!LSdEg7GjBj)7Tl5}X2Eum(24xo|mL0XM-G_&VGR zkHX{dJiG|6!<*De7R@reK`g^(X_mw~u_QKVmivx~<-TK@B_dfY5$T#Gc#~LycfwY< zA6|hsHA}Z1V(AtJ%i&Bo4=&IwA^BnnDTY&FwPxw=#-jm z(kwlvh^40;Ho1EX{z4#fXUc}#zRP+mm zVK5RBZ$Hw}uMy6Lq^I90cpiSPS)wM1B?|eXs^N6F3m$+c;aSbnzq45Shrna-H2fT1 z)+__U#WFyLq<4TzvkWD?p%*m^2M;W|&8;g9gbKydG5FXYnafBDg^SGn%q-L>= z5{r%W*-9bd*tWoJkoat$p#NFue?D9ZS8JBEiDF4Bg}g{M4Lv+ISuBrDg*A|LPD~fe z#5_p4CKi%EE#wd31z#sW&{MZqm;2 zr?{;}|eP=jg`Oj!@6tou`!_)mh=5&qN>T4$aILc-SwU!yM2vS2Bk3R~b-cn}`e zq|;V<*E`@bcmiI8mo(|DbAoCBOn@U`IdsB>a4B_n7xN zF0F8%#(VKOi9|R-4R97*02jm0;bl$z+L45ij_$!C-Fs-#1OGkn-xKxr)HDf2KcVO+ zlsYSPg(hKnyw##WlU{`)z3iHVUlj?zu1Q3YNJI!Ey%D50@+__Gc}@D_zAx^hXx^iA zO?bnn3`Adp(8nP3F$i~qaCc9J$UWJb#5Re<&V^gxHcf2H$m(WI;*l#Jx$eXNefUox zT?wQsAqVD>{*|PEwI;*2i45Nf(Z_J~@jc@C9`QUBD)LY`%!d;-N#09uZNDZdn>f+b zqDd-ylu;(?<5Ejl5?u zdRV4O^g?=+OZjyW+K?F9kimm6`@xzF$!6zAt|mjtzoFz`T$o5)1o~-0KXcK?3iPo` zlM%={0y!VTo*u%UQv66~XUKI5*QqB+?WYd6Yha$;d%5xK6fLZL#)_U5IhGjU{~m|2YT#r9G=9!=3!q8 z&=dI>N917j3k|RQ(o?-yxg4uvtc!?gIC~H>^&NLA3}bTuKuKJU?BD$%r)hrKjotTCfI`A zKY-mQL&69 zt`Hf!iu>oee-XR0Vs}9hcSCVEbUK_#c}4D6A?5qH8fSa&4@@XvjG?wRMc|MkS#}eSd-G}oamX!^){||!c*`p_sPdn^071-ro)|Z zk0xcQoai3|o8Vkc%F$yvdaOX-73h1a&W`v2noJ88nbrfM|7qyona7MtfhLs+yzys* zCay4c5k%nrCeQse`SBo;9}kAHFkX|@=x;UpTZ>-Sq8Ik!$&aVNnQ*oyYx;<+iQ;-W z*DK&zcwUnl@~MV=s)>X;Y=E<1E8M3^E%sH5ebth#TGCZZ{?(FywR7M+i2GXH*J97L z*mLbActw-CW_ISTgy^RZ{nRJ%29QyjOhtkG>;F|ROl=RHW!_Ere z9@whMya&{;A3@}thn({WZyw=2ja@vAUCc+``N+HE0Kdt3NRy?D*`>OS>*HLXl~#zqti&)#Ujg;b+Pq z?w?ogk8uAOybQn8WJNSPb%(&ouuzj<#*6$iQInOpUy1vbgujyTSCX!kq-)hmkyWd) z*Qwa6i)-v`6?V3obgm|yt9QZIA^Km9{?`Ozx4|$0j)0_p4e4Kl|26nuGab%^=wl7~ zShEl=g)87HNIKS#jy3z?L3kFPr<{aSP9mWVCO|tZhqGWKoCg=cWw03{|61hV*n>Am zgu$6`He3%kYVzwo{Ki}qTmTnqvWfD!iSoG#|C{i?iTv3_{`@9UqG4 z_^nCI3Xam`&66T;o`Tol4NczCMBcJO^5re^W&KW(^?TqUcm$q?=iry{nkK)piu@`_ zlNTtjl{o^_&4UleCUMLr1ui}c!hkU z9B!f7$f^*?2xE5}O zJ0SVIn|$7lzIUT<#F9N4M9w|Pxo0vggj1nQlh<2BUf&8&!L!%}dU^vry-^75a29OT zWFGpu^Ihb87k}^K@7-!x2N%Mn5Iw$&9uK0&gXrAT z?}=jGbXf|Q!xfr*O#B}c|HqARjwXKy68S?290G0F&vESMB=(bx{iMUm5PkeQ2j;;o za2q@g&tYE~*jF}efU_X?H>vwKs2>FRKSBP}kn6)-AC8BKn*5IZ`5pQ5>wScC0QbbR ziFh_$f>&^l9^Xfgha+*X?faK3M@@E_NxD9*UhTgZK_wCr_cIW2f=4+jpz zqwpqn<%fL*!yecT*B^5IVILTU9Sp_}Vqq4{K@T(0!)$mSUL?J=1KS5f>}or9wH^OE z@V^85+kySFRxA^9mQ}JTnj0;uTpMzmXi)A>9|5Vt|E67at}gY!hM5q51c~I zvyl8eKz@FRoF5|R$4SUD3OSmQVq4H^6$XDcVOSI`Vntu z7!MQSL3kKBh;JwH?OX<%(I;~3MvmQu&<@F$-Q>&eR=5u$?`|b;4)W$9FY&%XyzeHX z$8<=(zDvFyJVtpv0m-L>Q^DRy)MJ9?ArH@SXu5}X2O!A7_ME`}T7X4<18v`5Dv`g;rg?c;hM z*KcD_Z(~nykAM%rd^i!#f%7zZXNt%>#ppc*y@x{5d4O~t;Qj&bzju`S=eQ<^(B~oa zc_kD|Au=w^mqul z4m3|GR{a5LPZ$+1vYk;CC6I7O3>!bCobfRkaNCdb1?jz_{N zu$XcaLAmJz3!xoDzY)Z|m_ zRq&iy zw=e5Befn@eitE)}uZNo<>s>Kd#S(K}v)sE!Ecdc5G%8grqcSv03gM>^e##bzyOeA2 zhGt3SI#pdS<$5{pm*bxGtWihcG0pNY@;{uQSu%3Ol7XBVXW@CxlF3p}ChKaMtgB`6 zJTn~zXBhwpjA#Le{ff?MGZ zcokl!Uo?b%kqu6VGwJse&KAOXC6RGX5-f#NX@7!ge|j+9A-vxb-fyQu7vr65#yhzX zyKf~OdjlEw1Vh~I#ob#8v@;_h_10U|TL*;tO{0D|O#N_F6N-|2LcRHEG3BEalFm;_ z=cy6wJb3`_fvuFI4V0rzr27)-zCyZ5$InQ|Qzu9-fjq_ir?|g`__q*0(MuBXJTyq; zp~1{=#xlPdugTm|B6CyWdbkmuf@hhhXl9;bCA)tywOFHE`y-~A_o-LNqO`7GA zL1KA?{Ky_d{gS0w#(yrB@z*rV1mc@Od@-@qH|RAVdGi-&mLK8nM_Ck(Nf`1JNcj-T z2glKvD1gTydcPlC-hWUm_miIcso#c^zr%Hiy$r`*hUdUMSO6#C4||ksNI91pcoJg& zVe46!qdbJQz^$x5gtPt-smUlf3g)b!K3YY6WTid|f}t=R4u-LsOz6W2ttiO#1g@VB zV_q-<4uH{=lX%KWB20$qnpg@=)ImDj_7s92G z`g|ev`6AM>h;%GMUyIOJ`6lMqTOe|mBX{{H@HD&#FA-lb@%3PyJ%V}kK9G8PTB9b; zDVRVp^X=qECHdisV!nM4{$}EDHvX>T?|4!m}62B9DJJGkZ22O|b;X+70I>|>T^}MqclFv@^*@-@!=%dn# zeArth`B+IlRytudL@$--rE)#o2zSBP;W2mulKx84?;_t^@Q;a0c<9)?FD=~_p+ z)^}#!G7t`c(U5#xPd=_Mgm%~n=g=ND(H_o)$g>4`wxH)N==o*r?q%%mW%Thf`gj@n zUq=32eQ4*SXuoIDe$R%;u@^b^g)&YIhtY5drhdy=*{xvuXrqWN? zL_eVg?t=&DClG%t@wbxhR+a8C_{%~r>~RbBxCOm$LGLfykS76>{+CJrD}?h3;kzN9sdL1EZ7L~w+?^n@?Zhn05`FpiuR>D?PB+Nkao4l2C?+ueoxxFp4Hr6 z!TnX-zs7yqrJjqqkGpQP)7@wH9Zg8&dK=f&|HIc(KX0I&qW+Gh{*Jv2X-DGX?6%t+|;U%U*+MD3HVhNtFSqkQ}or?CX zU>R(NQ=tpeUKOA}Kk~_seDb5d@uR-+j}-CO>35NzBgxN^*)W&=0wdTj@BplX4RASJ z0m+{sC{wD0T z3-;ROJiN#r(_r?PQa-FaxANSY07pRV$BO+}C&I~aDs(~Y!Ag3p*sm4)wXTNiA@*d& zo~)$PN;<9Bp%pu{UVxv&>yYvpKzsqj7eIUg#21hVlVBFif!J#R_8L$Fr^C5$K3oA; z!4|j`?uGjy@dOZ0z(sfo-eixdAA3!Ez%V!n4u+JYK*~{I4$OnauoO;*Ga-5lTnJae zwUG1#lAgf*@E|-1Pr*y@3VTfb*kjrmhQSCp7{)^K^A7U!jyzZZOW{;F6V8SU;ZnF3 zZh$-BE_e_ghNs|Jcm-Z1pMuG!9_%{{XWv;QjD_)V49tRa;5>+ag3wRUIe3BnM(DjO zdJo3Vg0ZvUMmPsdbzvK!`nb#~!+$hUeI)6v95GP?!Wq!KH9HJPeP*Yw(69Jqf2L;e?W|P|_8e3dg{O za4Dp{2&KKa6Z^drIl{6;!g3(#4I{n1xX->!=@kp(A$HmeJMD!YdZCB#4E8r=!)34; zVwd3u;3as4eNG$L=d=l;hu-LcER+Zy7Fzlfc15Bry9vwx`xqPIx&7K!^v+~1wd zzNK`y2e!hC@RBBd&_^Hi(dRP!l6_4&`U2!fArEHdHN#{{eS6Ceh!!`GGIRYqp-h$*x$e$m9}VeT)_URVD?Y-fVnUq5??g&MdLpj|Iz3# z8vVsYvY$$a*m(?g9z(igNH^nqVSFz!$Qy&agZr?rDhiSxgUOGId7}gwpdsUOW^{z znEh6h*l#rj?t=%|Uq!s}#2cRkM?vC^C*JrCa1%tnc;vfpfXIE(FbC#AC#;6^;X;Uf z_aR>bc94J_B#ePskn)s3c}h49&uP3LMC5+-aX<3ik9_yLU=3UjSHKhS6L=lo)Fe?C zNgM!?I}y1Pm%(QCX(9J;`-%;py)LD3*`GX+l4?o=}0CWDWlkDl?of+EVveKfcQ_rf9fFiUk!$(a4IC6RKiI;0*^6oK|0b% zN7@`X54OOq@DjYjKCNW-X{AFatcLhc$A9`xxCc_+(kXAFt?c6pg7GjB*1+j-A3VT* ztzhBV81ms^!g-i*GBOx4X2U(OmHl0$CzJGK*1-nY1m{BXJCpp*q`YKOUNXs# zO!6ZugngW$Fb@_$EcBCwejcH|c_arC-Xnzf$SSxN65k`l_sBVTf&HrFYc~0s z-3(Vk(w|NG$D)_9=w&Q=9gAMa?uQ3yj|R{lMbo~Z_pa!@8~NOgeCGUvaQ;C;(Mu?L z30p=z-AsMFiTb#O`V@PPz@Gcyt`F||VXytL*Z$Y2*KSb%5dS^IAC28cW4AHI)E}kP z6S342@s$63%Kt>l_m`CKYn01Al+P&2(|pR)LdpYjCLm|xVeI)RL{Ew6X*l*i9D5(} z0Ct*;of7{@;vcya?qNRb81q>tu)8bR-Bs)-5c>&+T&HlIdK!Bi@{;=~<>^!Un{Y^)I^U&V{^tS>1Z9;#z>w`NTdHNww|KsTIB>JmHe|6}u4*fNt zKkPRK`yCvF{zA~-VDuM@{tlwQ!_+!Vr1eI0%6MPJxK8g?+c5PjLv7xH8wPxf5& zHJ|wn@^4%eJPMC%lE?Erp6BI4^pS_ZJp7H@%=0bqG(5+C#60#R7Qk7s5w3u%&~p-c z9)4rSrmcr%qo1FBUs>$b6 z@_7tg4>!^eT1`J_J^4;LLrG_toqR7R-)EBVv+1uOM>ulyo=QK(g&j~%A}A-3+>hk` z-Hr4+=3p1Z--r17w7{+OH%MP!(x+dhzwssItpIzOME|0R{>5DE<^Xnci2g)6{fP|v z4=d?Etj3P8hkHul1&Dn_mts#-A?~Ab9}|yVCBkK}8DfWn{jf9gYcTnBFM7HcJq?M( z-gN8@{R~AvL-)W|><+nNkt^;z<@X}(Ch`nJp7?z1a3aKh;`h@2Aq9!BzfB+o~opHb-Np}pAUe(aKZDw%pJ`4~KbeG-2P@v|->tcyq* z`Ikoir5%Pxsm~)Q-+i!G>}xdkHF_0Xi`|mmEYh1rdb3Dxb_4c13!;x~^ie>%3rKf? z3)ZmT^g8=ZZ?eBsV}Gd?B1a)|6p~+s&f@}ZE&Y1 z(<4Nt_kow-6-^$`=8fpN|GQ%Q2Wj+-;{fgpQeF-@<9lpCZ-$>89D zgM)*E91a$w{y9k<95Q%CE}=+~BE=ygiOSW!9_5CFyuJy=!NEa_6bFY4862cY$>7jW zh7aH5ec$JKf6pJ6H?K01e|nEnog3=h*pWH;ul&z*kH0vVHmcPhfy&vQLhwgu9{SK|)VM!j#b9rI>gT_B3 zC*-6wpGW5N=vbb}wtVz^k##<{&VM|39@922edeX#d|0Pb>vTFPQ_{XTwJ%Or<%Z13 zUAZq0%+H4T*_3;7-~4=TeqPFyoRaf$LAtK$x~le7?W@{XwXgkT-rmbY`N4b{S8QCd zeH7bA@egucx-NEIY@K536q~Que4SaZGwXHMlr3o;&a6XXe2MWT`b+ees3%cRqMk%O z$&y@__HAO{CiYWeKh>Z5UF(_DzOH@!Tlt+-PhCBA_0-i*YX=VC8s@SGp`NvnonH!m-YM1`aO}qN&EKbiFJA^pUW3= zOJ=N-`HjqPq^?L^k-8#vMaB~uPn40{(mY3=cfIyI#Otvzcr(K+bIjx4q2DaB6b4I8 zTHJBZ18p9|;QLLs$gs^0Id(Z7~{NR zf=NE}WQz>j?2u!ZJ@z>u&oL)_rMcLphAh7@MnYpjsBxu`zKA*|n zJC8GG&YU@O=FFM7b8ehcE(k(5gzRlOV3TArhuRx z-l*3l99@ODlOe$y3X9%2LM*(@8I$YYlRtE+9ykvje56+>}O%l+;UQV|%A0-jg zwOYMlRx%b=_ZI*>Kz(xtDS;35N?p&N*pN&s(&M4Gur7?0)Q5m1$(Z87~#~;oQ4rf z{LH4?iWTQl8v@lA50$tCb^S)kX-&Tp=~r6P>o!siw=WeasCRATaH!;jmqpZ1JsgnR zWI>%Q_~l56pf(SWgiDnvf6YXQ$kK)g(iV&$u5v4Wz(G*I+i-F&^-h6PP(MkNoO*t# zK~V1>5e-LC=B2a{`~Bx7Avs?uN{Hg;xz>E&UgA~)fQO*Ivq4~-QgmcVLg&Mp?!wVw zLVIX*qo9@*iuO#<@cd;01vR`u^a|?Cmj(QvaE0h{D_0@~LH%NbQxQZ#9m8VXh(%D< z4Mphf>1e?e#7tQ>I(P~^e+ae4!bMI+wz;G-(L)>x{w@<;4zI6FP}8m;`2DU(O)t{Y z#VdM>{T*GUo-CAr*CVL!k!5{A@8AaF#aK8d7b|@Pn{q>mnDIuQTiJ*l2bNAnFvK*X@gsN9S~k$ zHX0?XHe6<;xmnu#NPB--G16|^;55=Ev9!}jJH2c&(xz<4G13I25f)v!f=~f(% z3l!8b8}wSU8$f-;BB+;dXvcW)4iMD96;7p0m|d2yKys`73i+E2kosuPNI^e|mXx$Y zs_BkG(bYcJtt5ova`YD2CZ#Z@S(B4lyR_Fhumeg!(vaqFkv`4|w%^ee8J+ zp4aRp%9JX8Jp1>G-pwe{J~tkAD?7o{JC}}7e2GoBjrrGyiK5mI67N-w{`kYh=p!E_ zY*z|fcg512=`DgoTrX@z01r-rv~iS)h3jr}qMTT``nH?~a7&q3DHfKF-(81+ zy3L4#i#kh<%QkVaBNbL|r?7G$#g;y9Lx{`qkj>Q#kjvKVJbJHJ%y=!Yrovm60a`5^ z<@OH1@4AU@FZJQm69e9S#VrWxiiu9|BE-~9EbyMJ5Y)#fM!ea0Up&#Nj6?qyE7wl2 zDO*Pf>W@Z=fM!FUnWLP_t&BH%qZiBYmT{d6L*L3X}Xtn3D@c0axld3J2Yoc#{w-gkfJXAUXp=Dqy-%9iMg0$ zbeStSuPHDDc|I6HGDOJgCW+oic&IZf`=CWcA!8GQn9>8N5Ty0T1N_IoV~Z8*n87x(Q{Sy0h~VmkQvjCnD#zVOU#sPjQnh= z(ackjBPazq9!t#ZTtS(g>$k+%`=YMCQA^D1e#p~L+GWD2aR^F{!~bhDMj8mMV_?)0 zafJsIDvyx zYR$FAU5K~~rPltIxZ8(;`-Vxa11xceh6~D};Zp1Qmbmf}f>J(0Y8_;Wiy|(HxI9bT zSCew7g*vVBLyWgQfeJ+iCc52pscx6YIR!TW?u$MUM98XTjI951ZAsBYQ4}B zx3o}DmKI8_LoIO|5w{U>Lo9JauMm`>S4gcFS>mp|3N*b+YQ5MJcj#)g_iCwim?bWL z4Roe!q}Jhm=9g9gP?tIHA>L0klJqbzYX6M)|YskP7&w{s$9i-}U}6_&V- zlR&FUQtOqLxTTXp)5%inRhBsSP0(&`l3K5}#1%}z7?~oquCv4)Mch%u`7Lofrh-qW zO0Cye;&x60F4LseF_yUc8G=$jLu$R&61V?mLD_$^)H)t=LX#RtyJ>RDl$Y(0f$fj) zfy9!Y*JB0sf^}ssMU!Or6+lM41sU}gB%6Yzh+0wLgr=AZ(=0K)04sziFjk)s)RSv< zsL+a^fL8p(V$}8CmQOAAP{`Rsip z6TS=ZT~E9R_^)iCHBH9Zq9cG{_dsXh(jA(wUBtR;>A_3{_9k)2q-(Exk;!cPaKsg~ zlO8_>5T`s*;<^nmeOpW@qJ0!#>QF@c2&2Sol$iZQ31*!%1cJJ8ZJtwySB=zaz$*c~ z*&2>^Bee#pHAp>$)X7^$C_{k*Ycbw`K8$EUSeZ2V3F1;|uo*BmKd~1j3M@3x`>F@} zpQtH#qtJo$IWvSZp(hTbOmDPNpZj81UzjaSmmDZ#&Tn@O6J3~JJaNonqTTK&b2V%H zGQ&ve?M&_E@kUxypUIA9GMoay$#21FKXBUr#HYY%-{vw`1z;1+3Ww30ncVBgkn`9R zZ(}X<(KE!C{;(fwve{Bdj$yte9Zaz2IO1}Vy^ljos>ANX>ehD{CHFq#c3OM){G{IP zCsFAftV?u?CHJzRZhM9xUx2w7|3E)Ujok8fgZ%K-bdw#q5pS(YD)tX=vN8HkrI~KIlli(s|pqY@&5F^+*7i zjyAZ3db$Vf6@qGa`NNlkEA%nIC5I_TdLkFC$O|v`hx07lBiQ?b&jJ=+PUV)T*HE7a zSk0LhP6Ndp4#bza^nTxYQ53m2FX;TS?V_%EVWW{2FnED<)AqShv^8SEX(?#7)Hen+ z>kFDSYy41m(Yg2`@f_*05zvcM=UKAXH=L^q?eSl#fk^|wOJiwmi2*~+Z zp$^8c1lt&7Kq1w24Y>QlDHaK1Bubr$7% zTUL=PtxoVxRQfu5D(O9%X7==+WVw1f8==QH`Ji$8V551OXeessOzsldXo)aN^49!n zsFjjML6U#lhjyeSaJ;E5!S<2S`4tv z*rGiLYp9R~=hX3}uKwB?kWHCeFOsAWg|~t3y2Os7opI3re^-Bmyn?D!2=<xaHo?b5h!G=69Yp$0>oFchAJ-=gay;hXUr zLVTIioQoD;crHHp7B*6{Lh2GywEuhk)^qg$ryu?1fnChgLMu=0sUZ@!J8RK<-M~`_ z>fcvUe^PA@{BjvjBmR8g7t*ASE`f3`>{>o{Gtxqud?fp27VMW~t6-h&;QDr15a? zqB2qJ2^}IImX=%boPpW3xg?IB9$OG8350t%56JYktborc{h_aPEY%aSf|`vIA>%ilm#6)}r^MV0W;Ys2`iB8o|@Izmt1;oHs}!WiK2IRgPV5O9ze@~RZmzm4Tp&KkNmsR)aErXvxs*QIf`#@0=yitf!J5*qlzI z-qW>v<#)gdaoN>qb7i`6!3#n??20ZLgSL!x(8|xWux^r1NhGK)!M@(2^K>RN{Fc_G zj*ib)KJ1Lhi@ajy6~xc>3mqPei+velM!KVYt|vSlQe$MDKtT6nh418lU9}aWSRfJH@hE|yt^-`?4jJ7f z52Qf`OS>Iu2x{%hUe4)q1a#a#)&tqL6zhPcuy7ks4WV!jpsoVco+wY;IKTth=5#AH zfKgM|jF>xD5}huRcuNPfmJV=`93lvcQ|z( zHb?)>Mx3e7>mz-Fk>+R8m)lOcenPrQ+|uu{I_zB5)q#%t8n|9kg6BeD(KT29PlHtg z3+gqOb1v+LaqfeDMX3>{wYa=CQFJVji}2eMvM(NXK+?s-{m=_>P%zGV;e{2Z?1=-P zc->y~&CV4B2lFhn;5h5QGt)@Ih~NabB0eb~G|RLeU9!R|QB!sM-w(FRNsN88Z}(uG zq9*lpsqix+jmt@i$pk)k#VnK?`J_!5`Q-C}HVl-b{=<4r8`Iq!r2WzAgXk#Ohe*E# zo-bXtQcQ=&MEL0YDcKG6S{%*LeAmW|3xS?|M28rh5#KYSt@x#m=x!@|VLZe`QOFR# z9F%tfqt-H?Wj4a9lU8I*Lymzbn>C&sG?-TRe05~g;&MTyc*=TG=fCboTFk29rdi+xAT}Var z0$)>0ESpfkPdH1+Bxa^HD8Y zLi3+URvWZVP(QpNWSN|uMKwl+&g}unK(n9t2qE~o-qhJ_R&5!Zsl2~p zc}Lz~db5@HsSgP!>ceVau4uFLi-Y38HJSIH9i;b{DLr)FUumRO%MZ%EE&Sh`@jtCR zgWv^{vQGeZ9BuC0a&met>ERyG(aS7soXaDiEa&p2BTX)kK;8;=;_?X70y^Vzo`*O% z1`fXW=7@!!)OvzIt>g;L!3yJGc~GPi4z?Suj#%{l0;We1mHB?L)F5GB z)3u&z=DWr`X4rbZTBiBIw2KzQYB0bUtvqMW`WSNP<5wRQw98G9)7Qtrxq|xH)geZY zZqz1VYtAm^kT~T}(t2YmsOtl*;Prx8OG?UBja=0%*BF*d@H)ZYt`yvcVP~02$7E+x z=`|?5=E=8FM;Fm2Yty(F%$EY zFWk@sPaVv(2x?26zeyjT{ymiYhVPk;eCHUEzpHaPrxjMrU$tk15(2i1_uN*ss%b$} zM~?u1Q?O|lu=?3df4Hp)8V#E-iK|R$&_g18hsXD_@n(J8h^|4 z{Lp$iY>K1tw-|9I{{bFbq2D`DbU|OhDg`~M=J<7L!$$7cX)35a{BhRX_^%3nuHln! z1noJIZfQ!pBaksio=k)7`R`AgJ4)jR@>$2;>0U%LayDz$$$aG0$B2&OdB8Ew^gd&^ z6Lr%*NLO`l2E+XJg^Lh z(BCoi9?dtV6rtTHecwTZEcCP8D9UZpG*z>>)i)TnH3fa~{NzZuS&nP_P$Vfyvy`v~ zp#CgYx-GXM9G1U?4z91^FYtxXm)5-rZl9*s5Y0$p-HFzKE3gBb+85J7k0|;g3ZG4L zXW&L7Hl)qP!qM)GMpoV!3v9+NrBI^@YO}{4((GMdVfQk*L;6FYs(|3>yhPqQP-URqAicGwzOT| zu`O!=e+{Em;rFzqzRR{O`GIZOfx31qe+6whz3M;jm)@)`|JzAhB7h%Rz6Mo#roGcuXPWJjGC^KaRpsaxGeY^lM3z3`E06fUwcPmo2 zt{{jd4B{N5bBref<61@V=@`e66G8oAnG0~Hv3wod^U*SD&kZcKmbVryDOw48*-Al; zvQ!sRskPQNzOjtjcwtf-PcGBjcpgf0Y~wGMQ5(spR&Qfq8MQGA`O_C|TaH?nucWpe zTxLqUtt(*(UU>qsA1~|3Em2y_Xi}=zc`?B1OiG>YuiILzQtC@1HfkB$oQIO7^7Tnl z`5L^H!@I8huOd87O-xfI(=%wrZnSClN?mFS>bzyeD2ElmU%BLI?60Tkv)hjTI`kP0 ze+j?j#5&<}nk@zU7|ik>)a&`H)F4(G&#*Uov8&>3ks9F5ji)JWe}!X6K90#X)&M@w zm5cn_VYA%MymbS33cy=8+qKu-6d>Qzx&7}%?S-c|2x`MpQ~J;@mtLcz zLz{YcpkntVD(WjjxbAD`D-xw?cb(; zdOKz`oPsS_P=7bFDUeWiCur@7xtq^2*r_5}=C{oIed}#X-}=>%Wv-Q`hV;{Z=UTz% ztt5Su&&;HktUPD#ZY;MSyw(%rk@uybW-XU9aye6HGyk4Gn}FA))x&x9qJ*d;8f% zlr~Cxn|m?6jnLi}vow-WI!_jWeg*Z1K?OhTx_(%IIn0k(x!%x{{Ncl}tLyp4Bma2p zaQtEkwO_JOWcd=47SPJE2jqt)C&1G{FD#oT9 z7g5~RcuK#Ro<`xRg{6+f)8{O17@msQ(-1sOXHSFhRL-6pc)FiG<>F}td!n8Rb=ouU zFDA@IP(2FF5Y)#Ocbp?a;eW|wr5~pptxrctbHzj1u5=fj0eNw;xySKYF1MAMT5h|x zD*7;2*8-`3YGHq-vGfkhPyM6sWAeEpf*u+R$|0ziFV;DtSn;f~A&|c7dCDBWzXz1A zd+XY#Xihb`O|+-35Mt=*99T-IR-JQG$J(UD-Ep1)`p%_MwoW(sv{;!BtmdyGExG$s z9cgE^#Qg}Ek|nMq=T1WkQAVGMZ)7=jeVKUo1sm? zNAq&CPcF|TUAU{Y_0Hv-I@Y!C0A_(SX%PV2z^a9qTb^AGK0&`kSLret{l928cFlbD zd5)0mER$R#lpQCz-AYi~a_F=f#oNT*#>g&KjsW73RV9EppVjYH?5p8}yjoCe7LoRO z4Nd?!wX-8TPSV+t+y>b9EN4e}?0JZ#Gb8#r6CRs`SiSUaR+>(?oxj?Ka3Vx|uY4cA zWD!bNM%k`@z4)g*?1cgg1oi70>l%_)Q>NU`v96EcO=y#Mn6qZ)NpuQuuUUCpoM0G&=?-oquz($#4Q<|?!2q6o=Q3oZioNnqIn z90c`+8r|xPF$W&F2((Y;HGM2PkkXq;NuE>639z1PlWF%WBZtrRe7{k^918y{W8KF6 z35lnhHJve$eXh~B^hu(K$=65Enfq>*o7(v@Wa)6&LAyI}whX__M^e3FUK_)Da#10VDdZnlTvB{&0g#`Byk3DAE6wU|jlR2VE zlg@pRLei%~>(ibrr`GGt?m%`S(`UVVwkaJPPump7(?c+pSJatY(b{2d{s28{@)5T+ zStagRz#02A`B=^Y937LW#Cc~9+Wr?j*J>EP)&c&j(4b8C+;^LB4r(QSDRDmSYZNk&4Yl(-h0hj5vBmo{U<{7DD@4%1b9m19CEXil5a2^ctBJ_Nt z{Dy4wU(714(cb!}b>DZK-FwXBXj&J?z=>q7q&75bZMYU~ARA4``2(wM><<(JTN?uU z74#a)a+@^K{hZt9#sO2Obaxw9jbx67)|rY=wRP8q64gQ2HqOlHiHG4SO^$ zH_jEs+$21%MBXcr_ez!*PwXxGQIr4f=tDf!S>Jh(;;@XqNqDDy<{eqqv&DZl-r_jH zY+Y~bc0p^KNTarL&INtqumX<&j)PYw05MzwUqqtP<@YNUi!$G9v zgU3pM@`90KPf1y8q%3kKL#suKF^cIX0>}@2wChsf zRi9P%(77Sf%uIQCS8rOMPSZ~T30~-PHw#UTq|cEq=Tx@hOzm$Hrc|8*ewwm|EQtSn zVubS5S)61E(rKPk0`{(e5lN@ccbwnA7>IHN?kUO3E_P$$4Vo|b6O4^Moi1`sF9;31;!yQ$K9|? zaPL(*X^(KU9|HTaRZ z=AjIICF4Ne=p(;Htw)iLpi01`37E);YeyV{+9L&%CSW4}$CyaZ;Oy8lgvomkr(*IN zYP}Na2J)hPF+&d{29>Z{VqlEhz+6`%Zm~^olBtboTA)N~n z)bUu0avj3t)%nk0{qxK#n7N;Nobq2NQ9l)+*Y@CicsNnyvK1DA3Zv1=Z1_4}f8@1< z-v7A`MX0kaRM_}vWkKu9e4HzxZZH5`sp~~;gi31R(KZtbY{U%$GN-&zEALz3{QtdEQX&> zak$1iqZ1DwUh=W(-rcLgwKkrg->xE6F2(d-(XmweavU zd#xS4*8U9bA-uB8TrE26=hEh%W%g+WS`D{)<}}cX;jA{Zb}o;Wurj;k_2Er&Pk2iE z(VzX8cc!!!oVyn1>la#QU1_b2#jaaOa*X)t`~2l1mR6-|4)YiGg62THTzmmZ%_8Vj zI$Z0H9k)Soo@r;=(^F^_<8=6a1vP)UCB1YjhPm&H+>DbRFw!FOujK2QF3Q(XWYcKJ ztV;Z1(tjx0Idtt_(Ern=rj{`KoV5JgQo`Nj^p3U+YT@_UG7c~3&ekeI0cn0ZMNExQ z)LY&`$NnypuM?Uz4e(368#5m}*Wa<7W6{pBYttYd9<{Xd2ujAgoWm;qzqIo~t(|AP zXy-=s&?06T`KdB$U^O3) z>xXk#9p#c$lOGL?XbsqLr+uW+T2rsr*9OU!!i{L_# z?2d7Vbrq9|$zCgb)LD5gU2CUBZ_;MFZ+hyZj`oA~(ejxQYj7abnfi-lyH2ITF;L;y zTC!K)%c#Jm&$~V2Si$2o+d7?f}K&0_!(nQw)<{PblFyA}}S7F4?MQp8xWhKM1LVLS|NU|GP@ zlUEMSH|rKrw_ZZ$?X%tWp64T*@7IwoWbd%2YMuvO2J3UaMx)QVpG&$`Jw`i}emTl~ z`mB0I$Mc|}bIhfW%nxB~_Hsm-ZV}8Uzf!WJ#&Fi8SqARx^k&GSL-W&{A?#%n2F)E# zZ@!CC*6}tDl&a8V!NX`1)kima)M|0}8kFj|M);AD7BX~^>h9xhbgH%n)*yda^zOi^ z6mAzHk3pP^T1>p*Lm-~5wzS>9&ZhX+Ed)RR8Foh7yc)LFy{0?qdtF(FcEb|uhwc~; z^AiL&UMkoJT6X3FfEieKAGGxsABB|zV=}r<=LPKJ-%q6p8|qhHUt2fw%eCqwh-WLJ zBi(c_ZAyO))`R0Ce~r~x1S`>qEM}%Ve0biAo~j87>OTReYrJPOyjeN1kEEbHNq+d| zyg+fb89rL8RnqBGpWG~qc=w~Ab2TxCv>Kx`Yn{0 zuTi3(q1EV=xXYk~TX`QeMNrf4cj44_9Ju1_**z}TXjdFH4Y?=Vbs{9Wda%9qp0_(( z`7Ycn=k}GwLuuZ07uk8{-vv9&-E>1_U%x;>{ouY*3R>xP|Maus0$wKRO9k{ z{fxt}^s}24uwp9u&FGg)m5so1Be29hFH&f3b@&%JWuM_q1Ey^?v<~oL*93T?T?p!^ z`!-=z!Vf~`H_AD^w0oQ3%|ZU=8p&JJ8i&she8L{{hl^eo)LS2`X>Ci;ScuAXh_9{j zF`qjfUdDZ-hdqGR?{K8n*9i6sa7Z~kzRKbICD_kH-KXDyKjAxke&~fA!Zz$XYrJOM zc6k!}cVFg3<$`Gr7tZ#=s($(%o-3!}fZXmaE*HJ^?z)+JTHTwuK7x@0PcywX@;}p_ z5nJ_6CIa@jjT|`**S=h=Jc6Ej#2>YI8~^LxB9o3A=w`oqPzynQ@7}0PXRi$Lu5G{3vv)y*Oc2`WWflKKmA6dSo793f^Y8?E`KI z>fn0?^b3fkF#b~Wg_t6Kq73aVT+ z2mLt|ZwTtHsvqHPB;F9zUsjdlZ7kjp)a_MM@ircB2#B)cUGXc&o%4f?8WO0&mrLLr@o2k+0WMydkI$SDlZy<#A2>q-Kcqhz>vY^G z-!pFb2+777o}T+e!QejZgpm)2@y@t0iW4DU5qpvd?v##u~5gO|cHN@rZ@yGx+yeUx^!DIvwJsy2qu>6gRa8 zlI_TY6dHziN@5WuiZbe842({$|$C5Uc(h`so3BgtlcpJ=gj)$4I?oHov zGnF9wrcsIZUQqdf&3Bik+dQ^_p^ zJ-O5yYwOtLxsZtL=_DpG@Cd^4F67Gw=EV@ac9W!q5s&YM367TmxKnZ>IZf zUbW5-DX*`Z%`V^Wtu~rm_s7C`?pk??axHWZYT=&+-GygFo(AXCV39y z?r}kVwUW;XcE{)-W~3QKjdUlA%@YmdPV210xlzb^^3{ij1-pB;9Fo2q-WDepbliIl zE+GF!eZ@fjYKkrgPSNm60>G-h!kQYrT0%DHRrsdK)RHc4i07Hl!uR zpW5jUNRR+LJ)wSiR&Tq3t-&wU-gUJ-0 zXh4g=V|+Ny`p_BR6$@!h#biI)n;lH<)ys?$lvi>!%KG@tH&Q}acfE&QQ(8ysa)-7RkP2hk%snq{l zQi_%OElDX>>W7n3YAsyztE7~mB_)`Y(riiDXr#~xGUZ{tB|dwb8NbwsPafZ9j{A)q zG-}NFyNvkM@jW9c#X7zx7%8WA3UU-2CCSpRQ#+lq2mf8NAOE8PH>{%`@R*nGYSMVD z3Ot6OZkt1WL-z{$ki!qFO0|{)Us+HP)CS~`g0$-wLXHSLoxvH5Pj?~*g6cyK546gT zoV*`75Y&g}V80-%pT@}tf`KGiarisE|B2r(ag2rDM!f7?KpYifBjrF4zZUt@VwB-B z$!73!*hmq;%a1I;j>n$Y@GX$+6bbcnBOmqDCDJx+1btjh91Oi5)J&C&&lqL+2+B5U z^%*G=Y8}mLUE=gwT0MQ6JE;Zpj1qp<>e0wet$w+h#*RmhVgyg$=1D3u)hI)GC0D*t zzuQQ0qW+WB)aq-|>V|FANf1UF`9?VXtiA`TX_Wey#Aw*&OUm8P$W3`A*C?Yt(MWNj zzGhZmx-;Gs+Y@Wj7h#tfssKYDtytLZB9kB@NoklF3$K$ZF>2|BKS`WTff?SVmq|*Kj zBRwZOMP%lIK19(PIk9tYdg|yf7I&Nc0g%=N>lBH*@ zd2Ftx-@xxOrC!R{^b2W|d4`Vbr(+tMf;FwD6YT+7Z8ZgoXBGtu%8F;!1Z^|p;YCMI z!&@w&9yI(31$Oq1^s>%NQ0`yqxtU$)BsAa7u)+6!HW=7I4?IWv8ua${5I9W|>L&?v zhq4-0wdxk?r|qB}g1XuZet@rf6xNXZ0?hXbdUE3Fw`dRD@>z-!yi^=FHXX~eVuFd( zJcj_xlHS?f1=J>tpZn>)yTP#Q=@!vqrDdZHfp$AGymhd8{;|rMdK#&xH|{~%n}A^? zT!3{H+1#Vy{e>S}Wwx1OsWs2>v#F(8&+=0C zg+v<@+Iwfo_S5ZI?A1PtdsgqF@sm(LK1<`A&QYJpjT>VnUEnxOhMx6%4c?IjJkEx= z-DgeQ={^WAtk6~Llv9ND25}F1BkN8HBSLu{e#NivHwE*$t|M zus<*sZ5#XSE}8NTzpGI$fVDcI4n;o+SwD7=EUB+EOKdJpEz`#+lbN^!E7M27;g7UT z55PhP$O!7$JM~x(U}kFm={%nYE38Z>NmetDZ(Ia;Ribp|v(55e$nX#DjKad2?TE-e zR(}oBYM!Ot?C711INw4T|Mlzzn41YZGqu@Bef_L8{x^5x#xy|E%f5=L)vIB5-JbN-gqi^w@?SS45 zH&fCVtndt*F?za!z5qjUmpPjP`AR_0-!I0jpRb&?iJ3f|-6#($_Q|;l{OQ{PGnq?r zHnay4>N{uKQ{rbddh@m!CwPujfR4|MkU8t}eOiGSW< zQld5v0X3R6LH_EnGGSZAt~UCpyM$gw zd;WZy{=a|vhr{~5y1p-+%hV!#nJJ+LPLs^=*&hO4j;#5_Ps*AWocV3xl7r^E_5jTo zv!r&&LkZ`AqUew4v$}O2HymNa)?GET!s2Y38P8G}F#A9jW@ z3fb4XhCE1LXUKNdxzk*dYmqlD4{$x{PIpDdF<mQJW3yNskM;xpSV;r>@eKQudt$);WRubb_K+5=uV49&FpFuJm6XSTZwc@v*mJ#( zj7ufVpjvA{N8I_8$_-KjI02{r!T~cUeN&8cjJXG3rp{={1pcS)&kPH?1Yx=eozf*s zDD5|r>}m=)dw-fuGcIvh4cb=oTq=jrcqhx`V92$Ex-5bHF3c|pwI(qNnngCS*D>L| z%dzc_JT!ZD*L0}3?8u7c?atS^P=|UKpr)30;JkguSmNy79crWgPpEI7E$Rdgc|df8 zL%hs!`|a65os`0P39+;K(OR*)R`U6?pf$4=JF)_KlYdaF&IPxtcHMLKnocnMzINSo z_WVvtbxl>hRhK8V>O*7vpR2FV)heCN>1XL4n$%wIsuf+)B6j9KYt_Cp*1meUL#yU> zg4+*i)#fu3J1P0^w(7@chIRs_>%PkBVgyXLv~n|6DD-vHjx;AZGJ=iXEoZ2WbR&I2 z-Ef9@yBi?K@D&t_S$&4S5<^cvvlu~nsMr1nDqL5_zXm~R( zf_>>s>~Z^$FNXi!BquzWT+s5!>%kgNo=rn}JkJk*D9TSa-8!uK5s$C%IV8l}S$qbA z(}U&LZ`sxL4Smk%`omPFKfK-URQQwHuID4YPmev+PV+HoxoAnL=+fg~YqvWQkCQ%# zcV$e`<6kl0g;5f|7}(nvu!Bp!u(aPr`hI8iY`4_2*-}qkQaxLYdLA|ES;^|5uU~dq z6SN=N_u@E`H6WqRZ)ayVL3gY_Tone~()JAaka#T^6t`3Ua^%N;I_7~j&yg4W>DjcV z5+qwW%~s@zOKX)jtUl?BNVJMf$0{IV?qmUnl~@rMwLYF0p`6BdbcZP42_^Ur3v3i~ zp{XHdX<~HiGMtjyidwclhc7rj2e0GjaNg$DSa^iejH?pQBq82i+aV{db5*9r#`cVun=e>EwHpg>=IBcrN9cbz8A=5M>WOr+wX*ojH8K zTXY2299d@AAku+*LOt-U-goK3qzYQ?w&*cvAK9SZ2kr>!$l27_ppckQU;CD5UaY*o z)28?a&=(#Kz<=}@aw4d+W@lp6j`P2paQ=4_*3GktSL(f0WweTnhZ~&5%5AsV5HL5* zh=QUA&>xR}8^QlofNV`=H=>LE9PgkuvrMrvbQ8|*Y&v1_$~m9aLaRX!_Ne9vhn(uvi;0t>$R(u7U z@x_|WI6pcI9!GdaP%H4P$GXdve_*7rad4`rQM|VsYJtgxF*K8iu;5ciT|n_8}W6J z(Lwqm#J4jkhA5zalZdZpobVvR_cuaKfs=v1c<;kl*{Y8wMkk*lgm8OZ6WxQQ(~tX> zc7t!J+*lK&);8gPfuklUqb0A;AP<95SWz;`l7f|mI-UFtVQ;-bP^Qko*SM9ox6_o< zzuM(*gSKb3(TzL0>%)-*2Bz?a(|3 z1-&h3XB6!`lu+HM1&5YX+E9DWTK=!p+J;%E<$tWTX!ba#a=$_AS1RV9MXeUwRJs5h zV!+{OLOpB5>-cp}>mEsX!p@^!dQLnSC*k>UDeUXh3G$NQ>%mNKZh4xwyj*gvo|%T* zj9`D;0{h#RMZrDj)pu`M91I83TwK`m@~5$xHf=~FW}7!-lHSSNy&H`nAE4DI)H~3k#~A)jrLB+O z;^$lsOk-u7dnAF%^$<3Dy=7ax6`*(V8M>!}-x@Ki)ACg)A2G_4&Q_1o11fGs=^OEA-@HPd=_OcBcP(%pIq?z`W zA{E=@G`iJPD)REUJ`O%hM8bWYn_&})Ky%~cIs$v3Tloq#f3=0IulsI3HFsBdI;^D9 z)OO4%12A{*y;gMD@RbO7+`%FQy)a$3_(aB$UC4*;2ep%R54W&fAQc6X6P_0~PeT3t zgtmiR9))j)UW%QppGiJldQQ@`nopST2{n3xtnS=SL#u&Ax~;rD1gy&FKlwK5b6E{L zCqZ92T!ekZnnoA&B+@UyNrx6;wtw~nJq^c`{{-pFO_?7)6hfC8#w=;)(Wo_y)}lw2EoG z9%n?f@+R!%kebJ))HE(eUbNtO>=!>znp7R_qLq2VZmc#v=&?!Y5rXF)=Y`FzruB=& zq9b1xe$6q9D<<=a}wb6ZeQ=J*uo#R$YvP^c&R|iO;4v-|*XfN(w zo8grmuAAKOse}i=o-55`t!EC(cdS9ezG75^nw-D1EdV|skDSrqgT_2+M=E|)T5nx) z=}S7T&5F;!wq#1>v@K#(o&+i*sL|<*f==ZwNcM!iW8Csj>+>Rf zzm~>vLj5#O|Ifs&>ug&4QXUa|thd7|eR~V}S(4W!e6n4!#?D z=I*^tWk`40*J#396W(y?+6E7L-icEN@FT;h9t22T=heTeAT`jQm>*F5&|P`SHms^z za8`!Koo_1ra<6iXMSQceS>6HppHO{q{<}U-yZl~I3PHVgda1Gl(01UiBEpY98>%S89DAmexpTO>701_8B++$qOd5UN_%lRIB3Ytq|@O6t} z{VP?n)yX_+tC)2nHv-Fz#Jv5i`Fg_oKxKSWZ74;*g8kcEoQ4}0DWSF5QnY^Q^R#*l zd#vj&-48*x!<;^jRtMU#!daGphbMUICdO0m9d{}d@FWMY|95;$5Z`r$Z?fo`IJpXtUvkF-nczNG(x^tYZVo`QC%Kod2(hERWm#fH?m|C=L(Y6&HdwTb@ zw>+PD{XZ zX-7SdS?TY2)>e+x+Dz8{i?#Mmfj5@5eFL@jjZA9a-5esjJL*MHFDTo?L zDB%Q)nyuV~#rhR#{gDPtMKg`g@%CWnc;n1cMjZF@=dgp=$4JNtURd)v`6FHCOsMKv zy6u9;wz1fnk54D)cKe|ctWjt+f?7U}*33mz4@!UVIo)i25NQWrpgV(~nnv2!Qlc|b z|1Sy3TX|%w!#KAk)VZJ2GhuTls1y(1>cnjooUa<8$4XhMjHc{gS~uvH+$Soqm+qCP{kMAT zIMaMQ95=7G<#Mjp%aRvE59jO(_*u;)31x69tW?-fg?7}0`GhoMqJ62d4^a29d+S^9 z)Pgy**=^d^__w&OyWOwl-ikb1_s(co9rm#=flqMM$xd$?cKK`N44k)CoOQC>nor=K1+qU z4SPT>1r%v<*SYDp*^M=mQ14DFPsgbuP9yx!dMA(5@ca6?*$r;YXw1Eg;c4v|y=Hj) zp!evMXZu__B?UdlXzRIoh{Jw2*Kd)Tq*pYNzXjH!GjU=`*Z;#{yYCvIOE7l7W~lyguAe;#4xO zb3rx+aAW^V@@^Svp&^*jxUKf+6=dHC%2;o0#d>Qi?*F^#CX7Wcof4ly@`@x^PkqW` z?4OYzIXF?298Y3rV(3=vaBQXX??f;1p8e%baVC$Rls7`JiHG*eyr%!Tiq7A`ZZMN} z@8H#j`pUP~%Ih)9Hr%8DgI2|@*@TR*G~P0IvMh@tdStWEeX zUrcVF7X#;UiR(kZ`80|9F(i*UhxQN>>M?j|@jj$J*7=M24X026wF*$ls$mm*No{C< zB`AWRX5K`7INhmBY|3>4>06PGpq_%2x4#WiU9G*<$OE3&zfA&9ceGl6GiM6pslfq0 z;`0a17Ib^(>*&YVxAL7T>cy7QIPTBVuw+t*EWt;B0fM@yl=L5Kd+EF4e9c2zuv0lL zL@FsZP~V$O{mbdJRG@W41h$O<7-e@P+!(b9 z_0~kln}Oe35&>9V+~6foqKc(VNz`D?LwQDh!q?#qc)sKl5wXQIdJq!og-La%3nn+v z_kS#J>fdMUZ!{uwu3)1>$DZj0@QuT{kqrAV2Tl*z@5AhEv+sn|^MQ|jY+X+>r!RDo zRId`qaKlUIPsjMkA>X6V^45UEd3hR}RDMhsV}0;68c$Cj%f!=UJgqp^9Z$F7sn&waAMf=5# z?VmZcSbWh0c_oHXmIaqTK)>c3M_+u3SmZUgRgo5%VZYoFfo9ZQY6iVC91&*()SvBW zmIv7D9WwZYb0Qxj-_P??KQn3ZS>6_-yw3B(x}Xc)XT))Z{AV6=#K{+bW;Z#tL9&yl z7;)7=OD%`;?lEf7x%r3JLZjr%PdnB^eEP3X&9)rMyTYi2z7s`#{KIRx70@DG)UrFN z7MP(_*Cg_(?|M{uT_c44m&ZN7<{ET3q z`jq%B1F&hF=$swRBRRg{->z-@r+hR?C_ST-+BSa5`B=f;L~3ng{_WZx_>_-Px|uMq zliKcJwGBYq>>X-LXY{nr^ZXn?^>v)BNuZDN(^)tj6~oMP^c(tq6MQPZC9iyvBUeEK z{>p~?JZ?>>|3K==T=M8S`Z297H4V2xaHd_bQ4M81sBaL_KcqV;>zQ}3TK`SSmp}0j~+jiB0m0AnbZ+Hs= z;cK-PY?}=qJEH|F(E^5TDPeox$7W3uYNFQUSXy(N(V8V_%`GXdIWWQ6n!ikl;8aRL zlTJrqa~YIbw9BpRL~9Y$JrmqY3!V|w-4kG^IZoeyPpJ3AUHF=N(KgX_a%w_72@4n3 z{1fV*jtgE7^bBv<;jKpSA^7ngU_o+XuF}4uv+rH{iVm$Eqz%(UnBCZ(1orZ}i5Z`R z-xKPlV+nP@H><&ir~~bo0V|3J`dthdA*lCH(6tEqGCcK5k@JtZdn>ty@`hV>lHZG1 z7h=~-BY)Ze;kcd2L_zL(*)?k;V*n!k;AO@(fH^%b;|sC#pePb^$_n^WO9XK$Dh zg4||%X&m1_=6Uh%4PWWRUi25Z8}jSXt?{pMr{mXj>lyBN{CYHQawfS7_IQ~Q@USg9SuN{#Lo>*mS=wg17^Z4+F{(23fqaH&Q?oqR)0>)FJTBWDw- z>Ddi40uz-fKkbR|Gx^6@zr{m-cs4x@uci}?bQ7Oz*MeO=UAZ0%uo}M6IZo;OVmd;5V04gkUOGE%w_+Um+;zj= zdJ(?8LO0Sll?7NUa?8vZ?_#VPFFTgp-k%-jSnj_iE(=C`U(jNkZ_#mIf0*DM2p@(m zl)kx9nxGaF51P1he>&R1WRIo&R+6E#4yL_6T4T`KLV$h>8Dr0P41=t} z*O(C}LC<$$uDS*AW8odZDUKQ6smx;Uvr$JJ--5y|f&3jiZ*=;LPMtWFn+d0IH^{zF z*pD;ixea4p&1qQtDt!@c=!>xNyvVA45hv#{O zo;TnuKb`hQ4g_^x$rxb6(|yzMykQK(s0!%_>MT~indS1~3}-U*NvM;&P##yTbzWCO zCnG}^9-;fesgId1!0r>3&=*nkQg5k>Q9KJ2{}H3E=xkzr(v8vF4xbty_Rr(;N#Z|+ z+IWXzv8q^nd&nO+1O2{B&cV9v*K)djfYbu$)N>Cr*be7Wz^3;fvv0Vew#M``P4yK^jAp*)7N#;A7U;T6uJ3 zEuI}yCG1Y(9zyWSBQL&<@1ApuAi>7Hn8i+Tx33I))$rH&2L2k~B>dE;v1D6H&Bxy` ze+@Io?_;DxlD~#-z2W{Esrg<3q-1{!$|1R$;W1G>12d7~uMxHQUzqi*MtR-pXVyR- z7ka(qabf0P7}Ir)X3by2Y7^q^pwjv&v*gk@cUqejen~8uQe$GeT%tX=ZrFnx4S(W% zd=H4uiTH5tv

0(e5JMXxPh9ggtcMTKFcz=jLjm=S()z17aog6oK~7i-M67x+CBu zY;+m5@Z`dcY)+*{uzBjMk{D+_@>1mmEb8|Vi_6O-IUn4qgjPU(WmfTsxR|_ zKWP^}21!ZxThi{p0`TVoJQIILQGb!Qz0_9j4bPG5;14%f{%+pfaD={&GP444nU!SCY%8Oqyt~PVr z{1M4n;%c2gIM1c#y8)0Q7RzVN$CQJ(Is~qUwaegYt6z{=&tQ~K=1X4Qte5!G%-{1P zXycV6;dHJ}9#eX0>liXiAN{bi+N|*3{VIi_Fs^W z7lOMT;$iF+#E~cdBI!3vZ@{T&+}22aI~{#H9nZ;q>kgN&z8#0Y9f!UxM&A}AF0--( z_oIJl@Cfx}ak&%LRpNPHU3;MO-du)Ob)f#dt`Oy_w~B`6OP`9v5)&skunmewDr?U!*1w!TIts}#vs9(u7|(D zLHHXS#7P>|=nWKl1$Eryj%S#{rDPT0-)^e{d<1pe^&-wl{Vp*JdNzkbej&Rj<5U)M ztN{jrgSZR(ApDF_PXuuYYG2?U!!v@~8_z-znlyYFMLdthGlH6i=h=8hP)|?Op%*K@ zpbbG#*Ic&;S`7luAosy2SdP5QgJyl-T*ooX1ZE+mA*egAqqAPWOB5aXoqoE5(Tglq z*hPgs75~*gk0mJyD*{R(sK1*AI@w2HB_GB4Ka4lT$5E3`+eO#M!~AP-CuIF3Soa%2 zDK!)QMPG?4R-|qC9@Dm2u5I(E@9HOz4)jl~n)+_T-P2gn-*p{U%XmhBUk7%(@Qk27 z0Ur;uZ*_mNQ-Pu&onfJ`rl#G9J!PD4%Y^->9;Fb}8nnH$yNbID@F)40cG&popE$cI zc@p*xCSkX&7}n~^WdGZni9qWe+VkMMuWnd8a26UV^?QBnc@3V|>?J#IspdaOr~T-S zmnScbeaN$KuL*_XG(QOg8pZ8LzWpp8he~l##6=O;hIOtJD|@;bYV%FlDFn6wctq*g z&>kK4vsi`Hok-ouQaL0ubum&yNDZ;n?ReVGc4pw!h36gGGta?WWu?nS*calIFd0YX`cFXK;SLK>gXIT z)H!3)Ir4C|b|Y7f<*6y5St@{>B(I z3f*tuYqWAC*@`>Z0(*9P@b1Si-KQ80WC!=`jE1tY>ekoce2quC zChl6Jd;wbq$)X5k5rTSR4Bfjk602qt3c*ONg~mmWbB}gsW3eZr5G&Ro=wDXs$tKSk z%`b;)iNV|EGk9*%x{~8T-W{1t?8x@ z!&rI=H+{T>{dZs-2=~Yz^J)W9Q`@t83~pr#f9u40IS9Bx-rCtHi=ZxHWsf3tI#N9; zsqura^W{hcmN+i)kwcMk)Y%1M;<@&ytA$EOK6?(1%oY@Q67}tmi-b+ zgA>QRdh<&glk%+8@_1fqKpxJGR=GAAvswtg;=p$s_E9xj`>;1lw4?j?cx*;tat?6= z*Pe)iSn+4Xux}A%aQHo_yw6NHdMv@wpLwrFF#@9Kv4#NplEH~EI0u5*S?qw19!qfa zXAXz2IH^}68XWS0$NM&uhfI9*Sc0QJTe*z-kGL!bF4K1#uJprdca+Z3LK{JU2VNq7 z?R)+KTPEIiv$wmF-e%*?%sKrZ))8%vUOr~YUtYT}2_7%-?8n$|Vq;$))8?2<#bGGw zX#ox`42MBUZ~c>S=!3WSk@J0)Qv^n4J^uwpozUgIL(r5^Q=HZG4&F>k>_1cr$;G5s z1AW2azo=R3k8ay>c5^%R$4^m{18)xYwh3=$n%}6G&+z{?<?kXFWp#QJK zYc?M4iIp?%KG1IYp_?IU#c$#Fz-!`XRygf(dTv8I&T8WRvhN*_W?gM(82qzlU5{wD z)R=W~ZvW5fBKuZ%&A#P>%~RLp>4x}vv8OaTNcHzV5(^K3wK|R&wN0j&?njDfmEcXN z!jYc13xn+1*{~dOPd&aGAl;R`ZF#<9s%}#v>(vjdcUp&fCm8j*e_*{M0Rxg(^X)e4 zU5vB$KJ1>GEv`X}MYMP^YqR^~Sok8==DyC+!4s_2SASfD`vBSlX=u0WW4+xuowmC* zPtTbLNG1lD2HDu6{dV%qTngS@3f{&2msjUIO`9F;_X)Djkp+!Lz7H0(Hu>Z{+{7@q z4OSMqk%6d9zKk3OzCUucxwhjzg8EHYbe9+Hja-Elsp$G-UL&kdkR_QHN{#H>C-#@I zv-Gll_mxu-`owVK6>f;dFYRii;rBfJ_P{UgY6yd4_%{@ z;74?dS(hf^WKx?P#9j*Ssm1*m!?1V4o-*v%Q^AP>#GS|DY2zXWC!JKwcFxBC-cB$6_X1`uLKJK6*MZmT+sTH| z|7u+ujxrsbYsR#P5l0>bwY!lc*|Y5=A*jE)swsFf=>LDry$O6& z)!9FOXC^aqXEI49WFR*%kQ+o9Kr)9bYQSx>AR&@uGT9(5y)nTAq%UZ-MXNOlTeMaa zQ_7;%1gnCgB-FPu4r&r0P(>SD-lDZOLxAGa8rOz({@>@`naoTGYJdO!-p`NEXUIMG zp5-~`Jo|ahIlgA^V5J5Tl1*4&@70k{7;8Fs-mg4&D$kwDbFcEeQ+e*gvpatPyKu28 zVWl%Fu0E|7=`4#tzXoR^hTdLvMh^}{Z#&Q2)wbFDd+$DPFV+$0{N91!2^H!Zsuhve zp=jkmfAYuVr4IBbomT(8c{(H|hyw-sFL{rk4^ai-B&{934DGbn_cHYKKKxJn_lE3D zctviBpcRUvzscGQth^p?L-q{zVGr4!qojk1UY&d1?=7w8FR6o9<4L;`uWOo&8dRH* zBF9xrII+1`v5P|%S|aNnvXWH`H_JVM^?GaJZg-LrCx0TJtOT+&&N;P5p+|Mkc+jdw zZ)L>QtoSRP^Q$pcfNJV2M)8sv(qLW1=0ZA*oE!7gQge%tt$eLhq@C&@=hSLpt5L zu+Yuhp|R;zU{U2E<&1_U{63Ulg(avh!onk1Ispsukx+})W@;gnhir?`2%ZZ|AHIdo z!5Kg#Ok~bzSkyV78bbM1Sk(7qZSsJn53t~FZ<+btni#6f+Dxs4@~QGRjI~7q_A&bM z#7^8o?E)ul@?8cf&ZVB^-$6Zf@DF9Vn}(=|PTcec6l|6m(- zvz1v}njnja7q(+p(Ef3CNKpiHFH*0LTaFaP-_Tyl7suhG96CGJN)$zR6Cdg}D>vk2 z`rS`y@Ov4O&~pj(xnv?%yda_BhXl`Ud}`L_K>wfLMr1xxk146%w-X?HRPC3(?#I`5 zd~H|0cDw$S$8rc6sYv;1DHl ztc<8_h4a)$mA^Zx{7;m&!foG*uVKimkqUpi@onLI+qy2Qt(>T~t{T?XrBQ9AN3}Ki zZR_{8H9D%T_^7sw!`ccQjO^DSQsI7maghJsw*H0^;rTv&FZEcQf>(OCtwM4b`U{qVH53V=|?|vSY|Bk5qKUV4v_iGWphWmUIQsHmq z2gUF0$DFA0S4Wkm`?+Tv#XM#h z>Hq7Ekx*>`RI;Ma?g1Csqi~VOdu5cBeX=)XdxuA;3Hh0ig(6grt7rVudH)RBw##={ z8|i~?oCm_^%h2_f0|L_Q7}l+?{g+;Jd1v6sbb`{S|3x>rUL|_l>W2JOq&bs3Z-TBL z(kNS%XH}zYSDsakvQv3(4{DkN-Ua!6fDC7!4K{m8Z|sED*bA)@@}Yxy+i_#38j14t zsSvkb4*uLV&W+obCFsjbxfP0j81hj?YlXpe3g}60NcoVxN4r0B!P7(fVB}f^>4VV7 zOc}^O(z-yGOV!sJ+@qkck*=0Eq%%M-MM{-ov@Q_R0ckaXbi_<|SO-woHlV#i)9ZyE zMBd`w&I@ow{Y=uqfv-nlLGy8A!g35bila); zk19O}&{>D&zalFC%&7d+kzW{=|AMIe_Ne@$kv|P^MMGqcDxr%iar!M<4JAn&9+NNM ziX5*`kqUo1@>T?GqqiU8Yj~{QLn=I0Z$+i{y%o}paGp_1M%#Dmw_%MiTEG2&SEnRh zJFGkYyE-N5x2jG_`fW&uJXfC#Q}@NtCtKkMp-4R1&u}i~V(*@-UC|YZa!FU@p(~P3 z*bcs_o~>EW_m68uitaojE%5zufqvWJkpEddO9?(9oQQW4RI9-XLKkk+WWE{L1!NN# z_OI!!Gq8&)Rv05PWv9CZZ>L~=IaY{6ocI8CQ;7HFDo7hhmAx538%P)6Ygq2h zMJg`u7*%_ z>zo5F{~_ovhn}L;)lsR-kqYNz2Z%45z?VNm{?C;B7abt{3a2MTl}JV^{LLEm&2%6% zI*>o#KFpegna;g#x}4B^;! zORq3?M@z5vh!O1k4~$?t=zz{Y56v0vGzvfS)t&IOPD20i>%U-HIL-v8o8m2g{R^gX z;K-7A*XDtsZcA$eIGgH|K40WJc*)^kf{zvDWl z>%XtlSdo;e!zk1}P48}aUF}_X{V$xq0QrMn|6pCeM!8=r=>e{8$W&Mu2w8QG6^9lxhqyzV&eDBl5n+E=fQx1?iqNF}XD*Wy6AJsmq z>s&`cXW_LCHExYY^KwPX(`XH%o9(F%>Hc{N?ln)b*X)ftZQaOU9|716OgFu1gAb%|NiBy`u7Z09@~A5 z7+)1j)YStU%J(9+x7W8o>;-+uf9z8teXkYU;RPE73sCj2l9zrzv>xzBMEzQ!7t*OU zv{vqiJ*shqBIwD(fBq75rqubr(v9BX(<9Z}&50+4%iz{5_#IWQ9g-~sStGw0Ga1>h zE&H*D1|yjJjM`5)*Q3%K_O}BMNT(&<|I=Zm??>*)+UgMl7{*z;b4T~ ziC9-6JWxmb%FnT*2JPPfEJd8CgJjFCVwX2GPSTJCrNZY%i>hX*rgM>2{UvJJH7uPm zEI%8TcI=;lnO1p=T0<&wM5dFGR<%v_d&01^aajJqzUcD*+SiE@B#CK)M%pq&NosA! z_fd~u90tQ*_YJlZ#|-peyr1^C_WD-AZ`2FF5$ui03qn{sy1bnF@ry|2UR0_y6i zx;r5jyAw{-+=kWD+pu~{yA)Kfbe8{~XSDeBd;bia9B8kDkK{I-`>w94otmt2p-^42 zuhLtOl~@_OKxNdW?qyK*HyQiHX5!okcpDVV<}8u$G!4N+x*gTwMjdX{Q3QA>vR>8t zhQmX9HpB4zJ_t`Qa+625pwSY4(@#BOYD`x z{cmWIQ||U?h3wKGR;^XRUv&=(owpx{(|?H+VH5__o7NVUiCabvp z7S4*JvtYk~UK^(TiNNU7$a^|Saewb|`K?{~77X{D1068^)V@kRy_Y zUmceI1JaRH`a+K?@mm$&UZ2yTKg1T;48^0b_$Adi?Z8RG=+n}ct7}^fL zNIa?D1uh2+og{>NjT^3jrRul(QuPTQtdcB$#uhDp?|5Ir2o1Df7BTBPFH+@Cmlqfx z#4S318WsY1&CtSl;oq(Ep#!mjHsQnBN;&xo$C!1)p(UN;t)u?zWj z1!v-ey^vr?_Xg8%BOUqu^}VE9sIfmP?sOqX?e8cuNKJc@j{M%SSEZu7A%7ytgxAo^ z$Wo8*CCIi6tGi|IU@LKQ?7iGeGv250q`sjUmxSI3o)mgt2dm+S@uVZbg(F+O^8Q^} z?T_Y39T%!|7OLy}c~Td2vTL?*e zYjX#raV;RtMQ&Jukj(h$^$N32`j!577w^`Ns(`b zjJ<0mBbQw3TZ@uwm6EqZp5Uf$Up-1fzLeaCk_{-S!=8GfTBx=b&>eSUa;{~4SSM}r z(iv)WFAI(AJ`-_Hhh3_wp{SXo%!LGRiXKN-a#*#@Gi z^4dLWnK7S2`;Z%yXpc2ttM6XNyFOo;sHU#}jBeNAPLckR39BeHY8h=^iZ8wkwi-nQ zA*KNPL8eFOXlf4fx`$TvyIg(Vt|2cxMUO?-LHG5o*s8$~bQ3(gE`O4W3j^RlWVwaf zC(F${E`&{CUw3J$74mhgJYoj?s#AB*)vZn|M1(oXEGoLaqa7>%dmE)aqfS?%mDH>X&;? zsFWKTx5Val^!5F5Dm14)iLSSDH++uoipt5k<1V8!76#u9^dEU|K*5-sK?j|_l8AYu zIFVjuEhIE6k-9fVS(!^nB>pmZImn&~kNLS}yCAzFXLRHos$Q?wO>^9bIqus^dX#!T z;q@1Eq9xMCL-R=5_|rq$cxcXv^KKY70FOux_DHBwg!GLtt&^=hN?E(1buxOdo_sj~ zd18GQ8pE?ETWPK*UO;#czvux-68yb5_;DCNY7R;4CTB~jrMUvu(uSfgsLn?IpbT887v zUER@mavRc-c(fRMq*Oeq9du*V+!3SZj=+-CQ)<99Bl@l*G`C z5k4%B!nQ8OyGh)QY`u2%q!~o309t0Mmf`&*T?PJc$TSV_5bDs2I%t!sC-uAQ?ZT;v z?q?Anf>~Y;?4tO$UaVw>_6kp)D5D-ZV#H*O$<}eL=wG~$>Hjs#{`%S5y~KT5QC6dz zd10A2(n#Jv4$`Kdn^A|dvCu;HV>I@o-FojAa3FF0U!>6&l17;dhPtq-8@BUQ9Hnz4 z2usO_>;jJUVwdyRfZ=P@LwoJi_79|~xH|Z{imU$<{HuL4jH|s-xJr>pVO;Hv!qr~i ztTv1+;ty3U9DQ8zZW>LrA0kG@UX65$%@Obze!DY$lf1g;s^;w^xJ8K{H6V(yP(Kw~dm9T}N9VygLUf5_0?w_wkTYSfmj7K9`mOQsxbdPBxI*%z6Z3T%^L6?;6`EzJCo)|#Ed3)u zLu&=9b-C>|qK$T6MbNrz0=2gy&JL0qRv~U4bD7xy*@KozLMvL##yQ}f-WjaNH9Qa5 zo7Qbw{K($?R^f?ZFGF1_C<^)k#bR?75$BKopVV?=u$Fez)gD2Gr1P|5R_1Tx@KeX( z(^sR@{ln6Kd9@C;ghyiX|I$dDn(&_(i9^9!&NmV=MnVpb#4YG~WcsFI>9S!XvH8{i z9h~^-e`F+zzh@-wz)0K?90~s`@GnH9-yfDf_)0WRjQ?L6i7&?gCvf7eU@hmviAe5p z19~3GeM*py{67Dc5XTeZw6?v|!O<{ojoVbe%to}NYSc1hibk$PEL+GgbFNI;uE>;a zD8FqR$&|atM|0OPuZ$#1Vuv6gKhkhna(Y)ZykGAM)e$L6KHe4T#YnQ`1EtJ&%aZ+Q zC(?V^iFBka*|}@DEZL46k+S3&q$6d?6GJeKBuko*J5rW3A{{A9>J*rV%aS{hD{?k} zjCAB|E*fexEK7RDk!49Ftn*OM0nFQhApK+xOV2_&GXD%fSLbWMt`k+d+`H>P$w~Sk zUHV3pE=BeqPCw_bB|TV+Nk&gThO<9pDI8iI^-f;t79y@ZP z=i&*ZBj;-UuH$dVP(0@VB(+z8>O=VLdFb)G z|4H!tNP%&75XP@7hCItX9CFy&iic}B3DWylv8;%r2fNfDTO zLKwo-V7v_C2rLY~yTr-ZDH=1;{|6oXHSkaG#K}85mGgLlPdJehr-@<@)pZ!V&^zLY zT>sn2dH#!WYRSdQNhZN3CI0~OUn1^=w=i94L(Sid{3F+Y9Qi3WHoE@J=dHgF`6&vB zJR%|6UOfk52%=_JHF=umPYQphvs6OgJ@JH2*O~G%BX2mnpIjOVjVlp zJpxC6LnSr1!>c}frBbH~S*~y{T$8M{OB=9hb$e0(m$rwmi-ya}{Us|&;yw2lbZ0m8 zm{$+Z3qh^z8M}&FwYsfn`QL@p$`OQCu14e1WNHHa*9WAg8BN`;M9*XmywP;&{BfQ; zxnnAu{iG_iSf()>?GE?p8ogO()0nr6ZY<7c2J9@2LkW7KJ57qQN0vt`YYPu$ z8OyY0li+ZlKncB7Yu2#A8Xohvs;;X{D_dm74o0eNeM;mFi5{0T%hYj6#kiW9kgIos|1zHynu>I%EcirGe|h>_5mGi6Suk?4}SO5S+4@>Z|BrFmB0KJH9I-ne0J zIcF?JU$1qqF;&_Pe7P{5X=N>XxmxLEDVvEI3iqlPYo@F3|2%7-Po0gI zlR`6i<_ymSWd?hdUS$BYO~C9^m_fBqr7(=vJe;+`Rpf3oJ()C~ovP8wPo`_k_oSYz$#CE0 zJdKj&>1WV#U%E>7W)5w=b;Xl7(+KoG8Pu<{%(t1%cPrGdHGg6MVbrhjaF%CA>uNC` zE2l`GWNr4vfNCZ5D<71OGuF>+26n30Jh#jYDqrl5GsmE%DQ@1-9HjEGN`AtL8?<)x4=bx)I&)JHs-!4t)1AYURBGE~d(sqRCt5aH=d-Pz8$36#789q{6i<|L zFrOj1)(+A2gfkANa=%-CaQ}&}{X=vO3zX9Z>3aL95LSG7`jPJ(1r;0C59R+r$v+>Q zZhzLfqn79?Mvpa0Y##9?<4{kCVq=F<>}?~`@uSLH^RT>DXDq7+#+R}tPs3aK&TjMu z{Ju<(Zp3)yu#GNC{npjzd(W4{u45Y%njb)}KW5#^%3P}p(j=8yXP_@CmEUoCzQXDI zBB;Fhyi`7VsN4dj98pAn1VtF^*E0b$p)>!+9&UFq2hU~7zm-39jMAbr0ul=F*IgaIAMIns>Yz~-=(t_!5*;{J3& zvS1E~?_iXGvDu)WCP-6JDo8)*jq_a3Dm<%AT5XZ%VUL4-;f*;E=h}@?s5fb}d4S%H zyD&DntYxLF$Q8nHjd=+;f#9xjs&v=x9Pn;2y`QR;`jJ%J_Ep6z@T{%B{ zuz=#a9a0P^LvJ}~wbWi9)BUvpE{4BQ(6gO+4L!mGqQ5>6QxsFHlTTC`8I}K&Qa%q_ z4F4;wWvtC;*^M=WLuE zokq2dhp3GPHz$AOG%C3@hWDNSovX9Il>3r>4sh*G@kZb!J@L4mijR9tuv%6Nf@LvI z^l<^A`Vz#mWYd$j#9P?Vb7~b|rs$SsbZcntvl_Hd*YNMX3x}?h^eqfdsAAo$bNKY!Vo4)kyifPX|7f@Bp!F5&HvD8^`xS=YN_2y9UnP0SOZRBzt8)|Ifm)v z!K(M1RJTq(=%l-Mbll53ruqZ07b;g*u(745sxnx%KLOZd`ejOq01QlBnOkO>d1CW) zso|~4)jKzH+!FRI=*F}nA{&kHLkZlXNut&g zn`o(C!Y(d3jj`!XxsAQ*sb`XT0bAgq^7X~9=H4}aG28B$ZSG)#_9q^Cw?(2_4VDj6 zNgrRFz_YHJlX9Y|JSCNN-m=nVl;cd6(OW&{>NE0G(|@OMm0JFAis*M?mPndtSVoz) zhSwImIPIZwy{wbX@(S5la*@pV^+Ezmt4>g$AI)~V&DD!=qmM85A)AC-T^f2mg>CnF zeP%hHR$hQnolwHZ{Y9D61g@)eQz>*bcB+cTw>AH7C9Q=*nUVqyKmCwUl2KNbJvjeV z;f6B3A|cI;Xr9LMe=wHScFeRfhQC|LW!^lEw7YVwNjJWhU4;?GIl{1YZetzpjckE? z2Xuxmw>q{P?Qw)5Mm=Ac!pjXkft5x?*S$QS2j!mxv?te&X8X&{)ejRVGg|oT1cCYT zbkg3+sir2|Sy?j8O3_zN<-Zlw5n9gHxC|H}UaPIiWkglEWt?0u-o;kPHb$dluD+OU zWQ@Nxc@akDj#O%0%P$fn<^$jOFDGHd$KdW-%N|=MTkBo`tY|RZ>JGvDwDW#e#1fI~ zwebts75IDa=(|wkg{WsD?rWXxd?Y)@@~AQz27Y|X{TL0?Od5?FN7Ib%QD(F^IHUI~ zGrEuo3dCChajB~o5I^i$z_NiiDjsf;(g_pO^NW4+M>BIZ?~FscdsDQQ%Y<3rV^4sO zC2;#NgQ-rvY?Q&LjANZ{HXFIrv0uo3>DkKWcv{l6mKUrSv$*Qp*`=8M8wARGDc>Yy zvbpGMy{Uu!9(^VK{Uql7;{l++A*8?lC(? zZGN0QN?w*8W6892uz4&VIrrGqv3Wjqi?o30K|w!4kF1^qz;y{LcbT+nz#A_wD|YP% zg_&h{`XWaCq4`}flydo(@wQV{OPC)NcOOS}$H-IC36IkG<6{W25KdXs2_L^oUd&v;wC$b+p09?WSPm%G z0E(-JpqQVo&^EtJ*vekXi<{Y5sWshaJ0Y7*k1Dh9OpsR2hkIV&!2gyk=!%*%rwF&Le=9$JXQb z(EhSeub!H&j=}|)w^uweKrbfQ6;tGlPuSp6e;A*%&+Pq^o}A047t75*k?B6~@Zy@21fku6r{vD7t9 z8NqtYVu}+3nWIIjq5JUC`vqX4uaRZS_THt1muJ znyQDp7`=Gq=#hW{QbCnAhe}BDwC0nl4VZ=9_Lvn?r+A&v5k4J9PJCt zWaGuPUh=Xmht{^hF!tb>SAn*&R|@tZ$;_mRh9e;1&cgSojpw#{2tSYN=G8O>%pte2oC#~AeF z#2hddP+lWSFaG8|Y-d2}1L_;ZILAJT((h;SWqSB>ehy#GS@?3sjgL8?FTl+*z>8IN zhVm7-q0OJw_G`zK{{$@PkG<5FgM?VQPcCQrgJ^EST!S2;4u?8NU++o(= zZdiWB61Hz}!#I2;1ZOXL zOj=O4IUgPvwWkSozqgp3sEIkC#f9V?ylV!V5jMh!8o$r#j_mX2Uk~r|<7V>YsC_mM z^;vI&x6ghSo}1d@K8(ql@-MPhD1GBat8_PdM?H(|@qJ2<*K%2~e@EzXkq7>v-mH4} zE2f9-SMfg;40(`$I;&*6J}2&OSR{rLoQJ|2g?MOV9pIxeMKjnQVBenkmZekuXN@JM zUyNz!`6u|{XASkx#^%?_1%zRDrE4%6KQeQRPE4n#3Oup&ndZMt7!BTWdSye;nL16` z>B7--T7572{+!pCNr7UF+r0dN` zC(!sEhW0SV2KmdcOKK#8>qXxi+_Turx#R6LjuwUD-=0n<0oCK%t<2%Jx;J=E*J#*_ z>0fwFh2MB-yy*RIK&WBAhlTYy=HnA(KJtR|5mVbfo%Diu$O$|AF(mIb+DpnxpcmNK ztKj`FIxPw}ITHBSbQ$&v&V%1UwhHkug@bXM6kB9g>0O(xl3B4)GQgEjlsed^k`o0J zpwYgarRt#bp+$@2CAVB)=j3_W#H|;y>$77e&N9Uo%TKnAF0U$zLGs zGEKH-Vnzn5$Oad|6)Tt>d{L*>TK<;o#1p5bdj6Va z4vrh}Wm_iL^4ScOYqrm^yf=Oh`yU_I{}um^H-l}jIVw9L<&q|nwKGl9De@)*QcjTm z?$g%V6e(BCUm?t4t$AeOO@M``%DI@@Dbl#Y&wTGxXln2zvFvd@uThl1g|SF9F~(!e@(d%5^t4DuRyR95-(L$p;l#{ zUy*rD#%9Po!MFtyhI9`zKUVl1WS+flyaF4q$h-!~yxUnv`54H$uOaKce*PZ#;Yr@@ zTWFl=;RqJBR!(*pMdK%sQhGT?KISybhkZI(UpujOz4Le$Zgr48%6hQdz^yL8>e<6- zQbk2$ce)78yr8lB330T9xDNM&-A)a*mP+vJE8cc-X6550@E;Oa(zyGxRuyoUJ=i@# z^I-Qy;M%L}sbr?R2<4v9gnW1VipWE6bPF?&XWhxZ$y&i4?0!X4UpQIPxbI|Z3RW=d z%q-T}{VKdQddPz{njCOLs%3Z$C0JuoTYj+nLXMLj?EbB$vHK$O`k>{WYt$awQ@?jPgXsQs0DG^B}M z8;}1r+Lzs#WyxmMgCuBght_zT+fkMYnUH&bg$-q$?7G6;W#nCHDBqVG zYd6US*ynW?G8mR-gK24Fc|w88xr-_?;~pP@bMFJ^-UrUTZ@x+4+(o83dy_N;ctE6%`?p@h%uBH5 z^H1l?M^6X7@zRYUdgTpoNrHcF68v-H;h+0xoT`!REBynskrF9q=B4aP=rf-uYrqSQ z@^j8)l%$%D;7P;i>))KAemn+#d{64%;MX#Af>J@|5iE>Cnk4E}+?>pX` z(^a|kxxyz4>l%7mA8wNFfdrTrlmIRp*?ZS1JiIK(!^y7FMDXyrF0aDF4T`5JEGHY> zGr+^sFv2DUYPXYQRw=v7a|zbR3S4Da8C&T(KAqm$(1*Jq%L-g$%2&Hm)72hVIGd!k z;N>J+L%dvtQBylb(d3Djr$+Gda#v${GJ6@kydC`QsN!?FTjAkkcapzJDkYByd6dE) zr_@5tOz-9un~m@ zGTB)3wL{*gmE)g)51}1ab;$d)BNa1{@DfQ(p3;LpN3HqWI zJ5?Mxrg)=z;4^r_y_0P+-Nt?a-l%%eo^UoYx8jZJ9=}lWg4{QH1=}#>Igk{O#Bc4Y zM?g%e!#V&rv#Zi<`qAi9@>o-kGQ;l#XSh*;dO^?|)d;v%|JlQyg|Nl5gSPk*#T&I_ z$Q#8e-l#vq8w6{E(EA)Uko@fFV2R zkym5*azZX3Q9V+1L66jJL621C zkVk6Cc|B5(PFHDY68u=Ndg{oRAH;cIZnpg;@Y02>J;+PDJWGN;sk)#~Y8`w|q0#v% zd{XbH6D5*QYFW@Hg|R|U>ewb{Xw-*$q;gTB-nG)D!>pLVH3Y>cRfl=J8nbnY;*)wb z=#x5s-daer8=W7(D`k+&r=P4^uFrx5J6MtdPn>BLe)Z25r1{V4$X+p<3^q=&3TWNt z+HBE3K1ORY*-4)W+-Go;O+a5_ndrYH#_BmGx8(_@ILufQQkmd#28(|j<*Li3d~;o* z{~xEc?s`{3*;md`+s&mTw;gNGhJ9jMB>E@BAePL;+jN#O)-XIeOM;EsjmO%p+Oj30 z<$pM--NCBi?fRXyiX6|t`q(U5AN!?VSsx>hSGzV1ZDnG0?2;JXa}v9=E>>#fJ!@Sd z9g28SeW^~4rKlB9!}(W4LY^s2&@<)02YJS&A=U?bJf-l7i ziw|*8YAYX^DeEaVB>~VRLXRQ*sQBf?AaITXZL?P86QXC!Kv`@vFs=rRa`hDW)w?Z%R|<^f*R8$#jhZ zxkJGuYG;evqKnbaEXuM>L7XSmNNXTZXRnE>%OIaEvgiKYDi}`;n``HG?IW-2`h8 z>#~ZS%a?J-4csiu(H{WGfUn;2C*dN=$&8jsHqwcIso|Lhn0qzw$RSMyK9!m-uw@}q zhX<|-rhUS_=y6g^hG$K1%-59Coa`%o1-g8U{IE#)Sc_Vs>-byhRR3kD>ni(1|Ldok z+^1!m2X<{kJ$z+|Qz;Xrv5b0oBl?(tsD!7`!xTi6r1^guv(Pgiv07*AYhBvfMCN4L znhy-Wa!p_@t_DkO`82~ttikf2>t@53yR>o)*2B4etA@uATY$0mu+!z)h+Ucki}tdZ ze74_H!gO)5N-sV+Wpu|OQfi}XuB)(olWT>Hh%R`!eDlfAWrh!?8UB>r7)f8Q(H;j| zi9FS}2)_By!=a0R+Mp?qTT1JWH?oQNmQ-?P86THBr1{NZy~?N{J`^}$1T>M9cdjNF zqPv&~k1#ZNk40ya1??9;jdo}D{$h!#^ED;)I_E|3BdrS35 z1#&PcLWjALttov+`R0WundVH@W_G|rI~bfr18gh!bE<0f6jiWaiP)HzZK@`&lbcOc zegdn*_3|N0Uf~XCn zQd4RHX>=btFIVi%Lr%h^Y|hHu&}-8$LR9r5SvjjBIS~CC{A*R> zy{MGdoD3>IH#)MyMYoWu@vg+ZDdttWnW?3|1`huvFjU{LJ~fV1nhW*G;h(9wck`8-PqjtE{NwY$OtBMs zZuWLjnj%Ro%c8Tz$dj>$If1h^AMus8a{gb9_arxa4t5e^3~xl9hUdK5%PYfcffxc%l&w> z-ZI*j!R9WSi|DJFMS1?5qPiM0{>NDWMak@D4tQH+WQf!*x*7d(tYg3jNJf!XYi=7xn&|nwKQ}6zp$_loa5U4 zZM%_`0vqRd!DH?Yb(b@1^Uc+`e_I#A zP2xMVJIYxD-Ubv}2gYKoW_KjALRMe>MLXio`VC5-R9xN%*^tB~n7^u;Wk~X^a9`l> z<$ivwFChA6_*_1>Pxjpgzp$CjWiPj_^l`V~Y&4w}x`$cF^fH`jp|hQ+$@Jx6KbG}T zfyVJgb;T??afkYyZvMJpa4OAR8&)gsSV$&O}gi#m4l(AdqvnGSQ-@L!~=YZx@&r}a}nk97Wfn*V29?MB*p z@_r4SzhkQ9QR=HRDnH*LYHBz7WYoDU&MLWmS(X@BGBVC)o69+t^{Pp=Z^`giR&;uq!uGU`ofPAtdBzq`M**@%%_g8S5P zXT<3rV@yvZ-~Bw+uRC1+lI~3Z4c%FOx%ORnH%=c}6Q`|R65OS_OQD5C=~G}>EaYCA|8~y3ajbM^GtZ9~CSs$X|Z{`wtoX%ow zLV95(X4_`Si?7bMBtnaDq4%#_Xg|q|uogH`SkK8D+OwH!5%7syO&)N$G0#xKS0_}j zD7mpcP^01ZCJ$y$#BMNa34%6l=>_d|mgmPkl#7ygytQb81qLQU6lzWLGtk?4nLA0i?}fN z{|wmkSvU9?zEwlkeAbN<-Mbe-#vBJ9KHhC@7Ix&LP9rOBG0AawTErQE0gE`TsH;WX z26)PI%A9|u*s6j4%TJ3^zF*uOhhO?SPQDQRy~dm%8$GTNOU30CZfA#Q<^R6OEn?aW(&tvQ)%gr3eQI2nuX%q!>=iJFhg974JwH&h{Q{bB{gj4u|VKzL<+=+ff@u>3Ne`b z60}sE$XouEdbap--eS8H<#gbw2EY-|=xb@>K41*>S=H(K(PjZR)!%n^#g63br@$kY zgIr%~>L8!5IkGcAc8QMX!6Eh5!K#d7F9kkKGqSsJ(-KQOQ8f$ccheG-GG?t7l6f}X zXvMgtq({Wqr&S94$>ceVNBr>qVq*{%4Wi7chJ?fnen;Z0BQFIq-Bc5mc|IkdO|3Ll zZvhvv@@?Y@vX?7n9orcoet(BnP1EynjrWKlppi0;yozmEgUbxIseTrCxgv|1#Cg?} zuc0TU?&XR+rg38pO?>z!>#?%|SG8&B?4z#*4)TMkvyOHKG8O*BCCoaqE09@|0a!lq z3hY$Am3`Gtn$7)**QebTzsZ*8U$EVb-vbrvjs^lnavbi+o$N2?;>6h~ITgI7oU5$N zFwO!el5#WhG7O93O}2&5QC_Pwi1Q%XE|YcQ^Vv7a8ArSUNKiqyI7WQ==+|e*O7s1$^$g8n{ zu|US%ud)^xb0bSJn{4t%XsO`fCcvDJv))!#${Phf(dLj1rUj_eY%$vA`>VSx_)V{! zD{4@OzBXGdWr=2&9d#7X7w@huGLOZa(EMc~wtt}g6WnaOT;lL!9V<2`HhWsR{#z64 zEbT%V2Yx3$fO5~+H{t)^S&R5jykl)8%{dk`+FOeDmUinF--LDdOKZo8gH_Zk;~rkC z;H<$Rso&y7-D3B~oyS%LIC-jnMPTQ#y8^SXr&4jXbJ#+8l{+3jk7@D*Q=$wz*wEn4 zIP!A9ik+75T8Qpqg2wE2xCz@4k(0d=qpY)CT%^a`?FtCFqpe&eQQuWetI(cFn2X(( zCYf;hsRZ8gZR%AX2R{e3;S8khI1_360B8=f3#)Z1?L3lDr_^xe2sNxyYPixP@{??& zk>`WDsOA+3@JsPyZRc;hW~gnW?W&_Y1NrQ#bWn8q$tt2s!fm2^ioN5wGvIUZj1j*^ zRO|*0c7lFO+hEO>j(o}4lKEqooL9S}Pb>0|Buh4N3b4UyGcR?ME@xi?O#}Dka=>Cl zu9(1imo#fd`pQ{8O?E00;}x_*ZBPr_+ol{#;*4=-c;U8m)V6PF|6Jj{Ms9ltK}30Z zX>SbKjE%UVuCcY$MqWtV24piIP2wglHUB+{JG=~9&M_O;2u*yd-_7N=o+wPL7&%XF zyS_GE+?9;@)CM65kR;Q>w0s^)pK zElX*!8!Z;KaxIzdMllQn*Wy~raj!rB9^acfR#f3M*&2^b;&Q8nLQbl$ur?En1Ru}S zmkT4laUY=*=*o1iga z&m`+})!pKD$1U9;RWvVw?zia%>pCHKAh{7d%_>b>T!DIuq}if~SnqhNCeC8dmrP5I zmRTuXKI5KQ@mkS{x-FtHjwR-sPp0N>Y^b#I-;OJijEKF#j(PA%{N%+O-5WH}ALEw3 zQ}zwKYlIm(!Cd$?R`yS6a297tXZG%rEohZ6>+xib?B3`>P08?-CBO!qi01&>KO<0& zc=YDsio|0l1A1WD68=l;5{bs$V6oV4udLk&z16Of&Q=*9cj)g=oikt!%78`Q&T)Wc zBUxKgBGZ4z_S|(E{BM%1Wz7{u>-Z9CYrsdX=|w8fS$dLdH}-Xp1&}u`G9;74H|~eM(Md@cq1O_y$ce zwpi)Gn;zN0FFpLcd1*KAO^y|Lx%JpZTn=n&*CKz-MCf#5b#Y7k+MelH)MBmHg13ix z74eXeZLSYm;I(>KZLq%ws;oZI-^Q(g<;}}YzPW4$n+i)0I{irwryYKBFU`u-JKrKamJ5k?vYnG%}^4ysh zsEvuzzvp}TW*4T1NK%kT2qE^gWgfc~fF`lNDAM^rj5A z!pH(6ON?x+AwQnwTF`sQzsAK~16dDi1U^C7H^F*7>mJEID{9u)uJN(W>G-xWS zXOnC*vdm~ysv}1Po=vhl$>JnG<05Xf6dDmKuUf5Chib7>S=CA_ZdUUfntoS zj@!@*8+;v`FRYKO(_|lx9UM3Ag=|Y_a-jdqvq>mNc4Itjtw8@j2i4kmyxr0Y+Y_}p z)*EEigG!nc;gb%0ViqV#gXlenl!ClzZLNgiwnWLj!Le!LE3sk@W;D~50WYrz32U|| zh>lHMb`he=V+69-j=?Ho<``&1jz_idqNpv^{&WH2IX84gw~)~ znQxjo%M6?1$+Jwef84sIRl|?BJK8kx{ZVh$qBm*yKK1$JO^$U_UvcFM_7w^YHs$-z z@I3+f2WuQ1akxP7HR!Z+5V>y#H`bwUovRA5Fo5js z3?9}YY#+iw;%om<#_3-0oEg}GL?f)i{1enW!D>K2xe;E*!K!$``RRv7bFA%OEC;w*-9?;x17|st{N*x}WL}!P!TKnd%~?)iHJxS)Yk=%z zjY-P$P=0f@M#|j)9ahP6awre2$53rN8wYQK30fze{A;RC0VSSDp6fq*HrroUmna$i zfwMY1A#YQLTfo;-sd=mkYp?zqV3aKp+X75dBdmM)2av)#iIUa^)7ENUN$ZgQC>gn{ z2}X5IiS|r`YcN=wR!+WJ%*Eb-!7ARE#8Ls%D2a4Cr(mw0t-y3GV44d^Mo9+1WW>`1 zk)UGk417;U+yg;%7*LJI^CvY;N6!R^9?aEE@HKN-X`rV7p7cT@LnO7ypK3O1jT(dC zA($v;h1SGWD~jvC7JMoU>z)_niFe~7~`mcjRLQBDUkLR+@fZak4pJkJ2{TYJ?& zJNdGcAWvi2$^7H+H(Y3PfV&@o&+o|g+vPvV>y{B`$vLaHaB_x`p1(fJS7(?rjMhqc zVJ)%n)8>OK1p1}3_d>#Oauc|U0sgi?|G&PlN@H47PNz^X&i^lDY0$%X%r;^{06&fC z8O*bVni41@BS#>UmYX$$I?wB5oazUsSni<4@;Q#ubuKN0(%!bUem>!cWSmNKvPir62c>=;WUlV;!I4&C{&>qdNGQ z%}Xz=U1FMKjfG8m8|I`uKXgb=`_%-v;KgS>&}!5+yi-R{9XZuM5?X(r zt%+W%UWeSnBNsw>uNap1zVFEELS7Cx7Q>!XVj^%?;0U=n#19bNJN$Dsr`vpOt(>To zh(WwVpuZ3$TC-0h-a(C`p=gH?Ec1rJGHZm|iJuxldAA5%RlK>%3Ll*h_c!hiuPh$f zO?q74?m}Q3hre9^&!BCG^5C9FXl}HYZnRtj{F?NJ8NUH74R+Q@Z6(7~t+w@?Cc5oe=V{wuPnHI}R>*fFRyg;3Zk1$2 zi)d?!wzHVZr&Yhc4r|=&quO;I0fz@1H*-gqQERYE@P9J2kfj;Zp&Gn`@ zTL@;VJJkQD^d2sgZOvl&0q~55XOWvR2JZbCP|g^3^yrE7s;U#gy+wB_Bq(|1@S+9sf{2Zsx8w^Y&kO zRNncNo;!SX4E2*%C)9lvB4n=~V_X5xD*VeBZ#8c6DShDZ2WK4;sH% zpQZI$iiepd9<8y!k`MHsK1p<*5SYx;U={XNJIv#UW-7A9;L%(Baj}X zCF=8D$Z$^bSCOP}Gz-{xyk!K$HEX7fc*T$ zwr96F5NQB!;V!LM*^=pgVAn*nm%GhnNfbEX+8C*+;%;^Ye5tT?g<9m2k!$rXx0E1` z#R*{>E8M%*?a~QL@a5(f7v{JDPeoEE`M=mQgK5O0H!X$H^_37On8W zE|scjWs`WFiSFA3Ht=!{?obfOkCf2qGs#vwjZWzGY2-#cSrhuOfAL;;FzP^WU0%v( zNI2-FT-t<2nO0iP#t&A_0Zw0F(Y*~z9?tzgPe9s|Tb^`Aj5#|$%mSr)Aw zTpV0s929Xi_PShhu#+7#*x{u{IS=tN3Ds%U7-=C~8{_LNKM|(-2hWyY&tdN} zS&ivh&axPGEq$+!=PYh3xA<0RcwMv}v>skh%C!i!xKYc}v+FD1$CW*(<+(V*5S&5% z8ASvS;)@l%cQ(_kozXa3GQ|5>#*s$@yk%dF&6a=}<@$GP7`RX42qli71fBXo^Tju(IhtdXkJ~I7pj>o+F1J%5V_DJGRzap&&uePG2{vIP%tDi%0 zeH815*g&R4|K=xA%-`RGXGvb06pHnuNWWK$dt7tbx4uqjdR+hVp^?w@=iuhVoV^Kc>nAaT4$PoK!6d>GoLP(X#Y$Q)5H-F6`KSJ+ zSye0^h2tox;2Zi*={!GsgW59VFV(1xs(f*p#Vij{f({qP3vM+_vq z{HR53i|Qi%RtJp;-X1_?e`D}TDyu@b6VGX|>8DD$z&;*7%hH=~%4}KEEU~MeJiV+4 zD*{j5l+}WJvI6mt^8zSI*vlgtDj!ijHk>^y;*Gesw1scJ3pUp^7PNvl_Pu1KQFNbH zEJbUMHJqhoEk4kHUD@B*W(<>fdswy97Z#4DapK@rjx09P-L7`$^GyW zdHyS>nDK+(0y9A8g+z{0_?-nkQRyun)Rx04Irve|IQ*}2tr&e(Hym8tI!yDN_UZX_ z+6A@I+V7YVa)$VY11Fv7asFDk#EH~E|CvvyZfna|@PVl9-`&v;2oTvbkio2q9{Z`1 zCpsEf&Fk=A56GkSm-+WH~UEh)44M-w&@Tb2cZw7Q9vtW(qp?N=od}>7U zC@~vxwA;Zuqid=kp(cT?(1YTEv#m9EcUa@~HXZ2y)p)D8b8&Pma-hF*gz}*=xt$|R zAQJAp5psh-V3q3RuiA0PptAByG_zbkL-8zTuoP(GI|CF&N%0~7YNzPFK>rt?5sj%j z^Jn@q(0xE*N(}OBHV6BOj94F8Ye_bYHs&+A6*m3Hb?}c^rG3Sv*MI43+je*x{GEB? zdUH;eML-l?hIzfANJb3cqb^vEh;vxy$~9U~Vs(tPhq$F*IX7=hdj+}KzM@xQ(NXIZ zuk#OOT?Cd7{D+Qpxw-Rfh*z}0AKGfM?JvICe6>*n{zra>v)?${GTax7yvJak27NRR z(aeZ3#9QWez=P|`y#zjqB6$qP`dbsuwt@~5=s)of&N5kG@LODMxY{$Ph;oqDzYjUa z3HQ1)Jr5N-+ORLA!zPk1Si|#z7Ulkma^x*BDUm&66nLM9_Iqm}?AHjz8ckg{HP-@c z`T56IDHjwAEfQnnSU*@bRTN|`yinupqjD2%i`&R&tFxK0!`+k1@H5 zwE-!m6ct1f(b5RMmhxIav>YxL5fM=l0TC4e35gMrQdGo%$Ufh-_e?TDv_0?td_Mp4 z`J5Bo{N~xuZLRgJ=eC~9&Wn8_DSJ(IZ}vmUZYWyG(B4lB9A(e${iKY2PGPAI8cCWh zaJ#skJd(4hM(xo9=lJHH z%-0|N+!5Exo8r{%VbRoP&T&_b<$CGBo8#o>Qloa=fjilgCm~$KY^7WN_wn2Mwemo$Gd<@AUt4bIZRxD? zgz7U_x6O=wdbD{v*sf02_dtH|6}n=dro@npSPz8P0V;ld-K|=@7U|4c&{E}y-;mD_vu~xr*ikLJc_zA; zZLv-ydp{Z&A#JX|XoTf-*!tauj_@Hf#(Ue+FU2J0L~R|Wf6MM}>um;aJ4Rz|3hn6p zjfN0$x#XoEm86HpBjvAw{C_zJ8QsEn{{{8)}$Kyrl`#} z{!Pm4Q?tNmxAmU;TJ;!}Bl^TypSYC5g!+$-+v|_8U*%&XspiR~23FbTeHhQ%uNwL4 z4|U@27|Z;K9zJH1oo9@5!K6&a=+g5UwTq68s(CjlqQ>*C?(FT9^HQp|J@I-($A5Oj z2u;;>#a$mUo5IbQbAn|L= zcL?sgolC}xwJgSS2ye18 z;qy-z-M-RI%1uhs9v&IJmEW7$J-bhqoxsc}M?P}thbH5$>YBm3Wwx8 zJ}D{7ignL@3G4S)>uIgI@uyX^@X-T4qU=$Q1SFQ+I?~KDcBwt5a6@8^gVY_H)@<;2 z$8lT3TqLbSZ|u^=DdKD8ExtDP)C#S!ON%zFdBx*xD!njj?hf+1E@oU-eBEJVj=haP zjRaf~SF-r}F8lPSEm!rvHtu+5*T}EBsmODkvg7`f^?^&i$N5*NyX1>qTD)N`^!2H!Vx}g2 z(~vsa&#YYU5Zckx;oqT|4F>lzgxpClRIPRtjLW*c{-}{qf6R!lKW^AsUmqj0X%>mPF2pLNiOsLl3FwN=w2*y(r7@G##iF1~D5PCwKCX3ED_c*?v>UT1t&!D+ZYHHpyk zF+2=(c8N=-x9#CFYTx}zi%VRW=#2mTQCg1<(L)>8yRCV>%+F;N{p!<7^7WWV+W9wZ zDyM&((Ay^G_k3Y>bNxKC4*k~H@>vZ#VC>nO>uU`2EZ%R@*dwO4mTa?wNlSV^Ws94` zey`ZHDAu~|?lIi@6U%DU67$`6oi^vN>Wr3;&|_UTdwPe~-q@#PcUD;Rh8%f6P>&Uk zCJp=isF4UIXW1isS7&?N<~k^d9CKgy7-vm~>f|KW^ixCXJ~ix#D((8{-#82MWq$oza%$xe zZiJH|TauTInrw%Uuh}b+!|Kqzws_+3JvVOe2-#e^EhN%#Y{-#xZ1&F_w#cYxi^elC zxm&uhw>Q4-6Jto-aYIJNPkmpbb7L|VHH$m;BRO59IXxsk@~ERK@&J~JkMzZa_`qSM z5=O`cM*MxD`cPWTM6{ z>WV7aqFO&3^B29EG;WCYIosxV^22Eh0`cS=t#)4+VKrivG?TzWv(!#^^RVYF_NneQ zQ)q2N9W8T0akphgl6WP4(oDt|%9cof^4K{vB}>BHPqVw7{mNYA4f%x5$ZRf1vDR)S_d_XGTXY&h|v-G`s1t$F$(y z@pg=zWcT_pdNG#X(%Qx(ZW)KoZ>T+Ii;A4IMWdBHVaVFq;(AW?*Gb*{@tHEAC@{v0 ziVLT$ldD*}ZA;i%}cxIs45$o~*Z< zW9X=7u_C;<__GcwijkJ&+(BhlM=cFE?do>Zy}!DlVE=}|*jwfm4d#q2cB!>%qbl;c zm^GxpEdTTY;cvYvTo&ECkCHSg@bo!cHl z*0*vVNQ_!umA@x5#ywLh6mAEm3 zb|K`|mO1G)g^a!mH_ath_*3i@WE@fT*$9R2gpgOO>PM)54hZ+!MR(XcdUiln-3X;~ zI-Pxe^{L91Gd`!g-ZCw5Rg0J^ZX7o50B7VpM<~0o@63sh_)T=x#(yv#+Z(B% z))pSY?C_(+aVb^#+<^%NHmDJbvz`j^Q+&ExdW{#FyqlQgthYba4x0Ej2VrGDrciR8 z{havnq?>z3!;wH!xFkYS`gL~MKl(^|P1UB~y%f&BO{ooJMW$*~1W&uvd!39k$?eHa zA!h2K>=qq`D}tw8>NrNH)%aF#S~9ua6LWXJX`2iGZ>2;{NXoWxYGH9sXm}XB-jjB! zz|lgj9^-udC3{vYKb>!~yXlUT0V{=Qkbf;aPG%>!s>+R{YBp@z!HV#PO`YTBPKy8h zeM3$*q($~-ufPuW3hdY<`>WpMG%ROjo^mX)*}3b3H><9U!Y_j7Zq}LJ>@Mw(qW;cY zx1cT+P26!q+G@Ky?WH}de!n^-=j#pIb&0k5iepI?Z9qfbi{0gPSWCxL#&H_f*KEc= zo9nX;3AOl2pPIW3Uy5GyPtLe>x{oqoVhLs^V@c`lQQniG^%onQ(D-C z1{Lz;B#nD|6Fxs^=z5h)e_H5CBR|RgQnyH2)%pS1&LMRN84;Q1UP+(UY=!i}nMT{3 z5Ixc@ar$2g^i=mQNnRrDw4P?i=3o!0xjxCcAm15&tXt(ei^5w?9xnbM?On^X?l(Za zDZ{Rvi(H%QkPNeETTV;8cVYZz?;B~{&|r7YT9=+OH6;@nXTJ2|s%5L`^RtA5a~s62 zEmni>oHPAugPe#nYI`>{&>r2ej^3Y19bnH9`|_A8 zXr@fs=12;E`Jt8GT*4yX1IACu=M%qtKJ3;qt$%c3${c$1$GJnJ2>R^K-lN(v73jn9 zriHAS?myPG9F9=@s~?|0nmisZb2W@=|xw3X_JA1paY|JtEZHxf)q zMEP|iTwjqRCrDT&F)6tPU%T0=jN*M|ii~#q({f2k=}$j7X)LG0l4VuBwoho~IyvKG zmAoUSYPHy8cCKrOEv2nsfru0Ouq!qol` zE}v`M{~@DO%MK;G2-nar+!)h2Czd_tobNVw51tKEk?Hgdw>)tqIf5RMufS#7$UklxQ0J}V;(?v3FB04H;oP-hgjtXN&FQDVz#$!Oc!H*M7J zIITEoN8e&^?f8p%)`QjL$o4UX&#rl~&tIdK_xZc*Hw^4GyaPXt(Un0DZ0-9F^h53A z(o;gXF=N$;@Ev9HOiT#e_s$vo&%x#e5X)$S7I;QoyZO#?$n&O@SfC~D-VvSvCVlc zRb%g17^A2tXSnyJ6R}Y@>2eOG#l+WA^vtA*MYO~*F^lU$X^%8+j&ZnqA*;nm&vHk( zZ!q09zuWHafIA8*!X32*O3h5M>z8~{Xlp33Tk2h$*RdBbloJY;J8WsS;ui#jkCAwI20m$2BSVY<22uwttJo(|bn#2>kH7p^X{Om?=0qcnCW zUF>9?uFxEuXK-E^U~wSfzc$+n(I&Q?)^)M|+vQyed+j^HX6+3gEnp3Q#h3FxLiL9r#bjpg|;81LSkq*Y{9UY@d z`8*-yJeU13_GEA-xJvQe*wgWK+YG&)v^l}0*Z06)FEZL@@*|_2bf_B=+18<2%gtDc zs%3b1l#TVsa%NZdqAe#_P}GguWyh@^wI99gqpVI|^hGVb=o4=4xo-%3jNqJ`SmWXu z(O%C!6Xz$m_?LB6BpaSnGZv||6fRC|dva1scFJYJ^{+S&s5yk@fc{&3wLR`)!Q9;+ z&xwj_$Vtk^8Ue)%5|>PAx5S=p4{6#j7aUH)BxOhBESVCuWFcQY!s^_(78e{YklvCh z3liHc*^y$;ZVGAHYSWo(Ih0K zTHHIajp{XjF7Jx9}g?_QSM3`md>nVTGZbTxb!^%4Uj; ziZ~JET~Ih8yi0U?P0z$|I1*c_W%GRZ;1KqSOUNp|#oXoNfUVf5z3`6MJtMt2PuWsz zac^yLm{ti#+IyW!pd&o$qb-T(P8p|TBfUqr{bRtdBQv5u-okCy(aAN=op-X2HUtbS zY{{=K&imt3VJmMBJtEHToil00Bx%vEH+Q$6_((>dv?=fD&J$aDvu8+)>FoUeu3K0y zcJ5^TdFNU}pDR#t+N6eUoAi0OI&tG`8hagR-7=v)bJS$Meegu)Q&q_}`+ME4kNYo4 zKW@Z*CPwb;^tAr_!ZG13Vj5Oevj1W2q)Xe6Z9zhgUa1#Xjc_JqUfgJ|5XA5WLh?;v z#Gz8UGy0G@cxqhrXXZ@_j5qA&ESyAi`W z;oiHRx<2mREq|m89cf>6I*{0~D#>ootZC7(QFfVFC7^0ELsjIcn2W3C&}a0H)7bM^ zmBRdynb^%(qE$$XoF~UR=*_vi6w6-<<5PRItS4CI_v?KvSrZJn>JLbnaT0h;@3_F4 zgHij*0XYXTf_+R)YXes7eFvnxSEmQ0P? z65cL~md9b#)|?x#)b2XBfx87+8w>0_+VOyV@7CnpBH=S%}06P)9-YnTW91aGv~C<(Q6p3h~;s(*bb`K zaEh?^6Ee;VcZ>DV9@qQHhbJwoXZ-g>6lYTIsAY#~jnox+do!+LO4Y+TK@ueWtH zSIBKhWJ8Xu>5pQ3aIKq}tlL-!2I;pIZ%H0v1&kmwKvGIl*tM`{Z=z+CbxJ`@ZhJ(40iL}X4E#)St z)<-z=**YRxMaDkC`W2&HO_%jso7tnt(T^4aA37@FoGNw5fZa0Wj`T5&MfrEkTYIJg^!}y#boIh4qxMkXOJy_Za_#tyCKFlLdpgr<;% zVV%)<#g49SIg=RKVu$jNw}H{~y8*X> zo4z;lkblH4wAxMkAmdK`I%efr%R?eBcj8tD_b7gG7Kqy;FPJApq%EloOJ#?682dRR zoWFFwUJzTeNL_xmQ_yY{8AT*~Z0*8n$P-IQ7`9V8+ci;6pn?)k8bl*{gO$Ij$f0(C(^nb9O{!%-In#G1PQPsPKUr zU*+zxH*)TvCCm+=t7?bcVTHAioU_9=QGQFvKkQKP;-5pC(fnH*EAE!N^yTjLnS2pK z?U}hssrXe9>?xkh-Rvu}<>t+c@-2?v@l`g*fn>RbvK=Rr+i<$kZq`VdEe+$okz}W4 z|E|+G=eU%KDK@0vf_0|8+~lo7{xP5zH$;BXDG>W)r!4LaRgot;9b>+7oIOfErc0>$ zSKk1MZ~O*GM{}{ZKpTPuYY`Ce*L4pnKG6nQf_5`r&Gu9w>nwh8hNAB zQ2UwdUkN{VT~g$0qyn$-DK-ZuBi!6Mauel8cUw12hGe&Of66Vg5x;kg{erKaGPmPv z3|;3L1+6$=uGdsuelwH%1XO5vce#^Xb+5jK5KnR^X8m*`}^Il<8IOj z_j}fty6v&-!m+y#j85c>miE?rJJ}*9I6@-t;0u&O|8LYwqvX4kZ*b41J-UP31{xj8 zm+T^P)(;TZpSzL6+_y#vz}UQP*mKV1Ow1bQY{+?alr7xB z{nj>n565-fOSC-koBSyB=v*Erz(Vd!oH>E}-MBr}%K5cymGk=nSVi32WSjWA#0d25 zuEdrTCYqs^qhBZaGG=Jb0|U});@=48iNN0a2De^>s#(}LisIhz<*L(*XK_+bbi!`~ z!PnFf>Wuk^+o5tT*dMa2ayYpPyurSg0gUbkNCE7#qgJfGWR#n7z;2-C0JQ&tX=mi*H5e8p}O z@D*Ppy$6cQ3x8SQD=#l}m6G(2({7$Ze?8MzR#uej_2{nBf{N*$;_|Wty;&lSg*7j`P!dkaE|_0p3+iZX?OC! z)8}*N&h*Gn^Y5fay8OBUw1E>tXv0AiMDbH?#=%cDoPP+SrnF!n2%g20pXvmW!axbn zxgfO|cWZDLf$iW?Jh_#`OedvL7pA*P^y!}IzS5a^sTm2nv$9vEkfHKRnjFa$Wu{W} z@84gK%`5ceO)H;S;?avlgtzOt){owNH!Uk`Y!)S3>MQq{DfQJ$JuY`+q9coni^>W; zZb|>=(#b9)Y5sTVW5$liNJ(?vs!#X1E6^XS?3(;XRTLNGm%1wcrGH9xvK9Gmzuve# z<(|B9U#V`g(#shK+o{done3Ueh)DLK=z5lCMo}3xA|W88^kQm=%Ud){R4ou0-bP3v zC!ieVQUi6jD^GMS-&N%GxcmCW(~DoGa4eS0vUgWZpFWfFC@XUncu1$%S1e%Sz(BgX zr_z&GVJ2K&=+W~liu25BI!yA2PEisc*Vo=F6MrDJSmuio86J$L*1d6JS&KimzMGovHWYT(}x(au=bRbPGB>G)1~l zndh56-Bm2{P1zs=vvJbPeg0fjimUkMa`G>)C@rRm3Mw4ZH2umv<$7_&^juG=?#uTV zxa1s2Q>1wn?TAGDt@wF`uHphuKvVoF6_HsHEs~V0sUTL^0`i*fs{D!kn&|OVmU~Kz zU0%Jcs6Zg!>naGQx6xk&P*Gfz=Q7I*ZT3L9m5!h1BC}aiS)N~26qO>_Km%9gwhFe9 zk1|iO8=?z}%E?e#T2lsN0u=O)3@6CGdSM%UjK+mm^l5J`T0(|o(5Z6pIP=bwb{Vhk9 zzhnb}gENwdP34iAl){TZ#lt1CYt$BTzz6^K6*UMnCyE!-CrE=sTKpzjg-K5!out$h zeL`lY6&D}!la5pr@@g;Dr}2-TRBFETb9zy++fzx#5rOp0+^l>f8tL^n6v6Zco+`#U8K4BlS`0LDRdYF@(!Y^>?8b zkZje#Yxt4nPx|E*7L}Nu*N7(>ntpzr4pdb-A)in8GKTP%TwYT-loysV81ga1$)`=9 z?(-Dq6{-}e@m8Z}w!~%4RN*H@t4J5#%gSAh7F>B$mojrCWa-4!ZyTjZ8|#n9IHXxL zb7T_qCMZf{9LY=c-&bMP=kaDf{x?ApC=s*mFRhRPk*mA{Nip`xPRhP}{IFimc&dt3OK|lnlkrMfS$>7rJ5$g14?0l{ zfBl52a{7F$AG_*ZQ1cO?%uxQ;G|(MO<0}one zpww4HtPDC(S4oMNArXU>0Y%eGydIeudaM?_T&4hlVW4DUjj4sQtg-3+dX-7OS=I>C zEkkMstxbc&+?kAv%%UW4Q~!#CE+m0II6UybNxy%*9vCg_g9hq!BIIS3fW(3r>G5Zh zeK4hr9>d5U_H-|QV>UejC=K_zy&(71N?~Q#6 zV^&L8R<{`u6vmosF#0Pknm*keTsQWv5NM6%C7r9s-LWz|U`8loF`3IF1PM0t>RH3j zrcokOGfCuU@+qOv&3v+DXyALmn&SI4Ay8NS)BdLMTVwg;GE{1^3S?U5fkt8}4pTo; z%zmB8eST3vMX5*nP4j)PO2&&`FaJ`9{3G&T%82}zxkV@n9kj(f%BCWUN?dM+@|EFA zxd~EKY)u7w3t-IU|a!k7gQDhQIJ5k{-F&PL< zN&|I<=}S{&=nH;-&4jElLM24XJkH`)N)~>bjhu8>xnF1mI^dS5n^aU_jP(X8N!TNbJeHx;y2rFyQYdQ(PO9;w9F_6%wl{G&T_ zhHQ33!G4S%{gY>_k81ME!`hHrDg$r&LA1yvL-niLn-W(!bQR;_|7Fc}Of8F0Ue64V zSHwnSF@{z0gZ#i^c`eDQ2VAHx+A1xJsSLbhmdb$n#~#?x`uW@6#wk_%vGhAU%QNXy z#wqm-PiCpFfc8osnR#bYbDA6HmrS0^xcS$r?WmYZVMR%QlcwwMyLI67US-$c=bWz0 z-y2XzB0ssFKaK^u&ZQj4||95y8{xfNe{uw_>`?O!illXo0u*z=< zC=0YsZmie-hU&*-Fms0gv;L;3K?ZU^nTA*we$HPk4ET$^d<=t0X#@h+>;Z1ii~%_C zQV~`M&P>3q2i`-v3jEe(c>&e;hw~f7#VXE%g~!!h!lsPRbke8F{6l_^&2^QT7I3;@ z=B9MSR+zELN#jQhGtH;wdoeeelX7bwgayk#NtXx_>48zNP;M^aSPL@JjQQJQ9ea{q zQc*6An^|8H7+B=_N|70zu+`Kve<&`XEg+~#2lFSBAV%8>QdVYH&M32NrrFk+-BvHA zQKK0zncYHPJ*}t!E0v5bNP+gyAEvKP#i!M=>KTjVVNn-d1~BFSw|%veQ|I#uE+E%H(8A8=94o$&P4A@c|(xs)O+@y9V_}5O;GclU8N?KMi zU1UcWAu~AU!ZWEvtgD%3TN-9-ImIttLNwB)kHwHZ@y=wjB=vk(o+scpUPLav1wR;i zj&ae=7JK{=$)YJ7rm~+4$Bdpf1GO-R|3VT=V^(U?nu}SdV{+lKHZs7Q z#0?}c-d|{H!#x{3;vvDPZ-25cOG#Sw_1zEVB~BIjHdOQ?yW2jpn2pNN-C zim1MUR7`(fH6~(B^ngW(ny%LM%om!EX}2@@tNuRJz41#bN1M#)(R``#6S(>r;yD2&VxZp z7-BgJck}Z1o5z3jUX~4h*5<6zi}jSoNpGfq(n~sxV@8wc|IM~y(igpA&P%zP_Fhwe zTr*f1XEx^_2kX6xVtW)=Dp-l4G z4$}*xsDD^Ty_B4CXYw}R(ibYJDch1#_8|CBV;WLxdk&}MMdtS3iwDO=fo2CQF&~H63^EP_|OkcyK6=hJ@__NIVB{ZbcI5)O@ zkb+ofd8}69YCnrFtM)Z-hiQdlo&5&hMwchXa-oCSu(XAk0rK;u2{%iQv5`#lf9WY@ zxQ@azGA69~j(Wp8bAN#Afob~9JqHaNruUfK15#yn8(UUV)O&J|9{PWjAo+5==fGdz ztPjApkT+m@IkC*S18JFkSd#%k4BYrzwIg77hzJmG4zdFF3F@(B@rcM~hlIOS_DVXXT zyGvd&jQ??N5_ZUs!a9F4q^a&w9uEX$b2pX+cJ9EfxrvLZ2~=5{C9}9ca`~%De;tXuj3D-LR6E`zgsi6!o! zg^%E{K~`qUA~-#3Stc1PZ35jFnPtPK2bE!j2?=$Ci1=z(`;G{4N7zq5Sg zT?7L-3<@Sgv@>iToN4h=T3XtlO|gVjadB~~81-ZVZ1y2dV@h+cj106)4}V!UwerZ= z-^Da-=eufuj-NFFld(oRgV+qb3sRpTJ!?uK5YC^J>0!N-#F`Rp3MWCV_t$ubMIlhv zeiWA%SHEla%A_wao;EiROLH!YYzf(v*m&8M%=?6Siy^7{oUAxSwn(PW@ zPacRH6qR9++ZyH4H8#)NtPjmI7v6-0CN`St{nhV8OhF+`}e``;kGG44+hPx{U2 zFDqv~;A-*t>2D%d=rY@wAVraPR(@t0{|#!J#s5i)v;A`?b8JUZ|48DEb|?+W{-A z?RhdUHCeT$rJ~yyUl=q7=jRVCGGqOzaW=r*&{XoDr9lrQ6eMwphKgG>G}CrVHrI-C zt-t{}`pfD^MHOJP?^R_MU_O;%OD`TvA0txzmt0=E68pPIwc=bW ztWal;^ef86`)YNu^d+bb5Pg9w!v0J(xh6NJDJv*Ft4>OKjV%Ww0{PwiomElgos@}A z=3^kVNfONqIlxbTNdfbA0y5}o42wMdc{Mf&lI}>t{&yKNX_5qfhN!?wv&fkp$7Mcx zO*u;vm`euxi~gFvVK()(W<4AE{fPfr1_s>nTi%O%6JZ0-8j07|rW`!;cuxEAV31q< z*;yz~3#ZpVF1HQaLAb#e0-J0=s#kcl6X*<-eMwLih}?xqM=? zt8T2Qv~9^@J-(!_^|6wx;aFVV0e|o6S zB`oq^^Y_|EvG1 zj5)?!;~`_7@mpiQ@jGLI@q1&T@dsm(@v!lT@u;!bSYkY8EHxfCo-mdfPa4aOr;HWG z)5bH#AB~m9pNwkbS!0#4+IY_RPvd#x&&C?#FUDHqzl;}*zZ&a|^~MI{MPsA!lJTY}b!G3o}@Rdu7?>#lmJ8&yx$OWmYy zRZ5K^eQ6W>s{zWX2C6u9s~V(kV@vHXRJb->51zN6l3asd?(RYQFlNTA+Tf7OFp}Me1Sohi$J)xGVC)ING zlv<&lR?nzEs+HJ{~OwOzfccBt3XPW8IlrQT4x)thRMdP}{n-cftiyK0|$PwiI+ z)Is&WI;1{Oht-GbBlWR5qCQba)iHHkeX35V8g)|Dsyg+Vs#l+LsQC+ZT79X`sDG%l z>YwVI`bvGRzES7Zx9WoWPBo~D>XQ0iT~Uz z4tEB8#D2{dQdU)1S1he4k?q#lmt|Fw0iBokY&99c!~w9T+>KG$Pg8`sl4NC{f+UjU zKg?@xZNrW!8*s7Mj^KQvjLD~Cku`f}mCW*lNfRc(ywai)7BeJShK;PJ`APDWsVq;x zB@`V(39+mo7ijZ~MB41v)Wi_yfVv*MqR$}60Sko*U4 z{U&eo5T@)vSLtX~c~O25yOT;eD?I}m14a$Yq}ZIZ(dG`@I5YdE{li4EJZ{wsU0$iJ z0VmR7_rhq%Xf)(g`H-U}s7w~fe0iKTH&=*C&1Bj3#ZokeGOv#<7-mgp zkB6mbrFFTS~eV7m9&g~el#1HqA@^A zg4B6AUtEmc*;hJEWxDdF$-Zw>DKIV4R7hgEQ)RatQKbAhOJNFI7J_ocSY1YeNuEh= zu)K(UeO9wIzI3`6r2MXwW+!;9DF?aBXZ1g zEUcZ!WbW!uC(;yLC0UY?R4}Vcof8s;VY4A@mSqurfxoGj^Cx86%zLK4Y4y%*R6aT- z*%T=|KHzh@h+mEXNoVzdECQhNrLH`>JYrn4;|p5CK-FY<8~KbkRaI6Cx$M9y*~W&1 zozNH~x~!r^7Kep)i!w72iO}TJeDKipzA>SE_HohiHjl+tG6cgh zp=)@`I#G$g2FRW>Ghkpd45f^$0_DjnHV5TRAs`!+EYM45SQS|6sGDm&RFJ!Z8x5%R z<_IA0+D%``PF&dr5!mjI=*gItbi6OW`~ftW5skV3Jt&O1#~o8{Vpi#=L z$j_%4Dl_}bpvH-|xXj$!PjxTx$%X(Z4e;pC0kLOaGn|OBDU4sW&13woeAJQCRX<9- ztgxco6hx!Ov7Mh*s+i#$CTIV_XE{EHY@7IzZCmD{g5a0_g8(YcM>F3jV9xVXMa}i+ zLOg;7l>xRWI*OIesaFj-*)SO7GoD7)qi4{*nF9wp7dJyS>W;rhl17F7D(pj&vz^FT z#!3@MWTa0tJ9)O6$z386SLAPblyTapq|issK^#w1yMP<|U zUsd=xHcD4#HfWMAv5MG@XIk~y(OgzSNk_nYyG;~KREyMyMkR;$Naz4{SzVyeqFxPrUH-sMVm68 zmq8xUPmx>zoA$ulX5Sdurcp1?eb1TFP)2)gVp1d9_Ixyawf*6ii(334?04Gy(BFp4 zll(-76M0UNVjC*N&xP$tI5`W@5NcDo6nb(S$HOfaHKsNpvaSB8eRWH0GK!h9Qj=TQ zum?yuJNZXFs;v(FUC4YJHX4N;f_z)DzQD$Q(!t-18=Rg=+fl-uZ*5cDTl%xK>4dYx z(7Eeu*dZir6lpphZLzwMJ~O?(ggF##Q^ze{o6BR8UrNLm8YdF=<<2&B$fPlv^kN=u zxw^%}O(`mq*DAs-prXzuPHG#w@JLD~zovgR{#tj|GOppT^KJ+Jv+=LycXFFZ@`-*l zY_;~g(D@<1#mh{ijvp~SY}kV&j7FHqM?+VK{7(FJ9*y!?gMWKozpTC_~`Q^q@;r;;#}AFyGMGV}bAyd}&t zggH-``kx82gD^)ckzaG#3j?$hRoZGfLNQ!Z;iEYLk_mD$F1!?+3(f~ox$x!S^Wa)= zGx!SlHnQxy5_m;Zt=e#6r9IdKya^(fHn`m_gc z0{eio!AHPnz-rBQOQEveG6Q@NoTu6PRw-Lw{QFje&uO-PyOgaT>GeATp3rRlOO>sE zCAbWHMzcB7l+8H-Bps(0oCPk>Yy;iOHgKwDi)*87aWP;|ko<>6E8EZ>U?0#4lJ8LX z82UK40)(HTETs;;q-?{KW*f!@#KWL(*gS9{xDPxEo&_&xw&7irZFo=c6nI{ z2jQ!%oO0SpIgwtUHk1c)>XQtP0^zsMW8h|R2jxS$x0Hh9bIWGRX94B23_JtEcfUQ9 z&mqc%^!w+4i$L_mnMrv}0iOfcQ4Z}X2M0*FIKmBeAn&eVDmWU1?xD~JrOFj$BDkbvBf&L+v1KXDDrF=rdrordpJ6vaTHWUflb^dhj%OSz28FYXi0i9|Y%u)!=g= z^l8wiodeHnDvatL76rzFeZdSc3v`2p;C65)`N4h*+FWkQRxNcFiwDtb$Af7gZLNI@ zh;WC|<_)9Gvm*~X@(6d(X2;OB(1o_14I-D;$fb21$eqb;Qk80x#y#M)W$kFo+UG0P zeyXOfBc1C=Cwd|y^~sv*fP6Y2pAN{S19IuKR;fu7{ky4}N+7)i(o5I}9)y47F${SO&!Nk6gYYpNK9bwh({|L< z$YMFU1;Wor__-5)?u4JT!`vl%L{p>Ct5N9HU6dQ`fEsg}lecFzm95lU zBmHiq-vj;Wf&Sc7iOSE`)GhFL3;gvRu2kP-P4$alM%D&|&VJD8{D>-XR8w*2UmW^( z>jmU=3HczmUm&+33zQnNNK?0?C%2;~!%rZGI{57Zzg^+CKm5jND!rpp>0RJ^BYbay z@9prtQ&Xdn!)W9%CJz1wYbv9UQW^aU=o#^p+^tek;^fDH7gM}b`c7f09q33$& zxgPiRxMN0B9+_Y%2;VW!fos4W;4aO)we$w~yCGJo8~TFqc>{djFcmCD&*8Hxe0E(3 zJ_1&Q&w+cuy_EAP$~l92u!wrFSW`W(FzXJ{)XisF|=!}K`SorTnIrgF) zW07+#a_+SN_afZ0a6gEi#GxmYOK;-$CVrnn>Wvq@!T%Qg``Xc)NRan^dEfUC_!0Uu z2>po%p|2nGk)7(VfnKl#tODnOFN2#kHDDemK^EXf-}<9(175+s1NUj%XL0YteGrTU zqrh|Ed9W+k13e8vPg~#~ikosCK)DQ{Tn4NHpU2;Ue+&pAPWX1hj}v|d)+sgc6#CsB z{qBf<$D`jvH8lu*7=%6yS_8hIslmxy^fVGT^bCTYL0!PEv=_+xHspQV0&o$y72HmE zd_?1mu%|d`3g}Xy_hONWG$5Zr?!td|6XNdvJl#O}O{s z-j90`?#19C@FUu_3AAgIK++vXy2GJoIP?rBJ^EpFM}$&$v;lj9u^@8313BMO4pxGX zfy+S3{SL}K=_IFT>uDGJ&@T1|yTm?Q4ZUVPzDwS}lgi9q{D&bP6fVm*)rjl;zd9XoKBkY_gh@@RkrCm+~ zcY|+(N5K=cTkw4+e5buYyS0J#DvkDPH0@P3?bSr&nuuIek*h+k8c6w!*+siWIvJ$H z_*pT2R%0)*Q}T+YGSP?3?I7~aM7~)Gv>(Iq*YLN~zPF%#j{qluQ$WfqoAR2Fq11#d z+CS>S-PD5#&^-aVCy@UH@}Ke?Hy5wLeFAr#rtWca!gdgN8a%71iEWr2w+AKQN0GET$fcwEiAo9K!dEa{mJO@Jmz0g02d?%6bB=mC<`Z=j57z@%aOd1SA z&m`!X1ih1>chY1q2b>BPgO%WHa6Y&Yd>mX(`pE5GBMF7e(kr z5%G(NzX(1T!RNzXr5-NfJ?RyZ-qdwUP2H%eX~=UL@|*@=)8Nay7|Y7znwmbG+oX~~ z;!P*s^lI=qa5wn2reIkW+d=p!hL2*x7ZbjidR0ulDn@^c(O=&prF@HVzm0nz?tQoq zYU)>0l=@Y!rb=((G-4mH4m_o)GUQc;yk_pgSd_;k1 z;ApTMtOTKdHuTRX{A|L{MsBl_+ppUz_3Mrxdi!hiwkk@gs%UT!7!QsFM``LI^!*|9 z{UP+^A%yl&HTWF39o(s@dGXwyJ5*EiNoPLkEa-s+=O#`4eza1*&(zeyQQQcap{YL* z?hk}p^t6`FLL}WKIw{K8_q8e+I19)D!Ue1bjZR4?L);Wqp)d)*mF@Wu&_dxhz92Pm=$W z@8{v;dHDFVQ>i}>0tx?T34fmV4Y;Fm zJ2bVX6e}0?=)V$_`mf=dS_`ffB%ih9^8#{z0lBXu+&aR&um|^E+{kAg@>#bN+zlQD zPoTH$(c6yTP%sgseypc{tSA0@;;)C__3*nMe%HhA`eon>a25DGNV%@3T-PJ#^~ibs zY49xdM5mtg1ksBP=*0%)y#aY|m$CkC=I!$dw54WO+TQ`E6G_{RxNTdZy9fE~K|Xudg6qKD;M762kZf6ffM+aR17CZbrAl)hW~Hi_Z#^A<`j4ay{25YP%c~cg8M<< zZ;|&$z~ksC@wO6gs~0Q*4}l+{w;FnD2YJ7Z_uCeLi!}A=Jf%Ke06qt<0nvv~(TAGh zO4TG2pK{zvIc_DNt>m)}xotykpFU2w<>1@kKEfma8sxtn`EN)5+X=UwaN92{_Nr>? zRl>hY_*XZB=;8KP@ZW*E9`|YL4SM$mdiTa8a0<8^d>cFo)>Chg=WgV=y9am^SPISn z9|0c&(Zk*7;qFV|73vN3`c3NfoB7~WkaB*La(ms`Q@=tDjFa2h>mfgVI4heG7w1u4%rD9_!|@aX`n zz#}dAb}=$-gIv9_&F6-hz*};Nz{i;C$$Tj=j*aw*)K)tHI~M{ooY@crcp=&z&R5$_!FzV3@$oz$z3s8>hHe=qs(r(BWS zJIL+5)3j4(X%BYO9=uJxCjHZ-|J5M)kEj12-Giiika9anxgA8G52DWpN#`Kx93=cf z!XH9E4xt~1Vn7|dtk{pOsSnzN9YOT;1N8KRLeNWlmq~k<4K4r|fyn7Faym@8AEw+t z)My9on)>KCH&36`)W_)0$LP<;=fMW}$Nvca$B@f0OJHg$^XEO510cV3%$ms}jIu5^W;I}=v27CeB1MWqB<;brRd=6ZL9MOkw(1&lH z2iHRHGtgU2`uLy5|J*s!JJ0)5ygvgUvGCCsOa;^6rziZxg4y6iummgzDgTcs{|^Tf zE&+THoC`wthtU0z9sfw&g!_e@gnFW`PsHQg8;C3+8L;#AtSqWP(S*6SU9N>l*6yN%%PlKeak~-4k34 zJ`P@{pHuW}ltVq`@R_F6XLb-h`V2j)hu?bm{bI0EUnFSi^Bko3*RIr-844JHQ6;GWyUTeTV}q!P%NR6U%Z-UoajV3L=*?$mPri@MZ7gL}dK==(hMeE~>$d`)?L(*`}Eetbi` zZ-{qZWA)q)!q0j5x$rzYI@W6HBKcn={|mctvmU2SVYQWYr?!#G);3DBb!bqw4#?+n zU!^WP!Si5)rhcG&f0&@zI2yw?0B{GmOS9Q<+i>5^`q#~@e+}%&dT1BW3C4q?z$}n; zx`B^tw!x{&HaJbQ4PqT|P5pF9H5WL@3*cHkxhZeq|fUy4<}Jl%dc*Ef@N8(==ONuCnDpXWj+y zl4f(WzUXFM)6Kf38-MpikbK;3un?R9LZ_Q`NB4a21XvGV0sg08#X8&> z*5S~L7U)H{mDuxFX{tN*raSef`)2SJ)^Vn=j+2XhpL)=fdeCblcKc1(`N5mP*ypg{ zufg7lK95+;`paV0U&!x?9PAcuO}*$)>ctpvA~;!78z(EZF-KD`;r|l;FH`Scrry1l zuheT(!MWgk=BMcOPV{=G7c2p(pgX^2KG>D{U=QYllT8KfV;uBLF7`0Ts|Y8&&a1foA!zN zSKk0$ragkL&!Ow{`QSp@A2;n!A@~Bg0YtuEAm8)wa~^)a)s*^{di$*o_5|00>%bFW z9rd;k^|rspIVh#RLk`~|zweOWcck|n={3w?m(?r~J{#b(;V5{5dY?$WPo*4>Q;sJo zN7|njv_IY8ryKlqC*SVm+k8t?_mcRA(z47d*5NIBy_0)O@&sPvWC%dTK23&Ea6_@#t@@g~Z-59kF;C~qg_ zJqXMIvncl%%3TL3ua_vVmkxr5!3*Fe%DS`{gm4Q^!fmLebB-9DTaPKl72f191bRf z=;g=g<;TeXW8`0BM{goQ=r_mqs{hWM1NA8~^_b-sg7s%ra2lK&&q@P9l6G(pn=`SMvw@H5=>F*}}w@Dv)#3GLu z;qOKGd+~8_Id~jAN&3ijBXWId9qDf*y(y%Zi@i1iJ#0g`QH0B2y<#it728>l2w^>< z1?#l?S*Jb3x@#)yu4&l$;V%*XW?#X69HObkllTJT6iq#rtkh#8!Ij`D^cq|WZa|(d zBF|T#^A+g)JNf;c{Qf>1Oa|wI^TEyFE6hX5cRTs+sKcIf3cYQC-bR3f!30gceMzae zub`*oyN`VLEd(DyPv@bh3qbVf0DAO3{Jal8@6Q4sWSo!u4Whka##ufrSLxkzLC>o z$Z2U0_`V7Bg4E-s==W0ed+8zYBlv>f9q>Dl^aqmuqtv%Ysc(;+BmQ|1{vLzBrF{wS z1gTd`AE#e{{wJV6>;mo9CF0{Ah&%BG=-9ye80n5A-MbX)U>bBG_a(@ENiLWVJ_A;h z9`$1>^<(LFa3|>!?+N0qME_Qze}B@jZ`;9QuoV56h<;24-C!Yhd-Qh^`nzBg_WrHl zNw6N=1?~aiV*z|jC!Oh}<3nCPCL}VO9MOTeA#<<8*2OVUMF~)U?q132lgixf$7&OLMY8lc{ zhPVu%Lku;jj4_Qd#u#IaF~%5!hM4{M$CIxw_dU;fex384d){+R7q?6_KAMe>A2zAG zEk4)J5&bmJ_4hn%##W!#`+PSx;UQG7Kd9HrIQ1Xzy;7?8N@+;{f6;$Y`-|2SAC*~G zti)@0GaOoAUADmb;-gsCap6#=^G=x^)_Lo#^EP59o(YHMTi?vLzA4BJLIv(Gu-+@M z-dkv0xNuoGwAH#~t94uEUhVheA#Bz@UHby}Tdx$%M(de^Z0)RX7FrK3EJW*3>B36SSUM7;*n>_p@tZ zmFpVp#{qx8;qSkMLrbhfmsl?@vHo1L2OIDpKE(;=>MES8t3>fA6^~Nu$kOwu-%{~g zx+MrLrFSWPOK*ikCC{~+qP_Lnl4RV3+pranqxIgBhuY83-sh!v(e=`0+VgK|J?_N; z9L0P1$olT6_1#H4hrP~I@^d*qE99+0-j=^Y{pL0WpQbm!=a7M zL1<%ZIJ6}%2yKy%|6FT5x*;6$-|mOLhz^Ig>2I6dJz$+DyXQRF1M`H-UxzUPlQ0+aksZHg$FDEr70&^mPxX1^kaJ?q&g&QtZy66M z>`P(aEc5iNMaa%s#^HwtJa3vjZ=yVJVw^jvbnaxWb0FGhXrEi*97Lt(!zJ$&J1>0D3Xe2?)S zZ@e!WcJ5##928*@t~S0`8{ez@aR5hf6mO$=th*Kj>u#Xyb*@|JX`!dZIBzk|8~NMF z-^MoV&@cP5*nhCyJa^pu++%+3MS2d?b0o%mGF|%t?T1mkTg1ENF+N51wz9WPeA>jP zEglmv71QYLr1y;XneIF6zQbvlfkjw?`ai7y!~8$Y|HI;XxEXKZ9q%vM-^%{hSd7C2 zOrk%V{<+>u?($x84?Ec3!v5AmpBIILkohfiG8|Ovzgqv*>ZSU&dAi>`J%IfCf`4D| z=L`OP@f=^8xA&U2_hT>i<1mik9lVE+@QHbyUA3>{%8wR)v~6O~7F0)V>gbz{AowO5 z>G_79W8!~I{Evy_F>yS06K{os4sq%br;Y+#ga`2mvb%%b-^K^Qw+Wbw`FH@E@HC#q zXE@<`M*ng8x4Yi%x^0vlWBOmC|MmD1UxkDAGeOXPPXFrom^wbzitQ*r9rDw`j}Crx zT*AxrZKH1o?!kR{0z0t_yHOmsi{oF%oCg>W2X*|Z<4+xZJL%i$^PN7g*KfUkxASv5 zKX+U(j0d$V)2y`&pFlXED~V`nj&3>sRoa?*sb(xBmZq7Q2w%f75#-;!zUK zA9dEP&bo`RgniT5H^aL5k#+MEdei95ux`F=-FyZ0e?|XSpIJ9g_@2j)Yy9Y@ubaN^ zZMcJ;5_-z`af2VfuzNkbH{vjku)CPurPk@Yt<(2nJ092HM*VGO*SI*}q>ugG?Em4Z z>*ucHT*u=mj#*!;=NAX?ARa;E>xJ?4;x67te!SoZw}Y2q=i#k4(yf!yJJ337PM>q} z7wqfov#-#9GOx*lS>yKn5G`49mkV+9(!;QFQNLHroN`# z$A`$DY5a+b3WBH@Ou!_}z-%nUBCNnl)L)eTqVyM~zbNsE5}&A(cp87iJ~VEkjGL(2 zco)@ilsbN6Y7o2;g)=b`_49^)-dKdiScz+~8n@wI+>g!Jil^}`_TdG*g4gga-pA+o zG8{znCz?OeiI|MpI2Vht6xZSg+=e@FKOVqVY{#?Mg%@xTui*{6j}P%BzVf?(7{3dc zj>(vcb1@G~ahZIHUqt-gG_SsCUVZZbHsNtRiMQ|$iqD(k6QizT)YV(sy`|k-b+`*} z;;nEH8wrBgXyi{Ue`0H}7R4o2Tz-=t1i#6|HMk!6^&5UopXz*l6y{(qZoo~b9;T~@ zw{x8*&qww5w)%U!8C&roK6bu5)%o%?EXS43lhgAKJ@4@A9e%yjj>qvnKC};#VjpBS zvSS82-aY9&|7qm!yZnv!_jrGgKY&fBPUF>Syg0;*!+R&3OYcPU*n8%&nF&EKQ(ew1 z#!`Ic9QqXJ(Z%6?ad>|{ZbbQeU;Ywe?L)_fgWuk8-u#zvkSK16;+E+CME57QVMjRl zAT9_#h{r`(jCb+AbLW-Lov+0PY{V|?w(rT_-?2COwtdgL_B|`?dsZTSzo##y#P@+R ze2y=DA7J+^cF$68v(($Hec0eUy11o^+lT7sL-q6FJ$&H%LaOfzX;_BkxC86)7T)na z;*jqV&FKC=xZm%i0>5Jm()g9eue6Q08JqABvOA64X;1K(^X|FMyXWHt9CXe-aLzr9 zb1@IKPuD*EIG)5&9CQACiu3PNQG+?^Yfd$8Lw?WU_na$u4JUBY_Z<2%=*!rQRpv*2 zW%A4S>LBy=^%#!hGn_CV%2$?rW$`nMpIPk9VsCbo`7Z{OFa_l$TVAqUXYw=goBPJrVUgPrvij$2|2hkA3slmn%QH@{=p>x#FI?1*@?E8?hJr zoqONs+U`r?9OL* zKK*{L7UZACvq*0~y$hx~4(;st9%+(<2LNXGpO!L)ZG$sULwv*DzMUdcm9>~&-x*- zehBQR1f^Z}{lsahI4v#1a;(SQ_#^f?7ay@*5RJK*kJ^`MUnYKK;#W3-lg`VhIWM1q z2k{8@Vn5!+`_9iNJ3pU_b+`+SH|w9^&yCK@tIKlsm9wv$zH<7kX9DY)V7WS7u1>9I zf{NLgjmC9_yjI9-#b&I+R%}P{uMqzg^0PvIR>;o^`B}l=75rWC$~pWg&g0L={hsH^1M_~4c|X^D|Hyp*#5~Tv_t=+^WL{1&&ptKJJ~xl@H<`bw`^<+8=A{zz zQki+D*t}C}KACPlnSr&D6XHe<1=T9n0%2QW~>MB_s^{Jx^ z>gAGpxvU=OFQflYdGcN$&)M=kSKQgXg59gui{nPWbC?YL-;I7Z&}ECO+w~LMT+hUD zzc?Nc$Bp8+8BgO`@oW&!M)5o&p6757FNrI?Gw6NyvbbLHycCak@pxYx62##H`S?IS zlKGj;&(sa#x=CD<#5F}+Q^a*P>fi5UgE_|89OEog{xan+Tis- zReU}bpZRg(8ZVAD;#iC4@Vt1=6wgEymjZG5Y==13i(?>;VR1A*ON>wZmO;r&aa4Du z>TYSLIGz#5W#U*Nj_&)D`bbf zO`dmP5B6H$wOZe`%X_oDx8g&5Z2dND{Wc>1?ec#d)zRDPC~m?!Y*Ib2ZwC9`rT1NW zV^7 zKZDja^6-0kNQtqYnXaD7)zeBG#WCxUH0zKI^)+36G3FzA{YYNZXQ;24xC{57xTK5A zoFesBf?e2ceL#N({h0;oZxNosbLuc%9cE$&o=}f{>hXf-v^eL8^W06IzgyI2j{3|+ z@tr5WpYBkn_4vwja*BGLs$Qeym%j`6ThOaM`#rbVv5*~w@y30E=M;PY$ll_oo=4Bs zZK=9lre4)=$?N)64<+iMv`O6_Li$SSTPkl$M2Ze@al#Nw^j_ zsOu@}dMc`qW$L3sy9(`AuxAB(R`GikzgO+SedSc@`rBHJrO3Xm?At1zTjjG_eyioTx*m7i|J!W;ugZI@RPV9U{9Zx) zyTt$dD8Da=LHYh(zQ5ms)hKV@%iH%i@E3Y3=&iKx8nN#hjdL;2e$IgXoMGqC_d18Z z-#K4-{z;yHa{bfmYjONZ9DjO_FTMBN<-O+~@8LIi55EZ;@gSbSPL#JHc^l&Q5Wk0R z;T`YeyS9?yKy+Dlb>% z<*IyLm9L(0e%#~-dwSW^D?YvA^V3XrCt@BJ;8ASD9_)4QSf2ajxli8u{n2!zEh@E)GJ`y_y*)ceRqvG*UJRaLminE^- zkLj3+MOcF7!(sE`a1GXq6Muf@&(HMyOwW}9@mYjbScChp0o$+x&tng={|fuZ#C=TM z$FAWG@zU<9c2}FR70+T94&o*J1#jbhd}yC8Y@aTIDL5N5FdNt4daT7dWao8uURMX# z)xmXfx-L%R>>X$CcquMJ^*OFS$F&>RZoD0jBRj|0Ier0!;U`w_VM>0Y4VnVt=Nv*|3mx!X!(kj zCvh4Sr$PM<>2FA$hU94|9Wzm$hU96e99P=EWA_VozYy;i;{9^EeY_c%fJx~7m+pVL z8LLpfUfRd2vCmag5()j!Y?4kgNe;;+`J^xsYOE!7WEa^(_K^nC7zuqDA<-n3#F2QC zK#~Z3U#1Yczohd^I=`g9=}9E?RhVe|m9}4L`<1p$&&ULsbnX94I;^k5`Z}zy!}>aW zFcSKDgbYMNf1~T`adM7m_q8@(Yuk)}izkJyM_sp(UjIH%ddTa4_mg2VMsAW@k(&d&oZ0KpM$Ga)cZu9pnV*BxlGua-Q^%elkFY$p{%GV`QA%B)7;Na*sS9 zkH{19j7*4IK*A(KqDd@?BMBslq>$Mpon(?6k{=1R(BDFT3;iwhx6t20e=8j=`ft%s zi+)=4)1sf2NuTMfRbQ?8YTZTlkbR_qG)6+Fv^}NIQ~Erm&r|w5rO#8bgiWX7NkSy_ z-FebU&X9A2uJ7pju8z?49bMlYB^~4-X(Rgi?g%+SddWDsN&3k!86{81J@SA&A|vD$ z86aci4(TD!BB8Em5>GNo3YksPNkC#r5($$Ci6aTxO_0e*=%V{Cy8oj4FKU00o{K)e zsLdd|2K6)efUs|nJwt`aj-h?TXG7W!X*ZNZa!Ed+Yp9CUk~*@B>>)Mut|yJ8htP9z mG7`GPhD+tdy_Zgq5%M4s`d5U|^{+BQ*S|W*0Aa^Sdacs=detectorDacs+imod*N_DAC; - (detectorModules+imod)->adcs=detectorAdcs+imod*N_ADC; - if(myDetectorType != JUNGFRAU){ - (detectorModules+imod)->chipregs=detectorChips+imod*N_CHIP; - (detectorModules+imod)->chanregs=detectorChans+imod*N_CHIP*N_CHAN; - } - (detectorModules+imod)->ndac=N_DAC; - (detectorModules+imod)->nadc=N_ADC; - (detectorModules+imod)->nchip=N_CHIP; - (detectorModules+imod)->nchan=N_CHIP*N_CHAN; + (detectorModules+imod)->dacs=detectorDacs+imod*NDAC; + (detectorModules+imod)->adcs=detectorAdcs+imod*NADC; + (detectorModules+imod)->ndac=NDAC; + (detectorModules+imod)->nadc=NADC; + (detectorModules+imod)->nchip=NCHIP; + (detectorModules+imod)->nchan=NCHIP*NCHAN; (detectorModules+imod)->module=imod; (detectorModules+imod)->gain=0; (detectorModules+imod)->offset=0; (detectorModules+imod)->reg=0; - /* initialize registers, dacs, retrieve sn, adc values etc */ } thisSettings=UNINITIALIZED; sChan=noneSelected; @@ -122,24 +75,6 @@ int initDetector() { sMod=noneSelected; sDac=noneSelected; sAdc=noneSelected; - - /* - setCSregister(ALLMOD); //commented out by dhanya - setSSregister(ALLMOD); - counterClear(ALLMOD); - clearSSregister(ALLMOD); - putout("0000000000000000",ALLMOD); - */ - - /* initialize dynamic range etc. */ - /* dynamicRange=getDynamicRange(); //always 16 not required commented out - nModX=setNMod(-1);*/ - - // dynamicRange=32; - // initChip(0, 0,ALLMOD); - //nModX=n; - // - allocateRAM(); return OK; } @@ -178,7 +113,7 @@ int copyChip(sls_detector_chip *destChip, sls_detector_chip *srcChip) { int copyModule(sls_detector_module *destMod, sls_detector_module *srcMod) { - int ichip, idac, ichan, iadc; + int idac, iadc; int ret=OK; @@ -240,17 +175,7 @@ int copyModule(sls_detector_module *destMod, sls_detector_module *srcMod) { destMod->offset=srcMod->offset; // printf("copying gain and offset %f %f to %f %f\n",srcMod->gain,srcMod->offset,destMod->gain,destMod->offset); - - if(myDetectorType != JUNGFRAU){ - for (ichip=0; ichip<(srcMod->nchip); ichip++) { - if (*((srcMod->chipregs)+ichip)>=0) - *((destMod->chipregs)+ichip)=*((srcMod->chipregs)+ichip); - } - for (ichan=0; ichan<(srcMod->nchan); ichan++) { - if (*((srcMod->chanregs)+ichan)>=0) - *((destMod->chanregs)+ichan)=*((srcMod->chanregs)+ichan); - } - } + for (idac=0; idac<(srcMod->ndac); idac++) { if (*((srcMod->dacs)+idac)>=0) @@ -267,52 +192,6 @@ int copyModule(sls_detector_module *destMod, sls_detector_module *srcMod) { -/* Register commands */ - - -/* int clearDACSregister(int imod) { */ - -/* putout("1111111111111111",imod);//reset */ -/* putout("1111111111111110",imod);//cs down */ - -/* /\* commented out by dhanya */ -/* putout("0000000001000000",imod); */ -/* putout("0000000101000000",imod); */ -/* putout("0000000101000000",imod); */ -/* putout("0000000001000000",imod); */ -/* *\/ */ -/* #ifdef DEBUG */ -/* fprintf(stdout, "Clearing DAC shiftregister\n"); */ -/* #endif */ -/* // sDac=0; */ -/* sMod=imod; */ -/* if (imod==ALLMOD) */ -/* sMod=allSelected; */ -/* return OK; */ -/* } */ - -/* int nextDAC(int imod) { */ - -/* putout("1111111111111011",imod);//cs up */ -/* putout("1111111111111001",imod);//clk down */ -/* putout("1111111111111111",imod);//reset */ - -/* /\*commented out by dhanya */ -/* putout("0000000001000000",imod); */ -/* putout("0000000001001000",imod); */ -/* putout("0000000001000000",imod); */ -/* *\/ */ -/* #ifdef DEBUG */ -/* fprintf(stdout, "Next DAC\n"); */ -/* #endif */ -/* // sDac++; */ -/* sMod=imod; */ -/* if (imod==ALLMOD) */ -/* sMod=allSelected; */ -/* return OK; */ -/* } */ - - int clearCSregister(int imod) { putout("0000000001000000",imod); @@ -461,322 +340,6 @@ int selChip(const int chip,int imod) { return 0; } -/* DACs routines */ - -/* int program_one_dac(int addr, int value, int imod) { */ - -/* #ifdef VERBOSE */ -/* printf("programming dac %d value %d module %d\n",addr, value,imod); */ -/* #endif */ - - -/* int i,im,idac,bit, control; */ -/* int v=value; */ - -/* // codata=((((0x2)<<4)+((addr)&0xf))<<16)+((value<<4)&0xfff0); */ -/* control=32+addr; */ -/* value=(value<<4) | (control<< 16); */ - -/* #ifdef DEBUGOUT */ -/* fprintf(stdout,"value=%d\n",value); */ -/* #endif */ - -/* for (i=0;i<24;i++) { */ -/* bit=value & (1<<(23-i)); */ -/* if (bit) { */ -/* putout("1111111111111100",imod);//clk down */ -/* putout("1111111111111100",imod);//write data */ -/* putout("1111111111111110",imod);//clk up */ -/* #ifdef DEBUGOUT */ -/* fprintf(stdout,"1"); */ -/* #endif */ -/* } */ -/* else */ -/* { */ -/* putout("1111111111111000",imod);//clk down */ -/* putout("1111111111111000",imod);//write data */ -/* putout("1111111111111010",imod);//clk up */ -/* #ifdef DEBUGOUT */ -/* fprintf(stdout,"0"); */ -/* #endif */ -/* } */ -/* } */ - -/* #ifdef DEBUGOUT */ -/* fprintf(stdout,"\n"); */ -/* #endif */ - -/* idac=addr;//sDac*2+addr; */ - - -/* if (detectorDacs) { */ -/* sMod=imod; */ -/* if (imod==ALLMOD) */ -/* sMod=allSelected; */ - -/* if (imod>=0 && imod=0) */ -/* initDAC(ind,val, imod); */ - -/* if (imod>=0 && imodgain,(detectorModules+imod)->offset); */ -/* #endif */ -/* if ((detectorModules+imod)->gain>0) */ -/* myg=(detectorModules+imod)->gain; */ -/* else { */ -/* if (thisSettings>=0 && thisSettings<3) */ -/* myg=g[thisSettings]; */ -/* // else */ -/* //myg=-1; */ -/* } */ - -/* if ((detectorModules+imod)->offset>0) */ -/* myo=(detectorModules+imod)->offset; */ -/* else { */ -/* if (thisSettings>=0 && thisSettings<3) */ -/* myo=o[thisSettings]; */ -/* // else */ -/* //myo=-1; */ -/* } */ - -/* if (myg>0 && myo>0) { */ -/* //ethr=(myo-detectorDacs[VTHRESH+imod*N_DAC])*1000/myg; */ - -/* ethr=(myo-setDACRegister(VDAC0,-1,imod))*1000/myg;//edited by dhanya */ -/* // else */ -/* // ethr=-1; */ - -/* } */ -/* #ifdef VERBOSE */ -/* //printf("module=%d gain=%f, offset=%f, dacu=%f\n",imod, myg, myo, detectorDacs[VTHRESH+imod*N_DAC]); */ -/* printf("module=%d gain=%f, offset=%f, dacu=%d\n",imod, myg, myo,(int)(setDACRegister(VDAC0,-1,imod)));//edited by dhanya */ -/* printf("Threshold energy of module %d is %d eV\n", imod, ethr); */ -/* #endif */ - -/* if (imod==0) */ -/* ret=ethr; */ -/* else { */ -/* if (ethr>(ret+100) || ethr<(ret-100)) */ -/* return FAIL; */ -/* } */ -/* } */ -/* } */ -/* return ret; */ -/* } */ - -/* int setThresholdEnergy(int ethr) { */ -/* double g[3]=DEFAULTGAIN; */ -/* double o[3]=DEFAULTOFFSET; */ -/* double myg=-1, myo=-1; */ -/* int dacu; */ -/* int imod; */ -/* int ret=ethr; */ - -/* setSettings(GET_SETTINGS,-1);//-1 added by dhanya */ -/* if (thisSettings>=0 || thisSettings<3){ */ -/* myg=g[thisSettings]; */ -/* myo=o[thisSettings]; */ -/* } */ -/* for (imod=0; imodgain>0) */ -/* myg=(detectorModules+imod)->gain; */ -/* else */ -/* if (thisSettings>=0 && thisSettings<3) */ -/* myg=g[thisSettings]; */ -/* else */ -/* myg=-1; */ -/* if ((detectorModules+imod)->offset>0) */ -/* myo=(detectorModules+imod)->offset; */ -/* else */ -/* if (thisSettings>=0 && thisSettings<3) */ -/* myo=o[thisSettings]; */ -/* else */ -/* myo=-1; */ -/* } else { */ -/* if (thisSettings>=0 && thisSettings<3) */ -/* myo=o[thisSettings]; */ -/* else */ -/* myo=-1; */ -/* if (thisSettings>=0 && thisSettings<3) */ -/* myg=g[thisSettings]; */ -/* else */ -/* myg=-1; */ -/* } */ -/* if (myg>0 && myo>0) { */ -/* dacu=myo-myg*((double)ethr)/1000.; */ -/* #ifdef VERBOSE */ -/* printf("module %d (%x): gain %f, off %f, energy %d eV, dac %d\n",imod,(unsigned int)((detectorModules+imod)),(detectorModules+imod)->gain,(detectorModules+imod)->offset, ethr,dacu); */ -/* #endif */ -/* } else { */ -/* dacu=ethr; */ -/* #ifdef VERBOSE */ -/* printf("could not set threshold energy for module %d, settings %d (offset is %f; gain is %f)\n",imod,thisSettings,myo,myg); */ -/* #endif */ -/* } */ -/* initDACbyIndexDACU(VDAC0, dacu, imod); ///needs to be fixed dhanya */ -/* } */ -/* return ret; */ -/* } */ - - - -/* int getDACbyIndexDACU(int ind, int imod) { */ -/* /\* */ -/* if (detectorDacs) { */ -/* if (imodndac) */ -/* return (detectorDacs[ind+imod*N_DAC]); */ -/* } */ -/* return FAIL; */ -/* *\/ */ -/* return setDACRegister(ind, -1, imod); */ -/* } */ - - -/* int initDAC(int dac_addr, int value, int imod) { */ -/* // int i; */ -/* #ifdef VERBOSE */ -/* printf("Programming dac %d with value %d\n", dac_addr, value); */ -/* #endif */ -/* clearDACSregister(imod); */ -/* program_one_dac(dac_addr,value,imod); */ -/* nextDAC(imod); */ -/* clearDACSregister(imod); */ - -/* return 0; */ -/* } */ int getTemperatureByModule(int tempSensor, int imod) { @@ -846,42 +409,12 @@ void showbits(int h) } -/* int initDACs(int* v,int imod) */ -/* { */ -/* #ifdef VERBOSE */ -/* printf("\n..inside initdacs\n"); */ -/* #endif */ -/* int iaddr; */ -/* // sDac=0; */ - -/* for (iaddr=0; iaddr<8; iaddr++) { */ -/* clearDACSregister(imod); */ -/* if (v[iaddr]>=0) { */ -/* #ifdef VERBOSE */ -/* fprintf(stdout, "voltage %d\n", *(v+iaddr)); */ -/* #endif */ -/* program_one_dac(iaddr, *(v+iaddr),imod); */ -/* } */ -/* nextDAC(imod); */ -/* } */ - - -/* clearDACSregister(imod); */ - -/* return 0; */ - -/* } */ - - - int setSettings(int i, int imod) { -#ifdef VERBOSE - if(i==-1) - printf("\nReading settings of detector...\n"); - else - printf("\ninside set settings wit settings=%d...\n",i); -#endif +//#ifdef VERBOSE + if(i!=-1) + printf("\nSetting settings wit value %d\n",i); +//#endif int isett=-1,val=-1,retval=-1; enum conf_gain { dynamic = 0x0f00, //dynamic @@ -978,7 +511,7 @@ int getChannelbyNumber(sls_detector_channel* myChan) { if (detectorChans) { if (imod=0) { if (ichip<(detectorModules+imod)->nchip && ichan<(detectorModules+imod)->nchan/(detectorModules+imod)->nchip) - myChan->reg=detectorChans[imod*N_CHAN*N_CHIP+ichip*N_CHAN+ichan]; + myChan->reg=detectorChans[imod*NCHAN*NCHIP+ichip*NCHAN+ichan]; return OK; } } @@ -990,7 +523,7 @@ int getTrimbit(int imod, int ichip, int ichan) { if (detectorChans) { if (imod=0) if (ichip<(detectorModules+imod)->nchip && ichan<(detectorModules+imod)->nchan/(detectorModules+imod)->nchip) - return (detectorChans[imod*N_CHAN*N_CHIP+ichip*N_CHAN+ichan] & TRIM_DR); + return (detectorChans[imod*NCHAN*NCHIP+ichip*NCHAN+ichan] & TRIM_DR); } return -1; @@ -1014,8 +547,8 @@ int initChannel(int ft,int cae, int ae, int coe, int ocoe, int counts, int imod) if (sChan==allSelected) { // printf("initializing all channels ft=%d coe=%d\n",ft,coe); chanmi=0; - chanma=N_CHAN; - } else if (sChan==noneSelected || sChan>N_CHAN || sChan<0) { + chanma=NCHAN; + } else if (sChan==noneSelected || sChan>NCHAN || sChan<0) { // printf("initializing no channels ft=%d coe=%d\n",ft,coe); chanmi=0; chanma=-1; @@ -1028,8 +561,8 @@ int initChannel(int ft,int cae, int ae, int coe, int ocoe, int counts, int imod) if (sChip==allSelected) { // printf("initializing all chips\n"); chipmi=0; - chipma=N_CHIP; - } else if (sChip==noneSelected || sChip>N_CHIP || sChip<0) { + chipma=NCHIP; + } else if (sChip==noneSelected || sChip>NCHIP || sChip<0) { // printf("initializing no chips\n"); chipmi=0; chipma=-1; @@ -1057,12 +590,12 @@ int initChannel(int ft,int cae, int ae, int coe, int ocoe, int counts, int imod) for (ichip=chipmi; ichipnchip) { - myChip->reg=detectorChips[ichip+imod*N_CHIP]; - myChip->nchan=N_CHAN; - myChip->chanregs=detectorChans+imod*N_CHAN*N_CHIP+ichip*N_CHIP; + myChip->reg=detectorChips[ichip+imod*NCHIP]; + myChip->nchan=NCHAN; + myChip->chanregs=detectorChans+imod*NCHAN*NCHIP+ichip*NCHIP; return OK; } } @@ -1278,28 +811,7 @@ int initChip(int obe, int ow,int imod){ int i; int im, ichip; int chipmi, chipma, modmi, modma; - /* switch (ow) { - case 0:; - case 1: - setDynamicRange(32); - break; - case 2: - setDynamicRange(16); - break; - case 3: - setDynamicRange(8); - break; - case 4: - setDynamicRange(4); - break; - case 5: - setDynamicRange(1); - break; - default: - setDynamicRange(32); - break; - } - */ + #ifdef DEBUGOUT printf("Initializing chip\n"); @@ -1370,8 +882,8 @@ int initChip(int obe, int ow,int imod){ if (sChip==allSelected) { chipmi=0; - chipma=N_CHIP; - } else if (sChip==noneSelected || sChip>N_CHIP || sChip<0) { + chipma=NCHIP; + } else if (sChip==noneSelected || sChip>NCHIP || sChip<0) { chipmi=0; chipma=-1; } else { @@ -1395,9 +907,9 @@ int initChip(int obe, int ow,int imod){ for (im=modmi; imN_CHIP || sChip<0) { + chipma=NCHIP; + } else if (sChip==noneSelected || sChip>NCHIP || sChip<0) { chipmi=0; chipma=-1; } else { @@ -1495,9 +1007,9 @@ int initChipWithProbes(int obe, int ow,int nprobes, int imod){ for (im=modmi; im0 && i%2==0) { printf("Shift stsel: module %d chip %i bit %d read %d instead of %d \n",k,j,i,val & 1<< j, i%2); result++; @@ -1978,7 +1457,7 @@ int testShiftStSel(int imod) { int testDataInOut(int num, int imod) { - int val[N_CHIP*nModX], result=OK; + int val[NCHIP*nModX], result=OK; int ich, ichip; setCSregister(ALLMOD); printf("Testing data in out for module %d pattern 0x%x\n", imod, num); @@ -1988,14 +1467,14 @@ int testDataInOut(int num, int imod) { setCSregister(ALLMOD); initChip(0, 0,ALLMOD); clearSSregister(ALLMOD); - for (ich=0; ich=0){ */ - -/* //clear rois */ -/* for(i=0;i=0) && (adc<=4)); */ -/* else { */ -/* printf("warning:adc value greater than 5. deleting roi\n"); */ -/* adc=-1; */ -/* } */ -/* } */ -/* } */ - - -/* //set rois for just 1 adc - take only 1st roi */ -/* if(adc!=-1){ */ -/* rois[0].xmin=adc*(GOTTHARDNCHAN*NCHIPS_PER_ADC); */ -/* rois[0].xmax=(adc+1)*(GOTTHARDNCHAN*NCHIPS_PER_ADC)-1; */ -/* rois[0].ymin=-1; */ -/* rois[0].ymax=-1; */ -/* nROI = 1; */ -/* }else */ -/* nROI = 0; */ - -/* if((arg[0].xmin!=rois[0].xmin)||(arg[0].xmax!=rois[0].xmax)||(arg[0].ymin!=rois[0].ymin)||(arg[0].ymax!=rois[0].ymax)) */ -/* *ret=FAIL; */ -/* if(n!=nROI) */ -/* *ret=FAIL; */ - -/* //set adc of interest */ -/* setADC(adc); */ -/* } */ - -/* //#ifdef VERBOSE */ -/* printf("Rois:\n"); */ -/* for( i=0;i>DETECTOR_TYPE_OFFSET) != JUNGFRAU_MODULE_ID){ + cprintf(BG_RED,"This is not a Jungfrau Server (enum:%d)\n",myDetectorType); + exit(-1); + } + cprintf(BLUE,"\n\n********************************************************\n" + "*********************Jungfrau Server********************\n" + "********************************************************\n"); + + //print version + cprintf(BLUE,"\n" + "Firmware Version:\t 0x%x\n" + "Software Version:\t %llx\n" + //"F/w-S/w API Version:\t\t %lld\n" + //"Required Firmware Version:\t %d\n" + "Fixed Pattern:\t\t 0x%x\n" + "Board Revision:\t\t 0x%x\n" + "\n********************************************************\n", + bus_r(FPGA_VERSION_REG),(long long unsigned int)(((int64_t)SVNREV <<32) | (int64_t)SVNDATE) + //,sw_fw_apiversion, REQUIRED_FIRMWARE_VERSION + ,bus_r(FIX_PATT_REG),(bus_r(PCB_REV_REG)&BOARD_REVISION_MASK) + ); -int init_detector(int b, int checkType) { - - int i; - if (mapCSP0()==FAIL) { printf("Could not map memory\n"); - exit(1); - } - - //print version - printf("v: 0x%x\n",bus_r(FPGA_VERSION_REG)); - printf("fp: 0x%x\n",bus_r(FIX_PATT_REG)); - - //checktype - if (checkType) { - printf("Bus test... (checktype is %d; b is %d)",checkType,b ); - for (i=0; i<1000000; i++) { - bus_w(SET_DELAY_LSB_REG, i*100); - bus_r(FPGA_VERSION_REG); - if (i*100!=bus_r(SET_DELAY_LSB_REG)) - printf("ERROR: wrote 0x%x, read 0x%x\n",i*100,bus_r(SET_DELAY_LSB_REG)); - } - printf("Finished\n"); - }else - printf("(checktype is %d; b is %d)",checkType,b ); - - - //confirm the detector type - switch ((bus_r(PCB_REV_REG) & DETECTOR_TYPE_MASK)>>DETECTOR_TYPE_OFFSET) { - case MOENCH03_MODULE_ID: - myDetectorType=MOENCH; - printf("This is a MOENCH03 module %d\n",MOENCH); - break; - - case JUNGFRAU_MODULE_ID: - myDetectorType=JUNGFRAU; - printf("This is a Jungfrau module %d\n", JUNGFRAU); - break; - - case JUNGFRAU_CTB_ID: - myDetectorType=JUNGFRAUCTB; - printf("This is a Jungfrau CTB %d\n", JUNGFRAUCTB); - break; - - default: - myDetectorType=GENERIC; - printf("Unknown detector type %02x\n",(bus_r(PCB_REV_REG) & DETECTOR_TYPE_MASK)>>DETECTOR_TYPE_OFFSET); - break; - - } - printf("Detector type is %d\n", myDetectorType); - - - //control server only-- - if (b) { - resetPLL(); - bus_w16(CONTROL_REG, SYNC_RESET); - bus_w16(CONTROL_REG, 0); - bus_w16(CONTROL_REG, GB10_RESET_BIT); - bus_w16(CONTROL_REG, 0); + printf("Resetting PLL\n"); + resetPLL(); + bus_w16(CONTROL_REG, SYNC_RESET); + bus_w16(CONTROL_REG, 0); + bus_w16(CONTROL_REG, GB10_RESET_BIT); + bus_w16(CONTROL_REG, 0); #ifdef MCB_FUNCS - printf("\nBoard Revision:0x%x\n",(bus_r(PCB_REV_REG)&BOARD_REVISION_MASK)); - if(myDetectorType == JUNGFRAU) - initDetector(); /*allocating detectorModules, detectorsDacs etc for "settings", also does allocate RAM*/ - dataBytes=NMAXMOD*N_CHIP*N_CHAN*2; /**Nchip and Nchan real values get assigned in initDetector()*/ - printf("Initializing Detector\n"); - //bus_w16(CONTROL_REG, SYNC_RESET); // reset registers + initDetector(); #endif + printf("Initializing Detector\n"); + /*some registers set, which is in common with jungfrau, please check */ + prepareADC(); + /*some registers set, which is in common with jungfrau, please check */ + initDac(0); initDac(8); //initializes the two dacs - // testFpga(); - // testRAM(); - // printf("ADC_SYNC_REG:%x\n",bus_r(ADC_SYNC_REG)); - //moench specific - // setPhaseShiftOnce(); - /*some registers set, which is in common with jungfrau, please check */ - prepareADC(); - //setADC(-1); //already does setdaqreg and clean fifo - // setSettings(GET_SETTINGS,-1); - /*some registers set, which is in common with jungfrau, please check */ - initDac(0); initDac(8); //initializes the two dacs - if(myDetectorType==JUNGFRAU){ - //reinitialize macro - N_CHAN=JUNGFRAU_NCHAN; - N_CHIP=JUNGFRAU_NCHIP; - N_DAC=JUNGFRAU_NDAC; - N_ADC=JUNGFRAU_NADC; - N_CHANS=JUNGFRAU_NCHANS; - - //set dacs - enum dacNames{VB_COMP,VDD_PROT,VIN_COM,VREF_PRECH,VB_PIXBUF,VB_DS,VREF_DS,VREF_COMP}; - int retval = -1; - int dacvalues[14][2]={ + //set dacs + printf("Setting Default Dac values\n"); + enum dacNames{VB_COMP,VDD_PROT,VIN_COM,VREF_PRECH,VB_PIXBUF,VB_DS,VREF_DS,VREF_COMP}; + int retval = -1; + int dacvalues[14][2]={ {VB_DS, 1000}, - {VB_COMP, 1220}, + {VB_COMP, 1220}, {VB_PIXBUF, 750}, {VREF_DS, 480}, {VREF_COMP, 400}, {VREF_PRECH,1550}, {VIN_COM, 1053}, {VDD_PROT, 3000}, - }; - for(i=0;i<8;++i){ - retval=setDac(dacvalues[i][0], dacvalues[i][1]); - if(retval!=dacvalues[i][1]) - printf("Error: Setting dac %d failed, wrote %d, read %d\n",dacvalues[i][0],dacvalues[i][1],retval); - } + }; + for(i=0;i<8;++i){ + retval=setDac(dacvalues[i][0], dacvalues[i][1]); + if(retval!=dacvalues[i][1]) + printf("Error: Setting dac %d failed, wrote %d, read %d\n",dacvalues[i][0],dacvalues[i][1],retval); + } - //power of the chips - bus_w(POWER_ON_REG,0x1); + printf("\nPowering on the chip\n"); + bus_w(POWER_ON_REG,0x1); + printf("\nResetting ADC\n"); + writeADC(ADCREG1,0x3); writeADC(ADCREG1,0x0); + writeADC(ADCREG2,0x40); + writeADC(ADCREG3,0xf); + writeADC(ADCREG4,0x3f); + printf("\nConfiguring Vrefs\n"); + writeADC(ADCREG_VREFS,0x2); + printf("\nSetting ADC Inversion\n");// (by trial and error) + bus_w(ADC_INVERSION_REG,0x453b2a9c); - //reset adc - writeADC(ADCREG1,0x3); writeADC(ADCREG1,0x0); - writeADC(ADCREG2,0x40); - writeADC(ADCREG3,0xf); - writeADC(ADCREG4,0x3f); - //vrefs - configurable? - writeADC(ADCREG_VREFS,0x2); - //set ADCINVERSionreg (by trial and error) - bus_w(ADC_INVERSION_REG,0x453b2a9c); + adcPipeline(HALFSPEED_ADC_PIPELINE); + dbitPipeline(HALFSPEED_DBIT_PIPELINE); + adcPhase(HALFSPEED_ADC_PHASE); //set adc_clock_phase in unit of 1/(52) clock period (by trial and error) - adcPipeline(JUNGFRAU_HALFSPEED_ADC_PIPELINE); - dbitPipeline(JUNGFRAU_HALFSPEED_DBIT_PIPELINE); - adcPhase(JUNGFRAU_HALFSPEED_ADC_PHASE); //set adc_clock_phase in unit of 1/(52) clock period (by trial and error) - - //reset mem machine fifos fifos - bus_w(MEM_MACHINE_FIFOS_REG,0x4000); - bus_w(MEM_MACHINE_FIFOS_REG,0x0); - //reset run control - bus_w(MEM_MACHINE_FIFOS_REG,0x0400); - bus_w(MEM_MACHINE_FIFOS_REG,0x0); - - //set default setting - initSpeedConfGain(JUNGFRAU_HALFSPEED_CONF); - setSettings(DYNAMICGAIN,-1); - } + printf("\nReset mem machine fifos\n"); + bus_w(MEM_MACHINE_FIFOS_REG,0x4000); + bus_w(MEM_MACHINE_FIFOS_REG,0x0); + printf("\nReset run control\n"); + bus_w(MEM_MACHINE_FIFOS_REG,0x0400); + bus_w(MEM_MACHINE_FIFOS_REG,0x0); + initSpeedConfGain(HALFSPEED_CONF); + setSettings(DYNAMICGAIN,-1); - //Initialization of acquistion parameters - setFrames(1*1000*1000); - setTrains(-1); - setExposureTime(10*1000); - setPeriod(2*1000*1000); - setDelay(0); - setGates(0); - setTiming(GET_EXTERNAL_COMMUNICATION_MODE); - setMaster(GET_MASTER); - setSynchronization(GET_SYNCHRONIZATION_MODE); - startReceiver(0); //firmware - }//end of control server only-- - else printf("\n\n"); + //Initialization of acquistion parameters + setFrames(1*1000*1000); + setTrains(-1); + setExposureTime(10*1000); + setPeriod(2*1000*1000); + setDelay(0); + setGates(0); + + setTiming(GET_EXTERNAL_COMMUNICATION_MODE); + setMaster(GET_MASTER); + setSynchronization(GET_SYNCHRONIZATION_MODE); + } + //------ end of control server ------ - //common for both control and stop server - strcpy(mess,"dummy message"); - strcpy(lastClientIP,"none"); - strcpy(thisClientIP,"none1"); - lockStatus=0; - // getDynamicRange(); + //common for both control and stop server + strcpy(mess,"dummy message"); + strcpy(lastClientIP,"none"); + strcpy(thisClientIP,"none1"); + lockStatus=0; - /* both these functions setROI and allocateRAM should go into the control server part. */ - if(myDetectorType!=JUNGFRAU){ - int retvalsize,ret; - setROI(-1,NULL,&retvalsize,&ret); - allocateRAM(); - } - return OK; + + return OK; } int decode_function(int file_des) { - int fnum,n; - int retval=FAIL; + int fnum,n; + int retval=FAIL; #ifdef VERBOSE - printf( "receive data\n"); + printf( "receive data\n"); #endif - n = receiveDataOnly(file_des,&fnum,sizeof(fnum)); - if (n <= 0) { + n = receiveDataOnly(file_des,&fnum,sizeof(fnum)); + if (n <= 0) { #ifdef VERBOSE - printf("ERROR reading from socket %d, %d %d\n", n, fnum, file_des); + printf("ERROR reading from socket %d, %d %d\n", n, fnum, file_des); #endif - return FAIL; - } + return FAIL; + } #ifdef VERBOSE - else - printf("size of data received %d\n",n); + else + printf("size of data received %d\n",n); #endif #ifdef VERBOSE - printf( "calling function fnum = %d %x %x %x\n",fnum,(unsigned int)(flist[fnum]), (unsigned int)(flist[F_READ_REGISTER]),(unsigned int)(&read_register)); + printf( "calling function fnum = %d %x %x %x\n",fnum,(unsigned int)(flist[fnum]), (unsigned int)(flist[F_READ_REGISTER]),(unsigned int)(&read_register)); #endif - if (fnum<0 || fnum>255) - fnum=255; - retval=(*flist[fnum])(file_des); - if (retval==FAIL) - printf( "Error executing the function = %d \n",fnum); - return retval; + if (fnum<0 || fnum>255) + fnum=255; + retval=(*flist[fnum])(file_des); + if (retval==FAIL) + printf( "Error executing the function = %d \n",fnum); + return retval; } int function_table() { - int i; - for (i=0;i<256;i++){ - flist[i]=&M_nofunc; - } - flist[F_EXIT_SERVER]=&exit_server; - flist[F_EXEC_COMMAND]=&exec_command; - flist[F_GET_DETECTOR_TYPE]=&get_detector_type; - flist[F_SET_NUMBER_OF_MODULES]=&set_number_of_modules; - flist[F_GET_MAX_NUMBER_OF_MODULES]=&get_max_number_of_modules; - flist[F_SET_EXTERNAL_SIGNAL_FLAG]=&set_external_signal_flag; - flist[F_SET_EXTERNAL_COMMUNICATION_MODE]=&set_external_communication_mode; - flist[F_GET_ID]=&get_id; - flist[F_DIGITAL_TEST]=&digital_test; - flist[F_WRITE_REGISTER]=&write_register; - flist[F_READ_REGISTER]=&read_register; - flist[F_SET_DAC]=&set_dac; - flist[F_GET_ADC]=&get_adc; - flist[F_SET_CHANNEL]=&set_channel; - flist[F_SET_CHIP]=&set_chip; - flist[F_SET_MODULE]=&set_module; - flist[F_GET_CHANNEL]=&get_channel; - flist[F_GET_CHIP]=&get_chip; - flist[F_GET_MODULE]=&get_module; - flist[F_GET_THRESHOLD_ENERGY]=&get_threshold_energy; - flist[F_SET_THRESHOLD_ENERGY]=&set_threshold_energy; - flist[F_SET_SETTINGS]=&set_settings; - flist[F_START_ACQUISITION]=&start_acquisition; - flist[F_STOP_ACQUISITION]=&stop_acquisition; - flist[F_START_READOUT]=&start_readout; - flist[F_GET_RUN_STATUS]=&get_run_status; - flist[F_READ_FRAME]=&read_frame; - flist[F_READ_ALL]=&read_all; - flist[F_START_AND_READ_ALL]=&start_and_read_all; - flist[F_SET_TIMER]=&set_timer; - flist[F_GET_TIME_LEFT]=&get_time_left; - flist[F_SET_DYNAMIC_RANGE]=&set_dynamic_range; - flist[F_SET_ROI]=&set_roi; - flist[F_SET_SPEED]=&set_speed; - flist[F_SET_READOUT_FLAGS]=&set_readout_flags; - flist[F_EXECUTE_TRIMMING]=&execute_trimming; - flist[F_LOCK_SERVER]=&lock_server; - flist[F_SET_PORT]=&set_port; - flist[F_GET_LAST_CLIENT_IP]=&get_last_client_ip; - flist[F_UPDATE_CLIENT]=&update_client; - flist[F_CONFIGURE_MAC]=&configure_mac; - flist[F_LOAD_IMAGE]=&load_image; - flist[F_SET_MASTER]=&set_master; - flist[F_SET_SYNCHRONIZATION_MODE]=&set_synchronization; - flist[F_READ_COUNTER_BLOCK]=&read_counter_block; - flist[F_RESET_COUNTER_BLOCK]=&reset_counter_block; - flist[F_START_RECEIVER]=&start_receiver; - flist[F_STOP_RECEIVER]=&stop_receiver; - flist[F_CALIBRATE_PEDESTAL]=&calibrate_pedestal; - flist[F_SET_CTB_PATTERN]=&set_ctb_pattern; - flist[F_WRITE_ADC_REG]=&write_adc_register; - flist[F_PROGRAM_FPGA]=&program_fpga; - return OK; + int i; + for (i=0;i<256;i++){ + flist[i]=&M_nofunc; + } + flist[F_EXIT_SERVER]=&exit_server; + flist[F_EXEC_COMMAND]=&exec_command; + flist[F_GET_DETECTOR_TYPE]=&get_detector_type; + flist[F_SET_NUMBER_OF_MODULES]=&set_number_of_modules; + flist[F_GET_MAX_NUMBER_OF_MODULES]=&get_max_number_of_modules; + flist[F_SET_EXTERNAL_SIGNAL_FLAG]=&set_external_signal_flag; + flist[F_SET_EXTERNAL_COMMUNICATION_MODE]=&set_external_communication_mode; + flist[F_GET_ID]=&get_id; + flist[F_DIGITAL_TEST]=&digital_test; + flist[F_WRITE_REGISTER]=&write_register; + flist[F_READ_REGISTER]=&read_register; + flist[F_SET_DAC]=&set_dac; + flist[F_GET_ADC]=&get_adc; + flist[F_SET_CHANNEL]=&set_channel; + flist[F_SET_CHIP]=&set_chip; + flist[F_SET_MODULE]=&set_module; + flist[F_GET_CHANNEL]=&get_channel; + flist[F_GET_CHIP]=&get_chip; + flist[F_GET_MODULE]=&get_module; + flist[F_GET_THRESHOLD_ENERGY]=&get_threshold_energy; + flist[F_SET_THRESHOLD_ENERGY]=&set_threshold_energy; + flist[F_SET_SETTINGS]=&set_settings; + flist[F_START_ACQUISITION]=&start_acquisition; + flist[F_STOP_ACQUISITION]=&stop_acquisition; + flist[F_START_READOUT]=&start_readout; + flist[F_GET_RUN_STATUS]=&get_run_status; + flist[F_READ_FRAME]=&read_frame; + flist[F_READ_ALL]=&read_all; + flist[F_START_AND_READ_ALL]=&start_and_read_all; + flist[F_SET_TIMER]=&set_timer; + flist[F_GET_TIME_LEFT]=&get_time_left; + flist[F_SET_DYNAMIC_RANGE]=&set_dynamic_range; + flist[F_SET_ROI]=&set_roi; + flist[F_SET_SPEED]=&set_speed; + flist[F_SET_READOUT_FLAGS]=&set_readout_flags; + flist[F_EXECUTE_TRIMMING]=&execute_trimming; + flist[F_LOCK_SERVER]=&lock_server; + flist[F_SET_PORT]=&set_port; + flist[F_GET_LAST_CLIENT_IP]=&get_last_client_ip; + flist[F_UPDATE_CLIENT]=&update_client; + flist[F_CONFIGURE_MAC]=&configure_mac; + flist[F_LOAD_IMAGE]=&load_image; + flist[F_SET_MASTER]=&set_master; + flist[F_SET_SYNCHRONIZATION_MODE]=&set_synchronization; + flist[F_READ_COUNTER_BLOCK]=&read_counter_block; + flist[F_RESET_COUNTER_BLOCK]=&reset_counter_block; + flist[F_START_RECEIVER]=&start_receiver; + flist[F_STOP_RECEIVER]=&stop_receiver; + flist[F_CALIBRATE_PEDESTAL]=&calibrate_pedestal; + flist[F_SET_CTB_PATTERN]=&set_ctb_pattern; + flist[F_WRITE_ADC_REG]=&write_adc_register; + flist[F_PROGRAM_FPGA]=&program_fpga; + return OK; } int M_nofunc(int file_des){ - - int ret=FAIL; - sprintf(mess,"Unrecognized Function\n"); - printf(mess); - sendDataOnly(file_des,&ret,sizeof(ret)); - sendDataOnly(file_des,mess,sizeof(mess)); - return GOODBYE; + int ret=FAIL; + sprintf(mess,"Unrecognized Function\n"); + printf(mess); + + sendDataOnly(file_des,&ret,sizeof(ret)); + sendDataOnly(file_des,mess,sizeof(mess)); + return GOODBYE; } int exit_server(int file_des) { - int retval=FAIL; - sendDataOnly(file_des,&retval,sizeof(retval)); - printf("closing server."); - sprintf(mess,"closing server"); - sendDataOnly(file_des,mess,sizeof(mess)); - return GOODBYE; + int retval=FAIL; + sendDataOnly(file_des,&retval,sizeof(retval)); + printf("closing server."); + sprintf(mess,"closing server"); + sendDataOnly(file_des,mess,sizeof(mess)); + return GOODBYE; } int exec_command(int file_des) { - char cmd[MAX_STR_LENGTH]; - char answer[MAX_STR_LENGTH]; - int retval=OK; - int sysret=0; - int n=0; + char cmd[MAX_STR_LENGTH]; + char answer[MAX_STR_LENGTH]; + int retval=OK; + int sysret=0; + int n=0; - /* receive arguments */ - n = receiveDataOnly(file_des,cmd,MAX_STR_LENGTH); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - retval=FAIL; - } + /* receive arguments */ + n = receiveDataOnly(file_des,cmd,MAX_STR_LENGTH); + if (n < 0) { + sprintf(mess,"Error reading from socket\n"); + retval=FAIL; + } - /* execute action if the arguments correctly arrived*/ - if (retval==OK) { + /* execute action if the arguments correctly arrived*/ + if (retval==OK) { #ifdef VERBOSE - printf("executing command %s\n", cmd); + printf("executing command %s\n", cmd); #endif - if (lockStatus==0 || differentClients==0) - sysret=system(cmd); + if (lockStatus==0 || differentClients==0) + sysret=system(cmd); - //should be replaced by popen - if (sysret==0) { - sprintf(answer,"Succeeded\n"); - if (lockStatus==1 && differentClients==1) - sprintf(answer,"Detector locked by %s\n", lastClientIP); - } else { - sprintf(answer,"Failed\n"); - retval=FAIL; - } - } else { - sprintf(answer,"Could not receive the command\n"); - } - - /* send answer */ - n = sendDataOnly(file_des,&retval,sizeof(retval)); - n = sendDataOnly(file_des,answer,MAX_STR_LENGTH); - if (n < 0) { - sprintf(mess,"Error writing to socket"); - retval=FAIL; - } + //should be replaced by popen + if (sysret==0) { + sprintf(answer,"Succeeded\n"); + if (lockStatus==1 && differentClients==1) + sprintf(answer,"Detector locked by %s\n", lastClientIP); + } else { + sprintf(answer,"Failed\n"); + retval=FAIL; + } + } else { + sprintf(answer,"Could not receive the command\n"); + } + + /* send answer */ + n = sendDataOnly(file_des,&retval,sizeof(retval)); + n = sendDataOnly(file_des,answer,MAX_STR_LENGTH); + if (n < 0) { + sprintf(mess,"Error writing to socket"); + retval=FAIL; + } - /*return ok/fail*/ - return retval; - + /*return ok/fail*/ + return retval; + } int get_detector_type(int file_des) { - int n=0; - enum detectorType ret; - int retval=OK; - - sprintf(mess,"Can't return detector type\n"); + int n=0; + enum detectorType ret; + int retval=OK; + + sprintf(mess,"Can't return detector type\n"); - /* receive arguments */ - /* execute action */ - ret=myDetectorType; + /* receive arguments */ + /* execute action */ + ret=myDetectorType; #ifdef VERBOSE - printf("Returning detector type %d\n",ret); + printf("Returning detector type %d\n",ret); #endif - /* send answer */ - /* send OK/failed */ - if (differentClients==1) - retval=FORCE_UPDATE; + /* send answer */ + /* send OK/failed */ + if (differentClients==1) + retval=FORCE_UPDATE; + + n += sendDataOnly(file_des,&retval,sizeof(retval)); + if (retval!=FAIL) { + /* send return argument */ + n += sendDataOnly(file_des,&ret,sizeof(ret)); + } else { + n += sendDataOnly(file_des,mess,sizeof(mess)); + } + /*return ok/fail*/ + return retval; - n += sendDataOnly(file_des,&retval,sizeof(retval)); - if (retval!=FAIL) { - /* send return argument */ - n += sendDataOnly(file_des,&ret,sizeof(ret)); - } else { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } - /*return ok/fail*/ - return retval; - } int set_number_of_modules(int file_des) { - int n; - int arg[2], ret=0; - int retval=OK; - int dim, nm; - - sprintf(mess,"Can't set number of modules\n"); + int n; + int arg[2], ret=0; + int retval=OK; + int dim, nm; - /* receive arguments */ - n = receiveDataOnly(file_des,&arg,sizeof(arg)); - if (n < 0) { - sprintf(mess,"Error reading from socket %d", n); - retval=GOODBYE; - } - if (retval==OK) { - dim=arg[0]; - nm=arg[1]; + sprintf(mess,"Can't set number of modules\n"); - /* execute action */ -#ifdef VERBOSE - printf("Setting the number of modules in dimension %d to %d\n",dim,nm ); -#endif - - //if (nm!=GET_FLAG) { - if (dim!=X && nm!=GET_FLAG) { - retval=FAIL; - sprintf(mess,"Can't change module number in dimension %d\n",dim); - } else { - if (lockStatus==1 && differentClients==1 && nm!=GET_FLAG) { - sprintf(mess,"Detector locked by %s\n", lastClientIP); - retval=FAIL; - } else { - ret=setNMod(nm); - if (nModX==nm || nm==GET_FLAG) { - retval=OK; - if (differentClients==1) - retval=FORCE_UPDATE; - } else - retval=FAIL; + /* receive arguments */ + n = receiveDataOnly(file_des,&arg,sizeof(arg)); + if (n < 0) { + sprintf(mess,"Error reading from socket %d", n); + retval=GOODBYE; } - } - } - /*} else { - if (dim==Y) { - ret=nModY; - } else if (dim==X) { - ret=setNMod(-1); - } - } - */ - - /* send answer */ - /* send OK/failed */ - n = sendDataOnly(file_des,&retval,sizeof(retval)); - if (retval!=FAIL) { - /* send return argument */ - n += sendDataOnly(file_des,&ret,sizeof(ret)); - } else { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } - /*return ok/fail*/ - return retval; - + if (retval==OK) { + dim=arg[0]; + nm=arg[1]; + + /* execute action */ +#ifdef VERBOSE + printf("Setting the number of modules in dimension %d to %d\n",dim,nm ); +#endif + + //if (nm!=GET_FLAG) { + if (dim!=X && nm!=GET_FLAG) { + retval=FAIL; + sprintf(mess,"Can't change module number in dimension %d\n",dim); + } else { + if (lockStatus==1 && differentClients==1 && nm!=GET_FLAG) { + sprintf(mess,"Detector locked by %s\n", lastClientIP); + retval=FAIL; + } else { + ret=setNMod(nm); + if (nModX==nm || nm==GET_FLAG) { + retval=OK; + if (differentClients==1) + retval=FORCE_UPDATE; + } else + retval=FAIL; + } + } + } + + /* send answer */ + /* send OK/failed */ + n = sendDataOnly(file_des,&retval,sizeof(retval)); + if (retval!=FAIL) { + /* send return argument */ + n += sendDataOnly(file_des,&ret,sizeof(ret)); + } else { + n += sendDataOnly(file_des,mess,sizeof(mess)); + } + /*return ok/fail*/ + return retval; + } int get_max_number_of_modules(int file_des) { - int n; - int ret; - int retval=OK; - enum dimension arg; - - sprintf(mess,"Can't get max number of modules\n"); - /* receive arguments */ - n = receiveDataOnly(file_des,&arg,sizeof(arg)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - retval=FAIL; - } - /* execute action */ + int n; + int ret; + int retval=OK; + enum dimension arg; + + sprintf(mess,"Can't get max number of modules\n"); + /* receive arguments */ + n = receiveDataOnly(file_des,&arg,sizeof(arg)); + if (n < 0) { + sprintf(mess,"Error reading from socket\n"); + retval=FAIL; + } + /* execute action */ #ifdef VERBOSE - printf("Getting the max number of modules in dimension %d \n",arg); + printf("Getting the max number of modules in dimension %d \n",arg); #endif - switch (arg) { - case X: - ret=getNModBoard(); - break; - case Y: - ret=NMAXMODY; - break; - default: - ret=FAIL; - retval=FAIL; - break; - } + switch (arg) { + case X: + ret=getNModBoard(); + break; + case Y: + ret=NMAXMODY; + break; + default: + ret=FAIL; + retval=FAIL; + break; + } #ifdef VERBOSE - printf("Max number of module in dimension %d is %d\n",arg,ret ); -#endif + printf("Max number of module in dimension %d is %d\n",arg,ret ); +#endif - if (differentClients==1 && retval==OK) { - retval=FORCE_UPDATE; - } + if (differentClients==1 && retval==OK) { + retval=FORCE_UPDATE; + } - /* send answer */ - /* send OK/failed */ - n = sendDataOnly(file_des,&retval,sizeof(retval)); - if (retval!=FAIL) { - /* send return argument */ - n += sendDataOnly(file_des,&ret,sizeof(ret)); - } else { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } + /* send answer */ + /* send OK/failed */ + n = sendDataOnly(file_des,&retval,sizeof(retval)); + if (retval!=FAIL) { + /* send return argument */ + n += sendDataOnly(file_des,&ret,sizeof(ret)); + } else { + n += sendDataOnly(file_des,mess,sizeof(mess)); + } - /*return ok/fail*/ - return retval; + /*return ok/fail*/ + return retval; } @@ -591,17 +541,14 @@ int set_external_signal_flag(int file_des) { sprintf(mess,"Detector locked by %s\n", lastClientIP); } } - } - #ifdef VERBOSE printf("Setting external signal %d to flag %d\n",signalindex,flag ); printf("Set to flag %d\n",retval); #endif - - } else { + } else ret=FAIL; - } + if (ret==OK && differentClients!=0) ret=FORCE_UPDATE; @@ -631,7 +578,6 @@ int set_external_communication_mode(int file_des) { sprintf(mess,"Can't set external communication mode\n"); - /* receive arguments */ n = receiveDataOnly(file_des,&arg,sizeof(arg)); if (n < 0) { @@ -654,16 +600,7 @@ int set_external_communication_mode(int file_des) { */ if (retval==OK) { /* execute action */ - ret=setTiming(arg); - - /* switch(arg) { */ - /* default: */ - /* sprintf(mess,"The meaning of single signals should be set\n"); */ - /* retval=FAIL; */ - /* } */ - - #ifdef VERBOSE printf("Setting external communication mode to %d\n", arg); #endif @@ -687,336 +624,333 @@ int set_external_communication_mode(int file_des) { int get_id(int file_des) { - // sends back 64 bits! - int64_t retval=-1; - int ret=OK; - int n=0; - enum idMode arg; - - sprintf(mess,"Can't return id\n"); + // sends back 64 bits! + int64_t retval=-1; + int ret=OK; + int n=0; + enum idMode arg; - /* receive arguments */ - n = receiveDataOnly(file_des,&arg,sizeof(arg)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } + sprintf(mess,"Can't return id\n"); + + /* receive arguments */ + n = receiveDataOnly(file_des,&arg,sizeof(arg)); + if (n < 0) { + sprintf(mess,"Error reading from socket\n"); + ret=FAIL; + } #ifdef VERBOSE - printf("Getting id %d\n", arg); + printf("Getting id %d\n", arg); #endif - switch (arg) { - case DETECTOR_SERIAL_NUMBER: - retval=getDetectorNumber(); - break; - case DETECTOR_FIRMWARE_VERSION: - retval=getFirmwareSVNVersion(); - retval=(retval <<32) | getFirmwareVersion(); - break; - case DETECTOR_SOFTWARE_VERSION: - retval= SVNREV; - retval= (retval <<32) | SVNDATE; - break; -/* case DETECTOR_FIRMWARE_SVN_VERSION: - retval=getFirmwareSVNVersion(); - break;*/ - default: - printf("Required unknown id %d \n", arg); - ret=FAIL; - retval=FAIL; - break; - } - + switch (arg) { + case DETECTOR_SERIAL_NUMBER: + retval=getDetectorNumber(); + break; + case DETECTOR_FIRMWARE_VERSION: + retval=getFirmwareSVNVersion(); + retval=(retval <<32) | getFirmwareVersion(); + break; + case DETECTOR_SOFTWARE_VERSION: + retval= SVNREV; + retval= (retval <<32) | SVNDATE; + break; + default: + printf("Required unknown id %d \n", arg); + ret=FAIL; + retval=FAIL; + break; + } + #ifdef VERBOSE - printf("Id is %llx\n", retval); + printf("Id is %llx\n", retval); #endif - - if (differentClients==1) - ret=FORCE_UPDATE; - /* send answer */ - /* send OK/failed */ - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret!=FAIL) { - /* send return argument */ - n += sendDataOnly(file_des,&retval,sizeof(retval)); - } else { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } + if (differentClients==1) + ret=FORCE_UPDATE; - /*return ok/fail*/ - return ret; + /* send answer */ + /* send OK/failed */ + n = sendDataOnly(file_des,&ret,sizeof(ret)); + if (ret!=FAIL) { + /* send return argument */ + n += sendDataOnly(file_des,&retval,sizeof(retval)); + } else { + n += sendDataOnly(file_des,mess,sizeof(mess)); + } + + /*return ok/fail*/ + return ret; } int digital_test(int file_des) { - int retval; - int ret=OK; - int imod=-1; - int n=0; - int ibit=0; - int ow; - int ival; - enum digitalTestMode arg; - - sprintf(mess,"Can't send digital test\n"); + int retval; + int ret=OK; + int imod=-1; + int n=0; + int ibit=0; + int ow; + int ival; + enum digitalTestMode arg; - n = receiveDataOnly(file_des,&arg,sizeof(arg)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } + sprintf(mess,"Can't send digital test\n"); + + n = receiveDataOnly(file_des,&arg,sizeof(arg)); + if (n < 0) { + sprintf(mess,"Error reading from socket\n"); + ret=FAIL; + } #ifdef VERBOSE - printf("Digital test mode %d\n",arg ); + printf("Digital test mode %d\n",arg ); #endif - switch (arg) { - case CHIP_TEST: - n = receiveDataOnly(file_des,&imod,sizeof(imod)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - retval=FAIL; - } + switch (arg) { + case CHIP_TEST: + n = receiveDataOnly(file_des,&imod,sizeof(imod)); + if (n < 0) { + sprintf(mess,"Error reading from socket\n"); + retval=FAIL; + } #ifdef VERBOSE - printf("of module %d\n", imod); + printf("of module %d\n", imod); #endif - retval=0; + retval=0; #ifdef MCB_FUNCS - if (differentClients==1 && lockStatus==1) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - break; - } - if (imod >= nModX) { - ret=FAIL; - sprintf(mess,"Module %d disabled\n",imod); - break; - } - if (testShiftIn(imod)) retval|=(1<<(ibit)); - ibit++; - if (testShiftOut(imod)) retval|=(1<<(ibit)); - ibit++; - if (testShiftStSel(imod)) retval|=(1<<(ibit)); - ibit++; - //if ( testDataInOut(0x123456, imod)) retval|=(1<<(ibit++)); - //if ( testExtPulse(imod)) retval|=(1<<(ibit++)); - // for (ow=0; ow<6; ow++) - // ow=1; - //#ifndef PICASSOD - for (ow=0; ow<5; ow++) { - //#endif - if (testDataInOutMux(imod, ow, 0x789abc)) retval|=(1<= nModX) { + ret=FAIL; + sprintf(mess,"Module %d disabled\n",imod); + break; + } + if (testShiftIn(imod)) retval|=(1<<(ibit)); + ibit++; + if (testShiftOut(imod)) retval|=(1<<(ibit)); + ibit++; + if (testShiftStSel(imod)) retval|=(1<<(ibit)); + ibit++; + //if ( testDataInOut(0x123456, imod)) retval|=(1<<(ibit++)); + //if ( testExtPulse(imod)) retval|=(1<<(ibit++)); + // for (ow=0; ow<6; ow++) + // ow=1; + //#ifndef PICASSOD + for (ow=0; ow<5; ow++) { + //#endif + if (testDataInOutMux(imod, ow, 0x789abc)) retval|=(1<2500) - val=-1; - printf("%d mV is ",val); - if (val>0) - val=4095*val/2500; - printf("%d DACu\n", val); - } else if (val>4095) - val=-1; - - - retval=setDac(ind,val); - /* if(idac==HIGH_VOLTAGE) */ - /* retval=initHighVoltageByModule(val,imod); */ - /* else */ - /* retval=initDACbyIndexDACU(idac,val,imod); */ - } - else if (ind==ADC_VPP) { - printf("Setting ADC VPP to %d\n",val); - if (val>4 || val<0) - printf("Cannot set ADC VPP to %d\n",val); - else { - writeADC(0x18,val); - adcvpp=val; - } - retval=adcvpp;; + if (mV) { + if (val>2500) + val=-1; + printf("%d mV is ",val); + if (val>0) + val=4095*val/2500; + printf("%d DACu\n", val); + } else if (val>4095) + val=-1; - } else if (ind==HV_NEW ) - retval=initHighVoltageByModule(val,imod); - else - printf("**********No dac with index %d\n",ind); + + retval=setDac(ind,val); + /* if(idac==HIGH_VOLTAGE) */ + /* retval=initHighVoltageByModule(val,imod); */ + /* else */ + /* retval=initDACbyIndexDACU(idac,val,imod); */ + } + else if (ind==ADC_VPP) { + printf("Setting ADC VPP to %d\n",val); + if (val>4 || val<0) + printf("Cannot set ADC VPP to %d\n",val); + else { + writeADC(0x18,val); + adcvpp=val; + } + retval=adcvpp;; + + } else if (ind==HV_NEW ) + retval=initHighVoltageByModule(val,imod); + else + printf("**********No dac with index %d\n",ind); } } if(ret==OK){ - if (ind<16) { - if (mV) { - - printf("%d DACu is ",retval); - retval1=2500*retval/16535; - printf("%d mV \n",retval1); - } else - retval1=retval; - } else - retval1=retval; + if (ind<16) { + if (mV) { + + printf("%d DACu is ",retval); + retval1=2500*retval/16535; + printf("%d mV \n",retval1); + } else + retval1=retval; + } else + retval1=retval; } #endif @@ -1185,7 +1119,7 @@ int get_adc(int file_des) { printf("Unknown DAC index %d\n",ind); sprintf(mess,"Unknown DAC index %d\n",ind); ret=FAIL; - break; + break; } if (ret==OK) @@ -1218,70 +1152,70 @@ int get_adc(int file_des) { } int set_channel(int file_des) { - int ret=OK; - sls_detector_channel myChan; - int retval; - int n; - + int ret=OK; + sls_detector_channel myChan; + int retval; + int n; - sprintf(mess,"Can't set channel\n"); + + sprintf(mess,"Can't set channel\n"); #ifdef VERBOSE - printf("Setting channel\n"); + printf("Setting channel\n"); #endif - ret=receiveChannel(file_des, &myChan); - if (ret>=0) - ret=OK; - else - ret=FAIL; + ret=receiveChannel(file_des, &myChan); + if (ret>=0) + ret=OK; + else + ret=FAIL; #ifdef VERBOSE - printf("channel number is %d, chip number is %d, module number is %d, register is %lld\n", myChan.chan,myChan.chip, myChan.module, myChan.reg); + printf("channel number is %d, chip number is %d, module number is %d, register is %lld\n", myChan.chan,myChan.chip, myChan.module, myChan.reg); #endif - if (ret==OK) { - if (myChan.module>=getNModBoard()) - ret=FAIL; - if (myChan.chip>=N_CHIP) - ret=FAIL; - if (myChan.chan>=N_CHAN) - ret=FAIL; - if (myChan.module<0) - myChan.module=ALLMOD; - } + if (ret==OK) { + if (myChan.module>=getNModBoard()) + ret=FAIL; + if (myChan.chip>=NCHIP) + ret=FAIL; + if (myChan.chan>=NCHAN) + ret=FAIL; + if (myChan.module<0) + myChan.module=ALLMOD; + } - - if (ret==OK) { - if (differentClients==1 && lockStatus==1) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - } else { + + if (ret==OK) { + if (differentClients==1 && lockStatus==1) { + ret=FAIL; + sprintf(mess,"Detector locked by %s\n",lastClientIP); + } else { #ifdef MCB_FUNCS - retval=initChannelbyNumber(myChan); + retval=initChannelbyNumber(myChan); #endif - } - } - /* Maybe this is done inside the initialization funcs */ - //copyChannel(detectorChans[myChan.module][myChan.chip]+(myChan.chan), &myChan); - + } + } + /* Maybe this is done inside the initialization funcs */ + //copyChannel(detectorChans[myChan.module][myChan.chip]+(myChan.chan), &myChan); - if (differentClients==1 && ret==OK) - ret=FORCE_UPDATE; - /* send answer */ - /* send OK/failed */ - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret!=FAIL) { - /* send return argument */ - n += sendDataOnly(file_des,&retval,sizeof(retval)); - } else { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } + if (differentClients==1 && ret==OK) + ret=FORCE_UPDATE; + + /* send answer */ + /* send OK/failed */ + n = sendDataOnly(file_des,&ret,sizeof(ret)); + if (ret!=FAIL) { + /* send return argument */ + n += sendDataOnly(file_des,&retval,sizeof(retval)); + } else { + n += sendDataOnly(file_des,mess,sizeof(mess)); + } - /*return ok/fail*/ - return ret; - + /*return ok/fail*/ + return ret; + } @@ -1289,72 +1223,72 @@ int set_channel(int file_des) { int get_channel(int file_des) { - int ret=OK; - sls_detector_channel retval; + int ret=OK; + sls_detector_channel retval; - int arg[3]; - int ichan, ichip, imod; - int n; - - sprintf(mess,"Can't get channel\n"); + int arg[3]; + int ichan, ichip, imod; + int n; + + sprintf(mess,"Can't get channel\n"); - n = receiveDataOnly(file_des,arg,sizeof(arg)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - ichan=arg[0]; - ichip=arg[1]; - imod=arg[2]; - - if (ret==OK) { - ret=FAIL; - if (imod>=0 && imod=0 && ichip=0 && ichan=0 && imod=0 && ichip=0 && ichan=0) - ret=OK; - else - ret=FAIL; + if (ret>=0) + ret=OK; + else + ret=FAIL; #ifdef VERBOSE - printf("chip number is %d, module number is %d, register is %d, nchan %d\n",myChip.chip, myChip.module, myChip.reg, myChip.nchan); + printf("chip number is %d, module number is %d, register is %d, nchan %d\n",myChip.chip, myChip.module, myChip.reg, myChip.nchan); #endif - - if (ret==OK) { - if (myChip.module>=getNModBoard()) - ret=FAIL; - if (myChip.module<0) - myChip.module=ALLMOD; - if (myChip.chip>=N_CHIP) - ret=FAIL; - } - if (differentClients==1 && lockStatus==1) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - } else { + + if (ret==OK) { + if (myChip.module>=getNModBoard()) + ret=FAIL; + if (myChip.module<0) + myChip.module=ALLMOD; + if (myChip.chip>=NCHIP) + ret=FAIL; + } + if (differentClients==1 && lockStatus==1) { + ret=FAIL; + sprintf(mess,"Detector locked by %s\n",lastClientIP); + } else { #ifdef MCB_FUNCS - retval=initChipbyNumber(myChip); + retval=initChipbyNumber(myChip); #endif - } - /* Maybe this is done inside the initialization funcs */ - //copyChip(detectorChips[myChip.module]+(myChip.chip), &myChip); + } + /* Maybe this is done inside the initialization funcs */ + //copyChip(detectorChips[myChip.module]+(myChip.chip), &myChip); - if (differentClients && ret==OK) - ret=FORCE_UPDATE; - /* send answer */ - /* send OK/failed */ - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret!=FAIL) { - /* send return argument */ - n += sendDataOnly(file_des,&retval,sizeof(retval)); - } else { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } + if (differentClients && ret==OK) + ret=FORCE_UPDATE; + /* send answer */ + /* send OK/failed */ + n = sendDataOnly(file_des,&ret,sizeof(ret)); + if (ret!=FAIL) { + /* send return argument */ + n += sendDataOnly(file_des,&retval,sizeof(retval)); + } else { + n += sendDataOnly(file_des,mess,sizeof(mess)); + } - - return ret; + return ret; } + int get_chip(int file_des) { - - int ret=OK; - sls_detector_chip retval; - int arg[2]; - int ichip, imod; - int n; - + + int ret=OK; + sls_detector_chip retval; + int arg[2]; + int ichip, imod; + int n; - n = receiveDataOnly(file_des,arg,sizeof(arg)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - ichip=arg[0]; - imod=arg[1]; - if (ret==OK) { - ret=FAIL; - if (imod>=0 && imod=0 && ichip=0 && imod=0 && ichip=0) - ret=OK; - else - ret=FAIL; + if (ret>=0) + ret=OK; + else + ret=FAIL; #ifdef VERBOSE - printf("module number is %d,register is %d, nchan %d, nchip %d, ndac %d, nadc %d, gain %f, offset %f\n",myModule.module, myModule.reg, myModule.nchan, myModule.nchip, myModule.ndac, myModule.nadc, myModule.gain,myModule.offset); + printf("module number is %d,register is %d, nchan %d, nchip %d, ndac %d, nadc %d, gain %f, offset %f\n",myModule.module, myModule.reg, myModule.nchan, myModule.nchip, myModule.ndac, myModule.nadc, myModule.gain,myModule.offset); #endif - - if (ret==OK) { - if (myModule.module>=getNModBoard()) { - ret=FAIL; - printf("Module number is too large %d\n",myModule.module); - } - if (myModule.module<0) - myModule.module=ALLMOD; - } - - if (ret==OK) { - if (differentClients==1 && lockStatus==1) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - } else { + + if (ret==OK) { + if (myModule.module>=getNModBoard()) { + ret=FAIL; + printf("Module number is too large %d\n",myModule.module); + } + if (myModule.module<0) + myModule.module=ALLMOD; + } + + if (ret==OK) { + if (differentClients==1 && lockStatus==1) { + ret=FAIL; + sprintf(mess,"Detector locked by %s\n",lastClientIP); + } else { #ifdef MCB_FUNCS - retval=initModulebyNumber(myModule); - if(retval != myModule.reg) - ret = FAIL; + retval=initModulebyNumber(myModule); + if(retval != myModule.reg) + ret = FAIL; #endif - } - } + } + } - if (differentClients==1 && ret==OK) - ret=FORCE_UPDATE; + if (differentClients==1 && ret==OK) + ret=FORCE_UPDATE; - /* Maybe this is done inside the initialization funcs */ - //copyChip(detectorChips[myChip.module]+(myChip.chip), &myChip); + /* Maybe this is done inside the initialization funcs */ + //copyChip(detectorChips[myChip.module]+(myChip.chip), &myChip); - /* send answer */ - /* send OK/failed */ - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret!=FAIL) { - /* send return argument */ - n += sendDataOnly(file_des,&retval,sizeof(retval)); - } else { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } + /* send answer */ + /* send OK/failed */ + n = sendDataOnly(file_des,&ret,sizeof(ret)); + if (ret!=FAIL) { + /* send return argument */ + n += sendDataOnly(file_des,&retval,sizeof(retval)); + } else { + n += sendDataOnly(file_des,mess,sizeof(mess)); + } - free(myDac); - if(myAdc != NULL) free(myAdc); - if(myChip != NULL) free(myChip); - if(myChan != NULL) free(myChan); + free(myDac); + if(myAdc != NULL) free(myAdc); + if(myChip != NULL) free(myChip); + if(myChan != NULL) free(myChan); - //setDynamicRange(dr); always 16 commented out + //setDynamicRange(dr); always 16 commented out - return ret; + return ret; } @@ -1616,278 +1517,245 @@ int set_module(int file_des) { int get_module(int file_des) { - int ret=OK; - int arg; - int imod; - int n; - sls_detector_module myModule; - int *myDac=malloc(N_DAC*sizeof(int)); - int *myChip=NULL; - int *myChan=NULL; - int *myAdc=NULL; - - /*not required for jungfrau. so save memory*/ - if(myDetectorType != JUNGFRAU){ - myChip=malloc(N_CHIP*sizeof(int)); - myChan=malloc(N_CHIP*N_CHAN*sizeof(int)); - myAdc=malloc(N_ADC*sizeof(int)); - } + int ret=OK; + int arg; + int imod; + int n; + sls_detector_module myModule; + int *myDac=malloc(NDAC*sizeof(int)); + int *myChip=NULL; + int *myChan=NULL; + int *myAdc=NULL; + //not allocating mychip,mychan for jungfrau to sace memory + + if (myDac) + myModule.dacs=myDac; + else { + sprintf(mess,"could not allocate dacs\n"); + ret=FAIL; + } - if (myDac) - myModule.dacs=myDac; - else { - sprintf(mess,"could not allocate dacs\n"); - ret=FAIL; - } + myModule.adcs=NULL; + myModule.chipregs=NULL; + myModule.chanregs=NULL; + myModule.ndac=NDAC; + myModule.nchip=NCHIP; + myModule.nchan=NCHAN*NCHIP; + myModule.nadc=NADC; - myModule.adcs=NULL; - myModule.chipregs=NULL; - myModule.chanregs=NULL; - /*not required for jungfrau. so save memory*/ - if(myDetectorType != JUNGFRAU){ - if (myAdc) - myModule.adcs=myAdc; - else { - sprintf(mess,"could not allocate adcs\n"); - ret=FAIL; - } - if (myChip) - myModule.chipregs=myChip; - else { - sprintf(mess,"could not allocate chips\n"); - ret=FAIL; - } - if (myChan) - myModule.chanregs=myChan; - else { - sprintf(mess,"could not allocate chans\n"); - ret=FAIL; - } - } - myModule.ndac=N_DAC; - myModule.nchip=N_CHIP; - myModule.nchan=N_CHAN*N_CHIP; - myModule.nadc=N_ADC; - + n = receiveDataOnly(file_des,&arg,sizeof(arg)); + if (n < 0) { + sprintf(mess,"Error reading from socket\n"); + ret=FAIL; + } + imod=arg; - - n = receiveDataOnly(file_des,&arg,sizeof(arg)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - imod=arg; - - if (ret==OK) { - ret=FAIL; - if (imod>=0 && imod=0 && imod-2) { + dataret=FAIL; + sprintf(mess,"no data and run stopped: %d frames left\n",(int)(getFrames()+2)); + } else { + dataret=FINISHED; + sprintf(mess,"acquisition successfully finished\n"); + if (differentClients) + dataret=FORCE_UPDATE; + } #endif sendDataOnly(file_des,&dataret,sizeof(dataret)); -#ifdef VERYVERBOSE - printf("sending pointer %x of size %d\n",(unsigned int)(dataretval),dataBytes*nSamples); -#endif - sendDataOnly(file_des,dataretval,dataBytes*nSamples); - } else { - if (getFrames()>-1) { - dataret=FAIL; - sprintf(mess,"no data and run stopped: %d frames left\n",(int)(getFrames()+2)); - printf("%s\n",mess); - } else { - dataret=FINISHED; - sprintf(mess,"acquisition successfully finished\n"); - printf("%s\n",mess); - if (differentClients) - dataret=FORCE_UPDATE; - } -#ifdef VERBOSE - printf("Frames left %d\n",(int)(getFrames())); -#endif - sendDataOnly(file_des,&dataret,sizeof(dataret)); - sendDataOnly(file_des,mess,sizeof(mess)); - } - - - - - return dataret; - + sendDataOnly(file_des,mess,sizeof(mess)); + if(dataret == FAIL) + cprintf(RED,"%s\n",mess); + else + printf("%s",mess); + return dataret; } - - - - int read_all(int file_des) { - -while(read_frame(file_des)==OK) { - + while(read_frame(file_des)==OK) { #ifdef VERBOSE - printf("frame read\n"); + printf("frame read\n"); #endif - ; - } + ; + } #ifdef VERBOSE - printf("Frames finished\n"); + printf("Frames finished\n"); #endif - return OK; - - + return OK; } + + int start_and_read_all(int file_des) { - //int dataret=OK; #ifdef VERBOSE - printf("Starting and reading all frames\n"); + printf("Starting and reading all frames\n"); #endif + if (differentClients==1 && lockStatus==1) { + dataret=FAIL; + sprintf(mess,"Detector locked by %s\n",lastClientIP); + sendDataOnly(file_des,&dataret,sizeof(dataret)); + sendDataOnly(file_des,mess,sizeof(mess)); + return dataret; - if (differentClients==1 && lockStatus==1) { - dataret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - sendDataOnly(file_des,&dataret,sizeof(dataret)); - sendDataOnly(file_des,mess,sizeof(mess)); - return dataret; - - } - - startStateMachine(); - - /* ret=startStateMachine(); - if (ret!=OK) { - sprintf(mess,"could not start state machine\n"); - sendDataOnly(file_des,&ret,sizeof(ret)); - sendDataOnly(file_des,mess,sizeof(mess)); - - #ifdef VERBOSE - printf("could not start state machine\n"); -#endif -} else {*/ - read_all(file_des); + } + startStateMachine(); + read_all(file_des); #ifdef VERBOSE - printf("Frames finished\n"); + printf("Frames finished\n"); #endif - //} - - - return OK; - - + return OK; } int set_timer(int file_des) { - enum timerIndex ind; - int64_t tns; - int n; - int64_t retval; - int ret=OK; - + enum timerIndex ind; + int64_t tns; + int n; + int64_t retval; + int ret=OK; - sprintf(mess,"can't set timer\n"); - - n = receiveDataOnly(file_des,&ind,sizeof(ind)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - - n = receiveDataOnly(file_des,&tns,sizeof(tns)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - - if (ret!=OK) { - printf(mess); - } + + sprintf(mess,"can't set timer\n"); + + n = receiveDataOnly(file_des,&ind,sizeof(ind)); + if (n < 0) { + sprintf(mess,"Error reading from socket\n"); + ret=FAIL; + } + + n = receiveDataOnly(file_des,&tns,sizeof(tns)); + if (n < 0) { + sprintf(mess,"Error reading from socket\n"); + ret=FAIL; + } + + if (ret!=OK) { + printf(mess); + } #ifdef VERBOSE - printf("setting timer %d to %lld ns\n",ind,tns); + printf("setting timer %d to %lld ns\n",ind,tns); #endif - if (ret==OK) { + if (ret==OK) { - if (differentClients==1 && lockStatus==1 && tns!=-1) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - } else { - switch(ind) { - case FRAME_NUMBER: - retval=setFrames(tns); - break; - case ACQUISITION_TIME: - retval=setExposureTime(tns); - break; - case FRAME_PERIOD: - retval=setPeriod(tns); - break; - case DELAY_AFTER_TRIGGER: - retval=setDelay(tns); - break; - case GATES_NUMBER: - retval=setGates(tns); - break; - case PROBES_NUMBER: - sprintf(mess,"can't set timer for moench\n"); - ret=FAIL; - break; - case CYCLES_NUMBER: - retval=setTrains(tns); - break; - default: - ret=FAIL; - sprintf(mess,"timer index unknown %d\n",ind); - break; - } - } - } - if (ret!=OK) { - printf(mess); - if (differentClients) - ret=FORCE_UPDATE; - } + if (differentClients==1 && lockStatus==1 && tns!=-1) { + ret=FAIL; + sprintf(mess,"Detector locked by %s\n",lastClientIP); + } else { + switch(ind) { + case FRAME_NUMBER: + retval=setFrames(tns); + break; + case ACQUISITION_TIME: + retval=setExposureTime(tns); + break; + case FRAME_PERIOD: + retval=setPeriod(tns); + break; + case DELAY_AFTER_TRIGGER: + retval=setDelay(tns); + break; + case GATES_NUMBER: + retval=setGates(tns); + break; + case PROBES_NUMBER: + sprintf(mess,"can't set timer for this detector\n"); + ret=FAIL; + break; + case CYCLES_NUMBER: + retval=setTrains(tns); + break; + default: + ret=FAIL; + sprintf(mess,"timer index unknown %d\n",ind); + break; + } + } + } + if (ret!=OK) { + printf(mess); + if (differentClients) + ret=FORCE_UPDATE; + } - if (ret!=OK) { - printf(mess); - printf("set timer failed\n"); - } else if (ind==FRAME_NUMBER) { - // ret=allocateRAM(); - // if (ret!=OK) - // sprintf(mess, "could not allocate RAM for %lld frames\n", tns); - } + if (ret!=OK) { + printf(mess); + printf("set timer failed\n"); + } - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==FAIL) { - n = sendDataOnly(file_des,mess,sizeof(mess)); - } else { + n = sendDataOnly(file_des,&ret,sizeof(ret)); + if (ret==FAIL) { + n = sendDataOnly(file_des,mess,sizeof(mess)); + } else { #ifdef VERBOSE - printf("returning ok %d\n",(int)(sizeof(retval))); + printf("returning ok %d\n",(int)(sizeof(retval))); #endif - n = sendDataOnly(file_des,&retval,sizeof(retval)); - } + n = sendDataOnly(file_des,&retval,sizeof(retval)); + } - return ret; + return ret; } @@ -2264,91 +2033,91 @@ int set_timer(int file_des) { int get_time_left(int file_des) { - enum timerIndex ind; - int n; - int64_t retval; - int ret=OK; - - sprintf(mess,"can't get timer\n"); - n = receiveDataOnly(file_des,&ind,sizeof(ind)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - + enum timerIndex ind; + int n; + int64_t retval; + int ret=OK; - //#ifdef VERBOSE - - printf("getting time left on timer %d \n",ind); - //#endif - - if (ret==OK) { - switch(ind) { - case FRAME_NUMBER: - printf("getting frames \n"); - retval=getFrames(); - break; - case ACQUISITION_TIME: - retval=getExposureTime(); - break; - case FRAME_PERIOD: - retval=getPeriod(); - break; - case DELAY_AFTER_TRIGGER: - retval=getDelay(); - break; - case GATES_NUMBER: - retval=getGates(); - break; - case PROBES_NUMBER: - retval=getProbes(); - break; - case CYCLES_NUMBER: - retval=getTrains(); - break; - case PROGRESS: - retval=getProgress(); - break; - case ACTUAL_TIME: - retval=getActualTime(); - break; - case MEASUREMENT_TIME: - retval=getMeasurementTime(); - break; - case FRAMES_FROM_START: - case FRAMES_FROM_START_PG: - retval=getFramesFromStart(); - break; - default: - ret=FAIL; - sprintf(mess,"timer index unknown %d\n",ind); - break; - } - } + sprintf(mess,"can't get timer\n"); + n = receiveDataOnly(file_des,&ind,sizeof(ind)); + if (n < 0) { + sprintf(mess,"Error reading from socket\n"); + ret=FAIL; + } - if (ret!=OK) { - printf("get time left failed\n"); - } else if (differentClients) - ret=FORCE_UPDATE; + //#ifdef VERBOSE - //#ifdef VERBOSE + printf("getting time left on timer %d \n",ind); + //#endif - printf("time left on timer %d is %lld\n",ind, retval); - //#endif + if (ret==OK) { + switch(ind) { + case FRAME_NUMBER: + printf("getting frames \n"); + retval=getFrames(); + break; + case ACQUISITION_TIME: + retval=getExposureTime(); + break; + case FRAME_PERIOD: + retval=getPeriod(); + break; + case DELAY_AFTER_TRIGGER: + retval=getDelay(); + break; + case GATES_NUMBER: + retval=getGates(); + break; + case PROBES_NUMBER: + retval=getProbes(); + break; + case CYCLES_NUMBER: + retval=getTrains(); + break; + case PROGRESS: + retval=getProgress(); + break; + case ACTUAL_TIME: + retval=getActualTime(); + break; + case MEASUREMENT_TIME: + retval=getMeasurementTime(); + break; + case FRAMES_FROM_START: + case FRAMES_FROM_START_PG: + retval=getFramesFromStart(); + break; + default: + ret=FAIL; + sprintf(mess,"timer index unknown %d\n",ind); + break; + } + } - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==FAIL) { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } else - n = sendDataOnly(file_des,&retval,sizeof(retval)); + + if (ret!=OK) { + printf("get time left failed\n"); + } else if (differentClients) + ret=FORCE_UPDATE; + + //#ifdef VERBOSE + + printf("time left on timer %d is %lld\n",ind, retval); + //#endif + + n = sendDataOnly(file_des,&ret,sizeof(ret)); + if (ret==FAIL) { + n += sendDataOnly(file_des,mess,sizeof(mess)); + } else + n = sendDataOnly(file_des,&retval,sizeof(retval)); #ifdef VERBOSE - printf("data sent\n"); + printf("data sent\n"); #endif - return ret; + return ret; } @@ -2356,62 +2125,53 @@ int get_time_left(int file_des) { int set_dynamic_range(int file_des) { - - int dr; - int n; - int retval; - int ret=OK; - - printf("Set dynamic range?\n"); - sprintf(mess,"can't set dynamic range\n"); - - n = receiveDataOnly(file_des,&dr,sizeof(dr)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - - - if (differentClients==1 && lockStatus==1 && dr>=0) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - } else { - retval=setDynamicRange(dr); - } + int dr; + int n; + int retval; + int ret=OK; - //if (dr>=0 && retval!=dr) ret=FAIL; - if (ret!=OK) { - sprintf(mess,"set dynamic range failed\n"); - } else { - /* ret=allocateRAM(); */ -/* if (ret!=OK) */ -/* sprintf(mess,"Could not allocate RAM for the dynamic range selected\n"); */ -// else - if (differentClients) - ret=FORCE_UPDATE; - } + printf("Set dynamic range?\n"); + sprintf(mess,"can't set dynamic range\n"); - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==FAIL) { - n = sendDataOnly(file_des,mess,sizeof(mess)); - } else { - n = sendDataOnly(file_des,&retval,sizeof(retval)); - } - return ret; + + n = receiveDataOnly(file_des,&dr,sizeof(dr)); + if (n < 0) { + sprintf(mess,"Error reading from socket\n"); + ret=FAIL; + } + + + if (differentClients==1 && lockStatus==1 && dr>=0) { + ret=FAIL; + sprintf(mess,"Detector locked by %s\n",lastClientIP); + } else { + retval=setDynamicRange(dr); + } + + //if (dr>=0 && retval!=dr) ret=FAIL; + if (ret!=OK) { + sprintf(mess,"set dynamic range failed\n"); + } else { + if (differentClients) + ret=FORCE_UPDATE; + } + + n = sendDataOnly(file_des,&ret,sizeof(ret)); + if (ret==FAIL) { + n = sendDataOnly(file_des,mess,sizeof(mess)); + } else { + n = sendDataOnly(file_des,&retval,sizeof(retval)); + } + return ret; } int set_roi(int file_des) { - int i; int ret=OK; int nroi=-1; int n=0; - int retvalsize=0; - ROI arg[MAX_ROIS]; - ROI* retval=0; strcpy(mess,"Could not set/get roi\n"); - // u_int32_t disable_reg=0; n = receiveDataOnly(file_des,&nroi,sizeof(nroi)); if (n < 0) { @@ -2419,41 +2179,9 @@ int set_roi(int file_des) { ret=FAIL; } - if(myDetectorType == JUNGFRAU){ - ret = FAIL; - strcpy(mess,"Not applicable/implemented for this detector\n"); - printf("Error:Set ROI-%s",mess); - } - - else{ - - if(nroi>=0){ - n = receiveDataOnly(file_des,arg,nroi*sizeof(ROI)); - if (n != (nroi*sizeof(ROI))) { - sprintf(mess,"Received wrong number of bytes for ROI\n"); - ret=FAIL; - } - - printf("Setting ROI to:"); - for( i=0;i=0) { - if (lockStatus==0 || strcmp(lastClientIP,thisClientIP)==0 || strcmp(lastClientIP,"none")==0) - lockStatus=lock; - else { - ret=FAIL; - sprintf(mess,"Server already locked by %s\n", lastClientIP); - } - } - if (differentClients && ret==OK) - ret=FORCE_UPDATE; - - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==FAIL) { - n = sendDataOnly(file_des,mess,sizeof(mess)); - } else - n = sendDataOnly(file_des,&lockStatus,sizeof(lockStatus)); - - return ret; + int n; + int ret=OK; + + int lock; + n = receiveDataOnly(file_des,&lock,sizeof(lock)); + if (n < 0) { + sprintf(mess,"Error reading from socket\n"); + printf("Error reading from socket (lock)\n"); + ret=FAIL; + } + if (lock>=0) { + if (lockStatus==0 || strcmp(lastClientIP,thisClientIP)==0 || strcmp(lastClientIP,"none")==0) + lockStatus=lock; + else { + ret=FAIL; + sprintf(mess,"Server already locked by %s\n", lastClientIP); + } + } + if (differentClients && ret==OK) + ret=FORCE_UPDATE; + + n = sendDataOnly(file_des,&ret,sizeof(ret)); + if (ret==FAIL) { + n = sendDataOnly(file_des,mess,sizeof(mess)); + } else + n = sendDataOnly(file_des,&lockStatus,sizeof(lockStatus)); + + return ret; } @@ -2776,65 +2425,65 @@ int set_port(int file_des) { } int get_last_client_ip(int file_des) { - int ret=OK; - int n; - if (differentClients ) - ret=FORCE_UPDATE; - n = sendDataOnly(file_des,&ret,sizeof(ret)); - n = sendDataOnly(file_des,lastClientIP,sizeof(lastClientIP)); - - return ret; + int ret=OK; + int n; + if (differentClients ) + ret=FORCE_UPDATE; + n = sendDataOnly(file_des,&ret,sizeof(ret)); + n = sendDataOnly(file_des,lastClientIP,sizeof(lastClientIP)); + + return ret; } int send_update(int file_des) { - int ret=OK; - enum detectorSettings t; - int n;//int thr, n; - //int it; - int64_t retval, tns=-1; - n = sendDataOnly(file_des,lastClientIP,sizeof(lastClientIP)); - n = sendDataOnly(file_des,&nModX,sizeof(nModX)); - n = sendDataOnly(file_des,&nModY,sizeof(nModY)); - n = sendDataOnly(file_des,&dynamicRange,sizeof(dynamicRange)); - n = sendDataOnly(file_des,&dataBytes,sizeof(dataBytes)); - t=setSettings(GET_SETTINGS,-1); - n = sendDataOnly(file_des,&t,sizeof(t)); -/* thr=getThresholdEnergy(); + int ret=OK; + enum detectorSettings t; + int n;//int thr, n; + //int it; + int64_t retval, tns=-1; + n = sendDataOnly(file_des,lastClientIP,sizeof(lastClientIP)); + n = sendDataOnly(file_des,&nModX,sizeof(nModX)); + n = sendDataOnly(file_des,&nModY,sizeof(nModY)); + n = sendDataOnly(file_des,&dynamicRange,sizeof(dynamicRange)); + n = sendDataOnly(file_des,&dataBytes,sizeof(dataBytes)); + t=setSettings(GET_SETTINGS,-1); + n = sendDataOnly(file_des,&t,sizeof(t)); + /* thr=getThresholdEnergy(); n = sendDataOnly(file_des,&thr,sizeof(thr));*/ - retval=setFrames(tns); - n = sendDataOnly(file_des,&retval,sizeof(int64_t)); - retval=setExposureTime(tns); - n = sendDataOnly(file_des,&retval,sizeof(int64_t)); - retval=setPeriod(tns); - n = sendDataOnly(file_des,&retval,sizeof(int64_t)); - retval=setDelay(tns); - n = sendDataOnly(file_des,&retval,sizeof(int64_t)); - retval=setGates(tns); - n = sendDataOnly(file_des,&retval,sizeof(int64_t)); -/* retval=setProbes(tns); + retval=setFrames(tns); + n = sendDataOnly(file_des,&retval,sizeof(int64_t)); + retval=setExposureTime(tns); + n = sendDataOnly(file_des,&retval,sizeof(int64_t)); + retval=setPeriod(tns); + n = sendDataOnly(file_des,&retval,sizeof(int64_t)); + retval=setDelay(tns); + n = sendDataOnly(file_des,&retval,sizeof(int64_t)); + retval=setGates(tns); + n = sendDataOnly(file_des,&retval,sizeof(int64_t)); + /* retval=setProbes(tns); n = sendDataOnly(file_des,&retval,sizeof(int64_t));*/ - retval=setTrains(tns); - n = sendDataOnly(file_des,&retval,sizeof(int64_t)); + retval=setTrains(tns); + n = sendDataOnly(file_des,&retval,sizeof(int64_t)); - if (lockStatus==0) { - strcpy(lastClientIP,thisClientIP); - } + if (lockStatus==0) { + strcpy(lastClientIP,thisClientIP); + } + + return ret; - return ret; - } int update_client(int file_des) { - int ret=OK; + int ret=OK; + + sendDataOnly(file_des,&ret,sizeof(ret)); + return send_update(file_des); + - sendDataOnly(file_des,&ret,sizeof(ret)); - return send_update(file_des); - - } @@ -2934,7 +2583,7 @@ int load_image(int file_des) { int ret=OK; int n; enum imageType index; - short int ImageVals[N_CHAN*N_CHIP]; + short int ImageVals[NCHAN*NCHIP]; sprintf(mess,"Loading image failed\n"); @@ -2965,7 +2614,7 @@ int load_image(int file_des) { printf("Unknown index %d\n",index); sprintf(mess,"Unknown index %d\n",index); ret=FAIL; - break; + break; } if (ret==OK) { @@ -3002,44 +2651,44 @@ int load_image(int file_des) { int set_master(int file_des) { - enum masterFlags retval=GET_MASTER; - enum masterFlags arg; - int n; - int ret=OK; - // int regret=OK; + enum masterFlags retval=GET_MASTER; + enum masterFlags arg; + int n; + int ret=OK; + // int regret=OK; - sprintf(mess,"can't set master flags\n"); + sprintf(mess,"can't set master flags\n"); - n = receiveDataOnly(file_des,&arg,sizeof(arg)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } + n = receiveDataOnly(file_des,&arg,sizeof(arg)); + if (n < 0) { + sprintf(mess,"Error reading from socket\n"); + ret=FAIL; + } #ifdef VERBOSE - printf("setting master flags to %d\n",arg); + printf("setting master flags to %d\n",arg); #endif - if (differentClients==1 && lockStatus==1 && arg!=GET_READOUT_FLAGS) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - } else { - retval=setMaster(arg); + if (differentClients==1 && lockStatus==1 && arg!=GET_READOUT_FLAGS) { + ret=FAIL; + sprintf(mess,"Detector locked by %s\n",lastClientIP); + } else { + retval=setMaster(arg); - } - if (retval==GET_MASTER) { - ret=FAIL; - } - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==FAIL) { - n = sendDataOnly(file_des,mess,sizeof(mess)); - } else { - n = sendDataOnly(file_des,&retval,sizeof(retval)); - } - return ret; + } + if (retval==GET_MASTER) { + ret=FAIL; + } + n = sendDataOnly(file_des,&ret,sizeof(ret)); + if (ret==FAIL) { + n = sendDataOnly(file_des,mess,sizeof(mess)); + } else { + n = sendDataOnly(file_des,&retval,sizeof(retval)); + } + return ret; } @@ -3049,43 +2698,43 @@ int set_master(int file_des) { int set_synchronization(int file_des) { - enum synchronizationMode retval=GET_MASTER; - enum synchronizationMode arg; - int n; - int ret=OK; - //int regret=OK; + enum synchronizationMode retval=GET_MASTER; + enum synchronizationMode arg; + int n; + int ret=OK; + //int regret=OK; - sprintf(mess,"can't set synchronization mode\n"); + sprintf(mess,"can't set synchronization mode\n"); - n = receiveDataOnly(file_des,&arg,sizeof(arg)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } + n = receiveDataOnly(file_des,&arg,sizeof(arg)); + if (n < 0) { + sprintf(mess,"Error reading from socket\n"); + ret=FAIL; + } #ifdef VERBOSE - printf("setting master flags to %d\n",arg); + printf("setting master flags to %d\n",arg); #endif - if (differentClients==1 && lockStatus==1 && arg!=GET_READOUT_FLAGS) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - } else { - //ret=setStoreInRAM(0); - // initChipWithProbes(0,0,0, ALLMOD); - retval=setSynchronization(arg); - } - if (retval==GET_SYNCHRONIZATION_MODE) { - ret=FAIL; - } - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==FAIL) { - n = sendDataOnly(file_des,mess,sizeof(mess)); - } else { - n = sendDataOnly(file_des,&retval,sizeof(retval)); - } - return ret; + if (differentClients==1 && lockStatus==1 && arg!=GET_READOUT_FLAGS) { + ret=FAIL; + sprintf(mess,"Detector locked by %s\n",lastClientIP); + } else { + //ret=setStoreInRAM(0); + // initChipWithProbes(0,0,0, ALLMOD); + retval=setSynchronization(arg); + } + if (retval==GET_SYNCHRONIZATION_MODE) { + ret=FAIL; + } + n = sendDataOnly(file_des,&ret,sizeof(ret)); + if (ret==FAIL) { + n = sendDataOnly(file_des,mess,sizeof(mess)); + } else { + n = sendDataOnly(file_des,&retval,sizeof(retval)); + } + return ret; } @@ -3099,7 +2748,7 @@ int read_counter_block(int file_des) { int n; int startACQ; //char *retval=NULL; - short int CounterVals[N_CHAN*N_CHIP]; + short int CounterVals[NCHAN*NCHIP]; sprintf(mess,"Read counter block failed\n"); @@ -3189,31 +2838,13 @@ int reset_counter_block(int file_des) { int start_receiver(int file_des) { - int ret=OK; - int n=0; - strcpy(mess,"Could not start receiver\n"); - - /* execute action if the arguments correctly arrived*/ -#ifdef MCB_FUNCS - if (lockStatus==1 && differentClients==1){//necessary??? - sprintf(mess,"Detector locked by %s\n", lastClientIP); - ret=FAIL; - } - else - ret = startReceiver(1); - -#endif - - - if(ret==OK && differentClients){ - printf("Force update\n"); - ret=FORCE_UPDATE; - } + int ret=FAIL; + int n; + strcpy(mess,"Not implemented for this detector\n"); /* send answer */ n = sendDataOnly(file_des,&ret,sizeof(ret)); - if(ret==FAIL) - n = sendDataOnly(file_des,mess,sizeof(mess)); + n = sendDataOnly(file_des,mess,sizeof(mess)); /*return ok/fail*/ return ret; } @@ -3224,32 +2855,13 @@ int start_receiver(int file_des) { int stop_receiver(int file_des) { - int ret=OK; - int n=0; - - strcpy(mess,"Could not stop receiver\n"); - - /* execute action if the arguments correctly arrived*/ -#ifdef MCB_FUNCS - if (lockStatus==1 && differentClients==1){//necessary??? - sprintf(mess,"Detector locked by %s\n", lastClientIP); - ret=FAIL; - } - else - ret=startReceiver(0); - -#endif - - - if(ret==OK && differentClients){ - printf("Force update\n"); - ret=FORCE_UPDATE; - } + int ret = FAIL; + int n; + strcpy(mess,"Not implemented for this detector\n"); /* send answer */ n = sendDataOnly(file_des,&ret,sizeof(ret)); - if(ret==FAIL) - n = sendDataOnly(file_des,mess,sizeof(mess)); + n = sendDataOnly(file_des,mess,sizeof(mess)); /*return ok/fail*/ return ret; } @@ -3301,7 +2913,7 @@ int calibrate_pedestal(int file_des){ int set_ctb_pattern(int file_des){ - int ret=OK;//FAIL; + int ret=OK;//FAIL; int retval=-1; int n; int mode; @@ -3312,146 +2924,146 @@ int set_ctb_pattern(int file_des){ sprintf(mess,"Could not set pattern\n"); - n = receiveDataOnly(file_des,&mode,sizeof(mode)); + n = receiveDataOnly(file_des,&mode,sizeof(mode)); printf("pattern mode is %d\n",mode); switch (mode) { case 0: //sets word - n = receiveDataOnly(file_des,&addr,sizeof(addr)); - n = receiveDataOnly(file_des,&word,sizeof(word)); - ret=OK; + n = receiveDataOnly(file_des,&addr,sizeof(addr)); + n = receiveDataOnly(file_des,&word,sizeof(word)); + ret=OK; - switch (addr) { - case -1: - retval64=writePatternIOControl(word); - break; - case -2: - retval64=writePatternClkControl(word); - break; - default: - retval64=writePatternWord(addr,word); - }; + switch (addr) { + case -1: + retval64=writePatternIOControl(word); + break; + case -2: + retval64=writePatternClkControl(word); + break; + default: + retval64=writePatternWord(addr,word); + }; - //write word; - //@param addr address of the word, -1 is I/O control register, -2 is clk control register - //@param word 64bit word to be written, -1 gets - - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==FAIL) - n += sendDataOnly(file_des,mess,sizeof(mess)); - else - n += sendDataOnly(file_des,&retval64,sizeof(retval64)); - break; + //write word; + //@param addr address of the word, -1 is I/O control register, -2 is clk control register + //@param word 64bit word to be written, -1 gets - case 1: //pattern loop - n = receiveDataOnly(file_des,&level,sizeof(level)); - n = receiveDataOnly(file_des,&start,sizeof(start)); - n = receiveDataOnly(file_des,&stop,sizeof(stop)); - n = receiveDataOnly(file_des,&nl,sizeof(nl)); - + n = sendDataOnly(file_des,&ret,sizeof(ret)); + if (ret==FAIL) + n += sendDataOnly(file_des,mess,sizeof(mess)); + else + n += sendDataOnly(file_des,&retval64,sizeof(retval64)); + break; + + case 1: //pattern loop + n = receiveDataOnly(file_des,&level,sizeof(level)); + n = receiveDataOnly(file_des,&start,sizeof(start)); + n = receiveDataOnly(file_des,&stop,sizeof(stop)); + n = receiveDataOnly(file_des,&nl,sizeof(nl)); - printf("level %d start %x stop %x nl %d\n",level, start, stop, nl); - /** Sets the pattern or loop limits in the CTB + + printf("level %d start %x stop %x nl %d\n",level, start, stop, nl); + /** Sets the pattern or loop limits in the CTB @param level -1 complete pattern, 0,1,2, loop level @param start start address if >=0 @param stop stop address if >=0 @param n number of loops (if level >=0) @returns OK/FAIL - */ - ret=setPatternLoop(level, &start, &stop, &nl); - - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==FAIL) - n += sendDataOnly(file_des,mess,sizeof(mess)); - else { - n += sendDataOnly(file_des,&start,sizeof(start)); - n += sendDataOnly(file_des,&stop,sizeof(stop)); - n += sendDataOnly(file_des,&nl,sizeof(nl)); - } - break; + */ + ret=setPatternLoop(level, &start, &stop, &nl); + + n = sendDataOnly(file_des,&ret,sizeof(ret)); + if (ret==FAIL) + n += sendDataOnly(file_des,mess,sizeof(mess)); + else { + n += sendDataOnly(file_des,&start,sizeof(start)); + n += sendDataOnly(file_des,&stop,sizeof(stop)); + n += sendDataOnly(file_des,&nl,sizeof(nl)); + } + break; - case 2: //wait address - n = receiveDataOnly(file_des,&level,sizeof(level)); - n = receiveDataOnly(file_des,&addr,sizeof(addr)); + case 2: //wait address + n = receiveDataOnly(file_des,&level,sizeof(level)); + n = receiveDataOnly(file_des,&addr,sizeof(addr)); - - /** Sets the wait address in the CTB + + /** Sets the wait address in the CTB @param level 0,1,2, wait level @param addr wait address, -1 gets @returns actual value - */ - printf("wait addr %d %x\n",level, addr); - retval=setPatternWaitAddress(level,addr); - printf("ret: wait addr %d %x\n",level, retval); - ret=OK; - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==FAIL) - n += sendDataOnly(file_des,mess,sizeof(mess)); - else { - n += sendDataOnly(file_des,&retval,sizeof(retval)); + */ + printf("wait addr %d %x\n",level, addr); + retval=setPatternWaitAddress(level,addr); + printf("ret: wait addr %d %x\n",level, retval); + ret=OK; + n = sendDataOnly(file_des,&ret,sizeof(ret)); + if (ret==FAIL) + n += sendDataOnly(file_des,mess,sizeof(mess)); + else { + n += sendDataOnly(file_des,&retval,sizeof(retval)); - } - - - break; + } - case 3: //wait time - n = receiveDataOnly(file_des,&level,sizeof(level)); - n = receiveDataOnly(file_des,&t,sizeof(t)); + break; - /** Sets the wait time in the CTB + case 3: //wait time + n = receiveDataOnly(file_des,&level,sizeof(level)); + n = receiveDataOnly(file_des,&t,sizeof(t)); + + + /** Sets the wait time in the CTB @param level 0,1,2, wait level @param t wait time, -1 gets @returns actual value - */ + */ - ret=OK; + ret=OK; - retval64=setPatternWaitTime(level,t); + retval64=setPatternWaitTime(level,t); - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==FAIL) - n += sendDataOnly(file_des,mess,sizeof(mess)); - else - n += sendDataOnly(file_des,&retval64,sizeof(retval64)); + n = sendDataOnly(file_des,&ret,sizeof(ret)); + if (ret==FAIL) + n += sendDataOnly(file_des,mess,sizeof(mess)); + else + n += sendDataOnly(file_des,&retval64,sizeof(retval64)); - break; + break; - case 4: - n = receiveDataOnly(file_des,pat,sizeof(pat)); - for (addr=0; addr<1024; addr++) - writePatternWord(addr,word); - ret=OK; - retval=0; - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==FAIL) - n += sendDataOnly(file_des,mess,sizeof(mess)); - else - n += sendDataOnly(file_des,&retval64,sizeof(retval64)); + case 4: + n = receiveDataOnly(file_des,pat,sizeof(pat)); + for (addr=0; addr<1024; addr++) + writePatternWord(addr,word); + ret=OK; + retval=0; + n = sendDataOnly(file_des,&ret,sizeof(ret)); + if (ret==FAIL) + n += sendDataOnly(file_des,mess,sizeof(mess)); + else + n += sendDataOnly(file_des,&retval64,sizeof(retval64)); - break; - - + break; - default: - ret=FAIL; - printf(mess); - sprintf(mess,"%s - wrong mode %d\n",mess, mode); - n = sendDataOnly(file_des,&ret,sizeof(ret)); - n += sendDataOnly(file_des,mess,sizeof(mess)); - - + + + default: + ret=FAIL; + printf(mess); + sprintf(mess,"%s - wrong mode %d\n",mess, mode); + n = sendDataOnly(file_des,&ret,sizeof(ret)); + n += sendDataOnly(file_des,mess,sizeof(mess)); + + } @@ -3463,63 +3075,63 @@ int set_ctb_pattern(int file_des){ int write_adc_register(int file_des) { - int retval; - int ret=OK; - int arg[2]; - int addr, val; - int n; + int retval; + int ret=OK; + int arg[2]; + int addr, val; + int n; - sprintf(mess,"Can't write to register\n"); + sprintf(mess,"Can't write to register\n"); - n = receiveDataOnly(file_des,arg,sizeof(arg)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - addr=arg[0]; - val=arg[1]; + n = receiveDataOnly(file_des,arg,sizeof(arg)); + if (n < 0) { + sprintf(mess,"Error reading from socket\n"); + ret=FAIL; + } + addr=arg[0]; + val=arg[1]; #ifdef VERBOSE - printf("writing to register 0x%x data 0x%x\n", addr, val); + printf("writing to register 0x%x data 0x%x\n", addr, val); #endif - if (differentClients==1 && lockStatus==1) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - } + if (differentClients==1 && lockStatus==1) { + ret=FAIL; + sprintf(mess,"Detector locked by %s\n",lastClientIP); + } - if(ret!=FAIL){ - ret=writeADC(addr,val); - if (ret==OK) - retval=val; - } - + if(ret!=FAIL){ + ret=writeADC(addr,val); + if (ret==OK) + retval=val; + } + #ifdef VERBOSE - printf("Data set to 0x%x\n", retval); + printf("Data set to 0x%x\n", retval); #endif - if (retval==val) { - ret=OK; - if (differentClients) - ret=FORCE_UPDATE; - } else { - ret=FAIL; - sprintf(mess,"Writing to register 0x%x failed: wrote 0x%x but read 0x%x\n", addr, val, retval); - } + if (retval==val) { + ret=OK; + if (differentClients) + ret=FORCE_UPDATE; + } else { + ret=FAIL; + sprintf(mess,"Writing to register 0x%x failed: wrote 0x%x but read 0x%x\n", addr, val, retval); + } - /* send answer */ - /* send OK/failed */ - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret!=FAIL) { - /* send return argument */ - n += sendDataOnly(file_des,&retval,sizeof(retval)); - } else { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } + /* send answer */ + /* send OK/failed */ + n = sendDataOnly(file_des,&ret,sizeof(ret)); + if (ret!=FAIL) { + /* send return argument */ + n += sendDataOnly(file_des,&retval,sizeof(retval)); + } else { + n += sendDataOnly(file_des,mess,sizeof(mess)); + } - /*return ok/fail*/ - return ret; + /*return ok/fail*/ + return ret; } @@ -3532,8 +3144,6 @@ int program_fpga(int file_des) { int n; const size_t maxprogramsize = 2 * 1024 *1024; size_t unitprogramsize = 0; - int currentPointer = 0; - char* fpgasrc = (char*)malloc(maxprogramsize); size_t filesize = 0; size_t totalsize = 0; diff --git a/slsDetectorSoftware/jungfrauDetectorServer/server_funcs.h b/slsDetectorSoftware/jungfrauDetectorServer/server_funcs.h index 154022e75..395f6f02c 100755 --- a/slsDetectorSoftware/jungfrauDetectorServer/server_funcs.h +++ b/slsDetectorSoftware/jungfrauDetectorServer/server_funcs.h @@ -23,7 +23,7 @@ int sockfd; int function_table(); int decode_function(int); -int init_detector(int,int); +int init_detector(int); int M_nofunc(int); int exit_server(int); diff --git a/slsDetectorSoftware/jungfrauDetectorServer/sharedmemory.c b/slsDetectorSoftware/jungfrauDetectorServer/sharedmemory.c deleted file mode 100755 index 4504cfe05..000000000 --- a/slsDetectorSoftware/jungfrauDetectorServer/sharedmemory.c +++ /dev/null @@ -1,39 +0,0 @@ -#include "sharedmemory.h" - -struct statusdata *stdata; - -int inism(int clsv) { - -static int scansmid; - - if (clsv==SMSV) { - if ( (scansmid=shmget(SMKEY,1024,IPC_CREAT | 0666 ))==-1 ) { - return -1; - } - if ( (stdata=shmat(scansmid,NULL,0))==(void*)-1) { - return -2; - } - } - - if (clsv==SMCL) { - if ( (scansmid=shmget(SMKEY,0,0) )==-1 ) { - return -3; - } - if ( (stdata=shmat(scansmid,NULL,0))==(void*)-1) { - return -4; - } - } - return 1; -} - -void write_status_sm(char *status) { - strcpy(stdata->status,status); -} - -void write_stop_sm(int v) { - stdata->stop=v; -} - -void write_runnumber_sm(int v) { - stdata->runnumber=v; -} diff --git a/slsDetectorSoftware/jungfrauDetectorServer/sharedmemory.h b/slsDetectorSoftware/jungfrauDetectorServer/sharedmemory.h deleted file mode 100755 index bdbddf719..000000000 --- a/slsDetectorSoftware/jungfrauDetectorServer/sharedmemory.h +++ /dev/null @@ -1,48 +0,0 @@ -#ifndef SM -#define SM - -#include "sls_detector_defs.h" - -#include -#include -#include -#include -#include -#include -#include -//#include -#include -#include -#include -#include -#include -#include - - -#include - -#include -#include - -/* key for shared memory */ -#define SMKEY 10001 - -#define SMSV 1 -#define SMCL 2 - - -struct statusdata { - int runnumber; - int stop; - char status[20]; -} ; - - -/* for shared memory */ - -int inism(int clsv); -void write_status_sm(char *status); -void write_stop_sm(int v); -void write_runnumber_sm(int v); - -#endif