ࡱ> f}        !!""##$$%%&&''(())**++,,--..//001122 "   !$#P%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNORQpSTUVWXYZ[\]^_`abcdefg ijklmnoqrstuvwxyz{|~Root Entry, Fp_o@@HA7CrDBE@HA0C;;B&F7BB4FhD&B2'0@HA0C??(E8BA(H<@HAEFAE(?(E8BA(HN@H C1A5G BkL C1A5G=F  {> C1A5G?3H v> C1A5G~AdDqE%D3Ha C1A5GA2DCE,H 2 C1A5GAE7CD1H C1A5GAB%D3H B C1A5G>BA/A0C&H/ C1A5G>CqB2H%86 C1A5G>CE7CD1H C1A5G~E(DrFA2H3 C1A5G~ED$C5C&HY @HDED/H |@HDED/;rD'C7CrDX(@HDED;9BE@@H CCB 6R@HNED5H ,@HNFhD=D3CB)*x@HRDEC;;B&F7BB4FhD&B$@HRDEC??(E8BA(H4"l@HYEDhE7G @HA'C:ED1H$@HBEEC(HT@H<BE &@H?CAED1H91P(SummaryInformation(@H?dA/B6H P@H?;C8DE 8@H??wElDj>D/Hh@H??wElDj;E$H !$@H C5BErE{&BrandingUL}MakeMsi by Dennis Bareis{&BrandingLR}MakeMsi by Dennis BareisBrandingULBannerGraphic.BMPBrandingLRPlease enter your company information{80}COMPANYNAMEEditOrganizationEdit&Please enter the name of your organization in the box below. This will be used as default company name for subsequent installations of [ProductName]:[DlgTitleFont]Company Information[DialogBitmap]The [Wizard] will create a server image of [ProductName], at a specified network location. Click Next to continue or Cancel to exit the [Wizard].{\VerdanaBold13}Welcome to the [ProductName] [Wizard]BrowseDlg_BrowsePropertyInformation icon|[InfoIcon]IconCancelDlgYes[ButtonText_No]NoAre you sure you want to cancel [ProductName] installation?[ButtonText_Yes]CustomizeDlgTreeGroupBoxBoxResetSelect the way you want features to be installed.Disk &UsageDiskCostMultiline description of the currently selected item.ItemDescriptionThe size of the currently selected item.ItemSizeFeatureDirFontLocationLocation:LocationLabel[ButtonText_Reset]Click on the icons in the tree below to change the way features will be installed.[DlgTitleFont]Custom SetupTree of selectionsSelectionTreeDiskCostDlgThe disk space required for the installation of the selected features.The highlighted volumes (if any) do not have enough disk space available for the currently selected features. You can either remove some files from the highlighted volumes, or choose to install less features onto local drive(s), or select different destination drive(sNameTableTypeActionTextActionDescriptionTemplateAdvertising applicationAdvertiseFree space: [1]Allocating registry spaceAllocateRegistrySpaceProperty: [1], Signature: [2]Searching for installed applicationsAppSearchFile: [1]Binding executablesBindImageSearching for qualifying productsCCPSearchComputing space requirementsCostFinalizeCostInitializeFolder: [1]Creating foldersCreateFoldersShortcut: [1]Creating shortcutsCreateShortcutsService: [1]Deleting servicesDeleteServicesFile: [1], Directory: [9], Size: [6]Creating duplicate filesDuplicateFilesFileCostFound application: [1]Searching for related applicationsFindRelatedProducts[1]Generating script operations for action:GenerateScriptFile: [1], Directory: [9], Size: [6]Copying network install filesInstallAdminPackageCopying new filesInstallFilesInstalling ODBC componentsInstallODBCFile: [1], Dependencies: [2]Installing system catalogInstallSFPCatalogFileService: [2]Installing new servicesInstallServicesValidating installInstallValidateEvaluating launch conditionsLaunchConditionsApplication: [1]Migrating feature states from related applicationsMigrateFeatureStatesMoving filesMoveFilesApplication Context:[1], Assembly Name:[2]Publishing assembly informationMsiPublishAssembliesUnpublishing assembly informationMsiUnpublishAssembliesFile: [1], Directory: [2], Size: [3]Patching filesPatchFilesUpdating component registrationProcessComponentsComponent ID: [1], Qualifier: [2]Publishing Qualified ComponentsPublishComponentsFeature: [1]Publishing Product FeaturesPublishFeaturesPublishing product informationPublishProductRMCCPSearchClass Id: [1]Registering Class serversRegisterClassInfoAppId: [1]{{, AppType: [2], Users: [3], RSN: [4]}}Registering COM+ Applications and ComponentsRegisterComPlusExtension: [1]Registering extension serversRegisterExtensionInfoFont: [1]Registering fontsRegisterFontsMIME Content Type: [1], Extension: [2]Registering MIME infoRegisterMIMEInfoRegistering productRegisterProductProgId: [1]Registering program identifiersRegisterProgIdInfoLibID: [1]Registering type librariesRegisterTypeLibrariesRegistering userRegisterUserFile: [1], Directory: [9]Removing duplicated filesRemoveDuplicateFilesName: [1], Value: [2], Action [3]Updating environment stringsRemoveEnvironmentStringsApplication: [1], Command line: [2]Removing applicationsRemoveExistingProductsRemoving filesRemoveFilesRemoving foldersRemoveFoldersFile: [1], Section: [2], Key: [3], Value: [4]Removing INI files entriesRemoveIniValuesRemoving ODBC componentsRemoveODBCKey: [1], Name: [2]Removing system registry valuesRemoveRegistryValuesRemoving shortcutsRemoveShortcutsRolling back action:RollbackRemoving backup filesRollbackCleanupFile: [1], Folder: [2]Registering modulesSelfRegModulesUnregistering modulesSelfUnregModulesInitializing ODBC directoriesSetODBCFoldersStarting servicesStartServicesStopping servicesStopServicesRemoving moved filesUnmoveFilesUnpublishing Qualified ComponentsUnpublishComponentsUnpublishing Product FeaturesUnpublishFeaturesUnpublishing product informationUnpublishProductUnregister Class serversUnregisterClassInfoAppId: [1]{{, AppType: [2]}}Unregistering COM+ Applications and ComponentsUnregisterComPlusUnregistering extension serversUnregisterExtensionInfoUnregistering fontsUnregisterFontsUnregistering MIME infoUnregisterMIMEInfoUnregistering program identifiersUnregisterProgIdInfoUnregistering type librariesUnregisterTypeLibrariesWriteEnvironmentStringsWriting INI files valuesWriteIniValuesKey: [1], Name: [2], Value: [3]Writing system registry valuesWriteRegistryValuesAdminExecuteSequenceConditionSequenceInstallFinalizeInstallInitializeAdminUISequenceAdminWelcomeDlgExecuteActionExitDialogFatalErrorPrepareDlgProgressDlgUserExitAdvtExecuteSequenceBBControlBillboard_XYWidthHeightAttributesTextBillboardFeature_OrderingBinaryDataNewUpbannrbmpcompleticusticondlgbmpexclamicinfoinsticonremovicorepairicCheckBoxPropertyValueComboBoxOrderControlDialog_Control_NextHelpPathEdit[BannerBitmap]BitmapBannerBitmapAdminBrowseDlgLineBannerLineBottomLineComboLabel[ButtonText_Cancel]PushButtonCancelD).[DlgTitleFont]Disk Space Requirements{120}{70}{70}{70}{70}VolumeCostListVolumeListAErrorDlgCErrorIconInformation textErrorText[ButtonText_Ignore]INO[ButtonText_Retry]RFinishClick the Finish button to exit the [Wizard].[ButtonText_Finish]{\VerdanaBold13}Completing the [ProductName] [Wizard][ProductName] setup ended prematurely because of an error. Your system has not been modified. To install this program at a later time, please run the installation again.Description1Description2VerdanaBold13RedRetryFilesInUseSome files that need to be updated are currently in use.[ButtonText_Exit]ExitIgnoreFileInUseProcessListBoxListThe following applications are using files that need to be updated by this setup. Close these applications and then click Retry to continue the installation or Cancel to exit it.[DlgTitleFont]Files in UseButtonsPropertyCa01_ARPINSTALLLOCATIONScrollableTextAgreementTextLicenseAgreementDlgIAgreeRadioButtonGroupPlease read the following license agreement carefully[DlgTitleFont]End-User License AgreementMaintenanceTypeDlgChangeLabelModify Installation|RepairLabel[CustomSetupIcon]ChangeButton[DlgTitleFont]&ModifyAllows users to change the way features are installed.ChangeTextSelect the operation you wish to perform.Remove Installation|[RemoveIcon]RemoveButton[DlgTitleFont]&RemoveRemoveLabelRemoves [ProductName] from your computer.RemoveTextRepair Installation|[RepairIcon]RepairButton[DlgTitleFont]Re&pairRepairs errors in the most recent installation state - fixes missing or corrupt files, shortcuts and registry entries.RepairText[DlgTitleFont]Modify, Repair or Remove installationMaintenanceWelcomeDlgThe [Wizard] will allow you to change the way [ProductName] features are installed on your computer or even to remove [ProductName] from your computer. Click Next to continue or Cancel to exit the [Wizard].OutOfDiskDlgDisk space required for the installation exceeds available disk space.The highlighted volumes do not have enough disk space available for the currently selected features. You can either remove some files from the highlighted volumes, or choose to install less features onto local drive(s), or select different destination drive(s).[DlgTitleFont]Out of Disk SpaceOutOfRbDiskDlgAlternatively, you may choose to disable the installer's rollback functionality. This allows the installer to restore your computer's original state should the installation be interrupted in any way. Click Yes if you wish to take the risk to disable rollback.Text2ActionDataPlease wait while the [Wizard] prepares to guide you through the installation.Progress doneProgressBarStatus:StatusLabelPlease wait while the [Wizard] [Progress2] [ProductName]. This may take several minutes.[DlgTitleFont][Progress1] [ProductName]InstallResumeDlgThe [Wizard] will complete the installation of [ProductName] on your computer. Click Install to continue or Cancel to exit the [Wizard].[ButtonText_Install]{\VerdanaBold13}Resuming the [ProductName] [Wizard]SetupTypeDlgTypicalLabelComplete Installation|[CompleteSetupIcon]CompleteButtonInstall the complete product in the default location.CompleteLabel[ProductName] ([ProductVersion]) [Setup]CompleteTextCustom Installation|CustomButton[DlgTitleFont]C&ustomCustomLabelAllows users to choose which program features will be installed and where they will be installed. Recommended for advanced users.CustomTextChoose the setup type that best suits your needs[DlgTitleFont]Choose Setup TypeTypical Installation|[InstallerIcon]TypicalButton[DlgTitleFont]&TypicalInstalls the most common program features. Recommended for most users.TypicalText[ProductName] setup was interrupted. Your system has not been modified. To install this program at a later time, please run the installation again.{\VerdanaBold13}[ProductName] [Wizard] was interruptedSourceDirYANKEE~1|Yankee RoboticsARPINSTALLLOCATIONProgramFilesFolder.:ProgramF|Program Files_PROGRAMFILESFOLDER_YANKEE_ROBOTICSINSTALLDIR[INSTALLDIR]VerifyReadyDlgThe [Wizard] is ready to begin the [InstallMode] installationClick Install to begin the installation. If you want to review or change any of your installation settings, click Back. Click Cancel to exit the wizard.[DlgTitleFont]Ready to InstallRemoveVerifyRemoveDlgYou have chosen to remove the program from your computer.[ButtonText_Remove]Click Remove to remove [ProductName] from your computer. If you want to review or change any of your installation settings, click Back. Click Cancel to exit the wizard.This will install "[ProductName]" (version [ProductVersion], dated [_MAKEMSI_BuildTime]) onto your computer. Click "Next" to continue.RepairVerifyRepairDlgThe [Wizard] is ready to begin the repair of [ProductName].[ButtonText_Repair]Click Repair to repair the installation of [ProductName]. If you want to review or change any of your installation settings, click Back. Click Cancel to exit the wizard.[DlgTitleFont]Remove [ProductName] Exclamation icon|[ExclamationIcon]WaitForCostingDlg[ButtonText_Return]ReturnPlease wait while the installer finishes determining your disk space requirements.WelcomeDlgCompanyLogoControth.DefaultDirUnique identifier for directory entry, primary key. If a property by this name is defined, it contains the full path to the directory.Reference to the entry in this table specifying the default parent directory. A record parented to itself or with a Null parent represents a root of the install tree.Directory_ParentThe depth below the path to which the Signature_ is recursively searched. If absent, the depth is assumed to be 0.DepthDrLocatorThe parent file signature. It is also a foreign key in the Signature table. If null and the Path column does not expand to a full path, then all the fixed drives of the user system are searched using the Path.ParentThe path on the user system. This is a either a subpath below the value of the Parent or a full path. The path may contain properties enclosed within [ ] that will be expanded.AnyPathThe Signature_ represents a unique file signature and is also the foreign key in the Signature table.Foreign key referencing Component that controls the duplicate file.DlConditionControl_InstalledHideIAgree <> "Yes"DisableIAgree = "Yes"EnableControlEventEventArgument1EndDialog0DirectoryListNewSetTargetPathDirectoryListUpNewDialogSpawnDialogProductIDValidateProductIDServer Image[InstallMode][_BrowseProperty]InstallMode = "Change"InstallMode = "Custom"SelectionBrowseErrorAbortErrorCancelErrorIgnoreErrorNoErrorOkErrorRetryErrorYesThis is the GUI created by Yankee Robotics, LLC to allow you to test your camera. If you use CCDSoft or MaxIm/DL you will not need this GUI to take images.PropertyCa02_PRIMARYFOLDERCostingComplete = 1SpawnWaitDialogChangeChanging[Progress1]changes[Progress2]RemovingremovesRepairingnot UserPressedYesOnCancelDlgFalseEnableRollbackOutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND PROMPTROLLBACKCOST="D"OutOfDiskSpace <> 1(OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 1) OR (OutOfDiskSpace = 1 AND PROMPTROLLBACKCOST="F")OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND (PROMPTROLLBACKCOST="P" OR NOT PROMPTROLLBACKCOST)PRIMARYFOLDER{\rtf1\ansi\ansicpg1252\uc1\deff0\stshfdbch0\stshfloch0\stshfhich0\stshfbi0\deflang1033\deflangfe1033{\fonttbl{\f0\froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f1\fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Arial;} {\f38\froman\fcharset238\fprq2 Times New Roman CE;}{\f39\froman\fcharset204\fprq2 Times New Roman Cyr;}{\f41\froman\fcharset161\fprq2 Times New Roman Greek;}{\f42\froman\fcharset162\fprq2 Times New Roman Tur;} {\f43\froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f44\froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f45\froman\fcharset186\fprq2 Times New Roman Baltic;}{\f46\froman\fcharset163\fprq2 Times New Roman (Vietnamese);} {\f48\fswiss\fcharset238\fprq2 Arial CE;}{\f49\fswiss\fcharset204\fprq2 Arial Cyr;}{\f51\fswiss\fcharset161\fprq2 Arial Greek;}{\f52\fswiss\fcharset162\fprq2 Arial Tur;}{\f53\fswiss\fcharset177\fprq2 Arial (Hebrew);} {\f54\fswiss\fcharset178\fprq2 Arial (Arabic);}{\f55\fswiss\fcharset186\fprq2 Arial Baltic;}{\f56\fswiss\fcharset163\fprq2 Arial (Vietnamese);}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0; \red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128; \red192\green192\blue192;}{\stylesheet{\ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \snext0 Normal;}{\*\cs10 \additive \ssemihidden Default Paragraph Font;}{\* \ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tscellwidthfts0\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs20\lang1024\langfe1024\cgrid\langnp1024\langfenp1024 \snext11 \ssemihidden Normal Table;}{\*\cs15 \additive \ul\cf2 \sbasedon10 \styrsid5901308 Hyperlink;}} {\*\rsidtbl \rsid1538531\rsid5901308\rsid11469386}{\*\generator Microsoft Word 10.0.6612;}{\info{\author Daniel J Wisehart}{\operator Daniel J Wisehart}{\creatim\yr2004\mo12\dy5\hr23\min33}{\revtim\yr2004\mo12\dy5\hr23\min36}{\version3}{\edmins3} {\nofpages1}{\nofwords158}{\nofchars903}{\*\company Yankee Robotics, LLC}{\nofcharsws1059}{\vern16389}}\widowctrl\ftnbj\aenddoc\noxlattoyen\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\hyphcaps0\horzdoc\dghspace120\dgvspace120\dghorigin1701\dgvorigin1984 \dghshow0\dgvshow3\jcompress\viewkind4\viewscale100\nolnhtadjtbl\rsidroot5901308 \fet0\sectd \linex0\sectdefaultcl\sftnbj {\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}} {\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (} {\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}\pard\plain \ql \li0\ri0\nowidctlpar\faauto\rin0\lin0\itap0 \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\f1\fs20\insrsid1538531\charrsid5901308 You have the right to install, copy and use the Trifid Camera software. You may modify and recompile the source code provided in the Software Development Kit. You may redistribute the source code you modify and the binaries you compile, b ut you must include a copyright for Yankee Robotics, LLC that is available to the end-user. The best place for the Yankee Robotics, LLC copyright is next to your own. \par \par What you may not do is reverse engineer or decompile the binaries we provide. }{\f1\fs20\insrsid5901308\charrsid5901308 This includes both the host computer and camera side files. }{\f1\fs20\insrsid1538531\charrsid5901308 The USB on-the-wire for}{ \f1\fs20\insrsid5901308\charrsid5901308 mat we developed is proprietary and}{\f1\fs20\insrsid1538531\charrsid5901308 subject to change}{\f1\fs20\insrsid5901308\charrsid5901308 , so do not attempt to reverse engineer it}{ \f1\fs20\insrsid1538531\charrsid5901308 .}{\f1\fs20\insrsid5901308\charrsid5901308 Instead, use the free libraries we provide.}{\f1\fs20\insrsid1538531\charrsid5901308 \par \par Please contact us if you have any questions or concerns. \par \par }\pard \ql \li0\ri0\nowidctlpar\faauto\rin0\lin0\itap0\pararsid1538531 {\f1\fs20\insrsid1538531\charrsid5901308 1-888-367-9265 (888-FOR-YANKEE) \par 1-949-454-1000 \par \par }\pard \ql \li0\ri0\nowidctlpar\faauto\rin0\lin0\itap0 {\f1\fs20\insrsid1538531\charrsid5901308 Yankee Robotics, LLC \par }{\f1\fs20\insrsid5901308\charrsid5901308 24000 Alicia Parkway, Suite 17-470 \par Mission Viejo, CA 92691 \par \par }{\field\flddirty{\*\fldinst {\f1\fs20\insrsid5901308\charrsid5901308 HYPERLINK "http://www.YankeeRobotics.com/" }{\f1\fs20\insrsid5901308\charrsid5901308 {\*\datafield 00d0c9ea79f9bace118c8200aa004ba90b02000000170000001f00000068007400740070003a002f002f007700770077002e00590061006e006b006500650052006f0062006f0074006900630073002e0063006f006d002f000000e0c9ea79f9bace118c8200aa004ba90b3e00000068007400740070003a002f002f007700 770077002e00790061006e006b006500650072006f0062006f0074006900630073002e0063006f006d002f000000}}}{\fldrslt {\cs15\f1\fs20\ul\cf2\insrsid5901308\charrsid5901308 http://www.YankeeRobotics.com/}}}{\f1\fs20\insrsid1538531\charrsid5901308 \par }{\f1\fs20\insrsid5901308\charrsid5901308 \par }{\field\flddirty{\*\fldinst {\f1\fs20\insrsid5901308\charrsid5901308 HYPERLINK "mailto:support@YankeeRobotics.com" }{\f1\fs20\insrsid5901308\charrsid5901308 {\*\datafield 00d0c9ea79f9bace118c8200aa004ba90b02000000170000001b00000073007500700070006f00720074004000590061006e006b006500650052006f0062006f0074006900630073002e0063006f006d000000e0c9ea79f9bace118c8200aa004ba90b440000006d00610069006c0074006f003a0073007500700070006f00 720074004000590061006e006b006500650052006f0062006f0074006900630073002e0063006f006d000000}}}{\fldrslt {\cs15\f1\fs20\ul\cf2\insrsid5901308\charrsid5901308 support@YankeeRobotics.com}}}{\f1\fs20\insrsid1538531\charrsid5901308 \par }{\f1\fs20\insrsid5901308\charrsid5901308 \par }} 1000SetInstallLevelCompleteCustom3TypicalInstallMode = "Server Image"InstallMode = "Custom" OR InstallMode = "Change"InstallMode = "Repair"InstallMode = "Typical" OR InstallMode = "Complete"AllReinstallecmusReinstallModeDialogHCenteringVCenteringControl_FirstControl_DefaultControl_Cancel[ProductName] ([ProductVersion]) License Agreement[DlgTitleFont]Repair [ProductName] [ProductName] ([ProductVersion]) - Installer InformationErrorMessage{{Fatal error: }}{{Error [1]. }}{[2]}{, [3]}{, [4]}Message type: [1], Argument: [2]Error reading from file: [2]. {{ System error [3].}} Verify that the file exists and that you can access it.=== Logging started: [Date] [Time] ====== Logging stopped: [Date] [Time] ===Cannot create the file '[2]'. A directory with this name already exists. Cancel the install and try installing to a different location.Please insert the disk: [2]The installer has insufficient privileges to access this directory: [2]. The installation cannot continue. Log on as administrator or contact your system administrator.Error writing to file: [2]. Verify that you have access to that directory.Error reading from file [2]. {{ System error [3].}} Verify that the file exists and that you can access it.Another application has exclusive access to the file '[2]'. Please shut down all other applications, then click Retry.There is not enough disk space to install this file: [2]. Free some disk space and click Retry, or click Cancel to exit.Source file not found: [2]. Verify that the file exists and that you can access it.Error reading from file: [3]. {{ System error [2].}} Verify that the file exists and that you can access it.Error writing to file: [3]. {{ System error [2].}} Verify that you have access to that directory.Source file not found{{(cabinet)}}: [2]. Verify that the file exists and that you can access it.Cannot create the directory '[2]'. A file with this name already exists. Please rename or remove the file and click retry, or click Cancel to exit.The volume [2] is currently unavailable. Please select another.The specified path '[2]' is unavailable.Unable to write to the specified folder: [2].A network error occurred while attempting to read from the file: [2]An error occurred while attempting to create the directory: [2]A network error occurred while attempting to create the directory: [2]A network error occurred while attempting to open the source file cabinet: [2]The specified path is too long: [2]The Installer has insufficient privileges to modify this file: [2].A portion of the folder path '[2]' is invalid. It is either empty or exceeds the length allowed by the system.The folder path '[2]' contains words that are not valid in folder paths.The folder path '[2]' contains an invalid character.'[2]' is not a valid short file name.Error getting file security: [3] GetLastError: [2]Invalid Drive: [2]Error applying patch to file [2]. It has probably been updated by other means, and can no longer be modified by this patch. For more information contact your patch vendor. {{System Error: [3]}}A file that is required cannot be installed because the cabinet file [2] is not digitally signed. This may indicate that the cabinet file is corrupt.A file that is required cannot be installed because the cabinet file [2] has an invalid digital signature. This may indicate that the cabinet file is corrupt.{{ Error [3] was returned by WinVerifyTrust.}}Failed to correctly copy [2] file: CRC error.Failed to correctly move [2] file: CRC error.Failed to correctly patch [2] file: CRC error.The file '[2]' cannot be installed because the file cannot be found in cabinet file '[3]'. This could indicate a network error, an error reading from the CD-ROM, or a problem with this package.The cabinet file '[2]' required for this installation is corrupt and cannot be used. This could indicate a network error, an error reading from the CD-ROM, or a problem with this package.There was an error creating a temporary file that is needed to complete this installation.{{ Folder: [3]. System error code: [2]}}Action start [Time]: [1].Could not create key: [2]. {{ System error [3].}} Verify that you have sufficient access to that key, or contact your support personnel. Could not open key: [2]. {{ System error [3].}} Verify that you have sufficient access to that key, or contact your support personnel. Could not delete value [2] from key [3]. {{ System error [4].}} Verify that you have sufficient access to that key, or contact your support personnel. Could not delete key [2]. {{ System error [3].}} Verify that you have sufficient access to that key, or contact your support personnel. Could not read value [2] from key [3]. {{ System error [4].}} Verify that you have sufficient access to that key, or contact your support personnel. Could not write value [2] to key [3]. {{ System error [4].}} Verify that you have sufficient access to that key, or contact your support personnel.Could not get value names for key [2]. {{ System error [3].}} Verify that you have sufficient access to that key, or contact your support personnel.Could not get sub key names for key [2]. {{ System error [3].}} Verify that you have sufficient access to that key, or contact your support personnel.Could not read security information for key [2]. {{ System error [3].}} Verify that you have sufficient access to that key, or contact your support personnel.Could not increase the available registry space. [2] KB of free registry space is required for the installation of this application.Action ended [Time]: [1]. Return value [2].Another installation is in progress. You must complete that installation before continuing this one.Error accessing secured data. Please make sure the Windows Installer is configured properly and try the install again.User '[2]' has previously initiated an install for product '[3]'. That user will need to run that install again before they can use that product. Your current install will now continue.User '[2]' has previously initiated an install for product '[3]'. That user will need to run that install again before they can use that product.Time remaining: {[1] minutes }{[2] seconds}Out of disk space -- Volume: '[2]'; required space: [3] KB; available space: [4] KB. Free some disk space and retry.Are you sure you want to cancel?The file [2][3] is being held in use{ by the following process: Name: [4], Id: [5], Window Title: '[6]'}. Close that application and retry.The product '[2]' is already installed, preventing the installation of this product. The two products are incompatible.There is not enough disk space on the volume '[2]' to continue the install with recovery enabled. [3] KB are required, but only [4] KB are available. Click Ignore to continue the install without saving recovery information, click Retry to check for available space again, or click Cancel to quit the installation.Could not access network location [2].The following applications should be closed before continuing the install:Could not find any previously installed compliant products on the machine for installing this product.An error occurred while applying security settings. [2] is not a valid user or group. This could be a problem with the package, or a problem connecting to a domain controller on the network. Check your network connection and click Retry, or Cancel to end the install. {{Unable to locate the user's SID, system error [3]}}Out of memory. Shut down other applications before retrying.The key [2] is not valid. Verify that you entered the correct key.The installer must restart your system before configuration of [2] can continue. Click Yes to restart now or No if you plan to manually restart later.You must restart your system for the configuration changes made to [2] to take effect. Click Yes to restart now or No if you plan to manually restart later.An installation for [2] is currently suspended. You must undo the changes made by that installation to continue. Do you want to undo those changes?A previous installation for this product is in progress. You must undo the changes made by that installation to continue. Do you want to undo those changes?An installation package for the product [2] cannot be found. Try the installation again using a valid copy of the installation package '[3]'.Installation completed successfully.Installation failed.Product: [2] -- [3]You may either restore your computer to its previous state or continue the install later. Would you like to restore?An error occurred while writing installation information to disk. Check to make sure enough disk space is available, and click Retry, or Cancel to end the install.One or more of the files required to restore your computer to its previous state could not be found. Restoration will not be possible.[2] cannot install one of its required products. Contact your technical support group. {{System Error: [3].}}The older version of [2] cannot be removed. Contact your technical support group. {{System Error [3].}}Installed [2]Configured [2]Removed [2]File [2] was rejected by digital signature policy.The Windows Installer Service could not be accessed. This can occur if you are running Windows in safe mode, or if the Windows Installer is not correctly installed. Contact your support personnel for assistance.CUSTOM ACTION SCRIPT "[2]" STARTED BUT FAILED. ERROR [3], [4]: [5] LINE [6], COLUMN [7], [8]CUSTOM ACTION "[2]" FAILED (unexpected return code). LOCATION: [3], COMMAND: [4]Could not resolve path for the shell folder "[2]". If the MSI is being executed under the SYSTEM account then remember that you must have ALLUSERS=1.There is a problem with this Windows Installer package. A DLL required for this install to complete could not be run. Contact your support personnel or package vendor. {{Action [2], entry: [3], library: [4] }}Removal completed successfully.Removal failed.Advertisement completed successfully.Advertisement failed.Configuration completed successfully.Configuration failed.You must be an Administrator to remove this application. To remove this application, you can log on as an Administrator, or contact your technical support group for assistance.Installer is no longer responding.The path [2] is not valid. Please specify a valid path.There is no disk in drive [2]. Please insert one and click Retry, or click Cancel to go back to the previously selected volume.There is no disk in drive [2]. Please insert one and click Retry, or click Cancel to return to the browse dialog and select a different volume.The folder [2] does not exist. Please enter a path to an existing folder.You have insufficient privileges to read this folder.A valid destination folder for the install could not be determined.Installer stopped prematurely.Error attempting to read from the source install database: [2].Scheduling reboot operation: Renaming file [2] to [3]. Must reboot to complete operation.Scheduling reboot operation: Deleting file [2]. Must reboot to complete operation.Module [2] failed to register. HRESULT [3]. Contact your support personnel.Module [2] failed to unregister. HRESULT [3]. Contact your support personnel.Failed to cache package [2]. Error: [3]. Contact your support personnel.Could not register font [2]. Verify that you have sufficient permissions to install fonts, and that the system supports this font.Could not unregister font [2]. Verify that you that you have sufficient permissions to remove fonts.SourceFileCould not remove Shortcut [2]. Verify that the shortcut file exists and that you can access it.Could not register type library for file [2]. Contact your support personnel.Could not unregister type library for file [2]. Contact your support personnel.Could not update the ini file [2][3]. Verify that the file exists and that you can access it.Could not schedule file [2] to replace file [3] on reboot. Verify that you have write permissions to file [3].Error removing ODBC driver manager, ODBC error [2]: [3]. Contact your support personnel.Error installing ODBC driver manager, ODBC error [2]: [3]. Contact your support personnel.Error removing ODBC driver: [4], ODBC error [2]: [3]. Verify that you have sufficient privileges to remove ODBC drivers.Error installing ODBC driver: [4], ODBC error [2]: [3]. Verify that the file [4] exists and that you can access it.Error configuring ODBC data source: [4], ODBC error [2]: [3]. Verify that the file [4] exists and that you can access it.Service '[2]' ([3]) failed to start. Verify that you have sufficient privileges to start system services.Service '[2]' ([3]) could not be stopped. Verify that you have sufficient privileges to stop system services.Service '[2]' ([3]) could not be deleted. Verify that you have sufficient privileges to remove system services.Service '[2]' ([3]) could not be installed. Verify that you have sufficient privileges to install system services.Could not update environment variable '[2]'. Verify that you have sufficient privileges to modify environment variables.You do not have sufficient privileges to complete this installation for all users of the machine. Log on as administrator and then retry this installation.Could not set file security for file '[3]'. Error: [2]. Verify that you have sufficient privileges to modify the security permissions for this file.Component Services (COM+ 1.0) are not installed on this computer. This installation requires Component Services in order to complete successfully. Component Services are available on Windows 2000.Error registering COM+ Application. Contact your support personnel for more information.Error unregistering COM+ Application. Contact your support personnel for more information.The description for service '[2]' ([3]) could not be changed.The Windows Installer service cannot update the system file [2] because the file is protected by Windows. You may need to update your operating system for this program to work correctly. {{Package version: [3], OS Protected version: [4]}}The Windows Installer service cannot update the protected Windows file [2]. {{Package version: [3], OS Protected version: [4], SFP Error: [5]}}The Windows Installer service cannot update one or more protected Windows files. {{SFP Error: [2]. List of protected files:\r\n[3]}}User installations are disabled via policy on the machine.An error occured during the installation of assembly component [2]. HRESULT: [3]. {{assembly interface: [4], function: [5], assembly name: [6]}}Warning [1]. Please wait while Windows configures [ProductName]Gathering required information...Removing older versions of this application...Preparing to remove older versions of this application...{[ProductName] }Setup completed successfully.{[ProductName] }Setup failed.Info [1]. The installer has encountered an unexpected error installing this package. This may indicate a problem with this package. The error code is [1]. {{The arguments are: [2], [3], [4]}}{{Disk full: }}Action [Time]: [1]. [2][ProductName]EventMappingAttributeIgnoreChangeEnabledSelectionNoItemsSeuplicateFileName of a property whose value is assumed to resolve to the full pathname to a destination folder.DestFolderFilename to be given to the duplicate file.DestNamePrimary key used to identify a particular file entryFileKeyForeign key referencing the source file to be duplicated.Foreign key into the Component table referencing component that controls the installing of the environmental value.EnvironmentUnique identifier for the environmental variable settingThe name of the environmental value.The value to set in the environmental settings.Integer error number, obtained from header file IError(...) macros.Error formatting template, obtained from user ed. or localizers.The name of the control attribute, that is set when this event is received.A foreign key to the Dialog table, name of the Dialog.An identifier that specifies the type of the event that the control subscribes to.ExtensionThe extension associated with the table row.Optional Context identifier, typically "type/format" associated with the extelectionDescriptionSelectionSizeSelectionPathVisibleSelectionPathOnProgressSetProgressInstallExecuteSequenceNOT InstalledVersionNTInstallUISequenceInstalled AND NOT RESUME AND NOT PreselectedInstalled AND (RESUME OR Preselected)ListViewBinary_1.016.0004.0021ARPHELPLINK< &BackButtonText_BackBr&owseButtonText_BrowseButtonText_Cancel&ExitButtonText_Exit&FinishButtonText_Finish&IgnoreButtonText_Ignore&InstallButtonText_Install&Next >ButtonText_Next&NoButtonText_NoButtonText_OK&RemoveButtonText_Remove&RepairButtonText_Repair&ResetButtonText_Reset&ResumeButtonText_Resume&RetryButtonText_Retry&ReturnButtonText_Return&YesButtonText_YesCompleteSetupIcon[UserPressedYesOnCancelDlg]YESCustomSetupIconDlgFont8DefaultUIFontDialogBitmap{&DlgFontBold8}DlgTitleFontErrorDialogExclamationIconINSTALLLEVELInfoIconInstallModeInstallerIcon12345<###-%%%%%%%>@@@@@PIDTemplatePPROMPTROLLBACKCOSTnone1033ProductLanguageInstallingProgress1installsProgress2RemoveIconRepairIconSetupGUISetup WizardWizardRadioButton{\DlgFont8}I &accept the terms in the License Agreement{\DlgFont8}I &do not accept the terms in the License AgreementTextStyleFaceNameSizeColorStyleBitsTahomaDlgFontBold8VerdanaVerdanaBold13UITextKeyAbsentPathGBKBMBEntire feature will be unavailableMenuAbsentFeature will be installed when requiredMenuAdvertiseEntire feature will be installed to run from CDMenuAllCDEntire feature will be installed on local hard driveMenuAllLocalEntire feature will be installed to run from networkMenuAllNetworkWill be installed to run from CDMenuCDWill be installed on local hard driveMenuLocalWill be installed to run from networkMenuNetworkScriptInProgressThis feature will remain uninstalledSelAbsentAbsentThis feature will be set to be installed when requiredSelAbsentAdvertiseThis feature will be installed to run from CDSelAbsentCDThis feature will be installed on the local hard driveSelAbsentLocalThis feature will be installed to run from the networkSelAbsentNetworkThis feature will become unavailableSelAdvertiseAbsentWill be installed when requiredSelAdvertiseAdvertiseThis feature will be available to run from CDSelAdvertiseCDThis feature will be installed on your local hard driveSelAdvertiseLocalThis feature will be available to run from the networkSelAdvertiseNetworkThis feature will be uninstalled completely, you won't be able to run it from CDSelCDAbsentThis feature will change from run from CD state to set to be installed when requiredSelCDAdvertiseThis feature will remain to be run from CDSelCDCDThis feature will change from run from CD state to be installed on the local hard driveSelCDLocalThis feature frees up [1] on your hard drive.SelChildCostNegThis feature requires [1] on your hard drive.SelChildCostPosCompiling cost for this feature...SelCostPendingThis feature will be completely removedSelLocalAbsentThis feature will be removed from your local hard drive, but will be set to be installed when requiredSelLocalAdvertiseThis feature will be removed from your local hard drive, but will be still available to run from CDSelLocalCDThis feature will remain on you local hard driveSelLocalLocalThis feature will be removed from your local hard drive, but will be still available to run from the networkSelLocalNetworkThis feature will be uninstalled completely, you won't be able to run it from the networkSelNetworkAbsentThis feature will change from run from network state to set to be installed when requiredSelNetworkAdvertiseThis feature will change from run from network state to be installed on the local hard driveSelNetworkLocalThis feature will remain to be run from the networkSelNetworkNetworkThis feature frees up [1] on your hard drive. It has [2] of [3] subfeatures selected. The subfeatures free up [4] on your hard drive.SelParentCostNegNegThis feature frees up [1] on your hard drive. It has [2] of [3] subfeatures selected. The subfeatures require [4] on your hard drive.SelParentCostNegPosThis feature requires [1] on your hard drive. It has [2] of [3] subfeatures selected. The subfeatures free up [4] on your hard drive.SelParentCostPosNegThis feature requires [1] on your hard drive. It has [2] of [3] subfeatures selected. The subfeatures require [4] on your hard drive.SelParentCostPosPosTimeRemainingAvailableVolumeCostAvailableDifferenceVolumeCostDifferenceRequiredVolumeCostRequiredDisk SizeVolumeCostSizeVolumeVolumeCostVolumebytes_ValidationColumnNullableMinValueMaxValueKeyTableKeyColumnCategorySetName of action to be described.IdentifierLocalized description displayed in progress dialog and log when action is executing.Optional localized format template used to format action data records for display during action execution.Name of action to invoke, either in the engine or the handler DLL.Optional expression which skips the action if evaluates to expFalse.If the expression syntax is invalid, the engine will terminate, returning iesBadActionData.Number that determines the sort order in which the actions are to be executed. Leave blank to suppress action.AdvtUISequenceActivateAtStorageAppIdGuidDllSurrogateLocalServiceFormattedRemoteServerNameRunAsInteractiveUserServiceParametersThe property associated with a SignatureThe Signature_ represents a unique file signature and is also the foreign key in the Signature, RegLocator, IniLocator, CompLocator and the DrLocator tables.Signature;RegLocator;IniLocator;DrLocator;CompLocatorSignature_A 32-bit word that specifies the attribute flags to be applied to this control.Name of the control. This name must be unique within a billboard, but can repeat on different billboard.External key to the Billboard table, name of the billboard.Height of the bounding rectangle of the control.A string used to set the initial text contained within a control (if appropriate).The type of the control.Width of the bounding rectangle of the control.Horizontal coordinate of the upper left corner of the bounding rectangle of the control.Vertical coordinate of the upper left corner of the bounding rectangle of the control.The name of an action. The billboard is displayed during the progress messages received from this action.Name of the billboard.An external key to the Feature Table. The billboard is shown only if this feature is being installed.FeatureA positive integer. If there is more than one billboard corresponding to an action they will be shown in the order defined by this column.The unformatted binary data.Unique key identifying the binary data.The index into the File table. This must be an executable file.FileFile_A list of ; delimited paths that represent the paths to be searched for the import DLLS. The list is usually a list of properties each enclosed within square brackets [] .PathsPathA named property to be tied to the item.The value string associated with the item.Optional AppID containing DCOM information for associated application (string GUID).AppId_Classoptional argument for LocalServers.Class registration attributes.The CLSID of an OLE factory.CLSIDRequired foreign key into the Component Table, specifying the component for which to return a path when called through LocateComponent.ComponentComponent_The numeric server context for this server. CLSCTX_xxxxContextOptional default inproc handler. Only optionally provided if Context=CLSCTX_LOCAL_SERVER. Typically "ole32.dll" or "mapi32.dll"1;2;3FilenameDefInprocHandlerLocalized description for the Class.Required foreign key into the Feature Table, specifying the feature to validate or install in order for the CLSID factory to be operational.Optional string containing information for the HKCRthis CLSID) key. If multiple patterns exist, they must be delimited by a semicolon, and numeric subkeys will be generated: 0,1,2...FileTypeMaskOptional icon index.IconIndexOptional foreign key into the Icon Table, specifying the icon file associated with this CLSID. Will be written under the DefaultIcon key.Icon_Optional ProgId associated with this CLSID.ProgIdProgId_DefaultA positive integer used to determine the ordering of the items within one list. The integers do not have to be consecutive.A named property to be tied to this item. All the items tied to the same property become part of the same combobox.The visible text to be assigned to the item. Optional. If this entry or the entire column is missing, the text is the same as the value.The value string associated with this item. Selecting the line will set the associated property to this value.A string GUID unique to this component, version, and language.ComponentIdCompLocatorThe table key. The Signature_ represents a unique file signature and is also the foreign key in the Signature table.A boolean value that determines if the registry value is a filename or a directory location.Foreign key referencing Component that controls the ComPlus component.ComplusComPlus component attributes.ExpTypeRemote execution option, one of irsEnumPrimary key used to identify a particular component record.A conditional statement that will disable this component if the specified condition evaluates to the 'True' state. If a component is disabled, it will not be installed, regardless of the 'Action' state associated with the component.Required key of a Directory table record. This is actually a property name whose value contains the actual path, set either by the AppSearch action or with the default setting obtained from the Directory table.DirectoryDirectory_Either the primary key into the File table, Registry table, or ODBCDataSource table. This extract path is stored when the component is installed, and is used to detect the presence of the component and to return the path to it.File;Registry;ODBCDataSourceKeyPathExpression evaluated to determine if Level in the Feature table is to change.Reference to a Feature entry in Feature table.New selection Level to set in Feature table if Condition evaluates to TRUE.LevelName of the control. This name must be unique within a dialog, but can repeat on different dialogs. The name of an other control on the same dialog. This link defines the tab order of the controls. The links have to form one or more cycles!External key to the Dialog table, name of the dialog.The help strings used with the button. The text is optional. The name of a defined property to be linked to this control. The desired action to be taken on the specified control.Default;Disable;Enable;Hide;ShowA standard conditional statement that specifies under which conditions the action should be triggered.A foreign key to the Control table, name of the control.A foreign key to the Dialog table, name of the dialog.A value to be used as a modifier when triggering a particular event.A standard conditional statement that specifies under which conditions an event should be triggered.A foreign key to the Control table, name of the controlAn identifier that specifies the type of the event that should take place when the user interacts with control specified by the first two entries.An integer used to order several events tied to the same control. Can be left blank.Foreign key into the Component table.CreateFolderPrimary key, could be foreign key into the Directory table.Primary key, name of action, normally appears in sequence table unless private use.CustomActionThe table refere  % $   !      &"($   2  *!& !   2,  &   !#  /    ! .! !           "  8 !(    YQ      / .2O ?%%%  % !5    ; +1 5(  R  F%    -5   8  5()   6 )   )   v 3  F N   Y' 3 " 5 (    0 F 6 #  = 9 ;#R    X               Hbd 803     2#8 m''KkwyTmba@(-D?FN#CoH4%2--.+dv+u x9&JfA<C$tni  2\P%%"8J5C?YRMOHd _NP^oXZxsyjnpsyY[=: 2!.9-         ,%            P       7>     " ' / 4 4 % % $6- 66$-76P T*W --"'fc 0 lYY\3       TjBo    )(5 Oh;0R/XVie'?! (*T# , 7 $  + {sn>  t\F';  M.Kd5==8 f86Dd7T% ;S . :^N|QnsionMIMEMIME_Optional ProgId associated with this extension.ProgId_Feature attributes0;1;2;4;5;6;8;9;10;16;17;18;20;21;22;24;25;26;32;33;34;36;37;38;48;49;50;52;53;54Longer descriptive text describing a visible feature item.The name of the Directory that can be configured by the UI. A non-null value will enable the browse button.UpperCaseNumeric sort order, used to force a specific display ordering.DisplayPrimary key used to identify a particular feature record.Optional key of a parent record in the same table. If the parent is not selected, then the record will not be installed. Null indicates a root item.Feature_ParentThe install level at which record will be initially selected. An install level of 0 will disable an item and prevent its display.Short text identifying a visible feature item.Foreign key into Component table.FeatureComponentsForeign key into Feature table.Integer containing bit flags representing file attributes (with the decimal value of each bit position in parentheses)Foreign key referencing Component that controls the file.Primary key, non-localized token, must match identifier in cabinet. For uncompressed files, this field is ignored.File name used for installation, may be localized. This may contain a "short name|long name" pair.FileNameSize of file in bytes (long integer).FileSizeList of decimal language Ids, comma-separated if more than one.LanguageSequence with respect to the media images; order must track cabinet order.Version string for versioned files; Blank for unversioned files.VersionFile associated with the catalogFileSFPCatalogCatalog associated with the fileSFPCatalogSFPCatalog_Primary key, foreign key into File table referencing font file.FontFont name.FontTitleBinary stream. The binary icon data in PE (.DLL or .EXE) or icon (.ICO) format.Primary key. Name of the icon file.The type of modification to be made, one of iifEnum0;1;3IniFileForeign key into the Component table referencing component that controls the installing of the .INI value.Foreign key into the Directory table denoting the directory where the .INI file is.DirPropertyThe .INI file name in which to write the informationPrimary key, non-localized token.The .INI file key below Section.The .INI file Section.SectionThe value to be written.The field in the .INI line. If Field is null or 0 the entire line is read.FieldIniLocatorThe .INI file name.Key value (followed by an equals sign in INI file).Section name within in file (within square brackets in INI file).An integer value that determines if the .INI value read is a filename or a directory location or to be used as is w/o interpretation.Key to Component table item for applicationComponent_ApplicationIsolatedComponentKey to Component table item to be isolatedComponent_SharedExpression which must evaluate to TRUE in order for install to commence.LaunchConditionLocalizable text to display when condition fails and install must abort.A positive integer used to determine the ordering of the items within one list..The integers do not have to be consecutive.A named property to be tied to this item. All the items tied to the same property become part of the same listbox.The name of the icon to be displayed with the icon. The binary information is looked up from the Binary Table.A named property to be tied to this item. All the items tied to the same property become part of the same listview.Domain name for user whose permissions are being set. (usually a property)DomainLockPermissionsForeign key into Registry or File tableLockObjectPermission Access mask. Full Control = 268435456 (GENERIC_ALL = 0x10000000)PermissionReference to another table nameDirectory;File;RegistryUser for permissions to be set. (usually a property)UserOptional associated CLSID.Primary key. Context identifier, typically "type/format".ContentTypeOptional associated extension (without dot)Extension_If some or all of the files stored on the media are compressed in a cabinet, the name of that cabinet.CabinetMediaPrimary key, integer to determine sort order for table.DiskIdDisk name: the visible text actually printed on the disk. This will be used to prompt the user when this disk needs to be inserted.DiskPromptFile sequence number for the last file for this media.LastSequenceThe property defining the location of the cabinet file.The label attributed to the volume.VolumeLabelComponent contained in the module.ModuleComponentsDefault language ID for module (may be changed by transform).ModuleSignatureModule containing the component.ModuleIDModule requiring the dependency.ModuleDependencyLanguage of module requiring the dependency.ModuleLanguageString.GUID of required module.RequiredIDLanguageID of the required module.RequiredLanguageVersion of the required version.RequiredVersionString.GUID of excluded module.ExcludedIDModuleExclusionLanguage of excluded module.ExcludedLanguageMaximum version of excluded module.ExcludedMaxVersionMinimum version of excluded module.ExcludedMinVersionString.GUID of module with exclusion requirement.LanguageID of module with exclusion requirement.Default decimal language of module.Module identifier (String.GUID).Version of the module.If this component is not "selected" for installation or removal, no action will be taken on the associated MoveFile entryMoveFileName of a property whose value is assumed to resolve to the full path to the destination directoryName to be given to the original file after it is moved or copied. If blank, the destination file will be given the same name as the source filePrimary key that uniquely identifies a particular MoveFile recordInteger value specifying the MoveFile operating mode, one of imfoEnumOptionsName of a property whose value is assumed to resolve to the full path to the source directorySourceFolderName of the source file(s) to be moved or copied. Can contain the '*' or '?' wildcards.SourceNameAssembly attributesMsiAssemblyForeign key into File table, denoting the application context for private assemblies. Null for global assemblies.File_ApplicationForeign key into the File table denoting the manifest file for the assembly.File_ManifestMsiAssemblyNameThe name part of the name-value pairs for the assembly name.The value part of the name-value pairs for the assembly name.A certificate context blob for a signer certificateCertDataMsiDigitalCertificateA unique identifier for the rowDigitalCertificateForeign key to MsiDigitalCertificate table identifying the signer certificateDigitalCertificate_MsiDigitalSignatureThe encoded hash blob from the digital signatureHashForeign key to Media tableSignObjectReference to another table name (only Media table is supp2x2_X da2 orted)Reserved option (must be 0).MsiFileHashHashPart1HashPart2HashPart3HashPart4MD5 part 1/4.Binary stream. The patch header, used for patch validation.HeaderMsiPatchHeadersPrimary key. A unique identifier for the row.StreamRefName of ODBC driver attributeODBCAttributeReference to ODBC driver in ODBCDriver tableODBCDriverDriver_Value for ODBC driver attributeReference to associated componentODBCDataSourcePrimary key, non-localized.internal token for data sourceDataSourceText used as registered name for datBs/[q.) r eC b +49s 8$/C@K6R ,R/Q:k >9.!v9sc %? JA    ?  O#3 jS 4! J 3A+*HH{rnsJ' L 59 + f7 6 7# "=  , "  ##10# ybAE] X  qL <=3M0 ?     ;-  , !9 ,75 64* "5 $+ .8 :^& Wa sourceReference to driver description, may be existing driverDriverDescriptionRegistration option: 0=machine, 1=user, others t.b.d.RegistrationText used as registered name for driver, non-localizedPrimary key, non-localized.internal token for driverDriverReference to key driver fileOptional reference to key driver setup DLLFile_SetupName of ODBC data source attributeODBCSourceAttributeReference to ODBC data source in ODBCDataSource tableDataSource_Value for ODBC data source attributeODBCTranslatorText used as registered name for translatorReference to key translator fileOptional reference to key translator setup DLLPrimary key, non-localized.internal token for translatorTranslatorInteger containing bit flags representing patch attributesPatchPrimary key, non-localized token, foreign key to File table, must match identifier in cabinet.Size of patch in bytes (long integer).PatchSizePrimary key, sequence with respect to the media images; order must track cabinet order.Identifier. Foreign key to the StreamRef column of the MsiPatchHeaders table.StreamRef_Foreign key to DiskId column of Media table. Indicates the disk containing the patch package.Media_PatchPackageA unique string GUID representing this patch.PatchIdThe CLSID of an OLE factory corresponding to the ProgId.Class_Localized description for the Program identifier.Optional foreign key into the Icon Table, specifying the icon file associated with this ProgId. Will be written under the DefaultIcon key.The Program Identifier. Primary key.The Parent Program Identifier. If specified, the ProgId column becomes a version independent prog id.ProgId_ParentName of property, uppercase if settable by launcher or loader.String value for property. Never null or empty.This is localisable Application specific data that can be associated with a Qualified Component.AppDataPublishComponentA string GUID that represents the component id that will be requested by the alien product.Foreign key into the Feature table.This is defined only when the ComponentId column is an Qualified Component Id. This is the Qualifier for ProvideComponentIndirect.QualifierThe height of the button.The help strings used with the button. The text is optional.A named property to be tied to this radio button. All the buttons tied to the same property become part of the same group.The visible title to be assigned to the radio button.The value string associated with this button. Selecting the button will set the associated property to this value.The width of the button.The horizontal coordinate of the upper left corner of the bounding rectangle of the radio button.The vertical coordinate of the upper left corner of the bounding rectangle of the radio button.The key for the registry value.RegPathRegLocatorThe registry value name.The predefined root key for the registry value, one of rrkEnum.RootThe table key. The Signature_ represents a unique file signature and is also the foreign key in the Signature table. If the type is 0, the registry values refers a directory, and _Signature is not a foreign key.An integer value that determines if the registry value is a filename or a directory location or to be used as is w/o interpretation.Foreign key into the Component table referencing component that controls the installing of the registry value.RegistryThe registry value.Foreign key referencing Component that controls the file to be removed.RemoveFileName of a property whose value is assumed to resolve to the full pathname to the folder of the file to be removed.Name of the file to be removed.WildCardFilenameInstallation option, one of iimEnum.The type of modification to be made, one of iifEnum.2;4RemoveIniFileForeign key into the Component table referencing component that controls the deletion of the .INI value.The .INI file name in which to delete the informationThe value to be deleted. The value is required when Action is iifIniRemoveTagForeign key into the Component table referencing component that controls the deletion of the registry value.RemoveRegistryThe predefined root key for the registry value, one of rrkEnumReserve a specified amount of space if this component is to be installed.ReserveCostReserveFolderPrimary key that uniquely identifies a particular ReserveCost recordReserveKeyDisk space to reserve if linked component is installed locally.ReserveLocalDisk space to reserve if linked component is installed to run from the source location.ReserveSourceSFP CatalogCatalogParent catalog - only used by SFPDependencyFile name for the catalog.The cost of registering the module.CostSelfRegForeign key into the File t @ !#%&'()+-./012345789:;<=>?ABCDEFGHIJKLMNOPQRSTUVZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~XXXX         xxxxxxxxxx;;!!!!!+++++IIffffffffffffvvvvvvvvv       X x;Oh+'0d 0DLd  4TInstaller,MSI,Database8MakeMsi version 06.355, a free tool by Dennis Bareis ()'{D00CEBFA-D05E-4E45-8112-BA1D35686871} Intel;1033n TrifidCamera81.016.0004.0021 (created Sun Mar 25 2007 at 12:53:52pm)@@lo@@lohTrifid is a high-speed USB, cooled, low-light, digital camera used i "$&(*,./13579;=?ACEGIKMOQSUWY[]_acegiklnprtvw!#%')+-02468:<>@BDFHJLNPRTVXZ\^`bdfhjWmoqsuw  -P  aaadd ?*'L'XXXX         xxxxxxxxxx'''''***;;JJLLLOOVVVVVVVVbbbbbbiimmuuuuu!!!!!((((((+++++2222222277777:::::IIMMMMMMTTTTTTTTTTTTTffffffffffffvvvvvvvvvyz{|}~47ACEH   '+-MLCEQAVY^A^ahktwy}EEH$$(AYAY^2$7;=?AHLMRLTVY[\_acdLfkqtAvxz|~EHHEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE2EHHHHH  . fEE2/U{1pSRpo"#%&$roqo0.951836F=?>@BDG        !(),~<:IKFBDNPT_\WZ[X]fdce`gjnlzsvx|<::"&%#")'#[/*-,05\34X]["68[9<>@JGPONK[Q]WNS[UXZ\^`b`nhglmir  >%(<?Te ȀdX؄΄ !$%(028:<?AIKNQSTWZ]`cehkmpsvxz}]Qx}yy̐ tЇrȀxd؎@8XD\$ԗ|pHy`(L!!!!!!!!%(*,..0  !M !"#$%&'()*+,-./012345678yz{|}~܅݅ޅ߅ABCDEFGHI† mnopqrstuvwxyz{|}~7Ê!"GRWa #$%&'()*+,-./0123456789:;<=>?@ABCDEFHIJKLMNOPQSTUVXYZ[\]^_`bcdefghijklmnopqrstvxyz{|}~a!6>R`e}2222222222<22<22222222222<22222222222K22K22222222222K2rrrrrrrrrrrrrrrrrrrrrrrrUU####III"BQ\fIIIQjIIIQ!!!!!!!6>>>>>>>RRR````eeeeeeeeeeeeee}}}III%(=?DEFHQUVjjjjqqqqxxxx%%%UUUe6QUV}!e`!!ee e U`    \cv%_aik!!!``.0 & ( @w{px{wp({w(xxx(w(w~xx(~www(zxxw w p  wp wwwwwxpx"DDDDDOxvflOx && &<<(, x(, P(<, & & &, , , <888  8PPXXXFXXPWaJLKKMJ KJ       &2341')+/ 789:  ACGSZ[GTC cd n|kyilprtwz ~:  : i    III"%(QVU!!!!!!!!!!!!!!!!!!!!!66666666666>>>>>>>>>RRRRRRRRRRRRR`````````````eeeeeeeeeeeeeeeeeeee}}}}}}}IINO  INO          "$%(*,.0  <=?@BDEFH  QUVY  \_  fhjmqsux{  <  <        5#;Xb^;;0쀴00쀇0쀴F#a0쀴###J0쀇*TaFE0Ja0쀴!Ja0쀴--J*TaFE0J0Ha0쀴0 π*oԀԀ7Ja0J0a0Ja0쀴Ja0쀴ii2i2ii2iJ0쀴a0Ja0J0a0쀴i2ii2ii2iJa0Ja0Ja0J0f0쀴UUUU󀛀dA,怂sd U7ʀ,:7̀S7 P],w ,Gi 7ʀ,:7̀S7 997,ЀMIOˀˀ 5,d 7,W ,总< ,ArANr U5,d 5,󀌀^ U,AFFSAN F, F, F, 9U܀rv8܀88܀rv8܀88rv8܀88܀܀܀܀rv8܀88܀ ,vv8,88__,,#rv8܀88܀܀vv,8܀;@8Ȁ__@@vv8Ȁ888__vv8Ȁ88__܀vv,8܀;@8Ȁ__€88"Jvv8Ȁ888__88%Jvv8Ȁ__J888c8888JvvȀ__888Jvv8Ȁ88__JJvv888__dd&&d&܀rv8܀88Jvv8Ȁ__JJvvȀ__88JJ܀rv8܀@HDDrDhD7H\@H FE2DA7CrDP@HBExE(;2DD1BE6Ht@HC/BwffOxvflOxwffOxwxvfOxw~wfOxwvOxw~wOxDDDDDOxwxw?0 ( @ʦkH%zbJs2PkHs%WUI=1%sPkkHH%%sPDZksHW%UI=1%sPԎkH%zbJs2PkH%ssPPkH%zbsJP2kHs%WUI=1s%PkkHH%%sPDZksHW%UI=1s%PԎkH%ܒzbsJP2kH%ssPPkH%zbJs2PksHW%UI=1%sPkkHH%%sPkHs%WUI=1s%PkH%ܒzbsJP2kH%ssPPzzznnnbbbVVVJJJ>>>222&&&ززؕ؉º嗜ĺºĺº㜜ĺ㜕ºĺºĺº*-*-*--{{{{{{?0  & ( @pwwwwfwwvvfwnfflwww|wgwwwg|wgw|wwg|wwwwwwgtDDw~www~ww|wwwwwllw~fftwwvlgtwwwwwwwwwwtwwwwwwwwxD\wwwwGwwwwwep;wv_{{pwegv\!0~v{7pogp8p{4o?o803F??( @ʦkH%zbJs2PkHs%WUI=1%sPkkHH%%sPDZksHW%UI=1%sPԎkH%zbJs2PkH%ssPPkH%zbsJP2kHs%WUI=1s%PkkHH%%sPDZksHW%UI=1s%PԎkH%ܒzbsJP2kH%ssPPkH%zbJs2PksHW%UI=1%sPkkHH%%sPkHs%WUI=1s%PkH%ܒzbsJP2kH%ssPPzzznnnbbbVVVJJJ>>>222&&&j""j""jj"m{j"yymmm{jyymj"joomym"jjojymm"j~mm"jj~jy"j"jj~my"jjj"jm{o~~m"j{oo~j"j"jo~~m""j{oo~jmm{{{oo~~mmm{{o~gj{oojgmjjg""jm" u"mj""uj"u"""juj"y y""uju yuyy"jju y ujE""u?? & ( @{wpxwxwwpxxw~x ~pxxpxwpzxxpxzxxxwwwwwwwwwpwwwwwwwpwwwwwwwwxwxDDDDDOxvflOxwffOxvflOxwffOxvfOx~wfOxwvOxw~wOxDDDDDOxxp ??????( @ʦkH%zbJs2PkHs%WUI=1%sPkkHH%%sPDZksHW%UI=1%sPԎkH%zbJs2PkH%ssPPkH%zbsJP2kHs%WUI=1s%PkkHH%%sPDZksHW%UI=1s%PԎkH%ܒzbsJP2kH%ssPPkH%zbJs2PksHW%UI=1%sPkkHH%%sPkHs%WUI=1s%PkH%ܒzbsJP2kH%ssPPzzznnnbbbVVVJJJ>>>222&&&ززؕ؉嗜㜜㜕{{{{{{p ?????? &(( @pwpppppwwwwwpwwwwwpwwwpwwwpwpwwxwwwwwpxppwwwxwwwwp??( pwxppwwpwwwp ( @      !"#$%&'()*+,-./013456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`bcefghijklmnopqrstuwxyz|}~33133233333333333333$DDDDDDDDDDD@12DDDDDDDDDDDDD2DDDDDD@DDDDDDC2DDDDDD34DDDDDC2DDDDD@30DDDDD3$DDDDD34DDDDD13$DDDDD@DDDDD@1332DDDDDDDDDDDC332DDDDDCDDDDD333$DDDDDDDD1333$DDDD#$DDD@133332DDDD34DDDC33332DDD@30DDD33333$DDB32DDD133333$DDC33DD@13333332DDC33DDC3333332DDC33DD3333333$DC33DD13333333$DC33D@1333333332D@30DC333333332DDDDD333333333$DDDD1333333333$DDD@133333333332DDDC33333333332DDD33333333333$DD133333333333$D@13333333333332D3333333333333"#33333333333333333333333?? & ( @wpwxw xxxxp xxxX' n:K1X&O%1X"Kvtx{{|{z 1X GuH!LM~%1X O9MR1X# %.8NS~#1X#!8MQG1X#  'KQ-1X## OZ1X%&ZOt1X'&C^=&1X.[1Xz\ 1X#G݊\h"1X#P\eI 1XHm[C !1X!Vs [ f:1&1XOn\ 4:3 a1X'Tڈ\GtV$1X$ d\}1X'd^3!1X$\\* 1X&u 1X1wqO1X3q1X"{=1X '=_1X#*1X$G1X#"1X# 8 x 1X (n 1X%&  1XB  1X$ E{1X&C j1X%&]Uב\Vb%1X' l 1X'jX1X$"d,1X.de#1X*&_k(1X0B<1X1;Fz!1X#H (1X#@1X##N!1X#O1XN1X"O1X# M1X",M1X #MHk#1X#"MNn1X#*ITo1X" E&LPoBM B6(:=  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~XXm1Xm1Xm1Xm1Xm1Xm1Xm1Xm1Xm1Xm1Xm1Xm1Xm1Xm1Xm1Xm1Xm1Xm1Xm1Xm1Xm1Xm1Xm1Xm1Xm1Xm1Xm1Xm1Xm1Xm1Xl1Xl1Xl1Xl1Xl1Xl1Xl1Xl1Xk1Xk1X/ 5>@@>>???@621X. 21X. 21X.21X.21X.21X*.1X+21X* 21X,=A /1X*, 5-1X&jn$1X$_o'1X$ yp1X$ܦ 1X$,1X$, 1X$ 1X$,1X$,1X$,1X$$pxxpwwwpyzpwwwxpwwwywwwDDDDDOflOffOflOffOwwpfOfOwwwOOyDDDDDOwwwwwwwwwwy?3( @ʦkH%zbJs2PkHs%WUI=1%sPkkHH%%sPDZksHW%UI=1%sPԎkH%zbJs2PkH%ssPPkH%zbsJP2kHs%WUI=1s%PkkHH%%sPDZksHW%UI=1s%PԎkH%ܒzbsJP2kH%ssPPkH%zbJs2PksHW%UI=1%sPkkHH%%sPkHs%WUI=1s%PkH%ܒzbsJP2kH%ssPPzzznnnbbbVVVJJJ>>>222&&&ززؕ؉嗜㜜㜕{{{{{{?3 & ( @w{px{wp{wxxxww~xx~wwwzxxwwpwpwwwwwxxDDDDDOxvflOxwffOxvflOxwffOxvfOx~wfOxwvOxw~wOxDDDDDOxx?( @ʦkH%zbJs2PkHs%WUI=1%sPkkHH%%sPDZksHW%UI=1%sPԎkH%zbJs2PkH%ssPPkH%zbsJP2kHs%WUI=1s%PkkHH%%sPDZksHW%UI=1s%PԎkH%ܒzbsJP2kH%ssPPkH%zbJs2PksHW%UI=1%sPkkHH%%sPkHs%WUI=1s%PkH%ܒzbsJP2kH%ssPPzzznnnbbbVVVJJJ>>>222&&&ززؕ؉嗜㜜㜕{{{{{{?BMv( 3 3 0 0  BMf6($$0شХХХХХХХХХХХХХХٶV>//////////////4V>///////////////ƕV>///////////////Q6V>////////////////V>////////////////zxV>////////////////<V>/////////////////Ϥ%VAQ5׳ϤϤϤϤϤϤϤϤϤϤϤϤϤV>///\Mܽ((  ((   }><8m?   gcgcgcgcgcgcgcgcgcgcgcgcgc̞hc//:NQSW]ch x8\$ș܅% ΄%.0: @CEHJMPRVY\_bdgjloruwy|~rz~ "&),"36="BBGLOUX[^a)fi)nqtn{)nLOU[^afiq{!+Ifvn astronomical and medical imaging.Trifid - using MAKEMwu $$$ #"e[josuwy{}(@HBExE(H  5`@HDjEA(H $@HArD+ArD@GG@8G89>88GAGF(H";:.  SITrifido @( @]Qx}333BBBTv{v l4ĉTP쓈ș܅郼ч *4>Ielx'\cm  $$$\ >>994400)) 00yKCnkjjkjzafһ±¯IJMC[[ddTEyyulgy^u®骚IJww>>QDwlf{bgzckWo\s`xeׁote``QQoji~e|a~b}b{bx_w\sZw`t^lW_Kqd0)$$tvAAomlkjf}c}c}c}b{a|a}c|`dɲӿı}>5\\CDnmkkkj~c}b}b}b|a|ay`v\n͹ðƴYYDDrlkkkj~e}b}c}c}c}c|bt[ӿȴqlkkkk~e}b}c}c}c}c}cv\ű[QtCCqmkkkke}b}b}c}c}c{bzbĮнEEBB==@@PDmkkkke}b}c}c}c}cy`nԽ˸îPDljjjke}c}c}c}c}bx]{ŲıUEsqni}bzazb{b{b}bv\űPDzwolg}bzbu\űODSDvqm̴ıƵ006  h)(0`~DDAA::..""DD{EE::11''BB77pDD,,99??44 %%tJC|MDNENEODNBePiReMoƶ ODqjhgeegeew^ʷLCUDkkki~e|byay`x`v\ѿññy BQ7>QEnkkkkj~ezay`w_y`ʺ̹_sojkkkki}c|a|aw^jʷIJƴ/=ReyDDQEmkkkkke}b}c}cx]~ϿƲi_I[FVDDojkkkki}b}b}c}cv\ѿ?8\n3AMMQEmkkkkke}b}c}c{byaμIJ`s燇nkjgkkg{bzbzbzbx^kͺɷǵ\n츸NDj|gzdzd}cge}zyvuuttnǶǶ|o$/P`RDonmje}cu]nlsrsuuƳ`U=L:H11oklllk~cx^IJu|ahjjidmƴŴF=O`$.@@zMDollllkzaiͷͻijZFL9VB^HdOhQjQyaRRVV$PEnlllljx]yŵǶ <<SElllllfv\ǷVVhhnlllkk}cx]ɷwl $%   !"#/&'()*+,-.0g13456789f;<=>?HABCDEFG:IJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~WC[FkWIALL"" ++t]lllx^ѿϾ]Tll55zUN~fkljv\μȵE>XX....&&99YMjomf~dɴòȶ^^ q_o~dgs}js~p TT''88pdfhz`z^x^u\sZu^jTxc{n1+ UVia~elke}b}c|a|bv[Ƴv]Z<<kb~ekkg}b}c}c}cu[Ǵ¯İ("ldfkkh}b}b}c|c|cDzòqhBA8800((x11}ejkh}b}c}cz`qӾw^kj~eza{b|bw\~ïeVtng{^sXïnbvc˒嬚ðӟ|_X??( 쿵ﶪƿ凜uf|a˸ĸkhz`u\ɷ쟟jg{`z^Կ%#cci}ehbNTEk`($22 ogıf]21YYߕo~d   67٬r}bue~@: (qq׿Кqleiҿ`W#+ >>rlew\λ ( JJϩpj|`μcY03sxºѲcYH=>8䯯דooWWCC++33kxk|}~pqrstuvwxl9yz{abcdefghijkl9mnoQRSTUVWXYZ[\]^_`ABCDEFGHIJKLMNOP234567898:;<=>?@%&'()*+,-./01 !"#$ @HBD9BC/B @H= ==III  QWa &  (,047:@DHKOSVZ\^de)3=Hdkw&]bl >>994400)) 00yKCnkjjkjzafһ±¯IJMC[[ddTEyyulgy^u®骚IJww>>QDwlf{bgzckWo\s`xeׁote``QQoji~e|a~b}b{bx_w\sZw`t^lW_Kqd0)$$tvAAomlkjf}c}c}c}b{a|a}c|`dɲӿı}>5\\CDnmkkkj~c}b}b}b|a|ay`v\n͹ðƴYYDDrlkkkj~e}b}c}c}c}c|bt[ӿȴqlkkkk~e}b}c}c}c}c}cv\ű[QtCCqmkkkke}b}b}c}c}c{bzbĮнEEBB==@@PDmkkkke}b}c}c}c}cy`nԽ˸îPDljjjke}c}c}c}c}bx]{ŲıUEsqni}bzazb{b{b}bv\űPDzwolg}bzbu\űODSDvqm̴ıƵ006  h)(0`~DDAA::..""DD{EE::11''BB77pDD,,99??44 %%tJC|MDNENEODNBePiReMoƶ ODqjhgeegeew^ʷLCUDkkki~e|byay`x`v\ѿññy BQ7>QEnkkkkj~ezay`w_y`ʺ̹_sojkkkki}c|a|aw^jʷIJƴ/=ReyDDQEmkkkkke}b}c}cx]~ϿƲi_I[FVDDojkkkki}b}b}c}cv\ѿ?8\n3AMMQEmkkkkke}b}c}c{byaμIJ`s燇nkjgkkg{bzbzbzbx^kͺɷǵ\n츸NDj|gzdzd}cge}zyvuuttnǶǶ|o$/P`RDonmje}cu]nlsrsuuƳ`U=L:H11oklllk~cx^IJu|ahjjidmƴŴF=O`$.@@zMDollllkzaiͷͻijZFL9VB^HdOhQjQyaRRVV$PEnlllljx]yŵǶ <<SElllllfv\ǷVVhhnlllkk}cx]ɷwlWC[FkWIALL"" ++t]lllx^ѿϾ]Tll55zUN~fkljv\μȵE>XX....&&99YMjomf~dɴòȶ^^ q_o~dgs}js~p TT''88pdfhz`z^x^u\sZu^jTxc{n1+ UVia~elke}b}c|a|bv[Ƴv]Z<<kb~ekkg}b}c}c}cu[Ǵ¯İ("ldfkkh}b}b}c|c|cDzòqhBA8800((x11}ejkh}b}c}cz`qӾw^kj~eza{b|bw\~ïeVtng{^sXïnbvc˒嬚ðӟ|_X??( 쿵ﶪƿ凜uf|a˸ĸkhz`u\ɷ쟟jg{`z^Կ%#cci}ehbNTEk`($22 ogıf]21YYߕo~d   67٬r}bue~@: (qq׿Кqleiҿ`W#+ >>rlew\λ ( JJϩpj|`μcY03sxºѲcYH=>8䯯דooWWCC++33kxk|}~pqrstuvwxl9yz{abcdefghijkl9mnoQRSTUVWXYZ[\]^_`ABCDEFGHIJKLMNOP234567898:;<=>?@%&'()*+,-./01 !"#$ @HBrEAE @HE;ChCD>B;BAArDB7DGAGF(H6  (,7DHKOSVZfnopqrst0:EPV`DJJZ?0`(0`PPTTVVVVYX\[_^b`fdkivq{VNsɻ˥ҬjG3̱ܵiP?ͫwdW^D1qO4r^i`<mM/y]CuUmS幑־څ.u4j=yV5nLƖcnرկٲױڵٵ۶״ɨ۸ݺմ޾ۻۿ̻/߈.Ճ,1ۋ59uN"^*s?VeCүŦѩܷҵwŲιIJu,.܋+z&22269=;͒J~Hțc٪q}~ً&υ$)-,0̇*35@{S!>p.ˎ>zψ"')),,Ӌ(67:>ٖ9S\e&)ؓ(/ߜ5CGIl(*))054Ō*;VԻ+5;;/;ڬLg۶g/6Y{ĆADKs҈ڣN\ؖΚ`vMW`epppp  ))))))))Rq<;;;;;;;;;;;;;;;;;;;;;;;;;;;;;)Ö45(toCq<<<<><><;;;;;;;;;;;;;;;;;;;; ¬m4ln(o*****+8q<<=;;;==;;=;;;;;;==; ¬(l56n777)(9:o+q<>===@==@==@=====   74ln6n9p+q>?@@?@@??@????@  fim6'9oC>?A??A?AA?A???  m")pCBDADDAADAAAAr6'CBDEEEEEEEEEE»&ggggn'CDEEEEEEEEEEk!dggggdgʲnnoFGGGGGGGGGGɄȯd3fffeg&9+HGGGGGGGGGȮ4m$fg'psIIIIIIIII ƺ4:CGII+43gn:CGIIIIIIIIƺ9CIJJJJ+3ed:CIJJJJJJJJĸkKLLLMLs44444osJLLuLuLLLø&:ONNNNNNNMMMMNMMNNNNNNMNNNMNNNķ%&6666666""""""""""6)p,wwwwwwwwĸffffff3hhi˿5,--------Ÿ5,PPPPPPPPķgnOPPPPPPPPĹnRQSSSSSSSSŠmmmmmmm)z.UUUUUUUU,....Qym9yUWWWWWWWWj#zWXWWTx4vTWXXXXWXXX!#xyVRv(R{YXYYYXXXXɞ&')7VXYYYYYYYYYɄĸʯ(z|/~~~/////~ĸʋx0~ʡ|y0ZZZZZZZZб0ZR|[[[[[[[[Ќx\^]]qoy]]]]]]]]p}1____z________ӴR^222_2sz2_22_Z*mtvRa`a2a̎z22*````2```搑vxz\}ˎ}`*`bbbbbbbbb[ՑӽRb$*bby1ab8h*ܵ<8 cc c 궶;8cc ccc ccccc cccccccc c ۢ8    cc 8 8>IIIellx74ACHE 333333ArD~BC'BGAGF(H*~@HBoBB*H 0( C1A5GFgEB;;.@N C1A5G>?EDD3G;CR3333333333333{{{{{{{{{{{{{{{{{{s{{{{{{{{{{{{{{{{{{{s{{{{{{{{{{{{{{{{{{{p{{{{{{{{{{{{{{{{{{{p{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{w{{{{{{{{{{{{{{{{{{{x{{{{{{{{{{{{{{{{{{{ps{{{{{{{{{{{{{{{{{{{s{{{{{{{{{{{{{{{{{{{ws{{{{{{{{{{{{{{{{{{{x swwwwwwwwwwwwwwwwww{s{{{{{{{{{{{{{{{{{{s{{{{{{{{{{{{{{{{{{s{{{{{{{{{{{{{{{{{{s{{{{{{{{{{{{{{{{{{  $ !"'#%&=)+-*,./120364579pABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijl?DJZ\\\\\i'''hj鑁3TFXcʂŀccvv%_ak'''''''''''\'cccccmmmmmmmm$AYHfLkŀŀ|r +8q(֭Fwdu͋kiRoūX!+5?KT^gmq{ *4>Ielx'cmQ[ZSe}I:_ޏ:ld"= <5qkå/Ξ@@J{cVUx (,047:?CHKNRVZ[^047:۵@(= _ +{RJ雽&t|:I 0 +{RJ雽?CHKNRVZ^(P`W.qtvA~|zxEHHHHH&t|:I 0pbucV94 ylWCF(*F(*F(*?dn t= =,4'nDȗ< dPIlꞂ0'_3^Z5g%0 7$+7 C 7VVv?'y1.k}Y\H2222HH@HH@@H22Z4>7 cڿm14QvF.2I1w$=ݑ%̩7 Xg vX. B pp UX9cu.&[fy``jj\#&u;>N# j\#&u;>N#7(G?utppp UX9cu.&?22HH@@H22H22H222H2qw/E+wwwMGfADz]%, >3[Dq =4pz+K"ux_U{kgV?UB4t].٬zzm}듔 Ioniit ",6@_gm|/39>Γ{-qW_ r֍f j Gwe@y'~xٞ6 w22HHH@@HH@@2H H 0:@dgh3/39>3zj Gwe@y'~xٞ6 wa+y p׼9~] *t71"1"1" &&@HHHHH&HHHH_wO'/~9$īP)rH9t$ Vh_uFD1+dC,I-H@&H@ HHHHHHHHNA?H.^mo` Qc_tT$䁗;dE!>y0-' ~;Ț .'%'V$@Tcɝ .'%'V  !"#$%&'(HHHHH&H$@Tcg[LP'TCMx@tNIA=FS5^,+k<Q :7T2]t:CBJ9LA7;CjFv@\9("EKh<CA.CS>AJ?_kk&\I]g;i]^L^^`89J]J8q9 AKH]D6B$KJ75JtkJAJ@R X#Q8B=7*/%>0;H&F9L67#^El6)8IJ6%i\<E6@RtnCs]`i̋D$PPPhPAXÐjh:BAdPd%8SUV3Wt$t$0t$t$4t$(t$t$8$XD$,t$ |$$u$\Q3B;݉l$L$\r8-hAPYuxAhAP6uE; L$ hAR u D$8yh؜APuE;L$0NhМAR迯uE;D$#hĜAQ蔯E;hARpu 3|$$hAPQu|$$hAQ/u|$$hAR u |$$}hAP9|$$ZhAQˮuE;)T$2hAP裮?E;D$(L$4E;D$ l$5hasL$$T$@R؉ |AorD$DPLrPhu |AQhA A3+$Xыʃ~m$\D$ A3+O̓z+OD$ ̓HD$ ul$A3S+ыOʃYSp|$,$`D$,1hěAl$hAl$hhHAl$M}hAl$2bh|Al$Gh^Ðjh!DAdPd%PV$dD$j$lPQVD$ D$$D$(D$,AuiT$RDŽ$\oPAdPhAhAnL$DŽ$\3^$Pd \Í$hPVjAuiL$QaDŽ$\PAPhAhAL$DŽ$\33^$Pd \ÍT$,$hRPVD$8(AuiL$ QDŽ$\hPA]PhPAhAgL$ DŽ$\3^$Pd \D$0t @A$T^d \Ð̋L$D$Vt$PQhP9@jVj]u^ËD$ u"VA1PhAhA;3^ø^ÐjhlDAdPd%T3V$hD$W$D$L$j$tD$QRD$$VD$D$D$$|$ D$(AurD$PDŽ$dU$PQABPhAhALL$DŽ$d_3^$Td `ÍT$j$tRPVD$D$D$$|$ D$(AurL$QDŽ$d$PRAPhAhAL$DŽ$d_3^$Td `Í$pPVjAurL$QDŽ$d$PRA PhlAhAL$DŽ$dX_3^$Td `ÍD$4$pPQVD$@(AurT$(RDŽ$dP$PAyPh$AhAL$(DŽ$d_3^$Td `D$8t @A$\_^d `Ð̃0SUVt$TW3;|$D$t>D$LL$DPWQW0AD$LuLT$RRPBPAPhЧAhAL$33_^][0ÍL$$D$$QWP|$PAl$P\$HtJ3Itt9l$=BD$L$;s!VUPtV׍t>uD$tP B_^][ÐS\$UVt$ l$ WVPD$ QL$ T$,RUPR(Au\BzuBtP BPj@BVQL$T$(PD$$RUPR(At_^][à t D$(_^][ÐjhDAdPd%8SUVt$\W3WV|$3AЃ;ӉT$`uXD$POȉ|$PPAPhAhAL$\$P/_^][L$8d Dù3|$,L$,D$,QjPPD$lVPR AuLL$QD$P[PAPPhAhAZL$\$Pt$Xˋ3IكSkGˋ3SUKjȃt$lL$8QVAuMT$RD$PPAPhDAhAL$D$PgD$,PVjAuML$ QD$PRPAGPh AhAQL$ D$PD$T$`RAt USFL$HD$_^][d DÐjhTEAdPd%XSVL$fL$ DŽ$hRD$\hP$pBuJL$,Q2Ƅ$hPAPhhAhA$hL$,Y$pj\RK@L$P`h`AL$0Ƅ$lJD$\L$DPƄ$l4L$,T$PQPRƄ$tL$ T$DQPRƄ$PL$ Ƅ$lAL$8Ƅ$hlL$PƄ$h[L$DƄ$hJL$,Ƅ$h9L$$h)L$5BPօu6BL$PA|Ph AhAhAL$AL$Ƅ$h L$8PjQL$2T$Ƅ$h RPD$XP PL$$Ƅ$l AL$PƄ$h lL$8Ƅ$h [L$$hKL$ P֍L$ Ƅ$h.L$DŽ$h^[$Xd dÍD$DPƄ$hqPL$ gPA\PhAhAf$hL$DL$ Ƅ$hL$DŽ$h$`^3[d dV`Ac^ÐVgD$t V5A^V`AD$P^V`AD$P^hAÐSVt$ مt=W3IQ3+{ȋÃ_^[K^[Wy3I_Ð?@Ð̋AÐ̋AÐ`AItQ?YÐVL$P^@̋D$P@VL$PP^̋D$P*̋D$VHQ-^SVt$ مtPW3INjPg3+{уOʋÃ_^[^[jhEAdPd%D$$V3PL$ t$ L$,t$APL$ (t$$L$QL$L$^d Ð̋AL$Vt$t9AS:u!tP^:uu[3^[^=^̋L$D$ PQL$ 0Ð̸ÐSUCuCD$ K@;| ][=D$ D$ L$ Q=u][VEst!KWыʃCP;_L$k^K][jhEAdPd%VWL$ D$_D$ |$,;}(NQL$L$0;} T$+ t$(D$ PL$ *L$_^d  jhEAdPd%VL$D$D$L$(;}VэL$Rt$$D$PL$tL$^d ̋D$PSVWS33It'2P[BKS3FI;r_^[ÐSVWS33It'2PBKS3FI;r_^[Ð̋L$D$ PQL$ 蠿ÐjhEAdPd% SUVWL$ſ\$0l$,D$$VL$ݿGL$SHUPQB} rԍT$R_L$蒿L$_^][d Vt$t9AS:u!tP^:uu[3^[^=^̋D$tPAPt鲿顿̋D$P誾jjjjBL$% ̋D$jPx- #̋D$tPB̋D$u PD$PBt-$ 3̋D$PB% jjjBL$% ̋D$tPB̋D$jPB3̋D$PB3́Vjh@jjjhhABtk$WB3|$R󫋄$$$ $ $PL$hQ>jT$hRVh%8E$VB_^VW|$t!jh@jjjhhABt$;D$t3T$D$jPD$L$$jQL$RPQV$BtVBD$_^̋L$ T$D$PD$QRPɻÐ̋D$8t$L$t \u //u\P@uÐ̃Vjh@jjjhhABt7L$3D$T$PjRVD$h$8L$D$VB^̃$D$PBD$$Ð̡pAD$D$PBupAĔËD$uD$;pAĔÃtpAĔËD$wuD$wpAĔøpAĔÐ̋D$Q1ÝSUVW$ u|$$jhjjjhSBBVShAWi1D$jjPhVjhBt.L$QWhAW51T$ R B_^]3[ WhAW 1 3_^][ jVBV$ EBuVSh̩AW03_^][ M3_^][ SUl$ VW|$D$EPhhA\;\$(tBlAÊ:utP:Vuu3tShTA;hLA;hAWU93Iv|) u1_D)^]3[t(3+ȃ_^]3[_^] [_^] [̋D$ L$T$PhlAQRT hAC:YÐjhFAdPd%QD$Vt$L`AulAPNضND$3L$ `A^d ̸Ð̸Ð̸Ð̸Ð̸Ð̸Ð̸Ð̸Ð̸Ðjh;FAdPd%QVt$ `AD$'N跳ND$觳L$^d ÐdjhXFAPd% uLD$PCD$辳PhAL$D$3L$ d ËL$ d ÐjhFAdPd%SUVt$4WVL$hPAD$4L$؉l$0]Fu O@AƲPCVueh A莱GOP蒲PV! u>L$QD$0hPhA譲L$l$03L$D$h0L$$D$h"L$QBL$ D$h_3^L$Xd dT$RBL$D$dՖL$\^d djhIAdPd%QD$SVWPNt$L`A_\$$NSD$JL$(~ ND$蟕ShTAWD$$`ANL$ d _^[ VD$t V%^jh&JAdPd%QVt$F,`AtPxB`AN D$ND$۔ND$˔L$^d ÐVh?jjtBF,^uhxAG3ødjhPJAPd%VWh~谔PF,PlBB=$tZL$QD$(tV,PRhPhA譔L$D$(轓_3^L$d $jjjjjN $PFjPjhPN,PQpBu^T$RID$(ܓPԓPhA L$D$()jxB_3^L$d $PxBL$ _^d $ÐdjhxJAPd%8SUVWh~-lBPF,PՋ؅B=$u-ÒPh(AƓ_^][L$8d DÍL$QD$P聒PyPhA辒 L$D$PΑ_^]3[L$8d DSdBBtP=0t=T$RuD$PPhıAML$D$P]hA hLA!3SxBL$H_^][d DÍD$,PjShBuNB=&tAL$ QD$PuPh,A躑L$ D$Pʐt$SxBBD$hh(V,PRՅt)PxBD$@xD$uhAN3/%djhJAPd%VWh~ PF,PlBuRL$Q`ȉt$(PPhxA4 L$D$(D_3^L$d $jjVBu]T$RD$(蒏P芏PhLAϏ L$D$(ߎVxB_3^L$d $VxBL$ _^d $ÐdjhJAPd%4VWhܗA~ԍtu_^L$4d @Sh腎PF,PlB؅B=$u.\PhDA_[_^L$4d @ÍL$ Q膍D$HPh$A^L$ D$Hn3[_^L$4d @ÍT$$RVShBuXB=&u躍PhA轎wD$ Pȉt$H蒍PhA׍D$HL$ <9t$(t=L$QD$HTPhA虍D$HL$詌3SxBL$@[_^d @Ð̡|AVt/hxAPu^ËD$PhhAVIV^̋L$SUD$VPQhxA3u WA3+ѿxAOxAʃ_uhxAhhAhxA谊xAu6E藈hArRt3rt.CtctxAtʋ^][hA3\^][h|AD^][Ðh̳AhxAT$ L$QxARP9xAuhxAhhAhxA諉YÐ̋L$D$PQhxAxA uhxAhhA=hxALYÐ̃SBU-BVW3D$Ph@jPjhhAD$0ӋtjL$jQVh%8VՋT$v63tlAJAQRPhдAG̴AJȴAQRPhдA2T$t<3t lAA ̴AȴAQRPhسA讈;_^][ÐVW|$t!jh@jjjhhABt$;D$t3T$D$jPD$L$$jQL$RPQV$BtVBD$_^%(B% B%B%B%B%B% B%B%B%B%B%B%B%B%B%B%B%B%B%$B%B%B%B%B%B%B%B%B%B%|B%xB%tB%pB%lB%hB%dB%Bt$Yjt$YYVt$t$VaYVt PYY^j5A,B^U EVEEEEBPEu EP) MxE EPjYY^t$'YtP&Y3UEP8BEP4BfEf;Au;fEf;Au.fEf;Au!fEf;AufEf;AuAE4P0Btuf}t }tjX3VWuA_A^PEPEPEPEPEPEP^(Mt5At$YYÃ|$w"t$Yu9D$tt$(Yu3Vt$;5,Aw VYuuj^Vj5A<B^UQSVWE EddE] cm_^[XY$XY$XY$UQQSVWdEE@ju uu0E @$M Ad]d_^[USVWE3PPPuuuu u( E_^[E]ËD$pp(jp4+UE eMEEEɌ@@MEdE썅duQu/ȋEdUE jPppjup us' ]U4SVWeEܢ@EEE EEEE EeeeeEt@emdE؍dEEEЋEEԍEPE0 AYYe}td]؉d EdE_^[USVWE@ftE @$jXMjE pE pE pjuE p up& E x$u uu ] ck cjX_^[]UQSV} W}w _ƉuE|9u.MN9L};H~u EM Eu} }ʋEMF1M;G w;v._^[USVWUjjh@u}]_^[]ËL$AtD$T$SVWD$Pjh@d5d%D$ Xp t.;t$$t(4v L$H |uhD@Td _^[3d y@uQ R 9QuSQA SQAMKCk Y[V5A0AY A+;^s:R/P5A- uË A+ AA AD$At$YHhYAu jAY AAUWVSM&ً}3ˋu F3:GwtIIы[^_UW}3AOE G8t3_U =ASVWuu u\5YYEE MHjEAE[fAEAMtT9u3hjE5ASPSuW5A2 ufu;fufEEEAu fAM fAEAM tP9u3`jE5ASPSuW5A&2 ufE;uBfEfME EAufAf;uftM #H3_^[ËD$UQ=pASuEaz ]}(=LA~ jSH4YY @AXuk@ADJte E] j e ]jXMjjjQPEPh5pA 1 tuE EM [ËD$ UQ=pASVWuEAZ ]j;^}%95LA~ VSp3YY @AX#ƅue@ADJte jE] X e ]VjMjQPEPW5pA80 t;uE EM _^[U EVuEEE uEEEBPQ MxE EPjYY^U} S]W36M Vt*uNx AV2YtG< tM uـ'^_[];}u3`AVj^u;}ƣ`AjP>5YAYu!jV5`A%5YAYujY3ɸAA = A|3ҹA‹Atu BA|^'6=TAt*5SVAWV6D$Pt$VVW6_^[UVh0aAW:Y3ME;u;u3mVP9YY@];E,aAMut$MVQPV78u8 At u(!AE aAuEaAEVPuV6^Vt$WF @t:t4V4V:v : }Ft PfYǃf _^UVWud5EPu uuV5_^]<uPt$t$t$:j@t$ t$ U EVuEEEu EBEPn MxE EPj<YY^Ujh8aAh@dPd%SVWeHB3Ҋԉ,Aȁ (Aʉ $A AjYujYe0DBA@A=<'u;AuM; Au%AMB_^[áA AVW3;u0DPP5AW5A`B;taAAA AhAj5A4<B;ljFt*jh hW\B;ljF uvW5A,B3N>~AF_^UQMSVWqA3ۅ|Cj?iZ0DE@@Jujy hhW\Bup;w+HNIN~WPSq6 E 3tËAXA@ t jjS5 FMjE_WPS6 E 9} _tN E% F ^[]UHSVW} 3Gۉuu} M3Mu39U |xÊ$aA3DaAE$J@MỦU؉UUUUxà t;t-tHHtYMPMGM>M5M,*u#EPYEM؉EEˍDAU*uEPYEMˍDAЉEIt.ht ltwMMM ?6u4uGGM} lUЋ @AUDAtEPuP G} EPuPf %ÃgeXxCHHtpHHtl fE0uMuuEPfEYȉMu 4AMENf8@@E M@;ʉ}EfE0uMfEEPt;0PP5 E}2E)Zt2 tHYEEEPYt3Ht,EtMEEeM0AEPu guEEũEuHM@EPPEPAut}uPAYguuPAY-u M}W4YiHHtQHHE'<+u 0AMNt8t@+EEEEt]EE0QEEHEEt;M5EPE Yt fMfME#M@E Et EPYAE t!E@EPt Y%YE@EPtYY3E@t|s؃ڀMEu}} Ee ueEEEM t;ERPWVEU3uċ؃0uWV>39~]ԋEM뵍E+EEEEtM90uu M@M0E}]@t&tE-tE+ t E Eu+u+u uEPuVj EPEuuP2tuEPuVj0}tA}~;E]xfCPEPC1YY~2MQuPEPOuEPuuuEtEPuVj q} Gۉ} E_^[Ȫ@@@@<@D@y@ @UM IxE QuYYEu]]VW|$O~!t$Vt$t$ >tO_^S\$ KVW~&|$t$WFt$Pu ?tK_^[ËD$@ËD$AQËD$f@SUVt$WANǍ,INI3Ɋ)leAA eAA@|  v @Pa v@PT:v@PG:6@P;jd[ FAPQ"ȋFS^RQ0 `_^][ËD$Vj YL$j ^0D$ A^A0UVu>}30=~X= }Q+AEEP16=AYV/3YA)EEP6YF V5V2YYt+A+AWjtE@ft~to}uijVuu V~ tP8csmu,9xv'HItU$Ru uVuuu Pу u uu$Vuuu P jX_^]UE e@E|M;A|SVucsmW 9?~uV9~uQ~uK5AAjVEEj4YYu9~u9~u ~u9~9~}EPEPWu uU؋E;E9;|;{wCEC E~dF@ xE~v7u; uM9EME}$uu$u S7uuuuu V ,}Ei}t jV`YY_^[À}u u$u uuuuu V UQQ= AVWt!u$u uuuu u&us}EPEPWu u1E;EsO;>|C;~>F NHtyu&ju$u VjPuuuu u ,E_^VW|$ GtJxPtAt$N;tQR2YYu"ttD$tt t u3jX_^UjhaAh@dPd% SVWe]su};utU~;w|)eGDt hSP\Mu/YËeM}]uG4u릉sMd _^[ËD$8csmt3UU} S]VW} tu SWu},uuWu,Iu$6uuWFhu(@Gs uuWu,tWP_^[]UjhaAh@dPd%SVWeEE3ۉ]܋u NM؋ AM AM}=AM A]Eu uPuV+Eԉ]M<EԋMd _^[uhYËeejEPLYY33ۋu }E؉FEAEA?csmu'u! u9]u9]tjPWYYËD$8csmuxux u xujX3UjhaAh@dPd% SVWeMAuxkA`U | etDujvc/YY0jWm/YYFMQPYYutR]js/YYjW!/YYvsWn ~V뗃~]jsu:.YYjW.YYt~vVsYYPW f.YYtVjW.YYtHv.Yt;tjFPsYYPvWCFPsYYPvW"eMMd _^[jXËeUjhaAh@dPd%QQSVWeEtHIteQpMMd _^[38E ËeyL$Vt$Qƅ| 42I ^USQE EEUuMmVW_^]MUuQ]Y[ UjhbAh@dPd%QQSVWeeAtEjXËeeM-@AtUjhbAh@dPd%QQSVWeeDAtEjXËeeMDS\$UVWut$Yt$uSY33SiY;5,AwDVSUY t)VYt$CH;rPSW,SUHuj^Vj5A<BtACH;rPSW,SUuj^VSj5A`Bu=AtVY_^][áAth$Ah AhAhAjjt$ 3 jjt$ " jjj jjj Wj_9=\Aut$lBPhB|$ S\$=XATAuuN@u NNC|5AB_^][DVAt P&YA|^SVt$ Wt$w uj^3w*;,Aw S|Yu+Vj5A<Bu"=AtV)YtSjWX' _^[3VWj3^95`A~DAt/@ t PwYtG|A4.AY$F;5`A|_^Vt$u VY^V#Yt^F @tv'Y^3^SVt$ 3WF ȃu7ft1F>+~&WPv& ;uF t$F N Ff_^[jYSVW33395`A~MAt8H t0|$uP.YtC|$utPYu F;5`A||$t_^[Vt$viYtwAu3 AucjXAfF uR^fN jX_[^3^Ã|$Vt"t$ F t)Vf f&fY^ËD$ @ tPgY^UQQVWuuu uKE5=A(j/u R'YYhPbAYhNYSSVW& E>V?|0Y<\uj\V &Y;YS\Yt/PM;Yv<8=uWSP( tӋD83_^[SUVW|$;=ANjAD0tiW*Yt<tujt*jk*Y;YtW_*YPBu B3W)Yd0t U'Y3%AA _^][Vt$F ttv趸ff 3YFF^UQQSV5AW} 3ۉ]]&TA;tPVYY 5TA"V@P苦 ;ţTAVP jV5-ujF_VVY0i A<+t:|<9F>:uNFV(k:u#FVY Aȉ A:|<9F;tى A;ţAtjV5@A@A `@A _^][YSVW39=Au3Lt$j[F;HAu ;XA9=A NAQf9=@A LAQ JAQ HAQu DAWQ FAQ BAQPS FAQW BAWQPWSA,f9=APAPAPAPu(AWPAPAPvSW,BAPWAWPvWWWWjWWSjPSSWWWjWWjj vSW{XLA\AN;};;;~;}_^[;|;;~;Fk<Fk<i;u3;PA3;`AU} S]VE]eu `A AӍHimCWj:%_E_;Uk+EL k+Eȃ}u8}udAA;~ Eu `A AM }u+E$ LAk<E(HAk<E,iE0PAUE$ \Ak<E(k<AE,iE0`Ay \&I`A\&;|+A`A \AXA^[]Ul$V3M}3SWiҀyʺ3;ʍF|+@;|+ʺ@;|@+j^tAQУ|AiҀʅdAuAj~Z9}BJjpA+^jEPj^Vh0bAVBtEPVhtAVSBjXAu$E;upAuuu uPB9]uAESSuu E @PuBE;tc]<ǃ$geuWSV jXËe33M;t)uVuu juB;tuPVuB3e̋Md _^[Q=L$r-=s+ȋą@PU SVuW;5AƃAAƊPe} }tgubHt@< tMOED0 EjPuQ40Bu:BjY;uA A>mu35P Y&UUL0D0t ? u $E ME;ME<< t GEI9MsE@8 uE^ GEsEjPEEjP40Bu BuG}tAD0HtE< t GD1);} u } u jju_ } t GM9MGt0@u +} }E%AA _^[̋T$ L$tG3D$Wr-كt+шGIuʃttGJuD$_ËD$ËD$;As=ȋ ADt%PYPBuB3tAA W|$j$L$WtAt;u~Ѓ3ƒtAt#ttt͍y yyyL$ tAtdGu~Ѓ3‹tt4t'ttljD$_fD$G_fD$_ÈD$_U39Auu u8YY]ËUSVAtZBt 9M uB 9M uBu^[]UM9;uAMVtMu t8;t3"t FAMt-At"t FAMt9tAuȀ9;u Au &+^#]U=Auu u5YY]ËMfft:AtQAt 9E t9U t A3]ÍA]ЋE +#]U`EeSVW3;lj}tt~0~ u&EEEt+@8uxHt A=AjDE^VWPu5A ;t!Fȋ A|uNH;uDjfEPEY0EY3;HT0~7ËA+PAPV+ } tPV&P+ t߅tE;0u&F&5Ah%AY3_^[]ËL$3҉ AؽA;t B=@A|r$wA ËܽAAÁrAv AU}u3]5Auu uuj5A u]Ã]QSUV5DAW3;tNBWWWWjPWjӋ;t>U;YD$t/WWUPj6WjӅtWt$_FY;Yu3_^][YÃSVW33At7;s@t+Ƌ؃uTG A|CVdYt3A A;s`@ _^[ËD$V;AWsRȋEEE t A#Muj^@t Mt t t ؃;u%AA>jVuEPuuuB;tVBuVBBPYuM@ uMVS%YEY E _^[; j;Yt24<,Y?t GFPuҴYYt<5E2uz}ލPW誴YY@M d W} +~ohVPhSE ;}PPS t+~׃=Au A u SYY@}>ju SSPBNuA BAjuSn _ A ^[ËD$L$ ȋL$ u D$S؋D$d$؋D$[Vt$tV@PYYt VPYY^3^ËD$V;AsZȃ ATLt>%9t$ u |$ @uɀ f%^A A ^%,B%0B%4B%8B%<B%@B%DB%HB%LB%PB%TB%XB%\B%`B%dB%hB%lB%pB%tB%xB%|B%B%B%B%B%B%B%B%B%B%B%B%B%B%B%B%B%B%B%B%B%B%B%B%B%B%B%B%B%B%B%B%B%BUA;t  AáA;uÃutSVEWP5A BBj5AӋ5BEPEjP5AօtI}tCf}u}t}u1EPQYuEPEjP5A8@Au5AӋ_^[áAVt A^tVYt^Ã^UQQ=AVW=Au}AMQPBtqutj$tTEPVW5ABt>Et7;Ew2v.wf?u>t~ u#VCYuM}w3e_^jXD$t=Au %AÃËT$SVZ t_fR33ɾ@Af9t AA|t EHA{ t EFAjt EDAYEBAPt BžA+ t BżABt źAŸAtuxu3^[3PPjPjhhfABA3PPjPjh@hfABAáAV5BttP֡AttP^UQE=AE uAtMjQM jQPBtE Ã%B%B% B%B%B%B̋PnGYËP`GYËPRGYø0hAI̋EM9ÍM0phAI̍MMhAkI̍MhASI̍MMMMiAI̍yncXMB7,!XiAH̋EMøiA4H̍jAG̍dYNCPjAG̍MMMMjAkG̍|qf[jAF̍MpkAF̍MkAcF̍MkACF̍MlA#F̋M0lAF̋Mt`lAE̍MWlAE̍M7M/M'MMlAE̍MMMmASE̍MPmA3E̍MMmA E̍dpyXnXcXXXMXBM:X/mAD̍MMM0nASD̋pnAD̋MMynAC̋MTMInAC̍M' oAC̍MMPoAkC̍l||MMMMMMMMMM~MvoAB̍M7M/M'MMMM(pAsB̋MMMpA-B̋MMpAA̍MgM_qAA̍MGM?M78qAA̍MMxqA{A̍MMMqASA/$AN@@@A@@@@@^@|@@@@@6@@@^@|@@i@+@@6@X@@@@@@i@+@@6@@@^@|@1@b@i@+@@6@@@N@E@&@cmd.execommand.com/cCOMSPEC@@EEE50P (8PX700WP `h````ppxxxx(null)(null) @@@n@x@@Ļ@"@+@@@@c@O@S@@@@@PATH.com.exe.bat.cmd.\runtime error TLOSS error SING error DOMAIN error R6028 - unable to initialize heap R6027 - not enough space for lowio initialization R6026 - not enough space for stdio initialization R6025 - pure virtual function call R6024 - not enough space for _onexit/atexit table R6019 - unable to open console device R6018 - unexpected heap error R6017 - unexpected multithread lock error R6016 - not enough space for thread data abnormal program termination R6009 - not enough space for environment R6008 - not enough space for arguments R6002 - floating point not loaded Microsoft Visual C++ Runtime Library Runtime Error! Program: ...SunMonTueWedThuFriSatJanFebMarAprMayJunJulAugSepOctNovDecTZ@@GetLastActivePopupGetActiveWindowMessageBoxAuser32.dllAA"A&ACONIN$CONOUT$ PhABABA,BA hA`BAwBA hABABA iABA 0iABABABABA  xiA CA+CA6CAACALCAWCAbCAmCAxCACA CA jACA 0jADA DADA pjA@DAKDAVDAaDA jADADADADA  kADADADADADAEAEAEAIEA(EA 3EA >EA kAEA kAEA kAEA  lAEA PlAFA lA0FA lAPFA lApFAxFAFAFAFA 0mAFAFAFA pmAFA mAGAGA  mA GA+GA6GAAGALGAWGAbGAuGAmGA PnAGAGAGA nAGAGAGA nA HA+HA oAPHA[HA @oAHA poAHAHA oAHAHAHAHAHAHAHAIA IAIA IA !IA )IA 1IA HpApIAxIAIAIAIAIAIA pAIAIAIA pAJAJA  qA@JAHJA XqA`JAhJApJA qAJAJA qAJAJAJA0 @@S@@@      !"#$%&'()*+,-./0123456789:;<>?@ABKDEFGHIJ=LMNOPQRSTUVWXYZ[\]^_`abcdeYijklmvopqrstuhwxyz{|}~@:A@WDREG utility v6.23, Copyright (c) 2003 - 2004 Jungo Ltd. http://www.jungo.com Command usage: non-WDM Drivers: (.SYS drivers on WinNT4; .VXD drivers on Win95/98/Me; KernelPlugin Win2000/XP) %s [Options ...] Action [Action ...] Options: -startup : Set startup level: boot, system, automatic, demand, disabled (default: automatic). -name : Set then name of the driver (default: WinDriver6). -file : Set the file name of the driver. -vxd: Load a .vxd driver(Win95/98/Me only) -silent: Suppress all messages. -log : Log all messages to filename. Actions: create: create a registry entry for the driver. delete: delete the registry entry for the driver. start: start the driver. stop: stop the driver. install: stop + start (if an older version exists) or create + start (otherwise). uninstall: stop + delete. WDM Drivers: (Win2000/XP) %s -inf [-silent] [-log ] Action [Action ...] Options: -inf : Full path to an INF file to be dynamically loaded. -silent: Suppress all messages. -log : Log all messages to filename. Actions: install: install the INF file (if needed, reloads new driver file). uninstall: uninstall the INF file. enable: enable the driver. disable: disable the driver. %s -rescan [-silent] [-log ] Options: -rescan : Rescan enumerator (ROOT, ACPI, PCI, USB etc.) for hardware changes. Only one enumerator can be specified. -silent: Suppress all messages. -log : Log all messages to filename. For more information, please refer to WinDriver manual. STATUS_SUCCESS STATUS_FAILURE STATUS_REBOOT_REQUIRED Please reboot the computer in order to complete the action Failed trying to %s the driver Invalid parameter %s %s: completed successfully %s: unsupported action for this driver stopstartdeletecreatedisableenableuninstallinstallInitializing driver failed Creating driver failed Warning: failed getting full path for %s, using it as is no action specified: nothing to do! WINDRVR6WinDriver6You need to use one of the following flags: -inf / -name / -vxd. For detailed usage information, run "wdreg". Cannot use both -inf and other flags (except -silent). Use no parameters to see the correct usage. Cannot use -inf for this operating system Cannot use vxd for this operating system, use ".sys" file Use WDREG16 for installing WDM drivers on Windows 95/98/Me system Unsupported operating system unknown option %s Please specify an enumerator after the '-rescan' option Please specify a filename after the '-file' option Please specify one of those values after the '-startup' option boot, system, automatic, demand, disabled Please specify a startup level after the '-startup' option Please specify a name after the '-name' option Please specify a filename after the '-inf' option Please specify a filename after the '-log' option Command line:Cannot open log file %s ------------------------ WDREG ver. 6.23 log from %s -rescan-filedisableddemandautomaticsystemboot-startup-name-inf-vxd-log-silentCMP_WaitNoPendingInstallEventsSetupTermDefaultQueueCallbackSetupDefaultQueueCallbackASetupInitDefaultQueueCallbackSetupCloseFileQueueSetupOpenFileQueueSetupCommitFileQueueASetupInstallFilesFromInfSectionASetupDiGetDeviceInstallParamsASetupDiSetClassInstallParamsASetupDiClassGuidsFromNameASetupDiGetINFClassASetupDiCallClassInstallerSetupDiCreateDeviceInfoASetupDiCreateDeviceInfoListSetupDiRemoveDeviceSetupFindFirstLineASetupCloseInfFileSetupOpenInfFileASetupFindNextLineSetupGetStringFieldASetupCopyOEMInfASetupDiSetDeviceRegistryPropertyACM_Get_DevNode_StatusCM_Reenumerate_DevNodeCM_Locate_DevNodeAUpdateDriverForPlugAndPlayDevicesASetupDiDestroyDeviceInfoListSetupDiGetDeviceRegistryPropertyASetupDiEnumDeviceInfo%sCannot find the function %s in %s: %s SetupDiGetClassDevsA%sCannot load library setupapi.dll: %s setupapi.dll%sCannot load library newdev.dll: %s newdev.dllDriverInstall%sFailed opening INF file %s line %d: %s %sCannot uninstall INF files from DriverWizard on Win98/Me %sWarning: the device (hwid:%s) is not plugged-in. %s%s %sCannot reenumerate device tree (CR_ERRCODE 0x%lx) %sCannot locate top device: %s %sTimeout (%ld ms) expired before install events completed. %sWarning: Failed waiting for install events to complete: USB\ROOT_HUBUSB\%sWarning: cannot copy the INF file for device (hwid:%s): %s %sCannot install INF files from DriverWizard on Win98/Me PNF%sWarning: cannot copy INF file %s to the INF directory: %s %sError updating the driver (hwid:%s) with the INF file: %s Verify that the device is connected and the INF file is not currently being used and retry installing the INF file.%sWarning: the device (hwid:%s) is not installed. %sError getting install params for removed device: %s %sError removing device: %s %sError setting install params for removing device: %s %sError finding the device %s %sError getting the install parameters for device %s: %s %sError changing the device status for device %s: %s %sError setting the install parameters for device %s (SPECIFIC): %s %sError setting the install parameters for device %s (GLOBAL): %s %sCouldn't get the hardware IDs of all the devices %sSetupDiEnumDeviceInfo failed with error: %d - %s %sSetupDiGetClassDevs failed with error: %d - %s %sError calling class installer register: %s %sError creating device hardware id property: %s %sError creating device info element: %s %sError creating empty device info list: %s %sINF copy for %s cannot be deleted: %s %sWarning: INF copy for %s not found => not deleted. \INF\%sINF copy cannot be deleted (error getting windows directory: %s) \\.\WINDRVR6Failed closing file handle to %s (0x%x) %s %s - %sFailed opening %s for reading. Last error: 0x%lx: > (Default: %s)%sPlease enter the file nameclsCannot load dynamic functions %sFailed to install the INF file (%s) %sFailed to install WinDriver's kernel module %sTrying to create WinDriver fake device *WINDRVR6Failed to uninstall the INF file (%s) %sFailed to enable device (%s) %sFailed to disable device (%s) %sFailed retrieving manufacturer %s section from INF file %s: %s Failed retrieving hardware ID field for manufacturer %s: %s Failed retrieving manufacturer field from INF file %s: %s Failed locating Manufacturer section in INF file %s: %s ManufacturerFailed getting device class GUID from class name %s: %s Failed getting device class from INF file %s: %s Failed opening INF file %s line %d: %s Failed to retrieve value of INF field: %s Failed to allocate %d bytes for INF field Failed to retrieve size of INF field: %s %sVmm32\%s.VXD\Cannot open service control manager \\.\VXDLDRDeviceIoControl failed for %s: %s Could not unload driver, or driver was previously loaded Cannot delete registry key "%s": %s System\CurrentControlSet\Services\VxD\StaticVxD*Cannot set registry value "%s": %s Startwarning - %s already exists in registry Cannot create registry key "%s": %s Cannot open registry key "%s": %s \SystemRoot\System32\drivers\%s.SYSFailed creating service %s: %s Error trying to open service %s (0x%lx): %s The system is busy. Please reboot the machine and try again. ControlService failed: %s Cannot remove the service - access denied The removal will take effect after the system reboots. Cannot delete the service: %s Error trying to open service %s for delete: %s Service %s already deleted Error starting the service %s: %s Error opening the service %s: %s Cannot stop service: %s Sending stop request to service: %s Nothing to stop: service %s is not active Cannot open service: %s Nothing to stop: service %s does not exist a+tRETRY CANCEL Please press 'R' to retry or 'C' to cancel... Error: There %s currently %d connected device%s using WinDriver. Please disconnect or uninstall all connected devices from the Device Manager and press Retry. To reload WinDriver, press Cancel and reboot. aresThere %s currently %d open application%s using WinDriver. Please close all applications and press Retry. To reload WinDriver, press Cancel and reboot. is `A`Aƾ@aAaAm@@@`y!@~ڣ @ڣ AϢ[@~QQ^ _j21~JAJA ((((( H . pbAhbA`bAXbA  dAdA dA ddA8dAdAcAcAcAXcA cAbAbAxbAybAzbAbA|bAAAAAAApPSTPDTAA;Zx0Nm:Yw/Ml        ! 5A CPR S WY l m pr   )     5/?GGGwHHHIIIKKKsMMMtOOOuPPPQQQvRRRSSS1!x2@y3#z4${5%|6^}7&~8*9(0)-_=+ qQwWeErRtTyYuUiI oOpP[{]} aAsSdD fF!gG"hH#jJ $kK %lL &;:''"(`~)\|zZ,xX-cC.vV/bB0nN1mM 2,<3.>4/?5*r ;T^h<U_i=V`j>Wak?Xbl@YcmAZdnB[eoC\fpD]gqG7wH8I9-K4s5M6t+O1uP2Q3vR0S.<dzjXF8(^lN6(*:JVbt(2>Tjz . H ` z          0 B R b z         4 zjXF8(^lN6(*:JVbt(2>Tjz . H ` z          0 B R b z         4 GetFullPathNameALocalFreeFormatMessageAGetLastErrorFreeLibrary>GetProcAddressLoadLibraryExAMoveFileExAlstrlenALocalAllocWDeleteFileA}GetWindowsDirectoryA1CreateEventACloseHandleWaitForSingleObjecteSetEvent?CreateMutexA%ReleaseMutex4CreateFileA\DeviceIoControl[GetSystemInfouGetVersionExAGetFileSizeYGetSystemDirectoryASleepKERNEL32.dllbRegDeleteKeyA[RegCloseKeyRegSetValueExA_RegCreateKeyExArRegOpenKeyExA4CloseServiceHandleEOpenSCManagerALCreateServiceAGOpenServiceA5ControlServicexDeleteServiceStartServiceAADVAPI32.dllHeapFreepGetTimeZoneInformation]GetSystemTimeGetLocalTimeHeapAlloc/RtlUnwindGetCommandLineAtGetVersion}ExitProcessHeapDestroyHeapCreateVirtualFreeVirtualAllocHeapReAllocIsBadWritePtrTerminateProcessGetCurrentProcessHeapSizeGetCPInfoGetACP1GetOEMCPWideCharToMultiByteMultiByteToWideCharLCMapStringALCMapStringWmSetHandleCountRGetStdHandleGetFileTypePGetStartupInfoA GetFileAttributesAUnhandledExceptionFilter$GetModuleFileNameAFreeEnvironmentStringsAFreeEnvironmentStringsWGetEnvironmentStringsGetEnvironmentStringsWWriteFilejSetFilePointerSetUnhandledExceptionFilterIsBadReadPtrIsBadCodePtrSGetStringTypeAVGetStringTypeWReadFileFlushFileBuffers GetExitCodeProcessDCreateProcessA|SetStdHandleLoadLibraryAASetConsoleCtrlHandler!CompareStringA"CompareStringWbSetEnvironmentVariableAaSetEndOfFile ReadConsoleInputAPSetConsoleModeGetConsoleModePeekConsoleInputA/GetNumberOfConsoleInputEventsWriteConsoleA4555556G6r666667;7c777778>888919L9g99999 ::>:f::::: ;;;;+$>/>4>`>k>p>>>>>?0V0000}1124#4.434c4444444)555 66S66666#7L7W7\77777)889 99S9999:o:::::';2;7;;;;;<-=Q=W=b=g==L>Z>>>>>>>>??@d[0g0y0001,1W1b1g11111f22222222)34R4x44445555556668u88:;>>P022A333 494g4445m5s555g6m666727@7f7|777E8V8_888888889999:::;5;<;_;<->h>>>3?W??`|c00 1q12[22 33!4A4a444465555 676e6l66627~777888h89:&:p:::;;8<>? ?????p0S00b111 2D2r2#3A3}33334 44%43445V5556667708]88888;999::::;;;;.<;O>f>z>>>?5?U?a?r?????? !0400"1N11111i2}2222$3e3o3333 44445&5:5L5]5b5o5y555551666J6V6b6g6t666666667`7f7n7u7{7777777=8C8z888888888888888899999 9&9,92989>9D9J9P9V9\9b9h9n9t9z99999L:V:a:n:{:::::::;^;;;;<<-=j=>>J?d?m?????????? 00&0+00001C1S1k111112E2Y2m222313D33T4n4|44444444445E5x5555566777*727U7Z7d7x7}77777788!82888H8O8V8^888888888888889 999k;y;;;;;;;;;;;< <<<9557f8n888u999:;<<< ==J0N0R0V0Z0^0b0f0<1S1]1c132E2c22233440464<4B4G5T56778899#9,999::;;<<<===<==>>T>Z>f>>>>>>>???$?+?5?N?V?[?g?l??????000.080A0s00000000001*101<1C1N1p1|11111111122 2&222222233+3;3\3h3z3333333333444!4/4M4j44445C55566677 8808E8v8}8888899D9R99999999 :>:E:i:v::8;?;;;;;;;<<=l=>>>g?r??????? ,0C00000 1V2r2222$303B3H3[3l3y3333333344"4/454;4G4]4q4444555/5=5J5O5U5555D6'7@7u7}77777B8U889999999:,:;:}::::::; ;;$;1;9;;;;;;;;; <%<,<0<4<8<<<@0>4>8><>>>>>> ??.?G??20;0F0^0s0000001*1112223%353=3C3I3^3d3q3w33333333333333344 4&4-4F4]4x444445 5-555N5X5c5m5{555555555555666)636;6C6K6U6^6f6}66667+7Y7d77777788 8/8@8M8`8f8l888889929=9O9Z9a9f9999999999:; ;';/;4;8;<;e;;;;;;;;;;;<<< <$<<<<<<<<< ===D=H=L=P=T=X=\=`====== >>,>?>F>X>`>p>>>>>"?4????000&000^1e111222#2'3K33 44444B555555 6666667i7s7728=8R8W8d8v888888889i99999::E:U:\:q::::::::;;H;R;;;;<3<=<=]=d======>>>>>>>>>>>>> ?t10L0u00001$11112 22*20282=2C2T2Z2b2h2p2v2222222233 3$3)3X3^3i3o33333333334455&515<5F5N5Y5g5555666G7_77777#8-8>8K889.9j9z9::::::;;!;;;;;<<<$<*<0<6<<=D=J=P=[=k=r======== >>&>2>d>s>>>>>&?3?S?b?x????????, 000*00050;0B0T0p000000000@T;2222333"4m44U555556<6Y6666777878g888:999':Q:y:::`0 0$0(0,0004080<0@0L0P0T0X0\0`0d0h0l0x0|00000000000000000000000000000<1@1111111111222 2(2,2<2@2H2L255566 688T8\8d8x88888889949<9D9L9`9|999999999999::4:<:D:X:t:|:::::::::; ;;;$;,;4;<;D;L;T;\;x;;;;;;<$<8 >>>8>T>\>d>x>>>>>>>> ??(?D?X?t?|?????????????pH0 0000L0T0\0d0l0t0|000000001$1,1@1\1d1l111111111444 5,808@;X55 8084888@8D8@9D9`;d;h;l;;< <<<$<,<4<<Y `lUo5*$h{ W}܉õtN%6δ`%HSog-`YlL\{eywIBɉ[0E oHkj5 u6cN]Pl8YFp g= (q"Ë$ncC<ĤƆc@'fcR :oK|$`& `w[<u{fI]KPݲkr$>0̂/ذT tL6"1Zd1 P+u#o.Bl 5xHl{}ڄF!ƅWcVg !kcGo{edCl l0KH#^ׂ(MU>;͑",Ԕv (o&s%cWp"FȆD>;!<$I)( x(pvlko*0t2dMDpgœ<4Ѝڥs]Ѷa{S, 4lhPtJz-XPdۻ41rVF%;aR=%uH, ~-R$_/VR?!OxAƩU MFmX[H,oop+9ppDZ/Dl9tVeml,%ZP}AlIϿx OO3/ ɍ/@B߄X Y[пOزod[2!X'uA] uC4# eslF|5vt<$I#@X!JM`h;e1P0hsk  PHp6 n3RuvD3O%] VПu;h]P3Dpe(V#g~9Z҉+TJU+/ h ,M8`wJ 6<@ !t&80`ViKto;}R,s Nt\ pt´Mt7tڀ} ZPGt8 4E]K;Q C~8j p!?d[f/?aDG8}M؏O #\8Fuu X$L\ Jt3@=tct[_3'C "CJ(Oo@20)ԏvbo8X|otr,l$ WF,cc %/DŽ;] tI ç,XY׈^ ҜzW FlaY>0AФUW ozelG3/m3`mr:pE0pw'zr 9MjMۆ4l"T av[.ZE=7JLHܶUBɤ5NOH-4-Q\c㌂؏Gnt 3%9ql]<u ݄[RS u%VmSDuXSI niI6[mOõ l@Z ά m!YOOk]1FK P 8cZpMhxlg tti$¢۰lI5 1j /6vlixmy!mD]A T ސDQM 0@4^- 5!G3NI3ru'@UFm !t/S !VS,;7{ i 9=RÄ"h z6a{ q}Nz rg}sWgƞ/vAq!N)|b5P  ۡؒ9=Ds?=M9{z9{ =b̆<bAshYx4_ :E1 BD%5 'bp(u2|)`9lm؃tC3BNC$P,vL!|wh/HkZl]* 3v/$eV(,eJ.,=ةC& 4.qU-_€NU t @Ϣ'Y˗tXeL>f{}cu$fv ܏^W uQ%CͰm&DWolM4~-FYԅ]6dL]v:;nRu}G}}HFmmw[r?{b, G/;JXgΝah[֮9([n;1W5i @/vG0+X Xu&>oPNjH.bu.fي 1ی1:p{JrRBǽ@tankIKtR #uBV78nux<}Xo9E2h*+o$ 7m{}59|u%kjcTjX륯S*At] #Joo2\$|u ͍Pw%wX t@? F4Q]S;CB06LD 4Sojڡ8N>Vj =!@aLGMZ@ !L!This program cannot be run in DOS mode. $PELe]B 8Pj p@ pUPX0UPX1P N@UPX2pP@1.25UPX!  >XEG}U\DJ&hU]U1ۉu1=wC=wr[$1D$ktlt*л7w؋FQ]Itf{a=v3 ?u\ t4`Y\g}\(tX|;{/$L)n`O Sv$7@)lRwoE3Us k T[ 8`0AX0%ݴAEt =mK0 $:,$fm<%\ oQP]k(Eݚ6##clB6 $g'> c!,!d~&l%]t& A]r[߹WVS;HY}tE 0s~G -= g)ˉVK~'~vG3u1-#42Tl0vo*WBVqnm-uXY$~JD@Pl,^gs\ƃC|CVk`;tE./VP΃ݗdMPQ0$ lj-W4ml 0/5ʀd0VWpy>[crVt5 VZ09ޟf/R2ڹ@ *PYpՋppdL M) Kq͡ 2 {|JV;N'@;;a,Խ|~؝܍t\s!+RphuWR\B{ܐuGWk9뢍YJJ[QdHUR0׵԰_R=z`%{EyEmR]#uh}?oKE7dX!q$-e ^lZ0 Fvl|Nu!dg^!#؛s2_L~8, swtcŷ}t(FaMWe,}.8,\H5:̴̜duEؙ,U?-\@RDCOB`?x9AP>pt?O20'#O Ul#R*X؁=8E!N2maҔZs*g{'Q,/؍P;Fu9T`ٷ0_Ǜl#c&]aR!f&l dx두 %t$@ dB^w>tX GP=s : |Wht؊2cg$]itt&M` @ܓ3 ht ܂H;\rȺT7Xp`'̈́ Ll ˙t-O@x&!|<羜t\\!C|!mT"8(iܻ\\2sLA^t |g)E<SDPD'x+rLL8M<-L ,$  ɼ.M\A^? P{?;`` l |F/WV1UKPEoك@Ф ƄxU݉7Z(6[a;O10P ?aOىRw^;N*@ vw8Dx2 ^+3Sa/)0@'qT# BYd*l1od@Uk@s\j2;MI@V!X/ok9΁+X3raȍrDfSHTruB]IFlH;T@/ɡB&0 U\/c=U3mcV +S#F4@w_/SLK%>l#6 @)@rl? gAD%κ2Zt 2/!df`L!_hdpHP KB [xW͌kĴZtHq;L-#e=tX/Ʌ7`n@Y+o?lT>/A ~nŃY2Ņx(/CVUJ\1ȭm5"Φ`mtmdu= f| ; $d-|~Ӊ/gЋ[EX80]t(YBxuiW^ʠ6>x3NB }I{8[(Xa7) .N&j?,(nx@9JD|IB-?Cv]9gBuFjfؙ  m̸h ?QLB~[rlD5A @\Akq/+QWA T fn_@_)t/Ku i7\[[hW& @E ZWR5?pPr6hds%OoNH![帰$Q e'nMl*!!c/DL*'l_ȶEQHZoBFgSndS1P9Pa FJxD|*A y;</|R4p5 U1P<|&DQJ4\x_[ $p?Q|AgDul''|6ɰġyȡ̡СvF/f"4'@CG"ӅD[]cH<'`Yv?E$oe|@c pj^Qˠ]\rc4V;+?$BPx=uV$naqz(Q[2[ر'yяqx!UtZ,BLR~t=@,XzQ+Yi"V)?Nx,}1x8 G x@("] #ktFۉ\a ߶toxYeXؔJAa~Pȫ Pe#p\ǃډGp#`F6s3C"xTyxFpu /5n lJhb v…xČ뮥֪\,?8t+ o*Cc r@n$Ӕp3е>PICIv0GU~]S]D7t@ 0\7\ah9LJ , "TO_(EbѴpx^0#wy) >G> 'b܄cao~Nygt!oӑ7Fe?JAfcqrFJ>i#r cJhExI!t $K,ېۥO M ۽lȶ9Y% LXJ/swfpfHfUeZ6A 7;]G)00ۑ..@^eB_,Vw a,ydLj8CSusDUɅ#aruar +Ɗa6ft-䋃- /| (UCZV9}u ;akuQG4[$,!ۃ rC>8t^ G٢a GS8a,Ü+@mvHWhz ?]-Z?7G! LШ  Gzm\oz tS}P Okf v:/W\ |AM=ƉoRʨv ; uxhaSWct<:8mܬ5u Z"7Q!g=t1nL- _-r"Yx%C X`lFlX?2#Q28 Ǵ@0d'b1A!!!!!!!!ؒ!!!!x2R^o|Q#$Gm?%\Zk2*&t~o@m_:ϕ Cݽt۠l?/HZbs*h*v{l#NJPۇXAV>Tll>C}@e89Udhwӄ1Er5ᇧ4mtyp.L7ia+tF(~wtCXIVM)irso'rx!,1f=cz#`oxUqV`ˈxL/4AoDsxNGMu#5O9rZF`?қD^"tnU:;w<@Ȗ&O'Leu _/IdvN}45\%c[EV M@\"NT0ɉyE߱-̈ = %6ꗝT5BӋ%I7!U*8l?}eRRx0 u⤠ S$>@;:҉T!TLj)í 6;):)ROM=X Nփ7I)Έ, 9 Q0Q\h 7beR`I1BhdPLOM9PrW⽃|5Wyq|ْ-Gyt4%{vI,nduM5.0_ ;-6/oOB9BaR_A^ruLB퐯vk `+3aKJ {+̹;kmup-u+Wf Y?_A90,X y;PJ% 9Jfz6q2Ykŕ|j44e$ ǑIG鄟/XW(/OP;1)9YBc\g07-l *KHd[F+9Rlޓ;wtEL9AMH;LNE(7U*AQޒa Ȕ\,( AUj*nQWfAzSW Btso29)0 !/">ªKv 9 TžO& "G*P70spB  > #t=^;|C6ʆ+Ӧ@?wZag4G&jp:B!OGXeubRKD7LY))kXvr:p` lclY[0m!D'?F`xш(X3uenrRRLRbttOa+M]`&YON J@8P/B  9ZOa {8rs6@ {h^ vr)b`oF@JDUKe9[ [kC-;MuUt^- bwMmHÐzf8?²g$@`u'[;|b)xRn&  ƾd)=5~LK%L$U֫%$#WdrJ*͚u02Hdco ԄMozq`%N1buHkGd-'p[HIsi@R]4"-fl!]1?p 8/pjWJ`# fT +O@<|QVpA9UTrwxZsd8^)rta^|Ȃ9s;;R)ߘ GB<:!vc%5B.b'B2jFo:#BDK)+fW3x<%˅oE}E?EX DbBb]J/,ob))#/zTf3JWsoEC(UX 7AO@E7XeA` ]));U8$hG:a1G$y=YV<i#/},dquOCIV%_ 52?M.X20jWK["_PM &ha.!~}b]U^3Eh){j.lCy5`1Ҫշ4X 9߶|xjƚBW-Wu  9E}ua;8zO!PEBȈ9#B9C>²:vF?iVZa>4@XEE=!dĬHܯً<>>]M=H'M"LU ٚh ~sL_H#.LČ 9~a[\`p(gP,xcO7D_(?`*޳=j.,OبP e >0)F4;][ bPDMpG$0@ރ#1v5 Ut3Uԅu%Wmgh_{6alˍ؋ae^hc+Fg ]G#DMTxn +-!$Xr@!F(gwÐC<*r "XyF/r2_-0)*/oF YD#*CXϤa-D ] f#{H|_^+-KzA&͢f/e&{&_T) _}NILVI x$] P] 0!B2f})e+{ׯ"l8JUct@t5=߃bIe^&r _/S ?̂p2u&풡wSYڈr~שh}WaS&u)|%R@w"T=}|&-Koѐ)t./۬H̷rrB{U)9ȝg IyF}|/xVz,뮢M̯j=!3^n<I./%f3WS|| /G}_1^l^&@NfEȓE4 BND_ Ԓ'N,b$ ɋUK 4< FEtK_g@"#$4qx|wS#ATKH{x-oY.jKXEoYOpR/1ZRˊU1uaGVOS'_(hhZ@ĉ_%#' 3ؑp"U<0(w~ Q}pZWwh+8GP m}_)o~4SWe wWWZ 7BBѶFG˻G nN ;oC$PsSj4^*Ĭӯ9!KD  .$0O!'9J<[ $WJⅆ95dwrBh|^Xpgx\2M^k l:{Mð,ܕ{xx_:ӷ{(A;rcnOvlNSVhv@]ܓẛnk*Y^nbmΎQ'][+ |$儰m Ep+ZYش݋ھGE!Wbo5I׈qCX- a ZVI}*' ȏPXLf%ĵKըNm,wYY55JX ՁyW^7(~EdUht7,2";Գܔ5 e[&$G B* s,DBϜK5<`? M+Z2D|L%EMmz񚮊@3sVfuU 6"V Tѐ ZC q,ڒ 0d"*zF}GHMuӒOdًU_9p~Vc u` ~ }}DOs"ȶh5PD7kزeՈF( g{.Ut`)aeKU} [D;aUQ& O@Y B@;d ?TDUSAGE: %s [-V] sourcedir , --version Pri6nt format (ERSIONSetupCopyOEMI% 1.0 20050413 WDtteo߾>by Mcڇmpare_S_clB~svmd Yn gnppekM_Vpla"_auxpkKint+iz)~0 ; ucNULL noa`#[i eo.4@i@~c:/mu/samojwsysonMr|u.c0/?-LIBGCCW32-EH-SJLJ-GTHR[܍-NG#w;h dp-> == /of(:_HARED)(u:%u0^ W`' S/bwgccHf/iI386/e--fGn,,AmNeA (a hws)) !a@5m "Hkl> ( 'Kh䀃42P2 4.;`; v@iP(<;fK^T` p N10__cxxabiv117nhl{_ty_E܅-&?2 KeB?a1vm@NSt8&Z,&e7k3ex\ذm)n ma7lk4ofw%@5t6VrguBG;g8fct 9#o`g[6c9~2 ??6MP`@'@A \.pI CA?@0@iu@JDBu s?-^aΫ>umR@YXm\,M X |$M3 ,]e38LD\w`RPSe3 \I\lhv t< wυ\6P>p>MBnMQ fȧC>Jwp5PF(p*AP`Ȕ|hE'l%B4M-0@LX4Ml|f4MC$i?@ABCDEFG PPWIZARD version 06.278 ' : FREE too\ UNIX by Dennis Bareis (dbareis@gmai////////K'̟XFXFXUw|S/2, DOS and UNIX by Dennis Bareis (dbareis@gmai@HBj=AErE:@HD3?(AA+H#"; C1A5G>;+AB "" then ErrText = ErrText & " => " & err.Description end if end if VbsCaLogInc -1 CaDebug 2, "USER_Install() - User Code FINISHED, RC = " & USER_Install & ErrText CaDebugPause("Install() - END" & ErrText) err.clear() end function sub InstallCCDSoft() dim registryEntry, exePosition, outDir registryEntry = VbsCaPropertyGet("CCDSOFT_INSTALLED", "", "") if len(registryEntry)>0 then registryEntry = Replace (registryEntry, """", "") exePosition = InstrRev (registryEntry, "CCDSoft.exe", -1, 1) outDir = mid (registryEntry, 1, exePosition-1) & "Camera Plug Ins\" session.property ("CCDSOFT_INSTALLDIR") = outDir end if end sub function VbsScriptTestingStub() CaDebug 0, "VbsScriptTestingStub() - Starting" VbsScriptTestingStub = 0 if IsCustomAction then CaDebug 0, "VbsScriptTestingStub() - Real Custom Action!" else CaDebug 0, "VbsScriptTestingStub() - Testing mode!" if wscript.arguments.count = 0 then VbsScriptTestingStub = Install() else dim EntryPoint : EntryPoint = wscript.arguments(0) if left(EntryPoint, 1) = "!" then CmdLineTrapsHandledByVb = not CmdLineTrapsHandledByVb EntryPoint = mid(EntryPoint, 2) end if select case ucase(EntryPoint) case "INSTALL" VbsScriptTestingStub = Install() case else CaDebug 0, "Entry point """ & EntryPoint & "()"" unknown!" VbsScriptTestingStub = 999 end select end if end if CaDebug 0, "VbsScriptTestingStub() - Ending" end function function Install() CaDebug 0, "Install(): Stub STARTING" VbsCaLogInc 1 CaDebug 1, Line1Prefix & " - Install()" if IsCustomAction then on error resume next else if Cm'*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+ ' Generator : PPWIZARD version 06.278 ' : FREE tool for Windows, OS/2, DOS and UNIX by Dennis Bareis (dbareis@gmail.com) ' : http://dennisbareis.com/ppwizard.htm ' Time : Sunday, 25 Mar 2007 12:53:52pm ' Input File : C:\Yankee Robotics\MakeMSI\Trifid.MM ' Output File : C:\Yankee Robotics\MakeMSI\out\Trifid.MM\Log\CustomActions\VB\ChangeInstallLocationForCCDSoft.vbs '*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+ option explicit 'All variables must be defined on error resume next if Wscript.Arguments.Count = 1 then if Wscript.Arguments(0) = "!CheckSyntax!" then wscript.quit(21924) on error goto 0 '--- You can change this value to make testing from command line easier --- dim TestCustomActionData : TestCustomActionData = "" public LogInc : LogInc = 0 public LikelyReason : LikelyReason = "" dim DebugPauses : DebugPauses = ucase("N") dim LogFile : LogFile = "" dim LogFileInitialized : LogFileInitialized = -1 LogFile = "" public DebugMonitorErrNumber : DebugMonitorErrNumber = true public CmdLineTrapsHandledByVb : CmdLineTrapsHandledByVb = true public oCad : set oCad = Nothing public Line1Prefix Line1Prefix = "Custom Action ""ChangeInstallLocationForCCDSoft.vbs""" const ForReading = 1 const ForWriting = 2 const ForAppending = 8 const TemporaryFolder = 2 public LastUserMsg : LastUserMsg = "VBSCRIPT ""ChangeInstallLocationForCCDSoft.vbs"" just started..." public LastLogOnlyMsg : LastLogOnlyMsg = "" const ERROR_INSTALL_USEREXIT = 1602 const ERROR_INSTALL_FAILURE = 1603 public VbsCaRcError : VbsCaRcError = 1603 VbsCaLog "" VbsCaLog string(79, "#") dim IsCustomAction dim oMsiLog : set oMsiLog = Nothing dim oRecLine1 : set oRecLine1 = Nothing dim oRecLine2 : set oRecLine2 = Nothing const msiMessageTypeError = &H01000000 const msiMessageTypeWarning = &H02000000 const msiMessageTypeUser = &H03000000 const msiMessageTypeInfo = &H04000000 const msiMessageTypeFilesInUse = &H05000000 const msiMessageTypeActionStart = &H08000000 const msiMessageTypeActionData = &H09000000 const msiMessageTypeProgress = &H0A000000 const msiMessageStatusError = -1 const msiMessageStatusNONE = 0 const msiMessageStatusOK = 1 const msiMessageStatusCancel = 2 const msiMessageStatusAbort = 3 const msiMessageStatusRetry = 4 const msiMessageStatusIgnore = 5 const msiMessageStatusYes = 6 const msiMessageStatusNo = 7 const LogPrefix = " VBS-> " const ActionInfo = 1 const ProgressReport = 2 const ProgressAddition = 3 const msiRunModeScheduled = 16 on error resume next dim DetermineEnv : DetermineEnv = WScript.ScriptFullName if err.Number = 0 then IsCustomAction = false else IsCustomAction = true end if err.clear() dim CustomActionType if IsCustomAction then set oRecLine1 = Installer.CreateRecord(3) if err.number <> 0 then dim T : T = "Installer.CreateRecord() failed, Reason 0x" & hex(err.number) & " - " & err.description err.clear() CaDebug 0, "" CaDebug 0, T CaDebug 0, "" T = "Failed accessing ""Installer"" object, this should never fail and " T = T & "possibly indicates a problem with this machines's DCOM configuration." on error goto 0 VbsCaRaiseError "InitializingLogging()", T end if set oRecLine2 = Installer.CreateRecord(1) set oMsiLog = Installer.CreateRecord(1) CaDebug 1, Line1Prefix & " starting..." if Session.Property("INSTALLLEVEL") <> "" then CustomActionType = "IMMEDIATE (full access to properties etc)" else CustomActionType = "DEFERRED (very limited access to properties, information passes in ""CustomActionData"")" end if else CustomActionType = "NOT (testing as standalone vbscript)" if ucase(mid(wscript.FullName, len(wscript.Path) + 2, 1)) = "W" Then wscript.echo "You can't use WSCRIPT on this VB script, use CSCRIPT instead!" wscript.quit 999 end if end if dim CadLineTrapsHandledByVb then on error goto 0 else on error resume next end if end if Install = USER_Install() if err.number <> 0 then Install = UserFunctionTrapped() else CaDebug 0, "" CaDebug 2, "Finished! USER code did not trap." end if VbsCaLogInc -1 CaDebug 0, "Install(): Stub FINISHED, RC = " & Install end function function UserFunctionTrapped() dim ErrNumb, ErrDesc, ErrSrc, ErrNumbT ErrNumb = Err.Number ErrDesc = Err.Description ErrSrc = Err.Source ErrNumbT = "0x" & hex(ErrNumb) & " (" & ErrNumb & ")" on error resume next dim MsiReason : MsiReason = "" if not session.installer is nothing then set oLastErr = session.installer.LastErrorRecord if not oLastErr is nothing then MsiReason = oLastErr.FormatText() & vbCRLF end if end if dim Text if LastUserMsg = "VbsCaRaiseError()" then Text = ErrDesc & vbCrLf & vbCrLf Text = Text & "This problem was raised by """ & ErrSrc & """." if MsiReason <> "" then Text = Text & " Possibly for this Windows Installer reason: " & MsiReason end if else dim SavedLastUserMsg, SavedLastLogOnlyMsg SavedLastUserMsg = LastUserMsg SavedLastLogOnlyMsg = LastLogOnlyMsg err.clear() CaDebug 0, "" CaDebug 0, "" CaDebug 0, "DISPLAY TRAP" CaDebug 0, "~~~~~~~~~~~~" CaDebug 0, "SOURCE : " & ErrSrc CaDebug 0, "NUMBER : " & ErrNumbT CaDebug 0, "DESCRIPTION: " & ErrDesc CaDebug 0, "AFTER MSG U: " & CaOneLine(0, SavedLastUserMsg) CaDebug 0, "AFTER MSG L: " & CaOneLine(0, SavedLastLogOnlyMsg) if LikelyReason <> "" THEN CaDebug 0, "CAUSE? : " & LikelyReason end if Text = "Script failed - " & ErrNumbT if ErrDesc <> "" then Text = Text & vbCrLf & "Reason: " & ErrDesc Text = Text & vbCrLf & MsiReason if IsCustomAction then Text = Text & vbCrLf & vbCrLf & "The install has aborted!" & vbCrLf end if Text = Text & vbCrLf & "AfterU: " & CaOneLine(80, SavedLastUserMsg) Text = Text & vbCrLf & "AfterL: " & CaOneLine(80, SavedLastLogOnlyMsg) if ErrSrc <> "" then Text = Text & vbCrLf & "Source: " & ErrSrc if LikelyReason <> "" then Text = Text & vbCrLf & "Cause?: " & LikelyReason end if CaMsgBox "E", Text CaDebug 0, "" if IsCustomAction then CaDebug 2, "Forcing rollback..." end if UserFunctionTrapped = VbsCaRcError end function function CaGetEnv(EnvVar, DieIfMissing) on error goto 0 CaGetEnv = "" dim Try : Try = "%" & EnvVar & "%" dim oShell : set oShell = CaMkObject("WScript.Shell") on error resume next CaGetEnv = oShell.ExpandEnvironmentStrings(Try) set oShell = Nothing on error goto 0 if CaGetEnv = Try then CaGetEnv = "" if DieIfMissing then on error goto 0 VbsCaRaiseError "CaGetEnv()", "The environment variable """ & EnvVar & """ does not exist" end if end if end function function CaMkObject(ByVal AutomationClass) on error resume next set CaMkObject = CreateObject(AutomationClass) dim EC : EC = err.number Dim ET : ET = "0x" & hex(EC) & " - " & err.description on error goto 0 if EC <> 0 then VbsCaRaiseError "CaMkObject()", "Failed loading the automation class """ & AutomationClass & """." & vbCRLF & vbCRLF & "Reason " & ET end if end function sub VbsCaLikelyReason4Trap(Reason) LikelyReason = Reason end sub sub VbsCaProgressLine1(Doing) on error resume next oRecLine1.StringData(1) = LogPrefix oRecLine1.StringData(2) = Doing oRecLine1.StringData(3) = "[1]" session.message msiMessageTypeActionStart, oRecLine1 if Doing <> "" then LastUserMsg = Doing LastLogOnlyMsg = "" end if err.clear() end sub sub VbsCaProgressLine2(Doing) on error resume next oRecLine2.StringData(1) = Doing session.message msiMessageTypeActionData, oRecLine2 if Doing <> "" then LastUserMsg = Doing LastLogOnlyMsg = "" end if err.clear() end sub sub CaDebug(ByVal ForUI, ByVal What) dim RebuildNonZeroErrNumb : RebuildNonZeroErrNumb = false if DebugMonitorErrNumber and err.number <> 0 then dim ErrNumbDec : ErrNumbDec = err.number dim ErrNumb : ErrNumb = hex(ErrNumbDec) dim ErrSrc : ErrSrc = err.source dim ErrDesc : ErrDesc = err.description err.clear() dim SavedLastLogOnlyMsg : SavedLastLogOnlyMsg = LastLogOnlyMsg VbsCaLogInc 1 CaDebug_ 0, "####>>>> CaDebug(EntryCheck): Err.NUMBER: 0x" & ErrNumb & ", SOURCE: " & ErrSrc & ", DESC: " & ErrDesc VbsCaLogInc -1 RebuildNonZeroErrNumb = true LastLogOnlyMsg = SavedLastLogOnlyMsg end if CaDebug_ ForUI, What if RebuildNonZeroErrNumb then on error resume next SavedLastLogOnlyMsg = LastLogOnlyMsg VbsCaLogInc 1 CaDebug_ 0, "####>>>> CaDebug(EntryCheck): Rebuilding original error details..." VbsCaLogInc -1 LastLogOnlyMsg = SavedLastLogOnlyMsg err.raise ErrNumbDec, ErrSrc, ErrDesc end if end sub sub CaDebug_(ByVal ForUI, ByVal What) on error resume next wscript.echo What select case ForUI case 1 VbsCaProgressLine1 What case 2 VbsCaProgressLine2 What case else dim Text if What = "" then Text = "" else Text = LogPrefix & What LastLogOnlyMsg = What end if oMsiLog.StringData(0) = Text session.message msiMessageTypeInfo, oMsiLog end select VbsCaLog What erxr.clear() end sub function VbsCaRunSync(ByVal TheCmd, ByVal RunType, ByVal TheOutput) VbsCaLogInc 1 on error goto 0 dim oShell : set oShell = CaMkObject("WScript.Shell") dim oFS : set oFS = CaMkObject("Scripting.FileSystemObject") dim TmpFile : TmpFile = "" if TheOutput = "" then TheOutput = "?" end if if instr(TheOutput, "?") <> 0 then TmpFile = oFS.GetSpecialFolder(TemporaryFolder) & "\" & oFS.GetTempName() If IsDos() then TheCmd = """" & CaGetEnv("COMSPEC", true) & """ /c " & TheCmd & " > """ & TmpFile & """" else TheCmd = """" & CaGetEnv("COMSPEC", true) & """ /c """ & TheCmd & " > """ & TmpFile & """ 2>&1""" end if end if CaDebug 0, "EXECUTING: " & TheCmd on error resume next dim CmdRc : CmdRc = oShell.run(TheCmd, RunType, true) dim ErrNumber : ErrNumber = err.number dim ErrDesc : ErrDesc = err.description on error goto 0 if TheOutput <> "!" then dim FileList : FileList = split(TheOutput, ";") dim FileIndex, FileName, FileTitle for FileIndex = lbound(FileList) to ubound(FileList) FileName = trim(FileList(FileIndex)) FileTitle = FileName if FileName = "?" then FileName = TmpFile FileTitle = "REDIRECTED OUTPUT: " & FileName end if if FileName <> "" then VbsDebugDumpFile FileName, FileTitle end if next if TmpFile <> "" then if oFS.FileExists(TmpFile) then oFS.DeleteFile TmpFile end if end if end if if ErrNumber <> 0 then VbsCaRunSync = -999 VbsCaRaiseError "VbsCaRunSync()", "Failed Executing an external command!" & vbCRLF & "Reason 0x" & hex(ErrNumber) & " - " & ErrDesc & vbCRLF & vbCRLF & "The command was """ & TheCmd & """" end if CaDebug 0, "EXE Rc = " & CmdRc CaDebug 0, "" set oShell = Nothing set oFS = Nothing VbsCaRunSync = CmdRc VbsCaLogInc -1 end function sub VbsDebugDumpFile(ByVal FileName, Title) VbsCaLogInc 1 if Title <> "" then CaDebug 0, Title CaDebug 0, string(len(Title), "~") end if on error resume next dim oFS : set oFS = CaMkObject("Scripting.FileSystemObject") if not oFS.FileExists(FileName) then CaDebug 0, "*+* File does not exist *+*" & vbCRLF else dim Stream : set Stream = oFS.OpenTextFile(FileName, ForReading) if Stream.AtEndOfStream then CaDebug 0, "+*+ NO OUTPUT +*+" & vbCRLF else CaDebug 0, Stream.ReadAll() end if Stream.close() end if VbsCaLogInc -1 set oFS = Nothing end sub function CaOneLine(ByVal How, ByVal MultiLine) CaOneLine = replace(MultiLine, vbCR, "") if How = -1 then dim Pos : Pos = instr(CaOneLine, vbLF) if Pos <> 0 then CaOneLine = left(CaOneLine, Pos) & "..." end if else if How <> 0 then if len(CaOneLine) > How then CaOneLine = left(CaOneLine, How) & "..." end if end if end if CaOneLine = replace(CaOneLine, vbLF, "{{NL}}") end function sub VbsCaLogInc(ByVal IncAmount) LogInc = LogInc + IncAmount if LogInc < 0 then LogInc = 0 end sub sub InitializeLogFile() LogFileInitialized = 0 on error resume next dim oFs : set oFs = CreateObject("Scripting.FileSystemObject") dim oFile dim ParentDir : ParentDir = oFS.GetParentFolderName(LogFile) if not oFS.FolderExists(ParentDir) then CaCreateFolder ParentDir 'CaDebug 0, "LOGINIT: Created the log's folder """ & ParentDir & """ - " & err.description end if if oFS.FileExists(LogFile) then dim MaxDays : MaxDays = 100 set oFile = oFS.GetFile(LogFile) dim FileDays : FileDays = DateDiff("d", oFile.DateLastModified, Date()) 'CaDebug 0, "LOGINIT: Old file dated: " & oFile.DateLastModified set oFile = Nothing if FileDays > MaxDays then oFS.FileDelete LogFile 'CaDebug 0, "LOGINIT: Deleted old file as it is older than " & MaxDays & " days - " & err.description end if end if if oFS.FileExists(LogFile) then dim MaxBytes : MaxBytes = 300 * 1024 set oFile = oFS.GetFile(LogFile) dim FileSize : FileSize = oFile.size 'CaDebug 0, "LOGINIT: File is " & FileSize & " bytes long." set oFile = Nothing if FileSize > MaxBytes then dim ShortenToBytes : ShortenToBytes = (MaxBytes \ 100) * 75 dim ShortenByBytes : ShortenByBytes = FileSize - ShortenToBytes 'CaDebug 0, "LOGINIT: File is being shortened to about " & ShortenToBytes & " bytes." dim Stream, Contents set Stream = oFS.OpenTextFile(LogFile, ForReading) Contents = Stream.read(ShortenByBytes) Contents = Stream.readLine() Contents = Stream.readall() Stream.Close() set Stream = Nothing set Stream = oFS.CreateTextFile(LogFile, true) Stream.writeline string(78, "*") Stream.writeline "*** Time : " & Date() & ", " & time() Stream.writeline "*** Log Size : " & (FileSize \ 1024) & "K (" & FileSize & " bytes)" Stream.writeline "*** Max Log Size: 300K (Shortens to " & (75 * 300) \ 100 & "K)" Stream.writeline "*** Action : File shortened by " & ShortenByBytes & " bytes" Stream.writeline string(78, "*") Stream.writeline "" Stream.write Contents Stream.Close() set Stream = Nothing end if end if LogFileInitialized = 1 set oFS = Nothing end sub sub VbsCaLog(ByVal What) on error resume next if LogFile = "" then exit sub end if if LogFileInitialized = -1 then InitializeLogFile() else if LogFileInitialized <> 1 then exit sub end if end if dim oFs : set oFs = CreateObject("Scripting.FileSystemObject") dim Stream : set Stream = oFs.OpenTextFile(LogFile, ForAppending, True) if What = "" then Stream.writeLine "" else dim Tp, TpContinued, TpTimeLength Tp = FormatDateTime(now(), vbShortDate) Tp = Tp & ", " & FormatDateTime(now(), vbLongTime) TpTimeLength = len(Tp) Tp = Tp & ": " TpContinued = string(TpTimeLength, " ") & ": " dim TpIndent : TpIndent = string(LogInc*4, " ") Tp = Tp & TpIndent TpContinued = TpContinued & TpIndent What = replace(replace(What, vbCR, ""), vbLF, vbCRLF & TpContinued) Stream.writeLine Tp & What end if Stream.close() set oFs = Nothing set Stream = Nothing err.clear() end sub sub VbsCaRaiseError(ByVal ErrorSource, ByVal ErrorReason) dim ErrNumb, ErrDesc ErrNumb = "0x" & hex(err.number) & " (" & err.number & ")" ErrDesc = err.description if ErrDesc = "" then ErrDesc = "unknown" CaDebug 0, "" CaDebug 0, "" CaDebug 0, "VbsCaRaiseError()" CaDebug 0, "~~~~~~~~~~~~~~~~~" CaDebug 0, "SOURCE : " & ErrorSource CaDebug 0, "REASON : " & ErrorReason CaDebug 0, "err.number : " & ErrNumb CaDebug 0, "err.desc : " & ErrDesc LastUserMsg = "VbsCaRaiseError()" LastLogOnlyMsg = "VbsCaRaiseError()" Err.clear() Err.Description = ErrorReason Err.Source = ErrorSource Err.raise(vbObjectError+219) end sub sub CaDebugPause(ByVal Text) on error resume next if DebugPauses = "N" then exit sub end if dim X : X = "" X = X & vbCRLF X = X & vbCRLF X = X & "Custom Action : " & CaBinaryName X = X & vbCRLF X = X & "Defined At : " & CaDefinedAt X = X & vbCRLF X = X & "Running Mode : " & CaMode X = X & vbCRLF X = X & "Product Name : " & ProductName X = X & vbCRLF X = X & "Product Version: " & ProductVersion X = X & vbCRLF X = X & "Product MSI : " & ProductMsi X = X & vbCRLF X = X & "Extra Log : " & LogFile dim T T = "DEBUG PAUSE (VBSCRIPT)" & vbCRLF T = T & "~~~~~~~~~~~~~~~~~~~~~~" & vbCRLF CaMsgBox "I", T & Text & X end sub function CaMsgBox(ByVal BoxType, ByVal Text) on error goto 0 dim BoxT BoxT = "MSG BOX - " & BoxType & vbCRLF BoxT = BoxT & "~~~~~~~~~~~~" & VbCRLF BoxT = BoxT & Text & vbCRLF BoxT = BoxT & "^^^^^ End of Message Box ^^^^^" CaDebug 0, "" CaDebug 0, BoxT CaDebug 0, "" dim Buttons, CaMsgType if BoxType = "" then BoxType = "I" select case ucase(BoxType) case "I" Buttons = VbInformation CaMsgType = msiMessageTypeUser case "E" Buttons = VbCritical CaMsgType = msiMessageTypeError case else on error resume next CaMsgType = cint(BoxType) if err.number = 0 then CaMsgType = msiMessageTypeUser or CaMsgType else Buttons = VbInformation CaMsgType = msiMessageTypeWarning Text = Text & VbCrLf & vbCRLF & "Note: BoxType of """ & BoxType & """ is invalid!" end if on error goto 0 end select if not IsCustomAction then CaMsgBox = MsgBox(Text, Buttons, "TrifidCamera-1.016.0004.0021.msi (CA ChangeInstallLocationForCCDSoft.vbs)") else dim MsgTemplate if Buttons = VbInformation then MsgTemplate = "[1]" else MsgTemplate = "ERROR: [1]" end if dim oRecMsgBox : set oRecMsgBox = Installer.CreateRecord(1) oRecMsgBox.StringData(0) = MsgTemplate oRecMsgBox.StringData(1) = Text CaMsgBox = session.message(CaMsgType, oRecMsgBox) end if end function function VbsCaPropertyGet(ByVal PropertyName, ByVal DefaultValue, ByVal PromptExtra) on error goto 0 CaDebug 0, "" CaDebug 0, "VbsCaPropertyGet(""" & PropertyName & """)" if IsCustomAction then VbsCaPropertyGet = session.property(PropertyName) else dim Prompt, Title Title = "GET VALUE - """ & PropertyName & """" Prompt = "Please enter a value for the property """ & PropertyName & """." & VbCRLF & VbCRLF Prompt = Prompt & "This would normally be passed by the Custom Action and so is unavailable while testing!" if PromptExtra <> "" then Prompt = Prompt & vbCRLF & vbCRLF & PromptExtra end if VbsCaPropertyGet = InputBox(Prompt, Title, DefaultValue) end if CaDebug 0, PropertyName & " => """ & VbsCaPropertyGet & """" CaDebug 0, "" end function function VbsCaCadGet(ByVal Name) on error goto 0 CaDebug 0, "VbsCaCadGet(" & Name & ")" VbsCaLogInc 1 dim QueryExists if left(Name,2) <> "?:" then QueryExists = false else QueryExists = true VbsCaCadGet = "N" Name = mid(Name, 3) CaDebug 0, "This is a query to see if the item exists..." end if if oCad is Nothing then set oCad = CaMkObject("Scripting.Dictionary") if TestCustomActionData = "" then TestCustomActionData = "1," & Name & "=" end if dim Cad : Cad = VbsCaPropertyGet("CustomActionData", TestCustomActionData, "Example: ""1,Name1=Value1,Name2=Value2""") if Cad <> "" then dim Lng, Delimiter Lng = left(Cad, 1) if not IsNumeric(Lng) then VbsCaRaiseError "VbsCaCadGet()", "Incorrectly formatted CustomActionData, first byte is not numeric!" end if Delimiter = mid(Cad, 2, Lng) Cad = mid(Cad, 1+Lng+1) CaDebug 0, "Splitting: " & Cad dim CadArray : CadArray = split(Cad, Delimiter) dim Index, Bits if ubound(CadArray) = -1 then CaDebug 0, " - No parameters passed" else for Index = 0 to ubound(CadArray) Bits = split(CadArray(Index), "=", 2) if ubound(Bits) <> 1 then VbsCaRaiseError "VbsCaCadGet()", "Incorrectly formatted CustomActionData #" & Index+1 & ": " & CadArray(Index) end if CaDebug 0, " - #" & Index+1 & ", " & Bits(0) & " = " & Bits(1) oCad.add Bits(0), Bits(1) next end if CaDebug 0, "" end if end if if Name = "" then exit function end if if Name = "?" then set VbsCaCadGet = oCad exit function end if if QueryExists then if oCad.exists(Name) then VbsCaCadGet = "Y" else VbsCaCadGet = "N" end if CaDebug 0, "Query Result is """ & VbsCaCadGet & """" else if oCad.exists(Name) then VbsCaCadGet = oCad(Name) CaDebug 0, """" & Name & """ contained """ & VbsCaCadGet & """" else VbsCaRaiseError "VbsCaCadGet()", "The value """ & Name & """ was not passed in the CustomActionData!" end if end if VbsCaLogInc -1 end function function VbsCaCadReplace(ByVal Before, ByVal SymCodeS, ByVal SymCodeE) dim Pos, LeftBit, CadVar, Value LeftBit = "" Pos = instr(Before, SymCodeS) do while Pos <> 0 LeftBit = LeftBit & left(Before, Pos-1) Before = mid(Before, Pos+len(SymCodeS)) Pos = instr(Before, SymCodeE) if Pos = 0 then LeftBit = LeftBit & "SymCodeS" else CadVar = left(Before, Pos-1) Before = mid(Before, Pos+len(SymCodeE)) Value = VbsCaCadGet(CadVar) LeftBit = LeftBit & Value end if Pos = instr(Before, SymCodeS) loop VbsCaCadReplace = LeftBit & Before end function sub CaCreateFolder(byVal DirName) if DirName = "" then exit sub dim oFS : set oFS = CaMkObject("Scripting.FileSystemObject") dim ParentDir : ParentDir = oFS.GetParentFolderName(DirName) if not oFS.FolderExists(ParentDir) then CaCreateFolder ParentDir end if if not oFS.FolderExists(DirName) then VbsCaLogInc 1 CaDebug 0, "Creating Folder """ & DirName & """" VbsCaLogInc -1 on error resume next oFS.CreateFolder DirName dim EC : EC = err.number Dim ET : ET = "0x" & hex(EC) & " - " & err.description on error goto 0 if EC <> 0 then VbsCaRaiseError "CaCreateFolder()", "Failed creating folder """ & DirName & """." & vbCRLF & vbCRLF & "Reason " & ET end if end if set oFs = Nothing end sub function IsDos() on error goto 0 if instr(ucase(CaGetEnv("COMSPEC", true)), "COMMAND.COM") <> 0 then IsDos = True else IsDos = False end if end function '!!! Obsolete functions stubs !!! sub VbsCaDebug(ForUI, What) CaDebug ForUI, What end sub function VbsCaMsgBox(BoxType, Text) VbsCaMsgBox = CaMsgBox(BoxType, Text) end function function VbsCaGetEnv(EnvVar, DieIfMissing) VbsCaGetEnv = CaGetEnv(EnvVar, DieIfMissing) end function sub CaDeleteFile(ByVal FileName) VbsCaLogInc 1 CaDebug 0, "Deleting """ & FileName & """ (if it exists)" VbsCaLogInc 1 if not oFS.FileExists(FileName) then CaDebug 0, "It doesn't exist" else CaDebug 0, "It exists, removing it" on error resume next oFS.DeleteFile(FileName) dim EC : EC = err.number Dim ET : ET = "0x" & hex(EC) & " - " & err.description on error goto 0 if EC <> 0 then VbsCaRaiseError "CaDeleteFile()", "The file """ & FileName & """ exists but couldn't be deleted!" & vbCRLF & vbCRLF & "Reason " & ET end if end if VbsCaLogInc -2 end sub function VbsCaCadGetValidate(ByVal Name, ByVal ValidateType) CaDebug 0, "" CaDebug 0, "VbsCaCadGetValidate(""" & Name & """)" VbsCaLogInc 1 dim Val : Val = VbsCaCadGet(Name) dim Pos, ValType, ValParms Pos = instr(ValidateType, ":") if Pos = 0 then ValType = trim(ValidateType) ValParms = "" else ValType = trim( left(ValidateType, Pos-1) ) ValParms = trim( mid(ValidateType, Pos+1) ) end if CaDebug 0, "" CaDebug 0, "Val Type: " & ValType CaDebug 0, "Val Parm: " & ValParms dim oFS : set oFS = CaMkObject("Scripting.FileSystemObject") dim FailMsg : FailMsg = "" select case ucase(ValType) case "FILE" Val = replace(Val, "\\", "\") if oFS.FileExists(Val) then CaDebug 0, "The file """ & Val & """ exists!" else FailMsg = "The file """ & Val & """ doesn't exist!" end if case "DIR" Val = replace(Val, "\\", "\") if oFS.FolderExists(Val) then CaDebug 0, "The directory """ & Val & """ exists!" else FailMsg = "The directory """ & Val & """ doesn't exist!" end if case else FailMsg = "The validation type of """ & ValType & """ is unknown." end select set oFs = Nothing VbsCaCadGetValidate = Val if ValParms <> "" then if FailMsg <> "" then FailMsg = FailMsg & vbCRLF & vbCRLF FailMsg = FailMsg & "We didn't expect parameters on the validation type of """ & ValType & """." & vbCRLF & "The parameters were: " & ValParms end if if FailMsg <> "" then VbsCaRaiseError "VbsCaCadGetValidate()", FailMsg else CaDebug 0, "The value passed validation." end if VbsCaLogInc -1 end function ctVersion, ProductMsi CaBinaryName = "LookForCCDSoft.vbs" CaDefinedAt = "Trifid.MM(357)" ProductName = "TrifidCamera" ProductVersion = "1.016.0004.0021" ProductMsi = "TrifidCamera-1.016.0004.0021.msi" if IsCustomAction then CaMode = "Custom Action" else CaMode = "Standard VBSCRIPT" end if err.clear() CaDebug 0, "" CaDebug 0, "" CaDebug 0, "Custom Action : " & CaBinaryName CaDebug 0, "CA Type : " & CustomActionType CaDebug 0, "Defined At : " & CaDefinedAt CaDebug 0, "Running Mode : " & CaMode CaDebug 0, "Product Name : " & ProductName CaDebug 0, "Product Version: " & ProductVersion CaDebug 0, "Product MSI : " & ProductMsi CaDebug 0, "Extra Log : " & LogFile CaDebug 0, "User's ID : " & CaGetEnv("USERNAME", false) CaDebug 0, "User's Domain : " & CaGetEnv("USERDOMAIN", false) CaDebug 0, "" on error goto 0 VbsScriptTestingStub() '===================== function USER_LookForCCDSoft() 'Entry Point "LookForCCDSoft()" '===================== on error goto 0 CaDebug 2, "USER_LookForCCDSoft() - User function starting..." CaDebugPause("LookForCCDSoft() - START") VbsCaLogInc 1 USER_LookForCCDSoft = 0 LookCCDSoftFunc() dim ErrText if err.number = 0 then ErrText = ", err.number was 0" else ErrText = ", ErrorNumber = 0x" & hex(err.number) & " (" & err.number & ")" if err.Description <> "" then ErrText = ErrText & " => " & err.Description end if end if VbsCaLogInc -1 CaDebug 2, "USER_LookForCCDSoft() - User Code FINISHED, RC = " & USER_LookForCCDSoft & ErrText CaDebugPause("LookForCCDSoft() - END" & ErrText) err.clear() end function sub LookCCDSoftFunc() dim registryEntry registryEntry = VbsCaPropertyGet("CCDSOFT_INSTALLED", "", "") if len(registryEntry)=0 then dim installDir installDir = Session.Property("INSTALLDIR1") CaMsgBox "I", "CCDSoft was not found in the registry." & Chr(13) & "If you want to use a Trifid Camera with CCDSoft, please copy" & Chr(13) & installDir & "\SDK\CCDSoft Version 5\TrifidCCDSoft.dll and " & Chr(13) & installDir & "\SDK\CCDSoft Version 5\TrifidNuggetCCDSoft.dll" & Chr(13) & "to CCDSoft's 'Camera Plug Ins' directory." end if end sub function VbsScriptTestingStub() CaDebug 0, "VbsScriptTestingStub() - Starting" VbsScriptTestingStub = 0 if IsCustomAction then CaDebug 0, "VbsScriptTestingStub() - Real Custom Action!" else CaDebug 0, "VbsScriptTestingStub() - Testing mode!" if wscript.arguments.count = 0 then VbsScriptTestingStub = LookForCCDSoft() else dim EntryPoint : EntryPoint = wscript.arguments(0) if left(EntryPoint, 1) = "!" then CmdLineTrapsHandledByVb = not CmdLineTrapsHandledByVb EntryPoint = mid(EntryPoint, 2) end if select case ucase(EntryPoint) case "LOOKFORCCDSOFT" VbsScriptTestingStub = LookForCCDSoft() case else CaDebug 0, "Entry point """ & EntryPoint & "()"" unknown!" VbsScriptTestingStub = 999 end select end if end if CaDebug 0, "VbsScriptTestingStub() - Ending" end function function LookForCCDSo'*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+ ' Generator : PPWIZARD version 06.278 ' : FREE tool for Windows, OS/2, DOS and UNIX by Dennis Bareis (dbareis@gmail.com) ' : http://dennisbareis.com/ppwizard.htm ' Time : Sunday, 25 Mar 2007 12:53:52pm ' Input File : C:\Yankee Robotics\MakeMSI\Trifid.MM ' Output File : C:\Yankee Robotics\MakeMSI\out\Trifid.MM\Log\CustomActions\VB\LookForCCDSoft.vbs '*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+ option explicit 'All variables must be defined on error resume next if Wscript.Arguments.Count = 1 then if Wscript.Arguments(0) = "!CheckSyntax!" then wscript.quit(21924) on error goto 0 '--- You can change this value to make testing from command line easier --- dim TestCustomActionData : TestCustomActionData = "" public LogInc : LogInc = 0 public LikelyReason : LikelyReason = "" dim DebugPauses : DebugPauses = ucase("N") dim LogFile : LogFile = "" dim LogFileInitialized : LogFileInitialized = -1 LogFile = "" public DebugMonitorErrNumber : DebugMonitorErrNumber = true public CmdLineTrapsHandledByVb : CmdLineTrapsHandledByVb = true public oCad : set oCad = Nothing public Line1Prefix Line1Prefix = "Custom Action ""LookForCCDSoft.vbs""" const ForReading = 1 const ForWriting = 2 const ForAppending = 8 const TemporaryFolder = 2 public LastUserMsg : LastUserMsg = "VBSCRIPT ""LookForCCDSoft.vbs"" just started..." public LastLogOnlyMsg : LastLogOnlyMsg = "" const ERROR_INSTALL_USEREXIT = 1602 const ERROR_INSTALL_FAILURE = 1603 public VbsCaRcError : VbsCaRcError = 1603 VbsCaLog "" VbsCaLog string(79, "#") dim IsCustomAction dim oMsiLog : set oMsiLog = Nothing dim oRecLine1 : set oRecLine1 = Nothing dim oRecLine2 : set oRecLine2 = Nothing const msiMessageTypeError = &H01000000 const msiMessageTypeWarning = &H02000000 const msiMessageTypeUser = &H03000000 const msiMessageTypeInfo = &H04000000 const msiMessageTypeFilesInUse = &H05000000 const msiMessageTypeActionStart = &H08000000 const msiMessageTypeActionData = &H09000000 const msiMessageTypeProgress = &H0A000000 const msiMessageStatusError = -1 const msiMessageStatusNONE = 0 const msiMessageStatusOK = 1 const msiMessageStatusCancel = 2 const msiMessageStatusAbort = 3 const msiMessageStatusRetry = 4 const msiMessageStatusIgnore = 5 const msiMessageStatusYes = 6 const msiMessageStatusNo = 7 const LogPrefix = " VBS-> " const ActionInfo = 1 const ProgressReport = 2 const ProgressAddition = 3 const msiRunModeScheduled = 16 on error resume next dim DetermineEnv : DetermineEnv = WScript.ScriptFullName if err.Number = 0 then IsCustomAction = false else IsCustomAction = true end if err.clear() dim CustomActionType if IsCustomAction then set oRecLine1 = Installer.CreateRecord(3) if err.number <> 0 then dim T : T = "Installer.CreateRecord() failed, Reason 0x" & hex(err.number) & " - " & err.description err.clear() CaDebug 0, "" CaDebug 0, T CaDebug 0, "" T = "Failed accessing ""Installer"" object, this should never fail and " T = T & "possibly indicates a problem with this machines's DCOM configuration." on error goto 0 VbsCaRaiseError "InitializingLogging()", T end if set oRecLine2 = Installer.CreateRecord(1) set oMsiLog = Installer.CreateRecord(1) CaDebug 1, Line1Prefix & " starting..." if Session.Property("INSTALLLEVEL") <> "" then CustomActionType = "IMMEDIATE (full access to properties etc)" else CustomActionType = "DEFERRED (very limited access to properties, information passes in ""CustomActionData"")" end if else CustomActionType = "NOT (testing as standalone vbscript)" if ucase(mid(wscript.FullName, len(wscript.Path) + 2, 1)) = "W" Then wscript.echo "You can't use WSCRIPT on this VB script, use CSCRIPT instead!" wscript.quit 999 end if end if dim CaBinaryName, CaDefinedAt, CaMode, ProductName, Produft() CaDebug 0, "LookForCCDSoft(): Stub STARTING" VbsCaLogInc 1 CaDebug 1, Line1Prefix & " - LookForCCDSoft()" if IsCustomAction then on error resume next else if CmdLineTrapsHandledByVb then on error goto 0 else on error resume next end if end if LookForCCDSoft = USER_LookForCCDSoft() if err.number <> 0 then LookForCCDSoft = UserFunctionTrapped() else CaDebug 0, "" CaDebug 2, "Finished! USER code did not trap." end if VbsCaLogInc -1 CaDebug 0, "LookForCCDSoft(): Stub FINISHED, RC = " & LookForCCDSoft end function function UserFunctionTrapped() dim ErrNumb, ErrDesc, ErrSrc, ErrNumbT ErrNumb = Err.Number ErrDesc = Err.Description ErrSrc = Err.Source ErrNumbT = "0x" & hex(ErrNumb) & " (" & ErrNumb & ")" on error resume next dim MsiReason : MsiReason = "" if not session.installer is nothing then set oLastErr = session.installer.LastErrorRecord if not oLastErr is nothing then MsiReason = oLastErr.FormatText() & vbCRLF end if end if dim Text if LastUserMsg = "VbsCaRaiseError()" then Text = ErrDesc & vbCrLf & vbCrLf Text = Text & "This problem was raised by """ & ErrSrc & """." if MsiReason <> "" then Text = Text & " Possibly for this Windows Installer reason: " & MsiReason end if else dim SavedLastUserMsg, SavedLastLogOnlyMsg SavedLastUserMsg = LastUserMsg SavedLastLogOnlyMsg = LastLogOnlyMsg err.clear() CaDebug 0, "" CaDebug 0, "" CaDebug 0, "DISPLAY TRAP" CaDebug 0, "~~~~~~~~~~~~" CaDebug 0, "SOURCE : " & ErrSrc CaDebug 0, "NUMBER : " & ErrNumbT CaDebug 0, "DESCRIPTION: " & ErrDesc CaDebug 0, "AFTER MSG U: " & CaOneLine(0, SavedLastUserMsg) CaDebug 0, "AFTER MSG L: " & CaOneLine(0, SavedLastLogOnlyMsg) if LikelyReason <> "" THEN CaDebug 0, "CAUSE? : " & LikelyReason end if Text = "Script failed - " & ErrNumbT if ErrDesc <> "" then Text = Text & vbCrLf & "Reason: " & ErrDesc Text = Text & vbCrLf & MsiReason if IsCustomAction then Text = Text & vbCrLf & vbCrLf & "The install has aborted!" & vbCrLf end if Text = Text & vbCrLf & "AfterU: " & CaOneLine(80, SavedLastUserMsg) Text = Text & vbCrLf & "AfterL: " & CaOneLine(80, SavedLastLogOnlyMsg) if ErrSrc <> "" then Text = Text & vbCrLf & "Source: " & ErrSrc if LikelyReason <> "" then Text = Text & vbCrLf & "Cause?: " & LikelyReason end if CaMsgBox "E", Text CaDebug 0, "" if IsCustomAction then CaDebug 2, "Forcing rollback..." end if UserFunctionTrapped = VbsCaRcError end function function CaGetEnv(EnvVar, DieIfMissing) on error goto 0 CaGetEnv = "" dim Try : Try = "%" & EnvVar & "%" dim oShell : set oShell = CaMkObject("WScript.Shell") on error resume next CaGetEnv = oShell.ExpandEnvironmentStrings(Try) set oShell = Nothing on error goto 0 if CaGetEnv = Try then CaGetEnv = "" if DieIfMissing then on error goto 0 VbsCaRaiseError "CaGetEnv()", "The environment variable """ & EnvVar & """ does not exist" end if end if end function function CaMkObject(ByVal AutomationClass) on error resume next set CaMkObject = CreateObject(AutomationClass) dim EC : EC = err.number Dim ET : ET = "0x" & hex(EC) & " - " & err.description on error goto 0 if EC <> 0 then VbsCaRaiseError "CaMkObject()", "Failed loading the automation class """ & AutomationClass & """." & vbCRLF & vbCRLF & "Reason " & ET end if end function sub VbsCaLikelyReason4Trap(Reason) LikelyReason = Reason end sub sub VbsCaProgressLine1(Doing) on error resume next oRecLine1.StringData(1) = LogPrefix oRecLine1.StringData(2) = Doing oRecLine1.StringData(3) = "[1]" session.message msiMessageTypeActionStart, oRecLine1 if Doing <> "" then LastUserMsg = Doing LastLogOnlyMsg = "" end if err.clear() end sub sub VbsCaProgressLine2(Doing) on error resume next oRecLine2.StringData(1) = Doing session.message msiMessageTypeActionData, oRecLine2 if Doing <> "" then LastUserMsg = Doing LastLogOnlyMsg = "" end if err.clear() end sub sub CaDebug(ByVal ForUI, ByVal What) dim RebuildNonZeroErrNumb : RebuildNonZeroErrNumb = false if DebugMonitorErrNumber and err.number <> 0 then dim ErrNumbDec : ErrNumbDec = err.number dim ErrNumb : ErrNumb = hex(ErrNumbDec) dim ErrSrc : ErrSrc = err.source dim ErrDesc : ErrDesc = err.description err.clear() dim SavedLastLogOnlyMsg : SavedLastLogOnlyMsg = LastLogOnlyMsg VbsCaLogInc 1 CaDebug_ 0, "####>>>> CaDebug(EntryCheck): Err.NUMBER: 0x" & ErrNumb & ", SOURCE: " & ErrSrc & ", DESC: " & ErrDesc VbsCaLogInc -1 RebuildNonZeroErrNumb = true LastLogOnlyMsg = SavedLastLogOnlyMsg end if CaDebug_ ForUI, What if RebuildNonZeroErrNumb then on error resume next SavedLastLogOnlyMsg = LastLogOnlyMsg VbsCaLogInc 1 CaDebug_ 0, "####>>>> CaDebug(EntryCheck): Rebuilding original error details..." VbsCaLogInc -1 LastLogOnlyMsg = SavedLastLogOnlyMsg err.raise ErrNumbDec, ErrSrc, ErrDesc end if end sub sub CaDebug_(ByVal ForUI, ByVal What) on error resume next wscript.echo What select case ForUI case 1 VbsCaProgressLine1 What case 2 VbsCaProgressLine2 What case else dim Text if What = "" then Text = "" else Text = LogPrefix & What LastLogOnlyMsg = What end if oMsiLog.StringData(0) = Text session.message msiMessageTypeInfo, oMsiLog end select VbsCaLog What err.clear() end sub function VbsCaRunSync(ByVal TheCmd, ByVal RunType, ByVal TheOutput) VbsCaLogInc 1 on error goto 0 dim oShell : set oShell = CaMkObject("WScript.Shell") dim oFS : set oFS = CaMkObject("Scripting.FileSystemObject") dim TmpFile : TmpFile = "" if TheOutput = "" then TheOutput = "?" end if if instr(TheOutput, "?") <> 0 then TmpFile = oFS.GetSpecialFolder(TemporaryFolder) & "\" & oFS.GetTempName() If IsDos() then TheCmd = """" & CaGetEnv("COMSPEC", true) & """ /c " & TheCmd & " > """ & TmpFile & """" else TheCmd = """" & CaGetEnv("COMSPEC", true) & """ /c """ & TheCmd & " > """ & TmpFile & """ 2>&1""" end if end if CaDebug 0, "EXECUTING: " & TheCmd on error resume next dim CmdRc : CmdRc = oShell.run(TheCmd, RunType, true) dim ErrNumber : ErrNumber = err.number dim ErrDesc : ErrDesc = err.description on error goto 0 if TheOutput <> "!" then dim FileList : FileList = split(TheOutput, ";") dim FileIndex, FileName, FileTitle for FileIndex = lbound(FileList) to ubound(FileList) FileName = trim(FileList(FileIndex)) FileTitle = FileName if FileName = "?" then FileName = TmpFile FileTitle = "REDIRECTED OUTPUT: " & FileName end if if FileName <> "" then VbsDebugDumpFile FileName, FileTitle end if next if TmpFile <> "" then if oFS.FileExists(TmpFile) then oFS.DeleteFile TmpFile end if end if end if if ErrNumber <> 0 then VbsCaRunSync = -999 VbsCaRaiseError "VbsCaRunSync()", "Failed Executing an external command!" & vbCRLF & "Reason 0x" & hex(ErrNumber) & " - " & ErrDesc & vbCRLF & vbCRLF & "The command was """ & TheCmd & """" end if CaDebug 0, "EXE Rc = " & CmdRc CaDebug 0, "" set oShell = Nothing set oFS = Nothing VbsCaRunSync = CmdRc VbsCaLogInc -1 end function sub VbsDebugDumpFile(ByVal FileName, Title) VbsCaLogInc 1 if Title <> "" then CaDebug 0, Title CaDebug 0, string(len(Title), "~") end if on error resume next dim oFS : set oFS = CaMkObject("Scripting.FileSystemObject") if not oFS.FileExists(FileName) then CaDebug 0, "*+* File does not exist *+*" & vbCRLF else dim Stream : set Stream = oFS.OpenTextFile(FileName, ForReading) if Stream.AtEndOfStream then CaDebug 0, "+*+ NO OUTPUT +*+" & vbCRLF else CaDebug 0, Stream.ReadAll() end if Stream.close() end if VbsCaLogInc -1 set oFS = Nothing end sub function CaOneLine(ByVal How, ByVal MultiLine) CaOneLine = replace(MultiLine, vbCR, "") if How = -1 then dim Pos : Pos = instr(CaOneLine, vbLF) if Pos <> 0 then CaOneLine = left(CaOneLine, Pos) & "..." end if else if How <> 0 then if len(CaOneLine) > How then CaOneLine = left(CaOneLine, How) & "..." end if end if end if CaOneLine = replace(CaOneLine, vbLF, "{{NL}}") end function sub VbsCaLogInc(ByVal IncAmount) LogInc = LogInc + IncAmount if LogInc < 0 then LogInc = 0 end sub sub InitializeLogFile() LogFileInitialized = 0 on error resume next dim oFs : set oFs = CreateObject("Scripting.FileSystemObject") dim oFile dim ParentDir : ParentDir = oFS.GetParentFolderName(LogFile) if not oFS.FolderExists(ParentDir) then CaCreateFolder ParentDir 'CaDebug 0, "LOGINIT: Created the log's folder """ & ParentDir & """ - " & err.description end if if oFS.FileExists(LogFile) then dim MaxDays : MaxDays = 100 set oFile = oFS.GetFile(LogFile) dim FileDays : FileDays = DateDiff("d", oFile.DateLastModified, Date()) 'CaDebug 0, "LOGINIT: Old file dated: " & oFile.DateLastModified set oFile = Nothing if FileDays > MaxDays then oFS.FileDelete LogFile 'CaDebug 0, "LOGINIT: Deleted old file as it is older than " & MaxDays & " days - " & err.description end if end if if oFS.FileExists(LogFile) then dim MaxBytes : MaxBytes = 300 * 1024 set oFile = oFS.GetFile(LogFile) dim FileSize : FileSize = oFile.size 'CaDebug 0, "LOGINIT: File is " & FileSize & " bytes long." set oFile = Nothing if FileSize > MaxBytes then dim ShortenToBytes : ShortenToBytes = (MaxBytes \ 100) * 75 dim ShortenByBytes : ShortenByBytes = FileSize - ShortenToBytes 'CaDebug 0, "LOGINIT: File is being shortened to about " & ShortenToBytes & " bytes." dim Stream, Contents set Stream = oFS.OpenTextFile(LogFile, ForReading) Contents = Stream.read(ShortenByBytes) Contents = Stream.readLine() Contents = Stream.readall() Stream.Close() set Stream = Nothing set Stream = oFS.CreateTextFile(LogFile, true) Stream.writeline string(78, "*") Stream.writeline "*** Time : " & Date() & ", " & time() Stream.writeline "*** Log Size : " & (FileSize \ 1024) & "K (" & FileSize & " bytes)" Stream.writeline "*** Max Log Size: 300K (Shortens to " & (75 * 300) \ 100 & "K)" Stream.writeline "*** Action : File shortened by " & ShortenByBytes & " bytes" Stream.writeline string(78, "*") Stream.writeline "" Stream.write Contents Stream.Close() set Stream = Nothing end if end if LogFileInitialized = 1 set oFS = Nothing end sub sub VbsCaLog(ByVal What) on error resume next if LogFile = "" then exit sub end if if LogFileInitialized = -1 then InitializeLogFile() else if LogFileInitialized <> 1 then exit sub end if end if dim oFs : set oFs = CreateObject("Scripting.FileSystemObject") dim Stream : set Stream = oFs.OpenTextFile(LogFile, ForAppending, True) if What = "" then Stream.writeLine "" else dim Tp, TpContinued, TpTimeLength Tp = FormatDateTime(now(), vbShortDate) Tp = Tp & ", " & FormatDateTime(now(), vbLongTime) TpTimeLength = len(Tp) Tp = Tp & ": " TpContinued = string(TpTimeLength, " ") & ": " dim TpIndent : TpIndent = string(LogInc*4, " ") Tp = Tp & TpIndent TpContinued = TpContinued & TpIndent What = replace(replace(What, vbCR, ""), vbLF, vbCRLF & TpContinued) Stream.writeLine Tp & What end if Stream.close() set oFs = Nothing set Stream = Nothing err.clear() end sub sub VbsCaRaiseError(ByVal ErrorSource, ByVal ErrorReason) dim ErrNumb, ErrDesc ErrNumb = "0x" & hex(err.number) & " (" & err.number & ")" ErrDesc = err.description if ErrDesc = "" then ErrDesc = "unknown" CaDebug 0, "" CaDebug 0, "" CaDebug 0, "VbsCaRaiseError()" CaDebug 0, "~~~~~~~~~~~~~~~~~" CaDebug 0, "SOURCE : " & ErrorSource CaDebug 0, "REASON : " & ErrorReason CaDebug 0, "err.number : " & ErrNumb CaDebug 0, "err.desc : " & ErrDesc LastUserMsg = "VbsCaRaiseError()" LastLogOnlyMsg = "VbsCaRaiseError()" Err.clear() Err.Description = ErrorReason Err.Source = ErrorSource Err.raise(vbObjectError+219) end sub sub CaDebugPause(ByVal Text) on error resume next if DebugPauses = "N" then exit sub end if dim X : X = "" X = X & vbCRLF X = X & vbCRLF X = X & "Custom Action : " & CaBinaryName X = X & vbCRLF X = X & "Defined At : " & CaDefinedAt X = X & vbCRLF X = X & "Running Mode : " & CaMode X = X & vbCRLF X = X & "Product Name : " & ProductName X = X & vbCRLF X = X & "Product Version: " & ProductVersion X = X & vbCRLF X = X & "Product MSI : " & ProductMsi X = X & vbCRLF X = X & "Extra Log : " & LogFile dim T T = "DEBUG PAUSE (VBSCRIPT)" & vbCRLF T = T & "~~~~~~~~~~~~~~~~~~~~~~" & vbCRLF CaMsgBox "I", T & Text & X end sub function CaMsgBox(ByVal BoxType, ByVal Text) on error goto 0 dim BoxT BoxT = "MSG BOX - " & BoxType & vbCRLF BoxT = BoxT & "~~~~~~~~~~~~" & VbCRLF BoxT = BoxT & Text & vbCRLF BoxT = BoxT & "^^^^^ End of Message Box ^^^^^" CaDebug 0, "" CaDebug 0, BoxT CaDebug 0, "" dim Buttons, CaMsgType if BoxType = "" then BoxType = "I" select case ucase(BoxType) case "I" Buttons = VbInformation CaMsgType = msiMessageTypeUser case "E" Buttons = VbCritical CaMsgType = msiMessageTypeError case else on error resume next CaMsgType = cint(BoxType) if err.number = 0 then CaMsgType = msiMessageTypeUser or CaMsgType else Buttons = VbInformation CaMsgType = msiMessageTypeWarning Text = Text & VbCrLf & vbCRLF & "Note: BoxType of """ & BoxType & """ is invalid!" end if on error goto 0 end select if not IsCustomAction then CaMsgBox = MsgBox(Text, Buttons, "TrifidCamera-1.016.0004.0021.msi (CA LookForCCDSoft.vbs)") else dim MsgTemplate if Buttons = VbInformation then MsgTemplate = "[1]" else MsgTemplate = "ERROR: [1]" end if dim oRecMsgBox : set oRecMsgBox = Installer.CreateRecord(1) oRecMsgBox.StringData(0) = MsgTemplate oRecMsgBox.StringData(1) = Text CaMsgBox = session.message(CaMsgType, oRecMsgBox) end if end function function VbsCaPropertyGet(ByVal PropertyName, ByVal DefaultValue, ByVal PromptExtra) on error goto 0 CaDebug 0, "" CaDebug 0, "VbsCaPropertyGet(""" & PropertyName & """)" if IsCustomAction then VbsCaPropertyGet = session.property(PropertyName) else dim Prompt, Title Title = "GET VALUE - """ & PropertyName & """" Prompt = "Please enter a value for the property """ & PropertyName & """." & VbCRLF & VbCRLF Prompt = Prompt & "This would normally be passed by the Custom Action and so is unavailable while testing!" if PromptExtra <> "" then Prompt = Prompt & vbCRLF & vbCRLF & PromptExtra end if VbsCaPropertyGet = InputBox(Prompt, Title, DefaultValue) end if CaDebug 0, PropertyName & " => """ & VbsCaPropertyGet & """" CaDebug 0, "" end function function VbsCaCadGet(ByVal Name) on error goto 0 CaDebug 0, "VbsCaCadGet(" & Name & ")" VbsCaLogInc 1 dim QueryExists if left(Name,2) <> "?:" then QueryExists = false else QueryExists = true VbsCaCadGet = "N" Name = mid(Name, 3) CaDebug 0, "This is a query to see if the item exists..." end if if oCad is Nothing then set oCad = CaMkObject("Scripting.Dictionary") if TestCustomActionData = "" then TestCustomActionData = "1," & Name & "=" end if dim Cad : Cad = VbsCaPropertyGet("CustomActionData", TestCustomActionData, "Example: ""1,Name1=Value1,Name2=Value2""") if Cad <> "" then dim Lng, Delimiter Lng = left(Cad, 1) if not IsNumeric(Lng) then VbsCaRaiseError "VbsCaCadGet()", "Incorrectly formatted CustomActionData, first byte is not numeric!" end if Delimiter = mid(Cad, 2, Lng) Cad = mid(Cad, 1+Lng+1) CaDebug 0, "Splitting: " & Cad dim CadArray : CadArray = split(Cad, Delimiter) dim Index, Bits if ubound(CadArray) = -1 then CaDebug 0, " - No parameters passed" else for Index = 0 to ubound(CadArray) Bits = split(CadArray(Index), "=", 2) if ubound(Bits) <> 1 then VbsCaRaiseError "VbsCaCadGet()", "Incorrectly formatted CustomActionData #" & Index+1 & ": " & CadArray(Index) end if CaDebug 0, " - #" & Index+1 & ", " & Bits(0) & " = " & Bits(1) oCad.add Bits(0), Bits(1) next end if CaDebug 0, "" end if end if if Name = "" then exit function end if if Name = "?" then set VbsCaCadGet = oCad exit function end if if QueryExists then if oCad.exists(Name) then VbsCaCadGet = "Y" else VbsCaCadGet = "N" end if CaDebug 0, "Query Result is """ & VbsCaCadGet & """" else if oCad.exists(Name) then VbsCaCadGet = oCad(Name) CaDebug 0, """" & Name & """ contained """ & VbsCaCadGet & """" else VbsCaRaiseError "VbsCaCadGet()", "The value """ & Name & """ was not passed in the CustomActionData!" end if end if VbsCaLogInc -1 end function function VbsCaCadReplace(ByVal Before, ByVal SymCodeS, ByVal SymCodeE) dim Pos, LeftBit, CadVar, Value LeftBit = "" Pos = instr(Before, SymCodeS) do while Pos <> 0 LeftBit = LeftBit & left(Before, Pos-1) Before = mid(Before, Pos+len(SymCodeS)) Pos = instr(Before, SymCodeE) if Pos = 0 then LeftBit = LeftBit & "SymCodeS" else CadVar = left(Before, Pos-1) Before = mid(Before, Pos+len(SymCodeE)) Value = VbsCaCadGet(CadVar) LeftBit = LeftBit & Value end if Pos = instr(Before, SymCodeS) loop VbsCaCadReplace = LeftBit & Before end function sub CaCreateFolder(byVal DirName) if DirName = "" then exit sub dim oFS : set oFS = CaMkObject("Scripting.FileSystemObject") dim ParentDir : ParentDir = oFS.GetParentFolderName(DirName) if not oFS.FolderExists(ParentDir) then CaCreateFolder ParentDir end if if not oFS.FolderExists(DirName) then VbsCaLogInc 1 CaDebug 0, "Creating Folder """ & DirName & """" VbsCaLogInc -1 on error resume next oFS.CreateFolder DirName dim EC : EC = err.number Dim ET : ET = "0x" & hex(EC) & " - " & err.description on error goto 0 if EC <> 0 then VbsCaRaiseError "CaCreateFolder()", "Failed creating folder """ & DirName & """." & vbCRLF & vbCRLF & "Reason " & ET end if end if set oFs = Nothing end sub function IsDos() on error goto 0 if instr(ucase(CaGetEnv("COMSPEC", true)), "COMMAND.COM") <> 0 then IsDos = True else IsDos = False end if end function '!!! Obsolete functions stubs !!! sub VbsCaDebug(ForUI, What) CaDebug ForUI, What end sub function VbsCaMsgBox(BoxType, Text) VbsCaMsgBox = CaMsgBox(BoxType, Text) end function function VbsCaGetEnv(EnvVar, DieIfMissing) VbsCaGetEnv = CaGetEnv(EnvVar, DieIfMissing) end function sub CaDeleteFile(ByVal FileName) VbsCaLogInc 1 CaDebug 0, "Deleting """ & FileName & """ (if it exists)" VbsCaLogInc 1 if not oFS.FileExists(FileName) then CaDebug 0, "It doesn't exist" else CaDebug 0, "It exists, removing it" on error resume next oFS.DeleteFile(FileName) dim EC : EC = err.number Dim ET : ET = "0x" & hex(EC) & " - " & err.description on error goto 0 if EC <> 0 then VbsCaRaiseError "CaDeleteFile()", "The file """ & FileName & """ exists but couldn't be deleted!" & vbCRLF & vbCRLF & "Reason " & ET end if end if VbsCaLogInc -2 end sub function VbsCaCadGetValidate(ByVal Name, ByVal ValidateType) CaDebug 0, "" CaDebug 0, "VbsCaCadGetValidate(""" & Name & """)" VbsCaLogInc 1 dim Val : Val = VbsCaCadGet(Name) dim Pos, ValType, ValParms Pos = instr(ValidateType, ":") if Pos = 0 then ValType = trim(ValidateType) ValParms = "" else ValType = trim( left(ValidateType, Pos-1) ) ValParms = trim( mid(ValidateType, Pos+1) ) end if CaDebug 0, "" CaDebug 0, "Val Type: " & ValType CaDebug 0, "Val Parm: " & ValParms dim oFS : set oFS = CaMkObject("Scripting.FileSystemObject") dim FailMsg : FailMsg = "" select case ucase(ValType) case "FILE" Val = replace(Val, "\\", "\") if oFS.FileExists(Val) then CaDebug 0, "The file """ & Val & """ exists!" else FailMsg = "The file """ & Val & """ doesn't exist!" end if case "DIR" Val = replace(Val, "\\", "\") if oFS.FolderExists(Val) then CaDebug 0, "The directory """ & Val & """ exists!" else FailMsg = "The directory """ & Val & """ doesn't exist!" end if case else FailMsg = "The validation type of """ & ValType & """ is unknown." end select set oFs = Nothing VbsCaCadGetValidate = Val if ValParms <> "" then if FailMsg <> "" then FailMsg = FailMsg & vbCRLF & vbCRLF FailMsg = FailMsg & "We didn't expect parameters on the validation type of """ & ValType & """." & vbCRLF & "The parameters were: " & ValParms end if if FailMsg <> "" then VbsCaRaiseError "VbsCaCadGetValidate()", FailMsg else CaDebug 0, "The value passed validation." end if VbsCaLogInc -1 end function C1A5G>;+AB?2FA(;A:A.FG=C3HJ' C1A5G:dD1B5<5ABA:V>dfBinaryName, CaDefinedAt, CaMode, ProductName, ProductVersion, ProductMsi CaBinaryName = "ChangeInstallLocationForMaximDl.vbs" CaDefinedAt = "Trifid.MM(430)" ProductName = "TrifidCamera" ProductVersion = "1.016.0004.0021" ProductMsi = "TrifidCamera-1.016.0004.0021.msi" if IsCustomAction then CaMode = "Custom Action" else CaMode = "Standard VBSCRIPT" end if err.clear() CaDebug 0, "" CaDebug 0, "" CaDebug 0, "Custom Action : " & CaBinaryName CaDebug 0, "CA Type : " & CustomActionType CaDebug 0, "Defined At : " & CaDefinedAt CaDebug 0, "Running Mode : " & CaMode CaDebug 0, "Product Name : " & ProductName CaDebug 0, "Product Version: " & ProductVersion CaDebug 0, "Product MSI : " & ProductMsi CaDebug 0, "Extra Log : " & LogFile CaDebug 0, "User's ID : " & CaGetEnv("USERNAME", false) CaDebug 0, "User's Domain : " & CaGetEnv("USERDOMAIN", false) CaDebug 0, "" on error goto 0 VbsScriptTestingStub() '===================== function USER_Install() 'Entry Point "Install()" '===================== on error goto 0 CaDebug 2, "USER_Install() - User function starting..." CaDebugPause("Install() - START") VbsCaLogInc 1 USER_Install = 0 InstallMaximDl() dim ErrText if err.number = 0 then ErrText = ", err.number was 0" else ErrText = ", ErrorNumber = 0x" & hex(err.number) & " (" & err.number & ")" if err.Description <> "" then ErrText = ErrText & " => " & err.Description end if end if VbsCaLogInc -1 CaDebug 2, "USER_Install() - User Code FINISHED, RC = " & USER_Install & ErrText CaDebugPause("Install() - END" & ErrText) err.clear() end function sub InstallMaximDl() dim registryEntry, exePosition, outDir registryEntry = VbsCaPropertyGet("MAXIM_DL_INSTALLED", "", "") if len(registryEntry)>0 then registryEntry = Replace (registryEntry, """", "") exePosition = InstrRev (registryEntry, "MaxIm_DL.exe", -1, 1) outDir = mid (registryEntry, 1, exePosition-1) session.property ("MAXIMDL_INSTALLDIR") = outDir end if end sub function VbsScriptTestingStub() CaDebug 0, "VbsScriptTestingStub() - Starting" VbsScriptTestingStub = 0 if IsCustomAction then CaDebug 0, "VbsScriptTestingStub() - Real Custom Action!" else CaDebug 0, "VbsScriptTestingStub() - Testing mode!" if wscript.arguments.count = 0 then VbsScriptTestingStub = Install() else dim EntryPoint : EntryPoint = wscript.arguments(0) if left(EntryPoint, 1) = "!" then CmdLineTrapsHandledByVb = not CmdLineTrapsHandledByVb EntryPoint = mid(EntryPoint, 2) end if select case ucase(EntryPoint) case "INSTALL" VbsScriptTestingStub = Install() case else CaDebug 0, "Entry point """ & EntryPoint & "()"" unknown!" VbsScriptTestingStub = 999 end select end if end if CaDebug 0, "VbsScriptTestingStub() - Ending" end function function Install() CaDebug 0, "Install(): Stub STARTING" VbsCaLogInc 1 CaDebug 1, Line1Prefix & " - Install()" if IsCustomAction then on error resume next else if CmdLineTrapsHandledBy'*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+ ' Generator : PPWIZARD version 06.278 ' : FREE tool for Windows, OS/2, DOS and UNIX by Dennis Bareis (dbareis@gmail.com) ' : http://dennisbareis.com/ppwizard.htm ' Time : Sunday, 25 Mar 2007 12:53:52pm ' Input File : C:\Yankee Robotics\MakeMSI\Trifid.MM ' Output File : C:\Yankee Robotics\MakeMSI\out\Trifid.MM\Log\CustomActions\VB\ChangeInstallLocationForMaximDl.vbs '*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+ option explicit 'All variables must be defined on error resume next if Wscript.Arguments.Count = 1 then if Wscript.Arguments(0) = "!CheckSyntax!" then wscript.quit(21924) on error goto 0 '--- You can change this value to make testing from command line easier --- dim TestCustomActionData : TestCustomActionData = "" public LogInc : LogInc = 0 public LikelyReason : LikelyReason = "" dim DebugPauses : DebugPauses = ucase("N") dim LogFile : LogFile = "" dim LogFileInitialized : LogFileInitialized = -1 LogFile = "" public DebugMonitorErrNumber : DebugMonitorErrNumber = true public CmdLineTrapsHandledByVb : CmdLineTrapsHandledByVb = true public oCad : set oCad = Nothing public Line1Prefix Line1Prefix = "Custom Action ""ChangeInstallLocationForMaximDl.vbs""" const ForReading = 1 const ForWriting = 2 const ForAppending = 8 const TemporaryFolder = 2 public LastUserMsg : LastUserMsg = "VBSCRIPT ""ChangeInstallLocationForMaximDl.vbs"" just started..." public LastLogOnlyMsg : LastLogOnlyMsg = "" const ERROR_INSTALL_USEREXIT = 1602 const ERROR_INSTALL_FAILURE = 1603 public VbsCaRcError : VbsCaRcError = 1603 VbsCaLog "" VbsCaLog string(79, "#") dim IsCustomAction dim oMsiLog : set oMsiLog = Nothing dim oRecLine1 : set oRecLine1 = Nothing dim oRecLine2 : set oRecLine2 = Nothing const msiMessageTypeError = &H01000000 const msiMessageTypeWarning = &H02000000 const msiMessageTypeUser = &H03000000 const msiMessageTypeInfo = &H04000000 const msiMessageTypeFilesInUse = &H05000000 const msiMessageTypeActionStart = &H08000000 const msiMessageTypeActionData = &H09000000 const msiMessageTypeProgress = &H0A000000 const msiMessageStatusError = -1 const msiMessageStatusNONE = 0 const msiMessageStatusOK = 1 const msiMessageStatusCancel = 2 const msiMessageStatusAbort = 3 const msiMessageStatusRetry = 4 const msiMessageStatusIgnore = 5 const msiMessageStatusYes = 6 const msiMessageStatusNo = 7 const LogPrefix = " VBS-> " const ActionInfo = 1 const ProgressReport = 2 const ProgressAddition = 3 const msiRunModeScheduled = 16 on error resume next dim DetermineEnv : DetermineEnv = WScript.ScriptFullName if err.Number = 0 then IsCustomAction = false else IsCustomAction = true end if err.clear() dim CustomActionType if IsCustomAction then set oRecLine1 = Installer.CreateRecord(3) if err.number <> 0 then dim T : T = "Installer.CreateRecord() failed, Reason 0x" & hex(err.number) & " - " & err.description err.clear() CaDebug 0, "" CaDebug 0, T CaDebug 0, "" T = "Failed accessing ""Installer"" object, this should never fail and " T = T & "possibly indicates a problem with this machines's DCOM configuration." on error goto 0 VbsCaRaiseError "InitializingLogging()", T end if set oRecLine2 = Installer.CreateRecord(1) set oMsiLog = Installer.CreateRecord(1) CaDebug 1, Line1Prefix & " starting..." if Session.Property("INSTALLLEVEL") <> "" then CustomActionType = "IMMEDIATE (full access to properties etc)" else CustomActionType = "DEFERRED (very limited access to properties, information passes in ""CustomActionData"")" end if else CustomActionType = "NOT (testing as standalone vbscript)" if ucase(mid(wscript.FullName, len(wscript.Path) + 2, 1)) = "W" Then wscript.echo "You can't use WSCRIPT on this VB script, use CSCRIPT instead!" wscript.quit 999 end if end if dim CaVb then on error goto 0 else on error resume next end if end if Install = USER_Install() if err.number <> 0 then Install = UserFunctionTrapped() else CaDebug 0, "" CaDebug 2, "Finished! USER code did not trap." end if VbsCaLogInc -1 CaDebug 0, "Install(): Stub FINISHED, RC = " & Install end function function UserFunctionTrapped() dim ErrNumb, ErrDesc, ErrSrc, ErrNumbT ErrNumb = Err.Number ErrDesc = Err.Description ErrSrc = Err.Source ErrNumbT = "0x" & hex(ErrNumb) & " (" & ErrNumb & ")" on error resume next dim MsiReason : MsiReason = "" if not session.installer is nothing then set oLastErr = session.installer.LastErrorRecord if not oLastErr is nothing then MsiReason = oLastErr.FormatText() & vbCRLF end if end if dim Text if LastUserMsg = "VbsCaRaiseError()" then Text = ErrDesc & vbCrLf & vbCrLf Text = Text & "This problem was raised by """ & ErrSrc & """." if MsiReason <> "" then Text = Text & " Possibly for this Windows Installer reason: " & MsiReason end if else dim SavedLastUserMsg, SavedLastLogOnlyMsg SavedLastUserMsg = LastUserMsg SavedLastLogOnlyMsg = LastLogOnlyMsg err.clear() CaDebug 0, "" CaDebug 0, "" CaDebug 0, "DISPLAY TRAP" CaDebug 0, "~~~~~~~~~~~~" CaDebug 0, "SOURCE : " & ErrSrc CaDebug 0, "NUMBER : " & ErrNumbT CaDebug 0, "DESCRIPTION: " & ErrDesc CaDebug 0, "AFTER MSG U: " & CaOneLine(0, SavedLastUserMsg) CaDebug 0, "AFTER MSG L: " & CaOneLine(0, SavedLastLogOnlyMsg) if LikelyReason <> "" THEN CaDebug 0, "CAUSE? : " & LikelyReason end if Text = "Script failed - " & ErrNumbT if ErrDesc <> "" then Text = Text & vbCrLf & "Reason: " & ErrDesc Text = Text & vbCrLf & MsiReason if IsCustomAction then Text = Text & vbCrLf & vbCrLf & "The install has aborted!" & vbCrLf end if Text = Text & vbCrLf & "AfterU: " & CaOneLine(80, SavedLastUserMsg) Text = Text & vbCrLf & "AfterL: " & CaOneLine(80, SavedLastLogOnlyMsg) if ErrSrc <> "" then Text = Text & vbCrLf & "Source: " & ErrSrc if LikelyReason <> "" then Text = Text & vbCrLf & "Cause?: " & LikelyReason end if CaMsgBox "E", Text CaDebug 0, "" if IsCustomAction then CaDebug 2, "Forcing rollback..." end if UserFunctionTrapped = VbsCaRcError end function function CaGetEnv(EnvVar, DieIfMissing) on error goto 0 CaGetEnv = "" dim Try : Try = "%" & EnvVar & "%" dim oShell : set oShell = CaMkObject("WScript.Shell") on error resume next CaGetEnv = oShell.ExpandEnvironmentStrings(Try) set oShell = Nothing on error goto 0 if CaGetEnv = Try then CaGetEnv = "" if DieIfMissing then on error goto 0 VbsCaRaiseError "CaGetEnv()", "The environment variable """ & EnvVar & """ does not exist" end if end if end function function CaMkObject(ByVal AutomationClass) on error resume next set CaMkObject = CreateObject(AutomationClass) dim EC : EC = err.number Dim ET : ET = "0x" & hex(EC) & " - " & err.description on error goto 0 if EC <> 0 then VbsCaRaiseError "CaMkObject()", "Failed loading the automation class """ & AutomationClass & """." & vbCRLF & vbCRLF & "Reason " & ET end if end function sub VbsCaLikelyReason4Trap(Reason) LikelyReason = Reason end sub sub VbsCaProgressLine1(Doing) on error resume next oRecLine1.StringData(1) = LogPrefix oRecLine1.StringData(2) = Doing oRecLine1.StringData(3) = "[1]" session.message msiMessageTypeActionStart, oRecLine1 if Doing <> "" then LastUserMsg = Doing LastLogOnlyMsg = "" end if err.clear() end sub sub VbsCaProgressLine2(Doing) on error resume next oRecLine2.StringData(1) = Doing session.message msiMessageTypeActionData, oRecLine2 if Doing <> "" then LastUserMsg = Doing LastLogOnlyMsg = "" end if err.clear() end sub sub CaDebug(ByVal ForUI, ByVal What) dim RebuildNonZeroErrNumb : RebuildNonZeroErrNumb = false if DebugMonitorErrNumber and err.number <> 0 then dim ErrNumbDec : ErrNumbDec = err.number dim ErrNumb : ErrNumb = hex(ErrNumbDec) dim ErrSrc : ErrSrc = err.source dim ErrDesc : ErrDesc = err.description err.clear() dim SavedLastLogOnlyMsg : SavedLastLogOnlyMsg = LastLogOnlyMsg VbsCaLogInc 1 CaDebug_ 0, "####>>>> CaDebug(EntryCheck): Err.NUMBER: 0x" & ErrNumb & ", SOURCE: " & ErrSrc & ", DESC: " & ErrDesc VbsCaLogInc -1 RebuildNonZeroErrNumb = true LastLogOnlyMsg = SavedLastLogOnlyMsg end if CaDebug_ ForUI, What if RebuildNonZeroErrNumb then on error resume next SavedLastLogOnlyMsg = LastLogOnlyMsg VbsCaLogInc 1 CaDebug_ 0, "####>>>> CaDebug(EntryCheck): Rebuilding original error details..." VbsCaLogInc -1 LastLogOnlyMsg = SavedLastLogOnlyMsg err.raise ErrNumbDec, ErrSrc, ErrDesc end if end sub sub CaDebug_(ByVal ForUI, ByVal What) on error resume next wscript.echo What select case ForUI case 1 VbsCaProgressLine1 What case 2 VbsCaProgressLine2 What case else dim Text if What = "" then Text = "" else Text = LogPrefix & What LastLogOnlyMsg = What end if oMsiLog.StringData(0) = Text session.message msiMessageTypeInfo, oMsiLog end select VbsCaLog What err.clear() end sub function VbsCaRunSync(ByVal TheCmd, ByVal RunType, ByVal TheOutput) VbsCaLogInc 1 on error goto 0 dim oShell : set oShell = CaMkObject("WScript.Shell") dim oFS : set oFS = CaMkObject("Scripting.FileSystemObject") dim TmpFile : TmpFile = "" if TheOutput = "" then TheOutput = "?" end if if instr(TheOutput, "?") <> 0 then TmpFile = oFS.GetSpecialFolder(TemporaryFolder) & "\" & oFS.GetTempName() If IsDos() then TheCmd = """" & CaGetEnv("COMSPEC", true) & """ /c " & TheCmd & " > """ & TmpFile & """" else TheCmd = """" & CaGetEnv("COMSPEC", true) & """ /c """ & TheCmd & " > """ & TmpFile & """ 2>&1""" end if end if CaDebug 0, "EXECUTING: " & TheCmd on error resume next dim CmdRc : CmdRc = oShell.run(TheCmd, RunType, true) dim ErrNumber : ErrNumber = err.number dim ErrDesc : ErrDesc = err.description on error goto 0 if TheOutput <> "!" then dim FileList : FileList = split(TheOutput, ";") dim FileIndex, FileName, FileTitle for FileIndex = lbound(FileList) to ubound(FileList) FileName = trim(FileList(FileIndex)) FileTitle = FileName if FileName = "?" then FileName = TmpFile FileTitle = "REDIRECTED OUTPUT: " & FileName end if if FileName <> "" then VbsDebugDumpFile FileName, FileTitle end if next if TmpFile <> "" then if oFS.FileExists(TmpFile) then oFS.DeleteFile TmpFile end if end if end if if ErrNumber <> 0 then VbsCaRunSync = -999 VbsCaRaiseError "VbsCaRunSync()", "Failed Executing an external command!" & vbCRLF & "Reason 0x" & hex(ErrNumber) & " - " & ErrDesc & vbCRLF & vbCRLF & "The command was """ & TheCmd & """" end if CaDebug 0, "EXE Rc = " & CmdRc CaDebug 0, "" set oShell = Nothing set oFS = Nothing VbsCaRunSync = CmdRc VbsCaLogInc -1 end function sub VbsDebugDumpFile(ByVal FileName, Title) VbsCaLogInc 1 if Title <> "" then CaDebug 0, Title CaDebug 0, string(len(Title), "~") end if on error resume next dim oFS : set oFS = CaMkObject("Scripting.FileSystemObject") if not oFS.FileExists(FileName) then CaDebug 0, "*+* File does not exist *+*" & vbCRLF else dim Stream : set Stream = oFS.OpenTextFile(FileName, ForReading) if Stream.AtEndOfStream then CaDebug 0, "+*+ NO OUTPUT +*+" & vbCRLF else CaDebug 0, Stream.ReadAll() end if Stream.close() end if VbsCaLogInc -1 set oFS = Nothing end sub function CaOneLine(ByVal How, ByVal MultiLine) CaOneLine = replace(MultiLine, vbCR, "") if How = -1 then dim Pos : Pos = instr(CaOneLine, vbLF) if Pos <> 0 then CaOneLine = left(CaOneLine, Pos) & "..." end if else if How <> 0 then if len(CaOneLine) > How then CaOneLine = left(CaOneLine, How) & "..." end if end if end if CaOneLine = replace(CaOneLine, vbLF, "{{NL}}") end function sub VbsCaLogInc(ByVal IncAmount) LogInc = LogInc + IncAmount if LogInc < 0 then LogInc = 0 end sub sub InitializeLogFile() LogFileInitialized = 0 on error resume next dim oFs : set oFs = CreateObject("Scripting.FileSystemObject") dim oFile dim ParentDir : ParentDir = oFS.GetParentFolderName(LogFile) if not oFS.FolderExists(ParentDir) then CaCreateFolder ParentDir 'CaDebug 0, "LOGINIT: Created the log's folder """ & ParentDir & """ - " & err.description end if if oFS.FileExists(LogFile) then dim MaxDays : MaxDays = 100 set oFile = oFS.GetFile(LogFile) dim FileDays : FileDays = DateDiff("d", oFile.DateLastModified, Date()) 'CaDebug 0, "LOGINIT: Old file dated: " & oFile.DateLastModified set oFile = Nothing if FileDays > MaxDays then oFS.FileDelete LogFile 'CaDebug 0, "LOGINIT: Deleted old file as it is older than " & MaxDays & " days - " & err.description end if end if if oFS.FileExists(LogFile) then dim MaxBytes : MaxBytes = 300 * 1024 set oFile = oFS.GetFile(LogFile) dim FileSize : FileSize = oFile.size 'CaDebug 0, "LOGINIT: File is " & FileSize & " bytes long." set oFile = Nothing if FileSize > MaxBytes then dim ShortenToBytes : ShortenToBytes = (MaxBytes \ 100) * 75 dim ShortenByBytes : ShortenByBytes = FileSize - ShortenToBytes 'CaDebug 0, "LOGINIT: File is being shortened to about " & ShortenToBytes & " bytes." dim Stream, Contents set Stream = oFS.OpenTextFile(LogFile, ForReading) Contents = Stream.read(ShortenByBytes) Contents = Stream.readLine() Contents = Stream.readall() Stream.Close() set Stream = Nothing set Stream = oFS.CreateTextFile(LogFile, true) Stream.writeline string(78, "*") Stream.writeline "*** Time : " & Date() & ", " & time() Stream.writeline "*** Log Size : " & (FileSize \ 1024) & "K (" & FileSize & " bytes)" Stream.writeline "*** Max Log Size: 300K (Shortens to " & (75 * 300) \ 100 & "K)" Stream.writeline "*** Action : File shortened by " & ShortenByBytes & " bytes" Stream.writeline string(78, "*") Stream.writeline "" Stream.write Contents Stream.Close() set Stream = Nothing end if end if LogFileInitialized = 1 set oFS = Nothing end sub sub VbsCaLog(ByVal What) on error resume next if LogFile = "" then exit sub end if if LogFileInitialized = -1 then InitializeLogFile() else if LogFileInitialized <> 1 then exit sub end if end if dim oFs : set oFs = CreateObject("Scripting.FileSystemObject") dim Stream : set Stream = oFs.OpenTextFile(LogFile, ForAppending, True) if What = "" then Stream.writeLine "" else dim Tp, TpContinued, TpTimeLength Tp = FormatDateTime(now(), vbShortDate) Tp = Tp & ", " & FormatDateTime(now(), vbLongTime) TpTimeLength = len(Tp) Tp = Tp & ": " TpContinued = string(TpTimeLength, " ") & ": " dim TpIndent : TpIndent = string(LogInc*4, " ") Tp = Tp & TpIndent TpContinued = TpContinued & TpIndent What = replace(replace(What, vbCR, ""), vbLF, vbCRLF & TpContinued) Stream.writeLine Tp & What end if Stream.close() set oFs = Nothing set Stream = Nothing err.clear() end sub sub VbsCaRaiseError(ByVal ErrorSource, ByVal ErrorReason) dim ErrNumb, ErrDesc ErrNumb = "0x" & hex(err.number) & " (" & err.number & ")" ErrDesc = err.description if ErrDesc = "" then ErrDesc = "unknown" CaDebug 0, "" CaDebug 0, "" CaDebug 0, "VbsCaRaiseError()" CaDebug 0, "~~~~~~~~~~~~~~~~~" CaDebug 0, "SOURCE : " & ErrorSource CaDebug 0, "REASON : " & ErrorReason CaDebug 0, "err.number : " & ErrNumb CaDebug 0, "err.desc : " & ErrDesc LastUserMsg = "VbsCaRaiseError()" LastLogOnlyMsg = "VbsCaRaiseError()" Err.clear() Err.Description = ErrorReason Err.Source = ErrorSource Err.raise(vbObjectError+219) end sub sub CaDebugPause(ByVal Text) on error resume next if DebugPauses = "N" then exit sub end if dim X : X = "" X = X & vbCRLF X = X & vbCRLF X = X & "Custom Action : " & CaBinaryName X = X & vbCRLF X = X & "Defined At : " & CaDefinedAt X = X & vbCRLF X = X & "Running Mode : " & CaMode X = X & vbCRLF X = X & "Product Name : " & ProductName X = X & vbCRLF X = X & "Product Version: " & ProductVersion X = X & vbCRLF X = X & "Product MSI : " & ProductMsi X = X & vbCRLF X = X & "Extra Log : " & LogFile dim T T = "DEBUG PAUSE (VBSCRIPT)" & vbCRLF T = T & "~~~~~~~~~~~~~~~~~~~~~~" & vbCRLF CaMsgBox "I", T & Text & X end sub function CaMsgBox(ByVal BoxType, ByVal Text) on error goto 0 dim BoxT BoxT = "MSG BOX - " & BoxType & vbCRLF BoxT = BoxT & "~~~~~~~~~~~~" & VbCRLF BoxT = BoxT & Text & vbCRLF BoxT = BoxT & "^^^^^ End of Message Box ^^^^^" CaDebug 0, "" CaDebug 0, BoxT CaDebug 0, "" dim Buttons, CaMsgType if BoxType = "" then BoxType = "I" select case ucase(BoxType) case "I" Buttons = VbInformation CaMsgType = msiMessageTypeUser case "E" Buttons = VbCritical CaMsgType = msiMessageTypeError case else on error resume next CaMsgType = cint(BoxType) if err.number = 0 then CaMsgType = msiMessageTypeUser or CaMsgType else Buttons = VbInformation CaMsgType = msiMessageTypeWarning Text = Text & VbCrLf & vbCRLF & "Note: BoxType of """ & BoxType & """ is invalid!" end if on error goto 0 end select if not IsCustomAction then CaMsgBox = MsgBox(Text, Buttons, "TrifidCamera-1.016.0004.0021.msi (CA ChangeIns      !"#$%&'()*+,-./0123456789:;<=>?@ABCEFGHIRKLMNOPQDSTUVWZ[\]^2`bcefghijklmnopqrstuvwz{|}~tallLocationForMaximDl.vbs)") else dim MsgTemplate if Buttons = VbInformation then MsgTemplate = "[1]" else MsgTemplate = "ERROR: [1]" end if dim oRecMsgBox : set oRecMsgBox = Installer.CreateRecord(1) oRecMsgBox.StringData(0) = MsgTemplate oRecMsgBox.StringData(1) = Text CaMsgBox = session.message(CaMsgType, oRecMsgBox) end if end function function VbsCaPropertyGet(ByVal PropertyName, ByVal DefaultValue, ByVal PromptExtra) on error goto 0 CaDebug 0, "" CaDebug 0, "VbsCaPropertyGet(""" & PropertyName & """)" if IsCustomAction then VbsCaPropertyGet = session.property(PropertyName) else dim Prompt, Title Title = "GET VALUE - """ & PropertyName & """" Prompt = "Please enter a value for the property """ & PropertyName & """." & VbCRLF & VbCRLF Prompt = Prompt & "This would normally be passed by the Custom Action and so is unavailable while testing!" if PromptExtra <> "" then Prompt = Prompt & vbCRLF & vbCRLF & PromptExtra end if VbsCaPropertyGet = InputBox(Prompt, Title, DefaultValue) end if CaDebug 0, PropertyName & " => """ & VbsCaPropertyGet & """" CaDebug 0, "" end function function VbsCaCadGet(ByVal Name) on error goto 0 CaDebug 0, "VbsCaCadGet(" & Name & ")" VbsCaLogInc 1 dim QueryExists if left(Name,2) <> "?:" then QueryExists = false else QueryExists = true VbsCaCadGet = "N" Name = mid(Name, 3) CaDebug 0, "This is a query to see if the item exists..." end if if oCad is Nothing then set oCad = CaMkObject("Scripting.Dictionary") if TestCustomActionData = "" then TestCustomActionData = "1," & Name & "=" end if dim Cad : Cad = VbsCaPropertyGet("CustomActionData", TestCustomActionData, "Example: ""1,Name1=Value1,Name2=Value2""") if Cad <> "" then dim Lng, Delimiter Lng = left(Cad, 1) if not IsNumeric(Lng) then VbsCaRaiseError "VbsCaCadGet()", "Incorrectly formatted CustomActionData, first byte is not numeric!" end if Delimiter = mid(Cad, 2, Lng) Cad = mid(Cad, 1+Lng+1) CaDebug 0, "Splitting: " & Cad dim CadArray : CadArray = split(Cad, Delimiter) dim Index, Bits if ubound(CadArray) = -1 then CaDebug 0, " - No parameters passed" else for Index = 0 to ubound(CadArray) Bits = split(CadArray(Index), "=", 2) if ubound(Bits) <> 1 then VbsCaRaiseError "VbsCaCadGet()", "Incorrectly formatted CustomActionData #" & Index+1 & ": " & CadArray(Index) end if CaDebug 0, " - #" & Index+1 & ", " & Bits(0) & " = " & Bits(1) oCad.add Bits(0), Bits(1) next end if CaDebug 0, "" end if end if if Name = "" then exit function end if if Name = "?" then set VbsCaCadGet = oCad exit function end if if QueryExists then if oCad.exists(Name) then VbsCaCadGet = "Y" else VbsCaCadGet = "N" end if CaDebug 0, "Query Result is """ & VbsCaCadGet & """" else if oCad.exists(Name) then VbsCaCadGet = oCad(Name) CaDebug 0, """" & Name & """ contained """ & VbsCaCadGet & """" else VbsCaRaiseError "VbsCaCadGet()", "The value """ & Name & """ was not passed in the CustomActionData!" end if end if VbsCaLogInc -1 end function function VbsCaCadReplace(ByVal Before, ByVal SymCodeS, ByVal SymCodeE) dim Pos, LeftBit, CadVar, Value LeftBit = "" Pos = instr(Before, SymCodeS) do while Pos <> 0 LeftBit = LeftBit & left(Before, Pos-1) Before = mid(Before, Pos+len(SymCodeS)) Pos = instr(Before, SymCodeE) if Pos = 0 then LeftBit = LeftBit & "SymCodeS" else CadVar = left(Before, Pos-1) Before = mid(Before, Pos+len(SymCodeE)) Value = VbsCaCadGet(CadVar) LeftBit = LeftBit & Value end if Pos = instr(Before, SymCodeS) loop VbsCaCadReplace = LeftBit & Before end function sub CaCreateFolder(byVal DirName) if DirName = "" then exit sub dim oFS : set oFS = CaMkObject("Scripting.FileSystemObject") dim ParentDir : ParentDir = oFS.GetParentFolderName(DirName) if not oFS.FolderExists(ParentDir) then CaCreateFolder ParentDir end if if not oFS.FolderExists(DirName) then VbsCaLogInc 1 CaDebug 0, "Creating Folder """ & DirName & """" VbsCaLogInc -1 on error resume next oFS.CreateFolder DirName dim EC : EC = err.number Dim ET : ET = "0x" & hex(EC) & " - " & err.description on error goto 0 if EC <> 0 then VbsCaRaiseError "CaCreateFolder()", "Failed creating folder """ & DirName & """." & vbCRLF & vbCRLF & "Reason " & ET end if end if set oFs = Nothing end sub function IsDos() on error goto 0 if instr(ucase(CaGetEnv("COMSPEC", true)), "COMMAND.COM") <> 0 then IsDos = True else IsDos = False end if end function '!!! Obsolete functions stubs !!! sub VbsCaDebug(ForUI, What) CaDebug ForUI, What end sub function VbsCaMsgBox(BoxType, Text) VbsCaMsgBox = CaMsgBox(BoxType, Text) end function function VbsCaGetEnv(EnvVar, DieIfMissing) VbsCaGetEnv = CaGetEnv(EnvVar, DieIfMissing) end function sub CaDeleteFile(ByVal FileName) VbsCaLogInc 1 CaDebug 0, "Deleting """ & FileName & """ (if it exists)" VbsCaLogInc 1 if not oFS.FileExists(FileName) then CaDebug 0, "It doesn't exist" else CaDebug 0, "It exists, removing it" on error resume next oFS.DeleteFile(FileName) dim EC : EC = err.number Dim ET : ET = "0x" & hex(EC) & " - " & err.description on error goto 0 if EC <> 0 then VbsCaRaiseError "CaDeleteFile()", "The file """ & FileName & """ exists but couldn't be deleted!" & vbCRLF & vbCRLF & "Reason " & ET end if end if VbsCaLogInc -2 end sub function VbsCaCadGetValidate(ByVal Name, ByVal ValidateType) CaDebug 0, "" CaDebug 0, "VbsCaCadGetValidate(""" & Name & """)" VbsCaLogInc 1 dim Val : Val = VbsCaCadGet(Name) dim Pos, ValType, ValParms Pos = instr(ValidateType, ":") if Pos = 0 then ValType = trim(ValidateType) ValParms = "" else ValType = trim( left(ValidateType, Pos-1) ) ValParms = trim( mid(ValidateType, Pos+1) ) end if CaDebug 0, "" CaDebug 0, "Val Type: " & ValType CaDebug 0, "Val Parm: " & ValParms dim oFS : set oFS = CaMkObject("Scripting.FileSystemObject") dim FailMsg : FailMsg = "" select case ucase(ValType) case "FILE" Val = replace(Val, "\\", "\") if oFS.FileExists(Val) then CaDebug 0, "The file """ & Val & """ exists!" else FailMsg = "The file """ & Val & """ doesn't exist!" end if case "DIR" Val = replace(Val, "\\", "\") if oFS.FolderExists(Val) then CaDebug 0, "The directory """ & Val & """ exists!" else FailMsg = "The directory """ & Val & """ doesn't exist!" end if case else FailMsg = "The validation type of """ & ValType & """ is unknown." end select set oFs = Nothing VbsCaCadGetValidate = Val if ValParms <> "" then if FailMsg <> "" then FailMsg = FailMsg & vbCRLF & vbCRLF FailMsg = FailMsg & "We didn't expect parameters on the validation type of """ & ValType & """." & vbCRLF & "The parameters were: " & ValParms end if if FailMsg <> "" then VbsCaRaiseError "VbsCaCadGetValidate()", FailMsg else CaDebug 0, "The value passed validation." end if VbsCaLogInc -1 end function ctVersion, ProductMsi CaBinaryName = "LookForMaximDl.vbs" CaDefinedAt = "Trifid.MM(466)" ProductName = "TrifidCamera" ProductVersion = "1.016.0004.0021" ProductMsi = "TrifidCamera-1.016.0004.0021.msi" if IsCustomAction then CaMode = "Custom Action" else CaMode = "Standard VBSCRIPT" end if err.clear() CaDebug 0, "" CaDebug 0, "" CaDebug 0, "Custom Action : " & CaBinaryName CaDebug 0, "CA Type : " & CustomActionType CaDebug 0, "Defined At : " & CaDefinedAt CaDebug 0, "Running Mode : " & CaMode CaDebug 0, "Product Name : " & ProductName CaDebug 0, "Product Version: " & ProductVersion CaDebug 0, "Product MSI : " & ProductMsi CaDebug 0, "Extra Log : " & LogFile CaDebug 0, "User's ID : " & CaGetEnv("USERNAME", false) CaDebug 0, "User's Domain : " & CaGetEnv("USERDOMAIN", false) CaDebug 0, "" on error goto 0 VbsScriptTestingStub() '===================== function USER_Install() 'Entry Point "Install()" '===================== on error goto 0 CaDebug 2, "USER_Install() - User function starting..." CaDebugPause("Install() - START") VbsCaLogInc 1 USER_Install = 0 LookMaximDlFunc() dim ErrText if err.number = 0 then ErrText = ", err.number was 0" else ErrText = ", ErrorNumber = 0x" & hex(err.number) & " (" & err.number & ")" if err.Description <> "" then ErrText = ErrText & " => " & err.Description end if end if VbsCaLogInc -1 CaDebug 2, "USER_Install() - User Code FINISHED, RC = " & USER_Install & ErrText CaDebugPause("Install() - END" & ErrText) err.clear() end function sub LookMaximDlFunc() dim registryEntry registryEntry = VbsCaPropertyGet("MAXIM_DL_INSTALLED", "", "") if len(registryEntry)=0 then dim installDir installDir = Session.Property("INSTALLDIR1") CaMsgBox "I","MaxIm/DL was not found in the registry." & Chr(13) & "If you want to use a Trifid Camera with MaxIm/DL, please copy" & Chr(13) & installDir & "\SDK\MaxIm DL V4\CCDPlugTrifid.dll and" & Chr(13) & installDir & "\SDK\MaxIm DL V4\CCDPlugTrifidNugget.dll" & Chr(13) & "to MaxIm/DL's installation directory." end if end sub function VbsScriptTestingStub() CaDebug 0, "VbsScriptTestingStub() - Starting" VbsScriptTestingStub = 0 if IsCustomAction then CaDebug 0, "VbsScriptTestingStub() - Real Custom Action!" else CaDebug 0, "VbsScriptTestingStub() - Testing mode!" if wscript.arguments.count = 0 then VbsScriptTestingStub = Install() else dim EntryPoint : EntryPoint = wscript.arguments(0) if left(EntryPoint, 1) = "!" then CmdLineTrapsHandledByVb = not CmdLineTrapsHandledByVb EntryPoint = mid(EntryPoint, 2) end if select case ucase(EntryPoint) case "INSTALL" VbsScriptTestingStub = Install() case else CaDebug 0, "Entry point """ & EntryPoint & "()"" unknown!" VbsScriptTestingStub = 999 end select end if end if CaDebug 0, "VbsScriptTestingStub() - Ending" end function function Install() CaDebug 0, "Install(): Stub STARTING" VbsCaLogInc 1 CaDebug 1, Line1Prefix & " - Install()'*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+ ' Generator : PPWIZARD version 06.278 ' : FREE tool for Windows, OS/2, DOS and UNIX by Dennis Bareis (dbareis@gmail.com) ' : http://dennisbareis.com/ppwizard.htm ' Time : Sunday, 25 Mar 2007 12:53:52pm ' Input File : C:\Yankee Robotics\MakeMSI\Trifid.MM ' Output File : C:\Yankee Robotics\MakeMSI\out\Trifid.MM\Log\CustomActions\VB\LookForMaximDl.vbs '*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+ option explicit 'All variables must be defined on error resume next if Wscript.Arguments.Count = 1 then if Wscript.Arguments(0) = "!CheckSyntax!" then wscript.quit(21924) on error goto 0 '--- You can change this value to make testing from command line easier --- dim TestCustomActionData : TestCustomActionData = "" public LogInc : LogInc = 0 public LikelyReason : LikelyReason = "" dim DebugPauses : DebugPauses = ucase("N") dim LogFile : LogFile = "" dim LogFileInitialized : LogFileInitialized = -1 LogFile = "" public DebugMonitorErrNumber : DebugMonitorErrNumber = true public CmdLineTrapsHandledByVb : CmdLineTrapsHandledByVb = true public oCad : set oCad = Nothing public Line1Prefix Line1Prefix = "Custom Action ""LookForMaximDl.vbs""" const ForReading = 1 const ForWriting = 2 const ForAppending = 8 const TemporaryFolder = 2 public LastUserMsg : LastUserMsg = "VBSCRIPT ""LookForMaximDl.vbs"" just started..." public LastLogOnlyMsg : LastLogOnlyMsg = "" const ERROR_INSTALL_USEREXIT = 1602 const ERROR_INSTALL_FAILURE = 1603 public VbsCaRcError : VbsCaRcError = 1603 VbsCaLog "" VbsCaLog string(79, "#") dim IsCustomAction dim oMsiLog : set oMsiLog = Nothing dim oRecLine1 : set oRecLine1 = Nothing dim oRecLine2 : set oRecLine2 = Nothing const msiMessageTypeError = &H01000000 const msiMessageTypeWarning = &H02000000 const msiMessageTypeUser = &H03000000 const msiMessageTypeInfo = &H04000000 const msiMessageTypeFilesInUse = &H05000000 const msiMessageTypeActionStart = &H08000000 const msiMessageTypeActionData = &H09000000 const msiMessageTypeProgress = &H0A000000 const msiMessageStatusError = -1 const msiMessageStatusNONE = 0 const msiMessageStatusOK = 1 const msiMessageStatusCancel = 2 const msiMessageStatusAbort = 3 const msiMessageStatusRetry = 4 const msiMessageStatusIgnore = 5 const msiMessageStatusYes = 6 const msiMessageStatusNo = 7 const LogPrefix = " VBS-> " const ActionInfo = 1 const ProgressReport = 2 const ProgressAddition = 3 const msiRunModeScheduled = 16 on error resume next dim DetermineEnv : DetermineEnv = WScript.ScriptFullName if err.Number = 0 then IsCustomAction = false else IsCustomAction = true end if err.clear() dim CustomActionType if IsCustomAction then set oRecLine1 = Installer.CreateRecord(3) if err.number <> 0 then dim T : T = "Installer.CreateRecord() failed, Reason 0x" & hex(err.number) & " - " & err.description err.clear() CaDebug 0, "" CaDebug 0, T CaDebug 0, "" T = "Failed accessing ""Installer"" object, this should never fail and " T = T & "possibly indicates a problem with this machines's DCOM configuration." on error goto 0 VbsCaRaiseError "InitializingLogging()", T end if set oRecLine2 = Installer.CreateRecord(1) set oMsiLog = Installer.CreateRecord(1) CaDebug 1, Line1Prefix & " starting..." if Session.Property("INSTALLLEVEL") <> "" then CustomActionType = "IMMEDIATE (full access to properties etc)" else CustomActionType = "DEFERRED (very limited access to properties, information passes in ""CustomActionData"")" end if else CustomActionType = "NOT (testing as standalone vbscript)" if ucase(mid(wscript.FullName, len(wscript.Path) + 2, 1)) = "W" Then wscript.echo "You can't use WSCRIPT on this VB script, use CSCRIPT instead!" wscript.quit 999 end if end if dim CaBinaryName, CaDefinedAt, CaMode, ProductName, Produ" if IsCustomAction then on error resume next else if CmdLineTrapsHandledByVb then on error goto 0 else on error resume next end if end if Install = USER_Install() if err.number <> 0 then Install = UserFunctionTrapped() else CaDebug 0, "" CaDebug 2, "Finished! USER code did not trap." end if VbsCaLogInc -1 CaDebug 0, "Install(): Stub FINISHED, RC = " & Install end function function UserFunctionTrapped() dim ErrNumb, ErrDesc, ErrSrc, ErrNumbT ErrNumb = Err.Number ErrDesc = Err.Description ErrSrc = Err.Source ErrNumbT = "0x" & hex(ErrNumb) & " (" & ErrNumb & ")" on error resume next dim MsiReason : MsiReason = "" if not session.installer is nothing then set oLastErr = session.installer.LastErrorRecord if not oLastErr is nothing then MsiReason = oLastErr.FormatText() & vbCRLF end if end if dim Text if LastUserMsg = "VbsCaRaiseError()" then Text = ErrDesc & vbCrLf & vbCrLf Text = Text & "This problem was raised by """ & ErrSrc & """." if MsiReason <> "" then Text = Text & " Possibly for this Windows Installer reason: " & MsiReason end if else dim SavedLastUserMsg, SavedLastLogOnlyMsg SavedLastUserMsg = LastUserMsg SavedLastLogOnlyMsg = LastLogOnlyMsg err.clear() CaDebug 0, "" CaDebug 0, "" CaDebug 0, "DISPLAY TRAP" CaDebug 0, "~~~~~~~~~~~~" CaDebug 0, "SOURCE : " & ErrSrc CaDebug 0, "NUMBER : " & ErrNumbT CaDebug 0, "DESCRIPTION: " & ErrDesc CaDebug 0, "AFTER MSG U: " & CaOneLine(0, SavedLastUserMsg) CaDebug 0, "AFTER MSG L: " & CaOneLine(0, SavedLastLogOnlyMsg) if LikelyReason <> "" THEN CaDebug 0, "CAUSE? : " & LikelyReason end if Text = "Script failed - " & ErrNumbT if ErrDesc <> "" then Text = Text & vbCrLf & "Reason: " & ErrDesc Text = Text & vbCrLf & MsiReason if IsCustomAction then Text = Text & vbCrLf & vbCrLf & "The install has aborted!" & vbCrLf end if Text = Text & vbCrLf & "AfterU: " & CaOneLine(80, SavedLastUserMsg) Text = Text & vbCrLf & "AfterL: " & CaOneLine(80, SavedLastLogOnlyMsg) if ErrSrc <> "" then Text = Text & vbCrLf & "Source: " & ErrSrc if LikelyReason <> "" then Text = Text & vbCrLf & "Cause?: " & LikelyReason end if CaMsgBox "E", Text CaDebug 0, "" if IsCustomAction then CaDebug 2, "Forcing rollback..." end if UserFunctionTrapped = VbsCaRcError end function function CaGetEnv(EnvVar, DieIfMissing) on error goto 0 CaGetEnv = "" dim Try : Try = "%" & EnvVar & "%" dim oShell : set oShell = CaMkObject("WScript.Shell") on error resume next CaGetEnv = oShell.ExpandEnvironmentStrings(Try) set oShell = Nothing on error goto 0 if CaGetEnv = Try then CaGetEnv = "" if DieIfMissing then on error goto 0 VbsCaRaiseError "CaGetEnv()", "The environment variable """ & EnvVar & """ does not exist" end if end if end function function CaMkObject(ByVal AutomationClass) on error resume next set CaMkObject = CreateObject(AutomationClass) dim EC : EC = err.number Dim ET : ET = "0x" & hex(EC) & " - " & err.description on error goto 0 if EC <> 0 then VbsCaRaiseError "CaMkObject()", "Failed loading the automation class """ & AutomationClass & """." & vbCRLF & vbCRLF & "Reason " & ET end if end function sub VbsCaLikelyReason4Trap(Reason) LikelyReason = Reason end sub sub VbsCaProgressLine1(Doing) on error resume next oRecLine1.StringData(1) = LogPrefix oRecLine1.StringData(2) = Doing oRecLine1.StringData(3) = "[1]" session.message msiMessageTypeActionStart, oRecLine1 if Doing <> "" then LastUserMsg = Doing LastLogOnlyMsg = "" end if err.clear() end sub sub VbsCaProgressLine2(Doing) on error resume next oRecLine2.StringData(1) = Doing session.message msiMessageTypeActionData, oRecLine2 if Doing <> "" then LastUserMsg = Doing LastLogOnlyMsg = "" end if err.clear() end sub sub CaDebug(ByVal ForUI, ByVal What) dim RebuildNonZeroErrNumb : RebuildNonZeroErrNumb = false if DebugMonitorErrNumber and err.number <> 0 then dim ErrNumbDec : ErrNumbDec = err.number dim ErrNumb : ErrNumb = hex(ErrNumbDec) dim ErrSrc : ErrSrc = err.source dim ErrDesc : ErrDesc = err.description err.clear() dim SavedLastLogOnlyMsg : SavedLastLogOnlyMsg = LastLogOnlyMsg VbsCaLogInc 1 CaDebug_ 0, "####>>>> CaDebug(EntryCheck): Err.NUMBER: 0x" & ErrNumb & ", SOURCE: " & ErrSrc & ", DESC: " & ErrDesc VbsCaLogInc -1 RebuildNonZeroErrNumb = true LastLogOnlyMsg = SavedLastLogOnlyMsg end if CaDebug_ ForUI, What if RebuildNonZeroErrNumb then on error resume next SavedLastLogOnlyMsg = LastLogOnlyMsg VbsCaLogInc 1 CaDebug_ 0, "####>>>> CaDebug(EntryCheck): Rebuilding original error details..." VbsCaLogInc -1 LastLogOnlyMsg = SavedLastLogOnlyMsg err.raise ErrNumbDec, ErrSrc, ErrDesc end if end sub sub CaDebug_(ByVal ForUI, ByVal What) on error resume next wscript.echo What select case ForUI case 1 VbsCaProgressLine1 What case 2 VbsCaProgressLine2 What case else dim Text if What = "" then Text = "" else Text = LogPrefix & What LastLogOnlyMsg = What end if oMsiLog.StringData(0) = Text session.message msiMessageTypeInfo, oMsiLog end select VbsCaLog What err.clear() end sub function VbsCaRunSync(ByVal TheCmd, ByVal RunType, ByVal TheOutput) VbsCaLogInc 1 on error goto 0 dim oShell : set oShell = CaMkObject("WScript.Shell") dim oFS : set oFS = CaMkObject("Scripting.FileSystemObject") dim TmpFile : TmpFile = "" if TheOutput = "" then TheOutput = "?" end if if instr(TheOutput, "?") <> 0 then TmpFile = oFS.GetSpecialFolder(TemporaryFolder) & "\" & oFS.GetTempName() If IsDos() then TheCmd = """" & CaGetEnv("COMSPEC", true) & """ /c " & TheCmd & " > """ & TmpFile & """" else TheCmd = """" & CaGetEnv("COMSPEC", true) & """ /c """ & TheCmd & " > """ & TmpFile & """ 2>&1""" end if end if CaDebug 0, "EXECUTING: " & TheCmd on error resume next dim CmdRc : CmdRc = oShell.run(TheCmd, RunType, true) dim ErrNumber : ErrNumber = err.number dim ErrDesc : ErrDesc = err.description on error goto 0 if TheOutput <> "!" then dim FileList : FileList = split(TheOutput, ";") dim FileIndex, FileName, FileTitle for FileIndex = lbound(FileList) to ubound(FileList) FileName = trim(FileList(FileIndex)) FileTitle = FileName if FileName = "?" then FileName = TmpFile FileTitle = "REDIRECTED OUTPUT: " & FileName end if if FileName <> "" then VbsDebugDumpFile FileName, FileTitle end if next if TmpFile <> "" then if oFS.FileExists(TmpFile) then oFS.DeleteFile TmpFile end if end if end if if ErrNumber <> 0 then VbsCaRunSync = -999 VbsCaRaiseError "VbsCaRunSync()", "Failed Executing an external command!" & vbCRLF & "Reason 0x" & hex(ErrNumber) & " - " & ErrDesc & vbCRLF & vbCRLF & "The command was """ & TheCmd & """" end if CaDebug 0, "EXE Rc = " & CmdRc CaDebug 0, "" set oShell = Nothing set oFS = Nothing VbsCaRunSync = CmdRc VbsCaLogInc -1 end function sub VbsDebugDumpFile(ByVal FileName, Title) VbsCaLogInc 1 if Title <> "" then CaDebug 0, Title CaDebug 0, string(len(Title), "~") end if on error resume next dim oFS : set oFS = CaMkObject("Scripting.FileSystemObject") if not oFS.FileExists(FileName) then CaDebug 0, "*+* File does not exist *+*" & vbCRLF else dim Stream : set Stream = oFS.OpenTextFile(FileName, ForReading) if Stream.AtEndOfStream then CaDebug 0, "+*+ NO OUTPUT +*+" & vbCRLF else CaDebug 0, Stream.ReadAll() end if Stream.close() end if VbsCaLogInc -1 set oFS = Nothing end sub function CaOneLine(ByVal How, ByVal MultiLine) CaOneLine = replace(MultiLine, vbCR, "") if How = -1 then dim Pos : Pos = instr(CaOneLine, vbLF) if Pos <> 0 then CaOneLine = left(CaOneLine, Pos) & "..." end if else if How <> 0 then if len(CaOneLine) > How then CaOneLine = left(CaOneLine, How) & "..." end if end if end if CaOneLine = replace(CaOneLine, vbLF, "{{NL}}") end function sub VbsCaLogInc(ByVal IncAmount) LogInc = LogInc + IncAmount if LogInc < 0 then LogInc = 0 end sub sub InitializeLogFile() LogFileInitialized = 0 on error resume next dim oFs : set oFs = CreateObject("Scripting.FileSystemObject") dim oFile dim ParentDir : ParentDir = oFS.GetParentFolderName(LogFile) if not oFS.FolderExists(ParentDir) then CaCreateFolder ParentDir 'CaDebug 0, "LOGINIT: Created the log's folder """ & ParentDir & """ - " & err.description end if if oFS.FileExists(LogFile) then dim MaxDays : MaxDays = 100 set oFile = oFS.GetFile(LogFile) dim FileDays : FileDays = DateDiff("d", oFile.DateLastModified, Date()) 'CaDebug 0, "LOGINIT: Old file dated: " & oFile.DateLastModified set oFile = Nothing if FileDays > MaxDays then oFS.FileDelete LogFile 'CaDebug 0, "LOGINIT: Deleted old file as it is older than " & MaxDays & " days - " & err.description end if end if if oFS.FileExists(LogFile) then dim MaxBytes : MaxBytes = 300 * 1024 set oFile = oFS.GetFile(LogFile) dim FileSize : FileSize = oFile.size 'CaDebug 0, "LOGINIT: File is " & FileSize & " bytes long." set oFile = Nothing if FileSize > MaxBytes then dim ShortenToBytes : ShortenToBytes = (MaxBytes \ 100) * 75 dim ShortenByBytes : ShortenByBytes = FileSize - ShortenToBytes 'CaDebug 0, "LOGINIT: File is being shortened to about " & ShortenToBytes & " bytes." dim Stream, Contents set Stream = oFS.OpenTextFile(LogFile, ForReading) Contents = Stream.read(ShortenByBytes) Contents = Stream.readLine() Contents = Stream.readall() Stream.Close() set Stream = Nothing set Stream = oFS.CreateTextFile(LogFile, true) Stream.writeline string(78, "*") Stream.writeline "*** Time : " & Date() & ", " & time() Stream.writeline "*** Log Size : " & (FileSize \ 1024) & "K (" & FileSize & " bytes)" Stream.writeline "*** Max Log Size: 300K (Shortens to " & (75 * 300) \ 100 & "K)" Stream.writeline "*** Action : File shortened by " & ShortenByBytes & " bytes" Stream.writeline string(78, "*") Stream.writeline "" Stream.write Contents Stream.Close() set Stream = Nothing end if end if LogFileInitialized = 1 set oFS = Nothing end sub sub VbsCaLog(ByVal What) on error resume next if LogFile = "" then exit sub end if if LogFileInitialized = -1 then InitializeLogFile() else if LogFileInitialized <> 1 then exit sub end if end if dim oFs : set oFs = CreateObject("Scripting.FileSystemObject") dim Stream : set Stream = oFs.OpenTextFile(LogFile, ForAppending, True) if What = "" then Stream.writeLine "" else dim Tp, TpContinued, TpTimeLength Tp = FormatDateTime(now(), vbShortDate) Tp = Tp & ", " & FormatDateTime(now(), vbLongTime) TpTimeLength = len(Tp) Tp = Tp & ": " TpContinued = string(TpTimeLength, " ") & ": " dim TpIndent : TpIndent = string(LogInc*4, " ") Tp = Tp & TpIndent TpContinued = TpContinued & TpIndent What = replace(replace(What, vbCR, ""), vbLF, vbCRLF & TpContinued) Stream.writeLine Tp & What end if Stream.close() set oFs = Nothing set Stream = Nothing err.clear() end sub sub VbsCaRaiseError(ByVal ErrorSource, ByVal ErrorReason) dim ErrNumb, ErrDesc ErrNumb = "0x" & hex(err.number) & " (" & err.number & ")" ErrDesc = err.description if ErrDesc = "" then ErrDesc = "unknown" CaDebug 0, "" CaDebug 0, "" CaDebug 0, "VbsCaRaiseError()" CaDebug 0, "~~~~~~~~~~~~~~~~~" CaDebug 0, "SOURCE : " & ErrorSource CaDebug 0, "REASON : " & ErrorReason CaDebug 0, "err.number : " & ErrNumb CaDebug 0, "err.desc : " & ErrDesc LastUserMsg = "VbsCaRaiseError()" LastLogOnlyMsg = "VbsCaRaiseError()" Err.clear() Err.Description = ErrorReason Err.Source = ErrorSource Err.raise(vbObjectError+219) end sub sub CaDebugPause(ByVal Text) on error resume next if DebugPauses = "N" then exit sub end if dim X : X = "" X = X & vbCRLF X = X & vbCRLF X = X & "Custom Action : " & CaBinaryName X = X & vbCRLF X = X & "Defined At : " & CaDefinedAt X = X & vbCRLF X = X & "Running Mode : " & CaMode X = X & vbCRLF X = X & "Product Name : " & ProductName X = X & vbCRLF X = X & "Product Version: " & ProductVersion X = X & vbCRLF X = X & "Product MSI : " & ProductMsi X = X & vbCRLF X = X & "Extra Log : " & LogFile dim T T = "DEBUG PAUSE (VBSCRIPT)" & vbCRLF T = T & "~~~~~~~~~~~~~~~~~~~~~~" & vbCRLF CaMsgBox "I", T & Text & X end sub function CaMsgBox(ByVal BoxType, ByVal Text) on error goto 0 dim BoxT BoxT = "MSG BOX - " & BoxType & vbCRLF BoxT = BoxT & "~~~~~~~~~~~~" & VbCRLF BoxT = BoxT & Text & vbCRLF BoxT = BoxT & "^^^^^ End of Message Box ^^^^^" CaDebug 0, "" CaDebug 0, BoxT CaDebug 0, "" dim Buttons, CaMsgType if BoxType = "" then BoxType = "I" select case ucase(BoxType) case "I" Buttons = VbInformation CaMsgType = msiMessageTypeUser case "E" Buttons = VbCritical CaMsgType = msiMessageTypeError case else on error resume next CaMsgType = cint(BoxType) if err.number = 0 then CaMsgType = msiMessageTypeUser or CaMsgType else Buttons = VbInformation CaMsgType = msiMessageTypeWarning Text = Text & VbCrLf & vbCRLF & "Note: BoxType of """ & BoxType & """ is invalid!" end if on error goto 0 end select if not IsCustomAction then CaMsgBox = MsgBox(Text, Buttons, "TrifidCamera-1.016.0004.0021.msi (CA LookForMaximDl.vbs)") else dim MsgTemplate if Buttons = VbInformation then MsgTemplate = "[1]" else MsgTemplate = "ERROR: [1]" end if dim oRecMsgBox : set oRecMsgBox = Installer.CreateRecord(1) oRecMsgBox.StringData(0) = MsgTemplate oRecMsgBox.StringData(1) = Text CaMsgBox = session.message(CaMsgType, oRecMsgBox) end if end function function VbsCaPropertyGet(ByVal PropertyName, ByVal DefaultValue, ByVal PromptExtra) on error goto 0 CaDebug 0, "" CaDebug 0, "VbsCaPropertyGet(""" & PropertyName & """)" if IsCustomAction then VbsCaPropertyGet = session.property(PropertyName) else dim Prompt, Title Title = "GET VALUE - """ & PropertyName & """" Prompt = "Please enter a value for the property """ & PropertyName & """." & VbCRLF & VbCRLF Prompt = Prompt & "This would normally be passed by the Custom Action and so is unavailable while testing!" if PromptExtra <> "" then Prompt = Prompt & vbCRLF & vbCRLF & PromptExtra end if VbsCaPropertyGet = InputBox(Prompt, Title, DefaultValue) end if CaDebug 0, PropertyName & " => """ & VbsCaPropertyGet & """" CaDebug 0, "" end function function VbsCaCadGet(ByVal Name) on error goto 0 CaDebug 0, "VbsCaCadGet(" & Name & ")" VbsCaLogInc 1 dim QueryExists if left(Name,2) <> "?:" then QueryExists = false else QueryExists = true VbsCaCadGet = "N" Name = mid(Name, 3) CaDebug 0, "This is a query to see if the item exists..." end if if oCad is Nothing then set oCad = CaMkObject("Scripting.Dictionary") if TestCustomActionData = "" then TestCustomActionData = "1," & Name & "=" end if dim Cad : Cad = VbsCaPropertyGet("CustomActionData", TestCustomActionData, "Example: ""1,Name1=Value1,Name2=Value2""") if Cad <> "" then dim Lng, Delimiter Lng = left(Cad, 1) if not IsNumeric(Lng) then VbsCaRaiseError "VbsCaCadGet()", "Incorrectly formatted CustomActionData, first byte is not numeric!" end if Delimiter = mid(Cad, 2, Lng) Cad = mid(Cad, 1+Lng+1) CaDebug 0, "Splitting: " & Cad dim CadArray : CadArray = split(Cad, Delimiter) dim Index, Bits if ubound(CadArray) = -1 then CaDebug 0, " - No parameters passed" else for Index = 0 to ubound(CadArray) Bits = split(CadArray(Index), "=", 2) if ubound(Bits) <> 1 then VbsCaRaiseError "VbsCaCadGet()", "Incorrectly formatted CustomActionData #" & Index+1 & ": " & CadArray(Index) end if CaDebug 0, " - #" & Index+1 & ", " & Bits(0) & " = " & Bits(1) oCad.add Bits(0), Bits(1) next end if CaDebug 0, "" end if end if if Name = "" then exit function end if if Name = "?" then set VbsCaCadGet = oCad exit function end if if QueryExists then if oCad.exists(Name) then VbsCaCadGet = "Y" else VbsCaCadGet = "N" end if CaDebug 0, "Query Result is """ & VbsCaCadGet & """" else if oCad.exists(Name) then VbsCaCadGet = oCad(Name) CaDebug 0, """" & Name & """ contained """ & VbsCaCadGet & """" else VbsCaRaiseError "VbsCaCadGet()", "The value """ & Name & """ was not passed in the CustomActionData!" end if end if VbsCaLogInc -1 end function function VbsCaCadReplace(ByVal Before, ByVal SymCodeS, ByVal SymCodeE) dim Pos, LeftBit, CadVar, Value LeftBit = "" Pos = instr(Before, SymCodeS) do while Pos <> 0 LeftBit = LeftBit & left(Before, Pos-1) Before = mid(Before, Pos+len(SymCodeS)) Pos = instr(Before, SymCodeE) if Pos = 0 then LeftBit = LeftBit & "SymCodeS" else CadVar = left(Before, Pos-1) Before = mid(Before, Pos+len(SymCodeE)) Value = VbsCaCadGet(CadVar) LeftBit = LeftBit & Value end if Pos = instr(Before, SymCodeS) loop VbsCaCadReplace = LeftBit & Before end function sub CaCreateFolder(byVal DirName) if DirName = "" then exit sub dim oFS : set oFS = CaMkObject("Scripting.FileSystemObject") dim ParentDir : ParentDir = oFS.GetParentFolderName(DirName) if not oFS.FolderExists(ParentDir) then CaCreateFolder ParentDir end if if not oFS.FolderExists(DirName) then VbsCaLogInc 1 CaDebug 0, "Creating Folder """ & DirName & """" VbsCaLogInc -1 on error resume next oFS.CreateFolder DirName dim EC : EC = err.number Dim ET : ET = "0x" & hex(EC) & " - " & err.description on error goto 0 if EC <> 0 then VbsCaRaiseError "CaCreateFolder()", "Failed creating folder """ & DirName & """." & vbCRLF & vbCRLF & "Reason " & ET end if end if set oFs = Nothing end sub function IsDos() on error goto 0 if instr(ucase(CaGetEnv("COMSPEC", true)), "COMMAND.COM") <> 0 then IsDos = True else IsDos = False end if end function '!!! Obsolete functions stubs !!! sub VbsCaDebug(ForUI, What) CaDebug ForUI, What end sub function VbsCaMsgBox(BoxType, Text) VbsCaMsgBox = CaMsgBox(BoxType, Text) end function function VbsCaGetEnv(EnvVar, DieIfMissing) VbsCaGetEnv = CaGetEnv(EnvVar, DieIfMissing) end function sub CaDeleteFile(ByVal FileName) VbsCaLogInc 1 CaDebug 0, "Deleting """ & FileName & """ (if it exists)" VbsCaLogInc 1 if not oFS.FileExists(FileName) then CaDebug 0, "It doesn't exist" else CaDebug 0, "It exists, removing it" on error resume next oFS.DeleteFile(FileName) dim EC : EC = err.number Dim ET : ET = "0x" & hex(EC) & " - " & err.description on error goto 0 if EC <> 0 then VbsCaRaiseError "CaDeleteFile()", "The file """ & FileName & """ exists but couldn't be deleted!" & vbCRLF & vbCRLF & "Reason " & ET end if end if VbsCaLogInc -2 end sub function VbsCaCadGetValidate(ByVal Name, ByVal ValidateType) CaDebug 0, "" CaDebug 0, "VbsCaCadGetValidate(""" & Name & """)" VbsCaLogInc 1 dim Val : Val = VbsCaCadGet(Name) dim Pos, ValType, ValParms Pos = instr(ValidateType, ":") if Pos = 0 then ValType = trim(ValidateType) ValParms = "" else ValType = trim( left(ValidateType, Pos-1) ) ValParms = trim( mid(ValidateType, Pos+1) ) end if CaDebug 0, "" CaDebug 0, "Val Type: " & ValType CaDebug 0, "Val Parm: " & ValParms dim oFS : set oFS = CaMkObject("Scripting.FileSystemObject") dim FailMsg : FailMsg = "" select case ucase(ValType) case "FILE" Val = replace(Val, "\\", "\") if oFS.FileExists(Val) then CaDebug 0, "The file """ & Val & """ exists!" else FailMsg = "The file """ & Val & """ doesn't exist!" end if case "DIR" Val = replace(Val, "\\", "\") if oFS.FolderExists(Val) then CaDebug 0, "The directory """ & Val & """ exists!" else FailMsg = "The directory """ & Val & """ doesn't exist!" end if case else FailMsg = "The validation type of """ & ValType & """ is unknown." end select set oFs = Nothing VbsCaCadGetValidate = Val if ValParms <> "" then if FailMsg <> "" then FailMsg = FailMsg & vbCRLF & vbCRLF FailMsg = FailMsg & "We didn't expect parameters on the validation type of """ & ValType & """." & vbCRLF & "The parameters were: " & ValParms end if if FailMsg <> "" then VbsCaRaiseError "VbsCaCadGetValidate()", FailMsg else CaDebug 0, "The value passed validation." end if VbsCaLogInc -1 end function ɔV5iS&CeM= BJ*W co oߓ$Ыxo1lgUyHԥw fk[ⴈJVYcL6l2 Fm+sY$rl1%)k~!E l*WBCbHH0mbSF뗰:,**d-b~y:o#M$ga(XϦMߢ7T]QE=i&6ѩ޼}oɲdɕozR.\=i1P8f96؈W4^rc=~ec=H%}x L|q2zLRyv܆YƳNw7^IYou`P|K}o]jv_{yiʅDW2TTqz@gl20Wڞ@"KPk,W d4 tZw+`-Z+"C_ZFs;HRY)e~eB5S%_>aS{YV?tOX/tLPAW` 'EÓJ>}0!K&% # x9z{>eI$_=8jNY6ebXP(sKFHC!kW/+F=A؉zΡ3}ȯov Um7]6:kxrִFi'Y0<|i~}zc|+=`x ۮe>ּ%d ȏo:|'><+.hLNMc17̽s3I6'Pv->'wAuu:W64t)ɆNI8 ٧_~ݙٶє ?~E8)|b$4C7ƂCgɀn8ZiFͷS,07yN>$>&Dv &a.Y0PK}fy6_b* rTrifid.VerSD]cd`ia``Pa fd3Y ś,eanT:&Fy "qF^ +PlUT FZFeeDZmo\C[RDrAASزQOnIn}wމ>3ܣd(Q gӟ.ZWEFFZZMWONgtUYZjϯ)ջً'p2U^kUڥt$.=nҾk]j[nJU^fOqSEoNo?tu殳^׶0Maq{/o6Ai>aà :VfJӿGώ'NOFO'p|7>aN_|2:G G5?=ۇOG'SGuffݙznZ{=~4e eXkc@˥UEպW۔z.ugǏ!hibgbdL;:;n|WC=ܬ[;Ľiw++RSfZw:LnʭqZkխLQMS9]zҭZ@)^ڔyb`[EX,>RZf{Mylt; 6+SV|];_ MsK[5f+K"-H7:7uM.X!Օ[BU6$nˍFTJ~Rw-@såV7LhP?)CpV~K76m;MC)F*N&'3_[TWӳG@~N~ᰄ/߼8?U4֭/9$ju5`mV._TZ60EIEoZ$hRt5ZrFPNuym&VIKA򟽧StXq(K\{ D]{t۱E{YtP',%%> 2?`-SMPZ;ې\x,(+ӶP{HUFd3tM֊@8(-f1 r(KRb_ޓTiPh5:`vpy P4>nԵnHh"(Sg`Is u:[ $nȎG΄̏t#J/PK|5.jU XD rTrifid.MMSD]cd`ia``Pa fd3Y ś,eanT:&Fy "qF^ +PlUT mE{FjeD[msڸll{Ma&IʆIw3K8OZv(,ْ1Ҥmv6ӗ`HG7e`227S*j'28:ʀćVI& @HD-g*#czeOq4LCݷ|i[bNύb$$C=Xx|= XqBD ̒th1)!w`&1r%G6h7.8A}tXD<Eĕ^< U|q<2\7g l/ģ@~_X8ﶭB9hq(~g0vg? ̥9}Hx A#0pGFm2M;00dʳo ݀7 S =3( KuknMm 2/GGŢdKّGa@g=D2@.U~;aړ"4g c>XP~ WVе=}u7> .];7sXivο*߽NШPU+1_i+Ƽ+q'Оj]c+س kE{vzH9Te6Ye;Dn>K\UzUu',I:!"aX}%ǚ@[9cʷ;}u1 䫳; qZyCTܺ} b=%mzI@P!]vr0 Vc>"06o:`J,V#/ ɋh lc]KZƈ5Wv2w;b&Xn/pBfNNKdvS&1U3^-Ћp[g-+N]k_oX7Jb?1:9@75~>) ;^-TS$Yյ%|oK+4OVbOK4F4OKKbIxϔ[H u n$s:G!#ר+3`K7idYG)Уm,)Rc kʒ ƗoUCCJtVP$LC!gmndO_365C'/OjߛL oTATȥN OEq zgC&9IBO?:VkvFMUG(fo})k?FO|TdpLӸ83H(g"u'D~K8N&/K`ZY[T+JՌJyx>Ľ7 WQ*pm." qh>5sXdIxg4Nx8BbX>Og~RKO(M%V6=ԗS(Fy{;@{%VsP?g1I2["C >BLbʌQ"{$Jmx!0ۈfU80'uѲO/ 8V2v o2ۧݴGnwsou^qy{>̭8.+N0Qs%|cU@碀"akr2 L. ݫt(aNpE[H*-7N AY#$ =5G9b=ty EBA.##5QEeukslTDn4B.zB,}<`|ȝƭt_x9^#p}!No6`L(39P$ l kF/\v1"{3 3UF$tk ә8G=m2 V?vla= sI'gFnLf&^ȜF{o?m | {g)ΩءoܰrNlcrkc~ cZ 15E xס]<?Ya, Ψp- t 7> v/8ǬQPA _9?E"i&+˿}DhNvJYyy{jJ߶٪+%mYWe%!?9f-dEG~Q(WDeT D:4+QoYNϬa ޹~^s3mNJpkn'^D?V1Z[D-zf/KLN~xHWQ,@ZUo(X o5ܽ,%|dEufg[kq}PsYRE5Upo^-!6,Mt% sjO-gk;TK7O|;\5ԎyNϲLMbnSl!)e[qMqCϑ6uLÕ:nδ$8$\bp$OY]PoWWϟ?ߤԎbtϱMS 㙶\iwjw)+9]jֲ6;9ڶg]ؒxƝ"n5+S UMdՆVBG?9#sϧ7O6l=7 LQO̽Q)exiS@z'ׁC@p%POF|vr̟2H.`.e45ElTil3iwnO2 *Vv t%'3pfju֟LVvܧ*zKkBcԄ<ΛK1Q~w9 h%tϧs;rmGa1׷G.|lw);Vt`]6.6;,CS@G~߯.ŒE8Pg{4xiYI2˾[bY.=:jp tDa U nRU//WԵ9Z!yH!@ߞP1d$R=b>&ZEhHp7c߿ )& p'`H'qHF]M vi R^fK|hijԱ CL ;έY79PTV:d-k-(Ai$j$1N}&IA][< Dۖ/c #$uLi={fs>fGki-Ա@mmR&PyY7%J<("6 .;f 7Ն)K;xqwZ41ƇŔDƶxhF5^_hd }v8 !nO i%(KwD(7)G-/ 70@ShKPW[fi 1}'MԺ{V؇ޘM@S٤3ڂS?FO]K3;X˰k{)-BY ݀JQ4mHl^ǡ?} ɣ:K<][Q4! d >pNA4 wn j҈i4V 9d$ЋA|*!D^s8!h Y:abgW/ Hl{8`V0\ګl //V?gLq #od|?i=vի=F#-o7$.͒f%nQ~-50KK@P#//˻?8%I{32K,4jXx+: 1ۢ0}ERהR&"8%8L cjvY1#dԝ* j] T#WQh4tn_dn q^]{gG13~%[S{zC\BǼ1vPKGu?r죦hLHp"ݝw}'/MGB,!y̳eRU3|oq-I,Cs5i'2cŝ7mhRa3\m}ݝ g'һ ?8 Ӵ =~y7kU;ߚ«C^ p_9$sss~5?S_ȗ&U]'F2dOkFJgd(;3>T-1*+Pvf э|7[poMky+Mԝ%"~YFzM"qkx>Fݯ d}1 yWДmYkk;ou{׿=;PJPKfy6` rZipThese.TXTSD]cd`ia``Pa fd3Y ś,eanT:&Fy "qF^ +PlUT {F{FPIEsLNMUO/L.MN )LLrƭ*2AaEx嗖 O/H- Q6,H-N PK |5.jU XD  Trifid.MMSDUTmEPK dn6v ! YR.MMHSDUToOEPK }fy6_b*  Trifid.VerSDUTFPK fy6`  %ZipThese.TXTSDUT{FPK!&88vv8Ȁ88__d&d&d&@vv8Ȁ8__8@vv8Ȁ8__8@vv8Ȁ8__8€8܀rv8܀88<<<(< , Z <(, P n  , , , P n , {A3 (, x, , (x,FXFXFXFXFXFXFXFXFXFXFŔhc//////////K'hdXFXFXFXFXFXFXFXFXFXFXFXFXFŔhc//////////K'ɝXFXFXFXFXFXFXFXFXFXFXFXFXFXFŔhc//////////K'XFXFXFXFXFXFXFXFXFXFXFXFXFXFŔhc//////////K'ZKXFXFXFXFXFXFXFXFXFXFXFXFXFXFŔhc//////////K'ӫXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFŔhc//////////K'roXFXFXFd_}{}{}{}{}{}{}{}{}{}{}{ԭhc//////////K'XFXFXFXFXFXFXFXFXFXFXFԮO.///d_XFXFXFXFXFXFXFXFXFXFXFvs///////////////֯XFXFXFXFXFXFXFXFXFXFXFvs//////////////DXFXFXFXFXFXFXFXFXFXFXFvs//////////////XFXFXFXFXFXFXFXFXFXFXFvs//////////////XFXFXFXFXFXFXFXFXFXFXFvs/////////////XDXFXFXFXFXFXFXFXFXFXFXFvs/////////////̠XFXFXFXFXFXFXFXFXFXFXF˝pmpmpmpmpmpmpmpmpmpmpmpmqnkgXFXFXFjgѨХXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXF}{YIXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXF}{~XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXF}{ĝXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXF}{d_XFXFXFXFXFXFXFXFXFXFXFXFXFXFXF}{ǘXFXFXFXFXFXFXFXFXFXFXFXFXFXFXF}{ݝXFXFXFXFXFXFXFXFXFXFXFXFXFXFXF}{ܽڹڹڹڹڹڹڹڹڹڹڹڹڹڹ v{ Pbn8^utNOME]2E! #$_\fjxhqsgov1X$,1X$,1X$,1X$,1X$,1X$ 1X$ 1X$'QMQOOPQOQ1X$gJBBEBBA@E?H1X$  1X$,G[\^\][[]a/(1X19a1X3 >g 1X1^Ɇ'1X4>1X0!1X!1X#% '1X##  '1X#!H '1X s '1X$(  '1X%  U1X$z;1X(F\ 1X$  41X%wzz{{y #{zx|zz}zyz{x 1X%l R%1X% "O1X%3;7<98<N1X%@aL11X' UMOn#X(NQo %X(rLSn#X' D;N\!n}"X$N>  #X%0P ꑡNXSp$X$ h΀M .$X&8;Vl$X% m<$X% qK8$X$`'VX# 9?;yxgX##o a =fhd'2+,-,-,/$tX E"`] IX!* # LX#5?5! TX"5. SX" OX#} [!!mX#%   X#A|j%  X#"_CZ &1b X#!D%D m$X#!H(D pF "X#!H'D q  "X#!H(E q t >FAc"X#!G(E p o  "X#!G(D sX#!H(Do"ouvvwuvuvxoX#!H(DpIX#!H'D qjMX#!H(DpT؞hWr# QX# H&D p  UX#J(D oQOX"G+G s  WX# O- vUM?X#  Y^+o[X" .kVX ^]^Q/еh$mMX8;;=::=<:;=:;;:;<:ALR-jeX#MT!pX#KQ$ \ X#"MQ';X# D%A rLP-?RX#!H(D pLM-PX#!G(DpK QX#!H(D qL&;>wRX#!H(D pL !  5RX#!G'D qL    uNX#!G(D qL  \,$GOQX#!H(D pK ! X#!H'E pL' X#!G(EpK %%%&"%'##%%%$%%#nX#!G(D qLL-KIX# "G&D qNP  R"X!F*CoKQ- Rvt X# "M,F pLQ- Q6# X#4&rMU-J oX"(eeMU-)3434+zOX `]]\-UnX4 ENX6qmmmnnmmnmmnmnh b]pX9L%* mX6OOLX6N!RMX9N! T? X7K O7CEX9O" J;@C<X9($0+.,--.-%sJp<>X73$'~ D X5 LF'| >X:x$(܌X:/(X;, (X:(Y X:s?"(><4/00 X7 *(VPX5Iװ(';G X9Y uN$!S,X94$?CBe}X5 Ai$[b]zzkX8 Y.X8   E ~X6y  R[[[Z[[ZZ[Z[[\S@X5  LMRXVVVTX5* P X5 R Q X4F]QR X93MBX55`;d X: U9hX5 , }FT9bX5pyF  rP5dX5u kSHONX6$mQj7X8100"lU-jtX8ZT 9Q X8>}x*\ O X8\Lfl GX81C@X5lsM6>IrF<X7V ,@#E<X7 *)LFX6J=:,X4R  .<X5Go St:X6dQ чV?:AhX8M*nfpY  X8 t    X5cH  X8 L6   X8w01X480/X9u01X6701X8y01X8!!01Xm1Xm1Xm1Xm1Xm1Xm1Xm1Xm1Xm1Xm1Xm1Xm1Xm1Xm1Xm1Xm1Xm1Xm1Xm1Xm1Xm1Xm1Xm1Xm1Xm1Xm1Xm1Xm1Xm1Xm1Xm1Xm1Xm1Xm1Xm1XXX= ==N_Ehek{}IٹVn[IN0LWB.\z/e ᤼+MflVM&wۦP,j&M+sZA f.%PeXZ:&=0oCjb呵.ڪi$VQ%W,[fq,sm`w@SUM"չ+ieK[ +jJ6XԯdYܒZkk|'YGN6`y'Qjb0f8KrkӲT9ՋgkA-nu{+B\7a9cj[b]^Qūo]]{FƵ+ZCB6%9QhRЖf ;Y:!}ʊJNc\H%QNXטɦ{%EmnzuYrRǘʪc +JT6,kh+^ <learձemw=%5Uf6Q:%JY-1?jK[ULoUc3;!XbX>s8z`^+ZfL쪵b1݌̇fǾ_a[MԖp|בn^6 ~QWζ<~=ͺޯ헉:"Lһ GóxV̭ht kcG[fZ#^tJ'G+[zXcJX (.qg-Lɼt̻-==vƢ%'Q&T_Weca֙XkJPUKuXU^JM킎yf;[]vŸkg?Xv%5mulbvXy۵fGZTnxJ{-Ίr]ccsj!WOhS-oww]5~/Ks0$<8n3C<&n#R-?*ƷֱqxI&q-Jk mW1lryNzXyX95mab@x,9Fb^,vC'DMX45IfLm޳pz"[ /o$meNJcz(9uګGr)5byD)#R++fqR,1c9tAL$6R=6$D%q,V+Mϖ0qml-q9q,-|bƶ3T1U11Zd=&u}n;N(Ikrs tiBkb۲䛴%[yi6-gYkwZ_;ޝ`е:W5Iﻤ̵}Z`%n}k6ҵvw?Xz4-[[aOZ>;-V>},ӆhM/!^ÞT@}zq=#Äwo ﹺKҵ;--kYݻ]2ߺ6zY--k6Ni.b:6ٷӚl\ [6iѴ{iZlgxxw|Q:x%mMx.|L[Ӊzp;"eӕyc-?<)jAh;~YNJW/b𑟮Q*֊]֭iﯟ+~cZU]{w֬g ~t{ Āl9*>{F8h/'c\e1J܆s3o]5m-҃K5$)^O+fזw4U>st3;rl3`5O6߷/*%׷( \뻀( W]n[<@ձ,^춱uy7myMSCF@],N RH+b >E]2E! #$8p%%%`%v&$q'3 ?&?'p5@&n@@@ bCCBvGTWH*IBnI 2JlK vM OUPzTTUzV ,VX "ZZ[n\(4 Trifid_Control_Panel.exeP<6= Nugget_Image.exe`|5l DiagPanel.exen5%= DiagPanelNugget.exeC66 DiagPanelGold.exe5GM DiagPanelCyclops.exeW.q1a wddebug_gui.exey6f MmAny1.vbsy6f MmAny2.vbsFy6f MmAny3.vbsT1 d_yankee.dll1p README.txtU18 yankee_readme.htm[y6d TrifidCCDSoft.dll y6d TrifidNuggetCCDSoft.dllt= Y5m# cfitsio.lib n5,/ Trifid_Nugget.odl {57w Trifid_Nugget.tlb=, 4; Trifid.h,wj M4u| Trifid.lib4' 40 Trifid.odl4' K6!TrifidNugget.hVE I4p Trifid_linux.hV I4p Trifid_win.hv?[ 0| wd_utils.lib 1ʙ main.cpp %4s main.cpp_1! 1q main.cpp_2n& 1 main.cpp_3^. y6d CCDPlugTrifid.dlly6d CCDPlugTrifidNugget.dll'<6= Form1.frm'<6= Form1.frxyO5N9 ic1396.bmp<6= Nugget_Image.vbp1>6^ Nugget_Image.vbw.0% YR.icok22T Form1.frm_1}W:4 Module2.basYO5m Trifid_Control_Panel.vbpYQ5=5 Trifid_Control_Panel.vbw\4j` UserForm1.DCA4j` UserForm1.dsxv4j` UserForm1.frmXR/ȫ UserForm1.frx.X0% YR.ico_1  3 6 windrvr6.infB {5s Trifid.infp y6d Trifid.dll 36 wd_utils.dllp Y5m# cfitsio.dllUi0 COMDLG32.OCXy6d Trifid_Nugget.dllx6}v TrifidBare.hexXx6v Trifid2.hex9cqx6x Trifid3.hexu.x6u TrifidNugget.hex&u.x6x TrifidCyclops.hex?EUL4y Trifid2.ufpC50 Trifid3.ufpp 3 6 windrvr6.syspy6d Trifid.dll_1 36 wd_utils.dll_1p !Y5m# cfitsio.dll_1U"i0 COMDLG32.OCX_1#y6d Trifid_Nugget.dll_1$x6}v TrifidBare.hex_1X$x6v Trifid2.hex_19cq$x6x Trifid3.hex_1u.%x6u TrifidNugget.hex_1&u.%x6x TrifidCyclops.hex_1?EU%L4y Trifid2.ufp_1&C50 Trifid3.ufp_1p' 3 6 windrvr6.sys_1(y6d TrifidCCDSoft.DLL_1)y6d TrifidNuggetCCDSoft.DLL_1*y6d CCDPlugTrifid.dll_1+y6d CCDPlugTrifidNugget.dll_1.=#[/!W@E?UwmۤB)9KBѦ (h]u(u/{օkAւ-Z  ۮ^ǒX= ]bum"Amkr]ɘd}$<5g^t^wf)GKn>%;lg2SLk `h& Hh(؋/"^ #sEDpwvL߻[s]6מ/OWսz'vg]aWv5Mz*e10L>Yb1d<&˸ M%% $(H 4`  IS?rAFmciuZ}b%]z5yŹ]QS{~׮)n;do4~I#nH,YDzߚ:R^zHYCyV*:yi)ގoV;irjb9q^-ٙ4wgCE;>hn> tBw|@3?pu'W-;@R;FB|>ܗ>dQpWLGZ\"VJKiɺ2EҘP(eف6<}iY%yvOҧff?̨m,Ɲy<1ܟ #ZndK4,1elLUVYt#%lu/e~6tf,:n|_ue=;ƥǬ6S{˻'g,Mj͗1=_s6n"TAF[7W. Jnb]OmLܯrca72(͝^Ov4t^ ՘J&&VlBj~r]כRv[:tu:ʯxW=:-4lVKAFKwv=k۠-#̝רC}Vc lVVۭ.T.xkT7n'Nv#cCj9'in 8w'k~ӼK]w燷m ܂ttiPկ;kDcc~N3MG{boChc-QfUEFJ|m O%rUIx[&g, לuK,r!&Zt(Nf9%5rm+:]W me̺`>p_+E>kTk\G.#%):.ś:,[I Kh4#>G˛x Sw6J .x}c*B~~ viq;3-v] * koP4vvګNndD\yleyhGyO ֛tQIw߂؄FLUenoWK<ñ1%SX3I,kbX̪`j6euSaH4KS)|S*>Y jd*KE*YɩNTNTeE,kjY,e0Y̳fEէUSUEOWeUViU?,UW@y*γvgAWJ=^򘔖շ'o^͋YʭWsnYNMR,}@AhC{s*YM_=Z0^ӽ=Vw~ko(f M.+gg'4j@BjVuqNͯҦ^_SKo>V?kxm? 3!&۩1XoG)xJj\Y{Pmh)3o:Pީ<0]?RFV@WosnJњT/l񯕍%>ϯpʵ=u5a:%[oRؽ֨]+⭠-\rɴR}췯fvvgd<DHqPl)jX_8ˮl: fU^_e[N꥽K`c'{~HIs>T{V+T5孩.IdA'IF[֭{WgAS+uQ~?Woə$KV^(sL/_uR]ױPE"eZ?UUh]^Db iN)fE_VL̘LҤ++:j޸R.:S͐+rVRӛ2baYk?kuNJr.Rudx,|܅+$!{>){k5)~jdœ1{{Łd9wRIuo1ǹ7'[R7ciγhRmI'{n5Dyg,?85d pxh+m=~|9%m'wF?MP彽_[GgY3T[@={wMkUR~^ϛ3ƷߜٲP('~5`9?1YegֹЉ%G|qy1AqPb}*;o~y TΏK+֣s_{Š/V-U*`㌚EE5aOu{mZ݃JBugP8kʑ5ߦ``څ"Z]qLcƾ 6Y.r~*DwoAR}~c< ,~qkGIZFQwxi)kgWr^ncNTo#Y.#~~ RjWwoHk1`)_OA.qyԿb]#G}]1DծC~G2J^{|v>J[xR[xAnߺ ˝oJED>hbK;'VO'I`z?9,_sM~;`'>&JGZ[7/M)}?yZ=QՖY$"'~+VHV:~րG|[6Zm-+n[r#~2B\צ0"l|?`d`xj ym' U73_5Uʎ<4`5b0+k5@}k fOfz%H'X3ԇ mַw6btꢉ5UE&&%/;.涌39{%i}|ݵ{_Nh~_6ds1{yE5ScƓ.R;%P4x0=W{kxOt7ū60kUIzk/R>zi6/8~M|`DƘ}o$|#t,/h^퉧o|84>Xr5{V{:|Yӓ!uoU)W?o{n1v3Q蹇mۖʸYԃڶP, KS%i!N;@duGʟ'k-yI+ C8wsyHv Һk*T)k ^m"/Kp&i.:Zw'I:SYhKe﷧u_ *oXb(O{O^~u!(K?TUe[qܻZ֣:u>5׆*L䓗xJyaN(8=+xv>jᱏOSl9Vȿ>ogq֔w}6|eM% ZM7NoRdѭ4ԵuTl/ޤE" P{}xfYV|cE=VOu&rBCPvLxo0oe^=YL;dx>csݻ*'x6PtaAVEx?Uf>no,q[f߾~_#.6%aB&Lj%+i"wmBvU]IJ͓+UXt"܊_˸osnTi3^D cT&ŊZWgҊ| F$>!9*zqZCʫ[ A"ܸw]Bcuri5Gmsk{o6ӰUSUUk&=c^uU&F7Mf(Y{פɾRơiT)Mhz}Rei)>kiZLjJԵUuZaVy-k[r݋l[e2֖Rڶطս-ᶋ.n^noy \om{ %p\:\Z=yrIk\s_s)@\.t-%t6vn;u?K]b\Wۻvk#߳>/ڀ{G;{\S2³I7T߼N.#⭸ohU-tv7Wܺ[y9GYhϺzӘm-}ժ=B2TV[E,%:{zI#I{^xm= yܭӭ6vI褉>Ҹ*vjB-D#kwƒ:oSϕ'r{sZ3^!D  Oqgnܟ+Lcg5:ChsLcJ}y@kP?Ov Ҋ՞<%zZOqLbq>6qy+ޘG G;xVv1(?@R{ڟ ĠI@s @,[㏠pp+Eq6n3.B.֙\qlhGmvտ!UP"y jIk8L@@[ |0ۧ;JFTIITJJTKKaXME$5'M. riN6kSST?A%TXC dY!QR%RH%k2YS1PVʩ*e-%U,f1 Y̳hTjUlu*'U[(_Yγx, hZA@PlXj"+$@x-I(8  @Ј<SꟻnSz-hGBZVҴ5-iZOԂV5-zU]- k­m-kV]%}- l[aU-mi R[ڶطս- n[qܒUj֕+շ-p \U. qVE-.q\r .rM\0\8}.Y@.t]2 uVՅ.u]r`.4wD ~I%L8 X׊ ;3;n'<"5RO$JJʤNR JVZʥ^ zXL͔*bh%Q=MU,Vʦn8uS,cetJX;'X=)* *Ǩ> Ydjꨩ*EYK*NNTTEkeY,j,eY0̊fESEUOUeUWUV?iڪ,WyU*@vųg@ ZнC= 1D歉:? yca =@_.ͭhF:ZҴ1iZNz%jQիYjVXikkZ\y-k[` ƖElhJ[ڶֶŹm[p܊EXeVXŷo \Ep\J).kq\jrIk\.e\6yskt]* u*եu]zb%4hxX>"$+@:@@yl' Wxvax*ODHjIJJKKL))ĚTKbX{XMYݔbp+XcvjűO@TTB5},Q@**Q!URd)U,S5 e)RY*ʊXղYRr`,f5OfY Y7ҪU\Y/WsgY>%S2  p;!:@ @{}{PJDK*ZѴ)kiZLjjITkZkZVֺ+kZZںKZ^%lf:[ڶҵm[nz%n֫-zoz+5Vo~[%p\:\Z帮rA+\*eaWY2ͥqs\.+t]Je]g:.u]r`.vͣGZP, d @l: @}2k~{{ t:K>ޒ 4~Asl2 L3IR,_~xW#=z V0~Evz犠(6boyյaƫW%Kڤ2HٮHŤFJITIJTJKTKa˂XEM$5'ŪٔM.r Ni6kSīS?TTAC%Xd! YQRR%HkY%21VSPʕ*eU-%, fY1̒hTjUlꪳu*'[U*Ps@}Y=-X b  i[l&Ȍ|\m]\mci_[BenuP>X6J50vÌW[H'Ñ"=m<;Sުyq5`usVgvw4 #}Mh[b8)v jC-ogoov<ԩIѤ\bzqRF6p>BGj}d sXڹ|0fhac8m[k+1@$ko_Ȋ*>Mq3< `HȀT荛l;F3#mo [aI>x́uQc}=PwNI^,\Rt0T5$bd]OocF' f#9qsXm \}0rnpc$,瞔@$ga]vIz ܰs860م3&H=9ߣ ?z$f1kWB25saBcܳH_|FvƁI?~6ǍόG/MAY#Vl= u$#{{HlYB>3\1q`~ȸ٦s1EM9y|/d|c|CF I޷ԧ#9m!l> hk\udC>$=7o#r\`\D +LnBd[)YGMFF:L\dC%l\nbc/R-E8-H%?@K!'* ;BH| dm[' z<9\ K7 h4&GLh%qZrα0rk${_#/9h z' dk$_5fm@/AOjr ?#Ⱥ|K0`-2ۖo,se!-xʅLqǴ/]'Ȳ^=~pҸ[DۺsUDfA5x78 Wvn=~{[a7\]W~_eODؙ_uzڹ$FAw[޷y2okg %fy몲0ud =I/tPv ױ]5$YOsm*e ϵCSߖ 3,V:eOґ5w ׷^k'o->}rss7[u/WxC 37ױuRoCcg͵IVe[ k )yy7.z{ 02g{/+u76.}*d?Jnq^NoG;By  G[a)8fMdG {]]d*[e~ k;5)'r_FFeRzf̛q k'O$t+YNE&.dGzO&luϲ'>Ó_ŵL'E:_ }Kf/ú=a1ڏl7ɛr7 s/t,>#)&n=y`mtydmؐ:"ɎsAHJ@Lt!qlsG}Կ>\aɃ!94 'zGy_Q| Y]?n~5$YqN(:!3ܲ0_[5#߬o4줨wd->!=x K&C%u]\d9L/>GG9۶rœ,72r#|*d~tL'o5 )zsxm/t'ˬc_׿^kb&O-f+CnΑr+E}m"uOnd< { 5$YL%VH'cBDgxɛ5Eӝy%RR#DLP*TXj\`尬LATL"XTblSX94VKS)S|򩪟cyQFVʨ KT$d(TYOJAVTVŒ˳^ɬkfY4}5UUTT˪U6XuYVeuUWWv̟g9ϴ -Xufr[9vC8z̼.(&/ ߰{1_͵YV1AI.xoc{8`^:CZ2NHT13_&cUsDRuPp=zspXbvaA|̮'~ʮٍԻa&cUsDRuP08[?Xҭ]k w/7Ϻ=9p^8{iX[;f"():~k/~E p8Ԛe/kés d b<Y]{H}X\d3FO^=hva>@lfۨ5ǝs e?5+Ċ k_箚kb&|ii`;c47Fd4LM1֝QHe<0E:w]~Y5L$%SIG|[3p wss Fp_;ok&b~R"κ\G/n_w~ o&1,.=6,;wT\")f7(x'$dpT4:t^tԹ9fp=VII1A|_[[wDf\8Fױ3R ~E>| '0?pp6sUDPRo28m30f{2`@ŶuvDPRoNq>} im]Y| ' <:'\uDPRoNF鎎`z Ə9Od:0dC]־2HJ R9Ok~vK X9Gd%3ηɆ3v][{f"()7Kf`C8~s1s Kfo g캷vDPRoNɟ 3v -Ⱥ6aY2#ےCd7n]H2 JRmg[0Ϯ9#җ?: d5;88;ίzk %uaoeks||?~x[a:| NwsڧI67G|~rasp95 웟,n#}$X;3Jmje-7Hg#"oC afqm]v]{{ ~Hvh,}ג^cS"6k\ɺf;έ6%[sH<5{ݱw_ +E_SEskzL$L4xo/FJBmDs-hZF:i1NzZԵ%QjjYXVki\kZ-ky` [ضƲEl[hJ֖Ŷmp[ܷEXeVXo\ EpJ\.q)kj\Ikr\.\e6Źsytk*]tJ].uk˂]Wd5&8!r$\Vs[`"o]$V=Wpkم6"{1&^=2{a*/qco(7UlW=;$LFA-Iw"o]/,{fl"۸y *(:HGwCwg~$YORd˿p{^=DΑU( =) =|=U;WoI6xs(/Ġ^'r}c0*{3R,L%a fTkǷtUW=\jH[S:Jb/q`5vf"p7x-l)9ꜬW=\*>V^lv=& qaj8=Vvoia؛C\jHzY7,zC1f/|{]m~4a;.[dD'>^o+몵VI 6@z$VW:g,+}aGr_G"#E Xz\;d3a$oou7Ӈ z"6G9@. - ^Μpcf sL.,Þ@6F$ӱ?W몵VI6(F~6\0Kr 9 gŤp@uQւm<F2gob~űÐHOi8pXXLX3_ 3 ^r&PF/iՅu$*뉫 Ǿ-_%9Ÿvy}5 "6팹?Vo[|S|q.\%gu.\ H5$YLk%hJxG _`ra]}7an$n͒<_"DÎZ`r{kq m*1d}af#kr3IUGךkb&ޤ Ie۶·i&UoTalVazM;تGFv!z7,ۡcUOךkb&}K~$%$'.98AkgbF`'_\5$YL5qVCjdV]^=C*;dz]rJ*7G7} /"UsD[ʿcdzğ/L'M\K+^|Ju֍2``wR7VlUW RoH2qsJ{a3._{pl.vJY_:V vJ~5$YLV^zS[8=3n??- cҵKG?X}Kl˷+jHx']\=Jgk, ٌ/Eq|!d/bBBJt/B]v≤uտوKܰd3KʑݿYtAȡd_:\kQYdpUf UJu|H۶؛q3T|UY5L$6J$Y0]޿ryC75Iǽ# \䠫G\X0 gʶԬrWY3^csU/F›'ҹ!NrG%8CC=" DhvNp}qatï~Wtz%.韠u$N@"c|xeeVٍlKܟHmWſ@[|# }<I*SW+":PqDw:W7vY jd*KE*YɩNTNTeE,kjY,e0Y̳fEէUSUEOWeUViU?,UW@y*γvՋ^s}A ZЌ(UDTLҍ"pʱ<ISzBGLrɂ}"Ïw [чVY2Fμ1"i;ǓSp[̱pQ5D r|qa a" oPP.$ټOt,^ȼ5݇֏-DO M)oݜnړXpݽn9I%M~káR#IsBܚB*}eoNn&,=hۀrvO$${@X<3 ooAvN $\G=3gU2ŵCO2Y/CpˮYm>DRq?O-_:!d&'qi,Ʋ$d93]qmאq;3;[NDH1cWzM|qאl;R$s,8'ǐ fbs=q?,d@~DxK>g d\1غ8&$Ή1$:ңsbQ|=Iz4?"ɉsp )+`w,D:_ ຠfIH2cF;qR8[)[/ɐs" piB~nNo'nCBU@"ɉsp 4B]͙>o`oCkW -~0jn>aq},UK\:RzۭdPXɯ/z3v+-hZF:i1NzZԵ%QjjYXVki\kZ-ky` [ضƲEl[hJ֖Ŷmp[ܷEXeVXo\ EpJ\.q)kj\Ikr\.\e6Źsytk*]tJ].ukj]eKUo&uj]DI${8@!hi9<- NNOxD*jHIJJKKL))TbKXX{YMbp+Xjcv<ŊOz>ST@B5T,Q}@**QR!)UdU,Se5 Y)R*ʲXRrY˳`,fO5Yf7 YҵUY\U,gY=@P t}CK VX$E$@@&h:@ |3ɩ$zs-hF:ZҴ1iZNz%jQիYjVXikkZ\y-k[` ƖElhJ[ڶֶŹm[p܊EXeVXŷo \Ep\J).kq\jrIk\.e\6yskt]*t]J.ku]j^d5&Q(d@$@ ml :@y vz<z"URR&(uRR*,RR.0rXæ d*kSEM,bbjeS6u©ca+S)>TOP UP՚*~eU*, gIVgq*ʫWtֵ,g? Z=S+c(W (H2 : @&},A=>wܦKZD*i)LkjZӵIkjZTVkZkZ+Z׬^KZض±%l[f:mnz[ܷ%ѭn-zٻ+oVz5o[~%p:\Z\A+r\*eYa2Wsq\.t+]Jge:]R Z]Z+v_=,)DYQ,I7(@2:@ @- {.VJFTIITJJTKKaXME$5'M. riN6kSST?A%TXC dY!QR%RH%k2YS1PVʩ*e-%Uo_KUWC(Ƞ"@m0 =@mJ&6Sf^L;mGw?Mjqw@$,#;A1<6I;}iNr~{PLR52\=<\-7zu^>[ f7j=c'=?}o5k4=I0E_rYQz&T[sB>K8(nU$iVu*)̯8Ͷ(1ʼn_E݃qzJQ{I\~Z*c)+=b婚ijxHcRֻr^eћ ԒKrj~7>IzůFO ),;U5i; n^M Yˡ55h>ў~_WsӖu0a-zIqFXߵ?zR4«t=B8:RdKy'nƁH5ؗxmD_U2ϖ녝sXRe[OR+8-kɑ|le?ުp|.pn_#N%1HxD s[?pt4[LN/;[ۿ_Tnq)dkדPOf~gE^p!ɗ#|bj:\o5Ns5@Ȣ5pmL2onFjIb}O.{IjGu%Լo}{ Wgt4;ɓ =cfلO{{Pp/e뇶F3>.f<1CmcZ*t#ES=y͚oti~IyN7Ϝ|Jgkw7(f2߻1wE1ϱhP0k.o ȮpF3bЭ8,E&4V>4x5YH^xY J-!.ʅEwEM&qjUmjmcL X3abܐ3z-ZDhol!#) Rߝm;T2O3O+2dAԠ*B"p**M,PFxR!96f=5828fG،}C3ɽ!&y)?3+2)%-V޲;tC4},~7nOa/^I[#aoꉵl|qpa|ؘ=N6cmSC%k'GΖ^SͧLN{ݔYvg;UmyO? eڰh}7~ybP4NO-?weW7)XqmWbݞ]|V?5W~NFF٦֭=VLTH/_˙dwWDOXmJZ2?=%?LJ, '6n;$EѦ7.Tˇװ̳}㖠xfYxInNS0qbd*ub~V7~v}`7,QUJH’A m%)լ QJ4C~/xciukPv_wys~>v~Cf}0!~oЎ߼K=D=#k 5coޘ~W?PmzU?vqq_qu}po[I*Ti' <gt4{A:\mr+rҿgmOaSez['?ڑekX#U8=I1[62ޯK(R1o\6('`XY3$FNE.vW8) i͚_u;C=Z)CE q/^)nF{0*7 ٕx^4*ї 4fE&fO+v%ͷ?lj .ǝXspG [@ k}яEYA] ˑŽNNŃ^&m̲K7o=c\1Q.=W ~,<(.zztmRq,&aܼUP΄+ϳ']:*ޯV܍(̯UIPax%Tf.ЀէC0&(/'??6%P%=-wr(Gp ^7wM/Nbx׽S7g82>nSlwߠ!kfVpkzO}CDĂey>+]}y)_4 ?<іSaPwjjcu4:\{[=x-TkN}?ą bNs%uL;4&e_ѦͽQԍ1ټV_Q},mV.ltƫ\ujwDK'z扎D*kС4ϋr÷^hY#ձ'0OfIXdЍ24Eq, ݻLpGMݭu9l>>xQdW ꛕ-ҥ>^rW;V~5mH!߃[5vl}22SA5W3K"Gqq챂H8=t#~حv+O-t!0Uxsl.wɵn5|k{9v`6W!Ro?ނ>n3}'64ٻ}V6AHy_}sE?i|?fY(]G;zq/ةc|u#/dO%?(v|k,1|kǯ(v}`a.be+[zPTD!x\OMegm"9zg^7t$~U>ǻ'MՈƫ|:Ʈy?x Wܒ6~{\$/C]?_כ>wo3)tʼ'y"_*}gǝ|NGrw-O"qeK}3Oꦎ~޻6ͳXFȠ'̘Wꪃ8'шp@_yuxK?hVk;M7np_)l}ۯYw>kcYs=e͌sEr'_ )/wuݗ+j?8Smi=7XpBn%٥q@<s/߿"&FNۯW|lV1˖x>[wj6z|ygԟMx V5mYgq/Kg2ӻX,{bVx{7ҵ4Bp>eeJL qh{=f{NY,յ-ZwX.SUg{mv9mw4liUY5nf-uMHZNZtJ(*4Q;ٛ(vQY<~ؑ{}N9:]3h6zh_'m6wcy6SL8}m9SU3&k] ed3KDnٗ}-y7֘,IaJ,2e7~"ohݛb7_Z:X?S'G/u;VUg uK~m̋ Me'<4]:˫܉3)!9jGcˏ}&ښ\@s:%k2hf 3vO]L_F?zNSR^輛<_~(Mx5s?RDXrg-s*0R.SKxlbrT.Xֳ*)?;fS xɚCа)NNMt;gS,k}wSd+L7\_wIA>Wbr(o"ԭ9={2j2̐~~͚k}ޮ1֮rN=𻯞+Y.;j}΁jΟ͗Pyө3u"OyZ8Ut7zT?FUAߤckىmc]2ݥx=/u]x޴U<>+Hydkɛc G;^ Cu6쳌(`2ꮒoZ&^Q"3sSѰצKP^oIQw&6룙uz`,Fuʌ%DP0`FYe]~Nthxhr 4goFV۟;Z2ʼ#٢kvh.ڋhȵՄ"?Ti9HD:ꭞRZ)4g}tq]Fu F t;+=Twa0mXv晨WTta~FKoo꣣ vV=*;w/Kww2UG5҉8V jUo޹j{IAu>;nJڪLzzWzGR=}I~GE]yΤHk\iwohnJjx^\ZWST5جR7b{S`ohhi6Fݒi-\Gg"ڗ7&{%'c#,Ww涡#3 P圽_5G^Movٙ׼|~y>m~۲`gvڬfꯋl:w C`gaO}A-sWGk T9QgO9,>yrUTK~_'FQ{Y{a&m5ZQ'X+Wp.v *7n/~籼bτ#SjVn36DY|udn&[ݟZHK}4JVΑ(uȒ4/b#ROOJV,(iv^DJt;£QX-(VפԔ%,qh-ɰԕGz't~,yOχ9ڋg )VRXԾ/6{~E-M5TWk7˚l<[WBϚ\GF;Rz'^2K{巇*h{prwi։?SmR?@QZ]֪\Ao>iS|-˖.Fd%v%,og,VpԀu[ {)ݧub33RKi/>hMIR-8ډ| PXx[œӆR_ޑ E@]_Y\)x:}o+_2](OW-]H_n]:.(%w&3| ?*9wꬎ^{kI9Mhm8E5ViH_u Y4>xj_=w?1tqW3^/wW 'N]kԳYzP^v{{wԟK4M͇<ϭKe7-n?5FD0>ugpI#ڰ_ziN?gguI/4ɹ'W%Nճ4NZA[*pވOn;JͦF e:]6h鮬jܕӷ ~,S:xEk1i2o8{'ڡ'+Lo-}t z_NNOt]z"K:lׄ$KtfS;kصťCFWw2OIv:;h)T>c%aWKGxc;>'k;KWd%~(rIg:ro_TBm'r^INP}#~*۔ayk׼6/$+ي^_/ɨ+:8I[o21bޜ혠 +4UX,9N?x=d8+*'jIt(TAGh4R253xFhɡfnT͇vU*mŬ^yYI)*&9li02 Ta,522p(: |M4_nJ>%p%R⥫QFRnW l:Y<0\0 e_6][Zӑȵ*\ku:b-Ǎ<ߢN%B.dԑXq\RNµNlxjNnjGY\-IPT'[~nZo+?S7c̈Sw9 ^pPїa.R.r5>L7Jtz'4ZxFz{gTh3ڦsS+]m $Na M|Ӓ^U9:*1a{`r^1mzj+9IDQ3}r045Ǻؗ0 Fn{5 j[>ͫ5Ӿ5 y-ym[ CAx 3HR{:V%l}[*#35ItI\$ֳ-^!gR J[jac]Hvl#}X-g{q,WeUrvšY]`U<_x+m~&lz~7ߺCH&u彥8­J޺Hŕ\685nzu=׿c7(f?/q0I?`8:bA1?>=,G2PI_t:mb^1Ir&-ĵ~Q[5!?u&z03G'jb^s J~$i/GLЄWw)fר= 3pAbUܶxfk\GM.'9(&n/փ~U.˚/8AR~;F}bD%~ JU":r7`vhrHyg"ZGiR4[:l$4+j<xz]B*hpF4vW}:y,f(,6pk_kyP둀ϸ0nj[0x+ W{pa8%/{ QN`'pܒ$P\^jԃ}lJ s1\Jwlse馡ˏb w1:$ M;$FRƓrٞ8\ᾛZԴwWNĬ1f~i%.Z}[_mk`^B6kd%O!UXTvS:FGmkNS._l%OW+ndf[$Ͼ#FxuWN xvNWr*:ttltW:,F,LOܤ!Z;\QӭºQ&oLnUQU F(aT{ҝ )jQv,{bqemQ5,{rؖ:uJ։T4sa5J uN!DSuOv((fnQ T15tI8Dt͵((wߝrvS$r퓝R~tԲJw'P5TJYҮͮmK[HKNQ(J-~>oged5[DSը"eM"QJ*t))M9Je)ef@ur9D*)g6*kv}NU5-UzJ%x(<<( J jtG+x Jxj+m*;&£@EJy+xMYG-6QV*eRȣ⊔QyL.-EV a/S`4JeXiQOTթXT"sTDDW"+y?e,Qɴ},RKN+(.܊36a}i:m/ʬXYKl O44FJZvRR'Jk]"KYhJP*"ltoMۊ0#mxДZ:wCDeQeO"xuTXDr&ɤOi"SW{MK!)NG\٤`)aR ٱG#ZoꒋMY]Ku=lډDYh0馘N'[Q] )T#Il9Si)in}~0VELη뙀>DS gAi]_8`}=,="9&\-5iGEy =Ou_)jJ}W⪔'Rj*e%*jatJY9Q+`ɾRvNm*M5}q6KɊH~cOKcHO!]D"NKݮ)*죚"(۞8 c"= ~"ZAlEI/_se~&r^_~|i|{zja*J@;I6%v(vf׹:זKRkuՇ=5P&JN}k7V_ƊVPyY~J̠HR;ŕ7 &SRjvhρkx{ –؈͝K]JSr7Ev{2e@))Eq&9>eaSٗl`OS8AlYy՗-o˸k[)T@i@)Sg)O]:O!0<'R"ʣjLK7uK3(v7,M/ѢjDq&:TvKRmT;C &*ٝwsKFoU4e2D&M4g vӣֵ&"]TGRE&uSVD5%IB,%:q妦'Nk)#yFҙgTSTG'JuxDɓ#SYImUuJkf֣OrOYM)NP+ӕG-fI< MRgB5+5o ;.okul|Nzұukp0P[檽LYBlri87|^7w~.yYemejfMyfnxn[S zKSޣ,ۑDޯ[*tET[=IgݼVSl6\buκU\JNg yI.e}Fض7iU.vy].ZhF5AˣR%@2TS8/^tꖲ +AmU¯ vR@[STN-wpE/h>Nl Bvkq" x3#};Ty Ȓ; 7 >kĿu ;D졛n=l".YRVS݁. ٘NyIb^7mI$zRoFh ƶdyV4L޵D1Q'MY;վ@WlfU&tvywmҏ!ӇDa#]{j;9٩~iDn1gdUWWf&MVѠ)rgۢ^KF?udE%[>Mr]_.IZvݺry@ @-L?@`J?L^'H?@,ZuH? `aR;J?@.AH?,lDl3 J!SjzpS&+Q#pc+ nVĨ /#!KAZ(cWeeLnAW!F;;D29e>#2:bO>?;)~U.*# x26CTi{1$bc)WfI`LY:+R;t!Ixצ"GL;.>*#Q!u_Qϴм)S;Q{*͇$bc+I d!ftH$57*b1(eSqۈ 7wV)+fMeR8ڹ? JyH䈐gW M%LgRylGE~;n>.*LP;|Ml4+ kcyV:S&ʂC# {W;3bwTec//b 'JȳIYBmԯ,yD`̨ .gZ8{"ꝈHPpē2anCӝ/A?};F3  7`=XZ:i!;p89*L"/f@q\\ϞuX櫨Rܑ7x4'͠tdxo7ڟp{)+ЮMJ0Ӧ|A\3͆~,yD_cu)iwcVo9 ,r4")q<:NGGP=kMv'G H95C,"ǣII#öc~c6q<*c\'I`R_OF%IR9Myy'7NMNn#Wu'G G%} d|W9cSӇa^ljX 31>"vӣb"wE2u]dpYw퇱c&ٲ>M)-D 1D jv?I\*&R NwxKnR!Gg5uGHAwX8I(_9YjfJĪIb2Xa/~1N>5 keǣIF'{3/G7ԎoAO住hF!:^c#乘+[c0ҩ;fxi8܈1nؐELՖg ?M/Qʐq՟p{)*Ј.cIc &=cQbx,{?J>+3Fmw zבܠ' nC!cIpD, VQSۍq*=NFJle?vM D`9n;TJAߤȎ~+S"2wV)]Ύ4ɼ)]S HcG݀+Ovȱd[}Fkq)5bGFsD/ 1r,VK Jǖ \ cGOnͥqp{).*ؘh~K3&Hշ!+s5/ 9f _ʨIŭSLD\!CD袀C{H H9{zx aÙ{ a 2{o栰& x+(Ϝ)+G5u-/Sx^Av;S&>1FU;:[9I{aB2u1v42g>1#9{ _e7Zp-k: ֋7Z.ny{L٘D4 1%`,1ȅw Po ;>w卋x^Av;S&71#ΆlivekR!-ja#'2 Z΅.ny#EIO>- ٱ)7OX%Ǟ=b>~t/_zX{O)ȶ )FFܺ)=waCFva%#ꬊ1&M^52xAJcd >=RT1]2䦛M-V9Ք]mWdpcͤҝ>Pr^S1H^-F泖ȣi<3tCU2 $j7᝱&8,$,"Pv) $6Q" nR-a2/Xc:jj u_ٔY2*&cV}6l2~V^OpMHJS֋,,)~L"{02 RR>nd~&棳6$>snh)lT u{(D-Q ؜1%'ByvݬNqpwPReS 32w _Ɩ#MhJY<`;d-&ꤕ',@(p8L`dĠIJ&BJ9 &>>थwo5ݟ O585dNLHgI>vV: MZ#+VI !A`RV6S3:Dl͘8-n=uZCx-Gcn)BOʻ~œM>&Fc)W;,cgҤP=RE'=34| G{@'Z:D,͘NO}d0dJ]h.]f &S :ʺNZLtZx%R |Wb#lLIjC'-1-J7}\b=?A,F ΕЏcJ0b4[jdN"a鴴Y)6ʉ )^5Xȗ;NY2*.ؘI)B#d@Ge>u &>|lVrkWӏ6 kʦS( { .nN$Ӄ.ؑд{ح<9t$i4+h{3Ղ{}dT1]&Sȇk'kvRmq73\{~& 3*-1?V;XB:K`>RԬvb 3w3% LF$ގ+aGzxLilIswA':Dl̘%31s~/oɦ™9cKӱ)N.we(Q' nGVy+aGztLilI6,ҷ뮌-TCIČW9i’<ngGi=qbJlhz:08[n42'|VAx@]T1&QsaFr%Oadlj)S|cX9nQ잎VpPmbBȏ?7 |JƑ 675n\JM2Yځo$Bk*K\xeiq Y8XrG;d1 r*dMglu~p6F BY*^E)7:i_["6fLӊ}c8 gH:c_MOpmpsr uK/<p?O{d1/\}dR zea>o gc .d`CƵ9!+F\* ڏk?8zDl̘#3aG@lP>@ 3G,ťcenBC0#10c̃-!xw'&PLߐ H%LD9.K.RA&NY!Jǘ1!W?^;9[;J!#1cG6962\ #J`JxǑӉ1ƦxSw~re3P.,T>3&`d&g<lQOe$G>X޲Dlp4؛1#Re2γ5 \U`ìc1|cZ$nIQ._c遚Z+59änʆZ~~&>?$qZrD[?| L{iCk4@T=ز1) ?_;',kۛPc|1c\(&\[d\ "VL@Cl|J?lV@SzH;@ @؈zJ> &!h&^?\0'IhJ/ޟX@9$`5k d @G$X:`p @t\YS;5>d 2uLpxs$DȜRLnǁlc;`k |&|)cK6bw86*HDq\ f2PY\ wsƋ3pL=rda/g1o9c7Ӎ)=8|S_g>s3^`7A;k<3֘`7A'Հ:k0' SƾWt(4e:TGdwΜ|e0`@K| x)c߀;\;Ouxc)(='@Y='#3g`7 lXds8|d6|<AL2f s;2%kqL2f s#dy23ʘ7` stM7c1 SƾNP@w nǚc/ SPwNN6ߣM0e`܁"=&;Q2f =3bxg1olƤ/\GPbQ{*<c7ن.֓lg1ob)?ش!o3٘;)Xw}dzOVn:qyp3|=TmT&ˠ;2fP;t…x\L;L@o, |t t نzS;@7xe0 /@/|IvtxgdcM=t@7 3ޘ6e93ޘ6TPmLn2fTLNmL6x3!j &*6&l=11|3$z}#əx xc)2RR@(^w$3ᘁ@9 $ <)3ʘ@>Ѧ \/NɁ3ʘ@>0&&*)^28 c@ :)1@=2:}"uK3pH/ظ~q Rrrxw eklk/8c xp=?o)a <8=գC>8>C+0s~v@=5Ӈ|_*=?xc;3u| &';ƀw 1`01kaL0yna9\?1@p˜m1ڄ*0&Ip˜)ap cR')>@lnLe~݄6&ܛ0po  zq8AJ $b @,;M2J@;" H. @XWn@H) @`X(FH@< PH @`{gH` @,j,L8- @N{eH @,J++_LNk8@ @b(H @ vf,_׺͛~>p{ mE4m䋈I)/XGҺi]xχ+’wחӬ'6O-gвAui֯uff1uFd͡<9gDZ-Ԣ3X#f"2$u3!"P'k͎[74S357.浛#D|I,hsC&&"9`'OQ=D6IDVq+gzH"$tu`4%ը-V9:3˝Zsd"NmTsh"#AVRu"ቨ"&:ui|:`&iX_YMT%,2˿S"ң4됹IV<#"3B욑N2e~3Bol]uq2`{$kqZY'n$Y oJEN߰POST)Z^V5ǹQ:us_ՅkUe%GJw5mj}-/z-ڣ[Pޜ3mI}Ƴ%zj8 m>7y},<#]fkf-3CEMsE":"%Y/pd<{c"P1n_N7m܍ajů h(HLܵdr|h6>v<*"=1z^OE.oFIR+\h=ڱ?ɝ!Lr],6 s(jJ78@~Sm;SIQv,48-⦭GLޓj'B?,vt_iz?xǝ[Jo >~",BUסhA} smX&JVkֻ2Vҏnf۴[zJZ]SpZdwkݕ[/lRBp$%+n/WX&Q,;P.r}J/&Kq9EblKZqPEߨ&-N:_WFð0m"M3pm酇ޓ4;Z-uyl7"XZ-.}-b~ hW!^`6 `VmS tQKm:-ڙIk2n戚~UbKrU{C_v&Jw-WFSϨkz)28ۉp/euNrJx2+{Qh0(lu]0oU\uñubs hӥ^WS%Ϫ+u:h"NAOϫh2oᢰ8V7pw&uill߯j,\)I0TƖ<6ɿ}KhmP+d:t]Lw^PVOb>fS?w]v찗P(` o&ԛJ,_P'?X qnVUDq&$E$I%'T4 aad~5ZіFu6uƚ$e讻VȌ)0ڈl9 wSl7=^o5[ GV}5dmD-*&6뱈E0pHnLX lsDE*}Bl=_y|pkf؍BeUsDpYs~ ;,v@Lu D٪B o-XjI c QdLDO T/DP,Y9R_ޅW՝Lb/VD5`? `wCb 3!lহ6KV0sXwюT=}xV*^"T/n^_̨{E32b;8ai`Όr!W)|=t-\o%rݥ4guU<\ubxEVX셫ejc4P4 AZ"ۃ3|Rr@M1Xg!;Q8xbJF(]RDR(YrYIijajblB{,ӆϫ ~ݬ>ԁr:b]Ty#?ʳ-ξЩӫOx⵮_*IbJ0wQg&6I0L-fԄV.9K^/wZbS :5{urNra}|kZg?n5$' (Xo*$3{W$6FJ'ÈxB{o7ܻ$~-=p(Zg劰(e}蛃iMy]]B83~8/6r]3r[,Fzzu)&xƭiFx]φ8n=(q^y/KꟅ]3Nyko/x'g"1  "!áyJLwclGpK7g% 13<{\VYջ = |AFy)]F_੶$ٕR|ߛ9\mmjF&ֵW_ux@$4o,*1h]gUA#+|uV_-̰je I4T=sz-}.t=GUbİ&!jt:7\XHY2itMˆP O 0D0;Ѥ?Oo,׊.BE.@sSAs8)K RE8^&Z9 dr䞙U=7zXrWh_d檫\,zʹIyu[!1٬ HWQGI^7ذcSa[a٩WcmHh[|C6|5~S|f\/~ߧ;#~ f,qU^Nf{+UtxY­q(F/\k$ pIO'Vk{ҋߥ ѢIE,. GEJWhdRJv[\!+ŝ{m"KD ĭNR@:Dt^DqmR\)M\m|nNaם 4$mqPpdbq'<$$i7?K*;B"hKgZdb/)Ffα= d1rp5*n%0n.37:>1~e]xqHjZCFm_4|7ۦ^AúTWX=G^.^=Po|YX<_|W{|8Xx%=W`G ނYniiFpG~pOHWO+)ǔ9>4wJTU25D?PB5ڵOqŅ+k[hv:P")dhy"zez|i57]9/iD| XQԶɳ%J}=>sn}8$ա%ߕj"g/z2ڨ/{K 6rg:wi3fd]*<Դ(fTBe烕M6E5|7핗J%1?iLS ;s\A4/KWrurI7ʼnȭ>zOvub4msÎPV/lޫ&5/li>lV_-|n旡뽝Pc-A;QI13CO'!rRViE;c{Soeq¡UEY4U3ϗ^O}דcK:ǯ~cXHGqJԿ&V<.A8r`$cKS4g9é`VY,DE5z^o飷qgJ.N~~g#"ŧL^d&7<%jg-Ұj@g7s@VCrHzsTtdQȂ}[EmMyc/zB]xkPg:z.oKjT:xPIhZLy ɮZE^s`>M [d#+K.e\;ȗ#.Txm8d+hl\)KE6 'gp8ȟ/}ô/s}- dYߦG?l އ]_>°kJbHkr=)H<7r)B" od)u>Hڂ-8 p ymkq x5J=vM\Utg XyT!956]om ªg<^_kԵO<.5&VMsI~ݥ-`(dwJEM=n&8myoA`EƪhX}޸#7?I7m^炜XGqaowbA?6t`Q4K/S[pGWrjo#F!UZQi(G{)fK5TE|m-1e>|Nvn"Aa=̤[.cLCOk M db$=xd lvp-ʟ/t}W:g_ ˞QNZ=kKT~kh PwD4DDdfHD|UOIϵe,#f8nXqbb̟7U!_hwNBN_Q`M(G0hs[Σ넺?&XC|V7&leӃB=Ǔ4~:qqש3+WɠUȠ.~:WY4е:%([4<#h7ѦnP> 2SN*~* d8uCC&Iׄa|YJɱ2'k0%9$1H3V`*Ѣ|=D՘rAL.:^}9襪ﭯ#%AHA& .R֖ǯ<+?!I]>[C`j87'\ sI[+߳{lFC1: L:[ L:[I&ov.湯Ja5 UN+g-?NPźn'niQ鎷ũ]⮵kmxQsGM#uiЎ8%\kk͵Mu;ދK#f Vͫ\tNQГ&9\ikh.z:KW\\kϵg.fI+.6kYkYnp fM*5?+_]Diօ4 !f]*k'=̺'3I8FyWZ?EvA5/k)*%@\}k|.r4[ sRطk˲;#"_kzkŮˡ=Ȣ2#-xְk. l(,'󞫺Tu}N|. D.F[x%s^^]h e6fkګz⹠VRy vݺ'dO ?):< **w>pE.QZ _`WSs)΢A~lhi6;?m2 Qr%&[2X {OV)+EhW_[ҴүșN/v*N)ʕ!mx]F<":PuHH4M>&RUATDW$4䉱e݆VO+;VU zA&ov8A.67ſd~A87KMWP6P Ywa^Yuj^u~ܕrn>lN/(:O2=DuN]g\~pFդTzl HϬ_`Ƙj[.^юXҜ=@Aˉ1F[!]2"m9Dؗb[=NN uZڝI)6rR<6p>pp27nRE*^6>l28pHM1̰2Zk&B~3~vf@~g-٥>)rq:.aEW%R4h[1x><#-U!cj٩QJis&r?_nWULLsҦ f0a4(/XEyn(}QNO-Xhc K3ŘO\M«3(-.n5^E8;b~ ʽc%c ֣+̥:`kJa} ~J}T1UG>㲦{"Za`-b oaf+:Ǧf]D Q\:h]·L?zϝt)%+ȌfAx]%"HuM֍(?'D$,MI*SV&Cn@t$y+%x(KXvpBt=4|PkX%|D+뉐`1yUliq_asY'Df}q4k\ixd^*sJ0b Mj)kGEZNa2nR5b]R^&lll6Hѣ3qqGrUL+I (;hQqNv55=2fa>)|~"o7"|I#f+2$NF,IXJV,I$؆NΔ1zX&'x6OJU`4ɦԎXlc>bĞ$7)F /7Ԥ%Q\g _+~vEw {ݙN[-/mZS"! g5gGIdnmCrkΓtdf/.=} ?X?7lDDeUHRU_.D"V!_,׌tlG}a3ZMI~HT qvĕ(^X!B_C:#ȥ  -K^fGOh/ΑFc\jsퟵ,߆쁇n4V4/~ j1hk~/ʃ(ct"{E&ܢT)OO+!VR|^Z8K_Rbd!U 33MSA(JUE2E&SDT^>"VRUd\KDbٝ%lWEFU(E4eRdۭ.q N_hP] 6S2}19ulm`˻cTX,`*K0 ?%L Sa 9~婫kU̚7`&9teN^b]m/U'IeYxj.v4 Kd8[ͅM::p}9Zxx|0z:oU슄v^2ؤ#SK F /.&ҍeUeJB Wa, %#|{Ćr8xs tזu'}&'?ѥ ^񪙭ku $=DzUm#/k*D/uMPmU@@c}="A d{V/]Y_ڪF0p$-KHZ5ŏ_Y-}I>TlcGDS <䒊,>~).Z[W&-ɫ)CE ,HD/|#ψMAKΦײSF\8yk}IU;>WXsn˶VW;9{ ~;z~?ĺjKIݦGs%+ `ߕ;14,~wVڏ}pf%"fum:o3vj̞e%9q,S%U'V*> [T)!̨U7!ݜ𵪔pq`[[x%S?ӳ~t3`sYkmUn6 ث.{椦^+{pnJ-1="Mg|o(}bd=ާ{D_SRhp$7%lpX\v2XcE}q> nH {|G|W}m^0 *Vl0[2). :.L{IY5әJ3U´Wh:.ngD$Q-Tgۭ9ۗ * )R6ArWWkXJL P G^^n#4HEV,cvq"bfol22TX*cy"y7|6J[`*_qZFB%d,|DrŇO@-]U7H_ ǹ1%0A [Jؑq$ sHHs¤B6#+8pMW[OEc'@U8f+iJ郭U;ꕚftYUVg:I2v`c*}U]᫮V);5stHܒURhr%nGZBΙЍ$ǾW|iK޲*XS6}hۦTrsׄ -tʑmNwxr%3.l#=ȜTtB %:T#.zZ۷7MǤkXb͢ޙWl䘿uBtr^!{[eٺ##Zoͺ ʯ.mHv$vm KHv 06 8wa.o=NSHvg䒟|b`JC$dW$\O+.ڗM=א+,&RT["31ϋ h!X?tqq($iE{LD ȱ@R>:O9%t/ȶ"*uJN|>@WTV#*޽kV tMq=ݨjzkDRY.٤hފ5=&[vx ۓ%SRhFȂ߭Jz$$hdE?M;=:8EڎZa ɕw :T^Ok펔*eZO6߮k]vB3} b!h߁MDasOoZ!U8d+I|ͩ{|+H"mxxG9r{J ѧQWh+i^R߲dH)_ RFlxbTOoJ0auJR$YDW0epT鵋*elŦQjk]jӐ(lo|) y˿ tMޘq6FMls(TeH$.͇# G٘a!NRvhԾ92q]{Kq:H q̼ GwɒJZlcK3#O70ZlڈgȮqَ:YQٷ<2UShW pƼ-LEhlYeTNOXgА{ _|ͷt|c8J?ˮ>ǽ&]x>|Dڳd7i :3OIYVE{5_bTuEEu{\Ou jjϚ\Z\&65\;.IRȰLug1"S3')2~Hpo>o -B-QiڬϫYSDYN0g+VYZRv̈́H384)U +~^"-W#SA69Ʋ>lM])z {/ p&ì=e7qE؜rh4{nO8lz oL=YpJܒIJYQovQD2uXErlCа8A.F^#?M&1h똩#9pϿOGwDZ􈙈yiN7m>> IbON솋!oNAX~+blKg6|H8`*ʤ^NjvYd_EM-ݺJ1<9rI-!Ceڞm1 2e=MP Q˪Ȋ12g2VOi۲&– }:4y1ۓ^YULD~{.Ւq#sBX"͙s:.K![ӘMb:،OI3xWjbYmbK#^Ά笖!ᵂ)2Lbum8 =ϩw%OM``X~_(;ISf4;+%LYY[$Xbұ]:YSEv>+ꯙ)]}ZUԣ[®#e4]믚{6kAb$ΕX1;v&NdF"+R|2o`{M"Q]7i>'wF ,Ni)Sgc,Fb1"ݳ1釰ͫ$bg!x0֡z8<}s nŮte]ã1OVeܬ,2=1a'nѓ/[i+/?LW,l G͑RM :VbYY}ߟՙe}|FGIyQ3(`8D fitO_N|rp᰽lsf;6k͝uFVϓz k~4+lחLJI]f0!HkXyᬗmO,`8N s~kaEF?ۣ8So^=yt_rdݜSpImN dļ+%"uvR$cĢ(c վ4 \cґE\k6~5?lٶޟ^Rv~r,U|S4cPtk ;/|)$:/rvXF6""WXQXc9WvIWt-xx}/gWUc`D_Okmt&bI^e#s/J}¶&o`q^Men2ɬJ5fd&oP:6O)f}E[JaAh5qickL;bc߇\K)k9jR66zyF_pPNZqU9J!7SK4c9AIy~5s6]x%_o"8BI넣]- X zԄbL2fU󆉒Kb/|s)."/sge41õU#ԗd>ae1J.+hSRfJ]S$>>aj)\+llk4{#%EEQ+NK]Ǣ L ő̓J?6dGWRBNz;3c˄zbO;"S0\c_CƼ`r"=)vBn~5NYZ{h: ^ ;V 0uj |K4j2k &:-E7QW A~:|T?YA$51F^*j^w6 fӣطaR:#u &[68 Qm[>CUrN#>y>iQ'{ԍD5~Ŷ'/>8?ٔVț4ȗ IH4y+`?/ _yՈYW3]])MBGg@lMMFBjQkuE4,9j rCmVxϥ~JR4ki ]@LVgϱԶ!ԬZ2)6iT瑴L54:2qu5닯dber=n?lxszp p-7,pWEm|KR\F\ ׹Viqh ~V$vMmrW->|>+(J"=;]``3`%Z׉n+(JCDZvbwnqD_WvE륚Ax6t5UWL(upO.#sMni"Ko^wSy?)P^'՛Y|됯Ɛ"k$mLmpxuMDmV{#LX ֗UY ?:MF$!84ڼ%|.8w>*n~{*cB`I MD€u'҅ℛ|7oFX$t.ib5MX1hI3-K5_;]bCt5YKSZdi\1p3M`nBJ^5:Rr(J!f ngdTHd _W]Ke'M=髒 )AA}m|t|0dkR*mr$$J):3U&'2% cj(zѡa/FDA1R4eLr)G z=G}Qm3x)5C$$4G%w-l_'\/ӕK؛i|zb9 CQո5դr#8|q s+s9}Jn9Q9',9-Qq(;01Zc5\V5.yV"LBHnΥK)j#"GۭQp hieOL¯Wk={~ބxEѵ["nlMh{҆))b}b͋cN[D:2r>s"kP$PGU59Kq=~Wk77fV&eNrNLlgY]5~Z5+IzIՓHDRJ\dp#yUq-ɠR6v8BpJs2V*ؑ8{rj!E+h )8UW ]U}ԞBWW!dd WUt[%B2,[W|mJ)ީ=3KTDJXӑJ= XyV)EM Sd\wTRP:$%Zbyj'{:†T׋b0 d5+£.qj4y$)tn4`c#e~տ47'Hǐ)cfNeqcd'`t{D.Tr%<Ÿ)k -^?.B ⓟ(xi!?HךJ2Z`3a% )vK#`h8g#Of%yޣU+ņqKv9Ǫ)uR\"> V++םV3tהjIg4Z']b\ZJ'V[a*(5RK)hB!Ԋ,iF]SAGΒ&nm,0WdIl%˕*9i~0W508rW l'\91|X5/X]0QJ%[e%wؤ< .\($/lk8w(X3CwNReX-'(umͫ)ziwS K}ܯGWGX0udQ>Uj*6=lP^ƃw:ƲB&`(QԊ~?%|Q}BrE&*_okEG[kk%C,gAI-]9"9j#֥bZUomQmE?nM^H˘!'ZA>I$JgY#^?hhw$ҁPT~QL|^ڐմlzr]V,]oJsl g7ɕY j'-Hb