From 36177f7b82dad5610df5a24b570da455f7d270fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torsten=20B=C3=B6gershausen?= Date: Tue, 4 Dec 2018 08:36:20 +0100 Subject: [PATCH 01/54] motorRecord.cc: Add ACCS field The problem: When a user changes the velocity by writing to the VELO field, but forgets to write to the ACCL field, the acceleration will change and may be too high. (Note: Many users are not aware of this side-effect). Solution: Introduce a field called ACCS, "Acceleration in seconds^2". Once the field is written, the ACCL field is updated and the acceleration is "locked". It is locked for changes of VELO. It can be be unlocked by writing to ACCL. If the acceleration is locked (or not) is stored in the field ACCU, which can be either "motorACCSused_Accl" or "motorACCSused_Accs". And in this sense ACCU is not a lock, but just keeps track which of the accelation fields ACCL or ACCS has been updated last, and should be used in the next movement. In any case an update to ACCS updated ACCL and the other way around. Thanks to Mark Rivers for this nice idea. --- docs/motorRecord.html | 13 ++++- motorApp/MotorSrc/motorRecord.cc | 90 ++++++++++++++++++++++++++++++- motorApp/MotorSrc/motorRecord.dbd | 17 ++++++ 3 files changed, 116 insertions(+), 4 deletions(-) diff --git a/docs/motorRecord.html b/docs/motorRecord.html index df4721b9..e0902527 100644 --- a/docs/motorRecord.html +++ b/docs/motorRecord.html @@ -242,6 +242,14 @@ below. DOUBLE acceleration time + + ACCS + R/W + Acceleration (EGU/s^2) + DOUBLE +
+ + ADEL R/W @@ -1675,7 +1683,8 @@ below. The motor record expects the hardware to produce a trapezoidal speed profile. That is, the motor speed is expected to increase linearly with time from the base speed, VBAS, to the full speed, VELO, in ACCL seconds. At the - end of a motion, the speed is expected to decrease similarly to VBAS.  + end of a motion, the speed is expected to decrease similarly to VBAS. + Note that the ACCS field can be use to specify the acceleration in EGU/s^2.  JVEL @@ -2329,7 +2338,7 @@ below. When one of these fields is set to 1, the record will immediately reset it to 0, and the motor will move (with backlash takeout if BDST is nonzero) by a distance TWV (in user coordinates) at the acceleration - specified by ACCL and at speed VELO. + specified by ACCL/ACCS and at speed VELO. TWV diff --git a/motorApp/MotorSrc/motorRecord.cc b/motorApp/MotorSrc/motorRecord.cc index 0129b879..4ddbeba4 100644 --- a/motorApp/MotorSrc/motorRecord.cc +++ b/motorApp/MotorSrc/motorRecord.cc @@ -475,6 +475,83 @@ static void callbackFunc(struct callback *pcb) } +static double accEGUfromVelo(motorRecord *pmr, double veloEGU) +{ + double vmin = pmr->vbas; + double vmax = fabs(veloEGU); + double acc; + /* ACCL or ACCS */ + if (pmr->accu == motorACCSused_Accs) + acc = pmr->accs; + else if (vmax > vmin) + acc = (vmax - vmin) / pmr->accl; + else + acc = vmax / pmr->accl; + + return acc; +} + +static void updateACCLfromACCS(motorRecord *pmr) +{ + if (pmr->accu != motorACCSused_Accs) + { + pmr->accu = motorACCSused_Accs; + db_post_events(pmr, &pmr->accu, DBE_VAL_LOG); + } + if (pmr->accs > 0.0) + { + double temp_dbl = pmr->velo / pmr->accs; + if (pmr->accl != temp_dbl) + { + pmr->accl = temp_dbl; + db_post_events(pmr, &pmr->accl, DBE_VAL_LOG); + } + } +} + +static void updateACCSfromACCL(motorRecord *pmr) +{ + double temp_dbl; + if (pmr->accu != motorACCSused_Accl) + { + pmr->accu = motorACCSused_Accl; + db_post_events(pmr, &pmr->accu, DBE_VAL_LOG); + } + temp_dbl = pmr->velo / pmr->accl; + if (pmr->accs != temp_dbl) + { + pmr->accs = temp_dbl; + db_post_events(pmr, &pmr->accs, DBE_VAL_LOG); + } +} + +static void updateACCL_ACCSfromVELO(motorRecord *pmr) +{ + if (pmr->accu == motorACCSused_Accs) + { + if (pmr->accs > 0.0) + { + double temp_dbl = pmr->velo / pmr->accs; + if (pmr->accl != temp_dbl) + { + pmr->accl = temp_dbl; + db_post_events(pmr, &pmr->accl, DBE_VAL_LOG); + } + } + } + else + { + double temp_dbl = pmr->velo / pmr->accl; + if (pmr->accs != temp_dbl) + { + pmr->accs = temp_dbl; + db_post_events(pmr, &pmr->accs, DBE_VAL_LOG); + } + } +} + + + /****************************************************************************** enforceMinRetryDeadband() @@ -859,7 +936,7 @@ static long postProcess(motorRecord * pmr) if (pmr->mip & MIP_JOG_STOP) { - double acc = (vel - vbase) > 0 ? ((vel - vbase)/ pmr->accl) : (vel / pmr->accl); + double acc = accEGUfromVelo(pmr, pmr->velo); if (vel <= vbase) vel = vbase + 1; @@ -2190,7 +2267,7 @@ static RTN_STATUS do_work(motorRecord * pmr, CALLBACK_VALUE proc_ind) double newpos = pmr->dval / pmr->mres; /* where to go */ double vbase = pmr->vbas / fabs(pmr->mres); /* base speed */ double vel = pmr->velo / fabs(pmr->mres); /* normal speed */ - double acc = (vel - vbase) > 0 ? ((vel - vbase) / pmr->accl) : (vel / pmr->accl); /* normal accel. */ + double acc = accEGUfromVelo(pmr, pmr->velo); /* * 'bpos' is one backlash distance away from 'newpos'. */ @@ -2595,6 +2672,7 @@ static long special(DBADDR *paddr, int after) /* new velo: make s agree */ case motorRecordVELO: range_check(pmr, &pmr->velo, pmr->vbas, pmr->vmax); + updateACCL_ACCSfromVELO(pmr); if ((pmr->urev != 0.0) && (pmr->s != (temp_dbl = pmr->velo / fabs_urev))) { @@ -2612,6 +2690,7 @@ static long special(DBADDR *paddr, int after) pmr->velo = temp_dbl; db_post_events(pmr, &pmr->velo, DBE_VAL_LOG); } + updateACCL_ACCSfromVELO(pmr); break; /* new bvel: make sbak agree */ @@ -2643,6 +2722,13 @@ static long special(DBADDR *paddr, int after) pmr->accl = 0.1; db_post_events(pmr, &pmr->accl, DBE_VAL_LOG); } + updateACCSfromACCL(pmr); + break; + + /* new accs */ + case motorRecordACCS: + db_post_events(pmr, &pmr->accs, DBE_VAL_LOG); + updateACCLfromACCS(pmr); break; /* new bacc */ diff --git a/motorApp/MotorSrc/motorRecord.dbd b/motorApp/MotorSrc/motorRecord.dbd index aa455cba..64c7bd13 100644 --- a/motorApp/MotorSrc/motorRecord.dbd +++ b/motorApp/MotorSrc/motorRecord.dbd @@ -69,6 +69,11 @@ menu(motorRMOD) { choice(motorRMOD_I,"In-Position") } +menu(motorACCSused) { + choice(motorACCSused_Accl, "Accl") + choice(motorACCSused_Accs, "Accs") +} + include "menuOmsl.dbd" recordtype(motor) { @@ -173,6 +178,18 @@ recordtype(motor) { interest(1) initial("0.2") } + field(ACCS,DBF_DOUBLE) { + prompt("Move Accel. (EGU/s^2)") + promptgroup(GUI_COMMON) + special(SPC_MOD) + interest(1) + } + field(ACCU,DBF_MENU) { + initial("Default") + prompt("ACCS used") + special(SPC_NOMOD) + menu(motorACCSused) + } field(BDST,DBF_DOUBLE) { prompt("BL Distance (EGU)") asl(ASL0) From 7b87f3b9b609ee4b070ef2efe0f78e158bd701f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torsten=20B=C3=B6gershausen?= Date: Tue, 4 Dec 2018 10:47:39 +0100 Subject: [PATCH 02/54] motorRecord: Handle ACCS != 0.0 in init_record When a database wants to use ACCS from the start, when the record is loaded into the IOC, the init_record() function needs to look at it. The new way is to set ACCS != 0.0 and ACCL == 0.0 and then ACCS takes over. The compatible (call it old ?) way is to have ACCS == 0.0, and then ACCL is used. --- motorApp/MotorSrc/motorRecord.cc | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/motorApp/MotorSrc/motorRecord.cc b/motorApp/MotorSrc/motorRecord.cc index 4ddbeba4..8ae0e92b 100644 --- a/motorApp/MotorSrc/motorRecord.cc +++ b/motorApp/MotorSrc/motorRecord.cc @@ -3999,6 +3999,14 @@ static void check_speed_and_resolution(motorRecord * pmr) db_post_events(pmr, &pmr->sbak, DBE_VAL_LOG); db_post_events(pmr, &pmr->bvel, DBE_VAL_LOG); + if (pmr->accs && !pmr->accl) + { + /* ACCL == 0.0, ACCS is != 0.0 -> Use ACCS + This is a (possible) new way to configure a database. + Existing Db files will have ACCS == 0.0 and this + is backwards compatibleamd behaves as before */ + updateACCLfromACCS(pmr); + } /* Sanity check on acceleration time. */ if (pmr->accl == 0.0) { From 8d1891c5a7510391a68dd4a535260c133c2b92ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torsten=20B=C3=B6gershausen?= Date: Tue, 8 Jan 2019 10:40:30 +0100 Subject: [PATCH 03/54] motorRecord.cc: Make sure that ACCS/ACCU are initialized When the record is initialized, it could happen that the ACCS field was not initalized at all. Fix this: - Introduce a new value for motorACCSused, motorACCSused_Undef. This is == 0, and temporally used until the record is initilized. Using 0 as Undef will allow a (mis-) use in e.g. CSS to make the ACCS field invisable, whe ACCU is 0 (or not present at all in an older version of the motorRecord) - At the end of check_speed_and_resolution() set ACCS and ACCU, if needed. --- motorApp/MotorSrc/motorRecord.cc | 5 +++++ motorApp/MotorSrc/motorRecord.dbd | 1 + 2 files changed, 6 insertions(+) diff --git a/motorApp/MotorSrc/motorRecord.cc b/motorApp/MotorSrc/motorRecord.cc index 8ae0e92b..3c806bf9 100644 --- a/motorApp/MotorSrc/motorRecord.cc +++ b/motorApp/MotorSrc/motorRecord.cc @@ -4032,6 +4032,11 @@ static void check_speed_and_resolution(motorRecord * pmr) pmr->hvel = pmr->vbas; else range_check(pmr, &pmr->hvel, pmr->vbas, pmr->vmax); + /* Make sure that ACCS/ACCU are initialized */ + if (pmr->accu == motorACCSused_Undef) + { + updateACCSfromACCL(pmr); + } } /* diff --git a/motorApp/MotorSrc/motorRecord.dbd b/motorApp/MotorSrc/motorRecord.dbd index 64c7bd13..101e468f 100644 --- a/motorApp/MotorSrc/motorRecord.dbd +++ b/motorApp/MotorSrc/motorRecord.dbd @@ -70,6 +70,7 @@ menu(motorRMOD) { } menu(motorACCSused) { + choice(motorACCSused_Undef,"Undef") choice(motorACCSused_Accl, "Accl") choice(motorACCSused_Accs, "Accs") } From 02368bc98539749e037bb89c7e0d96b2d8955739 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torsten=20B=C3=B6gershausen?= Date: Thu, 10 Jan 2019 13:00:25 +0100 Subject: [PATCH 04/54] motorRecord.dbd: ACCU field should have "intial=Default" When the dbd file was loaded, EPICS base complained with "Error initializing motor.ACCU initial Default" Remove the 'initial("Default")' for the ACCU field. --- motorApp/MotorSrc/motorRecord.dbd | 1 - 1 file changed, 1 deletion(-) diff --git a/motorApp/MotorSrc/motorRecord.dbd b/motorApp/MotorSrc/motorRecord.dbd index 101e468f..06c64979 100644 --- a/motorApp/MotorSrc/motorRecord.dbd +++ b/motorApp/MotorSrc/motorRecord.dbd @@ -186,7 +186,6 @@ recordtype(motor) { interest(1) } field(ACCU,DBF_MENU) { - initial("Default") prompt("ACCS used") special(SPC_NOMOD) menu(motorACCSused) From 90643807f324599bcdcbc89a74bba51ca915d214 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torsten=20B=C3=B6gershausen?= Date: Tue, 11 Aug 2020 14:00:06 +0200 Subject: [PATCH 05/54] devMotorAsyn: remove initEvent in init_record() When the motorRecord is initialized, init_record() is called. For asynMotors init_record() calls init_controller() in devMotorAsyn.c From here, the encoder ratio is send to the driver. After doing that, the code "locks" the execution waiting for a callback to call epicsEventSignal(pPvt->initEvent) which "unlocks" the code. As Mark Clift points out, this code can be simplified and the initEvent can be removed. Mark Rivers suggested to use the asynFloat64SyncIO interface, which locks the asyn port when calling the driver. --- motorApp/MotorSrc/devMotorAsyn.c | 54 +++++++++++++++++--------------- 1 file changed, 29 insertions(+), 25 deletions(-) diff --git a/motorApp/MotorSrc/devMotorAsyn.c b/motorApp/MotorSrc/devMotorAsyn.c index aa02f9e2..79ad5ea8 100644 --- a/motorApp/MotorSrc/devMotorAsyn.c +++ b/motorApp/MotorSrc/devMotorAsyn.c @@ -55,6 +55,7 @@ #include #include +#include #include #include #include @@ -137,6 +138,7 @@ typedef struct double param; int needUpdate; asynUser *pasynUser; + asynUser *pasynUserSync; asynInt32 *pasynInt32; void *asynInt32Pvt; asynFloat64 *pasynFloat64; @@ -148,7 +150,6 @@ typedef struct asynGenericPointer *pasynGenericPointer; void *asynGenericPointerPvt; void *registrarPvt; - epicsEventId initEvent; int driverReasons[NUM_MOTOR_COMMANDS]; } motorAsynPvt; @@ -170,16 +171,23 @@ static void init_controller(struct motorRecord *pmr, asynUser *pasynUser ) motorAsynPvt *pPvt = (motorAsynPvt *)pmr->dpvt; double position = pPvt->status.position; double rdbd = (fabs(pmr->rdbd) < fabs(pmr->mres) ? fabs(pmr->mres) : fabs(pmr->rdbd) ); - double encRatio[2] = {pmr->mres, pmr->eres}; int use_rel = (pmr->rtry != 0 && pmr->rmod != motorRMOD_I && (pmr->ueip || pmr->urip)); int dval_non_zero_pos_near_zero = (fabs(pmr->dval) > rdbd) && (pmr->mres != 0) && (fabs(position * pmr->mres) < rdbd); + epicsFloat64 eratio = pmr->mres / pmr->eres; int initPos = 0; + int status; - /*Before setting position, set the correct encoder ratio.*/ - start_trans(pmr); - build_trans(SET_ENC_RATIO, encRatio, pmr); - end_trans(pmr); + /* Write encoder ratio to the driver.*/ + pPvt->pasynUserSync->reason = pPvt->driverReasons[motorEncRatio]; + status = pasynFloat64SyncIO->write(pPvt->pasynUserSync, eratio, pasynUser->timeout); + if (status) { + asynPrint(pasynUser, ASYN_TRACE_ERROR, + "devMotorAsyn::init_controller, %s failed to set encoder ratio to %f\n", pmr->name, eratio ); + } else { + asynPrint(pasynUser, ASYN_TRACE_FLOW, + "devMotorAsyn::init_controller, %s set encoder ratio to %f\n", pmr->name, eratio ); + } switch (pmr->rstm) { case motorRSTM_NearZero: @@ -202,15 +210,11 @@ static void init_controller(struct motorRecord *pmr, asynUser *pasynUser ) if (initPos) { double setPos = pmr->dval / pmr->mres; - epicsEventId initEvent = epicsEventCreate( epicsEventEmpty ); - RTN_STATUS rtnval; - pPvt->initEvent = initEvent; - - start_trans(pmr); - rtnval = build_trans(LOAD_POS, &setPos, pmr); - end_trans(pmr); - if (rtnval != OK) { + /* Write setPos to the driver */ + pPvt->pasynUserSync->reason = pPvt->driverReasons[motorPosition]; + status = pasynFloat64SyncIO->write(pPvt->pasynUserSync, setPos, pasynUser->timeout); + if (status) { asynPrint(pasynUser, ASYN_TRACE_ERROR, "devMotorAsyn::init_controller, %s failed to set position to %f\n", pmr->name, setPos ); @@ -219,13 +223,6 @@ static void init_controller(struct motorRecord *pmr, asynUser *pasynUser ) "devMotorAsyn::init_controller, %s set position to %f\n", pmr->name, setPos ); } - - if ( initEvent ) - { - epicsEventMustWait(initEvent); - epicsEventDestroy(initEvent); - pPvt->initEvent = 0; - } } else asynPrint(pasynUser, ASYN_TRACE_FLOW, @@ -307,6 +304,14 @@ static long init_record(struct motorRecord * pmr ) pPvt->pasynFloat64 = (asynFloat64 *)pasynInterface->pinterface; pPvt->asynFloat64Pvt = pasynInterface->drvPvt; + /* Initialize Float64 synchronous interface */ + status = pasynFloat64SyncIO->connect(port, signal, &pPvt->pasynUserSync, userParam); + if (status != asynSuccess) { + asynPrint(pasynUser, ASYN_TRACE_ERROR, + "devMotorAsyn::init_record, %s connect Float64SyncIO interface failed\n", pmr->name); + goto bad; + } + /* Get the asynDrvUser interface */ pasynInterface = pasynManager->findInterface(pasynUser, asynDrvUserType, 1); if (!pasynInterface) { asynPrint(pasynUser, ASYN_TRACE_ERROR, @@ -408,6 +413,9 @@ static long init_record(struct motorRecord * pmr ) * set, a callback will be generated */ + /* Finished using the Float64 SyncIO interface */ + pasynFloat64SyncIO->disconnect(pPvt->pasynUserSync); + /* Finally, indicate to the motor record that these values can be used. */ pasynManager->freeAsynUser(pasynUser); pPvt->needUpdate = 1; @@ -720,10 +728,6 @@ static void asynCallback(asynUser *pasynUser) "devMotorAsyn::asynCallback: %s error in freeAsynUser, %s\n", pmr->name, pasynUser->errorMessage); } - - if ( pPvt->initEvent && pmsg->command == motorPosition) { - epicsEventSignal( pPvt->initEvent ); - } } /** From 24a53e660e213ae6a57dc4d6f5648bed895ef85e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torsten=20B=C3=B6gershausen?= Date: Wed, 17 Nov 2021 08:39:26 +0100 Subject: [PATCH 06/54] motorRecord: Reset UEIP to No if no encoder is present When a database is loaded with UEIP=Yes and the controller says that there is no encoder present, reset UEIP to No --- motorApp/MotorSrc/motorRecord.cc | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/motorApp/MotorSrc/motorRecord.cc b/motorApp/MotorSrc/motorRecord.cc index 03d83c6d..4550d68e 100644 --- a/motorApp/MotorSrc/motorRecord.cc +++ b/motorApp/MotorSrc/motorRecord.cc @@ -3633,6 +3633,12 @@ static void process_motor_info(motorRecord * pmr, bool initcall) /* Calculate raw and dial readback values. */ msta.All = pmr->msta; + + if ((pmr->ueip == motorUEIP_Yes) && (!(msta.Bits.EA_PRESENT))) + { + pmr->ueip = motorUEIP_No; + db_post_events(pmr, &pmr->urip, DBE_VAL_LOG); + } if (pmr->ueip == motorUEIP_Yes) { /* An encoder is present and the user wants us to use it. */ From 524696a8d01675d6ecf25bdc036169997d0d6fbf Mon Sep 17 00:00:00 2001 From: Freddie Akeroyd Date: Fri, 26 Nov 2021 18:23:29 +0000 Subject: [PATCH 07/54] Fix negative backlash with relative moves in a negative direction A negative BDST was correctly applied to negative direction moves if moves are absolute. When retries are enabled all moves become relative and backlash was not applied correctly for negative direction moves. --- motorApp/MotorSrc/motorRecord.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/motorApp/MotorSrc/motorRecord.cc b/motorApp/MotorSrc/motorRecord.cc index 4550d68e..bcf629da 100644 --- a/motorApp/MotorSrc/motorRecord.cc +++ b/motorApp/MotorSrc/motorRecord.cc @@ -2410,7 +2410,7 @@ static RTN_STATUS do_work(motorRecord * pmr, CALLBACK_VALUE proc_ind) } /* IF move is in preferred direction, AND, current position is within backlash range. */ else if ((preferred_dir == true) && - ((use_rel == true && relbpos <= 1.0) || + ((use_rel == true && ((pmr->bdst >= 0 && relbpos <= 1.0) || (pmr->bdst < 0 && relbpos >= 1.0))) || (use_rel == false && (fabs(newpos - currpos) <= rbdst1)) ) ) From a5bf21c94eac3b3d5015368badc4ab023032a07b Mon Sep 17 00:00:00 2001 From: Kevin Peterson Date: Thu, 28 Apr 2022 14:55:43 -0500 Subject: [PATCH 08/54] Configured to build with github-actions --- .ci | 2 +- .ci-local/github-actions/post-prepare.py | 70 +++++++ .ci-local/github-actions/sanity-check.py | 9 + .ci-local/modules.set | 8 +- .github/workflows/ci-scripts-build-full.yml | 210 ++++++++++++++++++++ .github/workflows/ci-scripts-build.yml | 103 ++++++++++ README.md | 3 +- 7 files changed, 399 insertions(+), 6 deletions(-) create mode 100755 .ci-local/github-actions/post-prepare.py create mode 100644 .ci-local/github-actions/sanity-check.py create mode 100644 .github/workflows/ci-scripts-build-full.yml create mode 100644 .github/workflows/ci-scripts-build.yml diff --git a/.ci b/.ci index 12d76983..57646016 160000 --- a/.ci +++ b/.ci @@ -1 +1 @@ -Subproject commit 12d769835e1ee88e94b5b0b4bc0cf7068e678064 +Subproject commit 576460163031255c09948566dd2f2409d86ab8d4 diff --git a/.ci-local/github-actions/post-prepare.py b/.ci-local/github-actions/post-prepare.py new file mode 100755 index 00000000..7dccc497 --- /dev/null +++ b/.ci-local/github-actions/post-prepare.py @@ -0,0 +1,70 @@ +#!/usr/bin/env python + +import os +import shutil +import re + +# Setup ANSI Colors (copied from cue.py) +ANSI_RED = "\033[31;1m" +ANSI_GREEN = "\033[32;1m" +ANSI_YELLOW = "\033[33;1m" +ANSI_BLUE = "\033[34;1m" +ANSI_MAGENTA = "\033[35;1m" +ANSI_CYAN = "\033[36;1m" +ANSI_RESET = "\033[0m" +ANSI_CLEAR = "\033[0K" + +def cat(filename): + ''' + Print the contents of a file + ''' + with open(filename, 'r') as fh: + for line in fh: + print(line.strip()) + +def sanity_check(filename): + ''' + Include the contents of a file in the github-actions log + ''' + print("{}Contents of {}{}".format(ANSI_BLUE, filename, ANSI_RESET)) + cat(filename) + print("{}End of {}{}".format(ANSI_BLUE, filename, ANSI_RESET)) + +if 'HOME' in os.environ: + # Linux & OS X + cache_dir = os.path.join(os.environ['HOME'], ".cache") +else: + # Windows + cache_dir = os.path.join(os.environ['HOMEDRIVE'], os.environ['HOMEPATH'], ".cache") + +module_dir = os.getenv('GITHUB_WORKSPACE') + +# Copy the github-actions RELEASE.local to the configure dir +filename = "configure/RELEASE.local" +shutil.copy("{}/RELEASE.local".format(cache_dir), filename) + +# Get the variable from the example release file +example = "configure/EXAMPLE_RELEASE.local" +fh = open(example, "r") +lines = fh.readlines() +fh.close() +pObj = re.compile('(MOTOR_[^=]+)') +module_var = None +for line in lines: + mObj = pObj.match(line) + if mObj != None: + module_var = mObj.group() + break + +# Add the path to the driver module to the RELEASE.local file, since it is needed by the example IOC +fh = open(filename, "a") +fh.write("{}={}\n".format(module_var, module_dir)) +fh.close() +sanity_check(filename) + +# Enable the building of example IOCs +filename = "configure/CONFIG_SITE.local" +fh = open(filename, 'w') +fh.write("BUILD_IOCS = YES") +fh.close() +sanity_check(filename) diff --git a/.ci-local/github-actions/sanity-check.py b/.ci-local/github-actions/sanity-check.py new file mode 100644 index 00000000..4e32f6d3 --- /dev/null +++ b/.ci-local/github-actions/sanity-check.py @@ -0,0 +1,9 @@ +#!/usr/bin/env python + +import os +import pprint + +pprint.pprint(dict(os.environ), width = 1) + +#!print("{}", breakmehere) + diff --git a/.ci-local/modules.set b/.ci-local/modules.set index 9479f5db..8ccd765f 100644 --- a/.ci-local/modules.set +++ b/.ci-local/modules.set @@ -1,7 +1,7 @@ MODULES="sncseq ipac asyn autosave busy" -SNCSEQ=R2-2-8 +SNCSEQ=R2-2-9 IPAC=master -ASYN=R4-38 -AUTOSAVE=R5-9 -BUSY=R1-7-1 +ASYN=R4-42 +AUTOSAVE=R5-10-2 +BUSY=R1-7-3 diff --git a/.github/workflows/ci-scripts-build-full.yml b/.github/workflows/ci-scripts-build-full.yml new file mode 100644 index 00000000..707a4d5d --- /dev/null +++ b/.github/workflows/ci-scripts-build-full.yml @@ -0,0 +1,210 @@ +# .github/workflows/ci-scripts-build.yml for use with EPICS Base ci-scripts +# (see: https://github.com/epics-base/ci-scripts) + +# This is YAML - indentation levels are crucial + +# Set the 'name:' properties to values that work for you (MYMODULE) + +name: "GHA full build" + +# Only run manually +on: + workflow_dispatch + +env: + SETUP_PATH: .ci-local:.ci + # For the sequencer on Linux/Windows/MacOS + APT: re2c + CHOCO: re2c + BREW: re2c + +jobs: + build-base: + name: ${{ matrix.name }} + runs-on: ${{ matrix.os }} + # Set environment variables from matrix parameters + env: + CMP: ${{ matrix.cmp }} + BCFG: ${{ matrix.configuration }} + WINE: ${{ matrix.wine }} + RTEMS: ${{ matrix.rtems }} + RTEMS_TARGET: ${{ matrix.rtems_target }} + EXTRA: ${{ matrix.extra }} + TEST: ${{ matrix.test }} + SET: ${{ matrix.set }} + strategy: + fail-fast: false + matrix: + # Job names also name artifacts, character limitations apply + include: + - os: ubuntu-20.04 + cmp: gcc + configuration: default + wine: "64" + base: "7.0" + set: modules + name: "Ub-20 gcc-9 + MinGW" + + - os: ubuntu-20.04 + cmp: gcc + configuration: static + wine: "64" + base: "7.0" + set: modules + name: "Ub-20 gcc-9 + MinGW, static" + + - os: ubuntu-20.04 + cmp: gcc + configuration: static + extra: "CMD_CXXFLAGS=-std=c++11" + base: "7.0" + set: modules + name: "Ub-20 gcc-9 C++11, static" + + - os: ubuntu-20.04 + cmp: clang + configuration: default + extra: "CMD_CXXFLAGS=-std=c++11" + base: "7.0" + set: modules + name: "Ub-20 clang-10 C++11" + + ### fails building autosave + #!- os: ubuntu-20.04 + #! cmp: gcc + #! configuration: default + #! rtems: "4.10" + #! base: "7.0" + #! set: modules + #! name: "Ub-20 gcc-9 + RT-4.10" + + - os: ubuntu-20.04 + cmp: gcc + configuration: default + rtems: "4.9" + base: "7.0" + set: modules + name: "Ub-20 gcc-9 + RT-4.9" + + ### fails building asyn + #!- os: ubuntu-20.04 + #! cmp: gcc + #! configuration: default + #! rtems: "5" + #! rtems_target: RTEMS-pc686-qemu + #! base: "7.0" + #! set: modules + #! name: "Ub-20 gcc-9 + RT-5.1 pc686" + + ### fails building autosave + #!- os: ubuntu-20.04 + #! cmp: gcc + #! configuration: default + #! rtems: "5" + #! rtems_target: RTEMS-beatnik + #! test: NO + #! base: "7.0" + #! set: modules + #! name: "Ub-20 gcc-9 + RT-5.1 beatnik" + + - os: ubuntu-18.04 + cmp: gcc + configuration: default + base: "7.0" + set: modules + name: "Ub-18 gcc-7" + + ### g++-8 not found + #!- os: ubuntu-18.04 + #! cmp: gcc-8 + #! utoolchain: true + #! configuration: default + #! base: "7.0" + #! set: modules + #! name: "Ub-18 gcc-8" + + #!- os: ubuntu-20.04 + #! cmp: gcc-8 + #! utoolchain: true + #! configuration: default + #! base: "7.0" + #! set: modules + #! name: "Ub-20 gcc-8" + + - os: ubuntu-20.04 + cmp: clang + configuration: default + base: "7.0" + set: modules + name: "Ub-20 clang-10" + + - os: macos-latest + cmp: clang + configuration: default + base: "7.0" + set: modules + name: "MacOS clang-12" + + - os: windows-2019 + cmp: gcc + configuration: default + base: "7.0" + set: modules + name: "Win2019 MinGW" + + - os: windows-2019 + cmp: gcc + configuration: static + base: "7.0" + set: modules + name: "Win2019 MinGW, static" + + - os: windows-2019 + cmp: vs2019 + configuration: default + base: "7.0" + set: modules + name: "Win2019 MSC-19" + + - os: windows-2019 + cmp: vs2019 + configuration: static + base: "7.0" + set: modules + name: "Win2019 MSC-19, static" + + steps: + - uses: actions/checkout@v2 + with: + submodules: true + - name: Automatic core dumper analysis + uses: mdavidsaver/ci-core-dumper@master + - name: "apt-get install" + run: | + sudo apt-get update + sudo apt-get -y install qemu-system-x86 g++-mingw-w64-x86-64 gdb + if: runner.os == 'Linux' + - name: "apt-get install ${{ matrix.cmp }}" + run: | + sudo apt-get -y install software-properties-common + sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test + sudo apt-get update + sudo apt-get -y install ${{ matrix.cmp }} + if: matrix.utoolchain + - name: Sanity Check + run: python .ci-local/github-actions/sanity-check.py + - name: Prepare and compile dependencies + run: python .ci/cue.py prepare + - name: Patch main module + run: python .ci-local/github-actions/post-prepare.py + - name: Build main module + run: python .ci/cue.py build + - name: Run main module tests + run: python .ci/cue.py test + - name: Upload tapfiles Artifact + uses: actions/upload-artifact@v2 + with: + name: tapfiles ${{ matrix.name }} + path: '**/O.*/*.tap' + - name: Collect and show test results + run: python .ci/cue.py test-results diff --git a/.github/workflows/ci-scripts-build.yml b/.github/workflows/ci-scripts-build.yml new file mode 100644 index 00000000..ee404d85 --- /dev/null +++ b/.github/workflows/ci-scripts-build.yml @@ -0,0 +1,103 @@ +# .github/workflows/ci-scripts-build.yml for use with EPICS Base ci-scripts +# (see: https://github.com/epics-base/ci-scripts) + +# This is YAML - indentation levels are crucial + +# Set the 'name:' properties to values that work for you (MYMODULE) + +name: "GHA build" + +# Trigger on pushes to the master branch and PRs +on: + push: + paths-ignore: + - 'documentation/*' + - '**/*.html' + - '**/*.md' + - '.github/workflows/ci-scripts-build-full.yml' + branches: + - master + pull_request: + +env: + SETUP_PATH: .ci-local:.ci + # For the sequencer on Linux/Windows/MacOS + APT: re2c + CHOCO: re2c + BREW: re2c + +jobs: + build-base: + name: ${{ matrix.name }} + runs-on: ${{ matrix.os }} + # Set environment variables from matrix parameters + env: + CMP: ${{ matrix.cmp }} + BCFG: ${{ matrix.configuration }} + WINE: ${{ matrix.wine }} + RTEMS: ${{ matrix.rtems }} + RTEMS_TARGET: ${{ matrix.rtems_target }} + EXTRA: ${{ matrix.extra }} + TEST: ${{ matrix.test }} + SET: ${{ matrix.set }} + strategy: + fail-fast: false + matrix: + # Job names also name artifacts, character limitations apply + include: + - os: ubuntu-20.04 + cmp: gcc + configuration: default + base: "7.0" + set: modules + name: "7.0 Ub-20 gcc-9" + + - os: macos-latest + cmp: clang + configuration: default + base: "3.15" + set: modules + name: "3.15 MacOS clang-12" + + - os: windows-2019 + cmp: vs2019 + configuration: static + base: "3.15" + set: modules + name: "3.15 Win VS2019, static" + + steps: + - uses: actions/checkout@v2 + with: + submodules: true + - name: Automatic core dumper analysis + uses: mdavidsaver/ci-core-dumper@master + - name: "apt-get install" + run: | + sudo apt-get update + sudo apt-get -y install qemu-system-x86 g++-mingw-w64-x86-64 gdb + if: runner.os == 'Linux' + - name: "apt-get install ${{ matrix.cmp }}" + run: | + sudo apt-get -y install software-properties-common + sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test + sudo apt-get update + sudo apt-get -y install ${{ matrix.cmp }} + if: matrix.utoolchain + - name: Sanity Check + run: python .ci-local/github-actions/sanity-check.py + - name: Prepare and compile dependencies + run: python .ci/cue.py prepare + - name: Patch main module + run: python .ci-local/github-actions/post-prepare.py + - name: Build main module + run: python .ci/cue.py build + - name: Run main module tests + run: python .ci/cue.py test + - name: Upload tapfiles Artifact + uses: actions/upload-artifact@v2 + with: + name: tapfiles ${{ matrix.name }} + path: '**/O.*/*.tap' + - name: Collect and show test results + run: python .ci/cue.py test-results diff --git a/README.md b/README.md index 738cdc1c..741bd684 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,6 @@ # motor -[![Build Status](https://travis-ci.org/epics-modules/motor.png)](https://travis-ci.org/epics-modules/motor) +[![Build Status](https://github.com/epics-modules/motor/actions/workflows/ci-scripts-build.yml/badge.svg)](https://github.com/epics-modules/motor/actions/workflows/ci-scripts-build.yml) + This module contains motor support for the Experimental Physics and Industrial Control System (EPICS). From cba123e69a8f18be12a700004cf27cf0814f05f9 Mon Sep 17 00:00:00 2001 From: Kevin Peterson Date: Thu, 28 Apr 2022 15:21:20 -0500 Subject: [PATCH 09/54] Use the travis post-prepare.py and util.py scripts --- .ci-local/github-actions/post-prepare.py | 88 +++++++----------------- .ci-local/github-actions/util.py | 68 ++++++++++++++++++ 2 files changed, 93 insertions(+), 63 deletions(-) create mode 100644 .ci-local/github-actions/util.py diff --git a/.ci-local/github-actions/post-prepare.py b/.ci-local/github-actions/post-prepare.py index 7dccc497..01e985b6 100755 --- a/.ci-local/github-actions/post-prepare.py +++ b/.ci-local/github-actions/post-prepare.py @@ -1,70 +1,32 @@ #!/usr/bin/env python import os -import shutil -import re +import sys +import subprocess -# Setup ANSI Colors (copied from cue.py) -ANSI_RED = "\033[31;1m" -ANSI_GREEN = "\033[32;1m" -ANSI_YELLOW = "\033[33;1m" -ANSI_BLUE = "\033[34;1m" -ANSI_MAGENTA = "\033[35;1m" -ANSI_CYAN = "\033[36;1m" -ANSI_RESET = "\033[0m" -ANSI_CLEAR = "\033[0K" +from util import * -def cat(filename): - ''' - Print the contents of a file - ''' - with open(filename, 'r') as fh: - for line in fh: - print(line.strip()) +def get_submodule_releases(): + # + releases = [] + for root, dirs, files in os.walk('modules'): + for submodule in dirs: + if 'motor' in submodule: + release_path = "modules/{}/configure/RELEASE".format(submodule) + if os.path.exists(release_path): + releases.append(release_path) + return releases[:] -def sanity_check(filename): - ''' - Include the contents of a file in the github-actions log - ''' - print("{}Contents of {}{}".format(ANSI_BLUE, filename, ANSI_RESET)) - cat(filename) - print("{}End of {}{}".format(ANSI_BLUE, filename, ANSI_RESET)) +# Comment out SUPPORT from motor's RELEASE file +motor_release = "configure/RELEASE" +update_release_file(motor_release, "SUPPORT", '#') +print("{}Updated {}{}".format(ANSI_BLUE, motor_release, ANSI_RESET)) +grep_release_file(motor_release, "#SUPPORT") -if 'HOME' in os.environ: - # Linux & OS X - cache_dir = os.path.join(os.environ['HOME'], ".cache") -else: - # Windows - cache_dir = os.path.join(os.environ['HOMEDRIVE'], os.environ['HOMEPATH'], ".cache") - -module_dir = os.getenv('GITHUB_WORKSPACE') - -# Copy the github-actions RELEASE.local to the configure dir -filename = "configure/RELEASE.local" -shutil.copy("{}/RELEASE.local".format(cache_dir), filename) - -# Get the variable from the example release file -example = "configure/EXAMPLE_RELEASE.local" -fh = open(example, "r") -lines = fh.readlines() -fh.close() -pObj = re.compile('(MOTOR_[^=]+)') -module_var = None -for line in lines: - mObj = pObj.match(line) - if mObj != None: - module_var = mObj.group() - break - -# Add the path to the driver module to the RELEASE.local file, since it is needed by the example IOC -fh = open(filename, "a") -fh.write("{}={}\n".format(module_var, module_dir)) -fh.close() -sanity_check(filename) - -# Enable the building of example IOCs -filename = "configure/CONFIG_SITE.local" -fh = open(filename, 'w') -fh.write("BUILD_IOCS = YES") -fh.close() -sanity_check(filename) +# Comment out SUPPORT from the driver module RELEASE files +releases = get_submodule_releases() +for release in releases: + updated = update_release_file(release, "SUPPORT", '#') + if updated: + print("{}Updated {}{}".format(ANSI_BLUE, release, ANSI_RESET)) + grep_release_file(release, "#SUPPORT") diff --git a/.ci-local/github-actions/util.py b/.ci-local/github-actions/util.py new file mode 100644 index 00000000..8b2af1e2 --- /dev/null +++ b/.ci-local/github-actions/util.py @@ -0,0 +1,68 @@ +#!/usr/bin/env python + +from __future__ import print_function + +import logging +import fileinput +import os + +# Setup ANSI Colors +ANSI_RED = "\033[31;1m" +ANSI_GREEN = "\033[32;1m" +ANSI_YELLOW = "\033[33;1m" +ANSI_BLUE = "\033[34;1m" +ANSI_MAGENTA = "\033[35;1m" +ANSI_CYAN = "\033[36;1m" +ANSI_RESET = "\033[0m" +ANSI_CLEAR = "\033[0K" + +logger = logging.getLogger(__name__) + +def create_file(filename): + dirname = os.path.dirname(filename) + print(dirname) + if not os.path.exists(dirname): + os.makedirs(dirname, 0755) + if not os.path.exists(filename): + fh = open(filename, 'w') + fh.close() + else: + logger.debug("{} already exists".format(filename)) + +# Update a definition in a release file that already exists +# Append a defintion to a release file that already exists +# Commented out a definition in a release file (location='#') +def update_release_file(filename, var, location): + updated_line = '{0}={1}'.format(var, location.replace('\\', '/')) + + found = False + logger.debug("Opening '%s' for adding '%s'", filename, updated_line) + for line in fileinput.input(filename, inplace=1): + output_line = line.strip() + if '{0}='.format(var) in line: + logger.debug("Found '%s=' line, replacing", var) + found = True + if location != '#': + output_line = updated_line + else: + if output_line[0] != '#': + output_line = "#{}".format(output_line) + logger.debug("Writing line to '%s': '%s'", filename, output_line) + print(output_line) + fileinput.close() + + if not found and location != '#': + fh = open(release_local, "a") + logger.debug("Adding new definition: '%s'", updated_line) + print(updated_line, file=fh) + fh.close() + + return found + +def grep_release_file(filename, var): + fh = open(filename, 'r') + for line in fh: + if '{0}='.format(var) in line: + print(line) + fh.close() + From 642fcf541da47d4224c98ec662abcdab174f6016 Mon Sep 17 00:00:00 2001 From: Kevin Peterson Date: Thu, 28 Apr 2022 15:35:10 -0500 Subject: [PATCH 10/54] Fixed ambiguous directory mask --- .ci-local/github-actions/util.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.ci-local/github-actions/util.py b/.ci-local/github-actions/util.py index 8b2af1e2..9bca4879 100644 --- a/.ci-local/github-actions/util.py +++ b/.ci-local/github-actions/util.py @@ -22,7 +22,7 @@ def create_file(filename): dirname = os.path.dirname(filename) print(dirname) if not os.path.exists(dirname): - os.makedirs(dirname, 0755) + os.makedirs(dirname, 0o0755) if not os.path.exists(filename): fh = open(filename, 'w') fh.close() From e1f63e5feac52d8d6ecca8a2cfb0c3e1e1110dfe Mon Sep 17 00:00:00 2001 From: justincslac <89935690+justincslac@users.noreply.github.com> Date: Mon, 9 May 2022 12:01:23 -0700 Subject: [PATCH 11/54] Update .gitignore --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 1263d689..6479b24b 100644 --- a/.gitignore +++ b/.gitignore @@ -3,7 +3,7 @@ O.* *.swp *BAK.adl bin/ -db/ +/db/ dbd/ html/ include/ From 96509caba2ea1995bfeca3a0e8f11e1f273d2e05 Mon Sep 17 00:00:00 2001 From: keenanlang Date: Tue, 2 Aug 2022 13:16:23 -0500 Subject: [PATCH 12/54] req file for basic asyn motor. Fixes #183 --- motorApp/Db/basic_asyn_motor_settings.req | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 motorApp/Db/basic_asyn_motor_settings.req diff --git a/motorApp/Db/basic_asyn_motor_settings.req b/motorApp/Db/basic_asyn_motor_settings.req new file mode 100644 index 00000000..22e196a8 --- /dev/null +++ b/motorApp/Db/basic_asyn_motor_settings.req @@ -0,0 +1,3 @@ +# FILE... motor_settings.req + +file basic_motor_settings.req P=$(P),M=$(M) From b0cabdf66dc4a31383fef7c3b12fb53a8c6fa3fb Mon Sep 17 00:00:00 2001 From: Xiaoqiang Wang Date: Wed, 14 Sep 2022 13:09:24 +0200 Subject: [PATCH 13/54] fix some field types according to motorRecord.dbd --- docs/motorRecord.html | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/docs/motorRecord.html b/docs/motorRecord.html index 08c84a76..ec9167e1 100644 --- a/docs/motorRecord.html +++ b/docs/motorRecord.html @@ -455,7 +455,7 @@ below. FRAC R/W Move Fraction - DOUBLE + FLOAT
@@ -676,7 +676,7 @@ below. LRVL R Last Raw Des Val - DOUBLE + LONG
@@ -925,7 +925,7 @@ below. REP R Raw Encoder Position - DOUBLE + LONG
@@ -981,7 +981,7 @@ below. RMP R Raw Motor Position - DOUBLE + LONG
@@ -989,7 +989,7 @@ below. RRBV R Raw Readback Value - DOUBLE + LONG
@@ -1013,7 +1013,7 @@ below. RVAL R/W* Raw Desired Value - DOUBLE + LONG
@@ -1209,7 +1209,7 @@ below. VERS R Code Version - DOUBLE + FLOAT e.g., "1.95" @@ -1827,7 +1827,7 @@ below. FRAC R/W Move Fraction - DOUBLE + FLOAT This field supports closed-loop control of pathological devices @@ -2426,7 +2426,7 @@ below. RVAL R/W* Raw Desired Value - DOUBLE + LONG This is the desired position in raw coordinates. When this field is written to, VAL and DVAL will be changed correspondingly, and the motor will move (with backlash takeout if BDST is nonzero) to the newly written position.  @@ -2533,7 +2533,7 @@ below. RRBV R Raw Readback Value - DOUBLE + LONG The current position of the motor, encoder, or readback link, as received from whatever source has been selected to provide position information. The units associated with this field depend on the source.  @@ -2542,7 +2542,7 @@ below. RMP R Raw Motor Position - DOUBLE + LONG The contents of the hardware's step-count register. This field contains the same information as the dial value, but in steps, rather than in engineering units.  @@ -2551,7 +2551,7 @@ below. REP R Raw Encoder Position - DOUBLE + LONG The contents of the hardware's encoder-count register. Ideally, this field contains the same information as the dial value, but in encoder counts, rather than in engineering units.  @@ -2952,7 +2952,7 @@ below. VERS R Code Version - DOUBLE + FLOAT Version number of the recMotor.c code. @@ -3186,7 +3186,7 @@ below. LRVL R Last Raw Des Val - DOUBLE + LONG LRLV From 382c8324e5176ce769a09302bf829beca5a9cbea Mon Sep 17 00:00:00 2001 From: Mark Rivers Date: Mon, 10 Oct 2022 08:14:57 -0500 Subject: [PATCH 14/54] New documentation file --- docs/presentations/MotorModel3_2012.ppt | Bin 0 -> 349696 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100755 docs/presentations/MotorModel3_2012.ppt diff --git a/docs/presentations/MotorModel3_2012.ppt b/docs/presentations/MotorModel3_2012.ppt new file mode 100755 index 0000000000000000000000000000000000000000..6688d90d999e82b83d0af0c66e497d2b96b53325 GIT binary patch literal 349696 zcmeFXbzD{18#j8uqZ~ls01|>UNQX#wBOu+agdp9Wf`oJ<-5?#(9g>og(%s#MdNS&-H0Db`cXAS^$0ViC!*Gi%QVLDQP!BJ2H_8>f0}s5@A8S z{;206N3T+L?>WB^%gZ(aGl{;Dvu=^y-UP_-9@0}&H7@fKAD zSFh9wQQG74{`Ud(Gx6InbgFYjVV>^i7EcTVmKXGD;%BKPpM|`&TJG*z<~X9>V`0Ey z{e-cMiqo@wA&rJ$fk}6BN9FIx`iXRrk(#k2hNRI>2|N1qRTH&AgblF1P6J)$GvGx?W_9FaTzb7Rhf@av2mJsR53p7yeTl9ORi4qTJJ5k zGtb0mjlj$ zvF_sU6$}VKl;x;inCb{EfrSqiM8@H)NVh>8zrQ5&zk1uNWZO~HlV-i>xa4Hp>g{G&-oiEPS@q0dWyq4=D9Wd>Vg5%Hb7%2@e{P<&L8TeRreGIc)YB=@yH@ilsNh4gCVR!T zzV>j`6I)6)$uVxM0&z?Rx@8-Y+H$qbB;iAk;#{e0dvUqgk)?#O%pR?2N>yyrXk@Cl zG9<~Doi^#(5F6Z@1{tr^EQny=epVfaLnP8c8kVbJ0cmfgR%Vi*I+huYWIo!c(z@Pz~ZEtpfZxXwt0K2qSO3oiIyrz*`a7= zLaIru)~kG~6;-gVt-U zo^jwqP3iAa&)!jU^^RwSJRvYN9TEE!TF&~O>|w_W{rpwKw-v_7)@?+N0Po5D@=%72(MrI@|5*c zjJ>ARgN;#iyhigV`>UY^n4>JuhKDH9bv?jIV`GH+D-rZY0i{2A=HyCIyGcvdxYwq5kj@m)11+n))>R}Xt$_-v!OBS zd4d?GbSD1YWK^{HgYMo;I1zUqG0cFv7eALH#K~R(=aA}F5k=~-N8vHQJz%gp3@Se| z2B|x^Z$`c?H|=?L~mz?PGT4~qZG_u zW14562nIQUU!^}g$>BR!*m}&;wk;PeZAjPwRcO<<7sNpsQjiHmXymNLMn_4Z8d$D~Xsg+_s2w0#v>c35HTSq>gPRSGZg*o>qnH3#dxTu`Qr1JkuX zJkWsHk9j3u=+JEtnrnV(RMui0$oS|rN>4Sqb*z#{5rI@E?1N%%iRD^!Hodl$Va^?0 z&*|V&6m({CgC9~QSTb=@Kqe40PH)_CmP^pvi7idHp+aPlezA_~E_^H&^ZchsqVeXM z@rW#wM6{kB>|uF3B|NVmy4HVdJFzAR^j3c9&Q*QDKDB4}1u{45*}rJ}LoXn@K7#Y&e)omj~KW{?`BtmVPB--zDB?+!w!C>$efH+^` zraZGH!H5W_`@*UwCT4>cN!h5KTPKx`cc$a2y2~|Y?*ZGYs2`lFoS18_94~IX)y^IG zN4fQNd4zz&qvX+ZVFmj0+v4x$4)yNb>+crA+Lni8_dJe`9MI^dc@HjUyF3|q)^41gl1}6n z(ODOOL4gS&z$c8wR09o&fPiev+p*Orzb4mRbT}3ye@S%5jsY$gr^4BBr+O+#AgMfg zzJ~K5Dh2ZBcD1W{3X7oi6Xh+??=rcbPcP{{xxTjha^FRQHH0-ln6FWjK+?}?+vxn6 zWLQAxO3?LVU=V=t-v<7z*)mF+wso@+;74%tY!fmpjTk`(CEEJ7QZl@Ye2Bh@xE1d_ z9kc~uaA)IK3`B&}JKvjarRGP$E<$Fw?*E#tIfkxvSHB^r*KwjLo;!b*6iNPpTQ|w0 z%feoSzu>NuQH)=NanJQiYU|ObJPL$+g8!I;2^rJwS{%o(o)&K}jl3~+`7t8p^Whif z8@2ASdkG%x-6z@8x%5v_is#U^<}UZKxJOGcOX#MsMY>{S{qL0bQTed6>R5S3X}4;O z-K~By`ZyP~aTB*02~fc;&FF&TN~Ub-=ALNPQ(%xqKSn1=$CbD8-OqpVt!rf0#O>MN z`0z^>kk`EM`<^a!T*Xsdy9v3YxfG-5T20h7cKS|_QDvV=st1H3r#=o7H643l-kQJg z%)SsZ06RaB%pfO z)l654h~_0t_IdD25QT_lh{Y>^m54wiIJzmEi?oO&lkv6W<0v7YNZbrEg=f(-X{e_g z{?7cV9MP~e0|fhq+u=}9dZ?mDKH&p-asd&d{#PDcWEcc(s-qzo6FgXSa~OmsKc0nf zjEMfm<-d!*l!R&dXmR^iZ~I_BMHTIJDJ*wDVO=by#+5R4o@;q&z#S!Myuaqnu6^n> z%k|frSA3Q4IuZHNEZuM~;^eG2mbhEr>h40ImaqaII6dJb)BrWF08xM6y;5qkr?eDb zG?|xNUtYldqLLiE#69(U+YC|U9Ata1hw)3`;;Rb!0zch`mtniqPinvxc3kJC)X!@%RR`=MPm z+4^7^hw$qAC(7ch(F8g70B``i2fGrX&grm#I|kXc``q9;r~VRZK$zn#wK_>dB}rXt z`Y}(yLCxA1UdHE^&adW9-?)BBqJd?WomoI4;`Gp49lZN5T{#%=!Ae@ZEZ?I2!-yOa}o}{MIxSgzljs z%=<`)_eRj2v2$-$(kEcWZzF(^51rRjZ_tP#`ce9AHlG8@B_@&iFN-CP6S%x#=e-x> zhB`b1dT&e`f&wu&QvBSvL)DJF*U9UAH!<4hymiN+{*H4;>ykc`wI|Jfcpa>%Pn)-7 zI~lJ=Cm*7PCZCs;{n#Vm-5V$H*KNE#HS%D;PUw@s%2cA1^x|NDLR`gDdUEc0GjvwM z*RUHQ%YRdQRdu^bAnSeWMVgY<`^`isxfLd+Yv8Q~{X9BDUds@nEu+;6x+=JvleTSvIgQb1wQb$0mKf?OmSGaofRMCpa8) zB!GslXv_MFlMCb-3A}a#X9{?|GJ$f!i-@~J_zS&3i+F0TP0hZ9f1%>{Cc*B)2Y$S( zgE)t|JGDGMt-IP}sZk>aK2DEC%1&%IgPrfL;(`f_5aTPVc?EvaR2sOm7TZyekki<1LfT8S(pSyqQm!j?uDbP zL+t4E+Sx(RL!E3~`$w@)(IVmgG)@6w#3cS_R==DN46H3?VcPj) z-QnW$vZOo5_FP%izT8&(MpF%Q`2rIfq0XrlaSX2^p(Bd6XKEN z*GSN<)+kMW`|WZ5%e1<4lD(`E4q5^2CI;)o23p+*#j4XZVf|VX7EV zy2U4s+GB#0tz(@0s%Ena9iMu+VV z&R?uI-4M-K-uV+bA8m?b7dUd;--b0^etIw(G=H5AbDqujeH1Yf#(pY@Qb{IY=4vpU zdY(M-bTW#c(`e7}-No0*p>1|Wzu!XLe}I6u1yn9(<1-PVvaB0G^2lAC?O|>gqqCLU za98KR<-z28$FPBV_Y>{v(1x3w;p#aKmy6R(%O;DH0DQ5q2J0^L2@8&c2G3V>a1lEl zR03JtpPvx>#ie{nxqx~cE$K_K&)0M88MU+Kn%9`j!KCIZ#og5|*6f2q)m(2QnzgJt zCgyD4a6~$mK*s#4c~UMQVhUbzk`m+sT95YP8tqr|62;J( ztxu#U!kP~2hHHV-svm)+^PL}iQX)3-l8jPng3M_Brp!RH(<5IDVz&8eg9_LH^67ki z@uc0hXxUO)%0($a_d$;RdXx3+hgwsd##PVM^VpK+breka4sO*a5a^aGUyK7ZA5BvT zPOryz9LgVF{>ojBS!D8dr0B2+n#}BRjOO`d?&pvrOtE!Au~nEm=8|ace8I!EnOpd# zZhew)7Orf5+B07#2}*o+=b6FAdGpxe=bfJGX!{D~^9;-}amuqvjbr{%1c6Auwp8x^ z49}>LcD8A*bJLEy6la5B-IL^r7f%2|;#t)V7Gmjm|Cg@7L2A$eWpUldmDjaNZ`xYQ zm-Rt70&FMXLZ>j$P}MrgRLcsqY>a;wc~fqIkj)h;5&YAbXeZ8 z^@PUWBnxqj1;Uhn1iG-#2G%{$Yjrt=!3yRInpQ}!^MhQA6=Xdpou)swv(vvGAKY3; zS#Nf3ze3gaoFgjMJ?NyIXFpe6|9;bHU2zV94ogGD-ExnilBXP!_PQOP@!P__fAOXv zNYCVZty`{5;JW7n@l0^q%2FWBaBSB<;tN1T5lZ%u$hEth*iSvq-rbTCCQ`qCIktXn zNh_guMHWQ3!>w;>Ov;zhDd~lKG1U>sf4Sx%=~YACoEpd`e-&uK?b6y-TUDZO9FSw>n@!tE-|CWJb80<;(=uKp04LYh7<}!DUGfc7cfp;7p`ZvlW*w+ zu1l<#dR`pAymw8WVCLR0)Am6Xe{s<{RB*~^gpS+Ym#Mh*D^cmNv|Cqim+LGHVm@Yv zUjHtc8po5#dcgejcS@%_=bZW`lM*{o3GuiMHl~D&XF0Za8o>bul=-sKlv}fQl>NY;!K&E;Jnnr$*oKIu0nrQFWar4>H(M8RK6zEG*a~ zqg|d(`MWJAR{#n*m%nfkBWQ=|3&Re+<)78`idQ1~P~iAllQ}>1K#F1Xebkol$#K&} z*lS%bY5@_hZ&=)I%OmECheHg8)D2T_51*eF5tufg#58@JUh};AI9ng1a1ai2&QKq{ zh>Vb947j`TY(`0izBmZV@Ob{yA6{hgU5UlH-RbvPYs!e2i;ZCOqf`vMCg$b#Wz$jO z=IaBGD^J5tiXK$%2gv(g7fmkiB{B-`N3?%>``?u}jTAl~gLf?_!j_-QW!Og_=WhM5 z6`^bFT%GRXV)8mHG}+~D(sdu7`%GA0eDxjw=iv%|trxA%mZ+wOJg zr;z*!CCYS={LH=5N>B-yDVLPgZ^SR+56+&n2C>b09Im0E<}-eqbUOZEfL`J;$Ko`Z zgN!;=bI=lkjH=~1=iSVA++x|ZT)Fs4Mhz#alW#e_Q)`_3Kv z%d>KfM*PsX{S$YpOEUicFg_xbomM{9?nbU8+-pw%8{*sov-Jk}|Kx1ML)!3heE9zf zpn>MIZfj+T8`r>iVi08?3S{ieIn zYV5DQ(j(MWEn%`oAC>LDV&rhiH=A(D@8@toogqxRyDAm)oY%Yu?IG;+N+az61e$T$ zzAS^4zTa%vSdSB{wrtu6?+=zYb{(GDxfNya1s=1{5Y!hxrj(LUf6Lu?a|=O$y>qkeF2_1^iA z*8#N=S$%MSVXi9xNx05`8m-TAGT)J9BJ&e^BpRH}%b$l4oh>GNI_+QVaCaHavdwue zcNdiWy#Dl~ordkF@H=kxi@-8lem;ls2l}~uOlNZlopYxxPBVcfNqZuQP@iO^o0-~e zoI(61kK4{f9E%3SVZzfzKSg$W_x&}~b2sG9SkVghRCd#L^&46lm(%J{mv6qHbQXv` zQ3oNM&@3`K5>)of747p;{|-vVocWV$K4Hc$cYChK$gZ>C7heQBn0-g+M$z5mXCq4$ zu`ah5d=3&>ac;7Xse?<-v>Qxs9k~Y6ua|YHtx435W^mZ|Z@U=tiBiIR18?S@HhD}8 zjxx&f+qCB_d2sE=u?FUa`3)&QzRD8 zZe}*E&U@=+=UAqmZ&{5Dy}ipCjT(sO{EHj?z3G9N2X8;1Jea@#ljk&LxPl);5|Ik^8*acHPwCspqOa*_C$H`*}q!M*%y@2{X!dH#4_e00lX{*@+GdOFn3s z`7&tFhw@^1>gROrsFT)#J`nT za;~%D%X+Rhrx^7PO_R3!?b3tdBf@sy z8+N}HK1yFfw1187B16zRf+LLeX8Dut*`3h*Dgp1(gTaqsPD-h59Oh9l`&-pi2`_xl zm2&?pY#AizK1?~+og9IuLM2&wNcLb}`04XQS>E2of-qmSNVnUFK0*LRmJ9~q6>75I zJ*eMrHBW zekRKwmHTrIEAjNIgomSsmI@_dcQ^W)Yt1GXD{*&M_3zw{`>$R@pprg7j#rN$R)>ABH?^D7)~B4|g{8QPh1ENr#G{1} zT&5q^o`({-4FcYvQ`dHT;Kl+swamaE6`5ToapDp?ctB6B3Nu?z>*<_W8LY8HF}2O< zD8u_ywZW);$r-;mrTXn5Vtdg1%Z7`Z5LJST%}-?Py3CG!q6h_pxbJ&&ID&^J*9t?*S!5O<+85|uy6KSXj3?^Z<;-?P?|lvq^H9gov&K@xgS|f9ac>{ zJUeV9u;stlX|3kvzKV^wO-Dan4EijUGP`~>kAOV>u**|58Na{Sfb!7%32mtBm}ip1 z!qzeB-R?t6-Io`km2uDN9jxB$etRIRb6sWcBW_k>wdW^_fR@Vc>f~{E@V;cmYUw+m zOY8GeQ-x7{=gjfh}$!|Slny5{9_G+m1hQwaPQ4CNmS5v42 z?}t>9U!~etX^U~feh7a$?}fycgDM;}-G-bychfnhnziu0iT=i;p7vsms~p-?9=pRj zVeFE`3a458V#1V4r<%L`kdivRi`6&_w<%HlTzV~>q{BWRoLhG~f#@Cbh7i3Tj(f89++}q!u!GqdtZ6QU$`J=3qIbJ?1MVK zb|cMv<$kdH80P;E%>Ol}<@C;d=WyPP|9Xk2`6%n|GU3PFVx^JWzP*v#d1bC=^hk8?nRcCcx-X2)bHQRfuc}nt zuJW2J3Ci}XQB!Ys*=4U_i62Uu&KGiT&yTimU%N*bHG$Fzg{GVz`NFo=20U{arw9ob zi=bq{A?X(o+Jm4VCL8dIV3;Sfp7M|Cvj8$*W%rZ61dd*4y!Gs{B>d!dA_llQuO4eu zeQT!st1G3hlS3!#@}lZ{tyLG(C}~rM$^{369hfpI_$RD%#91GO#QZXrg;!qUHNy8* zTCbOI&AP!|apm_{#`JKf$vDZmGWnKG5C$TYQAaBsW^64kLc%To)`$Zgzm4W$v_tFL zeV^kL#8J;o$7O%MymdbEu#KlsS3uy2921X@JqVMk+DjQ zo98LgX|P*sU96;}X5x(1|E(&Xm)i2#^a1LxLYNhC+NhW9#5!YoZV{5q-m~N9VVIsT z4^2<%xH42nJ;QXL67K7u-<~Jawh@hb#{3Lt6iBM#c|y#ECqgF-IM=NJJYVq{KI^3v z$K`j|zbym6!<(S5{T5Hy;W4j9j1_x-gF|fK8ElHHqc*7!!ZwX){VtY3>P ztxnG`{$h21E+^2CLch-wCLJU$gg2wY;vT}mi-@XiKKk!;A3$E@aA3&NZ*}RvNE~SH zgQ3I?WS#%ef1p$Xfp+{`_Z%XzfRlLepI+e4`9O&S{;j(KQ^4yW6!*bDydxY0fTnRo zSBdJv)38UXKL0XvIEa!c@e|^;A|zB7mJMBOa77%MfRbpe$KT2LC9VKqX3)p~GKv$W z7if{-#iM_DN5G5t-?|TEKyYo`dXN88G5V7(FOcBBbuT1?;C&rCZ~@WgfW3(i2hCf0 z2$xbrv{zGB$CV@K{l9P~=_S2y$5-lWSd5B!%*gJy>P`Pb-aPT_VG-6Y(u10|Vj8Vz z1?^gta=+86pLsd#_eAZIg<})L9;poA{TyensdHB}6uT#o1>CE|*eP8!R9r?h*3ue? zs%Xpc?d=;B&Tj#YB+G@)xDcp4e3&uL*d#1M3AY8yfr6-lex2EeB_+{>m`Jl2fg+bX zm1;AI?fzqUuRw4a-ZF1rLA?ZUAkj09c;}U(ip(kT=5M6B989Wq&AWc&oeABB;Mwx} zd>(=KO;l1vn=FjUz+jnp*z+T351z_Jn*quAC<8-sAn0|EFII|0K?@!)1&J=A8rOY2 zWylTCrv7tuGG7q50n>`%=yck+=ecH$ZRIS~H2(>ibWdqW@)KqCko?De^@H9%$JA|d z)_eT+OQRUXNs2WzT81!dOk#3pn)jF?4Fg(M4l0*|NKxGmjaUwvPsl~#r_NaZWk83P3%^k7$NPz|9;}kbaV`ANklZE;6?_pn_ z62pt2@P*LcX=&nxsbgvpS-ie3GRsXij74=;G<_sQ=m0ex z`F`c+oTDd5(9XrDv?AvXq6+9G~(x@dzX9Hxin~Jq~{)B1Dptz^G&x38J zwtV_cCRLnCtc%N}hYxHBvT&ZV`cw-&IoE&YR{Sla!p!x@*EqY?HAjiTNO1L*IJ2U& zkZAkMGxaW3H2i!0tCIxuui)YZDjdWvQNZRZ{wFcEGF}_=YmSP1wvJ9x%7oB4tt0KX zeP-rK1c6N+1A1{go3{S>)}OOD(Cg^N3XL5)C0Ug#P2LqDP>IODOKKaL==HUl6w7sz zTr|5jLWy}yqrbP#HiRZzj!I7UgX0mICoLo;iGnC=%xyJ<_C58!2%oNo(0$w?_WlZb zVf*G=VY<1yPXRuMiXRv-{WKeR7`;bCEt2D>qvBp1LS;l~0@q6yDYXovJ`MNmWX&z( ztuwA!Rgaa`hY){4mPMmPycqG1OjG7vpD`K=KV(7Tc!Fko?F%Z%@qFdvG3o^75-E*( zx~R{i$6U6D%pJZT$*de_Q`{%Xk1*n)#A`fwCydA+ruxu{@ixfs=Ws#BgvH)b#iC&Q zeGC$*{JBZ!$4=j=ri1=rjw(ZNhTk(OWqfz`CobPaMsn$qBvSD%BDW@5MN~?|U57Zx zGlORFR%Cum#>8~Wdze6=D&V9>{SzgN!K%nqO$96L`+=VWZrZrq5f>j!ybvcKKW1<} z9cSAUksOvq>)vBx5KSw9i!76=BR6)YA=|~S}*wb|b z*oD@h&W-Xh*5J@SdhL9I+(gXNY|GD|`XIG=w))@l-iN#OO@5eL&2#bC=}b>_pY4^VUOU3^{$2wucI?*+hTmQb(K&hF6qHuDTCBC|?-8I+p5 zt!{G_a!rvEspl4jQRW5I?!((qoX+v)Nn;p#;5be)Rg&!@L29QW(;8gPEorxR30Gq3Via-=V12e zN9j*!K_@CUg|dHENZI&U&=aij;+|VcGzlePEM0=(I`Tb}hND-C=n;U_#?@jVGIDkS^@>n&kX%+FJpAPI=+vVrVcS{OBah2DN+zIo$?N$2=#+fII`Tb`0@a3a zmANrwv3!_`e-S$_v@3w&D_T{UAv0H#A6qL`c8t*#c&`fy5`Zi|d%Oh_e=l+PqkcUb zQ--N|qw_;C&CW-WN3v*r=FP=V6ZyG*SB^q7(>%HG3wR~k#_?b( z<3bU>y-As{pI)jO8SZy^250^VQN4JOLw5sqm#J?!;^_Wk`l_+%yk-39YTdkB| z^ijYI!(MP{c;t&$}hlSChN-gMYJ(KXD|$4L)!{Mq|AJ zo=T$3bSwV$Gj?;*6xDnX)4;^!+$6E-Ph+J?0V+305NU{fW*3D_;7{C}f|9vY*0+01 z!9KEM;dq#l#WpW~zVmK!m+#K@Gh#6@OFR7dB9HvVj$8=-?oSxi^c;3jL!)M!Mt}EP zCNbHk71NUsQ0_7QYkT{(L*h_%f(1!b;cX;6n_`9o9#2976Uu_ufzjTD0-~nvcIp#S2 z_jYK@Bl%@1Uz$&QYd9|Y(lXLmQF}J{q-qcC7{Jhc6tJAXrB`DHO zA(Lh*acol*TF6yql2m_QzLlQeY2mEg>5}|)J5`(6r&lh2Yvw1!j>2<$kgWg1=GbXM z;bDSYZSsVdHpiFV_G#mZ$rgIsk4dv!?Bg<1k79hJKST8j-Ec#CbxWMH_Gjj8%#)&r zPOH+3%S@j|78Mz|77P@G7^QFadTXXLw6oP48|!?DHOJJNX?cR}r=={zsF8Dh$%W^f z@45asq2_@eDtw25NR}K|xIM==+)!43dk5=7f*}>!FX*buC?+ZPNt2aRMg8H!&C0dk z^HYE3%okl3O<5So=zY~V5_NE=RC=&pFpr~QC@w!%bePv@)v|J!wtCwY zE5^1sRzP(}Lpcy@KvjWN*_a{p^Sgm+zf(yC8dc;OB>Rt2Di3yDw95xL{U#iHsIWk?w*&_RwYY~dzK7qX7Q~cIiK#V+1_khUNXZbOhXbhQzteLwMt_sOP+r(oTEwA z?HtQ&2+Sa4u{cHI+18VlidFX3pj@A!D{uo*Q^GXM3preo==%*a7st#d`k%pza3M!Z z37^=?Z!R6g+V+k)i|)95S+h^1uoHatsO@YuajZ%!=ghYAW8wAarz(z9Ex*-ibfTC2 zBMzEhW;f(QT6~ z_qOK9U7DpBzw+Z(YjTR0-8FU>w#8)}hb9`$M#WQhC{ij_sNXwFbJf=wf}7&#+-JAn z=Ol!mH5#nKRGV9i4K}+63Q{Pf+JE%dLZFxMB1cFOQYyCeC)S?}DH~X77qN9#qlz>g zLNtAk6s3w36LbqIv-gV#7b>;=5-~?k%^YniQ&tQ!AKgh}(-O50oou!z83b;`YWGYg zsbXb%^7dMa5ETa+lUx$IrDyJOf?__x<#sZbx3v?W7uma=w|_uPBXS zoX;P;9%%;VWg~CL`kG#^Y8G!=YK`>0K8t}?0y(;c>9>5`;}_EX7{jNRFwG_#iE*ZR zu^5vCnqoIxP5V8v(jcv*SvzIcsXdv`;i36#%gj0>vu$cvY_|BXXPi-v$M$(=asojS zXRcpqvej_RYi)d{)znW?5o6_1tQpjOnx7|*4a$MILbTidqC}KMwNYCIb z+de+6_K7PkGJ+)xo#KtPq3Et!Q+$pFCfgG1j)y;~5pB8Q9v>@W$?LG)v-D_S;zvhN z!*h}a?Dn=-XXr98_m7l8ZI>=bC2q9JmnW+Py_%9jq2UZjwJsb|Rl*qjNYforM~w#A zor*D>;DE206-R=_X=(CLSu7DVX{yynR>#&N4U||l3#XFSU=uMBqwl`v+lycb^{~yB zo7NMRC&$V8OZK?GaYcFAhS-)^oS@l zy6m;rbv&Nv>Nu6(vTTan3IAG#Qo2SLR%u?ng1bsjFR7tXH2RrBuYd)Cj&i|ECIU;Jp?LZR5yu&@NyK-9-BD&`c~x z3B*#a_xi~HxHFUq1YnoZ!`Jx#xb^?!OF*en~(~ou2>xFA(a_V#0qR2LVd}A;!Dhdc1(tF>mNp;1_P78tsf@&RO|Ypuu;Mk%rbN~D}HN+Ku?|W3$c{1aR?0S$5ZA_9maZQCLktgRWtqg)hhiOWqSrt=eO}9RUYcpk58LAb7517wy zd7TraQ&G@kRDz7;Pyu%9c$u{LS}TT9fG|RQHIwRmf3b6@&B7U8tUCp1)M9E(3e9Y{ zS3FuI#_wg4E#g;2F9_1DGA{VkjzS*JtsC0-PSwW#q|8sRnveiz!0NeYpKe7r*--!w zX_y(Jo#`yFvC#Kxk?<^7grl8PG%XpvgHXCSQzZJ_Mb)KL0glE^K)7V8vW`pT;v8;g z3sEV?&dSd=5@fw9<^_DBo2+_9B1M#NEK0m;>wzZs`sDMhZN$wpYZ+wd%P@7$Uy#{k zUCnGXa5x#tiuQ#jvr0%n8BYZGX8%?`gVH1`Mjp9sh)Ow1>9zo9KnxyLN$R$U8V|#P z0D{}tQ@1D(%T*C)ylfYe@iVD1najMGDkWl_^-|EeINJqZV zQuW;&=P)lPPn-SJ`-y{9HIr8@IcKT4I}({dbnvI7ALzu-;vJ+e-kd(cusV3ZttyLx zNupfb+Yy5WwyOq;?Gv)Ud~8#;zGU011jLc$>;c*>gmM(72zOY$^bvMOR$v3X>Zp^2I++Q zK6yQ(a}>aBJzElIDkqBQp8F<8{$gXWUzsJCuba)PxKoPnLB_-m7bC@%2txHHH(LLZR#><6HEEQuoemlLRG7( zUOL)RUYqvf2?NEZIXvT%s8!C)RT{D}?xrs73zl4~ACg?fN8dq0T+jt(2uuc$ zQZ*p0-`HBox{U?zJF~3f-GM=m5CnSrxJb^6L*5;^Qy+8wgEuJM6Jl6XOhKse{yOLJ zddbR;ir}27!~K_or4Stj$Ppo5s@}DCxqSq8lih!QB?3!19|9=cn@^pyL#vh;f*)n)L zAVCe2v=vyX^ttSdi-4`+n>rPy^)4#kp4Pj-TR8w*fzVYY;4S2pnwUC^@!^i*t|>fc zZE_9XY6Z%VAyU6aifW5A6Y_ecXaa1$6ML8a@YOZF*$-2PA_iO`zsPr!W6*HWlPd3* zN&4_@@ewR!#R0TSl9ALfwiR^e6|yihpx77j>|Ed#<_MoqogrXn!^Utzd4ftc7M zECFm&G2~TYmwFRFcAZf@AGbEIB0>i{Y%i&L&+cc|q3jIb7%MJ>lEI@ETd0FfzovN` z=?faRgCoUD6+=BJvy(IkQ2ALTURhbE;=KCZ%{_1QBCdwC*o{uB?3ndW_Fl={k(4kcbGG)DYKg6ic(=3NLXv-vG(h2B`>{Uf~v;!ihFa3H4oXUY!! zzqGFUkMF^KxLlVp)YRu z9C1cen{WddlB?4vct)ay6FJ}A`f>w*JxMW5EHH_&E#rzcCF(x`_m=%RXdPJf1hn(x z;uFVvfN-y;fWj;BeJba*qb(*K_NKQJY4JCz1si1|1Hlmj6%*06NKt8}^UH>NbT#1%@lOl!+h`)5 zRH3|K7epDbl8O6%T#Z0kjI_ps{o5Mc)gR068ZtEM_C~Z;&ip9vKPP-xQw^MvdlWFH zEXi7oMC@=1Uf2=y0_-XhJd=^PGVX6b@|62h>Nc`@U~@Sqwp=F$ZXog-@TdITXXV_b z#+tzu!8Z#sG1&Y%a4*y7CV1tj!*`weT&_E_)#0>oOXH(98C)%90qpoa3;7Ngl*#4C z52BtjQ}Ts{{v&v>^NQc>hV)T4iWw|S=o^s=qYWGYE1-k-C?m0guOI@KvOAJBTRYe@ z1dO+*3uGcbc%%Zj5Bh%Sfa`_eDKIsSvyYI;9X^5&O70`a($pstiuy~*uTs~v zw(ULw_b3v65{Yt}1XlhV+qS4>Z4h6x>6kUFpnpqdMddUMa?H21`dkw3B}_*li>|RK zgUO+ZPF(B@F3fv}k6fgb(rlK#x{{k0w2CPLp<31}NlIi8*r~)B_NWsim3TFi*6b?8 zC`)dSz<#NpfpFC&r(B-yh{|f8;cG6B51@t?^?NAs69ww93SOBjv~uioF$6FLAV?&$ z{1-{9-~~EL;@qF1*YufuR`0{Ru#$?H`;g4SwD6$BBl78Yk3Wj64b2ddpa~Xq%do{J zcAMX$KVXhPuy=T%v{0tKY1qNHBp3miGdTJluAWNx48 z)c6D?{g@ffdI6N?0!K=#$x$<3Fu}UqS{&}>BO8?qDJq5gQ1J(pe3z$ne= zbph~XFzp_sw4aVs%@>Vqx*T34e=^qXqpwMYDuv2{f&XZnuF_-$;inF{8R20c!d@N_ z=~faI4hEB7P3vrN*mMgp(R6m|H-&lS!{mU70%-5iM4{^aOaT<-9cldyTcaCDK-flB z-k=i)o6$mv^-zR#L&WQZEfQz^pLftJN{Xm7lEr6wHS61Xa{~TI|a?Fas#2n4Sq(M?ljvHdWU`GDNfa?95uR=UhOnB2R zQ-8c+c=#P#W64@#1$X+@V`a^ditH!M>@b-T0b|;!*CXcf>HkwNN7e8ElMLzMUThNPXEua+ciwI36bOUNb={V$jtj{h58UU~c;JGiUY<>`zYNmhye-;}?dKAZ#PZ{Qm2PV-@ z0g-6SzN!v<2`_TlP>|{GGAdGF?mhATr7qDH^(_T3Q6glV-^K(I#1(k}wd{Hik$!da z#kN*{UYtNHa1nq71D0(6JB+8%0!ez^2ZGFhWX0ZdKp}fr^Y&fUKW`O7Hz3dgAD@JC z)+Fs#Z(wcxAJN+l04E26F?|0lkV7YfK=5F=e_0Ut-$V!j3|%b}MCvMo5eY`TVlh}d z<34x;R%e1LOmj2m>LvPLqS30{N@9Kb!XbLN-_W&C90DW*I)sa%Ft zq;6FVV02L}Wn39+)!)J0@40m~f>6-V5xPc)GOu+^5fVBvl-TV(k%2w0I*Jj8tun*! zAy&Q$0njtjVj2PFrB6nNfRug1P1Zoj|HdU1oUeu2glo1s$l>`c51d0 zMu~%1Ld&G1;Kgj^-wK?)FwszCD1HKFI(w9^^0uDx5-#8(d7xq;V? zVy^YDBq#ic|1qYVm)1yw5;-So<+;t=ivYDr^AleEFZS32MHKGgs1TOn-0Gt zDss&H-2R}^`J;d1yBp3wY#y@d&|O16+4EZ#9bA7;6!N`dy$W66dh+9}D?c+on5995 zr+MyWd?J#my$?1H;rlB>vb(-a!~B3>X+3fYFjmmc?rEenQ?nT(gZ2@H=KM=@E&uwi zN9cf;cb&F~*zhVd(#=VD$t6u79ZQhiV~?$>h0IhUG-F3tyZ7@dL~A4k$MxtAC~-vA zlyr5IRPfprj!xRhk1Vu-T{jk08_EwX6jcdyr5|3x3Pe1P*x#70_~cR8HC97pCSU3( znS&o>mT~Lr)wS4qD=+^}j(YbN&w2+POSyKY+0xy#cJEtpX?OW!WXz=oIU@;cw|9SV0l#(FDX3}@6TEJdZ~yM@);?+MS{uQ z{^ONk{Wxp{min_9)ROcifB%_IYsAy3_d4I`ICf@EWkAE7HL;_=L35>86d4E)anj4q z(nXZ`tP~eIA1#k-X2Rig6dm;oX$c&NC=?meAF}5hd2ZpFkNe~$9QFeWO}7ROzgF!8 zOM0B1n95cox0e&3TuftXtt9_;qX-$w->O+QZEG7;C6;{_4t<<mENV7$~8^F{+qV&(uOQ#fjlf*Cur z8F4_(yDFR0(m11k)lnawyrEPXJ9v22H%K z`-G6lbh%BuS&rHfpY~mq_fZ5mZ#XEeOy#RSEeuJWal42|a&1vV?MSwScZ}PX>rJNW zuVPv}4l<*vZX(PVwR(Lp3XcS7;xvt&7*|szfPdAW{?r!eB%4Mr53YaE-q6-SWE`6M zO@&;G*WgOg^i>k+;_>Gz4qr@}%d3{n<_Gj*I1)kcUuWl-@WdzNPA3fbc&PGzQ!}L) zKI~U8crRZHs+UIEc?et<-$bibs#VtgOvLL|w(BbTcpmBNg{RuXA3_z2Z{kU(6Z<6G zb&Oyxm@==)Bb+_e0~BQAM}O8^Cw@bfj-Q<2;k9mm*62eF#NRsPC!?i#{?OIshmrh--aUDNZu*CTk8`=y<{{LOP@7j=Dd9yPF;vU1 zL_-w_NKSZEJa1-9=pfk1UT_M0PB0SVuGb0*~yo9 z1+)FEKy|m3G*VV}D$cPLeVUQeJU}_tphfKZsDB9}y=`KdHv(XDw_VR)nW?-t7cp{0 z{Rw{sC=LV+Em|?}@{Q(LJuvtB!KBDyu+$fq4EuP;+CvFr6>^n@YzAysd6XA$>A@K+>ou7YL9Cnb* zta402zyOJqqU<>7u2-5L?8(K!c6O?g` ztYZHA)*~R1bh8@u|Fx??AchFl;`?8yCi-abcc#;S#Ck@VfN}GW0R-{c% zyLo7a(F`J7|IW-I+~fyFEVk}kV6Q5v`(|8;sPgjw6&}-)!5i0=N$}!#26=%$D`EYf z>8K{~u<|MHsvR!!2lQuw-9oTHIAMevT79D}6_MIDDoV)9R_Nc2H_2x)0~q+Xg=UTa zKl^&_``MfA(ZQW9kCOJa5{TR{cjpZ)WuKI;Cq>V%jZ6ZC556*aCOf{IkE`7CFa9DQ zQ28PR&X3Zm8R^{pSNuEJ8xSSk61&q zCuGo^nGsf@v&9z^Nn@f{Re$+I4ru2)IdaZhhjG-uyaO?5pyBJ7Geb?clB6y1*&w1B z6weaH6n||k6q)Kw?DP!xgtFDOVCd%TGU=sPLt+h(kUbxJe4&s~+@0lJZDluuMflS^ z_3zR!n?wMW7d+i`IFo;=Hojr5ME{j5x9yWTt528a6tt;~oWpf!4{E3l=H`$T3RnBO zwWJ@Q<^s^((PoV9Z3IsiYwFhWTDP_lJe} zJ*qEajPzIhu)gkIYOq$iO50IyCVwV7qy!959d|S8ez%bWopJIx_mhXKJa#0RNp`uB zTJyNF0fl_&|Jb!va)4?Wcg*%oJ5SM3r@SaA%o+Wp-`!tU_^q$Z*(Lll1%u0vuhg#P z+&M)RPlBI(ERYMIpW@NTX;Ke}7!a+$%2MHP{{W7Ny42Ki(oYj9B#W22QqeE5`10b_ z(C%9t!oI9`=uvsOt}M9V_c?EYNSFd~;M2b$rS)AaP!$SO?C-4m(gUsUGoCCOnrT8a zg2U77Xrx++SJ?gROq6?eoj9v`{W=18yHZS&d3O_O>9VyX%u3$Dd8$z;lFY9xe!QxH zM^Z>j4Y5x&YOu0-z2dDwH)P!3EcS!)P)I9M?cBGbjk~3nEhc6zqOlX+) zubKnxc&=`LI7PW_QdpJ67St?~q)@ql%CeaLI@OPMvX-d@X#>6`?V>M2L+++O7?z;* zk>N*^9H!UGJ$o)8?JG@|t}hp$z#(3LnCzf&M@3jf;M<9u{DH4OPx1X#>tlxKS*bsA zrvD&-n(jHHq??!!XNASecb3Ip8^dF5L8<7=b+v1_aC^-~jzOjF*Ls|WP* zP()?i5jH`h3B6I#u*_%dP3ADXC$xYVP+#`1Hx6&{K8se^{*4^5Bun@azc2&V@X=Q@ z{S)v)zRC{)j#E@;XBnr`E!xj*x%ce3MD}lWcnx=rnfW(=My@sX9qJ^hbRX%HNN8_t zyEjPh)w;gkHf&n>z*y4#K0Ak-Zy4c2b$XsmTR>Y&Z!G%VHaJ&~f#b%7t7B6Jb`-ClT0i+v<7cS>2jjKb zb|NblVHKAvDl6HB`YJ+=8#@xgz?&crU9x=`yQY67$&(UOd5oB4l!WK=pvX*@=TiPv zTgasN_ddHF9Z7UuUIatssJ=47E`Cw8q>ib>rM5mO$dcYKmHCg?LVm#WJpUT+YZ+j? zvcqX<*eEhzRoqJyeU3}*`szx-Xc4un=qNG+uM)TZ(#lJ*lCJ}jp8b_FaHsUW#tDG0 zNn(io}2Dc}(LqH_R7nulzy$H?=;sPq$#fR~eu(?;17F!=Xdz$0Lw?`PJ#%UM z{yiNvupG$s+~o9&Rz*j7U+uh+vLHoRc<-`C{98+RYGPS;|I@SzEC(26llqDpwxVO@MWJUt^VLZ4vRx(fyEdvF+Vme4f-%Jetw0fWFN1c2^qTElERHB%i3qER3q z4~Ym*GDn8=>tM#CeGRiZeMdkZq*MM`Q-@(x1R(O<{tkB38Fr(~>S7|Yg+!3)1j7nO z(MP?q>_W>rH#F-;EJ6t5klx=b11!cSEx=fN=kB4hZ$b_0q5J(vOhAB_g>-UTmIv@h z_WQ5hrqJy~h>+WP@}B*h!PNBpcSf<_gMdsE$XihD8}gD(eri z%du%l*B|k%{>e&#c7V~MIZzYXw8iDGTt=tNI-9j=-S-8C5+buO z8o@!0EG^)Gh85Z0T4$mlo&GOn@Q0%OeZ=4lGpwo-{4|0p|5t3KB^wb+b?uXWX>F#l zC|23MQ<7zTtjMQrw1l-=l5hUW!GENNpS=;)F;?(vZ`Tf}yjqie|JLN@CiK7xbFyWP zoM7lJj3@xu%QwX(rv7)<|8pBmqax5qjjtaw1*1q{5m~u9oXL^Nr|C6vyJ_JeM|{Py zX0EdK)?r1_v<5-8(p`!p2gh~lc$f%7e<$U}?_+Gg?Z@97pG5&2SNt+M(2R}+lQhYD zmX98xz}q`XT3tcWL`)L#H5ehDn#+wP9|VlV@83p})dLXk%VVSy0()m|_BHycQ4_Mo zIR=N1TF+OoCFp`JW@c-uJtb{k92WWA2dP;uF@D%H;7ua?C&$_`{@dAA@*T=U1xXEc zu96f24NAbhrTKD*N;^wMo*qvd@555Wn@8QbUoh8MGZ3TE0TfkZ;NO(R{uOYLH0Xx+ z4}=KRCd5LI@CIb(U&-0p@I*yTMFu|%nag>!*9cS;nM8hh|LuAVu>!7#!#$tyKbhr^<(K68-E2Ed3FTjF_dm-x z>HrAh&>2DQpS67d`RbRT)(|A+dr5V| zh5I)4CKFwiwS`!CRc0UXr)vdD9gQrt)puNX`d6-|=56HiJK))36YCY!$W!(0)70UD z0;Pfm_BidetS&Gl#d7RdxljEk>&+&f7Ny{oVaL1?6*{_ZOXKxKi_kMBSQnjpMwfcS zc=gpXJjKvaeqhwSAorwLo6f!4I~~bB>P%auc)jZYIAk&xBaGTy%TPM5=9p1DtCk+9 zzA>>K4ZCvq3XSEj!m-TM{$BqT*}=0q9l6vrw+3lJpWlD z2BY)P1OI=kUho&CT0w#L^q2-U@_KUC1we)Cf2#`LB#4BhuTQc6ue7BhCZZ&_1U;RVc^?txb*sdu-l5!_xqUb{9!R4;UPaf5j_rgg7zx>L6({JEj9tZZoM?j7rG zOHR(PbJpJRqc!J^oRe_tk8#t6!XRt6rz#mi{!zl75Rpl%G*L&lZ3{Pn=y578wq?9K zZ|#7HSbrl@cH!lG(vOU}>HF>nSDKhwG2@;L`^nvr3Ej!-Y7%38LdUo+gF=emH(1%< zA+uU1C6DllJ3Wp8H#IjAJeGAqf@~U(<()I6*MG?$XwX=ATIYLM^3d>5VO}e?E)n9y z-+D^PReNbv?P+K#C&Um ziEJ>UeNevt+gn}^1*aR9#BRKRg7I&tttl#8u^zL|)YSqjCw`@P#F85+Y;z=|;jDKI z&2s2!fd-mLa$w~zM<;^$816#sXu3hcH~QNtl`>n%MFS}sanT|%R2_>>Juv>G5jj~H z|Ltl{S2zRJONs0UqvPK0Imam^NDSt;MZ-ID3}e#=ydnz5qrukYVtB(uLy-^2B3=dN zB!1@i)ro_07}cwFZQ_w%U~nOkrm!0$J&I$n&^S{OMz%*1h-*FwiUcVz-{UTW zs34mUqcW}4JL8y_(0D{`G-(+gbU!HL&u3uOL?UypkUUI3ec9|db6+2v9j-sP-%gQ&&4)>54A%;1IH}M4_;#oD*OkUjrmbP6nAYXjwKdFy zpQ$8u3#pX8#%32j@nK~wTMdakaTr>4CykBy)8ACXxfjmwBvP`uwOT8Pu-3H+r_yFx zu1CRB^j;=Xt8@Kf+kK}m`*+9}wLPad8!kH-Cx>Y5>F zHWJ%?tJX{h=jZE&gw274c!-PXDU8l+=j=!fm<^)P_YAEwP{I@?|57k!)`1MmVu`Ha zy=eQ;3fn6YKbM>2%yh5apR1|HHiqX)JH<|@(AO0AAjaYL9*yJXjFej&m$}-tJj{gL zrz{YI1%#8|9z}Pv;;*?OzJX6ftwS|a1Y420eMn&(o56gJJmisn* zz0xo9^na{{9&tH65naLhS^Ps9oQ2;MC)p^_{;`|kKwRR`Eya|P!QD%N-l3XnL4o>@ zD+RV4v`8tc#&2&DoSei?PQPN-Y0+QwFDRdD36^Irz^&vuii=JMSf_YXB@1+LIPgJ+3GlOfo)2{=JgE z>rAJGBPP?K?`--Mt-D+ACr-i>66h6T7Cunci}SlF4=9%e3h)H$)P5+pq55*O86fNa zN!cf=2hXXKe}az}^rb^}(f>kUKR~d^(+|^wdU^XFIwV z$oAciFBTi{brUG7i!DdreGDAX$KY1QHOPQ_cpnEeZjZzHWeKB&R^*<pd=q+?BPaq$EF|IZUxdJy&Twb4u8APQWKag|sf$Pa4RECzBc+%_`fi z@J;3I-v{12xzznQcK|WPdqx75&nUU@=zB;4zP{(n9vOM(8w2Lfpum>&q`xSe9oeRXHRPkijLIj;VGA=Jrz7V=X=}E7jiwk8Rpf4@;phl2KVV$@QIRRlb(9U zJ#OFn{yB?nh2&Y${JYsS&BD~(Xsd-ykj_;%=zX#Ahe4m!#dnT|FYl`l z3D)ZilIU+Q@1SgPq`n<=iSB5W>&#JeEGRp$2cGXRtbFi zYKmrlCY(kU2L+y;$OgZZJuH3x%7A>akV}^%O9TOLu-xwG(~BjXYHb;3P{4(IGdw%G zTdP!#WCRhTPO)5$q2Yo>nbJQ8&cy2Y?o_W;7`SRb`nq2*!}q_I5!a z9c9PY;F1R)bEbyvbj4tZ-8wfKW|iAgd*j}ecul=O z%IrP)fu^Qo62HwIk; zU0+am#l}x_K0S6s+sByup1t?|YG5w3=U4@K^J%co7p0pQX5F=GgBAIlb@?VR+oR`w zM->m9=HtIvy1MlG_644^UYDz$8l`SmvCf)nRm;1-j19%3_>eFr*%)UMvLpxj&4`2u znxIv|#~9PRnKND^(cNDkr~WDm2`vswOsH>GHhQXk=9o6sX!;^HtWV62?exOgAr@TT z7%*X>3*&d7ZyO?`C*BWRDxeTm`kLwmCj6QW=hqweHjS?;IIbqynihqUvoaDWuc^Cv z3DAE3xJn9U={N_eCfJg;DSJPD({woE?6BVy5M3l$_^?ZPy6w$4eCv8=<=GI(qyIQ= zP-NUKH~P($hR?@xid&?9kBbQZozG?n#i0iGo0=kG+l$3%zcz1vkrx^Lg~=Scu7DfwCaZvU1&ae}ag*t(=F~Na;?vmlXA=2Ts}o2u{0sD`%bn!W-L>O_zvdNh9xHQd zwEj8Cia}%Q(mKvPWCdf91VNKm$_TH&78;=@0vE)hVw&>eR?}h-q=&2IL0#?34jrrl zl$9!{SB)i?{xdUV1i{wV_`b4fye2Y zlhOEWuA)xPLbshoe@9;=0ZWgg@?x!^_rTN|p1#H)mIXNs3Bnm0PbX5P>Zql6`~4^^ zQG;4r>r0K*tRpPS$@cX`vw(ZnN_>Ih!cMpQyx__=dVEn47>EJ?LTC?;ED^r6&Tye( zJLT+JILsx!ujxyD7wU^7A|yn$!ncW(%|JzvJ{Y|%x2ku60&Yr;?3p+I;Y$2V3vqtK z#Wy&}IE~#=y>r@_>6r8UmuDAF1W}{tSE{GJNNED&4_+1Tjdn*Z@;#Rj=^4rE*^BRa zr>9~!RkpWhEOo1Bo~rUO_4DJZ?`NsjefBkmqX(Z~T79SfKAo9xRpdq8!`&=a7dleN4gD+a7)1O`+Ar~PM=q}`%O$?8E4@m9W)fGbt;FH6w>DOoS&2eO%nFq|6c5c0IacjIkHe`ZZQg=|Q#pD>zTFWBu;ux;c;9T5 zQ-~S5uvsYN6SN^=ILxl`hjR&0gWpQRJ;1bmnG#@7fqDg*|ED;3Spi1>tAhu9Gar|; z8sE7K*-{tnxr^NHqPB2toj0yD#yVYab@kU0+i*|7WM&63?rxGIhph)!zvhX2xle}I zKh`)iHS4K8@=}vWHgD^@Q5cnal;OKOXUX$?x)xE}M+d&G`(jjIe_E|vW~}?e=U4w! z%`ZESjM*7mG%6-dG+O4j#-y-8F~}fmNz?te)0JC|icmo(29=e)%=Y(TUAffcu@3OY zQs|hnG7biP()|6>F4wZx_69Eha~JsNAW%N&U_ceg3fyJ!d_&?y*we&DqKq?jeSUPGlr1oZ5n} z9zsTMUEjFk)TcK zY~7|Cs#gdqc20bLFuh7p?D>w5zl4$TfeA3kRaUl>;MqiG)Snpr@OEDz-V3@#nK3$~ zEyjAd>u)Hz>{2mW@)fI+e4D>@jN@a^OUcsHY^^~V^&cs_$m>Z{y$U~q1%1iU#=rnM)om=)y4Vx?l?-h4ctOgTf-yKeS+O;M>0ZU6{^gG zvUBdM_4kyM<|BE2_i1N8n-Zt@QUxuHEw`GJ^RKOq^fhK%AU>H5?~G0p9u@KKYfEgW zH7pyRElg}x7(X>?MoA+l0e=t*NIkJAW`?jsu^=DQvq;$ETPyetL5%7ZpM9_GV}x+U zh+5c<7TSE5ZX&=h%+$o>1x3%*xs$-y6ZFp}E9{)==Fg2@*Vmn=3;M4A+81&9k?4AE ztgbcQSX^MOHI#q6)2K7)nL6$KEA6W0myM9Q-1D&y)aHXfe3UPrb-+}aJ7r%xSKlRQ z?8oe%4=XP$Qu%ESk2QJ5?9{j#{75&ic z<38&oXrG|@;5zt`m!)%^4yNauvJ(K)g*W7NJVX_Fp&-~P?|}S^9YfdR}^DbS|sg_-9)Wz zk45QvDISi@8;Pwz5X^>>pT#Zq)stD3p35kSX+YmKmO>~0i zs8d~~@UR81{rV?6ZfYgIWp|jV;5$SuYROVfd^ase{F1CC&Y{L;%L)2R4T;CBzSv;2 z0tw4D>IT*>V%Wl$)v(ggeP)RXK0E8N&2y6Y6a32f*lyB*9+wcD^cWslE+Xd`r^Pi|IE^nGZE#Zd0sNnXV* zQ7K&&lKRS!%$UWds*5~;C;L5h$Nxm95Q`H^UQ1yUBurt;zAf?qx(BnK`$M&RBF(?Gr`Xmplm)2j4VPVOo_1y0$5!jv7gRiZmm^Blxt>>((Z z!6zC|ORCr1+|O*xVk`vE!I(y8(msr$`0y$_yVD1jQhIlAT;c8N8^N>HsBUEMKwRqd zL#Lg{!dnViB73QxSpx3^@3cPPtW!z zHn@6)&ZoIS;Vrb|8}41`LCX0<^gahh$F4Z%&X$+NFb!%i2{lUGzDAj-}6^K1`qhubV9XzmYTf@ehFy^`r#ZrA)G|JU`xhEI~+>UG`7hs5@i;{45zEjXdJ0evfgLa93un=F0=CLJr~I|-|Xap*qF=+(~>wRG?r!? z8(w8#?URNtFKo`sAl%^g!%*ow=T|fXK5}6jLD@zNS<(8o?Otu-)pXfu)$v{ArnQ^P zQ6=fQS+A)}Y3KV${YTH-u51XIl4{dOpBga8@C7@5ZBN-;`0&B+!zo*PGWit6pe$(! z`D^w<+nv(6SACBKMJb|pUtEi-ms&llDvnk)we*Ygui^g^mjE}-Q^R%X@{CxOrz=l5 z5bM6~rYr5LQBcD0Rw^di6?Ad)4iYo0E$t!#&wfW4i2^t`n==6ZK+EV!4Dfjmn*mY@ z&O#}almR|55mT!M1K++v-1OZf$Vwgx{UHxm*lHOO@U2%3QIA5HAt(8rX@y9fS=w2s z5Fe`yEO~@Uixd$0ZzUUT#~TXq2krp@J{<~S$R6bt>O_*|efhk?`@3*coet)Z+c*D@4s+Z1cLRSaO1i`tUX6(xF4Aj3v zlfro^6_#1;UFJJQ9S(nBlwTZzn)9wAYFit zTo&=c?JbiiUE*NXYj_vl578c}B=Gazs(d>HmM;o40jLVOWF>SXcM-Mq1EAVPi$e^m zB7btV-$UK!hy%)3BcG4txbA%gSjm5n2zY|MIhj^I!aQtgo+L(AIq}H?`H;i%6ZEoe zU;)RpUPxrFOPXO^-o!kC4rUpT?5EPReh|-Mh*;&*7|A#y16O<4 zy2w1%XQu$c?6`opKlWS7iIig`%q_J48u7AQ#2nF1$Mq|I)&+ z6A0(%9f*O+p;u=kt+0ZMSD&c|25Cxm!YT!QjO+wf0{4=hkS&P>SP>0kV6XjbJ^aCb z{Io?(Ze-9G908)?Q40J4_MG{OnK-5?IXZODJ_N!EjY>UzGmqO5;LktHiDceQ4lYb> z=+Jc^0O?*hMerh8okLrYIG4Z2j2wU8XWx8sVypy#2EXGVl|--yWVPebPU5n+>+=;$ z?CR<1i*C(l^FV>Pw?r&Ro4*-#ELi$ewV2KP-bvK;Ak}uI&Ksb0rMI0hdBkYo5XIU4 zz(pN{eRQ*>{(jhD*HuuaxGuj%KCxK)#zb9F=3~vN04Nm%4P6bqEX@ER1k;kLEp>Zv z_hBTtx9(7!CqH(Wf_K6ETrKXhmJDAr%bbv2v3+l`YkL<7hX#U{BM+pHAt!HKk?}!c zwh}h%k_$JO;Nxy-pO(}Cqskuv(qW*d?$ep=m6cI^BIX69J!PiU^T$V+TlS|vt9-z< z8kA>-#rI-Gs$7}Rf^VhIXgK8-O221&uC6V#`hi^#SiyRgKZR-qkB>cO?00aihJ1`} zQy3s_Hu+d&H7gOIP8iq7K(1#l<=OW5KvtYA;vgohd0agp0mW1xw87RVv>e02&-#%Y zqLA&yiAI{z7=P<3hI>b-Gl2!S8-iW?lS4~WsA)mKdvoY~a>Sif`h)kGqL6(~4}Djv z$|F@UL5F~G6sa)eqL-9DzOw7xZkGERob!=nptj;h7JZ7)M=gYBM-=O*RL%NeP-XAW zVt9;9t(kD`f+_|sStB-?|3uT3g5poQS?PGI&FQ@%ueNT8m;F=<+BIRYd&tFB=^;l6 z3Fn!{eES%Wu^}13UiIC<%j_kL1`+Yc`AebehFyLU37;&-8lh(ppIY9Ky45i6Z-e7R z-)xr4+H=(@zTAFj*^)c{CLL;dTGeF8!`s-LDHpo8a8ab6HoycCUFi<4`9LB|2o~-j zgXZQEFM6)p^@=DJ7|ix34w8c1giK#?wHj+oD7VzD_3K8!Gtl3GZv8Zto}nX1;nY_{ zv0juL{ae^X;CdIw%8WwE3=W2sf`KJ`E)DOg*ADmqyjiFR4nq8r6FEAS$$2p{sL6Vr z&DgZDT{Rl%F{XZTigfct8=yFrc zw0`eH_K;OBuGd95N@ic873iZE>alkj!M`%B5%kB5*qJ~9h*jePq=N;8t71_`&UmxZ zaeI0VuubA_Ha^Wh*oOPz<@QB3$mY7_LZEBrtTXMfk4Omg3R}(aK*}M+J6t>w{$%zHNo&7oy;+hRio` zYX6X0SFR*uZyQ=}0?o=#t-d>+bCHL_pfg?|q{3A2Lgj}?knfkmkJR9(uAf5k zWS$H5kDHw^T+GF9AY}&*nnwo7*hT)#5NYCC$wA@pcaG^;v=t#3#tzRVYO~E|9TcqC za1p)QogGF89wN~-lOlrdCX?fX^cQ9Ev)?gCO0*?ILFA=m?XA%a)wsBXC>$4?7429* zv78L7RrRjR4AT}<_Z8A2!qpHyeB0!8T=CCOq40gy@YgG~#X=4UPPyY;$f8@v zt4--sB_-c&rv(r2+55p@AZ`eAa>V%mU$_0Y_j;VWm z&n_CmV4z9@+K9U-MK#Igg)GRGQTBaB-`i?JbciHxhCq1)N!FCzeprq&y>Ru7DgAUs z_DEVv0>^|hYzs-mnJ$Ub2Eo^?Yh2h<{F~2xi95BR^7~<)xPpqbwc?P9TrR06k5?@? z2NF2i8mpRN81vZs-Hu?MR#S6Oqtrqvt~8>P6kNR!!4Z3*YKt187PF_{r8M*oG*20_ zO7S(0QQ*YJuMs10Xsq%57DI`o={EV0j%|4w3r+%uJ$pERJ2uW;#EORdQy+edMLc|v zzNAn$L=8;4P|9GUUxEFmvOi`6`-R&!6%L~Eolgg>f%I|AB8;mCvk9c*QZ=~U_hGO5 zXjIm+$GzJb|7Roxq_q73d)2AgMe-+i?1EOjJ*EquvSS`c7(g1~h6je!Q05!r=j_)D zn`#~8--Xf14yhMeeZb|-|tIY+k1blPw;cF}c8gTooPp4&di5#=CQeM>+rlK=H&RjLJ%*ncxT-0jIzarW}3nQWRpStaaRZXP%4uEA`7zpG8!(0 zAVhb5!=uAKk*riNpv#a<1a#F2+qvx^1TS7h0QY~Z`Es%d5M++d_sK?lKt?+r*|-y< zk{x=f#7)qoWVdCNH3DAj8A2D;V@o#=Wgx)bTd-ZD4~*F>6PwR^*_at_Zf~MLgePU1RUM zOY{L;@FE1n6ZZ-m5fFgR6cldt+I@U~W;>0}xg(2NDFyAv!`Fyi{zq^Af~!|^&4LZ9 zVOm$h#me*idsnUcFr6cS|vQ zNI0um_|)yaB*c*RxL&f|_R;=^rjNrq74xE32^_xravt;i{-3hyu2G4=wAux34YVuW zPc?Tb0og|6$gs5lX_DHXLaeE2s)*aA;cWY1LzC_w;+4HE_-V=0iQ1pkUS0+Zo6-)c zRhbR;-emDLH@H_)%F*d8;u#}P@a*6$4_X61tfKE!Wjdgn@hKMbmLyib~%#9|#TVpv& z2AN3Yc3wa^fw)8o0-L4Vss%HAwXogoUTWn+T}&{#AciR4%P`RB&|x!(;PXH#(-L38l=+Zg8&mc!u3Y$-40H>OicSdx! z9cIQ1l9)I!(8d89!sVaPK8w$#0t`29NyKKM#ZUqdq8CDOHi(mn4y-Gk+2{>=EXs(L zZ$x%0`j~?s<&Vx70)902=as6XLZUf+ss-4cjbpn{l9XHVuycx#Rxp}U`L2-WWYC#j zwZ?jyH%aJvrS+ecoq9v(!^<3+7(10^7El0RI3zp38qv$DC*0$W%aI{)4j0hEN+{xM zKmlHD*KQ?)kj84yL4@1nQyls8YA_iHXip&RzX)vT$*|OsX@NIIY6sSY7h${dCKmeo zl{cX=pdJxlAecm0iqcjsj|r|dB~>oPa%BlLfOzJ_tzy(p`!F^M`p~Hs1nnu>;E_3N zGT_72m4cp743{CBrzg5}!pzTGaSJ8mu-BL%7GBtoJTy!eVe4ficQsWRJ3mNkBQ*KRekULMoEys3+B>@03A~>2P@y;r%LG+Jbf>C<4w|zzB1G7w+L8v!ywec@;xW+W$bF8(aa!~jqEwn@R>TOJN1e=C%XO(nF;!4!D=%xmk zolXqW-uP=#xCRAW-$mUA@zZOE&F#DoJ--}g?11t3PQZ!eN{5lOad}4I>S;PjO7+Ej zLk>}7bJ+G61emuqawOms9r+DTc>GvZAWuL^FFNik(hHvTw;uZm5ky|sdjWrIUv5#kJEezl<73`o*%xuHuFgzruj9L|W zie^sQ9)gwb8nY9oIgDM)YOeA(9#E3m@9`rfMcM_`#EtL0!8eIk6_?&5nSnj9E3Ph7 zh^T*fV;79s-XxC^QtC>j>_5r_nV1&4gG1k7R;pIR5&NtqRUmBIotD~|!lm_t*6Q|` zX<#d_+`EtFn#4i0H~PpCQ>IJUVBu0JMDGggRj|a>4qdm!3rxKB)wvi|r=1zMRJH;@ zc|p*oWC$Cj_T{<_M*4;1^aahqwM6V~aQqWTP(1x2-n~u!{6_skdso+U+>T{%d(9WZ zVG^0;j01(07JduaQj;8q@1DiB;m4wdZo&;43L&TEW;@_-d!Egu&u*Y+bMsR2DMD7G zJ+NGzLRT_E@Lk^uM1Ty8&~*~2?ZUGR-*fC2hd$?#j|S~*S^Sv1A(*Z#K1!z2bwpi6 zk#|u4xsk=JHbM0Sy4p+acU5#LnCrbj_BqCc(I6aOyQSNM7i7A_eX3t~_ufr_3>h+m zv_!>dB5Q(X-1$^xP=s5%Mtg-XxLO|jLcQO=PhY-bHRAiF(O1Eo@kDQgSA>m_ws<3z zn{#dlwK77jUtg-jQ^HruEEF_M&JG(eQGgvQmU8`fU! zW7%KzqCQ><6P)7sV3o5_mDUvjUl`~f!KPSY#Y>ZQbq^$`!+;l()r zUbUA&NaSXiEah57XkUw_&7wb5g4m%*^caGOX)@@GU4&f`Dc{cEWsX0FxT#Q#t3fL- zob3T1yWPeS428;7D(;lFbZP!t$6ebF0YsV1+}dqkcJlHRoaHQHOWY2weH5$ztCvl~ zIrT>r`WHcA+!o2Js$8PxToJ3OK}l#rBidL+eE~zvY&#tLG8`mFGp{SqVw2xT3q*Ou z!<^Iuoyj6nJ(-WqF5+Mgxn{G}AEU)1Qk}2KU(2JTp;t$Mc3@B29R+Jk=Bk4stDVk| zI`Qx^H5p!^SBHXzE>#L=v1!3=MsL1^Vat>T_!SCi#@JBHBV-U_2X4P%OzjWZUMa_| z)H!s9SQh7<^GnT z59+irWZrpoI8%Y$Y^QWWa_h$l{Z9qBsGLT z9|H_533EVP_289o2FEZ%QEUy0&8h> zEyC()I;}!`!~)!fzchJrg#F^lFvW=fe)kB{6n9Covh@w7&5I2;U|*soY=~UYRrpsZ zxjzD}m!jh%f|U)EK>&5G^{$+F@oUD`ZVZT!-(jXPiRGDh>oz_ok z&31q%a@9;u$mL+qDCVQ4>P$>CJ7zT`-t$(phw4_anUq=n-&tNkz*Z-NLK%_aoz%(y{=cLV)A`a~-_=t}c z5Fa}fN#RV!`ZMFYLr0&BN)31tCUYaUP2yVj?9ZkhCqo{$38XEJgY3-=zSMpW7!}bn z0jz{%^JkZWWwOC0TrH2*75p$80ruHvPB1|MNBALSUce)*w(!cZ%cjD~R;rG***tf% z%lFiNGu8LiDC)_5=9{_w=?(!dgbA3+T(=i?R5o=YrPGSy=7PiD6qYXt7x=5w)!c4N z$va_RcmnN0QSYexK8o`;W(O$cfoYJ)4KENKgjiiHIHdk6!xZcf>=YUk(!3hhZz{c#5C1pjnma% zgzzJ(_hAy-i}+rAzmHqKh`svr!TX>+b^hF{pCJiJw8+?Xll}goQzom%6H6Ae8NJuz zP;ORFzNw9#kR&@M>Sd36oqaA!@4$yWdBc@YOvE zWY9u4_OM9xVR)&4Y2Nwa!&APL?4I{98(5%ix7QSm;oNY0S8PmNKNJ$E;-e=K& zLi`AaFAYs3n_#ZP_-8gxqDiDxbo0}vhL~*U|LsjYzDJzu;csX@mjn{=4cCR5SC=Lm zYvTSYG!hUoek@z60f&$e3@RI-omzuG;qyJ8C3MQ9RqeNgvD#y- zh8YbK+S|3hzIk%7B_^i$@&7d5X2h>>js@ILlCNg;o-Lf{2w%!6Ctw4N$qJ3VpnSZ< z{miy-4tbM9MqO{S59YW|gg$uEGm<49N0z_>1iYb1e=fG0BVj4A%Xm?$oDGdZ&o zJg0c{0=*$=jVJQvOGpySQiow0cwP=`l5#93gWB3%TAAk8rhL^wCOk$@mbdP_S>ln3 zC*S#lM}FHlKLqIPO|YxcN*wx2JAA!Z(fLRe3U>{Bva+B`@zZ$S1XGMyga8YihEYs} zHvZ_!1#5Q&;Y6LvXSzGJB*JfsV$`OODvj{&AdPfQw>XQwS49Rp>?+cm!(v=>F|6)J=IP=mLg|+k6 zlk@Onqf1g+HA@XoEE4Zf$U#=cqf*S8(7-tlmXW3-dnWcs8(NKt+q_K81j)VW@?sVo z8_{xjl+IjGTrv=_F-q?%F^wEA(dHXfUd?OKVDk3?AUru7prj6BgU+$+BXzAa@` z_U%0&{OW%R;==F+!m_T1F9K=cW7InXeOWW7V*fWmTo}*M(C%^n4dQaZV-WxvLI0pC zBaT+wPqF^rBf5a_pSP-tXlR~{XlVYQ(9kY`SNzw|&|Ems&^CMP;d&`(;)tf$1VNT7NqC z;Z#ZFG@xL9S7>^*e)W3p6rtNR4`CNrPWg3KwY-Y8RWZW05wxDV`@FHf2g2>p=*V*A zF`@sFWQ#!XwEkijQn$r*edWA2!~QYZ?TPD?kA}VD2Z)OxKOcst7Y}YPWQ}qyFTrfm zJnz|bj}H$IzY1phsg>Wh{Fz$)ND?7_UM_&e?k#qvv!~~N?M;vQFemWO{TE9lm?Ei9 zQl_qY*nNzO3rMz}zXYEzs|gntCqu4MY7N|{PV`H>d>2?pnr?I#jyEEenoiV40%}KK%7h>bMVwALupE8zs8UZSV&ec(Me_g->osQTAruZtSJhxBL;gRn16a z%f@G~KdAZhV;4*Q_B?*z%-cQrU`iP>n*GUa^^i(Ur|d9R*R5fJr2DmMOoK4^I~&8R zlH2PV`TVfPUXpXNzhR}nrA4J2eAXk@Q!8JseGF&)9`3+3v_$GTSx3C5@_WN*Mm3X>c?f(%{`V{XerEe+toZ{S}xr~Q< zO74TU)bvrP$maX>F~Nkx`t?AMPjXrJTrJTxJG3gyY%rcggf9I^I5%HYqsB2+vn69Z~j#g4Y}Ac zr%HDQzoWK~+%n)!rbw1I+v)PRMkAj=ho>mQ&1Vz`$sA1D7X#_uTc>=@!iE$`r0os8 zB4j*iN|qiJ^@;RV8B@g@}gs#i2NQ7r~L=r}nOn-L|V8 zmq*VWlv0kOkjqsH^_w}cOySo~YsU*NU6l*RE6i1en~KaocQ0?Yy;4p`#o~pIu2b#Q z%#Sf+ze`far4ra6%kfG)7Trqxw#ES(NubfGU6!0pzwsu+?YrN+$|n08b^XW`uaH_Q z@L}JA%S93uzx6zi%o5v$tZBX zww6i&H@lGJYeU9?t1}c+6OYHtd&1z^H%@=B zel}dp$jm$MRB13Sk*;GspWNVV9+))ar}GmWM@8%V})TZ-}az1^xm5xHCDaUiCO?JVp^!r;sE3O7CMlI$6LP)l>c^Hu`Iw)dYG4USqq3f1yb3Wq zxKwky8RK@l?ki8dYT>S$DPO9sbJaVx&VDJtc3zU6p?8#@f9Pwuv8AMt;@XLVQ6~x> ztiY=D8{W@9q`Iy&ZOrMGhN>12Fn~axpa($LueJtuW-i+6e$HGYLAQV6K)$E7og%(t zrqp%bhcav`p$C)SN!~Y}*Z1)u8uq`9@D{ysy1tC?KHIADxjpk~+FLPv=#{}+H=2z? z0b!V35cQUf2+dLBFdK>Q*-?l#A}J*7oK*CT-hZ6H+`1b_h4e2jmEq)xUZva$=6^z| z8G5dq4D42)a0_T&EkvB&&W)bSiQgQKk^zgdAp=sXe!qA&-LlOd`;EeT_9U=)=I6Xr zWTVOXL@SMOL5&>)NT^`h?C|lfiul23L+ZtPu7lsATd~ho1aai`$|axQ+Lhu&YQy?B zZe9bIjn6$wlaA;63nvpn!9t!p&3MTkgQrR}yI~GKQj_p1Uy=F>L|!>Ov9I_Mn3I@6 z3L>pTU>`;cVxhW=c;~`+^)&TF7fyXM6EVH>xDr(+GU=55d-mdNbe%d$aD5zUYM=6E z@d6fDGIeuO7#nIQve&&WFY@DBQOj=jcJbH?apsnTNQixdcf1ta+l|bzg?Js{316Y8 z=W;5{HU#EXkL_xAwiLCJ8y61X<4v~-$0QW{YhWx9&y(q~O(nl;`N%Kq`fe9VH`}P| zCg(jWGU&mk9| zlVcQb;N)@SM9hzQAhBdTknPNFh|K8dNC*=v_+$myTB4@I-MM?s_ppp;dFB0PPA>JuOlo-Yo6!Eu zf<~vFTuWcpbjSO2{cj;ZXM93!^al?;FEx$c5CN&>>Ypl$tta3q<-rNE8RD-dC|CWU z8$|*+kn=9oK6Q%VK?lry0#bjxvF&j6t8KF+Ve+&LHetYDI=@VKX;}KcDQsfbcX2*x z3Z@NHgDl=H^k?}96%fM$)r1V&l=tDeiqIxIKlIw8hstL_ceMhAnh=I|`{E_n-Zmvy z%*W4_dI6hJgw&>Uv(eJdH4&QOtkeU$xU7?mDEs51J4$SgWLp&?(_b(|xU0sf@E@!x zvNxG-o~rGvwxd=>l-8%qQIvL0lVBZ7t9wA5os9G+@^L|}^5Zz zla>&4cn&Z5pq3hOR?FVB6w3`gh{NJWNeaP=hQpNQN2%!}gj3p;iCm92$j*MsjY>RDbBWdo;|F_9EYi9L$>RcW^uF2P>-s-M7!53PYrYg&| zur;pQ=iw?10@G`~G%2;0F(Om~POne$Ru4B}8a*XI2DK)fJfpq-&7Xx>RijI~t3F(U zzFN7AAV0H%NnOT>v%$7zJ_QQr*|wVrh5D0jm{v)`RX8)Fq04#O9B>3K7sJDp&Vo5Y zA~D_;5gZq06CB&u6T~JXj;!2Qedh$m0(BRbbor8VA&R^PA1*%QAq3e!DJhkR99M46 zUvJ1LU4_did5*R2&Rqrr8#=a%H3d$XoR-&Q_9$|3EWN&4J3^bhj+wHG@UZ`x_2eo%b%pFWQc5O_E=%?9Y z2Oi9`kyd8(?6~%9{MZ8dWpvN&-R7r@WT$AIb+G#JmwBv^-)7ku_>2tSl8{QRe5*TL z|FO00SNEp~^id!c$FFfYVz&PRPeY>YAW=zZB-Mwv_8Cif#~C$WN>N8%C2F1g^ob#L z<$)QX1dXR}~L73RrjfXr7~yO$s{;5(gD z2$}Vs)lM4A)SF1D+}{{!5wWP>ntZFmi>SQ)JaRha*j>nrs4#1l^%9027>MxOmz30- ztGopDjALSzJaPV*k+P+8R(H5;rYS$#DZQZ-^N4yzwcVmp^0r90Q}{}`{H;pN27=HR z+k7vDwK+Jq0`Z0Nfcip<_#1#uBpr}Bs?cV>-RbRRw}|9=hBxPRJ-c4^o}QPpxik1W zDLjY8!;#7a;@4*_AIpEf#D9L@>Uy(_F$UhGd!vD{h<4vTd7U9RVu48tOYq^ z?yH_uPhM%_HHo8PNYJHy>!B{y2PFDDN65O28Y zBEzz;Ui_p;EoeGYX=#7+r`mJSb}1G_7R7qyG;$^kR1vmaLe@D5TA#`&&0NcLZu!n9 z89qBfeUig-64EZh#tP7B?ac>R82U5Ad!_>Rd0+)J7tGFL(SB4NjMvX1BLoGR>Cz zhoXGtKJ?sPOmPIC85$p)g-6bn>RK#w&!*t_4}8kyD)4>ru;#;7WDALgFE{V=%Y!Cg zUug&=dGp*#S?{S81Nw10vECS=vdZFdyuFs68uVZrE_V;oWO|^UjY*xP<9msUs#0RR z>_Pzrt_AH80==haP<9Nk?4$_9I8aE`(y>ot1Hb7I|Z-zzXX@zEv3w+bBP1jqFJs zi&a(^zSsh$_h#+N(2xHGsl$0=zgOICAG@@dn4w;poc@`@(az)f5hy@XUTv+cO++ca z1kER~lJ77{P1utN@lGG*eP4&wvDcbz?d@5{7EzqW9<5k>(_A6H(a&Zy1xZpS8J^o! zh4(u=R4Z(yrgV8{PJ8RK)jtKlCCosNFcA4rylSId`#HjZoA2?(cmQCmbt#Fqhc&SK zdQKfr$ItUS9mvQi;W6A$I!=!YQ_t;_^C_`5`q~Wfs68y1ykTB_?>nSoY&5dTrj0}b zy4^x1ymLIOr&ZB#uP) z%vY{QyV*Co?;wjiA=>rlZBm<&`e%QPn+`~@>aC<9F&TLj<`9T_3PCq=>D6iC5P@l= zZ9LwU_bPFd@~y`F(i?WMM2(oY>Md?ddwKZWHsiIR4FV778vcpjHr@%vSar8H&I zP3OSpWNMdpl{~t)y#tw4kdnrIM;_PrnJCFAQlSacRltD#EC&EH!>Z8tln0vBm+mv) z(>b!bkPeV-pPmQ?zFqh8V*vxtvC%O0*~aOqBm?)hmjYx?@|w^qnVdL4o~})UBG1-P zv{g!tQb?p7L-!j4n4D8bRpG=0WdkbewBF^qefPKHl#>b{uYvDTPEW+-(TxPJ;Z8-*+4WiZ?DzNuG>^Lb&-G_Syv?@_4q+a!Jbez zDa4oYEOkKSDA#TKr-Kz(Z9&&B;kVvo_zwpg>aB><7kmu-ylUrmLN97mj|(G$R^Mf& z_-Q;G)6blsehl*7nSTqhc)&AqXmxgl7NCib&E_3Z_yFUTVEy7&?!4pqNnpwBO>xr5 zvRTu#YyC) z;)2?IS_+P4DA#^plV%A}6{jmao}zUBx`$W)>ZFf^>TI&+Qpoqjc63wCu;H|HnSILf zjQ#pjmt^MjcXDgWOR!3OG@z?e`HpsPSxmfW#@T>n?uC)JQoc&|=(T~V;vdI0T9VL>G z)VH!6w@q%Y_-Z%=DS3ypWR}%6Toso-Y|(l~kr~l!>8rULL3#Meo}qxFvSzBW?}&T6 zG*4WAKyQ<|C1SlllJZc=#;O)9)LX+^o#!B}4M!7^NMpcknHIaVXhg3HErlCS+ZS?k z>z96S_t+=Ab8SV@@(jzn+K*7|j=1#mW$0AB}{9 zFDS{>Uz;DIIM`L@2}BI#kF?r4BbF^2A75^)>lddO>3rF(VeOtT2t7U}h^xSkY&M&o(2K#(V{fTx2CXs3 ze+oA3o^L*D^qOVvoY+2|lQ|JSUGVAmTH{$2zS=mXp4z;Ui9_6WF|$wpSi5@saA5i@ z`UCIPuorLRpD*D8$yaY3kD9hU4zyl?nY3jS7WK|%KBo%b&Muu?_fM1ft`2Gy^V^hY zbnY~4O!{b29)8=Uyxi~;vMAZ5Za@XgG#v!*>KtXZlH52>$@?Bf7+x&s8tj!g{9f0+ zyzh6@FC+m5yIcx_aj1!S0i&iBU?f(eShHU;r@+FxUAVmrWm$*PxvP!rS93?oA**+F zXxu@LQ@4n#xyY&=ua#?d;jP=oqr4`+sUgGLvCO8EvdqSxduvU)?!5q&HFUeTnAxz0f^uhzW$d`27n z4lYRi_7&N$53|`X%kTLe56m5vu~Sv=$z!oy9Sj?uhw(L>vCr>iH1Qj4v7dM?7;e?| z7&f@(vNtiFEef1^UttxpT}vG2In^TaGS7ylU^i-QAAa^-!Aufz?C?g27+zg`6N;Mv zF_+3ms#)>^?C-BReoPwW=wBb@{faRz>SbIpoAMOIV^z&vHrtucdq*C!eZ!^36F5!0 zzpA8v(YcWN19efgfLx70t@7DYxYnAOp?-5y>&E zYK82g=^}WI|Jbq_rj#$@j_?3n+lB_5rQ(GJ65;SY?SMPM6o;;HEm3amlA1^^0}Q>On>oii63RAXB5>u#X$;b7p=C8@4Zdxrm zcNDij;wTjD$z6WWG$xD&+#EBIVh#TGU57;>o>FMRciEK(i2@AntChiXWs&{TZY_@Fts)sy%V7g>u@(azclhF}@#shq&daf{_gJ z8b*?kf;740zjN@WLI$IBB*^S@luKiVA<5@0>3+OVJ|9|Gw3WE$3wHQO^d%@C#P&=`zLB_nXOvp?G!55nt|pWC{aU;81RY2_$!Nuqe!DDDbGB?- zgQLD(Q1GVg=bi*Avt+Y(s#vm`Dszk) z7^e7!bf9R@vY4^5l9yzEIA$C7^1LW?S|k1Selkujr5G)A)4Z$41v70i1hQHU1&$iU zcylrzSz3!aPg8|Os`Qm2n79Z}K!v_F209oOhu^a}5}=C|rUnbI$yOG*-vzUS9q)FF zoaeoEwM?5=aV*O}NOMEsKd3A-;GSN^ft7CgKWx*bN=-6Dtc?p^<95b|s=Rd2R{TM6 zK(MC4p=j?Km5g%1-hy*>5k&Q&BtEj`^aDPw`qj-y5b(C*CXDwb<`o&x{`>$9j3IoPd$Z8 zI>OY6NVRP6W&Ly(y=J$i|Mt<1vQ$GTzU_sjJApkWcoYA@>8R%?pC7r{C)c7d`ZgO5 zH~eHp64H3H3lk9YcWBd&>jPji0(SUK3O(6iG7z%C2g~IY=?MC&&n!aDu5*n;M2c|@ zRI7VIszimIQ+Z~QDv(Nzl&ORMzXz;hW}1IUDD07B081GXH)Lf8-u~`gq_u_h(4(l6 zx9=VJ#t~9_hbJO&gzvZ_S(u_9&F@%53%j+b=uXPst-j8hu`>?FQ&Q}IXFkB4wG}81 zr}Or1g#w;=lIjDf@jyK7Zr03b40e#w@MElV!#$PqQUeeRzN}?ELJ`u1au=>0G>KAN&nTbb*JHI+YLSS5B~>h{(Wr! zLBM)K8iDqwNeKx0 z4@BY2&ur8Tw@PVZW8l$L)6j`wn{)x|8-zE*xqVOYxZNr6vs-NloF@F4nm5~h=i6V{ zgPCUvTkg9ID1v1}CF$vNGO`*cO<7eWm|uX9IIqCwje7msky)u8$1ez|EH_DMKrTJ9 z1p~C8gKSa(0omBcti%`J-{nLr=y~Qd`z}ig3-sw|(t`RT@^rtS%0Z5dqHhsus>j<2 zZ9S~XEZQ^Rt8b6xo^+N?#THO>$p7TUYglx&FPcQ$crYU+a4dPM`WnnBiPoMI6Ab#<31*~E5LU#3KP z#&}!pIEezpyC)k#D(3zcU9#O4TH_yKM@$w*H#Yd>vfcxg#4C1uh3yHU*!LuhcIvbq<6Tk^O)R*-CGTu3+rIYj?J+Zqe1 zDt-U*1<1m`#|2J@jAA90YsoGbalPjOrE$LRmCEp<;4OsymHllU;h4u^Y4PO1P+fG$ zjCE2@KLk<8G@%-uJ6eNkD+>xjV4H?qHww;ASjJkH)s}tu{pLb;PC3z$9jDQJBOYsq zYw5kLYqUJXq^eZqXrkoM@=K72SvG1`I>74%jMQBlsI8(kZXyOj8Pi+Kx)N~hlkS9> z6SQj@6~%lYLJBb;dBrs=TcWy6;q(T1PY!9Bqbu?iTnTjXqsd`KmaUp9gifk-Uct(+&qWt*%QU6Y4V5spZod*NE*bzNSKX&5 zdRu{Xyd?ehr;mQbe2}e5#F>IgzUb+ZP4e+?tc0UY$qKAy|2Cin-AxxcD(g3cVeckl0Rp8c^H#a{4+jmHQy(Dx^Pku#oxpc3@+T;+wZlehWM^N? z7i3;ZH!0NhQwmykvgquv6zYHkqO5ewp#({t2?KB91KT^xY+P&2p)NF_gAm#ZNytpv zR+VXVQYFiA==kRy$=)J`z7v&L2fj_-!70ly0)d_lF`Jj`#^`c2vKgtL=NVK4nF`#&EI2qp=u14Jx+ahec%#~KoLEx zI#))u)hERXAn38!;S%Z~^^-*Qd3#M)lSs;C#~T8#Y(Wm)A$Fg!Dc)DFHDLyt3l`R?uB*da)%*wwI{? z%-T*F5`Ad3ZxiNa#-!HEZMtK#&-UK>Mz(%=VClTK7z3RU%!Jmb8>POmuj%C~rC7OX zZZ)KGC3^71q_qeFsaK$jJ-Rzts0v=<@g$pxhqfq5I*u+FiDhQA9srSg)q>=F|DFi5 zg822IQ#kJE5Qe8u0j1|t+AB`mS4Dhd#UvqCFg?izv|IvgY#bVpxN^eZ;v)Xx0M7aS z7tSR@xqki^j)wCLulo?-{mT1i?G9u2!r>AVm|ipFEb0SC>;^%IKOBF-jRxe8=+ZX+ zSI;OBu#gd%rkF>8EqVliM)rH7jyd3SIHR%=FQ97;z8t1U*R1>M@0n7K^sq6X7I#h{ z{y>GwiZxKmEyI!YBQEjQIyhZutym~oR1?BpjbaII=^tSOJNbI13H5$!$LV6gsd#3w zwOLNzW9rWv^g>*=ib+kd=Bh_f=9^BO(ppqe5by#Ne*Kl~&A^r7;GdLY#RX%BGI{*Cj4J|V#-jCaF zE@dWBp=LA?=@Ser-qLC&YN>#afP>9ru#`I6*Wbfz>e_t_>)FF0(osd7s^vSRP&$|) zFv$iY`&JH3sXy4`5|+$or4sRQK|%DdVg==*ICjGojaRKR5oY(fjMwnHVNyB=uR^&o zEGo^Zqx9kw(D$nAS;xAAx9UM}6}wn6MIrRYg^rSYJ0b_T+mKk>QZv?tQLG@1KH02% zcDb(8Upc@+s6fiDO1>cI-Hf8E&QFqF^b~w$34FJ#9rZif(QI}lcbvtrl|Y{M+)M{v zFYCPVbp#C@g;~^sFSdwBJoR>5rBt9iFUB<`L4D0o%`hfyCl%--*;mB7osY@1y^X#s z?L9N9%YBenI;ea;Pi+ZT+(^R8yEfWNTJY2P*`ebzAqdG=Cf&%dYJ|)BLCIKPoa7m@ zmgiA$Gimerv=3}r=>cj4ENuw$dyDS9#2H^6rMI4E1dQK$%UW{Y-C8YKx{ z;vRbYP(UdjMgOclqoyj0a!A*s6~Uc{^P;YEi@wHxdtKgclWF3D&lVyTW&Sn3+($WI z@lIPq(|SXPIv{N7Fh@y}Qk;E_l}pYwg__L$ummg9bLS6@d-G`om#KG`LFs#b6=`1E zb$EtxwRaE@e?ewt58VGuIFfFb=^9AySN;G7(Or4VL;2pXkec4sG=XHy^PI&GW^iED~05;mWdTs*<3Euv3t8gTO=kO{{RSo{F8b!B`+uIj27!zrrDXFOq}qs4xz|VqL&V^SIN|uJ710 zQ!1?2p_Sy+O9TX@Uv)V~p8>>~4hN1iEgrftef!o&=Hl*FVqNSQ27g2h!`t(3I9ADD zubg(jzK@Bc0r7Y-_R)g2j{{Ki94EV_wHPnNA@p1@M1`C2X_aM{EY=E;m1Fx?p0qv- z$7>WOcs!uz@ef&YZH*fhZFeFp~63g($c`ZlWi-taSUzjU()|HsSSJbIbHh zk7Q*-)+JT#Ot{qCGZo6Ff)LI|Lr==WfMMh`{6Ls7yhP$IhjOiQW~L&#%_dmS>xKk9 z;t3bdWfa5}w8N2jQ?gjki1my70izvVeO^P89)uK>7~U^fZksBUMzuvJTk#Zd3k=oi zmWK7Q!A?!on1Iz&t@nLZ@)i>6QfvcuIw^PnhQ0S=sQOvqyXMD}nw({WV+n#(HK#oQ zX7lma9^L>%0_JtMtW+>XxK>YKi@6r%@*$v}9&i^nd~yTBDBbD(DjyA{Bon=n8^Yqa zFtp3czb6Bs*9k(5HY!*<+Fw8Dse0h;qbVRn$5X&KK&rrPIT&f;rXK0IiO-R=J| zV5=7_$bFCfFN!2q5rf$8`sV$}bt7&sCsY;fxzsm$nlD)i`9>2c!Q+N)Ut5@t@O{Ro zz@ZJNQzRJVS6O#kle^ifU*_eXO0--kc`e8z~C~cY3$Jwkn@?-zA4eOX|cT+*9i@i0MH0(<+-nm_VMPLAX&B z3alxG5aW^Kr1MyK7jxP8DB8qx=rA2PzxnonccH@Vd4E8!;?B58eYx3O>!mL6I25jt*`9<|jLuaq+$ zh^R0r?@?GppbM?%#4Qe8hm;{*9HM)f)db>VSCZaq|HL?8tLYNnFc`lwSK$h?8BYW zeCy5UaOT=ErA{oX7~OlHsW*|{SV;4`cDW-RJ)h5gGhKIP9i#ED@QdX(4?fLVXMvH^ z`Ufgna1qI#sj{Ms6`QYcGrlg!aBkfXL>J+7{r;%6gCX~`UFYHs^?NV`N?$%Y1@&Hw zR8G|a^sonZo)uRhdGJV~m*ry2Tj*Fy_RKyhe15BKomZUtCC99}VEyoY-AaTc6@#-w zB-NY2zT%>A_8wn(+lF%QI2vR&!l{|;C%fhZOL%kL%W*PLjWa58IaHqh;V$-2VMO#e{Mygt%T@p8kF2)%rCi0i7T zl0H4EaJFax8-1nkllmZ&+xnT>zd; zUxONsM6FnCu-0fs)z6U?3X+YRCP$t-9{@$_m{YG4Z_|MsnXHr%KBa3fLPJ+3>fF~@_GS8t!m4NYS)2?W`3}{pT7smadU;1$kwzDc^!;eC=>YZO*%?gyJ zBMM=qvLFuJJDhJ*Tb!b@n!6$p70v02;2~}kEus-)lau^*2A7|PtzD4ce+nfwB|1@U zkJgT{PA_!Tch>Ait(Ak61jt>U6YXel36wI+jn@rr=7?>CZIeWr;YGn)o=7*h0OFNm zt>9r)9OMn~CW{75i$>7D zP

ECbsJ9TNi#koHvsCd`klzJk&6DTOkPCRWWs-VR+yiDMEUGrTa!Kd~Hh7g7kjt zEBoO6_#qH!+)#iI!B@8=&6YU%WG9H4N*w%BZ-HAQjzM!LQ6wG$P9+H z_q8-x%zDZj41~@`k)k$Y=>?bu3ll;CTGr*jASJ zXxanpNmG>{-nKuAW~tE=`6T%>lk`E+^`AWaucQqK#u zB%Zp69;E$XqRoezP^D%)@061z_^3JcHTmiOCP>sZn(Xo`T)K>K^||8>nQ6>?0-5ZA z)c2RNQ*V7rHB@QWA3+zL=^xb-u0B4Gug16yS;ae+P<-Sr_F;Z7|` z>>4E+lN{3&wCnV^OP0i^ZWGuk0B{9via_a9#876A4>RxIlm0IY<3EH9Y9W*rvl}=Q z-2_?QeVBs;H6i1IJg@m2F}jeyDE$}iAZt$oa2RNf(z(OKM}R5B<%nf;_S7oH-}~}O z4;N-Z%DMuWO!wl?KZk}6PorDr(1JSoYXC2Av14$eVu%TpgCjJ&`n|#0gmy8etpvQ|&zN>E1BGs77m7bPAfdVK&?P(eDIY*vM?gmmg?*|gg0|2B(C|PEFoYjU zaLS|1o<4+$0e%MJVA<=VdQ|)rebaOY%i0xU-DIDC+-k$kpV78>yId}cP?HRkh65V| z3N8&^f9E{j)NRPZL|^M(AZ~_y03~>JP2-KYYpC++9s?+UK6KmyyiaEoE!PFHaWZ=j zD7)Vnm8BsW;YIJDPxC`0AzS#`)mqP{!@@4$I(p2hQ&lhHo>Iy1=mO zre_v;n}eNS`o^Ors(_OLu##$*iCE=7enh<9UaG)D#~u|IWdoHy&PGMVEfdRExKP0? z--|N1Ayf;y3+6MP4$WzebDOqo$&twX&z{r75cafI6X=)PJq0h*ZyHITZ8;c&VFw`D z$AG7X0M|CKw2Fkl!27T1dXgJY%i*KF5{>e4L|qukk)dCc|Bs(e^G9Uucp{hE>NnkT z81rS=JqAp-rp;?bkXKB<56XzDL`K>zv{=~`fQwL30c=z(p)A^Va5#`kfJd|p?&{9p z0BHZO0G|ic@MnyUF4=ZAh2y_((tz$0(P`nMvM5s^?7;PJC}5Nf(MA^XV-PDXO&p^~ z+AzFpUquxgJh-LK?)q!J+Z$N1|%G7+$$y51Py`N^PRXkv8XJo#7i{eO4cq70C$ zhCv<7f4_`|o-MzxMD$Z+>OR+BN#-vaE&2q!{}o^5-!;uqy#H%~b#`>=e`Rg|ca8o( zUf}?ZE~wc4=O;F(lV9=>BXQ3DDl%vo+L+E3aT1WX%m4YCF<|Xp-B&`2d%(=0VTJ;x zX=r&S{oiXN$vd_b{qO((IT39+5$E`=88aHL@9(JvTcn7Ni=0^KmVBt!j(jvW6Yj{(f17yQ`7O*o zqIWcFg;WQ>3`4#`+v)w!W3F;#G#48xy`mH@p_1AnN616GddFrHz$y-PB9~)AwIQq* z7E8LoHcuW?$*2^q_6?uB@s`(U;e2-Q-R<~msA}Z2b0zVI&GD<6!X>5&hlNGJRl{Pv zg)=+jrmK*3{LsR>M@Fkd^-YHf+B5^mRGwO|!lY;NOy}~k4%xSu_uzo8NI=sU8i*!C zsxrM$;mi*^?p&-mk%r@b@hFw8;<+ua>)r^ri|^ z431Zg=KQVEEX@8)tK_4Spa9re@s11nk9*DjB4=`O8x!b|!sgda{uHe1d?NU4M-5$i#IiZ5(5Mut$jUIXQ$Wv*cS&p$ARXxXQVQrUJ^P%I!N!JR0{~92?Ejt6ha4)E=|u9eBbxm z`&|2c`|RsFe~y17*CaFZ%(G_JTKBrwnvbvL48OB!*;L=GdidK?fr~QMl7BfnY4`9@ zXnLvZ^$A}yE6omo7qlwnIKDK3h4phsNf_Q~sYlF>PPt}qnv^{eo0j3OX1==ZpM6b< zXFU>;k*oLKdvK`PEsvN9>b=2{5i_~|qn`+3pO?`1QWZgz^2#-}lb8;92SQPG_jIeR zhQI%jS&_&@1=^bI(RTu$Z^^e@D_#r#N^M?&`&m?nedo_0IhO8IPVyz73(UV`2fo63 z`0Ak-;DF8O+H&3%UgTV1cl8iJV^gjh zz7e(=kx?$Hw=I4AkfVQKZN-pK;oirXD-evTlffZXbIfP!&n7Qy2Gecoqf4mNX=9^j zPH*w1lX5``N+>?BQ6r|8-O!YJFNl?*k>UM@DWlM6`6eCSoSw(=D_&Kc46ZDZ)J~}( zVd`^$H|i5*0UYMQ`N0iruP=YX7ylO=J%Id2bg^asE&1=%sCzmt;pw$&`{P76)6j3u zXNpe)AeyXTn9_SO3V?GW@M@v#o9{J_9L`}^eh9!!87h4MLq|q9=6Wuic#b}%y`Y_Z z6QHuf8o_*D8{kmJ05>=We5fM|!zxiRwD5uji95=wEQhQFc`G1|o`Pa@j5-*t-fL4( zC|z0GtMkyaO%^u&I`>{^!jh7*v&EML2(rDRW_qkRT#QcdEt2=0=`8@8;_H7+vACDuh1yc;#AhEM;x>TAOt7`356ig@4PSdLCoU{jN+|r z-VgUu_6=YIM?&7$6wNXYDhp@e2iuD85=j1hqye8r0aOlQh}7q#xcE z0qc+Q2~Lt8ps>9OByRBWj-;m#%3+oK%vTWYiPYO6?HR- zk1f-ftQ&^Ww zU$C@RZ4s+YC>)J7(>Nsan zezqJKzi7cGIOlO9jY!*N05yGHCG`7y7*Tltv3`##2bijKqYCZuMaFm{0D!{nv$dN_ z6am!q6SJ#RkU9=9I5(X(Am=CVFP4>;!qPEjff!uK@cF?f>3L~sC{g%=lIUZC{`Yl? zdhuhm}ogv1TV9JfWdQMqXXvczawcJHWK&K zec9EEl`{(neu}xaN)+zr|M#Ai6A8OKR`CA)0o4Op)!ZJ1{G1R3Ozh8Ge(}8MjAp4i zT48|%(IlX;N111wVP^1@&IJcmR`7W$N|>d@U^$eboY#2E*KIr=fPV#8c6MZeuvtG- zW5`K5{uu2rdkEi*x87cSq@bkW?L zwFb`!f{XVbI0~j#_v+@=aKfLVu||u1H-Q=RR)4%v>(vM43#gsxpMUh-qtOf&rhF9c zsbDa?`v^d(G92Gb94lwEmGov-Y|Qi;7FRQiPYk)(J^6d))}|*2Q>Y`btrMw@IqHb6zbvgy0OU4X!T#O zq42xL3r1VD-?&Vfw|JX9A`a4<*O>0iR=#vn(+6$e{s;gD+3&0D>dR#uiw)Ez!C>20 z&0&G3B{dI)v-pV0t13o|c*VXd>h=CP)n~}dd1U&4P}HSS2xRALvQ82J`vdX04&g*< zsG93AK;t;2Dk~2HcAr*SHH~x0Q^?3SWIrr-bziIM-sJ}Ls#S!k=}@TxpqUuNpXk9f zDA__H+QXKO<#OkZ-Zcv~z3E=PgtPlCC|ITFKS+zH;1ntiV7&4W;`|CAbq#P7|6Kze zL(vk6ix2OETncmIgXrKujaNNs?oEl*;QVh4x%3K`)-4wP(vwzfBOm3YN*Ewd*%_+v zS?bu2t^9uR1is?6{?&V24nzn$8qEWTtO6=ipIn2iy#!(oSk0f5iL^bnLAEu9cQ*F6 zVgeXy%U);Cd*nZl1$G$cJLebqdvXbZ80{8%V{G9loZTz)vC#Cd0I(2$6b72HtrFD$ z(sx~==rd*q-mZ@zeB$d_u&)=*BLm#q9@ySAdz&>zr47^Se{g?u`@=30!4rMfAHW$n z&coQTT^NOj9=Q#-G-Hfbw>JOvVSBvsY0rzTZ>t)_jNf-_=HiYGHrl-CloXsAmFaA z`>NtE6?wu|1q^l0NMqG}2Jfl4m1qE-(2?ZiYB&+YaQ$#5h^2Ipv!^$D_!#gME!nuKyp5bWF! z)9REeKhH855@i?rLekD&N?l9FwRdYS&D=v&3MycX4XdXK&3ML_ z$wQ)qQ;M6ej7`>eJg;SeYyJFgYC3F%pc=j7!-9r=A7S0th9PCYB-%uQ?bu%A7T@VRIanQ>5^Mdz9q!zbM)qEYC+ACN zG-2A8MdZq@!!-c(9L}Qci`p}tE9KNA8=3MBITvazTMC%i)T+?ukD^Z91UXKW6aL=+ zba@J@>hDy=SgcyKOi^kFUZ#)Yyi%+0LaTF+WMr&qYN>lMtE?~^Zb{z32>=Topk@8k zz26nr)5S`BOAA*Njt*TuJg*pNwKwe$lkgx5@>-Z3%bLAIcFfTTtpG&iR7NDPQ;5Ww18sGeBv+Si->eKNql^hQx@ z&X6HX{5yP|d<z`Q9S>Uom9oLzbd}~$ z3qTPRxA36D0R~b4aJ+@4^S#J_u>#P8_(ulWvyJ|5`CYrOjzI()#$lIEeBcRtCVK?_FsQW$>+s!_ZYrZ=un%=ru6@6cfgE?pk zw9Lc5vvo-oIGLMOBK=nG!@4R5MJo8E))LV#LyxNZqp;;c^|x+s>vN@!FxQjYoID;l zCP`L+O>Xjh6>p>kQZmjf=76YLCoqYJngc8zDFebcVn zlB{b*Xr+zXwwTX`1XIwtuTxrnrAiy%-l(8?Dt-n(R zT=TEUdtn2Pd*wlYEDtl{A@^zJgvz2l5el#dczXUbw1iz#uzbew<7|M<$3D-+ix!s@}{p(RD%`Xu*(<^>3v>b*PYs z5zgtrIYR?${Ae6iRS&R2uqczk@506%QFR;eeA}jQb;Q(Cp>@ti6o+Au7joc!FRT}~ zzJu}R^-0N%fom;yljmqab{^N(SAEfpZD zU4$><_)Y#onwCLJaV~=}H*%w9g6$qn|3#!mF@XuNoHTqv(&+$1SJ(ZEXO3HE2*GH! zNejVDAMh-Cd!{aNbv)hP9mOvRG#-K>T_KJlQYJID`q?D!{fwDXPzFDTrX8c18>8tb ze@C|eXhm?t52rpNd5uU|>J$)KV_t+B*C9zy)V-Fh@dO@kP~cR7-t!GTE1YS}pWxio zjQgX4sHw#huzgF_hp!)Z>#2jX%fo|HsRIUv0g^Q3g=P#{vY2AyRbHQbzQGympDNec z80Ko#HTs7Ta2v3T#X^edar^Kbm-*xuNY8}ZhnYZl=HE1Yw-iYge6>`0GelrWFyK&C z?jF~d#r`OgKe{-R4V25w#9WnjXV>tO3@z0;X@h%N(uE5Dp}%vcd*;@D@Arj{26awY zr`@>+*EDslO0Y@RH=d({tTh9w`sK*Nz3_V?2IGdiip(TOug~CapK&}17&wVxKoN3s z-+&4@nzlYqd+c+tW?RVg`;i0{KnpormUS#@{CPT*qQiKr*hK(`VrS6^xy^(@#_htj zIwEw4t-(}e8~NxPzj(^Vwxbi!C2#Ixvf{x|Up_6Y9cS80&SR4uli!)B-rvU^D5}7u zPA^1wIbrhq9ZJ{x=6=SRB`MrCf&CU%L(ib{!yVybS zg`WGw6YP{XO?-~OkgIiEa{v5-!wWS)|l7tIR7&5FkNX+cTi0@?>J?-BiLRYj!y5n zDdbg$rKmmQm^hM7O_F>4KCJ<;%o}bx9g!Rj)D&y5&rxF{3i6PGD0`G zPhtsVct`KE@UP5zYWMnb&MD~nU7Ok|o0Hh;m54nDH88L>$_1MWjAe%>v#bW+W~R?A8ia6*;Ag7sM*bx=>99rSK^!6&>3-v-Z|+h8y|yO?rMPwncgT7 zqZ3g#2k7oi4u_667SM_flQh&j)47Oe0q3o#u}&@}7@sD`#>bneg%I?Bd2-jIoTn`u zp3oZW?8wO_P^lvP_~~b-5@Tb;CqiAWFV6vIIQg=H7D@;5)K=W)uw!#73OFzxki?*^ zw|r?1TQW(I*<DlQe9GW}WNiE0t!d||~cl7|28Zo~t$pcPx<`k(Y zksV^>j_dInl;l5Hna(U1yX=3y;osZWCbhg|914(RRlk$bR*^pIF8`2PW%>vDbk_ql ze-r!2KB%h{ys5-44Y2T{zu4A{1Lh~jJbPZo4G{3Be%EO0ar!!JJP|6_4_$v>*LIU5 zm{DG?KT6hib!iE0iS3Gd@`@0k@`~XOfiJx<-%|FGT=a!%wD^;l-~yy8WKq&yAmU#E zjVwX=f7LKz&d+D&)^99yDb$mSkePCrocQP`eCRJvSXA+$oQ%5kV?hgS{bgT1(8;#_ zpFshA+!?)6z3_bF{8)L&teXRT++O^MQzg*0CV=Zg&;AmMNA$R*HU?=}d2WlhisH^c zLvp?u-(8UinZO4ClT9B|8x-57q}uSPYCHOF%w#7=`DCljgx1@LlY+{A z8P8Qs(@f5X*NIOq{)L%4IIXS!$(|7l=v@p|G$H%uyzb>BY59@NOF+sVKoCCb3mwYA zh#i46+V>M{zNR(~@AC%$?-)y9lI_<;0%Q$@>drk6?1g5W7JukJ{JIU(nr(Qq7Fk9F zfl7klfF68JxdElkx1&O9|DLQXL3Z6s;*xs6|;#rpG#xW;#-DZ^VN zS%!6}3X^K#czrwIuXm;+Mb7}M;W{?OX8l{6O+#;#bvHr>h_`1mPLE8W#U578l9R zq366nk68h~_$~Lp2a<{VFrvRDVR8#nOe~g_vuQs(rpKliJ4BZYjj}>69Ay*;{wYm2 z#r+oSqXr?Q{8q#3FdzkP_;SqkIcTGJC^Jb^AmKEW3c|hK%_O+8Pl^Rikg9r1I>Q?y zYj1xAy1~Z*R-_)fDxW9iMs6@P0Y5L+=vM@^0ni4(DWo1^|HCHvUEs?2Ut-`94q?^Nw+T z;9F~q$wnU*FDCI07tWmTcmQ&&2xxb4O#n$}i*GTR#`s+K*3c6%SVdbM zOzZKe?t{_r;E;#>yHWemjFG0&0$5oi;BG4MD&fFel=y4^(-U?>tE~-BKR*yKmi_h* zqc0-h@o7>VMq|{bQMQ?B9j7}LIKQ3>Ecrf}3jg9$t;#{UU)B>EbtoIh|ACiwaNbxG@ZlbwMVM#<<65lyA=O#65-qws0fpqrnd@W{7<^ z&?P+}Y0zw`k5R*1V@Hf4$fS zc$CgOFvfp1iOZ1Ek)4^bWb3%b(oW~?7+l|5p-wix(K?PIK#9WydS4$1lpS38n0?%< zZ;ie$_r!F+#AD z0TQqHnCN93d+Q_M?8$x1OqA0MrN+gTey8tx#dqHbsP6$zrC8C=fuqhr;6yG;J$UfQG{fclp%m%x=nz7 zQ04by#qe=o`3WFM*16?cbsq?$i-&7CfdvaUV)kYGBNw?={|`2Xb{ESh>KseUfzdIVW7p zE-(~bvj7kv{oioYP=%hf%oL=8%r|P2tidDAXP>zVmu3`Tz73W0gXbcdZ>%ad^; zn+i)IaL0)(J6N*L%VmNDQu-;p)vVb%&NC?aAWjZ=a&0p&zcD0ET6&{^bJis79}`5@ zBZS#!QSLdgM+oj~KbfR@0n1Y0CkM6;@a0`_YeafBD_F*~6e;$3@tYq@CLkUk{Hh}~ z@^I}qZ|nv+*4kF97j{ys#0lJv%~5H01J{Rd%XGaSPK4wDZ*_fY0eM}y?n9xc#mXA0 z0M9TuxC^yWTiXlWmz!|Q*|e-L4|ew|inI>#wBd7JEy2kk8Nu3P7F-7x2&ZJT|CxtD z-G{RV(O4s#e7~1l@=3-mDuB&J*{yt6@dRd=QrnQ1gBx9(w9q}k4OkPLlmCDIEkJq* z+L-{HDJsa$<`a6APT`S*YG6e>;M?p6W?yWb-H zLc@7O&3AYJ<~l2Gj{tpwu3-~V)4R9-8a9 z==mV%8UF_jiHb1qX@-jjVbxgQhP@%Wh?P?GvIB`Nnh4849@QLeu@8S35Z4 z0YCPQKGVT_aPJn8HVItoNarJm>`Bpg=46-ZCHN2{tU?mH_L1H=`L1)o1mOA|xqLE;1np;Ss#Ss_+VA2TaU0N_^!ZD*8JA?J*0 znaOpCGEJZdDgth=FArumwja0HCx%%fpu*8cwL`80pW1KYQ!B(ifD`YgIwuCF6*Im~ zUq6JJ4H|Kn62dsc0l+JKgob;Sv}#oC5g6exJIrnT3^c zZlF~$tQeR;b@zL#miP6gj1PF#?`Bnme|0MA2{RU(?UoEh-&oYE(b0yp5BQy=Wn+=l zc6_Rpg90K~n2G|rL2e)~FqJN?L#K`8bdM{Ai~`Id+g8w`{f%u}8bZ6fSkM322asm< zkIEgONQunNy}6KU{+Cf@fVk==4VK+Kc%z7<1?hqsd0HnQGN=#^S}U%nw7iX)si%&Q zgUK>sX4VY~>woin4>Ts72^N~3My|*>zrEWV$O4sU_qVM zlPVH2T2wN%Yg6C_iS~R#0-z$1HIrJkSq}|3w*fF<%Q?%$OZwSqu3VKUwfqViMnFpU zud`1OVGLi$12A==4mPloWjX*cipu=eRD#%E4UDEpVXt%hXiAn%N`DB z=_7T&?55V-k1@oDXeQC!ukBBGq6sVh+|~fDPx9qy|%7cfhD6>gyGQ&Pu;<~r0B~nY+%E(ugTOH`oL85 zfTGAus7`JQz>_%fyxa`X7o-dOkm4?#=yYZ7TC0@wXb`yxpUuV%yiVt9`koSvhUy4_ z_h+l|Q{V6H%jeUS+3h?6wBM1ivYQguJQQL17F`NKo^bXGL$3-gNE9-d>$_hv>d+4C zL-VeRVtKAl>`^;X}oxp1OQRn zE{&>s)KIp!%yRgpXuvkj#3+$^#RJg;Ov+N7fxRhWe^}KvsMQqPixGLDkUD#9dTY!6F1E`f z0i>#Ze>o2PzI=cKRTyO$q&HYAtK)Se2OwPM)k;g%-W%HR*O=U;=RZG{yJIJjvFC8g zrnK*(MUbzrmSr8U_0{CG;EgobCVG~ZvB3mp6zfvu2>781!4;NLFXufa>F(#X?&SeN z=8NZj$_{75h4`{BE${c{@hax+NZ~dQ4kmd`2E;|LBhK~zDLzh5)ZX{E|G5E3 zRk+o1+W@YPD>}w!+PLvgfKShg)=fX*4?~eO6d?Y_`q(Dp6fKU;sY9B+jypmAO@ka0 z94XztJ@502JP>{tce_VO9%Zku1}{MCe7S%DF#0FVAG`r#X9xwZjOxqPh(Yy$?MK8C z6cZNdxN(5I#Hb*e_wRAW2Wg@lAa8Nem|A=#(pPd@a+w<6uqEZlUbKxE7zfBO0J4Aiq>OCDTah+ach7;;lwkjgyx z@_H)uX{n<2_HqCsrXGbaKobGf6qy9%0H}!+=80pY3@ZUt5pB?NvF=+a%4Zv<&9qah~kGbz#Q*EW?sC%bU=W< zV(eCNeVYe6xOWVV^4xAI^R`9DO5s;Ju4U6#6IG z6fEsv=8K$z`@hbZRmQ!IiKpGyxcC9E?zvTovajpYt2C0hvqs}N+WI)Z-rYp#FD*Sf zD!(okMxo~vJLH*Hmd$)FvZ3C=?%FPAXi_LA?^C^*>XU`I&n)MV2rNL+V>2Hs!u1LOS_w0`V>3H39u}_ z-)O?XQx1=b!+z+Tff=6F+--C%70vyB>APqRO8VQ|5BGSxDIEW;rlJbfH@_(@@sG zUL2_C6|=ZkJQ+C5M14;Wvza!~&`Znif=90E*IU`XqinA-Q{!i5d{yLq>{QwYWP1Fr zH^r#juv|GC`LQJi&bc1>RD?`xo?({t;#rJ}U6( zMk)R*Tq&nqzm|whl-)09ix?Z50vz09U~uZNbTxH>*+5|bylxSkzGu^_W>YugLkAXg zn~+xK4nh0pSiYr)Mn=gWPW93s!$2bt;^AV!jIys|FCKp=9kk(Au2W4?=<-cDapVB( zBx^q&RPwDAXsd`w4R2g2+1}fTCG2*w3M}=dgcT=XTODAc+IbBvtq#>ESQB;+>oC)G zq603aa|b~F!<1YhHHJmaA`%m&EuytlA`hvZhuB8Nf!_C)O_j=UE-AhAxdJl-l^f+# z*sy!*O;s4=Bz}WfM9!5}eMD@l5E6qeNVTpt+=tasT{*1`n_H5@7*sh{^zib|E`Q4C4qNLUuj7aKt zXqIEKyq=(t3?3$f)NWFigNo~yqLmboXKaofyu6r5dt|-0&;2A<1Z0~f zJY+`TW-nCl(0slV{@n$NOyJArLT69%dbqq|11}xCN5}!GLT;B~9fwCRL^t*6C+XQ7VB*l)| z8lJW)SfpnUVyB+(TU3rQSazw=Jhgpz`0|;~4Oa6LJB<-r{SX(=@~d!Ukp&fm^26|4 zI`r}EU32IZ2g-+Nq>`wX>*(YKX%SdocR(Q zoCP>7wqbt^lRpN~-wnZ!US`TZ5_<&L9z-ed@=AZmOE*mMg3 zKuVwaT*&mIR$*omH78HYx7B*ulVrT>U7j~@4A@(*LC? zlPU$e7byzC^LeUjI9tm{;P)U@|6)8=z&gOR_4GgJ?6SUH-?JBoQlRl8elw+^H#(#| zLio2?)Qau;^(9RvUaG*~A>T@tGO@_mC+ETY@(WFzD95x6sfu={@GJ{(#{E z1793j7r7xU)jiP1eR#8xY!~US*=VJ=k_Y6=GB2{bn6Dt1;|xBfrJsG(#VItxhq*40 z+8jwyAn0aVNPslD)+#dRC4{-NR41dvUfemai5+8uaPN}uZ0-*8ruP|_i%_z1_xvfvjH#r z`R$l097yy;5I+kY`wtPr_GmBgaQCnc1 z;lS&BDwGpEs;F`0G9lo*?A+OsWWUF9`EfSKg+p9J2ox*YyXOE(KNfi) z-U|06gnxq2L`lY?u^xy4wnS*~W>=^?4n!on3zQP^0Fvw$EG_}@$gWUEAVWwJhU+o} z2of#4jRSgO0vvenbU9qC=<5R={E&F+Rlr&Lb!@HrtGF&4o{#Cu_g|0kkAzdqAo_JI`Hx>|~du{F3o#-8-05MYy&0sKXK_I8gs`hz=pK|UN z97(#GYTbRh=>dZwcczgQ-q(6wi;n{Qbpe%diYMeDF94>VQ6gwV+6yXn$IK&I#ZSC7 z3{Dj%P|CIZM!Sf8oHeQ+{&LaeL!Zt=#HSbLO6o1JTyi*7b}{ymjU~Iapi9P@3nq%8 zIKES1E9#l2TG%EKh^%@}ctRf1cHuFz0lh8mny2YQ{&#G`2_83!$c5npBt_j zs;3`}bZVRd<9@ITsk{Tk>c^DAHVf~DgoenmLN6ZbS=W%}{*yuXwM%}6sS5yQhwI~= zyLHF}SI+sA$dD-B4Q{MTeOy}#Dw~3q?Q4wO%u?5c1aD;tP=;a7JX!{>we~4@S01pX zrPc1jKbaURz@+)`%7TMyX+-P!yS%#T_J{!?;a-L$Ka=ij;NO@6uBUE@7$XFRCXEoE;qq{GPIf*p^~d2r$6kV*ysczm-woco$K4Yy$fF z_8K6lp*TTx1G4sFs4NesLaA}vLmgn}wvpgnoa5wxERjc#;R9RE{0FesZ(H&3a2xL@ zP#))J?n9=FL*oDC52(on+u1^F`I+EDL#rGB z>Y`U@yrm09kS3x$Sb90111_s&ZL2kxGVJkDZh-eZebYO6c4kP)^dETdG9+q6h?6sJ z6J&R*-&w$DycY_qy3n|Qfx3*n-Aa>nk}kjR;>5_m-fo|$D=zk}*Ws?Mle%76FKi(G zKK}GC%Z5RkC9Y{x1L?Y08tyjxVq)K!%|1!3_-D4(iKOi9Qt`A^4#v*_w5$Fe3tP}# zagIZU;rvsQjHP;Ceoij18N~fBgs=Jk^K9hdg+KEv$BwOaZGEHZP$8Qf0U9cU>*yvf!b52Z=Pd7_v=s|0U`8)eMHb`|F+b8$Td( zz8-3;Ga_93(G{}^Y6`N6+D(n)RvlvdXl3~>HM14_=_XL%6sQ)QpF8)sap(zZu2FJH z>3T`52gaDv;KK6*QhYfwdu;Y&t`rGEl2}lMM(eU0&1ygn1@u#0VLmJPnMCT0QbSoe z%A)hq*XE`#d@IBk_^U<~T7vq9UroFX4Rn#~m2yX7OAt+YiCQ&MH^aKU9}2n#wYW2( z>O{m>ERK@el)c@XFeJDK|1|aO zbWH-VXWiK$+)Sp=^+HA+pA&ZVd;bHVeIdl1kevC~c%S+f)-VsK0b$gCU^gH~2!`f` zzEMbw)C&$CZVFUa9UF_puY*`z2?{#K<;R<6!L!T3Zv;PD0o&HY= zW6x4cMt<=8V_Fw}a9NSn;-jgVG2Ts>%uzQwd`ohLzWzooRl34CZagn|zVAWN)r|LN&_# zH$FJV58mZ3kmS!Mr(ang_}4fJK(aV5E|*#kii0yDn3O(q+{5JtU0!DL6P#z@Gp6?b z-HQ6GRiD$^&@}VMm?gO|W+hl~71e{~lmRG=DO;lD;H7edH{n0bh{K~Q%5b!xB;e4kWUHkoh zPi5d+N^;`rufvV`s$!qVJXbU2;QYpn4+XcalEnDwyJH`@qZVda+Vr`yZKevt8pW{W zyNK`?s8BU+MVI)d#5`e?WwOYPmi!~)@U8gUOTg8+hre6RF)J5=?UA%l&ZF2WKf9pe z&XX3M#&`YtG4%&8x3l*Bu4VKx(ja$C^W0eboD%$s(i&iSB9VhwnHxqbMC=h9=%rh> z9r}H8S%+~Wt)WZlbUVH~k4r3n9^ZM_xf>LV#p>Uq{*{2+N5J}NJbUw-Jp46JK*Tk& ztH7P?|LG=pgb*H{7)g>gX44Yq&y!7$hV%F zRIZYz4V)asFWn18-WJZSIowMih-ownC>||V&ntUt6Y#<*Z5{(FU29#+1eR(kHa5;ENoMTaBevaDWgW(|QQ^ zeGV1+hnx`LNm%f zkx}rHD&HBUMAhK?XIHtx@qQ#1X$qlQ zL^4U9{#e=IcK>~Ak3Rbso?5%?%B)X~JrsEF!H8pp%7m8m`6BVyS*b5wIhqhSJ;Y3t z-?QKO`Aly(HU0^L?c)o+^wJeW?K0wGT>-!1j>BZHM=vCd?)cw>c18b^i*$S=*cd3d zp@f+A+KjCDfKH-UvQ12j>Rg9D3Vq7You9xzskBsEj-<1f$3C9Qh0-dR|Bbe0eyQ0;$I9XFi1 zu&95PuScDY5AkdA8_I0P`|Mlz!AAc&&+Q2T-cmyk*Fk~;N7~q6Eg4sdneByKGsfn{VmK?vsk`?CPE_=%XgN|NztACb^ z)wveZ2FWyjE!8=m&~pF92HD%eCJTalwjX|JhX`5gE;jC!5q&%r?0xa`>Ihw%977-!qAj**Xf0Jr-kk8Gtv`&x)ce#BTIO{6?z_w@h*zvsEvpz3mqU zI3d2d6vme?ldgFqC>hy}PvXYD=j6sQpYu$3u?}x9PMn+4I z%^nT?mQA_vkaSnHy~dVz_a>>MF-e0;XoR$fRS z3>*UQ#BE_mtcS&T1#~FP>b| zR^^hjHam0Gen1Fi;LCfP&#;gGw1PS#yg#^ifR3TJk+9EFV^q!hp&U*|c`wP~*LNZ> z6Z@S!UqN(?wFRoXci+uQ^Ow=Rjy*^jixmWy$Y!EnaR^xuWjHBFiaRNe4v)tX(CT{e z9+Tyf&kA%Z+}77-cbpVu^V#m{Emd@Us8WHQR+7}A*; zQQ^X4G%o7Blo1l+=nL~5RI|2a^ATh;2)B-`0Pa1}{^%riFv#@Avh>_F1bspVOi-=b zMCi3GW-{{%NBPS2@)zzzx9**0vFN4HFlEdB{8&T~BvD~^o&EHkBM8cPoqoy!Dfz6^ z{)J6nKUWNWc%c<7ZGQ)Km-`p=FD9X)+AjC^1MT2I#&zPG)q0OE=~rOw+_sic0mg3= z-<&Eq)GM1iRMLiC8X+S&s}VTNeG$VSSmq-DvP>ur?*8EXXs#aLfKSNd(dbv*N1=M+ zWREj$HV8i*?fVcyK2{v1_Pm!JB$#9fJPaxAPj%VaL##ea*y90;{QAjPnOBbRVsr;@ zIoztw6klC!$oeHc72o?Q=3LG?v2eCvz7>B@B{vj8HuTuG#^5AS{H1zKAO=1<Sy|#Ly5o~;DSfh(~k7%PPHT@j{PT^N55ne%F@2{daLc1jg z?%CXc6VWf#8J=iV><%cmxc<`c9qrBRE$*s0h{|)!BCJ%|H_LeC;8i#pYVz5e$5_Uw-WscIPYR3(u+1^t(Kd~O;Gp;wK%L9Z}fHZ`=VG2OvK z4+FgM9ANJ|e5vI-10L{7DSB^hDV<0_;LosvYjgu8u*8*;rrYtKI1Zwyem;@?^a;Li zSAwC`f;IPn#U8Oh1(m$ZU#6zcZxvVaNv`(YWGd<$e0j3Wo9+6G!@jYVUP({3v)Qd- z4qX^sO*`4!Jjzzdzco8#8pGeUoA4rQck3P0`P6|IOrT)I7pQc(jUDePVj|-9E3Rv4 zw^!~#X@6RHR_rHXUu{Jtk#j~ktB}qn-h3tS^nAUmkp?4JrDj^sKH_C#HQ((y3+{le zDw02pq4>GVdby*KI3(5yE_SQ>MG)QNWKi1e=7HzqwZP%#sGpL#8roKw;Ttd*FrlY@ zVtIgdjGvu2YQGi`LIDWzCm6MhX3fUCTXHHl{$%jk?VZ#a>|_dZuK-@K;lFW^L$#9%)yrmGrEB? z*HIIn$`QABdnFIwSLdkR6>M6d6@{PutwQ10s5-xona1 zdPLK0&b8B0F`wqA23z=BUTTN+s*tgddiEn1#oTIT*>T(I`(fiFZ5GubUv$mQvuwit zGdXK=u(FHl_4&-3E!;wGigoiXSTRRryB?>XKIl{jy;c9JYU8K4k}d7uLa43&DZFVN z(mYX}FOH(}8GjmR9cC-(NfE`3$+ zz6Gh0`0u5>tG2sYQZ3+fxb}=aajIDAG{S0M(w0fQ@awMY(%w8#iuk$Uw{w2|EgsP_ zn)dAP4Tk}_i~CRC)j)0(kR1@~2svV!yo`yjHt!a-XIHZ~Z8#`Cuodfhpwr|g{p{+i z2Y3q}y=BEwW-0@dDd^*)(mE6FSHC2VN31bv$fNHM=Ne@o`+3-0eoP>vcEINn-wM@3 z1JtJG$e5MpYzimngT0(l7zKMjKTcrTln_+$`hz#MTH%)Gp(5)OADz5wNChlESH5tv zB;0N4s4zQkko7E*S-*Ys^2ONVd994;>m`+Z%nu%CZ%(#4$9XV4JzL$}4~k_AWYXJr z6r94@-I9DN41Aw0x{vq$e7RBZsr*9C-X_Kx5~AeSnEjXEk9_eh?w)fb_9hb8*Uc!t zsFFM>Fv}87nhn>^v(?V*J!$Va4(`6iZt>1bo1Z@}Y*xkNlUkbitTQ`Vf(!m9(51Ml z1S8M%nOFAr@?Pw4z~1Sn%wJJBmdCGjZChvjpeXyW;>nhRKHqbH*186a?E!sF) zs~m%Y#KO&+TDvhZ_Uu^>^3|0u^~!f7TrZp3mEXJ(*}|A6_EyHSNDB2vcGQcrqO|*J;Z#RTY|xCnO1HMP$FvMGt8OEUo~d!RGr$6!FKg4LJ7@yRSQPv}*mV~yJ;m;_$ zCDgDZn=~iPviyX@+++oH;eUX#xAMUkxKStbo;EQ$mm}&kes1bFC7zND5ZTujC&qWG zXLggkwE)D*fr{mb@W^9?b|dkINgh$*O|v)Q&c#a}ca!VK8cc0j3YphYBlnpYh)zC||VF$weI4}D~~@KY4aQLbZt#ffiR|$Mu z>bh(f4LOUX-kqtgH}HC|jHl5euo{HJB&R3W7z)*VarbsUy-aDH`|fU6QeV3m<9nRB zK3Cm*^JDLVWsRKCy@GUMZ*xuO88rFb1^~|)+WspYLL)#Y>j8J!@h%o@nMSGYKi#>l zd5`Wp(x@~HG_;%~b)qJ4*z)dC0BLo7s>TryNTE%>3u4JXFogH3FLf$0=6w;LNy1q& zKuk2I@qF!kFd$i6E+S6gH)Q6Kl_KNgF?#TPs%@Pi*A{;RzMB;R(9b>0+s0zGGPaui z{ZT;{NXTqn#QI6lC{-WC_2y)dI&p}wR`@e>#CZ9sVC-(z>Ifz|nC$UF`??HH7Y9}x zMbhaeE0E}{CJ4EIP(qcN<%#b=rMz<`+tqlV79bwM8K5`U8`I2YpuDQDt z^;idYSk$#(SYx4`+@Z)B_#~$Vh70At!olgM(AKW3tMIO+Ts=XQ^TcNZ-L?OG>j?k; z=bfM$Z|&k-KG&8XNk`)m}`AmHvgcUCPmi;4sGJJ=p8hTTe<*eThPpnyl-%l(pAXw;Q+sUazgPedOQ|;4?{#0jKt}YaN z|=a^11LD+H1J;+vjQ`Yph61L#^*vDfE}z7nViJd5wtEzr$0^=26k%FKP>U z%vlp7dLD^=v>`o?qtjz-s`z46Rq*LpmEXLig$w?jA3ihOp)0o-zCx2^U!dduQfKT? zoq}iO7uNMO=Jhm+P9f(%8GWY)_%c+=SbofNo_0U(GPLe6%O@%w&e{Q=s;kRiu3J6& zA3v#3l6FZ4Vg5<3KZ6+Mg)Z&Ykjl-up8sOus?^gk)D&-Td>&uETshvyF3%HzPRtuS zygt3{c+)izQ{U`j(AT@Zza&02&}FF#XR8edK{ioUq(LTvlGD83AO~a;MsI)?l9Tz3 zjQ#`dmyGbY>&_E917Q%F%&3ieJw^EQ!N#q}I1Xtjj{19)kPU)^U7NwT%S^qXOwtQC=E~~->9JY`I9hO@d0E!IdqwM>= zg}>1wy6}im))8ctH@yB1iyp!FIPz5T*#TY2AhPD}#oNBkA4I7OEKy#DCCO1Q~3@m^~;U&zq8VW~R$ zWbA$uvRt{>V6?wrB;It(TX)O}{;*J4uS|aRXZ?E@Flw|ECuN?aUE^u1ziIGpBTymp zg|1SZyLBSi*&jRZ*z@y=`*~d3t-ASByGY4`uX$y_`FiE~#>`&F_Q*!p74P|)&rlvx zldoOSZD^YhJ|KH}778hx5;FpdBuwFCGdd|y4Yi%em95C9dB+Ud2R4O-Z+It&NW;8r z3pr>s^-Y)ZnAWO+02~~+kvG1Fab&B?l}E#es^ORK)*hem}K#mk}un6ufBc# zbpCAS_IAGNwKNhc@f2Ff)+Mm(xUih^* zFfz|%<4j?}hHGQ)sqc+a_x62raBnW;bB&1!U6DY;xP$7(iSkF@dk6Y&yj=3ZwNNycs?8n{dKkcrFd*v1z z&^$eFpSj#t7;BR0HSQ%;%A&7yR^q6al>-@rh@Jc;<}XO69SgMCBLF~wXeDS z&C|-M?NY@<46J50$YRZ|eZGGPt~)xZd@abjc0fWd*$4nF0yuc37RdP0SSn9E*h(T9AP zcr8fagYepuny#@~?(`VN&>r0NTmM#;{|JT_x<0`WE-JQUsfS~c_t)&5{}OL|AAt2}m6vEJOJpmsjI0S^d35xA6;& zp@EAEQb9mT?sljbGf~_K2$tQ)6Z{ncZTylZNR}~?O9LN@)_#_SiH^e+wEy3gHwR^P zS9Rzb?xR;Ffy!geUNrtdM=UmGBx^IO zFhsPvHMwPw^&m?T6o4ZSxC*6uYvha`)tzp% z-gIADxA1J#`*>U1dfGRs{Yl`(r=g!H#t@k@%;2Q<#<_BTT=-AQNgVyB-z|fNgwJ_p z_mN)Qc*&5E?(|PT7%uH4dZb*PtUUK#SI;6e>fZexFoF`m*Uq^W*O3OPX(pmJ8D zrDUdxj%&_#+?ipki^s;(i(=pBes;l>UZL^ewO>VXa}~ED4+x-db4&8=r*L%;1u zv}lJgGYHWKwG33y=4660vCL_Jy^?j~MBDs#xv`oqV0-5zc$%ee!uJp%%Tf8g%X}3@ zi%MuEb)E$C9OnmSjU2=#BHUQ6CK(aqN<>x0aOwCtCUBobs+{O++i^@0i4XunpVR1o zRaY8B>LXJ~(W+PyvTEq`KqbSh4td6CGe2lf3h3z~9O~RrL1-u^OLfT6s)z~&2~fl| z2_E)y&9m%)z>ACx^k)#tUpc7DbLBE)LbocUC1Il35hiO?prNoC3xh{$BKm<0Dian2 zgQtg*Z=MPL$8Ta-UjW;v{f-P5?%z|q@3e6LDGb&IkUQ%hKNS9p-{XKFk>oue+fi=D z6i>BFcS2=o{01AMM9~0OnCQ!-2V@}oi9oMoGfO&~op=oW0xVeCq*KRhUr7yQdToSc z(lCqhE*D&IZ|`p@D~EmSh`W8bWit>mK}bPt!~OC-Nvl~|kS{_p9WeF?j-NMQOy7E> z5b0%J?3b=)0799JtM|Mgg%MYmKr%$1g}thYJO4_$SQ#fPh*|cR9 zo#7yE)b2-kGG%=C=FqtpT3G(y0?B z&KFHu&o+(E#t42st4!GYpRn1u>2MSPMV}v{ZDc|MX-9K=BaCr3_t=eH+K&=%C~=}# zk}qQ9j9s|pL*;|af#GV{%X%1>gfzfN6FhV7uPU6DXT-f(W9R?_XAqC-fSmBSzX=)+ z*w_4WewS*p-Ll-9ZxAg2XEUG{l{x8ok>sk82T;2i!X-Gwlc;9A@5%%e4Zd)}HSO(Da?aJq*xSRW0=x)&DkWOnPLN``h7UY%gJEr`Sm&jh^kAYOVD z3Pito!3S@;mTaDp7*eG&0*2&3COpo0I=sE~KwhQ2<(G8yWN*ZNb$@!G#KDCvTdrQ; z9R&TSH3TXc*{Yqx$u6=Tco%CZl*u8pxArG1ctJY4T0=NqUiPsGkmic&v)Z-utO&Vr zbt=FG_md#)165Gi+Ix-`)R|?A9GKZ7GJT}6bALz2Rk~XIu^@^-v$iD#6of6hAABIJ zge#z-1_VdMHqv**(f}n&fL5RaWNqf&A?(>HYjVz$ty?Ng>{>nC_kbdHA|I{rN*DuG z<~3Hs(cV)do52SyV_1NBTb)TnQi>FE-bI17D=AE-6mmoRfSdu;dSm00J4z|Pk}$>O z48qUce!oYeByi88ZYWX$T_U84X5B~QF)R%k~I)D?13_>nbDx_*;7PwVN6l8C=Dm*ac0(nDt-*u3d{g>Q1I0w#o<2SRbxe$UELI$vmg5{d1T%2gSg(Z(6IUxm8i(`}+#7+WOJ?LSDzEV+H z7w;KJ4SrUo?TQEqoq(QVAj2v#_vjf+j|ayD6d-34w)cvcWmL+Clq2DRa{_RyK7EzV z@Jt0}jkUnaMQi5m7L8+$f1LXOr_PX;He6vp93~IaG8)#jlpkqZac}&lTus86RgG9C z!^R*ejmpr{Cf_c37&QtP{1m4u>VYA~+Sh_HA8lWVBgI_&LlOJ(l+6iHgqnHEKCSvu zys1^2K|2ZJ6<)ZvHMyLS+1BQG&@;I46S{muJ?5-4EUM0D z^1OC|z8{1Pwl?G%iw^`pDI$hhPG+RGv)Lp;9rnXp<4q zsydwFZ1VDdqU6U2Ke?qs_7y>ZDaTXv-Yim2!h#~b;+QPnHYF#S@MzUT$nUR~SZ?kG znmVqQR;YGmFv&}tw+fpCk)~rrd&)Z{^_TXqcr(h-2LmI0SgoP&%`*jFi#^IOuME@; zm{_Umxl3lD#K(m&UkzyE5Tj$kA^P*CB_ zu4GM2!QbD}qaNgT0=~T;tw8vC*C8}MM2I{|g<&7l>`{9bFo3SOOSHxk;@j2KUEtEV zUt`{pi;B5p+`q1n9It6&a^<|gkywXwN3)BpxVX~$;NmEG?2|Vny9t{_nQ?Nw1JoHk z537Kt(5<5+=z)KvNR&!7y9RUo1+&g$A)_;r$lq$4TE`s^Tz(#xJ&OPEaE_iW3&H=? z)-1U86UPJKT8G-8<4}8S;1m7hyvR254JL{oIMq1bb+@JhjkdUJj%DM-M)xziX+z%2 zR7W>qgU_I*OF0l{X-0q>pA~58)~CM0JR#V+7tg!I^0sXu;zV}8fvNFP5oF&iSM-TO zmwlNZEmp=vHskIt{yEzeM~`CMh-4-sC>ox|xq3v zlDO0=q2xiGQS5>Z7()ZIA0s4}gc-wc(%T*S5wajUO%A6UcZKRJLGxXZB zL_Z(W>h5;<8+RVlsM!Pthjmvz$D3NlsNKmLET!v3je3+)=K1W} zs%1X7iba!Zly1fJe@*z0fY5<%l&X_Fkqq_VB*>LwaOT-d|1`BLZXaq4WB3)nVV6nM zyI2xo!3f5|9Eh14{)r!zFI+!&@3;5Uh`(4B78KKYf-fvu}Cs>aTnRyfd`gL z`)XHYzlgZZ+PEXs7%`XuX(kyDhDc%~w@LxbH%0QSm?Eh5Y(oCMQS@2&^zWR=TJCfG zX&-7&`m)bA@&jCvv}g%3RMRwrOa8)T*ppSI4EWwZ>Bq_V1OUQf$pi3VYUz#oZkH2C z138QI@giHbLSu(IqegWjJj;1x_^y;CWL)R6oi1wdX!^YQDXjoIgj>)yd_@rNc<}$k zu}9RY7@LlXVacJz5u&um$pP?53v-{g_bewUBd2Jz2ln9v9k1++)vTC+t&7yxnn^qp z5VQ2Oi$N+>;t&_U!@9&@DI@NRya42&x#)tske4IGIs{xE6{5{RQ0mm(n) zOm109#CXn(t%hzB(fK4T9y?dIy`W%2F95^(fmC&b4f3dDLB6AO+ktY&*}lRGYMBa~MbA^E|X8xM@wu_@i1nBCqO zZ|reM2&;Zmv~?{>j1R>v4LvQr(83{F178#3*w)DLFiVkb!{KE2*Ee{|Nv$POdb!E8 zX$;SBQD%1(L1&b-Dr1uH(s9YS+)@}C^_kYAeemu+Y{`Vw^FGe4FCj&V&heu}qmt$! zMNcl#AB_TGapdeB-dQI?XRl`Y3^Dr8 zLsroF_<{9kloG)*m^Bx*&&v?HzVpd{bc)UWK zIKb5)bP~z#a*_a6O;u^@`Zi!4uK@DHW)MwQP{SaGXE-Vgm+@U0-(L)Ujm@15a5NZx zO*yyYX!PuaaGfAXgDfM3RLLEpF%}@A;cbwUwNx|K+6roT#HLRnBeJZdg2|-bL^p1g zbN;Ke8Q%0!7{vSxdkaZpl{f}N*yW!w<#52%fjgg61P)NK$OKqP-L-~D#Yh=sEWqD5 zy^K-Uz)=_ha);s9Rm@86GQTjS=vuHyW>Q3$QEosUtzK);SzvWwaEu#=TG+83FVNDX zJpE`6!36&rE%V-5D+tmaLNf8VEi=e4KFzxSF%bN7DB6KppEh}jqHNs_9hxBfDNTdn z%U5L+1OBjHeLOips<_q~3yC%iZF0+%x<&(tuC|&8>V!Z;I#&slT~xat(V~ydgBmSa zAA>0}fY3J=mtexe9@FsTe&~i~p^Tdbj*-f?o2|a?a6N6UvDcFvPB5dkrEYSX!*|iF zs2fR?4kbAEC|jE3a2$_d4^lI3@M(%{yktR!Y_sS{5v?#~v}%g=Zn=Ea1?VenD3&Ns zxz=bIN6BU7h~iP&9sEu($PBkg<2AZrIERWtdgJ)G5n^DVN~-y?EMKnMi!a$ z$iz~hB@qMATd`tgJvud+6-gOwE|ttl7HnA*AL_*kq1nQ0bTB?R`voGIXc!hQJHWpv zjmqAB95SZYt{=YbrgYiO9X(p>(8Xazo6Mu&&1_1kTsn#)S7pk4A30s#?^z+szg<0W zEDjVfF#1ziVJKp_lhU>Dfl0i*@9uyw)p~(gqN<42P|Z``W%z;fjZDH>|7C_ z!Zf69C-xJl81*Vdiw!jxpVa7W_$gGWdCnaNUTK#_fAJm_u8etz-~^?6ZSOJ-1#pGW z&@8`?EM_Xp_=`@$y05f?+XZ+2gYgCnG-8D_7GlQ*bfKpt@KsH3h&GH7}YX%Da6y!b+Itk3UG5lMz{SFxBvrDW`lo zqPhzEkc!|cLW;6C>Dgd@uCgL+k)i5g;sKqETs8JAlS?DUX zw?81kxtFareg?=DOyMB=!4jdFNyEhl8nM02yHPM3%)4yyMPTM($sponrQ9I8c2y<$`Th^zOG=*hwywBHxw z%^ihmt=<9ICr}^GW^3aKJEiYqNWTJQk{i?_LY*g9BdHOX?F+{@s2NArD=97W^+QY? zM=pkQAnPRo?Wl3}yK7MFlr~QC(%A%l-#`oob6-pJh@7FTcdIY04 z=`g>4>I~7a1t5yuHKZx0h#VNd4|YYHiME!5#)I31nZo-7A~Yv_bn7K^>QK(5`LcE8SUKm-8vt)6 zWdXusA!(QihFBZ;K|vfzdt4{itfpC9o(2MNGLIxp3F?Zse4JyhPjnouJt>&!SJ)@{ z(naW7W?`t`Io*gcVjaj~NhycH6Q2kl)|~*X5gSLV2!ai7Rj;v!wR{v3yeIrV@8Bnh zPg>_-ug&90Y$)@NUeF%QP^9^_0KJknTN4UiUMZ3f*`MJS=VUqp%uy^s#;cr_oCZO( z$*7k&*}e!Yf4*l!NJ3=y`%kxzY7xJl$TDI{oS;IXsx&BUrK-13u>B9yl9I#(jJUto z6q0Cd*Zvu1w9gVWjRkaED6IZzr;=7U0=$^8%Mwc-s(T7wqG}wf6D|JSg3R!gLEx?B zUKD-G!RJV({AmzR>qwZvXDXfTx4r*t24r_-fJs@_665m`s{3FZgF`g5SG0T9Bxc0} zjbD-=#fpdk9NPgycCt8oDvqNRmp&kHg||bd-Bg}2ZH@g{IRigIy&Jgar3s<>7H)Wof(+RG*S5=Y7al?rD+{ zvBhrx!RqZ$z?*2C=G=I ziBp&(CE!}ls&%f%eP3Y;`Y_;bWf|xA#Sea=(0vwd+#8ao2dX>u7Xa6B$dS25?21l9 zyO+p?zUEb!?}&TTN{)F!0rdfRxwP(>psRh}mPUu}xH!UdNTUoO_Lp5c_h^do(xv{p zTl9}Tlt--5vL%)0h50QEP11na5Y66d*l2c)*_sIqxTRFt5f>7zzBr5>1}->7kT-1) z8q^FlBGBtvUzD4FkYYOuP4Zqi3fn)R^8^JtRpfqrrN}wKDGY#0;_yQyO?_dW6reWS zfJ#0@;2=UJB^ROB;is@C)KFXa(Iw?UtTF#Z0JLr)IQ=2g3X94JJ<;pL!*j;i8+Mdi(GZxmGV;2&0B zd5-B&3~1!i8JZET5^>RSI+z{P8IKWCf#6Gf$6w-_cgub8@e^V`S8xb)xN7dz^D_2C z(19iJjm8VWnbKpUfP!38VVR;N?SrpbN6lFTc&qa`Vdk%v-ly|YU zeAy>4vhU)YRo|tm63NRm`2d-OlvK@tL-dRTW#A!j>QwjFsi5G=>v4ec%%?e;#j7>X zpT=DQBWvr%H#aTFwk;!`ZyTP0=e|wG9jw9upghaRHaD9eWo2ybldsMKmo5v1C)s~8 zlLpsXZU4B>jpv32#HvKjS(FJqgC#x>W;km>nlP5RdL(S9g8`jhpd>@B9m4?5y z8KGAMF`yul)b1D<6QK0yEtb-;ZOX;q?wFtv`O+>P8p0@O1gZV068gFJkf8k-d3&;P zUP}WX=C0?3z&vj;HsqKs5&Q#bW%T4(>Om{z2?D z&mQjk6lUW%IIgU`X}4kKG!>233JGMnY+q&ahlB(mC209T!gj{C0enu(A%Y}lZ~@B! z)9^3JXCV)^-X?q8eQgmdTs$H$p7;>{ar=Q>JUA?2zAprgUM{$hFYhy|G%O0tLB@3G z$B>M|BVMD7Z)dHw4ac>qah67fGO{e-)tJV&z_ zg2K!STkJS79$!-Vo08LpBkWpUTI6tIJnPY z=tIR33QP4sS$|rUt_G|YjT#!k#!B_G!62FVy!sy`>5FJ=X-QkQC@>xBJTjO z*hTv2s6T^dVeNkW`^n&m^V#V>Cd>168P1_x+*l;|^xh`S%nFNI@OJOL0+sPQ9&;mM zpNajALwQv%+fT+gcWOzOiXN#qql@+5ZB5^eDC)V?@5s5LS&sKS$8(=x5~4^2`zerE z;Lv|I$a8o)QdbMyu_~p0GhWHCTA4p}G4Ooa&$Z*BM6DGbns z2yF#aEi%83g{UiEBZt10Q}pCY`6uN!@V+ib?J>pYGgAUuSamVFYg7pAQf-x`$J_ID zu1T)n$^CMCm?aQgEuBcF|MklnlgX;Cfv*TC!9Ml7V$~Ig+^~#W77? zHHM_+Yksibyd(<}-x!SyOaWY(q#+>;!sv?`8P4r>qT2bh+De4g@{g`{k2f9QCzvWO zOG|%Rv6rdqUCMGL5y%i@u{j-oBbLbw&{}D2Z?B8?e)7*=Lu$D@0cb4y4_uG9-_{{^ zXUo-MCO^g6C;#26I{^vZxq2JpnMb{NyHbH)Ijhw!ctT5tepYKCxO{byUAz{Pu}y|* z>@9ngADJPa6WM)j58;5kBNUP)nsGT{0LV63Gi9DtQFvL z*)a(v@m1tGKigqbzCB{)>+X*UQGXCP=l6P<{Su&M zpyy+~KPjPu@j4a7W+ZvLq@$R^j|Z%Ur*}sPoDm&K%lr`YAHqe(dB2#^X-B8Q&gbWFJULe(quqdIoK9BD>fZY!qx+5zBvqmUIt)Vx{!^wK z>8%Fp;!o4?NwK8g4hXU}x(+z=bx%*W296teBPg<*d-F<#gW21buxUc+PdQ(fF$Jp- zC`Rop>qhf+Z+-spEnbuN_M2wCimSGI-}uVkxMD4miiLA116yIMy4ORb3 zmMTB&WsWl3D+DUljJjC)oaBy{_sXT%G(&Y7F!c2|e24$hEn4t7A-}%uO3qi?i=IR! z^A0Oy@O}9Sd@MHsmIRpUt*sgeGiy6LoYqV6%^<&dALUc8t!L}HtcXij9Ix|#)6bGZ z>ibR;$|mICt#{$ilutr%-1@iq1B4KiX5o7MU6*Z)ZcQMNxy4?`Qz*%sbiAjQ9n!jS zk8C!2hW(kU%HhqChZs=YD%Kq#z$G6_M4|0qKU!cdjmcD$#@>5;m&N{o109i z5fr9vJ;~klu1>`m%y0JTKl!yR76dYp*UnE*ecQJKqk|tJC*D7452cNpyPq*JNjDn! z#h^i0p=^u60quJYJn<~Ud-|o#$hDdng=zf8QhAB5WHmy3e&)7+A7>lvKI-U{N;I+h z&kbw6ed2h@60We74;JexYPzPvc7guil3#z=@FXSU!NKeyh~_B6Ashc$LuUWabesOO#xhW4&A@@}~ zK>)fkO)~w*xI@?GZbcQ2>lN>zqwklT84PMo$FDQZjz}%+9{mWR7MQL`0;3d@+^0Vx z%KgboZYwGd?$-MPBwAXSVD*+@9r^;|87=;nTO@LMBIzZV{grclq;$J1pno^=Ax=D^ z?InpTgp3`2eT>P(U|~OZa=(5*wJOdwz+!4JNwdMuM_>D;=1A_AM+eGp{@$QrDH@hE`1V(YU0eBYd*LFw(No zjm(kP#><*bGS$r*!yjVX` zoer5s6}51KJJ%N}7cGDPhGHz?H*w<>ue)=ECaF8~2#!B4@nr9`u(-ZpDo-7&d*oAZ zE3`S25tz&dvN7QRYTYoxUt$fA<0p1LO<}0Jq=<|A!3I4ZD#$1;+soJUS~)IgG5)+xOC8 z{)P;RoF88A9K@Z-6C+O`7+z(kt}DO}ehZ(U$_$O(&>x zB&r_IiGH_w38Q*CYrij*;e>=>=puRRA^+oB(1@Tt7-yK3@D5l0lsNnNg8GbpmvNew zwx?^kiLr<*XW$p{H|p1sKn!v3Ork4}H?bnDoE7HZ18~Zc&)CV1p$uHDKn%5*O69Zv zOH*}qgTe%rt+;`s8=}qZuKnJIm>s#=7u~B<;(`KkoM5fH>|=KRgN%cSZWEc)zLDP~ z$eQKdOIdF6<1f?)qI)yK`77>MtNSVn8(n*qC5DtRq+biV)(fckV9;4N6X9?S{fTlz z?ASMBxACbN6>HxxAN)$*ZX3l{mN{2uZx0*5=$TC(c?)i@)?#!sGE?hA#R|Z^#NxqI z)x>~zVlGyXmN0si_+|E|P`-uoVzHydyGr%bRfD6<^|flVLR0yjVdwX3@&aoTwcdwg z3O^%As;I%&hXXaluNI)YJmWy|8c z_zM9%&Ko#K?l>?{^yx1-!*&1D@%2a>WTU`@l8v-E_T9<5oEFok^W1OtpO~{L zV}XE|-v?`T-$ZnHZ98wj_H!2n{=}@ea@kk>vnRTd&~ku3E#>iLo>iEr0bd0L%{q31 zNIF=s&2PP&T)Q!0ank3G-zo`ndCFt#wvnx=!QWDIMb2(n+}*_P;-rMr^EF{pMn|bQ zbrs0)W+0;Hq@S(8iF&_clu4Z%0B>jm%dXP#ithE@dFktbMG^Tqmz}`r-jm27nKW@1rOQ`7)U-0#8E`Kvn)-d;ny5vuN7$5vUc}5+|ocO z2DWPxY5tmO-ig;PvfZAtC7Xi)4NAEf%>zx0S3XT_AHD4M4zApJwj22W+HE~KG#I*n z3-eSNpq}|5;e8v01)MH+Wy(Bd(MvnlJCFCks>q2rCiylCF88#kgEgM*5|dZ^Eb{35 zLq3wZ(}+6xHY5AnMU2Dnw_}m9h3X$Ws{8`)uXH1BDH}{2J z5=W2F|D-1+@Fkuan`l3;zc&g1=11uQ_q6y~;FG!q*ij+kZJEVZ!jJP%*iLUnM^+Tob)Lk->&&gnG9Zw3tDV$Sgv}NU6y1C_1dwj*jZ*$<@(Dw z?Bzd#Uye&}9KKHfENEBg{fd69;Qq6vVkFOTHo%FGUSAl(JOTq+(i|D5DPpIiG4PJa zRZD?u`I?)chc-4V9PqiP4+w9&irjy^th9_q@HDr6melrMblhRPM*1Rid5CIt>h?0) zw>5F`yrzjeo5^u6zq{sR{#IX0@TW+hRo8=9~cw0w>zfI`cKSkAfv+?Wl9JulJTqQhTU%TpP^JzEmnDT83JX*`1c$%3k z6hN|(XfNV|UAmrEqoK<*`6?+N*n=RM@gj()tL?uWQy0I)`(7Z1#VaBA5j;UeD4Y!C zTmVYz3oHUZHkw*!(a<1jKifT?-l=2dygZ?wKPRduzML}b1h^hHXL6A~xgk>?$=Du#pl>1 zs{Ji;c?Ii3Dd&T{OY1IKAcTH_aTQU&bYYV=_Fo*^P2J4U0kk@4fsak=9dC~Y(3J4W>jM@kpq}v z*1MrrTjDO^iR;%v4Ed|msQyU!{iHOb z-&u9@)H%NcrClV+9iUN=K`~S0C)DMAnBnH|9L3pp_|E?UpjP!Xq zc5gxy$A4t7;Ivl>)6~(iDdwdzu@0q_Em1$*9Mqj)hN!1>7|@)48WZ&=!otM+I&aJWYIJ% z&a8u3NhfQWT;=|E7HFK?@QY}$bb!psKp)^$IKy9s$xlo|ZX3e3n%rW^8;53?B-B_t zs#t6#uqZSTmapx&UK7{vRKIfF5|F6F9BGFc!fx2%T~wnJn@KpXo8u_|0HnxF^w{FcEd-@1d_6Z@?lXJq28g63Ge6`QLoYI3eNRtg7yy9~H+4M!mF({I!| z(0q$*f7Rz}xeHCr-~no%=^B1(!HDNJGY7g6f&5*XE~Jv=j!6)}U=$P}CqfbC!hKu< zO>81p6az}Fq?Dx_XM+f%BEH@RPl~o^Lz+K4@-?UoZRA(8;jr z%PO)E_BX#6UYAdj^d_zdM7CtEQ2*oc z#L4{ACT+WOeTGxxnv!;00>+f zMVmZyo2CmIkq;Hjw~^3rDPT*ohYoD-rFAfnWucv0WC@~){iZTW18qDB+IhyGB=ZXY zPdUv6jb`&{>o0j-YN!Hcl|j7!xC}85?x5x+>Z`xfR~o@i1l&eAz8c4=Z3!4sLzl9 z>6)}#y(gy30WGu&DY_Y-#8-I>rb2!{-Q=$oviwA>i?9BHJG;H=IGh~RpMrr?=KsKpd1SQnKs7rWiJ<`Hs7;;N&@z8p9vt6`U`mx7&|x^rZQ(6q_)`X!(n1LQ z!@4V&4dJp2s&>xn`$91Uo_44~N=-OYM1j~5u)wYWzrIRF$J;@Pp3C3T2zt-oNCYA6 zZ}(B=*jjqfpLFcl?9fNJ5goiSpnwUoRHTJ$Q_DX%{8RMxJqct{qJY3MB%+)0ZS!_S z`nthH8EHYiN751(pz5L*F|din$-Fbq`zY*4RkMOG2suzHgsA`3FY9}?!CR$^4Yc2j z4@arJZv$c^A(p~fg1T*D#mJ%lzfFw+HL9@!(Ho6Q>pux!?hBe&WiyPkvNY^K!)y2Z ztdRtgdv{PRlG5CurV2|-b!`aTz_+Zw8Sl}K!smJ}36fhnHfC^Z`^YrBz z-0OD$kit0=CpQFezQ(+*S8D;Y;dB-)1aGV6Kjy*5wHo5XlgdEZV4wnhD32r6(;AKx zLc@gvgqWeg-FG>#=xT|z3 zvN;S3iqJB@OsMC52U>zYuuxw%qtqrL>X2hem6VX5C9@o5H2nTfsJMcr zP24@WP9P9mhT!h*9w68t!QGwUHaLSjfgoY#44;F(34JP>Yu7LUIpHYzG4caZoKF;Epc5DuSIgCfhnOu8e#+7Q-2p z;aF|*Hxw9di2)RvDhX#nYt1WM9ESMb^>8?pSp{7+hbL@2F6ziLWfQQ#cfFOzE-9p8 z03!kMWtidYL<^;q@00+qW)(Mv6sTR^9tu*2t4?AQ>hlti2D|pve8-QYfJmSDW|?|x zUMJwl6SYT;a)GCU+a$#4zZ5wJRdb=Wn&)Z7p}JMY#cU-^eJ2m?BE4#E&x!FN{$~A7 z3mvju@Zf9(H|mS+VlU86`haKp4{Mv`bP-EKb$=6ay8U@ob`1h^?_td|McIpcey4!C zP%M(!GJSHGU8(^$J6uB$cnLfwkFy>Ae z0A^v=FvoY^&O^Ip%E(Kd|cW%ZE$?X^M9D|jW$bNOl0BmupxEWb$&(zfx zEz;k37{qgx#y{peG*S_?aYr)7<1oy|H)m{8Hm^)bMA(Xv7Is=G}Xv8TE&FRxyjEKF=qF9 zIU?V3()WEXIl^&%sgB1L>dt&bdo~C4r^18u99OT64N$*ivxDM#2#WG z=;)J_Vq$9sMg^inZX*~4x~=9_6>hW2W@){^kb4qw7@C1S+(02ThLm;A&8i(d^30@-+Y0Iu6l#1*1ri(mN(woNK&D!}c($i?Fyd%bg zfvKBIWbaQR@9CXGDa5d9mp{4V2;D$0h|0r4RnLM!%ZBILh>q*Mk#1Lt)Uf#}E5Qg{QWSTwH*FuM!Oo=q>qc7<+W)Uj#@NfpvuR(=1RNP#RloJm!Z2*?O?xVy$CL z>YybRSs0S6Ds6=o_pWV$iU3=wDxwTq?i{ROtvDVer3JGQ+=1i}oc9BSAnpd32FD5z zI5akJA}wIljvnF$Ug%4~WtR_ntZEQySym+~&VEhiW6_alMDox58?23;=@BO}Jd%~34Inn-r0&=IA+3{vNDtN_E z3q{_BkcO;tTaHd@Cq{QWA;C>>dvWZHjEwQ7#biAW$M$zv!#Yi3nN3W@*aWbOZww8x zwD~7I6qn{P<>#nWJfU=wjUcNdkCNyOoPRgz!Z7M{5Z#y{vX>|cpIL(ZzRlmmn^{p5 ztK>0SF>kUsNllbMoNjq+pf@qp0OMA2`|-hZW@J-P;OAoHRts>PZ=niN$gQvxxf5QmYUq{q2% z0%ZMpH#4BB+^6ev?{52=b@->uBgT9M3IJB@z5>Pbby^6Jn8$Rf3Uhps7q25t5LS{~ z1~=GfM{;<3kBSpU9?j?RY2iydjbS(%WU3ngBY)*7a;FlRvLyV+dy~l=26$yOZDO{> z<|_0hklPgp;WFN2n*tsAq&P{8t92bz4|Ja6`XEIE%KQU!QVijR5=h#_x;U4)_r-UJ z!_WBB8bF26@Ej4?GNh&$x^WN+6>cK^wxrD>h8G{7%|e1uQ4BoV@+PfxFS!jgXb}Ec zpo*golRfyVVKA^^T~~zxtm+x-_-IpSJ4sM+zy&*nV9j?4~ZM~FpxgNYz2ndX|F@ln{K(|IEVW~!dF z!Mqs{klYa@BgB?FF#I|&IfLu!*vg8rNs64{+cGwbbXz2~Q^9)+djpk5Wmw=5?1RB% z^&{WYbOV7Ruml6R36JmQC_btvThAesc;jxBWf9x3BX`G%#F8Ss5jxgIiMp}r>)B)n zyKY`L-2A{VTPmXxHfFbJ*Rm9E&#Wj4J9_xG4akhNeVZ;eNs~p<`WiWY`EN`vwjd=7 zQPxhI1$%%I{d`|aM<)6CIG*z$Fq3a7nEPuz9U6${b)CF7VR~*~)S-hsDrXe+Yx?OC zrxQn3rSbd~y-lf|mJ14Wc~-hCh45&?^K5-XM-yh=ic@dy*0K0vWHP0s9XEp5#?nme&%+^a-REPij(9mJfTYg+F3<8 zwm`{-8IuZYA}4I_@pZtQD})aK^y-pb-beiBfUO;Xb1WJe$hqej6-1iHlVDqkgQc

D39LyHQ_qm4a!8i35)Xea2u=C`J?wviA)G?XBGyhC*FLd1f6I8^s}H zrF&~OP?Z^E`&Q44^#xiwenKgr5RcKTm|kW#Q0LhC$qm7~zf}$$1(LkF-}XAk*q$ka z6EiB`>W|PvbCIO{uS=lykfY*P86&V;qxq0(KS%R95^z*9{4&E-?m0Z6xS-}~8M$R$ zm51SwAnp)(sQG|=xhszWV@KAc5mlz=m|ccDB!x24*a%CNeplhhL*4^_(5k1bPo#^4 zX_RELK(D<#csX5@`$xK$tFe@}2fHR%=s|wjf?kV$J{PvY*!TXlbRPGsEXX2!EGt3P zl_d%RsKBMNkt>qb7Fu%@I`|CRH7%9T6(MHdOlVw}>ORQu}ZgvWS2X7AHemP7RsGO3{%oEGv$u zndNS?jazc(cXIN)M9!ZN3N~#$^bI+i2|CCjBJZM!OKrJ~%4SVuCwE4tq12ztb+4_( zTtzSyJy<^6F*cWWj&$9WB&3(pRMNp6xV6`$N8ZT#!4U~)0#u;jfhMtESwRCnDj+hn zEGc?YcafClkt``W;gs4fe!^xM@nf|_g%R9w9d#TSH6&vVu%)fa;S6F}oEt%$->9TFeMGbCX#DYyBdVSe(ZschIvRi_ys#vC#LCFaP z6|q+pCU5tiGjJ~(UWX^dQGBYG5u8(&Lkd?_=A>h7bg8kE{Xo!TI}8iVR_*MFk%0B~ zNKG~nM>9);Bacy?<>ezp_SUh#y?nLyqU3r8U^AOSW3=qL)JFpQ<{7Y^Y22kqm-i)K z+k%uZPXI{u1UpF-Mg%E+2RZ~GsocmOnx@|KeYzkTIRHl z5kVGXytG#2Jo)MCc+xG>*#W(`Fm48H`m@W=8Yo7zLTP*?C`R*1r0q%Uj=2{;a5(1q zp=D+)bTCLDY6=6|8?W<=;w?{?-tPOocy*^A6=wqCi3JV=OQYTc5os|L)Sfu>7r$i+A4?;=%s~D~N z;=ku7=RWb6AjHO>lG|rvq!I1zaZ8fs?Vbrk*PFbKC^ki;%#1OO@&YOGq)4j;+>+UK z+pjgY2|=$NXop>6Jv=vgp^D2UUn7_}yRheUR^JxXFp!3ibqryDMn^H)5TueKEvP@A z1&Y>Qrx1W%W7BT9VnEOOhsK}JnkEv{YwqyO3OgxyjFRA+>}Y2nIzzil(gobeXJu1K z)}*R55uTVv;fz7TP0aZBcXk@vbnGpk|w8k)sOuE}cY@WE&!+v3oHIf8he^>@( z6L53lhjZaq6mb1$_HOU-u&Ku~YRymTE zk_D=kH5|%=t(YBq9c6oXf+o*7mb$~KK+)jZWTsdEf?iy#GFDOyAB_FdZET--hg}76 z;lWN@bq-lry`PXr7d`?i29Vch7VazDlRrM(A;6K(3qwRgEaQXztJ!H>5a}Ta9t##F z>LN-d!ROA+{8EPgW~`=)9ELopxmwS{Tlc`S3Yt29{dNQ$pj&hcG1yFMO_A`QKvEKpX7A7)9RZbuAf zz^7U`R_i$6CJIN0&rHJt5g<$3(5`qAljux%;RShmx_9W6#av=kWVTbQse3VhV;Dz; zn0&M+04gIZTw{%DCum_7LP6$!2cr)-m9ILshuz}_7T*Zd7g`Q;Tlx`BS$kK4CuPFT-k1~aI@-OQq4k2rYBQ7FLYhdhzgX{ z@t7%Qld?_bM|0BU`-c>Z@(0G-4l|;{6wJ8rU;jd4$#8IWyTQZF{VvDj6tVB0?;OrrP@Cb{r@dKKmaOW?8p1} zI(vAiLMs4ah)n;-@fReezgS^sWep`@Bsc*lodQ4E#AXncgq}Nbumli-wB5I@tvdny zTq`-VNbcZskvf95)G2H55SB)lm;h>Wteqs?4iAKWwjaT)`d5Jt{o zF4XM#=l!$`DKSI)C5-r=&gH$=Y51d$0sYhQu8aZzlP02!Ce->7oNBj#7opD0@Jb6h zc>sW6jc*B>=>p)mJ$SoV$4wbd7I;X4?OpO#Ae=0^MXz9Ws_Q>{wu?1fmEn;C_-3YX zRc-E?BzP?2Tn8R(kti&Z`@i}_@qzD=U*O*lr&v4E`+KEYoRbBYrK9Bb6+7DhgiE53 z@Bkekd71x;Yj&)7q-!avu)_xm#p;)W=Ve88F0wFmxb{Ah{S@}>>3`ZyTpeOw{2Wn( z^n_+0PcungepEEbN{egdJ;BeeIne2OQqFM>G(Ou~?n(MFFP~Bw*>@=y+IX{PSFn8~ z7j(F^xNguSzBctQHX{~NbM5zmiwl0*QY99uzd2c?xQE)hs$sk9Ztn?1jD^eTKI*$< zaLdnH*BpXfPY0jiVSrxhKlqeuo5Ftv z26`_Sesp`f-CHlgFSlLy-M{tfd7-C%<(EEP3>ebU>SU&Z9(BbBaR~{k56#z0>R0t( zNY8V5Vba2pSEcGkiR#9(--7@HZ{u~~7uS>U$>NAfDFRMeAlB|4+28px1P|Qc8Uw&q z&9zsF{2<|dO!@EKr7HKR7x_&e;)#M+!f^ybOHzBjgdI$IR{O?;Qbx7mt|{5~^cze1 z8>&G=t3#Z5nBIHoud2RYes_6Vsm5ovRuxmM+KSszr<&Mxc6mCvHTrflHFsF(I37^K zcM6%?&}dA5(aDrQPRjK~dm}Gi?A&-Ts1UV@Si!|5dyVFjl2R?Ue zti@0Y<1cPO<;ESR^mm>%{NFMOs99V8E|Edt7iU+p(pC*PT0acHD~zztVkb6*u`vm z-H8EIwtALb0-Z|^X60Szy^SX8kPchgd?mf_mT8yd7B6I$QiMS4nucU_i<0?L^ZM*p zYpv3=CJXDRZPU4O!ADpQ)vU8HV-(foLf4ov z=^e;ZI=^70KpEV0euo@?Fqbu(Nrsk5Hp|}iWoOlm4_iUIxuXi%Omc^v_ZT(NcOwvNT z4rctGKU&$%3^>hFi0H&;BE5nU%y>)C`t7RUKSeLU@FqWZT3>c$Hg_10Ji|ALRGp>L zMU#mWaz1JKo=AMM5u;>%4z`<4TK_!W^ZH9pUA~!^?{kRO6-bS7Gm6Z}{bHEItov?O zfJQfpM#a{_*0b1z~5UEC>N7Cuf=32&B>#I^j_4h>nMMQe2 z)Y;Sf3$lx$jte>)D=zs9k4ufo-GMfbmmE|#Ej9Nn4K>ya62MH3U|{EZ^hSGfWW_0# zS`hO)ZwJ@;#foR_FZDTRc*P1xkSb*ikPi93+Bi4kT;7HL)-GF($%TRb0e#8*dA^?G z=L#bSbnoTaMV^0bKGb3#2#nX73W#ZnH}9-A4DH}Odb+=4xwOX_Nvo(Rqd-reTG{DK z0f{Y>b~=fRMQ-fjsy#p?$lnOG8zbaO^6m5p9E5Nr%^$T`1V}r70kRkY7r%H#%p8rn zE6e}B=aUP|Li@yK4XE zvk@a1iG1PpjHPcpD$bATjCjCBhIn?4tx(koAPG2@*eYH#bgUM+_4v}!5Cc^fP3@AR-~;F@U9 zcpP-NgNNCa?i#|Nsm!p0IW>vfo{=wXMe*HZ@cwvV_$D%a$U$(5o4n*yAXYzd7O^_ugyz2QkM^h)xGss@NDG!FHZA zXcEWqD{luaRSN7N3Ssko7A5ojwZ&6ZF_t~W4ms%c_OwkKL$#4i`Jvtnx}IwHexo!WSdRY@ z6GU8=NP42l(rK-cgU)z6_4unTE%!TmJyZs0kM$TIxWD~abZikM`I5SmvX`6O*l{wV zga@+8(fP`b1kKBpuo*mhj(a%oxygbOMU2(pB0x4EvEfQAKcwVuKd}3ya=%MN2xcWJ?fzMl`)#Zy`3`=lfwj75moDy68Re# z4X49sDZ*-kA4~in5>lU6-qkxFtHzo%G0e#~^d44MnCR%uw?gltUUL2W9DGb@5Ep8r zH$xLnPK&^CS_#fhBy`TH4GA~Bn_3C3gBLT%njVL@zlIT>hFOaL5N|EM?SXlDZ==MU z(MvQH2=^2eE>hO48ytkAUVZti?BFm^PqjdjNx5`jD`edb)i>OB(ra$%>dwv5o(E7e z@Dck7*dIi@{8|3{R^Q$SThHizdG*N6(v6h0E3I6+I|rB0!SB%iN$)E1`tPA_d`PBP zbCB`zVQd^h6=}D07>K0E&3iY>=0P(Ro}qOnxU^om(ohmD{i+pxXqk?>i$%~=#&!MM z`t_HH-hPL zQsHJ3CZA(+s6-lzHoM0Zi?S2@R^@X{$D{1KXHJ!=HuhfVLgjo(LPgMTQ^&+ipHEsv z*MAzzyGIM21~VeB}Jj7DG0t?`q^YJ`yn{bgU->GeJDsBubgAaRL7T)gQ^ z-;Wr2VI3oV>u0)E*4245Y-{_%>ELbJv7?Nv-81|%AA}mROu)k2XmO!3KK4exQ))ga z%6f^GFGG^)J+tXgS}ihEBauGPb!%%FnM+~%Q~vn5kALGlSwnRi4oHp&Cc9*Lpya(y zFF_1uleBW4U)=ea{K-aQgjxPYz0xTdX#u&IXGxl&1ufbc3vZd=pq0~eJV&!$uXuI4 zSbV$kk-h2|SVaT-lcAYUnK9WhqFljume_L8-ghvk`elu~qd**94X4BV*wfqi2!0^d zC{iOjn#~n9vDqu;BNFB#Q@z>Uc%`5Z-Obp@M$d#6cNSsj)>l>5C&`Nu?8-d;lX(&m z6XNM*mRfP=zdaZ60|<02DbAf~0~}4WXPC#Flhhx58f_Fp7==Ao@=a%%iGxz*UgC~o zo+nX)jmG@q#+_Q=iEHb%9<{aOKS@tVXwO>}Bk8(Qp0=3X9^&|ZejFPq6<*@2{NUP| zt>D}j#U1q5_f&l{a^m(#ZnO?cqki z5@m9&VM*^}GIn|^z@Zwx1+4`kg%ge&+`f&PP^U6y8hP_y?zT;~bp(}1bZ z9d3TSD-8Ngys}r22DW#J5cDQV~H~+>;G$lDyw78bQK>Cophy~5PmV$lg0RAEKurw+|)AM%3j#rMIfpt z(Wnu0{>v+J#h%IMan#f_IOCSaW;om5;)-Vwnw!K8HoexMhwb^GL0{!r;(%0s!dNO$ zATZ!J#kW`uGLa>+R)WT!OjuBSXqg!%s5N**rZar)L(G|-=XFH{2!8h1OP*LfR@BX} zctWFY{C-j5ss`(@V%&?yYkTJ2|R3RjO z>rzqQb#dhM1sGnrDn3UW`-|Brw5_#do;uRUXXbg#_(3w1bgF(${`G}WN_Z-aa&xNS$jEX6c4#Ms22F<2iVvOq zeLBN`*AN-~Q*XAA4P0HqZLj?1^6}9!=M}cT_$?L*F_k5Fq`mpQMTA|f9r+VVHIo;k zm9FYGnu7ZUZPo9PvY@P=F`>>R-n zRRpl_Nu4XrGSp(ON{-@f|VifhyJSPn~y0X0gdq!7@qkGpeKnD zdcZTUv0S_a*^Stl7JqkJ)BDcv@lU#)EAZ?>GPe0TA-|rv+rs5E8SpoSkI1c{nL;D6 zS%391_iIP(34B^Da;9JPO<}*s^piTx4xXG25ozK0?R~nvRmv>)?O$MC}o%pI-+wsap)Dac^XzLN?i_)o$h8@8O z*O3Tkcml~sGo|0(7qCnD;+xM$s?y(kIMp_a^7dC-Iu^xm&R97jF6k$~=U^G-VtxLfl<)W!4>vY9CjQ1=!|>2N_5ioI`DomGY{%ISF(f0YtMTzpur($J*F@H zF7IdWw^E-EN?%5;crUAWSG06;%o@47D?DY3u9778zb>N69PHrM6t3LfjjcA-mATdg zo2aV=&ylry`hGVwnceD~~FP07D`EzRpmVZA74-AI< zF}Z23g-n6W$1szd^)&;pTmn2w0KA$?+H&Nu=c^A%38_jX3O3B^La2s;x_|YO{mgE= zZ*y};yV|XPRTY2H*sgURF`n_9`Bs5=%Xj_#)brGg^fEY=|&ZpT%8Nbimo28$VPrGXLB{I zY6Tg!J**+$LEgK%^Lt;R3+achOe79MP@Xjk6gCYNg9(n3!$u}9w%@1_$H#7D)1NEW z9%D0s*wczK&*bJ7^+{WZ23EzvG7U>*X_)cZW8mvP{T6hel4kSi)x3>pwYeRT+s|=o z@*`GMq{Q9FEd4*LrfyzJa)kla4-*n|E>hcGm&vBa?|)S`RU3T#^$Q!>R2jJ)+ny_* ztj$;bSdQ0$H?I2AdEqsuzcCVISlQ69bDtVA-CmD39K>-76+riS{-u`H$;bRSj!3h1RCqskO;K<9w$t7A^wo=x`Mt&- z8lD$;%BH(bVbH}s|2J{_LPn&`)runhgm0Yl-%FZza+^x(M&xg!)mtI zh?M_`ocn*!xsoma%-%Zb%NU?;%YoOJEWTSf%!PMgZ*uDNd__o3})29wg&m2V=; zCKv_~7yV=&SP6P4OI?YA`)y-*m>#|CQ}L-bq{inV_t-3IkMh|Md@I6Keg=!gTZIP7 zv8O3;6SxwlHQWXIcodf4hQ9wd*!xq+)nWFYLyoVd0*vT%{x^C|Y|ysJ6<^3}al$wh zRMCnbDBm)OhS5-CSUr~`t6Qv+zs~eAPo>F;CjJFpuyw1)niYra4=XEQ=?aGQr+%31 zmgVpQCyM=$WP+;pQbgy_pX0DA-CLtBt!6+sB1y2oKHwuw05IX6Tpp^6DDs!2Dovt< z_Y5cOg9t}FwLgbyx+;^Omrw4JNuRt5M*x>klGstg(cMxk z1dx1&j1c@LlTrl99ZG{A1n_nOD*~884{!S)^q7c*0C6xul!3Ros}Uq^bcNC*;HVED z7PFK$k8`(cqKi2OaVU~7i8-Kj$u2;guKfuKFvCI(l|p1*r$t2o-rgZ)N+L3wYa)h@ z6}d8_!2#F+Vg%Uo7PcW0ye$R4C8D>O96rX076QN{nadm#-bN!qfZvB}$*5c@iO2|pUgB+$)1?KUQNv6`HgH2#FY+N!CUk^2 zk$U*w{k{{&^5=qrQQ&826w)-&B#I1YuYaS$+w*`4j-x~b z9_ncbzIr!TfF)hElfLtz*CL0TRjDQF(>)(~*_1*ssCQ6WJ3#WW8uX z!r$xYK*PeEa|lisOarn{A?lt7>(7qLV6PF8PfJ{?-#A{wbkB=zpWmWDo(W`krU&aDM@~lVPV9DqEBw~Z;0N#2Rr~|W;x8Zf& z7s*TlkB8lE+7Y`?yo)Z7SePe&HKEx4{Sqlx_AjHkzji)KxG6C>fW}EW1jxbBw8o!L z9>&RyIIiN1?_u4DluhM}HFQ^1b%b!{B4h5#9FZoxYbk?b*|4-# zJk)(czVBEp18%q zG+0gHUWifj~H787Cj5bkRCZU!RlpHHTm%>;yy4(dv=iNC^FE87uwbG~>W ze|qQom_h);P-SMF`y0s}Rv){e(So~s9m7rv zPlR{$YlSjrl7p1wd|)`J|3uIbE;$xGQ`B&=m}5f#8`ZPee}apk1zd8XQ58Jkj~M=E zs#km_gv)d^i6**{_Z2zaGhtXCfAK%rE|S#7Y6^4wLs-0v{Z9c*K80=rRPOAu8{Y1x z9{fj3tQ(-_!CCQ&$VBtrYC1TB{OKRI>-?{i+A!`JCN*g0Ac}JoYb$l+O@0uKqzTXu z(+yYk`c9GT=}HU#XPSTlBo<`Ifg79uB$}D@KfObYC5Q{1zbi zIs!+>Tp5`$;L_hsqL~aUbJ0@14+7y)-|f4gm-=V|Xo$fp1Od8xB;S*904nHfrOBE< z1mLQw%Z*VO33b{45kC}1;HmQTO!jASs5q)90x*b1iWB}u_@z+xprGUe8N@Ya1n~V} z#vTT-q8aL}l+FDBnCEZ%U)8c`Qs~+dMNvbABeItwVVSs5g$!?PPgCux5Of=6hM4d2)~-3t8=C( z#Tlv^#`>Ta9NC>|mOe8c5!!|_E7=565WRTRM*JP7S`2;3 z%)B^LCInHCTM*shq{|U9uT!CJh8?+PT?`(jmg?sR6L$FOI_3?C3@!=)bk0UE5J3g8 znYo{^ibJii`X7Y_J? z{7>&BrpWTKd=Wsx0h5jKP(R*r(^ zcWB|{p8JU5+^u-TkX-j$)ZW`N1fW34Hu)?H-Qy8QfZTxLcyFhOd*CGMX&nA2hrthI zfX5Oo#6{m0W1PKE{WG`Tzd@@~S^DhI&Gr-gz9FzNPd8&~?Yqh`OzLog8LSK*F6Cgc z_t^CVeI#mJe+7Sx=6!<+q8Hfcjzjs}lJgf|>A}=<=B-c_)(nb;p$!usD|o>PtH0y* z4OnkC#g7uSFV7<`9CWD_wZueq)S!X5BsF;3u8Xgqemjzn&Q@`pK3E3{(!t|fDh_=G z;I;Cp7H?MlX{dU_!fbA{TvF5b@2e)(2;zm<*MJ_rvL!;y=92KaJSJJMN~*L(QeN$> z+4sj)+6^6U9~Wf@$I;KxsHJt$E9i5$;ntZ{3x8>evJV5m%R8hwhlncbnvl#J0LuP? zsX#TCjman-rOUF82wvd8C8#j7uq!uX`{St{=7~;WW20S)>(0nX1{A44kYp09Xm+9O zrJNC{yHZntGxYHW#{C*M+3J(cKiLo=K0|;V?eU*9aaXZQ+GtA>x9TIlm8^K6EuovdNLF^nQ4Q&qLW(S+x&3SJ2rk*@jNs&?1lZ$*&!l*HK_&f|6a< zHf^*uK{zT|x>9?2=_WA8;(tOgylUwUA=V6WQ>=y4qe(x^7a-#JD=Rts-S5B0WQG^n zo>I_(*S^rW*WG@ofp|bw)=QawNnG$ss2#JVJmOk74*qKh1?kRcxb+U7EbapdH!4uY zd$ZYzZw`f4dRhYM2!{D|tV!Z!&umT&+VQEs5*&18i@~^pIrz}}_BcmsNf`Vn1oZuN z8@`KTFxkXd%eBA)4bBBAeavx`jS@jfP5m7$9vFh9;|9Cq03c~)xO#Mha7$&Vw{!sl* zN&?2MXCj`o0mu@8&Fqw;fi5Hyy7})X1?RX5$Ro`mZy%o(1Chy20qL-HubOhi6yye(B6%Tb)6+L%1aJzl*AOg zBTnI>vKq}Xd2gxj>&)J3UEl$E#N|fpWcfa&@` z9ksbvgFy4H4N9)I)u^z%DWRbEJV-zTIne$V>&rE4XYols@mg5Rx+c1; zdNfl)geq;;LS;HVeV=8&c$JPJ?{bdx`O{PrDuChj)pCoyDwp3l`N`nBD_Iu7->;nA zYf}cLn0B*}0ezJH%~mkhz8}CZ>8gGHs$pY@-|uKCn0G>FtDKMo&?@vp>RX+$K-21- zL9Azn_#t18b>^M;`hGiK#=Je^!2{mA12+)Kt2H9n>?eH_s3VqMMGO-$Y&fWZR9lrD z(IE%>WO4D;e!hUg-x>Qm8ShTHyosj05y%UU2BiiC9`BQ*PNJj+6?i2xqpTTP;bP>A zO$ed5?))$}RuTLAu|WLB*d4pr4J_2?#puEqWD;MXj0K=qiS9999YvGc$!?2*QKv07 z<3i}R>y9aL8trcp0DXoRp-AQs^gIwu_KPSsm?D)flG@-$HQ{O7hMlG<;w9DJ3x6>L zpjhjQ<<~o7M3tL}Cyta>f7^B$c(02e#@u2x!Y0so+Y9RMV2TMA+81fE)<<+u=r(fD zT>Xrc`KW~kEtURB_G$SoO7UaZQD>j&2vws>(g|5e!g~iPp+NhOVKL9uNCH`Yi-r8{ zKjHkOg;b)~Z4WNJd&S=Rie!-0yzmsR_i!+ni-Z{g@w>!d1Las);A%vdj?2I#fy~?D z<9>V3K|;@s8m8@$MxVZ;7vvZ)308Va z7Q>M_$FM!Be`uCb4`DOET|R5|SHGD+)L1}*`tIH^H^nEmT$#8{BifBVVadCp--%uNcJw+R?>y-ku=Qw$l{Y{;QTh-T zI=BjnrpDBv(fkoM5Rd%*%;?pexLOrQ65Qr&(K_DbYHi@Cw0*2j{;_;EBc}O8WboZ< zuV^VX?p;F>qlguU*@2)c3G8y^5ctw70Q5|K;e9i*;gy(gdTzK9S~6#~ z$Eg1C$Tqr_4M)LbCzMK?6G#t4?@VCQt_n@VA1Q+tR@p6yEea#T3ty60C7)}xAty7J zTLwPVj;C`4{$=_+Pp9-NJ=#j0o#Pr_kc|s}0UdnrjwiUrBB08@8*nTc&q=6HnljbO zEJk-v%82a}^9#Y~$QZ8qP<~UB=L9?TGU`kSTzq4lXhsDI!|gc|r!1(8Vwv+a=F3jO zX!A7p&q&}R60jYG5{v}v6iFAeZ^yPR+D-SYjB1HUm|=z6r3-pI{j25Bo4OuDtDN(E zkzXE2ARFCyF_k%0CuVHaHl!0Aw&hbAAMFIsOE?WqO%3;iP!XUY)13n2L0t}XSgIHE z#iIh^??E!>wE3r>0nNxpTvX28-1|h!E*5Yz{97M^eTG+hneK-_0?2nx`=_Q1Z68)! zNG9b;&VBd?!Xab;?Bvk?=o)mU0>G=N92Z;_k;Ybc*hje%$xrsU3`5^An? zNoX_@LC5uZ9x(!BMF#0QKpyeu_=nu|>k>R#1PcB~C(8QI`g(|5>Q)Y>`^6;Xvu$Qu*xAmz#(b@BUkVoC**rzJdUOIH0UvjwsgHAe(7 zDZGuN(){ss8$!94?oC+lBa{J1lflAIG!}oSRqTg4{g(6cA$*Y(yf2ij$~W8F6SuQV zYyVXrvHs`TC;Pk7h?Y>*y8MFDy7Ipbo_*864M|xvW0JEW(cklAmkP5VMPPT&SqFX~ ztkr?|DMy-$&(v6ZT0ahr6&r%CuI7Rrec;YZK^PGiK0T24ptvRy>yG8!C0!O=%`7X} zY&gp5F~J9uPLMrQQ)rX128gg;`S(1yXaR+s2~r@$1OxDeX~#xFQ{END00M9nU5Hf` z8@01-?20qw8iz#|zk&J5G;7qvR`myI( zglQ!+BM`NJ6ceby;oZk}V>)m*wSYwr6uYeBNS4RQr3-btRK{V7s@!Cr~;-nE{u0sjeBd#7dB(e%eGjp!vu5lLoM{IUu zEC`Sw+K&c}Jhy@%6X5t=1w#xh)vd$BFA&9-u6~f$_-!nh=b*XM=zPNx^;GsWv^N^PHNk<^3KI`fXcjD z+#VlzOS8507OeCNp0Cp3Ay3$HSH#d229*$|j~uM#LI4_kLJ}vppMF0^Cz}Zml1nex z5<(8l{1eZkV#c(-vD{=3hqzMn4R~6K1Kf`s5n-yy*rTjxOViUckM-{LtVk5~x1+YX zPZyEh3O-h^PGXD)$rV_q$<5;mQiW*YhMo{N5f0<6|3e+{Mer-&$l?z;M#oJAM<~uZ zkq!Wd@A^5+(0Bd9rvCZ{WJ6gd*}-~E1#R6O_@{w|MSJmRjI z$s}OfCFSa51S4(tav7Utf?T{0-Y#@{bT~<3FsWz9e4d+j10+M6NH~N^!dik?ie*P9 z{_1p|R2C$Eed8n)I@VfuEjvWKk-_@=uiFRk+vN>Y21MZL!vuaN+{FkT!&g_6qeFn| zeoo>q#p>rIB3ZIX{~w&4XE&0&z4uOZ zqW3yP??f+Sc#r%3KhN`C&-H$K`7o}TbH-ll?6vpWYyH;VxVXf9(xO1){a(FA1{!Ro z1_Uiz0>4uLe?J2h^6HDLNuM!6nUX&9R$o=VEN5BLk@xgex-KUatuJJO$xlfc{mFC4w?zi@OcJA9SoCmcOCrz9JLI#T2XmCq|N#g77; z1mwZ3U7sigHi>o42*F~3_TP-{R2@_G^lWA}$algvY#odwjY)ND4i?x$v2sd~v1LSm z%87#h#nC&o8d{W!997ip)l?qb%jfsnuUl5(tFE4KsMbtF&2idQIi+jsjGefuDp%Y1 zy(Rk94+qutk*lUd=Rk|KY>R&gbO!#GTeq4g0=+zKT<#_FyRy_A;lF=BBhGR2x|KefX+MeUjVw%nhdl}ZALnO z#mzoep|PP=!woFU2P%SB_hBE5IWErLr=8T;!3{>Zg=SJ8!L|=IBcIasivAQZzF5tB zV$WIdKLYG|UbYue8fr>%X(kb`M6M^V`gE{ffjt$eA{AequD#srhoY!QR%0T;SCrI# zbt#TvbhB17Mc5=P3aY_|ZRsZYVmvLkd+}o5Hl!Y?fS?`F?Kd%BayzZFob9Aa3VdF7 zihk8b_ZSnXthD|uds^?v`Ab*nRM)sX9%YV~%!ifUEW?ZQ5VTleAlCd=uc{FGPH{1I~h2?(PiVA2sZK8kVW`S;fl z&Q5)Z`f06O_OT=&@8@SK+$^VLhuFM9g4pU1Y%DxFGW}2%D^9JVyV6`?x)suXE=)1auWrTaTyb%;R3D##sRO5Wy^ z76+ce(gk$V+3hH>dd`H6{_MlFvaU<02CSSku)s5CK{7~5C@jPsW*TzAjUg`;LkLcL z2vBpQNaUAQyjb+Q(&HaC=hp^qU$`a{3J|m0!qg|atGX;FT)8AAg&2EIt2OLl6)zi7^^;8yGcPjL?}d%aov4$*l(ch*!NzLl%$S^&q?-E#;uB4qKh(J>a?9*5dI{bwN@TC6$)NE#c%4W;H4bA`kLPN{sy0Bxv@28#vS!k61r9a zT;=G?%x6UcbPZ^qhF@icuG@Y|#xc)BxBVsmP=q_g2I`wvM*`?NO{d1?3;4EY;Ov=2 zRnvE;ndP?x>}c+MMJFYWc6#Z{r}WaK;9ALebiorjQRfxN4O=c;0)9wTzWE-) z^_RE#M=We1Os@H+h-EYsq4KUAsuv0thw-}uFDBlalbn3}bZ>shZB-In-~c~doSC8;3N0pzEK3)zHXDs9 zUT~Z|DDZsLG?enVtwqcrxOTPt>_`^nzN1Z;`ywys@FNykQHOIXP3RC$Z*ET)D{Akw zqt84!H|?sitSMcs_DAOvsbW-d^jyhM+H`)^n-jaE?WHy?;4sQL)LK)9k2F-Z-eNf^ zTsNk=hls3%S{L9cQp_ImV7%Tw%iwTzdHhgpO(@TILxV?xaJZ@%tRiToIy-9>9*r^} z7K|?;Ba+YY69s_IfukiyPAP;yRf%A+-1)}+Tk0VFICeCt3N^VSU7^ePv5;C&{QMzp zlwuT@Xse^|Y@DC(f_)!j3|)LuUHX&zwA3UZI=DwQj4m6KCaYT$9t>~pn2V3O_Hckf&8i0< z{DoR7N<2O+?;q&gNeUXTG$?o3r8skrS!@KI5UpA#VW7P(OPoBZ$!@QJ&V)Pv*b$K^ zOTixaALv|8-3P7HOe+NG~AOg-m03hfPT=S($P`G%oVDUT{No-H*g*2HsJFr+#6ym2j}JR!K@wmMqn0MwBZ~ zc985$mnShthdT6V(y7{g+Uhy@5PJ6E{py8hjFk(#+#HXx1)hmLu={|GS@gPhcUJXu zNR};rLMM^D7sHrQ*d5W#0lK0|oGHvp6Pv344fZbCDXmRuY(1gJcUJlG5T>k^y>%bA zXz~_L@0r)sbiXQJt)|Ympr5f73m-Jo>(i3qiLwpmT@TOZn32 z^7m{Sr}yd06aPZzIeNN7fqo6G4rNy#7P~YbE^T8xIu~ zth4%=h-Pncvz2xpsG5i%5GEyQVB$OL+>HvK5IM+!&q_eP5wx{4UO@?}4&o)xRXH}9 ziud?V1p{zwKp(=!GteYWWr^KZkOn;mUERvOI@H16cs|Vm*)w=u+ zpSjl2<=ksg5uYP#<32fm<_vj$48)GeVB-~-sN&uom5oa4;iD5 zI-FLggItRfnTU?5l%D#ae7TQN1k#jv?#c^Q{MOMFm;*o&2e*^#My#X(JB0y$j%UFn zm$3I?*8D(ORhCw^FP8+YEb>x^q{Yg<6gZE4tXjRIda8|Z#*Tay6a3@9JKz@2s!2(* zV57rjZ1W}i!7kfYa}uX{e)W=mLU@ciVbTH%TbU#H%sx7sJUTl)uD7lI_3AM&Py8H~%T7lV^=qtY!F@ck6KS^!Thq3`J^M3r+ax*(`nNnzir?H zliuHMZd=dPcXH__&a;E5Zq*CLd`CV8Jpw-{X8ZTfAid`mQPL!j2{xYRocy+V7PlGi zK7_l8@W{1}Vw7yWW}!3s6G0!-+@`gGvK*3dW!D-|r)`%)#b#*BAyWh-(CEHvAigO; zR^yVp*Ri`Boe%4XOgIdiy6n%E)c0Qvh1Li_R72$*0G(@U zO}03gRV1%laf(9$wic#u(ZCI9`RUA7tMpp46XXE@7dn^H?GgZd-No1Ilz8;R_^w@gP$JAKp$$UASf5GSPJDIAkuX^pl5;!4yA4ADz?TO^jvd~cSTlX;y*hn#s z-~R{Kd(bSbO%_HlqDT1tUSMT;`PZ&0ohW;>rb+{_kKC%vI2bLjcqmS2*mS-zGRyeB za^pg^ckCHm$MD*1o}?wz34qQSG>c!7O;yQLN^@u&>-c6atQaR@;G=D0^M83ke?M}I zGLTOrk>&LUrHhx%s0N=|9l9#I8It^+oyQ=RtbC-`p2>6Rwba*B&!f zLcA`sIk^%I_B_KgCi*{PEMoFAvL`Csw~LF}%rkh+_gm?s9lsy>w+9FK^m-Kgs?s7%Ka6+YmnW@UE2iQbTj%@C#3S1; zDSnty_eS=;7kWj~KzljW+b>ED14JmAA^8 zKXWxpSk`VR+$!Fx8q_{`Z(mM6xA*7o(CWUY6cV_HEo4X&BvD0-tRdLz`YdEnHFkla z!&1$``ysE!Pz%*iDqf0*`bzN?VXC2ke$8D@D(b~fgH({4TyEyO>Hw!&fO=14KNZl3 z@;=N-l^m_&_Y}TImbF-mw%xMd!K6{fmyneKdw5n9^HqHZtXD~-iVCeLqCt(`?WG_t zS&n4xk9*F|uz-@~H8HsrDoa?P7WZu!#;(zXVB6K%B97%7#gySsl+@fkb6V3I*pwoO zj`*3KGX^WB&HX;@bV3hr1KwTcJYKImFD1KJm^K@Inj$FKNMN=+ntCAHSG`PDKzjQ&ASkGH5?H+#KrEPtnRp#wiv9*a-Scpk*|d1i984P;@|g5}#iF1Ie?#Va;bLEW zk-B_rE#FS?9I(MIn1)CKOU+x2LxGKRtRT<FTca-KW4VR54yUK(pO{YK$;R5~tK5dj zU>O%y$MYMa3;u2WVo_C8W#QjyXdOK!t4+d53Y0Ww>ZV7}WbkB*+%k!JA(2(67NKNi z7Of$vEj@3V>c9uNYF}lo(sWDOeyTAsEP&a!>;dFFxB&B=knb(6jT2t@O^H$Js8&zA ztKD34pHKLNPk2>UO17hA1op}+vYYRvtG=hLOsDB78`^XI73x#dHqHXZA_gs{oEoU> zD$ z5;GfzA2Abttgan(-fMZZvYXZ`kYvY)8;d)zOA`Mayt**f#f}Shi_AFjtWpn?JAlZt zdVKBB-w?K8h9z$wf`5G6_Ulg>q8GYr5G0GCwEfXtD&3IR2GX2yKNTuMa5p2BM?mBhl!{&|6 zuCpV=SswQ8ZdaoGapsmWc_w!qudAiBa?t*}wMo)-tfW!zc;Y~s!8K0ximt5H!6Vn! zG z&MWSFf0cN!{`swj?%-niy0{GQJZFaoBcyrm< zFyRpar+&04dX+1Nw7~50{==MyJ*!z~oQU};@egy3M=yITk$3?x=P6E4%=sKcUeEP_ zCaCZDSK)WzY7R5c*R&a94Y^o z`V(`G{4aB!U!Q|r^TeEUhdRBvGF+E`;G=oKgiEiM=8COi?&wzK(q6DAN|S(duGpi3 z8Dp&bvhqI*AWJKGXmrLq=2%h#Pr1hg`)`cJmNa=VX5q|~I3D7);EA3ulWlhBZ(79nHg90b;i5!q6N&OJ`1Bi>> zNC251Zf!)#C(IR~%eVhSm;VEM?qTvg0piL)!l~eQ))W2Ot_XTo9clyfhuon>JTc{p zh-hrh;q@@A;3Xgf7TWce1i0z}z{t<#b${Uj(PUD9Waq`l?tKawMFMFc&pV{_r!3YJ zjGpx`jP3~}rS7MQ{-OXWlt3UagYC~wC($u4isOuS$#6WkKS1Ru1FtlZ(NWOuxzP?) zxuMkx(Y!5qn{^@fta|zW6Hgy)Z#p&rpF<#&lvWKh?Qo9jr6`4MbRfyE+8cCzj$+-* zZ9rZAHETg?MdRv|{c+@wf))z!sg4(;ATBXz`(ge?skqlLygWv}l0%-WCETXBO-3B- zK$4>Gp;r540v&%2$cou|TBrlC`HuPz(GLuU<6%}Dt6RL6jQl#xNyiKPXi4dYQ?e4s z31O(y(}5xC#3+O*MSCfW4EA~XW{D1dajJftIG}BhvE=NY??*+Hu|{&H*y^c&(U`tA z7IU|327T44;prwoePIn*WJdNZ#VEX)uS8{24%okpuH%ZQ}}lg?5_*Ki)DS7Ey6y?CW_Chv2W3B zVB#Tg6HGRHQZVa4HP1T1m3FEt;X+muDVK+$GRL0y!R4Z8E)yux$N|BwZCpw3ckMpD zqyegS^AC6t+2&|uzj05e46FL!w#DV^-z71Flu}*uPc!43 zM8?p4Q5&}>wI+Mw)W<|B3h46fhk1ia$v9}i;sEx_KW#_(;r)jleVq4BFZ-cbBw#8AQdAIhQFavMMp6 zZc9kYJgs0uCtgkltfXAq5YXac{W8kH{md#tQUP4=O@*^2f0%0lU=3;Ya*W7exvw?f z&?svdRerJU`&dwrKPCITDd{R*udTcoG00FU0DBt;m~kWQYOme|Ya-xNE`al#?c*aI z@ki48ia?2FP?0UGkQq*o5LH)&EoqwtdJWiM*L;Zy9=?eIrim{jH=y1QvGG0*5nJHf zFcOiNC`laDcOSCH_oPI2n^(1?OjlM+?^TSaDz?#Nj2f{3!%V<*0#G-ith@j^9gc^o zq3v!i!20wQei2bBBgolc_^t4w2Q7AeM3_LM`xAg9gp|bRFeQ-L7p~fk23(k>^oxZu zhF#j0^S4Taht=0YmuKPL0CTQ@I407!mqTo6%KVn*yD1wMWw%oRk^-m<#0T2WK0br9 z5sh@=17F~+3L*hdR?yuZ39*TRy~!=D$uXUBy$%EBsYN3<-N66>{iB-^xKIZ`!JV@{ zSO8FZlq#wZI-6+Dn0RzWS*l{5NFcJ_EV2}?~*4kCU z^e{2~J|S90HM!pThkjYR!XoPRqo;fM230dnau$v%A8~4<$mlgJ&iZsAFrG2~)ppi- ziL{Ew0VH?xfv*n`WOI(h>qV%Z&PVtXDB^ABHT?ToRc_uo!t*vIJq73t7XrBa_cH_U zufJ@gG%OgBrV+A9*Q1VYV z9fGX}qo?INDqly_gZgGTg*M+vYTL$D$`bx;3Np&g^jaC~yhR18YbHA|gN#1lvia!% z`putzR7%BUm{V(8h|J5|yV)QC&%b9Uz$EVaSIa)Y{|YBv~@$)BR z7XqSi;-_athSux=^KUuoHUdf@ghAWKAARe7(U0E=RBr-UxP}5B;BjSM;NM?-1x9CO zXF+b})s23Sj-4MlNF5(u3PkBe%GgFeFOlw$W4(#P1|DR!UE!-JKK!?@sj9s$NS5t% zf&1KLr;KnZrBkL02X=tbTkWEVW*yATAAgS<+au7wtvpWaixAdHVk za|OGlJl`O}tQC3sQvDhVN$nP%ftS%ubnj(QHJ`eMxc4T5EYS$sM6A(Y{~*R7?PnRv zY6$%|x#fCBz}S{FK~{IC1jv~H)$gQl`-3HtgnAl9V*!XNa-`_RSSX0zA*evLIfFGSq#PEwaefb~VA47<}BfrY5| z^QUfSsKA)<)$%v})N>(IjOD-j@->!M9$zS>J>6oXKaNArN9=Nwjs9wdita`B>U`v( zp7Lfq*0lWt$`9c|*N_lE8>p0wkM=fhP{PJ%V5~_TX+~E4P-n$N$E%E_ao52V`|x@^ zkj#`%NtXSlQZdU$D&ivpS?9U>ps6_3T$M?llJKStHd`-e{{;scZc-d>MNzz z6Ej8W;_V=+$dwGM%ZL{B=L+(OV8ngK?PA~>?#|NK7m1`vwraMgg+;BKIi$8`>$&7I zQgscT5f0dF`{`kfOzhlt?7B6*Rps0fOMh-=57g_rWo<2wH}r_JqHMu3R-9(5M^Ra#lLwiCV=yn6 zspW+t23FJpa?agomw$__3R zVCY>CitJMze=rI$=>3bKUr2=-T%UW60p3fpB1F&irW_S9(l+cJBz%Rg%nR?LT(3M< zul%vNZ!x83X(s!obF%d((FEyg2o>5H-$q)|*#4Ut1?%tcs5g4bGx7zG8wvW-)i0FU zNjxWr8wo~ikl3_R;IGO!AenJ8gE;~tR3RV7FMQ{08gA<|dvSA`NGp5Y54xqNN=3$V zD@(b3E?evJys{~_RABX?obL6zWo68>B?IMW$r;9~LUJ6ph7-y8lyV>=MGaJ!RBstu z;fOb-^Yj1%^x;#dYRhEOf(W|St=lXts#YhhO!J+^-kN+QXSticG&^k?S%SWH{Vz)* z@ctOdh{s&2Mo2o_E~U6l5oTMn1*Zmcg>BT}2AePTITcmRH6lgkPvnpt2m7iN;ofMo zyhdNs($_RD;cTxPRY{ctJ<$BvEd8l`3B)uVm291O=+d{TW+ii0jDMzgpWzVn+B)No zB;_r{B}+{6$_9EH_-i8&&sbKTo^TFK*C@gjsRPr=Q}5Z@edt#Y6KqEo zj5;*G^%@7=)oAaNFnlO6Kt#{!S;w!N?WzY^JnAmSyXdwhest z4W?-HE{yCLZXA+X0v%uLI-O+m+GY#9dsB};;F#w}xAc0j-n4E)=q0poVjZ#BMoOa6 zF~L>JM|a=7NH|+_KZ}Iq;(z?v7cMZ&>Xo*vHL_;Xz>DcS%WEQN{DC>ER2#MQBGiVQ zAtS+|?M&<8mlxy6TDei8QFQL?VBzZ*NvKJy0q^glg&1Y?Dv|h=sl7*m;c@y97%--k zi^PpI4qXrMa{b|G%v8ZFp@I|k_IE-F+g`1S+Re+hO6MIp61$qrg-aFScHKi#A-kTt%U5h5?zsX^rCLi40qwL?#3g{?-VQNO~%bmfqBj zvN57B4=;Y?AVVBLKo!jdN{xxZl77c5m}%+we&sORa~%7BR>a_pn@WD{3pu6OL%J@G zwk7kb+S(F!rn;BxnOz;d5UZP4W-(V8a^SBfhJFLpg*^ zKu-u7+alZRpML_icP51SnOG%=T7{I*7=M8qBw~ zwJV>ay5)JjuR&n*8dl4}9|a-e0n;?Hwp;~tIzt8!~B+d3uBlj>21fy z-iIDm?L`p4!847CLd5h_LKGM4qX*RY!<0BSh%wdxKimf?AM?9uFyJ;)iU5wiBhY3A z@8Of~7Y`zc5J15|5r+g}si-#xps58kjlk)4j$`eeb%rl1rdUHl04<3{Fkn4hH?~8v zd@hH0=`VeKHM=Vt!TRePsQ`sD_vrVLoqgJ&yu_jxr3$bTeq_C7+tkVM`!~fV{ncX5^{@f@K#MZ8_?x9q z_a_8tes3;Tv0lH6A66q8hF}z zUOLqZMh9a%e>OKZ_^#^={!Zpj$ocVLAQd zC^AIZ%Rhv?0&Sb(_#^kPnV{O+@w|Bzp~`a{0sK=GSMb_v+cgvajiik|$u#5*%U1qL zL^cLV?GpK*nZwsDZHC+(zItf^AMW=E-dK@wn~r}VRpEKP-%12{{Bc12sxwEZwd2uM zJoNsdv@1g=PehBOwXAAVBoc-JR)U;1Ax0GiR%n~ekDPo*$jid?bny>>VOEg)$h6DV zzKW*LW^%?gm3%G_NMb^bsg9l(J4GZd-HToUC>>dRQlY0)(&bHSwU#)K<{IU04Z~NL zvxd{-aljJqeVJDz^NBJ|C3KYR@)uawcA09a1Z|h}nRc;5Me}G=YK~11H4xz;N<*wd zRzAbMSN!I=q1cW3m}S=D5)EOQ{L4y{1pK4TK)J5Co2x{seOwz~>lj&t>UYyU_~$A$ z-x?d#s0HPPxaHC2-*Ls-9Dvpkz|7ds)MR)`)DV%A7`}8qZ5HtsFfJ^Oz-(THOr{Sn zKSvF+_@XsT;g?}p<>vU<=(YT!T!j~XaYiS#Xh|oLr_Wvt;EQ4H4zEFRv4JBM-n!YL zIx6hlj%lGpX*^?@Os3t%_!FZm3bHnql`X5g|)ktUXJ!^l8a00gk-~wS#&>z5HkXHRoo?@#A#C=aMPbQA#Mg-VC0x;aX zM)ptxos=LU!ZE#9x3Kd)7b(xrS%o^MiFHWmDId3+?DG)V4mACRXsv=?xD%mgdM6in z6?Pz%@t8`Uwsj%Y;xW4bwzr*B`_Tf}0KtIdLM|61W~A}wuQAF%*J}R*Bun44XpnQH zaO6?eH*gOKmPkjA7WRT8WgfUd0c-j|?fr1M{=i8)(!O}MK7UxTnAmpv@!M*QDE~tC z34FS7RX~JAv#}hg0;L$x;J5oS9H^MJD!{t8ls}@`s$>Jo%kdv z;{TE~(Kl@87cvl{q5ETt`bv1bWaaR>Y1JA)>=EfG=`#_l844u$64Hj5cqi9ZTzq@J zPyr7D0rfr;)Tx*C=;|Xt)nd1tkRZ>}0lv=)l_2N%+*L^}5q#*95I{!wT&WYclP+&J zG0VoFUqFSCV52D3u+4(eX}h`G3FXcKKaay^_^zv4wP1e2D4j%pzZ2ch;{;Ps=M|qI zJw}=?kxMIOK2ePPO$PQWjgNBJ7Vkq}I+D>&)xXx_vikbLaD>b?8g7xH!$xnlNOnj3 z{6pOtur*j8p-e!OX^zrsgO%`=o_jWHA%X^F2J=a>zCPKO?w049^U}|G<{m;Zs!JSd z9^d{W4^qjmM`Uexwe>=R&kp|^k8c%2K&Z^YQvEXj*}LYU1n)S&{_y{S$0G$HARwk= zAOW{0${1e(FDS+$vLXlwRgqZtK%obMnErp`@r?vCdWGmOdEaGlMf)+Ruof1wnxU*x z-H0iWBVH7Wi2%R;UVUmoCZ)15CMg_JwgyYCm)k2B(#et=bG0LL@3=-BQ@G{`bAl0( zalOwG@KHw>cD#@rN0Pcz_0r9a#th0hA8%&^m)hn^H4bzmJu5iPjc}@s9vp{Y4JXSY zz5zkp*sbit9&lGDqS2BeKM{d7sren$MLAQ=vQQwD^SP_a*G%BrEqj*XSI7A z&zA%KUQqm7Ur-GS+L0v}YDA#dk@!i_JDn4Lzu)9Lk75S=%Zspbd#4QiYwUV#;bD(4 zmpSZ{3wrxq#38;?mNUIse)Lkow2Y1&-#{cn{bMZO{0_RVHAlM_T1}9iZuE!0><&Dq z!N>&y_TQId(EHrCeu?W=clT5*uKlbKN25hTL>j>hGBt8TL3BnM;TBi&0u{n~QX&YU zo@9z>zGV}ie8)>Ly6OX0;pO&&(zA`8TJVm=)bCBIE2Yt|4zXVnI<$K(_9=8RSGL4i{b6v7plNO9wG6O(7p9!HN_$L@yOG-6MN_xcZc31gODZE2-*n6UMIsXU$W3Xt>(0W zcgsU+;|1y_2+wODYlR*bL5Zt+Ow0S9HFp=D)#p5ZANC=PcZ>d2DNH2jV$h@~+ zBKaiNXb;QOY6w;_#x0F>ROhZ=%Bm|9#@OInTbw)kXr6=NYgF1$j;mM3xz*tClEp7> z?9p>}!V@+==Lyl+@HFyd>~T9Pfp@anWu#~eUd!j4EE_hh{przk12Zhc?0=mK1CQ<1 zyctyHAE}=su4(I9lal^D7P%zHuT-eOBgMmd5lYF-B=43bjKP3K7W%i-_^t;ig73iR z@5t^sWVCTrYa%0FItdECEL$qQ)jFc=Q=si1y+%d)_n~FJM*1YYQh&oz-_UkD>K*I3 zPG?hUP9W&#OYA)LEA8GfGxgMnQbG2Wz zXs@dm2y&zZ&8Kq?)t{}*%|RZ!fP;POG7ZGdVUxs`p#@e=muE~3+D%*WQdAc0&OR6^ z<-$wYbLn+9eMJYf6p!n5JFRtBdA%9#BlXqP+jt&elG_1!Eq(E&hsR)+=jqGB1|GF1 z^1HwmNc?!~?FSVK=u>Htj)NuQ5(y>#0b2Gf)*zM8;47(d8kkmV~ zg^Vut(#nD35M^h*-qzjq`;lg&#{F%41-ncb4+>Hi$`6W6smgSemo>pCe%M6rRXgUM z9XorT%djTMiStd;N}T-l%DKwg_KLWtQOoUYfy=ggyYaCxi7h!q#xvKZ7a6+4vSh!{ zlp^dj6WLQ$o|y7QEXX;TX&Y#D8@#OI=zesH|KZLS;_&=Kg$Mv{mQ%DX#`?L#igZ(L3$ zS*}+e3Ixyn!yX%Vn#VYdgclR*i($zsSL^kO%(}JJ2dOQNX$}Y5IRy_jW!>$hTqy%# zBN2)GCoPI}w`Il|F6SjB4W1so_5BG}@Qb4~oY9j;N2~s`gT<31XgyeS>8JT&?-6Q( zMf+`b_*};Mr;^On0s^Fyx+}GR%ncb+nSIO(}zPFo>dUwYJ04R@z|fq;$>$EVD;8C9-EPvjK_r zUnN3~aKor6B}}W>h^>BeUW;kt4h}xc5$yV{Om6b6SxLPKmg?F(+FWuF#@`~> zQ3C^B##(LX_8RIgLz{4dSfa&PVR*cBMpbL(FyjQv$9vkIZws=yW51Q_mwyyhp5-5m z*{rT|?1as2r{120ePq3cJiO8;jMaCw(`ne@1!`4N4E4`^+ckdPsHUS+?*& z+GA5X3HeFV<>!s$z&C1c)voIy$LI0(?ic09k;@D2`()4p#$zE%sp~z*V?N8Zc!Pq+ z9)5$X_dn^3JgLxom+N;w*oZIabb5dlfnE=_t6z5Mjd#Z5UUgdWiZf2HHk~ykG0u26 z3!7?pU8{1CV^%lUy6I+diLY+cCtRf@WewdCMcE$t1X+6PW4`tFe8t+=9o_alHx`32 zp)Kw@ewfSk@u%T9J9artU{VI9dr=$NR7`gj9Eu;N2r-m1Tn~SnNj&?$Q4MQm(VTD} ztuALj-WR$YJ&rlv71Fc0p672CZUxT;LY96Eb95v^#l(_XgM;MZ!7>LOeT+TJw|{-) zs?fFWT~}qvhRSVa8O!N#)SdgJQu5O(P5b73A99=~-n}fhXJQfQP%|e%54lT5%o5W~?!HHChex z+{Ly1#=?ajR=3 z=(c@wmvMX~umKzY!{2-UST`kmq&0TpbWzgbKqYYI=^$`-;i9$Havj3{B|XpZr#n>V zeu4e0vgX{#8AZP%gJ5n=iWupoLWbAtyfNKbPFPjn3;B6f!pBkErFOqW;hDz6tUf>V z=CP&<*hO4;OaixDV*%@3dEcoti9!4^c}=DJ<_s_cr38Iue~)`wBpki4l!i5vvXj1Q zGj=!{$88s4InQ8aqRZ9qF+4z~{EfQ-YVERAN82#Mmu1jgF{)y4?IFS@I2U0ErD(VI!0TSIW5VV)G2E%UvHuLq+AL4;?|@W$N_02d z1Y(evEL6C~*kB}2{+n4VltPvbswu9c(^B35=tv5#y%sF~wt5{50b+`tY8}5ip z9t@J%_SKFF)Vudpr4&%Weyj99Ko=wzc#|pzlPdx5HMnA)-AHS=KQz#!qQQ80eIM{~ zfZo+qx2EYl@UsnGkyf@Ckpi)7?0nE*IAu_yTCO$!WrnVcBMkSfxO1pTtPhFo(X4Vh z3R(`|6U<#bjo70W9iSh5X!(_U_b2P}1luGuN;+@v z2UPCWMRFTq6$s6;+uLu1%!CI=a*S%v@NBH5$58AN+v<+7GPp$O%-UW|mPa?(-FL=% z?%~xyKez=4J%&p?=^)p>fD>kU`fxx23u=^Xf|n#*; znc_W2j3AbTG;Qy$>Ij`R*?4~6*{qg3n4GiZ&S+X8JV$?Ql^2TgGCV^X2ZFNG4YhLC$3ECZBQ9PIj!bj8H*Xy|RYsQbnVxF}t z^YjO_Cmk`a}1jwr}70y<AfT zN_4o4zZXVQ5Dpda)L$Y~UOGu%@E9vaWMFA(HJIp4!$Nm3grsp6+ujW@DNB^LZMqBd zYzV^j39Sgvw-H%Gn`)T0E%k*~AckX@S5Yl1#I1H6H`jk#Rt3S6ZsQ~6>Hb6Fm4x$Z zp=8QJ4Sg%amy;Fzff=VGbF1@@p_i~!dH>>G{*^>w=iZ3h`!QWSNcq8TB)yI#>MDJY zp=m{88@(}qXo`mn`3=TDYoHJBDAD#O&K*KsvwLvVzQKzgc(dfkjNO`z54+oPD0bnH z>#O$1^mJ-M$2P!AT1&VbNrd6!$!sP|y5tK@Cbl-)EaZegDO| zufylwN3PgyIBOB=tT^<~SdlL#$Q(CrR7Wh)+A#|_F5R;)UpMHSKU^_H-W>T|Km4H% zT;feSi!b}$KXNrD6hd4>y=}VQ@WztWwSobQg8z#{SLGJW$BJ-~P;Y#)jY>WAD)>+8 z(gGX2WbO*Xu>Ko-ef2)DO+@qF658}wCG6~RBiTXEczh?{>hYik9eoSoz7oD0-i{~k zu#us7BgXO8VCS#e($!)?<9@=*bheIkdatXK4A+xd#(li%{%HF+qx68>FP5Rk%zMoy z;&WR#exbLuDs8la%dX4FZ4|8y*8?rCfvdBe7k3ez2?DFMMlC7>@7Ckmgrifg)om?p z;SZBJx*6{IjqG0RmQ;rpbf&{ zmDa;wnJw3$e?BkPE&j#wG-0sq8ybamTkXGmWa#=U?ZJ0Z4;@Vz<%i>z!`gs}crN^p z8~$_m_DA_0>r<-4WbUo!#;4@3;?P$D5m0I={|pmj1mM0bzx{RD($8F*QRloCQXYJ5 zFW*|hx)uW^T3K~}K!$EmSfoCDADc&aiRkDsp8lPF%>o<-_cJ{Us~JsqNytQhwfxYR zeK7wOu0zK{I@qf523emIc6rce*}m7sbWUs4WVjxGi?_I~JJ0oaf91TvZ^hSk9#ExK z!LL(l5W4qcC+-BwX0yux6!tz0`W~jrtU`rN3H1r(2Y_iH(EM=EHX|`jPH$}gAoIW%fa;0%ERu@ zhOu_@9bU&1Qpf9Zo9jb9+uQOfp(^u3S_g^_x9dXJW(mflSE2LWgoot!rwwJqDW#!@ zx(Ppwe~!Fcmus0z_uM=w=W*!1Q1%qw$*HJIZ#xaJ<*JWZa)LL`RS4TEADC*DleHMm zo?1>x*2$7hIP~Iby??Rf)cHr(efsVySf6T{)~J6(bQmtZ5E!yx1DHRJYuc7Me^Aqp zRl5bE)Fiu(M4bP_-gkyY(JTuuu#!Y_Mr6rJfn~|4EK#!LBnSe#WKcj5$)HFEiAzv| zfPk0)QKD%IRvr z?#&X!b6wmd9QBh)e)8D8_@E3_Sa<|^^}+}L*{$~)LGw=>tZX?}mh>FFLViyMaGb4M z|H<&hiyal(`*l4hv9{P_a;t`JWhkkk%wsKK;fBro)6UZZZp$5Sy0-+)33>wdXX{xS zhJQ^rZ8vQ6v52uQy()4Tu$ISmrag8m$!(Y}Pd%UOJ^t_k`^vk?x6iYJ2wq}b>+Qw7 zA*iKRbFrg;a(rku`z<5?{FIvW5*?ng5;)P7S?^p9~G?p3Hkm4-Z_Slt6K!F`<9y}as$fmb$Q~p zD~IV;#vl4GUYTmCbb z2&-Ga*-j|QEqv$7RhV2n%l4x&wPMjaXsgEdq2(6l(reRaxaR4HO>TrPRTa;n{_XFy zfwLbmXK!7yUYyUNA(mWkg(?qXc($P32YzHM2@(0Errp#Dn(S;IV|&uYsc*ZJ&1FB)XO(hjWT>#@@Cc2|tG^hr_8YtUWTkL1W)u#E zR4D15X`d_)hlQ6=kn6MSd_o`$ykVf*ypUo!v^7; z#|@MgScMnIQ~f%-ujAZCVY3!nAJ2Sfp!a>Z^hetAQ~-vMnLucZI)B01_C z^ZJrKT<~?wRIL0hNByA681H~68Cv5O0vE>FeUMr!T~)R+>Gl@OowcZ2N1AvRByKC| z3=R$no^jDd_+E@*S8EuNb2ZW43~8XgGhM%A%SrEaLSI?Z+!VXSg+d*>m4i-k4xxzr3R@Ps$y{rbaXGJh>`Zc z5@#fX#Y56E=SNfYf4Z7_2mPo$c}_h;2GKsT+#D~0m9Xl|JjNy&aOvW^ORlJDM3&NW z$#LUCs!Mzvw;$TV1gow)~MNo+L(B{N1IM=?oY%TZ+rrfOJ zc8#=T$?BL=;*vwSuQfeh5-$x;r@t6SiF<9}2{#5RbQRr~-BNY0m$(+{#mYZ!b;;2q zOe%8J;mfH!ZW!eT=RA*Esc>g=$G^=&A8F2Q@8qY6W{Y}{KPr$|)tM*tfrPJD_h_dc zQ&lfH!##~@j=MoT1tg~BbO>yzTN9^-7!x@%ZmdY*Th<>Z3@`Rpg6e27dC@|~sQ8}( zpNa^9h^ANYGvS}UPv$(;qCScgq`XD0&913o6I1n}G|Sn(7$3^gW^nBj_u%)dDCX3X ztuv!Iq=#bljP_-mDsOYH*zBE8WtcTGb&BjZXsdt74@l$e^+qXPiE4U9wlC6l3iC3nJ z&I&y=FKnVIE-zb)z~_qnxZ`e5?Lla%R>dD5vy7$y@emMZE5(I1uE!P6$BKscs_sVf zsp-*#>O(uwurL)6231K{HrtCNMrX;u!d=N7M~$uY{NzPJM1eURj@*>FnVEhsdBt%U zZ*d_?{z(KpLRMWai%Q{Lu%NGl&$yu^rrVqlb1p5?GInMJ6TIV=bW-re$-CxLgxuG+_FSfREEqe-VEp}Zxph=g_R}ycCfh^E`WKN|Z3DNf zIQh#8*DPH~o!$tt_OdfvYI{0~Kgp*-u1_DK%3z=Ikj{Q%(_t%^FuGXuQvNYjCu``J zcN>jk9DEFEZ8DeQ`I0RO1*ug%;@L4MYyeWnOnJqgx;bU7U;chN14F#Hmy3M{m&Ujg z0fYs9`uFvSSk9=Sa>7DeK1zCy?CNf~^znyi+c;ku!pVqdWE&t>3GaMhqRoP`j4`b6 ze>dUgT_AIr-Or#qW$TV^s+pbMuZSx&{2}QS%rfU93VI4PQhF%v@%fGQ4JaAUC>A>! zrA#`ANO{=kVB?+Z7?SC$ynbl)S2lW>S8~4bH5@C;(K1-g=G|r^$IJ1S7qoQ8E;CiV zmt9u%Lp37K7aIOa#j|ez6neZt-@%`{zV@<+O_c1$OLq&&OddJ}-4A|*==2rds~ucQ z$pOz3ux>X4vd)hw@P5gn(4@YV;z95rjIv~XIrmaU%P(0ioauz7>~D9r48nPdOKrVc z5uM4|Cj;7|GHWmR|+3|EjsP~O;7uE0fM|DMVF>t;&Z>sI} z-2~dQN`q4U9HNem&qWoiESK`!@Vl_u`N%x$NC?3-P0L-^UzL_u4IvrpU|B-=^aU^jkB11%Oq5?yj zN8CzP*l=iRlOv|bKcqJwVEQz>{lC)-og)|~z3P%V zffddfpxUX8qBBq@5WCd`7Se}4Xg9w=c06v6euHrIS98ki`1v~dA2;qUUwsi>8uN5G z&qOJ?J7|vl_IE-ix~c5#X}4Bmp|gGU^!5*eUWQW}yrxFP>NXlLuG6>5N)I_53E-Iy zUnKDjWA}sMbG?dRGu*CaXq8ny(X!5H@5%PmZ}J`IiTfNPc|*);L?=Yz!^OwWQ=Yvt zt&bRkvt_!rqLc}#1LxkHa!a`Ku2SQ^GGVbLhvj;9!H0&Us`b|3F7W}&;PxG`z*d954Yk`Qbf8#y*3@15G~(5m|~QW zLx5(i=O)ZvgAfe@v>?XK$P>vEhudqqte=Se1xpnB*(Qb7k+GN3G6~gN^y2G3y_br>g#ZZK2Geooa zbbdD2qNL#aUDrqI_TwejV>E$jfZ;BXg=PL^IU7Ho$v`8c$S^7*Ji$mtXOOm3n21fb zgX#`G9No0@pqcz!uQNQ-oWR}Ybh}R-0FjGS%`bt|`f&2ybzq|dgPF;%aPa5vu4T~l z_4($+r%cWV7QuUr}0Q7huq0WSSMR}K?pRIW&p%`j?%$(*jE zYQOHsNB=$=ebKyTvcd9>WQys1z#t$%+y>&rgPxi1uI3A_T!ltkdp@%A{O{C{%*rpA zswUO4P7JE|5xcZNqlO4M4==d=_39%U)Jdo-j!d7D7(gWW41x z^B31Qo?V_25Z`J>Cn{dvN-bnkh9Oy$)1_AU0dXk%D6|bZ-s?f)(0xvyF`uT_$TH;@ z+z{C|q?nD9aFwT*YAqU)M$;_Yr!VkUmqw89v6Yt?`IMJ;Izmdd(gk9*^&Mq-k5xp| zO?VJ7w#D7?gqw}fK7$a3gp|1t$1!dvl+sa2J1oVd2l57p-az*;OJr1beD1cS|7*T# zqvbET^Ap1*8FuH(d-}nva4c=Ib;&R04BJN%cV?wUu8Y{$y!z8{cI!vTw?O*RO~daL z1xT(#yepde3G8B)*U?tQDcZlpoHu`64=~mY^cz=2-$qj+X*g^@@ybs$&j-zx_H7Pr zK5tr`P@)WOm9@|ClEq&O1BGt8HY+>M}RHa{( z7khIU_a?=}h*{rNh6re7@P(<)$XmtpS4JcqWa=LqDUeI4g0&*~E^k^d4J_jyoURxzz7teG=qX zr`0294HCi#%#T=+Z>(d@?iWp-u_cZUK=(#lj``_!aU-?qMs};Bj zoeyE^GhtP&)`iqRL48CFv)X}nzAY&X1TB`f6*0Z0Rl_sI!?8h6{xk6ks?T_!@74gm z(lgV0frJ08`&qirM7$d^X5Q4{Jmk-M$3GSN_QkUySq$ll*i_N!Y(4}V-Qr-pk&MkD z;uZ!?(P_NfyB3B!VN+m!tsSN*(`>w8_IH!JNsC0WAU*@vS zHyl8BF|#6A+%cn4HSbq5?~CPf_IDI}YV?I8aY1Irtzwr|TmRyrgn3R;hD99ZDatW4 z0!0LbUhh~M%Abl_Dhi!ypYgQPf7yfT6r~Xb1foO1LNT~87GB<)F4S_wfS7TS6XazMjO;7qH!Opz!VgD#95X&fBINy1fVbfv#! z$REBmtA)4@Tt?eBRh4st+CtKBUq0G8*AqSysk#?-VgrsqZDt`+4p9(pCqkD6n-5pj zq#e6YYPBP!S|nO%?+G(2v_i^+^PMC|L40jj|GuywUOM|nJJ4oOc6vi5@QWl*Dmfg! z-~O|-Ano%@3bUTr0Ox4S+e}E~J^KT?8KS0f^;sCw9vqW**6SFO@GFp}wdUt{!FoT_LS< z(#)@q9dE6levz3RjbI^8vG2MlmQjg9PtXPsM`sngr)DCj0*R4Fco8m`FL#f7Q^*UX z>x5{kfpyM?{DKmh876D3ErauoR=NHsDl@RAA8o;7%sMKqf!V=$ZgU8e;lWlAd&y z6ZJ#+J(1Q0uBw}uJZBtG?p1A(m5ISAC%@?AJ0mk2nvdJc6_p75tzo|}O>HbR2cV_o zEiPj9xWU00PWCXGaCf*-OaNzhdzVJmot?8}#B_P9&nN--B)ejsg{H9gYZ?1gB){^E z5H2mai^RLL-oG=Bt0Ar};4b2LbS>hMv@Y{L#c9IW2gvsZdCg3a?}j3q8sDH2c2h?9 z{;~QPpEXm-d|xF~7jOc&3U&hF@2~{j%*%AQ#n#mb(SrnK%gke%r{j1HvT>^ZAxyH0 z;)$%nqF_I@H^W!_1DOPMJTYc!E?7qrP@77IL0uItc8)^J+fOH!VP~Tqg7-Wsi7c?f z1Bd7g3<+jqV__1uA%g*Ley@b^oj=pawS7~Zj_jJ>&ofcnFd(^!xQ=y<#xHCyyAOAM zE-o_T=T(L2UZGp{SE;iHrjho|v?aXqdy`uX58wvWCFWk@X|BNym5y3|Z1 z^6`|!X+1%9`++*))By5p^g=7=OT4G2OsbdQjPzCYK?%47FF!_F;$k`>j~45phya(b za)zeB5>%}gddK4&N?MyJe1ix*7!NGL^odH>VX#pHtbEGYeClSsoIz0qHDtwxKTi#B zGu7ccjcOE5#N?vU%EYIYnf^T*NL3uF(q>NAT~l_;?(owg#?hRd*U0SbKSO*WrYclm~+#3Eg|oF7-G zU(@->dn8t&^PP#Ax^U`mpS4)~{$|fRZGY^$oV`p_t?`R&ps}ROoQ>mRAVF5LvvYl3 zY%K}@kbXinMvijdP)I@DJA#NyBQ&^mc9h&;wX%F>qB4&aL-f$LY1_2;ZQ_#4=gRq3 zz|sYK3lLYucE#dE-%<(c=|FOJhjgl%Gi*(RzSOUU(BjU^VVZSaWye>2Aw-OvssI9Vo+m^~QL94NoEzMXu zm?uX&fBB3z57s!x%w_5?#Bo{YvUC`5WrCn;uvB@lFHyUej{?8_j6r8Gg*C?P#NL7? zfQ5Wdn$oHJI%L15soHCODd^v3qQ}|2T~Jst)ZB2aNvk{nflb*ot-%frOxNz}90TsI zjFZ7Y@%x+I5#*&P2YrH;GF)?De~*PzMPFz0DNWBp<`fXTwZj3E5JY4-`j?}2Rh1#Uf%3=9qv}rEA``asH&&E+L`tQGK_*xCxv5;w@deD z5EPo$lRCEq)G*kZ_2AH0Stkx;@3CfAKVWfKAOr(f3`%HJK}`O<91~^bE92giQu_w} z7d$Ok=1C=6Z=Z#9n+(7(L<8u&$B2pwYyacWqT9PGXuxDGP#~tORh5=ZfjZwAZ#!pv zLpnPDm0~)-&YMwpEdw>5J(0>6B}x};N1p5Mp@EM>Y^s>c*By(3*_Rw)-Elhrx)T(o z&m$J(B0Ft0>Z*EFxIv?-d~4^2h)Xu)5)K2!C9O^(d#3d(*vH*v{}xkm7-HgO&a}%j z4wF>|#8&QC26$4hn=!=Pg*N4oQEGwr`5$`^_L?!RAH}5YFkd(*JwSk|Co$}OkSq3> z>^)2I_GuB9mWG!K-+(gsU@qsX*YWH!Z{{~=mywInom3lK_zHIvzXNSFkX@H!QNV`) zTa$)(7YnZb{*7 z1D3@Qt!8y)C9n85?XL#UEu+{t zo@UIM%!++!#pX}r%XqMF@)M5-%lr(P44HN9|J}#Z$$?rk{5tYJy4Lf4-tw#_`V4Yz zS=WnmIPzwInL6RLG3hBzsY~%i6H2jH1t{%hD#1RTm*QD{sjnpuv~yEDUTQEDJ*b#R zonC#m1%zL)ghNjRQ?8@sfjc0dE3d;3H(~VYEA%DUKk+|ua!o-lT!WBaEu&8v-avk3 zQPF$RrAu@v;@w+}x2?gFmf3A|1oWDkM&@S4e9zoV!<^^#CCvof6bBKKJ6|sR)57zi z7~s@2595pmjdch}GyQsTDx_$CS1T2~k}f(M<0^^2KJ`1y<364Zkc6Vt^I%dTixw?zeTy5CrekZ5(Rq0}+hZZaeN+ z*Mg4chEI=`fg|Hb-&hW_!{G36gT-iB)l(R~5tnqo1hB~;Rm_=qh$f4BNuuGrO52l- z9>3GnP~~(&yS>3O&b3@7wVZ&v^X-J#O7J&_2Q??W{m9`Inz4f%dYE{3BI8=WzBUf~ zV+Kn0W_N8;7|5TQC-&A^Vtj#B8!{C10E!6SGxRtc|+kt+iC&eJk2E8$#NMblelx zAi65%ev<$JX4v~be`U6zFuRXA5z zuYyR=dGew;9wP5#>ONMq5h0!C&N3UCuv{^FlmXZyb+Rc1f1UPk{K=(G3m2EZi!YQ{ zOi}@V2slvrQbc&`N+vm*DQJna3eXKl0r?`(y?uDp?Hl!UFGfLY?}*l@22|p zAMrvHSwAND@!gF5;blv9X!$d7rs>R)BSk;d)hDAh|ffhyNPYY?nXrt}`_D6)JaQ(_eY1`c$rK^l7Nf&2Y0x2&AbODAMy z=J6rD9wi30uycE|9DNeS^;qKJhA~f}7XocV+;rw@^T)x8u2PXK z2K;e~@~F4a)cG4cxNxJWRV>`Viw$_q0>7o+??-;}d5Ef-34b0&q+vBG0TuV;gmT{2 z3#ns?4H>ktgshw1`5JqQ)8HnW5I@Lv;b&vgU{2^$9J@*lrUh4h9|6Ek2$~Q}Oi6)H&REp0r`eVpNXZ=7!<3tgJilRW?)Q?@i6=Wn?xm%#4JtbuWP z(4pmccexpI*905Hq5G;oNF*Q~9;CY&GeMh;C!|v*otdq`Pm95+k9@}Ra$H>5bJWl$ zh>?efMw7C+{)n6@Rw;Y`9W0ns`bCTmv@(=%RWu=ZD#FY~sBcij|s;sJtk8;Rr zxoE$rbsOCDx|o+%qP~I|?!&-Pu6JJ=;GU+vo`!>BS%*ZOV{Xp^w>`|n`EGm_zS;()Y>kibXgLZ!&~6bu6>kUD-*9= z4Rtsjo1F;6e~4ecj63|QekOR2&)WULg^5)rOKzlMQ@m9L^>0RGZv?j;JpgmfS-PeU zd3?jXMH5Ej-Yl)yVF|TQY3Q$^fu;y)DkPjt3l+m#pZ00)F1>*px!2LuK_K9myv{q) z5SNkn853Ui&ztl_yB`aO6o7`3TLP{BV1gCO{bSut9slZT&*(ahoQ_Syz-K|8`qqQf z>{S5?>GWB8i0SvoI>n%^LP#&O0SPiNxZB8Yh*ID*T#DyKe3oE>bDwowNBOAzFHh!< zDL>)O8O3meqrpbt9Kf2GfNO+1v;O3!o#kA@e&wl#wl-Sf#q&6}Du3l1viQEcoW@44 z$?-z9)Tq{>Q9-N)s_U^_dneAP*5K9&x^E6$k1yP0giliR1w5EHuy?2law}8S#h*l6 z!du^9KFemxYcM?5J{pTAluLKGt^nT@rDRVO9!v2kgCkeUT$Hry{EmAsdMxeU0xTCq z?V<|982gykYc!4#N`U* zZAKtpcq#~W+7Y5d3lwASW?|ewNxu81P_ml5Mg3;)`jtcDiDi*lT zt>e=Zw`W4lWb8}cf(Ya~^i26NW{id_2!71RW+FSkYNqj!gs+i>U^ER@RdL9<^N|5l zT)WR|2fif;_hb@uwL#cpx}6jQf`phhjj%T%0kun858dy#Hr(0O@}(&-j+88^9H#*R zooiqxl^*Gx+L`(K$WAbbs8eo?XLrFE@Dt&W0*$hG@vLhd6sf9h2a$mg6%ZK!PN~nO z`#Qa8yNUr|RJ=`FRkCqhY#1mjb9o___mx_f!Nl%uzxwIM4EwyQrzUsxG`rci4rB943t!8Q$N__XU}sP=0geQCu~(J%cQ7J=0S?vpMWum{gAf%GLhl>i8wNcn zYIzC_{L1Nw9ZQTp1b>zyqU11LQdSqh4p>b|I#qWW)jr1?mTqhb&X(?z?P?GM8E~lU zD$D_%VQvCK$IPn$rfhJYJPp!6)AZR{O?T~D2=TS^gDFjo*K@z9z(hOj9Je#6_>Cv_ zW|$7PRekcSVx#TK{8D@0a^v%FeCu} zJ)ubFid;6I5bqr@eCyGCcSn{&gEHWl1z0~yal%;W?y6^Po)^a@(v@g^M63nWfi0;m zQXVYwRJE)G!zp_fF3Kd9%CqYhf&YQ+nA*;zn{E7AQa}>u&Z#5qExsI-DL|3xU#GS% zyU4}>`6*zbER)-1n=Hf3MXX!YAe;@#gE&uBV%URnju|lXmy%`Fvm} z5qW~vht#=_D+L@jwyadlr?iNVoMT$Q5tfNgOUe?}sbQ!I(~6K3umVo_{ilh6H4twG zaaMN`v_dz~@hJgjHI7V=2ndSyB4;SJm_dXvASbHG%@nx^B8Qiu(BZTSDaJ+twthSj zX5STe0$fF6GrRMWj0#uduS&c%KFO8tOkszRGT-uZ{TWx!rVEMIRzgF*D=7rvP4#oU?EnTz0R-aSF%L*NKn+tcb(4 zIn~r0yUchpXHs~^pe)L%btKal8@+S%0eI)SO`Y>T94$%U!mzE3U^-6oP|dTsiR zUq75S9X(XS+Z`0>oLI(<{rv#hOXNKd%ckyGr~h6ut=%^V6I3B(BV!O2`{H6e@R+M? ztCX2Dpu_`J+zM$*zQh3nkV|uk2PCAmg{k8Bo6bfy!>P$tAR*&q%LXeT`K-{x$kLC{0t1Y zCDSG+UKrm_*Chzu-Z`fEIq=nKBNVS9jtpE(Nf}I82vX&S&dS4Ja1#XWtk**GeBEGe zPL|T%yAlI%UD~PvCiL{)n-u4PHvhH%Qb9D#-mFxzm2&rO4d}2OdiesNqXbeOEr|n^n zYL|Ksxf)nIby`|7Ds89FsZsaqqHH~@yFa-m5I%emU&ITB20UN8lGF5*x$*L+ z&B7uqgKmx}{^-wzvmvztCwz=2-mD?gMOfFy&uQ`y@Z=>mFT9_v6Wib(lP;j$ycMs)pF z@Gm^eWmehh7w-gO`^Ub7#T|_D$f0B_8hhLdJR)Fvvw95Y`;jrwr zC3#-?vN^5n&|PEOn4`2lu~D3377nMGxDI7Lui>f;J6|OH5>8SGVg3@5jljO|ToOpk zGiZ0p#_hdHl+B>Y?9)kP7_=+Mz{8{U$*PuT*_Bm9IEYQf>fh6htQRVDF`>;j8k zy<33Za#XYKIu)pT8HK?3rK7X>fuqv&FS#3*Fq|o`1OK&%AXyfHSaRW0-H5#F>*_Vni30t?N zH?o?(&%b2p+Gb|K#~587_x6^+EM0k5sA_fFWhIr`g=_oO*_%z{i43*c4DXCO(ZUPd zWy^UdyoZdOf7&KFRQ7t-)C&BKT#)|pCqAK@|DXO(aexN)m86sr1|x#akO%?F!P zPqcd%C?5iKl;DECRzm_VB5;8pA{y8-i8iPdhqcmBfhq~uI~w>NoCelU7PQmwDGm4} z4$K7R0`q`jU_LMeOdsU_AUA?}fw~JYPXJ#llH9pUQzT)zHzi>|*m5kOoE*R)Trlv$ z5G`yMmom&7V7mZw2eAJoF7WhST&iFUmv``C!0-OpVE>bGAtm;3>A}F)wP1Q+Y@RR& zm@~i(19blPaRIxHME?to2$(6r=K?T#!5jhSpeGmutp7E?04^RFtcV8UUl+rO1S&VwKVPX}omwwps`7#hs} zu3T(yFG5AwHh^z$vqD88Z~@Ul5P_~x0%bJuZV#wzM`8yF(@uRDJPbS&n(4!E0;r{d z!M@{nprqgPL2vM-M;Hpg>%b)mE(jqsR;Wx0E+DKh2mwSLB&|T0cXA-SJ2^BSsGc2M zP`{&l_s8~f#9j_qwgczeyBFBYp;ZArM+96)z;zs45I%^DP`$+7Js9_n#M15EGwkI| zdpXNq&bF6x?B$$$IoDp!y_fUu<@|fO;9f4gmy7P@C-!o2kVEt#_wK1d4vh~QGsH7! zl|uR9y&Rfz=$>LPhol9%hj2hS)ECMjTA>``F_c471Le^4L-|7((f4PdU=Jhv4)KnZ zl%BV16#qFpPk*(&znx;NtVLUOM&#$2E#uX=ZP+(}7-|dk zfzn@XFBpz*2U>Pr&TCsh9#)k8wG9(Gx7#)u8uUN4J$H^}k?(2dq~9MiiI-;1A=|KK z>D{)^><_lB|NU+w5|P@^^{uJ4Dg0}^YR|{H9-sL*)8SBB+qWe#vkgn%8^a;ZgKbBUkB2`@KUY0M#hXe4 z!eHC5Bp_f=tL)%|ZU5y@aKpI3Uu#0s>qvnYPN~Ufs7LogDE1Xg|RO|Q?v~hCmMEaX>T2pL#-kB zDp;CauhV(JGXyGc2p3+3;Xxz`phV7pq5eZ`K)!o1)+kLkldf`Z95166x2o7CJ9sr zrHi1je-B|rgLTLSBm1WzbAx(l$ou(gk^2@D36VpPfozQ!Chh~nJ~(79*!B)<0hi#= z65mhY9;ni21`6;n8dxj?q&9#OrGci&cITe~%mA2X<3_w0PMq# z9)Ll1U?0YD00!BLeHh{Z46Q2B zA9yb0bL_)N4!|J$zYp74b>Mzq-XLAK4?A?AALK9W!$=RnAfIL*Ms@%O`4{^zNJ;Oe zUHTBHtuiSrwQ6A{W^EcQ&U-xN%{Fi;4R0sO;{S9_dz9D~SzaRC1egc1k(HwvY z{tfn*ya~Zyfdy)yLjvpu>5iV^hM7Gedkw4;tPEga0LJQ^s+XrP#?#l($42am zhdZJWPArtat!r~YdR+G~rN4Uto#v7B;sdVZAL;$Rp!(hGGdSl#u#KoZB|G!TDuda-Lru$k_C*><>okT3s z{_-?F6|LEOUhRANPoe?e%}5ve6w~?P9EZaZZw4&^>hz{{eBwqr zEd1>Kmrf!z$Lb^OPFgS3=*qntMIJaN8w>r4OyV(gH|arb-bpiDm9i(~3g+YvT&I(7 z>(NTuh~aFrxxI+Nq4KRInu`r-#X6bQPObNCKM=6r+Pek-}(j!G= zq)CC14(NePBbQvN?H*Ac4yYL`K6&YEfX_Wf^SPc9=bVeAcYJ(QqCL(OJUfN6{JQWH zYxvQlma6F7T3~NFU-%c!nDJE7zL?uDWy>QFh1DCiXAT>l%YfnwlsFI z?_`LbyKOMb+q)%@ZD)ZZxQA*oGBW9=QaWRw|2W@+kY+u0|SJCC&OO6 zc<~?GK`3AHao%_Ml)kAcikOMTqg>LO?|@abaM~&w%J7LVz+ch|59u zJcu4*s2?$mbr1f1Css%d1Q~+Y!)OnM!65{Q|1wGmdBRYFaQ(Y6KszO941k3HQIzt3 z5*vkfhW|`CwD0-fJkpHxYwqY}miS!umHX zjDN#I|2HhOf5QUpFL~iTqz65Cq4)N!>i|{{1_kXG|BdoWORo2PEkUKeO8lEl*^RDk z#(?qq0#&ekFx3nhExpI#{=hrKxJaoA-!Xr0<*aIw-tR6lckoe`De zOYi-w3q2+O4 zKlz>V_=S)wK*0YX^(-l5i}oLmIox5|4QbS_UOI>Ac<@|d(ks*A8{Xd7e|cV1s`9`Ki?oBLq4Ca zmzX2L7`B>zm2A=@T_BlDlTk7|%hl|TtCSMi#b~XstdZ{BXX|D;uSTA~Q-7>jaHi@K zJ)%f&$mJfnUzQzJ(8=ek>zEe7Zse0=6fB0Xf*hYOAmSb&veezb-Kigr%eZlz8<}$< zTVnhUKiyZy<&Azh&bBWcwMA+c5{DRg=kHukn<*V(ei?zcXwWly^~nPFomFQowR;$q zm}fVOtGT7`)RTA#pDdrZ=o3O8Wr!Z-f2pdABM5xHW>4`{oY_#stg3jEkm1c^#~$qW zIYVG}iAO6Y&_&8`Y zb4GH$Pwo5LGM1KMp(y_4+b1pGYsGU9^=gvF9X@)-m*OyWhWVox*0h|*2Hk`UjT@-y zJR`p$d}A|}-@Em2UejNa{JL?ZF0x1XJn0C!AP)KbTHiUf`+k#aR23JfGrn9oPjZh+hb}@$ zRKZIjTcBzx1LibXG3*l+>ww21dQQ9EZ))AbHC1z}&R*;I{eb%{SJ%tO)z0f*H}8sP z)lWCn-ZQG|st@2D*u*u+4&PI3O&a=zt?9_Ibh{y2HE?@0_pN_;h|<}yrHuz0!GZgG6ztA25cH<-TWZ&Y%&9_uFOmPIrNIO2zv2f3S?#dL3xlv-gI?7tLuh550T zk6xA$X4f8|7Q7r-r&s0T-6un~@W?=@_UiKwd^4P*@?YzlyYxMHojtMxYE6#VttfG( za{Xg{|FiRXQ00SWe@p+y0338e4{E}{dW!(v_&2?Hu;W49@>fSXUg7)H6%4>Fn%Vj39y`z*-m_v(oulMKSiso<1H9~46YrbVJKSXkr7LpOG;@pI4> z4$gXrV05r;@XH2M0*aIz7WNwQub+c5F*vQqfHP=caPIC2a{_1Y&`C6i;)6uH^Yk#H zM?^i025=e}-QFl)AKv%Ki9kyl*pcrhJMHs!;_f>|SSbwx6ja?^9NZATUI>h%i!WkV zUn6{7eBCh!A86kNP6BBlu5j;mf|c)_Rzr7S+CYLR76Zk7ib?h;hR(G#0eqig*z=Ev z{9 zeoLC()I1?6WBh}`^km2lGLAJ7x3H}z7qW82<)+Us_o}&RHrVTS%VCbV@aRlDw=SyP z;;6LHw_bZtmEA7mo#Wsol~>XAHsA%C?YHgLW{Tp=sXsTey#Q1G)yF}O*j{)CAW48- z2VA+La%{cxgzL?T)_J_47Jp^_1tdbR9Y@1U$x?N+c{aycB0yHcl@s z{(34=mQ{Hrk#s=saBLyw%Y@yhxgd++u#||mpYb=TK5E&GH9lX^m%31PMskC%+^CS1 zRYxn&Dvnb)Un*BuS(#{@E;`}PZhSY=%;q&cTmYmo+PtDXZyEqa5i)v z|Crh0-ScsEw5ibb&HF2bwMG&&CRERkcT4ns?E8X#{_DZ^OgbGyu=yXAE!}%R-&C+j z`#~|6e>G8};H% znYDV{4?hd13w-OOUC7hVSeB9|zP@prt^HD+P;BA1xKoTbP)?psr-M&dYs^>EBvfVP z2C?cCczkYeX>wein_il=ilt3Ik$%a{X}L6VD`@k#e_oyXSNO5vM_(l^-+VZsamS#q z&h&HSTy?X}RM0)1#6Ot60M6wZ&YfOe4Cro&vo zQ;@s(oyLm~*-&XG7wBF!Ng*+<$3&;~Rvq?s8gXzS6tjI|O=#?k|KPNYJ$(!H>011W zr+R(oaV4F6l{)Ja-F+fTgDF#`?5U1$=i^@*%4ts)HZd|E%}*^2E&V5JW(pU1`~7roraPRqUa zDRw8imxagiEpd;lb$%JrZ!Wg+KO}s6$kS&{Z{5>5H##HOd(P_e#^Q$HjJIO3R5BgI zxWciQ>?|eMJQfJoP!E`kAKbp_#Qw8Q!q8+gmAEa^A#rm1yT0{Xk>``X%2%*NV(ZTz z^OvTpW6r;r(4Y+aSQ>OB-dfyo@J-SE{&%CBCo+q?Wk#1$tq+w;tPN7XzoH^VUTFQZ zCT!h=O%+r4LdCoyR>&{5d{c(><2R>-K%3xuf%dEoN@Js@OI$yqh8sd9LVP|Eb%2k0 z=d49bj8dPqFnLWijgw(EZgakfmX(stN1uC;W^U5vF(z|=vr$V+osiY{Yj#fIt^9k7 zN#WkDVW)SmC_FUA+?B@$?pvnV-#fKnIBsazGfx%UH@N2L!kay9x=lEvUFYKbaCxL% z(fp?F8of)yW9l#I#*@0n^jgc|%nvlojM&Dx7lawVG-jMe(tIhj9pW}WmBr@x;G}q^ zHWRGc#flT3IvVHnUPM&=J-#r+#KYl{h=4_>`u(7ukACjv_x!s<6ZnoDqEF&NME~*+#|zpVi6);fWOBTu*DikBGkr46sH9Ha z>)lBzO@ejwsN*pQUJt1=8Jp*swQY2~6vhwVXZv2zyy3RGApOjBvjqEX;&#oSa@>ee z?d^!(jV*WUvG7*8>FudEoqw2QL%*Bb;-ZQV&Au6RoEnh>yVO(U=7S z@&hD38j~QOJOZZxv zkH9D|nY4={h}ftaVxcvlX-Ah=Mt&fHP$A-!M01%jbH6qyoqTtf7wLh7qm zUG^*(;B|^2P%qRAs4h&lv7eWnmv~PVd@@6M{t=521HpgVTga&YNUP60_MknIIJE|L z*cO7S>vQ(|k%CQRP`a%*=6s=oci2?X=p5iz=oka_!+7DrE8|?n ztCEW@NA{*9`8=ts4q?Z*X{z`nR0j#4`C+5%&hht(R@`mdg?)XCFCZS8xf8x>uXD|L zyiaYh^ds^I*jJWHAXB#*HgwK?0u$gI?~ohZv=cwPxH@ zHf$tL!X01#0}Bzs;FSNBN?ni)J%hYusBN~$XL~#ydpld+!$Oy_E_E^952G{UgQaiV zEOOS3L6gEs`a^_1#E(k0S@@mn$>wReRVv5^@+DGvi|Zn9+l8z=|C&`Az`Wb0?rrt3 zk`KmCeiD@4mwdh4@Pz0|pen~h*X$51lhCJp#iaOD>YG)2rua`fI;xoos{^S=QQI8V zrg+JsgCvDMlU~9@1#HUlxqt#YN8*y%he9tQJW87$cO@ses(p?65j;S8qvaprofmOTjyLYmrgCCwP8 z`W&1J2FB#2w{6twBa&afKFwID*NxGgiMYx7s*(jkTMpH!j`-= zn^SY#Hi>|KoAM&(iERRT8|K^5MhUY~h{9IUH+&1*F0gs*)3V(JQE@w4)rR>*j7>?W zDKyopA|R??gdi>o?e{-3w_8u`l21#ek3OyGf^tXRP`&yjJ4@0amW2CIT&5(p@%&|n z5;nv6Wyo+~fCCkGOEOpRCWO7n4l_muc)IMd&^>v)V@<_6j|AiCp%kDD{uwpNiSC&^ z`q2I@YLXHMqem1z@>(VcUePZLEHHYT7()@@un>x} zq2#88SdnMKDTt$W48V5=P7bLBe>o3f!jlp;cZsL8BcrxYLQ}=rsmt0my?w_#vAOkD z|LbZX>jlg3VYIqb@zl+!jyktj08`h)_P+E1xB2}_$?jk#S~Ryuu4azZay$}0aS6d@ z)(rT6BW(IvvI6hoZ_8hSO+UZB-`WD+QvehF32cITbQ}W9-(eHv$g_WjO@Pz~fd>6Q z1)HqC|HnVVrd$L{piWR)lwS^?-@?pHTgSp$+t%2^9A8pj-`3dNkP4sI(%RSzpMix6 zpMj1ZfNW_9k0!(KPGZ1<2m>H0$iHp<5ozkQmCE;c#>rt)piA z*4Vc1*1|bSG&#O;V)*4lWsK+l8VcTUnRY)m+)d0*#|=wLsZ3m$DP!;ZY=GlN}RNPxz|P(-IR1^Sf%_c zW>vS78>RSI7Ga3=3+UDLOoZjSAH3QgBqP*`){}7YHQ~)6!=8s?^feh`qTDz%WeUS! zGCl28lg;)ZLK-V9I(v~-hk;7O|FS06C_vsUXGmB{7=7bSqG;Yk)=MaQ3fDZ$YVqs0 z*3sat&s9p*qsi&z^rKJJ^p4`>P2z=x46?? zd*T!x2W5ZQxI6M`mFG#D>T0&Et^i%IoS2MY{2KI>p=7T zG8s=zKEu)k>tPj?Zaj;L_u2Wrsk?&7;cI0FF}KS;Me|)JMzirMg@V)%#qR0mI}347 z8Pbz9ufVdqeP2RXSLaJbq3&XWjX#B}qe?kOKWSc;4a&!528$u`LL95{;6|b|7)nMo zI@Uwj$!+hc!qc5)w2Fte;tkb!^ZDR9Bj1z=dt57xCRPRW6TQQ2^w0pj-@Q2zmhRaFbtvN~G z4LOwMcwQA?rsU(xU`J5CHRyyeu)MRnQm?J0%a4$4MsHH=wjRb#N|*y|;D((Y@18-W zKD|r@6xct5wr{4d?EXhnSDP3B+ISuVE`*L{&2&(yO~+*+jNABURd<-pNgIL^dlNeC zFOP6JcdWMHEgXX;S2(QNbjbk){atBi(KeV^Dy1j?7LI*4g4aCq2V3HO^qKSa7h;p71`;Cb=Jp!_&kn ze0{mB;Z5maVY2pdxbp0>qBkRAkDjflq{QzlazHTuJ@?XB+TGk;o95({bx{2}Mhzyn zj;Z*gsjG2S*$+RK8_=x(U8b&|B{Xn>e_Q?vX8ZZ={ni!)MB>jeoAghZ4Igm?<)1Oz zBff$9KZe=<=u!P)>iUH6XiTF3em|ht;})<0Pz)4+Vn4QiK(U!W_+fvTz#jMh4$B_R zXutUe9}@!~9f`VtN0k^TdOjWoWC{WXK&T%%f)79q6bLvNfaL)1F%XjmD99i2mp{iN z{v22NX!HZpw7whtUIObsPf;WOo-6}g?K5yi;G+J~a_04+5%~r<2@bIT-?$VD!}|eW z8KU5&@4fd(^^A2rdDhHOx~PLI)ffWCMj5q9s1Fl#@3O;wt#myUwJi~%&QQFILUHK& zr)Lm-pT-S38&TkK2HcV5{OM`in6`n&!YD`ZnZ62b~y^PP6|B}Mai4kcQ zN|d<(N$h0oisQM7#ev-F#^b+LO@0{swNoVNq;tgXngUi}`jfMF4=vq??$S@kx7TpM z+>Nlx1>KC=s_A2h?JHEJ0(6ijZaa+2)k8Y#2W}|Fuf5S{2EiFy)V02H@6v8RRhvO5 ztQP*VrtaQJ@Qr$2)|4jF=6<3fj0S@ywx&{htEGthUka(!`j ze6)o8ryXnj-2FzY_FOIQUcJ7VIV4bOj+TBIF7s8IjnbnToP+e(St8YR(MSjZvr>(+ z#e90By@+FCg7Zu|#O^uaR+`f<;!-eISR}^3qRCFPY88h9)Rq+;bOR|;ZSEyhn}Xox ztWgri8#-yZwCi$BVY&MG6L=$4wbxVM{^gCDI>n%Q12_8Nv0nf`TO<8<`m}%eE2(X+ zZK!YkBfeV_rUM_5XVo>$A#9da7nlK2r@X(o;R1v|35&P;(^%^K^ya!Z>(DaFWTH5{ z3RMy${0IF(nt+<)_f$F9xpN{opQ+4NyHU5kIAZixh9EDC_Snd{5>1Br7F8|cPgPM) z5*$%2YSa;%a0Lk~?TlZ(Toc@*B!vNG`_~um0TKOf9S}eHWFR1qX6!#)_K#cm5zVHm zVlyX#=(e2y4MEOX3NE0d)=N&A=b%GF-^DZ)l3qm2Co=+N{`zu$(T2{u)WgSaDp5qi z07I2)ynA|a{IuaxDlv*Hpj_Eym%v$5`6S>ep=^Ef9m@=--@ z!}&+e$+8)!r^AMmsHu)tZ_$;|(G{S^8=Vu;3B8x6oa$DY-&1D2lx&p-udE0r*9Uwz0U4@Z5we+EAxV(}%WR zTAYfNXyG_4PPdj2p8OUkm)I`$dXW-=BF}E&orMj7UC*%2$GU9iEp~ZWsSmkY%#WfkcF|#ZGMs*MZ zH&Lf#y~2BSj~c&~s>@y>`F)3z9`iH!VM|^&l3GE6oOTmK82dH4CF0qZ%Dx!-!aCHr z&gI&%hcXSaH2l12(S)VRRJjvVK`$kzghDjBz~SfZzPw7$JEXtNr3Hz-87^fgd3dvX zMY9D#UL;N_5Uqo&P}oBW@>23>GbG4s%`|Z9NqzQ&>F2%W)99p&cVXBp;MW1|{u({P zPrGThLYvLYiWep;Ol$=A#-@6La7KfBv^uhl=!`3&Ewym?9UP$O(JqJb!*X{55n*l)b& z8WL?=KN3T*x!+DdXl9v>>5}BQ&TFw!7KV;&0dEE4mk3&@p&#Duh{bD-uqRvpjh8NR zt!4_xw5|1)s?(0cxtX988S+DUzG35sEYlIGK8P_mrHI=jc%GtdBp&A*^!@f0aKkHu z1`w|LY}CCfDAW0wDY)G?ZVG8k5As2$G#Xsx`Zsxvn_6zR3SoxP@?SeM0z5SP0{!Q* zQx{eWLDy4up_SH+pWC3CKTpT%jYv|T-1lr&nFpJ_I8658c#Gn77cWq@c*TJXaTeI) z)4~VqBmE&Zi9mx)Lu1P7nM`g#q@@hs6M-_YMqggrHrv4!9-h=J$5yF8_Fk~MEK!u{ z8qv-^@KYJwSiU=G?ZCz(kc#5Iw-H$e0(koGYA80UW7l{yFEPOUYg_orr#Wr{W89$8wh{FGk(D#;*{M8{x43#Y|<+Z zWTVAt*)z*lVPx^KyKHf1B_^W#du%H&muvk9!^n;ey0yzNz~U5UsslDkg|*v@z``2% zr350HXRYGetN54atl}h3?62h1_)abCanOQ56fJkuIG!aBy=QvCeol=GIgv3swED5b zF`!20{(biooLyFpQvHc!M=hZMb}2e9#YjjSt|V`nZ{S39coPTZfV7(68E!qY?i#sr z?wV$D%2!HIif9H!1&$3GJpl?L4qw^OVm@;v@6jS(O;0l! z@vao|;Ff|8r-y~HK50k%rD#HK{JW&3IzeK8T7<-F_@$wHwTi)>?)fx}UY2i|OCN45 ztK+3k6gOV+$erl&l~8C(R9~BGk8{JC4HU%0O!MuOceffqO_!CPd^?#L$+xT?#JklR z?|CXP@iei{O-|=|F9Au!wq}-!fb|U3ST-a1Sf#ESP<~I%#NdyZyGKpv9hkhROxp(6 zi-u?!Rz|6ui{ZU$EI8)?o7kqJr3({}HuI?i4-A`(2)O8vSy|Xs2G|Rpvjv&lP>HxV zQx)*1tPEoJMS^oW^hb;8uVyot=kYJshgo<%ED}S9Sa>0iUd#&RCQ&3ly;TG4P=d$q z9usaeU|aBPWAz=RYQ067f%96|w$Ty)G+uT?IiCdXbRZmFefIF$>^xuFTX60foN5KU zY~t1Jiyju`%!BgJ%DpuILjg352|(_*{B9Kv`If*CU3LE(VMgO@R4q zFvGKO6U*!$z!y_N(fDgO#~U}qCif!iGAz*>(Aks5|6?q{ z&mb2#><`Poa2EgU)c+a!{oa}qc%FZ7pZ?tNXDIc1LlgjT{}VR(!{h(?Oh4nA-_JDq zug>(hNZNmV4nKE--_NlF3`G8THUC4G_$_7u0tlad3*7xWV1IsG5WrsnTb$fLhzhx@wk1Ar0&|;J+FXQ2wzih9XlZS90sN_LLt|m7Zw~A;u&{ooZ3}E#8`A1oYdZiZ zerHC@Ku56rp09Yco4I)=wOprmICl(cnqfgE<= zh`$wns{!`^sQLRbjK9?|{&o!0Z#7K6)iD27!~9zf%WpL-g!o2g#^$EL9X+mq*>o+; zM1EBKRwAT*-3o#SE)4+Je;l7lemuMT20Y#WA#vw@SpS>O$HX0xJN_tYlQC^iL=z5J zJW6mXKZH`GnvfoGt5*s4T*iiBAn=7$+{MFHi3e>e)!hQ5S1}d>gP6{!l_&iD%MMbL z)P_-QrloDV{f5NN2Q;(^i#XxRGA<_9aW;*S5fcH=M0^68ZEwPGHX^clg`{85eQGS; z!_M;>-m!@Wprt8ZseiA*g(LZ9Mx;*+TLbqqn!*_V;3@K+&v^?j--2Y5q0-5xF|i~w z3v|5uD}1ufSRYfaOGJf;T)d++TT!uP$s+W`PcXOWHed7#-L+fbU5-(zf1xQDu6ku!(~PGH5b>|s;r$+E^EiZ9hI^qI`^?M+E znE*KA(LMG(c}GIq$->U|A2xmrca$V;=I9Wc9I_vH*KLq=@qHXUB*YUnPTNpU!BA8> z&Gkg1eZanbeJdJ+EIY^37al}^y6bew)fCNKs~iKTApeE$SUW1Il2CyCxk}p$ztP40 z)7lpV@92i=zI!sdEF@DMe1g0@ zSa4!fN`#7N?i3aGiP;6Q`H{Oo4@3csU!)QE*T|Rsh}|S`127#s&l5(o*!g(SOft$= zo_>0p8N(=;m)uccA@*idfZZd}BwadOr4@_(!ycqv+-*MrocWs4_zO^^H?cMfAD^;8 z*pFCacm`0q_=>XmCLx}9Z#YG5)L`p~-rMop;%I4p_c$bV1n zm#5^#Y0?QXVcdVY8Ju3erMzFaoi43T3sY}o$zM5!fcysC5wXGv+!O~*OZxilF3I*c z@K;^+?~~m?fmlF0UhaY_!%mKN`c-sU{B8JaEldK%GNGJ@sPXc>i3w9{=iVf9OXw0? z@PksX>?o)m=3vFBcTbL@7N5Aqpqsdye~dLSZKnCm7yo{5qoJW4{VZf>1mV&o)0|Fr z@o2hngUvI9u(AplJN4`EFofa=h6yY?^xNf%pt;4yQILiv^W~c^b0`a!9YJuaQE&fG z(GA&4%I7NthR5HWcg{8Oth<(T{F7cTAEco-44mam&b_uhmOh&-cS_`N+)2i>)?~aV zeo}LBwfYQJ;;pWe8oM-`U7I<*JwMWr%7rczUn)P95L-=%8}J4FD|776A{Y3;{;>Q7 zwD7YO`n~mI+Qt8X7JmM&e{YBi==eYV%74?$kBQ*DKwB%o-UtFx3h0$Np!7?x{L(9b zqF3b5(W-NRo>mR{7xhY|f~3tn{&&6Nxth}R#%y|YW~kD5T>Ld>**J$F+Zgy0FoCKE z*BAKgA(8g`_Rism`^}547D^IB(^bSFrNv_=Vz=E~Vm@p2xf2~xOSH71T~Tbq@@<)l zI%2Htqi3_X4#<%lD(Yn+Zl~ZFeVb-t;zyDx`X6J{4GxvD(=4mUstxc`F9;~9ZlCO{ z8jv+Dkr$|B8SPnIo=g`geEw`Wm}-*t9<+>)A@uI83g&cLyz59X>NC30TYWJ%U1{oo zlm0&O6B*QgW|Gk*7Pc?rnB*(4Du|y=%-(w&e~u>}P4S>FM=^adn53dg;N@-7tXe^5 zgWY72P)DNhd_)x`p$f7{m-@!*(}VCH=8J zAXrI=Mv%VV;SB`hz{HWNG|!5cK8==g?_VNGW-QG@^`onQ9e$c~!b!)1 z6D;hlcS4B_J-6ZZO%y$`_1vM6z{n`!B`Ot4s#ew+Y)d#{7lKU>{^yt* zw%0oGD0fXCb4u*s7MWs$gJkEVB!?605I& zDaFvd((SkeY64T->y`^I(ov*<=DBFnS~9~Z)w;W9)6J!KToO{Jdfn<`n(42 zu$!)w&XolkW6_o478uq1cS-o4zp(#M!ry-PVtoQ6e9|uo|7+y%=Oc$tJh)@VfP|j{ z2AY3q}p$Tcps8Q2byNcVV&AYb!Luc)vplmD{>LI(}RXbXMf@i-C>gAG|~SNpEhw48F1eAv>C%w})~ z*VCJN>xFX^V$nR4fVu?O$l^MBRjl#PG$AxxLBVAg8mD~O!Q!3x6zAF z#%Pr0-17#p0S}$5w6aC~>Rrh(Du_Ok%&qi1ZjyQJS?o^A>Fo_{(-9+2ydAArro}kR zjpEJZ^=eSkȨ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 literal 0 HcmV?d00001 From 2e89b55279d849a511b3d678520fefb0f98b6a28 Mon Sep 17 00:00:00 2001 From: Jack Harper Date: Mon, 21 Nov 2022 13:03:46 +0000 Subject: [PATCH 15/54] Add raw limits so that soft limits are synced with motor resolution change --- motorApp/MotorSrc/motorRecord.cc | 313 ++++++++++++++++++++---------- motorApp/MotorSrc/motorRecord.dbd | 12 ++ 2 files changed, 224 insertions(+), 101 deletions(-) diff --git a/motorApp/MotorSrc/motorRecord.cc b/motorApp/MotorSrc/motorRecord.cc index bcf629da..e7b26420 100644 --- a/motorApp/MotorSrc/motorRecord.cc +++ b/motorApp/MotorSrc/motorRecord.cc @@ -234,6 +234,8 @@ static void monitor(motorRecord *); static void process_motor_info(motorRecord *, bool); static void load_pos(motorRecord *); static void check_speed_and_resolution(motorRecord *); +static void set_user_highlimit(motorRecord*, struct motor_dset*); +static void set_user_lowlimit(motorRecord*, struct motor_dset*); static void set_dial_highlimit(motorRecord *, struct motor_dset *); static void set_dial_lowlimit(motorRecord *, struct motor_dset *); static void set_userlimits(motorRecord *); @@ -383,6 +385,8 @@ typedef union unsigned int M_JOGR :1; unsigned int M_HOMF :1; unsigned int M_HOMR :1; + unsigned int M_RHLM :1; + unsigned int M_RLLM :1; } Bits; } nmap_field; @@ -2495,7 +2499,7 @@ static long special(DBADDR *paddr, int after) int dir = dir_positive ? 1 : -1; bool changed = false; int fieldIndex = dbGetFieldIndex(paddr); - double offset, tmp_raw, tmp_limit, fabs_urev; + double fabs_urev; RTN_STATUS rtnval; motor_cmnd command; double temp_dbl; @@ -2700,110 +2704,12 @@ static long special(DBADDR *paddr, int after) /* new user high limit */ case motorRecordHLM: - offset = pmr->off; - if (dir_positive) - { - tmp_limit = pmr->hlm - offset; - MARK(M_DHLM); - } - else - { - tmp_limit = -(pmr->hlm) + offset; - MARK(M_DLLM); - } - - /* Which controller limit we set depends not only on dir, but - also on the sign of MRES */ - /* Direction +ve AND +ve MRES OR - Direction -ve AND -ve MRES */ - if (dir_positive ^ (pmr->mres < 0)) - { - command = SET_HIGH_LIMIT; - } - else - /* Direction -ve AND +ve MRES OR - Direction +ve AND -ve MRES */ - { - command = SET_LOW_LIMIT; - } - - tmp_raw = tmp_limit / pmr->mres; - - INIT_MSG(); - rtnval = (*pdset->build_trans)(command, &tmp_raw, pmr); - if (rtnval != OK) - { - /* If an error occured, build_trans() has reset - * dial high or low limit to controller's value. */ - - if (dir_positive) - pmr->hlm = pmr->dhlm + offset; - else - pmr->hlm = -(pmr->dllm) + offset; - } - else - { - SEND_MSG(); - if (dir_positive) - pmr->dhlm = tmp_limit; - else - pmr->dllm = tmp_limit; - } - MARK(M_HLM); + set_user_highlimit(pmr, pdset); break; /* new user low limit */ case motorRecordLLM: - offset = pmr->off; - if (dir_positive) - { - tmp_limit = pmr->llm - offset; - MARK(M_DLLM); - } - else - { - tmp_limit = -(pmr->llm) + offset; - MARK(M_DHLM); - } - - /* Which controller limit we set depends not only on dir, but - also on the sign of MRES */ - /* Direction +ve AND +ve MRES OR - Direction -ve AND -ve MRES */ - if (dir_positive ^ (pmr->mres < 0)) - { - command = SET_LOW_LIMIT; - } - else - /* Direction -ve AND +ve MRES OR - Direction +ve AND -ve MRES */ - { - command = SET_HIGH_LIMIT; - } - - tmp_raw = tmp_limit / pmr->mres; - - INIT_MSG(); - rtnval = (*pdset->build_trans)(command, &tmp_raw, pmr); - if (rtnval != OK) - { - /* If an error occured, build_trans() has reset - * dial high or low limit to controller's value. */ - - if (dir_positive) - pmr->llm = pmr->dllm + offset; - else - pmr->llm = -(pmr->dhlm) + offset; - } - else - { - SEND_MSG(); - if (dir_positive) - pmr->dllm = tmp_limit; - else - pmr->dhlm = tmp_limit; - } - MARK(M_LLM); + set_user_lowlimit(pmr, pdset); break; /* new dial high limit */ @@ -2877,6 +2783,19 @@ velcheckB: pmr->vmax = temp_dbl; db_post_events(pmr, &pmr->vmax, DBE_VAL_LOG); } + if (pmr->dllm != (temp_dbl = pmr->rllm * pmr->mres)) + { + pmr->dllm = temp_dbl; + db_post_events(pmr, &pmr->dllm, DBE_VAL_LOG); + } + if (pmr->dhlm != (temp_dbl = pmr->rhlm * pmr->mres)) + { + pmr->dhlm = temp_dbl; + db_post_events(pmr, &pmr->dhlm, DBE_VAL_LOG); + } + set_userlimits(pmr); + db_post_events(pmr, &pmr->hlm, DBE_VAL_LOG); + db_post_events(pmr, &pmr->llm, DBE_VAL_LOG); break; /* new srev: make mres agree */ @@ -3828,6 +3747,20 @@ static void load_pos(motorRecord * pmr) * Range check; VBAS < VELO < VMAX. * S < - VELO / |UREV|. * ENDIF + * + * IF RLLM is nonzero. + * DLLM < - RLLM * MRES. + * ENDIF + * IF RLLM is not DLLM / MRES. + * RLLM < - DLLM / MRES. + * ENDIF + * + * IF RHLM is nonzero. + * DHLM < - RHLM * MRES. + * ENDIF + * IF RHLM is not DHLM / MRES. + * RHLM < - DHLM / MRES. + * ENDIF * * IF SBAK is nonzero. * Range check; SBAS < SBAK < SMAX. @@ -3917,6 +3850,35 @@ static void check_speed_and_resolution(motorRecord * pmr) db_post_events(pmr, &pmr->velo, DBE_VAL_LOG); db_post_events(pmr, &pmr->s, DBE_VAL_LOG); + /* RLLM <--> DLLM */ + if (pmr->rllm != 0.0) + { + pmr->dllm = pmr->rllm * pmr->mres; + MARK(M_DLLM); + } + if (pmr->rllm != pmr->dllm / pmr->mres) + { + pmr->rllm = pmr->dllm / pmr->mres; + MARK_AUX(M_RLLM); + } + db_post_events(pmr, &pmr->dllm, DBE_VAL_LOG); + db_post_events(pmr, &pmr->rllm, DBE_VAL_LOG); + + + /* RHLM <--> DHLM */ + if (pmr->rhlm != 0.0) + { + pmr->dhlm = pmr->rhlm * pmr->mres; + MARK(M_DHLM); + } + if (pmr->rhlm != pmr->dhlm / pmr->mres) + { + pmr->rhlm = pmr->dhlm / pmr->mres; + MARK_AUX(M_RHLM); + } + db_post_events(pmr, &pmr->rhlm, DBE_VAL_LOG); + db_post_events(pmr, &pmr->dhlm, DBE_VAL_LOG); + /* SBAK (revolutions/sec) <--> BVEL (EGU/sec) */ if (pmr->sbak != 0.0) { @@ -3958,6 +3920,149 @@ static void check_speed_and_resolution(motorRecord * pmr) range_check(pmr, &pmr->hvel, pmr->vbas, pmr->vmax); } +/* +FUNCTION... void set_user_highlimit(motorRecord *) +USAGE... Set user high limit. +NOTES... This function sends a command to the device to set the user high +limit. This is respective to the direction of the motor. +*/ +static void set_user_highlimit(motorRecord* pmr, struct motor_dset* pdset) +{ + int dir_positive = (pmr->dir == motorDIR_Pos); + double tmp_limit, offset, tmp_raw; + motor_cmnd command; + RTN_STATUS rtnval; + offset = pmr->off; + if (dir_positive) + { + tmp_limit = pmr->hlm - offset; + MARK(M_DHLM); + } + else + { + tmp_limit = -(pmr->hlm) + offset; + MARK(M_DLLM); + } + + /* Which controller limit we set depends not only on dir, but + also on the sign of MRES */ + /* Direction +ve AND +ve MRES OR + Direction -ve AND -ve MRES */ + if (dir_positive ^ (pmr->mres < 0)) + { + command = SET_HIGH_LIMIT; + } + else + /* Direction -ve AND +ve MRES OR + Direction +ve AND -ve MRES */ + { + command = SET_LOW_LIMIT; + } + + tmp_raw = tmp_limit / pmr->mres; + + INIT_MSG(); + rtnval = (*pdset->build_trans)(command, &tmp_raw, pmr); + if (rtnval != OK) + { + /* If an error occured, build_trans() has reset + * dial high or low limit to controller's value. */ + + if (dir_positive) + pmr->hlm = pmr->dhlm + offset; + else + pmr->hlm = -(pmr->dllm) + offset; + } + else + { + // set dial and raw limits + SEND_MSG(); + if (dir_positive) + { + pmr->dhlm = tmp_limit; + pmr->rhlm = tmp_raw; + } + else + { + pmr->dllm = tmp_limit; + pmr->rllm = tmp_limit; + } + } + MARK(M_HLM); +} + +/* +FUNCTION... void set_user_lowlimit(motorRecord *) +USAGE... Set user low limit. +NOTES... This function sends a command to the device to set the user low +limit. This is respective to the direction of the motor. +*/ +static void set_user_lowlimit(motorRecord* pmr, struct motor_dset* pdset) +{ + int dir_positive = (pmr->dir == motorDIR_Pos); + double tmp_limit, offset, tmp_raw; + motor_cmnd command; + RTN_STATUS rtnval; + offset = pmr->off; + if (dir_positive) + { + tmp_limit = pmr->llm - offset; + MARK(M_DLLM); + } + else + { + tmp_limit = -(pmr->llm) + offset; + MARK(M_DHLM); + } + + /* Which controller limit we set depends not only on dir, but + also on the sign of MRES */ + /* Direction +ve AND +ve MRES OR + Direction -ve AND -ve MRES */ + if (dir_positive ^ (pmr->mres < 0)) + { + command = SET_LOW_LIMIT; + } + else + /* Direction -ve AND +ve MRES OR + Direction +ve AND -ve MRES */ + { + command = SET_HIGH_LIMIT; + } + + tmp_raw = tmp_limit / pmr->mres; + + INIT_MSG(); + rtnval = (*pdset->build_trans)(command, &tmp_raw, pmr); + if (rtnval != OK) + { + /* If an error occured, build_trans() has reset + * dial high or low limit to controller's value. */ + + if (dir_positive) + pmr->llm = pmr->dllm + offset; + else + pmr->llm = -(pmr->dhlm) + offset; + } + else + { + // set dial and raw limits + SEND_MSG(); + if (dir_positive) { + pmr->dllm = tmp_limit; + pmr->rllm = tmp_raw; + } + else + { + pmr->dhlm = tmp_limit; + pmr->rhlm = tmp_raw; + } + + } + MARK(M_LLM); +} + + /* FUNCTION... void set_dial_highlimit(motorRecord *) USAGE... Set dial-coordinate high limit. @@ -3974,6 +4079,9 @@ static void set_dial_highlimit(motorRecord *pmr, struct motor_dset *pdset) RTN_STATUS rtnval; tmp_raw = pmr->dhlm / pmr->mres; + // set the raw high limit + pmr->rhlm = tmp_raw; + INIT_MSG(); if (pmr->mres < 0) { command = SET_LOW_LIMIT; @@ -4014,6 +4122,9 @@ static void set_dial_lowlimit(motorRecord *pmr, struct motor_dset *pdset) RTN_STATUS rtnval; tmp_raw = pmr->dllm / pmr->mres; + // set the raw low limit + pmr->rllm = tmp_raw; + INIT_MSG(); if (pmr->mres < 0) { diff --git a/motorApp/MotorSrc/motorRecord.dbd b/motorApp/MotorSrc/motorRecord.dbd index 05fd99b6..e524f36e 100644 --- a/motorApp/MotorSrc/motorRecord.dbd +++ b/motorApp/MotorSrc/motorRecord.dbd @@ -309,6 +309,18 @@ recordtype(motor) { interest(1) size(16) } + field(RHLM,DBF_DOUBLE) { + prompt("Raw High Limit") + promptgroup(GUI_COMMON) + special(SPC_NOMOD) + interest(1) + } + field(RLLM,DBF_DOUBLE) { + prompt("Raw Low Limit") + promptgroup(GUI_COMMON) + special(SPC_NOMOD) + interest(1) + } field(HLM,DBF_DOUBLE) { prompt("User High Limit") special(SPC_MOD) From 141d8aa430a0099b988a31cc602e9e5596f1f6d4 Mon Sep 17 00:00:00 2001 From: Jack Harper Date: Mon, 21 Nov 2022 13:10:40 +0000 Subject: [PATCH 16/54] add to changelog --- motorApp/MotorSrc/motorRecord.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/motorApp/MotorSrc/motorRecord.cc b/motorApp/MotorSrc/motorRecord.cc index e7b26420..77658993 100644 --- a/motorApp/MotorSrc/motorRecord.cc +++ b/motorApp/MotorSrc/motorRecord.cc @@ -190,6 +190,7 @@ USAGE... Motor Record Support. * .76 04-04-18 rls - If URIP is Yes and RDBL is inaccessible (e.g., CA server is down), do not start * a new target position move (sans Home search or Jog). * .78 08-21-18 kmp - Reverted .69 stop on RA_PROBLEM true. + * .79 21-11-22 jrh - Added raw limits, sync limits on motor resolution change */ #define VERSION 7.2 From 566f47073682973f185ee76ee7ddfbeab74bb442 Mon Sep 17 00:00:00 2001 From: Kevin Peterson Date: Wed, 30 Nov 2022 12:57:45 -0600 Subject: [PATCH 17/54] Set the BASE env var using the base value in the matrix, since it isn't set in the module.set file --- .github/workflows/ci-scripts-build-full.yml | 1 + .github/workflows/ci-scripts-build.yml | 1 + 2 files changed, 2 insertions(+) diff --git a/.github/workflows/ci-scripts-build-full.yml b/.github/workflows/ci-scripts-build-full.yml index 707a4d5d..a0fae509 100644 --- a/.github/workflows/ci-scripts-build-full.yml +++ b/.github/workflows/ci-scripts-build-full.yml @@ -26,6 +26,7 @@ jobs: env: CMP: ${{ matrix.cmp }} BCFG: ${{ matrix.configuration }} + BASE: ${{ matrix.base }} WINE: ${{ matrix.wine }} RTEMS: ${{ matrix.rtems }} RTEMS_TARGET: ${{ matrix.rtems_target }} diff --git a/.github/workflows/ci-scripts-build.yml b/.github/workflows/ci-scripts-build.yml index ee404d85..d6252750 100644 --- a/.github/workflows/ci-scripts-build.yml +++ b/.github/workflows/ci-scripts-build.yml @@ -34,6 +34,7 @@ jobs: env: CMP: ${{ matrix.cmp }} BCFG: ${{ matrix.configuration }} + BASE: ${{ matrix.base }} WINE: ${{ matrix.wine }} RTEMS: ${{ matrix.rtems }} RTEMS_TARGET: ${{ matrix.rtems_target }} From f75ace40794afbb6bb977a283f8c2f8196527524 Mon Sep 17 00:00:00 2001 From: Kevin Peterson Date: Thu, 6 Apr 2023 11:30:15 -0500 Subject: [PATCH 18/54] Added model2-specific motor databases to work around unknown command errors. --- motorApp/Db/asyn_motor_model2.db | 92 +++++++++++++++++++ motorApp/Db/asyn_motor_model2_positions.req | 2 + motorApp/Db/asyn_motor_model2_settings.req | 4 + motorApp/Db/basic_asyn_motor_model2.db | 20 ++++ .../Db/basic_asyn_motor_model2_settings.req | 3 + 5 files changed, 121 insertions(+) create mode 100644 motorApp/Db/asyn_motor_model2.db create mode 100644 motorApp/Db/asyn_motor_model2_positions.req create mode 100644 motorApp/Db/asyn_motor_model2_settings.req create mode 100644 motorApp/Db/basic_asyn_motor_model2.db create mode 100644 motorApp/Db/basic_asyn_motor_model2_settings.req diff --git a/motorApp/Db/asyn_motor_model2.db b/motorApp/Db/asyn_motor_model2.db new file mode 100644 index 00000000..7cd664f4 --- /dev/null +++ b/motorApp/Db/asyn_motor_model2.db @@ -0,0 +1,92 @@ +#! Generated by VisualDCT v2.6 +#! DBDSTART +#! DBDEND + + +record(motor, "$(P)$(M)") { + field(DESC, "$(DESC)") + field(DTYP, "$(DTYP)") + field(DIR, "$(DIR)") + field(VELO, "$(VELO)") + field(VBAS, "$(VBAS)") + field(ACCL, "$(ACCL)") + field(BDST, "$(BDST)") + field(BVEL, "$(BVEL)") + field(BACC, "$(BACC)") + field(OUT, "@asyn($(PORT),$(ADDR))") + field(MRES, "$(MRES)") + field(PREC, "$(PREC)") + field(EGU, "$(EGU)") + field(DHLM, "$(DHLM)") + field(DLLM, "$(DLLM)") + field(INIT, "$(INIT)") + field(RTRY, "$(RTRY=10)") + field(RSTM, "$(RSTM=NearZero)") + field(TWV, "1") + field(SDIS, "$(P)$(M)_able.VAL") +} + +record(bo, "$(P)$(M)_able") { + field(DESC, "motor enable") + field(PINI, "YES") + field(OUT, "$(P)$(M).DISP") + field(ZNAM, "Enable") + field(ONAM, "Disable") +} + +record(calcout, "$(P)$(M)_vCh") { + field(DESC, "change velocity") + field(CALC, "min(max(a*b,c),d)") + field(INPB, "$(P)$(M).S") + field(INPC, "$(P)$(M).SBAS") + field(INPD, "$(P)$(M).SMAX") + field(OUT, "$(P)$(M).S") +} + +record(calcout, "$(P)$(M)_twCh") { + field(DESC, "change TWV") + field(CALC, "min(max(a*b,c),d-e)") + field(INPB, "$(P)$(M).TWV") + field(INPC, "$(P)$(M).MRES") + field(INPD, "$(P)$(M).HLM") + field(INPE, "$(P)$(M).LLM") + field(OUT, "$(P)$(M).TWV") +} + +#! Further lines contain data used by VisualDCT +#! View(405,484,0.9) +#! Record("$(P)$(M)",840,675,0,0,"$(P)$(M)") +#! Field("$(P)$(M).DISP",16777215,1,"$(P)$(M).DISP") +#! Field("$(P)$(M).S",16777215,0,"$(P)$(M).S") +#! Field("$(P)$(M).SBAS",16777215,0,"$(P)$(M).SBAS") +#! Field("$(P)$(M).SMAX",16777215,0,"$(P)$(M).SMAX") +#! Field("$(P)$(M).TWV",16777215,0,"$(P)$(M).TWV") +#! Field("$(P)$(M).MRES",16777215,0,"$(P)$(M).MRES") +#! Field("$(P)$(M).HLM",16777215,0,"$(P)$(M).HLM") +#! Field("$(P)$(M).LLM",16777215,0,"$(P)$(M).LLM") +#! Field("$(P)$(M).SDIS",16777215,1,"$(P)$(M).SDIS") +#! Link("$(P)$(M).SDIS","$(P)$(M)_able.VAL") +#! Record("$(P)$(M)_able",1120,874,0,0,"$(P)$(M)_able") +#! Field("$(P)$(M)_able.OUT",16777215,0,"$(P)$(M)_able.OUT") +#! Link("$(P)$(M)_able.OUT","$(P)$(M).DISP") +#! Field("$(P)$(M)_able.VAL",16777215,0,"$(P)$(M)_able.VAL") +#! Record("$(P)$(M)_vCh",440,699,0,0,"$(P)$(M)_vCh") +#! Field("$(P)$(M)_vCh.OUT",16777215,1,"$(P)$(M)_vCh.OUT") +#! Link("$(P)$(M)_vCh.OUT","$(P)$(M).S") +#! Field("$(P)$(M)_vCh.INPB",16777215,1,"$(P)$(M)_vCh.INPB") +#! Link("$(P)$(M)_vCh.INPB","$(P)$(M).S") +#! Field("$(P)$(M)_vCh.INPC",16777215,1,"$(P)$(M)_vCh.INPC") +#! Link("$(P)$(M)_vCh.INPC","$(P)$(M).SBAS") +#! Field("$(P)$(M)_vCh.INPD",16777215,1,"$(P)$(M)_vCh.INPD") +#! Link("$(P)$(M)_vCh.INPD","$(P)$(M).SMAX") +#! Record("$(P)$(M)_twCh",440,925,0,0,"$(P)$(M)_twCh") +#! Field("$(P)$(M)_twCh.OUT",16777215,1,"$(P)$(M)_twCh.OUT") +#! Link("$(P)$(M)_twCh.OUT","$(P)$(M).TWV") +#! Field("$(P)$(M)_twCh.INPB",16777215,1,"$(P)$(M)_twCh.INPB") +#! Link("$(P)$(M)_twCh.INPB","$(P)$(M).TWV") +#! Field("$(P)$(M)_twCh.INPC",16777215,1,"$(P)$(M)_twCh.INPC") +#! Link("$(P)$(M)_twCh.INPC","$(P)$(M).MRES") +#! Field("$(P)$(M)_twCh.INPD",16777215,1,"$(P)$(M)_twCh.INPD") +#! Link("$(P)$(M)_twCh.INPD","$(P)$(M).HLM") +#! Field("$(P)$(M)_twCh.INPE",16777215,1,"$(P)$(M)_twCh.INPE") +#! Link("$(P)$(M)_twCh.INPE","$(P)$(M).LLM") diff --git a/motorApp/Db/asyn_motor_model2_positions.req b/motorApp/Db/asyn_motor_model2_positions.req new file mode 100644 index 00000000..2d8666bb --- /dev/null +++ b/motorApp/Db/asyn_motor_model2_positions.req @@ -0,0 +1,2 @@ +# FILE... motor_positions.req +$(P)$(M).DVAL diff --git a/motorApp/Db/asyn_motor_model2_settings.req b/motorApp/Db/asyn_motor_model2_settings.req new file mode 100644 index 00000000..c6ca1823 --- /dev/null +++ b/motorApp/Db/asyn_motor_model2_settings.req @@ -0,0 +1,4 @@ +# FILE... motor_settings.req + +file basic_motor_settings.req P=$(P),M=$(M) +$(P)$(M)_able.VAL diff --git a/motorApp/Db/basic_asyn_motor_model2.db b/motorApp/Db/basic_asyn_motor_model2.db new file mode 100644 index 00000000..84dba5ce --- /dev/null +++ b/motorApp/Db/basic_asyn_motor_model2.db @@ -0,0 +1,20 @@ +record(motor,"$(P)$(M)") +{ + field(DESC,"$(DESC)") + field(DTYP,"$(DTYP)") + field(DIR,"$(DIR)") + field(VELO,"$(VELO)") + field(VBAS,"$(VBAS)") + field(ACCL,"$(ACCL)") + field(BDST,"$(BDST)") + field(BVEL,"$(BVEL)") + field(BACC,"$(BACC)") + field(OUT,"@asyn($(PORT),$(ADDR))") + field(MRES,"$(MRES)") + field(PREC,"$(PREC)") + field(EGU,"$(EGU)") + field(DHLM,"$(DHLM)") + field(DLLM,"$(DLLM)") + field(INIT,"$(INIT)") + field(TWV,"1") +} diff --git a/motorApp/Db/basic_asyn_motor_model2_settings.req b/motorApp/Db/basic_asyn_motor_model2_settings.req new file mode 100644 index 00000000..22e196a8 --- /dev/null +++ b/motorApp/Db/basic_asyn_motor_model2_settings.req @@ -0,0 +1,3 @@ +# FILE... motor_settings.req + +file basic_motor_settings.req P=$(P),M=$(M) From 0e016898923d45580a43374bb40b512b27b83095 Mon Sep 17 00:00:00 2001 From: Kevin Peterson Date: Thu, 11 May 2023 16:16:56 -0500 Subject: [PATCH 19/54] Updated all the driver submodules to the latest release --- docs/RELEASE.md | 54 ++++++++++++++++++++++++++++++++++++++++ modules/motorAMCI | 2 +- modules/motorAcs | 2 +- modules/motorAcsMotion | 2 +- modules/motorAcsTech80 | 2 +- modules/motorAerotech | 2 +- modules/motorAttocube | 2 +- modules/motorDeltaTau | 2 +- modules/motorFaulhaber | 2 +- modules/motorHytec | 2 +- modules/motorIms | 2 +- modules/motorKohzu | 2 +- modules/motorMXmotor | 2 +- modules/motorMclennan | 2 +- modules/motorMicos | 2 +- modules/motorMicroMo | 2 +- modules/motorMicronix | 2 +- modules/motorMotorSim | 2 +- modules/motorNPoint | 2 +- modules/motorNewFocus | 2 +- modules/motorNewport | 2 +- modules/motorOms | 2 +- modules/motorOmsAsyn | 2 +- modules/motorOriel | 2 +- modules/motorPI | 2 +- modules/motorPIGCS2 | 2 +- modules/motorParker | 2 +- modules/motorPhytron | 2 +- modules/motorPiJena | 2 +- modules/motorScriptMotor | 2 +- modules/motorSmarAct | 2 +- modules/motorSmartMotor | 2 +- modules/motorThorLabs | 2 +- 33 files changed, 86 insertions(+), 32 deletions(-) diff --git a/docs/RELEASE.md b/docs/RELEASE.md index 97f6a7ff..7ea7c9aa 100644 --- a/docs/RELEASE.md +++ b/docs/RELEASE.md @@ -1,5 +1,59 @@ # Motor Releases +## __R7-3 (2023-05-XX)__ +R7-3 is a release based on the master branch. + +### Changes since R7-2-2 + +#### New features +* Added motorAcsMotion as a submodule +* TBD + +#### Modifications to existing features +* TBD + +#### Bug fixes +* TBD + +#### Driver submodules (and noteworthy changes) + +All driver modules now use Github Actions for CI builds. + +| Module | Release | Changes | +| ---------------- | ------- | ------- | +| **motorAcs** | [R1-1-1](https://github.com/epics-motor/motorAcs/releases/tag/R1-1-1) | | +| **motorAcsMotion** | [R2-1](https://github.com/epics-motor/motorAcsMotion/releases/tag/R2-1) | Added as a motor submodule | +| **motorAcsTech80** | [R1-0-2](https://github.com/epics-motor/motorAcsTech80/releases/tag/R1-0-2) | | +| **motorAerotech** | [R1-1-1](https://github.com/epics-motor/motorAerotech/releases/tag/R1-1-1) | Ensemble driver and doCommand.ab bug fixes | +| **motorAMCI** | [R1-0-2](https://github.com/epics-motor/motorAMCI/releases/tag/R1-0-2) | Replaced printf calls with asynPrint calls in ANG1Driver.cpp | +| **motorAttocube** | [R1-0-2](https://github.com/epics-motor/motorAttocube/releases/tag/R1-0-2) | | +| **motorDeltaTau** | [R1-0-2](https://github.com/epics-motor/motorDeltaTau/releases/tag/R1-0-2) | | +| **motorFaulhaber** | [R1-0-2](https://github.com/epics-motor/motorFaulhaber/releases/tag/R1-0-2) | | +| **motorHytec** | [R1-0-3](https://github.com/epics-motor/motorHytec/releases/tag/R1-0-3) | | +| **motorIms** | [R1-0-2](https://github.com/epics-motor/motorIms/releases/tag/R1-0-2) | | +| **motorKohzu** | [R1-0-2](https://github.com/epics-motor/motorKohzu/releases/tag/R1-0-2) | | +| **motorMclennan** | [R1-1-1](https://github.com/epics-motor/motorMclennan/releases/tag/R1-1-1) | | +| **motorMicos** | [R2-1](https://github.com/epics-motor/motorMicos/releases/tag/R2-1) | Added support for the SMC Taurus | +| **motorMicroMo** | [R1-0-2](https://github.com/epics-motor/motorMicroMo/releases/tag/R1-0-2) | | +| **motorMicronix** | [R1-1](https://github.com/epics-motor/motorMicronix/releases/tag/R1-1) | | +| **motorMotorSim** | [R1-2](https://github.com/epics-motor/motorMotorSim/releases/tag/R1-2) | Added motorSim8x.iocsh. Multiple improvements to example IOC. | +| **motorMXmotor** | [R1-0-2](https://github.com/epics-motor/motorMXmotor/releases/tag/R1-0-2) | | +| **motorNewFocus** | [R1-2](https://github.com/epics-motor/motorNewFocus/releases/tag/R1-2) | Improved example newfocus8742 configuration | +| **motorNewport** | [R1-2](https://github.com/epics-motor/motorNewport/releases/tag/R1-2) | Added support for the FCL200. ESP300 driver now supports UEIP=Yes. | +| **motorNPoint** | [R1-1](https://github.com/epics-motor/motorNPoint/releases/tag/R1-1) | | +| **motorOms** | [R1-2](https://github.com/epics-motor/motorOms/releases/tag/R1-2) | Enabled non-VxWorks IOCs & epicsMutexTryLock bug fix | +| **motorOmsAsyn** | [R1-0-3](https://github.com/epics-motor/motorOmsAsyn/releases/tag/R1-0-3) | Type fixes | +| **motorOriel** | [R1-0-2](https://github.com/epics-motor/motorOriel/releases/tag/R1-0-2) | | +| **motorParker** | [R1-1-1](https://github.com/epics-motor/motorParker/releases/tag/R1-1-1) | | +| **motorPhytron** | [R1-2](https://github.com/epics-motor/motorPhytron/releases/tag/R1-2) | Added encoder options. Bug fixes for deceleration and homing to limts. | +| **motorPI** | [R1-1](https://github.com/epics-motor/motorPI/releases/tag/R1-1) | Added E-816 example configuration | +| **motorPIGCS2** | [R1-2](https://github.com/epics-motor/motorPIGCS2/releases/tag/R1-2) | Added support for E-518 & E-873.3QTU controllers. Added closed loop commands for the E-727. Bug fixes. | +| **motorPiJena** | [R1-0-2](https://github.com/epics-motor/motorPiJena/releases/tag/R1-0-2) | | +| **motorScriptMotor** | [R1-2](https://github.com/epics-motor/motorScriptMotor/releases/tag/R1-2) | Added Attocube AMC support | +| **motorSmarAct** | [R2-0](https://github.com/epics-motor/motorSmarAct/releases/tag/R2-0) | Too many new features to list here; see [motorSmarAct release notes](https://github.com/epics-motor/motorSmarAct/releases/tag/R2-0) | +| **motorSmartMotor** | [R1-0-2](https://github.com/epics-motor/motorSmartMotor/releases/tag/R1-0-2) | | +| **motorThorLabs** | [R1-0-2](https://github.com/epics-motor/motorThorLabs/releases/tag/R1-0-2) | Added support for Kinesis KDC101 and KST101 | + ## __R7-2-2 (2021-02-02)__ R7-2-2 is a release based on the R7-2-1-bugfix branch. diff --git a/modules/motorAMCI b/modules/motorAMCI index 4c88334b..89405a90 160000 --- a/modules/motorAMCI +++ b/modules/motorAMCI @@ -1 +1 @@ -Subproject commit 4c88334bd8dcd82034ccd126fbc11e9007cd4802 +Subproject commit 89405a90f9f7ae45e962ba604ac14a714a9b3082 diff --git a/modules/motorAcs b/modules/motorAcs index 8c1fd936..324ff14f 160000 --- a/modules/motorAcs +++ b/modules/motorAcs @@ -1 +1 @@ -Subproject commit 8c1fd9366435b7b9a34d0d5d84a5ad981b241846 +Subproject commit 324ff14fdfa2e6f59c5eff988da9d02c9dfc1b12 diff --git a/modules/motorAcsMotion b/modules/motorAcsMotion index ff75e0c4..91e8e1eb 160000 --- a/modules/motorAcsMotion +++ b/modules/motorAcsMotion @@ -1 +1 @@ -Subproject commit ff75e0c4cee6b1286a4011b3d8beaf6d83425aa1 +Subproject commit 91e8e1eb8d7e468f5628482a9e18e891c5960d9f diff --git a/modules/motorAcsTech80 b/modules/motorAcsTech80 index d7706b0f..e1882d79 160000 --- a/modules/motorAcsTech80 +++ b/modules/motorAcsTech80 @@ -1 +1 @@ -Subproject commit d7706b0f8189f5d253a4e6a610c34c33115be6f6 +Subproject commit e1882d791743afde3861e72c3297849cd012e1a7 diff --git a/modules/motorAerotech b/modules/motorAerotech index 3fa94b74..8d1bc26a 160000 --- a/modules/motorAerotech +++ b/modules/motorAerotech @@ -1 +1 @@ -Subproject commit 3fa94b7429cdf3df88ee0cb02c4c7f46a070ce26 +Subproject commit 8d1bc26a8f6401d298f88853f2b63a2dd3884cbd diff --git a/modules/motorAttocube b/modules/motorAttocube index cc28182e..82f70fd3 160000 --- a/modules/motorAttocube +++ b/modules/motorAttocube @@ -1 +1 @@ -Subproject commit cc28182ecdb7d4325f5102be1e4bd4375422e492 +Subproject commit 82f70fd32af2c577af40ba83dcbde197d5a7f766 diff --git a/modules/motorDeltaTau b/modules/motorDeltaTau index b889129d..43ab3943 160000 --- a/modules/motorDeltaTau +++ b/modules/motorDeltaTau @@ -1 +1 @@ -Subproject commit b889129d8b24b7d8e0d74b726850c174d9d4f051 +Subproject commit 43ab394320ac82dbb3a00dd5f652b26de23018c4 diff --git a/modules/motorFaulhaber b/modules/motorFaulhaber index 86dbaa79..20634dc0 160000 --- a/modules/motorFaulhaber +++ b/modules/motorFaulhaber @@ -1 +1 @@ -Subproject commit 86dbaa795d651db2bd93f04015b3fa816c812676 +Subproject commit 20634dc0da372534604ad3bbe1d3091fcfebec60 diff --git a/modules/motorHytec b/modules/motorHytec index 44335747..25654735 160000 --- a/modules/motorHytec +++ b/modules/motorHytec @@ -1 +1 @@ -Subproject commit 44335747a0230865f9d413cca67051e2ed9fd831 +Subproject commit 256547357fb21f53a5000247298b9ff59dea6bb6 diff --git a/modules/motorIms b/modules/motorIms index cebdb170..50ccd0be 160000 --- a/modules/motorIms +++ b/modules/motorIms @@ -1 +1 @@ -Subproject commit cebdb170b91dd4db48f5b4742b7a16528abcf573 +Subproject commit 50ccd0be61dd717f7b78a640ef991c7e5dc4b501 diff --git a/modules/motorKohzu b/modules/motorKohzu index f406c18b..17cfb357 160000 --- a/modules/motorKohzu +++ b/modules/motorKohzu @@ -1 +1 @@ -Subproject commit f406c18bde2f9ec36dd9fee9f7d6576c247b13df +Subproject commit 17cfb357bcddadec1fff23685a08b3a508234cd3 diff --git a/modules/motorMXmotor b/modules/motorMXmotor index d3efe48c..c7439e9e 160000 --- a/modules/motorMXmotor +++ b/modules/motorMXmotor @@ -1 +1 @@ -Subproject commit d3efe48cf07f9a3ca5914e629c824e1df6d82094 +Subproject commit c7439e9ebf49a6042ba8e206ee85ab6eaa426467 diff --git a/modules/motorMclennan b/modules/motorMclennan index 03750269..dab26dc0 160000 --- a/modules/motorMclennan +++ b/modules/motorMclennan @@ -1 +1 @@ -Subproject commit 03750269099922d6ac1d12b5c89bece77f4009e2 +Subproject commit dab26dc0d0bf709ca4b9d8c8aed73fdbfd75e500 diff --git a/modules/motorMicos b/modules/motorMicos index d98d5c29..c46578b0 160000 --- a/modules/motorMicos +++ b/modules/motorMicos @@ -1 +1 @@ -Subproject commit d98d5c2989f4f0c596c64b3daf3e5160bac344b8 +Subproject commit c46578b0e8a92154db992b1180bdf98c4a4bd338 diff --git a/modules/motorMicroMo b/modules/motorMicroMo index c0845b24..82d81d7c 160000 --- a/modules/motorMicroMo +++ b/modules/motorMicroMo @@ -1 +1 @@ -Subproject commit c0845b24aa3a603dc9692d79beaeb0e2ea0d532d +Subproject commit 82d81d7cbbca413cbca4caddb003ec37c5bc6c5d diff --git a/modules/motorMicronix b/modules/motorMicronix index e2fcf8a4..e163dd64 160000 --- a/modules/motorMicronix +++ b/modules/motorMicronix @@ -1 +1 @@ -Subproject commit e2fcf8a4a03a0fd0d9d1c88ef9b242a2aaf306c4 +Subproject commit e163dd64d2429b76f51de2943e85fe8ee1f73a91 diff --git a/modules/motorMotorSim b/modules/motorMotorSim index 6e2f6460..cdea8740 160000 --- a/modules/motorMotorSim +++ b/modules/motorMotorSim @@ -1 +1 @@ -Subproject commit 6e2f64601e5f27ba212fc8e8488ac655cc4bb483 +Subproject commit cdea87404306161a0f9edf5cd6efd2410612b6f7 diff --git a/modules/motorNPoint b/modules/motorNPoint index 37ab6f1e..700855b5 160000 --- a/modules/motorNPoint +++ b/modules/motorNPoint @@ -1 +1 @@ -Subproject commit 37ab6f1eddb358987d4c4e2b3479c0058d8c63c6 +Subproject commit 700855b5f6dea0b0212a0eb7b7271bdfe928ecdb diff --git a/modules/motorNewFocus b/modules/motorNewFocus index 176006e8..8d909a31 160000 --- a/modules/motorNewFocus +++ b/modules/motorNewFocus @@ -1 +1 @@ -Subproject commit 176006e881fcec8a4ea0b300d5ee908fcfd0d655 +Subproject commit 8d909a310ffb7389463637d76b849739b7b6ac81 diff --git a/modules/motorNewport b/modules/motorNewport index 070c93e1..022c28f9 160000 --- a/modules/motorNewport +++ b/modules/motorNewport @@ -1 +1 @@ -Subproject commit 070c93e1aa1a4dea39829f7dcb21489cfde582a1 +Subproject commit 022c28f984bb6fcae4993f871a75aef8e296c803 diff --git a/modules/motorOms b/modules/motorOms index 5219f8ce..dca9b664 160000 --- a/modules/motorOms +++ b/modules/motorOms @@ -1 +1 @@ -Subproject commit 5219f8ceee352ec2a459f1bde316621af9c293a4 +Subproject commit dca9b664904de6378854844882605179663a30e7 diff --git a/modules/motorOmsAsyn b/modules/motorOmsAsyn index 31b01ea4..fa94d1df 160000 --- a/modules/motorOmsAsyn +++ b/modules/motorOmsAsyn @@ -1 +1 @@ -Subproject commit 31b01ea483232904709ab1c55ad3d5ade8d2e14d +Subproject commit fa94d1dfb5051591783637e137ebb16166590f8e diff --git a/modules/motorOriel b/modules/motorOriel index 32bbe993..a6887696 160000 --- a/modules/motorOriel +++ b/modules/motorOriel @@ -1 +1 @@ -Subproject commit 32bbe993211535313aff4c1a3157f9089ed08273 +Subproject commit a6887696dda342b2e80c1cdef112a24548ffd7da diff --git a/modules/motorPI b/modules/motorPI index c58c5a4e..7673afce 160000 --- a/modules/motorPI +++ b/modules/motorPI @@ -1 +1 @@ -Subproject commit c58c5a4e3db676dc0744b116a64de67530a087ad +Subproject commit 7673afceccd55e7ef0336a4a801a41b2bb1d426c diff --git a/modules/motorPIGCS2 b/modules/motorPIGCS2 index b52f9836..0a452b90 160000 --- a/modules/motorPIGCS2 +++ b/modules/motorPIGCS2 @@ -1 +1 @@ -Subproject commit b52f98361b055d9505c84cee0099ab08b1de0367 +Subproject commit 0a452b905d2754dd774701013de3046e4c1f2f16 diff --git a/modules/motorParker b/modules/motorParker index 0d78e498..018dfe99 160000 --- a/modules/motorParker +++ b/modules/motorParker @@ -1 +1 @@ -Subproject commit 0d78e498aa9c6e5ce393acac45429f34496523d1 +Subproject commit 018dfe994cb9de12934719d53cd58912c6b1736e diff --git a/modules/motorPhytron b/modules/motorPhytron index 55509f40..02d5ce00 160000 --- a/modules/motorPhytron +++ b/modules/motorPhytron @@ -1 +1 @@ -Subproject commit 55509f404e8746684d3ac1ba4fe26c98adeab7b6 +Subproject commit 02d5ce00c37e1c545ed77a6f03cdb20ade487596 diff --git a/modules/motorPiJena b/modules/motorPiJena index 535e9ac1..09fc0f60 160000 --- a/modules/motorPiJena +++ b/modules/motorPiJena @@ -1 +1 @@ -Subproject commit 535e9ac1590d9b294d05518ae9a0acc824fcafad +Subproject commit 09fc0f60bb0a8524c6dfac5b1958c17297dab13c diff --git a/modules/motorScriptMotor b/modules/motorScriptMotor index 374a23ba..0c63c3f2 160000 --- a/modules/motorScriptMotor +++ b/modules/motorScriptMotor @@ -1 +1 @@ -Subproject commit 374a23bae3d0cfe4aa9f268ae5703e43f3d129da +Subproject commit 0c63c3f24e1f5572549e4c00ccc4fa20e84cd573 diff --git a/modules/motorSmarAct b/modules/motorSmarAct index 2678479e..902faf40 160000 --- a/modules/motorSmarAct +++ b/modules/motorSmarAct @@ -1 +1 @@ -Subproject commit 2678479e5d1ab6c341f6b30292f9ecec6cfc072d +Subproject commit 902faf40699a4cd74affee780dd3482065d38680 diff --git a/modules/motorSmartMotor b/modules/motorSmartMotor index 79ea9a72..fe263b77 160000 --- a/modules/motorSmartMotor +++ b/modules/motorSmartMotor @@ -1 +1 @@ -Subproject commit 79ea9a72980c04f43b43c56ed9a84cdaea7c7e8b +Subproject commit fe263b77c1d1b078dd55bcb5942a44bd7de0b18f diff --git a/modules/motorThorLabs b/modules/motorThorLabs index bffd7c94..0ffb08ab 160000 --- a/modules/motorThorLabs +++ b/modules/motorThorLabs @@ -1 +1 @@ -Subproject commit bffd7c94f6f2dc37485a90e40085f181af2bfeb2 +Subproject commit 0ffb08ab41e86b235ef957a95ffd75f7065c90ac From 99d0c414157a9dcfcfc90cc196d8155df477ce12 Mon Sep 17 00:00:00 2001 From: Kevin Peterson Date: Fri, 12 May 2023 14:15:40 -0500 Subject: [PATCH 20/54] Fix for CA clients not seeing updates to RHLM and RLLM --- motorApp/MotorSrc/motorRecord.cc | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/motorApp/MotorSrc/motorRecord.cc b/motorApp/MotorSrc/motorRecord.cc index 77658993..e4a106b8 100644 --- a/motorApp/MotorSrc/motorRecord.cc +++ b/motorApp/MotorSrc/motorRecord.cc @@ -3527,6 +3527,10 @@ static void monitor(motorRecord * pmr) db_post_events(pmr, &pmr->homf, local_mask); if ((local_mask = monitor_mask | (MARKED_AUX(M_HOMR) ? DBE_VAL_LOG : 0))) db_post_events(pmr, &pmr->homr, local_mask); + if ((local_mask = monitor_mask | (MARKED_AUX(M_RHLM) ? DBE_VAL_LOG : 0))) + db_post_events(pmr, &pmr->rhlm, local_mask); + if ((local_mask = monitor_mask | (MARKED_AUX(M_RLLM) ? DBE_VAL_LOG : 0))) + db_post_events(pmr, &pmr->rllm, local_mask); UNMARK_ALL; } @@ -3982,11 +3986,13 @@ static void set_user_highlimit(motorRecord* pmr, struct motor_dset* pdset) { pmr->dhlm = tmp_limit; pmr->rhlm = tmp_raw; + MARK_AUX(M_RHLM); } else { pmr->dllm = tmp_limit; - pmr->rllm = tmp_limit; + pmr->rllm = tmp_raw; + MARK_AUX(M_RLLM); } } MARK(M_HLM); @@ -4052,11 +4058,13 @@ static void set_user_lowlimit(motorRecord* pmr, struct motor_dset* pdset) if (dir_positive) { pmr->dllm = tmp_limit; pmr->rllm = tmp_raw; + MARK_AUX(M_RLLM); } else { pmr->dhlm = tmp_limit; pmr->rhlm = tmp_raw; + MARK_AUX(M_RHLM); } } @@ -4082,6 +4090,7 @@ static void set_dial_highlimit(motorRecord *pmr, struct motor_dset *pdset) tmp_raw = pmr->dhlm / pmr->mres; // set the raw high limit pmr->rhlm = tmp_raw; + MARK_AUX(M_RHLM); INIT_MSG(); if (pmr->mres < 0) { @@ -4125,7 +4134,7 @@ static void set_dial_lowlimit(motorRecord *pmr, struct motor_dset *pdset) tmp_raw = pmr->dllm / pmr->mres; // set the raw low limit pmr->rllm = tmp_raw; - + MARK_AUX(M_RLLM); INIT_MSG(); if (pmr->mres < 0) { From f92ed6f4fc7c8364ec3d4349394b48977148fc58 Mon Sep 17 00:00:00 2001 From: Kevin Peterson Date: Mon, 15 May 2023 11:04:01 -0500 Subject: [PATCH 21/54] Added a missing }, probably caused by merging --- modules/Makefile | 4 ++++ motorApp/MotorSrc/motorRecord.dbd | 1 + 2 files changed, 5 insertions(+) diff --git a/modules/Makefile b/modules/Makefile index 5c3054ac..13b5cdc5 100644 --- a/modules/Makefile +++ b/modules/Makefile @@ -85,6 +85,10 @@ ifdef LUA $(ECHO) Creating $@, LUA = $(LUA) @echo LUA = $(LUA)>> $@ endif +ifdef AUTOSAVE + $(ECHO) Creating $@, AUTOSAVE = $(AUTOSAVE) + @echo AUTOSAVE = $(AUTOSAVE)>> $@ +endif ifdef MODBUS $(ECHO) Creating $@, MODBUS = $(MODBUS) @echo MODBUS = $(MODBUS)>> $@ diff --git a/motorApp/MotorSrc/motorRecord.dbd b/motorApp/MotorSrc/motorRecord.dbd index 4877b2cd..ba8cdb38 100644 --- a/motorApp/MotorSrc/motorRecord.dbd +++ b/motorApp/MotorSrc/motorRecord.dbd @@ -73,6 +73,7 @@ menu(motorRSTM) { choice(motorRSTM_Always, "Always") choice(motorRSTM_NearZero, "NearZero") choice(motorRSTM_Conditional, "Conditional") +} menu(motorACCSused) { choice(motorACCSused_Undef,"Undef") choice(motorACCSused_Accl, "Accl") From ddf1095b5f004c27cd89677b25e65d7090258363 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torsten=20B=C3=B6gershausen?= Date: Mon, 15 May 2023 22:53:25 +0200 Subject: [PATCH 22/54] motorRecord.cc: Correct usage of accEGUfromVelo() The function accEGUfromVelo() returns acceleration in EGU, but we need it expressed in steps. Thanks to Kevin Peterson for noticing. Correct this and divide by fabs(pmr->mres). And while there, correct a typo in a comment --- motorApp/MotorSrc/motorRecord.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/motorApp/MotorSrc/motorRecord.cc b/motorApp/MotorSrc/motorRecord.cc index feceda94..4fb5ee4f 100644 --- a/motorApp/MotorSrc/motorRecord.cc +++ b/motorApp/MotorSrc/motorRecord.cc @@ -941,7 +941,7 @@ static long postProcess(motorRecord * pmr) if (pmr->mip & MIP_JOG_STOP) { - double acc = accEGUfromVelo(pmr, pmr->velo); + double acc = accEGUfromVelo(pmr, pmr->velo) / fabs(pmr->mres); if (vel <= vbase) vel = vbase + 1; @@ -2272,7 +2272,7 @@ static RTN_STATUS do_work(motorRecord * pmr, CALLBACK_VALUE proc_ind) double newpos = pmr->dval / pmr->mres; /* where to go */ double vbase = pmr->vbas / fabs(pmr->mres); /* base speed */ double vel = pmr->velo / fabs(pmr->mres); /* normal speed */ - double acc = accEGUfromVelo(pmr, pmr->velo); + double acc = accEGUfromVelo(pmr, pmr->velo) / fabs(pmr->mres); /* * 'bpos' is one backlash distance away from 'newpos'. */ @@ -3989,7 +3989,7 @@ static void check_speed_and_resolution(motorRecord * pmr) /* ACCL == 0.0, ACCS is != 0.0 -> Use ACCS This is a (possible) new way to configure a database. Existing Db files will have ACCS == 0.0 and this - is backwards compatibleamd behaves as before */ + is backwards compatible and behaves as before */ updateACCLfromACCS(pmr); } /* Sanity check on acceleration time. */ From 5650c666d4e0f605dcd981e3a981fe42c0711dae Mon Sep 17 00:00:00 2001 From: Kevin Peterson Date: Mon, 15 May 2023 16:04:01 -0500 Subject: [PATCH 23/54] Updated motorNewFocus, motorNewport, and motorPI for fixes for 'make uninstall' removing iocsh files --- docs/RELEASE.md | 6 +++--- modules/motorNewFocus | 2 +- modules/motorNewport | 2 +- modules/motorPI | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/RELEASE.md b/docs/RELEASE.md index 7ea7c9aa..f4773a4a 100644 --- a/docs/RELEASE.md +++ b/docs/RELEASE.md @@ -38,15 +38,15 @@ All driver modules now use Github Actions for CI builds. | **motorMicronix** | [R1-1](https://github.com/epics-motor/motorMicronix/releases/tag/R1-1) | | | **motorMotorSim** | [R1-2](https://github.com/epics-motor/motorMotorSim/releases/tag/R1-2) | Added motorSim8x.iocsh. Multiple improvements to example IOC. | | **motorMXmotor** | [R1-0-2](https://github.com/epics-motor/motorMXmotor/releases/tag/R1-0-2) | | -| **motorNewFocus** | [R1-2](https://github.com/epics-motor/motorNewFocus/releases/tag/R1-2) | Improved example newfocus8742 configuration | -| **motorNewport** | [R1-2](https://github.com/epics-motor/motorNewport/releases/tag/R1-2) | Added support for the FCL200. ESP300 driver now supports UEIP=Yes. | +| **motorNewFocus** | [R1-2-1](https://github.com/epics-motor/motorNewFocus/releases/tag/R1-2-1) | Improved example newfocus8742 configuration. iocsh files now installed. | +| **motorNewport** | [R1-2-1](https://github.com/epics-motor/motorNewport/releases/tag/R1-2-1) | Added support for the FCL200. ESP300 driver now supports UEIP=Yes. iocsh files now installed. | | **motorNPoint** | [R1-1](https://github.com/epics-motor/motorNPoint/releases/tag/R1-1) | | | **motorOms** | [R1-2](https://github.com/epics-motor/motorOms/releases/tag/R1-2) | Enabled non-VxWorks IOCs & epicsMutexTryLock bug fix | | **motorOmsAsyn** | [R1-0-3](https://github.com/epics-motor/motorOmsAsyn/releases/tag/R1-0-3) | Type fixes | | **motorOriel** | [R1-0-2](https://github.com/epics-motor/motorOriel/releases/tag/R1-0-2) | | | **motorParker** | [R1-1-1](https://github.com/epics-motor/motorParker/releases/tag/R1-1-1) | | | **motorPhytron** | [R1-2](https://github.com/epics-motor/motorPhytron/releases/tag/R1-2) | Added encoder options. Bug fixes for deceleration and homing to limts. | -| **motorPI** | [R1-1](https://github.com/epics-motor/motorPI/releases/tag/R1-1) | Added E-816 example configuration | +| **motorPI** | [R1-1-1](https://github.com/epics-motor/motorPI/releases/tag/R1-1-1) | Added E-816 example configuration. iocsh files now installed. | | **motorPIGCS2** | [R1-2](https://github.com/epics-motor/motorPIGCS2/releases/tag/R1-2) | Added support for E-518 & E-873.3QTU controllers. Added closed loop commands for the E-727. Bug fixes. | | **motorPiJena** | [R1-0-2](https://github.com/epics-motor/motorPiJena/releases/tag/R1-0-2) | | | **motorScriptMotor** | [R1-2](https://github.com/epics-motor/motorScriptMotor/releases/tag/R1-2) | Added Attocube AMC support | diff --git a/modules/motorNewFocus b/modules/motorNewFocus index 8d909a31..e146427e 160000 --- a/modules/motorNewFocus +++ b/modules/motorNewFocus @@ -1 +1 @@ -Subproject commit 8d909a310ffb7389463637d76b849739b7b6ac81 +Subproject commit e146427ec9d50de4970211925b743b57094d193b diff --git a/modules/motorNewport b/modules/motorNewport index 022c28f9..d84cfe2b 160000 --- a/modules/motorNewport +++ b/modules/motorNewport @@ -1 +1 @@ -Subproject commit 022c28f984bb6fcae4993f871a75aef8e296c803 +Subproject commit d84cfe2bf5247475cebd8ce609c219e854c72742 diff --git a/modules/motorPI b/modules/motorPI index 7673afce..15658711 160000 --- a/modules/motorPI +++ b/modules/motorPI @@ -1 +1 @@ -Subproject commit 7673afceccd55e7ef0336a4a801a41b2bb1d426c +Subproject commit 15658711e9e4d8c11f42366435c5a7f5508c62f8 From b77c331f7815ebc5c2dfffec2d66bb1d7c0e53c0 Mon Sep 17 00:00:00 2001 From: Kevin Peterson Date: Thu, 18 May 2023 10:20:28 -0500 Subject: [PATCH 24/54] Added prop(YES) for floating-point fields in motorRecord.dbd that should update when the PREC changes. --- motorApp/MotorSrc/motorRecord.dbd | 50 +++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/motorApp/MotorSrc/motorRecord.dbd b/motorApp/MotorSrc/motorRecord.dbd index e524f36e..4f31424f 100644 --- a/motorApp/MotorSrc/motorRecord.dbd +++ b/motorApp/MotorSrc/motorRecord.dbd @@ -90,6 +90,7 @@ recordtype(motor) { prompt("User Offset (EGU)") special(SPC_MOD) pp(TRUE) + prop(YES) } field(FOFF,DBF_MENU) { asl(ASL0) @@ -142,36 +143,42 @@ recordtype(motor) { promptgroup(GUI_COMMON) special(SPC_MOD) interest(1) + prop(YES) } field(VBAS,DBF_DOUBLE) { prompt("Base Velocity (EGU/s)") promptgroup(GUI_COMMON) special(SPC_MOD) interest(1) + prop(YES) } field(VMAX,DBF_DOUBLE) { prompt("Max. Velocity (EGU/s)") promptgroup(GUI_COMMON) special(SPC_MOD) interest(1) + prop(YES) } field(S,DBF_DOUBLE) { prompt("Speed (revolutions/sec)") promptgroup(GUI_COMMON) special(SPC_MOD) interest(1) + prop(YES) } field(SBAS,DBF_DOUBLE) { prompt("Base Speed (RPS)") promptgroup(GUI_COMMON) special(SPC_MOD) interest(1) + prop(YES) } field(SMAX,DBF_DOUBLE) { prompt("Max. Speed (RPS)") promptgroup(GUI_COMMON) special(SPC_MOD) interest(1) + prop(YES) } field(ACCL,DBF_DOUBLE) { prompt("Seconds to Velocity") @@ -179,6 +186,7 @@ recordtype(motor) { special(SPC_MOD) interest(1) initial("0.2") + prop(YES) } field(BDST,DBF_DOUBLE) { prompt("BL Distance (EGU)") @@ -186,18 +194,21 @@ recordtype(motor) { promptgroup(GUI_COMMON) special(SPC_MOD) interest(1) + prop(YES) } field(BVEL,DBF_DOUBLE) { prompt("BL Velocity (EGU/s)") promptgroup(GUI_COMMON) special(SPC_MOD) interest(1) + prop(YES) } field(SBAK,DBF_DOUBLE) { prompt("BL Speed (RPS)") promptgroup(GUI_COMMON) special(SPC_MOD) interest(1) + prop(YES) } field(BACC,DBF_DOUBLE) { prompt("BL Seconds to Velocity") @@ -205,6 +216,7 @@ recordtype(motor) { special(SPC_MOD) interest(1) initial("0.5") + prop(YES) } field(FRAC,DBF_FLOAT) { prompt("Move Fraction") @@ -212,6 +224,7 @@ recordtype(motor) { special(SPC_MOD) interest(1) initial("1") + prop(YES) } field(OUT,DBF_OUTLINK) { prompt("Output Specification") @@ -262,6 +275,7 @@ recordtype(motor) { special(SPC_MOD) pp(TRUE) interest(1) + prop(YES) } field(MRES,DBF_DOUBLE) { prompt("Motor Step Size (EGU)") @@ -269,6 +283,7 @@ recordtype(motor) { special(SPC_MOD) pp(TRUE) interest(1) + prop(YES) } field(ERES,DBF_DOUBLE) { prompt("Encoder Step Size (EGU)") @@ -276,11 +291,13 @@ recordtype(motor) { special(SPC_MOD) pp(TRUE) interest(1) + prop(YES) } field(RRES,DBF_DOUBLE) { prompt("Readback Step Size (EGU") promptgroup(GUI_COMMON) interest(1) + prop(YES) } field(UEIP,DBF_MENU) { prompt("Use Encoder If Present") @@ -325,33 +342,39 @@ recordtype(motor) { prompt("User High Limit") special(SPC_MOD) pp(TRUE) + prop(YES) } field(LLM,DBF_DOUBLE) { prompt("User Low Limit") special(SPC_MOD) pp(TRUE) + prop(YES) } field(DHLM,DBF_DOUBLE) { prompt("Dial High Limit") promptgroup(GUI_COMMON) special(SPC_MOD) pp(TRUE) + prop(YES) } field(DLLM,DBF_DOUBLE) { prompt("Dial Low Limit") promptgroup(GUI_COMMON) special(SPC_MOD) pp(TRUE) + prop(YES) } field(HOPR,DBF_DOUBLE) { prompt("High Operating Range") promptgroup(GUI_COMMON) interest(1) + prop(YES) } field(LOPR,DBF_DOUBLE) { prompt("Low Operating Range") promptgroup(GUI_COMMON) interest(1) + prop(YES) } field(HLS,DBF_SHORT) { prompt("User High Limit Switch") @@ -374,24 +397,28 @@ recordtype(motor) { promptgroup(GUI_COMMON) pp(TRUE) interest(2) + prop(YES) } field(LOLO,DBF_DOUBLE) { prompt("Lolo Alarm Limit (EGU)") promptgroup(GUI_COMMON) pp(TRUE) interest(2) + prop(YES) } field(HIGH,DBF_DOUBLE) { prompt("High Alarm Limit (EGU)") promptgroup(GUI_COMMON) pp(TRUE) interest(2) + prop(YES) } field(LOW,DBF_DOUBLE) { prompt("Low Alarm Limit (EGU)") promptgroup(GUI_COMMON) pp(TRUE) interest(2) + prop(YES) } field(HHSV,DBF_MENU) { prompt("Hihi Severity") @@ -433,12 +460,14 @@ recordtype(motor) { promptgroup(GUI_COMMON) special(SPC_MOD) interest(1) + prop(YES) } field(SPDB,DBF_DOUBLE) { prompt("Setpoint Deadband (EGU)") promptgroup(GUI_COMMON) special(SPC_MOD) interest(1) + prop(YES) } field(RCNT,DBF_SHORT) { prompt("Retry count") @@ -522,28 +551,33 @@ recordtype(motor) { prompt("Tweak Step Size (EGU)") promptgroup(GUI_COMMON) interest(1) + prop(YES) } field(VAL,DBF_DOUBLE) { asl(ASL0) prompt("User Desired Value (EGU") special(SPC_MOD) pp(TRUE) + prop(YES) } field(LVAL,DBF_DOUBLE) { prompt("Last User Des Val (EGU)") special(SPC_NOMOD) interest(1) + prop(YES) } field(DVAL,DBF_DOUBLE) { asl(ASL0) prompt("Dial Desired Value (EGU") special(SPC_MOD) pp(TRUE) + prop(YES) } field(LDVL,DBF_DOUBLE) { prompt("Last Dial Des Val (EGU)") special(SPC_NOMOD) interest(1) + prop(YES) } field(RVAL,DBF_LONG) { asl(ASL0) @@ -561,23 +595,28 @@ recordtype(motor) { prompt("Relative Value (EGU)") special(SPC_MOD) pp(TRUE) + prop(YES) } field(LRLV,DBF_DOUBLE) { prompt("Last Rel Value (EGU)") special(SPC_NOMOD) interest(1) + prop(YES) } field(RBV,DBF_DOUBLE) { prompt("User Readback Value") special(SPC_NOMOD) + prop(YES) } field(DRBV,DBF_DOUBLE) { prompt("Dial Readback Value") special(SPC_NOMOD) + prop(YES) } field(DIFF,DBF_DOUBLE) { prompt("Difference dval-drbv") special(SPC_NOMOD) + prop(YES) } field(RDIF,DBF_LONG) { prompt("Difference rval-rrbv") @@ -659,6 +698,7 @@ recordtype(motor) { promptgroup(GUI_COMMON) special(SPC_MOD) interest(1) + prop(YES) } field(CBAK,DBF_NOACCESS) { prompt("Callback structure") @@ -673,6 +713,7 @@ recordtype(motor) { special(SPC_MOD) interest(1) initial("0") + prop(YES) } field(ICOF,DBF_DOUBLE) { promptgroup(GUI_COMMON) @@ -680,6 +721,7 @@ recordtype(motor) { special(SPC_MOD) interest(1) initial("0") + prop(YES) } field(DCOF,DBF_DOUBLE) { promptgroup(GUI_COMMON) @@ -687,6 +729,7 @@ recordtype(motor) { special(SPC_MOD) interest(1) initial("0") + prop(YES) } field(CNEN,DBF_MENU) { asl(ASL0) @@ -737,12 +780,14 @@ recordtype(motor) { promptgroup(GUI_COMMON) special(SPC_MOD) interest(1) + prop(YES) } field(JAR,DBF_DOUBLE) { prompt("Jog Accel. (EGU/s^2)") promptgroup(GUI_COMMON) special(SPC_MOD) interest(1) + prop(YES) } field(LOCK,DBF_MENU) { prompt("Soft Channel Position Lock") @@ -770,6 +815,7 @@ recordtype(motor) { promptgroup(GUI_COMMON) special(SPC_MOD) interest(1) + prop(YES) } field(STUP,DBF_MENU) { asl(ASL0) @@ -792,21 +838,25 @@ recordtype(motor) { prompt("Archive Deadband") promptgroup(GUI_COMMON) interest(1) + prop(YES) } field(MDEL,DBF_DOUBLE) { prompt("Monitor Deadband") promptgroup(GUI_COMMON) interest(1) + prop(YES) } field(ALST,DBF_DOUBLE) { prompt("Last Value Archived") special(SPC_NOMOD) interest(3) + prop(YES) } field(MLST,DBF_DOUBLE) { prompt("Last Val Monitored") special(SPC_NOMOD) interest(3) + prop(YES) } field(SYNC,DBF_SHORT) { prompt("Sync position") From 0907dbbab02eb3018c572358d2e57e69dd601671 Mon Sep 17 00:00:00 2001 From: Kevin Peterson Date: Thu, 18 May 2023 10:39:20 -0500 Subject: [PATCH 25/54] Also add prop(YES) for the PREC field --- motorApp/MotorSrc/motorRecord.dbd | 1 + 1 file changed, 1 insertion(+) diff --git a/motorApp/MotorSrc/motorRecord.dbd b/motorApp/MotorSrc/motorRecord.dbd index 4f31424f..0a2ea8c9 100644 --- a/motorApp/MotorSrc/motorRecord.dbd +++ b/motorApp/MotorSrc/motorRecord.dbd @@ -319,6 +319,7 @@ recordtype(motor) { prompt("Display Precision") promptgroup(GUI_COMMON) interest(1) + prop(YES) } field(EGU,DBF_STRING) { prompt("Engineering Units") From 63bfe5d07772096d3d8a25c486494b5ac2468764 Mon Sep 17 00:00:00 2001 From: Kevin Peterson Date: Thu, 18 May 2023 15:32:42 -0500 Subject: [PATCH 26/54] Changed ACCU from a readback to a control. ACCU can be optionally specified when motor databases are loaded and is autosaved by default. --- docs/motorRecord.html | 30 ++++++++++++++++++++-- motorApp/Db/asyn_motor.db | 1 + motorApp/Db/asyn_motor_model2.db | 1 + motorApp/Db/basic_asyn_motor.db | 1 + motorApp/Db/basic_asyn_motor_model2.db | 1 + motorApp/Db/basic_motor.db | 1 + motorApp/Db/basic_motor_settings.req | 1 + motorApp/Db/motor.db | 1 + motorApp/MotorSrc/motorRecord.cc | 35 +++++++------------------- motorApp/MotorSrc/motorRecord.dbd | 14 +++++------ 10 files changed, 51 insertions(+), 35 deletions(-) diff --git a/docs/motorRecord.html b/docs/motorRecord.html index 0bd14e2b..dd4d9367 100644 --- a/docs/motorRecord.html +++ b/docs/motorRecord.html @@ -272,6 +272,13 @@ below.
+ + ACCU + R/W + Acceleration used + RECCHOICE + (0:"Use ACCL", 1:"Use ACCS") + ADEL R/W @@ -1718,11 +1725,30 @@ below. motor motion. - The motor record expects the hardware to produce a trapezoidal + ACCS + R/W + Acceleration (EGU/s^2) + DOUBLE + Valid range; 0 <= ACCS + + + ACCU + R/W + Acceleration used + RECCHOICE + (0:"Use ACCL", 1:"Use ACCS")  This field determines whether the ACCL or ACCS field + is used in the calculation of the acceleration that is sent to device support. The field + that is not used changes with VELO. The default value is "Use ACCL"  + + + + The motor record expects the hardware to produce a trapezoidal speed profile. That is, the motor speed is expected to increase linearly with time from the base speed, VBAS, to the full speed, VELO, in ACCL seconds. At the end of a motion, the speed is expected to decrease similarly to VBAS. - Note that the ACCS field can be use to specify the acceleration in EGU/s^2.  +

Note that the ACCS field can be use to specify the acceleration in EGU/s^2.

+

Velocity and acceleration are related by the following equation:
+ VELO - VBAS = ACCL * ACCS  

JVEL diff --git a/motorApp/Db/asyn_motor.db b/motorApp/Db/asyn_motor.db index e7089228..fefe379f 100644 --- a/motorApp/Db/asyn_motor.db +++ b/motorApp/Db/asyn_motor.db @@ -10,6 +10,7 @@ record(motor, "$(P)$(M)") { field(VELO, "$(VELO)") field(VBAS, "$(VBAS)") field(ACCL, "$(ACCL)") + field(ACCU, "$(ACCU=0)") field(BDST, "$(BDST)") field(BVEL, "$(BVEL)") field(BACC, "$(BACC)") diff --git a/motorApp/Db/asyn_motor_model2.db b/motorApp/Db/asyn_motor_model2.db index 7cd664f4..3fa391a5 100644 --- a/motorApp/Db/asyn_motor_model2.db +++ b/motorApp/Db/asyn_motor_model2.db @@ -10,6 +10,7 @@ record(motor, "$(P)$(M)") { field(VELO, "$(VELO)") field(VBAS, "$(VBAS)") field(ACCL, "$(ACCL)") + field(ACCU, "$(ACCU=0)") field(BDST, "$(BDST)") field(BVEL, "$(BVEL)") field(BACC, "$(BACC)") diff --git a/motorApp/Db/basic_asyn_motor.db b/motorApp/Db/basic_asyn_motor.db index a1859804..b678741b 100644 --- a/motorApp/Db/basic_asyn_motor.db +++ b/motorApp/Db/basic_asyn_motor.db @@ -6,6 +6,7 @@ record(motor,"$(P)$(M)") field(VELO,"$(VELO)") field(VBAS,"$(VBAS)") field(ACCL,"$(ACCL)") + field(ACCU,"$(ACCU=0)") field(BDST,"$(BDST)") field(BVEL,"$(BVEL)") field(BACC,"$(BACC)") diff --git a/motorApp/Db/basic_asyn_motor_model2.db b/motorApp/Db/basic_asyn_motor_model2.db index 84dba5ce..84e7c1fe 100644 --- a/motorApp/Db/basic_asyn_motor_model2.db +++ b/motorApp/Db/basic_asyn_motor_model2.db @@ -6,6 +6,7 @@ record(motor,"$(P)$(M)") field(VELO,"$(VELO)") field(VBAS,"$(VBAS)") field(ACCL,"$(ACCL)") + field(ACCU,"$(ACCU=0)") field(BDST,"$(BDST)") field(BVEL,"$(BVEL)") field(BACC,"$(BACC)") diff --git a/motorApp/Db/basic_motor.db b/motorApp/Db/basic_motor.db index 98e55ec9..87c70bea 100644 --- a/motorApp/Db/basic_motor.db +++ b/motorApp/Db/basic_motor.db @@ -6,6 +6,7 @@ grecord(motor,"$(P)$(M)") field(VELO,"$(VELO)") field(VBAS,"$(VBAS)") field(ACCL,"$(ACCL)") + field(ACCU,"$(ACCU=0)") field(BDST,"$(BDST)") field(BVEL,"$(BVEL)") field(BACC,"$(BACC)") diff --git a/motorApp/Db/basic_motor_settings.req b/motorApp/Db/basic_motor_settings.req index 5e3eb551..9072214a 100644 --- a/motorApp/Db/basic_motor_settings.req +++ b/motorApp/Db/basic_motor_settings.req @@ -11,6 +11,7 @@ $(P)$(M).RRES $(P)$(M).VBAS $(P)$(M).VELO $(P)$(M).ACCL +$(P)$(M).ACCU $(P)$(M).BDST $(P)$(M).BVEL $(P)$(M).BACC diff --git a/motorApp/Db/motor.db b/motorApp/Db/motor.db index 3b6c0e5d..7b5b4712 100644 --- a/motorApp/Db/motor.db +++ b/motorApp/Db/motor.db @@ -10,6 +10,7 @@ record(motor, "$(P)$(M)") { field(VELO, "$(VELO)") field(VBAS, "$(VBAS)") field(ACCL, "$(ACCL)") + field(ACCU, "$(ACCU=0)") field(BDST, "$(BDST)") field(BVEL, "$(BVEL)") field(BACC, "$(BACC)") diff --git a/motorApp/MotorSrc/motorRecord.cc b/motorApp/MotorSrc/motorRecord.cc index 4fb5ee4f..cf98e10b 100644 --- a/motorApp/MotorSrc/motorRecord.cc +++ b/motorApp/MotorSrc/motorRecord.cc @@ -486,7 +486,7 @@ static double accEGUfromVelo(motorRecord *pmr, double veloEGU) double vmax = fabs(veloEGU); double acc; /* ACCL or ACCS */ - if (pmr->accu == motorACCSused_Accs) + if (pmr->accu == motorACCU_Accs) acc = pmr->accs; else if (vmax > vmin) acc = (vmax - vmin) / pmr->accl; @@ -498,14 +498,9 @@ static double accEGUfromVelo(motorRecord *pmr, double veloEGU) static void updateACCLfromACCS(motorRecord *pmr) { - if (pmr->accu != motorACCSused_Accs) - { - pmr->accu = motorACCSused_Accs; - db_post_events(pmr, &pmr->accu, DBE_VAL_LOG); - } if (pmr->accs > 0.0) { - double temp_dbl = pmr->velo / pmr->accs; + double temp_dbl = (pmr->velo > pmr->vbas) ? (pmr->velo - pmr->vbas) / pmr->accs : pmr->velo / pmr->accs; if (pmr->accl != temp_dbl) { pmr->accl = temp_dbl; @@ -517,12 +512,7 @@ static void updateACCLfromACCS(motorRecord *pmr) static void updateACCSfromACCL(motorRecord *pmr) { double temp_dbl; - if (pmr->accu != motorACCSused_Accl) - { - pmr->accu = motorACCSused_Accl; - db_post_events(pmr, &pmr->accu, DBE_VAL_LOG); - } - temp_dbl = pmr->velo / pmr->accl; + temp_dbl = (pmr->velo > pmr->vbas) ? (pmr->velo - pmr->vbas) / pmr->accl : pmr->velo / pmr->accl; if (pmr->accs != temp_dbl) { pmr->accs = temp_dbl; @@ -532,11 +522,11 @@ static void updateACCSfromACCL(motorRecord *pmr) static void updateACCL_ACCSfromVELO(motorRecord *pmr) { - if (pmr->accu == motorACCSused_Accs) + if (pmr->accu == motorACCU_Accs) { if (pmr->accs > 0.0) { - double temp_dbl = pmr->velo / pmr->accs; + double temp_dbl = (pmr->velo > pmr->vbas) ? (pmr->velo - pmr->vbas) / pmr->accs : pmr->velo / pmr->accs; if (pmr->accl != temp_dbl) { pmr->accl = temp_dbl; @@ -546,7 +536,7 @@ static void updateACCL_ACCSfromVELO(motorRecord *pmr) } else { - double temp_dbl = pmr->velo / pmr->accl; + double temp_dbl = (pmr->velo > pmr->vbas) ? (pmr->velo - pmr->vbas) / pmr->accl : pmr->velo / pmr->accl; if (pmr->accs != temp_dbl) { pmr->accs = temp_dbl; @@ -3984,14 +3974,6 @@ static void check_speed_and_resolution(motorRecord * pmr) db_post_events(pmr, &pmr->sbak, DBE_VAL_LOG); db_post_events(pmr, &pmr->bvel, DBE_VAL_LOG); - if (pmr->accs && !pmr->accl) - { - /* ACCL == 0.0, ACCS is != 0.0 -> Use ACCS - This is a (possible) new way to configure a database. - Existing Db files will have ACCS == 0.0 and this - is backwards compatible and behaves as before */ - updateACCLfromACCS(pmr); - } /* Sanity check on acceleration time. */ if (pmr->accl == 0.0) { @@ -4017,8 +3999,9 @@ static void check_speed_and_resolution(motorRecord * pmr) pmr->hvel = pmr->vbas; else range_check(pmr, &pmr->hvel, pmr->vbas, pmr->vmax); - /* Make sure that ACCS/ACCU are initialized */ - if (pmr->accu == motorACCSused_Undef) + + /* Make sure that ACCS is initialized */ + if (pmr->accs == 0.0) { updateACCSfromACCL(pmr); } diff --git a/motorApp/MotorSrc/motorRecord.dbd b/motorApp/MotorSrc/motorRecord.dbd index ba8cdb38..b112dda3 100644 --- a/motorApp/MotorSrc/motorRecord.dbd +++ b/motorApp/MotorSrc/motorRecord.dbd @@ -74,10 +74,9 @@ menu(motorRSTM) { choice(motorRSTM_NearZero, "NearZero") choice(motorRSTM_Conditional, "Conditional") } -menu(motorACCSused) { - choice(motorACCSused_Undef,"Undef") - choice(motorACCSused_Accl, "Accl") - choice(motorACCSused_Accs, "Accs") +menu(motorACCU) { + choice(motorACCU_Accl, "Use ACCL") + choice(motorACCU_Accs, "Use ACCS") } include "menuOmsl.dbd" @@ -191,9 +190,10 @@ recordtype(motor) { interest(1) } field(ACCU,DBF_MENU) { - prompt("ACCS used") - special(SPC_NOMOD) - menu(motorACCSused) + prompt("Acceleration used") + special(SPC_MOD) + menu(motorACCU) + initial("0") } field(BDST,DBF_DOUBLE) { prompt("BL Distance (EGU)") From c3d6c6ee439e4d46fd2d4c2790091f7c76e31120 Mon Sep 17 00:00:00 2001 From: Mark Rivers Date: Thu, 18 May 2023 16:41:32 -0500 Subject: [PATCH 27/54] Minor fixes to change text widgets from decimal to string; DTYP and EGU we not displaying correctly in Phoebus --- motorApp/op/adl/motorx_all.adl | 31 +- motorApp/op/bob/autoconvert/motorx_all.bob | 370 +++--- motorApp/op/edl/autoconvert/motorx_all.edl | 1300 ++++++++++---------- motorApp/op/opi/autoconvert/motorx_all.opi | 536 ++++---- motorApp/op/ui/autoconvert/motorx_all.ui | 139 ++- 5 files changed, 1190 insertions(+), 1186 deletions(-) diff --git a/motorApp/op/adl/motorx_all.adl b/motorApp/op/adl/motorx_all.adl index a6fe09fb..110b6a51 100644 --- a/motorApp/op/adl/motorx_all.adl +++ b/motorApp/op/adl/motorx_all.adl @@ -1,12 +1,12 @@ file { - name="/home/oxygen/MOONEY/epics/synApps/support/motor/motorApp/op/adl/motorx_all.adl" - version=030107 + name="/home/epics/support/motor/motorApp/op/adl/motorx_all.adl" + version=030117 } display { object { x=188 - y=29 + y=31 width=450 height=875 } @@ -87,6 +87,17 @@ display { 1a7309, } } +rectangle { + object { + x=0 + y=0 + width=450 + height=26 + } + "basic attribute" { + clr=1 + } +} rectangle { object { x=80 @@ -597,6 +608,7 @@ text { clr=14 bclr=1 } + format="string" limits { } } @@ -1237,17 +1249,6 @@ text { textix="SET" align="horiz. centered" } -rectangle { - object { - x=0 - y=0 - width=450 - height=26 - } - "basic attribute" { - clr=1 - } -} "text entry" { object { x=0 @@ -1260,6 +1261,7 @@ rectangle { clr=54 bclr=1 } + format="string" limits { } } @@ -1306,6 +1308,7 @@ text { bclr=1 } align="horiz. centered" + format="string" limits { } } diff --git a/motorApp/op/bob/autoconvert/motorx_all.bob b/motorApp/op/bob/autoconvert/motorx_all.bob index 1283fdb0..2e265756 100644 --- a/motorApp/op/bob/autoconvert/motorx_all.bob +++ b/motorApp/op/bob/autoconvert/motorx_all.bob @@ -1,8 +1,9 @@ + motorx_all 188 - 29 + 31 450 875 @@ -13,6 +14,19 @@ 5 rectangle #6 + 450 + 26 + + + + + + + + + + + rectangle #9 80 99 210 @@ -35,7 +49,7 @@ - rectangle #10 + rectangle #13 285 90 21 @@ -49,7 +63,7 @@ - text #13 + text #16 Jog 318 290 @@ -61,7 +75,7 @@ 1 - text #16 + text #19 Backlash 206 290 @@ -73,7 +87,7 @@ 1 - text #19 + text #22 Normal 94 290 @@ -85,7 +99,7 @@ 1 - text #22 + text #25 Dynamics 2 286 @@ -101,24 +115,24 @@ 1 - polyline #25 + polyline #28 285 449 2 - 2 - - - - + 2 + + + + - text entry #29 + text entry #32 $(P)$(M).FRAC 207 446 @@ -136,7 +150,7 @@ false - text entry #33 + text entry #36 $(P)$(M).VMAX 95 317 @@ -154,7 +168,7 @@ false - text #37 + text #40 Speed 3 346 @@ -167,7 +181,7 @@ true - text #40 + text #43 Base Speed 3 372 @@ -180,7 +194,7 @@ true - text #43 + text #46 Accel. 3 398 @@ -193,7 +207,7 @@ true - text #46 + text #49 Backlash distance 3 423 @@ -206,7 +220,7 @@ true - text #49 + text #52 Move Fraction 3 449 @@ -219,7 +233,7 @@ true - text entry #52 + text entry #55 $(P)$(M).BACC 207 395 @@ -237,7 +251,7 @@ false - text entry #56 + text entry #59 $(P)$(M).ACCL 95 395 @@ -255,7 +269,7 @@ false - text entry #60 + text entry #63 $(P)$(M).BDST 207 420 @@ -273,7 +287,7 @@ false - text entry #64 + text entry #67 $(P)$(M).VELO 95 343 @@ -291,7 +305,7 @@ false - text entry #68 + text entry #71 $(P)$(M).BVEL 207 343 @@ -309,7 +323,7 @@ false - text entry #72 + text entry #75 $(P)$(M).VBAS 95 369 @@ -327,7 +341,7 @@ false - text #76 + text #79 Cal 6 256 @@ -340,7 +354,7 @@ 1 - choice button #79 + choice button #82 $(P)$(M).SET 37 253 @@ -356,7 +370,7 @@ - text #82 + text #85 Off 150 256 @@ -369,7 +383,7 @@ 2 - composite #85 + composite #88 186 232 100 @@ -377,7 +391,7 @@ true - menu #88 + menu #91 $(P)$(M).FOFF 18 @@ -387,7 +401,7 @@ false - text entry #91 + text entry #94 $(P)$(M).OFF 17 25 @@ -405,7 +419,7 @@ - text #95 + text #98 Dir 301 256 @@ -418,7 +432,7 @@ 1 - choice button #98 + choice button #101 $(P)$(M).DIR 332 253 @@ -434,7 +448,7 @@ - text entry #101 + text entry #104 $(P)$(M).JVEL 319 343 @@ -452,7 +466,7 @@ false - text entry #105 + text entry #108 $(P)$(M).JAR 319 395 @@ -470,25 +484,25 @@ false - polyline #109 + polyline #112 2 225 449 2 - 2 - - - - + 2 + + + + - rectangle #113 + rectangle #116 225 120 22 @@ -502,7 +516,7 @@ - text #116 + text #119 Calibration 4 227 @@ -518,7 +532,7 @@ true - text #119 + text #122 Maximum Spd 3 320 @@ -531,7 +545,7 @@ true - text #122 + text #125 Moving 337 51 @@ -557,7 +571,7 @@ - text entry #126 + text entry #129 $(P)$(M).EGU 350 3 @@ -570,12 +584,12 @@ - 1 + 6 false false - rectangle #130 + rectangle #133 30 70 22 @@ -589,7 +603,7 @@ - text #133 + text #136 Drive 4 31 @@ -605,7 +619,7 @@ true - text #136 + text #139 Limit 285 32 @@ -630,7 +644,7 @@ - rectangle #140 + rectangle #143 240 189 49 @@ -655,7 +669,7 @@ - rectangle #144 + rectangle #147 189 189 49 @@ -680,7 +694,7 @@ - message button #148 + message button #151 $(P)$(M).TWF @@ -700,7 +714,7 @@ - message button #151 + message button #154 $(P)$(M).TWR @@ -720,7 +734,7 @@ - text entry #154 + text entry #157 $(P)$(M).TWV 103 193 @@ -739,7 +753,7 @@ false - message button #158 + message button #161 $(P)$(M).JOGR 192 166 @@ -763,7 +777,7 @@ 1 - message button #161 + message button #164 $(P)$(M).JOGF 242 166 @@ -787,7 +801,7 @@ 1 - text entry #164 + text entry #167 $(P)$(M).RLV 83 166 @@ -805,7 +819,7 @@ false - message button #168 + message button #171 $(P)$(M).HOMF @@ -825,7 +839,7 @@ - message button #171 + message button #174 $(P)$(M).HOMR @@ -845,7 +859,7 @@ - text #174 + text #177 User 83 32 @@ -856,7 +870,7 @@ 1 - text #177 + text #180 Dial 187 32 @@ -867,7 +881,7 @@ 1 - text #180 + text #183 Limit 285 32 @@ -892,7 +906,7 @@ - text update #184 + text update #187 $(P)$(M).RBV 83 78 @@ -914,7 +928,7 @@ false - text update #188 + text update #191 $(P)$(M).DRBV 187 78 @@ -936,7 +950,7 @@ false - text entry #192 + text entry #195 $(P)$(M).VAL 83 102 @@ -954,7 +968,7 @@ false - text entry #196 + text entry #199 $(P)$(M).LLM 83 132 @@ -972,7 +986,7 @@ false - text entry #200 + text entry #203 $(P)$(M).DHLM 187 50 @@ -990,7 +1004,7 @@ false - text entry #204 + text entry #207 $(P)$(M).HLM 83 50 @@ -1008,7 +1022,7 @@ false - text entry #208 + text entry #211 $(P)$(M).DVAL 187 102 @@ -1026,7 +1040,7 @@ false - text entry #212 + text entry #215 $(P)$(M).DLLM 187 132 @@ -1044,7 +1058,7 @@ false - oval #216 + oval #219 290 50 21 @@ -1067,7 +1081,7 @@ - oval #220 + oval #223 290 132 21 @@ -1090,7 +1104,7 @@ - text #224 + text #227 Soft-Limit Violation 83 153 @@ -1111,7 +1125,7 @@ - composite #228 + composite #231 79 75 210 @@ -1119,7 +1133,7 @@ true - rectangle #231 + rectangle #234 2 2 206 @@ -1144,7 +1158,7 @@ - rectangle #235 + rectangle #238 210 22 2 @@ -1168,7 +1182,7 @@ - composite #239 + composite #242 5 53 75 @@ -1176,7 +1190,7 @@ true - text #242 + text #245 Tweak 143 75 @@ -1188,7 +1202,7 @@ true - text #245 + text #248 MoveRel 116 75 @@ -1200,7 +1214,7 @@ true - text #248 + text #251 Lo limit 82 75 @@ -1212,7 +1226,7 @@ true - text #251 + text #254 MoveAbs 52 75 @@ -1224,7 +1238,7 @@ true - text #254 + text #257 Readback 25 75 @@ -1236,7 +1250,7 @@ true - text #257 + text #260 Hi limit 75 18 @@ -1248,7 +1262,7 @@ - text #260 + text #263 Raw 340 32 @@ -1261,7 +1275,7 @@ 1 - text update #263 + text update #266 $(P)$(M).RRBV 335 77 @@ -1283,7 +1297,7 @@ false - choice button #267 + choice button #270 $(P)$(M)_able.VAL 299 171 @@ -1301,7 +1315,7 @@ - rectangle #270 + rectangle #273 81 100 356 @@ -1324,7 +1338,7 @@ - text entry #274 + text entry #277 $(P)$(M).RVAL 335 102 @@ -1342,7 +1356,7 @@ false - text #278 + text #281 SET 60 93 @@ -1362,19 +1376,6 @@ - - rectangle #282 - 450 - 26 - - - - - - - - - text entry #285 $(P)$(M).DESC @@ -1392,7 +1393,7 @@ - 1 + 6 false false @@ -1401,16 +1402,16 @@ 27 449 3 - - - - + + + + text #293 @@ -1433,7 +1434,7 @@ - 1 + 6 false 1 false @@ -1555,17 +1556,17 @@ 285 0 187 - 1 - - - - + 1 + + + + polyline #322 @@ -1573,17 +1574,17 @@ 285 0 187 - 1 - - - - + 1 + + + + composite #326 @@ -1623,17 +1624,17 @@ 10 22 0 - 1 - - - - + 1 + + + + @@ -1674,17 +1675,17 @@ 10 22 0 - 1 - - - - + 1 + + + + @@ -1725,17 +1726,17 @@ 10 22 0 - 1 - - - - + 1 + + + + @@ -1807,17 +1808,17 @@ 10 22 0 - 1 - - - - + 1 + + + + @@ -1876,17 +1877,17 @@ 528 3 346 - 2 - - - - + 2 + + + + rectangle #399 @@ -2686,17 +2687,17 @@ 10 22 0 - 1 - - - - + 1 + + + + @@ -2737,17 +2738,17 @@ 10 22 0 - 1 - - - - + 1 + + + + @@ -2788,17 +2789,17 @@ 10 22 0 - 1 - - - - + 1 + + + + @@ -2920,17 +2921,17 @@ 529 449 2 - 2 - - - - + 2 + + + + rectangle #625 @@ -2952,17 +2953,17 @@ 473 449 2 - 2 - - - - + 2 + + + + text #632 @@ -3022,17 +3023,17 @@ 473 0 55 - 1 - - - - + 1 + + + + polyline #648 @@ -3040,17 +3041,17 @@ 473 0 55 - 1 - - - - + 1 + + + + text entry #652 @@ -3126,17 +3127,17 @@ 842 260 3 - 2 - - - - + 2 + + + + text #671 @@ -3449,6 +3450,7 @@ + 1 diff --git a/motorApp/op/edl/autoconvert/motorx_all.edl b/motorApp/op/edl/autoconvert/motorx_all.edl index dc5eee78..aa4abcd1 100644 --- a/motorApp/op/edl/autoconvert/motorx_all.edl +++ b/motorApp/op/edl/autoconvert/motorx_all.edl @@ -4,26 +4,42 @@ major 4 minor 0 release 1 x 188 -y 29 +y 31 w 450 h 875 font "helvetica-medium-r-18.0" ctlFont "helvetica-bold-r-10.0" btnFont "helvetica-medium-r-18.0" -fgColor index 6 -bgColor index 3 -textColor index 14 -ctlFgColor1 index 25 -ctlFgColor2 index 15 -ctlBgColor1 index 5 -ctlBgColor2 index 12 -topShadowColor index 1 -botShadowColor index 13 +fgColor rgb 40448 40448 40448 +bgColor rgb 51200 51200 51200 +textColor rgb 0 0 0 +ctlFgColor1 rgb 64256 62208 18944 +ctlFgColor2 rgb 60928 46592 11008 +ctlBgColor1 rgb 52480 24832 0 +ctlBgColor2 rgb 65280 45056 65280 +topShadowColor rgb 44544 19968 48128 +botShadowColor rgb 13312 13056 34304 showGrid snapToGrid gridSize 4 endScreenProperties +# (Rectangle) +object activeRectangleClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 0 +y 0 +w 449 +h 25 +lineColor rgb 60416 60416 60416 +fill +fillColor rgb 60416 60416 60416 +lineWidth 0 +endObjectProperties + # (Rectangle) object activeRectangleClass beginObjectProperties @@ -34,9 +50,9 @@ x 80 y 99 w 208 h 29 -lineColor index 14 +lineColor rgb 0 0 0 fill -fillColor index 14 +fillColor rgb 0 0 0 visPv "CALC\\\{(A)\}($(P)$(M)_able.VAL)" visInvert visMin 0 @@ -53,9 +69,9 @@ x 0 y 285 w 89 h 20 -lineColor index 54 +lineColor rgb 2560 0 47104 fill -fillColor index 54 +fillColor rgb 2560 0 47104 lineWidth 0 endObjectProperties @@ -69,9 +85,9 @@ x 318 y 290 w 100 h 19 -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-14.0" fontAlign "center" -fgColor index 14 +fgColor rgb 0 0 0 bgColor index 3 useDisplayBg value { @@ -89,9 +105,9 @@ x 206 y 290 w 100 h 19 -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-14.0" fontAlign "center" -fgColor index 14 +fgColor rgb 0 0 0 bgColor index 3 useDisplayBg value { @@ -109,9 +125,9 @@ x 94 y 290 w 100 h 19 -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-14.0" fontAlign "center" -fgColor index 14 +fgColor rgb 0 0 0 bgColor index 3 useDisplayBg value { @@ -129,9 +145,9 @@ x 2 y 286 w 85 h 20 -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-14.0" fontAlign "center" -fgColor index 14 +fgColor rgb 65280 65280 65280 bgColor index 3 useDisplayBg value { @@ -149,8 +165,8 @@ x 0 y 285 w 449 h 2 -lineColor index 54 -fillColor index 54 +lineColor rgb 2560 0 47104 +fillColor rgb 2560 0 47104 lineWidth 2 numPoints 2 { xPoints { @@ -175,14 +191,14 @@ w 100 h 24 controlPv "$(P)$(M).FRAC" format "decimal" -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-14.0" fontAlign "left" -fgColor index 25 -bgColor index 5 +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 editable motifWidget limitsFromDb -nullColor index 32 +nullColor rgb 60928 46592 11008 smartRefresh fastUpdate newPos @@ -201,14 +217,14 @@ w 100 h 24 controlPv "$(P)$(M).VMAX" format "decimal" -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-14.0" fontAlign "left" -fgColor index 25 -bgColor index 5 +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 editable motifWidget limitsFromDb -nullColor index 32 +nullColor rgb 60928 46592 11008 smartRefresh fastUpdate newPos @@ -225,8 +241,8 @@ x 3 y 346 w 73 h 17 -font "helvetica-bold-r-12.0" -fgColor index 14 +font "helvetica-medium-r-14.0" +fgColor rgb 0 0 0 bgColor index 3 useDisplayBg value { @@ -242,10 +258,10 @@ minor 1 release 1 x 3 y 372 -w 80 +w 92 h 17 -font "helvetica-bold-r-12.0" -fgColor index 14 +font "helvetica-medium-r-14.0" +fgColor rgb 0 0 0 bgColor index 3 useDisplayBg value { @@ -263,8 +279,8 @@ x 3 y 398 w 73 h 17 -font "helvetica-bold-r-12.0" -fgColor index 14 +font "helvetica-medium-r-14.0" +fgColor rgb 0 0 0 bgColor index 3 useDisplayBg value { @@ -282,8 +298,8 @@ x 3 y 423 w 177 h 17 -font "helvetica-bold-r-12.0" -fgColor index 14 +font "helvetica-medium-r-14.0" +fgColor rgb 0 0 0 bgColor index 3 useDisplayBg value { @@ -301,8 +317,8 @@ x 3 y 449 w 177 h 17 -font "helvetica-bold-r-12.0" -fgColor index 14 +font "helvetica-medium-r-14.0" +fgColor rgb 0 0 0 bgColor index 3 useDisplayBg value { @@ -322,14 +338,14 @@ w 100 h 24 controlPv "$(P)$(M).BACC" format "decimal" -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-14.0" fontAlign "left" -fgColor index 25 -bgColor index 5 +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 editable motifWidget limitsFromDb -nullColor index 32 +nullColor rgb 60928 46592 11008 smartRefresh fastUpdate newPos @@ -348,14 +364,14 @@ w 100 h 24 controlPv "$(P)$(M).ACCL" format "decimal" -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-14.0" fontAlign "left" -fgColor index 25 -bgColor index 5 +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 editable motifWidget limitsFromDb -nullColor index 32 +nullColor rgb 60928 46592 11008 smartRefresh fastUpdate newPos @@ -374,14 +390,14 @@ w 100 h 24 controlPv "$(P)$(M).BDST" format "decimal" -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-14.0" fontAlign "left" -fgColor index 25 -bgColor index 5 +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 editable motifWidget limitsFromDb -nullColor index 32 +nullColor rgb 60928 46592 11008 smartRefresh fastUpdate newPos @@ -400,14 +416,14 @@ w 100 h 24 controlPv "$(P)$(M).VELO" format "decimal" -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-14.0" fontAlign "left" -fgColor index 25 -bgColor index 5 +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 editable motifWidget limitsFromDb -nullColor index 32 +nullColor rgb 60928 46592 11008 smartRefresh fastUpdate newPos @@ -426,14 +442,14 @@ w 100 h 24 controlPv "$(P)$(M).BVEL" format "decimal" -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-14.0" fontAlign "left" -fgColor index 25 -bgColor index 5 +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 editable motifWidget limitsFromDb -nullColor index 32 +nullColor rgb 60928 46592 11008 smartRefresh fastUpdate newPos @@ -452,14 +468,14 @@ w 100 h 24 controlPv "$(P)$(M).VBAS" format "decimal" -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-14.0" fontAlign "left" -fgColor index 25 -bgColor index 5 +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 editable motifWidget limitsFromDb -nullColor index 32 +nullColor rgb 60928 46592 11008 smartRefresh fastUpdate newPos @@ -472,13 +488,13 @@ beginObjectProperties major 4 minor 1 release 1 -x 6 +x 4 y 256 -w 31 +w 35 h 18 -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-14.0" fontAlign "center" -fgColor index 14 +fgColor rgb 0 0 0 bgColor index 3 useDisplayBg value { @@ -496,9 +512,9 @@ x 150 y 256 w 31 h 18 -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-14.0" fontAlign "right" -fgColor index 14 +fgColor rgb 0 0 0 bgColor index 3 useDisplayBg value { @@ -531,14 +547,14 @@ w 100 h 25 controlPv "$(P)$(M).OFF" format "decimal" -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-14.0" fontAlign "left" -fgColor index 25 -bgColor index 5 +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 editable motifWidget limitsFromDb -nullColor index 32 +nullColor rgb 60928 46592 11008 smartRefresh fastUpdate newPos @@ -558,11 +574,11 @@ minor 1 release 1 x 301 y 256 -w 31 +w 32 h 18 -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-14.0" fontAlign "center" -fgColor index 14 +fgColor rgb 0 0 0 bgColor index 3 useDisplayBg value { @@ -582,14 +598,14 @@ w 100 h 24 controlPv "$(P)$(M).JVEL" format "decimal" -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-14.0" fontAlign "left" -fgColor index 25 -bgColor index 5 +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 editable motifWidget limitsFromDb -nullColor index 32 +nullColor rgb 60928 46592 11008 smartRefresh fastUpdate newPos @@ -608,14 +624,14 @@ w 100 h 24 controlPv "$(P)$(M).JAR" format "decimal" -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-14.0" fontAlign "left" -fgColor index 25 -bgColor index 5 +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 editable motifWidget limitsFromDb -nullColor index 32 +nullColor rgb 60928 46592 11008 smartRefresh fastUpdate newPos @@ -632,8 +648,8 @@ x 2 y 225 w 449 h 2 -lineColor index 54 -fillColor index 54 +lineColor rgb 2560 0 47104 +fillColor rgb 2560 0 47104 lineWidth 2 numPoints 2 { xPoints { @@ -656,9 +672,9 @@ x 0 y 225 w 119 h 21 -lineColor index 54 +lineColor rgb 2560 0 47104 fill -fillColor index 54 +fillColor rgb 2560 0 47104 lineWidth 0 endObjectProperties @@ -672,8 +688,8 @@ x 4 y 227 w 110 h 20 -font "helvetica-bold-r-12.0" -fgColor index 14 +font "helvetica-medium-r-14.0" +fgColor rgb 65280 65280 65280 bgColor index 3 useDisplayBg value { @@ -689,10 +705,10 @@ minor 1 release 1 x 3 y 320 -w 73 +w 104 h 17 -font "helvetica-bold-r-12.0" -fgColor index 14 +font "helvetica-medium-r-14.0" +fgColor rgb 0 0 0 bgColor index 3 useDisplayBg value { @@ -710,9 +726,9 @@ x 337 y 51 w 98 h 26 -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-18.0" fontAlign "center" -fgColor index 14 +fgColor rgb 2560 0 47104 bgColor index 3 useDisplayBg value { @@ -735,15 +751,15 @@ y 3 w 90 h 20 controlPv "$(P)$(M).EGU" -format "decimal" -font "helvetica-bold-r-12.0" +format "string" +font "helvetica-medium-r-12.0" fontAlign "left" -fgColor index 25 -bgColor index 5 +fgColor rgb 0 0 0 +bgColor rgb 60416 60416 60416 editable motifWidget limitsFromDb -nullColor index 32 +nullColor rgb 60928 46592 11008 smartRefresh fastUpdate newPos @@ -760,9 +776,9 @@ x 0 y 30 w 69 h 21 -lineColor index 54 +lineColor rgb 2560 0 47104 fill -fillColor index 54 +fillColor rgb 2560 0 47104 lineWidth 0 endObjectProperties @@ -776,8 +792,8 @@ x 4 y 31 w 80 h 20 -font "helvetica-bold-r-12.0" -fgColor index 14 +font "helvetica-medium-r-14.0" +fgColor rgb 65280 65280 65280 bgColor index 3 useDisplayBg value { @@ -791,13 +807,13 @@ beginObjectProperties major 4 minor 1 release 1 -x 285 +x 279 y 32 -w 30 +w 43 h 18 -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-14.0" fontAlign "center" -fgColor index 14 +fgColor rgb 64768 0 0 bgColor index 3 useDisplayBg value { @@ -819,8 +835,8 @@ x 241 y 190 w 47 h 22 -lineColor index 1 -fillColor index 1 +lineColor rgb 60416 60416 60416 +fillColor rgb 60416 60416 60416 lineWidth 2 visPv "CALC\\\{(A)\}($(P)$(M).HOMF)" visInvert @@ -838,8 +854,8 @@ x 190 y 190 w 47 h 22 -lineColor index 1 -fillColor index 1 +lineColor rgb 60416 60416 60416 +fillColor rgb 60416 60416 60416 lineWidth 2 visPv "CALC\\\{(A)\}($(P)$(M).HOMR)" visInvert @@ -859,14 +875,14 @@ w 56 h 22 controlPv "$(P)$(M).TWV" format "decimal" -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-12.0" fontAlign "left" -fgColor index 25 -bgColor index 5 +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 editable motifWidget limitsFromDb -nullColor index 32 +nullColor rgb 60928 46592 11008 smartRefresh fastUpdate newPos @@ -885,14 +901,14 @@ w 100 h 25 controlPv "$(P)$(M).RLV" format "decimal" -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-14.0" fontAlign "left" -fgColor index 25 -bgColor index 5 +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 editable motifWidget limitsFromDb -nullColor index 32 +nullColor rgb 60928 46592 11008 smartRefresh fastUpdate newPos @@ -909,9 +925,9 @@ x 83 y 32 w 100 h 20 -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-14.0" fontAlign "center" -fgColor index 14 +fgColor rgb 0 0 0 bgColor index 3 useDisplayBg value { @@ -929,9 +945,9 @@ x 187 y 32 w 100 h 20 -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-14.0" fontAlign "center" -fgColor index 14 +fgColor rgb 0 0 0 bgColor index 3 useDisplayBg value { @@ -945,13 +961,13 @@ beginObjectProperties major 4 minor 1 release 1 -x 285 +x 279 y 32 -w 30 +w 43 h 18 -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-14.0" fontAlign "center" -fgColor index 14 +fgColor rgb 64768 0 0 bgColor index 3 useDisplayBg value { @@ -975,12 +991,12 @@ w 100 h 18 controlPv "$(P)$(M).RBV" format "decimal" -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-14.0" fontAlign "left" -fgColor index 15 -bgColor index 12 +fgColor rgb 2560 0 47104 +bgColor rgb 51200 51200 51200 limitsFromDb -nullColor index 32 +nullColor rgb 60928 46592 11008 smartRefresh fastUpdate newPos @@ -999,12 +1015,12 @@ w 100 h 18 controlPv "$(P)$(M).DRBV" format "decimal" -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-14.0" fontAlign "left" -fgColor index 15 -bgColor index 12 +fgColor rgb 2560 0 47104 +bgColor rgb 51200 51200 51200 limitsFromDb -nullColor index 32 +nullColor rgb 60928 46592 11008 smartRefresh fastUpdate newPos @@ -1023,14 +1039,14 @@ w 100 h 25 controlPv "$(P)$(M).VAL" format "decimal" -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-14.0" fontAlign "left" -fgColor index 25 -bgColor index 5 +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 editable motifWidget limitsFromDb -nullColor index 32 +nullColor rgb 60928 46592 11008 smartRefresh fastUpdate newPos @@ -1049,14 +1065,14 @@ w 100 h 22 controlPv "$(P)$(M).LLM" format "decimal" -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-12.0" fontAlign "left" -fgColor index 25 -bgColor index 5 +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 editable motifWidget limitsFromDb -nullColor index 32 +nullColor rgb 60928 46592 11008 smartRefresh fastUpdate newPos @@ -1075,14 +1091,14 @@ w 100 h 22 controlPv "$(P)$(M).DHLM" format "decimal" -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-12.0" fontAlign "left" -fgColor index 25 -bgColor index 5 +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 editable motifWidget limitsFromDb -nullColor index 32 +nullColor rgb 60928 46592 11008 smartRefresh fastUpdate newPos @@ -1101,14 +1117,14 @@ w 100 h 22 controlPv "$(P)$(M).HLM" format "decimal" -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-12.0" fontAlign "left" -fgColor index 25 -bgColor index 5 +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 editable motifWidget limitsFromDb -nullColor index 32 +nullColor rgb 60928 46592 11008 smartRefresh fastUpdate newPos @@ -1127,14 +1143,14 @@ w 100 h 25 controlPv "$(P)$(M).DVAL" format "decimal" -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-14.0" fontAlign "left" -fgColor index 25 -bgColor index 5 +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 editable motifWidget limitsFromDb -nullColor index 32 +nullColor rgb 60928 46592 11008 smartRefresh fastUpdate newPos @@ -1153,14 +1169,14 @@ w 100 h 22 controlPv "$(P)$(M).DLLM" format "decimal" -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-12.0" fontAlign "left" -fgColor index 25 -bgColor index 5 +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 editable motifWidget limitsFromDb -nullColor index 32 +nullColor rgb 60928 46592 11008 smartRefresh fastUpdate newPos @@ -1177,9 +1193,9 @@ x 291 y 51 w 19 h 19 -lineColor index 20 +lineColor rgb 64768 0 0 fill -fillColor index 20 +fillColor rgb 64768 0 0 lineWidth 0 visPv "CALC\\\{(A)\}($(P)$(M).HLS)" visInvert @@ -1197,9 +1213,9 @@ x 291 y 133 w 19 h 19 -lineColor index 20 +lineColor rgb 64768 0 0 fill -fillColor index 20 +fillColor rgb 64768 0 0 lineWidth 0 visPv "CALC\\\{(A)\}($(P)$(M).LLS)" visInvert @@ -1217,9 +1233,9 @@ x 83 y 153 w 204 h 13 -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-10.0" fontAlign "center" -fgColor index 14 +fgColor rgb 64256 62208 18944 bgColor index 3 useDisplayBg value { @@ -1254,8 +1270,8 @@ x 82 y 78 w 204 h 16 -lineColor index 30 -fillColor index 30 +lineColor rgb 64256 62208 18944 +fillColor rgb 64256 62208 18944 lineWidth 2 visPv "CALC\\\{(A)\}($(P)$(M).SET)" visInvert @@ -1273,8 +1289,8 @@ x 80 y 76 w 208 h 20 -lineColor index 14 -fillColor index 14 +lineColor rgb 0 0 0 +fillColor rgb 0 0 0 lineWidth 2 visPv "CALC\\\{(A)\}($(P)$(M).SET)" visInvert @@ -1310,8 +1326,8 @@ x 5 y 196 w 75 h 19 -font "helvetica-bold-r-12.0" -fgColor index 14 +font "helvetica-medium-r-14.0" +fgColor rgb 0 0 0 bgColor index 3 useDisplayBg value { @@ -1329,8 +1345,8 @@ x 5 y 169 w 75 h 18 -font "helvetica-bold-r-12.0" -fgColor index 14 +font "helvetica-medium-r-14.0" +fgColor rgb 0 0 0 bgColor index 3 useDisplayBg value { @@ -1348,8 +1364,8 @@ x 5 y 135 w 75 h 18 -font "helvetica-bold-r-12.0" -fgColor index 14 +font "helvetica-medium-r-14.0" +fgColor rgb 0 0 0 bgColor index 3 useDisplayBg value { @@ -1365,10 +1381,10 @@ minor 1 release 1 x 5 y 105 -w 75 +w 78 h 18 -font "helvetica-bold-r-12.0" -fgColor index 14 +font "helvetica-medium-r-14.0" +fgColor rgb 0 0 0 bgColor index 3 useDisplayBg value { @@ -1384,10 +1400,10 @@ minor 1 release 1 x 5 y 78 -w 75 +w 78 h 18 -font "helvetica-bold-r-12.0" -fgColor index 14 +font "helvetica-medium-r-14.0" +fgColor rgb 0 0 0 bgColor index 3 useDisplayBg value { @@ -1405,8 +1421,8 @@ x 5 y 53 w 75 h 18 -font "helvetica-bold-r-12.0" -fgColor index 14 +font "helvetica-medium-r-14.0" +fgColor rgb 0 0 0 bgColor index 3 useDisplayBg value { @@ -1429,9 +1445,9 @@ x 340 y 32 w 73 h 18 -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-14.0" fontAlign "center" -fgColor index 14 +fgColor rgb 0 0 0 bgColor index 3 useDisplayBg value { @@ -1451,12 +1467,12 @@ w 100 h 19 controlPv "$(P)$(M).RRBV" format "decimal" -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-14.0" fontAlign "left" -fgColor index 15 -bgColor index 12 +fgColor rgb 2560 0 47104 +bgColor rgb 51200 51200 51200 limitsFromDb -nullColor index 32 +nullColor rgb 60928 46592 11008 smartRefresh fastUpdate newPos @@ -1473,9 +1489,9 @@ x 81 y 100 w 354 h 27 -lineColor index 30 +lineColor rgb 64256 62208 18944 fill -fillColor index 30 +fillColor rgb 64256 62208 18944 visPv "CALC\\\{(A)\}($(P)$(M).LVIO)" visInvert visMin 0 @@ -1494,14 +1510,14 @@ w 100 h 25 controlPv "$(P)$(M).RVAL" format "decimal" -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-14.0" fontAlign "left" -fgColor index 25 -bgColor index 5 +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 editable motifWidget limitsFromDb -nullColor index 32 +nullColor rgb 60928 46592 11008 smartRefresh fastUpdate newPos @@ -1514,13 +1530,13 @@ beginObjectProperties major 4 minor 1 release 1 -x 60 +x 55 y 93 -w 20 +w 30 h 13 -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-10.0" fontAlign "center" -fgColor index 14 +fgColor rgb 64256 62208 18944 bgColor index 3 useDisplayBg value { @@ -1532,22 +1548,6 @@ visMin 0 visMax 1 endObjectProperties -# (Rectangle) -object activeRectangleClass -beginObjectProperties -major 4 -minor 0 -release 0 -x 0 -y 0 -w 449 -h 25 -lineColor index 1 -fill -fillColor index 1 -lineWidth 0 -endObjectProperties - # (Text Control) object activeXTextDspClass beginObjectProperties @@ -1559,15 +1559,15 @@ y 0 w 190 h 27 controlPv "$(P)$(M).DESC" -format "decimal" -font "helvetica-bold-r-12.0" +format "string" +font "helvetica-medium-r-14.0" fontAlign "left" -fgColor index 25 -bgColor index 5 +fgColor rgb 2560 0 47104 +bgColor rgb 60416 60416 60416 editable motifWidget limitsFromDb -nullColor index 32 +nullColor rgb 60928 46592 11008 smartRefresh fastUpdate newPos @@ -1584,8 +1584,8 @@ x 0 y 27 w 449 h 3 -lineColor index 54 -fillColor index 54 +lineColor rgb 2560 0 47104 +fillColor rgb 2560 0 47104 lineWidth 3 numPoints 2 { xPoints { @@ -1608,9 +1608,9 @@ x 205 y 0 w 100 h 14 -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-12.0" fontAlign "center" -fgColor index 14 +fgColor rgb 0 0 0 bgColor index 3 useDisplayBg value { @@ -1629,13 +1629,13 @@ y 13 w 100 h 14 controlPv "$(P)$(M).DTYP" -format "decimal" -font "helvetica-bold-r-12.0" +format "string" +font "helvetica-medium-r-12.0" fontAlign "center" -fgColor index 15 -bgColor index 12 +fgColor rgb 2560 0 47104 +bgColor rgb 60416 60416 60416 limitsFromDb -nullColor index 32 +nullColor rgb 60928 46592 11008 smartRefresh fastUpdate newPos @@ -1656,10 +1656,10 @@ controlPv "$(P)$(M).LVIO" format "decimal" font "helvetica-bold-r-12.0" fontAlign "center" -fgColor index 15 -bgColor index 12 +fgColor rgb 64256 62208 18944 +bgColor rgb 47872 47872 47872 limitsFromDb -nullColor index 32 +nullColor rgb 60928 46592 11008 smartRefresh fastUpdate newPos @@ -1676,9 +1676,9 @@ x 315 y 52 w 130 h 20 -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-14.0" fontAlign "center" -fgColor index 14 +fgColor rgb 64256 62208 18944 bgColor index 3 useDisplayBg value { @@ -1700,8 +1700,8 @@ x 0 y 0 w 10 h 10 -font "helvetica-bold-r-12.0" -fgColor index 14 +font "helvetica-medium-r-8.0" +fgColor rgb 65280 65280 65280 bgColor index 3 useDisplayBg value { @@ -1719,9 +1719,9 @@ x 335 y 49 w 98 h 26 -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-18.0" fontAlign "center" -fgColor index 14 +fgColor rgb 39168 65280 65280 bgColor index 3 useDisplayBg value { @@ -1743,8 +1743,8 @@ x 200 y 285 w 0 h 187 -lineColor index 54 -fillColor index 54 +lineColor rgb 2560 0 47104 +fillColor rgb 2560 0 47104 lineWidth 0 numPoints 2 { xPoints { @@ -1767,8 +1767,8 @@ x 313 y 285 w 0 h 187 -lineColor index 54 -fillColor index 54 +lineColor rgb 2560 0 47104 +fillColor rgb 2560 0 47104 lineWidth 0 numPoints 2 { xPoints { @@ -1802,10 +1802,10 @@ minor 1 release 1 x 425 y 318 -w 20 +w 26 h 10 -font "helvetica-bold-r-12.0" -fgColor index 14 +font "helvetica-medium-r-8.0" +fgColor rgb 0 0 0 bgColor index 3 useDisplayBg value { @@ -1823,8 +1823,8 @@ x 425 y 328 w 20 h 10 -font "helvetica-bold-r-12.0" -fgColor index 14 +font "helvetica-medium-r-8.0" +fgColor rgb 0 0 0 bgColor index 3 useDisplayBg value { @@ -1842,8 +1842,8 @@ x 423 y 328 w 22 h 0 -lineColor index 14 -fillColor index 14 +lineColor rgb 0 0 0 +fillColor rgb 0 0 0 lineWidth 0 numPoints 2 { xPoints { @@ -1882,10 +1882,10 @@ minor 1 release 1 x 425 y 345 -w 20 +w 26 h 10 -font "helvetica-bold-r-12.0" -fgColor index 14 +font "helvetica-medium-r-8.0" +fgColor rgb 0 0 0 bgColor index 3 useDisplayBg value { @@ -1903,8 +1903,8 @@ x 425 y 355 w 20 h 10 -font "helvetica-bold-r-12.0" -fgColor index 14 +font "helvetica-medium-r-8.0" +fgColor rgb 0 0 0 bgColor index 3 useDisplayBg value { @@ -1922,8 +1922,8 @@ x 423 y 355 w 22 h 0 -lineColor index 14 -fillColor index 14 +lineColor rgb 0 0 0 +fillColor rgb 0 0 0 lineWidth 0 numPoints 2 { xPoints { @@ -1962,10 +1962,10 @@ minor 1 release 1 x 425 y 372 -w 20 +w 26 h 10 -font "helvetica-bold-r-12.0" -fgColor index 14 +font "helvetica-medium-r-8.0" +fgColor rgb 0 0 0 bgColor index 3 useDisplayBg value { @@ -1983,8 +1983,8 @@ x 425 y 382 w 20 h 10 -font "helvetica-bold-r-12.0" -fgColor index 14 +font "helvetica-medium-r-8.0" +fgColor rgb 0 0 0 bgColor index 3 useDisplayBg value { @@ -2002,8 +2002,8 @@ x 423 y 382 w 22 h 0 -lineColor index 14 -fillColor index 14 +lineColor rgb 0 0 0 +fillColor rgb 0 0 0 lineWidth 0 numPoints 2 { xPoints { @@ -2029,10 +2029,10 @@ minor 1 release 1 x 424 y 425 -w 20 +w 34 h 12 -font "helvetica-bold-r-12.0" -fgColor index 14 +font "helvetica-medium-r-10.0" +fgColor rgb 0 0 0 bgColor index 3 useDisplayBg value { @@ -2048,10 +2048,10 @@ minor 1 release 1 x 58 y 401 -w 20 +w 26 h 13 -font "helvetica-bold-r-12.0" -fgColor index 14 +font "helvetica-medium-r-10.0" +fgColor rgb 0 0 0 bgColor index 3 useDisplayBg value { @@ -2067,10 +2067,10 @@ minor 1 release 1 x 321 y 7 -w 20 +w 37 h 13 -font "helvetica-bold-r-12.0" -fgColor index 14 +font "helvetica-medium-r-10.0" +fgColor rgb 0 0 0 bgColor index 3 useDisplayBg value { @@ -2099,10 +2099,10 @@ minor 1 release 1 x 425 y 398 -w 20 +w 26 h 10 -font "helvetica-bold-r-12.0" -fgColor index 14 +font "helvetica-medium-r-8.0" +fgColor rgb 0 0 0 bgColor index 3 useDisplayBg value { @@ -2118,10 +2118,10 @@ minor 1 release 1 x 420 y 410 -w 28 +w 30 h 10 -font "helvetica-bold-r-12.0" -fgColor index 14 +font "helvetica-medium-r-8.0" +fgColor rgb 0 0 0 bgColor index 3 useDisplayBg value { @@ -2139,8 +2139,8 @@ x 423 y 408 w 22 h 0 -lineColor index 14 -fillColor index 14 +lineColor rgb 0 0 0 +fillColor rgb 0 0 0 lineWidth 0 numPoints 2 { xPoints { @@ -2168,8 +2168,8 @@ x 241 y 164 w 47 h 22 -lineColor index 1 -fillColor index 1 +lineColor rgb 60416 60416 60416 +fillColor rgb 60416 60416 60416 lineWidth 2 visPv "CALC\\\{(A)\}($(P)$(M).JOGF)" visInvert @@ -2187,8 +2187,8 @@ x 191 y 165 w 47 h 22 -lineColor index 1 -fillColor index 1 +lineColor rgb 60416 60416 60416 +fillColor rgb 60416 60416 60416 lineWidth 2 visPv "CALC\\\{(A)\}($(P)$(M).JOGR)" visInvert @@ -2206,8 +2206,8 @@ x 258 y 528 w 3 h 346 -lineColor index 54 -fillColor index 54 +lineColor rgb 2560 0 47104 +fillColor rgb 2560 0 47104 lineWidth 2 numPoints 2 { xPoints { @@ -2230,9 +2230,9 @@ x 0 y 531 w 109 h 21 -lineColor index 54 +lineColor rgb 2560 0 47104 fill -fillColor index 54 +fillColor rgb 2560 0 47104 lineWidth 0 endObjectProperties @@ -2246,8 +2246,8 @@ x 3 y 561 w 130 h 18 -font "helvetica-bold-r-12.0" -fgColor index 14 +font "helvetica-medium-r-14.0" +fgColor rgb 0 0 0 bgColor index 3 useDisplayBg value { @@ -2265,8 +2265,8 @@ x 3 y 586 w 130 h 18 -font "helvetica-bold-r-12.0" -fgColor index 14 +font "helvetica-medium-r-14.0" +fgColor rgb 0 0 0 bgColor index 3 useDisplayBg value { @@ -2284,8 +2284,8 @@ x 3 y 611 w 130 h 18 -font "helvetica-bold-r-12.0" -fgColor index 14 +font "helvetica-medium-r-14.0" +fgColor rgb 0 0 0 bgColor index 3 useDisplayBg value { @@ -2303,8 +2303,8 @@ x 3 y 636 w 130 h 18 -font "helvetica-bold-r-12.0" -fgColor index 14 +font "helvetica-medium-r-14.0" +fgColor rgb 0 0 0 bgColor index 3 useDisplayBg value { @@ -2322,8 +2322,8 @@ x 3 y 661 w 60 h 18 -font "helvetica-bold-r-12.0" -fgColor index 14 +font "helvetica-medium-r-14.0" +fgColor rgb 0 0 0 bgColor index 3 useDisplayBg value { @@ -2341,8 +2341,8 @@ x 3 y 686 w 130 h 18 -font "helvetica-bold-r-12.0" -fgColor index 14 +font "helvetica-medium-r-14.0" +fgColor rgb 0 0 0 bgColor index 3 useDisplayBg value { @@ -2360,8 +2360,8 @@ x 3 y 736 w 130 h 18 -font "helvetica-bold-r-12.0" -fgColor index 14 +font "helvetica-medium-r-14.0" +fgColor rgb 0 0 0 bgColor index 3 useDisplayBg value { @@ -2377,10 +2377,10 @@ minor 1 release 1 x 3 y 761 -w 80 +w 84 h 18 -font "helvetica-bold-r-12.0" -fgColor index 14 +font "helvetica-medium-r-14.0" +fgColor rgb 0 0 0 bgColor index 3 useDisplayBg value { @@ -2400,14 +2400,14 @@ w 94 h 25 controlPv "$(P)$(M).MRES" format "decimal" -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-14.0" fontAlign "left" -fgColor index 25 -bgColor index 5 +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 editable motifWidget limitsFromDb -nullColor index 32 +nullColor rgb 60928 46592 11008 smartRefresh fastUpdate newPos @@ -2426,14 +2426,14 @@ w 94 h 25 controlPv "$(P)$(M).ERES" format "decimal" -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-14.0" fontAlign "left" -fgColor index 25 -bgColor index 5 +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 editable motifWidget limitsFromDb -nullColor index 32 +nullColor rgb 60928 46592 11008 smartRefresh fastUpdate newPos @@ -2452,14 +2452,14 @@ w 94 h 25 controlPv "$(P)$(M).RDBD" format "decimal" -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-14.0" fontAlign "left" -fgColor index 25 -bgColor index 5 +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 editable motifWidget limitsFromDb -nullColor index 32 +nullColor rgb 60928 46592 11008 smartRefresh fastUpdate newPos @@ -2478,14 +2478,14 @@ w 64 h 25 controlPv "$(P)$(M).RTRY" format "decimal" -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-14.0" fontAlign "left" -fgColor index 25 -bgColor index 5 +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 editable motifWidget limitsFromDb -nullColor index 32 +nullColor rgb 60928 46592 11008 smartRefresh fastUpdate newPos @@ -2502,8 +2502,8 @@ x 129 y 661 w 44 h 18 -font "helvetica-bold-r-12.0" -fgColor index 14 +font "helvetica-medium-r-14.0" +fgColor rgb 0 0 0 bgColor index 3 useDisplayBg value { @@ -2523,12 +2523,12 @@ w 50 h 18 controlPv "$(P)$(M).RCNT" format "decimal" -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-14.0" fontAlign "left" -fgColor index 15 -bgColor index 12 +fgColor rgb 2560 0 47104 +bgColor rgb 51200 51200 51200 limitsFromDb -nullColor index 32 +nullColor rgb 60928 46592 11008 smartRefresh fastUpdate newPos @@ -2545,8 +2545,8 @@ x 268 y 578 w 73 h 18 -font "helvetica-bold-r-12.0" -fgColor index 14 +font "helvetica-medium-r-14.0" +fgColor rgb 0 0 0 bgColor index 3 useDisplayBg value { @@ -2566,12 +2566,12 @@ w 100 h 18 controlPv "$(P)$(M).TDIR" format "decimal" -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-14.0" fontAlign "left" -fgColor index 15 -bgColor index 12 +fgColor rgb 2560 0 47104 +bgColor rgb 51200 51200 51200 limitsFromDb -nullColor index 32 +nullColor rgb 60928 46592 11008 smartRefresh fastUpdate newPos @@ -2588,8 +2588,8 @@ x 268 y 598 w 73 h 18 -font "helvetica-bold-r-12.0" -fgColor index 14 +font "helvetica-medium-r-14.0" +fgColor rgb 0 0 0 bgColor index 3 useDisplayBg value { @@ -2609,12 +2609,12 @@ w 100 h 18 controlPv "$(P)$(M).MOVN" format "decimal" -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-14.0" fontAlign "left" -fgColor index 15 -bgColor index 12 +fgColor rgb 2560 0 47104 +bgColor rgb 51200 51200 51200 limitsFromDb -nullColor index 32 +nullColor rgb 60928 46592 11008 smartRefresh fastUpdate newPos @@ -2633,12 +2633,12 @@ w 100 h 18 controlPv "$(P)$(M).MSTA" format "hex" -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-14.0" fontAlign "left" -fgColor index 15 -bgColor index 12 +fgColor rgb 2560 0 47104 +bgColor rgb 51200 51200 51200 limitsFromDb -nullColor index 32 +nullColor rgb 60928 46592 11008 smartRefresh fastUpdate newPos @@ -2655,8 +2655,8 @@ x 268 y 558 w 73 h 18 -font "helvetica-bold-r-12.0" -fgColor index 14 +font "helvetica-medium-r-14.0" +fgColor rgb 0 0 0 bgColor index 3 useDisplayBg value { @@ -2674,8 +2674,8 @@ x 268 y 618 w 73 h 18 -font "helvetica-bold-r-12.0" -fgColor index 14 +font "helvetica-medium-r-14.0" +fgColor rgb 0 0 0 bgColor index 3 useDisplayBg value { @@ -2693,8 +2693,8 @@ x 268 y 658 w 73 h 18 -font "helvetica-bold-r-12.0" -fgColor index 14 +font "helvetica-medium-r-14.0" +fgColor rgb 0 0 0 bgColor index 3 useDisplayBg value { @@ -2710,10 +2710,10 @@ minor 1 release 1 x 268 y 638 -w 73 +w 77 h 18 -font "helvetica-bold-r-12.0" -fgColor index 14 +font "helvetica-medium-r-14.0" +fgColor rgb 0 0 0 bgColor index 3 useDisplayBg value { @@ -2731,8 +2731,8 @@ x 268 y 678 w 73 h 18 -font "helvetica-bold-r-12.0" -fgColor index 14 +font "helvetica-medium-r-14.0" +fgColor rgb 0 0 0 bgColor index 3 useDisplayBg value { @@ -2752,12 +2752,12 @@ w 100 h 18 controlPv "$(P)$(M).DIFF" format "decimal" -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-14.0" fontAlign "left" -fgColor index 15 -bgColor index 12 +fgColor rgb 2560 0 47104 +bgColor rgb 51200 51200 51200 limitsFromDb -nullColor index 32 +nullColor rgb 60928 46592 11008 smartRefresh fastUpdate newPos @@ -2774,8 +2774,8 @@ x 267 y 698 w 73 h 18 -font "helvetica-bold-r-12.0" -fgColor index 14 +font "helvetica-medium-r-14.0" +fgColor rgb 0 0 0 bgColor index 3 useDisplayBg value { @@ -2795,12 +2795,12 @@ w 100 h 18 controlPv "$(P)$(M).ATHM" format "decimal" -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-14.0" fontAlign "left" -fgColor index 15 -bgColor index 12 +fgColor rgb 2560 0 47104 +bgColor rgb 51200 51200 51200 limitsFromDb -nullColor index 32 +nullColor rgb 60928 46592 11008 smartRefresh fastUpdate newPos @@ -2819,12 +2819,12 @@ w 100 h 18 controlPv "$(P)$(M).REP" format "decimal" -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-14.0" fontAlign "left" -fgColor index 15 -bgColor index 12 +fgColor rgb 2560 0 47104 +bgColor rgb 51200 51200 51200 limitsFromDb -nullColor index 32 +nullColor rgb 60928 46592 11008 smartRefresh fastUpdate newPos @@ -2843,12 +2843,12 @@ w 100 h 18 controlPv "$(P)$(M).RMP" format "decimal" -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-14.0" fontAlign "left" -fgColor index 15 -bgColor index 12 +fgColor rgb 2560 0 47104 +bgColor rgb 51200 51200 51200 limitsFromDb -nullColor index 32 +nullColor rgb 60928 46592 11008 smartRefresh fastUpdate newPos @@ -2867,12 +2867,12 @@ w 100 h 18 controlPv "$(P)$(M).MIP" format "hex" -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-14.0" fontAlign "left" -fgColor index 15 -bgColor index 12 +fgColor rgb 2560 0 47104 +bgColor rgb 51200 51200 51200 limitsFromDb -nullColor index 32 +nullColor rgb 60928 46592 11008 smartRefresh fastUpdate newPos @@ -2891,14 +2891,14 @@ w 94 h 25 controlPv "$(P)$(M).RRES" format "decimal" -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-14.0" fontAlign "left" -fgColor index 25 -bgColor index 5 +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 editable motifWidget limitsFromDb -nullColor index 32 +nullColor rgb 60928 46592 11008 smartRefresh fastUpdate newPos @@ -2913,10 +2913,10 @@ minor 1 release 1 x 267 y 738 -w 73 +w 90 h 18 -font "helvetica-bold-r-12.0" -fgColor index 14 +font "helvetica-medium-r-14.0" +fgColor rgb 0 0 0 bgColor index 3 useDisplayBg value { @@ -2936,12 +2936,12 @@ w 100 h 18 controlPv "$(P)$(M).VERS" format "decimal" -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-14.0" fontAlign "left" -fgColor index 15 -bgColor index 12 +fgColor rgb 2560 0 47104 +bgColor rgb 51200 51200 51200 limitsFromDb -nullColor index 32 +nullColor rgb 60928 46592 11008 smartRefresh fastUpdate newPos @@ -2958,8 +2958,8 @@ x 267 y 718 w 73 h 18 -font "helvetica-bold-r-12.0" -fgColor index 14 +font "helvetica-medium-r-14.0" +fgColor rgb 0 0 0 bgColor index 3 useDisplayBg value { @@ -2979,14 +2979,14 @@ w 100 h 20 controlPv "$(P)$(M).PREC" format "decimal" -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-12.0" fontAlign "left" -fgColor index 25 -bgColor index 5 +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 editable motifWidget limitsFromDb -nullColor index 32 +nullColor rgb 60928 46592 11008 smartRefresh fastUpdate newPos @@ -3001,10 +3001,10 @@ minor 1 release 1 x 267 y 761 -w 73 +w 74 h 18 -font "helvetica-bold-r-12.0" -fgColor index 14 +font "helvetica-medium-r-14.0" +fgColor rgb 0 0 0 bgColor index 3 useDisplayBg value { @@ -3024,12 +3024,12 @@ w 100 h 18 controlPv "$(P)$(M).CARD" format "decimal" -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-14.0" fontAlign "left" -fgColor index 15 -bgColor index 12 +fgColor rgb 2560 0 47104 +bgColor rgb 51200 51200 51200 limitsFromDb -nullColor index 32 +nullColor rgb 60928 46592 11008 smartRefresh fastUpdate newPos @@ -3048,14 +3048,14 @@ w 94 h 25 controlPv "$(P)$(M).DLY" format "decimal" -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-14.0" fontAlign "left" -fgColor index 25 -bgColor index 5 +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 editable motifWidget limitsFromDb -nullColor index 32 +nullColor rgb 60928 46592 11008 smartRefresh fastUpdate newPos @@ -3074,14 +3074,14 @@ w 140 h 25 controlPv "$(P)$(M).RDBL" format "string" -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-14.0" fontAlign "left" -fgColor index 25 -bgColor index 5 +fgColor rgb 0 0 0 +bgColor rgb 41984 43520 65280 editable motifWidget limitsFromDb -nullColor index 32 +nullColor rgb 60928 46592 11008 smartRefresh fastUpdate newPos @@ -3096,10 +3096,10 @@ minor 1 release 1 x 267 y 783 -w 50 +w 60 h 18 -font "helvetica-bold-r-12.0" -fgColor index 14 +font "helvetica-medium-r-14.0" +fgColor rgb 0 0 0 bgColor index 3 useDisplayBg value { @@ -3117,8 +3117,8 @@ x 3 y 711 w 130 h 18 -font "helvetica-bold-r-12.0" -fgColor index 14 +font "helvetica-medium-r-14.0" +fgColor rgb 0 0 0 bgColor index 3 useDisplayBg value { @@ -3136,9 +3136,9 @@ x -1 y 532 w 110 h 20 -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-14.0" fontAlign "center" -fgColor index 14 +fgColor rgb 65280 65280 65280 bgColor index 3 useDisplayBg value { @@ -3167,10 +3167,10 @@ minor 1 release 1 x 234 y 560 -w 20 +w 26 h 10 -font "helvetica-bold-r-12.0" -fgColor index 14 +font "helvetica-medium-r-8.0" +fgColor rgb 0 0 0 bgColor index 3 useDisplayBg value { @@ -3186,10 +3186,10 @@ minor 1 release 1 x 231 y 570 -w 20 +w 24 h 10 -font "helvetica-bold-r-12.0" -fgColor index 14 +font "helvetica-medium-r-8.0" +fgColor rgb 0 0 0 bgColor index 3 useDisplayBg value { @@ -3207,8 +3207,8 @@ x 232 y 570 w 22 h 0 -lineColor index 14 -fillColor index 14 +lineColor rgb 0 0 0 +fillColor rgb 0 0 0 lineWidth 0 numPoints 2 { xPoints { @@ -3247,10 +3247,10 @@ minor 1 release 1 x 234 y 586 -w 20 +w 26 h 10 -font "helvetica-bold-r-12.0" -fgColor index 14 +font "helvetica-medium-r-8.0" +fgColor rgb 0 0 0 bgColor index 3 useDisplayBg value { @@ -3266,10 +3266,10 @@ minor 1 release 1 x 231 y 596 -w 20 +w 24 h 10 -font "helvetica-bold-r-12.0" -fgColor index 14 +font "helvetica-medium-r-8.0" +fgColor rgb 0 0 0 bgColor index 3 useDisplayBg value { @@ -3287,8 +3287,8 @@ x 232 y 596 w 22 h 0 -lineColor index 14 -fillColor index 14 +lineColor rgb 0 0 0 +fillColor rgb 0 0 0 lineWidth 0 numPoints 2 { xPoints { @@ -3327,10 +3327,10 @@ minor 1 release 1 x 234 y 612 -w 20 +w 26 h 10 -font "helvetica-bold-r-12.0" -fgColor index 14 +font "helvetica-medium-r-8.0" +fgColor rgb 0 0 0 bgColor index 3 useDisplayBg value { @@ -3346,10 +3346,10 @@ minor 1 release 1 x 231 y 622 -w 20 +w 24 h 10 -font "helvetica-bold-r-12.0" -fgColor index 14 +font "helvetica-medium-r-8.0" +fgColor rgb 0 0 0 bgColor index 3 useDisplayBg value { @@ -3367,8 +3367,8 @@ x 232 y 622 w 22 h 0 -lineColor index 14 -fillColor index 14 +lineColor rgb 0 0 0 +fillColor rgb 0 0 0 lineWidth 0 numPoints 2 { xPoints { @@ -3394,10 +3394,10 @@ minor 1 release 1 x 232 y 639 -w 20 +w 34 h 13 -font "helvetica-bold-r-12.0" -fgColor index 14 +font "helvetica-medium-r-10.0" +fgColor rgb 0 0 0 bgColor index 3 useDisplayBg value { @@ -3413,10 +3413,10 @@ minor 1 release 1 x 232 y 739 -w 20 +w 26 h 13 -font "helvetica-bold-r-12.0" -fgColor index 14 +font "helvetica-medium-r-10.0" +fgColor rgb 0 0 0 bgColor index 3 useDisplayBg value { @@ -3436,13 +3436,13 @@ w 88 h 16 controlPv "$(P)$(M).STAT" format "decimal" -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-14.0" fontAlign "center" -fgColor index 15 +fgColor rgb 0 65535 0 fgAlarm -bgColor index 12 +bgColor rgb 51200 51200 51200 limitsFromDb -nullColor index 32 +nullColor rgb 60928 46592 11008 smartRefresh fastUpdate newPos @@ -3474,14 +3474,14 @@ w 150 h 20 controlPv "$(P)$(M).FLNK" format "string" -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-12.0" fontAlign "left" -fgColor index 25 -bgColor index 5 +fgColor rgb 0 0 0 +bgColor rgb 41984 43520 65280 editable motifWidget limitsFromDb -nullColor index 32 +nullColor rgb 60928 46592 11008 smartRefresh fastUpdate newPos @@ -3498,8 +3498,8 @@ x 267 y 807 w 30 h 10 -font "helvetica-bold-r-12.0" -fgColor index 14 +font "helvetica-medium-r-8.0" +fgColor rgb 0 0 0 bgColor index 3 useDisplayBg value { @@ -3517,8 +3517,8 @@ x 267 y 817 w 30 h 10 -font "helvetica-bold-r-12.0" -fgColor index 14 +font "helvetica-medium-r-8.0" +fgColor rgb 0 0 0 bgColor index 3 useDisplayBg value { @@ -3541,8 +3541,8 @@ x 0 y 529 w 449 h 2 -lineColor index 54 -fillColor index 54 +lineColor rgb 2560 0 47104 +fillColor rgb 2560 0 47104 lineWidth 2 numPoints 2 { xPoints { @@ -3565,9 +3565,9 @@ x 0 y 473 w 59 h 20 -lineColor index 54 +lineColor rgb 2560 0 47104 fill -fillColor index 54 +fillColor rgb 2560 0 47104 lineWidth 0 endObjectProperties @@ -3581,8 +3581,8 @@ x 1 y 473 w 449 h 2 -lineColor index 54 -fillColor index 54 +lineColor rgb 2560 0 47104 +fillColor rgb 2560 0 47104 lineWidth 2 numPoints 2 { xPoints { @@ -3601,13 +3601,13 @@ beginObjectProperties major 4 minor 1 release 1 -x 4 +x 3 y 474 -w 50 +w 52 h 20 -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-14.0" fontAlign "center" -fgColor index 14 +fgColor rgb 65280 65280 65280 bgColor index 3 useDisplayBg value { @@ -3625,9 +3625,9 @@ x 94 y 478 w 100 h 19 -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-14.0" fontAlign "center" -fgColor index 14 +fgColor rgb 0 0 0 bgColor index 3 useDisplayBg value { @@ -3645,9 +3645,9 @@ x 206 y 478 w 100 h 19 -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-14.0" fontAlign "center" -fgColor index 14 +fgColor rgb 0 0 0 bgColor index 3 useDisplayBg value { @@ -3665,9 +3665,9 @@ x 318 y 478 w 100 h 19 -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-14.0" fontAlign "center" -fgColor index 14 +fgColor rgb 0 0 0 bgColor index 3 useDisplayBg value { @@ -3685,8 +3685,8 @@ x 200 y 473 w 0 h 55 -lineColor index 54 -fillColor index 54 +lineColor rgb 2560 0 47104 +fillColor rgb 2560 0 47104 lineWidth 0 numPoints 2 { xPoints { @@ -3709,8 +3709,8 @@ x 313 y 473 w 0 h 55 -lineColor index 54 -fillColor index 54 +lineColor rgb 2560 0 47104 +fillColor rgb 2560 0 47104 lineWidth 0 numPoints 2 { xPoints { @@ -3735,14 +3735,14 @@ w 100 h 24 controlPv "$(P)$(M).PCOF" format "decimal" -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-14.0" fontAlign "left" -fgColor index 25 -bgColor index 5 +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 editable motifWidget limitsFromDb -nullColor index 32 +nullColor rgb 60928 46592 11008 smartRefresh fastUpdate newPos @@ -3761,14 +3761,14 @@ w 100 h 24 controlPv "$(P)$(M).ICOF" format "decimal" -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-14.0" fontAlign "left" -fgColor index 25 -bgColor index 5 +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 editable motifWidget limitsFromDb -nullColor index 32 +nullColor rgb 60928 46592 11008 smartRefresh fastUpdate newPos @@ -3787,14 +3787,14 @@ w 100 h 24 controlPv "$(P)$(M).DCOF" format "decimal" -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-14.0" fontAlign "left" -fgColor index 25 -bgColor index 5 +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 editable motifWidget limitsFromDb -nullColor index 32 +nullColor rgb 60928 46592 11008 smartRefresh fastUpdate newPos @@ -3811,9 +3811,9 @@ x 4 y 850 w 149 h 23 -lineColor index 14 +lineColor rgb 0 0 0 fill -fillColor index 14 +fillColor rgb 0 0 0 lineWidth 0 endObjectProperties @@ -3827,8 +3827,8 @@ x 0 y 842 w 260 h 3 -lineColor index 54 -fillColor index 54 +lineColor rgb 2560 0 47104 +fillColor rgb 2560 0 47104 lineWidth 2 numPoints 2 { xPoints { @@ -3851,8 +3851,8 @@ x 3 y 786 w 130 h 18 -font "helvetica-bold-r-12.0" -fgColor index 14 +font "helvetica-medium-r-14.0" +fgColor rgb 0 0 0 bgColor index 3 useDisplayBg value { @@ -3872,14 +3872,14 @@ w 94 h 25 controlPv "$(P)$(M).PREM" format "string" -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-14.0" fontAlign "left" -fgColor index 25 -bgColor index 5 +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 editable motifWidget limitsFromDb -nullColor index 32 +nullColor rgb 60928 46592 11008 smartRefresh fastUpdate newPos @@ -3896,8 +3896,8 @@ x 3 y 811 w 130 h 18 -font "helvetica-bold-r-12.0" -fgColor index 14 +font "helvetica-medium-r-14.0" +fgColor rgb 0 0 0 bgColor index 3 useDisplayBg value { @@ -3917,14 +3917,14 @@ w 94 h 25 controlPv "$(P)$(M).POST" format "string" -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-14.0" fontAlign "left" -fgColor index 25 -bgColor index 5 +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 editable motifWidget limitsFromDb -nullColor index 32 +nullColor rgb 60928 46592 11008 smartRefresh fastUpdate newPos @@ -3941,9 +3941,9 @@ x 315 y 42 w 130 h 20 -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-14.0" fontAlign "center" -fgColor index 14 +fgColor rgb 64256 62208 18944 bgColor index 3 useDisplayBg value { @@ -3965,9 +3965,9 @@ x 316 y 59 w 130 h 20 -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-14.0" fontAlign "center" -fgColor index 14 +fgColor rgb 64256 62208 18944 bgColor index 3 useDisplayBg value { @@ -3989,9 +3989,9 @@ x 3 y 850 w 60 h 22 -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-18.0" fontAlign "center" -fgColor index 14 +fgColor rgb 0 55296 0 bgColor index 3 useDisplayBg value { @@ -4009,9 +4009,9 @@ x 416 y 862 w 30 h 10 -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-8.0" fontAlign "center" -fgColor index 14 +fgColor rgb 0 0 0 bgColor index 3 useDisplayBg value { @@ -4029,8 +4029,8 @@ x 81 y 100 w 208 h 29 -lineColor index 20 -fillColor index 20 +lineColor rgb 64768 0 0 +fillColor rgb 64768 0 0 lineWidth 2 lineStyle "dash" visPv "CALC\\\{(A)\}($(P)$(M)_able.VAL)" @@ -4049,14 +4049,14 @@ x 37 y 253 w 100 h 21 -fgColor index 14 -bgColor index 51 -selectColor index 51 -inconsistentColor index 14 -topShadowColor index 0 -botShadowColor index 14 +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +selectColor rgb 29440 57088 65280 +inconsistentColor rgb 0 0 0 +topShadowColor rgb 65280 65280 65280 +botShadowColor rgb 0 0 0 controlPv "$(P)$(M).SET" -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-10.0" orientation "horizontal" endObjectProperties # (Group) @@ -4082,14 +4082,14 @@ x 186 y 232 w 100 h 18 -fgColor index 14 -bgColor index 51 -inconsistentColor index 12 -topShadowColor index 2 -botShadowColor index 12 +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +inconsistentColor rgb 17920 17920 17920 +topShadowColor rgb 55808 55808 55808 +botShadowColor rgb 17920 17920 17920 controlPv "$(P)$(M).FOFF" indicatorPv "$(P)$(M).FOFF" -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-10.0" endObjectProperties endGroup @@ -4107,14 +4107,14 @@ x 332 y 253 w 100 h 21 -fgColor index 14 -bgColor index 51 -selectColor index 51 -inconsistentColor index 14 -topShadowColor index 0 -botShadowColor index 14 +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +selectColor rgb 29440 57088 65280 +inconsistentColor rgb 0 0 0 +topShadowColor rgb 65280 65280 65280 +botShadowColor rgb 0 0 0 controlPv "$(P)$(M).DIR" -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-10.0" orientation "horizontal" endObjectProperties @@ -4128,11 +4128,11 @@ x 159 y 193 w 25 h 22 -fgColor index 14 -onColor index 51 -offColor index 51 -topShadowColor index 0 -botShadowColor index 14 +fgColor rgb 0 0 0 +onColor rgb 29440 57088 65280 +offColor rgb 29440 57088 65280 +topShadowColor rgb 65280 65280 65280 +botShadowColor rgb 0 0 0 controlPv "$(P)$(M).TWF" pressValue "1" releaseValue @@ -4140,7 +4140,7 @@ onLabel ">" offLabel ">" 3d useEnumNumeric -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-12.0" endObjectProperties # (Message Button) @@ -4153,11 +4153,11 @@ x 77 y 193 w 25 h 22 -fgColor index 14 -onColor index 51 -offColor index 51 -topShadowColor index 0 -botShadowColor index 14 +fgColor rgb 0 0 0 +onColor rgb 29440 57088 65280 +offColor rgb 29440 57088 65280 +topShadowColor rgb 65280 65280 65280 +botShadowColor rgb 0 0 0 controlPv "$(P)$(M).TWR" pressValue "1" releaseValue @@ -4165,7 +4165,7 @@ onLabel "<" offLabel "<" 3d useEnumNumeric -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-12.0" endObjectProperties # (Message Button) @@ -4178,11 +4178,11 @@ x 192 y 166 w 45 h 20 -fgColor index 14 -onColor index 51 -offColor index 51 -topShadowColor index 0 -botShadowColor index 14 +fgColor rgb 0 0 0 +onColor rgb 29440 57088 65280 +offColor rgb 29440 57088 65280 +topShadowColor rgb 65280 65280 65280 +botShadowColor rgb 0 0 0 controlPv "$(P)$(M).JOGR" pressValue "1" releaseValue "0" @@ -4190,7 +4190,7 @@ onLabel "JogR" offLabel "JogR" 3d useEnumNumeric -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-12.0" endObjectProperties # (Message Button) @@ -4203,11 +4203,11 @@ x 242 y 166 w 45 h 20 -fgColor index 14 -onColor index 51 -offColor index 51 -topShadowColor index 0 -botShadowColor index 14 +fgColor rgb 0 0 0 +onColor rgb 29440 57088 65280 +offColor rgb 29440 57088 65280 +topShadowColor rgb 65280 65280 65280 +botShadowColor rgb 0 0 0 controlPv "$(P)$(M).JOGF" pressValue "1" releaseValue "0" @@ -4215,7 +4215,7 @@ onLabel "JogF" offLabel "JogF" 3d useEnumNumeric -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-12.0" endObjectProperties # (Message Button) @@ -4228,11 +4228,11 @@ x 242 y 191 w 45 h 20 -fgColor index 14 -onColor index 51 -offColor index 51 -topShadowColor index 0 -botShadowColor index 14 +fgColor rgb 0 0 0 +onColor rgb 29440 57088 65280 +offColor rgb 29440 57088 65280 +topShadowColor rgb 65280 65280 65280 +botShadowColor rgb 0 0 0 controlPv "$(P)$(M).HOMF" pressValue "1" releaseValue @@ -4240,7 +4240,7 @@ onLabel "HomF" offLabel "HomF" 3d useEnumNumeric -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-12.0" endObjectProperties # (Message Button) @@ -4253,11 +4253,11 @@ x 191 y 191 w 45 h 20 -fgColor index 14 -onColor index 51 -offColor index 51 -topShadowColor index 0 -botShadowColor index 14 +fgColor rgb 0 0 0 +onColor rgb 29440 57088 65280 +offColor rgb 29440 57088 65280 +topShadowColor rgb 65280 65280 65280 +botShadowColor rgb 0 0 0 controlPv "$(P)$(M).HOMR" pressValue "1" releaseValue @@ -4265,7 +4265,7 @@ onLabel "HomR" offLabel "HomR" 3d useEnumNumeric -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-12.0" endObjectProperties # (Group) object activeGroupClass @@ -4312,14 +4312,14 @@ x 299 y 171 w 80 h 40 -fgColor index 14 -bgColor index 51 -selectColor index 51 -inconsistentColor index 14 -topShadowColor index 0 -botShadowColor index 14 +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +selectColor rgb 29440 57088 65280 +inconsistentColor rgb 0 0 0 +topShadowColor rgb 65280 65280 65280 +botShadowColor rgb 0 0 0 controlPv "$(P)$(M)_able.VAL" -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-10.0" endObjectProperties # (Choice Button) @@ -4332,14 +4332,14 @@ x 384 y 132 w 60 h 80 -fgColor index 31 -bgColor index 20 -selectColor index 20 -inconsistentColor index 31 -topShadowColor index 0 -botShadowColor index 14 +fgColor rgb 63744 55808 15360 +bgColor rgb 64768 0 0 +selectColor rgb 64768 0 0 +inconsistentColor rgb 63744 55808 15360 +topShadowColor rgb 65280 65280 65280 +botShadowColor rgb 0 0 0 controlPv "$(P)$(M).SPMG" -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-10.0" endObjectProperties # (Group) object activeGroupClass @@ -4420,14 +4420,14 @@ x 134 y 683 w 94 h 25 -fgColor index 14 -bgColor index 51 -selectColor index 51 -inconsistentColor index 14 -topShadowColor index 0 -botShadowColor index 14 +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +selectColor rgb 29440 57088 65280 +inconsistentColor rgb 0 0 0 +topShadowColor rgb 65280 65280 65280 +botShadowColor rgb 0 0 0 controlPv "$(P)$(M).UEIP" -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-10.0" orientation "horizontal" endObjectProperties @@ -4441,14 +4441,14 @@ x 134 y 708 w 94 h 25 -fgColor index 14 -bgColor index 51 -selectColor index 51 -inconsistentColor index 14 -topShadowColor index 0 -botShadowColor index 14 +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +selectColor rgb 29440 57088 65280 +inconsistentColor rgb 0 0 0 +topShadowColor rgb 65280 65280 65280 +botShadowColor rgb 0 0 0 controlPv "$(P)$(M).URIP" -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-10.0" orientation "horizontal" endObjectProperties @@ -4462,14 +4462,14 @@ x 320 y 780 w 125 h 20 -fgColor index 14 -bgColor index 51 -selectColor index 51 -inconsistentColor index 14 -topShadowColor index 0 -botShadowColor index 14 +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +selectColor rgb 29440 57088 65280 +inconsistentColor rgb 0 0 0 +topShadowColor rgb 65280 65280 65280 +botShadowColor rgb 0 0 0 controlPv "$(P)$(M).CNEN" -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-10.0" orientation "horizontal" endObjectProperties # (Group) @@ -4534,11 +4534,11 @@ x 265 y 534 w 60 h 20 -fgColor index 0 -onColor index 54 -offColor index 54 -topShadowColor index 0 -botShadowColor index 14 +fgColor rgb 65280 65280 65280 +onColor rgb 2560 0 47104 +offColor rgb 2560 0 47104 +topShadowColor rgb 65280 65280 65280 +botShadowColor rgb 0 0 0 controlPv "$(P)$(M).STUP" pressValue "1" releaseValue @@ -4546,7 +4546,7 @@ onLabel "STATUS" offLabel "STATUS" 3d useEnumNumeric -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-12.0" endObjectProperties # (Group) object activeGroupClass @@ -4576,10 +4576,10 @@ x 346 y 558 w 93 h 18 -fgColor index 54 -bgColor index 3 -topShadowColor index 2 -botShadowColor index 12 +fgColor rgb 2560 0 47104 +bgColor rgb 51200 51200 51200 +topShadowColor rgb 55808 55808 55808 +botShadowColor rgb 17920 17920 17920 font "helvetica-bold-r-12.0" icon invisible @@ -4609,11 +4609,11 @@ x 193 y 852 w 40 h 20 -fgColor index 0 -bgColor index 17 -topShadowColor index 2 -botShadowColor index 12 -font "helvetica-bold-r-12.0" +fgColor rgb 65280 65280 65280 +bgColor rgb 13056 39168 0 +topShadowColor rgb 55808 55808 55808 +botShadowColor rgb 17920 17920 17920 +font "helvetica-medium-r-12.0" buttonLabel "More" numPvs 10 numDsps 5 @@ -4669,11 +4669,11 @@ x 111 y 852 w 40 h 20 -fgColor index 30 -onColor index 20 -offColor index 20 -topShadowColor index 0 -botShadowColor index 14 +fgColor rgb 64256 62208 18944 +onColor rgb 64768 0 0 +offColor rgb 64768 0 0 +topShadowColor rgb 65280 65280 65280 +botShadowColor rgb 0 0 0 controlPv "$(P)allstop.VAL" pressValue "1" releaseValue @@ -4681,7 +4681,7 @@ onLabel "Abort" offLabel "Abort" 3d useEnumNumeric -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-12.0" endObjectProperties # (Message Button) @@ -4694,11 +4694,11 @@ x 62 y 852 w 21 h 20 -fgColor index 14 -onColor index 51 -offColor index 51 -topShadowColor index 0 -botShadowColor index 14 +fgColor rgb 0 0 0 +onColor rgb 29440 57088 65280 +offColor rgb 29440 57088 65280 +topShadowColor rgb 65280 65280 65280 +botShadowColor rgb 0 0 0 controlPv "$(P)$(M):scanParms.LOAD" pressValue "1" releaseValue @@ -4706,7 +4706,7 @@ onLabel "Ld" offLabel "Ld" 3d useEnumNumeric -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-12.0" endObjectProperties # (Message Button) @@ -4719,11 +4719,11 @@ x 86 y 852 w 21 h 20 -fgColor index 14 -onColor index 51 -offColor index 51 -topShadowColor index 0 -botShadowColor index 14 +fgColor rgb 0 0 0 +onColor rgb 29440 57088 65280 +offColor rgb 29440 57088 65280 +topShadowColor rgb 65280 65280 65280 +botShadowColor rgb 0 0 0 controlPv "$(P)$(M):scanParms.GO" pressValue "1" releaseValue @@ -4731,7 +4731,7 @@ onLabel "Go" offLabel "Go" 3d useEnumNumeric -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-12.0" endObjectProperties # (Message Button) @@ -4744,11 +4744,11 @@ x 331 y 228 w 60 h 20 -fgColor index 0 -onColor index 54 -offColor index 54 -topShadowColor index 0 -botShadowColor index 14 +fgColor rgb 65280 65280 65280 +onColor rgb 2560 0 47104 +offColor rgb 2560 0 47104 +topShadowColor rgb 65280 65280 65280 +botShadowColor rgb 0 0 0 controlPv "$(P)$(M).SYNC" pressValue "1" releaseValue @@ -4756,6 +4756,6 @@ onLabel "SYNC" offLabel "SYNC" 3d useEnumNumeric -font "helvetica-bold-r-12.0" +font "helvetica-medium-r-12.0" endObjectProperties diff --git a/motorApp/op/opi/autoconvert/motorx_all.opi b/motorApp/op/opi/autoconvert/motorx_all.opi index da0c99f1..bad0c55a 100644 --- a/motorApp/op/opi/autoconvert/motorx_all.opi +++ b/motorApp/op/opi/autoconvert/motorx_all.opi @@ -29,7 +29,7 @@ Display 450 188 - 29 + 31 false @@ -54,7 +54,64 @@ 100.0 - Default + Default + + false + + + + false + 26 + true + + + + 0 + 0 + Rectangle + + + + + true + true + false + + + $(pv_name) +$(pv_value) + false + true + Rectangle + 450 + 0 + 0 + + + + false + 255 + true + false + + + + + + + false + + + + 0 + 1 + true + + + + 100.0 + + Default false @@ -121,7 +178,7 @@ $(pv_value) 100.0 - Default + Default false @@ -178,7 +235,7 @@ $(pv_value) 100.0 - Default + Default false @@ -235,7 +292,7 @@ $(pv_value) 100.0 - Default + Default false @@ -292,7 +349,7 @@ $(pv_value) 0.0 - Default + Default false @@ -359,7 +416,7 @@ $(pv_value) 0.0 - Default + Default false @@ -426,7 +483,7 @@ $(pv_value) 100.0 - Default + Default false @@ -469,63 +526,6 @@ $(pv_value) 81 100 - - - false - 255 - true - false - - - - - - - false - - - - 0 - 1 - true - - - - 100.0 - - Default - - false - - - - false - 26 - true - - - - 0 - 0 - Rectangle - - - - - true - true - false - - - $(pv_name) -$(pv_value) - false - true - Rectangle - 450 - 0 - 0 - false @@ -550,7 +550,7 @@ $(pv_value) 0.0 - Default + Default false @@ -617,7 +617,7 @@ $(pv_value) 0.0 - Default + Default false @@ -684,7 +684,7 @@ $(pv_value) 100.0 - Default + Default false @@ -741,7 +741,7 @@ $(pv_value) 100.0 - Default + Default false @@ -798,7 +798,7 @@ $(pv_value) 100.0 - Default + Default false @@ -855,7 +855,7 @@ $(pv_value) 0.0 - Default + Default false @@ -911,7 +911,7 @@ $(pv_value) true false - Default + Default @@ -953,7 +953,7 @@ $(pv_value) 1 true - Default + Default false @@ -998,7 +998,7 @@ $(pv_value) true - + false @@ -1057,7 +1057,7 @@ $(pv_value) true false - Default + Default @@ -1107,7 +1107,7 @@ $(pv_value) 0.0 - Default + Default false @@ -1174,7 +1174,7 @@ $(pv_value) 0.0 - Default + Default false @@ -1231,7 +1231,7 @@ $(pv_value) true false - Default + Default @@ -1270,7 +1270,7 @@ $(pv_value) 1 true - + @@ -1310,7 +1310,7 @@ $(pv_value) 1 true - + @@ -1350,7 +1350,7 @@ $(pv_value) 1 true - + @@ -1390,7 +1390,7 @@ $(pv_value) 1 true - + @@ -1430,7 +1430,7 @@ $(pv_value) 1 true - + @@ -1470,7 +1470,7 @@ $(pv_value) 1 true - + @@ -1511,7 +1511,7 @@ $(pv_value) true false - Default + Default @@ -1550,7 +1550,7 @@ $(pv_value) 1 true - + @@ -1590,7 +1590,7 @@ $(pv_value) 1 true - + @@ -1638,7 +1638,7 @@ $(pv_value) true 100.0 - Default + Default false @@ -1686,7 +1686,7 @@ $(pv_value) true false - Default + Default @@ -1725,7 +1725,7 @@ $(pv_value) 1 true - + @@ -1765,7 +1765,7 @@ $(pv_value) 1 true - + @@ -1813,7 +1813,7 @@ $(pv_value) true 100.0 - Default + Default false @@ -1861,7 +1861,7 @@ $(pv_value) true false - Default + Default @@ -1900,7 +1900,7 @@ $(pv_value) 1 true - + @@ -1940,7 +1940,7 @@ $(pv_value) 1 true - + @@ -1988,7 +1988,7 @@ $(pv_value) true 100.0 - Default + Default false @@ -2036,7 +2036,7 @@ $(pv_value) true false - Default + Default @@ -2075,7 +2075,7 @@ $(pv_value) 1 true - + @@ -2115,7 +2115,7 @@ $(pv_value) 1 true - + @@ -2163,7 +2163,7 @@ $(pv_value) true 100.0 - Default + Default false @@ -2211,7 +2211,7 @@ $(pv_value) true false - Default + Default @@ -2250,7 +2250,7 @@ $(pv_value) 1 true - + @@ -2290,7 +2290,7 @@ $(pv_value) 1 true - + @@ -2338,7 +2338,7 @@ $(pv_value) true 100.0 - Default + Default false @@ -2386,7 +2386,7 @@ $(pv_value) true false - Default + Default @@ -2425,7 +2425,7 @@ $(pv_value) 1 true - + @@ -2465,7 +2465,7 @@ $(pv_value) 1 true - + @@ -2513,7 +2513,7 @@ $(pv_value) true 100.0 - Default + Default false @@ -2561,7 +2561,7 @@ $(pv_value) true false - Default + Default @@ -2600,7 +2600,7 @@ $(pv_value) 1 true - + @@ -2640,7 +2640,7 @@ $(pv_value) 1 true - + @@ -2688,7 +2688,7 @@ $(pv_value) true 100.0 - Default + Default false @@ -2736,7 +2736,7 @@ $(pv_value) true false - Default + Default @@ -2779,7 +2779,7 @@ $(pv_value) true - + false @@ -2837,7 +2837,7 @@ $(pv_value) 1 true - + @@ -2877,7 +2877,7 @@ $(pv_value) 1 true - + @@ -2918,7 +2918,7 @@ $(pv_value) 1 true - + @@ -2958,7 +2958,7 @@ $(pv_value) 1 true - + @@ -2998,7 +2998,7 @@ $(pv_value) 1 true - + @@ -3038,7 +3038,7 @@ $(pv_value) 1 true - + @@ -3086,7 +3086,7 @@ $(pv_value) true 100.0 - Default + Default false @@ -3137,7 +3137,7 @@ $(pv_value) true - + false @@ -3199,7 +3199,7 @@ $(pv_value) true - + false @@ -3257,7 +3257,7 @@ $(pv_value) 1 true - + @@ -3297,7 +3297,7 @@ $(pv_value) 1 true - + @@ -3337,7 +3337,7 @@ $(pv_value) 1 true - + @@ -3377,7 +3377,7 @@ $(pv_value) 1 true - + @@ -3417,7 +3417,7 @@ $(pv_value) 1 true - + @@ -3461,7 +3461,7 @@ $(pv_value) true - + false @@ -3523,7 +3523,7 @@ $(pv_value) true - + false @@ -3585,7 +3585,7 @@ $(pv_value) true - + false @@ -3647,7 +3647,7 @@ $(pv_value) true - + false @@ -3709,7 +3709,7 @@ $(pv_value) true - + false @@ -3771,7 +3771,7 @@ $(pv_value) true - + false @@ -3829,7 +3829,7 @@ $(pv_value) 1 true - + @@ -3871,7 +3871,7 @@ $(pv_value) 1 true - Default + Default false @@ -3919,7 +3919,7 @@ $(pv_value) 1 true - + @@ -3959,7 +3959,7 @@ $(pv_value) 1 true - + @@ -4001,7 +4001,7 @@ $(pv_value) 1 true - Default + Default false @@ -4053,7 +4053,7 @@ $(pv_value) true - + false @@ -4115,7 +4115,7 @@ $(pv_value) true - + false @@ -4181,7 +4181,7 @@ $(pv_value) true 100.0 - Default + Default false @@ -4228,7 +4228,7 @@ $(pv_value) 1 true - + @@ -4268,7 +4268,7 @@ $(pv_value) 1 true - + @@ -4308,7 +4308,7 @@ $(pv_value) 1 true - + @@ -4363,13 +4363,13 @@ $(pv_value) true - + false - 1 + 4 20 0 false @@ -4421,7 +4421,7 @@ $(pv_value) 1 true - + @@ -4461,7 +4461,7 @@ $(pv_value) 1 true - + @@ -4521,7 +4521,7 @@ $(pv_value) 1 true - Default + Default false @@ -4574,7 +4574,7 @@ $(pv_value) 1 true - Default + Default false @@ -4621,7 +4621,7 @@ $(pv_value) true - + false @@ -4696,7 +4696,7 @@ $(pv_value) 1 true - Default + Default false @@ -4756,7 +4756,7 @@ $(pv_value) 1 true - Default + Default false @@ -4803,7 +4803,7 @@ $(pv_value) true - + false @@ -4871,7 +4871,7 @@ $(pv_value) 1 true - Default + Default false @@ -4924,7 +4924,7 @@ $(pv_value) 1 true - Default + Default false @@ -4967,7 +4967,7 @@ $(pv_value) 1 true - + @@ -5007,7 +5007,7 @@ $(pv_value) 1 true - + @@ -5047,7 +5047,7 @@ $(pv_value) 1 true - + @@ -5100,7 +5100,7 @@ $(pv_value) 1 true - + false @@ -5151,7 +5151,7 @@ $(pv_value) 1 true - + false @@ -5203,7 +5203,7 @@ $(pv_value) true - + false @@ -5265,7 +5265,7 @@ $(pv_value) true - + false @@ -5327,7 +5327,7 @@ $(pv_value) true - + false @@ -5389,7 +5389,7 @@ $(pv_value) true - + false @@ -5451,7 +5451,7 @@ $(pv_value) true - + false @@ -5513,7 +5513,7 @@ $(pv_value) true - + false @@ -5582,7 +5582,7 @@ $(pv_value) 100.0 - Default + Default false @@ -5649,7 +5649,7 @@ $(pv_value) 100.0 - Default + Default false @@ -5705,7 +5705,7 @@ $(pv_value) 1 true - + @@ -5755,7 +5755,7 @@ $(pv_value) 1 true - + @@ -5798,7 +5798,7 @@ $(pv_value) 1 true - + false @@ -5848,7 +5848,7 @@ $(pv_value) 1 true - Default + Default false @@ -5900,7 +5900,7 @@ $(pv_value) true - + false @@ -5958,7 +5958,7 @@ $(pv_value) 1 true - + @@ -6012,13 +6012,13 @@ $(pv_value) true - + false - 1 + 4 27 0 false @@ -6078,7 +6078,7 @@ $(pv_value) true 100.0 - Default + Default false @@ -6125,7 +6125,7 @@ $(pv_value) 1 true - + @@ -6168,13 +6168,13 @@ $(pv_value) 1 true - + false - 1 + 4 14 1 Text Update @@ -6219,7 +6219,7 @@ $(pv_value) 1 true - + false @@ -6267,7 +6267,7 @@ $(pv_value) 1 true - + @@ -6319,7 +6319,7 @@ $(pv_value) 1 true - Default + Default false @@ -6367,7 +6367,7 @@ $(pv_value) 1 true - + @@ -6407,7 +6407,7 @@ $(pv_value) 1 true - + @@ -6466,7 +6466,7 @@ $(pv_value) true 100.0 - Default + Default false @@ -6521,7 +6521,7 @@ $(pv_value) true 100.0 - Default + Default false @@ -6568,7 +6568,7 @@ $(pv_value) 1 true - + @@ -6608,7 +6608,7 @@ $(pv_value) 1 true - + @@ -6648,7 +6648,7 @@ $(pv_value) 1 true - + @@ -6696,7 +6696,7 @@ $(pv_value) true 100.0 - Default + Default false @@ -6743,7 +6743,7 @@ $(pv_value) 1 true - + @@ -6783,7 +6783,7 @@ $(pv_value) 1 true - + @@ -6823,7 +6823,7 @@ $(pv_value) 1 true - + @@ -6863,7 +6863,7 @@ $(pv_value) 1 true - + @@ -6903,7 +6903,7 @@ $(pv_value) 1 true - + @@ -6943,7 +6943,7 @@ $(pv_value) 1 true - + @@ -6983,7 +6983,7 @@ $(pv_value) 1 true - + @@ -7023,7 +7023,7 @@ $(pv_value) 1 true - + @@ -7067,7 +7067,7 @@ $(pv_value) true - + false @@ -7129,7 +7129,7 @@ $(pv_value) true - + false @@ -7191,7 +7191,7 @@ $(pv_value) true - + false @@ -7253,7 +7253,7 @@ $(pv_value) true - + false @@ -7311,7 +7311,7 @@ $(pv_value) 1 true - + @@ -7354,7 +7354,7 @@ $(pv_value) 1 true - + false @@ -7402,7 +7402,7 @@ $(pv_value) 1 true - + @@ -7445,7 +7445,7 @@ $(pv_value) 1 true - + false @@ -7493,7 +7493,7 @@ $(pv_value) 1 true - + @@ -7536,7 +7536,7 @@ $(pv_value) 1 true - + false @@ -7587,7 +7587,7 @@ $(pv_value) 1 true - + false @@ -7635,7 +7635,7 @@ $(pv_value) 1 true - + @@ -7675,7 +7675,7 @@ $(pv_value) 1 true - + @@ -7715,7 +7715,7 @@ $(pv_value) 1 true - + @@ -7755,7 +7755,7 @@ $(pv_value) 1 true - + @@ -7795,7 +7795,7 @@ $(pv_value) 1 true - + @@ -7838,7 +7838,7 @@ $(pv_value) 1 true - + false @@ -7886,7 +7886,7 @@ $(pv_value) 1 true - + @@ -7929,7 +7929,7 @@ $(pv_value) 1 true - + false @@ -7980,7 +7980,7 @@ $(pv_value) 1 true - + false @@ -8031,7 +8031,7 @@ $(pv_value) 1 true - + false @@ -8082,7 +8082,7 @@ $(pv_value) 1 true - + false @@ -8132,7 +8132,7 @@ $(pv_value) 1 true - Default + Default false @@ -8182,7 +8182,7 @@ $(pv_value) 1 true - Default + Default false @@ -8234,7 +8234,7 @@ $(pv_value) true - + false @@ -8292,7 +8292,7 @@ $(pv_value) 1 true - + @@ -8335,7 +8335,7 @@ $(pv_value) 1 true - + false @@ -8383,7 +8383,7 @@ $(pv_value) 1 true - + @@ -8427,7 +8427,7 @@ $(pv_value) true - + false @@ -8485,7 +8485,7 @@ $(pv_value) 1 true - + @@ -8528,7 +8528,7 @@ $(pv_value) 1 true - + false @@ -8580,7 +8580,7 @@ $(pv_value) true - + false @@ -8642,7 +8642,7 @@ $(pv_value) true - + false @@ -8700,7 +8700,7 @@ $(pv_value) 1 true - + @@ -8742,7 +8742,7 @@ $(pv_value) 1 true - Default + Default false @@ -8790,7 +8790,7 @@ $(pv_value) 1 true - + @@ -8830,7 +8830,7 @@ $(pv_value) 1 true - + @@ -8870,7 +8870,7 @@ $(pv_value) 1 true - + @@ -8910,7 +8910,7 @@ $(pv_value) 1 true - + @@ -8960,7 +8960,7 @@ $(pv_value) 1 true - Default + Default false @@ -9006,7 +9006,7 @@ $(pv_value) 1 true - + true @@ -9062,7 +9062,7 @@ $(pv_value) true 100.0 - Default + Default false @@ -9117,7 +9117,7 @@ $(pv_value) true 100.0 - Default + Default false @@ -9164,7 +9164,7 @@ $(pv_value) 1 true - + @@ -9204,7 +9204,7 @@ $(pv_value) 1 true - + @@ -9244,7 +9244,7 @@ $(pv_value) 1 true - + @@ -9284,7 +9284,7 @@ $(pv_value) 1 true - + @@ -9332,7 +9332,7 @@ $(pv_value) true 100.0 - Default + Default false @@ -9387,7 +9387,7 @@ $(pv_value) true 100.0 - Default + Default false @@ -9438,7 +9438,7 @@ $(pv_value) true - + false @@ -9500,7 +9500,7 @@ $(pv_value) true - + false @@ -9562,7 +9562,7 @@ $(pv_value) true - + false @@ -9628,7 +9628,7 @@ $(pv_value) true 100.0 - Default + Default false @@ -9675,7 +9675,7 @@ $(pv_value) 1 true - + @@ -9719,7 +9719,7 @@ $(pv_value) true - + false @@ -9777,7 +9777,7 @@ $(pv_value) 1 true - + @@ -9821,7 +9821,7 @@ $(pv_value) true - + false @@ -9890,7 +9890,7 @@ $(pv_value) 1 true - Default + Default false @@ -9933,7 +9933,7 @@ $(pv_value) 1 true - + @@ -9983,7 +9983,7 @@ $(pv_value) 1 true - + @@ -10079,7 +10079,7 @@ $(pv_value) 1 true - Default + Default false @@ -10130,7 +10130,7 @@ $(pv_value) 1 true - Default + Default false @@ -10173,7 +10173,7 @@ $(pv_value) 1 true - + @@ -10223,7 +10223,7 @@ $(pv_value) 1 true - Default + Default false @@ -10276,7 +10276,7 @@ $(pv_value) 1 true - Default + Default false @@ -10319,7 +10319,7 @@ $(pv_value) 1 true - + @@ -10369,7 +10369,7 @@ $(pv_value) 1 true - Default + Default false diff --git a/motorApp/op/ui/autoconvert/motorx_all.ui b/motorApp/op/ui/autoconvert/motorx_all.ui index b8582ae9..32813053 100644 --- a/motorApp/op/ui/autoconvert/motorx_all.ui +++ b/motorApp/op/ui/autoconvert/motorx_all.ui @@ -5,7 +5,7 @@ 188 - 29 + 31 450 875 @@ -14,7 +14,6 @@ QWidget#centralWidget {background: rgba(200, 200, 200, 255);} -QPushButton::menu-indicator {image: url(none.png); width: 0} caTable { font: 10pt; @@ -108,6 +107,39 @@ border-radius: 2px; + + caGraphics::Rectangle + + + + 0 + 0 + 450 + 26 + + + + + 236 + 236 + 236 + + + + Filled + + + + 236 + 236 + 236 + + + + Solid + + + caGraphics::Rectangle @@ -149,7 +181,7 @@ border-radius: 2px; $(P)$(M)_able.VAL - + caGraphics::Rectangle @@ -363,7 +395,7 @@ border-radius: 2px; Solid - 1,1;448,1; + 448,1; @@ -1358,10 +1390,10 @@ border-radius: 2px; Solid - 1,1;448,1; + 448,1; - + caGraphics::Rectangle @@ -1562,10 +1594,10 @@ border-radius: 2px; caLineEdit::Static - decimal + string - + caGraphics::Rectangle @@ -1676,7 +1708,7 @@ border-radius: 2px; - + caGraphics::Rectangle @@ -1722,7 +1754,7 @@ border-radius: 2px; $(P)$(M).HOMF - + caGraphics::Rectangle @@ -2767,7 +2799,7 @@ border-radius: 2px; 24 - + caGraphics::Rectangle @@ -2813,7 +2845,7 @@ border-radius: 2px; $(P)$(M).SET - + caGraphics::Rectangle @@ -3206,7 +3238,7 @@ border-radius: 2px; caChoice::Static - + caGraphics::Rectangle @@ -3341,39 +3373,6 @@ border-radius: 2px; - - - caGraphics::Rectangle - - - - 0 - 0 - 450 - 26 - - - - - 236 - 236 - 236 - - - - Filled - - - - 236 - 236 - 236 - - - - Solid - - @@ -3422,7 +3421,7 @@ border-radius: 2px; caLineEdit::Static - decimal + string @@ -3462,7 +3461,7 @@ border-radius: 2px; Solid - 1,1;447,1; + 447,1; @@ -3549,7 +3548,7 @@ border-radius: 2px; 1.0 - decimal + string caLineEdit::Static @@ -3796,7 +3795,7 @@ border-radius: 2px; Solid - 0,0;0,187; + 0,187; @@ -3833,7 +3832,7 @@ border-radius: 2px; Solid - 0,0;0,187; + 0,187; @@ -3947,7 +3946,7 @@ border-radius: 2px; Solid - 0,0;22,0; + 22,0; @@ -4062,7 +4061,7 @@ border-radius: 2px; Solid - 0,0;22,0; + 22,0; @@ -4177,7 +4176,7 @@ border-radius: 2px; Solid - 0,0;22,0; + 22,0; @@ -4400,7 +4399,7 @@ border-radius: 2px; Solid - 0,0;22,0; + 22,0; @@ -4533,7 +4532,7 @@ border-radius: 2px; Solid - 2,1;1,345; + 1,345; @@ -6609,7 +6608,7 @@ border-radius: 2px; Solid - 0,0;22,0; + 22,0; @@ -6724,7 +6723,7 @@ border-radius: 2px; Solid - 0,0;22,0; + 22,0; @@ -6839,7 +6838,7 @@ border-radius: 2px; Solid - 0,0;22,0; + 22,0; @@ -7178,7 +7177,7 @@ border-radius: 2px; Solid - 1,1;448,1; + 448,1; @@ -7251,7 +7250,7 @@ border-radius: 2px; Solid - 1,1;448,1; + 448,1; @@ -7432,7 +7431,7 @@ border-radius: 2px; Solid - 0,0;0,55; + 0,55; @@ -7469,7 +7468,7 @@ border-radius: 2px; Solid - 0,0;0,55; + 0,55; @@ -7695,7 +7694,7 @@ border-radius: 2px; Solid - 1,2;259,1; + 259,1; @@ -8319,6 +8318,7 @@ border-radius: 2px; caRectangle_0 caRectangle_1 + caRectangle_2 caLabel_0 caLabel_1 caLabel_2 @@ -8334,23 +8334,23 @@ border-radius: 2px; caFrame_0 caLabel_11 caPolyLine_1 - caRectangle_2 + caRectangle_3 caLabel_12 caLabel_13 caLabel_14 - caRectangle_3 + caRectangle_4 caLabel_15 caLabel_16 - caRectangle_4 caRectangle_5 + caRectangle_6 caLabel_17 caLabel_18 caLabel_19 caGraphics_0 caGraphics_1 caLabel_20 - caRectangle_6 caRectangle_7 + caRectangle_8 caFrame_1 caLabel_21 caLabel_22 @@ -8360,9 +8360,8 @@ border-radius: 2px; caLabel_26 caFrame_2 caLabel_27 - caRectangle_8 - caLabel_28 caRectangle_9 + caLabel_28 caPolyLine_2 caLabel_29 caLabel_30 From c18f7b1ee95d587a75b5aaac6d37ea145b0c73e2 Mon Sep 17 00:00:00 2001 From: Kevin Peterson Date: Fri, 19 May 2023 08:35:09 -0500 Subject: [PATCH 28/54] Removed prop(YES) from fields in motorRecord.dbd that didn't need it; added comments to the ones that do. --- motorApp/MotorSrc/motorRecord.dbd | 64 +++++++------------------------ 1 file changed, 13 insertions(+), 51 deletions(-) diff --git a/motorApp/MotorSrc/motorRecord.dbd b/motorApp/MotorSrc/motorRecord.dbd index 0a2ea8c9..b7ee5df3 100644 --- a/motorApp/MotorSrc/motorRecord.dbd +++ b/motorApp/MotorSrc/motorRecord.dbd @@ -90,7 +90,6 @@ recordtype(motor) { prompt("User Offset (EGU)") special(SPC_MOD) pp(TRUE) - prop(YES) } field(FOFF,DBF_MENU) { asl(ASL0) @@ -143,42 +142,38 @@ recordtype(motor) { promptgroup(GUI_COMMON) special(SPC_MOD) interest(1) - prop(YES) } field(VBAS,DBF_DOUBLE) { prompt("Base Velocity (EGU/s)") promptgroup(GUI_COMMON) special(SPC_MOD) interest(1) - prop(YES) + prop(YES) # get_graphic_double, get_control_double } field(VMAX,DBF_DOUBLE) { prompt("Max. Velocity (EGU/s)") promptgroup(GUI_COMMON) special(SPC_MOD) interest(1) - prop(YES) + prop(YES) # get_graphic_double, get_control_double } field(S,DBF_DOUBLE) { prompt("Speed (revolutions/sec)") promptgroup(GUI_COMMON) special(SPC_MOD) interest(1) - prop(YES) } field(SBAS,DBF_DOUBLE) { prompt("Base Speed (RPS)") promptgroup(GUI_COMMON) special(SPC_MOD) interest(1) - prop(YES) } field(SMAX,DBF_DOUBLE) { prompt("Max. Speed (RPS)") promptgroup(GUI_COMMON) special(SPC_MOD) interest(1) - prop(YES) } field(ACCL,DBF_DOUBLE) { prompt("Seconds to Velocity") @@ -186,7 +181,6 @@ recordtype(motor) { special(SPC_MOD) interest(1) initial("0.2") - prop(YES) } field(BDST,DBF_DOUBLE) { prompt("BL Distance (EGU)") @@ -194,21 +188,18 @@ recordtype(motor) { promptgroup(GUI_COMMON) special(SPC_MOD) interest(1) - prop(YES) } field(BVEL,DBF_DOUBLE) { prompt("BL Velocity (EGU/s)") promptgroup(GUI_COMMON) special(SPC_MOD) interest(1) - prop(YES) } field(SBAK,DBF_DOUBLE) { prompt("BL Speed (RPS)") promptgroup(GUI_COMMON) special(SPC_MOD) interest(1) - prop(YES) } field(BACC,DBF_DOUBLE) { prompt("BL Seconds to Velocity") @@ -216,7 +207,6 @@ recordtype(motor) { special(SPC_MOD) interest(1) initial("0.5") - prop(YES) } field(FRAC,DBF_FLOAT) { prompt("Move Fraction") @@ -224,7 +214,6 @@ recordtype(motor) { special(SPC_MOD) interest(1) initial("1") - prop(YES) } field(OUT,DBF_OUTLINK) { prompt("Output Specification") @@ -275,7 +264,6 @@ recordtype(motor) { special(SPC_MOD) pp(TRUE) interest(1) - prop(YES) } field(MRES,DBF_DOUBLE) { prompt("Motor Step Size (EGU)") @@ -283,7 +271,7 @@ recordtype(motor) { special(SPC_MOD) pp(TRUE) interest(1) - prop(YES) + prop(YES) # get_graphic_double, get_control_double } field(ERES,DBF_DOUBLE) { prompt("Encoder Step Size (EGU)") @@ -291,13 +279,11 @@ recordtype(motor) { special(SPC_MOD) pp(TRUE) interest(1) - prop(YES) } field(RRES,DBF_DOUBLE) { prompt("Readback Step Size (EGU") promptgroup(GUI_COMMON) interest(1) - prop(YES) } field(UEIP,DBF_MENU) { prompt("Use Encoder If Present") @@ -319,13 +305,14 @@ recordtype(motor) { prompt("Display Precision") promptgroup(GUI_COMMON) interest(1) - prop(YES) + prop(YES) # get_precision } field(EGU,DBF_STRING) { prompt("Engineering Units") promptgroup(GUI_COMMON) interest(1) size(16) + prop(YES) # get_units } field(RHLM,DBF_DOUBLE) { prompt("Raw High Limit") @@ -343,39 +330,37 @@ recordtype(motor) { prompt("User High Limit") special(SPC_MOD) pp(TRUE) - prop(YES) + prop(YES) # get_graphic_double, get_control_double } field(LLM,DBF_DOUBLE) { prompt("User Low Limit") special(SPC_MOD) pp(TRUE) - prop(YES) + prop(YES) # get_graphic_double, get_control_double } field(DHLM,DBF_DOUBLE) { prompt("Dial High Limit") promptgroup(GUI_COMMON) special(SPC_MOD) pp(TRUE) - prop(YES) + prop(YES) # get_graphic_double, get_control_double } field(DLLM,DBF_DOUBLE) { prompt("Dial Low Limit") promptgroup(GUI_COMMON) special(SPC_MOD) pp(TRUE) - prop(YES) + prop(YES) # get_graphic_double, get_control_double } field(HOPR,DBF_DOUBLE) { prompt("High Operating Range") promptgroup(GUI_COMMON) interest(1) - prop(YES) } field(LOPR,DBF_DOUBLE) { prompt("Low Operating Range") promptgroup(GUI_COMMON) interest(1) - prop(YES) } field(HLS,DBF_SHORT) { prompt("User High Limit Switch") @@ -398,28 +383,28 @@ recordtype(motor) { promptgroup(GUI_COMMON) pp(TRUE) interest(2) - prop(YES) + prop(YES) # get_alarm_double } field(LOLO,DBF_DOUBLE) { prompt("Lolo Alarm Limit (EGU)") promptgroup(GUI_COMMON) pp(TRUE) interest(2) - prop(YES) + prop(YES) # get_alarm_double } field(HIGH,DBF_DOUBLE) { prompt("High Alarm Limit (EGU)") promptgroup(GUI_COMMON) pp(TRUE) interest(2) - prop(YES) + prop(YES) # get_alarm_double } field(LOW,DBF_DOUBLE) { prompt("Low Alarm Limit (EGU)") promptgroup(GUI_COMMON) pp(TRUE) interest(2) - prop(YES) + prop(YES) # get_alarm_double } field(HHSV,DBF_MENU) { prompt("Hihi Severity") @@ -461,14 +446,12 @@ recordtype(motor) { promptgroup(GUI_COMMON) special(SPC_MOD) interest(1) - prop(YES) } field(SPDB,DBF_DOUBLE) { prompt("Setpoint Deadband (EGU)") promptgroup(GUI_COMMON) special(SPC_MOD) interest(1) - prop(YES) } field(RCNT,DBF_SHORT) { prompt("Retry count") @@ -552,33 +535,28 @@ recordtype(motor) { prompt("Tweak Step Size (EGU)") promptgroup(GUI_COMMON) interest(1) - prop(YES) } field(VAL,DBF_DOUBLE) { asl(ASL0) prompt("User Desired Value (EGU") special(SPC_MOD) pp(TRUE) - prop(YES) } field(LVAL,DBF_DOUBLE) { prompt("Last User Des Val (EGU)") special(SPC_NOMOD) interest(1) - prop(YES) } field(DVAL,DBF_DOUBLE) { asl(ASL0) prompt("Dial Desired Value (EGU") special(SPC_MOD) pp(TRUE) - prop(YES) } field(LDVL,DBF_DOUBLE) { prompt("Last Dial Des Val (EGU)") special(SPC_NOMOD) interest(1) - prop(YES) } field(RVAL,DBF_LONG) { asl(ASL0) @@ -596,28 +574,23 @@ recordtype(motor) { prompt("Relative Value (EGU)") special(SPC_MOD) pp(TRUE) - prop(YES) } field(LRLV,DBF_DOUBLE) { prompt("Last Rel Value (EGU)") special(SPC_NOMOD) interest(1) - prop(YES) } field(RBV,DBF_DOUBLE) { prompt("User Readback Value") special(SPC_NOMOD) - prop(YES) } field(DRBV,DBF_DOUBLE) { prompt("Dial Readback Value") special(SPC_NOMOD) - prop(YES) } field(DIFF,DBF_DOUBLE) { prompt("Difference dval-drbv") special(SPC_NOMOD) - prop(YES) } field(RDIF,DBF_LONG) { prompt("Difference rval-rrbv") @@ -699,7 +672,6 @@ recordtype(motor) { promptgroup(GUI_COMMON) special(SPC_MOD) interest(1) - prop(YES) } field(CBAK,DBF_NOACCESS) { prompt("Callback structure") @@ -714,7 +686,6 @@ recordtype(motor) { special(SPC_MOD) interest(1) initial("0") - prop(YES) } field(ICOF,DBF_DOUBLE) { promptgroup(GUI_COMMON) @@ -722,7 +693,6 @@ recordtype(motor) { special(SPC_MOD) interest(1) initial("0") - prop(YES) } field(DCOF,DBF_DOUBLE) { promptgroup(GUI_COMMON) @@ -730,7 +700,6 @@ recordtype(motor) { special(SPC_MOD) interest(1) initial("0") - prop(YES) } field(CNEN,DBF_MENU) { asl(ASL0) @@ -781,14 +750,12 @@ recordtype(motor) { promptgroup(GUI_COMMON) special(SPC_MOD) interest(1) - prop(YES) } field(JAR,DBF_DOUBLE) { prompt("Jog Accel. (EGU/s^2)") promptgroup(GUI_COMMON) special(SPC_MOD) interest(1) - prop(YES) } field(LOCK,DBF_MENU) { prompt("Soft Channel Position Lock") @@ -816,7 +783,6 @@ recordtype(motor) { promptgroup(GUI_COMMON) special(SPC_MOD) interest(1) - prop(YES) } field(STUP,DBF_MENU) { asl(ASL0) @@ -839,25 +805,21 @@ recordtype(motor) { prompt("Archive Deadband") promptgroup(GUI_COMMON) interest(1) - prop(YES) } field(MDEL,DBF_DOUBLE) { prompt("Monitor Deadband") promptgroup(GUI_COMMON) interest(1) - prop(YES) } field(ALST,DBF_DOUBLE) { prompt("Last Value Archived") special(SPC_NOMOD) interest(3) - prop(YES) } field(MLST,DBF_DOUBLE) { prompt("Last Val Monitored") special(SPC_NOMOD) interest(3) - prop(YES) } field(SYNC,DBF_SHORT) { prompt("Sync position") From 7291b5569be4084831fca363673acb5a9d59ac2b Mon Sep 17 00:00:00 2001 From: Kevin Peterson Date: Fri, 19 May 2023 15:50:09 -0500 Subject: [PATCH 29/54] Improved ACCS initialization. Update ACCS or ACCL (determined by ACCU) when VBAS (or SBAS) changes. --- motorApp/MotorSrc/motorRecord.cc | 32 +++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/motorApp/MotorSrc/motorRecord.cc b/motorApp/MotorSrc/motorRecord.cc index cf98e10b..58fd459c 100644 --- a/motorApp/MotorSrc/motorRecord.cc +++ b/motorApp/MotorSrc/motorRecord.cc @@ -2629,6 +2629,7 @@ static long special(DBADDR *paddr, int after) pmr->sbas = temp_dbl; db_post_events(pmr, &pmr->sbas, DBE_VAL_LOG); } + updateACCL_ACCSfromVELO(pmr); break; /* new sbas: make vbas agree */ @@ -2644,6 +2645,7 @@ static long special(DBADDR *paddr, int after) pmr->vbas = temp_dbl; db_post_events(pmr, &pmr->vbas, DBE_VAL_LOG); } + updateACCL_ACCSfromVELO(pmr); break; /* new vmax: make smax agree */ @@ -2734,7 +2736,11 @@ static long special(DBADDR *paddr, int after) /* new accs */ case motorRecordACCS: - db_post_events(pmr, &pmr->accs, DBE_VAL_LOG); + if (pmr->accs <= 0.0) + { + updateACCSfromACCL(pmr); + } + //db_post_events(pmr, &pmr->accs, DBE_VAL_LOG); updateACCLfromACCS(pmr); break; @@ -3974,12 +3980,22 @@ static void check_speed_and_resolution(motorRecord * pmr) db_post_events(pmr, &pmr->sbak, DBE_VAL_LOG); db_post_events(pmr, &pmr->bvel, DBE_VAL_LOG); - /* Sanity check on acceleration time. */ - if (pmr->accl == 0.0) + /* ACCS (EGU/sec^2) <--> ACCL (sec) */ + if (pmr->accs > 0.0) { - pmr->accl = 0.1; - db_post_events(pmr, &pmr->accl, DBE_VAL_LOG); + updateACCLfromACCS(pmr); } + else + { + /* Sanity check on acceleration time. */ + if (pmr->accl == 0.0) + { + pmr->accl = 0.1; + db_post_events(pmr, &pmr->accl, DBE_VAL_LOG); + } + updateACCSfromACCL(pmr); + } + /* Sanity check on backlash acceleration time. */ if (pmr->bacc == 0.0) { pmr->bacc = 0.1; @@ -3999,12 +4015,6 @@ static void check_speed_and_resolution(motorRecord * pmr) pmr->hvel = pmr->vbas; else range_check(pmr, &pmr->hvel, pmr->vbas, pmr->vmax); - - /* Make sure that ACCS is initialized */ - if (pmr->accs == 0.0) - { - updateACCSfromACCL(pmr); - } } /* From fd808eb2528ded904e07159218a89318aac2ec0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torsten=20B=C3=B6gershausen?= Date: Mon, 22 May 2023 16:37:07 +0200 Subject: [PATCH 30/54] RHLM, RLLM: Fix when MRES is negativ Fix the situation when MRES < 0 and either the softlimits are changed (and RHLM and RLLM are garbled) or when MRES itself is negative and changed, so that DHLM and DLLM needed to be updated from the constant RHLM/RLLM. Based on the update of DHLM/DLLM HLM/LLM will be updated as well. The current implementation around RHLM/RLLM did not consider MRES < 0 at all. And even if this configuration is not often used, it is still supported. Beside that we want to avoid RHLM=-40 RLLM=50 when it should be the other way around --- motorApp/MotorSrc/motorRecord.cc | 148 ++++++++++++++++++++++--------- 1 file changed, 108 insertions(+), 40 deletions(-) diff --git a/motorApp/MotorSrc/motorRecord.cc b/motorApp/MotorSrc/motorRecord.cc index e4a106b8..7c21d61f 100644 --- a/motorApp/MotorSrc/motorRecord.cc +++ b/motorApp/MotorSrc/motorRecord.cc @@ -2784,15 +2784,36 @@ velcheckB: pmr->vmax = temp_dbl; db_post_events(pmr, &pmr->vmax, DBE_VAL_LOG); } - if (pmr->dllm != (temp_dbl = pmr->rllm * pmr->mres)) + /* We may have new MRES */ + if (pmr->mres > 0) { - pmr->dllm = temp_dbl; - db_post_events(pmr, &pmr->dllm, DBE_VAL_LOG); + if (pmr->dllm != (temp_dbl = pmr->rllm * pmr->mres)) + { + pmr->dllm = temp_dbl; + db_post_events(pmr, &pmr->dllm, DBE_VAL_LOG); + } + if (pmr->dhlm != (temp_dbl = pmr->rhlm * pmr->mres)) + { + pmr->dhlm = temp_dbl; + db_post_events(pmr, &pmr->dhlm, DBE_VAL_LOG); + } } - if (pmr->dhlm != (temp_dbl = pmr->rhlm * pmr->mres)) + else { - pmr->dhlm = temp_dbl; - db_post_events(pmr, &pmr->dhlm, DBE_VAL_LOG); + // MRES < 0 swaps DHLM DLLM + if (pmr->dhlm != (temp_dbl = pmr->rllm * pmr->mres)) + { + pmr->dhlm = temp_dbl; + db_post_events(pmr, &pmr->dhlm, DBE_VAL_LOG); + } + if (pmr->dllm != (temp_dbl = pmr->rhlm * pmr->mres)) + { + pmr->dllm = temp_dbl; + db_post_events(pmr, &pmr->dllm, DBE_VAL_LOG); + } + set_userlimits(pmr); + db_post_events(pmr, &pmr->hlm, DBE_VAL_LOG); + db_post_events(pmr, &pmr->llm, DBE_VAL_LOG); } set_userlimits(pmr); db_post_events(pmr, &pmr->hlm, DBE_VAL_LOG); @@ -3855,34 +3876,56 @@ static void check_speed_and_resolution(motorRecord * pmr) db_post_events(pmr, &pmr->velo, DBE_VAL_LOG); db_post_events(pmr, &pmr->s, DBE_VAL_LOG); - /* RLLM <--> DLLM */ - if (pmr->rllm != 0.0) + if (pmr->mres > 0) { - pmr->dllm = pmr->rllm * pmr->mres; - MARK(M_DLLM); + /* RLLM <--> DLLM */ + if (pmr->rllm != 0.0) + { + pmr->dllm = pmr->rllm * pmr->mres; + MARK(M_DLLM); + } + if (pmr->rllm != pmr->dllm / pmr->mres) + { + pmr->rllm = pmr->dllm / pmr->mres; + MARK_AUX(M_RLLM); + } + /* RHLM <--> DHLM */ + if (pmr->rhlm != 0.0) + { + pmr->dhlm = pmr->rhlm * pmr->mres; + MARK(M_DHLM); + } + if (pmr->rhlm != pmr->dhlm / pmr->mres) + { + pmr->rhlm = pmr->dhlm / pmr->mres; + MARK_AUX(M_RHLM); + } } - if (pmr->rllm != pmr->dllm / pmr->mres) + else { - pmr->rllm = pmr->dllm / pmr->mres; - MARK_AUX(M_RLLM); + /* RLLM <--> DHLM */ + if (pmr->rllm != 0.0) + { + pmr->dhlm = pmr->rllm * fabs(pmr->mres); + MARK(M_DHLM); + } + if (pmr->rllm != pmr->dhlm / fabs(pmr->mres)) + { + pmr->rllm = pmr->dhlm / fabs(pmr->mres); + MARK_AUX(M_RLLM); + } + /* RHLM <--> DLLM */ + if (pmr->rhlm != 0.0) + { + pmr->dllm = pmr->rhlm * fabs(pmr->mres); + MARK(M_DLLM); + } + if (pmr->rhlm != pmr->dllm / fabs(pmr->mres)) + { + pmr->rhlm = pmr->dllm / fabs(pmr->mres); + MARK_AUX(M_RHLM); + } } - db_post_events(pmr, &pmr->dllm, DBE_VAL_LOG); - db_post_events(pmr, &pmr->rllm, DBE_VAL_LOG); - - - /* RHLM <--> DHLM */ - if (pmr->rhlm != 0.0) - { - pmr->dhlm = pmr->rhlm * pmr->mres; - MARK(M_DHLM); - } - if (pmr->rhlm != pmr->dhlm / pmr->mres) - { - pmr->rhlm = pmr->dhlm / pmr->mres; - MARK_AUX(M_RHLM); - } - db_post_events(pmr, &pmr->rhlm, DBE_VAL_LOG); - db_post_events(pmr, &pmr->dhlm, DBE_VAL_LOG); /* SBAK (revolutions/sec) <--> BVEL (EGU/sec) */ if (pmr->sbak != 0.0) @@ -3985,12 +4028,18 @@ static void set_user_highlimit(motorRecord* pmr, struct motor_dset* pdset) if (dir_positive) { pmr->dhlm = tmp_limit; + } + else + { + pmr->dllm = tmp_limit; + } + if (command == SET_HIGH_LIMIT) + { pmr->rhlm = tmp_raw; MARK_AUX(M_RHLM); } else { - pmr->dllm = tmp_limit; pmr->rllm = tmp_raw; MARK_AUX(M_RLLM); } @@ -4057,16 +4106,21 @@ static void set_user_lowlimit(motorRecord* pmr, struct motor_dset* pdset) SEND_MSG(); if (dir_positive) { pmr->dllm = tmp_limit; - pmr->rllm = tmp_raw; - MARK_AUX(M_RLLM); } else { pmr->dhlm = tmp_limit; + } + if (command == SET_HIGH_LIMIT) + { pmr->rhlm = tmp_raw; MARK_AUX(M_RHLM); } - + else + { + pmr->rllm = tmp_raw; + MARK_AUX(M_RLLM); + } } MARK(M_LLM); } @@ -4088,9 +4142,6 @@ static void set_dial_highlimit(motorRecord *pmr, struct motor_dset *pdset) RTN_STATUS rtnval; tmp_raw = pmr->dhlm / pmr->mres; - // set the raw high limit - pmr->rhlm = tmp_raw; - MARK_AUX(M_RHLM); INIT_MSG(); if (pmr->mres < 0) { @@ -4113,6 +4164,16 @@ static void set_dial_highlimit(motorRecord *pmr, struct motor_dset *pdset) pmr->llm = -(pmr->dhlm) + offset; MARK(M_LLM); } + if (command == SET_HIGH_LIMIT) + { + pmr->rhlm = tmp_raw; + MARK_AUX(M_RHLM); + } + else + { + pmr->rllm = tmp_raw; + MARK_AUX(M_RLLM); + } MARK(M_DHLM); } @@ -4132,9 +4193,6 @@ static void set_dial_lowlimit(motorRecord *pmr, struct motor_dset *pdset) RTN_STATUS rtnval; tmp_raw = pmr->dllm / pmr->mres; - // set the raw low limit - pmr->rllm = tmp_raw; - MARK_AUX(M_RLLM); INIT_MSG(); if (pmr->mres < 0) { @@ -4157,6 +4215,16 @@ static void set_dial_lowlimit(motorRecord *pmr, struct motor_dset *pdset) pmr->hlm = -(pmr->dllm) + offset; MARK(M_HLM); } + if (command == SET_HIGH_LIMIT) + { + pmr->rhlm = tmp_raw; + MARK_AUX(M_RHLM); + } + else + { + pmr->rllm = tmp_raw; + MARK_AUX(M_RLLM); + } MARK(M_DLLM); } From 80b011b9446d2ac1f4df48bcd7303814ad3182f5 Mon Sep 17 00:00:00 2001 From: Kevin Peterson Date: Mon, 22 May 2023 14:55:27 -0500 Subject: [PATCH 31/54] Ignore the top-level iocsh dir --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 6479b24b..2d9ca64e 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,7 @@ bin/ dbd/ html/ include/ +/iocsh/ lib/ templates/ cdCommands From 8218387f4bbcb4ff03fcd00c869d58f1ca187d81 Mon Sep 17 00:00:00 2001 From: Kevin Peterson Date: Tue, 23 May 2023 09:34:52 -0500 Subject: [PATCH 32/54] Updated RELEASE.md for R7-3 --- docs/RELEASE.md | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/docs/RELEASE.md b/docs/RELEASE.md index f4773a4a..d05507db 100644 --- a/docs/RELEASE.md +++ b/docs/RELEASE.md @@ -1,19 +1,36 @@ # Motor Releases -## __R7-3 (2023-05-XX)__ +## __R7-3 (2023-05-23)__ R7-3 is a release based on the master branch. ### Changes since R7-2-2 #### New features -* Added motorAcsMotion as a submodule -* TBD +* Commit [c764bd6](https://github.com/epics-modules/motor/commit/c764bd6426c3939bded75df2909b76d148c2f8c9): Added motorAcsMotion as a submodule +* Pull request [#160](https://github.com/epics-modules/motor/pull/160) from [Torsten Bögershausen](https://github.com/tboegi): Added the Restore Mode (**RSTM**) field +* Pull request [#163](https://github.com/epics-modules/motor/pull/163): Autosave the RSTM field and allow it to be specified when motor databases are loaded +* Pull request [#197](https://github.com/epics-modules/motor/pull/197): Added model-2-specific databases to work around MOTOR_REC_{OFFSET,RESOLUTION,DIRECTION} errors at iocInit +* Pull request [#193](https://github.com/epics-modules/motor/pull/193) from [Jack Harper](https://github.com/rerpha): Added raw limit (**RHLM**, **RLLM**) fields +* Pull request [#202](https://github.com/epics-modules/motor/pull/202) and [#204](https://github.com/epics-modules/motor/pull/204): Added prop(YES) to fields in motorRecord.dbd that should generate DBE_PROPERTY callbacks +* Pull request [#122](https://github.com/epics-modules/motor/pull/122) from [Torsten Bögershausen](https://github.com/tboegi): Addded Acceleration (**ACCS**) and Acceleration Used (**ACCU**) fields +* Pull request [#203](https://github.com/epics-modules/motor/pull/203): Changed the Acceleration Used (ACCU) field from a readback to a control #### Modifications to existing features -* TBD +* Pull request [#180](https://github.com/epics-modules/motor/pull/180) from [Torsten Bögershausen](https://github.com/tboegi): Reset UEIP to 'No' if no encoder is present +* Pull request [#193](https://github.com/epics-modules/motor/pull/193) from [Jack Harper](https://github.com/rerpha): Soft limits are synced on MRES changes #### Bug fixes -* TBD +* Pull request [#176](https://github.com/epics-modules/motor/pull/176) from [Torsten Bögershausen](https://github.com/tboegi): Added shareLib.h to motordrvCom.h for compatibility with base 7.0.4 +* Pull request [#182](https://github.com/epics-modules/motor/pull/182) from [Freddie Akeroyd](https://github.com/FreddieAkeroyd): Bug fix for negative backlash distance when relative moves are used +* Pull request [#167](https://github.com/epics-modules/motor/pull/167) from [Torsten Bögershausen](https://github.com/tboegi): devMotorAsyn: remove initEvent in init_record() +* Commit [c3d6c6e](https://github.com/epics-modules/motor/commit/c3d6c6ee439e4d46fd2d4c2790091f7c76e31120) from [Mark Rivers](https://github.com/MarkRivers): Fixes for DTYP and EGU not displaying correctly in Phoebus +* Pull request [#206](https://github.com/epics-modules/motor/pull/206) from [Torsten Bögershausen](https://github.com/tboegi): Bug fix for RHLM, RLLM when MRES is negative + +#### Documentation +* Commit [382c832](https://github.com/epics-modules/motor/commit/382c8324e5176ce769a09302bf829beca5a9cbea) from [Mark Rivers](https://github.com/MarkRivers): Added "Model 3 EPICS Motor Driver Support" slides + +#### Continuous Integration +* Configured to build with GitHub Actions using ci-scripts v3.0.1 #### Driver submodules (and noteworthy changes) From 6f277cc9dc33ac895573d03839ddf4b58effc7bd Mon Sep 17 00:00:00 2001 From: Kevin Peterson Date: Tue, 23 May 2023 10:07:11 -0500 Subject: [PATCH 33/54] Updated the version number in motorRecord.cc and documentation --- docs/index.html | 32 +++++++++++++++++++++++++++----- docs/motorRecord.html | 26 +++++++++++++------------- motorApp/MotorSrc/motorRecord.cc | 2 +- 3 files changed, 41 insertions(+), 19 deletions(-) diff --git a/docs/index.html b/docs/index.html index 2e6515be..810adcf4 100644 --- a/docs/index.html +++ b/docs/index.html @@ -50,13 +50,22 @@ the links in the table below:
github issues n/a + + R7-3 + R3.15.7 or later + motorR7-3.tar.gz + motorRecord.html + release notes + github issues + 2023-05-23 + R7-2 R3.15.7 or later - motorR7-2-1.tar.gz - motorRecord.html - release notes - github issues + motorR7-2-2.tar.gz + motorRecord.html + release notes + github issues 2020-05-13 @@ -324,6 +333,19 @@ the links in the table below:
Required modules Release needed + + R7-3 + ASYN  
+ IPAC  (for motorHytec & VME-based serial and GPIB examples)
+ LUA  (for motorScriptMotor)
+ MODBUS  (for motorAMCI IOCs) + + R4-41+
+ R2-16
+ R3-0
+ R3-2 + + R7-2 ASYN  
@@ -685,7 +707,7 @@ different releases of EPICS and/or the other required modules are needed).

-Page Last Modified: 2020-05-14
+Page Last Modified: 2023-05-23
Kevin Peterson

diff --git a/docs/motorRecord.html b/docs/motorRecord.html index dd4d9367..58031e95 100644 --- a/docs/motorRecord.html +++ b/docs/motorRecord.html @@ -35,9 +35,9 @@ -

Overview

This documentation describes version R7-2-1 of the EPICS motor +

Overview

This documentation describes version R7-3 of the EPICS motor record, and related EPICS software required to build and use it.  Version -R7-2-1 of the motor record is compatible with EPICS base R3.15.7 and above. +R7-3 of the motor record is compatible with EPICS base R3.15.7 and above.

The motor record is intended to support positioning motors of all kinds, but currently supports motor controllers from the following manufacturers: @@ -45,7 +45,7 @@ supports motor controllers from the following manufacturers:

  • - ACS Motion Control: motorAcsTech80 + ACS Motion Control: motorAcsMotion & motorAcsTech80
  • Advanced Control Systems, Corp: motorAcs @@ -62,15 +62,9 @@ supports motor controllers from the following manufacturers:
  • attocube systems: motorAttocube
  • -
  • - Delta Tau: motorDeltaTau -
  • Faulhaber: motorFaulhaber
  • -
  • - Hytec: motorHytec -
  • Kohzu: motorKohzu
  • @@ -89,12 +83,21 @@ supports motor controllers from the following manufacturers:
  • Newport: motorNewport
  • +
  • + Newwood Solutions Ltd (formerly Hytec): motorHytec +
  • +
  • + Novanta IMS (formerly Schneider Electric (formally IMS)): motorIms +
  • Micronix: motorMicronix
  • nPoint: motorNPoint
  • +
  • + Omron Delta Tau: motorDeltaTau +
  • Oregon Micro Systems: motorOms & motorOmsAsyn
  • @@ -110,9 +113,6 @@ supports motor controllers from the following manufacturers:
  • piezosystem jena GmbH: motorPiJena
  • -
  • - Schneider Electric (formally IMS): motorIms -
  • SmarAct GmbH: motorSmarAct
  • @@ -3666,6 +3666,6 @@ specific value (e.g., kV) that is not supported by the motor controller.

    Suggestions and comments to:

    Kevin Peterson : (kmpeters@anl.gov)
    -Last modified: 2020-05-14 +Last modified: 2023-05-23 diff --git a/motorApp/MotorSrc/motorRecord.cc b/motorApp/MotorSrc/motorRecord.cc index a6b9e053..1760b6dc 100644 --- a/motorApp/MotorSrc/motorRecord.cc +++ b/motorApp/MotorSrc/motorRecord.cc @@ -193,7 +193,7 @@ USAGE... Motor Record Support. * .79 21-11-22 jrh - Added raw limits, sync limits on motor resolution change */ -#define VERSION 7.2 +#define VERSION 7.3 #include #include From e2afb88a063470eee71f9d12a9daa1b453d9c613 Mon Sep 17 00:00:00 2001 From: Kevin Peterson Date: Tue, 23 May 2023 10:14:19 -0500 Subject: [PATCH 34/54] Moved RSTM and SPDB in the alphabetical list of record-specific-fields --- docs/motorRecord.html | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/docs/motorRecord.html b/docs/motorRecord.html index 58031e95..2ec3b1a1 100644 --- a/docs/motorRecord.html +++ b/docs/motorRecord.html @@ -904,22 +904,6 @@ below.
    - - RSTM - R/W - Restore Mode - RECCHOICE - (0:"Never", 1:"Always", 2:"NearZero", 3:"Conditional")
    - - - - SPDB - R/W - Set Point Deadband (EGU) - DOUBLE -
    - - RDBL R @@ -1016,6 +1000,14 @@ below.
    + + RSTM + R/W + Restore Mode + RECCHOICE + (0:"Never", 1:"Always", 2:"NearZero", 3:"Conditional")
    + + RTRY R/W @@ -1079,6 +1071,14 @@ below.
    + + SPDB + R/W + Set Point Deadband (EGU) + DOUBLE +
    + + SPMG R/W* From e7b6302907be63cdb0f166cb24994955c6f10f39 Mon Sep 17 00:00:00 2001 From: Kevin Peterson Date: Tue, 23 May 2023 10:25:46 -0500 Subject: [PATCH 35/54] Added documentation for the RHLM and RLLM fields to motorRecord.html --- docs/motorRecord.html | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/docs/motorRecord.html b/docs/motorRecord.html index 2ec3b1a1..11ec5adb 100644 --- a/docs/motorRecord.html +++ b/docs/motorRecord.html @@ -928,6 +928,14 @@ below.
    + + RHLM + R + Raw High Limit + DOUBLE +
    + + RHLS R @@ -944,6 +952,14 @@ below.
    + + RLLM + R + Raw Low Limit + DOUBLE +
    + + RLLS R @@ -2123,6 +2139,24 @@ below. the DIR field has the value "Pos", then DLLM will always be consistent with LLM, otherwise DLLM will always be consistent with HLM.  + + RHLM + R + Raw High Limit + DOUBLE + The maximum allowed value of the RVAL field. If the MRES field is negative, + then RHLM will always be consistent with DLLM, otherwise RHLM will always be + consistent with DHLM.  + + + RLLM + R + Raw Low Limit + DOUBLE + The minimum allowed value of the RVAL field. If the MRES field is negative, + then RLLM will always be consistent with DHLM, otherwise RLLM will always be + consistent with DLLM.  + LVIO R From 5d3fb167b494a72a9d446e53063a18c02018e5d7 Mon Sep 17 00:00:00 2001 From: Kevin Peterson Date: Tue, 23 May 2023 15:08:48 -0500 Subject: [PATCH 36/54] Added contributions to R7-3 that were missing from the 'git log --first-parent' output. --- docs/RELEASE.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/RELEASE.md b/docs/RELEASE.md index d05507db..832e2949 100644 --- a/docs/RELEASE.md +++ b/docs/RELEASE.md @@ -25,9 +25,12 @@ R7-3 is a release based on the master branch. * Pull request [#167](https://github.com/epics-modules/motor/pull/167) from [Torsten Bögershausen](https://github.com/tboegi): devMotorAsyn: remove initEvent in init_record() * Commit [c3d6c6e](https://github.com/epics-modules/motor/commit/c3d6c6ee439e4d46fd2d4c2790091f7c76e31120) from [Mark Rivers](https://github.com/MarkRivers): Fixes for DTYP and EGU not displaying correctly in Phoebus * Pull request [#206](https://github.com/epics-modules/motor/pull/206) from [Torsten Bögershausen](https://github.com/tboegi): Bug fix for RHLM, RLLM when MRES is negative +* Pull request [#186](https://github.com/epics-modules/motor/pull/186) from [justincslac](https://github.com/justincslac): Bug fix for .gitignore that caused the Db dir to be ignored on case-insensitive file systems +* Commit [96509ca](https://github.com/epics-modules/motor/commit/96509caba2ea1995bfeca3a0e8f11e1f273d2e05) from [Keenan Lang](https://github.com/keenanlang): Added basic_asyn_motor_settings.req which allows autosaveBuild to work with basic_asyn_motor.db #### Documentation * Commit [382c832](https://github.com/epics-modules/motor/commit/382c8324e5176ce769a09302bf829beca5a9cbea) from [Mark Rivers](https://github.com/MarkRivers): Added "Model 3 EPICS Motor Driver Support" slides +* Pull request [#190](https://github.com/epics-modules/motor/pull/190) from [Xiaoqiang Wang](https://github.com/xiaoqiangwang): Corrected field types in motorRecord.html #### Continuous Integration * Configured to build with GitHub Actions using ci-scripts v3.0.1 From 5eb994dc5e0f8a809382b300ad13f8c83e7da33b Mon Sep 17 00:00:00 2001 From: Mark Rivers Date: Mon, 29 May 2023 08:53:01 -0500 Subject: [PATCH 37/54] Add readController() functions --- motorApp/MotorSrc/asynMotorController.cpp | 24 +++++++++++++++++++++++ motorApp/MotorSrc/asynMotorController.h | 2 ++ 2 files changed, 26 insertions(+) diff --git a/motorApp/MotorSrc/asynMotorController.cpp b/motorApp/MotorSrc/asynMotorController.cpp index e5d069d5..ced4ee4f 100644 --- a/motorApp/MotorSrc/asynMotorController.cpp +++ b/motorApp/MotorSrc/asynMotorController.cpp @@ -764,6 +764,30 @@ asynStatus asynMotorController::writeController(const char *output, double timeo return status ; } +/** Reads a string from the controller. + * Calls deadController() with default locations of the input string and default timeout. */ +asynStatus asynMotorController::readController() +{ + size_t nread; + return readController(inString_, sizeof(inString_), &nread, DEFAULT_CONTROLLER_TIMEOUT); +} + +/** Reads a string from the controller + * \param[out] input Pointer to the input string location. + * \param[in] maxChars Size of the input buffer. + * \param[out] nread Number of characters read. + * \param[out] timeout Timeout before returning an error.*/ +asynStatus asynMotorController::readController(char *input, size_t maxChars, size_t *nread, double timeout) +{ + asynStatus status; + int eomReason; + // const char *functionName="readController"; + + status = pasynOctetSyncIO->read(pasynUserController_, input, maxChars, timeout, nread, &eomReason); + + return status; +} + /** Writes a string to the controller and reads the response. * Calls writeReadController() with default locations of the input and output strings * and default timeout. */ diff --git a/motorApp/MotorSrc/asynMotorController.h b/motorApp/MotorSrc/asynMotorController.h index bbcfa8e9..5de1ee79 100644 --- a/motorApp/MotorSrc/asynMotorController.h +++ b/motorApp/MotorSrc/asynMotorController.h @@ -302,6 +302,8 @@ class epicsShareClass asynMotorController : public asynPortDriver { /* These are convenience functions for controllers that use asynOctet interfaces to the hardware */ asynStatus writeController(); asynStatus writeController(const char *output, double timeout); + asynStatus readController(); + asynStatus readController(char *response, size_t maxResponseLen, size_t *responseLen, double timeout); asynStatus writeReadController(); asynStatus writeReadController(const char *output, char *response, size_t maxResponseLen, size_t *responseLen, double timeout); asynUser *pasynUserController_; From 44037550d0349ceaa6a74fa061c0e454c203760c Mon Sep 17 00:00:00 2001 From: Kevin Peterson Date: Tue, 6 Jun 2023 15:48:59 -0500 Subject: [PATCH 38/54] Updated motorAcsMotion to R2-2 for vxWorks build bugfix and improved homing --- modules/motorAcsMotion | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/motorAcsMotion b/modules/motorAcsMotion index 91e8e1eb..ee68ab79 160000 --- a/modules/motorAcsMotion +++ b/modules/motorAcsMotion @@ -1 +1 @@ -Subproject commit 91e8e1eb8d7e468f5628482a9e18e891c5960d9f +Subproject commit ee68ab79daf075215312ad851a84f5f18697ce77 From ed474417a1805d390a692f438bbc7ac35fe36b56 Mon Sep 17 00:00:00 2001 From: Kevin Peterson Date: Wed, 7 Jun 2023 15:21:40 -0500 Subject: [PATCH 39/54] Corrected typo in comment --- motorApp/MotorSrc/asynMotorController.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/motorApp/MotorSrc/asynMotorController.cpp b/motorApp/MotorSrc/asynMotorController.cpp index ced4ee4f..7b8199d0 100644 --- a/motorApp/MotorSrc/asynMotorController.cpp +++ b/motorApp/MotorSrc/asynMotorController.cpp @@ -765,7 +765,7 @@ asynStatus asynMotorController::writeController(const char *output, double timeo } /** Reads a string from the controller. - * Calls deadController() with default locations of the input string and default timeout. */ + * Calls readController() with default locations of the input string and default timeout. */ asynStatus asynMotorController::readController() { size_t nread; From 88c627ae02a2c26bbec391d15fd6fa3239e47477 Mon Sep 17 00:00:00 2001 From: Kevin Peterson Date: Wed, 7 Jun 2023 15:42:27 -0500 Subject: [PATCH 40/54] Updated documentation for R7-3-1 --- docs/RELEASE.md | 14 ++++++++++++++ docs/index.html | 8 ++++---- docs/motorRecord.html | 4 ++-- 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/docs/RELEASE.md b/docs/RELEASE.md index 832e2949..5e94d3a3 100644 --- a/docs/RELEASE.md +++ b/docs/RELEASE.md @@ -1,5 +1,19 @@ # Motor Releases +## __R7-3-1 (2023-06-07)__ +R7-3-1 is a release based on the master branch. + +### Changes since R7-3 + +#### Modifications to existing features +* Commit [5eb994d](https://github.com/epics-modules/motor/commit/5eb994dc5e0f8a809382b300ad13f8c83e7da33b) from [Mark Rivers](https://github.com/MarkRivers): Added readController() functions to asynMotorController + +#### Driver submodules (and noteworthy changes) + +| Module | Release | Changes | +| ---------------- | ------- | ------- | +| **motorAcsMotion** | [R2-2](https://github.com/epics-motor/motorAcsMotion/releases/tag/R2-2) | Improved homing and workaround for vxWorks build error | + ## __R7-3 (2023-05-23)__ R7-3 is a release based on the master branch. diff --git a/docs/index.html b/docs/index.html index 810adcf4..9f7bb765 100644 --- a/docs/index.html +++ b/docs/index.html @@ -53,7 +53,7 @@ the links in the table below:
    R7-3 R3.15.7 or later - motorR7-3.tar.gz + motorR7-3-1.tar.gz motorRecord.html release notes github issues @@ -63,8 +63,8 @@ the links in the table below:
    R7-2 R3.15.7 or later motorR7-2-2.tar.gz - motorRecord.html - release notes + motorRecord.html + release notes github issues 2020-05-13 @@ -707,7 +707,7 @@ different releases of EPICS and/or the other required modules are needed).

    -Page Last Modified: 2023-05-23
    +Page Last Modified: 2023-06-07
    Kevin Peterson

    diff --git a/docs/motorRecord.html b/docs/motorRecord.html index 11ec5adb..4e9255ce 100644 --- a/docs/motorRecord.html +++ b/docs/motorRecord.html @@ -35,9 +35,9 @@
-

Overview

This documentation describes version R7-3 of the EPICS motor +

Overview

This documentation describes version R7-3-1 of the EPICS motor record, and related EPICS software required to build and use it.  Version -R7-3 of the motor record is compatible with EPICS base R3.15.7 and above. +R7-3-1 of the motor record is compatible with EPICS base R3.15.7 and above.

The motor record is intended to support positioning motors of all kinds, but currently supports motor controllers from the following manufacturers: From d1ed86f128733070ec720286d1e1fad05e8e8156 Mon Sep 17 00:00:00 2001 From: Kevin Peterson Date: Fri, 4 Aug 2023 10:15:18 -0500 Subject: [PATCH 41/54] Fixed a 9-year-old typo in trajectoryScan_settings.req --- motorApp/Db/trajectoryScan_settings.req | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/motorApp/Db/trajectoryScan_settings.req b/motorApp/Db/trajectoryScan_settings.req index 2600d56e..4763ea16 100644 --- a/motorApp/Db/trajectoryScan_settings.req +++ b/motorApp/Db/trajectoryScan_settings.req @@ -1,4 +1,4 @@ -ed $(P)$(R)Nelements +$(P)$(R)Nelements $(P)$(R)MoveMode $(P)$(R)Npulses $(P)$(R)StartPulses From f8a3239f0678f8f3d75fd5cf2f9c717dc3db9426 Mon Sep 17 00:00:00 2001 From: Kevin Peterson Date: Fri, 8 Dec 2023 11:38:55 -0600 Subject: [PATCH 42/54] Override defaults.set for seq mirror --- .ci-local/defaults.set | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 .ci-local/defaults.set diff --git a/.ci-local/defaults.set b/.ci-local/defaults.set new file mode 100644 index 00000000..d9527915 --- /dev/null +++ b/.ci-local/defaults.set @@ -0,0 +1,40 @@ +# EPICS Base +BASE=7.0 +BASE_DIRNAME=base +BASE_REPONAME=epics-base +BASE_REPOOWNER=epics-base +BASE_VARNAME=EPICS_BASE + +PVDATA_DIRNAME=pvData +PVDATA_REPONAME=pvDataCPP +PVDATA_REPOOWNER=epics-base + +PVACCESS_DIRNAME=pvAccess +PVACCESS_REPONAME=pvAccessCPP +PVACCESS_REPOOWNER=epics-base + +NTYPES_DIRNAME=normativeTypes +NTYPES_REPONAME=normativeTypesCPP +NTYPES_REPOOWNER=epics-base + +# Sequencer +#SNCSEQ_REPOURL=https://www-csr.bessy.de/control/SoftDist/sequencer/repo/branch-2-2.git +# Use Michael Davidsaver's mirror while bessy.de is down +SNCSEQ_REPOURL=https://github.com/mdavidsaver/sequencer-mirror.git +SNCSEQ_DEPTH=0 +SNCSEQ_DIRNAME=seq + +# StreamDevice +STREAM_REPONAME=StreamDevice +STREAM_REPOOWNER=paulscherrerinstitute + +# The default settings also work (and are tested) for: +# asyn +# std +# calc +# autosave +# busy +# sscan +# iocStats +# motor +# ipac From 148c943719b3de41c0d31439185398fcfacd0d22 Mon Sep 17 00:00:00 2001 From: Kevin Peterson Date: Mon, 22 Jan 2024 09:02:27 -0600 Subject: [PATCH 43/54] Set encoder ratio to 1 if ERES is 0 to avoid dividing by 0 --- motorApp/MotorSrc/devMotorAsyn.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/motorApp/MotorSrc/devMotorAsyn.c b/motorApp/MotorSrc/devMotorAsyn.c index 79ad5ea8..603f49f8 100644 --- a/motorApp/MotorSrc/devMotorAsyn.c +++ b/motorApp/MotorSrc/devMotorAsyn.c @@ -174,10 +174,17 @@ static void init_controller(struct motorRecord *pmr, asynUser *pasynUser ) int use_rel = (pmr->rtry != 0 && pmr->rmod != motorRMOD_I && (pmr->ueip || pmr->urip)); int dval_non_zero_pos_near_zero = (fabs(pmr->dval) > rdbd) && (pmr->mres != 0) && (fabs(position * pmr->mres) < rdbd); - epicsFloat64 eratio = pmr->mres / pmr->eres; + epicsFloat64 eratio; int initPos = 0; int status; + /* Don't let the encoder ratio be infinite */ + if (pmr->eres == 0.0) { + eratio = 1.0; + } else { + eratio = pmr->mres / pmr->eres; + } + /* Write encoder ratio to the driver.*/ pPvt->pasynUserSync->reason = pPvt->driverReasons[motorEncRatio]; status = pasynFloat64SyncIO->write(pPvt->pasynUserSync, eratio, pasynUser->timeout); From 7212f1acb91e5001e58d1264380777c55bb8bdaa Mon Sep 17 00:00:00 2001 From: Kevin Peterson Date: Tue, 23 Jul 2024 10:02:05 -0500 Subject: [PATCH 44/54] Upgraded ci-scripts to v3.4.1 --- .ci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.ci b/.ci index 57646016..20f8e053 160000 --- a/.ci +++ b/.ci @@ -1 +1 @@ -Subproject commit 576460163031255c09948566dd2f2409d86ab8d4 +Subproject commit 20f8e053931fdef8a9413cc6229286c5d9ed152f From f1159c66a686d5c596049174cd53ecd3e5e209a4 Mon Sep 17 00:00:00 2001 From: Kevin Peterson Date: Tue, 23 Jul 2024 10:03:20 -0500 Subject: [PATCH 45/54] Revert "Override defaults.set for seq mirror" This reverts commit f8a3239f0678f8f3d75fd5cf2f9c717dc3db9426. --- .ci-local/defaults.set | 40 ---------------------------------------- 1 file changed, 40 deletions(-) delete mode 100644 .ci-local/defaults.set diff --git a/.ci-local/defaults.set b/.ci-local/defaults.set deleted file mode 100644 index d9527915..00000000 --- a/.ci-local/defaults.set +++ /dev/null @@ -1,40 +0,0 @@ -# EPICS Base -BASE=7.0 -BASE_DIRNAME=base -BASE_REPONAME=epics-base -BASE_REPOOWNER=epics-base -BASE_VARNAME=EPICS_BASE - -PVDATA_DIRNAME=pvData -PVDATA_REPONAME=pvDataCPP -PVDATA_REPOOWNER=epics-base - -PVACCESS_DIRNAME=pvAccess -PVACCESS_REPONAME=pvAccessCPP -PVACCESS_REPOOWNER=epics-base - -NTYPES_DIRNAME=normativeTypes -NTYPES_REPONAME=normativeTypesCPP -NTYPES_REPOOWNER=epics-base - -# Sequencer -#SNCSEQ_REPOURL=https://www-csr.bessy.de/control/SoftDist/sequencer/repo/branch-2-2.git -# Use Michael Davidsaver's mirror while bessy.de is down -SNCSEQ_REPOURL=https://github.com/mdavidsaver/sequencer-mirror.git -SNCSEQ_DEPTH=0 -SNCSEQ_DIRNAME=seq - -# StreamDevice -STREAM_REPONAME=StreamDevice -STREAM_REPOOWNER=paulscherrerinstitute - -# The default settings also work (and are tested) for: -# asyn -# std -# calc -# autosave -# busy -# sscan -# iocStats -# motor -# ipac From a4a6dbddf412f7e66bf80131105d27c2bfb34e17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torsten=20B=C3=B6gershausen?= Date: Tue, 22 Oct 2024 12:05:44 +0200 Subject: [PATCH 46/54] motorRecord.cc: Post ueip if reset to false when encoder missing commit 24a53e660e213ae6a57dc4d6f5648bed895ef85e, "motorRecord: Reset UEIP to No if no encoder is present" Seems to have introduced a typo: When ueip is reset to false, because there is no encoder, then db_post_events(ueip) should be called, not urip. --- motorApp/MotorSrc/motorRecord.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/motorApp/MotorSrc/motorRecord.cc b/motorApp/MotorSrc/motorRecord.cc index 1760b6dc..ae78a176 100644 --- a/motorApp/MotorSrc/motorRecord.cc +++ b/motorApp/MotorSrc/motorRecord.cc @@ -3664,7 +3664,7 @@ static void process_motor_info(motorRecord * pmr, bool initcall) if ((pmr->ueip == motorUEIP_Yes) && (!(msta.Bits.EA_PRESENT))) { pmr->ueip = motorUEIP_No; - db_post_events(pmr, &pmr->urip, DBE_VAL_LOG); + db_post_events(pmr, &pmr->ueip, DBE_VAL_LOG); } if (pmr->ueip == motorUEIP_Yes) { From c1830b2f2d428e2e15ad9a13265cc9f0f65f9612 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torsten=20B=C3=B6gershausen?= Date: Tue, 22 Oct 2024 12:15:08 +0200 Subject: [PATCH 47/54] ci-scripts-build-full.yml: Remove ubuntu 18.04 --- .github/workflows/ci-scripts-build-full.yml | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/.github/workflows/ci-scripts-build-full.yml b/.github/workflows/ci-scripts-build-full.yml index a0fae509..aba7fdbc 100644 --- a/.github/workflows/ci-scripts-build-full.yml +++ b/.github/workflows/ci-scripts-build-full.yml @@ -108,22 +108,6 @@ jobs: #! set: modules #! name: "Ub-20 gcc-9 + RT-5.1 beatnik" - - os: ubuntu-18.04 - cmp: gcc - configuration: default - base: "7.0" - set: modules - name: "Ub-18 gcc-7" - - ### g++-8 not found - #!- os: ubuntu-18.04 - #! cmp: gcc-8 - #! utoolchain: true - #! configuration: default - #! base: "7.0" - #! set: modules - #! name: "Ub-18 gcc-8" - #!- os: ubuntu-20.04 #! cmp: gcc-8 #! utoolchain: true From 685e79fd704796efd8583b170237e90591a4c313 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torsten=20B=C3=B6gershausen?= Date: Tue, 22 Oct 2024 12:21:48 +0200 Subject: [PATCH 48/54] ci-scripts-build.yml: upload-artifact@v3 --- .github/workflows/ci-scripts-build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci-scripts-build.yml b/.github/workflows/ci-scripts-build.yml index d6252750..75bd28d8 100644 --- a/.github/workflows/ci-scripts-build.yml +++ b/.github/workflows/ci-scripts-build.yml @@ -96,7 +96,7 @@ jobs: - name: Run main module tests run: python .ci/cue.py test - name: Upload tapfiles Artifact - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 with: name: tapfiles ${{ matrix.name }} path: '**/O.*/*.tap' From 7fbdf4b99edb6015a762f9d51b67d510b2ee74f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torsten=20B=C3=B6gershausen?= Date: Wed, 13 Nov 2024 12:01:59 +0100 Subject: [PATCH 49/54] docs/motorRecord.html: CNEN is implementation specific The CNEN field has been developed with motion controllers which can switch between open- and closed-loop. In modern controllers this is hard-coded inside the motion controller, or to be more exact, sometimes the configuration of ths controller. In other words, the CNEN field has been used to enable or disable the motor. Make this different usage and functionality more clear. --- docs/motorRecord.html | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/docs/motorRecord.html b/docs/motorRecord.html index 4e9255ce..763c15ca 100644 --- a/docs/motorRecord.html +++ b/docs/motorRecord.html @@ -2875,11 +2875,18 @@ below. R/W Enable control RECCHOICE - (0:"Disable", 1:"Enable")  Enable/Disable closed-loop position control.  - This field is active only if the GAIN_SUPPORT bit in the MSTA is true.  - This field is set by both the user and device support.  CNEN is set to Disable - by device support when it detects a motion controller error; e.g. maximum - following error exceeded. + This field is active only if the GAIN_SUPPORT bit in the MSTA is true. + The function of this field is depending on the motion controller. + This field is set by both the user and device support. +

  • + Some (older?) controllers can switch between open- and closed-loop. (0: open loop, 1: closed loop) +
  • +
  • + Some controllers use this field to enable torque control +
  • +
  • + Most modern controllers use this field to enable/disable the motor (amplifier/driver) +
  • PCOF From df0132e73ea594ed6e7de2d77f2df84d39fe7cb1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torsten=20B=C3=B6gershausen?= Date: Wed, 13 Nov 2024 12:12:26 +0100 Subject: [PATCH 50/54] docs/motorRecord.html: Document HOMF and HOMR better Modern motion controller may have more advanced homing sequences the what is specified in the motorRecord documentation. However, many installations and implementations still use the HOMF and HOMR fields to initiate such a homing sequence. Make this more clear. --- docs/motorRecord.html | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/docs/motorRecord.html b/docs/motorRecord.html index 763c15ca..3b4f7cdc 100644 --- a/docs/motorRecord.html +++ b/docs/motorRecord.html @@ -2377,7 +2377,13 @@ below. motor stops, the VAL field will be set equal to the RBV field, and the DVAL field will be set equal to the DRBV field.  These fields can be set to 1, but setting either field to 0 results in an error.  The record sets HOM[F/R] - to zero when the homing procedure is either completed or aborted. + to zero when the homing procedure is either completed or aborted. + Note that modern controllers, depending on their firmware and configuration, + may do different things. Examples are home into the limit switch, move + into a limit switch, return and search for a home switch or other sequences. + Often HOMF and HOMR then yield the same functionality. + And the controller may choose to do nothing, if a motor is not homable. +
    From af9f8fd24bc6101fac892315d457f1e29db406bd Mon Sep 17 00:00:00 2001 From: "J. Lewis Muir" Date: Fri, 31 Jan 2025 20:54:21 -0600 Subject: [PATCH 51/54] Fix typos in motorDeviceDriver.html --- docs/motorDeviceDriver.html | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/docs/motorDeviceDriver.html b/docs/motorDeviceDriver.html index 2a4ada64..33340bda 100644 --- a/docs/motorDeviceDriver.html +++ b/docs/motorDeviceDriver.html @@ -47,13 +47,13 @@ for new motor drivers.

    The APIs described here are mainly intended to be used with the EPICS motor record. - However the Model 2 and Model 3 drivers are actually independent of the motor record. + However, the Model 2 and Model 3 drivers are actually independent of the motor record. They implement standard EPICS asyn interfaces, and can in principle be used with any EPICS records, and do not require the motor record. However, the motor record currently provides the only "state machine" logic that keeps track of backlash, - enforcing soft limits, etc. Model 2 and 3 drivers to permit access to controller-specific - features that the motor record does not support, and this is typicaly implemented - using standard EPICS records (ao, ai, bo, bi, etc.)

    + enforcing soft limits, etc. Model 2 and 3 drivers permit access to controller-specific + features that the motor record does not support, and this is typically implemented + using standard EPICS records (ao, ai, bo, bi, etc.).

    Model 1 device and driver support

    @@ -65,13 +65,13 @@

  • The communication channel between device support and driver is custom for the motor record, and is very limited.
  • The communication between device support and the driver is assumed to be via device-dependent - strings. Thus, it not suited to register-based controllers, or controllers where - the driver calls a vendor-library, rather than just sending strings to the controller.
  • -
  • Cannot use other records to with the driver, only the motor record. Cannot take + strings. Thus, it is not suited to register-based controllers, or controllers where + the driver calls a vendor library rather than just sending strings to the controller.
  • +
  • Cannot use other records with the driver, only the motor record. Cannot take advantage of controller-specific features not supported by the motor record.
  • There is no provision for multi-axis coordination.
  • There is only a single thread per controller type. This means that if a - system has, for example, many controllers of a given type then there is only one + system has, for example, many controllers of a given type, then there is only one polling thread for all of these controllers. This is because the poller must wait for each response before sending the next query. This can lead to significantly poorer performance compared to the Model 2 and Model 3 drivers, which have a separate @@ -89,7 +89,7 @@
    • Uses standard asyn interfaces to communicate between device support and driver.
    • There is only a single device-independent device support file (devMotorAsyn.c).
    • -
    • There is a single device-independent driver support file for asyn interfaces (drvMotorAsyn.).
    • +
    • There is a single device-independent driver support file for asyn interfaces (drvMotorAsyn.c).
    • There is a device-dependent driver file below the asyn one. This driver must implement a set of functions that the device-independent driver file calls.
    • Can use other records to talk to driver via asyn interfaces. This allows support @@ -131,24 +131,24 @@

    The Model 3 C++ API is based on the concept of two types of objects: a motor controller - and one or motor motor axes. The controller object supports the functions that apply + and one or more motor axes. The controller object supports the functions that apply to the entire controller. The controller supports one or more axes. The axis objects support the functions for a specific axis. These objects are implemented in the - device-dependent driver. There is a base class for each of these objects, asynMotorControlller + device-dependent driver. There is a base class for each of these objects, asynMotorController and asynMotorAxis.

    The asynMotorController base class has methods that handle much of the work in writing a driver, including implementing the asyn interfaces and calling the appropriate methods in the axis classes. A basic motor driver derived class will often only - need to implement only the constructor for the controller class, and can just use + need to implement the constructor for the controller class, and can just use the base class implementation of all other methods in the asynMotorController class.

    The asynMotorAxis base class on the other hand mainly provides dummy methods (asynMotorAxis::move(), asynMotorAxis::stop(), etc.). The main work in writing a Model 3 driver consists of implementing these methods in the derived class.

    - There are Model 3 drivers in the motor module for the simulation motor, Hytec XXXX, + There are Model 3 drivers in the motor module for the simulation motor, Hytec 8601, Newport XPS, Parker ACR series controllers (e.g. Aires), and the ACS MCB-4B.

    The ACS MCB-4B is the simplest Model 3 driver, consisting of only 336 lines of well-commented @@ -172,7 +172,7 @@ The number of axes on this controller.

  • numParams
    The number of controller-specific parameters for this controller.  If the driver - only implements the standard motor record parameters then this is set to 0.
  • + only implements the standard motor record parameters, then this is set to 0.
  • interfaceMask
    A bit mask for extra asyn interfaces supported by this controller. It is not necessary to specify the interfaces that the base class implements, which includes asynOctet, @@ -181,11 +181,11 @@
  • interruptMask
    A bit mask for extra asyn interfaces supported by this controller that will do callbacks to device support. It is not necessary to specify the interfaces that the base class - implements, which includes asynOctet, asynInt32, asynFloat64, asynFloat64Array, + implements, which include asynOctet, asynInt32, asynFloat64, asynFloat64Array, and asynGenericPointer. Normally set to 0.
  • asynFlags
    asyn flags to use when creating the asyn port. This is normally (ASYN_CANBLOCK | - ASYN_MULTIDEVICE). ASYN_CANBLOCK means that the driver is "slow" and asynchonous + ASYN_MULTIDEVICE). ASYN_CANBLOCK means that the driver is "slow" and asynchronous device support must be used. ASYN_MULTIDEVICE means that the device supports more than one asyn address, i.e. more than one motor axis.
  • autoConnect
    From 0aaf02d779996eb1c06a4329823aadcdbb8c12cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torsten=20B=C3=B6gershausen?= Date: Tue, 11 Feb 2025 15:13:36 +0100 Subject: [PATCH 52/54] motorRecord: prevent endless loop VAL-HOMF-VAL The following lead to an endless loop: - move the motor by writing to the .VAL field - while moving, home the motor using the HOMF field - while still homing, write a different value to the VAL field. The problem is that for "pmr->val != pmr->lval" the motorRecord is send into do_work() and a new HOME is started. Solution: Reset the HOMF and HOMR buttons. --- motorApp/MotorSrc/motorRecord.cc | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/motorApp/MotorSrc/motorRecord.cc b/motorApp/MotorSrc/motorRecord.cc index ae78a176..9775f96a 100644 --- a/motorApp/MotorSrc/motorRecord.cc +++ b/motorApp/MotorSrc/motorRecord.cc @@ -1385,6 +1385,13 @@ static long process(dbCommon *arg) !(pmr->mip & MIP_STOP) && !(pmr->mip & MIP_JOG_STOP)) { + if (pmr->mip == MIP_HOMF || pmr->mip == MIP_HOMR) + { + /* Bug fix: motor enters an infinite HOME loop + in a sequence where VAL HOMF VAL is written */ + clear_buttons(pmr); + } + pmr->mip = MIP_DONE; /* Bug fix, record locks-up when BDST != 0, DLY != 0 and * new target position before backlash correction move.*/ From 069b8ce6407b15db68b2a70fe01a7cacb51ee64a Mon Sep 17 00:00:00 2001 From: "J. Lewis Muir" Date: Sun, 16 Feb 2025 13:53:36 -0600 Subject: [PATCH 53/54] Fix typos in motorRecord.html --- docs/motorRecord.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/motorRecord.html b/docs/motorRecord.html index 3b4f7cdc..cc2ff48f 100644 --- a/docs/motorRecord.html +++ b/docs/motorRecord.html @@ -1923,9 +1923,9 @@ below. R/W Set Point Deadband (EGU) DOUBLE - Before the motor is commanded a move, a check is done if the move is to small. - It is to small when the distance is less the the step size defined in MRES. - When a bigger deadband is wanted than MRES, set the value into SPDB. + Before the motor is commanded to move, a check is done to see if the move is + too small. It is too small when the distance is less than the step size defined in + MRES. When a bigger deadband is wanted than MRES, set the value of SPDB. From 060180e6451ca145a5299765db377b51eefd1b1e Mon Sep 17 00:00:00 2001 From: Kevin Peterson Date: Mon, 17 Feb 2025 09:06:17 -0600 Subject: [PATCH 54/54] Github actions fix --- .github/workflows/ci-scripts-build-full.yml | 2 +- .github/workflows/ci-scripts-build.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci-scripts-build-full.yml b/.github/workflows/ci-scripts-build-full.yml index aba7fdbc..050e780a 100644 --- a/.github/workflows/ci-scripts-build-full.yml +++ b/.github/workflows/ci-scripts-build-full.yml @@ -187,7 +187,7 @@ jobs: - name: Run main module tests run: python .ci/cue.py test - name: Upload tapfiles Artifact - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v4 with: name: tapfiles ${{ matrix.name }} path: '**/O.*/*.tap' diff --git a/.github/workflows/ci-scripts-build.yml b/.github/workflows/ci-scripts-build.yml index 75bd28d8..55344899 100644 --- a/.github/workflows/ci-scripts-build.yml +++ b/.github/workflows/ci-scripts-build.yml @@ -96,7 +96,7 @@ jobs: - name: Run main module tests run: python .ci/cue.py test - name: Upload tapfiles Artifact - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: tapfiles ${{ matrix.name }} path: '**/O.*/*.tap'