[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--