<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body text="#000000" bgcolor="#FFFFFF">
<div class="markdown-here-wrapper" data-md-url="Thunderbird"
style="font-family: Carlito,Calibri,DejaVu Sans,Trebuchet
MS,Verdana,sans-serif; font-size: 10pt;">
<p style="font-family: inherit; font-size: inherit;margin: 0px 0px
0.75em ! important;">On 2017-10-01 07:55 PM, Guru Devanla wrote:</p>
<div class="markdown-here-exclude">
<blockquote type="cite"
cite="mid:CAAq9Y12Zu2CGthAHt=JgzX9x0PtNOuEF73RdDpOtFo=7pdDASA@mail.gmail.com">Having
to not have something which I can quickly start off on
troubles me and makes me wonder if the reason is my lack of
understanding or just the pain of using static typing.</blockquote>
</div>
<p style="font-family: inherit; font-size: inherit;margin: 0px 0px
0.75em ! important;">Something, somewhere has to keep track of
the type of each column, and since the data doesn’t have that
itself you have to store it somewhere else. That could be in
another data file of some kind which would be loaded at runtime,
but then you would lose the benefit of static type checking by
the compiler. So it’s better to have it in source code, even if
that’s generated by TH or some other process.</p>
<p style="font-family: inherit; font-size: inherit;margin: 0px 0px
0.75em ! important;">I recommend taking a look at the Cassava
library. You can do some pretty neat things with it, including
defining your own mapping from rows to records. In particular,
if you need only a small subset of the 100 columns, you can
provide a (de)serializer that looks at only the columns it
needs. The library reads the row into a vector of Text, and your
serialization code works with just the elements it needs. You
could even have different record types (and associated
serializers) for different tasks, all working off the same input
record, since the serialization methods are from a typeclass and
each record type can be a different instance of the class.</p>
<p style="font-family: inherit; font-size: inherit;margin: 0px 0px
0.75em ! important;">Cassava supports Applicative, which makes
for some very succinct code, and it can make use of a header
record at the start of the data. Here’s an example:</p>
<pre style="font-family: Consolas,Inconsolata,Andale Mono,DejaVu Sans Mono,Courier,monospace; font-size: 10pt;font-size: 1em; line-height: 1.2em;margin: 1.2em 0px;"><code class="hljs language-Haskell" style="font-family: Consolas,Inconsolata,Andale Mono,DejaVu Sans Mono,Courier,monospace; font-size: 10pt;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;white-space: pre; overflow: auto; border-radius: 3px; border: 1px solid rgb(0, 0, 0); background-color: rgb(68, 68, 68); color: rgb(0, 204, 0); padding: 0.5em 0.7em; display: block ! important;display: block; overflow-x: auto; padding: 0.5em; background: rgb(35, 36, 31) none repeat scroll 0% 0%; -moz-text-size-adjust: none;color: rgb(248, 248, 242);"><span class="hljs-typedef"><span class="hljs-keyword" style="color: rgb(249, 38, 114);">data</span> <span class="hljs-type" style="color: rgb(230, 219, 116);">Account</span> = <span class="hljs-type" style="color: rgb(230, 219, 116);">Business</span> | <span class="hljs-type" style="color: rgb(230, 219, 116);">Visa</span> | <span class="hljs-type" style="color: rgb(230, 219, 116);">Personal</span> | <span class="hljs-type" style="color: rgb(230, 219, 116);">Cash</span> | <span class="hljs-type" style="color: rgb(230, 219, 116);">None</span></span>
<span class="hljs-keyword" style="color: rgb(249, 38, 114);">deriving</span> (<span class="hljs-type" style="color: rgb(230, 219, 116);">Eq</span>, <span class="hljs-type" style="color: rgb(230, 219, 116);">Ord</span>, <span class="hljs-type" style="color: rgb(230, 219, 116);">Show</span>, <span class="hljs-type" style="color: rgb(230, 219, 116);">Read</span>, <span class="hljs-type" style="color: rgb(230, 219, 116);">Enum</span>, <span class="hljs-type" style="color: rgb(230, 219, 116);">Bounded</span>)
<span class="hljs-class">
<span class="hljs-keyword" style="color: rgb(249, 38, 114);color: rgb(102, 217, 239);">instance</span> <span class="hljs-type" style="color: rgb(230, 219, 116);">FromField</span> <span class="hljs-type" style="color: rgb(230, 219, 116);">Account</span> <span class="hljs-keyword" style="color: rgb(249, 38, 114);">where</span></span>
parseField f
| f == <span class="hljs-string" style="color: rgb(230, 219, 116);">"B"</span> = pure <span class="hljs-type" style="color: rgb(230, 219, 116);">Business</span>
| f == <span class="hljs-string" style="color: rgb(230, 219, 116);">"V"</span> = pure <span class="hljs-type" style="color: rgb(230, 219, 116);">Visa</span>
| f == <span class="hljs-string" style="color: rgb(230, 219, 116);">"P"</span> = pure <span class="hljs-type" style="color: rgb(230, 219, 116);">Personal</span>
| f == <span class="hljs-string" style="color: rgb(230, 219, 116);">"C"</span> = pure <span class="hljs-type" style="color: rgb(230, 219, 116);">Cash</span>
| f == <span class="hljs-string" style="color: rgb(230, 219, 116);">"CC"</span> = pure <span class="hljs-type" style="color: rgb(230, 219, 116);">Visa</span>
| f == <span class="hljs-string" style="color: rgb(230, 219, 116);">""</span> = pure <span class="hljs-type" style="color: rgb(230, 219, 116);">None</span>
| otherwise = fail $ <span class="hljs-string" style="color: rgb(230, 219, 116);">"Invalid account type: \""</span> ++ <span class="hljs-type" style="color: rgb(230, 219, 116);">B</span>.unpack f ++ <span class="hljs-string" style="color: rgb(230, 219, 116);">"\""</span>
<span class="hljs-class">
<span class="hljs-keyword" style="color: rgb(249, 38, 114);color: rgb(102, 217, 239);">instance</span> <span class="hljs-type" style="color: rgb(230, 219, 116);">ToField</span> <span class="hljs-type" style="color: rgb(230, 219, 116);">Account</span> <span class="hljs-keyword" style="color: rgb(249, 38, 114);">where</span></span>
toField <span class="hljs-type" style="color: rgb(230, 219, 116);">Business</span> = <span class="hljs-string" style="color: rgb(230, 219, 116);">"B"</span>
toField <span class="hljs-type" style="color: rgb(230, 219, 116);">Visa</span> = <span class="hljs-string" style="color: rgb(230, 219, 116);">"V"</span>
toField <span class="hljs-type" style="color: rgb(230, 219, 116);">Personal</span> = <span class="hljs-string" style="color: rgb(230, 219, 116);">"P"</span>
toField <span class="hljs-type" style="color: rgb(230, 219, 116);">Cash</span> = <span class="hljs-string" style="color: rgb(230, 219, 116);">"C"</span>
toField <span class="hljs-type" style="color: rgb(230, 219, 116);">None</span> = <span class="hljs-string" style="color: rgb(230, 219, 116);">""</span>
<span class="hljs-typedef"><span class="hljs-keyword" style="color: rgb(249, 38, 114);">type</span> <span class="hljs-type" style="color: rgb(230, 219, 116);">Money</span> = <span class="hljs-type" style="color: rgb(230, 219, 116);">Centi</span></span>
<span class="hljs-typedef"><span class="hljs-keyword" style="color: rgb(249, 38, 114);">data</span> <span class="hljs-type" style="color: rgb(230, 219, 116);">Transaction</span> = <span class="hljs-type" style="color: rgb(230, 219, 116);">Transaction</span></span>
{ date :: <span class="hljs-type" style="color: rgb(230, 219, 116);">Day</span>
, description :: <span class="hljs-type" style="color: rgb(230, 219, 116);">Text</span>
, category :: <span class="hljs-type" style="color: rgb(230, 219, 116);">Text</span>
, account :: <span class="hljs-type" style="color: rgb(230, 219, 116);">Account</span>
, debit :: <span class="hljs-type" style="color: rgb(230, 219, 116);">Maybe</span> <span class="hljs-type" style="color: rgb(230, 219, 116);">Money</span>
, credit :: <span class="hljs-type" style="color: rgb(230, 219, 116);">Maybe</span> <span class="hljs-type" style="color: rgb(230, 219, 116);">Money</span>
, business :: <span class="hljs-type" style="color: rgb(230, 219, 116);">Money</span>
, visa :: <span class="hljs-type" style="color: rgb(230, 219, 116);">Money</span>
, personal :: <span class="hljs-type" style="color: rgb(230, 219, 116);">Money</span>
, cash :: <span class="hljs-type" style="color: rgb(230, 219, 116);">Money</span> }
<span class="hljs-keyword" style="color: rgb(249, 38, 114);">deriving</span> (<span class="hljs-type" style="color: rgb(230, 219, 116);">Eq</span>, <span class="hljs-type" style="color: rgb(230, 219, 116);">Ord</span>, <span class="hljs-type" style="color: rgb(230, 219, 116);">Show</span>, <span class="hljs-type" style="color: rgb(230, 219, 116);">Read</span>)
<span class="hljs-class">
<span class="hljs-keyword" style="color: rgb(249, 38, 114);color: rgb(102, 217, 239);">instance</span> <span class="hljs-type" style="color: rgb(230, 219, 116);">FromNamedRecord</span> <span class="hljs-type" style="color: rgb(230, 219, 116);">Transaction</span> <span class="hljs-keyword" style="color: rgb(249, 38, 114);">where</span></span>
parseNamedRecord r = <span class="hljs-type" style="color: rgb(230, 219, 116);">Transaction</span> <$>
r .: <span class="hljs-string" style="color: rgb(230, 219, 116);">"Date"</span> <*>
r .: <span class="hljs-string" style="color: rgb(230, 219, 116);">"Description"</span> <*>
r .: <span class="hljs-string" style="color: rgb(230, 219, 116);">"Category"</span> <*>
r .: <span class="hljs-string" style="color: rgb(230, 219, 116);">"Account"</span> <*>
r .: <span class="hljs-string" style="color: rgb(230, 219, 116);">"Debit"</span> <*>
r .: <span class="hljs-string" style="color: rgb(230, 219, 116);">"Credit"</span> <*>
r .: <span class="hljs-string" style="color: rgb(230, 219, 116);">"Business"</span> <*>
r .: <span class="hljs-string" style="color: rgb(230, 219, 116);">"Visa"</span> <*>
r .: <span class="hljs-string" style="color: rgb(230, 219, 116);">"Personal"</span> <*>
r .: <span class="hljs-string" style="color: rgb(230, 219, 116);">"Cash"</span>
<span class="hljs-class">
<span class="hljs-keyword" style="color: rgb(249, 38, 114);color: rgb(102, 217, 239);">instance</span> <span class="hljs-type" style="color: rgb(230, 219, 116);">ToNamedRecord</span> <span class="hljs-type" style="color: rgb(230, 219, 116);">Transaction</span> <span class="hljs-keyword" style="color: rgb(249, 38, 114);">where</span></span>
toNamedRecord r = namedRecord [
<span class="hljs-string" style="color: rgb(230, 219, 116);">"Date"</span> .= date r,
<span class="hljs-string" style="color: rgb(230, 219, 116);">"Description"</span> .= description r,
<span class="hljs-string" style="color: rgb(230, 219, 116);">"Category"</span> .= category r,
<span class="hljs-string" style="color: rgb(230, 219, 116);">"Account"</span> .= account r,
<span class="hljs-string" style="color: rgb(230, 219, 116);">"Debit"</span> .= debit r,
<span class="hljs-string" style="color: rgb(230, 219, 116);">"Credit"</span> .= credit r,
<span class="hljs-string" style="color: rgb(230, 219, 116);">"Business"</span> .= business r,
<span class="hljs-string" style="color: rgb(230, 219, 116);">"Visa"</span> .= visa r,
<span class="hljs-string" style="color: rgb(230, 219, 116);">"Personal"</span> .= personal r,
<span class="hljs-string" style="color: rgb(230, 219, 116);">"Cash"</span> .= cash r]
</code></pre>
<p style="font-family: inherit; font-size: inherit;margin: 0px 0px
0.75em ! important;">Note that the code doesn’t assume fixed
positions for the different columns, nor a total number of
columns in a row, because it indirects through the column
headers. There could be 1000 columns and the code wouldn’t care.</p>
<div
title="MDH:T24gMjAxNy0xMC0wMSAwNzo1NSBQTSwgR3VydSBEZXZhbmxhIHdyb3RlOjxicj48YmxvY2txdW90ZSB0eXBlPSJjaXRlIiBjaXRlPSJtaWQ6Q0FBcTlZMTJadTJDR3RoQUh0PUpnelg5eDBQdE5PdUVGNzNSZERwT3RGbz03cGREQVNBQG1haWwuZ21haWwuY29tIj5IYXZpbmcgdG8gbm90IGhhdmUgc29t
ZXRoaW5nIHdoaWNoIEkgY2FuIHF1aWNrbHkgc3RhcnQgb2ZmIG9uIHRyb3VibGVzIAptZSBhbmQg
bWFrZXMgbWUgd29uZGVyIGlmIHRoZSByZWFzb24gaXMgbXkgbGFjayBvZiB1bmRlcnN0YW5kaW5n
IG9yIGp1c3QKIHRoZSBwYWluIG9mIHVzaW5nIHN0YXRpYyB0eXBpbmcuPC9ibG9ja3F1b3RlPjxi
cj5Tb21ldGhpbmcsIHNvbWV3aGVyZSBoYXMgdG8ga2VlcCB0cmFjayBvZiB0aGUgdHlwZSBvZiBl
YWNoIGNvbHVtbiwgYW5kIHNpbmNlIHRoZSBkYXRhIGRvZXNuJ3QgaGF2ZSB0aGF0IGl0c2VsZiB5
b3UgaGF2ZSB0byBzdG9yZSBpdCBzb21ld2hlcmUgZWxzZS4gVGhhdCBjb3VsZCBiZSBpbiBhbm90
aGVyIGRhdGEgZmlsZSBvZiBzb21lIGtpbmQgd2hpY2ggd291bGQgYmUgbG9hZGVkIGF0IHJ1bnRp
bWUsIGJ1dCB0aGVuIHlvdSB3b3VsZCBsb3NlIHRoZSBiZW5lZml0IG9mIHN0YXRpYyB0eXBlIGNo
ZWNraW5nIGJ5IHRoZSBjb21waWxlci4gU28gaXQncyBiZXR0ZXIgdG8gaGF2ZSBpdCBpbiBzb3Vy
Y2UgY29kZSwgZXZlbiBpZiB0aGF0J3MgZ2VuZXJhdGVkIGJ5IFRIIG9yIHNvbWUgb3RoZXIgcHJv
Y2Vzcy48YnI+PGJyPkkgcmVjb21tZW5kIHRha2luZyBhIGxvb2sgYXQgdGhlIENhc3NhdmEgbGli
cmFyeS4gWW91IGNhbiBkbyBzb21lIHByZXR0eSBuZWF0IHRoaW5ncyB3aXRoIGl0LCBpbmNsdWRp
bmcgZGVmaW5pbmcgeW91ciBvd24gbWFwcGluZyBmcm9tIHJvd3MgdG8gcmVjb3Jkcy4gSW4gcGFy
dGljdWxhciwgaWYgeW91IG5lZWQgb25seSBhIHNtYWxsIHN1YnNldCBvZiB0aGUgMTAwIGNvbHVt
bnMsIHlvdSBjYW4gcHJvdmlkZSBhIChkZSlzZXJpYWxpemVyIHRoYXQgbG9va3MgYXQgb25seSB0
aGUgY29sdW1ucyBpdCBuZWVkcy4gVGhlIGxpYnJhcnkgcmVhZHMgdGhlIHJvdyBpbnRvIGEgdmVj
dG9yIG9mIFRleHQsIGFuZCB5b3VyIHNlcmlhbGl6YXRpb24gY29kZSB3b3JrcyB3aXRoIGp1c3Qg
dGhlIGVsZW1lbnRzIGl0IG5lZWRzLiBZb3UgY291bGQgZXZlbiBoYXZlIGRpZmZlcmVudCByZWNv
cmQgdHlwZXMgKGFuZCBhc3NvY2lhdGVkIHNlcmlhbGl6ZXJzKSBmb3IgZGlmZmVyZW50IHRhc2tz
LCBhbGwgd29ya2luZyBvZmYgdGhlIHNhbWUgaW5wdXQgcmVjb3JkLCBzaW5jZSB0aGUgc2VyaWFs
aXphdGlvbiBtZXRob2RzIGFyZSBmcm9tIGEgdHlwZWNsYXNzIGFuZCBlYWNoIHJlY29yZCB0eXBl
IGNhbiBiZSBhIGRpZmZlcmVudCBpbnN0YW5jZSBvZiB0aGUgY2xhc3MuPGJyPjxicj5DYXNzYXZh
IHN1cHBvcnRzIEFwcGxpY2F0aXZlLCB3aGljaCBtYWtlcyBmb3Igc29tZSB2ZXJ5IHN1Y2NpbmN0
IGNvZGUsIGFuZCBpdCBjYW4gbWFrZSB1c2Ugb2YgYSBoZWFkZXIgcmVjb3JkIGF0IHRoZSBzdGFy
dCBvZiB0aGUgZGF0YS4gSGVyZSdzIGFuIGV4YW1wbGU6PGJyPjxicj5gYGBIYXNrZWxsPGJyPmRh
dGEgQWNjb3VudCA9IEJ1c2luZXNzIHwgVmlzYSB8IFBlcnNvbmFsIHwgQ2FzaCB8IE5vbmU8YnI+
wqDCoMKgIGRlcml2aW5nIChFcSwgT3JkLCBTaG93LCBSZWFkLCBFbnVtLCBCb3VuZGVkKTxicj48
YnI+aW5zdGFuY2UgRnJvbUZpZWxkIEFjY291bnQgd2hlcmU8YnI+wqDCoMKgIHBhcnNlRmllbGQg
Zjxicj7CoMKgwqDCoMKgwqDCoCB8IGYgPT0gIkIiwqAgPSBwdXJlIEJ1c2luZXNzPGJyPsKgwqDC
oMKgwqDCoMKgIHwgZiA9PSAiViLCoCA9IHB1cmUgVmlzYTxicj7CoMKgwqDCoMKgwqDCoCB8IGYg
PT0gIlAiwqAgPSBwdXJlIFBlcnNvbmFsPGJyPsKgwqDCoMKgwqDCoMKgIHwgZiA9PSAiQyLCoCA9
IHB1cmUgQ2FzaDxicj7CoMKgwqDCoMKgwqDCoCB8IGYgPT0gIkNDIiA9IHB1cmUgVmlzYTxicj7C
oMKgwqDCoMKgwqDCoCB8IGYgPT0gIiLCoMKgID0gcHVyZSBOb25lPGJyPsKgwqDCoMKgwqDCoMKg
IHwgb3RoZXJ3aXNlID0gZmFpbCAkICJJbnZhbGlkIGFjY291bnQgdHlwZTogXCIiICsrIEIudW5w
YWNrIGYgKysgIlwiIjxicj48YnI+aW5zdGFuY2UgVG9GaWVsZCBBY2NvdW50IHdoZXJlPGJyPsKg
wqDCoCB0b0ZpZWxkIEJ1c2luZXNzwqAgPSAiQiI8YnI+wqDCoMKgIHRvRmllbGQgVmlzYcKgwqDC
oMKgwqAgPSAiViI8YnI+wqDCoMKgIHRvRmllbGQgUGVyc29uYWzCoCA9ICJQIjxicj7CoMKgwqAg
dG9GaWVsZCBDYXNowqDCoMKgwqDCoCA9ICJDIjxicj7CoMKgwqAgdG9GaWVsZCBOb25lwqDCoMKg
wqDCoCA9ICIiPGJyPjxicj50eXBlIE1vbmV5ID0gQ2VudGk8YnI+PGJyPmRhdGEgVHJhbnNhY3Rp
b24gPSBUcmFuc2FjdGlvbjxicj7CoMKgwqAgeyBkYXRlIDo6IERheTxicj7CoMKgwqAgLCBkZXNj
cmlwdGlvbiA6OiBUZXh0PGJyPsKgwqDCoCAsIGNhdGVnb3J5IDo6IFRleHQ8YnI+wqDCoMKgICwg
YWNjb3VudCA6OiBBY2NvdW50PGJyPsKgwqDCoCAsIGRlYml0IDo6IE1heWJlIE1vbmV5PGJyPsKg
wqDCoCAsIGNyZWRpdCA6OiBNYXliZSBNb25leTxicj7CoMKgwqAgLCBidXNpbmVzcyA6OiBNb25l
eTxicj7CoMKgwqAgLCB2aXNhIDo6IE1vbmV5PGJyPsKgwqDCoCAsIHBlcnNvbmFsIDo6IE1vbmV5
PGJyPsKgwqDCoCAsIGNhc2ggOjogTW9uZXkgfTxicj7CoMKgwqAgZGVyaXZpbmcgKEVxLCBPcmQs
IFNob3csIFJlYWQpPGJyPjxicj5pbnN0YW5jZSBGcm9tTmFtZWRSZWNvcmQgVHJhbnNhY3Rpb24g
d2hlcmU8YnI+wqDCoMKgIHBhcnNlTmFtZWRSZWNvcmQgciA9IFRyYW5zYWN0aW9uICZsdDskJmd0
Ozxicj7CoMKgwqDCoMKgwqDCoCByIC46ICJEYXRlIiAmbHQ7KiZndDs8YnI+wqDCoMKgwqDCoMKg
wqAgciAuOiAiRGVzY3JpcHRpb24iICZsdDsqJmd0Ozxicj7CoMKgwqDCoMKgwqDCoCByIC46ICJD
YXRlZ29yeSIgJmx0OyomZ3Q7PGJyPsKgwqDCoMKgwqDCoMKgIHIgLjogIkFjY291bnQiICZsdDsq
Jmd0Ozxicj7CoMKgwqDCoMKgwqDCoCByIC46ICJEZWJpdCIgJmx0OyomZ3Q7PGJyPsKgwqDCoMKg
wqDCoMKgIHIgLjogIkNyZWRpdCIgJmx0OyomZ3Q7PGJyPsKgwqDCoMKgwqDCoMKgIHIgLjogIkJ1
c2luZXNzIiAmbHQ7KiZndDs8YnI+wqDCoMKgwqDCoMKgwqAgciAuOiAiVmlzYSIgJmx0OyomZ3Q7
PGJyPsKgwqDCoMKgwqDCoMKgIHIgLjogIlBlcnNvbmFsIiAmbHQ7KiZndDs8YnI+wqDCoMKgwqDC
oMKgwqAgciAuOiAiQ2FzaCI8YnI+PGJyPmluc3RhbmNlIFRvTmFtZWRSZWNvcmQgVHJhbnNhY3Rp
b24gd2hlcmU8YnI+wqDCoMKgIHRvTmFtZWRSZWNvcmQgciA9IG5hbWVkUmVjb3JkIFs8YnI+wqDC
oMKgwqDCoMKgwqAgIkRhdGUiIC49IGRhdGUgciw8YnI+wqDCoMKgwqDCoMKgwqAgIkRlc2NyaXB0
aW9uIiAuPSBkZXNjcmlwdGlvbiByLDxicj7CoMKgwqDCoMKgwqDCoCAiQ2F0ZWdvcnkiIC49IGNh
dGVnb3J5IHIsPGJyPsKgwqDCoMKgwqDCoMKgICJBY2NvdW50IiAuPSBhY2NvdW50IHIsPGJyPsKg
wqDCoMKgwqDCoMKgICJEZWJpdCIgLj0gZGViaXQgciw8YnI+wqDCoMKgwqDCoMKgwqAgIkNyZWRp
dCIgLj0gY3JlZGl0IHIsPGJyPsKgwqDCoMKgwqDCoMKgICJCdXNpbmVzcyIgLj0gYnVzaW5lc3Mg
ciw8YnI+wqDCoMKgwqDCoMKgwqAgIlZpc2EiIC49IHZpc2Egciw8YnI+wqDCoMKgwqDCoMKgwqAg
IlBlcnNvbmFsIiAuPSBwZXJzb25hbCByLDxicj7CoMKgwqDCoMKgwqDCoCAiQ2FzaCIgLj0gY2Fz
aCByXTxicj5gYGA8YnI+PGJyPk5vdGUgdGhhdCB0aGUgY29kZSBkb2Vzbid0IGFzc3VtZSBmaXhl
ZCBwb3NpdGlvbnMgZm9yIHRoZSBkaWZmZXJlbnQgY29sdW1ucywgbm9yIGEgdG90YWwgbnVtYmVy
IG9mIGNvbHVtbnMgaW4gYSByb3csIGJlY2F1c2UgaXQgaW5kaXJlY3RzIHRocm91Z2ggdGhlIGNv
bHVtbiBoZWFkZXJzLiBUaGVyZSBjb3VsZCBiZSAxMDAwIGNvbHVtbnMgYW5kIHRoZSBjb2RlIHdv
dWxkbid0IGNhcmUuPGJyPg=="
style="height:0;width:0;max-height:0;max-width:0;overflow:hidden;font-size:0em;padding:0;margin:0;"></div>
</div>
</body>
</html>