Thanks for everyone's ideas. I think Shaun's solution is exactly what
I'm trying to do.
> Shaun Ellis <mailto:[log in to unmask]>
> June 16, 2014 at 10:36 PM
> Ryan, it sounds like you simply want to pull two relational tables
> into drupal using referenced entities in a one (question) to many
> (answers) relationship?
>
> This can be accomplished, albeit unintuitively (it is Drupal
> afterall), by using the Feeds CSV parser with Feeds Tamper, and I
> would skip what seems like an unnecessary conversion to XML step.
>
> First, you import your questions and set a GUID target (typically your
> db id). Then import your answers -- each should have a reference to
> the id mapped using the "Entity Reference by Feeds GUID". I have done
> it in reverse order too, in which case you'd import all your answers
> first. In this case, your second (questions) import needs to contain a
> single column of delimited answer GUIDs into a single column. Use the
> Feeds Tamper explode plugin on that field during mapping as explained
> (rather vaguely) here:
>
> http://drupal.stackexchange.com/questions/32234/how-to-use-feeds-module-to-import-multi-value-fields
>
>
> If that's not what you're trying to do, can you clarify?
>
> -Shaun
>
>
>
> Joshua Welker <mailto:[log in to unmask]>
> June 16, 2014 at 2:35 PM
> Sorry, the last line got messed up by outlook.
>
> #now save the whole thing as an xml file
>
> with open('myfile.xml', 'wb') as file
> ElementTree(rootNode).write(file)
>
>
> Josh Welker
>
>
> -----Original Message-----
> From: Joshua Welker [mailto:[log in to unmask]]
> Sent: Monday, June 16, 2014 2:32 PM
> To: Code for Libraries
> Subject: RE: [CODE4LIB] Excel to XML (for a Drupal Feeds import)
>
> This should be quite doable in most programming languages with
> out-of-the-box tools and no tricky parsing code. The gist is to save in
> Excel as a delimited text file (tab is a good choice), then have your
> script
> ingest the document and turn it into an array, and then turn the array
> into
> XML. In Python, it could be something like the code below (not tested but
> the principles should be sound):
>
> import 'csv'
> from elementtree.ElementTree import Element, SubElement
>
> #create a list
> mylist = []
>
> #open your delimited file with a csv reader with open('myfile.txt',
> 'rb') as
> textfile:
> reader = csv.reader( textfile, delimiter='\t', quotechat='"') #this
> assumes your file is tab-delimited (\t)
>
> #loop through rows in your file and save each row as a key/value pair
> (dictionary)
> for row in textfile:
> fields = {
> 'field1': row[0]
> 'field2': row[1]
> 'field3': row[2]
> 'field4': row[3]
> }
>
> #append this row to our master list
> mylist.append( fields )
>
>
> #create an xml root node
> rootNode = Element("XmlRoot")
>
> #loop through our list of "rows" from the text file and create xml
> nodes for
> row in mylist:
> rowNode = Element("record")
>
> #loop through all the fields on this "row" and turn them into xml nodes
> for fieldName, fieldValue in row:
> fieldNode = Element(fieldName)
> fieldNode.text = fieldValue
>
> #append each field node to the parent row node
> rowNode.append(fieldNode)
>
> #append each row node to the document root node
> rootNode.append(rowNode)
>
> #now save the whole thing as an xml file with open('myfile.xml', 'wb') as
> file
> ElementTree(rootNode).write(file)
>
>
>
> Josh Welker
>
> -----Original Message-----
> From: Code for Libraries [mailto:[log in to unmask]] On Behalf
> Of Kyle
> Banerjee
> Sent: Monday, June 16, 2014 1:04 PM
> To: [log in to unmask]
> Subject: Re: [CODE4LIB] Excel to XML (for a Drupal Feeds import)
>
> I'd just do this the old fashioned way. Awk is great for problems like
> this.
> For example, if your file is tab delimited, the following should work
>
> awk '{FS="\t"}{if ($2 != "") question = $2;}{print $1,question,$3}''
> yourfile
>
> In the example above, I just print the fields but you could easily encase
> them in tags.
>
> kyle
>
>
> Joshua Welker <mailto:[log in to unmask]>
> June 16, 2014 at 2:32 PM
> This should be quite doable in most programming languages with
> out-of-the-box tools and no tricky parsing code. The gist is to save in
> Excel as a delimited text file (tab is a good choice), then have your
> script
> ingest the document and turn it into an array, and then turn the array
> into
> XML. In Python, it could be something like the code below (not tested but
> the principles should be sound):
>
> import 'csv'
> from elementtree.ElementTree import Element, SubElement
>
> #create a list
> mylist = []
>
> #open your delimited file with a csv reader
> with open('myfile.txt', 'rb') as textfile:
> reader = csv.reader( textfile, delimiter='\t', quotechat='"') #this
> assumes your file is tab-delimited (\t)
>
> #loop through rows in your file and save each row as a key/value pair
> (dictionary)
> for row in textfile:
> fields = {
> 'field1': row[0]
> 'field2': row[1]
> 'field3': row[2]
> 'field4': row[3]
> }
>
> #append this row to our master list
> mylist.append( fields )
>
>
> #create an xml root node
> rootNode = Element("XmlRoot")
>
> #loop through our list of "rows" from the text file and create xml nodes
> for row in mylist:
> rowNode = Element("record")
>
> #loop through all the fields on this "row" and turn them into xml nodes
> for fieldName, fieldValue in row:
> fieldNode = Element(fieldName)
> fieldNode.text = fieldValue
>
> #append each field node to the parent row node
> rowNode.append(fieldNode)
>
> #append each row node to the document root node
> rootNode.append(rowNode)
>
> #now save the whole thing as an xml file
> with open('myfile.xml', 'wb') as file
> ElementTree(rootNode).write(file)
>
>
>
> Josh Welker
>
> -----Original Message-----
> From: Code for Libraries [mailto:[log in to unmask]] On Behalf
> Of Kyle
> Banerjee
> Sent: Monday, June 16, 2014 1:04 PM
> To: [log in to unmask]
> Subject: Re: [CODE4LIB] Excel to XML (for a Drupal Feeds import)
>
> I'd just do this the old fashioned way. Awk is great for problems like
> this.
> For example, if your file is tab delimited, the following should work
>
> awk '{FS="\t"}{if ($2 != "") question = $2;}{print $1,question,$3}''
> yourfile
>
> In the example above, I just print the fields but you could easily encase
> them in tags.
>
> kyle
>
>
> Kyle Banerjee <mailto:[log in to unmask]>
> June 16, 2014 at 1:03 PM
> I'd just do this the old fashioned way. Awk is great for problems like
> this. For example, if your file is tab delimited, the following should
> work
>
> awk '{FS="\t"}{if ($2 != "") question = $2;}{print $1,question,$3}''
> yourfile
>
> In the example above, I just print the fields but you could easily encase
> them in tags.
>
> kyle
>
>
> Ryan Engel <mailto:[log in to unmask]>
> June 16, 2014 at 11:29 AM
> Thanks for the responses, on the list and off, so far.
>
> As I'm sure is true for so many of us, my interest in learning more
> about how to solve this type of problem is balanced against my need to
> just get the project done so I can move on to other things. One of
> the great things about this list is the ability to learn from the
> collective experiences of colleagues. For this project specifically,
> even clues about better search terms is useful; as Chris Gray pointed
> out, basic Google searches present too many hits.
>
> I did try following the "Create an XML data file and XML schema file
> from worksheet data" instructions on the Microsoft site. And it did
> produce an XML document, but it wasn't able to transform this:
> Row1 Question1 Q1Answer1
> Row2 Q1Answer2
>
> ...into something like this:
> <row1>Row One Data</row1>
> <question1>This is a question</question1>
> <answers>
> <q1answer1>Answer 1</q1answer1>
> <q1answer2>Answer2</q1answer2>
> </answers
>
> Instead, I could get it to either convert every row into its own XML
> entry, meaning that I had a lot of answers with no associated
> questions, or I got an XML file that had 1 question with EVERY SINGLE
> answer nested beneath it -- effectively all questions after the first
> question were ignored. Based on those results, I wasn't sure if there
> is more tweaking I could do in Excel, or if there is some programmed
> logic in Excel that can't be accounted for when associating a schema.
>
>
> Another suggestion I received was to "fill" the question column so
> that every row had a question listed. I did consider this, but the
> problem then is during the data import, I'd have to convince my CMS to
> put all the answers back together based on the question, something I'm
> sure Drupal COULD do, but I'm not sure how to do that either.
>
>
> Finally, this project is a spreadsheet with 225,270 rows, so you can
> imagine why I'd like a process that is reasonably trustworthy AND that
> can run locally.
>
>
> Anyway, any/all additional suggestions appreciated, even if they are
> "try searching for "blah blah python parser", or "I made something
> that solves a similar process, and you can download it from Git".
>
> Ryan
> ___
>
> Ryan Engel
> Web Stuff
> UW-Madison
>
--
Ryan Engel
Web Services Architect
Learning Support Services
College of Letters and Science
University of Wisconsin - Madison
291 Van Hise Hall
[log in to unmask]
608-263-5002
--------------ms000002060804070407070702
Content-Type: application/x-pkcs7-signature; name="smime.p7s"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="smime.p7s"
Content-Description: S/MIME Cryptographic Signature
MIAGCSqGSIb3DQEHAqCAMIACAQExCzAJBgUrDgMCGgUAMIAGCSqGSIb3DQEHAQAAoIIZRzCC
BJ8wggQIoAMCAQICBEaekRowDQYJKoZIhvcNAQEFBQAwgcMxCzAJBgNVBAYTAlVTMRQwEgYD
VQQKEwtFbnRydXN0Lm5ldDE7MDkGA1UECxMyd3d3LmVudHJ1c3QubmV0L0NQUyBpbmNvcnAu
IGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0
IExpbWl0ZWQxOjA4BgNVBAMTMUVudHJ1c3QubmV0IFNlY3VyZSBTZXJ2ZXIgQ2VydGlmaWNh
dGlvbiBBdXRob3JpdHkwHhcNMDkwMzIzMTUxODI3WhcNMTkwMzIzMTU0ODI3WjCBtDEUMBIG
A1UEChMLRW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp
bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1
c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0
aG9yaXR5ICgyMDQ4KTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK1NS6kShrLq
oyAHFRZkKitL0b8LSk2O7YB2pWe3eEDAc0LIaMDbUyvdXrh2mDWTixqdfBM6Dh9btx7P5SQU
HrGBqY19uMxrSwPxAgzcq6VAJAB/dJShnQgps4gL9Yd3nVXN5MN+12pkq4UUhpVblzJQbz3I
umYM4/y9uEnBdolJGf3AqL2Jo2cvxp+8cRlguC3pLMmQdmZ7lOKveNZlU1081pyyzykD+S+k
ULLUSM4FMlWK/bJkTA7kmAd123/fuQhVYIUwKfl7SKRphuM1Px6GXXp6Fb3vAI4VIlQXAJAm
k7wOSWiRv/hH052VQsEOTd9vJs/DGCFiZkNw1tXAB+ECAwEAAaOCAScwggEjMA4GA1UdDwEB
/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MDMGCCsGAQUFBwEBBCcwJTAjBggrBgEFBQcwAYYX
aHR0cDovL29jc3AuZW50cnVzdC5uZXQwMwYDVR0fBCwwKjAooCagJIYiaHR0cDovL2NybC5l
bnRydXN0Lm5ldC9zZXJ2ZXIxLmNybDA7BgNVHSAENDAyMDAGBFUdIAAwKDAmBggrBgEFBQcC
ARYaaHR0cDovL3d3dy5lbnRydXN0Lm5ldC9DUFMwHQYDVR0OBBYEFFXkgdERgL7YibkIozH5
oSQJFrlwMB8GA1UdIwQYMBaAFPAXYhNVPbP/CgBr+1CEl/PtYtAaMBkGCSqGSIb2fQdBAAQM
MAobBFY3LjEDAgCBMA0GCSqGSIb3DQEBBQUAA4GBAI9lojCOJquK7DUWmOkD8I0XX7xMbAL2
dFLgwsYfzvKmEQyosQ5NhItxNu+zNUXzwfiWxYtVpMxrgxYgMtq++6+bt5/hfoSfnjxQpz9c
wr6LhrgIku74QisNE+N2hUgKSr/QpTsKsFS4beMI+TSNC46LEswXGjOHlcieCtxQUxd7MIIF
ozCCBIugAwIBAgIETA5iEjANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u
ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4g
KGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQx
MzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAe
Fw0xMDA2MzAxODM0NTRaFw0yMDA2MzAxOTA0NTRaMIGAMQswCQYDVQQGEwJVUzEQMA4GA1UE
ChMHRW50cnVzdDEiMCAGA1UECxMZQ2VydGlmaWNhdGlvbiBBdXRob3JpdGllczE7MDkGA1UE
AxMyRW50cnVzdCBNYW5hZ2VkIFNlcnZpY2VzIENvbW1lcmNpYWwgUHVibGljIFJvb3QgQ0Ew
ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDMXI+wxZoiWKTiB15DT/VyF8eTSWED
/vatNS6/Y+s9kbGo2oI8Qlk/lsWn7lv9UeJmIVeu+Pp6iNTyQ09kOAyBBmAQ/yKq4PRHnsrP
uxgkirXZ5t3AumSPVr62v2kHVce9S94LjCR2UIov0EMvs8/qq95KIGxGLTgdoeDVXI/5RZeA
sGTquePKvbHest1FmPQaly2pRPdnlRHEmJQ2NkaR45AeQvKKn8kzpYeCoBLyCsD0HbHzlIfP
aujKqEcQZIbJUyD0y++KNajSPATWImCt2eXdeHEUcnmcHGq9ha1EEI02oW8zT2R0xhjdLoR5
Ds+xg43iGyxLPdoliIxHVPhhAgMBAAGjggHtMIIB6TAOBgNVHQ8BAf8EBAMCAQYwEgYDVR0T
AQH/BAgwBgEB/wIBATAzBggrBgEFBQcBAQQnMCUwIwYIKwYBBQUHMAGGF2h0dHA6Ly9vY3Nw
LmVudHJ1c3QubmV0MIIBGAYDVR0gBIIBDzCCAQswVwYNYIZIAYb6a4FIAwoCBDBGMEQGCCsG
AQUFBwIBFjhodHRwOi8vY29tcHViLm1hbmFnZWQuZW50cnVzdC5jb20vQ1AvRU1TQ29tbWVy
Y2lhbENQLnBkZjBXBg1ghkgBhvprgUgDCgIFMEYwRAYIKwYBBQUHAgEWOGh0dHA6Ly9jb21w
dWIubWFuYWdlZC5lbnRydXN0LmNvbS9DUC9FTVNDb21tZXJjaWFsQ1AucGRmMFcGDWCGSAGG
+muBSAMKAgYwRjBEBggrBgEFBQcCARY4aHR0cDovL2NvbXB1Yi5tYW5hZ2VkLmVudHJ1c3Qu
Y29tL0NQL0VNU0NvbW1lcmNpYWxDUC5wZGYwMgYDVR0fBCswKTAnoCWgI4YhaHR0cDovL2Ny
bC5lbnRydXN0Lm5ldC8yMDQ4Y2EuY3JsMB0GA1UdDgQWBBTAMkkFZmaDhxlpua6DJQYZiwXX
dDAfBgNVHSMEGDAWgBRV5IHREYC+2Im5CKMx+aEkCRa5cDANBgkqhkiG9w0BAQUFAAOCAQEA
D7NwMLoCbvFzWEObVh724gCE6XY+xB2NpOrYpu7dlh98kzn7upnY1BMhjvLHiWDMcxIIsar/
XFNI7AePCF4PGpvfudBtB/U5umTxFVYgLLexxsN2cUOP5yd0mJb6k3wU6NOi8mPZNtSfullU
s7avzGHWx787no9d97XrIKKCMV8HwJjtZCt0OKFXVCYWMNMcFqVvBX2pbqgSlSBtZhzTIfi3
MYkEOY9Zgrtsh+2hP22OJuskImNEHqlYbM//OqlCGQz+4sK6Ai/3HMfKFKJ/6Oyf8j48dO12
3nPRMQAy/oBHEITGQQUK0hdDZyglGOzTHGWH2Ae33vrzs+8T9rG8GzCCBxEwggX5oAMCAQIC
BEwfo4cwDQYJKoZIhvcNAQEFBQAwgYAxCzAJBgNVBAYTAlVTMRAwDgYDVQQKEwdFbnRydXN0
MSIwIAYDVQQLExlDZXJ0aWZpY2F0aW9uIEF1dGhvcml0aWVzMTswOQYDVQQDEzJFbnRydXN0
IE1hbmFnZWQgU2VydmljZXMgQ29tbWVyY2lhbCBQdWJsaWMgUm9vdCBDQTAeFw0xMDA3MDcy
MDE0NTRaFw0zMDA2MDcyMDQ0NTRaMHcxCzAJBgNVBAYTAlVTMRAwDgYDVQQKEwdFbnRydXN0
MSIwIAYDVQQLExlDZXJ0aWZpY2F0aW9uIEF1dGhvcml0aWVzMTIwMAYDVQQDEylFbnRydXN0
IEVkdWNhdGlvbiBTaGFyZWQgU2VydmljZSBQcm92aWRlcjCCASIwDQYJKoZIhvcNAQEBBQAD
ggEPADCCAQoCggEBAOtRQhPAzU32kb0lQD4Zbvrz4z1/uMOXoAURJ8//Dm3SQFuuG+lDwyE4
zkk85mtmqJgbGsA2cQOiv7189VBAHxgvOkc322Riwi5TKErPAk/tU9ay2Zne1S4oDeMiHp9K
pgde0OcjKE7fx6PZmB/i0QWqVvm6C20cjFUcjYOs8QH79lh10w0bUuvR8/jk5FJ8Ss2cxDl2
CIB826jCZW2SKsQ1LlRSJIJ9AOfn6fr/m5aBHCEoqAkrI0zK+CT3OTtMTRzoGvyh9Wv2oWVV
OjlpUdD5HtxuFrDmps4Z2ZAE3+KCpX0G183hhEKzBRIDv3eC1Wv8J2mG/s+aNRqcgLmWFQcC
AwEAAaOCA5kwggOVMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/AgEAMDwGA1Ud
IAQ1MDMwDwYNYIZIAYb6a4FIAwoCBDAPBg1ghkgBhvprgUgDCgIFMA8GDWCGSAGG+muBSAMK
AgYwggE/BggrBgEFBQcBAQSCATEwggEtMFUGCCsGAQUFBzAChklodHRwOi8vY29tcHVid2Vi
Lm1hbmFnZWQuZW50cnVzdC5jb20vQUlBL0NlcnRzSXNzdWVkVG9FTVNDb21QdWJSb290Q0Eu
cDdjMIHTBggrBgEFBQcwAoaBxmxkYXA6Ly9jb21wdWJzaGFkLm1hbmFnZWQuZW50cnVzdC5j
b20vb3U9RW50cnVzdCUyME1hbmFnZWQlMjBTZXJ2aWNlcyUyMENvbW1lcmNpYWwlMjBQdWJs
aWMlMjBSb290JTIwQ0Esb3U9Q2VydGlmaWNhdGlvbiUyMEF1dGhvcml0aWVzLG89RW50cnVz
dCxjPVVTP2NBQ2VydGlmaWNhdGU7YmluYXJ5LGNyb3NzQ2VydGlmaWNhdGVQYWlyO2JpbmFy
eTCCAawGA1UdHwSCAaMwggGfMIH+oIH7oIH4hj1odHRwOi8vY29tcHVid2ViLm1hbmFnZWQu
ZW50cnVzdC5jb20vQ1JMcy9FTVNDb21QdWJSb290Q0EuY3JshoG2bGRhcDovL2NvbXB1YnNo
YWQubWFuYWdlZC5lbnRydXN0LmNvbS9jbj1FbnRydXN0JTIwTWFuYWdlZCUyMFNlcnZpY2Vz
JTIwQ29tbWVyY2lhbCUyMFB1YmxpYyUyMFJvb3QlMjBDQSxvdT1DZXJ0aWZpY2F0aW9uJTIw
QXV0aG9yaXRpZXMsbz1FbnRydXN0LGM9VVM/Y2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdDti
aW5hcnkwgZuggZiggZWkgZIwgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQKEwdFbnRydXN0MSIw
IAYDVQQLExlDZXJ0aWZpY2F0aW9uIEF1dGhvcml0aWVzMTswOQYDVQQDEzJFbnRydXN0IE1h
bmFnZWQgU2VydmljZXMgQ29tbWVyY2lhbCBQdWJsaWMgUm9vdCBDQTENMAsGA1UEAxMEQ1JM
MTAfBgNVHSMEGDAWgBTAMkkFZmaDhxlpua6DJQYZiwXXdDAdBgNVHQ4EFgQUIt2i+lhOgz5T
iwGAExY11IEVtn8wDQYJKoZIhvcNAQEFBQADggEBAHQ4kWFG0YwlCojUFLo5/Btbxr51qNZL
52Mf5QVC9O09b7YZE1ZcAUJlYxerhKPV66xQAhro9ch/VUYDKu1/qTAX5OGRH5sq5lBO2Rat
B7tEyEuY3S6SWXCsJcvyi7eUrPov5Ojo0GsMymqNbdU+Uy/e3I58daQx9BzVGIGXg8iAxt+7
cG4NtiXeCOXXfjPemC/OxuzH9k6SEv16ztlnfOFBJVs5jI1iKCtKDSd74K/k3CgvBK8zEvgL
jXzLgWS/pUqIv8jjhAFEu0pfxsXkpn69ORT3pw972+q+A2rg8lilyd9KIzvcpi07orohVeXn
Q+67NIscURgNDDtfFRWrq3cwggfkMIIGzKADAgECAgRMICvCMA0GCSqGSIb3DQEBBQUAMHcx
CzAJBgNVBAYTAlVTMRAwDgYDVQQKEwdFbnRydXN0MSIwIAYDVQQLExlDZXJ0aWZpY2F0aW9u
IEF1dGhvcml0aWVzMTIwMAYDVQQDEylFbnRydXN0IEVkdWNhdGlvbiBTaGFyZWQgU2Vydmlj
ZSBQcm92aWRlcjAeFw0xMzAxMjkxNDU1MzhaFw0xODAxMjkxNTI1MzhaMIGcMQswCQYDVQQG
EwJVUzESMBAGA1UECBMJV2lzY29uc2luMSAwHgYDVQQKExdVbml2ZXJzaXR5IG9mIFdpc2Nv
bnNpbjEQMA4GA1UECxMHTWFkaXNvbjFFMBEGA1UEAxMKUnlhbiBFbmdlbDARBgNVBAUTCjAw
MDAwMDE2NDEwHQYJKoZIhvcNAQkBFhBydGVuZ2VsQHdpc2MuZWR1MIIBIjANBgkqhkiG9w0B
AQEFAAOCAQ8AMIIBCgKCAQEAmWdyht8Y814KC9bCrm8HF5X5rcu0Y2OocEzmo/E0/CJQQUNx
y0FsiT2+N1CnkPz2yC5Ehr13hqpcdxxOQEhRL5I1GfBGQWe9yXxEpmSqCjtsaWnjHSyR45jX
PS8BWa98hAx8+2VIcDOW2Nx5mmgfqWRxboOXt5dwazDaVQKaRpi+I0BwVN2lMnrMbhA8hi0Q
m8f8JAtnKSnOl4UXpZ2yo7B6KHL7SQM7yyZUDj4bullC8wtw798yINAGLbYwkRuTor6hLiTB
+a9y4usH9eVLMaQPiZYSgiROsS9XMvmrgBDCOiSdEOlc3x0/8cmOVU4POYaUJ97EinECjWck
Mg68JQIDAQABo4IEUDCCBEwwDgYDVR0PAQH/BAQDAgWgMCYGA1UdJQQfMB0GCCsGAQUFBwMC
BggrBgEFBQcDBAYHKwYBBQIDBDCCATMGCCsGAQUFBwEBBIIBJTCCASEwUwYIKwYBBQUHMAKG
R2h0dHA6Ly9lZHVjYXRpb253ZWIubWFuYWdlZC5lbnRydXN0LmNvbS9BSUEvQ2VydHNJc3N1
ZWRUb0VNU0VkU1NQQ0EucDdjMIHJBggrBgEFBQcwAoaBvGxkYXA6Ly9lZHVjYXRpb25zaGFk
Lm1hbmFnZWQuZW50cnVzdC5jb20vY249RW50cnVzdCUyMEVkdWNhdGlvbiUyMFNoYXJlZCUy
MFNlcnZpY2UlMjBQcm92aWRlcixvdT1DZXJ0aWZpY2F0aW9uJTIwQXV0aG9yaXRpZXMsbz1F
bnRydXN0LGM9VVM/Y0FDZXJ0aWZpY2F0ZTtiaW5hcnksY3Jvc3NDZXJ0aWZpY2F0ZVBhaXI7
YmluYXJ5MCsGA1UdIAQkMCIwDwYNYIZIAYb6a4FIAwoCBDAPBg1ghkgBhvprgUgDCgIFMFgG
CWCGSAGG+mseAQRLDElUaGUgcHJpdmF0ZSBrZXkgY29ycmVzcG9uZGluZyB0byB0aGlzIGNl
cnRpZmljYXRlIG1heSBoYXZlIGJlZW4gZXhwb3J0ZWQuMBsGA1UdEQQUMBKBEHJ0ZW5nZWxA
d2lzYy5lZHUwggGiBgNVHR8EggGZMIIBlTCB/aCB+qCB94ZGaHR0cDovL2VkdWNhdGlvbndl
Yi5tYW5hZ2VkLmVudHJ1c3QuY29tL0NSTHMvRW50cnVzdEVEVUNBVElPTlNTUENBLmNybIaB
rGxkYXA6Ly9lZHVjYXRpb25zaGFkLm1hbmFnZWQuZW50cnVzdC5jb20vY249RW50cnVzdCUy
MEVkdWNhdGlvbiUyMFNoYXJlZCUyMFNlcnZpY2UlMjBQcm92aWRlcixvdT1DZXJ0aWZpY2F0
aW9uJTIwQXV0aG9yaXRpZXMsbz1FbnRydXN0LGM9VVM/Y2VydGlmaWNhdGVSZXZvY2F0aW9u
TGlzdDtiaW5hcnkwgZKggY+ggYykgYkwgYYxCzAJBgNVBAYTAlVTMRAwDgYDVQQKEwdFbnRy
dXN0MSIwIAYDVQQLExlDZXJ0aWZpY2F0aW9uIEF1dGhvcml0aWVzMTIwMAYDVQQDEylFbnRy
dXN0IEVkdWNhdGlvbiBTaGFyZWQgU2VydmljZSBQcm92aWRlcjENMAsGA1UEAxMEQ1JMMzAr
BgNVHRAEJDAigA8yMDEzMDEyOTE0NTUzOFqBDzIwMTYwNzMwMTkyNTM4WjAfBgNVHSMEGDAW
gBQi3aL6WE6DPlOLAYATFjXUgRW2fzAdBgNVHQ4EFgQUcXvqsasXxl6+gd8rQKt16k/Ax1sw
CQYDVR0TBAIwADAZBgkqhkiG9n0HQQAEDDAKGwRWOC4xAwIEsDANBgkqhkiG9w0BAQUFAAOC
AQEACoBLtFGqaKlgBQnGhIWaVqbQeMmxq1xFbrSBdVhKyeJknHfuAC41oxDDX2GthfLnX25N
ut6ut68XwoRILgU4XzDhfuinGjqtGecErZHD4H0ty5xtwhUJ7RxQoZ8okvp7OcSJOplmFmBw
6KxzVRh6vWGnWuh2QbNOtaq5W8vfrIy9ttO+o2sG20rydb+Y+maGa5yH+gQD5B34ifjiql66
Q6ppICSFCGUIAu3REhic7zsWffRq//Btj1LjM5Q4V7cMTT4eriAOzUyHj4Wzs+PEa7pbNSwX
JiHKl70ArmsyZxtylQvbxKc4Itfi6kUzVmkaqIj1DeOY3VmVsD8IiyBTLTGCA44wggOKAgEB
MH8wdzELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VudHJ1c3QxIjAgBgNVBAsTGUNlcnRpZmlj
YXRpb24gQXV0aG9yaXRpZXMxMjAwBgNVBAMTKUVudHJ1c3QgRWR1Y2F0aW9uIFNoYXJlZCBT
ZXJ2aWNlIFByb3ZpZGVyAgRMICvCMAkGBSsOAwIaBQCgggHkMBgGCSqGSIb3DQEJAzELBgkq
hkiG9w0BBwEwHAYJKoZIhvcNAQkFMQ8XDTE0MDYyMDIxMTkzMVowIwYJKoZIhvcNAQkEMRYE
FEBgKZ/3LhzmzjMuglBUQPDpaFI/MF8GCSqGSIb3DQEJDzFSMFAwCwYJYIZIAWUDBAECMAoG
CCqGSIb3DQMHMA4GCCqGSIb3DQMCAgIAgDANBggqhkiG9w0DAgIBQDAHBgUrDgMCBzANBggq
hkiG9w0DAgIBKDCBjwYJKwYBBAGCNxAEMYGBMH8wdzELMAkGA1UEBhMCVVMxEDAOBgNVBAoT
B0VudHJ1c3QxIjAgBgNVBAsTGUNlcnRpZmljYXRpb24gQXV0aG9yaXRpZXMxMjAwBgNVBAMT
KUVudHJ1c3QgRWR1Y2F0aW9uIFNoYXJlZCBTZXJ2aWNlIFByb3ZpZGVyAgRMICvCMIGRBgsq
hkiG9w0BCRACCzGBgaB/MHcxCzAJBgNVBAYTAlVTMRAwDgYDVQQKEwdFbnRydXN0MSIwIAYD
VQQLExlDZXJ0aWZpY2F0aW9uIEF1dGhvcml0aWVzMTIwMAYDVQQDEylFbnRydXN0IEVkdWNh
dGlvbiBTaGFyZWQgU2VydmljZSBQcm92aWRlcgIETCArwjANBgkqhkiG9w0BAQEFAASCAQCR
LQcubrNkpHxuG5ybKasTrYSoDPRZM/mKkogKMzIOkG/LYUIY6sBBfeqdQmBdEj3ZGOFa7WA+
99ZJFjOk4A+n0D3CBdeB//iu1yr7/RU2rbcAJxZjNWAEzGNGX54QFXikm9kYJujx6GRClmRJ
RgvGtFr6aEbSBdZj0eSaS0OJX/k7HeojIjimPF7CoEdFKtqcyGQLl2Tv5XDIKuJr7YMVCN23
kpEUUcoU6Nz0op58qkKoxwTJ+Mc1sDFP2uZtiVJmbghE/CuFZuDvS+tkSsnRGdcjpx0gjgL1
zlLOPctZu8fUqHa1rYaBGImhI+Ldc/nkWk1nytHLFXSUxSZAQP6iAAAAAAAA
--------------ms000002060804070407070702--
|