|  |  |  | @ -38,7 +38,7 @@ class X11(Object) from 'x11' | 
		
	
		
			
				|  |  |  |  | 		^w | 
		
	
		
			
				|  |  |  |  | 	} | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | 	method __close_window(window_handle) | 
		
	
		
			
				|  |  |  |  | 	method __destroy_window(window_handle) | 
		
	
		
			
				|  |  |  |  | 	{ | 
		
	
		
			
				|  |  |  |  | 		| w | | 
		
	
		
			
				|  |  |  |  | 		w := self _destroy_window(window_handle). | 
		
	
	
		
			
				
					
					|  |  |  | @ -86,6 +86,8 @@ pooldic X11.LLEventType | 
		
	
		
			
				|  |  |  |  | 	DESTROY_NOTIFY    := 17. | 
		
	
		
			
				|  |  |  |  | 	CONFIGURE_NOTIFY  := 22. | 
		
	
		
			
				|  |  |  |  | 	CLIENT_MESSAGE    := 33. | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | 	SHELL_CLOSE       := 65537. | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | class X11.LLEvent(Object) | 
		
	
	
		
			
				
					
					|  |  |  | @ -208,23 +210,25 @@ class X11.Widget(Object) | 
		
	
		
			
				|  |  |  |  | 		^self.parent windowHandle. | 
		
	
		
			
				|  |  |  |  | 	} | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | 	method paint: paint_event | 
		
	
		
			
				|  |  |  |  | 	{ | 
		
	
		
			
				|  |  |  |  | 	} | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | 	method realize | 
		
	
		
			
				|  |  |  |  | 	{ | 
		
	
		
			
				|  |  |  |  | 	## super realize chaining required??? | 
		
	
		
			
				|  |  |  |  | 	} | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | 	method realize { } | 
		
	
		
			
				|  |  |  |  | 	method dispose | 
		
	
		
			
				|  |  |  |  | 	{ | 
		
	
		
			
				|  |  |  |  | 	## what should be done first? remvoe from container? should dispose be called? | 
		
	
		
			
				|  |  |  |  | 	## super dispose chaining required? | 
		
	
		
			
				|  |  |  |  | 		##if (self.parent notNil) | 
		
	
		
			
				|  |  |  |  | 		##{ | 
		
	
		
			
				|  |  |  |  | 		##	self.parent remove: self. | 
		
	
		
			
				|  |  |  |  | 		##} | 
		
	
		
			
				|  |  |  |  | 'Widget dispose XXXXXXXXXXXXXX' dump. | 
		
	
		
			
				|  |  |  |  | 	} | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | 	method onPaintEvent: paint_event | 
		
	
		
			
				|  |  |  |  | 	{ | 
		
	
		
			
				|  |  |  |  | 	} | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | 	method onButtonEvent: event | 
		
	
		
			
				|  |  |  |  | 	{ | 
		
	
		
			
				|  |  |  |  | 	} | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | 	method onCloseEvent | 
		
	
		
			
				|  |  |  |  | 	{ | 
		
	
		
			
				|  |  |  |  | 	} | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
	
		
			
				
					
					|  |  |  | @ -235,10 +239,10 @@ class X11.Label(X11.Widget) | 
		
	
		
			
				|  |  |  |  | 	method text: text | 
		
	
		
			
				|  |  |  |  | 	{ | 
		
	
		
			
				|  |  |  |  | 		self.text := text. | 
		
	
		
			
				|  |  |  |  | 		if (self windowHandle notNil) { self paint: nil } | 
		
	
		
			
				|  |  |  |  | 		if (self windowHandle notNil) { self onPaintEvent: nil } | 
		
	
		
			
				|  |  |  |  | 	} | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | 	method paint: paint_event | 
		
	
		
			
				|  |  |  |  | 	method onPaintEvent: paint_event | 
		
	
		
			
				|  |  |  |  | 	{ | 
		
	
		
			
				|  |  |  |  | 		| gc | | 
		
	
		
			
				|  |  |  |  | System logNl: 'LABEL GC.......'. | 
		
	
	
		
			
				
					
					|  |  |  | @ -251,12 +255,13 @@ System logNl: 'LABEL GC.......'. | 
		
	
		
			
				|  |  |  |  | 	method realize | 
		
	
		
			
				|  |  |  |  | 	{ | 
		
	
		
			
				|  |  |  |  | 		## if i want to use a window to represent it, it must create window here. | 
		
	
		
			
				|  |  |  |  | 		## otherwise, do other works in paint:??? | 
		
	
		
			
				|  |  |  |  | 		## otherwise, do other works in onPaintEvent:??? | 
		
	
		
			
				|  |  |  |  | 	} | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | 	method dispose | 
		
	
		
			
				|  |  |  |  | 	{ | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | 'Label dispose XXXXXXXXXXXXXX' dump. | 
		
	
		
			
				|  |  |  |  | 		super dispose. | 
		
	
		
			
				|  |  |  |  | 	} | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
	
		
			
				
					
					|  |  |  | @ -283,13 +288,12 @@ class X11.Composite(X11.Widget) | 
		
	
		
			
				|  |  |  |  | 	method remove: widget | 
		
	
		
			
				|  |  |  |  | 	{ | 
		
	
		
			
				|  |  |  |  | 		| link | | 
		
	
		
			
				|  |  |  |  | 		if (widget parent =~ self) | 
		
	
		
			
				|  |  |  |  | 		if (widget parent ~~ self) | 
		
	
		
			
				|  |  |  |  | 		{ | 
		
	
		
			
				|  |  |  |  | 			selfns.Exception sinal: 'Cannot remove an unknown widget' | 
		
	
		
			
				|  |  |  |  | 		}. | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | 		## TODO: unmap and destroy... | 
		
	
		
			
				|  |  |  |  | 		link := self.children findLink: widget. | 
		
	
		
			
				|  |  |  |  | 		link := self.children findIdenticalLink: widget. | 
		
	
		
			
				|  |  |  |  | 		self.children removeLink: link. | 
		
	
		
			
				|  |  |  |  | 		widget parent: nil. | 
		
	
		
			
				|  |  |  |  | 	} | 
		
	
	
		
			
				
					
					|  |  |  | @ -301,7 +305,12 @@ class X11.Composite(X11.Widget) | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | 	method dispose | 
		
	
		
			
				|  |  |  |  | 	{ | 
		
	
		
			
				|  |  |  |  | 		self.children do: [:child | child dispose ] | 
		
	
		
			
				|  |  |  |  | 'Composite dispose XXXXXXXXXXXXXX' dump. | 
		
	
		
			
				|  |  |  |  | 		super dispose. | 
		
	
		
			
				|  |  |  |  | 		self.children do: [:child | | 
		
	
		
			
				|  |  |  |  | 			child dispose. | 
		
	
		
			
				|  |  |  |  | 			self remove: child. | 
		
	
		
			
				|  |  |  |  | 		] | 
		
	
		
			
				|  |  |  |  | 	} | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
	
		
			
				
					
					|  |  |  | @ -328,7 +337,13 @@ class X11.Shell(X11.Composite) | 
		
	
		
			
				|  |  |  |  | 	method realize | 
		
	
		
			
				|  |  |  |  | 	{ | 
		
	
		
			
				|  |  |  |  | 		| wind | | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | 		if (self.windowHandle notNil)  { ^self }. | 
		
	
		
			
				|  |  |  |  | 		if (self.displayServer isNil) | 
		
	
		
			
				|  |  |  |  | 		{ | 
		
	
		
			
				|  |  |  |  | 			## not added to a display server. | 
		
	
		
			
				|  |  |  |  | 			X11.Exception signal: 'Cannot realize a shell not added to a display server' | 
		
	
		
			
				|  |  |  |  | 		}. | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | 		wind := self.displayServer __create_window(nil, self.x, self.y, self.width, self.height, self.fgcolor, self.bgcolor, self). | 
		
	
		
			
				|  |  |  |  | 		if (wind isError) | 
		
	
	
		
			
				
					
					|  |  |  | @ -341,24 +356,37 @@ class X11.Shell(X11.Composite) | 
		
	
		
			
				|  |  |  |  | 		[ | 
		
	
		
			
				|  |  |  |  | 			self.children do: [:child | child realize ]. | 
		
	
		
			
				|  |  |  |  | 		] on: System.Exception do: [:ex | | 
		
	
		
			
				|  |  |  |  | 			self.displayServer _destroy_window(wind). | 
		
	
		
			
				|  |  |  |  | 			self.displayServer __destroy_window(wind). | 
		
	
		
			
				|  |  |  |  | 			self.windowHandle := nil. | 
		
	
		
			
				|  |  |  |  | 			ex pass | 
		
	
		
			
				|  |  |  |  | 		]. | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | ### call displayOn: from the exposure handler... | 
		
	
		
			
				|  |  |  |  | self paint: nil. | 
		
	
		
			
				|  |  |  |  | self onPaintEvent: nil. | 
		
	
		
			
				|  |  |  |  | 	} | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | 	method dispose | 
		
	
		
			
				|  |  |  |  | 	{ | 
		
	
		
			
				|  |  |  |  | 		super dispose. | 
		
	
		
			
				|  |  |  |  | 'Shell dispose XXXXXXXXXXXXXX' dump. | 
		
	
		
			
				|  |  |  |  | 		if (self.displayServer notNil) | 
		
	
		
			
				|  |  |  |  | 		{ | 
		
	
		
			
				|  |  |  |  | 			if (self.windowHandle notNil) | 
		
	
		
			
				|  |  |  |  | 			{ | 
		
	
		
			
				|  |  |  |  | 			self.displayServer _destroy_window (self.windowHandle). | 
		
	
		
			
				|  |  |  |  | 				super dispose. | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | 				self.displayServer __destroy_window (self.windowHandle). | 
		
	
		
			
				|  |  |  |  | 				self.windowHandle := nil. | 
		
	
		
			
				|  |  |  |  | 			}. | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | 			self.displayServer removeShell: self. | 
		
	
		
			
				|  |  |  |  | 		} | 
		
	
		
			
				|  |  |  |  | 	} | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | 	method onCloseEvent | 
		
	
		
			
				|  |  |  |  | 	{ | 
		
	
		
			
				|  |  |  |  | 'ON CLOSE EVENT .............' dump. | 
		
	
		
			
				|  |  |  |  | 		self dispose. | 
		
	
		
			
				|  |  |  |  | 	} | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | ## --------------------------------------------------------------------------- | 
		
	
	
		
			
				
					
					|  |  |  | @ -394,9 +422,6 @@ extend X11 | 
		
	
		
			
				|  |  |  |  | 			self _close_display. | 
		
	
		
			
				|  |  |  |  | 			##self.display_base := nil. | 
		
	
		
			
				|  |  |  |  | 		}. | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | 		## TODO: check if _fini_trailer is not called for some exception throwing... | 
		
	
		
			
				|  |  |  |  | 		##self _fini_trailer. | 
		
	
		
			
				|  |  |  |  | 	} | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | 	method initialize | 
		
	
	
		
			
				
					
					|  |  |  | @ -415,30 +440,31 @@ extend X11 | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | 		self.llevent_blocks := System.Dictionary new. | 
		
	
		
			
				|  |  |  |  | 		self.llevent_blocks | 
		
	
		
			
				|  |  |  |  | 			at: self.LLEventType.KEY_PRESS         put: #__handle_key_event:; | 
		
	
		
			
				|  |  |  |  | 			at: self.LLEventType.KEY_RELEASE       put: #__handle_key_event:; | 
		
	
		
			
				|  |  |  |  | 			at: self.LLEventType.BUTTON_PRESS      put: #__handle_button_event:; | 
		
	
		
			
				|  |  |  |  | 			at: self.LLEventType.BUTTON_RELEASE    put: #__handle_button_event:; | 
		
	
		
			
				|  |  |  |  | 			at: self.LLEventType.MOTION_NOTIFY     put: #__handle_notify:; | 
		
	
		
			
				|  |  |  |  | 			at: self.LLEventType.ENTER_NOTIFY      put: #__handle_notify:; | 
		
	
		
			
				|  |  |  |  | 			at: self.LLEventType.LEAVE_NOTIFY      put: #__handle_notify:; | 
		
	
		
			
				|  |  |  |  | 			at: self.LLEventType.EXPOSE            put: #__handle_expose:; | 
		
	
		
			
				|  |  |  |  | 			at: self.LLEventType.DESTROY_NOTIFY    put: #__handle_destroy_notify:; | 
		
	
		
			
				|  |  |  |  | 			at: self.LLEventType.CONFIGURE_NOTIFY  put: #__handle_configure_notify:; | 
		
	
		
			
				|  |  |  |  | 			at: self.LLEventType.CLIENT_MESSAGE    put: #__handle_client_message:. | 
		
	
		
			
				|  |  |  |  | 			at: self.LLEventType.KEY_PRESS         put: #__handle_key_event:on:; | 
		
	
		
			
				|  |  |  |  | 			at: self.LLEventType.KEY_RELEASE       put: #__handle_key_event:on:; | 
		
	
		
			
				|  |  |  |  | 			at: self.LLEventType.BUTTON_PRESS      put: #__handle_button_event:on:; | 
		
	
		
			
				|  |  |  |  | 			at: self.LLEventType.BUTTON_RELEASE    put: #__handle_button_event:on:; | 
		
	
		
			
				|  |  |  |  | 			at: self.LLEventType.MOTION_NOTIFY     put: #__handle_notify:on:; | 
		
	
		
			
				|  |  |  |  | 			at: self.LLEventType.ENTER_NOTIFY      put: #__handle_notify:on:; | 
		
	
		
			
				|  |  |  |  | 			at: self.LLEventType.LEAVE_NOTIFY      put: #__handle_notify:on:; | 
		
	
		
			
				|  |  |  |  | 			at: self.LLEventType.EXPOSE            put: #__handle_expose:on:; | 
		
	
		
			
				|  |  |  |  | 			at: self.LLEventType.DESTROY_NOTIFY    put: #__handle_destroy_notify:on:; | 
		
	
		
			
				|  |  |  |  | 			at: self.LLEventType.CONFIGURE_NOTIFY  put: #__handle_configure_notify:on:; | 
		
	
		
			
				|  |  |  |  | 			at: self.LLEventType.CLIENT_MESSAGE    put: #__handle_client_message:on:. | 
		
	
		
			
				|  |  |  |  | 		*) | 
		
	
		
			
				|  |  |  |  | 		self.llevent_blocks := %{ | 
		
	
		
			
				|  |  |  |  | 			self.LLEventType.KEY_PRESS         -> #__handle_key_event:, | 
		
	
		
			
				|  |  |  |  | 			self.LLEventType.KEY_RELEASE       -> #__handle_key_event:, | 
		
	
		
			
				|  |  |  |  | 			self.LLEventType.BUTTON_PRESS      -> #__handle_button_event:, | 
		
	
		
			
				|  |  |  |  | 			self.LLEventType.BUTTON_RELEASE    -> #__handle_button_event:, | 
		
	
		
			
				|  |  |  |  | 			self.LLEventType.MOTION_NOTIFY     -> #__handle_notify:, | 
		
	
		
			
				|  |  |  |  | 			self.LLEventType.ENTER_NOTIFY      -> #__handle_notify:, | 
		
	
		
			
				|  |  |  |  | 			self.LLEventType.LEAVE_NOTIFY      -> #__handle_notify:, | 
		
	
		
			
				|  |  |  |  | 			self.LLEventType.EXPOSE            -> #__handle_expose:, | 
		
	
		
			
				|  |  |  |  | 			self.LLEventType.DESTROY_NOTIFY    -> #__handle_destroy_notify:, | 
		
	
		
			
				|  |  |  |  | 			self.LLEventType.CONFIGURE_NOTIFY  -> #__handle_configure_notify:, | 
		
	
		
			
				|  |  |  |  | 			self.LLEventType.CLIENT_MESSAGE    -> #__handle_client_message: | 
		
	
		
			
				|  |  |  |  | 			self.LLEventType.KEY_PRESS         -> #__handle_key_event:on:, | 
		
	
		
			
				|  |  |  |  | 			self.LLEventType.KEY_RELEASE       -> #__handle_key_event:on:, | 
		
	
		
			
				|  |  |  |  | 			self.LLEventType.BUTTON_PRESS      -> #__handle_button_event:on:, | 
		
	
		
			
				|  |  |  |  | 			self.LLEventType.BUTTON_RELEASE    -> #__handle_button_event:on:, | 
		
	
		
			
				|  |  |  |  | 			self.LLEventType.MOTION_NOTIFY     -> #__handle_notify:on:, | 
		
	
		
			
				|  |  |  |  | 			self.LLEventType.ENTER_NOTIFY      -> #__handle_notify:on:, | 
		
	
		
			
				|  |  |  |  | 			self.LLEventType.LEAVE_NOTIFY      -> #__handle_notify:on:, | 
		
	
		
			
				|  |  |  |  | 			self.LLEventType.EXPOSE            -> #__handle_expose:on:, | 
		
	
		
			
				|  |  |  |  | 			self.LLEventType.DESTROY_NOTIFY    -> #__handle_destroy_notify:on:, | 
		
	
		
			
				|  |  |  |  | 			self.LLEventType.CONFIGURE_NOTIFY  -> #__handle_configure_notify:on:, | 
		
	
		
			
				|  |  |  |  | 			self.LLEventType.CLIENT_MESSAGE    -> #__handle_client_message:on:, | 
		
	
		
			
				|  |  |  |  | 			self.LLEventType.SHELL_CLOSE       -> #__handle_shell_close:on: | 
		
	
		
			
				|  |  |  |  | 		}. | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | 	} | 
		
	
	
		
			
				
					
					|  |  |  | @ -461,7 +487,6 @@ extend X11 | 
		
	
		
			
				|  |  |  |  | 		} | 
		
	
		
			
				|  |  |  |  | 	} | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | 	method enterEventLoop | 
		
	
		
			
				|  |  |  |  | 	{ | 
		
	
		
			
				|  |  |  |  | 		if (self.event_loop_sem isNil) | 
		
	
	
		
			
				
					
					|  |  |  | @ -537,36 +562,41 @@ extend X11 | 
		
	
		
			
				|  |  |  |  | 		}. | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | (llevent window asString) dump. | 
		
	
		
			
				|  |  |  |  | 		^self perform (mthname, llevent). | 
		
	
		
			
				|  |  |  |  | 		^self perform (mthname, llevent, widget). | 
		
	
		
			
				|  |  |  |  | 	} | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | 	method __handle_notify: type | 
		
	
		
			
				|  |  |  |  | 	{ | 
		
	
		
			
				|  |  |  |  | 		^9999999999 | 
		
	
		
			
				|  |  |  |  | 	} | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | 	method __handle_expose: event | 
		
	
		
			
				|  |  |  |  | 	method __handle_notify: llevent on: widget | 
		
	
		
			
				|  |  |  |  | 	{ | 
		
	
		
			
				|  |  |  |  | 	} | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | 	method __handle_button_event: event | 
		
	
		
			
				|  |  |  |  | 	method __handle_expose: llevent on: widget | 
		
	
		
			
				|  |  |  |  | 	{ | 
		
	
		
			
				|  |  |  |  | 	} | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | 	method __handle_destroy_notify: event | 
		
	
		
			
				|  |  |  |  | 	method __handle_button_event: event on: widget | 
		
	
		
			
				|  |  |  |  | 	{ | 
		
	
		
			
				|  |  |  |  | 	} | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | 	method __handle_configure_notify: event | 
		
	
		
			
				|  |  |  |  | 	method __handle_destroy_notify: event on: widget | 
		
	
		
			
				|  |  |  |  | 	{ | 
		
	
		
			
				|  |  |  |  | 	} | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | 	method __handle_client_message: event | 
		
	
		
			
				|  |  |  |  | 	method __handle_configure_notify: event on: widget | 
		
	
		
			
				|  |  |  |  | 	{ | 
		
	
		
			
				|  |  |  |  | 	} | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | 	method __handle_key_event: type | 
		
	
		
			
				|  |  |  |  | 	method __handle_client_message: event on: widget | 
		
	
		
			
				|  |  |  |  | 	{ | 
		
	
		
			
				|  |  |  |  | 		widget close: event. | 
		
	
		
			
				|  |  |  |  | 	} | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | 	method __handle_key_event: event on: widget | 
		
	
		
			
				|  |  |  |  | 	{ | 
		
	
		
			
				|  |  |  |  | 	} | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | 	method __handle_shell_close: llevent on: widget | 
		
	
		
			
				|  |  |  |  | 	{ | 
		
	
		
			
				|  |  |  |  | 		widget onCloseEvent. | 
		
	
		
			
				|  |  |  |  | 	} | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
	
		
			
				
					
					|  |  |  | 
 |