.NET 3.5 Training

Loading...

Flash Player 9 (or above) is needed to view presentations.
We have detected that you do not have it on your computer. To install it, go here.

0 comments

Post a comment

    Post a comment
    Embed Video
    Edit your comment Cancel

    2 Favorites

    .NET 3.5 Training - Presentation Transcript

    1. Copyright © Intertech, Inc. 2006. All Rights Reserved.
    2. • Understand the scope of .NET 3.0 / .NET 3.5 • Introduce LINQ & Core Language Changes • Introduce Windows Presentation Foundation (WPF) • Introduce Windows Communication Foundation (WCF) • Introduce Windows Workflow Foundation (WF) Copyright © Intertech, Inc. 2006 • www.Intertech.com • 800-866-9884 • Slide 2
    3. • .NET 3.0 is an augmentative release of the .NET base class libraries: • Everything you currently know about .NET 1.0 / 1.1 / 2.0 still applies 100%. • .NET 3.0 did not change the C# or VB languages: • You can build .NET 3.0 projects using C#/VB 2005 or C#/VB 2008. • You can build .NET 3.0 projects using VS 2005 or VS 2008. • If you use VS 2005, you will need to download (free) .NET 3.0 project templates. • Consult www.microsoft.com/downloads. Copyright © Intertech, Inc. 2006 • www.Intertech.com • 800-866-9884 • Slide 3
    4. • Essentially, .NET 3.0 is nothing more than three new APIs: • Windows Presentation Foundation (WPF). • Windows Communication Foundation (WCF). • Windows Workflow Foundation (WF). • .NET 3.0 is not only for Vista development: • Windows XP and Windows Server 2003 can be used to develop and execute .NET 3.0 software with no problems. • However, .NET 3.0 software can perform ‘better’ on Vista given the new driver model (etc.). • .NET 3.0 is natively part of Vista. • XP / Windows Server requires installation of the .NET 3.0 SDK / .NET 3.0 runtime. Copyright © Intertech, Inc. 2006 • www.Intertech.com • 800-866-9884 • Slide 4
    5. • Unlike .NET 3.0, .NET 3.5 introduces dozens of new language updates. • C# and VB have both been enhanced with new features. • Many of these new features are here to support LINQ. • Language Integrated Query (LINQ) is perhaps the biggest feature of .NET 3.5. • LINQ is a new query language used to access a variety of data stores. Copyright © Intertech, Inc. 2006 • www.Intertech.com • 800-866-9884 • Slide 5
    6. • Beyond new language features / LINQ, .NET 3.5 provides: • A handful of new namespaces (ex: support for named pipes). • The WF API has new activities for WCF communications. • AJAX support has been integrated into the base class libraries. • VS 2008 has also received a few welcomed changes: • New streamlined ASP.NET web page designer. • WPF, WCF, WF, LINQ project integration. • Ability to pick between .NET 2.0, 3.0, 3.5 projects! Copyright © Intertech, Inc. 2006 • www.Intertech.com • 800-866-9884 • Slide 6
    7. • To begin our chat, we will survey some (but not all) of the .NET 3.5 language changes. • Implicit typing of local variables. • Use of extension methods. • The role of anonymous types. • Object initialization syntax. • Lambda expressions. Copyright © Intertech, Inc. 2006 • www.Intertech.com • 800-866-9884 • Slide 7
    8. • Implicitly typed local variables. • Compiler infers the underlying data type, based on initial assignment. • NOT a Variant! NOT script code! IS Strongly typed! • Greatly simplifies working with LINQ query expressions. // C# static void ImplicitLocalVars() { // Implicitly typed local variables. var myInt = 0; var myBool = true; var myString = \"Time, marches on...\"; } ' VB Sub ImplicitLocalVars() ' Implicitly typed local variables. ' Notice the lack of an As clause. Dim myInt = 0 Dim myBool = True Dim myString = \"Time, marches on...\" End Sub Copyright © Intertech, Inc. 2006 • www.Intertech.com • 800-866-9884 • Slide 8
    9. • Implicitly typed local variables can also be used in foreach loops. • Compiler will ensure correct underlying type. // C# static void ImplicitVarInForEach() { // Array of System.Int32 types. var evenNumbers = new int[] { 2, 4, 6, 8 }; // Here, item is a System.Int32. foreach (var item in evenNumbers) { Console.WriteLine(\"Item value: {0}\", item); } } ' VB Sub ImplicitVarInForEach() ' Array of System.Int32 types. Dim myIntArray = New Integer() { 2, 4, 6, 8 } ' Here, item is a System.Int32. For Each item In myIntArray Console.WriteLine(\"Item value: {0}\", item) Next End Sub Copyright © Intertech, Inc. 2006 • www.Intertech.com • 800-866-9884 • Slide 9
    10. • Extension methods allow you to add new functionality to a pre-compiled type. • Allows for easy augmentation of types for which you do not have source code. • Allows you to inject a polymorphic interface into existing code. • Extension methods do not serve the same purpose as inheritance. • Inheritance implies generating a brand new type based on existing types. • Extension methods update the ‘same’ type with new functionality. Copyright © Intertech, Inc. 2006 • www.Intertech.com • 800-866-9884 • Slide 10
    11. // C# using System.Reflection; static class MyExtensions { // This method allows any object to display the assembly // it is defined in. public static void DisplayDefiningAssembly(this object obj) { Console.WriteLine(\"{0} lives here: {1}\", obj.GetType().Name, Assembly.GetAssembly(obj.GetType())); } } ' VB Imports System.Runtime.CompilerServices Imports System.Reflection Public Module MyExtensions <Extension()> _ Sub DisplayDefiningAssembly(ByVal obj As Object) Console.WriteLine(\"{0} lives here: {1}\", obj.GetType().Name, _ Assembly.GetAssembly(obj.GetType())) End Sub End Module Copyright © Intertech, Inc. 2006 • www.Intertech.com • 800-866-9884 • Slide 11
    12. // C# (VB code would be similar) static void Main(string[] args) { Console.WriteLine(\"***** Fun with Extension Methods *****\\n\"); // The int has assumed a new identity! int myInt = 12345678; myInt.DisplayDefiningAssembly(); // So has the DataSet! System.Data.DataSet ds = new System.Data.DataSet(); ds.DisplayDefiningAssembly(); // And the SoundPlayer! System.Media.SoundPlayer sp = new System.Media.SoundPlayer(); sp.DisplayDefiningAssembly(); } Copyright © Intertech, Inc. 2006 • www.Intertech.com • 800-866-9884 • Slide 12
    13. • Object initialization syntax allows you to set property values (or public field values) at the time of creation. • Can also call custom constructors. • Assume a Rectangle class which defines two properties (TopLeft, BottomRight) that each get / set a Point type. • The Point type has two properties (X, Y). • Thus, Rectangle ‘has’ two Points. Copyright © Intertech, Inc. 2006 • www.Intertech.com • 800-866-9884 • Slide 13
    14. // C# Rectangle myRect = new Rectangle { TopLeft = new Point { X = 10, Y = 10 }, BottomRight = new Point { X = 200, Y = 200} }; ' VB Dim myRect As New Rectangle With { _ .TopLeft = New Point With {.X = 10, .Y = 10}, _ .BottomRight = New Point With {.X = 200, .Y = 200}} Copyright © Intertech, Inc. 2006 • www.Intertech.com • 800-866-9884 • Slide 14
    15. // C# // Init a List<T> of Rectangles. List<Rectangle> myListOfRects = new List<Rectangle> { new Rectangle {TopLeft = new Point { X = 10, Y = 10 }, BottomRight = new Point { X = 200, Y = 200}}, new Rectangle {TopLeft = new Point { X = 2, Y = 2 }, BottomRight = new Point { X = 100, Y = 100}}, new Rectangle {TopLeft = new Point { X = 5, Y = 5 }, BottomRight = new Point { X = 90, Y = 75}} }; ' VB does not support collection init syntax. Sub Main() ' Make container first. Dim myListOfRectangles As New List(Of Rectangle) ' Add items via Add() method. myListOfRectangles.Add(New Rectangle With { _ .TopLeft = New Point With {.X = 10, .Y = 10}, _ .BottomRight = New Point With {.X = 200, .Y = 200}}) End Sub Copyright © Intertech, Inc. 2006 • www.Intertech.com • 800-866-9884 • Slide 15
    16. • Anonymous types allow you to model the ‘shape’ of data without concern for it’s functionality. • Very helpful for LINQ queries. • Compiler generates a full blown class type in the background. • Anonymous types always: • Are constructed with the default constructor. • Extend System.Object (with value-based overrides). • Map name/value pairs into properties with backing fields. Copyright © Intertech, Inc. 2006 • www.Intertech.com • 800-866-9884 • Slide 16
    17. // C# static void CreateAndUseAnonymousType() { // Make an anonymous type representing a car. var myCar = new { Color = \"Black\", Make = \"Saab\", CurrentSpeed = 55 }; Console.WriteLine(\"My car is the color {0}.\", myCar.Color); } ' VB Sub CreateAndUseAnonymousType() ' Make an anonymous type representing a car. Dim myCar = New With {.Color = \"Black\", .Make = \"Saab\", .CurrentSpeed = 55} Console.WriteLine(\"My car is the color {0}.\", myCar.Color) End Sub Copyright © Intertech, Inc. 2006 • www.Intertech.com • 800-866-9884 • Slide 17
    18. // C# static void CreateAndUseAnonymousType() { // C# underlying properties are read only! var myCar = new { Color = \"Black\", Make = \"Saab\", CurrentSpeed = 55 }; myCar.Color = \"Pink\"; // ERROR in C#! Console.WriteLine(\"My car is the color {0}.\", myCar.Color); } ' VB Sub CreateAndUseAnonymousType() ' VB underlying properties are read/write! Dim myCar = New With {.Color = \"Black\", .Make = \"Saab\", .CurrentSpeed = 55} myCar.Color = \"Pink\" ' OK in VB! ' Color would now be \"Pink\" Console.WriteLine(\"My car is the color {0}.\", myCar.Color) End Sub Copyright © Intertech, Inc. 2006 • www.Intertech.com • 800-866-9884 • Slide 18
    19. • The final language feature to consider is that of lambda Expression syntax. • Simplifies how we work with .NET delegate types. • Demo! Copyright © Intertech, Inc. 2006 • www.Intertech.com • 800-866-9884 • Slide 19
    20. • LINQ (Language Integrated Query) allows .NET languages to create strongly typed query expressions. • Full support for object representation. • Compiler checked, IntelliSense support, debugging support, etc. • LINQ queries are created using any number of ‘query operators’ or related method calls in the object model. • Modeled after SQL queries. • The twist is that a LINQ query expression can be executed against: • Relational databases. • XML documents • Any object implementing IEnumerable<T>. Copyright © Intertech, Inc. 2006 • www.Intertech.com • 800-866-9884 • Slide 20
    21. • LINQ offers a unified solution to the problem of obtaining and manipulating ‘data’. • Under .NET 2.0, we were forced to learn unique APIs to gain access to various forms of data. • ADO.NET, XML namespaces, collection methods, etc. • Using LINQ, we can apply the same operators / statements to a wide variety of data stores. • Relational data, containers and XML docs. • Third parts can extend LINQ (via extension methods) to query over other data stores. Copyright © Intertech, Inc. 2006 • www.Intertech.com • 800-866-9884 • Slide 21
    22. • The LINQ API is represented by three major assemblies, each of which has a number of namespaces and types. • System.Core.dll: this is the core LINQ assembly which defines types needed for any LINQ aware-application. • System.Data.Linq.dll: defines LINQ to SQL data types. This is required when using LINQ to access relational database. • System.Xml.Linq.dll: defines LINQ to XML data types, required when using LINQ to manipulate XML documents. • In addition, other assemblies are used to define extension methods for other types. • System.Data.DataSetExtensions.dll (for example) adds LINQ-awareness to the DataSet type. Copyright © Intertech, Inc. 2006 • www.Intertech.com • 800-866-9884 • Slide 22
    23. // C# ' VB static void QueryOverArray() Sub QueryOverArray() { Dim currentVideoGames As String() = {\"Morrowind\", \"Dead Rising\", _ string[] currentVideoGames = {\"Morrowind\", \"Dead Rising\", \"Half Life 2: Episode 1\", \"F.E.A.R.\", _ \"Half Life 2: Episode 1\", \"F.E.A.R.\", \"Daxter\", \"System Shock 2\"} \"Daxter\", \"System Shock 2\"}; ' Build a query expression to find the items in the array // Build a query expression to find the strings in the array ' which have more than 6 letters. Dim subset = From g In currentVideoGames _ // which have more than 6 letters. Where g.Length > 6 Order By g Select g var subset = from g in currentVideoGames where g.Length > 6 orderby g select g; 'Print out the results (notice no ‘Daxter’) For Each s As String In subset // Print out the results (notice no ‘Daxter’) Console.WriteLine(\"Item: {0}\", s) foreach (string s in subset) Next Console.WriteLine(\"Item: {0}\", s); End Sub } Copyright © Intertech, Inc. 2006 • www.Intertech.com • 800-866-9884 • Slide 23
    24. • Consider the following additional example: static void Main(string[] args) { // Get metadata descriptions for all types in mscorlib. Assembly corlib = Assembly.Load(\"mscorlib\"); Type[] typeInfo = corlib.GetTypes(); // Only get the public enums. // VB: Dim enumTypes = From e in typeInfo Where _ // e.IsEnum = True And e.IsPublic Select e var enumTypes = from e in typeInfo where e.IsEnum == true && e.IsPublic select e; Console.WriteLine(\"***** Here are all the enums in mscorlib.dll *****\\n\"); foreach (var e in enumTypes) Console.WriteLine(\"Name: {0}\", e.ToString()); } Copyright © Intertech, Inc. 2006 • www.Intertech.com • 800-866-9884 • Slide 24
    25. • A LINQ query is not literally executed until you query over the results. • This differed execution allows you to change the contents of a container and obtain new results. // C# static void QueryOverArrayOfInts() { int[] numbers = { 10, 20, 30, 40, 1, 2, 3, 8 }; // Get numbers less than ten. var subset = from i in numbers where i < 10 select i; // LINQ statement evaluated here! foreach (var i in subset) Console.WriteLine(\"{0} < 10\", i); Console.WriteLine(); // Change some data in the array. numbers[0] = 4; // Evaluate again. foreach (var j in subset) Console.WriteLine(\"{0} < 10\", j); } Copyright © Intertech, Inc. 2006 • www.Intertech.com • 800-866-9884 • Slide 25
    26. • LINQ To ADO.NET • LINQ To XML Copyright © Intertech, Inc. 2006 • www.Intertech.com • 800-866-9884 • Slide 26
    27. • The Windows Forms API is a well know model for building desktop apps with the .NET platform. • However, building a complex WinForms application demands mastering several diverse and asymmetrical APIs. Application Requirement .NET 2.0 Solution Core Form / Control model Windows Forms 2D Graphics GDI+ (System.Drawing.dll) 3D Graphics DirectX APIs Live Video Feeds Windows Media Player APIs Fixed Style Documents Programmatic manipulation of PDF files. Copyright © Intertech, Inc. 2006 • www.Intertech.com • 800-866-9884 • Slide 27
    28. • One of the major goals with WPF is to provide a single, symmetrical model for desktop development. • With WPF, all necessary technologies are baked into the same assemblies (much easer!). Application Requirement .NET 3.0 Solution Core Form / Control model Windows Presentation Foundation 2D Graphics Windows Presentation Foundation 3D Graphics Windows Presentation Foundation Live Video Feeds Windows Presentation Foundation Fixed Style Documents (PDFs) Windows Presentation Foundation Copyright © Intertech, Inc. 2006 • www.Intertech.com • 800-866-9884 • Slide 28
    29. • Another major difference between WinForms and WPF is support for a separation of concerns via XAML. • XAML is essentially, desktop markup. • WPF apps allow you to separate the look and feel of your apps from the logic which drives it. • Use of XAML however, is entirely optional. • If you wish, you can take the 100% pure code approach. • You could take a 100% pure XAML approach. • Or (most commonly) take a code file approach (XAML / Code split). • When taking the code file approach, you will find the process of building a WPF app is eerily similar to building an ASP.NET web app. • Partial classes, markup + code, XAML to code mappings, etc. Copyright © Intertech, Inc. 2006 • www.Intertech.com • 800-866-9884 • Slide 29
    30. • The major motivation for XAML is the separation of concerns. • Programmers can use dev tools (VS 2008) to write .NET code. • Graphical minded individuals can using design tools (Expression Blend) to build a rich UI interface. • The XAML files can then be passed to us and integrated into our projects. • More information on MS Expression products: • Quick Blend Demo… • www.microsoft.com/products/expression Copyright © Intertech, Inc. 2006 • www.Intertech.com • 800-866-9884 • Slide 30
    31. • In addition to the benefits already mentioned, WPF offers a number of additional bells and whistles: • The ability to host a WPF application within a web browser (via XAML browser applications…XBAP). • Numerous layout managers to position controls. • A new (very slick) data binding engine. • Support for styles and templates, to ‘skin’ your WPF apps. • WPF relies entirely on vector graphics, allowing an image to be automatically resized to fit the size and resolution of the screen it's displayed on. • Integrated animation / 3D-rendering services. • Support for interop-ing with legacy UI models (Windows Forms, ActiveX, etc). Copyright © Intertech, Inc. 2006 • www.Intertech.com • 800-866-9884 • Slide 31
    32. • WPF Demo! Copyright © Intertech, Inc. 2006 • www.Intertech.com • 800-866-9884 • Slide 32
    33. • Windows Communication Foundation (WCF) integrates numerous distributed technologies. • Similar to WPF, WCF lives to provide symmetry. • Today building a distributed app is complex at best. • Too many diverse APIs (COM+, MSMQ, web services, remoting). • Each has a different object model, configuration tools, documentation, etc. • The current approach is complex, confusing and hard to maintain. Copyright © Intertech, Inc. 2006 • www.Intertech.com • 800-866-9884 • Slide 33
    34. • WCF provides a single, extendable object model. • Using *.config files, you can radically change the underlying plumbing via markup (channels, transports, etc). • SvcConfigEditor.exe can build client-side and server-side *.config files. Copyright © Intertech, Inc. 2006 • www.Intertech.com • 800-866-9884 • Slide 34
    35. • Support for strongly typed as well as untyped messages. • This approach allows .NET applications to share custom types simply and efficiently. • Software created using other platforms (such as Java) can consume streams of loosely typed XML. • Support for several endpoints to allow you to choose the most appropriate plumbing to transport data to and fro. • HTTP, HTTP + SOAP • MSMQ • Named Pipes • TCP • COM+ • Any custom endpoint you might dream up… Copyright © Intertech, Inc. 2006 • www.Intertech.com • 800-866-9884 • Slide 35
    36. • WCF applications are designed by specifying the A, B, Cs: • Address: Where does this service life? • Bindings: Which protocols are used to access it? • Contracts: Once I get there, what will I find? • The Service Configuration Tool can be used to specify the set of bindings and address of a given service. • The contract of a WCF service are defined in code. • In many ways, these A, B, Cs are a re-telling of WSDL descriptors. • In other ways, these A, B, Cs are a re-telling to the sort of data found within a .NET remoting configuration file. • The short answer is, if you have worked with XML web services or .NET remoting… • …you’ll feel right at home with WCF. Copyright © Intertech, Inc. 2006 • www.Intertech.com • 800-866-9884 • Slide 36
    37. • Building a WCF service is very simple: • Numerous attributes can be used to control service behaviors. • Functionality is (typically) exposed using strongly typed interfaces. • The collection of WCF types is typically bundled into a .NET *.dll. [ServiceContract] public interface ICarOrder { // Allows caller to place and order and obtain // an order ID. [OperationContract] int PlaceOrder(string make, string color, double price); // Allows caller to get current status of the order. [OperationContract] string CheckOrderStatus(int orderID); } Copyright © Intertech, Inc. 2006 • www.Intertech.com • 800-866-9884 • Slide 37
    38. • WCF Services can be hosted from a variety of locations. • Any *.exe assembly. • Within IIS • From WAS (Vista-specific activation service). • The ServiceHost type is used (directly or indirectly) to host the service itself. • Anything can be a consumer of WCF services: • *.exe, *.dll, web page, WCF service, etc. • .NET, COM, Java, C++, etc. • Linux, Mac, XP, Vista, etc. • Simply adjust the bindings to ensure the correct ‘reach’. • Client side proxies can be generated with svcutil.exe or VS 2008. Copyright © Intertech, Inc. 2006 • www.Intertech.com • 800-866-9884 • Slide 38
    39. • WCF Demo! Copyright © Intertech, Inc. 2006 • www.Intertech.com • 800-866-9884 • Slide 39
    40. • Windows Workflow Foundation (WF) is perhaps the 'strangest' element of .NET 3.0. • Earlier versions of .NET have no direct equivalent. • However, the idea of ‘workflow enabled applications’ is not new. • Using WF, you are able to model directly in your assembly the workflows used by your applications. • Workflows = business processes. • The WF runtime engine can then execute these tasks as your application is running. • The same model used to author code can be shared with other non- technical staff. • Thus, no need to maintain separate docs to illustrate to others what your code is doing. Copyright © Intertech, Inc. 2006 • www.Intertech.com • 800-866-9884 • Slide 40
    41. • WF enabled applications consist of any number of ‘activities’. • These activities are connected via decision / iteration paths. • Paths can run in parallel. • Primary located in System.Workflow.Activities. As of .NET 3.5, we are also provided with new types to interact with WCF services (SendActivity, ReceiveActivity). Copyright © Intertech, Inc. 2006 • www.Intertech.com • 800-866-9884 • Slide 41
    42. • Visual Studio has excellent support to model workflows and configure activities. • Much like building a UI application, you have a visual designer, Toolbox and Properties window. Copyright © Intertech, Inc. 2006 • www.Intertech.com • 800-866-9884 • Slide 42
    43. • Beyond activities, designers and the WF runtime, the WF API also provides a number of auxiliary services: WF Service Meaning in Life Persistence Services Allows you to save a WF instance to an external source (such as a database). This can be useful if a long running business process will be idle for some amount of time. Transaction Services WF instances can be monitored in a transactional context, to ensure that each aspect of your workflow completes (or fails) as a singular atomic unit. Tracking Services This feature is primary used for debugging and optimization of a WF activity; it allows you to monitor the activities of a given workflow. Scheduling Services This service allows you to control how the WF runtime engine manages threads for your workflows. Copyright © Intertech, Inc. 2006 • www.Intertech.com • 800-866-9884 • Slide 43
    44. • Workflows can be baked directly into a executable assembly. • However it is also possible pack WFs into a .NET *.dll. • In this way, you achieve binary reuse of workflows. • Regardless of how they are packaged, a WF is executed via the WorkflowRuntime type. • Pass in the type information of the WF you wish to execute. static void Main(string[] args) { // Create the WF runtime. using(WorkflowRuntime workflowRuntime = new WorkflowRuntime()) { // Create an instance of the WF to execute and call Start(). WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(SimpleWFApp.Workflow1)); instance.Start(); } // Other work… } Copyright © Intertech, Inc. 2006 • www.Intertech.com • 800-866-9884 • Slide 44
    45. • WF Demo! • Visual Studio 2008 WF designer tools. • Examine select activities. • Building a component driven WF application. Copyright © Intertech, Inc. 2006 • www.Intertech.com • 800-866-9884 • Slide 45
    46. • Intertech Training offers a full line up of .NET 3.x courses: • Delta .NET 3.0-3.5 • Complete LINQ • Complete WPF • Complete WCF • Complete WF • Each course assumes knowledge equivalent to: • Complete C# • Complete VB Copyright © Intertech, Inc. 2006 • www.Intertech.com • 800-866-9884 • Slide 46
    47. • .NET 3.0 is an augmentative release to the .NET BCL. • WPF: Integrated desktop / Smart Client API. • WCF: Integrated communications API. • WF: Allows for integration of ‘workflow enabled applications’. • C# 2008 / VB 2008. • C# / VB each support numerous language enhancements, used to support LINQ technologies. • LINQ provides a symmetrical manner in which to interact with ‘data’ in the broad sense of the term. Copyright © Intertech, Inc. 2006 • www.Intertech.com • 800-866-9884 • Slide 47

    + Intertech TrainingIntertech Training, 5 months ago

    custom

    338 views, 2 favs, 1 embeds more stats

    http://www.intertech.com/Courses/CourseCategory.asp more

    More info about this document

    © All Rights Reserved

    Go to text version

    • Total Views 338
      • 336 on SlideShare
      • 2 from embeds
    • Comments 0
    • Favorites 2
    • Downloads 0
    Most viewed embeds
    • 2 views on http://static.slidesharecdn.com

    more

    All embeds
    • 2 views on http://static.slidesharecdn.com

    less

    Flagged as inappropriate Flag as inappropriate
    Flag as inappropriate

    Select your reason for flagging this presentation as inappropriate. If needed, use the feedback form to let us know more details.

    Cancel
    File a copyright complaint
    Having problems? Go to our helpdesk?

    Categories