Eclipse Community Forums
Forum Search:

Search      Help    Register    Login    Home
Home » Modeling » EMF » Bespoke Serialization
Bespoke Serialization [message #398800] Mon, 27 February 2006 16:15 Go to next message
J F is currently offline J FFriend
Messages: 242
Registered: July 2009
Senior Member
Hi,
I have a Model which contains references to EDataTypes which I use as
proxies to real Java classes. ( The model contains a reference to an
instance of an EClassifier which can either be a "bona fide" EClass or an
EDataType - the EClass serialization is fine in the "semantic" context -
not the EDataType... ). When I save I wish to serialize the EDataType to
the Java class name string in this particular context.

Do you have any suggestions about which of the various methods would be
best to carry out the bepsoke serialization/deserialization. This is the
only case in which I am overriding the serialization.

1) Should I try subclassing XMLLoadImpl/XMLSaveImpl ( I can't see a way to
use XMLHelper to do this )? Will that really mean overriding
XMLSaveImpl.Lookup?

2) Is there any way to use a bespoke ExtendedMetaData class ( what do I
sub class from for my one altered feature - BasicExtendedMetaData or the
subclasses of that?) to do this? - It would seem that that actual
serialization does not go in here, and there's no way to provide the magic
string for the instance of EDataType that I wish to serialize?

3) XMLInfo does not seem to help...

Thanks
Re: Bespoke Serialization [message #398808 is a reply to message #398800] Mon, 27 February 2006 18:17 Go to previous messageGo to next message
David Steinberg is currently offline David SteinbergFriend
Messages: 489
Registered: July 2009
Senior Member
JF wrote:
> I have a Model which contains references to EDataTypes which I use as
> proxies to real Java classes. ( The model contains a reference to an
> instance of an EClassifier which can either be a "bona fide" EClass or
> an EDataType - the EClass serialization is fine in the "semantic"
> context - not the EDataType... ). When I save I wish to serialize the
> EDataType to the Java class name string in this particular context.

Hi JF,

I'm sorry, but I'm having some trouble understanding the question. In
particular, I don't know what you mean by "the EClass serialization is
fine in the 'semantic' context - not the EDataType" and "I wish to
serialize the EDataType to the Java class name string in this particular
context."

The usual way to serialize and deserialize EDataType values is via the
convertMyDataTypeToString() and createMyDataTypeFromString() methods
generated on the factory implementation for it.

It sounds like maybe you want to define some kind of hybrid
EAttribute/EReference that can a value whose type is either a simple
EDataType or structured EClass. If so, that's not possible: there's no
way to model it, since EStructuralFeature is abstract and the eType of
an EAttribute must be an EDataType and the eType of an EReference must
be an EClass.

I hope this helps somewhat, but if not, please feel free to rephrase
your question and Marcelo or I will take another crack at it.

Cheers,
Dave
Re: Bespoke Serialization [message #398821 is a reply to message #398808] Tue, 28 February 2006 09:11 Go to previous messageGo to next message
J F is currently offline J FFriend
Messages: 242
Registered: July 2009
Senior Member
Hi,

Sorry about the confusion.
I am serializing an instance of an EClass lets say "ComponentDescription"
it has strucural features of type EDataType....

class ComponentDescription extends EObject
{
Re: Bespoke Serialization [message #398822 is a reply to message #398808] Tue, 28 February 2006 09:43 Go to previous messageGo to next message
J F is currently offline J FFriend
Messages: 242
Registered: July 2009
Senior Member
Hi,

Sorry about the confusion.

I am serializing an instance of an EClass lets say "ComponentDescription"
it has a strucural feature of type EClassifier ....

class ComponentDescriptionImpl extends EObjectImpl
{
private EClassifier component;
...

This can either have a value of an instance of an EClass or an EDataType.

public void setComponent(Class clazz)
{
EDataType myDataType = EcoreFactory.eINSTANCE.createEDataType();
myDataType.setInstanceClass(uk.co.his.AComponent.class);
component = component;
}

public void setComponent(EClass eClass)
{
component = eClass;
}

In the case of serialization the way that the EClass serializes is fine
because it is loaded from a known ( Read-Only) Resource and so a cross
reference to it is good.
In the case of the EDataType I create it on the fly and I do not want to
create another Resource or assign part of the same Resource so that I can
save it. What I would like to do is change the way
ComponentDescriptionImpl serializes/de-serializes its component structural
feature so that when it is of type EDataType it will serialize to an XML
attribute or Element with contents consisting of the class name of the
Java Class which the EDataType holds.

I could, I know, have a String and a boolean to say whether the component
was represented as an EClass or classname string, but that would make the
whole thing even more complicated, IFF there is a simple way to change the
serialization of that one structural feature component. I am not using
XMLSchema to generate the original model (Im using the MagicDraw API to
create an Ecore model dynamically).

So I had a look at ESaveImpl, XMLInfo, and ExtendedMetaData to see if
there was a way of using these to carry out the task.
It seemed to the novice that ;
1) XMLResource.XMLInfo only allowed me to modify how an already defined
structure was transcribed to XML, not change the structure of how an
EObject was serialized.
2) XMLSaveImpl/XMLLoadImpl/XMLHelperImpl would give me a way to do this
but it would require changing code in several places.
3) ExtendedMetaData seemed to be the interface to implement to change
serialization - is their an example of doing it this way programmatically.


The question is what is the best way forward?


Thanks
Re: Bespoke Serialization [message #398828 is a reply to message #398822] Tue, 28 February 2006 13:03 Go to previous messageGo to next message
J F is currently offline J FFriend
Messages: 242
Registered: July 2009
Senior Member
Here's what I am using now for a temporary hack. The question is, is there
any better way to integrate with the XML/I Resource implementations which
currently exist.

I guess my real problem is the "dynamic" nature of the save part which
depends on the type of the feature value...

I register my own factory for "*" which creates my own XMIResourceImpl
subclasses which in turn have their own XMLSaveImpl ( BespokeXMLSaveImpl
) and their own XMLLoadImpl, which in turn creates its own SAX Handler (
BespokeSAXXMIHandler ).

public class BespokeXMLSaveImpl extends XMLSaveImpl
{

public BespokeXMLSaveImpl(Map options, XMLHelper helper, String encoding)
{
super(options, helper, encoding);
}

public BespokeXMLSaveImpl(XMLHelper helper)
{
super(helper);
}


protected static boolean serializeDataTypeToString(EStructuralFeature f)
{
int id = f.getFeatureID();
switch(id)
{
case MappingPackage.SHAPE_SPECIFICATION__LAYOUT_CONSTRAIN_TYPE:
return true;
//TODO put in all the cases in which we might do this
}
return false;
}

protected boolean isBuiltInEDataType(EObject value)
{
//TODO check the Package it is in...
return value instanceof EDataType;
}

private void saveEDataTypeAsString(EDataType type, EStructuralFeature f,
EObject o)
{
String svalue = type.getInstanceClassName();
if(svalue != null)
{
if (!toDOM)
{
doc.addAttribute(helper.getQName(f), svalue);
}
else
{
helper.populateNameInfo(nameInfo, f);
Attr attr =
document.createAttributeNS(nameInfo.getNamespaceURI(),
nameInfo.getQualifiedName());
attr.setNodeValue(svalue);
((Element)currentNode).setAttributeNodeNS(attr);
handler.recordValues(attr, o, f, type);
}
}
}

protected void saveHRefSingle(EObject o, EStructuralFeature f)
{
EObject value = (EObject) helper.getValue(o, f);
if(value != null)
{
if(serializeDataTypeToString(f) && isBuiltInEDataType(value))
{
saveEDataTypeAsString((EDataType)value, f, o);
}
else
saveHref(value, f);
}
}


}



public class BespokeSAXXMIHandler extends SAXXMIHandler
{

public BespokeSAXXMIHandler(XMLResource xmiResource, XMLHelper helper,
Map options)
{
super(xmiResource, helper, options);
}

protected EDataType getDataTypeForValue(String className)
{
return DynamicEClassFactory.dataTypeFromJavaClass(className);
}

protected void setValueFromId(EObject object, EReference eReference,
String ids)
{
if(BespokeXMLSaveImpl.serializeDataTypeToString(eReference))
{
object.eSet(eReference, getDataTypeForValue(ids));
}
else
super.setValueFromId(object, eReference, ids);
}




}
Re: Bespoke Serialization [message #398835 is a reply to message #398828] Tue, 28 February 2006 17:37 Go to previous message
Marcelo Paternostro is currently offline Marcelo PaternostroFriend
Messages: 602
Registered: July 2009
Senior Member
This is a multi-part message in MIME format.
--------------070704060205020804030007
Content-Type: text/plain; charset=ISO-8859-15; format=flowed
Content-Transfer-Encoding: 7bit

Hi,

I may not be really answering your question and I will not pretend I
really get what you are doing ;-) but I will share my 2 cents.

Instead of going down on the path of playing with the dark magic of the
XML* classes, I think you could try a more "modeled" solution. Here's
what I am thinking:

Define a class with the following features:

1. An Attribute of the type EJavaClass, which is a data type defined in
Ecore that wraps any Java class
2. A reference to an EClass
3. A derived, transient and volatile reference to an EObject called
Component

Then you would

1. Hand code component to get or set one of the first features
2. Suppress the getters and setters of the first 2 features so they
cannot be manipulated from the generated interface

I am attaching here a project with the ecore model I've described above.

One VERY important note: we strongly recommend people NOT to use Ecore
classes in their model. If you choose to do so, changes in Ecore may
break your code and we won't feel bad about it ;-)

Cheers,
Marcelo

JF wrote:
> Here's what I am using now for a temporary hack. The question is, is
> there any better way to integrate with the XML/I Resource
> implementations which currently exist.
>
> I guess my real problem is the "dynamic" nature of the save part which
> depends on the type of the feature value...
>
> I register my own factory for "*" which creates my own XMIResourceImpl
> subclasses which in turn have their own XMLSaveImpl (
> BespokeXMLSaveImpl ) and their own XMLLoadImpl, which in turn creates
> its own SAX Handler ( BespokeSAXXMIHandler ).
>
> public class BespokeXMLSaveImpl extends XMLSaveImpl
> {
>
> public BespokeXMLSaveImpl(Map options, XMLHelper helper, String
> encoding)
> {
> super(options, helper, encoding);
> }
>
> public BespokeXMLSaveImpl(XMLHelper helper)
> {
> super(helper);
> }
>
>
> protected static boolean
> serializeDataTypeToString(EStructuralFeature f)
> {
> int id = f.getFeatureID();
> switch(id)
> {
> case MappingPackage.SHAPE_SPECIFICATION__LAYOUT_CONSTRAIN_TYPE:
> return true;
> //TODO put in all the cases in which we might do this
> }
> return false;
> }
>
> protected boolean isBuiltInEDataType(EObject value)
> {
> //TODO check the Package it is in...
> return value instanceof EDataType;
> }
>
> private void saveEDataTypeAsString(EDataType type,
> EStructuralFeature f, EObject o)
> {
> String svalue = type.getInstanceClassName();
> if(svalue != null)
> {
> if (!toDOM)
> {
> doc.addAttribute(helper.getQName(f), svalue);
> }
> else
> {
> helper.populateNameInfo(nameInfo, f);
> Attr attr =
> document.createAttributeNS(nameInfo.getNamespaceURI(),
> nameInfo.getQualifiedName());
> attr.setNodeValue(svalue);
> ((Element)currentNode).setAttributeNodeNS(attr);
> handler.recordValues(attr, o, f, type);
> }
> }
> }
>
> protected void saveHRefSingle(EObject o, EStructuralFeature f)
> {
> EObject value = (EObject) helper.getValue(o, f);
> if(value != null)
> {
> if(serializeDataTypeToString(f) && isBuiltInEDataType(value))
> {
> saveEDataTypeAsString((EDataType)value, f, o);
> }
> else
> saveHref(value, f);
> }
> }
>
>
> }
>
>
>
> public class BespokeSAXXMIHandler extends SAXXMIHandler
> {
>
> public BespokeSAXXMIHandler(XMLResource xmiResource, XMLHelper
> helper, Map options)
> {
> super(xmiResource, helper, options);
> }
>
> protected EDataType getDataTypeForValue(String className)
> {
> return DynamicEClassFactory.dataTypeFromJavaClass(className);
> }
>
> protected void setValueFromId(EObject object, EReference eReference,
> String ids)
> {
> if(BespokeXMLSaveImpl.serializeDataTypeToString(eReference))
> {
> object.eSet(eReference, getDataTypeForValue(ids));
> }
> else
> super.setValueFromId(object, eReference, ids);
> }
>
>
>
>
> }
>

--------------070704060205020804030007
Content-Type: application/x-zip-compressed;
name="ng1.zip"
Content-Transfer-Encoding: base64
Content-Disposition: inline;
filename="ng1.zip"

UEsDBBQACAAIAFVkXDQAAAAAAAAAAAAAAAAOAAAAbmcxLy5jbGFzc3BhdGid jz0LwjAURWcF
/0PIbqqbQ2sRqaBDlVJnqcmjjcaXmA/Rf29Vii46uL17OZzLi9PrSZELWCc1 JnTMRpQAci0k
1gndlovhhKbTQT/mqnLOVL5pQ++dAL29kaNEkVBnOSWP8nVG30musSO1rRlw JY0DdhCeqSog
b9p1tiqy3Xydl7NlnhV/2IwAxrUFZuEcpAWxUaGW6H6pdPAm+M62l/iE4+jz +ztQSwcI1Ryc
0qUAAAAzAQAAUEsDBBQACAAIAFVkXDQAAAAAAAAAAAAAAAAMAAAAbmcxLy5w cm9qZWN0vZJB
awIxEIXPFvwPsvcmeushrtCKN0Ww/QFpMsbIZhKSrPTnN4nZlkWEHoq3917m 8Q1D2OrLdLML
+KAtLpsFmTczQGGlRrVsPt43zy/Nqp0+MeftGURcQxBeu5imUzphyA20qBaM FpUjYY0BjC2j
g8pp7Ydi6Mh99rqTBwciu2rfUpWjLEmlWK8IiE67AOQsIxHWJ8EvvBTA/66Q GtyrPrND9XQc
MHpD+RPXSSBbjvoIIb4+FnsQJzD8X6A1GU6eeLH3UKev5v61r+95gTJ3r5NX 3ne90ri7KQw6
E3/+wvhnfQNQSwcIF9cSteMAAACYAgAAUEsDBBQACAAIAFVkXDQAAAAAAAAA AAAAAAAUAAAA
bmcxL2J1aWxkLnByb3BlcnRpZXN1jsEKwjAQRO8L+w+B9qjJD1TBg0IPevLo RZOlRtJu2CSg
f2/qrVDnNvNgeI3qLMeP+OGZ9wiN6syiz1PbuxYB4eEn7ScbiqOkdkpvbghq mZEdBbMCzsfr
YdtfTmsshjLU6/cY/sMoHEmyp4TwukvSlsfoA2kWRzLbICQuYknr2pJYg8Al x5J/Q3U3X1BL
Bwh44EINjAAAAOwAAABQSwMEFAAIAAgAVWRcNAAAAAAAAAAAAAAAABUAAABu ZzEvcGx1Z2lu
LnByb3BlcnRpZXOtUUFqwzAQvAfyhyGJb8Uh15IUAnYh0MjB8QdUe2OLKpKQ naj5fSWrhfbW
g3Vaze7MjkZLbGttHla03fAyny2xXf+5B2h1aFbzWah2E5ygU2nUuiE0dCep DdnngAKZBisq
1B1XLWHoCMaG9iCoxzsNjkh5WPSQQhG4asJQ5C6SJEHOMhSvqMo9O7/tqzzD qSxOeVkd8jP8
wGIkppFx5B9eA4rcz5oHFL/SE7gxFLT16CGU+jKWFyHj2mgx6oTG+Bw/f+uj 79+i6XTRTfkJ
/8lrSudG3lqhmA8YO7B2g6PPTHrc6rtoyH53nHMpffKrkZRq2wbmF1BLBwin SJdR9QAAAKUC
AABQSwMEFAAIAAgAVWRcNAAAAAAAAAAAAAAAAA4AAABuZzEvcGx1Z2luLnht bE2PMW/DIBCF
d0v+D9dTVkyjLlWF7a1Sh0gZkrmy8JWgYkCYVMm/Dxg3yS3c432840R/mQz8 UZi1sy1um1cE
stKN2qoWj4dP9o59V1eiJ2m0n+nBviU2W8l8YayuQEjnr0GrU+yy4s8yXWy+ xk1dMVaeeHNW
2hYHBF0i2RwL3mkbW3RBNevEhqaf1LtAjSJLYYg0fvtB/g6KME9KJVYNRaY6 Bw0t4ClG/8E5
n66TG8mUHHxg0gzznMF/YFfO/Zp/B9PoXTYWNjfcqm3+0CIQeLeECn5fpezJ nxa9AVBLBwgW
mV/P2wAAAG0BAABQSwMEFAAIAAgAVWRcNAAAAAAAAAAAAAAAABgAAABuZzEv TUVUQS1JTkYv
TUFOSUZFU1QuTUZVkM1OwzAQhO+R8g6+cMMW5eiqFxC3FlVU4u4627DCP2G9 rkifHqeGkN52
Nd/OjHZnAp4gsXwHShiDFiv10DZPOXQO5O5XncXHWXo1HrS4G1zuMUzLrBxG f4wObSVCv1qL
hKF3wMVhw5T/0WXoIvbZmZT2hj+0UAs2dJGmSIpn7IBuQrfRGocXw1e72qpt Xr6HSCz3xn6a
vpTxo48duPu2+RsV+uFmz4yubd7gKyOBrO5aROoVWIdDAmUjgaIcGD1Ml0sN /KnMBVifMeER
HfKoNwRwLVIKVU5uzWU8sCHWoj7kB1BLBwgzkY7m4wAAAIgBAABQSwMEFAAI AAgAVWRcNAAA
AAAAAAAAAAAAABcAAABuZzEvbW9kZWwvbXltb2RlbC5lY29yZe1UTU/jMBC9 I/EfLO+ZuJQL
iloQgoJAIBCF1V5dZxoM/ohsJ23/PeN8tZF66Io9bhWp0njem3nvJZ5crrUi FTgvrZnS02RE
CRhhM2nyKX1/uz05p5cXx0cTENZBOnvh4ovnQNZapj1qjKjjI4I/JDM+xcMp /QihSBlbrVaJ
1XliXc7+PN3TrsUPW1Zndcd4NDrFtse5+ADNT6TxgRsBA/Z6kwEYhJKFh5oB 9DKyjNkstlFi
uMZmvdE2A9XyGP/+et8zsPYwgRbhXxws5XqLuoiwCVwr7r1cSpRNcP80bAqk bo2pD7tx11YX
1oAJN+CFk0VAmxqWyDMPrhShdFzdAsd/2EN3FYKTizL0Cj55xdsZ8LbbecMD jwWSJKx5ClXm
0jB0o3cGXWnksVpRY05T+cXY7KEnb5eMa14ZYwOPq3vibenEAabfgXnaWtYy ZRC4VJ58wWZK
fVkUqNhDdgfht/RyIZUMG0oqrkqcgN4AZQfA54fAJ2xXRpcA2xPBX6XzCktw EF/MNh3YG01d
/Eku/zP5QSai+wj/eSzPi08QgW79qKxCNarTSoLjxksc3RUycLKCbOAFSt65 UeIdy4aXLJa+
AVBLBwiMWIBPwgEAAJ8FAABQSwMEFAAIAAgAVWRcNAAAAAAAAAAAAAAAABYA AABuZzEvbW9k
ZWwvbmcxLmdlbm1vZGVszVVNa+MwEL0X+h+Eel4rzWkxcUpJmiWHlFC2sIde VHvsaitLRpIT
59/vWLZc3A/iPSys8UHSzLz35kNocdOUkhzAWKFVQq+jGSWgUp0JVST08efm 23d6s7y8WBSg
Sp2BjH+A2rUL0pQiHgLnGHh5QfBDPGVjNCb0xbkqZux4PEa6LCJtCvZrt6W9 C6TawMgJUikq
C94RypzNZ7M5u2vdRthByvnYoJUSH7AWBlKnzSmhTBXXzJq0B/bmvawLobbr hKKxD7nnJWq8
b/eirLRxYFoHZBkYkS0KtshoG8TWFjIUsOfpKy/AJjSKWPdXnoi9B/EFYZ62 yzoKmV4x5o10
2UK3vbhVSjvusPaWWF2bdEIlQzUYNJ3akYLGZp2CKJg7tq/5LEgsJ2Qhw+CP ERk4LqQlr3Aa
dLHy5JPpWCg5cFkjSjhFfsoCIxtTThTyADkYnN7Jks4MXZDYNWOKwBFJFsbt 8WE7YEU9xqcI
ixyJRNG1abmOn1xZPeEwRmUmF2xkDIMQMiWVgVw0Cd119aQkE7bSlj9L2Bt9 EBmYDe+n35ka
s/N96OPf+uBPr9i55v+rYfua8S8HZSW5tVgXT+M3H3JkK433VoFya7CpEVWL MRayAe5qgzCp
wRWsXoTMEppzaUMBe4+E+l18d+ucEc+1AzKFjf3mB+7VDTm9I8bcRH4aOCfr GC7DNB3wP4hI
w+G4wX0r3+5NGPr2YWIfXiY8/QNQSwcIptO1tCECAADXBgAAUEsDBBQACAAI AFVkXDQAAAAA
AAAAAAAAAAApAAAAbmcxL3NyYy9teW1vZGVsL0NvbXBvbmVudERlc2NyaXB0 aW9uLmphdmGt
VE1vnDAQvSPxH6abSPuhAveUrLZKqyqHqlUT9VoZGFgnxka22XQV5b/X2Hxt AlFTlQsYz8x7
fvPG0Wbje7CBOBXVUdJir7duHZ3+sD/Pr7Pz5iPyvYqk96RAKI+lyJB98D3f o2UlpAYhixBT
RiuFIZa5+RYSw8/fkjtMtQ2MOtB3QQAJFpQHtUIZZCKFIHAEPoLESqJCromm goPIQe8NYAMH
whaDZYzlNk62V8JAcxMKn1ClklZNRhwl2zgyActwQEOevcByu5XDvTUYuWBM PFBeQI5E14YF
EImg6qo5IGYXLqNmLgUgZnT7uGOU33eChD2lEaOzAvVAteHeryzRpzgyhVr9 u+pxVA0sdwp7
zcOv7v3dteKk+Ah0tXaZTrjuQJeLO3IgV4woBWhfC2gPY59+9/ZYoQsOGeFF 2Mb2+zdGFFNP
YfYF9U+qaEIZ1cfLhZY1TsbdTMSNoXGEO+OllgT+DYPnQbPwuwI5SmL623m8 ThhNgXKNMicp
wpS8gL+1MZWC1uC+92jSwVkcTNkfaATnypr3QFiNnZNfmHcwrPF+jhJ5imFb ZX5UoDdv83Xd
TgkS3vh3DHXqtREGUMWXGlKGRL5v65gs43iJhLEjqL2oWWbgzfRJy59ANpKg iQ3DnmrUs5kb
uWZvJ60wM7rMku1Q7CScqZHnV20H1uOIt83Kr6FYX8XNjZaEK2o2OlsdBDP3 EsNunaGkB8wG
Q8FzS4E1FXRGgTGH1dpejGPfGJ9OmeZ/XDNv99drfayIJGXLsqHI8eHfG3oq ymsyHgTNYKr/
DtwJ+gRRNDm2vvcHUEsHCEnVPuJfAgAA+gYAAFBLAwQUAAgACABVZFw0AAAA AAAAAAAAAAAA
IwAAAG5nMS9zcmMvbXltb2RlbC9NeW1vZGVsRmFjdG9yeS5qYXZhrVPbSsNA EH0P5B9GKFQL
ST7AGJRaoQ8W0f7AZjNJV5PdsDtVi/jvbjbb0psFsU/ZzPWcMzPJaBQGMIKU q3alRbWgrP9P
dg3OOJgWg+6RhEHL+BurEJpVowqsr8MgDETTKk2gdBUjr0VrMMamtG+lMZ48 ME5Kr1xksu56
EUWQYyVktDSoo0JxiKIewXyBkOaZT0uTPINSaSBrdi1jFzUlaLV6FwUaYMA1 MrJ+pIUqXDgy
vgCpZMRyQ9rWAl4zY0CV+5UcFpTFIZJbgxui8WP/fer59/4KJWrbuFiLs8xr wUFIQl0yjuCT
PBfAT7KNDKw1CYMvmwm9KuC5GyGrGklJW8cQk7aMB132WbEP/l1EOEEL9oGD gw4HWKezl/nd
bDyBm40GdtAbIXzctDMJKejyyk14m80z0lLLbj4SP0Dlr2jHYLn0kxim2GRj ZXdHoiS4R8O1
aEkomSbWMzwDTe0A/LP/UbE2eVtpfguPuU6I0w12fVRm2XaXhAXkK+sQ5owj 91r8qd2pPfGH
ABXSrsVz/YYk2V2VMPgBUEsHCEN6IhOYAQAAdQQAAFBLAwQUAAgACABVZFw0 AAAAAAAAAAAA
AAAAIwAAAG5nMS9zcmMvbXltb2RlbC9NeW1vZGVsUGFja2FnZS5qYXZhzVjd b9o6FH9H4n84
653UrRpkd3tbGSqiqcS00gro1X1DJjlQ3wYnss20aur/fm3nO+SDMkr3RLCd +PdxfOxj6+ys
3YIz6Dl+8Mjp6l72w/9WvsE0vh25b/WD1W4FxHkgK4T149p30Ttvt9otug58 LsHnqy46Hg0E
dnG9VM8+x649kJLTxUbiedPIoUeEaBx1GyJoHDfBJXJkDhqMVsz3TacDC1xR 1tkI5B3Xd6DT
CbnP7hF6i340Qc9a9GHpc5Cq2ZDtmlEjCY7PJKFMAHEcFMLnIh2IkoC/+A8d KUD6wDHgKJDJ
cPaNF04F0PNoH4lzD45m/aFnqf/FriUSueEI/hKahiLbrLd6CHPDF12iUMnH ANMRPSvGYiRB
5m4LciEwcbp7Hf5eEUf6/DHsNy3wQJn79SSKjJOwZ4UMOZHoxnGzWXjUAcok 8iVxEKLPRWID
/pQKgoDY3nbrl3oTQtsgMicOPkbW2I3aqw2FGm5QxAgGJcBUBStbAY4H1zZ8 hZOI/YkJojo8
ItCs7iajlwY2natJNLR7KYMvlmXFBpm43xXoMSSczm8n9tXo30YdhRrvofSZ ig8hiVqzOuRl
CvyFkBZjcDSezgbjoTY+FlXlmCT0o3Ej3UQZle/el7LJpACgbpIZTn9deJQ9 5L889FUOYyo9
XKJwOA0k9Zn+PvRw3U86IdPbs1TP02mYCw6gS3aJ10KqfGFbnb9WKMs+8+59 nRsqN8Dw5vr2
ZmyPZ/NLezqcjG5no5uxsuNjqdJxfsyqrIVTSfwb+UHAbCg6jxvRToHEW9Hh 4wkufO6q/WYn
QvP5t8E/g/nw+2A63YecXSTG473u1YnZMam/n0sqCZg/klfSrKh9KqWmNuAF cp24hOQbR9Ek
XsxXxPnstH5dH25Z/xbbK3swu5vYivSdIfzZEM5TnqAipo5AhUOPsdWQ2Ep4 ZRmhMc8dQApu
kNYBbTAlxpBLfWVs6rJbuGahMjNuxVSdwLotSWa7C51NikdQt4CyBMHzpdXj 9tte0kKkyoS5
RmfA7WFHkqp2t8M+rhUZhIXZj2pDUpdV2mAfx4Mc/nwiei1P8gB2tyVHJdX/ RV3KzFdr1DIs
GNUzUZUzVxsihh3xWT/ZHJMi+3Ca7zl5XbUQFcBal3xLiQ71JC5xSZlC4FFV FBOv6hJBQ89e
I0B6kQB1VwmFzvrLhMLg3HVC2ld9oQCZK4W9arH0ZuB7JIduNZcAqaJlJVak 3hHqrCZH63nv
UW0dqN4q0TxWPTmXVBVeSU3cbTq5PNOlneq0OGgPpn+lCunhYJeKrVGVkqPE fvpUl3rH0ybd
C5qKvmZd7EOIUlsq/kG6ZIvGZmm2N9Qn/fMElpVf8u3W/1BLBwg8FXuN+gMA AL4XAABQSwME
FAAIAAgAVWRcNAAAAAAAAAAAAAAAADIAAABuZzEvc3JjL215bW9kZWwvaW1w bC9Db21wb25l
bnREZXNjcmlwdGlvbkltcGwuamF2Yd1Z30/jOBB+R+J/GPZWS4po+g6FhQPf qYiliHZ5RWk6
bbOkcS5xChXif187TvwjCQsLKJy2L0lsz3j8zTfjsdvb2dncgB3o+zReJ8F8 wQ7ld89uyBs/
D6afxUtvcyP2/FtvjrBcL+kUQzdYxuH+5sbmBn+hCVPtJ5R/RxixU0z9JIhZ QKP92qhv8nkp
lZp6aDJ30Q+DOEUXlzPXp8sljdyIsmC2di/EI/C9QuuTUujTBF1yEnppuv/c qOHkB/rsuWGD
iGESeaEe/oyAQMglpsUDidkLpOQcgxLjXum0rW4XJjgPom6WYtKdUh+6XenA 4wiELC459vls
QGfAFtxjAmmguUbY7uPysD85VG4Cw0/93uSw3+MDtl09HUbT+mT9WD7HXP+M hiG9C6I5zNBj
WYIpeAlqY3C6J2WyUAoB9MPg8OEoDKJbi0+N5BEg/DVHduatvNyfIJYgviD/ zA1+7Pe4yjdo
J1o1eUe1GmahWX1Vlfd7JTb9XqzD72iOESYeR7AMwmwSBj74ua1PzQt4z7jT UjBYpL3RLLe5
8cCnAMkzKBw7xZmXhQxWXphhyabtAgLLJU6n0Snb4DGWBJOMoVvofZrB8AvC ib6jFLE6a9ll
4pQ30GSKSfnZE484oYyDgVNIRXj4MAt4MEtr4ez4+vjm5Px4NLohp+Sf4+/n YziAKAtl+FWB
8T1/wRX9YbhIKH6oMDtoguVVeBATDGIBkeCMGxT57wkEeQsKRSLAEoNGErzB yIoxVR88EdNy
MXmMAqRZjInT2Rdfj62ZVgIzysPHgLiwKkGe+yOwd3b3POC7phem7snw2+Xw glyMb07J6ORq
cDkeDC/aWYJMmtL8epzY5iv6t2naigY8LZmWSWMjvFNNpq2yl4bTMyNYbcvB CmRTUdEdzMBB
szi5wv+ygEeF05GBw3+yf+1wcagVMg5bBOkumM3uiIx3qwxodPzNjc4tu9ZK drXhnZYoLp1A
FEFInR05WnLAlswJ8OVLkSRcHKSXCb1fK+QeSgArNaNYKCl94lQ6O2i6B3QG cqRIB68wpeEK
5VxKVUdJ2EbqAWW/Mutl3n8VA67IaHh+TV7KAqIZQAr3o+l78XuUL49WnGLr QVo4buKlgf9v
I0k+zLQyfxQ2EZU9SC11EJU7FBEt3qGRMsj/KV88x5S2WFBEslnbWyQoB/iq 8j9QnDEk9i3K
6MFGdlGNRoKBr2CngVoWUVId2NMqPgKihlUbOPV6MB6eDvf0yQQEQWCJbEGn wGiJTV5MKh1G
xaj0dA9hSiGiDHhdNKPJUlQt92s+kgOVyeNNMZREKT+gcp0egzXN+JAlXaGx HH4qh6WX3ELA
zNaL4VjqYIuE3onggO9cVSwO8jgdxmIYn4fc+5jXbG1VZ3b8a6RLH3BDVePv oc/VvQD6PxPP
Ajzk5HUCDk1xrzE43YUJpSF6keTWCnWDuLwZr2O0CvW7gPkLcJR8tT7wvRR/ u17a0xt0ESJ2
Ubv/Cu2kqlmk+2KNHWMaUp1D2VDdF19jhWp+3pB6Km2wpT7ILiLyg5Sbu9lw sXKtcmnrsYyj
OvN0RF+Lc3arPLPOJvJw0lGG1PB/FwLqcqasf993wiauWSm0zKHPz1uQqmDT yGaTLd0qiXhG
rdLo41jTcJfUHnN4RdU6a341p80Y6SfthjaZUm5fvMSs5ZyP2Moab2KLmvir cadR1sl7sNUg
4vKziRemjr5KeBdmWQe80oT3otHTe1dlpsY9TLrvYzg0Yon494dR+VK/ONH3 I7bVWqK4YYVC
19/ZjFeaYicW/z/kh1Grx6nK6/OUkHC9OObrcD6BZsAefGoeVOOI3b3d2a4c 1op+y/gC60de
Ez91hbu58RNQSwcI4vKPL24FAAB7HQAAUEsDBBQACAAIAFVkXDQAAAAAAAAA AAAAAAAsAAAA
bmcxL3NyYy9teW1vZGVsL2ltcGwvTXltb2RlbEZhY3RvcnlJbXBsLmphdmG9 VU1P4zAQvVfq
fxgqpE26anKngBaVrJQDbQW9r1xnmnrXdSLHWUAr/vvaTtx8NIBWWjhlPB3b 7715nobT6XgE
U7ikWf4sWbpX19U67CZs8jxOzk0Qjkc5ob9IinB4PmQJ8oAdcj4fj8YjHWRS HfPTdjKTaYCU
s7zAAA87HWcSg2jBSVHM36tabX8iVe+WrStg719rEAfRd0JVJp/jHvzhLTkv UyaCyCzWNrZ7
Qqfh2WwGW9TpWVmgnCUZhdms0vNGgLkQDygUUSwTkO1A7bWARia43F7XSC7D 7XXQHIciOT3s
W4oCJVGYuG6UW84oUCMk3FXSt5gBPil9UAFtug2e/pbx6I8+FypaoO9bSNSX FRZvgjtScgW7
qrbHKqh3vC4FvMEM+tzAsgOo+RXmEtpDC0ww5fmmzMIGUIaCCeo19HdoHr3M FXjdjO+MFNxr
FoU+MoiXD5ub5SIKUlROSG+yVyq/CMPQGd46ZeLPwd3NduCdXnh2BaLk3HdV R6gAElUpxSnI
uSt5qYL6Q4mie/CiJ4q5NRa6yO+p0PJtQ4ZnqdfsmHeOrpEIfBwwlVcVv5gX MGQWoh0vdMcE
Ref12jMfa5IhpC1zFGWO8jXsH4OoHl1ArTJeNe8A7acD7ZHZVla/GJvZgO0Y yvjW8/v9pKRA
R9e5dbG6W6+W0XLz4zZ6WNzH6028Wl64TlYIFpkeckI/2VssqGS2855/tFf9 wi8aR6q9zB6t
DWLOMSX8RqalefNH03mTje5vNX++TOArNByW5ICer1OTL8AKEJkCAr8JZ0lV b+lNOs77pL4M
6fCmRK1eDRXYqUqHDr2y4r2256i969JA3Wf6tWsp0D3sZjpC1Ji9bolvZuSx /L+DTzCXSBv0
//Cv0WL1Bp3eq0I3LhsmLxCGp6NmPPoLUEsHCKu6X5OqAgAAUQkAAFBLAwQU AAgACABVZFw0
AAAAAAAAAAAAAAAALAAAAG5nMS9zcmMvbXltb2RlbC9pbXBsL015bW9kZWxQ YWNrYWdlSW1w
bC5qYXZhzVjbcho5EH13lf+h46QqkMLjZB/jxBuCx9lJ2eAF7MobJWYEKBlm KEnYISn/+7Zu
c4EZ8GZtb15sdGt1H50+as3Rq1f7e/AK3oXpYsXZdCZPTPuo3KE7XwTRC/Xj aH9vQcJvZEph
vpqnEY09Nl/Ex/t7+3v4I+Uy6++k2E5oIk+pCDlbSJYmxxuzLsz/MxLKlK9q xy/NpsV9Uj71
aBizhaAenU/wd8qp57el5Gy8lPR418xOTITYOSvfefu8Pp1QTpNw90z1997x KHQzJwIH9ZE7
u2eHhzCmU5YcLgXlh1EawuGhOcd2AmoxneMREAU+pBOQMzw4BSi8G59Yq++O xidebo4m0aax
D1OaUE4kjRwLluOYhRAqDKF8SMpLoN8lGhJQdD33Z33J/t5PtAsmLNgaGGzx E9Y9Be0rwIKz
G+wCc+YQVlDTDr2HZBkbkIv+dDjF9QIIgpoISfCct8HZAo6+C4mMiOCWyZk1 8/NDzJJvO6jm
9fVavoKNnjsYr/SmC4ebNutS8qofwA2Jl9RzQC1Ouqmkb/Ua3ITTUMItQRsp hDqkojVgAm4Y
0V1CcSa0ZiYmO2FO5SyNXBTPWcIkqD+N5l0LbmcsnAGJRQoLyicpnwu7XE1h JGY/SjS0m7YQ
DURLLnkidH8BOTfF2ZkAnhpugZ5HK6QYzhPef2eMoPS+R1JcUi1Rz2l3MMKD KM58bkC6D0M3
U8ms0/kBIJaIbcNu0YKyeno06A6G7W7Hbx6r6XfrLH6krDJcgXGaxlQliAgw XDy+90icWNC6
ZMqTBH+SJMp5Qg0TyjkFSCnsZo5VOnKzUI2QZAUpruIClpjclo5I0IgulBJ5 AAOtP3a56UbB
ZiqtOUaBQYgJQ78xx0ISI8enej9HezSKvWvLpSOpQGDRDwpRqhaiO7gWf1BE APceFgxFiBut
SQ4VCksQk4oNIqbyN161cAb2cvSGOn+UyBhvs7xiUtB4UpCC3qQ0w2COWlza T+HRUoHm+2oo
rZkZuaGQpBJWVGLENCnmqxEnxnMhMtBOGBfSCo4lkN48X6oRovmWahWaSgqc UPwAeZsi3ehC
vHUsoJIcGglOx18RHmHYgP6XdcbYtD64s8JTcu5gq7BXCwTTGp9kBl6Kqs3m KKZcXf0oqdYU
nrHQtwNJNCELJxAkN2lYUMGcE7cMPVa4kslEibSic+a5nBGpkXfOWgXU+Be8 fiAtrJQwg5zN
x06KlMFrPNe0TOaMK7XzKnXE1BJWRsoKCLl0WgnEW6DhJKZpbw5olFc1N4Tb c9LoTal0o2ur
PBt30yoWatYR9MaSIPGQU/bCLBK3dA9XlUF4/mvxvF/3Vc1rNu7psPMwq0KQ RhXb/rlZOuyw
9xYSelt5++RoFIRd8iUtohRkJ4+Jo1S2pK9mWrHwza8qj+rCq1EC3dwQmVDp vIuIJC7tzMQN
cL0aktZ46sQgM19ndguvi6YvCP9W8BVrLJZELFSR4D0UkuSlkkwIZySZ2gSo 2GzCKf1BC5Yt
xTdmPs0db3LTVsdInapnXSk/rbv1NfaT+p09B+t8H30mN8RScDOKRm6gWR+R TqkB5kSIi0h8
hrRacooG1UDj9RNVYzbi7CFaG7G/Jdxs9S+H++Z3CzfrfKyI/3jSiMs1v4q6 3FMZZXlKU4Vj
fwf2Imk87Zshfyx0rArveC2Yt3Z1tVco89ZK7ey1MF0SLHEjJcq2hHWVlirr sdhieWmG2a7r
Yl22PkBNteUwb1IWwZbSqlTzWKRc0XPsbuUcwfVr2d6j+iuN/noR2QJ9Yhls Zm79HmK8s5rR
6V1c9rp+dzg69QedfnA5DHrdpvXEzswUs1FvtwWVlkajz+3r9qhz3h4M1qxm aforVv0Ht5h1
/19pExQeRrWpk6pSzH7k2foVJnsL5hlmMyl/Z5l8+q0zaccDZOMFYQHcyKgy uFuK3VL9L6js
krkqqtsXviOb6hSX+ERk33W1fdn3z4IvpVEswBvbnh7qEVnxwWGzqlYnWmrj Y6PYvu+zqFyp
V3jWjiLzKUquFkqaUycxNYV2QX+c8hwDQSPpQp0nUsUMqo8ayDTKbXDqPK3y bM3RijEvNGMH
VYMHLXgWDEbtj4Nhv90ZmlbQHfr9s3bHbwG2Pvldv98e+qcjB1FZlrRrudTd o7psrR+Pxrw0
4eCra6GH6kN0C1634M32CJXvGEZ3EKAcmeZ177w9DM5NJJ2/2t1PfvujaqrB q+7AHw7zdnCq
p111g7+vbNep3w+ufdPf62PLPy3FnUvnrhqzOuhs0MR4QB87Zi3Xg2BoRvv+ oHd+7WMu9r4E
/mATlgeHo1CDViPS0+VMAZKM7/8ClTIoj4dJPSTrlQcmerrkIS1evH3bV9Q8 e4Pe4dLNbxD7
e/8AUEsHCETZlmnzBgAArBwAAFBLAwQUAAgACABVZFw0AAAAAAAAAAAAAAAA LwAAAG5nMS9z
cmMvbXltb2RlbC91dGlsL015bW9kZWxBZGFwdGVyRmFjdG9yeS5qYXZhtVbB bts4EL0b8D9M
gQKRA1j+ADtGCzcFcth0sc0hV1oa2WwlUiDp9RqF/32H5EiVFNtxgPQkihzO PL55M+Ts9nY8
gltYZLo+GLnZumX8n/UnwuTHh/yjH8zGo1pkP8UGoTpUOscy3TlZzsej8UhW tTaunb/tTmqz
STErZW0xxapIM11VWqVKO1kc0s+5qB2a+ZXmj/4jg/2VO8iobKJ8FZnT5vBA U5ccYKYNpvff
1j8wc8Fw1hD2YTqFNW6kmu4smmmuM5hOI3lPW4TFesmhgGMtZuslFNqAo+XI TrB+cFAb/a/M
0YJQIHgXZSTHZWZQOHx+fvYJoX+o0G11HvygyLaQlcJa0MXQa8CHKn+J7pPF 33n7K37/jumM
6xtUaChq3uR6ty5lxpF4Q59GwP8cxbLwkt3x6Be5gUgbMDkZIcc8wgWWUsrr 54mFC8eCIXAI
0MFT6yh3FM064egY/RND9yckuIt1FdgPaZGK9qsMG6qbNBXxqH8KfaT+JOnJ xFsEdgFkAUnv
XHd3oHZlOYnLbAXQtxmQkeLD4/enz4+r+3m0P/rPccjKP+h2RlnYb0mL6PUs bcMD0FDUNYEW
6xJbubtD3TKnQzFdR9iTd+3rFitUPn9ageHwsUCc2WFTG7IbwCNByQA5zze2 URtVeoDaTWzc
NiylV/MW8bwPG5dEsNa6RA/YsgC+avNEnpJvDDx8hqLgU5EcupkeyoLP4Mns pr7noiGKgHND
POMlSZp1hpTiyveOZJJu0N0zhGQyBNWPzM4KUdq48kKHvpPYvXTUBT2T5Ag3 oVydDhMXO6j9
4/2Ga+t7RNgd38UTKtz3jZIhoZx5TnAmLK40XVSKauEL2szI2ldEcmqyK4ee z5bZSMypvdxn
ksm82XQ8jSjHQuxKtyJgTc6vjcvmZ0MdLzXjtvlyQXErEIb0xWl+h/TWwogK otduYyF5BQBt
0TbV070WXkd2qdabp0PkqiGpefIwpm6pN6XHppOOqtJcs7zauuT9v8vqDNNB ot0jCdVpk/FB
cPPrUynVz/ZFcVKMC6yW7QJ0VhYzWjnevOE2YM2duxX8pQfWNwDhYO+fGooe SlaW1Iw3il5z
oYzsnF1KR3cChSp2pc8rm4hg5Fu6vx+oq8t4RewlOc+Er2FBI7dlb8TLYS8O b7ku/N4Ou60o
uo+zU1S+WTwXC/ylgjx/p9vteVXE7hvT4vl432y+B6tXszVsS68RdITZ7OTr bDz6H1BLBwia
R6YFnQMAAFsNAABQSwMEFAAIAAgAVWRcNAAAAAAAAAAAAAAAACcAAABuZzEv c3JjL215bW9k
ZWwvdXRpbC9NeW1vZGVsU3dpdGNoLmphdmHtV01v2zgQvRvwf5jFFogUxPKe 64/twvHBwDYJ
Gh9yW9DS2GIjiQJJNTCC/PcdfsiSbdlN0AbooRebIofDN2/eUKPh5WW/B5cw jkW5lXyT6ql7
Hu5P2MkPi+SDGQz7vZLFj2yDkG9zkWAWVZpno36v3+N5KaSGr+wbs5PRv1zp 9kq947I9KeQm
wjjjpcII8zWNhcRoPsuYUqPvWd2uvmLszhjW4fwxGMAKN7wYVArlIBExDAYu tGWKMF5N75+4
jtPxcDWFtZCgadYCu1DAixQl16yIEVKOksk43UZ280KDqkqDRtktMcsyeP6U 8eIR/kyEcxp4
SCHsZoSbeLFOtKAjvolHtC6I+gSnMVP48PBgeKcnyFGnIrHIkMUpxIYJEOsG 55V1pTSTmhcb
oGNSu8hiXbFsf4M73W5gRQKlFDFiYrZVpTXojNjaVwUlERgUohgUFQUrUVWZ Bq5opCtZYOKQ
PKWccHJHizfyxyvLQdRkBovkOC+fFDZ6+uz+75zM3PoGC0KmMak1WK0yHvtI /QZHd7/3TDbg
1AA+5zHxiIkjD8qdYzgrFzgDGQ5BgYUFhl9NfNNhlB5NEPejgfaDlW0b6kwi uVOUKMqKcik5
4vE9QDs293gMQrNiuQTgawj2wphMwCgidMveCmDf5iD2CBc398t/bmbzkbM3 FWF+DkigslLd
lXGmJLxYRYFem8oJF1rCHQHXsOWYJUapTPvpn0CqO9KiWXOp9FHJ1PUCqy3h 6gzOXCfRK7Lk
7hc4vHDM4fXd08qcR7azbqwitFdsEF61t45+5+RNOdmV+1FaLLuWWju6gvOJ MiW2M6bciEIz
TgcGoSm2dh0dFl1Xip2XDWo74Gu61xfXXan2VQiAmcIDx+b1DXhflSiX25Lu pQns+Z43S0Ht
rYZTP0HbQcTVPC/1lmL6uzEASHDNKCMzIr8l0BA+7hnV8Xlqw7ZjQhP8dTq8 34L+cUHzQjtK
vJq+J2j3xoKgvedQugbd4Vtidvv57vZmfrP873p+P/uyuFsubm92SnhuJDET 1BoWWOhrVLHk
peaUibhrcgJBl3HYAB81bn1QntOJxdi1O+g6Kmw5MhVde/Gvy8brCcm3tvt0 e1XV8y/1wDv4
uCv/sw67q+CLF/F+20aJRlmSW9tcNj0ksKPO5GKM+XRHDrSIGA9p5eJ1ql+m 1DpSn59hTl6Y
TVldX4a2kbdzcwbUcU/6xGlMuHNekKJPtUynSqtkkuV1mGYvtdZ0pXQ3X+1C fFfWbFfcfFmc
/QQKjxqC8PW9xEmJd5aYONVk7HL1TkLzgf0y0rqCVWXkYo5wsdFV59gk/Nsn tv1VxdfJ5Jvk
9oZGtXUx1W+MV0roBYbDg4+7/wFQSwcISU5sWfwDAAC1EAAAUEsBAhQAFAAI AAgAVWRcNNUc
nNKlAAAAMwEAAA4AAAAAAAAAAAAAAAAAAAAAAG5nMS8uY2xhc3NwYXRoUEsB AhQAFAAIAAgA
VWRcNBfXErXjAAAAmAIAAAwAAAAAAAAAAAAAAAAA4QAAAG5nMS8ucHJvamVj dFBLAQIUABQA
CAAIAFVkXDR44EINjAAAAOwAAAAUAAAAAAAAAAAAAAAAAP4BAABuZzEvYnVp bGQucHJvcGVy
dGllc1BLAQIUABQACAAIAFVkXDSnSJdR9QAAAKUCAAAVAAAAAAAAAAAAAAAA AMwCAABuZzEv
cGx1Z2luLnByb3BlcnRpZXNQSwECFAAUAAgACABVZFw0Fplfz9sAAABtAQAA DgAAAAAAAAAA
AAAAAAAEBAAAbmcxL3BsdWdpbi54bWxQSwECFAAUAAgACABVZFw0M5GO5uMA AACIAQAAGAAA
AAAAAAAAAAAAAAAbBQAAbmcxL01FVEEtSU5GL01BTklGRVNULk1GUEsBAhQA FAAIAAgAVWRc
NIxYgE/CAQAAnwUAABcAAAAAAAAAAAAAAAAARAYAAG5nMS9tb2RlbC9teW1v ZGVsLmVjb3Jl
UEsBAhQAFAAIAAgAVWRcNKbTtbQhAgAA1wYAABYAAAAAAAAAAAAAAAAASwgA AG5nMS9tb2Rl
bC9uZzEuZ2VubW9kZWxQSwECFAAUAAgACABVZFw0SdU+4l8CAAD6BgAAKQAA AAAAAAAAAAAA
AACwCgAAbmcxL3NyYy9teW1vZGVsL0NvbXBvbmVudERlc2NyaXB0aW9uLmph dmFQSwECFAAU
AAgACABVZFw0Q3oiE5gBAAB1BAAAIwAAAAAAAAAAAAAAAABmDQAAbmcxL3Ny Yy9teW1vZGVs
L015bW9kZWxGYWN0b3J5LmphdmFQSwECFAAUAAgACABVZFw0PBV7jfoDAAC+ FwAAIwAAAAAA
AAAAAAAAAABPDwAAbmcxL3NyYy9teW1vZGVsL015bW9kZWxQYWNrYWdlLmph dmFQSwECFAAU
AAgACABVZFw04vKPL24FAAB7HQAAMgAAAAAAAAAAAAAAAACaEwAAbmcxL3Ny Yy9teW1vZGVs
L2ltcGwvQ29tcG9uZW50RGVzY3JpcHRpb25JbXBsLmphdmFQSwECFAAUAAgA CABVZFw0q7pf
k6oCAABRCQAALAAAAAAAAAAAAAAAAABoGQAAbmcxL3NyYy9teW1vZGVsL2lt cGwvTXltb2Rl
bEZhY3RvcnlJbXBsLmphdmFQSwECFAAUAAgACABVZFw0RNmWafMGAACsHAAA LAAAAAAAAAAA
AAAAAABsHAAAbmcxL3NyYy9teW1vZGVsL2ltcGwvTXltb2RlbFBhY2thZ2VJ bXBsLmphdmFQ
SwECFAAUAAgACABVZFw0mkemBZ0DAABbDQAALwAAAAAAAAAAAAAAAAC5IwAA bmcxL3NyYy9t
eW1vZGVsL3V0aWwvTXltb2RlbEFkYXB0ZXJGYWN0b3J5LmphdmFQSwECFAAU AAgACABVZFw0
SU5sWfwDAAC1EAAAJwAAAAAAAAAAAAAAAACzJwAAbmcxL3NyYy9teW1vZGVs L3V0aWwvTXlt
b2RlbFN3aXRjaC5qYXZhUEsFBgAAAAAQABAAxQQAAAQsAAAAAA==
--------------070704060205020804030007--
Previous Topic:references in model
Next Topic:Multiple table viewers
Goto Forum:
  


Current Time: Thu Nov 27 20:05:37 GMT 2014

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

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