AW: Dods: How to dynamically create db tables with DODS?

"Madl Alfred" <[email protected]> Sat, 29 Nov 2003 11:04:41 +0100
Newsgroups gmane.comp.java.enhydra.dods
Message-ID <[email protected]>
This is a multi-part message in MIME format.

------=_NextPart_000_0069_01C3B668.9690EC80
Content-Type: multipart/alternative;
	boundary="----=_NextPart_001_006A_01C3B668.9690EC80"


------=_NextPart_001_006A_01C3B668.9690EC80
Content-Type: text/plain;
	charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

Hi !
=20
Currently DODS does not support dynmic table creation.
=20
BUT: DODS 5.1 now cleanly supports project specific generator templates
!
=20
So I think it should be rather easy to adopt the new templates (we had
to rewrite them completely for caching and because of MANY bugs in the
old templates) for your needs. We (and you) should not need a new DODS
release at all for doing that. Just specify the path of the extended
templates during the generation step...
=20
Yes, we will help you to migrate your templates...
=20
Greetings.
=20
Alfred
-----Urspr=FCngliche Nachricht-----
Von: Mathieu MANGEOT-NAGATA [mailto:[email protected]]=20
Bereitgestellt: Donnerstag, 27. November 2003 04:21
Bereitgestellt in: DODS
Unterhaltung: Dods: How to dynamically create db tables with DODS?
Betreff: Dods: How to dynamically create db tables with DODS?





Dear list members,=20

We are working with DODS/Enhydra for about 3 years now.=20
Our website can be viewed at: http://www.papillon-dictionary.org=20

We began the project with Enhydra 3.1and DODS 3.1.=20
Then we moved to Enhydra 5.0, while keeping DODS 3.1.=20

Our next step would be t use enhydra 5.1 with DODS 5.1 but we have a
small=20
adaptation problem:=20
When we started the project, we were not specialists of the jdbc and
communication with databases=20
in general. Thus, we relied entirely on the DODS generated files for the
data layer.=20
Then the project got complicated and I had to create dynamically
database tables and query them.=20
I did not find a way to generate appropriate code with DODS so I hacked
the DODS output in order=20
to generate dynamically these tables.=20
Our website is managing dictionaries. We create one table for each
dictionary volume and we can dynamically=20
add a dictionary on the server.=20

First, I generated a template table (VolumeEntry) that I clone
afterwards. I hacked the DO class code by using a variable=20
for the name of the table. Then, I must give the name of the table as an
argument when I call the DO methods:=20

public class VolumeEntryDO extends
com.lutris.dods.builder.generator.dataobject.GenericDO implements
VolumeEntryDOI, java.io.Serializable {=20

/**=20
* I added a variable for the name of the table :=20
*/=20
protected String dbtablename;=20

public String getTableName() {=20
return dbtablename;=20
}=20

public void setTableName(String name) {=20
dbtablename =3D name;=20
}=20
/**=20
* static final RDBColumn PrimaryKey for use with QueryBuilder.=20
* See example above.=20
* Then I give the name of the table as a parameter for the methods:=20
*/=20
public static RDBColumn getPrimaryKey(String tablename) {=20
RDBTable table =3D new RDBTable(tablename);=20
return new RDBColumn( table,=20
getPrimaryKeyName() );=20

}=20
I hacked also the Query class code by giving the table name (tablename)
as a parameter for the constructor:=20

public class VolumeEntryQuery implements Query {=20


private QueryBuilder builder;=20
private String dbtablename;=20

/**=20
* Public constructor.=20
*/=20
public VolumeEntryQuery(String tablename) {=20
dbtablename =3D tablename;=20
builder =3D new QueryBuilder( tablename, tablename + ".*" );=20
builder.setDatabaseVendor( "PostgreSQL" );=20
builder.setStringMatchDetails( "LIKE", "%" );=20
reset();=20
}=20

Then I created code from the .sql generated files in order to
dynamically create new tables:=20
try {=20
myDbConnection =3D Enhydra.getDatabaseManager().allocateConnection();=20

myDbConnection.execute("CREATE TABLE" + tablename + " (" +=20
"headword TEXT DEFAULT '\'''\'' ," +=20
"id VARCHAR(255) DEFAULT '\'''\'' ," +=20
"pos VARCHAR(255) DEFAULT '\'''\'' ," +=20
"pronunciation VARCHAR(255) DEFAULT '\'''\'' ," +=20
"reading VARCHAR(255) DEFAULT '\'''\'' ," +=20
"translation TEXT DEFAULT '\'''\'' ," +=20
"key1 VARCHAR(255) DEFAULT '\'''\'' ," +=20
"key2 VARCHAR(255) DEFAULT '\'''\'' ," +=20
"xmlCode TEXT DEFAULT '\'''\'' NOT NULL ," +=20

"ObjectId DECIMAL(19,0) NOT NULL PRIMARY KEY," +=20
"ObjectVersion INTEGER NOT NULL)";=20
} catch(SQLException se) {=20
se.printStackTrace();=20
}=20

So far, we had no problem with these code modifications and we were
pleased with that.=20

But the problem comes from the modifications of DODS from the 3.1
version to the new 5.1 version.=20
The new features: DO LRU caching, Query LRU caching, cache
initialization=20
complicate very much the code generated by DODS and now, it is almost
impossible to hack the new DO and Query codes=20
in order to generate tables dynamically. Thus we are sticked with the
old version of DODS.=20

Here are my questions then:=20

1) Is there an option in the new DODS that allows one to generate code
for dynamically creating database tables?=20
I maybe did not read carefully the doc.=20

2) If not, is there anyone who developped his/her own solution for
dynamically creating database tables?=20

3) Is the DODS team interested in such a feature for a next release in
DODS? In this case, we may try to patch the existing=20
DODS with the help of DODS team and then integrate this patch as an
option in DODS for dynamically creating dbtables.=20

4) If nothing is possible, is there a way to use the old DODS (3.1) with
the new Enhydra (5.1)=20

Thank you for your answers,=20

Mathieu=20



------=_NextPart_001_006A_01C3B668.9690EC80
Content-Type: text/html;
	charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD><TITLE>Nachricht</TITLE>
<META http-equiv=3DContent-Type content=3D"text/html; =
charset=3Diso-8859-1">
<META content=3D"MSHTML 6.00.2800.1264" name=3DGENERATOR></HEAD>
<BODY>
<DIV><FONT face=3DArial color=3D#0000ff size=3D2><SPAN =
class=3D280240010-29112003>Hi=20
!</SPAN></FONT></DIV>
<DIV><FONT face=3DArial color=3D#0000ff size=3D2><SPAN=20
class=3D280240010-29112003></SPAN></FONT>&nbsp;</DIV>
<DIV><FONT face=3DArial color=3D#0000ff size=3D2><SPAN=20
class=3D280240010-29112003>Currently DODS does not support dynmic table=20
creation.</SPAN></FONT></DIV>
<DIV><FONT face=3DArial color=3D#0000ff size=3D2><SPAN=20
class=3D280240010-29112003></SPAN></FONT>&nbsp;</DIV>
<DIV><FONT face=3DArial color=3D#0000ff size=3D2><SPAN =
class=3D280240010-29112003>BUT:=20
DODS 5.1 now cleanly supports project specific generator templates=20
!</SPAN></FONT></DIV>
<DIV><FONT face=3DArial color=3D#0000ff size=3D2><SPAN=20
class=3D280240010-29112003></SPAN></FONT>&nbsp;</DIV>
<DIV><FONT face=3DArial color=3D#0000ff size=3D2><SPAN =
class=3D280240010-29112003>So I=20
think it should be rather easy to adopt the new templates (we had to =
rewrite=20
them completely for caching and because of MANY bugs in the old =
templates) for=20
your needs. We (and you) should not need a new DODS release at all for =
doing=20
that. Just specify the path of the&nbsp;extended templates during the =
generation=20
step...</SPAN></FONT></DIV>
<DIV><FONT face=3DArial color=3D#0000ff size=3D2><SPAN=20
class=3D280240010-29112003></SPAN></FONT>&nbsp;</DIV>
<DIV><FONT face=3DArial color=3D#0000ff size=3D2><SPAN =
class=3D280240010-29112003>Yes,=20
we will help you to migrate your templates...</SPAN></FONT></DIV>
<DIV><FONT face=3DArial color=3D#0000ff size=3D2><SPAN=20
class=3D280240010-29112003></SPAN></FONT>&nbsp;</DIV>
<DIV><FONT face=3DArial color=3D#0000ff size=3D2><SPAN=20
class=3D280240010-29112003>Greetings.</SPAN></FONT></DIV>
<DIV><FONT face=3DArial color=3D#0000ff size=3D2><SPAN=20
class=3D280240010-29112003></SPAN></FONT>&nbsp;</DIV>
<DIV><FONT face=3DArial color=3D#0000ff size=3D2><SPAN=20
class=3D280240010-29112003>Alfred</SPAN></FONT></DIV>
<DIV></DIV>
<DIV><FONT face=3DTahoma size=3D2>-----Urspr=FCngliche =
Nachricht-----<BR><B>Von:</B>=20
Mathieu MANGEOT-NAGATA [mailto:[email protected]] =
<BR><B>Bereitgestellt:</B>=20
Donnerstag, 27. November 2003 04:21<BR><B>Bereitgestellt in:</B>=20
DODS<BR><B>Unterhaltung:</B> Dods: How to dynamically create db tables =
with=20
DODS?<BR><B>Betreff:</B> Dods: How to dynamically create db tables with=20
DODS?<BR><BR></DIV></FONT>
<BLOCKQUOTE style=3D"MARGIN-RIGHT: 0px"><!-- Converted from =
text/enriched format --><BR><BR>
  <DIV>Dear list members, </DIV><BR>
  <DIV>We are working with DODS/Enhydra for about 3 years now. </DIV>
  <DIV>Our website can be viewed at: http://www.papillon-dictionary.org=20
  </DIV><BR>
  <DIV>We began the project with Enhydra 3.1and DODS 3.1. </DIV>
  <DIV>Then we moved to Enhydra 5.0, while keeping DODS 3.1. </DIV><BR>
  <DIV>Our next step would be t use enhydra 5.1 with DODS 5.1 but we =
have a=20
  small </DIV>
  <DIV>adaptation problem: </DIV>
  <DIV>When we started the project, we were not specialists of the jdbc =
and=20
  communication with databases </DIV>
  <DIV>in general. Thus, we relied entirely on the DODS generated files =
for the=20
  data layer. </DIV>
  <DIV>Then the project got complicated and I had to create dynamically =
database=20
  tables and query them. </DIV>
  <DIV>I did not find a way to generate appropriate code with DODS so I =
hacked=20
  the DODS output in order </DIV>
  <DIV>to generate dynamically these tables. </DIV>
  <DIV>Our website is managing dictionaries. We create one table for =
each=20
  dictionary volume and we can dynamically </DIV>
  <DIV>add a dictionary on the server. </DIV><BR>
  <DIV>First, I generated a template table (VolumeEntry) that I clone=20
  afterwards. I hacked the DO class code by using a variable </DIV>
  <DIV>for the name of the table. Then, I must give the name of the =
table as an=20
  argument when I call the DO methods: </DIV><BR>
  <DIV><TT><SMALL><FONT color=3D#760f50>public</FONT> <FONT=20
  color=3D#760f50>class</FONT> VolumeEntryDO <FONT =
color=3D#760f50>extends</FONT>=20
  com.lutris.dods.builder.generator.dataobject.GenericDO <FONT=20
  color=3D#760f50>implements</FONT> VolumeEntryDOI, java.io.Serializable =
{=20
  </DIV><BR>
  <DIV><FONT color=3D#236e25>/** </DIV>
  <DIV></FONT><FONT color=3D#236e25>*</FONT> I added a variable for the =
name of=20
  the table : <FONT color=3D#236e25></DIV>
  <DIV>*/</FONT> </DIV>
  <DIV><FONT color=3D#760f50>protected</FONT> String dbtablename; =
</DIV><BR>
  <DIV><FONT color=3D#760f50>public</FONT> String getTableName() { =
</DIV>
  <DIV><FONT color=3D#760f50>return</FONT> dbtablename; </DIV>
  <DIV>} </DIV><BR>
  <DIV><FONT color=3D#760f50>public</FONT> <FONT =
color=3D#760f50>void</FONT>=20
  setTableName(String name) { </DIV>
  <DIV>dbtablename =3D name; </DIV>
  <DIV>} </DIV>
  <DIV></DIV>
  <DIV></DIV>
  <DIV><FONT color=3D#236e25>/** </DIV>
  <DIV>* static final RDBColumn PrimaryKey for use with QueryBuilder. =
</DIV>
  <DIV>* See example above. </DIV>
  <DIV></FONT><FONT color=3D#236e25>* Then I give the name of the table =
as a=20
  parameter for the methods:</FONT><FONT color=3D#236e25> </DIV>
  <DIV>*/</FONT> </DIV>
  <DIV><FONT color=3D#760f50>public</FONT> <FONT =
color=3D#760f50>static</FONT>=20
  RDBColumn getPrimaryKey(String tablename) { </DIV>
  <DIV>RDBTable table =3D <FONT color=3D#760f50>new</FONT> =
RDBTable(tablename);=20
  </DIV>
  <DIV><FONT color=3D#760f50>return</FONT> <FONT =
color=3D#760f50>new</FONT>=20
  RDBColumn( table, </DIV>
  <DIV>getPrimaryKeyName() ); </DIV><BR>
  <DIV>} </DIV>
  <DIV></SMALL></TT></DIV>
  <DIV>I hacked also the Query class code by giving the table name=20
  (<TT><SMALL>tablename</SMALL></TT>) as a parameter for the =
constructor:=20
  </DIV><BR>
  <DIV><TT><FONT color=3D#760f50><SMALL>public</SMALL></FONT><SMALL> =
<FONT=20
  color=3D#760f50>class</FONT> VolumeEntryQuery <FONT=20
  color=3D#760f50>implements</FONT> Query { </DIV><BR><BR>
  <DIV><FONT color=3D#760f50>private</FONT> QueryBuilder builder; </DIV>
  <DIV><FONT color=3D#760f50>private</FONT> String dbtablename; =
</DIV><BR>
  <DIV><FONT color=3D#236e25>/** </DIV>
  <DIV>* Public constructor. </DIV>
  <DIV>*/</FONT> </DIV>
  <DIV><FONT color=3D#760f50>public</FONT> VolumeEntryQuery(String =
tablename) {=20
  </DIV>
  <DIV>dbtablename =3D tablename; </DIV>
  <DIV>builder =3D <FONT color=3D#760f50>new</FONT> QueryBuilder( =
tablename,=20
  tablename + <FONT color=3D#891315>".*"</FONT> ); </DIV>
  <DIV>builder.setDatabaseVendor( <FONT =
color=3D#891315>"PostgreSQL"</FONT> );=20
  </DIV>
  <DIV>builder.setStringMatchDetails( <FONT =
color=3D#891315>"LIKE"</FONT>, <FONT=20
  color=3D#891315>"%"</FONT> ); </DIV>
  <DIV>reset(); </DIV>
  <DIV>} </DIV><BR>
  <DIV></SMALL></TT>Then I created code from the .sql generated files in =
order=20
  to dynamically create new tables: </DIV>
  <DIV><TT><SMALL><FONT color=3D#760f50>try</FONT> {</SMALL></TT> </DIV>
  <DIV><TT><SMALL>myDbConnection =3D=20
  Enhydra.getDatabaseManager().allocateConnection(); </DIV><BR>
  <DIV>myDbConnection.execute(<FONT color=3D#891315>"CREATE TABLE" =
</FONT>+=20
  tablename + <FONT color=3D#891315>" ("</FONT> + </DIV>
  <DIV><FONT color=3D#891315>"headword TEXT DEFAULT '\'''\'' ,"</FONT> + =
</DIV>
  <DIV><FONT color=3D#891315>"id VARCHAR(255) DEFAULT '\'''\'' ,"</FONT> =
+ </DIV>
  <DIV><FONT color=3D#891315>"pos VARCHAR(255) DEFAULT '\'''\'' =
,"</FONT> + </DIV>
  <DIV><FONT color=3D#891315>"pronunciation VARCHAR(255) DEFAULT =
'\'''\''=20
  ,"</FONT> + </DIV>
  <DIV><FONT color=3D#891315>"reading VARCHAR(255) DEFAULT '\'''\'' =
,"</FONT> +=20
  </DIV>
  <DIV><FONT color=3D#891315>"translation TEXT DEFAULT '\'''\'' =
,"</FONT> + </DIV>
  <DIV><FONT color=3D#891315>"key1 VARCHAR(255) DEFAULT '\'''\'' =
,"</FONT> +=20
</DIV>
  <DIV><FONT color=3D#891315>"key2 VARCHAR(255) DEFAULT '\'''\'' =
,"</FONT> +=20
</DIV>
  <DIV><FONT color=3D#891315>"xmlCode TEXT DEFAULT '\'''\'' NOT NULL =
,"</FONT> +=20
  </DIV><BR>
  <DIV><FONT color=3D#891315>"ObjectId DECIMAL(19,0) NOT NULL PRIMARY =
KEY,"</FONT>=20
  + </DIV>
  <DIV><FONT color=3D#891315>"ObjectVersion INTEGER NOT NULL)"</FONT>; =
</DIV>
  <DIV></DIV>
  <DIV>} <FONT color=3D#760f50>catch</FONT>(SQLException se) { </DIV>
  <DIV>se.printStackTrace(); </DIV>
  <DIV></SMALL></TT><TT><SMALL>} </DIV><BR>
  <DIV></SMALL></TT>So far, we had no problem with these code =
modifications and=20
  we were pleased with that. </DIV><BR>
  <DIV>But the problem comes from the modifications of DODS from the 3.1 =
version=20
  to the new 5.1 version. </DIV>
  <DIV>The new features: <FONT face=3DArial><SMALL>DO LRU caching, Query =
LRU=20
  caching, cache initialization </SMALL></FONT></DIV>
  <DIV>complicate very much the code generated by DODS and now, it is =
almost=20
  impossible to hack the new DO and Query codes </DIV>
  <DIV>in order to generate tables dynamically. Thus we are sticked with =
the old=20
  version of DODS. </DIV><BR>
  <DIV>Here are my questions then: </DIV><BR>
  <DIV>1) Is there an option in the new DODS that allows one to generate =
code=20
  for dynamically creating database tables? </DIV>
  <DIV>I maybe did not read carefully the doc. </DIV><BR>
  <DIV>2) If not, is there anyone who developped his/her own solution =
for=20
  dynamically creating database tables? </DIV><BR>
  <DIV>3) Is the DODS team interested in such a feature for a next =
release in=20
  DODS? In this case, we may try to patch the existing </DIV>
  <DIV>DODS with the help of DODS team and then integrate this patch as =
an=20
  option in DODS for dynamically creating dbtables. </DIV><BR>
  <DIV>4) If nothing is possible, is there a way to use the old DODS =
(3.1) with=20
  the new Enhydra (5.1) </DIV><BR>
  <DIV>Thank you for your answers, </DIV><BR>
  <DIV>Mathieu </DIV>
  <DIV></DIV><BR></BLOCKQUOTE></BODY></HTML>

------=_NextPart_001_006A_01C3B668.9690EC80--

------=_NextPart_000_0069_01C3B668.9690EC80
Content-Type: application/x-pkcs7-signature;
	name="smime.p7s"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
	filename="smime.p7s"

MIAGCSqGSIb3DQEHAqCAMIACAQExCzAJBgUrDgMCGgUAMIAGCSqGSIb3DQEHAQAAoIII2jCCAmIw
ggHLoAMCAQICAwsPZTANBgkqhkiG9w0BAQQFADBiMQswCQYDVQQGEwJaQTElMCMGA1UEChMcVGhh
d3RlIENvbnN1bHRpbmcgKFB0eSkgTHRkLjEsMCoGA1UEAxMjVGhhd3RlIFBlcnNvbmFsIEZyZWVt
YWlsIElzc3VpbmcgQ0EwHhcNMDMxMTAyMTcyODQyWhcNMDQxMTAxMTcyODQyWjBZMQ0wCwYDVQQE
EwRNYWRsMQ8wDQYDVQQqEwZBbGZyZWQxFDASBgNVBAMTC0FsZnJlZCBNYWRsMSEwHwYJKoZIhvcN
AQkBFhJBLk1hZGxAdG9nZXRoZXIuYXQwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMSUz0lI
gbjM8T5YPR5N2zkqHZCEQnP6hHG2LfUAVkssM+ArKJWrxPrfpNJrggv1SWBII3qeHOaZZbHeHLTc
Ji3xxEduLuM9dUcxEOgYc+4Q3mw4O2IVJN343rHuzEtFktOJWMpoSZihy8OHhsaukhOMFGDo/2Lp
D0nLRQS5v4OlAgMBAAGjLzAtMB0GA1UdEQQWMBSBEkEuTWFkbEB0b2dldGhlci5hdDAMBgNVHRMB
Af8EAjAAMA0GCSqGSIb3DQEBBAUAA4GBAKnq3350qe6y9F+qnEhU8wwmW7sFvYgbVJubU/lrdm/D
0SsUci6e7b3aOr0T60Ubl9J4BPAmfy0pBBBKfrKHvHzuUJCiNItLXe2xf3sFCakK9qUmH8897o9Q
fseb+Gll7EOkWyh6cvq5+7J9q9dwLOQ5omDQXicZvXTSmsORjUdiMIIDLTCCApagAwIBAgIBADAN
BgkqhkiG9w0BAQQFADCB0TELMAkGA1UEBhMCWkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAG
A1UEBxMJQ2FwZSBUb3duMRowGAYDVQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2Vy
dGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEkMCIGA1UEAxMbVGhhd3RlIFBlcnNvbmFsIEZy
ZWVtYWlsIENBMSswKQYJKoZIhvcNAQkBFhxwZXJzb25hbC1mcmVlbWFpbEB0aGF3dGUuY29tMB4X
DTk2MDEwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgdExCzAJBgNVBAYTAlpBMRUwEwYDVQQIEwxX
ZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEaMBgGA1UEChMRVGhhd3RlIENvbnN1bHRp
bmcxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2aXNpb24xJDAiBgNVBAMTG1Ro
YXd0ZSBQZXJzb25hbCBGcmVlbWFpbCBDQTErMCkGCSqGSIb3DQEJARYccGVyc29uYWwtZnJlZW1h
aWxAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA1GnX1LCUZFtx6UfYDFG2
6nKRsIRefS0Nj3sS34UldSh0OkIsYyeflXtL734Zhx2G6qPduc6WZBrCFG5ErHzmj+hND3EfQDim
AKOHePb5lIZererAXnbr2RSjXW56fAylS1V/Bhkpf56aJtVquzgkCGqYx7Hao5iR/Xnb5VrEHLkC
AwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQFAAOBgQDH7JJ+Tvj1lqVnYiqk
8E0RYNBvjWBYYawmu1I1XAjPMPuoSpaKH2JCI4wXD/S6ZJwXrEcp352YXtJsYHFcoqzceePnbgBH
H7UNKOgCneSa/RP0ptl8sfjcXyMmCZGAc9AUG95DqYMl8uacLxXK/qarigd1iwzdUYRr5PjRznei
gTCCAz8wggKooAMCAQICAQ0wDQYJKoZIhvcNAQEFBQAwgdExCzAJBgNVBAYTAlpBMRUwEwYDVQQI
EwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEaMBgGA1UEChMRVGhhd3RlIENvbnN1
bHRpbmcxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2aXNpb24xJDAiBgNVBAMT
G1RoYXd0ZSBQZXJzb25hbCBGcmVlbWFpbCBDQTErMCkGCSqGSIb3DQEJARYccGVyc29uYWwtZnJl
ZW1haWxAdGhhd3RlLmNvbTAeFw0wMzA3MTcwMDAwMDBaFw0xMzA3MTYyMzU5NTlaMGIxCzAJBgNV
BAYTAlpBMSUwIwYDVQQKExxUaGF3dGUgQ29uc3VsdGluZyAoUHR5KSBMdGQuMSwwKgYDVQQDEyNU
aGF3dGUgUGVyc29uYWwgRnJlZW1haWwgSXNzdWluZyBDQTCBnzANBgkqhkiG9w0BAQEFAAOBjQAw
gYkCgYEAxKY8VXNV+065yplaHmjAdQRwnd/p/6Me7L3N9VvyGna9fww6YfK/Uc4B1OVQCjDXAmNa
LIkVcI7dyfArhVqqP3FWy688Cwfn8R+RNiQqE88r1fOCdz0Dviv+uxg+B79AgAJk16emu59l0cUq
VIUPSAR/p7bRPGEEQB5kGXJgt/sCAwEAAaOBlDCBkTASBgNVHRMBAf8ECDAGAQH/AgEAMEMGA1Ud
HwQ8MDowOKA2oDSGMmh0dHA6Ly9jcmwudGhhd3RlLmNvbS9UaGF3dGVQZXJzb25hbEZyZWVtYWls
Q0EuY3JsMAsGA1UdDwQEAwIBBjApBgNVHREEIjAgpB4wHDEaMBgGA1UEAxMRUHJpdmF0ZUxhYmVs
Mi0xMzgwDQYJKoZIhvcNAQEFBQADgYEASIzRUIPqCy7MDaNmrGcPf6+svsIXoUOWlJ1/TCG4+DYf
qi2fNi/A9BxQIJNwPP2t4WFiw9k6GX6EsZkbAMUaC4J0niVQlGLH2ydxVyWN3amcOY6MIE9lX5Xa
9/eH1sYITq726jTlEBpbNU1341YheILcIRk13iSx0x1G/11fZU8xggMcMIIDGAIBATBpMGIxCzAJ
BgNVBAYTAlpBMSUwIwYDVQQKExxUaGF3dGUgQ29uc3VsdGluZyAoUHR5KSBMdGQuMSwwKgYDVQQD
EyNUaGF3dGUgUGVyc29uYWwgRnJlZW1haWwgSXNzdWluZyBDQQIDCw9lMAkGBSsOAwIaBQCgggIJ
MBgGCSqGSIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZIhvcNAQkFMQ8XDTAzMTEyOTEwMDQ0MVow
IwYJKoZIhvcNAQkEMRYEFGp0Ot1d8D2rrRDoU5jygOri10gaMEsGCyqGSIb3DQEJEAIBMTwwOgQd
AAAAABAAAABYl1WA50D6S4fN2EXduC+nAQAAAACAAQAwFjAUgRJBLk1hZGxAdG9nZXRoZXIuYXQw
ZwYJKoZIhvcNAQkPMVowWDAKBggqhkiG9w0DBzAHBgUrDgMCGjAOBggqhkiG9w0DAgICAIAwDQYI
KoZIhvcNAwICAUAwBwYFKw4DAgcwDQYIKoZIhvcNAwICASgwCgYIKoZIhvcNAgUweAYJKwYBBAGC
NxAEMWswaTBiMQswCQYDVQQGEwJaQTElMCMGA1UEChMcVGhhd3RlIENvbnN1bHRpbmcgKFB0eSkg
THRkLjEsMCoGA1UEAxMjVGhhd3RlIFBlcnNvbmFsIEZyZWVtYWlsIElzc3VpbmcgQ0ECAwsPZTB6
BgsqhkiG9w0BCRACCzFroGkwYjELMAkGA1UEBhMCWkExJTAjBgNVBAoTHFRoYXd0ZSBDb25zdWx0
aW5nIChQdHkpIEx0ZC4xLDAqBgNVBAMTI1RoYXd0ZSBQZXJzb25hbCBGcmVlbWFpbCBJc3N1aW5n
IENBAgMLD2UwDQYJKoZIhvcNAQEBBQAEgYBsA7uvWuVQ0pP41eJuyf3po5OWsFrKUVTcR7GcEXDg
2jafT2V+aY0ZrCrO38tLjVLpSLTCq6iVbTiyuGVJXj2knerTflBycR5NFk8r10BlB47spE8zwzR6
NbcJSREJVXZMPKHrV3XHCk9PcXiyY7hbYDHbBDJ7XYH50EzeWULUpgAAAAAAAA==

------=_NextPart_000_0069_01C3B668.9690EC80--