[code-review] Lingua::Phonology (take 2)

JS Bangs <[email protected]> Thu, 13 Nov 2003 21:43:15 -0800 (PST)
Newsgroups gmane.comp.lang.perl.code-review-ladder
Message-ID <[email protected]>
  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-oOUblnuQwHKola3qYQ6TW/IULO3mGbRi9nwVQlTi/[email protected] for more info.

---1936847036-504407799-1068788595=:52030
Content-Type: TEXT/PLAIN; charset=US-ASCII

Based on Mark Dominus' helpful comments, I've included the rewritten
Lingua::Phonology file, and the newly created Lingua::Phonology::Common,
which has many of the functions from the old version.

--
Jesse S. Bangs [email protected]
http://blog.glossopoesis.org

"We're counting on our virtues,
Cause it's too hard to count the dead."
 - Jason Webley
---1936847036-504407799-1068788595=:52030
Content-Type: APPLICATION/octet-stream; name="Lingua-Phonology.tar"
Content-Transfer-Encoding: BASE64
Content-ID: <Pine.A41.4.58.0311132143150.52030-TF08L2nic8KvDrP6NlPIEWFd9LytHNBa@public.gmane.org>
Content-Description: 
Content-Disposition: attachment; filename="Lingua-Phonology.tar"

UGhvbm9sb2d5LnBtAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAADAxMDA2NDQAMDAwMTc1MgAwMDAxNzUyADAwMDAwMDI3NTQ1
ADA3NzU1MDY0MzQyADAxMjc2NgAgMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhciAgAGphc3Bh
eAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAamFzcGF4AAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAjIS91c3IvYmluL3BlcmwgLXcKCnBhY2thZ2Ug
TGluZ3VhOjpQaG9ub2xvZ3k7CgokVkVSU0lPTiA9IDAuMjU7Cgp1c2Ugc3Ry
aWN0Owp1c2Ugd2FybmluZ3M6OnJlZ2lzdGVyOwp1c2UgQ2FycDsKCnVzZSBM
aW5ndWE6OlBob25vbG9neTo6Q29tbW9uOwp1c2UgTGluZ3VhOjpQaG9ub2xv
Z3k6OkZlYXR1cmVzOwp1c2UgTGluZ3VhOjpQaG9ub2xvZ3k6OlNlZ21lbnQ7
CnVzZSBMaW5ndWE6OlBob25vbG9neTo6U3ltYm9sczsKdXNlIExpbmd1YTo6
UGhvbm9sb2d5OjpSdWxlczsKdXNlIExpbmd1YTo6UGhvbm9sb2d5OjpTeWxs
YWJsZTsKCgo9aGVhZDEgTkFNRQoKTGluZ3VhOjpQaG9ub2xvZ3kgLSBhIG1v
ZHVsZSBwcm92aWRpbmcgYSB1bmlmaWVkIHdheSB0byBkZWFsIHdpdGgKbGlu
Z3Vpc3RpYyByZXByZXNlbnRhdGlvbnMgb2YgcGhvbm9sb2d5LgoKPWhlYWQx
IFNZTk9QU0lTCgogICAgdXNlIExpbmd1YTo6UGhvbm9sb2d5OwogICAgJHBo
b25vID0gbmV3IExpbmd1YTo6UGhvbm9sb2d5OwoKICAgICMgR2V0IHN1Yi1v
YmplY3RzCiAgICAkZmVhdHVyZXMgPSAkcGhvbm8tPmZlYXR1cmVzOwogICAg
JHN5bWJvbHMgPSAkcGhvbm8tPnN5bWJvbHM7CiAgICAkcnVsZXMgPSAkcGhv
bm8tPnJ1bGVzOwogICAgJHN5bGxhYmlmaWNhdGlvbiA9ICRwaG9uby0+c3ls
bGFibGU7CiAgICAkc2VnbWVudCA9ICRwaG9uby0+c2VnbWVudDsKCiAgICAj
IExvYWQgcGhvbm9sb2d5IGRlZmF1bHRzCiAgICAkcGhvbm8tPmxvYWRmaWxl
OwoKICAgICMgTG9hZCBhIHBob25vbG9neSBkZWZpbml0aW9uIGZyb20gYSBm
aWxlCiAgICAkcGhvbm8tPmxvYWRmaWxlKCdsYW5ndWFnZS54bWwnKTsKCiAg
ICAjIFNhdmUgcGhvbm9sb2d5IGRlZmluaXRpb24gdG8gYSBmaWxlCiAgICAk
cGhvbm8tPnNhdmVmaWxlKCdsYW5ndWFnZS54bWwnKTsKCj1oZWFkMSBBQlNU
UkFDVAoKTGluZ3VhOjpQaG9ub2xvZ3kgaXMgYSB1bmlmaWVkIG1vZHVsZSBm
b3IgaGFuZGxpbmcgcGhvbm9sb2dpY2FsIGRlc2NyaXB0aW9ucwphbmQgdW5p
dHMuIEl0IGluY2x1ZGVzIHN1Yi1tb2R1bGVzIGZvciBoaWVyYXJjaGljYWwg
KGZlYXR1cmUtZ2VvbWV0cmljKSBzZXRzIG9mCmZlYXR1cmVzLCBwaG9uZXRp
YyBvciBvcnRob2dyYXBoaWMgc3ltYm9scywgaW5kaXZpZHVhbCBzZWdtZW50
cywgbGluZ3Vpc3RpYwpydWxlcywgc3lsbGFiaWZpY2F0aW9uIGFsZ29yaXRo
bXMsIGV0Yy4gSXQgaXMgd3JpdHRlbiBhcyBhbiBvYmplY3Qtb3JpZW50ZWQK
bW9kdWxlLCB3aGVyZWluIG9uZSB3aWxsIGdlbmVyYWxseSBoYXZlIGEgc2lu
Z2xlIG9iamVjdCBmb3IgdGhlIGxpc3Qgb2YKZmVhdHVyZXMsIG9uZSBmb3Ig
dGhlIHBob25ldGljIHN5bWJvbHMsIG9uZSBmb3IgdGhlIHNldCBvZiBydWxl
cywgZXRjLiwgYW5kCm11bHRpcGxlIHNlZ21lbnQgb2JqZWN0cyB0byBiZSBw
cm9ncmFtYXRpY2FsbHkgbWFuaXB1bGF0ZWQuCgo9Y3V0CgojIFJlbWFpbmRl
ciBvZiBQT0QgaXMgYWZ0ZXIgdGhlIF9fRU5EX18gdG9rZW4KCiMgQ29uc3Ry
dWN0b3IgLSBjcmVhdGVzIG5ldyAoZW1wdHkpIG9iamVjdHMKc3ViIG5ldyB7
CglteSAkcHJvdG8gPSBzaGlmdDsKCW15ICRjbGFzcyA9IHJlZigkcHJvdG8p
IHx8ICRwcm90bzsKCW15ICRzZWxmID0gYmxlc3Mge30sICRjbGFzczsKCgkk
c2VsZi0+e2ZlYXR1cmVzfSA9IExpbmd1YTo6UGhvbm9sb2d5OjpGZWF0dXJl
cy0+bmV3KCk7Cgkkc2VsZi0+e3N5bWJvbHN9ID0gTGluZ3VhOjpQaG9ub2xv
Z3k6OlN5bWJvbHMtPm5ldygkc2VsZi0+e0ZFQVRVUkVTfSk7Cgkkc2VsZi0+
e3J1bGVzfSA9IExpbmd1YTo6UGhvbm9sb2d5OjpSdWxlcy0+bmV3KCk7Cgkk
c2VsZi0+e3N5bGxhYmxlfSA9IExpbmd1YTo6UGhvbm9sb2d5OjpTeWxsYWJs
ZS0+bmV3KCk7CgoJcmV0dXJuICRzZWxmOwp9CgojIE5leHQgc2VjdGlvbiBk
ZWFscyB3LyBtYWtpbmcgYWNjZXNzb3IgbWV0aG9kcwojIEFjY2Vzc29yIG1l
dGhvZHMgdG8gY3JlYXRlIGFuZC9vciBpdGVyYXRlIG92ZXIgKG9yZGVyIG1h
eSBiZSBzaWduaWZpY2FudCEpCm15IEBhY2Nlc3NvcnMgPSBxdy9mZWF0dXJl
cyBzeW1ib2xzIHJ1bGVzIHN5bGxhYmxlLzsKCiMgT2JqZWN0IHR5cGVzIHRv
IGNyZWF0ZS9leHBlY3QtLWFsbCBhY2Nlc3NvcnMgbXVzdCBiZSBkZWZpbmVk
IGhlcmUKbXkgJWNsYXNzZXMgPSAoCiAgICBmZWF0dXJlcyA9PiAnTGluZ3Vh
OjpQaG9ub2xvZ3k6OkZlYXR1cmVzJywKICAgIHN5bWJvbHMgPT4gJ0xpbmd1
YTo6UGhvbm9sb2d5OjpTeW1ib2xzJywKICAgIHJ1bGVzID0+ICdMaW5ndWE6
OlBob25vbG9neTo6UnVsZXMnLAogICAgc3lsbGFibGUgPT4gJ0xpbmd1YTo6
UGhvbm9sb2d5OjpTeWxsYWJsZScKKTsKCiMgQ29udGludWF0aW9ucyAoaWYg
bmVlZGVkKQpteSAlY29udGludWUgPSAoCiAgICBmZWF0dXJlcyA9PiBzdWIg
eyAkX1swXS0+e1NZTExBQkxFfS0+ZmVhdHVyZXMoJF9bMV0pIH0KKTsKCiMg
Q3JlYXRlIG1ldGhvZHMgZm9yIGVhY2ggb2YgdGhlIGFjY2Vzc29ycwp3aGls
ZSAobXkgKCRuYW1lLCAkY2xhc3MpID0gZWFjaCAlY2xhc3NlcykgewogICAg
bm8gc3RyaWN0ICdyZWZzJzsKICAgICokbmFtZSA9IHN1YiB7CiAgICAgICAg
bXkgJHNlbGYgPSAkX1swXTsKICAgICAgICBpZiAoQF8gPiAxKSB7CiAgICAg
ICAgICAgIG15ICR2YWwgPSAkX1sxXTsKICAgICAgICAgICAgcmV0dXJuIGNy
b2FrICJBcmd1bWVudCB0byAkbmFtZSgpIG5vdCBhICRjbGFzcyIgdW5sZXNz
IF9pcygkdmFsLCAkY2xhc3MpOwogICAgICAgICAgICAkc2VsZi0+eyRuYW1l
fSA9ICR2YWw7CiAgICAgICAgfQogICAgICAgICRjb250aW51ZXskbmFtZX0t
PihAXykgaWYgZXhpc3RzICRjb250aW51ZXskbmFtZX07CiAgICAgICAgcmV0
dXJuICRzZWxmLT57JG5hbWV9OwogICAgfTsKfQogICAgICAgIAojIEdldCBi
bGFuayBzZWdtZW50cwpzdWIgc2VnbWVudCB7CglteSAkc2VsZiA9IHNoaWZ0
OwoJbXkgJHNlZyA9IExpbmd1YTo6UGhvbm9sb2d5OjpTZWdtZW50LT5uZXco
JHNlbGYtPntmZWF0dXJlc30pOwoJJHNlZy0+c3ltYm9sc2V0KCRzZWxmLT57
c3ltYm9sc30pOwoJcmV0dXJuICRzZWc7Cn0KCiMgTG9hZCBhIGNvbXBsZXRl
IHBob25vbG9neSBkZWZpbml0aW9uIGZyb20gYSBmaWxlCnN1YiBsb2FkZmls
ZSB7CiAgICBteSAoJHNlbGYsICRmaWxlKSA9IEBfOwogICAgbXkgJHJldHVy
biA9IDE7CgogICAgIyBJZiBjYWxsZWQgd2l0aCBvbmUgYXJndW1lbnQsIGxv
YWQgZGVmYXVsdHMuIFN1Ym1vZHVsZXMgaW1wbGVtZW50CiAgICAjICJkZWZh
dWx0IiBpbiBkaWZmZXJlbnQgd2F5cy0tdGhhdCdzIHRoZWlyIHByb2JsZW0u
IFRoZXkgbXVzdCBkbyB0aGUgcmlnaHQKICAgICMgdGhpbmcgd2hlbiBsb2Fk
ZmlsZSgpIGlzIGNhbGxlZCBvbiB0aGVtIHdpdGggbm8gYXJndW1lbnRzLgog
ICAgaWYgKG5vdCBkZWZpbmVkICRmaWxlKSB7CiAgICAgICAgZm9yIChAYWNj
ZXNzb3JzKSB7CiAgICAgICAgICAgICRzZWxmLT4kXy0+bG9hZGZpbGUgb3Ig
dW5kZWYgJHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBXaGVuIGdp
dmVuIGFuIGFjdHVhbCBmaWxlbmFtZQogICAgZWxzZSB7CiAgICAgICAgbXkg
JHN0cmluZyA9IF9wYXJzZV9mcm9tX2ZpbGUgJGZpbGUgb3IgcmV0dXJuOwog
ICAgICAgIG15ICRwYXJzZSA9IF9wYXJzZV9mcm9tX3N0cmluZyAkc3RyaW5n
IG9yIHJldHVybjsKCiAgICAgICAgbXkgJHJldHVybiA9IDE7CiAgICAgICAg
Zm9yIChAYWNjZXNzb3JzKSB7CiAgICAgICAgICAgICRzZWxmLT4kXy0+bG9h
ZF9mcm9tX3N0cnVjdCgkcGFyc2UtPnskX30pIG9yIHVuZGVmICRyZXR1cm47
CiAgICAgICAgfQogICAgfQoKICAgICMgJHJldHVybiBzaG91bGQgCiAgICBy
ZXR1cm4gJHJldHVybjsKfQoKIyBTYXZlIGEgdG90YWwgcGhvbm9sb2d5LiBX
ZSBkbyB0aGlzIGJ5IGNvbmNhdGVuYXRpbmcgdGhlIHN0cmluZ3MgcmV0dXJu
ZWQgYnkKIyB0aGUgdG9fc3RyKCkgbWV0aG9kcyBpbiB0aGUgdmFyaW91cyBz
dWJtb2R1bGVzLgpzdWIgc2F2ZWZpbGUgewogICAgbXkgKCRzZWxmLCAkZmls
ZSkgPSBAXzsKCiAgICBteSAkc3RyID0gJyc7CiAgICBmb3IgKEBhY2Nlc3Nv
cnMpIHsKICAgICAgICAkc3RyIC49ICJcblxuIiAuICRzZWxmLT4kXy0+dG9f
c3RyOwogICAgfQogICAgJHN0ciA9ICI8cGhvbm9sb2d5PlxuJHN0cjwvcGhv
bm9sb2d5PlxuIjsKCiAgICAkZmlsZSA9IF90b19oYW5kbGUoJGZpbGUsICc+
Jykgb3IgcmV0dXJuOwoKICAgIHByaW50ICRmaWxlICRzdHI7CiAgICByZXR1
cm4gJHN0cjsKfQoKMTsKCl9fRU5EX18KCj1oZWFkMSBERVNDUklQVElPTgoK
TGluZ3VhOjpQaG9ub2xvZ3kgaXMgYSBtb2R1bGUgZm9yIG1vZGVsaW5nIHBo
b25vbG9naWNhbCBkZXNjcmlwdGlvbnMgb2YKbGFuZ3VhZ2VzLiBJdCBpcyBk
ZXNpZ25lZCB3aXRoIGEgY2xhc3NpY2FsIGdlbmVyYXRpdmUgcGhvbm9sb2d5
IGluIG1pbmQsCmhhbmRpbmcgZmVhdHVyZSBnZW9tZXRyeSwgcGhvbmV0aWMg
c3ltYm9scywgb3JkZXJlZCBydWxlIHNldHMsIGFuZApzeWxsYWJpZmljYXRp
b24gYWxnb3JpdGhtcy4gQm90aCBzeW5jaHJvbmljIHVuZGVybHlpbmctdG8t
c3VyZmFjZSBsYW5ndWFnZQpjaGFuZ2UgYW5kIGRpYWNocm9uaWMgbGFuZ3Vh
Z2UgY2hhbmdlIGNhbiBiZSBtb2RlbGVkIHdpdGggdGhpcyBtb2R1bGUuIFRo
ZQptb2R1bGUgaXMgZGVzaWduZWQgdG8gYmUgdmVyeSBwb3dlcmZ1bCBhbmQg
ZW50aXJlbHkgcHJvZ3JhbW1hdGljLCBhbGxvd2luZyB5b3UKdG8gZGVmaW5l
IGFuZCBtYW5pcHVsYXRlIGEgcGhvbm9sb2d5IGVudGlyZWx5IGluIHBlcmws
IGFuZCBpdCBpbmNsdWRlcyBtYW55CmZlYXR1cmVzIHRoYXQgeW91IHdpbGwg
cHJvYmFibHkgbmV2ZXIgdXNlLiBTb21lIG9mIHRoZSBmdW5jdGlvbmFsaXR5
IG9mCkxpbmd1YTo6RmVhdHVyZU1hdHJpeCBhbmQgTGluZ3VhOjpTb3VuZENo
YW5nZSBpcyBkdXBsaWNhdGVkIGhlcmUsIGJ1dCB3aXRoCm11Y2gsIG11Y2gg
Z3JlYXRlciBwb3dlci4KCkxpbmd1YTo6UGhvbm9sb2d5IGlzIHNwbGl0IGlu
dG8gc2V2ZXJhbCBzdWItbW9kdWxlcywgZWFjaCBvZiB3aGljaCBkb2VzIG9u
ZQpzcGVjaWZpYyB0aGluZy4gSGVyZSBhcmUgdGhlIHN1Yi1tb2R1bGVzLCB3
aXRoIGEgYnJpZWYgZGVzY3JpcHRpb24gb2YgZWFjaDoKCj1vdmVyIDQKCj1p
dGVtICogTDxMaW5ndWE6OlBob25vbG9neTo6RmVhdHVyZXM+CgpMaW5ndWE6
OlBob25vbG9neTo6RmVhdHVyZXMgYWxsb3dzIHlvdSB0byBkZWZpbmUgYW5k
IG1hbmlwdWxhdGUgdGhlIGZlYXR1cmUgc2V0CnRoYXQgeW91ciBsYW5ndWFn
ZSB1c2VzLiBUaGlzIG1vZHVsZSBhbGxvd3MgZm9yIGFyYml0cmFyaWx5IGNv
bXBsZXgKaGVpcmFyY2hpY2FsIGZlYXR1cmUgZ2VvbWV0cnkgc3lzdGVtcyBh
bmQgaW1wbGVtZW50cyBvbmUgc3VjaCBzeXN0ZW0gYXMgaXRzCmRlZmF1bHQs
IGJ1dCB5b3UgY2FuIGFsc28gaW1wbGVtZW50IGZsYXQgImNsYXNzaWNhbCIg
ZmVhdHVyZSBzeXN0ZW1zLgoKPWl0ZW0gKiBMPExpbmd1YTo6UGhvbm9sb2d5
OjpTZWdtZW50PgoKTGluZ3VhOjpQaG9ub2xvZ3k6OlNlZ21lbnQsIGFzIGl0
cyBuYW1lIGltcGxpZXMsIGlzIHRoZSBjbGFzcyB0aGF0IGhhbmRsZXMKaW5k
aXZpZHVhbCBzZWdtZW50cy4gU2VnbWVudHMgYXJlIGFzc29jaWF0ZWQgd2l0
aCBhIGZlYXR1cmUgc2V0IChhCkxpbmd1YTo6UGhvbm9sb2d5OjpGZWF0dXJl
cyBvYmplY3QpLCBhbmQgYXJlIG1hbmlwdWxhdGVkIGJ5IHZhcmlvdXMgb3Ro
ZXIKbW9kdWxlcy4KCj1pdGVtICogTDxMaW5ndWE6OlBob25vbG9neTo6U3lt
Ym9scz4KCkxpbmd1YTo6UGhvbm9sb2d5OjpTeW1ib2xzIGlzIGEgY2xhc3Mg
dGhhdCBhY3RzIGFzIGEgInBob25ldGljIGludGVycHJldGVyIiBmb3IKTGlu
Z3VhOjpQaG9ub2xvZ3k6OlNlZ21lbnQgb2JqZWN0cy4gSXQgdGFrZXMgYSBT
ZWdtZW50IGFuZCBhdHRlbXB0cyB0byBtYXRjaCBpdAp3aXRoIGEgdGV4dHVh
bCBwaG9uZXRpYyBzeW1ib2wuIFRoaXMgbW9kdWxlIGNvbnRhaW5zIG1ldGhv
ZHMgZm9yIGRlZmluaW5nIGFuZAptYW5pcHVsYXRpbmcgdGhlIHNldCBvZiBw
aG9uZXRpYyBzeW1ib2xzIHVzZWQuCgo9aXRlbSAqIEw8TGluZ3VhOjpQaG9u
b2xvZ3k6OlJ1bGVzPgoKTGluZ3VhOjpQaG9ub2xvZ3k6OlJ1bGVzIGFsbG93
cyB5b3UgdG8gZGVmaW5lIHByb2Nlc3NlcyB0aGF0IGFjdCB1cG9uIHdvcmRz
LAp3aGljaCBhcmUgbGlzdHMgb2Ygc2VnbWVudHMuIFlvdSB1c2UgdGhpcyBj
bGFzcyB0byBkZWZpbmUgdGhlIGNvbmRpdGlvbnMgYW5kCmVmZmVjdHMgb2Yg
ZWFjaCBydWxlLCBhbmQgdGhlbiBhcHBseSB0aGF0IHJ1bGUgb3IgbWFueSBy
dWxlcyBhdCBvbmNlIHRvIGEgd29yZC4KCj1pdGVtICogTDxMaW5ndWE6OlBo
b25vbG9neTo6U3lsbGFibGU+CgpMaW5ndWE6OlBob25vbG9neTo6U3lsbGFi
bGUgaXMgYSBzdWJjbGFzcyBvZiBMaW5ndWE6OlBob25vbG9neTo6UnVsZXMg
ZGVzaWduZWQKdG8gaGFuZGxlIHN5bGxhYmlmaWNhaW9uLiBCeSBzZXR0aW5n
IGp1c3QgYSBmZXcgcGFyYW1ldGVycywgeW91IGNhbiB1c2UgdGhpcwptb2R1
bGUgdG8gYnJlYWsgYSB3b3JkIHVwIGludG8gc3lsbGFibGVzLgoKPWl0ZW0g
KiBMPExpbmd1YTo6UGhvbm9sb2d5OjpGdW5jdGlvbnM+CgpUaGlzIG1vZHVs
ZSwgdW5saWtlIGFsbCBvZiB0aGUgb3RoZXJzLCBpcyBub3Qgb2JqZWN0IG9y
aWVudGVkLiBJdCBwcm92aWRlcyBhCnNldCBvZiBmdW5jdGlvbnMgdGhhdCBj
YW4gYmUgdXNlZCB0byBtYWtlIGl0IGVhc2llciB0byB3cml0ZSBydWxlcyBm
b3IKTGluZ3VhOjpQaG9ub2xvZ3k6OlJ1bGVzLgoKPWJhY2sKCldoZW4geW91
IGNyZWF0ZSBhIExpbmd1YTo6UGhvbm9sb2d5IG9iamVjdCB3aXRoIEM8bmV3
IExpbmd1YTo6UGhvbm9sb2d5PiwgaXQgY29tZXMKYnVuZGxlZCB3aXRoIGEg
c2luZ2xlIG9iamVjdCBmb3IgZWFjaCBvZiB0aGVzZSBjbGFzc2VzOgpMaW5n
dWE6OlBob25vbG9neTo6RmVhdHVyZXMsIExpbmd1YTo6UGhvbm9sb2d5OjpT
eW1ib2xzLApMaW5ndWE6OlBob25vbG9neTo6UnVsZXMsIExpbmd1YTo6UGhv
bm9sb2d5OjpTeWxsYWJsZS4gVGhlcmUgYXJlIHNpbXBsZSBtZXRob2RzCmZv
ciBhY2Nlc3NpbmcgZWFjaCBvZiB0aGVzZSBvYmplY3RzLiBUaGVyZSBpcyBh
bHNvIGEgbWV0aG9kIHRoYXQgY2FuIGJlIHVzZWQgdG8KZ2VuZXJhdGUgbmV3
IExpbmd1YTo6UGhvbm9sb2d5OjpTZWdtZW50IG9iamVjdHMgKHNpbmNlIHlv
dSB3aWxsIGRvdWJ0bGVzc2x5CndhbnQgbW9yZSB0aGFuIG9uZSBzZWdtZW50
KSEgVGhlIG9ubHkgbW9kdWxlIG5vdCBhdXRvbWF0aWNhbGx5IGJ1bmRsZWQg
d2l0aApMaW5ndWE6OlBob25vbG9neSBpcyBMaW5ndWE6OlBob25vbG9neTo6
RnVuY3Rpb25zLCB3aGljaCB5b3UgbmVlZCB0byBDPHVzZT4KeW91cnNlbGYg
aWYgeW91IHdhbnQgdG8gYWNjZXNzIGl0cyBmdW5jdGlvbnMuCgpUaGUgY29t
cGxldGUgZGVzY3JpcHRpb24gb2YgdGhlIGZ1bmN0aW9uIGFuZCB1c2Ugb2Yg
ZWFjaCBvZiB0aGVzZSBtb2R1bGVzIGlzIG9uCnRoZWlyIHJlc3BlY3RpdmUg
bWFuIHBhZ2VzLiBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IHlvdSByZWFkIHRo
ZXNlIHBhZ2VzIGluIHRoZQpvcmRlciBnaXZlbiBhYm92ZSB0byBiZXN0IHVu
ZGVyc3RhbmQgdGhlbS4KCj1oZWFkMSBXQVJOSU5HUwoKQWx3YXlzIEM8dXNl
PiB0aGVtLiBMaW5ndWE6OlBob25vbG9neSBjb250YWlucyBtYW55IHVzZWZ1
bCB3YXJuaW5ncywgYnV0IGl0CmdlbmVyYWxseSB3aWxsIG5vdCBkaXNwbGF5
IHRoZW0gdW5sZXNzIEM8dXNlIHdhcm5pbmdzPiBpcyBvbi4gQWxsIG9mIHRo
ZQptb2R1bGVzIHdpdGhpbiBMaW5ndWE6OlBob25vbG9neSBwcm92aWRlIG5h
bWVkIHdhcm5pbmdzIHNwYWNlcywgc28geW91IGNhbgp0dXJuIHRoZSB3YXJu
aW5ncyBzcGVjaWZpYyB0byBMaW5ndWE6OlBob25vbG9neSBvciBhbnkgc3Vi
bW9kdWxlIG9uIG9yIG9mZi4KCgl1c2Ugd2FybmluZ3MgJ0xpbmd1YTo6UGhv
bm9sb2d5JzsgICAgICAgIyB1c2UgYWxsIHdhcm5pbmdzIHcvaW4gTGluZ3Vh
OjpQaG9ub2xvZ3kKCW5vIHdhcm5pbmdzICdMaW5ndWE6OlBob25vbG9neTo6
UnVsZXMnOyAjIGlnbm9yZSB3YXJuaW5ncyBjb21pbmcgZnJvbSBMaW5ndWE6
OlBob25vbG9neTo6UnVsZXMKCSMgZXRjLgoKPWhlYWQxIE1FVEhPRFMKCj1o
ZWFkMiBuZXcKCiAgICBteSAkcGhvbm8gPSBuZXcgTGluZ3VhOjpQaG9ub2xv
Z3k7CgpUYWtlcyBubyBhcmd1bWVudHMsIGFuZCByZXR1cm5zIGEgbmV3IExp
bmd1YTo6UGhvbm9sb2d5IG9iamVjdC4gVGhpcyBuZXcgb2JqZWN0CndpbGwg
Y29udGFpbiBvbmUgTGluZ3VhOjpQaG9ub2xvZ3k6OkZlYXR1cmVzIG9iamVj
dCwgb25lCkxpbmd1YTo6UGhvbm9sb2d5OjpTeW1ib2xzIG9iamVjdCwgb25l
IExpbmd1YTo6UGhvbm9sb2d5OjpSdWxlcyBvYmplY3QsIGFuZCBvbmUKTGlu
Z3VhOjpQaG9ub2xvZ3k6OlN5bGxhYmxlIG9iamVjdC4gIFRoZXNlIG9iamVj
dHMgd2lsbCBiZSBpbml0aWFsaXplZCB0byByZWZlcgp0byBvbmUgYW5vdGhl
ciB3aGVyZSBhcHByb3ByaWF0ZSwgc28gaXQgaXMgcmFyZWx5IG5lY2Vzc2Fy
eSB0byB1c2UgQzxuZXc+IG9uCmFueSBvZiB0aGUgc3ViLW1vZHVsZXMuCgo9
aGVhZDIgZmVhdHVyZXMKCiAgICBteSAkZmVhdHVyZXMgPSAkcGhvbm8tPmZl
YXR1cmVzOwoKUmV0dXJucyB0aGUgTGluZ3VhOjpQaG9ub2xvZ3k6OkZlYXR1
cmVzIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQKcGhvbm9s
b2d5LiBZb3UgbWF5IGFsc28gcGFzcyBhIEZlYXR1cmVzIG9iamVjdCBhcyBh
biBhcmd1bWVudCwgd2hpY2ggc2V0cyB0aGUKY3VycmVudCBGZWF0dXJlcyBv
YmplY3QuCgo9aGVhZDIgc3ltYm9scwoKICAgIG15ICRzeW1ib2xzID0gJHBo
b25vLT5zeW1ib2xzOwoKUmV0dXJucyB0aGUgY3VycmVudCBMaW5ndWE6OlBo
b25vbG9neTo6U3ltYm9scyBvYmplY3QuIEFzIHdpdGggQzxmZWF0dXJlcygp
PiwgeW91IGNhbiBwYXNzIGEKU3ltYm9scyBvYmplY3QgYXMgYW4gYXJndW1l
bnQgdG8gc2V0IHRoZSBjdXJyZW50IFN5bWJvbHMgb2JqZWN0LCBpZgpkZXNp
cmVkLgoKPWhlYWQyIHJ1bGVzCgogICAgbXkgJHJ1bGVzID0gJHBob25vLT5y
dWxlczsKClJldHVybnMgdGhlIGN1cnJlbnQgTGluZ3VhOjpQaG9ub2xvZ3k6
OlJ1bGVzIG9iamVjdCwgb3Igc2V0cyB0aGUgY3VycmVudCBvYmplY3QKaWYg
YSBSdWxlcyBvYmplY3QgaXMgcHJvdmlkZWQgYXMgYW4gYXJndW1lbnQuCgo9
aGVhZDIgc3lsbGFibGUKCiAgICBteSAkc3lsbGFiaWZpY2F0aW9uID0gJHBo
b25vLT5zeWxsYWJsZTsKClJldHVybnMgYSBMaW5ndWE6OlBob25vbG9neTo6
U3lsbGFibGUgb2JqZWN0LCBvciBzZXRzIHRoZSBjdXJyZW50IG9iamVjdCBp
ZgphIFN5bGxhYmxlIG9iamVjdCBpcyBwcm92aWRlZCBhcyBhbiBhcmd1bWVu
dC4KCj1oZWFkMiBzZWdtZW50CgogICAgbXkgJHNlZyA9ICRwaG9uby0+c2Vn
bWVudDsKClJldHVybnMgYSBuZXcgTGluZ3VhOjpQaG9ub2xvZ3k6OlNlZ21l
bnQgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudApmZWF0dXJl
IHNldCBhbmQgc3ltYm9sIHNldC4gVGhpcyBtZXRob2QgdGFrZXMgbm8gYXJn
dW1lbnRzLCBhbmQgY2Fubm90IGJlIHVzZWQKdG8gaW5pdGlhbGl6ZSBhIHNl
Z21lbnQuIFRoZXJlZm9yZSwgaXQncyBwcm9iYWJseSBlYXNpZXIgdG8gdXNl
IHRoZSBzZWdtZW50KCkKbWV0aG9kIG9mIExpbmd1YTo6UGhvbm9sb2d5OjpT
eW1ib2xzLgoKPWhlYWQyIGxvYWRmaWxlCgogICAgIyBMb2FkIGRlZmF1bHRz
CiAgICAkcGhvbm8tPmxvYWRmaWxlOwogICAgCiAgICAjIExvYWQgcGhvbm9s
b2d5IGRlZmluaXRpb24gZnJvbSBhIGZpbGUKICAgICRwaG9uby0+bG9hZGZp
bGUoJ3Bob25vLnhtbCcpOwoKClRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRv
IGVpdGhlciBsb2FkIHRoZSBkZWZhdWx0cyBmb3IgYWxsIG1vZHVsZXMgdGhh
dCBjb21lCndpdGggZGVmYXVsdHMgKGN1cnJlbnRseSBMaW5ndWE6OlBob25v
bG9neTo6RmVhdHVyZXMgYW5kCkxpbmd1YTo6UGhvbm9sb2d5OjpTeW1ib2xz
KSwgb3IgdG8gbG9hZCBhIHBob25vbG9neSBkZWZpbml0aW9uIGZyb20gYSBm
aWxlLgoKTGluZ3VhOjpQaG9ub2xvZ3kgcmVhZHMgcGhvbm9sb2d5IGRlZmlu
aXRpb25zIHdyaXR0ZW4gaW4gWE1MLiBUaGUgc3BlY2lmaWNhdGlvbgpmb3Ig
dGhlIFhNTCBmb3JtYXQgdGhhdCBMaW5ndWE6OlBob25vbG9neSByZWFkcyBp
cyBkZXNjcmliZWQgaW4KTGluZ3VhOjpQaG9ub2xvZ3k6OkZpbGVGb3JtYXRQ
T0QuCgpUaGlzIG1ldGhvZCByZXR1cm5zIHRydWUgb24gc3VjY2VzcywgYW5k
IHVuZGVmIG9uIGZhaWx1cmUuCgo9aGVhZDIgc2F2ZWZpbGUKCiAgICAjIFNh
dmUgdG8gYSBmaWxlCiAgICAkcGhvbm8tPnNhdmVmaWxlKCdwaG9uby54bWwn
KTsKClRoaXMgbWV0aG9kIHdyaXRlcyB0aGUgY3VycmVudCBwaG9ub2xvZ3kg
c3RhdGUgdG8gdGhlIGZpbGUgZ2l2ZW4gYXMgdGhlCmFyZ3VtZW50LiBUaGUg
YXJndW1lbnQgdG8gdGhpcyBmdW5jdGlvbiBtYXkgYmUgdGhlIG5hbWUgb2Yg
YSBmaWxlIG9yIGEKZmlsZWhhbmRsZSByZWZlcmVuY2UuIElmIHRoZSBuYW1l
IG9mIGEgZmlsZSBpcyBnaXZlbiwgdGhlIGZpbGUgaXMgdHJ1bmNhdGVkCmJl
Zm9yZSB0aGUgbmV3IGZpbGUgaXMgd3JpdHRlbi4gVGhlIG9ubHkgd2F5IHRv
IGFwcGVuZCB0byBhbiBleGlzdGluZyBmaWxlIGlzCnRvIHBhc3MgYSByZWZl
cmVuY2UgdG8gYSBmaWxlIG9wZW5lZCBpbiBhcHBlbmQgbW9kZS4KClRoaXMg
bWV0aG9kIHJldHVybnMgdW5kZWYgaWYgdGhlcmUgaXMgYW4gZXJyb3IsIGVs
c2UgdGhlIHN0cmluZyB0aGF0IHdhcwp3cml0dGVuIHRvIHRoZSBmaWxlLgoK
PWhlYWQxIEFQT0xPR0lBCgpUaGlzIG1vZHVsZSB3YXMgd3JpdHRlbiB0byBm
aWxsIG15IG5lZWQgZm9yIGEgdHJ1bHkgdmVyc2F0aWxlLCBzdWZmaWNpZW50
bHkKcG93ZXJmdWwgd2F5IG9mIGhhbmRsaW5nIHBob25vbG9naWVzLiBUaGUg
ZXhpc3RpbmcgUGVybCB0b29scwooTGluZ3VhOjpTb3VuZENoYW5nZSBhbmQg
TGluZ3VhOjpGZWF0dXJlTWF0cml4KSB3b3JrZWQgd2VsbCBlbm91Z2ggZm9y
IHdoYXQKdGhleSBkaWQsIGJ1dCB0aGV5IGFsbCBsYWNrZWQgc29tZSBmdW5j
dGlvbmFsaXR5IHRoYXQgSSBjb25zaWRlcmVkCmltcG9ydGFudC4gVGh1cywg
SSBkZWNpZGVkIHRvIG1ha2UgbXkgb3duIHRvb2wuIEkgaGF2ZSB0byBhIGNl
cnRhaW4gZXh0ZW50CnJlaW52ZW50ZWQgdGhlIHdoZWVsLCBidXQgSSBwcmVm
ZXIgdG8gdGhpbmsgb2YgaXQgYXMgcmVwbGFjaW5nIHRoZSB3aGVlbAp3aXRo
IGEgamV0IGVuZ2luZSwgc2luY2UgTGluZ3VhOjpQaG9ub2xvZ3kgaXMgbXVj
aCBtb3JlIHBvd2VyZnVsIHRoYW4gdGhlCmV4aXN0aW5nIG1vZHVsZXMuCgpO
b25ldGhlbGVzcywgSSBhbSBpbnRlcmVzdGVkIGluIGludGVncmF0aW5nIHdp
dGggZXhpc3RpbmcgdG9vbHMsIGVzcGVjaWFsbHkKb25lcyB0aGF0IGFyZSB3
aWRlbHkgdXNlZCBhbmQgd291bGQgYmUgdXNlZnVsIHRvIG90aGVycy4gRmVl
bCBmcmVlIHRvIHNlbmQKbWUgc3VnZ2VzdGlvbnMsIG9yIHRvIG1ha2UgeW91
ciBvd24gbW9kdWxlIGludGVyZmFjaW5nIExpbmd1YTo6UGhvbm9sb2d5Cndp
dGggd2hhdGV2ZXIgZWxzZS4KCj1oZWFkMSBCVUdTCgpQcm9iYWJseS4gUGxl
YXNlIHNlbmQgYnVnIHJlcG9ydHMgYW5kIGNvZGUgaW1wcm92ZW1lbnRzIHRv
IHRoZSBhdXRob3IuCgo9aGVhZDEgU0VFIEFMU08KCkw8TGluZ3VhOjpQaG9u
b2xvZ3k6OkZlYXR1cmVzPgoKTDxMaW5ndWE6OlBob25vbG9neTo6U3ltYm9s
cz4KCkw8TGluZ3VhOjpQaG9ub2xvZ3k6OlNlZ21lbnQ+CgpMPExpbmd1YTo6
UGhvbm9sb2d5OjpSdWxlcz4KCkw8TGluZ3VhOjpQaG9ub2xvZ3k6OlN5bGxh
YmxlPgoKTDxMaW5ndWE6OlBob25vbG9neTo6RnVuY3Rpb25zPgoKPWhlYWQx
IEFVVEhPUgoKSmVzc2UgUy4gQmFuZ3MgPEY8amFzcGF4QHUud2FzaGluZ3Rv
bi5lZHU+Pi4KCj1oZWFkMSBMSUNFTlNFCgpUaGlzIG1vZHVsZSBpcyBmcmVl
IHNvZnR3YXJlLiBZb3UgY2FuIGRpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSBp
dCB1bmRlciB0aGUKc2FtZSB0ZXJtcyBhcyBQZXJsIGl0c2VsZi4KCj1jdXQK
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAABQaG9ub2xvZ3kvQ29tbW9uLnBtAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDEwMDY2NAAwMDAxNzUy
ADAwMDE3NTIAMDAwMDAwMDYxNzAAMDc3NTUwNjQ3MTcAMDE0MjE1ACAwAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAHVzdGFyICAAamFzcGF4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AABqYXNwYXgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMhL3Vzci9i
aW4vcGVybAoKcGFja2FnZSBMaW5ndWE6OlBob25vbG9neTo6Q29tbW9uOwoK
PWhlYWQxIE5BTUUKCkxpbmd1YTo6UGhvbm9sb2d5OjpDb21tb24gLSBmdW5j
dGlvbnMgdXNlZCBieSBhbGwgbW9kdWxlcyBpbiBMaW5ndWE6OlBob25vbG9n
eS4KCj1oZWFkMSBTWU5PUFNJUwoKICAgIHVzZSBMaW5ndWE6OlBob25vbG9n
eTo6Q29tbW9uOwoKVGhpcyBtb2R1bGUgaXMgZm9yIGludGVybmFsIHVzZSBv
bmx5LiBZb3UgZG9uJ3QgbmVlZCBpdCBtb2R1bGUgdW5sZXNzIHlvdSdyZQpk
ZXZlbG9waW5nIGZvciBMaW5ndWE6OlBob25vbG9neS4gSWYgeW91IGFyZSwg
cmVhZCB0aGUgc291cmNlIGNvZGUuCgo9Y3V0CgojIFdlIGV4cG9ydCBldmVy
eXRoaW5nLiBTaW5jZSB0aGlzIGlzIG9ubHkgZm9yIGludGVybmFsIHVzZSwg
d2Uga25vdyB3aGF0IHdlJ3JlCiMgZ2V0dGluZywgYW5kIHRoZSBmdW5jcyBh
bGwgYmVnaW4gd2l0aCBfLCBzbyBhcmUgdW5saWtlbHkgdG8gY2xhc2ggYW55
d2F5CkBJU0EgPSBxdyhFeHBvcnRlcik7CkBFWFBPUlQgPSBxdygKCWVycgoJ
X2lzCglfaXNfZmVhdHVyZXMKCV9pc19zeW1ib2xzCglfaXNfc3lsbGFibGUK
CV9pc19zZWcKCV9pc19ib3VuZGFyeQoJX2lzX3J1bGVzZWcKICAgIF90b19o
YW5kbGUKCV9wYXJzZV9mcm9tX2ZpbGUKCV9wYXJzZV9mcm9tX3N0cmluZwoJ
X3N0cmluZ19mcm9tX3N0cnVjdAopOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5p
bmdzOjpyZWdpc3RlcigpOwoKdXNlIENhcnA7CnVzZSBJTzo6SGFuZGxlOwp1
c2UgWE1MOjpTaW1wbGU7CgojIEdsb2JhbCB2YXJpYWJsZXMuIEluIHByaW5j
aXBsZSwgbW9kdWxlcyB1c2luZyB0aGlzIG1vZHVsZSBjYW4gY2hhbmdlIHRo
ZXNlIGlmCiMgdGhleSB3YW50LCBidXQgdGhleSBwcm9iYWJseSBzaG91bGRu
J3QgbGVzdCBldmlsIHRoaW5ncyB0cmFuc3BpcmUuCm91ciAleG1saW5fb3B0
cyA9ICgpOwpvdXIgJXhtbG91dF9vcHRzID0gKCk7CgojIE91ciBlcnJvciB3
cml0ZXIKc3ViIGVyciAoJCkgewoJY2FycCBzaGlmdCBpZiB3YXJuaW5nczo6
ZW5hYmxlZCgpOwoJcmV0dXJuOwp9CgojIENvbmNpc2Ugc3lub255bSBmb3Ig
VU5JVkVSU0FMOjppc2EoKSB3aXRoIGF1dG9tYXRpYyBlcnJvci13cml0aW5n
CnN1YiBfaXMoJCQpIHsKCXJldHVybiAxIGlmIFVOSVZFUlNBTDo6aXNhKEBf
KTsKCXJldHVybjsKfQoKIyBFeHRlbnNpb25zIG9mIF9pcyBmb3Igb3VyIG93
biBjbGFzc2VzCnN1YiBfaXNfZmVhdHVyZXMgKCQpIHsgX2lzKHNoaWZ0LCAn
TGluZ3VhOjpQaG9ub2xvZ3k6OkZlYXR1cmVzJykgfQpzdWIgX2lzX3N5bWJv
bHMgKCQpIHsgX2lzKHNoaWZ0LCAnTGluZ3VhOjpQaG9ub2xvZ3k6OlN5bWJv
bHMnKSB9CnN1YiBfaXNfc3lsbGFibGUgKCQpIHsgX2lzKHNoaWZ0LCAnTGlu
Z3VhOjpQaG9ub2xvZ3k6OlN5bGxhYmxlJykgfQpzdWIgX2lzX3NlZyAoJCkg
eyBfaXMoc2hpZnQsICdMaW5ndWE6OlBob25vbG9neTo6U2VnbWVudCcpIH0K
c3ViIF9pc19ib3VuZGFyeSAoJCkgeyBfaXMoc2hpZnQsICdMaW5ndWE6OlBo
b25vbG9neTo6U2VnbWVudDo6Qm91bmRhcnknKSB9CnN1YiBfaXNfcnVsZXNl
ZyAoJCkgeyBfaXMoc2hpZnQsICdMaW5ndWE6OlBob25vbG9neTo6U2VnbWVu
dDo6UnVsZXMnKSB9CgojIE1ha2UgYSBoYW5kbGUgZnJvbSBhIGZpbGVuYW1l
OyBkb24ndCB0b3VjaCBleGlzdGluZyBoYW5kbGVzCnN1YiBfdG9faGFuZGxl
KCQkKSB7CiAgICBteSAoJGZpbGUsICRtb2RlKSA9IHNoaWZ0OwogICAgcmV0
dXJuICRmaWxlIGlmIF9pcygkZmlsZSwgJ0dMT0InKTsKCiAgICBteSAkaGFu
ZGxlID0gSU86OkhhbmRsZS0+bmV3KCk7CiAgICBvcGVuICRoYW5kbGUsICRt
b2RlLCAkZmlsZSBvciByZXR1cm4gZXJyICJDb3VsZG4ndCBvcGVuICRmaWxl
OiAkISI7CiAgICByZXR1cm4gJGhhbmRsZTsKfQoKIyBHZXQgdGhlIHBhcnNl
ZCBYTUwgc3RydWN0dXJlIGZyb20gYSBmaWxlbmFtZS4gT3B0aW9uYWwgc2Vj
b25kIGFyZyBzcGVjaWZpZXMKIyB3aGljaCBrZXkgb2YgdGhlIHBhcnNlIHRv
IHJldHVybi4gWW91J2QgYmV0dGVyIHNwZWNpZnkgYSBrZXkgdGhhdCdzIHBy
ZXNlbnQKIyBvbiB0aGUgdG9wbW9zdCBsZXZlbCBvZiB0aGUgcGFyc2UtLXRo
aXMgbWV0aG9kIHdvbid0IGxvb2sgdGhyb3VnaCB0aGUgd2hvbGUKIyBzdHJ1
Y3R1cmUgZm9yIHlvdSwgbGlrZSB0aGUgcHJldmlvdXMgdmVyc2lvbiBkaWQu
CgpzdWIgX3BhcnNlX2Zyb21fZmlsZSAoJDskKSB7CglteSAkZmlsZSA9IHNo
aWZ0OwoKCSMgT3Blbiwgc2x1cnAsIGNsb3NlCiAgICAkZmlsZSA9IF90b19o
YW5kbGUoJGZpbGUsICc8Jykgb3IgcmV0dXJuOwoJbXkgJHN0cmluZyA9IGpv
aW4gJycsIDwkZmlsZT47CgljbG9zZSAkZmlsZTsKCglyZXR1cm4gX3BhcnNl
X2Zyb21fc3RyaW5nKCRzdHJpbmcsIEBfKTsKfQoKc3ViIF9wYXJzZV9mcm9t
X3N0cmluZyAoJDskKSB7CglteSAoJHN0cmluZywgJGVsZW1lbnQpID0gQF87
CgoJIyBQYXJzZSB0aGUgc3RyaW5nLCBjaGVjayBmb3IgZXJyb3JzCglteSAk
cGFyc2U7CglldmFsIHsgJHBhcnNlID0gWE1MaW4oJHN0cmluZywgJXhtbGlu
X29wdHMpIH07CglyZXR1cm4gZXJyICJYTUwgcGFyc2luZyBlcnJvcjogJEAi
IGlmICgkQCk7CgoJaWYgKGRlZmluZWQgJGVsZW1lbnQpIHsKCQlyZXR1cm4g
JHBhcnNlLT57ZWxlbWVudH0gaWYgZXhpc3RzICRwYXJzZS0+e2VsZW1lbnR9
OwoJCXJldHVybiBlcnIgIjwkZWxlbWVudD4gZWxlbWVudCBub3QgZm91bmQi
OwoJfQoJcmV0dXJuICRwYXJzZTsKfQoKIyBUdXJuIGEgZGF0YSBzdHJ1Y3R1
cmUgaW50byBhbiBYTUwgc3RyaW5nCnN1YiBfc3RyaW5nX2Zyb21fc3RydWN0
ICgkKSB7CglteSAkc3RydWN0ID0gc2hpZnQ7CgoJbXkgJHN0cmluZzsKCWV2
YWwgeyAkc3RyaW5nID0gWE1Mb3V0KCRzdHJ1Y3QsICV4bWxvdXRfb3B0cykg
fTsKCXJldHVybiBlcnIgIkVycm9yIGNyZWF0aW5nIFhNTDogJEAiIGlmICRA
OwoKCXJldHVybiAkc3RyaW5nOwp9CgoxOwoKCj1oZWFkMSBBVVRIT1IKCkpl
c3NlIFMuIEJhbmdzIDxGPGphc3BheEB1Lndhc2hpbmd0b24uZWR1Pj4uCgo9
aGVhZDEgTElDRU5TRQoKVGhpcyBtb2R1bGUgaXMgZnJlZSBzb2Z0d2FyZS4g
WW91IGNhbiBkaXN0cmlidXRlIGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhl
CnNhbWUgdGVybXMgYXMgUGVybCBpdHNlbGYuCgo9Y3V0CgAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAA=

---1936847036-504407799-1068788595=:52030--