|
From: <jue...@we...> - 2003-10-10 17:08:03
|
Rm9ydHVuYXRlbHksIHRoaXMgKmlzKiBhdmFpbGFibGUgZm9yIFhtbEJlYW5GYWN0b3J5IHRvbywg bGlrZSBhcyBmb2xsb3dzIC0tIA0Kd2l0aCB0aGUgdmVyeSBzYW1lIEFQSSB0aGF0IFhtbFdlYkFw cGxpY2F0aW9uQ29udGV4dCBpbnRlcm5hbGx5IHVzZXMgdG8gbG9hZCBtdWx0aXBsZSBmaWxlcy4N CiANCiAgWG1sQmVhbkZhY3RvcnkgYmYgPSBuZXcgWG1sQmVhbkZhY3RvcnkoKTsNCiAgYmYubG9h ZEJlYW5EZWZpbml0aW9ucygiYXBwQ3R4MS54bWwiKTsNCiAgYmYubG9hZEJlYW5EZWZpbml0aW9u cygiYXBwQ3R4MS54bWwiKTsNCiAgYmYucHJlSW5zdGFudGlhdGVTaW5nbGV0b25zKCk7DQogDQpJ dCdzIGN1cnJlbnRseSBub3QgYXZhaWxhYmxlIGluIEZpbGVTeXN0ZW1YbWxBcHBsaWNhdGlvbkNv bnRleHQgdGhvdWdoLCBtYWlubHkgdG8gbm90IHBsYWNlIGFueSByZXN0cmljdGlvbnMgb24gZmls ZSBuYW1lcyBpbiB0ZXJtcyBvZiBzcGFjZXMgb3IgY29tbWFzLiBGaWxlU3lzdGVtWG1sQXBwbGlj YXRpb25Db250ZXh0IGFscmVhZHkgaGFzIGEgY29uc3RydWN0b3Igd2l0aCBhIFN0cmluZyBhcnJh eSwgZm9yIGF1dG9tYXRpY2FsbHkgc2V0dGluZyB1cCAqbmVzdGVkKiBjb250ZXh0cy4gV2UgY291 bGQgcmVkZWZpbmUgdGhhdCBjb25zdHJ1Y3RvciB0byBzcGVjaWZ5IG11bHRpcGxlIGZpbGVzIHRo YXQgbWFrZSB1cCBhICpzaW5nbGUqIGNvbnRleHQsIGFuZCBvZmZlciBhbiBvdmVybG9hZGVkIHZl cnNpb24gdGhhdCB0YWtlcyBhIHBhcmVudCBBcHBsaWNhdGlvbkNvbnRleHQgcmVmZXJlbmNlLiBU aGF0IHdheSwgYm90aCBtdWx0aXBsZSBmaWxlcyBmb3IgYSBzaW5nbGUgY29udGV4dCBhbmQgbmVz dGluZyB3b3VsZCBiZSBwb3NzaWJsZS4NCiANCi0tLS0tDQogDQpXaGF0IEknbSBtb3N0IGV4Y2l0 ZWQgYWJvdXQgaXMgdGhlIEJlYW5Qb3N0UHJvY2Vzc29yIGhvb2suIEkgZXhwZWN0IHRoYXQgdG8g YmUgdmVyeSBwb3dlcmZ1bCwgYXMgYWxyZWFkeSBpbmRpY2F0ZWQgYnkgdGhlIHJlc3BlY3RpdmUg dGVzdCBjYXNlIGluIFN0YXRpY0FwcGxpY2F0aW9uQ29udGV4dFN1aXRlLiBBbm90aGVyIGV4YW1w bGUgdGhhdCBJJ3ZlIHByb3RvdHlwZWQgaXMgdGhlIGZvbGxvd2luZyAobm90IHlldCBpbiBDVlMp Og0KcHVibGljIGNsYXNzIEF1dG9Qcm94eUNyZWF0b3IgaW1wbGVtZW50cyBCZWFuUG9zdFByb2Nl c3NvciB7DQogIHByaXZhdGUgTGlzdCBiZWFuTmFtZXM7DQogIHByaXZhdGUgSW50ZXJjZXB0b3Jb XSBpbnRlcmNlcHRvcnM7DQoNCiAgcHVibGljIHZvaWQgc2V0QmVhbk5hbWVzKFN0cmluZ1tdIGJl YW5OYW1lcykgew0KICAgIHRoaXMuYmVhbk5hbWVzID0gQXJyYXlzLmFzTGlzdChiZWFuTmFtZXMp Ow0KICB9DQoNCiAgcHVibGljIHZvaWQgc2V0SW50ZXJjZXB0b3JzKEludGVyY2VwdG9yW10gaW50 ZXJjZXB0b3JzKSB7DQogICAgdGhpcy5pbnRlcmNlcHRvcnMgPSBpbnRlcmNlcHRvcnM7DQogIH0N Cg0KICBwdWJsaWMgT2JqZWN0IHBvc3RQcm9jZXNzQmVhbihPYmplY3QgYmVhbiwgU3RyaW5nIG5h bWUsIFJvb3RCZWFuRGVmaW5pdGlvbiBkZWZpbml0aW9uKSB7DQogICAgaWYgKHRoaXMuYmVhbk5h bWVzICE9IG51bGwgJiYgdGhpcy5iZWFuTmFtZXMuY29udGFpbnMobmFtZSkpIHsNCiAgICAgIFBy b3h5RmFjdG9yeSBwcm94eUZhY3RvcnkgPSBuZXcgUHJveHlGYWN0b3J5KCk7DQogICAgICBmb3Ig KGludCBpID0gMDsgaSA8IHRoaXMuaW50ZXJjZXB0b3JzLmxlbmd0aDsgaSsrKSB7DQogICAgICAg IHByb3h5RmFjdG9yeS5hZGRJbnRlcmNlcHRvcih0aGlzLmludGVyY2VwdG9yc1tpXSk7DQogICAg ICB9DQogICAgICBwcm94eUZhY3RvcnkuYWRkSW50ZXJjZXB0b3IobmV3IEludm9rZXJJbnRlcmNl cHRvcihiZWFuKSk7DQogICAgICByZXR1cm4gcHJveHlGYWN0b3J5LmdldFByb3h5KCk7DQogICAg fQ0KICAgIGVsc2Ugew0KICAgICAgcmV0dXJuIGJlYW47DQogICAgfQ0KICB9DQp9DQoNClRoaXMg aXMgYSBCZWFuUG9zdFByb2Nlc3NvciBiZWFuIHRoYXQgY2FuIGJlIHNldCB1cCBhcyBmb2xsb3dz IHRvIHByb3h5IHRoZSBiZWFucyB3aXRoIHRoZSBnaXZlbiBuYW1lcyB3aXRoIHRoZSBnaXZlbiBp bnRlcmNlcHRvcnMuIE5vdGUgdGhhdCB0aGlzIGlzIG9ubHkgb25lIGJlYW4gd2l0aCBwcm94eSBz ZXR0aW5ncyB0byBkZWZpbmUsIGFsdGhvdWdoIHRoZXJlIG1pZ2h0IGJlIGRvemVucyBvZiB0YXJn ZXQgYmVhbnMgd2l0aCB0aGUgc2FtZSBwcm94eSBiZWhhdmlvci4NCg0KPGJlYW4gaWQ9ImF1dG9Q cm94eUNyZWF0b3IiIGNsYXNzPSJvcmcuc3ByaW5nZnJhbWV3b3JrLmFvcC5mcmFtZXdvcmsuc3Vw cG9ydC5BdXRvUHJveHlDcmVhdG9yIj4NCiAgPHByb3BlcnR5IG5hbWU9ImJlYW5OYW1lcyI+PHZh bHVlPm15QmVhbjEsbXlCZWFuMixteUJlYW4zPC92YWx1ZT48L3Byb3BlcnR5Pg0KICA8cHJvcGVy dHkgbmFtZT0iaW50ZXJjZXB0b3JzPg0KICAgIDxsaXN0Pg0KICAgICAgPHJlZiBiZWFuPSJteUlu dGVyY2VwdG9yMSIvPg0KICAgICAgPHJlZiBiZWFuPSJteUludGVyY2VwdG9yMiIvPg0KICAgIDwv bGlzdD4NCiAgPC9wcm9wZXJ0eT4NCjwvYmVhbj4NCg0KU28gc2V0dGluZyB1cCAxMCB0cmFuc2Fj dGlvbmFsIGJlYW5zIHdvdWxkIGp1c3QgaW52b2x2ZSAxIEF1dG9Qcm94eUNyZWF0b3IgYW5kIDEg dHJhbnNhY3Rpb24gaW50ZXJjZXB0b3IgcGx1cyB0aGUgMTAgdGFyZ2V0IGJlYW5zICgxMiBiZWFu cyBpbiB0b3RhbCksIGluc3RlYWQgb2YgMTAgVHJhbnNhY3Rpb25Qcm94eUZhY3RvcnlCZWFucyBw bHVzIHRoZSAxMCB0YXJnZXQgYmVhbnMgKDIwIGJlYW5zIGluIHRvdGFsKS4gVGhlIHRyYW5zYWN0 aW9uIGF0dHJpYnV0ZXMgd291bGQgYmUgY2VudHJhbGl6ZWQgdGhvdWdoLCBpbiBjb250cmFzdCB0 byBUcmFuc2FjdGlvblByb3h5RmFjdG9yeUJlYW4gdGhhdCBrZWVwcyB0aGVtIGxvY2FsIHBlciBp bmRpdmlkdWFsIHByb3h5IGRlZmluaXRpb24uDQogDQpPZiBjb3Vyc2UsIHNvdXJjZS1sZXZlbCBt ZXRhZGF0YSB3b3VsZCBhbGxvdyBmb3IganVzdCAxIEJlYW5Qb3N0UHJvY2Vzc29yIHBsdXMgdGhl IDEwIHRhcmdldCBiZWFucyAoMTEgYmVhbnMgaW4gdG90YWwpLCB3aXRoIHRoZSB0cmFuc2FjdGlv biBhdHRyaWJ1dGVzIGJlaW5nIGtlcHQgd2l0aCB0aGUgcmVzcGVjdGl2ZSBtZXRob2RzIGluIHRo ZSBzb3VyY2UgY29kZS4gVGhpcyB3b3VsZCBqdXN0IGdldCByaWQgb2YgMSBiZWFuIGJ1dCBvZiBh IHByZXR0eSBibG9hdGVkIG9uZTogdGhlIFRyYW5zYWN0aW9uSW50ZXJjZXB0b3IgZGVmaW5pdGlv biB3aXRoIGl0cyBjZW50cmFsaXplZCB0cmFuc2FjdGlvbiBhdHRyaWJ1dGVzIGZvciB0aGUgd2hv bGUgYXBwLg0KIA0KSnVlcmdlbg0KIA0KIA0KDQoJLS0tLS1VcnNwcsO8bmdsaWNoZSBOYWNocmlj aHQtLS0tLSANCglWb246IFJvZCBKb2huc29uIFttYWlsdG86cm9kLmpvaG5zb25AaW50ZXJmYWNl MjEuY29tXSANCglHZXNlbmRldDogRnIgMTAuMTAuMjAwMyAxNjo0MSANCglBbjogc3ByaW5nZnJh bWV3b3JrLWRldmVsb3BlckBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQgDQoJQ2M6IA0KCUJldHJlZmY6 IFJlOiBbU3ByaW5nZnJhbWV3b3JrLWRldmVsb3Blcl0gbmV3IGJlYW4gZmFjdG9yeSBhbmQgYXBw bGljYXRpb24gY29udGV4dCBmZWF0dXJlcw0KCQ0KCQ0KDQoJSSB0aGluayB0aGlzIGlzIHZlcnkg dXNlZnVsLg0KCQ0KCUl0IHdvdWxkIGJlIGdvb2QgdG8gaGF2ZSB0aGlzIGF2YWlsYWJsZSBmb3Ig dGhlIFhtbEJlYW5GYWN0b3J5IGFzIHdlbGwuDQoJT2Z0ZW4sIGVzcGVjaWFsbHkgZm9yIGludGVn cmF0aW9uIHRlc3RpbmcsIEkgdGVuZCB0byB1c2UgYSBCZWFuRmFjdG9yeQ0KCXVubGVzcyBteSBj b2RlIGhhcyBzcGVjaWZpYyBkZXBlbmRlbmNpZXMgb24gYW4gYXBwbGljYXRpb24gY29udGV4dCBm b3INCglzb3VyY2luZyBtZXNzYWdlcyBldGMuDQoJDQoJUmVnYXJkcywNCglSb2QNCgkNCgktLS0t LSBPcmlnaW5hbCBNZXNzYWdlIC0tLS0tDQoJRnJvbTogImrDvHJnZW4gaMO2bGxlciBbd2VyazNB VF0iIDxqdWVyZ2VuLmhvZWxsZXJAd2VyazNhdC5jb20+DQoJVG86IDxzcHJpbmdmcmFtZXdvcmst ZGV2ZWxvcGVyQGxpc3RzLnNvdXJjZWZvcmdlLm5ldD4NCglTZW50OiBGcmlkYXksIE9jdG9iZXIg MTAsIDIwMDMgMzozMCBQTQ0KCVN1YmplY3Q6IFtTcHJpbmdmcmFtZXdvcmstZGV2ZWxvcGVyXSBu ZXcgYmVhbiBmYWN0b3J5IGFuZCBhcHBsaWNhdGlvbg0KCWNvbnRleHQgZmVhdHVyZXMNCgkNCgkN CglFdmVyeWJvZHksDQoJDQoJUmVsYXRlZCB0byB0aGUgZGlzY3Vzc2lvbiBhYm91dCBoaWVyYXJj aGljYWwgbG9hZGluZywgSSd2ZSBqdXN0IGNvbW1pdHRlZA0KCXN1cHBvcnQgZm9yIGFzc2VtYmxp bmcgYW4gYXBwbGljYXRpb24gY29udGV4dCBmcm9tIG1vcmUgdGhhbiBvbmUgWE1MIGZpbGUsDQoJ anVzdCBhdmFpbGFibGUgdmlhIFhtbFdlYkFwcGxpY2F0aW9uQ29udGV4dCBmb3IgdGhlIG1vbWVu dC4gSXQgYWxsb3dzIHRvDQoJc3BlY2lmeSBjb25maWcgbG9jYXRpb25zIHdpdGggbXVsdGlwbGUg cGF0aHMgaW4gaXQsIGxpa2UgaW4gdGhlIHdlYiBjYXNlOg0KCQ0KCSAgPGNvbnRleHQtcGFyYW0+ DQoJICAgIDxwYXJhbS1uYW1lPmNvbnRleHRDb25maWdMb2NhdGlvbjwvcGFyYW0tbmFtZT4NCgkg ICAgICA8cGFyYW0tdmFsdWU+DQoJICAgICAgICBXRUItSU5GL2FwcGxpY2F0aW9uQ29udGV4dDEu eG1sDQoJICAgICAgICBXRUItSU5GL2FwcGxpY2F0aW9uQ29udGV4dDIueG1sDQoJICAgICAgPC9w YXJhbS12YWx1ZT4NCgkgIDwvY29udGV4dC1wYXJhbT4NCgkNCglBbnkgbnVtYmVyIG9mIHRoZSBj aGFyYWN0ZXJzICI7LCAiIGJldHdlZW4gcGF0aHMgYXJlIGlnbm9yZWQsIHRvIGFsbG93IGZvcg0K CWxlbmllbnQgcGFyc2luZy4gVGhlIHJlc3VsdCBpcyBhICpzaW5nbGUqIHJvb3Qgd2ViIGFwcGxp Y2F0aW9uIGNvbnRleHQgdGhhdA0KCWhhcyBiZWVuIGxvYWRlZCBmcm9tIG11bHRpcGxlIFhNTCBm aWxlcywgZWFjaCBjb25mb3JtaW5nIHRvIHRoZSBzcHJpbmctYmVhbnMNCglEVEQuIEJlYW4gcmVm ZXJlbmNlcyBiZXR3ZWVuIHRoZSBpbmRpdmlkdWFsIGZpbGVzIG5lZWQgdG8gYmUgPHJlZg0KCWV4 dGVybmFsPSIuLi4iPiBpbnN0ZWFkIG9mIDxyZWYgYmVhbj0iLi4uIj4gdGhhdCByZWZlcmVuY2Vz IFhNTCBlbnRpdGllcyBpbg0KCXRoZSBzYW1lIGZpbGUuDQoJDQoJVGhpcyBhbGxvd3MgdG8gc3Bs aXQgYSBsYXJnZSBkZWZpbml0aW9uIG9mIGEgbWlkZGxlIHRpZXIgYXBwbGljYXRpb24gY29udGV4 dA0KCWludG8gbXVsdGlwbGUgWE1MIGZpbGVzLCBlaXRoZXIgc2VwYXJhdGluZyBieSBzeXN0ZW0g bW9kdWxlcyBvciBieSBzdWINCglsYXllcnMuIE9idmlvdXNseSB0aGlzIGRvZXNuJ3QgYWRkcmVz cyB0aGUgRUpCL211bHRpcGxlIHdlYiBhcHAgY2FzZSwgYnV0IGl0DQoJc2hvdWxkIGJlIHdlbGwg c3VpdGVkIGZvciB0eXBpY2FsIGxhcmdlIHdlYiBhcHBsaWNhdGlvbnMuDQoJDQoJQlRXLCBJJ3Zl IGFsc28gYWRkZWQgc3VwcG9ydCBmb3IgbXVsdGlwbGUgcmVzb3VyY2UgYnVuZGxlIGJhc2VuYW1l cyBpbg0KCVJlc291cmNlQnVuZGxlTWVzc2FnZVNvdXJjZSwgdmlhIHRoZSAiYmFzZW5hbWVzIiBw cm9wZXJ0eSAoaW4gYWRkaXRpb24gdG8NCgl0aGUgZXhpc3RpbmcgImJhc2VuYW1lIiBvbmUpLiBU aG9zZSByZXNvdXJjZSBidW5kbGVzIGdldCBjaGVja2VkDQoJc2VxdWVudGlhbGx5IHdpdGhpbiBh ICpzaW5nbGUqIE1lc3NhZ2VTb3VyY2UsIGFsbG93aW5nIHRvIHNwbGl0IGxhcmdlDQoJbWVzc2Fn ZSBidW5kbGVzIGludG8gbXVsdGlwbGUgZmlsZXMuDQoJDQoJRnVydGhlcm1vcmUsIEkndmUgcmV2 aXNlZCB0aGUgbm90YXRpb24gb2YgbmFtZSBhbGlhc2VzIGxpa2UgPGJlYW4gLi4uDQoJbmFtZT0i bXlhbGlhczEsbXlhbGlhczIiPiB0byBtYXRjaCB0aGUgcnVsZXMgYWJvdmU6IEFueSBudW1iZXIg b2YgdGhlDQoJY2hhcmFjdGVycyAiOywgIiBiZXR3ZWVuIGJlYW4gbmFtZXMgYXJlIGlnbm9yZWQu IFRoaXMgcGFydGljdWxhcmx5IGFsbG93cw0KCUJlYW5OYW1lVXJsSGFuZGxlck1hcHBpbmcgdG8g aW50ZXJwcmV0IG11bHRpcGxlIGFsaWFzZXMgYXMgbXVsdGlwbGUgbWFwcGluZ3MNCgl3aXRob3V0 IGN1c3RvbSBwYXJzaW5nLCBubyBtYXR0ZXIgaWYgc2VwYXJhdGVkIGJ5IGEgY29tbWEgb3Igc3Bh Y2UgKHRoZQ0KCWxhdHRlciBsb29rcyBjbGVhbmVyIHdpdGggVVJMcykuDQoJDQoJVGhlIGRyYXdi YWNrIG9mIHRoZSBsYXR0ZXIgaXMgdGhhdCBYTUwgYmVhbiBhbGlhc2VzIGFyZSBub3QgYWxsb3dl ZCB0bw0KCWNvbnRhaW5zIHNwYWNlcyBvciBjb21tYXMgYW55bW9yZSAtLSBmb3IgdGhlIGJlbmVm aXQgb2YgYmVpbmcgYWJsZSB0bw0KCXNwZWNpZnkgbXVsdGlwbGUgYWxpYXNlcy4gRG9lcyBhbnlv bmUgb2JqZWN0IHRvIHRoYXQgdHJhZGVvZmY/DQoJDQoJLS0tLS0NCgkNCglJJ3ZlIGFsc28gYWRk ZWQgYSBuZXcgcG9zdCBwcm9jZXNzb3IgdHlwZTogQmVhblBvc3RQcm9jZXNzb3IsIGluIGFkZGl0 aW9uIHRvDQoJdGhlIGV4aXN0aW5nIEJlYW5GYWN0b3J5UG9zdFByb2Nlc3Nvci4gTm90ZSB0aGF0 IHRoZSBmb3JtZXIgaXMgaW4gdGhlDQoJYmVhbnMuZmFjdG9yeS5zdXBwb3J0IHBhY2thZ2UsIHdp dGggQWJzdHJhY3RCZWFuRmFjdG9yeSBvZmZlcmluZyBzdXBwb3J0IGZvcg0KCWl0IC0tIHdoaWxl IHRoZSBsYXR0ZXIgaXMgaW4gY29udGV4dC5jb25maWcsIGFzIGl0IGFsbG93cyBhcHBsaWNhdGlv bg0KCWNvbnRleHRzIHRvIG92ZXJyaWRlIHByb3BlcnR5IHZhbHVlcyAqYWZ0ZXIqIHRoZWlyIGJl YW4gZmFjdG9yeSAoYQ0KCUxpc3RhYmxlQmVhbkZhY3RvcnlJbXBsLCB0byBiZSBleGFjdCkgaGFz IGxvYWRlZC4NCgkNCglBIEJlYW5GYWN0b3J5UG9zdFByb2Nlc3NvciBnZXRzIGludm9rZWQgb25j ZSBwZXIgYmVhbiBmYWN0b3J5IGxvYWRpbmc7DQoJQmVhblBvc3RQcm9jZXNzb3Igb25jZSBwZXIg YmVhbiBjcmVhdGlvbi4gQm90aCB0eXBlcyBvZiBwb3N0IHByb2Nlc3NvciBjYW4NCgliZSBkZWZp bmVkIGFzIG5vcm1hbCBiZWFucyBpbiBhbiBhcHBsaWNhdGlvbiBjb250ZXh0LCBnZXR0aW5nIGF1 dG9tYXRpY2FsbHkNCglkZXRlY3RlZCBhdCBzdGFydHVwLCBhbmQgYXBwbGllZCBiZWZvcmUgdGhl IHJlc3Qgb2YgdGhlIGJlYW5zIGdldHMgY3JlYXRlZC4NCglXaXRoIGEgcGxhaW4gYmVhbiBmYWN0 b3J5LCBvbmx5IEJlYW5Qb3N0UHJvY2Vzc29yIGlzIGFwcGxpY2FibGUsIGJ1dCBub3QNCglkZWZp bmVkIGFzIGEgbm9ybWFsIGJlYW4gYnV0IHJhdGhlciBzZXQgdmlhIEFic3RyYWN0QmVhbkZhY3Rv cnkncw0KCXNldEJlYW5Qb3N0UHJvY2Vzc29ycyBtZXRob2QuDQoJDQoJSSd2ZSBhcHBsaWVkIHRo ZSBwcmluY2lwbGUgdGhhdCBiZWFuIGZhY3RvcmllcyBhcmUgbm90IHN1cHBvc2VkIHRvDQoJdW5k ZXJzdGFuZCBzcGVjaWFsIGJlYW5zIGluIHRoZSBiZWFuIGRlZmluaXRpb25zIHRoYXQgaW5mbHVl bmNlIHRoZSBiZWhhdmlvcg0KCW9mIHRoZSBmYWN0b3J5IGl0c2VsZiAtLSBqdXN0IGFwcGxpY2F0 aW9uIGNvbnRleHRzIGFyZSwgbGlrZSB3aXRoIHRoZQ0KCW1lc3NhZ2Ugc291cmNlLCBvcHRpb25z IGJlYW5zLCBhbmQgcG9zdCBwcm9jZXNzb3JzLiBCZWFuIGZhY3RvcmllcyBjYW4gYmUNCgljdXN0 b21pemVkIHRocm91Z2ggdGhlaXIgaW1wbGVtZW50YXRpb24gY2xhc3MsIHRob3VnaCAtIGUuZy4N CglzZXRFbnRpdHlSZXNvbHZlciwgc2V0VmFsaWRhdGluZywgYW5kIHNldEJlYW5Qb3N0UHJvY2Vz c29ycyBvbg0KCVhtbEJlYW5GYWN0b3J5Lg0KCQ0KCUEgc3BlY2lhbCBpbXBsZW1lbnRhdGlvbiBv ZiBCZWFuUG9zdFByb2Nlc3NvciBpcyBhcHBsaWVkIHVuZGVyIHRoZSBob29kIGJ5DQoJQWJzdHJh Y3RBcHBsaWNhdGlvbkNvbnRleHQ6IEFwcGxpY2F0aW9uQ29udGV4dEF3YXJlUHJvY2Vzc29yIGlz IGltcGxpY3RseQ0KCXJlZ2lzdGVyZWQgd2l0aCB0aGUgdW5kZXJseWluZyBiZWFuIGZhY3Rvcnkg dG8gYXV0b21hdGljYWxseSBwYXNzIHRoZQ0KCWFwcGxpY2F0aW9uIGNvbnRleHQgdG8gQXBwbGlj YXRpb25Db250ZXh0QXdhcmUgYmVhbnMuIFRoaXMgYWxsb3dlZCBtZSB0byBnZXQNCglyaWQgb2Yg dGhlIHJhdGhlciB1Z2x5IG1hbnVhbCBjaGVjayBmb3IgQXBwbGljYXRpb25Db250ZXh0QXdhcmUg d2l0aCBhIGNhY2hlDQoJb2YgYWxyZWFkeSBtYW5hZ2VkIGluc3RhbmNlcyB0byBhdm9pZCBkb3Vi bGUgc2V0dGluZyBvZiB0aGUgYXBwbGljYXRpb24NCgljb250ZXh0IC0tIHRoZSBjdXJyZW50IHNv bHV0aW9uIGlzIG11Y2ggY2xlYW5lci4NCgkNCglOb3RlIHRoYXQgYSBjdXN0b20gQmVhblBvc3RQ cm9jZXNzb3IgZGVmaW5pdGlvbiBpbiBhbiBhcHBsaWNhdGlvbiBjb250ZXh0DQoJY2FuIG5vdCBv bmx5IGJlIHVzZWQgdG8gY2hlY2sgZm9yIG1hcmtlciBpbnRlcmZhY2VzIGJ1dCBhbHNvIHRvIHdy YXAgY2VydGFpbg0KCWJlYW4gaW5zdGFuY2VzIHdpdGggcHJveGllcywgYXMgaXQgY2FuIHJldHVy biBhIGRpZmZlcmVudCBiZWFuIGluc3RhbmNlIHRoYW4NCgl0aGUgb25lIHRoYXQgY2FtZSBpbi4g TG9vayBhdCB0aGUgcmVzcGVjdGl2ZSB0ZXN0IGNhc2UgaW4NCglTdGF0aWNBcHBsaWNhdGlvbkNv bnRleHRUZXN0U3VpdGUgdGhhdCBpbXBsaWNpdGx5IHdyYXBzIGVhY2ggYmVhbiBpbnN0YW5jZQ0K CXdpdGggYSBDR0xJQiBwcm94eS4NCgkNCglOb3cgaW1hZ2luZSBhIEJlYW5Qb3N0UHJvY2Vzc29y IGltcGxlbWVudGF0aW9uIHRoYXQgY2hlY2tzIGZvciBjZXJ0YWluDQoJYXR0cmlidXRlcyBpbiB0 aGUgYmVhbiBjbGFzcyBmaWxlIGFuZCBhcHBsaWVzIHJlc3BlY3RpdmUgaW50ZXJjZXB0b3JzIC0t DQoJbGlrZSB0cmFuc2FjdGlvbiBhdHRyaWJ1dGVzIHRoYXQgdHJpZ2dlciBhIENHTElCIHByb3h5 IGFuZCBhbiBpbXBsaWNpdA0KCVRyYW5zYWN0aW9uSW50ZXJjZXB0b3IhIEkgY29uc2lkZXIgdGhp cyBhcyB0aGUgcGVyZmVjdCBob29rIGZvciBzdWNoDQoJaW1wbGljaXQgd3JhcHBpbmcgYXQgYmVh biBjcmVhdGlvbiB0aW1lLg0KCQ0KCUp1ZXJnZW4NCgkNCgkNCgktLS0tLU9yaWdpbmFsIE1lc3Nh Z2UtLS0tLQ0KCUZyb206IENvbGluIFNhbXBhbGVhbnUgW21haWx0bzpjb2xpbm1sMUBleGlzLmNv bV0NCglTZW50OiBUaHVyc2RheSwgU2VwdGVtYmVyIDE4LCAyMDAzIDU6MTUgUE0NCglUbzogc3By aW5nZnJhbWV3b3JrLXVzZXJAbGlzdHMuc291cmNlZm9yZ2UubmV0DQoJU3ViamVjdDogW1Nwcmlu Z2ZyYW1ld29yay11c2VyXSBIaWVyYXJjaGljYWwgbG9hZGluZyBvZiBBcHBsaWNhdGlvbg0KCUNv bnRleHRzDQoJDQoJDQoJSSB3YW50ZWQgdG8gc3B1ciBzb21lIGRpc2N1c3Npb24gb2YgYmVzdCBw cmFjdGljZXMgZm9yIGhpZXJhY2hpY2FsDQoJbG9hZGluZyBvZiBBcHBsaWNhdGlvbkNvbnRleHRz LiBBcHBsaWNhdGlvbkNvbnRleHQgaW1wbGVtZW50YXRpb25zIGNhbg0KCW9mIGNvdXJzZSBiZSBj cmVhdGVkIHdpdGggYSBwYXJlbnQgY29udGV4dCBzcGVjaWZpZWQuIEN1cnJlbnRseSwgdGhlcmUN CglpcyBzb21lIGNvZGUgc3VwcG9ydCBmb3IgYWN0dWFsbHkgbWFuYWdpbmcgdGhpcyBsb2FkaW5n IGluIHRoZSB3ZWIgdWkNCglsYXllciAod2hlcmUgaXQncyBlYXN5IHRvIGhhdmUgYSBzZXR1cCB3 aXRoIGEgcm9vdA0KCVdlYkFwcGxpY2F0aW9uQ29udGV4dCwgYW5kIG11bHRpcGxlIGNoaWxkIGNv bnRleHRzLCBwZXIgc2VydmxldC4NCgkNCglNb3N0IFNwcmluZyB1c2FnZSBleGFtcGxlcyBhc3N1 bWUgKHVubGVzcyBJJ20gbWlzc2luZyBzb21ldGhpbmcpIHRoYXQNCgl0aGUgcm9vdCBXZWJBcHBs aWNhdGlvbkNvbnRleHQgd2lsbCBjb250YWluIHRoZSBlbnRpcmUgbGF5ZXIgc3RhY2ssIHRoYXQN CglpcywgZGF0YS1hY2Nlc3MgYmVhbnMgYW5kIHNlcnZpY2UgbGF5ZXIgYmVhbnMgd2lsbCBiZSBk ZWZpbmVkIGluIHRoZXJlLg0KCVRoaXMgZG9lcyB3b3JrIGdyZWF0IHdoZW4gdGhlcmUgdGhlcmUg aXMgb25seSBvbmUgd2ViLWFwcC4NCgkNCglOb3cgaW4gbXkgY2FzZSwgSSBuZWVkIHNvbWV0aGlu ZyBhIGxpdHRsZSBiaXQgZGlmZmVyZW50LiBJIGhhdmUgYSBKMkVFDQoJYXBwbGljYXRpb24gYXMg YW4gRUFSIGZpbGUsIHdoaWNoIGNvbnRhaW5zIDMgd2ViLWFwcHMgKGFzIFdBUnMpIGF0IHRoZQ0K CXRvcCBsYXllci4gQW1vbmcgb3RoZXIgbGF5ZXJzLCBiZWxvdyB0aGUgd2ViIHVpIGxheWVyIHRo ZXJlIGlzIGENCglzZXJ2aWNlcyBsYXllciwgYW5kIGEgZGF0YS1hY2Nlc3MgbGF5ZXIuICBOb3cg SSBjb3VsZCBnZXQgYnkgd2l0aCB0aHJlZQ0KCWRpZmZlcmVudCwgcGFyYWxsZWwsIGFwcGxpY2F0 aW9uIGNvbnRleHRzIGRlZmluZWQsIG9uZSBmb3IgZWFjaCBvZiB0aGUNCgl3ZWItYXBwcywgd2hl cmUgYWxsIHRoZSBiZWFuIGRlZmluaXRpb25zIGZvciB0aGUgZGF0YS1hY2Nlc3MgYW5kDQoJc2Vy dmljZXMgbGF5ZXIgd2FzIGR1cGxpY2F0ZWQgaW4gZWFjaCBhcHBsaWNhdGlvbiBjb250ZXh0LiBJ IGRvIG5vdCB3YW50DQoJdG8gZG8gdGhpcyBob3dldmVyLCBzaW5jZSBJIGFtIHVzaW5nIEhpYmVy bmF0ZSwgYW5kIGRvIG5vdCB3YW50IHRvIGZvcmNlDQoJdGhlIEhpYmVybmF0ZSBtZXRhLWRhdGEg dG8gYmUgcmVhZCBpbiAzIHRpbWVzIChpdCdzIGEgc2xvdyBwcm9jZXNzKS4gSQ0KCW11Y2ggcHJl ZmVyIHRvIGhhdmUgYSBoaWVyYWNoaWNhbCBzZXR1cCBmb3IgdGhlIHdob2xlIGoyZWUgYXBwLCB3 aGVyZSAgSQ0KCWhhdmUgYW4gYXBwbGljYXRpb24gY29udGV4dCBkZWZpbml0aW9uIGZvciB0aGUg ZGF0YS1hY2Nlc3MgbGF5ZXIsIHdoaWNoDQoJbmVlZHMgdG8gYmUgdGhlIHBhcmVudCBvZiBhbiBh cHBsaWNhdGlvbiBjb250ZXh0IGRlZmluaXRpb24gZm9yIHRoZQ0KCXNlcnZpY2VzIGxheWVyLCB3 aGljaCBuZWVkcyB0byBiZSB0aGUgcGFyZW50IG9mIHRocmVlIHNlcGFyYXRlIHdlYg0KCWFwcGxp Y2F0aW9uIGNvbnRleHQgZGVmaW5pdGlvbnMsIG9uZSBpbiBlYWNoIHdlYi1hcHAuDQoJDQoJSSBo YXZlIGJlZW4gYWJsZSB0byBhY2hpZXZlIHRoaXMgYXMgZm9sbG93cyAoYW5kIHdhbnQgdG8gZ2V0 IGZlZWRiYWNrIGlmDQoJc29tZWJvZHkgY2FuIHRoaW5rIG9mIGEgYmV0dGVyIHdheSk6IEkgaGF2 ZSBhbiBhcHBsaWNhdGlvbiBjb250ZXh0DQoJZGVmaW50aW9uIGZvciBteSBkYXRhIGFjY2VzcyBs YXllcg0KCSAgZGF0YS1hY2Nlc3MtYXBwbGljYXRpb25Db250ZXh0LnhtbA0KCUkgaGF2ZSBhbiBh cHBsaWNhdGlvbiBjb250ZXh0IGRlZmluaXRpb24gZm9yIG15IHNlcnZpY2VzIGxheWVyLCB3aGlj aCBpcw0KCWEgY2hpbGQgb2YgdGhlIGRhdGEtYWNjZXNzIGNvbnRleHQsIGFuZCByZWZlcnMgdG8g YmVhbnMgaW4gaXQuOg0KCSAgY29yZS1zZXJ2aWVzLWFwcGxpY2F0aW9uQ29udGV4dC54bWwNCglJ IHRoZW4gaGF2ZSB0aGUgdGhyZWUgYXBwbGljYXRpb24gY29udGV4dHMgZm9yIHRoZSB3ZWIgYXBw cywgd2hpY2ggYXJlDQoJY2hpbGRyZW4gb2YgdGhlIHNlcnZpY2VzIGNvbnRleHQsIGFuZCByZWZl ciB0byBiZWFucyB3aXRoaW4gaXQuDQoJDQoJTm93IHdoYXQgSSBkbywgaXMgKGluIGEgc29tZXdo YXQgbGF6eSBmYXNoaW9uKSB0cmlnZ2VyIGxvYWRpbmcgKG9uY2UpIG9mDQoJdGhlIHNlcnZpY2Vz IGFuZCBkYXRhLWFjY2VzcyBjb250ZXh0cywgd2hlbiBJIGxvYWQgdGhlIGZpcnN0IHdlYg0KCWFw cGxpY2F0aW9uIGNvbnRleHQuIFRoZSAybmQgYW5kIDNyZCB3ZWIgYXBwbGljYXRpb24gY29udGV4 dCBlbmQgdXANCgl1c2luZyB0aGUgcHJldmlvdXNseSBsb2FkZWQgc2VydmljZSBjb250ZXh0IGlu c3RhbmNlLiBJIGhhdmUgYW4NCglpbnRlcmZhY2UsIENvbnRleHRGYWN0b3J5LCBhcyBmb2xsb3dz Og0KCQ0KCS8qKg0KCSAqIERlZmluZXMgaW50ZXJmYWNlIGZvciBhbiBBcHBsaWNhdGlvbkNvbnRl eHQgZmFjdG9yeS4NCgkgKg0KCSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS40MCAkDQoJICogQGF1 dGhvciAgY29saW4NCgkgKi8NCglwdWJsaWMgaW50ZXJmYWNlIENvbnRleHRGYWN0b3J5IHsNCgkN CgkgIC8qKg0KCSAgICogVXNlIHRoZSBBcHBsaWNhdGlvbkNvbnRleHQgc3BlY2lmaWVkIGJ5IHRo ZSBrZXkgcGFyYW1ldGVyLiBUaGUNCgljb250ZXh0IGlzIHBvc3NpYmx5DQoJICAgKiBsb2FkZWQv Y3JlYXRlZCBhcyBuZWVkZWQuDQoJICAgKg0KCSAgICogQHBhcmFtIGtleSBhIHZhbHVlIHNwZWNp Znlpbmcgd2hpY2ggY29udGV4dCB0byB1c2UNCgkgICAqIEByZXR1cm4gdGhlIEFwcGxpY2F0aW9u Q29udGV4dCBpbnN0YW5jZQ0KCSAgICogQHRocm93cyBBcHBsaWNhdGlvbkNvbnRleHRFeGNlcHRp b24gaWYgdGhlcmUgaXMgYW4gZXJyb3IgbG9hZGluZw0KCW9uZSBvciBtb3JlIGNvbnRleHRzDQoJ ICAgKi8NCgkgIEFwcGxpY2F0aW9uQ29udGV4dCB1c2VDb250ZXh0KFN0cmluZyBrZXkpIHRocm93 cw0KCUFwcGxpY2F0aW9uQ29udGV4dEV4Y2VwdGlvbjsNCgkNCgkgIC8qKg0KCSAgICogSW5kaWNh dGUgdGhhdCB0aGUgc3BlY2lmaWVkIEFwcGxpY2F0aW9uQ29udGV4dCBpbnN0YW5jZSBpcyBub3QN CgluZWVkZWQgYnkgYSB1c2VyIG9mIGl0LA0KCSAgICogd2hvIGhhcyBwcmV2aXNvdWx5IG9idGFp bmVkIGl0IHZpYSB7QGxpbmsgdXNlQ29udGV4dH0uIEl0IGlzIGFuDQoJZXJyb3IgZm9yIHJlbGVh c2VDb250ZXh0DQoJICAgKiB0byBiZSBjYWxsZWQgYSBncmVhdGVyIG51bWJlciBvZiB0aW1lcyB0 aGFuIHVzZUNvbnRleHQuIENhbGxpbmcNCgl0aGlzIHJlbGVhc2UgbWV0aG9kIG1heQ0KCSAgICog Y2F1c2UgY2xvc2UoKSB0byBiZSBjYWxsZWQgb24gdGhlIHNwZWNpZmllZCBjb250ZXh0LCBpZiB0 aGlzIGlzIHRoZQ0KCWxhc3QgdXNlciBvZiBpdC4NCgkgICAqDQoJICAgKiBAcGFyYW0gYWMgdGhl IEFwcGxpY2F0aW9uQ29udGV4dCBpbnN0YW5jZQ0KCSAgICogQHRocm93cyBBcHBsaWNhdGlvbkNv bnRleHRFeGNlcHRpb24NCgkgICAqLw0KCSAgdm9pZCByZWxlYXNlQ29udGV4dChBcHBsaWNhdGlv bkNvbnRleHQgYWMpIHRocm93cw0KCUFwcGxpY2F0aW9uQ29udGV4dEV4Y2VwdGlvbjsNCgkNCgl9 DQoJDQoJTm93IEkgaGF2ZSBhbiBhY3R1YWwgaW1wbGVtZW50YXRpb24sIHdoaWNoIGNhbiBiZSB1 c2VkIHRvIGdldCBhY2Nlc3MgdG8NCglhIHJlZmVyZW5jZSBjb3VudGVkIGNvbnRleHQsIHRyaWdn ZXJpbmcgbG9hZGluZyBhcyBuZWVkZWQsIGFuZCBsb2FkaW5nDQoJcGFyZW50cyBvZiB0aGF0IGNv bnRleHQsIGlmIG5lZWRlZDoNCgkNCgkvKioNCgkgKiBJbXBsZW1lbnRhdGlvbiBvZiBDb250ZXh0 RmFjdG9yeS48YnIgLz4NCgkgKiBJbiB0aGlzIGltcGxlbWVudGF0aW9uLCB0aGUga2V5IGlzIGFj dHVhbGx5IHRoZSBuYW1lIG9mIGEgcHJvcGVydGllcw0KCWZpbGUgYWNjZXNzZWQgYXMNCgkgKiBh IHJlc291cmNlLCBlYWNoIGxpbmUgb2Ygd2hpY2ggc3BlY2lmaWVzIGFuIEFwcGxpY2F0aW9uQ29u dGV4dCB0bw0KCWxvYWQuIEVhY2ggbGluZSBpbg0KCSAqIHRoZSBmaWxlIGlzIHRoZSBwYXJlbnQg b2YgdGhlIHN1YnNlcXVlbnQgbGluZS4gVGhlIGxhc3QgY29udGV4dCBpcw0KCXRoZSBvbmUgcmV0 dXJuZWQuDQoJICoNCgkgKiBAdmVyc2lvbiAkUmV2aXNpb246ICQNCgkgKiBAYXV0aG9yICBjb2xp bg0KCSovDQoJcHVibGljIGNsYXNzIENvbnRleHRGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIENvbnRl eHRGYWN0b3J5IHsNCgkNCgkgIC8vIC0tLSBzdGF0aWNzDQoJDQoJICBwdWJsaWMgc3RhdGljIGZp bmFsIExvZ2dlciBfbG9nID0NCglMb2dnZXIuZ2V0TG9nZ2VyKENvbnRleHRGYWN0b3J5SW1wbC5j bGFzcyk7DQoJDQoJICAvLyB3ZSBtYXAgQ29udGV4dEluZm8gb2JqZWN0cyBieSBTdHJpbmcga2V5 cywgYW5kIGJ5IENvbnRleHRzDQoJICBwcml2YXRlIHN0YXRpYyBIYXNoTWFwIGluc3RhbmNlc0J5 S2V5ID0gbmV3IEhhc2hNYXAoKTsNCgkgIHByaXZhdGUgc3RhdGljIEhhc2hNYXAgaW5zdGFuY2Vz QnlPYmogPSBuZXcgSGFzaE1hcCgpOw0KCQ0KCSAgLy8gLS0tIG1ldGhvZHMNCgkNCgkgIC8qIChu b24tSmF2YWRvYykNCgkgICAqIEBzZWUNCgljb20udGlyYS5jb3Jlc2Vydi53ZWJ1dGlsLkNvbnRl eHRGYWN0b3J5I3VzZUNvbnRleHQoamF2YS5sYW5nLlN0cmluZykNCgkgICAqLw0KCSAgcHVibGlj IEFwcGxpY2F0aW9uQ29udGV4dCB1c2VDb250ZXh0KFN0cmluZyBrZXkpIHRocm93cw0KCUFwcGxp Y2F0aW9uQ29udGV4dEV4Y2VwdGlvbiB7DQoJDQoJICAgIHN5bmNocm9uaXplZChpbnN0YW5jZXNC eUtleSkgew0KCSAgICAgIENvbnRleHRJbmZvIGNpID0gKENvbnRleHRJbmZvKSBpbnN0YW5jZXNC eUtleS5nZXQoa2V5KTsNCgkgICAgICBpZiAoY2kgIT0gbnVsbCkgew0KCSAgICAgICAgX2xvZy5k ZWJ1ZygiQ29udGV4dCB3aXRoIGtleSAnIiArIGtleSArICInIHJlcXVlc3RlZC4gUmV0dXJuaW5n DQoJZXhpc3RpbmcgaW5zdGFuY2VzIik7DQoJICAgICAgICBjaS5yZWZjb3VudCsrOw0KCSAgICAg ICAgcmV0dXJuIGNpLmNvbnRleHQ7DQoJICAgICAgfQ0KCQ0KCSAgICAgIF9sb2cuZGVidWcoIkNv bnRleHQgd2l0aCBrZXkgJyIgKyBrZXkgKyAiJyByZXF1ZXN0ZWQuIENyZWF0aW5nIG5ldw0KCWlu c3RhbmNlIik7DQoJDQoJICAgICAgLy8gdGhpcyBjb250ZXh0IGRvZXNuJ3QgZXhpc3QsIHdlIG5l ZWQgdG8gdHJ5IHRvIGxvYWQgaXQNCgkgICAgICBJbnB1dFN0cmVhbSBpcyA9IGdldENsYXNzKCku Z2V0UmVzb3VyY2VBc1N0cmVhbShrZXkpOw0KCSAgICAgIGlmIChpcyA9PSBudWxsKQ0KCSAgICAg ICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uQ29udGV4dEV4Y2VwdGlvbigiVW5hYmxlIHRvIGxvYWQN Cgljb250ZXh0KHMpLiBLZXkgZG9lcyBub3QgcG9pbnQgdG8gYSB2YWxpZCByZXNvdXJjZTogIiAr IGtleSk7DQoJDQoJICAgICAgUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7DQoJ ICAgICAgdHJ5IHsNCgkgICAgICAgIHByb3BzLmxvYWQoaXMpOw0KCSAgICAgICAgaXMuY2xvc2Uo KTsNCgkgICAgICB9DQoJICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCgkgICAgICAgIHRo cm93IG5ldyBBcHBsaWNhdGlvbkNvbnRleHRFeGNlcHRpb24oIkVycm9yIHJlYWRpbmcgYXBwbGlj YXRpb24NCgljb250ZXh0IHBvaW50ZXIgZGVmaW5pdGlvbi4iLCBlKTsNCgkgICAgICB9DQoJDQoJ ICAgICAgQXJyYXlMaXN0IGNvbnRleHRzID0gbmV3IEFycmF5TGlzdCgpOw0KCSAgICAgIGZvciAo aW50IGkgPSAwOyA7ICsraSkgew0KCSAgICAgICAgU3RyaW5nIGNvbnRleHQgPSBwcm9wcy5nZXRQ cm9wZXJ0eShJbnRlZ2VyLnRvU3RyaW5nKGkpKTsNCgkgICAgICAgIGlmIChjb250ZXh0ID09IG51 bGwpDQoJICAgICAgICAgIGJyZWFrOw0KCSAgICAgICAgY29udGV4dHMuYWRkKGNvbnRleHQpOw0K CSAgICAgIH0NCgkNCgkgICAgICBpZiAoY29udGV4dHMuc2l6ZSgpID09IDApDQoJICAgICAgICB0 aHJvdyBuZXcgQXBwbGljYXRpb25Db250ZXh0RXhjZXB0aW9uKCJObyBhcHBsaWNhdGlvbiBjb250 ZXh0DQoJZGVmaW5pdGlvbnMgc3BlY2lmaWVkIGluIGRlZmluaXRpb24gZmlsZTogIiArIGtleSk7 DQoJDQoJICAgICAgQ2xhc3NQYXRoWG1sQXBwbGljYXRpb25Db250ZXh0IGFjOw0KCSAgICAgIHRy eSB7DQoJICAgICAgICBhYyA9IG5ldw0KCUNsYXNzUGF0aFhtbEFwcGxpY2F0aW9uQ29udGV4dCgo U3RyaW5nW10pY29udGV4dHMudG9BcnJheShuZXcgU3RyaW5nWzBdKSk7DQoJICAgICAgfQ0KCSAg ICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7DQoJICAgICAgICB0aHJvdyBuZXcgQXBwbGljYXRp b25Db250ZXh0RXhjZXB0aW9uKCJFcnJvciByZWFkaW5nIGFwcGxpY2F0aW9uDQoJY29udGV4dCBk ZWZpbml0aW9uIiwgZSk7DQoJICAgICAgfQ0KCQ0KCSAgICAgIGNpID0gbmV3IENvbnRleHRJbmZv KCk7DQoJICAgICAgY2kuY29udGV4dCA9IGFjOw0KCSAgICAgIGNpLmtleSA9IGtleTsNCgkgICAg ICBjaS5yZWZjb3VudCA9IDE7DQoJICAgICAgaW5zdGFuY2VzQnlLZXkucHV0KGtleSwgY2kpOw0K CSAgICAgIGluc3RhbmNlc0J5T2JqLnB1dChhYywgY2kpOw0KCQ0KCSAgICAgIHJldHVybiBhYzsN CgkgICAgfQ0KCSAgfQ0KCQ0KCSAgLyoqDQoJICAgKiBSZWxlYXNlcyB0aGUgc3BlY2lmaWVkIEFw cGxpY2F0aW9uQ29udGV4dCBpbnN0YW5jZS4gSWYgdGhlcmUgYXJlIG5vDQoJbW9yZSB1c2VycyBv ZiB0aGlzDQoJICAgKiBjb250ZXh0LCBjbG9zZSgpIHdpbGwgYmUgY2FsbGVkIG9uIGl0LiBOb3Rl IHRoYXQgY2xvc2Ugd2lsbCBiZQ0KCWNhbGxlZCBvbiBpdHMgcGFyZW50cyBhcw0KCSAgICogd2Vs bCwgcmVjdXJzaXZlbHkuDQoJICAgKiBAc2VlDQoJY29tLnRpcmEuY29yZXNlcnYud2VidXRpbC5D b250ZXh0RmFjdG9yeSNSZWxlYXNlQ29udGV4dChvcmcuc3ByaW5nZnJhbWV3b3JrLg0KCWNvbnRl eHQuQXBwbGljYXRpb25Db250ZXh0KQ0KCSAgICovDQoJICBwdWJsaWMgdm9pZCByZWxlYXNlQ29u dGV4dChBcHBsaWNhdGlvbkNvbnRleHQgYWMpIHRocm93cw0KCUFwcGxpY2F0aW9uQ29udGV4dEV4 Y2VwdGlvbiB7DQoJDQoJICAgIHN5bmNocm9uaXplZChpbnN0YW5jZXNCeUtleSkgew0KCSAgICAg IENvbnRleHRJbmZvIGNpID0gKENvbnRleHRJbmZvKSBpbnN0YW5jZXNCeU9iai5nZXQoYWMpOw0K CSAgICAgIGlmIChjaSAhPSBudWxsKSB7DQoJICAgICAgICBjaS5yZWZjb3VudC0tOw0KCSAgICAg ICAgaWYgKGNpLnJlZmNvdW50IDwgMCkNCgkgICAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9u Q29udGV4dEV4Y2VwdGlvbigiSWxsZWdhbCBzdGF0ZTogY29udGV4dA0KCXJlbGVhc2VkIG1vcmUg dGltZXMgdGhhbiBhY3F1aXJlZCIpOw0KCQ0KCSAgICAgICAgaWYgKGNpLnJlZmNvdW50ID09IDAp IHsNCgkgICAgICAgICAgX2xvZy5kZWJ1ZygiUmVsZWFzZSByZXF1ZXN0ZWQgb24gQ29udGV4dCB3 aXRoIGtleSAnIiArIGNpLmtleQ0KCSsgIicuIExhc3QgcmVmZXJlbmNlLCBzbyBjbG9zaW5nIGFs b25nIHdpdGggcGFyZW50cyIpOw0KCSAgICAgICAgICBpbnN0YW5jZXNCeU9iai5yZW1vdmUoYWMp Ow0KCSAgICAgICAgICBpbnN0YW5jZXNCeUtleS5yZW1vdmUoY2kua2V5KTsNCgkgICAgICAgICAg QXBwbGljYXRpb25Db250ZXh0IGNoaWxkID0gY2kuY29udGV4dDsNCgkgICAgICAgICAgQXBwbGlj YXRpb25Db250ZXh0IHBhcmVudDsNCgkgICAgICAgICAgd2hpbGUgKGNoaWxkICE9IG51bGwpIHsN CgkgICAgICAgICAgICBwYXJlbnQgPSBjaGlsZC5nZXRQYXJlbnQoKTsNCgkgICAgICAgICAgICBj aGlsZC5jbG9zZSgpOw0KCSAgICAgICAgICAgIGNoaWxkID0gcGFyZW50Ow0KCSAgICAgICAgICB9 DQoJICAgICAgICB9DQoJICAgICAgICBlbHNlDQoJICAgICAgICAgIF9sb2cuZGVidWcoIlJlbGVh c2UgcmVxdWVzdGVkIG9uIENvbnRleHQgd2l0aCBrZXkgJyIgKyBjaS5rZXkNCgkrICInLiBSZWZl cmVuY2VzIHJlbWFpbiwgc28gbm90IGNsb3NpbmcuIik7DQoJICAgICAgfQ0KCSAgICAgIGVsc2UN CgkgICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvbkNvbnRleHRFeGNlcHRpb24oIkF0dGVtcHRl ZCB0byByZWxlYXNlDQoJY29udGV4dCByZWZlcmVuY2UgZm9yIGNvbnRleHQgbm90IGtub3duIHRv IHRoaXMgZmFjdG9yeSIpOw0KCSAgICB9DQoJICB9DQoJDQoJICAvLyB3ZSB0cmFjayBjb250ZXh0 cyB3aXRoIHRoaXMgY2xhc3MNCgkgIHByaXZhdGUgY2xhc3MgQ29udGV4dEluZm8gew0KCSAgICBw dWJsaWMgQXBwbGljYXRpb25Db250ZXh0IGNvbnRleHQ7DQoJICAgIHB1YmxpYyBTdHJpbmcga2V5 Ow0KCSAgICBwdWJsaWMgaW50IHJlZmNvdW50ID0gMDsNCgkgIH0NCgkNCgl9DQoJDQoJU28gbXkg Q29udGV4dEZhY3RvcnkgaW1wbCBjYW4gbG9hZCB0aGUgc2VydmljZXMgYXBwbGljYXRpb24gY29u dGV4dCwgYW5kDQoJZmlyc3QgaXRzIHBhcmVudCwgdGhlIGRhdGEtYWNjZXNzIGNvbnRleHQsIG9u IGRlbWFuZCwgYW5kIHN1YnNlcXVlbnQNCglyZXF1ZXN0IHdpbGwganVzdCByZXR1cm4gYSByZWZl cmVuY2UgdG8gdGhlIHNhbWUgY29udGV4dC4gVGhlICdrZXknDQoJc3BlY2lmaWVkIHRvIHRoZSBj b250ZXh0IGZhY3RvcnkgaXMganVzdCB0aGUgbmFtZSBvZiBhIGZpbGUgc3BlY2lmeWluZw0KCXdo aWNoIGNvbnRleHRzIHRvIGxvYWQ6DQoJDQoJRmlsZSBjb3JlLXNlcnZpY2VzLWFwcGxpY2F0aW9u Q29udGV4dHMucHJvcGVydGllczoNCgkjIGRlZmluZXMgb25lIG9yIG1vcmUgaGllcmFyY2hpY2Fs IHhtbCBBcHBsaWNhdGlvbkNvbnRleHQgaW5zdGFuY2VzDQoJd2hpY2ggYXJlIGNvbnNpZGVyZWQN CgkjIHRvIG1ha2UgdXAgdGhlIGFwcGxpY2F0aW9uIGNvbnRleHQgc3RhY2sgZm9yIGNvcmUtc2Vy dmljZXMuIEVhY2ggbGluZQ0KCWlzIGEgcGFyZW50IG9mIHRoZQ0KCSMgc3Vic2VxdWVudCBsaW5l Lg0KCTA9L2RhdGEtYWNjZXNzLWFwcGxpY2F0aW9uQ29udGV4dC54bWwNCgkxPS9jb3JlLXNlcnZp Y2VzLWFwcGxpY2F0aW9uQ29udGV4dC54bWwNCgkNCglOb3cgSSBqdXN0IG5lZWQgdG8gaGF2ZSBh IG1vZGlmaWVkIHZlcnNpb24gb2YgQ29udGV4dExvYWRlciBmcm9tIFNwcmluZw0KCXdoaWNoIGFs b25nIHdpdGggbG9hZGluZyBhIHNwZWNpZmllZCBXZWJBcHBsaWNhdGlvbkNvbnRleHQgaW5zdGFu Y2UsDQoJd2lsbCBvcHRpb2luYWxseSB1c2UgdGhlIENvbnRleHRGYWN0b3J5IHRvIGxvYWQgYSBw YXJlbnQgY29udGV4dCBmaXJzdC4NCglIZXJlJ3MgdGhlIGNvZGU6DQoJDQoJLyoqDQoJICogQ2xh c3MgdXNlZCB0byBsb2FkIGEgd2ViIGFwcGxpY2F0aW9uIGNvbnRleHQsIGluY2x1ZGluZyBwb3Nz aWJseQ0KCXRyaWdnZXJpbmcgbG9hZGluZyBvZiBhIHBhcmVudA0KCSAqIGNvbnRleHQgdGhyb3Vn aCBhIENvbnRleHRGYWN0b3J5IGluc3RhbmNlDQoJICoNCgkgKiBAdmVyc2lvbiAkUmV2aXNpb246 ICAkDQoJKi8NCglwdWJsaWMgY2xhc3MgQ29udGV4dExvYWRlciB7DQoJDQoJICAvLyAtLS0gc3Rh dGljcw0KCQ0KCSAgLyoqPw0KCSAgICogQ29uZmlnIHBhcmFtIGZvciB0aGUgcm9vdCBXZWJBcHBs aWNhdGlvbkNvbnRleHQgaW1wbGVtZW50YXRpb24NCgljbGFzcyB0byB1c2UuDQoJICAgKi8NCgkg IHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFWFRfQ0xBU1NfUEFSQU0gPSAiY29udGV4 dENsYXNzIjsNCgkNCgkgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ2xhc3MgREVGQVVMVF9DT05URVhU X0NMQVNTID0NCglYbWxXZWJBcHBsaWNhdGlvbkNvbnRleHQuY2xhc3M7DQoJDQoJICBwdWJsaWMg c3RhdGljIGZpbmFsIFN0cmluZyBQQVJFTlRfQ09OVEVYVF9GQUNUT1JZX0NMQVNTX1BBUkFNID0N CgkicGFyZW50Q29udGV4dEZhY3RvcnlDbGFzcyI7DQoJDQoJICBwdWJsaWMgc3RhdGljIGZpbmFs IFN0cmluZyBQQVJFTlRfQ09OVEVYVF9GQUNUT1JZX1BBUkFNMV9QQVJBTSA9DQoJInBhcmVudENv bnRleHRGYWN0b3J5UGFyYW0iOw0KCQ0KCSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFS RU5UX0NPTlRFWFRfS0VZX1BBUkFNID0gInBhcmVudENvbnRleHRLZXkiOw0KCQ0KCSAgcHVibGlj IHN0YXRpYyBmaW5hbCBMb2dnZXIgX2xvZyA9IExvZ2dlci5nZXRMb2dnZXIoQ29udGV4dExvYWRl ci5jbGFzcyk7DQoJDQoJICAvKioNCgkgICAqIEluaXRpYWxpemUgU3ByaW5nJ3Mgd2ViIGFwcGxp Y2F0aW9uIGNvbnRleHQgZm9yIHRoZSBnaXZlbiBzZXJ2bGV0DQoJY29udGV4dCwNCgkgICAqIHJl Z2FyZGluZyB0aGUgImNvbnRleHRDbGFzcyIgc2VydmxldCBjb250ZXh0IGluaXQgcGFyYW1ldGVy Lg0KCSAgICogQHBhcmFtIHNlcnZsZXRDb250ZXh0IGN1cnJlbnQgc2VydmxldCBjb250ZXh0DQoJ ICAgKiBAcmV0dXJuIHRoZSBuZXcgV2ViQXBwbGljYXRpb25Db250ZXh0DQoJICAgKi8NCgkgIHB1 YmxpYyBzdGF0aWMgV2ViQXBwbGljYXRpb25Db250ZXh0IGluaXRDb250ZXh0KFNlcnZsZXRDb250 ZXh0DQoJc2VydmxldENvbnRleHQpDQoJICAgIHRocm93cyBBcHBsaWNhdGlvbkNvbnRleHRFeGNl cHRpb24gew0KCQ0KCSAgICBzZXJ2bGV0Q29udGV4dC5sb2coIkxvYWRpbmcgcm9vdCBXZWJBcHBs aWNhdGlvbkNvbnRleHQiKTsNCgkgICAgU3RyaW5nIGNvbnRleHRDbGFzcyA9DQoJc2VydmxldENv bnRleHQuZ2V0SW5pdFBhcmFtZXRlcihDT05URVhUX0NMQVNTX1BBUkFNKTsNCgkNCgkgICAgU3Ry aW5nIGNsYXNzTmFtZSA9IG51bGw7DQoJICAgIHRyeSB7DQoJICAgICAgY2xhc3NOYW1lID0NCglz ZXJ2bGV0Q29udGV4dC5nZXRJbml0UGFyYW1ldGVyKFBBUkVOVF9DT05URVhUX0ZBQ1RPUllfQ0xB U1NfUEFSQU0pOw0KCSAgICAgIENvbnRleHRGYWN0b3J5IHBhcmVudENvbnRleHRGYWN0b3J5ID0N CglnZXRQYXJlbnRDb250ZXh0RmFjdG9yeShzZXJ2bGV0Q29udGV4dCk7DQoJDQoJICAgICAgQXBw bGljYXRpb25Db250ZXh0IHBhcmVudENvbnRleHQgPSBudWxsOw0KCSAgICAgIGlmIChwYXJlbnRD b250ZXh0RmFjdG9yeSAhPSBudWxsKSB7DQoJICAgICAgICBTdHJpbmcgcGFyZW50Q29udGV4dEtl eSA9DQoJc2VydmxldENvbnRleHQuZ2V0SW5pdFBhcmFtZXRlcihQQVJFTlRfQ09OVEVYVF9LRVlf UEFSQU0pOw0KCSAgICAgICAgX2xvZy5pbmZvKA0KCSAgICAgICAgICAiR2V0dGluZyBwYXJlbnQg Y29udGV4dDogdXNpbmcgY29udGV4dCBmYWN0b3J5IGNsYXNzICciICsNCgljbGFzc05hbWUgKyAi Jywga2V5ICciICsNCgkgICAgICAgICAgICAgICAgICBwYXJlbnRDb250ZXh0S2V5ICsgIiciKTsN CgkgICAgICAgIHBhcmVudENvbnRleHQgPSBwYXJlbnRDb250ZXh0RmFjdG9yeS51c2VDb250ZXh0 KHBhcmVudENvbnRleHRLZXkpOw0KCSAgICAgIH0NCgkNCgkgICAgICAvLyBOb3cgd2UgbXVzdCBs b2FkIHRoZSBXZWJBcHBsaWNhdGlvbkNvbnRleHQuDQoJICAgICAgLy8gSXQgY29uZmlndXJlcyBp dHNlbGY6IGFsbCB3ZSBuZWVkIHRvIGRvIGlzIGNvbnN0cnVjdCB0aGUgY2xhc3MNCgl3aXRoIHRo ZSBwcm9wZXINCgkgICAgICAvLyBjb25zdHJ1Y3RvciwgYW5kIGludm9rZSBzZXRTZXJ2bGV0Q29u dGV4dC4NCgkgICAgICBDbGFzcyBjbGF6eiA9IChjb250ZXh0Q2xhc3MgIT0gbnVsbCA/IENsYXNz LmZvck5hbWUoY29udGV4dENsYXNzKQ0KCTogREVGQVVMVF9DT05URVhUX0NMQVNTKTsNCgkgICAg ICBfbG9nLmluZm8oDQoJICAgICAgICAiTG9hZGluZyByb290IFdlYkFwcGxpY2F0aW9uQ29udGV4 dDogdXNpbmcgY29udGV4dCBjbGFzcyAnIiArDQoJY2xhenouZ2V0TmFtZSgpICsgIiciKTsNCgkg ICAgICBpZiAoIVdlYkFwcGxpY2F0aW9uQ29udGV4dC5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGNs YXp6KSkgew0KCSAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uQ29udGV4dEV4Y2VwdGlvbigN CgkgICAgICAgICAgIkNvbnRleHQgY2xhc3MgaXMgbm8gV2ViQXBwbGljYXRpb25Db250ZXh0OiAi ICsgY29udGV4dENsYXNzKTsNCgkgICAgICB9DQoJDQoJICAgICAgQ2xhc3NbXSBwYXJhbWV0ZXJU eXBlczsNCgkgICAgICBPYmplY3RbXSBwYXJhbXM7DQoJICAgICAgaWYgKHBhcmVudENvbnRleHQg PT0gbnVsbCkgew0KCSAgICAgICAgcGFyYW1ldGVyVHlwZXMgPSBuZXcgQ2xhc3NbMF07DQoJICAg ICAgICBwYXJhbXMgPSBuZXcgT2JqZWN0WzBdOw0KCSAgICAgIH0NCgkgICAgICBlbHNlIHsNCgkg ICAgICAgIHBhcmFtZXRlclR5cGVzID0gbmV3IENsYXNzW10ge0FwcGxpY2F0aW9uQ29udGV4dC5j bGFzcywNCglTdHJpbmcuY2xhc3N9Ow0KCSAgICAgICAgcGFyYW1zID0gbmV3IE9iamVjdFtdIHtw YXJlbnRDb250ZXh0LCBudWxsfTsNCgkgICAgICB9DQoJDQoJICAgICAgQ29uc3RydWN0b3IgY29u c3RydWN0b3IgPSBjbGF6ei5nZXRDb25zdHJ1Y3RvcihwYXJhbWV0ZXJUeXBlcyk7DQoJICAgICAg V2ViQXBwbGljYXRpb25Db250ZXh0IHdlYkFwcGxpY2F0aW9uQ29udGV4dCA9DQoJKFdlYkFwcGxp Y2F0aW9uQ29udGV4dCkgY29uc3RydWN0b3IubmV3SW5zdGFuY2UocGFyYW1zKTsNCgkgICAgICB3 ZWJBcHBsaWNhdGlvbkNvbnRleHQuc2V0U2VydmxldENvbnRleHQoc2VydmxldENvbnRleHQpOw0K CSAgICAgIHJldHVybiB3ZWJBcHBsaWNhdGlvbkNvbnRleHQ7DQoJICAgIH0NCgkgICAgY2F0Y2gg KEFwcGxpY2F0aW9uQ29udGV4dEV4Y2VwdGlvbiBleCkgew0KCSAgICAgIGhhbmRsZUV4Y2VwdGlv bigiRmFpbGVkIHRvIGluaXRpYWxpemUgYXBwbGljYXRpb24gY29udGV4dCIsIGV4KTsNCgkgICAg fQ0KCSAgICBjYXRjaCAoQmVhbnNFeGNlcHRpb24gZXgpIHsNCgkgICAgICBoYW5kbGVFeGNlcHRp b24oIkZhaWxlZCB0byBpbml0aWFsaXplIGJlYW5zIGluIGFwcGxpY2F0aW9uDQoJY29udGV4dCIs IGV4KTsNCgkgICAgfQ0KCSAgICBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBleCkgew0K CSAgICAgIGhhbmRsZUV4Y2VwdGlvbigiRmFpbGVkIHRvIGxvYWQgY29uZmlnIGNsYXNzICciICsg Y2xhc3NOYW1lICsgIiciLA0KCWV4KTsNCgkgICAgfQ0KCSAgICBjYXRjaCAoSW5zdGFudGlhdGlv bkV4Y2VwdGlvbiBleCkgew0KCSAgICAgIGhhbmRsZUV4Y2VwdGlvbigNCgkgICAgICAgICJGYWls ZWQgdG8gaW5zdGFudGlhdGUgY29uZmlnIGNsYXNzICciDQoJICAgICAgICAgICsgY2xhc3NOYW1l DQoJICAgICAgICAgICsgIic6IGRvZXMgaXQgaGF2ZSB0aGUgcHJvcGVyIGNvbnN0cnVjdG9yPyIs DQoJICAgICAgICBleCk7DQoJICAgIH0NCgkgICAgY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRp b24gZXgpIHsNCgkgICAgICBoYW5kbGVFeGNlcHRpb24oDQoJICAgICAgICAiSWxsZWdhbCBhY2Nl c3Mgd2hpbGUgZmluZGluZyBvciBpbnN0YW50aWF0aW5nIGNvbmZpZyBjbGFzcyAnIg0KCSAgICAg ICAgICArIGNsYXNzTmFtZQ0KCSAgICAgICAgICArICInOiBkb2VzIGl0IGhhdmUgdGhlIHByb3Bl ciBjb25zdHJ1Y3Rvcj8iLA0KCSAgICAgICAgZXgpOw0KCSAgICB9DQoJICAgIGNhdGNoIChUaHJv d2FibGUgZXgpIHsNCgkgICAgICBoYW5kbGVFeGNlcHRpb24oIlVuZXhwZWN0ZWQgZXJyb3IgbG9h ZGluZyBjb250ZXh0IGNvbmZpZ3VyYXRpb24iLCBleCk7DQoJICAgIH0NCgkNCgkgICAgcmV0dXJu IG51bGw7DQoJICB9DQoJDQoJICAvKioNCgkgICAqIExvZyBhbmQgdGhyb3cgYW4gYXBwcm9wcmlh dGUgZXhjZXB0aW9uLg0KCSAgICovDQoJICBwcml2YXRlIHN0YXRpYyB2b2lkIGhhbmRsZUV4Y2Vw dGlvbihTdHJpbmcgbXNnLCBUaHJvd2FibGUgZXgpDQoJICAgIHRocm93cyBBcHBsaWNhdGlvbkNv bnRleHRFeGNlcHRpb24gew0KCSAgICBTdHJpbmcgdGhyb3duTXNnID0gbXNnICsgIjogIiArIGV4 LmdldE1lc3NhZ2UoKTsNCgkgICAgX2xvZy5lcnJvcih0aHJvd25Nc2csIGV4KTsNCgkgICAgaWYg KGV4IGluc3RhbmNlb2YgRXJyb3IpIHsNCgkgICAgICB0aHJvdyAoRXJyb3IpIGV4Ow0KCSAgICB9 DQoJICAgIGVsc2UgaWYgKGV4IGluc3RhbmNlb2YgQXBwbGljYXRpb25Db250ZXh0RXhjZXB0aW9u KSB7DQoJICAgICAgdGhyb3cgKEFwcGxpY2F0aW9uQ29udGV4dEV4Y2VwdGlvbikgZXg7DQoJICAg IH0NCgkgICAgZWxzZSB7DQoJICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uQ29udGV4dEV4Y2Vw dGlvbih0aHJvd25Nc2csIGV4KTsNCgkgICAgfQ0KCSAgfQ0KCQ0KCSAgLyoqDQoJICAgKiBDbG9z ZSBTcHJpbmcncyB3ZWIgYXBwbGljYXRpb24gY29udGV4dCBmb3IgdGhlIGdpdmVuIHNlcnZsZXQg Y29udGV4dC4NCgkgICAqIEBwYXJhbSBzZXJ2bGV0Q29udGV4dCBjdXJyZW50IHNlcnZsZXQgY29u dGV4dA0KCSAgICovDQoJICBwdWJsaWMgc3RhdGljIHZvaWQgY2xvc2VDb250ZXh0KFNlcnZsZXRD b250ZXh0IHNlcnZsZXRDb250ZXh0KSB7DQoJICAgIHNlcnZsZXRDb250ZXh0LmxvZygiQ2xvc2lu ZyByb290IFdlYkFwcGxpY2F0aW9uQ29udGV4dCIpOw0KCSAgICBBcHBsaWNhdGlvbkNvbnRleHQg YWMgPQ0KCVdlYkFwcGxpY2F0aW9uQ29udGV4dFV0aWxzLmdldFdlYkFwcGxpY2F0aW9uQ29udGV4 dChzZXJ2bGV0Q29udGV4dCk7DQoJICAgIEFwcGxpY2F0aW9uQ29udGV4dCBwYXJlbnQgPSBhYy5n ZXRQYXJlbnQoKTsNCgkgICAgdHJ5IHsNCgkgICAgICBhYy5jbG9zZSgpOw0KCSAgICB9DQoJICAg IGZpbmFsbHkgew0KCSAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkgew0KCSAgICAgICAgQ29udGV4 dEZhY3RvcnkgY2YgPSBudWxsOw0KCSAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9DQoJc2Vydmxl dENvbnRleHQuZ2V0SW5pdFBhcmFtZXRlcihQQVJFTlRfQ09OVEVYVF9GQUNUT1JZX0NMQVNTX1BB UkFNKTsNCgkgICAgICAgIC8vIHNob3VsZCB3ZSBjaGVjayB0aGlzIGZvciBudWxsLiBmb3Igbm93 LCBsZXQncyBub3QsIGFzIGl0IGhhcw0KCXRvIGJlIHRoZXJlIGlmIHRoZXJlIGlzIGEgcGFyZW50 DQoJICAgICAgICB0cnkgew0KCSAgICAgICAgICBjZiA9IGdldFBhcmVudENvbnRleHRGYWN0b3J5 KHNlcnZsZXRDb250ZXh0KTsNCgkgICAgICAgIH0NCgkgICAgICAgIGNhdGNoIChFeGNlcHRpb24g ZXgpIHsNCgkgICAgICAgICAgaGFuZGxlRXhjZXB0aW9uKCJVbmFibGUgdG8gb2J0YWluIGNvbnRl eHQgZmFjdG9yeSB0byByZWxlYXNlDQoJcGFyZW50IGNvbnRleHQuIENvbnRleHQgZmFjdG9yeSBj bGFzc05hbWUgJyIgKyBjbGFzc05hbWUgKyAiJyIsIGV4KTsNCgkgICAgICAgIH0NCgkgICAgICAg IGNmLnJlbGVhc2VDb250ZXh0KHBhcmVudCk7DQoJICAgICAgfQ0KCSAgICB9DQoJICB9DQoJDQoJ ICAvKioNCgkgICAqIFJldHVybnMgYSBDb250ZXh0RmFjdG9yeSwgaWYgYW55LCB0byBiZSB1c2Vk IHRvIG9idGFpbiBhbmQgcmVsZWFzZQ0KCWEgcGFyZW50IGNvbnRleHQNCgkgICAqLw0KCSAgcHJp dmF0ZSBzdGF0aWMgQ29udGV4dEZhY3RvcnkgZ2V0UGFyZW50Q29udGV4dEZhY3RvcnkoU2Vydmxl dENvbnRleHQNCglzZXJ2bGV0Q29udGV4dCkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24s IFNlY3VyaXR5RXhjZXB0aW9uLA0KCU5vU3VjaE1ldGhvZEV4Y2VwdGlvbiwgSWxsZWdhbEFyZ3Vt ZW50RXhjZXB0aW9uLCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uLA0KCUlsbGVnYWxBY2Nlc3NFeGNl cHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gew0KCQ0KCSAgICBTdHJpbmcgcGFyZW50 Q29udGV4dEZhY3RvcnlDbGFzc05hbWUgPQ0KCXNlcnZsZXRDb250ZXh0LmdldEluaXRQYXJhbWV0 ZXIoUEFSRU5UX0NPTlRFWFRfRkFDVE9SWV9DTEFTU19QQVJBTSk7DQoJICAgIFN0cmluZyBwYXJl bnRDb250ZXh0RmFjdG9yeVBhcmFtMSA9DQoJc2VydmxldENvbnRleHQuZ2V0SW5pdFBhcmFtZXRl cihQQVJFTlRfQ09OVEVYVF9GQUNUT1JZX1BBUkFNMV9QQVJBTSk7DQoJDQoJICAgIFN0cmluZyBj bGFzc05hbWUgPSBudWxsOw0KCSAgICBDbGFzc1tdIHBhcmFtZXRlclR5cGVzOw0KCSAgICBPYmpl Y3RbXSBwYXJhbXM7DQoJDQoJICAgIENvbnRleHRGYWN0b3J5IHBhcmVudENvbnRleHRGYWN0b3J5 ID0gbnVsbDsNCgkgICAgaWYgKHBhcmVudENvbnRleHRGYWN0b3J5Q2xhc3NOYW1lICE9IG51bGwp IHsNCgkgICAgICBjbGFzc05hbWUgPSBwYXJlbnRDb250ZXh0RmFjdG9yeUNsYXNzTmFtZTsNCgkg ICAgICBDbGFzcyBjbGF6eiA9IENsYXNzLmZvck5hbWUoY2xhc3NOYW1lKTsNCgkgICAgICBwYXJh bWV0ZXJUeXBlcyA9IG5ldyBDbGFzc1swXTsNCgkgICAgICBwYXJhbXMgPSBuZXcgT2JqZWN0WzBd Ow0KCSAgICAgIGlmIChwYXJlbnRDb250ZXh0RmFjdG9yeVBhcmFtMSAhPSBudWxsKSB7DQoJICAg ICAgICBwYXJhbWV0ZXJUeXBlcyA9IG5ldyBDbGFzc1tdIHtTdHJpbmcuY2xhc3N9Ow0KCSAgICAg ICAgcGFyYW1zID0gbmV3IE9iamVjdFtdIHtwYXJlbnRDb250ZXh0RmFjdG9yeVBhcmFtMX07DQoJ ICAgICAgfQ0KCSAgICAgIENvbnN0cnVjdG9yIGNvbnN0cnVjdG9yID0gY2xhenouZ2V0Q29uc3Ry dWN0b3IocGFyYW1ldGVyVHlwZXMpOw0KCSAgICAgIHBhcmVudENvbnRleHRGYWN0b3J5ID0gKENv bnRleHRGYWN0b3J5KQ0KCWNvbnN0cnVjdG9yLm5ld0luc3RhbmNlKHBhcmFtcyk7DQoJICAgIH0N CgkNCgkgICAgcmV0dXJuIHBhcmVudENvbnRleHRGYWN0b3J5Ow0KCSAgfQ0KCX0NCgkNCgkNCglT byB0aGlzIG1lY2hhbmlzbSB3b3JrcyBmaW5lLiBJdCBhbGxvd3MgbWUgdG8gbGF5ZXIgYXBwbGlj YXRpb24gY29udGV4dHMNCglhbGwgdGhlIHdheSBkb3duIHRoZSBsYXllciBzdGFjaywgbm90IGp1 c3QgaW4gdGhlIHdlYi11aSBsYXllci4gQ2FuDQoJYW55Ym9keSB0aGluayBvZiBhIGJldHRlciBv ciBzaW1wbGVyIHdheSB0byBoYW5kbGUgdGhpcyBuZWVkPw0KCQ0KCUlzIGl0IHdvcnRoIGFkZGlu ZyBzb21lIG9mIHRoaXMgY29kZSBpbnRvIFNwcmluZyBpdHNlbGY/IEkgZG9uJ3QgdGhpbmsNCglJ J20gdGhlIG9ubHkgcGVyc29uIHdobyB3aWxsIG5lZWQgdG8gZG8gc29tZXRoaW5nIGxpa2UgdGhp cy4gQWRtaXR0ZWRseSwNCglpbiB0aGUgYWJzZW5jZSBvZiB0aGUgbGFyZ2Ugc3RhcnQtdXAgdGlt ZSBmb3IgSGliZXJuYXRlLCBpdCB3b3VsZCBoYXZlDQoJYmVlbiBhY2NlcHRpYmxlIHRvIGhhbmRs ZSB0aGlzIHZpYSBqdXN0IHRocmVlIGFwcGxpY2F0aW9uIGNvbnRleHRzIGF0DQoJdGhlIHdlYiBs ZXZlbCwgd2l0aCBkdXBsaWNhdGUgZGVmaW5pdGlvbnMgZm9yIHRoZSBjb250ZW50IGZyb20gdGhl DQoJZGF0YS1hY2Nlc3MgYW5kIHNlcnZpY2VzIGxheWVyIGJyb3VnaHQgaW4gdmlhIHhtbCBpbmNs dWRlcy4NCgkNCglSZWdhcmRzLA0KCUNvbGluDQoJDQoJDQoJDQoJDQoJLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KCVRoaXMgc2YubmV0IGVt YWlsIGlzIHNwb25zb3JlZCBieTpUaGlua0dlZWsNCglXZWxjb21lIHRvIGdlZWsgaGVhdmVuLg0K CWh0dHA6Ly90aGlua2dlZWsuY29tL3NmDQoJX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX18NCglTcHJpbmdmcmFtZXdvcmstdXNlciBtYWlsaW5nIGxpc3QNCglT cHJpbmdmcmFtZXdvcmstdXNlckBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQNCglodHRwczovL2xpc3Rz LnNvdXJjZWZvcmdlLm5ldC9saXN0cy9saXN0aW5mby9zcHJpbmdmcmFtZXdvcmstdXNlcg0KCQ0K CQ0KCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0NCglUaGlzIFNGLm5ldCBlbWFpbCBpcyBzcG9uc29yZWQgYnk6IFNGLm5ldCBHaXZlYmFjayBQ cm9ncmFtLg0KCVNvdXJjZUZvcmdlLm5ldCBob3N0cyBvdmVyIDcwLDAwMCBPcGVuIFNvdXJjZSBQ cm9qZWN0cy4NCglTZWUgdGhlIHBlb3BsZSB3aG8gaGF2ZSBIRUxQRUQgVVMgcHJvdmlkZSBiZXR0 ZXIgc2VydmljZXM6DQoJQ2xpY2sgaGVyZTogaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9zdXBwb3J0 ZXJzLnBocA0KCV9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f DQoJU3ByaW5nZnJhbWV3b3JrLWRldmVsb3BlciBtYWlsaW5nIGxpc3QNCglTcHJpbmdmcmFtZXdv cmstZGV2ZWxvcGVyQGxpc3RzLnNvdXJjZWZvcmdlLm5ldA0KCWh0dHBzOi8vbGlzdHMuc291cmNl Zm9yZ2UubmV0L2xpc3RzL2xpc3RpbmZvL3NwcmluZ2ZyYW1ld29yay1kZXZlbG9wZXINCgkNCgkN CgkNCgkNCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tDQoJVGhpcyBTRi5uZXQgZW1haWwgaXMgc3BvbnNvcmVkIGJ5OiBTRi5uZXQgR2l2ZWJh Y2sgUHJvZ3JhbS4NCglTb3VyY2VGb3JnZS5uZXQgaG9zdHMgb3ZlciA3MCwwMDAgT3BlbiBTb3Vy Y2UgUHJvamVjdHMuDQoJU2VlIHRoZSBwZW9wbGUgd2hvIGhhdmUgSEVMUEVEIFVTIHByb3ZpZGUg YmV0dGVyIHNlcnZpY2VzOg0KCUNsaWNrIGhlcmU6IGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvc3Vw cG9ydGVycy5waHANCglfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fXw0KCVNwcmluZ2ZyYW1ld29yay1kZXZlbG9wZXIgbWFpbGluZyBsaXN0DQoJU3ByaW5nZnJh bWV3b3JrLWRldmVsb3BlckBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQNCglodHRwczovL2xpc3RzLnNv dXJjZWZvcmdlLm5ldC9saXN0cy9saXN0aW5mby9zcHJpbmdmcmFtZXdvcmstZGV2ZWxvcGVyDQoJ DQoNCg== |