ࡱ> wyhijklmnopqrstuv5@  bjbj22 (XX !!!!!!!,    ,ro.\       nnnnnnn$qRnsFo!#  ##o!!  ,o777#! ! n7#n777:!!i: " B &>K #F 5::d4Bo0ro=:,si$~si:!T$(!!!!s!i:$ \ f7L8   oo,,d 7,, WSH Primer Microsoft Windows 2000 Scripting Guide Windows Script Host (WSH), a feature of the Microsoft Windows 2000 family of operating systems, is a powerful multi-language scripting environment ideal for automating system administration tasks. Scripts running in the WSH environment can leverage the power of WSH objects and other COM-based technologies that support Automation, such as Windows Management Instrumentation (WMI) and Active Directory Service Interfaces (ADSI), to manage the Windows subsystems that are central to many system administration tasks. WSH Overview Microsoft Windows 2000 Scripting Guide The first time people encounter Windows Script Host (WSH), they often express some confusion. What exactly is WSH? Is it a language, like VBScript or JScript? No; although WSH enables you to run programs written in these languages, it is not a language itself. Is it an object model, like WMI or ADSI? No; WSH does provide a simple object model, but providing an object model is not its primary purpose. So then what is WSH? As the name implies, WSH is a script host. A script host is a program that provides an environment in which users can execute scripts in a variety of languages, languages that use a variety of object models to perform tasks. You are probably already familiar with other script hosts. Microsoft Internet Explorer, for example, enables users to execute scripts that use the Dynamic HTML object model. Shell programs (such as C Shell, Bourne Shell and Korn Shell) enable you to write scripts that use an object model capable of manipulating the file system. Even the command prompt can be thought of as a scripting environment because it can run scripts written in the "batch file" language. WSH is an unusual script host in that it was designed to be general-purpose. Unlike most of the scripting tools mentioned above, WSH imposes restrictions on neither the language used to write scripts nor the object models used by scripts. WSH capabilities can be divided into four major areas. These areas, which will be discussed in detail throughout the remainder of this chapter, include: The ability to intrinsically carry out system administration tasksThe ability to use COM objects to carry out system administration tasksThe ability to add standard programming features to WSH-compatible scripting languagesThe ability to run command-line toolsThe ability to intrinsically carry out system administration tasks In many ways, this might be the least important of the WSH capabilities. WSH is primarily a scripting runtime; it provides the environment in which scripts can run, in much the same way that the command processor provides the environment in which batch files can run. However, even though WSH primarily serves as the conduit through which other scripting languages and technologies operate, it is still possible to use "pure" WSH scripts to carry out system administration tasks. You can use WSH to do such things as map and unmap network drives, and add and remove printer connections. For example, this simple two-line script maps drive X to the network share \\atl-fs-01\public: Set objNetwork = Wscript.CreateObject("WScript.Network") objNetwork.MapNetworkDrive "X:", "\\atl-fs-01\public" The ability to use COM objects to carry out system administration tasks As noted, WSH can be used to map network drives and to add printer connections. Beyond that, however, few system administration tasks can be carried out using WSH alone. You cannot use WSH to take inventory of computer hardware or to determine the software that is installed on a computer. You cannot use WSH to manage disk quotas or to list the members of the Enterprise Administrators group in the Active Directory directory service. But even though WSH has no intrinsic methods for carrying out these tasks, you can still perform system administration chores by using a WSH script. This is possible because WSH allows you to use COM (Component Object Model) objects within your scripts. COM objects are a standard way for applications (.exe files) or programming libraries (.dll files) to present their capabilities as a series of objects. In turn, WSH can bind (connect) to these objects and harness these capabilities. For example, WSH provides no methods for managing services on a computer. However, WMI which is made up of a series of COM objects can be used to manage services; WMI can perform such tasks as retrieve service properties, start and stop services, and configure service settings. Rather than provide its own methods for managing services, WSH can instead use the methods available through WMI. In fact, WSH can access any COM object that supports Automation. Automation refers to a standard way of accessing a COM object. For the most part, scripting languages can access only COM objects using Automation; full-featured programming languages, such as C++, can access COM in additional ways. On the typical Windows-based computer, scores of Automation objects are available to manage everything from services to software to disk quotas to Active Directory. Because WSH can access all these objects, you can write scripts to manage everything from services to software to disk quotas to Active Directory. For example, this WSH script uses ADSI to create a user account in Active Directory: Set objOU = Wscript.GetObject("LDAP://OU=management,dc=fabrikam,dc=com") Set objUser = objOU.Create("User", "cn=MyerKen") objUser.Put "sAMAccountName", "myerken" objUser.SetInfo The ability to add standard programming features to WSH-compatible scripting languages Applications vary widely both in what they are intended to do and in how they go about doing it; Calculator, for example, bears little resemblance to Ipconfig.exe, which bears even less resemblance to Microsoft Word. Despite these wide variations, however, applications share some basic attributes. Many applications provide for input and output: They allow users to enter data, and they provide a method for displaying data to users. Many applications can read and write to the registry. Many applications accept command-line arguments that affect how the application runs or what the application does. This is true even of graphical applications: For example, the following command, which uses the /n argument, starts Microsoft Word without loading a blank document: winword.exe /n These same standard features are needed in system administration scripts; for example, how valuable would scripting be if a script could not display information? As it turns out, WSH can be used to add many of these standard features to a script: WSH can provide for input and output, it can read and write to the registry, and it can allow a script to accept command-line arguments. This ensures that any WSH-compatible language will be able to use these features, even if the language itself has no intrinsic support for them. For example, suppose you need a script that can delete any folder from a computer; whenever you ran the script, you would pass the name of the folder to be deleted as a command-line argument: deletefolder.vbs c:\scripts You can use the FileSystemObject to delete folders, and you can write the script using the VBScript scripting language. But how do you handle command-line arguments? After all, neither the FileSystemObject nor VBScript have any knowledge of command-line arguments or how to use them. Fortunately, you can use WSH to handle command-line arguments. For example, the following script actually uses three technologies: Line 1 uses VBScript to instantiate the FileSystemObject (although this could also have been done using WSH).Line 2 uses WSH to read the value of the command-line argument and assign it to a variable.Line 3 uses the FileSystemObject to delete the specified folder.Set objFSO = Wscript.CreateObject("Scripting.FileSystemObject") strFolder = Wscript.Arguments.Item(0) objFSO.DeleteFolder(strFolder) This same script can be easily rewritten in Jscript, PythonScript or any other WSH-compatible scripting language. Do these languages support the use of command-line arguments? It does not matter; because they are WSH-compatible, you can use WSH to provide this capability. The ability to run command-line tools Obviously, WSH is not required to run command-line tools; command-line tools can be run as stand-alone programs or can be called from batch files. However, WSH is extremely useful if you want to add "intelligence" to these tools or batch files. For example, suppose you want to map a drive only if a user logs on from the fabrikam domain. If the user is from the fabrikam domain, you want to use the net use command to map drive X to \\atl-fs-01\public. If the user is not from the fabrikam domain, you do not want the script to do anything. Can this be done from within a batch file? Yes, although the solution is not particularly straightforward. (You need to figure out how to get the domain name, how to pipe that name into the script, and how to use the shell language to take action based on the value of that name.) By contrast, this simple six-line script will accomplish the same task: Set objNetwork = Wscript.CreateObject("Wscript.Network") Set objShell = WScript.CreateObject("WScript.Shell") strDomain = objNetwork.DomainName If strDomain = "fabrikam" Then objShell.Run "net use x: \\atl-fs-01" End If In other words, not only can you run command-line tools from within your WSH scripts, but you can also augment those tools with capabilities that would be very difficult to replicate in a batch file. WSH vs. Cmd.exe At this point, it might be useful to briefly compare WSH and Cmd.exe, the command-line interpreter found in Windows. Both are scripting environments: WSH allows you to run WSH scripts; Cmd.exe allows you to run batch files (sometimes referred to as shell scripts). Both WSH and Cmd.exe require interaction with scripting languages and scripting tools: It is difficult to write useful scripts with nothing more than WSH, and it is difficult to write useful batch files with nothing more than the shell language. This is where the differences between the two runtimes become more apparent. WSH provides access to a large number of sophisticated scripting languages; Cmd.exe limits you largely to the simplistic syntax of the batch file language. The only tools available to Cmd.exe are command-line utilities; WSH not only offers access to these same utilities but provides access to Automation objects as well. The scripting tools available to Cmd.exe represent a very small subset of the tools available to WSH. These differences make WSH a superior scripting environment. Does this mean that you should throw away all your command-line tools and batch files and switch exclusively to WSH? Of course not if you have a solution that works, there is no reason to get rid of it. But for problems that batch files and command-line tools cannot solve, WSH, with its access to the myriad capabilities of VBScript, JScript, WMI, ADSI, and other Automation objects, might provide the solution you have been looking for. A Note About WSH Versions The sample scripts in this chapter were authored and tested with WSH version 5.6. Some of the WSH functionality described is available only under WSH version 5.6 or later. Therefore, you should determine which version of WSH you currently have installed on your computer; if it is earlier than version 5.6, you should upgrade it before proceeding with the chapter. Note Of course, the added functionality found in WSH 5.6 makes it a very worthwhile upgrade regardless of whether you intend to test the scripts found in this chapter.To display the version of WSH installed on a computer, type cscript at the command prompt and then press ENTER. If you have WSH 5.6 installed, you should see output similar to this: C:\WINDOWS>cscript Microsoft (R) Windows Script Host Version 5.6 Copyright (C) Microsoft Corporation 1996-2000. All rights reserved. You can also retrieve this information using the following script: Wscript.Echo Wscript.Version For information about downloading WSH version 5.6, go to the Windows Script Technologies link on the  HYPERLINK "http://www.microsoft.com/technet/scriptcenter/guide/sas_wsh_xaep.mspx" Web Resources page at http://www.microsoft.com/windows/reskits/webresources. WSH Architecture Microsoft Windows 2000 Scripting Guide When you learn how to drive a car, you do not need to first become an expert on the internal combustion engine or fluid dynamics. If you can distinguish between the gas and the brake pedal and figure out how the steering wheel works, you probably will be able to get from Point A to Point B. And that is perfectly fine, assuming that after you get to Point B you will get out of the car and never drive again. But what if you want to drive on a regular basis? In that case, it helps to understand a little bit about how cars work, and why they might not work. You should know that cars require gas, that tires require air, and that batteries will run down if the lights are left on. If you do not understand these basic principles of cars, you are likely headed for some unpleasant surprises. The same is true of scripting. If all you want to do is use a script to stop the Alerter service on the local computer, there is no need to read this book and to memorize the ins and outs of scripting. Instead, just copy and run the following: strComputer = "." strComputer = "." Set objWMIService = GetObject("winmgmts:" _ & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") Set colServices = objWMIService.ExecQuery _ ("SELECT * FROM Win32_Service WHERE Name = 'Alerter'") For Each objService in colServices errReturnCode = objService.StopService() Next But what happens if you want to stop a different service, or you want to stop a service on a remote computer? What happens if you want to start the Alerter service? If you want to modify existing scripts or if you want to create your own scripts, you need to understand how scripting works. This understanding requires at least a passing familiarity with the WSH architecture. Components of the WSH Environment Microsoft Windows 2000 Scripting Guide WSH has a modular architecture: It is made up of separate parts, each responsible for performing a specific function. This modularity gives WSH two important capabilities: it can make use of multiple scripting languages and it can leverage COM objects. Figure 3.1 illustrates the major components of the WSH environment and their interactions. The WSH environment includes script files, script hosts, scripting language engines, and COM objects. In this diagram, the shaded boxes represent the items that are installed when you install WSH 5.6. The major components shown in this diagram, and the ways in which they interact, are explained in subsequent sections of this chapter. Figure 3.1 Major Components of the WSH Environment  INCLUDEPICTURE "http://www.microsoft.com/library/media/1033/technet/images/scriptcenter/guide/sas_wsh_07c.gif" \* MERGEFORMATINET   HYPERLINK "http://www.microsoft.com/library/media/1033/technet/images/scriptcenter/guide/sas_wsh_07c_big.gif" \t "_blank" See full-sized image. Script Files You create WSH script files to automate system administration tasks. Script files (more commonly referred to simply as scripts) are plain-text files that contain instructions describing how to accomplish a task or set of tasks. (Plain-text means that the files cannot include any special formatting characters.) For example, the following script will fail because line 2 uses "smart quotes." Because these are not standard characters, WSH cannot interpret them, and the script fails with the error message, "Invalid character." Wscript.Echo "This line is correct." Wscript.Echo "This line is incorrect." This is important to keep in mind because most word processing applications use special formatting characters by default. This means that word processing applications do not make the best environment for creating scripts: It is too easy to save a script with special formatting characters that will prevent the script from running. Instead, text editors designed to work with plain text (such as Notepad) are the best tools for creating WSH scripts. Because these editors typically do not support special formatting characters, there is less chance that you will inadvertently include such a character in your script. Note You should also avoid the temptation of creating scripts in a word processor and then copying and pasting the code into a text editor; there is no guarantee that the pasted lines of code will actually be in plain-text format. These problems can be especially difficult to diagnose because the code might look as though it is in plain-text format. In reality, the code might still contain special characters that will cause the script to fail.The instructions included in a script can be written in any WSH-compliant scripting language for which a corresponding scripting language engine has been installed. You should save the file with the file-name extension that corresponds to that language. Table 3.1 lists three example script files along with the language that corresponds to their file-name extensions. Table 3.1 Script File Name Extensions File ExtensionSample File NameScripting Language.VBSEnumPrinters.vbsVBScript.JSEnumProcesses.jsJScript.PLSEnumDisks.plsPerlScriptIn other words, if you are writing a script using VBScript, save the file with the .vbs file name extension. If you are writing a script using JScript, save the file with the .js file name extension. Note It is possible to run scripts even if you use a nonstandard file name extension (such as .xyz). This is explained later in this chapter.After you have typed your script into Notepad and saved it, it is ready to run. This is one of the primary advantages of scripting: you do not need to create any supporting files nor run the script through a compilation process; instead, you simply write it, save it, and run it. For example, type the following two lines of code into Notepad: Set objNetwork = Wscript.CreateObject("Wscript.Network") Wscript.Echo objNetwork.ComputerName Save the file with the .vbs file name extension, and you have a script that returns the name of the local computer. Script Hosts The script host initiates and coordinates the running of your script; it reads your script file and interacts with components of the WSH environment and any COM objects required by the script. It is also the responsibility of the script host to determine which language engine to use when running the script. For example, if the script has a .vbs extension, the script host will load the VBScript language engine and begin working with that engine to execute the code. The WSH environment includes two script hosts: the console-based CScript and the GUI-based WScript. The two script hosts provide nearly identical capabilities, and in most cases, it does not matter which of the script hosts you use to run your scripts. The two exceptions lie in how you interact with a script; that is, how you get information into a script (input) and how the script displays information it has retrieved (output). In general, CScript receives input from the command prompt and displays output in a command window. WScript, by contrast, receives input through a graphical dialog box and displays output in a graphical message box. Otherwise, the two script hosts are largely identical: If you have a script that does not require user interaction, you can run that script under either CScript or WScript. For example, the following script maps a network drive. Because it neither requires input nor displays output, it runs exactly the same under either script host: Set objNetwork = Wscript.CreateObject("WScript.Network") objNetwork.MapNetworkDrive "g:", "\\atl-fs-01\Sales" On the other hand, the following script which displays a series of messages runs much differently under CScript (where the messages are displayed as individual lines within a command window) and WScript (where the messages are displayed as a series of message boxes). If you are interested in seeing the difference for yourself, copy the script into Notepad, save it with a .vbs file extension, and then run it under both CScript and WScript. (For more information about running scripts under a script host, see " HYPERLINK "http://www.microsoft.com/technet/scriptcenter/guide/sas_wsh_kumh.mspx" Running WSH Scripts" later in this chapter.) Wscript.Echo "Line 1." Wscript.Echo "Line 2." Wscript.Echo "Line 3." Wscript.Echo "Line 4." Scripting Language Engines Although the script host is responsible for initiating and coordinating the running of a script, it is not capable of interpreting any scripting language. The WSH environment separates the logic necessary to interpret a given scripting language from the script host. It is this separation that enables WSH to be a multi-language scripting environment. This is because WSH does not attempt to "speak" VBScript, JScript, ActivePerl, Rexx, Python, or any other scripting language. Instead, it is up to the language engine to translate a script into commands that WSH can understand. You can write a WSH script in VBScript because the VBScript language engine can translate the code in your scripts into commands that WSH can understand and act upon. You cannot write a WSH script in C++ because there is no language engine that can translate C++ code into WSH commands. When a scripting language engine is installed, at least one mapping is recorded in the registry. The mapping associates a file name extension with the dynamic link library (DLL) that implements the scripting language engine. The script host usually determines the language used in a script by examining the file name extension and then checking the registry to determine the corresponding scripting language engine. Note You can force the script host to use the scripting language engine of your choice by specifying the //E: command-line option. (See Table 3.2.) This option allows you to use any file name extension on your script files, regardless of the scripting language in which they are written.COM Objects WSH includes the WScript object and three COM-based objects: WshShell, WshNetwork, and WshController. Although they are included with the WSH environment, you use them in your scripts in the same way you use other COM objects. The WSH COM objects possess neither the depth nor the breadth of the system administration capabilities found in WMI or ADSI. Nevertheless, you are likely to find these objects useful in several situations: If you need to carry out a task that cannot be carried out using another Automation object. For example, the WshNetwork object allows you to map network drives; this capability is not available in either WMI or ADSI.If you have down-level clients that are not running WMI or ADSI. For example, ADSI might be the preferred method to retrieve the name of the local computer, but ADSI did not ship with Windows 98. For Windows 98 computers, you can use the WshNetwork object to retrieve the name of the local computer.If you need to run a script on a remote computer, and neither WMI nor ADSI is capable of carrying out this task remotely. In that case, you can use the WshController object to run the script on the remote computer.How the Components of the WSH Environment Work Together Microsoft Windows 2000 Scripting Guide Components in the WSH environment must interact with one another to run scripts. These interactions include the following: Script Host and Script File When a script host is invoked to run a script, it begins by examining the file-name extension of the script file. The script host searches the registry to determine the scripting language engine that corresponds to the extension and then loads the script file in preparation for interpreting its instructions. All this happens before a single line of code is actually executed. Script Host and Scripting Language Engine After determining the language used in the script, the script host works with the corresponding scripting language engine to interpret the instructions in the script. The script host communicates with the scripting language engine through the Windows Script Interfaces. The entire script is read and checked for syntax errors before any code is executed. For example, the following script has an error in line 3; the syntax of the IfThen statement is incorrect: Wscript.Echo "Line 1." Wscript.Echo "Line 2." If x = 1 Wscript.Echo "X is equal to 1." End If You might expect that the script would execute lines 1 and 2 and thus display two messages before encountering the error on line 3. Instead, the error is caught in the pre-execution syntax check. Instead of displaying two messages, the script displays the error message "Expected Then." WScript Library and COM Objects When instructions within a script indicate that a COM object is to be used, the built-in WScript library interacts with the COM runtime on behalf of the script. Note Many scripting languages provide the ability to interact with COM objects directly, in which case WScript is not part of the interaction. Because this chapter is about WSH, the examples use the WScript CreateObject and GetObject methods. However, VBScript also enables you to bind to COM objects and has a slightly easier syntax. Consequently, the VBScript functions are used in nearly all the other scripts in this book. For a more thorough comparison of the two functions, see "VBScript Primer" in this book.WSH Object Model Microsoft Windows 2000 Scripting Guide People typically speak of WSH as though it were a single item. In truth, however, WSH is made up of multiple components. For example, the WSH environment includes a built-in object, WScript, and three COM objects: WshShell, WshNetwork, and WshController. Together, WScript, WshShell, WshNetwork, and WshController are referred to as the WSH objects. Your scripts access the capabilities of these objects through the WSH Object Model. Figure 3.2 presents the WSH Object Model. Each of the items detailed in the diagram will be discussed at some point in this chapter. Figure 3.2 WSH Object Model Diagram  INCLUDEPICTURE "http://www.microsoft.com/library/media/1033/technet/images/scriptcenter/guide/sas_wsh_30c.gif" \* MERGEFORMATINET  Running WSH Scripts Microsoft Windows 2000 Scripting Guide If you were to ask a group of people how to start Microsoft Word, you would likely get a number of different answers. After all, you can start Word by clicking the Start menu and then clicking Microsoft Word, or by typing winword.exe in the Run dialog box. Some people might start Word from the command prompt, some from the Quick Launch bar, and others by using a keyboard shortcut. You can also start Word implicitly, by double-clicking a file with the .doc file name extension. Regardless of the method employed, in each case the end result is the same: Microsoft Word will run. Whether or not one method is better than another depends on such factors as convenience, personal preference, and individual needs (for example, whether you want a specific document to be loaded when Word starts). There are also many ways of running WSH scripts. For example, some system administration scripts are run as logon scripts or scheduled tasks. In that respect, you do not actually run these scripts; you simply schedule them and let the operating system run them for you. Scripts that are not run on a regular basis or that require user interaction can be run either from the command line or by using the Windows graphical user interface (GUI). In some cases it makes no difference how these scripts are run. In other cases, it makes a very big difference. While you are working through the examples in this chapter, it is recommended that you run the scripts from the command line using CScript (unless otherwise indicated). Often times it makes no difference which script host you use to run a script. However, many system administration scripts should be run under CScript, the console-based script host, for at least two reasons. For one, running your scripts under CScript enables them to run an external program and retrieve the output from the program. Perhaps more important, though, returned data is displayed in a command window rather than in a series of message boxes. This is particularly useful for scripts that might return hundreds of items of data, such as scripts that retrieve events from the event logs. The next few sections of this chapter will discuss the ins and outs of running scripts in more detail. Running Scripts from the Command Line Microsoft Windows 2000 Scripting Guide Although this might be the age of the graphical user interface, many system administrators are still more comfortable working from the command prompt than within the GUI. This is not a problem with WSH; you can run scripts from the command prompt or from the GUI. Not only do you not lose any capabilities by choosing the command prompt over the GUI, but running scripts from the command line and under CScript also has at least two benefits: It is easier to pass arguments to the script. These arguments might be used by the script itself (for example, you might pass the name of a folder to be deleted), or the script host might use them when running the script.It is easier to cancel a script running under CScript. When a script runs from the command prompt, you can cancel the script either by pressing CTRL+C or by closing the command window in which it is running. If a script is running under WScript, the only way to cancel it is to terminate the Wscript.exe process.You can run script files from the command line in one of two ways: Type the name of the script, including its file name extension, at the command prompt: HardwareAudit.vbsType the name of one of the script hosts followed by the name of the script: cscript HardwareAudit.vbs wscript HardwareAudit.vbsWhen you use the first method, the command interpreter must determine which script host to call. If you do not specify either CScript or WScript, the script will run under the default script host as configured on the computer. When you use the second method, you explicitly specify the script host under which the script should be run. The command interpreter runs cscript.exe or wscript.exe, whichever was specified, passing it the script file HardwareAudit.vbs. Script Host Options Both CScript and WScript accept a number of options that either affect how the script host will run a script or modify some aspect of the WSH environment. The two script hosts share a common set of options; CScript also has a few options, most notably //logo and //nologo, which have no effect in WScript. When WSH is first installed, WScript is configured as the default script host. (If you do not specify either CScript or WScript when starting a script, WSH runs scripts using the default script host.) To set the default script host to CScript, type the following at the command prompt: cscript //H:cscript To reset WScript as the default script host, type this: wscript //H:wscript Table 3.2 lists a number of the more commonly used WSH options. Table 3.2 Script Host Options ParameterDescription//BBatch mode; suppresses display of user prompts and script errors. For example, if your script includes messages displayed using Wscript.Echo, these messages will not appear when the script runs in Batch mode. Batch mode also suppresses the use of VBScript functions such as Msgbox. The default is Interactive mode.//DTurns on the Microsoft Script Debugger if this program is installed. The Script Debugger ships as part of Windows 2000, although it is not installed by default. The Script Debugger does not ship with Windows XP . If the Script Debugger is not installed, no error will occur. Instead, the script will simply run.//E:engineExecutes the script with the specified script engine. Among other things, this allows you to run scripts that use a custom file name extension. Without the //E argument, you can run only scripts that use registered file name extensions. For example, if you try to run this command: cscript test.admin You will receive this error message: Input Error: There is no script engine for file extension ".admin". To run a script that uses a custom file extension, include the //E argument: cscript //E:vbscript test.admin One advantage of using nonstandard file name extensions is that it guards against accidentally double-clicking a script and thus running something you really did not want to run. This does not create a permanent association between the .admin file name extension and VBScript. Each time you run a script that uses a .admin file name extension, you will need to use the //E argument.//H:CScript or //H:WScriptRegisters Cscript.exe or Wscript.exe as the default application for running scripts. When WSH is initially installed, WScript is set as the default script host.//IInteractive mode; allows display of user prompts and script errors. This is the default mode and is the opposite of Batch mode.//logoDisplays a logo when the script runs under CScript (this is the default setting for WSH). The logo, which appears prior to any of the output from the script, looks like this:Microsoft (R) Windows Script Host Version 5.6Copyright (C) Microsoft Corporation 1996-2000. All rights reserved.//nologoPrevents display of the logo at run time (by default, the logo is displayed). The //nologo option is often used for scripts whose output is redirected to a text file. Suppressing the logo ensures that this information does not appear within the text file. This makes it easier to write scripts that parse the information found in the text file or that import the contents of the file to a database, because these scripts do not have to account for the logo.//SSaves the Timeout and Logo options for this user. For example, this command ensures that the logo will be suppressed anytime a script runs under CScript: cscript //nologo //S You can also modify these settings by right-clicking a script file and then clicking Properties.//T:nnDetermines the maximum number of seconds the script can run. (The default is no limit.) The //T parameter prevents excessive execution of scripts by setting a timer. When execution time exceeds the specified value, the script host interrupts the script engine and terminates the process.//XStarts the program in the Microsoft Script Debugger. If the Script Debugger is not installed, the script simply runs.//?Displays a brief description of command parameters (the usage information). The usage information is similar to the information presented in this table, although with less explanation. For example, here is the usage information for the //E argument://E:engine Use engine for executing scriptRedirecting Script Output to a Text File Sometimes you run a script because you need to do something right away. For example, you might need to check the status of a particular service or the amount of free space on a particular hard drive. Other times you run a script with the intention of going back and analyzing the data later; for example, you might run a script that retrieves a list of all the software installed on all your domain controllers. Sometime in the future, you will examine that list and determine whether your domain controllers have been properly configured. If your script retrieves data that needs to be accessed later on, it is a good idea to save this data, perhaps in a database or a text file. It is possible to include code within a script that saves data in either of these formats. If a script is designed to always save data, it is best to include the code to carry out that procedure. But what if there are times when you want to save the output from a script and other times when, using that same script, you prefer to view that output on the screen? If you use Wscript.Echo to display data, you actually have two choices: display the data on the screen or write the data to a text file. If you choose to write the data to a text file, all you have to do is run the script using one of the two command-line redirection characters. The command interpreter provides two ways to redirect output from the screen to a file. (That is, output is saved to a file instead of being displayed on the screen.) If you use the > character followed by a file name, output will be saved in a text file, overwriting anything that might already be saved in that file. For example, this command saves the output of a script to the file c:\scripts\services.txt: cscript service_info.vbs > c:\scripts\services.txt The >> characters append data to the specified file; new output from the script is added to anything already in the file: cscript service_info.vbs >> c:\scripts\services.txt You might also want to use the //nologo option, to ensure that the logo is not included within the text file: cscript //nologo service_info.vbs > c:\scripts\services.txt When you redirect the output of the script, no messages of any kind appear in the command window. Instead, all output, including error messages, is redirected to the text file. Scheduling the Running of Scripts Microsoft Windows 2000 Scripting Guide Tasks that you script often need to be done repeatedly according to a prescribed schedule. You can use the Windows 2000 Task Scheduler or At.exe to schedule the running of these scripts. The scripts still run under one of the script hosts, but they run at the designated times without your interaction. The ability to run scripts without the need for any human intervention is one of the major advantages scripting has over other administrative tools. For example, suppose you have a script that runs once a week and backs up and clears the event logs on all your domain controllers. There is no need for you to remember to manually run this script each week, and no need for you to arrange for someone else to run this script should you be out of the office. Instead, the script can be scheduled to run once a week, and it can do so without any need for human intervention. As an added bonus, the script can be scheduled to run during off-hours, thus minimizing any disruption to users. You can also use WMI to create, delete, and manage scheduled tasks. (For more information about scheduling the running of scripts using WMI, see " HYPERLINK "http://www.microsoft.com/technet/scriptcenter/guide/sas_ent_overview.mspx" Creating Enterprise Scripts" in this book.) For example, this script creates a scheduled task that runs a script named Monitor.vbs every Monday, Wednesday, and Friday at 12:30 P.M. Set Service = GetObject("winmgmts:") Set objNewJob = Service.Get("Win32_ScheduledJob") errJobCreated = objNewJob.Create _ ("cscript c:\scripts\monitor.vbs", "********123000.000000-420", _ True , 1 OR 4 OR 16, , , JobID) Wscript.Echo errJobCreated Other Methods of Running Scripts Microsoft Windows 2000 Scripting Guide For the most part, system administrators either run scripts from the command line or schedule scripts to run periodically. However, a number of other methods are available for running scripts. Running Scripts on Remote Computers. The WshController object, a COM object included with WSH, allows your scripts to run other WSH-based scripts on remote computers. For more information about the WshController object, see " HYPERLINK "http://www.microsoft.com/technet/scriptcenter/guide/sas_wsh_immo.mspx" WSHController Object" later in this chapter. Running Scripts from Windows Explorer. You can run a WSH script by double-clicking the script file in Windows Explorer. This will cause the script to run using the default script host. If the default script host is CScript, a command window will open and the script will run. However, the command window will close as soon as the script finishes running. This means that any output generated by the script will disappear as soon as the script finishes and the command window closes. Running Scripts from the Context-Sensitive Menu. You can run a WSH script by right-clicking the script file in Windows Explorer and selecting the appropriate option: Open with Command Prompt if CScript is your default script host or Open if WScript is your default script host. Running Scripts by using Drag and Drop. You can run a script by dragging one or more files or folders onto the script file in Windows Explorer. The script runs under the default host, and the full path to each file or folder dropped onto the script file is passed to the script host as a command-line argument. For example, this script echoes the path name of each file or folder dropped onto it: For Each strArgument in Wscript.Arguments Wscript.Echo strArgument Next This method is commonly used for passing a list of file names as arguments to a script that performs an action on a set of files. For example, you might drag several files onto a script, and the script, in turn, might copy each of those files to a remote server. The command interpreter limits the number of characters that can be passed by a program (or script) and all of its arguments to roughly 2048 characters. If you use the drag-and-drop feature to provide arguments to a script, be sure the total number of characters does not exceed the 2048 limit. The total number of characters can be determined by adding the length of the scripts fully qualified path and file name, the length of each argument, and any white space used to separate each argument. WSH Objects Microsoft Windows 2000 Scripting Guide The WSH environment includes the built-in WScript object and three COM objects: WshShell, WshNetwork, and WshController. Your scripts can use these objects to help automate system administration tasks. The WSH objects provide your scripts with functionality that might not be available elsewhere, including the ability to work with command-line arguments, control script execution, and run scripts on remote computers. This means that the scripting language does not have to supply these elements. VBScript, for example, does not include any methods for working with command-line arguments. However, you can still use command-line arguments with VBScript by using the argument capabilities built into WSH. WSH and the WSH objects do not include all the things system administrators might want to do; far from it. In addition, even tasks that are covered by the WSH objects are often better handled by using technologies such as WMI and ADSI. For example, the WshShell object has a method named RegRead that allows your scripts to read a fixed registry entry. This method works fine if you know in advance the registry entry the script needs to read. Suppose you want to determine the wallpaper that the user is displaying. In a very specific situation such as that, a simple little WSH script such as this will suffice: Set WshShell = WScript.CreateObject("WScript.Shell") strWallpaper = WshShell.RegRead("HKCU\Control Panel\Desktop\Wallpaper") Wscript.Echo strWallpaper But what if you have a more open-ended task, such as enumerating all of the entries within a given subkey? In a case such as that, WSH is of little use. Instead, you should use the WMI StdRegistry provider to enumerate the entries of a subkey. The StdRegistry provider gives your scripts more complete and more flexible methods for managing the registry than the WshShell object. In addition, WMI, for the most part, works exactly the same on remote computers as it does on the local computer. WSH, by contrast, is designed to work only on the local computer. To run WSH scripts remotely, you must use the WshController object and actually create two scripts: the script to be run and the script that allows that script to run remotely. (The WshController object is discussed in detail later in this chapter.) Nevertheless, there are still times when you might want to use WSH rather than WMI. For example, "pure" WSH scripts are more likely to be supported by Windows NT 4.0-based and Windows 98-based computers. WSH is included with both those operating systems; however, neither WMI nor ADSI shipped with Windows NT 4.0 or Windows 98. If you need to support these older operating systems, WSH might allow you to write a single script that will run on all your computers rather than requiring you to write separate scripts for each platform. WScript Object Microsoft Windows 2000 Scripting Guide The WScript object provides a wide range of capabilities to WSH scripts regardless of the language in which that script is written. As such, the WScript object ensures that a WSH-compliant language will always be able to carry out such key tasks as binding to COM objects and parsing command-line arguments. Depending on the scripting language you use and the task you have chosen, you might or might not need to use the WScript object. For example, VBScript includes a GetObject function that allows your script to bind to COM objects. Because the syntax of the VBScript GetObject function is slightly simpler, you will likely use it rather than the WScript equivalent. On the other hand, VBScript does not include functions for parsing command-line arguments. Fortunately, you can still use command-line arguments within VBScript; you simply make use of the argument parsing functionality provided by the WScript object. This ability to mix and match methods from WSH with methods and functions from the scripting language is one primary advantages of using WSH as a scripting environment. Figure 3.3 shows the properties and methods of the WScript object as well as the properties and methods of the WshArguments, WshUnnamed, and WshNamed collections, all of which are accessed through the WScript object. Figure 3.3 WScript Object Model  INCLUDEPICTURE "http://www.microsoft.com/library/media/1033/technet/images/scriptcenter/guide/sas_wsh_60c.gif" \* MERGEFORMATINET   HYPERLINK "http://www.microsoft.com/library/media/1033/technet/images/scriptcenter/guide/sas_wsh_60c_big.gif" \t "_blank" See full-sized image. Accessing the WScript Object The WScript object is available to all WSH scripts without the script needing to bind to the object. No call to the WScript CreateObject method is required prior to using WScript properties and methods. This means you can use WSH functions such as Echo or Sleep without having to bind to the WScript object; as a result, this single line of code is a perfectly valid WSH script: Wscript.Echo "No binding required." The WScript object is always available for one reason: CreateObject and GetObject are methods found within this object. If the WScript object were not always available, neither CreateObject nor GetObject would be. Thus, you would not be able to bind to any COM object (including the WScript object). WScript Capabilities The primary purpose of the WScript object is to provide your script with basic functionality as opposed to carrying out a particular system administration task. In other words, you will not find the capability to manage services or event logs; instead, you will find capabilities that enable you to bind to other objects that can be used to manage services or event logs. Table 3.3 lists the capabilities provided by the WScript object, along with the methods and properties that your scripts can use to access this functionality. Each of these methods and properties is explained in more detail in subsequent sections of this chapter. Table 3.3 Capabilities Provided by the WScript Object CategoryMethods or PropertiesUsing COM objectsCreateObject, GetObjectHandling input and outputEcho, StdOut, StdIn, StdErrWorking with command-line argumentsArgumentsControlling script executionQuit, Sleep, Timeout, InteractiveObtaining WSH environment infoApplication, BuildVersion, FullName, Name, Path, ScriptFullName, ScriptName, VersionHandling eventsCreateObject, GetObject, ConnectObject, DisconnectObject Using COM Objects Microsoft Windows 2000 Scripting Guide If you have a question about practically anything sports, history, science, gardening it is likely that you can find the answer at the public library. However, this does not mean that you can walk into the library, pick out a book at random, and expect to find the answer. Instead, answers to specific questions are found in specific books, and you need to locate the correct book if you want to have your question answered. The same thing applies to COM objects. There is likely to be a COM object that can be used to script most of your system administration needs. However, you cannot use just any COM object; COM objects have specific, oftentimes unique capabilities. By the same token, you cannot simply start using a COM object, just as you cannot start reading a book without first finding that book. (The one exception is the WScript object, which you can simply start using.) Instead, before a script can use a COM object, it must first bind to that object. The WScript object provides two methods for creating COM objects: CreateObject and GetObject. Creating a New Instance of a COM Object To create a new instance of a COM object, a script can call the WScript CreateObject method and pass it the Programmatic Identifier (ProgID) of the COM object by using the following syntax: WScript.CreateObject(" ProgID") To continue the analogy with the library, the ProgID is roughly equivalent to the call number assigned to a book. If you go to the library and give the librarian the call number, he or she can locate the book for you. Likewise, if you pass the scripting host a ProgID, the scripting host can look in the registry and locate the COM object you want to create. ProgIDs are unique to each COM object, just as call numbers are unique to each book. How do you know the correct ProgID for a given COM object? Unfortunately, there is no simple answer to that question; your best course of action is to look at the documentation that accompanies the object. All ProgIDs are stored in the HKEY_CLASSES_ROOT portion of the registry, as shown in Figure 3.4. However, this listing is of only limited use because not all of these ProgIDs can be accessed using scripts. Figure 3.4 ProgIDs in the Registry  INCLUDEPICTURE "http://www.microsoft.com/library/media/1033/technet/images/scriptcenter/guide/sas_wsh_62s.gif" \* MERGEFORMATINET   HYPERLINK "http://www.microsoft.com/library/media/1033/technet/images/scriptcenter/guide/sas_wsh_62s_big.gif" \t "_blank" See full-sized image. To be able to use a newly created object, the script needs to store a reference to the object in a variable by using the following syntax: Set objVariable = WScript.CreateObject (" ProgID" ) After a reference to the object is stored in a variable, the script can call a method or access a property of the object by using dot notation. (Dot notation is discussed in the "VBScript Primer" chapter of this book.) Scripts call methods by using the following syntax: objVariable.MethodName Scripts access properties by using the same syntax: objVariable.PropertyName The script in Listing 3.1 creates a new instance of the ADSI System Information object (using the ProgID ADSystemInfo), stores a reference to it in the objSysInfo variable, and then displays the Domain Name System (DNS) domain name for the logged-on user. Listing 3.1 Using a COM Object 1 2Set objSysInfo = Wscript.CreateObject("ADSystemInfo") Wscript.Echo "Domain DNS name: " & objSysInfo.DomainDNSNameAs shown in Figure 3.5, only two portions of the code statement must change when you create different COM objects: the ProgID, and the name of the reference variable (if your script must reference multiple COM objects). Figure 3.5 Elements of a Statement That Creates a COM Object  INCLUDEPICTURE "http://www.microsoft.com/library/media/1033/technet/images/scriptcenter/guide/sas_wsh_070c.gif" \* MERGEFORMATINET   HYPERLINK "http://www.microsoft.com/library/media/1033/technet/images/scriptcenter/guide/sas_wsh_070c_big.gif" \t "_blank" See full-sized image. For example, the following lines of code bind to various COM objects. From line to line, the only item that changes is the ProgID: Set objReference = Wscript.CreateObject("Word.Application") Set objReference = Wscript.CreateObject("InternetExplorer.Application") Set objReference = Wscript.CreateObject("Scripting.Dictionary") Set objReference = Wscript.CreateObject("Wscript.Network") Attaching to an Existing Instance of a COM Object If the COM object you want to use is already running, you can use that existing object rather than create a new instance. The WScript GetObject method lets you reference and use a previously instantiated object instead of creating a new one. When you write scripts that use WMI or ADSI, you will typically use the GetObject method; this is because both WMI and ADSI are always available. (For example, you can stop the WMI service, but if you run a script that uses WMI, the service will automatically restart.) Although there are exceptions, a typical WMI script might start like this: Set objWMIService = Wscript.GetObject("winmgmts:") When you are writing scripts that use the WSH objects, you will usually use the CreateObject method because the WSH objects are not usually preinstantiated. Comparing VBScript CreateObject and GetObject Functions with WSH The VBScript language also provides CreateObject and GetObject functions. The VBScript CreateObject function and the WScript CreateObject method both instantiate COM objects when they are called with a single parameter, the ProgID of the COM object to instantiate. For example, these two lines of code the first using the VBScript version of CreateObject and the second using the WSH version are functionally identical; both instantiate an instance of the FileSystemObject: Set objFSO = CreateObject("Scripting.FileSystemObject") Set objFSO = Wscript.CreateObject("Scripting.FileSystemObject") Both versions of CreateObject can also accept a second parameter; however, each interprets this second parameter in a completely different way. Consider these two lines of code. The first line uses VBScript, and the second uses WSH: Set objExcel = CreateObject("Excel.Application", "Parameter2") Set objExcel = Wscript.CreateObject("Excel.Application", "Parameter2") The VBScript CreateObject function interprets the second parameter as a remote computer name and tries to create the COM object on that remote computer; in this example, it tries to instantiate an instance of Microsoft Excel on a remote computer named Parameter2. The WScript CreateObject method interprets a second parameter as a subroutine prefix to be used in handling events from the object. The two GetObject functions are similarly related. To simply create a COM object, you can use either the VBScript function or the WScript CreateObject method. After the object has been created, there are no differences in capabilities; all the methods and properties of the object available using Wscript CreateObject are also available using VBScript CreateObject. Furthermore, these properties and methods are all called in identical fashion. On the other hand, if you want to use the remote object creation or event-handling capabilities, you need to choose the method or function that provides that additional functionality. For more information about the VBScript CreateObject and GetObject functions, see " HYPERLINK "http://www.microsoft.com/technet/scriptcenter/guide/sas_vbs_overview.mspx" VBScript Primer" in this book. Handling Input and Output Microsoft Windows 2000 Scripting Guide Scripts have to interact with users. Output, for example, is a key element of many system administration scripts: A script that parses event logs for specific entries should display any entries it finds. Likewise, scripts need to be able to prompt users for input and then make use of that input. Suppose you write a script that retrieves information about the connectivity between two computers. You need to provide users with a simple way to specify the two computers being checked for connectivity. WSH provides a means for interacting with users and, perhaps more important, provides a way to receive input from and direct output to the command window. Among other things, this allows you to create VBScript scripts that can run as command-line utilities, accepting input from the command prompt and displaying output within a command window. This is more useful than it might first seem, because VBScript has no intrinsic methods for receiving input from or directing output to the command window. The WScript Echo method provides a simple way to display messages. It accepts an item (a string, a number, a date) as its only parameter and displays that item as a message to the user. The script in Listing 3.2 uses the WScript Echo method to display the version of WSH installed on the computer on which the script runs. Listing 3.2 Displaying the Version of WSH on a Computer 1Wscript.Echo "The version of WSH on this computer is: " & WScript.VersionIn addition, the WScript object has properties that enable your scripts to access three objects that provide input and output functionality: StdOut, StdIn, and StdErr. These objects provide their own methods and properties for working with input and output, which are shown in Figure 3.6. In general, only scripts run under CScript can access StdOut, StdIn, and StdErr. Figure 3.6 Methods and Properties of the TextStream Objects  INCLUDEPICTURE "http://www.microsoft.com/library/media/1033/technet/images/scriptcenter/guide/sas_wsh_80c.gif" \* MERGEFORMATINET   HYPERLINK "http://www.microsoft.com/library/media/1033/technet/images/scriptcenter/guide/sas_wsh_80c_big.gif" \t "_blank" See full-sized image. Displaying Messages to Script Users One of the primary purposes of system administration scripting is to answer questions. How much free hard disk space is available on this server? Which user account is Internet Information Service running under? Available memory is quite low on this mail server; what processes are running and using up the memory? For a script to answer questions such as these, it must retrieve the answers and have a way to communicate those answers back to you. Although scripts can save retrieved information in text files or databases, it is more common to have the script display that information on the screen. WSH can display information by using the Echo method. The WScript Echo method takes one or more items as parameters and displays those items to the user. If a script is run under CScript, the items are displayed in the command window. If a script is run under WScript, the items appear in message boxes. The Echo method can display almost any kind of data, including strings, numbers, dates and times, and even the results of mathematical calculations. For example, this line of code displays the value 4, the result of adding 2 and 2: Wscript.Echo 2 + 2 The Echo method is easy to implement; you simply call the method, followed by the information you want to display on the screen. To display the value of a variable, specify the variable name as the parameter: Wscript.Echo strMyVariable This also holds true for VBScript variables such as Now and Time: Wscript.Echo Now To display a string, simply enclose it in quotation marks: Wscript.Echo "This is my string." In fact, the only real trick to working with Wscript.Echo is understanding the difference between what happens when a script using this method runs under CScript and what happens when that same script runs under WScript. For example, consider the script in Listing 3.3, which displays three status messages by using the WScript.Echo method. Listing 3.3 Using the Echo Method to Display Three User Messages 1 2 3Wscript.Echo "Examining System Drives" Wscript.Echo "Determining Free Drive Space" Wscript.Echo "Mapping Network Drives"When run under CScript, the script displays the following in a command window all at once, without stopping or requiring any user interaction. Examining System Drives Determining Free Drive Space Mapping Network Drives When run under WScript, however, the script creates three separate message boxes, as shown in Figure 3.7. The message boxes are presented one at a time, and each requires a user to click the OK button before the next one can be displayed. Figure 3.7 Three Separate Message Boxes Produced by the Echo Method Running Under WScript  INCLUDEPICTURE "http://www.microsoft.com/library/media/1033/technet/images/scriptcenter/guide/sas_wsh_82s.gif" \* MERGEFORMATINET   HYPERLINK "http://www.microsoft.com/library/media/1033/technet/images/scriptcenter/guide/sas_wsh_82s_big.gif" \t "_blank" See full-sized image. Under WScript, each call to the WScript.Echo method results in the creation of a new message box. Depending on the script, this can be very important. If your script simply returns the amount of free disk space on drive C, the fact that this information is displayed in a message box rather than in the command window might be irrelevant. Suppose, however, that the script returns a list of all the services installed on a computer. Using WScript, you would need to respond to 100 or so message boxes, one for each service. In addition, as each message box was dismissed, that piece of information would disappear from the screen. Under CScript, not only is the information displayed in the command window without the need for any user intervention (such as dismissing message boxes), but all the information also remains on the screen until the command window is dismissed. This allows you to copy the data and paste it into another application. Getting Text into and out of Scripts Command-line tools (including batch files) typically interact with three standard input and output streams. These are known as Standard In (StdIn), Standard Out (StdOut), and Standard Error (StdErr). Unless you specify otherwise, the command processor assumes that input will be received from the keyboard (StdIn) and output (StdOut) and error messages (StdErr) should be sent to the command window. StdIn, StdOut, and StdErr (available only when your scripts run under CScript) provide your scripts with access to each of these streams. These streams serve several important purposes: They provide a way to display output in a command window.They provide a way for users to type input from a command prompt and have that input read by a script.They provide a way for scripts to access output and standard error information generated by a script, a batch file, or a command-line tool.Displaying Output Using StdOut StdOut can be used to display output within a command window. StdOut includes the properties shown in Table 3.4. Table 3.4 StdOut Methods MethodDescriptionWriteWrites the supplied characters to the screen but does not append a carriage return/linefeed. For example, this script uses the Write method four times: Wscript.StdOut.Write "ABCD" Wscript.StdOut.Write "EFGHIJKLMN" Wscript.StdOut.Write "OPQRSTUV" Wscript.StdOut.Write "WXYZ" When this script is run, the following output appears in the command window:WriteLineSimilar to Wscript.Echo, WriteLine writes the supplied characters to the screen and then appends a carriage return/linefeed (as though a user had pressed ENTER). For example, this script uses the WriteLine method four times: Wscript.StdOut.WriteLine "ABCD" Wscript.StdOut.WriteLine "EFGHIJKLMN" Wscript.StdOut.WriteLine "OPQRSTUV" Wscript.StdOut.WriteLine "WXYZ" When this script is run, the following output appears in the command window:WriteBlankLinesInserts a blank line in the output, as though a user had pressed ENTER twice without typing any characters. WriteBlankLines accepts a single parameter: the number of blank lines to insert. For example, this script uses WriteBlankLines to insert first 1 and then 2 blanks lines in the output: Wscript.StdOut.WriteLine "ABCD" Wscript.StdOut.WriteBlankLines 1 Wscript.StdOut.WriteLine "EFGHIJKLMN" Wscript.StdOut.WriteLine "OPQRSTUV" Wscript.StdOut.WriteBlankLines 2 Wscript.StdOut.WriteLine "WXYZ" When this script is run, the following output appears in the command window:The script in Listing 3.4 displays a message in the command window by using the Write and WriteLine methods of the StdOut TextStream object. Listing 3.4 Using the Write and WriteLine Methods to Display Messages in the Command Window 1 2 3 4 5 6 7 8 9 10Set objNetwork = Wscript.CreateObject("Wscript.Network") Set objStdOut = WScript.StdOut objStdOut.Write "User: " objStdOut.Write objNetwork.UserDomain objStdOut.Write "\" objStdOut.Write objNetwork.UserName objStdOut.WriteBlankLines(1) objStdOut.WriteLine objNetwork.ComputerName objStdOut.Write "Information retrieved." objStdOut.CloseThe following is output from the script in Listing 3.4: User: FABRIKAM\kenmyer atl-wk-01 Information retrieved. By contrast, here is what output from the same script would look like if Wscript.Echo were substituted for the StdOut methods: User: FABRIKAM \ kenmeyer atl-wk-01 Information retrieved. Reading Input by Using StdIn One way to provide a script with input is to use arguments (discussed later in this chapter). For example, the following command runs a script named DeleteUser.vbs, passing as an argument the name of the user account to be deleted: cscript DeleteUser.vbs kenmyer Arguments provide a quick and easy way to add input to a script. On the other hand, arguments require the user running the script to know which arguments need to be supplied and to know how to supply them. Instead of requiring users to memorize the syntax for your scripts, you can prompt users to supply the correct information after the script has started. For example: C:\Scripts\cscript DeleteUser.vbs Please enter the name of the user account to be deleted: _ StdIn can be used to read information entered at the command line. StdIn includes the methods and properties shown in Table 3.5. Table 3.5 StdIn Methods and Properties Method/PropertyDescriptionReadReads the specified number of characters and then stops. For example, the following reads and echoes 3 characters at a time from StdIn until the entire line has been read: Do Until Wscript.StdIn.AtEndOfLine strInput = Wscript.StdIn.Read(3) Wscript.Echo strInput Loop If StdIn consists of the string "abcdefghijklmnopqrstuvwxyz", output from the script will look like this:ReadLineReads one line from StdIn and then stops before reaching the newline character. ReadLine is particularly useful for reading input typed by users because it reads all the characters typed by the user before he or she pressed ENTER: strInput = Wscript.StdIn.ReadLine Wscript.Echo strInput If StdIn consists of the string "abcdefghijklmnopqrstuvwxyz", output from the script will look like this: abcdefghijklmnopqrstuvwxyz ReadLine is also useful for reading the output generated by a spawned command-line tool. For more information about this, see " HYPERLINK "http://www.microsoft.com/technet/scriptcenter/guide/sas_wsh_pkoy.mspx" Running Programs" later in this chapter.ReadAllUsed only for reading the output generated by a spawned command-line tool, batch file, or shell command.SkipSkips the specified number of characters and then stops. For example, this script skips the first 23 characters in StdIn and then reads any remaining characters one at a time: Wscript.StdIn.Skip(23) Do Until Wscript.StdIn.AtEndOfLine strInput = Wscript.StdIn.Read(1) Wscript.Echo strInput Loop If StdIn consists of the string "abcdefghijklmnopqrstuvwxyz", output from the script will look like this:SkipLineUsed to skip a line when reading the output generated by a spawned command-line tool, batch file, or shell command.AtEndOfLineBoolean value indicating whether the end of a line has been reached. When the Read method is used to retrieve input typed by a user, this property when True informs the script that the entire line has been read.Do Until Wscript.StdIn.AtEndOfLine strInput = Wscript.StdIn.Read(1) Wscript.Echo strInput LoopAtEndOfStreamBoolean value indicating whether the end of the stream has been reached. Used only for reading the output generated by a spawned command-line tool, batch file, or shell command.You can use StdIn to retrieve information from the user. To obtain input from the user, you do the following: 1.Use the Write method to display a prompt on screen (such as, "Please enter your name:"). The Write method is used to ensure that the prompt and the response are included on the same line. Your screen will look similar to this, with the underscore representing the command prompt cursor: C:\Scripts> Please enter your name: _2.Use the ReadLine method to read anything the user types at the command prompt, and store this information in a variable. Information is read until the user presses ENTER. For example, if you type Ken Myer and then press ENTER, the value Ken Myer will be stored in the variable. ReadLine can read as many as 254 characters typed at the command prompt.For instance, suppose you create a script that converts numbers from decimal to hexadecimal. You need to prompt the user to enter the decimal value to convert. The script in Listing 3.5 uses the ReadLine method of the WScript StdIn object to retrieve a decimal value from the user and store it in the strDecimal variable. The VBScript Hex function is used to convert the decimal value to hexadecimal, and the WriteLine method of the WScript StdOut object is used to display the results. Listing 3.5 Convert Between Decimal and Hexadecimal 1 2 3 4 5Wscript.StdOut.Write "Enter a Decimal Number: " strDecimal = Wscript.StdIn.ReadLine Wscript.StdOut.WriteLine strDecimal & " is equal to " & _ Hex(strDecimal) & " in hex."When run under CScript, the interaction between the script and the user looks similar to this: C:\Scripts>cscript test.vbs Microsoft (R) Windows Script Host Version 5.6 Copyright (C) Microsoft Corporation 1996-2001. All rights reserved. Enter a Decimal Number: 256 256 is equal to 100 in hex. Working with Command-Line Arguments Microsoft Windows 2000 Scripting Guide Command-line arguments are values that you enter at the command line when you run a script. If you have worked with command-line tools, you are already familiar with the concept of arguments. For example, when you run Ping.exe, you must supply, at a minimum, the name or the Internet Protocol (IP) address of the computer being pinged as a command-line argument: ping 192.168.1.1 Providing values to a script by means of the command line is convenient in cases in which you expect the values to be different each time the script runs. If the values were hard coded within the script, changing the values would require you to edit the script. Using command-line arguments saves time in these cases. Again, this is no different from working with command-line tools. Ping.exe uses command-line arguments to provide flexibility: This way, you can attempt to ping any computer anywhere. If Ping.exe did not accept command-line arguments, you would either need a separate version of the program for each computer you wanted to ping, or you would have to edit and recompile the source code any time you wanted to ping a different computer. Command-line arguments are stored in the WshArguments collection, which you access through the Arguments property of the WScript object as shown in Figure 3.8. In addition to storing all command-line arguments in the WshArguments collection, WSH automatically filters each argument into the WshNamed or WshUnnamed collection based on the format of the argument. Figure 3.8 WSH Command-Line Argument Collections  INCLUDEPICTURE "http://www.microsoft.com/library/media/1033/technet/images/scriptcenter/guide/sas_wsh_60c.gif" \* MERGEFORMATINET   HYPERLINK "http://www.microsoft.com/library/media/1033/technet/images/scriptcenter/guide/sas_wsh_60c_big.gif" \t "_blank" See full-sized image. How Command-Line Arguments Are Stored and Filtered When you run a script with command-line arguments, the WSH runtime stores these values in a location in memory represented by the WshArguments collection. The WSH runtime stores the arguments in the WshArguments collection in the order in which they were entered on the command line: WScript.Arguments.Item(0) contains the first command-line argument, WScript.Arguments.Item(1) contains the second argument, and so on. In addition to storing all command-line arguments in the WshArguments collection, WSH automatically filters the command-line arguments into one of two subcollections: WshNamed or WshUnnamed. Arguments that conform to /name:value format are stored in the WshNamed collection, and arguments that do not follow the /name:value format are stored in the WshUnnamed collection. The purpose behind filtering arguments will become clear later in this section. For example, the following command runs the ServerStats.vbs script and passes three command-line arguments to the script: /s:atl-dc-01, /u:admin, and perf. cscript serverstats.vbs /s:atl-dc-01 /u:admin perf The command-line arguments follow the script name and are separated by one or more spaces. Because of this, command-line arguments that contain white space must be enclosed in quotation marks to be treated as a single argument. For example, in this command, the third argument contains a blank space. As a result, the entire argument must be enclosed in quotation marks: cscript serverstats.vbs /s:atl-dc-01 /u:admin "perf monitor" Without the quotation marks, perf and monitor would be treated as separate arguments. Figure 3.9 illustrates the contents of the three argument collections having run status.vbs with the three command-line arguments /s:atl-dc-01, /u:admin, and perf. Figure 3.9 Mechanics of the WSH Argument Collections  INCLUDEPICTURE "http://www.microsoft.com/library/media/1033/technet/images/scriptcenter/guide/sas_wsh_105c.gif" \* MERGEFORMATINET   HYPERLINK "http://www.microsoft.com/library/media/1033/technet/images/scriptcenter/guide/sas_wsh_105c_big.gif" \t "_blank" See full-sized image. All command-line arguments are stored in the WshArguments collection exactly as they are typed on the command line. Count and Length return the total number of command-line arguments entered on the command line. The WshNamed filtered collection contains the two named arguments. Named arguments are arguments that consist of two parts: a name and a value. The name must be prefaced with a forward slash, and a colon must separate the name from the value. The slash prefix and the colon separator are fixed and cannot be changed. For example, you cannot use a hyphen in place of the slash; the following command will not pass Server as a named argument; instead, it will treat -Server:atl-dc-01 as the value of a single unnamed argument: cscript serverstats.vbs -Server:atl-dc-01 If you examine Figure 3.9 closely, you will see that named arguments are modified before they are stored in the WshNamed collection. The name portion of the argument becomes the index, or key, and is used with the WshNamed Item property to identify the argument to retrieve. The name is also used with the WshNamed Exists method to check whether a named argument was provided to the script at run time. The slash prefix and the colon separator are discarded, and only the value portion of the named argument is stored in the Item property of the WshNamed collection. Like WshArguments, the WshNamed Count method and Length property return the number of filtered arguments in the WshNamed collection. The WshUnnamed filtered collection contains the one unnamed argument: perf. The WshUnnamed Count method and Length property return the number of filtered arguments in the WshUnnamed collection. There are three ways to access command-line arguments: You can access the entire set of arguments using the WshArguments collection.You can access the arguments that have names using the WshNamed collection.You can access the arguments that have no names using the WshUnnamed collection.Using the Default Arguments Collection As described in the preceding topic, all command-line arguments are stored in the default arguments collection, WshArguments. The WshArguments collection is accessed through the WScript Arguments property. WshArguments provides two methods and four properties to read and work with command-line arguments. Methods Count. Returns the total number of arguments in the WshArguments collection. ShowUsage. Echoes usage instructions about the script. This is constructed from information provided in the section of a Windows Script File (.wsf). Windows Script Files are not discussed in this book. Properties Named. Provides access to the WshNamed collection. WshNamed is a filtered collection of arguments, where each argument conforms to the following format: /name:value. Command-line arguments that conform to the /name:value format are called named arguments in WSH. Unnamed. Provides access to the WshUnnamed collection. WshUnnamed is a filtered collection of arguments, drawn from WshArguments, that do not conform to the /name:value format. Windows Script Host refers to these as unnamed arguments. Length. Returns the total number of arguments in the WshArguments collection. Note You might have noticed that the Length property is identical to the Count method. Length was provided to maintain a level of consistency with the ECMAScript Language Specification, Standard ECMA-262, which JScript is based on. Although either Count or Length can be used to determine the number of arguments passed to VBScript, you must use Length with JScript. Any attempt to use Count with JScript will result in a run-time error.Item(n). Retrieves the element from the WshArguments collection that corresponds to the index number enclosed in parentheses. The following command runs a fictitious script named GetEvents.vbs with three arguments: cscript getevents.vbs atl-dc-01 "Directory Service" 1130 WSH stores the three arguments in the WshArguments collection in the order in which they were entered, and exactly as they were typed on the command line. To read the three arguments, you use the WScript Arguments property in combination with the WshArguments Item property as shown here: ServerName = WScript.Arguments.Item(0) EventLog = WScript.Arguments.Item(1) EventID = WScript.Arguments.Item(2) Because collections are zero-based, WScript.Arguments.Item(0) points to the first argument in the WshArguments collection. WScript.Arguments.Item(1) points to the second argument, which is enclosed inside quotation marks because the argument, Directory Services, contains a space. Omitting the quotation marks would cause the two words to be treated as separate arguments, which would lead to errors because incorrect values would be assigned to the EventLog and EventID variables. WScript.Arguments.Item(2) points to the third argument. The collection looks like the one shown in Table 3.6. Table 3.6 Sample WSH Arguments Collection ItemValue0atl-dc-011Directory Service21130If the fictitious script employed additional arguments, WScript.Arguments.Item(3) would point to the fourth argument, WScript.Arguments.Item(4) would point to the fifth argument, and so on. There is no fixed limit on the number of arguments that can be stored in the WshArguments collection. However, the entire command line, which includes the host name, host options, script name, and script arguments, cannot exceed the maximum command-line length. Exceeding the maximum command-line length generally is not a problem unless you use the WSH Drag and Drop feature to populate WshArguments. The maximum command-line length also applies to WSH Drag and Drop. You can reduce the amount of typing necessary to access each argument by setting a reference to the WshArguments collection by way of the WScript Arguments property. Use the VBScript Set keyword followed by the variable name you want to use to access the WshArguments collection. Set is required because collections are standard COM objects. The following example is functionally equivalent to the preceding example despite some syntactical differences. Set args = WScript.Arguments ServerName = args.Item(0) EventLog = args.Item(1) EventID = args.Item(2) The previous three examples assume GetEvents.vbs is always passed three command-line arguments. While omitting any kind of argument verification might be OK for a quick ad hoc script, failing to perform some level of verification can lead to error-prone scripts, especially when the script is shared with other users. The following command runs the fictitious GetEvents.vbs script without any arguments. cscript getevents.vbs Running GetEvents.vbs without arguments using one of the three previous examples would result in the following run-time error: C:\Scripts\GetEvents.vbs(2, 1) Microsoft VBScript runtime error: Subscript out of range Any attempt at using the Item property to access an argument that does not exist will result in a Subscript out of range run-time error. Listing 3.6 demonstrates how to use the WshArguments Count method to verify that the correct number of command-line arguments is provided to the script at run time. Listing 3.6 Using Count to Verify the Number of Arguments Used 1 2 3 4 5 6 7 8If WScript.Arguments.Count = 3 Then ServerName = WScript.Arguments.Item(0) EventLog = WScript.Arguments.Item(1) EventID = WScript.Arguments.Item(2) Else Wscript.Echo "Usage: GetEvents.vbs ServerName EventLog EventID" Wscript.Quit End IfIn Line 1 of Listing 3.6, the script uses the WshArguments Count method to obtain the number of command-line arguments in the WshArguments collection. If the value is equal to 3, the script initializes the ServerName, EventLog, and EventID variables with the three arguments in the WshArguments collection. Otherwise, the script echoes usage instructions and immediately exits. Unnamed Command-Line Arguments Unnamed arguments are entered on the command line as values only, without an associated name. At times the order of your arguments might be irrelevant; for example, a script might require you to type in three computer names, and it makes no difference which computer the script runs against first. Otherwise, unnamed arguments must be entered in the order that the script requires. You might want to use unnamed arguments when your script: Accepts only one or two command-line arguments. If your script accepts only the name of a folder as its sole command-line argument, there is no reason to make this a named argument.Accepts arguments that are all of the same type and are each used in the same way within your script. For example, you might have a script that backs up and clears event logs on all computers whose names are entered as command-line arguments. Because all the arguments are the same (names of servers), and because the order is probably irrelevant, there is no reason to use named arguments.When you run a script with unnamed command-line arguments, the WSH runtime stores the arguments in the WshArguments collection in the order in which they were entered on the command line. The arguments can then be referenced in the script using index numbers that represent the order in which they were entered. The sequence of index numbers begins with 0. The script in Listing 3.7 uses the unnamed command-line arguments collection to retrieve and display the command-line arguments provided to it. Listing 3.7 Retrieving Command-Line Arguments Using the Arguments Collection 1 2 3 4 5 6 7strServer = WScript.Arguments.Item(0) strPacketSize = WScript.Arguments.Item(1) strTimeout = WScript.Arguments.Item(2) Wscript.Echo "Pinging Server: " & strServer Wscript.Echo "Packet Size: " & strPacketSize Wscript.Echo "Timeout: " & strTimeoutThe following command runs the script with the command-line arguments entered in the order required by the script. EchoUnnamedArgs.vbs DCServer01 100 5000 This command produces the following output: Pinging Server: DCServer01 Packet Size: 100 Timeout: 5000 This command runs the same script with the command-line arguments entered in the wrong order. EchoUnnamedArgs.vbs 100 DCServer01 5000 This command produces the following output: Pinging Server: 100 Packet Size: DCServer01 Timeout: 5000 The output from the first command is correct but the output from the second command is incorrect. Because the script is written using unnamed arguments, the order in which the command-line arguments are entered is crucial for the script to work properly. If the script actually tried to run Ping.exe, the procedure would fail because there is no server named 100 and no such thing as a packet size of DCServer01. Named Command-Line Arguments As the preceding example showed, the order in which unnamed arguments are entered can make the difference between a script that runs successfully and a script that does not. This places a considerable burden on administrators running the script; not only must they supply the correct arguments, but they must also supply them in the correct order. One mistake will likely cause the script to fail. To make it easier for people to run scripts that use multiple arguments, you can use named arguments instead. Named arguments are entered on the command line as values with associated names. They can be entered in any order. A named argument begins with a slash (/), and the name and the value are separated by a colon (:). The following command runs a script named ServerTest.vbs with two named arguments: ServerTest.vbs /Server:HRServer01 /Timeout:3000 The name of the first argument is Server, and its value is HRServer01. The name of the second argument is Timeout, and its value is 3000. These arguments could also be entered in the reverse order, as follows: ServerTest.vbs /Timeout:3000 /Server:HRServer01 When you run a script with named command-line arguments, each arguments name and value are stored in the WshNamed collection. The script in Listing 3.8 uses the named command-line arguments collection to retrieve and display the command-line arguments it receives in the command window. Listing 3.8 Retrieving Command-Line Arguments Using the Named Arguments Collection 1 2 3 4 5 6 7 8Set colNamedArguments = WScript.Arguments.Named strServer = colNamedArguments.Item("Server") strPacketSize = colNamedArguments.Item("PacketSize") strTimeout = colNamedArguments.Item("Timeout") Wscript.Echo "Server Name: " & strServer Wscript.Echo "Packet Size: " & strPacketSize Wscript.Echo "Timeout (ms): " & strTimeoutThe following command runs the script with three named arguments. EchoNamedArgs.vbs /Server:HRServer01 /PacketSize:300 /Timeout:8000 This command produces the following output: Server Name: HRServer01 Packet Size: 300 Timeout (ms): 8000 This command runs the same script with the order of the named arguments changed. EchoNamedArgs.vbs /Timeout:8000 /PacketSize:300 /Server:HRServer01 This command produces the following output: Server Name: HRServer01 Packet Size: 300 Timeout (ms): 8000 The output from the first command and the second command is the same. You can enter named arguments in any order without affecting the outcome of the script. Named arguments are also useful when you want to include optional parameters within your scripts. The script in Listing 3.9 is similar to the script in Listing 3.8, but the PacketSize argument is an optional argument. If the script user does not enter a packet size, the script uses a default packet size. The script uses the Exists method to check whether the user entered an argument named PacketSize. If the result of the test is True, the script proceeds to line 7. If the result of the test is False, the script proceeds to line 9, where the PacketSize variable is set to 100, using the DEFAULT_PACKET_SIZE constant. Listing 3.9 Retrieving Command-Line Arguments and Using Default Argument Values 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19Const DEFAULT_PACKET_SIZE = 100 Set colNamedArguments = WScript.Arguments.Named strServer = colNamedArguments.Item("Server") If colNamedArguments.Exists("PacketSize") Then strPacketSize = colNamedArguments.Item("PacketSize") Else strPacketSize = DEFAULT_PACKET_SIZE End If strTimeout = colNamedArguments.Item("Timeout") Wscript.Echo "Server Name: " & strServer If colNamedArguments.Exists("PacketSize") Then Wscript.Echo "Packet Size :" & strPacketSize Else Wscript.Echo "Packet Size [default]: " & strPacketSize End If Wscript.Echo "Timeout (ms): " & strTimeoutUsing Both Unnamed and Named Arguments In most cases, you should not use both named and unnamed arguments in the same script. Using both types of arguments makes the required command-line syntax more difficult to remember. If your script accepts two or fewer arguments or multiple arguments of the same type, you might want to use unnamed arguments. If your script accepts three arguments of distinct types or has optional arguments, you should probably use named arguments. Occasionally, however, it can be useful to mix named and unnamed arguments in a script. For example, if you have a script that has one required argument and a number of optional arguments, you can use an unnamed argument for the required argument and named arguments for all of the optional arguments. The following command contains a required server name (HRServer01) plus three optional arguments. In this command, the unnamed argument must be listed first, or the script will likely fail. CheckServer.vbs HRServer01 /timeout:200 /logfile:serverlog.txt /verbose:true Verifying Command-Line Arguments Many of your scripts will require you to enter the required number and types of command-line arguments for the scripts to run correctly. You might need to perform two verifications on command-line arguments: Number of arguments entered is within the acceptable rangeRequired arguments have been enteredVerifying the Number of Arguments Entered Some scripts require a specific number of command-line arguments. For example, suppose you have a script that copies files from one computer to another. This script likely requires two, and only two, command-line arguments: the name of the source computer and the name of the target computer. Trying to run this script with one command-line argument or with three command-line arguments would not make any sense; there would be no way for the script to correctly determine the source and target computers. In a situation such as this, one of the first things the script should do is verify that two command-line arguments were entered. This requires little effort on your part because arguments are returned as part of a collection, and collections typically include a Count property. The purpose of the Count property is to tell you how many items are in the collection. If Wscript.Arguments.Count equals 2, two arguments are in the collection. The script in Listing 3.10 verifies the number of command-line arguments entered. The script accepts up to four arguments, any two of which are optional. Therefore, the user must enter at least two but no more than four arguments. Listing 3.10 Verifying the Number of Command-Line Arguments Entered 1 2 3 4 5 6 7 8 9iNumberOfArguments = WScript.Arguments.Count If iNumberOfArguments >= 2 And iNumberOfArguments <= 4 Then Wscript.Echo iNumberOfArguments & " arguments entered. " & _ "This is a valid number." Else Wscript.Echo "Error: invalid number of arguments entered. " & _ "Please enter 2, 3, or 4 arguments." Wscript.Quit End IfIn line 1 of Listing 3.10, the script uses WScript.Arguments.Count to determine the number of command-line arguments entered. The script stores this value in the iNumberOfArguments variable. In line 2, the script uses iNumberOfArguments >=2 And iNumberOfArguments <=4 to test whether the user entered 2, 3, or 4 arguments: If the result of the test is True, the script proceeds to line 3 and uses the Echo method to display a message indicating that the correct number of arguments was entered.If the result of the test is False, the script proceeds to line 6 and uses the Echo method to display an error message indicating that the wrong number of arguments was entered.The following command tries to run the script with more than four arguments. CheckNumArgs.vbs HRServer01 RASServer01 SQLServer01 1000 300 This command produces the following output: Error: invalid number of arguments entered. Please enter 2, 3, or 4 arguments. The output informs you that you have entered the wrong number of arguments. You are told that you should have entered between two, three, or four arguments instead of the five you entered. This command runs the script with three arguments, an acceptable number for the script. CheckNumArgs.vbs HRServer01 1000 300 This command produces the following output: 3 arguments entered. This is a valid number. The output validates the fact that you have entered the correct number of arguments and that, as a result, the script is proceeding as expected. The script then displays the number of arguments you entered. Verifying That All Required Arguments Are Entered When you use command-line arguments in a script, the script should check to ensure that any required arguments have been entered before it proceeds. Unfortunately, WSH does not allow you to specify that an argument is required, and then notify you if the argument is not found. For example, if you run a command-line tool without a required argument, the tool typically will not run; instead, it displays usage instructions. Your scripts can do the same thing, but it is up to you to write code that checks the arguments collection and ensures that all the required arguments are present. If you need to use required arguments in a script, it is recommended that you use named arguments. One advantage of using named arguments is that you can then use the Exists method to check whether an argument has been provided. For example, this line of code checks whether an argument named FolderName is present in the arguments collection. If the argument exists, the value 1 (True) will be echoed to the screen. Otherwise, the value 0 (False) will be displayed: Wscript.Echo colNamedArguments.Exists("FolderName") Suppose you enter the correct number of arguments but omit a required argument. The script in Listing 3.11 builds on the script in Listing 3.10. It uses the WshNamed collection Exists method to ensure that the named argument, Server, is among the arguments that you entered. In line 4, the script uses Not colNamedArgument.Exists("Server") to test whether the user has entered the named argument Server: If the test reveals that the argument was not entered, the script proceeds to line 5. There the script uses the Echo method to display a message indicating that the named argument Server is required for the script to run. In line 6, Wscript.Quit is used to stop the script from running because the required argument, Server, was not entered.If the test reveals that the argument was entered, the script proceeds to line 7. In lines 9 and 10, the script uses colNamedArguments.Item("Server") to retrieve the value of the Server named argument entered by the user. The script then displays a message constructed from this value. The message tells the user the value they entered for the Server named argument.Listing 3.11 Verifying That All Required Arguments Are Entered 1 2 3 4 5 6 7 8 9 10 11 12 13 14iNumberOfArguments = WScript.Arguments.Count Set colNamedArguments = WScript.Arguments.Named If Not colNamedArguments.Exists("Server") Then Wscript.Echo "Usage: /Server: is required." Wscript.Quit ElseIf iNumberOfArguments >= 2 Or iNumberOfArguments <= 4 Then Wscript.Echo iNumberOfArguments & " arguments entered" Wscript.Echo "including Server Name: " & _ colNamedArguments.Item("Server") Else Wscript.Echo "Usage: Please enter between 2 and 4 arguments." Wscript.Quit End IfThe following command tries to run the script without including the Server named argument. CheckReqArgs.vbs 1000 300 This command produces the following output: Usage: /Server: is required. The output reflects the fact that you have not entered the Server named argument, which is required, by displaying a usage message. This command runs the script with the required argument and an acceptable number of arguments. CheckReqArgs.vbs /Server:HRServer01 1000 300 This command produces the following output: 3 arguments entered including Server Name: HRServer01 The output reflects the fact that you have entered the correct number of arguments, including the required Server named argument. The script displays the value entered for the Server argument to reinforce the fact that this required argument was actually entered. Controlling How a Script Runs Microsoft Windows 2000 Scripting Guide When you run a script, the commands in the script are typically executed in the order in which they appear in the script file. There are no pauses in the running of the script, and the script ends only after the last command is completed. The WScript object provides two properties (Timeout and Interactive) and two methods (Sleep and Quit) that enable you to alter how a script runs. A script can use these properties and methods to cause itself to: Pause for a specified length of time.Immediately stop running.Stop running after a specified length of time.Pausing a Script Most of the time, WSH attempts to complete a script as quickly as possible; as soon as WSH finishes executing the first line of code, it begins executing the second line of code. More often than not, this is the desired behavior: In general, the faster a script can complete its tasks, the better. There are times, however, when you do not want a script to run as quickly as possible. For example, suppose you need to monitor processor use on a computer. To do this, you might want to record processor use every 10 seconds until you have collected 100 measurements. In this case, you do not want the script to take these 100 measurements as quickly as it can. Instead, you want it to take the first measurement and then wait 10 seconds before taking the second measurement. A script can force itself to pause by calling the WScript Sleep method. The Sleep method accepts a single parameter that indicates how long, in milliseconds, to pause the script. (There are 1,000 milliseconds in a second and 60,000 milliseconds in a minute.) You will need to use the Sleep method in your scripts when: Your script must wait for an event to occur before continuing to run.You want your script to periodically check the status of a system parameter (for example, checking processor usage every 10 seconds).Your script is interacting with a user and you want to slow the interaction to a usable speed. For example, when displaying events retrieved from an event log, you might want to insert a pause, giving the user time to read the first event before displaying the next event.The script in Listing 3.12 checks the amount of free space on all the disk drives on a computer. The script then pauses for 5 minutes (300,000 milliseconds) and then checks free disk space again. Listing 3.12 Using the Sleep Method to Pause a Script 1 2 3 4 5 6 7 8 9 10 11 12strComputer = "." Set objWMIService = GetObject("winmgmts:" _ & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") Do While True Set colDisks = objWMIService.ExecQuery _ ("SELECT * FROM Win32_LogicalDisk") For Each objDisk in colDisks Wscript.Echo "DeviceID: " & objDisk.DeviceID Wscript.Echo "Free Disk Space: " & objDisk.FreeSpace Next Wscript.Sleep 300000 LoopNote The preceding script is designed to run indefinitely. To stop the script, you will need to terminate the process under which it is running.Quitting a Script In general, scripts begin by executing line 1 and continue to run until each line in the script has been executed. (This is not entirely true, but it will do for the purposes of this discussion. In reality, some lines of code such as those in a particular function might be skipped rather than executed.) After each line of code has been executed, the script automatically terminates itself. For example, this simple little script echoes three numbers to the screen and then quits. The script does not include any special instructions telling it to quit; it automatically terminates after executing the last line: Wscript.Echo "1" Wscript.Echo "1" Wscript.Echo "2" Wscript.Echo "3" Most of the time, this is exactly what you want a script to do. However, there might be occasions when you want a script to terminate before every line of code has been executed. For example, suppose you have a script that requires two command-line arguments: a source computer and a target computer. At the very beginning of the script, you check to see whether two (and only two) arguments have been supplied. If they have, the script continues. But what if they have not? What if the user supplied only one argument, or what if the user supplied four arguments? In that case, there is no reason to proceed; after all, the script is likely to fail and could leave one or more computers in an indeterminate state. In this case, the best course of action might be to echo a message stating that the user must supply two command-line arguments, and then immediately terminate the script, regardless of how many lines of code remain unexecuted. A script can force itself to stop running before it reaches its last command by calling the Quit method. This can be done using a single line of code: Wscript.Quit Wscript.Quit When a script executes the Quit method, it immediately terminates. For example, this script echoes three messages and then quits. The last three Wscript.Echo commands will never execute: Wscript.Echo "1" Wscript.Echo "1" Wscript.Echo "2" Wscript.Echo "3" Wscript.Quit Wscript.Echo "4" Wscript.Echo "5" Wscript.Echo "6" Setting a Time-out Value for a Script It is good practice to set the time-out value on any script, but it is particularly important if the script is liable to run into issues that might force it to run indefinitely. For example, suppose you have a script that must first connect to a remote computer. What if this connection cannot be made? In that case, you might include code that tells the script to wait 60 seconds after a failed connection and then try again. The script will continue in this loop until the connection is made. But what if the remote computer has been permanently removed from the network? In that case, the script could theoretically run forever, taking up computer processing cycles and using up network bandwidth as it tries to make a connection that can no longer be made. In a situation such as that, it might be beneficial to set the Timeout property. This instructs the script to run only for a set amount of time. If it cannot complete its task when the time period expires, the script simply terminates. The WScript Timeout property sets a time period, in seconds, after which a script will stop running. (By default, WSH does not time out the running of a script.) Setting a Timeout ensures that no script will run forever. The script in Listing 3.13 sets a time-out value of 5 seconds. If the script has not finished executing 5 seconds after it starts, the script will automatically terminate. Because the script includes a 60-second pause (line 2), the timeout will always expire before the script completes. As a result, line 3, which echoes a message to the screen, will never run. Listing 3.13 Setting the Time-out Value of a Script 1 2 3Wscript.Timeout = 5 Wscript.Sleep 60000 Wscript.Echo "Script is finished." Obtaining WSH Environment Information Microsoft Windows 2000 Scripting Guide The WScript object has a number of properties that provide information about the script host being used and the script being run. This metadata includes the information shown in Table 3.7. Table 3.7 WSH Environment Properties PropertyDescriptionScriptFullNameFull path of the currently running script (for example, C:\Scripts\Monitor.vbs).ScriptNameFile name of the currently running script (for example, Monitor.vbs).VersionWSH version number (for example, 5.6).BuildWSH build number. The full version number of Windows Script Host consists of the product release version number followed by the build version number. For example, if the Windows Script Host product release version number is 5.6, and the build version number is 6626, the full version number is 5.6.6626. The build number is perhaps most useful if you are testing beta copies of WSH. Otherwise, the version number will typically suffice.NameAlways returns Windows Script Host.FullNameFull path to the script host (either Wscript.exe or CScript.exe).PathFull path to the folder where the script host is located. Does not include the file name (Wscript.exe or Cscript.exe).This metadata can be extremely useful. For example, the version number can be used to verify that a computer has the correct version of WSH installed; if you have a script that requires WSH 5.6, the script can first check the version number and then terminate if Version is not 5.6. For example: If Wscript.Version <> "5.6" Then Wscript.Echo "This script must be run under WSH 5.6." Wscript.Quit End If Likewise, you might have a script that makes extensive use of Wscript.Echo. In that case, you probably do not want to run the script under WScript; this can result in hundreds of message boxes that must be responded to. Consequently, your script might check to see which script host it is running under and then terminate if the host is not CScript. You can determine the script host by using the FullName property and using the VBScript function Right to check the last 11 characters. (To ensure that the check is done correctly, you should also convert these 11 characters to uppercase using the UCase function.) If the last 11 characters equal WSCRIPT.EXE, the script is running under WScript. If the last 11 characters are CSCRIPT.EXE, the script is running under CScript. Note Why the last 11 characters? The value of ScriptFullName will vary depending on where WSH has been installed; it might be C:\Winnt\System32\CScript.exe, or it might be E:\Windows\System32\Wscript.exe. However, the last 11 characters in the path will always be either Wscript.exe or Cscript.exe.For example, the following script snippet checks the script host and then displays a message and terminates if the host is WSCRIPT.EXE: If UCase(Right(Wscript.FullName, 11)) = "WSCRIPT.EXE" Then Wscript.Echo "This script must be run under CScript." Wscript.Quit End If The script in Listing 3.14 displays the available WSH environment properties by retrieving them and echoing them to the screen. Listing 3.14 Displaying Information About the WSH Environment 1 2 3 4 5 6 7Wscript.Echo "Script Full Name: " & Wscript.ScriptFullName Wscript.Echo "Script Name: " & Wscript.ScriptName Wscript.Echo "Version: " & WScript.Version Wscript.Echo "Build: " & Wscript.BuildVersion Wscript.Echo "Name: " & Wscript.Name Wscript.Echo "Full Name: " & Wscript.FullName Wscript.Echo "Path: " & Wscript.PathThe following is typical output from the script: Script Full Name: C:\scripts\wsh_info.vbs Script Name: wsh_info.vbs Version: 5.6 Build: 6626 Name: Windows Script Host Full Name: C:\WINDOWS\System32\CScript.exe Path: C:\WINDOWS\System32 Handling Events Microsoft Windows 2000 Scripting Guide Windows is an event-based operating system. Events generated within Windows are often the result of a user action such as the click of an OK button or the movement of a mouse. Typically, most of the actions performed by a Windows program are the result of handling these user-generated events. For example, when you start an application such as Microsoft Word, the application loads and then waits for you to do something (for example, type something on the keyboard or select something with the mouse). Word will wait indefinitely until you trigger an event that it can respond to. The event mechanism also enables software components to communicate with one another. When an occurrence takes place in one component (firing component), another component (handling component) is notified of the occurrence. The handling component can respond by performing some action. Event handling mechanism used by WSH is not commonly employed in system administration scripts. Scripts tend to be procedure-driven; that is, after they have been set in motion, they run on their own, neither looking for nor responding to outside events. Note The ability to monitor resources and respond to changes in these resources is extremely important. However, this type of event handling is best done using WMI.Event handling can be important in scripts that automate Windows GUI applications, and such scripts are sometimes useful to system administrators. For example, WSH scripts can use Microsoft Internet Explorer to provide a GUI interface for users. Simple examples of this can be found in the chapter "Creating Enterprise Scripts" in this book. WshShell Object Microsoft Windows 2000 Scripting Guide The shell is the component of Windows that presents users with an interface to the operating system and provides familiar elements of the Windows desktop experience, including Windows Explorer, the Start menu, shortcuts, and desktop themes. The WshShell object gives your scripts the ability to work with the Windows shell. Your scripts can use the WshShell object to perform a number of system administration tasks, including running programs, reading from and writing to the registry, and creating shortcuts. Figure 3.10 shows the properties and methods of the WshShell object. Figure 3.10 WshShell Object Model  INCLUDEPICTURE "http://www.microsoft.com/library/media/1033/technet/images/scriptcenter/guide/sas_wsh_110c.gif" \* MERGEFORMATINET   HYPERLINK "http://www.microsoft.com/library/media/1033/technet/images/scriptcenter/guide/sas_wsh_110c_big.gif" \t "_blank" See full-sized image. Accessing the WshShell Object The WshShell object is a COM object, and using the following code statement can create an instance of the object: Set objShell = WScript.CreateObject("WScript.Shell") WshShell Capabilities The WshShell object enables your script to automate tasks in a number of categories related to the Windows shell. Table 3.8 lists these categories along with the methods and properties of the WshShell object that your scripts can use to access this functionality. Table 3.8 Capabilities Provided by the WshShell Object CategoryMethod or PropertyRunning ProgramsRun, ExecWorking with Special FoldersSpecialFoldersWorking with ShortcutsCreateShortcutWorking with Environment VariablesEnvironment, ExpandEnvironmentStringsWorking with the Event LogLogEventWorking with the RegistryRegRead, RegWrite, RegDeleteSending Keystrokes to an ApplicationAppActivate, SendKeysObtaining a Scripts Current DirectoryCurrentDirectoryCreating Timed Dialog BoxesPopupRunning Programs Microsoft Windows 2000 Scripting Guide One of the most important lessons to learn about scripting is this: Scripting is not the answer to all your system administration needs. For one thing, scripting does not provide 100 percent coverage for all the administrative tasks that can be performed under Windows. For example, you can use scripts to create shared folders. But what if you want to set the offline folder options for that share? This procedure cannot be scripted using WSH or WMI. Instead, you must configure offline folder options using either the GUI or the Net.exe command. For another, there is no reason to write a script if a tool already exists that fills your needs. Suppose you want to see the list of files that are stored in a folder on the local computer. You can spend the time creating a script to return this information. Alternatively, you can simply type dir at the command prompt and be done with it. Using WSH scripts to help automate tasks does not require that you abandon the command-line tools or batch scripts that you currently use. If you have a batch script that performs well at a given task, there is no reason to create a WSH script that performs the same task. On the other hand, you might want to augment the capabilities of a batch script with capabilities available only in the WSH scripting environment. For example, you might have a disk cleanup utility that you want to run only if free disk space falls below a specified level. It is possible to create a batch file that can determine free disk space and then decide whether to run the cleanup utility; however, the procedure for creating such a batch file is not particularly straightforward. By contrast, this same task can be accomplished quite easily in WSH: You can use the FileSystemObject or WMI to determine the free disk space and then either run or not run the disk cleanup utility. One of the advantages of using WSH is that you do not have to choose WSH or choose batch files and command-line tools. The two approaches are not at odds with one another; instead, they complement one another. For example, you can use the WshShell Run and Exec methods in scripts to incorporate existing batch files or command-line tools. Although running command-line tools and running batch scripts are important uses of the Run and Exec methods, these methods are not restricted to running a particular type of program. The Run and Exec methods enable your scripts to run any Windows program, including GUI applications. In addition, you can also run other scripts from within a script. Comparing Run and Exec The fact that there are two ways to run programs from a script leads to an obvious question: which method should you use in your scripts? The answer to that question depends on the script and what it needs to accomplish. A script can use either the Run method or the Exec method to run a program in a manner similar to using the Run dialog box from the Start menu. Regardless of the method used, the program starts, and runs in a new process. However, when you use the Run method, your script will not have access to the standard input, output, and error streams generated by the program being run. A script cannot use the Run method to run a command-line tool and retrieve its output. For example, suppose you want to run Ping.exe and then examine the output to see whether the computer could be successfully contacted. This cannot be done using the Run command. Instead, you would need to ping the computer, save the results of the ping command to a text file, open the text file, read the results, and then parse those results to determine the success or failure of the command. The following script uses the Run method to call Ping.exe, redirecting the output to a temporary file. The script opens and reads the text file, checks to see whether the command succeeded (by determining whether any of the lines of output begin with the word Reply), and then closes and deletes the temporary file: Set objFSO = Wscript.CreateObject("Scripting.FileSystemObject") Set objShell = Wscript.CreateObject("Wscript.Shell") objName = objFSO.GetTempName objTempFile = objName objShell.Run "cmd /c ping -n 3 -w 1000 157.59.0.1 >" & objTempFile, 0, True Set objTextFile = objFSO.OpenTextFile(objTempFile, 1) Do While objTextFile.AtEndOfStream <> True strText = objTextFile.ReadLine If Instr(strText, "Reply") > 0 Then Wscript.Echo "Reply received." Exit Do End If Loop objTextFile.Close objFSO.DeleteFile(objTempFile) Although this approach works, it is somewhat complicated. If you need access to command-line output, you should use the Exec method instead. The following script also parses the output generated by Ping.exe. However, it does so by using the Exec method and by directly reading the output. There is no need to create, open, read, and delete a temporary file, and the script is only 9 lines long, compared with the 15 lines required to perform this same task using the Run method: Set objShell = WScript.CreateObject("WScript.Shell") Set objExecObject = objShell.Exec("cmd /c ping -n 3 -w 1000 157.59.0.1") Do While Not objExecObject.StdOut.AtEndOfStream strText = objExecObject.StdOut.ReadLine() If Instr(strText, "Reply") > 0 Then Wscript.Echo "Reply received." Exit Do End If Loop In many respects, this makes the Exec method a better choice than the Run method. However, the Run method is still useful in a number of situations: You might want to run the application in a specified window type, such as a minimized window. Exec offers no control over window style; Run offers the options listed in Table 3.9.You might need to run a script on computers that do not have WSH 5.6 installed. Exec is supported only on WSH 5.6.You might want to wait for the application being called to finish running before the script resumes. This can be done with either Run or Exec but requires less coding with Run.Running Programs The Run method accepts three parameters. The first and only required parameter is the name of the program you want to run. If the program is in the same folder as the script, or if it is located within the computer path, you need enter only the name (for example, Calc.exe). Otherwise, enter the full path to the program (C:\Admin\Monitoring\DiskSpace.exe). The second parameter is an integer that indicates the window style with which the program should begin (assuming the program has a window). The window style determines such things as whether a window will be the active window or be maximized. Table 3.9 lists the integers that Run accepts as a second parameter as well as the corresponding the window styles. Table 3.9 Integers Accepted by the Run Method for the Window Style IntegerWindow Style Description0Hides the window and activates another window.1Activates and displays a window. If the window is minimized or maximized, the system restores it to its original size and position. An application should specify this flag when displaying the window for the first time.2Activates the window and displays it as a minimized window.3Activates the window and displays it as a maximized window.4Displays a window in its most recent size and position. The active window remains active.5Activates the window and displays it in its current size and position.6Minimizes the specified window and activates the next top-level window in the Z order. The Z order is nothing more than the list detailing the order in which windows are to be activated. If you press ALT+TAB, you will see a graphical representation of the Z list.7Displays the window as a minimized window. The active window remains active.8Displays the window in its current state. The active window remains active.9Activates and displays the window. If the window is minimized or maximized, the system restores it to its original size and position. An application should specify this flag when restoring a minimized window.10Sets the show-state based on the state of the program that started the application.For example, the script in Listing 3.15 starts Notepad. In line 1, the script sets the MAXIMIZE_WINDOW constant to 3, which represents an activated and maximized window style. In line 3, the script uses the WshShell Run method to start Notepad, passing it the MAXIMIZE_WINDOW constant so that the program runs in a maximized window. Listing 3.15 Running a Program Using the Run Method 1 2 3Const MAXIMIZE_WINDOW = 3 Set objShell = WScript.CreateObject("WScript.Shell") objShell.Run "notepad.exe", MAXIMIZE_WINDOWNote Not all applications respond to the window style options. For example, Control Panel (Control.exe) always opens in the same way, regardless of the window style specified in the script.The Run method also accepts a Boolean value as a third parameter that determines whether the script pauses until the called program is finished running or instead continues with the next command in the script. If this value is set to False (the default), the Run method simply issues the command to run the program but does not check to ensure that the program actually ran. If the third parameter is set to True, the script will wait for the program to finish running, return the integer exit code provided by the program, and then continue with the next line of the script. If you set this value to False, you can run multiple programs at the same time; the script will start program A and then immediately start program B, even though program A is still running. This can enable your scripts to complete faster. However, it can also lead to possible problems: For example, what if program B cannot be run until program A has finished? If you are worried about possible "collisions" between programs, set this value to True. In that case, program B will not start until program A has concluded. For example, this script runs Calculator and then waits until Calculator has been closed before proceeding. If Calculator is never closed, line 3 of this script will never execute: Set objShell = WScript.CreateObject("WScript.Shell") objShell.Run("calc.exe"),1,True Wscript.Echo "Script completed." Note WSH keeps track of the specific instance of a program started using Run. For example, suppose you run the preceding script and then manually start a second instance of Calculator. If you close this second instance, the script will not respond. Instead, it will continue to wait until the initial instance of Calculator, the one started using Run, has been closed.Running Command-Line Tools Although both Run and Exec are well suited for running GUI programs from scripts, you are unlikely to call many GUI programs from within a script. After all, the basic idea behind most system administration scripts is to carry out a task without the need for any human intervention. Because GUI applications typically require human intervention, about the best you can do within a script is open the application; you are very limited in what you can do with the application after it has been opened. This is not true for command-line tools, however. Most command-line tools are designed to run in automated fashion; after they have been started, there is no need for any human intervention. The tools start, perform their appointed task, and then terminate. Both the Run method and the Exec method can be used to run command-line tools, although in either case you should use a slightly different syntax from the one used to run GUI tools. When you run a command-line tool using either of these methods, you should always preface the tool name with one of the following: %comspec% /k%comspec% /cThe %comspec% variable is an environment variable that specifies the command-line processor. By using %comspec%, you can create scripts that run on both Windows 98 computers (where the command-line processor is Command.exe) and on Windows 2000 computers (where the command-line processor is named Cmd.exe). The %comspec% variable is not required; however, it does provide a way for a the command window in which a tool runs to remain on the screen. (By default, a command window opens, the tool runs, and then the command window closes as soon as the tool finishes. This means that you might not have time to view the output generated by that tool.) Including %comspec% is also the only way to run command-line commands such as dir. This script will not run the dir command. Instead, you will receive an error message stating that dir could not be found. (This is because dir is not a stand-alone tool; there is, for example, no program named dir.exe.) Set objShell = WScript.CreateObject("WScript.Shell") objShell.Run("dir"), 1, True However, this script, which first starts the command interpreter, will run the dir command: Set objShell = WScript.CreateObject("WScript.Shell") objShell.Run("%comspec% /K dir"), 1, True The /k and /c parameters allow you to specify whether the command window will remain open after the script completes or whether it will be closed. If you want the window to remain open so that you can view the script output, use the /k parameter. If you want the window to close (as you might with a logon script), use the /c parameter. For example, the following script runs the Cacls.exe tool, which, in this instance, displays permission settings for the folder C:\Scripts. The script leaves the command window open so that the results can be viewed: Set objShell = WScript.CreateObject("WScript.Shell") objShell.Run("%comspec% /K cacls.exe c:\scripts"), 1, True By contrast, this script runs the Sc.exe tool and stops the Alerter service. As soon as the script completes, the command window closes: Set objShell = WScript.CreateObject("WScript.Shell") objShell.Run("%comspec% /c sc.exe stop alerter"), 1, True Using Spaces in Command-Line Parameters If a parameter passed to a command-line tool includes a space, that parameter must be enclosed in quotation marks. For example, to use Sc.exe to determine the keyname for the Upload Manager service, you need to use the following syntax: sc.exe getkeyname "Upload Manager" To use this same command within a script, you must also include quotation marks around the parameter. However, this is not entirely straightforward. For example, you might try placing quotation marks around Upload Manager, like this: Set objShell = WScript.CreateObject("WScript.Shell") objShell.Run("%comspec% /k sc.exe getkeyname "Upload Manager""), 1, True When you run this script, you do not get the keyname for Upload Manager. Instead, you get the error message shown in Figure 3.11. Figure 3.11 Incorrectly Specifying the Run Parameter  INCLUDEPICTURE "http://img.microsoft.com/library/media/1033/technet/images/scriptcenter/guide/sas_wsh_112s.gif" \* MERGEFORMATINET  At first, this error message might seem nonsensical; after all, it says that the script expected to see a right parenthesis, and your code has a right parenthesis. As it turns out, though, the problem lies not with the parentheses but with the quotation marks. WSH correctly sees the first set of quotation marks (the ones right before %comspec%) as marking the start of the command string being passed to the Run method. However, it sees the second set of quotation marks (the ones right before the word Upload) as marking the end of the command string. To WSH, this is the command you are trying to execute: objShell.Run("%comspec% /k sc.exe getkeyname "" Because the syntax is not correct (a right parenthesis is required immediately after the second set of quotation marks), the script fails. Anytime you need to include quotation marks as part of the command string, you must use a pair of quotation marks. For example: Set objShell = WScript.CreateObject("WScript.Shell") objShell.Run("%comspec% /k sc.exe getkeyname ""Upload Manager"""), 1, True In this script: 1.A single set of quotation marks is used to begin the command string.2.A pair of quotation marks is used with Upload Manager. This will cause "Upload Manager" (with the surrounding quotation marks) to be included as part of a command string.3.A single set of quotation marks is used to end the command string. In this example, that results in three quotation marks appearing, one right after another.Running a Program and Directly Accessing Its Output To run a program and use its output, a script can use the WshShell Exec method. The WshShell Exec method returns a WshScriptExec object that provides access to the programs standard output, standard input, and standard error streams. Your scripts can retrieve the output that results from running a program by accessing the programs standard output stream (StdOut). The script in Listing 3.16 runs the command-line tool, Ipconfig.exe, which retrieves information about the networking configuration of a computer, including the IP address currently assigned to that computer. The script captures the output of the tool and filters it line by line, displaying only lines that include the word Address. Listing 3.16 Running an Application and Using Its Output 1 2 3 4 5 6 7 8 9 10Set objShell = WScript.CreateObject("WScript.Shell") Set objExecObject = objShell.Exec("%comspec% /c ipconfig.exe") Do Until objExecObject.StdOut.AtEndOfStream strLine = objExecObject.StdOut.ReadLine() strIP = Instr(strLine,"Address") If strIP <> 0 Then Wscript.Echo strLine End If LoopIn line 2 of Listing 3.16, the script uses the Exec method to run the Ipconfig.exe command-line tool. The output generated by Opconfig.exe will be stored in the object reference named objExecObject. In line 4, the script sets up a loop that will continue until the end of the programs standard output stream is reached. The script checks for the end of the stream by using the AtEndOfStream property of the StdOut TextStream object. In line 5, the script reads a line of the programs output and stores it in the strLine variable. In line 6, the script uses the VBScript Instr function to determine whether the word Address is stored in strLine. If the word Address is found, the script displays the line using the Echo method on line 8. When you run Ipconfig.exe, you receive output similar to this: Windows IP Configuration Ethernet adapter Local Area Connection 2: Connection-specific DNS Suffix . : fabrikam.com IP Address. . . . . . . . . . . . : 192.168.248.248 Subnet Mask . . . . . . . . . . . : 255.255.252.0 Default Gateway . . . . . . . . . : 192.168.248.1 When you run the preceding script, you receive output only for those lines that contain the word Address: IP Address. . . . . . . . . . . . : 192.168.248.248 This enables you to run a command-line tool, check its output, and then have your script proceed accordingly. Working with Shortcuts Microsoft Windows 2000 Scripting Guide Shortcuts are links to local or network programs, files, folders, computers, or Internet addresses. Each shortcut is a file with either an .lnk or a .url extension. The two extensions correspond to the two types of shortcuts: standard shortcuts and Uniform Resource Locator (URL) shortcuts. Standard shortcuts can link to local or network programs, files, folders, or computers, while URL shortcuts link only to entities that can be referenced by a URL most commonly, Web pages. Shortcuts are used in a number of places within the Windows shell, particularly within menus and toolbars. The Start menu, the Programs menu, the Quick Launch bar, and the SendTo menu, for example, consist of a group of shortcuts located in special folders. The shortcuts that appear on the Quick Launch bar are located in the following folder: C:\Documents and Settings\{user profile name}\Application Data\Microsoft\Internet Explorer\Quick Launch Your scripts can make use of shortcuts to customize the menus and the desktops of your users; for example, you can create a script that provides different menu options to different groups of users within your organization. The properties of the WSH Shortcut object are shown in Table 3.10. Table 3.10 WSH Shortcut Properties PropertyDescriptionArgumentsAdditional command-line arguments that can be used when starting the application.DescriptionDescription given to the shortcut.FullNameRead-only property that returns the complete path to the target application.HotKeyKeyboard shortcut: a combination of keys that, when held down together, will start the application. Keyboard shortcuts typically consist of one of the following keys plus a letter (az), number (09), or function key (F1F12): ALT CTRL SHIFT For example, to set the keyboard shortcut to the CTRL key and the 9 key, use this value: CTRL + 9 If the key combination you select is already in use, it will be overwritten and will be applied to the new shortcut created by your script.IconLocationAllows you to specify an icon and an icon index for the shortcut. If no location is specified, the default icon for the application is used.TargetPathComplete path to the target application. You must specify the full path, including the drive letter or UNC path. When setting a TargetPath, WSH will accept the value entered. It will not check to ensure that the path is correct.WindowStyleSpecifies the initial window type for the application. Valid styles are the same as those shown for the Run method and are listed in Table 3.9.WorkingDirectorySpecifies the working directory for the application.Creating Standard Shortcuts Creating a standard shortcut involves three steps: 1.Create an instance of the WshShortcut object by calling CreateShortcut(), passing as the sole parameter the path for the new shortcut file. Although shortcuts can be created anywhere within the file system, they are typically created within special folders such as AllUsersDesktop and StartMenu. Special folders are discussed later in this chapter.2.Set the properties of the WshShortcut object.3.Call the WshShortcut Save method. If you do not call the Save method, the shortcut will not actually be created.The script in Listing 3.17 creates a shortcut to the Internet Information Services (IIS) manager on the desktop. The shortcut is visible to all users of the computer and can be opened either by double-clicking it or by using the key combination CTRL+SHIFT+I. Listing 3.17 Creating a Desktop Shortcut 1 2 3 4 5 6 7 8Set objShell = WScript.CreateObject("WScript.Shell") strDesktopFolder = objShell.SpecialFolders("AllUsersDesktop") Set objShortCut = objShell.CreateShortcut(strDesktopFolder & _ "\IIS Manager.lnk") objShortCut.TargetPath = "%SystemRoot%\System32\Inetsrv\iis.msc" objShortCut.Description = "Run the Internet Information Services Manager." objShortCut.HotKey = "Ctrl+Shift+I" objShortCut.SaveIn line 2 of Listing 3.17, the WshShell SpecialFolders property retrieves the directory path to the Desktop special folder. This path is stored in the strDesktopFolder variable. In lines 34, the CreateShortcut method creates a shortcut file named IISManager.lnk in the Desktop folder. In lines 57, the script sets the TargetPath, Description, and HotKey properties of the WshShortcut object. In line 8, the script creates the actual shortcut by calling the WshShortcut Save method. Note An icon will be created on the desktop even if you do not set any properties, but the icon will not be a functional shortcut; if you double-click it, nothing will happen. (You will not even receive an error message.) To create a functional shortcut, you must set the TargetPath property. If the TargetPath property is not set, double-clicking the shortcut will not do anything.Creating URL Shortcuts Creating a URL Shortcut involves three similar steps: 1.Create an instance of the WshUrlShortcut object by calling CreateShortcut, passing as the sole parameter the URL for the new shortcut file.2.Set the properties of the WshUrlShortcut object.3.Call the WshUrlShortcut Save method.The script in Listing 3.18 creates a shortcut to the MSDN Web site on the desktop. The shortcut is visible only to users who run the script. This is because the shortcut is created in the Desktop folder for the current user and not in the AllUsersDesktop folder. Listing 3.18 Creating a Desktop URL Shortcut 1 2 3 4 5Set objShell = WScript.CreateObject("WScript.Shell") strDesktopFld = objShell.SpecialFolders("Desktop") Set objURLShortcut = objShell.CreateShortcut(strDesktopFld & "\MSDN.url") objURLShortcut.TargetPath = "http://msdn.microsoft.com" objURLShortcut.SaveAdding an Item to the Quick Launch Bar The script in Listing 3.19 uses a URL shortcut to create a Quick Launch button that opens the Microsoft TechNet Web site. The Quick Launch button is visible only to users who run the script because the shortcut is created in the personal Quick Launch bar for the user. Listing 3.19 Creating a Quick Launch Button to Open the TechNet Online Web Site 1 2 3 4 5 6 7 8 9Set objShell = WScript.CreateObject("WScript.Shell") Set colEnvironmentVariables = objShell.Environment("Volatile") strQLFolder = colEnvironmentVariables.Item("APPDATA") & _ "\Microsoft\Internet Explorer\Quick Launch" Set objURLShortcut = objShell.CreateShortcut(strQLFolder & "\TechNet.url") objURLShortcut.TargetPath = "http://www.microsoft.com/technet" objURLShortcut.SaveDeleting Shortcuts Shortcuts are files that can be deleted in the same way you delete any other file. For example, the following script deletes the shortcut created in Listing 3.19: Set objShell = WScript.CreateObject("WScript.Shell") Set objShell = WScript.CreateObject("WScript.Shell") Set colEnvironmentVariables = objShell.Environment("Volatile") Set objFSO = CreateObject("Scripting.FileSystemObject") strQLFolder = colEnvironmentVariables.Item("APPDATA") & _ "\Microsoft\Internet Explorer\Quick Launch\TechNet.URL" objFSO.DeleteFile(strQLFolder) For more information about working with files in WSH scripts, see " HYPERLINK "http://www.microsoft.com/technet/scriptcenter/guide/sas_adm_nize.mspx" Script Runtime Primer" in this book. Working with Special Folders Microsoft Windows 2000 Scripting Guide Special folders are folders that are or at least potentially can be present on all Windows computers; these include the My Documents, Fonts, and Start Menu folders. There are two types of special folders: those that map to standard directories and those that do not. The Favorites folder, for example, maps to a standard directory; the My Computer folder does not. The WScript SpecialFolders collection contains the full path to each of the special folders that map to a standard directory. Table 3.11 lists the identifiers and the contents of each of the special folders in the SpecialFolders collection. Table 3.11 Special Folders Identifier IdentifierFolder ContentsAllUsersDesktopShortcuts that appear on the desktop for all usersAllUsersStartMenuShortcuts that appear on the Start menu for all usersAllUsersProgramsShortcuts that appear on the Programs menu for all usersAllUsersStartupShortcuts to programs that are run on startup for all usersDesktopShortcuts that appear on the desktop for the current userFavoritesShortcuts saved as favorites by the current userFontsFonts installed on the systemMyDocumentsCurrent users documentsNetHoodObjects that appear in Network NeighborhoodPrintHoodPrinter linksRecentShortcuts to current users recently opened documentsSendToShortcuts to applications that show up as possible send-to targets when a user right-clicks on a file in Windows ExplorerStartMenuShortcuts that appear in the current users start menuStartupShortcuts to applications that run automatically when the current user logs on to the systemTemplatesApplication template files specific to the current userTo determine the location of any folder, retrieve the value of the SpecialFolders.Item property, specifying the name of one of the identifiers shown in Table 3.11. Note The SpecialFolders collection enables your script to determine the path of any special folder that maps to a standard directory but does not enable your script to manipulate that folder or its contents. You must use a mechanism such as the FileSystemObject to actually work with the contents of the special folders. For more information about using the FileSystemObject in your scripts, see "Script Runtime Primer" in this book.Retrieving the Location of Special Folders The script in Listing 3.20 determines the location of the Fonts special folder. The script echoes the location of the Fonts folder. Listing 3.20 Determining the Location of the Fonts Folder 1 2 3Set objShell = WScript.CreateObject("WScript.Shell") strFontDirectoryPath = objShell.SpecialFolders.Item("Fonts") Wscript.Echo "Font Directory Path: " & strFontDirectoryPathCreating a Shortcut in a Special Folder When you install an application, that application often associates itself with a particular file type. For example, when you install the Microsoft FrontPage Web site creation and management tool, FrontPage associates itself with all .asp files. If you right-click on a .asp file and click Edit, the file will open in FrontPage. Of course, there might be times when you simply want to view the .asp file in Notepad. Recognizing this fact, Windows includes a special folder named SendTo. The SendTo option presents a menu of applications or locations to which you can send the selected file. You can add to the options available in the SendTo menu by adding shortcuts to the SendTo special folder. The next time you want to open an .asp file (or any file) in Notepad, you can simply right-click the file, select SendTo, and then click Notepad. The script in Listing 3.21 creates a shortcut to the Notepad application in the SendTo special folder, thus adding Notepad to the SendTo menu. Listing 3.21 Adding the Notepad Application to the SendTo Menu 1 2 3 4 5 6 7 8 9Set objShell = WScript.CreateObject("WScript.Shell") strSendToFolder = objShell.SpecialFolders("SendTo") strPathToNotepad = objShell.ExpandEnvironmentStrings _ ("%SystemRoot%/system32/notepad.exe") Set objShortcut = objShell.CreateShortcut(strSendToFolder & _ "\notepad.lnk") objShortcut.TargetPath = strPathToNotepad objShortcut.SaveEnvironment Variables Microsoft Windows 2000 Scripting Guide Environment variables are a set of string values associated with a process. The Windows Shell process has a number of environment variables associated with it that contain useful information that you can use within your scripts, including: Directories searched by the shell to locate programs (the path).Number of processors, processor manufacturer, and processor architecture of the computer.User profile location.Temporary directory locations.When a user logs on to Windows, the shell process starts and obtains its initial environment variables by loading both the computer-specific (system) and user-specific (user) environment variables from the registry. In addition to the computer-specific and user-specific environment variables loaded from the registry, additional process environment variables are generated dynamically during each logon. Table 3.12 lists a description of each type of environment variable and its location in the registry. Table 3.12 Types of Environment Variables and Their Storage Locations TypeDescriptionRegistry LocationUserApplies to the user currently logged on to the computer and is saved between logoffs and restartsHKCU\EnvironmentSystemApplies to all users of the computer and is saved between logoffs and restartsHKLM\System\CurrentControlSet\Control\Session Manager\EnvironmentVolatileApplies to current logon session and is not saved between logoffs and restartsHKCU\VolatileEnvironmentProcessApplies to current process and might be passed to child processesNot stored in the registryThe Environment property of the WshShell object returns a WshEnvironment collection object that gives your scripts the ability to retrieve, create, and modify environment variables. The WshEnvironment collection provides access to all four types of environment variables: system, user, process, and volatile. Retrieving Environment Variables To retrieve a collection of environment variables of a specific type, your script must access the WshShell Environment property and provide a string parameter that represents the desired type of environment variable: system, user, process, or volatile. Your script can then use the resulting WshEnvironment collection to access the values of those environment variables by name. The environment variables that can be retrieved using WSH are shown in Table 3.13. Table 3.13 WSH Environment Variables NameSystemUserProcessProcess (Windows 98/Me only)NUMBER_OF_PROCESSORS INCLUDEPICTURE "http://www.microsoft.com/library/media/1033/technet/images/scriptcenter/guide/table-bullet.gif" \* MERGEFORMATINET  INCLUDEPICTURE "http://www.microsoft.com/library/media/1033/technet/images/scriptcenter/guide/table-bullet.gif" \* MERGEFORMATINET PROCESSOR_ARCHITECTURE INCLUDEPICTURE "http://www.microsoft.com/library/media/1033/technet/images/scriptcenter/guide/table-bullet.gif" \* MERGEFORMATINET  INCLUDEPICTURE "http://www.microsoft.com/library/media/1033/technet/images/scriptcenter/guide/table-bullet.gif" \* MERGEFORMATINET PROCESSOR_IDENTIFIER INCLUDEPICTURE "http://www.microsoft.com/library/media/1033/technet/images/scriptcenter/guide/table-bullet.gif" \* MERGEFORMATINET  INCLUDEPICTURE "http://www.microsoft.com/library/media/1033/technet/images/scriptcenter/guide/table-bullet.gif" \* MERGEFORMATINET PROCESSOR_LEVEL INCLUDEPICTURE "http://www.microsoft.com/library/media/1033/technet/images/scriptcenter/guide/table-bullet.gif" \* MERGEFORMATINET  INCLUDEPICTURE "http://www.microsoft.com/library/media/1033/technet/images/scriptcenter/guide/table-bullet.gif" \* MERGEFORMATINET PROCESSOR_REVISION INCLUDEPICTURE "http://www.microsoft.com/library/media/1033/technet/images/scriptcenter/guide/table-bullet.gif" \* MERGEFORMATINET  INCLUDEPICTURE "http://www.microsoft.com/library/media/1033/technet/images/scriptcenter/guide/table-bullet.gif" \* MERGEFORMATINET OS INCLUDEPICTURE "http://www.microsoft.com/library/media/1033/technet/images/scriptcenter/guide/table-bullet.gif" \* MERGEFORMATINET  INCLUDEPICTURE "http://www.microsoft.com/library/media/1033/technet/images/scriptcenter/guide/table-bullet.gif" \* MERGEFORMATINET COMSPEC INCLUDEPICTURE "http://www.microsoft.com/library/media/1033/technet/images/scriptcenter/guide/table-bullet.gif" \* MERGEFORMATINET  INCLUDEPICTURE "http://www.microsoft.com/library/media/1033/technet/images/scriptcenter/guide/table-bullet.gif" \* MERGEFORMATINET  INCLUDEPICTURE "http://www.microsoft.com/library/media/1033/technet/images/scriptcenter/guide/table-bullet.gif" \* MERGEFORMATINET HOMEDRIVE INCLUDEPICTURE "http://www.microsoft.com/library/media/1033/technet/images/scriptcenter/guide/table-bullet.gif" \* MERGEFORMATINET HOMEPATH INCLUDEPICTURE "http://www.microsoft.com/library/media/1033/technet/images/scriptcenter/guide/table-bullet.gif" \* MERGEFORMATINET PATH INCLUDEPICTURE "http://www.microsoft.com/library/media/1033/technet/images/scriptcenter/guide/table-bullet.gif" \* MERGEFORMATINET  INCLUDEPICTURE "http://www.microsoft.com/library/media/1033/technet/images/scriptcenter/guide/table-bullet.gif" \* MERGEFORMATINET  INCLUDEPICTURE "http://www.microsoft.com/library/media/1033/technet/images/scriptcenter/guide/table-bullet.gif" \* MERGEFORMATINET  INCLUDEPICTURE "http://www.microsoft.com/library/media/1033/technet/images/scriptcenter/guide/table-bullet.gif" \* MERGEFORMATINET PATHEXT INCLUDEPICTURE "http://www.microsoft.com/library/media/1033/technet/images/scriptcenter/guide/table-bullet.gif" \* MERGEFORMATINET  INCLUDEPICTURE "http://www.microsoft.com/library/media/1033/technet/images/scriptcenter/guide/table-bullet.gif" \* MERGEFORMATINET PROMPT INCLUDEPICTURE "http://www.microsoft.com/library/media/1033/technet/images/scriptcenter/guide/table-bullet.gif" \* MERGEFORMATINET  INCLUDEPICTURE "http://www.microsoft.com/library/media/1033/technet/images/scriptcenter/guide/table-bullet.gif" \* MERGEFORMATINET SYSTEMDRIVE INCLUDEPICTURE "http://www.microsoft.com/library/media/1033/technet/images/scriptcenter/guide/table-bullet.gif" \* MERGEFORMATINET SYSTEMROOT INCLUDEPICTURE "http://www.microsoft.com/library/media/1033/technet/images/scriptcenter/guide/table-bullet.gif" \* MERGEFORMATINET WINDIR INCLUDEPICTURE "http://www.microsoft.com/library/media/1033/technet/images/scriptcenter/guide/table-bullet.gif" \* MERGEFORMATINET  INCLUDEPICTURE "http://www.microsoft.com/library/media/1033/technet/images/scriptcenter/guide/table-bullet.gif" \* MERGEFORMATINET  INCLUDEPICTURE "http://www.microsoft.com/library/media/1033/technet/images/scriptcenter/guide/table-bullet.gif" \* MERGEFORMATINET TEMP INCLUDEPICTURE "http://www.microsoft.com/library/media/1033/technet/images/scriptcenter/guide/table-bullet.gif" \* MERGEFORMATINET  INCLUDEPICTURE "http://www.microsoft.com/library/media/1033/technet/images/scriptcenter/guide/table-bullet.gif" \* MERGEFORMATINET  INCLUDEPICTURE "http://www.microsoft.com/library/media/1033/technet/images/scriptcenter/guide/table-bullet.gif" \* MERGEFORMATINET TMP INCLUDEPICTURE "http://www.microsoft.com/library/media/1033/technet/images/scriptcenter/guide/table-bullet.gif" \* MERGEFORMATINET  INCLUDEPICTURE "http://www.microsoft.com/library/media/1033/technet/images/scriptcenter/guide/table-bullet.gif" \* MERGEFORMATINET  INCLUDEPICTURE "http://www.microsoft.com/library/media/1033/technet/images/scriptcenter/guide/table-bullet.gif" \* MERGEFORMATINET The environment variables shown in the preceding table are present on all Windows computers. However, you might also have additional user-specific or computer-specific environment variables, which can also be accessed through a script. If you do not know the names of these variables, you can obtain a complete list of the variables (and their values) by typing set from the command prompt. The script in Listing 3.22 retrieves both the user-specific and computer-specific PATH environment variables. Listing 3.22 Displaying User-specific and Computer-specific PATH Environment Variables 1 2 3 4 5 6 7Set objShell = WScript.CreateObject("WScript.Shell") Set colSystemEnvVars = objShell.Environment("System") Set colUserEnvVars = objShell.Environment("User") Wscript.Echo "Computer-specific PATH Environment Variable" Wscript.Echo colSystemEnvVars("PATH") Wscript.Echo "User-specific PATH Environment Variable" Wscript.Echo colUserEnvVars("PATH")When the preceding script runs under CScript, output similar to the following appears in the command window: Computer-specific PATH Environment Variable %SystemRoot%\system32;%SystemRoot%;%SystemRoot%\system32\WBEM;C:\Program Files\M icrosoft.NET\FrameworkSDK\Bin\;C:\Program Files\Microsoft Visual Studio.NET\Vc7\ bin\;C:\Program Files\Microsoft Visual Studio.NET\Common7\IDE\;C:\WINNT\Microsof t.NET\Framework\v1.0.2914\;C:\Program Files\Microsoft Visual Studio.NET\Vc7\bin\ ;C:\Program Files\Microsoft Visual Studio.NET\Common7\IDE\; C:\MSSQL7\BINN;C:\Program Files\Support Tools\;C:\Program Files\ Resource Kit\C:\PROGRA~1\CA\Common\SCANEN~1;C:\PROGRA~1\CA\eTrust\ANTIVI~1 User-specific PATH Environment Variable C:\Perl\bin;C:\Perl\bin;C:\Perl\bin\ Creating Environment Variables To create a new environment variable, your script must start with the same first step required for retrieving the values of environment variables: It must obtain a reference to a collection of environment variables of one of the four types (user, system, process, or volatile). After your script has a reference to the collection corresponding to the type of environment variable being created, it can then store a new string value in the corresponding collection location. Storing the string value creates the new environment variable. The new index becomes the name of the new environment variable, and the corresponding string becomes its initial value. For example, this line of code creates an environment variable named MyVariable, with the initial value 0: colUsrEnvVars("MyVariable") = 0 You can write scripts that create process or volatile environment variables, but neither of these types is saved between logons and reboots. You can also create a volatile type, which is stored in the registry and lasts for a logon session; this type of environment variable can be used as a mechanism for communicating information between two scripts that both run during a single logon session. However, you will likely find that creating system or user types is more useful because these environment variables are saved between logon sessions and computer reboots. The script in Listing 3.23 creates a user environment variable named APP_VARIABLE and sets its initial value to "Installed." The script then retrieves the value of the new APP_VARIABLE environment variable to confirm that it was created. Listing 3.23 Creating a User-specific Environment Variable 1 2 3 4Set objShell = WScript.CreateObject("WScript.Shell") Set colUsrEnvVars = objShell.Environment("USER") colUsrEnvVars("APP_VARIABLE") = "Installed" Wscript.Echo colUsrEnvVars("APP_VARIABLE")Modifying Environment Variables To modify an environment variable, your script must use steps similar to those used to create a new environment variable. It must obtain a reference to a collection of environment variables of one of the four types (user, system, process, or volatile) and store that reference in a variable. After your script has a reference to the collection corresponding to the type of environment variable being modified, it can then reference the name of the environment variable to modify and store a string value in the corresponding collection location, overwriting the string previously located in that location. The script in Listing 3.24 modifies the value of a user-specific environment variable named APP_VARIABLE by changing the value to Upgraded. Listing 3.24 Modifying a User-specific Environment Variable 1 2 3 4 5Set objShell = WScript.CreateObject("WScript.Shell") Set colUsrEnvVars = objShell.Environment("USER") strCurrentValue = colUsrEnvVars("APP_VARIABLE") colUsrEnvVars("APP_VARIABLE") = "Upgraded" Wscript.Echo colUsrEnvVars("APP_VARIABLE")Expanding Environment Variables When constructing environment variables or configuration strings to be used in the registry or elsewhere, you might want to incorporate the current value of an existing environment variable within those variables or strings. For example, if a script needs access to the temporary folder, you need to somehow indicate that, for this user on this computer, the temporary folder can be found in C:\Temp. However, you would not want to hard-code the value of that environment variable in your configuration string, as it might change in the future and your script would no longer be valid. Although the temporary folder might be C:\Temp today, there is no reason why that cannot be changed to something else (for example, C:\Temporary Folder) tomorrow. Because of that, it is better to use an environment variable to dynamically retrieve the location of the temporary folder rather than hard-coding in the value and hoping that it never changes. To refer to the value of environment variables within configuration strings, you must use the WshShell ExpandEnvironmentStrings method. This method accepts, as a parameter, a string with an embedded environment variable name enclosed in percentage symbols (%) and returns a string in which the environment variable name and percentage symbols (%) have been replaced with the value of the corresponding environment variable. The script in Listing 3.25 shows the difference between echoing the value of an environment variable and echoing the expanded value of an environment variable. Listing 3.25 Creating and Displaying an Environment Variable That Incorporates Existing Environment Variables 1 2 3 4 5 6Set objShell = WScript.CreateObject("WScript.Shell") Set colEnvVars = objShell.Environment("User") Wscript.Echo "Temporary folder (Unexpanded):" Wscript.Echo colEnvVars("TEMP") & vbCrLf Wscript.Echo "Temporary folder (Expanded)" Wscript.Echo objShell.ExpandEnvironmentStrings("%TEMP%")When run under Cscript, output similar to the following appears in the command window: Temporary folder (Unexpanded): %USERPROFILE%\Local Settings\Temp Temporary folder (Expanded) C:\DOCUME~1\kmyer\LOCALS~1\Temp Logging an Event Microsoft Windows 2000 Scripting Guide Troubleshooting applications and services is simplified if these applications and services log important events to event logs. Your scripts will also be easier to troubleshoot if they do the same. The WshShell object provides the LogEvent method for logging events to the Application event log. The LogEvent method enables you to write to the event log from within your scripts. Note If you want to read and process event log information from within your scripts, you need to use WMI. For more information about using WMI to work with event logs, see "Logs" in this book.LogEvent has two required parameters. The first parameter of the LogEvent method is an integer that specifies the type of event you would like your script to log. Table 3.14 lists the available event types and their corresponding integer values. Table 3.14 Event Types and Integer Values ValueEvent Type0SUCCESS1ERROR2WARNING4INFORMATION8AUDIT_SUCCESS16AUDIT_FAILUREThe second parameter your scripts need to supply to the LogEvent method is a string containing the message to log. You also have the option to supply a computer name as the third parameter, in which case the event will be logged in the Application log on that computer instead of the computer on which the script is running. (This parameter is ignored on Windows 95- and Windows 98-based computers.) Remote logging is useful for scripts designed to run on a number of different computers: Instead of being logged locally, all events generated by these scripts can be logged to a central computer. The script in Listing 3.26 logs an event of each of the types listed in Table 3.14 along with a corresponding description. Listing 3.26 Logging Events to the Application Log 1 2 3 4 5 6 7Set objShell = WScript.CreateObject("Wscript.Shell") objShell.LogEvent 0,"Test Success Event" objShell.LogEvent 1,"Test Error Event" objShell.LogEvent 2,"Test Warning Event" objShell.LogEvent 4, "Test Information Event" objShell.LogEvent 8, "Test Success Audit Event" objShell.LogEvent 16, "Test Failure Audit Event"The LogEvent method can record events only in the Application event log. In addition, you cannot specify a unique source or a unique event code: All events are automatically given the source Windows Script Host and an event code corresponding to the event type (for example, all Success events will have an event code of 0). Reading From and Writing to the Local Registry Microsoft Windows 2000 Scripting Guide As a general rule, it is best to manage the registry using system tools such as Regedit.exe; although not foolproof, these tools have built-in safeguards that help minimize the damage that can be caused by incorrectly configuring a registry entry. On the other hand, it is also true that many of these registry tools cannot be automated and are designed to work on only one computer at a time (typically the local computer). It is one thing to say that you should use Regedit.exe to manage the registry; it is quite another to have an urgent security bulletin recommending that you change a registry entry on all 1,000 of your domain controllers as quickly as possible. In situations in which system tools are not fast enough or efficient enough, the WshShell object provides methods for reading from, writing to, and deleting from the registry. Caution Changing the registry with a script can easily propagate errors. The scripting tools bypass safeguards, allowing settings that can damage your system, or even require you to reinstall Windows. Before scripting changes to the registry, test your script thoroughly and back up the registry on every computer on which you will make changes. For more information about scripting changes to the registry, see the  HYPERLINK "http://www.microsoft.com/technet/scriptcenter/guide/sas_wsh_hilv.mspx" Registry Reference on the Microsoft Windows 2000 Server Resource Kit companion CD or at http://www.microsoft.com/reskit.Reading a Registry Entry The registry is the primary configuration database for the Windows operating system; the ability of an operating system component to run, and to run correctly, often depends on the configuration of one or more settings within the registry. As a system administrator, you spend a considerable amount of time checking values set within the registry. For example, in the event of computer problems, support personnel will often ask you to verify specific registry settings. This can be done directly, using a tool such as Regedit.exe, or it can be done programmatically, using the WshShell RegRead method. For the most part, the RegRead method requires you to do just two things: 1) Create an instance of the WScript Shell object and 2) call the RegRead method, specifying the registry entry you wand to read. For example, the version number of the Windows operating system is stored in HKLM\Software\Microsoft\Windows NT\CurrentVersion\CurrentVersion. You can retrieve this value by using the following code: Set objShell = WScript.CreateObject("WScript.Shell") sngVersion = objShell.RegRead _ ("HKLM\Software\Microsoft\Windows NT\CurrentVersion\CurrentVersion") Wscript.Echo sngVersion Registry Data Types Each value stored in the registry has a particular data type. Table 3.15 lists the subset of registry types that WSH supports and the corresponding VBScript-compatible types into which the RegRead method translates corresponding registry values. Table 3.15 Registry Data Types and Associated Script Data Types NameData TypeScript Data TypeREG_SZStringConverted to StringREG_DWORDNumberConverted to IntegerREG_BINARYBinary ValueConverted to VBArray of IntegersREG_EXPAND_SZExpandable StringConverted to StringREG_MULTI_SZArray of StringsConverted to VBArray of StringsThe data types listed in Table 3.15 are the ones most commonly used in the registry. If your script attempts to use the RegRead method to retrieve the value of a registry entry with an unsupported data type, the call will result in an error. Note Unfortunately, WSH does not provide a way for you to verify the data type of a registry entry before you attempt to read it. However, you can use WMI to verify data types.The script in Listing 3.27 uses the RegRead method to read the value of a multistring registry entry. Because this is a multistring value, the information is returned as an array, and a For Each loop is used to report each item in that array. Listing 3.27 Reading a Multistring Value from the Registry 1 2 3 4 5 6Set objShell = WScript.CreateObject("WScript.Shell") arrValues = objShell.RegRead _ ("HKLM\SYSTEM\CurrentControlSet\Services\EventLog\Security\Sources") For Each strValue In arrValues Wscript.Echo strValue NextWhen the preceding script is run under CScript, output similar to the following is displayed in the command window: Spooler Security Account Manager SC Manager NetDDE Object LSA DS Security Creating or Modifying a Registry Entry Your scripts can use the RegWrite method to create a new registry entry or modify an existing one. The RegWrite method accepts three parameters: the registry entry to create or modify, the value to assign to the entry, and (optionally) the data type of the entry. The script in Listing 3.28 uses the RegWrite method to create a DWORD entry (and set the value to 56) in the registry. Listing 3.28 Creating a DWORD Value in the Registry 1 2Set objShell = WScript.CreateObject("WScript.Shell") objShell.RegWrite "HKCU\TestKey\Version", 56, "REG_DWORD"Note The WshShell RegWrite method does not support writing the REG_MULTI_SZ data type.Deleting a Registry Entry Your scripts can use the RegDelete method to delete registry subkeys or entries. The RegDelete method accepts a single parameter that specifies the subkey or entry to delete. Deleting a subkey deletes all the entries in that subkey. The script in Listing 3.29 uses the RegDelete method to delete a DWORD value in the registry. Listing 3.29 Deleting a DWORD Value in the Registry 1 2Set objShell = WScript.CreateObject("WScript.Shell") objShell.RegDelete "HKCU\TestKey\Version"Sending Keystrokes to a Program Microsoft Windows 2000 Scripting Guide By providing scripts with access to most COM objects, WSH enables you to automate applications that have a COM-based object model. Unfortunately, some applications, especially older ones, do not have a COM-based object model. To automate these applications, WSH provides a way to send keystrokes to these applications. When you use the WshShell SendKeys method to send keystrokes to an application, your script mimics a human typing on the keyboard. To send a single keyboard character, you pass SendKeys the character itself as a string argument. For example, "x" to send the letter x. To send a space, send the string " ". This is exactly what a user would do if he or she was working with the application: to type the letter x, the user would simply press the x key on the keyboard. When you use the SendKeys method, special keys that do not have a direct text representation (for example, CTRL or ALT) are represented by special characters. Table 3.16 lists these SendKeys representations for commonly used keys. Table 3.16 SendKeys Representations of Common Keys KeySendKeys RepresentationBACKSPACE{BACKSPACE}, {BS}, or {BKSP} BREAK{BREAK} CAPS LOCK{CAPSLOCK} DEL or DELETE{DELETE} or {DEL} DOWN ARROW{DOWN} END{END} ENTER{ENTER} or ~ ESC{ESC} HELP{HELP} HOME{HOME} INS or INSERT{INSERT} or {INS} LEFT ARROW{LEFT} NUM LOCK{NUMLOCK} PAGE DOWN{PGDN} PAGE UP{PGUP} PRINT SCREEN{PRTSC} RIGHT ARROW{RIGHT} SCROLL LOCK{SCROLLLOCK} TAB{TAB} UP ARROW{UP} SHIFT+CONTROL^ALT%BACKSPACE{BACKSPACE}, {BS}, or {BKSP} All function keys, like F1, are represented by the button name contained within braces for example, {F1} for the F1 button and {F2} for the F2 button. For example, the following script starts Notepad and then types the sentence, "This is a test." Set objShell = WScript.CreateObject("WScript.Shell") objShell.Run "Notepad.exe" Do Until Success = True Success = objShell.AppActivate("Notepad") Wscript.Sleep 1000 Loop objShell.SendKeys "This is a test." When the script runs, Notepad will open, and the sample sentence will be typed in, as shown in Figure 3.12. Figure 3.12 Controlling Notepad by Using SendKeys  INCLUDEPICTURE "http://www.microsoft.com/library/media/1033/technet/images/scriptcenter/guide/sas_wsh_114s.gif" \* MERGEFORMATINET   HYPERLINK "http://www.microsoft.com/library/media/1033/technet/images/scriptcenter/guide/sas_wsh_114s_big.gif" \t "_blank" See full-sized image. Note You can send repeated keystrokes by using the SendKeys method. For example, to send the letter a ten times, you send the string "{a 10}". You must include a space between the keystroke and the number. SendKeys allows you to send only repeated single keystrokes. You cannot send multiple characters using repeated keystrokes; for example, this command will fail: {dog 10}.You should be aware that sending keystrokes to an application is not the optimal method for automating a procedure. If you have an application in your enterprise that you need to automate and it has no COM-based object model, you might consider this technique. However, you should first examine whether other methods exist for automating that particular application. Although SendKeys can be used effectively, there are several potential problems with this approach: The script might have difficulty determining which window to send the keystrokes to.Because the application runs in GUI mode, a user might close the application prematurely. Unfortunately, this will not terminate the script, and the script could end up sending keystrokes to the wrong application.The script might have difficulty synchronizing with the application.This timing issue is especially troublesome, simply because scripts tend to run much faster than GUI applications. For example, this simple script, which starts Calculator and then tries to type the number 2 into the application, is coded correctly but will likely fail when run (Calculator will start, but the number 2 will not be entered): Set objShell = WScript.CreateObject("WScript.Shell") objShell.Run "Calc.exe" objShell.AppActivate "Calculator" objShell.SendKeys "2" The script fails not because of a syntax issue but because of a timing issue. As quickly as it can, the script issues commands to: 1.Start Calculator.2.Switch the focus to Calculator (using the AppActivate method).3.Send the number 2 to Calculator.Unfortunately, the script runs faster than Calculator can load. As a result, the number 2 is sent, and the script terminates, before Calculator can finish loading and start accepting keystrokes. There are at least two ways of working around this problem. First, you might be able to estimate how long it will take an application to load and then pause the script for that amount of time. For example, in this script the Run method is called, and then the script pauses for 5 seconds, giving Calculator time to load: Set objShell = WScript.CreateObject("WScript.Shell") objShell.Run "Calc.exe" Wscript.Sleep 5000 objShell.AppActivate "Calculator" objShell.SendKeys "2" Of course, is some cases it might be difficult to estimate how long it will take before an application is loaded and ready to accept keystrokes. In that case, you can call the AppActivate method and check the return value. Using AppActivate Before sending keystrokes to an application, you must first ensure that the application is running and that the focus is on the application (that is, the application is running in the active window). You can use the AppActivate method to set the focus on an application. The AppActivate method brings the specified window to the foreground so that you can then start using the WshShell SendKeys method to send keystrokes to the application. The AppActivate method takes a single parameter that can be either a string containing the title of the application as it appears in the title bar or the process ID of the application. The AppActivate method returns a Boolean value that indicates whether the procedure call has been successful. If the value is False, AppActivate has failed, usually because it was unable to find the application (possibly because that application had not finished loading). You can place your script in a loop, periodically calling AppActivate until the return value is True. At that point, the application is loaded and prepared to accept keystrokes. For example, this script checks the return value for AppActivate. If this value is False, the script pauses for 1 second and then checks the value again. This continues until the return value is True, meaning that the application is loaded and ready for use. At that point, the script continues. Set objShell = WScript.CreateObject("WScript.Shell") objShell.Run "Calc.exe" Do Until Success = True Success = objShell.AppActivate("Calculator") Wscript.Sleep 1000 Loop objShell.SendKeys "2" When the script is determining which application to activate, the given title is compared to the title of each window visible on-screen. If no exact match exists, the AppActivate method sets the focus to the first window whose title begins with the given text. If a window still cannot be found, the first window whose title string ends with the text is given the focus. The partial matching with the leading and trailing text of title bars ensures that AppActivate works with applications, such as Notepad, that display the name of the currently opened document on the title bar. (For example, when you first start Notepad, the window title is Untitled - Notepad, not Notepad.) This means that when setting the focus to the Calculator, you can use one of the following lines of code: objShell.AppActivate "Calculator" objShell.AppActivate "Calc" objShell.AppActivate "C" Of course, this shortcut method of referring to a window can cause problems. For example, suppose you use this line of code: objShell.AppActivate "Calc" If you happen to be working on a Microsoft Word document named Calculations.doc, the keystrokes might be sent to the Word document instead of Calculator. The script in Listing 3.30 demonstrates a more practical use of the SendKeys method: It starts and sets focus to the Microsoft Management Console (MMC) and then sends keystrokes that cause the Add/Remove Snap-in and Add Standalone Snap-in dialog boxes to be displayed. The script automates the first part of the common task of constructing custom MMC snap-in tools. Listing 3.30 Sending Keystrokes to a GUI Application 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15Const iNormalFocus = 1 Set objShell = WScript.CreateObject("WScript.Shell") objShell.Run "mmc.exe",iNormalFocus Wscript.Sleep 300 objShell.AppActivate "Console1" Wscript.Sleep 100 objShell.SendKeys "^m" Wscript.Sleep 100 objShell.SendKeys "{TAB}" Wscript.Sleep 100 objShell.SendKeys "{TAB}" Wscript.Sleep 100 objShell.SendKeys "{ENTER}"Retrieving and Changing a Scripts Current Working Directory Microsoft Windows 2000 Scripting Guide The working directory for a script is initially set to the directory from which the script is started. This is not necessarily the directory where the script file is located. If you are working in the C:\Temp directory, for example, and you type c:\scripts\report.vbs to run the Report.vbs script, the working directory is C:\Temp, even though the actual script file, Report.vbs, is located in the C:\Scripts directory. The WshShell object provides the CurrentDirectory property to allow your scripts to determine or modify their current working directory. There are a number of reasons why you might need to know and possibly change the current working directory of a script. For example: You want your script to create a log file in the same folder as the script.You want to determine whether the script has been run locally or from across the network. (The current working directory will start with two backslashes [\\] instead of a drive letter such as C if it has been run from across the network.)To retrieve the current directory for a script, create an instance of the WshShell object, and then echo the value of the CurrentDirectory property. To configure the working directory, simply assign a new value to this property. The script in Listing 3.31 uses the CurrentDirectory property to both retrieve and set a scripts working directory. If the specified working directory does not exist, the script will fail. Listing 3.31 Setting and Retrieving a Scripts Current Working Directory 1 2 3 4 5 6 7 8 9Set objShell = WScript.CreateObject("WScript.Shell") Wscript.Echo "Initial Working Directory:" Wscript.Echo objShell.CurrentDirectory objShell.CurrentDirectory = "C:\" Wscript.Echo "Working Directory After Change:" Wscript.Echo objShell.CurrentDirectoryIf the preceding script is started from the folder C:\Temp, the following output will appear in the command window: Initial Working Directory: C:\Temp Working Directory After Change: C:\ Displaying Timed Message Boxes Microsoft Windows 2000 Scripting Guide In a perfect world, each time you ran a script the script would encounter optimal conditions and be able to quickly and easily complete its appointed task. In the real world, of course, things do not always work quite so smoothly. Sometimes you will run a script and encounter a decision point; for example, you might try to connect to a remote computer, only to find that the connection cannot be made. When that occurs, a decision must be made: Should the script try again, should it ignore the problem, or should it simply give up? Depending on your needs, you might make the decision ahead of time and include code that instructs the script what to do: If you cannot make the connection, try again. At other times, you might prefer to be notified that a problem occurred and then make the decision yourself. If so, you need a way to be notified that a decision needs to be made, as well as a way to make that decision. Your script can use the WshShell Popup method to display a message box with a variety of buttons and return a value that indicates which of the buttons the user clicked. For example, you can display a message box with Yes and No buttons, and your script can take the appropriate action based on the button clicked by the user: Try to make the connection if the user clicks Yes; terminate the script if the user clicks No. In addition to providing users with multiple-choice options, you can also supply the Popup method with a parameter that forces it to time out after a given number of seconds as well as change the icon and title of the message box. By contrast, Wscript.Echo message boxes do not have an icon and always have the title Windows Script Host. A sample message box created using the Popup method is shown in Figure 3.13. Figure 3.13 Message Box Created by the Popup Method  INCLUDEPICTURE "http://www.microsoft.com/library/media/1033/technet/images/scriptcenter/guide/sas_wsh_116s.gif" \* MERGEFORMATINET  Comparing the Echo and Popup Methods If you run your script under Wscript, you can use Wscript.Echo instead of the WshShellPopup method to display messages in a message box. However, with Wscript.Echo, users can only click the OK button or do nothing. Wscript.Echo does not enable you to present users with multiple choices. In addition, your script is paused while the Wscript.Echo message is displayed. Only after the user clicks the OK button does the script proceed. In cases where no user acknowledges the message, Wscript.Echo pauses your script indefinitely or until it times out (if a time-out has been set). If you want your script to display messages in GUI message boxes as it progresses, but continue regardless of whether a user clicks the OK button, you cannot use Wscript.Echo. As shown in Figure 3.14, the message box displayed by Wscript.Echo has a single OK button. The user can either do nothing and keep the script waiting or click the OK button, allowing the script to continue. Figure 3.14 Message Box Produced by Using Wscript.Echo Under WScript  INCLUDEPICTURE "http://www.microsoft.com/library/media/1033/technet/images/scriptcenter/guide/sas_wsh_118s.gif" \* MERGEFORMATINET   HYPERLINK "http://www.microsoft.com/library/media/1033/technet/images/scriptcenter/guide/sas_wsh_118s_big.gif" \t "_blank" See full-sized image. Note Unlike Wscript.Echo, the Popup method always displays a message box, regardless of whether a script is running under CScript or WScript.Creating a Message Box That Times Out The script in Listing 3.32 uses the WScript Popup method to create three messages in message boxes, each of which has a single OK button. Each message box will be displayed on the screen for a maximum of 5 seconds. If no one has clicked the OK button after 5 seconds, the message box will automatically dismiss itself from the screen. Listing 3.32 Displaying Timed Progress Message Boxes 1 2 3 4 5 6Const TIMEOUT = 5 Set objShell = WScript.CreateObject("WScript.Shell") objShell.Popup "Disk Report Complete", TIMEOUT objShell.Popup "Memory Report Complete", TIMEOUT objShell.Popup "CPU Report Complete", TIMEOUTTimed message boxes are useful in at least two instances. For one, they enable you to provide a sort of graphical progress indicator without interrupting the flow of the script. For example, the script shown in Listing 3.32 can be incorporated within a script that actually generates a disk report, a memory report, and a CPU report. As each report is completed, you might want to display a message box notifying users of the current status. If this message box were displayed using the Echo method, the message box would remain on the screen, and the script would remain paused until someone clicked OK. With the Popup method, the message remains on the screen either until someone clicks OK or until the time-out period expires. In the preceding script, the message appears and the script pauses for no more than 5 seconds before continuing. Along similar lines, you might want to give users the opportunity to make a decision but, if no decision is immediately forthcoming, allow the script to follow a default course of action. For example, you might have a script that carries out a number of activities and then copies a set of files across the network. Because this copying procedure might take considerable time and bandwidth, you can display a pop-up message box asking the user whether he or she wants to proceed with the copying. The message can could be displayed for a minute or so; if there is no response, the script can automatically begin copying files. Choosing Icons and Buttons The WshShell Popup method enables you to create message boxes with various sets of buttons and icons. For example, you can create a message box with Yes and No buttons or a message box with the button set Abort, Retry, Ignore. In addition, you can determine which button a user clicked and then take appropriate action based on the user choice. This helps differentiate the Popup method from the Echo method; message boxes displayed using Echo have only an OK button. You specify both the button set and the icon by providing the Popup method with a fourth parameter. This parameter accepts a combination of predefined constants that specify the button set and the icon the message box should use. Table 3.17 lists the icons available to use with the Popup method along with their corresponding constants. Table 3.17 Constants for Icons IconConstant NameConstant ValueSTOPvbCritical16QUESTION MARKvbQuestion32EXCLAMATION MARKvbExclamation48INFORMATIONvbInformation64Table 3.18 lists the button sets available to use with the Popup method along with their corresponding constants. Table 3.18 Constants for Button Sets Button SetConstant NameConstant ValueOKvbOKOnly0OK and CANCELvbOKCancel1ABORT, RETRY and IGNOREvbAbortRetryIgnore2YES, NO and CANCELvbYesNoCancel3YES and NOvbYesNo4RETRY and CANCELvbRetryCancel5Although you can use either the constant names or the constant values within a script, using the constant names makes it much easier to understand the code. For example, it is relatively easy to see that the following line of code creates a pop-up message box with Yes and No buttons. (This message box also has a time-out value of 10 seconds and the title Popup Example.) objShell.Popup "Stop Icon / Abort, Retry and Ignore Buttons", _ 10, "Popup Example", vbYesNo To display both an icon and a button set, use two constants (joined by a plus sign) in the code: objShell.Popup "Stop Icon / Abort, Retry and Ignore Buttons", _ 10, "Popup Example", vbCritical + vbYesNo The script in Listing 3.33 displays a series of message boxes, each of which has a different icon and button set. If you click any button on a message box, the next message box will be displayed; otherwise, the script displays each message box for five seconds. Listing 3.33 Displaying Combinations of Icons and Button Sets 1 2 3 4 5 6 7 8 9 10 11 12 13 14Const TIMEOUT = 5 Const POPUP_TITLE = "Icons and Buttons" Set objShell = WScript.CreateObject("WScript.Shell") objShell.Popup "Stop Icon / Abort, Retry and Ignore Buttons", _ TIMEOUT,POPUP_TITLE,vbCritical+vbAbortRetryIgnore objShell.Popup "Question Mark Icon / Yes, No and Cancel Buttons", _ TIMEOUT,POPUP_TITLE,vbQuestion+vbYesNoCancel objShell.Popup "Exclamation Mark Icon / Yes and No Buttons", _ TIMEOUT,POPUP_TITLE,vbExclamation+vbYesNo objShell.Popup "Information Icon / Retry and Cancel Buttons", _ TIMEOUT,POPUP_TITLE,vbInformation+vbRetryCancelIn lines 414, the WshShell Popup method is called four times in succession to display pop-up message boxes with various icons and button sets. The third parameter passed to Popup is always the POPUP_TITLE constant and results in each pop-up message box having Icons and Buttons as its title. The fourth parameter is passed various constants representing both the icon and the button set to be used. Note that the constants are combined by using the plus (+) operator. Choosing the Default Button The WshShell Popup method lets you specify the default button when you create a message box. The default button is the button that has focus and will be chosen if the user presses ENTER. It is not unusual for users to reflexively press ENTER any time a message box is displayed. Because of that, some care should be taken when choosing the default button. For example, you might choose the button that, 9 times out of 10, users will select anyway. Or you might choose the button that is the "safest" should a user press ENTER without realizing what they are doing. For example, your message box might prompt the user, "Are you sure you want to delete all the files on this hard drive?" In a case such as this, you might want to configure No as the default button. That way, no damage will be done if a user accidentally presses ENTER. You can specify which button to make the default by adding another constant to the fourth parameter of the Popup method. Table 3.19 lists the constants you can use to set the default button in a message box. If you try to set the second or third button as the default when the message box does not have a second or third button, the default button constant you specify will be ignored and the left button will be set as the default. Table 3.19 Constants for Default Button Locations Default ButtonConstant NameConstant ValueLEFTvbDefaultButton10MIDDLEvbDefaultButton2256RIGHTvbDefaultButton3512The script in Listing 3.34 displays two message boxes in succession. Both message boxes use the Abort, Retry, Ignore button set. The first message box does not specify the default button, so the leftmost button, Abort, is automatically selected as the default. The second message box uses the vbDefaultButton2 constant to make Retry the default button. Listing 3.34 Setting Retry as the Default Button 1 2 3 4 5 6 7 8Const TIMEOUT = 5 Set objShell = WScript.CreateObject("WScript.Shell") objShell.Popup "Abort, Retry, Ignore. No Default Specified." _ ,TIMEOUT,,vbAbortRetryIgnore objShell.Popup "Abort, Retry, Ignore. Retry Set as Default." _ ,TIMEOUT,,vbAbortRetryIgnore+vbDefaultButton2Retrieving User Input One of the advantages of using the Popup method rather than the Echo method is that you can give users the chance to make a choice: Yes, I want to try again; no, I would rather just quit. This means that the script needs to determine which button a user has clicked. The Popup method returns an integer that you can compare with a set of constants to determine which button was clicked. If a message box times out, the Popup method returns 1. Table 3.20 lists the values you can use to identify which button a user has clicked. If the return value of the Popup method is equal to one of these constants, the user has clicked the associated button. Within a script, you can check either for the value of the constant or for the constant itself. For example, these two lines of code both check to see whether the OK button was clicked: If intClicked = 1 If intClicked = vbOK Table 3.20 Button Constants ValueConstantButton Clicked1VbOKOK2VbCancelCancel3VbAbortAbort4VbRetryRetry5VbIgnoreIgnore6VbYesYes7VbNoNoThe script in Listing 3.35 displays a message box that uses the Yes, No button set to determine whether the user would like more detailed information. The script uses the FileSystemObject to present the user with information about the host the script is running under. The script determines and displays the version of the script host file and uses the Popup method to allow the user to decide whether or not they would like to see more details about the file. Listing 3.35 Retrieving User Input from a Message Box 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30Const TIMEOUT = 7 Set objShell = WScript.CreateObject("WScript.Shell") Set objFS = WScript.CreateObject("Scripting.FileSystemObject") strPath = Wscript.FullName strFileVersion = objFS.GetFileVersion(strPath) iRetVal = objShell.Popup(Wscript.FullName & vbCrLf & _ "File Version: " & _ strFileVersion & vbCrLf & _ "Would you like more details?" _ ,TIMEOUT,"More Info?",vbYesNo + vbQuestion) Select Case iRetVal Case vbYes Set objFile = objFS.GetFile(strPath) objShell.Popup WScript.FullName & vbCrLf & vbCrLf & _ "File Version: " & strFileVersion & vbCrLf & _ "File Size: " & Round((objFile.Size/1024),2) & _ " KB" & vbCrLf & _ "Date Created: " & objFile.DateCreated & vbCrLf & _ "Date Last Modified: " & objFile.DateLastModified & _ vbCrLf,TIMEOUT Wscript.Quit Case vbNo Wscript.Quit Case -1 WScript.StdOut.WriteLine "Popup timed out." Wscript.Quit End SelectWshNetwork Object Microsoft Windows 2000 Scripting Guide The WshNetwork object provides your scripts with the ability to work with network drives and printers. It also provides your scripts with access to the name of the computer they are currently running on, as well as the domain and user names of the account under which they are running. This makes WshNetwork extremely useful in scripts that take actions based on such information as the name of the user logging on or the domain in which the user account resides. The WshNetwork object can be used to accomplish some of the same tasks as the net.exe command-line tool. For example, the net name command returns the name of the user and the computer; the net use command is used to map and unmap network drives. These similarities make WshNetwork useful for converting legacy batch files and logon scripts that use net.exe to a WSH-based solution. Table 3.21 lists the capabilities provided by the WshNetwork object, along with the methods and properties that your scripts can use to access this functionality. Table 3.21 Capabilities Provided by the WshNetwork Object CategoryMethod or PropertyWorking with network drivesMapNetworkDrive EnumNetworkDrives RemoveNetworkDriveWorking with network printersAddPrinterConnection AddWindowsPrinterConnection EnumPrinterConnections SetDefaultPrinter RemovePrinterConnectionObtaining information about the currently logged-on userComputerName UserDomain UserNameWshNetwork is part of the Windows Script Host Object Model, wshom.ocx. The object model for the WshNetwork object is shown in Figure 3.15. In addition to the methods and properties provided by the WshNetwork object, WshNetwork also exposes a WshCollection object. The WshCollection object is not created using CreateObject but is automatically created and returned by the WshNetwork objects EnumNetworkDrives and EnumPrinterConnections methods. Figure 3.15 shows the properties and methods of the WshNetwork object. Figure 3.15 WshNetwork Object Model  INCLUDEPICTURE "http://www.microsoft.com/library/media/1033/technet/images/scriptcenter/guide/sas_wsh_140c.gif" \* MERGEFORMATINET   HYPERLINK "http://www.microsoft.com/library/media/1033/technet/images/scriptcenter/guide/sas_wsh_140c_big.gif" \t "_blank" See full-sized image. Accessing the WshNetwork Object The WshNetwork object is a COM object, and an instance of the object can be created by the following code statement: Set objNetwork = WScript.CreateObject("WScript.Network") Managing Network Drives Microsoft Windows 2000 Scripting Guide Network drives remain an important part of the computing infrastructure. Users prefer mapped network drives to Universal Naming Convention (UNC) path names; it is easier to remember that financial records are stored on drive X than to remember that financial records are stored on \\atl-fs-01\departments\accounting\admin\financial_records\2002_archive. Administrators prefer mapped network drives as well; if financial records need to be moved to a new server, it is far easier to remap drive X than to expect users to memorize the new location. Your scripts can use the methods in this section to manage network drive connections as part of a logon script or in any WSH script that has a need to connect to or disconnect from a network share. In fact, this represents one area where WSH has system administration capability not found in WMI. While both WSH and WMI let you enumerate mapped network drives (WMI by using the Win32_MappedLogicalDisk class), only WSH enables you to create and delete drive mappings. WshNetwork provides three methods to work with network drive connections: MapNetworkDrive, RemoveNetworkDrive, and EnumNetworkDrives. You can use the three methods to manage network connections as part of a users logon script or in any WSH script that needs to connect to or disconnect from a network share. Mapping a Network Drive You map a local drive letter to a shared folder using the WshNetwork objects MapNetworkDrive method. You can use MapNetworkDrive to connect directly to a shared folder or any child folder beneath a shared folder. MapNetworkDrive has two mandatory and three optional arguments, defined in Table 3.22. Table 3.22 MapNetworkDrive Arguments ArgumentTypeRequiredDefaultDescriptionLocalNameString INCLUDEPICTURE "http://www.microsoft.com/library/media/1033/technet/images/scriptcenter/guide/table-bullet.gif" \* MERGEFORMATINET NoneThe drive letter, followed by a colon, assigned to the mapped network drive, e.g., "H:".RemoteNameString INCLUDEPICTURE "http://www.microsoft.com/library/media/1033/technet/images/scriptcenter/guide/table-bullet.gif" \* MERGEFORMATINET NoneThe shared folders UNC name, e.g., "\\ServerName\ShareName" or "\\ServerName\ShareName\FolderName".UpdateProfileBooleanFalseBoolean value indicating whether the mapping information is stored in the current users profile. The value True updates the current users profile; False does not.UserNameStringNoneMaps the network drive using the credentials of someone other than the current user.PasswordStringNonePassword for the user identified by the UserName argument.The following example demonstrates how MapNetworkDrive can be used in a users logon script to connect to two network shares. Set objNetwork = Wscript.CreateObject("WScript.Network") objNetwork.MapNetworkDrive "G:", "\\atl-fs-01\Sales" objNetwork.MapNetworkDrive "H:", "\\atl-fs-01\Users$\lewjudy" Drive G is mapped to the Sales share on the file server named atl-fs-01. Drive H is mapped to the users home directory located directly beneath the hidden share named Users$ on atl-fs-01. By default, MapNetworkDrive uses the access token of the current user to validate permissions prior to making the connection; you cannot map a drive to a folder unless you have permission to access that folder. In administrative scripts, it might be necessary to supply an alternate or elevated set of credentials to successfully connect to a share. You can use the optional UserName and Password arguments to supply a set of credentials that are used in lieu of the current users access token. After the connection is established, the supplied credentials govern access to the network drive for the duration of the connection. Two common conditions can cause MapNetworkDrive to fail: The user running the script might not have sufficient permissions to connect to the target share.The local drive letter might already be in use.Left unchecked, both conditions can result in run-time errors. To avoid permissions-related or password-related issues, your best defense is to trap and handle the error using VBScripts On Error Resume Next statement. To handle a local drive letter that is already in use, you can forcibly disconnect the mapped drive or locate and use a different drive letter. Unmapping a Network Drive Your scripts can use the RemoveNetworkDrive method to unmap a network drive. If the network drive has a mapping between a local drive letter and the remote UNC path, the method requires the local drive letter as its single parameter. If the network drive does not have a mapping between a local drive letter and the remote UNC path, the method requires the remote UNC path as its single parameter. The script in Listing 3.36 unmaps a drive G. Listing 3.36 Unmapping a Network Drive 1 2Set objNetwork = WScript.CreateObject("Wscript.Network") objNetwork.RemoveNetworkDrive "G:"In addition to the mandatory parameter that specifies the mapped drive to be removed, the MapNetworkDrive method accepts two additional, optional, parameters: A Boolean value that, if set to True, specifies that the method should unmap the drive regardless of whether it is currently in use. If the value is set to True, the user will no longer be able to save data to that drive, even if he or she has already opened a document from there. Instead, the user will have to save the document to an alternate location.A Boolean value that, if set to True, specifies that the method should remove the drive mapping from the profile of the user.Listing Current Network Drives Your scripts can use the EnumNetworkDrives method to retrieve a list of the current mapped network drives on a computer. The EnumNetworkDrives method returns a collection that holds pairs of items: network drive local names and their associated UNC names. The collection is zero-indexed; the even-numbered items in the collection are the local drive names, and the odd-numbered items are the associated UNC paths. A sample network drive collection is shown in Table 3.23. In this sample collection, drive D (index number 0) maps to \\atl-fs-01\users\kmyer (index number 1). Table 3.23 Sample Network Drive Collection Index NumberValue0D:1\\atl-fs-01\users\kmyer2E:3\\atl-fs-02\accounting4F:5\\atl-fs-03\publicA script can retrieve both pieces of information about each mapped network drive by iterating through the collection returned by EnumNetworkDrives and retrieving two items from the collection during each iteration. An example of this is shown in Listing 3.37. Listing 3.37 Listing Current Network Drives 1 2 3 4 5Set objNetwork = WScript.CreateObject("WScript.Network") Set colDrives = objNetwork.EnumNetworkDrives For i = 0 to colDrives.Count-1 Step 2 Wscript.Echo colDrives.Item(i) & vbTab & colDrives.Item (i + 1) NextManaging Network Printers Microsoft Windows 2000 Scripting Guide Managing printer connections on user computers is an important part of system administration. When a new printer comes online, you do not have to send instructions on how to connect to this device; instead, you can simply include code in a logon script that automatically makes this connection for a user. Likewise, when a printer is removed from the network, you can remove the printer connection, preventing the problems likely to arise when users try to print to a printer that no longer exists. The WshNetwork object provides methods that enable your scripts to add or remove printer connections, to set the default printer, and to list the current printer connections on a computer. Adding Printer Connections Two WshNetwork methods enable your scripts to add printer connections: AddWindowsPrinterConnection and AddPrinterConnection. The AddWindowsPrinterConnection method enables a script to add a Windows-based printer connection (like using the Control Panel Add Printer Wizard), while the AddPrinterConnection method enables a script to add an MS-DOS-based printer connection. Adding Windows-based Printer Connections When used to add a Windows-based printer connection to a Windows NTbased operating system such as Windows 2000, Windows XP, or Windows NT, the AddWindowsPrinterConnection method accepts, as its only required parameter, the UNC path of the printer. The script in Listing 3.38 adds a connection to the network printer with the UNC path \\HRServer01\Printer1. Listing 3.38 Adding a Windows-based printer connection (Windows NTbased operating system) 1 2Set objNetwork = Wscript.CreateObject("WScript.Network") objNetwork.AddWindowsPrinterConnection "\\HRServer01\Printer1"When used to add a Windows-based printer connection to Windows 95, Windows 98, or Windows Me, the AddWindowsPrinterConnection method requires two parameters: the UNC path of the printer and the name of the printer driver (which must already be installed on the computer). In addition, when used with these operating systems, the method accepts a third, optional, parameter that specifies the local port through which the printer should be made available. Adding MS-DOS -based printer connections The AddPrinterConnection method enables a script to add an MS-DOS-based printer connection. The method takes two required parameters: the local port through which the printer will be available and the UNC path of the network printer. The AddPrinterConnection method also lets you add the mapping to the user profile. If you want to do this, set the updateProfile Boolean argument to True. The user name and the password parameters let you connect to the specified printer by using another users credentials. Unlike the AddWindowsPrinterConnection method, the AddPrinterConnection method requires you to specify a port name. Removing a Printer Connection To remove a printer connection, use the RemovePrinterConnection method. WshNetwork.RemovePrinterConnection(printerName, [forced], [updateProfile]) The first argument identifies the shared printer. The other two optional arguments let you specify: Whether the disconnection should be forced, even if the printer is in use.Whether the user profile should be updated to reflect the disconnection.The RemovePrinterConnection method removes both Windows and MS-DOS-based printer connections. If the printer was connected using AddPrinterConnection, the printerName argument must be the same as the printers local port. If the printer was set up using the AddWindowsPrinterConnection method or was added manually through the Add Printer wizard, the printerName argument must be the printers UNC name. For example, this command removes the connection to the printer \\atl-ps-01\colorprinter. Set objNetwork = WScript.CreateObject("WScript.Network") objNetwork.RemovePrinterConnection "\\atl-ps-01\colorprinter" Enumerating the Available Printers To obtain a list of the printers set up on a computer, you use code similar to that used to list the mapped network drives. You use the EnumPrinterConnections method to obtain a WshCollection object where each network printer is made up of two elements in the collection. The even-positioned item contains the printers local name or port. The odd-positioned item contains the UNC name. As shown in Listing 3.39, you can use a For Next loop with the step value 2 to collect all the information you need. Listing 3.39 Enumerating Available Printers 1 2 3 4 5Set objNetwork = WScript.CreateObject("WScript.Network") Set colPrinters = objNetwork.EnumPrinterConnections For i = 0 to colPrinters.Count -1 Step 2 Wscript.Echo colPrinters.Item(i) & vbTab & colPrinters.Item (i + 1) NextWhen run under CScript, output similar to this is displayed in the command window: LPT1: Art Department Printer XRX00034716DD75 \\atl-prn-xrx\plotter XRX0000AA622E89 \\atl-prn-xrx\colorprinter Setting the Default Printer Many users print documents by clicking the printer icon within their application; in most cases that means that documents are automatically sent to the users default printer. By assigning different users different default printers, you can help divide the print load among your print devices and ensure that documents are printed quickly and efficiently. The SetDefaultPrinter method lets you assign a specific printer the role of the default printer. SetDefaultPrinter uses the following syntax: WshNetwork.SetDefaultPrinter(printerName) The printerName parameter is the UNC name of the printer. (If the printer is a local printer, you can also use a port name such as LPT1.) This script sets the printer \\atl-ps-01\colorprinter as the default: Set objNetwork = WScript.CreateObject("WScript.Network") objNetwork.SetDefaultPrinter("\\atl-ps-01\colorprinter") The SetDefaultPrinter method cannot retrieve the current default printer. Obtaining User and Computer Information Microsoft Windows 2000 Scripting Guide The WshNetwork object has three read-only properties that your scripts can use to obtain information about the computer they are running on and the user account under which they are running. These properties are ComputerName, UserDomain, and UserName. Depending on your needs, you should consider using ADSI to return this same information. WSH is able to return only the SAM account name of a user or computer (for example, kenmyer). ADSI, however, is able to return the distinguished name for these same objects. (For example, cn=ken myer,ou=Human Resources,dc=fabrikam,dc=com.) Using the distinguished name, the script can then directly bind to the object in Active Directory and perform such tasks as enumerate the groups that the user belongs to. With the SAM account name, the script would need to search Active Directory, determine the distinguished name, and then bind to the object. There might be times, however, when simply knowing the user name, computer name, or domain name is sufficient information for your script to perform its tasks. In those instances, the WshNetwork object will likely suffice. In addition, WSH is installed by default on Windows 98 and Windows NT 4.0 computers, while ADSI is not. Because of this, WSH might be your only option when supporting computers such as those running Windows NT 4.0. The WshNetwork object is often used in logon scripts that map different network drives, depending on the domain of the user running the script. The script in Listing 3.40 maps drive N to \\fileserver01\accounting if the users domain is ACT or maps drive N to \\fileserver01\development if the users domain is DEV. Listing 3.40 Mapping a Network Drive According to User Domain 1 2 3 4 5 6 7 8 9 10 11Set objNetwork = WScript.CreateObject("WScript.Network") strUserDomain = objNetwork.UserDomain If strUserDomain = "ACCOUNTING" Then objNetwork.MapNetworkDrive "N:", "\\fileserver01\accounting", True ElseIf strUserDomain = "DEVELOPMENT" Then objNetwork.MapNetworkDrive "N:", "\\fileserver01\development", True Else Wscript.Echo "User " & objNetwork.UserName & _ "not in ACCOUNTING or DEVELOPMENT. N: not mapped." End IfScript Runtime Primer Microsoft Windows 2000 Scripting Guide File system management is a key part of system administration, and yet neither Windows Script Host (WSH) nor Microsoft Visual Basic Scripting Edition (VBScript) provides many capabilities in that area. Fortunately, you can use the Script Runtime library to manage such key file system components as disk drives, folders, and files. In addition, the Script Runtime library provides methods for reading from and writing to text files, for creating "dictionaries" (used to manage data within a script), and for encoding scripts. Script Runtime Overview Microsoft Windows 2000 Scripting Guide The two primary Microsoft scripting languages, Microsoft Visual Basic Scripting Edition (VBScript) and Microsoft JScript, were originally developed as client-side scripting languages for Microsoft Internet Explorer. Because of this, a number of limitations were specifically built into each language. For example, neither VBScript nor JScript has inherent methods for performing file management tasks such as copying, moving, or deleting files. This was done to protect consumers: Most visitors to a Web site would not appreciate having a script on a Web page begin deleting files from their hard drives. However, scripting began to rapidly evolve from a client-side technology used primarily for such things as HTML "rollovers" (for example, changing the color of a font when you pass the mouse over a hyperlink). With the advent of Active Server Pages, Web developers required the ability to perform file management on the server. With the advent of Windows Script Host (WSH), system administrators required the ability to perform file management outside the Web browser. In response to these needs, Microsoft released the Script Runtime library. The Script Runtime library is a single dynamic-link library (DLL), scrrun.dll, that provides script writers with a number of file system management capabilities, including the ability to: Retrieve information about the file system, including disk drives, files, and folders.Copy, move, and delete files and folders.Create, read from, and write to text files.In addition to these file management capabilities, the Script Runtime library also features the ability to create dictionaries (data structures that function similar to collections) and to encode scripts, effectively shielding the code from prying eyes. Note This chapter discusses the FileSystemObject (used for file management) and the Dictionary object, but not the Script Encoder object.The Script Runtime library is a part of Windows 2000. The Script Runtime library is also installed anytime you install or upgrade a number of Microsoft applications, including the following: Windows Script HostVBScriptInternet ExplorerMicrosoft OfficeFileSystemObject Microsoft Windows 2000 Scripting Guide As the name implies, the FileSystemObject (FSO) is designed to help you manage the file system. The FileSystemObject allows you to retrieve information about essential file system elements, including disk drives, folders, and files; it also includes methods that allow you to perform common administrative tasks, such as copying, deleting, and moving files and folders. In addition, the FileSystemObject enables you to read from and write to text files. It is worth noting that the name FileSystemObject is a bit of a misnomer, simply because the FileSystemObject actually includes a number of objects, each designed for a specific purpose. The individual objects that make up the FileSystemObject are listed in Table 4.1. Table 4.1 Objects That Make Up the FileSystemObject ObjectDescriptionDriveRepresents a drive or collection of drives on the system.FileRepresents a file or collection of files in the file system.FolderRepresents a folder or collection of folders in the file system.TextStreamRepresents a stream of text that is read from, written to, or appended to a text file.Each of these objects will be examined in detail in this chapter. Managing Disk Drives Microsoft Windows 2000 Scripting Guide Disk drive management is an important part of system administration. As a system administrator, it is important for you to know the disk drives that are installed on a computer; it is equally important for you to know the characteristics of those disk drives, including such things as the drive type (floppy disk, hard disk, CD-ROM), drive size, and the amount of free disk space available on each drive. As a script writer, you have two primary options for managing disk drives: the FileSystemObject and Windows Management Instrumentation (WMI). In general, WMI is the preferred technology for scripts that manage disk drives, for several reasons: WMI can return a number of properties that cannot be obtained by using the FileSystemObject, including physical characteristics such as heads, sectors, and cylinders.WMI can return a targeted set of drives (for example, only hard drives). The FileSystemObject cannot return a targeted set of drives. Instead, the FileSystemObject requires the script to return a collection of all the drives and then iterate through the collection to pick out the drives of interest. (You can, however, use the FileSystemObject to return an individual drive simply by specifying the appropriate drive letter.)WMI can be used to return drive information from remote computers. The FileSystemObject cannot be run on remote computers unless it is used in conjunction with the WshController object.Although WMI might be the preferred technology for returning disk drive information, there are at least two good reasons to be familiar with the FileSystemObject. First, you might have older computers running an operating system that does not have WMI installed. (For example, Microsoft Windows 98 did not ship with WMI, although it is possible to download and install WMI on this operating system.) Second, and perhaps most important, script writers have typically used the FileSystemObject whenever they wrote a script requiring disk drive information. Because of that, you are likely to encounter the FileSystemObject when reading scripts written by other script writers. Returning a Collection of Disk Drives Microsoft Windows 2000 Scripting Guide Before you can manage disk drives on a computer, you need to know which disk drives are actually available on that computer. The FileSystemObject allows you to return a collection of all the drives installed on a computer, including removable drives and mapped network drives (in other words, any drive with a drive letter). To return this collection, create an instance of the FileSystemObject, and then create a reference to the Drives property. After the collection has been returned, you can use a For Each loop to iterate through the collection. For example, the script in Listing 4.1 returns a collection of all the drives installed on a computer and then echoes the drive letter for each drive in the collection. Listing 4.1 Enumerating All the Drives on a Computer 1 2 3 4 5Set objFSO = CreateObject("Scripting.FileSystemObject") Set colDrives = objFSO.Drives For Each objDrive in colDrives Wscript.Echo "Drive letter: " & objDrive.DriveLetter NextFor a complete list of drive properties available using the FileSystemObject, see Table 4.2 later in this chapter. Retrieving File Properties Microsoft Windows 2000 Scripting Guide Files have a number of properties that are extremely useful for managing a file system. For example, the DateLastAccessed property tells you the date when someone last opened the file. This property can be used to identify files that are taking up disk space yet are never used. Similarly, the Size property tells you the size of a file in bytes. This helps you to better analyze disk usage; you can tell whether a single file might be using up more than its fair share of storage space. Traditionally, system administrators have accessed file properties by using either Windows Explorer or command-line tools. Although these tools can return information about the files on a computer, they are not always designed to save this data or to act on it. In addition, many of these tools have only a limited ability to be automated, making it more difficult for system administrators to periodically sweep their hard drives and search for files that meet specific criteria. Fortunately, detailed information about any file on a computer can also be retrieved by using the FileSystemObject; among other things, this allows you to automate the process of querying the file system for information about a file or group of files. A complete list of properties available through the File object is shown in Table 4.5. Table 4.5 File Object Properties PropertyDescriptionAttributesBitmap containing the attributes for the file.DateCreatedDate that the file was created.DateLastAccessedDate of the last time a user accessed the file.DateLastModifiedDate of the last time a user modified the file.DriveDrive letter and trailing colon (for example, C:) representing the drive on which the file is stored.NameFile name, not including path information. For example, the Name of the file C:\Windows\System32\Scrrun.dll is Scrrun.dll.ParentFolderName of the folder in which the file is stored. For example, the ParentFolder of C:\Windows\System32\Scrrun.dll is Windows.PathFull path of the file (for example, C:\Windows\System32\Scrrun.dll).ShortNameMS-DOS-style name of the file, using the 8.3 naming convention. For example, the file C:\MySpreadsheet.xls might have the ShortName MySpre~1.xls.ShortPathMS-DOS-style path to the file, using the 8.3 naming convention. For example, the file C:\Windows\Program Files\MyScript.vbs might have the ShortName C:\Windows\Progra~1\MyScript.vbs.SizeTotal size, in bytes, of the contents of the file.TypeString describing the file type, as recorded in the registry (for example, "Microsoft Word Document").To access file properties, a script must: 1.Create an instance of the FileSystemObject.2.Use the GetFile method to create an object reference to a particular file. The script must pass the path of the file as the GetFile parameter.3.Echo (or otherwise manipulate) the appropriate file properties.For example, the script in Listing 4.27 uses the GetFile method to bind to the file C:\Windows\System32\Scrrun.dll and then echoes a number of the file properties. Listing 4.27 Enumerating File Properties 1 2 3 4 5 6 7 8 9 10 11 12 13Set objFSO = CreateObject("Scripting.FileSystemObject") Set objFile = objFSO.GetFile("c:\windows\system32\scrrun.dll") Wscript.Echo "Date created: " & objFile.DateCreated Wscript.Echo "Date last accessed: " & objFile.DateLastAccessed Wscript.Echo "Date last modified: " & objFile.DateLastModified Wscript.Echo "Drive: " & objFile.Drive Wscript.Echo "Name: " & objFile.Name Wscript.Echo "Parent folder: " & objFile.ParentFolder Wscript.Echo "Path: " & objFile.Path Wscript.Echo "Short name: " & objFile.ShortName Wscript.Echo "Short path: " & objFile.ShortPath Wscript.Echo "Size: " & objFile.Size Wscript.Echo "Type: " & objFile.TypeWhen this script runs under CScript, output similar to the following appears in the command window: Date created: 10/29/2001 10:35:36 AM Date last accessed: 2/14/2002 1:55:44 PM Date last modified: 8/23/2001 4:00:00 AM Drive: c: Name: scrrun.dll Parent folder: C:\Windows\system32 Path: C:\Windows\system32\scrrun.dll Short name: scrrun.dll Short path: C:\Windows\system32\scrrun.dll Size: 147483 Type: Application Extension Enumerating File Attributes Microsoft Windows 2000 Scripting Guide Like folders, files also have attributes that can be retrieved and configured using the FileSystemObject. Also like folders, file attributes are returned as a bitmap value. (For more information on bitmap values and how to use them, see " HYPERLINK "http://www.microsoft.com/technet/scriptcenter/guide/sas_scr_tspz.mspx" Managing Folder Attributes" earlier in this chapter.) File attributes can include any or all of the values shown in Table 4.6. Table 4.6 File Attributes Used by the FileSystemObject ConstantValueDescriptionNormal0File with no attributes set.Read-only1File can be read but cannot be modified.Hidden2File is hidden from view in Windows Explorer or My Computer.System4File is needed by the operating system.Archive32File is flagged as requiring backup.Alias64File is a shortcut to another file.Compressed2048File has been compressed.To retrieve the attributes of a file, use the GetFile method to bind to the file. After you have created an object reference to the file, you can use the logical AND operator to determine the file attributes. If the file does not have any attributes configured, the Attributes value will be 0. For example, the script in Listing 4.28 binds to the file C:\FSO\ScriptLog.txt and then checks for the presence of each attribute that can be retrieved using the FileSystemObject. Listing 4.28 Enumerating File Attributes 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23Set objFSO = CreateObject("Scripting.FileSystemObject") Set objFile = objFSO.GetFile("C:\FSO\ScriptLog.txt") If objFile.Attributes AND 0 Then Wscript.Echo "No attributes set." End If If objFile.Attributes AND 1 Then Wscript.Echo "Read-only." End If If objFile.Attributes AND 2 Then Wscript.Echo "Hidden file." End If If objFile.Attributes AND 4 Then Wscript.Echo "System file." End If If objFile.Attributes AND 32 Then Wscript.Echo "Archive bit set." End If If objFile.Attributes AND 64 Then Wscript.Echo "Link or shortcut." End If If objFile.Attributes AND 2048 Then Wscript.Echo "Compressed file." End IfConfiguring File Attributes Microsoft Windows 2000 Scripting Guide In addition to enumerating file attributes, the FileSystemObject provides a way to configure the following attributes: ReadOnlyHiddenSystemArchiveTo configure a file attribute, the script should use the following procedure: 1.Use the GetFile method to bind to the file.2.Check for the attribute you want to change. For example, if you want to make a file read-only, check to see whether the file has already been marked read-only.3.If the file is not read-only, use the logical operator XOR to toggle the switch. This will mark the file as read-only. If the file is already read-only, be careful not to use XOR. If you do, the switch will be toggled, and the read-only attribute will be removed.The script in Listing 4.29 uses the AND operator to check whether the switch with the value 1 (read-only) has been set on the file C:\FSO\TestScript.vbs. If the file is not read-only, the script uses the XOR operator to turn the switch on and mark the file as read-only. Listing 4.29 Configuring File Attributes 1 2 3 4 5Set objFSO = CreateObject("Scripting.FileSystemObject") Set objFile = objFSO.GetFile("C:\FSO\TestScript.vbs") If objFile.Attributes AND 1 Then objFile.Attributes = objFile.Attributes XOR 1 End IfYou can also simultaneously remove the ReadOnly, Hidden, System, and Archive attributes by using the following code statement: objFile.Attributes = objFile.Attributes AND 0 Parsing File Paths Microsoft Windows 2000 Scripting Guide A path is a hierarchical series of names that allow you to pinpoint the exact location of a file or folder. In that respect, paths are similar to street addresses: they provide information that tells you precisely where to locate an object. A street address such as One Main Street, Redmond, WA, tells you precisely where to find a particular residence. Likewise, the path C:\FSO\Scripts\ScriptLog.txt tells you precisely where to locate a particular file. Just as only one building can be located at One Main Street, Redmond, WA, only one file can be located at C:\FSO\Scripts\ScriptLog.txt. Complete paths such as C:\FSO\Scripts\ScriptLog.txt are very important because they provide the only way to uniquely identify a file or folder location. Because of that, there will be times when your script will need the complete path. At other times, however, you might want only a portion of the path. For example, you might want to extract only the file name or only the file name extension. To allow you to parse paths and extract individual path components, the FileSystemObject provides the methods listed in Table 4.7. Table 4.7 Methods for Parsing File Paths MethodDescriptionGetAbsolutePathNameReturns the complete path of the file (for example, C:\FSO\Scripts\Scriptlog.txt).GetParentFolderNameReturns the path of the folder where the file is stored (for example, C:\FSO\Scripts).GetFileNameReturns the name of the file, minus any path information (for example, ScriptLog.txt).GetBaseNameReturns the base name of the file, the file name minus the file name extension (for example, ScriptLog).GetExtensionNameReturns the file name extension (for example, txt).The script in Listing 4.30 parses the path for the file ScriptLog.txt. This script works only if ScriptLog.txt is in the same folder as the script doing the parsing. If the two files are stored in different folders, you must pass the complete path to the GetFile method (for example, C:\FSO\Scripts\ScriptLog.txt). Listing 4.30 Parsing File Paths 1 2 3 4 5 6 7Set objFSO = CreateObject("Scripting.FileSystemObject") Set objFile = objFSO.GetFile("ScriptLog.txt") Wscript.Echo "Absolute path: " & objFSO.GetAbsolutePathName(objFile) Wscript.Echo ?Parent folder: ? & objFSO.GetParentFolderName(objFile) Wscript.Echo "File name: " & objFSO.GetFileName(objFile) Wscript.Echo "Base name: " & objFSO.GetBaseName(objFile) Wscript.Echo "Extension name: " & objFSO.GetExtensionName(objFile)When this script is run under CScript, output similar to the following appears in the command window: Absolute path: C:\FSO\Scripts\ScriptLog.txt Parent folder: C:\FSO\Scripts File name: ScriptLog.txt Base name: ScriptLog Extension name: txt Retrieving the File Version Microsoft Windows 2000 Scripting Guide File versions that are incompatible or out-of-date can create considerable problems for system administrators. For example, a script that runs fine on Computer A, where version 2.0 of a particular DLL has been installed, might fail on Computer B, which has version 1.0 of that DLL installed. These problems can be difficult to troubleshoot, because you are likely to get back an error saying that the object does not support a particular property or method. This is because the version of the object installed on Computer B does not support the new property or method. If you try to debug the script on Computer A, you will have difficulty finding the problem because the version of the object installed on Computer A does support the property or method in question. The GetFileVersion method allows you to retrieve version information from a file. To use this method, a script must: 1.Create an instance of the FileSystemObject.2.Call the GetFileVersion method, passing the path to the file as the sole parameter.For example, the script in Listing 4.31 retrieves the file version for Scrrun.dll. Listing 4.31 Retrieving File Versions 1 2Set objFSO = CreateObject("Scripting.FileSystemObject") Wscript.Echo objFSO.GetFileVersion("c:\windows\system32\scrrun.dll")When this script runs on a Windows 2000-based computer with WSH 5.6 installed, the message box shown in Figure 4.7 appears. Figure 4.7 Version Number for Scrrun.dll  INCLUDEPICTURE "http://www.microsoft.com/library/media/1033/technet/images/scriptcenter/guide/sas_scr_07s.gif" \* MERGEFORMATINET  Version numbers are typically displayed in four parts, such as 5.6.0.6626, rather than a single number (such as version 1 or version 5). Version number 5.6.0.6626 contains the following parts: 5 - The major file part.6 - The minor file part. The major and minor parts together represent the way a version is typically referred to. In conversation, you would likely refer to version 5.6 rather than version 5.6.0.6626.0 - The build part. This is typically 0.6626 - The private file part.Not all files types support versioning. Executable files and DLLs typically support versioning; plain-text files, including scripts, typically do not. Reading Text Files Microsoft Windows 2000 Scripting Guide Reading data from a text file is a standard procedure used in many enterprise scripts. You might use this capability to: Read in command-line arguments. For example, a text file might contain a list of computers, with the script designed to read in the list and then run against each of those computers.Programmatically search a log file for specified conditions. For example, you might search a log file for any operations marked Error.Add the contents of a log file to a database. For example, you might have a service or an application that saves information in plain-text format. You could write a script that reads in the text file and then copies the relevant information to a database.The FileSystemObject can be used to read the contents of a text file. When using the FileSystemObject, keep the following limitations in mind: The FSO can read only ASCII text files. You cannot use the FSO to read Unicode files or to read binary file formats such as Microsoft Word or Microsoft Excel.The FileSystemObject reads a text file in one direction: from the beginning to the end of the text file. In addition, the FSO reads only line by line. If you need to go back to a previous line, you must return to the beginning of the file and read forward to the required line.You cannot open a file for simultaneous reading and writing. If you open a file for reading, you must open the file a second time if you want to modify the contents. If you attempt to read a file after opening it in write mode, you will receive a "bad file mode" error.The file-reading methods available through the FileSystemObject are listed in Table 4.8. The examples shown in the table are based on a text file of services and service properties that looks similar to this: Alerter,Share Process,Running,Auto,LocalSystem, AppMgmt,Share Process,Running,Manual,LocalSystem, Ati HotKey Poller,Own Process,Stopped,Auto,LocalSystem, Table 4.8 Read Methods Available to the FileSystemObject MethodDescriptionReadReads the specified number of characters and then stops. For example, the following command would read the first 12 characters of the first line ("Alerter,Shar") into the variable strText and then stop:strText = objTextFile.Read(12)ReadLineReads one line from a text file and then stops before reaching the newline character. For example, the following command would read the first line ("Alerter,Share Process,Running,Auto,LocalSystem") into the variable strText and then stop:strText = objTextFile.ReadLine To read an entire text file on a line-by-line basis, place the ReadLine function within a loop.ReadAllReads the entire contents of a text file into a variable.SkipSkips the specified number of characters and then stops. For example, the following command would skip the first 12 characters. Any subsequent read operations would begin with the 13th character and continue from there ("e Process,Running,Auto,LocalSystem"):objTextFile.Skip(12)SkipLineSkips an entire line in a text file. For example, this code reads the first and third lines of a text file, skipping the second line:strText = objTextFile.Readline objTextFile.SkipLine strText = objTextFile.ReadlineVerifying the Size of a File Windows will sometimes create text files that are empty - that is, files that contain no characters and have a file size of 0 bytes. This often occurs with log files, which remain empty until a problem is recorded there. For example, if problems occur with a user logon (such as a user attempting to log on with an incorrect password or user account), those problems will be recorded in the Netlogon.log file. Until such a problem occurs, however, the Netlogon.log file remains empty. Empty files represent a problem for script writers, because a VBScript run-time error will occur if you attempt to read such a file. If you try to read an empty file, an error message similar to the one shown in Figure 4.8 appears. Figure 4.8 Empty File Error Message  INCLUDEPICTURE "http://www.microsoft.com/library/media/1033/technet/images/scriptcenter/guide/sas_scr_08s.gif" \* MERGEFORMATINET  If there is a chance that a file might be empty, you can avoid errors by checking the file size before attempting to read the file. To do this, the script must: 1.Create an instance of the FileSystemObject.2.Use the GetFile method to bind to the file.3.Use the Size property to ensure that the file is not empty before attempting open it.The script in Listing 4.37 binds to the file C:\Windows\Netlogon.log. The script checks the size of the file; if the size is greater than 0, the script opens and reads the file. If the file size is 0, the script echoes the message "The file is empty." Listing 4.37 Verifying the Size of a File 1 2 3 4 5 6 7 8 9 10Set objFSO = CreateObject("Scripting.FileSystemObject") Set objFile = objFSO.GetFile("C:\Windows\Netlogon.log") If objFile.Size > 0 Then Set objReadFile = objFSO.OpenTextFile("C:\Windows\Netlogon.log", 1) strContents = objReadFile.ReadAll Wscript.Echo strContents objReadFile.Close Else Wscript.Echo "The file is empty." End IfReading an Entire Text File The ReadAll method provides the easiest way to read a text file: You simply call the method, and the entire text file is read and stored in a variable. Having the contents of the text file stored in a single variable can be useful in a number of situations. For example, if you want to search the file for a particular item (such as an error code), it is easier to search a single string than to search the file line by line. Likewise, if you want to concatenate (combine) text files, the ReadAll method provides the quickest and easiest method. For example, suppose you have a set of daily log files that you want to combine into a single weekly log file. To do that, a script can: 1.Open the text file for Monday and use ReadAll to store the entire contents in a variable.2.Open the weekly log file for appending, and write the contents of the variable to the file. This is possible because any formatting (such as line breaks or tabs) that is read in from the Monday file is preserved in the variable.3.Repeat steps 1 and 2 until the entire set of daily files has been copied into the weekly log.Note Although it is easier to search a single string, it is not necessarily faster. The ReadAll method took less than a second to search a 388-KB test file of approximately 6,000 lines. Reading and searching the file on a line-by-line basis also took less than a second.To use the ReadAll method, open a text file for reading and then call ReadAll. (No parameters are needed.) For example, the script in Listing 4.38 opens the file C:\FSO\ScriptLog, reads in the contents of the file, and stores that data in the variable strContents. The script then echoes the value of strContents, which happens to be the contents of the text file as well. Listing 4.38 Reading a Text File Using the ReadAll Method 1 2 3 4 5 6Const ForReading = 1 Set objFSO = CreateObject("Scripting.FileSystemObject") Set objFile = objFSO.OpenTextFile("C:\FSO\ScriptLog.txt", ForReading) strContents = objFile.ReadAll Wscript.Echo strContents objFile.CloseReading a Text File Line by Line For system administration purposes, text files typically serve as flat-file databases, with each line of the file representing a single record in the database. For example, scripts often read in a list of server names and then carry out an action against each of those servers. In those instances, the text will look something like the following: atl-dc-01 atl-dc-02 atl-dc-03 atl-dc-04 When a text file is being used as a flat-file database, a script will typically read each record (line) individually and then perform some action with that record. For example, a script (using the preceding sample text file) might read in the name of the first computer, connect to it, and carry out some action. The script would then read in the name of the second computer, connect to it, and carry out that same action. This process would continue until all the records (lines) in the text file have been read. The ReadLine method allows a script to read individual lines in a text file. To use this method, open the text file, and then set up a Do Loop that continues until the AtEndOfStream property is True. (This simply means that you have reached the end of the file.) Within the Do Loop, call the ReadLine method, store the contents of the first line in a variable, and then perform some action. When the script loops around, it will automatically drop down a line and read the second line of the file into the variable. This will continue until each line has been read (or until the script specifically exits the loop). For example, the script shown in Listing 4.39 opens the file C:\FSO\ServerList.txt and then reads the entire file line by line, echoing the contents of each line to the screen. Listing 4.39 Reading a Text File Using the ReadLine Method 1 2 3 4 5 6 7Set objFSO = CreateObject("Scripting.FileSystemObject") Set objFile = objFSO.OpenTextFile("C:\FSO\ServerList.txt", 1) Do Until objFile.AtEndOfStream strLine = objFile.ReadLine Wscript.Echo strLine Loop objFile.Close"Reading" a Text File from the Bottom to the Top As noted previously, the FileSystemObject can read a text file only from the beginning to the end; you cannot start at the end and work your way backwards. This can sometimes be a problem when working with log files. Most log files store data in chronological order: The first line in the log is the first event that was recorded, the second line is the second event that was recorded, and so on. This means that the most recent entries, the ones you are perhaps most interested in, are always located at the very end of the file. There might be times when you want to display information in reverse chronological order - that is, with the most recent records displayed first and the oldest records displayed last. Although you cannot read a text file from the bottom to the top, you can still display the information in reverse chronological order. To do this, a script must: 1.Create an array to hold each line of the text file.2.Use the ReadLine method to read each line of the text file and store each line as a separate element in the array.3.Display the contents of the array on screen, starting with the last element in the array (the most recent record in the log file) and ending with the first element in the array (the oldest log file).For example, the script in Listing 4.40 reads in the file C:\FSO\ScriptLog.txt, storing each line as an element in the array arrFileLines. After the entire file has been read, the contents are echoed to the screen, beginning with the last element in the array. To do this, the For Loop begins with the last element (the upper bound of the array) and incrementally works down to the first element (the lower bound). Listing 4.40 "Reading" a Text File from the Bottom to the Top 1 2 3 4 5 6 7 8 9 10 11 12 13Dim arrFileLines() i = 0 Set objFSO = CreateObject("Scripting.FileSystemObject") Set objFile = objFSO.OpenTextFile("C:\FSO\ScriptLog.txt", 1) Do Until objFile.AtEndOfStream Redim Preserve arrFileLines(i) arrFileLines(i) = objFile.ReadLine i = i + 1 Loop objFile.Close For l = Ubound(arrFileLines) to LBound(arrFileLines) Step -1 Wscript.Echo arrFileLines(l) NextIf the contents of C:\FSO\ScriptLog.txt look like this: 6/19/2002 Success 6/20/2002 Failure 6/21/2002 Failure 6/22/2002 Failure 6/23/2002 Success The following information will be echoed to the screen: 6/23/2002 Success 6/22/2002 Failure 6/21/2002 Failure 6/20/2002 Failure 6/19/2002 Success Reading a Text File Character by Character In a fixed-width text file, fields are delimited by length: Field 1 might consist of the first 15 characters on a line, Field 2 might consist of the next 10 characters, and so on. Thus a fixed-width text file might look like the following: Server Value Status atl-dc-01 19345 OK atl-printserver-02 00042 OK atl-win2kpro-05 00000 Failed In some cases, you might want to retrieve only the values, or only the status information. The value information, to pick one, is easy to identify: Values always begin with the 26th character on a line and extend no more than 5 characters. To retrieve these values, you need to read only the 26th, 27th, 28th, 29th, and 30th characters on each line. The Read method allows you to read only a specified number of characters. Its sole parameter is the number of characters to be read. For example, the following code sample reads the next 7 characters in the text file and stores those 7 characters in the variable strCharacters: strCharacters = objFile.Read(7) By using the Skip and SkipLine methods, you can retrieve selected characters from a text file. For example, the script in Listing 4.41 reads only the sixth character in each line of a text file. To do this, the script must: 1.Skip the first five characters in a line, using Skip(5).2.Read the sixth character, using Read(1).3.Skip to the next line of the file.Listing 4.41 Reading a Fixed-Width Text File 1 2 3 4 5 6 7 8Set objFSO = CreateObject("Scripting.FileSystemObject") Set objFile = objFSO.OpenTextFile("C:\FSO\ScriptLog.txt", 1) Do Until objFile.AtEndOfStream objFile.Skip(5) strCharacters = objFile.Read(1) Wscript.Echo strCharacters objFile.SkipLine LoopTo better illustrate how this script works, suppose the file C:\FSO\ScriptLog.txt looks like the following: XXXXX1XXXXXXXXXXXXXX XXXXX2XXXXXXXXXXXXXXXXXXX XXXXX3XXXXXXXXXXXX XXXXX4XXXXXXXXXXXXXXXXXXXXXXXXX For each line in this file, the first five characters are X's, the sixth character is a number, and the remaining characters are a random number of X's. When the script in Listing 4.41 runs, the script will: 1.Open the text file and begin to read the first line.2.Skip the first five characters.3.Use the Read method to read the sixth character.4.Echo that character to the screen.5.Skip to the next line and repeat the process until all the lines have been read.When the script is run under CScript, the following output appears in the command window: 1 2 3 4 Writing to Text Files Microsoft Windows 2000 Scripting Guide Writing data to a text file is another powerful aid in writing system administration scripts. Text files provide a way for you to permanently save data retrieved by a script; this data can be saved either instead of or in addition to being displayed on the screen. Text files also provide a way for you to keep a log of the actions carried out by a script. This can be especially useful when creating and debugging scripts. By having the script record its actions in a text file, you can later review the log to determine which procedures the script actually carried out and which ones it did not. The FileSystemObject gives you the ability to write data to a text file. To write data using the FSO, a script must do the following: 1.Create an instance of the FileSystemObject.2.Use the OpenTextFile method to open the text file. You can open the text file in one of two ways: For writing (parameter value 2, constant = ForWriting). Files opened in this mode will have new data replace any existing data in its entirety. (That is, existing data will be deleted and the new data added.) Use this mode to replace an existing file with a new set of data. For appending (parameter value 8, constant = ForAppending). Files opened in this mode will have new data appended to the end of the file. Use this mode to add data to an existing file. 3.Use either the Write, WriteLine, or WriteBlankLines method to write to the file.4.Close the text file.The three methods for writing to a text file are shown in Table 4.9. Table 4.9 Write Methods Available to the FileSystemObject MethodDescriptionWriteWrites data to a text file without appending a carriage-return/newline character at the end. For example, this code writes two separate strings to a text file: objFile.Write ("This is line 1.") objFile.Write ("This is line 2.") The resulting text file looks like this: This is line 1.This is line 2.WriteLineWrites data to a text file, appending a carriage-return/newline character at the end of each operation. For example, this code writes two separate strings to a text file: objFile.WriteLine ("This is line 1.") objFile.WriteLine ("This is line 2.") The resulting text file looks like this: This is line 1. This is line 2.WriteBlankLinesWrites a blank line to a text file. For example, this code writes two separate strings to a text file, separating the two with one blank line: objFile.Writeline ("This is line 1.") objFile.WriteBlankLines(1) objFile.Writeline ("This is line 2.") The resulting text file looks like this: This is line 1. This is line 2.In addition to the methods shown in Table 4.9, the VBScript constant VbTab can be useful in writing data to text files. VbTab inserts a tab between characters. To create a tab-separated data file, use code similar to the following: objTextFile.WriteLine(objService.DisplayName & vbTab & objService.State) One weakness with the FileSystemObject is that it cannot be used to directly modify specific lines in a text file; for example, you cannot write code that says, in effect, "Skip down to the fifth line in this file, make a change, and then save the new file." To modify line 5 in a 10-line text file, a script must instead: 1.Read in the entire 10-line file.2.Write lines 1-4 back to the file.3.Write the modified line 5 to the file.4.Write lines 6-10 back to the file.Overwriting Existing Data In system administration, simplicity is often a virtue. For example, suppose you have a script that runs every night, retrieving events from the event logs on your domain controllers, writing those events to a database, and recording which computers were successfully contacted and which ones were not. For historical purposes, you might want to keep track of every success and every failure over the next year. This might be especially useful for a new script just being put into use, or for a network with suspect connectivity or other problems that crop up on a recurring basis. On the other hand, you might simply want to know what happened the last time the script ran. In other words, you do not want a log file that contains data for the past 365 days. Instead, you want a log file that contains only the most recent information. That allows you to open the file and quickly verify whether or not the script ran as expected. When you open a text file in ForWriting mode, any new data you write to the file replaces all the existing data in that file. For example, suppose you have the complete works of Shakespeare stored in a single text file. Suppose you then run a script that opens the file in ForWriting mode and writes the single letter a to the file. After the file has been written and closed, it will consist only of the letter a. All the previously saved data will be gone. The script in Listing 4.42 opens the text file C:\FSO\ScriptLog.txt in ForWriting mode and then writes the current date and time to the file. Each time this script is run, the old date and time are replaced by the new date and time. The text file will never contain more than a single date-time value. Listing 4.42 Overwriting Existing Data 1 2 3 4 5Const ForWriting = 2 Set objFSO = CreateObject("Scripting.FileSystemObject") Set objFile = objFSO.OpenTextFile("C:\FSO\ScriptLog.txt", ForWriting) objFile.Write Now objFile.CloseAppending New Data to Existing Data Some scripts are designed to run at regularly scheduled intervals and then collect and save a specific kind of data. These scripts are often used to analyze trends and to look for usage over time. In these instances, you typically do not want to overwrite existing data with new data. For example, suppose you have a script that monitors processor usage. At any given point in time, processor usage could be anywhere from 0 percent to 100 percent by itself, that single data point is meaningless. To get a complete picture of how much a processor is being utilized, you need to repeatedly measure and record processor usage. If you measure processor use every few seconds and get back data like 99 percent, 17 percent, 92 percent, 90 percent, 79 percent, 88 percent, 91 percent, you can assume processor use is very high. However, this can only be determined by comparing processor use over time. By opening a text file in ForAppending mode, you can ensure that existing data is not overwritten by any new data; instead, that new data is appended to the bottom of the text file. For example, the script in Listing 4.43 opens a text file and writes the current date and time to the file. Because the file is opened for appending, the current date and time is simply added to the bottom of the file. If you run the script several times, you will end up with a text file similar to this: 6/25/2002 8:49:47 AM 6/25/2002 8:49:48 AM 6/25/2002 8:50:33 AM 6/25/2002 8:50:35 AM Listing 4.43 Appending Data to a Text File 1 2 3 4 5Const ForAppending = 8 Set objFSO = CreateObject("Scripting.FileSystemObject") Set objFile = objFSO.OpenTextFile("C:\FSO\ScriptLog.txt", ForAppending) objFile.WriteLine Now objFile.CloseThe script uses the WriteLine method to ensure that each new date and time entry is written to a separate line. If the script used the Write method instead, the entries would run together, and the text file would look like this: 6/25/2002 8:49:47 AM6/25/2002 8:49:48 AM6/25/2002 8:50:33 AM6/25/2002 8:50:35 AM WMI Overview Microsoft Windows 2000 Scripting Guide Windows Management Instrumentation (WMI) makes managing Windows-based computers much more convenient than it has been in the past. WMI provides you with a consistent way to access comprehensive system management information and was designed, from the beginning, to work across networks. For system administrators managing Windows-based computers, understanding WMI is as important and useful as understanding the Active Directory directory service. WMI provides a consistent model of the managed environment. For each manageable resource, there is a corresponding WMI class. You can think of a WMI class as a succinct description of the properties of a managed resource and the actions that WMI can perform to manage that resource. Note What is a managed resource? For the purposes of this chapter, a managed resource is any object computer hardware, computer software, a service, a user account, and so on that can be managed by using WMI.Consider how you had to manage and monitor Windows-based workstations and servers in the past. You had to use a number of different administrative tools to administer various resources, including disk drives, event logs, files, folders, file systems, networking components, operating system settings, performance data, printers, processes, registry settings, security, services, shares, users, and groups. With WMI, instead of learning how to use all of these different administrative tools, you need to learn only how to write scripts that use the WMI scripting library. The scripting library lets you work with WMI classes that correspond to managed resources. After you understand this model and how to make use of it, you can apply what you have learned to manage any resource that has a corresponding WMI class. This is one of the primary benefits of using WMI: You can use the same approach to manage resources as disparate as disk drives, event logs, and installed software. WMI conforms to industry standards overseen by the Distributed Management Task Force (DMTF). The DMTF is an industry organization that works with key technology vendors, including Microsoft, as well as affiliated standards groups to define interoperable management solutions. The architecture of WMI is based on ideas described in the DMTF Web-Based Enterprise Management (WBEM) initiative. WMI was originally released in 1998 as an add-on component with Microsoft Windows NT 4.0 with Service Pack 4. WMI is now an integral part of the Windows family of operating systems, including Microsoft Windows 2000 and Microsoft Windows XP. Capabilities of WMI Using Windows Script Host (WSH) and Microsoft Visual Basic Scripting Edition (VBScript), Microsoft JScript, or any scripting language that supports COM Automation (for example, ActivePerl from ActiveState Corporation), you can write WMI scripts that automate the management of the following aspects of your enterprise: Computers based on Windows XP Professional and Windows 2000 You can write scripts to manage event logs, file systems, printers, processes, registry settings, scheduled tasks, security, services, shared folders, and numerous other operating system components and configuration settings.Networks You can create WMI-based scripts to manage network services such as Domain Name System (DNS), client-side network settings (for example, configuring a computer to use a static IP address or to obtain an IP address from a Dynamic Host Configuration Protocol [DHCP] server), and Simple Network Management Protocol (SNMP)-enabled devices.Real-time health monitoring You can write scripts that use WMI event subscriptions to monitor and respond to the creation of event log entries, modifications to the file system or the registry, and other real-time operating system changes. Conceptually, event subscriptions and notifications perform the same function in WMI as traps do in SNMP.Microsoft Windows Server System applications You can write scripts to manage Microsoft Application Center, Operations Manager, Systems Management Server, Exchange Server, and SQL Server.In some cases, the capabilities found in WMI replicate capabilities found in command-line tools or GUI applications. In other cases, however, WMI provides management capabilities not readily available anywhere else. For example, before WMI the seemingly trivial task of retrieving the total amount of physical memory installed in a remote Windows-based computer could not be scripted, at least not without using a third-party tool. In fact, prior to WMI the only operating system tool that enabled you to determine the amount of memory installed in a computer was the System Properties dialog box. Although this approach works fine for manually retrieving the memory configuration on the local computer, it cannot be used to automatically retrieve the memory configuration, or to obtain memory information from a remote computer. Using WMI, however, you can retrieve the amount of physical memory installed on any computer (or at least any computer you have administrator rights to) by using the simple WMI script in Listing 6.1. Note Admittedly, the script might not look all that simple at first glance. As you will discover, however, much of the script is boilerplate code that can be used, unchanged, in any WMI script that retrieves information about a managed resource.Listing 6.1 Retrieving and Displaying Total Physical Memory 1 2 3 4 5 6 7 8 9 10strComputer = "." Set objSWbemServices = GetObject("winmgmts:\\" & strComputer) Set colSWbemObjectSet = _ objSWbemServices.InstancesOf("Win32_LogicalMemoryConfiguration") For Each objSWbemObject In colSWbemObjectSet Wscript.Echo "Total Physical Memory (kb): " & _ objSWbemObject.TotalPhysicalMemory NextIf you run this script under CScript, you should see the number of kilobytes of physical memory installed on the target computer displayed in the command window. The following is typical output from the script: Total Physical Memory (kb): 261676 So how did the script determine the amount of memory installed on the computer? If you look at the boldfaced items in the code, you will see that the script performed two tasks: 1.It connected to a WMI class named Win32_LogicalMemoryConfiguration. WMI classes represent the managed resources on a computer. As the name implies, Win32_LogicalMemoryConfiguration allows you to retrieve information about the memory configuration on a computer.2.It echoed the value of a property named TotalPhysicalMemory. WMI classes which are typically virtual representations of real, live items have properties that mimic the properties of the real, live item. By looking at the memory configuration on a computer, you can determine the total amount of memory installed. Likewise, the Win32_LogicalMemoryConfiguration class has a property that can be used to determine the total amount of memory installed on a computer. The properties of a WMI class are typically the same as the properties of the actual item. Disk drives have properties such as heads, sectors, and cylinders. The Win32_DiskDrive class has properties such as TotalHeads, TotalSectors, and TotalCylinders.In addition to physical memory, Windows-based computers also support the concept of virtual memory. Not too surprisingly, the Win32_LogicalMemoryConfiguration class also has a property that corresponds to the virtual memory on a computer: TotalVirtualMemory. If you want to know the total amount of virtual memory on a computer, you can use the script shown in Listing 6.2. The single item in boldface (the property name) is the only real difference between this script and the script that returned the total physical memory installed on a computer. (The script also echoes the phrase, "Total Virtual Memory (kb)" as opposed to "Total Physical Memory (kb).") Listing 6.2 Retrieving and Displaying Total Virtual Memory 1 2 3 4 5 6 7 8 9 10strComputer = "." Set objSWbemServices = GetObject("winmgmts:\\" & strComputer) Set colSWbemObjectSet = _ objSWbemServices.InstancesOf("Win32_LogicalMemoryConfiguration") For Each objSWbemObject In colSWbemObjectSet Wscript.Echo "Total Virtual Memory (kb): " & _ objSWbemObject.TotalVirtualMemory NextOf course, WMI can be used to do more than just return information about the memory configuration on a computer, For example, the script in Listing 6.3 retrieves and displays the name, state, and startup type for all of the services installed on a computer. Listing 6.3 Retrieving and Displaying Information About Services 1 2 3 4 5 6 7 8 9 10strComputer = "." Set objSWbemServices = GetObject("winmgmts:\\" & strComputer) Set colSWbemObjectSet = objSWbemServices.InstancesOf("Win32_Service") For Each objSWbemObject In colSWbemObjectSet Wscript.Echo "Display Name: " & objSWbemObject.DisplayName & vbCrLf & _ " State: " & objSWbemObject.State & vbCrLf & _ " Start Mode: " & objSWbemObject.StartMode NextRunning this script under CScript produces output similar to the following (only partial output is shown): Display Name: MSSQLServerADHelper State: Stopped Start Mode: Manual Display Name: Network DDE State: Stopped Start Mode: Disabled Display Name: Network DDE DSDM State: Stopped Start Mode: Disabled Display Name: Net Logon State: Running Start Mode: Auto If you look closely at the script in Listing 6.3, you should notice two things: 1.Instead of using the class Win32_LogicalMemoryConfiguration, this script uses a class named Win32_Service. Why? Because it is returning information about services, not about memory configuration. If the script was returning information about a computer monitor, it would use the class Win32_DesktopMonitor. The class name will always change to reflect the managed resource.2.The properties echoed in this script differ from the properties echoed in the previous scripts. Why? Because services have properties that differ from memory configuration properties. Services have properties such as display name and start mode; memory does not. The properties will always change to reflect the managed resource.If you are beginning to detect a pattern here, you have already taken a big step toward learning how to write WMI scripts. WMI scripts that retrieve information about managed resources are almost identical; you can take a basic script template, type the appropriate class name and class properties, and retrieve information for nearly all managed resources. (In fact, a template that lets you do this is provided later in this chapter.) As you will see throughout this chapter, WMI scripts typically involve three steps: 1.They connect to the WMI service.2.They retrieve some information about WMI classes.3.They do something with that information (for example, echo it to the screen).To a large extent, all WMI scripts follow this same pattern. For example, suppose you want to write a script to retrieve and display records from the Windows event logs. Reusing some of the code from Listing 6.1, you can easily create a script that carries out this task, as demonstrated in Listing 6.4. In this listing, the starting point for each of the three steps of a typical WMI script is denoted by the boldfaced numerals 1, 2, and 3: 1) Connect to the WMI service; 2) retrieve information; 3) display that information. Note Before you run Listing 6.4, be aware that this script can take a long time to run if your event logs contain thousands of records.Listing 6.4 Retrieving and Displaying Windows Event Log Records 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17strComputer = "." Set objSWbemServices = GetObject("winmgmts:\\" & strComputer) Set colSWbemObjectSet = objSWbemServices.InstancesOf("Win32_NTLogEvent") For Each objSWbemObject In colSWbemObjectSet Wscript.Echo "Log File: " & objSWbemObject.LogFile & vbCrLf & _ "Record Number: " & objSWbemObject.RecordNumber & vbCrLf & _ "Type: " & objSWbemObject.Type & vbCrLf & _ "Time Generated: " & objSWbemObject.TimeGenerated & vbCrLf & _ "Source: " & objSWbemObject.SourceName & vbCrLf & _ "Category: " & objSWbemObject.Category & vbCrLf & _ "Category String: " & objSWbemObject.CategoryString & vbCrLf & _ "Event: " & objSWbemObject.EventCode & vbCrLf & _ "User: " & objSWbemObject.User & vbCrLf & _ "Computer: " & objSWbemObject.ComputerName & vbCrLf & _ "Message: " & objSWbemObject.Message & vbCrLf Next   SU=>@fgT hl+/fq !##%%%%&]&^&`&&&''8(](+,55 5 55555e66-7J7778888<=z>>\BBBBCC hTPV0JjhTPVUhTPVCJOJQJaJ hTPV5\hTPVCJaJhTPVB*CJaJph hTPV6]hTPVK 4: G p  SUD%6tD%yD%[D%6tD%yD%5 D%jhD%[D%jhD%f+;y*;f+;yRkd$$If0f62 2x34a$If$If =>@f*;f+;yM*;f+;yRkd$$If0f62 2x34a$If$IfRkds$$If0f62 2x34afgT 11b*;D%yD%jhD%5 D%D%D%yD%[D%jhD%jhD%5 D%D%yD%D%D%D%D%y -DM RkdY$$If0f62 2x34a !### %%%%%&]&D%kD%D%[D%D%D%jhD%f+;f$f+;f$yRkd$$If0fD%62 2x34a$If$If -DM  ]&^&`&&&&'''*;f+;f$yM*;AD%AD%AD% -DM Rkd$$If0fD%62 2x34a$If$IfRkd?$$If0fD%62 2x34a''8(^(|*+,K,m,,,,--/1}335 5 55D%jhD%yD%[D%5 D%D%D%D%D%D%D%D%<D%[D%D%[D%<D%5 D%yf+;f$$If$If -DM 55e6x666-7J7R8c889;<<<<4=`=D%D%D%D%D%yD%D%D%6tD%yD%jhD%[D%jhD%D%D%D%D% -DM Rkd%$$If0fD%62 2x34a`=====i???@\BBCCCEEF~HHH@JD%D%D%D%D%5 D%6tD%yD%jhD%[D%yD%D%FD%<D%[D%D%D%D%yf+;f$5 $If$If -DM CCCCCCCCCDDEF~HHHHII@JAJKKK L L+L,LILJLhLiL1M5M6M8MMMOxOUVXXiXjX}X~XXX^^^^4_5_``aaabbcccddJfsf믷뷿뷿hTPVB*phhTPVCJaJhTPVB*CJaJph hTPV5\hTPVCJOJQJaJ hTPV6] hTPV0JhTPVjhTPVUjhTPVUE@JAJKKKK L5 D%5 D%y w 6 $IfRkdI$$If0fD%62 2x34a L LL"L+LTN yNw yN6 y$IfkdJ$$If4F 0u# 06    34ap+L,L0LALIL{xu yuw yu6 y$IfkdK$$IfF 0u#06    34aILJLOL]LhLVxP yPw yP6 y$IfkdK$$IfF 0u# 06    34aphLiL1M6M8MM{xwD%8uD%yof+;if$$If$IfkdL$$IfF 0u#06    34aMMOSOxOOOQRWTUUVXXXXXYD%5 D%D%D%D%<D%[D%jhD%5 D%5 D%D%D%D%D%D%D%D%< -DM RkdXM$$If0fD%62 2x34aYZr\^^^4_5_A_$```aD%jhD%D%5 D%yf+;f$jhihD%<D%jhD%f+;f$jhRkdM$$If0fD%62 2x34a$If$If aaabbccihf+;f$jhMihf+;f$RkdN$$If0fD%62 2x34a$If$IfRkd>N$$If0fD%62 2x34accd9ddJfBhYhphyhhhijjjlD%6tD%yD%D%5 D%[D%D%D%D%D%D%jhD%D%yf+;f$[$If$If -DM Rkd$O$$If0fD%62 2x34asfgggBhhiijjjjllno o!ooooooppppppzz|{}{{||||U}f}g}h}j}}}}}}} 3l݂ނ45qrABhiƾƵhTPVB*phhTPVCJaJy(j PhTPVUjhTPVUhTPVCJaJhTPVB*CJaJph hTPV5\hTPVCJOJQJaJ hTPV6]hTPVDllllwnn ooos,uv+xxxxzz|{ZD%6tD%yD%[D%D%yD%&VD%yD%kD%D%5 D%5 D%yD%6tD%yD%[f+;f$jh$If$IfRkdO$$If0fD%62 2x34a|{}{{||||U}g}ihf+;f$jhMihKD%yf+;mymyRkdu$$If0fD%62 2x34a$If$IfRkdZu$$If0fD%62 2x34ag}h}j}}}}}f+;mymymyMihKD%[ID%<Rkdv$$If0fK62 2x34a$If$IfRkd@v$$If0fK62 2x34a 4lނD%jhD%jhD%yD%yD%yD%yD%ygjdy$Ifkd&w$$If40u# 0634ap$If 459qg5 gyWygjhg$Ifpkdw$$If0u#0634a$Ifqr}φ`3tWnyhg5 hgyhgyhgyhgyhgyhgjhhgjh$If$Ifkdx$$If0u# 0634ap  *g$Ifpkdgy$$If0u#0634aAtnyng$Ifkdz$$If0u# 0634apABIhyg5 $Ifpkdz$$If0u#0634ahir<t5 nyhgyhg[$If$Ifkdp{$$If0u# 0634api<=EOQRyzASY][\wx CUVjkg %PT} VBػ|}~оWZһjhTPVUhTPVCJaJy( hTPV0JjhTPVU hTPV6]hTPVCJOJQJaJ hTPV5\hTPVCJaJhTPVI<=AۍQyggyg$If$IfpkdA|$$If0u#0634aQRYytTnyng5 $Ifkd|$$If0u# 0634apyz~5 yg$Ifpkd}$$If0u#0634atnyng5 $IfkdJ~$$If0u# 0634apGcsA]Jl5 D%<D%[D%jhD%[D%5 |D%D%|D%D%y|D%D%zD%6tD%y -DM pkd$$If0u#0634aěq7iҠ6_ g} 4QV]NZME1D%jhD%LD%5 D%D%D%D%D%D%D%6tD%yD%D%jhD%[D%jhD%jhD%yD%D%D%D%jhD%[D%6tD%yD%D%[D%jh -DM 1(BlZػ1оD%5 D%D%D%D%5 D%5 D%D%kD%yD%jhD%5 D%5 D%jhD%yD%e0D%FD%<D%5 D%D%jhD%<D%5 D%jhD%yK $If -DM  DEst()rst 2TUVYZop0?U89QRSXYnooZ̪̾̾jhTPVUhTPVCJOJQJaJ hTPV0JjhTPVUjhTPVU hTPV5\ hTPV6]hTPVCJaJy(hTPVhTPVCJaJhTPVB*phC rlK yly$Ifkd$$If40K u# 0634ap (DxK yy$Ifpkdk$$If0K u#0634aDEistxnK ny$Ifkd$$If0K u# 0634apstK yy$Ifpkd$$If0K u#0634a(txnK yn$Ifkdt$$If0K u# 0634ap()9rK yy$IfpkdE$$If0K u#0634arsX2UtxrD%kpD%ypD%5 pD%nD%<pD%pD%ypD%[pD%5 pD%ylD%jkd$$If0K u# 0634ap q0 ?V8D%FD%8D%D%D%yD%yD%yD%yD%jhD%y""$-DIfM  -DM 89Rp/w$oD%$ D%yD%d5 D%FD%8wD%wD%wD%wD%uD%<D%jhD%5  -DM rkdA$$If40u#0634a o?ZA)RH=D%D%D%<D%[D%D%D%jhD%D%D%[D%5 D%jhD%kD%yD%[D%[D%jhD%y{"$-DIfM  -DM ZAw789:;<exIdi)*MNORShi235ʮʮhTPVB*CJaJphjIhTPVUj}hTPVUhTPVCJaJ hTPV5\hTPVCJaJy( hTPV0JjhTPVUhTPVhTPVCJOJQJaJDw;.exIdD% D%yD%,D%FD%<D%jhD%5 D%[sD%D%sD%D%y -DM rkd$$If40{u#0634a i)*D%D%yD%D%5 D%y"""n rkdFI$$If40u#0634a$-DIfM  -DM *NjBD%8D%D%D%D%jhD%yD% D%FD%nD%jhD%<D%5 D%f+;f$y$If$If -DM 235*;f+;f$yM*;f+;f$Rkdd$$If0fD%62 2x34a$If$IfRkdnd$$If0fD%62 2x34aRkr~D%<D%D%yX$IfRkdTe$$If0fD%62 2x34aRjk~EF~5pu e    ) *   %&67PQXYgU]  #!>!?!@!!!hTPVCJaJy( hTPV0JjhTPVUhTPVCJOJQJaJhTPVB*ph hTPV5\hTPVhTPVCJaJI~rlXyfffy$If$Ifkde$$If40Xu# 0634apZTXyjhy$If$Ifpkdf$$If0Xu#0634autnXyhjhhhjhhy$If$Ifkd7g$$If0Xu# 0634ap99D%8D%yw8w8w8w8w8w8w8w8w8w8$-DIfM pkdh$$If0Xu#0634a -Le 5EF~."."."."."."."."."."|'xD%3krkdh$$If408u#0634a$-DIfM ~5;DFOYpu * e    ) D%D%D%D%D%D%D%D%D%D%D%<D%jhD%D%5 D%D%D%D%yh$If -DM ) * /  :  rlhyfjhff$If$IfkdCi$$If40hu# 0634ap     7RPEhyjhyy$If$Ifpkdj$$If0hu#0634aPQYt69nhyn$Ifkdj$$If0hu# 0634apxXhyjh$If$Ifpkdk$$If0hu#0634aXYbtEnhyn$Ifkd l$$If0hu# 0634aphy5 $Ifpkdl$$If0hu#0634a$t5 nhynjh$Ifkdm$$If0hu# 0634apEHgihD%3ky{#jhj#$-DIfM $If $$Ifa$pkd^n$$If0hu#0634a ga y#jh#yB5 @D%[@D%yWkdzo$$If0^D%"622234a$If $$Ifa$Wkdn$$If0^D%"622234a Fjk#"""""|xD%3krkdo$$If40u#0634a$-DIfM #?m7!?!![""1$%&&:(z((t))2*D%D%D%D%D%D%BD%yD%5 D%D%jhD%[D%5 D%yD%e0D%FD%<D%[D%[D%D%D%5 D%D%yD%D%yD%+ -DM !!!!!C"D"Y"Z"&&:(z(t)))).*/*0*1*2*3*****/-2---11111(2)2+2|2}23333+4544 5 556667J7N7O7Q799 99:4;;=>>믷믷hTPVCJaJhTPVB*CJaJph hTPV6]jyhTPVU hTPV5\hTPVCJOJQJaJ hTPV0JhTPVjhTPVUjphTPVUD2**+--0R111111(2D%FD%$ D%[D%D%LD%D%yf+;y*;f+;yRkd$$If0f62 2x34a$If$If -DM  (2)2+2|2}2233+4*;f+;yM*;KD%<ID%jhID%yID%yRkd$$If0f62 2x34a$If$IfRkd($$If0f62 2x34a+44 566J7O7Q79999:4;[;;;D%D%yD%jhD%jhD%yD%yf+;f$[ZD%D%yD%D%jhD%D%D% -DM Rkd$$If0fD%62 2x34a$If$If;==>#>)>*>,>6>D%D%yD%yLjdydLy$Ifkd$$If40u# 0634ap$If>)>*>6>7>K>L>S>T>BCDD7>9>K>xyLy$IfpkdU$$If0u#0634aK>L>N>S>txnynLy$Ifkd$$If0u# 0634apS>T>?@BBBBCQDDD>>>>>>>>>>>>>>>>>>("("("("("$-DIfM aaab(b/b^b_bbbbb"c)cTc("("("("("("("("("("("("("("$-DIfM TcUc|c0egiggZh\hhzKD%<D%[D%[{D%yD%<D%sf+;mey$If$If -DM rkd! $$If40>u#0634a hhhhhhjlm*;f+;eyM*;KD%yKD%[KD%[KD%jhRkd3 $$If0fC62 2x34a$If$IfRkd $$If0fC62 2x34ammmmmmmmmmmnBnnnnnoooD%y"""""""""$-DIfM ooo`pbpq#D%8D%f+;{f$$If$Ifrkd $$If40u#0634aqqqqqrNrzrf+;f$MKD%yKD%yKD%yRkd $$If0fD%62 2x34a$If$IfRkdE $$If0fD%62 2x34aqqqqrMrzrrst1t^t-u^uyyG{I{|||~~P~Q~deـ/>kۅ܅ޅ*+Ɋʊ̊RSUfg+`a  TڒoFyz˞̞ hTPV6]hTPVCJOJQJaJ hTPV5\hTPVCJaJhTPVhTPVB*CJaJphMzrrsst1t^t-u_uwyyG{I{|||D%D%D%yD%yD%yD%D%D%yD%D%[D%D%5 f+;f$5 5 f+;Rkd+ $$If0fD%62 2x34a$If$If -DM ||~~Q~S~U~W~Y~[~]~_~a~c~f~i~l~o~f$yf$jh5 D%y$-DIfM Rkd $$If0fD%62 2x34a$Ifo~r~~~~~8F O]dK"K"K"K"K"K"K"K"K"K"K"K"K"K"$-DIfM deڀ/?kǃ7D%3kD%yD%y{D%D%D%yD%yD%y{D%{D%D%jhyD%6tD%y -DM rkd $$If40u#0634a߄ۅ܅ޅD%jhD%f+;y*;f+;yK*;Rkd#$$If0f62 2x34aRkd $$If0f62 2x34a$If$If*+<fBEɊf+;y*;D%<D%jhD%[D%jhD%yf+;f$yRkd$$If0f62 2x34a$If$If Ɋʊ̊RSUf*;f+;f$Mf+;f$jhRkd|$$If0fD%62 2x34a$If$IfRkd $$If0fD%62 2x34afg+acegikmoqsvy|ihD%D%yn"n"$-DIfM Rkd$$If0fD%62 2x34a:_}  n"n"n"n"n"n"n"n"n"n"|/xD%3krf+;$Ifrkdb$$If40u#0634a$-DIfM !2CToD%<D%D%D%D%D%D%[D%[D%D%D%D%D%D%D% -DM Rkd$$If0fD%62 2x34a$Ifї˘ۜFz|~˞D%D%D%D%D%D%<D%D%jhD%[D%jhD%5 D%yb"b"b"$-DIfM  -DM ˞̞ٟ D%kD%yD%D%y Z$Ifrkdt$$If40u#0634a̞ٟ͞tuƠǠǢڢܢݢ()ΤAJNOQwx JKɬ"&')ɲʲDEFGHIŷƷ۷ܷm򴬴򴦴 hTPV0JjOhTPVUjhTPVUhTPVB*CJaJphhTPVCJOJQJaJhTPVCJaJhTPVB*ph hTPV5\ hTPV6]hTPVhTPVCJaJy(A#trl ylZy$Ifkd$$If40 u# 0634aptuƠx yZy$Ifpkd$$If0 u#0634aƠǠϠtxn ynZy$Ifkd$$If0 u# 0634ap-x yZ5 Z$If$IfpkdT$$If0 u#0634aܢtn ynZy$Ifkd$$If0 u# 0634apܢݢ(x yZy$Ifpkd$$If0 u#0634a().txn ynZ$Ifkd]$$If0 u# 0634apΤ):AJOQwD%$ ~D%~D%~D%~D%|D%5 |D%5 |D%yvf+;pf$jh$If$If -DM pkd.$$If0 u#0634a wx;u KMOQSUWYihD%D%D%D%D%D%D%y"$-DIfM -DM Rkd$$If0fD%62 2x34aƫDrɬ &""""""|xD%3klD%lD%lD%lD% -DM rkd=$$If40u#0634a$-DIfM &@k#"')ɲʲ 0YJD%D%D%D%6tD%yD%D%jhD%jhD%yf+;f$D%5 D%6tD%yD%jhRkd$$If0fD%62 2x34a$If$If -DM JXHݷmD%jhD%yD%yD%BD%FD%<D%D%D%<D%jhD%y$If -DM  /0\]ͺκ*+fg»GJwnNPz{}./ OPqr\]PQ$%|}@A?hTPVB*CJaJphhTPVCJOJQJaJ hTPV6] hTPV5\hTPVCJaJhTPVB*phhTPVN%/rlyly$Ifkd$$If40u# 0634ap/0M\xyy$Ifpkdҋ$$If0u#0634a\]ttxnyny$Ifkdn$$If0u# 0634apͺxyy$Ifpkd?$$If0u#0634aͺκtxnyny$Ifkdۍ$$If0u# 0634ap *xyy$Ifpkd$$If0u#0634a*+Pftxnyny$IfkdH$$If0u# 0634apfgxyy$Ifpkd$$If0u#0634atxnyny$Ifkd$$If0u# 0634ap»ӻ v8;xD%6tD%yD%D%5 D%5 D%jhD%LD%5 D%5 D%<D%jhD%jhD%jhD%5 pkd$$If0u#0634a;w k>NY^pnJrND%jhD%D%D%D%D%D%D%D%D%D%D%D%D%D%D%D%[D%D%D%D%D%D%D%D%D%D% -DM NPz{}.f+;f+;f$Mf+;f$Rkd$$If0fD%62 2x34aRkd"$$If0fD%62 2x34a$If$If./@ PXqD%<D%5 D%5 D%y $IfRkd$$If0fD%62 2x34aqrtrlyl y$Ifkd{$$If40u# 0634apxy jh$IfpkdO$$If0u#0634atihnyn y$Ifkd$$If0u# 0634apxy y$Ifpkd$$If0u#0634a\txnyn y$IfkdX$$If0u# 0634ap\]_xy y$Ifpkd)$$If0u#0634atxnyn jh$Ifkdŗ$$If0u# 0634apihy y$Ifpkd$$If0u#0634aPtxnyn y$Ifkd2$$If0u# 0634apPQS$xy jh$Ifpkd$$If0u#0634a$%(|tihnyn y$Ifkd$$If0u# 0634ap|}SxD% D%ywwww"w"w"$-DIfM pkdp$$If0u#0634a @ D%3kf+;}f$$If$Ifrkd $$If40u#0634a@A?t(D%D%[D%D%D%D%D%yf+;f$5 $If$If -DM Rkd$$If0fD%62 2x34a ()suLY|#  ABCVY-]BFh@A]dA6 X z {     ƾhTPVB*phjwhTPVUjhTPVUhTPVCJOJQJaJ hTPV6]hTPVCJaJhTPVB*CJaJphhTPV hTPV5\H()D8:su5 D%<D%[D%jhD%jhf+;AyI*;Rkd$$If0f62 2x34a$If$IfRkd$$If0fD%62 2x34aL/Y|f+;Ay*;D%5 D%5 D%jhD%D%D%yD%D%D%5 D%D%D%D% -DM Rkd$$If0f62 2x34a$If$If|# B B-]h@D%D%D%<D%jhD%D%jhD%D%D%D%yD%1D%D%D%D%D%D%D%yy#y$If $$Ifa$ -DM @ADxy#By#Wkd$$If0^D%"622234a$If $$Ifa$Wkd6$$If0^D%"622234a4DD%<D%5 D%5 D%yK"K"$-DIfM Wkd6$$If0^D%"622234aDEqK"K"K"K"K"K"K"K"|'xD%8vD%jhvD%yvD%rkd$$If40u#0634a$-DIfM /YAUlt. 6  X {   D%yD%D%D%D%D%D%D%yD%D%yD%6tD%yD%[D%5 D%D%D%jhD%yD%y$If -DM     rlyly$IfkdU$$If40u# 0634ap    xyy$Ifpkd)$$If0u#0634a   t u \ ^ b c e j k m s t b c   )*+-VWST01efQR !M!N!!!!!l$$$$$$$:%hTPVB*ph hTPV0JjhTPVUhTPVCJOJQJaJ hTPV5\hTPVB*CJaJphhTPVCJaJhTPVK  ' t txnyny$IfkdŰ$$If0u# 0634apt u | \ ^ b xyjhzf+;ry$IfK$$IfK$$If$Ifpkd$$If0u#0634ab c e j k m s *;f+;yG*;f+;yTkd$IfK$L$0f62 2x34a$IfK$$IfK$Tkd2$IfK$L$0f62 2x34as t   b *;y$IfTkd$IfK$L$0f62 2x34ab c p  t= nyn$Ifkd$$If0u# 0634ap   zy$If$Ifpkde$$If0u#0634at5 nyn$Ifkd$$If0u# 0634apyy$Ifpkdҵ$$If0u#0634a"%txpD%<nD%yey_#5 $If $$Ifa$kdn$$If0u# 0634ap)5 y#yBxy#Wkd$$If0^D%"622234a$If $$Ifa$Wkd?$$If0^D%"622234a)*-WY[]_aceg.oD%jhD%yyyyyyyyy""""""$-DIfM Wkd?$$If0^D%"622234a xS""|xD%8vD%yvD%yvD%yvD%ypf+;jf$5 $If$Ifrkd$$If40yu#0634a$-DIfM STk0145 D%<D%yy#ByWkdѹ$$If0^D%"622234a$If $$Ifa$Rkd^$$If0fD%62 2x34a4efi#yxy#yBx@D%jh@D%yWkdѺ$$If0^D%"622234a $$Ifa$WkdQ$$If0^D%"622234a$If6{{{{{"""""|xD%<vD%jhrkdQ$$If40{u#0634a$-DIfM RTVXZ\^`bd@BD%yyyyyyyyyy"""""""""$-DIfM  @ x y    !!!"#D%<D%{D%{D%{D%{D%{D%{D%{D%{D%D%yyD%6tD%y -DM rkd$$If40yu#0634a"{#l$$$$$$$D%5 D%jhD%y"Djd"ydDy$Ifkd$$If40"u# 0634ap$If$$%:%x"yDy$Ifpkdc$$If0"u#0634a:%;%L%%txn"ynDy$Ifkd$$If0"u# 0634ap:%;%%%%%&&Q&R&v&w&&&&&&&&'''''''O(P(((7);)<)>)**+++,,--////0001222a3c3333444444=4>496~66667777&8'888;;; < <"<hTPVB*phhTPVCJOJQJaJhTPVB*CJaJph hTPV5\hTPVhTPVCJaJQ%%%%x"yDy$Ifpkdо$$If0"u#0634a%%%&txn"ynDy$Ifkdl$$If0"u# 0634ap&& &Q&x"yDy$Ifpkd=$$If0"u#0634aQ&R&X&v&txn"ynDy$Ifkd$$If0"u# 0634apv&w&&&x"yDy$Ifpkd$$If0"u#0634a&&&&txn"ynDy$IfkdF$$If0"u# 0634ap&&&&x"yDy$Ifpkd$$If0"u#0634a&&&&'txn"ynDy$Ifkd$$If0"u# 0634ap&'''.''x"yD$Ifpkd$$If0"u#0634a''''tn"ynDy$Ifkd $$If0"u# 0634ap'''O(x"yD$Ifpkd$$If0"u#0634aO(P(Z((tn"ynDy$Ifkd$$If0"u# 0634ap((7)<)>)*xD%8D%yf+;|f$5 $If$Ifpkd^$$If0"u#0634a**++++++,M,,5 D%<D%D%y"""$-DIfM Rkd$$If0fD%62 2x34a ,,,-/000000000 D%<D%jhD%[D%D%yvvvvvvv$-DIfM rkdm$$If40u#0634a 0001G1~11111 21222H2"""""""""|#zD%6trkd $$If40u#0634a$-DIfM H2q2a3c333344D%yD%jhf+;y*;f+;yK*;Rkd$$If0f62 2x34aRkd$$If0f62 2x34a$If$If44444=4>455f+;y*;f+;yM*;KD%KD%Rkd$$If0f62 2x34aRkd$$If0f62 2x34a$If$If596666666 7D%yD%y "LFyF jh$Ifkdw$$If4FDu# 06    34ap$If 777#7r77"yuihykdo$$IfFDu#06    34a$If777 8&8VPyP P"y$Ifkd$$IfFDu# 06    34ap&8'8/8q88{uyu u"y$Ifkd$$IfFDu#06    34a8899^;;;;;VRD%$ PD%<ND%5 ND%yND%yH HW$Ifkd$$IfFDu# 06    34ap;;; <%xi$If < <kd$$If4r 6[K# 20634ap2 <"<<<6=8=9= yWy%yxyxy $$Ifa$$If"<#<<<<<<<2=3=4=5=9=:=Q=R=======a>b>c>d>h>i>~>>???? ? ?????????+@,@-@.@1@2@@@@@@@@@VAWAXAYA\A]AAjhTPVUjhTPVUjhTPVUjehTPVUjhTPVUjhTPVUjhTPVUhTPVCJaJjhTPVUjhTPVUhTPVjhTPVU@9=:=Q===e>g>Bx< y<Wy<%y<xy<xy$Ifkd<$$Ifֈ 6[K#u#0634ag>h>i>~>? ????x yWy%yxyxy$IfFf $$Ifa$???/@1@@@Bx< y<Wy<%y<xy<xy$Ifkd $$Ifֈ 6[K#u#0634a@@@@ZA\AAAAx yWy%yxyxy$IfFf $$Ifa$AAAAAAAAqBrBsBtBwBxBBBBBCC C CCCCCCCDDDD D!DDDDDDDDD>E?E@EAEEEFESETEEEEEEEEEjFkFlFmFnFoFFjhTPVUj*hTPVUjhTPVUjhTPVUjhTPVUj\hTPVUjQhTPVUjhTPVUhTPVCJaJhTPVj3hTPVUjhTPVU@AAAuBwBCCBx< y<Wy<%y<xy<xy$Ifkd$$Ifֈ 6[K#u#0634aCCC CCC DDDx yWy%yxyxy$IfFfW $$Ifa$DDDDDBEDEBx< y<Wy<%y<xy<xy$IfkdK$$Ifֈ 6[K#u#0634aDEEEFEOEQESEEEEx yWy%yxyxy$IfFf% $$Ifa$EEEnFFG HBx< y<Wy<%y<xy<xy$Ifkd$$Ifֈ 6[K#u#0634aFFFFFF|G}G~GGGGHHHH H HHHHHHHHH#I$I%I&I*I+I6I7IIIIIIIDJEJFJGJIJJJZJ[JJJJJJJJJ{K|K}K~KKKKKLjhTPVUjkhTPVUj`hTPVUj hTPVUjB hTPVUjhTPVUhTPVCJaJjhTPVUjhTPVUhTPVjHhTPVUjhTPVU@ H H HHHH'I)I*Ix yWy%yxyxy$IfFf $$Ifa$*I+I2I4I6IIHJBx< y<Wy<%y<xy<xy$Ifkd $$Ifֈ 6[K#u#0634aHJIJJJVJXJZJJJJx yWy%yxyxy$IfFff $$Ifa$JJJJJKKBx< y<Wy<%y<xy<xy$Ifkd$$Ifֈ 6[K#u#0634aKKKKLLL'M(Mx yWy%yxyxy$IfFf $$Ifa$LLLLLLLLLLLL#M$M%M&M(M)M0M1MMMMMMM>N?N@NANBNCNNNNNNNNNXOYOZO[O\O]OOOOOOOjPkPlPmPoPpPQQeRR hTPV5\jQ,hTPVUj*hTPVUj)hTPVUj#hTPVUjW"hTPVUj hTPVUhTPVCJaJj9hTPVUjhTPVUhTPVjhTPVUjhTPVU=(M)M.M0MMBNNBx< y<Wy<%y<xy<xy$Ifkd$$Ifֈ 6[K#u#0634aNNNNN\OOnPoPx yWy%yxyxy$IfFf' $$Ifa$oPpPQeRRBx>D% <D%y<D%ykd-$$Ifֈ 6[K#u#0634aRR#T$TTW1ZQZw]]]w^x^xaaaaabbffhhh8i9icjdjj8kllllmmnnnnnnnnnoooo!o"o3o4or6r7rssttoxvxwxyxzzezfzxz hTPV0JjhTPVUhTPVCJaJy(hTPVB*phhTPVB*CJaJph hTPV6] hTPV5\hTPVCJaJhTPVCJOJQJaJhTPVERRRRRRRRR5SgSSSS#T"""""""$-DIfM #T$TTTU_UUV~VVVW5WKXYD%8}D%}D%}D%}D%}D%}D%}D%}D%}D%{D%<yD%jhyD% -DM rkd.$$If40u#0634aY1ZQZ\w]]]]]]] ^L^w^D%jhD%D%D%jhD%y""""$-DIfM -DM  w^x^^_`aaaaaaaa.bD%<D%jhD%jhD%D%yvvvvvv"v"$-DIfM rkdi/$$If40u#0634a .b^bbbbbfdf g+hh9i;i=i"""|xD%<vD%5 vD%vD%vD%jhvD%vD%rkd0$$If40u#0634a$-DIfM =i?iAiCiEiziiii*jcjdjj""""""|xD%3krkd0$$If40u#0634a$-DIfM jjjk8kIkrk7llllmmnnnnD%D%D%D%D%6tD%yD%D%D%yf+;f$D%jhD%y RkdF1$$If0fD%62 2x34a$If$If -DM nnnnrl yly$Ifkd1$$If40 u# 0634apnnnnx yy$Ifpkd2$$If0 u#0634annnotxn yny$Ifkd)3$$If0 u# 0634apoooox yy$Ifpkd3$$If0 u#0634aooo!otxn yny$Ifkd4$$If0 u# 0634ap!o"o%o3ox yy$Ifpkdg5$$If0 u#0634a3o4oqr7r9r;r=r?rArCrtxpD%nnD%nD%y]]]]]]$-DIfM kd6$$If0 u# 0634ap CrErzrrrr!sQssstt!uox"""""""|xD%$ vD%ktD%ytD%krkd6$$If40u#0634a$-DIfM oxwxyxzzz{U}~>D%yf+;f$D%<D%jhD%5 D%5 D%D%D%D%D%yD%jhD%y -DM Rkds7$$If0fD%62 2x34a$If$Ifxzyzzzzz~  ,-STÁՄք,vOPÈĈȈɈˈYЏяҏ؏ hTPV0JbhTPVB*CJaJphhTPVB*ph hTPV5\hTPVCJOJQJaJhTPVCJaJ hTPV6]hTPVjhTPVUH  ,P NHyHP yHy$Ifkd7$$If4FMu# 06    34ap$If,-7>S{xuyuP yuy$Ifkd8$$IfFMu#06    34aST_lVxPyPP yPy$Ifkd9$$IfFMu# 06    34ap{xuyuP yuy$Ifkd}:$$IfFMu#06    34aÁЁVxPyPP yPy$Ifkd';$$IfFMu# 06    34ap{xwD%$ uD%yof+;if$$If$Ifkd<$$IfFMu#06    34aք؄ڄ܄ބ6|D%jhD%y""""""$-DIfM Rkd<$$If0fD%62 2x34a,4MXfjmvPD%8}D%}D%}D%}D%}D%}D%}D%{D%<yD%jhyD%yD%y -DM rkd9=$$If40u#0634a PRTÈĈɈˈ""|xD%3krf+;lmy$If$Ifrkd=$$If40u#0634a$-DIfM 8!*;D%<D%jhD%yD%y""$-DIfM Rkdw>$$If0fK62 2x34a 7`rYD%6tD%yD%jhD%[D%jhD%y }$Ifrkd>$$If40u#0634a яrl yl}YN$Ifkd?$$If40 u# 0634apяҏ؏x y}YN$Ifpkd]@$$If0 u#0634atxn yn}YN$Ifkd@$$If0 u# 0634apx y}YN$IfpkdA$$If0 u#0634a&-./39:;ANOPTZ[\ahijovwxÐ͐ԐՐ֐ސ  -./39:;DIJKST^_efp\ȓjhTPVU hTPV5\hTPVCJOJQJaJ hTPV0JbhTPVCJaJhTPVS&.txn yn}YN$IfkdfB$$If0 u# 0634ap./3:x y}YN$Ifpkd7C$$If0 u#0634a:;AOtxn yn}YN$IfkdC$$If0 u# 0634apOPT[x y}YN$IfpkdD$$If0 u#0634a[\aitxn yn}YN$Ifkd@E$$If0 u# 0634apijowx y}YN$IfpkdF$$If0 u#0634awxtxn yn}YN$IfkdF$$If0 u# 0634apx y}YN$Ifpkd~G$$If0 u#0634atxn yn}YN$IfkdH$$If0 u# 0634apÐ͐Րx y}YN$IfpkdH$$If0 u#0634aՐ֐ސtxn yn}YN$IfkdI$$If0 u# 0634apx y}YN$IfpkdXJ$$If0 u#0634a txn yn}YN$IfkdJ$$If0 u# 0634ap .x y}YN$IfpkdK$$If0 u#0634a./3:txn yn}YN$IfkdaL$$If0 u# 0634ap:;DJx y}YN$Ifpkd2M$$If0 u#0634aJKQStxn yn}y$IfkdM$$If0 u# 0634apST\^x y}y$IfpkdN$$If0 u#0634a^_cetxn yn}y$Ifkd;O$$If0 u# 0634apefpx y}YN$Ifpkd P$$If0 u#0634a&֒38\ȓtxpD%8nD%ybD%bD%bD%bD%bD%bD%bD%nD%y -DM kdP$$If0 u# 0634ap ȓgiD%yD%D%FD%3kf+;f$5 5 D%5 D%yf+;f$yRkdg$$If0fD%62 2x34a$If$If ~giߙ6STX7Hn ֩Soʫܫw#$;={|efhTPVCJOJQJaJhTPVCJaJ hTPV6]hTPVB*CJaJph hTPV5\ hTPV0JhTPVjyQhTPVUjhTPVUHߙ*;f+;f$Mf+;f$yRkdh$$If0fD%62 2x34a$If$IfRkd:h$$If0fD%62 2x34aߙ6k>AS*;D%5 D%D%D%D%D%y!y$If $$Ifa$ -DM Rkd i$$If0fD%62 2x34a STWxy!yBxy!yWkdj$$If0^"622234a$If $$Ifa$Wkdi$$If0^"622234a  BX7Ị~ۥ xD%D%jhD%D%D%D%D%D%D%yD%[D%[D%D%jhD%D%D% -DM Wkdj$$If0^"622234a <SXn֩So wĬǬD%D%D%D%D%LD%yD%D%D%D%D%D%D%5 D%yOOOOOOOOOOOO$-DIfM  -DM ǬʬͬЬ@ASTtɭۭ#OOO"""""""""""""""$-DIfM #$`-;=;D%6tD%yD%5 D%D%f+;}f$y$If$Ifrkdk$$If40Ou#0634a{|af*;f+;f$jhMihKD%jhKD%KD%yRkd%l$$If0fD%62 2x34a$If$IfRkdk$$If0fD%62 2x34afhjlnprtvxش"#Ry"""""""""$-DIfM fyz5]FGHMNcdeijl k57*>"&(hTPVB*ph hTPV6]hTPVB*CJaJph hTPV0JjxhTPVUj7mhTPVUjhTPVU hTPV5\hTPVhTPVCJaJhTPVCJOJQJaJByz 15T}]#D%8}D%}D%}D%}D%{D%6tyD%yyD%[yD%5 yD%5 yD%5 yD%yyD%y -DM rkdl$$If40u#0634a?_3GejlkD%9D%<D%jhD%[D%D%yD%D%FD%3kf+;f$D%<D%5 D%yRkd*$$If0fD%62 2x34a$If$If#T""""""|rkd$$If40u#0634a$-DIfM B]1D% D%[D%D%<D%[D%jhD%yD%y[   $If TN[ yN yN y$Ifkd<$$If4F[ Zu# 06    34ap{xu[ yu yu y$Ifkd4$$IfF[ Zu#06    34a67!"OPst!SY01IJfg:;#$45GHTU_`-bc'(UhTPVCJOJQJaJhTPVB*ph hTPV5\hTPVCJaJhTPVVVxP[ yP yP y$Ifkdޙ$$IfF[ Zu# 06    34ap%36{xu[ yu yu y$IfkdӚ$$IfF[ Zu#06    34a67VxRD%8PD%yJ+J Jz $Ifkd}$$IfF[ Zu# 06    34apTN+yN yNz y$Ifkdr$$If4F+u# 06    34ap!{xu+yu yuz y$Ifkdj$$IfF+u#06    34a!":MOVxP+yP yPz y$Ifkd$$IfF+u# 06    34apOPcqs{xu+yu yuz y$Ifkd $$IfF+u#06    34astVxP+yP yPz y$Ifkd$$IfF+u# 06    34ap{xu+yu yuz y$Ifkd$$IfF+u#06    34a!a$SVxRD% FD%FD%DD%yFD%FD% -DM kdR$$IfF+u# 06    34apSY'gOzD%jhD%y_"_"_"_"_"_"_"_"_"_"_"$-DIfM z|!!_"_"_"|7xD%vD%<tD%tD%tD%5 tD%ynw n $IfrkdG$$If40u#0634a$-DIfM !016GI NHw yH yH y$Ifkd$$If4Fw su# 06    34ap$IfIJQbf{xuw yu yu y$Ifkdޣ$$IfFw su#06    34afgm~VxPw yP yP y$Ifkd$$IfFw su# 06    34ap!#%{xwD% uD%ydddddddd$-DIfM kd}$$IfFw su#06    34a %7lm :;Q """"""""|xD%<vD%[vD%5 rkd'$$If40u#0634a$-DIfM D%D%D%yn @kdƦ$$If4Fqu# 06    34ap$If -DM  yn yyuxyn yykd$$IfFqu#06    34a$If#VxPyPn yPy$Ifkdh$$IfFqu# 06    34ap#$&.4{xuyun yuy$Ifkd]$$IfFqu#06    34a457@GVxPyPn yPy$Ifkd$$IfFqu# 06    34apGHJPT{xuyun yuy$Ifkd$$IfFqu#06    34aTUW\_VxPyPn yPy$Ifkd$$IfFqu# 06    34ap_`-cegikmoq{xwD%8uD%jhuD%yddddddd$-DIfM kd$$IfFqu#06    34a qsux{~:;K"K"K"K"$-DIfM ;V?AUa 4i'K"K"K"K"K"K"K"K"K"K"K"K"K"K"K"K"K"K"K"K"K"K"K"K"K"K"$-DIfM '(:c3U-wD%6tD%yD%[D%5 D%D%yG $IfrkdE$$If40u#0634a U./  +,~uvx  o ݻݳhTPVB*CJaJphjhTPVUjhTPVUhTPVCJOJQJaJ hTPV0JjhTPVUjhTPVUhTPVCJaJhTPVB*phhTPV hTPV5\BrlyfG yfG yfG y$If$Ifkd$$If40u# 0634ap1MdvihyG yG yG yG yG y$If$Ifpkd$$If0u#0634atZnyhG yhG yhG y$If$IfkdT$$If0u# 0634ap0P?b6ihD%D%yD%yD%E)D%FD%<D%tD%rD%6tD%yD%D%[ -DM pkd%$$If0u#0634a 6jD%5 D%<D%jhD%yp$If kdl$$If4r* j u# 20634ap2  yypyyOyypykdQ$$Ifr* j u#0634a$If y$If y$Ifkd$$Ifr* j u# 20634ap2 ypyyjhOihyypyykd$$Ifr* j u#0634a$If +,kd$$Ifr* j u# 20634ap2$If,5<>C~yypyyyOxKD%8kd$$Ifr* j u#0634a$If5jduvxD%D%D%D%D%D%yf+;Y y*;f+;Y yRkd$$If0f7!62 2x34a$If$If -DM -   L o *;D%5 D%<D%jhD%D%yD%y""$-DIfM Rkd5$$If0f7!62 2x34a o p   v D%8f+;}f$5 $If$Ifrkd$$If40u#0634ao p   v w y   U !hi[]X r"""###L$Y&&S''. / /00888889 9"9N9O9M:Q:R:T::hTPVCJOJQJaJhTPVB*ph hTPV5\hTPVB*CJaJphhTPVhTPVCJaJQv w y      U5 f+;f$MKD%<ID%ID%jhID%Rkd$$If0fD%62 2x34a$If$IfRkdG$$If0fD%62 2x34aUD%yPjdPydy$Ifkd-$$If40Pu# 0634ap$IfxPyy$Ifpkd$$If0Pu#0634atxnPyny$Ifkd$$If0Pu# 0634apxPyy$Ifpkdn$$If0Pu#0634atxnPyny$Ifkd $$If0Pu# 0634apxPyy$Ifpkd$$If0Pu#0634a!#%')+dtxpD%$ nD%y]]]]]]"]"$-DIfM kdw$$If0Pu# 0634ap A4 """|zD%6txD%yxD%[xD%vD%<xD%xD%jhxD%yxD%jhrkdH$$If40u#0634a$-DIfM ikmFdD%yD%y""zvD%D%yD%jhD%jhD%tD%<rkd$$If40u#0634a$-DIfM  d[]D%yD%D%yf+;py*;f+;pyRkd$$If0fN62 2x34a$If$If -DM  X {  r""""""""#*;D%5 D%yD%D%D%<D%D%5 D%y""$-DIfM  -DM Rkd$$If0fN62 2x34a#>######!$L$h$%Y&&"""|xD%3klD%lD%lD%jD%<hD%5 hD%lD% -DM rkdl$$If40u#0634a$-DIfM &S'''(7(`(\)+-. / //////////"/[///D%D%D%D%yD%6tD%yD%jhD%LD%[D%jhD%yc"c"c"$-DIfM  -DM ///0Z0_000000 1323c"c"c"c"c"c"c"c"|+zD%6txD%yxD%[zD%6trkd $$If40u#0634a$-DIfM 23[357888889D%yD%D%[D%jhf+;y*;f+;yRkd$$If0f62 2x34a$If$If 9 9"9N9O9M:R:T::*;f+;yM*;KD%jhKD%yf+;f$Rkd$$If0f62 2x34a$If$IfRkd$$If0f62 2x34a::;;;;;;D%f+;yK*;f+;yRkdv$$If0f62 2x34a$If$IfRkd$$If0fD%62 2x34a::;;;;;;;;;;;;;>>>&?'?:?;?{?|???@@j@k@tCvCDD DEEEFFMLLL'?.?:?*;D%6tD%yD%[D%jhD%ys$IfRkd$$If0f62 2x34a:?;?A?{?rlylsy$IfkdB$$If40! 0634ap{?|???xysy$Ifpkd$$If0!0634a???@txnynsy$Ifkd$$If0! 0634ap@@@j@xysy$Ifpkd$$If0!0634aj@k@@@@BtCvCDtxpD%3knD%6tlD%ylD%5 lD%jhff+;`f$$If$Ifkd$$If0! 0634apDD DiDEEEFFf+;f$yf$5 MWf+;f$yf$Rkdc $$If0fD%62 2x34a$If$IfRkd$$If0fD%62 2x34aFFH.ITI}IJKMLLLLLLLLLMfhD%5 D%jhD%6tD%yD%5 D%D%D%y   $-DIfM Rkd $$If0fD%62 2x34aM7Md>d>d>d>d>d>$-DIfM kd>$$IfFXCu#06    34a d d ddddddd d#d&d)d,d/d2d5dmddddde)e0eQeneue>>>>>>>>>>>>>>>>("("("("("("("("("("("$-DIfM ueeeeeef&fHfOfsfffff("("("("("("("("("("("("|^[zD%6trkd$$If40>u#0634a$-DIfM ffXgZgcgdgfgmgngD%yD%f+;1y*;f+;1yK*;Rkd$$If0f62 2x34aRkd$$If0f62 2x34a$If$Ifngpgwgxgzggggf+;1y*;f+;1yM*;KD%yRkd$$If0f62 2x34aRkdm$$If0f62 2x34a$If$Ifgghhh0hhhy#yxy#y#BWkd$$If0^D%"622234aWkdS$$If0^D%"622234a$If $$Ifa$hhiijjjjjjj+kakkkky#jhihD%jhD%y     $-DIfM WkdS $$If0^D%"622234a$If $$Ifa$kk8lflyllnoq*q1q=qD%8}D%{D%6tyD%yyD%yD%jhyD%jhyD%ysxs$If -DM rkd $$If40!0634a =q>qRqqrlxyl$Ifkdr!$$If40x! 0634ap=q>qqqrrurvrrr1s2smttt@vAvv3wFzJz{{s{t{{{{n|o||}}}}}}}]~_~c~x~y~{~~DEGKpqszހց!"$Q$%݃UVXnhTPVB*CJaJphj'hTPVUjhTPVU hTPV6]hTPVCJOJQJaJ hTPV5\hTPVhTPVCJaJKqqqrxy$IfpkdF"$$If0x!0634arrrurtnxyn$Ifkd"$$If0x! 0634apurvrrrxy$Ifpkd#$$If0x!0634arrr1stnxyny$IfkdO$$$If0x! 0634ap1s2smttttttttttuFuxD%$ D%yw}w}w}w}w}w}w}w !w !w !$-DIfM pkd %$$If0x!0634a Fuuuu@vAvvvv ww3wOw ! ! ! !|xD%3klD%lD%lD%lD%lD%jD%6t -DM rkd%$$If40}!0634a$-DIfM Owxwxwzzz{{{s{D%yD%jhD%[D%yyxyyWkd[&$$If0^"622234a$If $$Ifa$ s{t{{{{{)|n|xD%yD%y""$-DIfM Wkd&$$If0^"622234an|o||}}]~_~x~D%8D%yD%D%f+;yf$y$If$Ifrkd['$$If40u#0634ax~y~{~DEGp*;f+;f$Mf+;f$yRkd{0$$If0fD%62 2x34a$If$IfRkd0$$If0fD%62 2x34apqs)<eހ*;f+;f$yM*;KD%ID%6tKD%yKD%Rkda1$$If0fD%62 2x34a$If$IfRkd0$$If0fD%62 2x34aހ!"$$f+;f$f+;f$Mf+;f$jhRkdG2$$If0fD%62 2x34aRkd1$$If0fD%62 2x34a$If$If$%UVXnihD%f+;f$Kf+;f$jhRkd-3$$If0fD%62 2x34a$If$IfRkd2$$If0fD%62 2x34anoqQihf+;f$jhMihKD%?D%?D% -DM Rkd4$$If0fD%62 2x34a$If$IfRkd3$$If0fD%62 2x34anoqQ#$78&'<ތߌʏrstuFGvwБё͒YZ~ghɘʘΘϘјۙܙQop/ijRS()kῷj8hTPVUjhTPVU hTPV0JbhTPVB*phhTPVCJOJQJaJhTPV hTPV5\hTPVB*CJaJphhTPVCJaJH$+78=&D%D%y \ ^X yX\ jh$Ifkd4$$If40 u# 0634ap$If -DM &'0=ih y\ , \ y$If$IfpkdZ5$$If0 u#0634at n yn\ y$Ifkd5$$If0 u# 0634apx y\ jh$Ifpkd6$$If0 u#0634aߌtihn yn\ $Ifkdc7$$If0 u# 0634apߌʏvFD%<D%[D%jhD%yD%)D%}yw3y$If $$Ifa$pkd48$$If0 u#0634a FGJvwzБxy3yBxy3yWkdG$$If0^"622234a$If $$Ifa$Wkd6G$$If0^"622234aБё͒  D|ړxD%jhD%yc"c"c"c"$-DIfM Wkd6H$$If0^"622234aړ*/RYZv !$c"c"c"c"c"c"|'xD%<vD%5 vD%jhmy $$Ifa$rkdH$$If40u#0634a$-DIfM $~ghkɘ#yxy#jhBihy#yWkdI$$If0^D%"622234a $$Ifa$WkdUI$$If0^D%"622234a$IfɘʘϘјۙܙQxD%yf+;f$jhGihD%5 D%yRkdJ$$If0fD%62 2x34a$If$IfWkdUJ$$If0^D%"622234a*Haop""""""|rkdHK$$If40u#0634a$-DIfM p ~/jlnprtvx )?DRD%<D%5 D%D%D%D%D%[D%D%D%y"""""""$-DIfM -DM RS(D%<D%[D%5 ~yx#y$If $$Ifa$rkdK$$If40u#0634a(),kxy#By#WkdM$$If0^D%"622234a$If $$Ifa$WkdL$$If0^D%"622234akl IKMOQSUWY[^adgzD%5 D%y$$$$$$$$$$$$$B"$-DIfM WkdM$$If0^D%"622234akl HI֬׬s*³óCDMNVW$%HI}~T\ E!"$_ݽ޽߽45MN̾;^_eHIhTPVB*phhTPVB*CJaJph hTPV6]hTPVCJOJQJaJ hTPV5\hTPVhTPVCJaJNz4XchvѬ֬׬B"B"B"B"B"B"B"B"B"B"B"B"|3rkdN$$If40$u#0634a$-DIfM ׬#7K_sӭ:*f֯p³D%3kD%D%D%D%D%D%yD%D%D%D%D%D%<D%jhD%D%D%D%D%5 D%jhD%D%yy$If $$Ifa$ -DM ³óƳxyyBxyyWkd%O$$If0^"622234a$If $$Ifa$WkdN$$If0^"622234aDFHJLNPRTɴ6HxD%y"""""""$-DIfM WkdO$$If0^"622234aHMNϵ$"|xD%3klD%lD%lD%lD%jD%ay["y$If $$Ifa$ -DM rkd%P$$If40u#0634a$-DIfM $%(HIL}xy"yBxy"yWkdDQ$$If0^"622234a$If $$Ifa$WkdP$$If0^"622234a}~xy"yBxy"yWkdDR$$If0^"622234a$If $$Ifa$WkdQ$$If0^"622234aTVXZ\rwzxD%yD%D%D%D%D%6tD%yD%D%y#y$If $$Ifa$ -DM WkdR$$If0^"622234a  !"xy#yf+;#jh5ihTkdS$IfK$L$0f#62 2x34a$IfK$$IfK$$If $$Ifa$WkdDS$$If0^D%"622234a"$ݽ޽߽f+;#>5y $$Ifa$WkdT$$If0^D%"622234a$IfTkd:T$IfK$L$0f#62 2x34a$IfK$$IfK$458MN;#yxy#yBx@D%y@D%yWkdU$$If0^D%"622234a $$Ifa$Wkd0U$$If0^D%"622234a$If;Ծ˿X1lfXy`1`1`1y`1y$If$Ifkd0V$$If40X! 0634ap$If>^Xy1q1q11y1$-DIfM $If$IfpkdW$$If0X!0634a^_o$?etPnXyh1W1W1W1h1yh1$-DIfM $If$IfkdW$$If0X! 0634ap$'HND%$ ~D%|D%jhsym y$If $$Ifa$ -DM pkdqX$$If0X!0634aHILnorxy yBxy yWkdY$$If0^O "622234a$If $$Ifa$Wkd Y$$If0^O "622234aInodhx\]>hi./ex|}KL2 qrt (bcsthTPVB*CJaJphhTPVCJOJQJaJ hTPV5\ hTPV6]hTPVCJaJhTPVQ!xy yBx@D%<>D%>D%5 WkdZ$$If0^O "622234a$If $$Ifa$Wkd Z$$If0^O "622234aJx<N\]D%[D%jhD%y{{{{{!!!!!zrkd [$$If40{!0634a$-DIfM ])>ikmoqs  .D%<D%jhD%D%[D%D%D%D%D%yxxxxx!!!!!$-DIfM -DM ./er]x}KD%$ }D%{D%6tyD%yyD%[yD%jhyD%ysf+;mf$$If$If -DM rkd[$$If40x!0634a KL"3D%5 D%D%5 D%jhD%<D%5 f+;f$yf$jh$If$IfRkdK\$$If0fD%62 2x34a !qrt5 f+;f$yf$5 MWf+;f$yf$jhRkd1]$$If0fD%62 2x34a$If$IfRkd\$$If0fD%62 2x34a5 f+;f$yf$MfhKD%kKD%KD%yRkd^$$If0fD%62 2x34a$If$IfRkd]$$If0fD%62 2x34af+;f$jhihD%yW"W"$-DIfM Rkd^$$If0fD%62 2x34a$If$If.H  W"W"W"W"W"W"W"W"|'xD%8lD%jD% -DM rkd^$$If40u#0634a$-DIfM y#y#jh5 y#y#LWkd_$$If0^D%"622234a$If $$Ifa$(cegikmoqsuxkD%LD%yW"W"W"W"$-DIfM Wkd`$$If0^D%"622234a%&SW"W"W"W"W"W"|'xD%$ vD%yrkd`$$If40u#0634a$-DIfM UBnsq"q"q"q"q"q"q"q"q"q"$-DIfM st.H_w'D%3k}D%}D%}D%}D%}D%}D%}D%}D%}D%}D%}D%}D% -DM rkd;a$$If40u#0634aX[ D%yy#5 5 y#5 @5 WkdZb$$If0^D%"622234aWkda$$If0^D%"622234a$If $$Ifa$ MNop hTPVCJOJQJaJhTPVB*CJaJphhTPVCJaJhTPV hTPV5\ ),MNQD%5 D%yyyxyyWkdb$$If0^r"622234a$If $$Ifa$xyyBx@D%[@D%yWkdc$$If0^r"622234a$If $$Ifa$WkdZc$$If0^r"622234aopf+;f$D%y$-DIfM RkdZd$$If0fD%62 2x34a$If$If+t!N:mq"q"q"q"q"q"q"q"q"q"q"q"q"q"q"q"q"$-DIfM   ވCD%D%rkdd$$If40u#0634a&1h:pTPV/ =!"#$%q$$If!vh5f5#vf#v:V 6,52 2x34 q$$If!vh5f5#vf#v:V 6,52 2x34 q$$If!vh5f5#vf#v:V 6,52 2x34 q$$If!vh5f5#vf#v:V 6,52 2x34 q$$If!vh5f5$#vf#v$:V 6,52 2x34 q$$If!vh5f5$#vf#v$:V 6,52 2x34 q$$If!vh5f5$#vf#v$:V 6,52 2x34 q$$If!vh5f5$#vf#v$:V 6,52 2x34  FDd r  S NAsas_wsh_07csas_wsh_07cbFE׺rn`wT"EnE׺rn`wTPNG  IHDRO,PLTE͜ebmƚʥqŖ䜞ldfMҬt{䴴ʜ|zGtִdd:LN݌r۸Y,,sTU)LL(43ʨ$$ Ľ\Z6ttODCľħᤡr45|~Nƨ̵Xts`tTU5|zTajllgDD&<:\Z%ljD\^7DD>,,,LMJdttt\]GmnB~<>ddc~lj9|c$%$ڴljOmnN|~_<<;|}ztsA},-|z_444}4:lrDt<=)\\Z•\TTEԼ~gD>TUTLM7LF',2 <:lrMybr=#\A.>BjAYNka׷J(3߲PFI8I H>SY`dٰVɒbߢDؒl P]a nL<,VM.KL[eiDH!' UT,+/ga; ty+)#%yHIW]m2ڶY}Ų/%ٸj ^ҏy!{g3*MVJ)tTdɦd_SOgђWVfm, n}F,;nϹG|Ϭ3u^=k$M R&d/}q/H.@y} +] #*΀Eߙ+)yWK ]IOEUYu= ~^6ۭrZ"\Iqn%\' ǮDvco}QԣRZ;?TJM(AG0MZT0Ջ cIuJ4<.rE^q>tB>q0@ p0?GE~uws, Tԯ6%~ ĜV˪be~vy Q_P%څժo#3^w2=Ur/׉>U4mcH]$G;mUEBm 9'\Q]qsxqal a 8C.||2' =~ qιDkDSШ DŽ1!Rf3 Ɨ|KERHH1y?rD)|WP z1U?k}Bԧ}ǻI~@e.E-964]C=$ڠRSG$?3='D0ĚѦ2C c">V+RUsP=fc"=":}2vn _HO~t I{V5Q?"G1 "H!3)@0Iz5ZKβ'W⻓:RSMj&O15]j^\_ Sbؿ"X;۳\Bw/JkH>4r,O‹Lc` YX\E]>ԠaK* o*fT_*`\KTj23BF{*54 r^,?@g^kw.Y-+:RCedU^t܃GJ~U[pIQXmGK>69STaU&l!i)O[y%Jpk jT%G2ꖂ9>ҫz<ѿD7$ 7rglR0) G9'54h'k~OX-E"(b]J樈09-exn`q$?s-?2\Y^{T% NId>?Y0b5Mg Zsle7GVYzAlߘgn?n`Xs/${큐~W:[xRX%cMRRKiߝ^Kf戨h{`&53IN0~fiZYϟo+ jY/@\wM2~zr M.ü(*n}'zLbp&_W1&z H q/>k&FjgoSɅG\~.+LT֮ wDUMsZZ0=D[@n)2!4+Lg^bq!ptB5 c]8P䧭UI>lxH-ڧnQ'\!׏d*&SKL\iz4PzDS&x^H½y޲[eȊ䧫[R޽{N1x{ͻmsݸl[ڽ{[TŒ WfX6NDW4.IПݑJqIS@A=vD.܃dJt;1 i>whBAfU]gluEg~^HT@y+Տף;l[Ǡ ^33 (xEt@T!.i\VYhW)XdNIWVfrRl;:),?o{$?!(ݮyϑC%,]d%UJ; =C߉NE)8QsP$Uf'Κ>_a{Î=/i2*֏,t7\?wIdTqmGm%"ynZ-Gˆ%FqsT@˻tY2pz,+mC9\I+*5M#pⵔO.:mvrܑ*slZyK-.n\>3_ӚA~j2;׭2[Eg[+ՌF39'??aSAeE;,I:QbrVOysĖפ_|m(?D]@5S-h'\/S+a{q%0ڃ|OT?HSbZ;[Uς.un-wuwŧw'>[{?zah t'! }qq?XuWv U.۠ѫ(D"#N`Ts>%Y|OnZ|ñ 'Ǒq_gG ꏶS6+γ^OAR"%Zײ{l*oqгC``zU'r7}ԫJr.X?b;/q|sb'}KqYk=f(3;Ae2ntٗ2ZW?i#tQ=Pݾ搋e VXB=jY Uϭ9(6K/Wl~_>RZyfX3D>f) ȦckPuuz* w=9E:3uuI߬keʥXU)禡u6\ aU-Z<-K |G46y*㭺 R{ȿd6ҋI)(gF#MP/mOМ4"EXPlkx0-mBhߜϜsB/) ~bdm`BBh?|*h?}2倧VTŹj./OWHH;ܬOcm;QV mv nsݾa-oܾV۵k{7hq}kÆ:]ޑY 6lڴaPv H xD %S^`V)eRjBf'˛9X\>4`f3&N\YI/n==YmӎuMmu{.P2??tƝMr'_~m.Cqxqkc mCǤ\CcAŅKPd6قiEٟ6؞_^l!BiC 8d@T+)KUJ4zتѰمN_dv<]{r1 ;Așd^yPi[Ɇ Mk;m]7_;԰:aO~ҿ$ !g7;R&U|VQ!0]Еlhw^>U@CjYt^kۆ\k7cmi㋾ơMk]mklYx2ytX8uJ+y⧵͵wSy_w3XvͪN~R0YAt8W"hrn߅!Z٪@0{$/iW|'謮[]~>o75b7mZrêMkӦl8O]Qϡo665v6"k[ZֺvvɗJ+i!ꥆP~9R&ȣOm7^9LaqOAw|fʩ:ɮesםG?"/FsP^\Rm64Lnr=L^֐L6xO'AvJt~6yDz;mt-ۛS~~#K%/VQҬKq{f C[W\Ň?Y#r|2}A7#L3dH̕X~[s߿ێN-]t'RVLJ0X0NFzt43ʓV Gfp㑑s\o2HhBpXЭT%*ev~Y?/TR'<-)U~e8D+8+ٞ\iXe3\`̮n?g.OK~ʊ?us*&VFR;ܝ!t'*q4ݍxca/Me?#׮h_l@mk1T=#'q_wƯ޸qq.߸Vu,ڦ%<ڟ% XpxOr_<S3'/^Y>ٙHFjry.8XF=Q}oymn{?W~= E~)zd (a TR&X覌# aeoX]BUFytBUЕsw4~I(5WmO:e&0kh]hBٟnwݖSդ NԚoNϻͻ˅$^+{+7lOA|LP~Z"ԺpZO;o;*xB [ vOCv{Z5}Dn~:[]wmz_K㓳e3ڏ%ײl*OL O.'>B7AL~͵Vv<܄T]^ WJcIRnleezeTA>Ph/dO%g,iCu0SAmGpU!!`<Ӣ hKP??y ,ri΢=#v@{K牜k P+}ϳkq $Ag{c@~ja˛,n/!d̈Ǜ4ISv8g=+f6.ܦ;ÖᬃA9˻z4zG5(,3$ 9O6W~Zx(?5%;FcceTi*{􆱭dc;C`DsaZqKFv᷑ݞ(θpJ)*!liPn$n8Oؗ6< sI? Y~/|1w{|>Y ØÉ'zމ`$5j%?J*\u ^7BE",`tka-yԭ}vp|-{mhxmx]C8]vm![,TI^b8voMx0jHf~&`i~Nb8bX^1ZSQ9N1Lei+'"']H;;wewc[@'b +cAd2izuܗ7tdW1͞d:x'\d֤WE?OWQZ ,%գЅtuJ92l}#0Se 6>dBVlGQ޹M_1TvSiEɼUev㰙Tn{Ǎ$%9z^sH̤!lJc<ԄvUj~G1yNWˎС훛7Oa}P0v~~҅򥰓E$Q EGEnՉߕR;rVbiSzPx5!H'SRmi@ߜKBB ׭bR cb*h5葂Kr&<LL+0k"5kSm|2.5,O)~qkOIY:2}\﮼u|V)ש+O\B7ǒXWM(S,ڃWt{U$T)GBq3n*kUkT{v9/cq\DZmyt' /? x.3 GHV;G~Vlzyg(8>Dwd(\̵"Sf ߍFQK㱔}T,CŌwQY Qs<~dV~T@J=OK@().9Β_6kHdWЉdMӛ|ݗ]:18]f!9G~FrC1a 8~D0 "S*"U=A Eޗ#@8îGJ)?Nbck t9b5A ?5EQ-L7b^""6+SʋP"m1H_Aɓ_|vKG"c:J՟IȞ$'rt+)*ϼ\SNKL1!a[ɨ.,X~NkGQh͛tn֏?jӼm&}|֜ <9:D~ m^8!EfȾx[%%UȧU?GP PԆio^3j3jF nTBջ2x+nm(Og<]?3(&c3/-񓼸RLu[+7d&6{^xyڐ͎%LozO^/>v,~}߯+uI~~/5\^ aP*Z3{7 Bwe{ ǡ?3{#?7G<cta[8VB}$L?OTz_/Sk}"GpwOeeGOh) 23Q5gvMѦG_oS!Z꬛Z-ϟ4𔍆'S=۝dO37]gOOaxy2BOlΪowS׏8l!NsO&BpҨ[14m xGs'.+Fm9zZ<.FY;O*4wAp 3 {#11B&3@??8'߄c]ŐL,*=XJA2\J@3B^\x7J t La/{ //Atow_"?i'%|VYBjMJr@zh K_/$:B#5`$8'È"po~@iIφ @~? 5U 6|k)ȭ|6FnKOz%f<p%P=O| 2z_g+a8al \>/T-Rh NKEwdN~D: ?):j;WX'^/i)!N#rmگQs+kPQ!X擏u;?f_[ÞZJtJ͋.bkލq Ibh*Ul/?lGE<>,t\fm$ʿM@~F<ع"Yvkٺ_TGThs:+RN˦WNWN Ŵ/CfNù:d i{ $~7&.w*ټ=g̐bGumm ¶[?0j^&)?zjC6N++a{,KF!AΧj9l|G>̅'q9eq'MXb uzP Jዪo޴ Gq۴e郛޼aKː-*w ozhXes1 6&xM_ }M֍bpxJYj QVٶ*=/_LQ$<ɞd9 2+߰7w0{8ygf532R=j#2##FIt$ᮊ fTg]T{}6<q}#cpV)?y| z;ƷiزV=_NJK}Q1=* !{ND~K8pn\5R^X~-M6h^ .qd,YN 82/ _~UHSvMAcv1D<'"`~Xx4vU^P9n,HR׭y߽Jy18:O_.bwXiCVؖx~ Y_S>Qb~y[ےkjOIc50u+(AA󳟹J\%G5 Kbέx:~ҥ&i`@RKCR2݈bKc Ts\RIoTh.PK 2dk!}ʣFo\k`P6VGU)ީx~%96_[fBmUԏ6 6TఴU(ǿ>8x&A#]h4VLbid813ߚL֌Qqʒ`%6@/^mmgH&È/?%M6 R9 #f)Ǟ f{^uudFj_oCeC?j0 Go u۩2xK^_s_xt_3">*#eU%hae؈^LFDAt OOwRªZ߳@UyVʭ\~?}>]h'}t"q|w*ut)%qG%.$<x WO'$*c3x'CKqnmFŠ+)lhE/mTbxa*Ƚ}Qӏ+0*Fw>[?^Z.€牾[&3}w5FMWUpyx*~=yݱEzVEH_\S(Q@8:G O.(=29RmO~.Yi4&|4 H: xX M c 0d|J@A p>c֨0+1*'L%?y&w|"{hR,})җK1wa~\,#Lz!ZZS=ƍGm'qH7;<Sagiht~yݵ4?n(}x`{([dBO~U/GsŠ: Y8l׍ OatevФlLhp~WW|72⧯d+f,Z,=Q|yoz&z>Y&B2Q] ftHw1VTVry=me+$fmjy1G滚 ~X[{GGB`gn$Z u~01/1dl`"§B{JO/0S[Ԝ?Uz|wUq%w>͏{gOq b} zd^V4Qc߉7<')%ig1K"yKc#@Ѱ7bPF\s-`5:X.ۊn,ġ71`z֎͖)0ǒt~r>S[A }&{8X Z q[jOl}@bgqSޯF.oqSSiJȈHFm:4_L@Fhk;"&Ԇlr%(~n??t>P۽8"lCfvL~g ?¨c>gyjhٺƭV#[9U)Y~6ORA]a~m{"gLxjX^㼹E@X@K!$jYʷf Pgu5_~{d˔\wLp#ɹo'$tQHy/:>/'o.% S+ꌿ-gmŁF4Ȋ!5ġ?ي#&x:ƘsJm-fk,@'"ǟæjQ+xd:QGPZq.8xEϿʃ GБ@@9hV(QA 1;=3)?o.'o_I4r9̖|9l廹arTBV7515S/Z~7sh-nONf!CASF)` ;(\]˧?!v B7ݽ\C]d˺( No{r*CoЁ#lk g1˖GT<Ԙ-*|]'].1yvz#[eϟ.? Oު kNI[[1he,>_Z*g%#C}roV/ (^cz熟Iη1+ݳ+eݿ c:@WOߛ0{eiv0߉=ӆy@ U՚gETM~SS577e 3.:a8tFc:qqHAS4ʚfG|wuQx467P$K0nyM1q?Mf?7~ofg٣olb |lIl >9M M~CѳGcɴHXoDB{ 1ptMsz@HI?FT`b !i >On\keD8D6&,󦫻$I+nN8'!#qO{(?5^tUH(c1O5`*L7ZBv?EH0RS0-GxT_A'ҖnqIB|maUEL^e<)D$ߺ ]CBb9<2sB5Y) )&9 E@v:o]#!>_}Ojo'Ckפ1DG^{d _,X۞+e>)e{I'8&&J#p FxF 39u*.^z)Th/!FutV f\5#*=^ @IO]c8ʆa 9fđX[:b`?2y9~;tLQ&ײG/;4e#+N?Ģ7;.WlFGD3^3 Eu]A0&}͉@ml7-J'OeGEIc"\W>9BQ^a`+EuشkX} %J@6uJ)gS%+ń#!N?U΀Ø66u lU/d݊/}4R;馑`8?i]>>To^r3WE_Y <{-eCOIXh{Nwyܥg͵Z+67fF3T9u:Ҍfo*YTwF,?BL>yYDZkfF~ )YJH@o)/j@Hs$?e384>y?@<`<ԛXGUF!{zP?? ̮mPM8_XEx"_{`pM%?sd`HowߩHHU4VH&V1:Pjo{a0;s4G%Ԇ6 gOwJMkDSO>e"æ &u" o=o&uG}g N<0+EAȧiP?^p$񋟛7>ri6?9?ʦ Z>Ν/'5:j9l=%P$ CIQ-3G?v:, 63,mKj"Ց$<-vm!^֚H,ڮiiϐf$M;VҡӯI }M,:6ާJ,EQrzz5ÚMv1BqJFpǂ[O p-52ZUSm TE@!)$T19} zO?E$քeDx272nR[RV& P(͈4Sp=N8Qq2$fN> @ }'pHV pQ[N``SRG:} (ؒuSmG:x@pj1D%l)36=.{l ZICKũfq,N@ȝwpg3s7n}?|#[ qg1snL/⒜GFf@]8r25Q|1% :C 10jd\R/bv1n)qw'8eTd쳡 NP$6Ҹ2Kq,u* ,U8xΪ_X3qq@UD%['*NPL  %TH);8.Vp@AX\M.Yx1SiRiS]-F.Z\W9Ԋ)\,En#$qp. 6 >isNƐ;P#FÌNqg HOG<3 s y4>1E2gP0Gǧ6&k93&G(@AXK#J6|a4DqzPy8Q *q@U'9(P(Ct~h|P&&|XdOMثÂK(V+ 28v4{Pskh]l;ulPDqzPyD 1@2Qv>fލ8fWHރ(k=6Oo2BmZQl;v4WvTljJU|Ά q89L8KlLToSz/^Kv9K1},ŤTO*!9Mpr#g6oG;o ^z^DZ9l7beqwߞ۪sz 34_0 R;Ѝw3sS v=,uϋ=WR G|)am~2Cz0tn&"ۉPpM.y3 Sϫ|&mt{nv~$dx(j&< \':>=I`j+E$? E#A|Iԉf"ìk T>&Ԥv <[6X=5be_ݿI  1r&nW|f6{bװ8H~WUvUkкuFg2lM)g"([I3 x^&c7Iզ?]RK7YԔ3IñiҶO|aN&y|Dw\WH"JJX{x'dukdJK|Mjtom!6 b7ձm|W4+i,wkd$^N5><~PnoHsZ{8 ZD8|sTvF@Fw-'P3Al~,B_IpFٴ`vFӴgT-63L;_Jf@o6iV=JghYɠ ژ+WLu 8`1޻CXPb<|px(Bzm0`AA԰ŮUF ൨1-=VʗRD-D% 5@h|Y|Ta8XCC ͞e;^H v-2YRĹ?X b}0^/!Yg' PyDtvV~wmVVsokAXlRù1b *O;‘Ao(#3|u WvO?* SsZe\0D3O9&{pӱ~;Ɛ,('/sS:xqRZx∜Ka*Fx\fWκe4Qsԏl$r>^0:r?Yh'T/,gUae8U]N`cHuEAjO L<1OUW !VV% h'oI EaCQஏgU+"e( P9оd֩(e\jg|egl㚻]GjiWfz[fv yԔ6+P(gfgKeZjCvhseNc>Mg^n=gfv` ^{HD0{*{}r!Y4 8pL@.ic/ꐺ- b= P,mg2{ vyvndIg(Sa#,+8p@AXB޽% v)n{)h`ّj[!i;0/ -+|+HnYh H3匧=22ʗz{v~B(x@z ɬHvO<ߙ SD?qb &Esy3= weA+E`VZX=v&Ap6k:]*x7(ڸuTeH7gk7¢u_MѴv2|kU,n#{wDSn몴Y٩}׮ vH]|6iZ~u{ӁHpOڑp< }%iطj4/KYK;Z m'Z6EljZljJUN2 P(&r0Z"AoXIoô0f(HwErq(pbri]uzԡ8=NTʼuzPmúxR$N8BJ)s'ɀpk0BRnD|Tz-Vg}Sعpx/#+8ceuVgxY\c/B=ezgֹ?ZҎT"vS#{2gq]6Z;?٣Z,tH$WW ںu6!s=NTljJUN2o'*Te:Qq@1)ϦgOEb&T45xu]`@AX+֩1"ق28٧fi5q8Q *q@UD%[ljJU)(3YkoyfIb7y!~/Ts7l-@?ɧV!y9Dz2}ҵUY6y.o%o}I^(~i'>tLq@η~c@kM+A^fi+o4T7uCs٧KdNZusilh_o;ˆH]|I!M0| iqT ;0b {8g䱰o Q;\ # }.&IdpΟ/"S1 ݯDlSN4ʎ0t3FqF$Tn AN8Z#ShƹUkG31R]JmS#o6Q5Uȝ!p+K+; Ǝ0_{I3:SiV00|wN; _}[Xɮ.qtGo­3m?d&"W9G}G p=ӌvj{޿QVn@;dJ^{bӐJ 8#׮oTP{g"WM _b7B]_vfe.;D?pZd|p(?v{m8~]8 ַHp: eF +KD- D% ăa7,z7ϖ?ɃH4-lF"[r3 gYFVvJ$;zeGY%F눘H^@#E{r1/KLBrߓ[N0W+Lpff2|cc^-7Ki#í)2PcD)BDžݪ<-J/b[齏qzcM^}eYa:1&Z}O3N}O3y4>ƠǨ8ecqt}ER#8ҷ}L~ " n8=}\wLYF 2)'d}MH5T<Ԕ2"3uy+jpAU*!gpU~r(̫`U_˂Ӥ EHX;NlL6{ˎY'dh h{`%-K9SE~ΛǨ81.N}3R⽏Qq>꽏*Ǻl]>Β̮[,]{4CWǩK0%qzPyD n4-a8@hp1jXF `m@2Jd`5)dmq)mh ]hXP:>fe]{.Hʤfës7J͠7c΂a; JjVU`*`4B/=*)\ h]%)7qJĵc2+`ʀ,X:M%#?UzrNH,QɲDZ1__/%)*:ùeq*GlS^,]Xq~l>GFEp˄bw:q:#e:[Zk#J(^*~,]Ȼ/Y8!'D4.4trl~D><|vt $"$,*$\ZT\V\lfd42,<64 䌆tnl<:4\VTLFD~|4.,,&$bKGDH cmPPJCmp0712HsMIDATx^} cHF؅b;vc6$vNb''3Ogz_Yog΄#IWgSUun-+w:fTZVVVpRSv|GJ8<+@C[M`'Q\x ~~^#H,+1:!4Y.{$CĒD&ϠzN$+<τdʝ@/źd1x_n|#Lxh̺^9͝V9bQ/Y]*za]rz2%WQx{3Xc% ={u8Ovb%~k3bz2~|%?'6Ng[Yso*W1ʳ>0A -WA{K|v d&3l'KJqIJ eX r&πS0-Pf-1%t;*^x_`G@* $f&LdHbEYQ1vX"Χbqx'[=3}[䧢<5( doI(邲/0,OWgvEy{'Z=IT' 7o~G(ndK;MG6}_K. ?=H.#1:t*{p;ⳬ?@2!9Y;Z.<}ixӈ≑B;. ,Hd.Y`DR >ZT.>?7{< &"hP+k8Eh3y? Eޱpю#^4K48渚gO πQoD5@)gCSt:Rg3[Q"gI^a׋պFVLs,V8a̵CFv6ҺZ%Q5]R]TԴME ZR~#eO0 _U#ѣhhW鏆V|ih!ԓzPg~n:jd`g7rZIdy4]2Da2 ijYI5~|H$6cxK i\v:{)!vhgQTF%5jtQ*ѺD|X P ¢0ڂXoIQ6# |hGGaK(yvŢ|=܅{ڶzV6?3\K:ǽGwŁ+%r؟dsZ4hQtU=I< {;@9A')6˅s?b(R>tȱTeװ4$k~`!}.:KT`?YABHBS*a@ I2rJD:;킩"6VX3oNq$? $3T ?SuA@]e"j_"j.Y{;qάN#ªjD9WăDGfJ ʐB7]l|W;j?0m` '?z`jc U#/#o\͈aR$kJ_;;twEdC;`g$͎oTn`VN6[{mfwKv[#O׳71i1]'Pg`ixX{XzhI8y^M^Z$ *?! ±voxן"mS ֱGzj!)b4w䧥Ҋז%hv-6RwT]쫩~VU3qJui0s߹@~uq/h#vz7D7?=O{Sփ}a=0밝"P~fm@aJjn|쪣j.8' .("ݹE*_p]a~@T..")Pы\ kBZ'R##(B2"o7ݿ HDA؏Z߭ːI ;Qgn 1σ酙D\-Q۟o? ėB(Fے|&oSxTCI}`){Oڥ &_-O"?)G#yHerR8^>kc!G{>y!Bܕ<]7ޡ^tA1Zo =z |JkvKlt\b1ޅc˯T2yc|%^1!^}y5?Yn5 pVjXK‰WO{+R}CW1q.2|0T~\UM ikrP;p쩆|*|[O!%Á;)Yp@ /y?MT:d^ޛ Hwn[tXrRUQ(h Nsr9I g2ߥ~7ؐ_Z|g"Ժq2۩nݰS)Tj{^m~붕JW e֓]k k(/xKm ft5ͥ*m-S)J.?Cx˯ [P)p|!Q97"nC~/?eڐg5mq3҉gz3Mw=gܬ̜ǹU s"$V(҅XԼK7R(O.zpj %y#oAoaM?LG4㥿9idXubgxoNo/?Jj[n%Mhk1;Zu ]qԏ5?JC-!?qdq<_A~vU2ו),KskkC%rҟK66~p{l\96u}T&X1d!&쇓|o9l ^tE:ꉐz'30e/+S+w@0)j(XI0<i=lQ9JjϓT)yn7A D8cˁ iq<_ NwW(Ӥ%S~: Ш:1GW M6' j84:0{:O^MݜfT<ȱxȹ)IdBq{O#?C@'87O"͹gTTzv<;o6#?{?qN>n)^>E:N6 lW`] p%|HTǫMl [P~wLh'tQyBPڧpa9Jh~H4a&ߠIZ.z:^U._?qa<15'7SHSʑ%H&2fɠS2^dB"jDHa&aj4Qkq}?7m BOaJnKdEQ83d|YHOKK)5BS/oU?'& I}drE<#KLAP"l$y8 )ȀGQCDo+*.V&a%ˍô#_BFUU%S¨Bo'icU u01:|ιd_υ흀U\A;?7E[w/F7zܳM!VL,+-q:ėo6M,-;DRaIB %OŃR[vL*k|$ TAӊK~.GTǿj|oǿNo_דo,`{>y|\jnf/0k-ȷj< bU',] EߙTT4,CB׀!V >w S]y/7/&RiɼxQK/,PFCm9 oϪMu~VY) edEA_/zi5QF"B,}Z3O@oS4~9oxKG-#Oj*Fv??<ɮ u1K8P3|ulZ򳩙1:rT+Uc5{*Z0HňWۻ]$7Qݷ#隑dpoL (? 䊺˹N 9%I9xҗP x& gyp7Դ,F ᵵ+Pg.\.=CM l%/ՎY$h8|?Tqr\Q6{>Dk c67 N?."v>Wx.ms*x9 я@=xEF/|SȖ3#wU!BIQe'8\eoۭP'E@dCB_!1q ObZ(Y-[h"*fT%OdRH7K7 $q"o, h@5}^@Ot~>O^ҷI<>i`DT~@T!'8@t/ZSU4ب^!bȦ41x­σ>ԓK8}ǐL@J)'9g Y|:?eܓJo [< rc XƐW7W&^7*Wetsq<p<xm) <7mQ ]G3$dڝk s>I9C$" sy,$I2 OpM@qޠ֩%K‘Z܉NDĞXXht:k'O7VNN-ˁ uOW1/F͑dW'LRYzNj_>C~Gls{mQG'Yқ~պ7R迏FR7Mk1ɕ %۲u(2j0A-K4ysdlձ>Yȶ!Hv1Ma?~}=y{/XŤ̤ (iVcVR.\>?Y?؇aTDFVڡ".z&Qux@]<2lS@)0bJ ^/ļϋKK]lnyrCϱXJ{c4ͳ1q/ [|53""x;;8H2;z*S;1hۑ??#fAcYil"p؆}ccŁfq5fRCx⩦6S0ogXUѨ_/ZK'egQX$O=ȅp~n{awfi").HO-Z[ʦV4A+QjnN4YB,%;.M}QSrFd?%wX lr`$Z]p*P03Ŝ蟐"ŗ*5L?+w{P0!{zb?iq<?/f]C*;Ovj0Зi煲n`;d7PoUGmƔ[=Dzi$uׇT+w$${#L ?bHF__; "$2m({ǧoJHt\y Pcۄ#aIw #d`~=Dc,OPЉuq E\I4 H8Ak."(#q$ r/;G!>id0Jsg?kOD@am2dj3cphҢma.b iօ\<2-:se)j 1K Maγʐʇo2t~(AC Y`BaPBI.&R+Poȣ z( 7'EͲM޸!˿h:ȆoO@ #S v/ W&u7I)74DppFFDsA۰6GGdLwD~0ιk&ȍɾGOx^oGOsA`%Al $gWw%]I߉@ E/Kb,PAqq<ghEP~c߈M;Odz[ Q ROT,pfρ'=k}R4G{?؁%zH?ٕ)}5GDDw8S.D<9?yJ~ҩa^oe/qnl">|i 300,?[S8MӁ%Do2IE*| pw Q27F?5́ IG4Q.|xY@sAu|PxԊa c͏SI Oj#Flr2 %ӓ S}C;hHw\u0{vyWYW˕avfkIiM+:]]ۭ6| D~`bPtbE:;!cmy.GG~Q;uĔ2;|f<4ɶDnBv&I.]Qۍd׀JimW/M;<[~JA g7Z[28ArT9`f:$((!$O#:߯/ƛYi׶fnUӬfՄivfv9k/Vaߧp_pSA!q> 'Biٛ'JBZf n 0ZiU]RJ55QT`JBeVT<ifRzE'`ee9YJ}<ǍL ~9LkDx|KU,&u]VtTD6՞GLQv~B"D*c$8?ă\X9%3ݚs+]xUئG=w"O[iFa.B|"N"W^ 6Cp#- I|!'~#~/GNb<2>ͦAN_^%x(w@(?ǩNl\V'}{9Cn:^} =?ᥟĢ>z&T~>@mzǿWHc%dڡ/p@ţo)a-O!(,@~&f12 ޾.u?S@J0̜<'?y| VUkwýgԌ2j]3m\JLG l~?ia?"IT 7ua3i}˶]QL(<\sFX)|`gUj|AtR}mlb[{,kkjZS( ;ԃj5 #l"?g DI ~^x'ӚD'OiM[XbWcBDȥ)yFs>I(pG=骶%-]B| pL%-X Kϐ=B$;aiȤg+ %9$%'/ɼ&=Br?-?_S밧g߻pOsY=;:ZG= heGu- KhL9܅{Vw8{K:yBcNlj'A:gp ,k9uN۝?!+tepBo?9Ғ;d’BPO&5pSOdd~Ά@5%o(&So eCyx fH2 D96CȾ'ij\FI~U]GI ZXLʊp (N7N/r9?ܟ6؞zb}Xsf]Ƣ) -P e\?N\!JIn *%%UOl4^P+^"z&+P!sե0)In⯟mv x8uaye<)q4Zr5Sأx>O&/˩}iXfa O` `M DR믢BOC`n2f8yia]FoDLë\ӵ9yaeB<~` 'l9|qU=<1R2!d+Lj@YI% NI+0 gv r.,mAW{^}pWLй\<~t.&|ϓNj'Gij]Ϭ9;\0T az%몽참9,8}/<۩fJ&jl8Y*|AB9l0ϑ>ol|));zl!ϡ5N%d@\Kf̎jC'Tu_̦ nS``>jZgZo:h{$J7n()FD+vV~tLJFSeP͏/-@sV[ξo޽(†QE\`AkO(?Nq\ZQi~FL|DhE+a4QP.?D5.N 3EW?y| N MX J\h|cQ<[SѺk 8%XF*@'e/>A4xt2#?,FM:rgϝH"~?7]x8*JF{/L%I9^aHR#֞n|"F*/_z('{&,p3 H63} 8 KM10]70E6޽] X9v:91 *9 ѺǸWe=u~^[c"Z~6Ϯd7>:?9 ۪qͷ:uA%t蛭L^[+=Q!:JP8w#(y0in@ő<q~&o?naO1";j96;:p;NSUXռ$d4ɓ/l Ɨ"ַgL,XW+>u n@uQӢgǡje'A ijiiZ"i(̨%2D8[<w gMMN">q(n"393I-B;vV~4l t/ Qq&[>[3<|3 9>q|Ҵ Uuvx5m,uEm^v"r7Go~AȜw#c,D%O/AאzVoƗ0?g,.Hk! n'S29Y] :P[!a+%rg'Ns4Š/Xg0Bx./1>/{I'>9ӟ*hN !T VX%sjk>*ì_e:3؟[al{.8sPh 6p>+u"juoCB`+$'Qhf@ĩC rj~zZX_=|t\^m:KA^7~6z*޳u|LR >Kėt{\vÎw:]Ҁ!gKZ0^S lXdxSk ) Q Kk `+]~} } #<.x*!~zQs~+MJcjr2qraFHް`QO8*ē~ԓlR~Tff5G}Ƨ)q*SBiSQw:+zO?LT~*ߜl>')IƁy¹_a<~'%}i())I]p`i~IJrR3Z_q9/-/A2قY[g$/YJ ?D]^Qk8ߎ%]"?d{Q;H3?:Մ豞BfӘzktm+ 1uufkbu&ݧY|,$#%rB*4KeP/lu;ukZam{}LIȸv:]SJj& CrKB]KIʾf oOYu|.:'9d{_Z~nri)u4μxd{'O3Nm3x3'D'#*dol\z3񥕕 ԃoқO"l,H'2B|9<E7FP V㐄 C:u'/1I/-Vsܚ~8Euѣ$-)F&`6,3^bA.FG?pZ-:b-$^=3Qw~Q9}Fr^q]5u`./iXr4^T? ,7}4އEĎob>+f'T*]Ox`'ė}ߛPnC:C#)*L1Mt̓3*Uwޥ7T3YVіW~B'Q<:W``}CWȽѤ$U -SԦh':şzy{l ۢx1zϮq5uI꾋e4?b-8Ww]ubqklT1\OXLIX` |"7.➨HW}wwy/3˕4iH%x/kŌgM{M-;VL݂U!܂da;1,]EnޛyiByp2 BjIJ uײFFgMZFҩ3lg<(N1'.~:x2?#N,r3XS_KL+-n=NvoՊwUMe0 hJ fJ ūhz>-.Qxܡ v_wR,^{O4?Q/+ZqUjQ5Yy"j̆]~f$~cf/]Dr\t^+vadۅvKq<^|E-(;;F=1\XX4&X~"CUyaOw0aQ$\G̙w)߾܉*nm?1O,S>XzuOv<;܃$d${A -=\LKgmX#깿Ebd\Ov/f+ IA:J|<]Z7XR.*$Zk'y_ BᘋB\2dޯ'1/_ Ns%,]5Op wqçLqAԗ/nR0\_w9VV!K)X7E,)V ]kfyr;,u|Oq$5-(XD~TPMd*\ʣCX uk#>C.}+%vpeyڥ@Ioz)Kqw)~ih~'<Ż nso}y*O>R|ryg70-dT9}@3**_Mh g.uN?/xD޸QՇmdM_,o}yG+[C𦪻,_g2ucfgA7U)خyڹkQ3m U;5uw2L;&Nyvk{sG? ;M H9P;U1T+>Oti0t&XP}fumi۹rUok'+~^ió1Xk~IJڍetNTzh[j0piZLJiK"VZ9$՛Y{Vc ,z\S96XApD-??GkϚNW/+_ձ7w$Uu홅Y,4~,r"J8GW banBڛ٢OTd/DVC9؟6M_P4]B@9?DaZ̜Ϥw}b-ؽ|Bb|^ntuS#u7m9`kOE0,lpO;ePLT؟ӗ/)dyL2=(ywnNݙ'E6ODy#;Kc_&(G[3[[S׶@ ?) 7iL"BYgŹ?(@4x§>χL4-Tg-T-fNZ"@gfJ=ɾ'׼U'9„ZY!m-@NV:^VQm]>-'W5}Uu= Q,hձ5qcފ5@k;9tއO;&tcZ&Z y_X-tO4;T qo݂|os4 d/sKo^oS94x~֒qX02Vj60:P5-ʹ$o;πlтQLjak7ϴbB6JՀNkը~UGIdn5X@󨰈IKF] ex b5.kT:1DK_gø|dّggbd;j]tv&qjM~il|K [YH~'` g1\~bR>txR;VR׍6ɚS>AY4jNsn O)f0ڼFC''o 2/*#=+<%u4)`%[ᅦ4SCޙ,4:Wpۧ]PP]9)d97]ˍNnbxIENDB`$$If!vh5K 5*#vK #v*:V 4 065/ 34 p$$If!vh5K 5*#vK #v*:V 065/ 34 $$If!vh5K 5*#vK #v*:V 065/ 34 p$$If!vh5K 5*#vK #v*:V 065/ 34 $$If!vh5K 5*#vK #v*:V 065/ 34 p$$If!vh5K 5*#vK #v*:V 065/ 34 $$If!vh5K 5*#vK #v*:V 065/ 34 p.Dd r  S NAsas_wsh_62ssas_wsh_62sb-Kҟ}j`-n-Kҟ}j`PNG  IHDROW%NPLTEļ̌ lml섄۔LLL|{| |\\\< \ T d L%tttDCD, D l''' tddd4ԯTTT,.,od444<:;i 3%}~LN7ֆ n |(t \<<><4z i(lydeHm ]EM TȬu'eD4~ Vؘ܌`%oьѝ|z46TR, H+ $vR%fd^\ցrΧ *zL^fJd𜄅n,t”Q5j=1ش|̶%)v@Dc|dh銬x'(dߤl(2TZ$TtV\ E~חt#<\g LJet~JLd|GR48gl|INpt$L^P4=w\&$ttdb.4Ll2,TL4bnt\L42LjDrĆT4Z\܌bdtJX nlL쾼bdlr,^l5bKGDH cmPPJCmp0712Hs*"IDATx^}#ŕnUKܨWj$$6@ ֝``/c`7`1`Xc]{^{]7v_9?}眪VqmB꯾:u**߸Ӈ@Q9Ϟq4G.;8wg.6gg[gn<.}fAG?OO{MA}d ew\>C{y{Cn3}sݰsoڏlƽͺpCsos>W^y|}OO+{Ww{׻y۔*w|?/' w5#+.{%ֽKm;mo;;ΏϿ/{v]pg킛. V`tFs=G{9缅] r1wEu>¶/UWO?>Y0_{$v`%W\W+_#X2D3 4x?s N|Ľ!z[Ň8S2!@3‹8 `οL|e;{s{_}_^}_}@}MO?|kh[灟R"$~0-Ic "`dvZZ,$@JpLc DϲF%2?|'䏿_'?*Rz ů>_p5̮oq 54sc3ny]N=>sF|4mixj?91ygt=\?)˵g9'yxV;=\LkKAI*I9a%{7aT"q"fwv[q٣׏x?i9}uKs_kO_&B*3Bk3t49!eXΟ8=!,iKa~Fg'V>db@e^"Zp|PDӔ7[9;H' d-m0 L)(*Uv_/N`Z$'jeIJFq͒`lTxPcۅo\)S1T!S!INTMό ,牟P\6U^);W+y^' Y𳇺=ݫF!\hqM9rmUz1D]2+3W5*B4< B+y-!mzk"HTg\lu+w)USöZz=:xgJr/tʃ*ݚLnIr^Me#]_EC,H6CvVD.z:t!߉eUGʣ,u~qAxFͯTc?(nZYI@( 3PJRV"`KdcH*ҫVr&m;&m?Sh(E5S3zkJG9G f/[~ݰ =b^2@?#>ES5]'BFbV/-ż|Y+ ]bS;:ɣ%28FI<<zwU't Rq ;'Þ5N{T(ħ/Mt_/ƟE#J><ԗ"< o_ΞMsᔥMJ2ua6B_ړޝGr/Ñt>4[t%jU5+M ȗI*ʐw5M[OR)&?Dd~Q]WswveU8VepCRVᣰ:8vSq4BfK絏?Xys,QF_}}>@u˄Qj婢wۍ!YjA]V_e*{eAoSR,_ßT?9[E5[t_F|U= J#'wSuHҼcN.QDeAL G 2KSp๤#<3t}*:~_ޟ?ȭ!*JKeKnK9Z.Qʤ(tJeOT yD)U-f99U? 뛐_lɿw># >_jNg*nʪՎCj޴VOGxjzM4$ =ZN|[)|X@:Jؐ$NUeqi Y/noœr [?+J%:$PIuЗCEe'T7i$PꛐSݾ/'<{}+RkJ.\,V%`A_]*x^/eOϫ ~┐>SJwq~OY2^id $޷w@D B}Pov! 6m=aORѭ[ eTy٠TFAKݠ ;pT#`f`Ap4g&sNjIΔDzc?5\1^ƶ9pLK1LMsGJm&l-2B#΂2$;A:VQXz37E[q^b1fv"մ?|dtdOKެ7I,y~q'ױ݊MgJ¥hV{UpyyVӫT 2=Umjӎ-uzT9xjF'*HYZhco+M뾺S{]ys-?a4ݖ,Hj}^՗kFˤ~un#]ocFSy'qs~d|"gyWUU>:㼚R9E̝ ϛC 3L}VV|Bq0Z*RW:jլSO:vJ_|ԯ%k( ED?wB7>0?=yUGilvaU`z +t^kj|BPr*S@k;NKSrO\#i=ÏOƇٷ'*.]TAK5s1Ѓ~U>*bx}V#?Ꝏ`qa#p&+<>ʾnUM56ȯRIU1\"Gzu5Wr5P^!Uk~ÞSUH`U<3#c,xOx{2ymufZѧ93D{'M' [Z>Os~4>nw{:xǝuc74MgQ*ј ŸFv(Y/X,~!v239!AQO>?h}_"F1Wd-=,SwA}wjHQZx_gG} Q߮z5[Pz5蟎7N=PsyO sj\XS:WԄ}\q++V3O{ИFϓLOPxY' &vC5Fft{fh|2j#-"8Ԟ\{_.Ui uE1gP?Bf>C !:3izfN1qc;&3O9. olϥ-j{Q?׿nE.NV.FoGüh~v>'S#;8?f̴ d&nS7.8)?'G\a5&fkO2ΪrVUڪVv~3s bW@5lU xʅ"g8sӍPs)I q84qa|3%2TPg~y)?G9cWB*ZT?G)ż-l4-`h"ۗړg5~i}`| ,;=HƇDb.k{Jɫo??i }8MuIk_Zzη cm;KۗI9,}_i ˉNߝɭK^G}sR.lu.P*JV y0 =?Eq= {ñd.lO򷚝7/Lr{H7gEwwf|{.DZ9W;fg2{%; $/Tb;v2Eqd 7>nL$̣#! e eMjL\)#;`WjP4a@$]hzl\^fLZU{RnXH>igOɢ3\!-z S?^' nR}O%>4myOL3>_/0NAAyY&<;=ՠ 'o&־xj:g=y}\a,|)WYir%ߑ+蜣8Β 2.w$O-l&5ͱ823[>*Sқ~4/mC,Oqh_<cO|ۍ}!+9?|hd 'm~GK3z&w3qb2yK;{"9w}z&p2+q{Ęʃa:_GkF$vv@^V{i'HU61]ǝطbZTJF5洲TZ:Thh5 -L~ =Th`WM\h#Ymd;O!%sj|ݔ}<83}pKY;.R{3M-7aG[ѣIkO9?ÂAf>K?+xmhauUF[#SjV[N3 >|kqh8KO`i >s9R?`oHVV~7~\]><'A!>tw'ɮXO'olg׏5B5PwiH5dΕm>\+O)<Ǎ곅(צ* u;{|>|~Kd#,}@dgz'gV\־Z>nqܞi…hX%taq咇1_*gKEs.Hu)L`>q]sX?Ny?; ^52bc~`Zg?gӏ{|E C8^?i 8NsP'8liebΜnSǽvMCfEcߨLf2NՏӾ1q2?mͰ{陙ɀ69\d_Ds#8qʼn5XؿI?ׅ#qC;kz0.f;)bߡ/%Poq0Yv%XXOLqTcP 'vw<dߧGSq.q*#m4P9qq}7L6uk㦑wfBnΰ2Ω'}c}GЇCǛAa k7~HK!5Z2 ;tE@wZ(nu'B8~܂6aTLf<(B,1e?o:Xkۮ[Vx& _X\VPmDZQwLm;r2M2Th5w>.Kn-M\nsՎOC3R̮9+y*Թ)'T$m*T?{rj~35ϗ,u/MqLBK,59D⨜֟I[I:I B۩وix܊q5y>;m'~&*>Z'< sOy!ѺY̺ҾSE 8Dj{h [S'/Vi3Џb`na]Cap 6@Z"uEmM#MRn'.):CHBGO~U򜉚RM9hD] 1F~)G/of XpS4Iaƨ.#@ ~vL;}GW Lm"c`'GG%QT3.Hă@>_,- )>,>Xw䁲GXSQgR ,7H9Cƅ<sԬfžɍ0(ψe,W~ t/Ql88 %~+I6{NrI]"3( }>E? cbo >HvnN8Kql,x{M=m9&;3&mX\lEϺsX3Qc7AJmt gم3~HWj}SrxG^?ba8aGX6,jtDDqTMb'Sb3D$: D3цk!Oީ K9m$q݆{{Dg,Vr&f'E#{웰a|c;EkF~G(Uֺذ][xDJ2J^m^Zmۦ2-TYsѕtnM8or(eVFU>AFX['RO>0.__r?R\9G$WQb_@HmԮIs*TNMRH]Gwt Β?CӨAZmGT2)6ˏMQg h\YcH*X}\**\!1)b'$i}UJE54) _f0/R%]jBaxA V:3^z4hkԡkYKF'p J ҍuv0 `;džkF!Vmom0f[(z4: "e؇ `g/$j&Ie| Mp~׵v`NM/95Z E>OYK Hk䖉ͽ3Qf{SKґDxf@AS"B@M{NH&ay˕IENDB`$$If!vh55"#v#v":V 4065/ 34 Ddv  S RAsas_wsh_070csas_wsh_070cb4){f+$n){f+PNG  IHDROT5uE,PLTE̶ܬĶ|z|Īlnl̶|~|trt\Z\\^\̄Դļ̺TRT켺tvtdbd~ԜDBDLNLljl,.,424̶DFDĪdfd<:< ,*,LJL$&$̲Ĥ  464ּTVT<><ĦlfdּڼԲܼԶLRL̮ʬμҼTND̲ܼʴ$"$´\V\ljdƬƴƬҴ̪̮ĢܶԾĮԶ42,$*,ʼ¼ʬ¬|lb\|̾¤ԺeAԸbKGDH cmPPJCmp0712Hs IDATx^\CX̂VmYrC0HH8BBl}r?' { Q7o{3# A4Gdy^lmdLڛ=q4۾a2(Pu-#xjcCz>!uhphGS{DOU`DçYnޮrjt`w ҹ ÐDi(%aXjw3c|^l'ҕ@@o뗉ڎxzAhxe9Vd/̎ѠR$'+󲜡)YG'!&`8 8A1LGD *,ϳv}Ո3{6ZHSQ1YN[ZYQ#EYx$y">jDTADhAUX[fЭ*K!*rQEz|U9GÑ;_\XU#iևxH0Ƈ* xyaL| j$d4r>.yɃ݃&4a/_/n)=6(zO *1Q8EiV2? (|eрUL(ʡ M\,ϕQԎy-kti4%Gjv|2e%t"YF({֊xFWa8^Lie-sx.˺6)"![heDªY@l=ǧ\2|?'SK^[MPeA&Lo\ }~RI ܞ`AER8fxf(c?@X!1 qJ+lǧRBp%>_C EcAx3>/vYQ| ical'/F4J\aèai,43;mSK U0)Ǩ`w t3m:H _k09;aiۀ,[wbӓ<9k&)s s2fj\(}'4TTTMzm{V9h,b ɦa>ufEZb?zqahڹ%I[hR0~M(<.\bw>!5,IE1p;c",I@>ÿ,2_Ս y($mP}$v}XhbAdH<٥%K%!'$1LYnLM$1E B*YVz xÓx`.QDˊ&DZ?z.qeWK[ɱ?vEQlhu^tK7:waF|n7|?[V ഹk~o{a9E.xpwx57%9|\WcߞzV,zg'?F|ngU|JL>b<=m~'SOVIA.8ps;x#8e@˙ .{k/lpڊncر/9hױtwLJwngZugZ.ok֯ܫ]m.,yD,'hz$^XGE?\~oջ6Ŷ+f u]~Mwl>5=}xn#麼t-E;zyHKہt}#]OI_{vemv畽l:v|)ÝwW7E-v}p?z˧;;nG,Ʋ@/~,a;io!>齞{Mqz6ء?oVo?俺i,ԅi12kYwEF~B_c1;ׅ_F[J66=weys'ŭoΖ:|ޕyP艞>x!qMv9xucmU+{;Cv ]W{NY#ҳ!pթmD\W|o'<NߟmG]%6!pʼn6!i ȩ턓tۉN4,96"so|?J[[Z^YgB52-&Mzv$bB4Dc$5?.lDf¡h̗i4?Ofܡ5ow̢>R!N6C P1Y(n/0N+^RK |~E F%]io"IŋٸŹWaڈq xkA{5 val1xIO7qAR" U]x2ȅYIUo䘦SVb O9ɻaRieM |4+QE"*\<$4VVHs+/@<~i,+dR[?EQ?'zm9AK5K!Z~ԩT< DWjy; ˆ}{ՌO OwVm8> n ԺW)/Zxr(]J|_&('GJv|3g[C|LͯnNZn' ZnオjR ՋI'34Lx2R)^{(W{cS%*##]#*/8x}tT;888888888_u̬DIENDB`$$If!vh5{5"#v{#v":V 4065/ 34 1Ddr  S NAsas_wsh_80csas_wsh_80cb1鴉 k\0n0鴉 k\PNG  IHDRO3qzPLTE̤dbd424464\^\lnl,.,TVTtvt|z|DFD|~|TRTtrt\Z\ljlLJL,*,LNL<: ťxBj㺘('SoEd.:-. 7$*t!*2 =R]$@~b|PG|DEŤ$B틐> (؎M?KEJK h{sZJJErZds C`D&=YҦVGedƴ! Iv'^"}]NSj~цidMm F 6hgBs9zԡ;aN xgϻEnk ymmOﶺil4\y-yN@dzz&xV_|;DB~,?oÙ!?yF|pl{KTu;iY~ =iVqٍGRH]ndU+jfRDSSi,6/k2 8IW[mYn09)Bs;'{ -NN8qK>:93G|Fs,JK+\ϳڨ[&,S3wg[x58l %, g6wLHQM74ޛ\r3#m2MM'GlUtA\:w~Oםxą?g?W㉎ H)"!?C~^/nS"̯ zޮņ3wP~nP~-[<?mC>Mp)ioo|!Dy4"ђup<ڠ`vJB''mڌ$L(Zke|%tZɟdGR!&!?^&d[›B)xBQ*'|<.L5k3՚֣6G]ށPzUWS A4lM+ҐK)XE?Wkf 7x¾5tkery*5NYŐ,3_VGuډ%i.4c^c^4YlP~Šjɵdvf!z䱪(h(?$4fF^)ִL(?w-3|fmh.X~^n}O! K6P~.^54}k:  *rӧhg>$\)?1d9UhC&" 9Fg[-r?ćŗw"X;'Ώ'Bf.zeuWg*c$zFmxoUAW*|+WΓԣ=)/?꼷1Xi 7%@sVx&pI}iuډmNK9tOK h?mmVfֿl{ǔ"}BQfxM ^:ƏIrk'ou )'BQ zS ??xm< ?sI))H&Rc_XkI$#eƓӍ-m ƳZO.LG 6UKC~I_dLW2R^X-x#~Rde5(?s!.v쭛IaӛϠFwދY桟3:1ĉ/?_϶U?|N|L s/kC4 M+QM0|ð>a:_O$AoZO꿗%^5Z*xsk)xOǝxVlÏʥ`CN7^'/i,UTXoX" Rh7-l?d64ىM#6!6BrN/wrO˂꤁D>  6sOq|Qd84c/q/XIL㹡x~x3rQO|֝ Gdze':N/B#T |'L<$FHSRnF2nOo|i!餂5/H<*i%_lyawϗ_zHRzj͵_&O25bCyAb!7{wv|e7>cOR;G*|Q+؟{ O?ux~jT꡻a# AO:Ht:<3,ޗG/}ux"~FYO.;i_;ܑT˦oeewj{pRY&_=Պ8}QTTy\ke/IOϝY[eYZҍ|iF׋0iෲ*sޞb 0'c~js]7"'Q絼uIQAENfx:(,t4q~W#4cʨ63};;"O缝Gwv;,IiE)m5 &i o9Y,l7/[<$Ô淸N#~z;j߳MBOGyv!)笮a˽hYNOReWUO9<=3WϙfDG9]~^IS]dRVZ8ᒏ{:"`I8]_i1]BN7?g옕5;%~L{h&DO*i؍wHF*rJg3nz"vvF⢻i[N+q|hex`Ie*WvSA% ^DsSגUDfaztY^E&U~ۻ: ;P'ڎO27];VXt61 r 3Ya57r"U8}N.oǠnx灟 32|*~d$*WMNOdq\C 'e?45Di<ΤSCԸ"ⱔϗ`> mNKȫ0qj&]jxIWsѵ9Vڟ8#֓EX~ oK܇v~V z30.z-[w oȯV~~>?IĹ0$|^O hpRU5|6_1;^k_?d)O;a;)cO|xh٩w.ˀdU;kk{ТYϪHxJr޻ ~ΥΟq0]3ňo}EDV*yĂ7TZ 볪D'G"'AC0E;[x[<YLc UG60~ZM&\@Fכ,-g~~BԌ^ɠ8_8O[Y-I򁦈xo/ ?bjNN ?mkMF'UE7lnɼ[zvgy~?RKד3Q~He%RCH3Дdp~yL.ߒӸ/Rf>YS>SQ8IՈ숿*a|.k5*>] JVZOΩJL·' V a6jCZSbulJNBߛ)$UuJgnOe|O"E#B"#r%L{gN[t*X)?iNGOl^:RfA,,x!sC9JPigF=t ɂWPr[tS!$C"b" G }xGxߓIp `>r|^~JjMAH&b_}Z9i4~&Z7/?VJ:V.zQ@n~UsMH f~AEт:+ej<]ɗ5E7F㗞(bv2 ^7uEݴxzuC/X| 25 ?ʎk~'Q.JDE#qԱqIy z4D? mDW6@d٥{/:bR;Ɓ TE5ywT9mܮ EyOGf15k=(Iyua*Gqx )QR%q{t!4[ pO"`T@gߴ6v$FIh,,*Gg2*`= /\Hݴl 1%YK=I-H_p;ɎW/0Pennb!sbK-ZY@޽!xEDO7C"A;<k\mh؆ڛ+D*T$dTyZc9c<1/KZq o1a.J`R%LDXn(G-Cx h74AL)E]n$EM{e* #cɑ_d5BjȪKʷ J<B"P>km~]US  3ZYYO-lðq~HJ|+SuPT{q^<.괾o#R}A?ҒI1#J9ٌ RB\<j}ߏvA}+ h:V} g?a4Tsc>:SA{h )B8/P37]gY~qzD""~/SYU:>p@OX"LTB~]iw3poކŢT$EkΐUnԄʐg5"fQ4hMńD$:Az\z& |٫ԯ%! |&hiB) FP>C4(wcL7D,K|:yڧDC"/K^yM 1Rł!S$cz:F'a 딏nӝȎfyJ־گcOR)FN+-tQ1J>@<^o$M;&x9N`ty_dI/Z&B|3l#RKz):<u/w4uW20-Xi!烫ۃ9gy+l|!09*j"ljt)Fتl?CVM1.c#']T [k*C t!ָRUR"MspDXW]ۧ!C_>Nŋ9X.b(jXRB 񥞢H%7iGi)\-#D"W}[AHܴ~Si3~.5P{_!n]@~׍O5+GJ$H$G_Gcr-3C4d'W׈:.I=DhQjSn\)?V64uh'=,C7yn?n|X5^aJ7? BHV'Cuj+~%vÐnV%6Z<.Q>@H8%/>Ǒ6 ԰YQ rrL)bwfڸΌRVr0%a&"Xi`owy3һI=N.(pS͖ZLr22z!.qC~>~uxǓ;Qz&/#SDXFB7Ĭz]VN[zYw|yHǶ jbԹу*'J6"UQd(e&fu/3O~gb!ՍAWvrd}u!?Sa~Z3s2DPwkO/?a|E7On#tcyĶO/? +h~M6aT`7>F6Cr9+rUbAѠLd|&#G[6tѺ]E>Qo8H:^~'IJE?c6-a)G>M*mg(?>cQ͎Dc>Խw~G "@G``H1:5LJVƒ'8Ӧ6*rG~NY/DO|TzGaRjp) ul59]qs¶TG8GQNoG b:R$]Eg"2]WHQ7~"5mvY'I%R7'KOÈ픀$DxꍀNXdyӔeA2`o@$1_;a9loޱG(b]8&V}& ,2pP`LNZB~~];pG@!YJN2A'8Xt*}e?:ؽ~}%އV>`7,щKh]R唟K赆[x)?;[Mff3I|SMn!ve&<“x 0N0`8npV 'GOfό'pnѽכʅGfcN|-W )^כry#0=t(TI՚#?D~SG#`: 97ܼXH0YȵQ؅vox'ϛŤwXICƻis*KܨӲBI:iUUUC&RLr^D/ T |&}|'- ۙ| 5νP{M7'0BTO;8((? j2䧟V>^ʌ.o{Oy 6Zrv77>vXKC~{$^MKm6U OgݹLN7w#>Gp#>>a,J]%OOg0Ģa xmP| if3E hAh6[L(G/u-]?+a~/Y.QRl2u[vȾY!?;/5n_#j^k9~g[e/Bf#b5359~5X߁|7"JZIJs_G,P7yI؉RJHdh!?9XoPrntO}|'s͡g'OM-q悷JՇ}(vɇ\rx#9>* ;F tj,j o!?YOf̚=B'/-zl<vjrt| Ayj,EM5"@?&rv=3 P(szJCnÓsS?H(?KDs$R~Ҵc9)FSy`x9~֒4kpCV+.W̉򚞸|gt WQtl ]& @fra_ZuKYQin^1_`_ ~UW{U_<(_;~xnlH;+h򡦻1-D D D D D D!АqMi.;!׹ima*ǝpDP.W椣xR^q#OE\B Kp\n+1f b*S.>3go(N8'.w:͸W""#07EHb]R_~K ٣񉡝8q\T7$mp3C;5^r9#}y'\, Y^qi^q*3V=O?εש^qcdtgmEs?!pYN" '3Khly(d(~|  pSD`{7zu_؏w>Z'SG9R֥)q:wʥ!-.ZK 8{bESN;[z;N6w80iZ;vNz/@a)xVgIk4ۜqU O @ʼnک>4}0)W.2sq+8.ao(,P,sz>qFYʟo|fIENDB`$$If!vh55"#v#v":V 4065/ 34 Ddr  S NAsas_wsh_82ssas_wsh_82sbTsOSyVXOuOf)JnTsOSyVXOuOfPNG  IHDROBPLTEļDBD |ܤ\]\898dbdT׶||| 3t {l$$$[,d < C#}ttt0/0 +z$d $ L4tDdr rm\Ll hlml;dddKLMLUd2{TTTeu9ENe|dlԛZ{l[t=cfu\dl\k Jl)W>ddVudͿY ]$t9vuzIl8uJ|\^,j'^dltyD>DH|uz_}⛦לEIn9M'Dr|~aܚde,T4^*\&M8TDE1a!*nDk.my~,}tLt$Jx8l,2l<}lLNDBD^7Ftl,.TtLN"D♺*bKGDH cmPPJCmp0712HsIDATx^[Fil#7 imb#Gq v0@0ׄp;$3lf2=3W$VKjUR[*Wッ^Q'UTqI((f~L;I$᠓\p%:8Vh i~@4把MC`]ڍb8bi ? ۏvߤU7bi=U꿥'5ߺ垞[{=X~3KEYo2}*mMy$D@$ -Kn]Bh<3{nwbh.Ql`R Ku-(WﯯZukkC^e,RjlmD:i!Ksei *7X@|3NVb={g;dsݣ?($b(]7?Um:~V-BwwWfFy-0ͬS5Ag\ۛ#yXk,gccuCUCOp/4?\/LL43[NWkU K~#_('ehD=cߐ1?+c! EgtGowL4O4̘rz9OZ?vɌpf{=d`0cp,ܷK-7, ¦-[g't@ҟXIR>g~i' }e3#{r l{n<6J ~෩wi1WCJ>p0}IZZrZ8*K#̿ 7Fs SDc*E&#W(կeCꗤT7|tx{yHڗNwvFO}qegptw/'_RgG8t'X̻b;L-^toš~|O~kJ;Robhg~$߽}:<4tEl|'PٯzlGOO/V|:HxySo=Y_ҵݏv;&;c^H>qgR=ᅪz8B#1!V}J-]z/C_*pܰmdhC^SX>yËRN Zz`5>OlY2&WTE#[,pwTQ}ҟ.}Z'//h[w>7>\|X#46׾'BN]t1כ<[g;oltupّ]mjWHPztC:>/t;>_J~ZQ̒;Ϯ? ?GcvЫ]Bzr<u5^_ i}}=5K1FܻѭO?AK'ЫOP?\r!?r#&|:M~ET.phoʽ-˾Lax?uW(RO ͏53%|Mɀ80@LP&8p،cY r4l|Ns]8x|ɡ  m@,l?6<cȋ_]Յ+”y|~$.wn܈c7k3wݼ~X R%K,:u=v-ճ|Za jo}Q1(ܸwwA"  dh8ib/K˖.-+^ZRtmiqQq>kEK(OU6mPRQQqʄ2@reePr1`Y`votDM DGH.HKA'd_XVR%7ǜb >e5: qt # *e^.UW352Fr{*5TNv:FHQzZ'em; p@I(xu06P;A3nLxcrƘ83}F(@g$$tF1B(yİa p8|~<Gge ~*{P Դ PG;}5c ;ч'DѰOhA4+Jqͩv2,}ƂqHQ[T ٢Ah2+"2.j"]#F}~_'1mW" B_,N.{^!苈A"+ʦJVA9a"/a_}&dO2^ nw "_P?_@AIh-+BW }2FcD`>!@/<v1pOT~#'0j|hK×b_20" t OFO +][^&c(L({и> ;̀yiƈ2to 8C^ojM@>T/M/ fxz|HZ>#B y$` q]8M0|>_(,l|G]#.__ؔWkIX%+!t9M 7[QXXO=\idkdQ|Ck+H'_O34ZTB2vXҙXY)NS R u۷dvl irwVbFjyV\ӥV{8?R\Jd.g>57Gu2riUGz*?ݒMɣgşLN9t)@v;Qk\OuhMvfûu+ryڲvO;b wE65ǟhu&;Q<ӕΏ$Z]bsّ|P֧^Xi>x a7XauYDvX-2)SiN6,Tc V裴l&RyM0hN0{E~|sA ]aAXy%\B{gΘ? N,tHHiL6 稛D"Ntմ*U'%ބ/F'[1S+SWQE]kڈP3i\ğjl ="+)_=S߱P)93|8 22%|1Ww41c?'(VYwgni|Ӫ=k6iFWc?ƱM-t;~f̫"?JYMY3@ѱLkfv;HϦK~ #$Dl[~H9-F6ó?i| Ox[s. {)G?ĴMei]TMvVkğ R֊=GYYk4ӞuFbp,H/霊sZ, #6p/u9'^֠6xITbBoЉ) *4]=MMͼӺp?1j<0i~=3 #]Fvl|{;s&+?WtkV Q{N \\R_uap3oHe0E2'Po`V A;Q_Q앧dy9+!d]2,&s!&dG績7-#gq:;t%OMw >Z.:mm_tg,amp){~v?&{PG}fxӆ>LiKzu븾="jM22n,ND4.4trl~D><|vt $"$,*$\ZT\V\lfd42,<64 䌆tnl<:4\VTLFD~|4.,,&$bKGDH cmPPJCmp0712HsMIDATx^} cHF؅b;vc6$vNb''3Ogz_Yog΄#IWgSUun-+w:fTZVVVpRSv|GJ8<+@C[M`'Q\x ~~^#H,+1:!4Y.{$CĒD&ϠzN$+<τdʝ@/źd1x_n|#Lxh̺^9͝V9bQ/Y]*za]rz2%WQx{3Xc% ={u8Ovb%~k3bz2~|%?'6Ng[Yso*W1ʳ>0A -WA{K|v d&3l'KJqIJ eX r&πS0-Pf-1%t;*^x_`G@* $f&LdHbEYQ1vX"Χbqx'[=3}[䧢<5( doI(邲/0,OWgvEy{'Z=IT' 7o~G(ndK;MG6}_K. ?=H.#1:t*{p;ⳬ?@2!9Y;Z.<}ixӈ≑B;. ,Hd.Y`DR >ZT.>?7{< &"hP+k8Eh3y? Eޱpю#^4K48渚gO πQoD5@)gCSt:Rg3[Q"gI^a׋պFVLs,V8a̵CFv6ҺZ%Q5]R]TԴME ZR~#eO0 _U#ѣhhW鏆V|ih!ԓzPg~n:jd`g7rZIdy4]2Da2 ijYI5~|H$6cxK i\v:{)!vhgQTF%5jtQ*ѺD|X P ¢0ڂXoIQ6# |hGGaK(yvŢ|=܅{ڶzV6?3\K:ǽGwŁ+%r؟dsZ4hQtU=I< {;@9A')6˅s?b(R>tȱTeװ4$k~`!}.:KT`?YABHBS*a@ I2rJD:;킩"6VX3oNq$? $3T ?SuA@]e"j_"j.Y{;qάN#ªjD9WăDGfJ ʐB7]l|W;j?0m` '?z`jc U#/#o\͈aR$kJ_;;twEdC;`g$͎oTn`VN6[{mfwKv[#O׳71i1]'Pg`ixX{XzhI8y^M^Z$ *?! ±voxן"mS ֱGzj!)b4w䧥Ҋז%hv-6RwT]쫩~VU3qJui0s߹@~uq/h#vz7D7?=O{Sփ}a=0밝"P~fm@aJjn|쪣j.8' .("ݹE*_p]a~@T..")Pы\ kBZ'R##(B2"o7ݿ HDA؏Z߭ːI ;Qgn 1σ酙D\-Q۟o? ėB(Fے|&oSxTCI}`){Oڥ &_-O"?)G#yHerR8^>kc!G{>y!Bܕ<]7ޡ^tA1Zo =z |JkvKlt\b1ޅc˯T2yc|%^1!^}y5?Yn5 pVjXK‰WO{+R}CW1q.2|0T~\UM ikrP;p쩆|*|[O!%Á;)Yp@ /y?MT:d^ޛ Hwn[tXrRUQ(h Nsr9I g2ߥ~7ؐ_Z|g"Ժq2۩nݰS)Tj{^m~붕JW e֓]k k(/xKm ft5ͥ*m-S)J.?Cx˯ [P)p|!Q97"nC~/?eڐg5mq3҉gz3Mw=gܬ̜ǹU s"$V(҅XԼK7R(O.zpj %y#oAoaM?LG4㥿9idXubgxoNo/?Jj[n%Mhk1;Zu ]qԏ5?JC-!?qdq<_A~vU2ו),KskkC%rҟK66~p{l\96u}T&X1d!&쇓|o9l ^tE:ꉐz'30e/+S+w@0)j(XI0<i=lQ9JjϓT)yn7A D8cˁ iq<_ NwW(Ӥ%S~: Ш:1GW M6' j84:0{:O^MݜfT<ȱxȹ)IdBq{O#?C@'87O"͹gTTzv<;o6#?{?qN>n)^>E:N6 lW`] p%|HTǫMl [P~wLh'tQyBPڧpa9Jh~H4a&ߠIZ.z:^U._?qa<15'7SHSʑ%H&2fɠS2^dB"jDHa&aj4Qkq}?7m BOaJnKdEQ83d|YHOKK)5BS/oU?'& I}drE<#KLAP"l$y8 )ȀGQCDo+*.V&a%ˍô#_BFUU%S¨Bo'icU u01:|ιd_υ흀U\A;?7E[w/F7zܳM!VL,+-q:ėo6M,-;DRaIB %OŃR[vL*k|$ TAӊK~.GTǿj|oǿNo_דo,`{>y|\jnf/0k-ȷj< bU',] EߙTT4,CB׀!V >w S]y/7/&RiɼxQK/,PFCm9 oϪMu~VY) edEA_/zi5QF"B,}Z3O@oS4~9oxKG-#Oj*Fv??<ɮ u1K8P3|ulZ򳩙1:rT+Uc5{*Z0HňWۻ]$7Qݷ#隑dpoL (? 䊺˹N 9%I9xҗP x& gyp7Դ,F ᵵ+Pg.\.=CM l%/ՎY$h8|?Tqr\Q6{>Dk c67 N?."v>Wx.ms*x9 я@=xEF/|SȖ3#wU!BIQe'8\eoۭP'E@dCB_!1q ObZ(Y-[h"*fT%OdRH7K7 $q"o, h@5}^@Ot~>O^ҷI<>i`DT~@T!'8@t/ZSU4ب^!bȦ41x­σ>ԓK8}ǐL@J)'9g Y|:?eܓJo [< rc XƐW7W&^7*Wetsq<p<xm) <7mQ ]G3$dڝk s>I9C$" sy,$I2 OpM@qޠ֩%K‘Z܉NDĞXXht:k'O7VNN-ˁ uOW1/F͑dW'LRYzNj_>C~Gls{mQG'Yқ~պ7R迏FR7Mk1ɕ %۲u(2j0A-K4ysdlձ>Yȶ!Hv1Ma?~}=y{/XŤ̤ (iVcVR.\>?Y?؇aTDFVڡ".z&Qux@]<2lS@)0bJ ^/ļϋKK]lnyrCϱXJ{c4ͳ1q/ [|53""x;;8H2;z*S;1hۑ??#fAcYil"p؆}ccŁfq5fRCx⩦6S0ogXUѨ_/ZK'egQX$O=ȅp~n{awfi").HO-Z[ʦV4A+QjnN4YB,%;.M}QSrFd?%wX lr`$Z]p*P03Ŝ蟐"ŗ*5L?+w{P0!{zb?iq<?/f]C*;Ovj0Зi煲n`;d7PoUGmƔ[=Dzi$uׇT+w$${#L ?bHF__; "$2m({ǧoJHt\y Pcۄ#aIw #d`~=Dc,OPЉuq E\I4 H8Ak."(#q$ r/;G!>id0Jsg?kOD@am2dj3cphҢma.b iօ\<2-:se)j 1K Maγʐʇo2t~(AC Y`BaPBI.&R+Poȣ z( 7'EͲM޸!˿h:ȆoO@ #S v/ W&u7I)74DppFFDsA۰6GGdLwD~0ιk&ȍɾGOx^oGOsA`%Al $gWw%]I߉@ E/Kb,PAqq<ghEP~c߈M;Odz[ Q ROT,pfρ'=k}R4G{?؁%zH?ٕ)}5GDDw8S.D<9?yJ~ҩa^oe/qnl">|i 300,?[S8MӁ%Do2IE*| pw Q27F?5́ IG4Q.|xY@sAu|PxԊa c͏SI Oj#Flr2 %ӓ S}C;hHw\u0{vyWYW˕avfkIiM+:]]ۭ6| D~`bPtbE:;!cmy.GG~Q;uĔ2;|f<4ɶDnBv&I.]Qۍd׀JimW/M;<[~JA g7Z[28ArT9`f:$((!$O#:߯/ƛYi׶fnUӬfՄivfv9k/Vaߧp_pSA!q> 'Biٛ'JBZf n 0ZiU]RJ55QT`JBeVT<ifRzE'`ee9YJ}<ǍL ~9LkDx|KU,&u]VtTD6՞GLQv~B"D*c$8?ă\X9%3ݚs+]xUئG=w"O[iFa.B|"N"W^ 6Cp#- I|!'~#~/GNb<2>ͦAN_^%x(w@(?ǩNl\V'}{9Cn:^} =?ᥟĢ>z&T~>@mzǿWHc%dڡ/p@ţo)a-O!(,@~&f12 ޾.u?S@J0̜<'?y| VUkwýgԌ2j]3m\JLG l~?ia?"IT 7ua3i}˶]QL(<\sFX)|`gUj|AtR}mlb[{,kkjZS( ;ԃj5 #l"?g DI ~^x'ӚD'OiM[XbWcBDȥ)yFs>I(pG=骶%-]B| pL%-X Kϐ=B$;aiȤg+ %9$%'/ɼ&=Br?-?_S밧g߻pOsY=;:ZG= heGu- KhL9܅{Vw8{K:yBcNlj'A:gp ,k9uN۝?!+tepBo?9Ғ;d’BPO&5pSOdd~Ά@5%o(&So eCyx fH2 D96CȾ'ij\FI~U]GI ZXLʊp (N7N/r9?ܟ6؞zb}Xsf]Ƣ) -P e\?N\!JIn *%%UOl4^P+^"z&+P!sե0)In⯟mv x8uaye<)q4Zr5Sأx>O&/˩}iXfa O` `M DR믢BOC`n2f8yia]FoDLë\ӵ9yaeB<~` 'l9|qU=<1R2!d+Lj@YI% NI+0 gv r.,mAW{^}pWLй\<~t.&|ϓNj'Gij]Ϭ9;\0T az%몽참9,8}/<۩fJ&jl8Y*|AB9l0ϑ>ol|));zl!ϡ5N%d@\Kf̎jC'Tu_̦ nS``>jZgZo:h{$J7n()FD+vV~tLJFSeP͏/-@sV[ξo޽(†QE\`AkO(?Nq\ZQi~FL|DhE+a4QP.?D5.N 3EW?y| N MX J\h|cQ<[SѺk 8%XF*@'e/>A4xt2#?,FM:rgϝH"~?7]x8*JF{/L%I9^aHR#֞n|"F*/_z('{&,p3 H63} 8 KM10]70E6޽] X9v:91 *9 ѺǸWe=u~^[c"Z~6Ϯd7>:?9 ۪qͷ:uA%t蛭L^[+=Q!:JP8w#(y0in@ő<q~&o?naO1";j96;:p;NSUXռ$d4ɓ/l Ɨ"ַgL,XW+>u n@uQӢgǡje'A ijiiZ"i(̨%2D8[<w gMMN">q(n"393I-B;vV~4l t/ Qq&[>[3<|3 9>q|Ҵ Uuvx5m,uEm^v"r7Go~AȜw#c,D%O/AאzVoƗ0?g,.Hk! n'S29Y] :P[!a+%rg'Ns4Š/Xg0Bx./1>/{I'>9ӟ*hN !T VX%sjk>*ì_e:3؟[al{.8sPh 6p>+u"juoCB`+$'Qhf@ĩC rj~zZX_=|t\^m:KA^7~6z*޳u|LR >Kėt{\vÎw:]Ҁ!gKZ0^S lXdxSk ) Q Kk `+]~} } #<.x*!~zQs~+MJcjr2qraFHް`QO8*ē~ԓlR~Tff5G}Ƨ)q*SBiSQw:+zO?LT~*ߜl>')IƁy¹_a<~'%}i())I]p`i~IJrR3Z_q9/-/A2قY[g$/YJ ?D]^Qk8ߎ%]"?d{Q;H3?:Մ豞BfӘzktm+ 1uufkbu&ݧY|,$#%rB*4KeP/lu;ukZam{}LIȸv:]SJj& CrKB]KIʾf oOYu|.:'9d{_Z~nri)u4μxd{'O3Nm3x3'D'#*dol\z3񥕕 ԃoқO"l,H'2B|9<E7FP V㐄 C:u'/1I/-Vsܚ~8Euѣ$-)F&`6,3^bA.FG?pZ-:b-$^=3Qw~Q9}Fr^q]5u`./iXr4^T? ,7}4އEĎob>+f'T*]Ox`'ė}ߛPnC:C#)*L1Mt̓3*Uwޥ7T3YVіW~B'Q<:W``}CWȽѤ$U -SԦh':şzy{l ۢx1zϮq5uI꾋e4?b-8Ww]ubqklT1\OXLIX` |"7.➨HW}wwy/3˕4iH%x/kŌgM{M-;VL݂U!܂da;1,]EnޛyiByp2 BjIJ uײFFgMZFҩ3lg<(N1'.~:x2?#N,r3XS_KL+-n=NvoՊwUMe0 hJ fJ ūhz>-.Qxܡ v_wR,^{O4?Q/+ZqUjQ5Yy"j̆]~f$~cf/]Dr\t^+vadۅvKq<^|E-(;;F=1\XX4&X~"CUyaOw0aQ$\G̙w)߾܉*nm?1O,S>XzuOv<;܃$d${A -=\LKgmX#깿Ebd\Ov/f+ IA:J|<]Z7XR.*$Zk'y_ BᘋB\2dޯ'1/_ Ns%,]5Op wqçLqAԗ/nR0\_w9VV!K)X7E,)V ]kfyr;,u|Oq$5-(XD~TPMd*\ʣCX uk#>C.}+%vpeyڥ@Ioz)Kqw)~ih~'<Ż nso}y*O>R|ryg70-dT9}@3**_Mh g.uN?/xD޸QՇmdM_,o}yG+[C𦪻,_g2ucfgA7U)خyڹkQ3m U;5uw2L;&Nyvk{sG? ;M H9P;U1T+>Oti0t&XP}fumi۹rUok'+~^ió1Xk~IJڍetNTzh[j0piZLJiK"VZ9$՛Y{Vc ,z\S96XApD-??GkϚNW/+_ձ7w$Uu홅Y,4~,r"J8GW banBڛ٢OTd/DVC9؟6M_P4]B@9?DaZ̜Ϥw}b-ؽ|Bb|^ntuS#u7m9`kOE0,lpO;ePLT؟ӗ/)dyL2=(ywnNݙ'E6ODy#;Kc_&(G[3[[S׶@ ?) 7iL"BYgŹ?(@4x§>χL4-Tg-T-fNZ"@gfJ=ɾ'׼U'9„ZY!m-@NV:^VQm]>-'W5}Uu= Q,hձ5qcފ5@k;9tއO;&tcZ&Z y_X-tO4;T qo݂|os4 d/sKo^oS94x~֒qX02Vj60:P5-ʹ$o;πlтQLjak7ϴbB6JՀNkը~UGIdn5X@󨰈IKF] ex b5.kT:1DK_gø|dّggbd;j]tv&qjM~il|K [YH~'` g1\~bR>txR;VR׍6ɚS>AY4jNsn O)f0ڼFC''o 2/*#=+<%u4)`%[ᅦ4SCޙ,4:Wpۧ]PP]9)d97]ˍNnbxIENDB`<@Ddv   S RA sas_wsh_105csas_wsh_105cbr?~oD> 0;HM +N?nF?~oD> 0;HM +PNG  IHDRO,ts4PLTE̤424464,.,,*,<:<<><|~|\^\dbdTVTljldfd tvt䴶$"$LNL|z|LJL$&$\Z\lnld^\trtDFDDBD  TRT줞|zt쌆,&$$*$4.4|v|\VTD>D~|TNTlfdtnl\V\ LFD $db\TRL<6<|vtljd<:4,*$trl4.,LJD\ZT |D>c'#v( A@‚w#4r\E<2 "22@h$$,S(7r/=CX@f ꄞXVDZ%>ZA6(P * 0ɈD,r\h @75#%:2_:DVa8\ դ&oupApKQuZjAE?V", YFWsYAN}$&/80jv2vR9yWcuSR[B϶p ϨKyL8V:E׾qT9ay*T*#fx(yMD'A1Vꑧ%<mpb#\eą֔g2z> ^锏nG"A'~R쵭GW]xNVrB.'rs#9]#w?"po#|ņG <-G<) h-(ל#x*܌G<'$E) ni. ʰ Vc(&)O*ڳ,,#?@'KUmBFu 8*mDa0SxZ6/ecb(wj6P!kn,#?if6*)MxJQnfӾٱf4 p XGm~) 8RvԨ#r@O?DD&a*YT~&XR 7g3H+dITM3 PG9YA{ڍd] ↢5V+ )f7F1~g&'6 gP s͉n&zIqqt3V'Q]w܆ ?/9~|.R]H$ أRTGciwC= B<; OIXHֿi|A+ޥ=?ZmX51KѱH%y׷ad\9?=<>r>Z=tnR(];7yʙt.czOs{'osk_\N&L:%vv..;ml$QbGwa݅-}*^qG5l&Wq~vj#>Ysu;tt;^y.BY22fc5lڃiM)i.wlnm` ogI+_yB܎MD.I镰{bh ~r*4_J˝K3~H]k_ Z8 oVx < 3V{bťm.N[` m#Uy_O0E ˻k% Zp抯!7r]""07? x;3hVCP͋wy .w$y)8KVX'B1fFʰAx.f.pZ4󑟋a|ko #oE'bgđq򳸷;т!Cx8>75O<"65 !S2{.(zGؤ!\-'OOMIJypY9+Ռx} }spݤ; @^lspEirU^%j5,'ޡY#~sN(~,{d5+hNg'kVUOE /˽K{uEU51̃T*sˆc|, :/jmT8Ƀ gd?$}Q=?VL'NIJjZvRHn+|ҋays'hg&ܵ]O(B+3$r)@'l̓;w`?fC%(~0O"Џ=$BR&AY Zۇݼkt ~~.MO o!aC S3E3E-Bg-+?5pȐ)~&MgV{6'9qq\2dϊRx"f}9 ugGLJXck]bOb хF'蹍+D~GUF !ܯK™?P? &UP uʌŬF?6l?qx~FpE 3D4=*DŽw<v;MDҙZ`(κ+I$㌊X?fSTF-DeOTuߋ 7PE"T'^7$uwZq '8bjzS;XNT'P8hXǶ"?_#'I X)8l,&& b^,NP~a@$Rb'T5xw0pdZ~ yUCIVwjIw2d_BZ:Zf<3^! 7?o~szvٷpZ! 6d;CI^t;G=ҾoOg^nJ#oXb։ZZ^UÂm `jtXC =,@%5ܼ.II՛qSSUM˴6❯)=mF4I';O-38Ѥ @8=3OO"2WpT0v 3FzAYj~0.;RY'u`3TPE羉8PfH&6T>cg9 wl-?Q> pՁo1ԊKhkk'+oG@%0o?AMB x '8 [(;xxz ϝsy|jݞ7o%1nX&0YM)Z6&I)~Kh5Ëw2˻jo3?d\64kK1d}Ϥ_2C9 JL*3E:s`"PSxfD_ܱ.g0>+WCtCvi퉧Xd~YW-lix;Zjɤ4U=UnG?yHGCe,")xN"Z\%zg()"<&gUC$>Ê DuNùg7 <R3SPDINߚBלfKF=]b j=Sk(TL=x >ZzZK_ H6aJ)M=Zjݗ?ߪB4rm$ v[./OO͒w?FgSmM[ᅵxzG.M";5$NZҩV4Aټ{]Y<]67\4n@S*M=9djMV?ţɌ`yGGpR3Pp'ԓ̴Ċm?%YRo?SRWryB/JVFK]6˧l.ɽO%ɻel]')Oz!g9C+}{{d>TVLAUs I+tIJD*7ck^r>{w )m+m\?s̿xnYynCĬsGzl|ŨdҫPxLB~kDOB<&H( M.4 ?׆gv.4?LQKG]712%?-c*%xGxw4<;+Cr&h kF~ +["f~^Aü^YL5#?WRڋrrǥᬋQlD\ 6"Q>Iˍ?x;/ ?Gis ZU^:B@` zoa_)/$ɻdſʹ\ 垑JƵTMI""`4~HGPgRsOdM3L$vJ:} {<H~|޼*w'J?~>j^۫د@Ho 0D i>PtDz }s{X~g"!`8æO=ut99gú :ch{ OǠs E0ôR@~.)$({?g HKQ!}ZBe;ƷphЏv{iz +k&ڏ#D}Ϋ$ 0Y/^iYSUI $5`HM!Y*U_?P8 V=v`9)?o*s9\2rB؟[[k/cxP~"['pN6/˞ŗChܤ~G VC`eG&['ۋ$Kw.:C;.DreA, k!=>A ЏueAP[ ex 3h*?j%9QH}s&b7.}:oյ& 4g%MJ=dnÈ]c-4tŚ1ONq4{{IX?ź rx=h&_hUA Y fT=v ^?<򆟱n.\qu#+ ]/3(?#>(BX_")lyVr*1Ha| FWx?~~y3ua V_< ˎI6󺦳>0O0D1w?D0 Ũ`*FQ^ȩB>Hln w⬈<1<G!'s+1p?^'!JOKړìEU(I:b؟\l90t2fBLCV3ű306{6?~JLQڤe5~_ɶ@ZOD応J?㤏[HT~>)]W qgv" e=7RyڸNv# ]v;`4_t|҇[тԯXU 9^J<jY9[x6.l d2s CU~D~Ƞ_ALߠud9|~gpќHTpYb? Oq@ F%1D܃1.U~wZ뎦 ,%]? җū~}s e(*ʷc-$+PBOLI{c.:pF,gx[;TIu{ ?f'E' Ǝ.u*OU9܄7ޔg7L&q AлnLPE xLM&vE<ܒK͓_8b)ȕ. S6[uNVyS 8믄!lw'VeIHU1FAm _ 2[Jr͏g =z"J Rz6?DXURqvg,s5GRbIc=_.BMϗ4$ |J! W!j$nC@P=v%_ޠvD9ƈ9ycm$^ux*jbSCf0 [f> 0}` 8Cq&O^scRr1f-XK\"bLq/6'y(Y2ngzvՊj!`&@B3~OPF +x$69qQJVJZp[ XFPpXO 2m84?' 0gi +'FR!#I)ԄaTi&'(//ηm_v'$Nok&ķKFO{}a0бrn/s;a&D~ ;[oY>?.?;]R&stP,ЯN"nK2{s,|٭V*Z7-9P/O\+O;I]Gs|_g??W ltI~w~t)z9~Ãs~t8i;.t#/M3Ʉf Xc~H{|-FqJ:\YÁpV͖B@ݮL?O}~T%''Es;Ɲ/ߪdqr{oޜ֓_+ZQIbXG}C~9+E4Te SV bq/V 5hHL_f5qcҕ a<sss>Mx-fwӴwȟL4BFs?y <7;ؙ F"]l>S ~[O@Gkm:~sR,*'̃RNM9׷(CLgNL4LVy#m_`c2M"nǷejuMꝗ;8 l5$ Fq=) ]\ڟT}k8[K'soAd xݯw4q Y;aE; Q>uB~3]j_P@*%*փɉl mKg(c$\$@(syx1+.~:ȹL3s ;0).'*C(1d$ 竵3>ݶhBLr먑.HGg@:tYp3$%̘TN̚vm3~báU- d+]47O- 0;seݓ%ܔD)':)iG^7wT{oٞ+\|W8~r /}_,~~nK¼l|g ~@ckG)SK㝉9np)fZ?W\ާϲu6ˏO"Dsp$N῾4AOC<7;hL9BΧ@7?ܧ''\S[-8Ნj W.s-H  XlZǭ\m?0 zHyzO B8e+/ WB֩ߙ`.9WTt e?q}M: |B6:ɾ=Fl ]ބ ?2?EeXOI|] v=#ժ`{Aq^MSRQDN.`ޚ'H =>΁ ŎЍ16o$,SQ{$@ NAjL LwܛۢÛǎ+.'Л*>Q5sL>W | hfstrM@L~S~@+?~ߐd>?8G47>fql4 95e "zs8%[pEd#+;'@/@ ̔LfPbI8{eCO'1O]CnSfJ-.FW8Ld c&/@ 8~ra`y[َt6:O-a1 a\ 3?$[/g6k@~{ 6: qϦ POpfŀ7Xe3&tgXکV9*# (yJ aTu:قN/ĵ/;kꞧmXe >)},^w^Iwߛ?MفIu1̎DUTjR凤D^4\xZՏM]9ѝ'E{/d L0SxoTpc}\᎓ {b8Rc, I°ڱl: ПJSb;f“ *&"1ϗtOx-G`(R S n KIz<)qyi4,a-/>#з0DճF^~? 1LkN˽|Xe9/ ?b41'ɭJ`ߑ?8 9rRź`Dܬ29 e?_Y⫒Ae9k۱?fkߞIgPJvcNge!v_ ?a/%?ٞ9}u?}HN' .BXP%'+!̘BnWr#') o@~YZ:/95_0[+>ω&VQ(L!0h=t3WZYuqNpiJs"y'^eςWAZJFUǬj y"cvCgXCnپh]2ҟD+BEV0gO/5(wp>fS,g? QM0~h"# "wUf۝lj70[3s`VgLL& (s2 _ÆqkrbkPZX-tR8ƉP%?5!*) IMaӄ]Nz#r̘0Na Y~-tZ/ZsW{:"%w"JQO\? + 2˹7ϿO5Ȏ&h">7BxQC+,hGO^mf3؟ŴxboFcb*"'~>QBvš9$EwfKs)32Ե܉;Dwxy:xD jc ;q:q5"iN85v"T[`: U q7ZF3etHj!)ij}^arx D=`)c,T\:^::U yOB.i:aDtׁ@Fwxf]d@vuWS'uC-i~2~OmX ?+dm+:_b*8LmSYT .Bs]rxz秮&ݤԪG"gV&S2;IRF #j+墕j&ەL:SE򋗟I'+UH1vJ]5_\UnQhrP`K'o8cqpj#jAr:܏8??-  ☈:oa;κS|xRs=$QՈ IqcO%~ABFm&Lʈ^?P}۟nU( xt0RDgaj| f\5r'gIXOzET`z;Ih̜]w_޼?:fNK{,*#Sz',#dS_}?7~oÓ؟|qx>`Ƌ_4sY<1w}C{<"#<"#<"#_8x=He@Rc3ou{~ND_ϑH]܃sbS: ofXZ޽]]~/ߓ y~uqyr35/[8H`p`9hKX 'O-ZLCfR0Wz<Qy -|l\;i1pס =Gތ?` An觵TonC].qYZ;Ӣ(W&N ݴ˥%-í4HWn KR] }?F~L%kNvwI.Fb+}Aah4gKve}+ubg;M8ә٬gtuO+;ec(t$ R?BxK DI""FӍVg1]~2~D#׊pa0G +c<᳙ѳ4VF:]H4 kwkA]Hۇk\i'8UajQ$\k3r99go YsG0uف8wqӅA5"<"xi:'u8\:n}9gu֌R3O}~\v*s+0LjtQkzp霃)B%*-)[ܖIkI 0EBY蜓Txx(ґ$=-!\.@"s0XIR@  \ NE/ೡæ EL]>o-3IENDB`q$$If!vh5f5Q#vf#vQ:V 6,52 2x34 q$$If!vh5f5Q#vf#vQ:V 6,52 2x34 q$$If!vh5f5Q#vf#vQ:V 6,52 2x34 q$$If!vh5f5$#vf#v$:V 6,52 2x34 $$If!vh55[#v#v[:V 4 065/ 34 p$$If!vh55[#v#v[:V 065/ 34 $$If!vh55[#v#v[:V 065/ 34 p$$If!vh55[#v#v[:V 065/ 34 $$If!vh55"#v#v":V 4065/ 34 q$$If!vh5f5$#vf#v$:V 6,52 2x34 q$$If!vh5f5$#vf#v$:V 6,52 2x34 $$If!vh55"#v#v":V 4065/ 34 $$If!vh55"#v#v":V 4065/ 34 $$If!vh5>57"#v>#v7":V 4065/ 34 q$$If!vh5f5#vf#v:V 6,52 2x34 q$$If!vh5f5#vf#v:V 6,52 2x34 $$If!vh55"#v#v":V 4065/ 34 q$$If!vh5f5$#vf#v$:V 6,52 2x34 q$$If!vh5f5$#vf#v$:V 6,52 2x34 q$$If!vh5f5$#vf#v$:V 6,52 2x34 q$$If!vh5f5$#vf#v$:V 6,52 2x34 $$If!vh55Z"#v#vZ":V 4065/ 34 q$$If!vh5f5#vf#v:V 6,52 2x34 q$$If!vh5f5#vf#v:V 6,52 2x34 q$$If!vh5f5#vf#v:V 6,52 2x34 q$$If!vh5f5$#vf#v$:V 6,52 2x34 q$$If!vh5f5$#vf#v$:V 6,52 2x34 q$$If!vh5f5$#vf#v$:V 6,52 2x34 $$If!vh55}"#v#v}":V 4065/ 34 q$$If!vh5f5$#vf#v$:V 6,52 2x34 $$If!vh55q"#v#vq":V 4065/ 34 $$If!vh5 5i#v #vi:V 4 065/ 34 p$$If!vh5 5i#v #vi:V 065/ 34 $$If!vh5 5i#v #vi:V 065/ 34 p$$If!vh5 5i#v #vi:V 065/ 34 $$If!vh5 5i#v #vi:V 065/ 34 p$$If!vh5 5i#v #vi:V 065/ 34 $$If!vh5 5i#v #vi:V 065/ 34 p$$If!vh5 5i#v #vi:V 065/ 34 q$$If!vh5f5$#vf#v$:V 6,52 2x34 $$If!vh55"#v#v":V 4065/ 34 q$$If!vh5f5$#vf#v$:V 6,52 2x34 qDd=v   S RA sas_wsh_110csas_wsh_110c bpYٹ!˪}IpnpYٹ!˪}IPNG  IHDROb7ڶPLTE̤424464lnl|z|\^\dfdTRTtvtLJL,., ,*,<>D~DB<ĴTNL$ ¼bKGDH cmPPJCmp0712Hsm>IDATx^cF7J$VQ&v e&՜ȲI8Y'78=v)3(%E_d$`93I1rK'fhSfj-).rߟtwm"45cb~F$#h ^!TR`{! ( 8aW8(#$ɴoa0(^P&%.&spM&^!(p()/BuB*x~B=GT&ڈ !v,Jdu"(P@ߵ'oTv4 t$>Cx+z*> y$TSߊ}%'|EOW]I{|糕| u(GLV`+Zx@ e),xEO“#e0,i_ >oJ^)VJR#i>T'dw_J^ȼP_)xH 'R@?]4+jYk`]Ⱦ"'Q pBV@HDNʝWŝY ]0Bւ,E/h'xPLW([L>3b+h*NqI+ubCTO10|=m lvf),xK*T*Lf+r(y9ǰ  O ]:yeiSmo߅9Թ}vhHJAsT^)SJrU=K ,2Wy;𹾹}i5z~Q9iG_EO6`]~E=#]QX9*HOv '9U%ZA=?SS^PY޵,>d.3.YF{ͽԆ)?vWsZ9]!Yi1)- ;/qkJXlOM!܈ FUuU)/ Njm{ s~@L8d7ViKz=wfFC~0ͷ+?Io-%ۓRޥ§[B[gpO =X6SN씛DwWvK9$SF~{Z S̿VՒy7N;\.ܛ|˯|zZNM^тVw-%VB=S鿟K=^u%;0<* Vc_1:us2=򮾯*;J"Lw-ˤFC<L"=ZvS * q1ܾ^,nlT߽Z{xh>Xw۞{[<[-C'rb1qY *oejZF~m%ݸ pMg"ňY*gE3Gύ3[͜',VhvS7zN87UϽ%jdUzzJՓ޼)xv,3ׯq z5ϯp<T5[g{K9 vոմ;xct|fVsraDO=#uexYW׼^/ih:l(n`N?zeS\ix7}9{~D'-*(.SqG `RG*B UPJ 9*ͩ\6V{Jo〢Vfa2)jMeZH\2˳2X 3o枬d<Ғ*;~_§hj!PO7R|T|e%rѓJ8kL_#,_:&t$(pLˮ]RkTctVr?CW\ruOi5/WO” P0Pb$ElHyKpDF|Lݑ**L9Nq=( 9Z 51icpNL/ס}d0cč!RZiXQls &wЫ`3sW9-A-&~\7;aI6ƟI BRHR:E$~dW %%~prE/Q')9P=gugW^&[(BL+:Ԁb[5i!!U3Yc&%f)@\@0J$隗C@[{n^%y80gvou DC0h>?Ob8@{ZeYlEpKsy#؊!wܽFߪk2$JXAH8?s)ZyyZoY@4ohu7ww,ynEx'{O ss_Lˋ8gIFx 8 :Gcnn:MemF'22'B]c$w5b1)n4jd!t|'ngBqMkr?g6;jX\aMrgIsi+p<sޟȵs69Vo+J 5r՜mWeΝF'f l(s'qJ\8~_g`:RKWV`8}UszK^O x9-UzOB%_pY~Hl:?fAћLB|7{hlUӊj.)d9qC )S-5WrX8-}>Gg@HTF\Nk}i=Q %ZP!>$mv0i䟇q~d,i=Soi3DҜC/ 'ŧ:0)PI$DB-V}ao8=}LKZ=*@ +ut<:V['D2Wmi%=MjD'gj5 hz5/7KRP ̩ g'(d3X*IB^`΂$ SN׷|[)_PT PİL;?p>>GH~d^b! Z&UUj)6RPn`OFZ3:&Z(.*L&U~zdX|Ca@pŴlq1]y[X u(Ԑ|ji>N4Ĥ_|5WbSjZFJޜEBMX֖Gځɠy~m;Z"!I2uYH ˌ_sryonf:ހDon_*;SrbkΩ_w.3cn)P;Iu=89dZp:*yxҐia.C}HܒOr:VZȅ4,,i#27IgsKPГÇvKXL0rA0vKAq}zlێp x8 6}qz!wpƹfz|wX+)?69Lځ?AJgՊpSk`M# .}qdBi4=A簲kIɎ'Td\n߈F,SZB22R8dJA.wamԣNK j%WujLܭ֩FX'ѱHO' ߸g&t^, o䟉oSfFP̤27k.Վ 䏬*z.)_jhn%_U+VE\#xKG/Z;x8Lj?H^}5BzrCx,R.a$8<+n|¥F;T1Xp@ Ŝ6iYe(u~Ю*IѪÌ?NoĽ` gAI%q%EE@44E ugS?RT(jqWWau3]H$(~@p*0*H_M -pFU}В'{I~Km5< C3Wc{c478zCpwh5X,8zUNK0"sM3IX^l8Ao@z 4+?BV++U1PvݕcheeiED՘R%x柈;ub8vhshl2=5K10P#6k-гՄ^PjU5Sj" -Z+lz.-wv:Um*17 ny?ǽ<330%wGVڗ7a݀ jyRy5 FfQ5T#Ӯ(-U jJ7%t : o~g>ٗ{V1|܁ZwG+}ny<;pZ@?/ jg%enx`PdϘb99zeŲuJ/Ӊyx4ғ"nRhYT& IwұKg&ɼ\Rd8 eShGrrKQj*=fBY'?ډm*F?%֙O*$/E7wǬ݇F9jdyǑ?IG|+C([s%y&dܩִEr\:f9g-l|nTN:uOzX,lIŮsLr o&Ô oYl|l1WD!L%')nD&RDzȰMzsN NKfġ$U5h_=Mcr7E|cډ>Q$n7Ey6yAR VcPnA(}"Db RkYPg%y'*DP dݒkF{@SЛs?wg`1"E 0 quJ'OVShfbaH>A#H4D$x` V?^|Z}9=I~7NV;`4KҠ:2}gFJfVQGXIⳐW;=*M3kQbQrPzXӫ)p<{>l] Cmi Y!D]Oy#G𪺷rW3}$j<Ѻ++uQj$Hֳ$~f綬G)!83ַ5+i_P8L!M|ʎ(er ɵ)sPlK'xyy+ !bZE5)|VӢJSvJ>|!L23GITrCj^삿NbV:u5b14)騱U\Y4zJ=Jeܲ&[eOJ lB9P\,ʬ$ț>;t(eZ@Y8eN?bB.&SR^ (#@W&޵^( 7TޓPKUs _DD9 $^D~W '2 "F~ٮUvגG9$ !r:\e{r uN 0mJuyT,%¥Dz%8Hh;nZϟgsOwwM?K?}zm8|6 t 'Yا$ ?ZG0gYQt5߂}kSo #**CΆ:'\YºL}; G=H*VS 9oቻyJ[1kĿ>= Ct>rրiZ! Z~|r!ӅWY2ou,T>D=N!8\ x!&JY aU=€xAAnIy!YQHm $wK\dN;[mL"l]E*RRd}A"5ٱvcT'WˁˀOϣ.k5+(;0y& =!./PNlz _"eD3ָ;ּJ7 wD"3?GaO~sIh;_P|ɨ%9PwCHFi$E\Fi_y/եzVX =6>Оm-u˄3/_ֵW+ot\jeoދ6Sj?ԃϥڧڧV-,~Z;}WTT 6ta!'Du*zDc􏏗St y| \X)Gg">jd)n6ă!>_ڎnX57Ms኶*Oee״ҚW/P$Z׼esU@j4]z/pֵO'*m2zjc A vAړ(&{ T~,-}Qab}ƕc)w6kO;P Q<%pBϔ'TE c EN% Mvq;JH -ߋ&# ne|?| Ƙe&"*{& 3hE uKVpݕ:OmG`c V3SIgz{s9jR-d2ĈPrYj:Gn ¶0Z a"O/Ŧ\;N͵y8W*Ht[QGSXvyvǚl%\%*(!(Hy.ӄ9gl)C OqAܮ(Yݮu/BB!e+D%[ n_Qhr5"{i8Y. խTϿԢ.a2Yz=hj؉% fB2s#tdX <_yd?_ ;#BE v{ D2r].ೠᣀavbP@U)x5KI2siz4һ$}I!,\^;mx12w%V|cN{Vy+,hHr[EbLUи au"cinƘ7cN/3-X?$?=x/>|v3! ǰ |s^RX2N?.TNV|9!.xpwѽnǞG-Ձ~[Ńt<[{[{{S91 ? |MC1W^o;p7m^^q[Ho-K!m.b@ $O{uyhIœm6JY1biƁ{p3tfksG+jMnMe2~IB:H#ɍ4Kzwg8 oySύ'JS_d=B.r1Xp-xVݨ 5gYƍ9i jgsik$N+2u \!CL];P2[gړM&#ɤ bb3sy:^@V2nJ~<:Ev%YX,J6w"J7h/Z,Cm>;O{|:…?0 ~{~@.۰/>L'(-|K@iq]yTBOޫF;80@|j`H %[CA&$x@8 X)'.?ɗ; cOW]Qܶ:Snvf(\`Ѻ֏,]f3 !r AܕK$e‹F*!ű<} '[A$p:ٕ$٪ 7ģ4 #Ssz3zTf( # 80I<(5Ojki_,~Ȣg2#_Q}.ܒ9I2xTϛ>:[~;dw[d>Z3הSY'й5姂gȓ LJ4>&&ߣ;;gX ox7d{Ԫt7:g:*!_균_P~[O) 1;p|JH%Pm#9xו\3/^jfevs¬8 &UvM1X CsA'_,]Gg ?0_Gwf,k>Z@9,QmEd^L@_S0IVW.E8~1xq! ~\.2p 4֞B0TٮAͻs[vx/R ,>z@2DuY4R;,}%QRDʰk٩[cZ=ιcfpa>41@"tmi1xD)wAIVLxHrw:oLC2,GU:u^y;^.`Zw;'D )dYv;9 jr wV?'-&6sa]{ON P# iStkHVq )VT||/|PX` ܓ)$%ƕ`_8d<@6|@-W|/&ene=ovJ$zK)gh? I/%b;WN]U\1"2;S'Ii0z}yh|4 HʲHrQGyĄ\g6?p[T1 F̔q'W ?gz"˃ܗzT@ŘWk%o\*X%§5&PqϙvR7|gW{ ad꥝?E_|eGHeoĸEJw~G^Ȥ`o$M"! B0B9?rQ33~Q_1dG !XQH89LDw<*25gt `LO3wTDq,|bG_r&얳=7e[8oylj͈g5 CIrN'3-:|lig'ف. Jh(t/=?ua z/{+:ҌMG$1u9l=QO1f,%a2,d8D4xi|ig3z+\#(S[Q ZKg-Nc" 2/%-׹ӓO{4uV/r#;DӰ&/^0|gq͋J!p|K0;B5E),r$Yq )Y◆:cgIJL;/[_6=tw~H]4ph5*mMmcXpq  #Q/N9>[ !=wts3?ꕱ$d;9i ^rFsr}F9@'LO䟕Jf^  +9#fzRk/ZTbҟ )IDVVT.?ΧRZk؛Hs)-?v32̡!:Qh?V,\n{N:qTrUVTfjy.)t+<gaM<'LYc$ر䲬Jf+@6meӠ%Q& frZh<2VV<ܞO9?hڄK|X ^ʡ1YQ>6"zwS?No{w p@-ڱC]};|;QA頏Tt%KйcSXPөߩ}7Jm莻Rs*CuwYT fzgU7\K__fJʥ*j/^S92~$b=+ժ1-Q48oz}T=^7f^zT~=|W}5ň5苬NلH*ɀ7UmOnMYU#M.e|2y,m,Ir;0v۽uX8iZ5HeRo({Qxt+L ]JکPdXk&UL$դb2I S~($fDztI8lKu«$<.*d,/{|[~O({) $`.zQ)DDH\ L)0?KM9$`AKЁzwvI>A'DG o{b2DK^m5nJՊJMkH tΞ+f 4Y>z}BiW<~Ww3@ KQ/3C꿖lr%ȄMO{`Bf28vu$KgK4OvRW?}rKaG~ѼG5l#-B<%%|%LOQhnL'ݤ@yj^_oo4B8^ĨA+xӏvI??H gx dO#0Ϙ='1'{e??hZː慑&{/PfY͐d ۭne,CDw*)%4Ggꟍt?|NPQFIHԾS"8u&"J 29~s~ݱ>3e:MKOA(K`SV r>yeT+rXw"RR9w)v~3kyn_LbI/$hr:#%>k@޹бyM#Q "~\0\?rXC] C,q{2ش_s>_O=k \ J W}O9mAl_p qOO@:ku~4)GD/tT4QPs;\[>PpOtchFJG!`|bCnҿTT.tYu)TĘ,V Τ̑Mn|~_KrFz_`nIva2^G&舱g !9#8g´-jdz 8*\_*HW=g~69y.302.ee SؖZiEE^".?ONB?oVvUƃ<Ͷ(PԋA|l43\"(|濿Qzlo%*3x`"h]4#כ|Kσyt9y.r|-f"dtJ%;}YQ}I/H Tb:` d4]\)5f7Z޹:vI%$!{؍g9iCs["tF)8m2,lW[ MeTZDӮu)N&oVD&?:>N>UAӡ*?az8p@brst q&|u'$gs`a$dlKcsJB "f=Uhy'nDG,Dd38(ے8DI?jgLTTvFq i}6h;y.2{CR ԊC 'l jV8+D|hZEPp|H; I.)›?#[t+FF˻m_.-}.& K. bJ;$oԿb&[}TB}"1Ew՘~6fZ%LѨ/9Le%IaSԿx$u|h[ZfuA2-Yt4j{KQޥfZ> 0OtzZ>ҷ :¼Hƴ AuVe[yR|S@:N/7Kwi|ӆ׼>WVs5 c#&w dc[OV#;ِv .DO_hK+W旗h93%')y*_ki"#!%`z^>iV{L.&&%qesCo@() QzZuLeG^/d,mJL LcلD(=I^^Ei(QL'SCƓ_dZyN;]0=3S3B|bǫܓ+O=;|%8-rP#[nufV%$oa-87S҂(֜b|SPYZܰNBη._ >I>K܂n݊ JR$-rGo!]OQzu,1Se%HއUv4~΃F4Hz3YŊ0XOӪz! Ew*zxMQ/UPx/pyAj? =ԫA%Hp<&"lyT^x+k_np&'}wOK̽tLz/ՕӾ㺃Tߠ~ *O;E+SPl% odĥ9m2Ko=e{\^uc֢֕/A*Kܼ~!ѹ3uB@Sr1FJ0&2>9 g&A'buwA%RYA%dlo+hՙ Z0׆( Sv % z[=%a/YwqF1P]\k @,,N /9[32nH[JR@Q⟧/q]R |-4Ψ⯪eѕlN{^|[2_j]*BU gg[BfXճ-^cZEE ;O>hŽ'IJ&r߀|?$ EDu t>j9o`8h;WR/7rmEIp\yL<hsMK[dbىd-UPPD%Sy?,V\)+8bmܱVlOʕl/\܎'?UE=v0 Y+<q^hzG~wѿt:gJ(g2GMrL2LRIϳڙ>Tq7S72ԁύ5(>]qTHy9ySs=0[)OC]{(A֣u3 г d~"Jzwo ]K|G1'p?Q8TW#-O)CO-G7"A77nL&; zx+]Wx1Uno~x[1O[级~?~zz kCm3@O,W\P79uyBOo&=eO4@|_ث+y|c 灻Ifvc|}~O6=4f֩7{SU{ #Y)Ey?#.ḺPTб 9TσBl\Z]emF 30dJ>F꣐QYo| j>X(jPCOfS#a{5o8AMFP!}?͝×}l|]U9#(Pcb}^p }Nt>\phB p6.|=, 8㍇q7b0EV~R˛J5_QʩssyY~>wpsM mok)X+fT$܊nۭ,t'|s.d3Y(>!cM{K=nFc_S933 Jgq~G+y}?sޖ 2zZǾ<DI@h-sIsa&Y۠Cszz13[1oZ~ r/ikNy;=l̶bTi{6.eq\?彅nj"׿ Y#0nڙa|G.F9V2:q͏ı_ȬNHD$|z'~Od/,CZuVM:+VkO":{jfD0H "TޕnrlH*O`.?7~w%*RRA#lDAB>OrJ?hq$ Xfl$Q$&z_bOr5,[(kv^)`~x%EGl 潟 ꭆ^Tsj>(gѰ[\jQQΏO0?YČҞFG#'#|/;'5AY[=I&y-V -T5_1b`/j'R7Q:",s'G8ALd&/yhiqƱRԅ7mW{˅9on%`>V@XPS&9е_??Ke㓠~K/{0Yh}*1G ٠|bJt:4 OQѓ/N}5ty'^ÒxUfi%SO7{<7?xV!VF~=-*qySO>}RCJ !y4Kçhm׼P {g#89ǽ~s}}b6|Lm*h!"Wt/#j. n ѽ~̛CK/}-fLkN|a|;aׅ״ʜ t;ិQ.e{-;! Ow;V8z}#<)5-L|QZ1լWJYQ`N wIAفђI) 0@&:"U9-%5!,ٵV-N⟪r/GL%C*+՝c_?X>=^jU >Ibw1蟬Ɉ`!ʯ{ ͅLSJK!>4{DQHDYgPÍQcEvR4%z]u+z/eBKPu>1Vcj5>S1${z`RA*RT "RlыfR+TR-_.@ #ek (ˁO# NR2\'Cכ[E|;?gNX/N柤,<>56t>^q3!Έ)?J 5_˹&Ãk(Gq?Y"}ھm4S:i\bsL ')<J<;v}ć@ L_"[:7vrQy\x?o?[,?ǡ>w51X^^M9/;IeҐҒO`.zR߁ZVllo )Z@ħ 7[,f}mС+ʎ]&1.|j1ހ^3bzgfQ)"f}pZEo~t)*W^ )ҵf^eۣ̍\fW}xo;e-Ur=_K-Ju%<񣂮DO>Õfy+]tM]WvQ]cE(+9efn2 q*kM-i5h~U C(.NR FJk>;#%UUZ.NUݙo_㍆|meS}c(F;WI|vsm(5C[頞I`\Jiu>Pr_O+FZzϭFUzjCSj/{ ej*Gj>ĎN+rCE] mJ~%bnzZq)E sĈ$#|VA&Y>ByE|i-·|#5ډS *X֦{5ӼulÛ=Vj{:ZXYQqS199vHc'oĊs x"`݊+N<b|3(r*mcCA3i:v|O|w84 _9R!Y ,#D#yP5k8&2Cn{B'xP9#kȉ>Ğ^s}43?}[: '?yY|?pTc_c.f)gNKC']6O3s пdsޫLRvOFFejĊk1$D]ޞ~|guyM>r}AO?~uăk'6G+XXuÂa{SpN,-Ρ',peA>X2)7:\\Bp|dq|e1 ^ZZʰid_Ze"t%YN "KU}N$w=Jx64g+hU^%UCPwc; /jT-y,THxȿi:<VzL&Ϗ~J(OSTpz6dEc. X+ Ax &Oyk> & o3ljhm}=ă?B x'##ѱyBڣ8GQ>v|Gx+pYģt/J=}#o Zpx?%[7 6bȄC# ߎʣDQA#p17Xn>_ OD2O3>}! ؑzSs徚ՠV\C|jo%2FPB.xvf*LYpN(]=?W21}5V /UP߁WۄO}8Oo >ѿԼx7қh^=㵨R5Y@=a7KkƧ OCRh6:pV l5kGqXLC<8C/ݭʣZ"^+IH/TZoa.Ɇ! W{{aS6EɯZY: jN1_ޞ7]3c,4sgo`ms2N+zsɖT> #9Ni}az6wDuNj'Y4 {ۻ8dk6ǔw kȕ&I$ua}+7Gg=% Ϩxo4W,c=Zn0ی7\l*O'^Xy6i5e ûs]Y^8i/r&G|3t8$[o̭72rs֙嘬w.|s8P<؛kOx/4á!yWLGju\!^RH[2BDOOCwsk"mX?*pWWU!pC pdrG+6?!{[NZ4a9B_ZBRMPVP.yc:PIBOC9MM2>}:a50l%[L} !~ !)w=v_. /xe®yNe]d{cW|Fuj^ T)QJx4U!Ղ'G5#6*&ׁ?lz%߄03wkww p1*0C@OJeV7}"a&tWa[zg^.?QE!*] EÙC~hA"_ =#C~S j7f{cffe~?P&Nπ%e7?>lGjcYk_U4`!'D.!x[tcZ}tyh +k%C[muN=͎ړ(\Uz?9ZڗF_hIi@Z}Oɪiδ~EҼm(9pupiՕZkP2POnQ|f$km8L|.<AOS>ݢx0JTc˺]b|r__[[1/N4 |Nx٤ ꟨ەV|D8y$Of=e ۠/Q' J~LQy!Q!ǚM蹙ٱ}lEaqu6oPZ&'K眏P ƧxNY*y Ai |5l 4F9/YW!=e4仌 $OaMt'wTժ^bjL&."U߬RͼĂH/=nԜ\h.>bdek"1gpAz}h4Sq%G|kio5 B#Q*uj2 7zˆxKݼAT澍fXezoFcGgLUv"RJ$Gg^*J/0"JIlTy++yFʣ)N3ߍT4 mLU4RYUBn1ת&'1vA|b|\{#V[ÊxE=n/u _w-kpMn Jq#}x f1ށx-C# t6ScP/N_# q/z)?/[(f6Qst1|;ߓSCzȣ)nb4GD;sXz?բ:󱉖S;C|pyE@XVT ;?4;vĂr`8=~;Mr7 _I<>\aY tq>hrX\qM]{Ovw0څ?L`sGx]qU>,QLr: %3-0>0o~hh3.8~M'8ULfYBeç.ruNrJza6M9-1r^Ʉ^4^ܑiIZz8;Nۻ0s ^p 'G3z=lwtr |縃Cx@yԚ};'϶Y[F' B+uRIJ&=+ O$K_"I,"_|;]^ҋgc|WD́ўCGg_)" z+/˸g&/Zo'ڃHK8Jh?0X=53ְM%SQ:4MDX*dBNԪPP\A±l  *pQdl\p '`5OL.3^I-pƧ?ТϘ:g.~+?e,nUE)-߷cC<\3< .ʿtqvt۱ Kf nP _7/8Js5bin%gۤ _0fߎI#qDʊoSi/} ^p ;F1<а>C 箶<.  pcH#U!>Y-j>~!**#oAMCuН6DrNW]з߆ 딽 _qF5mv n\@+ȸ35e3%iv:&Q찮F 4l%0N.ݞ..۱|WTC˾`~x_G|ܾ O u_S9SI?M!>o]q_SHgͧ =y(T5l5nL \PJ: :H6HRLzr4+wg>quTtE+4Wu jS@ꃣ'$ EK)yJ %MmO{oGGؾ0aZ}$œ#`azqɿ6FOuēSۺLl8to|$;C? GO+r [#yý_i}ta1Y3ndkCbpdvsčgT~4bm^ey!CȪSh$1MW<_r'y;| Ta z66aj?et`c?&j#dR?:w8^#j[3\8WWunX5OXK5;nf~jkM_KWj xnnGzyxE_(rPL7?,;Cok@7b.J|+.!>hA ';+0`A~g'j~G p+GZeC<]OEu fmK~&1t.Nc)^tJ5aNF4ݸݎf#\:|/1-ԠahK"4zZ]m}Bl6 }\bq[<"8Bﯶ}jn sNm4O,؃'֫-( k~;LJM`8<"ǡx]LV7r, 8☁,7B4dW=,d>OoP\Ĕ> 43$jK~3f E6 lkWz򇸐Õ~0JeR`p;xҁA6Z!B]w*[o*~%r[V͂){1s#wh7,DkjjB lJ.UXg;K,^m਋@wPO/^΄T2J%J3$TzJ+hE=,NJG5~I? XsNuPZ#樚,RW\r/T ͲQgD 8pGDžxvj)F-INCNj+_PgL?wJáp |&F,9Zdl1:C&`G\x[ kv;վEt8m'bp"w`YoNv9Ч,D_%ۗie\%RQy֐лdەop)(/V{a؏?uo`îSqWVI/a|rX/GSL)#;nRz:j{=-A`N-ҋ0^'}T4hWܿɦfsl௃VÄ1=Դ~v!g KKVRбՑ|Dh@n]D*ZFRkSp0dz[ZpQuJ-|3R {Hf|F$0ч aNaCD %&`Qa7[ }YtwG/bjk5Dĕ iWzUBbyWBtR(nmyu#zNNZ!5?fˣXdz!ttۿ"dK2FMXt>C+'o'TFCIENDB`$$If!vh55#v#v:V 4 065/ 34 p$$If!vh55#v#v:V 065/ 34 $$If!vh55#v#v:V 065/ 34 p$$If!vh55#v#v:V 065/ 34 $$If!vh55#v#v:V 065/ 34 p$$If!vh55#v#v:V 065/ 34 $$If!vh55#v#v:V 065/ 34 p$$If!vh55#v#v:V 065/ 34 $$If!vh55#v#v:V 065/ 34 p$$If!vh55#v#v:V 065/ 34 q$$If!vh5f5$#vf#v$:V 6,52 2x34 q$$If!vh5f5$#vf#v$:V 6,52 2x34 q$$If!vh5f5$#vf#v$:V 6,52 2x34 $$If!vh55 #v#v :V 4 065/ 34 p$$If!vh55 #v#v :V 065/ 34 $$If!vh55 #v#v :V 065/ 34 p$$If!vh55 #v#v :V 065/ 34 $$If!vh55 #v#v :V 065/ 34 p$$If!vh55 #v#v :V 065/ 34 $$If!vh55 #v#v :V 065/ 34 p$$If!vh55 #v#v :V 065/ 34 $$If!vh55 #v#v :V 065/ 34 p$$If!vh55 #v#v :V 065/ 34 $$If!vh55 #v#v :V 065/ 34 p$$If!vh55 #v#v :V 065/ 34 $$If!vh55"#v#v":V 4065/ 34 q$$If!vh5f5$#vf#v$:V 6,52 2x34 q$$If!vh5f5$#vf#v$:V 6,52 2x34 q$$If!vh5f5#vf#v:V 6,52 2x34 q$$If!vh5f5#vf#v:V 6,52 2x34 Dd9v   S RA sas_wsh_112ssas_wsh_112s b \ф,  n \ф, PNG  IHDR!hPLTE       !!$%#$"(&')).-.+,*01/3237564898=;<:;@A?@>=BBGEFGDECIJH L M J K Q R O P N O S Y X V W T U T Z Y ^ _ \ ] ^ [ \ a b c ` a f e c d j k h i g h f m k l r s p q o p n mtzyzwxuvu{~|}cbKGDH cmPPJCmp0712Hs NIDATx^흋EǏ\%kI9pܒEI IIJJ]I"Ib6s}g=;yמwfvg{yrVCn mE &ݻwֻg^=zۧσ8`@w̙g/^W/_rҥv֭۷o7_;w3mH :~>~z"$~bv"&yj3!B)ބAH/ YVP8$6"dX## ńЏiRsgӏioO?Wu 1BP@SB452q?DHK !$Fh B(!ae1 im%ZN%T,+.o1ƄMXHCZm("1EbV2++ҳ!Ѩæ!jfcF2z2їVPAH(%!婅SSGTDAGƑklpD͠4SC@BH"DJG !!BB(5 PCC]6B]~ӒCp6BHaDM?N<]xHHGqzpW9e (#' Yx_dz\&Y Kf 9G`rcSgB^,g55Xϫ7&j kO">Tbj.D {޳# 'ބEΡ8ŕK0xUDDOAW$uhBҡk ԩNȪؼ,=: )/+S~Q\PH+VHw^ 1D{ ; sq}k1Oe.,?J3>[89湥BMs2 ڝ<^JaA5:2J9$$׺zHujV3 Ժ.H|ͬk52WmBAoMR#]b meY+kw詍Vd2W&̽jq=Z@250EnB2f ]:}|!g, DF>E~EmÛAa A=*ӑV#PXY1n3i,HBEyAd3(6W#>)!ِ\s~*`ں!1`õc`&G``og&TW\V>xX Ćվr5kuh:,Zn$=1$ Pz efw܃1Ϡ9vf9!ǦȬ͜?2޵n Er"4mo!=r_@*ӌ̕=v_>veZ~5HтrKV$$CqWZ'qGA iBPvPNL\u1Bb,kSPóV6D_^~M˕&TV*h!^=;E}=Gص^ AH /UK'6 FHkvBr{Vz #d#C#ǯ4TLcA-Sm~b5Q@ %G@9;Pc<*"Ċ[I Ltݤ~I~ZM!Fj-Tc=jWB?ԕۗnHb:P 4r`&'# D|o&!4zoC&mD~r/"3YPD|˻D}?G]eQ] `XD nMR/Z2,)~ԪX'vh'&tU&-s _6k!.Zj^k'r:^/yQP~_!J<$!V7uim;i'LPڈR$Gmk2 EKV!R+S- `hEmdMD(QE9sG"O@t#7!NYYJ؝5Y|\VSHƚdkMcҶ ĤwW=eoC9 '%ƝE8.NvQVۢP:TP~O!P:TZ7 A@!$QCH"DJG !!BB(5 P:jK]P¥wջAK[/S{꿗*dt JNHIw߶rʻ8ˀF~mYnB M|PkHL58S{!PCjWdR+7!xȅ~@'!:!Q=˜~&^T/Mɑ̄9vBktL> kNPہ !BB(5 P:j At@!Ba&${[^'/IENDB`~$$If!vh5Z5##vZ#v#:V 65922234 ~$$If!vh5Z5##vZ#v#:V 65922234 ~$$If!vh5Z5##vZ#v#:V 65922234 $$If!vh55Z"#v#vZ":V 4065/ 34 $$If!vh55#v#v:V 4 065/ 34 p$$If!vh55#v#v:V 065/ 34 $$If!vh55#v#v:V 065/ 34 p$$If!vh55#v#v:V 065/ 34 t$IfK$L$!vh5f5~#vf#v~:V 6,52 2x34 t$IfK$L$!vh5f5~#vf#v~:V 6,52 2x34 t$IfK$L$!vh5f5~#vf#v~:V 6,52 2x34 $$If!vh55#v#v:V 065/ 34 p$$If!vh55#v#v:V 065/ 34 $$If!vh55#v#v:V 065/ 34 p$$If!vh55#v#v:V 065/ 34 $$If!vh55#v#v:V 065/ 34 p~$$If!vh5Z5##vZ#v#:V 65922234 ~$$If!vh5Z5##vZ#v#:V 65922234 ~$$If!vh5Z5##vZ#v#:V 65922234 $$If!vh5y5"#vy#v":V 4065/ 34 q$$If!vh5f5$#vf#v$:V 6,52 2x34 ~$$If!vh5Z5##vZ#v#:V 65922234 ~$$If!vh5Z5##vZ#v#:V 65922234 ~$$If!vh5Z5##vZ#v#:V 65922234 $$If!vh5{5"#v{#v":V 4065/ 34 $$If!vh5y5"#vy#v":V 4065/ 34 $$If!vh5"5S#v"#vS:V 4 065/ 34 p$$If!vh5"5S#v"#vS:V 065/ 34 $$If!vh5"5S#v"#vS:V 065/ 34 p$$If!vh5"5S#v"#vS:V 065/ 34 $$If!vh5"5S#v"#vS:V 065/ 34 p$$If!vh5"5S#v"#vS:V 065/ 34 $$If!vh5"5S#v"#vS:V 065/ 34 p$$If!vh5"5S#v"#vS:V 065/ 34 $$If!vh5"5S#v"#vS:V 065/ 34 p$$If!vh5"5S#v"#vS:V 065/ 34 $$If!vh5"5S#v"#vS:V 065/ 34 p$$If!vh5"5S#v"#vS:V 065/ 34 $$If!vh5"5S#v"#vS:V 065/ 34 p$$If!vh5"5S#v"#vS:V 065/ 34 $$If!vh5"5S#v"#vS:V 065/ 34 p$$If!vh5"5S#v"#vS:V 065/ 34 q$$If!vh5f5$#vf#v$:V 6,52 2x34 $$If!vh55"#v#v":V 4065/ 34 $$If!vh55"#v#v":V 4065/ 34 q$$If!vh5f5r#vf#vr:V 6,52 2x34 q$$If!vh5f5r#vf#vr:V 6,52 2x34 q$$If!vh5f5r#vf#vr:V 6,52 2x34 q$$If!vh5f5r#vf#vr:V 6,52 2x34 $$If!vh55 51#v#v #v1:V 4 065/ 34 p$$If!vh55 51#v#v #v1:V 065/ 34 $$If!vh55 51#v#v #v1:V 065/ 34 p$$If!vh55 51#v#v #v1:V 065/ 34 $$If!vh55 51#v#v #v1:V 065/ 34 pC$$If!vh5 5W5%5x5x#v #vW#v%#vx#vx:V 4 2065/ 34 p2Ddxxv   S RA table-bulletTable Bullet bdze@EWs){6ndze@EWs){PNG  IHDRaV PLTE333EtRNS@fbKGDH cmPPJCmp0712OmIDATc```` Ak@.2MzstIENDB`Ddxxv   S RA table-bulletTable Bullet bdze@EWs){ndze@EWs){PNG  IHDRaV PLTE333EtRNS@fbKGDH cmPPJCmp0712OmIDATc```` Ak@.2MzstIENDB`$$If!vh5 5W5%5x5x5*#v #vW#v%#vx#vx#v*:V 065/ 34 Ddxxv  S RAtable-bulletTable Bullet bdze@EWs){Tndze@EWs){PNG  IHDRaV PLTE333EtRNS@fbKGDH cmPPJCmp0712OmIDATc```` Ak@.2MzstIENDB`Ddxxv  S RAtable-bulletTable Bulletbdze@EWs){ndze@EWs){PNG  IHDRaV PLTE333EtRNS@fbKGDH cmPPJCmp0712OmIDATc```` Ak@.2MzstIENDB`_$$If!vh5 5W5%5x5x5*#v #vW#v%#vx#vx#v*:V <065/ 34 p<kdZ$$Ifֈ 6[K#u# <0634ap<Ddxxv  S RAtable-bulletTable Bulletbdze@EWs){ndze@EWs){PNG  IHDRaV PLTE333EtRNS@fbKGDH cmPPJCmp0712OmIDATc```` Ak@.2MzstIENDB`Ddxxv  S RAtable-bulletTable Bulletbdze@EWs){ndze@EWs){PNG  IHDRaV PLTE333EtRNS@fbKGDH cmPPJCmp0712OmIDATc```` Ak@.2MzstIENDB`$$If!vh5 5W5%5x5x5*#v #vW#v%#vx#vx#v*:V 065/ 34 Ddxxv  S RAtable-bulletTable Bulletbdze@EWs){"ndze@EWs){PNG  IHDRaV PLTE333EtRNS@fbKGDH cmPPJCmp0712OmIDATc```` Ak@.2MzstIENDB`Ddxxv  S RAtable-bulletTable Bulletbdze@EWs){ndze@EWs){PNG  IHDRaV PLTE333EtRNS@fbKGDH cmPPJCmp0712OmIDATc```` Ak@.2MzstIENDB`_$$If!vh5 5W5%5x5x5*#v #vW#v%#vx#vx#v*:V <065/ 34 p<kd($$Ifֈ 6[K#u# <0634ap<Ddxxv  S RAtable-bulletTable Bulletbdze@EWs){ndze@EWs){PNG  IHDRaV PLTE333EtRNS@fbKGDH cmPPJCmp0712OmIDATc```` Ak@.2MzstIENDB`Ddxxv  S RAtable-bulletTable Bulletbdze@EWs){wndze@EWs){PNG  IHDRaV PLTE333EtRNS@fbKGDH cmPPJCmp0712OmIDATc```` Ak@.2MzstIENDB`$$If!vh5 5W5%5x5x5*#v #vW#v%#vx#vx#v*:V 065/ 34 Ddxxv  S RAtable-bulletTable Bulletbdze@EWs){ndze@EWs){PNG  IHDRaV PLTE333EtRNS@fbKGDH cmPPJCmp0712OmIDATc```` Ak@.2MzstIENDB`Ddxxv  S RAtable-bulletTable Bulletbdze@EWs){ndze@EWs){PNG  IHDRaV PLTE333EtRNS@fbKGDH cmPPJCmp0712OmIDATc```` Ak@.2MzstIENDB`_$$If!vh5 5W5%5x5x5*#v #vW#v%#vx#vx#v*:V <065/ 34 p<kd$$Ifֈ 6[K#u# <0634ap<Ddxxv  S RAtable-bulletTable Bulletbdze@EWs){ndze@EWs){PNG  IHDRaV PLTE333EtRNS@fbKGDH cmPPJCmp0712OmIDATc```` Ak@.2MzstIENDB`Ddxxv  S RAtable-bulletTable Bulletbdze@EWs){Endze@EWs){PNG  IHDRaV PLTE333EtRNS@fbKGDH cmPPJCmp0712OmIDATc```` Ak@.2MzstIENDB`Ddxxv  S RAtable-bulletTable Bulletbdze@EWs){ndze@EWs){PNG  IHDRaV PLTE333EtRNS@fbKGDH cmPPJCmp0712OmIDATc```` Ak@.2MzstIENDB`$$If!vh5 5W5%5x5x5*#v #vW#v%#vx#vx#v*:V 065/ 34 Ddxxv  S RAtable-bulletTable Bulletbdze@EWs){cndze@EWs){PNG  IHDRaV PLTE333EtRNS@fbKGDH cmPPJCmp0712OmIDATc```` Ak@.2MzstIENDB`_$$If!vh5 5W5%5x5x5*#v #vW#v%#vx#vx#v*:V <065/ 34 p<kd$$Ifֈ 6[K#u# <0634ap<Ddxxv  S RAtable-bulletTable Bulletbdze@EWs){nndze@EWs){PNG  IHDRaV PLTE333EtRNS@fbKGDH cmPPJCmp0712OmIDATc```` Ak@.2MzstIENDB`$$If!vh5 5W5%5x5x5*#v #vW#v%#vx#vx#v*:V 065/ 34 Ddxxv  S RAtable-bulletTable Bulletbdze@EWs){ndze@EWs){PNG  IHDRaV PLTE333EtRNS@fbKGDH cmPPJCmp0712OmIDATc```` Ak@.2MzstIENDB`Ddxxv  S RAtable-bulletTable Bulletbdze@EWs){ndze@EWs){PNG  IHDRaV PLTE333EtRNS@fbKGDH cmPPJCmp0712OmIDATc```` Ak@.2MzstIENDB`Ddxxv  S RAtable-bulletTable Bulletbdze@EWs){1ndze@EWs){PNG  IHDRaV PLTE333EtRNS@fbKGDH cmPPJCmp0712OmIDATc```` Ak@.2MzstIENDB`Ddxxv   S RA table-bulletTable Bulletbdze@EWs){ndze@EWs){PNG  IHDRaV PLTE333EtRNS@fbKGDH cmPPJCmp0712OmIDATc```` Ak@.2MzstIENDB`_$$If!vh5 5W5%5x5x5*#v #vW#v%#vx#vx#v*:V <065/ 34 p<kd7$$Ifֈ 6[K#u# <0634ap<Ddxxv ! S RA!table-bulletTable Bullet bdze@EWs){ndze@EWs){PNG  IHDRaV PLTE333EtRNS@fbKGDH cmPPJCmp0712OmIDATc```` Ak@.2MzstIENDB`Ddxxv " S RA"table-bulletTable Bullet!bdze@EWs){ ndze@EWs){PNG  IHDRaV PLTE333EtRNS@fbKGDH cmPPJCmp0712OmIDATc```` Ak@.2MzstIENDB`$$If!vh5 5W5%5x5x5*#v #vW#v%#vx#vx#v*:V 065/ 34 Ddxxv # S RA#table-bulletTable Bullet"bdze@EWs){ ndze@EWs){PNG  IHDRaV PLTE333EtRNS@fbKGDH cmPPJCmp0712OmIDATc```` Ak@.2MzstIENDB`Ddxxv $ S RA$table-bulletTable Bullet#bdze@EWs){ndze@EWs){PNG  IHDRaV PLTE333EtRNS@fbKGDH cmPPJCmp0712OmIDATc```` Ak@.2MzstIENDB`_$$If!vh5 5W5%5x5x5*#v #vW#v%#vx#vx#v*:V <065/ 34 p<kd$$Ifֈ 6[K#u# <0634ap<Ddxxv % S RA%table-bulletTable Bullet$bdze@EWs){ndze@EWs){PNG  IHDRaV PLTE333EtRNS@fbKGDH cmPPJCmp0712OmIDATc```` Ak@.2MzstIENDB`$$If!vh5 5W5%5x5x5*#v #vW#v%#vx#vx#v*:V 065/ 34 Ddxxv & S RA&table-bulletTable Bullet%bdze@EWs){(ndze@EWs){PNG  IHDRaV PLTE333EtRNS@fbKGDH cmPPJCmp0712OmIDATc```` Ak@.2MzstIENDB`_$$If!vh5 5W5%5x5x5*#v #vW#v%#vx#vx#v*:V <065/ 34 p<kd$$Ifֈ 6[K#u# <0634ap<Ddxxv ' S RA'table-bulletTable Bullet&bdze@EWs){3ndze@EWs){PNG  IHDRaV PLTE333EtRNS@fbKGDH cmPPJCmp0712OmIDATc```` Ak@.2MzstIENDB`Ddxxv ( S RA(table-bulletTable Bullet'bdze@EWs){ndze@EWs){PNG  IHDRaV PLTE333EtRNS@fbKGDH cmPPJCmp0712OmIDATc```` Ak@.2MzstIENDB`Ddxxv ) S RA)table-bulletTable Bullet(bdze@EWs){}ndze@EWs){PNG  IHDRaV PLTE333EtRNS@fbKGDH cmPPJCmp0712OmIDATc```` Ak@.2MzstIENDB`$$If!vh5 5W5%5x5x5*#v #vW#v%#vx#vx#v*:V 065/ 34 Ddxxv * S RA*table-bulletTable Bullet)bdze@EWs){ ndze@EWs){PNG  IHDRaV PLTE333EtRNS@fbKGDH cmPPJCmp0712OmIDATc```` Ak@.2MzstIENDB`Ddxxv + S RA+table-bulletTable Bullet*bdze@EWs){"ndze@EWs){PNG  IHDRaV PLTE333EtRNS@fbKGDH cmPPJCmp0712OmIDATc```` Ak@.2MzstIENDB`Ddxxv , S RA,table-bulletTable Bullet+bdze@EWs){@$ndze@EWs){PNG  IHDRaV PLTE333EtRNS@fbKGDH cmPPJCmp0712OmIDATc```` Ak@.2MzstIENDB`_$$If!vh5 5W5%5x5x5*#v #vW#v%#vx#vx#v*:V <065/ 34 p<kd%$$Ifֈ 6[K#u# <0634ap<Ddxxv - S RA-table-bulletTable Bullet,bdze@EWs){K)ndze@EWs){PNG  IHDRaV PLTE333EtRNS@fbKGDH cmPPJCmp0712OmIDATc```` Ak@.2MzstIENDB`Ddxxv . S RA.table-bulletTable Bullet-bdze@EWs){*ndze@EWs){PNG  IHDRaV PLTE333EtRNS@fbKGDH cmPPJCmp0712OmIDATc```` Ak@.2MzstIENDB`Ddxxv / S RA/table-bulletTable Bullet.bdze@EWs){,ndze@EWs){PNG  IHDRaV PLTE333EtRNS@fbKGDH cmPPJCmp0712OmIDATc```` Ak@.2MzstIENDB`$$If!vh5 5W5%5x5x5*#v #vW#v%#vx#vx#v*:V 065/ 34 $$If!vh55"#v#v":V 4065/ 34 $$If!vh55"#v#v":V 4065/ 34 $$If!vh55"#v#v":V 4065/ 34 $$If!vh55"#v#v":V 4065/ 34 q$$If!vh5f5$#vf#v$:V 6,52 2x34 $$If!vh5 5#v #v:V 4 065/ 34 p$$If!vh5 5#v #v:V 065/ 34 $$If!vh5 5#v #v:V 065/ 34 p$$If!vh5 5#v #v:V 065/ 34 $$If!vh5 5#v #v:V 065/ 34 p$$If!vh5 5#v #v:V 065/ 34 $$If!vh5 5#v #v:V 065/ 34 p$$If!vh55"#v#v":V 4065/ 34 q$$If!vh5f5$#vf#v$:V 6,52 2x34 $$If!vh55P 5(#v#vP #v(:V 4 065/ 34 p$$If!vh55P 5(#v#vP #v(:V 065/ 34 $$If!vh55P 5(#v#vP #v(:V 065/ 34 p$$If!vh55P 5(#v#vP #v(:V 065/ 34 $$If!vh55P 5(#v#vP #v(:V 065/ 34 p$$If!vh55P 5(#v#vP #v(:V 065/ 34 q$$If!vh5f5$#vf#v$:V 6,52 2x34 $$If!vh55"#v#v":V 4065/ 34 $$If!vh55"#v#v":V 4065/ 34 q$$If!vh5f5#vf#v:V 6,52 2x34 $$If!vh55"#v#v":V 4065/ 34 $$If!vh5 5#v #v:V 4 065/ 34 p$$If!vh5 5#v #v:V 065/ 34 $$If!vh5 5#v #v:V 065/ 34 p$$If!vh5 5#v #v:V 065/ 34 $$If!vh5 5#v #v:V 065/ 34 p$$If!vh5 5#v #v:V 065/ 34 $$If!vh5 5#v #v:V 065/ 34 p$$If!vh5 5#v #v:V 065/ 34 $$If!vh5 5#v #v:V 065/ 34 p$$If!vh5 5#v #v:V 065/ 34 $$If!vh5 5#v #v:V 065/ 34 p$$If!vh5 5#v #v:V 065/ 34 $$If!vh5 5#v #v:V 065/ 34 p$$If!vh5 5#v #v:V 065/ 34 $$If!vh5 5#v #v:V 065/ 34 p$$If!vh5 5#v #v:V 065/ 34 $$If!vh5 5#v #v:V 065/ 34 p$$If!vh5 5#v #v:V 065/ 34 $$If!vh5 5#v #v:V 065/ 34 p$$If!vh5 5#v #v:V 065/ 34 $$If!vh5 5#v #v:V 065/ 34 p$$If!vh5 5#v #v:V 065/ 34 $$If!vh5 5#v #v:V 065/ 34 p$$If!vh5 5#v #v:V 065/ 34 $$If!vh5 5#v #v:V 065/ 34 pNDdv 0 S RA0sas_wsh_114ssas_wsh_114s/b-aLg`Qd j]=5`QnX-aLg`Qd j]=5PNG  IHDROPLTEļŜLNLܹ |\< L,dk t T%4C1z {伻 Ew 4$\|^TTT<~<<< [D-t,l4y,su " as cJ,e$$$S\Z\k RDED$T|||Ddcd%p_$dL #m mlll#b kΔ*t,,,LK J$MtstԎTRG][[p'm^8Cߛ O e^\0 gxae` Oi[sNָr{pwM5t^nmkO`M[+ImvT*糭eT/aMkᜎbG8ߺv+ޚ iڦ[=mQ`gE^5}ZƮ~ Na#kmlcfjòpecp6 881vb\mmlkCm[vnA/[6n?;::zvg= vC:T˶~ϱc{H=leBlW9g5kߞB ;wV"VPIY{{{C6їvՁ;l%u%[hږÇK35K9̙R`a>ح_W|lEXq_ VVZo.ڵ 6aM-peW~Χީ[?|'j_ ~)p /QUou6j[UնΆmpbYm 8X|yr[|uV(}aփt5ׯ/E'իi WlE`J+m[j%yaVsC-7aȳv~;|]]eoc4}cgo]3IUᩡ+2ƈy6<~`Q Va&# $euu:4 ig[MII ,!).u-2MI L4@`ҞPK7P)$s+yo 9uk7_s=hz+/×gx;o|ѼWuҥgg^tVK5\voL]$Mtu$Sh ztq>KQ\9KMFT$y"TYV O?g};/>oO2yw~w}/~ǡE7}᷆z~q~Sw`Sӿ&J;+@s9iD\5LS'є;є;W\}2ҡON Y.cQ e>_zoo~4|.߯_1np9;'KU }yzz=v}Y6;;27ޛq'v^J<1mg>_wL9u羙w?d"蓷G7.UyxyƘ7ͧPOQJUB]dkDYkNN9rw O䕧]"Kgi՟B3Oڣ'͟O':tJ5^Qݲ+:Z~pg;ygbȚ24_ЏGCCCH7Hv #OB-w@iw*# ()1* OW$d-<(ټ4]g +I6ͫmmmWw 5#Mk Mt`r{dOApËcp ~1L6t4w쀡&n 0ojɍNOm|}7f6Gǯ7߰. O%s]qDـa;pG;<;}Kvu 0ES?@_tO"HhZ4ݯE"Q3~DhwkI<x$GZ:b Ib .:a_FnΙzخbqAtOJr%>0R> hƀ4"xr2z l Ѵ1'K,:O~ØM079mYEA^Ȯ?jZ\o,;;]O~"uVX֬ Fu't'w2BkLkOH0ojI^Ȯ?@k6UI=ZsosŤƿʾ܇CĠƬn`. QGW!{ fS/;5Aw\eSzOJͥy/{OO;>>_[9 ӂyP>' 2[sAat$Y]xzS(>I-O?2ƊVxDy~ 9COcrD]{m= ۃ7X<3ËI[^#&,ς,%N3u@ X+"}ؠL]CY9&\1Kx@cE>σ@"y.enOt&}h,XjnMT*KOѠh#Ox| Y0!s".$jXr4}Qz$iwO?OI *3xZԪݖ; w'+3(0Sy I9wZ+ԠGyBx0tXh&5($}@16*BhezIP2I`לL^(Cvҥ@I4BET*[,=gr^y\C(kNה>=ۥci|h;SOOJx ҧ'fU恧[Uj߽y3<;Ng JYH<(h>1>U3hw@U;C9U~jQ? 1{Iz$*TYG3O5>5TGv5Tobj߽UO g~f?Y?Q|P<#iGj3hUǛW#@5_9#50|!OU_9wCVO Gozga}j3ޡOlUaW#@5_j y#m0GyWOl2hQ{j~#̤&(V3gd4>4K5~[ZԀ?s(3J1P uAx{X?O-*?sHӍ"hQBx(!/f;.,9:iavAϝ#Vwƃ ZK|4/eu{:wr" Z? j-@E~TF7V6'رnNE"HTE+ *w@.@5&>s~ 9w-W71 ,bIENDB`q$$If!vh5f5$#vf#v$:V 6,52 2x34 q$$If!vh5f5$#vf#v$:V 6,52 2x34 q$$If!vh5f5$#vf#v$:V 6,52 2x34 q$$If!vh5f5$#vf#v$:V 6,52 2x34 ~$$If!vh5Z5!#vZ#v!:V 65922234 ~$$If!vh5Z5!#vZ#v!:V 65922234 ~$$If!vh5Z5!#vZ#v!:V 65922234 $$If!vh5O5&"#vO#v&":V 4065/ 34 q$$If!vh5f5$#vf#v$:V 6,52 2x34 q$$If!vh5f5$#vf#v$:V 6,52 2x34 $$If!vh55"#v#v":V 4065/ 34  Ddxv 1 S RA1sas_wsh_116ssas_wsh_116s0b BtLR- S {mn BtLR- SPNG  IHDRufPLTE        !$%"#"'(&').,-+,*1/01/3267454989=;<:@A>?>BGEFDECIJH M L M J K Q R O P N O R S Y W X V W T U Z _ ^ _ \ ] [ \ c a b ` a f d e c d k i j h i g m k l s q r s p q n o nt{zxyvwuv{}~|GbKGDH cmPPJCmp0712HsOIDATx^CE5HM2L@|ALL B,K+{M{̴L3 _םݝݻ[{۹|> m IHE O2ujYٌO6gVTTVκ3{͛;.\ŋ{fѢ?lҥ+Vv==yǏ uS>x'{O>:}Ͽ̙Oϟ?wΞo/\K.^~ڵ߮^r_ܹ}[7/ @Hm f~z^ Gj}=P6I@%@lp %i 9j$ҙ2 Ckvl|)'{ᓽhX PϏ[/nK ]>QlO BEw7^N;Ͽ(NP^PP)@TW XZ`䰪 6lD[" #4$vr: z{p ( N\ G 'TA=\ )'TdgJ84@tvgES5"B#_h`סG("G`l^C%;Coh&,^GF,á6"zDxdfI7]xI 6#haR%Y%[A R)DBBBB#nH[d 8冻BS0J OD@%"0+G|tGG({C&8&ϨJ& ;qn%V a ʤ98 !pం&::gsVQYUQ><:F!#w #A(R{B$ 4 opĆj *ʊVY B8"!a{tG ?c' xzIz  ^aaL έ] مf>=% fpl C٧wa5Ki^!;^"}tL$Lz_4׊~67G#Hzq@?Fi7ŶMPv&c=Ai^]ZҾ& N+E )L-BMW(6|Bp\k|dn4>ddjtDVt|4.\t#zM ) P:xvЖvK,m޻kdH)ٶX.^FrBxh2s$.`%PTh`$7_)@Mtu}}.k.N!JW'J++ S2LO/\Ovclãc Mo|WJ=G7\:`kQph~)AIdz z ~OAR%@T09AVOKNJŹco?Z֒o{zjLC=z%b"teC --]wn5kȮMG'n}y߉uv?~q8T]<ӳ܊t%uW`J.W.!.93.BtP^@R"j>:V%9zxswz~ܽ߸ӣƣCw<#Cqo}8=6c <5>'߻@0?ڮ&%ϐHNGLI di?])$2N{[ۥ-?]d/|gt뿎|ȁO]z#ϏGG gG!;[\z<zό0>gl%<CJƩsr18V:u=ơ[XR"g;ū$5!IeW=%?)xKH}{~5NγtNSykz酒*>g?ycۑ7*暟ENn&w_ OZ,(o 7 | }о} +{ J&c)srYP20Kg>N7#(0Tvo?-?6)g<ҁO5_(E"7ܽt&íw7ϭ'vz<(9"ȃƩs;h[,'@Tl?{%=\~z6|BRK&Z"z*g}AzJ;J/Ə>yȒ%w>3ߥ?4QM1E}d ]{ P^).=w]uPxw!l=xj~vs +/ϑG_=G* =?/C?Pg>v8}+xO/|3{ϝymdϙj埐.l*YKTyo3j[ m)ja<?zޛ<~2TRS7)zޅc;ؽਸ਼-]_36d@;;ΥX1u-].0NWpi;mV.Ly}= =ڿt$&6GLLS< $⑈)Kr-/,p'm6^ \0%&LK,˧RI[ヌuu=k{Y)'uYt]xB?~Tܮmm{ۆko&y<Ó+T7'=7踈x-Dݵ>Y}kOY]{ݚ5u8֭+ٽv߰e;Ν|`w=]vٱn8:;q;6xfϩSOmޱL wu/^ǎ|@n|t͇]^ywJؽWL>~j8!2y~ ' =7\#u5x>h2!E&3H5Zq|2xvo''&>_%pnӪ~Ӫ!tժUq٪e뗭Z.qPtě>\{M gYTqV[P5ǩ݄eꔏ)jۛX乺 mҵMt`a[_…0>HWCn7<ȷP'q+\jLJ\~Bƅ!G9EID;8=u=@>_FnHBpU/=tzS*xƀvT΍Q.K轳0[=y/3/TW^ޥ`VtT(1V $"D ,$_,fq3d?9Ɋ2Qڔ>$ i_ jCa- G۟_OI xUUScggա:?'?HSL9ǰa/2? OENjyM@3B'gs$+ O]Z &&U /XL< BB"4?S? FUYȩWHrL0ӗ/JQ㲀Z .ͣ9DfPB\JK)pXٱG 2jެ,O,&T'.I=Ґ.q=ib|7k sS'0 ZiEc/e2#u'6L YiPiM4 sB@2 uh)"`s}<icM/U%Hth hT__pн> 4Nt.<`j SOۨ Ҋ|aZK?Fr)~& یzoVi[[8BxU#49,K5L|~l؏%UV4ל2p{= idM2ލ T*vuia&׎iJ5%}:/PSK3Tސn^>[Xۗ9V8Þ/Ms3x3T%9T^_ -d?ؙgdU* 74#;]pO?ad% wg]LYfiT[2sų[*ӍLBI33O|o#_XVi9fzN_ *.u\' ~M|H)A lv)j]O#+&nGW&T s ~vj;&#V%,É8%)#-.Bv1%8B]Yߜ;} }O÷I4g7G|ITU[fEf~c1<ͬ\*$h1ї(zG#ݗ@L4IRҙx>NٜX,}i.H\!B4-Rlx9[֟,Y鮑i6<widw7 =Qg٭)'1ZQ땸D,+ߍ|ƒaGz[R{_w|3 Tc,~چC):spgG56[A9d~N)Uj*^v?.TY(ȻjV@`E Aﳣ-YoS-~V"_R3*5Tta0פ3OQ-R̚9w\IENDB`q$$If!vh5f5$#vf#v$:V 6,52 2x34 $$If!vh55"#v#v":V 4065/ 34 $$If!vh5[ 5 5 #v[ #v #v :V 4 065/ 34 p$$If!vh5[ 5 5 #v[ #v #v :V 065/ 34 $$If!vh5[ 5 5 #v[ #v #v :V 065/ 34 p$$If!vh5[ 5 5 #v[ #v #v :V 065/ 34 $$If!vh5[ 5 5 #v[ #v #v :V 065/ 34 p$$If!vh5+5 5 #v+#v #v :V 4 065/ 34 p$$If!vh5+5 5 #v+#v #v :V 065/ 34 $$If!vh5+5 5 #v+#v #v :V 065/ 34 p$$If!vh5+5 5 #v+#v #v :V 065/ 34 $$If!vh5+5 5 #v+#v #v :V 065/ 34 p$$If!vh5+5 5 #v+#v #v :V 065/ 34 $$If!vh5+5 5 #v+#v #v :V 065/ 34 p$$If!vh55n"#v#vn":V 4065/ 34 $$If!vh5w 5 5 #vw #v #v :V 4 065/ 34 p$$If!vh5w 5 5 #vw #v #v :V 065/ 34 $$If!vh5w 5 5 #vw #v #v :V 065/ 34 p$$If!vh5w 5 5 #vw #v #v :V 065/ 34 $$If!vh55"#v#v":V 4065/ 34 $$If!vh55n 5#v#vn #v:V 4 065/ 34 p$$If!vh55n 5#v#vn #v:V 065/ 34 $$If!vh55n 5#v#vn #v:V 065/ 34 p$$If!vh55n 5#v#vn #v:V 065/ 34 $$If!vh55n 5#v#vn #v:V 065/ 34 p$$If!vh55n 5#v#vn #v:V 065/ 34 $$If!vh55n 5#v#vn #v:V 065/ 34 p$$If!vh55n 5#v#vn #v:V 065/ 34 $$If!vh55Z"#v#vZ":V 4065/ 34 $$If!vh55V #v#vV :V 4 065/ 34 p$$If!vh55V #v#vV :V 065/ 34 $$If!vh55V #v#vV :V 065/ 34 p$$If!vh55V #v#vV :V 065/ 34 <Ddv 3 S RA3sas_wsh_140csas_wsh_140c2b; Zv':ah;n; Zv':ahPNG  IHDROp ƙPLTE̜424464TVTlnl,.,|z|<><,*,DFD|~|$"$ܔ$&$TRTLJLtrt\Z\DBD\^\LNLdfd  <:D,&,42,$"trlTNLlfdljdLJDdb\LFL|zt<6<,&$\VT~|vtd^\d^dLFD D><<644., |v|$  bɻbKGDH cmPPJCmp0712Hs9IDATx^}cڸ?}٤CPli4&n}36M 9l, h,b|JOdK& 3"+t" 0||{"ݽkk á]/s%@ 2@~Q ڗ}# QJo\x@9HJA]tTLQ=.R p([PR?&U aLMh+ q%Da :9b')vBMkLKBpU*pg.QFixGPGuYPDS[ !bzj"繭BBryʈt,uF +a}BW\<%K= gmyzE ̽~%fbWnTBKpwP] 9 -$TSxb{^ŽRFw/a#j¡z8 ]iVsw.괋+d<~5_)OB7¡[frj*m^ͧu]%/UZ(˅g$OFBY lO , cTfZ~˞<3u|\~ (f.tğ|/:F ֺq0j?ttB1흗sgXj)]i w|"Ht /"!e%xNvK%/7tߵpG><~ysĚhbpሿO ϵW}8AFkq2i/ R_Ƕ8;<éc<j jNpU39V O+K)¨U钘6 ? OUZA`\kd9LPSe6Mb9JE7gnA cJ!~d.W (uqF,qMօgLkue0D뤠Jꋙf2\=8zӮ68xvYίr4#JF98|[8U@m,j,0OO㟻;]2Gm^ʟ{o.B⯜X9ת,X<gO#xmp&TA $PǏ+&ўL2%Zƿ8? r{3S~2-^{Za.6Jege yJ ?m:vС+ϖ\-$>$S|s}6&E U/)FS9$ SGŨ*n>fθtg 7jew] VnH uN@bku2I(Zy4;ZO#3_?y35OnqQ `Un"x(έ-<@})թꖱK_zkgH_{lss0K;S7/cE]r8Lr #)M'rH]GGFI{5Z7:}$G븽d80Td Rx6--@t>섳:ljA31;v/k:VeW-mQ\d"s̖,rXϗjr&.#MErM+$RRi|QZITOÉHZ2/V#JϙKniT;7?Ms_Q>=NO)S]5%f2Q".S-LhuEH )??bJ^O6w~QX2 .4iN$y` lKHf,YWiB|~T XBɥa0jK'aI_Pҷӊ0Y,7X:B0D"hCudu݉I9G0k7}xUm~R˪x<7a,=:{ܯ;N:80}1&Tܥ)$t/Rn=q:ʋY1;r*EbUfa,Qr,{HZMnewG0%}1CnI8Q~Mt0(?[^:xFpHN/VKbⅧp<@EcX-}=_I~y|zħef^j+UKj[`S 4+̼*ryMdgb [Y|UT#<|U#2sDr~CXDb~4 O9mrH',W.*:$fIP-56:z5?yK,*?)G:e(8 MDG|UσbP0AvT:qۀGe[uwd:5ipjj)9xy݅Z'8x}㼆y'3Rgt,cg)\.a{WΜ^{}CSMe<omh쯃ύfov`l!l=afͳjo;W 4p<޵psF٩!jWۑag5E5ED"AN3槢l R- O|\b`2(7<);4'@!(ׄ;4+ױOr5UQV!1 c㛧r qցGa0n"9Ű'ψ5sNy Po={N 5BRHA"ZGc{U3JCRV%-v9)4$ p$2:gfۨv}}%M&|EMLMըX&H#8Qԁ(Jkr"D* r ~Yx-pN#eS,eR"pB9)07S+?Ŭ̂eݟcD8@'(\ü瀟\:jikijZ JI15omXEi?Bu=Ĕ/w AtЅ1$|`Ϡb:d h>3=]72斔TjbBG)E?ɜTu>+b:8$ [MC\O 9rsݜ#)DWZ|QJYK=RS\ϿcY#J#Ry#&] ȿS}xVw&,O:!×#xM;/4^dŷ+0e4Td$LWbxi,gJxϨA':^$ Ies_IO|Ors,:ߥ&(w\4?OH;F=So sq!φDZinE'6B4?i,3R)opc ޭԬ܇y @ W29^NvS)Ѝ/>e%澳=pABu%;x ɲ&1YdO!)#pč 7_?oG ͦ ‚!ףQ\hYV*땋F迕T4\F;v- ,ۓ~CJ*Drp{Gz~@^^aLWa~3}mg2@01c݁:M| W*f{~`Vn=r4.l3ojZSW]yIBE. Z1̲8Y}S3Xaځ׎b&<e֛ǸFk5 vaNPpL;167pCJ=| T~.\ + ב1??}6ޮ]r+O<c 6r5Lb;z-h<̭%PG_LF鱭s1N~|%Or8bpIs}Ǟ}Xh n*ޱ7CyK*Ha{W&P)3m<䦑wl?~-,.<5z;8VpUO#x瀟k|y)p0Ǟ;L}ӁR/BJ)DB1 _[F3t6o|'_-+0ٷB?)r$('VO}~o?K-"Gؤ&J|(HwXTtHdćY~“"q&ͣrpiTn'Yȵ8/Ǥٕ]K tHm"'x9imQ0/1&(#̈́l\B#??^u89))FQ׋^pq_W,UaP؟ |T`{0l x> de+OB?JW?wS b7+{X,|UX^-߼i 6{9%di=eJZ@>OF;A:rjXCb3%?]uCysi3}?=8Mp+6S";AYtG9$Q{Jn?ft#pB,H,e褒_eaϝ b/ Mphɲv:قOt:o3$pPoܼ7;.cIsu s|hYVy3W0=\.O-e;@9l:rʔ7va>]["M/t=4F=*(~ "n0砎x`4~~4EԝT6mijGQhxBs ~ (?Ź}#roJOչ5;']41!|VygJtsQ>h7zDXc =c]0PI/[yDBb=ME+E."ԘELjܞ:\Ip>8-Ox]~s4QR#37!rqS[?t;~k'u?&{ض%G < 2O"So~扂*\l"6aڟ~|3yHE,WdZR~r 2*"@5e~`rH2sV|~ d<`P3S+Cv'Ey@z'tؿSa7oI@Q2z,R3%AJ,$>s΅~gO+7֊A{ w?nt&Hy};gs;Cqp ਑ 1L&H$oՅ568M?K7FDW:3˥Xz _Qx T{e7k?J!*3woQԽnQ"n$H\\wKO *kJ,916#{706/[4'L!pyɜ0C|攦y;+y*?2?45q&O1!ݖiz{!y/{J7~${O> -I'gSxtq0;o_YgY^ $eFTDvJ#=2+.4kgOr",/3,yF\(cu %9CϓToI=$pŭCy)?}~~So0q#y-vҶǎ<7(2ۢVyyt맯iփ+$/?(HhCG"?!O.??w~SIH$b6@ "ס/DK!Obb,`~GZdQ OtqJ9Wإ -&HϧWps<}*MfzUW8E9.JŰW0kDf'/1<ĿK;pR5L0:|5=\O})'Tb {Ŀ}P^({{ bShj攘YJ% tw=?w#?o*kYzSV\@U>\~YJJ]Sj}{yuV r)L$}W:<4; 1-\ĩSQ{xP\}˾<Ż$5R%>ӗx9s~wrq\&Q-j`k`;K~%?㛹G-K5?bMiu7/id/|L%M3ѓ-JXY&'CƗ) [&ܱ n$ xk͖f 'h;D,ƾ1grA03n'7 J}`bmN Ej<^$k|4܋Ļ>q֍dݰc'Wg9ny5_wyYL;~Cè~Ҁl]nMRK#><#кp&3FӅ\[n%~Á 5d6jF!B^8Fղ>^ʗ6z}9բ#USA~GEfמ y>haT0Fǃ0*LjkW_6[DSF kO穼\tv>"p}Z!Ӹ&$?GE+2\~ͺV+㮪~/EqT5 Vq˘~_zi/ C4O':V$$If!vh555p55 #v#v#vp#v#v :V 4 2065/ 34 p2Ddxxv 4 S RA4table-bulletTable Bullet3bdze@EWs){ndze@EWs){PNG  IHDRaV PLTE333EtRNS@fbKGDH cmPPJCmp0712OmIDATc```` Ak@.2MzstIENDB`$$If!vh555p55 #v#v#vp#v#v :V 065/ 34 Ddxxv 5 S RA5table-bulletTable Bullet4bdze@EWs){[ndze@EWs){PNG  IHDRaV PLTE333EtRNS@fbKGDH cmPPJCmp0712OmIDATc```` Ak@.2MzstIENDB`;$$If!vh555p55 #v#v#vp#v#v :V 2065/ 34 p2$$If!vh555p55 #v#v#vp#v#v :V 065/ 34 ;$$If!vh555p55 #v#v#vp#v#v :V 2065/ 34 p2$$If!vh555p55 #v#v#vp#v#v :V 065/ 34 q$$If!vh5f5 #vf#v :V 6,52 2x34 q$$If!vh5f5 #vf#v :V 6,52 2x34 $$If!vh55"#v#v":V 4065/ 34 q$$If!vh5f5$#vf#v$:V 6,52 2x34 q$$If!vh5f5$#vf#v$:V 6,52 2x34 $$If!vh5P5%#vP#v%:V 4 065/ 34 p$$If!vh5P5%#vP#v%:V 065/ 34 $$If!vh5P5%#vP#v%:V 065/ 34 p$$If!vh5P5%#vP#v%:V 065/ 34 $$If!vh5P5%#vP#v%:V 065/ 34 p$$If!vh5P5%#vP#v%:V 065/ 34 $$If!vh5P5%#vP#v%:V 065/ 34 p$$If!vh55"#v#v":V 4065/ 34 $$If!vh55"#v#v":V 4065/ 34 q$$If!vh5f5#vf#v:V 6,52 2x34 q$$If!vh5f5#vf#v:V 6,52 2x34 $$If!vh55"#v#v":V 4065/ 34 $$If!vh55r"#v#vr":V 4065/ 34 q$$If!vh5f5 #vf#v :V 6,52 2x34 q$$If!vh5f5 #vf#v :V 6,52 2x34 q$$If!vh5f5 #vf#v :V 6,52 2x34 q$$If!vh5f5$#vf#v$:V 6,52 2x34 q$$If!vh5f5[#vf#v[:V 6,52 2x34 q$$If!vh5f5[#vf#v[:V 6,52 2x34 q$$If!vh5f5[#vf#v[:V 6,52 2x34 q$$If!vh5f5[#vf#v[:V 6,52 2x34 $$If!vh55#v#v:V 4 065/ 34 p$$If!vh55#v#v:V 065/ 34 $$If!vh55#v#v:V 065/ 34 p$$If!vh55#v#v:V 065/ 34 $$If!vh55#v#v:V 065/ 34 pq$$If!vh5f5$#vf#v$:V 6,52 2x34 q$$If!vh5f5$#vf#v$:V 6,52 2x34 q$$If!vh5f5$#vf#v$:V 6,52 2x34 $$If!vh55 #v#v :V 4065/ 34 $$If!vh55#v#v:V 4 065/ 34 p$$If!vh55#v#v:V 065/ 34 $$If!vh55#v#v:V 065/ 34 p$$If!vh55#v#v:V 065/ 34 $$If!vh55#v#v:V 065/ 34 p$$If!vh55#v#v:V 065/ 34 $$If!vh55#v#v:V 065/ 34 p$$If!vh55#v#v:V 065/ 34 $$If!vh55#v#v:V 065/ 34 p$$If!vh55#v#v:V 065/ 34 $$If!vh55#v#v:V 065/ 34 p$$If!vh55#v#v:V 065/ 34 $$If!vh55#v#v:V 065/ 34 p~$$If!vh5Z5##vZ#v#:V 65922234 ~$$If!vh5Z5##vZ#v#:V 65922234 ~$$If!vh5Z5##vZ#v#:V 65922234 $$If!vh5 5 #v #v :V 4065/ 34 $$If!vh5X552#vX#v#v2:V 4 065/ 34 p$$If!vh5X552#vX#v#v2:V 065/ 34 $$If!vh5X552#vX#v#v2:V 065/ 34 p$$If!vh5X552#vX#v#v2:V 065/ 34 $$If!vh5X552#vX#v#v2:V 065/ 34 p$$If!vh5X552#vX#v#v2:V 065/ 34 $$If!vh5X552#vX#v#v2:V 065/ 34 p$$If!vh5X552#vX#v#v2:V 065/ 34 $$If!vh5>57"#v>#v7":V 4065/ 34 q$$If!vh5f5#vf#v:V 6,52 2x34 q$$If!vh5f5#vf#v:V 6,52 2x34 q$$If!vh5f5#vf#v:V 6,52 2x34 q$$If!vh5f5#vf#v:V 6,52 2x34 ~$$If!vh5Z5##vZ#v#:V 65922234 ~$$If!vh5Z5##vZ#v#:V 65922234 ~$$If!vh5Z5##vZ#v#:V 65922234 $$If!vh55 #v#v :V 4065/ 34 $$If!vh5x5 #vx#v :V 4 065/ 34 p$$If!vh5x5 #vx#v :V 065/ 34 $$If!vh5x5 #vx#v :V 065/ 34 p$$If!vh5x5 #vx#v :V 065/ 34 $$If!vh5x5 #vx#v :V 065/ 34 p$$If!vh5x5 #vx#v :V 065/ 34 $$If!vh5}5!#v}#v!:V 4065/ 34 ~$$If!vh5Z5#vZ#v:V 65922234 ~$$If!vh5Z5#vZ#v:V 65922234 $$If!vh55"#v#v":V 4065/ 34 Ddo r 6 S NA6sas_scr_07ssas_scr_07s5bH;$x~$>(n;$x~PNG  IHDRd٪PLTE      !%#$"(&').,-+*/0312675489=;<:@A?>BGEFDCJIH L M K Q R P N O S Y W X V W U T Z _ ^ \ ] [ a b ` f d e c k j h i g m l r s p q o ntzywxuv{~|}n$ZJbKGDH cmPPJCmp0712HsIDATx^횇S@Ə "Rc/A(6D{$I.f'q09n6o~|{/ d̏t"X)Jk9a~~"lӆ[6oݾbΪ]{jw﫭[ߴ@skWgg{G[wϡ;rɾӧΟ;sK#W/_~clĝn߼=y:=쫗3..-yOϕu9p=i>?>!CY)@_/Q)wB@R Ȯ圄d5qmع @3 t_y2B:c` $I2diH'݆Kd6v 9aPTB =!p±QYfS,0,P,y歏tlFXF'Q mEhTAH4$[-aezO'Y԰(.]K hd٬Yvj,:+"TCR JJ u@+%+WWq~ _S2 ,˨ǯj }5W@>`s}gqAhNfjUzS~&*BژaMVZ9&SfF2zwl7Y4mi?I&sDZ@h4${EOef-;6aj-^۬M7UZC G>+ APk(|!pbBȞE ~3S띐n, HtZ1]0k7knd;=Ɔ_fsX!z aj^C >GTm|ղb>4 X˱Qj1:TܺT ;M%a*C0(Wb+AB GM(Pk(|CYQ)N`Q_, IENDB`q$$If!vh5f5$#vf#v$:V 6,52 2x34 q$$If!vh5f5$#vf#v$:V 6,52 2x34 q$$If!vh5f5$#vf#v$:V 6,52 2x34 q$$If!vh5f5$#vf#v$:V 6,52 2x34 q$$If!vh5f5$#vf#v$:V 6,52 2x34 q$$If!vh5f5$#vf#v$:V 6,52 2x34 q$$If!vh5f5$#vf#v$:V 6,52 2x34 q$$If!vh5f5$#vf#v$:V 6,52 2x34 q$$If!vh5f5$#vf#v$:V 6,52 2x34 q$$If!vh5f5$#vf#v$:V 6,52 2x34 $$If!vh5 5k #v #vk :V 4 065/ 34 p$$If!vh5 5k #v #vk :V 065/ 34 $$If!vh5 5k #v #vk :V 065/ 34 p$$If!vh5 5k #v #vk :V 065/ 34 $$If!vh5 5k #v #vk :V 065/ 34 p$$If!vh5 5k #v #vk :V 065/ 34 fDd r 7 S NA7sas_scr_08ssas_scr_08s6b 3Nw^iyb;ŀ| 9nt 3Nw^iyb;ŀPNG  IHDRRUPLTE       !$%"#"'(&'*).-.+,*01/3126756489=;<9:@A>?>BHGEFDECIH M L M J K P Q R O P N R S Y W X U V T U Z _ ^ _ \ ] [ \ a b ` a f d e c d k i j h i g l m k l r s p q n o p nstzxywx{uv{}~|/bKGDH cmPPJCmp0712Hs IDATx^휉4ǗcCEYEYQ9DNEEEDDEPAEQ@PADh;m6tI0ۙI{Ki L!" A"2`mmCtmCosذ#F5|cF{ ?~ҤN2sƴӧN}`5f~G̙;.\4yK,^SK>rO/[|ժϮ[ڵkl޸i6<}m/u-/=cǫv{k޽΁CG~#ǟ|tɓ}z_>N}ͷ_9?sg~/qo^xŸ߸q?׮իW @T*HL% !Cd`!V}@܇ T>D:U+.S NUN> ˤ12LTP0 `"@g'zKH!HA&}]f3z)s++tt 8nD @.@@`B˖Z@@Jm2qсf$R40|H L@S@BR@f0F@@ `p;@4t7){ 0aLɨ iQ*"*!ܩRJhy̆wd9?9w_Fr_\q Lf-)}!FQ(+Ƹ|J@} Bys7o[f"@hݢFfp&(c_}^$I0UT7-*rȬ'#:b2\LL@*? NMQtn2N @D`DBHhn FC!DP SI?&rTG $yq8Dk\_Ű4™4j~:Xu%LFsm&&>)$͔D62!i .jL/&  `duZq"\(gf nud\(cI4JȎ3ǡaN5#d!1|Uv[pguc@2ݹyZ@m^5qfBg-XԛTib:v]?lGS?QG83"C3cFDTS2Sx)SNW7jUHqg1*$rjJۡfB/}Cr?DTQf $#xvԔ-e0˶LɇH DF&)&cswŇ]Fh E-LNYp^ZmzC&OO!Fݲ#v>Kܸd$#9O}؝iܐO-w)#UZOVPH?>GĞi 8/@Ƞ[*u Xߪ{fOl@TNV<0E4 $%蛐R#UCB0d (+It؜DzUbފ}HrvZ@hH@}6̸#6% ! Hyf+{Z/Nt)_]^(q[i3e P%8fD Y+C t/muk H6$Uࡐ25x)! tQƒ@)5߳$K.#xѮ( D) B=&ʋ D ٚ -%seQ` SjЖ*i&7b]%cdrԄ$Xe`!n=q}65=֬4YxlP GYdID+'-k=?@\\i)5O 1I]܂B䡃 &LƉ@0`2N L0`2dD*B*ph3e@ HTML Preformatted7 2( Px 4 #\'*.25@9CJOJPJQJ^JaJFO"F lastincelldPCJOJQJaJLO2L figurecaptiondPCJOJQJaJLOBL datepipedPB*CJOJQJaJphHORH bylinedPB*CJOJQJaJphfffPObP ancestorlinks dPCJOJQJaJVOrV ancestorlabeldPB*CJOJQJaJphfffDOD topofpagedPCJOJQJaJFOF onthispagedPCJOJQJaJBOB overviewdPCJOJQJaJJOJ overviewparadPCJOJQJaJ@O@ toclinkdPCJOJQJaJNON tocbulletdPB*CJOJQJaJphbOb containerheaderdP-DM CJOJQJaJfOf containerfooterdP-DM CJOJQJaJHOH relatedlink dPCJOJQJaJLOL rlbullet!dPB*CJOJQJaJph`O"` sidebarcontent"dP-DM CJOJQJaJPO2P downloadcaption#dPCJOJQJaJ@OB@ streams$dPCJOJQJaJOR downloadruleB%dPx&d-DM P]^CJOJQJaJDObD getplayer&dPCJOJQJaJFOrF getplayer2'dPCJOJQJaJ>O> file (dPiCJOJQJaJHOH filedetails)dPCJOJQJaJPOP streampipe*dPB*CJOJQJaJphBOB fnspacer+dPCJOJQJaJ`O` figurerule!,dPi-DM CJOJQJaJ`O` pullquoterule1-dP-DM CJOJQJaJhOh pullquoterule2!.dP-DM CJOJQJaJZOZ sourcelessquote/dtB*CJOJQJaJphfROR directquote0dtB*CJOJQJaJphfBOB citation1dPCJOJQJaJTO"T citationauthor2dP5CJOJQJ\aJFO2F startquote3dPCJOJQJaJBOBB endquote4dPCJOJQJaJRORR fargraphic5dP^CJOJQJaJTObT neargraphic6dP]CJOJQJaJJOrJ numberedlist7dPCJOJQJaJFOF listnumber8dPCJOJQJaJ^O^ sidebarheader9dP-DM CJOJQJaJbOb sidebarfooter:dP-DM CJOJQJaJFOF pagenumber;dPCJOJQJaJFOF footnote<dPCJOJQJ^JaJJOJ footnotetext=dPCJOJQJaJLOL footnotes>dPCJOJQJaJbOb sidebarclass ?iidPx]i^iCJOJQJaJBOB bioimage@dPCJOJQJaJFOF linklist AdPCJOJQJaJBO"B linkitemBdPCJOJQJaJPO2P linkbulletCdPB*CJOJQJaJphPOBP listbulletDdPB*CJOJQJaJphBORB listitemEdPCJOJQJaJVObV datatableFdP&dPCJOJQJaJjOrj tableheaderGdP-DM 5B*CJOJQJ\aJphHOH superheaderHdPCJOJQJaJ`O` stdheaderIdP-DM B*CJOJQJaJphVOV subheaderJdP-DM CJOJQJaJXOX evenrecordKdP-DM CJOJQJaJZOZ rowlabelLdP-DM 5CJOJQJ\aJDOD keylegendMdPCJOJQJaJ>O> keyNdP5CJOJQJ\aJ>O> legendOdPCJOJQJaJVOV legendbulletsPdPB*CJOJQJaJphfffROR databulletsQdPB*CJOJQJaJphfffZO"Z tablefootnotesRKdPi^KCJOJQJaJ`O2` datatablebottommargin SdPCJOJQJaJNOBN simpleformTdP,CJOJQJaJbORb simpleformselectUZdP]ZCJOJQJ^JaJlObl simpleformselectsmallVZdP]ZCJOJQJ^JaJnOrn simpleformselectmediumWZdP]ZCJOJQJ^JaJlOl simpleformselectlargeXZdP]ZCJOJQJ^JaJ^O^ simpleformtextYZdP]ZCJOJQJ^JaJVOV simpleformsubmitZdPCJOJQJ^JaJJOJ alerttype[dP5CJOJQJ\aJtOt gt0L\dP$d %d &d 'd N;qO;qP;qQ;qOJQJO gt1]]dP$d%d&d'd-D@M iNOPQOJQJFOF gtsep^dPB*CJOJQJaJphO lt0]_dP$d%d&d'd-DM NOPQCJOJQJaJO lt1]`dP$d%d&d'd-DM NOPQCJOJQJaJFOF ltsepadPB*CJOJQJaJph8O!8 codesample OJQJo(FO1F FollowedHyperlink1 >*ph3FOAF FollowedHyperlink2 >*ph3LORL Normal (Web)1edPCJOJQJaJLObL Normal (Web)2fdPCJOJQJaJbOrb listbullet1 giidPx]i^iB*OJQJph\O\ listitem1 hiidPx]i^iCJOJQJaJLOL Normal (Web)3idPCJOJQJaJNON Heading 31 j-@&5CJOJQJ\aJO HTML Preformatted1=k 2( Px 4 #\'*.25@9d8CJOJPJQJ^JaJROR Normal (Web)4ldP5CJOJQJ\aJ\O\ FollowedHyperlink3 ]5>*\ph3q e!z!z!z!z!z!z!z!z! z! z! z% z! z!z!z!z!z!z!z!z!z!z!z%z!z!z!z!z!z!z!z! z!!z!"z!#z!$z!%z!&z!'z!(z!)z!*z!+z!,z!-z!.z!/z!0z!1z!2z!3z!4z!5z%6z!7z!8z!9z!:z!;z!<z%=z%>z%?z!@z!Az!Bz!Cz!Dz!Ez%Fz!Gz!Hz!Iz%Jz%Kz!Lz!Mz!Nz!Oz!Pz!Qz!Rz!Sz!Tz!Uz%Vz%Wz!Xz!Yz!Zz![z!\z!]z%^z$_z `z az bz cz dz ez '4=J$Xdiwi}l1Rkml$2<=GPX`lQv}tː@³;Bt $L/r////JwU9ajvf~Iڣf|ccp4 "-8=E,QCX[0```jotS_Nic 2' 2 n 7 {D<!X~* ,!"#$#$%:&+'()<*+*+,-./Y012m3J454O5h4B567895:;<=>?@ANBCADEFGHIHYIJK>LVMN)OsPQ7RSTSTU|V9WXY1Z[l\]\]^_C`abcd 4:GpSU= > @ f g T 11b ]^`'8 ^ |"#$K$m$$$$%%')}++- - ---e.x...-/J/R0c0013444445`55555i7778\::;;;==>~@@@@BABCCCC D DD"D+D,D0DADIDJDOD]DhDiD1E6E8EEEGSGxGGGIJWLMMNPPPPPQRrTVVV4W5WAW$XXXYYYZZ[[[\9\\J^B`Y`p`y```abbbddddwff gggk,mn+pppprr|s}ssttttUuguhujuuuuuwwy z4zlzzzzzzzz|4|5|9|}q}r}}}~~~`3ABIhir<=AۅQRYyz~GcsA]Jlēq7iҘ6_ g} 4QV]NZME1(BlZس1жú̺ (DEistӻ()9rsX2Uq0 ?V89Rp/w$o?ZA)RH=w;.exIdi)*NjB235Rkr~Zu-Le 5EF~5;DFOYpu*e )*/:7RPQYxX Y b      $   E H g     Fjk#?m7?[1: z  t!!2""#%%(R))))))(*)*+*|*}**+++,, -..J/O/Q/1111243[333556#6)6*6,6667696K6L6N6S6T678::::;Q<<<<==>???? ? ? ???5?]??????@@~AACUCWC DDDEEFGGGGGGGGGH9H`HaHHHHHTI|IIIII@JhJJJJJkLLNNOOPP]QQQRSRURWRYR[R]R_RaRRRRR#SLSySSSS*TVTnTTTT&URUjU{UU,V^WXXXXXXXXXXXXYYY YYYYYY:Y;YkYlYYYYZ(Z/Z^Z_ZZZZZ"[)[T[U[|[0]_i__Z`\```````bdeeeeeeeeeeefBfffffggggg`hbhiiiiijNjzjjkkl1l^l-m_moqqGsIsttttvvQvSvUvWvYv[v]v_vavcvfvivlvovrvvvvv8wFwwww xxOx]xdxexxxy/yyz?zkzzz{{{|}}}}}}}}*~+~<~fBEɂʂ̂RSUfg+acegikmoqsvy|:_}  !2CToяː۔Fz|~˖̖ٗ#tuƘǘϘ-ܚݚ().Μ):AJOQwx;u KMOQSUWYƣDrɤ &@k#"')ɪʪ 0YJXHݯm%/0M\]tͲβ *+Pfg³ӳ v8޾;w k>NY^pnJrNPz{}./@ PXqrt\]_PQS$%(|}S@A?t()D8:suL/Y|# B B-]h@AD4DEq/YAUlt.6X{'tu|\^bcejkmstbcp z"%      ) * - W Y [ ] _ a c e g    . o       xSTk014efi6RTVXZ\^`bd@B@xy {l:;L QRXvw&'.O P Z   7!!""######$M$$$$%'((((((((((()G)~))))) *1*2*H*q*a+c++++,,,,,,=,>,--9....... ///#/r//// 0&0'0/0q00011^3333333 4 4"444658595:5Q555e6g6h6i6~67 777777/81888888Z9\999999u:w:;;;; ;;; <<<<<<<B=D=E=F=O=Q=S======n>>? @ @ @@@@'A)A*A+A2A4A6AAHBIBJBVBXBZBBBBBBBBCCCCCDDD'E(E)E.E0EEBFFFFFF\GGnHoHpHIeJJJJJJJJJJ5KgKKKK#L$LLLM_MMN~NNNO5OKPQ1RQRTwUUUUUUU VLVwVxVVWXYYYYYYYY.Z^ZZZZZf\^ _+``9a;a=a?aAaCaEazaaaa*bcbdbbbbc8cIcrc7ddddeeffffffffffffgggggg!g"g%g3g4gij7j9j;j=j?jAjCjEjzjjjj!kQkkkll!mopwpyprrrsUuvw>wwwwxxxx y yyy,y-y7y>ySyTy_ylyyyyyyyyyzzzzz{{||||||||}6}|}}}}},~4~M~X~f~j~m~v~~PRTÀĀɀˀ8!7`rYч҇؇&./3:;AOPT[\aijowxˆÈ͈Ոֈވ  ./3:;DJKQST\^_cefp&֊38\ȋgiߑ6k>ASTW  BX7I̛~۝ <SXn֡So wĤǤʤͤФ@ASTtɥۥ#$`-;={|afhjlnprtvxج"#Ryz 15T}]?_3Gкejlk#TѿB]1%367!":MOPcqst!a$SY'gOz|!!016GIJQbfgm~!#%7lm :;Q  #$&.457@GHJPTUW\_`-cegikmoqsux{~:;V?AUa 4i'(:c3U1Mdv0P?b6j   +,5<>C~5jduvx-LopvwyU!#%')+d A 4      ikmFd[]X{r>!LhYS 7 ` \!#%& ' ''''''''''"'['''''(Z(_(((((( )+2+[+-/000001 1"1N1O1M2R2T22233333333333333 456'7.7:7;7A7{7|77777888j8k8888:t;v;<< <i<===>>>@.ATA}ABCMDDDDDDDDDE7EiRiiiijjjujvjjjjj1k2kmllllllllllmFmmmm@nAnnnn oo3oOoxopwrrrssssstsssss)tntottuu]v_vxvyv{vDwEwGwpwqwswww)x^_o$?e$'HILnor۽!Jx<N\])>ikmoqs  ./er]x}KL"3!qrt.H  (cegikmoqsux%&SUBnst.H_wX[ ),MNQop+t!N:m  00000000000 0 0 0 0 0 0 0 0 0 0 0 00000M900000000000000000000 0 0 0 0 0 0 0 0 00000000000000(0000(0000 0 0 00000000000p0p0p0p0p0p0p00p00000000p008(0p0p0p0p0p0p0 0 0 000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00@0 0 0 00p0p0p(000p0000000 00(0P0p0p0p0p0 0 0 (000p0 0 0 0 0 0 0 0 0 00000X0p0p0p0p0p0p00p0 0 0 00000 0p0`0p0p0p0p0p0p0p0p0 0 0 0 0 0 00 00 0 0 000 0 0(00p0p0x0p0p0p0p0 0 0 0 00 0 0 00 0 0 00000000 0 0 0 0 0 0 0 0 0 0 0 00 0 0 000 0 0 0 0 0 0 0 0 0 0 (00p0p0p0p00p00p0p0p0p0p000p0p000p0p00000p000p0p0p0p0p0p000p0p0000p0p0p0p0p0p0p00p0p0p0000(0p0p0p0p(0p0p00p0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00p0p0p(0p00p0p0p0p0p0p0p00p0p0p0p0p0p000 00 0 00p0p0p0p0p00p0p(000p00p(00p0p0p0p0p0p00p0p00p0p00p0p0 0 0 00p0p0p(00p0p0p0p0p0p0p0p0p0p00p000 000 0 00p0p00p0p00p0p0p(0p0p0p0 0 0 0 0 0 0 0 0 (00p0p0 0 0 0 000 0 0 000 0 0 0000 0 00p0000000000 0000000000 0 00p0p0p0p00p0p0p0p0p(0p0p0p000p0p0p0 0 0 0 000 0 0 00000 0 0 0 0 0 000 0 0 0 0 0 0 0 0 0 0 00 00 0 0 00 0 0000000 00000 0 00p00p0p00p0p0p0p0p0p0p0p0p0p(00p0p0p0p0p0p0p0p0p00p0p0p00p0 0p0 0 0 0 0 0 0 0 0 (0000p0p00p0p00p0 0 0 00p0p0p000p0p0p0p0p0 0 0 0 0 0 0 0 0 0 0 0 00p0p0p00p00p000p0p0p0p00000000 00000000 0 0(0p00p0 0 0 0 0 0 00p0@0000000 0000000 0 00p0p0p0p00p0p00p0p00p(0p00p0p0H0p0p0p0p0p00000000 00000000 0 00p0p00p0p00p0p00p000p00p0000000000000000000 0000000000000000000 0 (00p0p0p(0X0p0 0 0 0 0 0 00p000p000000000 000000000 0 00p0 0 0 0 0 0 00p0p0p0p0p000p0p0p0p0p0p00 0 0 0 00 0 000000000000000 00000000000000 0 00p0p0p0p0p0p0p0p0p00p0p00p0 0 0 0 0 0 0 0 0 (00p0p0p0p0 0 0 0 0 0 0 0 0 00p000000000000 000000000000 0 00 0 0 (00p0p0p0p0p0p00p0p00p0p0p0p0p0p0p0p0p(0p00p0p0p0p0p000 000 0 00p0p0p0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 00p0p0p0p00p0p0 0 0 00p0p0p0p0p0p0000000 0000000 0 00p0p0p0p0p0p00p0p0p0p0p00 0 0 00p0p0p0p0p0p0p0(0p0p0p(0p0p00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00p0p0p0p0p0p00p(0p0p0p0p0p0p0p00p0p0p00p0p000p00p00p0 0p0p0p0p0p0p0p00p0p0 0 0 0 0 0 0 0 0 (000p00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00000 000 0 00 0 0 00p0p0p0p00p0 0 0 (00p0p0p0 0 0 0 0 0 000p0p0p00p0p0p0p00p0p0p0p(0p0p000p0p0p0p0p00p0p000p0p0 0 0 0 0 0 0 0 0 (000p0p0000000000 0000000000 0 00p0p000p0p0p0p0p0p00p0p00p0p0p0p0p00p0p0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 000 0 0 0 0 0 00 0 0 0 0 0 0 0 (00p0 0 0 0 0 0 0 0 0 00p00000000 00000000 0 00p0p0p0p0 0 0 (000 0 0 0 0 0 0 0 0 00p00000 00000 0 (00p0000000000 000000000 0 (00p0p0p0p00p0p00p0p0p0p0p00p0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00p0 0 0 (000p000 000 0 (00 0 0p0p000000000 000000000 0 00p0p0 0 0 0 0 0 0 0 0 0 0 0 00p0p00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0(0p0p0p0p0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0p0H0000000 0000000 0 00p0p0p0p000p0p0p(0p00p0p0p0p0p0p0000 0000 0 (00p0p0000000 00000 0 (000p0p0X0p0p000000 000000 0 00p0p00p0p00p0p00 0 0 000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00p0p0000000 0000000 0 000p0p00 0 0 (00p0p0p0p0p000p0p00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00p0 0 0 00p000000 000000 0 00p0p0p0p0p0p0(0p0p0p000 00 0 00 0 0 (000000 00 0 000p0p0p0p0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 0000p0p0p0p0p000p0p00 0 0 000 0 0 0 0 0 0 0 0 00p0p0p0p00 0 0 0 0 0 0 0 0 00p00p0p0p0p0p0p0000p00p00p0 0p00p0p0p0p0p0p00p0p0000000000000000 000000000000000 0 00p0p0p0p0 0 0 0 0 0 00p0p000000000 000000000 0 00p0p0p0p0p0p0p0p0p00p0p0(00p0p0p0p0p0p00 0 0 (00p0p000000 000000 0 000p(0p0p0p0p0p0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00p0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00p0p0p0p0p0p0p00000000000000 00000000000000 0 0(0p0p00p0p0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00p00000000 00000000 0 (000p00p0p0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 000000000000000000000000000000000 000000000000000000000000000000 0 00p00p0p0p0 0 0 0 000 0 0 00000 0 0 000 0 00p00p0(0p0p0p0p0p0p00p(0p0p0p0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00p0p0p0p0p0p0 0 0 0 0 0 0(0p0p0p0p000 00 0 00 0 0 0 0 0 (00p000p0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00p00000 00000 0 00p0p0(0p0p0p0p0p0p000 00 0 000p0p0p(00p0p0p0 0 0 0 0 0 00p0p0p(0p0p00p00000 00000 0 0000p(0p0p0p0p0 00p00p0p0p0p0p0000000000000 00000000000 0 000p0(0p0p0p0p0 0 0 0 0 0 0 0 0 00p0 0 0 00 0 0 0 0 0 0 0 0 0 0 0 000p0p0p0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00p0p0p00 0 0 0 00 0 0 00 0 00p0p0@0p0p0p0p00000 00000 0 00p0p0p00p0p0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 00p0000000000000 0000000000000 0 00p0p0p0p0p0p00p0p00p0p0p0p0p0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00p0p00000000000000000000000 00000000000000000000000 0 00p0p0 0 0 0 0 0 0 0 0 0 0 0 00 0 0 0 00 0 0 0 0 00p00000 00000 0 00p0p00p0p00p0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00p0000000 0000000 0 000p00p0p0p0p0p0p0p0 0 0 0 0 0 00p00 00 0 00p0p0p0 0 0 0 0 0 0 0 0 0 0 0 00p0p0p0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 00p0p0p0p0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 (00p000p00 0 0 0 0 0 0 0 0 00p0000000000 0000000000 0 (00p0p0 0 0 0 0 0 0 0 0 00 0 0 00p000000 000000 0 (000p0p00p0p0p000000000 0000000 0 (00p0p0 0 0 0 0 0 0 0 0 00p0000000000000 0000000000000 0 00p0p0p0p0p000p0p00(0p0p0p0p0p0p0p00p0p0 0 0 0 0 0 0 0 0 000000000 00000000 0 00p0p000p0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0000p0p0p0p0p0p0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 0 0 0 00p0 0 0 0 0000 0 0 00000 0 0 000000 0 00p0p0 0 0 0 0 0 0 0 0 0 0 0 (00p0p0p0p000000 00000 0 (00p0p0p0p0p00p0p00000 00000 0 00p000p0p0p0 0 0 0000(0p0p0 00 0 0 00 0 0 00 0 0 00 0 00p0p0 0 0 00000000000 0000000000 0 000p0 00 0 0 00 0 00p0000000000 0000000000 0 000000000000 0000000000 0 00p0p0p0p0p0p00p0p00p000 0 0 0 0 0 00p0 0 0 0 0 0 0 0 0 000 0 0 000000000000000000 00000000000000000 0 00pCsfiZ!>q̞ :%"<AFLRxzfUo :X=qnkI #+6<NSer ",3P`sf]&''5`=@J L+LILhLMYacl|{g}qAh<Qy1 Ds(r8o*~~)  PX #2*(2+4;6>K>S>FH LOPkT[,^aTchmoqzr|o~dɊf ˞tƠܢ(w&J/\ͺ*f;N.q\P$|@(|@D   t b s b  )S4"$:%%%&Q&v&&&&&'''O((*,0H245 77&88; < <9=g>?@ACDDEE H*IHJJK(MNoPR#TYw^.b=ijnnnoo!o3oCrox,SPя.:O[iwՐ.:JS^eȓߙS Ǭ#fy6!OsSz!If%#4GT_q;'6 ,o v Ud#&/239:;;:?{??@j@DFMFSSSS2TT UUUVTWWWTX+YOZ\```9akaaaaduefngghk=qqrurr1sFuOws{n|x~pހ$n&ߌFБړ$ɘpR(kz׬³H$}";^H].Ks        !"$%&'()*,-./012345789:;=>?@ABCDEFGHIJKLMOPQRTUVWXYZ[\]^_`abcdfghijklmnopqstuvwxyz{|}~     !#$%&'()*+-./012456789:;<=>?@ABCDEFGHIJKLMNOQRSTUVWXYZ[\]^_abcdefghijklmnopqrtuvwxyz{|}~ /00:;;;;;PiP}P ggg[wUj|~UYoRXn79;NRh%6?CY!."0"2"""DFHůۯBM"44442545Q5555a6c6~677 7777+8-818888V9X9\9999q:s:w::: ;;;;<< <<<<>=@=S====j>l>n>>>>|?~??@@@@@@#A%A6AAAADBFBZBBBB{C}CCDDDDDD#E%E0EEEE>F@FBFFFFXGZG\GGGGjHlHrerxrG̺κкMc. nWWWuuurt XtCXXCXXCXCXCXXCXCXXCXCXCXCXCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCXCXCCXCXCCX4CC=P,H$P'P'P'PT'P''P'(P')PT'*P'+P',P'-PT'.P'/P'0P'@PT'AP'BP'CP'DPT'EP'FP,'GP'HP'IP'JP\'KP'NP'LP'MP\'OP'RP'PP'QP\'%P'&P'>P'?P\'=P'8> mr "?DcehkYvdy|""n&s&((++ 000gLiLUUjUlU]]FmZmX^zˉ  ؘܘŝΝfo֧RY&(;=lux :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::SU> @ ^`- -~@@CiD1E8EEEVVXXYYZ[bbrr}ssttUujuzz5|9|r}}}BISr=ARYz~سúEiӻ)2U\35R5F /QYY b    $ E H    )))))*+*J/Q/5T6???@UCWCDDFFGGQRaRXYZ`\```eegg`hbhiiGsIsttQvrvPxex}}}}ʂ̂SUa| z#uǘϘ|ݚ).JQKY")β+PgpNPW}Pt]_QS%(s ADX'u|cp "%M    - g   14fiRdl;L RXw'.P Z 7!>!##((a+c+++,>,.. /#/// 0/03"44465Q555e6~67 777/81888Z9\999u:w:; ;;;<<B=S=== @@@@'A6AJBZBBBCCDD)E0EFFJJK$L1RQRUUxVVYY9aEaddf4g7jEjopypxlyyyzzx{{||}}PTĀˀgi>WSnФ$.=fxRzкl7%`cc ,CvxLpwyU!+A im[]r '"'0000 1"1M2T23 4'7A7|777788t;v;< <==TA}ADD7E=EKRKKKKKKL3L9LLL!M.MMMMNNNUOZOOO%P(PUPXPPPQRzXXXXXX:YCYlYwYYYYY[5\X____````bbcc*iRiiijjvjjjjmllrrssss%v{vEwGwqwwxxyy"z$z{{V|X|o}q}$='0ʇGJwz Rv$hkʐѐapjx֟),Igs*f֧iëƫDT7N%(IL~wz "$5NͶ_o$'ILor۽xisxrtcxntbX[),NQ  RZ5lwf֕^`.^`.pp^p`.@ @ ^@ `.^`.^`.^`.^`.PP^P`.5lwzJĜ~>2XHCluʀ8DHP`]gTPV4iSU= > @ f g ]^` - ---@@@BABCCC D DD"D+D,D0DADIDJDOD]DhDiD6E8EEEVV4W5WXXYYYZZ[[[bbddrr|s}ssttttguhujuuuzzzzz4|5|9|q}r}}}ABIhir<=AQRYyz~ú̺ (DEistӻ()9rs89)*235kr~EF )*/PQYX Y b      $   E H     )))))(*)*+*|*}*O/Q/116#6)6*6,6667696K6L6N6S6T6??@@UCWC DDDEEGGHHQRaRSSXYT[U[Z`\``````eegg`hbhiiiiiGsIstttvvQvrvdxex}}}}}}}}*~+~ɂʂ̂RSUfga|  z˖̖#tuƘǘϘܚݚ().OQwxKY')ɪʪ%/0M\]tͲβ *+Pfg³NPz{}./PXqrt\]_PQS$%(|}@A()su@AD{'tu|\^bcejkmstbcp "%      ) * W g   ST014efiRd:;L QRXvw&'.O P Z   !""##$$((1*2*a+c++++,,,,,,=,>,...... ///#/r//// 0&0'0/0q00033333 4 4"444658595:5Q555e6g6h6i6~67 777777/81888888Z9\999999u:w:;;;; ;;; <<<<<<<B=D=E=F=O=Q=S======n>>? @ @ @@@@'A)A*A+A2A4A6AAHBIBJBVBXBZBBBBBBBBCCCCCDDD'E(E)E.E0EEBFFFFFF\GGnHoHpHJJ#L$LUUwVxVYYZZ9aEacbdbddeefffffffffffgggggg!g"g%g3g4g7jEjkkwpyprrxxx y yyy,y-y7y>ySyTy_ylyyyyyyyyyzzzz{{||}}PTÀĀɀˀч҇؇&./3:;AOPT[\aijowxˆÈ͈Ոֈވ  ./3:;DJKQST\^_cefpgiߑ>ASTWФ#$;={|fxyzjl%367!":MOPcqst!016GIJQbfgm~%:; #$&.457@GHJPTUW\_`c'(   +,5<>C~uvxopvwy!+im[] '"'((000001 1"1N1O1R2T2223333333333333'7.7:7;7A7{7|77777888j8k8t;v;<< <===>>DDiRiiiijjjujvjjjjj1k2kll@nAnrrssssstsssntot]v_vxvyv{vDwEwGwpwqwswwwxxyyy!z"z$z${%{{{U|V|X|n}o}q}~~$+78=&'0߄FGJvwzЉщ YZ!$~ghkɐʐϐѐۑܑopjxRS(),klIg֤פ«ëƫDTMN$%(HIL}~wz !"$ݵ޵ߵ458MNͶԶ^_o$'HILnor\]is./}KLqrtcxstX[ ),MNQop @  P@UnknownGz Times New Roman5Symbol3& z ArialE5  Lucida Console7&  Verdana?5 z Courier New5& z!Tahoma"1hee >ee >!24a3QH? WSH PrimerRZRZ Oh+'0h  $ 0 <HPX` WSH PrimerSH RZ Z Z  Normal.dotRZm2mMicrosoft Word 10.0@F#@p>K@p>Kee՜.+,D՜.+,8 hp|  ASE> A  WSH Primer Title 8@ _PID_HLINKSA~YLFhttp://www.microsoft.com/technet/scriptcenter/guide/sas_scr_tspz.mspx{chttp://www.microsoft.com/library/media/1033/technet/images/scriptcenter/guide/sas_wsh_140c_big.gifnchttp://www.microsoft.com/library/media/1033/technet/images/scriptcenter/guide/sas_wsh_118s_big.gifnchttp://www.microsoft.com/library/media/1033/technet/images/scriptcenter/guide/sas_wsh_114s_big.gifGJFhttp://www.microsoft.com/technet/scriptcenter/guide/sas_wsh_hilv.mspxDNNFhttp://www.microsoft.com/technet/scriptcenter/guide/sas_adm_nize.mspx~Hchttp://www.microsoft.com/library/media/1033/technet/images/scriptcenter/guide/sas_wsh_110c_big.gifBchttp://www.microsoft.com/library/media/1033/technet/images/scriptcenter/guide/sas_wsh_105c_big.gifGi<bhttp://www.microsoft.com/library/media/1033/technet/images/scriptcenter/guide/sas_wsh_60c_big.gif\G6Fhttp://www.microsoft.com/technet/scriptcenter/guide/sas_wsh_pkoy.mspxYk3bhttp://www.microsoft.com/library/media/1033/technet/images/scriptcenter/guide/sas_wsh_82s_big.gifIi-bhttp://www.microsoft.com/library/media/1033/technet/images/scriptcenter/guide/sas_wsh_80c_big.gif@^'Jhttp://www.microsoft.com/technet/scriptcenter/guide/sas_vbs_overview.mspxx$chttp://www.microsoft.com/library/media/1033/technet/images/scriptcenter/guide/sas_wsh_070c_big.gifWkbhttp://www.microsoft.com/library/media/1033/technet/images/scriptcenter/guide/sas_wsh_62s_big.gifGibhttp://www.microsoft.com/library/media/1033/technet/images/scriptcenter/guide/sas_wsh_60c_big.gifGWFhttp://www.microsoft.com/technet/scriptcenter/guide/sas_wsh_immo.mspxTRJhttp://www.microsoft.com/technet/scriptcenter/guide/sas_ent_overview.mspxEH Fhttp://www.microsoft.com/technet/scriptcenter/guide/sas_wsh_kumh.mspxAnbhttp://www.microsoft.com/library/media/1033/technet/images/scriptcenter/guide/sas_wsh_07c_big.gif^DFhttp://www.microsoft.com/technet/scriptcenter/guide/sas_wsh_xaep.mspx  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTVWXYZ[\^_`abcdefgxRoot Entry FAQ'>KzData le1TablesWordDocument(SummaryInformation(UDocumentSummaryInformation8] CompObjj  FMicrosoft Word Document MSWordDocWord.Document.89q