UTF8 IMAP URLs

Chris Newman (Chris.Newman@innosoft.com)
Wed, 30 Apr 1997 09:16:45 -0700 (PDT)


Date: Wed, 30 Apr 1997 09:16:45 -0700 (PDT)
From: Chris Newman <Chris.Newman@innosoft.com>
Subject: UTF8 IMAP URLs
To: IMAP Discusson List <imap@cac.washington.edu>
Cc: IETF URI list <uri@bunyip.com>
Message-id: <Pine.SOL.3.95.970430084509.16628B-300000@eleanor.innosoft.com>

  This message is in MIME format.  The first part should be readable text,
  while the remaining parts are likely unreadable without MIME-aware tools.
  Send mail to mime@docserver.cac.washington.edu for more info.

---559023410-1804928587-862417005=:16628
Content-Type: TEXT/PLAIN; charset=US-ASCII

So I bit the bullet and wrote _experimental_ code to convert between an
IMAP mailbox (encoded with modified UTF-7) and a hex-encoded UTF-8 URL
path.  It's actually considerably more complex than I thought it would be. 
Of course this code also does proper quoting of unsafe URL characters,
deals with UTF-16 encoding correctly (thus supporting up to 2 million
characters), and correctly interprets 8-bit URLs as UTF-8 (mapping them
back to IMAP's modified UTF-7). 

Interesting facts I noticed in the process:

* UTF-7 can be a denser format than UTF-8.  The bound for worst case
conversion has UTF-8 taking up 9/8 the space of a UTF-7 string.

* Hex encoded UTF-8 is really gross.  It has a worst case bound of 3.375
times the input UTF-7 string.  (I'll note this may be a feature since it
will give implementors a lot of incentive to support 8-bit UTF-8 strings).

* Hex encoded UTF-8 is probably the only way to add multilingual support
to any URLs that's not completely hostle to the URL installed base.

* Since it's necessary to quote a literal "&" as "&-" when converting to
modified-UTF-7, the URLtoMailbox() routine will not work with a
modified UTF-7 URL as input.

---

So, given that public domain code now exists to do it, would there be
any strong objections to replacing the current weasel wording in the IMAP
URL draft with a rule that IMAP URLs MUST use UTF-8?



---559023410-1804928587-862417005=:16628
Content-Type: TEXT/PLAIN; charset=US-ASCII; name="imapurl.c"
Content-Transfer-Encoding: BASE64
Content-ID: <Pine.SOL.3.95.970430091645.16628C@eleanor.innosoft.com>
Content-Description: 

LyogaW1hcHVybC5jIC0tIElNQVAgbW9kaWZpZWQgVVRGLTcgdG8gVVJMIFVU
Ri04IGNvbnZlcnNpb24gdXRpbGl0aWVzDQogKi8NCg0KI2luY2x1ZGUgPHN0
ZGlvLmg+DQojaW5jbHVkZSA8c3RkbGliLmg+DQojaW5jbHVkZSA8c3RyaW5n
Lmg+DQoNCi8qIGhleGFkZWNpbWFsIGxvb2t1cCB0YWJsZSAqLw0Kc3RhdGlj
IGNoYXIgaGV4W10gPSAiMDEyMzQ1Njc4OUFCQ0RFRiI7DQoNCi8qIFVSTCB1
bnNhZmUgcHJpbnRhYmxlIGNoYXJhY3RlcnMgKi8NCnN0YXRpYyBjaGFyIHVy
bHVuc2FmZVtdID0gIiBcIiMlJis6Ozw9Pj9AW1xcXV5ge3x9IjsNCg0KLyog
VVRGNyBtb2RpZmllZCBiYXNlNjQgYWxwaGFiZXQgKi8NCnN0YXRpYyBjaGFy
IGJhc2U2NGNoYXJzW10gPQ0KICAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldY
WVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLCI7DQoj
ZGVmaW5lIFVOREVGSU5FRCA2NA0KDQovKiBVVEYxNiBkZWZpbml0aW9ucyAq
Lw0KI2RlZmluZSBVVEYxNk1BU0sJMHgwM0ZGVUwNCiNkZWZpbmUgVVRGMTZT
SElGVAkxMA0KI2RlZmluZSBVVEYxNkhJR0hTVEFSVAkweEQ4MDBVTA0KI2Rl
ZmluZSBVVEYxNkhJR0hFTkQJMHhEQkZGVUwNCiNkZWZpbmUgVVRGMTZMT1NU
QVJUCTB4REMwMFVMDQojZGVmaW5lIFVURjE2TE9FTkQJMHhERkZGVUwNCg0K
LyogQ29udmVydCBhbiBJTUFQIG1haWxib3ggdG8gYSBVUkwgcGF0aA0KICog
IGRzdCBuZWVkcyB0byBoYXZlIHJvdWdobHkgNCB0aW1lcyB0aGUgc3RvcmFn
ZSBzcGFjZSBvZiBzcmMNCiAqICAgIEhleCBlbmNvZGluZyBjYW4gdHJpcGxl
IHRoZSBzaXplIG9mIHRoZSBpbnB1dA0KICogICAgVVRGLTcgY2FuIGJlIHNs
aWdodGx5IGRlbnNlciB0aGFuIFVURi04DQogKiAgICAgKHdvcnN0IGNhc2U6
IDggb2N0ZXRzIFVURi03IGJlY29tZXMgOSBvY3RldHMgVVRGLTgpDQogKi8N
CnZvaWQgTWFpbGJveFRvVVJMKGNoYXIgKmRzdCwgY2hhciAqc3JjKQ0Kew0K
ICAgIHVuc2lnbmVkIGNoYXIgYywgaSwgYml0Y291bnQ7DQogICAgdW5zaWdu
ZWQgbG9uZyB1Y3M0LCB1dGYxNiwgYml0YnVmOw0KICAgIHVuc2lnbmVkIGNo
YXIgYmFzZTY0WzI1Nl0sIHV0ZjhbNl07DQoNCiAgICAvKiBpbml0aWFsaXpl
IG1vZGlmaWVkIGJhc2U2NCBkZWNvZGluZyB0YWJsZSAqLw0KICAgIG1lbXNl
dChiYXNlNjQsIFVOREVGSU5FRCwgc2l6ZW9mIChiYXNlNjQpKTsNCiAgICBm
b3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChiYXNlNjRjaGFycyk7ICsraSkgew0K
CWJhc2U2NFtiYXNlNjRjaGFyc1tpXV0gPSBpOw0KICAgIH0NCiAgICANCiAg
ICAvKiBsb29wIHVudGlsIGVuZCBvZiBzdHJpbmcgKi8NCiAgICB3aGlsZSAo
KnNyYyAhPSAnXDAnKSB7DQoJYyA9ICpzcmMrKzsNCgkvKiBkZWFsIHdpdGgg
bGl0ZXJhbCBjaGFyYWN0ZXJzIGFuZCAmLSAqLw0KCWlmIChjICE9ICcmJyB8
fCAqc3JjID09ICctJykgew0KCSAgICBpZiAoYyA8ICcgJyB8fCBjID4gJ34n
IHx8IHN0cmNocih1cmx1bnNhZmUsIGMpICE9IE5VTEwpIHsNCgkJLyogaGV4
IGVuY29kZSBpZiBuZWNlc3NhcnkgKi8NCgkJZHN0WzBdID0gJyUnOw0KCQlk
c3RbMV0gPSBoZXhbYyA+PiA0XTsNCgkJZHN0WzJdID0gaGV4W2MgJiAweDBm
XTsNCgkJZHN0ICs9IDM7DQoJICAgIH0gZWxzZSB7DQoJCS8qIGVuY29kZSBs
aXRlcmFsbHkgKi8NCgkJKmRzdCsrID0gYzsNCgkgICAgfQ0KCSAgICAvKiBz
a2lwIG92ZXIgdGhlICctJyBpZiB0aGlzIGlzIGFuICYtIHNlcXVlbmNlICov
DQoJICAgIGlmIChjID09ICcmJykgKytzcmM7DQoJfSBlbHNlIHsNCgkgICAg
LyogY29udmVydCBtb2RpZmllZCBVVEYtNyAtPiBVVEYtMTYgLT4gVUNTLTQg
LT4gVVRGLTggLT4gSEVYICovDQoJICAgIGJpdGJ1ZiA9IDA7DQoJICAgIGJp
dGNvdW50ID0gMDsNCgkgICAgdWNzNCA9IDA7DQoJICAgIHdoaWxlICgoYyA9
IGJhc2U2NFsodW5zaWduZWQgY2hhcikgKnNyY10pICE9IFVOREVGSU5FRCkg
ew0KCQkrK3NyYzsNCgkJYml0YnVmID0gKGJpdGJ1ZiA8PCA2KSB8IGM7DQoJ
CWJpdGNvdW50ICs9IDY7DQoJCS8qIGVub3VnaCBiaXRzIGZvciBhIFVURi0x
NiBjaGFyYWN0ZXI/ICovDQoJCWlmIChiaXRjb3VudCA+PSAxNikgew0KCQkg
ICAgYml0Y291bnQgLT0gMTY7DQoJCSAgICB1dGYxNiA9IChiaXRjb3VudCA/
IGJpdGJ1ZiA+PiBiaXRjb3VudCA6IGJpdGJ1ZikgJiAweGZmZmY7DQoJCSAg
ICAvKiBjb252ZXJ0IFVURjE2IHRvIFVDUzQgKi8NCgkJICAgIGlmICh1dGYx
NiA+PSBVVEYxNkhJR0hTVEFSVCAmJiB1dGYxNiA8PSBVVEYxNkhJR0hFTkQp
IHsNCgkJCXVjczQgPSAodXRmMTYgJiBVVEYxNk1BU0spIDw8IFVURjE2U0hJ
RlQ7DQoJCQljb250aW51ZTsNCgkJICAgIH0gZWxzZSBpZiAodXRmMTYgPj0g
VVRGMTZMT1NUQVJUICYmIHV0ZjE2IDw9IFVURjE2TE9FTkQpIHsNCgkJCXVj
czQgfD0gdXRmMTYgJiBVVEYxNk1BU0s7DQoJCSAgICB9IGVsc2Ugew0KCQkJ
dWNzNCA9IHV0ZjE2Ow0KCQkgICAgfQ0KCQkgICAgLyogY29udmVydCBVVEYt
MTYgcmFuZ2Ugb2YgVUNTNCB0byBVVEYtOCAqLw0KCQkgICAgaWYgKHVjczQg
PD0gMHg3ZlVMKSB7DQoJCQl1dGY4WzBdID0gdWNzNDsNCgkJCWkgPSAxOw0K
CQkgICAgfSBlbHNlIGlmICh1Y3M0IDw9IDB4N2ZmVUwpIHsNCgkJCXV0Zjhb
MF0gPSAweGMwIHwgKHVjczQgPj4gNik7DQoJCQl1dGY4WzFdID0gMHg4MCB8
ICh1Y3M0ICYgMHgzZik7DQoJCQlpID0gMjsNCgkJICAgIH0gZWxzZSBpZiAo
dWNzNCA8PSAweGZmZmZVTCkgew0KCQkJdXRmOFswXSA9IDB4ZTAgfCAodWNz
NCA+PiAxMik7DQoJCQl1dGY4WzFdID0gMHg4MCB8ICgodWNzNCA+PiA2KSAm
IDB4M2YpOw0KCQkJdXRmOFsyXSA9IDB4ODAgfCAodWNzNCAmIDB4M2YpOw0K
CQkJaSA9IDM7DQoJCSAgICB9IGVsc2Ugew0KCQkJdXRmOFswXSA9IDB4ZjAg
fCAodWNzNCA+PiAxOCk7DQoJCQl1dGY4WzFdID0gMHg4MCB8ICgodWNzNCA+
PiAxMikgJiAweDNmKTsNCgkJCXV0ZjhbMl0gPSAweDgwIHwgKCh1Y3M0ID4+
IDYpICYgMHgzZik7DQoJCQl1dGY4WzNdID0gMHg4MCB8ICh1Y3M0ICYgMHgz
Zik7DQoJCQlpID0gNDsNCgkJICAgIH0NCgkJICAgIC8qIGNvbnZlcnQgdXRm
OCB0byBoZXggKi8NCgkJICAgIGZvciAoYyA9IDA7IGMgPCBpOyArK2MpIHsN
CgkJCWRzdFswXSA9ICclJzsNCgkJCWRzdFsxXSA9IGhleFt1dGY4W2NdID4+
IDRdOw0KCQkJZHN0WzJdID0gaGV4W3V0ZjhbY10gJiAweDBmXTsNCgkJCWRz
dCArPSAzOw0KCQkgICAgfQ0KCQl9DQoJICAgIH0NCgkgICAgLyogc2tpcCBv
dmVyIHRyYWlsaW5nICctJyBpbiBtb2RpZmllZCBVVEYtNyBlbmNvZGluZyAq
Lw0KCSAgICBpZiAoKnNyYyA9PSAnLScpICsrc3JjOw0KCX0NCiAgICB9DQog
ICAgLyogdGVybWluYXRlIGRlc3RpbmF0aW9uIHN0cmluZyAqLw0KICAgICpk
c3QgPSAnXDAnOw0KfQ0KDQptYWluKGludCBhcmdjLCBjaGFyICoqYXJndikN
CnsNCiAgICBjaGFyICpkc3Q7DQoNCiAgICBpZiAoYXJnYyA8IDIgfHwgISoo
YXJndlsxXSkpIHsNCglmcHJpbnRmKHN0ZGVyciwgInVzYWdlOiBpbWFwdXJs
IDxtYWlsYm94bmFtZT5cbiIpOw0KCWV4aXQoMSk7DQogICAgfQ0KICAgIGRz
dCA9IG1hbGxvYyhzdHJsZW4oYXJndlsxXSkgKiA0KTsNCiAgICBNYWlsYm94
VG9VUkwoZHN0LCBhcmd2WzFdKTsNCiAgICBwcmludGYoImltYXA6Ly88aG9z
dD4vJXNcbiIsIGRzdCk7DQogICAgZnJlZShkc3QpOw0KICAgIGV4aXQoMCk7
DQp9DQo=
---559023410-1804928587-862417005=:16628
Content-Type: TEXT/PLAIN; charset=US-ASCII; name="urlimap.c"
Content-Transfer-Encoding: BASE64
Content-ID: <Pine.SOL.3.95.970430091645.16628D@eleanor.innosoft.com>
Content-Description: 

LyogdXJsaW1hcC5jIC0tIGNvbnZlcnQgaGV4IFVURi04IFVSTCBwYXRoIHRv
IG1vZGlmaWVkIFVURi03IElNQVAgbWFpbGJveA0KICovDQoNCiNpbmNsdWRl
IDxzdGRpby5oPg0KI2luY2x1ZGUgPHN0ZGxpYi5oPg0KI2luY2x1ZGUgPHN0
cmluZy5oPg0KDQovKiBoZXhhZGVjaW1hbCBsb29rdXAgdGFibGUgKi8NCnN0
YXRpYyBjaGFyIGhleFtdID0gIjAxMjM0NTY3ODlBQkNERUYiOw0KDQovKiBV
VEY3IG1vZGlmaWVkIGJhc2U2NCBhbHBoYWJldCAqLw0Kc3RhdGljIGNoYXIg
YmFzZTY0Y2hhcnNbXSA9DQogICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZ
WmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSssIjsNCg0K
LyogVVRGMTYgZGVmaW5pdGlvbnMgKi8NCiNkZWZpbmUgVVRGMTZNQVNLCTB4
MDNGRlVMDQojZGVmaW5lIFVURjE2U0hJRlQJMTANCiNkZWZpbmUgVVRGMTZI
SUdIU1RBUlQJMHhEODAwVUwNCiNkZWZpbmUgVVRGMTZISUdIRU5ECTB4REJG
RlVMDQojZGVmaW5lIFVURjE2TE9TVEFSVAkweERDMDBVTA0KI2RlZmluZSBV
VEYxNkxPRU5ECTB4REZGRlVMDQoNCi8qIENvbnZlcnQgaGV4IGNvZGVkIFVU
Ri04IFVSTCBwYXRoIHRvIG1vZGlmaWVkIFVURi03IElNQVAgbWFpbGJveA0K
ICogIGRzdCBzaG91bGQgYmUgYWJvdXQgdHdpY2UgdGhlIGxlbmd0aCBvZiBz
cmMgdG8gZGVhbCB3aXRoIG5vbi1oZXggY29kZWQgVVJMcw0KICovDQp2b2lk
IFVSTHRvTWFpbGJveChjaGFyICpkc3QsIGNoYXIgKnNyYykNCnsNCiAgICB1
bnNpZ25lZCBpbnQgdXRmOHBvcywgdXRmOHRvdGFsLCBpLCBjLCB1dGY3bW9k
ZSwgYml0c3RvZ28sIHV0ZjE2ZmxhZzsNCiAgICB1bnNpZ25lZCBsb25nIHVj
czQsIGJpdGJ1ZjsNCiAgICB1bnNpZ25lZCBjaGFyIGhleHRhYlsyNTZdOw0K
DQogICAgLyogaW5pdGlhbGl6ZSBoZXggbG9va3VwIHRhYmxlICovDQogICAg
bWVtc2V0KGhleHRhYiwgMCwgc2l6ZW9mIChoZXh0YWIpKTsNCiAgICBmb3Ig
KGkgPSAwOyBpIDwgc2l6ZW9mIChoZXgpOyArK2kpIHsNCgloZXh0YWJbaGV4
W2ldXSA9IGk7DQoJaWYgKGlzdXBwZXIoaGV4W2ldKSkgaGV4dGFiW3RvbG93
ZXIoaGV4W2ldKV0gPSBpOw0KICAgIH0NCg0KICAgIHV0Zjdtb2RlID0gMDsN
CiAgICB1dGY4dG90YWwgPSAwOw0KICAgIGJpdHN0b2dvID0gMDsNCiAgICB3
aGlsZSAoKGMgPSAqc3JjKSAhPSAnXDAnKSB7DQoJKytzcmM7DQoJLyogdW5k
byBoZXgtZW5jb2RpbmcgKi8NCglpZiAoYyA9PSAnJScpIHsNCgkgICAgYyA9
IChoZXh0YWJbc3JjWzBdXSA8PCA0KSB8IGhleHRhYltzcmNbMV1dOw0KCSAg
ICBzcmMgKz0gMjsNCgl9DQoJLyogbm9ybWFsIGNoYXJhY3Rlcj8gKi8NCglp
ZiAoYyA+PSAnICcgJiYgYyA8PSAnficpIHsNCgkgICAgLyogc3dpdGNoIG91
dCBvZiBVVEYtNyBtb2RlICovDQoJICAgIGlmICh1dGY3bW9kZSkgew0KCQlp
ZiAoYml0c3RvZ28pIHsNCgkJICAgICpkc3QrKyA9IGJhc2U2NGNoYXJzWyhi
aXRidWYgPDwgKDYgLSBiaXRzdG9nbykpICYgMHgzRl07DQoJCX0NCgkJKmRz
dCsrID0gJy0nOw0KCQl1dGY3bW9kZSA9IDA7DQoJICAgIH0NCgkgICAgKmRz
dCsrID0gYzsNCgkgICAgLyogZW5jb2RlICcmJyBhcyAnJi0nICovDQoJICAg
IGlmIChjID09ICcmJykgew0KCQkqZHN0KysgPSAnLSc7DQoJICAgIH0NCgkg
ICAgY29udGludWU7DQoJfQ0KCS8qIHN3aXRjaCB0byBVVEYtNyBtb2RlICov
DQoJaWYgKCF1dGY3bW9kZSkgew0KCSAgICAqZHN0KysgPSAnJic7DQoJICAg
IHV0Zjdtb2RlID0gMTsNCgl9DQoJLyogRW5jb2RlIFVTLUFTQ0lJIGNoYXJh
Y3RlcnMgYXMgdGhlbXNlbHZlcyAqLw0KCWlmIChjIDwgMHg4MCkgew0KCSAg
ICB1Y3M0ID0gYzsNCgkgICAgdXRmOHRvdGFsID0gMTsNCgl9IGVsc2UgaWYg
KHV0Zjh0b3RhbCkgew0KCSAgICAvKiBzYXZlIFVURjggYml0cyBpbnRvIFVD
UzQgKi8NCgkgICAgdWNzNCA9ICh1Y3M0IDw8IDYpIHwgKGMgJiAweDNGVUwp
Ow0KCSAgICBpZiAoKyt1dGY4cG9zIDwgdXRmOHRvdGFsKSB7DQoJCWNvbnRp
bnVlOw0KCSAgICB9DQoJfSBlbHNlIHsNCgkgICAgdXRmOHBvcyA9IDE7DQoJ
ICAgIGlmIChjIDwgMHhFMCkgew0KCQl1dGY4dG90YWwgPSAyOw0KCQl1Y3M0
ID0gYyAmIDB4MUY7DQoJICAgIH0gZWxzZSBpZiAoYyA8IDB4RjApIHsNCgkJ
dXRmOHRvdGFsID0gMzsNCgkJdWNzNCA9IGMgJiAweDBGOw0KCSAgICB9IGVs
c2Ugew0KCQkvKiBOT1RFOiBjYW4ndCBjb252ZXJ0IFVURjggc2VxdWVuY2Vz
IGxvbmdlciB0aGFuIDQgKi8NCgkJdXRmOHRvdGFsID0gNDsNCgkJdWNzNCA9
IGMgJiAweDAzOw0KCSAgICB9DQoJICAgIGNvbnRpbnVlOw0KCX0NCgkvKiBs
b29wIHRvIHNwbGl0IHVjczQgaW50byB0d28gdXRmMTYgY2hhcnMgaWYgbmVj
ZXNzYXJ5ICovDQoJdXRmOHRvdGFsID0gMDsNCglkbyB7DQoJICAgIGlmICh1
Y3M0ID4gMHhmZmZmVUwpIHsNCgkJYml0YnVmID0gKGJpdGJ1ZiA8PCAxNikg
fCAoKHVjczQgPj4gVVRGMTZTSElGVCkNCgkJCQkJICAgKyBVVEYxNkhJR0hT
VEFSVCk7DQoJCXVjczQgPSAodWNzNCAmIFVURjE2TUFTSykgKyBVVEYxNkxP
U1RBUlQ7DQoJCXV0ZjE2ZmxhZyA9IDE7DQoJICAgIH0gZWxzZSB7DQoJCWJp
dGJ1ZiA9IChiaXRidWYgPDwgMTYpIHwgdWNzNDsNCgkJdXRmMTZmbGFnID0g
MDsNCgkgICAgfQ0KCSAgICBiaXRzdG9nbyArPSAxNjsNCgkgICAgLyogc3Bl
dyBvdXQgYmFzZTY0ICovDQoJICAgIHdoaWxlIChiaXRzdG9nbyA+PSA2KSB7
DQoJCWJpdHN0b2dvIC09IDY7DQoJCSpkc3QrKyA9IGJhc2U2NGNoYXJzWyhi
aXRzdG9nbyA/IChiaXRidWYgPj4gYml0c3RvZ28pIDogYml0YnVmKQ0KCQkJ
CSAgICAgJiAweDNGXTsNCgkgICAgfQ0KCX0gd2hpbGUgKHV0ZjE2ZmxhZyk7
DQogICAgfQ0KICAgIC8qIGlmIGluIFVURi03IG1vZGUsIGZpbmlzaCBpbiBB
U0NJSSAqLw0KICAgIGlmICh1dGY3bW9kZSkgew0KCWlmIChiaXRzdG9nbykg
ew0KCSAgICAqZHN0KysgPSBiYXNlNjRjaGFyc1soYml0YnVmIDw8ICg2IC0g
Yml0c3RvZ28pKSAmIDB4M0ZdOw0KCX0NCgkqZHN0KysgPSAnLSc7DQogICAg
fQ0KICAgIC8qIHRpZSBvZmYgc3RyaW5nICovDQogICAgKmRzdCA9ICdcMCc7
DQp9DQoNCm1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQ0Kew0KICAgIGNo
YXIgKmRzdDsNCg0KICAgIGlmIChhcmdjIDwgMiB8fCAhKihhcmd2WzFdKSkg
ew0KCWZwcmludGYoc3RkZXJyLCAidXNhZ2U6IHVybGltYXAgPHVybHBhdGg+
XG4iKTsNCglleGl0KDEpOw0KICAgIH0NCiAgICBkc3QgPSBtYWxsb2Moc3Ry
bGVuKGFyZ3ZbMV0pICogNCk7DQogICAgVVJMdG9NYWlsYm94KGRzdCwgYXJn
dlsxXSk7DQogICAgcHJpbnRmKCIlc1xuIiwgZHN0KTsNCiAgICBmcmVlKGRz
dCk7DQogICAgZXhpdCgwKTsNCn0NCg==
---559023410-1804928587-862417005=:16628--