Detailed Answers

Team-Fly    

Developing XML Web Services and Server Components with Visual C#™ .NET and the .NET Framework, Exam Cram™ 2 (Exam 70-320)
By Amit Kalani, Priti Kalani

Table of Contents
Chapter 16.  Answer Key for Practice Exam #2


A1:

The correct answer is B. SingleCall SAOs have no state, so they're easy to load-balance just by adding new servers. Answer A is incorrect because Singleton SAOs maintain state and thus are not suited for a load-balancing environment. Answers C and D are incorrect because, for a heavily loaded application, SAOs are preferable to CAOs because they do not transmit as much data across the network for each call.

A2:

The correct answer is B. By creating an interface, you can expose the functionality to the clients without leaking any implementation details. Answer A is incorrect because if the client applications are written in C++, they will lose the benefits provided by the CLR to the managed code. Answer C is incorrect because if you remove the implementation code from the client's copy of the Product class, the client's application will not compile because of the missing implementation details of the Product class. Answer D is incorrect because by changing the type of the application, you also require the client to have the implementation details of the Product class.

A3:

The correct answer is A. To make efficient use of the features of IIS and ASP.NET from a Remoting server and to not open the ports in the firewall for communication, you should use HttpChannel. For maximum interoperability with clients across platforms and languages, you should use SoapFormatter. Thus, answers B, C, and D are incorrect.

A4:

The correct answer is D. In this scenario, you need to register a client-activated remote object in the client's application domain, which you can do using the RegisterActivatedClientType() method. Answers A and B are incorrect because these options are used for creating server-activated objects. Answer C is incorrect because the RegisterActivatedServiceType() method is used to register the CAO with the Remoting system on the server rather than the client.

A5:

The correct answers are B and D. The Serializable attribute indicates that the class containing this attribute can be serialized. If you want to control the serialization process, you should implement the ISerializable interface and provide the serialization logic in the GetObjectData() method provided by the ISerializable interface. Therefore, even if you provide your own serialization logic, you need to mark the class with the Serializable attribute. Answer A is incorrect because the NonSerialized attribute is used when you don't want to serialize a specific field of a class. Answer C is incorrect because the Order remote object consists of a Product object and you don't want the Product object to become a marshal-by-ref object.

A6:

The correct answer is C. Because the remote object is hosted in IIS, the remote object can be accessed only using the HTTP channel, and it can be activated only as a server-activated object. Answers A and B are incorrect because IIS activation does not support the TCP channel. Answer D is incorrect because IIS cannot activate the remote object as a client-activated object.

A7:

The correct answer is D. The issue in the question is not of speed, but of responsiveness. This behavior occurs because the Windows application is calling the methods on the remote object synchronously. You can make the user interface more responsive by simply calling the remote method asynchronously. Answer A is incorrect because switching to binary format also makes the application nonresponsive until the remote method is executed. Answer B is incorrect because IIS does not support the TCP channel. Answer C is incorrect because no modifications are needed on the remotable object to achieve this behavior.

A8:

The correct answer is A. The Web methods exposed by a Web service are only those methods that are declared public and are decorated with the WebMethod attribute. Answer B is incorrect because until a method is decorated with the WebMethod attribute and defined as public, it will not be exposed from the Web service. Answers C and D are incorrect because you are not required to use either UDDI or WSDL with a Web service.

A9:

The correct answer is C. Specifying a unique namespace for the new object removes the chance that it will clash with a pre-existing object name, and it does not require you to change any existing code. Answer A is incorrect because renaming the existing class might break the applications that use this class. Answer B is incorrect because you might lose the changes whenever you regenerate the proxy class. Answer D is incorrect because the out option changes only the output filename for the generated proxy; it has no impact on the name of the proxy class generated.

A10:

The correct answer is C. The .NET Web services can serialize complex objects and pass SOAP messages containing these objects across firewalls and across language boundaries. However, the client application must contain information about how to reconstitute the object, including a reference to the object's definition. Answer A is incorrect because the languages in which the Web service and client project are written can be different. Answer B is incorrect because if SOAP calls were blocked by the firewall, you would not be able to call any method on the Web service. Answer D is incorrect because the Hashtable class is defined with the Serializable attribute; therefore, the Hashtable object can be serialized.

A11:

The correct answer is A. The GetInitializer() method is called once when the SOAP extension is first invoked and is the appropriate event for one-time resource setup. Answer B is incorrect because the Initialize() method is called every time the SOAP extension is invoked. Answer C is incorrect because the ChainStream() method enables you to intercept the actual SOAP message stream and, therefore, is not the right place to perform one-time setup. Answer D is incorrect because the ProcessMessage() method is called with actual SOAP message requests and responses.

A12:

The correct answer is B. This SOAP extension needs to monitor and alter the XML messages that are sent from client to server. These messages are available on the client only in the AfterSerialize stage. Therefore, answers A, C, and D are incorrect.

A13:

The correct answer is D. Using the callback is the most efficient way to manage usage of your threads because the callback methods do not block threads while waiting for the response. Answers A and C are not correct because the WaitAll() or WaitAny() methods of the WaitHandle object will block the thread until the Web service calls have completed. Answer B is not correct because the End() method will not return until the asynchronous operation is complete because this method uses IAsyncResult.AsyncWaitHandle to check for the Web service completion.

A14:

The correct answer is C. To minimize the hit to the ERP system and improve the performance of the Web service, you can use session state to store the order details placed within the last six months by the customer. Answer A is incorrect because enabling the CacheDuration attribute will not reduce the hits to the ERP system; it will improve the performance of the Web service only if the order details of a particular order are requested more than once. Answer B is incorrect; response buffering will make the Web service appear more slow because the response will be buffered until the whole response is created. Answer D is incorrect because the application state cannot be used to store customer-specific data; the application state is global to the application.

A15:

The correct answer is D. A client certificate contains identification information about a user and the organization that issued the certificate and a public key. You can use client certificate authentication, along with SSL encryption, to implement a highly secure method for verifying the identity of your users. Answers A and B are incorrect because these techniques require passing authentication information such as username and password across the network. Answer C is incorrect because Windows integrated authentication is useful only within a Windows network; in this type of authentication, the username and password are not sent across the network.

A16:

The correct answer is D. The XmlElement attribute lets you alter the SOAP requests sent to the server without changing any of your code. Answers A and C are incorrect because these options will not alter the name of the parameter in the SOAP messages. Answer B is incorrect because it involves additional effort.

A17:

The correct answer is D. A Windows service application is a long running executable application that runs in its own Windows process and, therefore, enables you to monitor the network on an ongoing basis. Answers A, B, and C are incorrect because these types of applications need to be explicitly invoked to take an action.

A18:

The correct answer is C. The ServiceController.GetServices() method returns a list of the Windows services installed on the computer. Answers A, B, and D do not allow you to enumerate the list of Windows services installed on the computer.

A19:

The correct answer is B. You must always handle start requests from the Service Control Manager by implementing an OnStart() event handler. The other event handlers are required to be implemented only when you want to provide stop, pause, and continue features for your Windows service; therefore, answers A, C, and D are incorrect.

A20:

The correct answer is C. By providing a hard-coded GUID for the component, you prevent the registration process from generating a new GUID each time the component is registered with COM+. Answer A is incorrect because even if the serviced component is built in release mode, it would generate a new GUID for the component unless the Guid attribute is already specified. Answer B is incorrect because object pooling comes into the picture only after the serviced component is registered. Answer D is incorrect because specifying the ClassInterface attribute to ClassInterfaceType.None would register the component with the specified interface but would generate a new GUID if the Guid attribute is not specified.

A21:

The correct answer is A. After the pool of objects is exhausted, further requests are queued until an object is available or until the specified timeout period elapses. If an object cannot be made available within the time specified in the CreationTimeOut property, an exception is thrown. Answers B, C, and D are simply incorrect.

A22:

The correct answers are B and D. The SetComplete() method call sets both the consistent bit and the done bit to true so that the transaction can be committed. The EnableCommit() method call sets the consistent bit to true but leaves the done bit set to false, which also allows committing the transaction but does not deactivate the object. Answers A and C are incorrect because these methods set the consistent bit to false, which aborts the transaction.

A23:

The correct answer is D. The interface that a queued component uses for queuing must have void methods that have only pass-by-value parameters. Therefore, you need to change the return type of the Ship() method from bool to void. Answer A is incorrect because the AutoComplete attribute automatically notifies the COM+ context about its success or failure when the method completes. Answer B is incorrect because the ApplicationQueuing attribute is applied to the assembly to enable queuing support for the COM+ application. Answer C is incorrect because the current InterfaceQueuing attribute definition for the ShipPaints class is correct and required.

A24:

The correct answer is B. When using the Credentials property, an XML Web service client must instantiate a class implementing ICredentials, such as NetworkCredential, and then set the client credentials specific to the authentication mechanism, such as Basic. Answer A is incorrect because you must pass the authentication information (username and password) to the constructor of the NetworkCredential class. Answers C and D are incorrect because you cannot assign a value of type CredentialCache to a variable of type ICredentials.

A25:

The correct answer is A. ComponentWare should create a Primary Interop Assembly for the COM component by using the Type Library Importer tool (tlbimp.exe) so that the COM component can be called by .NET. Answer B is incorrect because the Type Library Exporter tool creates a Type Library Definition for the .NET component to be used by the COM component. Answer C is incorrect because a large number of applications use the COM component. Answer D is incorrect because platform invoke is used to call functions from unmanaged libraries rather than COM components.

A26:

The correct answer is A. Because only one application is using the COM component, the quickest way to create the RCW and have the COM component available in your Visual C# .NET project is to use the Add Reference dialog box to add a direct reference to the COM component. Answers B and C are incorrect because the COM component is not shared by multiple applications; therefore, you need not use the Type Library Importer tool to generate RCW for the COM component. Answer D is incorrect because the PInvoke feature is used to call functions from unmanaged libraries such as Win 32 API libraries rather than the COM component libraries.

A27:

The correct answer is B. In the calls via platform invoke, you should use StringBuilder rather than String to hold a string buffer that expects to be modified by the function. Therefore, answers A, C, and D are incorrect.

A28:

The correct answer is B. A simple type can be modified by facets, which enable you to specify data restrictions such as minimum, maximum, or exact length. Answers A and C are incorrect because when you define a field with an element or an attribute, there are no restrictions on that field beyond those imposed by the data type that you choose for the element or attribute. Answer D is incorrect because complex types are used for fields that contain several pieces of information, not a single type.

A29:

The correct answer is A. The ApplyDefaultSort property is used to automatically create a sort order, in ascending order, based on the primary key of the table. The ApplyDefaultSort property applies only when the table has a primary key defined and the Sort property is a null reference or an empty string. Answer B is incorrect because you want to sort using the primary key, and for that you should set the ApplyDefaultSort property to true. Answer C is incorrect because you need to sort the data instead of filtering the data. Answer D is incorrect because if the given code segment is incorrect, you must specify the name of a column in the Sort property along with ASC or DESC.

A30:

The correct answer is C. When you use the Close() method on a SqlConnection object, the connection is closed, all pending database transactions are rolled back, and the connection is returned back to the connection pool. Answer A is incorrect because reusing an instance after you have called the Dispose() method might result in undesirable effects. In general, you should use the Close() method rather than the Dispose() method if you might want to reuse the connection instance. Answer B is incorrect because you should generally call the destructor only when you need to release unmanaged resources. Answer D is incorrect because setting the SqlConnection object to null does not actually close the connection; the object will continue to exist in memory waiting for garbage collection.

A31:

The correct answer is C. A DataRelation object is used to relate two DataTable objects to each other. After you create a DataRelation object, you can call the GetChildRows() and GetParentRows() methods of the DataRow object to fetch child rows or parent rows, respectively. Answers A and B are incorrect because just defining primary keys or foreign keys on the table will not relate the tables. Answer D is incorrect because the DataSet.Merge() method is used to merge two DataSet objects, which is not a requirement in this case.

A32:

The correct answer is B. The XmlValidatingReader object allows you to validate an XML document. You use its ValidationEventHandler event to set an event handler for receiving information about the schema validation errors. Answer A is incorrect because the XmlDocument object cannot validate the XML document on its own. Answer C is incorrect because the EnforceConstraints property of the DataSet is used to specify whether the database constraint rules are followed when attempting any update operation. Answer D is incorrect because the DataSet.MergeFailed event occurs only when a target and source DataRow have the same primary key value, and EnforceConstraints is set to true.

A33:

The correct answer is C. You're interested in the total cost of visits, so you must use the Sum() operator on the VisitCost column. To filter after the sum is taken, you must use a HAVING clause. Answers A and B are incorrect because the WHERE clause is used to filter the data to include only individual rows where the cost is at least $100; the filter is not performed after the data is grouped. Answer D is incorrect because you need to display details for all patient visits for patients spending at least $100 on these visits, rather than displaying individual visits that cost more than $100.

A34:

The correct answer is D. OleDbDataReader allows you to read the data one row at a time in a forward-only fashion; therefore, it occupies less memory and improves performance of your application. The question requires you to read the data in a sequential fashion and write it to the flat file; the OleDbDataReader object is the best option. Answer A is incorrect because a DataSet object loads the entire retrieved data in the memory. Answer B is incorrect because you cannot retrieve the data directly in a DataTable object. Answer C is incorrect because the SqlDataReader object only works with SQL Server 7.0 and later versions.

A35:

The correct answer is D. Because other operations on the database, such as add and update, are working fine, chances are good that the DeleteCommand property is not set. The DeleteCommand property should be set to a command that deletes rows from the database. Answers A and C are incorrect because if that was the case, none of the changes would be saved. Answer B is simply incorrect because if the DeleteCommand property was set correctly, a call to the Update() method would also have executed DeleteCommand.

A36:

The correct answer is A. While creating a SqlParameter object, you specify SQL Server data types using the SqlDbType enumeration rather than specifying the .NET Framework data types. The @subscriberID parameter is defined as an output parameter in the stored procedure; therefore, the Direction property of the SqlParameter object should be set to Output. Answer B is incorrect because the Direction property is set to a ReturnValue that specifies that the parameter represents a return value from a stored procedure. Answers C and D are incorrect because you should specify SQL Server data types when creating a SqlParameter object.

A37:

The correct answers are A and D. In the current scenario, the XmlReadMode.Auto and XmlReadMode.InferSchema options will infer schema from the data. Answer B is incorrect because the data in Orders.xml file is not a DiffGram. Answer C is incorrect because when XmlReadMode is set to Fragment, the default namespace is read as the inline schema. Answer E is incorrect because the XML file does not include any schema.

A38:

The correct answer is C. The SqlCommand.Prepare() method creates a prepared version of the command on an instance of SQL Server. After the command has been prepared, further execution of that command is comparatively faster. Answer A is not correct because the SqlCommand.ExecuteReader() method is generally used to execute query statements such as a SELECT statement rather than nonquery statements such as an INSERT statement. Answer B is not correct because if SQL Server needs to prepare the command with each execution, performance will decrease instead of increasing. Answer D is not correct because the SqlCommand.ResetCommandTimeout() method just resets the CommandTimeout property to its default value and does not play any role in optimizing the performance in the given scenario.

A39:

The correct answer is A. Parameterized stored procedures are faster and more secure than ad hoc SQL statements. Answer B is incorrect because the DataSet object approach would result in all rows of the table being transferred to the client, which would perform very poorly. Answer C is incorrect because an ad hoc SQL statement runs slower when compared to a parameterized stored procedure. Answer D is incorrect because a view cannot contain parameters, so you would need to build a new view for every request.

A40:

The correct answer is A. If you do not specify the command type of a SqlCommand object, it defaults to CommandType.Text, which will not work with a stored procedure. Answer B is incorrect because although you could also make the code work by using an ad hoc SQL statement, it is an undesirable solution because the code will run more slowly and be less secure. Answer C is incorrect because the SqlDataReader object will also use the same command for executing the procedure. Therefore, you need to set the right CommandType of the SqlCommand object to CommandType.StoredProcedure for the code to work. Answer D is incorrect because when using the Fill() method, you are not required to open the connection explicitly.

A41:

The correct answer is C. Setting the RowStateFilter property of the DataView object to DataViewRowState.Deleted specifies that you want to view the deleted rows from the original data. Answers A and B are not correct because the RowFilter property is used to filter rows based on an expression rather than their state. Answer D is not correct because setting the RowStateFilter property to DataViewRowState.OriginalRows displays the original data of all the rows, including deleted rows.

A42:

The correct answer is C. The ReadXmlSchema() method maps nested elements in the XML file to related DataTable objects in the DataSet object. At the leaf level of the DOM tree, both elements and attributes are mapped to DataColumn objects. Therefore, answers A, B, and D are incorrect.

A43:

The correct answer is A. The DocumentElement property of an XmlDocument object returns an XmlNode object that represents the root node in the underlying XML document. Answers B and D are incorrect because the DocumentElement and DocumentType properties are members of the XmlDocument class rather than the XmlNode class. Answer C is incorrect because the DocumentType property returns an XML node containing the DOCTYPE declaration for the XML document rather than its root element.

A44:

The correct answer is C. Because Volts is an attribute rather than an element, you must refer to it as @Volts in an XPath expression. To select this attribute wherever it appears in the XML file, you should use // as the current context to cause the search to start at the root of the file. This makes answers A, B, and D incorrect.

A45:

The correct answer is C. The SqlXmlCommand object is supplied as part of the SQLXML download package. It is not installed with the base .NET Framework. Answer A is incorrect because you are using the correct path to refer to the Diffgram files. Answer B is incorrect because .NET Framework SP2 does not contain the SQLXML download package. Answer D is incorrect because the connection string already specifies a connection to the locally running SQL server on the production server.

A46:

The correct answer is B. For BooleanSwitch, a value of 0 corresponds to Off, and any nonzero value corresponds to On. For TraceSwitch, any number greater than 4 is treated as verbose. From the given values in the configuration file, the booleanSwitch object will have its Enabled property set to true, and the traceSwitch object will have its Level property set to TraceLevel.Verbose. Answers A, C, and D are incorrect because the booleanSwitch.Enabled property is set to false instead of true.

A47:

Answer C is correct. The <publisherPolicy> element allows you to override publisher policy for a single application. Answer A is incorrect because copying the assembly will have no effect on the binding, which is satisfied from the GAC. Answers B and D are incorrect because adding an administrator policy or deleting the publisher policy affects all applications on the computer, not just the one application.

A48:

The correct answer is D. If you get a DCOM configuration error while debugging, you might not be a member of the Debugger Users group on the remote machine. To resolve this, you add your account on the remote machine to the Debugger Users group. Answers A and B are incorrect because to debug a program remotely using Visual Studio .NET, you should be a member of the Debugger Users group rather than the Main Users group. Answer C is incorrect because you should be a member of the Debugger Users group on the remote computer rather than on the local computer.

A49:

The correct answer is B. The Assert() method checks for the given condition and generates an error when the condition evaluates to false. Answer A is incorrect because this code segment will generate an error only when the value of TotalShipments is not equal to 0. Answers C and D are incorrect because the Debug.Assert() method is invoked only when the program is complied using the debug configuration.

A50:

The correct answer is D. The TraceSwitch class provides a multilevel switch to control tracing output without recompiling your code. Answer A is incorrect because the /d:TRACE option enables the tracing but does not allow multilevel control over tracing output. Answer B is incorrect because modifying environmental variables requires many more administrative efforts when compared to a configuration file. Answer C is incorrect because this option requires the program to be recompiled each time the value of TRACE is modified.

A51:

The correct answer is C. Answers A, B, and D are incorrect because the TRACE symbol is defined in both the default debug and the default release configurations. Only the DEBUG symbol is defined in the default debug configuration.

A52:

The correct answer is D. To enable tracing for all the pages of the Web application, you should enable tracing in the application configuration file, web.config. To view the tracing information in the Web page, you should set the pageOutput attribute to true. To store tracing information for more requests, you should set the requestLimit attribute to a larger number. Finally, to be able to access the tracing information from the trace viewer in the tester's desktop, the localOnly attribute should be set to false. Answers A and B are incorrect because the tester wants to view tracing information for a larger number of requests. Answers C and F are incorrect because they disable tracing for the entire Web application. Answer E is incorrect because the localOnly attribute is set to True. The localOnly attribute indicates whether the tracing information should be available only in the hosting Web server or in all the clients (local as well as remote).

A53:

The correct answers are C and D. Because the Warehousing application is the only application that uses the component, the development team should copy the component to the Warehousing application. The development team can now create a Web Setup project to deploy the application and component. Answers A and B are incorrect because the merge module projects are used to create reuseable setup components.

A54:

The correct answers are A and E. If you want multiple applications to use an assembly, you need to sign the assembly with a strong name and place the assembly into the Global Assembly Cache. Answer B is incorrect because a COM application is not using the assembly. Answers C and D are incorrect because assemblies cannot be deployed into the Global Assembly Cache via XCOPY or FTP.

A55:

The correct answer is A. The SqlException.Class property gets a value from 1 to 25 that indicates the severity level of the error. Answer B is incorrect because the SqlException.Source property gets the name of the provider that generated the error. Answer C is incorrect because the SqlException.Server property gets the name of the computer running an instance of SQL Server that generated the error. Answer D is incorrect because the SqlException.State property gets a numeric error code from SQL Server that represents an error, a warning, or a "no data found" message.

A56:

The correct answer is D. To manage the load of your Web service application and increase the availability, you should select a Web farm configuration to deploy your application. Answer A is incorrect because the existing deployment is single-server and cannot balance the load of the application or manage a hardware failure in the Web server. Answer B is incorrect because, although Web garden deployment can balance the load of your application by running the application in a multiple-processor computer, it cannot provide a solution in case of server failure. Answer C is incorrect because cluster deployment can make the application more reliable, but it cannot help in making an application scalable.

A57:

The correct answer is A. When you want to check whether a particular user belongs to a particular role or whether the user has a particular privilege, you need to perform role-based security. Answer B is incorrect because the application requires access to the BalanceSheet object for specific users. Answer C is incorrect because encryption makes the data more difficult to read but does not restrict the code from performing certain operations. Answer D is incorrect because type safety allows code to access only primary memory locations that it is authorized to access. Type safety has no control over the application-specific operations.

A58:

The correct answer is D. You must tell the CLR how users are authenticated, even when you are using a Windows application that automatically employs Windows authentication. Answers A, B, and C are incorrect because they do not specify the authentication mode.

A59:

The correct answers are A and D. The object perm2 is a union of all the three PrincipalPermission objects (pp1, pp2, and pp3). The object perm1 is the union of two PrincipalPermission objects (pp1 and pp2). As a result, perm1 is a subset of perm2, not vice versa. Answer B is incorrect because perm1 is a subset of perm2. Answer C is incorrect because perm2 is not a subset of perm1.

A60:

The correct answer is A. This code segment checks whether role-based security is active in the current context; if not, it throws a security exception. Answer B is not correct because the ContextUtil.DisableCommit() method affects only the settings of the consistent and done bits in the COM+ context. Answers C and D are incorrect because the value of these attributes will be ignored if the security of the component has been disabled.

A61:

The correct answer is B. At each level, the permissions are the union of all permissions granted at that level. So, this gives you Registry, Environment, FileDialog, and FileIO permissions at the enterprise level; Registry, Environment, and FileIO permissions at the machine level; and FileIO permissions at the user level. The total permissions are the intersection of the level permissions. However, because the MachineB code group has the LevelFinal bit set, this assembly will not consider the user-level permissions. So, the final effective permissions are the intersection of the machine and enterprise permissions, thus making answers A, C, and D incorrect.

A62:

The correct answer is B. A serviced component, which is activated as a Library application, runs in the client application's process. Therefore, to debug the serviced component, you need to attach a debugger to the client application's process. Answer A is incorrect because you need to attach a debugger to the client application's process rather than the service component assembly. Answer C is incorrect because the client application's process is not a Web application running under ASP.NET. Answer D is incorrect because the serviced component is activated as a Library application rather than as a Server application.

A63:

The correct answer is D. A conditional breakpoint lets you pause your code only when a particular condition is true. In this case, you can use that capability to break into the code when the variable has the value of 197. Answers A, B, and C are incorrect because they do not work conditionally.

A64:

The correct answers are C and D. Digest authentication encrypts the password before it crosses the Internet, and Windows integrated authentication uses either Kerberos or challenge/response to keep passwords off the wire entirely. Answer A is incorrect because Anonymous authentication does not actually authenticate users at all. Answer B is incorrect because Basic authentication transmits passwords in plain text.

A65:

The correct answer is B. All you need to do is to add the Suppliers group to the existing Vendors role. Answers A, C, and D are incorrect because the existing Vendors role is sufficient for the given requirement. All you need to do is assign the new users to the Vendors role.


    Team-Fly    
    Top


    MCAD Developing XML Web Services and Server Components with Visual C#. NET and the. NET Framework Exam Cram 2 (Exam Cram 70-320)
    Managing Globally with Information Technology
    ISBN: 789728974
    EAN: 2147483647
    Year: 2002
    Pages: 179

    flylib.com © 2008-2017.
    If you may any questions please contact us: flylib@qtcs.net