Home » Modeling » UML2 » Read OMG XMI resources with profile applications but w/o Ecore extensions
Read OMG XMI resources with profile applications but w/o Ecore extensions [message #471652] |
Fri, 16 March 2007 10:09  |
Eclipse User |
|
|
|
This is a multi-part message in MIME format.
--------------010401040609020908080409
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
I'm trying to write a converter that takes models from MagicDraw 12.x
(UML 2.0/XMI 2.1) and produces models in OMG XMI 2.1 for UML 2.1.1
format that can be read into Eclipse/UML2 2.x. [Note that I cannot use
MagicDraw's EMF XMI v1.x exporter for various reasons (it only supports
Eclipse/UML2 1.x, it requires the MagicDraw runtime and it re-writes all
xmi:id's such that I cannot trace back to my original model - only to
name a few).]
Converting the model itself is fairly straightforward since I "only"
need to translate the differences from UML 2.0 to UML 2.1.1. However,
I'm having a hard time converting profiles and applied stereotypes in
the models.
To do this I need to understand the exact mechanism for applying
profiles in OMG XMI files such that Eclipse/UML2 understands it and can
read the UML models *together* with the applied profiles. Note that I'm
fairly into XMI (since version 1.0) and UML (since version 1.2) and all
the different versions (XMI vs. MOF vs. UML vs. Eclipse/UML2 etc.), so I
think I understand all the issues about metamodels, profiles and so on.
Here is my problem:
Following, the article at
http://www.eclipse.org/modeling/mdt/uml2/docs/articles/Intro duction_to_UML2_Profiles/article.html,
I managed to create a sample profile and model using the UML2 editor,
which largely resembles my original MagicDraw models in structure
(top-level XMI element and Data model, etc.). Then I saved both as OMG
XMI (by specifying the *.xmi extension in the Save As dialogue). Now my
problem is that even in the model stored as XMI the profile/stereotype
application only works if the Ecore extension "defining" the profile
exists at the beginning of the profile XMI file. Now obviously this is
specific to EMF/UML2 and should not be required when reading OMG XMI
models and profiles.
Attached I put my hand-crafted model and profile (in *.xmi format). As I
said, I would like to get this modified in such a way that the profile
does not have the Ecore extensions anymore and the model does not need
to reference the "contents" element in the Ecore extension at the
beginning via "xsi:schemaLocation" (apparently the "schema" of the
profile [NB: I know XML Schema but could not find a similarity here.]).
And obviously the stripped model and profile should still load into
Eclipse/UML2 with the stereotype(s) correctly applied.
Any help is greatly appreciated since I'm currently stuck.
Cheers, Peter
--------------010401040609020908080409
Content-Type: text/xml;
name="Model1.xmi"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
filename="Model1.xmi"
<?xml version="1.0" encoding="UTF-8"?>
<xmi:XMI xmi:version="2.1" xmlns:xmi="http://schema.omg.org/spec/XMI/2.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:Profile1="http:///schemas/Profile1/_rxXaUIDBEduPAOPCzCKebg/0" xmlns:Standard="http://schema.omg.org/spec/UML/2.1.1/StandardProfileL2" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" xmlns:uml="http://schema.omg.org/spec/UML/2.1.1" xsi:schemaLocation="http:///schemas/Profile1/_rxXaUIDBEduPAOPCzCKebg/0 Profile1.profile.xmi#_rxdg8IDBEduPAOPCzCKebg http://schema.omg.org/spec/UML/2.1.1/StandardProfileL2 http://schema.omg.org/spec/UML/2.1.1/StandardProfileL2.xmi#_ yzU58YinEdqtvbnfB2L_5w http://schema.omg.org/spec/UML/2.1.1 http://www.eclipse.org/uml2/2.0.0/UML">
<uml:Model xmi:id="_4uqT0H4nEdu2y_kSW8x_lA" name="Data">
<ownedComment xmi:type="uml:Comment" xmi:id="_Of5QEH5rEduZRZF7VtoXrg" annotatedElement="_4uqT0H4nEdu2y_kSW8x_lA">
<body>blabla</body>
</ownedComment>
<packagedElement xmi:type="uml:Package" xmi:id="_1W4jEIDBEduPAOPCzCKebg" name="Package1">
<packagedElement xmi:type="uml:Package" xmi:id="_mWUhwIEgEduPAOPCzCKebg" name="NestedPackage2">
<packagedElement xmi:type="uml:Class" xmi:id="_oNOZAIEgEduPAOPCzCKebg" name="ClassInNestedPackage"/>
<profileApplication xmi:type="uml:ProfileApplication" xmi:id="_swg-AIEgEduPAOPCzCKebg">
<xmi:Extension extender="http://www.eclipse.org/emf/2002/Ecore">
<eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_swg-AYEgEduPAOPCzCKebg" source="http://www.eclipse.org/uml2/2.0.0/UML">
<references xmi:type="ecore:EPackage" href="Profile1.profile.xmi#_rxdg8IDBEduPAOPCzCKebg"/>
</eAnnotations>
</xmi:Extension>
<appliedProfile xmi:type="uml:Profile" href="Profile1.profile.xmi#_LtC68IBNEduYpP3CXp-3Mw"/>
</profileApplication>
</packagedElement>
<packagedElement xmi:type="uml:Class" xmi:id="_9e4hkH4nEdu2y_kSW8x_lA" name="Class1"/>
<packagedElement xmi:type="uml:Class" xmi:id="_DqpmMIEbEduPAOPCzCKebg" name="Class2"/>
<profileApplication xmi:type="uml:ProfileApplication" xmi:id="_4GPFQIDBEduPAOPCzCKebg">
<appliedProfile xmi:type="uml:Profile" href="Profile1.profile.xmi#_LtC68IBNEduYpP3CXp-3Mw"/>
</profileApplication>
<profileApplication xmi:type="uml:ProfileApplication" xmi:id="_C9SJ4IEbEduPAOPCzCKebg">
<appliedProfile xmi:type="uml:Profile" href=" http://schema.omg.org/spec/UML/2.1.1/StandardProfileL2.xmi#_ 0"/>
</profileApplication>
</packagedElement>
</uml:Model>
<Profile1:Functional xmi:id="_5P9tcIDBEduPAOPCzCKebg" base_Class="_9e4hkH4nEdu2y_kSW8x_lA"/>
<Profile1:Functional xmi:id="_KfVz0IEgEduPAOPCzCKebg" base_Class="_DqpmMIEbEduPAOPCzCKebg"/>
<Profile1:Functional xmi:id="_tm2wIIEgEduPAOPCzCKebg" base_Class="_oNOZAIEgEduPAOPCzCKebg"/>
<Standard:Auxiliary xmi:id="_Ggl4kIEbEduPAOPCzCKebg" base_Class="_DqpmMIEbEduPAOPCzCKebg"/>
</xmi:XMI>
--------------010401040609020908080409
Content-Type: text/xml;
name="Profile1.profile.xmi"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
filename="Profile1.profile.xmi"
<?xml version="1.0" encoding="UTF-8"?>
<uml:Profile xmi:version="2.1" xmlns:xmi="http://schema.omg.org/spec/XMI/2.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" xmlns:uml="http://schema.omg.org/spec/UML/2.1.1" xsi:schemaLocation="http://schema.omg.org/spec/UML/2.1.1 http://www.eclipse.org/uml2/2.0.0/UML" xmi:id="_LtC68IBNEduYpP3CXp-3Mw" name="Profile1" metaclassReference="_R0jrwIBNEduYpP3CXp-3Mw" metamodelReference="_QTL_oIBNEduYpP3CXp-3Mw">
<xmi:Extension extender="http://www.eclipse.org/emf/2002/Ecore">
<eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_rxXaUYDBEduPAOPCzCKebg" source="http://www.eclipse.org/uml2/2.0.0/UML">
<contents xmi:type="ecore:EPackage" xmi:id="_rxdg8IDBEduPAOPCzCKebg" name="Profile1" nsURI="http:///schemas/Profile1/_rxXaUIDBEduPAOPCzCKebg/0" nsPrefix="Profile1">
<eClassifiers xmi:type="ecore:EClass" xmi:id="_rxdg8YDBEduPAOPCzCKebg" name="Functional">
<xmi:Extension extender="http://www.eclipse.org/emf/2002/Ecore">
<eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_rxdg8oDBEduPAOPCzCKebg" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_Ueka8IBNEduYpP3CXp-3Mw"/>
</xmi:Extension>
<eStructuralFeatures xmi:type="ecore:EReference" xmi:id="_rxdg84DBEduPAOPCzCKebg" name="base_Class" ordered="false" lowerBound="1">
<eType xmi:type="ecore:EClass" href="http://www.eclipse.org/uml2/2.0.0/UML#//Class"/>
</eStructuralFeatures>
</eClassifiers>
</contents>
</eAnnotations>
</xmi:Extension>
<elementImport xmi:type="uml:ElementImport" xmi:id="_R0jrwIBNEduYpP3CXp-3Mw">
<importedElement xmi:type="uml:Class" href="http://schema.omg.org/spec/UML/2.1.1/uml.xml#Class"/>
</elementImport>
<packageImport xmi:type="uml:PackageImport" xmi:id="_QTL_oIBNEduYpP3CXp-3Mw">
<importedPackage xmi:type="uml:Model" href="http://schema.omg.org/spec/UML/2.1.1/uml.xml#_0"/>
</packageImport>
<packagedElement xmi:type="uml:Stereotype" xmi:id="_Ueka8IBNEduYpP3CXp-3Mw" name="Functional">
<ownedAttribute xmi:type="uml:Property" xmi:id="_XsB1coBNEduYpP3CXp-3Mw" name="base_Class" association="_XsB1cIBNEduYpP3CXp-3Mw">
<type xmi:type="uml:Class" href="http://schema.omg.org/spec/UML/2.1.1/uml.xml#Class"/>
</ownedAttribute>
<icon xmi:type="uml:Image" xmi:id="EOperation-_icon.0" location="../icons/full/ovr16/EOperation.gif"/>
</packagedElement>
<packagedElement xmi:type="uml:Extension" xmi:id="_XsB1cIBNEduYpP3CXp-3Mw" name="Class_Stereotype1" memberEnd="_XsB1cYBNEduYpP3CXp-3Mw _XsB1coBNEduYpP3CXp-3Mw">
<ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_XsB1cYBNEduYpP3CXp-3Mw" name="extension_Stereotype1" type="_Ueka8IBNEduYpP3CXp-3Mw" aggregation="composite" association="_XsB1cIBNEduYpP3CXp-3Mw"/>
</packagedElement>
</uml:Profile>
--------------010401040609020908080409--
|
|
|
Re: Read OMG XMI resources with profile applications but w/o Ecore extensions [message #471659 is a reply to message #471652] |
Mon, 19 March 2007 10:42   |
Eclipse User |
|
|
|
Peter,
You're right, the XMI extension elements are not meaningful from a "pure"
OMG XMI perspective... but unfortunately, since the mapping from UML
profiles to their CMOF counterparts is non-normative (i.e. it is not
prescribed by the UML specification), it's the only way to capture
information that is specific to the Eclipse UML2 implementation in a
"standard" way. It should be easy to strip this information out (for example
using a stylesheet) if you want to...
Now, in order for UML2 to recognize steretype applications that are being
"imported" from OMG XMI, it needs a couple of pieces of information, namely
1) where to find the metadata for the stereotype applications and 2) which
version of the metadata is being used. The first is provided by the
schemaLocation attribute and the second is provided by an annotation on the
profile application. To successfully "import" a model and an applied profile
from OMG XMI (assuming the XMI extensions are missing), I would expect that
all you should need to do is the following:
1) "Import" the profile (i.e. open it using the UML editor or load it into a
properly configured resource set).
2) Define and save the profile.
3) Add a schemaLocation attribute to the root element of the model which
specifies where the (just defined) metadata for the profile can be found OR
add a such a mapping to the URI converter in the resource set that is being
used to load the model.
4) "Import" the model (i.e. open it using the UML editor or load it into a
properly configured resource set).
5) Add an annotation to the profile application with source
'http://www.eclipse.org/uml2/2.0.0/UML' and a reference to the Ecore package
defined in step 2 above, and save the model.
To be honest, I haven't tried these steps myself, so please let me know if
you run into problems.
Kenn
"Peter Ellsiepen" <peter.ellsiepen@vega.de> wrote in message
news:ete8ke$qia$1@utils.eclipse.org...
> I'm trying to write a converter that takes models from MagicDraw 12.x
> (UML 2.0/XMI 2.1) and produces models in OMG XMI 2.1 for UML 2.1.1
> format that can be read into Eclipse/UML2 2.x. [Note that I cannot use
> MagicDraw's EMF XMI v1.x exporter for various reasons (it only supports
> Eclipse/UML2 1.x, it requires the MagicDraw runtime and it re-writes all
> xmi:id's such that I cannot trace back to my original model - only to
> name a few).]
>
> Converting the model itself is fairly straightforward since I "only"
> need to translate the differences from UML 2.0 to UML 2.1.1. However,
> I'm having a hard time converting profiles and applied stereotypes in
> the models.
>
> To do this I need to understand the exact mechanism for applying
> profiles in OMG XMI files such that Eclipse/UML2 understands it and can
> read the UML models *together* with the applied profiles. Note that I'm
> fairly into XMI (since version 1.0) and UML (since version 1.2) and all
> the different versions (XMI vs. MOF vs. UML vs. Eclipse/UML2 etc.), so I
> think I understand all the issues about metamodels, profiles and so on.
> Here is my problem:
>
> Following, the article at
> http://www.eclipse.org/modeling/mdt/uml2/docs/articles/Intro duction_to_UML2_Profiles/article.html,
> I managed to create a sample profile and model using the UML2 editor,
> which largely resembles my original MagicDraw models in structure
> (top-level XMI element and Data model, etc.). Then I saved both as OMG
> XMI (by specifying the *.xmi extension in the Save As dialogue). Now my
> problem is that even in the model stored as XMI the profile/stereotype
> application only works if the Ecore extension "defining" the profile
> exists at the beginning of the profile XMI file. Now obviously this is
> specific to EMF/UML2 and should not be required when reading OMG XMI
> models and profiles.
>
> Attached I put my hand-crafted model and profile (in *.xmi format). As I
> said, I would like to get this modified in such a way that the profile
> does not have the Ecore extensions anymore and the model does not need
> to reference the "contents" element in the Ecore extension at the
> beginning via "xsi:schemaLocation" (apparently the "schema" of the
> profile [NB: I know XML Schema but could not find a similarity here.]).
> And obviously the stripped model and profile should still load into
> Eclipse/UML2 with the stereotype(s) correctly applied.
>
> Any help is greatly appreciated since I'm currently stuck.
>
> Cheers, Peter
>
------------------------------------------------------------ --------------------
> <?xml version="1.0" encoding="UTF-8"?>
> <xmi:XMI xmi:version="2.1" xmlns:xmi="http://schema.omg.org/spec/XMI/2.1"
> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
> xmlns:Profile1="http:///schemas/Profile1/_rxXaUIDBEduPAOPCzCKebg/0"
> xmlns:Standard="http://schema.omg.org/spec/UML/2.1.1/StandardProfileL2"
> xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore"
> xmlns:uml="http://schema.omg.org/spec/UML/2.1.1"
> xsi:schemaLocation="http:///schemas/Profile1/_rxXaUIDBEduPAOPCzCKebg/0
> Profile1.profile.xmi#_rxdg8IDBEduPAOPCzCKebg
> http://schema.omg.org/spec/UML/2.1.1/StandardProfileL2
> http://schema.omg.org/spec/UML/2.1.1/StandardProfileL2.xmi#_ yzU58YinEdqtvbnfB2L_5w
> http://schema.omg.org/spec/UML/2.1.1
> http://www.eclipse.org/uml2/2.0.0/UML">
> <uml:Model xmi:id="_4uqT0H4nEdu2y_kSW8x_lA" name="Data">
> <ownedComment xmi:type="uml:Comment" xmi:id="_Of5QEH5rEduZRZF7VtoXrg"
> annotatedElement="_4uqT0H4nEdu2y_kSW8x_lA">
> <body>blabla</body>
> </ownedComment>
> <packagedElement xmi:type="uml:Package"
> xmi:id="_1W4jEIDBEduPAOPCzCKebg" name="Package1">
> <packagedElement xmi:type="uml:Package"
> xmi:id="_mWUhwIEgEduPAOPCzCKebg" name="NestedPackage2">
> <packagedElement xmi:type="uml:Class"
> xmi:id="_oNOZAIEgEduPAOPCzCKebg" name="ClassInNestedPackage"/>
> <profileApplication xmi:type="uml:ProfileApplication"
> xmi:id="_swg-AIEgEduPAOPCzCKebg">
> <xmi:Extension extender="http://www.eclipse.org/emf/2002/Ecore">
> <eAnnotations xmi:type="ecore:EAnnotation"
> xmi:id="_swg-AYEgEduPAOPCzCKebg"
> source="http://www.eclipse.org/uml2/2.0.0/UML">
> <references xmi:type="ecore:EPackage"
> href="Profile1.profile.xmi#_rxdg8IDBEduPAOPCzCKebg"/>
> </eAnnotations>
> </xmi:Extension>
> <appliedProfile xmi:type="uml:Profile"
> href="Profile1.profile.xmi#_LtC68IBNEduYpP3CXp-3Mw"/>
> </profileApplication>
> </packagedElement>
> <packagedElement xmi:type="uml:Class"
> xmi:id="_9e4hkH4nEdu2y_kSW8x_lA" name="Class1"/>
> <packagedElement xmi:type="uml:Class"
> xmi:id="_DqpmMIEbEduPAOPCzCKebg" name="Class2"/>
> <profileApplication xmi:type="uml:ProfileApplication"
> xmi:id="_4GPFQIDBEduPAOPCzCKebg">
> <appliedProfile xmi:type="uml:Profile"
> href="Profile1.profile.xmi#_LtC68IBNEduYpP3CXp-3Mw"/>
> </profileApplication>
> <profileApplication xmi:type="uml:ProfileApplication"
> xmi:id="_C9SJ4IEbEduPAOPCzCKebg">
> <appliedProfile xmi:type="uml:Profile"
> href=" http://schema.omg.org/spec/UML/2.1.1/StandardProfileL2.xmi#_ 0"/>
> </profileApplication>
> </packagedElement>
> </uml:Model>
> <Profile1:Functional xmi:id="_5P9tcIDBEduPAOPCzCKebg"
> base_Class="_9e4hkH4nEdu2y_kSW8x_lA"/>
> <Profile1:Functional xmi:id="_KfVz0IEgEduPAOPCzCKebg"
> base_Class="_DqpmMIEbEduPAOPCzCKebg"/>
> <Profile1:Functional xmi:id="_tm2wIIEgEduPAOPCzCKebg"
> base_Class="_oNOZAIEgEduPAOPCzCKebg"/>
> <Standard:Auxiliary xmi:id="_Ggl4kIEbEduPAOPCzCKebg"
> base_Class="_DqpmMIEbEduPAOPCzCKebg"/>
> </xmi:XMI>
>
------------------------------------------------------------ --------------------
> <?xml version="1.0" encoding="UTF-8"?>
> <uml:Profile xmi:version="2.1"
> xmlns:xmi="http://schema.omg.org/spec/XMI/2.1"
> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
> xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore"
> xmlns:uml="http://schema.omg.org/spec/UML/2.1.1"
> xsi:schemaLocation="http://schema.omg.org/spec/UML/2.1.1
> http://www.eclipse.org/uml2/2.0.0/UML" xmi:id="_LtC68IBNEduYpP3CXp-3Mw"
> name="Profile1" metaclassReference="_R0jrwIBNEduYpP3CXp-3Mw"
> metamodelReference="_QTL_oIBNEduYpP3CXp-3Mw">
> <xmi:Extension extender="http://www.eclipse.org/emf/2002/Ecore">
> <eAnnotations xmi:type="ecore:EAnnotation"
> xmi:id="_rxXaUYDBEduPAOPCzCKebg"
> source="http://www.eclipse.org/uml2/2.0.0/UML">
> <contents xmi:type="ecore:EPackage" xmi:id="_rxdg8IDBEduPAOPCzCKebg"
> name="Profile1" nsURI="http:///schemas/Profile1/_rxXaUIDBEduPAOPCzCKebg/0"
> nsPrefix="Profile1">
> <eClassifiers xmi:type="ecore:EClass"
> xmi:id="_rxdg8YDBEduPAOPCzCKebg" name="Functional">
> <xmi:Extension extender="http://www.eclipse.org/emf/2002/Ecore">
> <eAnnotations xmi:type="ecore:EAnnotation"
> xmi:id="_rxdg8oDBEduPAOPCzCKebg"
> source="http://www.eclipse.org/uml2/2.0.0/UML"
> references="_Ueka8IBNEduYpP3CXp-3Mw"/>
> </xmi:Extension>
> <eStructuralFeatures xmi:type="ecore:EReference"
> xmi:id="_rxdg84DBEduPAOPCzCKebg" name="base_Class" ordered="false"
> lowerBound="1">
> <eType xmi:type="ecore:EClass"
> href="http://www.eclipse.org/uml2/2.0.0/UML#//Class"/>
> </eStructuralFeatures>
> </eClassifiers>
> </contents>
> </eAnnotations>
> </xmi:Extension>
> <elementImport xmi:type="uml:ElementImport"
> xmi:id="_R0jrwIBNEduYpP3CXp-3Mw">
> <importedElement xmi:type="uml:Class"
> href="http://schema.omg.org/spec/UML/2.1.1/uml.xml#Class"/>
> </elementImport>
> <packageImport xmi:type="uml:PackageImport"
> xmi:id="_QTL_oIBNEduYpP3CXp-3Mw">
> <importedPackage xmi:type="uml:Model"
> href="http://schema.omg.org/spec/UML/2.1.1/uml.xml#_0"/>
> </packageImport>
> <packagedElement xmi:type="uml:Stereotype"
> xmi:id="_Ueka8IBNEduYpP3CXp-3Mw" name="Functional">
> <ownedAttribute xmi:type="uml:Property"
> xmi:id="_XsB1coBNEduYpP3CXp-3Mw" name="base_Class"
> association="_XsB1cIBNEduYpP3CXp-3Mw">
> <type xmi:type="uml:Class"
> href="http://schema.omg.org/spec/UML/2.1.1/uml.xml#Class"/>
> </ownedAttribute>
> <icon xmi:type="uml:Image" xmi:id="EOperation-_icon.0"
> location="../icons/full/ovr16/EOperation.gif"/>
> </packagedElement>
> <packagedElement xmi:type="uml:Extension"
> xmi:id="_XsB1cIBNEduYpP3CXp-3Mw" name="Class_Stereotype1"
> memberEnd="_XsB1cYBNEduYpP3CXp-3Mw _XsB1coBNEduYpP3CXp-3Mw">
> <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_XsB1cYBNEduYpP3CXp-3Mw"
> name="extension_Stereotype1" type="_Ueka8IBNEduYpP3CXp-3Mw"
> aggregation="composite" association="_XsB1cIBNEduYpP3CXp-3Mw"/>
> </packagedElement>
> </uml:Profile>
>
|
|
|
Re: Read OMG XMI resources with profile applications but w/o Ecore extensions [message #472510 is a reply to message #471659] |
Wed, 11 April 2007 18:34   |
Eclipse User |
|
|
|
This is a multi-part message in MIME format.
--------------080209010704040208000802
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
Kenn,
thanks for your comprehensive answer. After the Easter holidays I took
some time to put your suggestions into source code. I nearly finished
the profile and model conversion procedure now, with the exception of
one quite awkward problem: I can "define" my profiles from within the
UML Editor (i.e. via UI) but the code in my stand-alone application does
not work. In the stand-alone case, the resulting Ecore package
representing the schema of the profile (i.e. the "defined" profile) is
broken: all EAttributes and EClasses are missing the references to their
types (via the eType element).
I checked my initialization and reader code many times, taking into
account the UML 2.0 Migration Guide
( http://www.eclipse.org/modeling/mdt/uml2/docs/guides/UML2_2. 0_Migration_Guide/guide.html)
and the article on UML2 Profiles
( http://www.eclipse.org/modeling/mdt/uml2/docs/articles/Intro duction_to_UML2_Profiles/article.html).
Here is my code (snippets put together to show the main flow):
Prepare resource set (initialize):
// get reference to URI map
Map uriMap = URIConverter.URI_MAP;
// register the necessary pathmaps
uriMap.put(URI.createURI(UMLResource.LIBRARIES_PATHMAP),
umlResourcesPluginURI.appendSegment("libraries").appendSegment( ""));
uriMap.put(URI.createURI(UMLResource.METAMODELS_PATHMAP),
umlResourcesPluginURI.appendSegment("metamodels").appendSegment( ""));
uriMap.put(URI.createURI(UMLResource.PROFILES_PATHMAP),
umlResourcesPluginURI.appendSegment("profiles").appendSegment( ""));
// for a stand alone application, it is necessary to map the
// platform plugin URI scheme to the workspace location
uriMap.put(URI.createURI("platform:/plugin/org.eclipse.uml2.uml/ "),
umlPluginURI);
Map packageRegistry = resourceSet.getPackageRegistry();
// register the Ecore package from org.eclipse.emf
packageRegistry.put(EcorePackage.eNS_URI, EcorePackage.eINSTANCE);
// register the UML package from org.eclipse.uml2
packageRegistry.put(UMLPackage.eNS_URI, UMLPackage.eINSTANCE);
// register known file extensions:
// - *.uml -> native Eclipse/UML2 resource
// - *.xmi -> OMG XMI UML2 resource
Map extensionToFactoryMap =
Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap( );
extensionToFactoryMap.put(UMLResource.FILE_EXTENSION,
UMLResource.Factory.INSTANCE);
extensionToFactoryMap.put(XMI2UMLResource.FILE_EXTENSION,
XMI2UMLResource.Factory.INSTANCE);
Load resource:
// load resource (if not already loaded)
resource = resourceSet.getResource(uri, true);
// load any referenced models and profiles
EcoreUtil.resolveAll(resource);
Define profile:
Profile profile =
(Profile)EcoreUtil.getObjectByType(resource.getContents(),
UMLPackage.Literals.PROFILE);
profile.define();
Save resource:
resource.save(null);
For your reference, I attached the "raw" profile (only OMG XMI) before
calling define() and the resulting "defined" profile by using the UML
Editor UI and my stand-alone application.
Any idea what could be wrong?
Cheers, Peter
Kenn Hussey wrote:
> Peter,
>
> You're right, the XMI extension elements are not meaningful from a "pure"
> OMG XMI perspective... but unfortunately, since the mapping from UML
> profiles to their CMOF counterparts is non-normative (i.e. it is not
> prescribed by the UML specification), it's the only way to capture
> information that is specific to the Eclipse UML2 implementation in a
> "standard" way. It should be easy to strip this information out (for example
> using a stylesheet) if you want to...
>
> Now, in order for UML2 to recognize steretype applications that are being
> "imported" from OMG XMI, it needs a couple of pieces of information, namely
> 1) where to find the metadata for the stereotype applications and 2) which
> version of the metadata is being used. The first is provided by the
> schemaLocation attribute and the second is provided by an annotation on the
> profile application. To successfully "import" a model and an applied profile
> from OMG XMI (assuming the XMI extensions are missing), I would expect that
> all you should need to do is the following:
>
> 1) "Import" the profile (i.e. open it using the UML editor or load it into a
> properly configured resource set).
> 2) Define and save the profile.
> 3) Add a schemaLocation attribute to the root element of the model which
> specifies where the (just defined) metadata for the profile can be found OR
> add a such a mapping to the URI converter in the resource set that is being
> used to load the model.
> 4) "Import" the model (i.e. open it using the UML editor or load it into a
> properly configured resource set).
> 5) Add an annotation to the profile application with source
> 'http://www.eclipse.org/uml2/2.0.0/UML' and a reference to the Ecore package
> defined in step 2 above, and save the model.
>
> To be honest, I haven't tried these steps myself, so please let me know if
> you run into problems.
>
> Kenn
>
> "Peter Ellsiepen" <peter.ellsiepen@vega.de> wrote in message
> news:ete8ke$qia$1@utils.eclipse.org...
>> I'm trying to write a converter that takes models from MagicDraw 12.x
>> (UML 2.0/XMI 2.1) and produces models in OMG XMI 2.1 for UML 2.1.1
>> format that can be read into Eclipse/UML2 2.x. [Note that I cannot use
>> MagicDraw's EMF XMI v1.x exporter for various reasons (it only supports
>> Eclipse/UML2 1.x, it requires the MagicDraw runtime and it re-writes all
>> xmi:id's such that I cannot trace back to my original model - only to
>> name a few).]
>>
>> Converting the model itself is fairly straightforward since I "only"
>> need to translate the differences from UML 2.0 to UML 2.1.1. However,
>> I'm having a hard time converting profiles and applied stereotypes in
>> the models.
>>
>> To do this I need to understand the exact mechanism for applying
>> profiles in OMG XMI files such that Eclipse/UML2 understands it and can
>> read the UML models *together* with the applied profiles. Note that I'm
>> fairly into XMI (since version 1.0) and UML (since version 1.2) and all
>> the different versions (XMI vs. MOF vs. UML vs. Eclipse/UML2 etc.), so I
>> think I understand all the issues about metamodels, profiles and so on.
>> Here is my problem:
>>
>> Following, the article at
>> http://www.eclipse.org/modeling/mdt/uml2/docs/articles/Intro duction_to_UML2_Profiles/article.html,
>> I managed to create a sample profile and model using the UML2 editor,
>> which largely resembles my original MagicDraw models in structure
>> (top-level XMI element and Data model, etc.). Then I saved both as OMG
>> XMI (by specifying the *.xmi extension in the Save As dialogue). Now my
>> problem is that even in the model stored as XMI the profile/stereotype
>> application only works if the Ecore extension "defining" the profile
>> exists at the beginning of the profile XMI file. Now obviously this is
>> specific to EMF/UML2 and should not be required when reading OMG XMI
>> models and profiles.
>>
>> Attached I put my hand-crafted model and profile (in *.xmi format). As I
>> said, I would like to get this modified in such a way that the profile
>> does not have the Ecore extensions anymore and the model does not need
>> to reference the "contents" element in the Ecore extension at the
>> beginning via "xsi:schemaLocation" (apparently the "schema" of the
>> profile [NB: I know XML Schema but could not find a similarity here.]).
>> And obviously the stripped model and profile should still load into
>> Eclipse/UML2 with the stereotype(s) correctly applied.
>>
>> Any help is greatly appreciated since I'm currently stuck.
>>
>> Cheers, Peter
--------------080209010704040208000802
Content-Type: application/x-zip-compressed;
name="sample_files.zip"
Content-Transfer-Encoding: base64
Content-Disposition: inline;
filename="sample_files.zip"
UEsDBBQAAAAIAKQAjDZvzyGZoQQAAFcXAAAxAAAAc2FtcGxlX2ZpbGVzL015 UHJvZmlsZS5k
ZWZpbmVkX2J5X2FwcC5wcm9maWxlLnhtadVY2Y7qRhB9j5R/sJznwfuGIFck 4kZEMzfozhDl
zTJ2Y1rxgrptGP7+VnvDC4tZZpRoHgB3d9WpU6e6yjP68h4G3BYRiuNozEsD kedQ5MYejvwx
v3j7+mTyX379+adRGgbDOYlXOEDce4iH1RF5IPHwJIjoEJ6P+XWSbIaCQN01 Cp1BHPqDmPgC
3SBX+OdlJtS308P23W432CnZVlkUJdj6/JpZeMIRTZzIReUp5MYENc4hN8Ab irLDKFwxA7Iw
ZdvKMwD+LLDFyzMDlkGjeJhveY5dJ8lC7HOSOwEIXMuwQxyIbC+fcYe9MW9L si1OJ/MlShxb
MmRdVBXZliRd1VVZMnRVNGxTk1TTsmXZ5LnICSHql32RA54L4WAYeyj4jlaI QM5g2c4h2gDR
Buc2g2iDWxsswx8ONzFJeEgnx40YkOl7giKWRg6xbx4ifYnNbIAVNImiOMl4 ollsyX4DQLIk
DaeHxVrgdKEv/b/W6tRL/f3WkKLoD28/4Tkap8Q9ndkWkQUAgODGEWBPjrif O+6/jo9uJd0u
LR9hP6KL77MKayENKlQ7BAjzz7AbpiCys3OCVvi9brAKh3H6e+BQilcYSqwb VLbYpjPt0plD
DvcHY68J6CRmxuruHiWFA/wbJfF0ryQ4UlYCvZRqU9cN3VZUQ7VYqi1eaDIi NChprqHXhKRu
khIn+Ioc+ERHwqyKshXl+ojw80wtHYrsQ7J4LiaQBAQHV05AwU4Q7xD5LU4j eCS1AfcCNUkS
gpdp0gGFToFyKzxvjn8NpJFQV/F96l6fUfes6A7/bW2vP1HbsiIrhmKbumyJ tqxqnyZtfF7a
VaagJ0H23YKn/pLqi++UyvFJlZcjxmM0PhLKvlE2SaEum7z7HsnCaJO3q1nW pWtxZaNXfa0e
WJ+Gz+WfMNJ9g3gp+EGXLsjOAFLGkptCXgGoBfOFDSQ8twa19hubmM4HMKT9 YosFtyOhwUOD
Gm8aoBCYbXmteOzZ6aFEVFGF4lAsE2pEk0ohsKkqXCIyjXqaMExJFBUwoXB9 tmuKIirMo1zx
Ge8iCCvyToUES9dFdYBURoVKW3a4r92T3BZTvMQBTvZjfkPw1mElk0O45Kh5 w3CO7xPkF9Oy
G0PiKGbGIDgQ3YTS2MXF6iXL7cQ4dxw+lGS62SDytxOkbcE+A064TRZRgEP4 6n1zstvlOsol
ybQsDVxqByFtmbPmjTHKrpIzKGZwbfis9V/jXNZMzWL5VivnpcuRUKqrWVll GX1IbemWZoAK
dcXUGCr9htrKTSiSqlomi+9CbeXbIelyxoPxEbXVhnSstrJm8IgC646nj6uw bnquqLDO4Y+v
sNwlPNZU0LoufmqF5c5V2dRUA+K1PqTC6orpBeuIPPq87OXlUE1H7QGDxJDA ZN8TQ7foTr3G
HC2Cx2iOoW+FUbw/3DCA1DC3sltRdgeRUj0wQ7F0zVB0HWYBRVVVTQYiT7xy NehLlwF2zxMw
J6zM8Ba9ZYK6gYiyRs6y8DlK704al9/7bsnOpR5bm9t6vNLcq/gzc8xDFX8c /ueIX9ctHa51
S7JkzbaqG6zxJvY/kv5IqP1/HH7/AFBLAwQUAAAACABwAow20gfJENoEAABg GQAAMAAAAHNh
bXBsZV9maWxlcy9NeVByb2ZpbGUuZGVmaW5lZF9ieV9VSS5wcm9maWxlLnht ad1Z227jNhB9
L9B/ELTPse43w+nC3XXQFMk23SSL3b4IskzbRHUxSMqXv+9QsmRJlmzZsYO2 yIMdkTNz5swc
apgMPq7DQFgiQnEc3YpKTxYFFPnxBEezW/H15e7GFj/+8vNPgyQM+k8knuIA CesQ9wsTtaeI
8CSIaB+e34pzxhZ9SaL+HIVeLw5nvZjMJLpAvvT98V4qb6e77avVqrfS0q2q LCuw9eE59XCD
I8q8yEe5FfJjgip2yA/wgqLUGIVT7kCVRnxbbgPgDwJ7fXzgwFJoFPezLQ+x 77E0xS6WQgsg
CK3CDrkn871iyh2e3IquorryaPg0RsxzFUs1ZV1TXUUxdVNXFcvUZcu1DUW3 HVdVbVGIvBCy
ftxsayAKIRiG8QQFX9EUEagZLLsZRBcguhDc5RBdCOuCZ/jB4SImTIRyCsKA AxmtGYp4GQXE
v00Q6Ups6gO8oGEUxSzliaa5sc0CgKRF6o92i6XEF6/Tu9kfc3M0SfCn33/7 6/Nw/mP5pyjQ
OCF+e2VrRG4BAAQ/jgA7awj/5Pl/ezNUiU2eVw2x99iN6OvX+wLLtvRUKnZI 4OrHjb7nSpK5
7RNBU7wuOyzgcs4+BR6leIpBQvug08U6ZNQGOdzsnD0z6IOYOyuHu1Spd/DP KTnkkLy15ALJ
O50e049tmpbparqlO1w/jihVGZEqlFTX0DMjic8S4gV3yINP1JBmIbp6ljdt lRp7FLm7YolC
TKAICAynXkDBTxCvEPk1TiJ4pOyz/gLhW7tlDtR0pPGDJJVQ1HlpSP4MdoaM ETxOWJ2ddav0
/ALSize7EDefPebxlSP0VNsd6BndR+xEYmC9JOq3iX19QOz325fhv1vq63eU uqqpmqW5tqk6
sqvqxrspfX1Y6UWl4BUM1fe3PF2ksc8SfTOg09q8K2dt+t+06j+f8v5P6h9I +WiST0tSWVDZ
GNbQn4NFNrfcp+NaKbN0Bi+vlejtNPkJ2SfM9l+AdQpx0LE36d4kmueSuUKT LaAazEc+mdao
Pzg/84btwbT+wZW37A+kCg8VaiajAIXAbC1qwWPHORsOD13W4djQHBtOD0PJ 25GP1+EYkVHU
0YVlK7KsgQtN6LLd0DRZ4xHVgs94FUFa0aQtJVg6LasdpDwrlPtyw03pDSIs McVjHGC2uRUX
BC89LtwMwrFA1bNX8GYzgmbba5MfQ+Eo5s4gOWi6IaWxj7erxzzXC+O9wXgn yWSxQOSbFyT1
hn0AnKDu1yjAIXydfPFStZ9GuaLYjmNASGPXSEsejJ9buzNlkB5oB1DAEYRm fEY8Jbhq2IbD
660XwfOQAynvrqqychldRVumY1jQhaZmGxyVeYa2MheaouuOzfM7oq1sOxRd TXmwrqGtOqQm
baUvg0sIbP8eczmF7ZfnBIXtGV9fYVlIeGzo0Oum/K4Ky4Lrqm3oFuTrXEVh 5Y7pBKuhPbr8
VSCTQzGj1QcMEkMB2aYjhn3Rtd13G0VwmZ5j1QmQp9E0I3cbQBpux9vqFpS9 gUilnJilOaZh
aaYJs4Cm67qhApEtV+IKfck4wP5hAp4IlxleooYhuBsRuUYOsvA+nb4/aRy/ EZ9TnWPv2NLc
1uGy99aOPzDHXLTjD18Nr9v8pumYcKw7iqMarlOcYJX74H+o9QdSsvtHCfz+ D1BLAwQUAAAA
CABAAow2G/JfFHoDAADFDwAAJgAAAHNhbXBsZV9maWxlcy9NeVByb2ZpbGUu cmF3LnByb2Zp
bGUueG1p1VfbbtpAEH2v1H+w3Odg78VrG0GrqKJSpCSK2qTq28qYxVnVN9kL hL/vrC/EmIRA
EiJVPADr2ZkzZ85ZrUffHpLYWIqilFk6NtHANg2RhtlMptHYvLv9ceaZ375+ /jRaJPHwpsjm
MhbGQyKHmy14gExYidNyCOtj816pfGhZZXgvkmCQJdEgKyKrzEVo/bm6sLrh 5WP4arUarEgV
im0bQejlryrDmUxLFaShaHeJMCvE1j4RxjIvRbVZJHOdAFsTHdbuAfB7gd1d XWpgFbRSDuuQ
yywMVNXiITuNZwBBaQwR9sDWsWbFnZyNTY4wtyfnN1OhAo5czGxKMEeIUUYx chm1Xe45iHo+
x9gzjTRIoOurdTMD00hgY5LNRPxTzEUBM4PHvIbIASKH4lxD5FCWQ2b4yCTP CmXCOA1jlAfh
3yASF9VaBUutc8hRDbr7rIP5oPRG/Q0CugbMJdQRR7dbQQSQdSoxawD1YF7p 9k3jvhDzw4ak
pzEASXzhtmnVNFhbPGxRM5vEIhFpn5zJgxKp1v6Bw8QEU5tyTInv2Rw7qB2m nmEyFcUkPTCF
6yHbJpCCGIeEO4TYRFfEGz6zVQptpbPnWoJHx3X1CKntSrS5eLL+pUCZma5j GktZyqmMpVqP
zbyQy0DBYg3hpULEJdxj2IdeqGMaQRQVImq8GWYwuFLqZNAciO68LLNQNk9f ytwfTPCGzQ3H
wPIiz0XxO4gXfcFeAs4iiO/SWCbwc3YdqAX8P45yhDzfd6Ck8yikpS4Gx3ej 6gpFnK32orhI
lYhEcVxx7HiOr+dNN8XbkiOrVde2s1obncRbzHdcUCEjnqNRsVd4q05BEKW+ p/t7wVt1OAwd
Vzy4p/BWH9JT3voeg1jfw2DIY8xlnFCX+vr09d/RYbvjOcJhO5tP77C6JCw7 FLTO7A91WF2c
Ys+hLvTrn8RhXcUcBOsJedSwGgnKuRRFJ+uWHc6VKuR0ofoEwS0GBqjWB2LY NV2DYRqUgj/C
eMYE76M5jb7XRlX5VReQDubedDeUvYFI1G3MJT5zXMIY3AUIpdTBQGRLYLjB cRtEPfoW01iG
+wm4KbTN5FLcVoJ6BRGtR/ay8DFK371ptEK/aN5BTi3znXtbV+YbEEAkTKx+ OXm74vfcY95V
8U/D/xjxM+YzONZ95GOH+5sTrH21/N+kP7I6b+Pw/x9QSwECFAsUAAAACACk AIw2b88hmaEE
AABXFwAAMQAAAAAAAAABACAAAAAAAAAAc2FtcGxlX2ZpbGVzL015UHJvZmls ZS5kZWZpbmVk
X2J5X2FwcC5wcm9maWxlLnhtaVBLAQIUCxQAAAAIAHACjDbSB8kQ2gQAAGAZ AAAwAAAAAAAA
AAEAIAAAAPAEAABzYW1wbGVfZmlsZXMvTXlQcm9maWxlLmRlZmluZWRfYnlf VUkucHJvZmls
ZS54bWlQSwECFAsUAAAACABAAow2G/JfFHoDAADFDwAAJgAAAAAAAAABACAA AAAYCgAAc2Ft
cGxlX2ZpbGVzL015UHJvZmlsZS5yYXcucHJvZmlsZS54bWlQSwUGAAAAAAMA AwARAQAA1g0A
AAAA
--------------080209010704040208000802--
|
|
|
Re: Read OMG XMI resources with profile applications but w/o Ecore extensions [message #472511 is a reply to message #472510] |
Wed, 11 April 2007 22:59   |
Eclipse User |
|
|
|
Peter,
Did you try debugging the code to ensure that the references to the
metamodel are being resolved correctly? What values are being passed for
umlResourcesPluginURI and umlPluginURI? Are they correct?
Kenn
"Peter Ellsiepen" <peter.ellsiepen@vega.de> wrote in message
news:evjnqo$7vv$1@build.eclipse.org...
> Kenn,
>
> thanks for your comprehensive answer. After the Easter holidays I took
> some time to put your suggestions into source code. I nearly finished
> the profile and model conversion procedure now, with the exception of
> one quite awkward problem: I can "define" my profiles from within the
> UML Editor (i.e. via UI) but the code in my stand-alone application does
> not work. In the stand-alone case, the resulting Ecore package
> representing the schema of the profile (i.e. the "defined" profile) is
> broken: all EAttributes and EClasses are missing the references to their
> types (via the eType element).
>
> I checked my initialization and reader code many times, taking into
> account the UML 2.0 Migration Guide
> ( http://www.eclipse.org/modeling/mdt/uml2/docs/guides/UML2_2. 0_Migration_Guide/guide.html)
> and the article on UML2 Profiles
> ( http://www.eclipse.org/modeling/mdt/uml2/docs/articles/Intro duction_to_UML2_Profiles/article.html).
> Here is my code (snippets put together to show the main flow):
>
> Prepare resource set (initialize):
>
> // get reference to URI map
> Map uriMap = URIConverter.URI_MAP;
>
> // register the necessary pathmaps
> uriMap.put(URI.createURI(UMLResource.LIBRARIES_PATHMAP),
>
> umlResourcesPluginURI.appendSegment("libraries").appendSegment( ""));
>
> uriMap.put(URI.createURI(UMLResource.METAMODELS_PATHMAP),
>
> umlResourcesPluginURI.appendSegment("metamodels").appendSegment( ""));
>
> uriMap.put(URI.createURI(UMLResource.PROFILES_PATHMAP),
>
> umlResourcesPluginURI.appendSegment("profiles").appendSegment( ""));
>
> // for a stand alone application, it is necessary to map the
> // platform plugin URI scheme to the workspace location
>
> uriMap.put(URI.createURI("platform:/plugin/org.eclipse.uml2.uml/ "),
> umlPluginURI);
>
> Map packageRegistry = resourceSet.getPackageRegistry();
>
> // register the Ecore package from org.eclipse.emf
> packageRegistry.put(EcorePackage.eNS_URI, EcorePackage.eINSTANCE);
>
> // register the UML package from org.eclipse.uml2
> packageRegistry.put(UMLPackage.eNS_URI, UMLPackage.eINSTANCE);
>
> // register known file extensions:
> // - *.uml -> native Eclipse/UML2 resource
> // - *.xmi -> OMG XMI UML2 resource
> Map extensionToFactoryMap =
> Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap( );
> extensionToFactoryMap.put(UMLResource.FILE_EXTENSION,
> UMLResource.Factory.INSTANCE);
> extensionToFactoryMap.put(XMI2UMLResource.FILE_EXTENSION,
> XMI2UMLResource.Factory.INSTANCE);
>
> Load resource:
>
> // load resource (if not already loaded)
> resource = resourceSet.getResource(uri, true);
>
> // load any referenced models and profiles
> EcoreUtil.resolveAll(resource);
>
> Define profile:
>
> Profile profile =
> (Profile)EcoreUtil.getObjectByType(resource.getContents(),
> UMLPackage.Literals.PROFILE);
> profile.define();
>
> Save resource:
>
> resource.save(null);
>
>
> For your reference, I attached the "raw" profile (only OMG XMI) before
> calling define() and the resulting "defined" profile by using the UML
> Editor UI and my stand-alone application.
>
> Any idea what could be wrong?
>
> Cheers, Peter
>
> Kenn Hussey wrote:
>> Peter,
>>
>> You're right, the XMI extension elements are not meaningful from a "pure"
>> OMG XMI perspective... but unfortunately, since the mapping from UML
>> profiles to their CMOF counterparts is non-normative (i.e. it is not
>> prescribed by the UML specification), it's the only way to capture
>> information that is specific to the Eclipse UML2 implementation in a
>> "standard" way. It should be easy to strip this information out (for
>> example
>> using a stylesheet) if you want to...
>>
>> Now, in order for UML2 to recognize steretype applications that are being
>> "imported" from OMG XMI, it needs a couple of pieces of information,
>> namely
>> 1) where to find the metadata for the stereotype applications and 2)
>> which
>> version of the metadata is being used. The first is provided by the
>> schemaLocation attribute and the second is provided by an annotation on
>> the
>> profile application. To successfully "import" a model and an applied
>> profile
>> from OMG XMI (assuming the XMI extensions are missing), I would expect
>> that
>> all you should need to do is the following:
>>
>> 1) "Import" the profile (i.e. open it using the UML editor or load it
>> into a
>> properly configured resource set).
>> 2) Define and save the profile.
>> 3) Add a schemaLocation attribute to the root element of the model which
>> specifies where the (just defined) metadata for the profile can be found
>> OR
>> add a such a mapping to the URI converter in the resource set that is
>> being
>> used to load the model.
>> 4) "Import" the model (i.e. open it using the UML editor or load it into
>> a
>> properly configured resource set).
>> 5) Add an annotation to the profile application with source
>> 'http://www.eclipse.org/uml2/2.0.0/UML' and a reference to the Ecore
>> package
>> defined in step 2 above, and save the model.
>>
>> To be honest, I haven't tried these steps myself, so please let me know
>> if
>> you run into problems.
>>
>> Kenn
>>
>> "Peter Ellsiepen" <peter.ellsiepen@vega.de> wrote in message
>> news:ete8ke$qia$1@utils.eclipse.org...
>>> I'm trying to write a converter that takes models from MagicDraw 12.x
>>> (UML 2.0/XMI 2.1) and produces models in OMG XMI 2.1 for UML 2.1.1
>>> format that can be read into Eclipse/UML2 2.x. [Note that I cannot use
>>> MagicDraw's EMF XMI v1.x exporter for various reasons (it only supports
>>> Eclipse/UML2 1.x, it requires the MagicDraw runtime and it re-writes all
>>> xmi:id's such that I cannot trace back to my original model - only to
>>> name a few).]
>>>
>>> Converting the model itself is fairly straightforward since I "only"
>>> need to translate the differences from UML 2.0 to UML 2.1.1. However,
>>> I'm having a hard time converting profiles and applied stereotypes in
>>> the models.
>>>
>>> To do this I need to understand the exact mechanism for applying
>>> profiles in OMG XMI files such that Eclipse/UML2 understands it and can
>>> read the UML models *together* with the applied profiles. Note that I'm
>>> fairly into XMI (since version 1.0) and UML (since version 1.2) and all
>>> the different versions (XMI vs. MOF vs. UML vs. Eclipse/UML2 etc.), so I
>>> think I understand all the issues about metamodels, profiles and so on.
>>> Here is my problem:
>>>
>>> Following, the article at
>>> http://www.eclipse.org/modeling/mdt/uml2/docs/articles/Intro duction_to_UML2_Profiles/article.html,
>>> I managed to create a sample profile and model using the UML2 editor,
>>> which largely resembles my original MagicDraw models in structure
>>> (top-level XMI element and Data model, etc.). Then I saved both as OMG
>>> XMI (by specifying the *.xmi extension in the Save As dialogue). Now my
>>> problem is that even in the model stored as XMI the profile/stereotype
>>> application only works if the Ecore extension "defining" the profile
>>> exists at the beginning of the profile XMI file. Now obviously this is
>>> specific to EMF/UML2 and should not be required when reading OMG XMI
>>> models and profiles.
>>>
>>> Attached I put my hand-crafted model and profile (in *.xmi format). As I
>>> said, I would like to get this modified in such a way that the profile
>>> does not have the Ecore extensions anymore and the model does not need
>>> to reference the "contents" element in the Ecore extension at the
>>> beginning via "xsi:schemaLocation" (apparently the "schema" of the
>>> profile [NB: I know XML Schema but could not find a similarity here.]).
>>> And obviously the stripped model and profile should still load into
>>> Eclipse/UML2 with the stereotype(s) correctly applied.
>>>
>>> Any help is greatly appreciated since I'm currently stuck.
>>>
>>> Cheers, Peter
>
>
|
|
|
Re: Read OMG XMI resources with profile applications but w/o Ecore extensions [message #472656 is a reply to message #472511] |
Thu, 19 April 2007 03:26   |
Eclipse User |
|
|
|
This is a multi-part message in MIME format.
--------------090507010705050704000300
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
Kenn,
thanks for your hint - again you were pointing into the right direction,
that is I had an error in the definition of umlResourcesPluginURI and
umlPluginURI variables (incorrect path to the JAR file). Unfortunately,
the UML2 package does not raise any error message (or exception) if any
of the configured pathmaps points to a non-existing location. How can I
enable error handling for such cases?
Another problem I have now is that the loading of the converted XMI
model (and referenced profiles) is *very* slow, i.e. it takes ~1 minute
for a quite small model on my Notebook, although the content seems to be
correct and the files can be loaded without error message. Is it
possible that this is related to some read timeout while trying to
resolve some external XML resource/entity (my computer is behind a
firewall)? I have the example files attached to this message; the
behaviour can be reproduced by loading gen/MyModel.xmi into the
Eclipse/UML2 editor.
Any idea what could be the reason for the large loading time?
Peter
Kenn Hussey wrote:
> Peter,
>
> Did you try debugging the code to ensure that the references to the
> metamodel are being resolved correctly? What values are being passed for
> umlResourcesPluginURI and umlPluginURI? Are they correct?
>
> Kenn
>
> "Peter Ellsiepen" <peter.ellsiepen@vega.de> wrote in message
> news:evjnqo$7vv$1@build.eclipse.org...
>> Kenn,
>>
>> thanks for your comprehensive answer. After the Easter holidays I took
>> some time to put your suggestions into source code. I nearly finished
>> the profile and model conversion procedure now, with the exception of
>> one quite awkward problem: I can "define" my profiles from within the
>> UML Editor (i.e. via UI) but the code in my stand-alone application does
>> not work. In the stand-alone case, the resulting Ecore package
>> representing the schema of the profile (i.e. the "defined" profile) is
>> broken: all EAttributes and EClasses are missing the references to their
>> types (via the eType element).
>>
>> I checked my initialization and reader code many times, taking into
>> account the UML 2.0 Migration Guide
>> ( http://www.eclipse.org/modeling/mdt/uml2/docs/guides/UML2_2. 0_Migration_Guide/guide.html)
>> and the article on UML2 Profiles
>> ( http://www.eclipse.org/modeling/mdt/uml2/docs/articles/Intro duction_to_UML2_Profiles/article.html).
>> Here is my code (snippets put together to show the main flow):
>>
>> Prepare resource set (initialize):
>>
>> // get reference to URI map
>> Map uriMap = URIConverter.URI_MAP;
>>
>> // register the necessary pathmaps
>> uriMap.put(URI.createURI(UMLResource.LIBRARIES_PATHMAP),
>>
>> umlResourcesPluginURI.appendSegment("libraries").appendSegment( ""));
>>
>> uriMap.put(URI.createURI(UMLResource.METAMODELS_PATHMAP),
>>
>> umlResourcesPluginURI.appendSegment("metamodels").appendSegment( ""));
>>
>> uriMap.put(URI.createURI(UMLResource.PROFILES_PATHMAP),
>>
>> umlResourcesPluginURI.appendSegment("profiles").appendSegment( ""));
>>
>> // for a stand alone application, it is necessary to map the
>> // platform plugin URI scheme to the workspace location
>>
>> uriMap.put(URI.createURI("platform:/plugin/org.eclipse.uml2.uml/ "),
>> umlPluginURI);
>>
>> Map packageRegistry = resourceSet.getPackageRegistry();
>>
>> // register the Ecore package from org.eclipse.emf
>> packageRegistry.put(EcorePackage.eNS_URI, EcorePackage.eINSTANCE);
>>
>> // register the UML package from org.eclipse.uml2
>> packageRegistry.put(UMLPackage.eNS_URI, UMLPackage.eINSTANCE);
>>
>> // register known file extensions:
>> // - *.uml -> native Eclipse/UML2 resource
>> // - *.xmi -> OMG XMI UML2 resource
>> Map extensionToFactoryMap =
>> Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap( );
>> extensionToFactoryMap.put(UMLResource.FILE_EXTENSION,
>> UMLResource.Factory.INSTANCE);
>> extensionToFactoryMap.put(XMI2UMLResource.FILE_EXTENSION,
>> XMI2UMLResource.Factory.INSTANCE);
>>
>> Load resource:
>>
>> // load resource (if not already loaded)
>> resource = resourceSet.getResource(uri, true);
>>
>> // load any referenced models and profiles
>> EcoreUtil.resolveAll(resource);
>>
>> Define profile:
>>
>> Profile profile =
>> (Profile)EcoreUtil.getObjectByType(resource.getContents(),
>> UMLPackage.Literals.PROFILE);
>> profile.define();
>>
>> Save resource:
>>
>> resource.save(null);
>>
>>
>> For your reference, I attached the "raw" profile (only OMG XMI) before
>> calling define() and the resulting "defined" profile by using the UML
>> Editor UI and my stand-alone application.
>>
>> Any idea what could be wrong?
>>
>> Cheers, Peter
>>
>> Kenn Hussey wrote:
>>> Peter,
>>>
>>> You're right, the XMI extension elements are not meaningful from a "pure"
>>> OMG XMI perspective... but unfortunately, since the mapping from UML
>>> profiles to their CMOF counterparts is non-normative (i.e. it is not
>>> prescribed by the UML specification), it's the only way to capture
>>> information that is specific to the Eclipse UML2 implementation in a
>>> "standard" way. It should be easy to strip this information out (for
>>> example
>>> using a stylesheet) if you want to...
>>>
>>> Now, in order for UML2 to recognize steretype applications that are being
>>> "imported" from OMG XMI, it needs a couple of pieces of information,
>>> namely
>>> 1) where to find the metadata for the stereotype applications and 2)
>>> which
>>> version of the metadata is being used. The first is provided by the
>>> schemaLocation attribute and the second is provided by an annotation on
>>> the
>>> profile application. To successfully "import" a model and an applied
>>> profile
>>> from OMG XMI (assuming the XMI extensions are missing), I would expect
>>> that
>>> all you should need to do is the following:
>>>
>>> 1) "Import" the profile (i.e. open it using the UML editor or load it
>>> into a
>>> properly configured resource set).
>>> 2) Define and save the profile.
>>> 3) Add a schemaLocation attribute to the root element of the model which
>>> specifies where the (just defined) metadata for the profile can be found
>>> OR
>>> add a such a mapping to the URI converter in the resource set that is
>>> being
>>> used to load the model.
>>> 4) "Import" the model (i.e. open it using the UML editor or load it into
>>> a
>>> properly configured resource set).
>>> 5) Add an annotation to the profile application with source
>>> 'http://www.eclipse.org/uml2/2.0.0/UML' and a reference to the Ecore
>>> package
>>> defined in step 2 above, and save the model.
>>>
>>> To be honest, I haven't tried these steps myself, so please let me know
>>> if
>>> you run into problems.
>>>
>>> Kenn
>>>
>>> "Peter Ellsiepen" <peter.ellsiepen@vega.de> wrote in message
>>> news:ete8ke$qia$1@utils.eclipse.org...
>>>> I'm trying to write a converter that takes models from MagicDraw 12.x
>>>> (UML 2.0/XMI 2.1) and produces models in OMG XMI 2.1 for UML 2.1.1
>>>> format that can be read into Eclipse/UML2 2.x. [Note that I cannot use
>>>> MagicDraw's EMF XMI v1.x exporter for various reasons (it only supports
>>>> Eclipse/UML2 1.x, it requires the MagicDraw runtime and it re-writes all
>>>> xmi:id's such that I cannot trace back to my original model - only to
>>>> name a few).]
>>>>
>>>> Converting the model itself is fairly straightforward since I "only"
>>>> need to translate the differences from UML 2.0 to UML 2.1.1. However,
>>>> I'm having a hard time converting profiles and applied stereotypes in
>>>> the models.
>>>>
>>>> To do this I need to understand the exact mechanism for applying
>>>> profiles in OMG XMI files such that Eclipse/UML2 understands it and can
>>>> read the UML models *together* with the applied profiles. Note that I'm
>>>> fairly into XMI (since version 1.0) and UML (since version 1.2) and all
>>>> the different versions (XMI vs. MOF vs. UML vs. Eclipse/UML2 etc.), so I
>>>> think I understand all the issues about metamodels, profiles and so on.
>>>> Here is my problem:
>>>>
>>>> Following, the article at
>>>> http://www.eclipse.org/modeling/mdt/uml2/docs/articles/Intro duction_to_UML2_Profiles/article.html,
>>>> I managed to create a sample profile and model using the UML2 editor,
>>>> which largely resembles my original MagicDraw models in structure
>>>> (top-level XMI element and Data model, etc.). Then I saved both as OMG
>>>> XMI (by specifying the *.xmi extension in the Save As dialogue). Now my
>>>> problem is that even in the model stored as XMI the profile/stereotype
>>>> application only works if the Ecore extension "defining" the profile
>>>> exists at the beginning of the profile XMI file. Now obviously this is
>>>> specific to EMF/UML2 and should not be required when reading OMG XMI
>>>> models and profiles.
>>>>
>>>> Attached I put my hand-crafted model and profile (in *.xmi format). As I
>>>> said, I would like to get this modified in such a way that the profile
>>>> does not have the Ecore extensions anymore and the model does not need
>>>> to reference the "contents" element in the Ecore extension at the
>>>> beginning via "xsi:schemaLocation" (apparently the "schema" of the
>>>> profile [NB: I know XML Schema but could not find a similarity here.]).
>>>> And obviously the stripped model and profile should still load into
>>>> Eclipse/UML2 with the stereotype(s) correctly applied.
>>>>
>>>> Any help is greatly appreciated since I'm currently stuck.
>>>>
>>>> Cheers, Peter
>>
>
>
--------------090507010705050704000300
Content-Type: application/x-zip-compressed;
name="gen.zip"
Content-Transfer-Encoding: base64
Content-Disposition: inline;
filename="gen.zip"
UEsDBBQAAAAIAFp+kjbsVG0LYgMAAAQMAAAPAAAAZ2VuL015TW9kZWwueG1p rVbbbqMwEH3P
VyD2uWBjc1WSKmp2pUqtVKntat8sB5zEWsAI06b9+x0gIbeW0FX9EAU8c2bm +DDj8fVblhqv
otRS5RMTW8g0RB6rROarifn89OsqMK+no/FbJqM/97cGWOc6esnSibmuqiKy bR2vRcYtla0s
Va5sXYjYfr6/sx0LW9gcGbvVegJOryfEqD3P/fTeb7PZWBvS+DgIYfC5e2yg rmSuK57H4sz9
/v2hVEuZiiOQjK9knJR8Y8Uq26aj7c7WgmTPkWqfOfiwLyCe+pwiaxm1tncq 5lVzEpdBD9M0
9k/7f8V+/wfDDkM/Zw8LUXGGfcdDlDgMY4961MG+R5HPAhfTIGSOE7BY5ZXI K20c1S+jTij1
GU3rvUYZcxW/ZGDf5G6It0KVlSgnZle4AYowu43fndxqGLvFAU1F9yoRaRNI JhNTCMEwoi71
fIwQwYRh4lLiMWwaOc+A+TmvuGm8Si0XMpXV+8QsXhapjNvUalS1yUVyo7I6 uwa4ei/AsQ62
fWt28Xo5IkEQhA6jGAUhYaF7QMzB4nmugAWR/ExFDd5bxHQPMV6o5H06e6nW qowKkaZaikLk
1uimFDVc5Pg2xjbyDOxF1LNGT7JKRQT7bRHwb2w3GLvC7cPKu7cFj//yVZfe CSMP7e5ARqjv
uCFmBH49H1QTfkwJrPawQJhb/M/seg7SuJj8Tcq1Hpx64CM4RY9QFwRP0Kcp GfvsmwC4z/KD
/Huspb4TfDkxlzzVn3PSGM4Wuip5XA0zjiv5Knam9nAGb7fd8xEasVzKthP1 xRrEteciH2Ti
Yg/0D2oZxPUula/SfVxt2/9mRZFuiznV+5lBXzhjYMEuDesWih0fYxCX71wA 7Vc9rDGvExTJ
Nt2Pi+gPsi7FsvkCv3FIHJNtn7O970Unumsbvt11/Pa5yynK2m8NNCjKR5gX QtXlDmTfdwm0
o9DFBFHmBP4F9ndrwbVg+7Df2UAOVtwFeOJwv/J3w+/shhDNJV+VPLvNl2pg 4RgeKQvCwPEw
pESHpNRUvQ01AJ9Q5joBpdDuySVZN6sZXyAFlsAUg1vD4RQLhgCAPrpW9N8g 7VyFr6sbrB3v
B5rr2t8XFef5yIUP3SOEoAAa3CDiW+Y/7LiXwn2ln3ZrdzNuZNfcucb29k4/ /QdQSwMEFAAA
AAgAaEeTNq7CMJLaBAAAgBkAACMAAABnZW4vTXlQcm9maWxlLk15UHJvZmls ZS5wcm9maWxl
Lnhtad1Z227jNhB9L9B/ELTPse43w+ki7XqLAMk23SSL9omgZdohKolaUYrj v9+hZMm62ZYd
J2iLPNgROTNnzsyhhsnk40sYSM8k4ZRFl7I2UmWJRD6b02h5KT8+fL5w5Y+/ /PzTJAuD8V3C
FjQg0ktIx5WJPtJkeBJEfAzPL+WnNI3HisL9JxLiEQuXI5YsFR4TX/nr9lqp b+fb7avVarQy
8q26qmqw9eY+93BBI57iyCelFfFZQhp2xA9ozEluTMKFcKArU7GttAHwe4E9 3t4IYDk0TsfF
lhvm4zRPcYiltAMQhNZhhzpSxV45547OL2Wk6UidXt3NSIqR5ui2aho60jTb tE1dc2xTdZBr
aabrIV13ZSnCIWR9u97UQJZCMAzZnARfyYIkUDNYRgVEBBARBEcCIoKwCDzD Dw1jlqQylFOS
JgLI9CUlkSijRMS3OUmGEpv7AC/kKopYmvPE89zSdQxA8iKNp9vFWuLEfHxg f1ifpvPM+3bj
r/D31d+/X8kSZ1ni765si8gNAIDgswiwpz3h77D/D16SU0lHpece9iP++PW6 wrppDa5UOxRE
jDj4s5Omogrbu4Qs6EvdYZWO4PS3AHNOFxQk1k0qX2zTmXXpLCCH662z+xT6 hAln9XDnaoUt
/BNb4uK1LSElpRL4oVK7tu3YyDAd0xOl9mSlyYjSoKS5Ru7TJPPTLMHBZ4Lh k/SkWYmylWXc
0/hFpWaYE7QtliyxBIpAwHCBAw5+ArYiya8si+CR1mX9AcLv7JYnoGYgjR8U pYaizUtP8iew
c5WmCZ1laYcdsosdv4L0gJdn4uYTTrFYOUBPs92Bnul1lB5JDKzXRP06scd7 xH69eVn+u6Ue
v6PUdUM3HAO5tu6pSDetd1P69/1KryoFr2iovr/h6SyNfZLo+wEd1+ZDOdul /+879V9Ogf8n
9U+UcsAopymlLqhiTOvpz0lczDXX+ThXyyyf0etrNXoHTYZS8Qmz/xdgnUMc cuhN2plUy1wK
V2S+AdSCeSsm1xb1e+dr0bAjmOY/IHXD/kRp8NCgZj4NSAjMtqJWPA4cCeHw MFUTjg3Dc+H0
sLSyHcX4Hc5IMo0GunBcTVUNcGFIQ7ZbhqEaIqJe8clWEaQVzXelBEvHZbWF VGZFSl8oXNfe
INIz5XRGA5quL+U4oc9YCLeAcChQ8+yV8HKZkOXmWuUzKBynwhkkB013xTnz 6Wb1kOd2YfAr
jLeSzOKYJN9wkLUb9gZwgrofo4CG8HX+BedqP45yTXM9z4KQ1raRnkUwcW5t z5RJfqDtQQFH
EFmKGfGY4LrlWp6ot1kFL0NOlLK7msoqZfQm2rI9y4EutA3XEqjsE7RVuDA0 0/Rckd8BbRXb
oeh6zoPzFtpqQ+rTVv4yOIfAuveY8ymsW54jFNYxfnuFFSHhsWVCr9vquyqs CG7qrmU6kK/3
Jgqrd8wgWD3tMeSvAoUcqhmtPWAkDAqYrgdi6Ipu1323VwTn6bm0OQGKNPpm 5GEDSM/teFPd
irJXEKnVE3MMz7Ycw7ZhFjBM07R0IHLHlbhBXzYLqL+fgLtEyIw+k54heBgR pUb2svA+nd6d
NA7fiE+pzqF3bG1uG3DZe23H75ljztrx+6+Gb9v8tu3ZcKx7mqdbyKtOsMZ9 8D/U+hMl2/4j
BX7/AVBLAwQUAAAACABvR5M2oQHf1a4JAAAPPgAAPwAAAGdlbi9VTUxfY29t cGxldGVuZXNz
X2NvbnN0cmFpbnRzLlZhbGlkYXRpb25fUHJvZmlsZS5wcm9maWxlLnhtae1b W2/jNhZ+X2D/
g+ACrfMQm6JEiUqTFEbq2Qk2UweTzqB9IhSJdrTRxZXkxAH64/eQuvgiy1GU uMpst1NkJjR1
eM53Lt8hKZ/+tAx85YHHiReFZz11gHoKD53I9cLZWe/Lrx+Oae+n83/+43QR +CfXcTT1fK4s
A++kfAQP1B6M+GFyAuNnvbs0nZ8Mh4lzxwN7EAWzQRTPhsmcO8PfPl0O16cn q+mPj4+DR01O
xQipMPXqRko49sIktUOHF09xJ4r5xnPc8b15wuXDPJgKAXg4FtOKZ0D5vYp9 +XQlFJOqJd5J
NuUqcuxUmtjkSaVGIVgawww0QGJuT2LnuWc9pqqMsKmJkWZQ+IVYBFuGibBK GNZUjZoMtAnt
AGz9avueK3VRchf0lICndhC53P/MpzwGl8E8lmnIQEMGazOhIYNVGWYq/PGC eRSnPfCmopwK
PcbLlIfCiwoX/3J53BRXKQOk8FEYRqlULZGmpU9zUET66GS8+nDN7ruP1u2I k5/H7sL6euU8
2n88/v6vUU9JokXs1Dt2C8dcAVDBiULQPd2x/LXt3Nsz/jLMWSGvCn6JfZh8 +XxZaprHRTKs
zBxmxk62jR0iIeM65lNvuWuBYQHvcB3fzG/DDcdlY/PM0Evp3zUcZM6uf7YG RaNQUbK/oRb8
AlgksA5vhmIZIJkA7uZqbCn3SQRwT7kDJJplmQiDAeT0dwzlKJ0ON6zfAMQd +zwAX+6GZD0u
MEOMTi2ELbBeNTSdaCY2iYGZRQgywGCNFgEByihOFMx9Dk7gSQK/QImKbU8E TWF39Bhy9/PC
37b4opy7d3kDIwsbyGJURxgRRigulhey2DSK2dyOYSDlcU+RMbtMG1uyyh6p 50UU7IApH31G
T/iFaCrTTBNj0NOComVnMVvC39jCUi1Q7DZyn85vwPne9EkpTVWEeokC5ivR nMcyMU6Hcm5p
0nDdpo06kSFfFxYXvp0krYJxUqhSZi6sl0jdvYxDtpaazO0/Fny8nMcQP5vl cRdS2NIQQkxX
qYl0QErbQMq3w9kC4vl8cnEFBfJ0WA5swymBuS6wPD4HGEe+3w//DAeuF3Nn B5rFo9/76Y/n
NZ+VEn8uhPzbC92Tk5ini7hOIBQG3+NJzacQQDWfCBAHkeNfJl+AsKbCnf2j o0oMbKBfltMy
K98qTTUd6p5lMIhhnVjMUFGRpuKnTNMyTrtMU6GnBuNUxVgVeuKmabrDwopP yvhPlOQuWviu
csslDO7/fG4WwOqEqoQAPGrL3BRwtci9H37oJvQ1pJoQGEgDyteIZTFNL0Pf Ec4CDXgsE2DV
wHcV/xpwlGkgSVOWpjHNQM3Cf6eVFR9c5gaW0X9nP3BlhYKSe+Q9pEOh6816 kBwiNQA6qqlU
15iKoDkA5PSWmdGvJwPJA4JsJtP+OFwEeapfeUBGtl+hhWbcs3LcseChcTBP n/pdMQw0VFg3
Zf3VLAPI3ywbwWDhpx4Y4njpk0w0UDtyvM65BrbviGLKNMuEYWhXmraEu2yt eKdoCdet7z6t
RmvQHyCZABrYa1HgX6AbZAIyRstkSrg/HQQ8uOXxONyuR8WkojOs+bhf17TV jP9ZJ6c+scOB
Hz3yGLbGi+e7vbIaxG0WWszntQt1lfVQPlWKCYKqaRBo+SGnKn2lkwVrd3kO /xvUJMxUYe+m
gY5WwzzfZV3FMTIX+TtsKLMnD5HkgIulWVQHxqSEUsClLWV+Y80khAGlCPYm zNKhoTYhpMwi
3m9EOCUsWqSzyAtnXQY8RZiKfThswg2sMlNrvInaYV6V2IQYxUuURy+FmE+V wmQFAAwTT+6v
Bt3H/1ceA/6HSYACJ5UiSxQW2jL++33Jc+vtoYS3jjnsWios5IySX8GmXMog WdwGtnMH8FY4
441WiPkM0Do+95K8//z+u+Xox1qGq5h7nfCFGyX7jG4uDLI4zA52riEg0/LG 4SjTSv6oN3AP
+1bdVLvUq4344IW2vzcK6vuHNvDuAWTL5evCBvewwNnaSHaUxpdeKgF5qeot lgrT+OkvWgu2
aQG4Ja0jqzdcyuV8/tFL0ije3i4cYLHkzvahgc3XOxL/rTJF/ti/BS1Kf/cb UI0CkyINtvHE
shAhDKhvi5q90ImCTqk5VxK2R6qOYY9k6M2IeadxFWdUiLkw+G9DzCt8sWEY sP+EVrUlM/u8
rqzc14yf1IxvJV3NrLOWOV3zmBfK7O3/v8FowIDNhdU3GC+2dk+3cdBl75s6 qhaVPW3SfZVi
vBAKj113RFO7yA5J7Ql/l7CiUSk5bz/TFbW0c6bTCQLywCYCMlAxMQlTDWpU Tl1sBxi9M6Zb
U9KiSIdNKChJG5FdjX0Vh4yEge/w2EXqdQByW8NFxwbFusDFbMlu39y5i0Yt LMKImJaJLAZD
RcSX19bZYSP0swFgKV+b6Sj4QV3T0ogQTqkFQcxgqUaxv9vQihsuwEglt3Lj Kq/EQhE3Q7Pw
PeTDp9wbb58RgJauYks3KAOsdaQCWu0PYupZLeYO9x74+AFgWetPcsMmjrOI JRtvXFUeDXgx
v9GdQD1jZ43c65UQ80UvAcEjpTTjvcPBks9f6TMow/e5FuWvKzu6qRKTMqi6 kNLMwNXrDTtN
Y+92kXZabwo9iaGJooEbH/juMLDKtIWF75Btr2MRNOnTYcpLgY5mEg0ZgE7b l2b6a1fezwX3
8xVh34sG4IB4Y+9wGYp3DOTmoXpPWDz2TA341roF8BbSwWGYEqyqENzlLQ10 Z94DbEjeyU0N
MSwiLtJ0ohKDmarRNG93WFjN28zWp+pFDXdn2w7tIHcL/X6J3AO1B1AO5dtU 0FLphgX4ts3f
l9wMyPN7YdOLN9YVUQVC5YurbyP2Mpwv0msvfL2kGx66N9Bo2v4oqzCvljhy HD5PZUOQi2xX
s/oNjqYba5e3KuMldxapfetz6YfBHZRof+/bVy9dITd5AMqDi9YFd9QCaZRA mRFvT2jY0iCV
dIJ31NJ3cbSeK6ojSzNBz+Zn61ULn6+l5dn636OWrlCigKxpAEptT9ZfUksv s8PDtyl7B6qm
1Yr1apETmf6HqdAty2mD88/Gym0VOy/cqnWvlDu5/Q930qxEy6+Icpd84Evh JVjvY1a0J9Nx
MXK5vX5HtRYSCyoQdIJM1SxdbObKL1YmEK08EgKZ+D5l16/UEQrbTHESaRDL IpgRs+F76rtM
rLjzpjRWCRZJmh1tCbOzV9W7L7YrBQ9RagGj/PU6g2LYIIjDrZalViZGmQJC nQKLyVSkyrGY
AbnSf+kbseFGjSm/5TkO3aOjV9+QlN+ULJSF0VMBfvG9bvj9v1BLAwQUAAAA CABvR5M2QtLc
SQUFAAD0FwAAJAAAAGdlbi9VTUxfY29tcGxldGVuZXNzX2NvbnN0cmFpbnRz LnhtadVYbW/b
NhD+3l9B6OtQm68iZdQtgqYdAtRNsaTdvhGyTDvc9AaRttN/v6PkuHXcNoKt rZsQA5Gse3i8
5567o1+8ui9ytDGNs1U5jcgIR8iUWbWw5Woafbx9+1xFr14+e3Ff2MkfsysE b5dusi7yaXTn
fT0Zj112Z4p0VBWrUdWsxq422fjj7N2YjsiIRM/Qw9VZAs4PLWGNYHls577Y bbfb0Za1NhRj
Ajbvblqo57Z0Pi0zc2T+Kc3tIvWwR/2hqZY2NwdoRbqy2aJJt6OsKnZ+ufGx 0Qjc/xrb2Un3
8rsqa1+cRgdL28k+soeb8rYw4GpRT6NZVaK3Zo5IgoiacD6hHP06u/0F0wnG CDYoo5fBsKXg
ssrWhSl9u1i7wJv7umq8aQAobOISNoEg/NHBl5/2/AY3xh0ekDiZVQuTt6/a xTQyxmiCueCx
JBgzwjRhgrNYkwiVaQExu0x9GqGNdXZuc+s/T6N6Pc9t1rkYUOs0+ytdmcWb 3ARHW2z/uQbb
sN6H7ttov+Q+8hq+1oG9RdosdN3FW280Boa/Ctzh1TkF20U3O0u0Y+q7Jt/w fReP8T4g3f0x
/ZPN/tFv69zsN6EJ1VirZYJpQjQhMWOYSMUoUZrF8DDRjH9/F4+ueeqMfl1B KjepLf334CWm
mGnKmGjhcV/4dD5vzMbu0vUKlnmdu+WVuzTLvhCmaapmZpwDKjuIIDqH3F21 zhfoLt0YlOWp
c3ZpTYOCsMN/i1HfBZwB3bQUtUs9MHQWI0oIyGmRaK4SSYXmsejrTh9GOnjO NNCBRYCnfeEP
GYFM9ldldtuUri/AIR8BwCDr0NZ6IMQjC/W8gHqOwP3S2bCMO4GKbdqUgDIE GRz+JBFSaS4l
YUrHlPV1qAcZX+AlZjJhAH+iPC588744QxsX3jd2vvZfxDE3bdU6RQsDEgDp ynGspNBUQS2J
NRcDq2EHz2jCGAH4E9VwkQUxvFms+po/in/m7QaCd1Ca9nowi5VxE5RVpW+q HC3zautQ1aBq
/qfJfHf/c3lqMxk6MdVMEgIPYzK4UOAO+MeUQ22MyYlCua7P0sl1bZoWaQid DNYzuFCE44RJ
zRJCJNEiHjT6goM6BBEwZiVcAXrvGeEw+LPQwt9WzY1v+gI8bhmmMVUY01Cx dr6TSWF82rXx
n8pBLJTCioZWgankWvav5X046ODhecJBC1JLIvvCH/ft67UfsG/DZ1X9l/o2 F5hwSqEgQcaC
JBJNYpX09ehpNr7CF4QKaB+AH/fFP2ocZ1UksK+af7ca3ayt/1H0CVVQj7hg WnElEwrRYb2T
tQv/7vz17WrEJJUiBiXAKBtDsWOql9tPCpjCh8dKt8UUcBXv6/TTKRPgcUJj nEBQ4EQkAP7E
UeNDU9zWZ2TMTXvM+YzqtIFUgYqKQkF1aBkmiof+9o8m0FNMiIQwLBXRDKiI sRZy2HaWEMpl
O0ywJOYAfyITs9wPwEOxzr2t4YAf5r9AwoVzVWZPpWG4MhqaDudJmCsIlxz4 kFj1dagPEbFg
GMMADsO9oCTA9y4TR0UUWtqw0/e+q/0vpm8Yz6ATaSU5gVPqD36KenT1oglO RooKrANjmAN8
78nmkCaY/s7qda/DkDfIEXW4WhXDfBEnimuCVSzhCM+GPKACvEoop9CNZCKh ecCjvvCPY5/P
3Op3GNmu674Ij6Kf5jkM2+3doVIemgYKP6WtyvMYeTHe/Yb/8m9QSwMEFAAA AAgAb0eTNt/b
Pl21CAAAoi8AAD4AAABnZW4vVU1MX2NvcnJlY3RuZXNzX2NvbnN0cmFpbnRz LlZhbGlkYXRp
b25fUHJvZmlsZS5wcm9maWxlLnhtad1aa2/jthL9foH+B8EFWgdobJISJdKb pMjNpkXQpLvd
F3o/EYpNx8TVw5XktVPsj+9QsmTZMg3ZSerFYoGsLZHUzJmZMw/57OdFGFif ZZKqODrv4B7q
WDIaxiMVPZx3Pn745ZR1fr747j9nszAYvE3isQqktQjVoNpCergDV4IoHcD1 884ky6aDfj8d
TmTo9+LwoRcnD/10Kof9P+9u+vXl6Wr5fD7vze18KUEIw9Lb9/kJpypKMz8a ynKXHMaJXNsn
h4GapjLfLMOxPoD0r/Wycg8Iv1Owj3e3WrBctFQNiiW38dDPchXb7LQMAsGj CaxAPaTXdnLs
1Oi8IzAWVIw9gmyXwRfKKeGuhwimgtjYZp4AaSI/BF0/+YEa5bJYSxN0rFBm fhiPZPBOjmUC
JoN1opBQgIQCni20hAKeKojA8E+F0zjJOmBNyzrTclwvMhlpK1pSfxrJpC2u +RlwiryMojjL
RUtz1bLHKQiS22hwvbpZ03ty++HKkfT19WjGP90O5/5f8//9etmx0niWDM2G 3cBxKQCIMIwj
kD3b8vi3/vD//oPcD3NRntcEv8I+Sj++u6kkXfpF2m+s7BfKvtlUto/0GW8T OVaLbQ/ol/D2
6/gWduuvGa64Ni0UvcntW8Mhj9n6vRoUrVzFKv4HLvgdsEjhObIdipWDFAfI 0VKMDeHutAN3
rAkg0S7KtBv0IKa/F2iJ0ll/Tfs1QEbXgQzBltshqfsFEUiwMUeEg/bYtR3H 1Rq5VHAHew4S
tsdKhwBhLHCwRA6zSKYpfAaGSnylfaZUO55HcvRuFmwqfFWt3fV0zAFL5DHA mXuM28ImTvn0
0F+Ai4KuqcqkCGdBpqaBGqrsUfNF7ryLrLVKqzDKJb6Kwy14La/ulthG2Pa4 KzyXIxcOZ27H
8gvnrezQWtdKLBDsPh49Xtz5C6uuqwWcVaKQ81c0slRq4bN+vrzSql9Xa40z CjOYXOQq8NP0
IMeEGJ7KJHusghgep5eqsSrSycaT3kz9v2byejFNwJfWmXIbVgS7EHeCU8pd AljRNawCP3qY
gWtfvLm6Ba4861cXNgENZLaBVXknngKqclDqYVh1brgOsMVDlSvaC2V4L5Pr aHR64UeP3emX
qWHTD0H26sJwL5XB+MRwT0U/fL94/Qr+XL7qgqvt1KgXD4Ob9CNkubG2e/dk tdePRru3qvSq
DLk2u8yizKYAKhD+rClOTZ7VJ6DPQMnUcFo3P25PC+FNNM/6a/5Z5Z6Kw56J 1DAllGPqCocQ
CpkDckVJalEsoJ6ZxCMxjhPh3+vjhpnQHrgsH45GbJhhrvlJQPVDNbFhuyWx bdO3YY3fY6vQ
3ALNrcul5tabUvPjE1olyoswGqa2QxyCgcqQzR0AiRzIaCot0TOxxc5YKqxw Csdch9PssXus
KAFf4ZBBifA45ESbVWVHFQwCiEcMtT1BGrkKlyMGCSGuC+ZDQptTBwlHLYOk qW7DMjdjy8+s
QPppBmlfWhUQOuOXyltL61rZBBav0Kmv+dZjCawAVRjiwrGxhxxAkx8nljSu iU5wl+kHUKV7
VZnjpGc8+l8LMIQcYHVPuDbBDGooXIUYdGG+Pm+VeIRKBRggeTxmcCGHIhcE JowRjwNTts1A
21RtGKvyydSKx1YJAVTbEG730tLaNy19hNh5DZJpb3qZ0EEO4h5mgkECIgww PjQN5bhUmJ5e
QFq/DIJu/CUG1/9Du9Ke9VqWzOTRkpHnMkoREpS4CHPwwKoPBT4eC/DBryL9 eEznEVtQhigD
MXnrCNmiYMMCt6CqlU7iWTCy4EwdFV9PSllx68sEhuc5nNuewMyBKlZz0IGB oVKN40H5xNxP
rbLJqmc6VqxQwsCHwMM5Bpw8p9bcqGgCLJqPscU4iUOho+eYAUOZh6njCsYp OL3XdlbT1LFh
kSs/yoNkqbLlj0b5iMYPiqoMSjSNgOXrim7THb7B+KG251AbvnHgGQqYHTqx eZBQVPlBlVF2
BYWOtJNjR4SNkM2oDQ6GPQ9jnifVZUykKnoIZG2QOVfZ5KuZZq4kt7nnUVTM X9tEyFadGwaC
jiZUUWOgmU3k1qHmTxBQVgx3k/pt6GsSSERBEM/l5iDqm4ujFa7cpsgmeRF8 WByZJ59+lgwM
t/7rP3TLiahpGmkciWZZou5nmTzVw0xp7Km6vuHGl73TIlhrWgRWY8xo2mEc ZtbOqo1B24xk
AU/DqlPTtFcuVJqlXZPCzwZQ1NNhY5jE7g3R8rQ9/aIxiK0w3FkMPQnfVP0t jQoaBT1O/sCE
uy7RxTl3PYawsB1e5Q/4K5YZUf1dtK8yK688JXO8IEX+uibve5m9BFMCaoxz wrBgjku5I4Av
D2TKdXx7VQHipyB79+R0tzfplzpGjzpybeJgrOtfh+khGcEOFdixq4I9/w1A 6QRCFl7wFJ96
UjXiUE4c7jLH1sNxqCcFAYlblSMGNRvmeF/0ttDX6vlqTXlrqXz+cqLwl/rr 7t7xy45GaDx/
SGkUKcb6tSvj2GFco3hoF7yjbC/3PD0flSed/1jI8+PeJ+x4mTqPoHZfRVnz PeZBWa1xbNNn
Sr45P1Y+Yox7lLpEgCt4DOKQeSVlwFaZjH3d3ks/m4FTiensHkr7o9EGiAvO ivRPMqiDGTgv
4aQVa2xXtGEx6EHzjqVUGDr+/HsFRTkyA1opsDg+W9yUsr0ATWjAkcOhYBEE Ew+jJ8zKcmAu
V33DsuU3xI5pqGYqi8e9zypV9yqAvvP8U/XxNxWNBoOtpip37k9FhnG4sdXx n022f4UVCEHI
hczK4Dp8cRgTmFbvk/KuYH2qkV86FinUpSWexwlcdFu9qTXo2TDCrVZvfbDx WfdYNS7IEdCv
aSMr//nKltVfQV1xVxNqefbzc0YdVWBoKPMA1UPf2XZ3lRbmZnf/kN7xnF0/ bzqsLuh2d7XW
u3qMXBbTQ2PTiQf9pOoUN7Rrxz7Vj1dL/4WrZ9oHy5/aw/d/AFBLAwQUAAAA CABvR5M2I3Dh
V0kFAACsFQAAIwAAAGdlbi9VTUxfY29ycmVjdG5lc3NfY29uc3RyYWludHMu eG1pxVjBbts4
EL33Kwgd9rKtTVKiSHnrFkXSFgbspLtpi70RtETFxEqiVqKddL9+h7Lj2EnT CGqC6mZR8zic
x5k349dvr8sCbXTTGltNAzLCAdJVajNTXU6DL58/vBLB2zcvXl+XZvL3Yobg 66qdrMtiGqyc
qyfjcZuudKlGtrwc2eZy3NY6HX9ZzMd0REYkeIFunq0l4PzQEvbwlvft2lu7 q6ur0VXY2VCM
CdjMLzqoV6ZqnapSfc/8qypMphycUX5qbG4KfYRWqkuTZo26GqW23PnVju8b jcD9Q+zWTLYf
z23afTgNjrY2k31kjw/lTKnB1bKeBgtboQ96iUiCiJhEbEI4+rj4/DumE4wR HJAHb7xhR8Gp
Tdelrly3WbfB++vaNk43AOQPcQqHQBD+4Gjx655f78Z4iwckThY200X3qcmm gdZaEhyxKOYE
45CEkoQsCmNJAlSpEmJ2qpwK0Ma0ZmkK475Ng3q9LEy6ddGj1ir9R13q7H2h vaMdtvtWg63f
79N2NdhvuY+8hGXp2ctUk8l6G2+5kRgYPgjc8bN1Co6LLnaWaMfUgybf8X0X j/E+INvf9+mf
bPav/loXen8ISajEUuQJpgmRhMQhoUxwhmMqRcSxwJJy/qBLd56larU8sXCV G2Uq9wA8FTEm
TCYJiQE86guum8Y2C922wMI0OFEVqqxDplrpxjikssz406kCpYVqW92ivLEl UqjQKkd6y+mo
72ZquWz0xuwy48zOqpXJ53lf81ZvvFdAVOf1DU8/xwvGUcwwlglhDFMZkqSv O714AXhCBJdx
SInw8KIv/DEz57VuugO1yOYIzqZ8EqFy3Tq01OjfNURGtwOZOK9P3az9c/1w ltx5noOJhNKQ
Q5BkxBMWxzKkcV93+jCRUMIwF0SyhIskBPiBObJQ1xD2wpkaagXEAEHhBZWo baszkMoMtSu7
LjLPChnIxwnALQo3fbjQ3Xmeng+4tZwIqCtYRjgS/mUUsr7+PE5Ih8+iSEQy FJREzOMPZORi
H3BbaeBit62nYyc6uW3Q+cmcjvDtshuaLScA8L74leRAXUkSzHyyUEwwhRiy 3u48zo2Hj2Pa
VcWYC0xkGPWuisfUfF5pdKkrqF2Fz42ueLnbd+a/beNiqrtvWu32xc0btKDs A/m6ANOP1YX7
WPW1fxbGeJyA/jPJRZx44sQTZlMHL5hnjFHoAxKAH5hMcy/sN83arpT5lgB4 UEvvQTpU7+f5
rD2z7h2g9AV4FiIo3O0udSJMvSQnT5s6lCWeaMkTEJtQDNT7WY6U810WpICv avZG/30Gdb2Y
yY1ukGn3tLw8fH8rQj/J2nntCTsp2vyXEkehk4pBJ0CSoChh6HcliZ+OuEN4 +BEJIQkbSN3c
XgEBRy0CHHKtDzgpuk/cCtrtdV1/9+uBdAHyb4X740td97UfQtXF2rgfNg9U CBJFLJScx5GA
gTEOeyvIlq3dZPi9HIuiOOaYxjDtRIRHWIZc9HL7sdIgQFRFAi0JpC6HEtrb 5UfvlwcXCWcM
CgPF4G8I8L0nwOP79a4oOknMtXLrBkYyUE//GzbWTa7Sw4u2nWgH3qVZ5T7A Hp+WRV/7IXfp
EVJCjEPBQpb4eg30QOP+lMJ5C084JyCcIaV94e9V7BKYuDsaeGa240E3SXcT AhRt8hJUFVlY
bQ6XoZo3ULILXyCygbQtTAXDAzmz527lJ4m+KM9AHoEWn0UcMjWCtgeaH8qf NKcIA7UlLJYR
yG4Mkh72loQ7ObUTyQOdTXf/hazUBuZs7VY2Q5nO/VwxkJgzu3Cr2c/q6Ovx 7r/XN/8DUEsD
BBQAAAAIAGxHkzbRufGUlhAAALSMAAA2AAAAZ2VuL1VNTF9TdGFuZGFyZF9Q cm9maWxlLkRT
TF9DdXN0b21pemF0aW9uLnByb2ZpbGUueG1p7V1Zc9tGEn7fqv0PLOVtqyLO fbiU3XISJaVE
kl0+9niagkhIwpokGB6SnV+/PSAIgsAMCcAApCj7YkoigO7pr78+5oDP/vF5 Ohk8hItlFM++
O8Gn6GQQzkbxOJrdfXfy8cNP36qTf/z9r385W08nr94u4ttoEg4+T6NX2S3k FJ/AXyaz5Sv4
+3cn96vV/NVwuBzdh9PgNJ7encaLu+FyHo6G/766GOYvX+4uf3x8PH2kyaUE IQyXXr5PnvBt
NFuugtko3N4VjuJFuHdfOJpE82WY3BxOb+0DyPDcXra9B5Q/qNjHq0urWKLa Mnq1ueQyHgWr
ZIhV7hx4FALRBK5Ap8hee5LYLhp/d2IwNtzchAhRhOEXTilGXHCJlSFEKPga C9BnFkxhtD++
vxz8sF6u4mn0e6LUyWAaroJpPA4n78LbcAGYwWVmo6IBFQ0IN1ZFA2INMfA4 E03n8WJ1AnAO
BmdWkfPPq3BmYRyE9qdxuKhq2OQZ8JTw9WwWrxKVlsnYVl/moEgC0qvz3Ze5 gd+9Wz3chfzH
8/Fa//Ny9Bj89vifn1+fDJbxejHyI1swZKoAqDCKZ6D7yiH+bTD6FNyFdY1u tk/MWb9g/Nny
47uLTNXUM5bD4oXDzWDfFAc7RPYRbxfhbfTZ8fhsbNbAP0yC5TK6jYBv5RGe z9bTomm/LZt2
M4w9IT8v4vX8Gv6+zItryy926jfzj/uSyer6x2CxpcXSgTsWADaTBDPAHWFJ DGX6ZLhvieGe
Kfa/Cy+jVbgIJh5M0m+Lo3J4fQpNPJuFI2uIwbv1BDAZtiFu7RN3ZePG4GIW raJgkjn1QzBZ
w5e4HeFeN4QsMg8XqwhGuRVJWhEZOZxmI/LN4ywcn0/C6YbVqVTajlQvqD+H s831qTzWjjwv
qsBmyNqZOL4n7myYjyTVI0zyZVGFaiHmOQaW/3YQWM5fv72BZJyLL0wJShSW 8Gkw5wRrU3K2
g9Hl/WqxHq3WgP5PYQCfoWOMWd4vDtHrkPb25U/x4kOwuAtXJ4N4AQCEcN8t +CA8ZhI/hovv
4/VsbKPAYD2fZ79+W44KX6Wj14m3Or5PQOlDx9er1SK6Wa9KOnq9fBHO4UkQ SxIP+wCufEzP
kvd+AA3KqvwYrAL7zcngHrysIjW+GQ7PYZyW+kUXc4y/RQN98sbbT+GXRzDI i7aKz7U/eekX
TOzwx+/CySZs3YPqx0zUhoN7NfWScBwtn0pZr7N52XgfjcMriL+rxEWOaDgO b4P1ZPVPmyLT
/AoxZ7F2JJiWnfH7OJ6Ewaxnb5x4OTrKp+qnzwgTP23m88mXD3F/CcGropcv qYrPwIpelizX
INQ6bi8s9uk39brjTbAMTVpsHtaviT6+qDL1ep2ddBoHi/H5Z9usQH92G92B jE1JWc+AXUeW
J0lzUy8Zluu7u3C5CsdJ1/X0LncocYzDWb9a+hxx5iXGvjl/jIK7RTCtresf 2gfdRvudXHiN
loP2T2kxNxnAYt54F83e38eL1Wi9ugpn67rGao8KoKM/stzHj7vZo3/dh7Pr ePUacm8UHu01
/mSVH5jRG/d+W0ejT9ZsX8ABodU+aroOwf7FS+H1Mhx/vLrMzxbWU7NrWJ+E wL94CTyPl8vo
ZhLaoLeobawmmHp19BJ4CgSMLqNZaOdMmiPbzbwmKO6lzN0ihvp5/PxmNH8n v/Y1o8mIFExj
ZLRWHD6IUD3NacIgvW6f9A2pK3055khNvNwXuX71enniLMdUGSThKK3+XGt2 zny1XVLoigG/
VpvZf3P7zCf6fyeXbdOCGFSmBdeaUSaR4toQxigihtLqtGgTuksvRexOgYwh zxEqB5M6gEpy
TpiSjFMDiAksTSkgdBa/Lr28erL4deWtvGbh4zX8cEyZF1lfXXlZBFaxw/iq YqWqdl7Mjk+6
JPmitpLPEss2o+OVl4DzlHvJhpjnGB6v285kxb0wGilCCUbaME0ZRE+Ilb1F xuvnV9lde1k2
b9yyPEuCfbWhvKQaxZP1dPZ/K1krvTk0xfF6eR2PnzzVNpuhajM+v/EvxBQy 2zOM0G96KmAl
IkRTiqhRQkkijOSkt0D9pv0Stk0Hent8AWXD/ufrRm+/elN0ZTei4EZSGk2V kEaKvjanwRi9
ubWxF1VVyRef33od++HF19Jnw+1e9/RPcF3OeZM/upzhbL7ZWn+RnCjIDS45 JpL/LmfsSocT
BptPGKHtQZcgJ3TUrO7DEtsxbB4RjlNFCuolm58LVj94tMOy7PTzdPKNQanV z4Z7498zyXaf
cUGq3dAbLoq0r7Yv3TUFV96/fxbb5c50qtAvvbyr2KmEhk8IEFIyxgyVJFOi uFN9EO6eXXlE
wy50JohrqQynAgsNOoutzu7t7s9Gb6zsdBT8phWXoDfa6p1fIXkabT0ZRBDN BHSN3FAoRziD
FMK2Shf22j+N3i4xoDClhioFFjZUqK3C2Tb9Z6MqPF4xYrhmDFvyZba9Tnf4 N9c0i1xbiKrE
rvegdBivkmS1p3jFne+u+LUftX6Ipw656V8PWUtTjJHUmBqBmP3AUBIPgk0K y8ZTT91ddryJ
x1/+fjZMPrb5Ma/v3hiy+qKYDrOapo7thNacmAx5+7j81v2HaBndRJNo9cXO SkQPMNic3qv9
iiOx5aZm3mS9ebC6nwY28dn8e3nx/bvX7y7O39vfTrNzhadw2zeb23a1xllS 7CQ1dEFA6tof
Z5NoCj+Or4OkFjkeTbRChCFNuSWnnZmHP2aHWP6Wl53UXQdkp5VRVTtzEEUV hC9hlENgCnUG
a0dga2G0AANQw4tgb7e8vkywFdNESbiwN7CV0EobjJ4CbEaZ0MSuDyrNbZpH WV3nOk5SG/K3
C4tE9BA6eopq1W2hr+jDIlJLARW8lJxD4LW031gkOz/yZzCDUpJRzo0AXkBP TkVWt7rPYNS2
yR8iGmAiNbLpu+toAPZWkmpqINMoCL5JJfgE8QBkIwbezwRkPWYT0RZ27+mb l4m8gH6NKINp
98inJofGRRMMJnelns6R55hoTrGt8SRB0jCeIb9/lKk23M7g54P9l+Ah2Lth eTqJbhbB4kvi
AzelJYGz/I4kNxbbdYRKVqCSaCKNgOgvBVhhh3+yK7cnPDRSgIfiGhnIz6CS ybKQ84RUbVAa
cjDXc/VFRMyELchai8A5gWoUIKK4FQhpXxElCGXGVgAUG1e13zXqGOpBobjt 97jiUu86rcJx
sxeMN0cEJ2GoLcAP2FphxpShVEvIvC6BPQBu935hbhhCXIgdzQuH914y4DJp drHuHnAFORaC
O4izHGNPADhXUNlhqYjRNt0jsE82E5U/DNkX3ulUVG9gE+h6GQR1V3XbJtjW zlpwkCiFxIiB
aq4M0jncGkYrENiFYyjwwctpxvD82VIX3AP4Jh5F+fnUwyKEnVEACagTT9kv v9s03N7UqeAM
ccWg81QY42QCNEuCB0+/1mZM601519yh8Im0aTNO5iUpZKMi5/B3pRGT4FDa 1f20Br1/GYcT
QWCknDDOMDCY70Kk4xRvbeQbMuAJciOTGgoU2RbiByxOQSS0/ZoRwcHinRZD B9TgFBpiAz/Y
HSAS51rQwqHovkDvedYBKwpXEddkcNuIK0YVBBVNMUNg605nHQ6ooTmSykDD qwloId1M3x2X
ro37Hy7MM0qx7Xt7YL3AdnnRxnkkIc7KTuccD6hBEWUasg7DGFxRUQft/0we AHAoxZ3Lf207
AFNYM8OEXd8Fy3faEvnU0Br+4UoaCs0ZY7seuHj6vzbyDWN+pnwvgDMLuCQc mdbWHA9YWtup
LiglMeNOeV2jLVEyakYMRkpA3y9ZhvfhNynURv/reV/egd5sutlpCwG9MBcM E6i0oepCttdB
u7qrm+lmLypYcsWBfERQbjMxy9b7yi9mqI1EQx72XHsJSZl0L8S3yUJrawmN FoX+hgpb5zJX
qm8N8kKbB5WePVxFKMRbDIEnt7TgeLlFbai/nnQ9J1spKcfEORlYAfWL2Sq8 CxdH7E2QgFrL
SEq4lrmwiztHG0KsVDBaDoFWM24/SLawV3w5R22w/xC8Vhpja/U2t28VTawx 4oiBiQklUEc5
ZbUGMYw4n0YghkAeJQhyKcFCEcisJAve3neb9IV1B7VUcfAcahkYtYREahdK ScO6uZlUDj8J
a/I6MTwaxbOCEhfTw/8nAJZUS2YnSAxjWkHXhun2Xdo9bJ91vWYldbHCW2jq +/MhmZJLaIW1
IApKE7k/d757VvPp85wUThkwGaR0M39eIkJr8eDAyGxyg3hkC387q0b2MPPY bSOs7IDO/duV
CuOL9D9LSb475OPCHiDUGupPCKscKhRm9yNu/68Vn1KlLfQHLdyILNk5o+OZ x77QgwsorQhw
BSISsdO303B6Ey7OZ9Xu4zAogo0eVLgWinYCZbvapx9I8o0Avqo1iK0yW9cJ tw8y1r/nhzm4
9SW/lOK7TwbB3d0ivEtpO4qnUKRE9lEwLsjDr/dJfVT7HQRB0zur5y1HMXhU DEQdrvc2l+M6
SauJSIqIQkmjUyAKuEY/FLFnPSF5KmU3GDKhDTSf1Uiyu5MRzZA9Jor8NNld DU5MCRT7XLdM
FJdCZaqUXoTShC3Og9at8MWNRzXGOO/tgjM5QUza6SspXJ1Uq6TZyYQSAagK Mks9W5+sYVhJ
YXdRQFoXNq9XZs32TgGNv53qxwdZk15t96YKuziE2mdNSaEDrNk7I9+UO6XT 5W1RxwFKZeqU
7+2IOqkgCBksQZT2QJ0MYs2wTpYYO6dOsT5M3iLEmN1vBaUigvaQFznjvwVD AWAbLWHJ4r+M
wEDtk0VjllRRoUyPmvW784VK9ThQzbrlxuv4TV/l9X4JQHhGrfnac3e/MCEI dFlY9OPmlZvZ
krcfuZNrDWwlkgwqXJ1rzZv7flWFmlDA++zSbEZdJlQHoJWZiGa8OCwIcq9t 5yVrkx2HRVJG
7Nk6+lQcce6XrEKRvb2cnEl7NshPEffOz1Yp4lSoTJHC/xHaiC+Ow/MtsMUN RSWyHNn12hpX
cnKoFnarBKZdk2UPVyEVApnt0qX4pipPCed+i3DqYAffvDysooV7ArrGTFG6 wgGXZrOiewSr
M4d6dNIkm2drPgN9VIZjyslq7Ubv+cw/HxiXRJpAkUBFUsRm0Sl7l2/tVajW l5d7sIIQGtu3
0RAiFUtOlGZWsKPocTEuMVp7C3GumJFbWOeC2T82XFmvvJ/CWlhqZhsJMLVP Yps458QLKpQC
R7f7J6G7ohiyMClvVz80ddGvv3896qXRQ5aCJKUFVTg5Md8M72ZSqdREmGTB uxrkjRKmd620
3AmWGux0q0XqSXvvc67vfJUmIZpnqJqtenuBqbvk5BgShbJGa7vxEAtusMIF kJrtj3iGTD0Q
n6k9d8m5JM5zzhXoenRbTGJpAR2mfbkMF3ZNV3V6nMglXxJMkH1fINYQmFUW mLM3Qe/BvL6Z
RKOXhLItlxFXyn24uQLK1ea/GLKbRg1HlNgjzGqXATrY4OadboZhE63tqpit BoDeGdq5N1o/
Aa2Lm4i7Tku1Vg/ddUr74DjWYZunqaNSnCuRfWerXiAtL2oVEN1bOusA1/JK YRe4Hlom6xvX
lu1HOORFY1/CxsF82VnnhxfUMRzOUEIrZd971CxDVW4Tra2pQPZ0qT1zAV4k edVyxEXls2EK
9m00sVf9D1BLAwQUAAAACABrR5M2JwCQEKEcAABvAgEANgAAAGdlbi9VTUxf U3RhbmRhcmRf
UHJvZmlsZS5NYWdpY0RyYXdfUHJvZmlsZS5wcm9maWxlLnhtaeRdWY8bR5J+ H2D+Q6EN7MNg
3J33oZVnoLE0thbySLBkYxeLRaGarO4mhpdZpFrtX78RWbzqSBaLzCLZ1otb 7q6siIyIL448
ol7+/ctoGH1OZ9lgMv7uil6Tqygd9yb9wfj+u6tfPv3zW3P197/9+U8vF6Ph iw+zyd1gmEZf
RoMX6yHsml7Bb4bj7AX8/rurh/l8+uLmJus9pKPkejK6v57M7m+yadq7+e+f 3t5sP55tHn98
fLx+5O5RRgiFR999dG/4djDO5sm4l65Gpb3JLC2MS3vDwTRL3eB0dIcvYDdv 8LHVGGB+J2O/
/PQOGXOsZYMX+SPvJr1k7qa4z8jIwxCQZvAEuSb47JWT3aD/3VV8mxLCCY0p 0ZxbwSXlnMZC
SGlIzK6icTKCaf6U3A96r2fJY7QU/lU0SufJaNJPhz+nd+kMlAWPxTlvMfAW A9UYeYuBXsxi
oBAPRtPJbH4Feoyil8jBmy/zdIz6i1L8Vz+d7StR9w54S/pqPJ7MnYAyN6n5 0xQYcdp58Wbz
x60Z35l7/e9Uvn7TX9hf3/Uek98e/+eHV1dRNlnMen6VliS4ZABY6E3GwPu8 hvyHpPfv5D7d
W9rx6lUVsa+lPs5++fntmselLWQ35Qdv8lm+L8/yhuArPszSu8GXmtevJ4WS /X6YZNngbgAI
q07tzXgxKsv026pM82ngyJ8Ay/guHJjOcp1skQtlEBv2DzOMYUVkbQ0jmq3w kME7bYx6Xaud
UiUYV0xarWIqNAe1c3V1U5TETUEUxb+l7wZzkN/Qo5PlX8uzqjH3XDX/kYym /1mmfxiNhY/G
X66iz8lwAf+iYSh5De1//29NihVIvbzZNuf9zdz9sUR+VGMiSztP7n+YTRbT SzTs0dEer2jY
G0+mrOFSS6GEiZW1Voq4ouedFv1xPlv05gtQ9D/TBH6mNfNaB5nytLxWd5tk aQyObZrO5k9X
0WQGMk9h2B1YG7xlOHlMZ/+YLMb9slkGtRWvqb4eJPezZPR2fDeBVOfjAtj8 BG/LlgMnVXVd
oFGNO/CWG19JDBECPKSiMqaSCKNjEtywXs3ns8HtYl42rLHXZX4/S50s+gkO 2t+ujubIa+qv
FvOHyayJl4rO0d6q5F8n8wT/chU9gG72NKhvbm7ewNwgW68oqGbOIYXiBVie cPQ6VZXPK028
IcJ5pSX223AU0inV+JYld2/HnwfZ4HYIkwe+JvimS3Q7kxokBHY7mlEmZAy5 mjQmFvR0EW3i
tWhnO2+G6QhKhHPZztRr2Z/ev34fv38cp7PnG8+mgZOkOsMikCvxmBGo/2zM mCkZ1hHM70BF
fzEdoi9Ms7Kool0FrM9Gp0FstMJJaDNYvvNAef62I7mBSUEJPQZxFhXuAXBZ xY6tHR4k//tK
L2X7uNmeUGCv5Iuzv3ljBuK+qunFdLrWNLnM1COkW/zNm5stsvR7wMSvg/Tx +frF32rwfoxf
NLe3hOkUl8EEMUJYajWDKAuMsw6KR59Rz7zBbEtrb1+39GPBrfstuNJ2pr2v YHz+feZF+yXk
rzMv2LJ0DonrJSJoFhZB/Qn8BPhIyCqsJdIqEVvJpTnl2kvmhc+900OujbvJ LNngb3+LOZq7
3Tb8frpahW7BU0grzrxW/CMMnQ0H438/82w6C2vzddm0VJBF21gbYYWqmP7h rM935H6Bc+n5
bjv9Y+TS8x21yR82l/Zq3Fs9PayQ/xNurDZl1Yd4S18qtPD68jVPn8CCXvXm g89VN951BnRQ
fr+vSHxqWniBWVSTRyZBteONFQXtNBnMRaopZExdeJHVT6fDyRN60uddiX0O vONSqsQUM1ba
WFktIJW0rKLLY32iz8I/e8FW1NzXWI193r3HeeZq7LMXcxBzMzftyUWWZI9h oVQoyYw2WotY
acIp72DX0mcqjxde9Dx6TbmfZoP78TLvea7e+TFwxVPyzlpZbmjMqSVWwi9F cLvyuecv3vRw
S29fo2/+ctErZV+8cMOhqyN5zxdvXwLjLT+tZ2lCGAIMPLlQmhmplQRfLqwx FV9+OPNPp1tj
ePoa1hievsY1Bp/DftrrMG5LjQf312cvGH/fFdcuOHf9PfBBha1z6RqyCyah DOSxYYaxU+4o
/L670jl7+vq7F1V4fN6tLFygsZCwhQ5ESYiGjBFG+hgjLVdcCYGnWiA/1UbF lJdPtXRnMmR3
aFtfwTiPwRCvQd9f7FYlCZtUFbcqmSFGx+BerDRx+OUln5XQi96qpBdetVOv FQ9G0zx3dPw9
8+qdhjX8ytqq4prZmHEBYIjt6Yp35jX+GvV9jUU8u+ginnnR10PXOp0vkuHz 3tRg3QJPGg7Z
bWyUJIbEJnxu4gMe9wKvqLmvEXP8ojHHvZibziZgZNnzBhzvFnCaQKBjsRTG KlynDr//4UOc
8CJuS29fI9zERcNNeOG2PIibZ5YXiCQRFkkjvJHfnyWPuLujjKKCUcYUlNuS QgijMjiSfAYj
d19h8xxQOo25SK8xf3z9+uPiNnvK5uno+bpnuWMl+wCjqjk4qTAZsiZWilhG YkV5cMPyuWjp
XUPLVpr7Oc1nmzUZWNd++qD16WMFpLzIWwsI4kc6S3rOrv7QMvJ5JxV81e9o jnYvXX8/GU0n
4z022brymcoLu2Qxn/yQjnGNKe3/C371fB2nDrzSTQl4zs1SN9MMMlsuuOYx k1YaecK9Eb3b
5FFx/T03cruyMe1fJ4SC98fJsH+ZK946bBIHlhLLN68+3KbzZCvuSircVTeu LARcw+0prcfs
Tue2uzKdyXiM174fksy11XG+6QLNxwRO19B8tu3GUK4VkULSWBPwPgZ+6NNZ zu673od02NmX
JV+GZP27OWs7eY5ZkQdOlZMlNSdK6vT/cvI4TvuQeWBM2Job9lBc/nZLsFtH AIwRkhMrqIgt
NixjMRX0Kkpymusw811TP7uVlF/eTvpPf6v0EIxwWskAsAYYyMGbOehB0d+P BuNoM2KACe84
GUajtPeQjAfZKAN2+gCzURrdrQwIDbIfgSMovu/65Y1jIJfTtlDyX03zbPGt 605YktOH7b9t
SWuvRodR/hMMAU0yAzrp/jLLx6b9JQclvpb1d8EqdzaGRJdz/WU0/GZ9gu3l TWHiBVmsVFyi
WggTa1ns1+Ou5vhRTS/A3GaXfd/81KuN4eqYEBS9pY4tsEOwh5RdcZG3vYvS zRv3nsdNl5wK
yDSx25UiK07/coFcKmkN48AlXXGJjfcOZ3NtiSuz28cWq801KySp0oRRLa2K OVdUGcjl9Yrl
Prh2fNv6hGUDvU0oWBFMU1zxFlIoTYEmSEQbwamKFV8RGU62gkAAAtxIrgRM Y0XgbjhJ5iEp
GGEgx4jVGrD9yeJ2mIYkYanmlIMVrauDcdApMGEVJEkbDH2eDPohCVCYgWHx xp3cTibDNNlq
aNoq9K5PyAhCrSSSMhpbaZlQ2IC3GnV3MbSdTbigt2QtQvpbcdA9UI2FPiwG EZuwgA8wLbFe
z3rAKHmwYoqRlEhpibIW3Iow1MR0C+hBzZdrSTUI26y1/xSagCYSF2VXBCDl mR3jKtdp4Zbs
cGmjWqMyTgzVmiqr4QluDNiWEdjseXSL8bp5JJQm7v8sgZEq2oOOFFwwCApG FpMAoOabB/xp
76kUGVqJdJ0dxuuTm5HrfTcYDuZPuF04+OyaBubU9zvzGCX397P0fhkCe7jk lw3cUbLHMSSB
r7Js0husAmSzYLYVkBw+doN3dxv4V+yPWxLsMvzjsvI9ngpvI1qrIIcFQqa2 y+9LV3aFpqmV
lKjOTRW89GVgGCeECRMManFuODwFqXwLmDCs4nFPDyyHC9oAE0dHQv4CPp4L 0gVMSgxVYVLc
WdsNlT12m8JBpaKEFlApj+0MKk68QkAZokG8/CRQcTSVYhTgCR72vFChFmdu lQAzwKaH+0PF
jZSGUY5nJ0lTRMGnrRacCKBju4BKiaEqVApXWXchpfF6ZziUVOTfAiXlsZ2h xBGihHKmQbLs
JChxNKGyJRwKB05PgpLylpLUAhfZLKT+gsW6Co66ARyeJAaSp9hGu96K9Rwx sTkCCg3kqwio
2VLchYN9ttlaQ6FRyFUENA051vA9cgR3BXYIvwxp8B5aQlt3kIicxND9sQly ZuCFGSFjzlpl
TpDXgvflnIKn5I2ZE9IxVkiM790kTkV+qlj4tNUXuV3aVNMruDUK9tdAi4BQ HnssLnYL1xBI
fCEA8ROlTUhTKAKpKtA8c9rEMOZKDoUr5HBStsEJjhRcWosjdRNO8GlLgI6A p1UnQCkyVAVK
4YsYLZFS/kpEQJyUNdAGJ6Wx3eEECUE5rCQSsqfBiUsHJYjcAE3TPU7qdsWh oMpPmCtIGTXW
lQWA+IdgJUYIDJHRrsegVKVMwmPiUEjsw0IVC4UjD7tzp70OC7TDw36STg4Y dBQC/BSslMxw
oKCDmb6fmGSECAvEVPc2v7NyMRKEagUHh8qAmf1jgxspcKOfwkjTVFLj01Aa UQo/qD4UCI0k
NgxV8bBs7LwLCTtbIrez/0ZWt6XeIh6Uxx6FhmZCRGAPMigDgoGikSaFuVGg SW332PAfspMG
SirI+KnhWlfq6cZx0lKriCurG59VAqRMD6+uGwmsmKliYutMZWOE8NAon0Zs B5NG3jcKqMaK
PUceBZFGMlAYag7VcLjKu5GkoBCb2YkKcBmbXkIYLqDgISMjOUQtPMDhlhtR 4aWY4RtgtHH1
ULTrIa2sIWbrCFNLLDSTv7htiWYBV8JD45CjTL7+/VqSmFlIYFgsg5m6hxSH ClJzyVQsTmHi
OwISVXhxzhL4QQlrkx9RrWIpCZ6poEQ05UdIRygo8DDV5Ydb/94MVWFQuCa5 CwbNFwzbQqCF
AtqkSqWxR4KiQbScScuRkAqIjgaaGqYmDSasZ4YJ7kmCGRgLAlCtYKKgIjCE QkYLIxthgnSU
5ArmrLpBSZGfmoyprltNiw26SgeXgFgpa6ENVkpju8OKEzCU80DmREhBikoK jFxUnRkpUAPj
F46FhDDNaZtTUW4k08biWhltOhXlnuaQSymk08mpqBJDVajcty24S429wiGj IvUWyCiP7QwZ
jDMTGwl+wWLtchJsuMlpohXEbU7PfBSKWq5jq6zWkGny8jps40iMiQY9q2yK Ivg0NZirgBvu
AholfqrQWH/lfWfoWL+3/vvo4fBRkXwLfJTHdoaPXG1MKQp0wi3SNpJU3Fi8 VcPPvVYr0TmC
6lH5suaEx+6RXGmO9yakbYIHPm0ps2Br8O9O8FFkqIqPQoekFtlVtWtQQJCU 5d8GJKWx3YFE
4sFdqVGwKtySVOPcOEQtwdylo7OChOFiDGcAWQ25Sav8ihK82yMkZP5MN+ZX SEeAg1cMnu4m
vyoyVAVJ3ZfWWy5f1XyjPBxgKrpoAZjy2M4A46RMlaUKCZ0o63I0tcJdDn3u pEtDXivAd2J1
ZNsAxo1klBtIcqhtAkxOh3LBwC/bTgBTYqgm63rablvfhJTGjziEQ0pFCS2Q Uh7bGVKolpAX
GKjT8MbGaZDiJqc5l3gPxZ4ZKkxpB1smZcxNdeNj10g84AdKwmP0hjfFFqSj uLKSwtNHbIXs
zVAVKuW2sC1ysEqr1HA4qWigBU7KYzvDiZMtgxSUELxrexKcOJpYpzBIxcyZ N02Ywg0xrgma
b5s6hWmIixIyEYqSa6pTlmQUh5wafH4nMCkyVAuT9Sc+9l7nKn/YLSQ+ipJv BY/C0O7QgSK1
mhoGIrWnqVAcTWEMHsPj9swVCp5KiKVkuH/DaJso4kZqMEZLMM1pSrjwaS4g eII3op1EkRJD
dbeYil9MbRFFKl8RDYeSigZawKQ8tjOcUNzIh8krvIRGTxNF3OQghrgARs8d RagALhSV2sas
1f3x5UhI1zmMbCpM3NMWrA6yLdbN/fESQ1Wc/Aivd19gfv94yB2P8hfsw0Gl ooQWUCmP7Qwq
AA+84YFHhIHQaQoTNzljGBYm7Ox3yBmuJzAhDIuZbXUTilGDDYMEtowgjTeh HB1LKSabpJur
UEWGvKdUWscTYaF+ZHhAmGAvspAYKUu/DUZKY7vDiJMrBdfOQK4nugWFNJnC PStOznwJilqJ
XUIEfouO8XZ3x/EctLRWgXcRzXfHkQ7T7qA77+jueIGh2rvj+9QkmzfXf7Av HEIqwm+BkPLY
zhCSE6KSWRQrOwlCHE0hteYM748Hhcj2psCam43K63eUc1Na704XrHfPTlQV GkpJIcHJaStl
fTOqJrY28ne9pz49DLIoW08vyh4mi2E/uk2jZDodDtJ+NJ9EMIfIfa91gFYW PT4Meg+5SjP4
fdabDW7hX67Xp5t1Fk3uosn8IZ2VhmbXf/7TL9gT8m7i/rQcBAgotpcc4VGw KM3nBPxN097g
Dr+/i+/4a/QJ0JT2f80ZmCe3hY6Sa42X+mi53607mJYkv+mauq+xFY49rBpP FRuw1vqLVnD1
nQZwqirZTt7CN29AOU3mD6MEe1BiD8x3b//x86uf3775iP93PQJaTr7XMOyb NbcluKwFtfo1
3m4okXw7Sgr9/nZOhmDbAAvTgPrWrtAZDoz73EHNlbR9rXU1uXvXG2E4+N3p pUTvh8Ifd9O0
xhLQllCWE/BG2GZz+e7652u2DFfGvt+kbg41762AxTm80xjFbCy51paiZ8mF 9f0szUXimrbV
WvROq/wwG4wA+Z9dO98m6/yv5HNSGJBdDwe3s2T25Ey10DcufMwiQoMioGKX rpXcCSKWo0hB
oVLFsu4Qjg+LR+jard1rQvF4nKZcqU2kerWYP/jSnPZKbtUDt9KduRvlQmUP ZYs6zf07RxKC
L4Nf1l4B70C7rn+xkBybpDAmJdtoN9+r7X09aIZww7CBE3HdWU+icCBpoCI2 Iq49LhRK4bsL
xVLniO3UZP1VsWMzE38jhXCZyYrZJukdnZggTgWxmkD4O6oD8r6JSU3Qz5VU dwipGyMpnbja
NpLl3AIYiffYUTgjWTHbuZFIPAIJ2R3eLa40bO/ESKq9hnIlfdr0L+ogfRUE II3H5CDJFEyG
Tl+rszo0gS1cnMNmvVDuKgUQBmZQldviagp1bUryCl1sEkyxT7fQeLJZ1xXl jcyueYmWdfnH
XIxQ3356H71+Hw0H2dxVze6W1PLF1/s0kG4RyjvO2X4ZD5Fo2v9X4r64sT/4 wMaEkoTbWIsu
IzgS0ri3HWve6FNaGmyDsyw2RuvGIXvbhD1Hh4yTUMZyEWsW3CE3bXjk6tne PwntizEvMXhN
nOAHE1yL5aOcccOMDnXDlQNruZUxYvJrZxVB4cd+z1p4DArf+m10Wm1diEC7 BKsEnYlTFZro
taDc43gK6Gx1R2k/s5u6w7vFF86Dna7u4Hh4UiuDx0ZDe7Dd3Zdy3SybOB1o DlsUKKFMCg1e
Cv5LTbwuKPJbqzc5IZe+JJtPiLX2AgcqtBySOgA9JLXY31VpbI1yGtC7goTn aw51d79PAvpy
K7Jt0L+HNy3D3LGw9/fpCmclG3abJHg08FF1CgADFZCRoYG/15mmXE2lk1Kh MxiYHzboww+J
aAKphjBHJTB7zOvgJGbdmxmqXwJFPlecEUjHCVNq0+XoYSWvHZ0qujDNAxzY waUW+hPIXtyH
VGSX/gsJaUm5lPgBoibMBVAosKOMMFtZ6Vqfn9Iv81c9TBcPUOo5Kum2wobA H2OXTAZaPVV8
YtLVLrjhUrns3YV+AbCaG1y2qsfrwQo+HWpby5hjDsBdz7TTNBnOSWLnK7Ck So/hLtRK8dqT
4NgLqxa3Byj0HIg92CG7dQ78+AJ2Ju5Usxh6KX7zVFdudRyt2N1VXenUeDeL X94T1N1BvrMM
EoMnFYASit+2DJ1BNt4eyfVTupASOn3URAnIB2NQHZ7JoBorqyPyx6ZZHZw8 ll+MH2PFW3QS
T9JYXi+uP/wyGN4MtRJSjlicpjVZTlITg4vc8nwVcfGmWCfLYP6LU+F82emW wfAkK2RuCr+5
HdqX7b4rmutm+95pJzZRvlzb0SqJ99ZpOKM45SKJBjQLQ8CHGhvaLPb40tvK aW8+HddBgFMU
G+FB7YIthrQ9boGkcU6hIpwh3ArIPIy12KybyBpp/eHjG37lAoINCEDWBZsu 4pvCBJ1xJCnO
Ft9K33PsJr55P3AYzpWdLr4pV8DhNyrDp+r79dbJdYRD1x17jndmRbIG2z5R pSBfV+h6YkmO
cmZ7Texgh1b7duAN24VK8Mtsa5W8ILZAPu2YxYbTwLzUYaqTktzfbSkczE9W kuOmjhTcfSAv
/PWWNT3P9cJ1/O00kS1fyOwokfVfUwxnFyfOZJWReEYw+DY/eDK59WVRaiGZ VCLfvrFcG/Bj
fF1w3A2GxbNKYY0DP3MPCBDMbfkVjONDPrEApoFEKAGU4Sfuu3EZK2bDGgbb /gCsklRi9MPd
RexKAml6aMvY3Q18+3jGoeZQOAACMfP/y7uW3LZhIHoVHSBFRfErtJuim657 AUGIncZAEgeW
naC373tUbEu2ZDsSqTTJ2haH5Hw4M+S8UakunNa8iFFtCp/gAQisv4XDqvLC dfnmSfhwQPsI
RFtpCteFQTCJn3AIjR/pROjHjQ8nJVOeCGCdylmdhCM8tOKfb5JR86ir+cZ2 hcOjgqMUBzz1
jFkpBSNHoLJRUcG5pQ0OCI6grzEmrJnUDoK393879uzDJzo0ZFUbZxVEdhrL RpKa6W2Q7KrE
ncSyHbTHiZPn6G0UE86sTZfn0P7BhzQ4/m1so3aMi7rL5TehViPYs5QSYa0T ko/y7bgC/3Or
CmXPtgOnUtf59M7t+gymDCdQRkZMg9pUVwPgoEfU0gmDM4kpO8RAjmLL+iGB 36Mto8qylTr7
g8a2ZR19NmoGPTYad0SwZI5ds7FgzRSoS/OQlux4TaFMGSTMKMIbGClggfew do3d+vCGjLlG
kxpjCj0VtgGjTTZ9Ja7XWxmyw246UQxZf3uZ92jIePkkjcWG6eBl6xf0Lq0Z 1OqG2pKMIUXX
NaXcEdVMOF5BE/r6TNF15/T2rPVl1D8STDS5xkxfAMiqXRH2+naeVPPV0wIm JimTur9xApPz
tJjx52WyWFf8fFV9w5/LdbKorvxXs8XNDbYOa3wu/3pgtE1FvDM/oh/mCnOf Jc+3S9BdLx+/
3M2fQPuFHRgH9Hbzqr+YHu7soKVuU/FOFEO8Su16G8yGU7t6qtGVjkhnvMUQ +2eFwXSu42Tu
aptd86fVjDu8ByFzSRgRmwuKheWjhBEexEULC+JFCC2ME8IqHGVCS9sIiKrt dv2eV8vNCtoe
ypMYc+UbwYWgJiuEgwaSOo0HQYo5wYgLG7Ne8YDROrcqh7FXzmWikSjYMZrL WJXXFPePzOvc
Oj6MtROl8EjSwkM3tujsAxaK26dDUpXB7YGuE6dZtUvSg91IeiJWOhaqSBmn JP3SG8kBu6cL
d12mGesJhJTCwRxiw8A1A2+/cVXoN+0ncYsfXvH2o2904yO5Ik6WYD/Lc/s1 /qT3OU+bycKG
L+Ql6ealsfWUlLSyyBCfcFO33Ck362V9dPsKo/v5yNO+i7RJswyKhBiQPeHM uIucS9Y2+Kzv
Glxbvicp+HYVYt0OHblhW8ZcKtl9BPJUCx5xUSS7NdGTwh1QCkWhjxUAi/QY MtLkDMJk3hBG
atWv5d1s+MuCU0S1w4me0oIoYrG1X6Y9bO5fded8loxkqYWNxM7mdCfkZnOp TkgotlZaFPDn
lfQNzLd7eltWHrq8ZVCGsPKIInEBNB16dpGyYgyAdv/w/lEKeCfeGDk7yI5B xZxi3xsoHZa0
k/s/Owb9B77rxcL7/evL2vkkDf/6B1BLAwQUAAAACABqR5M2xAS6770tAAAF YwEAOQAAAGdl
bi9VTUxfU3RhbmRhcmRfUHJvZmlsZS5VTUxfU3RhbmRhcmRfUHJvZmlsZS5w cm9maWxlLnht
aexdWXPbSJJ+d4T/A0LzshvRluo+HPZMyLbsdrfcdtvu2dl9QUAkZCGa14Ck bO3G/vfNLJAU
UQQIgcbB3h53tCWTSGRWVn6VR13P/vZtPApu43SeTCfPT+gpOQniyWA6TCZf np/89vn1E3Py
t78+fvRsOR49/ZBOr5NRHHwbJ083JOyUnsAno8n8KXz+/ORmsZg9PTubD27i cXQ6HX85naZf
zuazeHD2j3dvz7Yfn98//vXr19Ov3D3KCKHw6OUn94YnyWS+iCaDeE0VD6Zp nKOLB6NkNo8d
cTy+xhewswt8bE0Dwu8V7Ld3lyiYE22ePM0euZwOooVr4kMogxKBgDWDJ8gp wWdPnO6S4fOT
0IYkvIoJ4YSGlBJDJJGGccFDybQgJITPhD4JJtEYmgu0wSfQwzBKh8GqH06C cbyIxtNhPPoY
X8cp9Bs8GWZihiBmCAKEKGYI5CELgVGYjGfTdHECXRoEz1CYi2+LeIJdGcT4 2zBOH6pc9w54
S3w+mUwXTldz177F3QwEcR319OL+y63GX/8++C/yXr66GC7t3y8HX6N/fv3P N+cnwXy6TAfl
vespcyUAiDCYTkD2RQH7D9Hg9+hLXFvx4fqVWz2w7oCN/ifz3z6+3Ui7MpD5 2e6jZ9Di//j8
bqfFZwRf8iGNr5NvhSw2TWyqt1bvOrTPlrX7bCPGm3jyDm01LwnIMgQrTkYF YnxapDAMfZ5m
P99Fs4vJIr3zRXqyK9Lv8d3zk+F0sBxDD67acRuNlvDqb9P05Cyvi7NtZWwr /Cyn8e1v4pej
aD5PrhMYBXfldl96YtICa88MawNir4sa7O7DO5zGtTvcH/HS9dg0h7ZGX5LB MI2+AsiEMooK
RhlXoSKUCRJytdM3ZV2ATQK7WA4WyzQavY4j+BkXtGwzMvoNK7DkrD+uonkc ZpYaTFNQeQw0
19FoDq8YTb/G6YvpcgIf0ZysYEVbNvGdtlJg0pls0MQZdGBylYySxd0xGgz7 7lG92mCYCo0g
TMjQdmYvrAAIW/by29w5mX7shZXa8iCFhvpj/3HYSYGNN20nMLDA/9KakOnO DIWXDvTOUF7E
N9FtMr1/dR2j+W7ZjtiIeakRQ8g6itGTH6Md82btOE3Gt3fDaI5mbJSxxMIv NlSMGQ6Ba2dW
LPZb8csppBET7JKerEWUWnKmfMhiPy1ncfoZXjRf0chdCztCgxL1Q+xDBkah teUy5P4A8x2C
70HCcDkbJZBOx3NfTcG+5K3MOuV+6zxPF8l1NKg0zh1RmraB1TsPVKjcE3tD oyBnnIA+c73t
6NSudvw+dmLtGTyy79cd4xtIWcK0751Ngr8AyKvu93Pmpjv04K5s1kuURjvC WMpC2Z2fKLC1
Q5DYlptQpW4iKysukiMNj1U3XoApJYwIBevOYEpz2/5DUF1qzCBNcnuUhqI7 KNAIFVKuDQ11
dwOL3l+fOb+aL1IYWJxCerKWUkuOv8WD5SK6Gv2Bw1DTQR0HByCpNDOhaC4M NXsA0XAYaips
9IHO78jDULMndvlTh6G2vKSP1ePL5CqN0qMs0toOnAaAm1tKSMi6K9La/YDc zAX24zBsqcMY
RKOjnP150o0ToIJzxUIuOzOUJ0dcCH1SasQ4lQ9vypYlHKW9NJvmuql6Ft5P 1lOqtNWWCg3W
QqzFyj6D7zqzm7CiLLrp676MJyw17DSORsl/H63phM0mvMWmIyjTwoTglihk M1RzKboznf2J
b++mE52X2vYsnYJS50doNtF5N5GMNlpxHrLO1idE5/tDmb4nYKLzUnOex+lt MjjGYkn0otl4
pniQkZwKYSGaMUQyGGQk6SyuiV7sj2t6t5oXpVa9XBzrkpboRbNRTdmSFsuZ YjqkndVio5cP
iGb6spSXpZZ8ncKPr9P092O0lZfNhjGl6+U010yEorPIN3q5P3zpN7WOXpVa 8mhVhfmjFmKj
Vx1EODD6aMvh3yFvqg4bvdqDhGbrsNGr/bb5/6MOG13sCV7+zHXY6KI86MGu Pc4abHTRgacA
QEtFJbGh6qwIG108INGtgmJbfuJ1+QzvarfAH9dRvO7GUTCrpKQh85Oa7xC8 O0/x+k/hKd78
y1MUw/9N+apR6K1jBPWbDrwEc/UtyUXY2Sr56M3xLgOKfix1EpuV6K6rMtoj NJofO/AEOL3L
BPwJRXflrR8riqJ9hhY/lhdEB2ky+wMHFm87qJoqK7nWLJTSaIFFMCpNYwHG 286WBEVv/wxL
gqK3/1oSVDwI/FReUV0mo+F9/f0IYf5Ts16jCOaGEEM5s6FgyloWMs672/Ib /XTkU2o/lXqQ
aPktGSVHWsj4uVn3UBqiSsbAcnY2RLZmLj9XzKX1GWz8XL5G6G6+iMcFBy0c ibF0MJcGoamh
zOISoc6M5XL/VFqfxwlEl6WGDIPdkc65XnaT94I30hrCze6qo5dHXB3dPZ9m 44Dm83h8NTpK
U3nXcNyyiViI1RIyE46FdMhIiFYQsajust13++OVV/EM1T0Z3PVmL6W2PIzn i3R6lObySwfh
inDhihA01N3FK7/sj1e+6+CJJq3ml/LYZXmVhS9HaTfNRi6r9MjSiDArXXok tCXMGCZxKRCl
3Z32EL0/7tMeovelpo2FgHR6lKHu+25CGMihKXir7tLo90ccwXwoNeTr6WB5 lMX6D82GL2Vm
wjWnRoesswXv0YcjLtZ/2BO5jOIvx3koQPRrs6FLSaQrLaEGI93uhpRf94cu /Ue6v5bacuqK
3UdpLc0GLOVHSBCIXELR3cDyseLMkd6PBog+ltozkh6jsXzsIFgReM4nxw1Y qruFBh+POFr5
VGrIaMBHaSefOohWMHvmnHEIav3lyO3ZyaeKidtGB5WdCcyCicuipj6bZcvs 37pDvLcat8TT
2be/22rdg84DD7KfyeTLL9DoOfCJnz/0qOy1bT3L3hEPV5J48q1q4DfQ/xtb 2XukOlrO6bfx
6C+bTPjZWU4B2WfTr5N4+HE58vm9BE1CnyWTLWXk7E0KpSk0jkJzLOfWhFSs Ox2PiQ5cJ31b
1FeEEwmyZlwqtCPVOFtmulckxkPBIQ4joTAnQZSZRjy8yFYfPaQd97Z2NR3e /fXzTRz8DzTq
f7FRK7UEyTyIZrNREg+DxTSIgnm8CKbXAdjrdJBkpvhDkG06vwPLCBY30eLx o+ltnLpf8fkf
YCACWIzugukkxheOo0lyHc8XwfU0DeJocLN5HXBZn+V/GvwDvk3mjx9FOJIN Rst5chsDroJ/
g5bCY/ef/PuWwKfPzlxj1pjZVvP6w9weeU/372fRP5fxxbcZjAzz3Ng2TibD BA/dlEJbDf8b
LkJGlDQy5L4uQY2eIDmmK0vdmGUOuesu9CTbwHwLt9D55OL8w1W8iLZsj3Fi qNaMSehmY6iy
uBMerwIYX8XpxeRhlJgMKjz9kQYPeNoosHhIISnJWzhwK2sHfFWrKfcCbeam 1q8KXcwU3Cbr
Y69xQ3JyizlakHGujjaC6MuXFPO6BO9zGGA9a57gC6AdYNnn9xb/IGm3FR8d TntvV8vZLE7/
jifUewq9BCnBn72FgegLbg2voVJDiKUGVMo3h99vO6dnzms1zJNLZhQHnveb GFdIAIPID+Fr
JLQDD85NCFZgLZptLXhwsBiDYzsJIR+ugod7Gti45ZDtwCMv0C483NLl2vDY XvTbIDp8vddB
h0fbHjpWGgV8gEY7QgfytASPLwGefaNDEhgVBaU44ipSBx0SRxQhCY5gilWh A/kwCIyMgKdp
K+jIC7SLjk09bx9C7t9bVglrECK+8utAxKNtDyISD+UjRDu1im4ggl0pGdMa 8L+V+fUCESrd
KmQYLjlE07oGRKiUGiwHvDwkWMJWQMTxMZRKhnxMGxDxBNqFyPZRuLX9SO4Q 2eZQsqP/Gijx
aVtDidMspAvEQgIoaScocTwpNxwbt3XQcy8oYYSCMIQrrUMmRQ2UMMJAdUwT R6mqHAny0Uoo
iieGyjZQ4gm0i5LNXuLaEMntwm0OIjvKrwERn7Y1iDi1Qs9xi4xMJxDJulIb SyGHl7pfiEA4
Cy2nhEiJx7PXgIijVNJwAiGIJFWOBJ/G3FJT4GPbgIgn0C5EVrcN1QZI7p6e 5gCyo/oaAPFp
WwQIAe9MNATJoFTWCUBc49CV4IIASfsFCGOQ9ilKFAjDSS0fgpQQnWKtjpNK H4JPG4PDAjzd
jg/JC7QLkM1hNHURsn1AS3MA2VF9DYD4tO0BhGEJT3KKt9WQjjwINg7iOoGm 0rcD0aBhCnko
hZEI7Pbh+KDwVwgGD1YElLrKgSAfC64aGs3AeFvAhydQQYyV3yS3N2V/8Pay 5vCy0xU18OLT
toYXYAGMJK4/Bka2E7xkHculwWoJMT0DRipcjiIs5KQUPerDASM1+kVmlAVK UQUY5KOFBLOD
p3krgMkLtAuYNH8f6CF+ZXOTZoM48XugDk482vZwgrqVFqdIKOZ7XcAEWeKs sbMY2TNMBG58
Yppy+JDXgomjVJxYDpSVMMGnISSyWOHi7cAkL1ARTO7Pvq7rVIpPjW4QLH4/ 1AGLR9seWIQL
Dqi0eBVQR2jBxnGhpMDG9YwWJjF7gBhc4S3VdaIwRykMURKCSVUVhWV8cEID p0xaicI8gXbR
cn/Aam1/kjuatDmM7Gi/BkZ82tYwwiQMEtQSZTEJ7Cbwco1j1GAmz1XPgRdk DTAaCWXhQ6Zq
ZfJIKSQzluBsQhVG8GlwJ8Ratx+zDYzkBSqYdN9sVXuAP9m/yatBmPgdUAcm Hm17MEFG+ENA
fqI6yuddd1qlkWXf+bzgYL1GMHDc9aIuXGXPLJYmKKuOuoCLslRZ5NNS1JUT qAAjq3OvqgGS
D7gKz4JqDiVeB9TASJ6yNYQ4xWrgo+FD1lWwBTwlpCZ4ZQHrO9gS4Em5VhCf iFpuREi8StDg
jBsEjlVuBLkIwQy1uIKkDYh4AhWt3cruyqiNkcJbJprDiNcDNTCSp2wNI06z ylohJTDqyIsg
TwZum2Hj+nYjFtNqQa3CCSpeAyWOEuzFOEpZ5UgcH0kItv2+R5tEiSfQH2Be 0VN9DXj4tK0B
xDGC9ADPLMH1Mx3gI2PJucW4XKh+8cEEMaGkEGaykPN6XoTihJOUFHIqXu1F gI+xzEIsz3lL
XiQnUIEXcRuwDsKH0JAZ47r7BvGxo/oa+PBpW8OHU6qBlB13ePCuHAh16/+N 5cCzbweicZUM
twKLpqbOEnlHaaCjGAQetmqJvHtaEuBDsDrSBkA8gQoAkrs4s36wVXTlZHN4 2emJGnjxaVvD
i2OkCAwcWOTqZtF8xpNBaACNs30vmsd7ysHFEawj2jqZe0YJ7pEKoKzK3N3T nOEYCE+3krl7
AhVUgJPRYe6ECWMpZO5NwmNH8TXg4dO2Bg+muVuZL1yvdZOzu8YpwyhumLE9 5+xU4kJPS7kU
IRV14OEoreGQ0AJlFTzc00YILXFxdyvw8AQqmk50Z34cBJDNaRnNAWRH9TUA 4tO2BpCs37RQ
WC0U3QDE8eQG8iy0lb4BQo0CF604wZXXtXaUOIAbYrGPSOWOEuQjpdXAjbSz oSQvT9Geq+z0
x9oAyZ2b2CBAfNXXAYhH2x5AUKuSEGIMhp3dAMTxpNCJ0Eba82YSalyliQlL IcSmdQBiDA5i
EuJSoORVAEE+CtynEvA0awUheYF2EbK+7bY2QnL3xDaIEF/3dRDi0baHENQq lUIo8KNMdoMQ
5Ck1/C6Bp+gXIZB34iAkcCkDk3VSdkYg6LCWKIazu1Upu+OjtZAGn24lZfcE 2kXI/ZUHh2Bk
c1lAcxDZUX4NiPi0rUHEqZUaqcBbMdVNlu54CqvctiDVd5YuccbNaq5lyHW9 re04wyEVx4sD
dPXWdnfaheHWwtMtbW3PCVQwLRKNRvXRAUkI5E04L8AbnTH0FV8HHh5te/CQ yoTSMGuRkegG
Hs5SYKTDrfS6723tAncPQ5SpKK4brQEPRwljKsH6H6tMQhwfa7nAk/PbyULy AhUUfbduQjkE
JZs7RJoDyY76a4DEp20NJJCdQ8hjwFah73hHiQg2TjBjcdU/7zkRge7HuW6i CXhrXSvMQkpl
BfwXMlMZZuHT2hihIEsw7YRZeYEKwqz1xR4HHI+ydSVGcxDZUX4NiPi0rUGE UW5Cq5gBh8VM
R2EW8jSKcAYqNz2HWZTiAMmEMTy0tdwIEkpDBAPCSi+CDzMYHAhkve04kZw4 u/AYA9X4YA+i
CMAEV503iA9f8zXg4ZG2hg7HhytICLAE2ZEDcR2pOIeBjpLeHQhucBWQggqA aj0HoiFAxY3e
kBZXTq07PpRat2W3nal1T6BdhMTf4sFyEV0dOmEI7gSPmmo0U/fVXwMjPm1r IHGKtQpSdYlr
CjsBieMp4EMO/rH3+XQOmhbcSFxNyWot0EJKZVzwwVnlAi18GgIDF8yzdhZo 5QUqmE93l4/U
xkfu2o4G8eFrvg4+PNr28IGMmDV45BNnHa3PcjypsliHYH2vz5JEh8ZgxYLy WiEWEipFDHQR
5ZUxFj5tKThOiceKtQEPT6CCQtbqEqdDALK5/qg5fPiarwEPj7Q1dDg+gkHk CuGO6CjEct1o
LCISQvKe0aEVTu1rMAasM9WBh3b7z9wkEqmKsNzDknKiIX8mrURYeXkKTmcc zzKV7YVHmoxv
74YRHmEuDHQSsfCLDRWD9NQ2uslwR/N14OHRtocPx4gpIfFAkm6iq6wjwSli 9YH0HV3heWIw
QAi3uakOPhylBAePO9BlFUAyPpYIDvGAbAUgnkAFSTom6JeHHq2FuSqABSPi BlGyo/8aKPFp
W0OJY4TnimncSNYNSla9qd3R9LJnlFA8/5Jy+MFCWqvSS/HcMzz2SLsfVW7E 8cHJCuDTTqXX
E6hoURaA4YAkXeCJH9rQUDfqRXzN18CHT9saPpxODceT52hHVV7HUlicNQSe fcOD4a0fEm9i
orTWkl5IokILA4urT1Uu6UU2wkKOzuHDdpb05gUquGPEXbh1CDjur6pqEB2e 4uuAI0/aHjZQ
o1JJi8tsaEfreZGn4QLPzaC05/W8jBq8eYArXNNja9WvqDWh5dmZyLayfoV8 pDY4sDPbTv0q
L1CB75gOlpUpSGmGbpWUNGTNzhJ6yq+BEJ+2NYg4tXIiIYxjtqMKFrKECAu3 qDPbcwWLSVA0
U8Rd0aFVHYQoLMRJDBUh9KgCCLIx6D0IPK1bAUhOnoJJkMni0NW8BoIrDGca TT58xddBh0fb
HjpQpxbUgDumICbuBB7IUxBjJVbWbb/woJh6wqgrNYEPa1V43eVmeCifgA8r K7yOD7UCw1ja
ToU3L9AuQGbpdBDPD5gC4e6aKsV5yBot8fq6r4EQn7Y1hGThpYAfDA9B6gQh jqfQChcQQyjZ
M0KU1CFuc8Tjb3WdEMtRMiOFhD7SVSFW9rQmChc16VZCLE+gPWVeZ4Or24IP QAtnAv6Eoslo
a6cf6qDFo20PLUrhxlDGnYa7CbcynhL1DzybDbc+gUDxFP99L80DFhpldnW/ bilnyy8PuJI2
Y2ONMNCNhmBLXbCy/07aQuHu+8HdnnoeOBHdlbPZrz9k98qCaAkubr9zN/BG yWQeYIMGCIp4
/pBbYN1n54tFmlwtF35ff0inYHkYrz2wl/PL0FYqdtdC71tdXAckZSuzUGi/ t7KhIbtGeRYt
bsYR3qSMNzpfvn3x8fzj24tP+K/TjQ2cAtlfMkk9A91oaP1xMti5NPct9Gv8 UFURhlPnREk8
mmxdvWrX/HNHmGdd452K3iQEhNacUmcGD0TAtnw7AHAz39FggVcfR5NgejVK sgHbgWISxCvd
JJMgWcyDNB65b+c3yezxo8U0mC5u4nT9VA/I8I7A34bGb3NnN98NjdLz4JvD RiZq+9hQEpwF
0RSV1Qk28gegZZ2zOkytSVAwLqjbHi0fjIqcZDuwWGKHBMN4Fk+G8WRwB7/C W5PVFeTwVxwM
RglK7HxCcp3E6eNHWcvmm1vG5wgifHa+dLecp1tPnz5+9Ck7FAge27x0GM+T LxOUPriGdy1T
4LN6KYBx/d71a+/fhtenf71JBjfu8zUpXq++ALd1Ew9Pg3fRXXAVB5AIjaeL 7MJ1fPbl/TtW
vi5r5eYt3WPaO/BvG9Mv4pvoNplCoPQ6k64BfJceiNccvnfFrsJ6wxrNX83W xihZel1Zc1rs
apSEJij0siQUTQ+Slatksp65X3JzyChZfDOR0coIHuJ5c0RgNGkKg+gqCQsi iNVtSTB4XcPo
4YIHN6DB8ANvh1FrgaOoG3EABvH/NXdtu40jSfZdgP6BT7PdGI2H98vsYoBC N3q392ExmGpg
HwVaom1OU6KXlOzyN/Un9Ft92caJTGYmSclmuZKsBnawXRaZGZnMiIzLiQgn X6969dCgWRTV
3Y3zzxzaxIb+zaKLfujZpM4dlBR6uXjMGyLa+fxbb5zPv2sxSEM85DSG86OS 4csLsgF2y2S7
H97oMfUlrHcV02SP9TS587MfyWHiPjJE/MA2+00oQim+kSxo+R7uu6qjxLCv tggbfoGOoikb
MN6PUEigFjiCVgcl0wTf7Yhz6KYHY9Lf9mDAmnV5lSnBD998PN+yBgF14k/V 6d/xP/zw979P
YZX74giHhexqM9iV/+z9+LpoSjIIF9fdos8NqggmKex7Of6kUm+dGJiyj3/t fVRbvD6swmry
+ofmVN6RjfX1rH69OKk9VlfUzs/pZKqHiRfQraQybmdndaNXuLxrjebjNvk9 iQAX2HJ9qun8
rsl72yahj0aqujYCYHjs+S6Udsp6hUMsDHaHb2VttrBVcd1SmSIBrDLQsA/9 HDrq1bbs9rhn
KR2VLsmIZGeEzKJFWKeHwhPfRgL6rDENCuqn9P0D2YZsGtOYhA14RhvYucPE iqvKdGJJJhJ+
4M6NtV7xPZqTCX1uz/ADbxz6fKzNHgvEEfOmxB87pqHt4KjIjfNhvRLbsjc5 tR1b+pIPD2yV
r1e4rM9s9pN93udE5xf6F52+R7C1OZJ6jVcjnusNq/VnDEzKs3AvrFfE/C2t f0OTkK5MenJx
R7dnCVo3TvFUQFTU5/sHqYlX9b1wh+PN/fm4J3m5vIAYQFh7N+xty17M8mpx 5S8RE1fRnfbE
hEnwIsICCbTJNllEVPSzars4o8rStSYvWJsmEYiE6+nu8B51V5Xqx6a+b/KD 4FfJTc35iFs0
JzmwL27Wq/HTIx1cLJu4j9+TTN44ojLMH0YBT5IwRLWyOApRQ8uLXDSYtKuA 6z2fSQEfpKLP
pIBfzc62KBsWVcDp5qTPvvUXiwfoXBcZKTaTZ2zKhiCLQxeIo+BLZIMib6R/ yy2Q/K3iwj3N
QXqfoDnA7SW8XusVhEdxbulfty8yZCZHa28cDow6Fe8A6yr08l1T/N+ZBsSV y++VR0z5r/OR
7wznuTzRLKwg7CF9IDVaaAB0W9P/FZ8eG9JSij1N/SL9cqQ85KZOQmfiuSiO Qnqx4MqP+y4O
vl4Jel46OjcIEPbHOhh0v0CJkHuCWUtzXDlEp6BwDN3hJwZD0MLpM61XrTpO LRN1yu/vWaHq
/ItYIZyKXahCM9B69WEwKnsSc1Jh6nML/2AuSNC/H522PpAuJYX4AYNW+fH+ zJ9nvfrfh2JM
K43K5BBZ7GZ8zJuTwBHIVUsvJm3F4bFu+AqA/lUV+E/+fCCcP6H0gtLvTXGo n/JK6pVMEntq
eOe67cQnPuC1ko6HOgS0MgRoe1QS8T8Lq0+cuR0Jww0d0UL88dUVkZaIPW5o 69TJV0uhg2As
9GQQh3Nb0tmTKvR4mlswUMH8YfwqHyVj9L4Yrt7cJLETg13Dm1d2ztnXhfBC 53d3xe4kaS3a
wgij9QikZX+rYPYwldG8wv4hPoGFG+xqbp+9G6wjdv4LjDTbOPCiGCbjUheY UbxSBrRRBtPq
zYWGEShtPt0K7tE1urpGrqPnh7otOs+xiLUoVxFE7nolnjjlzX1xGj4huLBn RkNFzqu2ZmMW
vWnPBx1jFgLXCC+bg22UNFyvDkV+NIPsDTTosj0NCCyPxrBdyAcSp+8eY8nY 8pWAT/SGQS43
Q8/CiBjDhdZNKx8Us5fHp/pXYY13m2WOsF5dIlw+yCPcOGPqaDNh2h+PkFj5 mDJ257+M55NR
N/p4tKO413b0G026q864KrUToyoPpcAAbPTrrRKeRERVt2XPucgXcf9Zcamw QKrgi9COyOVF
56Aa7gzew+s1Yu0JzqW8h+hZmSQZWc7WpeYX9K+SobZea6z3iNFX491ZEmbI s0q87KI0nU7v
SKqa8BtwXmu6G+sDyTrmktt/ERu3LOXq8wn+wTsNsnl8eGnhWxuGupkVIYHl 6zfOT5Amxacc
z21oBhWSdbS6zJrZOCr+XFak0ddHUhc5AE/K0VMJ2wQ8LTU2DhMWDRmeRbvh H0T4Hrr8MH5P
sqcp4FygVWj8UAu9sdODS3hRtcIuTZN9SVoYPchOzs+/gWQi77bY5WTk0JrU n3aQvDyZRCG1
ylWZd+wgbANioId63xleNAeNdHeuGJwIvf+l7bRidp+y4wVCF3dVWxR/oznF WuRmLS25ht3p
eiABtbdfL76u92mzJ74MeueXYRDDQeymRlB3ZiEWen4SImXM9VL6YxJECpxm HCH7Iizw0hD5
qwmfj6ki7BK1XynC2BbnyAhxj2RvqfvMIsd6jDmSYkoEOaYMEjpQRwTJFoG8 U5Cjznp9BUSk
KLpxPhak2IyeuCzNBivnrf38O5w/Urwdrz7klDmRZCxXuBJ4XVDFIdrgUf4S idi9p0Qi5LeQ
fzIO9C0UNbpWk21IehrCvEEwn7gLOVqUeChDEMyD2l5a3MVZmHLtZdvi7ppF aSQ+is/UZVG+
R8RdM3ZDElXImPK/yE2rSRvJtFOTH1sRW3NwrvYaorj8cR+kvs4FAbyaEWrx tC8IAaTDnrlZ
SvaJbz1kefm2jAIvRMpQlLoRwr6Rq9w7bdE8le8EA756ryd+EAYJ3+ve9Hv9 EqUjHmgxUkWs
unHuZMyA7mbFB853MhSJe57TFL9fnDX8EMwf+ik7IqO5WIOnCZLYo0nmAcwt zBhJGNOuIUJl
mTEuitp+uzfxibrece9hiKuB/CzyAGZyL2q4b5N2WbMV2iCA4MdaY92EH6xh sLlI7GE+wOL2
8LtVVbHrlLBjffyLSPoeqlnaF0ZabIXIQ6dxIY7F0/+FHXD7xVlr2GBwpGR9 PVtd77lnkbH4
tfmZKqa7mf4WRlvfuiV5TX+Jk4BE0zZUBv9dQ//vuW5+tcpWiZsC0OFP56oe bSOu+oIYuLCZ
XpCwgdg3w87zZvdQnoi7kJ3G2RxgnEZHT8lME9AY56duP1ojG1u4slUQeUMv nhCjbNnVTu89
VrRCMjI5ZnunhwBLMkGwsCQYDi4mM5Io7F0OZ4pYNMLCp/JQIO2VDL1GuMDy tv+anmVxPvcj
dGShyxOFSeO4x+f2AoY8SZKhdWAQR7Nw+qIBwwDONvrjMpBz9ILMgL7bKmO3 mgHskmYZ3Dyo
nTaR0U3CBnxu5JbAT7Fj6MILEU//qaEFE54SeSbOHwXnlvlR6sWkNsRxDDco KVKxVZybuacz
wdx8cGOaEEWo7DYXzA2zxJ6LWqC0nFl4flmYW+b73EEmXoTpQ1Sm9CI328Y6 27YGcNom20co
y5j4LvrZT3ee9GgbXfAdlRzyN5VohNK7HBI6seUjKc8vwk0prmyhVcvIc3m6 cX4WqZ+AObcS
sLY71Q2Ncj615b4QwXThkCQN/bkgXSCXTxZcz27jyMYMIiAl4s2KQqkEdFPq 0aYIFbtM6XrJ
NolDNCbwo2gOfZunIC0V2HQ/mocj7enbPgnfdBcT593REmhjghQIY18Y/KFw yS7BiP3qnzJt
paslao0RQyTlJbTGbTpd0e6RNuJDvpToItWIcplNjSCpAIR8/l38Stfu5980 vv7z73Q3mzfu
59/wGP15AlvYu2uJHRLaG9qRMKA1evQvz/Zdq/dvpst2UPl2psv2ajlYe6y9 4GULDTuO0yjY
qm71s/M4faIoCLeqxExbHPdW2dv3gSPZ4gxMZ29F1Yi7beDxHK4UQ1ejNLR7 xWnkSNgHmSkm
3xQvTREFdjkpgI2CfswoENhHOdjCZwUBgK00RwwA5SxstBQ+C7BWjwyJrbdY rM8o2yi+zaV6
kDZZKozpi6Fa68XYx9tkDpgKiNQx9qBTYSXIv0vUAsZ/vepA/s53xc39zcb5 4c9/3jgfD3lV
nfLq143z3/lT/j1elW5dXYBpvQLeFdcxR+QPdcOXNNLDig7W2eViiMyNU5O3 J84F4Z3csAdq
NC7DaMWQ5+pU0mqUlkuMTYMTH5cHkamBR+8ZoNE4FWRD92T9BDQHPSa0Zq7q BuyF812+Xu0e
ymrPAC055fc8kLTbRY7nRQJIqfhwdH6+AF/AItu8ZOeYgDAUHXZBIEtKwMEY kg/UWSu95Syn
DEBpl3xwJxH9xgDQ8AW8lzNtO0wHrAWN6hi/92+tMf5F+vlZ3gBN+PHM3n4i UOA76OH16hc6
3/RN/6c+FVrIKszLIDJgCK2WwwJ4+OLO7Wt9iE7ATjtqkXkrgDPrFRfie+lt 6Kmj18DkjCeR
Z43XJzdfweWwW8gXMT4AbKiiObQKvjdlfTeAyDAe6G8Kvbf47TIsnzuD/XW9 iqy928We/fXm
7ZJ6QewBkmD7erloC8RZFNAFvY2iNOESDF6koBDtrikf32eLXZwLJSRSbqbt hR4qNqKn5NTg
+kVCR9qbIHmc7MvejsemUBlSu0G+7x/CLnND7BL8FBGHTiP33T7Q6Xs4j33m AT4RZ16c+QI/
NIt9xrOQyoI55gGSLWudwQODJuXWXaGXwS40ceBnNGuc0WcinU8Xib49kzKi 4RO2ZIDG/vsR
lEUAbC76R6cTPJIBfZSACn0OlZjHc/PI6Ne7ztNZFU8Fkn12RVU/8goBVXsq T2Vh1OPYce0u
Zf45pNKhSDuprVOkhV0mIzN2myUxJ9a7/SDjD/ZwOjyN56UkLmiaecKMPyyL 1Ak83/VRqMs2
o111OEQ+yjio9Kf8/Im+iNWYA8BUkcsVqMPJdptJ2piTdIwBJW/qhoHmwtfP htWugPXEOIE7
uP5Zv61kvtnGQAfQnassQE72KOgrcqiAC9hgABlPWK/uqvrZSEjXKrTaM02N LP8heRvgdZV9
fW5FLvxP6K8uh4JmrfOzWRHQnh6AIXTa5I3zQU2nDL2mMNbEyf+n+r7AfojE PnOyLlcHLwFE
Ue7OVd6I9wD5hhzS/iFpQ6ltuQX5RduO9sfB9kBo7TqOQTbPucFiBXa8r/dz e/lpmoxV2eS7
AbcujlKE9i4kz3y9XOIp6CwD/uBH87iVllL8uaWjixKFy0Rf0FPA8zPk0Sl1 n29BLnlhVSiR
8ZcEJF/86QAIk7qxjq/plN5WIzlF4J36GKh8iBzkh3RdPdj0yqDuQE4fOryT mIgTqPWIVdXL
sW6FI5h+R+2oEurGrazhMQBgqUIcZJIQ33ZuDEnS4lzqhWQ7w/dLupjnz9O/ gqeIXDf2kPUx
C5cKUufnUqAVPEA3g8XiJ0YPOPFtCtFPziaHplHgByG6i0xl0B5hIw59hEpM vHMEzIDuuYN0
rCmMe1OIQh8ncUV3lx1z0K54XD4ZZNgncI7b6mrzPHt8YO+2ugQToLNCFkDo emHicYaYZRbQ
e+ZmSRQncQBMDCCySUzWXqy8h9CuDrfVgAmsnQU6BtskTWnNW39QzVCXLLdw IDCPH7oJilrN
VMzQoNfGqXjbgRGFGVn31v0X1+BSZLvA+NVlJUgFJi3ZonhEpws3y1JflL6d KB97pA3k47Te
InIhbS8GVdtrLmKMYVR/MUZZXAZ7XhpvoyhL4i0XjTTYbo7eIpiN/hdwc5p5 1JIv7y1ihQlJ
cQ6ibGs9Pi19cpmXu34WsU8uTDLXT1M/Qr4PGS/amDjfCvX5XZz4epsMJM+n 3CbjtfDB62SO
dJbzseQ8hwfiCM6FgDGwL3ayNSL0F1jsFbAaRq0KUVFJ+A9Ldg4eOA3eKF2+ 59rfDZkf1cuN
86OulMfxQ/V66zzB8H8u6fR0BcRF3kMvd3yDukV7Wf23+ESyhJkakkRWBdAP q/KDMkFfp1nQ
C0wt7JXz7oRKR3odfacKR8Y5DNrvDCIKlOjAR2fiGO6HC/n5/NqgfMDiksYn i3RLTEJy3VQr
bPtNeRovjDMXLpCZApML+k3DaBtHpLTQH22LlqswwiDwiAjl2pZOsHcJlatO U7JMSb9MpjcD
MAkbCZLOT2egtJ/NMhvEXkcgWzoANgf4O2+B9lO0RnWPG66TJscVQ8ri55xA qUAXHRi14zmW
WMC9oMaFqDApCol2Y0n0STeYqshYn09V+SQgD927JrO3GnpDgkh4N8tHzu9a mpe9iC7wjKwR
Op0cT7ZvufEUaRqhinEwj6Ywq+EWxHHsBtz1IglRPn0p7g2SwEsTgE27TEo4 o60yr5/6SRps
0+nlGHt0jblXhxzMGjo7RDsuu+I7HkOaIwdF8lHcwIygcP7FR/nf3QNdq4Hu yh2FMcaxiGEo
Ay8rzGrPN3nTj0pciGKgIpcIY4gUD7EcEeIZzayiGuvV22ENvXmjgAY7e65E NJxrAQ1oFGp/
v4XmEEAI0KGDb9qP5pA2PEUYpJHvAVL5Bxc3bxojZImQCrS1XhLhirMoImUr hbMo1h6BCo3O
B0VCrB2IyIUQCpMUeb796pZWnUWYJw7RVIHmmafE5dLOoiiKEYRfrLy9H8N1 udV9SxsWt++6
j14FuPmkjmQpA9ymu9R7BA7uJbNbjiCaaeyV+b0ccCJr8aTRsk5bHGCV7gTW xUC1iHqMpTA1
O7H7Cxf+vdTe5vLU+OH0XBuT4zIoTq0JxOk3zcHNh6tGYrZ1vx3kS8lil6rL B9nowpAuuWYO
vXdr/oHU5H/qzZHIPxml7wKDKEClIhKiPhwMarl4ek6s3dFJjbxDu4f8eP9N tFufVM8wTKJA
ZJKaMDqrnXUwUUJ6dEQaYjgTlm7pzjqZBxak9SwiYeiWIzUbhR1jFUDi194j X675otM4BugB
uSAT5UqPrNf03dcLTPY1RM5bMgDqsuoGColI/7J8b9MV19XtKfjd6UUp/6t+ JlklWs9y9W1R
6PY13Lv2u/Z9ViSQGP2HE20QL6WL6swhdG6RB9JVwyQhIbCAZCWXORJV4P1T +RsqOQQtiepW
JoRcqii5cR7Egjq5RgcdAolllEzsMIEBIHYA5b+Q/vMtVGGfj6Obukjqmgfg gynQHDvOUBpk
FqG0oCqMUtWAKi1T3aSPDJf2d2m7yZfv+iJ+MlUc9cgaiSMlFkQ7FdlMgOzE 4tNJ4XW6QqlP
wOl+gxpePrplkfVHi98G2VzYdp4F3SZQ3Ceb6UZeFN2eua6X0Jqs1428GoIN Aj/wtrH6RFA/
LDIAx4ZdF+jocDoH9Ah7RdFnYqfo+I7UsjmeNPiJb3YFt9F4Nwm0uYxCc37B 1MJTBD2gA7vy
5Uk//cqAVVmdXsyDS1gqyU6+a+q2VYN9LDl9Ev9CkqN4Btp5vdudGzD5LWna jlLkW9G2yFDs
cevWsgGG4eXiMe5OhcjwuT/WDeLdpnUxaMn5mtEiaqSIsFpDC69eHG2ICHhf qd3uEta0fLY2
yZx4G2ZAKm25fdpsBgEmCiIcU8+bSfosbQ9EZA0w3vEVAfQff5WfhatgrVf/ D1BLAwQUAAAA
CABuR5M2wXs5XVQiAAAmZgEANwAAAGdlbi9VTUxfU3RhbmRhcmRfUHJvZmls ZS5WYWxpZGF0
aW9uX1Byb2ZpbGUucHJvZmlsZS54bWnsXVuT20Z2fk9V/gNrNpU3D/t+0Ure kmVtoopsaS3Z
lfULCkNixkh4M0DOjPzrcw4AAiBIkCDZAAk5tbXWDAdgn6/P1+fSfbr75d+e p5PBYxDF4Xz2
6obekptBMBvNx+Hs4dXNz5///o25+du3//ovL1fTyYuP0fw+nASD52n4In+F 3dIb+GQyi1/A
569uflsuFy+Gw3j0WzD1b+fTh9t59DCMF8Fo+N8/vBuWH4+Lx5+enm6fePIo I4TCo+8/Jd/w
TTiLl/5sFKzfCkbzKNh4LxhNwkUcJC8H03v8AjZ8i4+t3wHh9wr28w/vUbBE tDh8kT7yfj7
|
|
|
Re: Read OMG XMI resources with profile applications but w/o Ecore extensions [message #472670 is a reply to message #472656] |
Thu, 19 April 2007 13:20  |
Eclipse User |
|
|
|
Peter,
There's no way (currently) to raise error messages when for incorrect
pathmaps. Incorrect pathmaps result in broken references, and it's design
intent in EMF-based implementations to ignore errors trying to resolve
proxies... there are ways, however, to detect and correct broken proxies,
but this functionality is something that's typically done by an application.
As for the performance issue you're seeing, I suspect it's do to the fact
that your model references namespace URIs (like
http://schema.omg.org/spec/XMI/2.1 and
http://www.magicdraw.com/schemas/MagicDraw_Profile.xmi) for which the
resource implementation cannot find metadata. Since the protocol of these
URIs is HTTP, attempts are being made to open URL connections against them,
and the associated network traffic introduces a lot of overhead. One way to
reduce the overhead might be to introduce URI mappings for these URIs to
(non-existant) file URIs so as to avoid attempting network I/O.
Kenn
"Peter Ellsiepen" <peter.ellsiepen@vega.de> wrote in message
news:f075je$ai6$1@build.eclipse.org...
> Kenn,
>
> thanks for your hint - again you were pointing into the right direction,
> that is I had an error in the definition of umlResourcesPluginURI and
> umlPluginURI variables (incorrect path to the JAR file). Unfortunately,
> the UML2 package does not raise any error message (or exception) if any
> of the configured pathmaps points to a non-existing location. How can I
> enable error handling for such cases?
>
> Another problem I have now is that the loading of the converted XMI
> model (and referenced profiles) is *very* slow, i.e. it takes ~1 minute
> for a quite small model on my Notebook, although the content seems to be
> correct and the files can be loaded without error message. Is it
> possible that this is related to some read timeout while trying to
> resolve some external XML resource/entity (my computer is behind a
> firewall)? I have the example files attached to this message; the
> behaviour can be reproduced by loading gen/MyModel.xmi into the
> Eclipse/UML2 editor.
>
> Any idea what could be the reason for the large loading time?
>
> Peter
>
> Kenn Hussey wrote:
>> Peter,
>>
>> Did you try debugging the code to ensure that the references to the
>> metamodel are being resolved correctly? What values are being passed for
>> umlResourcesPluginURI and umlPluginURI? Are they correct?
>>
>> Kenn
>>
>> "Peter Ellsiepen" <peter.ellsiepen@vega.de> wrote in message
>> news:evjnqo$7vv$1@build.eclipse.org...
>>> Kenn,
>>>
>>> thanks for your comprehensive answer. After the Easter holidays I took
>>> some time to put your suggestions into source code. I nearly finished
>>> the profile and model conversion procedure now, with the exception of
>>> one quite awkward problem: I can "define" my profiles from within the
>>> UML Editor (i.e. via UI) but the code in my stand-alone application does
>>> not work. In the stand-alone case, the resulting Ecore package
>>> representing the schema of the profile (i.e. the "defined" profile) is
>>> broken: all EAttributes and EClasses are missing the references to their
>>> types (via the eType element).
>>>
>>> I checked my initialization and reader code many times, taking into
>>> account the UML 2.0 Migration Guide
>>> ( http://www.eclipse.org/modeling/mdt/uml2/docs/guides/UML2_2. 0_Migration_Guide/guide.html)
>>> and the article on UML2 Profiles
>>> ( http://www.eclipse.org/modeling/mdt/uml2/docs/articles/Intro duction_to_UML2_Profiles/article.html).
>>> Here is my code (snippets put together to show the main flow):
>>>
>>> Prepare resource set (initialize):
>>>
>>> // get reference to URI map
>>> Map uriMap = URIConverter.URI_MAP;
>>>
>>> // register the necessary pathmaps
>>> uriMap.put(URI.createURI(UMLResource.LIBRARIES_PATHMAP),
>>>
>>> umlResourcesPluginURI.appendSegment("libraries").appendSegment( ""));
>>>
>>> uriMap.put(URI.createURI(UMLResource.METAMODELS_PATHMAP),
>>>
>>> umlResourcesPluginURI.appendSegment("metamodels").appendSegment( ""));
>>>
>>> uriMap.put(URI.createURI(UMLResource.PROFILES_PATHMAP),
>>>
>>> umlResourcesPluginURI.appendSegment("profiles").appendSegment( ""));
>>>
>>> // for a stand alone application, it is necessary to map the
>>> // platform plugin URI scheme to the workspace location
>>>
>>> uriMap.put(URI.createURI("platform:/plugin/org.eclipse.uml2.uml/ "),
>>> umlPluginURI);
>>>
>>> Map packageRegistry = resourceSet.getPackageRegistry();
>>>
>>> // register the Ecore package from org.eclipse.emf
>>> packageRegistry.put(EcorePackage.eNS_URI,
>>> EcorePackage.eINSTANCE);
>>>
>>> // register the UML package from org.eclipse.uml2
>>> packageRegistry.put(UMLPackage.eNS_URI, UMLPackage.eINSTANCE);
>>>
>>> // register known file extensions:
>>> // - *.uml -> native Eclipse/UML2 resource
>>> // - *.xmi -> OMG XMI UML2 resource
>>> Map extensionToFactoryMap =
>>> Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap( );
>>> extensionToFactoryMap.put(UMLResource.FILE_EXTENSION,
>>> UMLResource.Factory.INSTANCE);
>>> extensionToFactoryMap.put(XMI2UMLResource.FILE_EXTENSION,
>>> XMI2UMLResource.Factory.INSTANCE);
>>>
>>> Load resource:
>>>
>>> // load resource (if not already loaded)
>>> resource = resourceSet.getResource(uri, true);
>>>
>>> // load any referenced models and profiles
>>> EcoreUtil.resolveAll(resource);
>>>
>>> Define profile:
>>>
>>> Profile profile =
>>> (Profile)EcoreUtil.getObjectByType(resource.getContents(),
>>> UMLPackage.Literals.PROFILE);
>>> profile.define();
>>>
>>> Save resource:
>>>
>>> resource.save(null);
>>>
>>>
>>> For your reference, I attached the "raw" profile (only OMG XMI) before
>>> calling define() and the resulting "defined" profile by using the UML
>>> Editor UI and my stand-alone application.
>>>
>>> Any idea what could be wrong?
>>>
>>> Cheers, Peter
>>>
>>> Kenn Hussey wrote:
>>>> Peter,
>>>>
>>>> You're right, the XMI extension elements are not meaningful from a
>>>> "pure"
>>>> OMG XMI perspective... but unfortunately, since the mapping from UML
>>>> profiles to their CMOF counterparts is non-normative (i.e. it is not
>>>> prescribed by the UML specification), it's the only way to capture
>>>> information that is specific to the Eclipse UML2 implementation in a
>>>> "standard" way. It should be easy to strip this information out (for
>>>> example
>>>> using a stylesheet) if you want to...
>>>>
>>>> Now, in order for UML2 to recognize steretype applications that are
>>>> being
>>>> "imported" from OMG XMI, it needs a couple of pieces of information,
>>>> namely
>>>> 1) where to find the metadata for the stereotype applications and 2)
>>>> which
>>>> version of the metadata is being used. The first is provided by the
>>>> schemaLocation attribute and the second is provided by an annotation on
>>>> the
>>>> profile application. To successfully "import" a model and an applied
>>>> profile
>>>> from OMG XMI (assuming the XMI extensions are missing), I would expect
>>>> that
>>>> all you should need to do is the following:
>>>>
>>>> 1) "Import" the profile (i.e. open it using the UML editor or load it
>>>> into a
>>>> properly configured resource set).
>>>> 2) Define and save the profile.
>>>> 3) Add a schemaLocation attribute to the root element of the model
>>>> which
>>>> specifies where the (just defined) metadata for the profile can be
>>>> found
>>>> OR
>>>> add a such a mapping to the URI converter in the resource set that is
>>>> being
>>>> used to load the model.
>>>> 4) "Import" the model (i.e. open it using the UML editor or load it
>>>> into
>>>> a
>>>> properly configured resource set).
>>>> 5) Add an annotation to the profile application with source
>>>> 'http://www.eclipse.org/uml2/2.0.0/UML' and a reference to the Ecore
>>>> package
>>>> defined in step 2 above, and save the model.
>>>>
>>>> To be honest, I haven't tried these steps myself, so please let me know
>>>> if
>>>> you run into problems.
>>>>
>>>> Kenn
>>>>
>>>> "Peter Ellsiepen" <peter.ellsiepen@vega.de> wrote in message
>>>> news:ete8ke$qia$1@utils.eclipse.org...
>>>>> I'm trying to write a converter that takes models from MagicDraw 12.x
>>>>> (UML 2.0/XMI 2.1) and produces models in OMG XMI 2.1 for UML 2.1.1
>>>>> format that can be read into Eclipse/UML2 2.x. [Note that I cannot use
>>>>> MagicDraw's EMF XMI v1.x exporter for various reasons (it only
>>>>> supports
>>>>> Eclipse/UML2 1.x, it requires the MagicDraw runtime and it re-writes
>>>>> all
>>>>> xmi:id's such that I cannot trace back to my original model - only to
>>>>> name a few).]
>>>>>
>>>>> Converting the model itself is fairly straightforward since I "only"
>>>>> need to translate the differences from UML 2.0 to UML 2.1.1. However,
>>>>> I'm having a hard time converting profiles and applied stereotypes in
>>>>> the models.
>>>>>
>>>>> To do this I need to understand the exact mechanism for applying
>>>>> profiles in OMG XMI files such that Eclipse/UML2 understands it and
>>>>> can
>>>>> read the UML models *together* with the applied profiles. Note that
>>>>> I'm
>>>>> fairly into XMI (since version 1.0) and UML (since version 1.2) and
>>>>> all
>>>>> the different versions (XMI vs. MOF vs. UML vs. Eclipse/UML2 etc.), so
>>>>> I
>>>>> think I understand all the issues about metamodels, profiles and so
>>>>> on.
>>>>> Here is my problem:
>>>>>
>>>>> Following, the article at
>>>>> http://www.eclipse.org/modeling/mdt/uml2/docs/articles/Intro duction_to_UML2_Profiles/article.html,
>>>>> I managed to create a sample profile and model using the UML2 editor,
>>>>> which largely resembles my original MagicDraw models in structure
>>>>> (top-level XMI element and Data model, etc.). Then I saved both as OMG
>>>>> XMI (by specifying the *.xmi extension in the Save As dialogue). Now
>>>>> my
>>>>> problem is that even in the model stored as XMI the profile/stereotype
>>>>> application only works if the Ecore extension "defining" the profile
>>>>> exists at the beginning of the profile XMI file. Now obviously this is
>>>>> specific to EMF/UML2 and should not be required when reading OMG XMI
>>>>> models and profiles.
>>>>>
>>>>> Attached I put my hand-crafted model and profile (in *.xmi format). As
>>>>> I
>>>>> said, I would like to get this modified in such a way that the profile
>>>>> does not have the Ecore extensions anymore and the model does not need
>>>>> to reference the "contents" element in the Ecore extension at the
>>>>> beginning via "xsi:schemaLocation" (apparently the "schema" of the
>>>>> profile [NB: I know XML Schema but could not find a similarity
>>>>> here.]).
>>>>> And obviously the stripped model and profile should still load into
>>>>> Eclipse/UML2 with the stereotype(s) correctly applied.
>>>>>
>>>>> Any help is greatly appreciated since I'm currently stuck.
>>>>>
>>>>> Cheers, Peter
>>>
>>
>>
>
>
|
|
|
Re: Read OMG XMI resources with profile applications but w/o Ecore extensions [message #599649 is a reply to message #471652] |
Mon, 19 March 2007 10:42  |
Eclipse User |
|
|
|
Peter,
You're right, the XMI extension elements are not meaningful from a "pure"
OMG XMI perspective... but unfortunately, since the mapping from UML
profiles to their CMOF counterparts is non-normative (i.e. it is not
prescribed by the UML specification), it's the only way to capture
information that is specific to the Eclipse UML2 implementation in a
"standard" way. It should be easy to strip this information out (for example
using a stylesheet) if you want to...
Now, in order for UML2 to recognize steretype applications that are being
"imported" from OMG XMI, it needs a couple of pieces of information, namely
1) where to find the metadata for the stereotype applications and 2) which
version of the metadata is being used. The first is provided by the
schemaLocation attribute and the second is provided by an annotation on the
profile application. To successfully "import" a model and an applied profile
from OMG XMI (assuming the XMI extensions are missing), I would expect that
all you should need to do is the following:
1) "Import" the profile (i.e. open it using the UML editor or load it into a
properly configured resource set).
2) Define and save the profile.
3) Add a schemaLocation attribute to the root element of the model which
specifies where the (just defined) metadata for the profile can be found OR
add a such a mapping to the URI converter in the resource set that is being
used to load the model.
4) "Import" the model (i.e. open it using the UML editor or load it into a
properly configured resource set).
5) Add an annotation to the profile application with source
'http://www.eclipse.org/uml2/2.0.0/UML' and a reference to the Ecore package
defined in step 2 above, and save the model.
To be honest, I haven't tried these steps myself, so please let me know if
you run into problems.
Kenn
"Peter Ellsiepen" <peter.ellsiepen@vega.de> wrote in message
news:ete8ke$qia$1@utils.eclipse.org...
> I'm trying to write a converter that takes models from MagicDraw 12.x
> (UML 2.0/XMI 2.1) and produces models in OMG XMI 2.1 for UML 2.1.1
> format that can be read into Eclipse/UML2 2.x. [Note that I cannot use
> MagicDraw's EMF XMI v1.x exporter for various reasons (it only supports
> Eclipse/UML2 1.x, it requires the MagicDraw runtime and it re-writes all
> xmi:id's such that I cannot trace back to my original model - only to
> name a few).]
>
> Converting the model itself is fairly straightforward since I "only"
> need to translate the differences from UML 2.0 to UML 2.1.1. However,
> I'm having a hard time converting profiles and applied stereotypes in
> the models.
>
> To do this I need to understand the exact mechanism for applying
> profiles in OMG XMI files such that Eclipse/UML2 understands it and can
> read the UML models *together* with the applied profiles. Note that I'm
> fairly into XMI (since version 1.0) and UML (since version 1.2) and all
> the different versions (XMI vs. MOF vs. UML vs. Eclipse/UML2 etc.), so I
> think I understand all the issues about metamodels, profiles and so on.
> Here is my problem:
>
> Following, the article at
> http://www.eclipse.org/modeling/mdt/uml2/docs/articles/Intro duction_to_UML2_Profiles/article.html,
> I managed to create a sample profile and model using the UML2 editor,
> which largely resembles my original MagicDraw models in structure
> (top-level XMI element and Data model, etc.). Then I saved both as OMG
> XMI (by specifying the *.xmi extension in the Save As dialogue). Now my
> problem is that even in the model stored as XMI the profile/stereotype
> application only works if the Ecore extension "defining" the profile
> exists at the beginning of the profile XMI file. Now obviously this is
> specific to EMF/UML2 and should not be required when reading OMG XMI
> models and profiles.
>
> Attached I put my hand-crafted model and profile (in *.xmi format). As I
> said, I would like to get this modified in such a way that the profile
> does not have the Ecore extensions anymore and the model does not need
> to reference the "contents" element in the Ecore extension at the
> beginning via "xsi:schemaLocation" (apparently the "schema" of the
> profile [NB: I know XML Schema but could not find a similarity here.]).
> And obviously the stripped model and profile should still load into
> Eclipse/UML2 with the stereotype(s) correctly applied.
>
> Any help is greatly appreciated since I'm currently stuck.
>
> Cheers, Peter
>
------------------------------------------------------------ --------------------
> <?xml version="1.0" encoding="UTF-8"?>
> <xmi:XMI xmi:version="2.1" xmlns:xmi="http://schema.omg.org/spec/XMI/2.1"
> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
> xmlns:Profile1="http:///schemas/Profile1/_rxXaUIDBEduPAOPCzCKebg/0"
> xmlns:Standard="http://schema.omg.org/spec/UML/2.1.1/StandardProfileL2"
> xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore"
> xmlns:uml="http://schema.omg.org/spec/UML/2.1.1"
> xsi:schemaLocation="http:///schemas/Profile1/_rxXaUIDBEduPAOPCzCKebg/0
> Profile1.profile.xmi#_rxdg8IDBEduPAOPCzCKebg
> http://schema.omg.org/spec/UML/2.1.1/StandardProfileL2
> http://schema.omg.org/spec/UML/2.1.1/StandardProfileL2.xmi#_ yzU58YinEdqtvbnfB2L_5w
> http://schema.omg.org/spec/UML/2.1.1
> http://www.eclipse.org/uml2/2.0.0/UML">
> <uml:Model xmi:id="_4uqT0H4nEdu2y_kSW8x_lA" name="Data">
> <ownedComment xmi:type="uml:Comment" xmi:id="_Of5QEH5rEduZRZF7VtoXrg"
> annotatedElement="_4uqT0H4nEdu2y_kSW8x_lA">
> <body>blabla</body>
> </ownedComment>
> <packagedElement xmi:type="uml:Package"
> xmi:id="_1W4jEIDBEduPAOPCzCKebg" name="Package1">
> <packagedElement xmi:type="uml:Package"
> xmi:id="_mWUhwIEgEduPAOPCzCKebg" name="NestedPackage2">
> <packagedElement xmi:type="uml:Class"
> xmi:id="_oNOZAIEgEduPAOPCzCKebg" name="ClassInNestedPackage"/>
> <profileApplication xmi:type="uml:ProfileApplication"
> xmi:id="_swg-AIEgEduPAOPCzCKebg">
> <xmi:Extension extender="http://www.eclipse.org/emf/2002/Ecore">
> <eAnnotations xmi:type="ecore:EAnnotation"
> xmi:id="_swg-AYEgEduPAOPCzCKebg"
> source="http://www.eclipse.org/uml2/2.0.0/UML">
> <references xmi:type="ecore:EPackage"
> href="Profile1.profile.xmi#_rxdg8IDBEduPAOPCzCKebg"/>
> </eAnnotations>
> </xmi:Extension>
> <appliedProfile xmi:type="uml:Profile"
> href="Profile1.profile.xmi#_LtC68IBNEduYpP3CXp-3Mw"/>
> </profileApplication>
> </packagedElement>
> <packagedElement xmi:type="uml:Class"
> xmi:id="_9e4hkH4nEdu2y_kSW8x_lA" name="Class1"/>
> <packagedElement xmi:type="uml:Class"
> xmi:id="_DqpmMIEbEduPAOPCzCKebg" name="Class2"/>
> <profileApplication xmi:type="uml:ProfileApplication"
> xmi:id="_4GPFQIDBEduPAOPCzCKebg">
> <appliedProfile xmi:type="uml:Profile"
> href="Profile1.profile.xmi#_LtC68IBNEduYpP3CXp-3Mw"/>
> </profileApplication>
> <profileApplication xmi:type="uml:ProfileApplication"
> xmi:id="_C9SJ4IEbEduPAOPCzCKebg">
> <appliedProfile xmi:type="uml:Profile"
> href=" http://schema.omg.org/spec/UML/2.1.1/StandardProfileL2.xmi#_ 0"/>
> </profileApplication>
> </packagedElement>
> </uml:Model>
> <Profile1:Functional xmi:id="_5P9tcIDBEduPAOPCzCKebg"
> base_Class="_9e4hkH4nEdu2y_kSW8x_lA"/>
> <Profile1:Functional xmi:id="_KfVz0IEgEduPAOPCzCKebg"
> base_Class="_DqpmMIEbEduPAOPCzCKebg"/>
> <Profile1:Functional xmi:id="_tm2wIIEgEduPAOPCzCKebg"
> base_Class="_oNOZAIEgEduPAOPCzCKebg"/>
> <Standard:Auxiliary xmi:id="_Ggl4kIEbEduPAOPCzCKebg"
> base_Class="_DqpmMIEbEduPAOPCzCKebg"/>
> </xmi:XMI>
>
------------------------------------------------------------ --------------------
> <?xml version="1.0" encoding="UTF-8"?>
> <uml:Profile xmi:version="2.1"
> xmlns:xmi="http://schema.omg.org/spec/XMI/2.1"
> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
> xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore"
> xmlns:uml="http://schema.omg.org/spec/UML/2.1.1"
> xsi:schemaLocation="http://schema.omg.org/spec/UML/2.1.1
> http://www.eclipse.org/uml2/2.0.0/UML" xmi:id="_LtC68IBNEduYpP3CXp-3Mw"
> name="Profile1" metaclassReference="_R0jrwIBNEduYpP3CXp-3Mw"
> metamodelReference="_QTL_oIBNEduYpP3CXp-3Mw">
> <xmi:Extension extender="http://www.eclipse.org/emf/2002/Ecore">
> <eAnnotations xmi:type="ecore:EAnnotation"
> xmi:id="_rxXaUYDBEduPAOPCzCKebg"
> source="http://www.eclipse.org/uml2/2.0.0/UML">
> <contents xmi:type="ecore:EPackage" xmi:id="_rxdg8IDBEduPAOPCzCKebg"
> name="Profile1" nsURI="http:///schemas/Profile1/_rxXaUIDBEduPAOPCzCKebg/0"
> nsPrefix="Profile1">
> <eClassifiers xmi:type="ecore:EClass"
> xmi:id="_rxdg8YDBEduPAOPCzCKebg" name="Functional">
> <xmi:Extension extender="http://www.eclipse.org/emf/2002/Ecore">
> <eAnnotations xmi:type="ecore:EAnnotation"
> xmi:id="_rxdg8oDBEduPAOPCzCKebg"
> source="http://www.eclipse.org/uml2/2.0.0/UML"
> references="_Ueka8IBNEduYpP3CXp-3Mw"/>
> </xmi:Extension>
> <eStructuralFeatures xmi:type="ecore:EReference"
> xmi:id="_rxdg84DBEduPAOPCzCKebg" name="base_Class" ordered="false"
> lowerBound="1">
> <eType xmi:type="ecore:EClass"
> href="http://www.eclipse.org/uml2/2.0.0/UML#//Class"/>
> </eStructuralFeatures>
> </eClassifiers>
> </contents>
> </eAnnotations>
> </xmi:Extension>
> <elementImport xmi:type="uml:ElementImport"
> xmi:id="_R0jrwIBNEduYpP3CXp-3Mw">
> <importedElement xmi:type="uml:Class"
> href="http://schema.omg.org/spec/UML/2.1.1/uml.xml#Class"/>
> </elementImport>
> <packageImport xmi:type="uml:PackageImport"
> xmi:id="_QTL_oIBNEduYpP3CXp-3Mw">
> <importedPackage xmi:type="uml:Model"
> href="http://schema.omg.org/spec/UML/2.1.1/uml.xml#_0"/>
> </packageImport>
> <packagedElement xmi:type="uml:Stereotype"
> xmi:id="_Ueka8IBNEduYpP3CXp-3Mw" name="Functional">
> <ownedAttribute xmi:type="uml:Property"
> xmi:id="_XsB1coBNEduYpP3CXp-3Mw" name="base_Class"
> association="_XsB1cIBNEduYpP3CXp-3Mw">
> <type xmi:type="uml:Class"
> href="http://schema.omg.org/spec/UML/2.1.1/uml.xml#Class"/>
> </ownedAttribute>
> <icon xmi:type="uml:Image" xmi:id="EOperation-_icon.0"
> location="../icons/full/ovr16/EOperation.gif"/>
> </packagedElement>
> <packagedElement xmi:type="uml:Extension"
> xmi:id="_XsB1cIBNEduYpP3CXp-3Mw" name="Class_Stereotype1"
> memberEnd="_XsB1cYBNEduYpP3CXp-3Mw _XsB1coBNEduYpP3CXp-3Mw">
> <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_XsB1cYBNEduYpP3CXp-3Mw"
> name="extension_Stereotype1" type="_Ueka8IBNEduYpP3CXp-3Mw"
> aggregation="composite" association="_XsB1cIBNEduYpP3CXp-3Mw"/>
> </packagedElement>
> </uml:Profile>
>
|
|
|
Re: Read OMG XMI resources with profile applications but w/o Ecore extensions [message #607447 is a reply to message #471659] |
Wed, 11 April 2007 18:34  |
Eclipse User |
|
|
|
This is a multi-part message in MIME format.
--------------080209010704040208000802
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
Kenn,
thanks for your comprehensive answer. After the Easter holidays I took
some time to put your suggestions into source code. I nearly finished
the profile and model conversion procedure now, with the exception of
one quite awkward problem: I can "define" my profiles from within the
UML Editor (i.e. via UI) but the code in my stand-alone application does
not work. In the stand-alone case, the resulting Ecore package
representing the schema of the profile (i.e. the "defined" profile) is
broken: all EAttributes and EClasses are missing the references to their
types (via the eType element).
I checked my initialization and reader code many times, taking into
account the UML 2.0 Migration Guide
( http://www.eclipse.org/modeling/mdt/uml2/docs/guides/UML2_2. 0_Migration_Guide/guide.html)
and the article on UML2 Profiles
( http://www.eclipse.org/modeling/mdt/uml2/docs/articles/Intro duction_to_UML2_Profiles/article.html).
Here is my code (snippets put together to show the main flow):
Prepare resource set (initialize):
// get reference to URI map
Map uriMap = URIConverter.URI_MAP;
// register the necessary pathmaps
uriMap.put(URI.createURI(UMLResource.LIBRARIES_PATHMAP),
umlResourcesPluginURI.appendSegment("libraries").appendSegment( ""));
uriMap.put(URI.createURI(UMLResource.METAMODELS_PATHMAP),
umlResourcesPluginURI.appendSegment("metamodels").appendSegment( ""));
uriMap.put(URI.createURI(UMLResource.PROFILES_PATHMAP),
umlResourcesPluginURI.appendSegment("profiles").appendSegment( ""));
// for a stand alone application, it is necessary to map the
// platform plugin URI scheme to the workspace location
uriMap.put(URI.createURI("platform:/plugin/org.eclipse.uml2.uml/ "),
umlPluginURI);
Map packageRegistry = resourceSet.getPackageRegistry();
// register the Ecore package from org.eclipse.emf
packageRegistry.put(EcorePackage.eNS_URI, EcorePackage.eINSTANCE);
// register the UML package from org.eclipse.uml2
packageRegistry.put(UMLPackage.eNS_URI, UMLPackage.eINSTANCE);
// register known file extensions:
// - *.uml -> native Eclipse/UML2 resource
// - *.xmi -> OMG XMI UML2 resource
Map extensionToFactoryMap =
Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap( );
extensionToFactoryMap.put(UMLResource.FILE_EXTENSION,
UMLResource.Factory.INSTANCE);
extensionToFactoryMap.put(XMI2UMLResource.FILE_EXTENSION,
XMI2UMLResource.Factory.INSTANCE);
Load resource:
// load resource (if not already loaded)
resource = resourceSet.getResource(uri, true);
// load any referenced models and profiles
EcoreUtil.resolveAll(resource);
Define profile:
Profile profile =
(Profile)EcoreUtil.getObjectByType(resource.getContents(),
UMLPackage.Literals.PROFILE);
profile.define();
Save resource:
resource.save(null);
For your reference, I attached the "raw" profile (only OMG XMI) before
calling define() and the resulting "defined" profile by using the UML
Editor UI and my stand-alone application.
Any idea what could be wrong?
Cheers, Peter
Kenn Hussey wrote:
> Peter,
>
> You're right, the XMI extension elements are not meaningful from a "pure"
> OMG XMI perspective... but unfortunately, since the mapping from UML
> profiles to their CMOF counterparts is non-normative (i.e. it is not
> prescribed by the UML specification), it's the only way to capture
> information that is specific to the Eclipse UML2 implementation in a
> "standard" way. It should be easy to strip this information out (for example
> using a stylesheet) if you want to...
>
> Now, in order for UML2 to recognize steretype applications that are being
> "imported" from OMG XMI, it needs a couple of pieces of information, namely
> 1) where to find the metadata for the stereotype applications and 2) which
> version of the metadata is being used. The first is provided by the
> schemaLocation attribute and the second is provided by an annotation on the
> profile application. To successfully "import" a model and an applied profile
> from OMG XMI (assuming the XMI extensions are missing), I would expect that
> all you should need to do is the following:
>
> 1) "Import" the profile (i.e. open it using the UML editor or load it into a
> properly configured resource set).
> 2) Define and save the profile.
> 3) Add a schemaLocation attribute to the root element of the model which
> specifies where the (just defined) metadata for the profile can be found OR
> add a such a mapping to the URI converter in the resource set that is being
> used to load the model.
> 4) "Import" the model (i.e. open it using the UML editor or load it into a
> properly configured resource set).
> 5) Add an annotation to the profile application with source
> 'http://www.eclipse.org/uml2/2.0.0/UML' and a reference to the Ecore package
> defined in step 2 above, and save the model.
>
> To be honest, I haven't tried these steps myself, so please let me know if
> you run into problems.
>
> Kenn
>
> "Peter Ellsiepen" <peter.ellsiepen@vega.de> wrote in message
> news:ete8ke$qia$1@utils.eclipse.org...
>> I'm trying to write a converter that takes models from MagicDraw 12.x
>> (UML 2.0/XMI 2.1) and produces models in OMG XMI 2.1 for UML 2.1.1
>> format that can be read into Eclipse/UML2 2.x. [Note that I cannot use
>> MagicDraw's EMF XMI v1.x exporter for various reasons (it only supports
>> Eclipse/UML2 1.x, it requires the MagicDraw runtime and it re-writes all
>> xmi:id's such that I cannot trace back to my original model - only to
>> name a few).]
>>
>> Converting the model itself is fairly straightforward since I "only"
>> need to translate the differences from UML 2.0 to UML 2.1.1. However,
>> I'm having a hard time converting profiles and applied stereotypes in
>> the models.
>>
>> To do this I need to understand the exact mechanism for applying
>> profiles in OMG XMI files such that Eclipse/UML2 understands it and can
>> read the UML models *together* with the applied profiles. Note that I'm
>> fairly into XMI (since version 1.0) and UML (since version 1.2) and all
>> the different versions (XMI vs. MOF vs. UML vs. Eclipse/UML2 etc.), so I
>> think I understand all the issues about metamodels, profiles and so on.
>> Here is my problem:
>>
>> Following, the article at
>> http://www.eclipse.org/modeling/mdt/uml2/docs/articles/Intro duction_to_UML2_Profiles/article.html,
>> I managed to create a sample profile and model using the UML2 editor,
>> which largely resembles my original MagicDraw models in structure
>> (top-level XMI element and Data model, etc.). Then I saved both as OMG
>> XMI (by specifying the *.xmi extension in the Save As dialogue). Now my
>> problem is that even in the model stored as XMI the profile/stereotype
>> application only works if the Ecore extension "defining" the profile
>> exists at the beginning of the profile XMI file. Now obviously this is
>> specific to EMF/UML2 and should not be required when reading OMG XMI
>> models and profiles.
>>
>> Attached I put my hand-crafted model and profile (in *.xmi format). As I
>> said, I would like to get this modified in such a way that the profile
>> does not have the Ecore extensions anymore and the model does not need
>> to reference the "contents" element in the Ecore extension at the
>> beginning via "xsi:schemaLocation" (apparently the "schema" of the
>> profile [NB: I know XML Schema but could not find a similarity here.]).
>> And obviously the stripped model and profile should still load into
>> Eclipse/UML2 with the stereotype(s) correctly applied.
>>
>> Any help is greatly appreciated since I'm currently stuck.
>>
>> Cheers, Peter
--------------080209010704040208000802
Content-Type: application/x-zip-compressed;
name="sample_files.zip"
Content-Transfer-Encoding: base64
Content-Disposition: inline;
filename="sample_files.zip"
UEsDBBQAAAAIAKQAjDZvzyGZoQQAAFcXAAAxAAAAc2FtcGxlX2ZpbGVzL015 UHJvZmlsZS5k
ZWZpbmVkX2J5X2FwcC5wcm9maWxlLnhtadVY2Y7qRhB9j5R/sJznwfuGIFck 4kZEMzfozhDl
zTJ2Y1rxgrptGP7+VnvDC4tZZpRoHgB3d9WpU6e6yjP68h4G3BYRiuNozEsD kedQ5MYejvwx
v3j7+mTyX379+adRGgbDOYlXOEDce4iH1RF5IPHwJIjoEJ6P+XWSbIaCQN01 Cp1BHPqDmPgC
3SBX+OdlJtS308P23W432CnZVlkUJdj6/JpZeMIRTZzIReUp5MYENc4hN8Ab irLDKFwxA7Iw
ZdvKMwD+LLDFyzMDlkGjeJhveY5dJ8lC7HOSOwEIXMuwQxyIbC+fcYe9MW9L si1OJ/MlShxb
MmRdVBXZliRd1VVZMnRVNGxTk1TTsmXZ5LnICSHql32RA54L4WAYeyj4jlaI QM5g2c4h2gDR
Buc2g2iDWxsswx8ONzFJeEgnx40YkOl7giKWRg6xbx4ifYnNbIAVNImiOMl4 ollsyX4DQLIk
DaeHxVrgdKEv/b/W6tRL/f3WkKLoD28/4Tkap8Q9ndkWkQUAgODGEWBPjrif O+6/jo9uJd0u
LR9hP6KL77MKayENKlQ7BAjzz7AbpiCys3OCVvi9brAKh3H6e+BQilcYSqwb VLbYpjPt0plD
DvcHY68J6CRmxuruHiWFA/wbJfF0ryQ4UlYCvZRqU9cN3VZUQ7VYqi1eaDIi NChprqHXhKRu
khIn+Ioc+ERHwqyKshXl+ojw80wtHYrsQ7J4LiaQBAQHV05AwU4Q7xD5LU4j eCS1AfcCNUkS
gpdp0gGFToFyKzxvjn8NpJFQV/F96l6fUfes6A7/bW2vP1HbsiIrhmKbumyJ tqxqnyZtfF7a
VaagJ0H23YKn/pLqi++UyvFJlZcjxmM0PhLKvlE2SaEum7z7HsnCaJO3q1nW pWtxZaNXfa0e
WJ+Gz+WfMNJ9g3gp+EGXLsjOAFLGkptCXgGoBfOFDSQ8twa19hubmM4HMKT9 YosFtyOhwUOD
Gm8aoBCYbXmteOzZ6aFEVFGF4lAsE2pEk0ohsKkqXCIyjXqaMExJFBUwoXB9 tmuKIirMo1zx
Ge8iCCvyToUES9dFdYBURoVKW3a4r92T3BZTvMQBTvZjfkPw1mElk0O45Kh5 w3CO7xPkF9Oy
G0PiKGbGIDgQ3YTS2MXF6iXL7cQ4dxw+lGS62SDytxOkbcE+A064TRZRgEP4 6n1zstvlOsol
ybQsDVxqByFtmbPmjTHKrpIzKGZwbfis9V/jXNZMzWL5VivnpcuRUKqrWVll GX1IbemWZoAK
dcXUGCr9htrKTSiSqlomi+9CbeXbIelyxoPxEbXVhnSstrJm8IgC646nj6uw bnquqLDO4Y+v
sNwlPNZU0LoufmqF5c5V2dRUA+K1PqTC6orpBeuIPPq87OXlUE1H7QGDxJDA ZN8TQ7foTr3G
HC2Cx2iOoW+FUbw/3DCA1DC3sltRdgeRUj0wQ7F0zVB0HWYBRVVVTQYiT7xy NehLlwF2zxMw
J6zM8Ba9ZYK6gYiyRs6y8DlK704al9/7bsnOpR5bm9t6vNLcq/gzc8xDFX8c /ueIX9ctHa51
S7JkzbaqG6zxJvY/kv5IqP1/HH7/AFBLAwQUAAAACABwAow20gfJENoEAABg GQAAMAAAAHNh
bXBsZV9maWxlcy9NeVByb2ZpbGUuZGVmaW5lZF9ieV9VSS5wcm9maWxlLnht ad1Z227jNhB9
L9B/ELTPse43w+nC3XXQFMk23SSL3b4IskzbRHUxSMqXv+9QsmRJlmzZsYO2 yIMdkTNz5swc
apgMPq7DQFgiQnEc3YpKTxYFFPnxBEezW/H15e7GFj/+8vNPgyQM+k8knuIA CesQ9wsTtaeI
8CSIaB+e34pzxhZ9SaL+HIVeLw5nvZjMJLpAvvT98V4qb6e77avVqrfS0q2q LCuw9eE59XCD
I8q8yEe5FfJjgip2yA/wgqLUGIVT7kCVRnxbbgPgDwJ7fXzgwFJoFPezLQ+x 77E0xS6WQgsg
CK3CDrkn871iyh2e3IquorryaPg0RsxzFUs1ZV1TXUUxdVNXFcvUZcu1DUW3 HVdVbVGIvBCy
ftxsayAKIRiG8QQFX9EUEagZLLsZRBcguhDc5RBdCOuCZ/jB4SImTIRyCsKA AxmtGYp4GQXE
v00Q6Ups6gO8oGEUxSzliaa5sc0CgKRF6o92i6XEF6/Tu9kfc3M0SfCn33/7 6/Nw/mP5pyjQ
OCF+e2VrRG4BAAQ/jgA7awj/5Pl/ezNUiU2eVw2x99iN6OvX+wLLtvRUKnZI 4OrHjb7nSpK5
7RNBU7wuOyzgcs4+BR6leIpBQvug08U6ZNQGOdzsnD0z6IOYOyuHu1Spd/DP KTnkkLy15ALJ
O50e049tmpbparqlO1w/jihVGZEqlFTX0DMjic8S4gV3yINP1JBmIbp6ljdt lRp7FLm7YolC
TKAICAynXkDBTxCvEPk1TiJ4pOyz/gLhW7tlDtR0pPGDJJVQ1HlpSP4MdoaM ETxOWJ2ddav0
/ALSize7EDefPebxlSP0VNsd6BndR+xEYmC9JOq3iX19QOz325fhv1vq63eU uqqpmqW5tqk6
sqvqxrspfX1Y6UWl4BUM1fe3PF2ksc8SfTOg09q8K2dt+t+06j+f8v5P6h9I +WiST0tSWVDZ
GNbQn4NFNrfcp+NaKbN0Bi+vlejtNPkJ2SfM9l+AdQpx0LE36d4kmueSuUKT LaAazEc+mdao
Pzg/84btwbT+wZW37A+kCg8VaiajAIXAbC1qwWPHORsOD13W4djQHBtOD0PJ 25GP1+EYkVHU
0YVlK7KsgQtN6LLd0DRZ4xHVgs94FUFa0aQtJVg6LasdpDwrlPtyw03pDSIs McVjHGC2uRUX
BC89LtwMwrFA1bNX8GYzgmbba5MfQ+Eo5s4gOWi6IaWxj7erxzzXC+O9wXgn yWSxQOSbFyT1
hn0AnKDu1yjAIXydfPFStZ9GuaLYjmNASGPXSEsejJ9buzNlkB5oB1DAEYRm fEY8Jbhq2IbD
660XwfOQAynvrqqychldRVumY1jQhaZmGxyVeYa2MheaouuOzfM7oq1sOxRd TXmwrqGtOqQm
baUvg0sIbP8eczmF7ZfnBIXtGV9fYVlIeGzo0Oum/K4Ky4Lrqm3oFuTrXEVh 5Y7pBKuhPbr8
VSCTQzGj1QcMEkMB2aYjhn3Rtd13G0VwmZ5j1QmQp9E0I3cbQBpux9vqFpS9 gUilnJilOaZh
aaYJs4Cm67qhApEtV+IKfck4wP5hAp4IlxleooYhuBsRuUYOsvA+nb4/aRy/ EZ9TnWPv2NLc
1uGy99aOPzDHXLTjD18Nr9v8pumYcKw7iqMarlOcYJX74H+o9QdSsvtHCfz+ D1BLAwQUAAAA
CABAAow2G/JfFHoDAADFDwAAJgAAAHNhbXBsZV9maWxlcy9NeVByb2ZpbGUu cmF3LnByb2Zp
bGUueG1p1VfbbtpAEH2v1H+w3Odg78VrG0GrqKJSpCSK2qTq28qYxVnVN9kL hL/vrC/EmIRA
EiJVPADr2ZkzZ85ZrUffHpLYWIqilFk6NtHANg2RhtlMptHYvLv9ceaZ375+ /jRaJPHwpsjm
MhbGQyKHmy14gExYidNyCOtj816pfGhZZXgvkmCQJdEgKyKrzEVo/bm6sLrh 5WP4arUarEgV
im0bQejlryrDmUxLFaShaHeJMCvE1j4RxjIvRbVZJHOdAFsTHdbuAfB7gd1d XWpgFbRSDuuQ
yywMVNXiITuNZwBBaQwR9sDWsWbFnZyNTY4wtyfnN1OhAo5czGxKMEeIUUYx chm1Xe45iHo+
x9gzjTRIoOurdTMD00hgY5LNRPxTzEUBM4PHvIbIASKH4lxD5FCWQ2b4yCTP CmXCOA1jlAfh
3yASF9VaBUutc8hRDbr7rIP5oPRG/Q0CugbMJdQRR7dbQQSQdSoxawD1YF7p 9k3jvhDzw4ak
pzEASXzhtmnVNFhbPGxRM5vEIhFpn5zJgxKp1v6Bw8QEU5tyTInv2Rw7qB2m nmEyFcUkPTCF
6yHbJpCCGIeEO4TYRFfEGz6zVQptpbPnWoJHx3X1CKntSrS5eLL+pUCZma5j GktZyqmMpVqP
zbyQy0DBYg3hpULEJdxj2IdeqGMaQRQVImq8GWYwuFLqZNAciO68LLNQNk9f ytwfTPCGzQ3H
wPIiz0XxO4gXfcFeAs4iiO/SWCbwc3YdqAX8P45yhDzfd6Ck8yikpS4Gx3ej 6gpFnK32orhI
lYhEcVxx7HiOr+dNN8XbkiOrVde2s1obncRbzHdcUCEjnqNRsVd4q05BEKW+ p/t7wVt1OAwd
Vzy4p/BWH9JT3voeg1jfw2DIY8xlnFCX+vr09d/RYbvjOcJhO5tP77C6JCw7 FLTO7A91WF2c
Ys+hLvTrn8RhXcUcBOsJedSwGgnKuRRFJ+uWHc6VKuR0ofoEwS0GBqjWB2LY NV2DYRqUgj/C
eMYE76M5jb7XRlX5VReQDubedDeUvYFI1G3MJT5zXMIY3AUIpdTBQGRLYLjB cRtEPfoW01iG
+wm4KbTN5FLcVoJ6BRGtR/ay8DFK371ptEK/aN5BTi3znXtbV+YbEEAkTKx+ OXm74vfcY95V
8U/D/xjxM+YzONZ95GOH+5sTrH21/N+kP7I6b+Pw/x9QSwECFAsUAAAACACk AIw2b88hmaEE
AABXFwAAMQAAAAAAAAABACAAAAAAAAAAc2FtcGxlX2ZpbGVzL015UHJvZmls ZS5kZWZpbmVk
X2J5X2FwcC5wcm9maWxlLnhtaVBLAQIUCxQAAAAIAHACjDbSB8kQ2gQAAGAZ AAAwAAAAAAAA
AAEAIAAAAPAEAABzYW1wbGVfZmlsZXMvTXlQcm9maWxlLmRlZmluZWRfYnlf VUkucHJvZmls
ZS54bWlQSwECFAsUAAAACABAAow2G/JfFHoDAADFDwAAJgAAAAAAAAABACAA AAAYCgAAc2Ft
cGxlX2ZpbGVzL015UHJvZmlsZS5yYXcucHJvZmlsZS54bWlQSwUGAAAAAAMA AwARAQAA1g0A
AAAA
--------------080209010704040208000802--
|
|
|
Re: Read OMG XMI resources with profile applications but w/o Ecore extensions [message #607449 is a reply to message #472510] |
Wed, 11 April 2007 22:59  |
Eclipse User |
|
|
|
Peter,
Did you try debugging the code to ensure that the references to the
metamodel are being resolved correctly? What values are being passed for
umlResourcesPluginURI and umlPluginURI? Are they correct?
Kenn
"Peter Ellsiepen" <peter.ellsiepen@vega.de> wrote in message
news:evjnqo$7vv$1@build.eclipse.org...
> Kenn,
>
> thanks for your comprehensive answer. After the Easter holidays I took
> some time to put your suggestions into source code. I nearly finished
> the profile and model conversion procedure now, with the exception of
> one quite awkward problem: I can "define" my profiles from within the
> UML Editor (i.e. via UI) but the code in my stand-alone application does
> not work. In the stand-alone case, the resulting Ecore package
> representing the schema of the profile (i.e. the "defined" profile) is
> broken: all EAttributes and EClasses are missing the references to their
> types (via the eType element).
>
> I checked my initialization and reader code many times, taking into
> account the UML 2.0 Migration Guide
> ( http://www.eclipse.org/modeling/mdt/uml2/docs/guides/UML2_2. 0_Migration_Guide/guide.html)
> and the article on UML2 Profiles
> ( http://www.eclipse.org/modeling/mdt/uml2/docs/articles/Intro duction_to_UML2_Profiles/article.html).
> Here is my code (snippets put together to show the main flow):
>
> Prepare resource set (initialize):
>
> // get reference to URI map
> Map uriMap = URIConverter.URI_MAP;
>
> // register the necessary pathmaps
> uriMap.put(URI.createURI(UMLResource.LIBRARIES_PATHMAP),
>
> umlResourcesPluginURI.appendSegment("libraries").appendSegment( ""));
>
> uriMap.put(URI.createURI(UMLResource.METAMODELS_PATHMAP),
>
> umlResourcesPluginURI.appendSegment("metamodels").appendSegment( ""));
>
> uriMap.put(URI.createURI(UMLResource.PROFILES_PATHMAP),
>
> umlResourcesPluginURI.appendSegment("profiles").appendSegment( ""));
>
> // for a stand alone application, it is necessary to map the
> // platform plugin URI scheme to the workspace location
>
> uriMap.put(URI.createURI("platform:/plugin/org.eclipse.uml2.uml/ "),
> umlPluginURI);
>
> Map packageRegistry = resourceSet.getPackageRegistry();
>
> // register the Ecore package from org.eclipse.emf
> packageRegistry.put(EcorePackage.eNS_URI, EcorePackage.eINSTANCE);
>
> // register the UML package from org.eclipse.uml2
> packageRegistry.put(UMLPackage.eNS_URI, UMLPackage.eINSTANCE);
>
> // register known file extensions:
> // - *.uml -> native Eclipse/UML2 resource
> // - *.xmi -> OMG XMI UML2 resource
> Map extensionToFactoryMap =
> Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap( );
> extensionToFactoryMap.put(UMLResource.FILE_EXTENSION,
> UMLResource.Factory.INSTANCE);
> extensionToFactoryMap.put(XMI2UMLResource.FILE_EXTENSION,
> XMI2UMLResource.Factory.INSTANCE);
>
> Load resource:
>
> // load resource (if not already loaded)
> resource = resourceSet.getResource(uri, true);
>
> // load any referenced models and profiles
> EcoreUtil.resolveAll(resource);
>
> Define profile:
>
> Profile profile =
> (Profile)EcoreUtil.getObjectByType(resource.getContents(),
> UMLPackage.Literals.PROFILE);
> profile.define();
>
> Save resource:
>
> resource.save(null);
>
>
> For your reference, I attached the "raw" profile (only OMG XMI) before
> calling define() and the resulting "defined" profile by using the UML
> Editor UI and my stand-alone application.
>
> Any idea what could be wrong?
>
> Cheers, Peter
>
> Kenn Hussey wrote:
>> Peter,
>>
>> You're right, the XMI extension elements are not meaningful from a "pure"
>> OMG XMI perspective... but unfortunately, since the mapping from UML
>> profiles to their CMOF counterparts is non-normative (i.e. it is not
>> prescribed by the UML specification), it's the only way to capture
>> information that is specific to the Eclipse UML2 implementation in a
>> "standard" way. It should be easy to strip this information out (for
>> example
>> using a stylesheet) if you want to...
>>
>> Now, in order for UML2 to recognize steretype applications that are being
>> "imported" from OMG XMI, it needs a couple of pieces of information,
>> namely
>> 1) where to find the metadata for the stereotype applications and 2)
>> which
>> version of the metadata is being used. The first is provided by the
>> schemaLocation attribute and the second is provided by an annotation on
>> the
>> profile application. To successfully "import" a model and an applied
>> profile
>> from OMG XMI (assuming the XMI extensions are missing), I would expect
>> that
>> all you should need to do is the following:
>>
>> 1) "Import" the profile (i.e. open it using the UML editor or load it
>> into a
>> properly configured resource set).
>> 2) Define and save the profile.
>> 3) Add a schemaLocation attribute to the root element of the model which
>> specifies where the (just defined) metadata for the profile can be found
>> OR
>> add a such a mapping to the URI converter in the resource set that is
>> being
>> used to load the model.
>> 4) "Import" the model (i.e. open it using the UML editor or load it into
>> a
>> properly configured resource set).
>> 5) Add an annotation to the profile application with source
>> 'http://www.eclipse.org/uml2/2.0.0/UML' and a reference to the Ecore
>> package
>> defined in step 2 above, and save the model.
>>
>> To be honest, I haven't tried these steps myself, so please let me know
>> if
>> you run into problems.
>>
>> Kenn
>>
>> "Peter Ellsiepen" <peter.ellsiepen@vega.de> wrote in message
>> news:ete8ke$qia$1@utils.eclipse.org...
>>> I'm trying to write a converter that takes models from MagicDraw 12.x
>>> (UML 2.0/XMI 2.1) and produces models in OMG XMI 2.1 for UML 2.1.1
>>> format that can be read into Eclipse/UML2 2.x. [Note that I cannot use
>>> MagicDraw's EMF XMI v1.x exporter for various reasons (it only supports
>>> Eclipse/UML2 1.x, it requires the MagicDraw runtime and it re-writes all
>>> xmi:id's such that I cannot trace back to my original model - only to
>>> name a few).]
>>>
>>> Converting the model itself is fairly straightforward since I "only"
>>> need to translate the differences from UML 2.0 to UML 2.1.1. However,
>>> I'm having a hard time converting profiles and applied stereotypes in
>>> the models.
>>>
>>> To do this I need to understand the exact mechanism for applying
>>> profiles in OMG XMI files such that Eclipse/UML2 understands it and can
>>> read the UML models *together* with the applied profiles. Note that I'm
>>> fairly into XMI (since version 1.0) and UML (since version 1.2) and all
>>> the different versions (XMI vs. MOF vs. UML vs. Eclipse/UML2 etc.), so I
>>> think I understand all the issues about metamodels, profiles and so on.
>>> Here is my problem:
>>>
>>> Following, the article at
>>> http://www.eclipse.org/modeling/mdt/uml2/docs/articles/Intro duction_to_UML2_Profiles/article.html,
>>> I managed to create a sample profile and model using the UML2 editor,
>>> which largely resembles my original MagicDraw models in structure
>>> (top-level XMI element and Data model, etc.). Then I saved both as OMG
>>> XMI (by specifying the *.xmi extension in the Save As dialogue). Now my
>>> problem is that even in the model stored as XMI the profile/stereotype
>>> application only works if the Ecore extension "defining" the profile
>>> exists at the beginning of the profile XMI file. Now obviously this is
>>> specific to EMF/UML2 and should not be required when reading OMG XMI
>>> models and profiles.
>>>
>>> Attached I put my hand-crafted model and profile (in *.xmi format). As I
>>> said, I would like to get this modified in such a way that the profile
>>> does not have the Ecore extensions anymore and the model does not need
>>> to reference the "contents" element in the Ecore extension at the
>>> beginning via "xsi:schemaLocation" (apparently the "schema" of the
>>> profile [NB: I know XML Schema but could not find a similarity here.]).
>>> And obviously the stripped model and profile should still load into
>>> Eclipse/UML2 with the stereotype(s) correctly applied.
>>>
>>> Any help is greatly appreciated since I'm currently stuck.
>>>
>>> Cheers, Peter
>
>
|
|
|
Re: Read OMG XMI resources with profile applications but w/o Ecore extensions [message #607719 is a reply to message #472511] |
Thu, 19 April 2007 03:26  |
Eclipse User |
|
|
|
This is a multi-part message in MIME format.
--------------090507010705050704000300
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
Kenn,
thanks for your hint - again you were pointing into the right direction,
that is I had an error in the definition of umlResourcesPluginURI and
umlPluginURI variables (incorrect path to the JAR file). Unfortunately,
the UML2 package does not raise any error message (or exception) if any
of the configured pathmaps points to a non-existing location. How can I
enable error handling for such cases?
Another problem I have now is that the loading of the converted XMI
model (and referenced profiles) is *very* slow, i.e. it takes ~1 minute
for a quite small model on my Notebook, although the content seems to be
correct and the files can be loaded without error message. Is it
possible that this is related to some read timeout while trying to
resolve some external XML resource/entity (my computer is behind a
firewall)? I have the example files attached to this message; the
behaviour can be reproduced by loading gen/MyModel.xmi into the
Eclipse/UML2 editor.
Any idea what could be the reason for the large loading time?
Peter
Kenn Hussey wrote:
> Peter,
>
> Did you try debugging the code to ensure that the references to the
> metamodel are being resolved correctly? What values are being passed for
> umlResourcesPluginURI and umlPluginURI? Are they correct?
>
> Kenn
>
> "Peter Ellsiepen" <peter.ellsiepen@vega.de> wrote in message
> news:evjnqo$7vv$1@build.eclipse.org...
>> Kenn,
>>
>> thanks for your comprehensive answer. After the Easter holidays I took
>> some time to put your suggestions into source code. I nearly finished
>> the profile and model conversion procedure now, with the exception of
>> one quite awkward problem: I can "define" my profiles from within the
>> UML Editor (i.e. via UI) but the code in my stand-alone application does
>> not work. In the stand-alone case, the resulting Ecore package
>> representing the schema of the profile (i.e. the "defined" profile) is
>> broken: all EAttributes and EClasses are missing the references to their
>> types (via the eType element).
>>
>> I checked my initialization and reader code many times, taking into
>> account the UML 2.0 Migration Guide
>> ( http://www.eclipse.org/modeling/mdt/uml2/docs/guides/UML2_2. 0_Migration_Guide/guide.html)
>> and the article on UML2 Profiles
>> ( http://www.eclipse.org/modeling/mdt/uml2/docs/articles/Intro duction_to_UML2_Profiles/article.html).
>> Here is my code (snippets put together to show the main flow):
>>
>> Prepare resource set (initialize):
>>
>> // get reference to URI map
>> Map uriMap = URIConverter.URI_MAP;
>>
>> // register the necessary pathmaps
>> uriMap.put(URI.createURI(UMLResource.LIBRARIES_PATHMAP),
>>
>> umlResourcesPluginURI.appendSegment("libraries").appendSegment( ""));
>>
>> uriMap.put(URI.createURI(UMLResource.METAMODELS_PATHMAP),
>>
>> umlResourcesPluginURI.appendSegment("metamodels").appendSegment( ""));
>>
>> uriMap.put(URI.createURI(UMLResource.PROFILES_PATHMAP),
>>
>> umlResourcesPluginURI.appendSegment("profiles").appendSegment( ""));
>>
>> // for a stand alone application, it is necessary to map the
>> // platform plugin URI scheme to the workspace location
>>
>> uriMap.put(URI.createURI("platform:/plugin/org.eclipse.uml2.uml/ "),
>> umlPluginURI);
>>
>> Map packageRegistry = resourceSet.getPackageRegistry();
>>
>> // register the Ecore package from org.eclipse.emf
>> packageRegistry.put(EcorePackage.eNS_URI, EcorePackage.eINSTANCE);
>>
>> // register the UML package from org.eclipse.uml2
>> packageRegistry.put(UMLPackage.eNS_URI, UMLPackage.eINSTANCE);
>>
>> // register known file extensions:
>> // - *.uml -> native Eclipse/UML2 resource
>> // - *.xmi -> OMG XMI UML2 resource
>> Map extensionToFactoryMap =
>> Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap( );
>> extensionToFactoryMap.put(UMLResource.FILE_EXTENSION,
>> UMLResource.Factory.INSTANCE);
>> extensionToFactoryMap.put(XMI2UMLResource.FILE_EXTENSION,
>> XMI2UMLResource.Factory.INSTANCE);
>>
>> Load resource:
>>
>> // load resource (if not already loaded)
>> resource = resourceSet.getResource(uri, true);
>>
>> // load any referenced models and profiles
>> EcoreUtil.resolveAll(resource);
>>
>> Define profile:
>>
>> Profile profile =
>> (Profile)EcoreUtil.getObjectByType(resource.getContents(),
>> UMLPackage.Literals.PROFILE);
>> profile.define();
>>
>> Save resource:
>>
>> resource.save(null);
>>
>>
>> For your reference, I attached the "raw" profile (only OMG XMI) before
>> calling define() and the resulting "defined" profile by using the UML
>> Editor UI and my stand-alone application.
>>
>> Any idea what could be wrong?
>>
>> Cheers, Peter
>>
>> Kenn Hussey wrote:
>>> Peter,
>>>
>>> You're right, the XMI extension elements are not meaningful from a "pure"
>>> OMG XMI perspective... but unfortunately, since the mapping from UML
>>> profiles to their CMOF counterparts is non-normative (i.e. it is not
>>> prescribed by the UML specification), it's the only way to capture
>>> information that is specific to the Eclipse UML2 implementation in a
>>> "standard" way. It should be easy to strip this information out (for
>>> example
>>> using a stylesheet) if you want to...
>>>
>>> Now, in order for UML2 to recognize steretype applications that are being
>>> "imported" from OMG XMI, it needs a couple of pieces of information,
>>> namely
>>> 1) where to find the metadata for the stereotype applications and 2)
>>> which
>>> version of the metadata is being used. The first is provided by the
>>> schemaLocation attribute and the second is provided by an annotation on
>>> the
>>> profile application. To successfully "import" a model and an applied
>>> profile
>>> from OMG XMI (assuming the XMI extensions are missing), I would expect
>>> that
>>> all you should need to do is the following:
>>>
>>> 1) "Import" the profile (i.e. open it using the UML editor or load it
>>> into a
>>> properly configured resource set).
>>> 2) Define and save the profile.
>>> 3) Add a schemaLocation attribute to the root element of the model which
>>> specifies where the (just defined) metadata for the profile can be found
>>> OR
>>> add a such a mapping to the URI converter in the resource set that is
>>> being
>>> used to load the model.
>>> 4) "Import" the model (i.e. open it using the UML editor or load it into
>>> a
>>> properly configured resource set).
>>> 5) Add an annotation to the profile application with source
>>> 'http://www.eclipse.org/uml2/2.0.0/UML' and a reference to the Ecore
>>> package
>>> defined in step 2 above, and save the model.
>>>
>>> To be honest, I haven't tried these steps myself, so please let me know
>>> if
>>> you run into problems.
>>>
>>> Kenn
>>>
>>> "Peter Ellsiepen" <peter.ellsiepen@vega.de> wrote in message
>>> news:ete8ke$qia$1@utils.eclipse.org...
>>>> I'm trying to write a converter that takes models from MagicDraw 12.x
>>>> (UML 2.0/XMI 2.1) and produces models in OMG XMI 2.1 for UML 2.1.1
>>>> format that can be read into Eclipse/UML2 2.x. [Note that I cannot use
>>>> MagicDraw's EMF XMI v1.x exporter for various reasons (it only supports
>>>> Eclipse/UML2 1.x, it requires the MagicDraw runtime and it re-writes all
>>>> xmi:id's such that I cannot trace back to my original model - only to
>>>> name a few).]
>>>>
>>>> Converting the model itself is fairly straightforward since I "only"
>>>> need to translate the differences from UML 2.0 to UML 2.1.1. However,
>>>> I'm having a hard time converting profiles and applied stereotypes in
>>>> the models.
>>>>
>>>> To do this I need to understand the exact mechanism for applying
>>>> profiles in OMG XMI files such that Eclipse/UML2 understands it and can
>>>> read the UML models *together* with the applied profiles. Note that I'm
>>>> fairly into XMI (since version 1.0) and UML (since version 1.2) and all
>>>> the different versions (XMI vs. MOF vs. UML vs. Eclipse/UML2 etc.), so I
>>>> think I understand all the issues about metamodels, profiles and so on.
>>>> Here is my problem:
>>>>
>>>> Following, the article at
>>>> http://www.eclipse.org/modeling/mdt/uml2/docs/articles/Intro duction_to_UML2_Profiles/article.html,
>>>> I managed to create a sample profile and model using the UML2 editor,
>>>> which largely resembles my original MagicDraw models in structure
>>>> (top-level XMI element and Data model, etc.). Then I saved both as OMG
>>>> XMI (by specifying the *.xmi extension in the Save As dialogue). Now my
>>>> problem is that even in the model stored as XMI the profile/stereotype
>>>> application only works if the Ecore extension "defining" the profile
>>>> exists at the beginning of the profile XMI file. Now obviously this is
>>>> specific to EMF/UML2 and should not be required when reading OMG XMI
>>>> models and profiles.
>>>>
>>>> Attached I put my hand-crafted model and profile (in *.xmi format). As I
>>>> said, I would like to get this modified in such a way that the profile
>>>> does not have the Ecore extensions anymore and the model does not need
>>>> to reference the "contents" element in the Ecore extension at the
>>>> beginning via "xsi:schemaLocation" (apparently the "schema" of the
>>>> profile [NB: I know XML Schema but could not find a similarity here.]).
>>>> And obviously the stripped model and profile should still load into
>>>> Eclipse/UML2 with the stereotype(s) correctly applied.
>>>>
>>>> Any help is greatly appreciated since I'm currently stuck.
>>>>
>>>> Cheers, Peter
>>
>
>
--------------090507010705050704000300
Content-Type: application/x-zip-compressed;
name="gen.zip"
Content-Transfer-Encoding: base64
Content-Disposition: inline;
filename="gen.zip"
UEsDBBQAAAAIAFp+kjbsVG0LYgMAAAQMAAAPAAAAZ2VuL015TW9kZWwueG1p rVbbbqMwEH3P
VyD2uWBjc1WSKmp2pUqtVKntat8sB5zEWsAI06b9+x0gIbeW0FX9EAU8c2bm +DDj8fVblhqv
otRS5RMTW8g0RB6rROarifn89OsqMK+no/FbJqM/97cGWOc6esnSibmuqiKy bR2vRcYtla0s
Va5sXYjYfr6/sx0LW9gcGbvVegJOryfEqD3P/fTeb7PZWBvS+DgIYfC5e2yg rmSuK57H4sz9
/v2hVEuZiiOQjK9knJR8Y8Uq26aj7c7WgmTPkWqfOfiwLyCe+pwiaxm1tncq 5lVzEpdBD9M0
9k/7f8V+/wfDDkM/Zw8LUXGGfcdDlDgMY4961MG+R5HPAhfTIGSOE7BY5ZXI K20c1S+jTij1
GU3rvUYZcxW/ZGDf5G6It0KVlSgnZle4AYowu43fndxqGLvFAU1F9yoRaRNI JhNTCMEwoi71
fIwQwYRh4lLiMWwaOc+A+TmvuGm8Si0XMpXV+8QsXhapjNvUalS1yUVyo7I6 uwa4ei/AsQ62
fWt28Xo5IkEQhA6jGAUhYaF7QMzB4nmugAWR/ExFDd5bxHQPMV6o5H06e6nW qowKkaZaikLk
1uimFDVc5Pg2xjbyDOxF1LNGT7JKRQT7bRHwb2w3GLvC7cPKu7cFj//yVZfe CSMP7e5ARqjv
uCFmBH49H1QTfkwJrPawQJhb/M/seg7SuJj8Tcq1Hpx64CM4RY9QFwRP0Kcp GfvsmwC4z/KD
/Huspb4TfDkxlzzVn3PSGM4Wuip5XA0zjiv5Knam9nAGb7fd8xEasVzKthP1 xRrEteciH2Ti
Yg/0D2oZxPUula/SfVxt2/9mRZFuiznV+5lBXzhjYMEuDesWih0fYxCX71wA 7Vc9rDGvExTJ
Nt2Pi+gPsi7FsvkCv3FIHJNtn7O970Unumsbvt11/Pa5yynK2m8NNCjKR5gX QtXlDmTfdwm0
o9DFBFHmBP4F9ndrwbVg+7Df2UAOVtwFeOJwv/J3w+/shhDNJV+VPLvNl2pg 4RgeKQvCwPEw
pESHpNRUvQ01AJ9Q5joBpdDuySVZN6sZXyAFlsAUg1vD4RQLhgCAPrpW9N8g 7VyFr6sbrB3v
B5rr2t8XFef5yIUP3SOEoAAa3CDiW+Y/7LiXwn2ln3ZrdzNuZNfcucb29k4/ /QdQSwMEFAAA
AAgAaEeTNq7CMJLaBAAAgBkAACMAAABnZW4vTXlQcm9maWxlLk15UHJvZmls ZS5wcm9maWxl
Lnhtad1Z227jNhB9L9B/ELTPse43w+ki7XqLAMk23SSL9omgZdohKolaUYrj v9+hZMm62ZYd
J2iLPNgROTNnzsyhhsnk40sYSM8k4ZRFl7I2UmWJRD6b02h5KT8+fL5w5Y+/ /PzTJAuD8V3C
FjQg0ktIx5WJPtJkeBJEfAzPL+WnNI3HisL9JxLiEQuXI5YsFR4TX/nr9lqp b+fb7avVarQy
8q26qmqw9eY+93BBI57iyCelFfFZQhp2xA9ozEluTMKFcKArU7GttAHwe4E9 3t4IYDk0TsfF
lhvm4zRPcYiltAMQhNZhhzpSxV45547OL2Wk6UidXt3NSIqR5ui2aho60jTb tE1dc2xTdZBr
aabrIV13ZSnCIWR9u97UQJZCMAzZnARfyYIkUDNYRgVEBBARBEcCIoKwCDzD Dw1jlqQylFOS
JgLI9CUlkSijRMS3OUmGEpv7AC/kKopYmvPE89zSdQxA8iKNp9vFWuLEfHxg f1ifpvPM+3bj
r/D31d+/X8kSZ1ni765si8gNAIDgswiwpz3h77D/D16SU0lHpece9iP++PW6 wrppDa5UOxRE
jDj4s5Omogrbu4Qs6EvdYZWO4PS3AHNOFxQk1k0qX2zTmXXpLCCH662z+xT6 hAln9XDnaoUt
/BNb4uK1LSElpRL4oVK7tu3YyDAd0xOl9mSlyYjSoKS5Ru7TJPPTLMHBZ4Lh k/SkWYmylWXc
0/hFpWaYE7QtliyxBIpAwHCBAw5+ArYiya8si+CR1mX9AcLv7JYnoGYgjR8U pYaizUtP8iew
c5WmCZ1laYcdsosdv4L0gJdn4uYTTrFYOUBPs92Bnul1lB5JDKzXRP06scd7 xH69eVn+u6Ue
v6PUdUM3HAO5tu6pSDetd1P69/1KryoFr2iovr/h6SyNfZLo+wEd1+ZDOdul /+879V9Ogf8n
9U+UcsAopymlLqhiTOvpz0lczDXX+ThXyyyf0etrNXoHTYZS8Qmz/xdgnUMc cuhN2plUy1wK
V2S+AdSCeSsm1xb1e+dr0bAjmOY/IHXD/kRp8NCgZj4NSAjMtqJWPA4cCeHw MFUTjg3Dc+H0
sLSyHcX4Hc5IMo0GunBcTVUNcGFIQ7ZbhqEaIqJe8clWEaQVzXelBEvHZbWF VGZFSl8oXNfe
INIz5XRGA5quL+U4oc9YCLeAcChQ8+yV8HKZkOXmWuUzKBynwhkkB013xTnz 6Wb1kOd2YfAr
jLeSzOKYJN9wkLUb9gZwgrofo4CG8HX+BedqP45yTXM9z4KQ1raRnkUwcW5t z5RJfqDtQQFH
EFmKGfGY4LrlWp6ot1kFL0NOlLK7msoqZfQm2rI9y4EutA3XEqjsE7RVuDA0 0/Rckd8BbRXb
oeh6zoPzFtpqQ+rTVv4yOIfAuveY8ymsW54jFNYxfnuFFSHhsWVCr9vquyqs CG7qrmU6kK/3
Jgqrd8wgWD3tMeSvAoUcqhmtPWAkDAqYrgdi6Ipu1323VwTn6bm0OQGKNPpm 5GEDSM/teFPd
irJXEKnVE3MMz7Ycw7ZhFjBM07R0IHLHlbhBXzYLqL+fgLtEyIw+k54heBgR pUb2svA+nd6d
NA7fiE+pzqF3bG1uG3DZe23H75ljztrx+6+Gb9v8tu3ZcKx7mqdbyKtOsMZ9 8D/U+hMl2/4j
BX7/AVBLAwQUAAAACABvR5M2oQHf1a4JAAAPPgAAPwAAAGdlbi9VTUxfY29t cGxldGVuZXNz
X2NvbnN0cmFpbnRzLlZhbGlkYXRpb25fUHJvZmlsZS5wcm9maWxlLnhtae1b W2/jNhZ+X2D/
g+ACrfMQm6JEiUqTFEbq2Qk2UweTzqB9IhSJdrTRxZXkxAH64/eQuvgiy1GU uMpst1NkJjR1
eM53Lt8hKZ/+tAx85YHHiReFZz11gHoKD53I9cLZWe/Lrx+Oae+n83/+43QR +CfXcTT1fK4s
A++kfAQP1B6M+GFyAuNnvbs0nZ8Mh4lzxwN7EAWzQRTPhsmcO8PfPl0O16cn q+mPj4+DR01O
xQipMPXqRko49sIktUOHF09xJ4r5xnPc8b15wuXDPJgKAXg4FtOKZ0D5vYp9 +XQlFJOqJd5J
NuUqcuxUmtjkSaVGIVgawww0QGJuT2LnuWc9pqqMsKmJkWZQ+IVYBFuGibBK GNZUjZoMtAnt
AGz9avueK3VRchf0lICndhC53P/MpzwGl8E8lmnIQEMGazOhIYNVGWYq/PGC eRSnPfCmopwK
PcbLlIfCiwoX/3J53BRXKQOk8FEYRqlULZGmpU9zUET66GS8+nDN7ruP1u2I k5/H7sL6euU8
2n88/v6vUU9JokXs1Dt2C8dcAVDBiULQPd2x/LXt3Nsz/jLMWSGvCn6JfZh8 +XxZaprHRTKs
zBxmxk62jR0iIeM65lNvuWuBYQHvcB3fzG/DDcdlY/PM0Evp3zUcZM6uf7YG RaNQUbK/oRb8
AlgksA5vhmIZIJkA7uZqbCn3SQRwT7kDJJplmQiDAeT0dwzlKJ0ON6zfAMQd +zwAX+6GZD0u
MEOMTi2ELbBeNTSdaCY2iYGZRQgywGCNFgEByihOFMx9Dk7gSQK/QImKbU8E TWF39Bhy9/PC
37b4opy7d3kDIwsbyGJURxgRRigulhey2DSK2dyOYSDlcU+RMbtMG1uyyh6p 50UU7IApH31G
T/iFaCrTTBNj0NOComVnMVvC39jCUi1Q7DZyn85vwPne9EkpTVWEeokC5ivR nMcyMU6Hcm5p
0nDdpo06kSFfFxYXvp0krYJxUqhSZi6sl0jdvYxDtpaazO0/Fny8nMcQP5vl cRdS2NIQQkxX
qYl0QErbQMq3w9kC4vl8cnEFBfJ0WA5swymBuS6wPD4HGEe+3w//DAeuF3Nn B5rFo9/76Y/n
NZ+VEn8uhPzbC92Tk5ini7hOIBQG3+NJzacQQDWfCBAHkeNfJl+AsKbCnf2j o0oMbKBfltMy
K98qTTUd6p5lMIhhnVjMUFGRpuKnTNMyTrtMU6GnBuNUxVgVeuKmabrDwopP yvhPlOQuWviu
csslDO7/fG4WwOqEqoQAPGrL3BRwtci9H37oJvQ1pJoQGEgDyteIZTFNL0Pf Ec4CDXgsE2DV
wHcV/xpwlGkgSVOWpjHNQM3Cf6eVFR9c5gaW0X9nP3BlhYKSe+Q9pEOh6816 kBwiNQA6qqlU
15iKoDkA5PSWmdGvJwPJA4JsJtP+OFwEeapfeUBGtl+hhWbcs3LcseChcTBP n/pdMQw0VFg3
Zf3VLAPI3ywbwWDhpx4Y4njpk0w0UDtyvM65BrbviGLKNMuEYWhXmraEu2yt eKdoCdet7z6t
RmvQHyCZABrYa1HgX6AbZAIyRstkSrg/HQQ8uOXxONyuR8WkojOs+bhf17TV jP9ZJ6c+scOB
Hz3yGLbGi+e7vbIaxG0WWszntQt1lfVQPlWKCYKqaRBo+SGnKn2lkwVrd3kO /xvUJMxUYe+m
gY5WwzzfZV3FMTIX+TtsKLMnD5HkgIulWVQHxqSEUsClLWV+Y80khAGlCPYm zNKhoTYhpMwi
3m9EOCUsWqSzyAtnXQY8RZiKfThswg2sMlNrvInaYV6V2IQYxUuURy+FmE+V wmQFAAwTT+6v
Bt3H/1ceA/6HSYACJ5UiSxQW2jL++33Jc+vtoYS3jjnsWios5IySX8GmXMog WdwGtnMH8FY4
441WiPkM0Do+95K8//z+u+Xox1qGq5h7nfCFGyX7jG4uDLI4zA52riEg0/LG 4SjTSv6oN3AP
+1bdVLvUq4344IW2vzcK6vuHNvDuAWTL5evCBvewwNnaSHaUxpdeKgF5qeot lgrT+OkvWgu2
aQG4Ja0jqzdcyuV8/tFL0ije3i4cYLHkzvahgc3XOxL/rTJF/ti/BS1Kf/cb UI0CkyINtvHE
shAhDKhvi5q90ImCTqk5VxK2R6qOYY9k6M2IeadxFWdUiLkw+G9DzCt8sWEY sP+EVrUlM/u8
rqzc14yf1IxvJV3NrLOWOV3zmBfK7O3/v8FowIDNhdU3GC+2dk+3cdBl75s6 qhaVPW3SfZVi
vBAKj113RFO7yA5J7Ql/l7CiUSk5bz/TFbW0c6bTCQLywCYCMlAxMQlTDWpU Tl1sBxi9M6Zb
U9KiSIdNKChJG5FdjX0Vh4yEge/w2EXqdQByW8NFxwbFusDFbMlu39y5i0Yt LMKImJaJLAZD
RcSX19bZYSP0swFgKV+b6Sj4QV3T0ogQTqkFQcxgqUaxv9vQihsuwEglt3Lj Kq/EQhE3Q7Pw
PeTDp9wbb58RgJauYks3KAOsdaQCWu0PYupZLeYO9x74+AFgWetPcsMmjrOI JRtvXFUeDXgx
v9GdQD1jZ43c65UQ80UvAcEjpTTjvcPBks9f6TMow/e5FuWvKzu6qRKTMqi6 kNLMwNXrDTtN
Y+92kXZabwo9iaGJooEbH/juMLDKtIWF75Btr2MRNOnTYcpLgY5mEg0ZgE7b l2b6a1fezwX3
8xVh34sG4IB4Y+9wGYp3DOTmoXpPWDz2TA341roF8BbSwWGYEqyqENzlLQ10 Z94DbEjeyU0N
MSwiLtJ0ohKDmarRNG93WFjN28zWp+pFDXdn2w7tIHcL/X6J3AO1B1AO5dtU 0FLphgX4ts3f
l9wMyPN7YdOLN9YVUQVC5YurbyP2Mpwv0msvfL2kGx66N9Bo2v4oqzCvljhy HD5PZUOQi2xX
s/oNjqYba5e3KuMldxapfetz6YfBHZRof+/bVy9dITd5AMqDi9YFd9QCaZRA mRFvT2jY0iCV
dIJ31NJ3cbSeK6ojSzNBz+Zn61ULn6+l5dn636OWrlCigKxpAEptT9ZfUksv s8PDtyl7B6qm
1Yr1apETmf6HqdAty2mD88/Gym0VOy/cqnWvlDu5/Q930qxEy6+Icpd84Evh JVjvY1a0J9Nx
MXK5vX5HtRYSCyoQdIJM1SxdbObKL1YmEK08EgKZ+D5l16/UEQrbTHESaRDL IpgRs+F76rtM
rLjzpjRWCRZJmh1tCbOzV9W7L7YrBQ9RagGj/PU6g2LYIIjDrZalViZGmQJC nQKLyVSkyrGY
AbnSf+kbseFGjSm/5TkO3aOjV9+QlN+ULJSF0VMBfvG9bvj9v1BLAwQUAAAA CABvR5M2QtLc
SQUFAAD0FwAAJAAAAGdlbi9VTUxfY29tcGxldGVuZXNzX2NvbnN0cmFpbnRz LnhtadVYbW/b
NhD+3l9B6OtQm68iZdQtgqYdAtRNsaTdvhGyTDvc9AaRttN/v6PkuHXcNoKt rZsQA5Gse3i8
5567o1+8ui9ytDGNs1U5jcgIR8iUWbWw5Woafbx9+1xFr14+e3Ff2MkfsysE b5dusi7yaXTn
fT0Zj112Z4p0VBWrUdWsxq422fjj7N2YjsiIRM/Qw9VZAs4PLWGNYHls577Y bbfb0Za1NhRj
Ajbvblqo57Z0Pi0zc2T+Kc3tIvWwR/2hqZY2NwdoRbqy2aJJt6OsKnZ+ufGx 0Qjc/xrb2Un3
8rsqa1+cRgdL28k+soeb8rYw4GpRT6NZVaK3Zo5IgoiacD6hHP06u/0F0wnG CDYoo5fBsKXg
ssrWhSl9u1i7wJv7umq8aQAobOISNoEg/NHBl5/2/AY3xh0ekDiZVQuTt6/a xTQyxmiCueCx
JBgzwjRhgrNYkwiVaQExu0x9GqGNdXZuc+s/T6N6Pc9t1rkYUOs0+ytdmcWb 3ARHW2z/uQbb
sN6H7ttov+Q+8hq+1oG9RdosdN3FW280Boa/Ctzh1TkF20U3O0u0Y+q7Jt/w fReP8T4g3f0x
/ZPN/tFv69zsN6EJ1VirZYJpQjQhMWOYSMUoUZrF8DDRjH9/F4+ueeqMfl1B KjepLf334CWm
mGnKmGjhcV/4dD5vzMbu0vUKlnmdu+WVuzTLvhCmaapmZpwDKjuIIDqH3F21 zhfoLt0YlOWp
c3ZpTYOCsMN/i1HfBZwB3bQUtUs9MHQWI0oIyGmRaK4SSYXmsejrTh9GOnjO NNCBRYCnfeEP
GYFM9ldldtuUri/AIR8BwCDr0NZ6IMQjC/W8gHqOwP3S2bCMO4GKbdqUgDIE GRz+JBFSaS4l
YUrHlPV1qAcZX+AlZjJhAH+iPC588744QxsX3jd2vvZfxDE3bdU6RQsDEgDp ynGspNBUQS2J
NRcDq2EHz2jCGAH4E9VwkQUxvFms+po/in/m7QaCd1Ca9nowi5VxE5RVpW+q HC3zautQ1aBq
/qfJfHf/c3lqMxk6MdVMEgIPYzK4UOAO+MeUQ22MyYlCua7P0sl1bZoWaQid DNYzuFCE44RJ
zRJCJNEiHjT6goM6BBEwZiVcAXrvGeEw+LPQwt9WzY1v+gI8bhmmMVUY01Cx dr6TSWF82rXx
n8pBLJTCioZWgankWvav5X046ODhecJBC1JLIvvCH/ft67UfsG/DZ1X9l/o2 F5hwSqEgQcaC
JBJNYpX09ehpNr7CF4QKaB+AH/fFP2ocZ1UksK+af7ca3ayt/1H0CVVQj7hg WnElEwrRYb2T
tQv/7vz17WrEJJUiBiXAKBtDsWOql9tPCpjCh8dKt8UUcBXv6/TTKRPgcUJj nEBQ4EQkAP7E
UeNDU9zWZ2TMTXvM+YzqtIFUgYqKQkF1aBkmiof+9o8m0FNMiIQwLBXRDKiI sRZy2HaWEMpl
O0ywJOYAfyITs9wPwEOxzr2t4YAf5r9AwoVzVWZPpWG4MhqaDudJmCsIlxz4 kFj1dagPEbFg
GMMADsO9oCTA9y4TR0UUWtqw0/e+q/0vpm8Yz6ATaSU5gVPqD36KenT1oglO RooKrANjmAN8
78nmkCaY/s7qda/DkDfIEXW4WhXDfBEnimuCVSzhCM+GPKACvEoop9CNZCKh ecCjvvCPY5/P
3Op3GNmu674Ij6Kf5jkM2+3doVIemgYKP6WtyvMYeTHe/Yb/8m9QSwMEFAAA AAgAb0eTNt/b
Pl21CAAAoi8AAD4AAABnZW4vVU1MX2NvcnJlY3RuZXNzX2NvbnN0cmFpbnRz LlZhbGlkYXRp
b25fUHJvZmlsZS5wcm9maWxlLnhtad1aa2/jthL9foH+B8EFWgdobJISJdKb pMjNpkXQpLvd
F3o/EYpNx8TVw5XktVPsj+9QsmTZMg3ZSerFYoGsLZHUzJmZMw/57OdFGFif ZZKqODrv4B7q
WDIaxiMVPZx3Pn745ZR1fr747j9nszAYvE3isQqktQjVoNpCergDV4IoHcD1 884ky6aDfj8d
TmTo9+LwoRcnD/10Kof9P+9u+vXl6Wr5fD7vze18KUEIw9Lb9/kJpypKMz8a ynKXHMaJXNsn
h4GapjLfLMOxPoD0r/Wycg8Iv1Owj3e3WrBctFQNiiW38dDPchXb7LQMAsGj CaxAPaTXdnLs
1Oi8IzAWVIw9gmyXwRfKKeGuhwimgtjYZp4AaSI/BF0/+YEa5bJYSxN0rFBm fhiPZPBOjmUC
JoN1opBQgIQCni20hAKeKojA8E+F0zjJOmBNyzrTclwvMhlpK1pSfxrJpC2u +RlwiryMojjL
RUtz1bLHKQiS22hwvbpZ03ty++HKkfT19WjGP90O5/5f8//9etmx0niWDM2G 3cBxKQCIMIwj
kD3b8vi3/vD//oPcD3NRntcEv8I+Sj++u6kkXfpF2m+s7BfKvtlUto/0GW8T OVaLbQ/ol/D2
6/gWduuvGa64Ni0UvcntW8Mhj9n6vRoUrVzFKv4HLvgdsEjhObIdipWDFAfI 0VKMDeHutAN3
rAkg0S7KtBv0IKa/F2iJ0ll/Tfs1QEbXgQzBltshqfsFEUiwMUeEg/bYtR3H 1Rq5VHAHew4S
tsdKhwBhLHCwRA6zSKYpfAaGSnylfaZUO55HcvRuFmwqfFWt3fV0zAFL5DHA mXuM28ImTvn0
0F+Ai4KuqcqkCGdBpqaBGqrsUfNF7ryLrLVKqzDKJb6Kwy14La/ulthG2Pa4 KzyXIxcOZ27H
8gvnrezQWtdKLBDsPh49Xtz5C6uuqwWcVaKQ81c0slRq4bN+vrzSql9Xa40z CjOYXOQq8NP0
IMeEGJ7KJHusghgep5eqsSrSycaT3kz9v2byejFNwJfWmXIbVgS7EHeCU8pd AljRNawCP3qY
gWtfvLm6Ba4861cXNgENZLaBVXknngKqclDqYVh1brgOsMVDlSvaC2V4L5Pr aHR64UeP3emX
qWHTD0H26sJwL5XB+MRwT0U/fL94/Qr+XL7qgqvt1KgXD4Ob9CNkubG2e/dk tdePRru3qvSq
DLk2u8yizKYAKhD+rClOTZ7VJ6DPQMnUcFo3P25PC+FNNM/6a/5Z5Z6Kw56J 1DAllGPqCocQ
CpkDckVJalEsoJ6ZxCMxjhPh3+vjhpnQHrgsH45GbJhhrvlJQPVDNbFhuyWx bdO3YY3fY6vQ
3ALNrcul5tabUvPjE1olyoswGqa2QxyCgcqQzR0AiRzIaCot0TOxxc5YKqxw Csdch9PssXus
KAFf4ZBBifA45ESbVWVHFQwCiEcMtT1BGrkKlyMGCSGuC+ZDQptTBwlHLYOk qW7DMjdjy8+s
QPppBmlfWhUQOuOXyltL61rZBBav0Kmv+dZjCawAVRjiwrGxhxxAkx8nljSu iU5wl+kHUKV7
VZnjpGc8+l8LMIQcYHVPuDbBDGooXIUYdGG+Pm+VeIRKBRggeTxmcCGHIhcE JowRjwNTts1A
21RtGKvyydSKx1YJAVTbEG730tLaNy19hNh5DZJpb3qZ0EEO4h5mgkECIgww PjQN5bhUmJ5e
QFq/DIJu/CUG1/9Du9Ke9VqWzOTRkpHnMkoREpS4CHPwwKoPBT4eC/DBryL9 eEznEVtQhigD
MXnrCNmiYMMCt6CqlU7iWTCy4EwdFV9PSllx68sEhuc5nNuewMyBKlZz0IGB oVKN40H5xNxP
rbLJqmc6VqxQwsCHwMM5Bpw8p9bcqGgCLJqPscU4iUOho+eYAUOZh6njCsYp OL3XdlbT1LFh
kSs/yoNkqbLlj0b5iMYPiqoMSjSNgOXrim7THb7B+KG251AbvnHgGQqYHTqx eZBQVPlBlVF2
BYWOtJNjR4SNkM2oDQ6GPQ9jnifVZUykKnoIZG2QOVfZ5KuZZq4kt7nnUVTM X9tEyFadGwaC
jiZUUWOgmU3k1qHmTxBQVgx3k/pt6GsSSERBEM/l5iDqm4ujFa7cpsgmeRF8 WByZJ59+lgwM
t/7rP3TLiahpGmkciWZZou5nmTzVw0xp7Km6vuHGl73TIlhrWgRWY8xo2mEc ZtbOqo1B24xk
AU/DqlPTtFcuVJqlXZPCzwZQ1NNhY5jE7g3R8rQ9/aIxiK0w3FkMPQnfVP0t jQoaBT1O/sCE
uy7RxTl3PYawsB1e5Q/4K5YZUf1dtK8yK688JXO8IEX+uibve5m9BFMCaoxz wrBgjku5I4Av
D2TKdXx7VQHipyB79+R0tzfplzpGjzpybeJgrOtfh+khGcEOFdixq4I9/w1A 6QRCFl7wFJ96
UjXiUE4c7jLH1sNxqCcFAYlblSMGNRvmeF/0ttDX6vlqTXlrqXz+cqLwl/rr 7t7xy45GaDx/
SGkUKcb6tSvj2GFco3hoF7yjbC/3PD0flSed/1jI8+PeJ+x4mTqPoHZfRVnz PeZBWa1xbNNn
Sr45P1Y+Yox7lLpEgCt4DOKQeSVlwFaZjH3d3ks/m4FTiensHkr7o9EGiAvO ivRPMqiDGTgv
4aQVa2xXtGEx6EHzjqVUGDr+/HsFRTkyA1opsDg+W9yUsr0ATWjAkcOhYBEE Ew+jJ8zKcmAu
V33DsuU3xI5pqGYqi8e9zypV9yqAvvP8U/XxNxWNBoOtpip37k9FhnG4sdXx n022f4UVCEHI
hczK4Dp8cRgTmFbvk/KuYH2qkV86FinUpSWexwlcdFu9qTXo2TDCrVZvfbDx WfdYNS7IEdCv
aSMr//nKltVfQV1xVxNqefbzc0YdVWBoKPMA1UPf2XZ3lRbmZnf/kN7xnF0/ bzqsLuh2d7XW
u3qMXBbTQ2PTiQf9pOoUN7Rrxz7Vj1dL/4WrZ9oHy5/aw/d/AFBLAwQUAAAA CABvR5M2I3Dh
V0kFAACsFQAAIwAAAGdlbi9VTUxfY29ycmVjdG5lc3NfY29uc3RyYWludHMu eG1pxVjBbts4
EL33Kwgd9rKtTVKiSHnrFkXSFgbspLtpi70RtETFxEqiVqKddL9+h7Lj2EnT CGqC6mZR8zic
x5k349dvr8sCbXTTGltNAzLCAdJVajNTXU6DL58/vBLB2zcvXl+XZvL3Yobg 66qdrMtiGqyc
qyfjcZuudKlGtrwc2eZy3NY6HX9ZzMd0REYkeIFunq0l4PzQEvbwlvft2lu7 q6ur0VXY2VCM
CdjMLzqoV6ZqnapSfc/8qypMphycUX5qbG4KfYRWqkuTZo26GqW23PnVju8b jcD9Q+zWTLYf
z23afTgNjrY2k31kjw/lTKnB1bKeBgtboQ96iUiCiJhEbEI4+rj4/DumE4wR HJAHb7xhR8Gp
Tdelrly3WbfB++vaNk43AOQPcQqHQBD+4Gjx655f78Z4iwckThY200X3qcmm gdZaEhyxKOYE
45CEkoQsCmNJAlSpEmJ2qpwK0Ma0ZmkK475Ng3q9LEy6ddGj1ir9R13q7H2h vaMdtvtWg63f
79N2NdhvuY+8hGXp2ctUk8l6G2+5kRgYPgjc8bN1Co6LLnaWaMfUgybf8X0X j/E+INvf9+mf
bPav/loXen8ISajEUuQJpgmRhMQhoUxwhmMqRcSxwJJy/qBLd56larU8sXCV G2Uq9wA8FTEm
TCYJiQE86guum8Y2C922wMI0OFEVqqxDplrpxjikssz406kCpYVqW92ivLEl UqjQKkd6y+mo
72ZquWz0xuwy48zOqpXJ53lf81ZvvFdAVOf1DU8/xwvGUcwwlglhDFMZkqSv O714AXhCBJdx
SInw8KIv/DEz57VuugO1yOYIzqZ8EqFy3Tq01OjfNURGtwOZOK9P3az9c/1w ltx5noOJhNKQ
Q5BkxBMWxzKkcV93+jCRUMIwF0SyhIskBPiBObJQ1xD2wpkaagXEAEHhBZWo baszkMoMtSu7
LjLPChnIxwnALQo3fbjQ3Xmeng+4tZwIqCtYRjgS/mUUsr7+PE5Ih8+iSEQy FJREzOMPZORi
H3BbaeBit62nYyc6uW3Q+cmcjvDtshuaLScA8L74leRAXUkSzHyyUEwwhRiy 3u48zo2Hj2Pa
VcWYC0xkGPWuisfUfF5pdKkrqF2Fz42ueLnbd+a/beNiqrtvWu32xc0btKDs A/m6ANOP1YX7
WPW1fxbGeJyA/jPJRZx44sQTZlMHL5hnjFHoAxKAH5hMcy/sN83arpT5lgB4 UEvvQTpU7+f5
rD2z7h2g9AV4FiIo3O0udSJMvSQnT5s6lCWeaMkTEJtQDNT7WY6U810WpICv avZG/30Gdb2Y
yY1ukGn3tLw8fH8rQj/J2nntCTsp2vyXEkehk4pBJ0CSoChh6HcliZ+OuEN4 +BEJIQkbSN3c
XgEBRy0CHHKtDzgpuk/cCtrtdV1/9+uBdAHyb4X740td97UfQtXF2rgfNg9U CBJFLJScx5GA
gTEOeyvIlq3dZPi9HIuiOOaYxjDtRIRHWIZc9HL7sdIgQFRFAi0JpC6HEtrb 5UfvlwcXCWcM
CgPF4G8I8L0nwOP79a4oOknMtXLrBkYyUE//GzbWTa7Sw4u2nWgH3qVZ5T7A Hp+WRV/7IXfp
EVJCjEPBQpb4eg30QOP+lMJ5C084JyCcIaV94e9V7BKYuDsaeGa240E3SXcT AhRt8hJUFVlY
bQ6XoZo3ULILXyCygbQtTAXDAzmz527lJ4m+KM9AHoEWn0UcMjWCtgeaH8qf NKcIA7UlLJYR
yG4Mkh72loQ7ObUTyQOdTXf/hazUBuZs7VY2Q5nO/VwxkJgzu3Cr2c/q6Ovx 7r/XN/8DUEsD
BBQAAAAIAGxHkzbRufGUlhAAALSMAAA2AAAAZ2VuL1VNTF9TdGFuZGFyZF9Q cm9maWxlLkRT
TF9DdXN0b21pemF0aW9uLnByb2ZpbGUueG1p7V1Zc9tGEn7fqv0PLOVtqyLO fbiU3XISJaVE
kl0+9niagkhIwpokGB6SnV+/PSAIgsAMCcAApCj7YkoigO7pr78+5oDP/vF5 Ohk8hItlFM++
O8Gn6GQQzkbxOJrdfXfy8cNP36qTf/z9r385W08nr94u4ttoEg4+T6NX2S3k FJ/AXyaz5Sv4
+3cn96vV/NVwuBzdh9PgNJ7encaLu+FyHo6G/766GOYvX+4uf3x8PH2kyaUE IQyXXr5PnvBt
NFuugtko3N4VjuJFuHdfOJpE82WY3BxOb+0DyPDcXra9B5Q/qNjHq0urWKLa Mnq1ueQyHgWr
ZIhV7hx4FALRBK5Ap8hee5LYLhp/d2IwNtzchAhRhOEXTilGXHCJlSFEKPga C9BnFkxhtD++
vxz8sF6u4mn0e6LUyWAaroJpPA4n78LbcAGYwWVmo6IBFQ0IN1ZFA2INMfA4 E03n8WJ1AnAO
BmdWkfPPq3BmYRyE9qdxuKhq2OQZ8JTw9WwWrxKVlsnYVl/moEgC0qvz3Ze5 gd+9Wz3chfzH
8/Fa//Ny9Bj89vifn1+fDJbxejHyI1swZKoAqDCKZ6D7yiH+bTD6FNyFdY1u tk/MWb9g/Nny
47uLTNXUM5bD4oXDzWDfFAc7RPYRbxfhbfTZ8fhsbNbAP0yC5TK6jYBv5RGe z9bTomm/LZt2
M4w9IT8v4vX8Gv6+zItryy926jfzj/uSyer6x2CxpcXSgTsWADaTBDPAHWFJ DGX6ZLhvieGe
Kfa/Cy+jVbgIJh5M0m+Lo3J4fQpNPJuFI2uIwbv1BDAZtiFu7RN3ZePG4GIW raJgkjn1QzBZ
w5e4HeFeN4QsMg8XqwhGuRVJWhEZOZxmI/LN4ywcn0/C6YbVqVTajlQvqD+H s831qTzWjjwv
qsBmyNqZOL4n7myYjyTVI0zyZVGFaiHmOQaW/3YQWM5fv72BZJyLL0wJShSW 8Gkw5wRrU3K2
g9Hl/WqxHq3WgP5PYQCfoWOMWd4vDtHrkPb25U/x4kOwuAtXJ4N4AQCEcN8t +CA8ZhI/hovv
4/VsbKPAYD2fZ79+W44KX6Wj14m3Or5PQOlDx9er1SK6Wa9KOnq9fBHO4UkQ SxIP+wCufEzP
kvd+AA3KqvwYrAL7zcngHrysIjW+GQ7PYZyW+kUXc4y/RQN98sbbT+GXRzDI i7aKz7U/eekX
TOzwx+/CySZs3YPqx0zUhoN7NfWScBwtn0pZr7N52XgfjcMriL+rxEWOaDgO b4P1ZPVPmyLT
/AoxZ7F2JJiWnfH7OJ6Ewaxnb5x4OTrKp+qnzwgTP23m88mXD3F/CcGropcv qYrPwIpelizX
INQ6bi8s9uk39brjTbAMTVpsHtaviT6+qDL1ep2ddBoHi/H5Z9usQH92G92B jE1JWc+AXUeW
J0lzUy8Zluu7u3C5CsdJ1/X0LncocYzDWb9a+hxx5iXGvjl/jIK7RTCtresf 2gfdRvudXHiN
loP2T2kxNxnAYt54F83e38eL1Wi9ugpn67rGao8KoKM/stzHj7vZo3/dh7Pr ePUacm8UHu01
/mSVH5jRG/d+W0ejT9ZsX8ABodU+aroOwf7FS+H1Mhx/vLrMzxbWU7NrWJ+E wL94CTyPl8vo
ZhLaoLeobawmmHp19BJ4CgSMLqNZaOdMmiPbzbwmKO6lzN0ihvp5/PxmNH8n v/Y1o8mIFExj
ZLRWHD6IUD3NacIgvW6f9A2pK3055khNvNwXuX71enniLMdUGSThKK3+XGt2 zny1XVLoigG/
VpvZf3P7zCf6fyeXbdOCGFSmBdeaUSaR4toQxigihtLqtGgTuksvRexOgYwh zxEqB5M6gEpy
TpiSjFMDiAksTSkgdBa/Lr28erL4deWtvGbh4zX8cEyZF1lfXXlZBFaxw/iq YqWqdl7Mjk+6
JPmitpLPEss2o+OVl4DzlHvJhpjnGB6v285kxb0wGilCCUbaME0ZRE+Ilb1F xuvnV9lde1k2
b9yyPEuCfbWhvKQaxZP1dPZ/K1krvTk0xfF6eR2PnzzVNpuhajM+v/EvxBQy 2zOM0G96KmAl
IkRTiqhRQkkijOSkt0D9pv0Stk0Hent8AWXD/ufrRm+/elN0ZTei4EZSGk2V kEaKvjanwRi9
ubWxF1VVyRef33od++HF19Jnw+1e9/RPcF3OeZM/upzhbL7ZWn+RnCjIDS45 JpL/LmfsSocT
BptPGKHtQZcgJ3TUrO7DEtsxbB4RjlNFCuolm58LVj94tMOy7PTzdPKNQanV z4Z7498zyXaf
cUGq3dAbLoq0r7Yv3TUFV96/fxbb5c50qtAvvbyr2KmEhk8IEFIyxgyVJFOi uFN9EO6eXXlE
wy50JohrqQynAgsNOoutzu7t7s9Gb6zsdBT8phWXoDfa6p1fIXkabT0ZRBDN BHSN3FAoRziD
FMK2Shf22j+N3i4xoDClhioFFjZUqK3C2Tb9Z6MqPF4xYrhmDFvyZba9Tnf4 N9c0i1xbiKrE
rvegdBivkmS1p3jFne+u+LUftX6Ipw656V8PWUtTjJHUmBqBmP3AUBIPgk0K y8ZTT91ddryJ
x1/+fjZMPrb5Ma/v3hiy+qKYDrOapo7thNacmAx5+7j81v2HaBndRJNo9cXO SkQPMNic3qv9
iiOx5aZm3mS9ebC6nwY28dn8e3nx/bvX7y7O39vfTrNzhadw2zeb23a1xllS 7CQ1dEFA6tof
Z5NoCj+Or4OkFjkeTbRChCFNuSWnnZmHP2aHWP6Wl53UXQdkp5VRVTtzEEUV hC9hlENgCnUG
a0dga2G0AANQw4tgb7e8vkywFdNESbiwN7CV0EobjJ4CbEaZ0MSuDyrNbZpH WV3nOk5SG/K3
C4tE9BA6eopq1W2hr+jDIlJLARW8lJxD4LW031gkOz/yZzCDUpJRzo0AXkBP TkVWt7rPYNS2
yR8iGmAiNbLpu+toAPZWkmpqINMoCL5JJfgE8QBkIwbezwRkPWYT0RZ27+mb l4m8gH6NKINp
98inJofGRRMMJnelns6R55hoTrGt8SRB0jCeIb9/lKk23M7g54P9l+Ah2Lth eTqJbhbB4kvi
AzelJYGz/I4kNxbbdYRKVqCSaCKNgOgvBVhhh3+yK7cnPDRSgIfiGhnIz6CS ybKQ84RUbVAa
cjDXc/VFRMyELchai8A5gWoUIKK4FQhpXxElCGXGVgAUG1e13zXqGOpBobjt 97jiUu86rcJx
sxeMN0cEJ2GoLcAP2FphxpShVEvIvC6BPQBu935hbhhCXIgdzQuH914y4DJp drHuHnAFORaC
O4izHGNPADhXUNlhqYjRNt0jsE82E5U/DNkX3ulUVG9gE+h6GQR1V3XbJtjW zlpwkCiFxIiB
aq4M0jncGkYrENiFYyjwwctpxvD82VIX3AP4Jh5F+fnUwyKEnVEACagTT9kv v9s03N7UqeAM
ccWg81QY42QCNEuCB0+/1mZM601519yh8Im0aTNO5iUpZKMi5/B3pRGT4FDa 1f20Br1/GYcT
QWCknDDOMDCY70Kk4xRvbeQbMuAJciOTGgoU2RbiByxOQSS0/ZoRwcHinRZD B9TgFBpiAz/Y
HSAS51rQwqHovkDvedYBKwpXEddkcNuIK0YVBBVNMUNg605nHQ6ooTmSykDD qwloId1M3x2X
ro37Hy7MM0qx7Xt7YL3AdnnRxnkkIc7KTuccD6hBEWUasg7DGFxRUQft/0we AHAoxZ3Lf207
AFNYM8OEXd8Fy3faEvnU0Br+4UoaCs0ZY7seuHj6vzbyDWN+pnwvgDMLuCQc mdbWHA9YWtup
LiglMeNOeV2jLVEyakYMRkpA3y9ZhvfhNynURv/reV/egd5sutlpCwG9MBcM E6i0oepCttdB
u7qrm+lmLypYcsWBfERQbjMxy9b7yi9mqI1EQx72XHsJSZl0L8S3yUJrawmN FoX+hgpb5zJX
qm8N8kKbB5WePVxFKMRbDIEnt7TgeLlFbai/nnQ9J1spKcfEORlYAfWL2Sq8 CxdH7E2QgFrL
SEq4lrmwiztHG0KsVDBaDoFWM24/SLawV3w5R22w/xC8Vhpja/U2t28VTawx 4oiBiQklUEc5
ZbUGMYw4n0YghkAeJQhyKcFCEcisJAve3neb9IV1B7VUcfAcahkYtYREahdK ScO6uZlUDj8J
a/I6MTwaxbOCEhfTw/8nAJZUS2YnSAxjWkHXhun2Xdo9bJ91vWYldbHCW2jq +/MhmZJLaIW1
IApKE7k/d757VvPp85wUThkwGaR0M39eIkJr8eDAyGxyg3hkC387q0b2MPPY bSOs7IDO/duV
CuOL9D9LSb475OPCHiDUGupPCKscKhRm9yNu/68Vn1KlLfQHLdyILNk5o+OZ x77QgwsorQhw
BSISsdO303B6Ey7OZ9Xu4zAogo0eVLgWinYCZbvapx9I8o0Avqo1iK0yW9cJ tw8y1r/nhzm4
9SW/lOK7TwbB3d0ivEtpO4qnUKRE9lEwLsjDr/dJfVT7HQRB0zur5y1HMXhU DEQdrvc2l+M6
SauJSIqIQkmjUyAKuEY/FLFnPSF5KmU3GDKhDTSf1Uiyu5MRzZA9Jor8NNld DU5MCRT7XLdM
FJdCZaqUXoTShC3Og9at8MWNRzXGOO/tgjM5QUza6SspXJ1Uq6TZyYQSAagK Mks9W5+sYVhJ
YXdRQFoXNq9XZs32TgGNv53qxwdZk15t96YKuziE2mdNSaEDrNk7I9+UO6XT 5W1RxwFKZeqU
7+2IOqkgCBksQZT2QJ0MYs2wTpYYO6dOsT5M3iLEmN1vBaUigvaQFznjvwVD AWAbLWHJ4r+M
wEDtk0VjllRRoUyPmvW784VK9ThQzbrlxuv4TV/l9X4JQHhGrfnac3e/MCEI dFlY9OPmlZvZ
krcfuZNrDWwlkgwqXJ1rzZv7flWFmlDA++zSbEZdJlQHoJWZiGa8OCwIcq9t 5yVrkx2HRVJG
7Nk6+lQcce6XrEKRvb2cnEl7NshPEffOz1Yp4lSoTJHC/xHaiC+Ow/MtsMUN RSWyHNn12hpX
cnKoFnarBKZdk2UPVyEVApnt0qX4pipPCed+i3DqYAffvDysooV7ArrGTFG6 wgGXZrOiewSr
M4d6dNIkm2drPgN9VIZjyslq7Ubv+cw/HxiXRJpAkUBFUsRm0Sl7l2/tVajW l5d7sIIQGtu3
0RAiFUtOlGZWsKPocTEuMVp7C3GumJFbWOeC2T82XFmvvJ/CWlhqZhsJMLVP Yps458QLKpQC
R7f7J6G7ohiyMClvVz80ddGvv3896qXRQ5aCJKUFVTg5Md8M72ZSqdREmGTB uxrkjRKmd620
3AmWGux0q0XqSXvvc67vfJUmIZpnqJqtenuBqbvk5BgShbJGa7vxEAtusMIF kJrtj3iGTD0Q
n6k9d8m5JM5zzhXoenRbTGJpAR2mfbkMF3ZNV3V6nMglXxJMkH1fINYQmFUW mLM3Qe/BvL6Z
RKOXhLItlxFXyn24uQLK1ea/GLKbRg1HlNgjzGqXATrY4OadboZhE63tqpit BoDeGdq5N1o/
Aa2Lm4i7Tku1Vg/ddUr74DjWYZunqaNSnCuRfWerXiAtL2oVEN1bOusA1/JK YRe4Hlom6xvX
lu1HOORFY1/CxsF82VnnhxfUMRzOUEIrZd971CxDVW4Tra2pQPZ0qT1zAV4k edVyxEXls2EK
9m00sVf9D1BLAwQUAAAACABrR5M2JwCQEKEcAABvAgEANgAAAGdlbi9VTUxf U3RhbmRhcmRf
UHJvZmlsZS5NYWdpY0RyYXdfUHJvZmlsZS5wcm9maWxlLnhtaeRdWY8bR5J+ H2D+Q6EN7MNg
3J33oZVnoLE0thbySLBkYxeLRaGarO4mhpdZpFrtX78RWbzqSBaLzCLZ1otb 7q6siIyIL448
ol7+/ctoGH1OZ9lgMv7uil6Tqygd9yb9wfj+u6tfPv3zW3P197/9+U8vF6Ph iw+zyd1gmEZf
RoMX6yHsml7Bb4bj7AX8/rurh/l8+uLmJus9pKPkejK6v57M7m+yadq7+e+f 3t5sP55tHn98
fLx+5O5RRgiFR999dG/4djDO5sm4l65Gpb3JLC2MS3vDwTRL3eB0dIcvYDdv 8LHVGGB+J2O/
/PQOGXOsZYMX+SPvJr1k7qa4z8jIwxCQZvAEuSb47JWT3aD/3VV8mxLCCY0p 0ZxbwSXlnMZC
SGlIzK6icTKCaf6U3A96r2fJY7QU/lU0SufJaNJPhz+nd+kMlAWPxTlvMfAW A9UYeYuBXsxi
oBAPRtPJbH4Feoyil8jBmy/zdIz6i1L8Vz+d7StR9w54S/pqPJ7MnYAyN6n5 0xQYcdp58Wbz
x60Z35l7/e9Uvn7TX9hf3/Uek98e/+eHV1dRNlnMen6VliS4ZABY6E3GwPu8 hvyHpPfv5D7d
W9rx6lUVsa+lPs5++fntmselLWQ35Qdv8lm+L8/yhuArPszSu8GXmtevJ4WS /X6YZNngbgAI
q07tzXgxKsv026pM82ngyJ8Ay/guHJjOcp1skQtlEBv2DzOMYUVkbQ0jmq3w kME7bYx6Xaud
UiUYV0xarWIqNAe1c3V1U5TETUEUxb+l7wZzkN/Qo5PlX8uzqjH3XDX/kYym /1mmfxiNhY/G
X66iz8lwAf+iYSh5De1//29NihVIvbzZNuf9zdz9sUR+VGMiSztP7n+YTRbT SzTs0dEer2jY
G0+mrOFSS6GEiZW1Voq4ouedFv1xPlv05gtQ9D/TBH6mNfNaB5nytLxWd5tk aQyObZrO5k9X
0WQGMk9h2B1YG7xlOHlMZ/+YLMb9slkGtRWvqb4eJPezZPR2fDeBVOfjAtj8 BG/LlgMnVXVd
oFGNO/CWG19JDBECPKSiMqaSCKNjEtywXs3ns8HtYl42rLHXZX4/S50s+gkO 2t+ujubIa+qv
FvOHyayJl4rO0d6q5F8n8wT/chU9gG72NKhvbm7ewNwgW68oqGbOIYXiBVie cPQ6VZXPK028
IcJ5pSX223AU0inV+JYld2/HnwfZ4HYIkwe+JvimS3Q7kxokBHY7mlEmZAy5 mjQmFvR0EW3i
tWhnO2+G6QhKhHPZztRr2Z/ev34fv38cp7PnG8+mgZOkOsMikCvxmBGo/2zM mCkZ1hHM70BF
fzEdoi9Ms7Kool0FrM9Gp0FstMJJaDNYvvNAef62I7mBSUEJPQZxFhXuAXBZ xY6tHR4k//tK
L2X7uNmeUGCv5Iuzv3ljBuK+qunFdLrWNLnM1COkW/zNm5stsvR7wMSvg/Tx +frF32rwfoxf
NLe3hOkUl8EEMUJYajWDKAuMsw6KR59Rz7zBbEtrb1+39GPBrfstuNJ2pr2v YHz+feZF+yXk
rzMv2LJ0DonrJSJoFhZB/Qn8BPhIyCqsJdIqEVvJpTnl2kvmhc+900OujbvJ LNngb3+LOZq7
3Tb8frpahW7BU0grzrxW/CMMnQ0H438/82w6C2vzddm0VJBF21gbYYWqmP7h rM935H6Bc+n5
bjv9Y+TS8x21yR82l/Zq3Fs9PayQ/xNurDZl1Yd4S18qtPD68jVPn8CCXvXm g89VN951BnRQ
fr+vSHxqWniBWVSTRyZBteONFQXtNBnMRaopZExdeJHVT6fDyRN60uddiX0O vONSqsQUM1ba
WFktIJW0rKLLY32iz8I/e8FW1NzXWI193r3HeeZq7LMXcxBzMzftyUWWZI9h oVQoyYw2WotY
acIp72DX0mcqjxde9Dx6TbmfZoP78TLvea7e+TFwxVPyzlpZbmjMqSVWwi9F cLvyuecv3vRw
S29fo2/+ctErZV+8cMOhqyN5zxdvXwLjLT+tZ2lCGAIMPLlQmhmplQRfLqwx FV9+OPNPp1tj
ePoa1hievsY1Bp/DftrrMG5LjQf312cvGH/fFdcuOHf9PfBBha1z6RqyCyah DOSxYYaxU+4o
/L670jl7+vq7F1V4fN6tLFygsZCwhQ5ESYiGjBFG+hgjLVdcCYGnWiA/1UbF lJdPtXRnMmR3
aFtfwTiPwRCvQd9f7FYlCZtUFbcqmSFGx+BerDRx+OUln5XQi96qpBdetVOv FQ9G0zx3dPw9
8+qdhjX8ytqq4prZmHEBYIjt6Yp35jX+GvV9jUU8u+ginnnR10PXOp0vkuHz 3tRg3QJPGg7Z
bWyUJIbEJnxu4gMe9wKvqLmvEXP8ojHHvZibziZgZNnzBhzvFnCaQKBjsRTG KlynDr//4UOc
8CJuS29fI9zERcNNeOG2PIibZ5YXiCQRFkkjvJHfnyWPuLujjKKCUcYUlNuS QgijMjiSfAYj
d19h8xxQOo25SK8xf3z9+uPiNnvK5uno+bpnuWMl+wCjqjk4qTAZsiZWilhG YkV5cMPyuWjp
XUPLVpr7Oc1nmzUZWNd++qD16WMFpLzIWwsI4kc6S3rOrv7QMvJ5JxV81e9o jnYvXX8/GU0n
4z022brymcoLu2Qxn/yQjnGNKe3/C371fB2nDrzSTQl4zs1SN9MMMlsuuOYx k1YaecK9Eb3b
5FFx/T03cruyMe1fJ4SC98fJsH+ZK946bBIHlhLLN68+3KbzZCvuSircVTeu LARcw+0prcfs
Tue2uzKdyXiM174fksy11XG+6QLNxwRO19B8tu3GUK4VkULSWBPwPgZ+6NNZ zu673od02NmX
JV+GZP27OWs7eY5ZkQdOlZMlNSdK6vT/cvI4TvuQeWBM2Job9lBc/nZLsFtH AIwRkhMrqIgt
NixjMRX0Kkpymusw811TP7uVlF/eTvpPf6v0EIxwWskAsAYYyMGbOehB0d+P BuNoM2KACe84
GUajtPeQjAfZKAN2+gCzURrdrQwIDbIfgSMovu/65Y1jIJfTtlDyX03zbPGt 605YktOH7b9t
SWuvRodR/hMMAU0yAzrp/jLLx6b9JQclvpb1d8EqdzaGRJdz/WU0/GZ9gu3l TWHiBVmsVFyi
WggTa1ns1+Ou5vhRTS/A3GaXfd/81KuN4eqYEBS9pY4tsEOwh5RdcZG3vYvS zRv3nsdNl5wK
yDSx25UiK07/coFcKmkN48AlXXGJjfcOZ3NtiSuz28cWq801KySp0oRRLa2K OVdUGcjl9Yrl
Prh2fNv6hGUDvU0oWBFMU1zxFlIoTYEmSEQbwamKFV8RGU62gkAAAtxIrgRM Y0XgbjhJ5iEp
GGEgx4jVGrD9yeJ2mIYkYanmlIMVrauDcdApMGEVJEkbDH2eDPohCVCYgWHx xp3cTibDNNlq
aNoq9K5PyAhCrSSSMhpbaZlQ2IC3GnV3MbSdTbigt2QtQvpbcdA9UI2FPiwG EZuwgA8wLbFe
z3rAKHmwYoqRlEhpibIW3Iow1MR0C+hBzZdrSTUI26y1/xSagCYSF2VXBCDl mR3jKtdp4Zbs
cGmjWqMyTgzVmiqr4QluDNiWEdjseXSL8bp5JJQm7v8sgZEq2oOOFFwwCApG FpMAoOabB/xp
76kUGVqJdJ0dxuuTm5HrfTcYDuZPuF04+OyaBubU9zvzGCX397P0fhkCe7jk lw3cUbLHMSSB
r7Js0husAmSzYLYVkBw+doN3dxv4V+yPWxLsMvzjsvI9ngpvI1qrIIcFQqa2 y+9LV3aFpqmV
lKjOTRW89GVgGCeECRMManFuODwFqXwLmDCs4nFPDyyHC9oAE0dHQv4CPp4L 0gVMSgxVYVLc
WdsNlT12m8JBpaKEFlApj+0MKk68QkAZokG8/CRQcTSVYhTgCR72vFChFmdu lQAzwKaH+0PF
jZSGUY5nJ0lTRMGnrRacCKBju4BKiaEqVApXWXchpfF6ZziUVOTfAiXlsZ2h xBGihHKmQbLs
JChxNKGyJRwKB05PgpLylpLUAhfZLKT+gsW6Co66ARyeJAaSp9hGu96K9Rwx sTkCCg3kqwio
2VLchYN9ttlaQ6FRyFUENA051vA9cgR3BXYIvwxp8B5aQlt3kIicxND9sQly ZuCFGSFjzlpl
TpDXgvflnIKn5I2ZE9IxVkiM790kTkV+qlj4tNUXuV3aVNMruDUK9tdAi4BQ HnssLnYL1xBI
fCEA8ROlTUhTKAKpKtA8c9rEMOZKDoUr5HBStsEJjhRcWosjdRNO8GlLgI6A p1UnQCkyVAVK
4YsYLZFS/kpEQJyUNdAGJ6Wx3eEECUE5rCQSsqfBiUsHJYjcAE3TPU7qdsWh oMpPmCtIGTXW
lQWA+IdgJUYIDJHRrsegVKVMwmPiUEjsw0IVC4UjD7tzp70OC7TDw36STg4Y dBQC/BSslMxw
oKCDmb6fmGSECAvEVPc2v7NyMRKEagUHh8qAmf1jgxspcKOfwkjTVFLj01Aa UQo/qD4UCI0k
NgxV8bBs7LwLCTtbIrez/0ZWt6XeIh6Uxx6FhmZCRGAPMigDgoGikSaFuVGg SW332PAfspMG
SirI+KnhWlfq6cZx0lKriCurG59VAqRMD6+uGwmsmKliYutMZWOE8NAon0Zs B5NG3jcKqMaK
PUceBZFGMlAYag7VcLjKu5GkoBCb2YkKcBmbXkIYLqDgISMjOUQtPMDhlhtR 4aWY4RtgtHH1
ULTrIa2sIWbrCFNLLDSTv7htiWYBV8JD45CjTL7+/VqSmFlIYFgsg5m6hxSH ClJzyVQsTmHi
OwISVXhxzhL4QQlrkx9RrWIpCZ6poEQ05UdIRygo8DDV5Ydb/94MVWFQuCa5 CwbNFwzbQqCF
AtqkSqWxR4KiQbScScuRkAqIjgaaGqYmDSasZ4YJ7kmCGRgLAlCtYKKgIjCE QkYLIxthgnSU
5ArmrLpBSZGfmoyprltNiw26SgeXgFgpa6ENVkpju8OKEzCU80DmREhBikoK jFxUnRkpUAPj
F46FhDDNaZtTUW4k08biWhltOhXlnuaQSymk08mpqBJDVajcty24S429wiGj IvUWyCiP7QwZ
jDMTGwl+wWLtchJsuMlpohXEbU7PfBSKWq5jq6zWkGny8jps40iMiQY9q2yK Ivg0NZirgBvu
AholfqrQWH/lfWfoWL+3/vvo4fBRkXwLfJTHdoaPXG1MKQp0wi3SNpJU3Fi8 VcPPvVYr0TmC
6lH5suaEx+6RXGmO9yakbYIHPm0ps2Br8O9O8FFkqIqPQoekFtlVtWtQQJCU 5d8GJKWx3YFE
4sFdqVGwKtySVOPcOEQtwdylo7OChOFiDGcAWQ25Sav8ihK82yMkZP5MN+ZX SEeAg1cMnu4m
vyoyVAVJ3ZfWWy5f1XyjPBxgKrpoAZjy2M4A46RMlaUKCZ0o63I0tcJdDn3u pEtDXivAd2J1
ZNsAxo1klBtIcqhtAkxOh3LBwC/bTgBTYqgm63rablvfhJTGjziEQ0pFCS2Q Uh7bGVKolpAX
GKjT8MbGaZDiJqc5l3gPxZ4ZKkxpB1smZcxNdeNj10g84AdKwmP0hjfFFqSj uLKSwtNHbIXs
zVAVKuW2sC1ysEqr1HA4qWigBU7KYzvDiZMtgxSUELxrexKcOJpYpzBIxcyZ N02Ywg0xrgma
b5s6hWmIixIyEYqSa6pTlmQUh5wafH4nMCkyVAuT9Sc+9l7nKn/YLSQ+ipJv BY/C0O7QgSK1
mhoGIrWnqVAcTWEMHsPj9swVCp5KiKVkuH/DaJso4kZqMEZLMM1pSrjwaS4g eII3op1EkRJD
dbeYil9MbRFFKl8RDYeSigZawKQ8tjOcUNzIh8krvIRGTxNF3OQghrgARs8d RagALhSV2sas
1f3x5UhI1zmMbCpM3NMWrA6yLdbN/fESQ1Wc/Aivd19gfv94yB2P8hfsw0Gl ooQWUCmP7Qwq
AA+84YFHhIHQaQoTNzljGBYm7Ox3yBmuJzAhDIuZbXUTilGDDYMEtowgjTeh HB1LKSabpJur
UEWGvKdUWscTYaF+ZHhAmGAvspAYKUu/DUZKY7vDiJMrBdfOQK4nugWFNJnC PStOznwJilqJ
XUIEfouO8XZ3x/EctLRWgXcRzXfHkQ7T7qA77+jueIGh2rvj+9QkmzfXf7Av HEIqwm+BkPLY
zhCSE6KSWRQrOwlCHE0hteYM748Hhcj2psCam43K63eUc1Na704XrHfPTlQV GkpJIcHJaStl
fTOqJrY28ne9pz49DLIoW08vyh4mi2E/uk2jZDodDtJ+NJ9EMIfIfa91gFYW PT4Meg+5SjP4
fdabDW7hX67Xp5t1Fk3uosn8IZ2VhmbXf/7TL9gT8m7i/rQcBAgotpcc4VGw KM3nBPxN097g
Dr+/i+/4a/QJ0JT2f80ZmCe3hY6Sa42X+mi53607mJYkv+mauq+xFY49rBpP FRuw1vqLVnD1
nQZwqirZTt7CN29AOU3mD6MEe1BiD8x3b//x86uf3775iP93PQJaTr7XMOyb NbcluKwFtfo1
3m4okXw7Sgr9/nZOhmDbAAvTgPrWrtAZDoz73EHNlbR9rXU1uXvXG2E4+N3p pUTvh8Ifd9O0
xhLQllCWE/BG2GZz+e7652u2DFfGvt+kbg41762AxTm80xjFbCy51paiZ8mF 9f0szUXimrbV
WvROq/wwG4wA+Z9dO98m6/yv5HNSGJBdDwe3s2T25Ey10DcufMwiQoMioGKX rpXcCSKWo0hB
oVLFsu4Qjg+LR+jard1rQvF4nKZcqU2kerWYP/jSnPZKbtUDt9KduRvlQmUP ZYs6zf07RxKC
L4Nf1l4B70C7rn+xkBybpDAmJdtoN9+r7X09aIZww7CBE3HdWU+icCBpoCI2 Iq49LhRK4bsL
xVLniO3UZP1VsWMzE38jhXCZyYrZJukdnZggTgWxmkD4O6oD8r6JSU3Qz5VU dwipGyMpnbja
NpLl3AIYiffYUTgjWTHbuZFIPAIJ2R3eLa40bO/ESKq9hnIlfdr0L+ogfRUE II3H5CDJFEyG
Tl+rszo0gS1cnMNmvVDuKgUQBmZQldviagp1bUryCl1sEkyxT7fQeLJZ1xXl jcyueYmWdfnH
XIxQ3356H71+Hw0H2dxVze6W1PLF1/s0kG4RyjvO2X4ZD5Fo2v9X4r64sT/4 wMaEkoTbWIsu
IzgS0ri3HWve6FNaGmyDsyw2RuvGIXvbhD1Hh4yTUMZyEWsW3CE3bXjk6tne PwntizEvMXhN
nOAHE1yL5aOcccOMDnXDlQNruZUxYvJrZxVB4cd+z1p4DArf+m10Wm1diEC7 BKsEnYlTFZro
taDc43gK6Gx1R2k/s5u6w7vFF86Dna7u4Hh4UiuDx0ZDe7Dd3Zdy3SybOB1o DlsUKKFMCg1e
Cv5LTbwuKPJbqzc5IZe+JJtPiLX2AgcqtBySOgA9JLXY31VpbI1yGtC7goTn aw51d79PAvpy
K7Jt0L+HNy3D3LGw9/fpCmclG3abJHg08FF1CgADFZCRoYG/15mmXE2lk1Kh MxiYHzboww+J
aAKphjBHJTB7zOvgJGbdmxmqXwJFPlecEUjHCVNq0+XoYSWvHZ0qujDNAxzY waUW+hPIXtyH
VGSX/gsJaUm5lPgBoibMBVAosKOMMFtZ6Vqfn9Iv81c9TBcPUOo5Kum2wobA H2OXTAZaPVV8
YtLVLrjhUrns3YV+AbCaG1y2qsfrwQo+HWpby5hjDsBdz7TTNBnOSWLnK7Ck So/hLtRK8dqT
4NgLqxa3Byj0HIg92CG7dQ78+AJ2Ju5Usxh6KX7zVFdudRyt2N1VXenUeDeL X94T1N1BvrMM
EoMnFYASit+2DJ1BNt4eyfVTupASOn3URAnIB2NQHZ7JoBorqyPyx6ZZHZw8 ll+MH2PFW3QS
T9JYXi+uP/wyGN4MtRJSjlicpjVZTlITg4vc8nwVcfGmWCfLYP6LU+F82emW wfAkK2RuCr+5
HdqX7b4rmutm+95pJzZRvlzb0SqJ99ZpOKM45SKJBjQLQ8CHGhvaLPb40tvK aW8+HddBgFMU
G+FB7YIthrQ9boGkcU6hIpwh3ArIPIy12KybyBpp/eHjG37lAoINCEDWBZsu 4pvCBJ1xJCnO
Ft9K33PsJr55P3AYzpWdLr4pV8DhNyrDp+r79dbJdYRD1x17jndmRbIG2z5R pSBfV+h6YkmO
cmZ7Texgh1b7duAN24VK8Mtsa5W8ILZAPu2YxYbTwLzUYaqTktzfbSkczE9W kuOmjhTcfSAv
/PWWNT3P9cJ1/O00kS1fyOwokfVfUwxnFyfOZJWReEYw+DY/eDK59WVRaiGZ VCLfvrFcG/Bj
fF1w3A2GxbNKYY0DP3MPCBDMbfkVjONDPrEApoFEKAGU4Sfuu3EZK2bDGgbb /gCsklRi9MPd
RexKAml6aMvY3Q18+3jGoeZQOAACMfP/y7uW3LZhIHoVHSBFRfErtJuim657 AUGIncZAEgeW
naC373tUbEu2ZDsSqTTJ2haH5Hw4M+S8UakunNa8iFFtCp/gAQisv4XDqvLC dfnmSfhwQPsI
RFtpCteFQTCJn3AIjR/pROjHjQ8nJVOeCGCdylmdhCM8tOKfb5JR86ir+cZ2 hcOjgqMUBzz1
jFkpBSNHoLJRUcG5pQ0OCI6grzEmrJnUDoK393879uzDJzo0ZFUbZxVEdhrL RpKa6W2Q7KrE
ncSyHbTHiZPn6G0UE86sTZfn0P7BhzQ4/m1so3aMi7rL5TehViPYs5QSYa0T ko/y7bgC/3Or
CmXPtgOnUtf59M7t+gymDCdQRkZMg9pUVwPgoEfU0gmDM4kpO8RAjmLL+iGB 36Mto8qylTr7
g8a2ZR19NmoGPTYad0SwZI5ds7FgzRSoS/OQlux4TaFMGSTMKMIbGClggfew do3d+vCGjLlG
kxpjCj0VtgGjTTZ9Ja7XWxmyw246UQxZf3uZ92jIePkkjcWG6eBl6xf0Lq0Z 1OqG2pKMIUXX
NaXcEdVMOF5BE/r6TNF15/T2rPVl1D8STDS5xkxfAMiqXRH2+naeVPPV0wIm JimTur9xApPz
tJjx52WyWFf8fFV9w5/LdbKorvxXs8XNDbYOa3wu/3pgtE1FvDM/oh/mCnOf Jc+3S9BdLx+/
3M2fQPuFHRgH9Hbzqr+YHu7soKVuU/FOFEO8Su16G8yGU7t6qtGVjkhnvMUQ +2eFwXSu42Tu
aptd86fVjDu8ByFzSRgRmwuKheWjhBEexEULC+JFCC2ME8IqHGVCS9sIiKrt dv2eV8vNCtoe
ypMYc+UbwYWgJiuEgwaSOo0HQYo5wYgLG7Ne8YDROrcqh7FXzmWikSjYMZrL WJXXFPePzOvc
Oj6MtROl8EjSwkM3tujsAxaK26dDUpXB7YGuE6dZtUvSg91IeiJWOhaqSBmn JP3SG8kBu6cL
d12mGesJhJTCwRxiw8A1A2+/cVXoN+0ncYsfXvH2o2904yO5Ik6WYD/Lc/s1 /qT3OU+bycKG
L+Ql6ealsfWUlLSyyBCfcFO33Ck362V9dPsKo/v5yNO+i7RJswyKhBiQPeHM uIucS9Y2+Kzv
Glxbvicp+HYVYt0OHblhW8ZcKtl9BPJUCx5xUSS7NdGTwh1QCkWhjxUAi/QY MtLkDMJk3hBG
atWv5d1s+MuCU0S1w4me0oIoYrG1X6Y9bO5fded8loxkqYWNxM7mdCfkZnOp TkgotlZaFPDn
lfQNzLd7eltWHrq8ZVCGsPKIInEBNB16dpGyYgyAdv/w/lEKeCfeGDk7yI5B xZxi3xsoHZa0
k/s/Owb9B77rxcL7/evL2vkkDf/6B1BLAwQUAAAACABqR5M2xAS6770tAAAF YwEAOQAAAGdl
bi9VTUxfU3RhbmRhcmRfUHJvZmlsZS5VTUxfU3RhbmRhcmRfUHJvZmlsZS5w cm9maWxlLnht
aexdWXPbSJJ+d4T/A0LzshvRluo+HPZMyLbsdrfcdtvu2dl9QUAkZCGa14Ck bO3G/vfNLJAU
UQQIgcbB3h53tCWTSGRWVn6VR13P/vZtPApu43SeTCfPT+gpOQniyWA6TCZf np/89vn1E3Py
t78+fvRsOR49/ZBOr5NRHHwbJ083JOyUnsAno8n8KXz+/ORmsZg9PTubD27i cXQ6HX85naZf
zuazeHD2j3dvz7Yfn98//vXr19Ov3D3KCKHw6OUn94YnyWS+iCaDeE0VD6Zp nKOLB6NkNo8d
cTy+xhewswt8bE0Dwu8V7Ld3lyiYE22ePM0euZwOooVr4kMogxKBgDWDJ8gp wWdPnO6S4fOT
0IYkvIoJ4YSGlBJDJJGGccFDybQgJITPhD4JJtEYmgu0wSfQwzBKh8GqH06C cbyIxtNhPPoY
X8cp9Bs8GWZihiBmCAKEKGYI5CELgVGYjGfTdHECXRoEz1CYi2+LeIJdGcT4 2zBOH6pc9w54
S3w+mUwXTldz177F3QwEcR319OL+y63GX/8++C/yXr66GC7t3y8HX6N/fv3P N+cnwXy6TAfl
vespcyUAiDCYTkD2RQH7D9Hg9+hLXFvx4fqVWz2w7oCN/ifz3z6+3Ui7MpD5 2e6jZ9Di//j8
bqfFZwRf8iGNr5NvhSw2TWyqt1bvOrTPlrX7bCPGm3jyDm01LwnIMgQrTkYF YnxapDAMfZ5m
P99Fs4vJIr3zRXqyK9Lv8d3zk+F0sBxDD67acRuNlvDqb9P05Cyvi7NtZWwr /Cyn8e1v4pej
aD5PrhMYBXfldl96YtICa88MawNir4sa7O7DO5zGtTvcH/HS9dg0h7ZGX5LB MI2+AsiEMooK
RhlXoSKUCRJytdM3ZV2ATQK7WA4WyzQavY4j+BkXtGwzMvoNK7DkrD+uonkc ZpYaTFNQeQw0
19FoDq8YTb/G6YvpcgIf0ZysYEVbNvGdtlJg0pls0MQZdGBylYySxd0xGgz7 7lG92mCYCo0g
TMjQdmYvrAAIW/by29w5mX7shZXa8iCFhvpj/3HYSYGNN20nMLDA/9KakOnO DIWXDvTOUF7E
N9FtMr1/dR2j+W7ZjtiIeakRQ8g6itGTH6Md82btOE3Gt3fDaI5mbJSxxMIv NlSMGQ6Ba2dW
LPZb8csppBET7JKerEWUWnKmfMhiPy1ncfoZXjRf0chdCztCgxL1Q+xDBkah teUy5P4A8x2C
70HCcDkbJZBOx3NfTcG+5K3MOuV+6zxPF8l1NKg0zh1RmraB1TsPVKjcE3tD oyBnnIA+c73t
6NSudvw+dmLtGTyy79cd4xtIWcK0751Ngr8AyKvu93Pmpjv04K5s1kuURjvC WMpC2Z2fKLC1
Q5DYlptQpW4iKysukiMNj1U3XoApJYwIBevOYEpz2/5DUF1qzCBNcnuUhqI7 KNAIFVKuDQ11
dwOL3l+fOb+aL1IYWJxCerKWUkuOv8WD5SK6Gv2Bw1DTQR0HByCpNDOhaC4M NXsA0XAYaips
9IHO78jDULMndvlTh6G2vKSP1ePL5CqN0qMs0toOnAaAm1tKSMi6K9La/YDc zAX24zBsqcMY
RKOjnP150o0ToIJzxUIuOzOUJ0dcCH1SasQ4lQ9vypYlHKW9NJvmuql6Ft5P 1lOqtNWWCg3W
QqzFyj6D7zqzm7CiLLrp676MJyw17DSORsl/H63phM0mvMWmIyjTwoTglihk M1RzKboznf2J
b++mE52X2vYsnYJS50doNtF5N5GMNlpxHrLO1idE5/tDmb4nYKLzUnOex+lt MjjGYkn0otl4
pniQkZwKYSGaMUQyGGQk6SyuiV7sj2t6t5oXpVa9XBzrkpboRbNRTdmSFsuZ YjqkndVio5cP
iGb6spSXpZZ8ncKPr9P092O0lZfNhjGl6+U010yEorPIN3q5P3zpN7WOXpVa 8mhVhfmjFmKj
Vx1EODD6aMvh3yFvqg4bvdqDhGbrsNGr/bb5/6MOG13sCV7+zHXY6KI86MGu Pc4abHTRgacA
QEtFJbGh6qwIG108INGtgmJbfuJ1+QzvarfAH9dRvO7GUTCrpKQh85Oa7xC8 O0/x+k/hKd78
y1MUw/9N+apR6K1jBPWbDrwEc/UtyUXY2Sr56M3xLgOKfix1EpuV6K6rMtoj NJofO/AEOL3L
BPwJRXflrR8riqJ9hhY/lhdEB2ky+wMHFm87qJoqK7nWLJTSaIFFMCpNYwHG 286WBEVv/wxL
gqK3/1oSVDwI/FReUV0mo+F9/f0IYf5Ts16jCOaGEEM5s6FgyloWMs672/Ib /XTkU2o/lXqQ
aPktGSVHWsj4uVn3UBqiSsbAcnY2RLZmLj9XzKX1GWz8XL5G6G6+iMcFBy0c ibF0MJcGoamh
zOISoc6M5XL/VFqfxwlEl6WGDIPdkc65XnaT94I30hrCze6qo5dHXB3dPZ9m 44Dm83h8NTpK
U3nXcNyyiViI1RIyE46FdMhIiFYQsajust13++OVV/EM1T0Z3PVmL6W2PIzn i3R6lObySwfh
inDhihA01N3FK7/sj1e+6+CJJq3ml/LYZXmVhS9HaTfNRi6r9MjSiDArXXok tCXMGCZxKRCl
3Z32EL0/7tMeovelpo2FgHR6lKHu+25CGMihKXir7tLo90ccwXwoNeTr6WB5 lMX6D82GL2Vm
wjWnRoesswXv0YcjLtZ/2BO5jOIvx3koQPRrs6FLSaQrLaEGI93uhpRf94cu /Ue6v5bacuqK
3UdpLc0GLOVHSBCIXELR3cDyseLMkd6PBog+ltozkh6jsXzsIFgReM4nxw1Y qruFBh+POFr5
VGrIaMBHaSefOohWMHvmnHEIav3lyO3ZyaeKidtGB5WdCcyCicuipj6bZcvs 37pDvLcat8TT
2be/22rdg84DD7KfyeTLL9DoOfCJnz/0qOy1bT3L3hEPV5J48q1q4DfQ/xtb 2XukOlrO6bfx
6C+bTPjZWU4B2WfTr5N4+HE58vm9BE1CnyWTLWXk7E0KpSk0jkJzLOfWhFSs Ox2PiQ5cJ31b
1FeEEwmyZlwqtCPVOFtmulckxkPBIQ4joTAnQZSZRjy8yFYfPaQd97Z2NR3e /fXzTRz8DzTq
f7FRK7UEyTyIZrNREg+DxTSIgnm8CKbXAdjrdJBkpvhDkG06vwPLCBY30eLx o+ltnLpf8fkf
YCACWIzugukkxheOo0lyHc8XwfU0DeJocLN5HXBZn+V/GvwDvk3mjx9FOJIN Rst5chsDroJ/
g5bCY/ef/PuWwKfPzlxj1pjZVvP6w9weeU/372fRP5fxxbcZjAzz3Ng2TibD BA/dlEJbDf8b
LkJGlDQy5L4uQY2eIDmmK0vdmGUOuesu9CTbwHwLt9D55OL8w1W8iLZsj3Fi qNaMSehmY6iy
uBMerwIYX8XpxeRhlJgMKjz9kQYPeNoosHhIISnJWzhwK2sHfFWrKfcCbeam 1q8KXcwU3Cbr
Y69xQ3JyizlakHGujjaC6MuXFPO6BO9zGGA9a57gC6AdYNnn9xb/IGm3FR8d TntvV8vZLE7/
jifUewq9BCnBn72FgegLbg2voVJDiKUGVMo3h99vO6dnzms1zJNLZhQHnveb GFdIAIPID+Fr
JLQDD85NCFZgLZptLXhwsBiDYzsJIR+ugod7Gti45ZDtwCMv0C483NLl2vDY XvTbIDp8vddB
h0fbHjpWGgV8gEY7QgfytASPLwGefaNDEhgVBaU44ipSBx0SRxQhCY5gilWh A/kwCIyMgKdp
K+jIC7SLjk09bx9C7t9bVglrECK+8utAxKNtDyISD+UjRDu1im4ggl0pGdMa 8L+V+fUCESrd
KmQYLjlE07oGRKiUGiwHvDwkWMJWQMTxMZRKhnxMGxDxBNqFyPZRuLX9SO4Q 2eZQsqP/Gijx
aVtDidMspAvEQgIoaScocTwpNxwbt3XQcy8oYYSCMIQrrUMmRQ2UMMJAdUwT R6mqHAny0Uoo
iieGyjZQ4gm0i5LNXuLaEMntwm0OIjvKrwERn7Y1iDi1Qs9xi4xMJxDJulIb SyGHl7pfiEA4
Cy2nhEiJx7PXgIijVNJwAiGIJFWOBJ/G3FJT4GPbgIgn0C5EVrcN1QZI7p6e 5gCyo/oaAPFp
WwQIAe9MNATJoFTWCUBc49CV4IIASfsFCGOQ9ilKFAjDSS0fgpQQnWKtjpNK H4JPG4PDAjzd
jg/JC7QLkM1hNHURsn1AS3MA2VF9DYD4tO0BhGEJT3KKt9WQjjwINg7iOoGm 0rcD0aBhCnko
hZEI7Pbh+KDwVwgGD1YElLrKgSAfC64aGs3AeFvAhydQQYyV3yS3N2V/8Pay 5vCy0xU18OLT
toYXYAGMJK4/Bka2E7xkHculwWoJMT0DRipcjiIs5KQUPerDASM1+kVmlAVK UQUY5KOFBLOD
p3krgMkLtAuYNH8f6CF+ZXOTZoM48XugDk482vZwgrqVFqdIKOZ7XcAEWeKs sbMY2TNMBG58
Yppy+JDXgomjVJxYDpSVMMGnISSyWOHi7cAkL1ARTO7Pvq7rVIpPjW4QLH4/ 1AGLR9seWIQL
Dqi0eBVQR2jBxnGhpMDG9YwWJjF7gBhc4S3VdaIwRykMURKCSVUVhWV8cEID p0xaicI8gXbR
cn/Aam1/kjuatDmM7Gi/BkZ82tYwwiQMEtQSZTEJ7Cbwco1j1GAmz1XPgRdk DTAaCWXhQ6Zq
ZfJIKSQzluBsQhVG8GlwJ8Ratx+zDYzkBSqYdN9sVXuAP9m/yatBmPgdUAcm Hm17MEFG+ENA
fqI6yuddd1qlkWXf+bzgYL1GMHDc9aIuXGXPLJYmKKuOuoCLslRZ5NNS1JUT qAAjq3OvqgGS
D7gKz4JqDiVeB9TASJ6yNYQ4xWrgo+FD1lWwBTwlpCZ4ZQHrO9gS4Em5VhCf iFpuREi8StDg
jBsEjlVuBLkIwQy1uIKkDYh4AhWt3cruyqiNkcJbJprDiNcDNTCSp2wNI06z ylohJTDqyIsg
TwZum2Hj+nYjFtNqQa3CCSpeAyWOEuzFOEpZ5UgcH0kItv2+R5tEiSfQH2Be 0VN9DXj4tK0B
xDGC9ADPLMH1Mx3gI2PJucW4XKh+8cEEMaGkEGaykPN6XoTihJOUFHIqXu1F gI+xzEIsz3lL
XiQnUIEXcRuwDsKH0JAZ47r7BvGxo/oa+PBpW8OHU6qBlB13ePCuHAh16/+N 5cCzbweicZUM
twKLpqbOEnlHaaCjGAQetmqJvHtaEuBDsDrSBkA8gQoAkrs4s36wVXTlZHN4 2emJGnjxaVvD
i2OkCAwcWOTqZtF8xpNBaACNs30vmsd7ysHFEawj2jqZe0YJ7pEKoKzK3N3T nOEYCE+3krl7
AhVUgJPRYe6ECWMpZO5NwmNH8TXg4dO2Bg+muVuZL1yvdZOzu8YpwyhumLE9 5+xU4kJPS7kU
IRV14OEoreGQ0AJlFTzc00YILXFxdyvw8AQqmk50Z34cBJDNaRnNAWRH9TUA 4tO2BpCs37RQ
WC0U3QDE8eQG8iy0lb4BQo0CF604wZXXtXaUOIAbYrGPSOWOEuQjpdXAjbSz oSQvT9Geq+z0
x9oAyZ2b2CBAfNXXAYhH2x5AUKuSEGIMhp3dAMTxpNCJ0Eba82YSalyliQlL IcSmdQBiDA5i
EuJSoORVAEE+CtynEvA0awUheYF2EbK+7bY2QnL3xDaIEF/3dRDi0baHENQq lUIo8KNMdoMQ
5Ck1/C6Bp+gXIZB34iAkcCkDk3VSdkYg6LCWKIazu1Upu+OjtZAGn24lZfcE 2kXI/ZUHh2Bk
c1lAcxDZUX4NiPi0rUHEqZUaqcBbMdVNlu54CqvctiDVd5YuccbNaq5lyHW9 re04wyEVx4sD
dPXWdnfaheHWwtMtbW3PCVQwLRKNRvXRAUkI5E04L8AbnTH0FV8HHh5te/CQ yoTSMGuRkegG
Hs5SYKTDrfS6723tAncPQ5SpKK4brQEPRwljKsH6H6tMQhwfa7nAk/PbyULy AhUUfbduQjkE
JZs7RJoDyY76a4DEp20NJJCdQ8hjwFah73hHiQg2TjBjcdU/7zkRge7HuW6i CXhrXSvMQkpl
BfwXMlMZZuHT2hihIEsw7YRZeYEKwqz1xR4HHI+ydSVGcxDZUX4NiPi0rUGE UW5Cq5gBh8VM
R2EW8jSKcAYqNz2HWZTiAMmEMTy0tdwIEkpDBAPCSi+CDzMYHAhkve04kZw4 u/AYA9X4YA+i
CMAEV503iA9f8zXg4ZG2hg7HhytICLAE2ZEDcR2pOIeBjpLeHQhucBWQggqA aj0HoiFAxY3e
kBZXTq07PpRat2W3nal1T6BdhMTf4sFyEV0dOmEI7gSPmmo0U/fVXwMjPm1r IHGKtQpSdYlr
CjsBieMp4EMO/rH3+XQOmhbcSFxNyWot0EJKZVzwwVnlAi18GgIDF8yzdhZo 5QUqmE93l4/U
xkfu2o4G8eFrvg4+PNr28IGMmDV45BNnHa3PcjypsliHYH2vz5JEh8ZgxYLy WiEWEipFDHQR
5ZUxFj5tKThOiceKtQEPT6CCQtbqEqdDALK5/qg5fPiarwEPj7Q1dDg+gkHk CuGO6CjEct1o
LCISQvKe0aEVTu1rMAasM9WBh3b7z9wkEqmKsNzDknKiIX8mrURYeXkKTmcc zzKV7YVHmoxv
74YRHmEuDHQSsfCLDRWD9NQ2uslwR/N14OHRtocPx4gpIfFAkm6iq6wjwSli 9YH0HV3heWIw
QAi3uakOPhylBAePO9BlFUAyPpYIDvGAbAUgnkAFSTom6JeHHq2FuSqABSPi BlGyo/8aKPFp
W0OJY4TnimncSNYNSla9qd3R9LJnlFA8/5Jy+MFCWqvSS/HcMzz2SLsfVW7E 8cHJCuDTTqXX
E6hoURaA4YAkXeCJH9rQUDfqRXzN18CHT9saPpxODceT52hHVV7HUlicNQSe fcOD4a0fEm9i
orTWkl5IokILA4urT1Uu6UU2wkKOzuHDdpb05gUquGPEXbh1CDjur6pqEB2e 4uuAI0/aHjZQ
o1JJi8tsaEfreZGn4QLPzaC05/W8jBq8eYArXNNja9WvqDWh5dmZyLayfoV8 pDY4sDPbTv0q
L1CB75gOlpUpSGmGbpWUNGTNzhJ6yq+BEJ+2NYg4tXIiIYxjtqMKFrKECAu3 qDPbcwWLSVA0
U8Rd0aFVHYQoLMRJDBUh9KgCCLIx6D0IPK1bAUhOnoJJkMni0NW8BoIrDGca TT58xddBh0fb
HjpQpxbUgDumICbuBB7IUxBjJVbWbb/woJh6wqgrNYEPa1V43eVmeCifgA8r K7yOD7UCw1ja
ToU3L9AuQGbpdBDPD5gC4e6aKsV5yBot8fq6r4EQn7Y1hGThpYAfDA9B6gQh jqfQChcQQyjZ
M0KU1CFuc8Tjb3WdEMtRMiOFhD7SVSFW9rQmChc16VZCLE+gPWVeZ4Or24IP QAtnAv6Eoslo
a6cf6qDFo20PLUrhxlDGnYa7CbcynhL1DzybDbc+gUDxFP99L80DFhpldnW/ bilnyy8PuJI2
Y2ONMNCNhmBLXbCy/07aQuHu+8HdnnoeOBHdlbPZrz9k98qCaAkubr9zN/BG yWQeYIMGCIp4
/pBbYN1n54tFmlwtF35ff0inYHkYrz2wl/PL0FYqdtdC71tdXAckZSuzUGi/ t7KhIbtGeRYt
bsYR3qSMNzpfvn3x8fzj24tP+K/TjQ2cAtlfMkk9A91oaP1xMti5NPct9Gv8 UFURhlPnREk8
mmxdvWrX/HNHmGdd452K3iQEhNacUmcGD0TAtnw7AHAz39FggVcfR5NgejVK sgHbgWISxCvd
JJMgWcyDNB65b+c3yezxo8U0mC5u4nT9VA/I8I7A34bGb3NnN98NjdLz4JvD RiZq+9hQEpwF
0RSV1Qk28gegZZ2zOkytSVAwLqjbHi0fjIqcZDuwWGKHBMN4Fk+G8WRwB7/C W5PVFeTwVxwM
RglK7HxCcp3E6eNHWcvmm1vG5wgifHa+dLecp1tPnz5+9Ck7FAge27x0GM+T LxOUPriGdy1T
4LN6KYBx/d71a+/fhtenf71JBjfu8zUpXq++ALd1Ew9Pg3fRXXAVB5AIjaeL 7MJ1fPbl/TtW
vi5r5eYt3WPaO/BvG9Mv4pvoNplCoPQ6k64BfJceiNccvnfFrsJ6wxrNX83W xihZel1Zc1rs
apSEJij0siQUTQ+Slatksp65X3JzyChZfDOR0coIHuJ5c0RgNGkKg+gqCQsi iNVtSTB4XcPo
4YIHN6DB8ANvh1FrgaOoG3EABvH/NXdtu40jSfZdgP6BT7PdGI2H98vsYoBC N3q392ExmGpg
HwVaom1OU6KXlOzyN/Un9Ft92caJTGYmSclmuZKsBnawXRaZGZnMiIzLiQgn X6969dCgWRTV
3Y3zzxzaxIb+zaKLfujZpM4dlBR6uXjMGyLa+fxbb5zPv2sxSEM85DSG86OS 4csLsgF2y2S7
H97oMfUlrHcV02SP9TS587MfyWHiPjJE/MA2+00oQim+kSxo+R7uu6qjxLCv tggbfoGOoikb
MN6PUEigFjiCVgcl0wTf7Yhz6KYHY9Lf9mDAmnV5lSnBD998PN+yBgF14k/V 6d/xP/zw979P
YZX74giHhexqM9iV/+z9+LpoSjIIF9fdos8NqggmKex7Of6kUm+dGJiyj3/t fVRbvD6swmry
+ofmVN6RjfX1rH69OKk9VlfUzs/pZKqHiRfQraQybmdndaNXuLxrjebjNvk9 iQAX2HJ9qun8
rsl72yahj0aqujYCYHjs+S6Udsp6hUMsDHaHb2VttrBVcd1SmSIBrDLQsA/9 HDrq1bbs9rhn
KR2VLsmIZGeEzKJFWKeHwhPfRgL6rDENCuqn9P0D2YZsGtOYhA14RhvYucPE iqvKdGJJJhJ+
4M6NtV7xPZqTCX1uz/ADbxz6fKzNHgvEEfOmxB87pqHt4KjIjfNhvRLbsjc5 tR1b+pIPD2yV
r1e4rM9s9pN93udE5xf6F52+R7C1OZJ6jVcjnusNq/VnDEzKs3AvrFfE/C2t f0OTkK5MenJx
R7dnCVo3TvFUQFTU5/sHqYlX9b1wh+PN/fm4J3m5vIAYQFh7N+xty17M8mpx 5S8RE1fRnfbE
hEnwIsICCbTJNllEVPSzars4o8rStSYvWJsmEYiE6+nu8B51V5Xqx6a+b/KD 4FfJTc35iFs0
JzmwL27Wq/HTIx1cLJu4j9+TTN44ojLMH0YBT5IwRLWyOApRQ8uLXDSYtKuA 6z2fSQEfpKLP
pIBfzc62KBsWVcDp5qTPvvUXiwfoXBcZKTaTZ2zKhiCLQxeIo+BLZIMib6R/ yy2Q/K3iwj3N
QXqfoDnA7SW8XusVhEdxbulfty8yZCZHa28cDow6Fe8A6yr08l1T/N+ZBsSV y++VR0z5r/OR
7wznuTzRLKwg7CF9IDVaaAB0W9P/FZ8eG9JSij1N/SL9cqQ85KZOQmfiuSiO Qnqx4MqP+y4O
vl4Jel46OjcIEPbHOhh0v0CJkHuCWUtzXDlEp6BwDN3hJwZD0MLpM61XrTpO LRN1yu/vWaHq
/ItYIZyKXahCM9B69WEwKnsSc1Jh6nML/2AuSNC/H522PpAuJYX4AYNW+fH+ zJ9nvfrfh2JM
K43K5BBZ7GZ8zJuTwBHIVUsvJm3F4bFu+AqA/lUV+E/+fCCcP6H0gtLvTXGo n/JK6pVMEntq
eOe67cQnPuC1ko6HOgS0MgRoe1QS8T8Lq0+cuR0Jww0d0UL88dUVkZaIPW5o 69TJV0uhg2As
9GQQh3Nb0tmTKvR4mlswUMH8YfwqHyVj9L4Yrt7cJLETg13Dm1d2ztnXhfBC 53d3xe4kaS3a
wgij9QikZX+rYPYwldG8wv4hPoGFG+xqbp+9G6wjdv4LjDTbOPCiGCbjUheY UbxSBrRRBtPq
zYWGEShtPt0K7tE1urpGrqPnh7otOs+xiLUoVxFE7nolnjjlzX1xGj4huLBn RkNFzqu2ZmMW
vWnPBx1jFgLXCC+bg22UNFyvDkV+NIPsDTTosj0NCCyPxrBdyAcSp+8eY8nY 8pWAT/SGQS43
Q8/CiBjDhdZNKx8Us5fHp/pXYY13m2WOsF5dIlw+yCPcOGPqaDNh2h+PkFj5 mDJ257+M55NR
N/p4tKO413b0G026q864KrUToyoPpcAAbPTrrRKeRERVt2XPucgXcf9Zcamw QKrgi9COyOVF
56Aa7gzew+s1Yu0JzqW8h+hZmSQZWc7WpeYX9K+SobZea6z3iNFX491ZEmbI s0q87KI0nU7v
SKqa8BtwXmu6G+sDyTrmktt/ERu3LOXq8wn+wTsNsnl8eGnhWxuGupkVIYHl 6zfOT5Amxacc
z21oBhWSdbS6zJrZOCr+XFak0ddHUhc5AE/K0VMJ2wQ8LTU2DhMWDRmeRbvh H0T4Hrr8MH5P
sqcp4FygVWj8UAu9sdODS3hRtcIuTZN9SVoYPchOzs+/gWQi77bY5WTk0JrU n3aQvDyZRCG1
ylWZd+wgbANioId63xleNAeNdHeuGJwIvf+l7bRidp+y4wVCF3dVWxR/oznF WuRmLS25ht3p
eiABtbdfL76u92mzJ74MeueXYRDDQeymRlB3ZiEWen4SImXM9VL6YxJECpxm HCH7Iizw0hD5
qwmfj6ki7BK1XynC2BbnyAhxj2RvqfvMIsd6jDmSYkoEOaYMEjpQRwTJFoG8 U5Cjznp9BUSk
KLpxPhak2IyeuCzNBivnrf38O5w/Urwdrz7klDmRZCxXuBJ4XVDFIdrgUf4S idi9p0Qi5LeQ
fzIO9C0UNbpWk21IehrCvEEwn7gLOVqUeChDEMyD2l5a3MVZmHLtZdvi7ppF aSQ+is/UZVG+
R8RdM3ZDElXImPK/yE2rSRvJtFOTH1sRW3NwrvYaorj8cR+kvs4FAbyaEWrx tC8IAaTDnrlZ
SvaJbz1kefm2jAIvRMpQlLoRwr6Rq9w7bdE8le8EA756ryd+EAYJ3+ve9Hv9 EqUjHmgxUkWs
unHuZMyA7mbFB853MhSJe57TFL9fnDX8EMwf+ik7IqO5WIOnCZLYo0nmAcwt zBhJGNOuIUJl
mTEuitp+uzfxibrece9hiKuB/CzyAGZyL2q4b5N2WbMV2iCA4MdaY92EH6xh sLlI7GE+wOL2
8LtVVbHrlLBjffyLSPoeqlnaF0ZabIXIQ6dxIY7F0/+FHXD7xVlr2GBwpGR9 PVtd77lnkbH4
tfmZKqa7mf4WRlvfuiV5TX+Jk4BE0zZUBv9dQ//vuW5+tcpWiZsC0OFP56oe bSOu+oIYuLCZ
XpCwgdg3w87zZvdQnoi7kJ3G2RxgnEZHT8lME9AY56duP1ojG1u4slUQeUMv nhCjbNnVTu89
VrRCMjI5ZnunhwBLMkGwsCQYDi4mM5Io7F0OZ4pYNMLCp/JQIO2VDL1GuMDy tv+anmVxPvcj
dGShyxOFSeO4x+f2AoY8SZKhdWAQR7Nw+qIBwwDONvrjMpBz9ILMgL7bKmO3 mgHskmYZ3Dyo
nTaR0U3CBnxu5JbAT7Fj6MILEU//qaEFE54SeSbOHwXnlvlR6sWkNsRxDDco KVKxVZybuacz
wdx8cGOaEEWo7DYXzA2zxJ6LWqC0nFl4flmYW+b73EEmXoTpQ1Sm9CI328Y6 27YGcNom20co
y5j4LvrZT3ee9GgbXfAdlRzyN5VohNK7HBI6seUjKc8vwk0prmyhVcvIc3m6 cX4WqZ+AObcS
sLY71Q2Ncj615b4QwXThkCQN/bkgXSCXTxZcz27jyMYMIiAl4s2KQqkEdFPq 0aYIFbtM6XrJ
NolDNCbwo2gOfZunIC0V2HQ/mocj7enbPgnfdBcT593REmhjghQIY18Y/KFw yS7BiP3qnzJt
paslao0RQyTlJbTGbTpd0e6RNuJDvpToItWIcplNjSCpAIR8/l38Stfu5980 vv7z73Q3mzfu
59/wGP15AlvYu2uJHRLaG9qRMKA1evQvz/Zdq/dvpst2UPl2psv2ajlYe6y9 4GULDTuO0yjY
qm71s/M4faIoCLeqxExbHPdW2dv3gSPZ4gxMZ29F1Yi7beDxHK4UQ1ejNLR7 xWnkSNgHmSkm
3xQvTREFdjkpgI2CfswoENhHOdjCZwUBgK00RwwA5SxstBQ+C7BWjwyJrbdY rM8o2yi+zaV6
kDZZKozpi6Fa68XYx9tkDpgKiNQx9qBTYSXIv0vUAsZ/vepA/s53xc39zcb5 4c9/3jgfD3lV
nfLq143z3/lT/j1elW5dXYBpvQLeFdcxR+QPdcOXNNLDig7W2eViiMyNU5O3 J84F4Z3csAdq
NC7DaMWQ5+pU0mqUlkuMTYMTH5cHkamBR+8ZoNE4FWRD92T9BDQHPSa0Zq7q BuyF812+Xu0e
ymrPAC055fc8kLTbRY7nRQJIqfhwdH6+AF/AItu8ZOeYgDAUHXZBIEtKwMEY kg/UWSu95Syn
DEBpl3xwJxH9xgDQ8AW8lzNtO0wHrAWN6hi/92+tMf5F+vlZ3gBN+PHM3n4i UOA76OH16hc6
3/RN/6c+FVrIKszLIDJgCK2WwwJ4+OLO7Wt9iE7ATjtqkXkrgDPrFRfie+lt 6Kmj18DkjCeR
Z43XJzdfweWwW8gXMT4AbKiiObQKvjdlfTeAyDAe6G8Kvbf47TIsnzuD/XW9 iqy928We/fXm
7ZJ6QewBkmD7erloC8RZFNAFvY2iNOESDF6koBDtrikf32eLXZwLJSRSbqbt hR4qNqKn5NTg
+kVCR9qbIHmc7MvejsemUBlSu0G+7x/CLnND7BL8FBGHTiP33T7Q6Xs4j33m AT4RZ16c+QI/
NIt9xrOQyoI55gGSLWudwQODJuXWXaGXwS40ceBnNGuc0WcinU8Xib49kzKi 4RO2ZIDG/vsR
lEUAbC76R6cTPJIBfZSACn0OlZjHc/PI6Ne7ztNZFU8Fkn12RVU/8goBVXsq T2Vh1OPYce0u
Zf45pNKhSDuprVOkhV0mIzN2myUxJ9a7/SDjD/ZwOjyN56UkLmiaecKMPyyL 1Ak83/VRqMs2
o111OEQ+yjio9Kf8/Im+iNWYA8BUkcsVqMPJdptJ2piTdIwBJW/qhoHmwtfP htWugPXEOIE7
uP5Zv61kvtnGQAfQnassQE72KOgrcqiAC9hgABlPWK/uqvrZSEjXKrTaM02N LP8heRvgdZV9
fW5FLvxP6K8uh4JmrfOzWRHQnh6AIXTa5I3zQU2nDL2mMNbEyf+n+r7AfojE PnOyLlcHLwFE
Ue7OVd6I9wD5hhzS/iFpQ6ltuQX5RduO9sfB9kBo7TqOQTbPucFiBXa8r/dz e/lpmoxV2eS7
AbcujlKE9i4kz3y9XOIp6CwD/uBH87iVllL8uaWjixKFy0Rf0FPA8zPk0Sl1 n29BLnlhVSiR
8ZcEJF/86QAIk7qxjq/plN5WIzlF4J36GKh8iBzkh3RdPdj0yqDuQE4fOryT mIgTqPWIVdXL
sW6FI5h+R+2oEurGrazhMQBgqUIcZJIQ33ZuDEnS4lzqhWQ7w/dLupjnz9O/ gqeIXDf2kPUx
C5cKUufnUqAVPEA3g8XiJ0YPOPFtCtFPziaHplHgByG6i0xl0B5hIw59hEpM vHMEzIDuuYN0
rCmMe1OIQh8ncUV3lx1z0K54XD4ZZNgncI7b6mrzPHt8YO+2ugQToLNCFkDo emHicYaYZRbQ
e+ZmSRQncQBMDCCySUzWXqy8h9CuDrfVgAmsnQU6BtskTWnNW39QzVCXLLdw IDCPH7oJilrN
VMzQoNfGqXjbgRGFGVn31v0X1+BSZLvA+NVlJUgFJi3ZonhEpws3y1JflL6d KB97pA3k47Te
InIhbS8GVdtrLmKMYVR/MUZZXAZ7XhpvoyhL4i0XjTTYbo7eIpiN/hdwc5p5 1JIv7y1ihQlJ
cQ6ibGs9Pi19cpmXu34WsU8uTDLXT1M/Qr4PGS/amDjfCvX5XZz4epsMJM+n 3CbjtfDB62SO
dJbzseQ8hwfiCM6FgDGwL3ayNSL0F1jsFbAaRq0KUVFJ+A9Ldg4eOA3eKF2+ 59rfDZkf1cuN
86OulMfxQ/V66zzB8H8u6fR0BcRF3kMvd3yDukV7Wf23+ESyhJkakkRWBdAP q/KDMkFfp1nQ
C0wt7JXz7oRKR3odfacKR8Y5DNrvDCIKlOjAR2fiGO6HC/n5/NqgfMDiksYn i3RLTEJy3VQr
bPtNeRovjDMXLpCZApML+k3DaBtHpLTQH22LlqswwiDwiAjl2pZOsHcJlatO U7JMSb9MpjcD
MAkbCZLOT2egtJ/NMhvEXkcgWzoANgf4O2+B9lO0RnWPG66TJscVQ8ri55xA qUAXHRi14zmW
WMC9oMaFqDApCol2Y0n0STeYqshYn09V+SQgD927JrO3GnpDgkh4N8tHzu9a mpe9iC7wjKwR
Op0cT7ZvufEUaRqhinEwj6Ywq+EWxHHsBtz1IglRPn0p7g2SwEsTgE27TEo4 o60yr5/6SRps
0+nlGHt0jblXhxzMGjo7RDsuu+I7HkOaIwdF8lHcwIygcP7FR/nf3QNdq4Hu yh2FMcaxiGEo
Ay8rzGrPN3nTj0pciGKgIpcIY4gUD7EcEeIZzayiGuvV22ENvXmjgAY7e65E NJxrAQ1oFGp/
v4XmEEAI0KGDb9qP5pA2PEUYpJHvAVL5Bxc3bxojZImQCrS1XhLhirMoImUr hbMo1h6BCo3O
B0VCrB2IyIUQCpMUeb796pZWnUWYJw7RVIHmmafE5dLOoiiKEYRfrLy9H8N1 udV9SxsWt++6
j14FuPmkjmQpA9ymu9R7BA7uJbNbjiCaaeyV+b0ccCJr8aTRsk5bHGCV7gTW xUC1iHqMpTA1
O7H7Cxf+vdTe5vLU+OH0XBuT4zIoTq0JxOk3zcHNh6tGYrZ1vx3kS8lil6rL B9nowpAuuWYO
vXdr/oHU5H/qzZHIPxml7wKDKEClIhKiPhwMarl4ek6s3dFJjbxDu4f8eP9N tFufVM8wTKJA
ZJKaMDqrnXUwUUJ6dEQaYjgTlm7pzjqZBxak9SwiYeiWIzUbhR1jFUDi194j X675otM4BugB
uSAT5UqPrNf03dcLTPY1RM5bMgDqsuoGColI/7J8b9MV19XtKfjd6UUp/6t+ JlklWs9y9W1R
6PY13Lv2u/Z9ViSQGP2HE20QL6WL6swhdG6RB9JVwyQhIbCAZCWXORJV4P1T +RsqOQQtiepW
JoRcqii5cR7Egjq5RgcdAolllEzsMIEBIHYA5b+Q/vMtVGGfj6Obukjqmgfg gynQHDvOUBpk
FqG0oCqMUtWAKi1T3aSPDJf2d2m7yZfv+iJ+MlUc9cgaiSMlFkQ7FdlMgOzE 4tNJ4XW6QqlP
wOl+gxpePrplkfVHi98G2VzYdp4F3SZQ3Ceb6UZeFN2eua6X0Jqs1428GoIN Aj/wtrH6RFA/
LDIAx4ZdF+jocDoH9Ah7RdFnYqfo+I7UsjmeNPiJb3YFt9F4Nwm0uYxCc37B 1MJTBD2gA7vy
5Uk//cqAVVmdXsyDS1gqyU6+a+q2VYN9LDl9Ev9CkqN4Btp5vdudGzD5LWna jlLkW9G2yFDs
cevWsgGG4eXiMe5OhcjwuT/WDeLdpnUxaMn5mtEiaqSIsFpDC69eHG2ICHhf qd3uEta0fLY2
yZx4G2ZAKm25fdpsBgEmCiIcU8+bSfosbQ9EZA0w3vEVAfQff5WfhatgrVf/ D1BLAwQUAAAA
CABuR5M2wXs5XVQiAAAmZgEANwAAAGdlbi9VTUxfU3RhbmRhcmRfUHJvZmls ZS5WYWxpZGF0
aW9uX1Byb2ZpbGUucHJvZmlsZS54bWnsXVuT20Z2fk9V/gNrNpU3D/t+0Ure kmVtoopsaS3Z
lfULCkNixkh4M0DOjPzrcw4AAiBIkCDZAAk5tbXWDAdgn6/P1+fSfbr75d+e p5PBYxDF4Xz2
6obekptBMBvNx+Hs4dXNz5///o25+du3//ovL1fTyYuP0fw+nASD52n4In+F 3dIb+GQyi1/A
569uflsuFy+Gw3j0WzD1b+fTh9t59DCMF8Fo+N8/vBuWH4+Lx5+enm6fePIo I4TCo+8/Jd/w
TTiLl/5sFKzfCkbzKNh4LxhNwkUcJC8H03v8AjZ8i4+t3wHh9wr28w/vUbBE tDh8kT7yfj7
|
|
|
Re: Read OMG XMI resources with profile applications but w/o Ecore extensions [message #608516 is a reply to message #472656] |
Thu, 19 April 2007 13:20  |
Eclipse User |
|
|
|
Peter,
There's no way (currently) to raise error messages when for incorrect
pathmaps. Incorrect pathmaps result in broken references, and it's design
intent in EMF-based implementations to ignore errors trying to resolve
proxies... there are ways, however, to detect and correct broken proxies,
but this functionality is something that's typically done by an application.
As for the performance issue you're seeing, I suspect it's do to the fact
that your model references namespace URIs (like
http://schema.omg.org/spec/XMI/2.1 and
http://www.magicdraw.com/schemas/MagicDraw_Profile.xmi) for which the
resource implementation cannot find metadata. Since the protocol of these
URIs is HTTP, attempts are being made to open URL connections against them,
and the associated network traffic introduces a lot of overhead. One way to
reduce the overhead might be to introduce URI mappings for these URIs to
(non-existant) file URIs so as to avoid attempting network I/O.
Kenn
"Peter Ellsiepen" <peter.ellsiepen@vega.de> wrote in message
news:f075je$ai6$1@build.eclipse.org...
> Kenn,
>
> thanks for your hint - again you were pointing into the right direction,
> that is I had an error in the definition of umlResourcesPluginURI and
> umlPluginURI variables (incorrect path to the JAR file). Unfortunately,
> the UML2 package does not raise any error message (or exception) if any
> of the configured pathmaps points to a non-existing location. How can I
> enable error handling for such cases?
>
> Another problem I have now is that the loading of the converted XMI
> model (and referenced profiles) is *very* slow, i.e. it takes ~1 minute
> for a quite small model on my Notebook, although the content seems to be
> correct and the files can be loaded without error message. Is it
> possible that this is related to some read timeout while trying to
> resolve some external XML resource/entity (my computer is behind a
> firewall)? I have the example files attached to this message; the
> behaviour can be reproduced by loading gen/MyModel.xmi into the
> Eclipse/UML2 editor.
>
> Any idea what could be the reason for the large loading time?
>
> Peter
>
> Kenn Hussey wrote:
>> Peter,
>>
>> Did you try debugging the code to ensure that the references to the
>> metamodel are being resolved correctly? What values are being passed for
>> umlResourcesPluginURI and umlPluginURI? Are they correct?
>>
>> Kenn
>>
>> "Peter Ellsiepen" <peter.ellsiepen@vega.de> wrote in message
>> news:evjnqo$7vv$1@build.eclipse.org...
>>> Kenn,
>>>
>>> thanks for your comprehensive answer. After the Easter holidays I took
>>> some time to put your suggestions into source code. I nearly finished
>>> the profile and model conversion procedure now, with the exception of
>>> one quite awkward problem: I can "define" my profiles from within the
>>> UML Editor (i.e. via UI) but the code in my stand-alone application does
>>> not work. In the stand-alone case, the resulting Ecore package
>>> representing the schema of the profile (i.e. the "defined" profile) is
>>> broken: all EAttributes and EClasses are missing the references to their
>>> types (via the eType element).
>>>
>>> I checked my initialization and reader code many times, taking into
>>> account the UML 2.0 Migration Guide
>>> ( http://www.eclipse.org/modeling/mdt/uml2/docs/guides/UML2_2. 0_Migration_Guide/guide.html)
>>> and the article on UML2 Profiles
>>> ( http://www.eclipse.org/modeling/mdt/uml2/docs/articles/Intro duction_to_UML2_Profiles/article.html).
>>> Here is my code (snippets put together to show the main flow):
>>>
>>> Prepare resource set (initialize):
>>>
>>> // get reference to URI map
>>> Map uriMap = URIConverter.URI_MAP;
>>>
>>> // register the necessary pathmaps
>>> uriMap.put(URI.createURI(UMLResource.LIBRARIES_PATHMAP),
>>>
>>> umlResourcesPluginURI.appendSegment("libraries").appendSegment( ""));
>>>
>>> uriMap.put(URI.createURI(UMLResource.METAMODELS_PATHMAP),
>>>
>>> umlResourcesPluginURI.appendSegment("metamodels").appendSegment( ""));
>>>
>>> uriMap.put(URI.createURI(UMLResource.PROFILES_PATHMAP),
>>>
>>> umlResourcesPluginURI.appendSegment("profiles").appendSegment( ""));
>>>
>>> // for a stand alone application, it is necessary to map the
>>> // platform plugin URI scheme to the workspace location
>>>
>>> uriMap.put(URI.createURI("platform:/plugin/org.eclipse.uml2.uml/ "),
>>> umlPluginURI);
>>>
>>> Map packageRegistry = resourceSet.getPackageRegistry();
>>>
>>> // register the Ecore package from org.eclipse.emf
>>> packageRegistry.put(EcorePackage.eNS_URI,
>>> EcorePackage.eINSTANCE);
>>>
>>> // register the UML package from org.eclipse.uml2
>>> packageRegistry.put(UMLPackage.eNS_URI, UMLPackage.eINSTANCE);
>>>
>>> // register known file extensions:
>>> // - *.uml -> native Eclipse/UML2 resource
>>> // - *.xmi -> OMG XMI UML2 resource
>>> Map extensionToFactoryMap =
>>> Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap( );
>>> extensionToFactoryMap.put(UMLResource.FILE_EXTENSION,
>>> UMLResource.Factory.INSTANCE);
>>> extensionToFactoryMap.put(XMI2UMLResource.FILE_EXTENSION,
>>> XMI2UMLResource.Factory.INSTANCE);
>>>
>>> Load resource:
>>>
>>> // load resource (if not already loaded)
>>> resource = resourceSet.getResource(uri, true);
>>>
>>> // load any referenced models and profiles
>>> EcoreUtil.resolveAll(resource);
>>>
>>> Define profile:
>>>
>>> Profile profile =
>>> (Profile)EcoreUtil.getObjectByType(resource.getContents(),
>>> UMLPackage.Literals.PROFILE);
>>> profile.define();
>>>
>>> Save resource:
>>>
>>> resource.save(null);
>>>
>>>
>>> For your reference, I attached the "raw" profile (only OMG XMI) before
>>> calling define() and the resulting "defined" profile by using the UML
>>> Editor UI and my stand-alone application.
>>>
>>> Any idea what could be wrong?
>>>
>>> Cheers, Peter
>>>
>>> Kenn Hussey wrote:
>>>> Peter,
>>>>
>>>> You're right, the XMI extension elements are not meaningful from a
>>>> "pure"
>>>> OMG XMI perspective... but unfortunately, since the mapping from UML
>>>> profiles to their CMOF counterparts is non-normative (i.e. it is not
>>>> prescribed by the UML specification), it's the only way to capture
>>>> information that is specific to the Eclipse UML2 implementation in a
>>>> "standard" way. It should be easy to strip this information out (for
>>>> example
>>>> using a stylesheet) if you want to...
>>>>
>>>> Now, in order for UML2 to recognize steretype applications that are
>>>> being
>>>> "imported" from OMG XMI, it needs a couple of pieces of information,
>>>> namely
>>>> 1) where to find the metadata for the stereotype applications and 2)
>>>> which
>>>> version of the metadata is being used. The first is provided by the
>>>> schemaLocation attribute and the second is provided by an annotation on
>>>> the
>>>> profile application. To successfully "import" a model and an applied
>>>> profile
>>>> from OMG XMI (assuming the XMI extensions are missing), I would expect
>>>> that
>>>> all you should need to do is the following:
>>>>
>>>> 1) "Import" the profile (i.e. open it using the UML editor or load it
>>>> into a
>>>> properly configured resource set).
>>>> 2) Define and save the profile.
>>>> 3) Add a schemaLocation attribute to the root element of the model
>>>> which
>>>> specifies where the (just defined) metadata for the profile can be
>>>> found
>>>> OR
>>>> add a such a mapping to the URI converter in the resource set that is
>>>> being
>>>> used to load the model.
>>>> 4) "Import" the model (i.e. open it using the UML editor or load it
>>>> into
>>>> a
>>>> properly configured resource set).
>>>> 5) Add an annotation to the profile application with source
>>>> 'http://www.eclipse.org/uml2/2.0.0/UML' and a reference to the Ecore
>>>> package
>>>> defined in step 2 above, and save the model.
>>>>
>>>> To be honest, I haven't tried these steps myself, so please let me know
>>>> if
>>>> you run into problems.
>>>>
>>>> Kenn
>>>>
>>>> "Peter Ellsiepen" <peter.ellsiepen@vega.de> wrote in message
>>>> news:ete8ke$qia$1@utils.eclipse.org...
>>>>> I'm trying to write a converter that takes models from MagicDraw 12.x
>>>>> (UML 2.0/XMI 2.1) and produces models in OMG XMI 2.1 for UML 2.1.1
>>>>> format that can be read into Eclipse/UML2 2.x. [Note that I cannot use
>>>>> MagicDraw's EMF XMI v1.x exporter for various reasons (it only
>>>>> supports
>>>>> Eclipse/UML2 1.x, it requires the MagicDraw runtime and it re-writes
>>>>> all
>>>>> xmi:id's such that I cannot trace back to my original model - only to
>>>>> name a few).]
>>>>>
>>>>> Converting the model itself is fairly straightforward since I "only"
>>>>> need to translate the differences from UML 2.0 to UML 2.1.1. However,
>>>>> I'm having a hard time converting profiles and applied stereotypes in
>>>>> the models.
>>>>>
>>>>> To do this I need to understand the exact mechanism for applying
>>>>> profiles in OMG XMI files such that Eclipse/UML2 understands it and
>>>>> can
>>>>> read the UML models *together* with the applied profiles. Note that
>>>>> I'm
>>>>> fairly into XMI (since version 1.0) and UML (since version 1.2) and
>>>>> all
>>>>> the different versions (XMI vs. MOF vs. UML vs. Eclipse/UML2 etc.), so
>>>>> I
>>>>> think I understand all the issues about metamodels, profiles and so
>>>>> on.
>>>>> Here is my problem:
>>>>>
>>>>> Following, the article at
>>>>> http://www.eclipse.org/modeling/mdt/uml2/docs/articles/Intro duction_to_UML2_Profiles/article.html,
>>>>> I managed to create a sample profile and model using the UML2 editor,
>>>>> which largely resembles my original MagicDraw models in structure
>>>>> (top-level XMI element and Data model, etc.). Then I saved both as OMG
>>>>> XMI (by specifying the *.xmi extension in the Save As dialogue). Now
>>>>> my
>>>>> problem is that even in the model stored as XMI the profile/stereotype
>>>>> application only works if the Ecore extension "defining" the profile
>>>>> exists at the beginning of the profile XMI file. Now obviously this is
>>>>> specific to EMF/UML2 and should not be required when reading OMG XMI
>>>>> models and profiles.
>>>>>
>>>>> Attached I put my hand-crafted model and profile (in *.xmi format). As
>>>>> I
>>>>> said, I would like to get this modified in such a way that the profile
>>>>> does not have the Ecore extensions anymore and the model does not need
>>>>> to reference the "contents" element in the Ecore extension at the
>>>>> beginning via "xsi:schemaLocation" (apparently the "schema" of the
>>>>> profile [NB: I know XML Schema but could not find a similarity
>>>>> here.]).
>>>>> And obviously the stripped model and profile should still load into
>>>>> Eclipse/UML2 with the stereotype(s) correctly applied.
>>>>>
>>>>> Any help is greatly appreciated since I'm currently stuck.
>>>>>
>>>>> Cheers, Peter
>>>
>>
>>
>
>
|
|
|
Goto Forum:
Current Time: Mon Sep 22 15:35:40 EDT 2025
Powered by FUDForum. Page generated in 0.05618 seconds
|