From: Gavin Sinclair Date: 2004-11-23T16:55:06+09:00 Subject: Please commit erb.rb ------------93BF1902D0C762C Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Folks, James Edward Gray II has kindly documented lib/erb.rb. If I had commit priveleges (I'm working on that) I'd commit it myself. Can someone please commit the attached file to HEAD and ruby_1_8 branch? I've checked: there are no code changes, only documentation. Thanks, Gavin ------------93BF1902D0C762C Content-Type: application/octet-stream; name="erb.rb" Content-transfer-encoding: base64 Content-Disposition: attachment; filename="erb.rb" IyA9IEVSQiAtLSBSdWJ5IFRlbXBsYXRpbmcNCiMNCiMgQXV0aG9yOjogTWFzYXRvc2hpIFNF S0kNCiMgRG9jdW1lbnRhdGlvbjo6IEphbWVzIEVkd2FyZCBHcmF5IElJIGFuZCBHYXZpbiBT aW5jbGFpcg0KIw0KIyBTZWUgRVJCIGZvciBwcmltYXJ5IGRvY3VtZW50YXRpb24gYW5kIEVS Qjo6VXRpbCBmb3IgYSBjb3VwbGUgb2YgdXRpbGl0eQ0KIyByb3V0aW5lcy4NCiMNCiMgQ29w eXJpZ2h0IChjKSAxOTk5LTIwMDAsMjAwMiwyMDAzIE1hc2F0b3NoaSBTRUtJDQojDQojIFlv dSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHNhbWUg dGVybXMgYXMgUnVieS4NCg0KIw0KIyA9IEVSQiAtLSBSdWJ5IFRlbXBsYXRpbmcNCiMNCiMg PT0gSW50cm9kdWN0aW9uDQojDQojIEVSQiBwcm92aWRlcyBhbiBlYXN5IHRvIHVzZSBidXQg cG93ZXJmdWwgdGVtcGxhdGluZyBzeXN0ZW0gZm9yIFJ1YnkuICBVc2luZw0KIyBFUkIsIGFj dHVhbCBSdWJ5IGNvZGUgY2FuIGJlIGFkZGVkIHRvIGFueSBwbGFpbiB0ZXh0IGRvY3VtZW50 IGZvciB0aGUNCiMgcHVycG9zZXMgb2YgZ2VuZXJhdGluZyBkb2N1bWVudCBpbmZvcm1hdGlv biBkZXRhaWxzIGFuZC9vciBmbG93IGNvbnRyb2wuDQojDQojIEEgdmVyeSBzaW1wbGUgZXhh bXBsZSBpcyB0aGlzOg0KIyANCiMgICByZXF1aXJlICdlcmInDQojDQojICAgeCA9IDQyDQoj ICAgdGVtcGxhdGUgPSBFUkIubmV3IDw8LUVPRg0KIyAgICAgVGhlIHZhbHVlIG9mIHggaXM6 IDwlPSB4ICU+DQojICAgRU9GDQojICAgcHV0cyB0ZW1wbGF0ZS5yZXN1bHQoYmluZGluZykN CiMNCiMgPGVtPlByaW50czo8L2VtPiBUaGUgdmFsdWUgb2YgeCBpczogNDINCiMNCiMgTW9y ZSBjb21wbGV4IGV4YW1wbGVzIGFyZSBnaXZlbiBiZWxvdy4NCiMNCiMNCiMgPT0gUmVjb2du aXplZCBUYWdzDQojDQojIEVSQiByZWNvZ25pemVzIGNlcnRhaW4gdGFncyBpbiB0aGUgcHJv dmlkZWQgdGVtcGxhdGUgYW5kIGNvbnZlcnRzIHRoZW0gYmFzZWQNCiMgb24gdGhlIHJ1bGVz IGJlbG93Og0KIw0KIyAgIDwlIFJ1YnkgY29kZSAtLSBpbmxpbmUgd2l0aCBvdXRwdXQgJT4N CiMgICA8JT0gUnVieSBleHByZXNzaW9uIC0tIHJlcGxhY2Ugd2l0aCByZXN1bHQgJT4NCiMg ICA8JSMgY29tbWVudCAtLSBpZ25vcmVkIC0tIHVzZWZ1bCBpbiB0ZXN0aW5nICU+DQojICAg JSBhIGxpbmUgb2YgUnVieSBjb2RlIC0tIHRyZWF0ZWQgYXMgPCUgbGluZSAlPiAob3B0aW9u YWwgLS0gc2VlIEVSQi5uZXcpDQojICAgJSUgcmVwbGFjZWQgd2l0aCAlIGlmIGZpcnN0IHRo aW5nIG9uIGEgbGluZSBhbmQgJSBwcm9jZXNzaW5nIGlzIHVzZWQNCiMgICA8JSUgb3IgJSU+ IC0tIHJlcGxhY2Ugd2l0aCA8JSBvciAlPiByZXNwZWN0aXZlbHkNCiMNCiMgQWxsIG90aGVy IHRleHQgaXMgcGFzc2VkIHRocm91Z2ggRVJCIGZpbHRlcmluZyB1bmNoYW5nZWQuDQojDQoj DQojID09IE9wdGlvbnMNCiMNCiMgVGhlcmUgYXJlIHNldmVyYWwgc2V0dGluZ3MgeW91IGNh biBjaGFuZ2Ugd2hlbiB5b3UgdXNlIEVSQjoNCiMgKiB0aGUgbmF0dXJlIG9mIHRoZSB0YWdz IHRoYXQgYXJlIHJlY29nbml6ZWQ7DQojICogdGhlIHZhbHVlIG9mIDx0dD4kU0FGRTwvdHQ+ IHVuZGVyIHdoaWNoIHRoZSB0ZW1wbGF0ZSBpcyBydW47DQojICogdGhlIGJpbmRpbmcgdXNl ZCB0byByZXNvbHZlIGxvY2FsIHZhcmlhYmxlcyBpbiB0aGUgdGVtcGxhdGUuDQojDQojIFNl ZSB0aGUgRVJCLm5ldyBhbmQgRVJCI3Jlc3VsdCBtZXRob2RzIGZvciBtb3JlIGRldGFpbC4N CiMNCiMNCiMgPT0gRXhhbXBsZXMNCiMNCiMgPT09IFBsYWluIFRleHQNCiMNCiMgRVJCIGlz IHVzZWZ1bCBmb3IgYW55IGdlbmVyaWMgdGVtcGxhdGluZyBzaXR1YXRpb24uICBOb3RlIHRo YXQgaW4gdGhpcyBleGFtcGxlLCB3ZSB1c2UgdGhlDQojIGNvbnZlbmllbnQgIiUgYXQgc3Rh cnQgb2YgbGluZSIgdGFnLCBhbmQgd2UgcXVvdGUgdGhlIHRlbXBsYXRlIGxpdGVyYWxseSB3 aXRoDQojIDx0dD4lcXsuLi59PC90dD4gdG8gYXZvaWQgdHJvdWJsZSB3aXRoIHRoZSBiYWNr c2xhc2guDQojDQojICAgcmVxdWlyZSAiZXJiIg0KIyAgIA0KIyAgICMgQ3JlYXRlIHRlbXBs YXRlLg0KIyAgIHRlbXBsYXRlID0gJXF7DQojICAgICBGcm9tOiAgSmFtZXMgRWR3YXJkIEdy YXkgSUkgPGphbWVzQGdyYXlwcm9kdWN0aW9ucy5uZXQ+DQojICAgICBUbzogIDwlPSB0byAl Pg0KIyAgICAgU3ViamVjdDogIEFkZHJlc3NpbmcgTmVlZHMNCiMgICANCiMgICAgIDwlPSB0 b1svXHcrL10gJT46DQojICAgDQojICAgICBKdXN0IHdhbnRlZCB0byBzZW5kIGEgcXVpY2sg bm90ZSBhc3N1cmluZyB0aGF0IHlvdXIgbmVlZHMgYXJlIGJlaW5nDQojICAgICBhZGRyZXNz ZWQuDQojICAgDQojICAgICBJIHdhbnQgeW91IHRvIGtub3cgdGhhdCBteSB0ZWFtIHdpbGwg a2VlcCB3b3JraW5nIG9uIHRoZSBpc3N1ZXMsDQojICAgICBlc3BlY2lhbGx5Og0KIyAgIA0K IyAgICAgPCUjIGlnbm9yZSBudW1lcm91cyBtaW5vciByZXF1ZXN0cyAtLSBmb2N1cyBvbiBw cmlvcml0aWVzICU+DQojICAgICAlIHByaW9yaXRpZXMuZWFjaCBkbyB8cHJpb3JpdHl8DQoj ICAgICAgICogPCU9IHByaW9yaXR5ICU+DQojICAgICAlIGVuZA0KIyAgIA0KIyAgICAgVGhh bmtzIGZvciB5b3VyIHBhdGllbmNlLg0KIyAgIA0KIyAgICAgSmFtZXMgRWR3YXJkIEdyYXkg SUkNCiMgICB9LmdzdWIoL14gIC8sICcnKQ0KIyAgIA0KIyAgIG1lc3NhZ2UgPSBFUkIubmV3 KHRlbXBsYXRlLCAwLCAiJTw+IikNCiMgICANCiMgICAjIFNldCB1cCB0ZW1wbGF0ZSBkYXRh Lg0KIyAgIHRvID0gIkNvbW11bml0eSBTcG9rZXNtYW4gPHNwb2tlc21hbkBydWJ5X2NvbW11 bml0eS5vcmc+Ig0KIyAgIHByaW9yaXRpZXMgPSBbICJSdW4gUnVieSBRdWl6IiwNCiMgICAg ICAgICAgICAgICAgICAiRG9jdW1lbnQgTW9kdWxlcyIsDQojICAgICAgICAgICAgICAgICAg IkFuc3dlciBRdWVzdGlvbnMgb24gUnVieSBUYWxrIiBdDQojICAgDQojICAgIyBQcm9kdWNl IHJlc3VsdC4NCiMgICBlbWFpbCA9IG1lc3NhZ2UucmVzdWx0DQojICAgcHV0cyBlbWFpbA0K Iw0KIyA8aT5HZW5lcmF0ZXM6PC9pPg0KIw0KIyAgIEZyb206ICBKYW1lcyBFZHdhcmQgR3Jh eSBJSSA8amFtZXNAZ3JheXByb2R1Y3Rpb25zLm5ldD4NCiMgICBUbzogIENvbW11bml0eSBT cG9rZXNtYW4gPHNwb2tlc21hbkBydWJ5X2NvbW11bml0eS5vcmc+DQojICAgU3ViamVjdDog IEFkZHJlc3NpbmcgTmVlZHMNCiMgICANCiMgICBDb21tdW5pdHk6DQojICAgDQojICAgSnVz dCB3YW50ZWQgdG8gc2VuZCBhIHF1aWNrIG5vdGUgYXNzdXJpbmcgdGhhdCB5b3VyIG5lZWRz IGFyZSBiZWluZyBhZGRyZXNzZWQuDQojICAgDQojICAgSSB3YW50IHlvdSB0byBrbm93IHRo YXQgbXkgdGVhbSB3aWxsIGtlZXAgd29ya2luZyBvbiB0aGUgaXNzdWVzLCBlc3BlY2lhbGx5 Og0KIyAgIA0KIyAgICAgICAqIFJ1biBSdWJ5IFF1aXoNCiMgICAgICAgKiBEb2N1bWVudCBN b2R1bGVzDQojICAgICAgICogQW5zd2VyIFF1ZXN0aW9ucyBvbiBSdWJ5IFRhbGsNCiMgICAN CiMgICBUaGFua3MgZm9yIHlvdXIgcGF0aWVuY2UuDQojICAgDQojICAgSmFtZXMgRWR3YXJk IEdyYXkgSUkNCiMNCiMgPT09IFJ1YnkgaW4gSFRNTA0KIw0KIyBFUkIgaXMgb2Z0ZW4gdXNl ZCBpbiA8dHQ+LnJodG1sPC90dD4gZmlsZXMgKEhUTUwgd2l0aCBlbWJlZGRlZCBSdWJ5KS4g IE5vdGljZSB0aGUgbmVlZCBpbg0KIyB0aGlzIGV4YW1wbGUgdG8gcHJvdmlkZSBhIHNwZWNp YWwgYmluZGluZyB3aGVuIHRoZSB0ZW1wbGF0ZSBpcyBydW4sIHNvIHRoYXQgdGhlIGluc3Rh bmNlDQojIHZhcmlhYmxlcyBpbiB0aGUgUHJvZHVjdCBvYmplY3QgY2FuIGJlIHJlc29sdmVk Lg0KIw0KIyAgIHJlcXVpcmUgImVyYiINCiMgICANCiMgICAjIEJ1aWxkIHRlbXBsYXRlIGRh dGEgY2xhc3MuDQojICAgY2xhc3MgUHJvZHVjdA0KIyAgICAgZGVmIGluaXRpYWxpemUoIGNv ZGUsIG5hbWUsIGRlc2MsIGNvc3QgKQ0KIyAgICAgICBAY29kZSA9IGNvZGUNCiMgICAgICAg QG5hbWUgPSBuYW1lDQojICAgICAgIEBkZXNjID0gZGVzYw0KIyAgICAgICBAY29zdCA9IGNv c3QNCiMgICAgICAgIAkNCiMgICAgICAgQGZlYXR1cmVzID0gWyBdDQojICAgICBlbmQNCiMg ICANCiMgICAgIGRlZiBhZGRfZmVhdHVyZSggZmVhdHVyZSApDQojICAgICAgIEBmZWF0dXJl cyA8PCBmZWF0dXJlDQojICAgICBlbmQNCiMgICANCiMgICAgICMgU3VwcG9ydCB0ZW1wbGF0 aW5nIG9mIG1lbWJlciBkYXRhLg0KIyAgICAgZGVmIGdldF9iaW5kaW5nDQojICAgICAgIGJp bmRpbmcNCiMgICAgIGVuZA0KIyAgIA0KIyAgICAgIyAuLi4NCiMgICBlbmQNCiMgICANCiMg ICAjIENyZWF0ZSB0ZW1wbGF0ZS4NCiMgICB0ZW1wbGF0ZSA9ICV7DQojICAgICA8aHRtbD4N CiMgICAgICAgPGhlYWQ+PHRpdGxlPlJ1YnkgVG95cyAtLSA8JT0gQG5hbWUgJT48L3RpdGxl PjwvaGVhZD4NCiMgICAgICAgPGJvZHk+DQojICAgDQojICAgICAgICAgPGgxPjwlPSBAbmFt ZSAlPiAoPCU9IEBjb2RlICU+KTwvaDE+DQojICAgICAgICAgPHA+PCU9IEBkZXNjICU+PC9w Pg0KIyAgIA0KIyAgICAgICAgIDx1bD4NCiMgICAgICAgICAgIDwlIEBmZWF0dXJlcy5lYWNo IGRvIHxmfCAlPg0KIyAgICAgICAgICAgICA8bGk+PGI+PCU9IGYgJT48L2I+PC9saT4NCiMg ICAgICAgICAgIDwlIGVuZCAlPg0KIyAgICAgICAgIDwvdWw+DQojICAgDQojICAgICAgICAg PHA+DQojICAgICAgICAgICA8JSBpZiBAY29zdCA8IDEwICU+DQojICAgICAgICAgICAgIDxi Pk9ubHkgPCU9IEBjb3N0ICU+ISEhPC9iPg0KIyAgICAgICAgICAgPCUgZWxzZSAlPg0KIyAg ICAgICAgICAgICAgQ2FsbCBmb3IgYSBwcmljZSwgdG9kYXkhDQojICAgICAgICAgICA8JSBl bmQgJT4NCiMgICAgICAgICA8L3A+DQojICAgIA0KIyAgICAgICA8L2JvZHk+DQojICAgICA8 L2h0bWw+DQojICAgfS5nc3ViKC9eICAvLCAnJykNCiMgICANCiMgICByaHRtbCA9IEVSQi5u ZXcodGVtcGxhdGUpDQojICAgDQojICAgIyBTZXQgdXAgdGVtcGxhdGUgZGF0YS4NCiMgICB0 b3kgPSBQcm9kdWN0Lm5ldyggIlRaLTEwMDIiLA0KIyAgICAgICAgICAgICAgICAgICAgICAi UnVieXNhcGllbiIsDQojICAgICAgICAgICAgICAgICAgICAgICJHZWVrJ3MgQmVzdCBGcmll bmQhICBSZXNwb25kcyB0byBSdWJ5IGNvbW1hbmRzLi4uIiwNCiMgICAgICAgICAgICAgICAg ICAgICAgOTk5Ljk1ICkNCiMgICB0b3kuYWRkX2ZlYXR1cmUoIkxpc3RlbnMgZm9yIHZlcmJh bCBjb21tYW5kcyBpbiB0aGUgUnVieSBsYW5ndWFnZSEiKQ0KIyAgIHRveS5hZGRfZmVhdHVy ZSgiSWdub3JlcyBQZXJsLCBKYXZhLCBhbmQgYWxsIEMgdmFyaWFudHMuIikNCiMgICB0b3ku YWRkX2ZlYXR1cmUoIkthcmF0ZS1DaG9wIEFjdGlvbiEhISIpDQojICAgdG95LmFkZF9mZWF0 dXJlKCJNYXR6IHNpZ25hdHVyZSBvbiBsZWZ0IGxlZy4iKQ0KIyAgIHRveS5hZGRfZmVhdHVy ZSgiR2VtIHN0dWRkZWQgZXllcy4uLiBSdWJpZXMsIG9mIGNvdXJzZSEiKQ0KIyAgIA0KIyAg ICMgUHJvZHVjZSByZXN1bHQuDQojICAgcmh0bWwucnVuKHRveS5nZXRfYmluZGluZykNCiMN CiMgPGk+R2VuZXJhdGVzIChzb21lIGJsYW5rIGxpbmVzIHJlbW92ZWQpOjwvaT4NCiMNCiMg ICAgPGh0bWw+DQojICAgICAgPGhlYWQ+PHRpdGxlPlJ1YnkgVG95cyAtLSBSdWJ5c2FwaWVu PC90aXRsZT48L2hlYWQ+DQojICAgICAgPGJvZHk+DQojICAgIA0KIyAgICAgICAgPGgxPlJ1 YnlzYXBpZW4gKFRaLTEwMDIpPC9oMT4NCiMgICAgICAgIDxwPkdlZWsncyBCZXN0IEZyaWVu ZCEgIFJlc3BvbmRzIHRvIFJ1YnkgY29tbWFuZHMuLi48L3A+DQojICAgIA0KIyAgICAgICAg PHVsPg0KIyAgICAgICAgICAgIDxsaT48Yj5MaXN0ZW5zIGZvciB2ZXJiYWwgY29tbWFuZHMg aW4gdGhlIFJ1YnkgbGFuZ3VhZ2UhPC9iPjwvbGk+DQojICAgICAgICAgICAgPGxpPjxiPkln bm9yZXMgUGVybCwgSmF2YSwgYW5kIGFsbCBDIHZhcmlhbnRzLjwvYj48L2xpPg0KIyAgICAg ICAgICAgIDxsaT48Yj5LYXJhdGUtQ2hvcCBBY3Rpb24hISE8L2I+PC9saT4NCiMgICAgICAg ICAgICA8bGk+PGI+TWF0eiBzaWduYXR1cmUgb24gbGVmdCBsZWcuPC9iPjwvbGk+DQojICAg ICAgICAgICAgPGxpPjxiPkdlbSBzdHVkZGVkIGV5ZXMuLi4gUnViaWVzLCBvZiBjb3Vyc2Uh PC9iPjwvbGk+DQojICAgICAgICA8L3VsPg0KIyAgICANCiMgICAgICAgIDxwPg0KIyAgICAg ICAgICAgICBDYWxsIGZvciBhIHByaWNlLCB0b2RheSENCiMgICAgICAgIDwvcD4NCiMgICAg DQojICAgICAgPC9ib2R5Pg0KIyAgICA8L2h0bWw+DQojDQojIA0KIyA9PSBOb3Rlcw0KIw0K IyBUaGVyZSBhcmUgYSB2YXJpZXR5IG9mIHRlbXBsYXRpbmcgc29sdXRpb25zIGF2YWlsYWJs ZSBpbiB2YXJpb3VzIFJ1YnkgcHJvamVjdHM6DQojICogRVJCJ3MgYmlnIGJyb3RoZXIsIGVS dWJ5LCB3b3JrcyB0aGUgc2FtZSBidXQgaXMgd3JpdHRlbiBpbiBDIGZvciBzcGVlZDsNCiMg KiBBbXJpdGEgKHNtYXJ0IGF0IHByb2R1Y2luZyBIVE1ML1hNTCk7DQojICogY3MvVGVtcGxh dGUgKHdyaXR0ZW4gaW4gQyBmb3Igc3BlZWQpOw0KIyAqIFJEb2MsIGRpc3RyaWJ1dGVkIHdp dGggUnVieSwgdXNlcyBpdHMgb3duIHRlbXBsYXRlIGVuZ2luZSwgd2hpY2ggY2FuIGJlIHJl dXNlZCBlbHNld2hlcmU7DQojICogYW5kIG90aGVyczsgc2VhcmNoIHRoZSBSQUEuDQojDQoj IFJhaWxzLCB0aGUgd2ViIGFwcGxpY2F0aW9uIGZyYW1ld29yaywgdXNlcyBFUkIgdG8gY3Jl YXRlIHZpZXdzLg0KIw0KY2xhc3MgRVJCDQogIFJldmlzaW9uID0gJyREYXRlOiAyMDA0LzAy LzI4IDAyOjAwOjM3ICQnIAkjJw0KDQogICMgUmV0dXJucyByZXZpc2lvbiBpbmZvcm1hdGlv biBmb3IgdGhlIGVyYi5yYiBtb2R1bGUuDQogIGRlZiBzZWxmLnZlcnNpb24NCiAgICAiZXJi LnJiIFsyLjAuNCAje0VSQjo6UmV2aXNpb24uc3BsaXRbMV19XSINCiAgZW5kDQplbmQNCg0K Iy0tDQojIEVSQjo6Q29tcGlsZXINCmNsYXNzIEVSQg0KICBjbGFzcyBDb21waWxlciAjIDpu b2RvYzoNCiAgICBjbGFzcyBQZXJjZW50TGluZSAjIDpub2RvYzoNCiAgICAgIGRlZiBpbml0 aWFsaXplKHN0cikNCiAgICAgICAgQHZhbHVlID0gc3RyDQogICAgICBlbmQNCiAgICAgIGF0 dHJfcmVhZGVyIDp2YWx1ZQ0KICAgICAgYWxpYXMgOnRvX3MgOnZhbHVlDQogICAgZW5kDQoN CiAgICBjbGFzcyBTY2FubmVyICMgOm5vZG9jOg0KICAgICAgU3BsaXRSZWdleHAgPSAvKDwl JSl8KCUlPil8KDwlPSl8KDwlIyl8KDwlKXwoJT4pfChcbikvDQoNCiAgICAgIEBzY2FubmVy X21hcCA9IHt9DQogICAgICBkZWYgc2VsZi5yZWdpc3Rfc2Nhbm5lcihrbGFzcywgdHJpbV9t b2RlLCBwZXJjZW50KQ0KCUBzY2FubmVyX21hcFtbdHJpbV9tb2RlLCBwZXJjZW50XV0gPSBr bGFzcw0KICAgICAgZW5kDQoNCiAgICAgIGRlZiBzZWxmLmRlZmF1bHRfc2Nhbm5lcj0oa2xh c3MpDQoJQGRlZmF1bHRfc2Nhbm5lciA9IGtsYXNzDQogICAgICBlbmQNCg0KICAgICAgZGVm IHNlbGYubWFrZV9zY2FubmVyKHNyYywgdHJpbV9tb2RlLCBwZXJjZW50KQ0KCWtsYXNzID0g QHNjYW5uZXJfbWFwLmZldGNoKFt0cmltX21vZGUsIHBlcmNlbnRdLCBAZGVmYXVsdF9zY2Fu bmVyKQ0KCWtsYXNzLm5ldyhzcmMsIHRyaW1fbW9kZSwgcGVyY2VudCkNCiAgICAgIGVuZA0K DQogICAgICBkZWYgaW5pdGlhbGl6ZShzcmMsIHRyaW1fbW9kZSwgcGVyY2VudCkNCglAc3Jj ID0gc3JjDQoJQHN0YWcgPSBuaWwNCiAgICAgIGVuZA0KICAgICAgYXR0cl9hY2Nlc3NvciA6 c3RhZw0KDQogICAgICBkZWYgc2NhbjsgZW5kDQogICAgZW5kDQoNCiAgICBjbGFzcyBUcmlt U2Nhbm5lciA8IFNjYW5uZXIgIyA6bm9kb2M6DQogICAgICBUcmltU3BsaXRSZWdleHAgPSAv KDwlJSl8KCUlPil8KDwlPSl8KDwlIyl8KDwlKXwoJT5cbil8KCU+KXwoXG4pLw0KDQogICAg ICBkZWYgaW5pdGlhbGl6ZShzcmMsIHRyaW1fbW9kZSwgcGVyY2VudCkNCglzdXBlcg0KCUB0 cmltX21vZGUgPSB0cmltX21vZGUNCglAcGVyY2VudCA9IHBlcmNlbnQNCglpZiBAdHJpbV9t b2RlID09ICc+Jw0KCSAgQHNjYW5fbGluZSA9IHNlbGYubWV0aG9kKDp0cmltX2xpbmUxKQ0K CWVsc2lmIEB0cmltX21vZGUgPT0gJzw+Jw0KCSAgQHNjYW5fbGluZSA9IHNlbGYubWV0aG9k KDp0cmltX2xpbmUyKQ0KCWVsc2lmIEB0cmltX21vZGUgPT0gJy0nDQoJICBAc2Nhbl9saW5l ID0gc2VsZi5tZXRob2QoOmV4cGxpY2l0X3RyaW1fbGluZSkNCgllbHNlDQoJICBAc2Nhbl9s aW5lID0gc2VsZi5tZXRob2QoOnNjYW5fbGluZSkNCgllbmQNCiAgICAgIGVuZA0KICAgICAg YXR0cl9hY2Nlc3NvciA6c3RhZw0KICAgICAgDQogICAgICBkZWYgc2NhbigmYmxvY2spDQoJ QHN0YWcgPSBuaWwNCglpZiBAcGVyY2VudA0KCSAgQHNyYy5lYWNoIGRvIHxsaW5lfA0KCSAg ICBwZXJjZW50X2xpbmUobGluZSwgJmJsb2NrKQ0KCSAgZW5kDQoJZWxzZQ0KCSAgQHNyYy5l YWNoIGRvIHxsaW5lfA0KCSAgICBAc2Nhbl9saW5lLmNhbGwobGluZSwgJmJsb2NrKQ0KCSAg ZW5kDQoJZW5kDQoJbmlsDQogICAgICBlbmQNCg0KICAgICAgZGVmIHBlcmNlbnRfbGluZShs aW5lLCAmYmxvY2spDQoJaWYgQHN0YWcgfHwgbGluZVswXSAhPSA/JQ0KCSAgcmV0dXJuIEBz Y2FuX2xpbmUuY2FsbChsaW5lLCAmYmxvY2spDQoJZW5kDQoNCglsaW5lWzBdID0gJycNCglp ZiBsaW5lWzBdID09ID8lDQoJICBAc2Nhbl9saW5lLmNhbGwobGluZSwgJmJsb2NrKQ0KCWVs c2UNCiAgICAgICAgICB5aWVsZChQZXJjZW50TGluZS5uZXcobGluZS5jaG9tcCkpDQoJZW5k DQogICAgICBlbmQNCg0KICAgICAgZGVmIHNjYW5fbGluZShsaW5lKQ0KCWxpbmUuc3BsaXQo U3BsaXRSZWdleHApLmVhY2ggZG8gfHRva2VufA0KCSAgbmV4dCBpZiB0b2tlbi5lbXB0eT8N CgkgIHlpZWxkKHRva2VuKQ0KCWVuZA0KICAgICAgZW5kDQoNCiAgICAgIGRlZiB0cmltX2xp bmUxKGxpbmUpDQoJbGluZS5zcGxpdChUcmltU3BsaXRSZWdleHApLmVhY2ggZG8gfHRva2Vu fA0KCSAgbmV4dCBpZiB0b2tlbi5lbXB0eT8NCgkgIGlmIHRva2VuID09ICIlPlxuIg0KCSAg ICB5aWVsZCgnJT4nKQ0KCSAgICB5aWVsZCg6Y3IpDQoJICAgIGJyZWFrDQoJICBlbmQNCgkg IHlpZWxkKHRva2VuKQ0KCWVuZA0KICAgICAgZW5kDQoNCiAgICAgIGRlZiB0cmltX2xpbmUy KGxpbmUpDQoJaGVhZCA9IG5pbA0KCWxpbmUuc3BsaXQoVHJpbVNwbGl0UmVnZXhwKS5lYWNo IGRvIHx0b2tlbnwNCgkgIG5leHQgaWYgdG9rZW4uZW1wdHk/DQoJICBoZWFkID0gdG9rZW4g dW5sZXNzIGhlYWQNCgkgIGlmIHRva2VuID09ICIlPlxuIg0KCSAgICB5aWVsZCgnJT4nKQ0K CSAgICBpZiAgaXNfZXJiX3N0YWc/KGhlYWQpDQoJICAgICAgeWllbGQoOmNyKQ0KCSAgICBl bHNlDQoJICAgICAgeWllbGQoIlxuIikNCgkgICAgZW5kDQoJICAgIGJyZWFrDQoJICBlbmQN CgkgIHlpZWxkKHRva2VuKQ0KCWVuZA0KICAgICAgZW5kDQoNCiAgICAgIEV4cGxpY2l0VHJp bVJlZ2V4cCA9IC8oXlsgXHRdKjwlLSl8KC0lPlxuP1x6KXwoPCUtKXwoLSU+KXwoPCUlKXwo JSU+KXwoPCU9KXwoPCUjKXwoPCUpfCglPil8KFxuKS8NCiAgICAgIGRlZiBleHBsaWNpdF90 cmltX2xpbmUobGluZSkNCglsaW5lLnNwbGl0KEV4cGxpY2l0VHJpbVJlZ2V4cCkuZWFjaCBk byB8dG9rZW58DQoJICBuZXh0IGlmIHRva2VuLmVtcHR5Pw0KCSAgaWYgQHN0YWcubmlsPyAm JiAvWyBcdF0qPCUtLyA9fiB0b2tlbg0KCSAgICB5aWVsZCgnPCUnKQ0KCSAgZWxzaWYgQHN0 YWcgJiYgLy0lPlxuLyA9fiB0b2tlbg0KCSAgICB5aWVsZCgnJT4nKQ0KCSAgICB5aWVsZCg6 Y3IpDQoJICBlbHNpZiBAc3RhZyAmJiB0b2tlbiA9PSAnLSU+Jw0KCSAgICB5aWVsZCgnJT4n KQ0KCSAgZWxzZQ0KCSAgICB5aWVsZCh0b2tlbikNCgkgIGVuZA0KCWVuZA0KICAgICAgZW5k DQoNCiAgICAgIEVSQl9TVEFHID0gJXcoPCU9IDwlIyA8JSkNCiAgICAgIGRlZiBpc19lcmJf c3RhZz8ocykNCglFUkJfU1RBRy5tZW1iZXI/KHMpDQogICAgICBlbmQNCiAgICBlbmQNCg0K ICAgIFNjYW5uZXIuZGVmYXVsdF9zY2FubmVyID0gVHJpbVNjYW5uZXINCg0KICAgIGNsYXNz IFNpbXBsZVNjYW5uZXIgPCBTY2FubmVyICMgOm5vZG9jOg0KICAgICAgZGVmIHNjYW4NCglA c3JjLmVhY2ggZG8gfGxpbmV8DQoJICBsaW5lLnNwbGl0KFNwbGl0UmVnZXhwKS5lYWNoIGRv IHx0b2tlbnwNCgkgICAgbmV4dCBpZiB0b2tlbi5lbXB0eT8NCgkgICAgeWllbGQodG9rZW4p DQoJICBlbmQNCgllbmQNCiAgICAgIGVuZA0KICAgIGVuZA0KICAgIA0KICAgIFNjYW5uZXIu cmVnaXN0X3NjYW5uZXIoU2ltcGxlU2Nhbm5lciwgbmlsLCBmYWxzZSkNCg0KICAgIGJlZ2lu DQogICAgICByZXF1aXJlICdzdHJzY2FuJw0KICAgICAgY2xhc3MgU2ltcGxlU2Nhbm5lcjIg PCBTY2FubmVyICMgOm5vZG9jOg0KICAgICAgICBkZWYgc2Nhbg0KICAgICAgICAgIHN0YWdf cmVnID0gLyguKj8pKDwlJXw8JT18PCUjfDwlfFxufFx6KS8NCiAgICAgICAgICBldGFnX3Jl ZyA9IC8oLio/KSglJT58JT58XG58XHopLw0KICAgICAgICAgIHNjYW5uZXIgPSBTdHJpbmdT Y2FubmVyLm5ldyhAc3JjKQ0KICAgICAgICAgIHdoaWxlICEgc2Nhbm5lci5lb3M/DQogICAg ICAgICAgICBzY2FubmVyLnNjYW4oQHN0YWcgPyBldGFnX3JlZyA6IHN0YWdfcmVnKQ0KICAg ICAgICAgICAgdGV4dCA9IHNjYW5uZXJbMV0NCiAgICAgICAgICAgIGVsZW0gPSBzY2FubmVy WzJdDQogICAgICAgICAgICB5aWVsZCh0ZXh0KSB1bmxlc3MgdGV4dC5lbXB0eT8NCiAgICAg ICAgICAgIHlpZWxkKGVsZW0pIHVubGVzcyBlbGVtLmVtcHR5Pw0KICAgICAgICAgIGVuZA0K ICAgICAgICBlbmQNCiAgICAgIGVuZA0KICAgICAgU2Nhbm5lci5yZWdpc3Rfc2Nhbm5lcihT aW1wbGVTY2FubmVyMiwgbmlsLCBmYWxzZSkNCg0KICAgICAgY2xhc3MgUGVyY2VudFNjYW5u ZXIgPCBTY2FubmVyICMgOm5vZG9jOg0KCWRlZiBzY2FuDQoJICBuZXdfbGluZSA9IHRydWUN CiAgICAgICAgICBzdGFnX3JlZyA9IC8oLio/KSg8JSV8PCU9fDwlI3w8JXxcbnxceikvDQog ICAgICAgICAgZXRhZ19yZWcgPSAvKC4qPykoJSU+fCU+fFxufFx6KS8NCiAgICAgICAgICBz Y2FubmVyID0gU3RyaW5nU2Nhbm5lci5uZXcoQHNyYykNCiAgICAgICAgICB3aGlsZSAhIHNj YW5uZXIuZW9zPw0KCSAgICBpZiBuZXdfbGluZSAmJiBAc3RhZy5uaWw/DQoJICAgICAgaWYg c2Nhbm5lci5zY2FuKC8lJS8pDQoJCXlpZWxkKCclJykNCgkJbmV3X2xpbmUgPSBmYWxzZQ0K CQluZXh0DQoJICAgICAgZWxzaWYgc2Nhbm5lci5zY2FuKC8lLykNCgkJeWllbGQoUGVyY2Vu dExpbmUubmV3KHNjYW5uZXIuc2NhbigvLio/KFxufFx6KS8pLmNob21wKSkNCgkJbmV4dA0K CSAgICAgIGVuZA0KCSAgICBlbmQNCgkgICAgc2Nhbm5lci5zY2FuKEBzdGFnID8gZXRhZ19y ZWcgOiBzdGFnX3JlZykNCiAgICAgICAgICAgIHRleHQgPSBzY2FubmVyWzFdDQogICAgICAg ICAgICBlbGVtID0gc2Nhbm5lclsyXQ0KICAgICAgICAgICAgeWllbGQodGV4dCkgdW5sZXNz IHRleHQuZW1wdHk/DQogICAgICAgICAgICB5aWVsZChlbGVtKSB1bmxlc3MgZWxlbS5lbXB0 eT8NCgkgICAgbmV3X2xpbmUgPSAoZWxlbSA9PSAiXG4iKQ0KICAgICAgICAgIGVuZA0KICAg ICAgICBlbmQNCiAgICAgIGVuZA0KICAgICAgU2Nhbm5lci5yZWdpc3Rfc2Nhbm5lcihQZXJj ZW50U2Nhbm5lciwgbmlsLCB0cnVlKQ0KDQogICAgICBjbGFzcyBFeHBsaWNpdFNjYW5uZXIg PCBTY2FubmVyICMgOm5vZG9jOg0KCWRlZiBzY2FuDQoJICBuZXdfbGluZSA9IHRydWUNCiAg ICAgICAgICBzdGFnX3JlZyA9IC8oLio/KSg8JSV8PCU9fDwlI3w8JS18PCV8XG58XHopLw0K ICAgICAgICAgIGV0YWdfcmVnID0gLyguKj8pKCUlPnwtJT58JT58XG58XHopLw0KICAgICAg ICAgIHNjYW5uZXIgPSBTdHJpbmdTY2FubmVyLm5ldyhAc3JjKQ0KICAgICAgICAgIHdoaWxl ICEgc2Nhbm5lci5lb3M/DQoJICAgIGlmIG5ld19saW5lICYmIEBzdGFnLm5pbD8gJiYgc2Nh bm5lci5zY2FuKC9bIFx0XSo8JS0vKQ0KCSAgICAgIHlpZWxkKCc8JScpDQoJICAgICAgbmV3 X2xpbmUgPSBmYWxzZQ0KCSAgICAgIG5leHQNCgkgICAgZW5kDQoJICAgIHNjYW5uZXIuc2Nh bihAc3RhZyA/IGV0YWdfcmVnIDogc3RhZ19yZWcpDQogICAgICAgICAgICB0ZXh0ID0gc2Nh bm5lclsxXQ0KICAgICAgICAgICAgZWxlbSA9IHNjYW5uZXJbMl0NCgkgICAgbmV3X2xpbmUg PSAoZWxlbSA9PSAiXG4iKQ0KICAgICAgICAgICAgeWllbGQodGV4dCkgdW5sZXNzIHRleHQu ZW1wdHk/DQoJICAgIGlmIGVsZW0gPT0gJy0lPicNCgkgICAgICB5aWVsZCgnJT4nKQ0KCSAg ICAgIGlmIHNjYW5uZXIuc2NhbigvKFxufFx6KS8pDQoJCXlpZWxkKDpjcikNCgkJbmV3X2xp bmUgPSB0cnVlDQoJICAgICAgZW5kDQoJICAgIGVsc2lmIGVsZW0gPT0gJzwlLScNCgkgICAg ICB5aWVsZCgnPCUnKQ0KCSAgICBlbHNlDQoJICAgICAgeWllbGQoZWxlbSkgdW5sZXNzIGVs ZW0uZW1wdHk/DQoJICAgIGVuZA0KICAgICAgICAgIGVuZA0KICAgICAgICBlbmQNCiAgICAg IGVuZA0KICAgICAgU2Nhbm5lci5yZWdpc3Rfc2Nhbm5lcihFeHBsaWNpdFNjYW5uZXIsICct JywgZmFsc2UpDQoNCiAgICByZXNjdWUgTG9hZEVycm9yDQogICAgZW5kDQoNCiAgICBjbGFz cyBCdWZmZXIgIyA6bm9kb2M6DQogICAgICBkZWYgaW5pdGlhbGl6ZShjb21waWxlcikNCglA Y29tcGlsZXIgPSBjb21waWxlcg0KCUBsaW5lID0gW10NCglAc2NyaXB0ID0gIiINCglAY29t cGlsZXIucHJlX2NtZC5lYWNoIGRvIHx4fA0KCSAgcHVzaCh4KQ0KCWVuZA0KICAgICAgZW5k DQogICAgICBhdHRyX3JlYWRlciA6c2NyaXB0DQoNCiAgICAgIGRlZiBwdXNoKGNtZCkNCglA bGluZSA8PCBjbWQNCiAgICAgIGVuZA0KICAgICAgDQogICAgICBkZWYgY3INCglAc2NyaXB0 IDw8IChAbGluZS5qb2luKCc7ICcpKQ0KCUBsaW5lID0gW10NCglAc2NyaXB0IDw8ICJcbiIN CiAgICAgIGVuZA0KICAgICAgDQogICAgICBkZWYgY2xvc2UNCglyZXR1cm4gdW5sZXNzIEBs aW5lDQoJQGNvbXBpbGVyLnBvc3RfY21kLmVhY2ggZG8gfHh8DQoJICBwdXNoKHgpDQoJZW5k DQoJQHNjcmlwdCA8PCAoQGxpbmUuam9pbignOyAnKSkNCglAbGluZSA9IG5pbA0KICAgICAg ZW5kDQogICAgZW5kDQoNCiAgICBkZWYgY29tcGlsZShzKQ0KICAgICAgb3V0ID0gQnVmZmVy Lm5ldyhzZWxmKQ0KDQogICAgICBjb250ZW50ID0gJycNCiAgICAgIHNjYW5uZXIgPSBtYWtl X3NjYW5uZXIocykNCiAgICAgIHNjYW5uZXIuc2NhbiBkbyB8dG9rZW58DQoJaWYgc2Nhbm5l ci5zdGFnLm5pbD8NCgkgIGNhc2UgdG9rZW4NCiAgICAgICAgICB3aGVuIFBlcmNlbnRMaW5l DQoJICAgIG91dC5wdXNoKCIje0BwdXRfY21kfSAje2NvbnRlbnQuZHVtcH0iKSBpZiBjb250 ZW50LnNpemUgPiAwDQoJICAgIGNvbnRlbnQgPSAnJw0KICAgICAgICAgICAgb3V0LnB1c2go dG9rZW4udG9fcykNCiAgICAgICAgICAgIG91dC5jcg0KCSAgd2hlbiA6Y3INCgkgICAgb3V0 LmNyDQoJICB3aGVuICc8JScsICc8JT0nLCAnPCUjJw0KCSAgICBzY2FubmVyLnN0YWcgPSB0 b2tlbg0KCSAgICBvdXQucHVzaCgiI3tAcHV0X2NtZH0gI3tjb250ZW50LmR1bXB9IikgaWYg Y29udGVudC5zaXplID4gMA0KCSAgICBjb250ZW50ID0gJycNCgkgIHdoZW4gIlxuIg0KCSAg ICBjb250ZW50IDw8ICJcbiINCgkgICAgb3V0LnB1c2goIiN7QHB1dF9jbWR9ICN7Y29udGVu dC5kdW1wfSIpDQoJICAgIG91dC5jcg0KCSAgICBjb250ZW50ID0gJycNCgkgIHdoZW4gJzwl JScNCgkgICAgY29udGVudCA8PCAnPCUnDQoJICBlbHNlDQoJICAgIGNvbnRlbnQgPDwgdG9r ZW4NCgkgIGVuZA0KCWVsc2UNCgkgIGNhc2UgdG9rZW4NCgkgIHdoZW4gJyU+Jw0KCSAgICBj YXNlIHNjYW5uZXIuc3RhZw0KCSAgICB3aGVuICc8JScNCgkgICAgICBpZiBjb250ZW50Wy0x XSA9PSA/XG4NCgkJY29udGVudC5jaG9wIQ0KCQlvdXQucHVzaChjb250ZW50KQ0KCQlvdXQu Y3INCgkgICAgICBlbHNlDQoJCW91dC5wdXNoKGNvbnRlbnQpDQoJICAgICAgZW5kDQoJICAg IHdoZW4gJzwlPScNCgkgICAgICBvdXQucHVzaCgiI3tAcHV0X2NtZH0oKCN7Y29udGVudH0p LnRvX3MpIikNCgkgICAgd2hlbiAnPCUjJw0KCSAgICAgICMgb3V0LnB1c2goIiMgI3tjb250 ZW50LmR1bXB9IikNCgkgICAgZW5kDQoJICAgIHNjYW5uZXIuc3RhZyA9IG5pbA0KCSAgICBj b250ZW50ID0gJycNCgkgIHdoZW4gJyUlPicNCgkgICAgY29udGVudCA8PCAnJT4nDQoJICBl bHNlDQoJICAgIGNvbnRlbnQgPDwgdG9rZW4NCgkgIGVuZA0KCWVuZA0KICAgICAgZW5kDQog ICAgICBvdXQucHVzaCgiI3tAcHV0X2NtZH0gI3tjb250ZW50LmR1bXB9IikgaWYgY29udGVu dC5zaXplID4gMA0KICAgICAgb3V0LmNsb3NlDQogICAgICBvdXQuc2NyaXB0DQogICAgZW5k DQoNCiAgICBkZWYgcHJlcGFyZV90cmltX21vZGUobW9kZSkNCiAgICAgIGNhc2UgbW9kZQ0K ICAgICAgd2hlbiAxDQoJcmV0dXJuIFtmYWxzZSwgJz4nXQ0KICAgICAgd2hlbiAyDQoJcmV0 dXJuIFtmYWxzZSwgJzw+J10NCiAgICAgIHdoZW4gMA0KCXJldHVybiBbZmFsc2UsIG5pbF0N CiAgICAgIHdoZW4gU3RyaW5nDQoJcGVyYyA9IG1vZGUuaW5jbHVkZT8oJyUnKQ0KCWlmIG1v ZGUuaW5jbHVkZT8oJy0nKQ0KCSAgcmV0dXJuIFtwZXJjLCAnLSddDQoJZWxzaWYgbW9kZS5p bmNsdWRlPygnPD4nKQ0KCSAgcmV0dXJuIFtwZXJjLCAnPD4nXQ0KCWVsc2lmIG1vZGUuaW5j bHVkZT8oJz4nKQ0KCSAgcmV0dXJuIFtwZXJjLCAnPiddDQoJZWxzZQ0KCSAgW3BlcmMsIG5p bF0NCgllbmQNCiAgICAgIGVsc2UNCglyZXR1cm4gW2ZhbHNlLCBuaWxdDQogICAgICBlbmQN CiAgICBlbmQNCg0KICAgIGRlZiBtYWtlX3NjYW5uZXIoc3JjKQ0KICAgICAgU2Nhbm5lci5t YWtlX3NjYW5uZXIoc3JjLCBAdHJpbV9tb2RlLCBAcGVyY2VudCkNCiAgICBlbmQNCg0KICAg IGRlZiBpbml0aWFsaXplKHRyaW1fbW9kZSkNCiAgICAgIEBwZXJjZW50LCBAdHJpbV9tb2Rl ID0gcHJlcGFyZV90cmltX21vZGUodHJpbV9tb2RlKQ0KICAgICAgQHB1dF9jbWQgPSAncHJp bnQnDQogICAgICBAcHJlX2NtZCA9IFtdDQogICAgICBAcG9zdF9jbWQgPSBbXQ0KICAgIGVu ZA0KICAgIGF0dHJfcmVhZGVyIDpwZXJjZW50LCA6dHJpbV9tb2RlDQogICAgYXR0cl9hY2Nl c3NvciA6cHV0X2NtZCwgOnByZV9jbWQsIDpwb3N0X2NtZA0KICBlbmQNCmVuZA0KDQojLS0N CiMgRVJCDQpjbGFzcyBFUkINCiAgIw0KICAjIENvbnN0cnVjdHMgYSBuZXcgRVJCIG9iamVj dCB3aXRoIHRoZSB0ZW1wbGF0ZSBzcGVjaWZpZWQgaW4gX3N0cl8uDQogICMgDQogICMgQW4g RVJCIG9iamVjdCB3b3JrcyBieSBidWlsZGluZyBhIGNodW5rIG9mIFJ1YnkgY29kZSB0aGF0 IHdpbGwgb3V0cHV0DQogICMgdGhlIGNvbXBsZXRlZCB0ZW1wbGF0ZSB3aGVuIHJ1bi4gSWYg X3NhZmVfbGV2ZWxfIGlzIHNldCB0byBhIG5vbi1uaWwgdmFsdWUsDQogICMgRVJCIGNvZGUg d2lsbCBiZSBydW4gaW4gYSBzZXBhcmF0ZSB0aHJlYWQgd2l0aCA8Yj4kU0FGRTwvYj4gc2V0 IHRvIHRoZQ0KICAjIHByb3ZpZGVkIGxldmVsLg0KICAjIA0KICAjIElmIF90cmltX21vZGVf IGlzIHBhc3NlZCBhIFN0cmluZyBjb250YWluaW5nIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xs b3dpbmcNCiAgIyBtb2RpZmllcnMsIEVSQiB3aWxsIGFkanVzdCBpdHMgY29kZSBnZW5lcmF0 aW9uIGFzIGxpc3RlZDoNCiAgIyANCiAgIyAJJSAgZW5hYmxlcyBSdWJ5IGNvZGUgcHJvY2Vz c2luZyBmb3IgbGluZXMgYmVnaW5uaW5nIHdpdGggJQ0KICAjIAk8PiBvbWl0IG5ld2xpbmUg Zm9yIGxpbmVzIHN0YXJ0aW5nIHdpdGggPCUgYW5kIGVuZGluZyBpbiAlPg0KICAjIAk+ICBv bWl0IG5ld2xpbmUgZm9yIGxpbmVzIGVuZGluZyBpbiAlPg0KICAjIA0KICAjIF9lb3V0dmFy XyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIEVSQiB3aWxs IGJ1aWxkIHVwDQogICMgaXRzIG91dHB1dCBpbi4gIFRoaXMgaXMgdXNlZnVsIHdoZW4geW91 IG5lZWQgdG8gcnVuIG11bHRpcGxlIEVSQg0KICAjIHRlbXBsYXRlcyB0aHJvdWdoIHRoZSBz YW1lIGJpbmRpbmcgYW5kL29yIHdoZW4geW91IHdhbnQgdG8gY29udHJvbCB3aGVyZQ0KICAj IG91dHB1dCBlbmRzIHVwLiAgUGFzcyB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgdG8gYmUg dXNlZCBpbnNpZGUgYSBTdHJpbmcuDQogICMNCiAgIyA9PT0gRXhhbXBsZQ0KICAjDQogICMg IHJlcXVpcmUgImVyYiINCiAgIyAgDQogICMgICMgYnVpbGQgZGF0YSBjbGFzcw0KICAjICBj bGFzcyBMaXN0aW5ncw0KICAjICAgIFBST0RVQ1QgPSB7IDpuYW1lID0+ICJDaGlja2VuIEZy aWVkIFN0ZWFrIiwNCiAgIyAgICAgICAgICAgICAgICA6ZGVzYyA9PiAiQSB3ZWxsIG1lc3Nh Z2VzIHBhdHRpZSwgYnJlYWRlZCBhbmQgZnJpZWQuIiwNCiAgIyAgICAgICAgICAgICAgICA6 Y29zdCA9PiA5Ljk1IH0NCiAgIyAgDQogICMgICAgYXR0cl9yZWFkZXIgOnByb2R1Y3QsIDpw cmljZQ0KICAjICAgIA0KICAjICAgIGRlZiBpbml0aWFsaXplKCBwcm9kdWN0ID0gIiIsIHBy aWNlID0gIiIgKQ0KICAjICAgICAgQHByb2R1Y3QgPSBwcm9kdWN0DQogICMgICAgICBAcHJp Y2UgPSBwcmljZQ0KICAjICAgIGVuZA0KICAjICAgIA0KICAjICAgIGRlZiBidWlsZA0KICAj ICAgICAgYiA9IGJpbmRpbmcNCiAgIyAgICAgICMgY3JlYXRlIGFuZCBydW4gdGVtcGxhdGVz LCBmaWxsaW5nIG1lbWJlciBkYXRhIHZhcmllYmxlcw0KICAjICAgICAgRVJCLm5ldyg8PC0n RU5EX1BST0RVQ1QnLmdzdWIoL15ccysvLCAiIiksIDAsICIiLCAiQHByb2R1Y3QiKS5yZXN1 bHQgYg0KICAjICAgICAgICA8JT0gUFJPRFVDVFs6bmFtZV0gJT4NCiAgIyAgICAgICAgPCU9 IFBST0RVQ1RbOmRlc2NdICU+DQogICMgICAgICBFTkRfUFJPRFVDVA0KICAjICAgICAgRVJC Lm5ldyg8PC0nRU5EX1BSSUNFJy5nc3ViKC9eXHMrLywgIiIpLCAwLCAiIiwgIkBwcmljZSIp LnJlc3VsdCBiDQogICMgICAgICAgIDwlPSBQUk9EVUNUWzpuYW1lXSAlPiAtLSA8JT0gUFJP RFVDVFs6Y29zdF0gJT4NCiAgIyAgICAgICAgPCU9IFBST0RVQ1RbOmRlc2NdICU+DQogICMg ICAgICBFTkRfUFJJQ0UNCiAgIyAgICBlbmQNCiAgIyAgZW5kDQogICMgIA0KICAjICAjIHNl dHVwIHRlbXBsYXRlIGRhdGENCiAgIyAgbGlzdGluZ3MgPSBMaXN0aW5ncy5uZXcNCiAgIyAg bGlzdGluZ3MuYnVpbGQNCiAgIyAgDQogICMgIHB1dHMgbGlzdGluZ3MucHJvZHVjdCArICJc biIgKyBsaXN0aW5ncy5wcmljZQ0KICAjDQogICMgX0dlbmVyYXRlc18NCiAgIw0KICAjICBD aGlja2VuIEZyaWVkIFN0ZWFrDQogICMgIEEgd2VsbCBtZXNzYWdlcyBwYXR0aWUsIGJyZWFk ZWQgYW5kIGZyaWVkLg0KICAjICANCiAgIyAgQ2hpY2tlbiBGcmllZCBTdGVhayAtLSA5Ljk1 DQogICMgIEEgd2VsbCBtZXNzYWdlcyBwYXR0aWUsIGJyZWFkZWQgYW5kIGZyaWVkLg0KICAj ICANCiAgZGVmIGluaXRpYWxpemUoc3RyLCBzYWZlX2xldmVsPW5pbCwgdHJpbV9tb2RlPW5p bCwgZW91dHZhcj0nX2VyYm91dCcpDQogICAgQHNhZmVfbGV2ZWwgPSBzYWZlX2xldmVsDQog ICAgY29tcGlsZXIgPSBFUkI6OkNvbXBpbGVyLm5ldyh0cmltX21vZGUpDQogICAgc2V0X2Vv dXR2YXIoY29tcGlsZXIsIGVvdXR2YXIpDQogICAgQHNyYyA9IGNvbXBpbGVyLmNvbXBpbGUo c3RyKQ0KICAgIEBmaWxlbmFtZSA9IG5pbA0KICBlbmQNCg0KICAjIFRoZSBSdWJ5IGNvZGUg Z2VuZXJhdGVkIGJ5IEVSQg0KICBhdHRyX3JlYWRlciA6c3JjDQoNCiAgIyBUaGUgb3B0aW9u YWwgX2ZpbGVuYW1lXyBhcmd1bWVudCBwYXNzZWQgdG8gS2VybmVsI2V2YWwgd2hlbiB0aGUg RVJCIGNvZGUNCiAgIyBpcyBydW4NCiAgYXR0cl9hY2Nlc3NvciA6ZmlsZW5hbWUNCg0KICAj DQogICMgQ2FuIGJlIHVzZWQgdG8gc2V0IF9lb3V0dmFyXyBhcyBkZXNjcmliZWQgaW4gRVJC I25ldy4gIEl0J3MgcHJvYmFibHkgZWFzaWVyDQogICMgdG8ganVzdCB1c2UgdGhlIGNvbnN0 cnVjdG9yIHRob3VnaCwgc2luY2UgY2FsbGluZyB0aGlzIG1ldGhvZCByZXF1aXJlcyB0aGUN CiAgIyBzZXR1cCBvZiBhbiBFUkIgX2NvbXBpbGVyXyBvYmplY3QuDQogICMNCiAgZGVmIHNl dF9lb3V0dmFyKGNvbXBpbGVyLCBlb3V0dmFyID0gJ19lcmJvdXQnKQ0KICAgIGNvbXBpbGVy LnB1dF9jbWQgPSAiI3tlb3V0dmFyfS5jb25jYXQiDQoNCiAgICBjbWQgPSBbXQ0KICAgIGNt ZC5wdXNoICIje2VvdXR2YXJ9ID0gJyciDQogICAgDQogICAgY29tcGlsZXIucHJlX2NtZCA9 IGNtZA0KDQogICAgY21kID0gW10NCiAgICBjbWQucHVzaChlb3V0dmFyKQ0KDQogICAgY29t cGlsZXIucG9zdF9jbWQgPSBjbWQNCiAgZW5kDQoNCiAgIyBHZW5lcmF0ZSByZXN1bHRzIGFu ZCBwcmludCB0aGVtLiAoc2VlIEVSQiNyZXN1bHQpDQogIGRlZiBydW4oYj1UT1BMRVZFTF9C SU5ESU5HKQ0KICAgIHByaW50IHNlbGYucmVzdWx0KGIpDQogIGVuZA0KDQogICMNCiAgIyBF eGVjdXRlcyB0aGUgZ2VuZXJhdGVkIEVSQiBjb2RlIHRvIHByb2R1Y2UgYSBjb21wbGV0ZWQg dGVtcGxhdGUsIHJldHVybmluZw0KICAjIHRoZSByZXN1bHRzIG9mIHRoYXQgY29kZS4gIChT ZWUgRVJCI25ldyBmb3IgZGV0YWlscyBvbiBob3cgdGhpcyBwcm9jZXNzIGNhbg0KICAjIGJl IGFmZmVjdGVkIGJ5IF9zYWZlX2xldmVsXy4pDQogICMgDQogICMgX2JfIGFjY2VwdHMgYSBC aW5kaW5nIG9yIFByb2Mgb2JqZWN0IHdoaWNoIGlzIHVzZWQgdG8gc2V0IHRoZSBjb250ZXh0 IG9mDQogICMgY29kZSBldmFsdWF0aW9uLg0KICAjDQogIGRlZiByZXN1bHQoYj1UT1BMRVZF TF9CSU5ESU5HKQ0KICAgIGlmIEBzYWZlX2xldmVsDQogICAgICB0aCA9IFRocmVhZC5zdGFy dCB7IA0KCSRTQUZFID0gQHNhZmVfbGV2ZWwNCglldmFsKEBzcmMsIGIsIChAZmlsZW5hbWUg fHwgJyhlcmIpJyksIDEpDQogICAgICB9DQogICAgICByZXR1cm4gdGgudmFsdWUNCiAgICBl bHNlDQogICAgICByZXR1cm4gZXZhbChAc3JjLCBiLCAoQGZpbGVuYW1lIHx8ICcoZXJiKScp LCAxKQ0KICAgIGVuZA0KICBlbmQNCg0KICBkZWYgZGVmX21ldGhvZChtb2QsIG1ldGhvZG5h bWUsIGZuYW1lPScoRVJCKScpICAjIDpub2RvYzoNCiAgICBtb2QubW9kdWxlX2V2YWwoImRl ZiAje21ldGhvZG5hbWV9XG4iICsgc2VsZi5zcmMgKyAiXG5lbmRcbiIsIGZuYW1lLCAwKQ0K ICBlbmQNCg0KICBkZWYgZGVmX21vZHVsZShtZXRob2RuYW1lPSdlcmInKSAgIyA6bm9kb2M6 DQogICAgbW9kID0gTW9kdWxlLm5ldw0KICAgIGRlZl9tZXRob2QobW9kLCBtZXRob2RuYW1l KQ0KICAgIG1vZA0KICBlbmQNCg0KICBkZWYgZGVmX2NsYXNzKHN1cGVya2xhc3M9T2JqZWN0 LCBtZXRob2RuYW1lPSdyZXN1bHQnKSAgIyA6bm9kb2M6DQogICAgY2xzID0gQ2xhc3MubmV3 KHN1cGVya2xhc3MpDQogICAgZGVmX21ldGhvZChjbHMsIG1ldGhvZG5hbWUpDQogICAgY2xz DQogIGVuZA0KZW5kDQoNCiMtLQ0KIyBFUkI6OlV0aWwNCmNsYXNzIEVSQg0KICAjIEEgdXRp bGl0eSBtb2R1bGUgZm9yIGNvbnZlcnNpb24gcm91dGluZXMsIG9mdGVuIGhhbmR5IGluIEhU TUwgZ2VuZXJhdGlvbi4NCiAgbW9kdWxlIFV0aWwNCiAgICBwdWJsaWMNCiAgICAjDQogICAg IyBBIHV0aWxpdHkgbWV0aG9kIGZvciBlc2NhcGluZyBIVE1MIHRhZyBjaGFyYWN0ZXJzIGlu IF9zXy4NCiAgICAjIA0KICAgICMgCXJlcXVpcmUgImVyYiINCiAgICAjIAlpbmNsdWRlIEVS Qjo6VXRpbA0KICAgICMgCQ0KICAgICMgCXB1dHMgaHRtbF9lc2NhcGUoImlzIGEgPiAwICYg YSA8IDEwPyIpDQogICAgIyANCiAgICAjIF9HZW5lcmF0ZXNfDQogICAgIyANCiAgICAjIAlp cyBhICZndDsgMCAmYW1wOyBhICZsdDsgMTA/DQogICAgIw0KICAgIGRlZiBodG1sX2VzY2Fw ZShzKQ0KICAgICAgcy50b19zLmdzdWIoLyYvLCAiJmFtcDsiKS5nc3ViKC9cIi8sICImcXVv dDsiKS5nc3ViKC8+LywgIiZndDsiKS5nc3ViKC88LywgIiZsdDsiKQ0KICAgIGVuZA0KICAg IGFsaWFzIGggaHRtbF9lc2NhcGUNCiAgICANCiAgICAjDQogICAgIyBBIHV0aWxpdHkgbWV0 aG9kIGZvciBlbmNvZGluZyB0aGUgU3RyaW5nIF9zXyBhcyBhIFVSTC4NCiAgICAjIA0KICAg ICMgCXJlcXVpcmUgImVyYiINCiAgICAjIAlpbmNsdWRlIEVSQjo6VXRpbA0KICAgICMgCQ0K ICAgICMgCXB1dHMgdXJsX2VuY29kZSgiUHJvZ3JhbW1pbmcgUnVieTogIFRoZSBQcmFnbWF0 aWMgUHJvZ3JhbW1lcidzIEd1aWRlIikNCiAgICAjIA0KICAgICMgX0dlbmVyYXRlc18NCiAg ICAjIA0KICAgICMgCVByb2dyYW1taW5nJTIwUnVieSUzQSUyMCUyMFRoZSUyMFByYWdtYXRp YyUyMFByb2dyYW1tZXIlMjdzJTIwR3VpZGUNCiAgICAjDQogICAgZGVmIHVybF9lbmNvZGUo cykNCiAgICAgIHMudG9fcy5nc3ViKC9bXmEtekEtWjAtOV9cLS5dL24peyBzcHJpbnRmKCIl JSUwMlgiLCAkJi51bnBhY2soIkMiKVswXSkgfQ0KICAgIGVuZA0KICAgIGFsaWFzIHUgdXJs X2VuY29kZQ0KICBlbmQNCmVuZA0KDQojLS0NCiMgRVJCOjpEZWZNZXRob2QNCmNsYXNzIEVS Qg0KICBtb2R1bGUgRGVmTWV0aG9kICAjIDpub2RvYzoNCiAgICBwdWJsaWMNCiAgICBkZWYg ZGVmX2VyYl9tZXRob2QobWV0aG9kbmFtZSwgZXJiKQ0KICAgICAgaWYgZXJiLmtpbmRfb2Y/ IFN0cmluZw0KCWZuYW1lID0gZXJiDQoJRmlsZS5vcGVuKGZuYW1lKSB7fGZ8IGVyYiA9IEVS Qi5uZXcoZi5yZWFkKSB9DQoJZXJiLmRlZl9tZXRob2Qoc2VsZiwgbWV0aG9kbmFtZSwgZm5h bWUpDQogICAgICBlbHNlDQoJZXJiLmRlZl9tZXRob2Qoc2VsZiwgbWV0aG9kbmFtZSkNCiAg ICAgIGVuZA0KICAgIGVuZA0KICAgIG1vZHVsZV9mdW5jdGlvbiA6ZGVmX2VyYl9tZXRob2QN CiAgZW5kDQplbmQNCg0KDQo= ------------93BF1902D0C762C--