Skip to main content



      Home
Home » Eclipse Projects » GEF » [Help needed] GEF-Editor doesn't update ...
[Help needed] GEF-Editor doesn't update ... [message #248115] Tue, 07 April 2009 07:05 Go to next message
Eclipse UserFriend
Originally posted by: juergen.scheffler.gmx.de

Hi there,

I wrote a RCP with a GEF-Editor and Property-View.
The Prop-View shows the name, the coorinates and size of the drawn
figures as key-value pairs.
When I move a figure the Prop-View updates itself.
When I edit the name field in the Prop-View the GEF-Editor does not
update. I have to click on the editor to refresh the actual editor "view".

I use a Model generated by EMF, so I can't code in directly in the
Model. I thought I have to code sth like listeners there. I'm clueless
now. Do you have some hints? Shall I post classes here?

As I began with GEF I read that I have to edit the Model (objects) and
GEF recognizes that and updates the rest by itself...hmm as
described..it does not.

Greetings

Juergen
Re: [Help needed] GEF-Editor doesn't update ... [message #248129 is a reply to message #248115] Tue, 07 April 2009 16:54 Go to previous messageGo to next message
Eclipse UserFriend
(responses below)

juergen.scheffler@gmx.de wrote:
> Hi there,
>
> I wrote a RCP with a GEF-Editor and Property-View.
> The Prop-View shows the name, the coorinates and size of the drawn
> figures as key-value pairs.
> When I move a figure the Prop-View updates itself.
> When I edit the name field in the Prop-View the GEF-Editor does not
> update. I have to click on the editor to refresh the actual editor "view".

Can you elaborate on what you mean, click to refresh?

>
> I use a Model generated by EMF, so I can't code in directly in the
> Model. I thought I have to code sth like listeners there. I'm clueless
> now. Do you have some hints? Shall I post classes here?

The generated EMF objects should have notification built in. I suspect
that is working fine since your properties view is refreshing when you
move the figures (which are updating the model).

Try setting some breakpoints in your model classes to see if they are
receiving the changes as you commit them in the property view.

Also, on an unrelated note, you *can* edit the generated code. Suggest
having a look at the EMF documentation.

>
> As I began with GEF I read that I have to edit the Model (objects) and
> GEF recognizes that and updates the rest by itself...hmm as
> described..it does not.
>
> Greetings
>
> Juergen
Re: [Help needed] GEF-Editor doesn't update ... [message #248162 is a reply to message #248129] Wed, 08 April 2009 12:33 Go to previous messageGo to next message
Eclipse UserFriend
Originally posted by: juergen.scheffler.gmx.de

Ben Vitale schrieb:
> (responses below)
>
> juergen.scheffler@gmx.de wrote:
>> Hi there,
>>
>> I wrote a RCP with a GEF-Editor and Property-View.
>> The Prop-View shows the name, the coorinates and size of the drawn
>> figures as key-value pairs.
>> When I move a figure the Prop-View updates itself.
>> When I edit the name field in the Prop-View the GEF-Editor does not
>> update. I have to click on the editor to refresh the actual editor
>> "view".
>
> Can you elaborate on what you mean, click to refresh?

In simple words: I edit a string field in the prop-view and make a click
in the gef-editor --> the string text gets refreshed in a label in a
figure. But only if I click on the editor or add sth to the editor. When
I edit the string in prop-view and push enter, the propview has the new
string but the editor the old string.

Again: If a paint or paintFigure method is called, every is fine, but
this doesnt get invoked. In other words: a) I think the editor is not
connected properly to the Model, so the editor doesnt get notified. b)
or I have to call a refreshVisual(), but I dont really know.

I made a short video (wmv or avi):
http://rapidshare.com/files/218943119/gefmodelrefresh.wmv.ht ml
http://rapidshare.com/files/218942488/gefmodelrefresh.avi.ht ml

Can you explain, how I make the editor listen to model changes?
I put the editor code below this text, maybe it helps. Maybe it has sth
to do with the getAdapter method, but I dont know.

>
>>
>> I use a Model generated by EMF, so I can't code in directly in the
>> Model. I thought I have to code sth like listeners there. I'm clueless
>> now. Do you have some hints? Shall I post classes here?
>
> The generated EMF objects should have notification built in. I suspect
> that is working fine since your properties view is refreshing when you
> move the figures (which are updating the model).

I really wonder now, why this works. Maybe because its a standard
Property View. I just implement the standard class.
public class MyPropSource implements IPropertySource {...}
Do you have an example on: how to connect a selfmade RCP View to the
gef/emf model?

>
> Try setting some breakpoints in your model classes to see if they are
> receiving the changes as you commit them in the property view.

How do I do that? f.e. I open the Node.class and set a breakpoint there
and then run debug mode, correct?! for what do I have to look?

>
> Also, on an unrelated note, you *can* edit the generated code. Suggest
> having a look at the EMF documentation.

thx, I see.




CODE:
package de.scheffler.cpeditor.editors.processeditor;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.EventObject;
import java.util.List;
import java.util.Map;
import java.util.Vector;

import org.apache.log4j.Logger;
import org.eclipse.gef.ContextMenuProvider;
import org.eclipse.gef.DefaultEditDomain;
import org.eclipse.gef.EditDomain;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.EditPartViewer;
import org.eclipse.gef.GraphicalEditPart;
import org.eclipse.gef.GraphicalViewer;
import org.eclipse.gef.KeyHandler;
import org.eclipse.gef.LayerConstants;
import org.eclipse.gef.SnapToGrid;
import org.eclipse.gef.commands.CommandStack;
import org.eclipse.gef.commands.CommandStackListener;
import org.eclipse.gef.dnd.TemplateTransferDragSourceListener;
import org.eclipse.gef.dnd.TemplateTransferDropTargetListener;
import org.eclipse.gef.editparts.AbstractGraphicalEditPart;
import org.eclipse.gef.editparts.LayerManager;
import org.eclipse.gef.editparts.ScalableFreeformRootEditPart;
import org.eclipse.gef.palette.PaletteRoot;
import org.eclipse.gef.requests.CreationFactory;
import org.eclipse.gef.requests.SimpleFactory;
import org.eclipse.gef.ui.actions.ActionRegistry;
import org.eclipse.gef.ui.palette.PaletteViewer;
import org.eclipse.gef.ui.palette.PaletteViewerProvider;
import org.eclipse.gef.ui.palette.FlyoutPaletteComposite.FlyoutPref erences;
import org.eclipse.gef.ui.parts.GraphicalEditorWithFlyoutPalette;
import org.eclipse.gef.ui.parts.GraphicalViewerKeyHandler;
import org.eclipse.gef.ui.parts.ScrollingGraphicalViewer;
import org.eclipse.gef.ui.parts.SelectionSynchronizer;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IContributionItem;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.util.TransferDropTargetListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorSite;
import org.eclipse.ui.ISelectionListener;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.PartInitException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.draw2d.*;

import org.eclipse.swt.graphics.*;
import org.eclipse.draw2d.ColorConstants;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.emf.common.notify.Adapter;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.Notifier;
import org.eclipse.emf.ecore.EPackage;


import de.scheffler.cpeditor.helper.EcoreFactory;
import de.scheffler.cpeditor.helper.Globals;
import de.scheffler.cpeditor.model.Diagram;
import de.scheffler.cpeditor.model.ModelFactory;
import de.scheffler.cpeditor.model.ModelPackage;
import de.scheffler.cpeditor.model.Node;
import de.scheffler.cpeditor.model.impl.DiagramImpl;
import de.scheffler.cpeditor.model.impl.NodeImpl;
import de.scheffler.cpeditor.parts.CPeditorEditPartFactory;
import de.scheffler.cpeditor.parts.DiagramEditPart;
import de.scheffler.cpeditor.parts.MyScalableFreeformRootEditPart;

import de.scheffler.cpeditor.*;

public class ProcessEditorWithFlyoutPalette
extends GraphicalEditorWithFlyoutPalette
implements CommandStackListener, ISelectionListener, Adapter {

final static Logger logger =
Logger.getLogger(ProcessEditorWithFlyoutPalette.class);

public static final String ID =
"de.scheffler.cpeditor.editors.processeditorwithpalette";

private Diagram processdiagram;//
ModelFactory.eINSTANCE.createDiagram();//new DiagramImpl();

private GraphicalViewer graphicalViewer;
//private PaletteViewer pviewer;

private DefaultEditDomain editDomain;
private CPeditorEditPartFactory epf;

private ProcessEditorWithFlyoutPalette npeThis;

Action exportBMPAction;
public static final String EXPORT_BMP = "BMP";

Action hideConLayerAction;
public static final String HIDE_CONLAYER = "HIDE_CONLAYER";

Action toggleGridAction;
public static final String TOGGLE_GRID = "TOGGLE_GRID";


private List editPartActionIDs = new ArrayList();



public ProcessEditorWithFlyoutPalette() {


try {

editDomain = new DefaultEditDomain(this);
setEditDomain(editDomain);
npeThis = this;


logger.info(Globals.isVisible_ConLayer()+"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ");




} catch (Exception e) {
e.printStackTrace();
}
}

/* (non-Javadoc)
* @see
org.eclipse.gef.ui.parts.GraphicalEditor#init(org.eclipse.ui .IEditorSite,
org.eclipse.ui.IEditorInput)
*/
@Override
public void init(IEditorSite site, IEditorInput input) throws
PartInitException {
//super.init(site, input);

//this.editDomain = new DefaultEditDomain(this);

logger.info("HERE I AM");

setSite(site);

setInput(input);

getCommandStack().addCommandStackListener(this);


getSite().getWorkbenchWindow().getSelectionService().addSele ctionListener(this);


/**
// Drag and Drop Kram, dazu muss die Klasse Adapter impementiert werden
((ProcessEditorInput) input).getProcessDiagram().eAdapters().add(this);
*/


setPartName(input.getName());

createActions();
createToolbar();


}

protected void createActions() {

try {

super.createActions();





if (exportBMPAction == null) {
exportBMPAction = new Action() {

public String getId() {
return EXPORT_BMP;
}

public void run() {
// reset all
ProcessEditorWithFlyoutPalette ce =
((ProcessEditorWithFlyoutPalette) getSite()
.getPage().getActiveEditor());
ScalableFreeformRootEditPart root = (ScalableFreeformRootEditPart) ce
.getGraphicalViewer().getRootEditPart();
Device device = ce.getGraphicalViewer().getControl()
.getDisplay();

// wenn das Gitter vorm bmp export sichtbar war, soll es auch
dannach wieder sichtbar sein und umgekehrt.
// Für den bmp export wird es kurz augeblendet
boolean visible_before_save = root.getLayer("GRID").isVisible();

// Den FreeFormLayer und(!) den Connection-Layer holen
IFigure figure =
root.getLayer(ScalableFreeformRootEditPart.PRINTABLE_LAYERS) ;
root.getLayer("GRID").setVisible(false);

//LAYER TEST
//LayerManager layermanager = (LayerManager)
graphicalViewer.getEditPartRegistry().get(LayerManager.ID);

//System.out.println(layermanager.getLayer(LayerConstants.CO NNECTION_LAYER).getBackgroundColor().toString());;

//root.getLayer(LayerConstants.CONNECTION_LAYER).setBackgrou ndColor(ColorConstants.red);

//System.out.println(root.getLayer(LayerConstants.CONNECTION _LAYER).getForegroundColor().toString());
//boolean visible =
root.getLayer(LayerConstants.CONNECTION_LAYER).isVisible();
//if(visible){
//root.getLayer(LayerConstants.CONNECTION_LAYER).setVisible( false);

//}else{root.getLayer(LayerConstants.CONNECTION_LAYER).setVi sible(true);}


Rectangle r = figure.getBounds();
ByteArrayOutputStream result = new ByteArrayOutputStream();
Image image = null;
GC gc = null;
Graphics g = null;
try {
image = new Image(device, r.width, r.height);
gc = new GC(image);
g = new SWTGraphics(gc);
g.translate(r.x * -1, r.y * -1);

figure.paint(g);

ImageLoader imageLoader = new ImageLoader();
imageLoader.data = new ImageData[] { image
.getImageData() };
imageLoader.save(result, SWT.IMAGE_BMP);
} finally {
if (g != null) {
g.dispose();
}
if (gc != null) {
gc.dispose();
}
if (image != null) {
image.dispose();
}
}

try {





FileDialog dialog = new FileDialog(npeThis.getSite()
.getShell(), SWT.SAVE);
dialog
.setFilterNames(new String[] { "Bitmaps (*.bmp)" });
dialog.setFilterExtensions(new String[] { "*.bmp" });
String path = dialog.open();
if (!path.endsWith(".bmp")) {
path.concat(".bmp");
}
File f = new File(path);
if (f.exists()) {
MessageDialog md = new MessageDialog(npeThis
.getSite().getShell(), "Datei ersetzen?",
null, "Wollen Sie die Datei \""
+ f.getName()
+ "\" wirklich ersetzen?",
MessageDialog.QUESTION, new String[] {
"Ja", "Nein" }, 1);
int answer = md.open();
if (answer == MessageDialog.OK) {
FileOutputStream fos = new FileOutputStream(f);
fos.write(result.toByteArray());
fos.flush();
fos.close();
}
} else {
FileOutputStream fos = new FileOutputStream(f);
fos.write(result.toByteArray());
fos.flush();
fos.close();
}
if(visible_before_save)
root.getLayer("GRID").setVisible(true);
} catch (FileNotFoundException e) {
e.printStackTrace();
if(visible_before_save)
root.getLayer("GRID").setVisible(true);
} catch (IOException e) {
e.printStackTrace();
if(visible_before_save)
root.getLayer("GRID").setVisible(true);
}finally {
if(visible_before_save)
root.getLayer("GRID").setVisible(true);
}
}
};
exportBMPAction.setToolTipText("als Bitmap exportieren");
Image iBMP = new Image(Display.getDefault(), this
.getClass().getResourceAsStream("picture_save.png"));
ImageDescriptor idBMP = ImageDescriptor.createFromImage(iBMP);
exportBMPAction.setImageDescriptor(idBMP);
exportBMPAction.setEnabled(true);
}


if (hideConLayerAction == null) {

//LayerManager layermanager = (LayerManager)
graphicalViewer.getEditPartRegistry().get(LayerManager.ID);

//System.out.println(layermanager.getLayer(LayerConstants.CO NNECTION_LAYER).getBackgroundColor().toString());;

//layermanager.getLayer(LayerConstants.CONNECTION_LAYER).set BackgroundColor(ColorConstants.green);

hideConLayerAction = new Action() {



public String getId() {
return HIDE_CONLAYER;
}
public void run() {


ProcessEditorWithFlyoutPalette ce =
((ProcessEditorWithFlyoutPalette) getSite()
.getPage().getActiveEditor());
ScalableFreeformRootEditPart root = (ScalableFreeformRootEditPart) ce
.getGraphicalViewer().getRootEditPart();

boolean visible =
root.getLayer(LayerConstants.CONNECTION_LAYER).isVisible();

if(visible) {
root.getLayer(LayerConstants.CONNECTION_LAYER).setVisible(fa lse);
Globals.setVisible_ConLayer(false);
//hideConLayerAction.setChecked(false);
//hideConLayerAction.setToolTipText("Verbindungen einblenden");

}

else {
root.getLayer(LayerConstants.CONNECTION_LAYER).setVisible(tr ue);
Globals.setVisible_ConLayer(true);
//hideConLayerAction.setChecked(true);
//hideConLayerAction.setToolTipText("Verbindungen ausblenden");

}

}

};

hideConLayerAction.setToolTipText("Verbindungen zeigen/verstecken");
Image iBMP = new Image(Display.getDefault(), this
.getClass().getResourceAsStream("arrow.gif"));
ImageDescriptor idBMP = ImageDescriptor.createFromImage(iBMP);
hideConLayerAction.setImageDescriptor(idBMP);
hideConLayerAction.setEnabled(true);



//if(Globals.isVisible_ConLayer()){hideConLayerAction.setChe cked(true);}else
hideConLayerAction.setChecked(false);
//hideConLayerAction.setToolTipText("Verbindungen ausblenden");

}

// FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
if (toggleGridAction == null) {

//LayerManager layermanager = (LayerManager)
graphicalViewer.getEditPartRegistry().get(LayerManager.ID);

//System.out.println(layermanager.getLayer(LayerConstants.CO NNECTION_LAYER).getBackgroundColor().toString());;

//layermanager.getLayer(LayerConstants.CONNECTION_LAYER).set BackgroundColor(ColorConstants.green);

toggleGridAction = new Action() {



public String getId() {
return TOGGLE_GRID;
}
public void run() {

ProcessEditorWithFlyoutPalette ce =
((ProcessEditorWithFlyoutPalette) getSite()
.getPage().getActiveEditor());
ScalableFreeformRootEditPart root = (ScalableFreeformRootEditPart) ce
.getGraphicalViewer().getRootEditPart();
Device device = ce.getGraphicalViewer().getControl()
.getDisplay();

// Den FreeFormLayer und(!) den Connection-Layer holen
IFigure figure =
root.getLayer(ScalableFreeformRootEditPart.PRINTABLE_LAYERS) ;




// BBBBBBBBBBBBBBBBBBBBBBBB

boolean visible = root.getLayer("GRID").isVisible();

if(visible) {
root.getLayer("GRID").setVisible(false);



}

else {
root.getLayer("GRID").setVisible(true);



}

}

};

toggleGridAction.setToolTipText("Gitter an/aus");
Image iBMP = new Image(Display.getDefault(), this
.getClass().getResourceAsStream("grid.gif"));
ImageDescriptor idBMP = ImageDescriptor.createFromImage(iBMP);
toggleGridAction.setImageDescriptor(idBMP);
toggleGridAction.setEnabled(true);



//if(Globals.isVisible_ConLayer()){hideConLayerAction.setChe cked(true);}else
hideConLayerAction.setChecked(false);
//hideConLayerAction.setToolTipText("Verbindungen ausblenden");

}


//FFFFFFFFFFFFFFFFFFFFF






} catch (Exception e) {
e.printStackTrace();
}
/*
ProcessEditorWithFlyoutPalette ce = ((ProcessEditorWithFlyoutPalette)
getSite()
.getPage().getActiveEditor());
ScalableFreeformRootEditPart root = (ScalableFreeformRootEditPart) ce
.getGraphicalViewer().getRootEditPart();
root.getLayer("GRID").setVisible(true);*/
}

/**
* Erstellt die Toolbar
*/
protected void createToolbar() {
try {
//hideConLayerAction.setChecked(true);


IToolBarManager toolbarManager = getEditorSite().getActionBars()
.getToolBarManager();



IContributionItem[] ici = toolbarManager.getItems();

IContributionItem item = toolbarManager.find("HIDE_CONLAYER");


boolean found = false;



for (int i = 0; i < ici.length; i++) {
if (ici[i].getId().equalsIgnoreCase(EXPORT_BMP)) {
found = true;logger.debug(found+"DEGUUUUUG");
break;
}
}

if (found == false) {

toolbarManager.add(exportBMPAction);

toolbarManager.add(hideConLayerAction);

toolbarManager.add(toggleGridAction);


//hideConLayerAction.setChecked(true);



}else {}


} catch (Exception e) {
e.printStackTrace();
}

}

/**
* Palette Anfang
*/
@Override
protected PaletteRoot getPaletteRoot() {
PaletteRoot root = new PaletteViewerCreator().createPaletteRoot(this);


//root.setVisible(false);
return root;
}

/*
* (non-Javadoc)
*
* @see
org.eclipse.gef.ui.parts.GraphicalEditorWithFlyoutPalette#ge tPalettePreferences()
*/
protected FlyoutPreferences getPalettePreferences() {
return new PaletteFlyoutPreferences();
}

/*
* (non-Javadoc)
*
* @see
org.eclipse.gef.ui.parts.GraphicalEditorWithFlyoutPalette#cr eatePaletteViewerProvider()
*/

protected PaletteViewerProvider createPaletteViewerProvider() {
SchemaPaletteViewerProvider schemaPaletteViewerProvider = new
SchemaPaletteViewerProvider(editDomain);
return schemaPaletteViewerProvider;
}

//TODO vorübergehende Test Methode, die richtige ist oben drüber
/**
protected PaletteViewerProvider createPaletteViewerProvider() {
return new PaletteViewerProvider(getEditDomain()) {
protected void configurePaletteViewer(PaletteViewer viewer) {
super.configurePaletteViewer(viewer);
// create a drag source listener for this palette viewer
// together with an appropriate transfer drop target listener, this
will enable
// model element creation by dragging a
CombinatedTemplateCreationEntries
// from the palette into the editor
// @see ShapesEditor#createTransferDropTargetListener()
viewer.addDragSourceListener(new
TemplateTransferDragSourceListener(viewer));
}
};
}
*/

/*
public PaletteViewer getPaletteViewer() {

//return getPaletteViewerProvider().getEditDomain().getPaletteViewer( );
//this.pviewer =
getPaletteViewerProvider().getEditDomain().getPaletteViewer( );
//System.out.println(pviewer.getPaletteRoot().getLabel()+" <---- root");
return pviewer;
//return viewer;
}
*/

/*
public void setPaletteViewer() {

this.pviewer =
getPaletteViewerProvider().getEditDomain().getPaletteViewer( );
//System.out.println(pviewer.getPaletteRoot().getLabel()+" <---- root");


}
*/



/*
* (non-Javadoc)
*
* @see
org.eclipse.gef.ui.parts.GraphicalEditorWithFlyoutPalette#cr eatePaletteViewerProvider()
*/
//protected PaletteViewerProvider createPaletteViewerProvider() {
//return new SchemaPaletteViewerProvider(editDomain);
//}


/**
* Palette Ende
*/


/**

* @see
org.eclipse.ui.part.EditorPart#setInput(org.eclipse.ui.IEdit orInput)
*/
protected void setInput(IEditorInput input) {
//System.out.println(getClass()+" setInput Method called");
logger.info("Method called");

super.setInput(input);

processdiagram = ((ProcessEditorInput) input).getProcessDiagram();


/*
ProcessEditorInput processInput = ((ProcessEditorInput) input);
processdiagram = processInput.getProcessDiagram();
setPartName(processInput.getName());
*/
}

public Diagram getProcessDiagram() {

return processdiagram;

}

public void setProcessDiagram (Diagram diagram) {

this.processdiagram = diagram;

}
/* (non-Javadoc)
* @see
org.eclipse.gef.ui.parts.GraphicalEditor#commandStackChanged (java.util.EventObject)
*/
@Override
public void commandStackChanged(EventObject event) {

super.commandStackChanged(event);

}



/* (non-Javadoc)
* @see org.eclipse.gef.ui.parts.GraphicalEditor#createActions()
*/



/* (non-Javadoc)
* @see
org.eclipse.gef.ui.parts.GraphicalEditor#createGraphicalView er(org.eclipse.swt.widgets.Composite)
*/
@Override
//TODO: WEITERMACHEN
protected void createGraphicalViewer(Composite parent) {
//super.createGraphicalViewer(parent);

//IEditorSite editorSite = getEditorSite();

ScalableFreeformRootEditPart myScalableFreeFormRootEditPart = new
MyScalableFreeformRootEditPart();

//myScalableFreeFormRootEditPart.getLayer(org.eclipse.gef.La yerConstants.PRIMARY_LAYER).setOpaque(false);

//myScalableFreeFormRootEditPart.getLayer(org.eclipse.gef.La yerConstants.PRIMARY_LAYER).setVisible(false);

//myScalableFreeFormRootEditPart.getLayer(org.eclipse.gef.La yerConstants.CONNECTION_LAYER).setOpaque(true);;

GraphicalViewer viewer = new ScrollingGraphicalViewer();

this.graphicalViewer = viewer;

// ab hier
//setGraphicalViewer(this.graphicalViewer);

viewer.setProperty(SnapToGrid.PROPERTY_GRID_ENABLED, true);
viewer.createControl(parent);

// configure the viewer TESTFARBE, wenn man mal durch die Layer
durchguckt, wenn z. B. der ConLayer asugeblendet wird
//TODO hinterster Hintergrund
viewer.getControl().setBackground(ColorConstants.white);

//graphicalViewer.getControl().setBackground(ColorConstants. blue);

//logger.warn(viewer.getControl().getBackground().toString() );
//logger.warn(graphicalViewer.getControl().getBackground().t oString());

// Root EditPart setzen
viewer.setRootEditPart(myScalableFreeFormRootEditPart);

//viewer.setKeyHandler(new GraphicalViewerKeyHandler(viewer));
//viewer.addDropTargetListener(new DataEditDropTargetListener(viewer));
// initialize the viewer with input
//epf.createEditPart(null, processdiagram);

//dem Viewer eine EditPartFactory zuweisen, die das interne
Datenmodell erzeugen soll
viewer.setEditPartFactory(new CPeditorEditPartFactory());

//GraphicalViewer viewer = new GraphicalViewerCreator(editorSite)
// .createViewer(parent, myScalableFreeFormRootEditPart,
getEditorInput());

/*GraphicalViewerKeyHandler graphicalViewerKeyHandler = new
GraphicalViewerKeyHandler(
viewer);
KeyHandler parentKeyHandler = graphicalViewerKeyHandler
.setParent(getCommonKeyHandler());
viewer.setKeyHandler(parentKeyHandler);*/

getEditDomain().addViewer(viewer);

getSite().setSelectionProvider(viewer);

//TODO wichtig! Verbindung des Viewers mit dem "echten" Datenmodell
if (processdiagram == null){logger.debug("processdiagram == null ==
true");}

viewer.setContents(processdiagram);

/*
// add the ShortestPathConnectionRouter
MyScalableFreeformRootEditPart root =
(MyScalableFreeformRootEditPart)viewer.getRootEditPart();
ConnectionLayer connLayer =
(ConnectionLayer)root.getLayer(LayerConstants.CONNECTION_LAY ER);

GraphicalEditPart contentEditPart = (GraphicalEditPart)root.getContents();
ShortestPathConnectionRouter router = new
ShortestPathConnectionRouter(contentEditPart.getFigure());
connLayer.setConnectionRouter(router);

logger.info("TEST TEST");
*/

//viewer.addDropTargetListener(new
TemplateTransferDropTargetListener(getGraphicalViewer()));

// listen for dropped parts, Palette to Editor
// @see SchemaPaletteViewerProvider
viewer.addDropTargetListener(createTransferDropTargetListene r());

// configure the context menu provider
ContextMenuProvider cmProvider = new
CPEditorContextMenuProvider(viewer, getActionRegistry());
viewer.setContextMenu(cmProvider);
getSite().registerContextMenu(cmProvider, viewer);


//LayerManager layermanager = (LayerManager)
graphicalViewer.getEditPartRegistry().get(LayerManager.ID);

//System.out.println(layermanager.getLayer(LayerConstants.CO NNECTION_LAYER).getBackgroundColor().toString());;

//layermanager.getLayer(LayerConstants.CONNECTION_LAYER).set BackgroundColor(ColorConstants.green);
}



/* private Object getRootModel()
{
return modelResource.getContents().get(0);
}*/

/* (non-Javadoc)
* @see
org.eclipse.gef.ui.parts.GraphicalEditor#createPartControl(o rg.eclipse.swt.widgets.Composite)
*/


/* @Override
public void createPartControl(Composite parent) {

//createGraphicalViewer(parent);
//configureGraphicalViewer();
//graphicalViewer = new GraphicalViewerImpl();
//graphicalViewer.createControl(parent);
//graphicalViewer.setEditDomain(new EditDomain());
//Color color = new Color(null,255,0,0);
//configureGraphicalViewer();
/*
try{

graphicalViewer = new GraphicalViewerImpl();
graphicalViewer.createControl(parent);
graphicalViewer.setEditDomain(new EditDomain());
//configureGraphicalViewer();

graphicalViewer.setEditPartFactory(new CPeditorEditPartFactory() {

public EditPart createEditPart(EditPart context, Object model) {

EditPart result = new AbstractGraphicalEditPart() {
/*
protected IFigure createFigure() {


//Shape rect = new RectangleFigure();
//rect.setBounds(new Rectangle(5,5,5,5));
// return new RectangleFigure();




//Rectangle r = new Rectangle(5,5,5,5);

//Label l = new Label("Label");
//l.setForegroundColor(ColorConstants.orange);
//l.setOpaque(false);
//l.setBounds(new Rectangle(r.x,r.y,r.width,r.height));
return l;

}

protected void createEditPolicies() {
}

@Override
protected IFigure createFigure() {
// TODO Auto-generated method stub
return null;
}
};


result.setModel(model);
return result;
}




});
//graphicalViewer.setContents(new Object());
//configureGraphicalViewer();
//graphicalViewer.setEditPartFactory(epf);
}

catch (Exception e) {
e.printStackTrace();
}

}
*/

/**
@Override
protected void initializeGraphicalViewer() {
super.configureGraphicalViewer();

*/
/**
GraphicalViewer viewer = getGraphicalViewer();
viewer.setContents(getProcessDiagram()); // set the contents of this
editor

// add the ShortestPathConnectionRouter
ScalableFreeformRootEditPart root =
(ScalableFreeformRootEditPart)viewer.getRootEditPart();
ConnectionLayer connLayer =
(ConnectionLayer)root.getLayer(LayerConstants.CONNECTION_LAY ER);
GraphicalEditPart contentEditPart = (GraphicalEditPart)root.getContents();
ShortestPathConnectionRouter router =
new ShortestPathConnectionRouter(contentEditPart.getFigure());
connLayer.setConnectionRouter(router);


// listen for dropped parts
viewer.addDropTargetListener(createTransferDropTargetListene r());
*/
// }

/* (non-Javadoc)
* @see org.eclipse.gef.ui.parts.GraphicalEditor#dispose()
*/
@Override
public void dispose() {


/*

((ProcessEditorInput)
getEditorInput()).getProcessDiagram().eAdapters().remove(thi s);
getCommandStack().removeCommandStackListener(this);
getSite().getWorkbenchWindow().getSelectionService()
.removeSelectionListener(this);
getActionRegistry().dispose();
*/
super.dispose();

}

/*
* (non-Javadoc)
*
* @see org.eclipse.gef.ui.parts.GraphicalEditor#isSaveAsAllowed()
*/
public boolean isSaveAsAllowed() {
return false;
}

@Override
public void doSave(IProgressMonitor monitor) {

return;
}

/* (non-Javadoc)
* @see org.eclipse.gef.ui.parts.GraphicalEditor#doSaveAs()
*/
@Override
public void doSaveAs() {
// TODO Auto-generated method stub
return;
}

/* (non-Javadoc)
* @see org.eclipse.gef.ui.parts.GraphicalEditor#firePropertyChange( int)
*/
@Override
protected void firePropertyChange(int property) {
// TODO Auto-generated method stub

super.firePropertyChange(property);
}

/* (non-Javadoc)
* @see org.eclipse.gef.ui.parts.GraphicalEditor#getActionRegistry()
*/
@Override
protected ActionRegistry getActionRegistry() {
// TODO Auto-generated method stub
return super.getActionRegistry();
}

/* (non-Javadoc)
* @see
org.eclipse.gef.ui.parts.GraphicalEditor#getAdapter(java.lan g.Class)
*/
@Override
public Object getAdapter(Class type) {
// aus Richards Klasse
//return super.getAdapter(type);
if (type == GraphicalViewer.class || type == EditPartViewer.class)
return getGraphicalViewer();
else if (type == CommandStack.class)
return getCommandStack();
else if (type == EditDomain.class)
return getEditDomain();
// eingefügt von mir
else if (type == DefaultEditDomain.class)
return getEditDomain();
else if (type == ActionRegistry.class)
return getActionRegistry();

return super.getAdapter(type);
}

/*
* (non-Javadoc)
*
* @see org.eclipse.gef.ui.parts.GraphicalEditor#getCommandStack()
*/
public CommandStack getCommandStack() {
return getEditDomain().getCommandStack();
}







/* (non-Javadoc)
* @see org.eclipse.gef.ui.parts.GraphicalEditor#getGraphicalViewer( )
*/
@Override
protected GraphicalViewer getGraphicalViewer() {

return graphicalViewer;
}

/* (non-Javadoc)
* @see
org.eclipse.gef.ui.parts.GraphicalEditor#setGraphicalViewer( org.eclipse.gef.GraphicalViewer)
*/
@Override
protected void setGraphicalViewer(GraphicalViewer viewer) {
this.graphicalViewer = viewer;
}


/* (non-Javadoc)
* @see org.eclipse.gef.ui.parts.GraphicalEditor#getPropertyActions( )
*/
@Override
protected List getPropertyActions() {
// TODO Auto-generated method stub
return super.getPropertyActions();
}

/* (non-Javadoc)
* @see org.eclipse.gef.ui.parts.GraphicalEditor#getSelectionActions ()
*/
@Override
protected List getSelectionActions() {
// TODO Auto-generated method stub
return super.getSelectionActions();
}

/* (non-Javadoc)
* @see org.eclipse.gef.ui.parts.GraphicalEditor#getSelectionSynchro nizer()
*/
@Override
protected SelectionSynchronizer getSelectionSynchronizer() {
// TODO Auto-generated method stub
return super.getSelectionSynchronizer();
}

/* (non-Javadoc)
* @see org.eclipse.gef.ui.parts.GraphicalEditor#getStackActions()
*/
@Override
protected List getStackActions() {
// TODO Auto-generated method stub
return super.getStackActions();
}

/* (non-Javadoc)
* @see org.eclipse.gef.ui.parts.GraphicalEditor#hookGraphicalViewer ()
*/
@Override
protected void hookGraphicalViewer() {
// TODO Auto-generated method stub
super.hookGraphicalViewer();
}



/* (non-Javadoc)
* @see org.eclipse.gef.ui.parts.GraphicalEditor#initializeActionReg istry()
*/
@Override
protected void initializeActionRegistry() {
// TODO Auto-generated method stub
super.initializeActionRegistry();
}



/*
* (non-Javadoc)
*
* @see org.eclipse.gef.ui.parts.GraphicalEditor#isDirty()
*/
public boolean isDirty() {
return false;
}



/* (non-Javadoc)
* @see
org.eclipse.gef.ui.parts.GraphicalEditor#selectionChanged(or g.eclipse.ui.IWorkbenchPart,
org.eclipse.jface.viewers.ISelection)
*/
@Override
public void selectionChanged(IWorkbenchPart part, ISelection selection) {
// TODO Auto-generated method stub
super.selectionChanged(part, selection);
updateActions(editPartActionIDs);
logger.info("selectionChanged");
}

/* (non-Javadoc)
* @see
org.eclipse.gef.ui.parts.GraphicalEditor#setActionRegistry(o rg.eclipse.gef.ui.actions.ActionRegistry)
*/
@Override
protected void setActionRegistry(ActionRegistry registry) {
// TODO Auto-generated method stub
super.setActionRegistry(registry);
}





/* (non-Javadoc)
* @see org.eclipse.gef.ui.parts.GraphicalEditor#setFocus()
*/
@Override
public void setFocus() {

super.setFocus();
}


/* (non-Javadoc)
* @see
org.eclipse.gef.ui.parts.GraphicalEditor#updateActions(java. util.List)
*/
@Override
protected void updateActions(List actionIds) {
// TODO Auto-generated method stub
super.updateActions(actionIds);
}
// ab hier EMF Adapter Methoden

@Override
public Notifier getTarget() {
// genauso bei Richard
return null;
}

@Override
public boolean isAdapterForType(Object type) {
// genauso bei Richard
return false;
}

@Override
public void notifyChanged(Notification notification) {
if (!(getPartName().equalsIgnoreCase(getEditorInput().getName() ))) {
setPartName(getEditorInput().getName());

}

}

@Override
public void setTarget(Notifier newTarget) {
// genauso bei Richard

}
// bis hier EMF Adapter Methoden

// ab hier Drag & Drop Methoden
/**
* von Shapes Example geklaut und verändert, da ich hier nicht die
simple factory nutzen kann,
* sondern ich ja eine Ecore Factory habe.
* Create a transfer drop target listener. When using a
CombinedTemplateCreationEntry
* tool in the palette, this will enable model element creation by
dragging from the palette.
* @see #createPaletteViewerProvider()
*/
private TransferDropTargetListener createTransferDropTargetListener() {

return new TemplateTransferDropTargetListener(getGraphicalViewer()) {
protected CreationFactory getFactory(Object template) {
EcoreFactory ecf = (EcoreFactory)template;

//System.out.println(template.getClass());
//return new SimpleFactory((Class) template);
return ecf;
}
};
}
// bis hier Drag & Drop Methoden


}
Re: [Help needed] GEF-Editor doesn't update ... [message #248167 is a reply to message #248162] Wed, 08 April 2009 21:45 Go to previous messageGo to next message
Eclipse UserFriend
juergen.scheffler@gmx.de wrote:
>>
>> Try setting some breakpoints in your model classes to see if they are
>> receiving the changes as you commit them in the property view.
>
> How do I do that? f.e. I open the Node.class and set a breakpoint there
> and then run debug mode, correct?! for what do I have to look?
>

Right. Presumably your Node class has a setName(..) method or similar.
Set a breakpoint there. The key is figuring out when its getting called.

If your breakpoint hits when you press Enter in the property view, then
most likely your EditPart isn't updating the figure in a way that is
triggering it to repaint.

Looks like you are pretty close.

-Ben
Re: [Help needed] GEF-Editor doesn't update ... [message #248183 is a reply to message #248167] Thu, 09 April 2009 01:25 Go to previous messageGo to next message
Eclipse UserFriend
Originally posted by: juergen.scheffler.gmx.de

This is a multi-part message in MIME format.
--------------070804080309030209090405
Content-Type: text/plain; charset=ISO-8859-15; format=flowed
Content-Transfer-Encoding: 7bit

Ben Vitale schrieb:
> juergen.scheffler@gmx.de wrote:
>>>
>>> Try setting some breakpoints in your model classes to see if they are
>>> receiving the changes as you commit them in the property view.
>>
>> How do I do that? f.e. I open the Node.class and set a breakpoint
>> there and then run debug mode, correct?! for what do I have to look?
>>
>
> Right. Presumably your Node class has a setName(..) method or similar.
> Set a breakpoint there. The key is figuring out when its getting called.
>
> If your breakpoint hits when you press Enter in the property view, then
> most likely your EditPart isn't updating the figure in a way that is
> triggering it to repaint.
>
> Looks like you are pretty close.
>
> -Ben

I know that the Editpart isnt updating the figure. How do I solve this?
At the attached screenshot we can the that MyPropsource got called and
then directly the next class was "LeistungsplatzhalterImpl(NodeImpl)"
with the setName method. (I dont have that .class in the project, I set
the breakpint at "NodeImpl.java")
Please keep on helping Ben, as you can see my english isnt perfect and
Im really clueless what to do.

thx

Juergen

--------------070804080309030209090405
Content-Type: image/jpeg;
name="debugbreakpoint.jpg"
Content-Transfer-Encoding: base64
Content-Disposition: inline;
filename="debugbreakpoint.jpg"

/9j/4AAQSkZJRgABAQEASABIAAD/4QAWRXhpZgAATU0AKgAAAAgAAAAAAAD/ /gATQ3JlYXRl
ZCB3aXRoIEdJTVD/2wBDAAUDBAQEAwUEBAQFBQUGBwwIBwcHBw8LCwkMEQ8S EhEPERETFhwX
ExQaFRERGCEYGh0dHx8fExciJCIeJBweHx7/2wBDAQUFBQcGBw4ICA4eFBEU Hh4eHh4eHh4e
Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh7/wAAR CAPeBXgDASIA
AhEBAxEB/8QAHAABAAIDAQEBAAAAAAAAAAAAAAQFAwYHAggB/8QAZxAAAQMD AgIDCgkHCAYJ
AAITAgEDBAAFEQYSExQHFSEWIjFRU1WRkpTRFyMyQVJUk9LTMzRhcZWx4SQ1 QlZjcnShNnWB
orKzCCVDV3OCo8LDYsFktOPwZWfUGCZGdoSWpPE3RbXk/8QAGwEBAAMBAQEB AAAAAAAAAAAA
AAECAwQFBgf/xABDEQACAQEFAwgJBAEDAwUAAwAAAQIRAwQSIVETMUEFFlJh cZGh0QYUIjIz
U4HB8BdCsdIVYsLhI3LxQ4KSorIkRFT/2gAMAwEAAhEDEQA/ANE0raNT3O0R rpEtU19l5FVt
xuK4YrhVFcKgqi9qKnh+atmh2fWu5BCz3BFVcZKIQp86/wBIU8X7vGlfRn/R OTb/ANH3S6f/
AEJP/wBsu11NK++v/plebtebSwVmnhk1n1Oh8lD0ZsbZK0c2q55I+CHNR3EF UVeJCFVRUUU7
FRe35qwHqe45/Lr6E91b70Div/5wdvP5llTl/wDSeqx0dYH+kzo50GeqJTxX Wbe3IIXQ14kl
6EERx80MlVVNeI2QoRZ258HaufrLxytZXW0StYLDhi29MWLhTP3dfoeHduSp W9m3CXtVap2U
4169Dl/dNcfLl6Ep3TXHy5ehK6v0WWbSNt6adESNM3puYs1qcUmAVyizXoZN smiKbkYlDBoS
KifNhe1fmotHdHOmNQ3To7OPLvMe16rhzHHGXn2zksORgXdhxAQSFS2/0EXG fH2P85c1J1j7
OHFWmmOqp2QbXB91dHyNbYeutKV/7aP/AOy7DRe6a4+XL0JTumuPly9CVvGh ejey6g03pK6u
u3U5F3s91uT8OM43xHziutg2wxuHAkXEyqlu+T4EzlNe6W9LWzSmpYdrthzU 4trYmSGJbgG7
GdcU8tEoCiZFBT5vn/SldN35Uud4vHq9n72fDRtP+DG25LtrGy2s1llx1p5l R3TXHy5ehKd0
1x8uXoSq+fbjhBGV2XbnCkN8QWo89l9wBwK/GA2ak2vfJ2Ggr4fEuO09Aenb NaNSdH16kLOl
XbUDtzOOgOAEeM1HaMC3ioqRmqkmMKKJnP8ARwV+UL9YXO7u3opb6JcWk3Sv Dc66FLrcJ3i1
Vnu3b9G0q+KOTd01x8uXoSndNcfLl6Erb3tCaPtfRvAuF31Pyd7laYbvjRyb jEbbfI03DGCO
pccjUUVENO9UvBlcilJ0VacsWo9SO26/3E4bfKGcUQfBhZEhFFAZQzRRHdle 1U+aq2PKV0tr
GdtBVUN+Re15MtbK0jZy3y3ZlX3TXHy5ehKd01x8uXoSt1vWhtMabttyvOoY 2qG4wX9uzxYA
uRwkt5Y45uOngwLvMqKDjKomVTdkbnRlt01duie3Wa5DeRgXPpBSJEKO40Dw qcRUbV3IkKog
5VUH58YWsLXle7xs9rCGKNUq01zy1p/4ZeHJU3PBJ0dG9+hzHumuPly9CU7p rj5cvQldJDov
0XBhN9f6pW3FNuF0iRpsm4RIrEfk3iZRTbdJHHlIx/7PwISZ29irJtD9oLR/ Q1ZmoM7q3UF0
feuTATRBuYTchptFeFGvjR3kCoKqiIAqK7l2mOU+Xbq0thDFnTThJ/7X/wAJ pmseRbVP/qvD
lXXil90ct7prj5cvQlO6a4+XL0JXXpCy9Xr0uW9ybLb4+pbRaI7kl/j8BtLo rOBREFBDO5UB
PAi9pEuSXXdRaC0LG1NZ7LbdROc29qYbLMgHc4kiUrSlhZAiyqq0mRJNrg7k VR3Ii9ixYcu3
aUtnawwyyy374xlotafQm15EtIxx2bqs+rc2tXpU0PumuPly9CU7prj5cvQl Zdf2+x23V1xt
OnhuXK2+S9DdOcYEZvNPONko7BREDAjjPb4autT6d0lpq0WqLPW/Sr1c7A3d m3Y5sjGaJ4iR
ptQJNypgD3FuTGEwi5730/WrDDZyUff3Kme6v8HD6lLFONfd35/QoO6a4+XL 0JTumuPly9CV
vk7o80sFmfaZkXhm6saIZ1Ur7jzZxyypcVnhoCEnye9Xcvyu3wd9i6T9A6N0 ja7pEb1Kg3+1
lEFY8i4RCK4K8g7+FHAuM1t3iXf5ymVTKd9XHDlq4ytI2fFuiy60q9lX+JHQ +R7wouVMkq7/
AK/waR3TXHy5ehKd01x8uXoSuq32w2HR2hOkvTUUbpLctrmnwukg5DYcwTkg HCFhEBeGO08Z
JT7V8He99m6SLZaIsfpjduMeZertbX7O1HuEp1gHR44MoO3YwiAiKWC2pkwR E71ckvLHl+wn
OkbP2aqj1rs6On/vXHTV03fIc1Grlnpp73H/ANv5x5J3TXHy5ehKd01x8uXo St5150dacsdm
1SFvn3U7rpNy3N3ByRw+XlFLEccIRTcGFMflKvzp+mrEdA6ci/8ASCt2i7F1 u4Fslg9c35xN
uNkAstSEQdgjhFQlFVL51TCePqjyzcpQxRXBvdwilKv1UlTtMHyRbxdHqlv1 bX8pnNe6a4+X
L0JTumuPly9CV0fUVmsGutNX3pGiSrpdrq+7LkuMQ32RGCwBqkcnWnERxQVk UVSRcoqfJ8Ue
P0b6Ym6p0TpSLKvLVyvtqi3WbIcNomG2jaeMwbFBQt+5nCZVURF7c1FnyzdX Z4rSOFqtVTdR
Vf0S40z3kz5ItVPDF1XB131dF4mgd01x8uXoSndNcfLl6EraujWz6X1V0j6X Y01GvbEVXylT
UuRNOojLZcQe1tBxuAcFlMCpIiKXhXZdNhaNSarj9KN0enzXLrruNbbSxHIW gEco4Dju8SJR
RoR71EFVVMZTdkV45VsbCVHZ/truzq3RKnXRutdyFlyVK0VVLjTfoqt/TI5h 3TXHy5ehKd01
x8uXoSuq3nQGkZdyuF41Rqbqp++3++JHlP3GJGjxEYlugKGDpI49kkT8n4EV M47FWLo+DZGe
ivS2n7/eFtMTWl1dnSpCpwyCHHbwCbiyKIrvCVFLswa9nZmsVy9dZ2SnZwq6 pNU7W6ZZ0wvt
p1o1fIlrGbjJ0Wef8dlar8RzTumuPly9CU7prj5cvQlb5fujqw2JvUt3ukTU TFussKG43EWT
HV6U7JeVoCB4UIODuT5WzdjK7cphcmjl0o10cdJrnBvpaf49nERRxoJqislU +VhQTv8Aw9na
PiWt5crXd2TtLKGJJxW7pOKpXWkk+vUxjyVPGoTlSteOifhlQ5/3TXHy5ehK d01x8uXoSuqT
+ibRdlul6W+X6Y1bYl8YtLTrk+JD4KORW5BOuG/hHMC4ibATcu1VRFTOKp16 0WDoInNWp+XL
GXrIrRMuFuuAMdYR2mzNdpo2fxRAJYDKpuLcpKKqC5Lly6WqSu8cTbit1Pe8 v57zT/C2sKu1
eFUfXu8zQO6a4+XL0JTumuPly9CV2zWMwk6SelS0RVkMQLHoGVGhR1fyywqx o7i8FtBRG0wQ
ovaSqqKucbRHSuk/QOjdI2u6RG9SoN/tZRBWPIuEQiuCvIO/hRwLjNbd4l3+ cplUynfVS6cv
Xe1lCFpDC5pNcd/0Wq79FUvb8iWkIuUHiSrXhu+ppHdNcfLl6Ep3TXHy5ehK 6UOgdORf+kFb
tF2LrdwLZLB65vzibcbIBZakIg7BHCKhKKqXzqmE8ddrUdJ3MImvdRvX2cer 5twfgpbibbGN
FjmjbW4XUVTJctdmQ7FJexURC2jyxd5zs4xhVTVVlnnWip1pSe/h1mT5ItFG TcqOLo88uvPq
ql9TRu6a4+XL0JTumuPly9CVv2jOjnTN7tmi4sp+8M3bVUW6G0+282rEZyIS IKE2obiEhXtw
aLlP09kW5aE0XbNBxrjcdTJCu8rTYX2Oci4RG2nlPJDGCOpcciUUVENO9VfB lcilpctXGFo7
OWTrTd1tV7KxfkVjyPeJxU4qqpXf1J/w0aX3TXHy5ehKd01x8uXoSuo6bsFo 0vpzUDMcp8i8
3DoxmXh+QTgDHaB5MNtgCDuU02LklLHZ2Iu7vZ71t0+kye5dYlxvDEforC6Q m5ciOpQwTiYa
bIY6JvFETa6oqqLuVULKIPLacv2EZyUbOqXHXsX04s3hyJOUU3Kjfhu8zj/d NcfLl6Ep3TXH
y5ehK3cujvTremXG3Z1zHUDWjk1W46itrDRpSX4lBxvUsCqbsomcLj5qiag0 NYmrhozTlnK8
uXy/wLfOfddJs47QSOIJbREULIkGe1cIOcr4u2HK1ynLClxfDRVr2ZPuOaXJ VtFVfVx14dua
NT7prj5cvQlO6a4+XL0JXZ9Z2XSGrtSndbpIvJMLqprRttbgONgDSNsjky3g qqiOI/4PCm3H
jWmt/RRpS9ToUW13G9RlHVcrT0spKtHxFjsOum42gim3dwSRNyljKKvirjsf SC5ys1O1jhyq
8q047/8Ag6LTkO2jPDB1+v51nMe6a4+XL0JTumuPly9CVvNm6OtN6kvWgTsc +6xLTqxuW5wp
vDOSyMVV398CIPfJhE7Fwq/0vBWwtad09rLQ+glZK5W/T8KzaguvCdlMJJdb aksIKE6aA02S
78qpJtFMoqqibq0t+XbnY4fZybzy3e941g1T611rZci21piVd27Pfu+zr4HJ e6a4+XL0JTum
uPly9CV0awWzTtlna9b0vfGLpGPo6my14ctmSUR0kRCZN1lVAjFQVcpjsVP1 rtOjIyQLv0Z9
HqT50Ca5AlXmS9FEAdYdfbc4SkLrZgWGxfbUVTOVEuzGFztuXbGCbs7PFlXT LC5N7nupTjvy
L2fIsnTHKnD61SXHjU4h3TXHy5ehKd01x8uXoSugW7QOheo2HJj2pVmN6Ha1 bJJt9hW+Go98
yOQzuVRPCr2J2Zz215l9H2k491nOo7enbcxoRdVtMLIaB/dlcMk5w1HGBLtQ PnTxdu0eXLi6
5eBnLkW8J0+5oPdNcfLl6Ep3TXHy5ehK6fbdOW3TEnWPUsmW5EuPRhKu0ZJW 1XmBdFMCSiiI
qooF2oieHHzZXa9KTmNIaJDTMuG1cBiaFuOorpAeBQ4yuONk02S9uF2g4C+F Uwi4TwVzXn0g
sbJVs7LFu6smm3w4Up2vea2HIcrT3pU39elOPGpwXumuPly9CU7prj5cvQld rj6Btd40FpvT
tqvW6x33WpzI7zafGtx0tz5K0aL4HBVog7c9qIWPmrTbN0dab1JetAnY591i WnVjctzhTeGc
lkYqrv74EQe+TCJ2LhV/peCtrLl65SclNYcNeGibzyyfsyy6uwztORbaKi45 1px1dO7NZ9Zo
3dNcfLl6Ep3TXHy6+hK601p3T2stD6CVkrlb9PwrNqC68J2Uwkl1tqSwgoTp oDTZLvyqkm0U
yiqqJuqrsFs0/ZZuvmdL31m5xXejmbKJWpjMkojhIiEybrKqBGKgq5THYqfr Wi5fu0oz9j2o
1y7JNb6b6KvhU0fIVqpRz9l0z7V+I5z3TXHy6+hKd01x8uvoSumas6PujuwL rHe5qt9NKPwG
5SDIjpzHN7diB8X3u3iDlV8OFwlQb70e6S07cOkBbk7e5sPS0q1NNDHfaacc GWoblJSbJFUU
cRUwg5wqdmcptZ8uXK0VYp8OG+uGn/7j39pjLka3i6P+e3yZoPdNcfLr6Ep3 TXHy6+hK6Pf9
OM6P0Z0x6diSjkhBl2MAdNEQ9jkgXEFcfPtcRFVMZ8SeCte/6PUJJvSxa4iy p0F51t9GJUQm
kNk0ZNVXDjZiSKKEOMJ8pFz2YXaHKNjaXe2t4QTjBV7VgU9Mt/Xu+hnLk2UL Szs5Ojk6dntN
a5ms901x8uvoSndNcfLr6ErcdOdHdof6OX7reZL0G9jpd3UcaO3PR4nIwZUT NpGEQBJNqIvF
UlXPephUS3u3RXYW9NHqO2HeZUO4woIWJkpDCOvz5LhN8E12omAVBUsY7FXC rhazfLdwTo9a
bsq9T6/s9C/+GvGnXv8Az8aOb901x8uvoSndNcfLr6Erb+krQmn9P6NG8Wue 67OZvxWWbHGZ
zTTbosk6qI5wGu+FBwqIioi5TOUXHP0t7vVZ3EpNvbaFzho27PZB8yyKd4yR o4ad8naIqnh8
S47rperterLawolWmdFn/wA8NTmt7jaWM8ElnSuWhY901x8uvoSndNcfLr6E rd9LSrjp/oBu
1708JxrrKvwQJU5hUF+NF4CFkS8I5NduUwvfZReyt00Tpqc/cbymttSsXQrj pWFEhTWyJU4U
6QTcciJxsTJxXG07TyXamc/N5t55Xs7ttJTgsMXh35tqlaKnXrU67HknbYVG TrJV6ks+NerQ
4p3TXHy6+hKd01x8uvoSuzStMsWSD0TR0IxuFq1GzGuTORVW5EhY8lQPCfKE dqJ2+Bfn8Ncy
6YrtIuGtr3BHUuqrpHYvU5TjXBxRiRjB4wEWQ45oSCimKKoBhETsTOEvc+VY Xy2jZ2VmqPFn
1J0rknvWebWlRb8lbCzc7SWapl2quq3bsqlN3TXHy6+hKd01x8uvoSu1aBuT MGx9DMOTqG+W
xuXJuYcpCbQo8xeaERGRlxO9yaCneH+UJe8xuqmsPRdaL7q2bHvphZ1u17us ezBDmim4Yzh7
hFhGCTYCiQqSuB4ERE7Uzh/nbCznaRtrPCot5764ZNPKi0rlWi37i/8AhZyh CVnKrdMtKpPV
9mdDl3dNcfLr6Ep3TXHy6+hK3uJ0caeu+i9OXSwS7pNfuhwWZcxt5hyNAefM QNt1rvXBUd44
XK7s/N4VqulbSmjdOxSGxX7iXOPdnbc/bpFyiSZBiAkvHQWFy0OQIVE03Iqp navYvZZcrXK0
tY2Ud7bW7ijCfJVvCDm1klXeaz3TXHy6+hKd01x8uvoSuy6PuUu0aN6KZT2p bbZrECXVbqzP
nA23LDmgwCMkSK8WN6JgS2qXbjKItHBtXdf0bRbbp+3qMa6dJTyx4wuIwoxe SdcQdyouza2m
fkljHyV8C8f+bs4zkp2aSjLDWuSpJxzySW6tK7uJ0f4asIuM82q0+ieWeeld Tm3dNcfLr6Ep
3TXHy6+hK6/ofQuho3SDoN+Mq3236gZuS8J18ZEYXIw7VJCJhvihlVRO9HK7 SRVRMFQaPGNc
OgmDCsjVws8rVGsmbO9ISeJGrBtKYi4QtArjaAuFbTZuNVXcgqoVaXLl3fw7 Ou7fRUrKUXXe
8sL4ZlY8i2n75U39e5J+NTn/AHTXHy6+hKd01x8uvoSt+ufR3pNyZbVtEy9N xV1oulZoSzaJ
xwxXvnWlEUQUwJ4QkL5v1Lhe0j0fsN65uJpqkrfpSWxBIBkMI7IeOW9HJUXh 4QMi2qL4fldn
aiJuuWbnKKkot/8At1aS7213mb5It06P+epv7M0fumuPl19CU7prj5dfQlb9 0hdHmk7FbNbj
bJV7KfpSRb23Dkm0rUhJahtQREUVFFHEyqr2qi9lcm4ZfRWu243m736DnYrJ U3qm9JrvTTOW
83Kd2ko2nHr66fyXfdNcfLr6Ep3TXHy6+hKpOGX0Vpwy+itd2wWiObCtS77p rj5dfQlO6a4+
XX0JVJwy+itOGX0VpsFohhWpd901x8uvoSndNcfLr6Eqk4ZfRWnDL6K02C0Q wrUu+6a4+XX0
JTumuPl19CVScMvorThl9FabBaIYVqXfdNcfLr6Ep3TXHy6+hKpOGX0Vpwy+ itNgtEMK1Lvu
muPl19CU7prj5dfQlUnDL6K04ZfRWmwWiGFal33TXHy6+hKd01x8uvoSqThl 9FacMvorTYLR
DCtS77prj5dfQlO6a4+XX0JVJwy+itOGX0VpsFohhWpd901x8uvoSndNcfLr 6Eqk4ZfRWnDL
6K02C0QwrUu+6a4+XX0JTumuPl19CVScMvorThl9FabBaIYVqXfdNcfLr6Ep 3TXHy6+hKpOG
X0Vpwy+itNgtEMK1LvumuPl19CU7prj5dfQlUnDL6K04ZfRWmwWiGFal33TX Hy6+hKd01x8u
voSqThl9FacMvorTYLRDCtS77prj5dfQlO6a4+XX0JVJwy+itOGX0VpsFohh Wpd901x8uvoS
ndNcfLr6Eqk4ZfRWnDL6K02C0QwrUu+6e4+XX0JX53T3H6wXoSqXhl9FacMv orTYLRCi1Lru
nuP1gvQlO6e4/WC9CVS8MvorThl9FabBaImiLrunuP1gvQlO6e4/WC9CVS8M vorThl9FabBa
IURdd09x+sF6Ep3T3H6wXoSqXhl9FacMvorTYLRCiLrunuP1gvQlO6e4/WC9 CVS8MvorThl9
FabBaIURdd09x+sF6Ep3T3H6wXoSqXhl9FacMvorTYLRCiLrunuP1gvQlO6e 4/WC9CVS8Mvo
rThl9FabBaIURdd09x+sF6Ep3T3H6wXoSqXhl9FacMvorTYLRCiLrunuP1gv QlO6e4/WC9CV
S8MvorThl9FabBaIURdd09x+sF6Ep3T3H6wXoSqXhl9FacMvorTYLRCiLrun uP1gvQlO6e4/
WC9CVS8MvorThl9FabBaIURdd09x+sF6Ep3T3H6wXoSqXhl9FacMvorTYLRC iLrunuP1gvQl
O6e4/WC9CVS8MvorThl9FabBaIURdd09x+sF6Ep3T3H6wXoSqXhl9FacMvor TYLRCiLrunuP
1gvQlO6e4/WC9CVS8MvorThl9FabBaIURdd09x+sF6Ep3T3H6wXoSqXhl9Fa cMvorTYLRCiL
runuP1gvQlO6e4/WC9CVS8MvorThl9FabBaIURdd09x+sF6Ep3T3H6wXoSqX hl9FacMvorTY
LRCiLrunuP1gvQlO6e4/WC9CVS8MvorThl9FabBaIURdd09x+sF6Ep3T3H6w XoSqXhl9FacM
vorTYLRCiLrunuP1gvQlO6e4/WC9CVS8MvorThl9FabBaIURdd09x+sF6Ep3 T3H6wXoSqXhl
9FacMvorTYLRCiLrunuP1gvQlO6e4/WC9CVS8MvorThl9FabBaIURdd09x+s F6Ep3T3H6wXo
SqXhl9FacMvorTYLRCiLrunuP1gvQlO6e4/WC9CVS8MvorThl9FabBaIURdd 09x+sF6Ep3T3
H6wXoSqXhl9FacMvorTYLRCiOydGYR5+mivFzQJjrst6O20+Ri2CNAySr8WQ kqrxkTw4TavY
ueybMudtjkqLYrJ2eNyZ/wDlFa3o2Qsbo9to+BTu1w/5MKp980rqgGHpL2nr u0y2Cm44cJxB
AUTKqqqmERE+evmbSC28naTpVumdNzplme/ZQgrFUgnkuFTLEu8O6Xy32QbL bI43GW1DSTFd
ko6yThoAmnEeMVRFVFVFHtTKZRe1J+jGIRaPgXOc0xPlTmDkLzROiLYo+60g ijRh5JVVVVfl
ImEx26bohVb6QtMCS+G9wv8A7YCts0CjMhnQNrlBvYlRxbdDcqbhK5SkVMp2 p2eKq32ErFOM
ZOiwve67pt/wibvGytZKWFceC1j5lw1CuEqOMmBoRiWwedjrMe4GBYXC4UX8 L2oqf7K1e4XE
ZcubZyskS1ymYst9HoxSBcacjsOPKBg64aYXhKKphFRVRc9iou7OaphTtM3S BYIly0wcNht5
mS3fpbjTKFJaAvix7MYdJVwir4cIq1z24To9w6S9RTIjvFjymL68ye1U3AUK UQrhe1OxU8Nc
11dvJWkpprDWlW+FGq0bWae7qeRrbwu6cYpJ16l19SfA3jTdkgdQ25Ft7d2u EmJHkEryv7yJ
5kHdoi04KYRDRPAqrhVz24SCa2lx8I7GmrS886SADYnNIjJVwiIiSMqqr81Z bVcbhDkWXqtx
0JoWu2cHhJklJYTCIiJ8+c4x8+cV027RCiDcb1ZLXbV18kIHJURp3ictvyhu tBjBOqipkcr4
U7S3fGfkN/5b5Tne7bBeJrDKSom9ybyST35bj9YufInJdhdbDaXaEnOEWm0t 7Szk2vdzzefi
j5v6UItuk6R1E4xZ2bRLtcRJBFGdfVHRKQ0wbbgumfb8cioqYxtVFRc9iser n3pWidcOyHje
fcswm444SkRktxhqqqq9qqq/PSvv/QjlW937kvaW03NqTVZOrpRcfqfPelHJ l15P5RlZWEFB
Ui6LJVNY0fqrU1vscaDB1TfoMRofi2I1zeabDKqq4ESREyqqv61Wtia1fqwk 7db6p/bMj79d
2u3RL0O2K1OXC7WmHbbfHxxJEu6vtNN5VBTcZOoiZVURMr4VSquPpDoAkRGp UF20z2XZARmy
hXp6RucJ1lpBRG3VXsOQwir4B4oKWEXNd1p6Y8h2knJ3Ztvjhh5nyFpyFyg3 7NtRdr8ji1hv
NwsF1Zu1mnuRbgzv4clRF0xUxUSLDiEiqqEvhRfDX6upr71pa7iV5dSTaA4d uVlpphuKOcqL
bTQC2KLhEXA9qIiLlEr6L+Bfo0/q4Xt8n8SnwLdGn9W19vk/iVeXptyNKanK wk2lSuGO7T3t
2b7zCHo3yhCLjG2STdd739xwJ/X2r373EvTuonVnwW3G4TgxmASMjgqJ7QFt BVVRV7SRVqMz
rDUbd9tt6G9Gky1MrHt3DjstMw2lRUUG2QAWxRUXC97lUREVVwmO0S9EdAkO /jp+W/Y494Jw
GhgO39wZCmeFAeGr27JbhwmMrlMeGplx6Muhy3XSJbJ9qajSpjZORxduEkUN BdZaVNyubcq5
IZFBVckpoiIvbVF6YchKlLs8lT3Y7nWq97dm+9mj5B5Sdf8Ar789735dXUjl uleki5s3oZWp
b1cJEdm1y4ERIcGEKx0fJsiJG1bEDTLQd6XZ2fpXNFrO96eusezQ7FYWreEG MYzJhQY0N2c8
RJ3ysxstgiIPZhcrvXsTGV73C6H+iqdCYmwrG1JiyGxdZeZuUgwcAkyJCSOY VFRUVFTsVKy/
Ar0Z/wBW19vk/iVhZelXIdjeFb2VjOLXBKKXH/V1vqrnvNp8jcpWli7G0tIt PWtf4Pl74rxp
WxWLXOqrFBjQrNfSiMxXTejosVh9WTMVElBXWyUMoq5QcZyvjXPaLZ0fdBt0 vMqy2wbTNukT
fzMKPfHXH2dhIJb2xdUhwSoK5TsVcVb/AAK9Gf8AVtfb5P4ld9v6d8kXiGC2 sZSWjUX/ALjj
sfRi+2MsVnapPqb8j57jax1PG0m1pZnUMkbS3GSJwVaaIyZ8mrigpoP6EJE+ bwUa1hqFqUEl
u7JxG7YNqbQ4rDgDFHwNqBgokn6SRVWvoT4FejP+ra+3yfxKfAr0Z/1bX2+T +JWK9M+Q1VK7
yz3+zH+xq/R/lFtN2yy635HAY2u9WsSJ8odRPOybhIbkyXH47DyG8CIgOIBt qAkKCKIoimNq
eJKhtanvrYQwG8u7Il366BCabLdN2qKPEqjlVwq97nb+ivor4FejP+ra+3yf xKrtQdGnQvp2
EE3UEW32iKbiNA9OvLzAEaoqoKEbqIq4FVx4cIviqF6ZchrJXeXD9seG793A PkDlJ5u314vj
v4HE7br7WVuhyo0PVEptJcl+U8asMESuPmpuqKq2vD3KSrgNvh7Krm9QXZty wKFzNA08Th2t
vhNqLBm6LpFnbk1UwFe+VU7PB4a+iYXQ/wBFU6ExNhWNqTFkNi6y8zcpBg4B JkSEkcwqKioq
KnYqVDj9GPRFIv8AIsbGn33ZkZtHJGx+aTTSrtVAJ1C4YubTAuGpb9pIW3aq LSHplyHD3bvJ
f+2OjXS0bXY2JcgcpS32673xz01RwOFqO9xG7sLV4d33iTzU9xWmtzzyPK8h /IwBI4Skiggq
K+DGEqyumv8AV1zmQZM/UDj62+UMyKHLMAIPiuUcXaCby/v7q738CvRn/Vtf b5P4lYonQ/0V
TGidiWNqQ2LhtEbVykEiGBqBjlHPCJCQqnhRUVF7Upzz5DclJ3eVV/pjpTpa Zdg5v8pUa2+T
63rXTU+c4d8usR+7ymbq6kq8hIbuD6tt7nhfNTdTG3aO4l/oomPmxU4tY6kW yBZUvTiQQjlF
QFYZI+AS5JpHSBXBBcJ3okidieKvoP4FejP+ra+3yfxKfAr0Z/1bX2+T+JV3 6bciySTsJZU/
bHhkv3cEVXo7ygm2rZZ14vjv4HDtba9mXmHBstoflW+1Naeg2y4JwGAOY4yr imPFHLqs98Pe
qQouS73BLmBedb6pvFnGzXLUD8i3YBCYVppFc2fIU3EDiFjCeElruvwVdEHX PUvVkXrTl+a5
LrZ/j8Hdt4vD4u7Zu73djGeys0Lof6Kp0JibCsbUmLIbF1l5m5SDBwCTIkJI 5hUVFRUVOxUr
Cw9LuQrFJKwk6OtXGNa61qbWvIfKVq6u2SypRN0pSmhwG+az1PerQ9abjfnH oUgY4SAWLH3v
CwaG0hu8PilgkRe0s+HxrnHO1ZqKc5qF2Xeiec1CrS3InIkckc4QiLWBVvaK ggjtJEQkVM5z
219BS+h/oqhtC7LsbUdsnAaE3blIFFMzQAHKueEiIRRPCqqiJ2rWX4FejP8A q2vt8n8Srr0x
5CW67S/+Mer/AFdS7loU/wADyk//AF13vy633nz1f9Yalv1satd2v8mTb21b Ll1BseIQJgCc
MRQ3FT5t5EmURfCiLRNX6lHUN41CN+eG73dpWZctGGUJW1AA2imzaPetgmUT PZ4cqtfQB9D/
AEVBNahHY2hlOtm62ytykIZgCihkg8TKoKmCKvgRSHPhSsvwK9Gf9W19vk/i VK9MuQ0sKu8q
Z/tjxpX93Gi7kR/gOUqp7fTi+G7gfO7eqb8zpxNORruTFr5d2MTIR2dxMuqi uN8VQVxBJURV
RCRF+evC6kva3233tbw+k22RGIUFwBAOXZZ3bATaKbvlllSyq5wvZ2V9F/Ar 0Z/1bX2+T+JV
Rc+j7oNtd5i2W5jaYV0l7OWhSL462+9vJRHY2TqEWSRRTCdqpirL015FxOSu 8qutfZjx3/u4
8Sr9HeUMKjtlTtfbp1HGS15q5ZDkgNQGy6cZ6MKsw4zaNtvEhO7RFtBQiJEV Txuz89RtO6sv
2nYRwrJdViRyfbkK2Udl8UcbXImIugSCSYTvkRF7E7exK+hvgV6M/wCra+3y fxKfAr0Z/wBW
19vk/iVVemfIai4eryo96wx4Oq/dwbLP0f5RclLbKq632aHArbr7WVuhyo0P VEptJcl+U8as
MESuPmpuqKq2vD3KSrgNvh7KwNaw1E3crTcBvJ8azxUi27LLW2O3tUVRE2YL KLhVLcq13mf0
UdE0CVb4suwq29cZCxog87KXiOI046o5Q8J3jTi5XCd7jwqiLL+BXoz/AKtr 7fJ/EqI+mPIU
XVXZ/wDxjpTpaNomXIPKUt9v4vWump8/Ma11Q3MfllfDddfhhAcFyKwrKxwz sa4HD4W0dxYT
Z86+NaiXHUl9uES7Rpt6eeC8vR3rkqtNIslWCQmkXAd4iKidgbfBjwV9Dzeh /oqgwn5s2xtR
osdsnXnnrlIAGwFMkRErmERERVVV7ESoen+jToX1FCObp+Lb7vFBxWjeg3l5 8BNERVFSB1UR
cEi48OFTx1aPpnyHHdd5f/GPBpr92qT+hD5A5Se+2Xe+zTQ4xF6RNaxbpdLo xqd8Zl0fCRJc
KNHJN4Ni2CiBNqAqgAKZQcrjtVapZ16uk61Dapd0edhJcTuhtEAfGyibVtXC LbuztJexFRO3
wV9JfAr0Z/1bX2+T+JWKF0P9FU6ExNhWNqTFkNi6y8zcpBg4BJkSEkcwqKio qKnYqVFn6Z8h
2brC7yW7dGPDd+7hwEuQOUpqkrdPfxfHfw4nz6eq7+5frzfXruT1wvTJR57r kZlRdZJsG1bV
vZs27GxTtH5u3K1nvOt9VXizDZrlqCRIt6ICGyTTSK5s+QpuIHELGE8JLXe5 HQ/0VR3Y7T9j
aackuK1HA7lIFXTQCNRFFc75doGWE7cCq+BFrL8CvRn/AFbX2+T+JRemfIac X6vKsaU9mOVN
1Pa4cA/R/lJprb761zfHfwPnpNX6lHUN41CN+eG73dpWZctGGUJW1AA2imza PetgmUTPZ4cq
tfto1jqOz2hq1Wq9HFismRsisdl1WVIVElbJwCVvKKqKo48K+Ou56g6NOhfT sIJuoItvtEU3
EaB6deXmAI1RVQUI3URVwKrjw4RfFUyF0P8ARVOhMTYVjakxZDYusvM3KQYO ASZEhJHMKioq
Kip2KlS/TPkNxwu7ypkvdjw3fu4VdBzf5RxYtsq9r47+HUcUm6/mx9GaZ05p 6RLtr1vh3Bi4
TRYY3mMh4DEGXV3Oh3qFuUdnbt7VVEVK4Na6ob00Om2b++3aUY5ZWEaaVVZ8 nxCBXEH9CEnZ
2V9A/Ar0Z/1bX2+T+JT4FejP+ra+3yfxKxs/S7kKFXsJNuTlnGLdW2+lwq6G k+Q+UpUW2SSV
Mm91KadR8+O6z1OenzsIX5xuAcB23KPKxzc5Z35bSOm2TiCqdmEJMYTGMJjw 3q7ULc8pqXfc
51OFkEXIjDjaQh3YZUCbUTTvlzvQlX5+yvoE+h/oqCa1COxtDKdbN1tlblIQ zAFFDJB4mVQV
MEVfAikOfClQ16NOhdGoTqxbfw57Yuwz65exIAjbASbXi9+ik80KKmUVXATw kmdeePITbfq0
s9/sx/t1souQOUkktvu631dXUjhT2rtTPaYDTLmoZa2pGUjmygNoTrSLnhk4 gcTZn+ghIOOz
GOyvyPqu/sahgX9u8GlwtsFuBAcVhlUjsNiYiKCoYLHEPtJCXt8PYlfQ/wAC vRn/AFbX2+T+
JUSB0UdE0+VcIsSwq49bpCRpY87KThuK026g5U8L3jra5TKd9jwoqJK9M+Q1 X/8AjyzrX2Y5
1VHX2uK36kc3+UXRbZZdb4Oq4cD5+i6jvcaPBjtXh3hQrt1y2hNNEpTdqijx KoZVcKve525X
tSskXVepIysq1qCUJN3l2+KQttCpzXRITdVRBFwqGSbEwOF7UWvoj4FejP8A q2vt8n8SnwK9
Gf8AVtfb5P4lQ/TPkN5u7y/+Mer/AFdQXIHKSy2/i+vq62fPcnWOppWoYV/l X+S5cICbYRiD
bQRxzlRBtsRBEX5+zJJhCyiIlZ115q5bpBuK6hNHYDcluMDcOM02AyCEnkUA bET3KAqqEipl
M+HK13iX0P8ARVDaF2XY2o7ZOA0Ju3KQKKZmgAOVc8JEQiieFVVETtWgdD/R Uc12EFjaKU02
DrjKXKQpgBqSASjxMohKBoi+BVEseBah+mHITSTuzot3sx/t1vvJ/wADynVv b7+t+RwJ/Wmp
pNymXKXfDky5kEre+bkZhQKMSYVrh8Ph7f0bad2mpl1aOrFvri3ttvhsyljs /FBsUEEQ2bMI
hF4RXtVVru7XRR0TO3mTZ27CqzosdmS81zsrvW3ScFss78LlWXEwi5Tb24ym ZfwK9Gf9W19v
k/iVK9MuQ1//AF5bqe7Hdp727qIfo/yk/wD11vrve/XcfOCahvqRnY6Xx9Bc sAadzwGcjbxR
U4Kd58+Vya9929ipV7p7Xcm3LfZ10N+5yn9JOaftbSRY5tson5ETA0ETbRVJ S371VFxhU7K7
l8CvRn/Vtfb5P4lPgV6M/wCra+3yfxKytfS3kK1s3Z7CSroop/8A66zWz5F5 ThNT2ydNW+rq
6kfPJ6u1E7drhdpF7dkzrjDKBJceZaMCjKmFZRpQ4aBj+igomcr4VVVXLV2p LjLu8yVfnjlX
a3lbJbqMMoqxSREJoUQNooqJ4UTd2r219DfAr0Z/1bX2+T+JT4FejP8Aq2vt 8n8StOeXIX/+
Z7qe7Hdp7xn/AIHlL5/Gu97+4+cbVf7tagjBbbrIihFnDPZFsuwXxbNtDx/c cIVTwEmEXOEq
VJ1jqaVqGFf5V/kuXCAm2EYg20Ecc5UQbbEQRF+fsySYQsoiJX0J8CvRn/Vt fb5P4lPgV6M/
6tr7fJ/ErSXptyLOe0ld5OWuGNc8n+7QpH0d5QjDArZU0q+3Q4EuvNXLdINx XUJo7Abktxgb
hxmmwGQQk8igDYie5QFVQkVMpnw5Wo1x1fqa4P3OTMv77sm5207XJe4DAqsQ /lNCKAgii+MR
Rf05r6G+BXoz/q2vt8n8SnwK9Gf9Wy9vk/iVlH0w5Bjuuz092O559LXM0fIX Kb32/i+H0PnS
76nv92696wvTz3X8iM/c/iGR46x9vBHsBNojsH5OFXHaq9tX8DpFuMW0awlS n35+pNQzLa81
LOHFNpnlnByRASICbWxFBwBLuRF8PfV2z4FejT+rZe3yfxKfAr0af1bL2+T+ JWdt6W8g2sMD
u8kstyitzi6e9u9lKmiS4F7LkXlOznj2ye/e3xr1dbPnItR3pxm9NyLs9JW+ GB3M5ANurJIC
3Aq7hVBUVxt2om3CbcYTGxaP123a9dSde39bheL4IFyrTTbLbTjisE0nFLI7 AQdqd4BKuc/M
ue1/Ar0af1bL2+T+JT4FejT+rZe3yfxK0tfTHkW0s5WexmsSo6KKdMk1WvFJ LsS0RSz5B5Qh
NTdqnR1zbpXXvzPn2ya51hadOxrJE1G63GYgcjjlmHFVrGNu4wItqZXAquEz 2JUJy/XY7RbL
R1o+MG1yClQmQ2jwXl/7RCRN25Mrjt7Ny19H/Ar0af1bL2+T+JT4FejT+rZe 3yfxKvD005Dg
6xu8lnX3Y71x97fm8+tlZ+j/AClP3rZab3uf0Pn/AFBrjVN/trlsu18KRBdk JJNhIrACriIv
bkW0LKqqqq5yqr2qta7tY8VfUXwK9Gn9Wy9vk/iU+BXo0/q2Xt8n8StbD075 Iu8cNjYyit9E
or/cZWvozfrZ4rS1TfW35HzjYNQXSwBLC0TuXbmNcKS0bLbzTo/MhNuCQFjt xlFxlfGtS52t
NVTifOVqGQ45I5NHiRhgdwxHVeYBEEEQBFwlLAIOfnynZX0H8CvRp/Vsvb5P 4lPgV6NP6tl7
fJ/ErO19NeRLaeO0u8m9XGNf/wBdRpZ+j3KNlHDC2SXa/I+fJGs9TSZbUl++ OuON3dL1kmGe
+loCALi95nAiIogpgexMotUch0pUyTNmyDky5ch2TIeNBFXHHDUzLAogpkiX sRESvp/4FejT
+rZe3yfxKfAr0af1bL2+T+JVrH045GsHWysJR4ZKK0/1dRW19HL/AGqpO2T+ r8utnz7bta6n
tka2RrbeQjNWsXUg/wDV0R1yPxSUnNjjjRGO5V7cEngTxVk09rvVun4zUe06 hksi084+hOtt
PnvcXLi73RIk3F3xIipuLtXNd++BXo0/q2Xt8n8SnwK9Gn9Wy9vk/iVlL0x5 Cm5OV2brv9mO
fHpdb7zSPIPKcUkrfduzfkfPk/WmqZ1vbt8rUD6xgRhFFphhkzVk97Sk42Am uwlyKbsIvgSv
zVGsdSanYbjX29OzIzTiugzwGWxRxUwpqoAKkWPnJVr6E+BXo0/q2Xt8n8Sn wK9Gn9Wy9vk/
iVMPTPkOzkpRu8k1mvZjk/8A5ET5A5SmmpW6afW/I+aLhcplwg2q3y5puQbS 283Bj7AQWuMY
m4uUHcSqQp4VXGOzFT7Nqm+WaExCtd0cisMTkntiLYKoPoChvQiFVFVFVFcK mUVUXKKqL9Ef
Ar0af1bL2+T+JT4FejT+rZe3yfxK1l6c8jyg4SsJNN1phjSta197fXMzXo3f 1JSVqqpU3vdp
uODr0i6yKZbZRahPiWs3HISDDjgLKmm1cILaJjaqpt8GF8FUaXm6pao1qC5u NQo9zW6tssMM
sIMpQUEMeGA7EEVwIhtFOzs7K+lPgV6NP6tl7fJ/Ep8CvRp/Vsvb5P4lZQ9M +Q4e7d5L/wBs
da9LXP6vU0lyBylLfbLvfZofP911xqm7XW33G4356Q7bZKS4YcFlttp9FReI ogCIZ9nhPcva
qeBVzVnebq5brzAcurxtXyYEy6ZaazKdF4n0VcB3qcQlXAbfF4OyvpT4FejT +rZe3yfxKfAr
0af1bL2+T+JUw9NOQ4KkbvJL/tjqn0tUn2iXIHKUnV2673pTTRs+dLvqe/3b r3rC9PPdfyIz
9z+IZHjrH28EewE2iOwfk4Vcdqr21UbWPFX1F8CvRp/Vsvb5P4lPgV6NP6tl 7fJ/ErWw9O+S
LBUsrGUV1KK3Ki/doqdhna+jV+tnW0tU/q/I+XdrHiptY8VfUXwK9Gn9Wy9v k/iU+BXo0/q2
Xt8n8St/1E5O+XPuj/Yx5pXrprx8j5d2seKm1jxV9RfAr0af1bL2+T+JT4Fe jT+rZe3yfxKf
qJyd8ufdH+w5pXrprx8j5d2seKm1jxV9RfAr0af1bL2+T+JT4FejT+rZe3yf xKfqJyd8ufdH
+w5pXrprx8j5d2seKm1jxV9RfAr0af1bL2+T+JT4FejT+rZe3yfxKfqJyd8u fdH+w5pXrprx
8j5d2seKm1jxV9RfAr0af1bL2+T+JT4FejT+rZe3yfxKfqJyd8ufdH+w5pXr prx8j5d2seKm
1jxV9RfAr0af1bL2+T+JT4FejT+rZe3yfxKfqJyd8ufdH+w5pXrprx8j5d2s eKm1jxV9RfAr
0af1bL2+T+JT4FejT+rZe3yfxKfqJyd8ufdH+w5pXrprx8j5d2seKm1jxV9R fAr0af1bL2+T
+JT4FejT+rZe3yfxKfqJyd8ufdH+w5pXrprx8j5d2seKm1jxV9RfAr0af1bL 2+T+JT4FejT+
rZe3yfxKfqJyd8ufdH+w5pXrprx8j5d2seKm1jxV9RfAr0af1bL2+T+JT4Fe jT+rZe3yfxKf
qJyd8ufdH+w5pXrprx8j5d2seKm1jxV9RfAr0af1bL2+T+JT4FejT+rZe3yf xKfqJyd8ufdH
+w5pXrprx8j5d2seKm1jxV9RfAr0af1bL2+T+JT4FejT+rZe3yfxKfqJyd8u fdH+w5pXrprx
8j5d2seKm1jxV9RfAr0af1bL2+T+JT4FejT+rZe3yfxKfqJyd8ufdH+w5pXr prx8j5d2seKm
1jxV9RfAr0af1bL2+T+JT4FejT+rZe3yfxKfqJyd8ufdH+w5pXrprx8j5d2s eKm1jxV9RfAr
0af1bL2+T+JT4FejT+rZe3yfxKfqJyd8ufdH+w5pXrprx8j5c2s+Kvza1+iv qT4FejP+ra+3
yfxKfAp0Zf1aX2+T+JT9ROTvlz7o/wBieaV66a8fI+W9rX6KbWv0V9SfAp0Z f1aX2+T+JT4F
OjL+rS+3yfxKfqJyd8ufdH+w5p3r5i8fI+W9rX6KbWv0V9SfAp0Zf1aX2+T+ JT4FOjL+rS+3
yfxKfqJyd8ufdH+w5p3r5i8fI+W9rX6KbWv0V9SfAp0Zf1aX2+T+JT4FOjL+ rS+3yfxKfqJy
d8ufdH+w5p3r5i8fI+W9rX6KbWv0V9SfAp0Zf1aX2+T+JT4FOjL+rS+3yfxK fqJyd8ufdH+w
5p3r5i8fI+W9rX6KbWv0V9SfAp0Zf1aX2+T+JT4FOjL+rS+3yfxKfqJyd8uf dH+w5p3r5i8f
I+W9rX6KbWv0V9SfAp0Zf1aX2+T+JT4FOjL+rS+3yfxKfqJyd8ufdH+w5p3r 5i8fI+W9rX6K
bWv0V9SfAp0Zf1aX2+T+JT4FOjL+rS+3yfxKfqJyd8ufdH+w5p3r5i8fI+W9 rX6KbWv0V9Sf
Ap0Zf1aX2+T+JT4FOjL+rS+3yfxKfqJyd8ufdH+w5p3r5i8fI+W9rX6KbWv0 V9SfAp0Zf1aX
2+T+JT4FOjL+rS+3yfxKfqJyd8ufdH+w5p3r5i8fI+W9rX6KbWv0V9SfAp0Z f1aX2+T+JT4F
OjL+rS+3yfxKfqJyd8ufdH+w5p3r5i8fI+W9rX6KbWv0V9SfAp0Zf1aX2+T+ JT4FOjL+rS+3
yfxKfqJyd8ufdH+w5p3r5i8fI+W9rX6KbWv0V9SfAp0Zf1aX2+T+JT4FOjL+ rS+3yfxKfqJy
d8ufdH+w5p3r5i8fI+W9rX6KbWv0V9SfAp0Zf1aX2+T+JT4FOjL+rS+3yfxK fqJyd8ufdH+w
5p3r5i8fI+W9rX6KbWv0V9SfAp0Zf1aX2+T+JT4FOjL+rS+3yfxKfqJyd8uf dH+w5p3r5i8f
I+W9rX6KbWv0V9SfAp0Zf1aX2+T+JT4FOjL+rS+3yfxKfqJyd8ufdH+w5p3r 5i8fI+W9rX6K
bWv0V9SfAp0Zf1aX2+T+JT4FOjL+rS+3yfxKfqJyd8ufdH+w5p3r5i8fI+W9 rX6KbWv0V9Sf
Ap0Zf1aX2+T+JT4FOjL+rS+3yfxKfqJyd8ufdH+w5p3r5i8fI+W9rX6KbWv0 V9SfAp0Zf1aX
2+T+JT4FOjL+rS+3yfxKfqJyd8ufdH+w5p3r5i8fI+W9rX6KbWv0V9SfAp0Z f1aX2+T+JT4F
OjL+rS+3yfxKfqJyd8ufdH+w5p3r5i8fI+W9rX6KbWv0V9SfAp0Zf1aX2+T+ JT4FOjL+rS+3
yfxKfqJyd8ufdH+w5p3r5i8fI+W9rX6KbWv0V9SfAp0Zf1aX2+T+JT4FOjL+ rS+3yfxKfqJy
d8ufdH+w5p3r5i8fI+W9rX6KbWv0V9SfAp0Zf1aX2+T+JT4FOjL+rS+3yfxK fqJyd8ufdH+w
5p3r5i8fI+W9rX6KbWv0V9SfAp0Zf1aX2+T+JT4FOjL+rS+3yfxKfqJyd8uf dH+w5p3r5i8f
I+W9rX6KbWv0V9SfAp0Zf1aX2+T+JT4FOjL+rS+3yfxKfqJyd8ufdH+w5p3r 5i8fI+W9rX6K
bWv0V9SfAp0Zf1aX2+T+JT4FOjL+rS+3yfxKfqJyd8ufdH+w5p3r5i8fI4Na N8/ScK322TAC
ZBuEmQ41LmtRUNt5uOKKJOkIrhWVymc98mEXtxu1x1z0qXC3yYEu92ByPJaJ l0OubQm4CRUV
Mo5lOxV8FdD+BToy/q0vt8n8SnwKdGX9Wl9vk/iV4949LeS7eeKVnJ0barCL pV1dHj1PUseR
r5ZWeBTWmTar4HCrFbbhbNX2a+XWTZY8C23BiY+TV6iSHFFpxDURbadIyJdu E7MZVMqiZWs0
JyZLtunpNinQGpFrilGeF+5sQ3W3EkvPCYq6Ybkw6mFFVVFFc47M9v8AgU6M v6tL7fJ/Ep8C
nRl/Vpfb5P4lay9NOT5+1JTrl+2NMq8Mf+p8dPrSHIN5s2sLjTPi+NONOpHI LncNfXCE5DnX
6JKjuY3tPavhGBYXKZRZGF7URf8AZVBboUqzXKRd7xLtDUcLdNYAI12jSnHX HorrICgMuGqd
riKqrhERF7c4Re/fAp0Zf1aX2+T+JX58CnRl/Vpfb5P4lVs/TLk+EXZqMlF7 6Qiv9/2JnyFe
JSxtqq635HKrPep4TrZf9N3O0tGzb4rHx90ix3WXGowMGig+YqqLsVUVEVFQ k7c5RPyPP1HE
uoXeLdLK3PBxXUkLqW3qSmvhVVV/vs5XKLnOVznNdW+BLox/qz//AD0n8Svx ehLowX/9WP8A
+ek/iV8LfLl6P3m3na47ZYpOVEoZNuuWZ9zdPSHle7WMLHZ2UsMVGrUqtJUz PnzX0t2NpfVs
u93G2vzbxCRhoItxYlm46sth8zLgmSAKIyXhxlSTCL24V9AO9BvRa42TZ6Xy JJhU5+Smf/Up
X0XI3LPJHI11V2uytGqttyUa1fY+o8nlK0vvKl4d4vGFOiVI1pRdpc9Ltvm3 TRzcK3FMCQd5
tJI7EbQ3WRG4xyJ0UISHvBRTVSFRRBVVRURa1HX9k1Qxe9Nwgu2o9Rw+YZkS XX2G9oEF3tBD
uSO0233rYSTRSHcg8Vc7UXHVbzZrTera7bLxGt9xgvY4saWxxWjwqEm4SFUX CoiplPCiLUTT
mktLab4/c7ZbHZuZ28fkIIx+Ltzt3bATdjcWM+DK+Ovi1kdBzXoQj6xbvJO6 ku93kyCt3/XE
aRbJbLDc5Sb+Q7IfNs8Lx0Tk2xZVO1cJwUXrlZeEH1hr0F7qcIPrDXoL3VDz BymyPvWvpc1O
sydq6MzNvLBR4UewuPW6UJW+I0jpyBjEo4MSRV4wCPD75ETdnS4sXUB6g0vN aja0LUbUOO1q
R6QE9WAkHdLSsgWSc+IRshCUpJH+LVsV/oIldnvPR9oO9XJ253jSmmLjOexx ZMu1tuunhEFN
xECquERETK+BEStj4QfWGvQXuq1QaB0E2wbL0Z2mzmxd2J0COzGuDVwKSWyU DLYuiyryqiso
qYFWVVnw7Pnreqy8IPrDXoL3U4QfWGvQXuqrVQcSBy8xrUVn0Y9q5/TEWOw3 IanWh6E/booS
owqxDUmGn3cw1mJlFdeRWmtpC4Q75mnbjdrLqRu7SG9XO6MHno1vB6HOlyu/ C3k2rrJCcpfj
W7htN4e9RcIqAbaFv1m6PtB2W5NXOz6U0xbpzOeFJiWttp0MoortIQRUyiqi 4XwKqVsfCD6w
16C91WBwbRMHXK9H0+53eZq4p6dTMORn3XkcCGsS2lcTaHCOE8qJJTIqTgmJ o1tcI97VsfUL
8+D3L3fV1utA24epuNbLrLlHO47/ABeLvfa24/k23n9zKove4BHM954QfWGv QXupwg+sNegv
dSrBirS+k6DfJtz0YWnzZZlR76bpyX4RymY4dXzAUnAAwXCqaAi7xTcY+HwL vPCD6w16C91O
EH1hr0F7qqlQHBr5b9Ux7HZbc5Ju9oYakXJ6+nDttwkidyefCQKspAdafKMX GlEBbyBB2g6n
GREGysNo1FbrPrW9zY19k36W5EjOmbr7KG2Vut7ciWMaM7sJxskeL+TlxCVp Wm3M4Wuz8IPr
DXoL3U4QfWGvQXuq1WDgOmnb6QrH1TJ1pK0nGmS22H4MC8RJTjiswTYVRQzn K2hHcE3OGTe5
ERVTDIjYxrZJtMWbFeY1cyyeqZsnUIwyuBZhPOznYpRVZVV7TOKriRO+TKo9 hN6V23hB9Ya9
Be6qi2aS0ta7zKvVsstjhXSXv5mbHgi2+9vJCLe4IIRZJEJcr2qmaVBoHRjB 1NI1fImXyZqM
LZEtza2yPJdcBp0Cm3EWSdQk3m8MRY24XF3ZICdFXBAh6jWXhB9Ya9Be6nCD 6w16C91VeYOU
6xtdzjdJl21rbrdMekWezWxxngsESzmReuHNxAwmXDVowMWkVEV4Yyl2IlaX Yu7O3wuj9lqN
fbVKgQ7FBWGNtuL4SY5JHGU46QOJEjqKOSGyF9onBRnehDubUe26g0Ro3UU0 JuoNOadu8oG0
aB6dbgfMQRVVBQjBVRMkq48GVXx1Y2azWmy21q2WeNb7dBZzwo0RjhNBlVJd oiKImVVVXCeF
VWrVByo4OuWmW47sy7mGn7jbLVGcZdeVy5MlcYrjsp9cfHYiCyBuJhENZ6Km xUrXIFwvkafB
hoOrn9RSNLS+6JiY5ckYGXx4Db0iMG4Qc4KOyTEYSpuTANkO9ta+hOEH1hr0 F7qrrTpzT9om
zptqttpgSrg5xZr0aIjRyTyS7nCEUU1yRLlcrkl8a0qDiWhYN4f1habhqI9U zLTbJk2DbJgw
rpENSeG2OtI626ZySYVwJaEUgjayGFUR4Ype9CEfWLd5J3Ul3u8mQVu/64jS LZLZYbnKTfyH
ZD5tnheOicm2LKp2rhOCi9h4QfWGvQXupwg+sNegvdRtgxVzq9uPW7Xp9yz2 o0uM24xHLjAK
0OLbJIqjLbz5SjY2iYRQRUQHxFTZEdpEpCfSuEH1hr0F7qcIPrDXoL3VVIHA dHj0gRbRc37l
NvtxuDtqRq8xittwZCNKNxoXHmnDkrxlaFZJiFuFsHEHAqCrHqX0ZRdW3DWE OLcrrqkrBb3J
5suHEnQAlII2txkHUlkchUR05apvcVSQHAReFubrs95s1pvVtdtl4jW+4wXs cWNLY4rR4VCT
cJCqLhURUynhRFqJpzSWltN8fudstjs3M7ePyEEY/F2527tgJuxuLGfBlfHV qg5HbLI7fmNG
xbs1rRb03dWndTuuyLlHBmQltnI4Ud3cLbbavltzFJG1QgHtEgRemdHPWY6Y Vi685xo9xnxm
Vl7ldWM3MebjqRF3x5ZFtUMlVTTBKpKSquz8IPrDXoL3U4QfWGvQXuqHVg1L peiyZ3RPrCFC
jPSZUixTWmWWQUzcMmDQREU7VVVVERE7VWtWv2ktTO6nsk+fqGY5JudxahXR 6wxnILQwGIdw
MANFcdIdzr+1XN6YVWtmxwUNeoTYEKdCfhTUiyYshsmnmXm1MHAJMEJCo4VF RVRUXsVKqNP6
I0bp2ac3T+nNO2iUbatG9BtwMGQKqKoqQAiqmRRceDKJ4qLJA0C3Rr1M1gES UWqRuD91uLd6
JXpjUJLSQyUiqwaKkcXMLB76OqPou9SVF41aj0eFrq5SNJ3Kbf76pPQ7O7EE bfMkhJiLEjFJ
J19JAwxUjWXuV8DfRO0NyqwlfQk2BCnQn4U1IsmLIbJp5l5tTBwCTBCQqOFR UVUVF7FSs3CD
6w16C91TUHBhtiz7DpqVfWNdOXO3XFiTqwgK6obb6wZbRlERte0OYdRFSFkN pIq/Foip3Ssv
CD6w16C91OEH1hr0F7qh5g0bpOg3ybc9GFp82WZUe+m6cl+EcpmOHV8wFJwA MFwqmgIu8U3G
Ph8C65p1+66WlWaReIV9GMy3dm703BgSJTRXKVKjyhNptkSI2F3SVbcwuwV2 OELikNdL1Bpz
T+ooQQtQW203eKDiOgzOiI+AmiKiEgmKoi4JUz4cKvjrDpzSWltN8fudstjs 3M7ePyEEY/F2
527tgJuxuLGfBlfHTgDjugbdrENLxtQXFzVy39m42CMLcqZLUFjHGtoTFKMR cMsK5MUzIFUS
QyyhBlO6Vl4QfWGvQXupwg+sNegvdR5g0Dpbt+oFYt980iXCvkfj28HkbV1Q blt8MVUNpJsC
SkN4yVMi2w4qZTIHqMTTuprapA21MFnT1xttlsqRhcEggHdWXntqoiK6zyXJ MmZKXfRZCKuN
5udW1HpLS2pOB3RWWx3nlt3A5+CMjhbsbtu8F252jnHhwniqHZuj7QdluTVz s+lNMW6cznhS
YlrbadDKKK7SEEVMoqouF8CqlStwOU2+3axtWkdK8s5q5w7lp5iTqbmJkuS+ DgyLfx0DiERs
PcB2fgGdhkqd6imAbcVkihHvV2dejdIDWi5N1kOiYBdxnuyEhW0GSJR/lpN9 5OHJfF5FEXtR
uu/cIPrDXoL3U4QfWGvQXupVg4lbPhUt7aT7zzkuRbI8O+TmG95rLNYbEd+E yLfxZmis3F3h
DgeM5CJFwRonUdEwbna9GWS2XqZzt0iW6OxNk8UnOM8DYi4e4kQiySKuVTK5 ytXnCD6w16C9
1OEH1hr0F7qh5g0zpdt826aObhW4pgSDvNpJHYjaG6yI3GOROihCQ94KKaqQ qKIKqqKiLXOd
bWDWdu1Xcijah1HNgSI9qGfdHLebrqMAt0VWmwtyR3T2vFFVUaXeiO5NVb3J XbbzZrTera7b
LxGt9xgvY4saWxxWjwqEm4SFUXCoiplPCiLVdp/RGjdOzTm6f05p20SjbVo3 oNuBgyBVRVFS
AEVUyKLjwZRPFUrJA4ZKbu1v1JYXNTS9XOW+byMV6VCizosqW0AX5xtpAjuH JXaKxSUTMncb
CewSkidp6N+s+5FjrXnN/MSuV5zdx+T5hzleJv7/AH8DhZ4nxmc7+/3VsMiB CkOx3X0iuuRn
FdjmbakrRqBApCqj3q7TMcp24JU8CrWbhB9Ya9Be6oeYMVKy8IPrDXoL3U4Q fWGvQXuqtCTF
SsvCD6w16C91OEH1hr0F7qUBipWXhB9Ya9Be6nCD6w16C91KAxUrLwg+sNeg vdThB9Ya9Be6
lAYqVl4QfWGvQXupwg+sNegvdSgMVKy8IPrDXoL3U4QfWGvQXupQGKlZeEH1 hr0F7qcIPrDX
oL3UoDFSsvCD6w16C91OEH1hr0F7qUBipWXhB9Ya9Be6nCD6w16C91KAxUrL wg+sNegvdThB
9Ya9Be6lAYqVl4QfWGvQXupwg+sNegvdSgMVKy8IPrDXoL3U4QfWGvQXupQG KlZeEH1hr0F7
qcIPrDXoL3UoDFSsvCD6w16C91OEH1hr0F7qUBipWXhB9Ya9Be6nCD6w16C9 1KAxUrLwg+sN
egvdThB9Ya9Be6lAYqVl4QfWGvQXupwg+sNegvdSgMVKy8IPrDXoL3U4QfWG vQXupQGKlZeE
H1hr0F7qcIPrDXoL3UoDFSsvCD6w16C91OEH1hr0F7qUBipWXhB9Ya9Be6nC D6w16C91KAxU
rLwg+sNegvdThB9Ya9Be6lAYqVl4QfWGvQXupwg+sNegvdSgMVKy8IPrDXoL 3U4QfWGvQXup
QGKlZeEH1hr0F7qcIPrDXoL3UoDFSsvCD6w16C91OEH1hr0F7qUBipWXhB9Y a9Be6nCD6w16
C91KAxUrLwg+sNegvdThB9Ya9Be6lAYqVl4QfWGvQXupwg+sNegvdSgMVKy8 IPrDXoL3U4Qf
WGvQXupQGKlZeEH1hr0F7qcIPrDXoL3UoDFSsvCD6w16C91OEH1hr0F7qUBi pWXhB9Ya9Be6
nCD6w16C91KAxUrLwg+sNegvdThB9Ya9Be6lAYqVl4QfWGvQXupwg+sNegvd SgMVKy8IPrDX
oL3U4QfWGvQXupQGKlZeEH1hr0F7qcIPrDXoL3UoDFSsvCD6w16C91OEH1hr 0F7qUBipWXhB
9Ya9Be6nCD6w16C91KAxUrLwg+sNegvdThB9Ya9Be6lAYqVl4QfWGvQXupwg +sNegvdSgMVK
y8IPrDXoL3U4QfWGvQXupQGKlZeEH1hr0F7qcIPrDXoL3UoDFSsvCD6w16C9 1OEH1hr0F7qU
BipWXhB9Ya9Be6nCD6w16C91KAxUrLwg+sNegvdThB9Ya9Be6lAYqVl4QfWG vQXupwg+sNeg
vdSgMVKy8IPrDXoL3U4QfWGvQXupQGKlZeEH1hr0F7qcIPrDXoL3UoDFSsvC D6w16C91OEH1
hr0F7qUBipWXhB9Ya9Be6nCD6w16C91KAxUrLwg+sNegvdThB9Ya9Be6lAYq Vl4QfWGvQXup
wg+sNegvdSgMVKy8IPrDXoL3U4QfWGvQXupQGKlZeEH1hr0F7qcIPrDXoL3U oDFSsvCD6w16
C91OEH1hr0F7qUBipWXhB9Ya9Be6nCD6w16C91KAxUrLwg+sNegvdThB9Ya9 Be6lAYqVl4Qf
WGvQXupwg+sNegvdSgMVKy8IPrDXoL3U4QfWGvQXupQGKlZeEH1hr0F7qcIP rDXoL3UoDFSs
vCD6w16C91KUBFmOPNRjcjx1kuoneNIYhuXxZLCJ/trOabTUcouFxlPAtQ7u 1x7a81yhzNw4
4AvcJXO3wb8pt/XlKmvflT+T8pfk+D/Z+ip4AprxqS0WiYESe8+DxghiLcV1 1MKqonaAqnhR
eyvZ3lkwBYUaVLcIFdVsGDRRBEJcrkexV2EgouNxYTxqnhuzWi76smJc7XCm k1BjqCyGBcUc
uPeBVTs8FW1x0vYpUVmMdrjojakLaNDw1EDFQcRFHCoiiSov6cL4USrXiMfV MdlXH17t9Msu
7eZWcp7fDOmHxMcZ9qSyLzJbgXKeBUVFRcKiovaioqKiovaioqLWSoOnTBzT 9ucbAQAojRCI
phBRQTCIlazoHQJaUv8AeboertU3tuc5/I4l0uj0hqAz2KrYIZLuXci9+WSQ do+HeR5Wbbim
95tJUdEbi+ZNgigKERGIIilhMkSJ2rhfHXuOzPfbUwbiYQyDtfLwiSiv9Dxp WCcu1kC8TzS/
+oNRHpkqMb4x5I8IDIiRRbRRUl3KnfGKr8r5k+fHhrpsoKSqzOTaZMbce4wg 620iFxERQcUu
0CQV8Ip861mqFFMSdiKLvFQmnXN+3G7eYFnHzeGs0rZxowuqaNk6qEgmo5TY S+FFRfCiVScP
bwolPKp+7pqQmZnJo606KFtYNTcRFTKdm1P31kaMXGxcBciSIQr40WoaMd+w 4ox1JnZj5Hbt
RMdqtqqeDx9nzVkhgDT6stkqoLDW5N6km7JIqpnwJ2J2JV7SySVURGVSVWOK TzkcHJDHLuFl
VbUxNRTcqJlR7O1ERcfNmslR7Y1wbcy3yixMb14SvcUkyZLlSyvauc4z2ZRO zGKxW4uY7vdb
XZ4wybtcodvYI0AXZT4tCpKiqgopKiZwirj9C1Raa1zZb6kQYbwOvS5smM22 y4hqgMqao8Xg
VGyEQXOFRFdBPnzVxqNoztTrg3UbYLCK648422bKiIrkXUNPyfzlhQLCdhD4 a4lFudnj6PZt
ur4DVvvwQxR/mQVt4IxhtbFni9qtiCK2TeFQlFxCQlVd8pLC2/A5be3dk0+B 36lan0WNXGNp
aMxcbI5ajVlt0W+cN4ERRRNiA5gmNu1PiUTYCEKCqruRI920CU/pKg6vTV2q Y0WO38fZWLo8
EKQ8O3huECFhEREXcCJtNdqr/TRyHGjaZ0RliSZula3dtUON3l2y2W1uXW4s hvdDicNsO93b
d2CVS24XCCvhRM5VEXZK5DoN2VZOnS+vXqS1HgtpKkKZl2C2S7xVV/uqn7vm rKdcknSvE5r1
bSs8KTpV0qblpnWrN0uDdtmwlgy3d3BUHeK04qJlRQsCqFhFXCinYi4Va2yu HzL4Or+lyBK0
/bW4kQpjR703I5IQHBNx0k8A96BJhE7c9qqq9nX9TWhu/WCZaHZ1xgDKb2JK t8o48hlfChtu
CuUVFRF+dF8CoqKqLWxlKS9p9xW527tlKrrR7yxqp1NfY9kZjobavyZTqNR2 RJBUy8aqvgRO
zK9vhTx1D6ONMPaR0pGs8rUF31BMHv5Nwucpx519xUTKpvIuGHZgQRcInhVS UiWo6VtOTbw7
ZLrB4zh2mVxXGGl75xtSBSwnzqmxOz58rWk60dDa8SnCzbhvLKDqtwdQ9RXq 2pbZhFtDa/xB
IvmTKiK9vzLhUXx1s9cW1NqG73zpFt1xvDJ2qPFkhyUJ9o2yUE3OIR94prnh KnYhYXOEwhkP
TtIalg6jiPORlEX47htvNIqrtw4YISKqJlC2KqdiKngVEVFRM7Odapuptd7C 8ysXbzi8Fcm1
T8XWXdK0u7aBKf0lQdXpq7VMaLHb+PsrF0eCFIeHbw3CBCwiIiLuBE2mu1V/ po5ulbEmMye5
hlttje2W5XHN4ojaIKqnYvauVwmE8dZKjvNb7jDc5RXeHxF4qvbRZyCplRym 9V8CJhcZz82a
iasfOLpa7SW3CbNqC8YmK4UVQFVFRfmWom8McRMVikka/rTpEtGnJ7MDcxJk OIqkiyNohgtu
3KIS7s57MfNVrZNW2a6lHZB42JLyYRp1skTfhcgh42ESYXKIqr2L2di1rerb JadSzYTsS3Dv
taIwD4y+ACCK9jQJw3EVBVPmQdqqqIudyJq2l9A3aLq21tv3MXmIrwSXRZfM 1bAFUg37hEe+
IUHxr3yomEXHP/krraWdnCz9979/gRerC9WbTs4VXHNeZ2uscl9qMwb75oDY JkiWv150GWlc
cLAp+jKqvgRET51VexETw1o2syvFvFi4XlHIZGXEiq1IVWWVHKoKp2CpomVX cioXbjKIqDrK
TbwQaxU4/f8AMy8Ip5y3GwQb8cmc0yURttl6Qcds+MqnvAFJUUVFEz3pIu0i woqi4VFRLyqb
TbEuTDi3a7ggz3mBJWtqijCkKKooi9qF489qeD9dzWd2do4VtN5a2UFKkDG0 TxPPCbGxoNqN
uKYrxFVFzgU7UxhO1fDnsrJUeM1tmzXeUVvfwk4xPbuLhC7EHPeoOe1cJnPz 4qRXSzIVCi3F
qTPOMyKkACq8XPYqoqZRPH4fDXm5PcSO80DiNt7VFx1Uz2/RRPn/AE+jw+Cs 0s1KWUcg2tsb
hqDa5+fKZx40/T6e2pSVMyKmxVjjk8YuE8xwUR1QbyYkpiiJ3+E8CKqqmF7e yslR4DXDCQvK
LH3yTPJPb1d7BTf4V2p2YQezwKuO2oW4kyyXODGde27tgKWM4zhM15MzYmHE PfIMWxc3MxzV
EQlJERUTd9Ffn/dWK7NI7CMVU/7gko8Tsxt7O3tzj9ePD4K/LdFlPXDrF4JE XaCtcNSVONhC
TBCmR2juLHYu5e1OzG68IqSKt0JLTgubkRDFQXaSGCiqLhF8CpnwKleq8D+d y+zHxgfN/ZB+
qscmNxnAPjPNoK98gGqISeKqyVHQlbjPUJ5y5FNaaitMm0cjgkRKKK33olnC mil2KS4RM4Fa
m1VzJIRUnuyobTxgxvExNULYikqCi4yCooouUVVz2/MmJs6VzDJ74SWWkdWQ yabgTajSJlFN
B7FRxfH4vmrLUVybxLc21JmxXpKm2hIy8hIWHRx4u3aiZwKJnPg8FSiRCFRX OFTHYuKtaxSp
QiLFVOpNQ2vT7TDtzeJoX3BbAtuB7TEVVSXAptQt6oq52gZIioK4sIjCsCSK 866qrnJlnCfM
lVOstORNRW8GZDIPOMmLjQOkXDLBiRCSJlE3CKgpYVUEzROwlRc04p1luJab WW8mQbvGmyWW
o7UlQeZN1t02lAV2KCGOCwSEKmKKip2LlF74SRLCtXeudvebt9p7mzujsdkw CM8DTjkZG0bE
kMnj8Pft9qKW5MFlUVFWfp1h4Jct9LSNoiG22DcVEbHvxU1Nza2RD2oQJnOV 2dqYRM+Zd77K
1tMKi6a0pT87TqtLBQjVvPQuahQLkzMlOsNNuoINA6DpIiA6BqaIQduVTIF2 qiZTCplFRV83
xh9+KCNNpIbBxDfiqqJzLeFy3lexO1UXC9hbdpKgkq1Wz7raLxcMJpfrx5uO BE6sdhVbFTcF
AXjEJIqEB5HHYuc4WtLxepWU1FL/AJ7q7vzLfFlZKcW/xGw0qr07HdYalksJ IDDsjfHid4nA
DYAqmAVRTJiZYFV+Vle1VStfu2gSn9JUHV6au1TGix2/j7KxdHghSHh28Nwg QsIiIi7gRNpr
tVf6aOddlJzipNUMZxwuidTdKUqIKI3uF60tSi3kvFIG1VUVVVEyS57Ewn+y tIpPeyjM8d5H
mxNBIFIUNBJO3aqZRf1L708KLWSozcxJ7McWI4si0gqioiJwxwneYTs7UwmP AnYvzJWd0Ecb
IFIhynhFcKn+2pkknkEeqVjitKyygK4bhfORrlVWslVJFKUoBSlKAUpSgFKU oBSlKAUpSgFK
UoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAU pSgFKUoBSlKA
UpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUo BSlKAUpSgFKU
oBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUp SgFKUoBSlKA/
JMBJ0Q2Ho7rrDiYJBUhyniyOFT/YtZzZkEaly7iZXOEBcJWGqmfqbTdvmHCn 6htMSU3jey9M
bAxyiKmRVcplFRf9tWjFyySqVbS3ssltK9YpcBamNydiNqTbrgIQoqqiEKKi FhSLwovhpOtb
kx1HHSugFjGWJb7Of17CTP8AtqGl7tiygjhMaNTUB3iaKCGaKoCq58JIJKn6 v0jmwrJOEnlv
XgXzS7RDt5Q4jMSPFdBlhsW2xwS4EUwiZXtXsSsvLyPIO+otapqDXNjssh+P Ibu0h2PJYivJ
Etch4QcdVvaimIbM4dBdqKpLlERFJUFcp6kMJbeYH8icnLBF1HC4nEQ+Hnbs 27d//wBPOO3G
e9qt6trO6KLtvZxOi6/DrJsoStm1DOm82KTBefZVsmnx7UXIj2oqKip4U/RU MrG4SGiuTsOE
hl2J2qmMf0f0JUulbqbW4pQxQ7S5GIFFJRo23wwQhTCJ2eJE8SV+3G1LPj8B 9h7buQkVBXKK
lZKUxZ1FCs7lI/kZPqD92plssyW8XEYYf+MVFJSHxfqTFZ6VLtG1RilDLy8j yDvqLWOLAWLH
CPHiug2GcIu4lVVJSVVUsqvaq1hmyo0GE/NmyWY0WO2TrzzxoANgKZIiJexE REVVVexErLVa
oGXl5HkHfUWq9iwNN3uTeSjPOzXwba4hh+TbBC2gOE7EybhZXKqpqmcIKJLp SqFDLy8jyDvq
LTl5HkHfUWsVKjIky8vI8g76i1U3/SdrvyAt1tKvmHYDqIbbgp4kMVQkT9Gc VY1DvM9q2W5y
a6mRBRFEUsJkiQUyvzJlUyv76paThCDnPcs2Q7JWvsNVrwMVg0na7ChrarSr Bn2G6qG44SeJ
TJVJU/RnFW3LyPIO+otaw/qJ+FNhM3GJDbCWbbYKxMVw0I1RB71Wx7MqmVz2 VsVYXS+3e9xc
rB1Sy/KovK7SsElhouBl5eR5B31Fpy8jyDvqLWKldWRU1TXXRlZ9Y3Fmfdmp yPNM8BOEIYUN
ylhUIC+df3eJKlaD0BbdGNywtDU0ubUFcV1B/oIqCibRFPAq/wCXirYaVXBD FipmdLvlu7LY
uXs6GXl5HkHfUWnLyPIO+otYqVbI5j9OApyGZDkV0nGd3DXvkQVIVFVwnYvY q+HOKSIJSI7k
eRDV5l0FBxtxrcJiqYVFRUwqKnzV+UqcmCka0Pa2mgaaj3dtsBQQAblLRBRP AiJxOxKtrXZw
tsZY8OI+IKSmRGpuGZL85ESqRLhETtVexETwIlZaVlCwsoOsYpPqoXla2k1S UmzKkd/KLwHM
iqEneL4UXKViuluW6OxXJ8Q5BRHkfY3AuAcRFRCx4FVMrjPgXt8KJSlXcYve iibRl5eR5B31
Fpy8jyDvqLUWFKjToTE2FJZkxZDYusvMmhg4BJkSEk7FRUVFRU7FSstWyIP1 qArbzz4RXUdf
28Ql3LlBRcIiL2J4V8Cdvz1+uw3nR2kzIRM573cK+lK80pUGA7I0Y7TiyCHK rhTNUyv+2pYx
XhFBGO4IomERAXCJUa029i7ybis1yVsjSEZbBmSbKY4TZqq7FRVXJr4fFUSa ukIVxu8KXKuL
RWi3hcZh9ZSCQGS4vaiC4pKqI0qqmPAQ4zmt1Y1VWzPGy15eR5B31FrHHgLH FxGYroq66rri
ruJSJURPnzhMInYmEqV3L2nx3H9pyfxKdy9p8dx/acn8Sp2K1JxS0Iz8N91v bw3wVCEkIQ7U
VFRU8KeNKhW+xFb2FYhjIaaUlNRRkF7VREz2j+hKtu5e0+O4/tOT+JTuXtPj uP7Tk/iVKs6b
mRib4EViFIa3qoPuEZblUgx8yJ8yIngRKycvI8g76i1m7l7T47j+05P4lQb9 ZYVssc65Q3Jw
PxY7j4b5zzgqoipYUTJUVFxjwVGxUnvGNpbiRy8jyDvqLUaVazkHvNqQmR2k gj2EniXs/Svg
x4ayVijyY8nicu+09wnFbc4ZoWw08IrjwKnirBao0JXLyPIO+otOXkeQd9Ra xVikSo0d2O0/
JZackuK1HAzQVdNAI1EUX5S7QMsJ24FV8CLUZAlcvI8g76i05eR5B31FrFSo yJPzq0ed53kE
5rh8LjcH4zZnO3djOM9uPBms3LyPIO+otYqUSSFWZeXkeQd9RawtW0WpL0lq Ajb7+3jOizgn
NqYHcuMrhOxM+Cv2lKJirMvLyPIO+otOXkeQd9RaihKjHNdhBJZKU02DrjKG imAGpIBKPhRC
UDRF8CqJY8C1lqciDLy8jyDvqLTl5HkHfUWsVKjIk9txHGwQG4pgKeARbwiV 65eR5B31FrFS
pyIMvLyPIO+otOXkeQd9Rarb5cm7TbimusuvojjbQttKKEROOCAoikqCnaSd qqiVTaU1e1fZ
fKLbJMN0hkGCk604BCy9wl7QJVQsqmUVMZzhSREVaucU6PeXUJOOJbja+Xke Qd9RacvI8g76
i1rtg1D1rqG/Wjk+D1S603xeJu4u8N2cYTbjweFava0nBwdJL8eZnGSkqoy8 vI8g76i05eR5
B31FrFSqZFjLy8jyDvqLTl5HkHfUWsVQXpcpbkcOM1C7xtolKTKVrcThGgiK IBZXvF9NG1uF
Cz5eR5B31Fpy8jyDvqLVXZbozc2CIR4T7eEeZVcqC/8A1ouFwvz/AKFRUSfU QnGaUo7iXFxd
GZeXkeQd9RacvI8g76i1ipU5EGXl5HkHfUWnLyPIO+otYqUyBl5eR5B31Fpy 8jyDvqLWKlMg
ZeXkeQd9RacvI8g76i1ipTIGXl5HkHfUWnLyPIO+otYqUyBl5eR5B31Fpy8j yDvqLWKlMgZe
XkeQd9RacvI8g76i1ipTIGXl5HkHfUWnLyPIO+otYqUyBl5eR5B31Fpy8jyD vqLWKlMgZeXk
eQd9RacvI8g76i1ipTIGXl5HkHfUWnLyPIO+otYqUyBl5eR5B31Fpy8jyDvq LWKlMgZeXkeQ
d9RacvI8g76i1ipTIGXl5HkHfUWnLyPIO+otYqUyBl5eR5B31Fpy8jyDvqLW KlMgZeXkeQd9
RacvI8g76i1ipTIGXl5HkHfUWnLyPIO+otYqUyBl5eR5B31Fpy8jyDvqLWKl MgZeXkeQd9Ra
cvI8g76i1ipTIGXl5HkHfUWnLyPIO+otYqUyBl5eR5B31Fpy8jyDvqLWKlMg ZeXkeQd9Racv
I8g76i1ipTIGXl5HkHfUWnLyPIO+otYqUyBl5eR5B31Fpy8jyDvqLWKlMgZe XkeQd9RacvI8
g76i1ipTIGXl5HkHfUWnLyPIO+otYqUyBl5eR5B31Fpy8jyDvqLWKlMgZeXk eQd9RacvI8g7
6i1ipTIGXl5HkHfUWnLyPIO+otYqUyBl5eR5B31Fpy8jyDvqLWKlMgZeXkeQ d9RacvI8g76i
1ipTIGXl5HkHfUWnLyPIO+otYqUyBl5eR5B31Fpy8jyDvqLWKlMgZeXkeQd9 RacvI8g76i1i
pTIGXl5HkHfUWnLyPIO+otYqUyBl5eR5B31Fpy8jyDvqLWKlMgZeXkeQd9Ra cvI8g76i1ipT
IGXl5HkHfUWnLyPIO+otYqUyBl5eR5B31Fpy8jyDvqLWKlMgZeXkeQd9Racv I8g76i1ipTIG
Xl5HkHfUWnLyPIO+otYqUyBl5eR5B31Fpy8jyDvqLWKlMgZeXkeQd9RacvI8 g76i1ipTIGXl
5HkHfUWnLyPIO+otYqUyBl5eR5B31Fpy8jyDvqLWKlMgZeXkeQd9RacvI8g7 6i1ipTIGXl5H
kHfUWnLyPIO+otYqUyBl5eR5B31Fpy8jyDvqLWKlMgZeXkeQd9RacvI8g76i 1ipTIGXl5HkH
fUWnLyPIO+otYqUyBl5eR5B31Fpy8jyDvqLWKlMgZCZeAVImjFE+dRVKVjpQ CtAulos0q+Xu
W8xeHJ63WI0PKSZLQEJNxhUVUCFoVVFVO+VF7U/RW/1Ry9POuy5j8e/3WEEu S1KcZZGOocVt
G0Ek3tESfkgXGcdn6a1sbWVlKsW12GdrZxtFRqpDuFuKPd7WwkW8Q7dNkq2/ GkShNpwkZeP+
i6S4LBKYqmDVEVfAqHtFVPVEx2dClXDUd1uCQ3VeaZebjCG9WzbyvDaEl71w uzNW1YYIRnKU
VvzNE3hSfA4bpjXd1tzV51CzoO8Al0LrB4ZUy4Ogio0iIjarEUBRUHw5x4E3 IAig9HcsV4N9
qDugpbm7otw5jinxly9xtnD27fD3md/g77H9Gso6TfGwdQpqu+dXctynB2RP yW3bt3cDd4Oz
Oc/prZq05TsbtfXBuPuuu971u4lLpK1sE6utepHOulbS+mb1rHQki8adtFxe evLkV1yXCbdI
2Ut05xGiUkVVBDRDQV7NyIvhrXLZrjVzWvboU6bDlx4ci4o9pyI8j9xSKwj3 AcbiDGRxs3Ub
YJHHZBNnxk2oiutCPaKVFS1DgGl9Z6qvmp4ek2tfQ5LL1xjb7rZZ8K5OiDkO 5uEyrnJtsjgo
TJbeCpIhF36oSIO9dDmpb3fdvW83m+d09ar8OWgDl3JvMb2G9iJlkOAOzfuP vi3GfZjotKNp
8BQ4XpJuJBnzmujqXpHVV0btxSuuLTFY557gvsFyk+VxDFx6aO9FeLh4Jtxx ALHeXtvump9V
6msyxtV3Gy2e+Q7ldYAwY8Qj5Vo4LUZVJ5k+xwXXJGFETFX0AvyddMvdshXq zTrPc2OPBnx3
I0lrco72zFRIciqKmUVUyiotS6nEKHz1edaTNU9FupZWoNUM2i4StIuPwtPs 8u0Fxadswvm+
IuiUg0F1x8UJtxBRI+FRVE1LabzctYW7pAt2hYmsZjwSpERxy4zIUY5KNvRr qTjYo22DaYWC
0QEoKqGqqXED4uuuUpi6hQ4XrLXmo7dAv8u36mzfI/XQP2LhRy6qixmJhRZv D2cYd6sRF3uk
TZcz2Dg29szWF9uGmtYxbJetUzJNuhbLi5d5UGKcyIDluvPEVtG2EBNiQwIV RtSXc4KqYlsr
tFKYloKHz0eqL2+/ZX7drxm6OXFxxhucwNtlyrc07crKwrBPMtKyrnDfcMhQ VFCcFMuo2Di7
HN1RdIOopemr/rx6xWe3TJDC6jfGEy886kaA+yw4brXLopJLkqgi2JKMcVRe 9cUuxVXagssO
+wgiTXri02DiOIUG4yIZ5RFTCmwYEqdq96q4zhcZRMMSFCu6L7nNvXRnpa8X N/jzp9miSZLu
1B3uGyBEWBRETKqq4RESsXSnJKFoWfMBBUo5MuiheBVF4F7fRWxQosaDCYhQ ozMaLHbFpllk
EAGwFMCIinYiIiIiInYiVgvttj3izTLVL3IxLYNk1HG4UJMZTKKmU8KLhe1E rG2s1awlB7mm
u8vZywSUtDQ9W3N8Y3WU+4pyUCY4LMlm1Jsfdhg+86IosrdgViOAu5ByuNqq K7k2GwXu4ytQ
u22YTKi2Utok5TgOIbBsJuxxnF2GLyEO5BVR2ljaQqvldHKsuTLXUVwWRLNl yS7yFv3vGyqK
0Rry2SUFRFFV+ThMYrPYNJxrReHLoFwkyHnEeUxKPGaEjeJsnHC4LQKRkrQZ IlXwVtC6XG7w
au8cLefHzM9rbzaU3VI1C0dw3dQfd/3Od2/XL/V/W/B5vg8yfI8rxO3ZwuFj g9nE4mfjeLWu
QLMy5arhbNSXSHYbTou3Jp+NNlutowYlKbcFuYhEgug5Fj2tTEVbE0lvt5RV 2td0pUYiaHFz
K2f/AJvPSOxZ4GnGoLFuuINTtPwhjQLlmCJK+0Akad6pKySoZ98wXanyBwuu XfRVv1Slqsdi
0jPcbgDFtcB7+QJH5hAlXQHeAICoBIQXSJkuEkZo3ENsm0Xt1KnEKHBrfrW6 HNs0TUvStbrL
an27kbV3gzITgTVaWDwwWTIiAy6oq/JT4hsUwCCqqbblWNo1xqiXLtrt3unV WonZFpab0rwG
2+bjyGohS5HCcFZK8InpnfAaAHK9+i7HN3XXbZCdvMa8OMZnRY70Zl3cvetu k2Tg4zhcqy2u
VTKbezGVzLpiWgofNOqtQ33U+i51tW490twk85HI7akOdbCecs10NGbe600j yGii2hA58aKE
A7jFxTc27UuspUGK+Vo6ResBjWZJmn3swXO6acrslDid40iPbFajt7I3DcTj YVVIgVO0Upi6
hQ5dBvuqIumLjrO433mrfbNQzxlQxiNtiFrjzJUc1UkRTI2w2vKo9pjGBtB3 GZnh6UhuLnQY
B6vet0aVJuttfmhcWm3YsIHLowfAeQSEHW2QJGyLcKOC2pKqblx0y72yFdoo RbgxxmQkMSRH
co4cZdB1ssoqL2GArjwLjC5TKVLqKg5HbLrbLDpSD8H120jcJJyHxlRNM2gS hv8AY3xZPAYc
NxDjtq0SpxF4uUaREceYUIcPWUpdXTIsDpF64lsXm1w7fZswT6wgvR4JPS9r TSPHgX5D29sk
bTh5xsEhXtFRIFshQJVwlRGOG9cZCSZZblXiOI020hYVcJ3jTaYTCd7nwqqr NUKHC+jLVV1j
aX0lBDUHLzmI9hh2/T2xj/rGC7Gh8xL2ECvnw+LKXe2YtjyvfIuxzcXUGsDs HR7cpepd121D
ZmHXp7NtjA5GGRPsrJC1ubNEyD7ilnIkZbtqILYN9/pTF1Chx2bqi6QdRS9N X/Xj1is9umSG
F1G+MJl551I0B9lhw3WuXRSSXJVBFsSUY4qi964pdA6L7nNvXRnpa8XN/jzp 9miSZLu1B3uG
yBEWBRETKqq4RESrHUFlh32EESa9cWmwcRxCg3GRDPKIqYU2DAlTtXvVXGcL jKJiZCixoMJi
FCjMxosdsWmWWQQAbAUwIiKdiIiIiIidiJUNqgPVkjc7B1LD2xj48kmtslnj NLuispgwym8e
3tHKZTKZSuK9U6ci661Hp+72S2QjjvtnDatpcuEt1GWHDIFREMEFOEYs7lES M++PahD2i03B
i0Sbik1uVskyUeaNmMbyKnCbBUXYiqi5BfCnzpVVqiHo/UfV0W5Q5B2uFLdn FDSzSEF6QYmO
4lQMY+OdJUxkjUV3JhULso5QonTJZo47aGNddSn6GL5NnXi6tyJupLjHWY42 kl5Adhq6QC7h
c5dZcQcioJtYTsRBEzQagaiOZEf6UNXxbveuurDcgaskXrSQsR1zqyEbUTlN /Bc4zzxN4QOI
pPd4QubCHodsvOmrZCbg22DIhRGs8NiPZ322wyqquBFtETKqq/rWq7h9H/dP 3U9zMfr/AM6d
zznN/I4f5Xhb/kd74fk9ngqVFpZl7P2Y0k6s5b0ma91hdtG66jyNPsx9MSYO oLTHkOFHbJDi
sTAVwHFlK4+RFFP4pIzaihEW8haUnN6Z1jqq19I1q0Re3bLcXpUmOTs2HBdi jwHotzcQBaJ5
xUMXLciqamqELqpsFR3LcPN9H790uF0e0zHdn3OMsSfKPTziuy2FERVp01ay YKIim0lVMCiY
7ErDHgdGsbTsnTkfR8BmyynUekW5vTRjGeNNqoZtIztIu8DtVM96PiSpozTE tTTbv0ma0fsW
s51lXT8J3SUG43B5JcB6SM0GZ1xjtNjtfb4RIFuyRrvQld7BBBwXVtZf6H3r /V7/APyyrnes
tE9Gep7XabM/aXINntnGFu3Q9Mto0QPEJOCKnFI2NyouSYJo8kq7tyCo7lf7 1Cudjn26E3OO
RKjOMghwXmxRSFRypGKIiJnPhqY5NNlZNNMotZTNRRBjLZIKPsEh846IIbjI ptwQCpIpFjcq
IgllUTs+ZdH0bKtMY3kgXGYD7kSE5HRlFJ1wSJzeqMplDVATPaJbfD2eGusV XWSxWmy8fquE
3G5g9zm1VXwZwKZVdoJlcAmBTK4RMrXNa2qtLlO7bm6Zrqdc89+lNxeMHG3j a70q5fSn/k1D
pKeur/QVrc7zGGNK6gnpsERRMcqXgwZ57c9uU/Unz6BrfT+oNKRol2sVktGn 5zkiR1XZtPos
hgZbVnuxDIEVZbQnnFNoFHhLlGG8kWUEe/0rmsls4KNW6cXvNpvE60ocd1B0 kMXDWEiJYtc2
5nS4t24J15gvxXQtiuDciI1eNDaBTOPDa+MQkw4iCiEaFWF7UuqJ/QZqS6tP WjUNrat1+FLz
JkNm68LDsxtheWCPy7wKDbOV3CJIRd6vgLrt5t0e7W123ynJjbLuNxRJjsZ1 MKiptcaITHtT
twqZTKL2KqUs1shWe2tW63McGO1lURSUyIiVSIyIlUjMiVSIyVSIiUlVVVVr SqKnOdM3rUY3
m0T5eoZk+PeNU3ezlAfYjixGZjlPVomlbbFzeiQ2xyZmioR9mVFR1y/9zPdV 0kcl1R8JHWId
zuzh9Z8XquHweH/2nB4m7fn4rZxeJ8XxK7pSoxChxe2ai13ete3SyNaotFse dkXGGEDijIlW
9kEeGNL5NIyGGVBhze9IJo0dwKIrrQi1HrXW0nTw36O7D01Bk3Fm1vrLmstt W42WXylvFLJl
0AzLQYacRoxJWUUMccCHtFKnEtBQ4Bb9TXtvUKTbtqSHbWZ1utke5agiKCtR 4ovXomXxdfZF
leITUcFdVpG3FeVWhRDbVEnpAvouXMnNc8tOhWbmdPW3ZDTujcSZcGmC2k2r j3HbjxFxGUEL
jZb27xx3+ojVshNXmTeG2MTpUdmM87uXvm2icJscZwmFecXKJld3bnCYYloK HFrrqzWEKDeL
q3qiY5y8fU11ajHFjcIUtU7gsxuxpDVlwHE4iqXEVQHY4Hfbomo9ea7iS9Xv tX+0RnoEe8qF
q5gXZURmO1IWNJ5VIu9rcrbB8R582jR3vRRXWhHv9KYloKHEdcvXS36ztdlu +t7ixbbRMh3R
3UEluE27BSREuzCoZcBI4tqbLICpt53Pqm5VIEHt1KVDdQc66b7q3ChWuFIt 4SWZDxu8QmAd
Vs20Tbt4iKKEu9fCi5FCTGFVU1PQMrTkGRFvLsNi1GnMwozgQWh2mStrzCqi oqqiEodgqnyk
71O9rtFzt8C5xCiXKDGmxiVFJmQ0LgKqeDIkipXP770R2u66obuhzyahBsRI YMInDEcYBskV
EAOzwbVXtXC+K92srGVritnRJeJhGNvG2clP2XwNn0fpp2xyrpPmXNbjPubw OPuowjQd4O0U
QUVcdnhXPb+iuW3S92G36h1ZftCzrREg3aPbGHb9bpMZiA1NR6e68cmUrLzQ moK0CqTZkpPs
Cu3iCSd0pUStHOWKRrGCgqI4vp/WOtrppi2vMXCHLe1DzNlt82IbLrUWZHmP t82JbBGTuii5
IXvW2yWEoiIq+IpMj66up9NcKyt3eGkGdcZFvcssqews2MLMZ4+YSKMcXWwM 44kLhvuCTbwr
sTePD65SoqtCwrU9S3li1XO8EUplqQNqafZbN9W1dUOaXCYMSVMoOcZ8Pg+d NsrDPisToL8K
U3xI8homnQyqbhJMKmU7U7F+aq1azjv/AOCypXPcQ1s77D4P2+/EjqtbHymt nJ4yp2oapxBQ
FRd3YG0e+Xvfk7dK6W3DvPRaTTkCDcDPUFuiFGkrtjylC7sNKJ5E9rZ7e1MH hCVMFjt2fubm
f1svnqRfwKtrTAZtsAIjBOGIkRkZrkjMiUjJcYTKkSrhEREz2IiYSvPudneY Tra7u3idNvKz
cfZdX2HFZdzvektLy7dbEtGkX3dQokyHzYR4VhhFGNG3Gnzjm0LL70ZCRxWN quSXGsC8hEMy
3ay1GV20lGuup4chJnDEItgkx3Jk7dLcBJDrUhgCeh8FsCJ+Mjf/AGzgArSi TfaKV6WLqOSh
wu3681GUG2zGtTc+87HiTdTx1ajqOnHOehC/GJABCYBGXZ25JCkYjGUtyK2Z Lcac1lddWdLL
1tsOrob+m25ExxDhtsSBebYYtBo2DqZRPjZT6EXfLtMxTaSAbfXKUxLQUOFy NbX0tCwLjE1z
DW7zZEUdQsy5cOK1pgjjvuG0R8s4sb48BYRJIOlnAZQ13p1Lo1n3O56Jt827 y4cyWfETmYik
TT7YuELbgkTbaObgQCVwQEDVVIEQCGtipUN1ApSlQSKUpQClKUApSlAKUpQC lKUApSlAKUpQ
ClKUApSlAKUpQClKUApSlAKUpQClKUApSlAKUpQClKUApSlAKUpQClKUApSl AKUpQClKUApS
lAKUpQClKUApSlAKUpQClKUApSlAKUpQClKUApSlAKUpQClKUApSlAKUpQCl KUApSlAKUpQC
lKUApSlAKUpQClKUApSlAKUpQClKUApSlAYpj/LRjf4Lz2xM8NltTMv0IKdq rXiVKJjm8w5j
nK7UXhsEXEUs96GPlKmO1E8GUqRSioDyJksmQwrLw8BRQnCBUAlXPYJeAlTH bjwZTx0hx2rh
c5EaSTqNMMtuCLTpNqpGRoqqoqi9iB2JnHauc9mPVebSW2+Tv0xmP+J6rRpi IZ4kNadY1HDs
DhTUmy4r0ppOsHcbGibFUX4zOV4iKnZ4BLxVItVvsF0tkW5wXJr0SWyD7DnO yB3gYoQrhSRU
yip2L21xK+WSwWzpHdsV9sthixZdtaVX7cxyjcp0yfFtrbhSY3ILiEgmW/hh lU3K2uxdHd6k
BriXCblamlwmgYEwExejx0JCabbeA1IwwooqGyibkXe6pIKmu7cFLDx3nJG8 e3gZ1TqG1+Kb
7e/9+nUNr8U329/79aZdHNS3bpQutrtmrplnjW2y2+YxGbiRnmHn3n5okr6G 2rpBiO2ii242
uN2CFV3JQ6X6apGoLjZ2oejbk5Flt29JrrDUp8ozsuOy+m0gjKwrTYyW1M3H miRBcVG1wCOK
LQ6TqPUNr8U329/79OobX4pvt7/365D0e9JV+tegdDx9T2lmTLu9pthw5bV1 OQ5JBx+DFdek
KbQqDuZzTm1FcQlRxFMcIpbXL6QLpI1hcNJWCwQ5d1iSXRFZtyKMwbDUeC64 amDLhIe64NCg
bVRUAyU0XAqotAbn1Da/FN9vf+/TqG1+Kb7e/wDfqDofUHdNoqxak5blOtrd HncDib+FxWxP
Zuwm7G7GcJnHgSqqTDtTOpbtcSmN27cIOy7wJNtnDd2ttiwpmigYGGC4ZIux UQl7TbUWWgNj
6htfim+3v/fqll2yM1epEUHZ3CRlp0UWa73qkpiqJ33g7xF7e3Kr82ET1paB CgXq8ONRG4Ms
iBpyOPaRNATnDfM17XTc3ESuKq/QXJAarIklu1FJX/7EY/43qpOlCURurI3l Jvtr33qdWRvK
TfbXvvVNpWJYhdWRvKTfbXvvU6sjeUm+2vfeqbSgIXVkbyk321771OrI3lJv tr33qm0oCF1Z
G8pN9te+9TqyN5Sb7a996ptKAhdWRvKTfbXvvU6sjeUm+2vfeqbSgIXVkbyk 321771OrI3lJ
vtr33qm0oCF1ZG8pN9te+9TqyN5Sb7a996ptKAhdWRvKTfbXvvU6sjeUm+2v feqbSgIXVkby
k321771OrI3lJvtr33qm0oCF1ZG8pN9te+9TqyN5Sb7a996ptKAhdWRvKTfb XvvU6sjeUm+2
vfeqbSgIXVkbyk321771OrI3lJvtr33qm0oCF1ZG8pN9te+9TqyN5Sb7a996 ptKAhdWRvKTf
bXvvU6sjeUm+2vfeqbSgIXVkbyk321771OrI3lJvtr33qm0oCF1ZG8pN9te+ 9TqyN5Sb7a99
6ptKAhdWRvKTfbXvvU6sjeUm+2vfeqbSgIXVkbyk321771OrI3lJvtr33qm0 oCF1ZG8pN9te
+9UVxu3NSlYcenhjsVwpbyBuxnbu3eHHbVvWvXsn1nvtxI6E6TSIocPdxB8O 8s96u3wInhz+
jsW8IqTzIboSo7dufkKyD0/PbsJZbyC5jw7V3duKldWRvKTfbXvvVqsW8yh3 o0InKcUQBxG8
qgp4AEfm7fmwmO3Oa3RhXFZBXRQXFFN6J4EXHbS0hhCdSL1ZG8pN9te+9Tqy N5Sb7a996tH1
ejQaRnyuWZF03LqByEBN5ijUzAqXhVE2p2f/AEU/RWt6c1bf4lyat1khPzMo i9WkfEFAyiZF
fCyPYgoqrwxz8nK1w3e9q2VaUzp/HmYXy8wutpGEs66HXOrI3lJvtr33qdWR vKTfbXvvVNqC
6kfbJUo7ZPc21tdUE3CnxXYi+n012xjU3Z+9WRvKTfbXvvU6sjeUm+2vfer8 hJHRLfwY7bR8
ovEIQRFNcN9q+P56nUksLoEyF1ZG8pN9te+9TqyN5Sb7a996vnnXN/KLqae0 MeOZc3J3G5Eb
cIsSXRTviFV7ERE/UldC6BLhz4XI+G238RHIhbaRtFJXJCbtooiZwKJnHzJX LC3xTw0Ppb76
N2t0uPrkpVWWVNTonVkbyk321771OrI3lJvtr33qluuA02rjhbRTwrVXFcRL UIuESxSZQHFw
XEaXb3yY2r2eDw+DPiwldKVT5ozNQYLw7mpMpwUXGRnuqmfXoUCMkgGt83vg Is8698yp/wDS
/TSyRjZbdcdfV4yMgztwiIJEif8A11JP8/Z/8I/3hUSyeRJh6sjeUm+2vfep 1ZG8pN9te+9X
q729m5w1jPkQjuQuwRNMp4xNCEk/QSKmcKnaiKmnxl6omvzolveWNClIw9w2 ozLzuRdRR4be
xCRS5dQQk3rv73KF28lvedjJYlk+JtZ2O0To8zburI3lJvtr33qdWRvKTfbX vvVNqk1OE192
JFYjk9Hd3IaYyG/cG1XMKmQQeKaplEJQEc98iFvazdnBySqZwjilStCd1ZG8 pN9te+9TqyN5
Sb7a996tbm2WLbbjb2I7RuOS3VDiNxYsfhImFUhcAAJDRMkg99uQCRRxlUvt NXB+42xDlRzZ
kslwZGdqiToom9QUVVFFCynh7FRUXCotYWV6xWjs5Kj7zSdjhjjTqjN1ZG8p N9te+9TqyN5S
b7a996ptaRKnFc722MyHOnRmJLm2PFVBRkkWSy2fYG7cpMku9TAQUwX+iq1e 8XhWKWVWyLKy
dpXqNq6sjeUm+2vferWb5qrRtluj1suVzurUpnbxAEZriJkUJO+FFRexU8C1 tluCUEFoJrgO
SEHvyHwKvoTK+NUQUVe3aOcJzrV12dHWj1rY1/LtbxuNNtwgsKPiBEA4Tiq0 qLlVzlS7M47M
V6VxsY3iVJJ7q/lFL84nDfLWVjGsWt9PyrRc2PVWjb1dGbZbbndXZT27hgQz W0XAqS98SIid
iL4VrZurI3lJvtr33q0jTz94h3uE9cdYS7hDVk5LrR2yOyKMKgoDpEKISAqu AqKngwSFt2nj
olY20ru50sJVXbX7L+DSx22GtqqPsp93/JXx4EZ6O27vmjvBCxzr3ZlP71e+ rI3lJvtr33qz
W/8AMI//AIQ/uStYuVntUG5ww4ITX5MkFSO7bWHkJrigjpG5wt/eied5HlVw qqq5zx29s7KO
KlV20OmygpulS3ILWNzG2lKmjKJtHEBZb+FRd2O+3YyuwlxnOBVcYRaldWRv KTfbXvvVq+lI
DsyO62PLR4josLPaGCEZ9mSCb1bFBbDA9+CoaqRJhdq5Xcm61W6207aOKSou H5+dhNtZxs3R
M1qPcLNJa4sdrUzze4g3Nw7gSbhVRJMoPhRUVFT5lRUqfa2rbc7ezPhv3A47 472yOTIBSH5l
wSouF8KLjtTCp2LUiVa2pDrq8d9tiTjnIwEiNSsJhOImM+BERcKm4UQT3CiI k6ut04GJRTHb
XFmlCLrx58WxdIIwzH9okpIKqre5EyoF4fEtIbtrlTRhD14y+TZOiEkZjG4R UUJUVzai4Ux8
HjSpsyzw5U0ppOT2XybFojjT32NwipKKKjZii4Uy8PjWkOzw4s0ZouT3nxbJ oTkz339okoqS
IjhkiZUB8HiSmVAR7mNttwsrIcuhK+5wmgYdkvGZbSLCCCqvyRJfB81RVmWg CbR0NRsI44DQ
m/GnthuMkEUUiFETJKidq/PWXVfU/PWDr7kOresS43O7OD+ayNu7f3vysYz8 +Kial+DjkY3U
Pcn1l1jC4PJcvxvzprdt2d98nOcfNmrxgmqkN5lwTaQZcUWXHyF91WzF14nE xsIkVNyqqLkf
m8a5z2YxMI1MRx6S5I3o842gtyDbERE1FOwVTxZyuVyviwiSLj+eW3/El/yX K5p0lyN0GDBe
NUgv6gFqcm7CEyrp96X/ANFS2Iv6FrpuFkrW0aa4eRleJuEao6PykL6cz217 71OUhfTme2vf
erhup7vqORp9525uzQcii29aHCiIybr/ADCCJmqdoOKJbeGmEUTJfGgdAtN2 vzl9ltT2Ebt4
7+AfLAG7BJt75JBqve58LY5/+j4F9eNyg/2nE7xJcTcuUhfTme2vfepykL6c z21771clh62u
IajCyT7q0ydsudyk3WS6LYMFb22hdaBCx2KAzoOVVB/Iu5JexTjQOlu5yprF pTSbvXD8tpgG
VefjtIDrEpwHFKTHaPCLENDw2uBXIq4SK3VfVbLTwLbaep2PlIX05ntr33qc pC+nM9te+9XH
Lp0sHZbQ5OKC7cgjS7is8EJ1x+PHYlvNCaIxGIEQhacQOMTSd5hXCVDNKS86 41HbujnUwS0U
WpT+oo1ruTFycKW260U51vcCgPDAAYIRIXCVNraIKIq7Yd2stPAlWs9Tv3KQ vpzPbXvvU5SF
9OZ7a996uTM9K77t7uEdnSl5l2+KcxkH4kSQ4645G4iGmFZFjBEyYBtfMlIm 0URVSQNj0Pqx
3UNpdmSEtbbrb6sm1BnHI4SoIqoO72mjadRSwTZCij2Z7Vwlo3Syk6JLuIdt NbzduUhfTme2
vfepykL6cz21771a9wI101HbAct7dyd79rgkmFbaMg4j4Gna2be0VQ0VPopg jFU/bvDtTFwt
EyI43cGV3usXpTbdclO4cbJhDBEEAAclsFE3Lkk7QcUsJWNnG12WFV+hpGcn DHUuJMaOkyGD
b03a64TZjzjuMbCLPys5yP8Amv6MLsVitDIPXW7rAaMtgHJuhtCReJFI0yv6 KhQ5PGu9vHOc
PEv/AKR1S9Idi1A/qRm9Whh2Y2sNIqtNG0jjKoZEpJxVQdpoQoWFz8WPYvzc ttdoK87OTwqh
ZW01Y44qrNyG3RSFCF6YQqmUVJrqoqetX71ZG8pN9te+9XPLNqWTpC2taZKH GnSLblZmZqMo
CuKrosMIorvUAMETOwcbURfCiXPSVqCaHRmxfNMyZgOzpVsGM5EbZV8mpMth tUbR9FaQyBxU
Tf3qKqKuMZrktbvOzo3ue56m1lbxtMlvW9aG1dWRvKTfbXvvU6sjeUm+2vfe rnejda6jXUjO
kZVtmXKYUiTxHrg/HZlQWWQgmXNIwKsmapNVQ4GUxwBPBK6bbS/S2d7tsu5n pmZAgnbuetkm
QzMBp/coCyy4RRUTjOK62gBHWTuXegqWA4mOFmtTonVkbyk321771OrI3lJv tr33q5JF6Upc
/Wdoza5kSYMe421y2uuPsRXJpOWsmDM32mzAECSib3GhLJkDYuEbaO3srpRk 2uFLvV808yzY
QmXSHGehz1flOHASURqbJNNgCEEJ5Uw4S7lBFTCqQsLFTfurI3lJvtr33qdW RvKTfbXvvVzX
WfSbd9MK4zerEyzcoDZznY1vufGjyI/IXF5sSdcjiaKpwDRUEBxlst5JvbXN fta6zZ1PZNOM
2a0R74dxaJ+KN1M4cmI9DuBAiyFjI4Bo5CIlQWl+SCblQyQWFip0TqyN5Sb7 a996o1sgtPRj
Nx6aRI+8CLzjqdguEKf0vEiVT6Z1i9edZ3OwuQYdvGHxeGzKluN3F4W3Eb46 RSaRFjEu7a8D
hivep2EpCGw2X8zc/wATI/5x1DyJHVkbyk321771OrI3lJvtr33qm0oCF1ZG 8pN9te+9TqyN
5Sb7a996ptKAhdWRvKTfbXvvU6sjeUm+2vfeqbSgIXVkbyk321771OrI3lJv tr33qm0oCF1Z
G8pN9te+9TqyN5Sb7a996ptKAhdWRvKTfbXvvU6sjeUm+2vfeqbSgIXVkbyk 321771OrI3lJ
vtr33qm0oCF1ZG8pN9te+9TqyN5Sb7a996ptKAhdWRvKTfbXvvU6sjeUm+2v feqbSgIXVkby
k321771OrI3lJvtr33qm0oCF1ZG8pN9te+9TqyN5Sb7a996ptKAhdWRvKTfb XvvU6sjeUm+2
vfeqbSgIXVkbyk321771OrI3lJvtr33qm0oCF1ZG8pN9te+9TqyN5Sb7a996 ptKAhdWRvKTf
bXvvU6sjeUm+2vfeqbSgIXVkbyk321771OrI3lJvtr33qm0oCF1ZG8pN9te+ 9TqyN5Sb7a99
6ptKAhdWRvKTfbXvvU6sjeUm+2vfeqbSgIXVkbyk321771OrI3lJvtr33qm0 oCF1ZG8pN9te
+9TqyN5Sb7a996ptKAhdWRvKTfbXvvU6sjeUm+2vfeqbSgIXVkbyk321771O rI3lJvtr33qm
0oCF1ZG8pN9te+9TqyN5Sb7a996ptKAhdWRvKTfbXvvVHcZtjcpIxy5YuqKl tWa92IiZXK7s
J2Va1rEoIjt2inKjSnGHyeAjbTKyC3JsBFTt2oiD+jw/NmtLOGN0KydC5G3R SFCF6YQqmUVJ
ruFT1q/erI3lJvtr33qnSrcsa0uvhMkg40wpo38WooqDnHYCdlflRODjvJTq QurI3lJvtr33
q8tQIToqTUiWYoSiqjOdVMoqoqfK8KKiov6UqnavUmRIkKrxMOCDTbUIWXEc cU1cyQq60C7s
DlPCGALdhO+HX9LtyLOTMBi3X2dHO7PpzJSlRsNr/D3YaTKphMkjm0VUSx4V rK72tnb2cpp7
n+fm81djabRQSzdeOmZvXVkbyk321771RM2TzqX7Tc+/VxWnwZlrjRyO7nqA 0y02ylvZmvCC
JHZJUVI6Eg9pKvbjPbjOFx13a77avUctta7Ohfx4dvkApx5cl4UXCkE90kz4 uw6xXRq22y3v
T5j9wCOwO9wgkyDUR+dcCqrhPCq47Eyq9iVFsz1teu7L1pK7iy6y/wAYLg3K aIjBWMFskIhL
2FjciY8KZ7FxsFZ21lsp4S1nPHHEjWpFws0ZriyGtTMt7hDc5DuApuJUEUyo +FVVERPnVUSr
jqyN5Sb7a996vyLa2o7rS8d9xiNnk4xkitRcpheGmM+BVRMqu0VUQ2iqos6s 3TgaGupMtBk4
jQajfRtw2iNiNPcDcBKJIhCKouCRU7F+apVsG23EXljuXQVYc4ToPuyWTAto lhRNUX5JCvg+
evaWCCBOK1IuzCOOG6QMXWS2G4yUiVBFxETJKq9ifPUq2W6NbheSPxyV9ziu m/IceMy2iOVI
yVfkiKeH5qOlCCtmO2uLNKEXXjz4ti6QRhmP7RJSQVVW9yJlQLw+JaQ3bXKm jCHrxl8mydEJ
IzGNwiooSorm1Fwpj4PGlYXe5Du1uHdX1F/N0Tlus+F5STu2cT/y5x+ijXch 3a2/uU6i/m6X
zPVnC8pG27+H/wCbGf01fAsNSK5ltC3Mzn4aGZtNtNuBxDUiRSU0VNy9qp3u e3PhX5sIijP8
+Sv8Mz/xO0rMsTaVB1CjhWC4iy8TDixXUBwVVFBdi4JMKi5Tw9ipVJC0rdrN NWO/qqVO5qI4
g7uNgFEm+3vniXtyqd6orhVwqLhUuox2cpVzXDX7FHKSmo0yfHQ2dtwHBUmz E0RVFVFcplFw
qfrRUVP9lYYRbb5M/wAMx/xO1WaYgz4yuPTG2IqK22ykdgzIV4bYBvVSIvod 7jC7cb8l2DaW
1oXtSyGyVURYzOcf3nawsJynFOSozWaUXRMh6o09b7/bjtslpkIkmYzJngjS bpPCUCFFX9Kt
NIqqi5AVFMZQhn2W2WqyQ+Ts9uiwI+7crcdpAQiwiblx4Vwidq9vZVrOYtkF jjzZoxWsonEe
dEBz4srUaFI0/OfSPCvMWS8qKqNsymzJUTw9idtdmztKdRh7GKvE1y/6L03f b0V3ucaY7Icj
NxXwbuMhpiSwBGQtPMg4jbwZdcyLgkioZIuUXFZpmlNPy9QDfH4jyyuIDxtj LeGM863jhuuR
0JGnHR2htcMFIeG3hU2BjbCt0YRUidcEUTKqpJhE9Fc9ldKnRtHuy24r4+ao ewn22SJlF/vI
nan6UylTCwtp+6qlqoyWno40bbLYtuj2+Y5GSMEVhJV0lSSiNAQkIxydcIo+ CbaJFaUFQmmi
8LYKlbfOjSAVqVnTM162XByasp64zJ1xlSXEJoGzDjBLaf2kjLGRV1Q+JHIK qCo9MiRIEuK1
KiyVeYdFDbcA0USFfAqLisvVjH03fSnuqmCYqjXtK2qLpzTFq09Bceci2uEz CYN5UVwgaBAF
SVERFXApnCImfmSvbdrt7d1dugtOLJcPiFueMgQ9iN70bVdgnsRB3IiLjKZw q5vurGPpu+lP
dWCbHtsJkXpkwYzROtsibrogKm4aAAIq/wBIjIRRPCqkiJ2rTBMVRUWu12+2 PvPQmnGyeAG1
QnjMRAFJQABJVQAHeWBFERM+CvG7df5S/wD2Kx/xu1sPVjH03fSnuqNJ09ap TiOSYwPmiYQn
AElRPFlUqHZyZNUQKVK7lbF5vj/Yh92ncrYvN8f7EPu1GykMSItKldyti83x /sQ+7WGBYNMT
4MedBYgSokloXmH2QbNt0CTImJImCFUVFRU7FRabKQxIx0qV3K2LzfH+xD7t Vl4jaDs063wb
vMsdul3J3gwGJTrDTko8imxoSwplkxTA5XJJ40pspDEiTSpXcrYvN8f7EPu1 hCwaYOc7BBiA
UtloHnWEBtXAA1JANRxlBJWzRFXsVQLHgWmykMSMdKldyti83x/sQ+7TuVsX m+P9iH3abKQx
Ii0qV3K2LzfH+xD7tO5Wxeb4/wBiH3abKQxIi0rJNsGmITIvTGIEZonW2RN0 GwFTcNAAEVU+
URkIonhVSRE7VrN3K2LzfH+xD7tNlIYkRaVK7lbF5vj/AGIfdp3K2LzfH+xD 7tNlIYkRaVkn
2DTECDInTmIEWJGaJ5994GwbaAUyRkSpgRREVVVexESsNktejb5a2bpZCtVz gP7uFKhq0805
tJRXaYoqLgkVFwvhRUpspDEj1SpXcrYvN8f7EPu07lbF5vj/AGIfdpspDEiL SpXcrYvN8f7E
Pu07lbF5vj/Yh92mykMSItKldyti83x/sQ+7TuVsXm+P9iH3abKQxIi0qV3K 2LzfH+xD7tO5
Wxeb4/2IfdpspDEiLSpXcrYvN8f7EPu07lbF5vj/AGIfdpspDEiLSpXcrYvN 8f7EPu07lbF5
vj/Yh92mykMSItKldyti83x/sQ+7TuVsXm+P9iH3abKQxIi0qV3K2LzfH+xD 7tO5Wxeb4/2I
fdpspDEiLSpXcrYvN8f7EPu07lbF5vj/AGIfdpspDEiLUS8RXZtudjMyCjma YQh+f9C/Phf0
dtWvcrYvN8f7EPu07lbF5vj/AGIfdqVZSQxI0pzRwdXgLUpUlpjcS/k1/QiJ 2pj5l8PYlbQw
BNsg2RqZCKIpL4SVE8NTe5Wxeb4/2Ifdp3K2LzfH+xD7tTKE5bwmka9L03aJ QPtyGZDjT6O7
2Slu8P41CFxRDdtFVQz7URF75fHUuz2q3WeGkS2Q2orOdxIA9plhEUiXwkSo iZJVVVx2rVt3
K2LzfH+xD7tO5Wxeb4/2IfdrON3w+6qBtSeJ7yLWA424zXjuIBuC4QIg4VR2 47cZ/op89WPc
rYvN8f7EPu07lbF5vj/Yh92rqzkhVFcxG4St5fdcRpvhghIOETs8SJn5KeGs 9Su5Wxeb4/2I
fdp3K2LzfH+xD7tHZye8VRzy4dGVolzpErrO4Ncd9x5W0YiOIBOGRkiK4wRY 3ES4VVxmrjR+
koOmXJTsWXKkuSQbbInhaBBEFNRRBaABTtcNc4z2+Gtr7lbF5vj/AGIfdp3K 2LzfH+xD7tUV
3o60O615UvNrZbKc246EGUwElg2XM7S+dFwqeJUrxBitw2eE2pkiruUjLKqv /wB+Kse5Wxeb
4/2Ifdp3K2LzfH+xD7tX2UqUOHEiEy02y2jbQIAIqqiJ4Eyua8GK860WF2o2 aKuOzwjVh3K2
LzfH+xD7tO5Wxeb4/wBiH3ajZSGJFDqazle7eMQLvdLUouI5xre8Lbi4RU2q qiSbe3OMfMlZ
YlpiMlDecQ5UqKwLIyX13OmiJjcSphFLtLtx2bzxhCXNz3K2LzfH+xD7tO5W xeb4/wBiH3aO
ylJUe4KSTqjW9L2A7HzO+/3q7cdRVOsZAucLGfkYEcZz2+HwJV1UruVsXm+P 9iH3adyti83x
/sQ+7Uys5ydWQmkqI1WyaWbt8aZGmXu9XluUoLi4yUNWVFVVFbURFRXKoufC iiKoqKlXrDTT
DIMMNg002KAAAKIIiiYRERPAiVN7lbF5vj/Yh92ncrYvN8f7EPu1ErKUpYnv JUklRbjW7tYD
n32HdRv96hjG2ZhxpAjHe2kpd+KiqrnOFwqdiJX5L01FciXFmLOuFvcnEilI ivILrSI4TioC
qioiKZuKuUVe/VPAgomy9yti83x/sQ+7TuVsXm+P9iH3aOyk2m963dQUkk0u JUWO3la7UzAK
fNuCtZzImOIbx5VV75UREXGceDwIlTNg7t20d3jx21L7lbF5vj/Yh92ncrYv N8f7EPu1OznW
pFVShqsiz3Zma0zaLose1uAYPMOIJcvlRVFZTZ4kNMEW0dyYRUHbV3DjMw4b MSMGxlhsW2xy
q7RFMImV7V7E+ep/crYvN8f7EPu07lbF5vj/AGIfdrnsrjGyk5QVKms7ZzST K+CKjCYEkVCR
sUVFTtTsqitFivaMSG9RajG6mpi5DdYgjFOKSbkUkVCLcq5x29mMoqKhKlbb 3K2LzfH+xD7t
O5Wxeb4/2Ifdrd2LcXFrJmalRprgare7LeijQ42mb81Y22VNXkOCkpXsqi5V SJFQs7lUlypK
SqvbWwVK7lbF5vj/AGIfdp3K2LzfH+xD7tTspKKilkhiVWyLSpXcrYvN8f7E Pu07lbF5vj/Y
h92o2UhiRFpUruVsXm+P9iH3adyti83x/sQ+7TZSGJEWlYrjZrHDXHVUU1VV witgPYiD/wDR
Xx1VPDZG/wD/AAMNf9ofh1tZ3K2tFWKKStoRybJtx/PLb/iS/wCS5Wh3gG5E qfGkNtvMHIeE
23BQhJN5diovhrc34ttauFudgwmWFV9MqLYoWCjkWFVE/SlU9qtUe53K6cc3 R4ck8bFRPCZ+
NF8VdfJdpG72s5Wm5L7owvcXaQio8X9ma88IPE2TzYOK0e9tTFF2FhU3JnwL hVTP6VrJxXPp
LW39ytv8tK9Yfu07lbf5aV6w/dr2v8xdevuOD1K2NCftkB+VNkyIrb5z4oQ5 SOpvB5kFcUQI
F71U+Ocz2du7C5wlVlt0hY4FzC5tNz35rZgYPy7lIkmKgDwDhXXC7EGQ8mPB 36rjOFTqHcrb
/LSvWH7tO5W3+WlesP3ar/lbm8/sT6pb/jOVXPRGm7hGejvxJTbUjjJIGPPf Y5gXnDccF3hm
PEFTddVBLKDxCQURCVFHojTbnPC9ElPNTuZV1l2e+bIlI38Ym2yNRaIuI4m4 EFUQyRFRCXPV
e5W3+WlesP3adytv8tK9Yfu1H+UuWngT6rb6+JzQtL2ZZ781GpQOvcRdoTXh baNxFQ3Wm0Pa
y6W48uNoJ5M1zkizOstui2eKUeCLqI4auOuPPG866eETcbjikZrhBFFJVwIi idiIib73K2/y
0r1h+7TuVt/lpXrD92pXKtzWa/gh3O3f/k0mQ0L7iOOG8io2TSoDpAhtljcB IiohCu1MiWUX
HgobQk+Dym9kHOKgI6SN8TYob1BF2qW1du5UzjCZ7Erdu5W3+WlesP3adytv 8tK9Yfu1D5Uu
TdWvAn1S3pSvia/psyLUEJCXKbz/AOWdb5VEWk7aSYJySSfpIfu157kLT43/ AEj92vIv1pYX
m12ilT6Hbd42llDC14kbUWhrTerodxckTojryCMkYxiKSERMJuyKqK47NwKJ YRO3sTFledOW
e7adHT8yMY24FZVtuO+5HJtWTE2lA2yEwUSAFRRVPBUbuQtPjf8ASP3adyFp 8b/pH7tc8sMk
ou1yW7Jl4rC21DNnqyaRsFmmszoMR7nGW3m0lPy3X3nEeVlXFcccIicVeXYF CNVURbEUVBTF
RI/R/pNhqQ0FteJt5tGmwcmvmkMEMTEYqEa8qgkDZCjGxBVppUwrYbZPchaf G/6R+7TuQtPj
f9I/drPZ2XzPBl8c+j4ka1dH+k7c7Jdbtr0tyU3IakncJr81XwfBgHRcV8z3 oQxWBwWURAwm
EVc1ukui7TljivMzOcvfFkTXUC5TZEpgQkuukqIy84be/huk2TmNxoTikvxh ot33IWnxv+kf
u07kLT43/SP3anZ2XzPBjHPo+JAf6NtHyYDsObb5k8Xd6OOzbnJkPkJsPMKC vOOE5sRuQ+iB
u2irpkKIS5qxvekbBeZr06dEe5x5tltZTEt1h5tGVeVtW3GyEm1TmHxUgVFI XCFVUVxXnuQt
Pjf9I/dp3IWnxv8ApH7tNnZfM8GMc+j4ki2abtVvvMq8MhMdnSd6K7KnPyeE JkhGDKOmSMgS
oKqDaCK7AyneDiVZfzNz/EyP+cdVvchafG/6R+7TuQtPjf8ASP3ajZWXT8GM c+j4l/SqDuQt
Pjf9I/dp3IWnxv8ApH7tNlY9PwYxz6PiX9KoO5C0+N/0j92nchafG/6R+7TZ WPT8GMc+j4l/
SqDuQtPjf9I/dp3IWnxv+kfu02Vj0/BjHPo+Jf0qg7kLT43/AEj92nchafG/ 6R+7TZWPT8GM
c+j4l/SqDuQtPjf9I/dp3IWnxv8ApH7tNlY9PwYxz6PiX9KoO5C0+N/0j92n chafG/6R+7TZ
WPT8GMc+j4l/SqDuQtPjf9I/dp3IWnxv+kfu02Vj0/BjHPo+Jf0qg7kLT43/ AEj92nchafG/
6R+7TZWPT8GMc+j4l/SqDuQtPjf9I/dp3IWnxv8ApH7tNlY9PwYxz6PiX9Ko O5C0+N/0j92v
xNI2lT2bn921Sx3vgRURf6PjVKbKy6fgxjn0fE2ClUHchafG/wCkfu07kLT4 3/SP3abKx6fg
xjn0fEv6VQdyFp8b/pH7tO5C0+N/0j92mysen4MY59HxL+lUHchafG/6R+7T uQtPjf8ASP3a
bKx6fgxjn0fEv6VQdyFp8b/pH7tO5C0+N/0j92mysen4MY59HxL+lUHchafG /wCkfu07kLT4
3/SP3abKx6fgxjn0fEv6VQdyFp8b/pH7tO5C0+N/0j92mysen4MY59HxL+lU HchafG/6R+7T
uQtPjf8ASP3abKx6fgxjn0fEv6VQdyFp8b/pH7tO5C0+N/0j92mysen4MY59 HxL+lUHchafG
/wCkfu07kLT43/SP3abKx6fgxjn0fEv6VQdyFp8b/pH7tO5C0+N/0j92myse n4MY59HxL+lU
HchafG/6R+7TuQtPjf8ASP3abKx6fgxjn0fEv6VQdyFp8b/pH7tO5C0+N/0j 92mysen4MY59
HxL+lUHchafG/wCkfu07kLT43/SP3abKx6fgxjn0fEv6gkzOQXAbfdbEkJE4 UrYiZcU92Ni4
Ltx4fBVd3IWnxv8ApH7tO5C0+N/0j92rRhZx3T8A5Tf7fEszZmPkQPyHRYNw zMUfUlJCx3id
6OBTC+Pw1Mqg7kLT43/SP3adyFp8b/pH7tJQspb7TwYUpr9viXXLRub5zl2u Z4fC42xN+zOd
u7w4z24qklaQtL9zjT0OY05HklJEEfU21MnEcVdp7kHJJldm3OVr97kLT43/ AEj92nchafG/
6R+7VVZWSTSnv6maQt7WzkpxVGuv6F/VdbolwtTklLXLiNx33BNG5EY3SDAC GELiJ2d74uyo
PchafG/6R+7TuQtPjf8ASP3avBQh7tp4GTcnvj4lpw7i/cmZk+VEc4LLjQAx GJv5ZAqqqqZZ
+Qni8NS6oO5C0+N/0j92nchafG/6R+7UShZydXaeBKlJft8S/pVB3IWnxv8A pH7tO5C0+N/0
j92q7Kx6fgxjn0fEv6VQdyFp8b/pH7tO5C0+N/0j92mysen4MY59HxL+lUHc hafG/wCkfu1+
LpG0ooopP98SCnyfCqoif0fGtNlZdPwYxz6PiWbP8+Sv8Mz/AMTtKp9HsNxb pd47SYBsgFPG
uCcSlZW1ns5uNa0LwlijUvbqw5KtkqM0oo46yYApeBFUVRM/orGhXOVc2ZM1 iIy2yy4CI0+T
ikpEC/OA4TvF9NTKVRSaTWpZpN1FeLL/AKVvf4Zr971e68WX/St7/DNfveqY e8g9x66Q5bkC
Fb5jMliK41KPY++0rjbRrGeECMUIVIdyjlEIc+DKZzWqaRv17u2p7ZGu1/s1 32SCdbS3WtyJ
w0Rh5CU98h7dlSFExtx2+HKY6jSu6pjhNU6
Re: [Help needed] GEF-Editor doesn't update ... [SOLVED] [message #248190 is a reply to message #248167] Thu, 09 April 2009 01:42 Go to previous messageGo to next message
Eclipse UserFriend
Originally posted by: juergen.scheffler.gmx.de

Ben Vitale schrieb:
> juergen.scheffler@gmx.de wrote:
>>>
>>> Try setting some breakpoints in your model classes to see if they are
>>> receiving the changes as you commit them in the property view.
>>
>> How do I do that? f.e. I open the Node.class and set a breakpoint
>> there and then run debug mode, correct?! for what do I have to look?
>>
>
> Right. Presumably your Node class has a setName(..) method or similar.
> Set a breakpoint there. The key is figuring out when its getting called.
>
> If your breakpoint hits when you press Enter in the property view, then
> most likely your EditPart isn't updating the figure in a way that is
> triggering it to repaint.
>
> Looks like you are pretty close.
>
> -Ben

Hi again,

I set a breakpoint at "LeistungsplatzhalterEditPart" in the
refreshVisuals() method and added the code: getFigure().repaint();
After this, I started the Editor and you wont believe the figure got
refreshed after pressing enter!!! Is this the "correct way"? Can you
please explain how the Editpart gets notified. I dont understand the
concept of notification. Does the redbook help me or can I find more
special infos?
Re: [Help needed] GEF-Editor doesn't update ... [SOLVED] [message #248200 is a reply to message #248190] Thu, 09 April 2009 09:42 Go to previous messageGo to next message
Eclipse UserFriend
juergen.scheffler@gmx.de wrote:
> I set a breakpoint at "LeistungsplatzhalterEditPart" in the
> refreshVisuals() method and added the code: getFigure().repaint();
> After this, I started the Editor and you wont believe the figure got
> refreshed after pressing enter!!! Is this the "correct way"? Can you

In most cases it should not be necessary to call repaint() directly. For
example, if your figure contains a Label figure, and you are setting the
new text on the Label, it should take care of forcing a repaint. But if
its working then I'd leave it alone.

> please explain how the Editpart gets notified. I dont understand the
> concept of notification. Does the redbook help me or can I find more
> special infos?

When the Node class updates its name field, it sends an event to its
listeners. The EditPart has previously attached itself as a listener in
its activate() method. When it receives the event, it calls
refreshVisuals(). Typically this is the flow.

-Ben
Re: [Help needed] GEF-Editor doesn't update ... [SOLVED] [message #248213 is a reply to message #248200] Thu, 09 April 2009 16:47 Go to previous messageGo to next message
Eclipse UserFriend
Originally posted by: juergen.scheffler.gmx.de

Ben Vitale schrieb:
> juergen.scheffler@gmx.de wrote:
>> I set a breakpoint at "LeistungsplatzhalterEditPart" in the
>> refreshVisuals() method and added the code: getFigure().repaint();
>> After this, I started the Editor and you wont believe the figure got
>> refreshed after pressing enter!!! Is this the "correct way"? Can you
>
> In most cases it should not be necessary to call repaint() directly. For
> example, if your figure contains a Label figure, and you are setting the
> new text on the Label, it should take care of forcing a repaint. But if
> its working then I'd leave it alone.
>
>> please explain how the Editpart gets notified. I dont understand the
>> concept of notification. Does the redbook help me or can I find more
>> special infos?
>
> When the Node class updates its name field, it sends an event to its
> listeners. The EditPart has previously attached itself as a listener in
> its activate() method. When it receives the event, it calls
> refreshVisuals(). Typically this is the flow.
>
> -Ben

Here the full EditPart code. Do you know why I need the "repaint" call?
Is the getAdapter method wrong?

__________________________________

package de.scheffler.cpeditor.parts;


import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.List;

import org.eclipse.draw2d.ChopboxAnchor;
import org.eclipse.draw2d.ColorConstants;
import org.eclipse.draw2d.ConnectionAnchor;
import org.eclipse.draw2d.EllipseAnchor;
import org.eclipse.draw2d.Graphics;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.Polyline;
import org.eclipse.draw2d.RectangleFigure;
import org.eclipse.draw2d.RoundedRectangle;
import org.eclipse.draw2d.Triangle;
import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.draw2d.geometry.PointList;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.emf.common.notify.Adapter;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.Notifier;
import org.eclipse.gef.ConnectionEditPart;
import org.eclipse.gef.EditPolicy;
import org.eclipse.gef.GraphicalEditPart;
import org.eclipse.gef.Request;
import org.eclipse.gef.commands.Command;
import org.eclipse.gef.editparts.AbstractGraphicalEditPart;
import org.eclipse.gef.editpolicies.ComponentEditPolicy;
import org.eclipse.gef.editpolicies.GraphicalNodeEditPolicy;


import org.eclipse.gef.requests.CreateConnectionRequest;
import org.eclipse.gef.requests.GroupRequest;
import org.eclipse.gef.requests.ReconnectRequest;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.views.properties.IPropertySource;


import de.scheffler.cpeditor.figures.LeistungsplatzhalterFigure;
import de.scheffler.cpeditor.figures.NodeFigure;
import de.scheffler.cpeditor.model.Connection;
import de.scheffler.cpeditor.model.Leistungsplatzhalter;
import de.scheffler.cpeditor.model.ModelPackage;
import de.scheffler.cpeditor.model.Node;
import de.scheffler.cpeditor.model.commands.ConnectionCreateCommand ;
import de.scheffler.cpeditor.model.commands.ConnectionReconnectComm and;
import de.scheffler.cpeditor.model.commands.NodeDeleteCommand;
import de.scheffler.cpeditor.policies.NodeGraphicalNodeEditPolicy;
import de.scheffler.cpeditor.views.MyPropSource;

import org.eclipse.draw2d.Shape;

public class LeistungsplatzhalterEditPart
extends AbstractGraphicalEditPart
implements Adapter, org.eclipse.gef.NodeEditPart
{
//private static final int MIN_SIZE = 50;

//private static final int MAX_SIZE = 250;


private ConnectionAnchor anchor;

private IPropertySource propertySource = null;

/* (non-Javadoc)
* @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#activate ()
*/
@Override
public void activate()
{
super.activate();
getTarget().eAdapters().add(this);
}



/* (non-Javadoc)
* @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#deactiva te()
*/
@Override
public void deactivate()
{
super.deactivate();
getTarget().eAdapters().remove(this);
}



/* (non-Javadoc)
* @see org.eclipse.gef.editparts.AbstractEditPart#createEditPolicie s()
*/
@Override
protected void createEditPolicies() {

// allow removal of the associated model element
installEditPolicy(EditPolicy.COMPONENT_ROLE, new
ComponentEditPolicy() {
@Override
protected Command getDeleteCommand(GroupRequest request)
{
NodeDeleteCommand ndc = new NodeDeleteCommand((Node)
getHost().getModel());
// ndc.setLabel("dasdasdad");
return ndc;
//return new NodeDeleteCommand((Node) getHost().getModel());
}
});

// allow the creation of connections
installEditPolicy(EditPolicy.GRAPHICAL_NODE_ROLE, new
NodeGraphicalNodeEditPolicy());




}



/* (non-Javadoc)
* @see
org.eclipse.gef.editparts.AbstractGraphicalEditPart#createFi gure()
*/
@Override
protected IFigure createFigure() {

//Node node = (Node) getModel();

System.out.println(" Create Figure called !!! ");

return new LeistungsplatzhalterFigure((Leistungsplatzhalter) getModel());


/*
IFigure fig = new RectangleFigure();
fig.setOpaque(false);
//fig.setBackgroundColor(ColorConstants.green);
fig.setBackgroundColor(new Color(Display.getDefault(),131,202,255));


RoundedRectangle r = new RoundedRectangle();
r.setCornerDimensions(new Dimension(100,100));
r.setSize(200, 200);
r.setLocation(new Point(5,5));
// r.setBorder(new LineBorder(ColorConstants.blue,2));
r.setLineStyle(Graphics.LINE_DASHDOT);
r.setLineWidth(2);
r.setForegroundColor(ColorConstants.red);

fig.add(r);
*/


/*
int x,y;

x = bounds.x;
y = bounds.y;
Polyline line = new Polyline();
PointList pointList = new PointList();

System.out.println(model.getX());
pointList.addPoint(model.getX()+50, 50);
pointList.addPoint(model.getX()+100, 0);
pointList.addPoint(model.getX()+150, 50);
pointList.addPoint(model.getX()+100, 100);
pointList.addPoint(model.getX()+50, 50);

line.setPoints(pointList);

*/


//return fig;
}



/* (non-Javadoc)
* @see org.eclipse.emf.common.notify.Adapter#getTarget()
*/
public Notifier getTarget()
{
return (Notifier) getModel();
}



/* (non-Javadoc)
* @see
org.eclipse.emf.common.notify.Adapter#setTarget(org.eclipse. emf.common.notify.Notifier)
*/
public void setTarget(Notifier newTarget)
{
setModel(newTarget);
}



/* (non-Javadoc)
* @see
org.eclipse.emf.common.notify.Adapter#isAdapterForType(java. lang.Object)
*/
public boolean isAdapterForType(Object type)
{
return false;
}



/* (non-Javadoc)
* @see
org.eclipse.emf.common.notify.Adapter#notifyChanged(org.ecli pse.emf.common.notify.Notification)
*/
public void notifyChanged(Notification notification)
{
int featureId = notification.getFeatureID(Node.class);

switch (notification.getEventType())
{
case Notification.SET:
case Notification.UNSET:
switch (featureId)
{
case ModelPackage.NODE__X:
case ModelPackage.NODE__Y:
case ModelPackage.NODE__WIDTH:
case ModelPackage.NODE__HEIGHT:
case ModelPackage.NODE__NAME:
refreshVisuals();
break;
}
break;

case Notification.ADD:
case Notification.ADD_MANY:
case Notification.REMOVE:
case Notification.REMOVE_MANY:
switch (featureId)
{
case ModelPackage.NODE__IN:
refreshTargetConnections();
break;

case ModelPackage.NODE__OUT:
refreshSourceConnections();
break;
}
break;
}
}



/* (non-Javadoc)
* @see org.eclipse.gef.editparts.AbstractEditPart#refreshVisuals()
*/
@Override
protected void refreshVisuals()
{
Node model = (Node) getModel();
Rectangle bounds =
new Rectangle(model.getX(), model.getY(), model.getWidth(),
model.getHeight());


getFigure().revalidate();

getFigure().repaint();

/*

int MIN_SIZE = 100;
int MAX_SIZE = 500;
if (bounds.width < MIN_SIZE)
{
bounds.width = MIN_SIZE;
}
if (bounds.height < MIN_SIZE)
{
bounds.height = MIN_SIZE;
}
*/
/*

if (bounds.width > MAX_SIZE)
{
bounds.width = MAX_SIZE;
}
if (bounds.height > MAX_SIZE)
{
bounds.height = MAX_SIZE;
}
*/

((GraphicalEditPart) getParent()).setLayoutConstraint(this,
getFigure(), bounds);
/*

IFigure figure = getFigure();

Node element = (Node) getModel();

figure.setLocation(new Point(element.getX(), element
.getY()));
figure.setSize(element.getWidth(), element.getHeight());

*/

}



/* (non-Javadoc)
* @see
org.eclipse.gef.editparts.AbstractGraphicalEditPart#getModel SourceConnections()
*/
@Override
protected List getModelSourceConnections()
{
return ((Node) getModel()).getOut();
}



/* (non-Javadoc)
* @see
org.eclipse.gef.editparts.AbstractGraphicalEditPart#getModel TargetConnections()
*/
@Override
protected List getModelTargetConnections()
{
return ((Node) getModel()).getIn();
}



protected ConnectionAnchor getConnectionAnchor()
{
if (anchor == null)
{
anchor = new ChopboxAnchor(getFigure());
}
return anchor;
}






public ConnectionAnchor getSourceConnectionAnchor(
ConnectionEditPart connection)
{
return getConnectionAnchor();
}



public ConnectionAnchor getSourceConnectionAnchor(Request request)
{
return getConnectionAnchor();
}



public ConnectionAnchor getTargetConnectionAnchor(
ConnectionEditPart connection)
{
return getConnectionAnchor();
}



public ConnectionAnchor getTargetConnectionAnchor(Request request)
{
return getConnectionAnchor();
}


@Override
public Object getAdapter(Class key) {
/*
* override the default behavior defined in AbstractEditPart which would
* expect the model to be a property sourced. instead the editpart can
* provide a property source
*/
if (IPropertySource.class == key) {
return getPropertySource();
}
return super.getAdapter(key);
}
protected IPropertySource getPropertySource() {
// lazy creation and reusing

if (propertySource == null) {
propertySource = new MyPropSource(getModel());
}
return propertySource;

}


}
Re: [Help needed] GEF-Editor doesn't update ... [SOLVED] [message #248218 is a reply to message #248200] Thu, 09 April 2009 17:31 Go to previous messageGo to next message
Eclipse UserFriend
Originally posted by: juergen.scheffler.gmx.de

Ben Vitale schrieb:
> juergen.scheffler@gmx.de wrote:
>> I set a breakpoint at "LeistungsplatzhalterEditPart" in the
>> refreshVisuals() method and added the code: getFigure().repaint();
>> After this, I started the Editor and you wont believe the figure got
>> refreshed after pressing enter!!! Is this the "correct way"? Can you
>
> In most cases it should not be necessary to call repaint() directly. For
> example, if your figure contains a Label figure, and you are setting the
> new text on the Label, it should take care of forcing a repaint. But if
> its working then I'd leave it alone.


Well, I dont set the text of the label in the EditPart. The
Property-View changes the EMF Model and the EditPart gets notified
(notifyChanged) and then the refreshVisual() method is called. So I
thought this must start the refresh.
Re: [Help needed] GEF-Editor doesn't update ... [SOLVED] [message #248223 is a reply to message #248200] Thu, 09 April 2009 17:35 Go to previous messageGo to next message
Eclipse UserFriend
Originally posted by: juergen.scheffler.gmx.de

Sry 4 that much post but I found sth interessting:

I set a breakpoint at
public void notifyChanged(Notification notification)

and this got never reached!!

Why?
Re: [Help needed] GEF-Editor doesn't update ... [SOLVED] [message #248227 is a reply to message #248200] Thu, 09 April 2009 17:37 Go to previous message
Eclipse UserFriend
Originally posted by: juergen.scheffler.gmx.de

sry to tired! I gets called, I told sh**
Previous Topic:Help in understaning Container EditPart
Next Topic:[Announce] GEF 3.5.0 I200903311850 is available
Goto Forum:
  


Current Time: Sun Mar 16 09:52:59 EDT 2025

Powered by FUDForum. Page generated in 0.05650 seconds
.:: Contact :: Home ::.

Powered by: FUDforum 3.0.2.
Copyright ©2001-2010 FUDforum Bulletin Board Software

Back to the top