* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
Download Microsoft PPT 97
		                    
		                    
								Survey							
                            
		                
		                
                            
                            
								Document related concepts							
                        
                        
                    
						
						
							Transcript						
					
					CSE298 CSE300 Java Beans and Enterprise Java Beans Paul C. Barr The Mitre Corporation Eatontown NJ Kimble Cheron, Prof. Steven A. Demurjian, and Mitch Saba Computer Science & Engr. Dept. [email protected] [email protected] http://www.engr.uconn.edu/~steve (860) 486 - 4818 JR&B-1.1 CSE298 CSE300 Changing Perspectives     Computers are Guilty of Creating More Disorder then Simplicity Current Software Systems are Relics  Built Largely By and For Technical Computer Users  Never Intended to Operate in Today’s Environment Designer’s Need to Break Out of Old Mold  Consider Total Design Space  Design Should Help Manage Complexity, Not Add to It What is Available to Assist in Changing Times? JR&B-1.2 CSE298 CSE300 Components    Reusable Software Building Blocks Pre-Constructed from Encapsulated Application Code  Easily Combined with Other Components  Seamlessly Merged with Custom Code  Rapid Prototyping of Complete Applicaiton What is a Component?  GUI Widget (Button, Window, etc.)  Combination of Components (Window with Elevator Bars and Pull-Down Menus)  Application Service (Account Management Function) JR&B-1.3 CSE298 CSE300 Overview     A First Look at Java Beans  What are They?  How are They Utilized? Enterprise Java Beans  Not Just for Clients Anymore!  Capabilities and Usage  Relationship to “New” and “Old” Technologies  Component-Based Client/Server Model Multi-Tiered Architecture and EJB  Tiered Development for Extensibility  Comparisons of Approaches Java Blend for Database Interoperability JR&B-1.4 CSE298 CSE300 Java Beans   Extends "Write Once, Run Anywhere (WORA)TM" to Include "Reuse Everywhere” What is a Bean?  Independent Reusable Software Component  Visually Manipulated in Builder Tools  Can Be Visible Object:  AWT Components  or Invisible Objects:  Queues and Stacks  or Composed Objects:  Calculator Ops + Keys + Display JR&B-1.5 CSE298 CSE300 Java Beans    Bean vs. Component  Source Code Inaccessible  Customizable to Suit Application Needs via External Properties  Powerful Means of Reuse Examples  GUI Button with Property to Allow Button Name to be Set  Account Management Component that Allows Account Database Location to be Set Properties Can be Very Complex and Offer Significant Power to Application Builders JR&B-1.6 CSE298 CSE300 Java Beans Fundamentals   Supported within IDEs  Visual Age, JBuilder, PowerJ, Visual Café  Construct JavaBeans Component as Specialized Java Classes with Enhanced Capabilities Three-Part Architecture  Events  Notifies Others When Something Has Occurred  Delegation-Event Model of AWT  Properties  Define the Characteristics of the Bean  Methods  Utilized to Define a Property JR&B-1.7 CSE298 CSE300 Architecture: Events   Events  Notifies Others When Something Has Occurred  Delegation-Event Model of AWT Event Elements  Eventobjects  Components Sends to Listener  Eventlisteners  In Order to Register an Eventlistener With a Component, the Component Must Understand the Event Set Event Sources We’ll Discuss Shortly and Revisit in Detail with Java RMI   JR&B-1.8 CSE298 CSE300 Architecture: Properties   Example: AWT Textfield  User Will See Properties for the Caret Position, Current Text, and the Echo Character, etc. Methods Used to Define a Property public void setPropertyName(PropertyType value); public PropertyType getPropertyName();     The Name of the Property is Propertyname The Datatype is Propertytype Only One Method Present the Property is ReadOnly (Set Missing) Or the Property is Write-only (Get Missing) JR&B-1.9 CSE298 CSE300 Architecture: Methods  Methods  Public  Available for Anyone to Call  Beaninfo and Getmethoddescriptors Method  Restricts Which Methods Are Visible to the Beanbuilder/Integration Tool    The Getmethoddescriptors Method Reports All the Methods of a Bean Supports Introspection Beaninfoclass  Customize a Bean's Appearance to an Integration Tool JR&B-1.10 CSE298 CSE300 Abilitiy  Persistence  Ability of an Object to Store its State  Object Serialization Saves All Non-static and Non-transient Instance Variables of an Object  Objectinput and Objectoutput Interfaces  The Basis for Serialization Within Java.  Objectinputstream and Objectoutputstream Classes  Implement the Objectinput and Objectoutput Interfaces JR&B-1.11 CSE298 CSE300 Five Defining Features    Introspection  Allow a Builder Tool to Analyze How a Bean Works Customization  User is Allowed to Alter the Appearance and Behavior of a Bean Events  Firing of Events  Inform Builder Tools About Both the Events They Can Fire and Handle JR&B-1.12 CSE298 CSE300 Five Defining Features    Properties  Beans Can Be Manipulated Programmatically  Support the Customization as Mentioned Persistence  Customized Beans Can Have Their State Saved and Restored  Work in a Constructed Application Can Be Restored by an Application Builder's Save and Load Menu Commands Beans Are Used Primarily With Builder Tools  Programmatic Interfaces Allow Beans to Be Manually Manipulated by Text Tools JR&B-1.13 CSE298 CSE300 Differences Between Beans and Classes   Introspection  Process of Determining the Supported Properties, Methods, and Events of a Bean Introspector Class  Provides Access to the Beaninfo for the Bean Component Via Its getBeanInfo Method  Code TextField tf = new TextField (); BeanInfo bi = Introspector.getBeanInfo (tf.getClass());  Alternative to Introspector Class  Provides Access Directly Through the Use of the Reflection API JR&B-1.14 CSE298 CSE300 Introspection Tools      Differentiates Beans From Typical Java Classes Recognize Predefined Patterns in Class Definitions and Method Signatures  Able to "Look Inside" a Bean to Determine Its Properties and Behavior Require That Method Signatures Within Beans Must Follow a Certain Pattern Recognize How Beans Can Be Manipulated at Design and Run Time Pattern Signatures are Designed to Be Recognized by Human Readers and Builder Tools JR&B-1.15 CSE298 CSE300 Bean vs. Class    A Bean's State Can Be Manipulated at Design Time in Contrast to Classes at Run Time Beans Attributes and Behaviors  Published by Special Method Signature Patterns  Recognized by Beans-Aware Application Construction Tools What to Use for Software Modules?  Beans are Better for Software Components Visually Manipulated Within Builder Tools  Classes are Better for Functionality Through a Programmatic (Textual) Interface  An SQL API Would Be Better Packaged Through a Class Library JR&B-1.16 CSE298 CSE300 Event Model   Three Elements  Eventobject  Eventlistener  Eventsource (the Bean) Eventobject  Basis of All Beans Events  Java.Util.Eventobject Class  Require Programmer to Subclass an Eventobject to Have a Specific Event Type JR&B-1.17 CSE298 CSE300 Java 1.1 Delegation Event Model JR&B-1.18 CSE298 CSE300 Example: Event for Employee’s Hire Date public class HireEvent extends EventObject { private long hireDate; public HireEvent (Object source) { super (source); hireDate = System.currentTimeMillis(); } public HireEvent (Object source, long hired) { super (source); hireDate = hired; } public long getHireDate () { return hireDate; } } JR&B-1.19 CSE298 CSE300 EventListener  Definition  Entity That Desires Notification When an Event Happens  Receives the Specific Eventobject Subclass As a Parameter JR&B-1.20 CSE298 CSE300 EventListener  Eventlistener Interface  Empty Interface  Acts as a Tagging Interface That All Event Listeners Must Extend  Eventtypelistener Name of Listener Interface  The Name for the New Hireevent Listener Would Be Hirelistener  Method Names Should Describe the Event Happening  Code public interface HireListener extends java.util.EventListener { public abstract void hired (HireEvent e); } JR&B-1.21 CSE298 CSE300 EventSource  Eventsource  Defines When and Where an Event Will Happen  Hireevent and Hirelistener Are Required for an Event Source to Function  Sends Notification to Registered Classes When the Event Happens JR&B-1.22 CSE298 CSE300 EventSource: Methods  Registration Process Method Patterns public synchronized void addListenerType(ListenerType l); public synchronized void removeListenerType(ListenerType l);  Maintaining Eventsource Code private Vector hireListeners = new Vector(); public synchronized void addHireListener(HireListener l) { hireListeners.addElement (l); } public synchronized void removeHireListener (HireListener l) { hireListeners.removeElement (l); } JR&B-1.23 CSE298 CSE300 EventSource: Hiring Example protected void notifyHired () { Vector l; // Create Event HireEvent h = new HireEvent (this); // Copy listener vector so it won't change while firing synchronized (this) { l = (Vector)hireListeners.clone(); } for (int i=0;i<l.size();i++) { HireListener hl = (HireListener)l.elementAt (i); hl.hired(h); } } JR&B-1.24 CSE298 CSE300 What is Enterprise Java Beans ?    Expansion of Java Beans (Client-side) to Support Server Side Reusable Components  Server Components Run on Application Server  EJB Integral Part of Java Technology Component Architecture for Distributed Systems  Multi-Tier Distributed Architecture  Movement of Application Logic from Client to Server Side  Creation of “Thin”, Easier to Maintain Clients Framework for Creating Middle Ware  Integration of “New” and “Old” Technologies  RMI, IIOP, CORBA, RPC, Active X, etc. JR&B-1.25 Designer and Developer Roles in Enterprise Java Beans (EJB) CSE298 CSE300      Towards “Highly Scalable, Highly Available, Highly Reliable, Highly Secure, Transaction Distributed Applications” Enterprise Bean Provider  Creates and Sells EJBs Application Assembler  Uses EJBs to Build an Application EJB Server Provider  Creates and Sells EJB Server EJB Container Provider  Creates and Sells EJB Containers  Server Provider Will Likely Provide Containers JR&B-1.26 CSE298 CSE300 EJB Roles & Deployment JR&B-1.27 CSE298 CSE300 Utilizing EJB Technology JR&B-1.28 CSE298 CSE300 The EJB Architecture     EJB Servers: Analogous to CORBA ORB  Server Software  Provides Naming and Transaction Services  Makes Containers Visible EJB Containers: Interface Between EJB Bean and Outside World  Client Never Accesses Bean Directly  Access via Container-Generated Methods  These Methods Then Call the Bean’s Methods EJB Clients  Locate EJB Containers Via JNDI  Make Use of EJB Beans Enterprise Java Beans - Discussed Shortly JR&B-1.29 CSE298 CSE300 Recall CORBA JR&B-1.30 CSE298 CSE300 EJB Container JR&B-1.31 CSE298 CSE300 Enterprise Java APIs JR&B-1.32 Enterprise Java Beans Session Beans CSE298 CSE300       Associated With a Particular Client Performs Operations on Behalf of Client  Accessing a Database  Performing Calculations Created and Destroyed by a Client Can be Transactional - But, Do Not Survive System Shutdown Can be Stateless or Maintain Conventional State Across Methods and Transactions Must Manage Own Persistent Data JR&B-1.33 Enterprise Java Beans Entity Beans CSE298 CSE300       Object Representation of Persistent Data Maintained in Permanent Store (Database Identifiable by Primary Key Shared by Multiple Clients Persist Across Multiple Invocations Survive System Shutdown Created by  Inserting Data into Database  Creating an Object Instance JR&B-1.34 Model for Persistence Passivation/Activation CSE298 CSE300      Programmatic Model for Managing Persistent Objects EJB Server has the Right to Manage its Working Set Passivation  Saves State of a Bean to Persistent Storage  Then Swaps Bean Out Activation  Restores State of a Bean From Persistent  Storage,Then Swaps Bean in Applies to Both Session and Entity Beans JR&B-1.35 CSE298 CSE300 Stateless vs. Stateful Session Beans   Stateless  No Internal State  Do Not Need to Be "Pass-ivated"  Can Be Pooled to Service Multiple Clients Stateful  Possess Internal State  Need to Handle Passivation/Activation  One Per Client JR&B-1.36 CSE298 CSE300 Persistent Session Beans    Session Beans Can Be Saved and Restored Across Client Sessions To Save  Call the Session Bean’s getHandle() Method  Returns a Handle Object To Restore  Call the Handle Object’s getEJBObject() Method JR&B-1.37 CSE298 CSE300 Entity Bean Persistence   Container-Managed  Container is Responsible for Saving State  In Deployment Descriptor, Specify ContainerManaged Fields  Persistence Independent of Data Source Bean-Managed  Bean is Responsible for Saving its Own State  Container Doesn’t Need to Generate DB Calls  Less Adaptable; Persistence is Hard-Coded JR&B-1.38 CSE298 CSE300 Writing an EJB Client     Locate the Bean Container Allocate a Bean, If Needed Use the Bean Dispose of the Bean //An idealized EJB client import paul.ejb.restaurant.*; public class EJBClient{ public static void main(String[] argv){ //get JNDI naming context javax.naming.Context initialContext = new javax.naming.InitialContext(); //use context to look up EJB home interface RestaurantHome rh = initialContext.lookup(“RestaurantHome”); //use home interface to create a session object Restaurant r = rh.Create(“Burger Heaven”); //invoke business methods r.order(“cheeseburger”); //remove session object r.remove(); } } JR&B-1.39 CSE298 CSE300 Writing a Session Bean  Create Remote Interface      Create Home Interface  must extend javax.ejb.EJBHome interface  create() methods, remove() methods Implement Create Methods   must extend javax.ejb.EJBObject interface must give prototypes for business methods class needn’t say “implements”; this is handled by the container called by container at creation time Implement the SessionBean Interface     ejbActivate() - called when bean is activated ejbPassivate() - called when bean is passivated ejbRemove() - called when bean is destroyed setSessionContext(SessionContext ctx) - called by container to give bean a context JR&B-1.40 CSE298 CSE300 Session Bean Example package paul.ejb.restaurant.server; public class OrderBean implements SessionBean{ private transient SessionContext ctx; private String order; //can have many create methods public void ejbCreate () throws Exception { //initialization of class variables here } //business method public boolean order(String order) { this.order = order; System.out.println("order received for " + order); return true; } //these methods are required by the SessionBean interface public void ejbActivate() throws Exception { } public void ejbDestroy() throws Exception { } public void ejbPassivate() throws Exception { } public void setSessionContext(SessionContext ctx) throws Exception { this.ctx = ctx; } } JR&B-1.41 CSE298 CSE300 Writing an Entity Bean  Implement the EntityBean Interface  ejbActivate() // called on activation ejbPassivate() // called on passivation ejbLoad() // tells bean to load state from database ejbStore() // tells bean to store state in database ejbRemove() // called when client calls remove() setEntityContext() // called by container when instance has been created unsetEntityContext() // called by container before removing the instance  must also implement ejbFind() // allows client to look up EJB objects         Optionally Implement create() Methods Create Remote Interface   must extend javax.ejb.EJBObject interface Create Home Interface JR&B-1.42 CSE298 CSE300 Entity Bean Example package paul.ejb.entity.server; public class ExampleBean implements EntityBean { private transient EntityContext ctx; //notice: no finder method -- generated at deployment time by container provider //can have multiple create methods public void ejbCreate () throws Exception { } //business method public boolean doSomething () { } //required methods for EntityBean interface public void ejbActivate() throws Exception { } public void ejbDestroy() throws Exception { } public void ejbPassivate() throws Exception { } public void ejbLoad() throws Exception { } public void ejbStore() throws Exception { } public void setEntityContext (EntityContext ctx) throws Exception { this.ctx = ctx; } JR&B-1.43 CSE298 CSE300 Deploying EJBs       EJBs Deployed As .SER Files: Serialized Instance Manifest File Used to List EJBs Must Also Provide a “Deployment Descriptor” Sample Entry  Name: paul.RestaurantDeployment.ser  Enterprise-Bean: True “Name” Line  Describes a Serialized Deployment Descriptor “Enterprise-Bean” Line  Indicates Whether the Entry Should Be Treated as an EJB  (Not All Entries Need to Be EJBs) JR&B-1.44 CSE298 CSE300 Who’s Announced EJB Support?         WebLogic IBM Oracle GemStone BEA Borland Netscape Lotus         Forte Progress Novell Novera Borland Informix IONA More... JR&B-1.45 Typical Development and Deployment Scenario CSE298 CSE300    EJB Server Provider  Creates and Sells an EJB Server  Provides EJB Containers That Will Run on These Servers EJB Providers  Individuals Responsible for Developing the EJBs  Provide “Tools” and “Components” for DownStream Usage Application Assemblers  Individuals that Utilize Pre-Built EJBs to Construct Their Domain-Specific Applications  Utilize “State-of-Art-Tools” for EJB and JB JR&B-1.46 CSE298 CSE300 EJB Component-Based Architecture EJB Server EJB Client Invoke EJB Container Methods Enterprise Java Bean Invoke EJB Methods EJB Container JR&B-1.47 CSE298 CSE300 Client-Server Component Model JR&B-1.48 CSE298 CSE300 Client-Server Component Relationship JR&B-1.49 CSE298 CSE300 Client-Server Component Relationship (Concluded) JR&B-1.50 CSE298 CSE300 EJB Server Example JR&B-1.51 CSE298 CSE300 EJB Server Example (continued) JR&B-1.52 CSE298 CSE300 EJB Server Example (Concluded) JR&B-1.53 CSE298 CSE300 Three-Tier Architecture Concept JR&B-1.54 CSE298 CSE300 Two-Tier, Three-Tier, Four-Tier Example Architectures From: http://java.sun.com/javaone/javaone98/sessions/T400/index.html JR&B-1.55 CSE298 CSE300 Wombat Securities        Web Access to Brokerage Accounts Only HTML Browser Required on Front End "Brokerbean" EJB Provides Business Logic Login, Query, Trade Servlets Call Brokerbean Use JNDI to Find EJBs, RMI to Invoke Them Order and History Records from Java Blend Product Records Mapped to Oracle Tables, JDBC Calls JR&B-1.56 CSE298 CSE300 Four-Tier Architecture Example JR&B-1.57 CSE298 CSE300 Initialization Code class LoginServlet extends HttpServlet { private Broker createBroker(String account, String password) { /* Use JNDI to find Broker EJB home, then return new EJB */ Context initialContext = new InitialContext(); BrokerHome brokerHome = (BrokerHome) initialContext.lookup("wombat/Broker"); return brokerHome.create(account, password); } public doPost (HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { /* Get account and password from HTML and create EJB*/ String account = req.getParameter("Account"); String password = req.getParameter("Password"); Broker brk = createBroker(account, password); ...} ...} JR&B-1.58 CSE298 CSE300 User Interface Code class TradeServlet extends HttpServlet { ... public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException { /* Get parameters from HTML and session object */ HttpSession session = req.getSession(true); String ticker = req.getParameter("Symbol"); ... Broker brk = (Broker) session.getValue("LoginServlet.BrokerRef"); /* Place order and print confirmation as HTML */ String orderNum = brk.submitOrder(txType, ticker, shares); printOrderSubmitted(out, account, orderNum); ... } } JR&B-1.59 CSE298 CSE300 Business Logic Code class BrokerBean implements SessionBean { public void ejbCreate (String account, String password) ... public SecurityRecord getAcctPositions ( ) ... public OrderRecord getOrderStatus ( ) ... public String getQuote(String ticker) ... public String submitOrder(String txType, String ticker...) ... public HistoryRecord getAcctHistory ( ) ... private boolean login (...) ... ... etc ... } JR&B-1.60 CSE298 CSE300 Database Access Code  SQL: CREATE TABLE ORDER( ORDERNUM INTEGER NOT NULL, CUST INTEGER NOT NULL, TICKER VARCHAR(5), ... PRIMARY KEY (ORDERNUM), FOREIGN KEY (CUST) REFERENCES CUSTOMER);  Java: class Order{ int orderNum; Customer cust; String ticker; ...}  Java Blend Automatically Maps Classes to/from Relational Tables at Compile-Time and Run-Time JR&B-1.61 CSE298 CSE300 Nocturnal Aviation, Inc.        Passenger Check-in for Regional Airline Local Database for Seating on Today's Flights Clients Invoke EJBs at Local Site Through RMI EJBs Update Database and Queue Updates JMS Queues Updates to Legacy System DBC API Used to Access Local Database JTS Synchs Remote Queue With Local Updates JR&B-1.62 CSE298 CSE300 Three-Tier Example JR&B-1.63 CSE298 CSE300 Santa Cruz Widgets       Small Manufacturer Previously on C++ New Order Entry, Inventory, and Invoicing Applications in Java Programming Language Existing Customer and Order Database Most of Business Logic in Stored Procedures Tool-generated GUI Forms for Java Objects Located Company on Web Using Widgets and Tcl, but Not Widgets and Java JR&B-1.64 CSE298 CSE300 Santa Cruz Widgets (2-tier) JR&B-1.65 CSE298 CSE300 Architecture Comparisons      Two-tier Through JDBC API: Simplest Multi-tier: Separate Business Logic, Protect Database Integrity, More Scaleable JMS Queues Vs Synchronous (RMI or IDL):  Availability, Response Time, Decoupling JMS Publish & Subscribe: Off-line Notification RMI IIOP Vs JRMP Vs Java IDL:  Standard Cross-language Calls or Full Java Functionality JTS: Distributed Integrity, Lockstep Actions JR&B-1.66 CSE298 CSE300 Further API Comparisons      Servlets: Simplifies HTML, Connections, Web Front-Ending Legacy Systems EJBs: Simplifies Components, Scalability, Transactions, Multi-threading, Security, State JDBC Vs ODMG Vs SQLJ API:  Programming Simplicity, Portability, SQL Knowledge JNDI: Standardized Name Service Access Enterprise Java APIs vs. Proprietary:  Multi-Platform, Multiple Providers JR&B-1.67 CSE298 CSE300 Summary & Key Messages    Enterprise Java APIs: EJB, JNDI, Java IDL, RMI, JDBC, ODMG, SQLJ, JMS, JTS, JMAPI, Servlets Wide Variety of Architectural Alternatives:  Synchronous/Asynchronous, Multi-Tier, Transactional, HTTP/JRMP/IIOP Benefits:  WORA Portability  Multiple Vendors  Legacy Connectivity  Java Programming Language Productivity JR&B-1.68 CSE298 CSE300 EJB Roadmap API Specification Complete Products EJB JNDI JIDL RMI JDBC ODMG SQLJ JMS JTS JMAPI Sevlets JavaSoft JavaSoft OMG JavaSoft JavaSoft Consortium Consortium JavaSoft OMG JavaSoft JavaSoft 1.0Q1 1.0 done 1.0 Q2 1.0 done 2.0 Q2 2.0 done 1.0 Q2 1.0 Q2 1.0 done 1.0 Q2 1.1 done See Partners Download SP JDK 1.2 JDK 1.1 JDK 1.2 Partner JavaBlend See Partners See Partners Partners See Partners Java Web Server JR&B-1.69 CSE298 CSE300 What Is the Java Blend Product?    Product That Integrates Java Programming Language Objects With Enterprise Data Provides a Single Object Model Based on Java Programming Language Classes  Automatic Persistent Storage for Java Application Objects  Easy, Automatic Access to Existing Relational Databases From Java Applications Result of Joint Development by the Javasoft Division, Baan and Tech@spree JR&B-1.70 CSE298 CSE300 JavaBlend Applications   JavaBlend Software Provides Mapping Capability Between Database Tables and Java Application Classes Programmer Deals Only With Java Programming Language Objects, and Does Not Need to Know SQL or Database Representation JR&B-1.71 CSE298 CSE300 Java Blend Components   Flexible Development Tool for Automatic Bi-Directional Mapping  Objects to Relational  Relational to Objects Powerful Runtime Environment  Transaction Management System  Query Processor  Cache Management System JR&B-1.72 CSE298 CSE300 Java Blend Runtime Architecture JR&B-1.73 Java Blend Software and Enterprise JavaBeans Technology CSE298 CSE300   EJB Technology Provides Scaleable Component Architecture for Business Applications Java Blend Product Provides Transparent Persistence for Enterprise Javabeans Technology  Beans Implementing Business Logic Use Java Blend for Database Access  Java Blend Product Works With the Enterprise Javabeans API Transaction Mechanisms JR&B-1.74
 
									 
									 
									 
									 
									 
									 
									 
									 
									 
									 
									 
									 
									 
									 
									 
									 
									 
									 
									 
									 
									 
									 
									 
									 
									 
									 
									 
									 
									 
									 
									 
									 
									 
									 
									 
									 
									 
									 
									 
									 
									 
									 
									 
									 
									 
									 
									 
									 
									 
									 
									 
									 
									 
									 
									 
									 
									 
									 
									 
									 
									 
									 
									 
									 
									 
									 
									 
									 
									 
									 
									 
									 
									 
									 
                                             
                                             
                                             
                                             
                                             
                                             
                                             
                                             
                                             
                                            