Skip to main content


Eclipse Community Forums
Forum Search:

Search      Help    Register    Login    Home
Home » Modeling » EMF » taking advantage of Java 5.0's support for covariant return types.
taking advantage of Java 5.0's support for covariant return types. [message #414723] Tue, 20 November 2007 11:35 Go to next message
Philipp Kutter is currently offline Philipp KutterFriend
Messages: 306
Registered: July 2009
Senior Member
This is a multi-part message in MIME format.
--------------040806060903000402090203
Content-Type: text/plain; charset=ISO-8859-15; format=flowed
Content-Transfer-Encoding: 7bit

Hi, Ed.
I read the below post of Marco Pantel and your answer in the ocl group.
As you suggested, I move the discussion to the EMF group.

I would be interested in the example you give, and get it running.

Thus I have a superclass Super, and three subclasses Sub1, Sub2, Sub3.

Then I have ref1, ref2, ref3 from Super to Sub1, Sub2, Sub3, and every
subclass has a reference op1, op2, op3 to the superclass, being the
opposite of its counterpart.

(see screenshot and ecore file)

Now, what do you mean by "provide EOperations in the base that have the
same matching signature as the feature accessors"


Sorry for not getting it immediatly, and thanks for an aditional hint in
advance.

Best, Philipp



Ed Merks wrote:
> Marco,
>
> This doesn't really sound like an OCL question. Opposites must be
> properly paired. You could define "container" to be a derived volatile
> unchangeable reference in the base and implement it by reusing
> EObject.eContainer(), which is the implicit opposite of all containment
> references; the subclass references would then be unidirectional. Or
> you could define three separate bidirectional references in the derived
> classes and provide EOperations in the base that have the same matching
> signature as the feature accessors, taking advantage of Java 5.0's
> support for covariant return types.
>
>
> Marco Pantel wrote:
>> Hi everyone!
>>
>> I have an abstract superclass and three subclasses of it.
>> Each of the subclasses has got two EReferences to the superclass.
>> I declared an EReference "container : superclass" in the superclass.
>> But now the ecore-editor won't let me choose this container-reference as
>> an EOpposite to one of the subclasses' references. It says "The opposite
>> must be a feature of the reference's type".
>>
>> How can I solve this problem?
>> Do I have to declare three different types of container-references, one
>> for each subclass?
>>
>>
>> Regards, Marco
>>


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

/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAIBAQEBAQIBAQECAgICAgQDAgIC AgUEBAMEBgUG
BgYFBgYGBwkIBgcJBwYGCAsICQoKCgoKBggLDAsKDAkKCgr/2wBDAQICAgIC AgUDAwUKBwYH
CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgr/wAAR
CADbAggDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcI CQoL/8QAtRAA
AgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS 0fAkM2JyggkK
FhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1 dnd4eXqDhIWG
h4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW 19jZ2uHi4+Tl
5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcI CQoL/8QAtREA
AgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMz UvAVYnLRChYk
NOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0 dXZ3eHl6goOE
hYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU 1dbX2Nna4uPk
5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD9/KKKKACiiigAooooAKKK KACiiigAoooo
AKKKKACiiigAooooAKKKKACiiigAor4EvPhHb/H79sL9o28+IXxj+MEMXhr4 qaXo+gab4W+O
virQbCwsj4L8M3hiitNM1K3gXdc3lzKzBNzNMxJPGNz/AIYl+GH/AEWP9oD/ AMSn8ff/AC6r
0qWVYitTU4tWfr/keVWzfDUKrpyTuvT/ADPt+iviD/hiX4Yf9Fj/AGgP/Ep/ H3/y6o/4Yl+G
H/RY/wBoD/xKfx9/8uq1/sbFd4/j/kZf25hP5Zfcv8z7for4g/4Yl+GH/RY/ 2gP/ABKfx9/8
uqP+GJfhh/0WP9oD/wASn8ff/Lqj+xsV3j+P+Qf25hP5Zfcv8z7for86/iv8 Hv2ePhHdWWi6
v8Xv2j9T1rU1Z9N8PaH+054+uL25RSA8gT+3AqIuRl3ZVzwCSQKofDH4d/s6 /ErxO3gOf4mf
tM+G/EQtmuYtA8UftM+PLa5ngXbuki2a66SBdw3BXLLkEgAgnjeFhHE/V3Vh z9ru/wCRP+sG
BTtZ/h/nv5H6R0V+e3xd+Bv7NvwN8NweKPiH8df2jUjvL5bLTdP0b9oz4k6p qOo3LI8nkWlj
Y6rNc3cixRTTMkMbskME0rBY4pHWj8Gvhd+y98eP7St/AXxt/abt77SPJbUt F8V/Hj4o6BqU
EU28Q3BstU1K3uPs8rRTpHcCPypHt50V2aGVU6v7IxHNbmjf1f8Akaf21huX m5JW9F/mfovR
XxB/wxL8MP8Aosf7QH/iU/j7/wCXVH/DEvww/wCix/tAf+JT+Pv/AJdVX9jY rvH8f8if7cwn
8svuX+Z9v0V8Qf8ADEvww/6LH+0B/wCJT+Pv/l1R/wAMS/DD/osf7QH/AIlP 4+/+XVH9jYrv
H8f8g/tzCfyy+5f5n2/RXxB/wxL8MP8Aosf7QH/iU/j7/wCXVH/DEvww/wCi x/tAf+JT+Pv/
AJdUf2Niu8fx/wAg/tzCfyy+5f5n2/RXxB/wxL8MP+ix/tAf+JT+Pv8A5dUf 8MS/DD/osf7Q
H/iU/j7/AOXVH9jYrvH8f8g/tzCfyy+5f5n2/RX5mft0fs26J8HP2JfjF8Xf hx8fP2gNO8Re
FfhX4h1jQdQ/4af8czfZb22024mgl8uXWGR9siK211ZTjBBBIr9M64sVhKmE klNrXsd+ExlL
GRcoJq3cKKKK5TrCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK KKACiiigAooo
oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig D4w+EX/J2n7V
P/ZcNL/9QDwjXp9fPFxoH7SWuftaftL/APDPfxY8D+F/K+OFj/a//CZ/D281 77TnwB4N8ryf
s2raf5G3Em7d5u/emNmw79j/AIQH/gpH/wBHX/A//wAR81j/AOayvrsFKSwk Pde3l/mfF5hC
Lxs25Ja+f+R7fRXiH/CA/wDBSP8A6Ov+B/8A4j5rH/zWUf8ACA/8FI/+jr/g f/4j5rH/AM1l
dXPL+V/h/mcfJH+Zfj/ke30V4h/wgP8AwUj/AOjr/gf/AOI+ax/81lH/AAgP /BSP/o6/4H/+
I+ax/wDNZRzy/lf4f5hyR/mX4/5HMP498Q/Db9tv4q6PqfjTSPDWt+LfhjFH 8JvEHiEhLeG7
WJU8oTNlYx5wnJ6bS+T/AKxd3m11qf7VniT44/BXwz8Vf2gvDHjLxJb6211d 6b4eSO7uNEso
pd03n30LssnmW5lHLHAfZnLgN6T8Uv2Xf21fjTokfh/4n/H74DatbwSeZbGX 9n3Wklt36Fop
Y/FqyREjglGGRkHIOKp/Cf8AY9/a++B4uX+F/wAdPgNpk14At1eH4A67PcSI DkIZpvFzybAe
Qm7aCSQMk18hW4exVXMnVv7jlzb6781rXs9dE77dDCVGpKPs/ae7e+8lu1La 1n5PoumiZ2f7
c+o/CHQfCngvxR8X/iRrnw/h0zxwJtF+Kukz6fDb+Cb1tK1GH7dezanHLZRW 88Etxpga4hmU
z6pboirM8UsfgOpftG3/AIl8E+M/FPw++OPhX4h6b4P8VfC6bU/2hvh2kFst 34ej8Xh9T0rV
7yxmktpJNO02O6vr+WNra1W212RzZWcLEze/f8ID/wAFI/8Ao6/4H/8AiPms f/NZR/wgP/BS
P/o6/wCB/wD4j5rH/wA1lfUyjOUrpNfd2t3O6EqcYpNp/f3v/L/wPI+V/iR+ 1NoPxH8c3vih
/wBqLxxofwu1D9sOPRrvxJ4b1W/tIj4bHwmW7lSOYITb6PLdB7xr+HZDHFK2 pwXMO2O+Q+JH
xp8V6X8FL0/CL4z/ANufBJP2i49J0/x34k+Oeq6Vpc/hM+C1vJHk8bQ/a76K 3HigvbrdLM5a
5VdLMixMYF9++IX7Mn7f/wASfFvgXxnrv7Xvwdiuvh94qm1/Ro7T4Aaqsc1z JpOoaWyTBvFT
Fo/I1KdgFKN5iRncVDK3Vf8ACA/8FI/+jr/gf/4j5rH/AM1lZ+zqtu6e/l/n t5GvtaKtZrbz
/wDkd/M+Zfhlq3xP+Knhf4WeB4P2k76Lwd4q/aZvtL0q/wDhb8YdY8Rxz+HE 8Aard3OmL4n1
C0gudWjk1K3u3a5iaR7ORxBb3MFxp8f2X9Ca8Q/4QH/gpH/0df8AA/8A8R81 j/5rKP8AhAf+
Ckf/AEdf8D//ABHzWP8A5rK2pKVNO6b+7/MwquFRr3kvv/yPb6K8Q/4QH/gp H/0df8D/APxH
zWP/AJrKP+EB/wCCkf8A0df8D/8AxHzWP/msrTnl/K/w/wAzLkj/ADL8f8j2 +ivEP+EB/wCC
kf8A0df8D/8AxHzWP/mso/4QH/gpH/0df8D/APxHzWP/AJrKOeX8r/D/ADDk j/Mvx/yD/gpr
/wAo3P2g/wDsh/iz/wBM91X3fX5eft3eEf229L/YP+O998Xf2g/hXrnh1Pgf 4w/tDS/Dfwd1
LSr2fOh3oj8u6m8Q3aRYkKM26B9yqyjaWDr+odeBnLbqQuraH0mRpKlOzvqF FFFeMe4FFFFA
BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF FFFABRRRQAUU
UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAH58XHxY8efDD9rT9pf8A 4Qj9mTxx8Rvt
3xwsftX/AAhl/oUH9n7PAHg3b539ranZbvM3tt8rzMeU+/ZlN2x/w1f8ef8A pGV8cP8Awf8A
gX/5pa6D4Rf8naftU/8AZcNL/wDUA8I16fX12CjJ4SHvPby/yPi8wnFY2acU 9fP/ADPEP+Gr
/jz/ANIyvjh/4P8AwL/80tH/AA1f8ef+kZXxw/8AB/4F/wDmlr2+iurkl/M/ w/yOPnj/ACr8
f8zxD/hq/wCPP/SMr44f+D/wL/8ANLR/w1f8ef8ApGV8cP8Awf8AgX/5pa9v oo5JfzP8P8g5
4/yr8f8AM8Q/4av+PP8A0jK+OH/g/wDAv/zS0f8ADV/x5/6RlfHD/wAH/gX/ AOaWvb6KOSX8
z/D/ACDnj/Kvx/zPEP8Ahq/48/8ASMr44f8Ag/8AAv8A80tH/DV/x5/6RlfH D/wf+Bf/AJpa
9voo5JfzP8P8g54/yr8f8zxD/hq/48/9Iyvjh/4P/Av/AM0tH/DV/wAef+kZ Xxw/8H/gX/5p
a9voo5JfzP8AD/IOeP8AKvx/zPEP+Gr/AI8/9Iyvjh/4P/Av/wA0tH/DV/x5 /wCkZXxw/wDB
/wCBf/mlr2+ijkl/M/w/yDnj/Kvx/wAzxD/hq/48/wDSMr44f+D/AMC//NLR /wANX/Hn/pGV
8cP/AAf+Bf8A5pa9voo5JfzP8P8AIOeP8q/H/M8Q/wCGr/jz/wBIyvjh/wCD /wAC/wDzS0f8
NX/Hn/pGV8cP/B/4F/8Amlr2+ijkl/M/w/yDnj/Kvx/zPjz9u79oP4t+OP2D /jv4W8T/ALC/
xU8G2N18D/GHn+JPEmr+E5bKz26HeuvmLp+uXNwd7KI18uF/mdS21dzr+odf CH/BTX/lG5+0
H/2Q/wAWf+me6r7vrwM5TVSF3fQ+kyNp0p2VtQooorxj3AooooAKKKKACiii gAooooAKKKKA
CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK KKKACiiigAoo
ooAKKKKACiiigAooooA8f+KX/BPb9gX44+O774pfGv8AYe+D/jDxPqnlf2n4 j8U/DTStQv7v
y4khj824nt3kk2RRxxruY7VRVGAAKwP+HTv/AASy/wCkaf7P/wD4ZvQ//kWv f6KAPAP+HTv/
AASy/wCkaf7P/wD4ZvQ//kWj/h07/wAEsv8ApGn+z/8A+Gb0P/5Fr3+igDwD /h07/wAEsv8A
pGn+z/8A+Gb0P/5Fo/4dO/8ABLL/AKRp/s//APhm9D/+Ra9x8T+J/DXgnw1q PjPxn4hsdI0f
SLGa91bVtUu0t7aytokMks80shCRxoiszOxCqqkkgCvHP+FY/wDDaP8AxUn7 RXw8/wCLX/e8
MfCzxVpP/Id/uarrtnOv0e00uZf9G+W5u0+2+RBpXpYHAQxEHXxE/Z0Y6OVr tv8AljG8eaXW
10ktW0iJStotWeHeGP8AgmJ/wTX/AGrPEuneM/Bn/BPT4HaR8JtIvob3SdW0 v4TaNb3Pj65i
cSRTwyx2wePQ0dVZXUhtVZQQRpo/4m3sf/Dp3/gll/0jT/Z//wDDN6H/APIt e/0VnjsZDFTU
aUOSnHSMd3bq5Ssuact5SsuiiowjGEXGPLu7v+v6/wCCeAf8Onf+CWX/AEjT /Z//APDN6H/8
i145+03/AMExP+Ca+gfGv9nbStC/4J6fA6ytdb+Md9Za1bWnwm0aOO/tl8F+ J7lYJ1W2AljE
9vBKEbKiSCN8bkUj7irw79tP/imtf+CPxmvvn0vwV8cdL/tWCHm4l/tqw1Hw ta+UpwrbL7X7
OSTcy7YIp2Xe6pFJ6HDcI1c19k1dzp1oRXec6M4wS83NxS82iK11C/mvuur/ AIFH/h07/wAE
sv8ApGn+z/8A+Gb0P/5Fo/4dO/8ABLL/AKRp/s//APhm9D/+Ra9/orwTU+R/ jN/wRm/4J+az
/Zvj34M/sBfs/wBj4o8O+c1no+q/CrSk0XX7eXYZrC+jSzfyt/lIYr6ON57O RQ6rPA91ZXZ8
Gf2BP+CWXxK/tLwh4v8A+CV/7P8A4a8c+GvJTxb4Sk+E+h3H2Xzd/kXlrP8A Yk+2afceVKbe
7CJv8qWKWOC5t7q1g+uK4f4zfArSfi9/Zuuad411zwd4q0Pzl8P+OPChtRqW nRT7Bc24F5Bc
W09vOscfmW9xDLEXhgmCLPbW80XsYXE4TE0FhMWlFL4KlneF3e0kr81Ntu9k 5xvzQ5rOnPOS
knzR+7+uv4fmvOP+HTv/AASy/wCkaf7P/wD4ZvQ//kWj/h07/wAEsv8ApGn+ z/8A+Gb0P/5F
ruPhB8X/ABLfeJZ/gd8cbGx0z4gaZYteI+nRPHp3ijTkdIzq2miR3dYw8kSX Fo7vNYzTRxyP
NDPZ3l56PXDjMHWwNb2dT1TWqkntKL6p9H+uhUZKSujwD/h07/wSy/6Rp/s/ /wDhm9D/APkW
j/h07/wSy/6Rp/s//wDhm9D/APkWvf6K5SjwD/h07/wSy/6Rp/s//wDhm9D/ APkWvf6KKACi
iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK KACiiigAoooo
AKKKKACiiigAooooAKKKKACiiigAooooAKKKKAPnL4K/tufEr4kXPwq8aeMv gXoei+Afjns/
4VjrGmeOZr/WD5+jXeuWv9qae+nQQ2W6wsbjzPIvLvy7gxRL5sbNcJR/Zt/b z+LPxk0P4M/E
b4mfsx2Pgzwn8dbG2XwVLD49Gp6tBfyaHdazi8tEs44IrN7awvDFPHdSzsGt PNtbd5p47Xqv
hN+wr4U+FGv+DnHxq8c6/wCF/hrn/hV/gLXDpQ03wptsJ9Ng+zzWthDfXPk6 fc3Non226udy
TGSTzJ1SZOH/AGCf2Ctf+DfwK+BifGv4l+ObzVPht4G0mSx+HWuazYXum+Fv ER0Q6fezW91F
AbyfC3epQpDLe3FnEl0VgiRIbUQfqOKfh9PBYupQhBNJKmr1+a8limnFOesl /s3tXOLppqfK
1eKnwx+tqUU367f3fL/Fbr+nVfsNxfETRfG/x88A/ET44eKvH8nhr4x21lpm t+L3sxcx20nh
Dw3d+Qsdjb21rDGst1MwSGCNSzs7BpHkkfc/bv8AE/iXwx+z9BH4X8Q32lya 98R/BXhzULzS
7t7a5Gnar4p0rTL6OGeMrLbyPaXdxGs8TJNEziSJ45ER17n4efCDw18NfF3j vxnoV9fS3XxC
8VQ+INaju5UaOG5j0nTtKVIAqKVj8jTIGIYu3mPIdwUqqnxq+EHhr46fDu5+ Hfii+vrON76x
1HT9T0uVFudN1GxvIb6xvYfMR4mkgu7e3nVJY5IXaILLHLGzxt8083y+rxVh cfOK9lF4dzSi
kvchTVS0ElG3NGVkkk+iN/ZyVCUVvr+tjzj9jGbVtD8UfGn4NN4p1zVND+H3 xVg0fwp/wkmv
3WrXttZT+F9A1SSKS+vZJbq6/wBL1G8dWnlkZFkWJSsUccaUf2m4viJoH7Wv 7O3iXQvjh4qs
tB1v4j32h614DtHs49Jv1Xwj4nvVuZytuLuWQS28GImuDbAwRv5Hmoso7j4Q fs6Q/B+Ge6sf
i54q1nWNZ8VN4g8beIdZTTftPiq5/s1NNiS7S3s4oII4ra3sFUWUVqxbT4Wd nMlz59/W/gVp
Piy5+GmreMvGuuatqnww1z+2NO1a5NrFLq16dGv9IklvEggSI74dSuJSsCQK JQhUKgMZ6Kma
5fDOquK54zUqMqbbjdyqPDypup70d5VV7Tndp++pO0udRnkm6ajtrf5Xvb7t LbHcVh/Ej4ke
C/hH4LvfiD8QdZ+w6XY+WskiW0k8s0ssiwwW8EEKtLc3E00kcMNvEryzSyxx Ro7uqk+JHxI8
F/CPwXe/EH4g6z9h0ux8tZJEtpJ5ZpZZFhgt4IIVaW5uJppI4YbeJXlmllji jR3dVPDfDf4b
+NPiJ40sv2g/2g9G+w6pY+Y3gTwI9zHPF4QiljaJ7id4maK51iaGR45riNni tYpZLO0d0e8v
NR+fwWCpSpPF4tuNGLtppKclZ8kLpq9mnObTjTi02pSlCE9pSd+WO/5f1+P3 tUfDHg34iftF
+JdO+JP7QXw+vvCXhvQb6G88KfC7V7yzubmTUYHDpq2rvZTz2sskMqh7K0im mhgZEvZXkuzb
R6X7HRRWOOx9THTXuqEI6RhG/LFeV23ru225Pq2OMVFBRRXK/CD47fBD9oPw 1P4z+Afxk8K+
ONHtb5rK51bwh4httTtorlUSRoGltndFkCSRsUJ3BZFOMMM88MPiKlGVaMG4 RspNJ2Td7Xey
vZ2vvZ2HdJ2Oqrw7/goV/wAkF0D/ALLj8Mf/AFO9Br2PxD4n8NeEbCPVfFfi Gx0u1lvrWyiu
dRu0gje5uZ47a2gDOQDJLPLFFGn3nkkRFBZgD45/wUK/5ILoH/Zcfhj/AOp3 oNe5wnCa4ny+
VtHXpK/S6nG/3XX3ozr/AMGXo/yPcaKKK+dNQooooA5X4v8AwV+Hfx08NQeF /iJpt88dnfLe
6ZqGja5eaVqOm3Ko8fn2l9Yyw3VpI0Us0LPDKjPDPNExaOWRG4bwx8cL/wCB viXTvgj+1d47
sYrrVL6Gw+H/AMRNUeCxtvGUkjiOGwmChIbfXAWUNaxqkd6ubmzRVF1Zad7H VHxP4Y8NeNvD
Wo+DPGfh6x1fR9XsZrLVtJ1S0S4tr22lQxywTRSApJG6MysjAqysQQQa9bB5 jBUfqmMTnQ3S
TtKDf2qbd0r/AG425Zre0ownDOUNeaOj/P1/rT7071ecftF/G7xL8IYfCPhr 4e+BbHxF4s8f
eKm8P+FdO1nXX0zTvtMem32qSvd3cVtdSwRi00262mO3mZpjChVEd5Y+V/4T 3xp+x9/xT3xZ
h1zxJ8Lbb95YfFC5v47m48IWQ4MHiB55hc3FvExjCatGs7CAvJqRh+xzaneX v2t/BvxE1HWP
hV8XPh38Pr7xbJ8M/iPN4g1Pwvo15ZwajqVtP4e1nSNlo19Pb2pkSXVIZmE0 8K+TDMVZ5BHF
J6WAynDUczp/WHGdCcajhJy5YTlGDcIzlzR5Hz8inGUoyipJtqMoycTqScHy 6PT8/wAdL2Or
/Z0+M3/C+vhZF49uPDf9j31vrmsaFrempefaYoNS0rU7rS71YJikZnt/tVnO YZWjieSIxu8U
LM0SYR/aT1+L9six/ZQ1D4G65p9jqHgbV/EWnePL/VLD7Fqf2C40aGSC1t4J 5bn5W1cCR7lL
ba0AEazrIZI8P9mHQ/in8CvgdcaT4n+C+uX2qatrnjnxsdJ0rUNMaWzbUvEV 5q9nosry3iRH
UHh1IRFo3eyWW0uA12E8mSbc8X/Dfxpqn7b3w8+L9jo3meHdD+FXjLR9V1H7 TGPIvb7UvDE9
rF5ZbzG3x6deNuVSq+ThipdA288Jk1HP8ZTtB4drEqk/aXtyRm6TTU7tuUYx jz8ympaKTaaS
lUdKL1v7t9PS/wDXQ9Voor4B/wCFS6B/wnH2H/hmrXP+Gkf+Gjf7W/4Wh/wq u/8AtH/CJf8A
Cc/bdn/CW/ZPsn2f/hEv9F+y/bc+R/xLfL8z/Ra5OH8hpZ37TnquHK4rSPNZ S5r1J+9Hko07
L2lTXk5o6alVarp20/rt6voj7+ryq0/as0n/AIXRp/wk8R/BvxzoNjr2uXmh +EvGuuafawab
r+q2ttc3M9pbw/aTqEeIbG/kS4uLSG1mSzLwzSLPatP8V/BvwD8O/Ed1eT/D /wDZs8VD41D9
rjXb3R/iXN4OvLqOPw5b/E+7l1dLPxAqy22kWZ02LVreXTXuLR7iR7vFrKdS SS8+jvHGoTfF
P9uD4aX/AIQ+F/xHste8FeKtSi8bnxPompDw9b+H10bWoYNQsZpd+jSXk95d 6btnsXOqra3U
1vN5USX1vH9PiODsDlWIxFGrKVTlhX1lFQcXSi3GolGpK9Oc7U4zldcylTcF NxccFiJVIprT
Vee/TbdLW3z2PpuiiivzQ7QooooAKKKKACiiigAooooAKKKKACiiigAooooA KKKKACiiigAo
oooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACuV +L/xf8NfBrw1
BrWtWN9qeoanfLp3hrw1o0SSajr2oujvHZWkbuiNIUjlkZ5HSGCGGa4nkhgg mmjo/Gb9ob4a
/A/+zdG8Sap9u8UeIvOj8GeBdKnhfWvE9xFs3w2NtJInm7PNjaWZmSC2jYz3 MsECSSrQ+EHw
g8S2PiWf44/HG+sdT+IGp2LWaJp0ryad4X053SQ6TppkRHaMvHE9xduiTX00 MckiQwwWdnZ+
xhcBTo0FjMamqb+GOzqNO1ov+VNWlLp8K97bOUm3yx3/ACKPw3+BXjTUvGll 8cP2kPGv9veK
LXzJ/D/haxMZ8P8AguWaNoZRp37iKe7uDbt5D6hdlpWD3X2aPT4L2ezPqtFF ceNx1fH1VOpZ
JK0UklGK1doxWiV22+rk3KTcm26jFQWgUUUVxlHh3/BTr/lGx+0L/wBkO8Wf +me6o8A/8pJ/
iz/2Q74e/wDp48aV7jXD+Av2Yv2a/hV4Lf4b/C/9nrwN4b8Oya5b61JoGgeE 7Ozsm1KCSCWC
9MEMaxm4jktrZ0mxvVreJgQY1I+owOd4Wjw9Vy6rGXNJys0k1ac8PKTd2tY/ V0ktebnd3Hl9
7GVOTqqa/rf/ADPKv+ClHwx+Gvir4c+AfiR4n+Hmh6l4i8KfHH4d/wDCL6/f 6TDNe6P9p8b6
BFc/ZZ3UyW/mxgJJ5ZXeoCtkDFbn/BRz/iV/sia98SLjmx+HWueH/H+txJzL Ppvh3XLDXb2G
AHhrh7XTp0hViiNK0au8alnX1X/hWPw1/sD/AIRX/hXmh/2X/bn9tf2b/ZMP 2f8AtL7f/aP2
3y9u37R9u/0vzsb/AD/3ud/zV5V/wU6/5RsftC/9kO8Wf+me6r0OHcz9vmeU 4C8mqWK5ot/y
znRskrvl1hKTSdry73ZFWFoTl3X5XPca+cvgr+258SviRc/Crxp4y+Beh6L4 B+Oez/hWOsaZ
45mv9YPn6Nd65a/2pp76dBDZbrCxuPM8i8u/LuDFEvmxs1wn0bXh3wm/YV8K fCjX/Bzj41eO
df8AC/w1z/wq/wABa4dKGm+FNthPpsH2ea1sIb658nT7m5tE+23VzuSYySeZ OqTJ5eSzyCOA
xSx8U6nL+7vz3T5Ki93kajze0dJv2nu8in1sndRVeePJt127r9L7HK/s2/t5 /Fn4yaH8GfiN
8TP2Y7HwZ4T+OtjbL4Klh8ejU9Wgv5NDutZxeWiWccEVm9tYXhinjupZ2DWn m2tu808dqfsl
eBvHfh/43vceGfjd4q8c6DpHhW90j4veLvEWvX1xp3ifxwlzZDztHs7m4uId NjtTFrCXVvYC
CzimvobRfPlsJorGj+wT+wVr/wAG/gV8DE+NfxL8c3mqfDbwNpMlj8Otc1mw vdN8LeIjoh0+
9mt7qKA3k+Fu9ShSGW9uLOJLorBEiQ2og9G/ZS/ZI1j9lDw1ovw90r9qv4j+ MPCfhrwrbeH/
AA74V8X2nh4W2n21ukMVu6y6fpNrdSSRxQiMGWZ1ZXYsrPtdfrc+xfC+Bq4+ hk9SnGD91QSq
yhUXPWs1KXtG5QpulZOapOp+8jKTpwkc9KNeSi6if4aaL0636Xtp1Z7HRRRX 5cdwV4d/YHxK
/Y9/c/CzwR/wlHwft/38/hfTppm1rwTbjh4tHtI4JP7U09dwlTTg8U9nHDND ZC8R7LTbb3Gi
vQwOPlg+anOCnSnbmg72dr2aas4yjd8slqruLvCU4yiUObVaMo+GPE/hrxt4 a07xn4M8Q2Or
6Pq9jDe6Tq2l3aXFte20qCSKeGWMlJI3RlZXUlWVgQSDV6vHPE/wg+InwV8S 6j8XP2ar6+v9
Pu76bUfEvwbeWzi07V5p3Ml7e6ZNKiPp+qSviYI066fczeeZo4J76bVIvR/h v8SPBfxc8F2X
xB+H2s/btLvvMWOR7aSCWGWKRoZ7eeCZVltriGaOSGa3lVJYZYpIpER0ZRpj cBTpUlicNPno
t2v1hJ3ahNdJWTaavGaUuVtxnGJGbb5ZaP8ArY3KKKK8ssw/h78N/Bfwq0C4 8MeAtG+wWN1r
mqaxPB9pkl3Xuo38+oXku6RmI8y6uZ5NoO1d+1AqhVG5RRWlarVxFWVWrJyl Jttt3bb1bber
berbEkkrIKKKKzGFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUU UUAFFFFABRRR
QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABXD/ABm+M3/Ctf7N 8IeEPDf/AAkv
jnxL5yeEvCUd59n+1eVs8+8up9j/AGPT7fzYjcXZR9nmxRRRz3Nxa2s9D4v/ ABu8S+G/EsHw
j+B3gWx8ZfEC6sV1F9E1HXX0zTtJ04u6C91K9jtrl7SOV4pYbdEgmmuZo5BH H5NteXFrf+DP
wZ/4Vr/aXi/xf4k/4SXxz4l8l/Fvi2Sz+z/avK3+RZ2sG9/sen2/myi3tA77 PNlllknubi6u
p/aw+Co4KjHF45XT1hTvrPzlZ80Ka6vSU/hpte9Up5uTk+WP39v+D+XXsz4M /Bn/AIVr/aXi
/wAX+JP+El8c+JfJfxb4tks/s/2ryt/kWdrBvf7Hp9v5sot7QO+zzZZZZJ7m 4urqfuKKK83F
Yqvja7rVneT9EkkrJJKyUUklGKSUUkkkkkXGKirIKKKK5xhRRRQAUUUUAFeH f8FOv+UbH7Qv
/ZDvFn/pnuq9xrzj9sT4QeJf2g/2Rvin8A/Bl9Y2useOPhxrnh/SbnVJXS2i ubywmtonmaNH
dYw8iliqswUHCk8H2uG8RRwnEWDr1pcsIVacm3skppt/JGdZOVKSXZno9Fcr 8Cfi/wCGv2g/
gh4N+PngyxvrXR/HHhXTvEGk22qRIlzFbXltHcxJMsbuiyBJFDBWZQwOGI5P VV5eIw9bCYid
CtHlnBuLT3TTs18mWmpK6CiiisRhRRRQAUUUUAFeVfEj9nn+zvGl7+0N+zjp eh+H/iVc+W2u
TzQfZrLxvbxRrGlhrLwxtI+2NFW2vtks9gwzGs1vJd2V36rRXZgsficvqudF 7q0l0lF2bjJd
Yuy0fVJrVJkyipqzOH+DP7Q3w1+OH9paN4b1T7D4o8O+TH4z8C6rPCmteGLi XfshvraOR/K3
+VI0Uys8FzGontpZ4HjlbuK4f4zfBn/hZX9m+L/CHiT/AIRrxz4a85/CXi2O z+0fZfN2efZ3
UG9Ptmn3HlRC4tC6b/Kilikgube1uoKHwg+Pt/418Sz/AAr+K/w0vvAnjqzs WvDoGoahBd22
sWkbpDNqGlXcLYvLNZ3VD5iW93Es1s11aWv2u3EndiMDh8XRlisArRj8dNtO UPNbOdN78yV4
axqacs6kqTi+WX3/ANbP8+nZej0UUV4poFFFFABRRRQAUUUUAFFFFABRRRQA UUUUAFFFFABR
RRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFF FABXnHxf+L/i
Wx8SwfA74HWNjqfxA1OxW8d9RieTTvC+nO7xjVtSEbo7Rl45Ut7RHSa+mhkj jeGGC8vLOj8S
PiR40+InjS9/Z8/Z81n7Dqlj5a+O/HaW0c8XhCKWNZUt4ElVornWJoZEkht5 FeK1iljvLtHR
7Oz1Hq/hB8IPDXwa8NT6Lot9fanqGp3zaj4l8S6zKkmo69qLoiSXt3IiIjSF I4o1SNEhghhh
t4I4YIIYY/co4ahltKOIxaUptJwpO+z1jOp0UWtYxvzTVpNKnKMpZuTm7R27 /wCX9fiHwg+E
Hhr4NeGp9F0W+vtT1DU75tR8S+JdZlSTUde1F0RJL27kRERpCkcUapGiQwQw w28EcMEEMMfV
UUV5OIxFbFVpVasuaUt3/X4LZLRFpKKsgooorEYUUUUAFFFFABRRRQAUUUUA eHf8Exf+UbH7
PX/ZDvCf/pnta9xrw7/gmL/yjY/Z6/7Id4T/APTPa17jX0HFn/JU4/8A6/Vf /S5GOH/gQ9F+
QUUUV8+bBRRRQAUUUUAFFFFABXK/F/4QeGvjL4ag0XWr6+0zUNMvl1Hw14l0 aVI9R0HUUR0j
vbSR0dFkCSSxskiPDPDNNbzxzQTzQydVRW2HxFbC1o1aUuWUdn/X4rZrRiaU lZnlXw3+K/xK
8H+NLL4H/tQ3Oht4i1fzH8IeMPDelTafo/inZG001nHbz3FzJY6hBGkjtaPc TfaLeJrqCRxH
e29h6rWH8SPhv4L+Lngu9+H3xB0b7dpd95bSRpcyQSwyxSLNBcQTwssttcQz RxzQ3ETJLDLF
HLG6OisPOPDHjL4ifs6eJdO+G37QXxBvvFvhvXr6Gz8KfFHV7OztrmPUZ3CJ pOrpZQQWsUk0
rBLK7ihhhnZ0spUjuxbSap7E6FHOYOth0o1lrKmlZT7ypJKy6uVPRJ60rxfs 6Wabp6Pbv/n/
AJ/f3fsdFFFeCahRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFF FABRRRQAUUUU
AFFFFABRRVHxP4n8NeCfDWo+M/GfiGx0jR9IsZr3VtW1S7S3trK2iQySzzSy EJHGiKzM7EKq
qSSAKqEJ1JqMVdvRJbthsXqK84+Iv7Yn7I3wfsLHVfi1+1N8OPC1rql9qFlp tz4j8cWFjHd3
NhP9mvoImmmUSSW8/wC6mRctFJ8jhW4rlfFf7cPhSy/aU8V/stfDHwf/AMJ5 4w8D+BrDxF4h
8KeG/FWlRa0/228EEEFta3tzBE3lQh7m6eee38iO507y1uDeqI/YwvDueYuP NDDyUUpScpLk
ioxlGEm5ytFKM5RjJt2i2k7Gcq1KO7/rc9xorh/2YvjN/wANHfs1/D39ob/h G/7G/wCE88Da
T4i/sf7Z9o+w/bbOK58jzdiebs83bv2Lu252rnA5T4/fE/43r8b/AAZ+zf8A APX/AAr4f1jx
N4V1/wAS3Pibxf4ZudatobbSrnSLVrNbO2vrF/MmfWY5BObjbGtoyeVIZg8W dHJsXUzWeX1G
oThz8/M7qPs1KU23FSb5VGXwqTdtL6A6kVTU1qnb8dj2OiuH/Zi+M3/DR37N fw9/aG/4Rv8A
sb/hPPA2k+Iv7H+2faPsP22ziufI83Ynm7PN279i7tudq5wOU+EPxu+N/in9 rn4n/AP4p+Bf
Cuj6P4T8K+Hda8JXPh/XbnULnULbUb/X7bzrxpra3S3kKaVCfs0ayrEzSf6T OHURjyTMIvFx
mknhf4ico3X7yNKyV/etOST5bpLXYPaQfLb7W33XPY6KKK8k0CvHPE/xwv8A 45eJdR+CP7KP
juxlutLvprD4gfETS3gvrbwbJG5jmsIQweG41wlWC2sivHZLi5vEZTa2Woni fxP4l/ab8S6j
8KPhR4hvtI8D6RfTWHj3x7pF29vc6hcxOY59D0ieMh45EdWivdRjIa1ZXtbV hfCefSvVfDHh
jw14J8Nad4M8GeHrHSNH0ixhstJ0nS7RLe2sraJBHFBDFGAkcaIqqqKAqqoA AAr3oUsPk0FU
xEeeu9YwdnGHaVSLT5n1jTdls6ilG9OWTbqaLb+tv8/u7lH4b/DfwX8I/Bdl 8Pvh9o32HS7H
zGjje5knlmllkaae4nnmZpbm4mmkkmmuJWeWaWWSWR3d2Y7lFFeLWq1cRVlV qycpSbbbd229
W23q23q2zRJJWQUUUVmMKKKKACiiigAooooAKKK+ZP2vf2tfjf8AB/xL8TLr 4WReFYtH+CPw
ctPiP4tsPEGi3N5c+Krad9bP9mWc8N3AmlSKmgzL9qkivlLX0beQBbss/rZN k2MzzF/V8PZP
TVuyXNKMIrRN+9OcYrSyck5WipSWdSpGnG7/AK/pH03RRXjn7JHxu+N/xe1j 4q+Gvj54F8K+
HdY8A/EeHw/bad4Q1251O2+zSeHtG1RXa7uba1eeQvqUmSLeFVUKm1yhlk58 Nl+IxeEr4inb
lopOV2k7SkoK0b3esldpWV1dq6vTmoySfUo/8E1/+JX+wz8OPhvcc33w60Nv AGtypzFPqXh2
eXQr2aAnlrd7rTp3hZgjtE0bOkbFkX3GvDv+Cev/ACQXX/8AsuPxO/8AU716 vHPE37fH7TWg
/DtPGOt6V4V02PxZ8f8AxN8OPBF34f8Ah9r3iu5sLbRrzxKX1O80rTpUur6S aLRI7X7LbMiw
MZL953jc2Nv9fmXDuY59xTmP1W3u4iad7396VSWkUnKVownJqKcmo2ipSaT5 4VoUqEObsv0/
zPtSivg/UvjH+01+0b43+Amj+LZLHTdHsP2m5dK1ibxL8Fte8Pw+OLa08IXu vW19DpOrXkc9
lHbXMU8Efnm6X+0NNtdQjdRbC1f0f9iL9nn4a+HfiVY/Gz9nPS/sPga28DT6 Ff8AjS4ghGpf
GXUpZrGUeKdRlgji+3+V9kuRBqM4d759Y1C4hWO2eG41CMw4MhlOBdXGYnlq cnOoqEuXWVSM
IylJxcZz9neMFCU4pv2kYKFVwIYn2krRWnr6flff7r3V/qmiiivhTqCiiigA ooooAKKKKACq
Pifwx4a8beGtR8GeM/D1jq+j6vYzWWraTqlolxbXttKhjlgmikBSSN0ZlZGB VlYggg1eoqoT
nTmpRdmtU1umG54d5OrfsS/6PoPhbXNc+Dkny2WieGNAutV1LwJKeEt7Sys4 5bm80eRsJHbw
RyS6a7KiI2nsF0n2Pwx4n8NeNvDWneM/BniGx1fR9XsYb3SdW0u7S4tr22lQ SRTwyxkpJG6M
rK6kqysCCQavV454n8G/ET9nTxLqPxJ/Z9+H194t8N69fTXniv4XaReWdtcx 6jO5d9W0h72e
C1ikmlYve2ks0MM7O97E8d2LmPVPe9pQz3+K1DE/zykowqf427KNR9ajkozt edpuU55WdLbb
8vTy8v00PY6Kw/hv8SPBfxc8F2XxB+H2s/btLvvMWOR7aSCWGWKRoZ7eeCZV ltriGaOSGa3l
VJYZYpIpER0ZRuV4dalVw9WVKrFxlFtNNWaa0aaeqaejTNE01dBRXnH7Rf7S 3hr9m+HwjHrX
gLxV4l1Dxz4qbw54a0fwhpaXdzcaj/Zt9fxxsHkjSKN0sJYzPIywws6yTvDA s08XK/8ADdXh
T/hK/L/4Ur45/wCEG/4Tn/hD/wDha2NK/sX+2v7V/sX7L9n+3/2p/wAhf/iX +Z9h8vzP3u/7
N/pNethuHs5xeHhXpUrwnflbcVzNNx5Y3a5ptpqMI3nNxlyxfK7Q61OLs3/X 9dT3Givjn4af
G39of9oX9njxL8e/iH8R/ir8IdO0j4q+KdMuNG8E/DvSPEWu/Z7DV/7Hsrez htLfWd9un2ec
3ga3nne+8+WC4g0+GNJvo79mLx740+Kv7Nfw9+KHxIh0OPxF4k8DaTqmvx+G L+O601b24s4p
pxaTxTTRzW4kdvLkSWVWTaRI4IY9WccMYzJaU51qkJOFR0pKLk+Wau2ublUJ WS1dOU+W8ea3
MrzTrRqNWT1V/l/Xc7iivkf4m/Hv48aX8WfHfxG0X4tX1lo/w7+P/gb4c2vg GHStPbSdXsNb
HhYXV7eSSWzX/wBsj/4SO5MRt7qCAGztN8MgE4uPqrxPb+Jbvw1qNr4M1axs NYlsZk0m/wBU
057y2trkoRFJNBHNC88avtZo1liZ1BUSITuHPmOQ4jLKOHq1akXGqk7rm928 KdS0rxWqhVg3
y8y1sm2mioVVNtJbf8FfoXqK8c/YQ+IPxZ+JX7P0+u/HHxhY694msPiP410S /wBV0vRhp1tN
HpvinVdPgENsJJDDGsFrEiq8ksm1R5ksr7pG9jrhzPAVMqzKvgqklKVKcoNx vytxk4tq6Ts7
XV0nbdJ6FQmqkFJddQooorhKCiiigAooooAKKKKACiiigAooooAKKKKACvKv 26/hv40+Mn7E
Xxk+EHw30b+0vEXiv4VeIdH0DTvtMcP2q9udNuIIIvMlZY03SOq7nZVGckgA mvVaK7MuxtXL
Mwo4ykk5UpRmk9rxaavZp2utbNepM4qcXF9T45+P/wCzz8evhd+0o/xI/Zn0 v4q6V4PvvhV4
c8JadoHwBg8CQf2d/Y95rMqx3UHiqNYobcQ6pAlstiTjyrlZlQLblu5/Y0/Z g8afs5/Er+zL
7w79m8O6R+zl8N/BWlXf9vR6hvvdFm8RC6g84Q20k3lx3tmfPa2t1l87KxoQ 8cf0bRX0mL41
zPG5PLL6lOnacYQnNRaqTVNxcHOXNaUoqCim1onLq7mMcNCNTnTf6K/Y8q/Y U+G/jT4N/sRf
Bv4QfEjRv7N8ReFPhV4e0fX9O+0xzfZb22023gni8yJmjfbIjLuRmU4yCQQa o/H74YfG9vjf
4M/aQ+AegeFfEGseGfCuv+Grnwz4v8TXOi201tqtzpF014t5bWN8/mQvo0cY gNvtkW7Z/NjM
ISX2OivJWeYn+2quZShFyqOo5R15Wqqkpx0kpJNSaVpcy6O+pp7KPs1Dtb8N jyr9nz4UfEr9
mr4A+BP2c/D1tofiOx8A+BvC/h228QXuqzafLqX2VVs9Qna2W3nFvstYo7iB BNJ58sjQO1uq
C4e94Y+EHiXRf2ufHHx8ur6xbR/Evw48K+H7C2jlc3Mdzpl/4huZ3kUoEEbJ q1sEIYsWSXcq
gKX9HorOtnOLrzxFSVubEX9o7ayvOFRu17K84KWiS1aWlkhU4pJLpt+QV4d/ wl/xK/a9/wBB
+Fl3/wAI78H77if4i6drk0GteK7dfvx6OkcY+yafcbgqayJxPJHFM1lCiXFl q6n/ACfF/wBk
O/8AVl//AIP/APp3/wCwZ/yF/ca6rU8h0nFSxXZ7UfVda3eLvGltJOq2qK1q 7fD+f/A/P03o
+GPDHhrwT4a07wZ4M8PWOkaPpFjDZaTpOl2iW9tZW0SCOKCGKMBI40RVVUUB VVQAABV6iivB
nOdSblJ3b1be7ZrsFFFFSAUUUUAFFFFABRRRQAUUUUAFfMn7Xv7JXxv+MHiX 4mWvwsl8Ky6P
8bvg5afDjxbf+INaubO58K20D62P7Ts4IbSdNVkZNemb7LJLYqGsY188i4Zo PpuivWybOcZk
eL+sYezemjV0+WUZxejT92cIyWtm4pSvFyi86lONSNn/AF/SMP8AtD4lf2/9 n/4RPQ/7L/tz
yvtn/CQzfaP7N+wb/tPk/ZNv2j7d+4+z+Zs8j/SPP3/6LXKfBD4QeJfhr8TP jF4z12+sZbX4
hfEe18QaLHaSu0kNtH4a0PSmScMihZPP0ydgFLr5bxncGLKvo9Fc9PH1KNKp TpRUVUgoS3d0
pxnfVuzcoRvaytskU4ptN9Dw7/gnr/yQXX/+y4/E7/1O9erqtc/ZN+A+v/Ds /DCfwpfWemr4
q1HxLZ3OjeJdQ0/UbDVr+8u7u8vLTULWeO7s5JZb69VjBKgMN3NBjyZGiPK/ sLf8U1oHxO+D
N98+qeCvjj4r/tWeHm3l/tq/bxTa+UxwzbLHX7OOTcq7Z4p1XeipLJ7jXucR Y7G4TibF1cNV
lBTqurFxk1dScpU5qzW8J3i90pPuzKjGMqMVJbK3+a/A848G/sm/AfwJD4fG ieFL6e68M+Kp
vEum6vrPiXUNR1GbVpdNuNLa8u727nkuL+QWFzJaqbmSUJCsKIFWCER0f2ef 2Mvgd+yz9lt/
gzN45tbGw0NNH03RNc+K/iLWdNsbJPLEcVvZajfz21vsWJERo41ZEBRSFZlP qtFeXUz7PatK
pTniqjjUspJzk1JJya5lezs5yavezlJ9Xe1SpJpqK08goooryTQKKKKACiii gAooooAKKKKA
CiiigDyr4kfBn4laF40vfjR+y94k0PR/EWqeW3i/w34ks5pNH8W+TGqQvI0D iTTtQ8uKO1XU
0S4xb7UntL4Wtklt1fwg+L/hr4y+Gp9a0WxvtM1DTL5tO8S+GtZiSPUdB1FE R5LK7jR3RZAk
kUivG7wzwzQ3EEk0E8M0nVV5x8X/ANnew8e+JYPi14A8WX3hD4h6ZYrb6T4o 0+4na2uY43d4
rXVbCOaKHV7NTLcKIZ/3kC3ly9pNZ3Ev2lfco4zDZhSjh8fLlcUlCpa7SWij Ut70oJWSfvTh
FJQjKKUDJxcHeP3f5ef5/iX/AIs/Bn/haHj34Y+N/wDhJPsP/CuPHNx4i+y/ Y/N/tHzdB1bS
fI3b18nH9qedvw+fI2bRv3r8/wDh7/glP4E8MftCSfFnTdH+Dkuny/Ee68aN rWo/AaxvPHAv
7jVJNWkjHiCe5eJYxdyNFG4sBPFZhIo5UnRL1foD4M/Gb/hZX9peEPF/hv8A 4Rrxz4a8lPFv
hKS8+0fZfN3+ReWs+xPtmn3HlSm3uwib/Kliljgube6tYO4ruo8Q8T8O82Dp 1eRcnI1aEk4N
ymrOzUk3UlKM03eMrxk4tEujQre81fr89v02PDtA/Zr+P3wn8BL4a/Z//aO0 PSr6Txz4t12/
Hiv4etqum3cWua9d6wIzbwX9pcpcWrXIgjmW7ETo07SW7M8JtvR/gT8IPDX7 PnwQ8G/APwZf
X11o/gfwrp3h/SbnVJUe5ltrO2jtonmaNERpCkaliqqpYnCgcDqqK8vHZ3mW Y0pU68k1KbqS
tCEXKbcnzScYpytzy5btqKbUUloXGlCDuvQ8A8b/ALFXiXxX8Wdc1mw+L1ja eBfF/wAR/D3j
zxd4cm8LPNq0uuaKNJ+xiz1EXaQ21mx0LTDLDJZ3ErD7WFnj86I2/sejaf8A EqDVoJvEPizQ
7qxX+0vtNtZeHpoJZN90jaftka7kCeTaiSKfKN9plZZk+yqpgbcooxeeZlj6 FOjXkpRppKPu
QVkoqG6im3yxiuZ3laMdfdjYjThFtrqcP+z18Gf+FD+AtQ8Ef8JJ/av27xz4 n8RfavsfkbP7
Y16/1byNu98+T9t8nfkb/K37U3bF7iiiuHF4qvjsVUxNd3nOTlJ6K7k7t2Vk rt9FYuMVGKit
kFFFFc4wooooAKKKKACiiigAor5Y/wCCn9rq3iPUf2ffhrb+PvGGgaX4r+OE 9h4hPgrxtqfh
+6vrWLwb4nvUt3u9MuILjyvtNpbSlBIFZoU3AgYrh/8AhiX4Yf8ARY/2gP8A xKfx9/8ALqu7
DZfWxdNzg1a9tb/5Hn4vMqGDqKE022r6W/zPt+iviD/hiX4Yf9Fj/aA/8Sn8 ff8Ay6o/4Yl+
GH/RY/2gP/Ep/H3/AMuq6f7GxXeP4/5HL/bmE/ll9y/zPt+iviD/AIYl+GH/ AEWP9oD/AMSn
8ff/AC6o/wCGJfhh/wBFj/aA/wDEp/H3/wAuqP7GxXeP4/5B/bmE/ll9y/zP t+iviD/hiX4Y
f9Fj/aA/8Sn8ff8Ay6rzHxt4O/Z58LeKrvwT4b8bftS+L9S0xwmsQeE/2lfH dwunuQCElkk1
6NA+DkorMyj7wGRnnxOAeEhz1qkYrzb/AMhSz7BRWql9y/zP0tor89fhN8DP 2dPjRo1xq3gr
46ftCGWwuPs+q6beftQ+P4brT59obypo21rKnBBBGVYHKsw5rE+Lvg/9k/4J +JIPBni34y/t
U6lrE1it7LpXgn4y/FjxLc2ds7ukU91FpF/ctaRyvFOsTzBFma2nEZcwy7Lp 5bUq0lUhOLi9
nd2/IqGeYSp8MZP0S/zP0lor4E+HH7Nv7Pvxb8F2XxA+H/x8/aAvtLvvMWOR /wBp/wCIUEsM
sUjRTW88MusLLbXEM0ckM1vKqSwyxSRSIjoygsP2bf2fdU+JOrfCKx+Pn7QD +ItD0PT9Y1TT
/wDhp/4hDyLK+mvYbWXzDrGxt8mnXi7VYsvk5YKHQtp/Y+Jf2o/e/wDIf9t4 XX3ZaeS/zPu3
xP4n8NeCfDWo+M/GfiGx0jR9IsZr3VtW1S7S3trK2iQySzzSyEJHGiKzM7EK qqSSAK8c/wCF
b6t+2V/xU/xx0bXNH+Gp/wCRb+G9zc3Wm3HiGI8Ne+IIEaOR7eaMtGmh3AMX kSu2owyXEqWm
mfJfxN+Cf7B9r8WPCn7L3xU/ad+K11408WX0N/4W8Caj+1V45ur65ksxPqMN +LX+2WaKOF9M
lljunVY0ntkVXEvlqfRv+GJfhh/0WP8AaA/8Sn8ff/LqvUwNDE5fSc8M0q97 Kd37isvhsrqb
1vLdK3Lq2zOecYVtc0ZW9Fr+Ox9v0V8Qf8MS/DD/AKLH+0B/4lP4+/8Al1R/ wxL8MP8Aosf7
QH/iU/j7/wCXVeZ/Y2K7x/H/ACK/tzCfyy+5f5n2/RXxB/wxL8MP+ix/tAf+ JT+Pv/l1R/wx
L8MP+ix/tAf+JT+Pv/l1R/Y2K7x/H/IP7cwn8svuX+Z9v0V8Qf8ADEvww/6L H+0B/wCJT+Pv
/l1Xcf8ABMC11bw5qP7QXw1uPH3jDX9L8KfHCCw8PHxr421PxBdWNrL4N8MX r26Xep3E9x5X
2m7uZQhkKq0z7QAcVzYnL62Epqc2rXtpf/I6sJmVDGVHCCaaV9bf5n1PRRRX CegFFFfmZ+wv
+zbonxj/AGJfg78XfiP8fP2gNR8ReKvhX4e1jXtQ/wCGn/HMP2q9udNt5p5f Li1hUTdI7NtR
VUZwAAAK6sLhKmLk1BrTucmLxtLBxTmm79v+HR+mdFfEH/DEvww/6LH+0B/4 lP4+/wDl1R/w
xL8MP+ix/tAf+JT+Pv8A5dV2/wBjYrvH8f8AI4P7cwn8svuX+Z9v0V8Qf8MS /DD/AKLH+0B/
4lP4+/8Al1R/wxL8MP8Aosf7QH/iU/j7/wCXVH9jYrvH8f8AIP7cwn8svuX+ Z9v0V8Qf8MS/
DD/osf7QH/iU/j7/AOXVct8VfgP+zx8HNHt9U8Y/HH9oUzX1x9n0rTLH9qDx /Nd6hPgnyoYl
1rLHAyScKo5ZlHNZ1crq0KbqVJxUVu23/kDz7BpXal+H+Z+hFFfmj4K8J/s6 +KPF1n4E8S+O
f2pPCGqam5TRrfxZ+0t47txqDgMSkTx69IhfCkhGZWYA7QcNjs/iR+zb+z78 JPBd78QPiB8f
P2gLHS7Hy1kkT9p/4hTyzSyyLFDbwQxaw0tzcTTSRww28SvLNLLHFGju6qcs PgXi6bnRqRkl
1Tf+QoZ9g5/DGX3L/M+iv2Tf+S9ftO/9lx0//wBQTwnXuNfmZ8C/hR+xV8Tf GmtaF8NfiJ+0
34f8Rat/xOtVs/Ffxa+Kvha91vyo7aze9RNVvrWTUPJjSxt5JoxJ5KtZxyFB JAG7j4hfs2/s
+/CvQbfxP49+Pn7QFhY3WuaZo8E//DT/AMQpd17qN/Bp9nFtj1hiPMurmCPc RtXfuYqoZh7O
aYarmWIjWg0kqdKG/wDz7pQpt7dXG/oxwzjD0/dcZXu+i6u/c++6K+BPiR+z b+z78JPBd78Q
PiB8fP2gLHS7Hy1kkT9p/wCIU8s0ssixQ28EMWsNLc3E00kcMNvEryzSyxxR o7uqmj8Ivgb+
zb8cvDc/ij4efHX9o147O+ay1LT9Z/aM+JOl6jp1yqJJ5F3Y32qw3NpI0UsM ypNGjPDPDKoa
OWN283+yMRe3NG/q/wDIr+28Ny35ZW9F/mfoTRXxB/wxL8MP+ix/tAf+JT+P v/l1R/wxL8MP
+ix/tAf+JT+Pv/l1Vf2Niu8fx/yJ/tzCfyy+5f5n2/RXxB/wxL8MP+ix/tAf +JT+Pv8A5dUf
8MS/DD/osf7QH/iU/j7/AOXVH9jYrvH8f8g/tzCfyy+5f5n2/RXxB/wxL8MP +ix/tAf+JT+P
v/l1WHZ/CO3+AP7YX7OV58PfjH8YJovEvxU1TR9f03xT8dfFWvWF/ZDwX4mv BFLaanqVxA22
5s7aVWKblaFSCOc5VsrxFGk5yasvX/I1o5vhq9VU4p3fp/mffdFFFeaeqFFF fKX7cfi/4/aj
+1t8J/gL8I/2nPFXw00fXfhz401/Xbnwho2hXVzfXOnX/hm3tUZtX069VI1T VLskRqjMzLli
FArSlTlVqKEd2Z1asKNNzlsj6tor4w/4VF+1p/0lS+OH/hL+AP8A5l6P+FRf taf9JUvjh/4S
/gD/AOZeu/8AsnGdl95539s4Lu/uPs+ivjD/AIVF+1p/0lS+OH/hL+AP/mXo /wCFRftaf9JU
vjh/4S/gD/5l6P7JxnZfeH9s4Lu/uPpf4zfs8/DX44f2brPiTS/sPijw750n gzx1pUEKa14Y
uJdm+axuZI38rf5UaywsrwXMamC5ingeSJsL4b/tAatYeNLL4A/tEaT/AGL4 8m8yPS9UsdHu
ovD/AIsWONpRPp11JviiuHhinlfSZZ2vbcWt0wFzawpfz+C/8Ki/a0/6SpfH D/wl/AH/AMy9
YXxI/ZZ/aA+Lngu9+H3xB/4Kc/HC+0u+8tpI08P+BIJYZYpFmguIJ4fDKy21 xDNHHNDcRMks
MsUcsbo6Kw9jC0a86CwmOTlSXwtNc1O7u3G+jjdtyp3ipPaUG+Yzlm2CT5ot 39N/67n3ZRX5
2eNfil40+H/iObwn4l/4LJ/G0X9s+y7gsPAvgm8Fs/XZK1v4TdYmA5KuQQCC RyK7fw74E/aU
8XaJbeJfCv8AwVt+Muo6dexCS0vrHw98PpYpkP8AErr4YII+leBTwU61Rwpz i5LdKSbXquhS
zzL5NpS2Ptyivzq+LvxkX9n3xJB4M+PX/BfbxV4I1i5sVvbbSvF998MdNuZb ZndFnWK48Ooz
Rl45FDgbS0bDOVOPRv8AhUX7Wn/SVL44f+Ev4A/+ZetllWKbsrfeW83waSbv 9x9n0V8RaT4I
/aP16/1PStC/4K5/GK9utEvlstZtrTQvh7JJYXLQRXCwTKvhgmKQwXEEoRsM Y5o3xtdScPVt
X+I+g/FjTPgLrv8AwW0+I1l451uxa90bwXd2/wAN49Wv7ZRKWnhs28NCaWMC 3nJdVKgQyc/I
2D+ysWu33gs4wb7/AHH3zRXxh/wqL9rT/pKl8cP/AAl/AH/zL0f8Ki/a0/6S pfHD/wAJfwB/
8y9P+ycZ2X3i/tnBd39x9n0V8Yf8Ki/a0/6SpfHD/wAJfwB/8y9H/Cov2tP+ kqXxw/8ACX8A
f/MvR/ZOM7L7w/tnBd39x9n0V8Yf8Ki/a0/6SpfHD/wl/AH/AMy9H/Cov2tP +kqXxw/8JfwB
/wDMvR/ZOM7L7w/tnBd39x9n0V4L/wAE1viN8Ufih+ypHrvxk+I994u1/Tfi N440CXxHqdhZ
W1zfW2l+LNX0y0eWOxggtxILa0gVjHFGrMpbbkmivNknGTTPUjJSimupzX/B Rv8A5Kf+y7/2
cBe/+oD4vrfrkv8AgqDb+JLvxV+zba+DNWsbDWJfjlqSaVfanp73dtbXJ+H3 jERSSwJNC00a
vtLRrLEzqCokQncPPf8AhAf+Ckf/AEdf8D//ABHzWP8A5rK+iyeTWGdlfV9u y8z5jO4qWLV3
b3V37vsj2+ivEP8AhAf+Ckf/AEdf8D//ABHzWP8A5rKP+EB/4KR/9HX/AAP/ APEfNY/+ayvV
55fyv8P8zx+SP8y/H/I9vorxD/hAf+Ckf/R1/wAD/wDxHzWP/mso/wCEB/4K R/8AR1/wP/8A
EfNY/wDmso55fyv8P8w5I/zL8f8AI9vr4y+CnxD+Pdl+ybqfwc+Dfxg8NeEP i7oHxRupfGkP
iDVItOuL+0IYed50zqJf3p3n5zvXLch13evf8ID/AMFI/wDo6/4H/wDiPmsf /NZXn3xS/Yb/
AGp/jRrSeJPiN8avgReaikYjN/bfAfX7SaVB91ZHt/GCNIF/hDk7cnGMmvCz zLcRmUYOlo43
3dtHbqrtPTt3IlTknzU5pOzW8lo7bNJ2at2fVdSf9k+9+KXif9tP4ieI/Evx X0bxtZWmgw2m
r+KPDmk/Y7O/vmkikiChfkcxqLoZH9/d0kBZ37VfxB+Bfwq/aSuPFPiL9sb/ AIZ/8YXPgfSh
D4k8XXOiReG/HFvb3mpva6bIuqDzbr7BNLcSXUWnzWM4h1q3DXIMlu8G/wCA v2f/ANu34X+G
ofCHw+/aI+Amk6bASyWtn+zvrChnP3nY/wDCWZd26l2JZjySTWz/AMID/wAF I/8Ao6/4H/8A
iPmsf/NZXRlmBq4DAqjLV3bb8321v8+pWHpqjfmne7b6vd36p3+d++5478Ov 2pbDwZ4x+Evx
g+JF5Y+D/A2ueFfiXZzv4Zsp4NE8aeIT4m0c6ZqOnWURkN5eazBDqmqWFtEb q6nivrjyJLvd
JNJ4f+z78Q/gTr/iTwB4s/bf/a58VeDrXXP2LvhHf3OuXnxP1Dwvba5qzv4k dpb3XLea3me8
xJO8do94ouVku5mguGtBLbfaX/CA/wDBSP8A6Ov+B/8A4j5rH/zWUf8ACA/8 FI/+jr/gf/4j
5rH/AM1ldjp1G02tvTsl/Mdaq00mk1r5vvf+U8503xD8WPF3gL9hLxX8ere+ i8c6n4qs7vxp
FqemCyuU1aT4beJXvFltwiC3kE7SBogiBGyu1cYH1rXiH/CA/wDBSP8A6Ov+ B/8A4j5rH/zW
Uf8ACA/8FI/+jr/gf/4j5rH/AM1lbQ5oJ6N/d2S7mE1CbXvJff3b7eZ7fRXi H/CA/wDBSP8A
6Ov+B/8A4j5rH/zWUf8ACA/8FI/+jr/gf/4j5rH/AM1lXzy/lf4f5kckf5l+ P+R7fRXiH/CA
/wDBSP8A6Ov+B/8A4j5rH/zWUf8ACA/8FI/+jr/gf/4j5rH/AM1lHPL+V/h/ mHJH+Zfj/ke3
1gf8E5P+Sn/tRf8AZwFl/wCoD4Qry/8A4QH/AIKR/wDR1/wP/wDEfNY/+ayv Qv8Agl9b+JLT
xV+0la+M9Wsb/WIvjlpqarfaZp72ltc3I+H3g4SyRQPNM0MbPuKxtLKyKQpk cjcfKziTeFV1
bVduz8z2Mkili3Z3919+68j6tooor5w+oCvhD/gmV/yjc/Z8/wCyH+E//TPa 1931+Xn7CPhH
9tvVP2D/AIEX3wi/aD+Feh+HX+B/g/8As/S/Enwd1LVb2DGh2Qk8y6h8Q2iS 5kDsu2BNqsqn
cVLt7OTNqrKyvoeHniTpQu7as+w6K8Q/4QH/AIKR/wDR1/wP/wDEfNY/+ayj /hAf+Ckf/R1/
wP8A/EfNY/8Amsr3+eX8r/D/ADPm+SP8y/H/ACPb6K8Q/wCEB/4KR/8AR1/w P/8AEfNY/wDm
so/4QH/gpH/0df8AA/8A8R81j/5rKOeX8r/D/MOSP8y/H/I9vrwD4k+O7X4S /wDBQ/4deOPi
Xq1np3hK/wDB99p2lavqkO+2sNX3SsHJORGW3W2TgZCZziMldD/hAf8AgpH/ ANHX/A//AMR8
1j/5rKxfH37P37dnxS8MzeDviF+0R8BNW02chntbv9njWGCsPuup/wCEsyjr 1V1IZTyCDXnZ
phamPwjpRVndNXta6d9ddhOFnGUZq6aa3to766bHiPx31X9tbWPAeheCfiv+ 1D4M8U+IdR8d
Rx+GfDegyQ6leJIdpjv1uoXYwRiRVKoSu0LvIUKSv1H+2j/wraP9nrUb34tf 25b6HZ65od3L
rfh7yRceHLiHV7OW2112uMwJb6dcJDqM8k6yQJBZStNFLErxP5J8Lf2HP2p/ gvrL+I/h18av
gPZ6i8ZjW/uPgNr93PGh+8sclx4wdow38QQjdgZzgV6B/wAID/wUj/6Ov+B/ /iPmsf8AzWVw
ZJlVfLadT2mrnbrdK1+ra79kRQpOFT2k6l3pu5Pbza/Reh85+Pfjvr3xF+G3 xa8Dfsx/tL6H
+0Prmnfs6eNrjwX8Uvh3BYXHizwlqRhtPI0u5vNCIge41G4dZbRLa2sHxoGC l5LG08WH+2B+
1B4L+PGs/FbUfhB8etc1bwVon/ChptL1/wAB2smsW8F7J8Rr/wC1X2jRC3ub fUrgLDbxFreG
6WSeyFs6ySW7wJ9Uf8ID/wAFI/8Ao6/4H/8AiPmsf/NZR/wgP/BSP/o6/wCB /wD4j5rH/wA1
leu6dRq2v4dmv5vM7o1aUWnpp690/wCXy/4c8B079pj9nT4N6P8AFbxv4A+J 1j8Vvgh4dsfh
/N4f1rxX8U5vE2iWXjW98QX1q7T6/qU981nHaOvhu8nVXk+wRbLuK382b9/9 F/sXX/wS8S+B
fEPxD+EP7Q3hX4p6l4n8VPqHxA8a+DdVtrixu9bFlZ25ijitppo7OOGzgsYI rcyPKsEULTS3
Ezy3M1L/AIQH/gpH/wBHX/A//wAR81j/AOayj/hAf+Ckf/R1/wAD/wDxHzWP /msrSEZxa0/L
/Micqc4tKX5+X935/wDDHt9FeIf8ID/wUj/6Ov8Agf8A+I+ax/8ANZR/wgP/ AAUj/wCjr/gf
/wCI+ax/81la88v5X+H+ZhyR/mX4/wCR7fRXiH/CA/8ABSP/AKOv+B//AIj5 rH/zWUf8ID/w
Uj/6Ov8Agf8A+I+ax/8ANZRzy/lf4f5hyR/mX4/5Ht9eYfF3/k7T9lb/ALLh qn/qAeLq5/8A
4QH/AIKR/wDR1/wP/wDEfNY/+ayse30D9pLQ/wBrT9mj/hoT4seB/FHm/HC+ /sj/AIQz4e3m
g/ZseAPGXm+d9p1bUPP3Zj27fK2bHzv3jZy46UnhJ+69vL/M7MBCKxkHzJ6+ f+R+g9FFFfIn
2gV8oftZf8pI/gn/ANkP+JH/AKePBFfV9fGn7fN/8SdL/bw+EF98IvCeh654 iT4H/ET+z9L8
SeIZtKsp8654FEnmXUNpdvFiMuy7YH3MqqdoYuvXgXbFw9TjzBXwU15HpdFe If8ACff8FI/+
jUPgf/4kHrH/AMydH/Cff8FI/wDo1D4H/wDiQesf/MnX1vtI+f3P/I+L9lLy +9f5nt9FeIf8
J9/wUj/6NQ+B/wD4kHrH/wAydH/Cff8ABSP/AKNQ+B//AIkHrH/zJ0e0j5/c /wDIPZS8vvX+
Z7fXO/F+/wDFOlfCXxRqngaN31u28O30ujpFHuZrpYHMQC4OTvC8YOfQ15l/ wn3/AAUj/wCj
UPgf/wCJB6x/8ydH/Cff8FI/+jUPgf8A+JB6x/8AMnU1JKcHFXV12YOjNq11 96/zOI+DvjL4
62f7LPwZvf2L/gJ4T8Vx+IJbtfiLPqUSXS296064+2yMGkjidC8jSfKSPmzl huuf8E8dZ8a3
fiT4raHrui6PYabp/ixPJtfDl0Z9Oiv3803Yt2P8BAt3x38wP1cs3mnjL9jD 9q3xR4nvvE2i
fsx/DLwyNUlM2pab4b/aU1OG1uZWOWcxyeDpNm7uqFV6nAJJPq/w0079ur4P +D7bwJ8Ov2MP
gXp2mWu4pCn7Q2tOzuxy0ju/hQtI7HksxJPrXyGUZLi8HmEa1R2jFNaXd9Lb WVu7v1MFRxM5
Q5nZRSVuaNnolorJq9rvV6j9P0H4vaB8cPi14y/ZA8e+B/EfneOLOX4jfD7x 1peoafKNf/4R
7R4VS21y3MqWluNMXSrnZ/Zt6XlM0Znj83/RfD9Z/bM0r4QfsdfE7xl+zv4s /wCED+Hngv8A
Yg8FeKvgpp/iRbUy6Fe6hb+JIdOjkkuGm+0XD/YdIt1hllnV5Y1Vd7SuZPRv i7+z38bf2gvE
kHjP49f8ErP2SvG+sW1itlbar4v+JlzqVzFbK7usCy3Hg12WMPJIwQHaGkY4 yxzufETwR+1t
8X7+x1X4s/8ABO39mbxRdaZY6hZabc+IvjFf3slpbX0H2e+giabwgxjjuIP3 UyLhZY/kcMvF
fUy5m3y6b9H1+Wnp1fY9GLirc1nt1j0t569u6T6njvxB8d/FL4b+MP24Pjd8 K/2nf7FvvhDr
kfjFPhzpek6ZP/a8sPw/0K4iOsNdRT3H9n3DWBgjWzNjKPJvsXMjGP7L7F+2 vb+Gxo+mal4K
1bwqdHg+PvgJPirouj6eg1i+1uTxB4aTSpJL2ObbayQIdNmmjuLaeW5slhhj ktA0dwtHxT8I
v2kvHHjSw+I/jX/gmb+yxrHiLStcGtaZr2qfFe8uL2z1IR2sQvYp5PBxeO4E djZIJVIfbZ26
5xEgW9q3gj9rbXvixpnx613/AIJ2/szXvjnRLFrLRvGl38Yr+TVrC2YShoIb xvCBmijIuJwU
VgpE0nHztks7SWuvlLz8vPbqF1eL00849l5+W+6v5H0zRXiH/Cff8FI/+jUP gf8A+JB6x/8A
MnR/wn3/AAUj/wCjUPgf/wCJB6x/8yddHtI+f3P/ACOX2UvL71/me30V4h/w n3/BSP8A6NQ+
B/8A4kHrH/zJ0f8ACff8FI/+jUPgf/4kHrH/AMydHtI+f3P/ACD2UvL71/me 30V4h/wn3/BS
P/o1D4H/APiQesf/ADJ0f8J9/wAFI/8Ao1D4H/8AiQesf/MnR7SPn9z/AMg9 lLy+9f5nsH/B
Kf8A5NL1D/suHxS/9T/xBRR/wSn/AOTS9Q/7Lh8Uv/U/8QUV8XV/iy9Wfd0f 4MfRGD/wVB1a
/wBB8Vfs267pXhi+1u6svjlqU9to2mSQJc38ifD7xiy28TXEsUKyOQEUyyRx hmG50XLDz3/h
q/48/wDSMr44f+D/AMC//NLXqH/BRv8A5Kf+y7/2cBe/+oD4vrfr38ni3hnZ 21fbsvI+czuS
ji1dX91d+77M8Q/4av8Ajz/0jK+OH/g/8C//ADS0f8NX/Hn/AKRlfHD/AMH/ AIF/+aWvb6K9
Xkl/M/w/yPH54/yr8f8AM8Q/4av+PP8A0jK+OH/g/wDAv/zS0f8ADV/x5/6R lfHD/wAH/gX/
AOaWvb6KOSX8z/D/ACDnj/Kvx/zPEP8Ahq/48/8ASMr44f8Ag/8AAv8A80tH /DV/x5/6RlfH
D/wf+Bf/AJpa9voo5JfzP8P8g54/yr8f8zxD/hq/48/9Iyvjh/4P/Av/AM0t H/DV/wAef+kZ
Xxw/8H/gX/5pa9voo5JfzP8AD/IOeP8AKvx/zPEP+Gr/AI8/9Iyvjh/4P/Av /wA0tH/DV/x5
/wCkZXxw/wDB/wCBf/mlr2+ijkl/M/w/yDnj/Kvx/wAzxD/hq/48/wDSMr44 f+D/AMC//NLR
/wANX/Hn/pGV8cP/AAf+Bf8A5pa9voo5JfzP8P8AIOeP8q/H/M8Q/wCGr/jz /wBIyvjh/wCD
/wAC/wDzS0f8NX/Hn/pGV8cP/B/4F/8Amlr2+ijkl/M/w/yDnj/Kvx/zPEP+ Gr/jz/0jK+OH
/g/8C/8AzS0f8NX/AB5/6RlfHD/wf+Bf/mlr2+ijkl/M/wAP8g54/wAq/H/M 8Q/4av8Ajz/0
jK+OH/g/8C//ADS16F/wS+1a/wBe8VftJa7qvhi+0S6vfjlps9zo2pyQPc2E j/D7wczW8rW8
ssLSISUYxSSRllO13XDHrawP+Ccn/JT/ANqL/s4Cy/8AUB8IV5WcRawqu76r t2fkexkkk8W7
K3uvv3XmfT9FFFfOH1AV+Xn7CP7Qfxb8D/sH/Ajwt4Y/YX+KnjKxtfgf4P8A I8SeG9X8JxWV
5u0OydvLXUNctrgbGYxt5kKfMjFdy7Xb9Q6+EP8AgmV/yjc/Z8/7If4T/wDT Pa17OTJurKzt
oeHnjSpQur6sP+Gr/jz/ANIyvjh/4P8AwL/80tH/AA1f8ef+kZXxw/8AB/4F /wDmlr2+ivf5
JfzP8P8AI+b54/yr8f8AM8Q/4av+PP8A0jK+OH/g/wDAv/zS0f8ADV/x5/6R lfHD/wAH/gX/
AOaWvb6KOSX8z/D/ACDnj/Kvx/zPEP8Ahq/48/8ASMr44f8Ag/8AAv8A80tH /DV/x5/6RlfH
D/wf+Bf/AJpa9voo5JfzP8P8g54/yr8f8zxD/hq/48/9Iyvjh/4P/Av/AM0t H/DV/wAef+kZ
Xxw/8H/gX/5pa9voo5JfzP8AD/IOeP8AKvx/zPEP+Gr/AI8/9Iyvjh/4P/Av /wA0tH/DV/x5
/wCkZXxw/wDB/wCBf/mlr2+ijkl/M/w/yDnj/Kvx/wAzxD/hq/48/wDSMr44 f+D/AMC//NLR
/wANX/Hn/pGV8cP/AAf+Bf8A5pa9voo5JfzP8P8AIOeP8q/H/M8Q/wCGr/jz /wBIyvjh/wCD
/wAC/wDzS0f8NX/Hn/pGV8cP/B/4F/8Amlr2+ijkl/M/w/yDnj/Kvx/zPEP+ Gr/jz/0jK+OH
/g/8C/8AzS0f8NX/AB5/6RlfHD/wf+Bf/mlr2+ijkl/M/wAP8g54/wAq/H/M 8Q/4av8Ajz/0
jK+OH/g/8C//ADS1j2/xY8efE/8Aa0/Zo/4Tf9mTxx8OfsPxwvvsv/CZ3+hT /wBob/AHjLd5
P9k6ne7fL2Lu83y8+amzfh9v0PXmHxd/5O0/ZW/7Lhqn/qAeLq5cdGSwk/ee 3l/kdmAnF4yC
5UtfP/M+z6KKK+RPtAr40/b5+IWg/Cv9vD4QePfE9hrl1Y2HwP8AiJ58Hhvw xf6zetv1zwLG
vl2enwzXE2GcFvLjbaoZ2wqsw+y6+UP2sv8AlJH8E/8Ash/xI/8ATx4IrrwN /rcLdzjzC31K
d+x5/wD8PBvgN/0IPxw/8Rk8df8Aymo/4eDfAb/oQfjh/wCIyeOv/lNXt9Ff W2q9193/AAT4
u9Hs/v8A+AeIf8PBvgN/0IPxw/8AEZPHX/ymo/4eDfAb/oQfjh/4jJ46/wDl NXt9FFqvdfd/
wQvR7P7/APgHiH/Dwb4Df9CD8cP/ABGTx1/8pqP+Hg3wG/6EH44f+IyeOv8A 5TV7fRRar3X3
f8EL0ez+/wD4B4h/w8G+A3/Qg/HD/wARk8df/Kaj/h4N8Bv+hB+OH/iMnjr/ AOU1e30UWq91
93/BC9Hs/v8A+AeIf8PBvgN/0IPxw/8AEZPHX/ymo/4eDfAb/oQfjh/4jJ46 /wDlNXt9FFqv
dfd/wQvR7P7/APgHiH/Dwb4Df9CD8cP/ABGTx1/8pqP+Hg3wG/6EH44f+Iye Ov8A5TV7fRRa
r3X3f8EL0ez+/wD4B4h/w8G+A3/Qg/HD/wARk8df/Kaj/h4N8Bv+hB+OH/iM njr/AOU1e30U
Wq9193/BC9Hs/v8A+AeIf8PBvgN/0IPxw/8AEZPHX/ymo/4eDfAb/oQfjh/4 jJ46/wDlNXt9
FFqvdfd/wQvR7P7/APgHiH/Dwb4Df9CD8cP/ABGTx1/8pqP+Hg3wG/6EH44f +IyeOv8A5TV7
fRRar3X3f8EL0ez+/wD4BQ/4JT/8ml6h/wBlw+KX/qf+IKKP+CU//Jpeof8A ZcPil/6n/iCi
vi6v8WXqz7uj/Bj6I9f+Nf7PXwC/aU8K2/gX9oz4HeD/AB/olpqCX9ro3jXw za6raw3SpJGt
wkV1G6LKEllQOBuCyOM4Y58w/wCHTv8AwSy/6Rp/s/8A/hm9D/8AkWvf6KzN TwD/AIdO/wDB
LL/pGn+z/wD+Gb0P/wCRaP8Ah07/AMEsv+kaf7P/AP4ZvQ//AJFr3+igDwD/ AIdO/wDBLL/p
Gn+z/wD+Gb0P/wCRaP8Ah07/AMEsv+kaf7P/AP4ZvQ//AJFr3+igDwD/AIdO /wDBLL/pGn+z
/wD+Gb0P/wCRaP8Ah07/AMEsv+kaf7P/AP4ZvQ//AJFr3+igDwD/AIdO/wDB LL/pGn+z/wD+
Gb0P/wCRaP8Ah07/AMEsv+kaf7P/AP4ZvQ//AJFr3+igDwD/AIdO/wDBLL/p Gn+z/wD+Gb0P
/wCRaP8Ah07/AMEsv+kaf7P/AP4ZvQ//AJFr3+igDwD/AIdO/wDBLL/pGn+z /wD+Gb0P/wCR
aP8Ah07/AMEsv+kaf7P/AP4ZvQ//AJFr3+igDwD/AIdO/wDBLL/pGn+z/wD+ Gb0P/wCRaP8A
h07/AMEsv+kaf7P/AP4ZvQ//AJFr3+igDwD/AIdO/wDBLL/pGn+z/wD+Gb0P /wCRaP8Ah07/
AMEsv+kaf7P/AP4ZvQ//AJFr3+igDwD/AIdO/wDBLL/pGn+z/wD+Gb0P/wCR a9P+Cn7PXwC/
Zr8K3HgX9nP4HeD/AABol3qD391o3grwza6VazXTJHG1w8VrGiNKUiiQuRuK xoM4UY7CigAo
oooAK8A/4dO/8Esv+kaf7P8A/wCGb0P/AORa9/ooA8A/4dO/8Esv+kaf7P8A /wCGb0P/AORa
P+HTv/BLL/pGn+z/AP8Ahm9D/wDkWvf6KAPAP+HTv/BLL/pGn+z/AP8Ahm9D /wDkWj/h07/w
Sy/6Rp/s/wD/AIZvQ/8A5Fr3+igDwD/h07/wSy/6Rp/s/wD/AIZvQ/8A5Fo/ 4dO/8Esv+kaf
7P8A/wCGb0P/AORa9/ooA8A/4dO/8Esv+kaf7P8A/wCGb0P/AORaP+HTv/BL L/pGn+z/AP8A
hm9D/wDkWvf6KAPAP+HTv/BLL/pGn+z/AP8Ahm9D/wDkWj/h07/wSy/6Rp/s /wD/AIZvQ/8A
5Fr3+igDwD/h07/wSy/6Rp/s/wD/AIZvQ/8A5Fo/4dO/8Esv+kaf7P8A/wCG b0P/AORa9/oo
A8A/4dO/8Esv+kaf7P8A/wCGb0P/AORaP+HTv/BLL/pGn+z/AP8Ahm9D/wDk Wvf6KAPAP+HT
v/BLL/pGn+z/AP8Ahm9D/wDkWj/h07/wSy/6Rp/s/wD/AIZvQ/8A5Fr3+igD wD/h07/wSy/6
Rp/s/wD/AIZvQ/8A5Frf+Fv/AAT2/YF+B3jux+KXwU/Ye+D/AIP8T6X5v9me I/C3w00rT7+0
8yJ4ZPKuILdJI98UkkbbWG5XZTkEivYKKACiiigAryn9or9iz4A/tT+JPDvj P4uaf4qTWPCl
jqFloWq+EPiPrvhu5gtr57R7qBpdIvbZpo5HsbRikhZQ0CkAHOfVqKabTuhN JqzPnD/h1P8A
sl/9DD8cP/EpPH//AMu6P+HU/wCyX/0MPxw/8Sk8f/8Ay7r6Poq/a1f5n95H saP8q+4+cP8A
h1P+yX/0MPxw/wDEpPH/AP8ALuj/AIdT/sl/9DD8cP8AxKTx/wD/AC7r6Poo 9rV/mf3h7Gj/
ACr7j5w/4dT/ALJf/Qw/HD/xKTx//wDLuj/h1P8Asl/9DD8cP/EpPH//AMu6 +j6KPa1f5n94
exo/yr7j5w/4dT/sl/8AQw/HD/xKTx//APLuj/h1P+yX/wBDD8cP/EpPH/8A 8u6+j6KPa1f5
n94exo/yr7j5w/4dT/sl/wDQw/HD/wASk8f/APy7o/4dT/sl/wDQw/HD/wAS k8f/APy7r6Po
o9rV/mf3h7Gj/KvuPnD/AIdT/sl/9DD8cP8AxKTx/wD/AC7o/wCHU/7Jf/Qw /HD/AMSk8f8A
/wAu6+j6KPa1f5n94exo/wAq+4+cP+HU/wCyX/0MPxw/8Sk8f/8Ay7o/4dT/ ALJf/Qw/HD/x
KTx//wDLuvo+ij2tX+Z/eHsaP8q+4+cP+HU/7Jf/AEMPxw/8Sk8f/wDy7o/4 dT/sl/8AQw/H
D/xKTx//APLuvo+ij2tX+Z/eHsaP8q+4+cP+HU/7Jf8A0MPxw/8AEpPH/wD8 u6P+HU/7Jf8A
0MPxw/8AEpPH/wD8u6+j6KPa1f5n94exo/yr7jjfgF8Avhd+zH8LrP4N/BvR r6x0Cxvr+9ii
1PXr3VLmS5vb2e+u55bu+mmuJ5Jbm5nlZ5JGYtIecYAK7Kis9zTY/9k=
--------------040806060903000402090203
Content-Type: text/xml;
name="Covariant.ecore"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
filename="Covariant.ecore"

<?xml version="1.0" encoding="ISO-8859-1"?>
<ecore:EPackage xmi:version="2.0"
xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="Covariant"
nsURI="http://Covariant" nsPrefix="Covariant">
<eClassifiers xsi:type="ecore:EClass" name="Super">
<eStructuralFeatures xsi:type="ecore:EReference" name="ref1" eType="#//Sub1" eOpposite="#//Sub1/op1"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="ref2" eType="#//Sub2" eOpposite="#//Sub2/op2"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="ref3" eType="#//Sub3" eOpposite="#//Sub3/op3"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="Sub1">
<eStructuralFeatures xsi:type="ecore:EReference" name="op1" eType="#//Super" eOpposite="#//Super/ref1"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="Sub2">
<eStructuralFeatures xsi:type="ecore:EReference" name="op2" eType="#//Super" eOpposite="#//Super/ref2"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="Sub3">
<eStructuralFeatures xsi:type="ecore:EReference" name="op3" eType="#//Super" eOpposite="#//Super/ref3"/>
</eClassifiers>
</ecore:EPackage>

--------------040806060903000402090203--
Re: taking advantage of Java 5.0's support for covariant return types. [message #414728 is a reply to message #414723] Tue, 20 November 2007 12:21 Go to previous messageGo to next message
Ed Merks is currently offline Ed MerksFriend
Messages: 33133
Registered: July 2009
Senior Member
This is a multi-part message in MIME format.
--------------090309040904040002040700
Content-Type: text/plain; charset=ISO-8859-15; format=flowed
Content-Transfer-Encoding: 7bit

Philipp,

Just so I can understand exactly what question I'm answering, what
methods will Super and Sub1 have in them and what will be their types?
Keep in mind that my likely answer will be, define an EOperation for
each method except the ones that will be generated anyway if you define
a feature whose accessor will produce that desired signature directly.
Container features are always a bit problematic to generate because most
objects can be contained in many places and having an accessor for each
place seems like overkill. I could imagine suppressing the visibility
of the accessors from the API. E.g., you might define "ref" in each
Subx and make the opposite "opx" but then suppress it from being
visible. In Super you get define getOp (to return null), and in each
Subx, you could override it to return getOpx().


Philipp W. Kutter wrote:
> Hi, Ed.
> I read the below post of Marco Pantel and your answer in the ocl group.
> As you suggested, I move the discussion to the EMF group.
>
> I would be interested in the example you give, and get it running.
>
> Thus I have a superclass Super, and three subclasses Sub1, Sub2, Sub3.
>
> Then I have ref1, ref2, ref3 from Super to Sub1, Sub2, Sub3, and every
> subclass has a reference op1, op2, op3 to the superclass, being the
> opposite of its counterpart.
>
> (see screenshot and ecore file)
>
> Now, what do you mean by "provide EOperations in the base that have
> the same matching signature as the feature accessors"
>
>
> Sorry for not getting it immediatly, and thanks for an aditional hint in
> advance.
>
> Best, Philipp
>
>
>
> Ed Merks wrote:
>> Marco,
>>
>> This doesn't really sound like an OCL question. Opposites must be
>> properly paired. You could define "container" to be a derived
>> volatile unchangeable reference in the base and implement it by
>> reusing EObject.eContainer(), which is the implicit opposite of all
>> containment references; the subclass references would then be
>> unidirectional. Or you could define three separate bidirectional
>> references in the derived classes and provide EOperations in the base
>> that have the same matching signature as the feature accessors,
>> taking advantage of Java 5.0's support for covariant return types.
>>
>>
>> Marco Pantel wrote:
>>> Hi everyone!
>>>
>>> I have an abstract superclass and three subclasses of it.
>>> Each of the subclasses has got two EReferences to the superclass.
>>> I declared an EReference "container : superclass" in the superclass.
>>> But now the ecore-editor won't let me choose this
>>> container-reference as
>>> an EOpposite to one of the subclasses' references. It says "The
>>> opposite
>>> must be a feature of the reference's type".
>>>
>>> How can I solve this problem?
>>> Do I have to declare three different types of container-references, one
>>> for each subclass?
>>>
>>>
>>> Regards, Marco
>>>
>
>
> ------------------------------------------------------------ ------------
>


--------------090309040904040002040700
Content-Type: multipart/related;
boundary="------------050004070801040107080703"


--------------050004070801040107080703
Content-Type: text/html; charset=ISO-8859-15
Content-Transfer-Encoding: 8bit

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta content="text/html;charset=ISO-8859-15"
http-equiv="Content-Type">
</head>
<body bgcolor="#ffffff" text="#000000">
Philipp,<br>
<br>
Just so I can understand exactly what question I'm answering, what
methods will Super and Sub1 have in them and what will be their types?


Ed Merks
Professional Support: https://www.macromodeling.com/
Re: taking advantage of Java 5.0's support for covariant return types. [message #414748 is a reply to message #414728] Tue, 20 November 2007 15:29 Go to previous messageGo to next message
Philipp Kutter is currently offline Philipp KutterFriend
Messages: 306
Registered: July 2009
Senior Member
Ed Merks wrote:
> Philipp,
>
> Just so I can understand exactly what question I'm answering, what
> methods will Super and Sub1 have in them and what will be their types?

No, idea. You proposed something to Marco in your post that takes
advantage of covariant return types.

I am just asking for the details of YOUR proposal to Marco. My prepared
model was just to save you time, by adding whatever I understood was
already in the discussion. I have no clue, thats why I try to get more
info.

To show me what you meant, you might have to remove the opx references,
thats ok. I just ask for a complete example of what you meant, which
takes advantage of the covariant return types, and which was not
possible prior to EMF 2.3.

I know we already discussed this earlier, and I am always hesitating to
ask for a complete example as your time is limited. If you could extend
what I sent to what you had exactly in mind when speaking to Marco,
would be great.

Best, Philipp

PS: What you write below is clear to me, and I know how to hide setters
and getters in the generated interfaces.

> Keep in mind that my likely answer will be, define an EOperation for
> each method except the ones that will be generated anyway if you define
> a feature whose accessor will produce that desired signature directly.
> Container features are always a bit problematic to generate because most
> objects can be contained in many places and having an accessor for each
> place seems like overkill. I could imagine suppressing the visibility
> of the accessors from the API. E.g., you might define "ref" in each
> Subx and make the opposite "opx" but then suppress it from being
> visible. In Super you get define getOp (to return null), and in each
> Subx, you could override it to return getOpx().
>
>
> Philipp W. Kutter wrote:
>> Hi, Ed.
>> I read the below post of Marco Pantel and your answer in the ocl group.
>> As you suggested, I move the discussion to the EMF group.
>>
>> I would be interested in the example you give, and get it running.
>>
>> Thus I have a superclass Super, and three subclasses Sub1, Sub2, Sub3.
>>
>> Then I have ref1, ref2, ref3 from Super to Sub1, Sub2, Sub3, and every
>> subclass has a reference op1, op2, op3 to the superclass, being the
>> opposite of its counterpart.
>>
>> (see screenshot and ecore file)
>>
>> Now, what do you mean by "provide EOperations in the base that have
>> the same matching signature as the feature accessors"
>>
>>
>> Sorry for not getting it immediatly, and thanks for an aditional hint in
>> advance.
>>
>> Best, Philipp
>>
>>
>>
>> Ed Merks wrote:
>>> Marco,
>>>
>>> This doesn't really sound like an OCL question. Opposites must be
>>> properly paired. You could define "container" to be a derived
>>> volatile unchangeable reference in the base and implement it by
>>> reusing EObject.eContainer(), which is the implicit opposite of all
>>> containment references; the subclass references would then be
>>> unidirectional. Or you could define three separate bidirectional
>>> references in the derived classes and provide EOperations in the base
>>> that have the same matching signature as the feature accessors,
>>> taking advantage of Java 5.0's support for covariant return types.
>>>
>>>
>>> Marco Pantel wrote:
>>>> Hi everyone!
>>>>
>>>> I have an abstract superclass and three subclasses of it.
>>>> Each of the subclasses has got two EReferences to the superclass.
>>>> I declared an EReference "container : superclass" in the superclass.
>>>> But now the ecore-editor won't let me choose this
>>>> container-reference as
>>>> an EOpposite to one of the subclasses' references. It says "The
>>>> opposite
>>>> must be a feature of the reference's type".
>>>>
>>>> How can I solve this problem?
>>>> Do I have to declare three different types of container-references, one
>>>> for each subclass?
>>>>
>>>>
>>>> Regards, Marco
>>>>
>>
>>
>> ------------------------------------------------------------ ------------
>>
>
Re: taking advantage of Java 5.0's support for covariant return types. [message #414755 is a reply to message #414748] Tue, 20 November 2007 16:45 Go to previous messageGo to next message
Ed Merks is currently offline Ed MerksFriend
Messages: 33133
Registered: July 2009
Senior Member
Philipp,

I'll try to find some time, but I have personal issues I have to deal
with right now...


Philipp W. Kutter wrote:
> Ed Merks wrote:
>> Philipp,
>>
>> Just so I can understand exactly what question I'm answering, what
>> methods will Super and Sub1 have in them and what will be their types?
>
> No, idea. You proposed something to Marco in your post that takes
> advantage of covariant return types.
>
> I am just asking for the details of YOUR proposal to Marco. My
> prepared model was just to save you time, by adding whatever I
> understood was already in the discussion. I have no clue, thats why I
> try to get more
> info.
>
> To show me what you meant, you might have to remove the opx
> references, thats ok. I just ask for a complete example of what you
> meant, which takes advantage of the covariant return types, and which
> was not possible prior to EMF 2.3.
>
> I know we already discussed this earlier, and I am always hesitating
> to ask for a complete example as your time is limited. If you could
> extend what I sent to what you had exactly in mind when speaking to
> Marco, would be great.
>
> Best, Philipp
>
> PS: What you write below is clear to me, and I know how to hide
> setters and getters in the generated interfaces.
>
>> Keep in mind that my likely answer will be, define an EOperation for
>> each method except the ones that will be generated anyway if you
>> define a feature whose accessor will produce that desired signature
>> directly. Container features are always a bit problematic to
>> generate because most objects can be contained in many places and
>> having an accessor for each place seems like overkill. I could
>> imagine suppressing the visibility of the accessors from the API.
>> E.g., you might define "ref" in each Subx and make the opposite "opx"
>> but then suppress it from being visible. In Super you get define
>> getOp (to return null), and in each Subx, you could override it to
>> return getOpx().
>>
>> Philipp W. Kutter wrote:
>>> Hi, Ed.
>>> I read the below post of Marco Pantel and your answer in the ocl group.
>>> As you suggested, I move the discussion to the EMF group.
>>>
>>> I would be interested in the example you give, and get it running.
>>>
>>> Thus I have a superclass Super, and three subclasses Sub1, Sub2, Sub3.
>>>
>>> Then I have ref1, ref2, ref3 from Super to Sub1, Sub2, Sub3, and
>>> every subclass has a reference op1, op2, op3 to the superclass,
>>> being the opposite of its counterpart.
>>>
>>> (see screenshot and ecore file)
>>>
>>> Now, what do you mean by "provide EOperations in the base that have
>>> the same matching signature as the feature accessors"
>>>
>>>
>>> Sorry for not getting it immediatly, and thanks for an aditional
>>> hint in
>>> advance.
>>>
>>> Best, Philipp
>>>
>>>
>>>
>>> Ed Merks wrote:
>>>> Marco,
>>>>
>>>> This doesn't really sound like an OCL question. Opposites must be
>>>> properly paired. You could define "container" to be a derived
>>>> volatile unchangeable reference in the base and implement it by
>>>> reusing EObject.eContainer(), which is the implicit opposite of all
>>>> containment references; the subclass references would then be
>>>> unidirectional. Or you could define three separate bidirectional
>>>> references in the derived classes and provide EOperations in the
>>>> base that have the same matching signature as the feature
>>>> accessors, taking advantage of Java 5.0's support for covariant
>>>> return types.
>>>>
>>>>
>>>> Marco Pantel wrote:
>>>>> Hi everyone!
>>>>>
>>>>> I have an abstract superclass and three subclasses of it.
>>>>> Each of the subclasses has got two EReferences to the superclass.
>>>>> I declared an EReference "container : superclass" in the superclass.
>>>>> But now the ecore-editor won't let me choose this
>>>>> container-reference as
>>>>> an EOpposite to one of the subclasses' references. It says "The
>>>>> opposite
>>>>> must be a feature of the reference's type".
>>>>>
>>>>> How can I solve this problem?
>>>>> Do I have to declare three different types of
>>>>> container-references, one
>>>>> for each subclass?
>>>>>
>>>>>
>>>>> Regards, Marco
>>>>>
>>>
>>>
>>> ------------------------------------------------------------ ------------
>>>
>>>
>>


Ed Merks
Professional Support: https://www.macromodeling.com/
Re: taking advantage of Java 5.0's support for covariant return types. [message #414758 is a reply to message #414748] Tue, 20 November 2007 17:16 Go to previous messageGo to next message
Eclipse UserFriend
Originally posted by: cdamus.ca.ibm.com

Hi, Philipp,

Perhaps I can jump in with a small example to answer your question, below.

EMF allows an EClass to declare EOperations that have the same signature as
the Java getter and setter methods that will be generated for access to
EStructuralFeatures.

So, for example, you can define:

EClass Seed

EClass Fruit
seed : Seed [0..*]

EClass Tree
fruit : ? extends Fruit [0..*]
getFruit() : ? extends Fruit [0..*]
addFruit(f : Fruit)
removeFruit(f : Fruit)

EClass OrchardFruit -> Fruit
peopleLikeIt : boolean

EClass OrchardTree -> Tree
getFruit() : ? extends OrchardFruit [0..*] // covariant return

EClass Cone -> Fruit
squirrelsLikeIt : boolean

EClass Conifer -> Tree
getFruit() : ? extends Cone [0..*] // covariant return

Clients of the generated API can then use the getFruit() method and see
return type covariant the specializations of Tree. e.g.,

OrchardTree orangeTree = ... ;
Conifer redPine = ... ;

EList<? extends Fruit> fruits;
EList<? extends Cone> cones;

fruits = redPine.getFruit(); // OK
fruits = orangeTree.getFruit(); // OK
cones = redPine.getFruit(); // OK
cones = orangeTree.getFruit(); // Compile Error

This example uses multi-valued references, for which covariant returns
require the bounded wildcards. This makes it awkward for features that are
supposed to be writable, which can be addressed by the add/remove
operations. The situation is simpler for scalar reference features.

HTH,

Christian


Philipp W. Kutter wrote:

-----8<-----

>>> Now, what do you mean by "provide EOperations in the base that have
>>> the same matching signature as the feature accessors"

----->8-----
Re: taking advantage of Java 5.0's support for covariant return types. [message #414958 is a reply to message #414758] Mon, 26 November 2007 15:22 Go to previous messageGo to next message
Philipp Kutter is currently offline Philipp KutterFriend
Messages: 306
Registered: July 2009
Senior Member
Hi, Christian.
Thanks for the answer. Can you send me the Ecore file of your example?

I have plenty of questions, but I think it's faster if I look at the
ECore, and ask then.

Best, Philipp

Christian W. Damus wrote:
> Hi, Philipp,
>
> Perhaps I can jump in with a small example to answer your question, below.
>
> EMF allows an EClass to declare EOperations that have the same signature as
> the Java getter and setter methods that will be generated for access to
> EStructuralFeatures.
>
> So, for example, you can define:
>
> EClass Seed
>
> EClass Fruit
> seed : Seed [0..*]
>
> EClass Tree
> fruit : ? extends Fruit [0..*]
> getFruit() : ? extends Fruit [0..*]
> addFruit(f : Fruit)
> removeFruit(f : Fruit)
>
> EClass OrchardFruit -> Fruit
> peopleLikeIt : boolean
>
> EClass OrchardTree -> Tree
> getFruit() : ? extends OrchardFruit [0..*] // covariant return
>
> EClass Cone -> Fruit
> squirrelsLikeIt : boolean
>
> EClass Conifer -> Tree
> getFruit() : ? extends Cone [0..*] // covariant return
>
> Clients of the generated API can then use the getFruit() method and see
> return type covariant the specializations of Tree. e.g.,
>
> OrchardTree orangeTree = ... ;
> Conifer redPine = ... ;
>
> EList<? extends Fruit> fruits;
> EList<? extends Cone> cones;
>
> fruits = redPine.getFruit(); // OK
> fruits = orangeTree.getFruit(); // OK
> cones = redPine.getFruit(); // OK
> cones = orangeTree.getFruit(); // Compile Error
>
> This example uses multi-valued references, for which covariant returns
> require the bounded wildcards. This makes it awkward for features that are
> supposed to be writable, which can be addressed by the add/remove
> operations. The situation is simpler for scalar reference features.
>
> HTH,
>
> Christian
>
>
> Philipp W. Kutter wrote:
>
> -----8<-----
>
>>>> Now, what do you mean by "provide EOperations in the base that have
>>>> the same matching signature as the feature accessors"
>
> ----->8-----
Re: taking advantage of Java 5.0's support for covariant return types. [message #414963 is a reply to message #414958] Mon, 26 November 2007 16:09 Go to previous messageGo to next message
Eclipse UserFriend
Originally posted by: cdamus.ca.ibm.com

Hi, Philipp,

Sorry, I don't have an Ecore variant of this example because, as it turns
out, it cannot be constructed. Ecore doesn't permit wildcard types
(bounded or otherwise) as the types of multiplicity-many
EStructuralFeatures or EOperations.

So, I guess this example is void. I should have tried it with Ecore, first,
instead of my ad hoc textual notation.

cW


Philipp W. Kutter wrote:

> Hi, Christian.
> Thanks for the answer. Can you send me the Ecore file of your example?
>
> I have plenty of questions, but I think it's faster if I look at the
> ECore, and ask then.
>
> Best, Philipp
>
> Christian W. Damus wrote:
>> Hi, Philipp,
>>
>> Perhaps I can jump in with a small example to answer your question,
>> below.
>>
>> EMF allows an EClass to declare EOperations that have the same signature
>> as the Java getter and setter methods that will be generated for access
>> to EStructuralFeatures.
>>
>> So, for example, you can define:
>>
>> EClass Seed
>>
>> EClass Fruit
>> seed : Seed [0..*]
>>
>> EClass Tree
>> fruit : ? extends Fruit [0..*]
>> getFruit() : ? extends Fruit [0..*]
>> addFruit(f : Fruit)
>> removeFruit(f : Fruit)
>>
>> EClass OrchardFruit -> Fruit
>> peopleLikeIt : boolean
>>
>> EClass OrchardTree -> Tree
>> getFruit() : ? extends OrchardFruit [0..*] // covariant return
>>
>> EClass Cone -> Fruit
>> squirrelsLikeIt : boolean
>>
>> EClass Conifer -> Tree
>> getFruit() : ? extends Cone [0..*] // covariant return
>>
>> Clients of the generated API can then use the getFruit() method and see
>> return type covariant the specializations of Tree. e.g.,
>>
>> OrchardTree orangeTree = ... ;
>> Conifer redPine = ... ;
>>
>> EList<? extends Fruit> fruits;
>> EList<? extends Cone> cones;
>>
>> fruits = redPine.getFruit(); // OK
>> fruits = orangeTree.getFruit(); // OK
>> cones = redPine.getFruit(); // OK
>> cones = orangeTree.getFruit(); // Compile Error
>>
>> This example uses multi-valued references, for which covariant returns
>> require the bounded wildcards. This makes it awkward for features that
>> are supposed to be writable, which can be addressed by the add/remove
>> operations. The situation is simpler for scalar reference features.
>>
>> HTH,
>>
>> Christian
>>
>>
>> Philipp W. Kutter wrote:
>>
>> -----8<-----
>>
>>>>> Now, what do you mean by "provide EOperations in the base that have
>>>>> the same matching signature as the feature accessors"
>>
>> ----->8-----
Re: taking advantage of Java 5.0's support for covariant return types. [message #414965 is a reply to message #414963] Mon, 26 November 2007 16:33 Go to previous messageGo to next message
Eclipse UserFriend
Originally posted by: cdamus.ca.ibm.com

--nextPart37385108.2NDooi4PQZ
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8Bit

Hi, Philipp,

Actually, I was wrong and Ed set me straight.

Attached is an Ecore version of the orchard example with the code generated.

The tricky bit is to declare the "fruit" property as an EAttribute using the
EEList<? extends Fruit> data type. Likewise, the return type of the
EOperations.

A couple of notes:

- in the generated code, I had to delete the duplicate definition of the
getFruit() operation. I think this may be a codegen bug
- in the generated code, I had errors in the OrchardTreeImpl and
ConiferImpl classes until I define the implementations of their
specialized getFruit() operations. This does not look like an EMF bug

HTH,

Christian


--nextPart37385108.2NDooi4PQZ
Content-Type: application/x-zip; name="orchard.zip"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="orchard.zip"

UEsDBBQACAAIACZcejcAAAAAAAAAAAAAAAASAAAAb3JjaGFyZC8uY2xhc3Nw YXRonZBBSwMxEIXP
Ffofltw7awXBw65FZIUWWqVde5U0Gbaj6SSdJGL/vdVaFKEevM0bvnnvMdXo beOKV5RInms1hHNV
IBtvibtaPbZ3gys1uu6fVcbpGINO673ofSvkJLvihdjWKopRxcfyMJanSeP5 SHrpAI2jEBGebQKn
M5v1Ph0m8+bp9n7W3oxnzbz8zREnFNYOLK5yB5m+LlFgkTRbLXY5bXcBy8nF ohkM4fIfhYJFMF4Q
BLeZBO2Dyx1x/MvK5xRyOrqtiD/hqvz5wHdQSwcIY3PMwM4AAAB2AQAAUEsD BBQACAAIACZcejcA
AAAAAAAAAAAAAAAQAAAAb3JjaGFyZC8ucHJvamVjdL2Sz0oDMRDGzwq+Q9m7 Sb31kG5BxVulUH2A
OBm3KZs/TLKlj98kZivLIngQb/N9mS+/IRmxOZt+cUIK2tl188CWzQItOKVt t27e317uV82mvbsV
ntwRIT5jANI+pu7k3ggrDbaO4CBJCV5UtsEZgza2go9VdusdoQg+UR+D7tXe I2RV5VOKSquKcyV1
DKHXPiA7qsjAUSrkSZYA0vcIKSGpGzI7VM2nhuAzyq+4XiHbSqs/McTH/8Xu 4YBG/gm0OuOTJ14c
CGv3l5jhd/3QaftaDjO9NP0UmHyPnWXGOhOvuzDdrgtQSwcIKKfl9+UAAACc AgAAUEsDBBQACAAI
ACZcejcAAAAAAAAAAAAAAAAYAAAAb3JjaGFyZC9idWlsZC5wcm9wZXJ0aWVz dY4xCgIxEEX7gblD
wC01uYAKFgpbaGVpo8mwRrI7YZKA3t7EbmGd7r0Hw0dYqa3l+BE/PPMeG5oZ N9X1rkNAePhJ+8mG
4iipndLrG4Ka38iOglkI5+P1sOkvp6UWQxnq6/cY/scoHEmyp4TwukvSlsfo A2kWR9LWICQuYknr
SkmsQeCSY8k/UbdX8QVQSwcIw7mUpIwAAADwAAAAUEsDBBQACAAIACZcejcA AAAAAAAAAAAAAAAZ
AAAAb3JjaGFyZC9wbHVnaW4ucHJvcGVydGllc61RQWrDMBC8G/yHIY1vwb2X phCwC4HGDo4/oFob
W1SRhOxEze8rWS20tx6s0+7O7uzsKE0e8Nxpc7eiH6aXNKSPf/JQWu/5Ok1C tF3gBZ5Wo9OcwOlG
UhuyT6EKFBpV3aIbmOoJ00AwNsCToBHvNDki5ctihBSKwBQPTXF2lWUZyqpA /Yq22VWnt11bFjg2
9bFs2n15gm9YzYN5nDiwD88BRe5nzR2KXWgDZgwFbj1rCKE+z+FZyLg2Sow8 AZjP8f3XMer+TZov
Z92Sn/Afv5ZUbuS1F6ryBmOL2noHLcfB+yY9ZvVNcLLfqHMup092MZJybfs0 +QJQSwcIIf1eEPcA
AACpAgAAUEsDBBQACAAIACZcejcAAAAAAAAAAAAAAAASAAAAb3JjaGFyZC9w bHVnaW4ueG1sTVBL
T8QgEL436X9AsteCxosxtL2Z7GGjBz0bAiMlyyvAmvrvhaV2ndN88z0Ghs2r NegbYtLejfiB3GME
TnipnRrxx/vL8ITnqe/YDMLokOCmfSzaShXybhj6DjHhw0/UaslTRfQ/LIPD UR76bhiaJZiL0q4x
iMGawdVYFLx2ecQ+KrJtJGC/Su8jEAUOIs8gPwMXZ64A102l2IZRg6UuUaMR 4SXn8EwprNwGA3tk
iadJLGB5oq9RLDxKfPMKw1Oqbt8osknetqW7sLzn5CWYqrW1oX+OwlwHGNHp Gszo/sd2ALpf4BdQ
SwcImoRb/eYAAACEAQAAUEsDBBQACAAIACZcejcAAAAAAAAAAAAAAAAcAAAA b3JjaGFyZC9NRVRB
LUlORi9NQU5JRkVTVC5NRlWQzWrDMBCE7wa/gy+9VaIJ9OKQS4MvJSmhht4V eeMs1Y+7kkycp68c
pbZ722Vm5xv2IAyewXn2BeTQmrJY8Zc8ewumUcAOD3US15P0ITSUxVOnQotm XCalHvTJKpTJYUle
BDWbwqFpFfiYsvUUZvsSvEDvlHDuKPylLPjCaxpLI5Zsjw3QP/DeSqHwJvw9 LjWbxE/4CUjQVFeQ
YXRUpkeyRoPxZfG+riu24q95Vl07S54dhfwW7dz/Oc/+Ro66U8s9xqk8ewBY 4o2HLQepsHPApSXg
FIxHDely1kCf4xwNmx4dnlChH8otAdyLxELJx/biNtReUGyb/vcLUEsHCPuV 4X37AAAAuwEAAFBL
AwQUAAgACAAnXHo3AAAAAAAAAAAAAAAAGwAAAG9yY2hhcmQvbW9kZWwvb3Jj aGFyZC5lY29yZeVW
UW/aMBB+r9T/YHnPYGAvU0RatR1MSExFBaS+uuESrCZ2ZjsL+/c7myQkKpNG S6VpzQtS7r7vu7vv
7DC+3mUp+QnaCCVDOuwPKAEZqY2QSUjXq2nvC72+urwYQ6Q0BJMFj555AmSX iaBBjRB1eUHwQTJp
AgyGdGttHjBWlmVfZUlf6YQ9fp/ROsV0U8rPPmM0GAwxbb6MtpDxnpDGchlB h91X0gFDlIrcgGeA
LHYsIzZxaZRInmGy0tGW603FI836YdYwwI5neQodFuP1DbuvcAhZaIjFzlPR K8czhruUGyNigXMg
2FBgf+WoVU3KB2v9JcCGspNhU10Iu1dzwKXVRWQLzdMpcPyFI/gHiEGDm1nF YZw0KfIc9K0q5Cak
vSF6vPKgT4z50vYK7omUtFzIDKQNKepBXTZr131yJysNcGjkHovhFnfHVOEE 7L5XkqqyKXRYIxzm
G0jQInJ1k5ZwI/eVW+6Df7UY2PhkMhfGHiSciCO40Unh2jetiIutmxF29ZFq XztrU7E/cGGg1Uk9
EdYayUl231irxVNhG7vjY2MkuMUyAf6UugyeGmg5bjWXRhz8/jgzfzngc6x6 dWdU+wzLAltwuqZV
9ts8NiqDBSi8tObiGWa2Oc6vtuVWqRS4PM9Zrwbgj/yL/v/vi6Dj/Tnvgzda cqfkES/Osos/CqE1
pOafXEXsW+D38KOtobf7XdcPX3T+EOKr31BLBwhmrcExHAIAAEsKAABQSwME FAAIAAgAJ1x6NwAA
AAAAAAAAAAAAAB4AAABvcmNoYXJkL21vZGVsL29yY2hhcmQuZ2VubW9kZWy1 VVtvmzAUfq/U/4C8
5+Es0qQJhVRTWqZIvURtJ+3VNQdi1djs2OTy72eDycISrcuW8YTt813OZ4wn V5tKRitAI7RKyYd4
RCJQXOdClSn5+py9/0SuppcXkxJUpXOQyRdQd/4l2lQi2QHHDnh5EbnH8SmT uMWULK2tE0rX63Ws
qzLWWNJvd3MSSoBrhEERcClqA20hVAUdj0ZjeuPLBty9lbexvVcStYBrgcCt xm1KqEa+ZJhTgzyQ
tyUL2ZRCza9TEgoC9J5VzutDPyeqWqMF7ArLnbpTjvu1GPacc13VUjDF4RZW 3vpHnzTX9RZFubSZ
AJmblBRMGiBTj5kUDi3KroFpcNNxTuhgra12oSwYf2UlmKhGKMRmz24uTK0N e5GwQL0SOWDGQhAW
G3Bb7mkDftd6J/aOdn46jZlkxjiJdqkdHJTTJ4Cc0BNBGTbC9kodLANmG2z7 0TWgdW7vtXJu+VLI
HEH17jm6Spj52UFDgSAl7Si5eYQCHIxDdFSdmoFx+tP5ib08I8CbrTwCy7WS 21/sd1/Acf+frUXx
0thD/16RFm2EdCD84NSYdUc0ON6Nj7t2PdtsQPMPMYTP73c7e4bW91Wo0RUs QNcSbsUrzM/ZxuGm
npDtHsdZI5758/DfovXs1HxvBCJIc75EHa9wJ/Gv0wz4P0iynej/i/4aowf3 mJv9AVBLBwhqGv0J
BgIAAAUHAABQSwMEFAAIAAgAJ1x6NwAAAAAAAAAAAAAAAB0AAABvcmNoYXJk L3NyYy9vcmNoYXJk
L0NvbmUuamF2Ya1TXWvbMBR9D+Q/3JJCPpit982EjMEgMNhY9z5k+8ZRo0ja ldyulP736cNO3DRp
YZvzEH3dc4/OOWKLxXgECygqbR5INFu3THP2fCEuXq/r6zBg45Hh1Y43CJqq Laf6w3gUfqxHu8oy
KLERKmstUlbrCrIsIX8EQkNoUTnuhFagN+C2CHtdowRd3mLlYFrgflmUy09a YcHKZcH8fJofwVHV
L6DTrkltfnjIjZZS3wvVwAa5a31T4IRgW2M0Oazfp4pWphKAQorl40oKtesv lgcGE2FvfrWCCKX9
Ina4dhD4HdYgLMLaRZZPBfMonYg9dMHMkeLK4kG4/Gv6/5b0nDToQsfZPJ2M oqRhgwqJe9a9A20p
RQVCOaQNrxBCHeBv56Wx8Jla4eDRn/VfsiV8C/iOXghlo+R3XLbY699LfuZW vf7AnSNRtg7zA95l
q7t9cxyvO6eRq2DKsPF5LQcdQVg1dVBJ5PTugOjrvaGEXMoHsFvdytqT8Vmi eC8ONdqKhIlBC2fz
fECdDbhdSlXaXVGU7YJqb5I/9ozeTyy6k0DNSq391dT8+cnXU/LzFGRQ3Sen mw7TE5dYGnRt4UXC
Z/P4pk/jc4PuXHb++dH8XbZe98xw4vuOaGCp8P5/mHdGqrd1vtOihsu2J15J 8idgLD7m8egPUEsH
CAKeMd30AQAAngUAAFBLAwQUAAgACAAnXHo3AAAAAAAAAAAAAAAAIAAAAG9y Y2hhcmQvc3JjL29y
Y2hhcmQvQ29uaWZlci5qYXZhfVHbSsQwEH0v9B/GurAXaPMBdqsiCoKgD/5A mkzbuE1SJym4iP9u
ttmbKOYlkzOTmXPOsNUqTWAFpbDDllTb+Sq+2U9gAmePcrYLWJoMXGx4i2BJ dJzkVZqkidKDJR+g
tkDRq8FhgbophNXammL0qi/un5TzUzE7DL7Ic6ixVSYfHVIurYA8jyRugXAg dGg898oasA34DkFb
iT3Y+g2Fh3mJuirr6s4a1SCVrK5KFqB5ceqPRv7qflR14/Coo3iO90uUd9mi 3/ddLGPxNDuGLRok
7lEePBnrXglQxiM1XCDsvwJ++MDAwSuFSZ+hOpyof3f+8+As/4eGmI2UYKOM XGd22FEKXmXBu/dR
EQbQ04gZaG6266zhvcPs9PlcxASxGEybKq+P3IMWrCD48UCj8ovltMQvYOyg Mk2+AVBLBwiYLe/u
PAEAAEwCAABQSwMEFAAIAAgAJ1x6NwAAAAAAAAAAAAAAAB4AAABvcmNoYXJk L3NyYy9vcmNoYXJk
L0ZydWl0LmphdmGNU02P0zAQvVfKfxiWlbpbEfsOISqHRVoJaRFwR44zSc06 tmU7QLXqf8cfSRNA
XW0unY5nnt+8eaa7XbGBHVRcm6MV/cHX+T/9O5GS1/ftdQxosTGMP7IeQVt+ YLZ9V2yKjRiMtj6k
eoJcCuOQ4NARrodBKzJ6IcndJ+H8c8XItUVy99D8QJ4L6czwVVlCg71Q5ejQ lq3mUJaZ7QewaCw6
VJ55oRXoDvwBYdAtStAJDLYVDnXV1B/tKHxFm7qiIbElCzqq9j/sfGryPd8C Zqel1L+E6qFD5sdw
KzCL4EYTB8L2be4YZW4BqKSon/ZSqMdZLZIovO7Rf0VsIfKKQeJzqmion3Yw g1TULGT2Ds+6k4f8
+zmvI0Im7JvbXJoEyGGPCi0LBOcNjo0UHITyaDvGEVIj4G8fZHAwrQCeQnn4 8hbit4MvGMZWLin8
k8kRZ7lnhfMws8DAdViLUEPYTthThxZVuE4GJ5AzZlQ2ZlJxKMyiRtyjQfhH voh/WnovO2M6N0t8
PxkDmYorXBM/r+A5xiCc2gaWEpl9c0YNGIGtRSblEdxBj7INhIL98gwMWnTc CpO8GWsJWdGnK36X
fJhP9zZJf0H5Fw2w3PsSH32PmMlMU09+USv491fejni1VKx9llI0B+npVxGv hsn5N7fphZ+A0uy+
YvMHUEsHCEGwvej5AQAAkAQAAFBLAwQUAAgACAAnXHo3AAAAAAAAAAAAAAAA JwAAAG9yY2hhcmQv
c3JjL29yY2hhcmQvT3JjaGFyZEZhY3RvcnkuamF2Yd2WXW6cMBDH35G4w1SK lHYl4AClq0ZRIu1L
WjV7AWMGcMvayDZtV1XvXn+xhQ00yjbaSOGFYfy3Z34zgJ2tVnEEK8ip6PaS 1Y1e++ds6nDOi015
YY0sjjpCv5EaQUjaEFm+j6M4YrtOSG1cdYq0ZZ3CFHeVsYXE9OaWUC3k3imz IeqbJIECa8aTXqFM
SkEhSXwG2wYhL9ZhWp4Va6iEBG3cO1FimzrVRkMnxXdWogICVCLRZhx1I0on R0Ib4IInpFBamrWA
tkQpENXxSi4X5OXDTD4qPICmn/z9s+f34zVylCZwORSnL1pGgXGNsiIUIUwK LIA/tQmkYKgJ/DIT
zeXLYi+PrxivW9SCm6WUJtysFPKu/MT0IF+u5Gh8hs6PTgicK/PGceKbu/vt 1d31DXw4FMR0vU2n
uo11Mc7023eu3cdsX1D3ktuGcfwBoviKpi+GzLfmMsfd+h6xzDNjXD4bo3RR nxp0sTRWHF44a56O
eit7ps/OOht1EdapA62zT8fdSsSz084FXYS14sBqzdfd2eHLHTV47HrNfQ6c o3aPPKeDXwt+fvC5
oIvgVhyIrflfqKxC+RK0c3H/BWz1f5nt0yPYdpsdTjmq7+zRxvzwi70ZYOrZ N+DA/MSgj73a4ZQC
NeqpJ7D/hiybbt1x9AdQSwcI+wuPzPABAAASCgAAUEsDBBQACAAIACdcejcA AAAAAAAAAAAAAAAl
AAAAb3JjaGFyZC9zcmMvb3JjaGFyZC9PcmNoYXJkRnJ1aXQuamF2Ya1Uy27b MBC8G/A/bOEAfqAS
76kguJcCBgo0SHoPKGkts6ZJglzlgSD/XoqUYvmVBkXkg8mldnZ2Zyi2WIxH sICs1ObZinpDedyz
w0AIXq2qq3bBxiPDyy2vEbQtN9xW38aj9sd6tC9JAgXWQiWNQ5tUuoQkicjf waKx6FARJ6EV6DXQ
BmGnK5Sgiz9YEkwz3OVZkf+wjaCMFXnGfGCa7tFRVSfY8dTEOr895lpLqR+F qmGNnBpfFbhFcI0x
2hJW1zGjkTEFIJMif1lKobZ9Z+mv+B+YTIS70zu8QW0k/hRbXBG0TNsgxCi0 YVhRIPyaMQ/YDbSv
kjGzZ7t0iMelbuJsJzXSsPhsHjPCoOKyRoWW+0Z6VZpCihKEIrRrXiIM8wGf yE/NQdy9+Bz/RMna
ZwG36GekXJDjgcsGe216Oc722YsDnMiKoiFM3xAvG6E7N/v1qvMBctUqNix9 ab6DmiCcmhKUErn9
+obpEbzeFrmUz+A2upGVp+O9ZkNvHCp0pRUmGLF9N00H5NmA3SXTxdOlDaO7 MLkP0N9XDY6YOKRj
p80KrX13an746sfMc3+CNoDpHdVth64KIRYXXX04vQSzefgAHPvpDumcmT7z gv2f697X0nDLdx3n
lrDCx88R9dzg/j32By0qeMcPkVtU4BUYO7j049FfUEsHCHc+S8D3AQAA4gUA AFBLAwQUAAgACAAn
XHo3AAAAAAAAAAAAAAAAJwAAAG9yY2hhcmQvc3JjL29yY2hhcmQvT3JjaGFy ZFBhY2thZ2UuamF2
Yd1abW+jOBD+Xqn/wdddqbu9S7j3D7fZaKuW6KLrNr0kle4bImSScCWQNY60 1ar//WzMmw0ETEnI
JV+CscEzj5+ZwePRrq7Oz9AV6lne5hnbyxXp87Ym3ghuvh3O37IL7fxsY1pP 5hKQh62Viecfzs/O
z+z1xsOE3lp2wXLsjQ9dWC/otYehq18Tgu3ZlsCHspE3jun7paMeuASl48aw AAyuBYGMWqTvd50O
msHSdjtbH3Bn7lmo0+G6T1eAerN+OEFPm/XRwsOI0Ntrbw5ONxg1JMjyXGLa ro9MywLf97CfDARi
Im/2L1jER8RDGDYYfHAJn33r8KkQ6jl2H0xrhSym9Q89jbblrgWYZIsp2AtU NhTc7TrTY7pz/uDc
pFKR5w0kI3paJEsACbjzLCCffIhXujvi/wPTIh5+5v0BLOjJducfL0JmXPCe JbiATQLziDfbmWNb
yHYJ4IVpAQpfF4KN4CuhIvgoWl70jT5If3zd2I+vT8Q/11xDN+4pXtVUf46K vFcQNril8YsJZa67
RHB//VlHH9FFCMVFwKgy6fwNU/NxPDycmBODTscEXRGy+UPT4Ku53jgQWwe1 FM23VrA2fW2krsth
MZ8YD2N9MPwnBL5YUJ+Od4B4LmWXT0xq8cxgSKLC3mWWuTy8n0yv728YZyLr ob7K6YrjhuyW7drk
3ftC3VLuBNnz2Mtcfvvk2O6T+PYJwJy9E/Vg3WeNnkYvXi6522gMhLRPEObd MSSr+JslEPbgu/fl
8FKngSa6fkvh/LEQKer/ZoDZyvsEby3qN00ncqB+RIhLAZqmkcnIjz55eE6D UJFCxkC/nj6OdeNm
9Hg/3ameChEGeGuTmAlB60BUiGdW5kLwZFUyDMaPQwbXT4VwRZEzDRUDg4Z3 vvyzfkQBHsvXNETT
YB1+MiDH9kk7vAh0M4wG+Z4QoFXCc8VkxhcvoQrjpxggJjxrHIjv0bzKdGcP VmX7dKyzSPJzHbKH
ax+z3Yw+xtvhAFPFMCLzbYLc8WK3yu1Ar/1QO/rsbs2nywIocz39gqqcH41v /rwe38ZU+eUEPb2g
Y+zxU61aOntrQA/g0c9+dGc/Ad2uHo/5yxqPPuvGgz56uNONu+FfuhEsdV6c +P6UAqGIguw18tVv
1Je0FS2l6es6EpXYGWEdxtBfTyCGplVKYmmqdTJRVdBUtpOcm7u8hIqZ3Hhu Yh+scSD7iOZVNgz2
YFWLuBndM0v47QQDKlOtsTj6ZWtjDI5/fFE0VPPvx+F4rN9NDhI6Yyto1SEE mh8yYFK1bcrrtDNg
7cP5g2j2Oi6BPavgFYYDfUzh/P0EQmSozb6iY5oFbdtDoKdCbMzqPgaqoevL p1fBGge6ZUyDhQE5
ydwYADgQZ5c0Yg63m28abEA59fmRI4pz0bnkUAcoMIfMRv3AEKV2OwUYBSNU QAq38MoosXvFHwv5
8EUHBG0QrUzeSgwUtEj7YTZIKeWdHGXHi2A0ylf2uS9vBg/M1mTHUQAnG6DC Vb5LrEXVOHrlAhUv
XSsGLslXzdAFsfOoWHVLnRRzRBAbdX1CPhPTucLjd6BpaVW4KWZEG+Zo+uVv bJ8lBHk+kG1khhzV
3CxhmxwuEqgK8jlK5nFcNQ0tcj39tJGdrln6/x/8cUrUGtSv6Z3zUWObUzlX c2C4kv1xAVxsgApO
PKXTsGtgL2XWEuU20h4hm+9o1R/kirML3KxeeU6gaqZMNH72lJF5e3PsZbvJ nPzC4TmcbGuLkWZj
FJnMMxGleC14aSG9NgmyMN16A++I6rribXhcjtk0PLVFKKsNC8sm06GE3ynA pUylW1jYLpXGsQmd
1ikqQGVqpEtQw5fz0k/eKCxFzXTvLkfNDBdKUtO9xWWpoXhaWr6aNXlJpeld BFFYUipCzV8jJwZD
WJsouKuynuWa5thiXvFd0bAKBXgFeKYxTRl2mGWPSx272RxKYzhXrX3YL9Jy AYQa1OJnpxrWURZT
AFvePNRCW/VcJ3IBe0G8FI0kDSKWTGRxkdMjjVGx2tH5fokonZ+r8VDY6avR MDxDF9CWvuNfQ8LC
M4R2SZd8CIoH7hkYMpmQxkinWAK2X/YVlIOpsTB3L67GRrlCTFiPggTLa+hZ sbDqWMhaqdSqELNd
GY6maX0MLjW/MqkWp1/hYKVipbzVacLf1i952e8iSOUvaugLG3s12MOKGAFu Kf1SC2eVSpJjcRvF
tSUZeHYkRJqkZeX6i72TU6rFUOanUI+hTNGwPENeBim18sIuXpCmiVKcn/0H UEsHCOfJ74GhBgAA
8DsAAFBLAwQUAAgACAAnXHo3AAAAAAAAAAAAAAAAJAAAAG9yY2hhcmQvc3Jj L29yY2hhcmQvT3Jj
aGFyZFRyZWUuamF2YX1R207EIBB9b9J/GKvJXpLCB9it+qCJiYk++AMUpl3c AhVo4sb471LYS43G
eWHmwAznnKHrdZ7BGipuhr2V3dbXqaY/gQhePYqrKaF5NjC+Yx2CsXzLrLjO szyTajDWB6gjyHs5
OCSoWsKNUkaT0cue3D9J5+Njevz4oiyhwU7qcnRoS2E4lGUicQcWB4sOtWde Gg2mBb9FUEZgD6Z5
Q+5hUaGqq6Z+tYgVbeqKhnpBzsNRi1+jT5JuHZ5EkOd0viRtlx36AzLNXq5S Q/w8pR1qtMyjOJoy
Nr3kILVH2zKOMGsH/PCBiYNYfIaOEMmEKf4zYnb/h5Z0m2jBTmqxKcww0QqG FcHA91FaDKC3Ixag
mN5vipb1Dotz81xIhGhK4rqqmxP3g54HO0pfQ/AnZstV3OgXUDpXnGffUEsH CCZ4da46AQAAXQIA
AFBLAwQUAAgACAAnXHo3AAAAAAAAAAAAAAAAHQAAAG9yY2hhcmQvc3JjL29y Y2hhcmQvU2VlZC5q
YXZhZVDRSsQwEHwP5B9WPDgtJPkAS/Ee7sGnE/yCNJmm0TYpaQ4U8d9tG+9E fMrs7GZmZ1VVcUYV
1SZOH8m7PjelVn+Jjdw92d0KFGeTNm/agWIyvU72gTPO/DjFlBfKSZjBTzMk xm7BMUEeT+0rTN4G
1cX0Rghq4XwQ5xlJ2GhIiLLAgRKmhBkh6+xjoNhR7kFjtBgobmK0rzE2ddu8 ALZWbVOrpd7LX3EE
+0/6GudxxjWAPJX3ueS6dcir6N19mdxcC3QISDrDXi5xbgdvyIeM1GkDWv8R 3vPiPdNPbPrk7IuU
2pqcfQNQSwcIEdvx2+YAAAB2AQAAUEsDBBQACAAIACdcejcAAAAAAAAAAAAA AAAdAAAAb3JjaGFy
ZC9zcmMvb3JjaGFyZC9UcmVlLmphdmGNU8Fu1DAQva+0/zAslbZdEftO07Ac ilQJqQj1XjnOJGvq
2GFsA1XVf8exk80iWIlcMrZn3jy/N+a73XoFOyilHZ5JdQdf5TX/cyNtXtw1 F2PA16tByCfRIViS
B0HN9Xq1Xql+sOTjVsdQajU4ZNi3TNq+t4YFrzS7/aycvz6bitISstv7+htK nzD5zO9NUUCNnTJF
cEhFYyUUReb6EQgHQofGC6+sAduCPyD0tkENNoHBtsS+KuvqgRBLXlclj+st W8DRNH9B59Mht3mI
kK3V2v5UpoMWhQ+xKQhCcGEY74PN+1wRdC4BKLWqXvZamadZKjYyeNuh/0RB eRhppSgRei15LJgc
mFFKPixs9g6PqrP7/P+SzRhBR/DLq5yZ7p/DDg2SiARn+0KtlQRlPFIrJMJY B/jLRxUcTAbAS8yO
X/Zg/HbwFeOtjUv6/hA64Cz2rO90l1lgEN6TqoNHdsQ47+V0Pizx3WQlCjOq ftpsUe2kCyhnth6k
RkHvjiixJrpEKLR+BnewQTeRQBwQSvwFNOgkqSFNz5jL2AldfsLn3Kjk0z0l ec6o80/CS5//cPYx
QSR/p5o844TfgyJsbjaeAm6gF+b5ZtMK7eLCkzBOxccxn0Zk06GoNc45C97p oKQtnoP0cMsPxxFJ
RCqYx/jyKr3WV+A8jdJ69RtQSwcIwwvaw/sBAABZBAAAUEsDBBQACAAIACdc ejcAAAAAAAAAAAAA
AAAmAAAAb3JjaGFyZC9zcmMvb3JjaGFyZC9pbXBsL0NvbmVJbXBsLmphdmHl V99v2zYQfjfg/+Ha
FbAc2NJ7onhJU2UQZjRd7OzVkKWTzYUWNZJKahT530uKkqxfTocNaAyML5KO x+N9990dKefsbDiA
M3BDlu452WzlzHw7TUEu/OBHH/SLMxykQfgYbBAYD7cBj2yyS+nFcDAcqBfG ZSW/YQledKR35vnF
GGmu29gYUpIKtHEX2yHb7VhiJ0ySeG9/1g8SBpKw5LVVGDKOtndDAyF+rKd9 t726bb9E45TheTed
who3JJlmAvk0YiFMpyZU1wloC7jDROargcUgtwg7FiEFtv4LQwkjF3czdz3T AXGd9cx11PfIPljH
JOradlPzXCpzMaOUPZNkAzEGMuMoIOB42Bujc7Mmo2YRgEvJ7NsVJcljg6ic FY3xFyIWf2eEc6Ri
Th7Rl6DdrGSgheDL3NkX11Hmiuwo93Cd9JAfVxtMkAfKkzJLsjUlIYSaByg3 BfwqFVgBtzwjMpdU
GIwWfFPr1TDR18NEIMI4yKiEp4BmWEZ5VADsYrHGr6EZQSAlJ+tMol3tcpzn 2nwPU2b2SiD2+nHQ
qEeoEDEeIT8IHPOSciZV3mAEQmdVCDFJAgprxigGCSz+ePDv7735YjX3f/dW /nLlffJurx/mS7iE
OKDCVFVfFMMg3Cqz/68glnETrXS/fCWSvRH8j+A6rnc8LctEBb4oAz1EliK3 xhdG8vITPbu6e0LO
SYRtR017BVzk+Zl/NH3mqLpUAs1mb8+JVPtQYd/cffbeAE/Rk8qE6Ev4LoZW 2ryd20+MqI6Asu10
CSfB59ZUA06pxmjUbvyXR0Dm2dfR7e5TUycxWFg/T+9R62JkjccHLT2M1t5S 5qBzAltyS8QE6mJ7
4S0n7YzSibRadep40oNy0oYyPoWSMtTemYsC/obSIoksT3n/06SiTZ35jD7h QaDvL8t9is1e8Uxk
uAWrMtCY1SMMBP7DKJ43V9Zqoq9yfoWPxjN7ef/gwXn1eXs9X3i1FHnplpju cHaOvoa8QlwhPRm+
8lLERZetgkiV03/qM/anctPTGiyrIGFceWQX+ZN/WVUNdEnuZ6ygatGkqrJ+ Ygw9JKLN0VtTcvzO
8S+pMBgPCE6GgrJRoS86lfIWTat9kr37wQWwJ+TNfmVwnWDkF+perv4VJTMv zWtNfkL74gtnX/eq
/puYDkuqG7AeRvgxi2Pkui/rP7H8ItCYsdo26hltVtlBmiqU1nuwWnScw/vj 6u2T+6jiaDxqTubY
Cp0GuIqpF3Cc8uI9HHwHUEsHCM1jaL6sAwAAFREAAFBLAwQUAAgACAAnXHo3 AAAAAAAAAAAAAAAA
KQAAAG9yY2hhcmQvc3JjL29yY2hhcmQvaW1wbC9Db25pZmVySW1wbC5qYXZh vVPbbtswDH034H/g
gAJ1A1h+Xzy3Q5AAAYpm2LoPkCXa0WZLniRvHYb++ywr8WXO2rfyxTRF8Rzy iMlqFQawgpSp5rcW
5dFm/j+ZB/rg1Z5fOScJg4ay77REUJodqeZE1E21DoMw6Byl7RDfKInrS1FR oF4e7HQr7DJ88N9P
HnSOUxJklWgMEqwLwlRdK0laKyqyvRdmVuz/qV+l+NHiKxeQKY1ku6moMT2H 5Dy8d3EMOZZCxq1B
HXPFII79ID9KcLPBGqWlVigJqgB7RKgVxwpU/g2ZhesU6yzNs9Ng0iTP0qQL XZMRACVflk+bs17N
qNNdiRI1tcjParV5JRgwxxxOGPuOFeCT7coaeNSIfWDgOuTBn65IZ75ZZy81 PDm/wNefzuj1ocQ7
jVa2mwbyKcfo5szAmWkb1NHN2keenQpvRO7u8BO1Fhz/5eofBOAXpy/rf+ac NdpWS5g/YnIvbIdT
GbI5POx3289v0RI8HB5facu/lH4T0tvhfbg1zqBE2y/ovD2f6zM0mray8AEk /oLJUpEdNXaj6oZq
9KmDhs5Gr1Aaoh6kK/Fk4b1XnIzQM2xnooCozxXSWCoZdgvmIBaJXgtHkFDO o8gnuatTLicRLrgL
RX2xUbhnSJLJyw2Dv1BLBwiPAoa44QEAAF4FAABQSwMEFAAIAAgAJ1x6NwAA AAAAAAAAAAAAACcA
AABvcmNoYXJkL3NyYy9vcmNoYXJkL2ltcGwvRnJ1aXRJbXBsLmphdmHNVttu 2zgQfTfgf5h0i0YO
Yuq9UdwUqbswUGwWddo+FjQ1ttlQpEBKzgZF/n1JUXc5F6BoXD3oMiRHZ86Z GTI8ORmP4AQiptI7
zTfbbOa/w66hML5exK/dSzgepZTd0A2C0mxLdUx4koqz8Wg8si9KZ/CD7ijJ My7IpRICWcaVbI9X
6z7qnGdnA/OVf/7r/zIcXyLGXXcbgkzw1CDBZE2YShIliVQZX9+Rf9yDM+pA XG4pl89YWmCff+Im
e2wyMqWRzC8FNebsiVkLmaGWVMyvVj8sIU+7dZyScvaix+/+FR60X3GpZGZD TVBmVRhPr60x1oGH
VYIcTaewwg2X09ygnsaKwXTqk+W9BIcV3b8KkkGtIdsiJCpGAarAA8cRJrNo NSskj8LVLAqt4Zg0
7lHGQ+dR6p/X1t/a5pK65XIDa6RZrtEA1dj8HOO3fk0u/CKASPDZzwvB5U0n V33iOVb/2mDm0gkc
PPdSwLqPQruwLIXKWxSmTTFcbFCipvafVUnkK8EZMJcLULsH/C+zcRloCdkA LifCT+vDXp5sd/l4
GWVbi2xHRY4Vp8dlNBXuYNJDfgyskR40rlGjZAjCSkpq9w/r2RrfI4gfvTCI LQSNvU1KaVI6tghq
Q+hfUq0yS4eNrsi1yDmaganqus/GL8IdwBqgqAWzfJZquMvkKepgcuYt9y8I 7eJqh1rzGAd8Fd0G
cOlqjRUfXcwabWlI6PZQ8onb0qbCkI+fvyyuDxBQWR9tuZsUbsHnawhcHsD5 OchciM5goUkxCBJv
4YFe590H7k6Kejy1pcPtvcdJQcX378v5/EMlcclKj8syLw+dA57BwXYGuJB2 osHPmKgdBr2dBpTt
G3ou41PgtiOUrXPx4XSPp8RsTLcAbnnGthDUqwZyMGrwEWLfdme3SA2CznYT vZtN6oSYkBU1nJUB
NQEU+B6XylUs6THSOGhF3/Z1eFVLrfBvzIKeTCulBFJpIzRK7LAxuI37+i7F l1Ksluc5CrhAWkHU
4GvQh6B+maepRWK+US3tOcIEr3Jp91h2g/GryWPy7BSPbc8dilPqZrvRV7dN /3Ypag1sZ0OqO1oM
59A4fi9EEDSn8OhdfSQpuuSkRr7HkVd0v9qlzMuuzH1vhy8sr9wXafra/RFS PYNhD70B9scwW7Uh
XJhBYbxUSyoOA0f+pABv3sCRMxBu5kma3T2vUXn0+/m9hzCsj4bj0f9QSwcI Jwfna5ADAAAvDwAA
UEsDBBQACAAIACdcejcAAAAAAAAAAAAAAAAwAAAAb3JjaGFyZC9zcmMvb3Jj aGFyZC9pbXBsL09y
Y2hhcmRGYWN0b3J5SW1wbC5qYXZhxZfNbuIwEIDvSLyDiyo1sCK5l1IVQdBy KRVlzyvjDMG7IYkc
pz9a9d3XduJgJylwafGlZjxjzzeeGafeYNDtoAG6I0n6zmi44/fFb88WKOH1 IriWE6/bSTH5i0NA
CSM7zAKX7tNo1O10O2KSMF7JB7YwdIFENM3Ahf1WzBMGrj+NcJaNTmktN3+A 8JNqT4Vjp4+VHrv+
HBOesPdFw/02kzTKQxq7vvzxpObKxtMxvBoO0QaEeJhnwIZBQtBwWMRzEiN5 IOwh5pjTJEbJFvEd
oH0SQITuNvelJ3fe5t49bAdx0NzsIYQYGOYQ6NvINxEliMhAomUReoMMwRsX G2XIxD34UzdB/8S2
YhRccgzQlIE4L1MuB7DFecTRtlS3wdzK5vN4GOstgMWqBalEXjEpYTN5HKm7 TmPKnb4mkIMfgPSo
2QimmmSMHFvS13nlrgRPJvZ0F4/P68nj1HdD4DquTm/HeXrrefCGZVCqHBL5 5GVkB3uceeXOvf4I
2W7RLXKavlyNUZxHUb8OIQcDnrO4CTCyVT8OP40pwZzskOO/EUhVRoKeNc4y Mv7AHSWhczAZtZ5R
OhjDa0taOtroQ1bRZxmHReXE4rJjArpmysT7rkxr89yMUJanwI7DfJGDD8sX YIwGYPlbtkpEVASd
or8iUH9sx1+pSoFiSSaymtAtBbaYOf1GHhCcgQ6HLohn35/d6osujnwGCJz+ 6LTtfPVrsa4Zz1ku
S/gM6/XK92vGawZwlu1yNf05Wc1+t3mg7/tsR/RmLQ6Vmmf7NV0+1reYJvHZ tou5v2qa062Rn3qU
Xfy22VX4jiWvqmYXUQQhjiYszGV/r1qF01uLMiyem5se+oEOGfSI98JbIerd IJqhOOEIoxcc0aDQ
V8nVa2kX31k3ZaHIPLVS1sx3KVHvZCa1xioeWmYFs4y2VLtACyhRVLLaFWTC KJGi2SrFAqeStvEo
xcsByYqxitrEkRJFw6VWAaNlbSxS7XIoZj9pbTEmmrmiEBPTemw9pceuzzS7 OLpxmVZDbAGvrjYx
TC3sYxdtGF0OWjZsq3ebmFKi+IjUKsC0rI1Iql0URT4e9aekBiSFmkmpV1h6 5RMyuXzx5CyfTyQe
L1tic5ZeO7ZOX379V/pfyBJAyoCYMEc+C2c15dZ/mQzuY8C1jwzQ3/8m6wfy vOZXcrfzH1BLBwjv
B28vdgMAAF4QAABQSwMEFAAIAAgAJ1x6NwAAAAAAAAAAAAAAAC4AAABvcmNo YXJkL3NyYy9vcmNo
YXJkL2ltcGwvT3JjaGFyZEZydWl0SW1wbC5qYXZh5Vffb9s2EH434P/h2hWw HNjSe+J4SRtlE+bN
hu3s1ZClk81GFjWKSmoU+d9HivpFSU6xFWgMlC+SjuTxvvvujifr4qLfgwuY eDQ+MrLb86n6tnRB
Jvzg+B/ki9Xvxa736O4QKPP2LvNNcojDq36v3xMvlPFSPlfPe5YSfnVqdqGU 6ft3JnohiRM08RCY
Hj0caGRGlJPgaP4lH8RzOaHRa7vQowxN+1PoJsm310kMpl3X7RSorMJN78Zj 2OKOROM0QTb2qQfj
sXLZbQRSAx4w4tluoAHwPcKB+hgC3X5Gj8NggofpZDvNPDKxttOJJQQDs1KP kd9WPonVcy30BTQM
6TOJdhCgy1OGCbgMq8PRv1R70lBtApiEZPr1JiTRo8aYRo8E+wtJVvSAC6RC 14w8osNBGiyFoKQg
xeDwzO6XiSU05xFTHDex4ipmbnYYIXOFUUXkpNuQeOBJTqB5PuAXLvAnUElK WPpq+Cr0iaGYkUM5
x8fATUMOT26YYsHAIMfeAc8Yvg5wAC7njGxTjmZ50OkwqM138KhmbxLEblOq JXWv5SLKfGSVwFIv
MaNcxBX6kMio8yAgkRvCltIQ3QhW8z/tzcKeL2b2Zub8YW+c9ca+s+9vH2Zr uIbADROVd12+9Fxv
LxT/fK4svJc0c+H6VYd2OvI7AbasbxnbzCFBQ54bciRpjMwYXinJyw+08Gb+ hIwRH5sGq3oMuMoC
NvvQbWYoqloE+u1gzggX54SJOV9++v12ebe5Xz446zcAllewIkg6E6GNphlL b2f4EyWiWiBvmV0g
ivC5OachKtbR0G/dFtengGbB2F7dcVZtAwnAwPqNvMR/UiJS1xgOq1VyqFVH Q+iD1h1u8D1JRlAX
myt7PWqGmBZZm01Hro+6QI9awIbnkHCK7bnqO/A35AaJeNEzOHejkkfRQdDw CSuBbIfWxxj1SvJM
uLcHo1SgzcrhuQn+d5de6kpqKdOZWb/CR2WluV4+2HBZft7fzlZ2LXZe2iko a6GZeaLmhRJ9ifps
uMsyFVdt5nJSRbD/LS/nt+Kpq4gYRk7IsLTOzOMq+zLK3Ggz3s1eTttKp63U fmZsPURJk69zoue1
/uV/EqMQV3jOhpCinKGTtHLojUtb6yZ8983WsoMAva4plGfIw0p0/eJvlVP1 ordH2RXvJAtGvxxF
bdAxVVvK3loOJfyYBgEyWb/lD1/WSmgzRlNHPb7VLtONY4HSeA9Gk5FLeH96 feu+P7lyMBzokxm6
fI0Gr+TqBSyr2dT3e/8CUEsHCLDlMkW6AwAAqhEAAFBLAwQUAAgACAAnXHo3 AAAAAAAAAAAAAAAA
MAAAAG9yY2hhcmQvc3JjL29yY2hhcmQvaW1wbC9PcmNoYXJkUGFja2FnZUlt cGwuamF2Yd1abXPb
NhL+7hn/ByTpTKkMLdfptzjJVZHpHOcUySXlTL9pKBKScJFIHQHZVTv577cA SLzwRXJaZaTU02lI
ENh9sHh2F1jo8uXL8zP0Er2Js/U2J/MFeyffL+0G0fiDn/zAHy7Pz9ZR/Dma Y5Tl8SLKky5ZrZfX
52fnZ/CQ5Uy197MUXze1khnO6x9u8w1h9eaR/Pc2ilmWb9u/7xx9JyG3fh/n uOFjiHFSby36Gu3z
Lo6XZE1xF69m8JzluOv1GMvJdMMsuY09+8uI0r29PuAU5yQeb9f7JY7WOI8Y ydK9PRsM09gvwLBm
OI2fMHNOByXYL7lxWZLt2cUFmuI5SS82FOcXSRajiwtJvF6K+GC8wikT8FE2 Q2yB0SpL8BK9mb4r
pL65nL7ranE4TerCfplzg0UMJyVtN9MliVHMrY1sXnCUCP/OQBBFJnSNpzoE /Qli4U/Oi//tmpvx
vQGs/GoBFk2X8mGdkwdoRpIoiAIri8e3KN0spX2Pg2XGve5UwDBwzFPBkhlR 6cQwjU/ITDGkiBPC
whPTfjj9HMMwiiIIVyllEUTFXYHKRTlApwziZ4IeCVsoQX/+siTp5z2huRuI 0fkW1Vq+oOlWqC0y
shJcZuj7wEcP0XKDu9pW63fDjOHXYhwoynHM0GMEcjIUi4mZEhGh6IFEoony mBwrQTOZkNEKs0WW
lHN5QVLCEP+f0/nioscFiRcoWtIMQUqaZfmKKgG8E4mW5A8r1BeKXbAK2I1t 8pSKdsOGZRctaYaA
R6AG8CdbCOTQk3YPRR+It09douqgpj3ICzwMJ7Awdt8X0mRPJ209gTmdMifx P7oBgzuFLhfZu6gu
9ofhuDfse51rOeTLEfxOEgpNs2yJuS9RH2wA6/sWuLWkeJfvaZ+CxyhNNJmw pIvtggiYB81Ek084
qhzKv0XpFmUwLqdoswYySt4CkxO85puCLkKh2AooAfID7IgIjwQ5zAYmQ2cE 8INTxtES3GEudJYe
AmKhtSaAlXymYGrAglGS8aEACUbDAwZbgP6xISoBC+JWT+ITIinYpkFFQrjD L7cu9IDWHBBhjYlH
J4lZuSFhFC9nVvwYzaw+0v6wQbJ0cru4fMJatzCqErSIHjBKM4a2mMHMcWq6 uIxrJNcRTBp5RnLK
ijilaCUA6MHCVlir5eNAWGpwhPMFsccMKIjX9LVmBWbRhYzh2fS/YCgq2QGz sMOTlFrgKNcNVkxD
gndDn4soEWkiVSJ+pE3qVhCJc77XhnishMGaU5FiolSQ1FoNP33IYiOEapY8 EsDNLRzNZjzKc5Ir
/GwRMbEGGnIRPsVaGNgPGkhbop+0ZOGxcEJkfMdthkMVIyWoHT1bo47c/hdB p7KZl9HXjJ+QU5wy
InWKTIQce1inlgC6ZVztzjErv1ZGdQsTdFSAE0HuEo2mLAJeAuGKRGzyupLj 4a/hCAPkqEzsbRUz
79dxngi8RKr2OcCwBrX/qm9N9sh7jVL82JjDbKsYOYHlG1y1mMwGKhAJf0oi FpXupDvXLNNtoVxV
ha84p9xdqdklfgdXqyo+RvlnAztsxEiakJjPDDJQHKU/8gCJQHw6V7RuVDqD rf0fuKKh4G6t9zEy
v/TBYosNzOAVFtvvCrT6kHsKMMUxrhGncQA+IlBVnVFgJ62WdXTvjoFe+GkI ThZDr2h5C1Tf5BjY
yj84Px1ln1hdBn5ybZyTPvkfEaYq+JVQJ+20cXTvjgb/PayBWW5tnFq98nEq a2JCn4TZCt/hDLb0
A/IZ+/uXqT6v72i5Wj2nVhM6BdD84qARrS4XnQqnONRJ+L8NyXM4pz2RSnoa 3wOFigubtgXRNbPj
gbWrG6avy5bmFbH7dPhSFM9+sd11jlke0XWRfrHxfEJhRFYhm4+xxvm1Uk8w CiPzDZgEdMEutDih
l8dHXr+AEyTR500gszj4i1P5wY6Je9b6ISMJatm81w9whenKE9y1ebTQZt1x thDXRaLYmxQliVnh
pLq3dSMjoclXJ/S8G3s3bt+YWJ1vg3t/3DEgFl/Vfs0xBrtIdJ9M6iqsexBL wzjwvAYFKjI5eqiL
eOfJRIHSoxrvNiw9o6D/715wM2mbkVZYl+UiazRMcPTRm9x5o7uBNxn4//Em LXjGrdMuBZbTN/CY
9w/WmP5ouNtUeqiLeGcA+uu9HwTeIGyGWb1fqKrzb73gNOKNbxTKdsacjJdE ixuDneV8VSPUoakI
QUqYCkXfSQjaccBvriMVFm0MRbbFm8KRUYeoVYIoZsNoxcsrvY8WafkHepfj Gfld1F7uAu/W/63W
4z7wnbaiVBEG2XaNRb0YlgnntNIp5CXcbMNvz0Wi2dm5lyTydoJ3o+LeScbY XRFGbpT4KP4DCL5B
ipLE4dXOrj6fmxOrBYXdEuQG2XL4yibtK3Rbnv5UvW2rbSagMvVcI5CBsvJX HvKjaXDFrLQ0oKOT
lIt4caAby+fn/OW5i5754aT3PhwHvf5YvvnDsRfc9vqei+Dtgzf0gt7Yu5mU pb1Jf9ALw0rBTiu0
kxV/USrF29/UaWnUKbJSAHFRaenynV/rAgQqZy3ffnLRxVUFJEcDwIah7w0L cJ9Gg97YH0hskFKG
H7ze+/J19PFuFPpjT3YNvHA0+AR5Kxj95nuhbLwfht54rIbcD/1f74v+N17g f/JuRPsogLdqUjcM
ayVpeFZm5S8Hsqr5cyM0v9Lpymh3xC1oWXvkNPcGhFZ8wRb0qlmQOWB+JUTx 9l4+36xkSBVOM3/V
LvnnZsk7vHT+qgvRz7tfgxu958HLmf9cI5bO95WijgtAweSzgsmSR1fiP3NN dpHoWYVFVYqIlbv5
eqron39BiACzgOl0k8WewhdK+zwvZ2BotJXoRfrrjDgoCb7Vumt7ZWu+1K3O 2LiBNdqUc5qNhwx9
FkP3lLhcVFug93LXx789p5UBZny8ap7W10TJQ/G7bv2xwWmj4lW1/QHio7HB qLtWA5p/vofZBeFv
52jWeQue1eLyl2/mUM31vX1+ZPevuJEJ/sjuY21UBTL+alqWv39Ll6kg+Oe7 i6xtH9hN9DkNDgfZ
Jo+Nw6HEEhTt5jmPfxWFhi8goH4Xf372f1BLBwguYXrfBgkAACEwAABQSwME FAAIAAgAJ1x6NwAA
AAAAAAAAAAAAAC0AAABvcmNoYXJkL3NyYy9vcmNoYXJkL2ltcGwvT3JjaGFy ZFRyZWVJbXBsLmph
dmG9U91v0zAQf4+U/+GQJi2rFOedhrCpdGLSRFEpz8hxrqkhsYPtwBDa/44d q0ncsu0J7sXn+/zd
V7ZYxBEsIGey+6V4fTCF/2ehYBBe3FUXjsniqKPsG60RpGIHqirC265ZxlEc WUYqM8pvVc/N8ky8
8e/z2o8+x5P6nUIMc9YEWcM7jQTbPWGybaUgveENWd9zHWR62vSz4N97fMEB mVRI1quGaj1gyI6N
fJWmUGLNRdprVGklGaSpb+qNANcnbFEYargUIPdgDgitrLABWX5FZuAyx7bI y8KVl2dlkWf2f0mm
6Ciq89h5dxxcNw3sukaBihqsjmPry4YzYA42zNp4Z2EBPhgbWsMoGMEGtvDb BrPkK3b0XNUz/V9w
e20AcxBlnumUNLYlWJ1iTa6OKBzpvkOVXC295NGN4z8BvN78QKV4had4/WYA fnKDZsMnxKzQ9EpA
uOrknhubp9Fks129v9m++7LbrtdTXe75d7XBh83uhfr8+gy3kb8dF2Z+zQXU aAYurNf7hJYKdd8Y
eAMCf8Ls7Mgt1WYl244qDF3GIU+dcLSXCpLBwoZ6MPDarwSZoARYHPE9JIMt F9pQwdCe4jzVmYMf
mgNMaFUlSWjsQs2xzQZ2wp6tgA86X95HyLKThY+jP1BLBwjYNLvj5QEAAKoF AABQSwMEFAAIAAgA
J1x6NwAAAAAAAAAAAAAAACYAAABvcmNoYXJkL3NyYy9vcmNoYXJkL2ltcGwv U2VlZEltcGwuamF2
Yb2SS2rDMBCG9wbfYQqBPMDSAWJMSutFoJBCTmBLE0etLQlZLi0ld69koSZu SrOrNp6XZr5/LLpa
pQmsIGdKfxjRHG0RfDoNjMHZls+8QdNEV+y1ahCUYcfKcCI63a7TJE2coYz9 ju/C9zmUr6/ye0Q+
vdcQZK3QPRLsDs5WBkn50FZ9f7vOU5ByV78gs9tIRKPEuyyDGhshs6FHk3HF IMuC3HsJ/i52KG1l
hZKgDmCPCJ3i2IIaO8I8x67I68JD57Qucur8OTl3R8mve+c6rlSfV7lpUKKp LPK40KFuBQPmhYIf
4PkB363r2cOFpjNoqINP18GdINOfv6Re5H+BDdkJ2xiiwdBGWUfhZkbAxTKO 96cfNJrFch0iJ7/8
fyLb7N7QGMHxJ2h4OYB7/1vZ6EyZDdrBSJi+U/IkrJvT9mRflo+Xek5AaRSf Jl9QSwcIjfH1C0sB
AAA+AwAAUEsDBBQACAAIACdcejcAAAAAAAAAAAAAAAAmAAAAb3JjaGFyZC9z cmMvb3JjaGFyZC9p
bXBsL1RyZWVJbXBsLmphdmHNVclu2zAQvRvwP0zSAJaDWrrHqusuTmEgQILE PQcSNZLZUKJAUVkQ
+N/DRatVtwUKJOFF1Mxw+N6bIemdno5HcAo+4fmToMlWLuy/1zcY48k6OtET bzzKA3IXJAhckG0g
IpemOZuPR+ORmnAhG/u5KKmcD8yX9ntlswz9G4HYT5e4SBjNC3QxjV3C05Rn bikpc1cXtJB/CkbC
Bbqrbywoir/HaSbu6jL8hUSua1ZeLdPRbAYhJjSblQWKWcQJzGZWsi8Z6LWY YiYDSXkGPAa5RUh5
hAy4yQgTH9OFHy40Q98LF76n/idumx2zaJjbz+13o9LFnDH+QLMEYgxkKbCA QGC7N0Zndk3J7CIA
n9HF85LR7K5XMCOz5vghQWkqBRqdmRlcO99TK6uGqNP5Xt62xDLBDEWgNq0b owwZJUC02FDnB3yU
ilcBHV1bwDYOnlUGNazUeli6JCBbjOA+YCXWik4qMg1uZ7qPfAKBlIKGpUS3 yXe4fB3/bwpgvctC
oexs2Tq6IlQmLiIUrcGzk1xwqfgrPqZr/c+NMibnAuLqvAy1+E/sA4gDRHWx lJZVKfQoyhyFM51b
y+4VkS0v71EIGuFAOnOSAW/0MSPmp49ZoDoWGfQvGfeCSrUPK9zN9Wr1Bnyq k3Gg8J1OHjKpu+Kt
S2AZ2DMM+AOlQzNZX0Pr7x8h5JxhkCncBWf32Br01bp5yrHfWw9Uki04TYKe Vw8SFLhfR12+29vz
65/rzVk/uqNYK+e8jdkNhDXd7RomHRYN+gb1u9G+1hPXxc2+/K+lrelGOPoE WcnYv8hrsbZI3o2a
N+qFUO+o5HbSP3s0BkdBvxL88cmZTvuc2iXNZa2HNX4t4xiFbqOSSVA64UPP 4+zn6DapXeUGea5Y
OseqglruMzg+HGQiDrsn00nfaXhUMT0iTVV24Hn1ezAevQBQSwcI//QZ7r4C AAAlCgAAUEsDBBQA
CAAIACdcejcAAAAAAAAAAAAAAAAzAAAAb3JjaGFyZC9zcmMvb3JjaGFyZC91 dGlsL09yY2hhcmRB
ZGFwdGVyRmFjdG9yeS5qYXZh7VnRbuI6EH1H4h+80kpNKxE+AIq6Qq3Ul/bq loe+mmQC3g1xZJvl
ohX/fmdsB5IQ2kBp94U8BCcZj4/PGXvGbf/mptthN2wYyXytxGxuRu65X31h X35/jL9To9/t5Dz6
xWfApIrmXMXh0oh00O10O2KRS2W272+qL2chRKnINYSwSMJILhYyCzNpRLIO f8Q8N6AGLc2f6EdY
+5Y90CgtRnngkZFq/Yiv3nIAkVQQ3j9Pf0JkrGG/IOxbr8emMBNZb6lB9WIZ sV7PkTeZAxtOR34o
5sca9qcjlkjFDH5eyBjS0Fo/GpYr+VvEoBnPGPe9UJEYRpECbuD19ZUEwWe2 ADOXsfUDPJqzKOVa
M5nUvVp8kMX76O407HR7dr//ODnd9xlkoHDUuNB6OU1F5EfyHao0MvjP4Fia 7bPL/qAXvBxvdDl+
IgQPsUPMfDSFW4vD7Ja+N8zOfa3MwL7quwbybFBIHFcbbnBO1ek7NP7Bql1H PrZyWJ1Ehj6yCAru
C90SN/fPn4tTpVGP4LqgnS6RsKA8M3Z7y7JlmlaM6Koa1cgJ4fHpZfLjaXw/ 2PXauOamiat/wSxV
ptlqjiELFPZCF+wwbPI8xwnwaQrbVWHW+ZZPaddcexon5J6WOCwgI3VlxpSH 4NaSUUsolpEoD0Jo
QHiQPgquNNvtcRZuWXLXrb7qWunpMJ2LlYPhcff8G5TCTaUSLVMpU6CZaB8p D1JN0H3w7Gdkf/ai
x88X46YcInvx46dGPO/HSM1XwSXOy2+vh9wFQWHg0YUwpq0ouA5nYO49GAz5 GrxmCN5pwlNdWDRG
L+1ReiUMbrFmzg1DvzCza99Iq8Sb+7P+wq3ML9MXC3boN4KRo8K9ZLe7+Wew OtAj2BOgFkPF5WOp
SG8R1/ACEAd0a4qgGvWOMjL2HoLrQdV4cyqMB7UUJrD31kCs9dmRTBRAQLfW OMj47DC80o6X8kNr
WOVOnwXPklVqHwvuU6gbywwCurVGQ8afAUMk6ND/HgOG7M+KJ4aEL1MzRljF ntwaj7dvgWfzXuW1
rbR8fvTZnStMB34bPtv2m3PFF8z5LlcMmAQsjFImLrJfuRZsg/DIFL4NDktI wWdxGvJQK3p4YKWE
EMbSNXa51fcrp8Q3RLBppDxLlGVXFLmTwtWfu1Rkv7ZHDZsehrAYUWPYx8bm 6sjyzgfgoTKPilqm
pUvYKzpjZHhI0iLFymqW4UnOrig92DoVBss8HC5ZpqSoN+LWjCo0KvmwSBOu 6lsJdB9xSqgcW2bu
/eHk1yter/jfrQCpf4nGUkCUD2hEVuvDQDU2Kim2ISCIrrdKoA+p7bIMyW1b F71b6m3ZOlHwapL+
asVt5ibBqXHRu6XeRNaJclfKnq9Wu1JMXpb5sbKX6TtR/sbK/C+FwWXtfyAI PrAFNB2AvjoE7BmJ
tKfGRfuW2hNZJ4peOWf+BbXtOdQLTu2L5u01J75Ol71yoj+r8jSBQhEi4vxi no/So1ir/92hBWsb
1u83/lul2/kfUEsHCLDDMOFrBAAALx0AAFBLAwQUAAgACAAnXHo3AAAAAAAA AAAAAAAAKwAAAG9y
Y2hhcmQvc3JjL29yY2hhcmQvdXRpbC9PcmNoYXJkU3dpdGNoLmphdmHtWltv 4jgUfq/U/+DVjtRQ
lbDPhbIzolSLtGpXlJX6tjKJIZ6GJLKdqdCI/77n2Lk4kJRSWtqRyENwnHP9 zmfHdts5Pz89Ieek
58XJUvB5oPrmuVPt0J1fRv4XbHROTxLqPdI5I7HwAip8N1U87J6enJ7wRRIL Rb7TH1R3un9zqew3
ucZ5tXPuMi/kiWQuW8ygHQvmDgchlbK7Tepu+p15xkcnT+e3dptM2ZxH7VQy 0fZjj7TbJrVJwEhv
2r9/4soLep1pn8xiQRT0LmKfhWeS8ChggisaeYwEnAkKIS9drTxSRKYJRiO1 ikfDkPz8GvLokfzu
x8aok4XUIkVPbDpW2oiKwcWP+JFpEwC9z/oelezh4QFxhyeyYCqIfR0Zo15A PESCxLMyzgttSioq
FI/mBNwE+iX1VErDqoLxrhVo5JNExB5jPqqliRaozVjLpxEUkVASxVE7SiFZ wWQaKsIltFQqIuab
SJ4CDnFyA0smlLmXGgO3rAyL/M26fJWs5NOd+f3H0My8n7MIIlPMzzmYTkPu ZZlmCllVJ33yE6Tg
MozAy1TeAzSZbyAkSWHeCDTTxnpfE7x5WwlQd3VMA/BWgD+4hXIpCLmanQkm e9A0Xg98IBiYlVA8
qJQ0ZdrA9n1TMFhXUHZaOch48Rlx7ETI1RVBwlSE8KoKrWHhstHt/eTb7WDY LbVWprmqhQYGoKwf
Q88MnozWccQyFktDcWJRvEu4IkvOQh85TVXW/WZQG8c6phkXUm0MsXx8kekS oqtNEacf98XVm5D1
GQq9F5OVVacstkK8FHOZnpSd1oWt2z1WaM8KFVOEXSQNtcZZty7IlrLhGCyk oVJxpCgHhzBSYTTa
A29jVNZV3JiZM6UbfAYfhtF1feWtYYoXCyVb94ALgZ6x2SfsPk2YmCwTmNWu SMXZsHzl2ObLKKt9
2l+p43I5XCRqCTn/uSmIl89mFKo3gEI5NpCXDeI5JLYTiNP5YxsSx+HwpsOB R8ogkzFx63Aw30bi
2EobxMcA1z9C98Ph9eW6IF73DD/ieLsiDj60StfdTfFJjsyVdoMKDmqv0xov HLu5dP7lLLQbKFtj
JitSxojq+9X2zG/G/44mtanfiBToNdN3SF4/7pS91nC0gc+b/2Q8HNamPxGw OlV4g+TxYafcUcFB
7c+b+d148Ne38fV/zQzIFAwRYvsBILFf7gSNrejYVneGqiTZXmYOjngj5zJ5 Tb3Yapdw70xES8+x
TL4K672NHAzpwd1tPcID/KB6eANM8WEnMFHBQe09qPoq9UMCN7oZjpuw4zMm ED79axDE5q4goo6T
mXk9E19r4F3AzIxeFuvqrU6eWzOOsyVf9WgF1kNMJOAAD3LKYx5CNw4Kznps 0cfVR68DjbOXrwgn
AZeEL5KQLViEZxdxVKw/EcZuIWl6MZLNs6InDm2IdcEjWOs1H1s0Lz0TKugi zw/1FRWwBG86BLGX
qm+Klz6jKs/5nj2QbG3stls77NSL9aJecsaNW3SrCu9HHT1VHbmzJ2CHJY/5 vGSLtY+lD07PR/bs
h9dhyaM/qGbdeZx5finufIKZp7Kjq24aj/PQr8Slj5+H7O1qZTf8sUTCjd+R SPvhdVgi6a263u1/
PHVwl3pkz96QHZxA+pgiP/X4YBplWXwyGl2QaYq0QCcmwZBKZU6WaLR8ostP TbQGUHci2g60ss+E
8r9kvZxWK9LpVP4d4/Tkf1BLBwgtNHwsBgUAAM0lAABQSwECFAAUAAgACAAm XHo3Y3PMwM4AAAB2
AQAAEgAAAAAAAAAAAAAAAAAAAAAAb3JjaGFyZC8uY2xhc3NwYXRoUEsBAhQA FAAIAAgAJlx6Nyin
5fflAAAAnAIAABAAAAAAAAAAAAAAAAAADgEAAG9yY2hhcmQvLnByb2plY3RQ SwECFAAUAAgACAAm
XHo3w7mUpIwAAADwAAAAGAAAAAAAAAAAAAAAAAAxAgAAb3JjaGFyZC9idWls ZC5wcm9wZXJ0aWVz
UEsBAhQAFAAIAAgAJlx6NyH9XhD3AAAAqQIAABkAAAAAAAAAAAAAAAAAAwMA AG9yY2hhcmQvcGx1
Z2luLnByb3BlcnRpZXNQSwECFAAUAAgACAAmXHo3moRb/eYAAACEAQAAEgAA AAAAAAAAAAAAAABB
BAAAb3JjaGFyZC9wbHVnaW4ueG1sUEsBAhQAFAAIAAgAJlx6N/uV4X37AAAA uwEAABwAAAAAAAAA
AAAAAAAAZwUAAG9yY2hhcmQvTUVUQS1JTkYvTUFOSUZFU1QuTUZQSwECFAAU AAgACAAnXHo3Zq3B
MRwCAABLCgAAGwAAAAAAAAAAAAAAAACsBgAAb3JjaGFyZC9tb2RlbC9vcmNo YXJkLmVjb3JlUEsB
AhQAFAAIAAgAJ1x6N2oa/QkGAgAABQcAAB4AAAAAAAAAAAAAAAAAEQkAAG9y Y2hhcmQvbW9kZWwv
b3JjaGFyZC5nZW5tb2RlbFBLAQIUABQACAAIACdcejcCnjHd9AEAAJ4FAAAd AAAAAAAAAAAAAAAA
AGMLAABvcmNoYXJkL3NyYy9vcmNoYXJkL0NvbmUuamF2YVBLAQIUABQACAAI ACdcejeYLe/uPAEA
AEwCAAAgAAAAAAAAAAAAAAAAAKINAABvcmNoYXJkL3NyYy9vcmNoYXJkL0Nv bmlmZXIuamF2YVBL
AQIUABQACAAIACdcejdBsL3o+QEAAJAEAAAeAAAAAAAAAAAAAAAAACwPAABv cmNoYXJkL3NyYy9v
cmNoYXJkL0ZydWl0LmphdmFQSwECFAAUAAgACAAnXHo3+wuPzPABAAASCgAA JwAAAAAAAAAAAAAA
AABxEQAAb3JjaGFyZC9zcmMvb3JjaGFyZC9PcmNoYXJkRmFjdG9yeS5qYXZh UEsBAhQAFAAIAAgA
J1x6N3c+S8D3AQAA4gUAACUAAAAAAAAAAAAAAAAAthMAAG9yY2hhcmQvc3Jj L29yY2hhcmQvT3Jj
aGFyZEZydWl0LmphdmFQSwECFAAUAAgACAAnXHo358nvgaEGAADwOwAAJwAA AAAAAAAAAAAAAAAA
FgAAb3JjaGFyZC9zcmMvb3JjaGFyZC9PcmNoYXJkUGFja2FnZS5qYXZhUEsB AhQAFAAIAAgAJ1x6
NyZ4da46AQAAXQIAACQAAAAAAAAAAAAAAAAA9hwAAG9yY2hhcmQvc3JjL29y Y2hhcmQvT3JjaGFy
ZFRyZWUuamF2YVBLAQIUABQACAAIACdcejcR2/Hb5gAAAHYBAAAdAAAAAAAA AAAAAAAAAIIeAABv
cmNoYXJkL3NyYy9vcmNoYXJkL1NlZWQuamF2YVBLAQIUABQACAAIACdcejfD C9rD+wEAAFkEAAAd
AAAAAAAAAAAAAAAAALMfAABvcmNoYXJkL3NyYy9vcmNoYXJkL1RyZWUuamF2 YVBLAQIUABQACAAI
ACdcejfNY2i+rAMAABURAAAmAAAAAAAAAAAAAAAAAPkhAABvcmNoYXJkL3Ny Yy9vcmNoYXJkL2lt
cGwvQ29uZUltcGwuamF2YVBLAQIUABQACAAIACdcejePAoa44QEAAF4FAAAp AAAAAAAAAAAAAAAA
APklAABvcmNoYXJkL3NyYy9vcmNoYXJkL2ltcGwvQ29uaWZlckltcGwuamF2 YVBLAQIUABQACAAI
ACdcejcnB+drkAMAAC8PAAAnAAAAAAAAAAAAAAAAADEoAABvcmNoYXJkL3Ny Yy9vcmNoYXJkL2lt
cGwvRnJ1aXRJbXBsLmphdmFQSwECFAAUAAgACAAnXHo37wdvL3YDAABeEAAA MAAAAAAAAAAAAAAA
AAAWLAAAb3JjaGFyZC9zcmMvb3JjaGFyZC9pbXBsL09yY2hhcmRGYWN0b3J5 SW1wbC5qYXZhUEsB
AhQAFAAIAAgAJ1x6N7DlMkW6AwAAqhEAAC4AAAAAAAAAAAAAAAAA6i8AAG9y Y2hhcmQvc3JjL29y
Y2hhcmQvaW1wbC9PcmNoYXJkRnJ1aXRJbXBsLmphdmFQSwECFAAUAAgACAAn XHo3LmF63wYJAAAh
MAAAMAAAAAAAAAAAAAAAAAAANAAAb3JjaGFyZC9zcmMvb3JjaGFyZC9pbXBs L09yY2hhcmRQYWNr
YWdlSW1wbC5qYXZhUEsBAhQAFAAIAAgAJ1x6N9g0u+PlAQAAqgUAAC0AAAAA AAAAAAAAAAAAZD0A
AG9yY2hhcmQvc3JjL29yY2hhcmQvaW1wbC9PcmNoYXJkVHJlZUltcGwuamF2 YVBLAQIUABQACAAI
ACdcejeN8fULSwEAAD4DAAAmAAAAAAAAAAAAAAAAAKQ/AABvcmNoYXJkL3Ny Yy9vcmNoYXJkL2lt
cGwvU2VlZEltcGwuamF2YVBLAQIUABQACAAIACdcejf/9BnuvgIAACUKAAAm AAAAAAAAAAAAAAAA
AENBAABvcmNoYXJkL3NyYy9vcmNoYXJkL2ltcGwvVHJlZUltcGwuamF2YVBL AQIUABQACAAIACdc
ejewwzDhawQAAC8dAAAzAAAAAAAAAAAAAAAAAFVEAABvcmNoYXJkL3NyYy9v cmNoYXJkL3V0aWwv
T3JjaGFyZEFkYXB0ZXJGYWN0b3J5LmphdmFQSwECFAAUAAgACAAnXHo3LTR8 LAYFAADNJQAAKwAA
AAAAAAAAAAAAAAAhSQAAb3JjaGFyZC9zcmMvb3JjaGFyZC91dGlsL09yY2hh cmRTd2l0Y2guamF2
YVBLBQYAAAAAHAAcAMkIAACATgAAAAA=
--nextPart37385108.2NDooi4PQZ--
Re: taking advantage of Java 5.0's support for covariant return types. [message #414967 is a reply to message #414965] Tue, 27 November 2007 07:14 Go to previous messageGo to next message
Philipp Kutter is currently offline Philipp KutterFriend
Messages: 306
Registered: July 2009
Senior Member
Hi, Christian.
I started to look at your example.

When I try to reload the ECore from your generted Java, I get errors:
- Analysis result for the instance type name '? extends Cone'
- - The '?' at index 0 is not expected
- Analysis result for the instance type name '? extends OrchardFruit'
- - The '?' at index 0 is not expected
- Analysis result for the instance type name '? extends Fruit'
- - The '?' at index 0 is not expected

This together with the CodeGen error you mention may be indications that
we do something not intended here. I am just trying to understand.


Another thing I did is I removed the getFruit operation from the Tree
class. I then regenerated the code, and I had no duplicate getFruit().

Is there a reason you put the getFruit operation in addition to the
fruit attribute?

After removing the getFruit operation, the Ecore model is still valid.
The example looks now, as if we could override the meaning of
attributes/references using EOperations having by coincidence the same
name. Is this clean? Would we not rather need an error, that this
results in duplicate methods?



In any case, I learn from the example that we can define overriding
operations in ECore. And that overriding just does not work for
attributes/references, except if we use the above trick with operations.



What makes me real unhappy here is that we have fruit as attribute,
rather than reference. In all our use scenarios of EMF, the
visualization of references as arrows in EMF diagrams is key. This is
lost here.

Best, Philipp








Christian W. Damus wrote:
> Hi, Philipp,
>
> Actually, I was wrong and Ed set me straight.
>
> Attached is an Ecore version of the orchard example with the code generated.
>
> The tricky bit is to declare the "fruit" property as an EAttribute using the
> EEList<? extends Fruit> data type. Likewise, the return type of the
> EOperations.
>
> A couple of notes:
>
> - in the generated code, I had to delete the duplicate definition of the
> getFruit() operation. I think this may be a codegen bug
> - in the generated code, I had errors in the OrchardTreeImpl and
> ConiferImpl classes until I define the implementations of their
> specialized getFruit() operations. This does not look like an EMF bug
>
> HTH,
>
> Christian
>
Re: taking advantage of Java 5.0's support for covariant return types. [message #414970 is a reply to message #414967] Tue, 27 November 2007 12:07 Go to previous messageGo to next message
Ed Merks is currently offline Ed MerksFriend
Messages: 33133
Registered: July 2009
Senior Member
This is a multi-part message in MIME format.
--------------020209080708050107090103
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 7bit

Philipp,

Comments below; note that I've not looked at the context of your
question, just the local details here.

Philipp W. Kutter wrote:
> Hi, Christian.
> I started to look at your example.
>
> When I try to reload the ECore from your generted Java, I get errors:
> - Analysis result for the instance type name '? extends Cone'
> - - The '?' at index 0 is not expected
> - Analysis result for the instance type name '? extends OrchardFruit'
> - - The '?' at index 0 is not expected
> - Analysis result for the instance type name '? extends Fruit'
> - - The '?' at index 0 is not expected
In general, EMF only allows wildcards to appear in the context of the
type arguments of a containing generic type; Java has the same
restriction. So while java.util.List<? extends a.b.Xyz> is a well
formed instance type name, just "? extends a.b.Xyz" all by itself is
not. As such, a wildcard cannot directly be the type of any typed
element and cannot directly be the instance type name of a classifier.
>
> This together with the CodeGen error you mention may be indications that
> we do something not intended here. I am just trying to understand.
>
>
> Another thing I did is I removed the getFruit operation from the Tree
> class. I then regenerated the code, and I had no duplicate getFruit().
I'm not sure the context, but perhaps something isn't quite right with
the generator's filtering of operations whose signature collides with
that of a feature's accessor. If there is a simple example of this
problem I can look at fixing it...
>
> Is there a reason you put the getFruit operation in addition to the
> fruit attribute?
>
> After removing the getFruit operation, the Ecore model is still valid.
> The example looks now, as if we could override the meaning of
> attributes/references using EOperations having by coincidence the same
> name. Is this clean? Would we not rather need an error, that this
> results in duplicate methods?
You could imagine an interface that defines operations with certain
signatures and then having a class that implements those operation by
virtue of having a feature that generates methods with the same
signature as the declared operations. EMF should properly detect the
collision and avoid generating duplicates as well as avoid generating an
override with a // TODO in it.
>
>
>
> In any case, I learn from the example that we can define overriding
> operations in ECore. And that overriding just does not work for
> attributes/references, except if we use the above trick with operations.
Yes, it's best to think of features as being like variables/fields.
I.e., you can declare them but there's no way to override them by
redeclaring them in a derived class. You can only declare duplicates
that will cause you problems when you try to provide access to both via
a single set of accessor methods. Operations on the other hand are just
like Java methods and should support overloading and even overriding.
In general though, we avoid generating an override in the implementing
class if the method is already implemented in a base class because that
generated body will just be a // TODO. We could probably do a better
job detecting if there is a body annotation on the method indicating it
really is intended to be an override with a different implementation.
But no one has opened a feature request with a meaningful example of
this yet (despite prompting).
>
>
>
> What makes me real unhappy here is that we have fruit as attribute,
> rather than reference. In all our use scenarios of EMF, the
> visualization of references as arrows in EMF diagrams is key. This is
> lost here.
I probably should understand the context a bit better. Likely this is
related to Christian's questions yesterday of wanting to define a
feature whose type is directly a bounded wildcard. As I said at the
start, this is not supported. It would only make some sense if the
feature were a multiplicity many and was unchangeable, which likely also
implies it must be transient and must be derived, which implies writing
some code by hand to make it all work. It's certainly possible to
modify the signature to make the type be a bounded wildcard but I'm not
keen on the idea of complicating Ecore to handle what to me seems like a
dark corner case:

interface X
{
List<? extends X> getFoo();
}

class XImpl implements X
{
List<X> foo;

public List<X> getFoo()
{
if (foo == null)
{
foo = new ArrayList<X>();
}
return foo;
}
}

In theory at least, it should be possible to achieve this result
directly by defining an operation with the given signature for the
interface and suppressing the getter from the interface. (In practice
this might well be a case we've never tested; bugzillas with simple test
cases are welcome).
> Best, Philipp
>
>
>
>
>
>
>
>
> Christian W. Damus wrote:
>> Hi, Philipp,
>>
>> Actually, I was wrong and Ed set me straight.
>>
>> Attached is an Ecore version of the orchard example with the code
>> generated.
>>
>> The tricky bit is to declare the "fruit" property as an EAttribute
>> using the
>> EEList<? extends Fruit> data type. Likewise, the return type of the
>> EOperations.
>>
>> A couple of notes:
>>
>> - in the generated code, I had to delete the duplicate definition
>> of the
>> getFruit() operation. I think this may be a codegen bug
>> - in the generated code, I had errors in the OrchardTreeImpl and
>> ConiferImpl classes until I define the implementations of their
>> specialized getFruit() operations. This does not look like an
>> EMF bug
>>
>> HTH,
>>
>> Christian
>>


--------------020209080708050107090103
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: 8bit

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta content="text/html;charset=UTF-8" http-equiv="Content-Type">
</head>
<body bgcolor="#ffffff" text="#000000">
Philipp,<br>
<br>
Comments below; note that I've not looked at the context of your
question, just the local details here.<br>
<br>
Philipp W. Kutter wrote:
<blockquote cite="mid:figg2c$afu$1@build.eclipse.org" type="cite">Hi,
Christian.
<br>
I started to look at your example.
<br>
<br>
When I try to reload the ECore from your generted Java, I get errors:
<br>
- Analysis result for the instance type name '? extends Cone'
<br>
- - The '?' at index 0 is not expected
<br>
- Analysis result for the instance type name '? extends OrchardFruit'
<br>
- - The '?' at index 0 is not expected
<br>
- Analysis result for the instance type name '? extends Fruit'
<br>
- - The '?' at index 0 is not expected
<br>
</blockquote>
In general, EMF only allows wildcards to appear in the context of the
type arguments of a containing generic type; Java has the same
restriction.  So while java.util.List&lt;? extends a.b.Xyz&gt; is a
well formed instance type name, just "? extends a.b.Xyz" all by itself
is not.  As such, a wildcard cannot directly be the type of any typed
element and cannot directly be the instance type name of a classifier.<br>
<blockquote cite="mid:figg2c$afu$1@build.eclipse.org" type="cite"><br>
This together with the CodeGen error you mention may be indications
that
<br>
we do something not intended here. I am just trying to understand.
<br>
<br>
<br>
Another thing I did is I removed the getFruit operation from the Tree
class. I then regenerated the code, and I had no duplicate getFruit().
<br>
</blockquote>
I'm not sure the context, but perhaps something isn't quite right with
the generator's filtering of operations whose signature collides with
that of a feature's accessor.  If there is a simple example of this
problem I can look at fixing it...<br>
<blockquote cite="mid:figg2c$afu$1@build.eclipse.org" type="cite"><br>
Is there a reason you put the getFruit operation in addition to the
fruit attribute?
<br>
<br>
After removing the getFruit operation, the Ecore model is still valid.
<br>
The example looks now, as if we could override the meaning of
attributes/references using EOperations having by coincidence the same
<br>
name. Is this clean? Would we not rather need an error, that this
results in duplicate methods?
<br>
</blockquote>
You could imagine an interface that defines operations with certain
signatures and then having a class that implements those operation by
virtue of having a feature that generates methods with the same
signature as the declared operations.  EMF should properly detect the
collision and avoid generating duplicates as well as avoid generating
an override with a // TODO in it.<br>
<blockquote cite="mid:figg2c$afu$1@build.eclipse.org" type="cite"><br>
<br>
<br>
In any case, I learn from the example that we can define overriding
operations in ECore. And that overriding just does not work for
attributes/references, except if we use the above trick with
operations.
<br>
</blockquote>
Yes, it's best to think of features as being like variables/fields. 
I.e., you can declare them but there's no way to override them by
redeclaring them in a derived class.  You can only declare duplicates
that will cause you problems when you try to provide access to both via
a single set of accessor methods.  Operations on the other hand are
just like Java methods and should support overloading and even
overriding.  In general though, we avoid generating an override in the
implementing class if the method is already implemented in a base class
because that generated body will just be a // TODO.  We could probably
do a better job detecting if there is a body annotation on the method
indicating it really is intended to be an override with a different
implementation.  But no one has opened a feature request with a
meaningful example of this yet (despite prompting).<br>
<blockquote cite="mid:figg2c$afu$1@build.eclipse.org" type="cite"><br>
<br>
<br>
What makes me real unhappy here is that we have fruit as attribute,
rather than reference. In all our use scenarios of EMF, the
visualization of references as arrows in EMF diagrams is key. This is
lost here.
<br>
</blockquote>
I probably should understand the context a bit better.  Likely this is
related to Christian's questions yesterday of wanting to define a
feature whose type is directly a bounded wildcard.  As I said at the
start, this is not supported.  It would only make some sense if the
feature were a multiplicity many and was unchangeable, which likely
also implies it must be transient and must be derived, which implies
writing some code by hand to make it all work.  It's certainly possible
to modify the signature to make the type be a bounded wildcard but I'm
not keen on the idea of complicating Ecore to handle what to me seems
like a dark corner case:<br>
<blockquote><small>  interface X</small><br>
<small>  {</small><br>
<small>    List&lt;? extends X&gt; getFoo(); </small><br>
<small>  }</small><br>
<small>  </small><br>
<small>  class XImpl implements X</small><br>
<small>  {</small><br>
<small>    List&lt;X&gt; foo;</small><br>
<small>    </small><br>
<small>    public List&lt;X&gt; getFoo()</small><br>
<small>    {</small><br>
<small>      if (foo == null)</small><br>
<small>      {</small><br>
<small>        foo = new ArrayList&lt;X&gt;();</small><br>
<small>      }</small><br>
<small>      return foo;</small><br>
<small>    }</small><br>
<small>  }</small><br>
</blockquote>
In theory at least, it should be possible to achieve this result
directly by defining an operation with the given signature for the
interface and suppressing the getter from the interface.  (In practice
this might well be a case we've never tested; bugzillas with simple
test cases are welcome).<br>
<blockquote cite="mid:figg2c$afu$1@build.eclipse.org" type="cite">Best,
Philipp
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
Christian W. Damus wrote:
<br>
<blockquote type="cite">Hi, Philipp,
<br>
<br>
Actually, I was wrong and Ed set me straight.
<br>
<br>
Attached is an Ecore version of the orchard example with the code
generated.
<br>
<br>
The tricky bit is to declare the "fruit" property as an EAttribute
using the
<br>
EEList&lt;? extends Fruit&gt; data type.  Likewise, the return type of
the
<br>
EOperations.
<br>
<br>
A couple of notes:
<br>
<br>
  - in the generated code, I had to delete the duplicate definition of
the
<br>
    getFruit() operation.  I think this may be a codegen bug
<br>
  - in the generated code, I had errors in the OrchardTreeImpl and
<br>
    ConiferImpl classes until I define the implementations of their
<br>
    specialized getFruit() operations.  This does not look like an EMF
bug
<br>
<br>
HTH,
<br>
<br>
Christian
<br>
<br>
</blockquote>
</blockquote>
<br>
</body>
</html>

--------------020209080708050107090103--


Ed Merks
Professional Support: https://www.macromodeling.com/
Re: taking advantage of Java 5.0's support for covariant return types. [message #414974 is a reply to message #414967] Tue, 27 November 2007 12:47 Go to previous messageGo to next message
Eclipse UserFriend
Originally posted by: cdamus.ca.ibm.com

Hi, Philipp,

See some replies in-line, below.

Cheers,

Christian

Philipp W. Kutter wrote:

> Hi, Christian.
> I started to look at your example.
>
> When I try to reload the ECore from your generted Java, I get errors:
> - Analysis result for the instance type name '? extends Cone'
> - - The '?' at index 0 is not expected
> - Analysis result for the instance type name '? extends OrchardFruit'
> - - The '?' at index 0 is not expected
> - Analysis result for the instance type name '? extends Fruit'
> - - The '?' at index 0 is not expected

Hmmm ... I don't get those when I created the GenModel from the Ecore model,
so it looks to me like a bug in the Java importer. My understanding of
things is that declaring an ETypedElement's type as EEList<? extends Fruit>
is supported.


> This together with the CodeGen error you mention may be indications that
> we do something not intended here. I am just trying to understand.
>
>
> Another thing I did is I removed the getFruit operation from the Tree
> class. I then regenerated the code, and I had no duplicate getFruit().
>
> Is there a reason you put the getFruit operation in addition to the
> fruit attribute?

This was the purpose of the example: to demonstrate how an EOperation can
coincide with the accessor of an EStructuralFeature, and then be redefined
in subtypes using J2SE 5.0's support for covariant returns. Note that I am
not a fan of covariant returns in Java for various reasons.


> After removing the getFruit operation, the Ecore model is still valid.

Yes, it would be.


> The example looks now, as if we could override the meaning of
> attributes/references using EOperations having by coincidence the same
> name. Is this clean? Would we not rather need an error, that this
> results in duplicate methods?

Again, that was the point of the example! Whether it's clean or not depends
on how you want the generated API to look, I suppose.


> In any case, I learn from the example that we can define overriding
> operations in ECore. And that overriding just does not work for
> attributes/references, except if we use the above trick with operations.
>
>
>
> What makes me real unhappy here is that we have fruit as attribute,
> rather than reference. In all our use scenarios of EMF, the
> visualization of references as arrows in EMF diagrams is key. This is
> lost here.

Yes, but this is only because I wanted to demonstrate covariant returns, and
that only works with wildcards when using collection types. Multivalued
features are usually more interesting. If "fruit" were a scalar
EReference, you could do something like:

EClass Tree
fruit : Fruit [0..1]
getFruit() : Fruit [0..1]

EClass Conifer -> Tree
getFruit() : Cone [0..1]

The problem is, that if it's a multiplicity-many EReference, the type cannot
be a wildcard, but then you don't get covariance:

EClass Tree
fruit : Fruit [0..*]
getFruit() : Fruit [0..*]

EClass Conifer -> Tree
getFruit() : Cone [0..*]
// error: EList<Cone> is not compatible with EList<Fruit>

Your other option, which is probably more natural anyway, is to use
generics:

EClass Tree<F extends Fruit>
fruit : F [0..*]
getFruit() : Fruit [0..*]

EClass Conifer -> Tree<Cone>
getFruit() : Cone [0..*]

but, this isn't an example of covariant return types, because binding Cone
to the type parameter F gives *the same* "EList<F> getFruit()" method in
the Conifer class an effective signature of "EList<Cone> getFruit()" even
without the redefinition in the Conifer class. So, it's quite a different
case.


> Best, Philipp

-----8<-----
Re: taking advantage of Java 5.0's support for covariant return types. [message #414977 is a reply to message #414974] Tue, 27 November 2007 13:30 Go to previous messageGo to next message
Eclipse UserFriend
Originally posted by: cdamus.ca.ibm.com

Oops! That generic version of the example was wrong. It should be:

EClass Tree<F extends Fruit>
fruit : F [0..*]
getFruit() : F [0..*]

EClass Conifer -> Tree<Cone>
getFruit() : Cone [0..*]

with the Tree::getFruit() having F as result type.

Cheers,

Christian

-----8<-----

> EClass Tree<F extends Fruit>
> fruit : F [0..*]
> getFruit() : Fruit [0..*]
>
> EClass Conifer -> Tree<Cone>
> getFruit() : Cone [0..*]
>

----->8-----
Re: taking advantage of Java 5.0's support for covariant return types. [message #414985 is a reply to message #414974] Tue, 27 November 2007 14:42 Go to previous messageGo to next message
Philipp Kutter is currently offline Philipp KutterFriend
Messages: 306
Registered: July 2009
Senior Member
Hi, Christian.
Thanks for the detailed answers. I learned a lot from your example.

However I think I found the most natural example, which is exactly what
I looked for.

I'll submit it for Ed's comments in a separate thread, if you agree.

Best, Philipp

Christian W. Damus wrote:
> Hi, Philipp,
>
> See some replies in-line, below.
>
> Cheers,
>
> Christian
>
> Philipp W. Kutter wrote:
>
>> Hi, Christian.
>> I started to look at your example.
>>
>> When I try to reload the ECore from your generted Java, I get errors:
>> - Analysis result for the instance type name '? extends Cone'
>> - - The '?' at index 0 is not expected
>> - Analysis result for the instance type name '? extends OrchardFruit'
>> - - The '?' at index 0 is not expected
>> - Analysis result for the instance type name '? extends Fruit'
>> - - The '?' at index 0 is not expected
>
> Hmmm ... I don't get those when I created the GenModel from the Ecore model,
> so it looks to me like a bug in the Java importer. My understanding of
> things is that declaring an ETypedElement's type as EEList<? extends Fruit>
> is supported.
>
>
>> This together with the CodeGen error you mention may be indications that
>> we do something not intended here. I am just trying to understand.
>>
>>
>> Another thing I did is I removed the getFruit operation from the Tree
>> class. I then regenerated the code, and I had no duplicate getFruit().
>>
>> Is there a reason you put the getFruit operation in addition to the
>> fruit attribute?
>
> This was the purpose of the example: to demonstrate how an EOperation can
> coincide with the accessor of an EStructuralFeature, and then be redefined
> in subtypes using J2SE 5.0's support for covariant returns. Note that I am
> not a fan of covariant returns in Java for various reasons.
>
>
>> After removing the getFruit operation, the Ecore model is still valid.
>
> Yes, it would be.
>
>
>> The example looks now, as if we could override the meaning of
>> attributes/references using EOperations having by coincidence the same
>> name. Is this clean? Would we not rather need an error, that this
>> results in duplicate methods?
>
> Again, that was the point of the example! Whether it's clean or not depends
> on how you want the generated API to look, I suppose.
>
>
>> In any case, I learn from the example that we can define overriding
>> operations in ECore. And that overriding just does not work for
>> attributes/references, except if we use the above trick with operations.
>>
>>
>>
>> What makes me real unhappy here is that we have fruit as attribute,
>> rather than reference. In all our use scenarios of EMF, the
>> visualization of references as arrows in EMF diagrams is key. This is
>> lost here.
>
> Yes, but this is only because I wanted to demonstrate covariant returns, and
> that only works with wildcards when using collection types. Multivalued
> features are usually more interesting. If "fruit" were a scalar
> EReference, you could do something like:
>
> EClass Tree
> fruit : Fruit [0..1]
> getFruit() : Fruit [0..1]
>
> EClass Conifer -> Tree
> getFruit() : Cone [0..1]
>
> The problem is, that if it's a multiplicity-many EReference, the type cannot
> be a wildcard, but then you don't get covariance:
>
> EClass Tree
> fruit : Fruit [0..*]
> getFruit() : Fruit [0..*]
>
> EClass Conifer -> Tree
> getFruit() : Cone [0..*]
> // error: EList<Cone> is not compatible with EList<Fruit>
>
> Your other option, which is probably more natural anyway, is to use
> generics:
>
> EClass Tree<F extends Fruit>
> fruit : F [0..*]
> getFruit() : Fruit [0..*]
>
> EClass Conifer -> Tree<Cone>
> getFruit() : Cone [0..*]
>
> but, this isn't an example of covariant return types, because binding Cone
> to the type parameter F gives *the same* "EList<F> getFruit()" method in
> the Conifer class an effective signature of "EList<Cone> getFruit()" even
> without the redefinition in the Conifer class. So, it's quite a different
> case.
>
>
>> Best, Philipp
>
> -----8<-----
Re: taking advantage of Java 5.0's support for covariant return types. [message #414987 is a reply to message #414985] Tue, 27 November 2007 14:59 Go to previous message
Eclipse UserFriend
Originally posted by: cdamus.ca.ibm.com

Hi, Philipp,

Yes, I think it does make more sense that an EOperation in a general type is
"coincidentally" implemented by an accessor for a property of a specialized
type.

In fact, now that you mention it, that is exactly the scenario that I had
trouble remembering in which I first noticed that EMF omitted the stub for
the EOperation in the Impl-class when the property accessor could provide
it.

Sorry for taking you so far down another (dark) alley!

cW

Philipp W. Kutter wrote:

> Hi, Christian.
> Thanks for the detailed answers. I learned a lot from your example.
>
> However I think I found the most natural example, which is exactly what
> I looked for.
>
> I'll submit it for Ed's comments in a separate thread, if you agree.
>
> Best, Philipp

-----8<-----
Previous Topic:loading XML: XMLTypeDocumentRootImpl instead of generated DocumentRootImpl?
Next Topic:cross-resource containment and editor issue
Goto Forum:
  


Current Time: Tue Apr 16 19:52:14 GMT 2024

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

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

Back to the top