LyoqDQogKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTkgTWlhLVNvZnR3YXJlIGFuZCBvdGhlcnMuDQogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQogKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYyLjANCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQogKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MjAuaHRtbA0KICogDQogKiBDb250cmlidXRvcnM6DQogKiAgICAgRnJlZGVyaWMgTWFkaW90IChNaWEtU29mdHdhcmUpIC0gbWV0YW1vZGVsIGRlc2lnbiBhbmQgaW5pdGlhbCBpbXBsZW1lbnRhdGlvbg0KICogICAgIEdy6WdvaXJlIER1cOkgKE1pYS1Tb2Z0d2FyZSkgLSBCdWcgNDgwMTgzIC0gVGhlIG1hbmlmZXN0Lm1mIGRpc2NvdmVyZXIgc2hvdWxkIG1hbmFnZSAnRXhwb3J0LVBhY2thZ2UnIA0KICovCnBhY2thZ2Ugb3JnLmVjbGlwc2UubW9kaXNjby5tYW5pZmVzdDsNCg0KaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsNCg0KaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KDQovKioNCiAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQogKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5CdW5kbGU8L2I+PC9lbT4nLg0KICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQogKg0KICogPHA+DQogKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6DQogKiA8L3A+DQogKiA8dWw+DQogKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UubW9kaXNjby5tYW5pZmVzdC5CdW5kbGUjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+DQogKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UubW9kaXNjby5tYW5pZmVzdC5CdW5kbGUjaXNTaW5nbGV0b24gPGVtPlNpbmdsZXRvbjwvZW0+fTwvbGk+DQogKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UubW9kaXNjby5tYW5pZmVzdC5CdW5kbGUjZ2V0U3ltYm9saWNOYW1lIDxlbT5TeW1ib2xpYyBOYW1lPC9lbT59PC9saT4NCiAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5tb2Rpc2NvLm1hbmlmZXN0LkJ1bmRsZSNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59PC9saT4NCiAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5tb2Rpc2NvLm1hbmlmZXN0LkJ1bmRsZSNnZXRBY3RpdmF0b3IgPGVtPkFjdGl2YXRvcjwvZW0+fTwvbGk+DQogKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UubW9kaXNjby5tYW5pZmVzdC5CdW5kbGUjZ2V0QWN0aXZhdGlvblBvbGljeSA8ZW0+QWN0aXZhdGlvbiBQb2xpY3k8L2VtPn08L2xpPg0KICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm1vZGlzY28ubWFuaWZlc3QuQnVuZGxlI2dldFJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQgPGVtPlJlcXVpcmVkIEV4ZWN1dGlvbiBFbnZpcm9ubWVudDwvZW0+fTwvbGk+DQogKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UubW9kaXNjby5tYW5pZmVzdC5CdW5kbGUjZ2V0VmVuZG9yIDxlbT5WZW5kb3I8L2VtPn08L2xpPg0KICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm1vZGlzY28ubWFuaWZlc3QuQnVuZGxlI2dldFJlcXVpcmVkQnVuZGxlcyA8ZW0+UmVxdWlyZWQgQnVuZGxlczwvZW0+fTwvbGk+DQogKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UubW9kaXNjby5tYW5pZmVzdC5CdW5kbGUjZ2V0SW1wb3J0ZWRQYWNrYWdlcyA8ZW0+SW1wb3J0ZWQgUGFja2FnZXM8L2VtPn08L2xpPg0KICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm1vZGlzY28ubWFuaWZlc3QuQnVuZGxlI2dldEV4cG9ydFBhY2thZ2VzIDxlbT5FeHBvcnQgUGFja2FnZXM8L2VtPn08L2xpPg0KICogPC91bD4NCiAqDQogKiBAc2VlIG9yZy5lY2xpcHNlLm1vZGlzY28ubWFuaWZlc3QuTWFuaWZlc3RQYWNrYWdlI2dldEJ1bmRsZSgpDQogKiBAbW9kZWwNCiAqIEBnZW5lcmF0ZWQNCiAqLw0KcHVibGljIGludGVyZmFjZSBCdW5kbGUgZXh0ZW5kcyBFT2JqZWN0IHsNCgkvKioNCgkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQoJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCgkgKiA8cD4NCgkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwNCgkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQoJICogPC9wPg0KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLg0KCSAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQ0KCSAqIEBzZWUgb3JnLmVjbGlwc2UubW9kaXNjby5tYW5pZmVzdC5NYW5pZmVzdFBhY2thZ2UjZ2V0QnVuZGxlX05hbWUoKQ0KCSAqIEBtb2RlbA0KCSAqIEBnZW5lcmF0ZWQNCgkgKi8NCglTdHJpbmcgZ2V0TmFtZSgpOw0KDQoJLyoqDQoJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UubW9kaXNjby5tYW5pZmVzdC5CdW5kbGUjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLg0KCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQoJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuDQoJICogQHNlZSAjZ2V0TmFtZSgpDQoJICogQGdlbmVyYXRlZA0KCSAqLw0KCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOw0KDQoJLyoqDQoJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2luZ2xldG9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQoJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCgkgKiA8cD4NCgkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TaW5nbGV0b248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLA0KCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4NCgkgKiA8L3A+DQoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQoJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2luZ2xldG9uPC9lbT4nIGF0dHJpYnV0ZS4NCgkgKiBAc2VlICNzZXRTaW5nbGV0b24oYm9vbGVhbikNCgkgKiBAc2VlIG9yZy5lY2xpcHNlLm1vZGlzY28ubWFuaWZlc3QuTWFuaWZlc3RQYWNrYWdlI2dldEJ1bmRsZV9TaW5nbGV0b24oKQ0KCSAqIEBtb2RlbA0KCSAqIEBnZW5lcmF0ZWQNCgkgKi8NCglib29sZWFuIGlzU2luZ2xldG9uKCk7DQoNCgkvKioNCgkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5tb2Rpc2NvLm1hbmlmZXN0LkJ1bmRsZSNpc1NpbmdsZXRvbiA8ZW0+U2luZ2xldG9uPC9lbT59JyBhdHRyaWJ1dGUuDQoJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCgkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TaW5nbGV0b248L2VtPicgYXR0cmlidXRlLg0KCSAqIEBzZWUgI2lzU2luZ2xldG9uKCkNCgkgKiBAZ2VuZXJhdGVkDQoJICovDQoJdm9pZCBzZXRTaW5nbGV0b24oYm9vbGVhbiB2YWx1ZSk7DQoNCgkvKioNCgkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TeW1ib2xpYyBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQoJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCgkgKiA8cD4NCgkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TeW1ib2xpYyBOYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwNCgkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQoJICogPC9wPg0KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN5bWJvbGljIE5hbWU8L2VtPicgYXR0cmlidXRlLg0KCSAqIEBzZWUgI3NldFN5bWJvbGljTmFtZShTdHJpbmcpDQoJICogQHNlZSBvcmcuZWNsaXBzZS5tb2Rpc2NvLm1hbmlmZXN0Lk1hbmlmZXN0UGFja2FnZSNnZXRCdW5kbGVfU3ltYm9saWNOYW1lKCkNCgkgKiBAbW9kZWwNCgkgKiBAZ2VuZXJhdGVkDQoJICovDQoJU3RyaW5nIGdldFN5bWJvbGljTmFtZSgpOw0KDQoJLyoqDQoJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UubW9kaXNjby5tYW5pZmVzdC5CdW5kbGUjZ2V0U3ltYm9saWNOYW1lIDxlbT5TeW1ib2xpYyBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuDQoJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCgkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TeW1ib2xpYyBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4NCgkgKiBAc2VlICNnZXRTeW1ib2xpY05hbWUoKQ0KCSAqIEBnZW5lcmF0ZWQNCgkgKi8NCgl2b2lkIHNldFN5bWJvbGljTmFtZShTdHJpbmcgdmFsdWUpOw0KDQoJLyoqDQoJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLg0KCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQoJICogPHA+DQoJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VmVyc2lvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsDQoJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KCSAqIDwvcD4NCgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCgkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WZXJzaW9uPC9lbT4nIGF0dHJpYnV0ZS4NCgkgKiBAc2VlICNzZXRWZXJzaW9uKFN0cmluZykNCgkgKiBAc2VlIG9yZy5lY2xpcHNlLm1vZGlzY28ubWFuaWZlc3QuTWFuaWZlc3RQYWNrYWdlI2dldEJ1bmRsZV9WZXJzaW9uKCkNCgkgKiBAbW9kZWwNCgkgKiBAZ2VuZXJhdGVkDQoJICovDQoJU3RyaW5nIGdldFZlcnNpb24oKTsNCg0KCS8qKg0KCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm1vZGlzY28ubWFuaWZlc3QuQnVuZGxlI2dldFZlcnNpb24gPGVtPlZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZS4NCgkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZlcnNpb248L2VtPicgYXR0cmlidXRlLg0KCSAqIEBzZWUgI2dldFZlcnNpb24oKQ0KCSAqIEBnZW5lcmF0ZWQNCgkgKi8NCgl2b2lkIHNldFZlcnNpb24oU3RyaW5nIHZhbHVlKTsNCg0KCS8qKg0KCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjdGl2YXRvcjwvYj48L2VtPicgYXR0cmlidXRlLg0KCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQoJICogPHA+DQoJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QWN0aXZhdG9yPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwNCgkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQoJICogPC9wPg0KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjdGl2YXRvcjwvZW0+JyBhdHRyaWJ1dGUuDQoJICogQHNlZSAjc2V0QWN0aXZhdG9yKFN0cmluZykNCgkgKiBAc2VlIG9yZy5lY2xpcHNlLm1vZGlzY28ubWFuaWZlc3QuTWFuaWZlc3RQYWNrYWdlI2dldEJ1bmRsZV9BY3RpdmF0b3IoKQ0KCSAqIEBtb2RlbA0KCSAqIEBnZW5lcmF0ZWQNCgkgKi8NCglTdHJpbmcgZ2V0QWN0aXZhdG9yKCk7DQoNCgkvKioNCgkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5tb2Rpc2NvLm1hbmlmZXN0LkJ1bmRsZSNnZXRBY3RpdmF0b3IgPGVtPkFjdGl2YXRvcjwvZW0+fScgYXR0cmlidXRlLg0KCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQoJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWN0aXZhdG9yPC9lbT4nIGF0dHJpYnV0ZS4NCgkgKiBAc2VlICNnZXRBY3RpdmF0b3IoKQ0KCSAqIEBnZW5lcmF0ZWQNCgkgKi8NCgl2b2lkIHNldEFjdGl2YXRvcihTdHJpbmcgdmFsdWUpOw0KDQoJLyoqDQoJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWN0aXZhdGlvbiBQb2xpY3k8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCgkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KCSAqIDxwPg0KCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkFjdGl2YXRpb24gUG9saWN5PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwNCgkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQoJICogPC9wPg0KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjdGl2YXRpb24gUG9saWN5PC9lbT4nIGF0dHJpYnV0ZS4NCgkgKiBAc2VlICNzZXRBY3RpdmF0aW9uUG9saWN5KFN0cmluZykNCgkgKiBAc2VlIG9yZy5lY2xpcHNlLm1vZGlzY28ubWFuaWZlc3QuTWFuaWZlc3RQYWNrYWdlI2dldEJ1bmRsZV9BY3RpdmF0aW9uUG9saWN5KCkNCgkgKiBAbW9kZWwNCgkgKiBAZ2VuZXJhdGVkDQoJICovDQoJU3RyaW5nIGdldEFjdGl2YXRpb25Qb2xpY3koKTsNCg0KCS8qKg0KCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm1vZGlzY28ubWFuaWZlc3QuQnVuZGxlI2dldEFjdGl2YXRpb25Qb2xpY3kgPGVtPkFjdGl2YXRpb24gUG9saWN5PC9lbT59JyBhdHRyaWJ1dGUuDQoJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCgkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY3RpdmF0aW9uIFBvbGljeTwvZW0+JyBhdHRyaWJ1dGUuDQoJICogQHNlZSAjZ2V0QWN0aXZhdGlvblBvbGljeSgpDQoJICogQGdlbmVyYXRlZA0KCSAqLw0KCXZvaWQgc2V0QWN0aXZhdGlvblBvbGljeShTdHJpbmcgdmFsdWUpOw0KDQoJLyoqDQoJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVxdWlyZWQgRXhlY3V0aW9uIEVudmlyb25tZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQoJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCgkgKiA8cD4NCgkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZXF1aXJlZCBFeGVjdXRpb24gRW52aXJvbm1lbnQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLA0KCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4NCgkgKiA8L3A+DQoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQoJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVxdWlyZWQgRXhlY3V0aW9uIEVudmlyb25tZW50PC9lbT4nIGF0dHJpYnV0ZS4NCgkgKiBAc2VlICNzZXRSZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50KFN0cmluZykNCgkgKiBAc2VlIG9yZy5lY2xpcHNlLm1vZGlzY28ubWFuaWZlc3QuTWFuaWZlc3RQYWNrYWdlI2dldEJ1bmRsZV9SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50KCkNCgkgKiBAbW9kZWwNCgkgKiBAZ2VuZXJhdGVkDQoJICovDQoJU3RyaW5nIGdldFJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQoKTsNCg0KCS8qKg0KCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm1vZGlzY28ubWFuaWZlc3QuQnVuZGxlI2dldFJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQgPGVtPlJlcXVpcmVkIEV4ZWN1dGlvbiBFbnZpcm9ubWVudDwvZW0+fScgYXR0cmlidXRlLg0KCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQoJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVxdWlyZWQgRXhlY3V0aW9uIEVudmlyb25tZW50PC9lbT4nIGF0dHJpYnV0ZS4NCgkgKiBAc2VlICNnZXRSZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50KCkNCgkgKiBAZ2VuZXJhdGVkDQoJICovDQoJdm9pZCBzZXRSZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50KFN0cmluZyB2YWx1ZSk7DQoNCgkvKioNCgkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WZW5kb3I8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCgkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KCSAqIDxwPg0KCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZlbmRvcjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsDQoJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KCSAqIDwvcD4NCgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCgkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WZW5kb3I8L2VtPicgYXR0cmlidXRlLg0KCSAqIEBzZWUgI3NldFZlbmRvcihTdHJpbmcpDQoJICogQHNlZSBvcmcuZWNsaXBzZS5tb2Rpc2NvLm1hbmlmZXN0Lk1hbmlmZXN0UGFja2FnZSNnZXRCdW5kbGVfVmVuZG9yKCkNCgkgKiBAbW9kZWwNCgkgKiBAZ2VuZXJhdGVkDQoJICovDQoJU3RyaW5nIGdldFZlbmRvcigpOw0KDQoJLyoqDQoJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UubW9kaXNjby5tYW5pZmVzdC5CdW5kbGUjZ2V0VmVuZG9yIDxlbT5WZW5kb3I8L2VtPn0nIGF0dHJpYnV0ZS4NCgkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZlbmRvcjwvZW0+JyBhdHRyaWJ1dGUuDQoJICogQHNlZSAjZ2V0VmVuZG9yKCkNCgkgKiBAZ2VuZXJhdGVkDQoJICovDQoJdm9pZCBzZXRWZW5kb3IoU3RyaW5nIHZhbHVlKTsNCg0KCS8qKg0KCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlcXVpcmVkIEJ1bmRsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0Lg0KCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5tb2Rpc2NvLm1hbmlmZXN0LlJlcXVpcmVkQnVuZGxlfS4NCgkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KCSAqIDxwPg0KCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlcXVpcmVkIEJ1bmRsZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsDQoJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KCSAqIDwvcD4NCgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCgkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXF1aXJlZCBCdW5kbGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0Lg0KCSAqIEBzZWUgb3JnLmVjbGlwc2UubW9kaXNjby5tYW5pZmVzdC5NYW5pZmVzdFBhY2thZ2UjZ2V0QnVuZGxlX1JlcXVpcmVkQnVuZGxlcygpDQoJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIg0KCSAqIEBnZW5lcmF0ZWQNCgkgKi8NCglFTGlzdDxSZXF1aXJlZEJ1bmRsZT4gZ2V0UmVxdWlyZWRCdW5kbGVzKCk7DQoNCgkvKioNCgkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbXBvcnRlZCBQYWNrYWdlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuDQoJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLm1vZGlzY28ubWFuaWZlc3QuSW1wb3J0ZWRQYWNrYWdlfS4NCgkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KCSAqIDxwPg0KCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkltcG9ydGVkIFBhY2thZ2VzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLA0KCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4NCgkgKiA8L3A+DQoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQoJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW1wb3J0ZWQgUGFja2FnZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuDQoJICogQHNlZSBvcmcuZWNsaXBzZS5tb2Rpc2NvLm1hbmlmZXN0Lk1hbmlmZXN0UGFja2FnZSNnZXRCdW5kbGVfSW1wb3J0ZWRQYWNrYWdlcygpDQoJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIg0KCSAqIEBnZW5lcmF0ZWQNCgkgKi8NCglFTGlzdDxJbXBvcnRlZFBhY2thZ2U+IGdldEltcG9ydGVkUGFja2FnZXMoKTsNCg0KCS8qKg0KCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkV4cG9ydCBQYWNrYWdlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuDQoJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLm1vZGlzY28ubWFuaWZlc3QuRXhwb3J0ZWRQYWNrYWdlfS4NCgkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KCSAqIDxwPg0KCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkV4cG9ydCBQYWNrYWdlczwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwNCgkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQoJICogPC9wPg0KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkV4cG9ydCBQYWNrYWdlczwvZW0+JyByZWZlcmVuY2UgbGlzdC4NCgkgKiBAc2VlIG9yZy5lY2xpcHNlLm1vZGlzY28ubWFuaWZlc3QuTWFuaWZlc3RQYWNrYWdlI2dldEJ1bmRsZV9FeHBvcnRQYWNrYWdlcygpDQoJICogQG1vZGVsDQoJICogQGdlbmVyYXRlZA0KCSAqLw0KCUVMaXN0PEV4cG9ydGVkUGFja2FnZT4gZ2V0RXhwb3J0UGFja2FnZXMoKTsNCg0KfSAvLyBCdW5kbGUNCg==